-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathmyirisplot.html
More file actions
19 lines (18 loc) · 358 KB
/
myirisplot.html
File metadata and controls
19 lines (18 loc) · 358 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEltcGxlbWVudCBhIHZhZ3VlIGZhY3NpbWlsaWUgb2YgalF1ZXJ5J3MgZGF0YSBtZXRob2QKICBmdW5jdGlvbiBlbGVtZW50RGF0YShlbCwgbmFtZSwgdmFsdWUpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsKICAgICAgcmV0dXJuIGVsWyJodG1sd2lkZ2V0X2RhdGFfIiArIG5hbWVdOwogICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDMpIHsKICAgICAgZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV0gPSB2YWx1ZTsKICAgICAgcmV0dXJuIGVsOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBlbGVtZW50RGF0YTogIiArCiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCk7CiAgICB9CiAgfQoKICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM0NDYxNzAvZXNjYXBlLXN0cmluZy1mb3ItdXNlLWluLWphdmFzY3JpcHQtcmVnZXgKICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywgIlxcJCYiKTsKICB9CgogIGZ1bmN0aW9uIGhhc0NsYXNzKGVsLCBjbGFzc05hbWUpIHsKICAgIHZhciByZSA9IG5ldyBSZWdFeHAoIlxcYiIgKyBlc2NhcGVSZWdFeHAoY2xhc3NOYW1lKSArICJcXGIiKTsKICAgIHJldHVybiByZS50ZXN0KGVsLmNsYXNzTmFtZSk7CiAgfQoKICAvLyBlbGVtZW50cyAtIGFycmF5IChvciBhcnJheS1saWtlIG9iamVjdCkgb2YgSFRNTCBlbGVtZW50cwogIC8vIGNsYXNzTmFtZSAtIGNsYXNzIG5hbWUgdG8gdGVzdCBmb3IKICAvLyBpbmNsdWRlIC0gaWYgdHJ1ZSwgb25seSByZXR1cm4gZWxlbWVudHMgd2l0aCBnaXZlbiBjbGFzc05hbWU7CiAgLy8gICBpZiBmYWxzZSwgb25seSByZXR1cm4gZWxlbWVudHMgKndpdGhvdXQqIGdpdmVuIGNsYXNzTmFtZQogIGZ1bmN0aW9uIGZpbHRlckJ5Q2xhc3MoZWxlbWVudHMsIGNsYXNzTmFtZSwgaW5jbHVkZSkgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGhhc0NsYXNzKGVsZW1lbnRzW2ldLCBjbGFzc05hbWUpID09IGluY2x1ZGUpCiAgICAgICAgcmVzdWx0cy5wdXNoKGVsZW1lbnRzW2ldKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KCiAgZnVuY3Rpb24gb24ob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmouYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmMsIGZhbHNlKTsKICAgIH0gZWxzZSBpZiAob2JqLmF0dGFjaEV2ZW50KSB7CiAgICAgIG9iai5hdHRhY2hFdmVudChldmVudE5hbWUsIGZ1bmMpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gb2ZmKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7CiAgICBpZiAob2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIpCiAgICAgIG9iai5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgZWxzZSBpZiAob2JqLmRldGFjaEV2ZW50KSB7CiAgICAgIG9iai5kZXRhY2hFdmVudChldmVudE5hbWUsIGZ1bmMpOwogICAgfQogIH0KCiAgLy8gVHJhbnNsYXRlIGFycmF5IG9mIHZhbHVlcyB0byB0b3AvcmlnaHQvYm90dG9tL2xlZnQsIGFzIHVzdWFsIHdpdGgKICAvLyB0aGUgInBhZGRpbmciIENTUyBwcm9wZXJ0eQogIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9wYWRkaW5nCiAgZnVuY3Rpb24gdW5wYWNrUGFkZGluZyh2YWx1ZSkgewogICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJudW1iZXIiKQogICAgICB2YWx1ZSA9IFt2YWx1ZV07CiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAxKSB7CiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzBdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVswXX07CiAgICB9CiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAyKSB7CiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVsxXX07CiAgICB9CiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAzKSB7CiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVsxXX07CiAgICB9CiAgICBpZiAodmFsdWUubGVuZ3RoID09PSA0KSB7CiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVszXX07CiAgICB9CiAgfQoKICAvLyBDb252ZXJ0IGFuIHVucGFja2VkIHBhZGRpbmcgb2JqZWN0IHRvIGEgQ1NTIHZhbHVlCiAgZnVuY3Rpb24gcGFkZGluZ1RvQ3NzKHBhZGRpbmdPYmopIHsKICAgIHJldHVybiBwYWRkaW5nT2JqLnRvcCArICJweCAiICsgcGFkZGluZ09iai5yaWdodCArICJweCAiICsgcGFkZGluZ09iai5ib3R0b20gKyAicHggIiArIHBhZGRpbmdPYmoubGVmdCArICJweCI7CiAgfQoKICAvLyBNYWtlcyBhIG51bWJlciBzdWl0YWJsZSBmb3IgQ1NTCiAgZnVuY3Rpb24gcHgoeCkgewogICAgaWYgKHR5cGVvZih4KSA9PT0gIm51bWJlciIpCiAgICAgIHJldHVybiB4ICsgInB4IjsKICAgIGVsc2UKICAgICAgcmV0dXJuIHg7CiAgfQoKICAvLyBSZXRyaWV2ZXMgcnVudGltZSB3aWRnZXQgc2l6aW5nIGluZm9ybWF0aW9uIGZvciBhbiBlbGVtZW50LgogIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgZWl0aGVyIG51bGwsIG9yIGFuIG9iamVjdCB3aXRoIGZpbGwsIHBhZGRpbmcsCiAgLy8gZGVmYXVsdFdpZHRoLCBkZWZhdWx0SGVpZ2h0IGZpZWxkcy4KICBmdW5jdGlvbiBzaXppbmdQb2xpY3koZWwpIHsKICAgIHZhciBzaXppbmdFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2h0bWx3aWRnZXQtc2l6aW5nJ10iKTsKICAgIGlmICghc2l6aW5nRWwpCiAgICAgIHJldHVybiBudWxsOwogICAgdmFyIHNwID0gSlNPTi5wYXJzZShzaXppbmdFbC50ZXh0Q29udGVudCB8fCBzaXppbmdFbC50ZXh0IHx8ICJ7fSIpOwogICAgaWYgKHZpZXdlck1vZGUpIHsKICAgICAgcmV0dXJuIHNwLnZpZXdlcjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBzcC5icm93c2VyOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gYXMgYW4gb3V0cHV0IGJpbmRpbmcuCgogICAgICAvLyBNZXJnZSBkZWZhdWx0cyBpbnRvIHRoZSBkZWZpbml0aW9uOyBkb24ndCBtdXRhdGUgdGhlIG9yaWdpbmFsIGRlZmluaXRpb24uCiAgICAgIC8vIFRoZSBiYXNlIG9iamVjdCBpcyBhIFNoaW55IG91dHB1dCBiaW5kaW5nIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZSwKICAgICAgLy8gb3IgYW4gZW1wdHkgb2JqZWN0IGlmIHdlJ3JlIG5vdC4KICAgICAgdmFyIHNoaW55QmluZGluZyA9IGV4dGVuZChuZXcgU2hpbnkuT3V0cHV0QmluZGluZygpLCBkZWZhdWx0cywgZGVmaW5pdGlvbik7CgogICAgICAvLyBXcmFwIHJlbmRlclZhbHVlIHRvIGhhbmRsZSBpbml0aWFsaXphdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBpc24ndAogICAgICAvLyBzdXBwb3J0ZWQgbmF0aXZlbHkgYnkgU2hpbnkgYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLgoKICAgICAgLy8gTkI6IHNoaW55QmluZGluZy5pbml0aWFsaXplIG1heSBiZSB1bmRlZmluZWQsIGFzIGl0J3Mgb3B0aW9uYWwuCgogICAgICAvLyBSZW5hbWUgaW5pdGlhbGl6ZSB0byBtYWtlIHN1cmUgaXQgaXNuJ3QgY2FsbGVkIGJ5IGEgZnV0dXJlIHZlcnNpb24KICAgICAgLy8gb2YgU2hpbnkgdGhhdCBkb2VzIHN1cHBvcnQgaW5pdGlhbGl6ZSBkaXJlY3RseS4KICAgICAgc2hpbnlCaW5kaW5nLl9odG1sd2lkZ2V0c19pbml0aWFsaXplID0gc2hpbnlCaW5kaW5nLmluaXRpYWxpemU7CiAgICAgIGRlbGV0ZSBzaGlueUJpbmRpbmcuaW5pdGlhbGl6ZTsKCiAgICAgIG92ZXJyaWRlTWV0aG9kKHNoaW55QmluZGluZywgImZpbmQiLCBmdW5jdGlvbihzdXBlcmZ1bmMpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUpIHsKCiAgICAgICAgICB2YXIgcmVzdWx0cyA9IHN1cGVyZnVuYyhzY29wZSk7CgogICAgICAgICAgLy8gT25seSByZXR1cm4gZWxlbWVudHMgdGhhdCBhcmUgU2hpbnkgb3V0cHV0cywgbm90IHN0YXRpYyBvbmVzCiAgICAgICAgICB2YXIgZHluYW1pY1Jlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigiLmh0bWwtd2lkZ2V0LW91dHB1dCIpOwoKICAgICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAgIC8vIG5ldyBkeW5hbWljIG91dHB1dHMsIGFsc28gY2F1c2VkIHRoZXJlIHRvIGJlIG5ldyBzdGF0aWMgb3V0cHV0cy4KICAgICAgICAgIC8vIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvdHMgb2YgZGlmZmVyZW50IGh0bWx3aWRnZXRzIGJpbmRpbmdzLCB3ZQogICAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAgIC8vIHRpbWVzLgogICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSBkeW5hbWljUmVzdWx0cy5sZW5ndGgpCiAgICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgICAgcmV0dXJuIGR5bmFtaWNSZXN1bHRzOwogICAgICAgIH07CiAgICAgIH0pOwoKICAgICAgb3ZlcnJpZGVNZXRob2Qoc2hpbnlCaW5kaW5nLCAicmVuZGVyVmFsdWUiLCBmdW5jdGlvbihzdXBlcmZ1bmMpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZWwsIGRhdGEpIHsKICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgICBpZiAoIShkYXRhLmV2YWxzIGluc3RhbmNlb2YgQXJyYXkpKSBkYXRhLmV2YWxzID0gW2RhdGEuZXZhbHNdOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuZXZhbHMgJiYgaSA8IGRhdGEuZXZhbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXRoaXMucmVuZGVyT25OdWxsVmFsdWUpIHsKICAgICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZWwuc3R5bGUudmlzaWJpbGl0eSA9ICJpbmhlcml0IjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCFlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgaW5pdFNpemluZyhlbCk7CgogICAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9odG1sd2lkZ2V0c19pbml0aWFsaXplKSB7CiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2h0bWx3aWRnZXRzX2luaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgICAgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgU2hpbnkucmVuZGVyRGVwZW5kZW5jaWVzKGRhdGEuZGVwcyk7CiAgICAgICAgICBzdXBlcmZ1bmMoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICB9OwogICAgICB9KTsKCiAgICAgIG92ZXJyaWRlTWV0aG9kKHNoaW55QmluZGluZywgInJlc2l6ZSIsIGZ1bmN0aW9uKHN1cGVyZnVuYykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewogICAgICAgICAgLy8gU2hpbnkgY2FuIGNhbGwgcmVzaXplIGJlZm9yZSBpbml0aWFsaXplL3JlbmRlclZhbHVlIGhhdmUgYmVlbgogICAgICAgICAgLy8gY2FsbGVkLCB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHdpZGdldHMuCiAgICAgICAgICBpZiAoZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICAgIHN1cGVyZnVuYyhlbCwgd2lkdGgsIGhlaWdodCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9KTsKCiAgICAgIFNoaW55Lm91dHB1dEJpbmRpbmdzLnJlZ2lzdGVyKHNoaW55QmluZGluZywgc2hpbnlCaW5kaW5nLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKCJzaG93biIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigiaGlkZGVuIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlIG9mIGlvc2xpZGVzLCB3aGljaAogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLgogICAgICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBub3QgaGF2ZSB0byBoYXZlIGlvc2xpZGUtc3BlY2lmaWMgY29kZQogICAgICAgICAgLy8gaGVyZSwgYnV0IHJhdGhlciBoYXZlIGlvc2xpZGVzIHJhaXNlIGEgZ2VuZXJpYyBldmVudCwKICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlCiAgICAgICAgICAvLyB3aW5kb3cgdG8gZ2V0dGluZyB0aGF0IGZpeGVkIG1heSBiZSBsb25nLgogICAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAvLyBicm93c2VycyBiZWNhdXNlIGlvc2xpZGVzIGl0c2VsZiBvbmx5IHN1cHBvcnRzCiAgICAgICAgICAgIC8vIHN1Y2ggYnJvd3NlcnMuCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlbGVhdmUiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBzY3JpcHREYXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vanNvbiddIik7CiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsKICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzY3JpcHREYXRhLnRleHRDb250ZW50IHx8IHNjcmlwdERhdGEudGV4dCk7CiAgICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBkYXRhLmV2YWxzICYmIGsgPCBkYXRhLmV2YWxzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlcihkYXRhLngsIGRhdGEuZXZhbHNba10pOwogICAgICAgICAgfQogICAgICAgICAgYmluZGluZy5yZW5kZXJWYWx1ZShlbCwgZGF0YS54LCBpbml0UmVzdWx0KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICAvLyBXYWl0IHVudGlsIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgbG9hZGVkIHRvIHJlbmRlciB0aGUgd2lkZ2V0cy4KICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgewogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgYXJndW1lbnRzLmNhbGxlZSwgZmFsc2UpOwogICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICB9LCBmYWxzZSk7CiAgfSBlbHNlIGlmIChkb2N1bWVudC5hdHRhY2hFdmVudCkgewogICAgZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCkgewogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgewogICAgICAgIGRvY3VtZW50LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICAgIH0KICAgIH0pOwogIH0KCgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRBdHRhY2htZW50VXJsID0gZnVuY3Rpb24oZGVwbmFtZSwga2V5KSB7CiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0KICAgIGlmICh0eXBlb2Yoa2V5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgIGtleSA9IDE7CgogICAgdmFyIGxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkZXBuYW1lICsgIi0iICsga2V5ICsgIi1hdHRhY2htZW50Iik7CiAgICBpZiAoIWxpbmspIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsKICAgIH0KICAgIHJldHVybiBsaW5rLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5kYXRhZnJhbWVUb0QzID0gZnVuY3Rpb24oZGYpIHsKICAgIHZhciBuYW1lcyA9IFtdOwogICAgdmFyIGxlbmd0aDsKICAgIGZvciAodmFyIG5hbWUgaW4gZGYpIHsKICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpCiAgICAgICAgICAgIG5hbWVzLnB1c2gobmFtZSk7CiAgICAgICAgaWYgKHR5cGVvZihkZltuYW1lXSkgIT09ICJvYmplY3QiIHx8IHR5cGVvZihkZltuYW1lXS5sZW5ndGgpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihsZW5ndGgpICE9PSAidW5kZWZpbmVkIiAmJiBsZW5ndGggIT09IGRmW25hbWVdLmxlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIik7CiAgICAgICAgfQogICAgICAgIGxlbmd0aCA9IGRmW25hbWVdLmxlbmd0aDsKICAgIH0KICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgaXRlbTsKICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IGxlbmd0aDsgcm93KyspIHsKICAgICAgICBpdGVtID0ge307CiAgICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgbmFtZXMubGVuZ3RoOyBjb2wrKykgewogICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1dID0gZGZbbmFtZXNbY29sXV1bcm93XTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZW0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgewogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gZXZhbCgiKCIgKyBvW3BhcnRdICsgIikiKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07Cn0pKCk7Cgo="></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbiYmKG4ub3duZXJEb2N1bWVudHx8bi5kb2N1bWVudHx8bikuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIHQobil7cmV0dXJuIG4mJihuLm93bmVyRG9jdW1lbnQmJm4ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8bi5kb2N1bWVudCYmbnx8bi5kZWZhdWx0Vmlldyl9ZnVuY3Rpb24gZShuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAvMH1mdW5jdGlvbiByKG4pe3JldHVybiBudWxsPT09bj8wLzA6K259ZnVuY3Rpb24gdShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gaShuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiBvKG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBhKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBjKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGwoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBzKG4pe3JldHVybihuKz0iIik9PT1wYXx8blswXT09PXZhP3ZhK246bn1mdW5jdGlvbiBmKG4pe3JldHVybihuKz0iIilbMF09PT12YT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gaChuKXtyZXR1cm4gcyhuKWluIHRoaXMuX31mdW5jdGlvbiBnKG4pe3JldHVybihuPXMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIHAoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChmKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiB2KCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBkKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtKCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24geShuKXtyZXR1cm4gbn1mdW5jdGlvbiBNKG4sdCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHQsYXJndW1lbnRzKTtyZXR1cm4gcj09PXQ/bjpyfX1mdW5jdGlvbiB4KG4sdCl7aWYodCBpbiBuKXJldHVybiB0O3Q9dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2Zvcih2YXIgZT0wLHI9ZGEubGVuZ3RoO3I+ZTsrK2Upe3ZhciB1PWRhW2VdK3Q7aWYodSBpbiBuKXJldHVybiB1fX1mdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIF8oKXt9ZnVuY3Rpb24gdyhuKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciB0LHI9ZSx1PS0xLGk9ci5sZW5ndGg7Kyt1PGk7KSh0PXJbdV0ub24pJiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbn12YXIgZT1bXSxyPW5ldyBsO3JldHVybiB0Lm9uPWZ1bmN0aW9uKHQsdSl7dmFyIGksbz1yLmdldCh0KTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP28mJm8ub246KG8mJihvLm9uPW51bGwsZT1lLnNsaWNlKDAsaT1lLmluZGV4T2YobykpLmNvbmNhdChlLnNsaWNlKGkrMSkpLHIucmVtb3ZlKHQpKSx1JiZlLnB1c2goci5zZXQodCx7b246dX0pKSxuKX0sdH1mdW5jdGlvbiBTKCl7dGEuZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBrKCl7Zm9yKHZhciBuLHQ9dGEuZXZlbnQ7bj10LnNvdXJjZUV2ZW50Oyl0PW47cmV0dXJuIHR9ZnVuY3Rpb24gRShuKXtmb3IodmFyIHQ9bmV3IF8sZT0wLHI9YXJndW1lbnRzLmxlbmd0aDsrK2U8cjspdFthcmd1bWVudHNbZV1dPXcodCk7cmV0dXJuIHQub2Y9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dHJ5e3ZhciBpPXUuc291cmNlRXZlbnQ9dGEuZXZlbnQ7dS50YXJnZXQ9bix0YS5ldmVudD11LHRbdS50eXBlXS5hcHBseShlLHIpfWZpbmFsbHl7dGEuZXZlbnQ9aX19fSx0fWZ1bmN0aW9uIEEobil7cmV0dXJuIHlhKG4sX2EpLG59ZnVuY3Rpb24gTihuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIE1hKG4sdGhpcyl9fWZ1bmN0aW9uIEMobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiB4YShuLHRoaXMpfX1mdW5jdGlvbiB6KG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCl9ZnVuY3Rpb24gdSgpe3RoaXMuc2V0QXR0cmlidXRlKG4sdCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLHQpfWZ1bmN0aW9uIG8oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pOnRoaXMuc2V0QXR0cmlidXRlKG4sZSl9ZnVuY3Rpb24gYSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLGUpfXJldHVybiBuPXRhLm5zLnF1YWxpZnkobiksbnVsbD09dD9uLmxvY2FsP3I6ZToiZnVuY3Rpb24iPT10eXBlb2YgdD9uLmxvY2FsP2E6bzpuLmxvY2FsP2k6dX1mdW5jdGlvbiBxKG4pe3JldHVybiBuLnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIEwobil7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK3RhLnJlcXVvdGUobikrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gVChuKXtyZXR1cm4obisiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFIobix0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlPS0xOysrZTx1OyluW2VdKHRoaXMsdCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgZT0tMSxyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpOysrZTx1OyluW2VdKHRoaXMscil9bj1UKG4pLm1hcChEKTt2YXIgdT1uLmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9yOmV9ZnVuY3Rpb24gRChuKXt2YXIgdD1MKG4pO3JldHVybiBmdW5jdGlvbihlLHIpe2lmKHU9ZS5jbGFzc0xpc3QpcmV0dXJuIHI/dS5hZGQobik6dS5yZW1vdmUobik7dmFyIHU9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO3I/KHQubGFzdEluZGV4PTAsdC50ZXN0KHUpfHxlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodSsiICIrbikpKTplLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodS5yZXBsYWNlKHQsIiAiKSkpfX1mdW5jdGlvbiBQKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHQsZSl9ZnVuY3Rpb24gaSgpe3ZhciByPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4scixlKX1yZXR1cm4gbnVsbD09dD9yOiJmdW5jdGlvbiI9PXR5cGVvZiB0P2k6dX1mdW5jdGlvbiBVKG4sdCl7ZnVuY3Rpb24gZSgpe2RlbGV0ZSB0aGlzW25dfWZ1bmN0aW9uIHIoKXt0aGlzW25dPXR9ZnVuY3Rpb24gdSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbbl06dGhpc1tuXT1lfXJldHVybiBudWxsPT10P2U6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dTpyfWZ1bmN0aW9uIGoobil7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlP3QuY3JlYXRlRWxlbWVudE5TKGUsbik6dC5jcmVhdGVFbGVtZW50KG4pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49dGEubnMucXVhbGlmeShuKSkubG9jYWw/ZTp0fWZ1bmN0aW9uIEYoKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7biYmbi5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBIKG4pe3JldHVybntfX2RhdGFfXzpufX1mdW5jdGlvbiBPKG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiYSh0aGlzLG4pfX1mdW5jdGlvbiBJKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwobj1lKSxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZlP24odC5fX2RhdGFfXyxlLl9fZGF0YV9fKTohdC0hZX19ZnVuY3Rpb24gWShuLHQpe2Zvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lO2UrKylmb3IodmFyIHUsaT1uW2VdLG89MCxhPWkubGVuZ3RoO2E+bztvKyspKHU9aVtvXSkmJnQodSxvLGUpO3JldHVybiBufWZ1bmN0aW9uIFoobil7cmV0dXJuIHlhKG4sU2EpLG59ZnVuY3Rpb24gVihuKXt2YXIgdCxlO3JldHVybiBmdW5jdGlvbihyLHUsaSl7dmFyIG8sYT1uW2ldLnVwZGF0ZSxjPWEubGVuZ3RoO2ZvcihpIT1lJiYoZT1pLHQ9MCksdT49dCYmKHQ9dSsxKTshKG89YVt0XSkmJisrdDxjOyk7cmV0dXJuIG99fWZ1bmN0aW9uIFgobix0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD10aGlzW29dO3QmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobix0LHQuJCksZGVsZXRlIHRoaXNbb10pfWZ1bmN0aW9uIHUoKXt2YXIgdT1jKHQscmEoYXJndW1lbnRzKSk7ci5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihuLHRoaXNbb109dSx1LiQ9ZSksdS5fPXR9ZnVuY3Rpb24gaSgpe3ZhciB0LGU9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIit0YS5yZXF1b3RlKG4pKyIkIik7Zm9yKHZhciByIGluIHRoaXMpaWYodD1yLm1hdGNoKGUpKXt2YXIgdT10aGlzW3JdO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLHUsdS4kKSxkZWxldGUgdGhpc1tyXX19dmFyIG89Il9fb24iK24sYT1uLmluZGV4T2YoIi4iKSxjPSQ7YT4wJiYobj1uLnNsaWNlKDAsYSkpO3ZhciBsPWthLmdldChuKTtyZXR1cm4gbCYmKG49bCxjPUIpLGE/dD91OnI6dD9iOml9ZnVuY3Rpb24gJChuLHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj10YS5ldmVudDt0YS5ldmVudD1lLHRbMF09dGhpcy5fX2RhdGFfXzt0cnl7bi5hcHBseSh0aGlzLHQpfWZpbmFsbHl7dGEuZXZlbnQ9cn19fWZ1bmN0aW9uIEIobix0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMscj1uLnJlbGF0ZWRUYXJnZXQ7ciYmKHI9PT10fHw4JnIuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkpfHxlLmNhbGwodCxuKX19ZnVuY3Rpb24gVyhlKXt2YXIgcj0iLmRyYWdzdXBwcmVzcy0iKyArK0FhLHU9ImNsaWNrIityLGk9dGEuc2VsZWN0KHQoZSkpLm9uKCJ0b3VjaG1vdmUiK3IsUykub24oImRyYWdzdGFydCIrcixTKS5vbigic2VsZWN0c3RhcnQiK3IsUyk7aWYobnVsbD09RWEmJihFYT0ib25zZWxlY3RzdGFydCJpbiBlPyExOngoZS5zdHlsZSwidXNlclNlbGVjdCIpKSxFYSl7dmFyIG89bihlKS5zdHlsZSxhPW9bRWFdO29bRWFdPSJub25lIn1yZXR1cm4gZnVuY3Rpb24obil7aWYoaS5vbihyLG51bGwpLEVhJiYob1tFYV09YSksbil7dmFyIHQ9ZnVuY3Rpb24oKXtpLm9uKHUsbnVsbCl9O2kub24odSxmdW5jdGlvbigpe1MoKSx0KCl9LCEwKSxzZXRUaW1lb3V0KHQsMCl9fX1mdW5jdGlvbiBKKG4sZSl7ZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIHI9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoci5jcmVhdGVTVkdQb2ludCl7dmFyIHU9ci5jcmVhdGVTVkdQb2ludCgpO2lmKDA+TmEpe3ZhciBpPXQobik7aWYoaS5zY3JvbGxYfHxpLnNjcm9sbFkpe3I9dGEuc2VsZWN0KCJib2R5IikuYXBwZW5kKCJzdmciKS5zdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjoibm9uZSJ9LCJpbXBvcnRhbnQiKTt2YXIgbz1yWzBdWzBdLmdldFNjcmVlbkNUTSgpO05hPSEoby5mfHxvLmUpLHIucmVtb3ZlKCl9fXJldHVybiBOYT8odS54PWUucGFnZVgsdS55PWUucGFnZVkpOih1Lng9ZS5jbGllbnRYLHUueT1lLmNsaWVudFkpLHU9dS5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFt1LngsdS55XX12YXIgYT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtYS5sZWZ0LW4uY2xpZW50TGVmdCxlLmNsaWVudFktYS50b3Atbi5jbGllbnRUb3BdfWZ1bmN0aW9uIEcoKXtyZXR1cm4gdGEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiBLKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBRKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBudChuKXtyZXR1cm4gbj4xPzA6LTE+bj9xYTpNYXRoLmFjb3Mobil9ZnVuY3Rpb24gdHQobil7cmV0dXJuIG4+MT9SYTotMT5uPy1SYTpNYXRoLmFzaW4obil9ZnVuY3Rpb24gZXQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKS0xL24pLzJ9ZnVuY3Rpb24gcnQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKSsxL24pLzJ9ZnVuY3Rpb24gdXQobil7cmV0dXJuKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpfWZ1bmN0aW9uIGl0KG4pe3JldHVybihuPU1hdGguc2luKG4vMikpKm59ZnVuY3Rpb24gb3QoKXt9ZnVuY3Rpb24gYXQobix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgYXQ/KHRoaXMuaD0rbix0aGlzLnM9K3Qsdm9pZCh0aGlzLmw9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGF0P25ldyBhdChuLmgsbi5zLG4ubCk6YnQoIiIrbixfdCxhdCk6bmV3IGF0KG4sdCxlKX1mdW5jdGlvbiBjdChuLHQsZSl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gbj4zNjA/bi09MzYwOjA+biYmKG4rPTM2MCksNjA+bj9pKyhvLWkpKm4vNjA6MTgwPm4/bzoyNDA+bj9pKyhvLWkpKigyNDAtbikvNjA6aX1mdW5jdGlvbiB1KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSpyKG4pKX12YXIgaSxvO3JldHVybiBuPWlzTmFOKG4pPzA6KG4lPTM2MCk8MD9uKzM2MDpuLHQ9aXNOYU4odCk/MDowPnQ/MDp0PjE/MTp0LGU9MD5lPzA6ZT4xPzE6ZSxvPS41Pj1lP2UqKDErdCk6ZSt0LWUqdCxpPTIqZS1vLG5ldyBtdCh1KG4rMTIwKSx1KG4pLHUobi0xMjApKX1mdW5jdGlvbiBsdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBsdD8odGhpcy5oPStuLHRoaXMuYz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbHQ/bmV3IGx0KG4uaCxuLmMsbi5sKTpuIGluc3RhbmNlb2YgZnQ/Z3Qobi5sLG4uYSxuLmIpOmd0KChuPXd0KChuPXRhLnJnYihuKSkucixuLmcsbi5iKSkubCxuLmEsbi5iKTpuZXcgbHQobix0LGUpfWZ1bmN0aW9uIHN0KG4sdCxlKXtyZXR1cm4gaXNOYU4obikmJihuPTApLGlzTmFOKHQpJiYodD0wKSxuZXcgZnQoZSxNYXRoLmNvcyhuKj1EYSkqdCxNYXRoLnNpbihuKSp0KX1mdW5jdGlvbiBmdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBmdD8odGhpcy5sPStuLHRoaXMuYT0rdCx2b2lkKHRoaXMuYj0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgZnQ/bmV3IGZ0KG4ubCxuLmEsbi5iKTpuIGluc3RhbmNlb2YgbHQ/c3Qobi5oLG4uYyxuLmwpOnd0KChuPW10KG4pKS5yLG4uZyxuLmIpOm5ldyBmdChuLHQsZSl9ZnVuY3Rpb24gaHQobix0LGUpe3ZhciByPShuKzE2KS8xMTYsdT1yK3QvNTAwLGk9ci1lLzIwMDtyZXR1cm4gdT1wdCh1KSpYYSxyPXB0KHIpKiRhLGk9cHQoaSkqQmEsbmV3IG10KGR0KDMuMjQwNDU0Mip1LTEuNTM3MTM4NSpyLS40OTg1MzE0KmkpLGR0KC0uOTY5MjY2KnUrMS44NzYwMTA4KnIrLjA0MTU1NippKSxkdCguMDU1NjQzNCp1LS4yMDQwMjU5KnIrMS4wNTcyMjUyKmkpKX1mdW5jdGlvbiBndChuLHQsZSl7cmV0dXJuIG4+MD9uZXcgbHQoTWF0aC5hdGFuMihlLHQpKlBhLE1hdGguc3FydCh0KnQrZSplKSxuKTpuZXcgbHQoMC8wLDAvMCxuKX1mdW5jdGlvbiBwdChuKXtyZXR1cm4gbj4uMjA2ODkzMDM0P24qbipuOihuLTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIHZ0KG4pe3JldHVybiBuPi4wMDg4NTY/TWF0aC5wb3cobiwxLzMpOjcuNzg3MDM3Km4rNC8yOX1mdW5jdGlvbiBkdChuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqKC4wMDMwND49bj8xMi45MipuOjEuMDU1Kk1hdGgucG93KG4sMS8yLjQpLS4wNTUpKX1mdW5jdGlvbiBtdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBtdD8odGhpcy5yPX5+bix0aGlzLmc9fn50LHZvaWQodGhpcy5iPX5+ZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbXQ/bmV3IG10KG4ucixuLmcsbi5iKTpidCgiIituLG10LGN0KTpuZXcgbXQobix0LGUpfWZ1bmN0aW9uIHl0KG4pe3JldHVybiBuZXcgbXQobj4+MTYsbj4+OCYyNTUsMjU1Jm4pfWZ1bmN0aW9uIE10KG4pe3JldHVybiB5dChuKSsiIn1mdW5jdGlvbiB4dChuKXtyZXR1cm4gMTY+bj8iMCIrTWF0aC5tYXgoMCxuKS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LG4pLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBidChuLHQsZSl7dmFyIHIsdSxpLG89MCxhPTAsYz0wO2lmKHI9LyhbYS16XSspXCgoLiopXCkvaS5leGVjKG4pKXN3aXRjaCh1PXJbMl0uc3BsaXQoIiwiKSxyWzFdKXtjYXNlImhzbCI6cmV0dXJuIGUocGFyc2VGbG9hdCh1WzBdKSxwYXJzZUZsb2F0KHVbMV0pLzEwMCxwYXJzZUZsb2F0KHVbMl0pLzEwMCk7Y2FzZSJyZ2IiOnJldHVybiB0KGt0KHVbMF0pLGt0KHVbMV0pLGt0KHVbMl0pKX1yZXR1cm4oaT1HYS5nZXQobi50b0xvd2VyQ2FzZSgpKSk/dChpLnIsaS5nLGkuYik6KG51bGw9PW58fCIjIiE9PW4uY2hhckF0KDApfHxpc05hTihpPXBhcnNlSW50KG4uc2xpY2UoMSksMTYpKXx8KDQ9PT1uLmxlbmd0aD8obz0oMzg0MCZpKT4+NCxvPW8+PjR8byxhPTI0MCZpLGE9YT4+NHxhLGM9MTUmaSxjPWM8PDR8Yyk6Nz09PW4ubGVuZ3RoJiYobz0oMTY3MTE2ODAmaSk+PjE2LGE9KDY1MjgwJmkpPj44LGM9MjU1JmkpKSx0KG8sYSxjKSl9ZnVuY3Rpb24gX3Qobix0LGUpe3ZhciByLHUsaT1NYXRoLm1pbihuLz0yNTUsdC89MjU1LGUvPTI1NSksbz1NYXRoLm1heChuLHQsZSksYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PS41PmM/YS8obytpKTphLygyLW8taSkscj1uPT1vPyh0LWUpL2ErKGU+dD82OjApOnQ9PW8/KGUtbikvYSsyOihuLXQpL2ErNCxyKj02MCk6KHI9MC8wLHU9Yz4wJiYxPmM/MDpyKSxuZXcgYXQocix1LGMpfWZ1bmN0aW9uIHd0KG4sdCxlKXtuPVN0KG4pLHQ9U3QodCksZT1TdChlKTt2YXIgcj12dCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUpL1hhKSx1PXZ0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS8kYSksaT12dCgoLjAxOTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvQmEpO3JldHVybiBmdCgxMTYqdS0xNiw1MDAqKHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiBTdChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBrdChuKXt2YXIgdD1wYXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSp0KTp0fWZ1bmN0aW9uIEV0KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gQXQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksTnQodCxlLG4scil9fWZ1bmN0aW9uIE50KG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PWMuc3RhdHVzO2lmKCF0JiZ6dChjKXx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGksYyl9Y2F0Y2gocil7cmV0dXJuIHZvaWQgby5lcnJvci5jYWxsKGkscil9by5sb2FkLmNhbGwoaSxuKX1lbHNlIG8uZXJyb3IuY2FsbChpLGMpfXZhciBpPXt9LG89dGEuZGlzcGF0Y2goImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLGE9e30sYz1uZXcgWE1MSHR0cFJlcXVlc3QsbD1udWxsO3JldHVybiF0aGlzLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25sb2FkPWMub25lcnJvcj11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPjMmJnUoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PXRhLmV2ZW50O3RhLmV2ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLGMpfWZpbmFsbHl7dGEuZXZlbnQ9dH19LGkuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNlbmQuYXBwbHkoaSxbbl0uY29uY2F0KHJhKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24oZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBzIGluIGEpYy5zZXRSZXF1ZXN0SGVhZGVyKHMsYVtzXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWwmJihjLnJlc3BvbnNlVHlwZT1sKSxudWxsIT11JiZpLm9uKCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGksYyksYy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGMuYWJvcnQoKSxpfSx0YS5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChDdChyKSl9ZnVuY3Rpb24gQ3Qobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24obnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIHp0KG4pe3ZhciB0PW4ucmVzcG9uc2VUeXBlO3JldHVybiB0JiYidGV4dCIhPT10P24ucmVzcG9uc2U6bi5yZXNwb25zZVRleHR9ZnVuY3Rpb24gcXQoKXt2YXIgbj1MdCgpLHQ9VHQoKS1uO3Q+MjQ/KGlzRmluaXRlKHQpJiYoY2xlYXJUaW1lb3V0KHRjKSx0Yz1zZXRUaW1lb3V0KHF0LHQpKSxuYz0wKToobmM9MSxyYyhxdCkpfWZ1bmN0aW9uIEx0KCl7dmFyIG49RGF0ZS5ub3coKTtmb3IoZWM9S2E7ZWM7KW4+PWVjLnQmJihlYy5mPWVjLmMobi1lYy50KSksZWM9ZWMubjtyZXR1cm4gbn1mdW5jdGlvbiBUdCgpe2Zvcih2YXIgbix0PUthLGU9MS8wO3Q7KXQuZj90PW4/bi5uPXQubjpLYT10Lm46KHQudDxlJiYoZT10LnQpLHQ9KG49dCkubik7cmV0dXJuIFFhPW4sZX1mdW5jdGlvbiBSdChuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIER0KG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMypnYSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBQdChuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLG89MCxhPXJbMF0sYz0wO3U+MCYmYT4wJiYoYythKzE+dCYmKGE9TWF0aC5tYXgoMSx0LWMpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09YSx1K2EpKSwhKChjKz1hKzEpPnQpKTspYT1yW289KG8rMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTp5O3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1pYy5leGVjKG4pLHI9ZVsxXXx8IiAiLG89ZVsyXXx8Ij4iLGE9ZVszXXx8Ii0iLGM9ZVs0XXx8IiIsbD1lWzVdLHM9K2VbNl0sZj1lWzddLGg9ZVs4XSxnPWVbOV0scD0xLHY9IiIsZD0iIixtPSExLHk9ITA7c3dpdGNoKGgmJihoPStoLnN1YnN0cmluZygxKSksKGx8fCIwIj09PXImJiI9Ij09PW8pJiYobD1yPSIwIixvPSI9IiksZyl7Y2FzZSJuIjpmPSEwLGc9ImciO2JyZWFrO2Nhc2UiJSI6cD0xMDAsZD0iJSIsZz0iZiI7YnJlYWs7Y2FzZSJwIjpwPTEwMCxkPSIlIixnPSJyIjticmVhaztjYXNlImIiOmNhc2UibyI6Y2FzZSJ4IjpjYXNlIlgiOiIjIj09PWMmJih2PSIwIitnLnRvTG93ZXJDYXNlKCkpO2Nhc2UiYyI6eT0hMTtjYXNlImQiOm09ITAsaD0wO2JyZWFrO2Nhc2UicyI6cD0tMSxnPSJyIn0iJCI9PT1jJiYodj11WzBdLGQ9dVsxXSksInIiIT1nfHxofHwoZz0iZyIpLG51bGwhPWgmJigiZyI9PWc/aD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGgpKTooImUiPT1nfHwiZiI9PWcpJiYoaD1NYXRoLm1heCgwLE1hdGgubWluKDIwLGgpKSkpLGc9b2MuZ2V0KGcpfHxVdDt2YXIgTT1sJiZmO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1kO2lmKG0mJm4lMSlyZXR1cm4iIjt2YXIgdT0wPm58fDA9PT1uJiYwPjEvbj8obj0tbiwiLSIpOiItIj09PWE/IiI6YTtpZigwPnApe3ZhciBjPXRhLmZvcm1hdFByZWZpeChuLGgpO249Yy5zY2FsZShuKSxlPWMuc3ltYm9sK2R9ZWxzZSBuKj1wO249ZyhuLGgpO3ZhciB4LGIsXz1uLmxhc3RJbmRleE9mKCIuIik7aWYoMD5fKXt2YXIgdz15P24ubGFzdEluZGV4T2YoImUiKTotMTswPnc/KHg9bixiPSIiKTooeD1uLnN1YnN0cmluZygwLHcpLGI9bi5zdWJzdHJpbmcodykpfWVsc2UgeD1uLnN1YnN0cmluZygwLF8pLGI9dCtuLnN1YnN0cmluZyhfKzEpOyFsJiZmJiYoeD1pKHgsMS8wKSk7dmFyIFM9di5sZW5ndGgreC5sZW5ndGgrYi5sZW5ndGgrKE0/MDp1Lmxlbmd0aCksaz1zPlM/bmV3IEFycmF5KFM9cy1TKzEpLmpvaW4ocik6IiI7cmV0dXJuIE0mJih4PWkoayt4LGsubGVuZ3RoP3MtYi5sZW5ndGg6MS8wKSksdSs9dixuPXgrYiwoIjwiPT09bz91K24razoiPiI9PT1vP2srdStuOiJeIj09PW8/ay5zdWJzdHJpbmcoMCxTPj49MSkrdStuK2suc3Vic3RyaW5nKFMpOnUrKE0/bjprK24pKStlfX19ZnVuY3Rpb24gVXQobil7cmV0dXJuIG4rIiJ9ZnVuY3Rpb24ganQoKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUuVVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIEZ0KG4sdCxlKXtmdW5jdGlvbiByKHQpe3ZhciBlPW4odCkscj1pKGUsMSk7cmV0dXJuIHItdD50LWU/ZTpyfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHQoZT1uKG5ldyBjYyhlLTEpKSwxKSxlfWZ1bmN0aW9uIGkobixlKXtyZXR1cm4gdChuPW5ldyBjYygrbiksZSksbn1mdW5jdGlvbiBvKG4scixpKXt2YXIgbz11KG4pLGE9W107aWYoaT4xKWZvcig7cj5vOyllKG8pJWl8fGEucHVzaChuZXcgRGF0ZSgrbykpLHQobywxKTtlbHNlIGZvcig7cj5vOylhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7cmV0dXJuIGF9ZnVuY3Rpb24gYShuLHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPW4sbyhyLHQsZSl9ZmluYWxseXtjYz1EYXRlfX1uLmZsb29yPW4sbi5yb3VuZD1yLG4uY2VpbD11LG4ub2Zmc2V0PWksbi5yYW5nZT1vO3ZhciBjPW4udXRjPUh0KG4pO3JldHVybiBjLmZsb29yPWMsYy5yb3VuZD1IdChyKSxjLmNlaWw9SHQodSksYy5vZmZzZXQ9SHQoaSksYy5yYW5nZT1hLG59ZnVuY3Rpb24gSHQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPXQsbihyLGUpLl99ZmluYWxseXtjYz1EYXRlfX19ZnVuY3Rpb24gT3Qobil7ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiB0KHQpe2Zvcih2YXIgZSx1LGksbz1bXSxhPS0xLGM9MDsrK2E8cjspMzc9PT1uLmNoYXJDb2RlQXQoYSkmJihvLnB1c2gobi5zbGljZShjLGEpKSxudWxsIT0odT1zY1tlPW4uY2hhckF0KCsrYSldKSYmKGU9bi5jaGFyQXQoKythKSksKGk9TltlXSkmJihlPWkodCxudWxsPT11PyJlIj09PWU/IiAiOiIwIjp1KSksby5wdXNoKGUpLGM9YSsxKTtyZXR1cm4gby5wdXNoKG4uc2xpY2UoYyxhKSksby5qb2luKCIiKX12YXIgcj1uLmxlbmd0aDtyZXR1cm4gdC5wYXJzZT1mdW5jdGlvbih0KXt2YXIgcj17eToxOTAwLG06MCxkOjEsSDowLE06MCxTOjAsTDowLFo6bnVsbH0sdT1lKHIsbix0LDApO2lmKHUhPXQubGVuZ3RoKXJldHVybiBudWxsOyJwImluIHImJihyLkg9ci5IJTEyKzEyKnIucCk7dmFyIGk9bnVsbCE9ci5aJiZjYyE9PWp0LG89bmV3KGk/anQ6Y2MpO3JldHVybiJqImluIHI/by5zZXRGdWxsWWVhcihyLnksMCxyLmopOiJ3ImluIHImJigiVyJpbiByfHwiVSJpbiByKT8oby5zZXRGdWxsWWVhcihyLnksMCwxKSxvLnNldEZ1bGxZZWFyKHIueSwwLCJXImluIHI/KHIudys2KSU3Kzcqci5XLShvLmdldERheSgpKzUpJTc6ci53Kzcqci5VLShvLmdldERheSgpKzYpJTcpKTpvLnNldEZ1bGxZZWFyKHIueSxyLm0sci5kKSxvLnNldEhvdXJzKHIuSCsoci5aLzEwMHwwKSxyLk0rci5aJTEwMCxyLlMsci5MKSxpP28uXzpvfSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHR9ZnVuY3Rpb24gZShuLHQsZSxyKXtmb3IodmFyIHUsaSxvLGE9MCxjPXQubGVuZ3RoLGw9ZS5sZW5ndGg7Yz5hOyl7aWYocj49bClyZXR1cm4tMTtpZih1PXQuY2hhckNvZGVBdChhKyspLDM3PT09dSl7aWYobz10LmNoYXJBdChhKyspLGk9Q1tvIGluIHNjP3QuY2hhckF0KGErKyk6b10sIWl8fChyPWkobixlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYodSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9ZnVuY3Rpb24gcihuLHQsZSl7Xy5sYXN0SW5kZXg9MDt2YXIgcj1fLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4udz13LmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHUobix0LGUpe3gubGFzdEluZGV4PTA7dmFyIHI9eC5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9Yi5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpKG4sdCxlKXtFLmxhc3RJbmRleD0wO3ZhciByPUUuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5tPUEuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbyhuLHQsZSl7Uy5sYXN0SW5kZXg9MDt2YXIgcj1TLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1rLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGEobix0LHIpe3JldHVybiBlKG4sTi5jLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBjKG4sdCxyKXtyZXR1cm4gZShuLE4ueC50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gbChuLHQscil7cmV0dXJuIGUobixOLlgudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIHMobix0LGUpe3ZhciByPU0uZ2V0KHQuc2xpY2UoZSxlKz0yKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbnVsbD09cj8tMToobi5wPXIsZSl9dmFyIGY9bi5kYXRlVGltZSxoPW4uZGF0ZSxnPW4udGltZSxwPW4ucGVyaW9kcyx2PW4uZGF5cyxkPW4uc2hvcnREYXlzLG09bi5tb250aHMseT1uLnNob3J0TW9udGhzO3QudXRjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGUobil7dHJ5e2NjPWp0O3ZhciB0PW5ldyBjYztyZXR1cm4gdC5fPW4scih0KX1maW5hbGx5e2NjPURhdGV9fXZhciByPXQobik7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dHJ5e2NjPWp0O3ZhciB0PXIucGFyc2Uobik7cmV0dXJuIHQmJnQuX31maW5hbGx5e2NjPURhdGV9fSxlLnRvU3RyaW5nPXIudG9TdHJpbmcsZX0sdC5tdWx0aT10LnV0Yy5tdWx0aT1hZTt2YXIgTT10YS5tYXAoKSx4PVl0KHYpLGI9WnQodiksXz1ZdChkKSx3PVp0KGQpLFM9WXQobSksaz1adChtKSxFPVl0KHkpLEE9WnQoeSk7cC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7TS5zZXQobi50b0xvd2VyQ2FzZSgpLHQpfSk7dmFyIE49e2E6ZnVuY3Rpb24obil7cmV0dXJuIGRbbi5nZXREYXkoKV19LEE6ZnVuY3Rpb24obil7cmV0dXJuIHZbbi5nZXREYXkoKV19LGI6ZnVuY3Rpb24obil7cmV0dXJuIHlbbi5nZXRNb250aCgpXX0sQjpmdW5jdGlvbihuKXtyZXR1cm4gbVtuLmdldE1vbnRoKCldfSxjOnQoZiksZDpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldERhdGUoKSx0LDIpfSxlOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RGF0ZSgpLHQsMil9LEg6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpLHQsMil9LEk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpJTEyfHwxMix0LDIpfSxqOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KDErYWMuZGF5T2ZZZWFyKG4pLHQsMyl9LEw6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaWxsaXNlY29uZHMoKSx0LDMpfSxtOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0TW9udGgoKSsxLHQsMil9LE06ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaW51dGVzKCksdCwyKX0scDpmdW5jdGlvbihuKXtyZXR1cm4gcFsrKG4uZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldFNlY29uZHMoKSx0LDIpfSxVOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLnN1bmRheU9mWWVhcihuKSx0LDIpfSx3OmZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpfSxXOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLm1vbmRheU9mWWVhcihuKSx0LDIpfSx4OnQoaCksWDp0KGcpLHk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRGdWxsWWVhcigpJTEwMCx0LDIpfSxZOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RnVsbFllYXIoKSUxZTQsdCw0KX0sWjppZSwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxDPXthOnIsQTp1LGI6aSxCOm8sYzphLGQ6UXQsZTpRdCxIOnRlLEk6dGUsajpuZSxMOnVlLG06S3QsTTplZSxwOnMsUzpyZSxVOlh0LHc6VnQsVzokdCx4OmMsWDpsLHk6V3QsWTpCdCxaOkp0LCIlIjpvZX07cmV0dXJuIHR9ZnVuY3Rpb24gSXQobix0LGUpe3ZhciByPTA+bj8iLSI6IiIsdT0ocj8tbjpuKSsiIixpPXUubGVuZ3RoO3JldHVybiByKyhlPmk/bmV3IEFycmF5KGUtaSsxKS5qb2luKHQpK3U6dSl9ZnVuY3Rpb24gWXQobil7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK24ubWFwKHRhLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBadChuKXtmb3IodmFyIHQ9bmV3IGwsZT0tMSxyPW4ubGVuZ3RoOysrZTxyOyl0LnNldChuW2VdLnRvTG93ZXJDYXNlKCksZSk7cmV0dXJuIHR9ZnVuY3Rpb24gVnQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMSkpO3JldHVybiByPyhuLnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWHQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiAkdChuLHQsZSl7ZmMubGFzdEluZGV4PTA7dmFyIHI9ZmMuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJ0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8obi55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFd0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi55PUd0KCtyWzBdKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdChuLHQsZSl7cmV0dXJuL15bKy1dXGR7NH0kLy50ZXN0KHQ9dC5zbGljZShlLGUrNSkpPyhuLlo9LXQsZSs1KTotMX1mdW5jdGlvbiBHdChuKXtyZXR1cm4gbisobj42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gS3Qobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFF0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5lKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5qPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHRlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGllKG4pe3ZhciB0PW4uZ2V0VGltZXpvbmVPZmZzZXQoKSxlPXQ+MD8iLSI6IisiLHI9Z2EodCkvNjB8MCx1PWdhKHQpJTYwO3JldHVybiBlK0l0KHIsIjAiLDIpK0l0KHUsIjAiLDIpfWZ1bmN0aW9uIG9lKG4sdCxlKXtoYy5sYXN0SW5kZXg9MDt2YXIgcj1oYy5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGFlKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPS0xOysrZTx0OyluW2VdWzBdPXRoaXMobltlXVswXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9bltlXTshclsxXSh0KTspcj1uWysrZV07cmV0dXJuIHJbMF0odCl9fWZ1bmN0aW9uIGNlKCl7fWZ1bmN0aW9uIGxlKG4sdCxlKXt2YXIgcj1lLnM9bit0LHU9ci1uLGk9ci11O2UudD1uLWkrKHQtdSl9ZnVuY3Rpb24gc2Uobix0KXtuJiZkYy5oYXNPd25Qcm9wZXJ0eShuLnR5cGUpJiZkY1tuLnR5cGVdKG4sdCl9ZnVuY3Rpb24gZmUobix0LGUpe3ZhciByLHU9LTEsaT1uLmxlbmd0aC1lO2Zvcih0LmxpbmVTdGFydCgpOysrdTxpOylyPW5bdV0sdC5wb2ludChyWzBdLHJbMV0sclsyXSk7dC5saW5lRW5kKCl9ZnVuY3Rpb24gaGUobix0KXt2YXIgZT0tMSxyPW4ubGVuZ3RoO2Zvcih0LnBvbHlnb25TdGFydCgpOysrZTxyOylmZShuW2VdLHQsMSk7dC5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gZ2UoKXtmdW5jdGlvbiBuKG4sdCl7bio9RGEsdD10KkRhLzIrcWEvNDt2YXIgZT1uLXIsbz1lPj0wPzE6LTEsYT1vKmUsYz1NYXRoLmNvcyh0KSxsPU1hdGguc2luKHQpLHM9aSpsLGY9dSpjK3MqTWF0aC5jb3MoYSksaD1zKm8qTWF0aC5zaW4oYSk7eWMuYWRkKE1hdGguYXRhbjIoaCxmKSkscj1uLHU9YyxpPWx9dmFyIHQsZSxyLHUsaTtNYy5wb2ludD1mdW5jdGlvbihvLGEpe01jLnBvaW50PW4scj0odD1vKSpEYSx1PU1hdGguY29zKGE9KGU9YSkqRGEvMitxYS80KSxpPU1hdGguc2luKGEpfSxNYy5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiBwZShuKXt2YXIgdD1uWzBdLGU9blsxXSxyPU1hdGguY29zKGUpO3JldHVybltyKk1hdGguY29zKHQpLHIqTWF0aC5zaW4odCksTWF0aC5zaW4oZSldfWZ1bmN0aW9uIHZlKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdfWZ1bmN0aW9uIGRlKG4sdCl7cmV0dXJuW25bMV0qdFsyXS1uWzJdKnRbMV0sblsyXSp0WzBdLW5bMF0qdFsyXSxuWzBdKnRbMV0tblsxXSp0WzBdXX1mdW5jdGlvbiBtZShuLHQpe25bMF0rPXRbMF0sblsxXSs9dFsxXSxuWzJdKz10WzJdfWZ1bmN0aW9uIHllKG4sdCl7cmV0dXJuW25bMF0qdCxuWzFdKnQsblsyXSp0XX1mdW5jdGlvbiBNZShuKXt2YXIgdD1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXStuWzJdKm5bMl0pO25bMF0vPXQsblsxXS89dCxuWzJdLz10fWZ1bmN0aW9uIHhlKG4pe3JldHVybltNYXRoLmF0YW4yKG5bMV0sblswXSksdHQoblsyXSldfWZ1bmN0aW9uIGJlKG4sdCl7cmV0dXJuIGdhKG5bMF0tdFswXSk8Q2EmJmdhKG5bMV0tdFsxXSk8Q2F9ZnVuY3Rpb24gX2Uobix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSk7d2UoZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4pLE1hdGguc2luKHQpKX1mdW5jdGlvbiB3ZShuLHQsZSl7Kyt4YyxfYys9KG4tX2MpL3hjLHdjKz0odC13YykveGMsU2MrPShlLVNjKS94Y31mdW5jdGlvbiBTZSgpe2Z1bmN0aW9uIG4obix1KXtuKj1EYTt2YXIgaT1NYXRoLmNvcyh1Kj1EYSksbz1pKk1hdGguY29zKG4pLGE9aSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHUpLGw9TWF0aC5hdGFuMihNYXRoLnNxcnQoKGw9ZSpjLXIqYSkqbCsobD1yKm8tdCpjKSpsKyhsPXQqYS1lKm8pKmwpLHQqbytlKmErcipjKTtiYys9bCxrYys9bCoodCsodD1vKSksRWMrPWwqKGUrKGU9YSkpLEFjKz1sKihyKyhyPWMpKSx3ZSh0LGUscil9dmFyIHQsZSxyO3FjLnBvaW50PWZ1bmN0aW9uKHUsaSl7dSo9RGE7dmFyIG89TWF0aC5jb3MoaSo9RGEpO3Q9bypNYXRoLmNvcyh1KSxlPW8qTWF0aC5zaW4odSkscj1NYXRoLnNpbihpKSxxYy5wb2ludD1uLHdlKHQsZSxyKX19ZnVuY3Rpb24ga2UoKXtxYy5wb2ludD1fZX1mdW5jdGlvbiBFZSgpe2Z1bmN0aW9uIG4obix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSksbz1lKk1hdGguY29zKG4pLGE9ZSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHQpLGw9dSpjLWkqYSxzPWkqby1yKmMsZj1yKmEtdSpvLGg9TWF0aC5zcXJ0KGwqbCtzKnMrZipmKSxnPXIqbyt1KmEraSpjLHA9aCYmLW50KGcpL2gsdj1NYXRoLmF0YW4yKGgsZyk7TmMrPXAqbCxDYys9cCpzLHpjKz1wKmYsYmMrPXYsa2MrPXYqKHIrKHI9bykpLEVjKz12Kih1Kyh1PWEpKSxBYys9diooaSsoaT1jKSksd2Uocix1LGkpfXZhciB0LGUscix1LGk7cWMucG9pbnQ9ZnVuY3Rpb24obyxhKXt0PW8sZT1hLHFjLnBvaW50PW4sbyo9RGE7dmFyIGM9TWF0aC5jb3MoYSo9RGEpO3I9YypNYXRoLmNvcyhvKSx1PWMqTWF0aC5zaW4obyksaT1NYXRoLnNpbihhKSx3ZShyLHUsaSl9LHFjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSkscWMubGluZUVuZD1rZSxxYy5wb2ludD1fZX19ZnVuY3Rpb24gQWUobix0KXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9bihlLHIpLHQoZVswXSxlWzFdKX1yZXR1cm4gbi5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT10LmludmVydChlLHIpLGUmJm4uaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIE5lKCl7cmV0dXJuITB9ZnVuY3Rpb24gQ2Uobix0LGUscix1KXt2YXIgaT1bXSxvPVtdO2lmKG4uZm9yRWFjaChmdW5jdGlvbihuKXtpZighKCh0PW4ubGVuZ3RoLTEpPD0wKSl7dmFyIHQsZT1uWzBdLHI9blt0XTtpZihiZShlLHIpKXt1LmxpbmVTdGFydCgpO2Zvcih2YXIgYT0wO3Q+YTsrK2EpdS5wb2ludCgoZT1uW2FdKVswXSxlWzFdKTtyZXR1cm4gdm9pZCB1LmxpbmVFbmQoKX12YXIgYz1uZXcgcWUoZSxuLG51bGwsITApLGw9bmV3IHFlKGUsbnVsbCxjLCExKTtjLm89bCxpLnB1c2goYyksby5wdXNoKGwpLGM9bmV3IHFlKHIsbixudWxsLCExKSxsPW5ldyBxZShyLG51bGwsYywhMCksYy5vPWwsaS5wdXNoKGMpLG8ucHVzaChsKX19KSxvLnNvcnQodCksemUoaSksemUobyksaS5sZW5ndGgpe2Zvcih2YXIgYT0wLGM9ZSxsPW8ubGVuZ3RoO2w+YTsrK2Epb1thXS5lPWM9IWM7Zm9yKHZhciBzLGYsaD1pWzBdOzspe2Zvcih2YXIgZz1oLHA9ITA7Zy52OylpZigoZz1nLm4pPT09aClyZXR1cm47cz1nLnosdS5saW5lU3RhcnQoKTtkb3tpZihnLnY9Zy5vLnY9ITAsZy5lKXtpZihwKWZvcih2YXIgYT0wLGw9cy5sZW5ndGg7bD5hOysrYSl1LnBvaW50KChmPXNbYV0pWzBdLGZbMV0pO2Vsc2UgcihnLngsZy5uLngsMSx1KTtnPWcubn1lbHNle2lmKHApe3M9Zy5wLno7Zm9yKHZhciBhPXMubGVuZ3RoLTE7YT49MDstLWEpdS5wb2ludCgoZj1zW2FdKVswXSxmWzFdKX1lbHNlIHIoZy54LGcucC54LC0xLHUpO2c9Zy5wfWc9Zy5vLHM9Zy56LHA9IXB9d2hpbGUoIWcudik7dS5saW5lRW5kKCl9fX1mdW5jdGlvbiB6ZShuKXtpZih0PW4ubGVuZ3RoKXtmb3IodmFyIHQsZSxyPTAsdT1uWzBdOysrcjx0Oyl1Lm49ZT1uW3JdLGUucD11LHU9ZTt1Lm49ZT1uWzBdLGUucD11fX1mdW5jdGlvbiBxZShuLHQsZSxyKXt0aGlzLng9bix0aGlzLno9dCx0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIExlKG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1LGkpe2Z1bmN0aW9uIG8odCxlKXt2YXIgcj11KHQsZSk7bih0PXJbMF0sZT1yWzFdKSYmaS5wb2ludCh0LGUpfWZ1bmN0aW9uIGEobix0KXt2YXIgZT11KG4sdCk7ZC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGMoKXt5LnBvaW50PWEsZC5saW5lU3RhcnQoKX1mdW5jdGlvbiBsKCl7eS5wb2ludD1vLGQubGluZUVuZCgpfWZ1bmN0aW9uIHMobix0KXt2LnB1c2goW24sdF0pO3ZhciBlPXUobix0KTt4LnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gZigpe3gubGluZVN0YXJ0KCksdj1bXX1mdW5jdGlvbiBoKCl7cyh2WzBdWzBdLHZbMF1bMV0pLHgubGluZUVuZCgpO3ZhciBuLHQ9eC5jbGVhbigpLGU9TS5idWZmZXIoKSxyPWUubGVuZ3RoO2lmKHYucG9wKCkscC5wdXNoKHYpLHY9bnVsbCxyKWlmKDEmdCl7bj1lWzBdO3ZhciB1LHI9bi5sZW5ndGgtMSxvPS0xO2lmKHI+MCl7Zm9yKGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLGkubGluZVN0YXJ0KCk7KytvPHI7KWkucG9pbnQoKHU9bltvXSlbMF0sdVsxXSk7aS5saW5lRW5kKCl9fWVsc2Ugcj4xJiYyJnQmJmUucHVzaChlLnBvcCgpLmNvbmNhdChlLnNoaWZ0KCkpKSxnLnB1c2goZS5maWx0ZXIoVGUpKX12YXIgZyxwLHYsZD10KGkpLG09dS5pbnZlcnQoclswXSxyWzFdKSx5PXtwb2ludDpvLGxpbmVTdGFydDpjLGxpbmVFbmQ6bCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt5LnBvaW50PXMseS5saW5lU3RhcnQ9Zix5LmxpbmVFbmQ9aCxnPVtdLHA9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt5LnBvaW50PW8seS5saW5lU3RhcnQ9Yyx5LmxpbmVFbmQ9bCxnPXRhLm1lcmdlKGcpO3ZhciBuPUZlKG0scCk7Zy5sZW5ndGg/KGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLENlKGcsRGUsbixlLGkpKTpuJiYoYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpKSxiJiYoaS5wb2x5Z29uRW5kKCksYj0hMSksZz1wPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2kucG9seWdvblN0YXJ0KCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpLGkucG9seWdvbkVuZCgpfX0sTT1SZSgpLHg9dChNKSxiPSExO3JldHVybiB5fX1mdW5jdGlvbiBUZShuKXtyZXR1cm4gbi5sZW5ndGg+MX1mdW5jdGlvbiBSZSgpe3ZhciBuLHQ9W107cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QucHVzaChuPVtdKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtuLnB1c2goW3QsZV0pfSxsaW5lRW5kOmIsYnVmZmVyOmZ1bmN0aW9uKCl7dmFyIGU9dDtyZXR1cm4gdD1bXSxuPW51bGwsZX0scmVqb2luOmZ1bmN0aW9uKCl7dC5sZW5ndGg+MSYmdC5wdXNoKHQucG9wKCkuY29uY2F0KHQuc2hpZnQoKSkpfX19ZnVuY3Rpb24gRGUobix0KXtyZXR1cm4oKG49bi54KVswXTwwP25bMV0tUmEtQ2E6UmEtblsxXSktKCh0PXQueClbMF08MD90WzFdLVJhLUNhOlJhLXRbMV0pfWZ1bmN0aW9uIFBlKG4pe3ZhciB0LGU9MC8wLHI9MC8wLHU9MC8wO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLmxpbmVTdGFydCgpLHQ9MX0scG9pbnQ6ZnVuY3Rpb24oaSxvKXt2YXIgYT1pPjA/cWE6LXFhLGM9Z2EoaS1lKTtnYShjLXFhKTxDYT8obi5wb2ludChlLHI9KHIrbykvMj4wP1JhOi1SYSksbi5wb2ludCh1LHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChhLHIpLG4ucG9pbnQoaSxyKSx0PTApOnUhPT1hJiZjPj1xYSYmKGdhKGUtdSk8Q2EmJihlLT11KkNhKSxnYShpLWEpPENhJiYoaS09YSpDYSkscj1VZShlLHIsaSxvKSxuLnBvaW50KHUsciksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KGEsciksdD0wKSxuLnBvaW50KGU9aSxyPW8pLHU9YX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpLGU9cj0wLzB9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItdH19fWZ1bmN0aW9uIFVlKG4sdCxlLHIpe3ZhciB1LGksbz1NYXRoLnNpbihuLWUpO3JldHVybiBnYShvKT5DYT9NYXRoLmF0YW4oKE1hdGguc2luKHQpKihpPU1hdGguY29zKHIpKSpNYXRoLnNpbihlKS1NYXRoLnNpbihyKSoodT1NYXRoLmNvcyh0KSkqTWF0aC5zaW4obikpLyh1KmkqbykpOih0K3IpLzJ9ZnVuY3Rpb24gamUobix0LGUscil7dmFyIHU7aWYobnVsbD09bil1PWUqUmEsci5wb2ludCgtcWEsdSksci5wb2ludCgwLHUpLHIucG9pbnQocWEsdSksci5wb2ludChxYSwwKSxyLnBvaW50KHFhLC11KSxyLnBvaW50KDAsLXUpLHIucG9pbnQoLXFhLC11KSxyLnBvaW50KC1xYSwwKSxyLnBvaW50KC1xYSx1KTtlbHNlIGlmKGdhKG5bMF0tdFswXSk+Q2Epe3ZhciBpPW5bMF08dFswXT9xYTotcWE7dT1lKmkvMixyLnBvaW50KC1pLHUpLHIucG9pbnQoMCx1KSxyLnBvaW50KGksdSl9ZWxzZSByLnBvaW50KHRbMF0sdFsxXSl9ZnVuY3Rpb24gRmUobix0KXt2YXIgZT1uWzBdLHI9blsxXSx1PVtNYXRoLnNpbihlKSwtTWF0aC5jb3MoZSksMF0saT0wLG89MDt5Yy5yZXNldCgpO2Zvcih2YXIgYT0wLGM9dC5sZW5ndGg7Yz5hOysrYSl7dmFyIGw9dFthXSxzPWwubGVuZ3RoO2lmKHMpZm9yKHZhciBmPWxbMF0saD1mWzBdLGc9ZlsxXS8yK3FhLzQscD1NYXRoLnNpbihnKSx2PU1hdGguY29zKGcpLGQ9MTs7KXtkPT09cyYmKGQ9MCksbj1sW2RdO3ZhciBtPW5bMF0seT1uWzFdLzIrcWEvNCxNPU1hdGguc2luKHkpLHg9TWF0aC5jb3MoeSksYj1tLWgsXz1iPj0wPzE6LTEsdz1fKmIsUz13PnFhLGs9cCpNO2lmKHljLmFkZChNYXRoLmF0YW4yKGsqXypNYXRoLnNpbih3KSx2KngraypNYXRoLmNvcyh3KSkpLGkrPVM/YitfKkxhOmIsU15oPj1lXm0+PWUpe3ZhciBFPWRlKHBlKGYpLHBlKG4pKTtNZShFKTt2YXIgQT1kZSh1LEUpO01lKEEpO3ZhciBOPShTXmI+PTA/LTE6MSkqdHQoQVsyXSk7KHI+Tnx8cj09PU4mJihFWzBdfHxFWzFdKSkmJihvKz1TXmI+PTA/MTotMSl9aWYoIWQrKylicmVhaztoPW0scD1NLHY9eCxmPW59fXJldHVybigtQ2E+aXx8Q2E+aSYmMD55YyleMSZvfWZ1bmN0aW9uIEhlKG4pe2Z1bmN0aW9uIHQobix0KXtyZXR1cm4gTWF0aC5jb3MobikqTWF0aC5jb3ModCk+aX1mdW5jdGlvbiBlKG4pe3ZhciBlLGksYyxsLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2w9Yz0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGYsaCl7dmFyIGcscD1bZixoXSx2PXQoZixoKSxkPW8/dj8wOnUoZixoKTp2P3UoZisoMD5mP3FhOi1xYSksaCk6MDtpZighZSYmKGw9Yz12KSYmbi5saW5lU3RhcnQoKSx2IT09YyYmKGc9cihlLHApLChiZShlLGcpfHxiZShwLGcpKSYmKHBbMF0rPUNhLHBbMV0rPUNhLHY9dChwWzBdLHBbMV0pKSksdiE9PWMpcz0wLHY/KG4ubGluZVN0YXJ0KCksZz1yKHAsZSksbi5wb2ludChnWzBdLGdbMV0pKTooZz1yKGUscCksbi5wb2ludChnWzBdLGdbMV0pLG4ubGluZUVuZCgpKSxlPWc7ZWxzZSBpZihhJiZlJiZvXnYpe3ZhciBtO2QmaXx8IShtPXIocCxlLCEwKSl8fChzPTAsbz8obi5saW5lU3RhcnQoKSxuLnBvaW50KG1bMF1bMF0sbVswXVsxXSksbi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpKToobi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChtWzBdWzBdLG1bMF1bMV0pKSl9IXZ8fGUmJmJlKGUscCl8fG4ucG9pbnQocFswXSxwWzFdKSxlPXAsYz12LGk9ZH0sbGluZUVuZDpmdW5jdGlvbigpe2MmJm4ubGluZUVuZCgpLGU9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gc3wobCYmYyk8PDF9fX1mdW5jdGlvbiByKG4sdCxlKXt2YXIgcj1wZShuKSx1PXBlKHQpLG89WzEsMCwwXSxhPWRlKHIsdSksYz12ZShhLGEpLGw9YVswXSxzPWMtbCpsO2lmKCFzKXJldHVybiFlJiZuO3ZhciBmPWkqYy9zLGg9LWkqbC9zLGc9ZGUobyxhKSxwPXllKG8sZiksdj15ZShhLGgpO21lKHAsdik7dmFyIGQ9ZyxtPXZlKHAsZCkseT12ZShkLGQpLE09bSptLXkqKHZlKHAscCktMSk7aWYoISgwPk0pKXt2YXIgeD1NYXRoLnNxcnQoTSksYj15ZShkLCgtbS14KS95KTtpZihtZShiLHApLGI9eGUoYiksIWUpcmV0dXJuIGI7dmFyIF8sdz1uWzBdLFM9dFswXSxrPW5bMV0sRT10WzFdO3c+UyYmKF89dyx3PVMsUz1fKTt2YXIgQT1TLXcsTj1nYShBLXFhKTxDYSxDPU58fENhPkE7aWYoIU4mJms+RSYmKF89ayxrPUUsRT1fKSxDP04/aytFPjBeYlsxXTwoZ2EoYlswXS13KTxDYT9rOkUpOms8PWJbMV0mJmJbMV08PUU6QT5xYV4odzw9YlswXSYmYlswXTw9Uykpe3ZhciB6PXllKGQsKC1tK3gpL3kpO3JldHVybiBtZSh6LHApLFtiLHhlKHopXX19fWZ1bmN0aW9uIHUodCxlKXt2YXIgcj1vP246cWEtbix1PTA7cmV0dXJuLXI+dD91fD0xOnQ+ciYmKHV8PTIpLC1yPmU/dXw9NDplPnImJih1fD04KSx1fXZhciBpPU1hdGguY29zKG4pLG89aT4wLGE9Z2EoaSk+Q2EsYz1ncihuLDYqRGEpO3JldHVybiBMZSh0LGUsYyxvP1swLC1uXTpbLXFhLG4tcWFdKX1mdW5jdGlvbiBPZShuLHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dmFyIGksbz11LmEsYT11LmIsYz1vLngsbD1vLnkscz1hLngsZj1hLnksaD0wLGc9MSxwPXMtYyx2PWYtbDtpZihpPW4tYyxwfHwhKGk+MCkpe2lmKGkvPXAsMD5wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZihwPjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPWUtYyxwfHwhKDA+aSkpe2lmKGkvPXAsMD5wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZihwPjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1pZihpPXQtbCx2fHwhKGk+MCkpe2lmKGkvPXYsMD52KXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZih2PjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPXItbCx2fHwhKDA+aSkpe2lmKGkvPXYsMD52KXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZih2PjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1yZXR1cm4gaD4wJiYodS5hPXt4OmMraCpwLHk6bCtoKnZ9KSwxPmcmJih1LmI9e3g6YytnKnAseTpsK2cqdn0pLHV9fX19fX1mdW5jdGlvbiBJZShuLHQsZSxyKXtmdW5jdGlvbiB1KHIsdSl7cmV0dXJuIGdhKHJbMF0tbik8Q2E/dT4wPzA6MzpnYShyWzBdLWUpPENhP3U+MD8yOjE6Z2EoclsxXS10KTxDYT91PjA/MTowOnU+MD8zOjJ9ZnVuY3Rpb24gaShuLHQpe3JldHVybiBvKG4ueCx0LngpfWZ1bmN0aW9uIG8obix0KXt2YXIgZT11KG4sMSkscj11KHQsMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT90WzFdLW5bMV06MT09PWU/blswXS10WzBdOjI9PT1lP25bMV0tdFsxXTp0WzBdLW5bMF19cmV0dXJuIGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMobil7Zm9yKHZhciB0PTAsZT1kLmxlbmd0aCxyPW5bMV0sdT0wO2U+dTsrK3UpZm9yKHZhciBpLG89MSxhPWRbdV0sYz1hLmxlbmd0aCxsPWFbMF07Yz5vOysrbylpPWFbb10sbFsxXTw9cj9pWzFdPnImJlEobCxpLG4pPjAmJisrdDppWzFdPD1yJiZRKGwsaSxuKTwwJiYtLXQsbD1pO3JldHVybiAwIT09dH1mdW5jdGlvbiBsKGksYSxjLGwpe3ZhciBzPTAsZj0wO2lmKG51bGw9PWl8fChzPXUoaSxjKSkhPT0oZj11KGEsYykpfHxvKGksYSk8MF5jPjApe2RvIGwucG9pbnQoMD09PXN8fDM9PT1zP246ZSxzPjE/cjp0KTt3aGlsZSgocz0ocytjKzQpJTQpIT09Zil9ZWxzZSBsLnBvaW50KGFbMF0sYVsxXSl9ZnVuY3Rpb24gcyh1LGkpe3JldHVybiB1Pj1uJiZlPj11JiZpPj10JiZyPj1pfWZ1bmN0aW9uIGYobix0KXtzKG4sdCkmJmEucG9pbnQobix0KX1mdW5jdGlvbiBoKCl7Qy5wb2ludD1wLGQmJmQucHVzaChtPVtdKSxTPSEwLHc9ITEsYj1fPTAvMH1mdW5jdGlvbiBnKCl7diYmKHAoeSxNKSx4JiZ3JiZBLnJlam9pbigpLHYucHVzaChBLmJ1ZmZlcigpKSksQy5wb2ludD1mLHcmJmEubGluZUVuZCgpfWZ1bmN0aW9uIHAobix0KXtuPU1hdGgubWF4KC1UYyxNYXRoLm1pbihUYyxuKSksdD1NYXRoLm1heCgtVGMsTWF0aC5taW4oVGMsdCkpO3ZhciBlPXMobix0KTtpZihkJiZtLnB1c2goW24sdF0pLFMpeT1uLE09dCx4PWUsUz0hMSxlJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCkpO2Vsc2UgaWYoZSYmdylhLnBvaW50KG4sdCk7ZWxzZXt2YXIgcj17YTp7eDpiLHk6X30sYjp7eDpuLHk6dH19O04ocik/KHd8fChhLmxpbmVTdGFydCgpLGEucG9pbnQoci5hLngsci5hLnkpKSxhLnBvaW50KHIuYi54LHIuYi55KSxlfHxhLmxpbmVFbmQoKSxrPSExKTplJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCksaz0hMSl9Yj1uLF89dCx3PWV9dmFyIHYsZCxtLHksTSx4LGIsXyx3LFMsayxFPWEsQT1SZSgpLE49T2Uobix0LGUsciksQz17cG9pbnQ6ZixsaW5lU3RhcnQ6aCxsaW5lRW5kOmcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YT1BLHY9W10sZD1bXSxrPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7YT1FLHY9dGEubWVyZ2Uodik7dmFyIHQ9YyhbbixyXSksZT1rJiZ0LHU9di5sZW5ndGg7KGV8fHUpJiYoYS5wb2x5Z29uU3RhcnQoKSxlJiYoYS5saW5lU3RhcnQoKSxsKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSx1JiZDZSh2LGksdCxsLGEpLGEucG9seWdvbkVuZCgpKSx2PWQ9bT1udWxsfX07cmV0dXJuIEN9fWZ1bmN0aW9uIFllKG4pe3ZhciB0PTAsZT1xYS8zLHI9aXIobiksdT1yKHQsZSk7cmV0dXJuIHUucGFyYWxsZWxzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3IodD1uWzBdKnFhLzE4MCxlPW5bMV0qcWEvMTgwKTpbdC9xYSoxODAsZS9xYSoxODBdfSx1fWZ1bmN0aW9uIFplKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguc3FydChpLTIqdSpNYXRoLnNpbih0KSkvdTtyZXR1cm5bZSpNYXRoLnNpbihuKj11KSxvLWUqTWF0aC5jb3MobildfXZhciByPU1hdGguc2luKG4pLHU9KHIrTWF0aC5zaW4odCkpLzIsaT0xK3IqKDIqdS1yKSxvPU1hdGguc3FydChpKS91O3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsdHQoKGktKG4qbitlKmUpKnUqdSkvKDIqdSkpXX0sZX1mdW5jdGlvbiBWZSgpe2Z1bmN0aW9uIG4obix0KXtEYys9dSpuLXIqdCxyPW4sdT10fXZhciB0LGUscix1O0hjLnBvaW50PWZ1bmN0aW9uKGksbyl7SGMucG9pbnQ9bix0PXI9aSxlPXU9b30sSGMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gWGUobix0KXtQYz5uJiYoUGM9biksbj5qYyYmKGpjPW4pLFVjPnQmJihVYz10KSx0PkZjJiYoRmM9dCl9ZnVuY3Rpb24gJGUoKXtmdW5jdGlvbiBuKG4sdCl7by5wdXNoKCJNIixuLCIsIix0LGkpfWZ1bmN0aW9uIHQobix0KXtvLnB1c2goIk0iLG4sIiwiLHQpLGEucG9pbnQ9ZX1mdW5jdGlvbiBlKG4sdCl7by5wdXNoKCJMIixuLCIsIix0KX1mdW5jdGlvbiByKCl7YS5wb2ludD1ufWZ1bmN0aW9uIHUoKXtvLnB1c2goIloiKX12YXIgaT1CZSg0LjUpLG89W10sYT17cG9pbnQ6bixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXthLnBvaW50PXR9LGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2EubGluZUVuZD1yLGEucG9pbnQ9bn0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGk9QmUobiksYX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYoby5sZW5ndGgpe3ZhciBuPW8uam9pbigiIik7cmV0dXJuIG89W10sbn19fTtyZXR1cm4gYX1mdW5jdGlvbiBCZShuKXtyZXR1cm4ibTAsIituKyJhIituKyIsIituKyIgMCAxLDEgMCwiKy0yKm4rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrMipuKyJ6In1mdW5jdGlvbiBXZShuLHQpe19jKz1uLHdjKz10LCsrU2N9ZnVuY3Rpb24gSmUoKXtmdW5jdGlvbiBuKG4scil7dmFyIHU9bi10LGk9ci1lLG89TWF0aC5zcXJ0KHUqdStpKmkpO2tjKz1vKih0K24pLzIsRWMrPW8qKGUrcikvMixBYys9byxXZSh0PW4sZT1yKX12YXIgdCxlO0ljLnBvaW50PWZ1bmN0aW9uKHIsdSl7SWMucG9pbnQ9bixXZSh0PXIsZT11KX19ZnVuY3Rpb24gR2UoKXtJYy5wb2ludD1XZX1mdW5jdGlvbiBLZSgpe2Z1bmN0aW9uIG4obix0KXt2YXIgZT1uLXIsaT10LXUsbz1NYXRoLnNxcnQoZSplK2kqaSk7a2MrPW8qKHIrbikvMixFYys9byoodSt0KS8yLEFjKz1vLG89dSpuLXIqdCxOYys9byoocituKSxDYys9byoodSt0KSx6Yys9MypvLFdlKHI9bix1PXQpfXZhciB0LGUscix1O0ljLnBvaW50PWZ1bmN0aW9uKGksbyl7SWMucG9pbnQ9bixXZSh0PXI9aSxlPXU9byl9LEljLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIFFlKG4pe2Z1bmN0aW9uIHQodCxlKXtuLm1vdmVUbyh0K28sZSksbi5hcmModCxlLG8sMCxMYSl9ZnVuY3Rpb24gZSh0LGUpe24ubW92ZVRvKHQsZSksYS5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtuLmxpbmVUbyh0LGUpfWZ1bmN0aW9uIHUoKXthLnBvaW50PXR9ZnVuY3Rpb24gaSgpe24uY2xvc2VQYXRoKCl9dmFyIG89NC41LGE9e3BvaW50OnQsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7YS5wb2ludD1lfSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YS5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dSxhLnBvaW50PXR9LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiBvPW4sYX0scmVzdWx0OmJ9O3JldHVybiBhfWZ1bmN0aW9uIG5yKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuKGE/cjplKShuKX1mdW5jdGlvbiBlKHQpe3JldHVybiBycih0LGZ1bmN0aW9uKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfSl9ZnVuY3Rpb24gcih0KXtmdW5jdGlvbiBlKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHIoKXtNPTAvMCxTLnBvaW50PWksdC5saW5lU3RhcnQoKX1mdW5jdGlvbiBpKGUscil7dmFyIGk9cGUoW2Uscl0pLG89bihlLHIpO3UoTSx4LHksYixfLHcsTT1vWzBdLHg9b1sxXSx5PWUsYj1pWzBdLF89aVsxXSx3PWlbMl0sYSx0KSx0LnBvaW50KE0seCl9ZnVuY3Rpb24gbygpe1MucG9pbnQ9ZSx0LmxpbmVFbmQoKX1mdW5jdGlvbiBjKCl7cigpLFMucG9pbnQ9bCxTLmxpbmVFbmQ9c31mdW5jdGlvbiBsKG4sdCl7aShmPW4saD10KSxnPU0scD14LHY9YixkPV8sbT13LFMucG9pbnQ9aX1mdW5jdGlvbiBzKCl7dShNLHgseSxiLF8sdyxnLHAsZix2LGQsbSxhLHQpLFMubGluZUVuZD1vLG8oKX12YXIgZixoLGcscCx2LGQsbSx5LE0seCxiLF8sdyxTPXtwb2ludDplLGxpbmVTdGFydDpyLGxpbmVFbmQ6byxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLFMubGluZVN0YXJ0PWMKfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksUy5saW5lU3RhcnQ9cn19O3JldHVybiBTfWZ1bmN0aW9uIHUodCxlLHIsYSxjLGwscyxmLGgsZyxwLHYsZCxtKXt2YXIgeT1zLXQsTT1mLWUseD15KnkrTSpNO2lmKHg+NCppJiZkLS0pe3ZhciBiPWErZyxfPWMrcCx3PWwrdixTPU1hdGguc3FydChiKmIrXypfK3cqdyksaz1NYXRoLmFzaW4ody89UyksRT1nYShnYSh3KS0xKTxDYXx8Z2Eoci1oKTxDYT8ocitoKS8yOk1hdGguYXRhbjIoXyxiKSxBPW4oRSxrKSxOPUFbMF0sQz1BWzFdLHo9Ti10LHE9Qy1lLEw9TSp6LXkqcTsoTCpML3g+aXx8Z2EoKHkqeitNKnEpL3gtLjUpPi4zfHxvPmEqZytjKnArbCp2KSYmKHUodCxlLHIsYSxjLGwsTixDLEUsYi89UyxfLz1TLHcsZCxtKSxtLnBvaW50KE4sQyksdShOLEMsRSxiLF8sdyxzLGYsaCxnLHAsdixkLG0pKX19dmFyIGk9LjUsbz1NYXRoLmNvcygzMCpEYSksYT0xNjtyZXR1cm4gdC5wcmVjaXNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9KGk9bipuKT4wJiYxNix0KTpNYXRoLnNxcnQoaSl9LHR9ZnVuY3Rpb24gdHIobil7dmFyIHQ9bnIoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihbdCpQYSxlKlBhXSl9KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG9yKHQobikpfX1mdW5jdGlvbiBlcihuKXt0aGlzLnN0cmVhbT1ufWZ1bmN0aW9uIHJyKG4sdCl7cmV0dXJue3BvaW50OnQsc3BoZXJlOmZ1bmN0aW9uKCl7bi5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCl9fX1mdW5jdGlvbiB1cihuKXtyZXR1cm4gaXIoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKCl9ZnVuY3Rpb24gaXIobil7ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj1hKG5bMF0qRGEsblsxXSpEYSksW25bMF0qaCtjLGwtblsxXSpoXX1mdW5jdGlvbiBlKG4pe3JldHVybiBuPWEuaW52ZXJ0KChuWzBdLWMpL2gsKGwtblsxXSkvaCksbiYmW25bMF0qUGEsblsxXSpQYV19ZnVuY3Rpb24gcigpe2E9QWUobz1scihtLE0seCksaSk7dmFyIG49aSh2LGQpO3JldHVybiBjPWctblswXSpoLGw9cCtuWzFdKmgsdSgpfWZ1bmN0aW9uIHUoKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEscz1udWxsKSx0fXZhciBpLG8sYSxjLGwscyxmPW5yKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49aShuLHQpLFtuWzBdKmgrYyxsLW5bMV0qaF19KSxoPTE1MCxnPTQ4MCxwPTI1MCx2PTAsZD0wLG09MCxNPTAseD0wLGI9TGMsXz15LHc9bnVsbCxTPW51bGw7cmV0dXJuIHQuc3RyZWFtPWZ1bmN0aW9uKG4pe3JldHVybiBzJiYocy52YWxpZD0hMSkscz1vcihiKG8sZihfKG4pKSkpLHMudmFsaWQ9ITAsc30sdC5jbGlwQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9bnVsbD09bj8odz1uLExjKTpIZSgodz0rbikqRGEpLHUoKSk6d30sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPW4sXz1uP0llKG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pOnksdSgpKTpTfSx0LnNjYWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPStuLHIoKSk6aH0sdC50cmFuc2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9K25bMF0scD0rblsxXSxyKCkpOltnLHBdfSx0LmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1uWzBdJTM2MCpEYSxkPW5bMV0lMzYwKkRhLHIoKSk6W3YqUGEsZCpQYV19LHQucm90YXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW5bMF0lMzYwKkRhLE09blsxXSUzNjAqRGEseD1uLmxlbmd0aD4yP25bMl0lMzYwKkRhOjAscigpKTpbbSpQYSxNKlBhLHgqUGFdfSx0YS5yZWJpbmQodCxmLCJwcmVjaXNpb24iKSxmdW5jdGlvbigpe3JldHVybiBpPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuaW52ZXJ0PWkuaW52ZXJ0JiZlLHIoKX19ZnVuY3Rpb24gb3Iobil7cmV0dXJuIHJyKG4sZnVuY3Rpb24odCxlKXtuLnBvaW50KHQqRGEsZSpEYSl9KX1mdW5jdGlvbiBhcihuLHQpe3JldHVybltuLHRdfWZ1bmN0aW9uIGNyKG4sdCl7cmV0dXJuW24+cWE/bi1MYTotcWE+bj9uK0xhOm4sdF19ZnVuY3Rpb24gbHIobix0LGUpe3JldHVybiBuP3R8fGU/QWUoZnIobiksaHIodCxlKSk6ZnIobik6dHx8ZT9ocih0LGUpOmNyfWZ1bmN0aW9uIHNyKG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0Kz1uLFt0PnFhP3QtTGE6LXFhPnQ/dCtMYTp0LGVdfX1mdW5jdGlvbiBmcihuKXt2YXIgdD1zcihuKTtyZXR1cm4gdC5pbnZlcnQ9c3IoLW4pLHR9ZnVuY3Rpb24gaHIobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksYT1NYXRoLmNvcyhuKSplLGM9TWF0aC5zaW4obikqZSxsPU1hdGguc2luKHQpLHM9bCpyK2EqdTtyZXR1cm5bTWF0aC5hdGFuMihjKmktcypvLGEqci1sKnUpLHR0KHMqaStjKm8pXX12YXIgcj1NYXRoLmNvcyhuKSx1PU1hdGguc2luKG4pLGk9TWF0aC5jb3ModCksbz1NYXRoLnNpbih0KTtyZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1NYXRoLmNvcyh0KSxhPU1hdGguY29zKG4pKmUsYz1NYXRoLnNpbihuKSplLGw9TWF0aC5zaW4odCkscz1sKmktYypvO3JldHVybltNYXRoLmF0YW4yKGMqaStsKm8sYSpyK3MqdSksdHQocypyLWEqdSldfSxlfWZ1bmN0aW9uIGdyKG4sdCl7dmFyIGU9TWF0aC5jb3Mobikscj1NYXRoLnNpbihuKTtyZXR1cm4gZnVuY3Rpb24odSxpLG8sYSl7dmFyIGM9byp0O251bGwhPXU/KHU9cHIoZSx1KSxpPXByKGUsaSksKG8+MD9pPnU6dT5pKSYmKHUrPW8qTGEpKToodT1uK28qTGEsaT1uLS41KmMpO2Zvcih2YXIgbCxzPXU7bz4wP3M+aTppPnM7cy09YylhLnBvaW50KChsPXhlKFtlLC1yKk1hdGguY29zKHMpLC1yKk1hdGguc2luKHMpXSkpWzBdLGxbMV0pfX1mdW5jdGlvbiBwcihuLHQpe3ZhciBlPXBlKHQpO2VbMF0tPW4sTWUoZSk7dmFyIHI9bnQoLWVbMV0pO3JldHVybigoLWVbMl08MD8tcjpyKSsyKk1hdGguUEktQ2EpJSgyKk1hdGguUEkpfWZ1bmN0aW9uIHZyKG4sdCxlKXt2YXIgcj10YS5yYW5nZShuLHQtQ2EsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW24sdF19KX19ZnVuY3Rpb24gZHIobix0LGUpe3ZhciByPXRhLnJhbmdlKG4sdC1DYSxlKS5jb25jYXQodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiByLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bdCxuXX0pfX1mdW5jdGlvbiBtcihuKXtyZXR1cm4gbi5zb3VyY2V9ZnVuY3Rpb24geXIobil7cmV0dXJuIG4udGFyZ2V0fWZ1bmN0aW9uIE1yKG4sdCxlLHIpe3ZhciB1PU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCksbz1NYXRoLmNvcyhyKSxhPU1hdGguc2luKHIpLGM9dSpNYXRoLmNvcyhuKSxsPXUqTWF0aC5zaW4obikscz1vKk1hdGguY29zKGUpLGY9bypNYXRoLnNpbihlKSxoPTIqTWF0aC5hc2luKE1hdGguc3FydChpdChyLXQpK3UqbyppdChlLW4pKSksZz0xL01hdGguc2luKGgpLHA9aD9mdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNpbihuKj1oKSpnLGU9TWF0aC5zaW4oaC1uKSpnLHI9ZSpjK3Qqcyx1PWUqbCt0KmYsbz1lKmkrdCphO3JldHVybltNYXRoLmF0YW4yKHUscikqUGEsTWF0aC5hdGFuMihvLE1hdGguc3FydChyKnIrdSp1KSkqUGFdfTpmdW5jdGlvbigpe3JldHVybltuKlBhLHQqUGFdfTtyZXR1cm4gcC5kaXN0YW5jZT1oLHB9ZnVuY3Rpb24geHIoKXtmdW5jdGlvbiBuKG4sdSl7dmFyIGk9TWF0aC5zaW4odSo9RGEpLG89TWF0aC5jb3ModSksYT1nYSgobio9RGEpLXQpLGM9TWF0aC5jb3MoYSk7WWMrPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChhPW8qTWF0aC5zaW4oYSkpKmErKGE9cippLWUqbypjKSphKSxlKmkrcipvKmMpLHQ9bixlPWkscj1vfXZhciB0LGUscjtaYy5wb2ludD1mdW5jdGlvbih1LGkpe3Q9dSpEYSxlPU1hdGguc2luKGkqPURhKSxyPU1hdGguY29zKGkpLFpjLnBvaW50PW59LFpjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtaYy5wb2ludD1aYy5saW5lRW5kPWJ9fWZ1bmN0aW9uIGJyKG4sdCl7ZnVuY3Rpb24gZSh0LGUpe3ZhciByPU1hdGguY29zKHQpLHU9TWF0aC5jb3MoZSksaT1uKHIqdSk7cmV0dXJuW2kqdSpNYXRoLnNpbih0KSxpKk1hdGguc2luKGUpXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obixlKXt2YXIgcj1NYXRoLnNxcnQobipuK2UqZSksdT10KHIpLGk9TWF0aC5zaW4odSksbz1NYXRoLmNvcyh1KTtyZXR1cm5bTWF0aC5hdGFuMihuKmkscipvKSxNYXRoLmFzaW4ociYmZSppL3IpXX0sZX1mdW5jdGlvbiBfcihuLHQpe2Z1bmN0aW9uIGUobix0KXtvPjA/LVJhK0NhPnQmJih0PS1SYStDYSk6dD5SYS1DYSYmKHQ9UmEtQ2EpO3ZhciBlPW8vTWF0aC5wb3codSh0KSxpKTtyZXR1cm5bZSpNYXRoLnNpbihpKm4pLG8tZSpNYXRoLmNvcyhpKm4pXX12YXIgcj1NYXRoLmNvcyhuKSx1PWZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnRhbihxYS80K24vMil9LGk9bj09PXQ/TWF0aC5zaW4obik6TWF0aC5sb2coci9NYXRoLmNvcyh0KSkvTWF0aC5sb2codSh0KS91KG4pKSxvPXIqTWF0aC5wb3codShuKSxpKS9pO3JldHVybiBpPyhlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdCxyPUsoaSkqTWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybltNYXRoLmF0YW4yKG4sZSkvaSwyKk1hdGguYXRhbihNYXRoLnBvdyhvL3IsMS9pKSktUmFdfSxlKTpTcn1mdW5jdGlvbiB3cihuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1pLXQ7cmV0dXJuW2UqTWF0aC5zaW4odSpuKSxpLWUqTWF0aC5jb3ModSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1uPT09dD9NYXRoLnNpbihuKTooci1NYXRoLmNvcyh0KSkvKHQtbiksaT1yL3UrbjtyZXR1cm4gZ2EodSk8Q2E/YXI6KGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9aS10O3JldHVybltNYXRoLmF0YW4yKG4sZSkvdSxpLUsodSkqTWF0aC5zcXJ0KG4qbitlKmUpXX0sZSl9ZnVuY3Rpb24gU3Iobix0KXtyZXR1cm5bbixNYXRoLmxvZyhNYXRoLnRhbihxYS80K3QvMikpXX1mdW5jdGlvbiBrcihuKXt2YXIgdCxlPXVyKG4pLHI9ZS5zY2FsZSx1PWUudHJhbnNsYXRlLGk9ZS5jbGlwRXh0ZW50O3JldHVybiBlLnNjYWxlPWZ1bmN0aW9uKCl7dmFyIG49ci5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS50cmFuc2xhdGU9ZnVuY3Rpb24oKXt2YXIgbj11LmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gbj09PWU/dD9lLmNsaXBFeHRlbnQobnVsbCk6ZTpufSxlLmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7dmFyIG89aS5hcHBseShlLGFyZ3VtZW50cyk7aWYobz09PWUpe2lmKHQ9bnVsbD09bil7dmFyIGE9cWEqcigpLGM9dSgpO2koW1tjWzBdLWEsY1sxXS1hXSxbY1swXSthLGNbMV0rYV1dKX19ZWxzZSB0JiYobz1udWxsKTtyZXR1cm4gb30sZS5jbGlwRXh0ZW50KG51bGwpfWZ1bmN0aW9uIEVyKG4sdCl7cmV0dXJuW01hdGgubG9nKE1hdGgudGFuKHFhLzQrdC8yKSksLW5dfWZ1bmN0aW9uIEFyKG4pe3JldHVybiBuWzBdfWZ1bmN0aW9uIE5yKG4pe3JldHVybiBuWzFdfWZ1bmN0aW9uIENyKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPVswLDFdLHI9Mix1PTI7dD51O3UrKyl7Zm9yKDtyPjEmJlEobltlW3ItMl1dLG5bZVtyLTFdXSxuW3VdKTw9MDspLS1yO2VbcisrXT11fXJldHVybiBlLnNsaWNlKDAscil9ZnVuY3Rpb24genIobix0KXtyZXR1cm4gblswXS10WzBdfHxuWzFdLXRbMV19ZnVuY3Rpb24gcXIobix0LGUpe3JldHVybihlWzBdLXRbMF0pKihuWzFdLXRbMV0pPChlWzFdLXRbMV0pKihuWzBdLXRbMF0pfWZ1bmN0aW9uIExyKG4sdCxlLHIpe3ZhciB1PW5bMF0saT1lWzBdLG89dFswXS11LGE9clswXS1pLGM9blsxXSxsPWVbMV0scz10WzFdLWMsZj1yWzFdLWwsaD0oYSooYy1sKS1mKih1LWkpKS8oZipvLWEqcyk7cmV0dXJuW3UraCpvLGMraCpzXX1mdW5jdGlvbiBUcihuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4hKHRbMF0tZVswXXx8dFsxXS1lWzFdKX1mdW5jdGlvbiBScigpe3R1KHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBEcihuKXt2YXIgdD1lbC5wb3AoKXx8bmV3IFJyO3JldHVybiB0LnNpdGU9bix0fWZ1bmN0aW9uIFByKG4pe1hyKG4pLFFjLnJlbW92ZShuKSxlbC5wdXNoKG4pLHR1KG4pfWZ1bmN0aW9uIFVyKG4pe3ZhciB0PW4uY2lyY2xlLGU9dC54LHI9dC5jeSx1PXt4OmUseTpyfSxpPW4uUCxvPW4uTixhPVtuXTtQcihuKTtmb3IodmFyIGM9aTtjLmNpcmNsZSYmZ2EoZS1jLmNpcmNsZS54KTxDYSYmZ2Eoci1jLmNpcmNsZS5jeSk8Q2E7KWk9Yy5QLGEudW5zaGlmdChjKSxQcihjKSxjPWk7YS51bnNoaWZ0KGMpLFhyKGMpO2Zvcih2YXIgbD1vO2wuY2lyY2xlJiZnYShlLWwuY2lyY2xlLngpPENhJiZnYShyLWwuY2lyY2xlLmN5KTxDYTspbz1sLk4sYS5wdXNoKGwpLFByKGwpLGw9bzthLnB1c2gobCksWHIobCk7dmFyIHMsZj1hLmxlbmd0aDtmb3Iocz0xO2Y+czsrK3MpbD1hW3NdLGM9YVtzLTFdLEtyKGwuZWRnZSxjLnNpdGUsbC5zaXRlLHUpO2M9YVswXSxsPWFbZi0xXSxsLmVkZ2U9SnIoYy5zaXRlLGwuc2l0ZSxudWxsLHUpLFZyKGMpLFZyKGwpfWZ1bmN0aW9uIGpyKG4pe2Zvcih2YXIgdCxlLHIsdSxpPW4ueCxvPW4ueSxhPVFjLl87YTspaWYocj1GcihhLG8pLWkscj5DYSlhPWEuTDtlbHNle2lmKHU9aS1IcihhLG8pLCEodT5DYSkpe3I+LUNhPyh0PWEuUCxlPWEpOnU+LUNhPyh0PWEsZT1hLk4pOnQ9ZT1hO2JyZWFrfWlmKCFhLlIpe3Q9YTticmVha31hPWEuUn12YXIgYz1EcihuKTtpZihRYy5pbnNlcnQodCxjKSx0fHxlKXtpZih0PT09ZSlyZXR1cm4gWHIodCksZT1Ecih0LnNpdGUpLFFjLmluc2VydChjLGUpLGMuZWRnZT1lLmVkZ2U9SnIodC5zaXRlLGMuc2l0ZSksVnIodCksdm9pZCBWcihlKTtpZighZSlyZXR1cm4gdm9pZChjLmVkZ2U9SnIodC5zaXRlLGMuc2l0ZSkpO1hyKHQpLFhyKGUpO3ZhciBsPXQuc2l0ZSxzPWwueCxmPWwueSxoPW4ueC1zLGc9bi55LWYscD1lLnNpdGUsdj1wLngtcyxkPXAueS1mLG09MiooaCpkLWcqdikseT1oKmgrZypnLE09dip2K2QqZCx4PXt4OihkKnktZypNKS9tK3MseTooaCpNLXYqeSkvbStmfTtLcihlLmVkZ2UsbCxwLHgpLGMuZWRnZT1KcihsLG4sbnVsbCx4KSxlLmVkZ2U9SnIobixwLG51bGwseCksVnIodCksVnIoZSl9fWZ1bmN0aW9uIEZyKG4sdCl7dmFyIGU9bi5zaXRlLHI9ZS54LHU9ZS55LGk9dS10O2lmKCFpKXJldHVybiByO3ZhciBvPW4uUDtpZighbylyZXR1cm4tMS8wO2U9by5zaXRlO3ZhciBhPWUueCxjPWUueSxsPWMtdDtpZighbClyZXR1cm4gYTt2YXIgcz1hLXIsZj0xL2ktMS9sLGg9cy9sO3JldHVybiBmPygtaCtNYXRoLnNxcnQoaCpoLTIqZioocypzLygtMipsKS1jK2wvMit1LWkvMikpKS9mK3I6KHIrYSkvMn1mdW5jdGlvbiBIcihuLHQpe3ZhciBlPW4uTjtpZihlKXJldHVybiBGcihlLHQpO3ZhciByPW4uc2l0ZTtyZXR1cm4gci55PT09dD9yLng6MS8wfWZ1bmN0aW9uIE9yKG4pe3RoaXMuc2l0ZT1uLHRoaXMuZWRnZXM9W119ZnVuY3Rpb24gSXIobil7Zm9yKHZhciB0LGUscix1LGksbyxhLGMsbCxzLGY9blswXVswXSxoPW5bMV1bMF0sZz1uWzBdWzFdLHA9blsxXVsxXSx2PUtjLGQ9di5sZW5ndGg7ZC0tOylpZihpPXZbZF0saSYmaS5wcmVwYXJlKCkpZm9yKGE9aS5lZGdlcyxjPWEubGVuZ3RoLG89MDtjPm87KXM9YVtvXS5lbmQoKSxyPXMueCx1PXMueSxsPWFbKytvJWNdLnN0YXJ0KCksdD1sLngsZT1sLnksKGdhKHItdCk+Q2F8fGdhKHUtZSk+Q2EpJiYoYS5zcGxpY2UobywwLG5ldyBRcihHcihpLnNpdGUscyxnYShyLWYpPENhJiZwLXU+Q2E/e3g6Zix5OmdhKHQtZik8Q2E/ZTpwfTpnYSh1LXApPENhJiZoLXI+Q2E/e3g6Z2EoZS1wKTxDYT90OmgseTpwfTpnYShyLWgpPENhJiZ1LWc+Q2E/e3g6aCx5OmdhKHQtaCk8Q2E/ZTpnfTpnYSh1LWcpPENhJiZyLWY+Q2E/e3g6Z2EoZS1nKTxDYT90OmYseTpnfTpudWxsKSxpLnNpdGUsbnVsbCkpLCsrYyl9ZnVuY3Rpb24gWXIobix0KXtyZXR1cm4gdC5hbmdsZS1uLmFuZ2xlfWZ1bmN0aW9uIFpyKCl7dHUodGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFZyKG4pe3ZhciB0PW4uUCxlPW4uTjtpZih0JiZlKXt2YXIgcj10LnNpdGUsdT1uLnNpdGUsaT1lLnNpdGU7aWYociE9PWkpe3ZhciBvPXUueCxhPXUueSxjPXIueC1vLGw9ci55LWEscz1pLngtbyxmPWkueS1hLGg9MiooYypmLWwqcyk7aWYoIShoPj0temEpKXt2YXIgZz1jKmMrbCpsLHA9cypzK2YqZix2PShmKmctbCpwKS9oLGQ9KGMqcC1zKmcpL2gsZj1kK2EsbT1ybC5wb3AoKXx8bmV3IFpyO20uYXJjPW4sbS5zaXRlPXUsbS54PXYrbyxtLnk9ZitNYXRoLnNxcnQodip2K2QqZCksbS5jeT1mLG4uY2lyY2xlPW07Zm9yKHZhciB5PW51bGwsTT10bC5fO007KWlmKG0ueTxNLnl8fG0ueT09PU0ueSYmbS54PD1NLngpe2lmKCFNLkwpe3k9TS5QO2JyZWFrfU09TS5MfWVsc2V7aWYoIU0uUil7eT1NO2JyZWFrfU09TS5SfXRsLmluc2VydCh5LG0pLHl8fChubD1tKX19fX1mdW5jdGlvbiBYcihuKXt2YXIgdD1uLmNpcmNsZTt0JiYodC5QfHwobmw9dC5OKSx0bC5yZW1vdmUodCkscmwucHVzaCh0KSx0dSh0KSxuLmNpcmNsZT1udWxsKX1mdW5jdGlvbiAkcihuKXtmb3IodmFyIHQsZT1HYyxyPU9lKG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pLHU9ZS5sZW5ndGg7dS0tOyl0PWVbdV0sKCFCcih0LG4pfHwhcih0KXx8Z2EodC5hLngtdC5iLngpPENhJiZnYSh0LmEueS10LmIueSk8Q2EpJiYodC5hPXQuYj1udWxsLGUuc3BsaWNlKHUsMSkpfWZ1bmN0aW9uIEJyKG4sdCl7dmFyIGU9bi5iO2lmKGUpcmV0dXJuITA7dmFyIHIsdSxpPW4uYSxvPXRbMF1bMF0sYT10WzFdWzBdLGM9dFswXVsxXSxsPXRbMV1bMV0scz1uLmwsZj1uLnIsaD1zLngsZz1zLnkscD1mLngsdj1mLnksZD0oaCtwKS8yLG09KGcrdikvMjtpZih2PT09Zyl7aWYobz5kfHxkPj1hKXJldHVybjtpZihoPnApe2lmKGkpe2lmKGkueT49bClyZXR1cm59ZWxzZSBpPXt4OmQseTpjfTtlPXt4OmQseTpsfX1lbHNle2lmKGkpe2lmKGkueTxjKXJldHVybn1lbHNlIGk9e3g6ZCx5Omx9O2U9e3g6ZCx5OmN9fX1lbHNlIGlmKHI9KGgtcCkvKHYtZyksdT1tLXIqZCwtMT5yfHxyPjEpaWYoaD5wKXtpZihpKXtpZihpLnk+PWwpcmV0dXJufWVsc2UgaT17eDooYy11KS9yLHk6Y307ZT17eDoobC11KS9yLHk6bH19ZWxzZXtpZihpKXtpZihpLnk8YylyZXR1cm59ZWxzZSBpPXt4OihsLXUpL3IseTpsfTtlPXt4OihjLXUpL3IseTpjfX1lbHNlIGlmKHY+Zyl7aWYoaSl7aWYoaS54Pj1hKXJldHVybn1lbHNlIGk9e3g6byx5OnIqbyt1fTtlPXt4OmEseTpyKmErdX19ZWxzZXtpZihpKXtpZihpLng8bylyZXR1cm59ZWxzZSBpPXt4OmEseTpyKmErdX07ZT17eDpvLHk6cipvK3V9fXJldHVybiBuLmE9aSxuLmI9ZSwhMH1mdW5jdGlvbiBXcihuLHQpe3RoaXMubD1uLHRoaXMucj10LHRoaXMuYT10aGlzLmI9bnVsbH1mdW5jdGlvbiBKcihuLHQsZSxyKXt2YXIgdT1uZXcgV3Iobix0KTtyZXR1cm4gR2MucHVzaCh1KSxlJiZLcih1LG4sdCxlKSxyJiZLcih1LHQsbixyKSxLY1tuLmldLmVkZ2VzLnB1c2gobmV3IFFyKHUsbix0KSksS2NbdC5pXS5lZGdlcy5wdXNoKG5ldyBRcih1LHQsbikpLHV9ZnVuY3Rpb24gR3Iobix0LGUpe3ZhciByPW5ldyBXcihuLG51bGwpO3JldHVybiByLmE9dCxyLmI9ZSxHYy5wdXNoKHIpLHJ9ZnVuY3Rpb24gS3Iobix0LGUscil7bi5hfHxuLmI/bi5sPT09ZT9uLmI9cjpuLmE9cjoobi5hPXIsbi5sPXQsbi5yPWUpfWZ1bmN0aW9uIFFyKG4sdCxlKXt2YXIgcj1uLmEsdT1uLmI7dGhpcy5lZGdlPW4sdGhpcy5zaXRlPXQsdGhpcy5hbmdsZT1lP01hdGguYXRhbjIoZS55LXQueSxlLngtdC54KTpuLmw9PT10P01hdGguYXRhbjIodS54LXIueCxyLnktdS55KTpNYXRoLmF0YW4yKHIueC11LngsdS55LXIueSl9ZnVuY3Rpb24gbnUoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiB0dShuKXtuLlU9bi5DPW4uTD1uLlI9bi5QPW4uTj1udWxsfWZ1bmN0aW9uIGV1KG4sdCl7dmFyIGU9dCxyPXQuUix1PWUuVTt1P3UuTD09PWU/dS5MPXI6dS5SPXI6bi5fPXIsci5VPXUsZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBydShuLHQpe3ZhciBlPXQscj10LkwsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gdXUobil7Zm9yKDtuLkw7KW49bi5MO3JldHVybiBufWZ1bmN0aW9uIGl1KG4sdCl7dmFyIGUscix1LGk9bi5zb3J0KG91KS5wb3AoKTtmb3IoR2M9W10sS2M9bmV3IEFycmF5KG4ubGVuZ3RoKSxRYz1uZXcgbnUsdGw9bmV3IG51OzspaWYodT1ubCxpJiYoIXV8fGkueTx1Lnl8fGkueT09PXUueSYmaS54PHUueCkpKGkueCE9PWV8fGkueSE9PXIpJiYoS2NbaS5pXT1uZXcgT3IoaSksanIoaSksZT1pLngscj1pLnkpLGk9bi5wb3AoKTtlbHNle2lmKCF1KWJyZWFrO1VyKHUuYXJjKX10JiYoJHIodCksSXIodCkpO3ZhciBvPXtjZWxsczpLYyxlZGdlczpHY307cmV0dXJuIFFjPXRsPUdjPUtjPW51bGwsb31mdW5jdGlvbiBvdShuLHQpe3JldHVybiB0Lnktbi55fHx0Lngtbi54fWZ1bmN0aW9uIGF1KG4sdCxlKXtyZXR1cm4obi54LWUueCkqKHQueS1uLnkpLShuLngtdC54KSooZS55LW4ueSl9ZnVuY3Rpb24gY3Uobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBsdShuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIHN1KCl7cmV0dXJue2xlYWY6ITAsbm9kZXM6W10scG9pbnQ6bnVsbCx4Om51bGwseTpudWxsfX1mdW5jdGlvbiBmdShuLHQsZSxyLHUsaSl7aWYoIW4odCxlLHIsdSxpKSl7dmFyIG89LjUqKGUrdSksYT0uNSoocitpKSxjPXQubm9kZXM7Y1swXSYmZnUobixjWzBdLGUscixvLGEpLGNbMV0mJmZ1KG4sY1sxXSxvLHIsdSxhKSxjWzJdJiZmdShuLGNbMl0sZSxhLG8saSksY1szXSYmZnUobixjWzNdLG8sYSx1LGkpfX1mdW5jdGlvbiBodShuLHQsZSxyLHUsaSxvKXt2YXIgYSxjPTEvMDtyZXR1cm4gZnVuY3Rpb24gbChuLHMsZixoLGcpe2lmKCEocz5pfHxmPm98fHI+aHx8dT5nKSl7aWYocD1uLnBvaW50KXt2YXIgcCx2PXQtbi54LGQ9ZS1uLnksbT12KnYrZCpkO2lmKGM+bSl7dmFyIHk9TWF0aC5zcXJ0KGM9bSk7cj10LXksdT1lLXksaT10K3ksbz1lK3ksYT1wfX1mb3IodmFyIE09bi5ub2Rlcyx4PS41KihzK2gpLGI9LjUqKGYrZyksXz10Pj14LHc9ZT49YixTPXc8PDF8XyxrPVMrNDtrPlM7KytTKWlmKG49TVszJlNdKXN3aXRjaCgzJlMpe2Nhc2UgMDpsKG4scyxmLHgsYik7YnJlYWs7Y2FzZSAxOmwobix4LGYsaCxiKTticmVhaztjYXNlIDI6bChuLHMsYix4LGcpO2JyZWFrO2Nhc2UgMzpsKG4seCxiLGgsZyl9fX0obixyLHUsaSxvKSxhfWZ1bmN0aW9uIGd1KG4sdCl7bj10YS5yZ2IobiksdD10YS5yZ2IodCk7dmFyIGU9bi5yLHI9bi5nLHU9bi5iLGk9dC5yLWUsbz10LmctcixhPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4iIyIreHQoTWF0aC5yb3VuZChlK2kqbikpK3h0KE1hdGgucm91bmQocitvKm4pKSt4dChNYXRoLnJvdW5kKHUrYSpuKSl9fWZ1bmN0aW9uIHB1KG4sdCl7dmFyIGUscj17fSx1PXt9O2ZvcihlIGluIG4pZSBpbiB0P3JbZV09bXUobltlXSx0W2VdKTp1W2VdPW5bZV07Zm9yKGUgaW4gdCllIGluIG58fCh1W2VdPXRbZV0pO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZSBpbiByKXVbZV09cltlXShuKTtyZXR1cm4gdX19ZnVuY3Rpb24gdnUobix0KXtyZXR1cm4gbj0rbix0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBuKigxLWUpK3QqZX19ZnVuY3Rpb24gZHUobix0KXt2YXIgZSxyLHUsaT1pbC5sYXN0SW5kZXg9b2wubGFzdEluZGV4PTAsbz0tMSxhPVtdLGM9W107Zm9yKG4rPSIiLHQrPSIiOyhlPWlsLmV4ZWMobikpJiYocj1vbC5leGVjKHQpKTspKHU9ci5pbmRleCk+aSYmKHU9dC5zbGljZShpLHUpLGFbb10/YVtvXSs9dTphWysrb109dSksKGU9ZVswXSk9PT0ocj1yWzBdKT9hW29dP2Fbb10rPXI6YVsrK29dPXI6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6dnUoZSxyKX0pKSxpPW9sLmxhc3RJbmRleDtyZXR1cm4gaTx0Lmxlbmd0aCYmKHU9dC5zbGljZShpKSxhW29dP2Fbb10rPXU6YVsrK29dPXUpLGEubGVuZ3RoPDI/Y1swXT8odD1jWzBdLngsZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9KTpmdW5jdGlvbigpe3JldHVybiB0fToodD1jLmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIGUscj0wO3Q+cjsrK3IpYVsoZT1jW3JdKS5pXT1lLngobik7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBtdShuLHQpe2Zvcih2YXIgZSxyPXRhLmludGVycG9sYXRvcnMubGVuZ3RoOy0tcj49MCYmIShlPXRhLmludGVycG9sYXRvcnNbcl0obix0KSk7KTtyZXR1cm4gZX1mdW5jdGlvbiB5dShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPW4ubGVuZ3RoLG89dC5sZW5ndGgsYT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKGU9MDthPmU7KytlKXIucHVzaChtdShuW2VdLHRbZV0pKTtmb3IoO2k+ZTsrK2UpdVtlXT1uW2VdO2Zvcig7bz5lOysrZSl1W2VdPXRbZV07cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlPTA7YT5lOysrZSl1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIE11KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD49dD8wOnQ+PTE/MTpuKHQpfX1mdW5jdGlvbiB4dShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDEtbigxLXQpfX1mdW5jdGlvbiBidShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuLjUqKC41PnQ/bigyKnQpOjItbigyLTIqdCkpfX1mdW5jdGlvbiBfdShuKXtyZXR1cm4gbipufWZ1bmN0aW9uIHd1KG4pe3JldHVybiBuKm4qbn1mdW5jdGlvbiBTdShuKXtpZigwPj1uKXJldHVybiAwO2lmKG4+PTEpcmV0dXJuIDE7dmFyIHQ9bipuLGU9dCpuO3JldHVybiA0KiguNT5uP2U6Myoobi10KStlLS43NSl9ZnVuY3Rpb24ga3Uobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBFdShuKXtyZXR1cm4gMS1NYXRoLmNvcyhuKlJhKX1mdW5jdGlvbiBBdShuKXtyZXR1cm4gTWF0aC5wb3coMiwxMCoobi0xKSl9ZnVuY3Rpb24gTnUobil7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtbipuKX1mdW5jdGlvbiBDdShuLHQpe3ZhciBlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PS40NSksYXJndW1lbnRzLmxlbmd0aD9lPXQvTGEqTWF0aC5hc2luKDEvbik6KG49MSxlPXQvNCksZnVuY3Rpb24ocil7cmV0dXJuIDErbipNYXRoLnBvdygyLC0xMCpyKSpNYXRoLnNpbigoci1lKSpMYS90KX19ZnVuY3Rpb24genUobil7cmV0dXJuIG58fChuPTEuNzAxNTgpLGZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKChuKzEpKnQtbil9fWZ1bmN0aW9uIHF1KG4pe3JldHVybiAxLzIuNzU+bj83LjU2MjUqbipuOjIvMi43NT5uPzcuNTYyNSoobi09MS41LzIuNzUpKm4rLjc1OjIuNS8yLjc1Pm4/Ny41NjI1KihuLT0yLjI1LzIuNzUpKm4rLjkzNzU6Ny41NjI1KihuLT0yLjYyNS8yLjc1KSpuKy45ODQzNzV9ZnVuY3Rpb24gTHUobix0KXtuPXRhLmhjbChuKSx0PXRhLmhjbCh0KTt2YXIgZT1uLmgscj1uLmMsdT1uLmwsaT10LmgtZSxvPXQuYy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5jOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIHN0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gVHUobix0KXtuPXRhLmhzbChuKSx0PXRhLmhzbCh0KTt2YXIgZT1uLmgscj1uLnMsdT1uLmwsaT10LmgtZSxvPXQucy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5zOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGN0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gUnUobix0KXtuPXRhLmxhYihuKSx0PXRhLmxhYih0KTt2YXIgZT1uLmwscj1uLmEsdT1uLmIsaT10LmwtZSxvPXQuYS1yLGE9dC5iLXU7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBodChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIER1KG4sdCl7cmV0dXJuIHQtPW4sZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQobit0KmUpfX1mdW5jdGlvbiBQdShuKXt2YXIgdD1bbi5hLG4uYl0sZT1bbi5jLG4uZF0scj1qdSh0KSx1PVV1KHQsZSksaT1qdShGdShlLHQsLXUpKXx8MDt0WzBdKmVbMV08ZVswXSp0WzFdJiYodFswXSo9LTEsdFsxXSo9LTEscio9LTEsdSo9LTEpLHRoaXMucm90YXRlPShyP01hdGguYXRhbjIodFsxXSx0WzBdKTpNYXRoLmF0YW4yKC1lWzBdLGVbMV0pKSpQYSx0aGlzLnRyYW5zbGF0ZT1bbi5lLG4uZl0sdGhpcy5zY2FsZT1bcixpXSx0aGlzLnNrZXc9aT9NYXRoLmF0YW4yKHUsaSkqUGE6MH1mdW5jdGlvbiBVdShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdfWZ1bmN0aW9uIGp1KG4pe3ZhciB0PU1hdGguc3FydChVdShuLG4pKTtyZXR1cm4gdCYmKG5bMF0vPXQsblsxXS89dCksdH1mdW5jdGlvbiBGdShuLHQsZSl7cmV0dXJuIG5bMF0rPWUqdFswXSxuWzFdKz1lKnRbMV0sbn1mdW5jdGlvbiBIdShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPXRhLnRyYW5zZm9ybShuKSxvPXRhLnRyYW5zZm9ybSh0KSxhPWkudHJhbnNsYXRlLGM9by50cmFuc2xhdGUsbD1pLnJvdGF0ZSxzPW8ucm90YXRlLGY9aS5za2V3LGg9by5za2V3LGc9aS5zY2FsZSxwPW8uc2NhbGU7cmV0dXJuIGFbMF0hPWNbMF18fGFbMV0hPWNbMV0/KHIucHVzaCgidHJhbnNsYXRlKCIsbnVsbCwiLCIsbnVsbCwiKSIpLHUucHVzaCh7aToxLHg6dnUoYVswXSxjWzBdKX0se2k6Myx4OnZ1KGFbMV0sY1sxXSl9KSk6ci5wdXNoKGNbMF18fGNbMV0/InRyYW5zbGF0ZSgiK2MrIikiOiIiKSxsIT1zPyhsLXM+MTgwP3MrPTM2MDpzLWw+MTgwJiYobCs9MzYwKSx1LnB1c2goe2k6ci5wdXNoKHIucG9wKCkrInJvdGF0ZSgiLG51bGwsIikiKS0yLHg6dnUobCxzKX0pKTpzJiZyLnB1c2goci5wb3AoKSsicm90YXRlKCIrcysiKSIpLGYhPWg/dS5wdXNoKHtpOnIucHVzaChyLnBvcCgpKyJza2V3WCgiLG51bGwsIikiKS0yLHg6dnUoZixoKX0pOmgmJnIucHVzaChyLnBvcCgpKyJza2V3WCgiK2grIikiKSxnWzBdIT1wWzBdfHxnWzFdIT1wWzFdPyhlPXIucHVzaChyLnBvcCgpKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKSx1LnB1c2goe2k6ZS00LHg6dnUoZ1swXSxwWzBdKX0se2k6ZS0yLHg6dnUoZ1sxXSxwWzFdKX0pKTooMSE9cFswXXx8MSE9cFsxXSkmJnIucHVzaChyLnBvcCgpKyJzY2FsZSgiK3ArIikiKSxlPXUubGVuZ3RoLGZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxpPS0xOysraTxlOylyWyh0PXVbaV0pLmldPXQueChuKTtyZXR1cm4gci5qb2luKCIiKX19ZnVuY3Rpb24gT3Uobix0KXtyZXR1cm4gdD0odC09bj0rbil8fDEvdCxmdW5jdGlvbihlKXtyZXR1cm4oZS1uKS90fX1mdW5jdGlvbiBJdShuLHQpe3JldHVybiB0PSh0LT1uPStuKXx8MS90LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsKGUtbikvdCkpfX1mdW5jdGlvbiBZdShuKXtmb3IodmFyIHQ9bi5zb3VyY2UsZT1uLnRhcmdldCxyPVZ1KHQsZSksdT1bdF07dCE9PXI7KXQ9dC5wYXJlbnQsdS5wdXNoKHQpO2Zvcih2YXIgaT11Lmxlbmd0aDtlIT09cjspdS5zcGxpY2UoaSwwLGUpLGU9ZS5wYXJlbnQ7cmV0dXJuIHV9ZnVuY3Rpb24gWnUobil7Zm9yKHZhciB0PVtdLGU9bi5wYXJlbnQ7bnVsbCE9ZTspdC5wdXNoKG4pLG49ZSxlPWUucGFyZW50O3JldHVybiB0LnB1c2gobiksdH1mdW5jdGlvbiBWdShuLHQpe2lmKG49PT10KXJldHVybiBuO2Zvcih2YXIgZT1adShuKSxyPVp1KHQpLHU9ZS5wb3AoKSxpPXIucG9wKCksbz1udWxsO3U9PT1pOylvPXUsdT1lLnBvcCgpLGk9ci5wb3AoKTtyZXR1cm4gb31mdW5jdGlvbiBYdShuKXtuLmZpeGVkfD0yfWZ1bmN0aW9uICR1KG4pe24uZml4ZWQmPS03fWZ1bmN0aW9uIEJ1KG4pe24uZml4ZWR8PTQsbi5weD1uLngsbi5weT1uLnl9ZnVuY3Rpb24gV3Uobil7bi5maXhlZCY9LTV9ZnVuY3Rpb24gSnUobix0LGUpe3ZhciByPTAsdT0wO2lmKG4uY2hhcmdlPTAsIW4ubGVhZilmb3IodmFyIGksbz1uLm5vZGVzLGE9by5sZW5ndGgsYz0tMTsrK2M8YTspaT1vW2NdLG51bGwhPWkmJihKdShpLHQsZSksbi5jaGFyZ2UrPWkuY2hhcmdlLHIrPWkuY2hhcmdlKmkuY3gsdSs9aS5jaGFyZ2UqaS5jeSk7aWYobi5wb2ludCl7bi5sZWFmfHwobi5wb2ludC54Kz1NYXRoLnJhbmRvbSgpLS41LG4ucG9pbnQueSs9TWF0aC5yYW5kb20oKS0uNSk7dmFyIGw9dCplW24ucG9pbnQuaW5kZXhdO24uY2hhcmdlKz1uLnBvaW50Q2hhcmdlPWwscis9bCpuLnBvaW50LngsdSs9bCpuLnBvaW50Lnl9bi5jeD1yL24uY2hhcmdlLG4uY3k9dS9uLmNoYXJnZX1mdW5jdGlvbiBHdShuLHQpe3JldHVybiB0YS5yZWJpbmQobix0LCJzb3J0IiwiY2hpbGRyZW4iLCJ2YWx1ZSIpLG4ubm9kZXM9bixuLmxpbmtzPXJpLG59ZnVuY3Rpb24gS3Uobix0KXtmb3IodmFyIGU9W25dO251bGwhPShuPWUucG9wKCkpOylpZih0KG4pLCh1PW4uY2hpbGRyZW4pJiYocj11Lmxlbmd0aCkpZm9yKHZhciByLHU7LS1yPj0wOyllLnB1c2godVtyXSl9ZnVuY3Rpb24gUXUobix0KXtmb3IodmFyIGU9W25dLHI9W107bnVsbCE9KG49ZS5wb3AoKSk7KWlmKHIucHVzaChuKSwoaT1uLmNoaWxkcmVuKSYmKHU9aS5sZW5ndGgpKWZvcih2YXIgdSxpLG89LTE7KytvPHU7KWUucHVzaChpW29dKTtmb3IoO251bGwhPShuPXIucG9wKCkpOyl0KG4pfWZ1bmN0aW9uIG5pKG4pe3JldHVybiBuLmNoaWxkcmVufWZ1bmN0aW9uIHRpKG4pe3JldHVybiBuLnZhbHVlfWZ1bmN0aW9uIGVpKG4sdCl7cmV0dXJuIHQudmFsdWUtbi52YWx1ZX1mdW5jdGlvbiByaShuKXtyZXR1cm4gdGEubWVyZ2Uobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4uY2hpbGRyZW58fFtdKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuLHRhcmdldDp0fX0pfSkpfWZ1bmN0aW9uIHVpKG4pe3JldHVybiBuLnh9ZnVuY3Rpb24gaWkobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBvaShuLHQsZSl7bi55MD10LG4ueT1lfWZ1bmN0aW9uIGFpKG4pe3JldHVybiB0YS5yYW5nZShuLmxlbmd0aCl9ZnVuY3Rpb24gY2kobil7Zm9yKHZhciB0PS0xLGU9blswXS5sZW5ndGgscj1bXTsrK3Q8ZTspclt0XT0wO3JldHVybiByfWZ1bmN0aW9uIGxpKG4pe2Zvcih2YXIgdCxlPTEscj0wLHU9blswXVsxXSxpPW4ubGVuZ3RoO2k+ZTsrK2UpKHQ9bltlXVsxXSk+dSYmKHI9ZSx1PXQpO3JldHVybiByfWZ1bmN0aW9uIHNpKG4pe3JldHVybiBuLnJlZHVjZShmaSwwKX1mdW5jdGlvbiBmaShuLHQpe3JldHVybiBuK3RbMV19ZnVuY3Rpb24gaGkobix0KXtyZXR1cm4gZ2kobixNYXRoLmNlaWwoTWF0aC5sb2codC5sZW5ndGgpL01hdGguTE4yKzEpKX1mdW5jdGlvbiBnaShuLHQpe2Zvcih2YXIgZT0tMSxyPStuWzBdLHU9KG5bMV0tcikvdCxpPVtdOysrZTw9dDspaVtlXT11KmUrcjtyZXR1cm4gaX1mdW5jdGlvbiBwaShuKXtyZXR1cm5bdGEubWluKG4pLHRhLm1heChuKV19ZnVuY3Rpb24gdmkobix0KXtyZXR1cm4gbi52YWx1ZS10LnZhbHVlfWZ1bmN0aW9uIGRpKG4sdCl7dmFyIGU9bi5fcGFja19uZXh0O24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1uLHQuX3BhY2tfbmV4dD1lLGUuX3BhY2tfcHJldj10fWZ1bmN0aW9uIG1pKG4sdCl7bi5fcGFja19uZXh0PXQsdC5fcGFja19wcmV2PW59ZnVuY3Rpb24geWkobix0KXt2YXIgZT10Lngtbi54LHI9dC55LW4ueSx1PW4ucit0LnI7cmV0dXJuLjk5OSp1KnU+ZSplK3Iqcn1mdW5jdGlvbiBNaShuKXtmdW5jdGlvbiB0KG4pe3M9TWF0aC5taW4obi54LW4ucixzKSxmPU1hdGgubWF4KG4ueCtuLnIsZiksaD1NYXRoLm1pbihuLnktbi5yLGgpLGc9TWF0aC5tYXgobi55K24ucixnKX1pZigoZT1uLmNoaWxkcmVuKSYmKGw9ZS5sZW5ndGgpKXt2YXIgZSxyLHUsaSxvLGEsYyxsLHM9MS8wLGY9LTEvMCxoPTEvMCxnPS0xLzA7aWYoZS5mb3JFYWNoKHhpKSxyPWVbMF0sci54PS1yLnIsci55PTAsdChyKSxsPjEmJih1PWVbMV0sdS54PXUucix1Lnk9MCx0KHUpLGw+MikpZm9yKGk9ZVsyXSx3aShyLHUsaSksdChpKSxkaShyLGkpLHIuX3BhY2tfcHJldj1pLGRpKGksdSksdT1yLl9wYWNrX25leHQsbz0zO2w+bztvKyspe3dpKHIsdSxpPWVbb10pO3ZhciBwPTAsdj0xLGQ9MTtmb3IoYT11Ll9wYWNrX25leHQ7YSE9PXU7YT1hLl9wYWNrX25leHQsdisrKWlmKHlpKGEsaSkpe3A9MTticmVha31pZigxPT1wKWZvcihjPXIuX3BhY2tfcHJldjtjIT09YS5fcGFja19wcmV2JiYheWkoYyxpKTtjPWMuX3BhY2tfcHJldixkKyspO3A/KGQ+dnx8dj09ZCYmdS5yPHIucj9taShyLHU9YSk6bWkocj1jLHUpLG8tLSk6KGRpKHIsaSksdT1pLHQoaSkpfXZhciBtPShzK2YpLzIseT0oaCtnKS8yLE09MDtmb3Iobz0wO2w+bztvKyspaT1lW29dLGkueC09bSxpLnktPXksTT1NYXRoLm1heChNLGkucitNYXRoLnNxcnQoaS54KmkueCtpLnkqaS55KSk7bi5yPU0sZS5mb3JFYWNoKGJpKX19ZnVuY3Rpb24geGkobil7bi5fcGFja19uZXh0PW4uX3BhY2tfcHJldj1ufWZ1bmN0aW9uIGJpKG4pe2RlbGV0ZSBuLl9wYWNrX25leHQsZGVsZXRlIG4uX3BhY2tfcHJldn1mdW5jdGlvbiBfaShuLHQsZSxyKXt2YXIgdT1uLmNoaWxkcmVuO2lmKG4ueD10Kz1yKm4ueCxuLnk9ZSs9cipuLnksbi5yKj1yLHUpZm9yKHZhciBpPS0xLG89dS5sZW5ndGg7KytpPG87KV9pKHVbaV0sdCxlLHIpfWZ1bmN0aW9uIHdpKG4sdCxlKXt2YXIgcj1uLnIrZS5yLHU9dC54LW4ueCxpPXQueS1uLnk7aWYociYmKHV8fGkpKXt2YXIgbz10LnIrZS5yLGE9dSp1K2kqaTtvKj1vLHIqPXI7dmFyIGM9LjUrKHItbykvKDIqYSksbD1NYXRoLnNxcnQoTWF0aC5tYXgoMCwyKm8qKHIrYSktKHItPWEpKnItbypvKSkvKDIqYSk7ZS54PW4ueCtjKnUrbCppLGUueT1uLnkrYyppLWwqdX1lbHNlIGUueD1uLngrcixlLnk9bi55fWZ1bmN0aW9uIFNpKG4sdCl7cmV0dXJuIG4ucGFyZW50PT10LnBhcmVudD8xOjJ9ZnVuY3Rpb24ga2kobil7dmFyIHQ9bi5jaGlsZHJlbjtyZXR1cm4gdC5sZW5ndGg/dFswXTpuLnR9ZnVuY3Rpb24gRWkobil7dmFyIHQsZT1uLmNoaWxkcmVuO3JldHVybih0PWUubGVuZ3RoKT9lW3QtMV06bi50fWZ1bmN0aW9uIEFpKG4sdCxlKXt2YXIgcj1lLyh0Lmktbi5pKTt0LmMtPXIsdC5zKz1lLG4uYys9cix0LnorPWUsdC5tKz1lfWZ1bmN0aW9uIE5pKG4pe2Zvcih2YXIgdCxlPTAscj0wLHU9bi5jaGlsZHJlbixpPXUubGVuZ3RoOy0taT49MDspdD11W2ldLHQueis9ZSx0Lm0rPWUsZSs9dC5zKyhyKz10LmMpfWZ1bmN0aW9uIENpKG4sdCxlKXtyZXR1cm4gbi5hLnBhcmVudD09PXQucGFyZW50P24uYTplfWZ1bmN0aW9uIHppKG4pe3JldHVybiAxK3RhLm1heChuLGZ1bmN0aW9uKG4pe3JldHVybiBuLnl9KX1mdW5jdGlvbiBxaShuKXtyZXR1cm4gbi5yZWR1Y2UoZnVuY3Rpb24obix0KXtyZXR1cm4gbit0Lnh9LDApL24ubGVuZ3RofWZ1bmN0aW9uIExpKG4pe3ZhciB0PW4uY2hpbGRyZW47cmV0dXJuIHQmJnQubGVuZ3RoP0xpKHRbMF0pOm59ZnVuY3Rpb24gVGkobil7dmFyIHQsZT1uLmNoaWxkcmVuO3JldHVybiBlJiYodD1lLmxlbmd0aCk/VGkoZVt0LTFdKTpufWZ1bmN0aW9uIFJpKG4pe3JldHVybnt4Om4ueCx5Om4ueSxkeDpuLmR4LGR5Om4uZHl9fWZ1bmN0aW9uIERpKG4sdCl7dmFyIGU9bi54K3RbM10scj1uLnkrdFswXSx1PW4uZHgtdFsxXS10WzNdLGk9bi5keS10WzBdLXRbMl07cmV0dXJuIDA+dSYmKGUrPXUvMix1PTApLDA+aSYmKHIrPWkvMixpPTApLHt4OmUseTpyLGR4OnUsZHk6aX19ZnVuY3Rpb24gUGkobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuIGU+dD9bdCxlXTpbZSx0XX1mdW5jdGlvbiBVaShuKXtyZXR1cm4gbi5yYW5nZUV4dGVudD9uLnJhbmdlRXh0ZW50KCk6UGkobi5yYW5nZSgpKX1mdW5jdGlvbiBqaShuLHQsZSxyKXt2YXIgdT1lKG5bMF0sblsxXSksaT1yKHRbMF0sdFsxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBpKHUobikpfX1mdW5jdGlvbiBGaShuLHQpe3ZhciBlLHI9MCx1PW4ubGVuZ3RoLTEsaT1uW3JdLG89blt1XTtyZXR1cm4gaT5vJiYoZT1yLHI9dSx1PWUsZT1pLGk9byxvPWUpLG5bcl09dC5mbG9vcihpKSxuW3VdPXQuY2VpbChvKSxufWZ1bmN0aW9uIEhpKG4pe3JldHVybiBuP3tmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5mbG9vcih0L24pKm59LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguY2VpbCh0L24pKm59fTptbH1mdW5jdGlvbiBPaShuLHQsZSxyKXt2YXIgdT1bXSxpPVtdLG89MCxhPU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKS0xO2ZvcihuW2FdPG5bMF0mJihuPW4uc2xpY2UoKS5yZXZlcnNlKCksdD10LnNsaWNlKCkucmV2ZXJzZSgpKTsrK288PWE7KXUucHVzaChlKG5bby0xXSxuW29dKSksaS5wdXNoKHIodFtvLTFdLHRbb10pKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dGEuYmlzZWN0KG4sdCwxLGEpLTE7cmV0dXJuIGlbZV0odVtlXSh0KSl9fWZ1bmN0aW9uIElpKG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgdT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk+Mj9PaTpqaSxjPXI/SXU6T3U7cmV0dXJuIG89dShuLHQsYyxlKSxhPXUodCxuLGMsbXUpLGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbyhuKX12YXIgbyxhO3JldHVybiBpLmludmVydD1mdW5jdGlvbihuKXtyZXR1cm4gYShuKX0saS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dC5tYXAoTnVtYmVyKSx1KCkpOm59LGkucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bix1KCkpOnR9LGkucmFuZ2VSb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gaS5yYW5nZShuKS5pbnRlcnBvbGF0ZShEdSl9LGkuY2xhbXA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix1KCkpOnJ9LGkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix1KCkpOmV9LGkudGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIFhpKG4sdCl9LGkudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiAkaShuLHQsZSl9LGkubmljZT1mdW5jdGlvbih0KXtyZXR1cm4gWmkobix0KSx1KCl9LGkuY29weT1mdW5jdGlvbigpe3JldHVybiBJaShuLHQsZSxyKX0sdSgpfWZ1bmN0aW9uIFlpKG4sdCl7cmV0dXJuIHRhLnJlYmluZChuLHQsInJhbmdlIiwicmFuZ2VSb3VuZCIsImludGVycG9sYXRlIiwiY2xhbXAiKX1mdW5jdGlvbiBaaShuLHQpe3JldHVybiBGaShuLEhpKFZpKG4sdClbMl0pKX1mdW5jdGlvbiBWaShuLHQpe251bGw9PXQmJih0PTEwKTt2YXIgZT1QaShuKSxyPWVbMV0tZVswXSx1PU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2coci90KS9NYXRoLkxOMTApKSxpPXQvcip1O3JldHVybi4xNT49aT91Kj0xMDouMzU+PWk/dSo9NTouNzU+PWkmJih1Kj0yKSxlWzBdPU1hdGguY2VpbChlWzBdL3UpKnUsZVsxXT1NYXRoLmZsb29yKGVbMV0vdSkqdSsuNSp1LGVbMl09dSxlfWZ1bmN0aW9uIFhpKG4sdCl7cmV0dXJuIHRhLnJhbmdlLmFwcGx5KHRhLFZpKG4sdCkpfWZ1bmN0aW9uICRpKG4sdCxlKXt2YXIgcj1WaShuLHQpO2lmKGUpe3ZhciB1PWljLmV4ZWMoZSk7aWYodS5zaGlmdCgpLCJzIj09PXVbOF0pe3ZhciBpPXRhLmZvcm1hdFByZWZpeChNYXRoLm1heChnYShyWzBdKSxnYShyWzFdKSkpO3JldHVybiB1WzddfHwodVs3XT0iLiIrQmkoaS5zY2FsZShyWzJdKSkpLHVbOF09ImYiLGU9dGEuZm9ybWF0KHUuam9pbigiIikpLGZ1bmN0aW9uKG4pe3JldHVybiBlKGkuc2NhbGUobikpK2kuc3ltYm9sfX11WzddfHwodVs3XT0iLiIrV2kodVs4XSxyKSksZT11LmpvaW4oIiIpfWVsc2UgZT0iLC4iK0JpKHJbMl0pKyJmIjtyZXR1cm4gdGEuZm9ybWF0KGUpfWZ1bmN0aW9uIEJpKG4pe3JldHVybi1NYXRoLmZsb29yKE1hdGgubG9nKG4pL01hdGguTE4xMCsuMDEpfWZ1bmN0aW9uIFdpKG4sdCl7dmFyIGU9QmkodFsyXSk7cmV0dXJuIG4gaW4geWw/TWF0aC5hYnMoZS1CaShNYXRoLm1heChnYSh0WzBdKSxnYSh0WzFdKSkpKSsgKygiZSIhPT1uKTplLTIqKCIlIj09PW4pfWZ1bmN0aW9uIEppKG4sdCxlLHIpe2Z1bmN0aW9uIHUobil7cmV0dXJuKGU/TWF0aC5sb2coMD5uPzA6bik6LU1hdGgubG9nKG4+MD8wOi1uKSkvTWF0aC5sb2codCl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gZT9NYXRoLnBvdyh0LG4pOi1NYXRoLnBvdyh0LC1uKX1mdW5jdGlvbiBvKHQpe3JldHVybiBuKHUodCkpfXJldHVybiBvLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gaShuLmludmVydCh0KSl9LG8uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXRbMF0+PTAsbi5kb21haW4oKHI9dC5tYXAoTnVtYmVyKSkubWFwKHUpKSxvKTpyfSxvLmJhc2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K2Usbi5kb21haW4oci5tYXAodSkpLG8pOnR9LG8ubmljZT1mdW5jdGlvbigpe3ZhciB0PUZpKHIubWFwKHUpLGU/TWF0aDp4bCk7cmV0dXJuIG4uZG9tYWluKHQpLHI9dC5tYXAoaSksb30sby50aWNrcz1mdW5jdGlvbigpe3ZhciBuPVBpKHIpLG89W10sYT1uWzBdLGM9blsxXSxsPU1hdGguZmxvb3IodShhKSkscz1NYXRoLmNlaWwodShjKSksZj10JTE/Mjp0O2lmKGlzRmluaXRlKHMtbCkpe2lmKGUpe2Zvcig7cz5sO2wrKylmb3IodmFyIGg9MTtmPmg7aCsrKW8ucHVzaChpKGwpKmgpO28ucHVzaChpKGwpKX1lbHNlIGZvcihvLnB1c2goaShsKSk7bCsrPHM7KWZvcih2YXIgaD1mLTE7aD4wO2gtLSlvLnB1c2goaShsKSpoKTtmb3IobD0wO29bbF08YTtsKyspO2ZvcihzPW8ubGVuZ3RoO29bcy0xXT5jO3MtLSk7bz1vLnNsaWNlKGwscyl9cmV0dXJuIG99LG8udGlja0Zvcm1hdD1mdW5jdGlvbihuLHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBNbDthcmd1bWVudHMubGVuZ3RoPDI/dD1NbDoiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9dGEuZm9ybWF0KHQpKTt2YXIgcixhPU1hdGgubWF4KC4xLG4vby50aWNrcygpLmxlbmd0aCksYz1lPyhyPTFlLTEyLE1hdGguY2VpbCk6KHI9LTFlLTEyLE1hdGguZmxvb3IpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi9pKGModShuKStyKSk8PWE/dChuKToiIn19LG8uY29weT1mdW5jdGlvbigpe3JldHVybiBKaShuLmNvcHkoKSx0LGUscil9LFlpKG8sbil9ZnVuY3Rpb24gR2kobix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4odSh0KSl9dmFyIHU9S2kodCksaT1LaSgxL3QpO3JldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gaShuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbigoZT10Lm1hcChOdW1iZXIpKS5tYXAodSkpLHIpOmV9LHIudGlja3M9ZnVuY3Rpb24obil7cmV0dXJuIFhpKGUsbil9LHIudGlja0Zvcm1hdD1mdW5jdGlvbihuLHQpe3JldHVybiAkaShlLG4sdCl9LHIubmljZT1mdW5jdGlvbihuKXtyZXR1cm4gci5kb21haW4oWmkoZSxuKSl9LHIuZXhwb25lbnQ9ZnVuY3Rpb24obyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9S2kodD1vKSxpPUtpKDEvdCksbi5kb21haW4oZS5tYXAodSkpLHIpOnR9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBHaShuLmNvcHkoKSx0LGUpfSxZaShyLG4pfWZ1bmN0aW9uIEtpKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD50Py1NYXRoLnBvdygtdCxuKTpNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBRaShuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGlbKCh1LmdldChlKXx8KCJyYW5nZSI9PT10LnQ/dS5zZXQoZSxuLnB1c2goZSkpOjAvMCkpLTEpJWkubGVuZ3RoXX1mdW5jdGlvbiByKHQsZSl7cmV0dXJuIHRhLnJhbmdlKG4ubGVuZ3RoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIHQrZSpufSl9dmFyIHUsaSxvO3JldHVybiBlLmRvbWFpbj1mdW5jdGlvbihyKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbjtuPVtdLHU9bmV3IGw7Zm9yKHZhciBpLG89LTEsYT1yLmxlbmd0aDsrK288YTspdS5oYXMoaT1yW29dKXx8dS5zZXQoaSxuLnB1c2goaSkpO3JldHVybiBlW3QudF0uYXBwbHkoZSx0LmEpfSxlLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sbz0wLHQ9e3Q6InJhbmdlIixhOmFyZ3VtZW50c30sZSk6aX0sZS5yYW5nZVBvaW50cz1mdW5jdGlvbih1LGEpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCk7dmFyIGM9dVswXSxsPXVbMV0scz1uLmxlbmd0aDwyPyhjPShjK2wpLzIsMCk6KGwtYykvKG4ubGVuZ3RoLTErYSk7cmV0dXJuIGk9cihjK3MqYS8yLHMpLG89MCx0PXt0OiJyYW5nZVBvaW50cyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VSb3VuZFBvaW50cz1mdW5jdGlvbih1LGEpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCk7dmFyIGM9dVswXSxsPXVbMV0scz1uLmxlbmd0aDwyPyhjPWw9TWF0aC5yb3VuZCgoYytsKS8yKSwwKToobC1jKS8obi5sZW5ndGgtMSthKXwwO3JldHVybiBpPXIoYytNYXRoLnJvdW5kKHMqYS8yKyhsLWMtKG4ubGVuZ3RoLTErYSkqcykvMikscyksbz0wLHQ9e3Q6InJhbmdlUm91bmRQb2ludHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZHM9ZnVuY3Rpb24odSxhLGMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYoYz1hKTt2YXIgbD11WzFdPHVbMF0scz11W2wtMF0sZj11WzEtbF0saD0oZi1zKS8obi5sZW5ndGgtYSsyKmMpO3JldHVybiBpPXIocytoKmMsaCksbCYmaS5yZXZlcnNlKCksbz1oKigxLWEpLHQ9e3Q6InJhbmdlQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlUm91bmRCYW5kcz1mdW5jdGlvbih1LGEsYyl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKSxhcmd1bWVudHMubGVuZ3RoPDMmJihjPWEpO3ZhciBsPXVbMV08dVswXSxzPXVbbC0wXSxmPXVbMS1sXSxoPU1hdGguZmxvb3IoKGYtcykvKG4ubGVuZ3RoLWErMipjKSk7cmV0dXJuIGk9cihzK01hdGgucm91bmQoKGYtcy0obi5sZW5ndGgtYSkqaCkvMiksaCksbCYmaS5yZXZlcnNlKCksbz1NYXRoLnJvdW5kKGgqKDEtYSkpLHQ9e3Q6InJhbmdlUm91bmRCYW5kcyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIG99LGUucmFuZ2VFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gUGkodC5hWzBdKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFFpKG4sdCl9LGUuZG9tYWluKG4pfWZ1bmN0aW9uIG5vKG4sdCl7ZnVuY3Rpb24gaSgpe3ZhciBlPTAscj10Lmxlbmd0aDtmb3IoYT1bXTsrK2U8cjspYVtlLTFdPXRhLnF1YW50aWxlKG4sZS9yKTtyZXR1cm4gb31mdW5jdGlvbiBvKG4pe3JldHVybiBpc05hTihuPStuKT92b2lkIDA6dFt0YS5iaXNlY3QoYSxuKV19dmFyIGE7cmV0dXJuIG8uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQubWFwKHIpLmZpbHRlcih1KS5zb3J0KGUpLGkoKSk6bn0sby5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGkoKSk6dH0sby5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYX0sby5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5pbmRleE9mKGUpLDA+ZT9bMC8wLDAvMF06W2U+MD9hW2UtMV06blswXSxlPGEubGVuZ3RoP2FbZV06bltuLmxlbmd0aC0xXV19LG8uY29weT1mdW5jdGlvbigpe3JldHVybiBubyhuLHQpfSxpKCl9ZnVuY3Rpb24gdG8obix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIGVbTWF0aC5tYXgoMCxNYXRoLm1pbihvLE1hdGguZmxvb3IoaSoodC1uKSkpKV19ZnVuY3Rpb24gdSgpe3JldHVybiBpPWUubGVuZ3RoLyh0LW4pLG89ZS5sZW5ndGgtMSxyfXZhciBpLG87cmV0dXJuIHIuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlWzBdLHQ9K2VbZS5sZW5ndGgtMV0sdSgpKTpbbix0XX0sci5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHUoKSk6ZX0sci5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9ZS5pbmRleE9mKHQpLHQ9MD50PzAvMDp0L2krbixbdCx0KzEvaV19LHIuY29weT1mdW5jdGlvbigpe3JldHVybiB0byhuLHQsZSl9LHUoKX1mdW5jdGlvbiBlbyhuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGU+PWU/dFt0YS5iaXNlY3QobixlKV06dm9pZCAwfXJldHVybiBlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixlKTp0fSxlLmludmVydEV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmluZGV4T2YoZSksW25bZS0xXSxuW2VdXX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGVvKG4sdCl9LGV9ZnVuY3Rpb24gcm8obil7ZnVuY3Rpb24gdChuKXtyZXR1cm4rbn1yZXR1cm4gdC5pbnZlcnQ9dCx0LmRvbWFpbj10LnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUubWFwKHQpLHQpOm59LHQudGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIFhpKG4sdCl9LHQudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiAkaShuLHQsZSl9LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBybyhuKX0sdH1mdW5jdGlvbiB1bygpe3JldHVybiAwfWZ1bmN0aW9uIGlvKG4pe3JldHVybiBuLmlubmVyUmFkaXVzfWZ1bmN0aW9uIG9vKG4pe3JldHVybiBuLm91dGVyUmFkaXVzfWZ1bmN0aW9uIGFvKG4pe3JldHVybiBuLnN0YXJ0QW5nbGV9ZnVuY3Rpb24gY28obil7cmV0dXJuIG4uZW5kQW5nbGV9ZnVuY3Rpb24gbG8obil7cmV0dXJuIG4mJm4ucGFkQW5nbGV9ZnVuY3Rpb24gc28obix0LGUscil7cmV0dXJuKG4tZSkqdC0odC1yKSpuPjA/MDoxfWZ1bmN0aW9uIGZvKG4sdCxlLHIsdSl7dmFyIGk9blswXS10WzBdLG89blsxXS10WzFdLGE9KHU/cjotcikvTWF0aC5zcXJ0KGkqaStvKm8pLGM9YSpvLGw9LWEqaSxzPW5bMF0rYyxmPW5bMV0rbCxoPXRbMF0rYyxnPXRbMV0rbCxwPShzK2gpLzIsdj0oZitnKS8yLGQ9aC1zLG09Zy1mLHk9ZCpkK20qbSxNPWUtcix4PXMqZy1oKmYsYj0oMD5tPy0xOjEpKk1hdGguc3FydChNKk0qeS14KngpLF89KHgqbS1kKmIpL3ksdz0oLXgqZC1tKmIpL3ksUz0oeCptK2QqYikveSxrPSgteCpkK20qYikveSxFPV8tcCxBPXctdixOPVMtcCxDPWstdjtyZXR1cm4gRSpFK0EqQT5OKk4rQypDJiYoXz1TLHc9ayksW1tfLWMsdy1sXSxbXyplL00sdyplL01dXX1mdW5jdGlvbiBobyhuKXtmdW5jdGlvbiB0KHQpe2Z1bmN0aW9uIG8oKXtsLnB1c2goIk0iLGkobihzKSxhKSl9Zm9yKHZhciBjLGw9W10scz1bXSxmPS0xLGg9dC5sZW5ndGgsZz1FdChlKSxwPUV0KHIpOysrZjxoOyl1LmNhbGwodGhpcyxjPXRbZl0sZik/cy5wdXNoKFsrZy5jYWxsKHRoaXMsYyxmKSwrcC5jYWxsKHRoaXMsYyxmKV0pOnMubGVuZ3RoJiYobygpLHM9W10pO3JldHVybiBzLmxlbmd0aCYmbygpLGwubGVuZ3RoP2wuam9pbigiIik6bnVsbH12YXIgZT1BcixyPU5yLHU9TmUsaT1nbyxvPWkua2V5LGE9Ljc7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLHQpOnV9LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIG4/aT1uOihpPUVsLmdldChuKXx8Z28pLmtleSx0KTpvfSx0LnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bix0KTphfSx0fWZ1bmN0aW9uIGdvKG4pe3JldHVybiBuLmpvaW4oIkwiKX1mdW5jdGlvbiBwbyhuKXtyZXR1cm4gZ28obikrIloifWZ1bmN0aW9uIHZvKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyWzBdKyhyPW5bdF0pWzBdKS8yLCJWIixyWzFdKTtyZXR1cm4gZT4xJiZ1LnB1c2goIkgiLHJbMF0pLHUuam9pbigiIil9ZnVuY3Rpb24gbW8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiViIsKHI9blt0XSlbMV0sIkgiLHJbMF0pO3JldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIHlvKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyPW5bdF0pWzBdLCJWIixyWzFdKTtyZXR1cm4gdS5qb2luKCIiKX1mdW5jdGlvbiBNbyhuLHQpe3JldHVybiBuLmxlbmd0aDw0P2dvKG4pOm5bMV0rX28obi5zbGljZSgxLC0xKSx3byhuLHQpKX1mdW5jdGlvbiB4byhuLHQpe3JldHVybiBuLmxlbmd0aDwzP2dvKG4pOm5bMF0rX28oKG4ucHVzaChuWzBdKSxuKSx3byhbbltuLmxlbmd0aC0yXV0uY29uY2F0KG4sW25bMV1dKSx0KSl9ZnVuY3Rpb24gYm8obix0KXtyZXR1cm4gbi5sZW5ndGg8Mz9nbyhuKTpuWzBdK19vKG4sd28obix0KSl9ZnVuY3Rpb24gX28obix0KXtpZih0Lmxlbmd0aDwxfHxuLmxlbmd0aCE9dC5sZW5ndGgmJm4ubGVuZ3RoIT10Lmxlbmd0aCsyKXJldHVybiBnbyhuKTt2YXIgZT1uLmxlbmd0aCE9dC5sZW5ndGgscj0iIix1PW5bMF0saT1uWzFdLG89dFswXSxhPW8sYz0xO2lmKGUmJihyKz0iUSIrKGlbMF0tMipvWzBdLzMpKyIsIisoaVsxXS0yKm9bMV0vMykrIiwiK2lbMF0rIiwiK2lbMV0sdT1uWzFdLGM9MiksdC5sZW5ndGg+MSl7YT10WzFdLGk9bltjXSxjKysscis9IkMiKyh1WzBdK29bMF0pKyIsIisodVsxXStvWzFdKSsiLCIrKGlbMF0tYVswXSkrIiwiKyhpWzFdLWFbMV0pKyIsIitpWzBdKyIsIitpWzFdO2Zvcih2YXIgbD0yO2w8dC5sZW5ndGg7bCsrLGMrKylpPW5bY10sYT10W2xdLHIrPSJTIisoaVswXS1hWzBdKSsiLCIrKGlbMV0tYVsxXSkrIiwiK2lbMF0rIiwiK2lbMV19aWYoZSl7dmFyIHM9bltjXTtyKz0iUSIrKGlbMF0rMiphWzBdLzMpKyIsIisoaVsxXSsyKmFbMV0vMykrIiwiK3NbMF0rIiwiK3NbMV19cmV0dXJuIHJ9ZnVuY3Rpb24gd28obix0KXtmb3IodmFyIGUscj1bXSx1PSgxLXQpLzIsaT1uWzBdLG89blsxXSxhPTEsYz1uLmxlbmd0aDsrK2E8YzspZT1pLGk9byxvPW5bYV0sci5wdXNoKFt1KihvWzBdLWVbMF0pLHUqKG9bMV0tZVsxXSldKTtyZXR1cm4gcn1mdW5jdGlvbiBTbyhuKXtpZihuLmxlbmd0aDwzKXJldHVybiBnbyhuKTt2YXIgdD0xLGU9bi5sZW5ndGgscj1uWzBdLHU9clswXSxpPXJbMV0sbz1bdSx1LHUsKHI9blsxXSlbMF1dLGE9W2ksaSxpLHJbMV1dLGM9W3UsIiwiLGksIkwiLE5vKENsLG8pLCIsIixObyhDbCxhKV07Zm9yKG4ucHVzaChuW2UtMV0pOysrdDw9ZTspcj1uW3RdLG8uc2hpZnQoKSxvLnB1c2goclswXSksYS5zaGlmdCgpLGEucHVzaChyWzFdKSxDbyhjLG8sYSk7cmV0dXJuIG4ucG9wKCksYy5wdXNoKCJMIixyKSxjLmpvaW4oIiIpfWZ1bmN0aW9uIGtvKG4pe2lmKG4ubGVuZ3RoPDQpcmV0dXJuIGdvKG4pO2Zvcih2YXIgdCxlPVtdLHI9LTEsdT1uLmxlbmd0aCxpPVswXSxvPVswXTsrK3I8MzspdD1uW3JdLGkucHVzaCh0WzBdKSxvLnB1c2godFsxXSk7Zm9yKGUucHVzaChObyhDbCxpKSsiLCIrTm8oQ2wsbykpLC0tcjsrK3I8dTspdD1uW3JdLGkuc2hpZnQoKSxpLnB1c2godFswXSksby5zaGlmdCgpLG8ucHVzaCh0WzFdKSxDbyhlLGksbyk7cmV0dXJuIGUuam9pbigiIil9ZnVuY3Rpb24gRW8obil7Zm9yKHZhciB0LGUscj0tMSx1PW4ubGVuZ3RoLGk9dSs0LG89W10sYT1bXTsrK3I8NDspZT1uW3IldV0sby5wdXNoKGVbMF0pLGEucHVzaChlWzFdKTtmb3IodD1bTm8oQ2wsbyksIiwiLE5vKENsLGEpXSwtLXI7KytyPGk7KWU9bltyJXVdLG8uc2hpZnQoKSxvLnB1c2goZVswXSksYS5zaGlmdCgpLGEucHVzaChlWzFdKSxDbyh0LG8sYSk7cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gQW8obix0KXt2YXIgZT1uLmxlbmd0aC0xO2lmKGUpZm9yKHZhciByLHUsaT1uWzBdWzBdLG89blswXVsxXSxhPW5bZV1bMF0taSxjPW5bZV1bMV0tbyxsPS0xOysrbDw9ZTspcj1uW2xdLHU9bC9lLHJbMF09dCpyWzBdKygxLXQpKihpK3UqYSksclsxXT10KnJbMV0rKDEtdCkqKG8rdSpjKTtyZXR1cm4gU28obil9ZnVuY3Rpb24gTm8obix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXStuWzJdKnRbMl0rblszXSp0WzNdfWZ1bmN0aW9uIENvKG4sdCxlKXtuLnB1c2goIkMiLE5vKEFsLHQpLCIsIixObyhBbCxlKSwiLCIsTm8oTmwsdCksIiwiLE5vKE5sLGUpLCIsIixObyhDbCx0KSwiLCIsTm8oQ2wsZSkpfWZ1bmN0aW9uIHpvKG4sdCl7cmV0dXJuKHRbMV0tblsxXSkvKHRbMF0tblswXSl9ZnVuY3Rpb24gcW8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aC0xLHI9W10sdT1uWzBdLGk9blsxXSxvPXJbMF09em8odSxpKTsrK3Q8ZTspclt0XT0obysobz16byh1PWksaT1uW3QrMV0pKSkvMjtyZXR1cm4gclt0XT1vLHJ9ZnVuY3Rpb24gTG8obil7Zm9yKHZhciB0LGUscix1LGk9W10sbz1xbyhuKSxhPS0xLGM9bi5sZW5ndGgtMTsrK2E8YzspdD16byhuW2FdLG5bYSsxXSksZ2EodCk8Q2E/b1thXT1vW2ErMV09MDooZT1vW2FdL3Qscj1vW2ErMV0vdCx1PWUqZStyKnIsdT45JiYodT0zKnQvTWF0aC5zcXJ0KHUpLG9bYV09dSplLG9bYSsxXT11KnIpKTtmb3IoYT0tMTsrK2E8PWM7KXU9KG5bTWF0aC5taW4oYyxhKzEpXVswXS1uW01hdGgubWF4KDAsYS0xKV1bMF0pLyg2KigxK29bYV0qb1thXSkpLGkucHVzaChbdXx8MCxvW2FdKnV8fDBdKTtyZXR1cm4gaX1mdW5jdGlvbiBUbyhuKXtyZXR1cm4gbi5sZW5ndGg8Mz9nbyhuKTpuWzBdK19vKG4sTG8obikpfWZ1bmN0aW9uIFJvKG4pe2Zvcih2YXIgdCxlLHIsdT0tMSxpPW4ubGVuZ3RoOysrdTxpOyl0PW5bdV0sZT10WzBdLHI9dFsxXS1SYSx0WzBdPWUqTWF0aC5jb3MociksdFsxXT1lKk1hdGguc2luKHIpO3JldHVybiBufWZ1bmN0aW9uIERvKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gYygpe3YucHVzaCgiTSIsYShuKG0pLGYpLHMsbChuKGQucmV2ZXJzZSgpKSxmKSwiWiIpfWZvcih2YXIgaCxnLHAsdj1bXSxkPVtdLG09W10seT0tMSxNPXQubGVuZ3RoLHg9RXQoZSksYj1FdCh1KSxfPWU9PT1yP2Z1bmN0aW9uKCl7cmV0dXJuIGd9OkV0KHIpLHc9dT09PWk/ZnVuY3Rpb24oKXtyZXR1cm4gcH06RXQoaSk7Kyt5PE07KW8uY2FsbCh0aGlzLGg9dFt5XSx5KT8oZC5wdXNoKFtnPSt4LmNhbGwodGhpcyxoLHkpLHA9K2IuY2FsbCh0aGlzLGgseSldKSxtLnB1c2goWytfLmNhbGwodGhpcyxoLHkpLCt3LmNhbGwodGhpcyxoLHkpXSkpOmQubGVuZ3RoJiYoYygpLGQ9W10sbT1bXSk7cmV0dXJuIGQubGVuZ3RoJiZjKCksdi5sZW5ndGg/di5qb2luKCIiKTpudWxsfXZhciBlPUFyLHI9QXIsdT0wLGk9TnIsbz1OZSxhPWdvLGM9YS5rZXksbD1hLHM9IkwiLGY9Ljc7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1yPW4sdCk6cn0sdC54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueDE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyCn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWk9bix0KTppfSx0LnkwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLHQpOml9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLHQpOm99LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/YT1uOihhPUVsLmdldChuKXx8Z28pLmtleSxsPWEucmV2ZXJzZXx8YSxzPWEuY2xvc2VkPyJNIjoiTCIsdCk6Y30sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPW4sdCk6Zn0sdH1mdW5jdGlvbiBQbyhuKXtyZXR1cm4gbi5yYWRpdXN9ZnVuY3Rpb24gVW8obil7cmV0dXJuW24ueCxuLnldfWZ1bmN0aW9uIGpvKG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dFswXSxyPXRbMV0tUmE7cmV0dXJuW2UqTWF0aC5jb3MociksZSpNYXRoLnNpbihyKV19fWZ1bmN0aW9uIEZvKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIEhvKCl7cmV0dXJuImNpcmNsZSJ9ZnVuY3Rpb24gT28obil7dmFyIHQ9TWF0aC5zcXJ0KG4vcWEpO3JldHVybiJNMCwiK3QrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLXQrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrdCsiWiJ9ZnVuY3Rpb24gSW8obil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQsZTsodD10aGlzW25dKSYmKGU9dFt0LmFjdGl2ZV0pJiYoLS10LmNvdW50P2RlbGV0ZSB0W3QuYWN0aXZlXTpkZWxldGUgdGhpc1tuXSx0LmFjdGl2ZSs9LjUsZS5ldmVudCYmZS5ldmVudC5pbnRlcnJ1cHQuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZS5pbmRleCkpfX1mdW5jdGlvbiBZbyhuLHQsZSl7cmV0dXJuIHlhKG4sUGwpLG4ubmFtZXNwYWNlPXQsbi5pZD1lLG59ZnVuY3Rpb24gWm8obix0LGUscil7dmFyIHU9bi5pZCxpPW4ubmFtZXNwYWNlO3JldHVybiBZKG4sImZ1bmN0aW9uIj09dHlwZW9mIGU/ZnVuY3Rpb24obixvLGEpe25baV1bdV0udHdlZW4uc2V0KHQscihlLmNhbGwobixuLl9fZGF0YV9fLG8sYSkpKX06KGU9cihlKSxmdW5jdGlvbihuKXtuW2ldW3VdLnR3ZWVuLnNldCh0LGUpfSkpfWZ1bmN0aW9uIFZvKG4pe3JldHVybiBudWxsPT1uJiYobj0iIiksZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PW59fWZ1bmN0aW9uIFhvKG4pe3JldHVybiBudWxsPT1uPyJfX3RyYW5zaXRpb25fXyI6Il9fdHJhbnNpdGlvbl8iK24rIl9fIn1mdW5jdGlvbiAkbyhuLHQsZSxyLHUpe3ZhciBpPW5bZV18fChuW2VdPXthY3RpdmU6MCxjb3VudDowfSksbz1pW3JdO2lmKCFvKXt2YXIgYT11LnRpbWU7bz1pW3JdPXt0d2VlbjpuZXcgbCx0aW1lOmEsZGVsYXk6dS5kZWxheSxkdXJhdGlvbjp1LmR1cmF0aW9uLGVhc2U6dS5lYXNlLGluZGV4OnR9LHU9bnVsbCwrK2kuY291bnQsdGEudGltZXIoZnVuY3Rpb24odSl7ZnVuY3Rpb24gYyhlKXtpZihpLmFjdGl2ZT5yKXJldHVybiBzKCk7dmFyIHU9aVtpLmFjdGl2ZV07dSYmKC0taS5jb3VudCxkZWxldGUgaVtpLmFjdGl2ZV0sdS5ldmVudCYmdS5ldmVudC5pbnRlcnJ1cHQuY2FsbChuLG4uX19kYXRhX18sdS5pbmRleCkpLGkuYWN0aXZlPXIsby5ldmVudCYmby5ldmVudC5zdGFydC5jYWxsKG4sbi5fX2RhdGFfXyx0KSxvLnR3ZWVuLmZvckVhY2goZnVuY3Rpb24oZSxyKXsocj1yLmNhbGwobixuLl9fZGF0YV9fLHQpKSYmdi5wdXNoKHIpfSksaD1vLmVhc2UsZj1vLmR1cmF0aW9uLHRhLnRpbWVyKGZ1bmN0aW9uKCl7cmV0dXJuIHAuYz1sKGV8fDEpP05lOmwsMX0sMCxhKX1mdW5jdGlvbiBsKGUpe2lmKGkuYWN0aXZlIT09cilyZXR1cm4gMTtmb3IodmFyIHU9ZS9mLGE9aCh1KSxjPXYubGVuZ3RoO2M+MDspdlstLWNdLmNhbGwobixhKTtyZXR1cm4gdT49MT8oby5ldmVudCYmby5ldmVudC5lbmQuY2FsbChuLG4uX19kYXRhX18sdCkscygpKTp2b2lkIDB9ZnVuY3Rpb24gcygpe3JldHVybi0taS5jb3VudD9kZWxldGUgaVtyXTpkZWxldGUgbltlXSwxfXZhciBmLGgsZz1vLmRlbGF5LHA9ZWMsdj1bXTtyZXR1cm4gcC50PWcrYSx1Pj1nP2ModS1nKTp2b2lkKHAuYz1jKX0sMCxhKX19ZnVuY3Rpb24gQm8obix0LGUpe24uYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXt2YXIgcj10KG4pO3JldHVybiJ0cmFuc2xhdGUoIisoaXNGaW5pdGUocik/cjplKG4pKSsiLDApIn0pfWZ1bmN0aW9uIFdvKG4sdCxlKXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7dmFyIHI9dChuKTtyZXR1cm4idHJhbnNsYXRlKDAsIisoaXNGaW5pdGUocik/cjplKG4pKSsiKSJ9KX1mdW5jdGlvbiBKbyhuKXtyZXR1cm4gbi50b0lTT1N0cmluZygpfWZ1bmN0aW9uIEdvKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHQpfWZ1bmN0aW9uIHUobixlKXt2YXIgcj1uWzFdLW5bMF0sdT1yL2UsaT10YS5iaXNlY3QoVmwsdSk7cmV0dXJuIGk9PVZsLmxlbmd0aD9bdC55ZWFyLFZpKG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLzMxNTM2ZTZ9KSxlKVsyXV06aT90W3UvVmxbaS0xXTxWbFtpXS91P2ktMTppXTpbQmwsVmkobixlKVsyXV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBLbyhuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbih0KSxyKTpuLmRvbWFpbigpLm1hcChLbyl9LHIubmljZT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIWlzTmFOKGUpJiYhbi5yYW5nZShlLEtvKCtlKzEpLHQpLmxlbmd0aH12YXIgaT1yLmRvbWFpbigpLG89UGkoaSksYT1udWxsPT1uP3UobywxMCk6Im51bWJlciI9PXR5cGVvZiBuJiZ1KG8sbik7cmV0dXJuIGEmJihuPWFbMF0sdD1hWzFdKSxyLmRvbWFpbihGaShpLHQ+MT97Zmxvb3I6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5mbG9vcih0KSk7KXQ9S28odC0xKTtyZXR1cm4gdH0sY2VpbDpmdW5jdGlvbih0KXtmb3IoO2UodD1uLmNlaWwodCkpOyl0PUtvKCt0KzEpO3JldHVybiB0fX06bikpfSxyLnRpY2tzPWZ1bmN0aW9uKG4sdCl7dmFyIGU9UGkoci5kb21haW4oKSksaT1udWxsPT1uP3UoZSwxMCk6Im51bWJlciI9PXR5cGVvZiBuP3UoZSxuKTohbi5yYW5nZSYmW3tyYW5nZTpufSx0XTtyZXR1cm4gaSYmKG49aVswXSx0PWlbMV0pLG4ucmFuZ2UoZVswXSxLbygrZVsxXSsxKSwxPnQ/MTp0KX0sci50aWNrRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBHbyhuLmNvcHkoKSx0LGUpfSxZaShyLG4pfWZ1bmN0aW9uIEtvKG4pe3JldHVybiBuZXcgRGF0ZShuKX1mdW5jdGlvbiBRbyhuKXtyZXR1cm4gSlNPTi5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gbmEobil7dmFyIHQ9dWEuY3JlYXRlUmFuZ2UoKTtyZXR1cm4gdC5zZWxlY3ROb2RlKHVhLmJvZHkpLHQuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KG4ucmVzcG9uc2VUZXh0KX12YXIgdGE9e3ZlcnNpb246IjMuNS41In0sZWE9W10uc2xpY2UscmE9ZnVuY3Rpb24obil7cmV0dXJuIGVhLmNhbGwobil9LHVhPXRoaXMuZG9jdW1lbnQ7aWYodWEpdHJ5e3JhKHVhLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKVswXS5ub2RlVHlwZX1jYXRjaChpYSl7cmE9ZnVuY3Rpb24obil7Zm9yKHZhciB0PW4ubGVuZ3RoLGU9bmV3IEFycmF5KHQpO3QtLTspZVt0XT1uW3RdO3JldHVybiBlfX1pZihEYXRlLm5vd3x8KERhdGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSksdWEpdHJ5e3VhLmNyZWF0ZUVsZW1lbnQoIkRJViIpLnN0eWxlLnNldFByb3BlcnR5KCJvcGFjaXR5IiwwLCIiKX1jYXRjaChvYSl7dmFyIGFhPXRoaXMuRWxlbWVudC5wcm90b3R5cGUsY2E9YWEuc2V0QXR0cmlidXRlLGxhPWFhLnNldEF0dHJpYnV0ZU5TLHNhPXRoaXMuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsZmE9c2Euc2V0UHJvcGVydHk7YWEuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKG4sdCl7Y2EuY2FsbCh0aGlzLG4sdCsiIil9LGFhLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKG4sdCxlKXtsYS5jYWxsKHRoaXMsbix0LGUrIiIpfSxzYS5zZXRQcm9wZXJ0eT1mdW5jdGlvbihuLHQsZSl7ZmEuY2FsbCh0aGlzLG4sdCsiIixlKX19dGEuYXNjZW5kaW5nPWUsdGEuZGVzY2VuZGluZz1mdW5jdGlvbihuLHQpe3JldHVybiBuPnQ/LTE6dD5uPzE6dD49bj8wOjAvMH0sdGEubWluPWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPW5bdV0pJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9blt1XSkmJmU+ciYmKGU9cil9ZWxzZXtmb3IoOysrdTxpOylpZihudWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZlPnImJihlPXIpfXJldHVybiBlfSx0YS5tYXg9ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmcj5lJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+ZSYmKGU9cil9cmV0dXJuIGV9LHRhLmV4dGVudD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdSxpPS0xLG89bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytpPG87KWlmKG51bGwhPShyPW5baV0pJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxvOyludWxsIT0ocj1uW2ldKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9ZWxzZXtmb3IoOysraTxvOylpZihudWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmcj49cil7ZT11PXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9dC5jYWxsKG4sbltpXSxpKSkmJihlPnImJihlPXIpLHI+dSYmKHU9cikpfXJldHVybltlLHVdfSx0YS5zdW09ZnVuY3Rpb24obix0KXt2YXIgZSxyPTAsaT1uLmxlbmd0aCxvPS0xO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KytvPGk7KXUoZT0rbltvXSkmJihyKz1lKTtlbHNlIGZvcig7KytvPGk7KXUoZT0rdC5jYWxsKG4sbltvXSxvKSkmJihyKz1lKTtyZXR1cm4gcn0sdGEubWVhbj1mdW5jdGlvbihuLHQpe3ZhciBlLGk9MCxvPW4ubGVuZ3RoLGE9LTEsYz1vO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KythPG87KXUoZT1yKG5bYV0pKT9pKz1lOi0tYztlbHNlIGZvcig7KythPG87KXUoZT1yKHQuY2FsbChuLG5bYV0sYSkpKT9pKz1lOi0tYztyZXR1cm4gYz9pL2M6dm9pZCAwfSx0YS5xdWFudGlsZT1mdW5jdGlvbihuLHQpe3ZhciBlPShuLmxlbmd0aC0xKSp0KzEscj1NYXRoLmZsb29yKGUpLHU9K25bci0xXSxpPWUtcjtyZXR1cm4gaT91K2kqKG5bcl0tdSk6dX0sdGEubWVkaWFuPWZ1bmN0aW9uKG4sdCl7dmFyIGksbz1bXSxhPW4ubGVuZ3RoLGM9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2M8YTspdShpPXIobltjXSkpJiZvLnB1c2goaSk7ZWxzZSBmb3IoOysrYzxhOyl1KGk9cih0LmNhbGwobixuW2NdLGMpKSkmJm8ucHVzaChpKTtyZXR1cm4gby5sZW5ndGg/dGEucXVhbnRpbGUoby5zb3J0KGUpLC41KTp2b2lkIDB9LHRhLnZhcmlhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUsaSxvPW4ubGVuZ3RoLGE9MCxjPTAsbD0tMSxzPTA7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2w8bzspdShlPXIobltsXSkpJiYoaT1lLWEsYSs9aS8rK3MsYys9aSooZS1hKSk7ZWxzZSBmb3IoOysrbDxvOyl1KGU9cih0LmNhbGwobixuW2xdLGwpKSkmJihpPWUtYSxhKz1pLysrcyxjKz1pKihlLWEpKTtyZXR1cm4gcz4xP2MvKHMtMSk6dm9pZCAwfSx0YS5kZXZpYXRpb249ZnVuY3Rpb24oKXt2YXIgbj10YS52YXJpYW5jZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4/TWF0aC5zcXJ0KG4pOm59O3ZhciBoYT1pKGUpO3RhLmJpc2VjdExlZnQ9aGEubGVmdCx0YS5iaXNlY3Q9dGEuYmlzZWN0UmlnaHQ9aGEucmlnaHQsdGEuYmlzZWN0b3I9ZnVuY3Rpb24obil7cmV0dXJuIGkoMT09PW4ubGVuZ3RoP2Z1bmN0aW9uKHQscil7cmV0dXJuIGUobih0KSxyKX06bil9LHRhLnNodWZmbGU9ZnVuY3Rpb24obix0LGUpeyhpPWFyZ3VtZW50cy5sZW5ndGgpPDMmJihlPW4ubGVuZ3RoLDI+aSYmKHQ9MCkpO2Zvcih2YXIgcix1LGk9ZS10O2k7KXU9TWF0aC5yYW5kb20oKSppLS18MCxyPW5baSt0XSxuW2krdF09blt1K3RdLG5bdSt0XT1yO3JldHVybiBufSx0YS5wZXJtdXRlPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT1uW3RbZV1dO3JldHVybiByfSx0YS5wYWlycz1mdW5jdGlvbihuKXtmb3IodmFyIHQsZT0wLHI9bi5sZW5ndGgtMSx1PW5bMF0saT1uZXcgQXJyYXkoMD5yPzA6cik7cj5lOylpW2VdPVt0PXUsdT1uWysrZV1dO3JldHVybiBpfSx0YS56aXA9ZnVuY3Rpb24oKXtpZighKHI9YXJndW1lbnRzLmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLHQ9dGEubWluKGFyZ3VtZW50cyxvKSxlPW5ldyBBcnJheSh0KTsrK248dDspZm9yKHZhciByLHU9LTEsaT1lW25dPW5ldyBBcnJheShyKTsrK3U8cjspaVt1XT1hcmd1bWVudHNbdV1bbl07cmV0dXJuIGV9LHRhLnRyYW5zcG9zZT1mdW5jdGlvbihuKXtyZXR1cm4gdGEuemlwLmFwcGx5KHRhLG4pfSx0YS5rZXlzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChlKTtyZXR1cm4gdH0sdGEudmFsdWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChuW2VdKTtyZXR1cm4gdH0sdGEuZW50cmllcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goe2tleTplLHZhbHVlOm5bZV19KTtyZXR1cm4gdH0sdGEubWVyZ2U9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1PW4ubGVuZ3RoLGk9LTEsbz0wOysraTx1OylvKz1uW2ldLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobyk7LS11Pj0wOylmb3Iocj1uW3VdLHQ9ci5sZW5ndGg7LS10Pj0wOyllWy0tb109clt0XTtyZXR1cm4gZX07dmFyIGdhPU1hdGguYWJzO3RhLnJhbmdlPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPTEsYXJndW1lbnRzLmxlbmd0aDwyJiYodD1uLG49MCkpLCh0LW4pL2U9PT0xLzApdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpO3ZhciByLHU9W10saT1hKGdhKGUpKSxvPS0xO2lmKG4qPWksdCo9aSxlKj1pLDA+ZSlmb3IoOyhyPW4rZSorK28pPnQ7KXUucHVzaChyL2kpO2Vsc2UgZm9yKDsocj1uK2UqKytvKTx0Oyl1LnB1c2goci9pKTtyZXR1cm4gdX0sdGEubWFwPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bmV3IGw7aWYobiBpbnN0YW5jZW9mIGwpbi5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7ZS5zZXQobix0KX0pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShuKSl7dmFyIHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7Kyt1PGk7KWUuc2V0KHUsblt1XSk7ZWxzZSBmb3IoOysrdTxpOyllLnNldCh0LmNhbGwobixyPW5bdV0sdSkscil9ZWxzZSBmb3IodmFyIG8gaW4gbillLnNldChvLG5bb10pO3JldHVybiBlfTt2YXIgcGE9Il9fcHJvdG9fXyIsdmE9Ilx4MDAiO2MobCx7aGFzOmgsZ2V0OmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bcyhuKV19LHNldDpmdW5jdGlvbihuLHQpe3JldHVybiB0aGlzLl9bcyhuKV09dH0scmVtb3ZlOmcsa2V5czpwLHZhbHVlczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHRoaXMuX1t0XSk7cmV0dXJuIG59LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaCh7a2V5OmYodCksdmFsdWU6dGhpcy5fW3RdfSk7cmV0dXJuIG59LHNpemU6dixlbXB0eTpkLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxmKHQpLHRoaXMuX1t0XSl9fSksdGEubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxvLGEpe2lmKGE+PWkubGVuZ3RoKXJldHVybiByP3IuY2FsbCh1LG8pOmU/by5zb3J0KGUpOm87Zm9yKHZhciBjLHMsZixoLGc9LTEscD1vLmxlbmd0aCx2PWlbYSsrXSxkPW5ldyBsOysrZzxwOykoaD1kLmdldChjPXYocz1vW2ddKSkpP2gucHVzaChzKTpkLnNldChjLFtzXSk7cmV0dXJuIHQ/KHM9dCgpLGY9ZnVuY3Rpb24oZSxyKXtzLnNldChlLG4odCxyLGEpKX0pOihzPXt9LGY9ZnVuY3Rpb24oZSxyKXtzW2VdPW4odCxyLGEpfSksZC5mb3JFYWNoKGYpLHN9ZnVuY3Rpb24gdChuLGUpe2lmKGU+PWkubGVuZ3RoKXJldHVybiBuO3ZhciByPVtdLHU9b1tlKytdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obix1KXtyLnB1c2goe2tleTpuLHZhbHVlczp0KHUsZSl9KX0pLHU/ci5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHUobi5rZXksdC5rZXkpfSk6cn12YXIgZSxyLHU9e30saT1bXSxvPVtdO3JldHVybiB1Lm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBuKGUsdCwwKX0sdS5lbnRyaWVzPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4odGEubWFwLGUsMCksMCl9LHUua2V5PWZ1bmN0aW9uKG4pe3JldHVybiBpLnB1c2gobiksdX0sdS5zb3J0S2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gb1tpLmxlbmd0aC0xXT1uLHV9LHUuc29ydFZhbHVlcz1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLHV9LHUucm9sbHVwPWZ1bmN0aW9uKG4pe3JldHVybiByPW4sdX0sdX0sdGEuc2V0PWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBtO2lmKG4pZm9yKHZhciBlPTAscj1uLmxlbmd0aDtyPmU7KytlKXQuYWRkKG5bZV0pO3JldHVybiB0fSxjKG0se2hhczpoLGFkZDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fW3Mobis9IiIpXT0hMCxufSxyZW1vdmU6Zyx2YWx1ZXM6cCxzaXplOnYsZW1wdHk6ZCxmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5jYWxsKHRoaXMsZih0KSl9fSksdGEuYmVoYXZpb3I9e30sdGEucmViaW5kPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlLHI9MSx1PWFyZ3VtZW50cy5sZW5ndGg7KytyPHU7KW5bZT1hcmd1bWVudHNbcl1dPU0obix0LHRbZV0pO3JldHVybiBufTt2YXIgZGE9WyJ3ZWJraXQiLCJtcyIsIm1veiIsIk1veiIsIm8iLCJPIl07dGEuZGlzcGF0Y2g9ZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IF8sdD0tMSxlPWFyZ3VtZW50cy5sZW5ndGg7Kyt0PGU7KW5bYXJndW1lbnRzW3RdXT13KG4pO3JldHVybiBufSxfLnByb3RvdHlwZS5vbj1mdW5jdGlvbihuLHQpe3ZhciBlPW4uaW5kZXhPZigiLiIpLHI9IiI7aWYoZT49MCYmKHI9bi5zbGljZShlKzEpLG49bi5zbGljZSgwLGUpKSxuKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1tuXS5vbihyKTp0aGlzW25dLm9uKHIsdCk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PXQpZm9yKG4gaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KG4pJiZ0aGlzW25dLm9uKHIsbnVsbCk7cmV0dXJuIHRoaXN9fSx0YS5ldmVudD1udWxsLHRhLnJlcXVvdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZShtYSwiXFwkJiIpfTt2YXIgbWE9L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLHlhPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbihuLHQpe24uX19wcm90b19fPXR9OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlIGluIHQpbltlXT10W2VdfSxNYT1mdW5jdGlvbihuLHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3Iobil9LHhhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChuKX0sYmE9ZnVuY3Rpb24obix0KXt2YXIgZT1uLm1hdGNoZXN8fG5beChuLCJtYXRjaGVzU2VsZWN0b3IiKV07cmV0dXJuKGJhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGUuY2FsbChuLHQpfSkobix0KX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKE1hPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFNpenpsZShuLHQpWzBdfHxudWxsfSx4YT1TaXp6bGUsYmE9U2l6emxlLm1hdGNoZXNTZWxlY3RvciksdGEuc2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNlbGVjdCh1YS5kb2N1bWVudEVsZW1lbnQpfTt2YXIgX2E9dGEuc2VsZWN0aW9uLnByb3RvdHlwZT1bXTtfYS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaT1bXTtuPU4obik7Zm9yKHZhciBvPS0xLGE9dGhpcy5sZW5ndGg7KytvPGE7KXtpLnB1c2godD1bXSksdC5wYXJlbnROb2RlPShyPXRoaXNbb10pLnBhcmVudE5vZGU7Zm9yKHZhciBjPS0xLGw9ci5sZW5ndGg7KytjPGw7KSh1PXJbY10pPyh0LnB1c2goZT1uLmNhbGwodSx1Ll9fZGF0YV9fLGMsbykpLGUmJiJfX2RhdGFfXyJpbiB1JiYoZS5fX2RhdGFfXz11Ll9fZGF0YV9fKSk6dC5wdXNoKG51bGwpfXJldHVybiBBKGkpfSxfYS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyPVtdO249QyhuKTtmb3IodmFyIHU9LTEsaT10aGlzLmxlbmd0aDsrK3U8aTspZm9yKHZhciBvPXRoaXNbdV0sYT0tMSxjPW8ubGVuZ3RoOysrYTxjOykoZT1vW2FdKSYmKHIucHVzaCh0PXJhKG4uY2FsbChlLGUuX19kYXRhX18sYSx1KSkpLHQucGFyZW50Tm9kZT1lKTtyZXR1cm4gQShyKX07dmFyIHdhPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTt0YS5ucz17cHJlZml4OndhLHF1YWxpZnk6ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCI6IiksZT1uO3JldHVybiB0Pj0wJiYoZT1uLnNsaWNlKDAsdCksbj1uLnNsaWNlKHQrMSkpLHdhLmhhc093blByb3BlcnR5KGUpP3tzcGFjZTp3YVtlXSxsb2NhbDpufTpufX0sX2EuYXR0cj1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgZT10aGlzLm5vZGUoKTtyZXR1cm4gbj10YS5ucy5xdWFsaWZ5KG4pLG4ubG9jYWw/ZS5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOmUuZ2V0QXR0cmlidXRlKG4pfWZvcih0IGluIG4pdGhpcy5lYWNoKHoodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaCh6KG4sdCkpfSxfYS5jbGFzc2VkPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpLHI9KG49VChuKSkubGVuZ3RoLHU9LTE7aWYodD1lLmNsYXNzTGlzdCl7Zm9yKDsrK3U8cjspaWYoIXQuY29udGFpbnMoblt1XSkpcmV0dXJuITF9ZWxzZSBmb3IodD1lLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsrK3U8cjspaWYoIUwoblt1XSkudGVzdCh0KSlyZXR1cm4hMTtyZXR1cm4hMH1mb3IodCBpbiBuKXRoaXMuZWFjaChSKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goUihuLHQpKX0sX2Euc3R5bGU9ZnVuY3Rpb24obixlLHIpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg7aWYoMz51KXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+dSYmKGU9IiIpO2ZvcihyIGluIG4pdGhpcy5lYWNoKFAocixuW3JdLGUpKTtyZXR1cm4gdGhpc31pZigyPnUpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiB0KGkpLmdldENvbXB1dGVkU3R5bGUoaSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfXI9IiJ9cmV0dXJuIHRoaXMuZWFjaChQKG4sZSxyKSl9LF9hLnByb3BlcnR5PWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pcmV0dXJuIHRoaXMubm9kZSgpW25dO2Zvcih0IGluIG4pdGhpcy5lYWNoKFUodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChVKG4sdCkpfSxfYS50ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09dD8iIjp0fTpudWxsPT1uP2Z1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD0iIn06ZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PW59KTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0sX2EuaHRtbD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oKXt2YXIgdD1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT10PyIiOnR9Om51bGw9PW4/ZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD0iIn06ZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD1ufSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxfYS5hcHBlbmQ9ZnVuY3Rpb24obil7cmV0dXJuIG49aihuKSx0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pfSxfYS5pbnNlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gbj1qKG4pLHQ9Tih0KSx0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0sX2EucmVtb3ZlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChGKX0sX2EuZGF0YT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcix1LGksbz1uLmxlbmd0aCxmPWUubGVuZ3RoLGg9TWF0aC5taW4obyxmKSxnPW5ldyBBcnJheShmKSxwPW5ldyBBcnJheShmKSx2PW5ldyBBcnJheShvKTtpZih0KXt2YXIgZCxtPW5ldyBsLHk9bmV3IEFycmF5KG8pO2ZvcihyPS0xOysrcjxvOyltLmhhcyhkPXQuY2FsbCh1PW5bcl0sdS5fX2RhdGFfXyxyKSk/dltyXT11Om0uc2V0KGQsdSkseVtyXT1kO2ZvcihyPS0xOysrcjxmOykodT1tLmdldChkPXQuY2FsbChlLGk9ZVtyXSxyKSkpP3UhPT0hMCYmKGdbcl09dSx1Ll9fZGF0YV9fPWkpOnBbcl09SChpKSxtLnNldChkLCEwKTtmb3Iocj0tMTsrK3I8bzspbS5nZXQoeVtyXSkhPT0hMCYmKHZbcl09bltyXSl9ZWxzZXtmb3Iocj0tMTsrK3I8aDspdT1uW3JdLGk9ZVtyXSx1Pyh1Ll9fZGF0YV9fPWksZ1tyXT11KTpwW3JdPUgoaSk7Zm9yKDtmPnI7KytyKXBbcl09SChlW3JdKTtmb3IoO28+cjsrK3IpdltyXT1uW3JdfXAudXBkYXRlPWcscC5wYXJlbnROb2RlPWcucGFyZW50Tm9kZT12LnBhcmVudE5vZGU9bi5wYXJlbnROb2RlLGEucHVzaChwKSxjLnB1c2goZykscy5wdXNoKHYpfXZhciByLHUsaT0tMSxvPXRoaXMubGVuZ3RoO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtmb3Iobj1uZXcgQXJyYXkobz0ocj10aGlzWzBdKS5sZW5ndGgpOysraTxvOykodT1yW2ldKSYmKG5baV09dS5fX2RhdGFfXyk7cmV0dXJuIG59dmFyIGE9WihbXSksYz1BKFtdKSxzPUEoW10pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKWZvcig7KytpPG87KWUocj10aGlzW2ldLG4uY2FsbChyLHIucGFyZW50Tm9kZS5fX2RhdGFfXyxpKSk7ZWxzZSBmb3IoOysraTxvOyllKHI9dGhpc1tpXSxuKTtyZXR1cm4gYy5lbnRlcj1mdW5jdGlvbigpe3JldHVybiBhfSxjLmV4aXQ9ZnVuY3Rpb24oKXtyZXR1cm4gc30sY30sX2EuZGF0dW09ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLG4pOnRoaXMucHJvcGVydHkoIl9fZGF0YV9fIil9LF9hLmZpbHRlcj1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49TyhuKSk7Zm9yKHZhciBpPTAsbz10aGlzLmxlbmd0aDtvPmk7aSsrKXt1LnB1c2godD1bXSksdC5wYXJlbnROb2RlPShlPXRoaXNbaV0pLnBhcmVudE5vZGU7Zm9yKHZhciBhPTAsYz1lLmxlbmd0aDtjPmE7YSsrKShyPWVbYV0pJiZuLmNhbGwocixyLl9fZGF0YV9fLGEsaSkmJnQucHVzaChyKX1yZXR1cm4gQSh1KX0sX2Eub3JkZXI9ZnVuY3Rpb24oKXtmb3IodmFyIG49LTEsdD10aGlzLmxlbmd0aDsrK248dDspZm9yKHZhciBlLHI9dGhpc1tuXSx1PXIubGVuZ3RoLTEsaT1yW3VdOy0tdT49MDspKGU9clt1XSkmJihpJiZpIT09ZS5uZXh0U2libGluZyYmaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGkpLGk9ZSk7cmV0dXJuIHRoaXN9LF9hLnNvcnQ9ZnVuY3Rpb24obil7bj1JLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtmb3IodmFyIHQ9LTEsZT10aGlzLmxlbmd0aDsrK3Q8ZTspdGhpc1t0XS5zb3J0KG4pO3JldHVybiB0aGlzLm9yZGVyKCl9LF9hLmVhY2g9ZnVuY3Rpb24obil7cmV0dXJuIFkodGhpcyxmdW5jdGlvbih0LGUscil7bi5jYWxsKHQsdC5fX2RhdGFfXyxlLHIpfSl9LF9hLmNhbGw9ZnVuY3Rpb24obil7dmFyIHQ9cmEoYXJndW1lbnRzKTtyZXR1cm4gbi5hcHBseSh0WzBdPXRoaXMsdCksdGhpc30sX2EuZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LF9hLm5vZGU9ZnVuY3Rpb24oKXtmb3IodmFyIG49MCx0PXRoaXMubGVuZ3RoO3Q+bjtuKyspZm9yKHZhciBlPXRoaXNbbl0scj0wLHU9ZS5sZW5ndGg7dT5yO3IrKyl7dmFyIGk9ZVtyXTtpZihpKXJldHVybiBpfXJldHVybiBudWxsfSxfYS5zaXplPWZ1bmN0aW9uKCl7dmFyIG49MDtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKCl7KytufSksbn07dmFyIFNhPVtdO3RhLnNlbGVjdGlvbi5lbnRlcj1aLHRhLnNlbGVjdGlvbi5lbnRlci5wcm90b3R5cGU9U2EsU2EuYXBwZW5kPV9hLmFwcGVuZCxTYS5lbXB0eT1fYS5lbXB0eSxTYS5ub2RlPV9hLm5vZGUsU2EuY2FsbD1fYS5jYWxsLFNhLnNpemU9X2Euc2l6ZSxTYS5zZWxlY3Q9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1LGksbz1bXSxhPS0xLGM9dGhpcy5sZW5ndGg7KythPGM7KXtyPSh1PXRoaXNbYV0pLnVwZGF0ZSxvLnB1c2godD1bXSksdC5wYXJlbnROb2RlPXUucGFyZW50Tm9kZTtmb3IodmFyIGw9LTEscz11Lmxlbmd0aDsrK2w8czspKGk9dVtsXSk/KHQucHVzaChyW2xdPWU9bi5jYWxsKHUucGFyZW50Tm9kZSxpLl9fZGF0YV9fLGwsYSkpLGUuX19kYXRhX189aS5fX2RhdGFfXyk6dC5wdXNoKG51bGwpfXJldHVybiBBKG8pfSxTYS5pbnNlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD1WKHRoaXMpKSxfYS5pbnNlcnQuY2FsbCh0aGlzLG4sdCl9LHRhLnNlbGVjdD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/KGU9W01hKHQsdWEpXSxlLnBhcmVudE5vZGU9dWEuZG9jdW1lbnRFbGVtZW50KTooZT1bdF0sZS5wYXJlbnROb2RlPW4odCkpLEEoW2VdKX0sdGEuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0O3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8odD1yYSh4YShuLHVhKSksdC5wYXJlbnROb2RlPXVhLmRvY3VtZW50RWxlbWVudCk6KHQ9bix0LnBhcmVudE5vZGU9bnVsbCksQShbdF0pfSxfYS5vbj1mdW5jdGlvbihuLHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDtpZigzPnIpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj5yJiYodD0hMSk7Zm9yKGUgaW4gbil0aGlzLmVhY2goWChlLG5bZV0sdCkpO3JldHVybiB0aGlzfWlmKDI+cilyZXR1cm4ocj10aGlzLm5vZGUoKVsiX19vbiIrbl0pJiZyLl87ZT0hMX1yZXR1cm4gdGhpcy5lYWNoKFgobix0LGUpKX07dmFyIGthPXRhLm1hcCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KTt1YSYma2EuZm9yRWFjaChmdW5jdGlvbihuKXsib24iK24gaW4gdWEmJmthLnJlbW92ZShuKX0pO3ZhciBFYSxBYT0wO3RhLm1vdXNlPWZ1bmN0aW9uKG4pe3JldHVybiBKKG4saygpKX07dmFyIE5hPXRoaXMubmF2aWdhdG9yJiYvV2ViS2l0Ly50ZXN0KHRoaXMubmF2aWdhdG9yLnVzZXJBZ2VudCk/LTE6MDt0YS50b3VjaD1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT10LHQ9aygpLmNoYW5nZWRUb3VjaGVzKSx0KWZvcih2YXIgcix1PTAsaT10Lmxlbmd0aDtpPnU7Kyt1KWlmKChyPXRbdV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBKKG4scil9LHRhLmJlaGF2aW9yLmRyYWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dGhpcy5vbigibW91c2Vkb3duLmRyYWciLGkpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLG8pfWZ1bmN0aW9uIGUobix0LGUsaSxvKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIG4sZSxyPXQoaCx2KTtyJiYobj1yWzBdLU1bMF0sZT1yWzFdLU1bMV0scHw9bnxlLE09cixnKHt0eXBlOiJkcmFnIix4OnJbMF0rbFswXSx5OnJbMV0rbFsxXSxkeDpuLGR5OmV9KSl9ZnVuY3Rpb24gYygpe3QoaCx2KSYmKG0ub24oaStkLG51bGwpLm9uKG8rZCxudWxsKSx5KHAmJnRhLmV2ZW50LnRhcmdldD09PWYpLGcoe3R5cGU6ImRyYWdlbmQifSkpfXZhciBsLHM9dGhpcyxmPXRhLmV2ZW50LnRhcmdldCxoPXMucGFyZW50Tm9kZSxnPXIub2Yocyxhcmd1bWVudHMpLHA9MCx2PW4oKSxkPSIuZHJhZyIrKG51bGw9PXY/IiI6Ii0iK3YpLG09dGEuc2VsZWN0KGUoZikpLm9uKGkrZCxhKS5vbihvK2QsYykseT1XKGYpLE09dChoLHYpO3U/KGw9dS5hcHBseShzLGFyZ3VtZW50cyksbD1bbC54LU1bMF0sbC55LU1bMV1dKTpsPVswLDBdLGcoe3R5cGU6ImRyYWdzdGFydCJ9KX19dmFyIHI9RShuLCJkcmFnIiwiZHJhZ3N0YXJ0IiwiZHJhZ2VuZCIpLHU9bnVsbCxpPWUoYix0YS5tb3VzZSx0LCJtb3VzZW1vdmUiLCJtb3VzZXVwIiksbz1lKEcsdGEudG91Y2gseSwidG91Y2htb3ZlIiwidG91Y2hlbmQiKTtyZXR1cm4gbi5vcmlnaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSx0YS5yZWJpbmQobixyLCJvbiIpfSx0YS50b3VjaGVzPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9aygpLnRvdWNoZXMpLHQ/cmEodCkubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPUoobix0KTtyZXR1cm4gZS5pZGVudGlmaWVyPXQuaWRlbnRpZmllcixlfSk6W119O3ZhciBDYT0xZS02LHphPUNhKkNhLHFhPU1hdGguUEksTGE9MipxYSxUYT1MYS1DYSxSYT1xYS8yLERhPXFhLzE4MCxQYT0xODAvcWEsVWE9TWF0aC5TUVJUMixqYT0yLEZhPTQ7dGEuaW50ZXJwb2xhdGVab29tPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuKXt2YXIgdD1uKnk7aWYobSl7dmFyIGU9cnQodiksbz1pLyhqYSpoKSooZSp1dChVYSp0K3YpLWV0KHYpKTtyZXR1cm5bcitvKmwsdStvKnMsaSplL3J0KFVhKnQrdildfXJldHVybltyK24qbCx1K24qcyxpKk1hdGguZXhwKFVhKnQpXX12YXIgcj1uWzBdLHU9blsxXSxpPW5bMl0sbz10WzBdLGE9dFsxXSxjPXRbMl0sbD1vLXIscz1hLXUsZj1sKmwrcypzLGg9TWF0aC5zcXJ0KGYpLGc9KGMqYy1pKmkrRmEqZikvKDIqaSpqYSpoKSxwPShjKmMtaSppLUZhKmYpLygyKmMqamEqaCksdj1NYXRoLmxvZyhNYXRoLnNxcnQoZypnKzEpLWcpLGQ9TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSxtPWQtdix5PShtfHxNYXRoLmxvZyhjL2kpKS9VYTtyZXR1cm4gZS5kdXJhdGlvbj0xZTMqeSxlfSx0YS5iZWhhdmlvci56b29tPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLm9uKHEsZikub24oT2ErIi56b29tIixnKS5vbigiZGJsY2xpY2suem9vbSIscCkub24oUixoKX1mdW5jdGlvbiBlKG4pe3JldHVyblsoblswXS1rLngpL2suaywoblsxXS1rLnkpL2sua119ZnVuY3Rpb24gcihuKXtyZXR1cm5bblswXSprLmsray54LG5bMV0qay5rK2sueV19ZnVuY3Rpb24gdShuKXtrLms9TWF0aC5tYXgoTlswXSxNYXRoLm1pbihOWzFdLG4pKX1mdW5jdGlvbiBpKG4sdCl7dD1yKHQpLGsueCs9blswXS10WzBdLGsueSs9blsxXS10WzFdfWZ1bmN0aW9uIG8odCxlLHIsbyl7dC5fX2NoYXJ0X189e3g6ay54LHk6ay55LGs6ay5rfSx1KE1hdGgucG93KDIsbykpLGkoZD1lLHIpLHQ9dGEuc2VsZWN0KHQpLEM+MCYmKHQ9dC50cmFuc2l0aW9uKCkuZHVyYXRpb24oQykpLHQuY2FsbChuLmV2ZW50KX1mdW5jdGlvbiBhKCl7YiYmYi5kb21haW4oeC5yYW5nZSgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi1rLngpL2sua30pLm1hcCh4LmludmVydCkpLHcmJncuZG9tYWluKF8ucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tay55KS9rLmt9KS5tYXAoXy5pbnZlcnQpKX1mdW5jdGlvbiBjKG4pe3orK3x8bih7dHlwZToiem9vbXN0YXJ0In0pfWZ1bmN0aW9uIGwobil7YSgpLG4oe3R5cGU6Inpvb20iLHNjYWxlOmsuayx0cmFuc2xhdGU6W2sueCxrLnldfSl9ZnVuY3Rpb24gcyhuKXstLXp8fG4oe3R5cGU6Inpvb21lbmQifSksZD1udWxsfWZ1bmN0aW9uIGYoKXtmdW5jdGlvbiBuKCl7Zj0xLGkodGEubW91c2UodSksZyksbChhKX1mdW5jdGlvbiByKCl7aC5vbihMLG51bGwpLm9uKFQsbnVsbCkscChmJiZ0YS5ldmVudC50YXJnZXQ9PT1vKSxzKGEpfXZhciB1PXRoaXMsbz10YS5ldmVudC50YXJnZXQsYT1ELm9mKHUsYXJndW1lbnRzKSxmPTAsaD10YS5zZWxlY3QodCh1KSkub24oTCxuKS5vbihULHIpLGc9ZSh0YS5tb3VzZSh1KSkscD1XKHUpO0RsLmNhbGwodSksYyhhKX1mdW5jdGlvbiBoKCl7ZnVuY3Rpb24gbigpe3ZhciBuPXRhLnRvdWNoZXMocCk7cmV0dXJuIGc9ay5rLG4uZm9yRWFjaChmdW5jdGlvbihuKXtuLmlkZW50aWZpZXIgaW4gZCYmKGRbbi5pZGVudGlmaWVyXT1lKG4pKX0pLG59ZnVuY3Rpb24gdCgpe3ZhciB0PXRhLmV2ZW50LnRhcmdldDt0YS5zZWxlY3QodCkub24oeCxyKS5vbihiLGEpLF8ucHVzaCh0KTtmb3IodmFyIGU9dGEuZXZlbnQuY2hhbmdlZFRvdWNoZXMsdT0wLGk9ZS5sZW5ndGg7aT51OysrdSlkW2VbdV0uaWRlbnRpZmllcl09bnVsbDt2YXIgYz1uKCksbD1EYXRlLm5vdygpO2lmKDE9PT1jLmxlbmd0aCl7aWYoNTAwPmwtTSl7dmFyIHM9Y1swXTtvKHAscyxkW3MuaWRlbnRpZmllcl0sTWF0aC5mbG9vcihNYXRoLmxvZyhrLmspL01hdGguTE4yKSsxKSxTKCl9TT1sfWVsc2UgaWYoYy5sZW5ndGg+MSl7dmFyIHM9Y1swXSxmPWNbMV0saD1zWzBdLWZbMF0sZz1zWzFdLWZbMV07bT1oKmgrZypnfX1mdW5jdGlvbiByKCl7dmFyIG4sdCxlLHIsbz10YS50b3VjaGVzKHApO0RsLmNhbGwocCk7Zm9yKHZhciBhPTAsYz1vLmxlbmd0aDtjPmE7KythLHI9bnVsbClpZihlPW9bYV0scj1kW2UuaWRlbnRpZmllcl0pe2lmKHQpYnJlYWs7bj1lLHQ9cn1pZihyKXt2YXIgcz0ocz1lWzBdLW5bMF0pKnMrKHM9ZVsxXS1uWzFdKSpzLGY9bSYmTWF0aC5zcXJ0KHMvbSk7bj1bKG5bMF0rZVswXSkvMiwoblsxXStlWzFdKS8yXSx0PVsodFswXStyWzBdKS8yLCh0WzFdK3JbMV0pLzJdLHUoZipnKX1NPW51bGwsaShuLHQpLGwodil9ZnVuY3Rpb24gYSgpe2lmKHRhLmV2ZW50LnRvdWNoZXMubGVuZ3RoKXtmb3IodmFyIHQ9dGEuZXZlbnQuY2hhbmdlZFRvdWNoZXMsZT0wLHI9dC5sZW5ndGg7cj5lOysrZSlkZWxldGUgZFt0W2VdLmlkZW50aWZpZXJdO2Zvcih2YXIgdSBpbiBkKXJldHVybiB2b2lkIG4oKX10YS5zZWxlY3RBbGwoXykub24oeSxudWxsKSx3Lm9uKHEsZikub24oUixoKSxFKCkscyh2KX12YXIgZyxwPXRoaXMsdj1ELm9mKHAsYXJndW1lbnRzKSxkPXt9LG09MCx5PSIuem9vbS0iK3RhLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIseD0idG91Y2htb3ZlIit5LGI9InRvdWNoZW5kIit5LF89W10sdz10YS5zZWxlY3QocCksRT1XKHApO3QoKSxjKHYpLHcub24ocSxudWxsKS5vbihSLHQpfWZ1bmN0aW9uIGcoKXt2YXIgbj1ELm9mKHRoaXMsYXJndW1lbnRzKTt5P2NsZWFyVGltZW91dCh5KToodj1lKGQ9bXx8dGEubW91c2UodGhpcykpLERsLmNhbGwodGhpcyksYyhuKSkseT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eT1udWxsLHMobil9LDUwKSxTKCksdShNYXRoLnBvdygyLC4wMDIqSGEoKSkqay5rKSxpKGQsdiksbChuKX1mdW5jdGlvbiBwKCl7dmFyIG49dGEubW91c2UodGhpcyksdD1NYXRoLmxvZyhrLmspL01hdGguTE4yO28odGhpcyxuLGUobiksdGEuZXZlbnQuc2hpZnRLZXk/TWF0aC5jZWlsKHQpLTE6TWF0aC5mbG9vcih0KSsxKX12YXIgdixkLG0seSxNLHgsYixfLHcsaz17eDowLHk6MCxrOjF9LEE9Wzk2MCw1MDBdLE49SWEsQz0yNTAsej0wLHE9Im1vdXNlZG93bi56b29tIixMPSJtb3VzZW1vdmUuem9vbSIsVD0ibW91c2V1cC56b29tIixSPSJ0b3VjaHN0YXJ0Lnpvb20iLEQ9RShuLCJ6b29tc3RhcnQiLCJ6b29tIiwiem9vbWVuZCIpO3JldHVybiBPYXx8KE9hPSJvbndoZWVsImluIHVhPyhIYT1mdW5jdGlvbigpe3JldHVybi10YS5ldmVudC5kZWx0YVkqKHRhLmV2ZW50LmRlbHRhTW9kZT8xMjA6MSl9LCJ3aGVlbCIpOiJvbm1vdXNld2hlZWwiaW4gdWE/KEhhPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLmV2ZW50LndoZWVsRGVsdGF9LCJtb3VzZXdoZWVsIik6KEhhPWZ1bmN0aW9uKCl7cmV0dXJuLXRhLmV2ZW50LmRldGFpbH0sIk1vek1vdXNlUGl4ZWxTY3JvbGwiKSksbi5ldmVudD1mdW5jdGlvbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1ELm9mKHRoaXMsYXJndW1lbnRzKSx0PWs7VGw/dGEuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC56b29tIixmdW5jdGlvbigpe2s9dGhpcy5fX2NoYXJ0X198fHt4OjAseTowLGs6MX0sYyhuKX0pLnR3ZWVuKCJ6b29tOnpvb20iLGZ1bmN0aW9uKCl7dmFyIGU9QVswXSxyPUFbMV0sdT1kP2RbMF06ZS8yLGk9ZD9kWzFdOnIvMixvPXRhLmludGVycG9sYXRlWm9vbShbKHUtay54KS9rLmssKGktay55KS9rLmssZS9rLmtdLFsodS10LngpL3QuaywoaS10LnkpL3QuayxlL3Qua10pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1vKHQpLGE9ZS9yWzJdO3RoaXMuX19jaGFydF9fPWs9e3g6dS1yWzBdKmEseTppLXJbMV0qYSxrOmF9LGwobil9fSkuZWFjaCgiaW50ZXJydXB0Lnpvb20iLGZ1bmN0aW9uKCl7cyhuKX0pLmVhY2goImVuZC56b29tIixmdW5jdGlvbigpe3Mobil9KToodGhpcy5fX2NoYXJ0X189ayxjKG4pLGwobikscyhuKSl9KX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGs9e3g6K3RbMF0seTordFsxXSxrOmsua30sYSgpLG4pOltrLngsay55XX0sbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDprLngseTprLnksazordH0sYSgpLG4pOmsua30sbi5zY2FsZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTj1udWxsPT10P0lhOlsrdFswXSwrdFsxXV0sbik6Tn0sbi5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09dCYmWyt0WzBdLCt0WzFdXSxuKTptfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEE9dCYmWyt0WzBdLCt0WzFdXSxuKTpBfSxuLmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhDPSt0LG4pOkN9LG4ueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10LHg9dC5jb3B5KCksaz17eDowLHk6MCxrOjF9LG4pOmJ9LG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz10LF89dC5jb3B5KCksaz17eDowLHk6MCxrOjF9LG4pOnd9LHRhLnJlYmluZChuLEQsIm9uIil9O3ZhciBIYSxPYSxJYT1bMCwxLzBdO3RhLmNvbG9yPW90LG90LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpKyIifSx0YS5oc2w9YXQ7dmFyIFlhPWF0LnByb3RvdHlwZT1uZXcgb3Q7WWEuYnJpZ2h0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBhdCh0aGlzLmgsdGhpcy5zLHRoaXMubC9uKX0sWWEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgYXQodGhpcy5oLHRoaXMucyxuKnRoaXMubCl9LFlhLnJnYj1mdW5jdGlvbigpe3JldHVybiBjdCh0aGlzLmgsdGhpcy5zLHRoaXMubCl9LHRhLmhjbD1sdDt2YXIgWmE9bHQucHJvdG90eXBlPW5ldyBvdDtaYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGx0KHRoaXMuaCx0aGlzLmMsTWF0aC5taW4oMTAwLHRoaXMubCtWYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LFphLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGx0KHRoaXMuaCx0aGlzLmMsTWF0aC5tYXgoMCx0aGlzLmwtVmEqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSkpfSxaYS5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gc3QodGhpcy5oLHRoaXMuYyx0aGlzLmwpLnJnYigpfSx0YS5sYWI9ZnQ7dmFyIFZhPTE4LFhhPS45NTA0NywkYT0xLEJhPTEuMDg4ODMsV2E9ZnQucHJvdG90eXBlPW5ldyBvdDtXYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGZ0KE1hdGgubWluKDEwMCx0aGlzLmwrVmEqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LFdhLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGZ0KE1hdGgubWF4KDAsdGhpcy5sLVZhKihhcmd1bWVudHMubGVuZ3RoP246MSkpLHRoaXMuYSx0aGlzLmIpfSxXYS5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gaHQodGhpcy5sLHRoaXMuYSx0aGlzLmIpfSx0YS5yZ2I9bXQ7dmFyIEphPW10LnByb3RvdHlwZT1uZXcgb3Q7SmEuYnJpZ2h0ZXI9ZnVuY3Rpb24obil7bj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSk7dmFyIHQ9dGhpcy5yLGU9dGhpcy5nLHI9dGhpcy5iLHU9MzA7cmV0dXJuIHR8fGV8fHI/KHQmJnU+dCYmKHQ9dSksZSYmdT5lJiYoZT11KSxyJiZ1PnImJihyPXUpLG5ldyBtdChNYXRoLm1pbigyNTUsdC9uKSxNYXRoLm1pbigyNTUsZS9uKSxNYXRoLm1pbigyNTUsci9uKSkpOm5ldyBtdCh1LHUsdSl9LEphLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IG10KG4qdGhpcy5yLG4qdGhpcy5nLG4qdGhpcy5iKX0sSmEuaHNsPWZ1bmN0aW9uKCl7cmV0dXJuIF90KHRoaXMucix0aGlzLmcsdGhpcy5iKX0sSmEudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIyIreHQodGhpcy5yKSt4dCh0aGlzLmcpK3h0KHRoaXMuYil9O3ZhciBHYT10YS5tYXAoe2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0pO0dhLmZvckVhY2goZnVuY3Rpb24obix0KXtHYS5zZXQobix5dCh0KSl9KSx0YS5mdW5jdG9yPUV0LHRhLnhocj1BdCh5KSx0YS5kc3Y9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSxpKXthcmd1bWVudHMubGVuZ3RoPDMmJihpPWUsZT1udWxsKTt2YXIgbz1OdChuLHQsbnVsbD09ZT9yOnUoZSksaSk7cmV0dXJuIG8ucm93PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP28ucmVzcG9uc2UobnVsbD09KGU9bik/cjp1KG4pKTplfSxvfWZ1bmN0aW9uIHIobil7cmV0dXJuIGUucGFyc2Uobi5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIHUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLnBhcnNlKHQucmVzcG9uc2VUZXh0LG4pfX1mdW5jdGlvbiBpKHQpe3JldHVybiB0Lm1hcChvKS5qb2luKG4pfWZ1bmN0aW9uIG8obil7cmV0dXJuIGEudGVzdChuKT8nIicrbi5yZXBsYWNlKC9cIi9nLCciIicpKyciJzpufXZhciBhPW5ldyBSZWdFeHAoJ1siJytuKyJcbl0iKSxjPW4uY2hhckNvZGVBdCgwKTtyZXR1cm4gZS5wYXJzZT1mdW5jdGlvbihuLHQpe3ZhciByO3JldHVybiBlLnBhcnNlUm93cyhuLGZ1bmN0aW9uKG4sZSl7aWYocilyZXR1cm4gcihuLGUtMSk7dmFyIHU9bmV3IEZ1bmN0aW9uKCJkIiwicmV0dXJuIHsiK24ubWFwKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG4pKyI6IGRbIit0KyJdIn0pLmpvaW4oIiwiKSsifSIpO3I9dD9mdW5jdGlvbihuLGUpe3JldHVybiB0KHUobiksZSl9OnV9KX0sZS5wYXJzZVJvd3M9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKCl7aWYocz49bClyZXR1cm4gbztpZih1KXJldHVybiB1PSExLGk7dmFyIHQ9cztpZigzND09PW4uY2hhckNvZGVBdCh0KSl7Zm9yKHZhciBlPXQ7ZSsrPGw7KWlmKDM0PT09bi5jaGFyQ29kZUF0KGUpKXtpZigzNCE9PW4uY2hhckNvZGVBdChlKzEpKWJyZWFrOysrZX1zPWUrMjt2YXIgcj1uLmNoYXJDb2RlQXQoZSsxKTtyZXR1cm4gMTM9PT1yPyh1PSEwLDEwPT09bi5jaGFyQ29kZUF0KGUrMikmJisrcyk6MTA9PT1yJiYodT0hMCksbi5zbGljZSh0KzEsZSkucmVwbGFjZSgvIiIvZywnIicpfWZvcig7bD5zOyl7dmFyIHI9bi5jaGFyQ29kZUF0KHMrKyksYT0xO2lmKDEwPT09cil1PSEwO2Vsc2UgaWYoMTM9PT1yKXU9ITAsMTA9PT1uLmNoYXJDb2RlQXQocykmJigrK3MsKythKTtlbHNlIGlmKHIhPT1jKWNvbnRpbnVlO3JldHVybiBuLnNsaWNlKHQscy1hKX1yZXR1cm4gbi5zbGljZSh0KX1mb3IodmFyIHIsdSxpPXt9LG89e30sYT1bXSxsPW4ubGVuZ3RoLHM9MCxmPTA7KHI9ZSgpKSE9PW87KXtmb3IodmFyIGg9W107ciE9PWkmJnIhPT1vOyloLnB1c2gocikscj1lKCk7dCYmbnVsbD09KGg9dChoLGYrKykpfHxhLnB1c2goaCl9cmV0dXJuIGF9LGUuZm9ybWF0PWZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodFswXSkpcmV0dXJuIGUuZm9ybWF0Um93cyh0KTt2YXIgcj1uZXcgbSx1PVtdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIG4pci5oYXModCl8fHUucHVzaChyLmFkZCh0KSl9KSxbdS5tYXAobykuam9pbihuKV0uY29uY2F0KHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB1Lm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbyh0W25dKX0pLmpvaW4obil9KSkuam9pbigiXG4iKX0sZS5mb3JtYXRSb3dzPWZ1bmN0aW9uKG4pe3JldHVybiBuLm1hcChpKS5qb2luKCJcbiIpfSxlfSx0YS5jc3Y9dGEuZHN2KCIsIiwidGV4dC9jc3YiKSx0YS50c3Y9dGEuZHN2KCIJIiwidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIpO3ZhciBLYSxRYSxuYyx0YyxlYyxyYz10aGlzW3godGhpcywicmVxdWVzdEFuaW1hdGlvbkZyYW1lIildfHxmdW5jdGlvbihuKXtzZXRUaW1lb3V0KG4sMTcpfTt0YS50aW1lcj1mdW5jdGlvbihuLHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDsyPnImJih0PTApLDM+ciYmKGU9RGF0ZS5ub3coKSk7dmFyIHU9ZSt0LGk9e2M6bix0OnUsZjohMSxuOm51bGx9O1FhP1FhLm49aTpLYT1pLFFhPWksbmN8fCh0Yz1jbGVhclRpbWVvdXQodGMpLG5jPTEscmMocXQpKX0sdGEudGltZXIuZmx1c2g9ZnVuY3Rpb24oKXtMdCgpLFR0KCl9LHRhLnJvdW5kPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQ/TWF0aC5yb3VuZChuKih0PU1hdGgucG93KDEwLHQpKSkvdDpNYXRoLnJvdW5kKG4pfTt2YXIgdWM9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCJceGI1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl0ubWFwKER0KTt0YS5mb3JtYXRQcmVmaXg9ZnVuY3Rpb24obix0KXt2YXIgZT0wO3JldHVybiBuJiYoMD5uJiYobio9LTEpLHQmJihuPXRhLnJvdW5kKG4sUnQobix0KSkpLGU9MStNYXRoLmZsb29yKDFlLTEyK01hdGgubG9nKG4pL01hdGguTE4xMCksZT1NYXRoLm1heCgtMjQsTWF0aC5taW4oMjQsMypNYXRoLmZsb29yKChlLTEpLzMpKSkpLHVjWzgrZS8zXX07dmFyIGljPS8oPzooW157XSk/KFs8Pj1eXSkpPyhbK1wtIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLi0/XGQrKT8oW2EteiVdKT8vaSxvYz10YS5tYXAoe2I6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24obil7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobil9LG86ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoOCl9LHg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpfSxYOmZ1bmN0aW9uKG4pe3JldHVybiBuLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSxnOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9QcmVjaXNpb24odCl9LGU6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0V4cG9uZW50aWFsKHQpfSxmOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9GaXhlZCh0KX0scjpmdW5jdGlvbihuLHQpe3JldHVybihuPXRhLnJvdW5kKG4sUnQobix0KSkpLnRvRml4ZWQoTWF0aC5tYXgoMCxNYXRoLm1pbigyMCxSdChuKigxKzFlLTE1KSx0KSkpKX19KSxhYz10YS50aW1lPXt9LGNjPURhdGU7anQucHJvdG90eXBlPXtnZXREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXRlKCl9LGdldERheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCl9LGdldEZ1bGxZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENGdWxsWWVhcigpfSxnZXRIb3VyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDSG91cnMoKX0sZ2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKX0sZ2V0TWludXRlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTWludXRlcygpfSxnZXRNb250aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTW9udGgoKX0sZ2V0U2Vjb25kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpfSxnZXRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRUaW1lKCl9LGdldFRpbWV6b25lT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLnZhbHVlT2YoKX0sc2V0RGF0ZTpmdW5jdGlvbigpe2xjLnNldFVUQ0RhdGUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldERheTpmdW5jdGlvbigpe2xjLnNldFVUQ0RheS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtsYy5zZXRVVENGdWxsWWVhci5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0SG91cnM6ZnVuY3Rpb24oKXtsYy5zZXRVVENIb3Vycy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7bGMuc2V0VVRDTWlsbGlzZWNvbmRzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaW51dGVzOmZ1bmN0aW9uKCl7bGMuc2V0VVRDTWludXRlcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TW9udGg6ZnVuY3Rpb24oKXtsYy5zZXRVVENNb250aC5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0U2Vjb25kczpmdW5jdGlvbigpe2xjLnNldFVUQ1NlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldFRpbWU6ZnVuY3Rpb24oKXtsYy5zZXRUaW1lLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfX07dmFyIGxjPURhdGUucHJvdG90eXBlO2FjLnllYXI9RnQoZnVuY3Rpb24obil7cmV0dXJuIG49YWMuZGF5KG4pLG4uc2V0TW9udGgoMCwxKSxufSxmdW5jdGlvbihuLHQpe24uc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpK3QpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRGdWxsWWVhcigpfSksYWMueWVhcnM9YWMueWVhci5yYW5nZSxhYy55ZWFycy51dGM9YWMueWVhci51dGMucmFuZ2UsYWMuZGF5PUZ0KGZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBjYygyZTMsMCk7cmV0dXJuIHQuc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKSksdH0sZnVuY3Rpb24obix0KXtuLnNldERhdGUobi5nZXREYXRlKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERhdGUoKS0xfSksYWMuZGF5cz1hYy5kYXkucmFuZ2UsYWMuZGF5cy51dGM9YWMuZGF5LnV0Yy5yYW5nZSxhYy5kYXlPZlllYXI9ZnVuY3Rpb24obil7dmFyIHQ9YWMueWVhcihuKTtyZXR1cm4gTWF0aC5mbG9vcigobi10LTZlNCoobi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkpLzg2NGU1KX0sWyJzdW5kYXkiLCJtb25kYXkiLCJ0dWVzZGF5Iiwid2VkbmVzZGF5IiwidGh1cnNkYXkiLCJmcmlkYXkiLCJzYXR1cmRheSJdLmZvckVhY2goZnVuY3Rpb24obix0KXt0PTctdDt2YXIgZT1hY1tuXT1GdChmdW5jdGlvbihuKXtyZXR1cm4obj1hYy5kYXkobikpLnNldERhdGUobi5nZXREYXRlKCktKG4uZ2V0RGF5KCkrdCklNyksbn0sZnVuY3Rpb24obix0KXtuLnNldERhdGUobi5nZXREYXRlKCkrNypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7dmFyIGU9YWMueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoYWMuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpLShlIT09dCl9KTthY1tuKyJzIl09ZS5yYW5nZSxhY1tuKyJzIl0udXRjPWUudXRjLnJhbmdlLGFjW24rIk9mWWVhciJdPWZ1bmN0aW9uKG4pe3ZhciBlPWFjLnllYXIobikuZ2V0RGF5KCk7cmV0dXJuIE1hdGguZmxvb3IoKGFjLmRheU9mWWVhcihuKSsoZSt0KSU3KS83KX19KSxhYy53ZWVrPWFjLnN1bmRheSxhYy53ZWVrcz1hYy5zdW5kYXkucmFuZ2UsYWMud2Vla3MudXRjPWFjLnN1bmRheS51dGMucmFuZ2UsYWMud2Vla09mWWVhcj1hYy5zdW5kYXlPZlllYXI7dmFyIHNjPXsiLSI6IiIsXzoiICIsMDoiMCJ9LGZjPS9eXHMqXGQrLyxoYz0vXiUvO3RhLmxvY2FsZT1mdW5jdGlvbihuKXtyZXR1cm57bnVtYmVyRm9ybWF0OlB0KG4pLHRpbWVGb3JtYXQ6T3Qobil9fTt2YXIgZ2M9dGEubG9jYWxlKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXSxkYXRlVGltZToiJWEgJWIgJWUgJVggJVkiLGRhdGU6IiVtLyVkLyVZIix0aW1lOiIlSDolTTolUyIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt0YS5mb3JtYXQ9Z2MubnVtYmVyRm9ybWF0LHRhLmdlbz17fSxjZS5wcm90b3R5cGU9e3M6MCx0OjAsYWRkOmZ1bmN0aW9uKG4pe2xlKG4sdGhpcy50LHBjKSxsZShwYy5zLHRoaXMucyx0aGlzKSx0aGlzLnM/dGhpcy50Kz1wYy50OnRoaXMucz1wYy50Cn0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIHBjPW5ldyBjZTt0YS5nZW8uc3RyZWFtPWZ1bmN0aW9uKG4sdCl7biYmdmMuaGFzT3duUHJvcGVydHkobi50eXBlKT92Y1tuLnR5cGVdKG4sdCk6c2Uobix0KX07dmFyIHZjPXtGZWF0dXJlOmZ1bmN0aW9uKG4sdCl7c2Uobi5nZW9tZXRyeSx0KX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5mZWF0dXJlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXNlKGVbcl0uZ2VvbWV0cnksdCl9fSxkYz17U3BoZXJlOmZ1bmN0aW9uKG4sdCl7dC5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24obix0KXtuPW4uY29vcmRpbmF0ZXMsdC5wb2ludChuWzBdLG5bMV0sblsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KW49ZVtyXSx0LnBvaW50KG5bMF0sblsxXSxuWzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbihuLHQpe2ZlKG4uY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylmZShlW3JdLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24obix0KXtoZShuLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWhlKGVbcl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmdlb21ldHJpZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylzZShlW3JdLHQpfX07dGEuZ2VvLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIG1jPTAsdGEuZ2VvLnN0cmVhbShuLE1jKSxtY307dmFyIG1jLHljPW5ldyBjZSxNYz17c3BoZXJlOmZ1bmN0aW9uKCl7bWMrPTQqcWF9LHBvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3ljLnJlc2V0KCksTWMubGluZVN0YXJ0PWdlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIG49Mip5YzttYys9MD5uPzQqcWErbjpuLE1jLmxpbmVTdGFydD1NYy5saW5lRW5kPU1jLnBvaW50PWJ9fTt0YS5nZW8uYm91bmRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe00ucHVzaCh4PVtzPW4saD1uXSksZj50JiYoZj10KSx0PmcmJihnPXQpfWZ1bmN0aW9uIHQodCxlKXt2YXIgcj1wZShbdCpEYSxlKkRhXSk7aWYobSl7dmFyIHU9ZGUobSxyKSxpPVt1WzFdLC11WzBdLDBdLG89ZGUoaSx1KTtNZShvKSxvPXhlKG8pO3ZhciBjPXQtcCxsPWM+MD8xOi0xLHY9b1swXSpQYSpsLGQ9Z2EoYyk+MTgwO2lmKGReKHY+bCpwJiZsKnQ+dikpe3ZhciB5PW9bMV0qUGE7eT5nJiYoZz15KX1lbHNlIGlmKHY9KHYrMzYwKSUzNjAtMTgwLGReKHY+bCpwJiZsKnQ+dikpe3ZhciB5PS1vWzFdKlBhO2Y+eSYmKGY9eSl9ZWxzZSBmPmUmJihmPWUpLGU+ZyYmKGc9ZSk7ZD9wPnQ/YShzLHQpPmEocyxoKSYmKGg9dCk6YSh0LGgpPmEocyxoKSYmKHM9dCk6aD49cz8ocz50JiYocz10KSx0PmgmJihoPXQpKTp0PnA/YShzLHQpPmEocyxoKSYmKGg9dCk6YSh0LGgpPmEocyxoKSYmKHM9dCl9ZWxzZSBuKHQsZSk7bT1yLHA9dH1mdW5jdGlvbiBlKCl7Yi5wb2ludD10fWZ1bmN0aW9uIHIoKXt4WzBdPXMseFsxXT1oLGIucG9pbnQ9bixtPW51bGx9ZnVuY3Rpb24gdShuLGUpe2lmKG0pe3ZhciByPW4tcDt5Kz1nYShyKT4xODA/cisocj4wPzM2MDotMzYwKTpyfWVsc2Ugdj1uLGQ9ZTtNYy5wb2ludChuLGUpLHQobixlKX1mdW5jdGlvbiBpKCl7TWMubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbygpe3UodixkKSxNYy5saW5lRW5kKCksZ2EoeSk+Q2EmJihzPS0oaD0xODApKSx4WzBdPXMseFsxXT1oLG09bnVsbH1mdW5jdGlvbiBhKG4sdCl7cmV0dXJuKHQtPW4pPDA/dCszNjA6dH1mdW5jdGlvbiBjKG4sdCl7cmV0dXJuIG5bMF0tdFswXX1mdW5jdGlvbiBsKG4sdCl7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgcyxmLGgsZyxwLHYsZCxtLHksTSx4LGI9e3BvaW50Om4sbGluZVN0YXJ0OmUsbGluZUVuZDpyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2IucG9pbnQ9dSxiLmxpbmVTdGFydD1pLGIubGluZUVuZD1vLHk9MCxNYy5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe01jLnBvbHlnb25FbmQoKSxiLnBvaW50PW4sYi5saW5lU3RhcnQ9ZSxiLmxpbmVFbmQ9ciwwPnljPyhzPS0oaD0xODApLGY9LShnPTkwKSk6eT5DYT9nPTkwOi1DYT55JiYoZj0tOTApLHhbMF09cyx4WzFdPWh9fTtyZXR1cm4gZnVuY3Rpb24obil7Zz1oPS0ocz1mPTEvMCksTT1bXSx0YS5nZW8uc3RyZWFtKG4sYik7dmFyIHQ9TS5sZW5ndGg7aWYodCl7TS5zb3J0KGMpO2Zvcih2YXIgZSxyPTEsdT1NWzBdLGk9W3VdO3Q+cjsrK3IpZT1NW3JdLGwoZVswXSx1KXx8bChlWzFdLHUpPyhhKHVbMF0sZVsxXSk+YSh1WzBdLHVbMV0pJiYodVsxXT1lWzFdKSxhKGVbMF0sdVsxXSk+YSh1WzBdLHVbMV0pJiYodVswXT1lWzBdKSk6aS5wdXNoKHU9ZSk7Zm9yKHZhciBvLGUscD0tMS8wLHQ9aS5sZW5ndGgtMSxyPTAsdT1pW3RdO3Q+PXI7dT1lLCsrcillPWlbcl0sKG89YSh1WzFdLGVbMF0pKT5wJiYocD1vLHM9ZVswXSxoPXVbMV0pfXJldHVybiBNPXg9bnVsbCwxLzA9PT1zfHwxLzA9PT1mP1tbMC8wLDAvMF0sWzAvMCwwLzBdXTpbW3MsZl0sW2gsZ11dfX0oKSx0YS5nZW8uY2VudHJvaWQ9ZnVuY3Rpb24obil7eGM9YmM9X2M9d2M9U2M9a2M9RWM9QWM9TmM9Q2M9emM9MCx0YS5nZW8uc3RyZWFtKG4scWMpO3ZhciB0PU5jLGU9Q2Mscj16Yyx1PXQqdCtlKmUrcipyO3JldHVybiB6YT51JiYodD1rYyxlPUVjLHI9QWMsQ2E+YmMmJih0PV9jLGU9d2Mscj1TYyksdT10KnQrZSplK3Iqcix6YT51KT9bMC8wLDAvMF06W01hdGguYXRhbjIoZSx0KSpQYSx0dChyL01hdGguc3FydCh1KSkqUGFdfTt2YXIgeGMsYmMsX2Msd2MsU2Msa2MsRWMsQWMsTmMsQ2MsemMscWM9e3NwaGVyZTpiLHBvaW50Ol9lLGxpbmVTdGFydDpTZSxsaW5lRW5kOmtlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3FjLmxpbmVTdGFydD1FZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3FjLmxpbmVTdGFydD1TZX19LExjPUxlKE5lLFBlLGplLFstcWEsLXFhLzJdKSxUYz0xZTk7dGEuZ2VvLmNsaXBFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgbix0LGUscix1LGksbz17c3RyZWFtOmZ1bmN0aW9uKG4pe3JldHVybiB1JiYodS52YWxpZD0hMSksdT1pKG4pLHUudmFsaWQ9ITAsdX0sZXh0ZW50OmZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUllKG49K2FbMF1bMF0sdD0rYVswXVsxXSxlPSthWzFdWzBdLHI9K2FbMV1bMV0pLHUmJih1LnZhbGlkPSExLHU9bnVsbCksbyk6W1tuLHRdLFtlLHJdXX19O3JldHVybiBvLmV4dGVudChbWzAsMF0sWzk2MCw1MDBdXSl9LCh0YS5nZW8uY29uaWNFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gWWUoWmUpfSkucmF3PVplLHRhLmdlby5hbGJlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFs5NiwwXSkuY2VudGVyKFstLjYsMzguN10pLnBhcmFsbGVscyhbMjkuNSw0NS41XSkuc2NhbGUoMTA3MCl9LHRhLmdlby5hbGJlcnNVc2E9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3ZhciBpPW5bMF0sbz1uWzFdO3JldHVybiB0PW51bGwsZShpLG8pLHR8fChyKGksbyksdCl8fHUoaSxvKSx0fXZhciB0LGUscix1LGk9dGEuZ2VvLmFsYmVycygpLG89dGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxhPXRhLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbihuLGUpe3Q9W24sZV19fTtyZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24obil7dmFyIHQ9aS5zY2FsZSgpLGU9aS50cmFuc2xhdGUoKSxyPShuWzBdLWVbMF0pL3QsdT0oblsxXS1lWzFdKS90O3JldHVybih1Pj0uMTImJi4yMzQ+dSYmcj49LS40MjUmJi0uMjE0PnI/bzp1Pj0uMTY2JiYuMjM0PnUmJnI+PS0uMjE0JiYtLjExNT5yP2E6aSkuaW52ZXJ0KG4pfSxuLnN0cmVhbT1mdW5jdGlvbihuKXt2YXIgdD1pLnN0cmVhbShuKSxlPW8uc3RyZWFtKG4pLHI9YS5zdHJlYW0obik7cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4sdSl7dC5wb2ludChuLHUpLGUucG9pbnQobix1KSxyLnBvaW50KG4sdSl9LHNwaGVyZTpmdW5jdGlvbigpe3Quc3BoZXJlKCksZS5zcGhlcmUoKSxyLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLGUubGluZVN0YXJ0KCksci5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGUubGluZUVuZCgpLHIubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLGUucG9seWdvblN0YXJ0KCksci5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLGUucG9seWdvbkVuZCgpLHIucG9seWdvbkVuZCgpfX19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnByZWNpc2lvbih0KSxvLnByZWNpc2lvbih0KSxhLnByZWNpc2lvbih0KSxuKTppLnByZWNpc2lvbigpfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnNjYWxlKHQpLG8uc2NhbGUoLjM1KnQpLGEuc2NhbGUodCksbi50cmFuc2xhdGUoaS50cmFuc2xhdGUoKSkpOmkuc2NhbGUoKX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGkudHJhbnNsYXRlKCk7dmFyIGw9aS5zY2FsZSgpLHM9K3RbMF0sZj0rdFsxXTtyZXR1cm4gZT1pLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbcy0uNDU1KmwsZi0uMjM4KmxdLFtzKy40NTUqbCxmKy4yMzgqbF1dKS5zdHJlYW0oYykucG9pbnQscj1vLnRyYW5zbGF0ZShbcy0uMzA3KmwsZisuMjAxKmxdKS5jbGlwRXh0ZW50KFtbcy0uNDI1KmwrQ2EsZisuMTIqbCtDYV0sW3MtLjIxNCpsLUNhLGYrLjIzNCpsLUNhXV0pLnN0cmVhbShjKS5wb2ludCx1PWEudHJhbnNsYXRlKFtzLS4yMDUqbCxmKy4yMTIqbF0pLmNsaXBFeHRlbnQoW1tzLS4yMTQqbCtDYSxmKy4xNjYqbCtDYV0sW3MtLjExNSpsLUNhLGYrLjIzNCpsLUNhXV0pLnN0cmVhbShjKS5wb2ludCxufSxuLnNjYWxlKDEwNzApfTt2YXIgUmMsRGMsUGMsVWMsamMsRmMsSGM9e3BvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0RjPTAsSGMubGluZVN0YXJ0PVZlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7SGMubGluZVN0YXJ0PUhjLmxpbmVFbmQ9SGMucG9pbnQ9YixSYys9Z2EoRGMvMil9fSxPYz17cG9pbnQ6WGUsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpiLHBvbHlnb25FbmQ6Yn0sSWM9e3BvaW50OldlLGxpbmVTdGFydDpKZSxsaW5lRW5kOkdlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0ljLmxpbmVTdGFydD1LZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe0ljLnBvaW50PVdlLEljLmxpbmVTdGFydD1KZSxJYy5saW5lRW5kPUdlfX07dGEuZ2VvLnBhdGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3JldHVybiBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIGEmJmkucG9pbnRSYWRpdXMoK2EuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxvJiZvLnZhbGlkfHwobz11KGkpKSx0YS5nZW8uc3RyZWFtKG4sbykpLGkucmVzdWx0KCl9ZnVuY3Rpb24gdCgpe3JldHVybiBvPW51bGwsbn12YXIgZSxyLHUsaSxvLGE9NC41O3JldHVybiBuLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIFJjPTAsdGEuZ2VvLnN0cmVhbShuLHUoSGMpKSxSY30sbi5jZW50cm9pZD1mdW5jdGlvbihuKXtyZXR1cm4gX2M9d2M9U2M9a2M9RWM9QWM9TmM9Q2M9emM9MCx0YS5nZW8uc3RyZWFtKG4sdShJYykpLHpjP1tOYy96YyxDYy96Y106QWM/W2tjL0FjLEVjL0FjXTpTYz9bX2MvU2Msd2MvU2NdOlswLzAsMC8wXX0sbi5ib3VuZHM9ZnVuY3Rpb24obil7cmV0dXJuIGpjPUZjPS0oUGM9VWM9MS8wKSx0YS5nZW8uc3RyZWFtKG4sdShPYykpLFtbUGMsVWNdLFtqYyxGY11dfSxuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9KGU9bik/bi5zdHJlYW18fHRyKG4pOnksdCgpKTplfSxuLmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09KHI9bik/bmV3ICRlOm5ldyBRZShuKSwiZnVuY3Rpb24iIT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cyhhKSx0KCkpOnJ9LG4ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG4pOmF9LG4ucHJvamVjdGlvbih0YS5nZW8uYWxiZXJzVXNhKCkpLmNvbnRleHQobnVsbCl9LHRhLmdlby50cmFuc2Zvcm09ZnVuY3Rpb24obil7cmV0dXJue3N0cmVhbTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgZXIodCk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfX19LGVyLnByb3RvdHlwZT17cG9pbnQ6ZnVuY3Rpb24obix0KXt0aGlzLnN0cmVhbS5wb2ludChuLHQpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX0sdGEuZ2VvLnByb2plY3Rpb249dXIsdGEuZ2VvLnByb2plY3Rpb25NdXRhdG9yPWlyLCh0YS5nZW8uZXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKGFyKX0pLnJhdz1hci5pbnZlcnQ9YXIsdGEuZ2VvLnJvdGF0aW9uPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQ9bih0WzBdKkRhLHRbMV0qRGEpLHRbMF0qPVBhLHRbMV0qPVBhLHR9cmV0dXJuIG49bHIoblswXSUzNjAqRGEsblsxXSpEYSxuLmxlbmd0aD4yP25bMl0qRGE6MCksdC5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bi5pbnZlcnQodFswXSpEYSx0WzFdKkRhKSx0WzBdKj1QYSx0WzFdKj1QYSx0fSx0fSxjci5pbnZlcnQ9YXIsdGEuZ2VvLmNpcmNsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyLHQ9bHIoLW5bMF0qRGEsLW5bMV0qRGEsMCkuaW52ZXJ0LHU9W107cmV0dXJuIGUobnVsbCxudWxsLDEse3BvaW50OmZ1bmN0aW9uKG4sZSl7dS5wdXNoKG49dChuLGUpKSxuWzBdKj1QYSxuWzFdKj1QYX19KSx7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3VdfX12YXIgdCxlLHI9WzAsMF0sdT02O3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uYW5nbGU9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Z3IoKHQ9K3IpKkRhLHUqRGEpLG4pOnR9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWdyKHQqRGEsKHU9K3IpKkRhKSxuKTp1fSxuLmFuZ2xlKDkwKX0sdGEuZ2VvLmRpc3RhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUscj0odFswXS1uWzBdKSpEYSx1PW5bMV0qRGEsaT10WzFdKkRhLG89TWF0aC5zaW4ociksYT1NYXRoLmNvcyhyKSxjPU1hdGguc2luKHUpLGw9TWF0aC5jb3ModSkscz1NYXRoLnNpbihpKSxmPU1hdGguY29zKGkpO3JldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgoZT1mKm8pKmUrKGU9bCpzLWMqZiphKSplKSxjKnMrbCpmKmEpfSx0YS5nZW8uZ3JhdGljdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQoKX19ZnVuY3Rpb24gdCgpe3JldHVybiB0YS5yYW5nZShNYXRoLmNlaWwoaS9kKSpkLHUsZCkubWFwKGgpLmNvbmNhdCh0YS5yYW5nZShNYXRoLmNlaWwobC9tKSptLGMsbSkubWFwKGcpKS5jb25jYXQodGEucmFuZ2UoTWF0aC5jZWlsKHIvcCkqcCxlLHApLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gZ2EobiVkKT5DYX0pLm1hcChzKSkuY29uY2F0KHRhLnJhbmdlKE1hdGguY2VpbChhL3YpKnYsbyx2KS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIGdhKG4lbSk+Q2F9KS5tYXAoZikpfXZhciBlLHIsdSxpLG8sYSxjLGwscyxmLGgsZyxwPTEwLHY9cCxkPTkwLG09MzYwLHk9Mi41O3JldHVybiBuLmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOm59fSl9LG4ub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaChpKS5jb25jYXQoZyhjKS5zbGljZSgxKSxoKHUpLnJldmVyc2UoKS5zbGljZSgxKSxnKGwpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvckV4dGVudCh0KS5taW5vckV4dGVudCh0KTpuLm1pbm9yRXh0ZW50KCl9LG4ubWFqb3JFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3RbMF1bMF0sdT0rdFsxXVswXSxsPSt0WzBdWzFdLGM9K3RbMV1bMV0saT51JiYodD1pLGk9dSx1PXQpLGw+YyYmKHQ9bCxsPWMsYz10KSxuLnByZWNpc2lvbih5KSk6W1tpLGxdLFt1LGNdXX0sbi5taW5vckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdFswXVswXSxlPSt0WzFdWzBdLGE9K3RbMF1bMV0sbz0rdFsxXVsxXSxyPmUmJih0PXIscj1lLGU9dCksYT5vJiYodD1hLGE9byxvPXQpLG4ucHJlY2lzaW9uKHkpKTpbW3IsYV0sW2Usb11dfSxuLnN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvclN0ZXAodCkubWlub3JTdGVwKHQpOm4ubWlub3JTdGVwKCl9LG4ubWFqb3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLG09K3RbMV0sbik6W2QsbV19LG4ubWlub3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0WzBdLHY9K3RbMV0sbik6W3Asdl19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSt0LHM9dnIoYSxvLDkwKSxmPWRyKHIsZSx5KSxoPXZyKGwsYyw5MCksZz1kcihpLHUseSksbik6eX0sbi5tYWpvckV4dGVudChbWy0xODAsLTkwK0NhXSxbMTgwLDkwLUNhXV0pLm1pbm9yRXh0ZW50KFtbLTE4MCwtODAtQ2FdLFsxODAsODArQ2FdXSl9LHRhLmdlby5ncmVhdEFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W3R8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpXX19dmFyIHQsZSxyPW1yLHU9eXI7cmV0dXJuIG4uZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmRpc3RhbmNlKHR8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP251bGw6ZSxuKTpyfSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bnVsbDp0LG4pOnV9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bjowfSxufSx0YS5nZW8uaW50ZXJwb2xhdGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gTXIoblswXSpEYSxuWzFdKkRhLHRbMF0qRGEsdFsxXSpEYSl9LHRhLmdlby5sZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIFljPTAsdGEuZ2VvLnN0cmVhbShuLFpjKSxZY307dmFyIFljLFpjPXtzcGhlcmU6Yixwb2ludDpiLGxpbmVTdGFydDp4cixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmIscG9seWdvbkVuZDpifSxWYz1icihmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5zcXJ0KDIvKDErbikpfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmFzaW4obi8yKX0pOyh0YS5nZW8uYXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFZjKX0pLnJhdz1WYzt2YXIgWGM9YnIoZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5hY29zKG4pO3JldHVybiB0JiZ0L01hdGguc2luKHQpfSx5KTsodGEuZ2VvLmF6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFhjKX0pLnJhdz1YYywodGEuZ2VvLmNvbmljQ29uZm9ybWFsPWZ1bmN0aW9uKCl7cmV0dXJuIFllKF9yKX0pLnJhdz1fciwodGEuZ2VvLmNvbmljRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gWWUod3IpfSkucmF3PXdyO3ZhciAkYz1icihmdW5jdGlvbihuKXtyZXR1cm4gMS9ufSxNYXRoLmF0YW4pOyh0YS5nZW8uZ25vbW9uaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoJGMpfSkucmF3PSRjLFNyLmludmVydD1mdW5jdGlvbihuLHQpe3JldHVybltuLDIqTWF0aC5hdGFuKE1hdGguZXhwKHQpKS1SYV19LCh0YS5nZW8ubWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4ga3IoU3IpfSkucmF3PVNyO3ZhciBCYz1icihmdW5jdGlvbigpe3JldHVybiAxfSxNYXRoLmFzaW4pOyh0YS5nZW8ub3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKEJjKX0pLnJhdz1CYzt2YXIgV2M9YnIoZnVuY3Rpb24obil7cmV0dXJuIDEvKDErbil9LGZ1bmN0aW9uKG4pe3JldHVybiAyKk1hdGguYXRhbihuKX0pOyh0YS5nZW8uc3RlcmVvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiB1cihXYyl9KS5yYXc9V2MsRXIuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuWy10LDIqTWF0aC5hdGFuKE1hdGguZXhwKG4pKS1SYV19LCh0YS5nZW8udHJhbnN2ZXJzZU1lcmNhdG9yPWZ1bmN0aW9uKCl7dmFyIG49a3IoRXIpLHQ9bi5jZW50ZXIsZT1uLnJvdGF0ZTtyZXR1cm4gbi5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG4/dChbLW5bMV0sblswXV0pOihuPXQoKSxbblsxXSwtblswXV0pfSxuLnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbj9lKFtuWzBdLG5bMV0sbi5sZW5ndGg+Mj9uWzJdKzkwOjkwXSk6KG49ZSgpLFtuWzBdLG5bMV0sblsyXS05MF0pfSxlKFswLDAsOTBdKX0pLnJhdz1Fcix0YS5nZW9tPXt9LHRhLmdlb20uaHVsbD1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KG4pe2lmKG4ubGVuZ3RoPDMpcmV0dXJuW107dmFyIHQsdT1FdChlKSxpPUV0KHIpLG89bi5sZW5ndGgsYT1bXSxjPVtdO2Zvcih0PTA7bz50O3QrKylhLnB1c2goWyt1LmNhbGwodGhpcyxuW3RdLHQpLCtpLmNhbGwodGhpcyxuW3RdLHQpLHRdKTtmb3IoYS5zb3J0KHpyKSx0PTA7bz50O3QrKyljLnB1c2goW2FbdF1bMF0sLWFbdF1bMV1dKTt2YXIgbD1DcihhKSxzPUNyKGMpLGY9c1swXT09PWxbMF0saD1zW3MubGVuZ3RoLTFdPT09bFtsLmxlbmd0aC0xXSxnPVtdO2Zvcih0PWwubGVuZ3RoLTE7dD49MDstLXQpZy5wdXNoKG5bYVtsW3RdXVsyXV0pO2Zvcih0PStmO3Q8cy5sZW5ndGgtaDsrK3QpZy5wdXNoKG5bYVtzW3RdXVsyXV0pO3JldHVybiBnfXZhciBlPUFyLHI9TnI7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dChuKToodC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdCl9LHRhLmdlb20ucG9seWdvbj1mdW5jdGlvbihuKXtyZXR1cm4geWEobixKYyksbn07dmFyIEpjPXRhLmdlb20ucG9seWdvbi5wcm90b3R5cGU9W107SmMuYXJlYT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PS0xLGU9dGhpcy5sZW5ndGgscj10aGlzW2UtMV0sdT0wOysrdDxlOyluPXIscj10aGlzW3RdLHUrPW5bMV0qclswXS1uWzBdKnJbMV07cmV0dXJuLjUqdX0sSmMuY2VudHJvaWQ9ZnVuY3Rpb24obil7dmFyIHQsZSxyPS0xLHU9dGhpcy5sZW5ndGgsaT0wLG89MCxhPXRoaXNbdS0xXTtmb3IoYXJndW1lbnRzLmxlbmd0aHx8KG49LTEvKDYqdGhpcy5hcmVhKCkpKTsrK3I8dTspdD1hLGE9dGhpc1tyXSxlPXRbMF0qYVsxXS1hWzBdKnRbMV0saSs9KHRbMF0rYVswXSkqZSxvKz0odFsxXSthWzFdKSplO3JldHVybltpKm4sbypuXX0sSmMuY2xpcD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxvLGE9VHIobiksYz0tMSxsPXRoaXMubGVuZ3RoLVRyKHRoaXMpLHM9dGhpc1tsLTFdOysrYzxsOyl7Zm9yKHQ9bi5zbGljZSgpLG4ubGVuZ3RoPTAsdT10aGlzW2NdLGk9dFsocj10Lmxlbmd0aC1hKS0xXSxlPS0xOysrZTxyOylvPXRbZV0scXIobyxzLHUpPyhxcihpLHMsdSl8fG4ucHVzaChMcihpLG8scyx1KSksbi5wdXNoKG8pKTpxcihpLHMsdSkmJm4ucHVzaChMcihpLG8scyx1KSksaT1vO2EmJm4ucHVzaChuWzBdKSxzPXV9cmV0dXJuIG59O3ZhciBHYyxLYyxRYyxubCx0bCxlbD1bXSxybD1bXTtPci5wcm90b3R5cGUucHJlcGFyZT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PXRoaXMuZWRnZXMsZT10Lmxlbmd0aDtlLS07KW49dFtlXS5lZGdlLG4uYiYmbi5hfHx0LnNwbGljZShlLDEpO3JldHVybiB0LnNvcnQoWXIpLHQubGVuZ3RofSxRci5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5hOnRoaXMuZWRnZS5ifSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmI6dGhpcy5lZGdlLmF9fSxudS5wcm90b3R5cGU9e2luc2VydDpmdW5jdGlvbihuLHQpe3ZhciBlLHIsdTtpZihuKXtpZih0LlA9bix0Lk49bi5OLG4uTiYmKG4uTi5QPXQpLG4uTj10LG4uUil7Zm9yKG49bi5SO24uTDspbj1uLkw7bi5MPXR9ZWxzZSBuLlI9dDtlPW59ZWxzZSB0aGlzLl8/KG49dXUodGhpcy5fKSx0LlA9bnVsbCx0Lk49bixuLlA9bi5MPXQsZT1uKToodC5QPXQuTj1udWxsLHRoaXMuXz10LGU9bnVsbCk7Zm9yKHQuTD10LlI9bnVsbCx0LlU9ZSx0LkM9ITAsbj10O2UmJmUuQzspcj1lLlUsZT09PXIuTD8odT1yLlIsdSYmdS5DPyhlLkM9dS5DPSExLHIuQz0hMCxuPXIpOihuPT09ZS5SJiYoZXUodGhpcyxlKSxuPWUsZT1uLlUpLGUuQz0hMSxyLkM9ITAscnUodGhpcyxyKSkpOih1PXIuTCx1JiZ1LkM/KGUuQz11LkM9ITEsci5DPSEwLG49cik6KG49PT1lLkwmJihydSh0aGlzLGUpLG49ZSxlPW4uVSksZS5DPSExLHIuQz0hMCxldSh0aGlzLHIpKSksZT1uLlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbihuKXtuLk4mJihuLk4uUD1uLlApLG4uUCYmKG4uUC5OPW4uTiksbi5OPW4uUD1udWxsO3ZhciB0LGUscix1PW4uVSxpPW4uTCxvPW4uUjtpZihlPWk/bz91dShvKTppOm8sdT91Lkw9PT1uP3UuTD1lOnUuUj1lOnRoaXMuXz1lLGkmJm8/KHI9ZS5DLGUuQz1uLkMsZS5MPWksaS5VPWUsZSE9PW8/KHU9ZS5VLGUuVT1uLlUsbj1lLlIsdS5MPW4sZS5SPW8sby5VPWUpOihlLlU9dSx1PWUsbj1lLlIpKToocj1uLkMsbj1lKSxuJiYobi5VPXUpLCFyKXtpZihuJiZuLkMpcmV0dXJuIHZvaWQobi5DPSExKTtkb3tpZihuPT09dGhpcy5fKWJyZWFrO2lmKG49PT11Lkwpe2lmKHQ9dS5SLHQuQyYmKHQuQz0hMSx1LkM9ITAsZXUodGhpcyx1KSx0PXUuUiksdC5MJiZ0LkwuQ3x8dC5SJiZ0LlIuQyl7dC5SJiZ0LlIuQ3x8KHQuTC5DPSExLHQuQz0hMCxydSh0aGlzLHQpLHQ9dS5SKSx0LkM9dS5DLHUuQz10LlIuQz0hMSxldSh0aGlzLHUpLG49dGhpcy5fO2JyZWFrfX1lbHNlIGlmKHQ9dS5MLHQuQyYmKHQuQz0hMSx1LkM9ITAscnUodGhpcyx1KSx0PXUuTCksdC5MJiZ0LkwuQ3x8dC5SJiZ0LlIuQyl7dC5MJiZ0LkwuQ3x8KHQuUi5DPSExLHQuQz0hMCxldSh0aGlzLHQpLHQ9dS5MKSx0LkM9dS5DLHUuQz10LkwuQz0hMSxydSh0aGlzLHUpLG49dGhpcy5fO2JyZWFrfXQuQz0hMCxuPXUsdT11LlV9d2hpbGUoIW4uQyk7biYmKG4uQz0hMSl9fX0sdGEuZ2VvbS52b3Jvbm9pPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQobil7dmFyIHQ9bmV3IEFycmF5KG4ubGVuZ3RoKSxyPWFbMF1bMF0sdT1hWzBdWzFdLGk9YVsxXVswXSxvPWFbMV1bMV07cmV0dXJuIGl1KGUobiksYSkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLGEpe3ZhciBjPWUuZWRnZXMsbD1lLnNpdGUscz10W2FdPWMubGVuZ3RoP2MubWFwKGZ1bmN0aW9uKG4pe3ZhciB0PW4uc3RhcnQoKTtyZXR1cm5bdC54LHQueV19KTpsLng+PXImJmwueDw9aSYmbC55Pj11JiZsLnk8PW8/W1tyLG9dLFtpLG9dLFtpLHVdLFtyLHVdXTpbXTtzLnBvaW50PW5bYV19KSx0fWZ1bmN0aW9uIGUobil7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4sdCl7cmV0dXJue3g6TWF0aC5yb3VuZChpKG4sdCkvQ2EpKkNhLHk6TWF0aC5yb3VuZChvKG4sdCkvQ2EpKkNhLGk6dH19KX12YXIgcj1Bcix1PU5yLGk9cixvPXUsYT11bDtyZXR1cm4gbj90KG4pOih0LmxpbmtzPWZ1bmN0aW9uKG4pe3JldHVybiBpdShlKG4pKS5lZGdlcy5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG4ubCYmbi5yfSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6blt0LmwuaV0sdGFyZ2V0Om5bdC5yLmldfX0pfSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtyZXR1cm4gaXUoZShuKSkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2Zvcih2YXIgdSxpLG89ZS5zaXRlLGE9ZS5lZGdlcy5zb3J0KFlyKSxjPS0xLGw9YS5sZW5ndGgscz1hW2wtMV0uZWRnZSxmPXMubD09PW8/cy5yOnMubDsrK2M8bDspdT1zLGk9ZixzPWFbY10uZWRnZSxmPXMubD09PW8/cy5yOnMubCxyPGkuaSYmcjxmLmkmJmF1KG8saSxmKTwwJiZ0LnB1c2goW25bcl0sbltpLmldLG5bZi5pXV0pfSksdH0sdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUV0KHI9biksdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUV0KHU9biksdCk6dX0sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW51bGw9PW4/dWw6bix0KTphPT09dWw/bnVsbDphfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5jbGlwRXh0ZW50KG4mJltbMCwwXSxuXSk6YT09PXVsP251bGw6YSYmYVsxXX0sdCl9O3ZhciB1bD1bWy0xZTYsLTFlNl0sWzFlNiwxZTZdXTt0YS5nZW9tLmRlbGF1bmF5PWZ1bmN0aW9uKG4pe3JldHVybiB0YS5nZW9tLnZvcm9ub2koKS50cmlhbmdsZXMobil9LHRhLmdlb20ucXVhZHRyZWU9ZnVuY3Rpb24obix0LGUscix1KXtmdW5jdGlvbiBpKG4pe2Z1bmN0aW9uIGkobix0LGUscix1LGksbyxhKXtpZighaXNOYU4oZSkmJiFpc05hTihyKSlpZihuLmxlYWYpe3ZhciBjPW4ueCxzPW4ueTtpZihudWxsIT1jKWlmKGdhKGMtZSkrZ2Eocy1yKTwuMDEpbChuLHQsZSxyLHUsaSxvLGEpO2Vsc2V7dmFyIGY9bi5wb2ludDtuLng9bi55PW4ucG9pbnQ9bnVsbCxsKG4sZixjLHMsdSxpLG8sYSksbChuLHQsZSxyLHUsaSxvLGEpfWVsc2Ugbi54PWUsbi55PXIsbi5wb2ludD10fWVsc2UgbChuLHQsZSxyLHUsaSxvLGEpfWZ1bmN0aW9uIGwobix0LGUscix1LG8sYSxjKXt2YXIgbD0uNSoodSthKSxzPS41KihvK2MpLGY9ZT49bCxoPXI+PXMsZz1oPDwxfGY7bi5sZWFmPSExLG49bi5ub2Rlc1tnXXx8KG4ubm9kZXNbZ109c3UoKSksZj91PWw6YT1sLGg/bz1zOmM9cyxpKG4sdCxlLHIsdSxvLGEsYyl9dmFyIHMsZixoLGcscCx2LGQsbSx5LE09RXQoYSkseD1FdChjKTtpZihudWxsIT10KXY9dCxkPWUsbT1yLHk9dTtlbHNlIGlmKG09eT0tKHY9ZD0xLzApLGY9W10saD1bXSxwPW4ubGVuZ3RoLG8pZm9yKGc9MDtwPmc7KytnKXM9bltnXSxzLng8diYmKHY9cy54KSxzLnk8ZCYmKGQ9cy55KSxzLng+bSYmKG09cy54KSxzLnk+eSYmKHk9cy55KSxmLnB1c2gocy54KSxoLnB1c2gocy55KTtlbHNlIGZvcihnPTA7cD5nOysrZyl7dmFyIGI9K00ocz1uW2ddLGcpLF89K3gocyxnKTt2PmImJih2PWIpLGQ+XyYmKGQ9XyksYj5tJiYobT1iKSxfPnkmJih5PV8pLGYucHVzaChiKSxoLnB1c2goXyl9dmFyIHc9bS12LFM9eS1kO3c+Uz95PWQrdzptPXYrUzt2YXIgaz1zdSgpO2lmKGsuYWRkPWZ1bmN0aW9uKG4pe2koayxuLCtNKG4sKytnKSwreChuLGcpLHYsZCxtLHkpfSxrLnZpc2l0PWZ1bmN0aW9uKG4pe2Z1KG4sayx2LGQsbSx5KX0say5maW5kPWZ1bmN0aW9uKG4pe3JldHVybiBodShrLG5bMF0sblsxXSx2LGQsbSx5KX0sZz0tMSxudWxsPT10KXtmb3IoOysrZzxwOylpKGssbltnXSxmW2ddLGhbZ10sdixkLG0seSk7LS1nfWVsc2Ugbi5mb3JFYWNoKGsuYWRkKTtyZXR1cm4gZj1oPW49cz1udWxsLGt9dmFyIG8sYT1BcixjPU5yO3JldHVybihvPWFyZ3VtZW50cy5sZW5ndGgpPyhhPWN1LGM9bHUsMz09PW8mJih1PWUscj10LGU9dD0wKSxpKG4pKTooaS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4saSk6YX0saS55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4saSk6Y30saS5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PStuWzBdWzBdLGU9K25bMF1bMV0scj0rblsxXVswXSx1PStuWzFdWzFdKSxpKTpudWxsPT10P251bGw6W1t0LGVdLFtyLHVdXX0saS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP3Q9ZT1yPXU9bnVsbDoodD1lPTAscj0rblswXSx1PStuWzFdKSxpKTpudWxsPT10P251bGw6W3ItdCx1LWVdfSxpKX0sdGEuaW50ZXJwb2xhdGVSZ2I9Z3UsdGEuaW50ZXJwb2xhdGVPYmplY3Q9cHUsdGEuaW50ZXJwb2xhdGVOdW1iZXI9dnUsdGEuaW50ZXJwb2xhdGVTdHJpbmc9ZHU7dmFyIGlsPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxvbD1uZXcgUmVnRXhwKGlsLnNvdXJjZSwiZyIpO3RhLmludGVycG9sYXRlPW11LHRhLmludGVycG9sYXRvcnM9W2Z1bmN0aW9uKG4sdCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuKCJzdHJpbmciPT09ZT9HYS5oYXModCl8fC9eKCN8cmdiXCh8aHNsXCgpLy50ZXN0KHQpP2d1OmR1OnQgaW5zdGFuY2VvZiBvdD9ndTpBcnJheS5pc0FycmF5KHQpP3l1OiJvYmplY3QiPT09ZSYmaXNOYU4odCk/cHU6dnUpKG4sdCl9XSx0YS5pbnRlcnBvbGF0ZUFycmF5PXl1O3ZhciBhbD1mdW5jdGlvbigpe3JldHVybiB5fSxjbD10YS5tYXAoe2xpbmVhcjphbCxwb2x5Omt1LHF1YWQ6ZnVuY3Rpb24oKXtyZXR1cm4gX3V9LGN1YmljOmZ1bmN0aW9uKCl7cmV0dXJuIHd1fSxzaW46ZnVuY3Rpb24oKXtyZXR1cm4gRXV9LGV4cDpmdW5jdGlvbigpe3JldHVybiBBdX0sY2lyY2xlOmZ1bmN0aW9uKCl7cmV0dXJuIE51fSxlbGFzdGljOkN1LGJhY2s6enUsYm91bmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHF1fX0pLGxsPXRhLm1hcCh7ImluIjp5LG91dDp4dSwiaW4tb3V0IjpidSwib3V0LWluIjpmdW5jdGlvbihuKXtyZXR1cm4gYnUoeHUobikpfX0pO3RhLmVhc2U9ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCItIiksZT10Pj0wP24uc2xpY2UoMCx0KTpuLHI9dD49MD9uLnNsaWNlKHQrMSk6ImluIjtyZXR1cm4gZT1jbC5nZXQoZSl8fGFsLHI9bGwuZ2V0KHIpfHx5LE11KHIoZS5hcHBseShudWxsLGVhLmNhbGwoYXJndW1lbnRzLDEpKSkpfSx0YS5pbnRlcnBvbGF0ZUhjbD1MdSx0YS5pbnRlcnBvbGF0ZUhzbD1UdSx0YS5pbnRlcnBvbGF0ZUxhYj1SdSx0YS5pbnRlcnBvbGF0ZVJvdW5kPUR1LHRhLnRyYW5zZm9ybT1mdW5jdGlvbihuKXt2YXIgdD11YS5jcmVhdGVFbGVtZW50TlModGEubnMucHJlZml4LnN2ZywiZyIpO3JldHVybih0YS50cmFuc2Zvcm09ZnVuY3Rpb24obil7aWYobnVsbCE9bil7dC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsbik7dmFyIGU9dC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpfXJldHVybiBuZXcgUHUoZT9lLm1hdHJpeDpzbCl9KShuKX0sUHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMudHJhbnNsYXRlKyIpcm90YXRlKCIrdGhpcy5yb3RhdGUrIilza2V3WCgiK3RoaXMuc2tldysiKXNjYWxlKCIrdGhpcy5zY2FsZSsiKSJ9O3ZhciBzbD17YToxLGI6MCxjOjAsZDoxLGU6MCxmOjB9O3RhLmludGVycG9sYXRlVHJhbnNmb3JtPUh1LHRhLmxheW91dD17fSx0YS5sYXlvdXQuYnVuZGxlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Zvcih2YXIgdD1bXSxlPS0xLHI9bi5sZW5ndGg7KytlPHI7KXQucHVzaChZdShuW2VdKSk7cmV0dXJuIHR9fSx0YS5sYXlvdXQuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG4sbCxmLGgsZyxwPXt9LHY9W10sZD10YS5yYW5nZShpKSxtPVtdO2ZvcihlPVtdLHI9W10sbj0wLGg9LTE7KytoPGk7KXtmb3IobD0wLGc9LTE7KytnPGk7KWwrPXVbaF1bZ107di5wdXNoKGwpLG0ucHVzaCh0YS5yYW5nZShpKSksbis9bH1mb3IobyYmZC5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG8odltuXSx2W3RdKX0pLGEmJm0uZm9yRWFjaChmdW5jdGlvbihuLHQpe24uc29ydChmdW5jdGlvbihuLGUpe3JldHVybiBhKHVbdF1bbl0sdVt0XVtlXSl9KX0pLG49KExhLXMqaSkvbixsPTAsaD0tMTsrK2g8aTspe2ZvcihmPWwsZz0tMTsrK2c8aTspe3ZhciB5PWRbaF0sTT1tW3ldW2ddLHg9dVt5XVtNXSxiPWwsXz1sKz14Km47cFt5KyItIitNXT17aW5kZXg6eSxzdWJpbmRleDpNLHN0YXJ0QW5nbGU6YixlbmRBbmdsZTpfLHZhbHVlOnh9fXJbeV09e2luZGV4Onksc3RhcnRBbmdsZTpmLGVuZEFuZ2xlOmwsdmFsdWU6KGwtZikvbn0sbCs9c31mb3IoaD0tMTsrK2g8aTspZm9yKGc9aC0xOysrZzxpOyl7dmFyIHc9cFtoKyItIitnXSxTPXBbZysiLSIraF07KHcudmFsdWV8fFMudmFsdWUpJiZlLnB1c2gody52YWx1ZTxTLnZhbHVlP3tzb3VyY2U6Uyx0YXJnZXQ6d306e3NvdXJjZTp3LHRhcmdldDpTfSl9YyYmdCgpfWZ1bmN0aW9uIHQoKXtlLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gYygobi5zb3VyY2UudmFsdWUrbi50YXJnZXQudmFsdWUpLzIsKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlKS8yKX0pfXZhciBlLHIsdSxpLG8sYSxjLGw9e30scz0wO3JldHVybiBsLm1hdHJpeD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1uKSYmdS5sZW5ndGgsZT1yPW51bGwsbCk6dX0sbC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4sZT1yPW51bGwsbCk6c30sbC5zb3J0R3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sZT1yPW51bGwsbCk6b30sbC5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sZT1udWxsLGwpOmF9LGwuc29ydENob3Jkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLGUmJnQoKSxsKTpjfSxsLmNob3Jkcz1mdW5jdGlvbigpe3JldHVybiBlfHxuKCksZX0sbC5ncm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gcnx8bigpLHJ9LGx9LHRhLmxheW91dC5mb3JjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLHUpe2lmKHQucG9pbnQhPT1uKXt2YXIgaT10LmN4LW4ueCxvPXQuY3ktbi55LGE9dS1lLGM9aSppK28qbztpZihjPmEqYS9kKXtpZihwPmMpe3ZhciBsPXQuY2hhcmdlL2M7bi5weC09aSpsLG4ucHktPW8qbH1yZXR1cm4hMH1pZih0LnBvaW50JiZjJiZwPmMpe3ZhciBsPXQucG9pbnRDaGFyZ2UvYztuLnB4LT1pKmwsbi5weS09bypsfX1yZXR1cm4hdC5jaGFyZ2V9fWZ1bmN0aW9uIHQobil7bi5weD10YS5ldmVudC54LG4ucHk9dGEuZXZlbnQueSxhLnJlc3VtZSgpfXZhciBlLHIsdSxpLG8sYT17fSxjPXRhLmRpc3BhdGNoKCJzdGFydCIsInRpY2siLCJlbmQiKSxsPVsxLDFdLHM9LjksZj1mbCxoPWhsLGc9LTMwLHA9Z2wsdj0uMSxkPS42NCxtPVtdLE09W107cmV0dXJuIGEudGljaz1mdW5jdGlvbigpe2lmKChyKj0uOTkpPC4wMDUpcmV0dXJuIGMuZW5kKHt0eXBlOiJlbmQiLGFscGhhOnI9MH0pLCEwO3ZhciB0LGUsYSxmLGgscCxkLHkseCxiPW0ubGVuZ3RoLF89TS5sZW5ndGg7Zm9yKGU9MDtfPmU7KytlKWE9TVtlXSxmPWEuc291cmNlLGg9YS50YXJnZXQseT1oLngtZi54LHg9aC55LWYueSwocD15KnkreCp4KSYmKHA9cippW2VdKigocD1NYXRoLnNxcnQocCkpLXVbZV0pL3AseSo9cCx4Kj1wLGgueC09eSooZD1mLndlaWdodC8oaC53ZWlnaHQrZi53ZWlnaHQpKSxoLnktPXgqZCxmLngrPXkqKGQ9MS1kKSxmLnkrPXgqZCk7aWYoKGQ9cip2KSYmKHk9bFswXS8yLHg9bFsxXS8yLGU9LTEsZCkpZm9yKDsrK2U8YjspYT1tW2VdLGEueCs9KHktYS54KSpkLGEueSs9KHgtYS55KSpkO2lmKGcpZm9yKEp1KHQ9dGEuZ2VvbS5xdWFkdHJlZShtKSxyLG8pLGU9LTE7KytlPGI7KShhPW1bZV0pLmZpeGVkfHx0LnZpc2l0KG4oYSkpO2ZvcihlPS0xOysrZTxiOylhPW1bZV0sYS5maXhlZD8oYS54PWEucHgsYS55PWEucHkpOihhLngtPShhLnB4LShhLnB4PWEueCkpKnMsYS55LT0oYS5weS0oYS5weT1hLnkpKSpzKTtjLnRpY2soe3R5cGU6InRpY2siLGFscGhhOnJ9KX0sYS5ub2Rlcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uLGEpOm19LGEubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09bixhKTpNfSxhLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bixhKTpsfSxhLmxpbmtEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGEpOmZ9LGEuZGlzdGFuY2U9YS5saW5rRGlzdGFuY2UsYS5saW5rU3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixhKTpofSxhLmZyaWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPStuLGEpOnN9LGEuY2hhcmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sYSk6Z30sYS5jaGFyZ2VEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1uKm4sYSk6TWF0aC5zcXJ0KHApfSxhLmdyYXZpdHk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9K24sYSk6dn0sYS50aGV0YT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1uKm4sYSk6TWF0aC5zcXJ0KGQpfSxhLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStuLHI/cj1uPjA/bjowOm4+MCYmKGMuc3RhcnQoe3R5cGU6InN0YXJ0IixhbHBoYTpyPW59KSx0YS50aW1lcihhLnRpY2spKSxhKTpyfSxhLnN0YXJ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe2lmKCFlKXtmb3IoZT1uZXcgQXJyYXkoYyksYT0wO2M+YTsrK2EpZVthXT1bXTtmb3IoYT0wO3M+YTsrK2Epe3ZhciB1PU1bYV07ZVt1LnNvdXJjZS5pbmRleF0ucHVzaCh1LnRhcmdldCksZVt1LnRhcmdldC5pbmRleF0ucHVzaCh1LnNvdXJjZSl9fWZvcih2YXIgaSxvPWVbdF0sYT0tMSxsPW8ubGVuZ3RoOysrYTxsOylpZighaXNOYU4oaT1vW2FdW25dKSlyZXR1cm4gaTtyZXR1cm4gTWF0aC5yYW5kb20oKSpyfXZhciB0LGUscixjPW0ubGVuZ3RoLHM9TS5sZW5ndGgscD1sWzBdLHY9bFsxXTtmb3IodD0wO2M+dDsrK3QpKHI9bVt0XSkuaW5kZXg9dCxyLndlaWdodD0wO2Zvcih0PTA7cz50OysrdClyPU1bdF0sIm51bWJlciI9PXR5cGVvZiByLnNvdXJjZSYmKHIuc291cmNlPW1bci5zb3VyY2VdKSwibnVtYmVyIj09dHlwZW9mIHIudGFyZ2V0JiYoci50YXJnZXQ9bVtyLnRhcmdldF0pLCsrci5zb3VyY2Uud2VpZ2h0LCsrci50YXJnZXQud2VpZ2h0O2Zvcih0PTA7Yz50OysrdClyPW1bdF0saXNOYU4oci54KSYmKHIueD1uKCJ4IixwKSksaXNOYU4oci55KSYmKHIueT1uKCJ5Iix2KSksaXNOYU4oci5weCkmJihyLnB4PXIueCksaXNOYU4oci5weSkmJihyLnB5PXIueSk7aWYodT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZilmb3IodD0wO3M+dDsrK3QpdVt0XT0rZi5jYWxsKHRoaXMsTVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdCl1W3RdPWY7aWYoaT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgaClmb3IodD0wO3M+dDsrK3QpaVt0XT0raC5jYWxsKHRoaXMsTVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdClpW3RdPWg7aWYobz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZylmb3IodD0wO2M+dDsrK3Qpb1t0XT0rZy5jYWxsKHRoaXMsbVt0XSx0KTtlbHNlIGZvcih0PTA7Yz50OysrdClvW3RdPWc7cmV0dXJuIGEucmVzdW1lKCl9LGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYWxwaGEoLjEpfSxhLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hbHBoYSgwKX0sYS5kcmFnPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fChlPXRhLmJlaGF2aW9yLmRyYWcoKS5vcmlnaW4oeSkub24oImRyYWdzdGFydC5mb3JjZSIsWHUpLm9uKCJkcmFnLmZvcmNlIix0KS5vbigiZHJhZ2VuZC5mb3JjZSIsJHUpKSxhcmd1bWVudHMubGVuZ3RoP3ZvaWQgdGhpcy5vbigibW91c2VvdmVyLmZvcmNlIixCdSkub24oIm1vdXNlb3V0LmZvcmNlIixXdSkuY2FsbChlKTplfSx0YS5yZWJpbmQoYSxjLCJvbiIpfTt2YXIgZmw9MjAsaGw9MSxnbD0xLzA7dGEubGF5b3V0LmhpZXJhcmNoeT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odSl7dmFyIGksbz1bdV0sYT1bXTtmb3IodS5kZXB0aD0wO251bGwhPShpPW8ucG9wKCkpOylpZihhLnB1c2goaSksKGw9ZS5jYWxsKG4saSxpLmRlcHRoKSkmJihjPWwubGVuZ3RoKSl7Zm9yKHZhciBjLGwsczstLWM+PTA7KW8ucHVzaChzPWxbY10pLHMucGFyZW50PWkscy5kZXB0aD1pLmRlcHRoKzE7ciYmKGkudmFsdWU9MCksaS5jaGlsZHJlbj1sfWVsc2UgciYmKGkudmFsdWU9K3IuY2FsbChuLGksaS5kZXB0aCl8fDApLGRlbGV0ZSBpLmNoaWxkcmVuO3JldHVybiBRdSh1LGZ1bmN0aW9uKG4pe3ZhciBlLHU7dCYmKGU9bi5jaGlsZHJlbikmJmUuc29ydCh0KSxyJiYodT1uLnBhcmVudCkmJih1LnZhbHVlKz1uLnZhbHVlKX0pLGF9dmFyIHQ9ZWksZT1uaSxyPXRpO3JldHVybiBuLnNvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLmNoaWxkcmVuPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4ucmV2YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gciYmKEt1KHQsZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmKG4udmFsdWU9MCl9KSxRdSh0LGZ1bmN0aW9uKHQpe3ZhciBlO3QuY2hpbGRyZW58fCh0LnZhbHVlPStyLmNhbGwobix0LHQuZGVwdGgpfHwwKSwoZT10LnBhcmVudCkmJihlLnZhbHVlKz10LnZhbHVlKX0pKSx0fSxufSx0YS5sYXlvdXQucGFydGl0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LGUscix1KXt2YXIgaT10LmNoaWxkcmVuO2lmKHQueD1lLHQueT10LmRlcHRoKnUsdC5keD1yLHQuZHk9dSxpJiYobz1pLmxlbmd0aCkpe3ZhciBvLGEsYyxsPS0xO2ZvcihyPXQudmFsdWU/ci90LnZhbHVlOjA7KytsPG87KW4oYT1pW2xdLGUsYz1hLnZhbHVlKnIsdSksZSs9Y319ZnVuY3Rpb24gdChuKXt2YXIgZT1uLmNoaWxkcmVuLHI9MDtpZihlJiYodT1lLmxlbmd0aCkpZm9yKHZhciB1LGk9LTE7KytpPHU7KXI9TWF0aC5tYXgocix0KGVbaV0pKTtyZXR1cm4gMStyfWZ1bmN0aW9uIGUoZSxpKXt2YXIgbz1yLmNhbGwodGhpcyxlLGkpO3JldHVybiBuKG9bMF0sMCx1WzBdLHVbMV0vdChvWzBdKSksb312YXIgcj10YS5sYXlvdXQuaGllcmFyY2h5KCksdT1bMSwxXTtyZXR1cm4gZS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sZSk6dX0sR3UoZSxyKX0sdGEubGF5b3V0LnBpZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obyl7dmFyIGEsYz1vLmxlbmd0aCxsPW8ubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuK3QuY2FsbChuLGUscil9KSxzPSsoImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ciksZj0oImZ1bmN0aW9uIj09dHlwZW9mIHU/dS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dSktcyxoPU1hdGgubWluKE1hdGguYWJzKGYpL2MsKygiZnVuY3Rpb24iPT10eXBlb2YgaT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppKSksZz1oKigwPmY/LTE6MSkscD0oZi1jKmcpL3RhLnN1bShsKSx2PXRhLnJhbmdlKGMpLGQ9W107cmV0dXJuIG51bGwhPWUmJnYuc29ydChlPT09cGw/ZnVuY3Rpb24obix0KXtyZXR1cm4gbFt0XS1sW25dfTpmdW5jdGlvbihuLHQpe3JldHVybiBlKG9bbl0sb1t0XSl9KSx2LmZvckVhY2goZnVuY3Rpb24obil7ZFtuXT17ZGF0YTpvW25dLHZhbHVlOmE9bFtuXSxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6cys9YSpwK2cscGFkQW5nbGU6aH19KSxkfXZhciB0PU51bWJlcixlPXBsLHI9MCx1PUxhLGk9MDtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uc29ydD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbn07dmFyIHBsPXt9O3RhLmxheW91dC5zdGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oYSxjKXtpZighKGg9YS5sZW5ndGgpKXJldHVybiBhO3ZhciBsPWEubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQuY2FsbChuLGUscil9KSxzPWwubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVybltpLmNhbGwobix0LGUpLG8uY2FsbChuLHQsZSldfSl9KSxmPWUuY2FsbChuLHMsYyk7bD10YS5wZXJtdXRlKGwsZikscz10YS5wZXJtdXRlKHMsZik7dmFyIGgsZyxwLHYsZD1yLmNhbGwobixzLGMpLG09bFswXS5sZW5ndGg7Zm9yKHA9MDttPnA7KytwKWZvcih1LmNhbGwobixsWzBdW3BdLHY9ZFtwXSxzWzBdW3BdWzFdKSxnPTE7aD5nOysrZyl1LmNhbGwobixsW2ddW3BdLHYrPXNbZy0xXVtwXVsxXSxzW2ddW3BdWzFdKTtyZXR1cm4gYX12YXIgdD15LGU9YWkscj1jaSx1PW9pLGk9dWksbz1paTtyZXR1cm4gbi52YWx1ZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLm9yZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dmwuZ2V0KHQpfHxhaSxuKTplfSxuLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRsLmdldCh0KXx8Y2ksbik6cn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQsbik6b30sbi5vdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxufTt2YXIgdmw9dGEubWFwKHsiaW5zaWRlLW91dCI6ZnVuY3Rpb24obil7dmFyIHQsZSxyPW4ubGVuZ3RoLHU9bi5tYXAobGkpLGk9bi5tYXAoc2kpLG89dGEucmFuZ2Uocikuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiB1W25dLXVbdF19KSxhPTAsYz0wLGw9W10scz1bXTtmb3IodD0wO3I+dDsrK3QpZT1vW3RdLGM+YT8oYSs9aVtlXSxsLnB1c2goZSkpOihjKz1pW2VdLHMucHVzaChlKSk7cmV0dXJuIHMucmV2ZXJzZSgpLmNvbmNhdChsKX0scmV2ZXJzZTpmdW5jdGlvbihuKXtyZXR1cm4gdGEucmFuZ2Uobi5sZW5ndGgpLnJldmVyc2UoKX0sImRlZmF1bHQiOmFpfSksZGw9dGEubWFwKHtzaWxob3VldHRlOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsbz1bXSxhPTAsYz1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtyPmEmJihhPXIpLG8ucHVzaChyKX1mb3IoZT0wO2k+ZTsrK2UpY1tlXT0oYS1vW2VdKS8yO3JldHVybiBjfSx3aWdnbGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaSxvLGEsYyxsLHM9bi5sZW5ndGgsZj1uWzBdLGg9Zi5sZW5ndGgsZz1bXTtmb3IoZ1swXT1jPWw9MCxlPTE7aD5lOysrZSl7Zm9yKHQ9MCx1PTA7cz50OysrdCl1Kz1uW3RdW2VdWzFdO2Zvcih0PTAsaT0wLGE9ZltlXVswXS1mW2UtMV1bMF07cz50OysrdCl7Zm9yKHI9MCxvPShuW3RdW2VdWzFdLW5bdF1bZS0xXVsxXSkvKDIqYSk7dD5yOysrcilvKz0obltyXVtlXVsxXS1uW3JdW2UtMV1bMV0pL2E7aSs9bypuW3RdW2VdWzFdfWdbZV09Yy09dT9pL3UqYTowLGw+YyYmKGw9Yyl9Zm9yKGU9MDtoPmU7KytlKWdbZV0tPWw7cmV0dXJuIGd9LGV4cGFuZDpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1uLmxlbmd0aCxpPW5bMF0ubGVuZ3RoLG89MS91LGE9W107Zm9yKGU9MDtpPmU7KytlKXtmb3IodD0wLHI9MDt1PnQ7dCsrKXIrPW5bdF1bZV1bMV07aWYocilmb3IodD0wO3U+dDt0Kyspblt0XVtlXVsxXS89cjtlbHNlIGZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdPW99Zm9yKGU9MDtpPmU7KytlKWFbZV09MDtyZXR1cm4gYX0semVybzpjaX0pO3RhLmxheW91dC5oaXN0b2dyYW09ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7Zm9yKHZhciBvLGEsYz1bXSxsPW4ubWFwKGUsdGhpcykscz1yLmNhbGwodGhpcyxsLGkpLGY9dS5jYWxsKHRoaXMscyxsLGkpLGk9LTEsaD1sLmxlbmd0aCxnPWYubGVuZ3RoLTEscD10PzE6MS9oOysraTxnOylvPWNbaV09W10sby5keD1mW2krMV0tKG8ueD1mW2ldKSxvLnk9MDtpZihnPjApZm9yKGk9LTE7KytpPGg7KWE9bFtpXSxhPj1zWzBdJiZhPD1zWzFdJiYobz1jW3RhLmJpc2VjdChmLGEsMSxnKS0xXSxvLnkrPXAsby5wdXNoKG5baV0pKTtyZXR1cm4gY312YXIgdD0hMCxlPU51bWJlcixyPXBpLHU9aGk7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUV0KHQpLG4pOnJ9LG4uYmlucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24obil7cmV0dXJuIGdpKG4sdCl9OkV0KHQpLG4pOnV9LG4uZnJlcXVlbmN5PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSEhZSxuKTp0fSxufSx0YS5sYXlvdXQucGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXt2YXIgbz1lLmNhbGwodGhpcyxuLGkpLGE9b1swXSxjPXVbMF0sbD11WzFdLHM9bnVsbD09dD9NYXRoLnNxcnQ6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fTtpZihhLng9YS55PTAsUXUoYSxmdW5jdGlvbihuKXtuLnI9K3Mobi52YWx1ZSl9KSxRdShhLE1pKSxyKXt2YXIgZj1yKih0PzE6TWF0aC5tYXgoMiphLnIvYywyKmEuci9sKSkvMjtRdShhLGZ1bmN0aW9uKG4pe24ucis9Zn0pLFF1KGEsTWkpLFF1KGEsZnVuY3Rpb24obil7bi5yLT1mfSl9cmV0dXJuIF9pKGEsYy8yLGwvMix0PzE6MS9NYXRoLm1heCgyKmEuci9jLDIqYS5yL2wpKSxvfXZhciB0LGU9dGEubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQodmkpLHI9MCx1PVsxLDFdO3JldHVybiBuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT1lfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9lOitlLG4pOnR9LG4ucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxHdShuLGUpfSx0YS5sYXlvdXQudHJlZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgcz1vLmNhbGwodGhpcyxuLHUpLGY9c1swXSxoPXQoZik7aWYoUXUoaCxlKSxoLnBhcmVudC5tPS1oLnosS3UoaCxyKSxsKUt1KGYsaSk7ZWxzZXt2YXIgZz1mLHA9Zix2PWY7S3UoZixmdW5jdGlvbihuKXtuLng8Zy54JiYoZz1uKSxuLng+cC54JiYocD1uKSxuLmRlcHRoPnYuZGVwdGgmJih2PW4pfSk7dmFyIGQ9YShnLHApLzItZy54LG09Y1swXS8ocC54K2EocCxnKS8yK2QpLHk9Y1sxXS8odi5kZXB0aHx8MSk7S3UoZixmdW5jdGlvbihuKXtuLng9KG4ueCtkKSptLG4ueT1uLmRlcHRoKnl9KX1yZXR1cm4gc31mdW5jdGlvbiB0KG4pe2Zvcih2YXIgdCxlPXtBOm51bGwsY2hpbGRyZW46W25dfSxyPVtlXTtudWxsIT0odD1yLnBvcCgpKTspZm9yKHZhciB1LGk9dC5jaGlsZHJlbixvPTAsYT1pLmxlbmd0aDthPm87KytvKXIucHVzaCgoaVtvXT11PXtfOmlbb10scGFyZW50OnQsY2hpbGRyZW46KHU9aVtvXS5jaGlsZHJlbikmJnUuc2xpY2UoKXx8W10sQTpudWxsLGE6bnVsbCx6OjAsbTowLGM6MCxzOjAsdDpudWxsLGk6b30pLmE9dSk7cmV0dXJuIGUuY2hpbGRyZW5bMF19ZnVuY3Rpb24gZShuKXt2YXIgdD1uLmNoaWxkcmVuLGU9bi5wYXJlbnQuY2hpbGRyZW4scj1uLmk/ZVtuLmktMV06bnVsbDtpZih0Lmxlbmd0aCl7Tmkobik7dmFyIGk9KHRbMF0ueit0W3QubGVuZ3RoLTFdLnopLzI7cj8obi56PXIueithKG4uXyxyLl8pLG4ubT1uLnotaSk6bi56PWl9ZWxzZSByJiYobi56PXIueithKG4uXyxyLl8pKTtuLnBhcmVudC5BPXUobixyLG4ucGFyZW50LkF8fGVbMF0pfWZ1bmN0aW9uIHIobil7bi5fLng9bi56K24ucGFyZW50Lm0sbi5tKz1uLnBhcmVudC5tfWZ1bmN0aW9uIHUobix0LGUpe2lmKHQpe2Zvcih2YXIgcix1PW4saT1uLG89dCxjPXUucGFyZW50LmNoaWxkcmVuWzBdLGw9dS5tLHM9aS5tLGY9by5tLGg9Yy5tO289RWkobyksdT1raSh1KSxvJiZ1OyljPWtpKGMpLGk9RWkoaSksaS5hPW4scj1vLnorZi11LnotbCthKG8uXyx1Ll8pLHI+MCYmKEFpKENpKG8sbixlKSxuLHIpLGwrPXIscys9ciksZis9by5tLGwrPXUubSxoKz1jLm0scys9aS5tO28mJiFFaShpKSYmKGkudD1vLGkubSs9Zi1zKSx1JiYha2koYykmJihjLnQ9dSxjLm0rPWwtaCxlPW4pfXJldHVybiBlfWZ1bmN0aW9uIGkobil7bi54Kj1jWzBdLG4ueT1uLmRlcHRoKmNbMV19dmFyIG89dGEubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksYT1TaSxjPVsxLDFdLGw9bnVsbDtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbik6YX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW51bGw9PShjPXQpP2k6bnVsbCxuKTpsP251bGw6Y30sbi5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1udWxsPT0oYz10KT9udWxsOmksbik6bD9jOm51bGx9LEd1KG4sbyl9LHRhLmxheW91dC5jbHVzdGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBvLGE9dC5jYWxsKHRoaXMsbixpKSxjPWFbMF0sbD0wO1F1KGMsZnVuY3Rpb24obil7dmFyIHQ9bi5jaGlsZHJlbjt0JiZ0Lmxlbmd0aD8obi54PXFpKHQpLG4ueT16aSh0KSk6KG4ueD1vP2wrPWUobixvKTowLG4ueT0wLG89bil9KTt2YXIgcz1MaShjKSxmPVRpKGMpLGg9cy54LWUocyxmKS8yLGc9Zi54K2UoZixzKS8yO3JldHVybiBRdShjLHU/ZnVuY3Rpb24obil7bi54PShuLngtYy54KSpyWzBdLG4ueT0oYy55LW4ueSkqclsxXX06ZnVuY3Rpb24obil7bi54PShuLngtaCkvKGctaCkqclswXSxuLnk9KDEtKGMueT9uLnkvYy55OjEpKSpyWzFdfSksYX12YXIgdD10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxlPVNpLHI9WzEsMV0sdT0hMTtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PShyPXQpLG4pOnU/bnVsbDpyfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGwhPShyPXQpLG4pOnU/cjpudWxsfSxHdShuLHQpfSx0YS5sYXlvdXQudHJlZW1hcD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix0KXtmb3IodmFyIGUscix1PS0xLGk9bi5sZW5ndGg7Kyt1PGk7KXI9KGU9blt1XSkudmFsdWUqKDA+dD8wOnQpLGUuYXJlYT1pc05hTihyKXx8MD49cj8wOnJ9ZnVuY3Rpb24gdChlKXt2YXIgaT1lLmNoaWxkcmVuO2lmKGkmJmkubGVuZ3RoKXt2YXIgbyxhLGMsbD1mKGUpLHM9W10saD1pLnNsaWNlKCkscD0xLzAsdj0ic2xpY2UiPT09Zz9sLmR4OiJkaWNlIj09PWc/bC5keToic2xpY2UtZGljZSI9PT1nPzEmZS5kZXB0aD9sLmR5OmwuZHg6TWF0aC5taW4obC5keCxsLmR5KTtmb3IobihoLGwuZHgqbC5keS9lLnZhbHVlKSxzLmFyZWE9MDsoYz1oLmxlbmd0aCk+MDspcy5wdXNoKG89aFtjLTFdKSxzLmFyZWErPW8uYXJlYSwic3F1YXJpZnkiIT09Z3x8KGE9cihzLHYpKTw9cD8oaC5wb3AoKSxwPWEpOihzLmFyZWEtPXMucG9wKCkuYXJlYSx1KHMsdixsLCExKSx2PU1hdGgubWluKGwuZHgsbC5keSkscy5sZW5ndGg9cy5hcmVhPTAscD0xLzApO3MubGVuZ3RoJiYodShzLHYsbCwhMCkscy5sZW5ndGg9cy5hcmVhPTApLGkuZm9yRWFjaCh0KX19ZnVuY3Rpb24gZSh0KXt2YXIgcj10LmNoaWxkcmVuO2lmKHImJnIubGVuZ3RoKXt2YXIgaSxvPWYodCksYT1yLnNsaWNlKCksYz1bXTtmb3IobihhLG8uZHgqby5keS90LnZhbHVlKSxjLmFyZWE9MDtpPWEucG9wKCk7KWMucHVzaChpKSxjLmFyZWErPWkuYXJlYSxudWxsIT1pLnomJih1KGMsaS56P28uZHg6by5keSxvLCFhLmxlbmd0aCksYy5sZW5ndGg9Yy5hcmVhPTApO3IuZm9yRWFjaChlKX19ZnVuY3Rpb24gcihuLHQpe2Zvcih2YXIgZSxyPW4uYXJlYSx1PTAsaT0xLzAsbz0tMSxhPW4ubGVuZ3RoOysrbzxhOykoZT1uW29dLmFyZWEpJiYoaT5lJiYoaT1lKSxlPnUmJih1PWUpKTtyZXR1cm4gcio9cix0Kj10LHI/TWF0aC5tYXgodCp1KnAvcixyLyh0KmkqcCkpOjEvMH1mdW5jdGlvbiB1KG4sdCxlLHIpe3ZhciB1LGk9LTEsbz1uLmxlbmd0aCxhPWUueCxsPWUueSxzPXQ/YyhuLmFyZWEvdCk6MDtpZih0PT1lLmR4KXtmb3IoKHJ8fHM+ZS5keSkmJihzPWUuZHkpOysraTxvOyl1PW5baV0sdS54PWEsdS55PWwsdS5keT1zLGErPXUuZHg9TWF0aC5taW4oZS54K2UuZHgtYSxzP2ModS5hcmVhL3MpOjApO3Uuej0hMCx1LmR4Kz1lLngrZS5keC1hLGUueSs9cyxlLmR5LT1zfWVsc2V7Zm9yKChyfHxzPmUuZHgpJiYocz1lLmR4KTsrK2k8bzspdT1uW2ldLHUueD1hLHUueT1sLHUuZHg9cyxsKz11LmR5PU1hdGgubWluKGUueStlLmR5LWwscz9jKHUuYXJlYS9zKTowKTt1Lno9ITEsdS5keSs9ZS55K2UuZHktbCxlLngrPXMsZS5keC09c319ZnVuY3Rpb24gaShyKXt2YXIgdT1vfHxhKHIpLGk9dVswXTtyZXR1cm4gaS54PTAsaS55PTAsaS5keD1sWzBdLGkuZHk9bFsxXSxvJiZhLnJldmFsdWUoaSksbihbaV0saS5keCppLmR5L2kudmFsdWUpLChvP2U6dCkoaSksaCYmKG89dSksdX12YXIgbyxhPXRhLmxheW91dC5oaWVyYXJjaHkoKSxjPU1hdGgucm91bmQsbD1bMSwxXSxzPW51bGwsZj1SaSxoPSExLGc9InNxdWFyaWZ5IixwPS41KigxK01hdGguc3FydCg1KSk7CnJldHVybiBpLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bixpKTpsfSxpLnBhZGRpbmc9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdCh0KXt2YXIgZT1uLmNhbGwoaSx0LHQuZGVwdGgpO3JldHVybiBudWxsPT1lP1JpKHQpOkRpKHQsIm51bWJlciI9PXR5cGVvZiBlP1tlLGUsZSxlXTplKX1mdW5jdGlvbiBlKHQpe3JldHVybiBEaSh0LG4pfWlmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBzO3ZhciByO3JldHVybiBmPW51bGw9PShzPW4pP1JpOiJmdW5jdGlvbiI9PShyPXR5cGVvZiBuKT90OiJudW1iZXIiPT09cj8obj1bbixuLG4sbl0sZSk6ZSxpfSxpLnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4/TWF0aC5yb3VuZDpOdW1iZXIsaSk6YyE9TnVtYmVyfSxpLnN0aWNreT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1uLG89bnVsbCxpKTpofSxpLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPW4saSk6cH0saS5tb2RlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPW4rIiIsaSk6Z30sR3UoaSxhKX0sdGEucmFuZG9tPXtub3JtYWw6ZnVuY3Rpb24obix0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoO3JldHVybiAyPmUmJih0PTEpLDE+ZSYmKG49MCksZnVuY3Rpb24oKXt2YXIgZSxyLHU7ZG8gZT0yKk1hdGgucmFuZG9tKCktMSxyPTIqTWF0aC5yYW5kb20oKS0xLHU9ZSplK3Iqcjt3aGlsZSghdXx8dT4xKTtyZXR1cm4gbit0KmUqTWF0aC5zcXJ0KC0yKk1hdGgubG9nKHUpL3UpfX0sbG9nTm9ybWFsOmZ1bmN0aW9uKCl7dmFyIG49dGEucmFuZG9tLm5vcm1hbC5hcHBseSh0YSxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYXRoLmV4cChuKCkpfX0sYmF0ZXM6ZnVuY3Rpb24obil7dmFyIHQ9dGEucmFuZG9tLmlyd2luSGFsbChuKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdCgpL259fSxpcndpbkhhbGw6ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO24+ZTtlKyspdCs9TWF0aC5yYW5kb20oKTtyZXR1cm4gdH19fSx0YS5zY2FsZT17fTt2YXIgbWw9e2Zsb29yOnksY2VpbDp5fTt0YS5zY2FsZS5saW5lYXI9ZnVuY3Rpb24oKXtyZXR1cm4gSWkoWzAsMV0sWzAsMV0sbXUsITEpfTt2YXIgeWw9e3M6MSxnOjEscDoxLHI6MSxlOjF9O3RhLnNjYWxlLmxvZz1mdW5jdGlvbigpe3JldHVybiBKaSh0YS5zY2FsZS5saW5lYXIoKS5kb21haW4oWzAsMV0pLDEwLCEwLFsxLDEwXSl9O3ZhciBNbD10YS5mb3JtYXQoIi4wZSIpLHhsPXtmbG9vcjpmdW5jdGlvbihuKXtyZXR1cm4tTWF0aC5jZWlsKC1uKX0sY2VpbDpmdW5jdGlvbihuKXtyZXR1cm4tTWF0aC5mbG9vcigtbil9fTt0YS5zY2FsZS5wb3c9ZnVuY3Rpb24oKXtyZXR1cm4gR2kodGEuc2NhbGUubGluZWFyKCksMSxbMCwxXSl9LHRhLnNjYWxlLnNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUucG93KCkuZXhwb25lbnQoLjUpfSx0YS5zY2FsZS5vcmRpbmFsPWZ1bmN0aW9uKCl7cmV0dXJuIFFpKFtdLHt0OiJyYW5nZSIsYTpbW11dfSl9LHRhLnNjYWxlLmNhdGVnb3J5MTA9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGJsKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMD1mdW5jdGlvbigpe3JldHVybiB0YS5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoX2wpfSx0YS5zY2FsZS5jYXRlZ29yeTIwYj1mdW5jdGlvbigpe3JldHVybiB0YS5zY2FsZS5vcmRpbmFsKCkucmFuZ2Uod2wpfSx0YS5zY2FsZS5jYXRlZ29yeTIwYz1mdW5jdGlvbigpe3JldHVybiB0YS5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoU2wpfTt2YXIgYmw9WzIwNjIyNjAsMTY3NDQyMDYsMjkyNDU4OCwxNDAzNDcyOCw5NzI1ODg1LDkxOTcxMzEsMTQ5MDczMzAsODM1NTcxMSwxMjM2OTE4NiwxNTU2MTc1XS5tYXAoTXQpLF9sPVsyMDYyMjYwLDExNDU0NDQwLDE2NzQ0MjA2LDE2NzU5NjcyLDI5MjQ1ODgsMTAwMTg2OTgsMTQwMzQ3MjgsMTY3NTA3NDIsOTcyNTg4NSwxMjk1NTg2MSw5MTk3MTMxLDEyODg1MTQwLDE0OTA3MzMwLDE2MjM0MTk0LDgzNTU3MTEsMTMwOTI4MDcsMTIzNjkxODYsMTQ0MDg1ODksMTU1NjE3NSwxMDQxMDcyNV0ubWFwKE10KSx3bD1bMzc1MDc3Nyw1Mzk1NjE5LDcwNDA3MTksMTAyNjQyODYsNjUxOTA5Nyw5MjE2NTk0LDExOTE1MTE1LDEzNTU2NjM2LDkyMDI5OTMsMTI0MjY4MDksMTUxODY1MTQsMTUxOTA5MzIsODY2NjE2OSwxMTM1NjQ5MCwxNDA0OTY0MywxNTE3NzM3Miw4MDc3NjgzLDEwODM0MzI0LDEzNTI4NTA5LDE0NTg5NjU0XS5tYXAoTXQpLFNsPVszMjQ0NzMzLDcwNTcxMTAsMTA0MDY2MjUsMTMwMzI0MzEsMTUwOTUwNTMsMTY2MTY3NjQsMTY2MjUyNTksMTY2MzQwMTgsMzI1MzA3Niw3NjUyNDcwLDEwNjA3MDAzLDEzMTAxNTA0LDc2OTUyODEsMTAzOTQzMTIsMTIzNjkzNzIsMTQzNDI4OTEsNjUxMzUwNyw5ODY4OTUwLDEyNDM0ODc3LDE0Mjc3MDgxXS5tYXAoTXQpO3RhLnNjYWxlLnF1YW50aWxlPWZ1bmN0aW9uKCl7cmV0dXJuIG5vKFtdLFtdKX0sdGEuc2NhbGUucXVhbnRpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdG8oMCwxLFswLDFdKX0sdGEuc2NhbGUudGhyZXNob2xkPWZ1bmN0aW9uKCl7cmV0dXJuIGVvKFsuNV0sWzAsMV0pfSx0YS5zY2FsZS5pZGVudGl0eT1mdW5jdGlvbigpe3JldHVybiBybyhbMCwxXSl9LHRhLnN2Zz17fSx0YS5zdmcuYXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3ZhciBuPU1hdGgubWF4KDAsK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxsPU1hdGgubWF4KDAsK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxzPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLVJhLGY9YS5hcHBseSh0aGlzLGFyZ3VtZW50cyktUmEsaD1NYXRoLmFicyhmLXMpLGc9cz5mPzA6MTtpZihuPmwmJihwPWwsbD1uLG49cCksaD49VGEpcmV0dXJuIHQobCxnKSsobj90KG4sMS1nKToiIikrIloiO3ZhciBwLHYsZCxtLHksTSx4LGIsXyx3LFMsayxFPTAsQT0wLE49W107aWYoKG09KCtjLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8MCkvMikmJihkPWk9PT1rbD9NYXRoLnNxcnQobipuK2wqbCk6K2kuYXBwbHkodGhpcyxhcmd1bWVudHMpLGd8fChBKj0tMSksbCYmKEE9dHQoZC9sKk1hdGguc2luKG0pKSksbiYmKEU9dHQoZC9uKk1hdGguc2luKG0pKSkpLGwpe3k9bCpNYXRoLmNvcyhzK0EpLE09bCpNYXRoLnNpbihzK0EpLHg9bCpNYXRoLmNvcyhmLUEpLGI9bCpNYXRoLnNpbihmLUEpO3ZhciBDPU1hdGguYWJzKGYtcy0yKkEpPD1xYT8wOjE7aWYoQSYmc28oeSxNLHgsYik9PT1nXkMpe3ZhciB6PShzK2YpLzI7eT1sKk1hdGguY29zKHopLE09bCpNYXRoLnNpbih6KSx4PWI9bnVsbH19ZWxzZSB5PU09MDtpZihuKXtfPW4qTWF0aC5jb3MoZi1FKSx3PW4qTWF0aC5zaW4oZi1FKSxTPW4qTWF0aC5jb3MocytFKSxrPW4qTWF0aC5zaW4ocytFKTt2YXIgcT1NYXRoLmFicyhzLWYrMipFKTw9cWE/MDoxO2lmKEUmJnNvKF8sdyxTLGspPT09MS1nXnEpe3ZhciBMPShzK2YpLzI7Xz1uKk1hdGguY29zKEwpLHc9bipNYXRoLnNpbihMKSxTPWs9bnVsbH19ZWxzZSBfPXc9MDtpZigocD1NYXRoLm1pbihNYXRoLmFicyhsLW4pLzIsK3UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSk+LjAwMSl7dj1sPm5eZz8wOjE7dmFyIFQ9bnVsbD09Uz9bXyx3XTpudWxsPT14P1t5LE1dOkxyKFt5LE1dLFtTLGtdLFt4LGJdLFtfLHddKSxSPXktVFswXSxEPU0tVFsxXSxQPXgtVFswXSxVPWItVFsxXSxqPTEvTWF0aC5zaW4oTWF0aC5hY29zKChSKlArRCpVKS8oTWF0aC5zcXJ0KFIqUitEKkQpKk1hdGguc3FydChQKlArVSpVKSkpLzIpLEY9TWF0aC5zcXJ0KFRbMF0qVFswXStUWzFdKlRbMV0pO2lmKG51bGwhPXgpe3ZhciBIPU1hdGgubWluKHAsKGwtRikvKGorMSkpLE89Zm8obnVsbD09Uz9bXyx3XTpbUyxrXSxbeSxNXSxsLEgsZyksST1mbyhbeCxiXSxbXyx3XSxsLEgsZyk7cD09PUg/Ti5wdXNoKCJNIixPWzBdLCJBIixILCIsIixILCIgMCAwLCIsdiwiICIsT1sxXSwiQSIsbCwiLCIsbCwiIDAgIiwxLWdec28oT1sxXVswXSxPWzFdWzFdLElbMV1bMF0sSVsxXVsxXSksIiwiLGcsIiAiLElbMV0sIkEiLEgsIiwiLEgsIiAwIDAsIix2LCIgIixJWzBdKTpOLnB1c2goIk0iLE9bMF0sIkEiLEgsIiwiLEgsIiAwIDEsIix2LCIgIixJWzBdKX1lbHNlIE4ucHVzaCgiTSIseSwiLCIsTSk7aWYobnVsbCE9Uyl7dmFyIFk9TWF0aC5taW4ocCwobi1GKS8oai0xKSksWj1mbyhbeSxNXSxbUyxrXSxuLC1ZLGcpLFY9Zm8oW18sd10sbnVsbD09eD9beSxNXTpbeCxiXSxuLC1ZLGcpO3A9PT1ZP04ucHVzaCgiTCIsVlswXSwiQSIsWSwiLCIsWSwiIDAgMCwiLHYsIiAiLFZbMV0sIkEiLG4sIiwiLG4sIiAwICIsZ15zbyhWWzFdWzBdLFZbMV1bMV0sWlsxXVswXSxaWzFdWzFdKSwiLCIsMS1nLCIgIixaWzFdLCJBIixZLCIsIixZLCIgMCAwLCIsdiwiICIsWlswXSk6Ti5wdXNoKCJMIixWWzBdLCJBIixZLCIsIixZLCIgMCAwLCIsdiwiICIsWlswXSl9ZWxzZSBOLnB1c2goIkwiLF8sIiwiLHcpfWVsc2UgTi5wdXNoKCJNIix5LCIsIixNKSxudWxsIT14JiZOLnB1c2goIkEiLGwsIiwiLGwsIiAwICIsQywiLCIsZywiICIseCwiLCIsYiksTi5wdXNoKCJMIixfLCIsIix3KSxudWxsIT1TJiZOLnB1c2goIkEiLG4sIiwiLG4sIiAwICIscSwiLCIsMS1nLCIgIixTLCIsIixrKTtyZXR1cm4gTi5wdXNoKCJaIiksTi5qb2luKCIiKX1mdW5jdGlvbiB0KG4sdCl7cmV0dXJuIk0wLCIrbisiQSIrbisiLCIrbisiIDAgMSwiK3QrIiAwLCIrLW4rIkEiK24rIiwiK24rIiAwIDEsIit0KyIgMCwiK259dmFyIGU9aW8scj1vbyx1PXVvLGk9a2wsbz1hbyxhPWNvLGM9bG87cmV0dXJuIG4uaW5uZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9RXQodCksbik6ZX0sbi5vdXRlclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1FdCh0KSxuKTpyfSxuLmNvcm5lclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1FdCh0KSxuKTp1fSxuLnBhZFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10PT1rbD9rbDpFdCh0KSxuKTppfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89RXQodCksbik6b30sbi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1FdCh0KSxuKTphfSxuLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPUV0KHQpLG4pOmN9LG4uY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgbj0oK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIsdD0oK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKyArYS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItUmE7cmV0dXJuW01hdGguY29zKHQpKm4sTWF0aC5zaW4odCkqbl19LG59O3ZhciBrbD0iYXV0byI7dGEuc3ZnLmxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gaG8oeSl9O3ZhciBFbD10YS5tYXAoe2xpbmVhcjpnbywibGluZWFyLWNsb3NlZCI6cG8sc3RlcDp2bywic3RlcC1iZWZvcmUiOm1vLCJzdGVwLWFmdGVyIjp5byxiYXNpczpTbywiYmFzaXMtb3BlbiI6a28sImJhc2lzLWNsb3NlZCI6RW8sYnVuZGxlOkFvLGNhcmRpbmFsOmJvLCJjYXJkaW5hbC1vcGVuIjpNbywiY2FyZGluYWwtY2xvc2VkIjp4byxtb25vdG9uZTpUb30pO0VsLmZvckVhY2goZnVuY3Rpb24obix0KXt0LmtleT1uLHQuY2xvc2VkPS8tY2xvc2VkJC8udGVzdChuKX0pO3ZhciBBbD1bMCwyLzMsMS8zLDBdLE5sPVswLDEvMywyLzMsMF0sQ2w9WzAsMS82LDIvMywxLzZdO3RhLnN2Zy5saW5lLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPWhvKFJvKTtyZXR1cm4gbi5yYWRpdXM9bi54LGRlbGV0ZSBuLngsbi5hbmdsZT1uLnksZGVsZXRlIG4ueSxufSxtby5yZXZlcnNlPXlvLHlvLnJldmVyc2U9bW8sdGEuc3ZnLmFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gRG8oeSl9LHRhLnN2Zy5hcmVhLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPURvKFJvKTtyZXR1cm4gbi5yYWRpdXM9bi54LGRlbGV0ZSBuLngsbi5pbm5lclJhZGl1cz1uLngwLGRlbGV0ZSBuLngwLG4ub3V0ZXJSYWRpdXM9bi54MSxkZWxldGUgbi54MSxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG4uc3RhcnRBbmdsZT1uLnkwLGRlbGV0ZSBuLnkwLG4uZW5kQW5nbGU9bi55MSxkZWxldGUgbi55MSxufSx0YS5zdmcuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sYSl7dmFyIGM9dCh0aGlzLGksbixhKSxsPXQodGhpcyxvLG4sYSk7cmV0dXJuIk0iK2MucDArcihjLnIsYy5wMSxjLmExLWMuYTApKyhlKGMsbCk/dShjLnIsYy5wMSxjLnIsYy5wMCk6dShjLnIsYy5wMSxsLnIsbC5wMCkrcihsLnIsbC5wMSxsLmExLWwuYTApK3UobC5yLGwucDEsYy5yLGMucDApKSsiWiJ9ZnVuY3Rpb24gdChuLHQsZSxyKXt2YXIgdT10LmNhbGwobixlLHIpLGk9YS5jYWxsKG4sdSxyKSxvPWMuY2FsbChuLHUsciktUmEscz1sLmNhbGwobix1LHIpLVJhO3JldHVybntyOmksYTA6byxhMTpzLHAwOltpKk1hdGguY29zKG8pLGkqTWF0aC5zaW4obyldLHAxOltpKk1hdGguY29zKHMpLGkqTWF0aC5zaW4ocyldfX1mdW5jdGlvbiBlKG4sdCl7cmV0dXJuIG4uYTA9PXQuYTAmJm4uYTE9PXQuYTF9ZnVuY3Rpb24gcihuLHQsZSl7cmV0dXJuIkEiK24rIiwiK24rIiAwICIrICsoZT5xYSkrIiwxICIrdH1mdW5jdGlvbiB1KG4sdCxlLHIpe3JldHVybiJRIDAsMCAiK3J9dmFyIGk9bXIsbz15cixhPVBvLGM9YW8sbD1jbztyZXR1cm4gbi5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9RXQodCksbik6YX0sbi5zb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9RXQodCksbik6aX0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89RXQodCksbik6b30sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPUV0KHQpLG4pOmN9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9RXQodCksbik6bH0sbn0sdGEuc3ZnLmRpYWdvbmFsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPXQuY2FsbCh0aGlzLG4sdSksbz1lLmNhbGwodGhpcyxuLHUpLGE9KGkueStvLnkpLzIsYz1baSx7eDppLngseTphfSx7eDpvLngseTphfSxvXTtyZXR1cm4gYz1jLm1hcChyKSwiTSIrY1swXSsiQyIrY1sxXSsiICIrY1syXSsiICIrY1szXX12YXIgdD1tcixlPXlyLHI9VW87cmV0dXJuIG4uc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUV0KGUpLG4pOnR9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUV0KHQpLG4pOmV9LG4ucHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG59LHRhLnN2Zy5kaWFnb25hbC5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj10YS5zdmcuZGlhZ29uYWwoKSx0PVVvLGU9bi5wcm9qZWN0aW9uO3JldHVybiBuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZShqbyh0PW4pKTp0fSxufSx0YS5zdmcuc3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe3JldHVybih6bC5nZXQodC5jYWxsKHRoaXMsbixyKSl8fE9vKShlLmNhbGwodGhpcyxuLHIpKX12YXIgdD1IbyxlPUZvO3JldHVybiBuLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9RXQoZSksbik6dH0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUV0KHQpLG4pOmV9LG59O3ZhciB6bD10YS5tYXAoe2NpcmNsZTpPbyxjcm9zczpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi81KS8yO3JldHVybiJNIistMyp0KyIsIistdCsiSCIrLXQrIlYiKy0zKnQrIkgiK3QrIlYiKy10KyJIIiszKnQrIlYiK3QrIkgiK3QrIlYiKzMqdCsiSCIrLXQrIlYiK3QrIkgiKy0zKnQrIloifSxkaWFtb25kOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuLygyKkxsKSksZT10KkxsO3JldHVybiJNMCwiKy10KyJMIitlKyIsMCAwLCIrdCsiICIrLWUrIiwwWiJ9LHNxdWFyZTpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobikvMjtyZXR1cm4iTSIrLXQrIiwiKy10KyJMIit0KyIsIistdCsiICIrdCsiLCIrdCsiICIrLXQrIiwiK3QrIloifSwidHJpYW5nbGUtZG93biI6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vcWwpLGU9dCpxbC8yO3JldHVybiJNMCwiK2UrIkwiK3QrIiwiKy1lKyIgIistdCsiLCIrLWUrIloifSwidHJpYW5nbGUtdXAiOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL3FsKSxlPXQqcWwvMjtyZXR1cm4iTTAsIistZSsiTCIrdCsiLCIrZSsiICIrLXQrIiwiK2UrIloifX0pO3RhLnN2Zy5zeW1ib2xUeXBlcz16bC5rZXlzKCk7dmFyIHFsPU1hdGguc3FydCgzKSxMbD1NYXRoLnRhbigzMCpEYSk7X2EudHJhbnNpdGlvbj1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyPVRsfHwrK1VsLHU9WG8obiksaT1bXSxvPVJsfHx7dGltZTpEYXRlLm5vdygpLGVhc2U6U3UsZGVsYXk6MCxkdXJhdGlvbjoyNTB9LGE9LTEsYz10aGlzLmxlbmd0aDsrK2E8Yzspe2kucHVzaCh0PVtdKTtmb3IodmFyIGw9dGhpc1thXSxzPS0xLGY9bC5sZW5ndGg7KytzPGY7KShlPWxbc10pJiYkbyhlLHMsdSxyLG8pLHQucHVzaChlKX1yZXR1cm4gWW8oaSx1LHIpfSxfYS5pbnRlcnJ1cHQ9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChudWxsPT1uP0RsOklvKFhvKG4pKSl9O3ZhciBUbCxSbCxEbD1JbyhYbygpKSxQbD1bXSxVbD0wO1BsLmNhbGw9X2EuY2FsbCxQbC5lbXB0eT1fYS5lbXB0eSxQbC5ub2RlPV9hLm5vZGUsUGwuc2l6ZT1fYS5zaXplLHRhLnRyYW5zaXRpb249ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbi50cmFuc2l0aW9uP1RsP24udHJhbnNpdGlvbih0KTpuOnRhLnNlbGVjdGlvbigpLnRyYW5zaXRpb24obil9LHRhLnRyYW5zaXRpb24ucHJvdG90eXBlPVBsLFBsLnNlbGVjdD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT10aGlzLmlkLGk9dGhpcy5uYW1lc3BhY2Usbz1bXTtuPU4obik7Zm9yKHZhciBhPS0xLGM9dGhpcy5sZW5ndGg7KythPGM7KXtvLnB1c2godD1bXSk7Zm9yKHZhciBsPXRoaXNbYV0scz0tMSxmPWwubGVuZ3RoOysrczxmOykocj1sW3NdKSYmKGU9bi5jYWxsKHIsci5fX2RhdGFfXyxzLGEpKT8oIl9fZGF0YV9fImluIHImJihlLl9fZGF0YV9fPXIuX19kYXRhX18pLCRvKGUscyxpLHUscltpXVt1XSksdC5wdXNoKGUpKTp0LnB1c2gobnVsbCl9cmV0dXJuIFlvKG8saSx1KX0sUGwuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1LGksbz10aGlzLmlkLGE9dGhpcy5uYW1lc3BhY2UsYz1bXTtuPUMobik7Zm9yKHZhciBsPS0xLHM9dGhpcy5sZW5ndGg7KytsPHM7KWZvcih2YXIgZj10aGlzW2xdLGg9LTEsZz1mLmxlbmd0aDsrK2g8ZzspaWYocj1mW2hdKXtpPXJbYV1bb10sZT1uLmNhbGwocixyLl9fZGF0YV9fLGgsbCksYy5wdXNoKHQ9W10pO2Zvcih2YXIgcD0tMSx2PWUubGVuZ3RoOysrcDx2OykodT1lW3BdKSYmJG8odSxwLGEsbyxpKSx0LnB1c2godSl9cmV0dXJuIFlvKGMsYSxvKX0sUGwuZmlsdGVyPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PVtdOyJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1PKG4pKTtmb3IodmFyIGk9MCxvPXRoaXMubGVuZ3RoO28+aTtpKyspe3UucHVzaCh0PVtdKTtmb3IodmFyIGU9dGhpc1tpXSxhPTAsYz1lLmxlbmd0aDtjPmE7YSsrKShyPWVbYV0pJiZuLmNhbGwocixyLl9fZGF0YV9fLGEsaSkmJnQucHVzaChyKX1yZXR1cm4gWW8odSx0aGlzLm5hbWVzcGFjZSx0aGlzLmlkKX0sUGwudHdlZW49ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzLm5vZGUoKVtyXVtlXS50d2Vlbi5nZXQobik6WSh0aGlzLG51bGw9PXQ/ZnVuY3Rpb24odCl7dFtyXVtlXS50d2Vlbi5yZW1vdmUobil9OmZ1bmN0aW9uKHUpe3Vbcl1bZV0udHdlZW4uc2V0KG4sdCl9KX0sUGwuYXR0cj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShhKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwpfWZ1bmN0aW9uIHUobil7cmV0dXJuIG51bGw9PW4/ZToobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlKGEpO3JldHVybiBlIT09biYmKHQ9byhlLG4pLGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKGEsdChuKSl9KX0pfWZ1bmN0aW9uIGkobil7cmV0dXJuIG51bGw9PW4/cjoobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsKTtyZXR1cm4gZSE9PW4mJih0PW8oZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCx0KG4pKX0pfSl9aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodCBpbiBuKXRoaXMuYXR0cih0LG5bdF0pO3JldHVybiB0aGlzfXZhciBvPSJ0cmFuc2Zvcm0iPT1uP0h1Om11LGE9dGEubnMucXVhbGlmeShuKTtyZXR1cm4gWm8odGhpcywiYXR0ci4iK24sdCxhLmxvY2FsP2k6dSl9LFBsLmF0dHJUd2Vlbj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcj10LmNhbGwodGhpcyxuLGUsdGhpcy5nZXRBdHRyaWJ1dGUodSkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh1LHIobikpfX1mdW5jdGlvbiByKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsKSk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsLHIobikpfX12YXIgdT10YS5ucy5xdWFsaWZ5KG4pO3JldHVybiB0aGlzLnR3ZWVuKCJhdHRyLiIrbix1LmxvY2FsP3I6ZSl9LFBsLnN0eWxlPWZ1bmN0aW9uKG4sZSxyKXtmdW5jdGlvbiB1KCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiBpKGUpe3JldHVybiBudWxsPT1lP3U6KGUrPSIiLGZ1bmN0aW9uKCl7dmFyIHUsaT10KHRoaXMpLmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pO3JldHVybiBpIT09ZSYmKHU9bXUoaSxlKSxmdW5jdGlvbih0KXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4sdSh0KSxyKX0pfSl9dmFyIG89YXJndW1lbnRzLmxlbmd0aDtpZigzPm8pe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj5vJiYoZT0iIik7Zm9yKHIgaW4gbil0aGlzLnN0eWxlKHIsbltyXSxlKTtyZXR1cm4gdGhpc31yPSIifXJldHVybiBabyh0aGlzLCJzdHlsZS4iK24sZSxpKX0sUGwuc3R5bGVUd2Vlbj1mdW5jdGlvbihuLGUscil7ZnVuY3Rpb24gdSh1LGkpe3ZhciBvPWUuY2FsbCh0aGlzLHUsaSx0KHRoaXMpLmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pKTtyZXR1cm4gbyYmZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLG8odCkscil9fXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDMmJihyPSIiKSx0aGlzLnR3ZWVuKCJzdHlsZS4iK24sdSl9LFBsLnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIFpvKHRoaXMsInRleHQiLG4sVm8pfSxQbC5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLm5hbWVzcGFjZTtyZXR1cm4gdGhpcy5lYWNoKCJlbmQudHJhbnNpdGlvbiIsZnVuY3Rpb24oKXt2YXIgdDt0aGlzW25dLmNvdW50PDImJih0PXRoaXMucGFyZW50Tm9kZSkmJnQucmVtb3ZlQ2hpbGQodGhpcyl9KX0sUGwuZWFzZT1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkLGU9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtlXVt0XS5lYXNlOigiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49dGEuZWFzZS5hcHBseSh0YSxhcmd1bWVudHMpKSxZKHRoaXMsZnVuY3Rpb24ocil7cltlXVt0XS5lYXNlPW59KSl9LFBsLmRlbGF5PWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmRlbGF5OlkodGhpcywiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbihyLHUsaSl7cltlXVt0XS5kZWxheT0rbi5jYWxsKHIsci5fX2RhdGFfXyx1LGkpfToobj0rbixmdW5jdGlvbihyKXtyW2VdW3RdLmRlbGF5PW59KSl9LFBsLmR1cmF0aW9uPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmR1cmF0aW9uOlkodGhpcywiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbihyLHUsaSl7cltlXVt0XS5kdXJhdGlvbj1NYXRoLm1heCgxLG4uY2FsbChyLHIuX19kYXRhX18sdSxpKSl9OihuPU1hdGgubWF4KDEsbiksZnVuY3Rpb24ocil7cltlXVt0XS5kdXJhdGlvbj1ufSkpfSxQbC5lYWNoPWZ1bmN0aW9uKG4sdCl7dmFyIGU9dGhpcy5pZCxyPXRoaXMubmFtZXNwYWNlO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIHU9UmwsaT1UbDt0cnl7VGw9ZSxZKHRoaXMsZnVuY3Rpb24odCx1LGkpe1JsPXRbcl1bZV0sbi5jYWxsKHQsdC5fX2RhdGFfXyx1LGkpfSl9ZmluYWxseXtSbD11LFRsPWl9fWVsc2UgWSh0aGlzLGZ1bmN0aW9uKHUpe3ZhciBpPXVbcl1bZV07KGkuZXZlbnR8fChpLmV2ZW50PXRhLmRpc3BhdGNoKCJzdGFydCIsImVuZCIsImludGVycnVwdCIpKSkub24obix0KX0pO3JldHVybiB0aGlzfSxQbC50cmFuc2l0aW9uPWZ1bmN0aW9uKCl7Zm9yKHZhciBuLHQsZSxyLHU9dGhpcy5pZCxpPSsrVWwsbz10aGlzLm5hbWVzcGFjZSxhPVtdLGM9MCxsPXRoaXMubGVuZ3RoO2w+YztjKyspe2EucHVzaChuPVtdKTtmb3IodmFyIHQ9dGhpc1tjXSxzPTAsZj10Lmxlbmd0aDtmPnM7cysrKShlPXRbc10pJiYocj1lW29dW3VdLCRvKGUscyxvLGkse3RpbWU6ci50aW1lLGVhc2U6ci5lYXNlLGRlbGF5OnIuZGVsYXkrci5kdXJhdGlvbixkdXJhdGlvbjpyLmR1cmF0aW9ufSkpLG4ucHVzaChlKX1yZXR1cm4gWW8oYSxvLGkpfSx0YS5zdmcuYXhpcz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIG4sbD10YS5zZWxlY3QodGhpcykscz10aGlzLl9fY2hhcnRfX3x8ZSxmPXRoaXMuX19jaGFydF9fPWUuY29weSgpLGg9bnVsbD09Yz9mLnRpY2tzP2YudGlja3MuYXBwbHkoZixhKTpmLmRvbWFpbigpOmMsZz1udWxsPT10P2YudGlja0Zvcm1hdD9mLnRpY2tGb3JtYXQuYXBwbHkoZixhKTp5OnQscD1sLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsZiksdj1wLmVudGVyKCkuaW5zZXJ0KCJnIiwiLmRvbWFpbiIpLmF0dHIoImNsYXNzIiwidGljayIpLnN0eWxlKCJvcGFjaXR5IixDYSksZD10YS50cmFuc2l0aW9uKHAuZXhpdCgpKS5zdHlsZSgib3BhY2l0eSIsQ2EpLnJlbW92ZSgpLG09dGEudHJhbnNpdGlvbihwLm9yZGVyKCkpLnN0eWxlKCJvcGFjaXR5IiwxKSxNPU1hdGgubWF4KHUsMCkrbyx4PVVpKGYpLGI9bC5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFswXSksXz0oYi5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwiZG9tYWluIiksdGEudHJhbnNpdGlvbihiKSk7di5hcHBlbmQoImxpbmUiKSx2LmFwcGVuZCgidGV4dCIpO3ZhciB3LFMsayxFLEE9di5zZWxlY3QoImxpbmUiKSxOPW0uc2VsZWN0KCJsaW5lIiksQz1wLnNlbGVjdCgidGV4dCIpLnRleHQoZyksej12LnNlbGVjdCgidGV4dCIpLHE9bS5zZWxlY3QoInRleHQiKSxMPSJ0b3AiPT09cnx8ImxlZnQiPT09cj8tMToxO2lmKCJib3R0b20iPT09cnx8InRvcCI9PT1yPyhuPUJvLHc9IngiLGs9InkiLFM9IngyIixFPSJ5MiIsQy5hdHRyKCJkeSIsMD5MPyIwZW0iOiIuNzFlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLF8uYXR0cigiZCIsIk0iK3hbMF0rIiwiK0wqaSsiVjBIIit4WzFdKyJWIitMKmkpKToobj1Xbyx3PSJ5IixrPSJ4IixTPSJ5MiIsRT0ieDIiLEMuYXR0cigiZHkiLCIuMzJlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsMD5MPyJlbmQiOiJzdGFydCIpLF8uYXR0cigiZCIsIk0iK0wqaSsiLCIreFswXSsiSDBWIit4WzFdKyJIIitMKmkpKSxBLmF0dHIoRSxMKnUpLHouYXR0cihrLEwqTSksTi5hdHRyKFMsMCkuYXR0cihFLEwqdSkscS5hdHRyKHcsMCkuYXR0cihrLEwqTSksZi5yYW5nZUJhbmQpe3ZhciBUPWYsUj1ULnJhbmdlQmFuZCgpLzI7cz1mPWZ1bmN0aW9uKG4pe3JldHVybiBUKG4pK1J9fWVsc2Ugcy5yYW5nZUJhbmQ/cz1mOmQuY2FsbChuLGYscyk7di5jYWxsKG4scyxmKSxtLmNhbGwobixmLGYpfSl9dmFyIHQsZT10YS5zY2FsZS5saW5lYXIoKSxyPWpsLHU9NixpPTYsbz0zLGE9WzEwXSxjPW51bGw7cmV0dXJuIG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLm9yaWVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10IGluIEZsP3QrIiI6amwsbik6cn0sbi50aWNrcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWFyZ3VtZW50cyxuKTphfSxuLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9dCxuKTpjfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIGU/KHU9K3QsaT0rYXJndW1lbnRzW2UtMV0sbik6dX0sbi5pbm5lclRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG4pOnV9LG4ub3V0ZXJUaWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKTppfSxuLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LG4pOm99LG4udGlja1N1YmRpdmlkZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoJiZufSxufTt2YXIgamw9ImJvdHRvbSIsRmw9e3RvcDoxLHJpZ2h0OjEsYm90dG9tOjEsbGVmdDoxfTt0YS5zdmcuYnJ1c2g9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQpe3QuZWFjaChmdW5jdGlvbigpe3ZhciB0PXRhLnNlbGVjdCh0aGlzKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2giLGkpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIixpKSxvPXQuc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpLmRhdGEoWzBdKTtvLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJiYWNrZ3JvdW5kIikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKS5zdHlsZSgiY3Vyc29yIiwiY3Jvc3NoYWlyIiksdC5zZWxlY3RBbGwoIi5leHRlbnQiKS5kYXRhKFswXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImV4dGVudCIpLnN0eWxlKCJjdXJzb3IiLCJtb3ZlIik7dmFyIGE9dC5zZWxlY3RBbGwoIi5yZXNpemUiKS5kYXRhKHYseSk7YS5leGl0KCkucmVtb3ZlKCksYS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIixmdW5jdGlvbihuKXtyZXR1cm4icmVzaXplICIrbn0pLnN0eWxlKCJjdXJzb3IiLGZ1bmN0aW9uKG4pe3JldHVybiBIbFtuXX0pLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLGZ1bmN0aW9uKG4pe3JldHVybi9bZXddJC8udGVzdChuKT8tMzpudWxsfSkuYXR0cigieSIsZnVuY3Rpb24obil7cmV0dXJuL15bbnNdLy50ZXN0KG4pPy0zOm51bGx9KS5hdHRyKCJ3aWR0aCIsNikuYXR0cigiaGVpZ2h0Iiw2KS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLGEuc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCk7dmFyIGMsZj10YS50cmFuc2l0aW9uKHQpLGg9dGEudHJhbnNpdGlvbihvKTtsJiYoYz1VaShsKSxoLmF0dHIoIngiLGNbMF0pLmF0dHIoIndpZHRoIixjWzFdLWNbMF0pLHIoZikpLHMmJihjPVVpKHMpLGguYXR0cigieSIsY1swXSkuYXR0cigiaGVpZ2h0IixjWzFdLWNbMF0pLHUoZikpLGUoZil9KX1mdW5jdGlvbiBlKG4pe24uc2VsZWN0QWxsKCIucmVzaXplIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXtyZXR1cm4idHJhbnNsYXRlKCIrZlsrL2UkLy50ZXN0KG4pXSsiLCIraFsrL15zLy50ZXN0KG4pXSsiKSJ9KX1mdW5jdGlvbiByKG4pe24uc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieCIsZlswXSksbi5zZWxlY3RBbGwoIi5leHRlbnQsLm4+cmVjdCwucz5yZWN0IikuYXR0cigid2lkdGgiLGZbMV0tZlswXSl9ZnVuY3Rpb24gdShuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoInkiLGhbMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5lPnJlY3QsLnc+cmVjdCIpLmF0dHIoImhlaWdodCIsaFsxXS1oWzBdKX1mdW5jdGlvbiBpKCl7ZnVuY3Rpb24gaSgpezMyPT10YS5ldmVudC5rZXlDb2RlJiYoQ3x8KE09bnVsbCxxWzBdLT1mWzFdLHFbMV0tPWhbMV0sQz0yKSxTKCkpfWZ1bmN0aW9uIHYoKXszMj09dGEuZXZlbnQua2V5Q29kZSYmMj09QyYmKHFbMF0rPWZbMV0scVsxXSs9aFsxXSxDPTAsUygpKX1mdW5jdGlvbiBkKCl7dmFyIG49dGEubW91c2UoYiksdD0hMTt4JiYoblswXSs9eFswXSxuWzFdKz14WzFdKSxDfHwodGEuZXZlbnQuYWx0S2V5PyhNfHwoTT1bKGZbMF0rZlsxXSkvMiwoaFswXStoWzFdKS8yXSkscVswXT1mWysoblswXTxNWzBdKV0scVsxXT1oWysoblsxXTxNWzFdKV0pOk09bnVsbCksQSYmbShuLGwsMCkmJihyKGspLHQ9ITApLE4mJm0obixzLDEpJiYodShrKSx0PSEwKSx0JiYoZShrKSx3KHt0eXBlOiJicnVzaCIsbW9kZTpDPyJtb3ZlIjoicmVzaXplIn0pKX1mdW5jdGlvbiBtKG4sdCxlKXt2YXIgcix1LGk9VWkodCksYz1pWzBdLGw9aVsxXSxzPXFbZV0sdj1lP2g6ZixkPXZbMV0tdlswXTtyZXR1cm4gQyYmKGMtPXMsbC09ZCtzKSxyPShlP3A6Zyk/TWF0aC5tYXgoYyxNYXRoLm1pbihsLG5bZV0pKTpuW2VdLEM/dT0ocis9cykrZDooTSYmKHM9TWF0aC5tYXgoYyxNYXRoLm1pbihsLDIqTVtlXS1yKSkpLHI+cz8odT1yLHI9cyk6dT1zKSx2WzBdIT1yfHx2WzFdIT11PyhlP2E9bnVsbDpvPW51bGwsdlswXT1yLHZbMV09dSwhMCk6dm9pZCAwfWZ1bmN0aW9uIHkoKXtkKCksay5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsbi5lbXB0eSgpPyJub25lIjpudWxsKSx0YS5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIixudWxsKSxMLm9uKCJtb3VzZW1vdmUuYnJ1c2giLG51bGwpLm9uKCJtb3VzZXVwLmJydXNoIixudWxsKS5vbigidG91Y2htb3ZlLmJydXNoIixudWxsKS5vbigidG91Y2hlbmQuYnJ1c2giLG51bGwpLm9uKCJrZXlkb3duLmJydXNoIixudWxsKS5vbigia2V5dXAuYnJ1c2giLG51bGwpLHooKSx3KHt0eXBlOiJicnVzaGVuZCJ9KX12YXIgTSx4LGI9dGhpcyxfPXRhLnNlbGVjdCh0YS5ldmVudC50YXJnZXQpLHc9Yy5vZihiLGFyZ3VtZW50cyksaz10YS5zZWxlY3QoYiksRT1fLmRhdHVtKCksQT0hL14obnxzKSQvLnRlc3QoRSkmJmwsTj0hL14oZXx3KSQvLnRlc3QoRSkmJnMsQz1fLmNsYXNzZWQoImV4dGVudCIpLHo9VyhiKSxxPXRhLm1vdXNlKGIpLEw9dGEuc2VsZWN0KHQoYikpLm9uKCJrZXlkb3duLmJydXNoIixpKS5vbigia2V5dXAuYnJ1c2giLHYpO2lmKHRhLmV2ZW50LmNoYW5nZWRUb3VjaGVzP0wub24oInRvdWNobW92ZS5icnVzaCIsZCkub24oInRvdWNoZW5kLmJydXNoIix5KTpMLm9uKCJtb3VzZW1vdmUuYnJ1c2giLGQpLm9uKCJtb3VzZXVwLmJydXNoIix5KSxrLmludGVycnVwdCgpLnNlbGVjdEFsbCgiKiIpLmludGVycnVwdCgpLEMpcVswXT1mWzBdLXFbMF0scVsxXT1oWzBdLXFbMV07ZWxzZSBpZihFKXt2YXIgVD0rL3ckLy50ZXN0KEUpLFI9Ky9ebi8udGVzdChFKTt4PVtmWzEtVF0tcVswXSxoWzEtUl0tcVsxXV0scVswXT1mW1RdLHFbMV09aFtSXX1lbHNlIHRhLmV2ZW50LmFsdEtleSYmKE09cS5zbGljZSgpKTtrLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsbnVsbCksdGEuc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsXy5zdHlsZSgiY3Vyc29yIikpLHcoe3R5cGU6ImJydXNoc3RhcnQifSksZCgpfXZhciBvLGEsYz1FKG4sImJydXNoc3RhcnQiLCJicnVzaCIsImJydXNoZW5kIiksbD1udWxsLHM9bnVsbCxmPVswLDBdLGg9WzAsMF0sZz0hMCxwPSEwLHY9T2xbMF07cmV0dXJuIG4uZXZlbnQ9ZnVuY3Rpb24obil7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49Yy5vZih0aGlzLGFyZ3VtZW50cyksdD17eDpmLHk6aCxpOm8sajphfSxlPXRoaXMuX19jaGFydF9ffHx0O3RoaXMuX19jaGFydF9fPXQsVGw/dGEuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC5icnVzaCIsZnVuY3Rpb24oKXtvPWUuaSxhPWUuaixmPWUueCxoPWUueSxuKHt0eXBlOiJicnVzaHN0YXJ0In0pfSkudHdlZW4oImJydXNoOmJydXNoIixmdW5jdGlvbigpe3ZhciBlPXl1KGYsdC54KSxyPXl1KGgsdC55KTtyZXR1cm4gbz1hPW51bGwsZnVuY3Rpb24odSl7Zj10Lng9ZSh1KSxoPXQueT1yKHUpLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSl9fSkuZWFjaCgiZW5kLmJydXNoIixmdW5jdGlvbigpe289dC5pLGE9dC5qLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSksbih7dHlwZToiYnJ1c2hlbmQifSl9KToobih7dHlwZToiYnJ1c2hzdGFydCJ9KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pKX0pfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCx2PU9sWyFsPDwxfCFzXSxuKTpsfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9dCx2PU9sWyFsPDwxfCFzXSxuKTpzfSxuLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsJiZzPyhnPSEhdFswXSxwPSEhdFsxXSk6bD9nPSEhdDpzJiYocD0hIXQpLG4pOmwmJnM/W2cscF06bD9nOnM/cDpudWxsfSxuLmV4dGVudD1mdW5jdGlvbih0KXt2YXIgZSxyLHUsaSxjO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsJiYoZT10WzBdLHI9dFsxXSxzJiYoZT1lWzBdLHI9clswXSksbz1bZSxyXSxsLmludmVydCYmKGU9bChlKSxyPWwocikpLGU+ciYmKGM9ZSxlPXIscj1jKSwoZSE9ZlswXXx8ciE9ZlsxXSkmJihmPVtlLHJdKSkscyYmKHU9dFswXSxpPXRbMV0sbCYmKHU9dVsxXSxpPWlbMV0pLGE9W3UsaV0scy5pbnZlcnQmJih1PXModSksaT1zKGkpKSx1PmkmJihjPXUsdT1pLGk9YyksKHUhPWhbMF18fGkhPWhbMV0pJiYoaD1bdSxpXSkpLG4pOihsJiYobz8oZT1vWzBdLHI9b1sxXSk6KGU9ZlswXSxyPWZbMV0sbC5pbnZlcnQmJihlPWwuaW52ZXJ0KGUpLHI9bC5pbnZlcnQocikpLGU+ciYmKGM9ZSxlPXIscj1jKSkpLHMmJihhPyh1PWFbMF0saT1hWzFdKToodT1oWzBdLGk9aFsxXSxzLmludmVydCYmKHU9cy5pbnZlcnQodSksaT1zLmludmVydChpKSksdT5pJiYoYz11LHU9aSxpPWMpKSksbCYmcz9bW2UsdV0sW3IsaV1dOmw/W2Uscl06cyYmW3UsaV0pfSxuLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIG4uZW1wdHkoKXx8KGY9WzAsMF0saD1bMCwwXSxvPWE9bnVsbCksbn0sbi5lbXB0eT1mdW5jdGlvbigpe3JldHVybiEhbCYmZlswXT09ZlsxXXx8ISFzJiZoWzBdPT1oWzFdfSx0YS5yZWJpbmQobixjLCJvbiIpfTt2YXIgSGw9e246Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sT2w9W1sibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0sWyJlIiwidyJdLFsibiIsInMiXSxbXV0sSWw9YWMuZm9ybWF0PWdjLnRpbWVGb3JtYXQsWWw9SWwudXRjLFpsPVlsKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKTtJbC5pc289RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcmJituZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIik/Sm86WmwsSm8ucGFyc2U9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IERhdGUobik7cmV0dXJuIGlzTmFOKHQpP251bGw6dH0sSm8udG9TdHJpbmc9WmwudG9TdHJpbmcsYWMuc2Vjb25kPUZ0KGZ1bmN0aW9uKG4pe3JldHVybiBuZXcgY2MoMWUzKk1hdGguZmxvb3Iobi8xZTMpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrMWUzKk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRTZWNvbmRzKCl9KSxhYy5zZWNvbmRzPWFjLnNlY29uZC5yYW5nZSxhYy5zZWNvbmRzLnV0Yz1hYy5zZWNvbmQudXRjLnJhbmdlLGFjLm1pbnV0ZT1GdChmdW5jdGlvbihuKXtyZXR1cm4gbmV3IGNjKDZlNCpNYXRoLmZsb29yKG4vNmU0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzZlNCpNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWludXRlcygpfSksYWMubWludXRlcz1hYy5taW51dGUucmFuZ2UsYWMubWludXRlcy51dGM9YWMubWludXRlLnV0Yy5yYW5nZSxhYy5ob3VyPUZ0KGZ1bmN0aW9uKG4pe3ZhciB0PW4uZ2V0VGltZXpvbmVPZmZzZXQoKS82MDtyZXR1cm4gbmV3IGNjKDM2ZTUqKE1hdGguZmxvb3Iobi8zNmU1LXQpK3QpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrMzZlNSpNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0SG91cnMoKX0pLGFjLmhvdXJzPWFjLmhvdXIucmFuZ2UsYWMuaG91cnMudXRjPWFjLmhvdXIudXRjLnJhbmdlLGFjLm1vbnRoPUZ0KGZ1bmN0aW9uKG4pe3JldHVybiBuPWFjLmRheShuKSxuLnNldERhdGUoMSksbn0sZnVuY3Rpb24obix0KXtuLnNldE1vbnRoKG4uZ2V0TW9udGgoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TW9udGgoKX0pLGFjLm1vbnRocz1hYy5tb250aC5yYW5nZSxhYy5tb250aHMudXRjPWFjLm1vbnRoLnV0Yy5yYW5nZTt2YXIgVmw9WzFlMyw1ZTMsMTVlMywzZTQsNmU0LDNlNSw5ZTUsMThlNSwzNmU1LDEwOGU1LDIxNmU1LDQzMmU1LDg2NGU1LDE3MjhlNSw2MDQ4ZTUsMjU5MmU2LDc3NzZlNiwzMTUzNmU2XSxYbD1bW2FjLnNlY29uZCwxXSxbYWMuc2Vjb25kLDVdLFthYy5zZWNvbmQsMTVdLFthYy5zZWNvbmQsMzBdLFthYy5taW51dGUsMV0sW2FjLm1pbnV0ZSw1XSxbYWMubWludXRlLDE1XSxbYWMubWludXRlLDMwXSxbYWMuaG91ciwxXSxbYWMuaG91ciwzXSxbYWMuaG91ciw2XSxbYWMuaG91ciwxMl0sW2FjLmRheSwxXSxbYWMuZGF5LDJdLFthYy53ZWVrLDFdLFthYy5tb250aCwxXSxbYWMubW9udGgsM10sW2FjLnllYXIsMV1dLCRsPUlsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0SG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpJiYxIT1uLmdldERhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiAxIT1uLmdldERhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9XSxbIiVZIixOZV1dKSxCbD17cmFuZ2U6ZnVuY3Rpb24obix0LGUpe3JldHVybiB0YS5yYW5nZShNYXRoLmNlaWwobi9lKSplLCt0LGUpLm1hcChLbyl9LGZsb29yOnksY2VpbDp5fTtYbC55ZWFyPWFjLnllYXIsYWMuc2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gR28odGEuc2NhbGUubGluZWFyKCksWGwsJGwpfTt2YXIgV2w9WGwubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuWzBdLnV0YyxuWzFdXX0pLEpsPVlsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDU2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDSG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ0RheSgpJiYxIT1uLmdldFVUQ0RhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiAxIT1uLmdldFVUQ0RhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCl9XSxbIiVZIixOZV1dKTtXbC55ZWFyPWFjLnllYXIudXRjLGFjLnNjYWxlLnV0Yz1mdW5jdGlvbigpe3JldHVybiBHbyh0YS5zY2FsZS5saW5lYXIoKSxXbCxKbCl9LHRhLnRleHQ9QXQoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VUZXh0fSksdGEuanNvbj1mdW5jdGlvbihuLHQpe3JldHVybiBOdChuLCJhcHBsaWNhdGlvbi9qc29uIixRbyx0KX0sdGEuaHRtbD1mdW5jdGlvbihuLHQpe3JldHVybiBOdChuLCJ0ZXh0L2h0bWwiLG5hLHQpfSx0YS54bWw9QXQoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VYTUx9KSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0YSk6Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzJiYobW9kdWxlLmV4cG9ydHM9dGEpLHRoaXMuZDM9dGF9KCk7"></script>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIHZhciBERUJVRyA9IGZhbHNlOwoKICBkMy5sYXlvdXQuZ3JpZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIG1vZGUgPSAiZXF1YWwiLAogICAgICAgIGxheW91dCA9IF9kaXN0cmlidXRlRXF1YWxseSwKICAgICAgICB4ID0gZDMuc2NhbGUub3JkaW5hbCgpLAogICAgICAgIHkgPSBkMy5zY2FsZS5vcmRpbmFsKCksCiAgICAgICAgc2l6ZSA9IFsxLCAxXSwKICAgICAgICBhY3R1YWxTaXplID0gWzAsIDBdLAogICAgICAgIG5vZGVTaXplID0gZmFsc2UsCiAgICAgICAgYmFuZHMgPSBmYWxzZSwKICAgICAgICBwYWRkaW5nID0gWzAsIDBdLAogICAgICAgIGNvbHMsIHJvd3M7CgogICAgZnVuY3Rpb24gZ3JpZChub2RlcykgewogICAgICByZXR1cm4gbGF5b3V0KG5vZGVzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBfZGlzdHJpYnV0ZUVxdWFsbHkobm9kZXMpIHsKICAgICAgdmFyIGkgPSAtMSwgCiAgICAgICAgICBuID0gbm9kZXMubGVuZ3RoLAogICAgICAgICAgX2NvbHMgPSBjb2xzID8gY29scyA6IDAsCiAgICAgICAgICBfcm93cyA9IHJvd3MgPyByb3dzIDogMCwKICAgICAgICAgIGNvbCwgcm93OwoKICAgICAgLy8gRklYTUU6IG1ha2UgZXhwbGljaXQgcm93cy9jb2xzIGV4Y2x1c2l2ZT8gT3IgZmluZCBhIHNtYXJ0IHdheSB0byBkZWFsIHdpdGggb3ZlcmZsb3dzIChyZXBlYXQ/KQogICAgICAvLyBGSVhNRTogd2hlbiByb3dzIGFyZSBzZXQsIGZpbGwgdG9wLXRvLWJvdHRvbSAobWFrZSB0ZXN0IHdpdGggNSBkYXRhIHBvaW50cyBhbmQgNCByb3dzKQoKICAgICAgaWYgKF9yb3dzICYmICFfY29scykgewogICAgICAgIF9jb2xzID0gTWF0aC5jZWlsKG4gLyBfcm93cykKICAgICAgfSBlbHNlIHsKICAgICAgICBfY29scyB8fCAoX2NvbHMgPSBNYXRoLmNlaWwoTWF0aC5zcXJ0KG4pKSk7CiAgICAgICAgX3Jvd3MgfHwgKF9yb3dzID0gTWF0aC5jZWlsKG4gLyBfY29scykpOwogICAgICB9CgogICAgICBpZiAobm9kZVNpemUpIHsKICAgICAgICB4LmRvbWFpbihkMy5yYW5nZShfY29scykpLnJhbmdlKGQzLnJhbmdlKDAsIChzaXplWzBdICsgcGFkZGluZ1swXSkgKiBfY29scywgc2l6ZVswXSArIHBhZGRpbmdbMF0pKTsKICAgICAgICB5LmRvbWFpbihkMy5yYW5nZShfcm93cykpLnJhbmdlKGQzLnJhbmdlKDAsIChzaXplWzFdICsgcGFkZGluZ1sxXSkgKiBfcm93cywgc2l6ZVsxXSArIHBhZGRpbmdbMV0pKTsKICAgICAgICBhY3R1YWxTaXplWzBdID0gYmFuZHMgPyB4KF9jb2xzIC0gMSkgKyBzaXplWzBdIDogeChfY29scyAtIDEpOwogICAgICAgIGFjdHVhbFNpemVbMV0gPSBiYW5kcyA/IHkoX3Jvd3MgLSAxKSArIHNpemVbMV0gOiB5KF9yb3dzIC0gMSk7CiAgICAgIH0gZWxzZSBpZiAoYmFuZHMpIHsKICAgICAgICB4LmRvbWFpbihkMy5yYW5nZShfY29scykpLnJhbmdlQmFuZHMoWzAsIHNpemVbMF1dLCBwYWRkaW5nWzBdLCAwKTsKICAgICAgICB5LmRvbWFpbihkMy5yYW5nZShfcm93cykpLnJhbmdlQmFuZHMoWzAsIHNpemVbMV1dLCBwYWRkaW5nWzFdLCAwKTsKICAgICAgICBhY3R1YWxTaXplWzBdID0geC5yYW5nZUJhbmQoKTsKICAgICAgICBhY3R1YWxTaXplWzFdID0geS5yYW5nZUJhbmQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB4LmRvbWFpbihkMy5yYW5nZShfY29scykpLnJhbmdlUG9pbnRzKFswLCBzaXplWzBdXSk7CiAgICAgICAgeS5kb21haW4oZDMucmFuZ2UoX3Jvd3MpKS5yYW5nZVBvaW50cyhbMCwgc2l6ZVsxXV0pOwogICAgICAgIGFjdHVhbFNpemVbMF0gPSB4KDEpOwogICAgICAgIGFjdHVhbFNpemVbMV0gPSB5KDEpOwogICAgICB9CgogICAgICBpZiAoREVCVUcpIGNvbnNvbGUubG9nKCdjb2xzL3Jvd3MnLCBfY29scywgX3Jvd3MpOwoKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBjb2wgPSBpICUgX2NvbHM7CiAgICAgICAgcm93ID0gTWF0aC5mbG9vcihpIC8gX2NvbHMpOwoKICAgICAgICBpZiAoREVCVUcpIGNvbnNvbGUubG9nKGksIGNvbCwgcm93KTsKCiAgICAgICAgbm9kZXNbaV0ueCA9IHgoY29sKTsKICAgICAgICBub2Rlc1tpXS55ID0geShyb3cpOwogICAgICB9CgogICAgICByZXR1cm4gbm9kZXM7CiAgICB9CgogICAgLy8gZ3JpZC5tb2RlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIC8vICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbW9kZTsKICAgIC8vICAgc3dpdGNoKG1vZGUgPSB2YWx1ZSkgewogICAgLy8gICAgIGNhc2UgImVxdWFsIjoKICAgIC8vICAgICAgIGxheW91dCA9IF9kaXN0cmlidXRlRXF1YWxseTsKICAgIC8vICAgICAgIGJyZWFrOwogICAgLy8gICB9CiAgICAvLyAgIHJldHVybiBncmlkOwogICAgLy8gfQoKICAgIGdyaWQuc2l6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVTaXplID8gYWN0dWFsU2l6ZSA6IHNpemU7CiAgICAgIGFjdHVhbFNpemUgPSBbMCwgMF07CiAgICAgIG5vZGVTaXplID0gKHNpemUgPSB2YWx1ZSkgPT0gbnVsbDsKICAgICAgcmV0dXJuIGdyaWQ7CiAgICB9CgogICAgZ3JpZC5ub2RlU2l6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVTaXplID8gc2l6ZSA6IGFjdHVhbFNpemU7CiAgICAgIGFjdHVhbFNpemUgPSBbMCwgMF07CiAgICAgIG5vZGVTaXplID0gKHNpemUgPSB2YWx1ZSkgIT0gbnVsbDsKICAgICAgcmV0dXJuIGdyaWQ7CiAgICB9CgogICAgZ3JpZC5yb3dzID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcm93czsKICAgICAgcm93cyA9IHZhbHVlOwogICAgICByZXR1cm4gZ3JpZDsKICAgIH0KCiAgICBncmlkLmNvbHMgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjb2xzOwogICAgICBjb2xzID0gdmFsdWU7CiAgICAgIHJldHVybiBncmlkOwogICAgfQoKICAgIGdyaWQuYmFuZHMgPSBmdW5jdGlvbigpIHsKICAgICAgYmFuZHMgPSB0cnVlOwogICAgICByZXR1cm4gZ3JpZDsKICAgIH0KCiAgICBncmlkLnBvaW50cyA9IGZ1bmN0aW9uKCkgewogICAgICBiYW5kcyA9IGZhbHNlOwogICAgICByZXR1cm4gZ3JpZDsKICAgIH0KCiAgICBncmlkLnBhZGRpbmcgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRkaW5nOwogICAgICBwYWRkaW5nID0gdmFsdWU7CiAgICAgIHJldHVybiBncmlkOwogICAgfQoKICAgIHJldHVybiBncmlkOwogIH07Cn0pKCk7"></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKGEsYil7InVzZSBzdHJpY3QiO2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyltb2R1bGUuZXhwb3J0cz1iKHJlcXVpcmUoImQzIikpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoWyJkMyJdLGZ1bmN0aW9uKGMpe3JldHVybiBhLmRpbXBsZT1iKGMpLGEuZGltcGxlfSk7ZWxzZSBpZihhLmQzKWEuZGltcGxlPWIoYS5kMyk7ZWxzZXtpZighY29uc29sZXx8IWNvbnNvbGUud2Fybil0aHJvdyJkaW1wbGUgcmVxdWlyZXMgZDMgdG8gcnVuLiAgQXJlIHlvdSBtaXNzaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBkMyBsaWJyYXJ5PyI7Y29uc29sZS53YXJuKCJkaW1wbGUgcmVxdWlyZXMgZDMgdG8gcnVuLiAgQXJlIHlvdSBtaXNzaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBkMyBsaWJyYXJ5PyIpfX0odGhpcyxmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7dmFyIGI9e3ZlcnNpb246IjIuMS4yIixwbG90Ont9LGFnZ3JlZ2F0ZU1ldGhvZDp7fX07cmV0dXJuIGIuYXhpcz1mdW5jdGlvbihjLGQsZSxmLGcpe3RoaXMuY2hhcnQ9Yyx0aGlzLnBvc2l0aW9uPWQsdGhpcy5jYXRlZ29yeUZpZWxkcz1udWxsPT09Z3x8dm9pZCAwPT09Zz9lOltdLmNvbmNhdChnKSx0aGlzLm1lYXN1cmU9Zix0aGlzLnRpbWVGaWVsZD1nLHRoaXMuZmxvYXRpbmdCYXJXaWR0aD01LHRoaXMuaGlkZGVuPSExLHRoaXMuc2hvd1BlcmNlbnQ9ITEsdGhpcy5jb2xvcnM9bnVsbCx0aGlzLm92ZXJyaWRlTWluPW51bGwsdGhpcy5vdmVycmlkZU1heD1udWxsLHRoaXMuc2hhcGVzPW51bGwsdGhpcy5zaG93R3JpZGxpbmVzPW51bGwsdGhpcy5ncmlkbGluZVNoYXBlcz1udWxsLHRoaXMudGl0bGVTaGFwZT1udWxsLHRoaXMuZGF0ZVBhcnNlRm9ybWF0PW51bGwsdGhpcy50aWNrRm9ybWF0PW51bGwsdGhpcy50aW1lUGVyaW9kPW51bGwsdGhpcy50aW1lSW50ZXJ2YWw9MSx0aGlzLnVzZUxvZz0hMSx0aGlzLmxvZ0Jhc2U9MTAsdGhpcy50aXRsZT12b2lkIDAsdGhpcy5jbGFtcD0hMCx0aGlzLnRpY2tzPW51bGwsdGhpcy5mb250U2l6ZT0iMTBweCIsdGhpcy5mb250RmFtaWx5PSJzYW5zLXNlcmlmIix0aGlzLl9zbGF2ZXM9W10sdGhpcy5fc2NhbGU9bnVsbCx0aGlzLl9taW49MCx0aGlzLl9tYXg9MCx0aGlzLl9wcmV2aW91c09yaWdpbj1udWxsLHRoaXMuX29yaWdpbj1udWxsLHRoaXMuX29yZGVyUnVsZXM9W10sdGhpcy5fZ3JvdXBPcmRlclJ1bGVzPVtdLHRoaXMuX2RyYXc9bnVsbCx0aGlzLl9nZXRBeGlzRGF0YT1mdW5jdGlvbigpe3ZhciBhLGIsYz1bXSxkPSExO2lmKHRoaXMuY2hhcnQmJnRoaXMuY2hhcnQuc2VyaWVzKXtmb3IoYT0wO2E8dGhpcy5jaGFydC5zZXJpZXMubGVuZ3RoO2ErPTEpYj10aGlzLmNoYXJ0LnNlcmllc1thXSxiW3RoaXMucG9zaXRpb25dPT09dGhpcyYmKGIuZGF0YSYmYi5kYXRhLmxlbmd0aD4wP2M9Yy5jb25jYXQoYi5kYXRhKTpkPSEwKTtkJiZ0aGlzLmNoYXJ0LmRhdGEmJihjPWMuY29uY2F0KHRoaXMuY2hhcnQuZGF0YSkpfXJldHVybiBjfSx0aGlzLl9nZXRGb250U2l6ZT1mdW5jdGlvbigpe3ZhciBhO3JldHVybiBhPXRoaXMuZm9udFNpemUmJiJhdXRvIiE9PXRoaXMuZm9udFNpemUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpP2lzTmFOKHRoaXMuZm9udFNpemUpP3RoaXMuZm9udFNpemU6dGhpcy5mb250U2l6ZSsicHgiOih0aGlzLmNoYXJ0Ll9oZWlnaHRQaXhlbHMoKS8zNT4xMD90aGlzLmNoYXJ0Ll9oZWlnaHRQaXhlbHMoKS8zNToxMCkrInB4In0sdGhpcy5fZ2V0Rm9ybWF0PWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGUsZixnLGg7cmV0dXJuIG51bGwhPT10aGlzLnRpY2tGb3JtYXQmJnZvaWQgMCE9PXRoaXMudGlja0Zvcm1hdD9iPXRoaXMuX2hhc1RpbWVGaWVsZCgpP2EudGltZS5mb3JtYXQodGhpcy50aWNrRm9ybWF0KTphLmZvcm1hdCh0aGlzLnRpY2tGb3JtYXQpOnRoaXMuc2hvd1BlcmNlbnQ/Yj1hLmZvcm1hdCgiJSIpOnRoaXMudXNlTG9nJiZudWxsIT09dGhpcy5tZWFzdXJlP2I9ZnVuY3Rpb24oYil7dmFyIGM9TWF0aC5mbG9vcihNYXRoLmFicyhiKSwwKS50b1N0cmluZygpLmxlbmd0aCxkPU1hdGgubWluKE1hdGguZmxvb3IoKGMtMSkvMyksNCksZT0ia21CVCIuc3Vic3RyaW5nKGQtMSxkKSxmPSIwIj09PU1hdGgucm91bmQoMTAqKGIvTWF0aC5wb3coMWUzLGQpKSkudG9TdHJpbmcoKS5zbGljZSgtMSk/MDoxO3JldHVybiAwPT09Yj8wOmEuZm9ybWF0KCIsLiIrZisiZiIpKGIvTWF0aC5wb3coMWUzLGQpKStlfTpudWxsIT09dGhpcy5tZWFzdXJlPyhjPU1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5fbWF4KSwwKS50b1N0cmluZygpLGQ9TWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLl9taW4pLDApLnRvU3RyaW5nKCksZT1NYXRoLm1heChkLmxlbmd0aCxjLmxlbmd0aCksZT4zPyhmPU1hdGgubWluKE1hdGguZmxvb3IoKGUtMSkvMyksNCksZz0ia21CVCIuc3Vic3RyaW5nKGYtMSxmKSxoPTE+PWUtMypmPzE6MCxiPWZ1bmN0aW9uKGIpe3JldHVybiAwPT09Yj8wOmEuZm9ybWF0KCIsLiIraCsiZiIpKGIvTWF0aC5wb3coMWUzLGYpKStnfSk6KGg9LU1hdGguZmxvb3IoTWF0aC5sb2codGhpcy5fdGlja19zdGVwKS9NYXRoLkxOMTApLGI9YS5mb3JtYXQoIiwuIitoKyJmIikpKTpiPWZ1bmN0aW9uKGEpe3JldHVybiBhfSxifSx0aGlzLl9nZXRUaW1lUGVyaW9kPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy50aW1lUGVyaW9kLGM9MzAsZD10aGlzLl9tYXgtdGhpcy5fbWluO3JldHVybiB0aGlzLl9oYXNUaW1lRmllbGQoKSYmIXRoaXMudGltZVBlcmlvZCYmKGI9Yz49ZC8xZTM/YS50aW1lLnNlY29uZHM6Yz49ZC82ZTQ/YS50aW1lLm1pbnV0ZXM6Yz49ZC8zNmU1P2EudGltZS5ob3VyczpjPj1kLzg2NGU1P2EudGltZS5kYXlzOmM+PWQvNjA0OGU1P2EudGltZS53ZWVrczpjPj1kLzI2Mjk4ZTU/YS50aW1lLm1vbnRoczphLnRpbWUueWVhcnMpLGJ9LHRoaXMuX2dldFRvb2x0aXBUZXh0PWZ1bmN0aW9uKGIsYyl7aWYodGhpcy5faGFzVGltZUZpZWxkKCkpY1t0aGlzLnBvc2l0aW9uKyJGaWVsZCJdWzBdJiZiLnB1c2godGhpcy50aW1lRmllbGQrIjogIit0aGlzLl9nZXRGb3JtYXQoKShjW3RoaXMucG9zaXRpb24rIkZpZWxkIl1bMF0pKTtlbHNlIGlmKHRoaXMuX2hhc0NhdGVnb3JpZXMoKSl0aGlzLmNhdGVnb3J5RmllbGRzLmZvckVhY2goZnVuY3Rpb24oYSxkKXtudWxsIT09YSYmdm9pZCAwIT09YSYmY1t0aGlzLnBvc2l0aW9uKyJGaWVsZCJdW2RdJiZiLnB1c2goYSsoY1t0aGlzLnBvc2l0aW9uKyJGaWVsZCJdW2RdIT09YT8iOiAiK2NbdGhpcy5wb3NpdGlvbisiRmllbGQiXVtkXToiIikpfSx0aGlzKTtlbHNlIGlmKHRoaXMuX2hhc01lYXN1cmUoKSlzd2l0Y2godGhpcy5wb3NpdGlvbil7Y2FzZSJ4IjpiLnB1c2godGhpcy5tZWFzdXJlKyI6ICIrdGhpcy5fZ2V0Rm9ybWF0KCkoYy53aWR0aCkpO2JyZWFrO2Nhc2UieSI6Yi5wdXNoKHRoaXMubWVhc3VyZSsiOiAiK3RoaXMuX2dldEZvcm1hdCgpKGMuaGVpZ2h0KSk7YnJlYWs7Y2FzZSJwIjpiLnB1c2godGhpcy5tZWFzdXJlKyI6ICIrdGhpcy5fZ2V0Rm9ybWF0KCkoYy5hbmdsZSkrIiAoIithLmZvcm1hdCgiJSIpKGMucGllUGN0KSsiKSIpO2JyZWFrO2RlZmF1bHQ6Yi5wdXNoKHRoaXMubWVhc3VyZSsiOiAiK3RoaXMuX2dldEZvcm1hdCgpKGNbdGhpcy5wb3NpdGlvbisiVmFsdWUiXSkpfX0sdGhpcy5fZ2V0VG9wTWFzdGVyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gbnVsbCE9PXRoaXMubWFzdGVyJiZ2b2lkIDAhPT10aGlzLm1hc3RlciYmKGE9dGhpcy5tYXN0ZXIuX2dldFRvcE1hc3RlcigpKSxhfSx0aGlzLl9oYXNDYXRlZ29yaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLmNhdGVnb3J5RmllbGRzJiZ2b2lkIDAhPT10aGlzLmNhdGVnb3J5RmllbGRzJiZ0aGlzLmNhdGVnb3J5RmllbGRzLmxlbmd0aD4wfSx0aGlzLl9oYXNNZWFzdXJlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLm1lYXN1cmUmJnZvaWQgMCE9PXRoaXMubWVhc3VyZX0sdGhpcy5faGFzVGltZUZpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLnRpbWVGaWVsZCYmdm9pZCAwIT09dGhpcy50aW1lRmllbGR9LHRoaXMuX3BhcnNlRGF0ZT1mdW5jdGlvbihiKXt2YXIgYztyZXR1cm4gYz1udWxsPT09dGhpcy5kYXRlUGFyc2VGb3JtYXR8fHZvaWQgMD09PXRoaXMuZGF0ZVBhcnNlRm9ybWF0P2lzTmFOKGIpP0RhdGUucGFyc2UoYik6bmV3IERhdGUoYik6YS50aW1lLmZvcm1hdCh0aGlzLmRhdGVQYXJzZUZvcm1hdCkucGFyc2UoYil9LHRoaXMuX3VwZGF0ZT1mdW5jdGlvbihjKXt2YXIgZCxlLGYsZyxoPVtdLGk9dGhpcy50aWNrc3x8MTAsaj1mdW5jdGlvbihhLGMsZCl7dmFyIGUsZixnPWEuY2F0ZWdvcnlGaWVsZHNbMF0saD1hLl9nZXRBeGlzRGF0YSgpLGk9ZyxqPSExLGs9ITAsbD1udWxsO2ZvcihlPTA7ZTxoLmxlbmd0aDtlKz0xKWlmKGw9YS5fcGFyc2VEYXRlKGhbZV1bZ10pLG51bGwhPT1sJiZ2b2lkIDAhPT1sJiZpc05hTihsKSl7az0hMTticmVha31yZXR1cm4ga3x8YS5jaGFydC5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihiKXtiW2NdPT09YSYmYltkXS5faGFzTWVhc3VyZSgpJiYoaT1iW2RdLm1lYXN1cmUsaj0hMCl9LHRoaXMpLGY9YS5fb3JkZXJSdWxlcy5jb25jYXQoe29yZGVyaW5nOmksZGVzYzpqfSksYi5fZ2V0T3JkZXJlZExpc3QoaCxnLGYpfTtpZih0aGlzLl9taW49dGhpcy5zaG93UGVyY2VudCYmdGhpcy5fbWluPC0xPy0xOnRoaXMuX21pbix0aGlzLl9tYXg9dGhpcy5zaG93UGVyY2VudCYmdGhpcy5fbWF4PjE/MTp0aGlzLl9tYXgsdGhpcy5fbWluPW51bGwhPT10aGlzLm92ZXJyaWRlTWluP3RoaXMub3ZlcnJpZGVNaW46dGhpcy5fbWluLHRoaXMuX21heD1udWxsIT09dGhpcy5vdmVycmlkZU1heD90aGlzLm92ZXJyaWRlTWF4OnRoaXMuX21heCwieCIhPT10aGlzLnBvc2l0aW9ufHxudWxsIT09dGhpcy5fc2NhbGUmJiFjKXtpZigieSIhPT10aGlzLnBvc2l0aW9ufHxudWxsIT09dGhpcy5fc2NhbGUmJiFjKXRoaXMucG9zaXRpb24ubGVuZ3RoPjAmJiJ6Ij09PXRoaXMucG9zaXRpb25bMF0mJm51bGw9PT10aGlzLl9zY2FsZT90aGlzLl9zY2FsZT10aGlzLnVzZUxvZz9hLnNjYWxlLmxvZygpLnJhbmdlKFt0aGlzLmNoYXJ0Ll9oZWlnaHRQaXhlbHMoKS8zMDAsdGhpcy5jaGFydC5faGVpZ2h0UGl4ZWxzKCkvMTBdKS5kb21haW4oWzA9PT10aGlzLl9taW4/TWF0aC5wb3codGhpcy5sb2dCYXNlLC0xKTp0aGlzLl9taW4sMD09PXRoaXMuX21heD8tMSpNYXRoLnBvdyh0aGlzLmxvZ0Jhc2UsLTEpOnRoaXMuX21heF0pLmNsYW1wKHRoaXMuY2xhbXApLmJhc2UodGhpcy5sb2dCYXNlKTphLnNjYWxlLmxpbmVhcigpLnJhbmdlKFsxLHRoaXMuY2hhcnQuX2hlaWdodFBpeGVscygpLzEwXSkuZG9tYWluKFt0aGlzLl9taW4sdGhpcy5fbWF4XSkuY2xhbXAodGhpcy5jbGFtcCk6dGhpcy5wb3NpdGlvbi5sZW5ndGg+MCYmInAiPT09dGhpcy5wb3NpdGlvblswXSYmbnVsbD09PXRoaXMuX3NjYWxlP3RoaXMuX3NjYWxlPXRoaXMudXNlTG9nP2Euc2NhbGUubG9nKCkucmFuZ2UoWzAsMzYwXSkuZG9tYWluKFswPT09dGhpcy5fbWluP01hdGgucG93KHRoaXMubG9nQmFzZSwtMSk6dGhpcy5fbWluLDA9PT10aGlzLl9tYXg/LTEqTWF0aC5wb3codGhpcy5sb2dCYXNlLC0xKTp0aGlzLl9tYXhdKS5jbGFtcCh0aGlzLmNsYW1wKS5iYXNlKHRoaXMubG9nQmFzZSk6YS5zY2FsZS5saW5lYXIoKS5yYW5nZShbMCwzNjBdKS5kb21haW4oW3RoaXMuX21pbix0aGlzLl9tYXhdKS5jbGFtcCh0aGlzLmNsYW1wKTp0aGlzLnBvc2l0aW9uLmxlbmd0aD4wJiYiYyI9PT10aGlzLnBvc2l0aW9uWzBdJiZudWxsPT09dGhpcy5fc2NhbGUmJih0aGlzLl9zY2FsZT1hLnNjYWxlLmxpbmVhcigpLnJhbmdlKFswLG51bGw9PT10aGlzLmNvbG9yc3x8MT09PXRoaXMuY29sb3JzLmxlbmd0aD8xOnRoaXMuY29sb3JzLmxlbmd0aC0xXSkuZG9tYWluKFt0aGlzLl9taW4sdGhpcy5fbWF4XSkuY2xhbXAodGhpcy5jbGFtcCkpO2Vsc2UgaWYodGhpcy5faGFzVGltZUZpZWxkKCk/dGhpcy5fc2NhbGU9YS50aW1lLnNjYWxlKCkucmFuZ2UoW3RoaXMuY2hhcnQuX3lQaXhlbHMoKSt0aGlzLmNoYXJ0Ll9oZWlnaHRQaXhlbHMoKSx0aGlzLmNoYXJ0Ll95UGl4ZWxzKCldKS5kb21haW4oW3RoaXMuX21pbix0aGlzLl9tYXhdKS5jbGFtcCh0aGlzLmNsYW1wKTp0aGlzLnVzZUxvZz90aGlzLl9zY2FsZT1hLnNjYWxlLmxvZygpLnJhbmdlKFt0aGlzLmNoYXJ0Ll95UGl4ZWxzKCkrdGhpcy5jaGFydC5faGVpZ2h0UGl4ZWxzKCksdGhpcy5jaGFydC5feVBpeGVscygpXSkuZG9tYWluKFswPT09dGhpcy5fbWluP01hdGgucG93KHRoaXMubG9nQmFzZSwtMSk6dGhpcy5fbWluLDA9PT10aGlzLl9tYXg/LTEqTWF0aC5wb3codGhpcy5sb2dCYXNlLC0xKTp0aGlzLl9tYXhdKS5jbGFtcCh0aGlzLmNsYW1wKS5iYXNlKHRoaXMubG9nQmFzZSkubmljZSgpOm51bGw9PT10aGlzLm1lYXN1cmV8fHZvaWQgMD09PXRoaXMubWVhc3VyZT8oaD1qKHRoaXMsInkiLCJ4IiksbnVsbCE9PXRoaXMuX3NsYXZlcyYmdm9pZCAwIT09dGhpcy5fc2xhdmVzJiZ0aGlzLl9zbGF2ZXMuZm9yRWFjaChmdW5jdGlvbihhKXtoPWguY29uY2F0KGooYSwieSIsIngiKSl9LHRoaXMpLHRoaXMuX3NjYWxlPWEuc2NhbGUub3JkaW5hbCgpLnJhbmdlUG9pbnRzKFt0aGlzLmNoYXJ0Ll95UGl4ZWxzKCkrdGhpcy5jaGFydC5faGVpZ2h0UGl4ZWxzKCksdGhpcy5jaGFydC5feVBpeGVscygpXSkuZG9tYWluKGguY29uY2F0KFsiIl0pKSk6dGhpcy5fc2NhbGU9YS5zY2FsZS5saW5lYXIoKS5yYW5nZShbdGhpcy5jaGFydC5feVBpeGVscygpK3RoaXMuY2hhcnQuX2hlaWdodFBpeGVscygpLHRoaXMuY2hhcnQuX3lQaXhlbHMoKV0pLmRvbWFpbihbdGhpcy5fbWluLHRoaXMuX21heF0pLmNsYW1wKHRoaXMuY2xhbXApLm5pY2UoKSwhdGhpcy5oaWRkZW4pc3dpdGNoKHRoaXMuY2hhcnQuX2F4aXNJbmRleCh0aGlzLCJ5Iikpe2Nhc2UgMDp0aGlzLl9kcmF3PWEuc3ZnLmF4aXMoKS5vcmllbnQoImxlZnQiKS5zY2FsZSh0aGlzLl9zY2FsZSksdGhpcy50aWNrcyYmdGhpcy5fZHJhdy50aWNrcyhpKTticmVhaztjYXNlIDE6dGhpcy5fZHJhdz1hLnN2Zy5heGlzKCkub3JpZW50KCJyaWdodCIpLnNjYWxlKHRoaXMuX3NjYWxlKSx0aGlzLnRpY2tzJiZ0aGlzLl9kcmF3LnRpY2tzKGkpfX1lbHNlIGlmKHRoaXMuX2hhc1RpbWVGaWVsZCgpP3RoaXMuX3NjYWxlPWEudGltZS5zY2FsZSgpLnJhbmdlKFt0aGlzLmNoYXJ0Ll94UGl4ZWxzKCksdGhpcy5jaGFydC5feFBpeGVscygpK3RoaXMuY2hhcnQuX3dpZHRoUGl4ZWxzKCldKS5kb21haW4oW3RoaXMuX21pbix0aGlzLl9tYXhdKS5jbGFtcCh0aGlzLmNsYW1wKTp0aGlzLnVzZUxvZz90aGlzLl9zY2FsZT1hLnNjYWxlLmxvZygpLnJhbmdlKFt0aGlzLmNoYXJ0Ll94UGl4ZWxzKCksdGhpcy5jaGFydC5feFBpeGVscygpK3RoaXMuY2hhcnQuX3dpZHRoUGl4ZWxzKCldKS5kb21haW4oWzA9PT10aGlzLl9taW4/TWF0aC5wb3codGhpcy5sb2dCYXNlLC0xKTp0aGlzLl9taW4sMD09PXRoaXMuX21heD8tMSpNYXRoLnBvdyh0aGlzLmxvZ0Jhc2UsLTEpOnRoaXMuX21heF0pLmNsYW1wKHRoaXMuY2xhbXApLmJhc2UodGhpcy5sb2dCYXNlKS5uaWNlKCk6bnVsbD09PXRoaXMubWVhc3VyZXx8dm9pZCAwPT09dGhpcy5tZWFzdXJlPyhoPWoodGhpcywieCIsInkiKSxudWxsIT09dGhpcy5fc2xhdmVzJiZ2b2lkIDAhPT10aGlzLl9zbGF2ZXMmJnRoaXMuX3NsYXZlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2g9aC5jb25jYXQoaihhLCJ4IiwieSIpKX0sdGhpcyksdGhpcy5fc2NhbGU9YS5zY2FsZS5vcmRpbmFsKCkucmFuZ2VQb2ludHMoW3RoaXMuY2hhcnQuX3hQaXhlbHMoKSx0aGlzLmNoYXJ0Ll94UGl4ZWxzKCkrdGhpcy5jaGFydC5fd2lkdGhQaXhlbHMoKV0pLmRvbWFpbihoLmNvbmNhdChbIiJdKSkpOnRoaXMuX3NjYWxlPWEuc2NhbGUubGluZWFyKCkucmFuZ2UoW3RoaXMuY2hhcnQuX3hQaXhlbHMoKSx0aGlzLmNoYXJ0Ll94UGl4ZWxzKCkrdGhpcy5jaGFydC5fd2lkdGhQaXhlbHMoKV0pLmRvbWFpbihbdGhpcy5fbWluLHRoaXMuX21heF0pLmNsYW1wKHRoaXMuY2xhbXApLm5pY2UoKSwhdGhpcy5oaWRkZW4pc3dpdGNoKHRoaXMuY2hhcnQuX2F4aXNJbmRleCh0aGlzLCJ4Iikpe2Nhc2UgMDp0aGlzLl9kcmF3PWEuc3ZnLmF4aXMoKS5vcmllbnQoImJvdHRvbSIpLnNjYWxlKHRoaXMuX3NjYWxlKSx0aGlzLnRpY2tzJiZ0aGlzLl9kcmF3LnRpY2tzKGkpO2JyZWFrO2Nhc2UgMTp0aGlzLl9kcmF3PWEuc3ZnLmF4aXMoKS5vcmllbnQoInRvcCIpLnNjYWxlKHRoaXMuX3NjYWxlKSx0aGlzLnRpY2tzJiZ0aGlzLl9kcmF3LnRpY2tzKGkpfXJldHVybiBudWxsIT09dGhpcy5fc2xhdmVzJiZ2b2lkIDAhPT10aGlzLl9zbGF2ZXMmJnRoaXMuX3NsYXZlcy5sZW5ndGg+MCYmdGhpcy5fc2xhdmVzLmZvckVhY2goZnVuY3Rpb24oYSl7YS5fc2NhbGU9dGhpcy5fc2NhbGV9LHRoaXMpLG51bGwhPT1jJiZ2b2lkIDAhPT1jJiZjIT09ITF8fHRoaXMuX2hhc1RpbWVGaWVsZCgpfHxudWxsPT09dGhpcy5fc2NhbGV8fG51bGw9PT10aGlzLl9zY2FsZS50aWNrc3x8dm9pZCAwPT09dGhpcy5fc2NhbGUudGlja3N8fCEodGhpcy5fc2NhbGUudGlja3MoaSkubGVuZ3RoPjApfHwieCIhPT10aGlzLnBvc2l0aW9uJiYieSIhPT10aGlzLnBvc2l0aW9ufHwoZD10aGlzLl9zY2FsZS50aWNrcyhpKSxlPWRbMV0tZFswXSxmPSgodGhpcy5fbWF4LXRoaXMuX21pbiklZSkudG9GaXhlZCgwKSx0aGlzLl90aWNrX3N0ZXA9ZSwwIT09ZiYmKHRoaXMuX21heD1NYXRoLmNlaWwodGhpcy5fbWF4L2UpKmUsdGhpcy5fbWluPU1hdGguZmxvb3IodGhpcy5fbWluL2UpKmUsdGhpcy5fdXBkYXRlKCEwKSkpLGc9bnVsbCE9PWgmJnZvaWQgMCE9PWgmJmgubGVuZ3RoPjA/dGhpcy5fc2NhbGUuY29weSgpKGhbMF0pOnRoaXMuX21pbj4wP3RoaXMuX3NjYWxlLmNvcHkoKSh0aGlzLl9taW4pOnRoaXMuX21heDwwP3RoaXMuX3NjYWxlLmNvcHkoKSh0aGlzLl9tYXgpOnRoaXMuX3NjYWxlLmNvcHkoKSgwKSx0aGlzLl9vcmlnaW4hPT1nJiYodGhpcy5fcHJldmlvdXNPcmlnaW49bnVsbD09PXRoaXMuX29yaWdpbj9nOnRoaXMuX29yaWdpbix0aGlzLl9vcmlnaW49ZyksdGhpc30sdGhpcy5hZGRHcm91cE9yZGVyUnVsZT1mdW5jdGlvbihhLGIpe3RoaXMuX2dyb3VwT3JkZXJSdWxlcy5wdXNoKHtvcmRlcmluZzphLGRlc2M6Yn0pfSx0aGlzLmFkZE9yZGVyUnVsZT1mdW5jdGlvbihhLGIpe3RoaXMuX29yZGVyUnVsZXMucHVzaCh7b3JkZXJpbmc6YSxkZXNjOmJ9KX19LGIuY2hhcnQ9ZnVuY3Rpb24oYyxkKXt0aGlzLnN2Zz1jLHRoaXMueD0iMTAlIix0aGlzLnk9IjEwJSIsdGhpcy53aWR0aD0iODAlIix0aGlzLmhlaWdodD0iODAlIix0aGlzLmRhdGE9ZCx0aGlzLm5vRm9ybWF0cz0hMSx0aGlzLmF4ZXM9W10sdGhpcy5zZXJpZXM9W10sdGhpcy5sZWdlbmRzPVtdLHRoaXMuc3Rvcnlib2FyZD1udWxsLHRoaXMudGl0bGVTaGFwZT1udWxsLHRoaXMuc2hhcGVzPW51bGwsdGhpcy5lYXNlPSJjdWJpYy1pbi1vdXQiLHRoaXMuc3RhZ2dlckRyYXc9ITEsdGhpcy5fZ3JvdXA9Yy5hcHBlbmQoImciKSx0aGlzLl90b29sdGlwR3JvdXA9bnVsbCx0aGlzLl9hc3NpZ25lZENvbG9ycz17fSx0aGlzLl9hc3NpZ25lZENsYXNzZXM9e30sdGhpcy5fbmV4dENvbG9yPTAsdGhpcy5fbmV4dENsYXNzPTAsdGhpcy5fYXhpc0luZGV4PWZ1bmN0aW9uKGEsYil7dmFyIGM9MCxkPTAsZT0tMTtmb3IoYz0wO2M8dGhpcy5heGVzLmxlbmd0aDtjKz0xKXtpZih0aGlzLmF4ZXNbY109PT1hKXtlPWQ7YnJlYWt9KG51bGw9PT1ifHx2b2lkIDA9PT1ifHxiWzBdPT09dGhpcy5heGVzW2NdLnBvc2l0aW9uWzBdKSYmKGQrPTEpfXJldHVybiBlfSx0aGlzLl9nZXRBbGxEYXRhPWZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIG51bGwhPT10aGlzLmRhdGEmJnZvaWQgMCE9PXRoaXMuZGF0YSYmdGhpcy5kYXRhLmxlbmd0aD4wJiYoYT1hLmNvbmNhdCh0aGlzLmRhdGEpKSxudWxsIT09dGhpcy5zZXJpZXMmJnZvaWQgMCE9PXRoaXMuc2VyaWVzJiZ0aGlzLnNlcmllcy5sZW5ndGg+MCYmdGhpcy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihiKXtudWxsIT09Yi5kYXRhJiZ2b2lkIDAhPT1iLmRhdGEmJmIuZGF0YS5sZW5ndGg+MCYmKGE9YS5jb25jYXQoYi5kYXRhKSl9KSxhfSx0aGlzLl9nZXREYXRhPWZ1bmN0aW9uKGMsZCxlLGYsZyxoLGksaixrLGwpe3ZhciBtLG4sbz1bXSxwPWZ1bmN0aW9uKGEsYil7dmFyIGM9W107cmV0dXJuIG51bGwhPT1hJiYoYS5faGFzVGltZUZpZWxkKCk/Yy5wdXNoKGEuX3BhcnNlRGF0ZShiW2EudGltZUZpZWxkXSkpOmEuX2hhc0NhdGVnb3JpZXMoKSYmYS5jYXRlZ29yeUZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2MucHVzaChiW2FdKX0sdGhpcykpLGN9LHE9e3g6ITEseTohMSx6OiExLHA6ITEsYzohMX0scj17eDpbXSx5OltdfSxzPXt4OltdLHk6W10sejpbXSxwOltdfSx0PXttaW46bnVsbCxtYXg6bnVsbH0sdT17eDpbXSx5OltdLHo6W10scDpbXX0sdj1bXSx3PXt9LHg9e3g6MCx5OjAsejowLHA6MH0seT0iIix6PVtdLEE9W10sQj1bXSxDPSIiLEQ9W10sRT0iIixGPVtdLEc9IiIsSD1bXSxJPVtdLEo9YyxLPVtdO3RoaXMuc3Rvcnlib2FyZCYmdGhpcy5zdG9yeWJvYXJkLmNhdGVnb3J5RmllbGRzLmxlbmd0aD4wJiYoeT10aGlzLnN0b3J5Ym9hcmQuY2F0ZWdvcnlGaWVsZHNbMF0sej1iLl9nZXRPcmRlcmVkTGlzdChKLHksdGhpcy5zdG9yeWJvYXJkLl9vcmRlclJ1bGVzKSksaCYmaC5faGFzQ2F0ZWdvcmllcygpJiZoLl9oYXNNZWFzdXJlKCkmJihDPWguY2F0ZWdvcnlGaWVsZHNbMF0sRD1iLl9nZXRPcmRlcmVkTGlzdChKLEMsaC5fb3JkZXJSdWxlcy5jb25jYXQoW3tvcmRlcmluZzpoLm1lYXN1cmUsZGVzYzohMH1dKSkpLGkmJmkuX2hhc0NhdGVnb3JpZXMoKSYmaS5faGFzTWVhc3VyZSgpJiYoRT1pLmNhdGVnb3J5RmllbGRzWzBdLEY9Yi5fZ2V0T3JkZXJlZExpc3QoSixFLGkuX29yZGVyUnVsZXMuY29uY2F0KFt7b3JkZXJpbmc6aS5tZWFzdXJlLGRlc2M6ITB9XSkpKSxrJiZrLl9oYXNDYXRlZ29yaWVzKCkmJmsuX2hhc01lYXN1cmUoKSYmKEc9ay5jYXRlZ29yeUZpZWxkc1swXSxIPWIuX2dldE9yZGVyZWRMaXN0KEosRyxrLl9vcmRlclJ1bGVzLmNvbmNhdChbe29yZGVyaW5nOmsubWVhc3VyZSxkZXNjOiEwfV0pKSksSi5sZW5ndGg+MCYmZCYmZC5sZW5ndGg+MCYmKEk9W10uY29uY2F0KGYpLEE9W10sZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZvaWQgMCE9PUpbMF1bYV0mJkEucHVzaChhKX0sdGhpcyksayYmay5faGFzTWVhc3VyZSgpP0kucHVzaCh7b3JkZXJpbmc6ay5tZWFzdXJlLGRlc2M6ITB9KTpsJiZsLl9oYXNNZWFzdXJlKCk/SS5wdXNoKHtvcmRlcmluZzpsLm1lYXN1cmUsZGVzYzohMH0pOmomJmouX2hhc01lYXN1cmUoKT9JLnB1c2goe29yZGVyaW5nOmoubWVhc3VyZSxkZXNjOiEwfSk6aCYmaC5faGFzTWVhc3VyZSgpP0kucHVzaCh7b3JkZXJpbmc6aC5tZWFzdXJlLGRlc2M6ITB9KTppJiZpLl9oYXNNZWFzdXJlKCkmJkkucHVzaCh7b3JkZXJpbmc6aS5tZWFzdXJlLGRlc2M6ITB9KSxCPWIuX2dldE9yZGVyZWRMaXN0KEosQSxJKSksSi5zb3J0KGZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZyxoLGk9MDtpZigiIiE9PXkmJihpPXouaW5kZXhPZihhW3ldKS16LmluZGV4T2YoYlt5XSkpLCIiIT09QyYmMD09PWkmJihpPUQuaW5kZXhPZihhW0NdKS1ELmluZGV4T2YoYltDXSkpLCIiIT09RSYmMD09PWkmJihpPUYuaW5kZXhPZihhW0VdKS1GLmluZGV4T2YoYltFXSkpLCIiIT09RyYmMD09PWkmJihpPUguaW5kZXhPZihhW0ddKS1GLmluZGV4T2YoYltHXSkpLEEmJkEubGVuZ3RoPjAmJjA9PT1pKWZvcihjPVtdLmNvbmNhdChBKSxpPTAsZT0wO2U8Qi5sZW5ndGg7ZSs9MSl7Zm9yKGQ9W10uY29uY2F0KEJbZV0pLGc9ITAsaD0hMCxmPTA7ZjxjLmxlbmd0aDtmKz0xKWc9ZyYmYVtjW2ZdXT09PWRbZl0saD1oJiZiW2NbZl1dPT09ZFtmXTtpZihnJiZoKXtpPTA7YnJlYWt9aWYoZyl7aT0tMTticmVha31pZihoKXtpPTE7YnJlYWt9fXJldHVybiBpfSksSi5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiLGMsZixnLG0sbj0tMSxyPXAoaCxhKSxzPXAoaSxhKSx0PXAoaixhKSx1PXAoayxhKSx2PVtdO2lmKGQmJjAhPT1kLmxlbmd0aClmb3IoZj0wO2Y8ZC5sZW5ndGg7Zis9MSl2b2lkIDA9PT1hW2RbZl1dP3YucHVzaChkW2ZdKTp2LnB1c2goYVtkW2ZdXSk7ZWxzZSB2PVsiQWxsIl07Zm9yKGI9di5qb2luKCIvIikrIl8iK3Iuam9pbigiLyIpKyJfIitzLmpvaW4oIi8iKSsiXyIrdS5qb2luKCIvIikrIl8iK3Quam9pbigiLyIpLGM9MDtjPG8ubGVuZ3RoO2MrPTEpaWYob1tjXS5rZXk9PT1iKXtuPWM7YnJlYWt9LTE9PT1uJiYoZz17a2V5OmIsYWdnRmllbGQ6dix4RmllbGQ6cix4VmFsdWU6bnVsbCx4Q291bnQ6MCx5RmllbGQ6cyx5VmFsdWU6bnVsbCx5Q291bnQ6MCxwRmllbGQ6dSxwVmFsdWU6bnVsbCxwQ291bnQ6MCx6RmllbGQ6dCx6VmFsdWU6bnVsbCx6Q291bnQ6MCxjVmFsdWU6MCxjQ291bnQ6MCx4OjAseTowLHhPZmZzZXQ6MCx5T2Zmc2V0OjAsd2lkdGg6MCxoZWlnaHQ6MCxjeDowLGN5OjAseEJvdW5kOjAseUJvdW5kOjAseFZhbHVlTGlzdDpbXSx5VmFsdWVMaXN0OltdLHpWYWx1ZUxpc3Q6W10scFZhbHVlTGlzdDpbXSxjVmFsdWVMaXN0OltdLGZpbGw6e30sc3Ryb2tlOnt9fSxvLnB1c2goZyksbj1vLmxlbmd0aC0xKSxtPWZ1bmN0aW9uKGIsYyl7dmFyIGQsZixnPSEwLGg9e3ZhbHVlOjAsY291bnQ6MX0saT17dmFsdWU6MCxjb3VudDoxfSxqPSIiO251bGwhPT1jJiYoZD1jLmdldEZyYW1lVmFsdWUoKSxjLmNhdGVnb3J5RmllbGRzLmZvckVhY2goZnVuY3Rpb24oYixjKXtjPjAmJihqKz0iLyIpLGorPWFbYl0sZz1qPT09ZH0sdGhpcykpLG51bGwhPT1iJiZ2b2lkIDAhPT1iJiZnJiYoZj1vW25dLGIuX2hhc01lYXN1cmUoKSYmbnVsbCE9PWFbYi5tZWFzdXJlXSYmdm9pZCAwIT09YVtiLm1lYXN1cmVdJiYoLTE9PT1mW2IucG9zaXRpb24rIlZhbHVlTGlzdCJdLmluZGV4T2YoYVtiLm1lYXN1cmVdKSYmZltiLnBvc2l0aW9uKyJWYWx1ZUxpc3QiXS5wdXNoKGFbYi5tZWFzdXJlXSksaXNOYU4ocGFyc2VGbG9hdChhW2IubWVhc3VyZV0pKSYmKHFbYi5wb3NpdGlvbl09ITApLGgudmFsdWU9ZltiLnBvc2l0aW9uKyJWYWx1ZSJdLGguY291bnQ9ZltiLnBvc2l0aW9uKyJDb3VudCJdLGkudmFsdWU9YVtiLm1lYXN1cmVdLGZbYi5wb3NpdGlvbisiVmFsdWUiXT1lKGgsaSksZltiLnBvc2l0aW9uKyJDb3VudCJdKz0xKSl9LG0oaCx0aGlzLnN0b3J5Ym9hcmQpLG0oaSx0aGlzLnN0b3J5Ym9hcmQpLG0oaix0aGlzLnN0b3J5Ym9hcmQpLG0oayx0aGlzLnN0b3J5Ym9hcmQpLG0obCx0aGlzLnN0b3J5Ym9hcmQpfSx0aGlzKSxoJiZoLl9oYXNDYXRlZ29yaWVzKCkmJmguY2F0ZWdvcnlGaWVsZHMubGVuZ3RoPjEmJnZvaWQgMCE9PXIueCYmKEs9W10saS5faGFzTWVhc3VyZSgpJiZLLnB1c2goe29yZGVyaW5nOmkubWVhc3VyZSxkZXNjOiEwfSksci54PWIuX2dldE9yZGVyZWRMaXN0KEosaC5jYXRlZ29yeUZpZWxkc1sxXSxoLl9ncm91cE9yZGVyUnVsZXMuY29uY2F0KEspKSksaSYmaS5faGFzQ2F0ZWdvcmllcygpJiZpLmNhdGVnb3J5RmllbGRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1yLnkmJihLPVtdLGguX2hhc01lYXN1cmUoKSYmSy5wdXNoKHtvcmRlcmluZzpoLm1lYXN1cmUsZGVzYzohMH0pLHIueT1iLl9nZXRPcmRlcmVkTGlzdChKLGkuY2F0ZWdvcnlGaWVsZHNbMV0saS5fZ3JvdXBPcmRlclJ1bGVzLmNvbmNhdChLKSksci55LnJldmVyc2UoKSksby5mb3JFYWNoKGZ1bmN0aW9uKGEpe251bGwhPT1oJiYocS54PT09ITAmJihhLnhWYWx1ZT1hLnhWYWx1ZUxpc3QubGVuZ3RoKSxtPShzLnhbYS54RmllbGQuam9pbigiLyIpXXx8MCkrKGkuX2hhc01lYXN1cmUoKT9NYXRoLmFicyhhLnlWYWx1ZSk6MCkscy54W2EueEZpZWxkLmpvaW4oIi8iKV09bSksbnVsbCE9PWkmJihxLnk9PT0hMCYmKGEueVZhbHVlPWEueVZhbHVlTGlzdC5sZW5ndGgpLG09KHMueVthLnlGaWVsZC5qb2luKCIvIildfHwwKSsoaC5faGFzTWVhc3VyZSgpP01hdGguYWJzKGEueFZhbHVlKTowKSxzLnlbYS55RmllbGQuam9pbigiLyIpXT1tKSxudWxsIT09ayYmKHEucD09PSEwJiYoYS5wVmFsdWU9YS5wVmFsdWVMaXN0Lmxlbmd0aCksbT0ocy5wW2EucEZpZWxkLmpvaW4oIi8iKV18fDApKyhrLl9oYXNNZWFzdXJlKCk/TWF0aC5hYnMoYS5wVmFsdWUpOjApLHMucFthLnBGaWVsZC5qb2luKCIvIildPW0pLG51bGwhPT1qJiYocS56PT09ITAmJihhLnpWYWx1ZT1hLnpWYWx1ZUxpc3QubGVuZ3RoKSxtPShzLnpbYS56RmllbGQuam9pbigiLyIpXXx8MCkrKGouX2hhc01lYXN1cmUoKT9NYXRoLmFicyhhLnpWYWx1ZSk6MCkscy56W2EuekZpZWxkLmpvaW4oIi8iKV09bSksbnVsbCE9PWwmJigobnVsbD09PXQubWlufHxhLmNWYWx1ZTx0Lm1pbikmJih0Lm1pbj1hLmNWYWx1ZSksKG51bGw9PT10Lm1heHx8YS5jVmFsdWU+dC5tYXgpJiYodC5tYXg9YS5jVmFsdWUpKX0sdGhpcyk7Zm9yKG4gaW4gcy54KXMueC5oYXNPd25Qcm9wZXJ0eShuKSYmKHgueCs9cy54W25dKTtmb3IobiBpbiBzLnkpcy55Lmhhc093blByb3BlcnR5KG4pJiYoeC55Kz1zLnlbbl0pO2ZvcihuIGluIHMucClzLnAuaGFzT3duUHJvcGVydHkobikmJih4LnArPXMucFtuXSk7Zm9yKG4gaW4gcy56KXMuei5oYXNPd25Qcm9wZXJ0eShuKSYmKHgueis9cy56W25dKTtyZXR1cm4gby5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBjLGQsZSxmLG0sbj1mdW5jdGlvbihhLGMsZCl7dmFyIGUsZixoLGksajtudWxsIT09YSYmdm9pZCAwIT09YSYmKGk9YS5wb3NpdGlvbixhLl9oYXNDYXRlZ29yaWVzKCk/YS5faGFzTWVhc3VyZSgpPyhlPWJbYS5wb3NpdGlvbisiRmllbGQiXS5qb2luKCIvIiksZj1hLnNob3dQZXJjZW50P3NbYS5wb3NpdGlvbl1bZV0veFthLnBvc2l0aW9uXTpzW2EucG9zaXRpb25dW2VdLC0xPT09di5pbmRleE9mKGUpJiYod1tlXT1mKyh2Lmxlbmd0aD4wP3dbdlt2Lmxlbmd0aC0xXV06MCksdi5wdXNoKGUpKSxoPWJbaSsiQm91bmQiXT1iWyJjIitpXT0ieCIhPT1pJiYieSIhPT1pfHwhZz9mOndbZV0sYltkXT1mLGJbaV09aC0oIngiPT09aSYmZj49MHx8InkiPT09aSYmMD49Zj9mOjApKTooYltpXT1iWyJjIitpXT1iW2krIkZpZWxkIl1bMF0sYltkXT0xLHZvaWQgMCE9PXJbaV0mJm51bGwhPT1yW2ldJiZyW2ldLmxlbmd0aD49MiYmKGJbaSsiT2Zmc2V0Il09cltpXS5pbmRleE9mKGJbaSsiRmllbGQiXVsxXSksYltkXT0xL3JbaV0ubGVuZ3RoKSk6KGY9YS5zaG93UGVyY2VudD9iW2krIlZhbHVlIl0vc1tjXVtiW2MrIkZpZWxkIl0uam9pbigiLyIpXTpiW2krIlZhbHVlIl0sZT1iW2MrIkZpZWxkIl0uam9pbigiLyIpKyhiW2krIlZhbHVlIl0+PTApLGo9dVtpXVtlXT0obnVsbD09PXVbaV1bZV18fHZvaWQgMD09PXVbaV1bZV18fCJ6Ij09PWl8fCJwIj09PWk/MDp1W2ldW2VdKStmLGg9YltpKyJCb3VuZCJdPWJbImMiK2ldPSJ4IiE9PWkmJiJ5IiE9PWl8fCFnP2Y6aixiW2RdPWYsYltpXT1oLSgieCI9PT1pJiZmPj0wfHwieSI9PT1pJiYwPj1mP2Y6MCkpKX07bihoLCJ5Iiwid2lkdGgiKSxuKGksIngiLCJoZWlnaHQiKSxuKGosInoiLCJyIiksbihrLCJwIiwiYW5nbGUiKSxudWxsIT09bCYmbnVsbCE9PXQubWluJiZudWxsIT09dC5tYXgmJih0Lm1pbj09PXQubWF4JiYodC5taW4tPS41LHQubWF4Kz0uNSksdC5taW49bC5vdmVycmlkZU1pbnx8dC5taW4sdC5tYXg9bC5vdmVycmlkZU1heHx8dC5tYXgsYi5jVmFsdWU9Yi5jVmFsdWU+dC5tYXg/dC5tYXg6Yi5jVmFsdWU8dC5taW4/dC5taW46Yi5jVmFsdWUsZT1hLnNjYWxlLmxpbmVhcigpLnJhbmdlKFswLG51bGw9PT1sLmNvbG9yc3x8MT09PWwuY29sb3JzLmxlbmd0aD8xOmwuY29sb3JzLmxlbmd0aC0xXSkuZG9tYWluKFt0Lm1pbix0Lm1heF0pLGY9ZShiLmNWYWx1ZSksbT1mLU1hdGguZmxvb3IoZiksYi5jVmFsdWU9PT10Lm1heCYmKG09MSksbC5jb2xvcnMmJjE9PT1sLmNvbG9ycy5sZW5ndGg/KGM9YS5yZ2IobC5jb2xvcnNbMF0pLGQ9YS5yZ2IodGhpcy5nZXRDb2xvcihiLmFnZ0ZpZWxkLnNsaWNlKC0xKVswXSkuZmlsbCkpOmwuY29sb3JzJiZsLmNvbG9ycy5sZW5ndGg+MT8oYz1hLnJnYihsLmNvbG9yc1tNYXRoLmZsb29yKGYpXSksZD1hLnJnYihsLmNvbG9yc1tNYXRoLmNlaWwoZildKSk6KGM9YS5yZ2IoIndoaXRlIiksZD1hLnJnYih0aGlzLmdldENvbG9yKGIuYWdnRmllbGQuc2xpY2UoLTEpWzBdKS5maWxsKSksYy5yPU1hdGguZmxvb3IoYy5yKyhkLnItYy5yKSptKSxjLmc9TWF0aC5mbG9vcihjLmcrKGQuZy1jLmcpKm0pLGMuYj1NYXRoLmZsb29yKGMuYisoZC5iLWMuYikqbSksYi5maWxsPWMudG9TdHJpbmcoKSxiLnN0cm9rZT1jLmRhcmtlciguNSkudG9TdHJpbmcoKSl9LHRoaXMpLG99LHRoaXMuX2dldERlbGF5PWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIGY9MDtyZXR1cm4gZCYmYy5zdGFnZ2VyRHJhdyYmKGQueC5faGFzQ2F0ZWdvcmllcygpP2Y9Yi5faGVscGVycy5jeChlLGMsZCkvYy5fd2lkdGhQaXhlbHMoKSphOmQueS5faGFzQ2F0ZWdvcmllcygpJiYoZj0oMS1iLl9oZWxwZXJzLmN5KGUsYyxkKS9jLl9oZWlnaHRQaXhlbHMoKSkqYSkpLGZ9fSx0aGlzLl9nZXRTZXJpZXNEYXRhPWZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuc2VyaWVzJiZ2b2lkIDAhPT10aGlzLnNlcmllcyYmdGhpcy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaD1hLmRhdGF8fHRoaXMuZGF0YXx8W10saT1bXS5jb25jYXQoYS5jYXRlZ29yeUZpZWxkc3x8IkFsbCIpLGo9dGhpcy5fZ2V0RGF0YShoLGksYS5hZ2dyZWdhdGUsYS5fb3JkZXJSdWxlcyxhLl9pc1N0YWNrZWQoKSxhLngsYS55LGEueixhLnAsYS5jKSxrPVtdLGw9e30sbT1hLnN0YXJ0QW5nbGUqKE1hdGguUEkvMTgwKXx8MCxuPShhLmVuZEFuZ2xlfHwzNjApKihNYXRoLlBJLzE4MCk7aWYobT5uJiYobS09MipNYXRoLlBJKSxhLnAmJmkubGVuZ3RoPjApe2lmKGEueCYmYS55KXtmb3IoaS5wb3AoKSxrPXRoaXMuX2dldERhdGEoaCxbIl9fZGltcGxlX3BsYWNlaG9sZGVyX18iXS5jb25jYXQoaSksYS5hZ2dyZWdhdGUsYS5fb3JkZXJSdWxlcyxhLl9pc1N0YWNrZWQoKSxhLngsYS55LGEueixhLnAsYS5jKSxiPTA7YjxqLmxlbmd0aDtiKz0xKWZvcihkPVsiX19kaW1wbGVfcGxhY2Vob2xkZXJfXyJdLmNvbmNhdChqW2JdLmFnZ0ZpZWxkKSxkLnBvcCgpLGEueCYmYS54Ll9oYXNDYXRlZ29yaWVzKCkmJihkPWQuY29uY2F0KGpbYl0ueEZpZWxkKSksYS55JiZhLnkuX2hhc0NhdGVnb3JpZXMoKSYmKGQ9ZC5jb25jYXQoaltiXS55RmllbGQpKSxlPWQuam9pbigifCIpLGM9MDtjPGsubGVuZ3RoO2MrPTEpaWYoZj1bXS5jb25jYXQoa1tjXS5hZ2dGaWVsZCksYS54JiZhLnguX2hhc0NhdGVnb3JpZXMoKSYmKGY9Zi5jb25jYXQoa1tjXS54RmllbGQpKSxhLnkmJmEueS5faGFzQ2F0ZWdvcmllcygpJiYoZj1mLmNvbmNhdChrW2NdLnlGaWVsZCkpLGc9Zi5qb2luKCJ8IiksZT09PWcpe2pbYl0ueEZpZWxkPWtbY10ueEZpZWxkLGpbYl0ueFZhbHVlPWtbY10ueFZhbHVlLGpbYl0ueENvdW50PWtbY10ueENvdW50LGpbYl0ueUZpZWxkPWtbY10ueUZpZWxkLGpbYl0ueVZhbHVlPWtbY10ueVZhbHVlLGpbYl0ueUNvdW50PWtbY10ueUNvdW50LGpbYl0uekZpZWxkPWtbY10uekZpZWxkLGpbYl0uelZhbHVlPWtbY10uelZhbHVlLGpbYl0uekNvdW50PWtbY10uekNvdW50LGpbYl0ueD1rW2NdLngsaltiXS55PWtbY10ueSxqW2JdLnI9a1tjXS5yLGpbYl0ueE9mZnNldD1rW2NdLnhPZmZzZXQsaltiXS55T2Zmc2V0PWtbY10ueU9mZnNldCxqW2JdLndpZHRoPWtbY10ud2lkdGgsaltiXS5oZWlnaHQ9a1tjXS5oZWlnaHQsaltiXS5jeD1rW2NdLmN4LGpbYl0uY3k9a1tjXS5jeSxqW2JdLnhCb3VuZD1rW2NdLnhCb3VuZCxqW2JdLnlCb3VuZD1rW2NdLnlCb3VuZCxqW2JdLnhWYWx1ZUxpc3Q9a1tjXS54VmFsdWVMaXN0LGpbYl0ueVZhbHVlTGlzdD1rW2NdLnlWYWx1ZUxpc3QsaltiXS56VmFsdWVMaXN0PWtbY10uelZhbHVlTGlzdCxqW2JdLmNWYWx1ZUxpc3Q9a1tjXS5jVmFsdWVMaXN0LGpbYl0ucGllS2V5PWtbY10ua2V5LGpbYl0udmFsdWU9ai5wVmFsdWUsbFtrW2NdLmtleV18fChsW2tbY10ua2V5XT17dG90YWw6MCxhbmdsZTptfSksbFtrW2NdLmtleV0udG90YWwrPWpbYl0ucFZhbHVlO2JyZWFrfX1lbHNlIGZvcihiPTA7YjxqLmxlbmd0aDtiKz0xKWpbYl0ucGllS2V5PSJBbGwiLGpbYl0udmFsdWU9ai5wVmFsdWUsbFtqW2JdLnBpZUtleV18fChsW2pbYl0ucGllS2V5XT17dG90YWw6MCxhbmdsZTptfSksbFtqW2JdLnBpZUtleV0udG90YWwrPWpbYl0ucFZhbHVlO2ZvcihiPTA7YjxqLmxlbmd0aDtiKz0xKWpbYl0ucGllUGN0PWpbYl0ucFZhbHVlL2xbaltiXS5waWVLZXldLnRvdGFsLGpbYl0uc3RhcnRBbmdsZT1sW2pbYl0ucGllS2V5XS5hbmdsZSxqW2JdLmVuZEFuZ2xlPWpbYl0uc3RhcnRBbmdsZStqW2JdLnBpZVBjdCoobi1tKSxsW2pbYl0ucGllS2V5XS5hbmdsZT1qW2JdLmVuZEFuZ2xlfWEuX3Bvc2l0aW9uRGF0YT1qfSx0aGlzKX0sdGhpcy5faGFuZGxlVHJhbnNpdGlvbj1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1udWxsO3JldHVybiBlPTA9PT1iP2E6YS50cmFuc2l0aW9uKCkuZHVyYXRpb24oYikuZGVsYXkoYy5fZ2V0RGVsYXkoYixjLGQpKS5lYXNlKGMuZWFzZSl9LHRoaXMuX2hlaWdodFBpeGVscz1mdW5jdGlvbigpe3JldHVybiBiLl9wYXJzZVlQb3NpdGlvbih0aGlzLmhlaWdodCx0aGlzLnN2Zy5ub2RlKCkpfSx0aGlzLl9yZWdpc3RlckV2ZW50SGFuZGxlcnM9ZnVuY3Rpb24oYyl7bnVsbCE9PWMuX2V2ZW50SGFuZGxlcnMmJmMuX2V2ZW50SGFuZGxlcnMubGVuZ3RoPjAmJmMuX2V2ZW50SGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgZSxmPWZ1bmN0aW9uKGUpe3ZhciBmPW5ldyBiLmV2ZW50QXJncztudWxsIT09Yy5jaGFydC5zdG9yeWJvYXJkJiYoZi5mcmFtZVZhbHVlPWMuY2hhcnQuc3Rvcnlib2FyZC5nZXRGcmFtZVZhbHVlKCkpLGYuc2VyaWVzVmFsdWU9ZS5hZ2dGaWVsZCxmLnhWYWx1ZT1lLngsZi55VmFsdWU9ZS55LGYuelZhbHVlPWUueixmLnBWYWx1ZT1lLnAsZi5jb2xvclZhbHVlPWUuY1ZhbHVlLGYuc2VyaWVzU2hhcGVzPWMuc2hhcGVzLGYuc2VsZWN0ZWRTaGFwZT1hLnNlbGVjdCh0aGlzKSxkLmhhbmRsZXIoZil9O2lmKG51bGwhPT1kLmhhbmRsZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmhhbmRsZXIpaWYobnVsbCE9PWMuX21hcmtlcnMmJnZvaWQgMCE9PWMuX21hcmtlcnMpZm9yKGUgaW4gYy5fbWFya2VycyljLl9tYXJrZXJzLmhhc093blByb3BlcnR5KGUpJiZjLl9tYXJrZXJzW2VdLm9uKGQuZXZlbnQsZik7ZWxzZSBjLnNoYXBlcy5vbihkLmV2ZW50LGYpfSx0aGlzKX0sdGhpcy5fd2lkdGhQaXhlbHM9ZnVuY3Rpb24oKXtyZXR1cm4gYi5fcGFyc2VYUG9zaXRpb24odGhpcy53aWR0aCx0aGlzLnN2Zy5ub2RlKCkpfSx0aGlzLl94UGl4ZWxzPWZ1bmN0aW9uKCl7cmV0dXJuIGIuX3BhcnNlWFBvc2l0aW9uKHRoaXMueCx0aGlzLnN2Zy5ub2RlKCkpfSx0aGlzLl95UGl4ZWxzPWZ1bmN0aW9uKCl7cmV0dXJuIGIuX3BhcnNlWVBvc2l0aW9uKHRoaXMueSx0aGlzLnN2Zy5ub2RlKCkpfSx0aGlzLmFkZEF4aXM9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGY9bnVsbCxnPW51bGw7aWYobnVsbCE9PWMmJnZvaWQgMCE9PWMmJihjPVtdLmNvbmNhdChjKSksInN0cmluZyI9PXR5cGVvZiBhfHxhIGluc3RhbmNlb2YgU3RyaW5nKWY9bmV3IGIuYXhpcyh0aGlzLGEsYyxkLGUpLHRoaXMuYXhlcy5wdXNoKGYpO2Vsc2V7aWYoZz1hLGY9bmV3IGIuYXhpcyh0aGlzLGcucG9zaXRpb24sYyxkLGUpLGYuX2hhc01lYXN1cmUoKSE9PWcuX2hhc01lYXN1cmUoKSl0aHJvdyJZb3UgaGF2ZSBzcGVjaWZpZWQgYSBjb21wb3NpdGUgYXhpcyB3aGVyZSBzb21lIGJ1dCBub3QgYWxsIGF4ZXMgaGF2ZSBhIG1lYXN1cmUgLSB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQsIGFsbCBheGVzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZS4iO2lmKGYuX2hhc1RpbWVGaWVsZCgpIT09Zy5faGFzVGltZUZpZWxkKCkpdGhyb3ciWW91IGhhdmUgc3BlY2lmaWVkIGEgY29tcG9zaXRlIGF4aXMgd2hlcmUgc29tZSBidXQgbm90IGFsbCBheGVzIGhhdmUgYSB0aW1lIGZpZWxkIC0gdGhpcyBpcyBub3Qgc3VwcG9ydGVkLCBhbGwgYXhlcyBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUuIjtpZigobnVsbD09PWYuY2F0ZWdvcnlGaWVsZHN8fHZvaWQgMD09PWYuY2F0ZWdvcnlGaWVsZHM/MDpmLmNhdGVnb3J5RmllbGRzLmxlbmd0aCkhPT0obnVsbD09PWcuY2F0ZWdvcnlGaWVsZHN8fHZvaWQgMD09PWcuY2F0ZWdvcnlGaWVsZHM/MDpnLmNhdGVnb3J5RmllbGRzLmxlbmd0aCkpdGhyb3ciWW91IGhhdmUgc3BlY2lmaWVkIGEgY29tcG9zaXRlIGF4aXMgd2hlcmUgYXhlcyBoYXZlIGRpZmZlcmluZyBudW1iZXJzIG9mIGNhdGVnb3J5IGZpZWxkcyAtIHRoaXMgaXMgbm90IHN1cHBvcnRlZCwgYWxsIGF4ZXMgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlLiI7Zy5fc2xhdmVzLnB1c2goZil9cmV0dXJuIGZ9LHRoaXMuYWRkQ2F0ZWdvcnlBeGlzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYWRkQXhpcyhhLGIsbnVsbCl9LHRoaXMuYWRkQ29sb3JBeGlzPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5hZGRBeGlzKCJjIixudWxsLGEpO3JldHVybiBjLmNvbG9ycz1udWxsPT09Ynx8dm9pZCAwPT09Yj9udWxsOltdLmNvbmNhdChiKSxjfSx0aGlzLmFkZExlZ2VuZD1mdW5jdGlvbihhLGMsZCxlLGYsZyl7Zz1udWxsPT09Z3x8dm9pZCAwPT09Zz90aGlzLnNlcmllczpbXS5jb25jYXQoZyksZj1udWxsPT09Znx8dm9pZCAwPT09Zj8ibGVmdCI6Zjt2YXIgaD1uZXcgYi5sZWdlbmQodGhpcyxhLGMsZCxlLGYsZyk7cmV0dXJuIHRoaXMubGVnZW5kcy5wdXNoKGgpLGh9LHRoaXMuYWRkTG9nQXhpcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5hZGRBeGlzKGEsbnVsbCxiLG51bGwpO3JldHVybiBudWxsIT09YyYmdm9pZCAwIT09YyYmKGQubG9nQmFzZT1jKSxkLnVzZUxvZz0hMCxkfSx0aGlzLmFkZE1lYXN1cmVBeGlzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYWRkQXhpcyhhLG51bGwsYil9LHRoaXMuYWRkUGN0QXhpcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9bnVsbDtyZXR1cm4gZD1udWxsIT09YyYmdm9pZCAwIT09Yz90aGlzLmFkZEF4aXMoYSxjLGIpOnRoaXMuYWRkTWVhc3VyZUF4aXMoYSxiKSxkLnNob3dQZXJjZW50PSEwLGR9LHRoaXMuYWRkU2VyaWVzPWZ1bmN0aW9uKGEsYyxkKXsobnVsbD09PWR8fHZvaWQgMD09PWQpJiYoZD10aGlzLmF4ZXMpLChudWxsPT09Y3x8dm9pZCAwPT09YykmJihjPWIucGxvdC5idWJibGUpO3ZhciBlLGY9bnVsbCxnPW51bGwsaD1udWxsLGk9bnVsbCxqPW51bGw7cmV0dXJuIGQuZm9yRWFjaChmdW5jdGlvbihhKXtudWxsIT09YSYmYy5zdXBwb3J0ZWRBeGVzLmluZGV4T2YoYS5wb3NpdGlvbik+LTEmJihudWxsPT09ZiYmIngiPT09YS5wb3NpdGlvblswXT9mPWE6bnVsbD09PWcmJiJ5Ij09PWEucG9zaXRpb25bMF0/Zz1hOm51bGw9PT1oJiYieiI9PT1hLnBvc2l0aW9uWzBdP2g9YTpudWxsPT09aSYmImMiPT09YS5wb3NpdGlvblswXT9pPWE6bnVsbD09PWkmJiJwIj09PWEucG9zaXRpb25bMF0mJihqPWEpKX0sdGhpcyksYSYmKGE9W10uY29uY2F0KGEpKSxlPW5ldyBiLnNlcmllcyh0aGlzLGEsZixnLGgsaSxqLGMsYi5hZ2dyZWdhdGVNZXRob2Quc3VtLGMuc3RhY2tlZCksdGhpcy5zZXJpZXMucHVzaChlKSxlfSx0aGlzLmFkZFRpbWVBeGlzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuYWRkQXhpcyhhLG51bGwsbnVsbCxiKTtyZXR1cm4gZS50aWNrRm9ybWF0PWQsZS5kYXRlUGFyc2VGb3JtYXQ9YyxlfSx0aGlzLmFzc2lnbkNsYXNzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2Fzc2lnbmVkQ2xhc3Nlc1thXT1iLHRoaXMuX2Fzc2lnbmVkQ2xhc3Nlc1thXX0sdGhpcy5hc3NpZ25Db2xvcj1mdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gdGhpcy5fYXNzaWduZWRDb2xvcnNbYV09bmV3IGIuY29sb3IoYyxkLGUpLHRoaXMuX2Fzc2lnbmVkQ29sb3JzW2FdfSx0aGlzLmN1c3RvbUNsYXNzTGlzdD17YXhpc0xpbmU6ImRpbXBsZS1jdXN0b20tYXhpcy1saW5lIixheGlzTGFiZWw6ImRpbXBsZS1jdXN0b20tYXhpcy1sYWJlbCIsYXhpc1RpdGxlOiJkaW1wbGUtY3VzdG9tLWF4aXMtdGl0bGUiLHRvb2x0aXBCb3g6ImRpbXBsZS1jdXN0b20tdG9vbHRpcC1ib3giLHRvb2x0aXBMYWJlbDoiZGltcGxlLWN1c3RvbS10b29sdGlwLWxhYmVsIixsaW5lTWFya2VyOiJkaW1wbGUtY3VzdG9tLWxpbmUtbWFya2VyIixsZWdlbmRMYWJlbDoiZGltcGxlLWN1c3RvbS1sZWdlbmQtbGFiZWwiLGxlZ2VuZEtleToiZGltcGxlLWN1c3RvbS1sZWdlbmQta2V5IixhcmVhU2VyaWVzOiJkaW1wbGUtY3VzdG9tLXNlcmllcy1hcmVhIixiYXJTZXJpZXM6ImRpbXBsZS1jdXN0b20tc2VyaWVzLWJhciIsYnViYmxlU2VyaWVzOiJkaW1wbGUtY3VzdG9tLXNlcmllcy1idWJibGUiLGxpbmVTZXJpZXM6ImRpbXBsZS1jdXN0b20tc2VyaWVzLWxpbmUiLHBpZVNlcmllczoiZGltcGxlLWN1c3RvbS1zZXJpZXMtcGllIixncmlkbGluZToiZGltcGxlLWN1c3RvbS1ncmlkbGluZSIsY29sb3JDbGFzc2VzOlsiZGltcGxlLWN1c3RvbS1mb3JtYXQtMSIsImRpbXBsZS1jdXN0b20tZm9ybWF0LTIiLCJkaW1wbGUtY3VzdG9tLWZvcm1hdC0zIiwiZGltcGxlLWN1c3RvbS1mb3JtYXQtNCIsImRpbXBsZS1jdXN0b20tZm9ybWF0LTUiLCJkaW1wbGUtY3VzdG9tLWZvcm1hdC02IiwiZGltcGxlLWN1c3RvbS1mb3JtYXQtNyIsImRpbXBsZS1jdXN0b20tZm9ybWF0LTgiLCJkaW1wbGUtY3VzdG9tLWZvcm1hdC05IiwiZGltcGxlLWN1c3RvbS1mb3JtYXQtMTAiXX0sdGhpcy5kZWZhdWx0Q29sb3JzPVtuZXcgYi5jb2xvcigiIzgwQjFEMyIpLG5ldyBiLmNvbG9yKCIjRkI4MDcyIiksbmV3IGIuY29sb3IoIiNGREI0NjIiKSxuZXcgYi5jb2xvcigiI0IzREU2OSIpLG5ldyBiLmNvbG9yKCIjRkZFRDZGIiksbmV3IGIuY29sb3IoIiNCQzgwQkQiKSxuZXcgYi5jb2xvcigiIzhERDNDNyIpLG5ldyBiLmNvbG9yKCIjQ0NFQkM1IiksbmV3IGIuY29sb3IoIiNGRkZGQjMiKSxuZXcgYi5jb2xvcigiI0JFQkFEQSIpLG5ldyBiLmNvbG9yKCIjRkNDREU1IiksbmV3IGIuY29sb3IoIiNEOUQ5RDkiKV0sdGhpcy5kcmF3PWZ1bmN0aW9uKGIsYyl7Yj1ifHwwO3ZhciBkLGUsZj1udWxsLGc9bnVsbCxoPSExLGk9ITEsaj10aGlzLl94UGl4ZWxzKCksaz10aGlzLl95UGl4ZWxzKCksbD10aGlzLl93aWR0aFBpeGVscygpLG09dGhpcy5faGVpZ2h0UGl4ZWxzKCk7cmV0dXJuKHZvaWQgMD09PWN8fG51bGw9PT1jfHxjPT09ITEpJiZ0aGlzLl9nZXRTZXJpZXNEYXRhKCksdGhpcy5heGVzLmZvckVhY2goZnVuY3Rpb24oYSl7YS5fc2NhbGU9bnVsbH0sdGhpcyksdGhpcy5heGVzLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYS5fbWluPTAsYS5fbWF4PTAsZT1bXSxhLl9oYXNNZWFzdXJlKCkpe3ZhciBiPSExO3RoaXMuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoYy5fZGVlcE1hdGNoKGEpKXt2YXIgZD1jLl9heGlzQm91bmRzKGEucG9zaXRpb24pO2EuX21pbj5kLm1pbiYmKGEuX21pbj1kLm1pbiksYS5fbWF4PGQubWF4JiYoYS5fbWF4PWQubWF4KSxiPSEwfX0sdGhpcyksYnx8dGhpcy5fZ2V0QWxsRGF0YSgpLmZvckVhY2goZnVuY3Rpb24oYil7YS5fbWluPmJbYS5tZWFzdXJlXSYmKGEuX21pbj1iW2EubWVhc3VyZV0pLGEuX21heDxiW2EubWVhc3VyZV0mJihhLl9tYXg9YlthLm1lYXN1cmVdKX0sdGhpcyl9ZWxzZSBhLl9oYXNUaW1lRmllbGQoKT8oYS5fbWluPW51bGwsYS5fbWF4PW51bGwsdGhpcy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihiKXtiLl9kZWVwTWF0Y2goYSkmJm51bGwhPT1iW2EucG9zaXRpb25dLnRpbWVGaWVsZCYmdm9pZCAwIT09YlthLnBvc2l0aW9uXS50aW1lRmllbGQmJi0xPT09ZS5pbmRleE9mKGJbYS5wb3NpdGlvbl0udGltZUZpZWxkKSYmZS5wdXNoKGJbYS5wb3NpdGlvbl0udGltZUZpZWxkKX0sdGhpcyksYS5fZ2V0QXhpc0RhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2UuZm9yRWFjaChmdW5jdGlvbihjKXt2YXIgZD1hLl9wYXJzZURhdGUoYltjXSk7KG51bGw9PT1hLl9taW58fGQ8YS5fbWluKSYmKGEuX21pbj1kKSwobnVsbD09PWEuX21heHx8ZD5hLl9tYXgpJiYoYS5fbWF4PWQpfSx0aGlzKX0sdGhpcykpOmEuX2hhc0NhdGVnb3JpZXMoKSYmKGEuX21pbj0wLGQ9W10sdGhpcy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihiKXtiLl9kZWVwTWF0Y2goYSkmJm51bGwhPT1iW2EucG9zaXRpb25dLmNhdGVnb3J5RmllbGRzWzBdJiZ2b2lkIDAhPT1iW2EucG9zaXRpb25dLmNhdGVnb3J5RmllbGRzWzBdJiYtMT09PWUuaW5kZXhPZihiW2EucG9zaXRpb25dLmNhdGVnb3J5RmllbGRzWzBdKSYmZS5wdXNoKGJbYS5wb3NpdGlvbl0uY2F0ZWdvcnlGaWVsZHNbMF0pfSx0aGlzKSxhLl9nZXRBeGlzRGF0YSgpLmZvckVhY2goZnVuY3Rpb24oYSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGIpey0xPT09ZC5pbmRleE9mKGFbYl0pJiZkLnB1c2goYVtiXSl9LHRoaXMpfSx0aGlzKSxhLl9tYXg9ZC5sZW5ndGgpO251bGwhPT1hLl9zbGF2ZXMmJnZvaWQgMCE9PWEuX3NsYXZlcyYmYS5fc2xhdmVzLmxlbmd0aD4wJiZhLl9zbGF2ZXMuZm9yRWFjaChmdW5jdGlvbihiKXtiLl9taW49YS5fbWluLGIuX21heD1hLl9tYXh9LHRoaXMpLGEuX3VwZGF0ZSgpLG51bGw9PT1mJiYieCI9PT1hLnBvc2l0aW9uP2Y9YTpudWxsPT09ZyYmInkiPT09YS5wb3NpdGlvbiYmKGc9YSl9LHRoaXMpLHRoaXMuYXhlcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPSExLGU9bnVsbCxuPTAsbz1udWxsLHA9ITEscT0wLHI9e2w6bnVsbCx0Om51bGwscjpudWxsLGI6bnVsbH0scz0wLHQ9MCx1PSIiLHY9dGhpcyx3PWZ1bmN0aW9uKGEpe3ZhciBjO3JldHVybiBjPW51bGw9PT1lfHwwPT09Ynx8ZD9hOnYuX2hhbmRsZVRyYW5zaXRpb24oYSxiLHYpfSx4PWZ1bmN0aW9uKCl7dmFyIGI9YS5zZWxlY3QodGhpcykuc2VsZWN0QWxsKCJ0ZXh0Iik7cmV0dXJuIWMubWVhc3VyZSYmYy5fbWF4PjAmJigieCI9PT1jLnBvc2l0aW9uP2IuYXR0cigieCIsbC9jLl9tYXgvMik6InkiPT09Yy5wb3NpdGlvbiYmYi5hdHRyKCJ5IiwtMSoobS9jLl9tYXgpLzIpKSxjLmNhdGVnb3J5RmllbGRzJiZjLmNhdGVnb3J5RmllbGRzLmxlbmd0aD4wJiYoYyE9PWZ8fG51bGwhPT1nLmNhdGVnb3J5RmllbGRzJiYwIT09Zy5jYXRlZ29yeUZpZWxkcy5sZW5ndGh8fGIuYXR0cigieSIsayttLWcuX3NjYWxlKDApKzkpLGMhPT1nfHxudWxsIT09Zi5jYXRlZ29yeUZpZWxkcyYmMCE9PWYuY2F0ZWdvcnlGaWVsZHMubGVuZ3RofHxiLmF0dHIoIngiLC0xKihmLl9zY2FsZSgwKS1qKS05KSksdGhpc30seT1mdW5jdGlvbihiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz1hLnNlbGVjdCh0aGlzKS5hdHRyKCJjbGFzcyIpfHwiIjtyZXR1cm4tMT09PWMuaW5kZXhPZihiKSYmKGMrPSIgIitiKSxjLnRyaW0oKX19O251bGw9PT1jLmdyaWRsaW5lU2hhcGVzPyhjLnNob3dHcmlkbGluZXN8fG51bGw9PT1jLnNob3dHcmlkbGluZXMmJiFjLl9oYXNDYXRlZ29yaWVzKCkmJighaCYmIngiPT09Yy5wb3NpdGlvbnx8IWkmJiJ5Ij09PWMucG9zaXRpb24pKSYmKGMuZ3JpZGxpbmVTaGFwZXM9dGhpcy5fZ3JvdXAuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJkaW1wbGUtZ3JpZGxpbmUiKSwieCI9PT1jLnBvc2l0aW9uP2g9ITA6aT0hMCk6IngiPT09Yy5wb3NpdGlvbj9oPSEwOmk9ITAsbnVsbD09PWMuc2hhcGVzJiYoYy5zaGFwZXM9dGhpcy5fZ3JvdXAuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJkaW1wbGUtYXhpcyBkaW1wbGUtYXhpcy0iK2MucG9zaXRpb24pLmVhY2goZnVuY3Rpb24oKXt2Lm5vRm9ybWF0c3x8YS5zZWxlY3QodGhpcykuc3R5bGUoImZvbnQtZmFtaWx5IixjLmZvbnRGYW1pbHkpLnN0eWxlKCJmb250LXNpemUiLGMuX2dldEZvbnRTaXplKCkpfSksZD0hMCksYz09PWYmJm51bGwhPT1nPyhlPSJ0cmFuc2xhdGUoMCwgIisobnVsbD09PWcuY2F0ZWdvcnlGaWVsZHN8fDA9PT1nLmNhdGVnb3J5RmllbGRzLmxlbmd0aD9nLl9zY2FsZSgwKTprK20pKyIpIixvPSJ0cmFuc2xhdGUoMCwgIisoYz09PWY/ayttOmspKyIpIixuPS1tKTpjPT09ZyYmbnVsbCE9PWY/KGU9InRyYW5zbGF0ZSgiKyhudWxsPT09Zi5jYXRlZ29yeUZpZWxkc3x8MD09PWYuY2F0ZWdvcnlGaWVsZHMubGVuZ3RoP2YuX3NjYWxlKDApOmopKyIsIDApIixvPSJ0cmFuc2xhdGUoIisoYz09PWc/ajpqK2wpKyIsIDApIixuPS1sKToieCI9PT1jLnBvc2l0aW9uPyhvPWU9InRyYW5zbGF0ZSgwLCAiKyhjPT09Zj9rK206aykrIikiLG49LW0pOiJ5Ij09PWMucG9zaXRpb24mJihvPWU9InRyYW5zbGF0ZSgiKyhjPT09Zz9qOmorbCkrIiwgMCkiLG49LWwpLG51bGwhPT1lJiZudWxsIT09Yy5fZHJhdyYmKGMuX2hhc1RpbWVGaWVsZCgpP3coYy5zaGFwZXMpLmNhbGwoYy5fZHJhdy50aWNrcyhjLl9nZXRUaW1lUGVyaW9kKCksYy50aW1lSW50ZXJ2YWwpLnRpY2tGb3JtYXQoYy5fZ2V0Rm9ybWF0KCkpKS5hdHRyKCJ0cmFuc2Zvcm0iLGUpLmVhY2goeCk6Yy51c2VMb2c/dyhjLnNoYXBlcykuY2FsbChjLl9kcmF3LnRpY2tzKDQsYy5fZ2V0Rm9ybWF0KCkpKS5hdHRyKCJ0cmFuc2Zvcm0iLGUpLmVhY2goeCk6dyhjLnNoYXBlcykuY2FsbChjLl9kcmF3LnRpY2tGb3JtYXQoYy5fZ2V0Rm9ybWF0KCkpKS5hdHRyKCJ0cmFuc2Zvcm0iLGUpLmVhY2goeCksbnVsbCE9PWMuZ3JpZGxpbmVTaGFwZXMmJncoYy5ncmlkbGluZVNoYXBlcykuY2FsbChjLl9kcmF3LnRpY2tTaXplKG4sMCwwKS50aWNrRm9ybWF0KCIiKSkuYXR0cigidHJhbnNmb3JtIixvKSksdyhjLnNoYXBlcy5zZWxlY3RBbGwoInRleHQiKSkuYXR0cigiY2xhc3MiLHkodi5jdXN0b21DbGFzc0xpc3QuYXhpc0xhYmVsKSkuY2FsbChmdW5jdGlvbigpe3Yubm9Gb3JtYXRzfHx0aGlzLnN0eWxlKCJmb250LWZhbWlseSIsYy5mb250RmFtaWx5KS5zdHlsZSgiZm9udC1zaXplIixjLl9nZXRGb250U2l6ZSgpKX0pLHcoYy5zaGFwZXMuc2VsZWN0QWxsKCJwYXRoLCBsaW5lIikpLmF0dHIoImNsYXNzIix5KHYuY3VzdG9tQ2xhc3NMaXN0LmF4aXNMaW5lKSkuY2FsbChmdW5jdGlvbigpe3Yubm9Gb3JtYXRzfHx0aGlzLnN0eWxlKCJmaWxsIiwibm9uZSIpLnN0eWxlKCJzdHJva2UiLCJibGFjayIpLnN0eWxlKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIil9KSxudWxsIT09Yy5ncmlkbGluZVNoYXBlcyYmdyhjLmdyaWRsaW5lU2hhcGVzLnNlbGVjdEFsbCgibGluZSIpKS5hdHRyKCJjbGFzcyIseSh2LmN1c3RvbUNsYXNzTGlzdC5ncmlkbGluZSkpLmNhbGwoZnVuY3Rpb24oKXt2Lm5vRm9ybWF0c3x8dGhpcy5zdHlsZSgiZmlsbCIsIm5vbmUiKS5zdHlsZSgic3Ryb2tlIiwibGlnaHRncmF5Iikuc3R5bGUoIm9wYWNpdHkiLC44KX0pLChudWxsPT09Yy5tZWFzdXJlfHx2b2lkIDA9PT1jLm1lYXN1cmUpJiYoYz09PWY/KHE9MCxjLnNoYXBlcy5zZWxlY3RBbGwoInRleHQiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDb21wdXRlZFRleHRMZW5ndGgoKTtxPWE+cT9hOnF9KSxxPmwvYy5zaGFwZXMuc2VsZWN0QWxsKCJ0ZXh0IilbMF0ubGVuZ3RoPyhwPSEwLGMuc2hhcGVzLnNlbGVjdEFsbCgidGV4dCIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsInN0YXJ0IikuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0QkJveCgpO2Euc2VsZWN0KHRoaXMpLmF0dHIoInRyYW5zZm9ybSIsInJvdGF0ZSg5MCwiK2IueCsiLCIrKGIueStiLmhlaWdodC8yKSsiKSB0cmFuc2xhdGUoLTUsIDApIil9KSk6KHA9ITEsYy5zaGFwZXMuc2VsZWN0QWxsKCJ0ZXh0Iikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigidHJhbnNmb3JtIiwiIikpKToieCI9PT1jLnBvc2l0aW9uJiYocT0wLGMuc2hhcGVzLnNlbGVjdEFsbCgidGV4dCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO3E9YT5xP2E6cX0pLHE+bC9jLnNoYXBlcy5zZWxlY3RBbGwoInRleHQiKVswXS5sZW5ndGg/KHA9ITAsYy5zaGFwZXMuc2VsZWN0QWxsKCJ0ZXh0Iikuc3R5bGUoInRleHQtYW5jaG9yIiwiZW5kIikuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0QkJveCgpO2Euc2VsZWN0KHRoaXMpLmF0dHIoInRyYW5zZm9ybSIsInJvdGF0ZSg5MCwiKyhiLngrYi53aWR0aCkrIiwiKyhiLnkrYi5oZWlnaHQvMikrIikgdHJhbnNsYXRlKDUsIDApIil9KSk6KHA9ITEsYy5zaGFwZXMuc2VsZWN0QWxsKCJ0ZXh0Iikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigidHJhbnNmb3JtIiwiIikpKSksbnVsbCE9PWMudGl0bGVTaGFwZSYmdm9pZCAwIT09Yy50aXRsZVNoYXBlJiZjLnRpdGxlU2hhcGUucmVtb3ZlKCksYy5zaGFwZXMuc2VsZWN0QWxsKCJ0ZXh0IikuZWFjaChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QkJveCgpOyhudWxsPT09ci5sfHwtOS1hLndpZHRoPHIubCkmJihyLmw9LTktYS53aWR0aCksKG51bGw9PT1yLnJ8fGEueCthLndpZHRoPnIucikmJihyLnI9YS54K2Eud2lkdGgpLHA/KChudWxsPT09ci50fHxhLnkrYS5oZWlnaHQtYS53aWR0aDxyLnQpJiYoci50PWEueSthLmhlaWdodC1hLndpZHRoKSwobnVsbD09PXIuYnx8YS5oZWlnaHQrYS53aWR0aD5yLmIpJiYoci5iPWEuaGVpZ2h0K2Eud2lkdGgpKTooKG51bGw9PT1yLnR8fGEueTxyLnQpJiYoci50PWEueSksKG51bGw9PT1yLmJ8fDkrYS5oZWlnaHQ+ci5iKSYmKHIuYj05K2EuaGVpZ2h0KSl9KSwieCI9PT1jLnBvc2l0aW9uPyh0PWM9PT1mP2srbStyLmIrNTprK3IudC0xMCxzPWorbC8yKToieSI9PT1jLnBvc2l0aW9uJiYocz1jPT09Zz9qK3IubC0xMDpqK2wrci5yKzIwLHQ9ayttLzIsdT0icm90YXRlKDI3MCwgIitzKyIsICIrdCsiKSIpLGMuaGlkZGVufHwieCIhPT1jLnBvc2l0aW9uJiYieSIhPT1jLnBvc2l0aW9ufHxudWxsPT09Yy50aXRsZXx8KGMudGl0bGVTaGFwZT10aGlzLl9ncm91cC5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsImRpbXBsZS1heGlzIGRpbXBsZS10aXRsZSAiK3YuY3VzdG9tQ2xhc3NMaXN0LmF4aXNUaXRsZSsiZGltcGxlLWF4aXMtIitjLnBvc2l0aW9uKSxjLnRpdGxlU2hhcGUuYXR0cigieCIscykuYXR0cigieSIsdCkuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ0cmFuc2Zvcm0iLHUpLnRleHQodm9pZCAwIT09Yy50aXRsZT9jLnRpdGxlOm51bGw9PT1jLmNhdGVnb3J5RmllbGRzfHx2b2lkIDA9PT1jLmNhdGVnb3J5RmllbGRzfHwwPT09Yy5jYXRlZ29yeUZpZWxkcy5sZW5ndGg/Yy5tZWFzdXJlOmMuY2F0ZWdvcnlGaWVsZHMuam9pbigiLyIpKS5lYWNoKGZ1bmN0aW9uKCl7di5ub0Zvcm1hdHN8fGEuc2VsZWN0KHRoaXMpLnN0eWxlKCJmb250LWZhbWlseSIsYy5mb250RmFtaWx5KS5zdHlsZSgiZm9udC1zaXplIixjLl9nZXRGb250U2l6ZSgpKX0pLGM9PT1mP2MudGl0bGVTaGFwZS5lYWNoKGZ1bmN0aW9uKCl7YS5zZWxlY3QodGhpcykuYXR0cigieSIsdCt0aGlzLmdldEJCb3goKS5oZWlnaHQvMS42NSl9KTpjPT09ZyYmYy50aXRsZVNoYXBlLmVhY2goZnVuY3Rpb24oKXthLnNlbGVjdCh0aGlzKS5hdHRyKCJ4IixzK3RoaXMuZ2V0QkJveCgpLmhlaWdodC8xLjY1KX0pKX0sdGhpcyksdGhpcy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLnBsb3QuZHJhdyh0aGlzLGEsYiksdGhpcy5fcmVnaXN0ZXJFdmVudEhhbmRsZXJzKGEpfSx0aGlzKSx0aGlzLmxlZ2VuZHMuZm9yRWFjaChmdW5jdGlvbihhKXthLl9kcmF3KCl9LHRoaXMpLHRoaXMuc3Rvcnlib2FyZCYmKHRoaXMuc3Rvcnlib2FyZC5fZHJhd1RleHQoKSx0aGlzLnN0b3J5Ym9hcmQuYXV0b3BsYXkmJnRoaXMuc3Rvcnlib2FyZC5zdGFydEFuaW1hdGlvbigpKSx0aGlzfSx0aGlzLmdldENsYXNzPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9hc3NpZ25lZENsYXNzZXNbYV18fCh0aGlzLl9hc3NpZ25lZENsYXNzZXNbYV09dGhpcy5jdXN0b21DbGFzc0xpc3QuY29sb3JDbGFzc2VzW3RoaXMuX25leHRDbGFzc10sdGhpcy5fbmV4dENsYXNzPSh0aGlzLl9uZXh0Q2xhc3MrMSkldGhpcy5jdXN0b21DbGFzc0xpc3QuY29sb3JDbGFzc2VzLmxlbmd0aCksdGhpcy5fYXNzaWduZWRDbGFzc2VzW2FdfSx0aGlzLmdldENvbG9yPWZ1bmN0aW9uKGEpe3JldHVybihudWxsPT09dGhpcy5fYXNzaWduZWRDb2xvcnNbYV18fHZvaWQgMD09PXRoaXMuX2Fzc2lnbmVkQ29sb3JzW2FdKSYmKHRoaXMuX2Fzc2lnbmVkQ29sb3JzW2FdPXRoaXMuZGVmYXVsdENvbG9yc1t0aGlzLl9uZXh0Q29sb3JdLHRoaXMuX25leHRDb2xvcj0odGhpcy5fbmV4dENvbG9yKzEpJXRoaXMuZGVmYXVsdENvbG9ycy5sZW5ndGgpLHRoaXMuX2Fzc2lnbmVkQ29sb3JzW2FdfSx0aGlzLnNldEJvdW5kcz1mdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gdGhpcy54PWEsdGhpcy55PWMsdGhpcy53aWR0aD1kLHRoaXMuaGVpZ2h0PWUsdGhpcy5feFBpeGVscz1mdW5jdGlvbigpe3JldHVybiBiLl9wYXJzZVhQb3NpdGlvbih0aGlzLngsdGhpcy5zdmcubm9kZSgpKX0sdGhpcy5kcmF3KDAsITApLHRoaXMuX3lQaXhlbHM9ZnVuY3Rpb24oKXtyZXR1cm4gYi5fcGFyc2VZUG9zaXRpb24odGhpcy55LHRoaXMuc3ZnLm5vZGUoKSl9LHRoaXMuX3dpZHRoUGl4ZWxzPWZ1bmN0aW9uKCl7cmV0dXJuIGIuX3BhcnNlWFBvc2l0aW9uKHRoaXMud2lkdGgsdGhpcy5zdmcubm9kZSgpKX0sdGhpcy5faGVpZ2h0UGl4ZWxzPWZ1bmN0aW9uKCl7cmV0dXJuIGIuX3BhcnNlWVBvc2l0aW9uKHRoaXMuaGVpZ2h0LHRoaXMuc3ZnLm5vZGUoKSl9LHRoaXN9LHRoaXMuc2V0TWFyZ2lucz1mdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gdGhpcy54PWEsdGhpcy55PWMsdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5feFBpeGVscz1mdW5jdGlvbigpe3JldHVybiBiLl9wYXJzZVhQb3NpdGlvbih0aGlzLngsdGhpcy5zdmcubm9kZSgpKX0sdGhpcy5feVBpeGVscz1mdW5jdGlvbigpe3JldHVybiBiLl9wYXJzZVlQb3NpdGlvbih0aGlzLnksdGhpcy5zdmcubm9kZSgpKX0sdGhpcy5fd2lkdGhQaXhlbHM9ZnVuY3Rpb24oKXtyZXR1cm4gYi5fcGFyZW50V2lkdGgodGhpcy5zdmcubm9kZSgpKS10aGlzLl94UGl4ZWxzKCktYi5fcGFyc2VYUG9zaXRpb24oZCx0aGlzLnN2Zy5ub2RlKCkpfSx0aGlzLl9oZWlnaHRQaXhlbHM9ZnVuY3Rpb24oKXtyZXR1cm4gYi5fcGFyZW50SGVpZ2h0KHRoaXMuc3ZnLm5vZGUoKSktdGhpcy5feVBpeGVscygpLWIuX3BhcnNlWVBvc2l0aW9uKGUsdGhpcy5zdmcubm9kZSgpKX0sdGhpcy5kcmF3KDAsITApLHRoaXN9LHRoaXMuc2V0U3Rvcnlib2FyZD1mdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLnN0b3J5Ym9hcmQ9bmV3IGIuc3Rvcnlib2FyZCh0aGlzLGEpLG51bGwhPT1jJiZ2b2lkIDAhPT1jJiYodGhpcy5zdG9yeWJvYXJkLm9uVGljaz1jKSx0aGlzLnN0b3J5Ym9hcmR9fSxiLmNvbG9yPWZ1bmN0aW9uKGIsYyxkKXt0aGlzLmZpbGw9Yix0aGlzLnN0cm9rZT1udWxsPT09Y3x8dm9pZCAwPT09Yz9hLnJnYihiKS5kYXJrZXIoLjUpLnRvU3RyaW5nKCk6Yyx0aGlzLm9wYWNpdHk9bnVsbD09PWR8fHZvaWQgMD09PWQ/Ljg6ZH0sYi5ldmVudEFyZ3M9ZnVuY3Rpb24oKXt0aGlzLnNlcmllc1ZhbHVlPW51bGwsdGhpcy54VmFsdWU9bnVsbCx0aGlzLnlWYWx1ZT1udWxsLHRoaXMuelZhbHVlPW51bGwsdGhpcy5wVmFsdWU9bnVsbCx0aGlzLmNvbG9yVmFsdWU9bnVsbCx0aGlzLmZyYW1lVmFsdWU9bnVsbCx0aGlzLnNlcmllc1NoYXBlcz1udWxsLHRoaXMuc2VsZWN0ZWRTaGFwZT1udWxsCn0sYi5sZWdlbmQ9ZnVuY3Rpb24oYyxkLGUsZixnLGgsaSl7dGhpcy5jaGFydD1jLHRoaXMuc2VyaWVzPWksdGhpcy54PWQsdGhpcy55PWUsdGhpcy53aWR0aD1mLHRoaXMuaGVpZ2h0PWcsdGhpcy5ob3Jpem9udGFsQWxpZ249aCx0aGlzLnNoYXBlcz1udWxsLHRoaXMuZm9udFNpemU9IjEwcHgiLHRoaXMuZm9udEZhbWlseT0ic2Fucy1zZXJpZiIsdGhpcy5fZHJhdz1mdW5jdGlvbigpe3ZhciBjLGQ9dGhpcy5fZ2V0RW50cmllcygpLGU9MCxmPTAsZz0wLGg9MCxpPTE1LGo9OSxrPXRoaXM7dGhpcy5zaGFwZXMmJnRoaXMuc2hhcGVzLnJlbW92ZSgpLGM9dGhpcy5jaGFydC5fZ3JvdXAuc2VsZWN0QWxsKCIuZGltcGxlLWRvbnQtc2VsZWN0LWFueSIpLmRhdGEoZCkuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oYSl7cmV0dXJuImRpbXBsZS1sZWdlbmQgIitiLl9jcmVhdGVDbGFzcyhhLmFnZ0ZpZWxkKX0pLmF0dHIoIm9wYWNpdHkiLDEpLGMuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKGEpe3JldHVybiJkaW1wbGUtbGVnZW5kIGRpbXBsZS1sZWdlbmQtdGV4dCAiK2IuX2NyZWF0ZUNsYXNzKGEuYWdnRmllbGQpKyIgIitrLmNoYXJ0LmN1c3RvbUNsYXNzTGlzdC5sZWdlbmRMYWJlbH0pLnRleHQoZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5fSkuY2FsbChmdW5jdGlvbigpe2suY2hhcnQubm9Gb3JtYXRzfHx0aGlzLnN0eWxlKCJmb250LWZhbWlseSIsay5mb250RmFtaWx5KS5zdHlsZSgiZm9udC1zaXplIixrLl9nZXRGb250U2l6ZSgpKS5zdHlsZSgic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpfSkuZWFjaChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QkJveCgpO2Eud2lkdGg+ZSYmKGU9YS53aWR0aCksYS5oZWlnaHQ+ZiYmKGY9YS5oZWlnaHQpfSksYy5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oYSl7cmV0dXJuImRpbXBsZS1sZWdlbmQgZGltcGxlLWxlZ2VuZC1rZXkgIitiLl9jcmVhdGVDbGFzcyhhLmFnZ0ZpZWxkKX0pLmF0dHIoImhlaWdodCIsaikuYXR0cigid2lkdGgiLGkpLGY9KGo+Zj9qOmYpKzIsZSs9aSsyMCxjLmVhY2goZnVuY3Rpb24oYyl7ZytlPmsuX3dpZHRoUGl4ZWxzKCkmJihnPTAsaCs9ZiksaD5rLl9oZWlnaHRQaXhlbHMoKT9hLnNlbGVjdCh0aGlzKS5yZW1vdmUoKTooYS5zZWxlY3QodGhpcykuc2VsZWN0KCJ0ZXh0IikuYXR0cigieCIsImxlZnQiPT09ay5ob3Jpem9udGFsQWxpZ24/ay5feFBpeGVscygpK2krNStnOmsuX3hQaXhlbHMoKSsoay5fd2lkdGhQaXhlbHMoKS1nLWUpK2krNSkuYXR0cigieSIsZnVuY3Rpb24oKXtyZXR1cm4gay5feVBpeGVscygpK2grdGhpcy5nZXRCQm94KCkuaGVpZ2h0LzEuNjV9KS5hdHRyKCJ3aWR0aCIsay5fd2lkdGhQaXhlbHMoKSkuYXR0cigiaGVpZ2h0IixrLl9oZWlnaHRQaXhlbHMoKSksYS5zZWxlY3QodGhpcykuc2VsZWN0KCJyZWN0IikuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKGEpe3JldHVybiJkaW1wbGUtbGVnZW5kIGRpbXBsZS1sZWdlbmQta2V5ICIrYi5fY3JlYXRlQ2xhc3MoYS5hZ2dGaWVsZCkrIiAiK2suY2hhcnQuY3VzdG9tQ2xhc3NMaXN0LmxlZ2VuZEtleSsiICIrYS5jc3N9KS5hdHRyKCJ4IiwibGVmdCI9PT1rLmhvcml6b250YWxBbGlnbj9rLl94UGl4ZWxzKCkrZzprLl94UGl4ZWxzKCkrKGsuX3dpZHRoUGl4ZWxzKCktZy1lKSkuYXR0cigieSIsay5feVBpeGVscygpK2gpLmF0dHIoImhlaWdodCIsaikuYXR0cigid2lkdGgiLGkpLmNhbGwoZnVuY3Rpb24oKXtrLmNoYXJ0Lm5vRm9ybWF0c3x8dGhpcy5zdHlsZSgiZmlsbCIsYy5maWxsKS5zdHlsZSgic3Ryb2tlIixjLnN0cm9rZSkuc3R5bGUoIm9wYWNpdHkiLGMub3BhY2l0eSkuc3R5bGUoInNoYXBlLXJlbmRlcmluZyIsImNyaXNwRWRnZXMiKX0pLGcrPWUpfSksdGhpcy5zaGFwZXM9Y30sdGhpcy5fZ2V0RW50cmllcz1mdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiB0aGlzLnNlcmllcyYmdGhpcy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgYz1iLl9wb3NpdGlvbkRhdGE7Yy5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkLGU9LTEsZj1iLnBsb3QuZ3JvdXBlZCYmIWIueC5faGFzQ2F0ZWdvcmllcygpJiYhYi55Ll9oYXNDYXRlZ29yaWVzKCkmJmMuYWdnRmllbGQubGVuZ3RoPDI/IkFsbCI6Yy5hZ2dGaWVsZC5zbGljZSgtMSlbMF07Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrPTEpaWYoYVtkXS5rZXk9PT1mKXtlPWQ7YnJlYWt9LTE9PT1lJiZiLmNoYXJ0Ll9hc3NpZ25lZENvbG9yc1tmXSYmKGEucHVzaCh7a2V5OmYsZmlsbDpiLmNoYXJ0Ll9hc3NpZ25lZENvbG9yc1tmXS5maWxsLHN0cm9rZTpiLmNoYXJ0Ll9hc3NpZ25lZENvbG9yc1tmXS5zdHJva2Usb3BhY2l0eTpiLmNoYXJ0Ll9hc3NpZ25lZENvbG9yc1tmXS5vcGFjaXR5LGNzczpiLmNoYXJ0Ll9hc3NpZ25lZENsYXNzZXNbZl0sc2VyaWVzOmIsYWdnRmllbGQ6Yy5hZ2dGaWVsZH0pLGU9YS5sZW5ndGgtMSl9KX0sdGhpcyksYX0sdGhpcy5fZ2V0Rm9udFNpemU9ZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gYT10aGlzLmZvbnRTaXplJiYiYXV0byIhPT10aGlzLmZvbnRTaXplLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKT9pc05hTih0aGlzLmZvbnRTaXplKT90aGlzLmZvbnRTaXplOnRoaXMuZm9udFNpemUrInB4IjoodGhpcy5jaGFydC5faGVpZ2h0UGl4ZWxzKCkvMzU+MTA/dGhpcy5jaGFydC5faGVpZ2h0UGl4ZWxzKCkvMzU6MTApKyJweCJ9LHRoaXMuX2hlaWdodFBpeGVscz1mdW5jdGlvbigpe3JldHVybiBiLl9wYXJzZVlQb3NpdGlvbih0aGlzLmhlaWdodCx0aGlzLmNoYXJ0LnN2Zy5ub2RlKCkpfSx0aGlzLl93aWR0aFBpeGVscz1mdW5jdGlvbigpe3JldHVybiBiLl9wYXJzZVhQb3NpdGlvbih0aGlzLndpZHRoLHRoaXMuY2hhcnQuc3ZnLm5vZGUoKSl9LHRoaXMuX3hQaXhlbHM9ZnVuY3Rpb24oKXtyZXR1cm4gYi5fcGFyc2VYUG9zaXRpb24odGhpcy54LHRoaXMuY2hhcnQuc3ZnLm5vZGUoKSl9LHRoaXMuX3lQaXhlbHM9ZnVuY3Rpb24oKXtyZXR1cm4gYi5fcGFyc2VZUG9zaXRpb24odGhpcy55LHRoaXMuY2hhcnQuc3ZnLm5vZGUoKSl9fSxiLnNlcmllcz1mdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxqKXt0aGlzLmNoYXJ0PWEsdGhpcy54PWMsdGhpcy55PWQsdGhpcy56PWUsdGhpcy5jPWYsdGhpcy5wPWcsdGhpcy5wbG90PWgsdGhpcy5jYXRlZ29yeUZpZWxkcz1iLHRoaXMuYWdncmVnYXRlPWksdGhpcy5zdGFja2VkPWosdGhpcy5iYXJHYXA9LjIsdGhpcy5jbHVzdGVyQmFyR2FwPS4xLHRoaXMubGluZVdlaWdodD0yLHRoaXMubGluZU1hcmtlcnM9ITEsdGhpcy5hZnRlckRyYXc9bnVsbCx0aGlzLmludGVycG9sYXRpb249ImxpbmVhciIsdGhpcy50b29sdGlwRm9udFNpemU9IjEwcHgiLHRoaXMudG9vbHRpcEZvbnRGYW1pbHk9InNhbnMtc2VyaWYiLHRoaXMucmFkaXVzPSJhdXRvIix0aGlzLl9ldmVudEhhbmRsZXJzPVtdLHRoaXMuX3Bvc2l0aW9uRGF0YT1bXSx0aGlzLl9vcmRlclJ1bGVzPVtdLHRoaXMuX2F4aXNCb3VuZHM9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9e21pbjowLG1heDowfSxmPW51bGwsZz1udWxsLGg9W10saT0wLGo9dGhpcy5fcG9zaXRpb25EYXRhO3JldHVybiJ4Ij09PWE/KGY9dGhpcy54LGc9dGhpcy55KToieSI9PT1hPyhmPXRoaXMueSxnPXRoaXMueCk6InoiPT09YT9mPXRoaXMuejoicCI9PT1hP2Y9dGhpcy5wOiJjIj09PWEmJihmPXRoaXMuYyksZi5zaG93UGVyY2VudD9qLmZvckVhY2goZnVuY3Rpb24oYSl7YVtmLnBvc2l0aW9uKyJCb3VuZCJdPGUubWluJiYoZS5taW49YVtmLnBvc2l0aW9uKyJCb3VuZCJdKSxhW2YucG9zaXRpb24rIkJvdW5kIl0+ZS5tYXgmJihlLm1heD1hW2YucG9zaXRpb24rIkJvdW5kIl0pfSx0aGlzKTpudWxsPT09Z3x8bnVsbD09PWcuY2F0ZWdvcnlGaWVsZHN8fDA9PT1nLmNhdGVnb3J5RmllbGRzLmxlbmd0aD9qLmZvckVhY2goZnVuY3Rpb24oYSl7IXRoaXMuX2lzU3RhY2tlZCgpfHwieCIhPT1mLnBvc2l0aW9uJiYieSIhPT1mLnBvc2l0aW9uPyhhW2YucG9zaXRpb24rIlZhbHVlIl08ZS5taW4mJihlLm1pbj1hW2YucG9zaXRpb24rIlZhbHVlIl0pLGFbZi5wb3NpdGlvbisiVmFsdWUiXT5lLm1heCYmKGUubWF4PWFbZi5wb3NpdGlvbisiVmFsdWUiXSkpOmFbZi5wb3NpdGlvbisiVmFsdWUiXTwwP2UubWluPWUubWluK2FbZi5wb3NpdGlvbisiVmFsdWUiXTplLm1heD1lLm1heCthW2YucG9zaXRpb24rIlZhbHVlIl19LHRoaXMpOihiPWYucG9zaXRpb24rIlZhbHVlIixjPWcucG9zaXRpb24rIkZpZWxkIixkPVtdLGouZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hW2NdLmpvaW4oIi8iKSxmPWQuaW5kZXhPZihlKTstMT09PWYmJihkLnB1c2goZSksZj1kLmxlbmd0aC0xKSx2b2lkIDA9PT1oW2ZdJiYoaFtmXT17bWluOjAsbWF4OjB9LGY+PWkmJihpPWYrMSkpLHRoaXMuc3RhY2tlZD9hW2JdPDA/aFtmXS5taW49aFtmXS5taW4rYVtiXTpoW2ZdLm1heD1oW2ZdLm1heCthW2JdOihhW2JdPGhbZl0ubWluJiYoaFtmXS5taW49YVtiXSksYVtiXT5oW2ZdLm1heCYmKGhbZl0ubWF4PWFbYl0pKX0sdGhpcyksaC5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEmJihhLm1pbjxlLm1pbiYmKGUubWluPWEubWluKSxhLm1heD5lLm1heCYmKGUubWF4PWEubWF4KSl9LHRoaXMpKSxlfSx0aGlzLl9kZWVwTWF0Y2g9ZnVuY3Rpb24oYSl7dmFyIGI9ITE7cmV0dXJuIHRoaXNbYS5wb3NpdGlvbl09PT1hP2I9ITA6dm9pZCAwIT09YS5fc2xhdmVzJiZudWxsIT09YS5fc2xhdmVzJiZhLl9zbGF2ZXMubGVuZ3RoPjAmJmEuX3NsYXZlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2I9Ynx8dGhpcy5fZGVlcE1hdGNoKGEpfSx0aGlzKSxifSx0aGlzLl9kcm9wTGluZU9yaWdpbj1mdW5jdGlvbigpe3ZhciBhPTAsYj0wLGM9e3g6bnVsbCx5Om51bGx9LGQ9e3g6bnVsbCx5Om51bGx9O3JldHVybiB0aGlzLmNoYXJ0LmF4ZXMuZm9yRWFjaChmdW5jdGlvbihhKXsieCI9PT1hLnBvc2l0aW9uJiZudWxsPT09ZC54P2QueD1hLl9oYXNUaW1lRmllbGQoKT90aGlzLmNoYXJ0Ll94UGl4ZWxzKCk6YS5fb3JpZ2luOiJ5Ij09PWEucG9zaXRpb24mJm51bGw9PT1kLnkmJihkLnk9YS5faGFzVGltZUZpZWxkKCk/dGhpcy5jaGFydC5feVBpeGVscygpK3RoaXMuY2hhcnQuX2hlaWdodFBpeGVscygpOmEuX29yaWdpbil9LHRoaXMpLHRoaXMuY2hhcnQuYXhlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJ4IiE9PWUucG9zaXRpb258fHRoaXMueC5oaWRkZW4/InkiIT09ZS5wb3NpdGlvbnx8dGhpcy55LmhpZGRlbnx8KHRoaXMuX2RlZXBNYXRjaChlKSYmKDA9PT1iP2MueD1kLng6MT09PWImJihjLng9dGhpcy5jaGFydC5feFBpeGVscygpK3RoaXMuY2hhcnQuX3dpZHRoUGl4ZWxzKCkpKSxiKz0xKToodGhpcy5fZGVlcE1hdGNoKGUpJiYoMD09PWE/Yy55PWQueToxPT09YSYmKGMueT10aGlzLmNoYXJ0Ll95UGl4ZWxzKCkpKSxhKz0xKX0sdGhpcyksY30sdGhpcy5fZ2V0VG9vbHRpcEZvbnRTaXplPWZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIGE9dGhpcy50b29sdGlwRm9udFNpemUmJiJhdXRvIiE9PXRoaXMudG9vbHRpcEZvbnRTaXplLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKT9pc05hTih0aGlzLnRvb2x0aXBGb250U2l6ZSk/dGhpcy50b29sdGlwRm9udFNpemU6dGhpcy50b29sdGlwRm9udFNpemUrInB4IjoodGhpcy5jaGFydC5faGVpZ2h0UGl4ZWxzKCkvMzU+MTA/dGhpcy5jaGFydC5faGVpZ2h0UGl4ZWxzKCkvMzU6MTApKyJweCJ9LHRoaXMuX2lzU3RhY2tlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YWNrZWQmJih0aGlzLnguX2hhc0NhdGVnb3JpZXMoKXx8dGhpcy55Ll9oYXNDYXRlZ29yaWVzKCkpfSx0aGlzLmFkZEV2ZW50SGFuZGxlcj1mdW5jdGlvbihhLGIpe3RoaXMuX2V2ZW50SGFuZGxlcnMucHVzaCh7ZXZlbnQ6YSxoYW5kbGVyOmJ9KX0sdGhpcy5hZGRPcmRlclJ1bGU9ZnVuY3Rpb24oYSxiKXt0aGlzLl9vcmRlclJ1bGVzLnB1c2goe29yZGVyaW5nOmEsZGVzYzpifSl9LHRoaXMuZ2V0VG9vbHRpcFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGI9W107cmV0dXJuIG51bGwhPT10aGlzLmNhdGVnb3J5RmllbGRzJiZ2b2lkIDAhPT10aGlzLmNhdGVnb3J5RmllbGRzJiZ0aGlzLmNhdGVnb3J5RmllbGRzLmxlbmd0aD4wJiZ0aGlzLmNhdGVnb3J5RmllbGRzLmZvckVhY2goZnVuY3Rpb24oYyxkKXtudWxsIT09YyYmdm9pZCAwIT09YyYmbnVsbCE9PWEuYWdnRmllbGRbZF0mJnZvaWQgMCE9PWEuYWdnRmllbGRbZF0mJmIucHVzaChjKyhhLmFnZ0ZpZWxkW2RdIT09Yz8iOiAiK2EuYWdnRmllbGRbZF06IiIpKX0sdGhpcyksdGhpcy5wPyh0aGlzLngmJnRoaXMueC5faGFzQ2F0ZWdvcmllcygpJiZ0aGlzLnguX2dldFRvb2x0aXBUZXh0KGIsYSksdGhpcy55JiZ0aGlzLnkuX2hhc0NhdGVnb3JpZXMoKSYmdGhpcy55Ll9nZXRUb29sdGlwVGV4dChiLGEpLHRoaXMueiYmdGhpcy56Ll9oYXNDYXRlZ29yaWVzKCkmJnRoaXMuei5fZ2V0VG9vbHRpcFRleHQoYixhKSx0aGlzLnAuX2dldFRvb2x0aXBUZXh0KGIsYSkpOih0aGlzLngmJnRoaXMueC5fZ2V0VG9vbHRpcFRleHQoYixhKSx0aGlzLnkmJnRoaXMueS5fZ2V0VG9vbHRpcFRleHQoYixhKSx0aGlzLnomJnRoaXMuei5fZ2V0VG9vbHRpcFRleHQoYixhKSksdGhpcy5jJiZ0aGlzLmMuX2dldFRvb2x0aXBUZXh0KGIsYSksYi5maWx0ZXIoZnVuY3Rpb24oYSxjKXtyZXR1cm4gYi5pbmRleE9mKGEpPT09Y30pfX0sYi5zdG9yeWJvYXJkPWZ1bmN0aW9uKGEsYil7bnVsbCE9PWImJnZvaWQgMCE9PWImJihiPVtdLmNvbmNhdChiKSksdGhpcy5jaGFydD1hLHRoaXMuY2F0ZWdvcnlGaWVsZHM9Yix0aGlzLmF1dG9wbGF5PSEwLHRoaXMuZnJhbWVEdXJhdGlvbj0zZTMsdGhpcy5zdG9yeUxhYmVsPW51bGwsdGhpcy5vblRpY2s9bnVsbCx0aGlzLmZvbnRTaXplPSIxMHB4Iix0aGlzLmZvbnRGYW1pbHk9InNhbnMtc2VyaWYiLHRoaXMuX2ZyYW1lPTAsdGhpcy5fYW5pbWF0aW9uVGltZXI9bnVsbCx0aGlzLl9jYXRlZ29yaWVzPVtdLHRoaXMuX2NhY2hlZENhdGVnb3J5RmllbGRzPVtdLHRoaXMuX29yZGVyUnVsZXM9W10sdGhpcy5fZHJhd1RleHQ9ZnVuY3Rpb24oKXtpZighdGhpcy5zdG9yeUxhYmVsKXt2YXIgYT10aGlzLmNoYXJ0LGI9dGhpcyxjPTA7dGhpcy5jaGFydC5heGVzLmZvckVhY2goZnVuY3Rpb24oYSl7IngiPT09YS5wb3NpdGlvbiYmKGMrPTEpfSx0aGlzKSx0aGlzLnN0b3J5TGFiZWw9dGhpcy5jaGFydC5fZ3JvdXAuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJkaW1wbGUtc3Rvcnlib2FyZC1sYWJlbCIpLmF0dHIoIm9wYWNpdHkiLDEpLmF0dHIoIngiLHRoaXMuY2hhcnQuX3hQaXhlbHMoKSsuMDEqdGhpcy5jaGFydC5fd2lkdGhQaXhlbHMoKSkuYXR0cigieSIsdGhpcy5jaGFydC5feVBpeGVscygpKyh0aGlzLmNoYXJ0Ll9oZWlnaHRQaXhlbHMoKS8zNT4xMD90aGlzLmNoYXJ0Ll9oZWlnaHRQaXhlbHMoKS8zNToxMCkqKGM+MT8xLjI1Oi0xKSkuY2FsbChmdW5jdGlvbigpe2Eubm9Gb3JtYXRzfHx0aGlzLnN0eWxlKCJmb250LWZhbWlseSIsYi5mb250RmFtaWx5KS5zdHlsZSgiZm9udC1zaXplIixiLl9nZXRGb250U2l6ZSgpKX0pfXRoaXMuc3RvcnlMYWJlbC50ZXh0KHRoaXMuY2F0ZWdvcnlGaWVsZHMuam9pbigiXFwiKSsiOiAiK3RoaXMuZ2V0RnJhbWVWYWx1ZSgpKX0sdGhpcy5fZ2V0Q2F0ZWdvcmllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYXRlZ29yeUZpZWxkcyE9PXRoaXMuX2NhY2hlZENhdGVnb3J5RmllbGRzJiYodGhpcy5fY2F0ZWdvcmllcz1bXSx0aGlzLmNoYXJ0Ll9nZXRBbGxEYXRhKCkuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj0tMSxjPSIiO251bGwhPT10aGlzLmNhdGVnb3J5RmllbGRzJiYodGhpcy5jYXRlZ29yeUZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGIsZCl7ZD4wJiYoYys9Ii8iKSxjKz1hW2JdfSx0aGlzKSxiPXRoaXMuX2NhdGVnb3JpZXMuaW5kZXhPZihjKSwtMT09PWImJih0aGlzLl9jYXRlZ29yaWVzLnB1c2goYyksYj10aGlzLl9jYXRlZ29yaWVzLmxlbmd0aC0xKSl9LHRoaXMpLHRoaXMuX2NhY2hlZENhdGVnb3J5RmllbGRzPXRoaXMuX2NhdGVnb3J5RmllbGRzKSx0aGlzLl9jYXRlZ29yaWVzfSx0aGlzLl9nZXRGb250U2l6ZT1mdW5jdGlvbigpe3ZhciBhO3JldHVybiBhPXRoaXMuZm9udFNpemUmJiJhdXRvIiE9PXRoaXMuZm9udFNpemUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpP2lzTmFOKHRoaXMuZm9udFNpemUpP3RoaXMuZm9udFNpemU6dGhpcy5mb250U2l6ZSsicHgiOih0aGlzLmNoYXJ0Ll9oZWlnaHRQaXhlbHMoKS8zNT4xMD90aGlzLmNoYXJ0Ll9oZWlnaHRQaXhlbHMoKS8zNToxMCkrInB4In0sdGhpcy5fZ29Ub0ZyYW1lSW5kZXg9ZnVuY3Rpb24oYSl7dGhpcy5fZnJhbWU9YSV0aGlzLl9nZXRDYXRlZ29yaWVzKCkubGVuZ3RoLHRoaXMuY2hhcnQuZHJhdyh0aGlzLmZyYW1lRHVyYXRpb24vMil9LHRoaXMuYWRkT3JkZXJSdWxlPWZ1bmN0aW9uKGEsYil7dGhpcy5fb3JkZXJSdWxlcy5wdXNoKHtvcmRlcmluZzphLGRlc2M6Yn0pfSx0aGlzLmdldEZyYW1lVmFsdWU9ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3JldHVybiB0aGlzLl9mcmFtZT49MCYmdGhpcy5fZ2V0Q2F0ZWdvcmllcygpLmxlbmd0aD50aGlzLl9mcmFtZSYmKGE9dGhpcy5fZ2V0Q2F0ZWdvcmllcygpW3RoaXMuX2ZyYW1lXSksYX0sdGhpcy5nb1RvRnJhbWU9ZnVuY3Rpb24oYSl7aWYodGhpcy5fZ2V0Q2F0ZWdvcmllcygpLmxlbmd0aD4wKXt2YXIgYj10aGlzLl9nZXRDYXRlZ29yaWVzKCkuaW5kZXhPZihhKTt0aGlzLl9nb1RvRnJhbWVJbmRleChiKX19LHRoaXMucGF1c2VBbmltYXRpb249ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fYW5pbWF0aW9uVGltZXImJih3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9hbmltYXRpb25UaW1lciksdGhpcy5fYW5pbWF0aW9uVGltZXI9bnVsbCl9LHRoaXMuc3RhcnRBbmltYXRpb249ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5fYW5pbWF0aW9uVGltZXImJihudWxsIT09dGhpcy5vblRpY2smJnRoaXMub25UaWNrKHRoaXMuZ2V0RnJhbWVWYWx1ZSgpKSx0aGlzLl9hbmltYXRpb25UaW1lcj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7YS5fZ29Ub0ZyYW1lSW5kZXgoYS5fZnJhbWUrMSksbnVsbCE9PWEub25UaWNrJiZhLm9uVGljayhhLmdldEZyYW1lVmFsdWUoKSksYS5fZHJhd1RleHQoYS5mcmFtZUR1cmF0aW9uLzIpfX0odGhpcyksdGhpcy5mcmFtZUR1cmF0aW9uKSl9LHRoaXMuc3RvcEFuaW1hdGlvbj1mdW5jdGlvbigpe251bGwhPT10aGlzLl9hbmltYXRpb25UaW1lciYmKHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX2FuaW1hdGlvblRpbWVyKSx0aGlzLl9hbmltYXRpb25UaW1lcj1udWxsLHRoaXMuX2ZyYW1lPTApfX0sYi5hZ2dyZWdhdGVNZXRob2QuYXZnPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEudmFsdWU9bnVsbD09PWEudmFsdWV8fHZvaWQgMD09PWEudmFsdWU/MDpwYXJzZUZsb2F0KGEudmFsdWUpLGEuY291bnQ9bnVsbD09PWEuY291bnR8fHZvaWQgMD09PWEuY291bnQ/MTpwYXJzZUZsb2F0KGEuY291bnQpLGIudmFsdWU9bnVsbD09PWIudmFsdWV8fHZvaWQgMD09PWIudmFsdWU/MDpwYXJzZUZsb2F0KGIudmFsdWUpLGIuY291bnQ9bnVsbD09PWIuY291bnR8fHZvaWQgMD09PWIuY291bnQ/MTpwYXJzZUZsb2F0KGIuY291bnQpLChhLnZhbHVlKmEuY291bnQrYi52YWx1ZSpiLmNvdW50KS8oYS5jb3VudCtiLmNvdW50KX0sYi5hZ2dyZWdhdGVNZXRob2QuY291bnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jb3VudD1udWxsPT09YS5jb3VudHx8dm9pZCAwPT09YS5jb3VudD8wOnBhcnNlRmxvYXQoYS5jb3VudCksYi5jb3VudD1udWxsPT09Yi5jb3VudHx8dm9pZCAwPT09Yi5jb3VudD8wOnBhcnNlRmxvYXQoYi5jb3VudCksYS5jb3VudCtiLmNvdW50fSxiLmFnZ3JlZ2F0ZU1ldGhvZC5tYXg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS52YWx1ZT1udWxsPT09YS52YWx1ZXx8dm9pZCAwPT09YS52YWx1ZT8wOnBhcnNlRmxvYXQoYS52YWx1ZSksYi52YWx1ZT1udWxsPT09Yi52YWx1ZXx8dm9pZCAwPT09Yi52YWx1ZT8wOnBhcnNlRmxvYXQoYi52YWx1ZSksYS52YWx1ZT5iLnZhbHVlP2EudmFsdWU6Yi52YWx1ZX0sYi5hZ2dyZWdhdGVNZXRob2QubWluPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PT1hLnZhbHVlP3BhcnNlRmxvYXQoYi52YWx1ZSk6cGFyc2VGbG9hdChhLnZhbHVlKTxwYXJzZUZsb2F0KGIudmFsdWUpP3BhcnNlRmxvYXQoYS52YWx1ZSk6cGFyc2VGbG9hdChiLnZhbHVlKX0sYi5hZ2dyZWdhdGVNZXRob2Quc3VtPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEudmFsdWU9bnVsbD09PWEudmFsdWV8fHZvaWQgMD09PWEudmFsdWU/MDpwYXJzZUZsb2F0KGEudmFsdWUpLGIudmFsdWU9bnVsbD09PWIudmFsdWV8fHZvaWQgMD09PWIudmFsdWU/MDpwYXJzZUZsb2F0KGIudmFsdWUpLGEudmFsdWUrYi52YWx1ZX0sYi5wbG90LmFyZWE9e3N0YWNrZWQ6ITAsZ3JvdXBlZDohMCxzdXBwb3J0ZWRBeGVzOlsieCIsInkiLCJjIl0sZHJhdzpmdW5jdGlvbihjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHUsdix3LHgseSx6LEEsQj1kLl9wb3NpdGlvbkRhdGEsQz1bXSxEPW51bGwsRT0iZGltcGxlLXNlcmllcy0iK2Muc2VyaWVzLmluZGV4T2YoZCksRj1kLnguX2hhc0NhdGVnb3JpZXMoKXx8ZC55Ll9oYXNDYXRlZ29yaWVzKCk/MDoxLEc9ITEsSD17fSxJPVtdLEo9W10sSz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihjLGQsZSxmKXthLnNlbGVjdChkKS5zdHlsZSgib3BhY2l0eSIsMSksYi5fc2hvd1BvaW50VG9vbHRpcChjLGQsZSxmKX19LEw9ZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQsZSxmLGcpe2Euc2VsZWN0KGUpLnN0eWxlKCJvcGFjaXR5IixnLmxpbmVNYXJrZXJzfHxjLmRhdGEubGVuZ3RoPDI/Yi5faGVscGVycy5vcGFjaXR5KGQsZixnKTowKSxiLl9yZW1vdmVUb29sdGlwKGQsZSxmLGcpfX0sTT1mdW5jdGlvbihhKXtiLl9kcmF3TWFya2VycyhhLGMsZCxlLEUsRyxLKGEpLEwoYSkpfSxOPWZ1bmN0aW9uKGEsZSl7dmFyIGY7cmV0dXJuInN0ZXAiPT09ZC5pbnRlcnBvbGF0aW9uJiZkW2FdLl9oYXNDYXRlZ29yaWVzKCk/KGY9Yi5faGVscGVyc1thXShlLGMsZCkrKCJ5Ij09PWE/Yi5faGVscGVycy5oZWlnaHQoZSxjLGQpOjApLGRbYV0uY2F0ZWdvcnlGaWVsZHMubGVuZ3RoPDImJihmKz0oInkiPT09YT8xOi0xKSpiLl9oZWxwZXJzW2ErIkdhcCJdKGMsZCkpKTpmPWIuX2hlbHBlcnNbImMiK2FdKGUsYyxkKSxwYXJzZUZsb2F0KGYpfSxPPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuc3ZnLmxpbmUoKS54KGZ1bmN0aW9uKGEpe3JldHVybiBkLnguX2hhc0NhdGVnb3JpZXMoKXx8IWM/YS54OmQueFtjXX0pLnkoZnVuY3Rpb24oYSl7cmV0dXJuIGQueS5faGFzQ2F0ZWdvcmllcygpfHwhYz9hLnk6ZC55W2NdfSkuaW50ZXJwb2xhdGUoYil9LFA9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gcGFyc2VGbG9hdChhKS1wYXJzZUZsb2F0KGIpfSxRPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHBhcnNlRmxvYXQoYS54KS1wYXJzZUZsb2F0KGIueCl9LFI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1iW2IubGVuZ3RoLTFdLGc9OTk5OSxoPWY7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrPTEpKGFbZF0ueCE9PWYueHx8YVtkXS55IT09Zi55KSYmKGU9MTgwLU1hdGguYXRhbjIoYVtkXS54LWYueCxhW2RdLnktZi55KSooMTgwL01hdGguUEkpLGU+YyYmZz5lJiYoaD1hW2RdLGc9ZSkpO3JldHVybiBiLnB1c2goaCksZ307Zm9yKGY9InN0ZXAiPT09ZC5pbnRlcnBvbGF0aW9uPyJzdGVwLWFmdGVyIjpkLmludGVycG9sYXRpb24sbz1iLl9nZXRTZXJpZXNPcmRlcihkLmRhdGF8fGMuZGF0YSxkKSxkLmMmJihkLnguX2hhc0NhdGVnb3JpZXMoKSYmZC55Ll9oYXNNZWFzdXJlKCl8fGQueS5faGFzQ2F0ZWdvcmllcygpJiZkLnguX2hhc01lYXN1cmUoKSkmJihHPSEwKSxkLnguX2hhc0NhdGVnb3JpZXMoKT8oej0ieCIsQT0ieSIpOmQueS5faGFzQ2F0ZWdvcmllcygpJiYoej0ieSIsQT0ieCIpLGc9MDtnPEIubGVuZ3RoO2crPTEpe2ZvcihqPVtdLGw9LTEsaT1GO2k8QltnXS5hZ2dGaWVsZC5sZW5ndGg7aSs9MSlqLnB1c2goQltnXS5hZ2dGaWVsZFtpXSk7Zm9yKGs9Yi5fY3JlYXRlQ2xhc3MoaiksaT0wO2k8Qy5sZW5ndGg7aSs9MSlpZihDW2ldLmtleVN0cmluZz09PWspe2w9aTticmVha30tMT09PWwmJihsPUMubGVuZ3RoLEMucHVzaCh7a2V5Omosa2V5U3RyaW5nOmssY29sb3I6IndoaXRlIixkYXRhOltdLHBvaW50czpbXSxhcmVhOnt9LGVudHJ5Ont9LGV4aXQ6e30sZ3JvdXA6eiYmQltnXVt6KyJGaWVsZCJdJiZCW2ddW3orIkZpZWxkIl0ubGVuZ3RoPj0yP0JbZ11beisiRmllbGQiXVswXToiQWxsIn0pKSxDW2xdLmRhdGEucHVzaChCW2ddKX1mb3IobyYmQy5zb3J0KGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGIuX2FycmF5SW5kZXhDb21wYXJlKG8sYS5rZXksYy5rZXkpfSksZz0wO2c8Qy5sZW5ndGg7Zys9MSl7Zm9yKENbZ10uZGF0YS5zb3J0KGIuX2dldFNlcmllc1NvcnRQcmVkaWNhdGUoYyxkLG8pKSxoPTA7aDxDW2ddLmRhdGEubGVuZ3RoO2grPTEpQ1tnXS5wb2ludHMucHVzaCh7eDpOKCJ4IixDW2ddLmRhdGFbaF0pLHk6TigieSIsQ1tnXS5kYXRhW2hdKX0pLHomJihIW0NbZ10uZ3JvdXBdfHwoSFtDW2ddLmdyb3VwXT17fSksSFtDW2ddLmdyb3VwXVtDW2ddLnBvaW50c1tDW2ddLnBvaW50cy5sZW5ndGgtMV1bel1dPWRbQV0uX29yaWdpbik7cD1DW2ddLnBvaW50cywic3RlcCI9PT1kLmludGVycG9sYXRpb24mJnAubGVuZ3RoPjEmJnomJihkLnguX2hhc0NhdGVnb3JpZXMoKT8ocC5wdXNoKHt4OjIqcFtwLmxlbmd0aC0xXS54LXBbcC5sZW5ndGgtMl0ueCx5OnBbcC5sZW5ndGgtMV0ueX0pLEhbQ1tnXS5ncm91cF1bcFtwLmxlbmd0aC0xXVt6XV09ZFtBXS5fb3JpZ2luKTpkLnkuX2hhc0NhdGVnb3JpZXMoKSYmKHA9W3t4OnBbMF0ueCx5OjIqcFswXS55LXBbMV0ueX1dLmNvbmNhdChwKSxIW0NbZ10uZ3JvdXBdW3BbMF1bel1dPWRbQV0uX29yaWdpbixDW2ddLnBvaW50cz1wKSl9Zm9yKHMgaW4gSClpZihILmhhc093blByb3BlcnR5KHMpKXtJW3NdPVtdO2Zvcih0IGluIEhbc10pSFtzXS5oYXNPd25Qcm9wZXJ0eSh0KSYmSVtzXS5wdXNoKHBhcnNlRmxvYXQodCkpO0lbc10uc29ydChQKX1mb3IoZz0wO2c8Qy5sZW5ndGg7Zys9MSl7aWYocD1DW2ddLnBvaW50cyx1PUNbZ10uZ3JvdXAscT1bXSxKPVtdLEcmJmIuX2FkZEdyYWRpZW50KENbZ10ua2V5LCJmaWxsLWFyZWEtZ3JhZGllbnQtIitDW2ddLmtleVN0cmluZyxkLnguX2hhc0NhdGVnb3JpZXMoKT9kLng6ZC55LEIsYyxlLCJmaWxsIiksSVt1XSYmSVt1XS5sZW5ndGg+MClmb3IoaD0wLGk9MDtoPElbdV0ubGVuZ3RoO2grPTEpSVt1XVtoXT49cFswXVt6XSYmSVt1XVtoXTw9cFtwLmxlbmd0aC0xXVt6XSYmKHI9e30sclt6XT1JW3VdW2hdLHJbQV09SFt1XVtJW3VdW2hdXSxxLnB1c2gocikscFtpXVt6XT5JW3VdW2hdP0oucHVzaChyKTooSi5wdXNoKHBbaV0pLEhbQ1tnXS5ncm91cF1bSVt1XVtoXV09cFtpXVtBXSxpKz0xKSk7ZWxzZSBpZihkLl9vcmRlclJ1bGVzJiZkLl9vcmRlclJ1bGVzLmxlbmd0aD4wKUo9cC5jb25jYXQocFswXSk7ZWxzZXtwPXAuc29ydChRKSxKLnB1c2gocFswXSkseT0wO2RvIHk9UihwLEoseSk7d2hpbGUoSi5sZW5ndGg8PXAubGVuZ3RoJiYoSlswXS54IT09SltKLmxlbmd0aC0xXS54fHxKWzBdLnkhPT1KW0oubGVuZ3RoLTFdLnkpKX1xPXEucmV2ZXJzZSgpLHY9TyhmLCJfcHJldmlvdXNPcmlnaW4iKShKKSx3PU8oInN0ZXAtYWZ0ZXIiPT09Zj8ic3RlcC1iZWZvcmUiOiJzdGVwLWJlZm9yZSI9PT1mPyJzdGVwLWFmdGVyIjpmLCJfcHJldmlvdXNPcmlnaW4iKShxKSx4PU8oImxpbmVhciIsIl9wcmV2aW91c09yaWdpbiIpKEopLENbZ10uZW50cnk9disodyYmdy5sZW5ndGg+MD8iTCIrdy5zdWJzdHJpbmcoMSk6IiIpKyh4JiZ4Lmxlbmd0aD4wPyJMIit4LnN1YnN0cmluZygxLHguaW5kZXhPZigiTCIpKTowKSx2PU8oZikoSiksdz1PKCJzdGVwLWFmdGVyIj09PWY/InN0ZXAtYmVmb3JlIjoic3RlcC1iZWZvcmUiPT09Zj8ic3RlcC1hZnRlciI6ZikocSkseD1PKCJsaW5lYXIiKShKKSxDW2ddLnVwZGF0ZT12Kyh3JiZ3Lmxlbmd0aD4wPyJMIit3LnN1YnN0cmluZygxKToiIikrKHgmJngubGVuZ3RoPjA/IkwiK3guc3Vic3RyaW5nKDEseC5pbmRleE9mKCJMIikpOjApLHY9TyhmLCJfb3JpZ2luIikoSiksdz1PKCJzdGVwLWFmdGVyIj09PWY/InN0ZXAtYmVmb3JlIjoic3RlcC1iZWZvcmUiPT09Zj8ic3RlcC1hZnRlciI6ZiwiX29yaWdpbiIpKHEpLHg9TygibGluZWFyIiwiX29yaWdpbiIpKEopLENbZ10uZXhpdD12Kyh3JiZ3Lmxlbmd0aD4wPyJMIit3LnN1YnN0cmluZygxKToiIikrKHgmJngubGVuZ3RoPjA/IkwiK3guc3Vic3RyaW5nKDEseC5pbmRleE9mKCJMIikpOjApLENbZ10uY29sb3I9Yy5nZXRDb2xvcihDW2ddLmtleS5sZW5ndGg+MD9DW2ddLmtleVtDW2ddLmtleS5sZW5ndGgtMV06IkFsbCIpLENbZ10uY3NzPWMuZ2V0Q2xhc3MoQ1tnXS5rZXkubGVuZ3RoPjA/Q1tnXS5rZXlbQ1tnXS5rZXkubGVuZ3RoLTFdOiJBbGwiKX1udWxsIT09Yy5fdG9vbHRpcEdyb3VwJiZ2b2lkIDAhPT1jLl90b29sdGlwR3JvdXAmJmMuX3Rvb2x0aXBHcm91cC5yZW1vdmUoKSxEPW51bGw9PT1kLnNoYXBlc3x8dm9pZCAwPT09ZC5zaGFwZXM/Yy5fZ3JvdXAuc2VsZWN0QWxsKCIuIitFKS5kYXRhKEMpOmQuc2hhcGVzLmRhdGEoQyxmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9KSxELmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiaWQiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmtleX0pLmF0dHIoImNsYXNzIixmdW5jdGlvbihhKXtyZXR1cm4gRSsiIGRpbXBsZS1saW5lICIrYS5rZXlTdHJpbmcrIiAiK2MuY3VzdG9tQ2xhc3NMaXN0LmFyZWFTZXJpZXMrIiAiK2EuY3NzfSkuYXR0cigiZCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZW50cnl9KS5jYWxsKGZ1bmN0aW9uKCl7Yy5ub0Zvcm1hdHN8fHRoaXMuYXR0cigib3BhY2l0eSIsZnVuY3Rpb24oYSl7cmV0dXJuIEc/MTphLmNvbG9yLm9wYWNpdHl9KS5hdHRyKCJmaWxsIixmdW5jdGlvbihhKXtyZXR1cm4gRz8idXJsKCNmaWxsLWFyZWEtZ3JhZGllbnQtIithLmtleVN0cmluZysiKSI6YS5jb2xvci5maWxsfSkuYXR0cigic3Ryb2tlIixmdW5jdGlvbihhKXtyZXR1cm4gRz8idXJsKCNzdHJva2UtYXJlYS1ncmFkaWVudC0iK2Eua2V5U3RyaW5nKyIpIjphLmNvbG9yLnN0cm9rZX0pLmF0dHIoInN0cm9rZS13aWR0aCIsZC5saW5lV2VpZ2h0KX0pLmVhY2goZnVuY3Rpb24oYSl7YS5tYXJrZXJEYXRhPWEuZGF0YSxNKGEpfSksbT1jLl9oYW5kbGVUcmFuc2l0aW9uKEQsZSxjKS5hdHRyKCJkIixmdW5jdGlvbihhKXtyZXR1cm4gYS51cGRhdGV9KS5lYWNoKGZ1bmN0aW9uKGEpe2EubWFya2VyRGF0YT1hLmRhdGEsTShhKX0pLG49Yy5faGFuZGxlVHJhbnNpdGlvbihELmV4aXQoKSxlLGMpLmF0dHIoImQiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmV4aXR9KS5lYWNoKGZ1bmN0aW9uKGEpe2EubWFya2VyRGF0YT1bXSxNKGEpfSksYi5fcG9zdERyYXdIYW5kbGluZyhkLG0sbixlKSxkLnNoYXBlcz1EfX0sYi5wbG90LmJhcj17c3RhY2tlZDohMCxncm91cGVkOiExLHN1cHBvcnRlZEF4ZXM6WyJ4IiwieSIsImMiXSxkcmF3OmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxmLGc9Yy5fcG9zaXRpb25EYXRhLGg9bnVsbCxpPVsiZGltcGxlLXNlcmllcy0iK2Euc2VyaWVzLmluZGV4T2YoYyksImRpbXBsZS1iYXIiXSxqPSFjLl9pc1N0YWNrZWQoKSYmYy54Ll9oYXNNZWFzdXJlKCksaz0hYy5faXNTdGFja2VkKCkmJmMueS5faGFzTWVhc3VyZSgpLGw9Im5vbmUiO2MueC5faGFzQ2F0ZWdvcmllcygpJiZjLnkuX2hhc0NhdGVnb3JpZXMoKT9sPSJib3RoIjpjLnguX2hhc0NhdGVnb3JpZXMoKT9sPSJ4IjpjLnkuX2hhc0NhdGVnb3JpZXMoKSYmKGw9InkiKSxudWxsIT09YS5fdG9vbHRpcEdyb3VwJiZ2b2lkIDAhPT1hLl90b29sdGlwR3JvdXAmJmEuX3Rvb2x0aXBHcm91cC5yZW1vdmUoKSxoPW51bGw9PT1jLnNoYXBlc3x8dm9pZCAwPT09Yy5zaGFwZXM/YS5fZ3JvdXAuc2VsZWN0QWxsKCIuIitpLmpvaW4oIi4iKSkuZGF0YShnKTpjLnNoYXBlcy5kYXRhKGcsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5fSksaC5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImlkIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9KS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oYyl7dmFyIGQ9W107cmV0dXJuIGQ9ZC5jb25jYXQoYy5hZ2dGaWVsZCksZD1kLmNvbmNhdChjLnhGaWVsZCksZD1kLmNvbmNhdChjLnlGaWVsZCksaS5qb2luKCIgIikrIiAiK2IuX2NyZWF0ZUNsYXNzKGQpKyIgIithLmN1c3RvbUNsYXNzTGlzdC5iYXJTZXJpZXMrIiAiK2IuX2hlbHBlcnMuY3NzKGMsYSl9KS5hdHRyKCJ4IixmdW5jdGlvbihkKXt2YXIgZT1jLnguX3ByZXZpb3VzT3JpZ2luO3JldHVybiJ4Ij09PWw/ZT1iLl9oZWxwZXJzLngoZCxhLGMpOiJib3RoIj09PWwmJihlPWIuX2hlbHBlcnMuY3goZCxhLGMpKSxlfSkuYXR0cigieSIsZnVuY3Rpb24oZCl7dmFyIGU9Yy55Ll9wcmV2aW91c09yaWdpbjtyZXR1cm4ieSI9PT1sP2U9Yi5faGVscGVycy55KGQsYSxjKToiYm90aCI9PT1sJiYoZT1iLl9oZWxwZXJzLmN5KGQsYSxjKSksZX0pLmF0dHIoIndpZHRoIixmdW5jdGlvbihkKXtyZXR1cm4ieCI9PT1sP2IuX2hlbHBlcnMud2lkdGgoZCxhLGMpOjB9KS5hdHRyKCJoZWlnaHQiLGZ1bmN0aW9uKGQpe3JldHVybiJ5Ij09PWw/Yi5faGVscGVycy5oZWlnaHQoZCxhLGMpOjB9KS5hdHRyKCJvcGFjaXR5IixmdW5jdGlvbihkKXtyZXR1cm4gYi5faGVscGVycy5vcGFjaXR5KGQsYSxjKX0pLm9uKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKGQpe2IuX3Nob3dCYXJUb29sdGlwKGQsdGhpcyxhLGMpfSkub24oIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKGQpe2IuX3JlbW92ZVRvb2x0aXAoZCx0aGlzLGEsYyl9KS5jYWxsKGZ1bmN0aW9uKCl7YS5ub0Zvcm1hdHN8fHRoaXMuYXR0cigiZmlsbCIsZnVuY3Rpb24oZCl7cmV0dXJuIGIuX2hlbHBlcnMuZmlsbChkLGEsYyl9KS5hdHRyKCJzdHJva2UiLGZ1bmN0aW9uKGQpe3JldHVybiBiLl9oZWxwZXJzLnN0cm9rZShkLGEsYyl9KX0pLGU9YS5faGFuZGxlVHJhbnNpdGlvbihoLGQsYSxjKS5hdHRyKCJ4IixmdW5jdGlvbihkKXtyZXR1cm4gaj9iLl9oZWxwZXJzLmN4KGQsYSxjKS1jLnguZmxvYXRpbmdCYXJXaWR0aC8yOmIuX2hlbHBlcnMueChkLGEsYyl9KS5hdHRyKCJ5IixmdW5jdGlvbihkKXtyZXR1cm4gaz9iLl9oZWxwZXJzLmN5KGQsYSxjKS1jLnkuZmxvYXRpbmdCYXJXaWR0aC8yOmIuX2hlbHBlcnMueShkLGEsYyl9KS5hdHRyKCJ3aWR0aCIsZnVuY3Rpb24oZCl7cmV0dXJuIGo/Yy54LmZsb2F0aW5nQmFyV2lkdGg6Yi5faGVscGVycy53aWR0aChkLGEsYyl9KS5hdHRyKCJoZWlnaHQiLGZ1bmN0aW9uKGQpe3JldHVybiBrP2MueS5mbG9hdGluZ0JhcldpZHRoOmIuX2hlbHBlcnMuaGVpZ2h0KGQsYSxjKX0pLmNhbGwoZnVuY3Rpb24oKXthLm5vRm9ybWF0c3x8dGhpcy5hdHRyKCJmaWxsIixmdW5jdGlvbihkKXtyZXR1cm4gYi5faGVscGVycy5maWxsKGQsYSxjKX0pLmF0dHIoInN0cm9rZSIsZnVuY3Rpb24oZCl7cmV0dXJuIGIuX2hlbHBlcnMuc3Ryb2tlKGQsYSxjKX0pfSksZj1hLl9oYW5kbGVUcmFuc2l0aW9uKGguZXhpdCgpLGQsYSxjKS5hdHRyKCJ4IixmdW5jdGlvbihkKXt2YXIgZT1jLnguX29yaWdpbjtyZXR1cm4ieCI9PT1sP2U9Yi5faGVscGVycy54KGQsYSxjKToiYm90aCI9PT1sJiYoZT1iLl9oZWxwZXJzLmN4KGQsYSxjKSksZX0pLmF0dHIoInkiLGZ1bmN0aW9uKGQpe3ZhciBlPWMueS5fb3JpZ2luO3JldHVybiJ5Ij09PWw/ZT1iLl9oZWxwZXJzLnkoZCxhLGMpOiJib3RoIj09PWwmJihlPWIuX2hlbHBlcnMuY3koZCxhLGMpKSxlfSkuYXR0cigid2lkdGgiLGZ1bmN0aW9uKGQpe3JldHVybiJ4Ij09PWw/Yi5faGVscGVycy53aWR0aChkLGEsYyk6MH0pLmF0dHIoImhlaWdodCIsZnVuY3Rpb24oZCl7cmV0dXJuInkiPT09bD9iLl9oZWxwZXJzLmhlaWdodChkLGEsYyk6MH0pLGIuX3Bvc3REcmF3SGFuZGxpbmcoYyxlLGYsZCksYy5zaGFwZXM9aH19LGIucGxvdC5idWJibGU9e3N0YWNrZWQ6ITEsZ3JvdXBlZDohMSxzdXBwb3J0ZWRBeGVzOlsieCIsInkiLCJ6IiwiYyJdLGRyYXc6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGYsZz1jLl9wb3NpdGlvbkRhdGEsaD1udWxsLGk9WyJkaW1wbGUtc2VyaWVzLSIrYS5zZXJpZXMuaW5kZXhPZihjKSwiZGltcGxlLWJ1YmJsZSJdO251bGwhPT1hLl90b29sdGlwR3JvdXAmJnZvaWQgMCE9PWEuX3Rvb2x0aXBHcm91cCYmYS5fdG9vbHRpcEdyb3VwLnJlbW92ZSgpLGg9bnVsbD09PWMuc2hhcGVzfHx2b2lkIDA9PT1jLnNoYXBlcz9hLl9ncm91cC5zZWxlY3RBbGwoIi4iK2kuam9pbigiLiIpKS5kYXRhKGcpOmMuc2hhcGVzLmRhdGEoZyxmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9KSxoLmVudGVyKCkuYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJpZCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5fSkuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKGMpe3ZhciBkPVtdO3JldHVybiBkPWQuY29uY2F0KGMuYWdnRmllbGQpLGQ9ZC5jb25jYXQoYy54RmllbGQpLGQ9ZC5jb25jYXQoYy55RmllbGQpLGQ9ZC5jb25jYXQoYy56RmllbGQpLGkuam9pbigiICIpKyIgIitiLl9jcmVhdGVDbGFzcyhkKSsiICIrYS5jdXN0b21DbGFzc0xpc3QuYnViYmxlU2VyaWVzKyIgIitiLl9oZWxwZXJzLmNzcyhjLGEpfSkuYXR0cigiY3giLGZ1bmN0aW9uKGQpe3JldHVybiBjLnguX2hhc0NhdGVnb3JpZXMoKT9iLl9oZWxwZXJzLmN4KGQsYSxjKTpjLnguX3ByZXZpb3VzT3JpZ2lufSkuYXR0cigiY3kiLGZ1bmN0aW9uKGQpe3JldHVybiBjLnkuX2hhc0NhdGVnb3JpZXMoKT9iLl9oZWxwZXJzLmN5KGQsYSxjKTpjLnkuX3ByZXZpb3VzT3JpZ2lufSkuYXR0cigiciIsMCkuYXR0cigib3BhY2l0eSIsZnVuY3Rpb24oZCl7cmV0dXJuIGIuX2hlbHBlcnMub3BhY2l0eShkLGEsYyl9KS5vbigibW91c2VvdmVyIixmdW5jdGlvbihkKXtiLl9zaG93UG9pbnRUb29sdGlwKGQsdGhpcyxhLGMpfSkub24oIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKGQpe2IuX3JlbW92ZVRvb2x0aXAoZCx0aGlzLGEsYyl9KS5jYWxsKGZ1bmN0aW9uKCl7YS5ub0Zvcm1hdHN8fHRoaXMuYXR0cigiZmlsbCIsZnVuY3Rpb24oZCl7cmV0dXJuIGIuX2hlbHBlcnMuZmlsbChkLGEsYyl9KS5hdHRyKCJzdHJva2UiLGZ1bmN0aW9uKGQpe3JldHVybiBiLl9oZWxwZXJzLnN0cm9rZShkLGEsYyl9KX0pLGU9YS5faGFuZGxlVHJhbnNpdGlvbihoLGQsYSxjKS5hdHRyKCJjeCIsZnVuY3Rpb24oZCl7cmV0dXJuIGIuX2hlbHBlcnMuY3goZCxhLGMpfSkuYXR0cigiY3kiLGZ1bmN0aW9uKGQpe3JldHVybiBiLl9oZWxwZXJzLmN5KGQsYSxjKX0pLmF0dHIoInIiLGZ1bmN0aW9uKGQpe3JldHVybiBiLl9oZWxwZXJzLnIoZCxhLGMpfSkuY2FsbChmdW5jdGlvbigpe2Eubm9Gb3JtYXRzfHx0aGlzLmF0dHIoImZpbGwiLGZ1bmN0aW9uKGQpe3JldHVybiBiLl9oZWxwZXJzLmZpbGwoZCxhLGMpfSkuYXR0cigic3Ryb2tlIixmdW5jdGlvbihkKXtyZXR1cm4gYi5faGVscGVycy5zdHJva2UoZCxhLGMpfSl9KSxmPWEuX2hhbmRsZVRyYW5zaXRpb24oaC5leGl0KCksZCxhLGMpLmF0dHIoInIiLDApLmF0dHIoImN4IixmdW5jdGlvbihkKXtyZXR1cm4gYy54Ll9oYXNDYXRlZ29yaWVzKCk/Yi5faGVscGVycy5jeChkLGEsYyk6Yy54Ll9vcmlnaW59KS5hdHRyKCJjeSIsZnVuY3Rpb24oZCl7cmV0dXJuIGMueS5faGFzQ2F0ZWdvcmllcygpP2IuX2hlbHBlcnMuY3koZCxhLGMpOmMueS5fb3JpZ2lufSksYi5fcG9zdERyYXdIYW5kbGluZyhjLGUsZixkKSxjLnNoYXBlcz1ofX0sYi5wbG90LmxpbmU9e3N0YWNrZWQ6ITEsZ3JvdXBlZDohMCxzdXBwb3J0ZWRBeGVzOlsieCIsInkiLCJjIl0sZHJhdzpmdW5jdGlvbihjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxuLG8scD1kLl9wb3NpdGlvbkRhdGEscT1bXSxyPW51bGwscz0iZGltcGxlLXNlcmllcy0iK2Muc2VyaWVzLmluZGV4T2YoZCksdD1kLnguX2hhc0NhdGVnb3JpZXMoKXx8ZC55Ll9oYXNDYXRlZ29yaWVzKCk/MDoxLHU9ITEsdj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihjLGQsZSxmKXthLnNlbGVjdChkKS5zdHlsZSgib3BhY2l0eSIsMSksYi5fc2hvd1BvaW50VG9vbHRpcChjLGQsZSxmKX19LHc9ZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQsZSxmLGcpe2Euc2VsZWN0KGUpLnN0eWxlKCJvcGFjaXR5IixnLmxpbmVNYXJrZXJzfHxjLmRhdGEubGVuZ3RoPDI/Yi5faGVscGVycy5vcGFjaXR5KGQsZixnKTowKSxiLl9yZW1vdmVUb29sdGlwKGQsZSxmLGcpfX0seD1mdW5jdGlvbihhKXtiLl9kcmF3TWFya2VycyhhLGMsZCxlLHMsdSx2KGEpLHcoYSkpfSx5PWZ1bmN0aW9uKGEsZSl7dmFyIGY7cmV0dXJuInN0ZXAiPT09ZC5pbnRlcnBvbGF0aW9uJiZkW2FdLl9oYXNDYXRlZ29yaWVzKCk/KGQuYmFyR2FwPTAsZC5jbHVzdGVyQmFyR2FwPTAsZj1iLl9oZWxwZXJzW2FdKGUsYyxkKSsoInkiPT09YT9iLl9oZWxwZXJzLmhlaWdodChlLGMsZCk6MCkpOmY9Yi5faGVscGVyc1siYyIrYV0oZSxjLGQpLHBhcnNlRmxvYXQoZi50b0ZpeGVkKDEpKX0sej1mdW5jdGlvbihiLGMpe3JldHVybiBhLnN2Zy5saW5lKCkueChmdW5jdGlvbihhKXtyZXR1cm4gZC54Ll9oYXNDYXRlZ29yaWVzKCl8fCFjP2EueDpkLnhbY119KS55KGZ1bmN0aW9uKGEpe3JldHVybiBkLnkuX2hhc0NhdGVnb3JpZXMoKXx8IWM/YS55OmQueVtjXX0pLmludGVycG9sYXRlKGIpfTtmb3IoZj0ic3RlcCI9PT1kLmludGVycG9sYXRpb24/InN0ZXAtYWZ0ZXIiOmQuaW50ZXJwb2xhdGlvbixvPWIuX2dldFNlcmllc09yZGVyKGQuZGF0YXx8Yy5kYXRhLGQpLGQuYyYmKGQueC5faGFzQ2F0ZWdvcmllcygpJiZkLnkuX2hhc01lYXN1cmUoKXx8ZC55Ll9oYXNDYXRlZ29yaWVzKCkmJmQueC5faGFzTWVhc3VyZSgpKSYmKHU9ITApLGc9MDtnPHAubGVuZ3RoO2crPTEpe2ZvcihqPVtdLGw9LTEsaT10O2k8cFtnXS5hZ2dGaWVsZC5sZW5ndGg7aSs9MSlqLnB1c2gocFtnXS5hZ2dGaWVsZFtpXSk7Zm9yKGs9Yi5fY3JlYXRlQ2xhc3MoaiksaT0wO2k8cS5sZW5ndGg7aSs9MSlpZihxW2ldLmtleVN0cmluZz09PWspe2w9aTticmVha30tMT09PWwmJihsPXEubGVuZ3RoLHEucHVzaCh7a2V5Omosa2V5U3RyaW5nOmssY29sb3I6IndoaXRlIixkYXRhOltdLG1hcmtlckRhdGE6W10scG9pbnRzOltdLGxpbmU6e30sZW50cnk6e30sZXhpdDp7fX0pKSxxW2xdLmRhdGEucHVzaChwW2ddKX1mb3IobyYmcS5zb3J0KGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGIuX2FycmF5SW5kZXhDb21wYXJlKG8sYS5rZXksYy5rZXkpfSksZz0wO2c8cS5sZW5ndGg7Zys9MSl7Zm9yKHFbZ10uZGF0YS5zb3J0KGIuX2dldFNlcmllc1NvcnRQcmVkaWNhdGUoYyxkLG8pKSx1JiZiLl9hZGRHcmFkaWVudChxW2ddLmtleSwiZmlsbC1saW5lLWdyYWRpZW50LSIrcVtnXS5rZXlTdHJpbmcsZC54Ll9oYXNDYXRlZ29yaWVzKCk/ZC54OmQueSxwLGMsZSwiZmlsbCIpLGg9MDtoPHFbZ10uZGF0YS5sZW5ndGg7aCs9MSlxW2ddLnBvaW50cy5wdXNoKHt4OnkoIngiLHFbZ10uZGF0YVtoXSkseTp5KCJ5IixxW2ddLmRhdGFbaF0pfSk7InN0ZXAiPT09ZC5pbnRlcnBvbGF0aW9uJiZxW2ddLnBvaW50cy5sZW5ndGg+MSYmKGQueC5faGFzQ2F0ZWdvcmllcygpP3FbZ10ucG9pbnRzLnB1c2goe3g6MipxW2ddLnBvaW50c1txW2ddLnBvaW50cy5sZW5ndGgtMV0ueC1xW2ddLnBvaW50c1txW2ddLnBvaW50cy5sZW5ndGgtMl0ueCx5OnFbZ10ucG9pbnRzW3FbZ10ucG9pbnRzLmxlbmd0aC0xXS55fSk6ZC55Ll9oYXNDYXRlZ29yaWVzKCkmJihxW2ddLnBvaW50cz1be3g6cVtnXS5wb2ludHNbMF0ueCx5OjIqcVtnXS5wb2ludHNbMF0ueS1xW2ddLnBvaW50c1sxXS55fV0uY29uY2F0KHFbZ10ucG9pbnRzKSkpLHFbZ10uZW50cnk9eihmLCJfcHJldmlvdXNPcmlnaW4iKShxW2ddLnBvaW50cykscVtnXS51cGRhdGU9eihmKShxW2ddLnBvaW50cykscVtnXS5leGl0PXooZiwiX29yaWdpbiIpKHFbZ10ucG9pbnRzKSxxW2ddLmNvbG9yPWMuZ2V0Q29sb3IocVtnXS5rZXkubGVuZ3RoPjA/cVtnXS5rZXlbcVtnXS5rZXkubGVuZ3RoLTFdOiJBbGwiKSxxW2ddLmNzcz1jLmdldENsYXNzKHFbZ10ua2V5Lmxlbmd0aD4wP3FbZ10ua2V5W3FbZ10ua2V5Lmxlbmd0aC0xXToiQWxsIil9bnVsbCE9PWMuX3Rvb2x0aXBHcm91cCYmdm9pZCAwIT09Yy5fdG9vbHRpcEdyb3VwJiZjLl90b29sdGlwR3JvdXAucmVtb3ZlKCkscj1udWxsPT09ZC5zaGFwZXN8fHZvaWQgMD09PWQuc2hhcGVzP2MuX2dyb3VwLnNlbGVjdEFsbCgiLiIrcykuZGF0YShxKTpkLnNoYXBlcy5kYXRhKHEsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5fSksci5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImlkIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9KS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oYSl7cmV0dXJuIHMrIiBkaW1wbGUtbGluZSAiK2Eua2V5U3RyaW5nKyIgIitjLmN1c3RvbUNsYXNzTGlzdC5saW5lU2VyaWVzKyIgIithLmNzc30pLmF0dHIoImQiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmVudHJ5fSkuY2FsbChmdW5jdGlvbigpe2Mubm9Gb3JtYXRzfHx0aGlzLmF0dHIoIm9wYWNpdHkiLGZ1bmN0aW9uKGEpe3JldHVybiB1PzE6YS5jb2xvci5vcGFjaXR5fSkuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzdHJva2UiLGZ1bmN0aW9uKGEpe3JldHVybiB1PyJ1cmwoI2ZpbGwtbGluZS1ncmFkaWVudC0iK2Eua2V5U3RyaW5nKyIpIjphLmNvbG9yLnN0cm9rZX0pLmF0dHIoInN0cm9rZS13aWR0aCIsZC5saW5lV2VpZ2h0KX0pLmVhY2goZnVuY3Rpb24oYSl7YS5tYXJrZXJEYXRhPWEuZGF0YSx4KGEpfSksbT1jLl9oYW5kbGVUcmFuc2l0aW9uKHIsZSxjKS5hdHRyKCJkIixmdW5jdGlvbihhKXtyZXR1cm4gYS51cGRhdGV9KS5lYWNoKGZ1bmN0aW9uKGEpe2EubWFya2VyRGF0YT1hLmRhdGEseChhKX0pLG49Yy5faGFuZGxlVHJhbnNpdGlvbihyLmV4aXQoKSxlLGMpLmF0dHIoImQiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmV4aXR9KS5lYWNoKGZ1bmN0aW9uKGEpe2EubWFya2VyRGF0YT1bXSx4KGEpfSksYi5fcG9zdERyYXdIYW5kbGluZyhkLG0sbixlKSxkLnNoYXBlcz1yfX0sYi5wbG90LnBpZT17c3RhY2tlZDohMSxncm91cGVkOiExLHN1cHBvcnRlZEF4ZXM6WyJ4IiwieSIsImMiLCJ6IiwicCJdLGRyYXc6ZnVuY3Rpb24oYyxkLGUpe3ZhciBmLGcsaD1kLl9wb3NpdGlvbkRhdGEsaT1udWxsLGo9WyJkaW1wbGUtc2VyaWVzLSIrYy5zZXJpZXMuaW5kZXhPZihkKSwiZGltcGxlLXBpZSJdLGs9ZnVuY3Rpb24oYSl7dmFyIGU7cmV0dXJuIGU9ZC54JiZkLnk/Yi5faGVscGVycy5yKGEsYyxkKTpjLl93aWR0aFBpeGVscygpPGMuX2hlaWdodFBpeGVscygpP2MuX3dpZHRoUGl4ZWxzKCkvMjpjLl9oZWlnaHRQaXhlbHMoKS8yfSxsPWZ1bmN0aW9uKGEpe3ZhciBjPWsoYSk7cmV0dXJuIGQub3V0ZXJSYWRpdXMmJihjPWIuX3BhcnNlUG9zaXRpb24oZC5vdXRlclJhZGl1cyxjKSksTWF0aC5tYXgoYywwKX0sbT1mdW5jdGlvbihhKXt2YXIgYz0wO3JldHVybiBkLmlubmVyUmFkaXVzJiYoYz1iLl9wYXJzZVBvc2l0aW9uKGQuaW5uZXJSYWRpdXMsayhhKSkpLE1hdGgubWF4KGMsMCl9LG49ZnVuY3Rpb24oYil7dmFyIGM7cmV0dXJuIGM9YS5zdmcuYXJjKCkuaW5uZXJSYWRpdXMobShiKSkub3V0ZXJSYWRpdXMobChiKSksYyhiKX0sbz1mdW5jdGlvbihiKXtiLmlubmVyUmFkaXVzPW0oYiksYi5vdXRlclJhZGl1cz1sKGIpO3ZhciBjLGQ9YS5pbnRlcnBvbGF0ZSh0aGlzLl9jdXJyZW50LGIpO3JldHVybiBjPWEuc3ZnLmFyYygpLmlubmVyUmFkaXVzKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVyUmFkaXVzfSkub3V0ZXJSYWRpdXMoZnVuY3Rpb24oYSl7cmV0dXJuIGEub3V0ZXJSYWRpdXN9KSx0aGlzLl9jdXJyZW50PWQoMCksZnVuY3Rpb24oYSl7cmV0dXJuIGMoZChhKSl9fSxwPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgZixnO3JldHVybiBkLngmJmQueT8oZj0hYXx8ZC54Ll9oYXNDYXRlZ29yaWVzKCk/Yi5faGVscGVycy5jeChlLGMsZCk6ZC54Ll9wcmV2aW91c09yaWdpbixnPSFhfHxkLnkuX2hhc0NhdGVnb3JpZXMoKT9iLl9oZWxwZXJzLmN5KGUsYyxkKTpkLnkuX3ByZXZpb3VzT3JpZ2luKTooZj1jLl94UGl4ZWxzKCkrYy5fd2lkdGhQaXhlbHMoKS8yLGc9Yy5feVBpeGVscygpK2MuX2hlaWdodFBpeGVscygpLzIpLCJ0cmFuc2xhdGUoIitmKyIsIitnKyIpIn19O251bGwhPT1jLl90b29sdGlwR3JvdXAmJnZvaWQgMCE9PWMuX3Rvb2x0aXBHcm91cCYmYy5fdG9vbHRpcEdyb3VwLnJlbW92ZSgpLGk9bnVsbD09PWQuc2hhcGVzfHx2b2lkIDA9PT1kLnNoYXBlcz9jLl9ncm91cC5zZWxlY3RBbGwoIi4iK2ouam9pbigiLiIpKS5kYXRhKGgpOmQuc2hhcGVzLmRhdGEoaCxmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9KSxpLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiaWQiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmtleX0pLmF0dHIoImNsYXNzIixmdW5jdGlvbihhKXt2YXIgZD1bXTtyZXR1cm4gZD1kLmNvbmNhdChhLmFnZ0ZpZWxkKSxkPWQuY29uY2F0KGEucEZpZWxkKSxqLmpvaW4oIiAiKSsiICIrYi5fY3JlYXRlQ2xhc3MoZCkrIiAiK2MuY3VzdG9tQ2xhc3NMaXN0LnBpZVNlcmllcysiICIrYi5faGVscGVycy5jc3MoYSxjKX0pLmF0dHIoImQiLG4pLmF0dHIoIm9wYWNpdHkiLGZ1bmN0aW9uKGEpe3JldHVybiBiLl9oZWxwZXJzLm9wYWNpdHkoYSxjLGQpfSkub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oYSl7Yi5fc2hvd0JhclRvb2x0aXAoYSx0aGlzLGMsZCl9KS5vbigibW91c2VsZWF2ZSIsZnVuY3Rpb24oYSl7Yi5fcmVtb3ZlVG9vbHRpcChhLHRoaXMsYyxkKX0pLmNhbGwoZnVuY3Rpb24oKXtjLm5vRm9ybWF0c3x8dGhpcy5hdHRyKCJmaWxsIixmdW5jdGlvbihhKXtyZXR1cm4gYi5faGVscGVycy5maWxsKGEsYyxkKX0pLmF0dHIoInN0cm9rZSIsZnVuY3Rpb24oYSl7cmV0dXJuIGIuX2hlbHBlcnMuc3Ryb2tlKGEsYyxkKX0pfSkuYXR0cigidHJhbnNmb3JtIixwKCEwKSkuZWFjaChmdW5jdGlvbihhKXt0aGlzLl9jdXJyZW50PWEsYS5pbm5lclJhZGl1cz1tKGEpLGEub3V0ZXJSYWRpdXM9bChhKX0pLGY9Yy5faGFuZGxlVHJhbnNpdGlvbihpLGUsYyxkKS5jYWxsKGZ1bmN0aW9uKCl7ZSYmZT4wP3RoaXMuYXR0clR3ZWVuKCJkIixvKTp0aGlzLmF0dHIoImQiLG4pLGMubm9Gb3JtYXRzfHx0aGlzLmF0dHIoImZpbGwiLGZ1bmN0aW9uKGEpe3JldHVybiBiLl9oZWxwZXJzLmZpbGwoYSxjLGQpfSkuYXR0cigic3Ryb2tlIixmdW5jdGlvbihhKXtyZXR1cm4gYi5faGVscGVycy5zdHJva2UoYSxjLGQpfSl9KS5hdHRyKCJ0cmFuc2Zvcm0iLHAoITEpKSxnPWMuX2hhbmRsZVRyYW5zaXRpb24oaS5leGl0KCksZSxjLGQpLmF0dHIoInRyYW5zZm9ybSIscCghMCkpLmF0dHIoImQiLG4pLGIuX3Bvc3REcmF3SGFuZGxpbmcoZCxmLGcsZSksZC5zaGFwZXM9aX19LGIuX2FkZEdyYWRpZW50PWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPVtdLmNvbmNhdChhKSxpPWUuX2dyb3VwLnNlbGVjdCgiIyIrYiksaj1bXSxrPWMucG9zaXRpb24rIkZpZWxkIixsPSEwLG09W107ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpey0xPT09ai5pbmRleE9mKGFba10pJiZhLmFnZ0ZpZWxkLmpvaW4oIl8iKT09PWguam9pbigiXyIpJiZqLnB1c2goYVtrXSl9LHRoaXMpLGo9ai5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuX3NjYWxlKGEpLWMuX3NjYWxlKGIpfSksbnVsbD09PWkubm9kZSgpJiYobD0hMSxpPWUuX2dyb3VwLmFwcGVuZCgibGluZWFyR3JhZGllbnQiKS5hdHRyKCJpZCIsYikuYXR0cigiZ3JhZGllbnRVbml0cyIsInVzZXJTcGFjZU9uVXNlIikuYXR0cigieDEiLCJ4Ij09PWMucG9zaXRpb24/Yy5fc2NhbGUoalswXSkrZS5fd2lkdGhQaXhlbHMoKS9qLmxlbmd0aC8yOjApLmF0dHIoInkxIiwieSI9PT1jLnBvc2l0aW9uP2MuX3NjYWxlKGpbMF0pLWUuX2hlaWdodFBpeGVscygpL2oubGVuZ3RoLzI6MCkuYXR0cigieDIiLCJ4Ij09PWMucG9zaXRpb24/Yy5fc2NhbGUoaltqLmxlbmd0aC0xXSkrZS5fd2lkdGhQaXhlbHMoKS9qLmxlbmd0aC8yOjApLmF0dHIoInkyIiwieSI9PT1jLnBvc2l0aW9uP2MuX3NjYWxlKGpbai5sZW5ndGgtMV0pLWUuX2hlaWdodFBpeGVscygpL2oubGVuZ3RoLzI6MCkpLGouZm9yRWFjaChmdW5jdGlvbihhLGIpe3ZhciBjPXt9LGU9MDtmb3IoZT0wO2U8ZC5sZW5ndGg7ZSs9MSlpZihkW2VdLmFnZ0ZpZWxkLmpvaW4oIl8iKT09PWguam9pbigiXyIpJiZkW2VdW2tdLmpvaW4oIl8iKT09PWEuam9pbigiXyIpKXtjPWRbZV07YnJlYWt9bS5wdXNoKHtvZmZzZXQ6TWF0aC5yb3VuZCgxMDAqKGIvKGoubGVuZ3RoLTEpKSkrIiUiLGNvbG9yOmNbZ119KX0sdGhpcyksbD9lLl9oYW5kbGVUcmFuc2l0aW9uKGkuc2VsZWN0QWxsKCJzdG9wIikuZGF0YShtKSxmLGUpLmF0dHIoIm9mZnNldCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub2Zmc2V0fSkuYXR0cigic3RvcC1jb2xvciIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29sb3J9KTppLnNlbGVjdEFsbCgic3RvcCIpLmRhdGEobSkuZW50ZXIoKS5hcHBlbmQoInN0b3AiKS5hdHRyKCJvZmZzZXQiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9mZnNldH0pLmF0dHIoInN0b3AtY29sb3IiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbG9yfSl9LGIuX2FycmF5SW5kZXhDb21wYXJlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGk7Zm9yKGU9MDtlPGEubGVuZ3RoO2UrPTEpe2ZvcihnPSEwLGg9ITAsaT1bXS5jb25jYXQoYVtlXSksZj0wO2Y8Yi5sZW5ndGg7Zis9MSlnPWcmJmJbZl09PT1pW2ZdO2ZvcihmPTA7ZjxjLmxlbmd0aDtmKz0xKWg9aCYmY1tmXT09PWlbZl07aWYoZyYmaCl7ZD0wO2JyZWFrfWlmKGcpe2Q9LTE7YnJlYWt9aWYoaCl7ZD0xO2JyZWFrfX1yZXR1cm4gZH0sYi5fY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuY2hhckNvZGVBdCgwKSxjPSItIjtyZXR1cm4gYj49NjUmJjkwPj1iJiYoYz1hLnRvTG93ZXJDYXNlKCkpLGN9O2lmKGEubGVuZ3RoPjApZm9yKGI9MDtiPGEubGVuZ3RoO2IrPTEpYy5wdXNoKCJkaW1wbGUtIithW2JdLnRvU3RyaW5nKCkucmVwbGFjZSgvW15hLXowLTldL2csZCkpO2Vsc2UgYz1bImRpbXBsZS1hbGwiXTtyZXR1cm4gYy5qb2luKCIgIil9LGIuX2RyYXdNYXJrZXJCYWNrcz1mdW5jdGlvbihjLGQsZSxmLGcpe3ZhciBoLGksaj1bImRpbXBsZS1tYXJrZXItYmFjayIsZyxjLmtleVN0cmluZ107ZS5saW5lTWFya2VycyYmKGg9bnVsbD09PWUuX21hcmtlckJhY2tzfHx2b2lkIDA9PT1lLl9tYXJrZXJCYWNrc3x8dm9pZCAwPT09ZS5fbWFya2VyQmFja3NbYy5rZXlTdHJpbmddP2QuX2dyb3VwLnNlbGVjdEFsbCgiLiIrai5qb2luKCIuIikpLmRhdGEoYy5tYXJrZXJEYXRhKTplLl9tYXJrZXJCYWNrc1tjLmtleVN0cmluZ10uZGF0YShjLm1hcmtlckRhdGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5fSksaC5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuYXR0cigiaWQiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmtleX0pLmF0dHIoImNsYXNzIixmdW5jdGlvbihhKXt2YXIgYz1bXTtyZXR1cm4gZS54Ll9oYXNDYXRlZ29yaWVzKCkmJihjPWMuY29uY2F0KGEueEZpZWxkKSksZS55Ll9oYXNDYXRlZ29yaWVzKCkmJihjPWMuY29uY2F0KGEueUZpZWxkKSksYi5fY3JlYXRlQ2xhc3MoYykrIiAiK2ouam9pbigiICIpfSkuYXR0cigiY3giLGZ1bmN0aW9uKGEpe3JldHVybiBlLnguX2hhc0NhdGVnb3JpZXMoKT9iLl9oZWxwZXJzLmN4KGEsZCxlKTplLnguX3ByZXZpb3VzT3JpZ2lufSkuYXR0cigiY3kiLGZ1bmN0aW9uKGEpe3JldHVybiBlLnkuX2hhc0NhdGVnb3JpZXMoKT9iLl9oZWxwZXJzLmN5KGEsZCxlKTplLnkuX3ByZXZpb3VzT3JpZ2lufSkuYXR0cigiciIsMCkuYXR0cigiZmlsbCIsIndoaXRlIikuYXR0cigic3Ryb2tlIiwibm9uZSIpLGQuX2hhbmRsZVRyYW5zaXRpb24oaCxmLGQpLmF0dHIoImN4IixmdW5jdGlvbihhKXtyZXR1cm4gYi5faGVscGVycy5jeChhLGQsZSl9KS5hdHRyKCJjeSIsZnVuY3Rpb24oYSl7cmV0dXJuIGIuX2hlbHBlcnMuY3koYSxkLGUpfSkuYXR0cigiciIsMitlLmxpbmVXZWlnaHQpLGk9ZC5faGFuZGxlVHJhbnNpdGlvbihoLmV4aXQoKSxmLGQpLmF0dHIoImN4IixmdW5jdGlvbihhKXtyZXR1cm4gZS54Ll9oYXNDYXRlZ29yaWVzKCk/Yi5faGVscGVycy5jeChhLGQsZSk6ZS54Ll9vcmlnaW59KS5hdHRyKCJjeSIsZnVuY3Rpb24oYSl7cmV0dXJuIGUueS5faGFzQ2F0ZWdvcmllcygpP2IuX2hlbHBlcnMuY3koYSxkLGUpOmUueS5fb3JpZ2lufSkuYXR0cigiciIsMCksMD09PWY/aS5yZW1vdmUoKTppLmVhY2goImVuZCIsZnVuY3Rpb24oKXthLnNlbGVjdCh0aGlzKS5yZW1vdmUoKX0pLCh2b2lkIDA9PT1lLl9tYXJrZXJCYWNrc3x8bnVsbD09PWUuX21hcmtlckJhY2tzKSYmKGUuX21hcmtlckJhY2tzPXt9KSxlLl9tYXJrZXJCYWNrc1tjLmtleVN0cmluZ109aCl9LGIuX2RyYXdNYXJrZXJzPWZ1bmN0aW9uKGMsZCxlLGYsZyxoLGksail7dmFyIGssbCxtPVsiZGltcGxlLW1hcmtlciIsZyxjLmtleVN0cmluZ107Yi5fZHJhd01hcmtlckJhY2tzKGMsZCxlLGYsZyksaz1udWxsPT09ZS5fbWFya2Vyc3x8dm9pZCAwPT09ZS5fbWFya2Vyc3x8dm9pZCAwPT09ZS5fbWFya2Vyc1tjLmtleVN0cmluZ10/ZC5fZ3JvdXAuc2VsZWN0QWxsKCIuIittLmpvaW4oIi4iKSkuZGF0YShjLm1hcmtlckRhdGEpOmUuX21hcmtlcnNbYy5rZXlTdHJpbmddLmRhdGEoYy5tYXJrZXJEYXRhLGZ1bmN0aW9uKGEpe3JldHVybiBhLmtleX0pLGsuZW50ZXIoKS5hcHBlbmQoImNpcmNsZSIpLmF0dHIoImlkIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9KS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oYSl7dmFyIGM9W107cmV0dXJuIGUueC5faGFzQ2F0ZWdvcmllcygpJiYoYz1jLmNvbmNhdChhLnhGaWVsZCkpLGUueS5faGFzQ2F0ZWdvcmllcygpJiYoYz1jLmNvbmNhdChhLnlGaWVsZCkpLGIuX2NyZWF0ZUNsYXNzKGMpKyIgIittLmpvaW4oIiAiKSsiICIrZC5jdXN0b21DbGFzc0xpc3QubGluZU1hcmtlcn0pLm9uKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKGEpe2koYSx0aGlzLGQsZSl9KS5vbigibW91c2VsZWF2ZSIsZnVuY3Rpb24oYSl7aihhLHRoaXMsZCxlKX0pLmF0dHIoImN4IixmdW5jdGlvbihhKXtyZXR1cm4gZS54Ll9oYXNDYXRlZ29yaWVzKCk/Yi5faGVscGVycy5jeChhLGQsZSk6ZS54Ll9wcmV2aW91c09yaWdpbn0pLmF0dHIoImN5IixmdW5jdGlvbihhKXtyZXR1cm4gZS55Ll9oYXNDYXRlZ29yaWVzKCk/Yi5faGVscGVycy5jeShhLGQsZSk6ZS55Ll9wcmV2aW91c09yaWdpbn0pLmF0dHIoInIiLDApLmF0dHIoIm9wYWNpdHkiLGUubGluZU1hcmtlcnN8fGMuZGF0YS5sZW5ndGg8Mj9jLmNvbG9yLm9wYWNpdHk6MCkuY2FsbChmdW5jdGlvbigpe2Qubm9Gb3JtYXRzfHx0aGlzLmF0dHIoImZpbGwiLCJ3aGl0ZSIpLnN0eWxlKCJzdHJva2Utd2lkdGgiLGUubGluZVdlaWdodCkuYXR0cigic3Ryb2tlIixmdW5jdGlvbihhKXtyZXR1cm4gaD9iLl9oZWxwZXJzLmZpbGwoYSxkLGUpOmMuY29sb3Iuc3Ryb2tlfSl9KSxkLl9oYW5kbGVUcmFuc2l0aW9uKGssZixkKS5hdHRyKCJjeCIsZnVuY3Rpb24oYSl7cmV0dXJuIGIuX2hlbHBlcnMuY3goYSxkLGUpfSkuYXR0cigiY3kiLGZ1bmN0aW9uKGEpe3JldHVybiBiLl9oZWxwZXJzLmN5KGEsZCxlKX0pLmF0dHIoInIiLDIrZS5saW5lV2VpZ2h0KS5hdHRyKCJvcGFjaXR5IixlLmxpbmVNYXJrZXJzfHxjLmRhdGEubGVuZ3RoPDI/Yy5jb2xvci5vcGFjaXR5OjApLmNhbGwoZnVuY3Rpb24oKXtkLm5vRm9ybWF0c3x8dGhpcy5hdHRyKCJmaWxsIiwid2hpdGUiKS5zdHlsZSgic3Ryb2tlLXdpZHRoIixlLmxpbmVXZWlnaHQpLmF0dHIoInN0cm9rZSIsZnVuY3Rpb24oYSl7cmV0dXJuIGg/Yi5faGVscGVycy5maWxsKGEsZCxlKTpjLmNvbG9yLnN0cm9rZX0pfSksbD1kLl9oYW5kbGVUcmFuc2l0aW9uKGsuZXhpdCgpLGYsZCkuYXR0cigiY3giLGZ1bmN0aW9uKGEpe3JldHVybiBlLnguX2hhc0NhdGVnb3JpZXMoKT9iLl9oZWxwZXJzLmN4KGEsZCxlKTplLnguX29yaWdpbn0pLmF0dHIoImN5IixmdW5jdGlvbihhKXtyZXR1cm4gZS55Ll9oYXNDYXRlZ29yaWVzKCk/Yi5faGVscGVycy5jeShhLGQsZSk6ZS55Ll9vcmlnaW59KS5hdHRyKCJyIiwwKSwwPT09Zj9sLnJlbW92ZSgpOmwuZWFjaCgiZW5kIixmdW5jdGlvbigpe2Euc2VsZWN0KHRoaXMpLnJlbW92ZSgpfSksKHZvaWQgMD09PWUuX21hcmtlcnN8fG51bGw9PT1lLl9tYXJrZXJzKSYmKGUuX21hcmtlcnM9e30pLGUuX21hcmtlcnNbYy5rZXlTdHJpbmddPWt9LGIuX2dldE9yZGVyZWRMaXN0PWZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxmPVtdLGc9W10saD1bXS5jb25jYXQoYyksaT1bXS5jb25jYXQoYyksaj1bXTtyZXR1cm4gbnVsbCE9PWQmJnZvaWQgMCE9PWQmJihqPWouY29uY2F0KGQpKSxqPWouY29uY2F0KHtvcmRlcmluZzpoLGRlc2M6ITF9KSxqLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGMsZD1bXSxlPVtdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiLm9yZGVyaW5nKXtpZihhJiZhLmxlbmd0aD4wKWZvcihjIGluIGFbMF0pYVswXS5oYXNPd25Qcm9wZXJ0eShjKSYmLTE9PT1pLmluZGV4T2YoYykmJmkucHVzaChjKX1lbHNlIGlmKGIub3JkZXJpbmcgaW5zdGFuY2VvZiBBcnJheSl7Zm9yKGM9MDtjPGIub3JkZXJpbmcubGVuZ3RoO2MrPTEpYSYmYS5sZW5ndGg+MCYmYVswXS5oYXNPd25Qcm9wZXJ0eShiLm9yZGVyaW5nW2NdKSYmZS5wdXNoKGIub3JkZXJpbmdbY10pLGQucHVzaChiLm9yZGVyaW5nW2NdKTtlLmxlbmd0aD5kLmxlbmd0aC8yP2kuY29uY2F0KGUpOmIudmFsdWVzPWR9ZWxzZSBpLnB1c2goYi5vcmRlcmluZyl9LHRoaXMpLGU9Yi5fcm9sbFVwKGEsaCxpKSxqLmxlbmd0aD49MSYmKGouZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1udWxsPT09YS5kZXNjfHx2b2lkIDA9PT1hLmRlc2M/ITE6YS5kZXNjLGM9YS5vcmRlcmluZyxkPVtdLGU9ZnVuY3Rpb24oYSl7dmFyIGIsYz0wO2ZvcihiPTA7YjxhLmxlbmd0aDtiKz0xKXtpZihpc05hTihhW2JdKSl7Yz12b2lkIDA7YnJlYWt9Yys9cGFyc2VGbG9hdChhW2JdKX1yZXR1cm4gY30sZz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1lKGEpLGY9ZShiKTtyZXR1cm4gaXNOYU4oZCl8fGlzTmFOKGYpP2lzTmFOKERhdGUucGFyc2UoYVswXSkpfHxpc05hTihEYXRlLnBhcnNlKGJbMF0pKT9hWzBdPGJbMF0/Yz0tMTphWzBdPmJbMF0mJihjPTEpOmM9RGF0ZS5wYXJzZShhWzBdKS1EYXRlLnBhcnNlKGJbMF0pOmM9cGFyc2VGbG9hdChkKS1wYXJzZUZsb2F0KGYpLGN9OyJmdW5jdGlvbiI9PXR5cGVvZiBjP2YucHVzaChmdW5jdGlvbihhLGQpe3JldHVybihiPy0xOjEpKmMoYSxkKX0pOmEudmFsdWVzJiZhLnZhbHVlcy5sZW5ndGg+MD8oYS52YWx1ZXMuZm9yRWFjaChmdW5jdGlvbihhKXtkLnB1c2goW10uY29uY2F0KGEpLmpvaW4oInwiKSl9LHRoaXMpLGYucHVzaChmdW5jdGlvbihhLGMpe3ZhciBlLGYsZyxpPSIiLGo9IiI7Zm9yKGc9MDtnPGgubGVuZ3RoO2crPTEpZz4wJiYoaSs9InwiLGorPSJ8IiksaSs9YVtoW2ddXSxqKz1jW2hbZ11dO3JldHVybiBlPWQuaW5kZXhPZihpKSxmPWQuaW5kZXhPZihqKSxlPTA+ZT9iPy0xOmQubGVuZ3RoOmUsZj0wPmY/Yj8tMTpkLmxlbmd0aDpmLChiPy0xOjEpKihlLWYpfSkpOltdLmNvbmNhdChhLm9yZGVyaW5nKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2YucHVzaChmdW5jdGlvbihjLGQpe3ZhciBlPTA7CnJldHVybiB2b2lkIDAhPT1jW2FdJiZ2b2lkIDAhPT1kW2FdJiYoZT1nKFtdLmNvbmNhdChjW2FdKSxbXS5jb25jYXQoZFthXSkpKSwoYj8tMToxKSplfSl9KX0pLGUuc29ydChmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ9MDtjPGYubGVuZ3RoJiYwPT09ZDspZD1mW2NdKGEsYiksYys9MTtyZXR1cm4gZH0pLGUuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYixjPVtdO2lmKDE9PT1oLmxlbmd0aClnLnB1c2goYVtoWzBdXSk7ZWxzZXtmb3IoYj0wO2I8aC5sZW5ndGg7Yis9MSljLnB1c2goYVtoW2JdXSk7Zy5wdXNoKGMpfX0sdGhpcykpLGd9LGIuX2dldFNlcmllc09yZGVyPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9W10uY29uY2F0KGMuX29yZGVyUnVsZXMpLGU9Yy5jYXRlZ29yeUZpZWxkcyxmPVtdO3JldHVybiBudWxsIT09ZSYmdm9pZCAwIT09ZSYmZS5sZW5ndGg+MCYmKG51bGwhPT1jLmMmJnZvaWQgMCE9PWMuYyYmYy5jLl9oYXNNZWFzdXJlKCkmJmQucHVzaCh7b3JkZXJpbmc6Yy5jLm1lYXN1cmUsZGVzYzohMH0pLGMueC5faGFzTWVhc3VyZSgpJiZkLnB1c2goe29yZGVyaW5nOmMueC5tZWFzdXJlLGRlc2M6ITB9KSxjLnkuX2hhc01lYXN1cmUoKSYmZC5wdXNoKHtvcmRlcmluZzpjLnkubWVhc3VyZSxkZXNjOiEwfSksZj1iLl9nZXRPcmRlcmVkTGlzdChhLGUsZCkpLGZ9LGIuX2dldFNlcmllc1NvcnRQcmVkaWNhdGU9ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBmdW5jdGlvbihlLGYpe3ZhciBnPTA7cmV0dXJuIGMueC5faGFzQ2F0ZWdvcmllcygpJiYoZz1iLl9oZWxwZXJzLmN4KGUsYSxjKS1iLl9oZWxwZXJzLmN4KGYsYSxjKSksMD09PWcmJmMueS5faGFzQ2F0ZWdvcmllcygpJiYoZz1iLl9oZWxwZXJzLmN5KGUsYSxjKS1iLl9oZWxwZXJzLmN5KGYsYSxjKSksMD09PWcmJmQmJihnPWIuX2FycmF5SW5kZXhDb21wYXJlKGQsZS5hZ2dGaWVsZCxmLmFnZ0ZpZWxkKSksZ319LGIuX2hlbHBlcnM9e2N4OmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT0wO3JldHVybiBlPW51bGwhPT1kLngubWVhc3VyZSYmdm9pZCAwIT09ZC54Lm1lYXN1cmU/ZC54Ll9zY2FsZShhLmN4KTpkLnguX2hhc0NhdGVnb3JpZXMoKSYmZC54LmNhdGVnb3J5RmllbGRzLmxlbmd0aD49Mj9kLnguX3NjYWxlKGEuY3gpK2IuX2hlbHBlcnMueEdhcChjLGQpKyhhLnhPZmZzZXQrLjUpKihjLl93aWR0aFBpeGVscygpL2QueC5fbWF4LTIqYi5faGVscGVycy54R2FwKGMsZCkpKmEud2lkdGg6ZC54Ll9zY2FsZShhLmN4KStjLl93aWR0aFBpeGVscygpL2QueC5fbWF4LzJ9LGN5OmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT0wO3JldHVybiBlPW51bGwhPT1kLnkubWVhc3VyZSYmdm9pZCAwIT09ZC55Lm1lYXN1cmU/ZC55Ll9zY2FsZShhLmN5KTpudWxsIT09ZC55LmNhdGVnb3J5RmllbGRzJiZ2b2lkIDAhPT1kLnkuY2F0ZWdvcnlGaWVsZHMmJmQueS5jYXRlZ29yeUZpZWxkcy5sZW5ndGg+PTI/ZC55Ll9zY2FsZShhLmN5KS1jLl9oZWlnaHRQaXhlbHMoKS9kLnkuX21heCtiLl9oZWxwZXJzLnlHYXAoYyxkKSsoYS55T2Zmc2V0Ky41KSooYy5faGVpZ2h0UGl4ZWxzKCkvZC55Ll9tYXgtMipiLl9oZWxwZXJzLnlHYXAoYyxkKSkqYS5oZWlnaHQ6ZC55Ll9zY2FsZShhLmN5KS1jLl9oZWlnaHRQaXhlbHMoKS9kLnkuX21heC8yfSxyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0wLGU9MTtyZXR1cm4gbnVsbD09PWMuenx8dm9pZCAwPT09Yy56P2Q9Yy5yYWRpdXMmJiJhdXRvIiE9PWMucmFkaXVzP2MucmFkaXVzOjU6KGMucmFkaXVzJiYiYXV0byIhPT1jLnJhZGl1cyYmYy5yYWRpdXM+MSYmKGU9Yy5yYWRpdXMvYy56Ll9zY2FsZShjLnouX21heCkpLGQ9Yy56Ll9oYXNNZWFzdXJlKCk/Yy56Ll9zY2FsZShhLnIpKmU6Yy56Ll9zY2FsZShiLl9oZWlnaHRQaXhlbHMoKS8xMDApKmUpLGR9LHhHYXA6ZnVuY3Rpb24oYSxiKXt2YXIgYz0wO3JldHVybihudWxsPT09Yi54Lm1lYXN1cmV8fHZvaWQgMD09PWIueC5tZWFzdXJlKSYmYi5iYXJHYXA+MCYmKGM9YS5fd2lkdGhQaXhlbHMoKS9iLnguX21heCooYi5iYXJHYXA+Ljk5Py45OTpiLmJhckdhcCkvMiksY30seENsdXN0ZXJHYXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPTA7cmV0dXJuIG51bGwhPT1kLnguY2F0ZWdvcnlGaWVsZHMmJnZvaWQgMCE9PWQueC5jYXRlZ29yeUZpZWxkcyYmZC54LmNhdGVnb3J5RmllbGRzLmxlbmd0aD49MiYmZC5jbHVzdGVyQmFyR2FwPjAmJiFkLnguX2hhc01lYXN1cmUoKSYmKGU9YS53aWR0aCooYy5fd2lkdGhQaXhlbHMoKS9kLnguX21heC0yKmIuX2hlbHBlcnMueEdhcChjLGQpKSooZC5jbHVzdGVyQmFyR2FwPi45OT8uOTk6ZC5jbHVzdGVyQmFyR2FwKS8yKSxlfSx5R2FwOmZ1bmN0aW9uKGEsYil7dmFyIGM9MDtyZXR1cm4obnVsbD09PWIueS5tZWFzdXJlfHx2b2lkIDA9PT1iLnkubWVhc3VyZSkmJmIuYmFyR2FwPjAmJihjPWEuX2hlaWdodFBpeGVscygpL2IueS5fbWF4KihiLmJhckdhcD4uOTk/Ljk5OmIuYmFyR2FwKS8yKSxjfSx5Q2x1c3RlckdhcDpmdW5jdGlvbihhLGMsZCl7dmFyIGU9MDtyZXR1cm4gbnVsbCE9PWQueS5jYXRlZ29yeUZpZWxkcyYmdm9pZCAwIT09ZC55LmNhdGVnb3J5RmllbGRzJiZkLnkuY2F0ZWdvcnlGaWVsZHMubGVuZ3RoPj0yJiZkLmNsdXN0ZXJCYXJHYXA+MCYmIWQueS5faGFzTWVhc3VyZSgpJiYoZT1hLmhlaWdodCooYy5faGVpZ2h0UGl4ZWxzKCkvZC55Ll9tYXgtMipiLl9oZWxwZXJzLnlHYXAoYyxkKSkqKGQuY2x1c3RlckJhckdhcD4uOTk/Ljk5OmQuY2x1c3RlckJhckdhcCkvMiksZX0seDpmdW5jdGlvbihhLGMsZCl7dmFyIGU9MDtyZXR1cm4gZT1kLnguX2hhc1RpbWVGaWVsZCgpP2QueC5fc2NhbGUoYS54KS1iLl9oZWxwZXJzLndpZHRoKGEsYyxkKS8yOm51bGwhPT1kLngubWVhc3VyZSYmdm9pZCAwIT09ZC54Lm1lYXN1cmU/ZC54Ll9zY2FsZShhLngpOmQueC5fc2NhbGUoYS54KStiLl9oZWxwZXJzLnhHYXAoYyxkKSthLnhPZmZzZXQqKGIuX2hlbHBlcnMud2lkdGgoYSxjLGQpKzIqYi5faGVscGVycy54Q2x1c3RlckdhcChhLGMsZCkpK2IuX2hlbHBlcnMueENsdXN0ZXJHYXAoYSxjLGQpfSx5OmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT0wO3JldHVybiBlPWQueS5faGFzVGltZUZpZWxkKCk/ZC55Ll9zY2FsZShhLnkpLWIuX2hlbHBlcnMuaGVpZ2h0KGEsYyxkKS8yOm51bGwhPT1kLnkubWVhc3VyZSYmdm9pZCAwIT09ZC55Lm1lYXN1cmU/ZC55Ll9zY2FsZShhLnkpOmQueS5fc2NhbGUoYS55KS1jLl9oZWlnaHRQaXhlbHMoKS9kLnkuX21heCtiLl9oZWxwZXJzLnlHYXAoYyxkKSthLnlPZmZzZXQqKGIuX2hlbHBlcnMuaGVpZ2h0KGEsYyxkKSsyKmIuX2hlbHBlcnMueUNsdXN0ZXJHYXAoYSxjLGQpKStiLl9oZWxwZXJzLnlDbHVzdGVyR2FwKGEsYyxkKX0sd2lkdGg6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPTA7cmV0dXJuIGU9bnVsbCE9PWQueC5tZWFzdXJlJiZ2b2lkIDAhPT1kLngubWVhc3VyZT9NYXRoLmFicyhkLnguX3NjYWxlKGEueDwwP2EueC1hLndpZHRoOmEueCthLndpZHRoKS1kLnguX3NjYWxlKGEueCkpOmQueC5faGFzVGltZUZpZWxkKCk/ZC54LmZsb2F0aW5nQmFyV2lkdGg6YS53aWR0aCooYy5fd2lkdGhQaXhlbHMoKS9kLnguX21heC0yKmIuX2hlbHBlcnMueEdhcChjLGQpKS0yKmIuX2hlbHBlcnMueENsdXN0ZXJHYXAoYSxjLGQpfSxoZWlnaHQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPTA7cmV0dXJuIGU9ZC55Ll9oYXNUaW1lRmllbGQoKT9kLnkuZmxvYXRpbmdCYXJXaWR0aDpudWxsIT09ZC55Lm1lYXN1cmUmJnZvaWQgMCE9PWQueS5tZWFzdXJlP01hdGguYWJzKGQueS5fc2NhbGUoYS55KS1kLnkuX3NjYWxlKGEueTw9MD9hLnkrYS5oZWlnaHQ6YS55LWEuaGVpZ2h0KSk6YS5oZWlnaHQqKGMuX2hlaWdodFBpeGVscygpL2QueS5fbWF4LTIqYi5faGVscGVycy55R2FwKGMsZCkpLTIqYi5faGVscGVycy55Q2x1c3RlckdhcChhLGMsZCl9LG9wYWNpdHk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPTA7cmV0dXJuIGQ9bnVsbCE9PWMuYyYmdm9pZCAwIT09Yy5jP2Eub3BhY2l0eTpiLmdldENvbG9yKGEuYWdnRmllbGQuc2xpY2UoLTEpWzBdKS5vcGFjaXR5fSxmaWxsOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0wO3JldHVybiBkPW51bGwhPT1jLmMmJnZvaWQgMCE9PWMuYz9hLmZpbGw6Yi5nZXRDb2xvcihhLmFnZ0ZpZWxkLnNsaWNlKC0xKVswXSkuZmlsbH0sc3Ryb2tlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0wO3JldHVybiBkPW51bGwhPT1jLmMmJnZvaWQgMCE9PWMuYz9hLnN0cm9rZTpiLmdldENvbG9yKGEuYWdnRmllbGQuc2xpY2UoLTEpWzBdKS5zdHJva2V9LGNzczpmdW5jdGlvbihhLGIpe3JldHVybiBiLmdldENsYXNzKGEuYWdnRmllbGQuc2xpY2UoLTEpWzBdKX19LGIuX3BhcmVudEhlaWdodD1mdW5jdGlvbihhKXt2YXIgYz1hLm9mZnNldEhlaWdodDtyZXR1cm4oMD49Y3x8bnVsbD09PWN8fHZvaWQgMD09PWMpJiYoYz1hLmNsaWVudEhlaWdodCksKDA+PWN8fG51bGw9PT1jfHx2b2lkIDA9PT1jKSYmKGM9bnVsbD09PWEucGFyZW50Tm9kZXx8dm9pZCAwPT09YS5wYXJlbnROb2RlPzA6Yi5fcGFyZW50SGVpZ2h0KGEucGFyZW50Tm9kZSkpLGN9LGIuX3BhcmVudFdpZHRoPWZ1bmN0aW9uKGEpe3ZhciBjPWEub2Zmc2V0V2lkdGg7cmV0dXJuKCFjfHwwPmMpJiYoYz1hLmNsaWVudFdpZHRoKSwoIWN8fDA+YykmJihjPWEucGFyZW50Tm9kZT9iLl9wYXJlbnRXaWR0aChhLnBhcmVudE5vZGUpOjApLGN9LGIuX3BhcnNlUG9zaXRpb249ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTA7cmV0dXJuIGEmJihjPWEudG9TdHJpbmcoKS5zcGxpdCgiLCIpLGMuZm9yRWFjaChmdW5jdGlvbihjKXtjJiYoaXNOYU4oYyk/IiUiPT09Yy5zbGljZSgtMSk/ZCs9YioocGFyc2VGbG9hdChjLnNsaWNlKDAsYy5sZW5ndGgtMSkpLzEwMCk6InB4Ij09PWMuc2xpY2UoLTIpP2QrPXBhcnNlRmxvYXQoYy5zbGljZSgwLGMubGVuZ3RoLTIpKTpkPWE6ZCs9cGFyc2VGbG9hdChjKSl9LHRoaXMpKSwwPmQmJihkPWIrZCksZH0sYi5fcGFyc2VYUG9zaXRpb249ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYi5fcGFyc2VQb3NpdGlvbihhLGIuX3BhcmVudFdpZHRoKGMpKX0sYi5fcGFyc2VZUG9zaXRpb249ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYi5fcGFyc2VQb3NpdGlvbihhLGIuX3BhcmVudEhlaWdodChjKSl9LGIuX3Bvc3REcmF3SGFuZGxpbmc9ZnVuY3Rpb24oYixjLGQsZSl7MD09PWU/KGMuZWFjaChmdW5jdGlvbihhLGMpe251bGwhPT1iLmFmdGVyRHJhdyYmdm9pZCAwIT09Yi5hZnRlckRyYXcmJmIuYWZ0ZXJEcmF3KHRoaXMsYSxjKX0pLGQucmVtb3ZlKCkpOihjLmVhY2goImVuZCIsZnVuY3Rpb24oYSxjKXtudWxsIT09Yi5hZnRlckRyYXcmJnZvaWQgMCE9PWIuYWZ0ZXJEcmF3JiZiLmFmdGVyRHJhdyh0aGlzLGEsYyl9KSxkLmVhY2goImVuZCIsZnVuY3Rpb24oKXthLnNlbGVjdCh0aGlzKS5yZW1vdmUoKX0pKX0sYi5fcmVtb3ZlVG9vbHRpcD1mdW5jdGlvbihhLGIsYyl7Yy5fdG9vbHRpcEdyb3VwJiZjLl90b29sdGlwR3JvdXAucmVtb3ZlKCl9LGIuX3JvbGxVcD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9W107cmV0dXJuIGI9bnVsbCE9PWImJnZvaWQgMCE9PWI/W10uY29uY2F0KGIpOltdLGEuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT0tMSxmPXt9LGc9ITA7ZC5mb3JFYWNoKGZ1bmN0aW9uKGMsZCl7LTE9PT1lJiYoZz0hMCxiLmZvckVhY2goZnVuY3Rpb24oYil7Zz1nJiZhW2JdPT09Y1tiXX0sdGhpcyksZyYmKGU9ZCkpfSx0aGlzKSwtMSE9PWU/Zj1kW2VdOihiLmZvckVhY2goZnVuY3Rpb24oYil7ZltiXT1hW2JdfSx0aGlzKSxkLnB1c2goZiksZT1kLmxlbmd0aC0xKSxjLmZvckVhY2goZnVuY3Rpb24oYyl7LTE9PT1iLmluZGV4T2YoYykmJih2b2lkIDA9PT1mW2NdJiYoZltjXT1bXSksZltjXT1mW2NdLmNvbmNhdChhW2NdKSl9LHRoaXMpLGRbZV09Zn0sdGhpcyksZH0sYi5fc2hvd0JhclRvb2x0aXA9ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGw9NSxtPTEwLG49NzUwLG89YS5zZWxlY3QoYykscD1vLm5vZGUoKS5nZXRCQm94KCkueCxxPW8ubm9kZSgpLmdldEJCb3goKS55LHI9by5ub2RlKCkuZ2V0QkJveCgpLndpZHRoLHM9by5ub2RlKCkuZ2V0QkJveCgpLmhlaWdodCx0PW8uYXR0cigib3BhY2l0eSIpLHU9by5hdHRyKCJmaWxsIiksdj1lLl9kcm9wTGluZU9yaWdpbigpLHc9YS5yZ2IoYS5yZ2IodSkucisuNiooMjU1LWEucmdiKHUpLnIpLGEucmdiKHUpLmcrLjYqKDI1NS1hLnJnYih1KS5nKSxhLnJnYih1KS5iKy42KigyNTUtYS5yZ2IodSkuYikpLHg9YS5yZ2IoYS5yZ2IodSkucisuOCooMjU1LWEucmdiKHUpLnIpLGEucmdiKHUpLmcrLjgqKDI1NS1hLnJnYih1KS5nKSxhLnJnYih1KS5iKy44KigyNTUtYS5yZ2IodSkuYikpLHk9ZS5nZXRUb29sdGlwVGV4dChiKSx6PTAsQT0wLEI9MCxDPWZ1bmN0aW9uKGEsYil7dmFyIGM9by5ub2RlKCkuZ2V0Q1RNKCksZT1kLnN2Zy5ub2RlKCkuY3JlYXRlU1ZHUG9pbnQoKTtyZXR1cm4gZS54PWF8fDAsZS55PWJ8fDAsZS5tYXRyaXhUcmFuc2Zvcm0oYyl9O251bGwhPT1kLl90b29sdGlwR3JvdXAmJnZvaWQgMCE9PWQuX3Rvb2x0aXBHcm91cCYmZC5fdG9vbHRpcEdyb3VwLnJlbW92ZSgpLGQuX3Rvb2x0aXBHcm91cD1kLnN2Zy5hcHBlbmQoImciKSxlLnB8fChrPWUuX2lzU3RhY2tlZCgpPzE6ci8yLGUueC5faGFzQ2F0ZWdvcmllcygpfHxudWxsPT09di55fHxkLl90b29sdGlwR3JvdXAuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLHA8ZS54Ll9vcmlnaW4/cCtrOnArci1rKS5hdHRyKCJ5MSIscTx2Lnk/cStzOnEpLmF0dHIoIngyIixwPGUueC5fb3JpZ2luP3ArazpwK3ItaykuYXR0cigieTIiLHE8di55P3ErczpxKS5zdHlsZSgiZmlsbCIsIm5vbmUiKS5zdHlsZSgic3Ryb2tlIix1KS5zdHlsZSgic3Ryb2tlLXdpZHRoIiwyKS5zdHlsZSgic3Ryb2tlLWRhc2hhcnJheSIsIjMsIDMiKS5zdHlsZSgib3BhY2l0eSIsdCkudHJhbnNpdGlvbigpLmRlbGF5KG4vMikuZHVyYXRpb24obi8yKS5lYXNlKCJsaW5lYXIiKS5hdHRyKCJ5MiIscTx2Lnk/di55LTE6di55KzEpLGs9ZS5faXNTdGFja2VkKCk/MTpzLzIsZS55Ll9oYXNDYXRlZ29yaWVzKCl8fG51bGw9PT12Lnh8fGQuX3Rvb2x0aXBHcm91cC5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIscDx2Lng/cCtyOnApLmF0dHIoInkxIixxPGUueS5fb3JpZ2luP3ErazpxK3MtaykuYXR0cigieDIiLHA8di54P3ArcjpwKS5hdHRyKCJ5MiIscTxlLnkuX29yaWdpbj9xK2s6cStzLWspLnN0eWxlKCJmaWxsIiwibm9uZSIpLnN0eWxlKCJzdHJva2UiLHUpLnN0eWxlKCJzdHJva2Utd2lkdGgiLDIpLnN0eWxlKCJzdHJva2UtZGFzaGFycmF5IiwiMywgMyIpLnN0eWxlKCJvcGFjaXR5Iix0KS50cmFuc2l0aW9uKCkuZGVsYXkobi8yKS5kdXJhdGlvbihuLzIpLmVhc2UoImxpbmVhciIpLmF0dHIoIngyIixwPHYueD92LngtMTp2LngrMSkpLGY9ZC5fdG9vbHRpcEdyb3VwLmFwcGVuZCgiZyIpLGc9Zi5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImRpbXBsZS10b29sdGlwICIrZC5jdXN0b21DbGFzc0xpc3QudG9vbHRpcEJveCksZi5zZWxlY3RBbGwoIi5kaW1wbGUtZG9udC1zZWxlY3QtYW55IikuZGF0YSh5KS5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwiZGltcGxlLXRvb2x0aXAgIitkLmN1c3RvbUNsYXNzTGlzdC50b29sdGlwTGFiZWwpLnRleHQoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KS5zdHlsZSgiZm9udC1mYW1pbHkiLGUudG9vbHRpcEZvbnRGYW1pbHkpLnN0eWxlKCJmb250LXNpemUiLGUuX2dldFRvb2x0aXBGb250U2l6ZSgpKSxmLmVhY2goZnVuY3Rpb24oKXtBPXRoaXMuZ2V0QkJveCgpLndpZHRoPkE/dGhpcy5nZXRCQm94KCkud2lkdGg6QSxCPXRoaXMuZ2V0QkJveCgpLndpZHRoPkI/dGhpcy5nZXRCQm94KCkuaGVpZ2h0OkJ9KSxmLnNlbGVjdEFsbCgidGV4dCIpLmF0dHIoIngiLDApLmF0dHIoInkiLGZ1bmN0aW9uKCl7cmV0dXJuIHorPXRoaXMuZ2V0QkJveCgpLmhlaWdodCx6LXRoaXMuZ2V0QkJveCgpLmhlaWdodC8yfSksZy5hdHRyKCJ4IiwtbCkuYXR0cigieSIsLWwpLmF0dHIoImhlaWdodCIsTWF0aC5mbG9vcih6K2wpLS41KS5hdHRyKCJ3aWR0aCIsQSsyKmwpLmF0dHIoInJ4Iiw1KS5hdHRyKCJyeSIsNSkuc3R5bGUoImZpbGwiLHgpLnN0eWxlKCJzdHJva2UiLHcpLnN0eWxlKCJzdHJva2Utd2lkdGgiLDIpLnN0eWxlKCJvcGFjaXR5IiwuOTUpLEMocCtyK2wrbStBKS54PHBhcnNlRmxvYXQoZC5zdmcubm9kZSgpLmdldEJCb3goKS53aWR0aCk/KGg9cCtyK2wrbSxpPXErcy8yLSh6LShCLWwpKS8yKTpDKHAtKGwrbStBKSkueD4wPyhoPXAtKGwrbStBKSxpPXErcy8yLSh6LShCLWwpKS8yKTpDKDAscStzK3orbStsKS55PHBhcnNlRmxvYXQoZC5zdmcubm9kZSgpLmdldEJCb3goKS5oZWlnaHQpPyhoPXArci8yLSgyKmwrQSkvMixoPWg+MD9oOm0saD1oK0E8cGFyc2VGbG9hdChkLnN2Zy5ub2RlKCkuZ2V0QkJveCgpLndpZHRoKT9oOnBhcnNlRmxvYXQoZC5zdmcubm9kZSgpLmdldEJCb3goKS53aWR0aCktQS1tLGk9cStzKzIqbCk6KGg9cCtyLzItKDIqbCtBKS8yLGg9aD4wP2g6bSxoPWgrQTxwYXJzZUZsb2F0KGQuc3ZnLm5vZGUoKS5nZXRCQm94KCkud2lkdGgpP2g6cGFyc2VGbG9hdChkLnN2Zy5ub2RlKCkuZ2V0QkJveCgpLndpZHRoKS1BLW0saT1xLXotKEItbCkpLGo9QyhoLGkpLGYuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrai54KyIgLCAiK2oueSsiKSIpfSxiLl9zaG93UG9pbnRUb29sdGlwPWZ1bmN0aW9uKGMsZCxlLGYpe3ZhciBnLGgsaSxqLGs9NSxsPTEwLG09NzUwLG49YS5zZWxlY3QoZCksbz1wYXJzZUZsb2F0KG4uYXR0cigiY3giKSkscD1wYXJzZUZsb2F0KG4uYXR0cigiY3kiKSkscT1wYXJzZUZsb2F0KG4uYXR0cigiciIpKSxyPWIuX2hlbHBlcnMub3BhY2l0eShjLGUsZikscz1uLmF0dHIoInN0cm9rZSIpLHQ9Zi5fZHJvcExpbmVPcmlnaW4oKSx1PWEucmdiKGEucmdiKHMpLnIrLjYqKDI1NS1hLnJnYihzKS5yKSxhLnJnYihzKS5nKy42KigyNTUtYS5yZ2IocykuZyksYS5yZ2IocykuYisuNiooMjU1LWEucmdiKHMpLmIpKSx2PWEucmdiKGEucmdiKHMpLnIrLjgqKDI1NS1hLnJnYihzKS5yKSxhLnJnYihzKS5nKy44KigyNTUtYS5yZ2IocykuZyksYS5yZ2IocykuYisuOCooMjU1LWEucmdiKHMpLmIpKSx3PTAseD0wLHk9MCx6PWYuZ2V0VG9vbHRpcFRleHQoYyk7bnVsbCE9PWUuX3Rvb2x0aXBHcm91cCYmdm9pZCAwIT09ZS5fdG9vbHRpcEdyb3VwJiZlLl90b29sdGlwR3JvdXAucmVtb3ZlKCksZS5fdG9vbHRpcEdyb3VwPWUuc3ZnLmFwcGVuZCgiZyIpLGUuX3Rvb2x0aXBHcm91cC5hcHBlbmQoImNpcmNsZSIpLmF0dHIoImN4IixvKS5hdHRyKCJjeSIscCkuYXR0cigiciIscSkuYXR0cigib3BhY2l0eSIsMCkuc3R5bGUoImZpbGwiLCJub25lIikuc3R5bGUoInN0cm9rZSIscykuc3R5bGUoInN0cm9rZS13aWR0aCIsMSkudHJhbnNpdGlvbigpLmR1cmF0aW9uKG0vMikuZWFzZSgibGluZWFyIikuYXR0cigib3BhY2l0eSIsMSkuYXR0cigiciIscStmLmxpbmVXZWlnaHQrMikuc3R5bGUoInN0cm9rZS13aWR0aCIsMiksbnVsbCE9PXQueSYmZS5fdG9vbHRpcEdyb3VwLmFwcGVuZCgibGluZSIpLmF0dHIoIngxIixvKS5hdHRyKCJ5MSIscDx0Lnk/cCtxK2YubGluZVdlaWdodCsyOnAtcS1mLmxpbmVXZWlnaHQtMikuYXR0cigieDIiLG8pLmF0dHIoInkyIixwPHQueT9wK3ErZi5saW5lV2VpZ2h0KzI6cC1xLWYubGluZVdlaWdodC0yKS5zdHlsZSgiZmlsbCIsIm5vbmUiKS5zdHlsZSgic3Ryb2tlIixzKS5zdHlsZSgic3Ryb2tlLXdpZHRoIiwyKS5zdHlsZSgic3Ryb2tlLWRhc2hhcnJheSIsIjMsIDMiKS5zdHlsZSgib3BhY2l0eSIscikudHJhbnNpdGlvbigpLmRlbGF5KG0vMikuZHVyYXRpb24obS8yKS5lYXNlKCJsaW5lYXIiKS5hdHRyKCJ5MiIscDx0Lnk/dC55LTE6dC55KzEpLG51bGwhPT10LngmJmUuX3Rvb2x0aXBHcm91cC5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsbzx0Lng/bytxK2YubGluZVdlaWdodCsyOm8tcS1mLmxpbmVXZWlnaHQtMikuYXR0cigieTEiLHApLmF0dHIoIngyIixvPHQueD9vK3ErZi5saW5lV2VpZ2h0KzI6by1xLWYubGluZVdlaWdodC0yKS5hdHRyKCJ5MiIscCkuc3R5bGUoImZpbGwiLCJub25lIikuc3R5bGUoInN0cm9rZSIscykuc3R5bGUoInN0cm9rZS13aWR0aCIsMikuc3R5bGUoInN0cm9rZS1kYXNoYXJyYXkiLCIzLCAzIikuc3R5bGUoIm9wYWNpdHkiLHIpLnRyYW5zaXRpb24oKS5kZWxheShtLzIpLmR1cmF0aW9uKG0vMikuZWFzZSgibGluZWFyIikuYXR0cigieDIiLG88dC54P3QueC0xOnQueCsxKSxnPWUuX3Rvb2x0aXBHcm91cC5hcHBlbmQoImciKSxoPWcuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJkaW1wbGUtdG9vbHRpcCIpLGcuc2VsZWN0QWxsKCIuZG9udC1zZWxlY3QtYW55IikuZGF0YSh6KS5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwiZGltcGxlLXRvb2x0aXAiKS50ZXh0KGZ1bmN0aW9uKGEpe3JldHVybiBhfSkuc3R5bGUoImZvbnQtZmFtaWx5IixmLnRvb2x0aXBGb250RmFtaWx5KS5zdHlsZSgiZm9udC1zaXplIixmLl9nZXRUb29sdGlwRm9udFNpemUoKSksZy5lYWNoKGZ1bmN0aW9uKCl7eD10aGlzLmdldEJCb3goKS53aWR0aD54P3RoaXMuZ2V0QkJveCgpLndpZHRoOngseT10aGlzLmdldEJCb3goKS53aWR0aD55P3RoaXMuZ2V0QkJveCgpLmhlaWdodDp5fSksZy5zZWxlY3RBbGwoInRleHQiKS5hdHRyKCJ4IiwwKS5hdHRyKCJ5IixmdW5jdGlvbigpe3JldHVybiB3Kz10aGlzLmdldEJCb3goKS5oZWlnaHQsdy10aGlzLmdldEJCb3goKS5oZWlnaHQvMn0pLGguYXR0cigieCIsLWspLmF0dHIoInkiLC1rKS5hdHRyKCJoZWlnaHQiLE1hdGguZmxvb3IodytrKS0uNSkuYXR0cigid2lkdGgiLHgrMiprKS5hdHRyKCJyeCIsNSkuYXR0cigicnkiLDUpLnN0eWxlKCJmaWxsIix2KS5zdHlsZSgic3Ryb2tlIix1KS5zdHlsZSgic3Ryb2tlLXdpZHRoIiwyKS5zdHlsZSgib3BhY2l0eSIsLjk1KSxvK3EraytsK3g8cGFyc2VGbG9hdChlLnN2Zy5ub2RlKCkuZ2V0QkJveCgpLndpZHRoKT8oaT1vK3EraytsLGo9cC0ody0oeS1rKSkvMik6by1xLShrK2wreCk+MD8oaT1vLXEtKGsrbCt4KSxqPXAtKHctKHktaykpLzIpOnArcSt3K2wrazxwYXJzZUZsb2F0KGUuc3ZnLm5vZGUoKS5nZXRCQm94KCkuaGVpZ2h0KT8oaT1vLSgyKmsreCkvMixpPWk+MD9pOmwsaT1pK3g8cGFyc2VGbG9hdChlLnN2Zy5ub2RlKCkuZ2V0QkJveCgpLndpZHRoKT9pOnBhcnNlRmxvYXQoZS5zdmcubm9kZSgpLmdldEJCb3goKS53aWR0aCkteC1sLGo9cCtxKzIqayk6KGk9by0oMiprK3gpLzIsaT1pPjA/aTpsLGk9aSt4PHBhcnNlRmxvYXQoZS5zdmcubm9kZSgpLmdldEJCb3goKS53aWR0aCk/aTpwYXJzZUZsb2F0KGUuc3ZnLm5vZGUoKS5nZXRCQm94KCkud2lkdGgpLXgtbCxqPXAtdy0oeS1rKSksZy5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitpKyIgLCAiK2orIikiKX0sYi5maWx0ZXJEYXRhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hO3JldHVybiBudWxsIT09YiYmbnVsbCE9PWMmJihudWxsIT09YyYmdm9pZCAwIT09YyYmKGM9W10uY29uY2F0KGMpKSxkPVtdLGEuZm9yRWFjaChmdW5jdGlvbihhKXtudWxsPT09YVtiXT9kLnB1c2goYSk6Yy5pbmRleE9mKFtdLmNvbmNhdChhW2JdKS5qb2luKCIvIikpPi0xJiZkLnB1c2goYSl9LHRoaXMpKSxkfSxiLmdldFVuaXF1ZVZhbHVlcz1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO3JldHVybiBudWxsIT09YiYmdm9pZCAwIT09YiYmKGI9W10uY29uY2F0KGIpLGEuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZD0iIjtiLmZvckVhY2goZnVuY3Rpb24oYixjKXtjPjAmJihkKz0iLyIpLGQrPWFbYl19LHRoaXMpLC0xPT09Yy5pbmRleE9mKGQpJiZjLnB1c2goZCl9LHRoaXMpKSxjfSxiLm5ld1N2Zz1mdW5jdGlvbihiLGMsZCl7dmFyIGU9bnVsbDtpZigobnVsbD09PWJ8fHZvaWQgMD09PWIpJiYoYj0iYm9keSIpLGU9YS5zZWxlY3QoYiksZS5lbXB0eSgpKXRocm93IlRoZSAnIitiKyInIHNlbGVjdG9yIGRpZCBub3QgbWF0Y2ggYW55IGVsZW1lbnRzLiAgUGxlYXNlIHByZWZpeCB3aXRoICcjJyB0byBzZWxlY3QgYnkgaWQgb3IgJy4nIHRvIHNlbGVjdCBieSBjbGFzcyI7cmV0dXJuIGUuYXBwZW5kKCJzdmciKS5hdHRyKCJ3aWR0aCIsYykuYXR0cigiaGVpZ2h0IixkKX0sYn0pOw=="></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKICBuYW1lOiAiZGltcGxlIiwKICB0eXBlOiAib3V0cHV0IiwKICAKICBpbml0aWFsaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCl7CiAgICByZXR1cm4ge307CiAgfSwKICAKICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBpbnN0YW5jZSkgewoKICB9LCAgCiAgCiAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSl7CiAgICBkMy5zZWxlY3QoZWwpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpCiAgICAKICAgIC8vIGFkZCB0aXRsZSBpZiBwcm92aWRlZAogICAgaWYgKHgub3B0aW9ucy50aXRsZSl7CiAgICAgIGlmICh4Lm9wdGlvbnMudGl0bGUuaHRtbCl7CiAgICAgICAgLy8gaWYgaHRtbCBwcm92aWRlZCB0aGVuIHVzZSBpbm5lckhUTUwKICAgICAgICAvLyB0aGlzIGlzIG5vdCByb2J1c3QgYW5kIHdpbGwgbmVlZCBtb3JlIGNoZWNraW5nIG9uIGpzIG9yIFIgc2lkZQogICAgICAgIGVsLmlubmVySFRNTCA9IHgub3B0aW9ucy50aXRsZS5odG1sOwogICAgICB9CiAgICAgIGVsc2UgaWYoeC5vcHRpb25zLnRpdGxlLnRleHQpIHsKICAgICAgICAvLyBpZiBqdXN0IHRleHQgdGhlbiBtYWtlIGl0IGFuIGgzCiAgICAgICAgdGl0bGVub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaDMiKQogICAgICAgIHRpdGxlbm9kZS5zdHlsZVsibWFyZ2luLXRvcCJdID0gMDsKICAgICAgICB0aXRsZW5vZGUuc3R5bGVbIm1hcmdpbi1ib3R0b20iXSA9IDA7CiAgICAgICAgdGl0bGVub2RlLmlubmVyVGV4dCA9IHgub3B0aW9ucy50aXRsZS50ZXh0OwogICAgICAgIGVsLmFwcGVuZENoaWxkKHRpdGxlbm9kZSk7CiAgICAgIH0KICAgIH0KICAgIAogICAgLy8gbWFrZSBkYXRhIGluIHJlY29yZCBvciBhcnJheSBvZiBvYmplY3RzIGZvcm1hdAogICAgLy8gICAgdXNpbmcgdGhlIEhUTUxXaWRnZXRzIGhlbHBlciBmdW5jdGlvbgogICAgeC5kYXRhID0gSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyh4LmRhdGEpOwoKICAgIGVsLndpZGdldERpbXBsZSA9IGRyYXdDaGFydCh4Lm9wdGlvbnMsIHguZGF0YSk7CiAgICAKICAgIGlmKHR5cGVvZiB4Lm9wdGlvbnMudGFza3MgIT09ICJ1bmRlZmluZWQiKXsKICAgICAgaWYoIXgub3B0aW9ucy50YXNrcy5sZW5ndGgpeyAKICAgICAgICB4Lm9wdGlvbnMudGFza3MgPSBbeC5vcHRpb25zLnRhc2tzXQogICAgICB9CiAgICAgIAogICAgICB4Lm9wdGlvbnMudGFza3MubWFwKGZ1bmN0aW9uKHRhc2spewogICAgICAgIGlmKHR5cGVvZiB0YXNrID09ICJmdW5jdGlvbiIpewogICAgICAgICAgdGFzay5jYWxsKGVsKQogICAgICAgIH0KICAgICAgfSkKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZHJhd0NoYXJ0KG9wdHMsIGRhdGEpeyAKICAgICAgdmFyIHN1YkNoYXJ0cyA9IFtdOwogICAgICAKICAgICAgdmFyIGMgPSBudWxsOwogICAgICB2YXIgYXNzaWduZWRDb2xvcnMgPSB7fTsKICAgICAgCiAgICAgIC8vaGFuZGxlIFJKU09OSU8gYm94L3VuYm94IHRyb3VibGVzCiAgICAgIGlmKCBvcHRzLmRlZmF1bHRDb2xvcnMubGVuZ3RoID09IDEgKSB7CiAgICAgICAgb3B0cy5kZWZhdWx0Q29sb3JzID0gb3B0cy5kZWZhdWx0Q29sb3JzWzBdOwogICAgICB9CiAgICAgIAogICAgICAvL21vdmUgdGhpcyB0byB0b3Agb3IgbWFrZSBmdW5jdGlvbiBzaW5jZSBkdXBsaWNhdGVkCiAgICAgIC8vYWxsb3cgbWFuaXB1bGF0aW9uIG9mIGRlZmF1bHQgY29sb3JzIHRvIHVzZSB3aXRoIGRpbXBsZQogICAgICBpZiggb3B0cy5kZWZhdWx0Q29sb3JzLmxlbmd0aCB8fCB0eXBlb2Yob3B0cy5kZWZhdWx0Q29sb3JzKSA9PSAiZnVuY3Rpb24iICkgewogICAgICAgIHZhciBkZWZhdWx0Q29sb3JzQXJyYXkgPSBbXTsKICAgICAgICBpZiAodHlwZW9mKG9wdHMuZGVmYXVsdENvbG9ycykgPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgLy9hc3N1bWUgdGhpcyBpcyBhIGQzIHNjYWxlCiAgICAgICAgICAvL2lmIHRoZXJlIGlzIGEgZG9tYWluIGZvciB0aGUgY29sb3Igc2NhbGUgZ2l2ZW4KICAgICAgICAgIC8vdGhlbiB3ZSB3aWxsIG5lZWQgdG8gYXNzaWduIGNvbG9ycyB3aXRoIGRpbXBsZXMgYXNzaWduQ29sb3IKICAgICAgICAgIGlmKCBvcHRzLmRlZmF1bHRDb2xvcnMuZG9tYWluKCkubGVuZ3RoID4gMCApewogICAgICAgICAgICBkZWZhdWx0Q29sb3JzQXJyYXkgPSBvcHRzLmRlZmF1bHRDb2xvcnMucmFuZ2UoKTsKICAgICAgICAgICAgb3B0cy5kZWZhdWx0Q29sb3JzLmRvbWFpbigpLmZvckVhY2goIGZ1bmN0aW9uKCBkLCBpICkgewogICAgICAgICAgICAgIGFzc2lnbmVkQ29sb3JzW2RdID0gbmV3IGRpbXBsZS5jb2xvcihvcHRzLmRlZmF1bHRDb2xvcnMucmFuZ2UoKVtpXSkKICAgICAgICAgICAgfSkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIG49MDtuPG9wdHMuZGVmYXVsdENvbG9ycy5yYW5nZSgpLmxlbmd0aDtuKyspIHsKICAgICAgICAgICAgICBkZWZhdWx0Q29sb3JzQXJyYXkucHVzaChvcHRzLmRlZmF1bHRDb2xvcnMobikpOwogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBpZiBoZXJlIHRoZW4gc2hvdWxkIGJlIGFuIGFycmF5IG9mIGhleCBjb2xvcnMKICAgICAgICAgIGRlZmF1bHRDb2xvcnNBcnJheSA9IG9wdHMuZGVmYXVsdENvbG9yczsgCiAgICAgICAgICAKICAgICAgICAgIAogICAgICAgICAgLy8ganVzdCBnZXQgdGhlIGZpcnN0IDYgY2hhcmFjdGVycyBvZiBoZXggY29sb3IKICAgICAgICAgIGRlZmF1bHRDb2xvcnNBcnJheSA9IGRlZmF1bHRDb2xvcnNBcnJheS5tYXAoZnVuY3Rpb24oZCl7CiAgICAgICAgICAgIHJldHVybiBkLnN1YnN0cmluZygwLDcpOwogICAgICAgICAgfSkKICAgICAgICB9CiAgICAKICAgICAgICAKICAgICAgICAvL2lmIGNvbG9ycyBub3QgYXNzaWduZWQgd2l0aCBubyBrZXlzIGFuZCBvcHRzLmdyb3VwcwogICAgICAgIGlmICghKE9iamVjdC5rZXlzKGFzc2lnbmVkQ29sb3JzKS5sZW5ndGgpICYgQm9vbGVhbihvcHRzLmdyb3VwcykpIHsKICAgICAgICAgIC8vbGV0J3MganVzdCBhc3NpZ24gY29sb3JzIGluIG9yZGVyIHdpdGggZWFjaCB1bmlxdWUKICAgICAgICAgIC8vdGhpcyBpcyBpbXBvcnRhbnQgaWYgZmFjZXR0aW5nIHdoZXJlIG5lZWQgY29sb3JzIGFzc2lnbmVkCiAgICAgICAgICAvL2lmIG5vdCBpbiBhbGwgcGFpcnMKICAgICAgICAgIG9wdHMuZ3JvdXBzID0gKHR5cGVvZiBvcHRzLmdyb3VwcyA9PSAic3RyaW5nIikgPyBbb3B0cy5ncm91cHNdIDogb3B0cy5ncm91cHM7CiAgICAgICAgICBkMy5zZXQoCiAgICAgICAgICAgIGRhdGEubWFwKGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgIC8vZGltcGxlIGNvbG9ycyBieSBsYXN0IGl0ZW0gaW4gZ3JvdXBzCiAgICAgICAgICAgICAgcmV0dXJuIGRbb3B0cy5ncm91cHNbb3B0cy5ncm91cHMubGVuZ3RoLTFdXQogICAgICAgICAgICB9KQogICAgICAgICAgKS52YWx1ZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHUsaSl7CiAgICAgICAgICAgIC8vdSB3aWxsIGJlIG91ciB1bmlxZSBhbmQgd2lsbCBwaWNrIGNvbG9yIGZyb20gZGVmYXVsdENvbG9yc0FycmF5CiAgICAgICAgICAgIC8vY29uc29sZS5sb2coW3UsZGVmYXVsdENvbG9yc0FycmF5W2ldXS5jb25jYXQoKSk7CiAgICAgICAgICAgIGFzc2lnbmVkQ29sb3JzW3VdID0gbmV3IGRpbXBsZS5jb2xvcihkZWZhdWx0Q29sb3JzQXJyYXlbaSAlIGRlZmF1bHRDb2xvcnNBcnJheS5sZW5ndGhdKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgIH0KICAgIAogICAgICAKICAgICAgLy9kbyBzZXJpZXMKICAgICAgLy9zZXQgdXAgYSBmdW5jdGlvbiBzaW5jZSBzYW1lIGZvciBlYWNoCiAgICAgIC8vYXMgb2Ygbm93IHdlIGhhdmUgeCx5LGdyb3VwcyxkYXRhLHR5cGUgaW4gb3B0cyBmb3IgcHJpbWFyeSBsYXllcgogICAgICAvL2FuZCBvdGhlciBsYXllcnMgcmVzaWRlIGluIG9wdHMubGF5ZXJzCiAgICAgIGZ1bmN0aW9uIGJ1aWxkU2VyaWVzKGxheWVyLCBoaWRkZW4sIG15Q2hhcnQsIGRhdGEpewogICAgICAgIC8vaW5oZXJpdCBmcm9tIHByaW1hcnkgbGF5ZXIgaWYgbm90IGludGVudGlvbmFsbHkgY2hhbmdlZCBvciB4QXhpcywgeUF4aXMsIHpBeGlzIG51bGwKICAgICAgICBpZiAoIWxheWVyLnhBeGlzKSBsYXllci54QXhpcyA9IG9wdHMueEF4aXM7ICAgIAogICAgICAgIGlmICghbGF5ZXIueUF4aXMpIGxheWVyLnlBeGlzID0gb3B0cy55QXhpczsKICAgICAgICBpZiAoIWxheWVyLnpBeGlzKSBsYXllci56QXhpcyA9IG9wdHMuekF4aXM7CiAgICAgICAgCiAgICAgICAgdmFyIHggPSBidWlsZEF4aXMoIngiLCBsYXllciwgbXlDaGFydCk7CiAgICAgICAgeC5oaWRkZW4gPSBoaWRkZW47CiAgICAgICAgCiAgICAgICAgdmFyIHkgPSBidWlsZEF4aXMoInkiLCBsYXllciwgbXlDaGFydCk7CiAgICAgICAgeS5oaWRkZW4gPSBoaWRkZW47CiAgICAgICAgCiAgICAgICAgLy96IGZvciBidWJibGVzCiAgICAgICAgdmFyIHogPSBudWxsOwogICAgICAgIGlmICghKHR5cGVvZihsYXllci56QXhpcykgPT09ICd1bmRlZmluZWQnKSAmJiBsYXllci56QXhpcy50eXBlKXsKICAgICAgICAgIHogPSBidWlsZEF4aXMoInoiLCBsYXllciwgbXlDaGFydCk7CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICAvL2hlcmUgdGhpbmsgSSBuZWVkIHRvIGV2YWx1YXRlIGdyb3VwIGFuZCBpZiBtaXNzaW5nIGRvIG51bGwKICAgICAgICAvL2FzIHRoZSBncm91cCBhcmd1bWVudAogICAgICAgIC8vaWYgcHJvdmlkZWQgbmVlZCB0byB1c2UgZ3JvdXBzIGZyb20gbGF5ZXIKICAgICAgICB2YXIgcyA9IG5ldyBkaW1wbGUuc2VyaWVzKG15Q2hhcnQsIG51bGwsIHgsIHksIHosIGMsIG51bGwsIGRpbXBsZS5wbG90W2xheWVyLnR5cGVdLCBkaW1wbGUuYWdncmVnYXRlTWV0aG9kLmF2ZywgZGltcGxlLnBsb3RbbGF5ZXIudHlwZV0uc3RhY2tlZCk7CiAgICAgICAgCiAgICAgICAgLy9hcyBvZiB2MS4xLjQgZGltcGxlIGNhbiB1c2UgZGlmZmVyZW50IGRhdGFzZXQgZm9yIGVhY2ggc2VyaWVzCiAgICAgICAgLy8gZmFjZXRzIG5vdCBjdXJyZW50bHkgd29ya2luZyB3aXRoIGxheWVyIGRhdGE7IG5lZWQgdG8gY2hhbmdlIHN0cnVjdHVyZQogICAgICAgIC8vIGZvciBub3cganVzdCBhbGxvdyBvbmUgc291cmNlIG9mIGRhdGEKICAgICAgICBzLmRhdGEgPSBkYXRhOwogICAgICAgIC8qCiAgICAgICAgaWYobGF5ZXIuZGF0YSl7CiAgICAgICAgICAvL2NvbnZlcnQgdG8gYW4gYXJyYXkgb2Ygb2JqZWN0cwogICAgICAgICAgdmFyIHRlbXBkYXRhOwogICAgICAgICAgLy9hdm9pZCBsb2Rhc2ggZm9yIG5vdwogICAgICAgICAgZGF0YWtleXMgPSBkMy5rZXlzKGxheWVyLmRhdGEpCiAgICAgICAgICB0ZW1wZGF0YSA9IGxheWVyLmRhdGFbZGF0YWtleXNbMV1dLm1hcChmdW5jdGlvbihkLGkpewogICAgICAgICAgICB2YXIgdGVtcG9iaiA9IHt9CiAgICAgICAgICAgIGRhdGFrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KXsKICAgICAgICAgICAgICB0ZW1wb2JqW2tleV0gPSBsYXllci5kYXRhW2tleV1baV0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgcmV0dXJuIHRlbXBvYmoKICAgICAgICAgIH0pCiAgICAgICAgICBzLmRhdGEgPSB0ZW1wZGF0YTsKICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICAKICAgICAgICAvL2ZvciBtZWFzdXJlIGF4aXMgZGltcGxlIHNvcnRzIGF0IHRoZSBzZXJpZXMgbGV2ZWwgbm90IGF0IGF4aXMgbGV2ZWwKICAgICAgICBbJ3gnLCd5J10ubWFwKGZ1bmN0aW9uKGF4KXsKICAgICAgICAgIGlmKCBsYXllcltheCArICdBeGlzJ10udHlwZT09ImFkZE1lYXN1cmVBeGlzIiAmJiBsYXllcltheCArICdBeGlzJ10ub3JkZXJSdWxlICl7CiAgICAgICAgICAgIGlmKCB0eXBlb2YgbGF5ZXJbYXggKyAnQXhpcyddLm9yZGVyUnVsZSA9PSAic3RyaW5nIiApewogICAgICAgICAgICAgIHMuYWRkT3JkZXJSdWxlKCBsYXllcltheCArICdBeGlzJ10ub3JkZXJSdWxlICk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiBsYXllcltheCArICdBeGlzJ10ub3JkZXJSdWxlID09ICJvYmplY3QiICkgewogICAgICAgICAgICAgIHMuX29yZGVyUnVsZXMgPSBsYXllcltheCArICdBeGlzJ10ub3JkZXJSdWxlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBpZihsYXllci5oYXNPd25Qcm9wZXJ0eSgiZ3JvdXBzIikpIHsKICAgICAgICAgIHMuY2F0ZWdvcnlGaWVsZHMgPSAodHlwZW9mIGxheWVyLmdyb3VwcyA9PT0gIm9iamVjdCIpID8gbGF5ZXIuZ3JvdXBzIDogW2xheWVyLmdyb3Vwc107CiAgICAgICAgICAvL3NlcmllcyBvZmZlcnMgYW4gYWdncmVnYXRlIG1ldGhvZCB0aGF0IHdlIHdpbGwgYWxzbyBuZWVkIHRvIGNoZWNrIGlmIGF2YWlsYWJsZQogICAgICAgICAgLy9vcHRpb25zIGF2YWlsYWJsZSBhcmUgYXZnLCBjb3VudCwgbWF4LCBtaW4sIHN1bQogICAgICAgIH0KICAgICAgICBpZiAoISh0eXBlb2YobGF5ZXIuYWdncmVnYXRlKSA9PT0gJ3VuZGVmaW5lZCcpKSB7CiAgICAgICAgICBzLmFnZ3JlZ2F0ZSA9IGV2YWwobGF5ZXIuYWdncmVnYXRlKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEodHlwZW9mKGxheWVyLmxpbmVXZWlnaHQpID09PSAndW5kZWZpbmVkJykpIHsKICAgICAgICAgIHMubGluZVdlaWdodCA9IGxheWVyLmxpbmVXZWlnaHQ7CiAgICAgICAgfQogICAgICAgIGlmICghKHR5cGVvZihsYXllci5saW5lTWFya2VycykgPT09ICd1bmRlZmluZWQnKSkgewogICAgICAgICAgcy5saW5lTWFya2VycyA9IGxheWVyLmxpbmVNYXJrZXJzOwogICAgICAgIH0KICAgICAgICBpZiAoISh0eXBlb2YobGF5ZXIuYmFyR2FwKSA9PT0gJ3VuZGVmaW5lZCcpKSB7CiAgICAgICAgICBzLmJhckdhcCA9IGxheWVyLmJhckdhcDsKICAgICAgICB9ICAgIAogICAgICAgIGlmICghKHR5cGVvZihsYXllci5pbnRlcnBvbGF0aW9uKSA9PT0gJ3VuZGVmaW5lZCcpKSB7CiAgICAgICAgICBzLmludGVycG9sYXRpb24gPSBsYXllci5pbnRlcnBvbGF0aW9uOwogICAgICAgIH0gICAgIAogICAgICAgLyogaWYgKCEodHlwZW9mKGxheWVyLmV2ZW50SGFuZGxlcikgPT09ICd1bmRlZmluZWQnKSkgewogICAgICAgICAgbGF5ZXIuZXZlbnRIYW5kbGVyID0gKGxheWVyLmV2ZW50SGFuZGxlci5sZW5ndGggPT09ICJ1bmRlZmluZWQiKSA/IGxheWVyLmV2ZW50SGFuZGxlciA6IFtsYXllci5ldmVudEhhbmRsZXJdOwogICAgICAgICAgbGF5ZXIuZXZlbnRIYW5kbGVyLmZvckVhY2goZnVuY3Rpb24oZXZ0KXsKICAgICAgICAgICAgcy5hZGRFdmVudEhhbmRsZXIoZXZ0LmV2ZW50LCBldmFsKGV2dC5oYW5kbGVyKSkKICAgICAgICAgIH0pCiAgICAgICAgfSovCiAgICAgICAgICAKICAgICAgICBteUNoYXJ0LnNlcmllcy5wdXNoKHMpOwogICAgICAgIAogICAgICAgIC8qcGxhY2Vob2xkZXIgZml4IGRvbWFpbiBvZiBwcmltYXJ5IHNjYWxlIGZvciBuZXcgc2VyaWVzIGRhdGEKICAgICAgICAvL25vdCB3b3JraW5nIHJpZ2h0IG5vdyBidXQgc29tZXRoaW5nIGxpa2UgdGhpcwogICAgICAgIC8vZm9yIG5vdyBqdXN0IHVzZSBvdmVycmlkZU1pbiBhbmQgb3ZlcnJpZGVNYXggZnJvbSByQ2hhcnRzCiAgICAgICAgZm9yKCB2YXIgaSA9IDA7IGk8MjsgaSsrKSB7CiAgICAgICAgICBpZiAoIW15Q2hhcnQuYXhlc1tpXS5vdmVycmlkZU1pbikgewogICAgICAgICAgICBteUNoYXJ0LnNlcmllc1swXS5fYXhpc0JvdW5kcyhpPT0wPyJ4IjoieSIpLm1pbiA9IG15Q2hhcnQuc2VyaWVzWzBdLl9heGlzQm91bmRzKGk9PTA/IngiOiJ5IikubWluIDwgcy5fYXhpc0JvdW5kcyhpPT0wPyJ4IjoieSIpLm1pbiA/IG15Q2hhcnQuc2VyaWVzWzBdLl9heGlzQm91bmRzKGk9PTA/IngiOiJ5IikubWluIDogcy5fYXhpc0JvdW5kcyhpPT0wPyJ4IjoieSIpLm1pbjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghbXlDaGFydC5heGVzW2ldLm92ZXJyaWRlTWF4KSB7ICAKICAgICAgICAgICAgbXlDaGFydC5zZXJpZXNbMF0uX2F4aXNCb3VuZHMoaT09MD8ieCI6InkiKS5fbWF4ID0gbXlDaGFydC5zZXJpZXNbMF0uX2F4aXNCb3VuZHMoaT09MD8ieCI6InkiKS5tYXggPiBzLl9heGlzQm91bmRzKGk9PTA/IngiOiJ5IikubWF4ID8gbXlDaGFydC5zZXJpZXNbMF0uX2F4aXNCb3VuZHMoaT09MD8ieCI6InkiKS5tYXggOiBzLl9heGlzQm91bmRzKGk9PTA/IngiOiJ5IikubWF4OwogICAgICAgICAgfQogICAgICAgICAgbXlDaGFydC5heGVzW2ldLl91cGRhdGUoKTsKICAgICAgICB9CiAgICAgICAgKi8KICAgICAgICAKICAgICAgICByZXR1cm4gbXlDaGFydDsKICAgICAgfTsKICAgIAogICAgICAgIAogICAgICAvL2Z1bmN0aW9uIHRvIGJ1aWxkIGF4ZXMKICAgICAgZnVuY3Rpb24gYnVpbGRBeGlzKHBvc2l0aW9uLCBsYXllciwgbXlDaGFydCl7CiAgICAgICAgdmFyIGF4aXM7CiAgICAgICAgdmFyIGF4aXNvcHRzID0gb3B0c1twb3NpdGlvbisiQXhpcyJdOwogICAgICAgIAogICAgICAgIGlmKGF4aXNvcHRzLm1lYXN1cmUpIHsKICAgICAgICAgIGF4aXMgPSBteUNoYXJ0W2F4aXNvcHRzLnR5cGVdKHBvc2l0aW9uLGxheWVyW3Bvc2l0aW9uXSxheGlzb3B0cy5tZWFzdXJlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXhpcyA9IG15Q2hhcnRbYXhpc29wdHMudHlwZV0ocG9zaXRpb24sIGxheWVyW3Bvc2l0aW9uXSk7CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICBpZiAoYXhpc29wdHMudHlwZSA9PT0gImFkZFBjdEF4aXMiKSB7CiAgICAgICAgICBheGlzLnNob3dQZXJjZW50ID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXhpcy5zaG93UGVyY2VudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoYXhpc29wdHMub3JkZXJSdWxlKSBheGlzLmFkZE9yZGVyUnVsZShheGlzb3B0cy5vcmRlclJ1bGUpOwogICAgICAgIGlmIChheGlzb3B0cy5ncm91cG9yZGVyUnVsZSkgYXhpcy5hZGRHcm91cE9yZGVyUnVsZShheGlzb3B0cy5ncm91cG9yZGVyUnVsZSk7ICAKICAgICAgICBpZiAoYXhpc29wdHMuaW5wdXRGb3JtYXQpIGF4aXMuZGF0ZVBhcnNlRm9ybWF0ID0gYXhpc29wdHMuaW5wdXRGb3JtYXQ7CiAgICAgICAgaWYgKGF4aXNvcHRzLm91dHB1dEZvcm1hdCkgYXhpcy50aWNrRm9ybWF0ID0gYXhpc29wdHMub3V0cHV0Rm9ybWF0OyAgICAgICAgCiAgICAgICAgT2JqZWN0LmtleXMoYXhpc29wdHMpLmZpbHRlcihmdW5jdGlvbihva3kpewogICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgIm1lYXN1cmUiLCJ0eXBlIiwib3JkZXJSdWxlIiwiZ3JvdXBvcmRlclJ1bGUiLAogICAgICAgICAgICAib3V0cHV0Rm9ybWF0IiwiaW5wdXRGb3JtYXQiCiAgICAgICAgICBdLmluZGV4T2Yob2t5KSA8IDAKICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uKG9reSl7CiAgICAgICAgICBheGlzW29reV0gPSBheGlzb3B0c1tva3ldCiAgICAgICAgfSkKICAgICAgICByZXR1cm4gYXhpczsKICAgICAgfTsKICAgICAgICAgIAogICAgICAgICAgCiAgICAKICAgICAgLy9pZiBmYWNldCBub3QgcHJvdmlkZWQgZm9yIHggb3IgeSBtYWtlIER1bW15IHZhcmlhYmxlCiAgICAgIC8vaGFuZGxlIE5VTEwgZmFjZXQKICAgICAgaWYgKHR5cGVvZiBvcHRzLmZhY2V0ID09ICJ1bmRlZmluZWQiKSBvcHRzLmZhY2V0ID0ge30KICAgICAgb3B0cy5mYWNldC54ID0gb3B0cy5mYWNldC54ID8gb3B0cy5mYWNldC54IDogIkR1bW15IgogICAgICBvcHRzLmZhY2V0LnkgPSBvcHRzLmZhY2V0LnkgPyBvcHRzLmZhY2V0LnkgOiAiRHVtbXkiICAgIAogICAgICBpZihvcHRzLmZhY2V0LnggPT09ICJEdW1teSIgfHwgb3B0cy5mYWNldC55ID09PSAiRHVtbXkiKSB7CiAgICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGQpewogICAgICAgICAgZC5EdW1teSA9IDE7CiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIHZhciByb3dzID0gZDMuc2V0KGRhdGEubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBkW29wdHMuZmFjZXQueV19KSkudmFsdWVzKCk7CiAgICAgIHZhciBucm93ID0gb3B0cy5mYWNldC5ucm93ID8gb3B0cy5mYWNldC5ucm93IDogcm93cy5sZW5ndGg7CiAgICAgIHZhciBjb2xzID0gZDMuc2V0KGRhdGEubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBkW29wdHMuZmFjZXQueF19KSkudmFsdWVzKCkKICAgICAgdmFyIG5jb2wgPSBvcHRzLmZhY2V0Lm5jb2wgPyBvcHRzLmZhY2V0Lm5jb2wgOiBjb2xzLmxlbmd0aDsKICAgICAgCiAgICAgIHZhciB0dXBsZXMgPSBkMy5tZXJnZShyb3dzLm1hcChmdW5jdGlvbihyb3csaXJvdyl7cmV0dXJuIGNvbHMubWFwKGZ1bmN0aW9uKGNvbCxpY29sKXtyZXR1cm4ge2tleTpyb3cgKyAifiIgKyBjb2wsIHZhbHVlczogeyJyb3ciOmlyb3csICJjb2wiOmljb2x9IH19KX0pKQogICAgICAgIAogICAgCiAgICAgIHZhciBzdmdHcmlkID0gZDMuc2VsZWN0KCIjIiArIGVsLmlkKS5hcHBlbmQoInN2ZyIpCiAgICAgICAgLnN0eWxlKCJ3aWR0aCIsIG9wdHMud2lkdGggPyBvcHRzLndpZHRoIDogIjEwMCUiKQogICAgICAgIC5zdHlsZSgiaGVpZ2h0Iiwgb3B0cy5oZWlnaHQgPyBvcHRzLmhlaWdodCA6ICI5MCUiICk7CiAgICAgICAvLyAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSg1MCwwKSIpOwogICAgICAgCiAgICAgIHZhciBncmlkID0gZDMubGF5b3V0LmdyaWQoKQogICAgICAgIC5yb3dzKCBucm93ICkKICAgICAgICAuY29scyggbmNvbCApCiAgICAgICAgLnNpemUoWyBvcHRzLndpZHRoID8gb3B0cy53aWR0aCA6IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICogMC45LCBvcHRzLmhlaWdodD8gb3B0cy5oZWlnaHQgOiBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgKiAwLjkgLSAzMF0pCiAgICAgICAgLmJhbmRzKCk7ICAgIAogICAgCiAgICAgIGdyaWQodHVwbGVzKTsKICAgIAogICAgICB0dXBsZXMuZm9yRWFjaChmdW5jdGlvbihjZWxsLGNlbGxudW0pIHsKCiAgICAgICAgdmFyIGZpbHRlcmVkRGF0YSA9IGRpbXBsZS5maWx0ZXJEYXRhKGRhdGEsIG9wdHMuZmFjZXQueCwgY2VsbC5rZXkuc3BsaXQoJ34nKVsxXSk7CiAgICAgICAgZmlsdGVyZWREYXRhID0gZGltcGxlLmZpbHRlckRhdGEoZmlsdGVyZWREYXRhLCBvcHRzLmZhY2V0LnksIGNlbGwua2V5LnNwbGl0KCd+JylbMF0pOyAgICAKICAgICAgICAKICAgICAgICAvLyBEcmF3IGEgbmV3IGNoYXJ0IHdoaWNoIHdpbGwgZ28gaW4gdGhlIGN1cnJlbnQgc2hhcGUKICAgICAgICB2YXIgc3ViQ2hhcnQgPSBuZXcgZGltcGxlLmNoYXJ0KHN2Z0dyaWQsIGZpbHRlcmVkRGF0YSk7CgogICAgICAgIGlmICh0dXBsZXMubGVuZ3RoID4gMSl7CiAgICAgICAgICAvLyBQb3NpdGlvbiB0aGUgY2hhcnQgaW5zaWRlIHRoZSBzaGFwZQogICAgICAgICAgc3ViQ2hhcnQuaGVpZ2h0ID0gZ3JpZC5ub2RlU2l6ZSgpWzFdCiAgICAgICAgICBzdWJDaGFydC53aWR0aCA9IGdyaWQubm9kZVNpemUoKVswXSAgICAgIAogICAgICAgICAgCiAgICAgICAgICBpZiAob3B0cy5tYXJnaW5zKSB7CiAgICAgICAgICAgIHN1YkNoYXJ0LnNldEJvdW5kcygKICAgICAgICAgICAgICBwYXJzZUZsb2F0KGNlbGwueCkgKyBvcHRzLm1hcmdpbnMubGVmdCwKICAgICAgICAgICAgICBwYXJzZUZsb2F0KGNlbGwueSkgKyBvcHRzLm1hcmdpbnMudG9wLAogICAgICAgICAgICAgIHN1YkNoYXJ0LndpZHRoIC0gb3B0cy5tYXJnaW5zLnJpZ2h0LSBvcHRzLm1hcmdpbnMubGVmdCwKICAgICAgICAgICAgICBzdWJDaGFydC5oZWlnaHQgLSBvcHRzLm1hcmdpbnMudG9wIC0gb3B0cy5tYXJnaW5zLmJvdHRvbQogICAgICAgICAgICApCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdWJDaGFydC5zZXRCb3VuZHMoCiAgICAgICAgICAgICAgcGFyc2VGbG9hdChjZWxsLngpICsgKDMwICogKCBuY29sID09IDEgPyAxLjUgOiAxICkpLCAKICAgICAgICAgICAgICBwYXJzZUZsb2F0KGNlbGwueSkgKyAoMjAgKiAoIG5yb3cgPT0gMSA/IDEuNSA6IDIgKSksCiAgICAgICAgICAgICAgcGFyc2VGbG9hdChncmlkLm5vZGVTaXplKClbMF0pIC0gKDMwICogKCBuY29sID09IDEgPyAxLjI1IDogMiApKSwKICAgICAgICAgICAgICBwYXJzZUZsb2F0KGdyaWQubm9kZVNpemUoKVsxXSkgLSAoMjAgKiAoIG5yb3cgPT0gMSA/IDMgOiAyLjUgKSkKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgIH0gZWxzZSB7IC8vb25seSBvbmUgY2hhcnQKICAgICAgICAgIGlmIChvcHRzLmJvdW5kcykgewogICAgICAgICAgICBzdWJDaGFydC5zZXRCb3VuZHMob3B0cy5ib3VuZHMueCwgb3B0cy5ib3VuZHMueSwgb3B0cy5ib3VuZHMud2lkdGgsIG9wdHMuYm91bmRzLmhlaWdodCk7Ly9teUNoYXJ0LnNldEJvdW5kcyg4MCwgMzAsIDQ4MCwgMzMwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9kaW1wbGUgYWxsb3dzIHVzZSBvZiBjdXN0b20gQ1NTIHdpdGggbm9Gb3JtYXRzCiAgICAgICAgaWYob3B0cy5ub0Zvcm1hdHMpIHsgc3ViQ2hhcnQubm9Gb3JtYXRzID0gb3B0cy5ub0Zvcm1hdHM7IH07CiAgICAgICAgCiAgICAgICAgLy9uZWVkIHRvIGZpeCBsYXRlciBmb3IgYmV0dGVyIGNvbG9yQXhpcyBzdXBwb3J0CiAgICAgICAgaWYoZDMua2V5cyhvcHRzLmNvbG9yQXhpcykubGVuZ3RoID4gMCkgewogICAgICAgICAgYyA9IHN1YkNoYXJ0W29wdHMuY29sb3JBeGlzLnR5cGVdKG9wdHMuY29sb3JBeGlzLmNvbG9yU2VyaWVzLG9wdHMuY29sb3JBeGlzLnBhbGV0dGUpIDsKICAgICAgICAgIGlmKG9wdHMuY29sb3JBeGlzLm91dHB1dEZvcm1hdCl7CiAgICAgICAgICAgIGMudGlja0Zvcm1hdCA9IG9wdHMuY29sb3JBeGlzLm91dHB1dEZvcm1hdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIAogICAgICAgIC8vYWRkIHRoZSBjb2xvcnMgZnJvbSB0aGUgYXJyYXkgaW50byB0aGUgY2hhcnQncyBkZWZhdWx0Q29sb3JzCiAgICAgICAgaWYgKHR5cGVvZiBkZWZhdWx0Q29sb3JzQXJyYXkgIT0gInVuZGVmaW5lZCIpewogICAgICAgICAgc3ViQ2hhcnQuZGVmYXVsdENvbG9ycyA9IGRlZmF1bHRDb2xvcnNBcnJheS5tYXAoZnVuY3Rpb24oZCkgewogICAgICAgICAgICByZXR1cm4gbmV3IGRpbXBsZS5jb2xvcihkKTsKICAgICAgICAgIH0pOyAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgc3ViQ2hhcnQuX2Fzc2lnbmVkQ29sb3JzID0gYXNzaWduZWRDb2xvcnM7CiAgICAgICAgCiAgICAgICAgc3ViQ2hhcnQgPSBidWlsZFNlcmllcyhvcHRzLCBmYWxzZSwgc3ViQ2hhcnQsIGZpbHRlcmVkRGF0YSk7CiAgICAgICAgaWYgKG9wdHMubGF5ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIG9wdHMubGF5ZXJzLmZvckVhY2goZnVuY3Rpb24obGF5ZXIpewogICAgICAgICAgICBzdWJDaGFydCA9IGJ1aWxkU2VyaWVzKGxheWVyLCB0cnVlLCBzdWJDaGFydCwgZmlsdGVyZWREYXRhKTsKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAKICAgICAgICAvL3Vuc3VyZSBpZiB0aGlzIGlzIGJlc3QgYnV0IGlmIGxlZ2VuZCBpcyBwcm92aWRlZCAobm90IGVtcHR5KSB0aGVuIGV2YWx1YXRlCiAgICAgICAgLy8gYWxzbyBvbmx5IHdhbnQgb25lIGxlZ2VuZCBzbyBvbmx5IHNldCBmb3IgY2VsbG51bSA9IDAKICAgICAgICBpZihkMy5rZXlzKG9wdHMubGVnZW5kKS5sZW5ndGggPiAwICYmIGNlbGxudW0gPT0gMCkgewogICAgICAgICAgdmFyIGwgPXN1YkNoYXJ0LmFkZExlZ2VuZCgpOwogICAgICAgICAgZDMua2V5cyhvcHRzLmxlZ2VuZCkuZm9yRWFjaChmdW5jdGlvbihkKXsKICAgICAgICAgICAgbFtkXSA9IG9wdHMubGVnZW5kW2RdOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vcXVpY2sgd2F5IHRvIGdldCB0aGlzIGdvaW5nIGJ1dCBuZWVkIHRvIG1ha2UgdGhpcyBjbGVhbmVyCiAgICAgICAgaWYob3B0cy5zdG9yeWJvYXJkKSB7CiAgICAgICAgICBzdWJDaGFydC5zZXRTdG9yeWJvYXJkKG9wdHMuc3Rvcnlib2FyZCk7CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICAvL2NhdGNoIGFsbCBmb3Igb3RoZXIgb3B0aW9ucwogICAgICAgIC8vdGhlc2UgY2FuIGJlIHByb3ZpZGVkIGJ5IGRNeUNoYXJ0JGNoYXJ0KCAuLi4gKQogICAgICAgIC8ve3t7IGNoYXJ0IH19fSAgCiAgICAgICAgCiAgICAgICAgLy9hZGQgZmFjZXQgcm93IGFuZCBjb2x1bW4gaW4gY2FzZSB3ZSBuZWVkIGxhdGVyCiAgICAgICAgc3ViQ2hhcnQuZmFjZXRwb3NpdGlvbiA9IGNlbGwudmFsdWVzOwogICAgICAgIAogICAgICAgIC8vIHVuZG9jdW1lbnRlZCBob29rIHRvIHJ1biBsYXN0IG1pbnV0ZSBjaGFydCBjb2RlCiAgICAgICAgLy8gIGFsbG93IGZ1bmN0aW9ucyB1c2luZyBodG1sd2lkZ2V0czo6SlMKICAgICAgICBpZiggdHlwZW9mIG9wdHMuY2hhcnQgIT09ICJ1bmRlZmluZWQiICkgewogICAgICAgICAgaWYoIG9wdHMuY2hhcnQubGVuZ3RoID09IDAgKSBvcHRzLmNoYXJ0ID0gW29wdHMuY2hhcnRdCiAgICAgICAgICBvcHRzLmNoYXJ0LmZvckVhY2goZnVuY3Rpb24oYyl7CiAgICAgICAgICAgIGlmKHR5cGVvZiBjID09ICJmdW5jdGlvbiIpewogICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gYWx0ZXJlZCBjaGFydAogICAgICAgICAgICAgIHN1YkNoYXJ0ID0gYy5jYWxsKHN1YkNoYXJ0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc3ViQ2hhcnRzLnB1c2goc3ViQ2hhcnQpOwogICAgICB9KQogICAgCiAgICAgIHN1YkNoYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uKHN1YkNoYXJ0KSB7CiAgICAgICAgc3ViQ2hhcnQuZHJhdygpOwogICAgICB9KQogICAgICAKICAgICAgLy9nZXQgcmlkIG9mIGFsbCB5IGZvciB0aG9zZSBub3QgaW4gY29sdW1uIDEKICAgICAgLy9jYW4gZWFzaWx5IGN1c3RvbWl6ZSB0aGlzIHRvIG9ubHkgcmVtb3ZlIGJpdHMgYW5kIHBpZWNlcwogICAgICBpZihvcHRzLmZhY2V0LnJlbW92ZUF4ZXMpIHsKICAgICAgICBbIngiLCJ5IiwieiJdLmZvckVhY2goZnVuY3Rpb24ocG9zaXRpb24pewogICAgICAgICAgLy93b3JrIG9uIGF4aXMgc2NhbGluZwogICAgICAgICAgLy9hc3N1bWUgaWYgcmVtb3ZlIHRoZW4gc2FtZSBzY2FsZXMgZm9yIGFsbCBjaGFydHMKICAgICAgICAgIGF4aXNkb21haW4gPSBbXTsgICAgICAKICAgICAgICAgIHN1YkNoYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uKHN1YkNoYXJ0KXsKICAgICAgICAgICAgc3ViQ2hhcnQuYXhlcy5mb3JFYWNoKGZ1bmN0aW9uKGF4aXMpewogICAgICAgICAgICAgIGlmIChheGlzLnBvc2l0aW9uID09PSBwb3NpdGlvbiAmJiAhYXhpcy5faGFzQ2F0ZWdvcmllcygpKXsKICAgICAgICAgICAgICAgIGF4aXNkb21haW4ucHVzaChheGlzLl9zY2FsZS5kb21haW4oKSkKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgICB9KTsKICAgICAgICAgIGF4aXNkb21haW4gPSBkMy5leHRlbnQoW10uY29uY2F0LmFwcGx5KFtdLCBheGlzZG9tYWluKSk7CiAgICAgICAgICBzdWJDaGFydHMuZm9yRWFjaChmdW5jdGlvbihzdWJDaGFydCl7CiAgICAgICAgICAgIHN1YkNoYXJ0LmF4ZXMuZm9yRWFjaChmdW5jdGlvbihheGlzKXsKICAgICAgICAgICAgICBpZiAoYXhpcy5wb3NpdGlvbiA9PT0gcG9zaXRpb24gJiYgIWF4aXMuX2hhc0NhdGVnb3JpZXMoKSl7CiAgICAgICAgICAgICAgICBheGlzLm92ZXJyaWRlTWluID0gYXhpc2RvbWFpblswXTsKICAgICAgICAgICAgICAgIGF4aXMub3ZlcnJpZGVNYXggPSBheGlzZG9tYWluWzFdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgc3ViQ2hhcnQuZHJhdyhudWxsLHRydWUpCiAgICAgICAgICB9KTsKICAgICAgICB9KQogICAgICAgIAogICAgICAgIC8vZXZhbHVhdGUgd2hpY2ggZG8gbm90IGZhbGwgaW4gY29sdW1uIDEgb3Igcm93IDEgdG8gcmVtb3ZlCiAgICAgICAgdmFyIHhwb3MgPSBkMy5leHRlbnQoc3ViQ2hhcnRzLGZ1bmN0aW9uKGQpe3JldHVybiBkLnh9KTsKICAgICAgICB2YXIgeXBvcyA9IGQzLmV4dGVudChzdWJDaGFydHMsZnVuY3Rpb24oZCl7cmV0dXJuIGQueX0pOyAgICAKICAgICAgICBzdWJDaGFydHMuZmlsdGVyKGZ1bmN0aW9uKGQpewogICAgICAgICAgcmV0dXJuIGQueCE9eHBvc1swXTsKICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uKGQpewogICAgICAgICAgZC5zZXJpZXNbMF0uX2Ryb3BMaW5lT3JpZ2luID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgcmV0dXJuIHsieCIgOiB4cG9zWzBdLCJ5IiA6IHlwb3NbMV0gKyBkLl9oZWlnaHRQaXhlbHMoKX0KICAgICAgICAgIH0KICAgICAgICAgIGQuYXhlcy5mb3JFYWNoKGZ1bmN0aW9uKGF4aXMpewogICAgICAgICAgICBpZiAoYXhpcy5wb3NpdGlvbiA9PT0gInkiKXsKICAgICAgICAgICAgICAvL2xlYXZlIHRoZXJlIGZvciByZWZlcmVuY2UgYnV0IHNldCBvcGFjaXR5IDAKICAgICAgICAgICAgICBpZiAoYXhpcy5zaGFwZXMpIGF4aXMuc2hhcGVzLnN0eWxlKCJvcGFjaXR5IiwwKTsKICAgICAgICAgICAgICBpZiAoYXhpcy50aXRsZVNoYXBlKSBheGlzLnRpdGxlU2hhcGUuc3R5bGUoIm9wYWNpdHkiLDApOwogICAgICAgICAgICB9CiAgICAgICAgICB9KQogICAgICAgIH0pOwogICAgICAgIC8vbm93IHggZm9yIHRob3NlIG5vdCBpbiByb3cgMQogICAgICAgIHN1YkNoYXJ0cy5maWx0ZXIoZnVuY3Rpb24oZCl7CiAgICAgICAgICByZXR1cm4gZC55IT15cG9zWzFdOwogICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24oZCl7CiAgICAgICAgICBkLnNlcmllc1swXS5fZHJvcExpbmVPcmlnaW4gPSBmdW5jdGlvbigpewogICAgICAgICAgICByZXR1cm4geyJ4IiA6IHhwb3NbMF0sInkiIDogeXBvc1sxXSArIGQuX2hlaWdodFBpeGVscygpfQogICAgICAgICAgfSAgICAgICAgCiAgICAgICAgICBkLmF4ZXMuZm9yRWFjaChmdW5jdGlvbihheGlzKXsKICAgICAgICAgICAgaWYgKGF4aXMucG9zaXRpb24gPT09ICJ4Iil7CiAgICAgICAgICAgICAgLy9sZWF2ZSB0aGVyZSBmb3IgcmVmZXJlbmNlIGJ1dCBzZXQgb3BhY2l0eSAwCiAgICAgICAgICAgICAgaWYgKGF4aXMuc2hhcGVzKSBheGlzLnNoYXBlcy5zdHlsZSgib3BhY2l0eSIsMCk7CiAgICAgICAgICAgICAgaWYgKGF4aXMudGl0bGVTaGFwZSkgYXhpcy50aXRsZVNoYXBlLnN0eWxlKCJvcGFjaXR5IiwwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSkKICAgICAgICB9KTsKICAgICAgfQogICAgcmV0dXJuIHN1YkNoYXJ0czsKICAgIH0KICB9Cn0pCg=="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
<div id="htmlwidget-2702" style="width:600px;height:380px;" class="dimple"></div>
</div>
<script type="application/json" data-for="htmlwidget-2702">{"x":{"options":{"chart":[],"xAxis":{"type":"addCategoryAxis"},"yAxis":{"type":"addMeasureAxis","overrideMin":2},"zAxis":[],"colorAxis":[],"defaultColors":[],"layers":[],"legend":{"x":"45%","y":"0","width":"45%","height":"10%","horizontalAlign":"right"},"x":"Sepal.Length","y":"Sepal.Width","type":"bubble","groups":"Species"},"data":{"Sepal.Length":[5.1,4.9,4.7,4.6,5,5.4,4.6,5,4.4,4.9,5.4,4.8,4.8,4.3,5.8,5.7,5.4,5.1,5.7,5.1,5.4,5.1,4.6,5.1,4.8,5,5,5.2,5.2,4.7,4.8,5.4,5.2,5.5,4.9,5,5.5,4.9,4.4,5.1,5,4.5,4.4,5,5.1,4.8,5.1,4.6,5.3,5,7,6.4,6.9,5.5,6.5,5.7,6.3,4.9,6.6,5.2,5,5.9,6,6.1,5.6,6.7,5.6,5.8,6.2,5.6,5.9,6.1,6.3,6.1,6.4,6.6,6.8,6.7,6,5.7,5.5,5.5,5.8,6,5.4,6,6.7,6.3,5.6,5.5,5.5,6.1,5.8,5,5.6,5.7,5.7,6.2,5.1,5.7,6.3,5.8,7.1,6.3,6.5,7.6,4.9,7.3,6.7,7.2,6.5,6.4,6.8,5.7,5.8,6.4,6.5,7.7,7.7,6,6.9,5.6,7.7,6.3,6.7,7.2,6.2,6.1,6.4,7.2,7.4,7.9,6.4,6.3,6.1,7.7,6.3,6.4,6,6.9,6.7,6.9,5.8,6.8,6.7,6.7,6.3,6.5,6.2,5.9],"Sepal.Width":[3.5,3,3.2,3.1,3.6,3.9,3.4,3.4,2.9,3.1,3.7,3.4,3,3,4,4.4,3.9,3.5,3.8,3.8,3.4,3.7,3.6,3.3,3.4,3,3.4,3.5,3.4,3.2,3.1,3.4,4.1,4.2,3.1,3.2,3.5,3.6,3,3.4,3.5,2.3,3.2,3.5,3.8,3,3.8,3.2,3.7,3.3,3.2,3.2,3.1,2.3,2.8,2.8,3.3,2.4,2.9,2.7,2,3,2.2,2.9,2.9,3.1,3,2.7,2.2,2.5,3.2,2.8,2.5,2.8,2.9,3,2.8,3,2.9,2.6,2.4,2.4,2.7,2.7,3,3.4,3.1,2.3,3,2.5,2.6,3,2.6,2.3,2.7,3,2.9,2.9,2.5,2.8,3.3,2.7,3,2.9,3,3,2.5,2.9,2.5,3.6,3.2,2.7,3,2.5,2.8,3.2,3,3.8,2.6,2.2,3.2,2.8,2.8,2.7,3.3,3.2,2.8,3,2.8,3,2.8,3.8,2.8,2.8,2.6,3,3.4,3.1,3,3.1,3.1,3.1,2.7,3.2,3.3,3,2.5,3,3.4,3],"Petal.Length":[1.4,1.4,1.3,1.5,1.4,1.7,1.4,1.5,1.4,1.5,1.5,1.6,1.4,1.1,1.2,1.5,1.3,1.4,1.7,1.5,1.7,1.5,1,1.7,1.9,1.6,1.6,1.5,1.4,1.6,1.6,1.5,1.5,1.4,1.5,1.2,1.3,1.4,1.3,1.5,1.3,1.3,1.3,1.6,1.9,1.4,1.6,1.4,1.5,1.4,4.7,4.5,4.9,4,4.6,4.5,4.7,3.3,4.6,3.9,3.5,4.2,4,4.7,3.6,4.4,4.5,4.1,4.5,3.9,4.8,4,4.9,4.7,4.3,4.4,4.8,5,4.5,3.5,3.8,3.7,3.9,5.1,4.5,4.5,4.7,4.4,4.1,4,4.4,4.6,4,3.3,4.2,4.2,4.2,4.3,3,4.1,6,5.1,5.9,5.6,5.8,6.6,4.5,6.3,5.8,6.1,5.1,5.3,5.5,5,5.1,5.3,5.5,6.7,6.9,5,5.7,4.9,6.7,4.9,5.7,6,4.8,4.9,5.6,5.8,6.1,6.4,5.6,5.1,5.6,6.1,5.6,5.5,4.8,5.4,5.6,5.1,5.1,5.9,5.7,5.2,5,5.2,5.4,5.1],"Petal.Width":[0.2,0.2,0.2,0.2,0.2,0.4,0.3,0.2,0.2,0.1,0.2,0.2,0.1,0.1,0.2,0.4,0.4,0.3,0.3,0.3,0.2,0.4,0.2,0.5,0.2,0.2,0.4,0.2,0.2,0.2,0.2,0.4,0.1,0.2,0.2,0.2,0.2,0.1,0.2,0.2,0.3,0.3,0.2,0.6,0.4,0.3,0.2,0.2,0.2,0.2,1.4,1.5,1.5,1.3,1.5,1.3,1.6,1,1.3,1.4,1,1.5,1,1.4,1.3,1.4,1.5,1,1.5,1.1,1.8,1.3,1.5,1.2,1.3,1.4,1.4,1.7,1.5,1,1.1,1,1.2,1.6,1.5,1.6,1.5,1.3,1.3,1.3,1.2,1.4,1.2,1,1.3,1.2,1.3,1.3,1.1,1.3,2.5,1.9,2.1,1.8,2.2,2.1,1.7,1.8,1.8,2.5,2,1.9,2.1,2,2.4,2.3,1.8,2.2,2.3,1.5,2.3,2,2,1.8,2.1,1.8,1.8,1.8,2.1,1.6,1.9,2,2.2,1.5,1.4,2.3,2.4,1.8,1.8,2.1,2.4,2.3,1.9,2.3,2.5,2.3,1.9,2,2.3,1.8],"Species":["setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","setosa","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","versicolor","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica","virginica"]}},"evals":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-2702">{"viewer":{"width":600,"height":380,"padding":15,"fill":false},"browser":{"width":600,"height":380,"padding":40,"fill":false}}</script>
</body>
</html>