mirror of
https://github.com/501351981/vue-office.git
synced 2025-07-15 07:32:19 +08:00
2 lines
3.2 MiB
2 lines
3.2 MiB
var W=Object.defineProperty;var V=(Z,I,g)=>I in Z?W(Z,I,{enumerable:!0,configurable:!0,writable:!0,value:g}):Z[I]=g;var c=(Z,I,g)=>(V(Z,typeof I!="symbol"?I+"":I,g),g);import{l as y,g as Y,d as u}from"./url-de9b02cf.js";import{o as i}from"./omit-90366a56.js";/* empty css */import{r as L,o as N,a as h,c as R}from"./index-53845faa.js";const x="KCgpPT57InVzZSBzdHJpY3QiO3ZhciBlPXs3NzU3OihlLHQscik9Pnt2YXIgbixhO2Z1bmN0aW9uIGkoZSx0LHIpe3JldHVybih0PWZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKGUsdCl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gZTt2YXIgcj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIG49ci5jYWxsKGUsInN0cmluZyIpO2lmKCJvYmplY3QiIT10eXBlb2YgbilyZXR1cm4gbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybiBTdHJpbmcoZSl9KGUpO3JldHVybiJzeW1ib2wiPT10eXBlb2YgdD90OlN0cmluZyh0KX0odCkpaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1yLGV9ZnVuY3Rpb24gcyhlLHQpe2woZSx0KSx0LmFkZChlKX1mdW5jdGlvbiBvKGUsdCxyKXtpZighdC5oYXMoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZSIpO3JldHVybiByfWZ1bmN0aW9uIGMoZSx0LHIpe2woZSx0KSx0LnNldChlLHIpfWZ1bmN0aW9uIGwoZSx0KXtpZih0LmhhcyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgc2FtZSBwcml2YXRlIGVsZW1lbnRzIHR3aWNlIG9uIGFuIG9iamVjdCIpfWZ1bmN0aW9uIGgoZSx0KXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5nZXQ/dC5nZXQuY2FsbChlKTp0LnZhbHVlfShlLGQoZSx0LCJnZXQiKSl9ZnVuY3Rpb24gdShlLHQscil7cmV0dXJuIGZ1bmN0aW9uKGUsdCxyKXtpZih0LnNldCl0LnNldC5jYWxsKGUscik7ZWxzZXtpZighdC53cml0YWJsZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJhdHRlbXB0ZWQgdG8gc2V0IHJlYWQgb25seSBwcml2YXRlIGZpZWxkIik7dC52YWx1ZT1yfX0oZSxkKGUsdCwic2V0Iikscikscn1mdW5jdGlvbiBkKGUsdCxyKXtpZighdC5oYXMoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvICIrcisiIHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlIik7cmV0dXJuIHQuZ2V0KGUpfXIoNTgzNykscigxNzAzKSxyKDk1NzUpLHIoMjQ3Mikscig4Njc1KSxyKDMxMDUpLHIoMzQwOCkscigyOTU4KSxyKDM0NjIpLHIoMzgyNCkscigyOTc0KSxyKDE0MzkpLHIoNzU4NSkscig1MzE1KSxyKDM5NDgpLHIoNzY1OCkscig4Njc0KSxyKDc3MjcpLHIoNDk0NCkscigzNzkyKSxyKDk3MTQpLHIoMTU1MCkscig0OTE2KSxyKDMxMjMpLHIoMTgxNykscig0NzIzKSxyKDYzMTQpLHIoNTMwNikscig3NjAxKSxyKDEyOTkpLHIoNzYzNSkscig4MjY0KSxyKDcyODcpLHIoOTc0MykscigyNzA3KSxyKDU1ODEpLHIoNzE0NSkscig2Njk5KSxyKDIwMjMpLHIoNjc1NSkscigyODUpLHIoMTYzNykscig2MjI5KSxyKDczMzApLHIoMjA2Mikscig4NzU3KSxyKDkxMzUpLHIoNDEyOSkscig2OTc3KSxyKDEwNTgpLHIoNDYwMykscig4NDUwKSxyKDQ2NzgpLHIoOTYwMSkscigyMjYyKSxyKDIwODcpLHIoNTQxKSxyKDMyMTApLHIoNTgyNykscig1NDM4KSxyKDgyNTUpLHIoNDE5Nykscig1MTI1KSxyKDQ1MDYpLHIoNTEwOSkscig2NDk1KSxyKDg4NjIpLHIoNzg1Mikscig3NzE0KSxyKDI4MDEpLHIoMTE3NCkscig3OTIyKSxlPXIuaG1kKGUpLG49Z2xvYmFsVGhpcyxhPSgpPT4oKCk9Pnt2YXIgZT1bLChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Xb3JrZXJUYXNrPXQuV29ya2VyTWVzc2FnZUhhbmRsZXI9dm9pZCAwLHIoMikscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpLHIoMTE2KSxyKDEyNikscigxMjgpLHIoMTMxKSxyKDEzMykscigxMzUpLHIoMTM3KSxyKDEzOSkscigxNDMpO3ZhciBuPXIoMTQ0KSxhPXIoMTQ5KSxpPXIoMTUwKSxzPXIoMTUyKSxvPXIoMTU2KSxjPXIoMjIyKSxsPXIoMjE2KSxoPXIoMjU3KSx1PXIoMjU4KTtjbGFzcyBke2NvbnN0cnVjdG9yKGUpe3RoaXMubmFtZT1lLHRoaXMudGVybWluYXRlZD0hMSx0aGlzLl9jYXBhYmlsaXR5PW5ldyBuLlByb21pc2VDYXBhYmlsaXR5fWdldCBmaW5pc2hlZCgpe3JldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2V9ZmluaXNoKCl7dGhpcy5fY2FwYWJpbGl0eS5yZXNvbHZlKCl9dGVybWluYXRlKCl7dGhpcy50ZXJtaW5hdGVkPSEwfWVuc3VyZU5vdFRlcm1pbmF0ZWQoKXtpZih0aGlzLnRlcm1pbmF0ZWQpdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgdGFzayB3YXMgdGVybWluYXRlZCIpfX10LldvcmtlclRhc2s9ZDtjbGFzcyBme3N0YXRpYyBzZXR1cChlLHQpe2xldCByPSExO2Uub24oInRlc3QiLChmdW5jdGlvbih0KXtyfHwocj0hMCxlLnNlbmQoInRlc3QiLHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSl9KSksZS5vbigiY29uZmlndXJlIiwoZnVuY3Rpb24oZSl7KDAsbi5zZXRWZXJib3NpdHlMZXZlbCkoZS52ZXJib3NpdHkpfSkpLGUub24oIkdldERvY1JlcXVlc3QiLChmdW5jdGlvbihlKXtyZXR1cm4gZi5jcmVhdGVEb2N1bWVudEhhbmRsZXIoZSx0KX0pKX1zdGF0aWMgY3JlYXRlRG9jdW1lbnRIYW5kbGVyKGUsdCl7bGV0IHIsZj0hMSxnPW51bGw7Y29uc3QgcD1uZXcgU2V0LG09KDAsbi5nZXRWZXJib3NpdHlMZXZlbCkoKSx7ZG9jSWQ6YixhcGlWZXJzaW9uOnl9PWUsdz0iMy45LjE3OSI7aWYoeSE9PXcpdGhyb3cgbmV3IEVycm9yKCdUaGUgQVBJIHZlcnNpb24gIicuY29uY2F0KHksJyIgZG9lcyBub3QgbWF0Y2ggdGhlIFdvcmtlciB2ZXJzaW9uICInKS5jb25jYXQodywnIi4nKSk7Y29uc3Qgdj1bXTtmb3IoY29uc3QgZSBpbltdKXYucHVzaChlKTtpZih2Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBgQXJyYXkucHJvdG90eXBlYCBjb250YWlucyB1bmV4cGVjdGVkIGVudW1lcmFibGUgcHJvcGVydGllczogIit2LmpvaW4oIiwgIikrIjsgdGh1cyBicmVha2luZyBlLmcuIGBmb3IuLi5pbmAgaXRlcmF0aW9uIG9mIGBBcnJheWBzLiIpO2NvbnN0IHg9YisiX3dvcmtlciI7bGV0IFM9bmV3IGguTWVzc2FnZUhhbmRsZXIoeCxiLHQpO2Z1bmN0aW9uIEEoKXtpZihmKXRocm93IG5ldyBFcnJvcigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkIil9ZnVuY3Rpb24gayhlKXtwLmFkZChlKX1mdW5jdGlvbiBDKGUpe2UuZmluaXNoKCkscC5kZWxldGUoZSl9YXN5bmMgZnVuY3Rpb24gTyhlKXthd2FpdCByLmVuc3VyZURvYygiY2hlY2tIZWFkZXIiKSxhd2FpdCByLmVuc3VyZURvYygicGFyc2VTdGFydFhSZWYiKSxhd2FpdCByLmVuc3VyZURvYygicGFyc2UiLFtlXSksYXdhaXQgci5lbnN1cmVEb2MoImNoZWNrRmlyc3RQYWdlIixbZV0pLGF3YWl0IHIuZW5zdXJlRG9jKCJjaGVja0xhc3RQYWdlIixbZV0pO2NvbnN0IHQ9YXdhaXQgci5lbnN1cmVEb2MoImlzUHVyZVhmYSIpO2lmKHQpe2NvbnN0IGU9bmV3IGQoImxvYWRYZmFGb250cyIpO2soZSksYXdhaXQgUHJvbWlzZS5hbGwoW3IubG9hZFhmYUZvbnRzKFMsZSkuY2F0Y2goKGU9Pnt9KSkudGhlbigoKCk9PkMoZSkpKSxyLmxvYWRYZmFJbWFnZXMoKV0pfWNvbnN0W24sYV09YXdhaXQgUHJvbWlzZS5hbGwoW3IuZW5zdXJlRG9jKCJudW1QYWdlcyIpLHIuZW5zdXJlRG9jKCJmaW5nZXJwcmludHMiKV0pO3JldHVybntudW1QYWdlczpuLGZpbmdlcnByaW50czphLGh0bWxGb3JYZmE6dD9hd2FpdCByLmVuc3VyZURvYygiaHRtbEZvclhmYSIpOm51bGx9fXJldHVybiBTLm9uKCJHZXRQYWdlIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHIuZ2V0UGFnZShlLnBhZ2VJbmRleCkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKFtyLmVuc3VyZShlLCJyb3RhdGUiKSxyLmVuc3VyZShlLCJyZWYiKSxyLmVuc3VyZShlLCJ1c2VyVW5pdCIpLHIuZW5zdXJlKGUsInZpZXciKV0pLnRoZW4oKGZ1bmN0aW9uKGUpe2xldFt0LHIsbixhXT1lO3JldHVybntyb3RhdGU6dCxyZWY6cix1c2VyVW5pdDpuLHZpZXc6YX19KSl9KSl9KSksUy5vbigiR2V0UGFnZUluZGV4IiwoZnVuY3Rpb24oZSl7Y29uc3QgdD1pLlJlZi5nZXQoZS5udW0sZS5nZW4pO3JldHVybiByLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsW3RdKX0pKSxTLm9uKCJHZXREZXN0aW5hdGlvbnMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJkZXN0aW5hdGlvbnMiKX0pKSxTLm9uKCJHZXREZXN0aW5hdGlvbiIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZUNhdGFsb2coImdldERlc3RpbmF0aW9uIixbZS5pZF0pfSkpLFMub24oIkdldFBhZ2VMYWJlbHMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJwYWdlTGFiZWxzIil9KSksUy5vbigiR2V0UGFnZUxheW91dCIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZUNhdGFsb2coInBhZ2VMYXlvdXQiKX0pKSxTLm9uKCJHZXRQYWdlTW9kZSIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZUNhdGFsb2coInBhZ2VNb2RlIil9KSksUy5vbigiR2V0Vmlld2VyUHJlZmVyZW5jZXMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJ2aWV3ZXJQcmVmZXJlbmNlcyIpfSkpLFMub24oIkdldE9wZW5BY3Rpb24iLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJvcGVuQWN0aW9uIil9KSksUy5vbigiR2V0QXR0YWNobWVudHMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJhdHRhY2htZW50cyIpfSkpLFMub24oIkdldEphdmFTY3JpcHQiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJqYXZhU2NyaXB0Iil9KSksUy5vbigiR2V0RG9jSlNBY3Rpb25zIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHIuZW5zdXJlQ2F0YWxvZygianNBY3Rpb25zIil9KSksUy5vbigiR2V0UGFnZUpTQWN0aW9ucyIsKGZ1bmN0aW9uKGUpe2xldHtwYWdlSW5kZXg6dH09ZTtyZXR1cm4gci5nZXRQYWdlKHQpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZShlLCJqc0FjdGlvbnMiKX0pKX0pKSxTLm9uKCJHZXRPdXRsaW5lIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHIuZW5zdXJlQ2F0YWxvZygiZG9jdW1lbnRPdXRsaW5lIil9KSksUy5vbigiR2V0T3B0aW9uYWxDb250ZW50Q29uZmlnIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHIuZW5zdXJlQ2F0YWxvZygib3B0aW9uYWxDb250ZW50Q29uZmlnIil9KSksUy5vbigiR2V0UGVybWlzc2lvbnMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJwZXJtaXNzaW9ucyIpfSkpLFMub24oIkdldE1ldGFkYXRhIiwoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKFtyLmVuc3VyZURvYygiZG9jdW1lbnRJbmZvIiksci5lbnN1cmVDYXRhbG9nKCJtZXRhZGF0YSIpXSl9KSksUy5vbigiR2V0TWFya0luZm8iLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJtYXJrSW5mbyIpfSkpLFMub24oIkdldERhdGEiLChmdW5jdGlvbihlKXtyZXR1cm4gci5yZXF1ZXN0TG9hZGVkU3RyZWFtKCkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYnl0ZXN9KSl9KSksUy5vbigiR2V0QW5ub3RhdGlvbnMiLChmdW5jdGlvbihlKXtsZXR7cGFnZUluZGV4OnQsaW50ZW50Om59PWU7cmV0dXJuIHIuZ2V0UGFnZSh0KS50aGVuKChmdW5jdGlvbihlKXtjb25zdCByPW5ldyBkKCJHZXRBbm5vdGF0aW9uczogcGFnZSAiLmNvbmNhdCh0KSk7cmV0dXJuIGsociksZS5nZXRBbm5vdGF0aW9uc0RhdGEoUyxyLG4pLnRoZW4oKGU9PihDKHIpLGUpKSwoZT0+e3Rocm93IEMociksZX0pKX0pKX0pKSxTLm9uKCJHZXRGaWVsZE9iamVjdHMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVEb2MoImZpZWxkT2JqZWN0cyIpfSkpLFMub24oIkhhc0pTQWN0aW9ucyIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZURvYygiaGFzSlNBY3Rpb25zIil9KSksUy5vbigiR2V0Q2FsY3VsYXRpb25PcmRlcklkcyIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZURvYygiY2FsY3VsYXRpb25PcmRlcklkcyIpfSkpLFMub24oIlNhdmVEb2N1bWVudCIsKGFzeW5jIGZ1bmN0aW9uKGUpe2xldHtpc1B1cmVYZmE6dCxudW1QYWdlczpzLGFubm90YXRpb25TdG9yYWdlOmMsZmlsZW5hbWU6aH09ZTtjb25zdCB1PVtyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKSxyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIiksci5lbnN1cmVDYXRhbG9nKCJhY3JvRm9ybVJlZiIpLHIuZW5zdXJlRG9jKCJzdGFydFhSZWYiKSxyLmVuc3VyZURvYygibGluZWFyaXphdGlvbiIpXSxmPXQ/bnVsbDooMCxhLmdldE5ld0Fubm90YXRpb25zTWFwKShjKSxnPWF3YWl0IHIuZW5zdXJlRG9jKCJ4cmVmIik7aWYoZil7Y29uc3QgZT1vLkFubm90YXRpb25GYWN0b3J5LmdlbmVyYXRlSW1hZ2VzKGMudmFsdWVzKCksZyxyLmV2YWx1YXRvck9wdGlvbnMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpO2Zvcihjb25zdFt0LG5db2YgZil1LnB1c2goci5nZXRQYWdlKHQpLnRoZW4oKHI9Pntjb25zdCBhPW5ldyBkKCJTYXZlIChlZGl0b3IpOiBwYWdlICIuY29uY2F0KHQpKTtyZXR1cm4gci5zYXZlTmV3QW5ub3RhdGlvbnMoUyxhLG4sZSkuZmluYWxseSgoZnVuY3Rpb24oKXtDKGEpfSkpfSkpKX1pZih0KXUucHVzaChyLnNlcmlhbGl6ZVhmYURhdGEoYykpO2Vsc2UgZm9yKGxldCBlPTA7ZTxzO2UrKyl1LnB1c2goci5nZXRQYWdlKGUpLnRoZW4oKGZ1bmN0aW9uKHQpe2NvbnN0IHI9bmV3IGQoIlNhdmU6IHBhZ2UgIi5jb25jYXQoZSkpO3JldHVybiB0LnNhdmUoUyxyLGMpLmZpbmFsbHkoKGZ1bmN0aW9uKCl7QyhyKX0pKX0pKSk7cmV0dXJuIFByb21pc2UuYWxsKHUpLnRoZW4oKGZ1bmN0aW9uKGUpe2xldFtyLGEscyxvLGMsLi4udV09ZSxkPVtdLGY9bnVsbDtpZih0KXtpZihmPXVbMF0sIWYpcmV0dXJuIHIuYnl0ZXN9ZWxzZSBpZihkPXUuZmxhdCgyKSwwPT09ZC5sZW5ndGgpcmV0dXJuIHIuYnl0ZXM7Y29uc3QgcD1zJiZhIGluc3RhbmNlb2YgaS5EaWN0JiZkLnNvbWUoKGU9PmUubmVlZEFwcGVhcmFuY2VzKSksbT1hIGluc3RhbmNlb2YgaS5EaWN0JiZhLmdldCgiWEZBIil8fG51bGw7bGV0IGI9bnVsbCx5PSExO2lmKEFycmF5LmlzQXJyYXkobSkpe2ZvcihsZXQgZT0wLHQ9bS5sZW5ndGg7ZTx0O2UrPTIpImRhdGFzZXRzIj09PW1bZV0mJihiPW1bZSsxXSx5PSEwKTtudWxsPT09YiYmKGI9Zy5nZXROZXdUZW1wb3JhcnlSZWYoKSl9ZWxzZSBtJiYoMCxuLndhcm4pKCJVbnN1cHBvcnRlZCBYRkEgdHlwZS4iKTtsZXQgdz1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGcudHJhaWxlcil7dmFyIHY7Y29uc3QgZT1PYmplY3QuY3JlYXRlKG51bGwpLHQ9Zy50cmFpbGVyLmdldCgiSW5mbyIpfHxudWxsO3QgaW5zdGFuY2VvZiBpLkRpY3QmJnQuZm9yRWFjaCgoKHQscik9Pnsic3RyaW5nIj09dHlwZW9mIHImJihlW3RdPSgwLG4uc3RyaW5nVG9QREZTdHJpbmcpKHIpKX0pKSx3PXtyb290UmVmOmcudHJhaWxlci5nZXRSYXcoIlJvb3QiKXx8bnVsbCxlbmNyeXB0UmVmOmcudHJhaWxlci5nZXRSYXcoIkVuY3J5cHQiKXx8bnVsbCxuZXdSZWY6Zy5nZXROZXdUZW1wb3JhcnlSZWYoKSxpbmZvUmVmOmcudHJhaWxlci5nZXRSYXcoIkluZm8iKXx8bnVsbCxpbmZvOmUsZmlsZUlkczpnLnRyYWlsZXIuZ2V0KCJJRCIpfHxudWxsLHN0YXJ0WFJlZjpjP286bnVsbCE9PSh2PWcubGFzdFhSZWZTdHJlYW1Qb3MpJiZ2b2lkIDAhPT12P3Y6byxmaWxlbmFtZTpofX1yZXR1cm4oMCxsLmluY3JlbWVudGFsVXBkYXRlKSh7b3JpZ2luYWxEYXRhOnIuYnl0ZXMseHJlZkluZm86dyxuZXdSZWZzOmQseHJlZjpnLGhhc1hmYTohIW0seGZhRGF0YXNldHNSZWY6YixoYXNYZmFEYXRhc2V0c0VudHJ5OnksbmVlZEFwcGVhcmFuY2VzOnAsYWNyb0Zvcm1SZWY6cyxhY3JvRm9ybTphLHhmYURhdGE6Zn0pLmZpbmFsbHkoKCgpPT57Zy5yZXNldE5ld1RlbXBvcmFyeVJlZigpfSkpfSkpfSkpLFMub24oIkdldE9wZXJhdG9yTGlzdCIsKGZ1bmN0aW9uKGUsdCl7Y29uc3QgYT1lLnBhZ2VJbmRleDtyLmdldFBhZ2UoYSkudGhlbigoZnVuY3Rpb24ocil7Y29uc3QgaT1uZXcgZCgiR2V0T3BlcmF0b3JMaXN0OiBwYWdlICIuY29uY2F0KGEpKTtrKGkpO2NvbnN0IHM9bT49bi5WZXJib3NpdHlMZXZlbC5JTkZPUz9EYXRlLm5vdygpOjA7ci5nZXRPcGVyYXRvckxpc3Qoe2hhbmRsZXI6UyxzaW5rOnQsdGFzazppLGludGVudDplLmludGVudCxjYWNoZUtleTplLmNhY2hlS2V5LGFubm90YXRpb25TdG9yYWdlOmUuYW5ub3RhdGlvblN0b3JhZ2V9KS50aGVuKChmdW5jdGlvbihlKXtDKGkpLHMmJigwLG4uaW5mbykoInBhZ2U9Ii5jb25jYXQoYSsxLCIgLSBnZXRPcGVyYXRvckxpc3Q6IHRpbWU9IikuY29uY2F0KERhdGUubm93KCktcywibXMsIGxlbj0iKS5jb25jYXQoZS5sZW5ndGgpKSx0LmNsb3NlKCl9KSwoZnVuY3Rpb24oZSl7QyhpKSxpLnRlcm1pbmF0ZWR8fHQuZXJyb3IoZSl9KSl9KSl9KSksUy5vbigiR2V0VGV4dENvbnRlbnQiLChmdW5jdGlvbihlLHQpe2NvbnN0e3BhZ2VJbmRleDphLGluY2x1ZGVNYXJrZWRDb250ZW50OmksZGlzYWJsZU5vcm1hbGl6YXRpb246c309ZTtyLmdldFBhZ2UoYSkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3Qgcj1uZXcgZCgiR2V0VGV4dENvbnRlbnQ6IHBhZ2UgIithKTtrKHIpO2NvbnN0IG89bT49bi5WZXJib3NpdHlMZXZlbC5JTkZPUz9EYXRlLm5vdygpOjA7ZS5leHRyYWN0VGV4dENvbnRlbnQoe2hhbmRsZXI6Uyx0YXNrOnIsc2luazp0LGluY2x1ZGVNYXJrZWRDb250ZW50OmksZGlzYWJsZU5vcm1hbGl6YXRpb246c30pLnRoZW4oKGZ1bmN0aW9uKCl7QyhyKSxvJiYoMCxuLmluZm8pKCJwYWdlPSIuY29uY2F0KGErMSwiIC0gZ2V0VGV4dENvbnRlbnQ6IHRpbWU9IikrKERhdGUubm93KCktbykrIm1zIiksdC5jbG9zZSgpfSksKGZ1bmN0aW9uKGUpe0Mociksci50ZXJtaW5hdGVkfHx0LmVycm9yKGUpfSkpfSkpfSkpLFMub24oIkdldFN0cnVjdFRyZWUiLChmdW5jdGlvbihlKXtyZXR1cm4gci5nZXRQYWdlKGUucGFnZUluZGV4KS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmUoZSwiZ2V0U3RydWN0VHJlZSIpfSkpfSkpLFMub24oIkZvbnRGYWxsYmFjayIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmZvbnRGYWxsYmFjayhlLmlkLFMpfSkpLFMub24oIkNsZWFudXAiLChmdW5jdGlvbihlKXtyZXR1cm4gci5jbGVhbnVwKCEwKX0pKSxTLm9uKCJUZXJtaW5hdGUiLChmdW5jdGlvbihlKXtmPSEwO2NvbnN0IHQ9W107aWYocil7ci50ZXJtaW5hdGUobmV3IG4uQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7Y29uc3QgZT1yLmNsZWFudXAoKTt0LnB1c2goZSkscj1udWxsfWVsc2UoMCxjLmNsZWFyR2xvYmFsQ2FjaGVzKSgpO2cmJmcobmV3IG4uQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7Zm9yKGNvbnN0IGUgb2YgcCl0LnB1c2goZS5maW5pc2hlZCksZS50ZXJtaW5hdGUoKTtyZXR1cm4gUHJvbWlzZS5hbGwodCkudGhlbigoZnVuY3Rpb24oKXtTLmRlc3Ryb3koKSxTPW51bGx9KSl9KSksUy5vbigiUmVhZHkiLChmdW5jdGlvbih0KXshZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtBKCksUy5zZW5kKCJHZXREb2MiLHtwZGZJbmZvOmV9KX1mdW5jdGlvbiBpKGUpe2lmKEEoKSxlIGluc3RhbmNlb2Ygbi5QYXNzd29yZEV4Y2VwdGlvbil7Y29uc3QgdD1uZXcgZCgiUGFzc3dvcmRFeGNlcHRpb246IHJlc3BvbnNlICIuY29uY2F0KGUuY29kZSkpO2sodCksUy5zZW5kV2l0aFByb21pc2UoIlBhc3N3b3JkUmVxdWVzdCIsZSkudGhlbigoZnVuY3Rpb24oZSl7bGV0e3Bhc3N3b3JkOm59PWU7Qyh0KSxyLnVwZGF0ZVBhc3N3b3JkKG4pLG8oKX0pKS5jYXRjaCgoZnVuY3Rpb24oKXtDKHQpLFMuc2VuZCgiRG9jRXhjZXB0aW9uIixlKX0pKX1lbHNlIGUgaW5zdGFuY2VvZiBuLkludmFsaWRQREZFeGNlcHRpb258fGUgaW5zdGFuY2VvZiBuLk1pc3NpbmdQREZFeGNlcHRpb258fGUgaW5zdGFuY2VvZiBuLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbnx8ZSBpbnN0YW5jZW9mIG4uVW5rbm93bkVycm9yRXhjZXB0aW9uP1Muc2VuZCgiRG9jRXhjZXB0aW9uIixlKTpTLnNlbmQoIkRvY0V4Y2VwdGlvbiIsbmV3IG4uVW5rbm93bkVycm9yRXhjZXB0aW9uKGUubWVzc2FnZSxlLnRvU3RyaW5nKCkpKX1mdW5jdGlvbiBvKCl7QSgpLE8oITEpLnRoZW4odCwoZnVuY3Rpb24oZSl7QSgpLGUgaW5zdGFuY2VvZiBhLlhSZWZQYXJzZUV4Y2VwdGlvbj9yLnJlcXVlc3RMb2FkZWRTdHJlYW0oKS50aGVuKChmdW5jdGlvbigpe0EoKSxPKCEwKS50aGVuKHQsaSl9KSk6aShlKX0pKX1BKCksZnVuY3Rpb24oZSl7bGV0e2RhdGE6dCxwYXNzd29yZDpyLGRpc2FibGVBdXRvRmV0Y2g6aSxyYW5nZUNodW5rU2l6ZTpvLGxlbmd0aDpjLGRvY0Jhc2VVcmw6bCxlbmFibGVYZmE6aCxldmFsdWF0b3JPcHRpb25zOmR9PWU7Y29uc3QgZj17c291cmNlOm51bGwsZGlzYWJsZUF1dG9GZXRjaDppLGRvY0Jhc2VVcmw6bCxkb2NJZDpiLGVuYWJsZVhmYTpoLGV2YWx1YXRvck9wdGlvbnM6ZCxoYW5kbGVyOlMsbGVuZ3RoOmMscGFzc3dvcmQ6cixyYW5nZUNodW5rU2l6ZTpvfSxwPW5ldyBuLlByb21pc2VDYXBhYmlsaXR5O2xldCBtO2lmKHQpe3RyeXtmLnNvdXJjZT10LG09bmV3IHMuTG9jYWxQZGZNYW5hZ2VyKGYpLHAucmVzb2x2ZShtKX1jYXRjaChlKXtwLnJlamVjdChlKX1yZXR1cm4gcC5wcm9taXNlfWxldCB5LHc9W107dHJ5e3k9bmV3IHUuUERGV29ya2VyU3RyZWFtKFMpfWNhdGNoKGUpe3JldHVybiBwLnJlamVjdChlKSxwLnByb21pc2V9Y29uc3Qgdj15LmdldEZ1bGxSZWFkZXIoKTt2LmhlYWRlcnNSZWFkeS50aGVuKChmdW5jdGlvbigpe2lmKHYuaXNSYW5nZVN1cHBvcnRlZCl7Zi5zb3VyY2U9eSxmLmxlbmd0aD12LmNvbnRlbnRMZW5ndGgsZi5kaXNhYmxlQXV0b0ZldGNofHwoZi5kaXNhYmxlQXV0b0ZldGNoPXYuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpLG09bmV3IHMuTmV0d29ya1BkZk1hbmFnZXIoZik7Zm9yKGNvbnN0IGUgb2YgdyltLnNlbmRQcm9ncmVzc2l2ZURhdGEoZSk7dz1bXSxwLnJlc29sdmUobSksZz1udWxsfX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cC5yZWplY3QoZSksZz1udWxsfSkpO2xldCB4PTA7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe3YucmVhZCgpLnRoZW4oKGZ1bmN0aW9uIGUocil7bGV0e3ZhbHVlOmksZG9uZTpvfT1yO3RyeXtpZihBKCksbylyZXR1cm4gbXx8ZnVuY3Rpb24oKXtjb25zdCBlPSgwLGEuYXJyYXlCdWZmZXJzVG9CeXRlcykodyk7YyYmZS5sZW5ndGghPT1jJiYoMCxuLndhcm4pKCJyZXBvcnRlZCBIVFRQIGxlbmd0aCBpcyBkaWZmZXJlbnQgZnJvbSBhY3R1YWwiKTt0cnl7Zi5zb3VyY2U9ZSxtPW5ldyBzLkxvY2FsUGRmTWFuYWdlcihmKSxwLnJlc29sdmUobSl9Y2F0Y2goZSl7cC5yZWplY3QoZSl9dz1bXX0oKSx2b2lkKGc9bnVsbCk7eCs9aS5ieXRlTGVuZ3RoLHYuaXNTdHJlYW1pbmdTdXBwb3J0ZWR8fFMuc2VuZCgiRG9jUHJvZ3Jlc3MiLHtsb2FkZWQ6eCx0b3RhbDpNYXRoLm1heCh4LHYuY29udGVudExlbmd0aHx8MCl9KSxtP20uc2VuZFByb2dyZXNzaXZlRGF0YShpKTp3LnB1c2goaSksdi5yZWFkKCkudGhlbihlLHQpfWNhdGNoKHIpe3Qocil9fSksdCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3AucmVqZWN0KGUpLGc9bnVsbH0pKSxnPWZ1bmN0aW9uKGUpe3kuY2FuY2VsQWxsUmVxdWVzdHMoZSl9LHAucHJvbWlzZX0oZSkudGhlbigoZnVuY3Rpb24oZSl7aWYoZil0aHJvdyBlLnRlcm1pbmF0ZShuZXcgbi5BYm9ydEV4Y2VwdGlvbigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLiIpKSxuZXcgRXJyb3IoIldvcmtlciB3YXMgdGVybWluYXRlZCIpO3I9ZSxyLnJlcXVlc3RMb2FkZWRTdHJlYW0oITApLnRoZW4oKGU9PntTLnNlbmQoIkRhdGFMb2FkZWQiLHtsZW5ndGg6ZS5ieXRlcy5ieXRlTGVuZ3RofSl9KSl9KSkudGhlbihvLGkpfShlKSxlPW51bGx9KSkseH1zdGF0aWMgaW5pdGlhbGl6ZUZyb21Qb3J0KGUpe2NvbnN0IHQ9bmV3IGguTWVzc2FnZUhhbmRsZXIoIndvcmtlciIsIm1haW4iLGUpO2Yuc2V0dXAodCxlKSx0LnNlbmQoInJlYWR5IixudWxsKX19dC5Xb3JrZXJNZXNzYWdlSGFuZGxlcj1mLCJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93JiYhbi5pc05vZGVKUyYmInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5wb3N0TWVzc2FnZSYmIm9ubWVzc2FnZSJpbiBlfShzZWxmKSYmZi5pbml0aWFsaXplRnJvbVBvcnQoc2VsZil9LChlLHQscik9Pnt2YXIgbj1yKDMpLGE9cig0KSxpPXIoNjkpLHM9cig3MCksbz0iV2ViQXNzZW1ibHkiLGM9YVtvXSxsPTchPT1FcnJvcigiZSIse2NhdXNlOjd9KS5jYXVzZSxoPWZ1bmN0aW9uKGUsdCl7dmFyIHI9e307cltlXT1zKGUsdCxsKSxuKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsYXJpdHk6MSxmb3JjZWQ6bH0scil9LHU9ZnVuY3Rpb24oZSx0KXtpZihjJiZjW2VdKXt2YXIgcj17fTtyW2VdPXMobysiLiIrZSx0LGwpLG4oe3RhcmdldDpvLHN0YXQ6ITAsY29uc3RydWN0b3I6ITAsYXJpdHk6MSxmb3JjZWQ6bH0scil9fTtoKCJFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksaCgiRXZhbEVycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKSxoKCJSYW5nZUVycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKSxoKCJSZWZlcmVuY2VFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksaCgiU3ludGF4RXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpLGgoIlR5cGVFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksaCgiVVJJRXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpLHUoIkNvbXBpbGVFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksdSgiTGlua0Vycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKSx1KCJSdW50aW1lRXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpfSwoZSx0LHIpPT57dmFyIG49cig0KSxhPXIoNSkuZixpPXIoNDQpLHM9cig0OCksbz1yKDM4KSxjPXIoNTYpLGw9cig2OCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHIsaCx1LGQsZixnPWUudGFyZ2V0LHA9ZS5nbG9iYWwsbT1lLnN0YXQ7aWYocj1wP246bT9uW2ddfHxvKGcse30pOihuW2ddfHx7fSkucHJvdG90eXBlKWZvcihoIGluIHQpe2lmKGQ9dFtoXSx1PWUuZG9udENhbGxHZXRTZXQ/KGY9YShyLGgpKSYmZi52YWx1ZTpyW2hdLCFsKHA/aDpnKyhtPyIuIjoiIyIpK2gsZS5mb3JjZWQpJiZ2b2lkIDAhPT11KXtpZih0eXBlb2YgZD09dHlwZW9mIHUpY29udGludWU7YyhkLHUpfShlLnNoYW18fHUmJnUuc2hhbSkmJmkoZCwic2hhbSIsITApLHMocixoLGQsZSl9fX0sZnVuY3Rpb24oZSl7dmFyIHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuTWF0aD09TWF0aCYmZX07ZS5leHBvcnRzPXQoIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzKXx8dCgib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93KXx8dCgib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYpfHx0KCJvYmplY3QiPT10eXBlb2Ygci5nJiZyLmcpfHxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpfHx0aGlzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfSwoZSx0LHIpPT57dmFyIG49cig2KSxhPXIoOCksaT1yKDEwKSxzPXIoMTEpLG89cigxMiksYz1yKDE4KSxsPXIoMzkpLGg9cig0MiksdT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO3QuZj1uP3U6ZnVuY3Rpb24oZSx0KXtpZihlPW8oZSksdD1jKHQpLGgpdHJ5e3JldHVybiB1KGUsdCl9Y2F0Y2goZSl7fWlmKGwoZSx0KSlyZXR1cm4gcyghYShpLmYsZSx0KSxlW3RdKX19LChlLHQscik9Pnt2YXIgbj1yKDcpO2UuZXhwb3J0cz0hbigoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LDEse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pWzFdfSkpfSxlPT57ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4hIWUoKX1jYXRjaChlKXtyZXR1cm4hMH19fSwoZSx0LHIpPT57dmFyIG49cig5KSxhPUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO2UuZXhwb3J0cz1uP2EuYmluZChhKTpmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGEsYXJndW1lbnRzKX19LChlLHQscik9Pnt2YXIgbj1yKDcpO2UuZXhwb3J0cz0hbigoZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe30uYmluZCgpO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBlfHxlLmhhc093blByb3BlcnR5KCJwcm90b3R5cGUiKX0pKX0sKGUsdCk9Pnt2YXIgcj17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsYT1uJiYhci5jYWxsKHsxOjJ9LDEpO3QuZj1hP2Z1bmN0aW9uKGUpe3ZhciB0PW4odGhpcyxlKTtyZXR1cm4hIXQmJnQuZW51bWVyYWJsZX06cn0sZT0+e2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybntlbnVtZXJhYmxlOiEoMSZlKSxjb25maWd1cmFibGU6ISgyJmUpLHdyaXRhYmxlOiEoNCZlKSx2YWx1ZTp0fX19LChlLHQscik9Pnt2YXIgbj1yKDEzKSxhPXIoMTYpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbihhKGUpKX19LChlLHQscik9Pnt2YXIgbj1yKDE0KSxhPXIoNyksaT1yKDE1KSxzPU9iamVjdCxvPW4oIiIuc3BsaXQpO2UuZXhwb3J0cz1hKChmdW5jdGlvbigpe3JldHVybiFzKCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KSk/ZnVuY3Rpb24oZSl7cmV0dXJuIlN0cmluZyI9PWkoZSk/byhlLCIiKTpzKGUpfTpzfSwoZSx0LHIpPT57dmFyIG49cig5KSxhPUZ1bmN0aW9uLnByb3RvdHlwZSxpPWEuY2FsbCxzPW4mJmEuYmluZC5iaW5kKGksaSk7ZS5leHBvcnRzPW4/czpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaS5hcHBseShlLGFyZ3VtZW50cyl9fX0sKGUsdCxyKT0+e3ZhciBuPXIoMTQpLGE9bih7fS50b1N0cmluZyksaT1uKCIiLnNsaWNlKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGkoYShlKSw4LC0xKX19LChlLHQscik9Pnt2YXIgbj1yKDE3KSxhPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYobihlKSl0aHJvdyBhKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiK2UpO3JldHVybiBlfX0sZT0+e2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZX19LChlLHQscik9Pnt2YXIgbj1yKDE5KSxhPXIoMjMpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKGUsInN0cmluZyIpO3JldHVybiBhKHQpP3Q6dCsiIn19LChlLHQscik9Pnt2YXIgbj1yKDgpLGE9cigyMCksaT1yKDIzKSxzPXIoMzApLG89cigzMyksYz1yKDM0KSxsPVR5cGVFcnJvcixoPWMoInRvUHJpbWl0aXZlIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoIWEoZSl8fGkoZSkpcmV0dXJuIGU7dmFyIHIsYz1zKGUsaCk7aWYoYyl7aWYodm9pZCAwPT09dCYmKHQ9ImRlZmF1bHQiKSxyPW4oYyxlLHQpLCFhKHIpfHxpKHIpKXJldHVybiByO3Rocm93IGwoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfXJldHVybiB2b2lkIDA9PT10JiYodD0ibnVtYmVyIiksbyhlLHQpfX0sKGUsdCxyKT0+e3ZhciBuPXIoMjEpLGE9cigyMiksaT1hLmFsbDtlLmV4cG9ydHM9YS5JU19IVE1MRERBP2Z1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZT9udWxsIT09ZTpuKGUpfHxlPT09aX06ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP251bGwhPT1lOm4oZSl9fSwoZSx0LHIpPT57dmFyIG49cigyMiksYT1uLmFsbDtlLmV4cG9ydHM9bi5JU19IVE1MRERBP2Z1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfHxlPT09YX06ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9fSxlPT57dmFyIHQ9Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuYWxsLHI9dm9pZCAwPT09dCYmdm9pZCAwIT09dDtlLmV4cG9ydHM9e2FsbDp0LElTX0hUTUxEREE6cn19LChlLHQscik9Pnt2YXIgbj1yKDI0KSxhPXIoMjEpLGk9cigyNSkscz1yKDI2KSxvPU9iamVjdDtlLmV4cG9ydHM9cz9mdW5jdGlvbihlKXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3ZhciB0PW4oIlN5bWJvbCIpO3JldHVybiBhKHQpJiZpKHQucHJvdG90eXBlLG8oZSkpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNCksYT1yKDIxKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyPyhyPW5bZV0sYShyKT9yOnZvaWQgMCk6bltlXSYmbltlXVt0XTt2YXIgcn19LChlLHQscik9Pnt2YXIgbj1yKDE0KTtlLmV4cG9ydHM9bih7fS5pc1Byb3RvdHlwZU9mKX0sKGUsdCxyKT0+e3ZhciBuPXIoMjcpO2UuZXhwb3J0cz1uJiYhU3ltYm9sLnNoYW0mJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yfSwoZSx0LHIpPT57dmFyIG49cigyOCksYT1yKDcpLGk9cig0KS5TdHJpbmc7ZS5leHBvcnRzPSEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmIWEoKGZ1bmN0aW9uKCl7dmFyIGU9U3ltYm9sKCk7cmV0dXJuIWkoZSl8fCEoT2JqZWN0KGUpaW5zdGFuY2VvZiBTeW1ib2wpfHwhU3ltYm9sLnNoYW0mJm4mJm48NDF9KSl9LChlLHQscik9Pnt2YXIgbixhLGk9cig0KSxzPXIoMjkpLG89aS5wcm9jZXNzLGM9aS5EZW5vLGw9byYmby52ZXJzaW9uc3x8YyYmYy52ZXJzaW9uLGg9bCYmbC52ODtoJiYoYT0obj1oLnNwbGl0KCIuIikpWzBdPjAmJm5bMF08ND8xOisoblswXStuWzFdKSksIWEmJnMmJighKG49cy5tYXRjaCgvRWRnZVwvKFxkKykvKSl8fG5bMV0+PTc0KSYmKG49cy5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pKSYmKGE9K25bMV0pLGUuZXhwb3J0cz1hfSxlPT57ZS5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiZTdHJpbmcobmF2aWdhdG9yLnVzZXJBZ2VudCl8fCIifSwoZSx0LHIpPT57dmFyIG49cigzMSksYT1yKDE3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgcj1lW3RdO3JldHVybiBhKHIpP3ZvaWQgMDpuKHIpfX0sKGUsdCxyKT0+e3ZhciBuPXIoMjEpLGE9cigzMiksaT1UeXBlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKG4oZSkpcmV0dXJuIGU7dGhyb3cgaShhKGUpKyIgaXMgbm90IGEgZnVuY3Rpb24iKX19LGU9Pnt2YXIgdD1TdHJpbmc7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gdChlKX1jYXRjaChlKXtyZXR1cm4iT2JqZWN0In19fSwoZSx0LHIpPT57dmFyIG49cig4KSxhPXIoMjEpLGk9cigyMCkscz1UeXBlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbztpZigic3RyaW5nIj09PXQmJmEocj1lLnRvU3RyaW5nKSYmIWkobz1uKHIsZSkpKXJldHVybiBvO2lmKGEocj1lLnZhbHVlT2YpJiYhaShvPW4ocixlKSkpcmV0dXJuIG87aWYoInN0cmluZyIhPT10JiZhKHI9ZS50b1N0cmluZykmJiFpKG89bihyLGUpKSlyZXR1cm4gbzt0aHJvdyBzKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX19LChlLHQscik9Pnt2YXIgbj1yKDQpLGE9cigzNSksaT1yKDM5KSxzPXIoNDEpLG89cigyNyksYz1yKDI2KSxsPW4uU3ltYm9sLGg9YSgid2tzIiksdT1jP2wuZm9yfHxsOmwmJmwud2l0aG91dFNldHRlcnx8cztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGkoaCxlKXx8KGhbZV09byYmaShsLGUpP2xbZV06dSgiU3ltYm9sLiIrZSkpLGhbZV19fSwoZSx0LHIpPT57dmFyIG49cigzNiksYT1yKDM3KTsoZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFbZV18fChhW2VdPXZvaWQgMCE9PXQ/dDp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOiIzLjMxLjEiLG1vZGU6bj8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE0LTIwMjMgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkiLGxpY2Vuc2U6Imh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2Jsb2IvdjMuMzEuMS9MSUNFTlNFIixzb3VyY2U6Imh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzIn0pfSxlPT57ZS5leHBvcnRzPSExfSwoZSx0LHIpPT57dmFyIG49cig0KSxhPXIoMzgpLGk9Il9fY29yZS1qc19zaGFyZWRfXyIscz1uW2ldfHxhKGkse30pO2UuZXhwb3J0cz1zfSwoZSx0LHIpPT57dmFyIG49cig0KSxhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt0cnl7YShuLGUse3ZhbHVlOnQsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSl9Y2F0Y2gocil7bltlXT10fXJldHVybiB0fX0sKGUsdCxyKT0+e3ZhciBuPXIoMTQpLGE9cig0MCksaT1uKHt9Lmhhc093blByb3BlcnR5KTtlLmV4cG9ydHM9T2JqZWN0Lmhhc093bnx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShhKGUpLHQpfX0sKGUsdCxyKT0+e3ZhciBuPXIoMTYpLGE9T2JqZWN0O2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gYShuKGUpKX19LChlLHQscik9Pnt2YXIgbj1yKDE0KSxhPTAsaT1NYXRoLnJhbmRvbSgpLHM9bigxLi50b1N0cmluZyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiJTeW1ib2woIisodm9pZCAwPT09ZT8iIjplKSsiKV8iK3MoKythK2ksMzYpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNiksYT1yKDcpLGk9cig0Myk7ZS5leHBvcnRzPSFuJiYhYSgoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KGkoImRpdiIpLCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pKX0sKGUsdCxyKT0+e3ZhciBuPXIoNCksYT1yKDIwKSxpPW4uZG9jdW1lbnQscz1hKGkpJiZhKGkuY3JlYXRlRWxlbWVudCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBzP2kuY3JlYXRlRWxlbWVudChlKTp7fX19LChlLHQscik9Pnt2YXIgbj1yKDYpLGE9cig0NSksaT1yKDExKTtlLmV4cG9ydHM9bj9mdW5jdGlvbihlLHQscil7cmV0dXJuIGEuZihlLHQsaSgxLHIpKX06ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlW3RdPXIsZX19LChlLHQscik9Pnt2YXIgbj1yKDYpLGE9cig0MiksaT1yKDQ2KSxzPXIoNDcpLG89cigxOCksYz1UeXBlRXJyb3IsbD1PYmplY3QuZGVmaW5lUHJvcGVydHksaD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHU9ImVudW1lcmFibGUiLGQ9ImNvbmZpZ3VyYWJsZSIsZj0id3JpdGFibGUiO3QuZj1uP2k/ZnVuY3Rpb24oZSx0LHIpe2lmKHMoZSksdD1vKHQpLHMociksImZ1bmN0aW9uIj09dHlwZW9mIGUmJiJwcm90b3R5cGUiPT09dCYmInZhbHVlImluIHImJmYgaW4gciYmIXJbZl0pe3ZhciBuPWgoZSx0KTtuJiZuW2ZdJiYoZVt0XT1yLnZhbHVlLHI9e2NvbmZpZ3VyYWJsZTpkIGluIHI/cltkXTpuW2RdLGVudW1lcmFibGU6dSBpbiByP3JbdV06blt1XSx3cml0YWJsZTohMX0pfXJldHVybiBsKGUsdCxyKX06bDpmdW5jdGlvbihlLHQscil7aWYocyhlKSx0PW8odCkscyhyKSxhKXRyeXtyZXR1cm4gbChlLHQscil9Y2F0Y2goZSl7fWlmKCJnZXQiaW4gcnx8InNldCJpbiByKXRocm93IGMoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIHImJihlW3RdPXIudmFsdWUpLGV9fSwoZSx0LHIpPT57dmFyIG49cig2KSxhPXIoNyk7ZS5leHBvcnRzPW4mJmEoKGZ1bmN0aW9uKCl7cmV0dXJuIDQyIT1PYmplY3QuZGVmaW5lUHJvcGVydHkoKGZ1bmN0aW9uKCl7fSksInByb3RvdHlwZSIse3ZhbHVlOjQyLHdyaXRhYmxlOiExfSkucHJvdG90eXBlfSkpfSwoZSx0LHIpPT57dmFyIG49cigyMCksYT1TdHJpbmcsaT1UeXBlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKG4oZSkpcmV0dXJuIGU7dGhyb3cgaShhKGUpKyIgaXMgbm90IGFuIG9iamVjdCIpfX0sKGUsdCxyKT0+e3ZhciBuPXIoMjEpLGE9cig0NSksaT1yKDQ5KSxzPXIoMzgpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscixvKXtvfHwobz17fSk7dmFyIGM9by5lbnVtZXJhYmxlLGw9dm9pZCAwIT09by5uYW1lP28ubmFtZTp0O2lmKG4ocikmJmkocixsLG8pLG8uZ2xvYmFsKWM/ZVt0XT1yOnModCxyKTtlbHNle3RyeXtvLnVuc2FmZT9lW3RdJiYoYz0hMCk6ZGVsZXRlIGVbdF19Y2F0Y2goZSl7fWM/ZVt0XT1yOmEuZihlLHQse3ZhbHVlOnIsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6IW8ubm9uQ29uZmlndXJhYmxlLHdyaXRhYmxlOiFvLm5vbldyaXRhYmxlfSl9cmV0dXJuIGV9fSwoZSx0LHIpPT57dmFyIG49cigxNCksYT1yKDcpLGk9cigyMSkscz1yKDM5KSxvPXIoNiksYz1yKDUwKS5DT05GSUdVUkFCTEUsbD1yKDUxKSxoPXIoNTIpLHU9aC5lbmZvcmNlLGQ9aC5nZXQsZj1TdHJpbmcsZz1PYmplY3QuZGVmaW5lUHJvcGVydHkscD1uKCIiLnNsaWNlKSxtPW4oIiIucmVwbGFjZSksYj1uKFtdLmpvaW4pLHk9byYmIWEoKGZ1bmN0aW9uKCl7cmV0dXJuIDghPT1nKChmdW5jdGlvbigpe30pLCJsZW5ndGgiLHt2YWx1ZTo4fSkubGVuZ3RofSkpLHc9U3RyaW5nKFN0cmluZykuc3BsaXQoIlN0cmluZyIpLHY9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXsiU3ltYm9sKCI9PT1wKGYodCksMCw3KSYmKHQ9IlsiK20oZih0KSwvXlN5bWJvbFwoKFteKV0qKVwpLywiJDEiKSsiXSIpLHImJnIuZ2V0dGVyJiYodD0iZ2V0ICIrdCksciYmci5zZXR0ZXImJih0PSJzZXQgIit0KSwoIXMoZSwibmFtZSIpfHxjJiZlLm5hbWUhPT10KSYmKG8/ZyhlLCJuYW1lIix7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KTplLm5hbWU9dCkseSYmciYmcyhyLCJhcml0eSIpJiZlLmxlbmd0aCE9PXIuYXJpdHkmJmcoZSwibGVuZ3RoIix7dmFsdWU6ci5hcml0eX0pO3RyeXtyJiZzKHIsImNvbnN0cnVjdG9yIikmJnIuY29uc3RydWN0b3I/byYmZyhlLCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pOmUucHJvdG90eXBlJiYoZS5wcm90b3R5cGU9dm9pZCAwKX1jYXRjaChlKXt9dmFyIG49dShlKTtyZXR1cm4gcyhuLCJzb3VyY2UiKXx8KG4uc291cmNlPWIodywic3RyaW5nIj09dHlwZW9mIHQ/dDoiIikpLGV9O0Z1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZz12KChmdW5jdGlvbigpe3JldHVybiBpKHRoaXMpJiZkKHRoaXMpLnNvdXJjZXx8bCh0aGlzKX0pLCJ0b1N0cmluZyIpfSwoZSx0LHIpPT57dmFyIG49cig2KSxhPXIoMzkpLGk9RnVuY3Rpb24ucHJvdG90eXBlLHM9biYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixvPWEoaSwibmFtZSIpLGM9byYmInNvbWV0aGluZyI9PT1mdW5jdGlvbigpe30ubmFtZSxsPW8mJighbnx8biYmcyhpLCJuYW1lIikuY29uZmlndXJhYmxlKTtlLmV4cG9ydHM9e0VYSVNUUzpvLFBST1BFUjpjLENPTkZJR1VSQUJMRTpsfX0sKGUsdCxyKT0+e3ZhciBuPXIoMTQpLGE9cigyMSksaT1yKDM3KSxzPW4oRnVuY3Rpb24udG9TdHJpbmcpO2EoaS5pbnNwZWN0U291cmNlKXx8KGkuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gcyhlKX0pLGUuZXhwb3J0cz1pLmluc3BlY3RTb3VyY2V9LChlLHQscik9Pnt2YXIgbixhLGkscz1yKDUzKSxvPXIoNCksYz1yKDIwKSxsPXIoNDQpLGg9cigzOSksdT1yKDM3KSxkPXIoNTQpLGY9cig1NSksZz0iT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQiLHA9by5UeXBlRXJyb3IsbT1vLldlYWtNYXA7aWYoc3x8dS5zdGF0ZSl7dmFyIGI9dS5zdGF0ZXx8KHUuc3RhdGU9bmV3IG0pO2IuZ2V0PWIuZ2V0LGIuaGFzPWIuaGFzLGIuc2V0PWIuc2V0LG49ZnVuY3Rpb24oZSx0KXtpZihiLmhhcyhlKSl0aHJvdyBwKGcpO3JldHVybiB0LmZhY2FkZT1lLGIuc2V0KGUsdCksdH0sYT1mdW5jdGlvbihlKXtyZXR1cm4gYi5nZXQoZSl8fHt9fSxpPWZ1bmN0aW9uKGUpe3JldHVybiBiLmhhcyhlKX19ZWxzZXt2YXIgeT1kKCJzdGF0ZSIpO2ZbeV09ITAsbj1mdW5jdGlvbihlLHQpe2lmKGgoZSx5KSl0aHJvdyBwKGcpO3JldHVybiB0LmZhY2FkZT1lLGwoZSx5LHQpLHR9LGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGgoZSx5KT9lW3ldOnt9fSxpPWZ1bmN0aW9uKGUpe3JldHVybiBoKGUseSl9fWUuZXhwb3J0cz17c2V0Om4sZ2V0OmEsaGFzOmksZW5mb3JjZTpmdW5jdGlvbihlKXtyZXR1cm4gaShlKT9hKGUpOm4oZSx7fSl9LGdldHRlckZvcjpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHI7aWYoIWModCl8fChyPWEodCkpLnR5cGUhPT1lKXRocm93IHAoIkluY29tcGF0aWJsZSByZWNlaXZlciwgIitlKyIgcmVxdWlyZWQiKTtyZXR1cm4gcn19fX0sKGUsdCxyKT0+e3ZhciBuPXIoNCksYT1yKDIxKSxpPW4uV2Vha01hcDtlLmV4cG9ydHM9YShpKSYmL25hdGl2ZSBjb2RlLy50ZXN0KFN0cmluZyhpKSl9LChlLHQscik9Pnt2YXIgbj1yKDM1KSxhPXIoNDEpLGk9bigia2V5cyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaVtlXXx8KGlbZV09YShlKSl9fSxlPT57ZS5leHBvcnRzPXt9fSwoZSx0LHIpPT57dmFyIG49cigzOSksYT1yKDU3KSxpPXIoNSkscz1yKDQ1KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe2Zvcih2YXIgbz1hKHQpLGM9cy5mLGw9aS5mLGg9MDtoPG8ubGVuZ3RoO2grKyl7dmFyIHU9b1toXTtuKGUsdSl8fHImJm4ocix1KXx8YyhlLHUsbCh0LHUpKX19fSwoZSx0LHIpPT57dmFyIG49cigyNCksYT1yKDE0KSxpPXIoNTgpLHM9cig2Nyksbz1yKDQ3KSxjPWEoW10uY29uY2F0KTtlLmV4cG9ydHM9bigiUmVmbGVjdCIsIm93bktleXMiKXx8ZnVuY3Rpb24oZSl7dmFyIHQ9aS5mKG8oZSkpLHI9cy5mO3JldHVybiByP2ModCxyKGUpKTp0fX0sKGUsdCxyKT0+e3ZhciBuPXIoNTkpLGE9cig2NikuY29uY2F0KCJsZW5ndGgiLCJwcm90b3R5cGUiKTt0LmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uKGUpe3JldHVybiBuKGUsYSl9fSwoZSx0LHIpPT57dmFyIG49cigxNCksYT1yKDM5KSxpPXIoMTIpLHM9cig2MCkuaW5kZXhPZixvPXIoNTUpLGM9bihbXS5wdXNoKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgcixuPWkoZSksbD0wLGg9W107Zm9yKHIgaW4gbikhYShvLHIpJiZhKG4scikmJmMoaCxyKTtmb3IoO3QubGVuZ3RoPmw7KWEobixyPXRbbCsrXSkmJih+cyhoLHIpfHxjKGgscikpO3JldHVybiBofX0sKGUsdCxyKT0+e3ZhciBuPXIoMTIpLGE9cig2MSksaT1yKDY0KSxzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LHIscyl7dmFyIG8sYz1uKHQpLGw9aShjKSxoPWEocyxsKTtpZihlJiZyIT1yKXtmb3IoO2w+aDspaWYoKG89Y1toKytdKSE9bylyZXR1cm4hMH1lbHNlIGZvcig7bD5oO2grKylpZigoZXx8aCBpbiBjKSYmY1toXT09PXIpcmV0dXJuIGV8fGh8fDA7cmV0dXJuIWUmJi0xfX07ZS5leHBvcnRzPXtpbmNsdWRlczpzKCEwKSxpbmRleE9mOnMoITEpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNjIpLGE9TWF0aC5tYXgsaT1NYXRoLm1pbjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgcj1uKGUpO3JldHVybiByPDA/YShyK3QsMCk6aShyLHQpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNjMpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD0rZTtyZXR1cm4gdCE9dHx8MD09PXQ/MDpuKHQpfX0sZT0+e3ZhciB0PU1hdGguY2VpbCxyPU1hdGguZmxvb3I7ZS5leHBvcnRzPU1hdGgudHJ1bmN8fGZ1bmN0aW9uKGUpe3ZhciBuPStlO3JldHVybihuPjA/cjp0KShuKX19LChlLHQscik9Pnt2YXIgbj1yKDY1KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG4oZS5sZW5ndGgpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNjIpLGE9TWF0aC5taW47ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlPjA/YShuKGUpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxlPT57ZS5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LChlLHQpPT57dC5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHN9LChlLHQscik9Pnt2YXIgbj1yKDcpLGE9cigyMSksaT0vI3xcLnByb3RvdHlwZVwuLyxzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9Y1tvKGUpXTtyZXR1cm4gcj09aHx8ciE9bCYmKGEodCk/bih0KTohIXQpfSxvPXMubm9ybWFsaXplPWZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcoZSkucmVwbGFjZShpLCIuIikudG9Mb3dlckNhc2UoKX0sYz1zLmRhdGE9e30sbD1zLk5BVElWRT0iTiIsaD1zLlBPTFlGSUxMPSJQIjtlLmV4cG9ydHM9c30sKGUsdCxyKT0+e3ZhciBuPXIoOSksYT1GdW5jdGlvbi5wcm90b3R5cGUsaT1hLmFwcGx5LHM9YS5jYWxsO2UuZXhwb3J0cz0ib2JqZWN0Ij09dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuYXBwbHl8fChuP3MuYmluZChpKTpmdW5jdGlvbigpe3JldHVybiBzLmFwcGx5KGksYXJndW1lbnRzKX0pfSwoZSx0LHIpPT57dmFyIG49cigyNCksYT1yKDM5KSxpPXIoNDQpLHM9cigyNSksbz1yKDcxKSxjPXIoNTYpLGw9cig3NCksaD1yKDc1KSx1PXIoNzYpLGQ9cig4MCksZj1yKDgxKSxnPXIoNikscD1yKDM2KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIsbSl7dmFyIGI9InN0YWNrVHJhY2VMaW1pdCIseT1tPzI6MSx3PWUuc3BsaXQoIi4iKSx2PXdbdy5sZW5ndGgtMV0seD1uLmFwcGx5KG51bGwsdyk7aWYoeCl7dmFyIFM9eC5wcm90b3R5cGU7aWYoIXAmJmEoUywiY2F1c2UiKSYmZGVsZXRlIFMuY2F1c2UsIXIpcmV0dXJuIHg7dmFyIEE9bigiRXJyb3IiKSxrPXQoKGZ1bmN0aW9uKGUsdCl7dmFyIHI9dShtP3Q6ZSx2b2lkIDApLG49bT9uZXcgeChlKTpuZXcgeDtyZXR1cm4gdm9pZCAwIT09ciYmaShuLCJtZXNzYWdlIixyKSxmKG4sayxuLnN0YWNrLDIpLHRoaXMmJnMoUyx0aGlzKSYmaChuLHRoaXMsayksYXJndW1lbnRzLmxlbmd0aD55JiZkKG4sYXJndW1lbnRzW3ldKSxufSkpO2lmKGsucHJvdG90eXBlPVMsIkVycm9yIiE9PXY/bz9vKGssQSk6YyhrLEEse25hbWU6ITB9KTpnJiZiIGluIHgmJihsKGsseCxiKSxsKGsseCwicHJlcGFyZVN0YWNrVHJhY2UiKSksYyhrLHgpLCFwKXRyeXtTLm5hbWUhPT12JiZpKFMsIm5hbWUiLHYpLFMuY29uc3RydWN0b3I9a31jYXRjaChlKXt9cmV0dXJuIGt9fX0sKGUsdCxyKT0+e3ZhciBuPXIoNzIpLGE9cig0NyksaT1yKDczKTtlLmV4cG9ydHM9T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoIl9fcHJvdG9fXyJpbnt9P2Z1bmN0aW9uKCl7dmFyIGUsdD0hMSxyPXt9O3RyeXsoZT1uKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIsInNldCIpKShyLFtdKSx0PXIgaW5zdGFuY2VvZiBBcnJheX1jYXRjaChlKXt9cmV0dXJuIGZ1bmN0aW9uKHIsbil7cmV0dXJuIGEociksaShuKSx0P2UocixuKTpyLl9fcHJvdG9fXz1uLHJ9fSgpOnZvaWQgMCl9LChlLHQscik9Pnt2YXIgbj1yKDE0KSxhPXIoMzEpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dHJ5e3JldHVybiBuKGEoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpW3JdKSl9Y2F0Y2goZSl7fX19LChlLHQscik9Pnt2YXIgbj1yKDIxKSxhPVN0cmluZyxpPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBlfHxuKGUpKXJldHVybiBlO3Rocm93IGkoIkNhbid0IHNldCAiK2EoZSkrIiBhcyBhIHByb3RvdHlwZSIpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNDUpLmY7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtyIGluIGV8fG4oZSxyLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbcl19LHNldDpmdW5jdGlvbihlKXt0W3JdPWV9fSl9fSwoZSx0LHIpPT57dmFyIG49cigyMSksYT1yKDIwKSxpPXIoNzEpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dmFyIHMsbztyZXR1cm4gaSYmbihzPXQuY29uc3RydWN0b3IpJiZzIT09ciYmYShvPXMucHJvdG90eXBlKSYmbyE9PXIucHJvdG90eXBlJiZpKGUsbyksZX19LChlLHQscik9Pnt2YXIgbj1yKDc3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09ZT9hcmd1bWVudHMubGVuZ3RoPDI/IiI6dDpuKGUpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNzgpLGE9U3RyaW5nO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiU3ltYm9sIj09PW4oZSkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyIpO3JldHVybiBhKGUpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNzkpLGE9cigyMSksaT1yKDE1KSxzPXIoMzQpKCJ0b1N0cmluZ1RhZyIpLG89T2JqZWN0LGM9IkFyZ3VtZW50cyI9PWkoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKTtlLmV4cG9ydHM9bj9pOmZ1bmN0aW9uKGUpe3ZhciB0LHIsbjtyZXR1cm4gdm9pZCAwPT09ZT8iVW5kZWZpbmVkIjpudWxsPT09ZT8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihyPWZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiBlW3RdfWNhdGNoKGUpe319KHQ9byhlKSxzKSk/cjpjP2kodCk6Ik9iamVjdCI9PShuPWkodCkpJiZhKHQuY2FsbGVlKT8iQXJndW1lbnRzIjpufX0sKGUsdCxyKT0+e3ZhciBuPXt9O25bcigzNCkoInRvU3RyaW5nVGFnIildPSJ6IixlLmV4cG9ydHM9IltvYmplY3Qgel0iPT09U3RyaW5nKG4pfSwoZSx0LHIpPT57dmFyIG49cigyMCksYT1yKDQ0KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtuKHQpJiYiY2F1c2UiaW4gdCYmYShlLCJjYXVzZSIsdC5jYXVzZSl9fSwoZSx0LHIpPT57dmFyIG49cig0NCksYT1yKDgyKSxpPXIoODMpLHM9RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLG8pe2kmJihzP3MoZSx0KTpuKGUsInN0YWNrIixhKHIsbykpKX19LChlLHQscik9Pnt2YXIgbj1yKDE0KSxhPUVycm9yLGk9bigiIi5yZXBsYWNlKSxzPVN0cmluZyhhKCJ6eGNhc2QiKS5zdGFjayksbz0vXG5ccyphdCBbXjpdKjpbXlxuXSovLGM9by50ZXN0KHMpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKGMmJiJzdHJpbmciPT10eXBlb2YgZSYmIWEucHJlcGFyZVN0YWNrVHJhY2UpZm9yKDt0LS07KWU9aShlLG8sIiIpO3JldHVybiBlfX0sKGUsdCxyKT0+e3ZhciBuPXIoNyksYT1yKDExKTtlLmV4cG9ydHM9IW4oKGZ1bmN0aW9uKCl7dmFyIGU9RXJyb3IoImEiKTtyZXR1cm4hKCJzdGFjayJpbiBlKXx8KE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzdGFjayIsYSgxLDcpKSw3IT09ZS5zdGFjayl9KSl9LChlLHQscik9Pnt2YXIgbj1yKDg1KSxhPXIoOTApLmZpbmRMYXN0LGk9bi5hVHlwZWRBcnJheTsoMCxuLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QpKCJmaW5kTGFzdCIsKGZ1bmN0aW9uKGUpe3JldHVybiBhKGkodGhpcyksZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSl9LChlLHQscik9Pnt2YXIgbixhLGkscz1yKDg2KSxvPXIoNiksYz1yKDQpLGw9cigyMSksaD1yKDIwKSx1PXIoMzkpLGQ9cig3OCksZj1yKDMyKSxnPXIoNDQpLHA9cig0OCksbT1yKDg3KSxiPXIoMjUpLHk9cig4OCksdz1yKDcxKSx2PXIoMzQpLHg9cig0MSksUz1yKDUyKSxBPVMuZW5mb3JjZSxrPVMuZ2V0LEM9Yy5JbnQ4QXJyYXksTz1DJiZDLnByb3RvdHlwZSxGPWMuVWludDhDbGFtcGVkQXJyYXksST1GJiZGLnByb3RvdHlwZSxUPUMmJnkoQyksTT1PJiZ5KE8pLEU9T2JqZWN0LnByb3RvdHlwZSxQPWMuVHlwZUVycm9yLFI9digidG9TdHJpbmdUYWciKSxOPXgoIlRZUEVEX0FSUkFZX1RBRyIpLEQ9IlR5cGVkQXJyYXlDb25zdHJ1Y3RvciIsQj1zJiYhIXcmJiJPcGVyYSIhPT1kKGMub3BlcmEpLEw9ITEsXz17SW50OEFycmF5OjEsVWludDhBcnJheToxLFVpbnQ4Q2xhbXBlZEFycmF5OjEsSW50MTZBcnJheToyLFVpbnQxNkFycmF5OjIsSW50MzJBcnJheTo0LFVpbnQzMkFycmF5OjQsRmxvYXQzMkFycmF5OjQsRmxvYXQ2NEFycmF5Ojh9LGo9e0JpZ0ludDY0QXJyYXk6OCxCaWdVaW50NjRBcnJheTo4fSxVPWZ1bmN0aW9uKGUpe2lmKCFoKGUpKXJldHVybiExO3ZhciB0PWQoZSk7cmV0dXJuIHUoXyx0KXx8dShqLHQpfTtmb3IobiBpbiBfKShpPShhPWNbbl0pJiZhLnByb3RvdHlwZSk/QShpKVtEXT1hOkI9ITE7Zm9yKG4gaW4gaikoaT0oYT1jW25dKSYmYS5wcm90b3R5cGUpJiYoQShpKVtEXT1hKTtpZigoIUJ8fCFsKFQpfHxUPT09RnVuY3Rpb24ucHJvdG90eXBlKSYmKFQ9ZnVuY3Rpb24oKXt0aHJvdyBQKCJJbmNvcnJlY3QgaW52b2NhdGlvbiIpfSxCKSlmb3IobiBpbiBfKWNbbl0mJncoY1tuXSxUKTtpZigoIUJ8fCFNfHxNPT09RSkmJihNPVQucHJvdG90eXBlLEIpKWZvcihuIGluIF8pY1tuXSYmdyhjW25dLnByb3RvdHlwZSxNKTtpZihCJiZ5KEkpIT09TSYmdyhJLE0pLG8mJiF1KE0sUikpZm9yKG4gaW4gTD0hMCxtKE0sUix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBoKHRoaXMpP3RoaXNbTl06dm9pZCAwfX0pLF8pY1tuXSYmZyhjW25dLE4sbik7ZS5leHBvcnRzPXtOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTOkIsVFlQRURfQVJSQVlfVEFHOkwmJk4sYVR5cGVkQXJyYXk6ZnVuY3Rpb24oZSl7aWYoVShlKSlyZXR1cm4gZTt0aHJvdyBQKCJUYXJnZXQgaXMgbm90IGEgdHlwZWQgYXJyYXkiKX0sYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtpZihsKGUpJiYoIXd8fGIoVCxlKSkpcmV0dXJuIGU7dGhyb3cgUChmKGUpKyIgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3IiKX0sZXhwb3J0VHlwZWRBcnJheU1ldGhvZDpmdW5jdGlvbihlLHQscixuKXtpZihvKXtpZihyKWZvcih2YXIgYSBpbiBfKXt2YXIgaT1jW2FdO2lmKGkmJnUoaS5wcm90b3R5cGUsZSkpdHJ5e2RlbGV0ZSBpLnByb3RvdHlwZVtlXX1jYXRjaChyKXt0cnl7aS5wcm90b3R5cGVbZV09dH1jYXRjaChlKXt9fX1NW2VdJiYhcnx8cChNLGUscj90OkImJk9bZV18fHQsbil9fSxleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kOmZ1bmN0aW9uKGUsdCxyKXt2YXIgbixhO2lmKG8pe2lmKHcpe2lmKHIpZm9yKG4gaW4gXylpZigoYT1jW25dKSYmdShhLGUpKXRyeXtkZWxldGUgYVtlXX1jYXRjaChlKXt9aWYoVFtlXSYmIXIpcmV0dXJuO3RyeXtyZXR1cm4gcChULGUscj90OkImJlRbZV18fHQpfWNhdGNoKGUpe319Zm9yKG4gaW4gXykhKGE9Y1tuXSl8fGFbZV0mJiFyfHxwKGEsZSx0KX19LGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjpmdW5jdGlvbiBlKHQpe3ZhciByPXkodCk7aWYoaChyKSl7dmFyIG49ayhyKTtyZXR1cm4gbiYmdShuLEQpP25bRF06ZShyKX19LGlzVmlldzpmdW5jdGlvbihlKXtpZighaChlKSlyZXR1cm4hMTt2YXIgdD1kKGUpO3JldHVybiJEYXRhVmlldyI9PT10fHx1KF8sdCl8fHUoaix0KX0saXNUeXBlZEFycmF5OlUsVHlwZWRBcnJheTpULFR5cGVkQXJyYXlQcm90b3R5cGU6TX19LGU9PntlLmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmInVuZGVmaW5lZCIhPXR5cGVvZiBEYXRhVmlld30sKGUsdCxyKT0+e3ZhciBuPXIoNDkpLGE9cig0NSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gci5nZXQmJm4oci5nZXQsdCx7Z2V0dGVyOiEwfSksci5zZXQmJm4oci5zZXQsdCx7c2V0dGVyOiEwfSksYS5mKGUsdCxyKX19LChlLHQscik9Pnt2YXIgbj1yKDM5KSxhPXIoMjEpLGk9cig0MCkscz1yKDU0KSxvPXIoODkpLGM9cygiSUVfUFJPVE8iKSxsPU9iamVjdCxoPWwucHJvdG90eXBlO2UuZXhwb3J0cz1vP2wuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9aShlKTtpZihuKHQsYykpcmV0dXJuIHRbY107dmFyIHI9dC5jb25zdHJ1Y3RvcjtyZXR1cm4gYShyKSYmdCBpbnN0YW5jZW9mIHI/ci5wcm90b3R5cGU6dCBpbnN0YW5jZW9mIGw/aDpudWxsfX0sKGUsdCxyKT0+e3ZhciBuPXIoNyk7ZS5leHBvcnRzPSFuKChmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBlKSE9PWUucHJvdG90eXBlfSkpfSwoZSx0LHIpPT57dmFyIG49cig5MSksYT1yKDEzKSxpPXIoNDApLHM9cig2NCksbz1mdW5jdGlvbihlKXt2YXIgdD0xPT1lO3JldHVybiBmdW5jdGlvbihyLG8sYyl7Zm9yKHZhciBsLGg9aShyKSx1PWEoaCksZD1uKG8sYyksZj1zKHUpO2YtLSA+MDspaWYoZChsPXVbZl0sZixoKSlzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiBsO2Nhc2UgMTpyZXR1cm4gZn1yZXR1cm4gdD8tMTp2b2lkIDB9fTtlLmV4cG9ydHM9e2ZpbmRMYXN0Om8oMCksZmluZExhc3RJbmRleDpvKDEpfX0sKGUsdCxyKT0+e3ZhciBuPXIoOTIpLGE9cigzMSksaT1yKDkpLHM9bihuLmJpbmQpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBhKGUpLHZvaWQgMD09PXQ/ZTppP3MoZSx0KTpmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHQsYXJndW1lbnRzKX19fSwoZSx0LHIpPT57dmFyIG49cigxNSksYT1yKDE0KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoIkZ1bmN0aW9uIj09PW4oZSkpcmV0dXJuIGEoZSl9fSwoZSx0LHIpPT57dmFyIG49cig4NSksYT1yKDkwKS5maW5kTGFzdEluZGV4LGk9bi5hVHlwZWRBcnJheTsoMCxuLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QpKCJmaW5kTGFzdEluZGV4IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEoaSh0aGlzKSxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0pKX0sKGUsdCxyKT0+e3ZhciBuPXIoNCksYT1yKDgpLGk9cig4NSkscz1yKDY0KSxvPXIoOTUpLGM9cig0MCksbD1yKDcpLGg9bi5SYW5nZUVycm9yLHU9bi5JbnQ4QXJyYXksZD11JiZ1LnByb3RvdHlwZSxmPWQmJmQuc2V0LGc9aS5hVHlwZWRBcnJheSxwPWkuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxtPSFsKChmdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OENsYW1wZWRBcnJheSgyKTtyZXR1cm4gYShmLGUse2xlbmd0aDoxLDA6M30sMSksMyE9PWVbMV19KSksYj1tJiZpLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MmJmwoKGZ1bmN0aW9uKCl7dmFyIGU9bmV3IHUoMik7cmV0dXJuIGUuc2V0KDEpLGUuc2V0KCIyIiwxKSwwIT09ZVswXXx8MiE9PWVbMV19KSk7cCgic2V0IiwoZnVuY3Rpb24oZSl7Zyh0aGlzKTt2YXIgdD1vKGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDEpLHI9YyhlKTtpZihtKXJldHVybiBhKGYsdGhpcyxyLHQpO3ZhciBuPXRoaXMubGVuZ3RoLGk9cyhyKSxsPTA7aWYoaSt0Pm4pdGhyb3cgaCgiV3JvbmcgbGVuZ3RoIik7Zm9yKDtsPGk7KXRoaXNbdCtsXT1yW2wrK119KSwhbXx8Yil9LChlLHQscik9Pnt2YXIgbj1yKDk2KSxhPVJhbmdlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9bihlKTtpZihyJXQpdGhyb3cgYSgiV3Jvbmcgb2Zmc2V0Iik7cmV0dXJuIHJ9fSwoZSx0LHIpPT57dmFyIG49cig2MiksYT1SYW5nZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKGUpO2lmKHQ8MCl0aHJvdyBhKCJUaGUgYXJndW1lbnQgY2FuJ3QgYmUgbGVzcyB0aGFuIDAiKTtyZXR1cm4gdH19LChlLHQscik9Pnt2YXIgbj1yKDk4KSxhPXIoODUpLGk9YS5hVHlwZWRBcnJheSxzPWEuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxvPWEuZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yO3MoInRvUmV2ZXJzZWQiLChmdW5jdGlvbigpe3JldHVybiBuKGkodGhpcyksbyh0aGlzKSl9KSl9LChlLHQscik9Pnt2YXIgbj1yKDY0KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9bihlKSxhPW5ldyB0KHIpLGk9MDtpPHI7aSsrKWFbaV09ZVtyLWktMV07cmV0dXJuIGF9fSwoZSx0LHIpPT57dmFyIG49cig4NSksYT1yKDE0KSxpPXIoMzEpLHM9cigxMDApLG89bi5hVHlwZWRBcnJheSxjPW4uZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yLGw9bi5leHBvcnRUeXBlZEFycmF5TWV0aG9kLGg9YShuLlR5cGVkQXJyYXlQcm90b3R5cGUuc29ydCk7bCgidG9Tb3J0ZWQiLChmdW5jdGlvbihlKXt2b2lkIDAhPT1lJiZpKGUpO3ZhciB0PW8odGhpcykscj1zKGModCksdCk7cmV0dXJuIGgocixlKX0pKX0sKGUsdCxyKT0+e3ZhciBuPXIoNjQpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj0wLGE9bih0KSxpPW5ldyBlKGEpO2E+cjspaVtyXT10W3IrK107cmV0dXJuIGl9fSwoZSx0LHIpPT57dmFyIG49cigxMDIpLGE9cig4NSksaT1yKDEwMykscz1yKDYyKSxvPXIoMTA0KSxjPWEuYVR5cGVkQXJyYXksbD1hLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixoPWEuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCx1PSEhZnVuY3Rpb24oKXt0cnl7bmV3IEludDhBcnJheSgxKS53aXRoKDIse3ZhbHVlT2Y6ZnVuY3Rpb24oKXt0aHJvdyA4fX0pfWNhdGNoKGUpe3JldHVybiA4PT09ZX19KCk7aCgid2l0aCIse3dpdGg6ZnVuY3Rpb24oZSx0KXt2YXIgcj1jKHRoaXMpLGE9cyhlKSxoPWkocik/byh0KTordDtyZXR1cm4gbihyLGwociksYSxoKX19LndpdGgsIXUpfSwoZSx0LHIpPT57dmFyIG49cig2NCksYT1yKDYyKSxpPVJhbmdlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLHMpe3ZhciBvPW4oZSksYz1hKHIpLGw9YzwwP28rYzpjO2lmKGw+PW98fGw8MCl0aHJvdyBpKCJJbmNvcnJlY3QgaW5kZXgiKTtmb3IodmFyIGg9bmV3IHQobyksdT0wO3U8bzt1KyspaFt1XT11PT09bD9zOmVbdV07cmV0dXJuIGh9fSwoZSx0LHIpPT57dmFyIG49cig3OCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW4oZSk7cmV0dXJuIkJpZ0ludDY0QXJyYXkiPT10fHwiQmlnVWludDY0QXJyYXkiPT10fX0sKGUsdCxyKT0+e3ZhciBuPXIoMTkpLGE9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKGUsIm51bWJlciIpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBhKCJDYW4ndCBjb252ZXJ0IG51bWJlciB0byBiaWdpbnQiKTtyZXR1cm4gQmlnSW50KHQpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNiksYT1yKDg3KSxpPXIoMTA2KSxzPUFycmF5QnVmZmVyLnByb3RvdHlwZTtuJiYhKCJkZXRhY2hlZCJpbiBzKSYmYShzLCJkZXRhY2hlZCIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzKX19KX0sKGUsdCxyKT0+e3ZhciBuPXIoMTQpLGE9cigxMDcpLGk9bihBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigwIT09YShlKSlyZXR1cm4hMTt0cnl7cmV0dXJuIGkoZSwwLDApLCExfWNhdGNoKGUpe3JldHVybiEwfX19LChlLHQscik9Pnt2YXIgbj1yKDcyKSxhPXIoMTUpLGk9VHlwZUVycm9yO2UuZXhwb3J0cz1uKEFycmF5QnVmZmVyLnByb3RvdHlwZSwiYnl0ZUxlbmd0aCIsImdldCIpfHxmdW5jdGlvbihlKXtpZigiQXJyYXlCdWZmZXIiIT1hKGUpKXRocm93IGkoIkFycmF5QnVmZmVyIGV4cGVjdGVkIik7cmV0dXJuIGUuYnl0ZUxlbmd0aH19LChlLHQscik9Pnt2YXIgbj1yKDMpLGE9cigxMDkpO2EmJm4oe3RhcmdldDoiQXJyYXlCdWZmZXIiLHByb3RvOiEwfSx7dHJhbnNmZXI6ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOnZvaWQgMCwhMCl9fSl9LChlLHQscik9Pnt2YXIgbj1yKDQpLGE9cigxNCksaT1yKDcyKSxzPXIoMTEwKSxvPXIoMTA2KSxjPXIoMTA3KSxsPXIoMTExKSxoPW4uVHlwZUVycm9yLHU9bi5zdHJ1Y3R1cmVkQ2xvbmUsZD1uLkFycmF5QnVmZmVyLGY9bi5EYXRhVmlldyxnPU1hdGgubWluLHA9ZC5wcm90b3R5cGUsbT1mLnByb3RvdHlwZSxiPWEocC5zbGljZSkseT1pKHAsInJlc2l6YWJsZSIsImdldCIpLHc9aShwLCJtYXhCeXRlTGVuZ3RoIiwiZ2V0Iiksdj1hKG0uZ2V0SW50OCkseD1hKG0uc2V0SW50OCk7ZS5leHBvcnRzPWwmJmZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1jKGUpLGE9dm9pZCAwPT09dD9uOnModCksaT0heXx8IXkoZSk7aWYobyhlKSl0aHJvdyBoKCJBcnJheUJ1ZmZlciBpcyBkZXRhY2hlZCIpO3ZhciBsPXUoZSx7dHJhbnNmZXI6W2VdfSk7aWYobj09YSYmKHJ8fGkpKXJldHVybiBsO2lmKG4+PWEmJighcnx8aSkpcmV0dXJuIGIobCwwLGEpO2Zvcih2YXIgcD1yJiYhaSYmdz97bWF4Qnl0ZUxlbmd0aDp3KGwpfTp2b2lkIDAsbT1uZXcgZChhLHApLFM9bmV3IGYobCksQT1uZXcgZihtKSxrPWcoYSxuKSxDPTA7QzxrO0MrKyl4KEEsQyx2KFMsQykpO3JldHVybiBtfX0sKGUsdCxyKT0+e3ZhciBuPXIoNjIpLGE9cig2NSksaT1SYW5nZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lKXJldHVybiAwO3ZhciB0PW4oZSkscj1hKHQpO2lmKHQhPT1yKXRocm93IGkoIldyb25nIGxlbmd0aCBvciBpbmRleCIpO3JldHVybiByfX0sKGUsdCxyKT0+e3ZhciBuPXIoNCksYT1yKDcpLGk9cigyOCkscz1yKDExMiksbz1yKDExMyksYz1yKDExNCksbD1uLnN0cnVjdHVyZWRDbG9uZTtlLmV4cG9ydHM9ISFsJiYhYSgoZnVuY3Rpb24oKXtpZihvJiZpPjkyfHxjJiZpPjk0fHxzJiZpPjk3KXJldHVybiExO3ZhciBlPW5ldyBBcnJheUJ1ZmZlcig4KSx0PWwoZSx7dHJhbnNmZXI6W2VdfSk7cmV0dXJuIDAhPWUuYnl0ZUxlbmd0aHx8OCE9dC5ieXRlTGVuZ3RofSkpfSwoZSx0LHIpPT57dmFyIG49cigxMTMpLGE9cigxMTQpO2UuZXhwb3J0cz0hbiYmIWEmJiJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50fSxlPT57ZS5leHBvcnRzPSJvYmplY3QiPT10eXBlb2YgRGVubyYmRGVubyYmIm9iamVjdCI9PXR5cGVvZiBEZW5vLnZlcnNpb259LChlLHQscik9Pnt2YXIgbj1yKDE1KTtlLmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiBwcm9jZXNzJiYicHJvY2VzcyI9PW4ocHJvY2Vzcyl9LChlLHQscik9Pnt2YXIgbj1yKDMpLGE9cigxMDkpO2EmJm4oe3RhcmdldDoiQXJyYXlCdWZmZXIiLHByb3RvOiEwfSx7dHJhbnNmZXJUb0ZpeGVkTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcyxhcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1swXTp2b2lkIDAsITEpfX0pfSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoMTE3KTtuKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6IXIoMTI1KSgiZGlmZmVyZW5jZSIpfSx7ZGlmZmVyZW5jZTphfSl9LChlLHQscik9Pnt2YXIgbj1yKDExOCksYT1yKDExOSksaT1yKDEyMCkscz1yKDEyMyksbz1yKDEyNCksYz1yKDEyMSksbD1yKDEyMiksaD1hLmhhcyx1PWEucmVtb3ZlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKHRoaXMpLHI9byhlKSxhPWkodCk7cmV0dXJuIHModCk8PXIuc2l6ZT9jKHQsKGZ1bmN0aW9uKGUpe3IuaW5jbHVkZXMoZSkmJnUoYSxlKX0pKTpsKHIuZ2V0SXRlcmF0b3IoKSwoZnVuY3Rpb24oZSl7aCh0LGUpJiZ1KGEsZSl9KSksYX19LChlLHQscik9Pnt2YXIgbj1yKDExOSkuaGFzO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbihlKSxlfX0sKGUsdCxyKT0+e3ZhciBuPXIoMTQpLGE9U2V0LnByb3RvdHlwZTtlLmV4cG9ydHM9e1NldCxhZGQ6bihhLmFkZCksaGFzOm4oYS5oYXMpLHJlbW92ZTpuKGEuZGVsZXRlKSxwcm90bzphfX0sKGUsdCxyKT0+e3ZhciBuPXIoMTE5KSxhPXIoMTIxKSxpPW4uU2V0LHM9bi5hZGQ7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBpO3JldHVybiBhKGUsKGZ1bmN0aW9uKGUpe3ModCxlKX0pKSx0fX0sKGUsdCxyKT0+e3ZhciBuPXIoMTQpLGE9cigxMjIpLGk9cigxMTkpLHM9aS5TZXQsbz1pLnByb3RvLGM9bihvLmZvckVhY2gpLGw9bihvLmtleXMpLGg9bChuZXcgcykubmV4dDtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiByP2EobChlKSx0LGgpOmMoZSx0KX19LChlLHQscik9Pnt2YXIgbj1yKDgpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7Zm9yKHZhciBhLGkscz1yfHxlLm5leHQ7IShhPW4ocyxlKSkuZG9uZTspaWYodm9pZCAwIT09KGk9dChhLnZhbHVlKSkpcmV0dXJuIGl9fSwoZSx0LHIpPT57dmFyIG49cig3MiksYT1yKDExOSk7ZS5leHBvcnRzPW4oYS5wcm90bywic2l6ZSIsImdldCIpfHxmdW5jdGlvbihlKXtyZXR1cm4gZS5zaXplfX0sKGUsdCxyKT0+e3ZhciBuPXIoMzEpLGE9cig0NyksaT1yKDgpLHM9cig2Miksbz1UeXBlRXJyb3IsYz1NYXRoLm1heCxsPWZ1bmN0aW9uKGUsdCxyLG4pe3RoaXMuc2V0PWUsdGhpcy5zaXplPXQsdGhpcy5oYXM9cix0aGlzLmtleXM9bn07bC5wcm90b3R5cGU9e2dldEl0ZXJhdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIGEoaSh0aGlzLmtleXMsdGhpcy5zZXQpKX0saW5jbHVkZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGkodGhpcy5oYXMsdGhpcy5zZXQsZSl9fSxlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7YShlKTt2YXIgdD0rZS5zaXplO2lmKHQhPXQpdGhyb3cgbygiSW52YWxpZCBzaXplIik7cmV0dXJuIG5ldyBsKGUsYyhzKHQpLDApLG4oZS5oYXMpLG4oZS5rZXlzKSl9fSwoZSx0LHIpPT57dmFyIG49cigyNCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4obmV3KG4oIlNldCIpKSlbZV0oe3NpemU6MCxoYXM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sa2V5czpmdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6ITB9fX19fSksITB9Y2F0Y2goZSl7cmV0dXJuITF9fX0sKGUsdCxyKT0+e3ZhciBuPXIoMyksYT1yKDcpLGk9cigxMjcpO24oe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohcigxMjUpKCJpbnRlcnNlY3Rpb24iKXx8YSgoZnVuY3Rpb24oKXtyZXR1cm4iMywyIiE9QXJyYXkuZnJvbShuZXcgU2V0KFsxLDIsM10pLmludGVyc2VjdGlvbihuZXcgU2V0KFszLDJdKSkpfSkpfSx7aW50ZXJzZWN0aW9uOml9KX0sKGUsdCxyKT0+e3ZhciBuPXIoMTE4KSxhPXIoMTE5KSxpPXIoMTIzKSxzPXIoMTI0KSxvPXIoMTIxKSxjPXIoMTIyKSxsPWEuU2V0LGg9YS5hZGQsdT1hLmhhcztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bih0aGlzKSxyPXMoZSksYT1uZXcgbDtyZXR1cm4gaSh0KT5yLnNpemU/YyhyLmdldEl0ZXJhdG9yKCksKGZ1bmN0aW9uKGUpe3UodCxlKSYmaChhLGUpfSkpOm8odCwoZnVuY3Rpb24oZSl7ci5pbmNsdWRlcyhlKSYmaChhLGUpfSkpLGF9fSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoMTI5KTtuKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6IXIoMTI1KSgiaXNEaXNqb2ludEZyb20iKX0se2lzRGlzam9pbnRGcm9tOmF9KX0sKGUsdCxyKT0+e3ZhciBuPXIoMTE4KSxhPXIoMTE5KS5oYXMsaT1yKDEyMykscz1yKDEyNCksbz1yKDEyMSksYz1yKDEyMiksbD1yKDEzMCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW4odGhpcykscj1zKGUpO2lmKGkodCk8PXIuc2l6ZSlyZXR1cm4hMSE9PW8odCwoZnVuY3Rpb24oZSl7aWYoci5pbmNsdWRlcyhlKSlyZXR1cm4hMX0pLCEwKTt2YXIgaD1yLmdldEl0ZXJhdG9yKCk7cmV0dXJuITEhPT1jKGgsKGZ1bmN0aW9uKGUpe2lmKGEodCxlKSlyZXR1cm4gbChoLCJub3JtYWwiLCExKX0pKX19LChlLHQscik9Pnt2YXIgbj1yKDgpLGE9cig0NyksaT1yKDMwKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe3ZhciBzLG87YShlKTt0cnl7aWYoIShzPWkoZSwicmV0dXJuIikpKXtpZigidGhyb3ciPT09dCl0aHJvdyByO3JldHVybiByfXM9bihzLGUpfWNhdGNoKGUpe289ITAscz1lfWlmKCJ0aHJvdyI9PT10KXRocm93IHI7aWYobyl0aHJvdyBzO3JldHVybiBhKHMpLHJ9fSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoMTMyKTtuKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6IXIoMTI1KSgiaXNTdWJzZXRPZiIpfSx7aXNTdWJzZXRPZjphfSl9LChlLHQscik9Pnt2YXIgbj1yKDExOCksYT1yKDEyMyksaT1yKDEyMSkscz1yKDEyNCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW4odGhpcykscj1zKGUpO3JldHVybiEoYSh0KT5yLnNpemUpJiYhMSE9PWkodCwoZnVuY3Rpb24oZSl7aWYoIXIuaW5jbHVkZXMoZSkpcmV0dXJuITF9KSwhMCl9fSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoMTM0KTtuKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6IXIoMTI1KSgiaXNTdXBlcnNldE9mIil9LHtpc1N1cGVyc2V0T2Y6YX0pfSwoZSx0LHIpPT57dmFyIG49cigxMTgpLGE9cigxMTkpLmhhcyxpPXIoMTIzKSxzPXIoMTI0KSxvPXIoMTIyKSxjPXIoMTMwKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bih0aGlzKSxyPXMoZSk7aWYoaSh0KTxyLnNpemUpcmV0dXJuITE7dmFyIGw9ci5nZXRJdGVyYXRvcigpO3JldHVybiExIT09byhsLChmdW5jdGlvbihlKXtpZighYSh0LGUpKXJldHVybiBjKGwsIm5vcm1hbCIsITEpfSkpfX0sKGUsdCxyKT0+e3ZhciBuPXIoMyksYT1yKDEzNik7bih7dGFyZ2V0OiJTZXQiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOiFyKDEyNSkoInN5bW1ldHJpY0RpZmZlcmVuY2UiKX0se3N5bW1ldHJpY0RpZmZlcmVuY2U6YX0pfSwoZSx0LHIpPT57dmFyIG49cigxMTgpLGE9cigxMTkpLGk9cigxMjApLHM9cigxMjQpLG89cigxMjIpLGM9YS5hZGQsbD1hLmhhcyxoPWEucmVtb3ZlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKHRoaXMpLHI9cyhlKS5nZXRJdGVyYXRvcigpLGE9aSh0KTtyZXR1cm4gbyhyLChmdW5jdGlvbihlKXtsKHQsZSk/aChhLGUpOmMoYSxlKX0pKSxhfX0sKGUsdCxyKT0+e3ZhciBuPXIoMyksYT1yKDEzOCk7bih7dGFyZ2V0OiJTZXQiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOiFyKDEyNSkoInVuaW9uIil9LHt1bmlvbjphfSl9LChlLHQscik9Pnt2YXIgbj1yKDExOCksYT1yKDExOSkuYWRkLGk9cigxMjApLHM9cigxMjQpLG89cigxMjIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKHRoaXMpLHI9cyhlKS5nZXRJdGVyYXRvcigpLGM9aSh0KTtyZXR1cm4gbyhyLChmdW5jdGlvbihlKXthKGMsZSl9KSksY319LChlLHQscik9Pnt2YXIgbj1yKDMpLGE9cig0MCksaT1yKDY0KSxzPXIoMTQwKSxvPXIoMTQyKTtuKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxhcml0eToxLGZvcmNlZDpyKDcpKChmdW5jdGlvbigpe3JldHVybiA0Mjk0OTY3Mjk3IT09W10ucHVzaC5jYWxsKHtsZW5ndGg6NDI5NDk2NzI5Nn0sMSl9KSl8fCFmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sImxlbmd0aCIse3dyaXRhYmxlOiExfSkucHVzaCgpfWNhdGNoKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVHlwZUVycm9yfX0oKX0se3B1c2g6ZnVuY3Rpb24oZSl7dmFyIHQ9YSh0aGlzKSxyPWkodCksbj1hcmd1bWVudHMubGVuZ3RoO28ocituKTtmb3IodmFyIGM9MDtjPG47YysrKXRbcl09YXJndW1lbnRzW2NdLHIrKztyZXR1cm4gcyh0LHIpLHJ9fSl9LChlLHQscik9Pnt2YXIgbj1yKDYpLGE9cigxNDEpLGk9VHlwZUVycm9yLHM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixvPW4mJiFmdW5jdGlvbigpe2lmKHZvaWQgMCE9PXRoaXMpcmV0dXJuITA7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwibGVuZ3RoIix7d3JpdGFibGU6ITF9KS5sZW5ndGg9MX1jYXRjaChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFR5cGVFcnJvcn19KCk7ZS5leHBvcnRzPW8/ZnVuY3Rpb24oZSx0KXtpZihhKGUpJiYhcyhlLCJsZW5ndGgiKS53cml0YWJsZSl0aHJvdyBpKCJDYW5ub3Qgc2V0IHJlYWQgb25seSAubGVuZ3RoIik7cmV0dXJuIGUubGVuZ3RoPXR9OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubGVuZ3RoPXR9fSwoZSx0LHIpPT57dmFyIG49cigxNSk7ZS5leHBvcnRzPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJBcnJheSI9PW4oZSl9fSxlPT57dmFyIHQ9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZihlPjkwMDcxOTkyNTQ3NDA5OTEpdGhyb3cgdCgiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7cmV0dXJuIGV9fSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoNCksaT1yKDg3KSxzPXIoNiksbz1UeXBlRXJyb3IsYz1PYmplY3QuZGVmaW5lUHJvcGVydHksbD1hLnNlbGYhPT1hO3RyeXtpZihzKXt2YXIgaD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsInNlbGYiKTshbCYmaCYmaC5nZXQmJmguZW51bWVyYWJsZXx8aShhLCJzZWxmIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldDpmdW5jdGlvbihlKXtpZih0aGlzIT09YSl0aHJvdyBvKCJJbGxlZ2FsIGludm9jYXRpb24iKTtjKGEsInNlbGYiLHt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9ZWxzZSBuKHtnbG9iYWw6ITAsc2ltcGxlOiEwLGZvcmNlZDpsfSx7c2VsZjphfSl9Y2F0Y2goZSl7fX0sKGUsdCxyKT0+e3ZhciBuO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlZlcmJvc2l0eUxldmVsPXQuVXRpbD10LlVua25vd25FcnJvckV4Y2VwdGlvbj10LlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbj10LlRleHRSZW5kZXJpbmdNb2RlPXQuUmVuZGVyaW5nSW50ZW50RmxhZz10LlByb21pc2VDYXBhYmlsaXR5PXQuUGVybWlzc2lvbkZsYWc9dC5QYXNzd29yZFJlc3BvbnNlcz10LlBhc3N3b3JkRXhjZXB0aW9uPXQuUGFnZUFjdGlvbkV2ZW50VHlwZT10Lk9QUz10Lk1pc3NpbmdQREZFeGNlcHRpb249dC5NQVhfSU1BR0VfU0laRV9UT19DQUNIRT10LkxJTkVfRkFDVE9SPXQuTElORV9ERVNDRU5UX0ZBQ1RPUj10LkludmFsaWRQREZFeGNlcHRpb249dC5JbWFnZUtpbmQ9dC5JREVOVElUWV9NQVRSSVg9dC5Gb3JtYXRFcnJvcj10LkZlYXR1cmVUZXN0PXQuRk9OVF9JREVOVElUWV9NQVRSSVg9dC5Eb2N1bWVudEFjdGlvbkV2ZW50VHlwZT10LkNNYXBDb21wcmVzc2lvblR5cGU9dC5CYXNlRXhjZXB0aW9uPXQuQkFTRUxJTkVfRkFDVE9SPXQuQW5ub3RhdGlvblR5cGU9dC5Bbm5vdGF0aW9uUmVwbHlUeXBlPXQuQW5ub3RhdGlvbk1vZGU9dC5Bbm5vdGF0aW9uRmxhZz10LkFubm90YXRpb25GaWVsZEZsYWc9dC5Bbm5vdGF0aW9uRWRpdG9yVHlwZT10LkFubm90YXRpb25FZGl0b3JQcmVmaXg9dC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZT10LkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU9dC5Bbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlPXQuQWJvcnRFeGNlcHRpb249dm9pZCAwLHQuYXNzZXJ0PWZ1bmN0aW9uKGUsdCl7ZXx8bCh0KX0sdC5ieXRlc1RvU3RyaW5nPWcsdC5jcmVhdGVWYWxpZEFic29sdXRlVXJsPWZ1bmN0aW9uKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7aWYoIWUpcmV0dXJuIG51bGw7dHJ5e2lmKHImJiJzdHJpbmciPT10eXBlb2YgZSl7aWYoci5hZGREZWZhdWx0UHJvdG9jb2wmJmUuc3RhcnRzV2l0aCgid3d3LiIpKXtjb25zdCB0PWUubWF0Y2goL1wuL2cpOyhudWxsPT10P3ZvaWQgMDp0Lmxlbmd0aCk+PTImJihlPSJodHRwOi8vIi5jb25jYXQoZSkpfWlmKHIudHJ5Q29udmVydEVuY29kaW5nKXRyeXtlPXkoZSl9Y2F0Y2goZSl7fX1jb25zdCBuPXQ/bmV3IFVSTChlLHQpOm5ldyBVUkwoZSk7aWYoZnVuY3Rpb24oZSl7c3dpdGNoKG51bGw9PWU/dm9pZCAwOmUucHJvdG9jb2wpe2Nhc2UiaHR0cDoiOmNhc2UiaHR0cHM6IjpjYXNlImZ0cDoiOmNhc2UibWFpbHRvOiI6Y2FzZSJ0ZWw6IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0obikpcmV0dXJuIG59Y2F0Y2goZSl7fXJldHVybiBudWxsfSx0LmdldE1vZGlmaWNhdGlvbkRhdGU9ZnVuY3Rpb24oKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bmV3IERhdGU7cmV0dXJuW2UuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLChlLmdldFVUQ01vbnRoKCkrMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENEYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpXS5qb2luKCIiKX0sdC5nZXRVdWlkPWZ1bmN0aW9uKCl7dmFyIGUsdDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGNyeXB0byYmImZ1bmN0aW9uIj09dHlwZW9mKG51bGw9PT0oZT1jcnlwdG8pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnJhbmRvbVVVSUQpKXJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoMzIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgY3J5cHRvJiYiZnVuY3Rpb24iPT10eXBlb2YobnVsbD09PSh0PWNyeXB0byl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuZ2V0UmFuZG9tVmFsdWVzKSljcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHIpO2Vsc2UgZm9yKGxldCBlPTA7ZTwzMjtlKyspcltlXT1NYXRoLmZsb29yKDI1NSpNYXRoLnJhbmRvbSgpKTtyZXR1cm4gZyhyKX0sdC5nZXRWZXJib3NpdHlMZXZlbD1mdW5jdGlvbigpe3JldHVybiBzfSx0LmluZm89ZnVuY3Rpb24oZSl7cz49aS5JTkZPUyYmY29uc29sZS5sb2coIkluZm86ICIuY29uY2F0KGUpKX0sdC5pc0FycmF5QnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmdm9pZCAwIT09KG51bGw9PWU/dm9pZCAwOmUuYnl0ZUxlbmd0aCl9LHQuaXNBcnJheUVxdWFsPWZ1bmN0aW9uKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspaWYoZVtyXSE9PXRbcl0pcmV0dXJuITE7cmV0dXJuITB9LHQuaXNOb2RlSlM9dm9pZCAwLHQubm9ybWFsaXplVW5pY29kZT1mdW5jdGlvbihlKXtyZXR1cm4gd3x8KHc9LyhbXHhBMFx4QjVcdTAzN0VcdTBFQjNcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMTI2XHVGQjAwLVx1RkIwNFx1RkIwNlx1RkIyMC1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJBMVx1RkJBNC1cdUZCQTlcdUZCQUUtXHVGQkIxXHVGQkQzLVx1RkJEQ1x1RkJERS1cdUZCRTdcdUZCRUEtXHVGQkY4XHVGQkZDXHVGQkZEXHVGQzAwLVx1RkM1RFx1RkM2NC1cdUZDRjFcdUZDRjUtXHVGRDNEXHVGRDg4XHVGREY0XHVGREZBXHVGREZCXHVGRTcxXHVGRTc3XHVGRTc5XHVGRTdCXHVGRTdEXSspfChcdUZCMDUrKS9nLHY9bmV3IE1hcChbWyLvrIUiLCLFv3QiXV0pKSxlLnJlcGxhY2VBbGwodywoKGUsdCxyKT0+dD90Lm5vcm1hbGl6ZSgiTkZLQyIpOnYuZ2V0KHIpKSl9LHQub2JqZWN0RnJvbU1hcD1mdW5jdGlvbihlKXtjb25zdCB0PU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGNvbnN0W3Isbl1vZiBlKXRbcl09bjtyZXR1cm4gdH0sdC5vYmplY3RTaXplPWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGh9LHQuc2V0VmVyYm9zaXR5TGV2ZWw9ZnVuY3Rpb24oZSl7TnVtYmVyLmlzSW50ZWdlcihlKSYmKHM9ZSl9LHQuc2hhZG93PWQsdC5zdHJpbmczMj1mdW5jdGlvbihlKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlPj4yNCYyNTUsZT4+MTYmMjU1LGU+PjgmMjU1LDI1NSZlKX0sdC5zdHJpbmdUb0J5dGVzPXAsdC5zdHJpbmdUb1BERlN0cmluZz1mdW5jdGlvbihlKXtpZihlWzBdPj0iw68iKXtsZXQgdDtpZigiw74iPT09ZVswXSYmIsO/Ij09PWVbMV0/dD0idXRmLTE2YmUiOiLDvyI9PT1lWzBdJiYiw74iPT09ZVsxXT90PSJ1dGYtMTZsZSI6IsOvIj09PWVbMF0mJiLCuyI9PT1lWzFdJiYiwr8iPT09ZVsyXSYmKHQ9InV0Zi04IiksdCl0cnl7Y29uc3Qgcj1uZXcgVGV4dERlY29kZXIodCx7ZmF0YWw6ITB9KSxuPXAoZSk7cmV0dXJuIHIuZGVjb2RlKG4pfWNhdGNoKGUpe28oJ3N0cmluZ1RvUERGU3RyaW5nOiAiJy5jb25jYXQoZSwnIi4nKSl9fWNvbnN0IHQ9W107Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cisrKXtjb25zdCBuPWJbZS5jaGFyQ29kZUF0KHIpXTt0LnB1c2gobj9TdHJpbmcuZnJvbUNoYXJDb2RlKG4pOmUuY2hhckF0KHIpKX1yZXR1cm4gdC5qb2luKCIiKX0sdC5zdHJpbmdUb1VURjhTdHJpbmc9eSx0LnVucmVhY2hhYmxlPWwsdC51dGY4U3RyaW5nVG9TdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSl9LHQud2Fybj1vLHIoMikscigxNDUpLHIoMTQ3KSxyKDE0OCkscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KTtjb25zdCBhPSEoIm9iamVjdCIhPXR5cGVvZiBwcm9jZXNzfHxwcm9jZXNzKyIiIT0iW29iamVjdCBwcm9jZXNzXSJ8fHByb2Nlc3MudmVyc2lvbnMubnd8fHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24mJnByb2Nlc3MudHlwZSYmImJyb3dzZXIiIT09cHJvY2Vzcy50eXBlKTt0LmlzTm9kZUpTPWEsdC5JREVOVElUWV9NQVRSSVg9WzEsMCwwLDEsMCwwXSx0LkZPTlRfSURFTlRJVFlfTUFUUklYPVsuMDAxLDAsMCwuMDAxLDAsMF0sdC5NQVhfSU1BR0VfU0laRV9UT19DQUNIRT0xZTcsdC5MSU5FX0ZBQ1RPUj0xLjM1LHQuTElORV9ERVNDRU5UX0ZBQ1RPUj0uMzUsdC5CQVNFTElORV9GQUNUT1I9LjI1OTI1OTI1OTI1OTI1OTI0LHQuUmVuZGVyaW5nSW50ZW50RmxhZz17QU5ZOjEsRElTUExBWToyLFBSSU5UOjQsU0FWRTo4LEFOTk9UQVRJT05TX0ZPUk1TOjE2LEFOTk9UQVRJT05TX1NUT1JBR0U6MzIsQU5OT1RBVElPTlNfRElTQUJMRTo2NCxPUExJU1Q6MjU2fSx0LkFubm90YXRpb25Nb2RlPXtESVNBQkxFOjAsRU5BQkxFOjEsRU5BQkxFX0ZPUk1TOjIsRU5BQkxFX1NUT1JBR0U6M30sdC5Bbm5vdGF0aW9uRWRpdG9yUHJlZml4PSJwZGZqc19pbnRlcm5hbF9lZGl0b3JfIix0LkFubm90YXRpb25FZGl0b3JUeXBlPXtESVNBQkxFOi0xLE5PTkU6MCxGUkVFVEVYVDozLFNUQU1QOjEzLElOSzoxNX0sdC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZT17UkVTSVpFOjEsRlJFRVRFWFRfU0laRToxMSxGUkVFVEVYVF9DT0xPUjoxMixGUkVFVEVYVF9PUEFDSVRZOjEzLElOS19DT0xPUjoyMSxJTktfVEhJQ0tORVNTOjIyLElOS19PUEFDSVRZOjIzfSx0LlBlcm1pc3Npb25GbGFnPXtQUklOVDo0LE1PRElGWV9DT05URU5UUzo4LENPUFk6MTYsTU9ESUZZX0FOTk9UQVRJT05TOjMyLEZJTExfSU5URVJBQ1RJVkVfRk9STVM6MjU2LENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6NTEyLEFTU0VNQkxFOjEwMjQsUFJJTlRfSElHSF9RVUFMSVRZOjIwNDh9LHQuVGV4dFJlbmRlcmluZ01vZGU9e0ZJTEw6MCxTVFJPS0U6MSxGSUxMX1NUUk9LRToyLElOVklTSUJMRTozLEZJTExfQUREX1RPX1BBVEg6NCxTVFJPS0VfQUREX1RPX1BBVEg6NSxGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDo2LEFERF9UT19QQVRIOjcsRklMTF9TVFJPS0VfTUFTSzozLEFERF9UT19QQVRIX0ZMQUc6NH0sdC5JbWFnZUtpbmQ9e0dSQVlTQ0FMRV8xQlBQOjEsUkdCXzI0QlBQOjIsUkdCQV8zMkJQUDozfSx0LkFubm90YXRpb25UeXBlPXtURVhUOjEsTElOSzoyLEZSRUVURVhUOjMsTElORTo0LFNRVUFSRTo1LENJUkNMRTo2LFBPTFlHT046NyxQT0xZTElORTo4LEhJR0hMSUdIVDo5LFVOREVSTElORToxMCxTUVVJR0dMWToxMSxTVFJJS0VPVVQ6MTIsU1RBTVA6MTMsQ0FSRVQ6MTQsSU5LOjE1LFBPUFVQOjE2LEZJTEVBVFRBQ0hNRU5UOjE3LFNPVU5EOjE4LE1PVklFOjE5LFdJREdFVDoyMCxTQ1JFRU46MjEsUFJJTlRFUk1BUks6MjIsVFJBUE5FVDoyMyxXQVRFUk1BUks6MjQsVEhSRUVEOjI1LFJFREFDVDoyNn0sdC5Bbm5vdGF0aW9uUmVwbHlUeXBlPXtHUk9VUDoiR3JvdXAiLFJFUExZOiJSIn0sdC5Bbm5vdGF0aW9uRmxhZz17SU5WSVNJQkxFOjEsSElEREVOOjIsUFJJTlQ6NCxOT1pPT006OCxOT1JPVEFURToxNixOT1ZJRVc6MzIsUkVBRE9OTFk6NjQsTE9DS0VEOjEyOCxUT0dHTEVOT1ZJRVc6MjU2LExPQ0tFRENPTlRFTlRTOjUxMn0sdC5Bbm5vdGF0aW9uRmllbGRGbGFnPXtSRUFET05MWToxLFJFUVVJUkVEOjIsTk9FWFBPUlQ6NCxNVUxUSUxJTkU6NDA5NixQQVNTV09SRDo4MTkyLE5PVE9HR0xFVE9PRkY6MTYzODQsUkFESU86MzI3NjgsUFVTSEJVVFRPTjo2NTUzNixDT01CTzoxMzEwNzIsRURJVDoyNjIxNDQsU09SVDo1MjQyODgsRklMRVNFTEVDVDoxMDQ4NTc2LE1VTFRJU0VMRUNUOjIwOTcxNTIsRE9OT1RTUEVMTENIRUNLOjQxOTQzMDQsRE9OT1RTQ1JPTEw6ODM4ODYwOCxDT01COjE2Nzc3MjE2LFJJQ0hURVhUOjMzNTU0NDMyLFJBRElPU0lOVU5JU09OOjMzNTU0NDMyLENPTU1JVE9OU0VMQ0hBTkdFOjY3MTA4ODY0fSx0LkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU9e1NPTElEOjEsREFTSEVEOjIsQkVWRUxFRDozLElOU0VUOjQsVU5ERVJMSU5FOjV9LHQuQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZT17RToiTW91c2UgRW50ZXIiLFg6Ik1vdXNlIEV4aXQiLEQ6Ik1vdXNlIERvd24iLFU6Ik1vdXNlIFVwIixGbzoiRm9jdXMiLEJsOiJCbHVyIixQTzoiUGFnZU9wZW4iLFBDOiJQYWdlQ2xvc2UiLFBWOiJQYWdlVmlzaWJsZSIsUEk6IlBhZ2VJbnZpc2libGUiLEs6IktleXN0cm9rZSIsRjoiRm9ybWF0IixWOiJWYWxpZGF0ZSIsQzoiQ2FsY3VsYXRlIn0sdC5Eb2N1bWVudEFjdGlvbkV2ZW50VHlwZT17V0M6IldpbGxDbG9zZSIsV1M6IldpbGxTYXZlIixEUzoiRGlkU2F2ZSIsV1A6IldpbGxQcmludCIsRFA6IkRpZFByaW50In0sdC5QYWdlQWN0aW9uRXZlbnRUeXBlPXtPOiJQYWdlT3BlbiIsQzoiUGFnZUNsb3NlIn07Y29uc3QgaT17RVJST1JTOjAsV0FSTklOR1M6MSxJTkZPUzo1fTt0LlZlcmJvc2l0eUxldmVsPWksdC5DTWFwQ29tcHJlc3Npb25UeXBlPXtOT05FOjAsQklOQVJZOjF9LHQuT1BTPXtkZXBlbmRlbmN5OjEsc2V0TGluZVdpZHRoOjIsc2V0TGluZUNhcDozLHNldExpbmVKb2luOjQsc2V0TWl0ZXJMaW1pdDo1LHNldERhc2g6NixzZXRSZW5kZXJpbmdJbnRlbnQ6NyxzZXRGbGF0bmVzczo4LHNldEdTdGF0ZTo5LHNhdmU6MTAscmVzdG9yZToxMSx0cmFuc2Zvcm06MTIsbW92ZVRvOjEzLGxpbmVUbzoxNCxjdXJ2ZVRvOjE1LGN1cnZlVG8yOjE2LGN1cnZlVG8zOjE3LGNsb3NlUGF0aDoxOCxyZWN0YW5nbGU6MTksc3Ryb2tlOjIwLGNsb3NlU3Ryb2tlOjIxLGZpbGw6MjIsZW9GaWxsOjIzLGZpbGxTdHJva2U6MjQsZW9GaWxsU3Ryb2tlOjI1LGNsb3NlRmlsbFN0cm9rZToyNixjbG9zZUVPRmlsbFN0cm9rZToyNyxlbmRQYXRoOjI4LGNsaXA6MjksZW9DbGlwOjMwLGJlZ2luVGV4dDozMSxlbmRUZXh0OjMyLHNldENoYXJTcGFjaW5nOjMzLHNldFdvcmRTcGFjaW5nOjM0LHNldEhTY2FsZTozNSxzZXRMZWFkaW5nOjM2LHNldEZvbnQ6Mzcsc2V0VGV4dFJlbmRlcmluZ01vZGU6Mzgsc2V0VGV4dFJpc2U6MzksbW92ZVRleHQ6NDAsc2V0TGVhZGluZ01vdmVUZXh0OjQxLHNldFRleHRNYXRyaXg6NDIsbmV4dExpbmU6NDMsc2hvd1RleHQ6NDQsc2hvd1NwYWNlZFRleHQ6NDUsbmV4dExpbmVTaG93VGV4dDo0NixuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDo0NyxzZXRDaGFyV2lkdGg6NDgsc2V0Q2hhcldpZHRoQW5kQm91bmRzOjQ5LHNldFN0cm9rZUNvbG9yU3BhY2U6NTAsc2V0RmlsbENvbG9yU3BhY2U6NTEsc2V0U3Ryb2tlQ29sb3I6NTIsc2V0U3Ryb2tlQ29sb3JOOjUzLHNldEZpbGxDb2xvcjo1NCxzZXRGaWxsQ29sb3JOOjU1LHNldFN0cm9rZUdyYXk6NTYsc2V0RmlsbEdyYXk6NTcsc2V0U3Ryb2tlUkdCQ29sb3I6NTgsc2V0RmlsbFJHQkNvbG9yOjU5LHNldFN0cm9rZUNNWUtDb2xvcjo2MCxzZXRGaWxsQ01ZS0NvbG9yOjYxLHNoYWRpbmdGaWxsOjYyLGJlZ2luSW5saW5lSW1hZ2U6NjMsYmVnaW5JbWFnZURhdGE6NjQsZW5kSW5saW5lSW1hZ2U6NjUscGFpbnRYT2JqZWN0OjY2LG1hcmtQb2ludDo2NyxtYXJrUG9pbnRQcm9wczo2OCxiZWdpbk1hcmtlZENvbnRlbnQ6NjksYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6NzAsZW5kTWFya2VkQ29udGVudDo3MSxiZWdpbkNvbXBhdDo3MixlbmRDb21wYXQ6NzMscGFpbnRGb3JtWE9iamVjdEJlZ2luOjc0LHBhaW50Rm9ybVhPYmplY3RFbmQ6NzUsYmVnaW5Hcm91cDo3NixlbmRHcm91cDo3NyxiZWdpbkFubm90YXRpb246ODAsZW5kQW5ub3RhdGlvbjo4MSxwYWludEltYWdlTWFza1hPYmplY3Q6ODMscGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6ODQscGFpbnRJbWFnZVhPYmplY3Q6ODUscGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6ODYscGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDo4NyxwYWludEltYWdlWE9iamVjdFJlcGVhdDo4OCxwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6ODkscGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOjkwLGNvbnN0cnVjdFBhdGg6OTF9LHQuUGFzc3dvcmRSZXNwb25zZXM9e05FRURfUEFTU1dPUkQ6MSxJTkNPUlJFQ1RfUEFTU1dPUkQ6Mn07bGV0IHM9aS5XQVJOSU5HUztmdW5jdGlvbiBvKGUpe3M+PWkuV0FSTklOR1MmJmNvbnNvbGUubG9nKCJXYXJuaW5nOiAiLmNvbmNhdChlKSl9ZnVuY3Rpb24gbChlKXt0aHJvdyBuZXcgRXJyb3IoZSl9ZnVuY3Rpb24gZChlLHQscil7bGV0IG49YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6cixlbnVtZXJhYmxlOiFuLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMX0pLHJ9Y29uc3QgZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXt0aGlzLmNvbnN0cnVjdG9yPT09ZSYmbCgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUV4Y2VwdGlvbi4iKSx0aGlzLm1lc3NhZ2U9dCx0aGlzLm5hbWU9cn1yZXR1cm4gZS5wcm90b3R5cGU9bmV3IEVycm9yLGUuY29uc3RydWN0b3I9ZSxlfSgpO2Z1bmN0aW9uIGcoZSl7Im9iamVjdCI9PXR5cGVvZiBlJiZ2b2lkIDAhPT0obnVsbD09ZT92b2lkIDA6ZS5sZW5ndGgpfHxsKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7Y29uc3QgdD1lLmxlbmd0aCxyPTgxOTI7aWYodDxyKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZSk7Y29uc3Qgbj1bXTtmb3IobGV0IGE9MDthPHQ7YSs9cil7Y29uc3QgaT1NYXRoLm1pbihhK3IsdCkscz1lLnN1YmFycmF5KGEsaSk7bi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxzKSl9cmV0dXJuIG4uam9pbigiIil9ZnVuY3Rpb24gcChlKXsic3RyaW5nIiE9dHlwZW9mIGUmJmwoIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZ1RvQnl0ZXMiKTtjb25zdCB0PWUubGVuZ3RoLHI9bmV3IFVpbnQ4QXJyYXkodCk7Zm9yKGxldCBuPTA7bjx0OysrbilyW25dPTI1NSZlLmNoYXJDb2RlQXQobik7cmV0dXJuIHJ9dC5CYXNlRXhjZXB0aW9uPWYsdC5QYXNzd29yZEV4Y2VwdGlvbj1jbGFzcyBleHRlbmRzIGZ7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLCJQYXNzd29yZEV4Y2VwdGlvbiIpLHRoaXMuY29kZT10fX0sdC5Vbmtub3duRXJyb3JFeGNlcHRpb249Y2xhc3MgZXh0ZW5kcyBme2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSwiVW5rbm93bkVycm9yRXhjZXB0aW9uIiksdGhpcy5kZXRhaWxzPXR9fSx0LkludmFsaWRQREZFeGNlcHRpb249Y2xhc3MgZXh0ZW5kcyBme2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIkludmFsaWRQREZFeGNlcHRpb24iKX19LHQuTWlzc2luZ1BERkV4Y2VwdGlvbj1jbGFzcyBleHRlbmRzIGZ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiTWlzc2luZ1BERkV4Y2VwdGlvbiIpfX0sdC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb249Y2xhc3MgZXh0ZW5kcyBme2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIiksdGhpcy5zdGF0dXM9dH19LHQuRm9ybWF0RXJyb3I9Y2xhc3MgZXh0ZW5kcyBme2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIkZvcm1hdEVycm9yIil9fSx0LkFib3J0RXhjZXB0aW9uPWNsYXNzIGV4dGVuZHMgZntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJBYm9ydEV4Y2VwdGlvbiIpfX0sdC5GZWF0dXJlVGVzdD1jbGFzc3tzdGF0aWMgZ2V0IGlzTGl0dGxlRW5kaWFuKCl7cmV0dXJuIGQodGhpcywiaXNMaXR0bGVFbmRpYW4iLGZ1bmN0aW9uKCl7Y29uc3QgZT1uZXcgVWludDhBcnJheSg0KTtyZXR1cm4gZVswXT0xLDE9PT1uZXcgVWludDMyQXJyYXkoZS5idWZmZXIsMCwxKVswXX0oKSl9c3RhdGljIGdldCBpc0V2YWxTdXBwb3J0ZWQoKXtyZXR1cm4gZCh0aGlzLCJpc0V2YWxTdXBwb3J0ZWQiLGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgRnVuY3Rpb24oIiIpLCEwfWNhdGNoKGUpe3JldHVybiExfX0oKSl9c3RhdGljIGdldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCgpe3JldHVybiBkKHRoaXMsImlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIiwidW5kZWZpbmVkIiE9dHlwZW9mIE9mZnNjcmVlbkNhbnZhcyl9c3RhdGljIGdldCBwbGF0Zm9ybSgpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yP2QodGhpcywicGxhdGZvcm0iLHtpc1dpbjohMSxpc01hYzohMX0pOmQodGhpcywicGxhdGZvcm0iLHtpc1dpbjpuYXZpZ2F0b3IucGxhdGZvcm0uaW5jbHVkZXMoIldpbiIpLGlzTWFjOm5hdmlnYXRvci5wbGF0Zm9ybS5pbmNsdWRlcygiTWFjIil9KX19O2NvbnN0IG09Wy4uLkFycmF5KDI1Nikua2V5cygpXS5tYXAoKGU9PmUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkpO3QuVXRpbD1jbGFzc3tzdGF0aWMgbWFrZUhleENvbG9yKGUsdCxyKXtyZXR1cm4iIyIuY29uY2F0KG1bZV0pLmNvbmNhdChtW3RdKS5jb25jYXQobVtyXSl9c3RhdGljIHNjYWxlTWluTWF4KGUsdCl7bGV0IHI7ZVswXT8oZVswXTwwJiYocj10WzBdLHRbMF09dFsxXSx0WzFdPXIpLHRbMF0qPWVbMF0sdFsxXSo9ZVswXSxlWzNdPDAmJihyPXRbMl0sdFsyXT10WzNdLHRbM109ciksdFsyXSo9ZVszXSx0WzNdKj1lWzNdKToocj10WzBdLHRbMF09dFsyXSx0WzJdPXIscj10WzFdLHRbMV09dFszXSx0WzNdPXIsZVsxXTwwJiYocj10WzJdLHRbMl09dFszXSx0WzNdPXIpLHRbMl0qPWVbMV0sdFszXSo9ZVsxXSxlWzJdPDAmJihyPXRbMF0sdFswXT10WzFdLHRbMV09ciksdFswXSo9ZVsyXSx0WzFdKj1lWzJdKSx0WzBdKz1lWzRdLHRbMV0rPWVbNF0sdFsyXSs9ZVs1XSx0WzNdKz1lWzVdfXN0YXRpYyB0cmFuc2Zvcm0oZSx0KXtyZXR1cm5bZVswXSp0WzBdK2VbMl0qdFsxXSxlWzFdKnRbMF0rZVszXSp0WzFdLGVbMF0qdFsyXStlWzJdKnRbM10sZVsxXSp0WzJdK2VbM10qdFszXSxlWzBdKnRbNF0rZVsyXSp0WzVdK2VbNF0sZVsxXSp0WzRdK2VbM10qdFs1XStlWzVdXX1zdGF0aWMgYXBwbHlUcmFuc2Zvcm0oZSx0KXtyZXR1cm5bZVswXSp0WzBdK2VbMV0qdFsyXSt0WzRdLGVbMF0qdFsxXStlWzFdKnRbM10rdFs1XV19c3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybShlLHQpe2NvbnN0IHI9dFswXSp0WzNdLXRbMV0qdFsyXTtyZXR1cm5bKGVbMF0qdFszXS1lWzFdKnRbMl0rdFsyXSp0WzVdLXRbNF0qdFszXSkvciwoLWVbMF0qdFsxXStlWzFdKnRbMF0rdFs0XSp0WzFdLXRbNV0qdFswXSkvcl19c3RhdGljIGdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KGUsdCl7Y29uc3Qgcj10aGlzLmFwcGx5VHJhbnNmb3JtKGUsdCksbj10aGlzLmFwcGx5VHJhbnNmb3JtKGUuc2xpY2UoMiw0KSx0KSxhPXRoaXMuYXBwbHlUcmFuc2Zvcm0oW2VbMF0sZVszXV0sdCksaT10aGlzLmFwcGx5VHJhbnNmb3JtKFtlWzJdLGVbMV1dLHQpO3JldHVybltNYXRoLm1pbihyWzBdLG5bMF0sYVswXSxpWzBdKSxNYXRoLm1pbihyWzFdLG5bMV0sYVsxXSxpWzFdKSxNYXRoLm1heChyWzBdLG5bMF0sYVswXSxpWzBdKSxNYXRoLm1heChyWzFdLG5bMV0sYVsxXSxpWzFdKV19c3RhdGljIGludmVyc2VUcmFuc2Zvcm0oZSl7Y29uc3QgdD1lWzBdKmVbM10tZVsxXSplWzJdO3JldHVybltlWzNdL3QsLWVbMV0vdCwtZVsyXS90LGVbMF0vdCwoZVsyXSplWzVdLWVbNF0qZVszXSkvdCwoZVs0XSplWzFdLWVbNV0qZVswXSkvdF19c3RhdGljIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGUpe2NvbnN0IHQ9W2VbMF0sZVsyXSxlWzFdLGVbM11dLHI9ZVswXSp0WzBdK2VbMV0qdFsyXSxuPWVbMF0qdFsxXStlWzFdKnRbM10sYT1lWzJdKnRbMF0rZVszXSp0WzJdLGk9ZVsyXSp0WzFdK2VbM10qdFszXSxzPShyK2kpLzIsbz1NYXRoLnNxcnQoKHIraSkqKjItNCoocippLWEqbikpLzIsYz1zK298fDEsbD1zLW98fDE7cmV0dXJuW01hdGguc3FydChjKSxNYXRoLnNxcnQobCldfXN0YXRpYyBub3JtYWxpemVSZWN0KGUpe2NvbnN0IHQ9ZS5zbGljZSgwKTtyZXR1cm4gZVswXT5lWzJdJiYodFswXT1lWzJdLHRbMl09ZVswXSksZVsxXT5lWzNdJiYodFsxXT1lWzNdLHRbM109ZVsxXSksdH1zdGF0aWMgaW50ZXJzZWN0KGUsdCl7Y29uc3Qgcj1NYXRoLm1heChNYXRoLm1pbihlWzBdLGVbMl0pLE1hdGgubWluKHRbMF0sdFsyXSkpLG49TWF0aC5taW4oTWF0aC5tYXgoZVswXSxlWzJdKSxNYXRoLm1heCh0WzBdLHRbMl0pKTtpZihyPm4pcmV0dXJuIG51bGw7Y29uc3QgYT1NYXRoLm1heChNYXRoLm1pbihlWzFdLGVbM10pLE1hdGgubWluKHRbMV0sdFszXSkpLGk9TWF0aC5taW4oTWF0aC5tYXgoZVsxXSxlWzNdKSxNYXRoLm1heCh0WzFdLHRbM10pKTtyZXR1cm4gYT5pP251bGw6W3IsYSxuLGldfXN0YXRpYyBiZXppZXJCb3VuZGluZ0JveChlLHQscixuLGEsaSxzLG8pe2NvbnN0IGM9W10sbD1bW10sW11dO2xldCBoLHUsZCxmLGcscCxtLGI7Zm9yKGxldCBsPTA7bDwyOysrbClpZigwPT09bD8odT02KmUtMTIqcis2KmEsaD0tMyplKzkqci05KmErMypzLGQ9MypyLTMqZSk6KHU9Nip0LTEyKm4rNippLGg9LTMqdCs5Km4tOSppKzMqbyxkPTMqbi0zKnQpLE1hdGguYWJzKGgpPDFlLTEyKXtpZihNYXRoLmFicyh1KTwxZS0xMiljb250aW51ZTtmPS1kL3UsMDxmJiZmPDEmJmMucHVzaChmKX1lbHNlIG09dSp1LTQqZCpoLGI9TWF0aC5zcXJ0KG0pLG08MHx8KGc9KC11K2IpLygyKmgpLDA8ZyYmZzwxJiZjLnB1c2goZykscD0oLXUtYikvKDIqaCksMDxwJiZwPDEmJmMucHVzaChwKSk7bGV0IHksdz1jLmxlbmd0aDtjb25zdCB2PXc7Zm9yKDt3LS07KWY9Y1t3XSx5PTEtZixsWzBdW3ddPXkqeSp5KmUrMyp5KnkqZipyKzMqeSpmKmYqYStmKmYqZipzLGxbMV1bd109eSp5KnkqdCszKnkqeSpmKm4rMyp5KmYqZippK2YqZipmKm87cmV0dXJuIGxbMF1bdl09ZSxsWzFdW3ZdPXQsbFswXVt2KzFdPXMsbFsxXVt2KzFdPW8sbFswXS5sZW5ndGg9bFsxXS5sZW5ndGg9disyLFtNYXRoLm1pbiguLi5sWzBdKSxNYXRoLm1pbiguLi5sWzFdKSxNYXRoLm1heCguLi5sWzBdKSxNYXRoLm1heCguLi5sWzFdKV19fTtjb25zdCBiPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3MjgsNzExLDcxMCw3MjksNzMzLDczMSw3MzAsNzMyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDgyMjYsODIyNCw4MjI1LDgyMzAsODIxMiw4MjExLDQwMiw4MjYwLDgyNDksODI1MCw4NzIyLDgyNDAsODIyMiw4MjIwLDgyMjEsODIxNiw4MjE3LDgyMTgsODQ4Miw2NDI1Nyw2NDI1OCwzMjEsMzM4LDM1MiwzNzYsMzgxLDMwNSwzMjIsMzM5LDM1MywzODIsMCw4MzY0XTtmdW5jdGlvbiB5KGUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGUpKX10LlByb21pc2VDYXBhYmlsaXR5PShuPW5ldyBXZWFrTWFwLGNsYXNze2NvbnN0cnVjdG9yKCl7Yyh0aGlzLG4se3dyaXRhYmxlOiEwLHZhbHVlOiExfSksdGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKCgoZSx0KT0+e3RoaXMucmVzb2x2ZT10PT57dSh0aGlzLG4sITApLGUodCl9LHRoaXMucmVqZWN0PWU9Pnt1KHRoaXMsbiwhMCksdChlKX19KSl9Z2V0IHNldHRsZWQoKXtyZXR1cm4gaCh0aGlzLG4pfX0pO2xldCB3PW51bGwsdj1udWxsfSwoZSx0LHIpPT57dmFyIG49cig0OCksYT1yKDE0KSxpPXIoNzcpLHM9cigxNDYpLG89VVJMU2VhcmNoUGFyYW1zLGM9by5wcm90b3R5cGUsbD1hKGMuYXBwZW5kKSxoPWEoYy5kZWxldGUpLHU9YShjLmZvckVhY2gpLGQ9YShbXS5wdXNoKSxmPW5ldyBvKCJhPTEmYT0yIik7Zi5kZWxldGUoImEiLDEpLGYrIiIhPSJhPTIiJiZuKGMsImRlbGV0ZSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj10PDI/dm9pZCAwOmFyZ3VtZW50c1sxXTtpZih0JiZ2b2lkIDA9PT1yKXJldHVybiBoKHRoaXMsZSk7dmFyIG49W107dSh0aGlzLChmdW5jdGlvbihlLHQpe2Qobix7a2V5OnQsdmFsdWU6ZX0pfSkpLHModCwxKTtmb3IodmFyIGEsbz1pKGUpLGM9aShyKSxmPTAsZz0wLHA9ITEsbT1uLmxlbmd0aDtmPG07KWE9bltmKytdLHB8fGEua2V5PT09bz8ocD0hMCxoKHRoaXMsYS5rZXkpKTpnKys7Zm9yKDtnPG07KShhPW5bZysrXSkua2V5PT09byYmYS52YWx1ZT09PWN8fGwodGhpcyxhLmtleSxhLnZhbHVlKX0pLHtlbnVtZXJhYmxlOiEwLHVuc2FmZTohMH0pfSxlPT57dmFyIHQ9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHIpe2lmKGU8cil0aHJvdyB0KCJOb3QgZW5vdWdoIGFyZ3VtZW50cyIpO3JldHVybiBlfX0sKGUsdCxyKT0+e3ZhciBuPXIoNDgpLGE9cigxNCksaT1yKDc3KSxzPXIoMTQ2KSxvPVVSTFNlYXJjaFBhcmFtcyxjPW8ucHJvdG90eXBlLGw9YShjLmdldEFsbCksaD1hKGMuaGFzKTtuZXcgbygiYT0xIikuaGFzKCJhIiwyKSYmbihjLCJoYXMiLChmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoLHI9dDwyP3ZvaWQgMDphcmd1bWVudHNbMV07aWYodCYmdm9pZCAwPT09cilyZXR1cm4gaCh0aGlzLGUpO3ZhciBuPWwodGhpcyxlKTtzKHQsMSk7Zm9yKHZhciBhPWkociksbz0wO288bi5sZW5ndGg7KWlmKG5bbysrXT09PWEpcmV0dXJuITA7cmV0dXJuITF9KSx7ZW51bWVyYWJsZTohMCx1bnNhZmU6ITB9KX0sKGUsdCxyKT0+e3ZhciBuPXIoNiksYT1yKDE0KSxpPXIoODcpLHM9VVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZSxvPWEocy5mb3JFYWNoKTtuJiYhKCJzaXplImluIHMpJiZpKHMsInNpemUiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgZT0wO3JldHVybiBvKHRoaXMsKGZ1bmN0aW9uKCl7ZSsrfSkpLGV9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5YUmVmUGFyc2VFeGNlcHRpb249dC5YUmVmRW50cnlFeGNlcHRpb249dC5QYXJzZXJFT0ZFeGNlcHRpb249dC5QREZfVkVSU0lPTl9SRUdFWFA9dC5NaXNzaW5nRGF0YUV4Y2VwdGlvbj12b2lkIDAsdC5hcnJheUJ1ZmZlcnNUb0J5dGVzPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZS5sZW5ndGg7aWYoMD09PXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2lmKDE9PT10KXJldHVybiBuZXcgVWludDhBcnJheShlWzBdKTtsZXQgcj0wO2ZvcihsZXQgbj0wO248dDtuKyspcis9ZVtuXS5ieXRlTGVuZ3RoO2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkocik7bGV0IGE9MDtmb3IobGV0IHI9MDtyPHQ7cisrKXtjb25zdCB0PW5ldyBVaW50OEFycmF5KGVbcl0pO24uc2V0KHQsYSksYSs9dC5ieXRlTGVuZ3RofXJldHVybiBufSx0LmNvbGxlY3RBY3Rpb25zPWZ1bmN0aW9uKGUsdCxyKXtjb25zdCBpPU9iamVjdC5jcmVhdGUobnVsbCkscz1oKHtkaWN0OnQsa2V5OiJBQSIsc3RvcFdoZW5Gb3VuZDohMX0pO2lmKHMpZm9yKGxldCB0PXMubGVuZ3RoLTE7dD49MDt0LS0pe2NvbnN0IG49c1t0XTtpZihuIGluc3RhbmNlb2YgYS5EaWN0KWZvcihjb25zdCB0IG9mIG4uZ2V0S2V5cygpKXtjb25zdCBzPXJbdF07aWYoIXMpY29udGludWU7Y29uc3Qgbz1bXTtkKG4uZ2V0UmF3KHQpLGUsbyxuZXcgYS5SZWZTZXQpLG8ubGVuZ3RoPjAmJihpW3NdPW8pfX1pZih0LmhhcygiQSIpKXtjb25zdCByPVtdO2QodC5nZXQoIkEiKSxlLHIsbmV3IGEuUmVmU2V0KSxyLmxlbmd0aD4wJiYoaS5BY3Rpb249cil9cmV0dXJuKDAsbi5vYmplY3RTaXplKShpKT4wP2k6bnVsbH0sdC5lbmNvZGVUb1htbFN0cmluZz1mdW5jdGlvbihlKXtjb25zdCB0PVtdO2xldCByPTA7Zm9yKGxldCBuPTAsYT1lLmxlbmd0aDtuPGE7bisrKXtjb25zdCBhPWUuY29kZVBvaW50QXQobik7aWYoMzI8PWEmJmE8PTEyNil7Y29uc3QgaT1mW2FdO2kmJihyPG4mJnQucHVzaChlLnN1YnN0cmluZyhyLG4pKSx0LnB1c2goaSkscj1uKzEpfWVsc2UgcjxuJiZ0LnB1c2goZS5zdWJzdHJpbmcocixuKSksdC5wdXNoKCImI3giLmNvbmNhdChhLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLCI7IikpLGE+NTUyOTUmJihhPDU3MzQ0fHxhPjY1NTMzKSYmbisrLHI9bisxfXJldHVybiAwPT09dC5sZW5ndGg/ZToocjxlLmxlbmd0aCYmdC5wdXNoKGUuc3Vic3RyaW5nKHIsZS5sZW5ndGgpKSx0LmpvaW4oIiIpKX0sdC5lc2NhcGVQREZOYW1lPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9W107bGV0IHI9MDtmb3IobGV0IG49MCxhPWUubGVuZ3RoO248YTtuKyspe2NvbnN0IGE9ZS5jaGFyQ29kZUF0KG4pOyhhPDMzfHxhPjEyNnx8MzU9PT1hfHw0MD09PWF8fDQxPT09YXx8NjA9PT1hfHw2Mj09PWF8fDkxPT09YXx8OTM9PT1hfHwxMjM9PT1hfHwxMjU9PT1hfHw0Nz09PWF8fDM3PT09YSkmJihyPG4mJnQucHVzaChlLnN1YnN0cmluZyhyLG4pKSx0LnB1c2goIiMiLmNvbmNhdChhLnRvU3RyaW5nKDE2KSkpLHI9bisxKX1yZXR1cm4gMD09PXQubGVuZ3RoP2U6KHI8ZS5sZW5ndGgmJnQucHVzaChlLnN1YnN0cmluZyhyLGUubGVuZ3RoKSksdC5qb2luKCIiKSl9LHQuZXNjYXBlU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2VBbGwoLyhbKClcXFxuXHJdKS9nLChlPT4iXG4iPT09ZT8iXFxuIjoiXHIiPT09ZT8iXFxyIjoiXFwiLmNvbmNhdChlKSkpfSx0LmdldEluaGVyaXRhYmxlUHJvcGVydHk9aCx0LmdldExvb2t1cFRhYmxlRmFjdG9yeT1mdW5jdGlvbihlKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSYmKHQ9T2JqZWN0LmNyZWF0ZShudWxsKSxlKHQpLGU9bnVsbCksdH19LHQuZ2V0TmV3QW5ub3RhdGlvbnNNYXA9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7Y29uc3QgdD1uZXcgTWFwO2Zvcihjb25zdFtyLGFdb2YgZSl7aWYoIXIuc3RhcnRzV2l0aChuLkFubm90YXRpb25FZGl0b3JQcmVmaXgpKWNvbnRpbnVlO2xldCBlPXQuZ2V0KGEucGFnZUluZGV4KTtlfHwoZT1bXSx0LnNldChhLnBhZ2VJbmRleCxlKSksZS5wdXNoKGEpfXJldHVybiB0LnNpemU+MD90Om51bGx9LHQuZ2V0Um90YXRpb25NYXRyaXg9ZnVuY3Rpb24oZSx0LHIpe3N3aXRjaChlKXtjYXNlIDkwOnJldHVyblswLDEsLTEsMCx0LDBdO2Nhc2UgMTgwOnJldHVyblstMSwwLDAsLTEsdCxyXTtjYXNlIDI3MDpyZXR1cm5bMCwtMSwxLDAsMCxyXTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCByb3RhdGlvbiIpfX0sdC5pc0FzY2lpPWZ1bmN0aW9uKGUpe3JldHVybi9eW1x4MDAtXHg3Rl0qJC8udGVzdChlKX0sdC5pc1doaXRlU3BhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIDMyPT09ZXx8OT09PWV8fDEzPT09ZXx8MTA9PT1lfSx0LmxvZzI9ZnVuY3Rpb24oZSl7cmV0dXJuIGU8PTA/MDpNYXRoLmNlaWwoTWF0aC5sb2cyKGUpKX0sdC5udW1iZXJUb1N0cmluZz1mdW5jdGlvbihlKXtpZihOdW1iZXIuaXNJbnRlZ2VyKGUpKXJldHVybiBlLnRvU3RyaW5nKCk7Y29uc3QgdD1NYXRoLnJvdW5kKDEwMCplKTtyZXR1cm4gdCUxMDA9PTA/KHQvMTAwKS50b1N0cmluZygpOnQlMTA9PTA/ZS50b0ZpeGVkKDEpOmUudG9GaXhlZCgyKX0sdC5wYXJzZVhGQVBhdGg9ZnVuY3Rpb24oZSl7Y29uc3QgdD0vKC4rKVxbKFxkKylcXSQvO3JldHVybiBlLnNwbGl0KCIuIikubWFwKChlPT57Y29uc3Qgcj1lLm1hdGNoKHQpO3JldHVybiByP3tuYW1lOnJbMV0scG9zOnBhcnNlSW50KHJbMl0sMTApfTp7bmFtZTplLHBvczowfX0pKX0sdC5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiBlW3RdPDwyND4+MjR9LHQucmVhZFVpbnQxNj1mdW5jdGlvbihlLHQpe3JldHVybiBlW3RdPDw4fGVbdCsxXX0sdC5yZWFkVWludDMyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGVbdF08PDI0fGVbdCsxXTw8MTZ8ZVt0KzJdPDw4fGVbdCszXSk+Pj4wfSx0LnJlY292ZXJKc1VSTD1mdW5jdGlvbihlKXtjb25zdCB0PW5ldyBSZWdFeHAoIl5cXHMqKCIrWyJhcHAubGF1bmNoVVJMIiwid2luZG93Lm9wZW4iLCJ4ZmEuaG9zdC5nb3RvVVJMIl0uam9pbigifCIpLnJlcGxhY2VBbGwoIi4iLCJcXC4iKSsiKVxcKCg/Oid8XCIpKFteJ1wiXSopKD86J3xcIikoPzosXFxzKihcXHcrKVxcKXxcXCkpIiwiaSIpLmV4ZWMoZSk7aWYobnVsbCE9dCYmdFsyXSl7Y29uc3QgZT10WzJdO2xldCByPSExO3JldHVybiJ0cnVlIj09PXRbM10mJiJhcHAubGF1bmNoVVJMIj09PXRbMV0mJihyPSEwKSx7dXJsOmUsbmV3V2luZG93OnJ9fXJldHVybiBudWxsfSx0LnN0cmluZ1RvVVRGMTZIZXhTdHJpbmc9ZnVuY3Rpb24oZSl7Y29uc3QgdD1bXTtmb3IobGV0IHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe2NvbnN0IG49ZS5jaGFyQ29kZUF0KHIpO3QucHVzaCgobj4+OCYyNTUpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIiksKDI1NSZuKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpKX1yZXR1cm4gdC5qb2luKCIiKX0sdC5zdHJpbmdUb1VURjE2U3RyaW5nPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9W107YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSYmdC5wdXNoKCLDvsO/Iik7Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cisrKXtjb25zdCBuPWUuY2hhckNvZGVBdChyKTt0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShuPj44JjI1NSksU3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmbikpfXJldHVybiB0LmpvaW4oIiIpfSx0LnRvUm9tYW5OdW1lcmFscz1mdW5jdGlvbihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdOygwLG4uYXNzZXJ0KShOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPjAsIlRoZSBudW1iZXIgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlci4iKTtjb25zdCByPVtdO2xldCBhO2Zvcig7ZT49MWUzOyllLT0xZTMsci5wdXNoKCJNIik7YT1lLzEwMHwwLGUlPTEwMCxyLnB1c2godVthXSksYT1lLzEwfDAsZSU9MTAsci5wdXNoKHVbMTArYV0pLHIucHVzaCh1WzIwK2VdKTtjb25zdCBpPXIuam9pbigiIik7cmV0dXJuIHQ/aS50b0xvd2VyQ2FzZSgpOml9LHQudmFsaWRhdGVDU1NGb250PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IFNldChbIjEwMCIsIjIwMCIsIjMwMCIsIjQwMCIsIjUwMCIsIjYwMCIsIjcwMCIsIjgwMCIsIjkwMCIsIjEwMDAiLCJub3JtYWwiLCJib2xkIiwiYm9sZGVyIiwibGlnaHRlciJdKSx7Zm9udEZhbWlseTpyLGZvbnRXZWlnaHQ6bixpdGFsaWNBbmdsZTphfT1lO2lmKCFnKHIsITApKXJldHVybiExO2NvbnN0IGk9bj9uLnRvU3RyaW5nKCk6IiI7ZS5mb250V2VpZ2h0PXQuaGFzKGkpP2k6IjQwMCI7Y29uc3Qgcz1wYXJzZUZsb2F0KGEpO3JldHVybiBlLml0YWxpY0FuZ2xlPWlzTmFOKHMpfHxzPC05MHx8cz45MD8iMTQiOmEudG9TdHJpbmcoKSwhMH0sdC52YWxpZGF0ZUZvbnROYW1lPWcscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpLHIoMTM5KSxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNykscigyKTt2YXIgbj1yKDE0NCksYT1yKDE1MCksaT1yKDE1MSk7dC5QREZfVkVSU0lPTl9SRUdFWFA9L15bMS05XVwuXGQkLztjbGFzcyBzIGV4dGVuZHMgbi5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoIk1pc3NpbmcgZGF0YSBbIi5jb25jYXQoZSwiLCAiKS5jb25jYXQodCwiKSIpLCJNaXNzaW5nRGF0YUV4Y2VwdGlvbiIpLHRoaXMuYmVnaW49ZSx0aGlzLmVuZD10fX10Lk1pc3NpbmdEYXRhRXhjZXB0aW9uPXM7Y2xhc3MgbyBleHRlbmRzIG4uQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJQYXJzZXJFT0ZFeGNlcHRpb24iKX19dC5QYXJzZXJFT0ZFeGNlcHRpb249bztjbGFzcyBjIGV4dGVuZHMgbi5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIlhSZWZFbnRyeUV4Y2VwdGlvbiIpfX10LlhSZWZFbnRyeUV4Y2VwdGlvbj1jO2NsYXNzIGwgZXh0ZW5kcyBuLkJhc2VFeGNlcHRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiWFJlZlBhcnNlRXhjZXB0aW9uIil9fWZ1bmN0aW9uIGgoZSl7bGV0IHQse2RpY3Q6cixrZXk6bixnZXRBcnJheTppPSExLHN0b3BXaGVuRm91bmQ6cz0hMH09ZTtjb25zdCBvPW5ldyBhLlJlZlNldDtmb3IoO3IgaW5zdGFuY2VvZiBhLkRpY3QmJighci5vYmpJZHx8IW8uaGFzKHIub2JqSWQpKTspe3Iub2JqSWQmJm8ucHV0KHIub2JqSWQpO2NvbnN0IGU9aT9yLmdldEFycmF5KG4pOnIuZ2V0KG4pO2lmKHZvaWQgMCE9PWUpe2lmKHMpcmV0dXJuIGU7KHR8fCh0PVtdKSkucHVzaChlKX1yPXIuZ2V0KCJQYXJlbnQiKX1yZXR1cm4gdH10LlhSZWZQYXJzZUV4Y2VwdGlvbj1sO2NvbnN0IHU9WyIiLCJDIiwiQ0MiLCJDQ0MiLCJDRCIsIkQiLCJEQyIsIkRDQyIsIkRDQ0MiLCJDTSIsIiIsIlgiLCJYWCIsIlhYWCIsIlhMIiwiTCIsIkxYIiwiTFhYIiwiTFhYWCIsIlhDIiwiIiwiSSIsIklJIiwiSUlJIiwiSVYiLCJWIiwiVkkiLCJWSUkiLCJWSUlJIiwiSVgiXTtmdW5jdGlvbiBkKGUsdCxyLHMpe2lmKCFlKXJldHVybjtsZXQgbz1udWxsO2lmKGUgaW5zdGFuY2VvZiBhLlJlZil7aWYocy5oYXMoZSkpcmV0dXJuO289ZSxzLnB1dChvKSxlPXQuZmV0Y2goZSl9aWYoQXJyYXkuaXNBcnJheShlKSlmb3IoY29uc3QgbiBvZiBlKWQobix0LHIscyk7ZWxzZSBpZihlIGluc3RhbmNlb2YgYS5EaWN0KXtpZigoMCxhLmlzTmFtZSkoZS5nZXQoIlMiKSwiSmF2YVNjcmlwdCIpKXtjb25zdCB0PWUuZ2V0KCJKUyIpO2xldCBhO3QgaW5zdGFuY2VvZiBpLkJhc2VTdHJlYW0/YT10LmdldFN0cmluZygpOiJzdHJpbmciPT10eXBlb2YgdCYmKGE9dCksYSYmKGE9KDAsbi5zdHJpbmdUb1BERlN0cmluZykoYSkucmVwbGFjZUFsbCgiXDAiLCIiKSksYSYmci5wdXNoKGEpfWQoZS5nZXRSYXcoIk5leHQiKSx0LHIscyl9byYmcy5yZW1vdmUobyl9Y29uc3QgZj17NjA6IiZsdDsiLDYyOiImZ3Q7IiwzODoiJmFtcDsiLDM0OiImcXVvdDsiLDM5OiImYXBvczsifTtmdW5jdGlvbiBnKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07Y29uc3Qgcj0vXigifCcpLiooInwnKSQvLmV4ZWMoZSk7aWYociYmclsxXT09PXJbMl0pe2lmKG5ldyBSZWdFeHAoIlteXFxcXF0iLmNvbmNhdChyWzFdKSkudGVzdChlLnNsaWNlKDEsLTEpKSlyZXR1cm4gdCYmKDAsbi53YXJuKSgiRm9udEZhbWlseSBjb250YWlucyB1bmVzY2FwZWQgIi5jb25jYXQoclsxXSwiOiAiKS5jb25jYXQoZSwiLiIpKSwhMX1lbHNlIGZvcihjb25zdCByIG9mIGUuc3BsaXQoL1sgXHRdKy8pKWlmKC9eKFxkfCgtKFxkfC0pKSkvLnRlc3Qocil8fCEvXltcdy1cXF0rJC8udGVzdChyKSlyZXR1cm4gdCYmKDAsbi53YXJuKSgiRm9udEZhbWlseSBjb250YWlucyBpbnZhbGlkIDxjdXN0b20taWRlbnQ+OiAiLmNvbmNhdChlLCIuIikpLCExO3JldHVybiEwfX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlJlZlNldENhY2hlPXQuUmVmU2V0PXQuUmVmPXQuTmFtZT10LkVPRj10LkRpY3Q9dC5DbWQ9dC5DSVJDVUxBUl9SRUY9dm9pZCAwLHQuY2xlYXJQcmltaXRpdmVDYWNoZXM9ZnVuY3Rpb24oKXtzPU9iamVjdC5jcmVhdGUobnVsbCksbz1PYmplY3QuY3JlYXRlKG51bGwpLGM9T2JqZWN0LmNyZWF0ZShudWxsKX0sdC5pc0NtZD1mdW5jdGlvbihlLHQpe3JldHVybiBlIGluc3RhbmNlb2YgaCYmKHZvaWQgMD09PXR8fGUuY21kPT09dCl9LHQuaXNEaWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBkJiYodm9pZCAwPT09dHx8bShlLmdldCgiVHlwZSIpLHQpKX0sdC5pc05hbWU9bSx0LmlzUmVmc0VxdWFsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubnVtPT09dC5udW0mJmUuZ2VuPT09dC5nZW59LHIoMTM5KSxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNyk7dmFyIG49cigxNDQpO2NvbnN0IGE9U3ltYm9sKCJDSVJDVUxBUl9SRUYiKTt0LkNJUkNVTEFSX1JFRj1hO2NvbnN0IGk9U3ltYm9sKCJFT0YiKTt0LkVPRj1pO2xldCBzPU9iamVjdC5jcmVhdGUobnVsbCksbz1PYmplY3QuY3JlYXRlKG51bGwpLGM9T2JqZWN0LmNyZWF0ZShudWxsKTtjbGFzcyBse2NvbnN0cnVjdG9yKGUpe3RoaXMubmFtZT1lfXN0YXRpYyBnZXQoZSl7dmFyIHQ7cmV0dXJuKHQ9bylbZV18fCh0W2VdPW5ldyBsKGUpKX19dC5OYW1lPWw7Y2xhc3MgaHtjb25zdHJ1Y3RvcihlKXt0aGlzLmNtZD1lfXN0YXRpYyBnZXQoZSl7dmFyIHQ7cmV0dXJuKHQ9cylbZV18fCh0W2VdPW5ldyBoKGUpKX19dC5DbWQ9aDtjb25zdCB1PWZ1bmN0aW9uKCl7cmV0dXJuIHV9O2NsYXNzIGR7Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDt0aGlzLl9tYXA9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLnhyZWY9ZSx0aGlzLm9iaklkPW51bGwsdGhpcy5zdXBwcmVzc0VuY3J5cHRpb249ITEsdGhpcy5fX25vblNlcmlhbGl6YWJsZV9fPXV9YXNzaWduWHJlZihlKXt0aGlzLnhyZWY9ZX1nZXQgc2l6ZSgpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApLmxlbmd0aH1nZXQoZSx0LHIpe2xldCBuPXRoaXMuX21hcFtlXTtyZXR1cm4gdm9pZCAwPT09biYmdm9pZCAwIT09dCYmKG49dGhpcy5fbWFwW3RdLHZvaWQgMD09PW4mJnZvaWQgMCE9PXImJihuPXRoaXMuX21hcFtyXSkpLG4gaW5zdGFuY2VvZiBmJiZ0aGlzLnhyZWY/dGhpcy54cmVmLmZldGNoKG4sdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOm59YXN5bmMgZ2V0QXN5bmMoZSx0LHIpe2xldCBuPXRoaXMuX21hcFtlXTtyZXR1cm4gdm9pZCAwPT09biYmdm9pZCAwIT09dCYmKG49dGhpcy5fbWFwW3RdLHZvaWQgMD09PW4mJnZvaWQgMCE9PXImJihuPXRoaXMuX21hcFtyXSkpLG4gaW5zdGFuY2VvZiBmJiZ0aGlzLnhyZWY/dGhpcy54cmVmLmZldGNoQXN5bmMobix0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik6bn1nZXRBcnJheShlLHQscil7bGV0IG49dGhpcy5fbWFwW2VdO2lmKHZvaWQgMD09PW4mJnZvaWQgMCE9PXQmJihuPXRoaXMuX21hcFt0XSx2b2lkIDA9PT1uJiZ2b2lkIDAhPT1yJiYobj10aGlzLl9tYXBbcl0pKSxuIGluc3RhbmNlb2YgZiYmdGhpcy54cmVmJiYobj10aGlzLnhyZWYuZmV0Y2gobix0aGlzLnN1cHByZXNzRW5jcnlwdGlvbikpLEFycmF5LmlzQXJyYXkobikpe249bi5zbGljZSgpO2ZvcihsZXQgZT0wLHQ9bi5sZW5ndGg7ZTx0O2UrKyluW2VdaW5zdGFuY2VvZiBmJiZ0aGlzLnhyZWYmJihuW2VdPXRoaXMueHJlZi5mZXRjaChuW2VdLHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKSl9cmV0dXJuIG59Z2V0UmF3KGUpe3JldHVybiB0aGlzLl9tYXBbZV19Z2V0S2V5cygpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApfWdldFJhd1ZhbHVlcygpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX21hcCl9c2V0KGUsdCl7dGhpcy5fbWFwW2VdPXR9aGFzKGUpe3JldHVybiB2b2lkIDAhPT10aGlzLl9tYXBbZV19Zm9yRWFjaChlKXtmb3IoY29uc3QgdCBpbiB0aGlzLl9tYXApZSh0LHRoaXMuZ2V0KHQpKX1zdGF0aWMgZ2V0IGVtcHR5KCl7Y29uc3QgZT1uZXcgZChudWxsKTtyZXR1cm4gZS5zZXQ9KGUsdCk9PnsoMCxuLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIGBzZXRgIG9uIHRoZSBlbXB0eSBkaWN0aW9uYXJ5LiIpfSwoMCxuLnNoYWRvdykodGhpcywiZW1wdHkiLGUpfXN0YXRpYyBtZXJnZShlKXtsZXR7eHJlZjp0LGRpY3RBcnJheTpyLG1lcmdlU3ViRGljdHM6bj0hMX09ZTtjb25zdCBhPW5ldyBkKHQpLGk9bmV3IE1hcDtmb3IoY29uc3QgZSBvZiByKWlmKGUgaW5zdGFuY2VvZiBkKWZvcihjb25zdFt0LHJdb2YgT2JqZWN0LmVudHJpZXMoZS5fbWFwKSl7bGV0IGU9aS5nZXQodCk7aWYodm9pZCAwPT09ZSllPVtdLGkuc2V0KHQsZSk7ZWxzZSBpZighKG4mJnIgaW5zdGFuY2VvZiBkKSljb250aW51ZTtlLnB1c2gocil9Zm9yKGNvbnN0W2Uscl1vZiBpKXtpZigxPT09ci5sZW5ndGh8fCEoclswXWluc3RhbmNlb2YgZCkpe2EuX21hcFtlXT1yWzBdO2NvbnRpbnVlfWNvbnN0IG49bmV3IGQodCk7Zm9yKGNvbnN0IGUgb2Ygcilmb3IoY29uc3RbdCxyXW9mIE9iamVjdC5lbnRyaWVzKGUuX21hcCkpdm9pZCAwPT09bi5fbWFwW3RdJiYobi5fbWFwW3RdPXIpO24uc2l6ZT4wJiYoYS5fbWFwW2VdPW4pfXJldHVybiBpLmNsZWFyKCksYS5zaXplPjA/YTpkLmVtcHR5fX10LkRpY3Q9ZDtjbGFzcyBme2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5udW09ZSx0aGlzLmdlbj10fXRvU3RyaW5nKCl7cmV0dXJuIDA9PT10aGlzLmdlbj8iIi5jb25jYXQodGhpcy5udW0sIlIiKToiIi5jb25jYXQodGhpcy5udW0sIlIiKS5jb25jYXQodGhpcy5nZW4pfXN0YXRpYyBmcm9tU3RyaW5nKGUpe2NvbnN0IHQ9Y1tlXTtpZih0KXJldHVybiB0O2NvbnN0IHI9L14oXGQrKVIoXGQqKSQvLmV4ZWMoZSk7cmV0dXJuIHImJiIwIiE9PXJbMV0/Y1tlXT1uZXcgZihwYXJzZUludChyWzFdKSxyWzJdP3BhcnNlSW50KHJbMl0pOjApOm51bGx9c3RhdGljIGdldChlLHQpe3ZhciByO2NvbnN0IG49MD09PXQ/IiIuY29uY2F0KGUsIlIiKToiIi5jb25jYXQoZSwiUiIpLmNvbmNhdCh0KTtyZXR1cm4ocj1jKVtuXXx8KHJbbl09bmV3IGYoZSx0KSl9fXQuUmVmPWY7Y2xhc3MgZ3tjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO3RoaXMuX3NldD1uZXcgU2V0KG51bGw9PWU/dm9pZCAwOmUuX3NldCl9aGFzKGUpe3JldHVybiB0aGlzLl9zZXQuaGFzKGUudG9TdHJpbmcoKSl9cHV0KGUpe3RoaXMuX3NldC5hZGQoZS50b1N0cmluZygpKX1yZW1vdmUoZSl7dGhpcy5fc2V0LmRlbGV0ZShlLnRvU3RyaW5nKCkpfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHRoaXMuX3NldC52YWx1ZXMoKX1jbGVhcigpe3RoaXMuX3NldC5jbGVhcigpfX10LlJlZlNldD1nO2NsYXNzIHB7Y29uc3RydWN0b3IoKXt0aGlzLl9tYXA9bmV3IE1hcH1nZXQgc2l6ZSgpe3JldHVybiB0aGlzLl9tYXAuc2l6ZX1nZXQoZSl7cmV0dXJuIHRoaXMuX21hcC5nZXQoZS50b1N0cmluZygpKX1oYXMoZSl7cmV0dXJuIHRoaXMuX21hcC5oYXMoZS50b1N0cmluZygpKX1wdXQoZSx0KXt0aGlzLl9tYXAuc2V0KGUudG9TdHJpbmcoKSx0KX1wdXRBbGlhcyhlLHQpe3RoaXMuX21hcC5zZXQoZS50b1N0cmluZygpLHRoaXMuZ2V0KHQpKX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLl9tYXAudmFsdWVzKCl9Y2xlYXIoKXt0aGlzLl9tYXAuY2xlYXIoKX19ZnVuY3Rpb24gbShlLHQpe3JldHVybiBlIGluc3RhbmNlb2YgbCYmKHZvaWQgMD09PXR8fGUubmFtZT09PXQpfXQuUmVmU2V0Q2FjaGU9cH0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkJhc2VTdHJlYW09dm9pZCAwO3ZhciBuPXIoMTQ0KTtjbGFzcyBhe2NvbnN0cnVjdG9yKCl7dGhpcy5jb25zdHJ1Y3Rvcj09PWEmJigwLG4udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU3RyZWFtLiIpfWdldCBsZW5ndGgoKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgZ2V0dGVyIGBsZW5ndGhgIGFjY2Vzc2VkIil9Z2V0IGlzRW1wdHkoKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgZ2V0dGVyIGBpc0VtcHR5YCBhY2Nlc3NlZCIpfWdldCBpc0RhdGFMb2FkZWQoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiaXNEYXRhTG9hZGVkIiwhMCl9Z2V0Qnl0ZSgpeygwLG4udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVgIGNhbGxlZCIpfWdldEJ5dGVzKGUpeygwLG4udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVzYCBjYWxsZWQiKX1wZWVrQnl0ZSgpe2NvbnN0IGU9dGhpcy5nZXRCeXRlKCk7cmV0dXJuLTEhPT1lJiZ0aGlzLnBvcy0tLGV9cGVla0J5dGVzKGUpe2NvbnN0IHQ9dGhpcy5nZXRCeXRlcyhlKTtyZXR1cm4gdGhpcy5wb3MtPXQubGVuZ3RoLHR9Z2V0VWludDE2KCl7Y29uc3QgZT10aGlzLmdldEJ5dGUoKSx0PXRoaXMuZ2V0Qnl0ZSgpO3JldHVybi0xPT09ZXx8LTE9PT10Py0xOihlPDw4KSt0fWdldEludDMyKCl7cmV0dXJuKHRoaXMuZ2V0Qnl0ZSgpPDwyNCkrKHRoaXMuZ2V0Qnl0ZSgpPDwxNikrKHRoaXMuZ2V0Qnl0ZSgpPDw4KSt0aGlzLmdldEJ5dGUoKX1nZXRCeXRlUmFuZ2UoZSx0KXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBnZXRCeXRlUmFuZ2VgIGNhbGxlZCIpfWdldFN0cmluZyhlKXtyZXR1cm4oMCxuLmJ5dGVzVG9TdHJpbmcpKHRoaXMuZ2V0Qnl0ZXMoZSkpfXNraXAoZSl7dGhpcy5wb3MrPWV8fDF9cmVzZXQoKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGByZXNldGAgY2FsbGVkIil9bW92ZVN0YXJ0KCl7KDAsbi51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgbW92ZVN0YXJ0YCBjYWxsZWQiKX1tYWtlU3ViU3RyZWFtKGUsdCl7KDAsbi51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgbWFrZVN1YlN0cmVhbWAgY2FsbGVkIil9Z2V0QmFzZVN0cmVhbXMoKXtyZXR1cm4gbnVsbH19dC5CYXNlU3RyZWFtPWF9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5OZXR3b3JrUGRmTWFuYWdlcj10LkxvY2FsUGRmTWFuYWdlcj12b2lkIDA7dmFyIG49cigxNDQpLGE9cigxNTMpLGk9cigxNDkpLHM9cigxNTUpLG89cigxNTQpO2NsYXNzIGN7Y29uc3RydWN0b3IoZSl7dmFyIHQ7dGhpcy5jb25zdHJ1Y3Rvcj09PWMmJigwLG4udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlUGRmTWFuYWdlci4iKSx0aGlzLl9kb2NCYXNlVXJsPWZ1bmN0aW9uKGUpe2lmKGUpe2NvbnN0IHQ9KDAsbi5jcmVhdGVWYWxpZEFic29sdXRlVXJsKShlKTtpZih0KXJldHVybiB0LmhyZWY7KDAsbi53YXJuKSgnSW52YWxpZCBhYnNvbHV0ZSBkb2NCYXNlVXJsOiAiJy5jb25jYXQoZSwnIi4nKSl9cmV0dXJuIG51bGx9KGUuZG9jQmFzZVVybCksdGhpcy5fZG9jSWQ9ZS5kb2NJZCx0aGlzLl9wYXNzd29yZD1lLnBhc3N3b3JkLHRoaXMuZW5hYmxlWGZhPWUuZW5hYmxlWGZhLCh0PWUuZXZhbHVhdG9yT3B0aW9ucykuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQmJih0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkPW4uRmVhdHVyZVRlc3QuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpLHRoaXMuZXZhbHVhdG9yT3B0aW9ucz1lLmV2YWx1YXRvck9wdGlvbnN9Z2V0IGRvY0lkKCl7cmV0dXJuIHRoaXMuX2RvY0lkfWdldCBwYXNzd29yZCgpe3JldHVybiB0aGlzLl9wYXNzd29yZH1nZXQgZG9jQmFzZVVybCgpe2NvbnN0IGU9dGhpcy5wZGZEb2N1bWVudC5jYXRhbG9nO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJkb2NCYXNlVXJsIixlLmJhc2VVcmx8fHRoaXMuX2RvY0Jhc2VVcmwpfWVuc3VyZURvYyhlLHQpe3JldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LGUsdCl9ZW5zdXJlWFJlZihlLHQpe3JldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LnhyZWYsZSx0KX1lbnN1cmVDYXRhbG9nKGUsdCl7cmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQuY2F0YWxvZyxlLHQpfWdldFBhZ2UoZSl7cmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuZ2V0UGFnZShlKX1mb250RmFsbGJhY2soZSx0KXtyZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5mb250RmFsbGJhY2soZSx0KX1sb2FkWGZhRm9udHMoZSx0KXtyZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5sb2FkWGZhRm9udHMoZSx0KX1sb2FkWGZhSW1hZ2VzKCl7cmV0dXJuIHRoaXMucGRmRG9jdW1lbnQubG9hZFhmYUltYWdlcygpfXNlcmlhbGl6ZVhmYURhdGEoZSl7cmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuc2VyaWFsaXplWGZhRGF0YShlKX1jbGVhbnVwKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5jbGVhbnVwKGUpfWFzeW5jIGVuc3VyZShlLHQscil7KDAsbi51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgZW5zdXJlYCBjYWxsZWQiKX1yZXF1ZXN0UmFuZ2UoZSx0KXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGByZXF1ZXN0UmFuZ2VgIGNhbGxlZCIpfXJlcXVlc3RMb2FkZWRTdHJlYW0oKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGByZXF1ZXN0TG9hZGVkU3RyZWFtYCBjYWxsZWQiKX1zZW5kUHJvZ3Jlc3NpdmVEYXRhKGUpeygwLG4udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHNlbmRQcm9ncmVzc2l2ZURhdGFgIGNhbGxlZCIpfXVwZGF0ZVBhc3N3b3JkKGUpe3RoaXMuX3Bhc3N3b3JkPWV9dGVybWluYXRlKGUpeygwLG4udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHRlcm1pbmF0ZWAgY2FsbGVkIil9fXQuTG9jYWxQZGZNYW5hZ2VyPWNsYXNzIGV4dGVuZHMgY3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdCB0PW5ldyBvLlN0cmVhbShlLnNvdXJjZSk7dGhpcy5wZGZEb2N1bWVudD1uZXcgcy5QREZEb2N1bWVudCh0aGlzLHQpLHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2U9UHJvbWlzZS5yZXNvbHZlKHQpfWFzeW5jIGVuc3VyZShlLHQscil7Y29uc3Qgbj1lW3RdO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkoZSxyKTpufXJlcXVlc3RSYW5nZShlLHQpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKX1yZXF1ZXN0TG9hZGVkU3RyZWFtKCl7cmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2V9dGVybWluYXRlKGUpe319LHQuTmV0d29ya1BkZk1hbmFnZXI9Y2xhc3MgZXh0ZW5kcyBje2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuc3RyZWFtTWFuYWdlcj1uZXcgYS5DaHVua2VkU3RyZWFtTWFuYWdlcihlLnNvdXJjZSx7bXNnSGFuZGxlcjplLmhhbmRsZXIsbGVuZ3RoOmUubGVuZ3RoLGRpc2FibGVBdXRvRmV0Y2g6ZS5kaXNhYmxlQXV0b0ZldGNoLHJhbmdlQ2h1bmtTaXplOmUucmFuZ2VDaHVua1NpemV9KSx0aGlzLnBkZkRvY3VtZW50PW5ldyBzLlBERkRvY3VtZW50KHRoaXMsdGhpcy5zdHJlYW1NYW5hZ2VyLmdldFN0cmVhbSgpKX1hc3luYyBlbnN1cmUoZSx0LHIpe3RyeXtjb25zdCBuPWVbdF07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseShlLHIpOm59Y2F0Y2gobil7aWYoIShuIGluc3RhbmNlb2YgaS5NaXNzaW5nRGF0YUV4Y2VwdGlvbikpdGhyb3cgbjtyZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0UmFuZ2Uobi5iZWdpbixuLmVuZCksdGhpcy5lbnN1cmUoZSx0LHIpfX1yZXF1ZXN0UmFuZ2UoZSx0KXtyZXR1cm4gdGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RSYW5nZShlLHQpfXJlcXVlc3RMb2FkZWRTdHJlYW0oKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnN0cmVhbU1hbmFnZXIucmVxdWVzdEFsbENodW5rcyhlKX1zZW5kUHJvZ3Jlc3NpdmVEYXRhKGUpe3RoaXMuc3RyZWFtTWFuYWdlci5vblJlY2VpdmVEYXRhKHtjaHVuazplfSl9dGVybWluYXRlKGUpe3RoaXMuc3RyZWFtTWFuYWdlci5hYm9ydChlKX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ2h1bmtlZFN0cmVhbU1hbmFnZXI9dC5DaHVua2VkU3RyZWFtPXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSkscigxMTYpLHIoMTI2KSxyKDEyOCkscigxMzEpLHIoMTMzKSxyKDEzNSkscigxMzcpLHIoMTM5KSxyKDIpO3ZhciBuPXIoMTQ5KSxhPXIoMTQ0KSxpPXIoMTU0KTtjbGFzcyBzIGV4dGVuZHMgaS5TdHJlYW17Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKG5ldyBVaW50OEFycmF5KGUpLDAsZSxudWxsKSx0aGlzLmNodW5rU2l6ZT10LHRoaXMuX2xvYWRlZENodW5rcz1uZXcgU2V0LHRoaXMubnVtQ2h1bmtzPU1hdGguY2VpbChlL3QpLHRoaXMubWFuYWdlcj1yLHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoPTAsdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuaz0tMX1nZXRNaXNzaW5nQ2h1bmtzKCl7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MCxyPXRoaXMubnVtQ2h1bmtzO3Q8cjsrK3QpdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyh0KXx8ZS5wdXNoKHQpO3JldHVybiBlfWdldCBudW1DaHVua3NMb2FkZWQoKXtyZXR1cm4gdGhpcy5fbG9hZGVkQ2h1bmtzLnNpemV9Z2V0IGlzRGF0YUxvYWRlZCgpe3JldHVybiB0aGlzLm51bUNodW5rc0xvYWRlZD09PXRoaXMubnVtQ2h1bmtzfW9uUmVjZWl2ZURhdGEoZSx0KXtjb25zdCByPXRoaXMuY2h1bmtTaXplO2lmKGUlciE9MCl0aHJvdyBuZXcgRXJyb3IoIkJhZCBiZWdpbiBvZmZzZXQ6ICIuY29uY2F0KGUpKTtjb25zdCBuPWUrdC5ieXRlTGVuZ3RoO2lmKG4lciE9MCYmbiE9PXRoaXMuYnl0ZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQmFkIGVuZCBvZmZzZXQ6ICIuY29uY2F0KG4pKTt0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheSh0KSxlKTtjb25zdCBhPU1hdGguZmxvb3IoZS9yKSxpPU1hdGguZmxvb3IoKG4tMSkvcikrMTtmb3IobGV0IGU9YTtlPGk7KytlKXRoaXMuX2xvYWRlZENodW5rcy5hZGQoZSl9b25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGUpe2xldCB0PXRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoO2NvbnN0IHI9TWF0aC5mbG9vcih0L3RoaXMuY2h1bmtTaXplKTt0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheShlKSx0KSx0Kz1lLmJ5dGVMZW5ndGgsdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg9dDtjb25zdCBuPXQ+PXRoaXMuZW5kP3RoaXMubnVtQ2h1bmtzOk1hdGguZmxvb3IodC90aGlzLmNodW5rU2l6ZSk7Zm9yKGxldCBlPXI7ZTxuOysrZSl0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGUpfWVuc3VyZUJ5dGUoZSl7aWYoZTx0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aClyZXR1cm47Y29uc3QgdD1NYXRoLmZsb29yKGUvdGhpcy5jaHVua1NpemUpO2lmKCEodD50aGlzLm51bUNodW5rcykmJnQhPT10aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rKXtpZighdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyh0KSl0aHJvdyBuZXcgbi5NaXNzaW5nRGF0YUV4Y2VwdGlvbihlLGUrMSk7dGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuaz10fX1lbnN1cmVSYW5nZShlLHQpe2lmKGU+PXQpcmV0dXJuO2lmKHQ8PXRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKXJldHVybjtjb25zdCByPU1hdGguZmxvb3IoZS90aGlzLmNodW5rU2l6ZSk7aWYocj50aGlzLm51bUNodW5rcylyZXR1cm47Y29uc3QgYT1NYXRoLm1pbihNYXRoLmZsb29yKCh0LTEpL3RoaXMuY2h1bmtTaXplKSsxLHRoaXMubnVtQ2h1bmtzKTtmb3IobGV0IGk9cjtpPGE7KytpKWlmKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGkpKXRocm93IG5ldyBuLk1pc3NpbmdEYXRhRXhjZXB0aW9uKGUsdCl9bmV4dEVtcHR5Q2h1bmsoZSl7Y29uc3QgdD10aGlzLm51bUNodW5rcztmb3IobGV0IHI9MDtyPHQ7KytyKXtjb25zdCBuPShlK3IpJXQ7aWYoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMobikpcmV0dXJuIG59cmV0dXJuIG51bGx9aGFzQ2h1bmsoZSl7cmV0dXJuIHRoaXMuX2xvYWRlZENodW5rcy5oYXMoZSl9Z2V0Qnl0ZSgpe2NvbnN0IGU9dGhpcy5wb3M7cmV0dXJuIGU+PXRoaXMuZW5kPy0xOihlPj10aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVCeXRlKGUpLHRoaXMuYnl0ZXNbdGhpcy5wb3MrK10pfWdldEJ5dGVzKGUpe2NvbnN0IHQ9dGhpcy5ieXRlcyxyPXRoaXMucG9zLG49dGhpcy5lbmQ7aWYoIWUpcmV0dXJuIG4+dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgmJnRoaXMuZW5zdXJlUmFuZ2UocixuKSx0LnN1YmFycmF5KHIsbik7bGV0IGE9citlO3JldHVybiBhPm4mJihhPW4pLGE+dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgmJnRoaXMuZW5zdXJlUmFuZ2UocixhKSx0aGlzLnBvcz1hLHQuc3ViYXJyYXkocixhKX1nZXRCeXRlUmFuZ2UoZSx0KXtyZXR1cm4gZTwwJiYoZT0wKSx0PnRoaXMuZW5kJiYodD10aGlzLmVuZCksdD50aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVSYW5nZShlLHQpLHRoaXMuYnl0ZXMuc3ViYXJyYXkoZSx0KX1tYWtlU3ViU3RyZWFtKGUsdCl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7ZnVuY3Rpb24gbigpe310P2UrdD50aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVSYW5nZShlLGUrdCk6ZT49dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgmJnRoaXMuZW5zdXJlQnl0ZShlKSxuLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHRoaXMpLG4ucHJvdG90eXBlLmdldE1pc3NpbmdDaHVua3M9ZnVuY3Rpb24oKXtjb25zdCBlPXRoaXMuY2h1bmtTaXplLHQ9TWF0aC5mbG9vcih0aGlzLnN0YXJ0L2UpLHI9TWF0aC5mbG9vcigodGhpcy5lbmQtMSkvZSkrMSxuPVtdO2ZvcihsZXQgZT10O2U8cjsrK2UpdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhlKXx8bi5wdXNoKGUpO3JldHVybiBufSxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsImlzRGF0YUxvYWRlZCIse2dldCgpe3JldHVybiB0aGlzLm51bUNodW5rc0xvYWRlZD09PXRoaXMubnVtQ2h1bmtzfHwwPT09dGhpcy5nZXRNaXNzaW5nQ2h1bmtzKCkubGVuZ3RofSxjb25maWd1cmFibGU6ITB9KTtjb25zdCBhPW5ldyBuO3JldHVybiBhLnBvcz1hLnN0YXJ0PWUsYS5lbmQ9ZSt0fHx0aGlzLmVuZCxhLmRpY3Q9cixhfWdldEJhc2VTdHJlYW1zKCl7cmV0dXJuW3RoaXNdfX10LkNodW5rZWRTdHJlYW09cyx0LkNodW5rZWRTdHJlYW1NYW5hZ2VyPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5sZW5ndGg9dC5sZW5ndGgsdGhpcy5jaHVua1NpemU9dC5yYW5nZUNodW5rU2l6ZSx0aGlzLnN0cmVhbT1uZXcgcyh0aGlzLmxlbmd0aCx0aGlzLmNodW5rU2l6ZSx0aGlzKSx0aGlzLnBkZk5ldHdvcmtTdHJlYW09ZSx0aGlzLmRpc2FibGVBdXRvRmV0Y2g9dC5kaXNhYmxlQXV0b0ZldGNoLHRoaXMubXNnSGFuZGxlcj10Lm1zZ0hhbmRsZXIsdGhpcy5jdXJyUmVxdWVzdElkPTAsdGhpcy5fY2h1bmtzTmVlZGVkQnlSZXF1ZXN0PW5ldyBNYXAsdGhpcy5fcmVxdWVzdHNCeUNodW5rPW5ldyBNYXAsdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3Q9bmV3IE1hcCx0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aD0wLHRoaXMuYWJvcnRlZD0hMSx0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5PW5ldyBhLlByb21pc2VDYXBhYmlsaXR5fXNlbmRSZXF1ZXN0KGUsdCl7Y29uc3Qgcj10aGlzLnBkZk5ldHdvcmtTdHJlYW0uZ2V0UmFuZ2VSZWFkZXIoZSx0KTtyLmlzU3RyZWFtaW5nU3VwcG9ydGVkfHwoci5vblByb2dyZXNzPXRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMpKTtsZXQgYT1bXSxpPTA7cmV0dXJuIG5ldyBQcm9taXNlKCgoZSx0KT0+e2NvbnN0IHM9bz0+e2xldHt2YWx1ZTpjLGRvbmU6bH09bzt0cnl7aWYobCl7Y29uc3QgdD0oMCxuLmFycmF5QnVmZmVyc1RvQnl0ZXMpKGEpO3JldHVybiBhPW51bGwsdm9pZCBlKHQpfWkrPWMuYnl0ZUxlbmd0aCxyLmlzU3RyZWFtaW5nU3VwcG9ydGVkJiZ0aGlzLm9uUHJvZ3Jlc3Moe2xvYWRlZDppfSksYS5wdXNoKGMpLHIucmVhZCgpLnRoZW4ocyx0KX1jYXRjaChlKXt0KGUpfX07ci5yZWFkKCkudGhlbihzLHQpfSkpLnRoZW4oKHQ9Pnt0aGlzLmFib3J0ZWR8fHRoaXMub25SZWNlaXZlRGF0YSh7Y2h1bms6dCxiZWdpbjplfSl9KSl9cmVxdWVzdEFsbENodW5rcygpe2lmKCEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXSkpe2NvbnN0IGU9dGhpcy5zdHJlYW0uZ2V0TWlzc2luZ0NodW5rcygpO3RoaXMuX3JlcXVlc3RDaHVua3MoZSl9cmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucHJvbWlzZX1fcmVxdWVzdENodW5rcyhlKXtjb25zdCB0PXRoaXMuY3VyclJlcXVlc3RJZCsrLHI9bmV3IFNldDt0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3Quc2V0KHQscik7Zm9yKGNvbnN0IHQgb2YgZSl0aGlzLnN0cmVhbS5oYXNDaHVuayh0KXx8ci5hZGQodCk7aWYoMD09PXIuc2l6ZSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgbj1uZXcgYS5Qcm9taXNlQ2FwYWJpbGl0eTt0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC5zZXQodCxuKTtjb25zdCBpPVtdO2Zvcihjb25zdCBlIG9mIHIpe2xldCByPXRoaXMuX3JlcXVlc3RzQnlDaHVuay5nZXQoZSk7cnx8KHI9W10sdGhpcy5fcmVxdWVzdHNCeUNodW5rLnNldChlLHIpLGkucHVzaChlKSksci5wdXNoKHQpfWlmKGkubGVuZ3RoPjApe2NvbnN0IGU9dGhpcy5ncm91cENodW5rcyhpKTtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPXQuYmVnaW5DaHVuayp0aGlzLmNodW5rU2l6ZSxyPU1hdGgubWluKHQuZW5kQ2h1bmsqdGhpcy5jaHVua1NpemUsdGhpcy5sZW5ndGgpO3RoaXMuc2VuZFJlcXVlc3QoZSxyKS5jYXRjaChuLnJlamVjdCl9fXJldHVybiBuLnByb21pc2UuY2F0Y2goKGU9PntpZighdGhpcy5hYm9ydGVkKXRocm93IGV9KSl9Z2V0U3RyZWFtKCl7cmV0dXJuIHRoaXMuc3RyZWFtfXJlcXVlc3RSYW5nZShlLHQpe3Q9TWF0aC5taW4odCx0aGlzLmxlbmd0aCk7Y29uc3Qgcj10aGlzLmdldEJlZ2luQ2h1bmsoZSksbj10aGlzLmdldEVuZENodW5rKHQpLGE9W107Zm9yKGxldCBlPXI7ZTxuOysrZSlhLnB1c2goZSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RDaHVua3MoYSl9cmVxdWVzdFJhbmdlcygpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXTtjb25zdCB0PVtdO2Zvcihjb25zdCByIG9mIGUpe2NvbnN0IGU9dGhpcy5nZXRCZWdpbkNodW5rKHIuYmVnaW4pLG49dGhpcy5nZXRFbmRDaHVuayhyLmVuZCk7Zm9yKGxldCByPWU7cjxuOysrcil0LmluY2x1ZGVzKHIpfHx0LnB1c2gocil9cmV0dXJuIHQuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSkpLHRoaXMuX3JlcXVlc3RDaHVua3ModCl9Z3JvdXBDaHVua3MoZSl7Y29uc3QgdD1bXTtsZXQgcj0tMSxuPS0xO2ZvcihsZXQgYT0wLGk9ZS5sZW5ndGg7YTxpOysrYSl7Y29uc3QgaT1lW2FdO3I8MCYmKHI9aSksbj49MCYmbisxIT09aSYmKHQucHVzaCh7YmVnaW5DaHVuazpyLGVuZENodW5rOm4rMX0pLHI9aSksYSsxPT09ZS5sZW5ndGgmJnQucHVzaCh7YmVnaW5DaHVuazpyLGVuZENodW5rOmkrMX0pLG49aX1yZXR1cm4gdH1vblByb2dyZXNzKGUpe3RoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIse2xvYWRlZDp0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQqdGhpcy5jaHVua1NpemUrZS5sb2FkZWQsdG90YWw6dGhpcy5sZW5ndGh9KX1vblJlY2VpdmVEYXRhKGUpe2NvbnN0IHQ9ZS5jaHVuayxyPXZvaWQgMD09PWUuYmVnaW4sbj1yP3RoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoOmUuYmVnaW4sYT1uK3QuYnl0ZUxlbmd0aCxpPU1hdGguZmxvb3Iobi90aGlzLmNodW5rU2l6ZSkscz1hPHRoaXMubGVuZ3RoP01hdGguZmxvb3IoYS90aGlzLmNodW5rU2l6ZSk6TWF0aC5jZWlsKGEvdGhpcy5jaHVua1NpemUpO3I/KHRoaXMuc3RyZWFtLm9uUmVjZWl2ZVByb2dyZXNzaXZlRGF0YSh0KSx0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aD1hKTp0aGlzLnN0cmVhbS5vblJlY2VpdmVEYXRhKG4sdCksdGhpcy5zdHJlYW0uaXNEYXRhTG9hZGVkJiZ0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnJlc29sdmUodGhpcy5zdHJlYW0pO2NvbnN0IG89W107Zm9yKGxldCBlPWk7ZTxzOysrZSl7Y29uc3QgdD10aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGUpO2lmKHQpe3RoaXMuX3JlcXVlc3RzQnlDaHVuay5kZWxldGUoZSk7Zm9yKGNvbnN0IHIgb2YgdCl7Y29uc3QgdD10aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QuZ2V0KHIpO3QuaGFzKGUpJiZ0LmRlbGV0ZShlKSx0LnNpemU+MHx8by5wdXNoKHIpfX19aWYoIXRoaXMuZGlzYWJsZUF1dG9GZXRjaCYmMD09PXRoaXMuX3JlcXVlc3RzQnlDaHVuay5zaXplKXtsZXQgZTtpZigxPT09dGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkKXtjb25zdCB0PXRoaXMuc3RyZWFtLm51bUNodW5rcy0xO3RoaXMuc3RyZWFtLmhhc0NodW5rKHQpfHwoZT10KX1lbHNlIGU9dGhpcy5zdHJlYW0ubmV4dEVtcHR5Q2h1bmsocyk7TnVtYmVyLmlzSW50ZWdlcihlKSYmdGhpcy5fcmVxdWVzdENodW5rcyhbZV0pfWZvcihjb25zdCBlIG9mIG8pe2NvbnN0IHQ9dGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZ2V0KGUpO3RoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmRlbGV0ZShlKSx0LnJlc29sdmUoKX10aGlzLm1zZ0hhbmRsZXIuc2VuZCgiRG9jUHJvZ3Jlc3MiLHtsb2FkZWQ6dGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkKnRoaXMuY2h1bmtTaXplLHRvdGFsOnRoaXMubGVuZ3RofSl9b25FcnJvcihlKXt0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnJlamVjdChlKX1nZXRCZWdpbkNodW5rKGUpe3JldHVybiBNYXRoLmZsb29yKGUvdGhpcy5jaHVua1NpemUpfWdldEVuZENodW5rKGUpe3JldHVybiBNYXRoLmZsb29yKChlLTEpL3RoaXMuY2h1bmtTaXplKSsxfWFib3J0KGUpe3RoaXMuYWJvcnRlZD0hMCx0aGlzLnBkZk5ldHdvcmtTdHJlYW0mJnRoaXMucGRmTmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhlKTtmb3IoY29uc3QgdCBvZiB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC52YWx1ZXMoKSl0LnJlamVjdChlKX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuU3RyaW5nU3RyZWFtPXQuU3RyZWFtPXQuTnVsbFN0cmVhbT12b2lkIDAscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTUxKSxhPXIoMTQ0KTtjbGFzcyBpIGV4dGVuZHMgbi5CYXNlU3RyZWFte2NvbnN0cnVjdG9yKGUsdCxyLG4pe3N1cGVyKCksdGhpcy5ieXRlcz1lIGluc3RhbmNlb2YgVWludDhBcnJheT9lOm5ldyBVaW50OEFycmF5KGUpLHRoaXMuc3RhcnQ9dHx8MCx0aGlzLnBvcz10aGlzLnN0YXJ0LHRoaXMuZW5kPXQrcnx8dGhpcy5ieXRlcy5sZW5ndGgsdGhpcy5kaWN0PW59Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmVuZC10aGlzLnN0YXJ0fWdldCBpc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLmxlbmd0aH1nZXRCeXRlKCl7cmV0dXJuIHRoaXMucG9zPj10aGlzLmVuZD8tMTp0aGlzLmJ5dGVzW3RoaXMucG9zKytdfWdldEJ5dGVzKGUpe2NvbnN0IHQ9dGhpcy5ieXRlcyxyPXRoaXMucG9zLG49dGhpcy5lbmQ7aWYoIWUpcmV0dXJuIHQuc3ViYXJyYXkocixuKTtsZXQgYT1yK2U7cmV0dXJuIGE+biYmKGE9biksdGhpcy5wb3M9YSx0LnN1YmFycmF5KHIsYSl9Z2V0Qnl0ZVJhbmdlKGUsdCl7cmV0dXJuIGU8MCYmKGU9MCksdD50aGlzLmVuZCYmKHQ9dGhpcy5lbmQpLHRoaXMuYnl0ZXMuc3ViYXJyYXkoZSx0KX1yZXNldCgpe3RoaXMucG9zPXRoaXMuc3RhcnR9bW92ZVN0YXJ0KCl7dGhpcy5zdGFydD10aGlzLnBvc31tYWtlU3ViU3RyZWFtKGUsdCl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7cmV0dXJuIG5ldyBpKHRoaXMuYnl0ZXMuYnVmZmVyLGUsdCxyKX19dC5TdHJlYW09aSx0LlN0cmluZ1N0cmVhbT1jbGFzcyBleHRlbmRzIGl7Y29uc3RydWN0b3IoZSl7c3VwZXIoKDAsYS5zdHJpbmdUb0J5dGVzKShlKSl9fSx0Lk51bGxTdHJlYW09Y2xhc3MgZXh0ZW5kcyBpe2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IFVpbnQ4QXJyYXkoMCkpfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5QYWdlPXQuUERGRG9jdW1lbnQ9dm9pZCAwLHIoMikscigxMzkpLHIoMTE2KSxyKDEyNikscigxMjgpLHIoMTMxKSxyKDEzMykscigxMzUpLHIoMTM3KSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNDQpLGE9cigxNTYpLGk9cigxNDkpLGM9cigxNTApLGw9cigyMDEpLGg9cigxNTEpLHU9cigyMTgpLGQ9cigyMjApLGY9cigyMjIpLGc9cigyNTUpLHA9cigxNjYpLG09cigxNTQpLGI9cigyMjYpLHk9cigyMTQpLHc9cigxNjMpLHY9cigxNjgpLHg9cigyMjUpLFM9cigyMTYpLEE9cigyMjcpLGs9cigyNTYpO2NvbnN0IEM9WzAsMCw2MTIsNzkyXTt2YXIgTz1uZXcgV2Vha1NldDtjbGFzcyBGe2NvbnN0cnVjdG9yKGUpe3ModGhpcyxPKTtsZXR7cGRmTWFuYWdlcjp0LHhyZWY6cixwYWdlSW5kZXg6bixwYWdlRGljdDphLHJlZjppLGdsb2JhbElkRmFjdG9yeTpvLGZvbnRDYWNoZTpjLGJ1aWx0SW5DTWFwQ2FjaGU6bCxzdGFuZGFyZEZvbnREYXRhQ2FjaGU6aCxnbG9iYWxJbWFnZUNhY2hlOnUsc3lzdGVtRm9udENhY2hlOmQsbm9uQmxlbmRNb2Rlc1NldDpmLHhmYUZhY3Rvcnk6Z309ZTt0aGlzLnBkZk1hbmFnZXI9dCx0aGlzLnBhZ2VJbmRleD1uLHRoaXMucGFnZURpY3Q9YSx0aGlzLnhyZWY9cix0aGlzLnJlZj1pLHRoaXMuZm9udENhY2hlPWMsdGhpcy5idWlsdEluQ01hcENhY2hlPWwsdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGU9aCx0aGlzLmdsb2JhbEltYWdlQ2FjaGU9dSx0aGlzLnN5c3RlbUZvbnRDYWNoZT1kLHRoaXMubm9uQmxlbmRNb2Rlc1NldD1mLHRoaXMuZXZhbHVhdG9yT3B0aW9ucz10LmV2YWx1YXRvck9wdGlvbnMsdGhpcy5yZXNvdXJjZXNQcm9taXNlPW51bGwsdGhpcy54ZmFGYWN0b3J5PWc7Y29uc3QgcD17b2JqOjB9O3RoaXMuX2xvY2FsSWRGYWN0b3J5PWNsYXNzIGV4dGVuZHMgb3tzdGF0aWMgY3JlYXRlT2JqSWQoKXtyZXR1cm4icCIuY29uY2F0KG4sIl8iKS5jb25jYXQoKytwLm9iail9c3RhdGljIGdldFBhZ2VPYmpJZCgpe3JldHVybiJwIi5jb25jYXQoaS50b1N0cmluZygpKX19fV9nZXRJbmhlcml0YWJsZVByb3BlcnR5KGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07Y29uc3Qgcj0oMCxpLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnRoaXMucGFnZURpY3Qsa2V5OmUsZ2V0QXJyYXk6dCxzdG9wV2hlbkZvdW5kOiExfSk7cmV0dXJuIEFycmF5LmlzQXJyYXkocik/MSE9PXIubGVuZ3RoJiZyWzBdaW5zdGFuY2VvZiBjLkRpY3Q/Yy5EaWN0Lm1lcmdlKHt4cmVmOnRoaXMueHJlZixkaWN0QXJyYXk6cn0pOnJbMF06cn1nZXQgY29udGVudCgpe3JldHVybiB0aGlzLnBhZ2VEaWN0LmdldEFycmF5KCJDb250ZW50cyIpfWdldCByZXNvdXJjZXMoKXtjb25zdCBlPXRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJlc291cmNlcyIpO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJyZXNvdXJjZXMiLGUgaW5zdGFuY2VvZiBjLkRpY3Q/ZTpjLkRpY3QuZW1wdHkpfV9nZXRCb3VuZGluZ0JveChlKXtpZih0aGlzLnhmYURhdGEpcmV0dXJuIHRoaXMueGZhRGF0YS5iYm94O2xldCB0PXRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoZSwhMCk7aWYoQXJyYXkuaXNBcnJheSh0KSYmND09PXQubGVuZ3RoKXtpZih0PW4uVXRpbC5ub3JtYWxpemVSZWN0KHQpLHRbMl0tdFswXT4wJiZ0WzNdLXRbMV0+MClyZXR1cm4gdDsoMCxuLndhcm4pKCJFbXB0eSwgb3IgaW52YWxpZCwgLyIuY29uY2F0KGUsIiBlbnRyeS4iKSl9cmV0dXJuIG51bGx9Z2V0IG1lZGlhQm94KCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIm1lZGlhQm94Iix0aGlzLl9nZXRCb3VuZGluZ0JveCgiTWVkaWFCb3giKXx8Qyl9Z2V0IGNyb3BCb3goKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiY3JvcEJveCIsdGhpcy5fZ2V0Qm91bmRpbmdCb3goIkNyb3BCb3giKXx8dGhpcy5tZWRpYUJveCl9Z2V0IHVzZXJVbml0KCl7bGV0IGU9dGhpcy5wYWdlRGljdC5nZXQoIlVzZXJVbml0Iik7cmV0dXJuKCJudW1iZXIiIT10eXBlb2YgZXx8ZTw9MCkmJihlPTEpLCgwLG4uc2hhZG93KSh0aGlzLCJ1c2VyVW5pdCIsZSl9Z2V0IHZpZXcoKXtjb25zdHtjcm9wQm94OmUsbWVkaWFCb3g6dH09dGhpcztpZihlIT09dCYmISgwLG4uaXNBcnJheUVxdWFsKShlLHQpKXtjb25zdCByPW4uVXRpbC5pbnRlcnNlY3QoZSx0KTtpZihyJiZyWzJdLXJbMF0+MCYmclszXS1yWzFdPjApcmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsInZpZXciLHIpOygwLG4ud2FybikoIkVtcHR5IC9Dcm9wQm94IGFuZCAvTWVkaWFCb3ggaW50ZXJzZWN0aW9uLiIpfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJ2aWV3Iix0KX1nZXQgcm90YXRlKCl7bGV0IGU9dGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSgiUm90YXRlIil8fDA7cmV0dXJuIGUlOTAhPTA/ZT0wOmU+PTM2MD9lJT0zNjA6ZTwwJiYoZT0oZSUzNjArMzYwKSUzNjApLCgwLG4uc2hhZG93KSh0aGlzLCJyb3RhdGUiLGUpfV9vblN1YlN0cmVhbUVycm9yKGUsdCl7aWYoIXRoaXMuZXZhbHVhdG9yT3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxuLndhcm4pKCJnZXRDb250ZW50U3RyZWFtIC0gaWdub3Jpbmcgc3ViLXN0cmVhbSAoIi5jb25jYXQodCwnKTogIicpLmNvbmNhdChlLCciLicpKX1nZXRDb250ZW50U3RyZWFtKCl7cmV0dXJuIHRoaXMucGRmTWFuYWdlci5lbnN1cmUodGhpcywiY29udGVudCIpLnRoZW4oKGU9PmUgaW5zdGFuY2VvZiBoLkJhc2VTdHJlYW0/ZTpBcnJheS5pc0FycmF5KGUpP25ldyB2LlN0cmVhbXNTZXF1ZW5jZVN0cmVhbShlLHRoaXMuX29uU3ViU3RyZWFtRXJyb3IuYmluZCh0aGlzKSk6bmV3IG0uTnVsbFN0cmVhbSkpfWdldCB4ZmFEYXRhKCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsInhmYURhdGEiLHRoaXMueGZhRmFjdG9yeT97YmJveDp0aGlzLnhmYUZhY3RvcnkuZ2V0Qm91bmRpbmdCb3godGhpcy5wYWdlSW5kZXgpfTpudWxsKX1hc3luYyBzYXZlTmV3QW5ub3RhdGlvbnMoZSx0LHIsbil7aWYodGhpcy54ZmFGYWN0b3J5KXRocm93IG5ldyBFcnJvcigiWEZBOiBDYW5ub3Qgc2F2ZSBuZXcgYW5ub3RhdGlvbnMuIik7Y29uc3QgaT1uZXcgdy5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOmUscGFnZUluZGV4OnRoaXMucGFnZUluZGV4LGlkRmFjdG9yeTp0aGlzLl9sb2NhbElkRmFjdG9yeSxmb250Q2FjaGU6dGhpcy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTp0aGlzLnN5c3RlbUZvbnRDYWNoZSxvcHRpb25zOnRoaXMuZXZhbHVhdG9yT3B0aW9uc30pLHM9bmV3IGMuUmVmU2V0LGw9bmV3IGMuUmVmU2V0O28odGhpcyxPLEkpLmNhbGwodGhpcyxyLHMsbCk7Y29uc3QgaD10aGlzLnBhZ2VEaWN0LHU9dGhpcy5hbm5vdGF0aW9ucy5maWx0ZXIoKGU9PiEoZSBpbnN0YW5jZW9mIGMuUmVmJiZzLmhhcyhlKSkpKSxkPWF3YWl0IGEuQW5ub3RhdGlvbkZhY3Rvcnkuc2F2ZU5ld0Fubm90YXRpb25zKGksdCxyLG4pO2Zvcihjb25zdHtyZWY6ZX1vZiBkLmFubm90YXRpb25zKWUgaW5zdGFuY2VvZiBjLlJlZiYmIWwuaGFzKGUpJiZ1LnB1c2goZSk7Y29uc3QgZj1oLmdldCgiQW5ub3RzIik7aC5zZXQoIkFubm90cyIsdSk7Y29uc3QgZz1bXTtsZXQgcD1udWxsO3RoaXMueHJlZi5lbmNyeXB0JiYocD10aGlzLnhyZWYuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLHRoaXMucmVmLmdlbikpLGF3YWl0KDAsUy53cml0ZU9iamVjdCkodGhpcy5yZWYsaCxnLHApLGYmJmguc2V0KCJBbm5vdHMiLGYpO2NvbnN0IG09ZC5kZXBlbmRlbmNpZXM7cmV0dXJuIG0ucHVzaCh7cmVmOnRoaXMucmVmLGRhdGE6Zy5qb2luKCIiKX0sLi4uZC5hbm5vdGF0aW9ucyksbX1zYXZlKGUsdCxyKXtjb25zdCBhPW5ldyB3LlBhcnRpYWxFdmFsdWF0b3Ioe3hyZWY6dGhpcy54cmVmLGhhbmRsZXI6ZSxwYWdlSW5kZXg6dGhpcy5wYWdlSW5kZXgsaWRGYWN0b3J5OnRoaXMuX2xvY2FsSWRGYWN0b3J5LGZvbnRDYWNoZTp0aGlzLmZvbnRDYWNoZSxidWlsdEluQ01hcENhY2hlOnRoaXMuYnVpbHRJbkNNYXBDYWNoZSxzdGFuZGFyZEZvbnREYXRhQ2FjaGU6dGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsZ2xvYmFsSW1hZ2VDYWNoZTp0aGlzLmdsb2JhbEltYWdlQ2FjaGUsc3lzdGVtRm9udENhY2hlOnRoaXMuc3lzdGVtRm9udENhY2hlLG9wdGlvbnM6dGhpcy5ldmFsdWF0b3JPcHRpb25zfSk7cmV0dXJuIHRoaXMuX3BhcnNlZEFubm90YXRpb25zLnRoZW4oKGZ1bmN0aW9uKGUpe2NvbnN0IGk9W107Zm9yKGNvbnN0IHMgb2YgZSlzLm11c3RCZVByaW50ZWQocikmJmkucHVzaChzLnNhdmUoYSx0LHIpLmNhdGNoKChmdW5jdGlvbihlKXtyZXR1cm4oMCxuLndhcm4pKCdzYXZlIC0gaWdub3JpbmcgYW5ub3RhdGlvbiBkYXRhIGR1cmluZyAiJy5jb25jYXQodC5uYW1lLCciIHRhc2s6ICInKS5jb25jYXQoZSwnIi4nKSksbnVsbH0pKSk7cmV0dXJuIFByb21pc2UuYWxsKGkpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlLmZpbHRlcigoZT0+ISFlKSl9KSl9KSl9bG9hZFJlc291cmNlcyhlKXtyZXR1cm4gdGhpcy5yZXNvdXJjZXNQcm9taXNlfHwodGhpcy5yZXNvdXJjZXNQcm9taXNlPXRoaXMucGRmTWFuYWdlci5lbnN1cmUodGhpcywicmVzb3VyY2VzIikpLHRoaXMucmVzb3VyY2VzUHJvbWlzZS50aGVuKCgoKT0+bmV3IGIuT2JqZWN0TG9hZGVyKHRoaXMucmVzb3VyY2VzLGUsdGhpcy54cmVmKS5sb2FkKCkpKX1nZXRPcGVyYXRvckxpc3QoZSl7bGV0e2hhbmRsZXI6dCxzaW5rOnIsdGFzazpzLGludGVudDpsLGNhY2hlS2V5OmgsYW5ub3RhdGlvblN0b3JhZ2U6dT1udWxsfT1lO2NvbnN0IGQ9dGhpcy5nZXRDb250ZW50U3RyZWFtKCksZj10aGlzLmxvYWRSZXNvdXJjZXMoWyJDb2xvclNwYWNlIiwiRXh0R1N0YXRlIiwiRm9udCIsIlBhdHRlcm4iLCJQcm9wZXJ0aWVzIiwiU2hhZGluZyIsIlhPYmplY3QiXSksZz1uZXcgdy5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOnQscGFnZUluZGV4OnRoaXMucGFnZUluZGV4LGlkRmFjdG9yeTp0aGlzLl9sb2NhbElkRmFjdG9yeSxmb250Q2FjaGU6dGhpcy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTp0aGlzLnN5c3RlbUZvbnRDYWNoZSxvcHRpb25zOnRoaXMuZXZhbHVhdG9yT3B0aW9uc30pLHA9dGhpcy54ZmFGYWN0b3J5P251bGw6KDAsaS5nZXROZXdBbm5vdGF0aW9uc01hcCkodSk7bGV0IG09bnVsbCxiPVByb21pc2UucmVzb2x2ZShudWxsKTtpZihwKXtsZXQgZTtjb25zdCB0PXAuZ2V0KHRoaXMucGFnZUluZGV4KTtpZih0KXtjb25zdCByPW5ldyBTZXQ7Zm9yKGNvbnN0e2JpdG1hcElkOmUsYml0bWFwOm59b2YgdCkhZXx8bnx8ci5oYXMoZSl8fHIuYWRkKGUpO2NvbnN0e2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOml9PXRoaXMuZXZhbHVhdG9yT3B0aW9ucztpZihyLnNpemU+MCl7Y29uc3Qgcz10LnNsaWNlKCk7Zm9yKGNvbnN0W2UsdF1vZiB1KWUuc3RhcnRzV2l0aChuLkFubm90YXRpb25FZGl0b3JQcmVmaXgpJiZ0LmJpdG1hcCYmci5oYXModC5iaXRtYXBJZCkmJnMucHVzaCh0KTtlPWEuQW5ub3RhdGlvbkZhY3RvcnkuZ2VuZXJhdGVJbWFnZXMocyx0aGlzLnhyZWYsaSl9ZWxzZSBlPWEuQW5ub3RhdGlvbkZhY3RvcnkuZ2VuZXJhdGVJbWFnZXModCx0aGlzLnhyZWYsaSk7bT1uZXcgYy5SZWZTZXQsbyh0aGlzLE8sSSkuY2FsbCh0aGlzLHQsbSxudWxsKSxiPWEuQW5ub3RhdGlvbkZhY3RvcnkucHJpbnROZXdBbm5vdGF0aW9ucyhnLHMsdCxlKX19Y29uc3Qgdj1Qcm9taXNlLmFsbChbZCxmXSkudGhlbigoZT0+e2xldFtuXT1lO2NvbnN0IGE9bmV3IHkuT3BlcmF0b3JMaXN0KGwscik7cmV0dXJuIHQuc2VuZCgiU3RhcnRSZW5kZXJQYWdlIix7dHJhbnNwYXJlbmN5OmcuaGFzQmxlbmRNb2Rlcyh0aGlzLnJlc291cmNlcyx0aGlzLm5vbkJsZW5kTW9kZXNTZXQpLHBhZ2VJbmRleDp0aGlzLnBhZ2VJbmRleCxjYWNoZUtleTpofSksZy5nZXRPcGVyYXRvckxpc3Qoe3N0cmVhbTpuLHRhc2s6cyxyZXNvdXJjZXM6dGhpcy5yZXNvdXJjZXMsb3BlcmF0b3JMaXN0OmF9KS50aGVuKChmdW5jdGlvbigpe3JldHVybiBhfSkpfSkpO3JldHVybiBQcm9taXNlLmFsbChbdix0aGlzLl9wYXJzZWRBbm5vdGF0aW9ucyxiXSkudGhlbigoZnVuY3Rpb24oZSl7bGV0W3QscixhXT1lO2lmKGEpe3I9ci5maWx0ZXIoKGU9PiEoZS5yZWYmJm0uaGFzKGUucmVmKSkpKTtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDtlKyspe2NvbnN0IG49YVtlXTtpZihuLnJlZlRvUmVwbGFjZSl7Y29uc3QgaT1yLmZpbmRJbmRleCgoZT0+ZS5yZWYmJigwLGMuaXNSZWZzRXF1YWwpKGUucmVmLG4ucmVmVG9SZXBsYWNlKSkpO2k+PTAmJihyLnNwbGljZShpLDEsbiksYS5zcGxpY2UoZS0tLDEpLHQtLSl9fXI9ci5jb25jYXQoYSl9aWYoMD09PXIubGVuZ3RofHxsJm4uUmVuZGVyaW5nSW50ZW50RmxhZy5BTk5PVEFUSU9OU19ESVNBQkxFKXJldHVybiB0LmZsdXNoKCEwKSx7bGVuZ3RoOnQudG90YWxMZW5ndGh9O2NvbnN0IGk9ISEobCZuLlJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRk9STVMpLG89ISEobCZuLlJlbmRlcmluZ0ludGVudEZsYWcuQU5ZKSxoPSEhKGwmbi5SZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVkpLGQ9ISEobCZuLlJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQpLGY9W107Zm9yKGNvbnN0IGUgb2Ygcikob3x8aCYmZS5tdXN0QmVWaWV3ZWQodSl8fGQmJmUubXVzdEJlUHJpbnRlZCh1KSkmJmYucHVzaChlLmdldE9wZXJhdG9yTGlzdChnLHMsbCxpLHUpLmNhdGNoKChmdW5jdGlvbihlKXtyZXR1cm4oMCxuLndhcm4pKCdnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICInLmNvbmNhdChzLm5hbWUsJyIgdGFzazogIicpLmNvbmNhdChlLCciLicpKSx7b3BMaXN0Om51bGwsc2VwYXJhdGVGb3JtOiExLHNlcGFyYXRlQ2FudmFzOiExfX0pKSk7cmV0dXJuIFByb21pc2UuYWxsKGYpLnRoZW4oKGZ1bmN0aW9uKGUpe2xldCByPSExLG49ITE7Zm9yKGNvbnN0e29wTGlzdDphLHNlcGFyYXRlRm9ybTppLHNlcGFyYXRlQ2FudmFzOnN9b2YgZSl0LmFkZE9wTGlzdChhKSxyfHwocj1pKSxufHwobj1zKTtyZXR1cm4gdC5mbHVzaCghMCx7Zm9ybTpyLGNhbnZhczpufSkse2xlbmd0aDp0LnRvdGFsTGVuZ3RofX0pKX0pKX1leHRyYWN0VGV4dENvbnRlbnQoZSl7bGV0e2hhbmRsZXI6dCx0YXNrOnIsaW5jbHVkZU1hcmtlZENvbnRlbnQ6bixkaXNhYmxlTm9ybWFsaXphdGlvbjphLHNpbms6aX09ZTtjb25zdCBzPXRoaXMuZ2V0Q29udGVudFN0cmVhbSgpLG89dGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwiRm9udCIsIlByb3BlcnRpZXMiLCJYT2JqZWN0Il0pO3JldHVybiBQcm9taXNlLmFsbChbcyxvXSkudGhlbigoZT0+e2xldFtzXT1lO3JldHVybiBuZXcgdy5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOnQscGFnZUluZGV4OnRoaXMucGFnZUluZGV4LGlkRmFjdG9yeTp0aGlzLl9sb2NhbElkRmFjdG9yeSxmb250Q2FjaGU6dGhpcy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTp0aGlzLnN5c3RlbUZvbnRDYWNoZSxvcHRpb25zOnRoaXMuZXZhbHVhdG9yT3B0aW9uc30pLmdldFRleHRDb250ZW50KHtzdHJlYW06cyx0YXNrOnIscmVzb3VyY2VzOnRoaXMucmVzb3VyY2VzLGluY2x1ZGVNYXJrZWRDb250ZW50Om4sZGlzYWJsZU5vcm1hbGl6YXRpb246YSxzaW5rOmksdmlld0JveDp0aGlzLnZpZXd9KX0pKX1hc3luYyBnZXRTdHJ1Y3RUcmVlKCl7Y29uc3QgZT1hd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygic3RydWN0VHJlZVJvb3QiKTtyZXR1cm4gZT8oYXdhaXQgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCJfcGFyc2VTdHJ1Y3RUcmVlIixbZV0pKS5zZXJpYWxpemFibGU6bnVsbH1fcGFyc2VTdHJ1Y3RUcmVlKGUpe2NvbnN0IHQ9bmV3IHguU3RydWN0VHJlZVBhZ2UoZSx0aGlzLnBhZ2VEaWN0KTtyZXR1cm4gdC5wYXJzZSgpLHR9YXN5bmMgZ2V0QW5ub3RhdGlvbnNEYXRhKGUsdCxyKXtjb25zdCBhPWF3YWl0IHRoaXMuX3BhcnNlZEFubm90YXRpb25zO2lmKDA9PT1hLmxlbmd0aClyZXR1cm5bXTtjb25zdCBpPVtdLHM9W107bGV0IG87Y29uc3QgYz0hIShyJm4uUmVuZGVyaW5nSW50ZW50RmxhZy5BTlkpLGw9ISEociZuLlJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSksaD0hIShyJm4uUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCk7Zm9yKGNvbnN0IHIgb2YgYSl7Y29uc3QgYT1jfHxsJiZyLnZpZXdhYmxlOyhhfHxoJiZyLnByaW50YWJsZSkmJmkucHVzaChyLmRhdGEpLHIuaGFzVGV4dENvbnRlbnQmJmEmJihvfHwobz1uZXcgdy5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOmUscGFnZUluZGV4OnRoaXMucGFnZUluZGV4LGlkRmFjdG9yeTp0aGlzLl9sb2NhbElkRmFjdG9yeSxmb250Q2FjaGU6dGhpcy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTp0aGlzLnN5c3RlbUZvbnRDYWNoZSxvcHRpb25zOnRoaXMuZXZhbHVhdG9yT3B0aW9uc30pKSxzLnB1c2goci5leHRyYWN0VGV4dENvbnRlbnQobyx0LFstMS8wLC0xLzAsMS8wLDEvMF0pLmNhdGNoKChmdW5jdGlvbihlKXsoMCxuLndhcm4pKCdnZXRBbm5vdGF0aW9uc0RhdGEgLSBpZ25vcmluZyB0ZXh0Q29udGVudCBkdXJpbmcgIicuY29uY2F0KHQubmFtZSwnIiB0YXNrOiAiJykuY29uY2F0KGUsJyIuJykpfSkpKSl9cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHMpLGl9Z2V0IGFubm90YXRpb25zKCl7Y29uc3QgZT10aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KCJBbm5vdHMiKTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiYW5ub3RhdGlvbnMiLEFycmF5LmlzQXJyYXkoZSk/ZTpbXSl9Z2V0IF9wYXJzZWRBbm5vdGF0aW9ucygpe2NvbnN0IGU9dGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCJhbm5vdGF0aW9ucyIpLnRoZW4oKCgpPT57Y29uc3QgZT1bXTtmb3IoY29uc3QgdCBvZiB0aGlzLmFubm90YXRpb25zKWUucHVzaChhLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh0aGlzLnhyZWYsdCx0aGlzLnBkZk1hbmFnZXIsdGhpcy5fbG9jYWxJZEZhY3RvcnksITEpLmNhdGNoKChmdW5jdGlvbihlKXtyZXR1cm4oMCxuLndhcm4pKCdfcGFyc2VkQW5ub3RhdGlvbnM6ICInLmNvbmNhdChlLCciLicpKSxudWxsfSkpKTtyZXR1cm4gUHJvbWlzZS5hbGwoZSkudGhlbigoZnVuY3Rpb24oZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiBlO2NvbnN0IHQ9W107bGV0IHI7Zm9yKGNvbnN0IG4gb2YgZSluJiYobiBpbnN0YW5jZW9mIGEuUG9wdXBBbm5vdGF0aW9uPyhyfHwocj1bXSkpLnB1c2gobik6dC5wdXNoKG4pKTtyZXR1cm4gciYmdC5wdXNoKC4uLnIpLHR9KSl9KSk7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIl9wYXJzZWRBbm5vdGF0aW9ucyIsZSl9Z2V0IGpzQWN0aW9ucygpe2NvbnN0IGU9KDAsaS5jb2xsZWN0QWN0aW9ucykodGhpcy54cmVmLHRoaXMucGFnZURpY3Qsbi5QYWdlQWN0aW9uRXZlbnRUeXBlKTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywianNBY3Rpb25zIixlKX19ZnVuY3Rpb24gSShlLHQscil7Zm9yKGNvbnN0IGEgb2YgZSlpZihhLmlkKXtjb25zdCBlPWMuUmVmLmZyb21TdHJpbmcoYS5pZCk7aWYoIWUpeygwLG4ud2FybikoIkEgbm9uLWxpbmtlZCBhbm5vdGF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZDogIi5jb25jYXQoYS5pZCkpO2NvbnRpbnVlfWlmKGEuZGVsZXRlZCl7dC5wdXQoZSk7Y29udGludWV9bnVsbD09cnx8ci5wdXQoZSksYS5yZWY9ZSxkZWxldGUgYS5pZH19dC5QYWdlPUY7Y29uc3QgVD1uZXcgVWludDhBcnJheShbMzcsODAsNjgsNzAsNDVdKSxNPW5ldyBVaW50OEFycmF5KFsxMTUsMTE2LDk3LDExNCwxMTYsMTIwLDExNCwxMDEsMTAyXSksRT1uZXcgVWludDhBcnJheShbMTAxLDExMCwxMDAsMTExLDk4LDEwNl0pO2Z1bmN0aW9uIFAoZSx0KXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MTAyNCxuPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM107Y29uc3QgYT10Lmxlbmd0aCxpPWUucGVla0J5dGVzKHIpLHM9aS5sZW5ndGgtYTtpZihzPD0wKXJldHVybiExO2lmKG4pe2NvbnN0IHI9YS0xO2xldCBuPWkubGVuZ3RoLTE7Zm9yKDtuPj1yOyl7bGV0IHM9MDtmb3IoO3M8YSYmaVtuLXNdPT09dFtyLXNdOylzKys7aWYocz49YSlyZXR1cm4gZS5wb3MrPW4tciwhMDtuLS19fWVsc2V7bGV0IHI9MDtmb3IoO3I8PXM7KXtsZXQgbj0wO2Zvcig7bjxhJiZpW3Irbl09PT10W25dOyluKys7aWYobj49YSlyZXR1cm4gZS5wb3MrPXIsITA7cisrfX1yZXR1cm4hMX10LlBERkRvY3VtZW50PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7aWYodC5sZW5ndGg8PTApdGhyb3cgbmV3IG4uSW52YWxpZFBERkV4Y2VwdGlvbigiVGhlIFBERiBmaWxlIGlzIGVtcHR5LCBpLmUuIGl0cyBzaXplIGlzIHplcm8gYnl0ZXMuIik7dGhpcy5wZGZNYW5hZ2VyPWUsdGhpcy5zdHJlYW09dCx0aGlzLnhyZWY9bmV3IGsuWFJlZih0LGUpLHRoaXMuX3BhZ2VQcm9taXNlcz1uZXcgTWFwLHRoaXMuX3ZlcnNpb249bnVsbDtjb25zdCByPXtmb250OjB9O3RoaXMuX2dsb2JhbElkRmFjdG9yeT1jbGFzc3tzdGF0aWMgZ2V0RG9jSWQoKXtyZXR1cm4iZ18iLmNvbmNhdChlLmRvY0lkKX1zdGF0aWMgY3JlYXRlRm9udElkKCl7cmV0dXJuImYiKyArK3IuZm9udH1zdGF0aWMgY3JlYXRlT2JqSWQoKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBjcmVhdGVPYmpJZGAgY2FsbGVkLiIpfXN0YXRpYyBnZXRQYWdlT2JqSWQoKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBnZXRQYWdlT2JqSWRgIGNhbGxlZC4iKX19fXBhcnNlKGUpe3RoaXMueHJlZi5wYXJzZShlKSx0aGlzLmNhdGFsb2c9bmV3IGQuQ2F0YWxvZyh0aGlzLnBkZk1hbmFnZXIsdGhpcy54cmVmKX1nZXQgbGluZWFyaXphdGlvbigpe2xldCBlPW51bGw7dHJ5e2U9cC5MaW5lYXJpemF0aW9uLmNyZWF0ZSh0aGlzLnN0cmVhbSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGkuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxuLmluZm8pKGUpfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJsaW5lYXJpemF0aW9uIixlKX1nZXQgc3RhcnRYUmVmKCl7Y29uc3QgZT10aGlzLnN0cmVhbTtsZXQgdD0wO2lmKHRoaXMubGluZWFyaXphdGlvbillLnJlc2V0KCksUChlLEUpJiYodD1lLnBvcys2LWUuc3RhcnQpO2Vsc2V7Y29uc3Qgcj0xMDI0LG49TS5sZW5ndGg7bGV0IGE9ITEscz1lLmVuZDtmb3IoOyFhJiZzPjA7KXMtPXItbixzPDAmJihzPTApLGUucG9zPXMsYT1QKGUsTSxyLCEwKTtpZihhKXtsZXQgcjtlLnNraXAoOSk7ZG97cj1lLmdldEJ5dGUoKX13aGlsZSgoMCxpLmlzV2hpdGVTcGFjZSkocikpO2xldCBuPSIiO2Zvcig7cj49MzImJnI8PTU3OyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHIpLHI9ZS5nZXRCeXRlKCk7dD1wYXJzZUludChuLDEwKSxpc05hTih0KSYmKHQ9MCl9fXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJzdGFydFhSZWYiLHQpfWNoZWNrSGVhZGVyKCl7Y29uc3QgZT10aGlzLnN0cmVhbTtpZihlLnJlc2V0KCksIVAoZSxUKSlyZXR1cm47ZS5tb3ZlU3RhcnQoKSxlLnNraXAoVC5sZW5ndGgpO2xldCB0LHI9IiI7Zm9yKDsodD1lLmdldEJ5dGUoKSk+MzImJnIubGVuZ3RoPDc7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUodCk7aS5QREZfVkVSU0lPTl9SRUdFWFAudGVzdChyKT90aGlzLl92ZXJzaW9uPXI6KDAsbi53YXJuKSgiSW52YWxpZCBQREYgaGVhZGVyIHZlcnNpb246ICIuY29uY2F0KHIpKX1wYXJzZVN0YXJ0WFJlZigpe3RoaXMueHJlZi5zZXRTdGFydFhSZWYodGhpcy5zdGFydFhSZWYpfWdldCBudW1QYWdlcygpe2xldCBlPTA7cmV0dXJuIGU9dGhpcy5jYXRhbG9nLmhhc0FjdHVhbE51bVBhZ2VzP3RoaXMuY2F0YWxvZy5udW1QYWdlczp0aGlzLnhmYUZhY3Rvcnk/dGhpcy54ZmFGYWN0b3J5LmdldE51bVBhZ2VzKCk6dGhpcy5saW5lYXJpemF0aW9uP3RoaXMubGluZWFyaXphdGlvbi5udW1QYWdlczp0aGlzLmNhdGFsb2cubnVtUGFnZXMsKDAsbi5zaGFkb3cpKHRoaXMsIm51bVBhZ2VzIixlKX1faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtyZXR1cm4hIUFycmF5LmlzQXJyYXkoZSkmJmUuZXZlcnkoKGU9PntpZighKChlPXRoaXMueHJlZi5mZXRjaElmUmVmKGUpKWluc3RhbmNlb2YgYy5EaWN0KSlyZXR1cm4hMTtpZihlLmhhcygiS2lkcyIpKXJldHVybisrdD4xMD8oKDAsbi53YXJuKSgiX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXM6IG1heGltdW0gcmVjdXJzaW9uIGRlcHRoIHJlYWNoZWQiKSwhMSk6dGhpcy5faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhlLmdldCgiS2lkcyIpLHQpO2NvbnN0IHI9KDAsYy5pc05hbWUpKGUuZ2V0KCJGVCIpLCJTaWciKSxhPWUuZ2V0KCJSZWN0IiksaT1BcnJheS5pc0FycmF5KGEpJiZhLmV2ZXJ5KChlPT4wPT09ZSkpO3JldHVybiByJiZpfSkpfWdldCBfeGZhU3RyZWFtcygpe2NvbnN0IGU9dGhpcy5jYXRhbG9nLmFjcm9Gb3JtO2lmKCFlKXJldHVybiBudWxsO2NvbnN0IHQ9ZS5nZXQoIlhGQSIpLHI9eyJ4ZHA6eGRwIjoiIix0ZW1wbGF0ZToiIixkYXRhc2V0czoiIixjb25maWc6IiIsY29ubmVjdGlvblNldDoiIixsb2NhbGVTZXQ6IiIsc3R5bGVzaGVldDoiIiwiL3hkcDp4ZHAiOiIifTtpZih0IGluc3RhbmNlb2YgaC5CYXNlU3RyZWFtJiYhdC5pc0VtcHR5KXJldHVybiByWyJ4ZHA6eGRwIl09dCxyO2lmKCFBcnJheS5pc0FycmF5KHQpfHwwPT09dC5sZW5ndGgpcmV0dXJuIG51bGw7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSs9Mil7bGV0IGE7aWYoYT0wPT09ZT8ieGRwOnhkcCI6ZT09PW4tMj8iL3hkcDp4ZHAiOnRbZV0sIXIuaGFzT3duUHJvcGVydHkoYSkpY29udGludWU7Y29uc3QgaT10aGlzLnhyZWYuZmV0Y2hJZlJlZih0W2UrMV0pO2kgaW5zdGFuY2VvZiBoLkJhc2VTdHJlYW0mJiFpLmlzRW1wdHkmJihyW2FdPWkpfXJldHVybiByfWdldCB4ZmFEYXRhc2V0cygpe2NvbnN0IGU9dGhpcy5feGZhU3RyZWFtcztpZighZSlyZXR1cm4oMCxuLnNoYWRvdykodGhpcywieGZhRGF0YXNldHMiLG51bGwpO2Zvcihjb25zdCB0IG9mWyJkYXRhc2V0cyIsInhkcDp4ZHAiXSl7Y29uc3Qgcj1lW3RdO2lmKHIpdHJ5e2NvbnN0IGU9e1t0XTooMCxuLnN0cmluZ1RvVVRGOFN0cmluZykoci5nZXRTdHJpbmcoKSl9O3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJ4ZmFEYXRhc2V0cyIsbmV3IGcuRGF0YXNldFJlYWRlcihlKSl9Y2F0Y2goZSl7KDAsbi53YXJuKSgiWEZBIC0gSW52YWxpZCB1dGYtOCBzdHJpbmcuIik7YnJlYWt9fXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJ4ZmFEYXRhc2V0cyIsbnVsbCl9Z2V0IHhmYURhdGEoKXtjb25zdCBlPXRoaXMuX3hmYVN0cmVhbXM7aWYoIWUpcmV0dXJuIG51bGw7Y29uc3QgdD1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdFtyLGFdb2YgT2JqZWN0LmVudHJpZXMoZSkpaWYoYSl0cnl7dFtyXT0oMCxuLnN0cmluZ1RvVVRGOFN0cmluZykoYS5nZXRTdHJpbmcoKSl9Y2F0Y2goZSl7cmV0dXJuKDAsbi53YXJuKSgiWEZBIC0gSW52YWxpZCB1dGYtOCBzdHJpbmcuIiksbnVsbH1yZXR1cm4gdH1nZXQgeGZhRmFjdG9yeSgpe2xldCBlO3JldHVybiB0aGlzLnBkZk1hbmFnZXIuZW5hYmxlWGZhJiZ0aGlzLmNhdGFsb2cubmVlZHNSZW5kZXJpbmcmJnRoaXMuZm9ybUluZm8uaGFzWGZhJiYhdGhpcy5mb3JtSW5mby5oYXNBY3JvRm9ybSYmKGU9dGhpcy54ZmFEYXRhKSwoMCxuLnNoYWRvdykodGhpcywieGZhRmFjdG9yeSIsZT9uZXcgQS5YRkFGYWN0b3J5KGUpOm51bGwpfWdldCBpc1B1cmVYZmEoKXtyZXR1cm4hIXRoaXMueGZhRmFjdG9yeSYmdGhpcy54ZmFGYWN0b3J5LmlzVmFsaWQoKX1nZXQgaHRtbEZvclhmYSgpe3JldHVybiB0aGlzLnhmYUZhY3Rvcnk/dGhpcy54ZmFGYWN0b3J5LmdldFBhZ2VzKCk6bnVsbH1hc3luYyBsb2FkWGZhSW1hZ2VzKCl7Y29uc3QgZT1hd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygieGZhSW1hZ2VzIik7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9ZS5nZXRLZXlzKCkscj1uZXcgYi5PYmplY3RMb2FkZXIoZSx0LHRoaXMueHJlZik7YXdhaXQgci5sb2FkKCk7Y29uc3Qgbj1uZXcgTWFwO2Zvcihjb25zdCByIG9mIHQpe2NvbnN0IHQ9ZS5nZXQocik7dCBpbnN0YW5jZW9mIGguQmFzZVN0cmVhbSYmbi5zZXQocix0LmdldEJ5dGVzKCkpfXRoaXMueGZhRmFjdG9yeS5zZXRJbWFnZXMobil9YXN5bmMgbG9hZFhmYUZvbnRzKGUsdCl7Y29uc3Qgcj1hd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYWNyb0Zvcm0iKTtpZighcilyZXR1cm47Y29uc3QgYT1hd2FpdCByLmdldEFzeW5jKCJEUiIpO2lmKCEoYSBpbnN0YW5jZW9mIGMuRGljdCkpcmV0dXJuO2NvbnN0IHM9bmV3IGIuT2JqZWN0TG9hZGVyKGEsWyJGb250Il0sdGhpcy54cmVmKTthd2FpdCBzLmxvYWQoKTtjb25zdCBvPWEuZ2V0KCJGb250Iik7aWYoIShvIGluc3RhbmNlb2YgYy5EaWN0KSlyZXR1cm47Y29uc3QgaD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5wZGZNYW5hZ2VyLmV2YWx1YXRvck9wdGlvbnMpO2gudXNlU3lzdGVtRm9udHM9ITE7Y29uc3QgdT1uZXcgdy5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOmUscGFnZUluZGV4Oi0xLGlkRmFjdG9yeTp0aGlzLl9nbG9iYWxJZEZhY3RvcnksZm9udENhY2hlOnRoaXMuY2F0YWxvZy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmNhdGFsb2cuYnVpbHRJbkNNYXBDYWNoZSxzdGFuZGFyZEZvbnREYXRhQ2FjaGU6dGhpcy5jYXRhbG9nLnN0YW5kYXJkRm9udERhdGFDYWNoZSxvcHRpb25zOmh9KSxkPW5ldyB5Lk9wZXJhdG9yTGlzdCxmPVtdLGc9e2dldCBmb250KCl7cmV0dXJuIGYuYXQoLTEpfSxzZXQgZm9udChlKXtmLnB1c2goZSl9LGNsb25lKCl7cmV0dXJuIHRoaXN9fSxwPW5ldyBNYXA7by5mb3JFYWNoKCgoZSx0KT0+e3Auc2V0KGUsdCl9KSk7Y29uc3QgbT1bXTtmb3IoY29uc3RbZSxyXW9mIHApe2NvbnN0IHM9ci5nZXQoIkZvbnREZXNjcmlwdG9yIik7aWYoIShzIGluc3RhbmNlb2YgYy5EaWN0KSljb250aW51ZTtsZXQgbz1zLmdldCgiRm9udEZhbWlseSIpO289by5yZXBsYWNlQWxsKC9bIF0rKFxkKS9nLCIkMSIpO2NvbnN0IGw9e2ZvbnRGYW1pbHk6byxmb250V2VpZ2h0OnMuZ2V0KCJGb250V2VpZ2h0IiksaXRhbGljQW5nbGU6LXMuZ2V0KCJJdGFsaWNBbmdsZSIpfTsoMCxpLnZhbGlkYXRlQ1NTRm9udCkobCkmJm0ucHVzaCh1LmhhbmRsZVNldEZvbnQoYSxbYy5OYW1lLmdldChlKSwxXSxudWxsLGQsdCxnLG51bGwsbCkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybigwLG4ud2FybikoJ2xvYWRYZmFGb250czogIicuY29uY2F0KGUsJyIuJykpLG51bGx9KSkpfWF3YWl0IFByb21pc2UuYWxsKG0pO2NvbnN0IHY9dGhpcy54ZmFGYWN0b3J5LnNldEZvbnRzKGYpO2lmKCF2KXJldHVybjtoLmlnbm9yZUVycm9ycz0hMCxtLmxlbmd0aD0wLGYubGVuZ3RoPTA7Y29uc3QgeD1uZXcgU2V0O2Zvcihjb25zdCBlIG9mIHYpKDAsbC5nZXRYZmFGb250TmFtZSkoIiIuY29uY2F0KGUsIi1SZWd1bGFyIikpfHx4LmFkZChlKTt4LnNpemUmJnYucHVzaCgiUGRmSlMtRmFsbGJhY2siKTtmb3IoY29uc3QgZSBvZiB2KWlmKCF4LmhhcyhlKSlmb3IoY29uc3QgciBvZlt7bmFtZToiUmVndWxhciIsZm9udFdlaWdodDo0MDAsaXRhbGljQW5nbGU6MH0se25hbWU6IkJvbGQiLGZvbnRXZWlnaHQ6NzAwLGl0YWxpY0FuZ2xlOjB9LHtuYW1lOiJJdGFsaWMiLGZvbnRXZWlnaHQ6NDAwLGl0YWxpY0FuZ2xlOjEyfSx7bmFtZToiQm9sZEl0YWxpYyIsZm9udFdlaWdodDo3MDAsaXRhbGljQW5nbGU6MTJ9XSl7Y29uc3QgaT0iIi5jb25jYXQoZSwiLSIpLmNvbmNhdChyLm5hbWUpLHM9KDAsbC5nZXRYZmFGb250RGljdCkoaSk7bS5wdXNoKHUuaGFuZGxlU2V0Rm9udChhLFtjLk5hbWUuZ2V0KGkpLDFdLG51bGwsZCx0LGcscyx7Zm9udEZhbWlseTplLGZvbnRXZWlnaHQ6ci5mb250V2VpZ2h0LGl0YWxpY0FuZ2xlOnIuaXRhbGljQW5nbGV9KS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuKDAsbi53YXJuKSgnbG9hZFhmYUZvbnRzOiAiJy5jb25jYXQoZSwnIi4nKSksbnVsbH0pKSl9YXdhaXQgUHJvbWlzZS5hbGwobSksdGhpcy54ZmFGYWN0b3J5LmFwcGVuZEZvbnRzKGYseCl9YXN5bmMgc2VyaWFsaXplWGZhRGF0YShlKXtyZXR1cm4gdGhpcy54ZmFGYWN0b3J5P3RoaXMueGZhRmFjdG9yeS5zZXJpYWxpemVEYXRhKGUpOm51bGx9Z2V0IHZlcnNpb24oKXtyZXR1cm4gdGhpcy5jYXRhbG9nLnZlcnNpb258fHRoaXMuX3ZlcnNpb259Z2V0IGZvcm1JbmZvKCl7Y29uc3QgZT17aGFzRmllbGRzOiExLGhhc0Fjcm9Gb3JtOiExLGhhc1hmYTohMSxoYXNTaWduYXR1cmVzOiExfSx0PXRoaXMuY2F0YWxvZy5hY3JvRm9ybTtpZighdClyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiZm9ybUluZm8iLGUpO3RyeXtjb25zdCByPXQuZ2V0KCJGaWVsZHMiKSxuPUFycmF5LmlzQXJyYXkocikmJnIubGVuZ3RoPjA7ZS5oYXNGaWVsZHM9bjtjb25zdCBhPXQuZ2V0KCJYRkEiKTtlLmhhc1hmYT1BcnJheS5pc0FycmF5KGEpJiZhLmxlbmd0aD4wfHxhIGluc3RhbmNlb2YgaC5CYXNlU3RyZWFtJiYhYS5pc0VtcHR5O2NvbnN0IGk9ISEoMSZ0LmdldCgiU2lnRmxhZ3MiKSkscz1pJiZ0aGlzLl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKHIpO2UuaGFzQWNyb0Zvcm09biYmIXMsZS5oYXNTaWduYXR1cmVzPWl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGkuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxuLndhcm4pKCdDYW5ub3QgZmV0Y2ggZm9ybSBpbmZvcm1hdGlvbjogIicuY29uY2F0KGUsJyIuJykpfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJmb3JtSW5mbyIsZSl9Z2V0IGRvY3VtZW50SW5mbygpe2NvbnN0IGU9e1BERkZvcm1hdFZlcnNpb246dGhpcy52ZXJzaW9uLExhbmd1YWdlOnRoaXMuY2F0YWxvZy5sYW5nLEVuY3J5cHRGaWx0ZXJOYW1lOnRoaXMueHJlZi5lbmNyeXB0P3RoaXMueHJlZi5lbmNyeXB0LmZpbHRlck5hbWU6bnVsbCxJc0xpbmVhcml6ZWQ6ISF0aGlzLmxpbmVhcml6YXRpb24sSXNBY3JvRm9ybVByZXNlbnQ6dGhpcy5mb3JtSW5mby5oYXNBY3JvRm9ybSxJc1hGQVByZXNlbnQ6dGhpcy5mb3JtSW5mby5oYXNYZmEsSXNDb2xsZWN0aW9uUHJlc2VudDohIXRoaXMuY2F0YWxvZy5jb2xsZWN0aW9uLElzU2lnbmF0dXJlc1ByZXNlbnQ6dGhpcy5mb3JtSW5mby5oYXNTaWduYXR1cmVzfTtsZXQgdDt0cnl7dD10aGlzLnhyZWYudHJhaWxlci5nZXQoIkluZm8iKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgaS5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLG4uaW5mbykoIlRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIil9aWYoISh0IGluc3RhbmNlb2YgYy5EaWN0KSlyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiZG9jdW1lbnRJbmZvIixlKTtmb3IoY29uc3QgciBvZiB0LmdldEtleXMoKSl7Y29uc3QgYT10LmdldChyKTtzd2l0Y2gocil7Y2FzZSJUaXRsZSI6Y2FzZSJBdXRob3IiOmNhc2UiU3ViamVjdCI6Y2FzZSJLZXl3b3JkcyI6Y2FzZSJDcmVhdG9yIjpjYXNlIlByb2R1Y2VyIjpjYXNlIkNyZWF0aW9uRGF0ZSI6Y2FzZSJNb2REYXRlIjppZigic3RyaW5nIj09dHlwZW9mIGEpe2Vbcl09KDAsbi5zdHJpbmdUb1BERlN0cmluZykoYSk7Y29udGludWV9YnJlYWs7Y2FzZSJUcmFwcGVkIjppZihhIGluc3RhbmNlb2YgYy5OYW1lKXtlW3JdPWE7Y29udGludWV9YnJlYWs7ZGVmYXVsdDpsZXQgdDtzd2l0Y2godHlwZW9mIGEpe2Nhc2Uic3RyaW5nIjp0PSgwLG4uc3RyaW5nVG9QREZTdHJpbmcpKGEpO2JyZWFrO2Nhc2UibnVtYmVyIjpjYXNlImJvb2xlYW4iOnQ9YTticmVhaztkZWZhdWx0OmEgaW5zdGFuY2VvZiBjLk5hbWUmJih0PWEpfWlmKHZvaWQgMD09PXQpeygwLG4ud2FybikoJ0JhZCB2YWx1ZSwgZm9yIGN1c3RvbSBrZXkgIicuY29uY2F0KHIsJyIsIGluIEluZm86ICcpLmNvbmNhdChhLCIuIikpO2NvbnRpbnVlfWUuQ3VzdG9tfHwoZS5DdXN0b209T2JqZWN0LmNyZWF0ZShudWxsKSksZS5DdXN0b21bcl09dDtjb250aW51ZX0oMCxuLndhcm4pKCdCYWQgdmFsdWUsIGZvciBrZXkgIicuY29uY2F0KHIsJyIsIGluIEluZm86ICcpLmNvbmNhdChhLCIuIikpfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJkb2N1bWVudEluZm8iLGUpfWdldCBmaW5nZXJwcmludHMoKXtmdW5jdGlvbiBlKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmZS5sZW5ndGg+MCYmIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIiE9PWV9ZnVuY3Rpb24gdChlKXtjb25zdCB0PVtdO2Zvcihjb25zdCByIG9mIGUpe2NvbnN0IGU9ci50b1N0cmluZygxNik7dC5wdXNoKGUucGFkU3RhcnQoMiwiMCIpKX1yZXR1cm4gdC5qb2luKCIiKX1jb25zdCByPXRoaXMueHJlZi50cmFpbGVyLmdldCgiSUQiKTtsZXQgYSxpO3JldHVybiBBcnJheS5pc0FycmF5KHIpJiZlKHJbMF0pPyhhPSgwLG4uc3RyaW5nVG9CeXRlcykoclswXSksclsxXSE9PXJbMF0mJmUoclsxXSkmJihpPSgwLG4uc3RyaW5nVG9CeXRlcykoclsxXSkpKTphPSgwLHUuY2FsY3VsYXRlTUQ1KSh0aGlzLnN0cmVhbS5nZXRCeXRlUmFuZ2UoMCwxMDI0KSwwLDEwMjQpLCgwLG4uc2hhZG93KSh0aGlzLCJmaW5nZXJwcmludHMiLFt0KGEpLGk/dChpKTpudWxsXSl9YXN5bmMgX2dldExpbmVhcml6YXRpb25QYWdlKGUpe2NvbnN0e2NhdGFsb2c6dCxsaW5lYXJpemF0aW9uOnIseHJlZjphfT10aGlzLGk9Yy5SZWYuZ2V0KHIub2JqZWN0TnVtYmVyRmlyc3QsMCk7dHJ5e2NvbnN0IGU9YXdhaXQgYS5mZXRjaEFzeW5jKGkpO2lmKGUgaW5zdGFuY2VvZiBjLkRpY3Qpe2xldCByPWUuZ2V0UmF3KCJUeXBlIik7aWYociBpbnN0YW5jZW9mIGMuUmVmJiYocj1hd2FpdCBhLmZldGNoQXN5bmMocikpLCgwLGMuaXNOYW1lKShyLCJQYWdlIil8fCFlLmhhcygiVHlwZSIpJiYhZS5oYXMoIktpZHMiKSlyZXR1cm4gdC5wYWdlS2lkc0NvdW50Q2FjaGUuaGFzKGkpfHx0LnBhZ2VLaWRzQ291bnRDYWNoZS5wdXQoaSwxKSx0LnBhZ2VJbmRleENhY2hlLmhhcyhpKXx8dC5wYWdlSW5kZXhDYWNoZS5wdXQoaSwwKSxbZSxpXX10aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiVGhlIExpbmVhcml6YXRpb24gZGljdGlvbmFyeSBkb2Vzbid0IHBvaW50IHRvIGEgdmFsaWQgUGFnZSBkaWN0aW9uYXJ5LiIpfWNhdGNoKHIpe3JldHVybigwLG4ud2FybikoJ19nZXRMaW5lYXJpemF0aW9uUGFnZTogIicuY29uY2F0KHIubWVzc2FnZSwnIi4nKSksdC5nZXRQYWdlRGljdChlKX19Z2V0UGFnZShlKXtjb25zdCB0PXRoaXMuX3BhZ2VQcm9taXNlcy5nZXQoZSk7aWYodClyZXR1cm4gdDtjb25zdHtjYXRhbG9nOnIsbGluZWFyaXphdGlvbjpuLHhmYUZhY3Rvcnk6YX09dGhpcztsZXQgaTtyZXR1cm4gaT1hP1Byb21pc2UucmVzb2x2ZShbYy5EaWN0LmVtcHR5LG51bGxdKToobnVsbD09bj92b2lkIDA6bi5wYWdlRmlyc3QpPT09ZT90aGlzLl9nZXRMaW5lYXJpemF0aW9uUGFnZShlKTpyLmdldFBhZ2VEaWN0KGUpLGk9aS50aGVuKCh0PT57bGV0W24saV09dDtyZXR1cm4gbmV3IEYoe3BkZk1hbmFnZXI6dGhpcy5wZGZNYW5hZ2VyLHhyZWY6dGhpcy54cmVmLHBhZ2VJbmRleDplLHBhZ2VEaWN0Om4scmVmOmksZ2xvYmFsSWRGYWN0b3J5OnRoaXMuX2dsb2JhbElkRmFjdG9yeSxmb250Q2FjaGU6ci5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTpyLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnIuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6ci5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTpyLnN5c3RlbUZvbnRDYWNoZSxub25CbGVuZE1vZGVzU2V0OnIubm9uQmxlbmRNb2Rlc1NldCx4ZmFGYWN0b3J5OmF9KX0pKSx0aGlzLl9wYWdlUHJvbWlzZXMuc2V0KGUsaSksaX1hc3luYyBjaGVja0ZpcnN0UGFnZSgpe2lmKCEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXSkpdHJ5e2F3YWl0IHRoaXMuZ2V0UGFnZSgwKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgaS5YUmVmRW50cnlFeGNlcHRpb24pdGhyb3cgdGhpcy5fcGFnZVByb21pc2VzLmRlbGV0ZSgwKSxhd2FpdCB0aGlzLmNsZWFudXAoKSxuZXcgaS5YUmVmUGFyc2VFeGNlcHRpb259fWFzeW5jIGNoZWNrTGFzdFBhZ2UoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2NvbnN0e2NhdGFsb2c6dCxwZGZNYW5hZ2VyOnJ9PXRoaXM7bGV0IGE7dC5zZXRBY3R1YWxOdW1QYWdlcygpO3RyeXtpZihhd2FpdCBQcm9taXNlLmFsbChbci5lbnN1cmVEb2MoInhmYUZhY3RvcnkiKSxyLmVuc3VyZURvYygibGluZWFyaXphdGlvbiIpLHIuZW5zdXJlQ2F0YWxvZygibnVtUGFnZXMiKV0pLHRoaXMueGZhRmFjdG9yeSlyZXR1cm47aWYoYT10aGlzLmxpbmVhcml6YXRpb24/dGhpcy5saW5lYXJpemF0aW9uLm51bVBhZ2VzOnQubnVtUGFnZXMsIU51bWJlci5pc0ludGVnZXIoYSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlBhZ2UgY291bnQgaXMgbm90IGFuIGludGVnZXIuIik7aWYoYTw9MSlyZXR1cm47YXdhaXQgdGhpcy5nZXRQYWdlKGEtMSl9Y2F0Y2gocyl7aWYodGhpcy5fcGFnZVByb21pc2VzLmRlbGV0ZShhLTEpLGF3YWl0IHRoaXMuY2xlYW51cCgpLHMgaW5zdGFuY2VvZiBpLlhSZWZFbnRyeUV4Y2VwdGlvbiYmIWUpdGhyb3cgbmV3IGkuWFJlZlBhcnNlRXhjZXB0aW9uO2xldCBvOygwLG4ud2FybikoImNoZWNrTGFzdFBhZ2UgLSBpbnZhbGlkIC9QYWdlcyB0cmVlIC9Db3VudDogIi5jb25jYXQoYSwiLiIpKTt0cnl7bz1hd2FpdCB0LmdldEFsbFBhZ2VEaWN0cyhlKX1jYXRjaChyKXtpZihyIGluc3RhbmNlb2YgaS5YUmVmRW50cnlFeGNlcHRpb24mJiFlKXRocm93IG5ldyBpLlhSZWZQYXJzZUV4Y2VwdGlvbjtyZXR1cm4gdm9pZCB0LnNldEFjdHVhbE51bVBhZ2VzKDEpfWZvcihjb25zdFtlLFtuLGFdXW9mIG8pe2xldCBpO24gaW5zdGFuY2VvZiBFcnJvcj8oaT1Qcm9taXNlLnJlamVjdChuKSxpLmNhdGNoKCgoKT0+e30pKSk6aT1Qcm9taXNlLnJlc29sdmUobmV3IEYoe3BkZk1hbmFnZXI6cix4cmVmOnRoaXMueHJlZixwYWdlSW5kZXg6ZSxwYWdlRGljdDpuLHJlZjphLGdsb2JhbElkRmFjdG9yeTp0aGlzLl9nbG9iYWxJZEZhY3RvcnksZm9udENhY2hlOnQuZm9udENhY2hlLGJ1aWx0SW5DTWFwQ2FjaGU6dC5idWlsdEluQ01hcENhY2hlLHN0YW5kYXJkRm9udERhdGFDYWNoZTp0LnN0YW5kYXJkRm9udERhdGFDYWNoZSxnbG9iYWxJbWFnZUNhY2hlOnQuZ2xvYmFsSW1hZ2VDYWNoZSxzeXN0ZW1Gb250Q2FjaGU6dC5zeXN0ZW1Gb250Q2FjaGUsbm9uQmxlbmRNb2Rlc1NldDp0Lm5vbkJsZW5kTW9kZXNTZXQseGZhRmFjdG9yeTpudWxsfSkpLHRoaXMuX3BhZ2VQcm9taXNlcy5zZXQoZSxpKX10LnNldEFjdHVhbE51bVBhZ2VzKG8uc2l6ZSl9fWZvbnRGYWxsYmFjayhlLHQpe3JldHVybiB0aGlzLmNhdGFsb2cuZm9udEZhbGxiYWNrKGUsdCl9YXN5bmMgY2xlYW51cCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY2F0YWxvZz90aGlzLmNhdGFsb2cuY2xlYW51cChlKTooMCxmLmNsZWFyR2xvYmFsQ2FjaGVzKSgpfV9jb2xsZWN0RmllbGRPYmplY3RzKGUsdCxyKXtjb25zdCBpPXRoaXMueHJlZi5mZXRjaElmUmVmKHQpO2lmKGkuaGFzKCJUIikpe2NvbnN0IHQ9KDAsbi5zdHJpbmdUb1BERlN0cmluZykoaS5nZXQoIlQiKSk7ZT0iIj09PWU/dDoiIi5jb25jYXQoZSwiLiIpLmNvbmNhdCh0KX1pZighaS5oYXMoIktpZHMiKSYmL1xbXGQrXF0kLy50ZXN0KGUpJiYoZT1lLnN1YnN0cmluZygwLGUubGFzdEluZGV4T2YoIlsiKSkpLHIuaGFzKGUpfHxyLnNldChlLFtdKSxyLmdldChlKS5wdXNoKGEuQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHRoaXMueHJlZix0LHRoaXMucGRmTWFuYWdlcix0aGlzLl9sb2NhbElkRmFjdG9yeSwhMCkudGhlbigoZT0+bnVsbD09ZT92b2lkIDA6ZS5nZXRGaWVsZE9iamVjdCgpKSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybigwLG4ud2FybikoJ19jb2xsZWN0RmllbGRPYmplY3RzOiAiJy5jb25jYXQoZSwnIi4nKSksbnVsbH0pKSksaS5oYXMoIktpZHMiKSl7Y29uc3QgdD1pLmdldCgiS2lkcyIpO2Zvcihjb25zdCBuIG9mIHQpdGhpcy5fY29sbGVjdEZpZWxkT2JqZWN0cyhlLG4scil9fWdldCBmaWVsZE9iamVjdHMoKXtpZighdGhpcy5mb3JtSW5mby5oYXNGaWVsZHMpcmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImZpZWxkT2JqZWN0cyIsUHJvbWlzZS5yZXNvbHZlKG51bGwpKTtjb25zdCBlPU9iamVjdC5jcmVhdGUobnVsbCksdD1uZXcgTWFwO2Zvcihjb25zdCBlIG9mIHRoaXMuY2F0YWxvZy5hY3JvRm9ybS5nZXQoIkZpZWxkcyIpKXRoaXMuX2NvbGxlY3RGaWVsZE9iamVjdHMoIiIsZSx0KTtjb25zdCByPVtdO2Zvcihjb25zdFtuLGFdb2YgdClyLnB1c2goUHJvbWlzZS5hbGwoYSkudGhlbigodD0+eyh0PXQuZmlsdGVyKChlPT4hIWUpKSkubGVuZ3RoPjAmJihlW25dPXQpfSkpKTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiZmllbGRPYmplY3RzIixQcm9taXNlLmFsbChyKS50aGVuKCgoKT0+ZSkpKX1nZXQgaGFzSlNBY3Rpb25zKCl7Y29uc3QgZT10aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJfcGFyc2VIYXNKU0FjdGlvbnMiKTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiaGFzSlNBY3Rpb25zIixlKX1hc3luYyBfcGFyc2VIYXNKU0FjdGlvbnMoKXtjb25zdFtlLHRdPWF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygianNBY3Rpb25zIiksdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZURvYygiZmllbGRPYmplY3RzIildKTtyZXR1cm4hIWV8fCEhdCYmT2JqZWN0LnZhbHVlcyh0KS5zb21lKChlPT5lLnNvbWUoKGU9Pm51bGwhPT1lLmFjdGlvbnMpKSkpfWdldCBjYWxjdWxhdGlvbk9yZGVySWRzKCl7Y29uc3QgZT10aGlzLmNhdGFsb2cuYWNyb0Zvcm07aWYobnVsbD09ZXx8IWUuaGFzKCJDTyIpKXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJjYWxjdWxhdGlvbk9yZGVySWRzIixudWxsKTtjb25zdCB0PWUuZ2V0KCJDTyIpO2lmKCFBcnJheS5pc0FycmF5KHQpfHwwPT09dC5sZW5ndGgpcmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImNhbGN1bGF0aW9uT3JkZXJJZHMiLG51bGwpO2NvbnN0IHI9W107Zm9yKGNvbnN0IGUgb2YgdCllIGluc3RhbmNlb2YgYy5SZWYmJnIucHVzaChlLnRvU3RyaW5nKCkpO3JldHVybiAwPT09ci5sZW5ndGg/KDAsbi5zaGFkb3cpKHRoaXMsImNhbGN1bGF0aW9uT3JkZXJJZHMiLG51bGwpOigwLG4uc2hhZG93KSh0aGlzLCJjYWxjdWxhdGlvbk9yZGVySWRzIixyKX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuUG9wdXBBbm5vdGF0aW9uPXQuTWFya3VwQW5ub3RhdGlvbj10LkFubm90YXRpb25GYWN0b3J5PXQuQW5ub3RhdGlvbkJvcmRlclN0eWxlPXQuQW5ub3RhdGlvbj12b2lkIDAsdC5nZXRRdWFkUG9pbnRzPXYscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDE1NykscigxNTkpO3ZhciBuPXIoMTQ0KSxhPXIoMTQ5KSxpPXIoMTYxKSxzPXIoMTUwKSxvPXIoMTU0KSxjPXIoMjE2KSxsPXIoMTUxKSxoPXIoMjEwKSx1PXIoMjIwKSxkPXIoMTYyKSxmPXIoMjIzKSxnPXIoMTc2KSxwPXIoMjI2KSxtPXIoMjE0KSxiPXIoMjI3KTtmdW5jdGlvbiB5KGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpuZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHQ7Y29uc3Qgcj10fHxuZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG51bGw7Y2FzZSAxOnJldHVybiBkLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYkl0ZW0oZSwwLHIsMCkscjtjYXNlIDM6cmV0dXJuIGQuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2JJdGVtKGUsMCxyLDApLHI7Y2FzZSA0OnJldHVybiBkLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLmdldFJnYkl0ZW0oZSwwLHIsMCkscjtkZWZhdWx0OnJldHVybiB0fX1mdW5jdGlvbiB3KGUpe3JldHVybiBBcnJheS5mcm9tKGUsKGU9PmUvMjU1KSl9ZnVuY3Rpb24gdihlLHQpe2NvbnN0IHI9ZS5nZXRBcnJheSgiUXVhZFBvaW50cyIpO2lmKCFBcnJheS5pc0FycmF5KHIpfHwwPT09ci5sZW5ndGh8fHIubGVuZ3RoJTg+MClyZXR1cm4gbnVsbDtjb25zdCBuPVtdO2ZvcihsZXQgZT0wLGE9ci5sZW5ndGgvODtlPGE7ZSsrKXtsZXQgYT0xLzAsaT0tMS8wLHM9MS8wLG89LTEvMDtmb3IobGV0IHQ9OCplLG49OCplKzg7dDxuO3QrPTIpe2NvbnN0IGU9clt0XSxuPXJbdCsxXTthPU1hdGgubWluKGUsYSksaT1NYXRoLm1heChlLGkpLHM9TWF0aC5taW4obixzKSxvPU1hdGgubWF4KG4sbyl9aWYobnVsbCE9PXQmJihhPHRbMF18fGk+dFsyXXx8czx0WzFdfHxvPnRbM10pKXJldHVybiBudWxsO24ucHVzaChbe3g6YSx5Om99LHt4OmkseTpvfSx7eDphLHk6c30se3g6aSx5OnN9XSl9cmV0dXJuIG59ZnVuY3Rpb24geChlLHQscil7Y29uc3RbYSxpLHMsb109bi5VdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KHQscik7aWYoYT09PXN8fGk9PT1vKXJldHVyblsxLDAsMCwxLGVbMF0sZVsxXV07Y29uc3QgYz0oZVsyXS1lWzBdKS8ocy1hKSxsPShlWzNdLWVbMV0pLyhvLWkpO3JldHVybltjLDAsMCxsLGVbMF0tYSpjLGVbMV0taSpsXX10LkFubm90YXRpb25GYWN0b3J5PWNsYXNze3N0YXRpYyBjcmVhdGUoZSx0LHIsbixhKXtyZXR1cm4gUHJvbWlzZS5hbGwoW3IuZW5zdXJlQ2F0YWxvZygiYWNyb0Zvcm0iKSxyLmVuc3VyZUNhdGFsb2coImJhc2VVcmwiKSxyLmVuc3VyZUNhdGFsb2coImF0dGFjaG1lbnRzIiksci5lbnN1cmVEb2MoInhmYURhdGFzZXRzIiksYT90aGlzLl9nZXRQYWdlSW5kZXgoZSx0LHIpOi0xXSkudGhlbigoaT0+e2xldFtzLG8sYyxsLGhdPWk7cmV0dXJuIHIuZW5zdXJlKHRoaXMsIl9jcmVhdGUiLFtlLHQscixuLHMsYyxsLGEsaF0pfSkpfXN0YXRpYyBfY3JlYXRlKGUsdCxyLGksbyl7bGV0IGM9YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOm51bGwsbD1hcmd1bWVudHMubGVuZ3RoPjY/YXJndW1lbnRzWzZdOnZvaWQgMCxoPWFyZ3VtZW50cy5sZW5ndGg+Nz9hcmd1bWVudHNbN106dm9pZCAwLHU9YXJndW1lbnRzLmxlbmd0aD44JiZ2b2lkIDAhPT1hcmd1bWVudHNbOF0/YXJndW1lbnRzWzhdOi0xO2NvbnN0IGQ9ZS5mZXRjaElmUmVmKHQpO2lmKCEoZCBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuO2NvbnN0IGY9dCBpbnN0YW5jZW9mIHMuUmVmP3QudG9TdHJpbmcoKToiYW5ub3RfIi5jb25jYXQoaS5jcmVhdGVPYmpJZCgpKTtsZXQgZz1kLmdldCgiU3VidHlwZSIpO2c9ZyBpbnN0YW5jZW9mIHMuTmFtZT9nLm5hbWU6bnVsbDtjb25zdCBwPW8gaW5zdGFuY2VvZiBzLkRpY3Q/bzpzLkRpY3QuZW1wdHksbT17eHJlZjplLHJlZjp0LGRpY3Q6ZCxzdWJ0eXBlOmcsaWQ6ZixwZGZNYW5hZ2VyOnIsYWNyb0Zvcm06cCxhdHRhY2htZW50czpjLHhmYURhdGFzZXRzOmwsY29sbGVjdEZpZWxkczpoLG5lZWRBcHBlYXJhbmNlczohaCYmITA9PT1wLmdldCgiTmVlZEFwcGVhcmFuY2VzIikscGFnZUluZGV4OnUsZXZhbHVhdG9yT3B0aW9uczpyLmV2YWx1YXRvck9wdGlvbnN9O3N3aXRjaChnKXtjYXNlIkxpbmsiOnJldHVybiBuZXcgRShtKTtjYXNlIlRleHQiOnJldHVybiBuZXcgTShtKTtjYXNlIldpZGdldCI6bGV0IGU9KDAsYS5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDpkLGtleToiRlQifSk7c3dpdGNoKGU9ZSBpbnN0YW5jZW9mIHMuTmFtZT9lLm5hbWU6bnVsbCxlKXtjYXNlIlR4IjpyZXR1cm4gbmV3IE8obSk7Y2FzZSJCdG4iOnJldHVybiBuZXcgRihtKTtjYXNlIkNoIjpyZXR1cm4gbmV3IEkobSk7Y2FzZSJTaWciOnJldHVybiBuZXcgVChtKX1yZXR1cm4oMCxuLndhcm4pKCdVbmltcGxlbWVudGVkIHdpZGdldCBmaWVsZCB0eXBlICInLmNvbmNhdChlLCciLCBmYWxsaW5nIGJhY2sgdG8gYmFzZSBmaWVsZCB0eXBlLicpKSxuZXcgQyhtKTtjYXNlIlBvcHVwIjpyZXR1cm4gbmV3IFAobSk7Y2FzZSJGcmVlVGV4dCI6cmV0dXJuIG5ldyBSKG0pO2Nhc2UiTGluZSI6cmV0dXJuIG5ldyBOKG0pO2Nhc2UiU3F1YXJlIjpyZXR1cm4gbmV3IEQobSk7Y2FzZSJDaXJjbGUiOnJldHVybiBuZXcgQihtKTtjYXNlIlBvbHlMaW5lIjpyZXR1cm4gbmV3IEwobSk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gbmV3IF8obSk7Y2FzZSJDYXJldCI6cmV0dXJuIG5ldyBqKG0pO2Nhc2UiSW5rIjpyZXR1cm4gbmV3IFUobSk7Y2FzZSJIaWdobGlnaHQiOnJldHVybiBuZXcgJChtKTtjYXNlIlVuZGVybGluZSI6cmV0dXJuIG5ldyBYKG0pO2Nhc2UiU3F1aWdnbHkiOnJldHVybiBuZXcgSChtKTtjYXNlIlN0cmlrZU91dCI6cmV0dXJuIG5ldyBxKG0pO2Nhc2UiU3RhbXAiOnJldHVybiBuZXcgeihtKTtjYXNlIkZpbGVBdHRhY2htZW50IjpyZXR1cm4gbmV3IEcobSk7ZGVmYXVsdDpyZXR1cm4gaHx8KGc/KDAsbi53YXJuKSgnVW5pbXBsZW1lbnRlZCBhbm5vdGF0aW9uIHR5cGUgIicuY29uY2F0KGcsJyIsIGZhbGxpbmcgYmFjayB0byBiYXNlIGFubm90YXRpb24uJykpOigwLG4ud2FybikoIkFubm90YXRpb24gaXMgbWlzc2luZyB0aGUgcmVxdWlyZWQgL1N1YnR5cGUuIikpLG5ldyBTKG0pfX1zdGF0aWMgYXN5bmMgX2dldFBhZ2VJbmRleChlLHQscil7dHJ5e2NvbnN0IG49YXdhaXQgZS5mZXRjaElmUmVmQXN5bmModCk7aWYoIShuIGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm4tMTtjb25zdCBhPW4uZ2V0UmF3KCJQIik7cmV0dXJuIGEgaW5zdGFuY2VvZiBzLlJlZj9hd2FpdCByLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsW2FdKTotMX1jYXRjaChlKXtyZXR1cm4oMCxuLndhcm4pKCdfZ2V0UGFnZUluZGV4OiAiJy5jb25jYXQoZSwnIi4nKSksLTF9fXN0YXRpYyBnZW5lcmF0ZUltYWdlcyhlLHQscil7aWYoIXIpcmV0dXJuKDAsbi53YXJuKSgiZ2VuZXJhdGVJbWFnZXM6IE9mZnNjcmVlbkNhbnZhcyBpcyBub3Qgc3VwcG9ydGVkLCBjYW5ub3Qgc2F2ZSBvciBwcmludCBzb21lIGFubm90YXRpb25zIHdpdGggaW1hZ2VzLiIpLG51bGw7bGV0IGE7Zm9yKGNvbnN0e2JpdG1hcElkOnIsYml0bWFwOm59b2YgZSluJiYoYXx8KGE9bmV3IE1hcCksYS5zZXQocix6LmNyZWF0ZUltYWdlKG4sdCkpKTtyZXR1cm4gYX1zdGF0aWMgYXN5bmMgc2F2ZU5ld0Fubm90YXRpb25zKGUsdCxyLGEpe2NvbnN0IGk9ZS54cmVmO2xldCBvO2NvbnN0IGw9W10saD1bXSx7aXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6dX09ZS5vcHRpb25zO2Zvcihjb25zdCBkIG9mIHIpaWYoIWQuZGVsZXRlZClzd2l0Y2goZC5hbm5vdGF0aW9uVHlwZSl7Y2FzZSBuLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUOmlmKCFvKXtjb25zdCBlPW5ldyBzLkRpY3QoaSk7ZS5zZXQoIkJhc2VGb250IixzLk5hbWUuZ2V0KCJIZWx2ZXRpY2EiKSksZS5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkZvbnQiKSksZS5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIlR5cGUxIikpLGUuc2V0KCJFbmNvZGluZyIscy5OYW1lLmdldCgiV2luQW5zaUVuY29kaW5nIikpO2NvbnN0IHQ9W107bz1pLmdldE5ld1RlbXBvcmFyeVJlZigpLGF3YWl0KDAsYy53cml0ZU9iamVjdCkobyxlLHQsbnVsbCksbC5wdXNoKHtyZWY6byxkYXRhOnQuam9pbigiIil9KX1oLnB1c2goUi5jcmVhdGVOZXdBbm5vdGF0aW9uKGksZCxsLHtldmFsdWF0b3I6ZSx0YXNrOnQsYmFzZUZvbnRSZWY6b30pKTticmVhaztjYXNlIG4uQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LOmgucHVzaChVLmNyZWF0ZU5ld0Fubm90YXRpb24oaSxkLGwpKTticmVhaztjYXNlIG4uQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVA6aWYoIXUpYnJlYWs7Y29uc3Qgcj1hd2FpdCBhLmdldChkLmJpdG1hcElkKTtpZihyLmltYWdlU3RyZWFtKXtjb25zdHtpbWFnZVN0cmVhbTplLHNtYXNrU3RyZWFtOnR9PXIsbj1bXTtpZih0KXtjb25zdCByPWkuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7YXdhaXQoMCxjLndyaXRlT2JqZWN0KShyLHQsbixudWxsKSxsLnB1c2goe3JlZjpyLGRhdGE6bi5qb2luKCIiKX0pLGUuZGljdC5zZXQoIlNNYXNrIixyKSxuLmxlbmd0aD0wfWNvbnN0IGE9ci5pbWFnZVJlZj1pLmdldE5ld1RlbXBvcmFyeVJlZigpO2F3YWl0KDAsYy53cml0ZU9iamVjdCkoYSxlLG4sbnVsbCksbC5wdXNoKHtyZWY6YSxkYXRhOm4uam9pbigiIil9KSxyLmltYWdlU3RyZWFtPXIuc21hc2tTdHJlYW09bnVsbH1oLnB1c2goei5jcmVhdGVOZXdBbm5vdGF0aW9uKGksZCxsLHtpbWFnZTpyfSkpfXJldHVybnthbm5vdGF0aW9uczphd2FpdCBQcm9taXNlLmFsbChoKSxkZXBlbmRlbmNpZXM6bH19c3RhdGljIGFzeW5jIHByaW50TmV3QW5ub3RhdGlvbnMoZSx0LHIsYSl7aWYoIXIpcmV0dXJuIG51bGw7Y29uc3R7b3B0aW9uczppLHhyZWY6c309ZSxvPVtdO2Zvcihjb25zdCBjIG9mIHIpaWYoIWMuZGVsZXRlZClzd2l0Y2goYy5hbm5vdGF0aW9uVHlwZSl7Y2FzZSBuLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUOm8ucHVzaChSLmNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihzLGMse2V2YWx1YXRvcjplLHRhc2s6dCxldmFsdWF0b3JPcHRpb25zOml9KSk7YnJlYWs7Y2FzZSBuLkFubm90YXRpb25FZGl0b3JUeXBlLklOSzpvLnB1c2goVS5jcmVhdGVOZXdQcmludEFubm90YXRpb24ocyxjLHtldmFsdWF0b3JPcHRpb25zOml9KSk7YnJlYWs7Y2FzZSBuLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QOmlmKCFpLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKWJyZWFrO2NvbnN0IHI9YXdhaXQgYS5nZXQoYy5iaXRtYXBJZCk7aWYoci5pbWFnZVN0cmVhbSl7Y29uc3R7aW1hZ2VTdHJlYW06ZSxzbWFza1N0cmVhbTp0fT1yO3QmJmUuZGljdC5zZXQoIlNNYXNrIix0KSxyLmltYWdlUmVmPW5ldyBnLkpwZWdTdHJlYW0oZSxlLmxlbmd0aCksci5pbWFnZVN0cmVhbT1yLnNtYXNrU3RyZWFtPW51bGx9by5wdXNoKHouY3JlYXRlTmV3UHJpbnRBbm5vdGF0aW9uKHMsYyx7aW1hZ2U6cixldmFsdWF0b3JPcHRpb25zOml9KSl9cmV0dXJuIFByb21pc2UuYWxsKG8pfX07Y2xhc3MgU3tjb25zdHJ1Y3RvcihlKXtjb25zdHtkaWN0OnQseHJlZjpyfT1lO3RoaXMuc2V0VGl0bGUodC5nZXQoIlQiKSksdGhpcy5zZXRDb250ZW50cyh0LmdldCgiQ29udGVudHMiKSksdGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKHQuZ2V0KCJNIikpLHRoaXMuc2V0RmxhZ3ModC5nZXQoIkYiKSksdGhpcy5zZXRSZWN0YW5nbGUodC5nZXRBcnJheSgiUmVjdCIpKSx0aGlzLnNldENvbG9yKHQuZ2V0QXJyYXkoIkMiKSksdGhpcy5zZXRCb3JkZXJTdHlsZSh0KSx0aGlzLnNldEFwcGVhcmFuY2UodCksdGhpcy5zZXRPcHRpb25hbENvbnRlbnQodCk7Y29uc3QgaT10LmdldCgiTUsiKTt0aGlzLnNldEJvcmRlckFuZEJhY2tncm91bmRDb2xvcnMoaSksdGhpcy5zZXRSb3RhdGlvbihpLHQpLHRoaXMucmVmPWUucmVmIGluc3RhbmNlb2Ygcy5SZWY/ZS5yZWY6bnVsbCx0aGlzLl9zdHJlYW1zPVtdLHRoaXMuYXBwZWFyYW5jZSYmdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuYXBwZWFyYW5jZSk7Y29uc3Qgbz0hISh0aGlzLmZsYWdzJm4uQW5ub3RhdGlvbkZsYWcuTE9DS0VEKSxjPSEhKHRoaXMuZmxhZ3Mmbi5Bbm5vdGF0aW9uRmxhZy5MT0NLRURDT05URU5UUyk7aWYodGhpcy5kYXRhPXthbm5vdGF0aW9uRmxhZ3M6dGhpcy5mbGFncyxib3JkZXJTdHlsZTp0aGlzLmJvcmRlclN0eWxlLGNvbG9yOnRoaXMuY29sb3IsYmFja2dyb3VuZENvbG9yOnRoaXMuYmFja2dyb3VuZENvbG9yLGJvcmRlckNvbG9yOnRoaXMuYm9yZGVyQ29sb3Iscm90YXRpb246dGhpcy5yb3RhdGlvbixjb250ZW50c09iajp0aGlzLl9jb250ZW50cyxoYXNBcHBlYXJhbmNlOiEhdGhpcy5hcHBlYXJhbmNlLGlkOmUuaWQsbW9kaWZpY2F0aW9uRGF0ZTp0aGlzLm1vZGlmaWNhdGlvbkRhdGUscmVjdDp0aGlzLnJlY3RhbmdsZSxzdWJ0eXBlOmUuc3VidHlwZSxoYXNPd25DYW52YXM6ITEsbm9Sb3RhdGU6ISEodGhpcy5mbGFncyZuLkFubm90YXRpb25GbGFnLk5PUk9UQVRFKSxub0hUTUw6byYmY30sZS5jb2xsZWN0RmllbGRzKXtjb25zdCBpPXQuZ2V0KCJLaWRzIik7aWYoQXJyYXkuaXNBcnJheShpKSl7Y29uc3QgZT1bXTtmb3IoY29uc3QgdCBvZiBpKXQgaW5zdGFuY2VvZiBzLlJlZiYmZS5wdXNoKHQudG9TdHJpbmcoKSk7MCE9PWUubGVuZ3RoJiYodGhpcy5kYXRhLmtpZElkcz1lKX10aGlzLmRhdGEuYWN0aW9ucz0oMCxhLmNvbGxlY3RBY3Rpb25zKShyLHQsbi5Bbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlKSx0aGlzLmRhdGEuZmllbGROYW1lPXRoaXMuX2NvbnN0cnVjdEZpZWxkTmFtZSh0KSx0aGlzLmRhdGEucGFnZUluZGV4PWUucGFnZUluZGV4fXRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkPWUuZXZhbHVhdG9yT3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCx0aGlzLl9mYWxsYmFja0ZvbnREaWN0PW51bGwsdGhpcy5fbmVlZEFwcGVhcmFuY2VzPSExfV9oYXNGbGFnKGUsdCl7cmV0dXJuISEoZSZ0KX1faXNWaWV3YWJsZShlKXtyZXR1cm4hdGhpcy5faGFzRmxhZyhlLG4uQW5ub3RhdGlvbkZsYWcuSU5WSVNJQkxFKSYmIXRoaXMuX2hhc0ZsYWcoZSxuLkFubm90YXRpb25GbGFnLk5PVklFVyl9X2lzUHJpbnRhYmxlKGUpe3JldHVybiB0aGlzLl9oYXNGbGFnKGUsbi5Bbm5vdGF0aW9uRmxhZy5QUklOVCkmJiF0aGlzLl9oYXNGbGFnKGUsbi5Bbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUpfW11c3RCZVZpZXdlZChlKXt2YXIgdDtjb25zdCByPW51bGw9PWV8fG51bGw9PT0odD1lLmdldCh0aGlzLmRhdGEuaWQpKXx8dm9pZCAwPT09dD92b2lkIDA6dC5oaWRkZW47cmV0dXJuIHZvaWQgMCE9PXI/IXI6dGhpcy52aWV3YWJsZSYmIXRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncyxuLkFubm90YXRpb25GbGFnLkhJRERFTil9bXVzdEJlUHJpbnRlZChlKXt2YXIgdDtjb25zdCByPW51bGw9PWV8fG51bGw9PT0odD1lLmdldCh0aGlzLmRhdGEuaWQpKXx8dm9pZCAwPT09dD92b2lkIDA6dC5wcmludDtyZXR1cm4gdm9pZCAwIT09cj9yOnRoaXMucHJpbnRhYmxlfWdldCB2aWV3YWJsZSgpe3JldHVybiBudWxsIT09dGhpcy5kYXRhLnF1YWRQb2ludHMmJigwPT09dGhpcy5mbGFnc3x8dGhpcy5faXNWaWV3YWJsZSh0aGlzLmZsYWdzKSl9Z2V0IHByaW50YWJsZSgpe3JldHVybiBudWxsIT09dGhpcy5kYXRhLnF1YWRQb2ludHMmJjAhPT10aGlzLmZsYWdzJiZ0aGlzLl9pc1ByaW50YWJsZSh0aGlzLmZsYWdzKX1fcGFyc2VTdHJpbmdIZWxwZXIoZSl7Y29uc3QgdD0ic3RyaW5nIj09dHlwZW9mIGU/KDAsbi5zdHJpbmdUb1BERlN0cmluZykoZSk6IiI7cmV0dXJue3N0cjp0LGRpcjp0JiYicnRsIj09PSgwLGguYmlkaSkodCkuZGlyPyJydGwiOiJsdHIifX1zZXREZWZhdWx0QXBwZWFyYW5jZShlKXtjb25zdCB0PSgwLGEuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6ZS5kaWN0LGtleToiREEifSl8fGUuYWNyb0Zvcm0uZ2V0KCJEQSIpO3RoaXMuX2RlZmF1bHRBcHBlYXJhbmNlPSJzdHJpbmciPT10eXBlb2YgdD90OiIiLHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE9KDAsaS5wYXJzZURlZmF1bHRBcHBlYXJhbmNlKSh0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSl9c2V0VGl0bGUoZSl7dGhpcy5fdGl0bGU9dGhpcy5fcGFyc2VTdHJpbmdIZWxwZXIoZSl9c2V0Q29udGVudHMoZSl7dGhpcy5fY29udGVudHM9dGhpcy5fcGFyc2VTdHJpbmdIZWxwZXIoZSl9c2V0TW9kaWZpY2F0aW9uRGF0ZShlKXt0aGlzLm1vZGlmaWNhdGlvbkRhdGU9InN0cmluZyI9PXR5cGVvZiBlP2U6bnVsbH1zZXRGbGFncyhlKXt0aGlzLmZsYWdzPU51bWJlci5pc0ludGVnZXIoZSkmJmU+MD9lOjB9aGFzRmxhZyhlKXtyZXR1cm4gdGhpcy5faGFzRmxhZyh0aGlzLmZsYWdzLGUpfXNldFJlY3RhbmdsZShlKXt0aGlzLnJlY3RhbmdsZT1BcnJheS5pc0FycmF5KGUpJiY0PT09ZS5sZW5ndGg/bi5VdGlsLm5vcm1hbGl6ZVJlY3QoZSk6WzAsMCwwLDBdfXNldENvbG9yKGUpe3RoaXMuY29sb3I9eShlKX1zZXRMaW5lRW5kaW5ncyhlKXtpZih0aGlzLmxpbmVFbmRpbmdzPVsiTm9uZSIsIk5vbmUiXSxBcnJheS5pc0FycmF5KGUpJiYyPT09ZS5sZW5ndGgpZm9yKGxldCB0PTA7dDwyO3QrKyl7Y29uc3Qgcj1lW3RdO2lmKHIgaW5zdGFuY2VvZiBzLk5hbWUpc3dpdGNoKHIubmFtZSl7Y2FzZSJOb25lIjpjb250aW51ZTtjYXNlIlNxdWFyZSI6Y2FzZSJDaXJjbGUiOmNhc2UiRGlhbW9uZCI6Y2FzZSJPcGVuQXJyb3ciOmNhc2UiQ2xvc2VkQXJyb3ciOmNhc2UiQnV0dCI6Y2FzZSJST3BlbkFycm93IjpjYXNlIlJDbG9zZWRBcnJvdyI6Y2FzZSJTbGFzaCI6dGhpcy5saW5lRW5kaW5nc1t0XT1yLm5hbWU7Y29udGludWV9KDAsbi53YXJuKSgiSWdub3JpbmcgaW52YWxpZCBsaW5lRW5kaW5nOiAiLmNvbmNhdChyKSl9fXNldFJvdGF0aW9uKGUsdCl7dGhpcy5yb3RhdGlvbj0wO2xldCByPWUgaW5zdGFuY2VvZiBzLkRpY3Q/ZS5nZXQoIlIiKXx8MDp0LmdldCgiUm90YXRlIil8fDA7TnVtYmVyLmlzSW50ZWdlcihyKSYmMCE9PXImJihyJT0zNjAscjwwJiYocis9MzYwKSxyJTkwPT0wJiYodGhpcy5yb3RhdGlvbj1yKSl9c2V0Qm9yZGVyQW5kQmFja2dyb3VuZENvbG9ycyhlKXtlIGluc3RhbmNlb2Ygcy5EaWN0Pyh0aGlzLmJvcmRlckNvbG9yPXkoZS5nZXRBcnJheSgiQkMiKSxudWxsKSx0aGlzLmJhY2tncm91bmRDb2xvcj15KGUuZ2V0QXJyYXkoIkJHIiksbnVsbCkpOnRoaXMuYm9yZGVyQ29sb3I9dGhpcy5iYWNrZ3JvdW5kQ29sb3I9bnVsbH1zZXRCb3JkZXJTdHlsZShlKXtpZih0aGlzLmJvcmRlclN0eWxlPW5ldyBBLGUgaW5zdGFuY2VvZiBzLkRpY3QpaWYoZS5oYXMoIkJTIikpe2NvbnN0IHQ9ZS5nZXQoIkJTIikscj10LmdldCgiVHlwZSIpO3ImJiEoMCxzLmlzTmFtZSkociwiQm9yZGVyIil8fCh0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKHQuZ2V0KCJXIiksdGhpcy5yZWN0YW5nbGUpLHRoaXMuYm9yZGVyU3R5bGUuc2V0U3R5bGUodC5nZXQoIlMiKSksdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkodC5nZXRBcnJheSgiRCIpKSl9ZWxzZSBpZihlLmhhcygiQm9yZGVyIikpe2NvbnN0IHQ9ZS5nZXRBcnJheSgiQm9yZGVyIik7QXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+PTMmJih0aGlzLmJvcmRlclN0eWxlLnNldEhvcml6b250YWxDb3JuZXJSYWRpdXModFswXSksdGhpcy5ib3JkZXJTdHlsZS5zZXRWZXJ0aWNhbENvcm5lclJhZGl1cyh0WzFdKSx0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKHRbMl0sdGhpcy5yZWN0YW5nbGUpLDQ9PT10Lmxlbmd0aCYmdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkodFszXSwhMCkpfWVsc2UgdGhpcy5ib3JkZXJTdHlsZS5zZXRXaWR0aCgwKX1zZXRBcHBlYXJhbmNlKGUpe3RoaXMuYXBwZWFyYW5jZT1udWxsO2NvbnN0IHQ9ZS5nZXQoIkFQIik7aWYoISh0IGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm47Y29uc3Qgcj10LmdldCgiTiIpO2lmKHIgaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0pcmV0dXJuIHZvaWQodGhpcy5hcHBlYXJhbmNlPXIpO2lmKCEociBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuO2NvbnN0IG49ZS5nZXQoIkFTIik7aWYoIShuIGluc3RhbmNlb2Ygcy5OYW1lJiZyLmhhcyhuLm5hbWUpKSlyZXR1cm47Y29uc3QgYT1yLmdldChuLm5hbWUpO2EgaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0mJih0aGlzLmFwcGVhcmFuY2U9YSl9c2V0T3B0aW9uYWxDb250ZW50KGUpe3RoaXMub2M9bnVsbDtjb25zdCB0PWUuZ2V0KCJPQyIpO3QgaW5zdGFuY2VvZiBzLk5hbWU/KDAsbi53YXJuKSgic2V0T3B0aW9uYWxDb250ZW50OiBTdXBwb3J0IGZvciAvTmFtZS1lbnRyeSBpcyBub3QgaW1wbGVtZW50ZWQuIik6dCBpbnN0YW5jZW9mIHMuRGljdCYmKHRoaXMub2M9dCl9bG9hZFJlc291cmNlcyhlLHQpe3JldHVybiB0LmRpY3QuZ2V0QXN5bmMoIlJlc291cmNlcyIpLnRoZW4oKHQ9PntpZih0KXJldHVybiBuZXcgcC5PYmplY3RMb2FkZXIodCxlLHQueHJlZikubG9hZCgpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSl9KSl9YXN5bmMgZ2V0T3BlcmF0b3JMaXN0KGUsdCxyLGEsaSl7Y29uc3QgYz10aGlzLmRhdGE7bGV0IGw9dGhpcy5hcHBlYXJhbmNlO2NvbnN0IGg9ISEodGhpcy5kYXRhLmhhc093bkNhbnZhcyYmciZuLlJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSk7aWYoIWwpe2lmKCFoKXJldHVybntvcExpc3Q6bmV3IG0uT3BlcmF0b3JMaXN0LHNlcGFyYXRlRm9ybTohMSxzZXBhcmF0ZUNhbnZhczohMX07bD1uZXcgby5TdHJpbmdTdHJlYW0oIiIpLGwuZGljdD1uZXcgcy5EaWN0fWNvbnN0IHU9bC5kaWN0LGQ9YXdhaXQgdGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwiQ29sb3JTcGFjZSIsIlBhdHRlcm4iLCJTaGFkaW5nIiwiWE9iamVjdCIsIkZvbnQiXSxsKSxmPXUuZ2V0QXJyYXkoIkJCb3giKXx8WzAsMCwxLDFdLGc9dS5nZXRBcnJheSgiTWF0cml4Iil8fFsxLDAsMCwxLDAsMF0scD14KGMucmVjdCxmLGcpLGI9bmV3IG0uT3BlcmF0b3JMaXN0O2xldCB5O3JldHVybiB0aGlzLm9jJiYoeT1hd2FpdCBlLnBhcnNlTWFya2VkQ29udGVudFByb3BzKHRoaXMub2MsbnVsbCkpLHZvaWQgMCE9PXkmJmIuYWRkT3Aobi5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsWyJPQyIseV0pLGIuYWRkT3Aobi5PUFMuYmVnaW5Bbm5vdGF0aW9uLFtjLmlkLGMucmVjdCxwLGcsaF0pLGF3YWl0IGUuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06bCx0YXNrOnQscmVzb3VyY2VzOmQsb3BlcmF0b3JMaXN0OmIsZmFsbGJhY2tGb250RGljdDp0aGlzLl9mYWxsYmFja0ZvbnREaWN0fSksYi5hZGRPcChuLk9QUy5lbmRBbm5vdGF0aW9uLFtdKSx2b2lkIDAhPT15JiZiLmFkZE9wKG4uT1BTLmVuZE1hcmtlZENvbnRlbnQsW10pLHRoaXMucmVzZXQoKSx7b3BMaXN0OmIsc2VwYXJhdGVGb3JtOiExLHNlcGFyYXRlQ2FudmFzOmh9fWFzeW5jIHNhdmUoZSx0LHIpe3JldHVybiBudWxsfWdldCBoYXNUZXh0Q29udGVudCgpe3JldHVybiExfWFzeW5jIGV4dHJhY3RUZXh0Q29udGVudChlLHQscil7aWYoIXRoaXMuYXBwZWFyYW5jZSlyZXR1cm47Y29uc3QgYT1hd2FpdCB0aGlzLmxvYWRSZXNvdXJjZXMoWyJFeHRHU3RhdGUiLCJGb250IiwiUHJvcGVydGllcyIsIlhPYmplY3QiXSx0aGlzLmFwcGVhcmFuY2UpLGk9W10scz1bXTtsZXQgbz1udWxsO2NvbnN0IGM9e2Rlc2lyZWRTaXplOk1hdGguSW5maW5pdHkscmVhZHk6ITAsZW5xdWV1ZShlLHQpe2Zvcihjb25zdCB0IG9mIGUuaXRlbXMpdm9pZCAwIT09dC5zdHImJihvfHwobz10LnRyYW5zZm9ybS5zbGljZSgtMikpLHMucHVzaCh0LnN0ciksdC5oYXNFT0wmJihpLnB1c2gocy5qb2luKCIiKSkscy5sZW5ndGg9MCkpfX07aWYoYXdhaXQgZS5nZXRUZXh0Q29udGVudCh7c3RyZWFtOnRoaXMuYXBwZWFyYW5jZSx0YXNrOnQscmVzb3VyY2VzOmEsaW5jbHVkZU1hcmtlZENvbnRlbnQ6ITAsc2luazpjLHZpZXdCb3g6cn0pLHRoaXMucmVzZXQoKSxzLmxlbmd0aCYmaS5wdXNoKHMuam9pbigiIikpLGkubGVuZ3RoPjF8fGlbMF0pe2NvbnN0IGU9dGhpcy5hcHBlYXJhbmNlLmRpY3QsdD1lLmdldEFycmF5KCJCQm94Iil8fFswLDAsMSwxXSxyPWUuZ2V0QXJyYXkoIk1hdHJpeCIpfHxbMSwwLDAsMSwwLDBdLGE9dGhpcy5kYXRhLnJlY3Qscz14KGEsdCxyKTtzWzRdLT1hWzBdLHNbNV0tPWFbMV0sbz1uLlV0aWwuYXBwbHlUcmFuc2Zvcm0obyxzKSxvPW4uVXRpbC5hcHBseVRyYW5zZm9ybShvLHIpLHRoaXMuZGF0YS50ZXh0UG9zaXRpb249byx0aGlzLmRhdGEudGV4dENvbnRlbnQ9aX19Z2V0RmllbGRPYmplY3QoKXtyZXR1cm4gdGhpcy5kYXRhLmtpZElkcz97aWQ6dGhpcy5kYXRhLmlkLGFjdGlvbnM6dGhpcy5kYXRhLmFjdGlvbnMsbmFtZTp0aGlzLmRhdGEuZmllbGROYW1lLHN0cm9rZUNvbG9yOnRoaXMuZGF0YS5ib3JkZXJDb2xvcixmaWxsQ29sb3I6dGhpcy5kYXRhLmJhY2tncm91bmRDb2xvcix0eXBlOiIiLGtpZElkczp0aGlzLmRhdGEua2lkSWRzLHBhZ2U6dGhpcy5kYXRhLnBhZ2VJbmRleCxyb3RhdGlvbjp0aGlzLnJvdGF0aW9ufTpudWxsfXJlc2V0KCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fc3RyZWFtcyllLnJlc2V0KCl9X2NvbnN0cnVjdEZpZWxkTmFtZShlKXtpZighZS5oYXMoIlQiKSYmIWUuaGFzKCJQYXJlbnQiKSlyZXR1cm4oMCxuLndhcm4pKCJVbmtub3duIGZpZWxkIG5hbWUsIGZhbGxpbmcgYmFjayB0byBlbXB0eSBmaWVsZCBuYW1lLiIpLCIiO2lmKCFlLmhhcygiUGFyZW50IikpcmV0dXJuKDAsbi5zdHJpbmdUb1BERlN0cmluZykoZS5nZXQoIlQiKSk7Y29uc3QgdD1bXTtlLmhhcygiVCIpJiZ0LnVuc2hpZnQoKDAsbi5zdHJpbmdUb1BERlN0cmluZykoZS5nZXQoIlQiKSkpO2xldCByPWU7Y29uc3QgYT1uZXcgcy5SZWZTZXQ7Zm9yKGUub2JqSWQmJmEucHV0KGUub2JqSWQpO3IuaGFzKCJQYXJlbnQiKSYmKHI9ci5nZXQoIlBhcmVudCIpLHIgaW5zdGFuY2VvZiBzLkRpY3QmJighci5vYmpJZHx8IWEuaGFzKHIub2JqSWQpKSk7KWlmKHIub2JqSWQmJmEucHV0KHIub2JqSWQpLHIuaGFzKCJUIikpe2NvbnN0IGU9KDAsbi5zdHJpbmdUb1BERlN0cmluZykoci5nZXQoIlQiKSk7ZS5zdGFydHNXaXRoKCIjIil8fHQudW5zaGlmdChlKX1yZXR1cm4gdC5qb2luKCIuIil9fXQuQW5ub3RhdGlvbj1TO2NsYXNzIEF7Y29uc3RydWN0b3IoKXt0aGlzLndpZHRoPTEsdGhpcy5zdHlsZT1uLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQsdGhpcy5kYXNoQXJyYXk9WzNdLHRoaXMuaG9yaXpvbnRhbENvcm5lclJhZGl1cz0wLHRoaXMudmVydGljYWxDb3JuZXJSYWRpdXM9MH1zZXRXaWR0aChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06WzAsMCwwLDBdO2lmKGUgaW5zdGFuY2VvZiBzLk5hbWUpdGhpcy53aWR0aD0wO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZihlPjApe2NvbnN0IHI9KHRbMl0tdFswXSkvMixhPSh0WzNdLXRbMV0pLzI7cj4wJiZhPjAmJihlPnJ8fGU+YSkmJigoMCxuLndhcm4pKCJBbm5vdGF0aW9uQm9yZGVyU3R5bGUuc2V0V2lkdGggLSBpZ25vcmluZyB3aWR0aDogIi5jb25jYXQoZSkpLGU9MSl9dGhpcy53aWR0aD1lfX1zZXRTdHlsZShlKXtpZihlIGluc3RhbmNlb2Ygcy5OYW1lKXN3aXRjaChlLm5hbWUpe2Nhc2UiUyI6dGhpcy5zdHlsZT1uLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQ7YnJlYWs7Y2FzZSJEIjp0aGlzLnN0eWxlPW4uQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ7YnJlYWs7Y2FzZSJCIjp0aGlzLnN0eWxlPW4uQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5CRVZFTEVEO2JyZWFrO2Nhc2UiSSI6dGhpcy5zdHlsZT1uLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuSU5TRVQ7YnJlYWs7Y2FzZSJVIjp0aGlzLnN0eWxlPW4uQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkV9fXNldERhc2hBcnJheShlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPjApe2xldCByPSEwLG49ITA7Zm9yKGNvbnN0IHQgb2YgZSl7aWYoISgrdD49MCkpe3I9ITE7YnJlYWt9dD4wJiYobj0hMSl9ciYmIW4/KHRoaXMuZGFzaEFycmF5PWUsdCYmdGhpcy5zZXRTdHlsZShzLk5hbWUuZ2V0KCJEIikpKTp0aGlzLndpZHRoPTB9ZWxzZSBlJiYodGhpcy53aWR0aD0wKX1zZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKGUpe051bWJlci5pc0ludGVnZXIoZSkmJih0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXM9ZSl9c2V0VmVydGljYWxDb3JuZXJSYWRpdXMoZSl7TnVtYmVyLmlzSW50ZWdlcihlKSYmKHRoaXMudmVydGljYWxDb3JuZXJSYWRpdXM9ZSl9fXQuQW5ub3RhdGlvbkJvcmRlclN0eWxlPUE7Y2xhc3MgayBleHRlbmRzIFN7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7Y29uc3R7ZGljdDp0fT1lO2lmKHQuaGFzKCJJUlQiKSl7Y29uc3QgZT10LmdldFJhdygiSVJUIik7dGhpcy5kYXRhLmluUmVwbHlUbz1lIGluc3RhbmNlb2Ygcy5SZWY/ZS50b1N0cmluZygpOm51bGw7Y29uc3Qgcj10LmdldCgiUlQiKTt0aGlzLmRhdGEucmVwbHlUeXBlPXIgaW5zdGFuY2VvZiBzLk5hbWU/ci5uYW1lOm4uQW5ub3RhdGlvblJlcGx5VHlwZS5SRVBMWX1sZXQgcj1udWxsO2lmKHRoaXMuZGF0YS5yZXBseVR5cGU9PT1uLkFubm90YXRpb25SZXBseVR5cGUuR1JPVVApe2NvbnN0IGU9dC5nZXQoIklSVCIpO3RoaXMuc2V0VGl0bGUoZS5nZXQoIlQiKSksdGhpcy5kYXRhLnRpdGxlT2JqPXRoaXMuX3RpdGxlLHRoaXMuc2V0Q29udGVudHMoZS5nZXQoIkNvbnRlbnRzIikpLHRoaXMuZGF0YS5jb250ZW50c09iaj10aGlzLl9jb250ZW50cyxlLmhhcygiQ3JlYXRpb25EYXRlIik/KHRoaXMuc2V0Q3JlYXRpb25EYXRlKGUuZ2V0KCJDcmVhdGlvbkRhdGUiKSksdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZT10aGlzLmNyZWF0aW9uRGF0ZSk6dGhpcy5kYXRhLmNyZWF0aW9uRGF0ZT1udWxsLGUuaGFzKCJNIik/KHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShlLmdldCgiTSIpKSx0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZT10aGlzLm1vZGlmaWNhdGlvbkRhdGUpOnRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlPW51bGwscj1lLmdldFJhdygiUG9wdXAiKSxlLmhhcygiQyIpPyh0aGlzLnNldENvbG9yKGUuZ2V0QXJyYXkoIkMiKSksdGhpcy5kYXRhLmNvbG9yPXRoaXMuY29sb3IpOnRoaXMuZGF0YS5jb2xvcj1udWxsfWVsc2UgdGhpcy5kYXRhLnRpdGxlT2JqPXRoaXMuX3RpdGxlLHRoaXMuc2V0Q3JlYXRpb25EYXRlKHQuZ2V0KCJDcmVhdGlvbkRhdGUiKSksdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZT10aGlzLmNyZWF0aW9uRGF0ZSxyPXQuZ2V0UmF3KCJQb3B1cCIpLHQuaGFzKCJDIil8fCh0aGlzLmRhdGEuY29sb3I9bnVsbCk7dGhpcy5kYXRhLnBvcHVwUmVmPXIgaW5zdGFuY2VvZiBzLlJlZj9yLnRvU3RyaW5nKCk6bnVsbCx0LmhhcygiUkMiKSYmKHRoaXMuZGF0YS5yaWNoVGV4dD1iLlhGQUZhY3RvcnkuZ2V0UmljaFRleHRBc0h0bWwodC5nZXQoIlJDIikpKX1zZXRDcmVhdGlvbkRhdGUoZSl7dGhpcy5jcmVhdGlvbkRhdGU9InN0cmluZyI9PXR5cGVvZiBlP2U6bnVsbH1fc2V0RGVmYXVsdEFwcGVhcmFuY2UoZSl7bGV0e3hyZWY6dCxleHRyYTpyLHN0cm9rZUNvbG9yOm4sZmlsbENvbG9yOmEsYmxlbmRNb2RlOmksc3Ryb2tlQWxwaGE6YyxmaWxsQWxwaGE6bCxwb2ludHNDYWxsYmFjazpofT1lLHU9TnVtYmVyLk1BWF9WQUxVRSxkPU51bWJlci5NQVhfVkFMVUUsZj1OdW1iZXIuTUlOX1ZBTFVFLGc9TnVtYmVyLk1JTl9WQUxVRTtjb25zdCBwPVsicSJdO3ImJnAucHVzaChyKSxuJiZwLnB1c2goIiIuY29uY2F0KG5bMF0sIiAiKS5jb25jYXQoblsxXSwiICIpLmNvbmNhdChuWzJdLCIgUkciKSksYSYmcC5wdXNoKCIiLmNvbmNhdChhWzBdLCIgIikuY29uY2F0KGFbMV0sIiAiKS5jb25jYXQoYVsyXSwiIHJnIikpO2xldCBtPXRoaXMuZGF0YS5xdWFkUG9pbnRzO218fChtPVtbe3g6dGhpcy5yZWN0YW5nbGVbMF0seTp0aGlzLnJlY3RhbmdsZVszXX0se3g6dGhpcy5yZWN0YW5nbGVbMl0seTp0aGlzLnJlY3RhbmdsZVszXX0se3g6dGhpcy5yZWN0YW5nbGVbMF0seTp0aGlzLnJlY3RhbmdsZVsxXX0se3g6dGhpcy5yZWN0YW5nbGVbMl0seTp0aGlzLnJlY3RhbmdsZVsxXX1dXSk7Zm9yKGNvbnN0IGUgb2YgbSl7Y29uc3RbdCxyLG4sYV09aChwLGUpO3U9TWF0aC5taW4odSx0KSxmPU1hdGgubWF4KGYsciksZD1NYXRoLm1pbihkLG4pLGc9TWF0aC5tYXgoZyxhKX1wLnB1c2goIlEiKTtjb25zdCBiPW5ldyBzLkRpY3QodCkseT1uZXcgcy5EaWN0KHQpO3kuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGb3JtIikpO2NvbnN0IHc9bmV3IG8uU3RyaW5nU3RyZWFtKHAuam9pbigiICIpKTt3LmRpY3Q9eSxiLnNldCgiRm0wIix3KTtjb25zdCB2PW5ldyBzLkRpY3QodCk7aSYmdi5zZXQoIkJNIixzLk5hbWUuZ2V0KGkpKSwibnVtYmVyIj09dHlwZW9mIGMmJnYuc2V0KCJDQSIsYyksIm51bWJlciI9PXR5cGVvZiBsJiZ2LnNldCgiY2EiLGwpO2NvbnN0IHg9bmV3IHMuRGljdCh0KTt4LnNldCgiR1MwIix2KTtjb25zdCBTPW5ldyBzLkRpY3QodCk7Uy5zZXQoIkV4dEdTdGF0ZSIseCksUy5zZXQoIlhPYmplY3QiLGIpO2NvbnN0IEE9bmV3IHMuRGljdCh0KTtBLnNldCgiUmVzb3VyY2VzIixTKTtjb25zdCBrPXRoaXMuZGF0YS5yZWN0PVt1LGQsZixnXTtBLnNldCgiQkJveCIsayksdGhpcy5hcHBlYXJhbmNlPW5ldyBvLlN0cmluZ1N0cmVhbSgiL0dTMCBncyAvRm0wIERvIiksdGhpcy5hcHBlYXJhbmNlLmRpY3Q9QSx0aGlzLl9zdHJlYW1zLnB1c2godGhpcy5hcHBlYXJhbmNlLHcpfXN0YXRpYyBhc3luYyBjcmVhdGVOZXdBbm5vdGF0aW9uKGUsdCxyLG4pe2NvbnN0IGE9dC5yZWZ8fGUuZ2V0TmV3VGVtcG9yYXJ5UmVmKCksaT1hd2FpdCB0aGlzLmNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0odCxlLG4pLHM9W107bGV0IG87aWYoaSl7Y29uc3Qgbj1lLmdldE5ld1RlbXBvcmFyeVJlZigpO289dGhpcy5jcmVhdGVOZXdEaWN0KHQsZSx7YXBSZWY6bn0pO2NvbnN0IGE9ZS5lbmNyeXB0P2UuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0obi5udW0sbi5nZW4pOm51bGw7YXdhaXQoMCxjLndyaXRlT2JqZWN0KShuLGkscyxhKSxyLnB1c2goe3JlZjpuLGRhdGE6cy5qb2luKCIiKX0pfWVsc2Ugbz10aGlzLmNyZWF0ZU5ld0RpY3QodCxlLHt9KTtzLmxlbmd0aD0wO2NvbnN0IGw9ZS5lbmNyeXB0P2UuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0oYS5udW0sYS5nZW4pOm51bGw7cmV0dXJuIGF3YWl0KDAsYy53cml0ZU9iamVjdCkoYSxvLHMsbCkse3JlZjphLGRhdGE6cy5qb2luKCIiKX19c3RhdGljIGFzeW5jIGNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihlLHQscil7Y29uc3Qgbj1hd2FpdCB0aGlzLmNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0odCxlLHIpLGE9dGhpcy5jcmVhdGVOZXdEaWN0KHQsZSx7YXA6bn0pLGk9bmV3IHRoaXMucHJvdG90eXBlLmNvbnN0cnVjdG9yKHtkaWN0OmEseHJlZjplLGV2YWx1YXRvck9wdGlvbnM6ci5ldmFsdWF0b3JPcHRpb25zfSk7cmV0dXJuIHQucmVmJiYoaS5yZWY9aS5yZWZUb1JlcGxhY2U9dC5yZWYpLGl9fXQuTWFya3VwQW5ub3RhdGlvbj1rO2NsYXNzIEMgZXh0ZW5kcyBTe2NvbnN0cnVjdG9yKGUpe3ZhciB0O3N1cGVyKGUpO2NvbnN0e2RpY3Q6cix4cmVmOml9PWUsbz10aGlzLmRhdGE7dGhpcy5fbmVlZEFwcGVhcmFuY2VzPWUubmVlZEFwcGVhcmFuY2VzLG8uYW5ub3RhdGlvblR5cGU9bi5Bbm5vdGF0aW9uVHlwZS5XSURHRVQsdm9pZCAwPT09by5maWVsZE5hbWUmJihvLmZpZWxkTmFtZT10aGlzLl9jb25zdHJ1Y3RGaWVsZE5hbWUocikpLG8uZmllbGROYW1lJiYvXFtcZCtcXSQvLnRlc3Qoby5maWVsZE5hbWUpJiYhci5oYXMoIktpZHMiKSYmKG8uYmFzZUZpZWxkTmFtZT1vLmZpZWxkTmFtZS5zdWJzdHJpbmcoMCxvLmZpZWxkTmFtZS5sYXN0SW5kZXhPZigiWyIpKSksdm9pZCAwPT09by5hY3Rpb25zJiYoby5hY3Rpb25zPSgwLGEuY29sbGVjdEFjdGlvbnMpKGkscixuLkFubm90YXRpb25BY3Rpb25FdmVudFR5cGUpKTtsZXQgYz0oMCxhLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnIsa2V5OiJWIixnZXRBcnJheTohMH0pO28uZmllbGRWYWx1ZT10aGlzLl9kZWNvZGVGb3JtVmFsdWUoYyk7Y29uc3QgbD0oMCxhLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnIsa2V5OiJEViIsZ2V0QXJyYXk6ITB9KTtpZihvLmRlZmF1bHRGaWVsZFZhbHVlPXRoaXMuX2RlY29kZUZvcm1WYWx1ZShsKSx2b2lkIDA9PT1jJiZlLnhmYURhdGFzZXRzKXtjb25zdCB0PXRoaXMuX3RpdGxlLnN0cjt0JiYodGhpcy5faGFzVmFsdWVGcm9tWEZBPSEwLG8uZmllbGRWYWx1ZT1jPWUueGZhRGF0YXNldHMuZ2V0VmFsdWUodCkpfXZvaWQgMD09PWMmJm51bGwhPT1vLmRlZmF1bHRGaWVsZFZhbHVlJiYoby5maWVsZFZhbHVlPW8uZGVmYXVsdEZpZWxkVmFsdWUpLG8uYWx0ZXJuYXRpdmVUZXh0PSgwLG4uc3RyaW5nVG9QREZTdHJpbmcpKHIuZ2V0KCJUVSIpfHwiIiksdGhpcy5zZXREZWZhdWx0QXBwZWFyYW5jZShlKSxvLmhhc0FwcGVhcmFuY2V8fChvLmhhc0FwcGVhcmFuY2U9dGhpcy5fbmVlZEFwcGVhcmFuY2VzJiZ2b2lkIDAhPT1vLmZpZWxkVmFsdWUmJm51bGwhPT1vLmZpZWxkVmFsdWUpO2NvbnN0IGg9KDAsYS5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDpyLGtleToiRlQifSk7by5maWVsZFR5cGU9aCBpbnN0YW5jZW9mIHMuTmFtZT9oLm5hbWU6bnVsbDtjb25zdCB1PSgwLGEuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6cixrZXk6IkRSIn0pLGQ9ZS5hY3JvRm9ybS5nZXQoIkRSIiksZj1udWxsPT09KHQ9dGhpcy5hcHBlYXJhbmNlKXx8dm9pZCAwPT09dD92b2lkIDA6dC5kaWN0LmdldCgiUmVzb3VyY2VzIik7dGhpcy5fZmllbGRSZXNvdXJjZXM9e2xvY2FsUmVzb3VyY2VzOnUsYWNyb0Zvcm1SZXNvdXJjZXM6ZCxhcHBlYXJhbmNlUmVzb3VyY2VzOmYsbWVyZ2VkUmVzb3VyY2VzOnMuRGljdC5tZXJnZSh7eHJlZjppLGRpY3RBcnJheTpbdSxmLGRdLG1lcmdlU3ViRGljdHM6ITB9KX0sby5maWVsZEZsYWdzPSgwLGEuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6cixrZXk6IkZmIn0pLCghTnVtYmVyLmlzSW50ZWdlcihvLmZpZWxkRmxhZ3MpfHxvLmZpZWxkRmxhZ3M8MCkmJihvLmZpZWxkRmxhZ3M9MCksby5yZWFkT25seT10aGlzLmhhc0ZpZWxkRmxhZyhuLkFubm90YXRpb25GaWVsZEZsYWcuUkVBRE9OTFkpLG8ucmVxdWlyZWQ9dGhpcy5oYXNGaWVsZEZsYWcobi5Bbm5vdGF0aW9uRmllbGRGbGFnLlJFUVVJUkVEKSxvLmhpZGRlbj10aGlzLl9oYXNGbGFnKG8uYW5ub3RhdGlvbkZsYWdzLG4uQW5ub3RhdGlvbkZsYWcuSElEREVOKX1fZGVjb2RlRm9ybVZhbHVlKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2UuZmlsdGVyKChlPT4ic3RyaW5nIj09dHlwZW9mIGUpKS5tYXAoKGU9PigwLG4uc3RyaW5nVG9QREZTdHJpbmcpKGUpKSk6ZSBpbnN0YW5jZW9mIHMuTmFtZT8oMCxuLnN0cmluZ1RvUERGU3RyaW5nKShlLm5hbWUpOiJzdHJpbmciPT10eXBlb2YgZT8oMCxuLnN0cmluZ1RvUERGU3RyaW5nKShlKTpudWxsfWhhc0ZpZWxkRmxhZyhlKXtyZXR1cm4hISh0aGlzLmRhdGEuZmllbGRGbGFncyZlKX1nZXRSb3RhdGlvbk1hdHJpeChlKXt2YXIgdDtsZXQgcj1udWxsPT1lfHxudWxsPT09KHQ9ZS5nZXQodGhpcy5kYXRhLmlkKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQucm90YXRpb247aWYodm9pZCAwPT09ciYmKHI9dGhpcy5yb3RhdGlvbiksMD09PXIpcmV0dXJuIG4uSURFTlRJVFlfTUFUUklYO2NvbnN0IGk9dGhpcy5kYXRhLnJlY3RbMl0tdGhpcy5kYXRhLnJlY3RbMF0scz10aGlzLmRhdGEucmVjdFszXS10aGlzLmRhdGEucmVjdFsxXTtyZXR1cm4oMCxhLmdldFJvdGF0aW9uTWF0cml4KShyLGkscyl9Z2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGUpe3ZhciB0O2xldCByPW51bGw9PWV8fG51bGw9PT0odD1lLmdldCh0aGlzLmRhdGEuaWQpKXx8dm9pZCAwPT09dD92b2lkIDA6dC5yb3RhdGlvbjtpZih2b2lkIDA9PT1yJiYocj10aGlzLnJvdGF0aW9uKSwhdGhpcy5iYWNrZ3JvdW5kQ29sb3ImJiF0aGlzLmJvcmRlckNvbG9yKXJldHVybiIiO2NvbnN0IG49dGhpcy5kYXRhLnJlY3RbMl0tdGhpcy5kYXRhLnJlY3RbMF0sYT10aGlzLmRhdGEucmVjdFszXS10aGlzLmRhdGEucmVjdFsxXSxzPTA9PT1yfHwxODA9PT1yPyIwIDAgIi5jb25jYXQobiwiICIpLmNvbmNhdChhLCIgcmUiKToiMCAwICIuY29uY2F0KGEsIiAiKS5jb25jYXQobiwiIHJlIik7bGV0IG89IiI7cmV0dXJuIHRoaXMuYmFja2dyb3VuZENvbG9yJiYobz0iIi5jb25jYXQoKDAsaS5nZXRQZGZDb2xvcikodGhpcy5iYWNrZ3JvdW5kQ29sb3IsITApLCIgIikuY29uY2F0KHMsIiBmICIpKSx0aGlzLmJvcmRlckNvbG9yJiYobys9IiIuY29uY2F0KHRoaXMuYm9yZGVyU3R5bGUud2lkdGh8fDEsIiB3ICIpLmNvbmNhdCgoMCxpLmdldFBkZkNvbG9yKSh0aGlzLmJvcmRlckNvbG9yLCExKSwiICIpLmNvbmNhdChzLCIgUyAiKSksb31hc3luYyBnZXRPcGVyYXRvckxpc3QoZSx0LHIsYSxpKXtpZihhJiYhKHRoaXMgaW5zdGFuY2VvZiBUKSYmIXRoaXMuZGF0YS5ub0hUTUwmJiF0aGlzLmRhdGEuaGFzT3duQ2FudmFzKXJldHVybntvcExpc3Q6bmV3IG0uT3BlcmF0b3JMaXN0LHNlcGFyYXRlRm9ybTohMCxzZXBhcmF0ZUNhbnZhczohMX07aWYoIXRoaXMuX2hhc1RleHQpcmV0dXJuIHN1cGVyLmdldE9wZXJhdG9yTGlzdChlLHQscixhLGkpO2NvbnN0IHM9YXdhaXQgdGhpcy5fZ2V0QXBwZWFyYW5jZShlLHQscixpKTtpZih0aGlzLmFwcGVhcmFuY2UmJm51bGw9PT1zKXJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LHIsYSxpKTtjb25zdCBjPW5ldyBtLk9wZXJhdG9yTGlzdDtpZighdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2V8fG51bGw9PT1zKXJldHVybntvcExpc3Q6YyxzZXBhcmF0ZUZvcm06ITEsc2VwYXJhdGVDYW52YXM6ITF9O2NvbnN0IGw9ISEodGhpcy5kYXRhLmhhc093bkNhbnZhcyYmciZuLlJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSksaD1bMCwwLHRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdLHRoaXMuZGF0YS5yZWN0WzNdLXRoaXMuZGF0YS5yZWN0WzFdXSx1PXgodGhpcy5kYXRhLnJlY3QsaCxbMSwwLDAsMSwwLDBdKTtsZXQgZDt0aGlzLm9jJiYoZD1hd2FpdCBlLnBhcnNlTWFya2VkQ29udGVudFByb3BzKHRoaXMub2MsbnVsbCkpLHZvaWQgMCE9PWQmJmMuYWRkT3Aobi5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsWyJPQyIsZF0pLGMuYWRkT3Aobi5PUFMuYmVnaW5Bbm5vdGF0aW9uLFt0aGlzLmRhdGEuaWQsdGhpcy5kYXRhLnJlY3QsdSx0aGlzLmdldFJvdGF0aW9uTWF0cml4KGkpLGxdKTtjb25zdCBmPW5ldyBvLlN0cmluZ1N0cmVhbShzKTtyZXR1cm4gYXdhaXQgZS5nZXRPcGVyYXRvckxpc3Qoe3N0cmVhbTpmLHRhc2s6dCxyZXNvdXJjZXM6dGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLG9wZXJhdG9yTGlzdDpjfSksYy5hZGRPcChuLk9QUy5lbmRBbm5vdGF0aW9uLFtdKSx2b2lkIDAhPT1kJiZjLmFkZE9wKG4uT1BTLmVuZE1hcmtlZENvbnRlbnQsW10pLHtvcExpc3Q6YyxzZXBhcmF0ZUZvcm06ITEsc2VwYXJhdGVDYW52YXM6bH19X2dldE1LRGljdChlKXtjb25zdCB0PW5ldyBzLkRpY3QobnVsbCk7cmV0dXJuIGUmJnQuc2V0KCJSIixlKSx0aGlzLmJvcmRlckNvbG9yJiZ0LnNldCgiQkMiLHcodGhpcy5ib3JkZXJDb2xvcikpLHRoaXMuYmFja2dyb3VuZENvbG9yJiZ0LnNldCgiQkciLHcodGhpcy5iYWNrZ3JvdW5kQ29sb3IpKSx0LnNpemU+MD90Om51bGx9YW1lbmRTYXZlZERpY3QoZSx0KXt9YXN5bmMgc2F2ZShlLHQscil7dmFyIGk7Y29uc3QgbD1udWxsPT1yP3ZvaWQgMDpyLmdldCh0aGlzLmRhdGEuaWQpO2xldCBoPW51bGw9PWw/dm9pZCAwOmwudmFsdWUsdT1udWxsPT1sP3ZvaWQgMDpsLnJvdGF0aW9uO2lmKGg9PT10aGlzLmRhdGEuZmllbGRWYWx1ZXx8dm9pZCAwPT09aCl7aWYoIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQSYmdm9pZCAwPT09dSlyZXR1cm4gbnVsbDtofHwoaD10aGlzLmRhdGEuZmllbGRWYWx1ZSl9aWYodm9pZCAwPT09dSYmIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQSYmQXJyYXkuaXNBcnJheShoKSYmQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuZmllbGRWYWx1ZSkmJmgubGVuZ3RoPT09dGhpcy5kYXRhLmZpZWxkVmFsdWUubGVuZ3RoJiZoLmV2ZXJ5KCgoZSx0KT0+ZT09PXRoaXMuZGF0YS5maWVsZFZhbHVlW3RdKSkpcmV0dXJuIG51bGw7dm9pZCAwPT09dSYmKHU9dGhpcy5yb3RhdGlvbik7bGV0IGQ9bnVsbDtpZighdGhpcy5fbmVlZEFwcGVhcmFuY2VzJiYoZD1hd2FpdCB0aGlzLl9nZXRBcHBlYXJhbmNlKGUsdCxuLlJlbmRlcmluZ0ludGVudEZsYWcuU0FWRSxyKSxudWxsPT09ZCkpcmV0dXJuIG51bGw7bGV0IGY9ITE7bnVsbCE9PShpPWQpJiZ2b2lkIDAhPT1pJiZpLm5lZWRBcHBlYXJhbmNlcyYmKGY9ITAsZD1udWxsKTtjb25zdHt4cmVmOmd9PWUscD1nLmZldGNoSWZSZWYodGhpcy5yZWYpO2lmKCEocCBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuIG51bGw7Y29uc3QgbT1uZXcgcy5EaWN0KGcpO2Zvcihjb25zdCBlIG9mIHAuZ2V0S2V5cygpKSJBUCIhPT1lJiZtLnNldChlLHAuZ2V0UmF3KGUpKTtjb25zdCBiPXtwYXRoOnRoaXMuZGF0YS5maWVsZE5hbWUsdmFsdWU6aH0seT1lPT4oMCxhLmlzQXNjaWkpKGUpP2U6KDAsYS5zdHJpbmdUb1VURjE2U3RyaW5nKShlLCEwKTttLnNldCgiViIsQXJyYXkuaXNBcnJheShoKT9oLm1hcCh5KTp5KGgpKSx0aGlzLmFtZW5kU2F2ZWREaWN0KHIsbSk7Y29uc3Qgdz10aGlzLl9nZXRNS0RpY3QodSk7dyYmbS5zZXQoIk1LIix3KTtjb25zdCB2PWcuZW5jcnlwdCx4PXY/di5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLHRoaXMucmVmLmdlbik6bnVsbCxTPVtdLEE9W3tyZWY6dGhpcy5yZWYsZGF0YToiIix4ZmE6YixuZWVkQXBwZWFyYW5jZXM6Zn1dO2lmKG51bGwhPT1kKXtjb25zdCBlPWcuZ2V0TmV3VGVtcG9yYXJ5UmVmKCksdD1uZXcgcy5EaWN0KGcpO20uc2V0KCJBUCIsdCksdC5zZXQoIk4iLGUpO2xldCBhPW51bGw7diYmKGE9di5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0oZS5udW0sZS5nZW4pKTtjb25zdCBpPXRoaXMuX2dldFNhdmVGaWVsZFJlc291cmNlcyhnKSxsPW5ldyBvLlN0cmluZ1N0cmVhbShkKSxoPWwuZGljdD1uZXcgcy5EaWN0KGcpO2guc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGb3JtIikpLGguc2V0KCJSZXNvdXJjZXMiLGkpLGguc2V0KCJCQm94IixbMCwwLHRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdLHRoaXMuZGF0YS5yZWN0WzNdLXRoaXMuZGF0YS5yZWN0WzFdXSk7Y29uc3QgdT10aGlzLmdldFJvdGF0aW9uTWF0cml4KHIpO3UhPT1uLklERU5USVRZX01BVFJJWCYmaC5zZXQoIk1hdHJpeCIsdSksYXdhaXQoMCxjLndyaXRlT2JqZWN0KShlLGwsUyxhKSxBLnB1c2goe3JlZjplLGRhdGE6Uy5qb2luKCIiKSx4ZmE6bnVsbCxuZWVkQXBwZWFyYW5jZXM6ITF9KSxTLmxlbmd0aD0wfXJldHVybiBtLnNldCgiTSIsIkQ6Ii5jb25jYXQoKDAsbi5nZXRNb2RpZmljYXRpb25EYXRlKSgpKSksYXdhaXQoMCxjLndyaXRlT2JqZWN0KSh0aGlzLnJlZixtLFMseCksQVswXS5kYXRhPVMuam9pbigiIiksQX1hc3luYyBfZ2V0QXBwZWFyYW5jZShlLHQscixzKXtpZih0aGlzLmhhc0ZpZWxkRmxhZyhuLkFubm90YXRpb25GaWVsZEZsYWcuUEFTU1dPUkQpKXJldHVybiBudWxsO2NvbnN0IG89bnVsbD09cz92b2lkIDA6cy5nZXQodGhpcy5kYXRhLmlkKTtsZXQgYyxsO2lmKG8mJihjPW8uZm9ybWF0dGVkVmFsdWV8fG8udmFsdWUsbD1vLnJvdGF0aW9uKSx2b2lkIDA9PT1sJiZ2b2lkIDA9PT1jJiYhdGhpcy5fbmVlZEFwcGVhcmFuY2VzJiYoIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQXx8dGhpcy5hcHBlYXJhbmNlKSlyZXR1cm4gbnVsbDtjb25zdCBoPXRoaXMuZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKHMpO2lmKHZvaWQgMD09PWMmJihjPXRoaXMuZGF0YS5maWVsZFZhbHVlLCFjKSlyZXR1cm4iL1R4IEJNQyBxICIuY29uY2F0KGgsIlEgRU1DIik7aWYoQXJyYXkuaXNBcnJheShjKSYmMT09PWMubGVuZ3RoJiYoYz1jWzBdKSwoMCxuLmFzc2VydCkoInN0cmluZyI9PXR5cGVvZiBjLCJFeHBlY3RlZCBgdmFsdWVgIHRvIGJlIGEgc3RyaW5nLiIpLGM9Yy50cmltKCksdGhpcy5kYXRhLmNvbWJvKXtjb25zdCBlPXRoaXMuZGF0YS5vcHRpb25zLmZpbmQoKGU9PntsZXR7ZXhwb3J0VmFsdWU6dH09ZTtyZXR1cm4gYz09PXR9KSk7Yz0obnVsbD09ZT92b2lkIDA6ZS5kaXNwbGF5VmFsdWUpfHxjfWlmKCIiPT09YylyZXR1cm4iL1R4IEJNQyBxICIuY29uY2F0KGgsIlEgRU1DIik7dm9pZCAwPT09bCYmKGw9dGhpcy5yb3RhdGlvbik7bGV0IHUsZD0tMTt0aGlzLmRhdGEubXVsdGlMaW5lPyh1PWMuc3BsaXQoL1xyXG4/fFxuLykubWFwKChlPT5lLm5vcm1hbGl6ZSgiTkZDIikpKSxkPXUubGVuZ3RoKTp1PVtjLnJlcGxhY2UoL1xyXG4/fFxuLywiIikubm9ybWFsaXplKCJORkMiKV07bGV0IGY9dGhpcy5kYXRhLnJlY3RbM10tdGhpcy5kYXRhLnJlY3RbMV0sZz10aGlzLmRhdGEucmVjdFsyXS10aGlzLmRhdGEucmVjdFswXTs5MCE9PWwmJjI3MCE9PWx8fChbZyxmXT1bZixnXSksdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2V8fCh0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhPSgwLGkucGFyc2VEZWZhdWx0QXBwZWFyYW5jZSkodGhpcy5fZGVmYXVsdEFwcGVhcmFuY2U9Ii9IZWx2ZXRpY2EgMCBUZiAwIGciKSk7bGV0IHAsbSxiLHk9YXdhaXQgQy5fZ2V0Rm9udERhdGEoZSx0LHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEsdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzKTtjb25zdCB3PVtdO2xldCB2PSExO2Zvcihjb25zdCBlIG9mIHUpe2NvbnN0IHQ9eS5lbmNvZGVTdHJpbmcoZSk7dC5sZW5ndGg+MSYmKHY9ITApLHcucHVzaCh0LmpvaW4oIiIpKX1pZih2JiZyJm4uUmVuZGVyaW5nSW50ZW50RmxhZy5TQVZFKXJldHVybntuZWVkQXBwZWFyYW5jZXM6ITB9O2lmKHYmJnRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKXtjb25zdCByPXRoaXMuZGF0YS5jb21iPyJtb25vc3BhY2UiOiJzYW5zLXNlcmlmIixuPW5ldyBpLkZha2VVbmljb2RlRm9udChlLnhyZWYscikscz1uLmNyZWF0ZUZvbnRSZXNvdXJjZXModS5qb2luKCIiKSksbz1zLmdldFJhdygiRm9udCIpO2lmKHRoaXMuX2ZpZWxkUmVzb3VyY2VzLm1lcmdlZFJlc291cmNlcy5oYXMoIkZvbnQiKSl7Y29uc3QgZT10aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMuZ2V0KCJGb250Iik7Zm9yKGNvbnN0IHQgb2Ygby5nZXRLZXlzKCkpZS5zZXQodCxvLmdldFJhdyh0KSl9ZWxzZSB0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMuc2V0KCJGb250IixvKTtjb25zdCBsPW4uZm9udE5hbWUubmFtZTt5PWF3YWl0IEMuX2dldEZvbnREYXRhKGUsdCx7Zm9udE5hbWU6bCxmb250U2l6ZTowfSxzKTtmb3IobGV0IGU9MCx0PXcubGVuZ3RoO2U8dDtlKyspd1tlXT0oMCxhLnN0cmluZ1RvVVRGMTZTdHJpbmcpKHVbZV0pO2NvbnN0IGg9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEpO3RoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemU9MCx0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnROYW1lPWwsW3AsbSxiXT10aGlzLl9jb21wdXRlRm9udFNpemUoZi0yLGctNCxjLHksZCksdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YT1ofWVsc2UgdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWR8fCgwLG4ud2FybikoIl9nZXRBcHBlYXJhbmNlOiBPZmZzY3JlZW5DYW52YXMgaXMgbm90IHN1cHBvcnRlZCwgYW5ub3RhdGlvbiBtYXkgbm90IHJlbmRlciBjb3JyZWN0bHkuIiksW3AsbSxiXT10aGlzLl9jb21wdXRlRm9udFNpemUoZi0yLGctNCxjLHksZCk7bGV0IHg9eS5kZXNjZW50O3g9aXNOYU4oeCk/bi5CQVNFTElORV9GQUNUT1IqYjpNYXRoLm1heChuLkJBU0VMSU5FX0ZBQ1RPUipiLE1hdGguYWJzKHgpKm0pO2NvbnN0IFM9TWF0aC5taW4oTWF0aC5mbG9vcigoZi1tKS8yKSwxKSxBPXRoaXMuZGF0YS50ZXh0QWxpZ25tZW50O2lmKHRoaXMuZGF0YS5tdWx0aUxpbmUpcmV0dXJuIHRoaXMuX2dldE11bHRpbGluZUFwcGVhcmFuY2UocCx3LHksbSxnLGYsQSwyLFMseCxiLHMpO2lmKHRoaXMuZGF0YS5jb21iKXJldHVybiB0aGlzLl9nZXRDb21iQXBwZWFyYW5jZShwLHksd1swXSxtLGcsZiwyLFMseCxiLHMpO2NvbnN0IGs9Uyt4O3JldHVybiAwPT09QXx8QT4yPyIvVHggQk1DIHEgIi5jb25jYXQoaCwiQlQgIikrcCsiIDEgMCAwIDEgIi5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoMiksIiAiKS5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoayksIiBUbSAoIikuY29uY2F0KCgwLGEuZXNjYXBlU3RyaW5nKSh3WzBdKSwiKSBUaiBFVCBRIEVNQyIpOiIvVHggQk1DIHEgIi5jb25jYXQoaCwiQlQgIikrcCsiIDEgMCAwIDEgMCAwIFRtICIuY29uY2F0KHRoaXMuX3JlbmRlclRleHQod1swXSx5LG0sZyxBLHtzaGlmdDowfSwyLGspLCIgRVQgUSBFTUMiKX1zdGF0aWMgYXN5bmMgX2dldEZvbnREYXRhKGUsdCxyLG4pe2NvbnN0IGE9bmV3IG0uT3BlcmF0b3JMaXN0LGk9e2ZvbnQ6bnVsbCxjbG9uZSgpe3JldHVybiB0aGlzfX0se2ZvbnROYW1lOm8sZm9udFNpemU6Y309cjtyZXR1cm4gYXdhaXQgZS5oYW5kbGVTZXRGb250KG4sW28mJnMuTmFtZS5nZXQobyksY10sbnVsbCxhLHQsaSxudWxsKSxpLmZvbnR9X2dldFRleHRXaWR0aChlLHQpe3JldHVybiB0LmNoYXJzVG9HbHlwaHMoZSkucmVkdWNlKCgoZSx0KT0+ZSt0LndpZHRoKSwwKS8xZTN9X2NvbXB1dGVGb250U2l6ZShlLHQscixhLHMpe2xldHtmb250U2l6ZTpvfT10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLGM9KG98fDEyKSpuLkxJTkVfRkFDVE9SLGw9TWF0aC5yb3VuZChlL2MpO2lmKCFvKXtjb25zdCBoPWU9Pk1hdGguZmxvb3IoMTAwKmUpLzEwMDtpZigtMT09PXMpe2NvbnN0IGk9dGhpcy5fZ2V0VGV4dFdpZHRoKHIsYSk7bz1oKE1hdGgubWluKGUvbi5MSU5FX0ZBQ1RPUixpPnQ/dC9pOjEvMCkpLGw9MX1lbHNle2NvbnN0IGk9ci5zcGxpdCgvXHJcbj98XG4vKSx1PVtdO2Zvcihjb25zdCBlIG9mIGkpe2NvbnN0IHQ9YS5lbmNvZGVTdHJpbmcoZSkuam9pbigiIikscj1hLmNoYXJzVG9HbHlwaHModCksbj1hLmdldENoYXJQb3NpdGlvbnModCk7dS5wdXNoKHtsaW5lOnQsZ2x5cGhzOnIscG9zaXRpb25zOm59KX1jb25zdCBkPXI9PntsZXQgbj0wO2Zvcihjb25zdCBpIG9mIHUpaWYobis9dGhpcy5fc3BsaXRMaW5lKG51bGwsYSxyLHQsaSkubGVuZ3RoKnIsbj5lKXJldHVybiEwO3JldHVybiExfTtmb3IobD1NYXRoLm1heChsLHMpO2M9ZS9sLG89aChjL24uTElORV9GQUNUT1IpLGQobyk7KWwrK31jb25zdHtmb250TmFtZTp1LGZvbnRDb2xvcjpkfT10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhO3RoaXMuX2RlZmF1bHRBcHBlYXJhbmNlPSgwLGkuY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2UpKHtmb250U2l6ZTpvLGZvbnROYW1lOnUsZm9udENvbG9yOmR9KX1yZXR1cm5bdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UsbyxlL2xdfV9yZW5kZXJUZXh0KGUsdCxyLG4saSxzLG8sYyl7bGV0IGw7bD0xPT09aT8obi10aGlzLl9nZXRUZXh0V2lkdGgoZSx0KSpyKS8yOjI9PT1pP24tdGhpcy5fZ2V0VGV4dFdpZHRoKGUsdCkqci1vOm87Y29uc3QgaD0oMCxhLm51bWJlclRvU3RyaW5nKShsLXMuc2hpZnQpO3JldHVybiBzLnNoaWZ0PWwsIiIuY29uY2F0KGgsIiAiKS5jb25jYXQoYz0oMCxhLm51bWJlclRvU3RyaW5nKShjKSwiIFRkICgiKS5jb25jYXQoKDAsYS5lc2NhcGVTdHJpbmcpKGUpLCIpIFRqIil9X2dldFNhdmVGaWVsZFJlc291cmNlcyhlKXt2YXIgdDtjb25zdHtsb2NhbFJlc291cmNlczpyLGFwcGVhcmFuY2VSZXNvdXJjZXM6bixhY3JvRm9ybVJlc291cmNlczphfT10aGlzLl9maWVsZFJlc291cmNlcyxpPW51bGw9PT0odD10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhKXx8dm9pZCAwPT09dD92b2lkIDA6dC5mb250TmFtZTtpZighaSlyZXR1cm4gcnx8cy5EaWN0LmVtcHR5O2Zvcihjb25zdCBlIG9mW3Isbl0paWYoZSBpbnN0YW5jZW9mIHMuRGljdCl7Y29uc3QgdD1lLmdldCgiRm9udCIpO2lmKHQgaW5zdGFuY2VvZiBzLkRpY3QmJnQuaGFzKGkpKXJldHVybiBlfWlmKGEgaW5zdGFuY2VvZiBzLkRpY3Qpe2NvbnN0IHQ9YS5nZXQoIkZvbnQiKTtpZih0IGluc3RhbmNlb2Ygcy5EaWN0JiZ0LmhhcyhpKSl7Y29uc3Qgbj1uZXcgcy5EaWN0KGUpO24uc2V0KGksdC5nZXRSYXcoaSkpO2NvbnN0IGE9bmV3IHMuRGljdChlKTtyZXR1cm4gYS5zZXQoIkZvbnQiLG4pLHMuRGljdC5tZXJnZSh7eHJlZjplLGRpY3RBcnJheTpbYSxyXSxtZXJnZVN1YkRpY3RzOiEwfSl9fXJldHVybiByfHxzLkRpY3QuZW1wdHl9Z2V0RmllbGRPYmplY3QoKXtyZXR1cm4gbnVsbH19Y2xhc3MgTyBleHRlbmRzIEN7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5kYXRhLmhhc093bkNhbnZhcz10aGlzLmRhdGEucmVhZE9ubHkmJiF0aGlzLmRhdGEubm9IVE1MLHRoaXMuX2hhc1RleHQ9ITA7Y29uc3QgdD1lLmRpY3Q7InN0cmluZyIhPXR5cGVvZiB0aGlzLmRhdGEuZmllbGRWYWx1ZSYmKHRoaXMuZGF0YS5maWVsZFZhbHVlPSIiKTtsZXQgcj0oMCxhLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnQsa2V5OiJRIn0pOyghTnVtYmVyLmlzSW50ZWdlcihyKXx8cjwwfHxyPjIpJiYocj1udWxsKSx0aGlzLmRhdGEudGV4dEFsaWdubWVudD1yO2xldCBpPSgwLGEuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6dCxrZXk6Ik1heExlbiJ9KTsoIU51bWJlci5pc0ludGVnZXIoaSl8fGk8MCkmJihpPTApLHRoaXMuZGF0YS5tYXhMZW49aSx0aGlzLmRhdGEubXVsdGlMaW5lPXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpLHRoaXMuZGF0YS5jb21iPXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CKSYmIXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpJiYhdGhpcy5oYXNGaWVsZEZsYWcobi5Bbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKSYmIXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSYmMCE9PXRoaXMuZGF0YS5tYXhMZW4sdGhpcy5kYXRhLmRvTm90U2Nyb2xsPXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5ET05PVFNDUk9MTCl9Z2V0IGhhc1RleHRDb250ZW50KCl7cmV0dXJuISF0aGlzLmFwcGVhcmFuY2UmJiF0aGlzLl9uZWVkQXBwZWFyYW5jZXN9X2dldENvbWJBcHBlYXJhbmNlKGUsdCxyLG4saSxzLG8sYyxsLGgsdSl7Y29uc3QgZD1pL3RoaXMuZGF0YS5tYXhMZW4sZj10aGlzLmdldEJvcmRlckFuZEJhY2tncm91bmRBcHBlYXJhbmNlcyh1KSxnPVtdLHA9dC5nZXRDaGFyUG9zaXRpb25zKHIpO2Zvcihjb25zdFtlLHRdb2YgcClnLnB1c2goIigiLmNvbmNhdCgoMCxhLmVzY2FwZVN0cmluZykoci5zdWJzdHJpbmcoZSx0KSksIikgVGoiKSk7Y29uc3QgbT1nLmpvaW4oIiAiLmNvbmNhdCgoMCxhLm51bWJlclRvU3RyaW5nKShkKSwiIDAgVGQgIikpO3JldHVybiIvVHggQk1DIHEgIi5jb25jYXQoZiwiQlQgIikrZSsiIDEgMCAwIDEgIi5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykobyksIiAiKS5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoYytsKSwiIFRtICIpLmNvbmNhdChtLCIgRVQgUSBFTUMiKX1fZ2V0TXVsdGlsaW5lQXBwZWFyYW5jZShlLHQscixuLGkscyxvLGMsbCxoLHUsZCl7Y29uc3QgZj1bXSxnPWktMipjLHA9e3NoaWZ0OjB9O2ZvcihsZXQgZT0wLGE9dC5sZW5ndGg7ZTxhO2UrKyl7Y29uc3QgYT10W2VdLHM9dGhpcy5fc3BsaXRMaW5lKGEscixuLGcpO2ZvcihsZXQgdD0wLGE9cy5sZW5ndGg7dDxhO3QrKyl7Y29uc3QgYT1zW3RdLGQ9MD09PWUmJjA9PT10Py1sLSh1LWgpOi11O2YucHVzaCh0aGlzLl9yZW5kZXJUZXh0KGEscixuLGksbyxwLGMsZCkpfX1jb25zdCBtPXRoaXMuZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGQpLGI9Zi5qb2luKCJcbiIpO3JldHVybiIvVHggQk1DIHEgIi5jb25jYXQobSwiQlQgIikrZSsiIDEgMCAwIDEgMCAiLmNvbmNhdCgoMCxhLm51bWJlclRvU3RyaW5nKShzKSwiIFRtICIpLmNvbmNhdChiLCIgRVQgUSBFTUMiKX1fc3BsaXRMaW5lKGUsdCxyLG4pe2xldCBhPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTp7fTtlPWEubGluZXx8ZTtjb25zdCBpPWEuZ2x5cGhzfHx0LmNoYXJzVG9HbHlwaHMoZSk7aWYoaS5sZW5ndGg8PTEpcmV0dXJuW2VdO2NvbnN0IHM9YS5wb3NpdGlvbnN8fHQuZ2V0Q2hhclBvc2l0aW9ucyhlKSxvPXIvMWUzLGM9W107bGV0IGw9LTEsaD0tMSx1PS0xLGQ9MCxmPTA7Zm9yKGxldCB0PTAscj1pLmxlbmd0aDt0PHI7dCsrKXtjb25zdFtyLGFdPXNbdF0sZz1pW3RdLHA9Zy53aWR0aCpvOyIgIj09PWcudW5pY29kZT9mK3A+bj8oYy5wdXNoKGUuc3Vic3RyaW5nKGQscikpLGQ9cixmPXAsbD0tMSx1PS0xKTooZis9cCxsPXIsaD1hLHU9dCk6ZitwPm4/LTEhPT1sPyhjLnB1c2goZS5zdWJzdHJpbmcoZCxoKSksZD1oLHQ9dSsxLGw9LTEsZj0wKTooYy5wdXNoKGUuc3Vic3RyaW5nKGQscikpLGQ9cixmPXApOmYrPXB9cmV0dXJuIGQ8ZS5sZW5ndGgmJmMucHVzaChlLnN1YnN0cmluZyhkLGUubGVuZ3RoKSksY31nZXRGaWVsZE9iamVjdCgpe3JldHVybntpZDp0aGlzLmRhdGEuaWQsdmFsdWU6dGhpcy5kYXRhLmZpZWxkVmFsdWUsZGVmYXVsdFZhbHVlOnRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZXx8IiIsbXVsdGlsaW5lOnRoaXMuZGF0YS5tdWx0aUxpbmUscGFzc3dvcmQ6dGhpcy5oYXNGaWVsZEZsYWcobi5Bbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKSxjaGFyTGltaXQ6dGhpcy5kYXRhLm1heExlbixjb21iOnRoaXMuZGF0YS5jb21iLGVkaXRhYmxlOiF0aGlzLmRhdGEucmVhZE9ubHksaGlkZGVuOnRoaXMuZGF0YS5oaWRkZW4sbmFtZTp0aGlzLmRhdGEuZmllbGROYW1lLHJlY3Q6dGhpcy5kYXRhLnJlY3QsYWN0aW9uczp0aGlzLmRhdGEuYWN0aW9ucyxwYWdlOnRoaXMuZGF0YS5wYWdlSW5kZXgsc3Ryb2tlQ29sb3I6dGhpcy5kYXRhLmJvcmRlckNvbG9yLGZpbGxDb2xvcjp0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yLHJvdGF0aW9uOnRoaXMucm90YXRpb24sdHlwZToidGV4dCJ9fX1jbGFzcyBGIGV4dGVuZHMgQ3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmNoZWNrZWRBcHBlYXJhbmNlPW51bGwsdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlPW51bGwsdGhpcy5kYXRhLmNoZWNrQm94PSF0aGlzLmhhc0ZpZWxkRmxhZyhuLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pJiYhdGhpcy5oYXNGaWVsZEZsYWcobi5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pLHRoaXMuZGF0YS5yYWRpb0J1dHRvbj10aGlzLmhhc0ZpZWxkRmxhZyhuLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pJiYhdGhpcy5oYXNGaWVsZEZsYWcobi5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pLHRoaXMuZGF0YS5wdXNoQnV0dG9uPXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5QVVNIQlVUVE9OKSx0aGlzLmRhdGEuaXNUb29sdGlwT25seT0hMSx0aGlzLmRhdGEuY2hlY2tCb3g/dGhpcy5fcHJvY2Vzc0NoZWNrQm94KGUpOnRoaXMuZGF0YS5yYWRpb0J1dHRvbj90aGlzLl9wcm9jZXNzUmFkaW9CdXR0b24oZSk6dGhpcy5kYXRhLnB1c2hCdXR0b24/KHRoaXMuZGF0YS5oYXNPd25DYW52YXM9ITAsdGhpcy5fcHJvY2Vzc1B1c2hCdXR0b24oZSkpOigwLG4ud2FybikoIkludmFsaWQgZmllbGQgZmxhZ3MgZm9yIGJ1dHRvbiB3aWRnZXQgYW5ub3RhdGlvbiIpfWFzeW5jIGdldE9wZXJhdG9yTGlzdChlLHQscixhLGkpe2lmKHRoaXMuZGF0YS5wdXNoQnV0dG9uKXJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LHIsITEsaSk7bGV0IHM9bnVsbCxvPW51bGw7aWYoaSl7Y29uc3QgZT1pLmdldCh0aGlzLmRhdGEuaWQpO3M9ZT9lLnZhbHVlOm51bGwsbz1lP2Uucm90YXRpb246bnVsbH1pZihudWxsPT09cyYmdGhpcy5hcHBlYXJhbmNlKXJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LHIsYSxpKTtudWxsPT1zJiYocz10aGlzLmRhdGEuY2hlY2tCb3g/dGhpcy5kYXRhLmZpZWxkVmFsdWU9PT10aGlzLmRhdGEuZXhwb3J0VmFsdWU6dGhpcy5kYXRhLmZpZWxkVmFsdWU9PT10aGlzLmRhdGEuYnV0dG9uVmFsdWUpO2NvbnN0IGM9cz90aGlzLmNoZWNrZWRBcHBlYXJhbmNlOnRoaXMudW5jaGVja2VkQXBwZWFyYW5jZTtpZihjKXtjb25zdCBzPXRoaXMuYXBwZWFyYW5jZSxsPWMuZGljdC5nZXRBcnJheSgiTWF0cml4Iil8fG4uSURFTlRJVFlfTUFUUklYO28mJmMuZGljdC5zZXQoIk1hdHJpeCIsdGhpcy5nZXRSb3RhdGlvbk1hdHJpeChpKSksdGhpcy5hcHBlYXJhbmNlPWM7Y29uc3QgaD1zdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LHIsYSxpKTtyZXR1cm4gdGhpcy5hcHBlYXJhbmNlPXMsYy5kaWN0LnNldCgiTWF0cml4IixsKSxofXJldHVybntvcExpc3Q6bmV3IG0uT3BlcmF0b3JMaXN0LHNlcGFyYXRlRm9ybTohMSxzZXBhcmF0ZUNhbnZhczohMX19YXN5bmMgc2F2ZShlLHQscil7cmV0dXJuIHRoaXMuZGF0YS5jaGVja0JveD90aGlzLl9zYXZlQ2hlY2tib3goZSx0LHIpOnRoaXMuZGF0YS5yYWRpb0J1dHRvbj90aGlzLl9zYXZlUmFkaW9CdXR0b24oZSx0LHIpOm51bGx9YXN5bmMgX3NhdmVDaGVja2JveChlLHQscil7aWYoIXIpcmV0dXJuIG51bGw7Y29uc3QgYT1yLmdldCh0aGlzLmRhdGEuaWQpO2xldCBpPW51bGw9PWE/dm9pZCAwOmEucm90YXRpb24sbz1udWxsPT1hP3ZvaWQgMDphLnZhbHVlO2lmKHZvaWQgMD09PWkpe2lmKHZvaWQgMD09PW8pcmV0dXJuIG51bGw7aWYodGhpcy5kYXRhLmZpZWxkVmFsdWU9PT10aGlzLmRhdGEuZXhwb3J0VmFsdWU9PT1vKXJldHVybiBudWxsfWNvbnN0IGw9ZS54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpO2lmKCEobCBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuIG51bGw7dm9pZCAwPT09aSYmKGk9dGhpcy5yb3RhdGlvbiksdm9pZCAwPT09byYmKG89dGhpcy5kYXRhLmZpZWxkVmFsdWU9PT10aGlzLmRhdGEuZXhwb3J0VmFsdWUpO2NvbnN0IGg9e3BhdGg6dGhpcy5kYXRhLmZpZWxkTmFtZSx2YWx1ZTpvP3RoaXMuZGF0YS5leHBvcnRWYWx1ZToiIn0sdT1zLk5hbWUuZ2V0KG8/dGhpcy5kYXRhLmV4cG9ydFZhbHVlOiJPZmYiKTtsLnNldCgiViIsdSksbC5zZXQoIkFTIix1KSxsLnNldCgiTSIsIkQ6Ii5jb25jYXQoKDAsbi5nZXRNb2RpZmljYXRpb25EYXRlKSgpKSk7Y29uc3QgZD10aGlzLl9nZXRNS0RpY3QoaSk7ZCYmbC5zZXQoIk1LIixkKTtjb25zdCBmPWUueHJlZi5lbmNyeXB0O2xldCBnPW51bGw7ZiYmKGc9Zi5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLHRoaXMucmVmLmdlbikpO2NvbnN0IHA9WyIiLmNvbmNhdCh0aGlzLnJlZi5udW0sIiAiKS5jb25jYXQodGhpcy5yZWYuZ2VuLCIgb2JqXG4iKV07cmV0dXJuIGF3YWl0KDAsYy53cml0ZURpY3QpKGwscCxnKSxwLnB1c2goIlxuZW5kb2JqXG4iKSxbe3JlZjp0aGlzLnJlZixkYXRhOnAuam9pbigiIikseGZhOmh9XX1hc3luYyBfc2F2ZVJhZGlvQnV0dG9uKGUsdCxyKXtpZighcilyZXR1cm4gbnVsbDtjb25zdCBhPXIuZ2V0KHRoaXMuZGF0YS5pZCk7bGV0IGk9bnVsbD09YT92b2lkIDA6YS5yb3RhdGlvbixvPW51bGw9PWE/dm9pZCAwOmEudmFsdWU7aWYodm9pZCAwPT09aSl7aWYodm9pZCAwPT09bylyZXR1cm4gbnVsbDtpZih0aGlzLmRhdGEuZmllbGRWYWx1ZT09PXRoaXMuZGF0YS5idXR0b25WYWx1ZT09PW8pcmV0dXJuIG51bGx9Y29uc3QgbD1lLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7aWYoIShsIGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm4gbnVsbDt2b2lkIDA9PT1vJiYobz10aGlzLmRhdGEuZmllbGRWYWx1ZT09PXRoaXMuZGF0YS5idXR0b25WYWx1ZSksdm9pZCAwPT09aSYmKGk9dGhpcy5yb3RhdGlvbik7Y29uc3QgaD17cGF0aDp0aGlzLmRhdGEuZmllbGROYW1lLHZhbHVlOm8/dGhpcy5kYXRhLmJ1dHRvblZhbHVlOiIifSx1PXMuTmFtZS5nZXQobz90aGlzLmRhdGEuYnV0dG9uVmFsdWU6Ik9mZiIpO2xldCBkPW51bGw7Y29uc3QgZj1lLnhyZWYuZW5jcnlwdDtpZihvKWlmKHRoaXMucGFyZW50IGluc3RhbmNlb2Ygcy5SZWYpe2NvbnN0IHQ9ZS54cmVmLmZldGNoKHRoaXMucGFyZW50KTtsZXQgcj1udWxsO2YmJihyPWYuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHRoaXMucGFyZW50Lm51bSx0aGlzLnBhcmVudC5nZW4pKSx0LnNldCgiViIsdSksZD1bIiIuY29uY2F0KHRoaXMucGFyZW50Lm51bSwiICIpLmNvbmNhdCh0aGlzLnBhcmVudC5nZW4sIiBvYmpcbiIpXSxhd2FpdCgwLGMud3JpdGVEaWN0KSh0LGQsciksZC5wdXNoKCJcbmVuZG9ialxuIil9ZWxzZSB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIHMuRGljdCYmdGhpcy5wYXJlbnQuc2V0KCJWIix1KTtsLnNldCgiQVMiLHUpLGwuc2V0KCJNIiwiRDoiLmNvbmNhdCgoMCxuLmdldE1vZGlmaWNhdGlvbkRhdGUpKCkpKTtjb25zdCBnPXRoaXMuX2dldE1LRGljdChpKTtnJiZsLnNldCgiTUsiLGcpO2xldCBwPW51bGw7ZiYmKHA9Zi5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLHRoaXMucmVmLmdlbikpO2NvbnN0IG09WyIiLmNvbmNhdCh0aGlzLnJlZi5udW0sIiAiKS5jb25jYXQodGhpcy5yZWYuZ2VuLCIgb2JqXG4iKV07YXdhaXQoMCxjLndyaXRlRGljdCkobCxtLHApLG0ucHVzaCgiXG5lbmRvYmpcbiIpO2NvbnN0IGI9W3tyZWY6dGhpcy5yZWYsZGF0YTptLmpvaW4oIiIpLHhmYTpofV07cmV0dXJuIG51bGwhPT1kJiZiLnB1c2goe3JlZjp0aGlzLnBhcmVudCxkYXRhOmQuam9pbigiIikseGZhOm51bGx9KSxifV9nZXREZWZhdWx0Q2hlY2tlZEFwcGVhcmFuY2UoZSx0KXtjb25zdCByPXRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdLGk9dGhpcy5kYXRhLnJlY3RbM10tdGhpcy5kYXRhLnJlY3RbMV0sYz1bMCwwLHIsaV0sbD0uOCpNYXRoLm1pbihyLGkpO2xldCBoLHU7ImNoZWNrIj09PXQ/KGg9e3dpZHRoOi43NTUqbCxoZWlnaHQ6LjcwNSpsfSx1PSIzIik6ImRpc2MiPT09dD8oaD17d2lkdGg6Ljc5MSpsLGhlaWdodDouNzA1Kmx9LHU9ImwiKTooMCxuLnVucmVhY2hhYmxlKSgiX2dldERlZmF1bHRDaGVja2VkQXBwZWFyYW5jZSAtIHVuc3VwcG9ydGVkIHR5cGU6ICIuY29uY2F0KHQpKTtjb25zdCBkPSJxIEJUIC9QZGZKc1phRGIgIi5jb25jYXQobCwiIFRmIDAgZyAiKS5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoKHItaC53aWR0aCkvMiksIiAiKS5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoKGktaC5oZWlnaHQpLzIpLCIgVGQgKCIpLmNvbmNhdCh1LCIpIFRqIEVUIFEiKSxmPW5ldyBzLkRpY3QoZS54cmVmKTtmLnNldCgiRm9ybVR5cGUiLDEpLGYuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGb3JtIikpLGYuc2V0KCJUeXBlIixzLk5hbWUuZ2V0KCJYT2JqZWN0IikpLGYuc2V0KCJCQm94IixjKSxmLnNldCgiTWF0cml4IixbMSwwLDAsMSwwLDBdKSxmLnNldCgiTGVuZ3RoIixkLmxlbmd0aCk7Y29uc3QgZz1uZXcgcy5EaWN0KGUueHJlZikscD1uZXcgcy5EaWN0KGUueHJlZik7cC5zZXQoIlBkZkpzWmFEYiIsdGhpcy5mYWxsYmFja0ZvbnREaWN0KSxnLnNldCgiRm9udCIscCksZi5zZXQoIlJlc291cmNlcyIsZyksdGhpcy5jaGVja2VkQXBwZWFyYW5jZT1uZXcgby5TdHJpbmdTdHJlYW0oZCksdGhpcy5jaGVja2VkQXBwZWFyYW5jZS5kaWN0PWYsdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpfV9wcm9jZXNzQ2hlY2tCb3goZSl7Y29uc3QgdD1lLmRpY3QuZ2V0KCJBUCIpO2lmKCEodCBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuO2NvbnN0IHI9dC5nZXQoIk4iKTtpZighKHIgaW5zdGFuY2VvZiBzLkRpY3QpKXJldHVybjtjb25zdCBuPXRoaXMuX2RlY29kZUZvcm1WYWx1ZShlLmRpY3QuZ2V0KCJBUyIpKTsic3RyaW5nIj09dHlwZW9mIG4mJih0aGlzLmRhdGEuZmllbGRWYWx1ZT1uKTtjb25zdCBhPW51bGwhPT10aGlzLmRhdGEuZmllbGRWYWx1ZSYmIk9mZiIhPT10aGlzLmRhdGEuZmllbGRWYWx1ZT90aGlzLmRhdGEuZmllbGRWYWx1ZToiWWVzIixpPXIuZ2V0S2V5cygpO2lmKDA9PT1pLmxlbmd0aClpLnB1c2goIk9mZiIsYSk7ZWxzZSBpZigxPT09aS5sZW5ndGgpIk9mZiI9PT1pWzBdP2kucHVzaChhKTppLnVuc2hpZnQoIk9mZiIpO2Vsc2UgaWYoaS5pbmNsdWRlcyhhKSlpLmxlbmd0aD0wLGkucHVzaCgiT2ZmIixhKTtlbHNle2NvbnN0IGU9aS5maW5kKChlPT4iT2ZmIiE9PWUpKTtpLmxlbmd0aD0wLGkucHVzaCgiT2ZmIixlKX1pLmluY2x1ZGVzKHRoaXMuZGF0YS5maWVsZFZhbHVlKXx8KHRoaXMuZGF0YS5maWVsZFZhbHVlPSJPZmYiKSx0aGlzLmRhdGEuZXhwb3J0VmFsdWU9aVsxXTtjb25zdCBvPXIuZ2V0KHRoaXMuZGF0YS5leHBvcnRWYWx1ZSk7dGhpcy5jaGVja2VkQXBwZWFyYW5jZT1vIGluc3RhbmNlb2YgbC5CYXNlU3RyZWFtP286bnVsbDtjb25zdCBjPXIuZ2V0KCJPZmYiKTt0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2U9YyBpbnN0YW5jZW9mIGwuQmFzZVN0cmVhbT9jOm51bGwsdGhpcy5jaGVja2VkQXBwZWFyYW5jZT90aGlzLl9zdHJlYW1zLnB1c2godGhpcy5jaGVja2VkQXBwZWFyYW5jZSk6dGhpcy5fZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlKGUsImNoZWNrIiksdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlJiZ0aGlzLl9zdHJlYW1zLnB1c2godGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlKSx0aGlzLl9mYWxsYmFja0ZvbnREaWN0PXRoaXMuZmFsbGJhY2tGb250RGljdH1fcHJvY2Vzc1JhZGlvQnV0dG9uKGUpe3RoaXMuZGF0YS5maWVsZFZhbHVlPXRoaXMuZGF0YS5idXR0b25WYWx1ZT1udWxsO2NvbnN0IHQ9ZS5kaWN0LmdldCgiUGFyZW50Iik7aWYodCBpbnN0YW5jZW9mIHMuRGljdCl7dGhpcy5wYXJlbnQ9ZS5kaWN0LmdldFJhdygiUGFyZW50Iik7Y29uc3Qgcj10LmdldCgiViIpO3IgaW5zdGFuY2VvZiBzLk5hbWUmJih0aGlzLmRhdGEuZmllbGRWYWx1ZT10aGlzLl9kZWNvZGVGb3JtVmFsdWUocikpfWNvbnN0IHI9ZS5kaWN0LmdldCgiQVAiKTtpZighKHIgaW5zdGFuY2VvZiBzLkRpY3QpKXJldHVybjtjb25zdCBuPXIuZ2V0KCJOIik7aWYoIShuIGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm47Zm9yKGNvbnN0IGUgb2Ygbi5nZXRLZXlzKCkpaWYoIk9mZiIhPT1lKXt0aGlzLmRhdGEuYnV0dG9uVmFsdWU9dGhpcy5fZGVjb2RlRm9ybVZhbHVlKGUpO2JyZWFrfWNvbnN0IGE9bi5nZXQodGhpcy5kYXRhLmJ1dHRvblZhbHVlKTt0aGlzLmNoZWNrZWRBcHBlYXJhbmNlPWEgaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0/YTpudWxsO2NvbnN0IGk9bi5nZXQoIk9mZiIpO3RoaXMudW5jaGVja2VkQXBwZWFyYW5jZT1pIGluc3RhbmNlb2YgbC5CYXNlU3RyZWFtP2k6bnVsbCx0aGlzLmNoZWNrZWRBcHBlYXJhbmNlP3RoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKTp0aGlzLl9nZXREZWZhdWx0Q2hlY2tlZEFwcGVhcmFuY2UoZSwiZGlzYyIpLHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSYmdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSksdGhpcy5fZmFsbGJhY2tGb250RGljdD10aGlzLmZhbGxiYWNrRm9udERpY3R9X3Byb2Nlc3NQdXNoQnV0dG9uKGUpe2UuZGljdC5oYXMoIkEiKXx8ZS5kaWN0LmhhcygiQUEiKXx8dGhpcy5kYXRhLmFsdGVybmF0aXZlVGV4dD8odGhpcy5kYXRhLmlzVG9vbHRpcE9ubHk9IWUuZGljdC5oYXMoIkEiKSYmIWUuZGljdC5oYXMoIkFBIiksdS5DYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoe2Rlc3REaWN0OmUuZGljdCxyZXN1bHRPYmo6dGhpcy5kYXRhLGRvY0Jhc2VVcmw6ZS5wZGZNYW5hZ2VyLmRvY0Jhc2VVcmwsZG9jQXR0YWNobWVudHM6ZS5hdHRhY2htZW50c30pKTooMCxuLndhcm4pKCJQdXNoIGJ1dHRvbnMgd2l0aG91dCBhY3Rpb24gZGljdGlvbmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkIil9Z2V0RmllbGRPYmplY3QoKXtsZXQgZSx0PSJidXR0b24iO3JldHVybiB0aGlzLmRhdGEuY2hlY2tCb3g/KHQ9ImNoZWNrYm94IixlPXRoaXMuZGF0YS5leHBvcnRWYWx1ZSk6dGhpcy5kYXRhLnJhZGlvQnV0dG9uJiYodD0icmFkaW9idXR0b24iLGU9dGhpcy5kYXRhLmJ1dHRvblZhbHVlKSx7aWQ6dGhpcy5kYXRhLmlkLHZhbHVlOnRoaXMuZGF0YS5maWVsZFZhbHVlfHwiT2ZmIixkZWZhdWx0VmFsdWU6dGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlLGV4cG9ydFZhbHVlczplLGVkaXRhYmxlOiF0aGlzLmRhdGEucmVhZE9ubHksbmFtZTp0aGlzLmRhdGEuZmllbGROYW1lLHJlY3Q6dGhpcy5kYXRhLnJlY3QsaGlkZGVuOnRoaXMuZGF0YS5oaWRkZW4sYWN0aW9uczp0aGlzLmRhdGEuYWN0aW9ucyxwYWdlOnRoaXMuZGF0YS5wYWdlSW5kZXgsc3Ryb2tlQ29sb3I6dGhpcy5kYXRhLmJvcmRlckNvbG9yLGZpbGxDb2xvcjp0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yLHJvdGF0aW9uOnRoaXMucm90YXRpb24sdHlwZTp0fX1nZXQgZmFsbGJhY2tGb250RGljdCgpe2NvbnN0IGU9bmV3IHMuRGljdDtyZXR1cm4gZS5zZXQoIkJhc2VGb250IixzLk5hbWUuZ2V0KCJaYXBmRGluZ2JhdHMiKSksZS5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKSxlLnNldCgiU3VidHlwZSIscy5OYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpLGUuc2V0KCJFbmNvZGluZyIscy5OYW1lLmdldCgiWmFwZkRpbmdiYXRzRW5jb2RpbmciKSksKDAsbi5zaGFkb3cpKHRoaXMsImZhbGxiYWNrRm9udERpY3QiLGUpfX1jbGFzcyBJIGV4dGVuZHMgQ3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjpyfT1lO3RoaXMuaW5kaWNlcz10LmdldEFycmF5KCJJIiksdGhpcy5oYXNJbmRpY2VzPUFycmF5LmlzQXJyYXkodGhpcy5pbmRpY2VzKSYmdGhpcy5pbmRpY2VzLmxlbmd0aD4wLHRoaXMuZGF0YS5vcHRpb25zPVtdO2NvbnN0IGk9KDAsYS5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDp0LGtleToiT3B0In0pO2lmKEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBlPTAsdD1pLmxlbmd0aDtlPHQ7ZSsrKXtjb25zdCB0PXIuZmV0Y2hJZlJlZihpW2VdKSxuPUFycmF5LmlzQXJyYXkodCk7dGhpcy5kYXRhLm9wdGlvbnNbZV09e2V4cG9ydFZhbHVlOnRoaXMuX2RlY29kZUZvcm1WYWx1ZShuP3IuZmV0Y2hJZlJlZih0WzBdKTp0KSxkaXNwbGF5VmFsdWU6dGhpcy5fZGVjb2RlRm9ybVZhbHVlKG4/ci5mZXRjaElmUmVmKHRbMV0pOnQpfX1pZih0aGlzLmhhc0luZGljZXMpe3RoaXMuZGF0YS5maWVsZFZhbHVlPVtdO2NvbnN0IGU9dGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoO2Zvcihjb25zdCB0IG9mIHRoaXMuaW5kaWNlcylOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0Pj0wJiZ0PGUmJnRoaXMuZGF0YS5maWVsZFZhbHVlLnB1c2godGhpcy5kYXRhLm9wdGlvbnNbdF0uZXhwb3J0VmFsdWUpfWVsc2Uic3RyaW5nIj09dHlwZW9mIHRoaXMuZGF0YS5maWVsZFZhbHVlP3RoaXMuZGF0YS5maWVsZFZhbHVlPVt0aGlzLmRhdGEuZmllbGRWYWx1ZV06dGhpcy5kYXRhLmZpZWxkVmFsdWV8fCh0aGlzLmRhdGEuZmllbGRWYWx1ZT1bXSk7dGhpcy5kYXRhLmNvbWJvPXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CTyksdGhpcy5kYXRhLm11bHRpU2VsZWN0PXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSVNFTEVDVCksdGhpcy5faGFzVGV4dD0hMH1nZXRGaWVsZE9iamVjdCgpe2NvbnN0IGU9dGhpcy5kYXRhLmNvbWJvPyJjb21ib2JveCI6Imxpc3Rib3giLHQ9dGhpcy5kYXRhLmZpZWxkVmFsdWUubGVuZ3RoPjA/dGhpcy5kYXRhLmZpZWxkVmFsdWVbMF06bnVsbDtyZXR1cm57aWQ6dGhpcy5kYXRhLmlkLHZhbHVlOnQsZGVmYXVsdFZhbHVlOnRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSxlZGl0YWJsZTohdGhpcy5kYXRhLnJlYWRPbmx5LG5hbWU6dGhpcy5kYXRhLmZpZWxkTmFtZSxyZWN0OnRoaXMuZGF0YS5yZWN0LG51bUl0ZW1zOnRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCxtdWx0aXBsZVNlbGVjdGlvbjp0aGlzLmRhdGEubXVsdGlTZWxlY3QsaGlkZGVuOnRoaXMuZGF0YS5oaWRkZW4sYWN0aW9uczp0aGlzLmRhdGEuYWN0aW9ucyxpdGVtczp0aGlzLmRhdGEub3B0aW9ucyxwYWdlOnRoaXMuZGF0YS5wYWdlSW5kZXgsc3Ryb2tlQ29sb3I6dGhpcy5kYXRhLmJvcmRlckNvbG9yLGZpbGxDb2xvcjp0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yLHJvdGF0aW9uOnRoaXMucm90YXRpb24sdHlwZTplfX1hbWVuZFNhdmVkRGljdChlLHQpe3ZhciByO2lmKCF0aGlzLmhhc0luZGljZXMpcmV0dXJuO2xldCBuPW51bGw9PWV8fG51bGw9PT0ocj1lLmdldCh0aGlzLmRhdGEuaWQpKXx8dm9pZCAwPT09cj92b2lkIDA6ci52YWx1ZTtBcnJheS5pc0FycmF5KG4pfHwobj1bbl0pO2NvbnN0IGE9W10se29wdGlvbnM6aX09dGhpcy5kYXRhO2ZvcihsZXQgZT0wLHQ9MCxyPWkubGVuZ3RoO2U8cjtlKyspaVtlXS5leHBvcnRWYWx1ZT09PW5bdF0mJihhLnB1c2goZSksdCs9MSk7dC5zZXQoIkkiLGEpfWFzeW5jIF9nZXRBcHBlYXJhbmNlKGUsdCxyLGEpe2lmKHRoaXMuZGF0YS5jb21ibylyZXR1cm4gc3VwZXIuX2dldEFwcGVhcmFuY2UoZSx0LHIsYSk7bGV0IHMsbztjb25zdCBjPW51bGw9PWE/dm9pZCAwOmEuZ2V0KHRoaXMuZGF0YS5pZCk7aWYoYyYmKG89Yy5yb3RhdGlvbixzPWMudmFsdWUpLHZvaWQgMD09PW8mJnZvaWQgMD09PXMmJiF0aGlzLl9uZWVkQXBwZWFyYW5jZXMpcmV0dXJuIG51bGw7dm9pZCAwPT09cz9zPXRoaXMuZGF0YS5maWVsZFZhbHVlOkFycmF5LmlzQXJyYXkocyl8fChzPVtzXSk7bGV0IGw9dGhpcy5kYXRhLnJlY3RbM10tdGhpcy5kYXRhLnJlY3RbMV0saD10aGlzLmRhdGEucmVjdFsyXS10aGlzLmRhdGEucmVjdFswXTs5MCE9PW8mJjI3MCE9PW98fChbaCxsXT1bbCxoXSk7Y29uc3QgdT10aGlzLmRhdGEub3B0aW9ucy5sZW5ndGgsZD1bXTtmb3IobGV0IGU9MDtlPHU7ZSsrKXtjb25zdHtleHBvcnRWYWx1ZTp0fT10aGlzLmRhdGEub3B0aW9uc1tlXTtzLmluY2x1ZGVzKHQpJiZkLnB1c2goZSl9dGhpcy5fZGVmYXVsdEFwcGVhcmFuY2V8fCh0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhPSgwLGkucGFyc2VEZWZhdWx0QXBwZWFyYW5jZSkodGhpcy5fZGVmYXVsdEFwcGVhcmFuY2U9Ii9IZWx2ZXRpY2EgMCBUZiAwIGciKSk7Y29uc3QgZj1hd2FpdCBDLl9nZXRGb250RGF0YShlLHQsdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSx0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMpO2xldCBnLHtmb250U2l6ZTpwfT10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhO2lmKHApZz10aGlzLl9kZWZhdWx0QXBwZWFyYW5jZTtlbHNle2NvbnN0IGU9KGwtMSkvdTtsZXQgdCxyPS0xO2Zvcihjb25zdHtkaXNwbGF5VmFsdWU6ZX1vZiB0aGlzLmRhdGEub3B0aW9ucyl7Y29uc3Qgbj10aGlzLl9nZXRUZXh0V2lkdGgoZSxmKTtuPnImJihyPW4sdD1lKX1bZyxwXT10aGlzLl9jb21wdXRlRm9udFNpemUoZSxoLTQsdCxmLC0xKX1jb25zdCBtPXAqbi5MSU5FX0ZBQ1RPUixiPShtLXApLzIseT1NYXRoLmZsb29yKGwvbSk7bGV0IHc9MDtpZihkLmxlbmd0aD4wKXtjb25zdCBlPU1hdGgubWluKC4uLmQpLHQ9TWF0aC5tYXgoLi4uZCk7dz1NYXRoLm1heCgwLHQteSsxKSx3PmUmJih3PWUpfWNvbnN0IHY9TWF0aC5taW4odyt5KzEsdSkseD1bIi9UeCBCTUMgcSIsIjEgMSAiLmNvbmNhdChoLCIgIikuY29uY2F0KGwsIiByZSBXIG4iKV07aWYoZC5sZW5ndGgpe3gucHVzaCgiMC42MDAwMDYgMC43NTY4NjYgMC44NTQ5MDQgcmciKTtmb3IoY29uc3QgZSBvZiBkKXc8PWUmJmU8diYmeC5wdXNoKCIxICIuY29uY2F0KGwtKGUtdysxKSptLCIgIikuY29uY2F0KGgsIiAiKS5jb25jYXQobSwiIHJlIGYiKSl9eC5wdXNoKCJCVCIsZywiMSAwIDAgMSAwICIuY29uY2F0KGwsIiBUbSIpKTtjb25zdCBTPXtzaGlmdDowfTtmb3IobGV0IGU9dztlPHY7ZSsrKXtjb25zdHtkaXNwbGF5VmFsdWU6dH09dGhpcy5kYXRhLm9wdGlvbnNbZV0scj1lPT09dz9iOjA7eC5wdXNoKHRoaXMuX3JlbmRlclRleHQodCxmLHAsaCwwLFMsMiwtbStyKSl9cmV0dXJuIHgucHVzaCgiRVQgUSBFTUMiKSx4LmpvaW4oIlxuIil9fWNsYXNzIFQgZXh0ZW5kcyBDe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuZGF0YS5maWVsZFZhbHVlPW51bGwsdGhpcy5kYXRhLmhhc093bkNhbnZhcz10aGlzLmRhdGEubm9Sb3RhdGV9Z2V0RmllbGRPYmplY3QoKXtyZXR1cm57aWQ6dGhpcy5kYXRhLmlkLHZhbHVlOm51bGwscGFnZTp0aGlzLmRhdGEucGFnZUluZGV4LHR5cGU6InNpZ25hdHVyZSJ9fX1jbGFzcyBNIGV4dGVuZHMga3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmRhdGEubm9Sb3RhdGU9ITAsdGhpcy5kYXRhLmhhc093bkNhbnZhcz10aGlzLmRhdGEubm9Sb3RhdGU7Y29uc3R7ZGljdDp0fT1lO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLlRFWFQsdGhpcy5kYXRhLmhhc0FwcGVhcmFuY2U/dGhpcy5kYXRhLm5hbWU9Ik5vSWNvbiI6KHRoaXMuZGF0YS5yZWN0WzFdPXRoaXMuZGF0YS5yZWN0WzNdLTIyLHRoaXMuZGF0YS5yZWN0WzJdPXRoaXMuZGF0YS5yZWN0WzBdKzIyLHRoaXMuZGF0YS5uYW1lPXQuaGFzKCJOYW1lIik/dC5nZXQoIk5hbWUiKS5uYW1lOiJOb3RlIiksdC5oYXMoIlN0YXRlIik/KHRoaXMuZGF0YS5zdGF0ZT10LmdldCgiU3RhdGUiKXx8bnVsbCx0aGlzLmRhdGEuc3RhdGVNb2RlbD10LmdldCgiU3RhdGVNb2RlbCIpfHxudWxsKToodGhpcy5kYXRhLnN0YXRlPW51bGwsdGhpcy5kYXRhLnN0YXRlTW9kZWw9bnVsbCl9fWNsYXNzIEUgZXh0ZW5kcyBTe2NvbnN0cnVjdG9yKGUpe3ZhciB0O3N1cGVyKGUpLHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLkxJTks7Y29uc3Qgcj12KGUuZGljdCx0aGlzLnJlY3RhbmdsZSk7ciYmKHRoaXMuZGF0YS5xdWFkUG9pbnRzPXIpLCh0PXRoaXMuZGF0YSkuYm9yZGVyQ29sb3J8fCh0LmJvcmRlckNvbG9yPXRoaXMuZGF0YS5jb2xvciksdS5DYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoe2Rlc3REaWN0OmUuZGljdCxyZXN1bHRPYmo6dGhpcy5kYXRhLGRvY0Jhc2VVcmw6ZS5wZGZNYW5hZ2VyLmRvY0Jhc2VVcmwsZG9jQXR0YWNobWVudHM6ZS5hdHRhY2htZW50c30pfX1jbGFzcyBQIGV4dGVuZHMgU3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnR9PWU7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuUE9QVVAsdGhpcy5kYXRhLnJlY3RbMF0hPT10aGlzLmRhdGEucmVjdFsyXSYmdGhpcy5kYXRhLnJlY3RbMV0hPT10aGlzLmRhdGEucmVjdFszXXx8KHRoaXMuZGF0YS5yZWN0PW51bGwpO2xldCByPXQuZ2V0KCJQYXJlbnQiKTtpZighcilyZXR1cm4gdm9pZCgwLG4ud2FybikoIlBvcHVwIGFubm90YXRpb24gaGFzIGEgbWlzc2luZyBvciBpbnZhbGlkIHBhcmVudCBhbm5vdGF0aW9uLiIpO2NvbnN0IGE9ci5nZXRBcnJheSgiUmVjdCIpO3RoaXMuZGF0YS5wYXJlbnRSZWN0PUFycmF5LmlzQXJyYXkoYSkmJjQ9PT1hLmxlbmd0aD9uLlV0aWwubm9ybWFsaXplUmVjdChhKTpudWxsO2NvbnN0IGk9ci5nZXQoIlJUIik7aWYoKDAscy5pc05hbWUpKGksbi5Bbm5vdGF0aW9uUmVwbHlUeXBlLkdST1VQKSYmKHI9ci5nZXQoIklSVCIpKSxyLmhhcygiTSIpPyh0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUoci5nZXQoIk0iKSksdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGU9dGhpcy5tb2RpZmljYXRpb25EYXRlKTp0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZT1udWxsLHIuaGFzKCJDIik/KHRoaXMuc2V0Q29sb3Ioci5nZXRBcnJheSgiQyIpKSx0aGlzLmRhdGEuY29sb3I9dGhpcy5jb2xvcik6dGhpcy5kYXRhLmNvbG9yPW51bGwsIXRoaXMudmlld2FibGUpe2NvbnN0IGU9ci5nZXQoIkYiKTt0aGlzLl9pc1ZpZXdhYmxlKGUpJiZ0aGlzLnNldEZsYWdzKGUpfXRoaXMuc2V0VGl0bGUoci5nZXQoIlQiKSksdGhpcy5kYXRhLnRpdGxlT2JqPXRoaXMuX3RpdGxlLHRoaXMuc2V0Q29udGVudHMoci5nZXQoIkNvbnRlbnRzIikpLHRoaXMuZGF0YS5jb250ZW50c09iaj10aGlzLl9jb250ZW50cyxyLmhhcygiUkMiKSYmKHRoaXMuZGF0YS5yaWNoVGV4dD1iLlhGQUZhY3RvcnkuZ2V0UmljaFRleHRBc0h0bWwoci5nZXQoIlJDIikpKSx0aGlzLmRhdGEub3Blbj0hIXQuZ2V0KCJPcGVuIil9fXQuUG9wdXBBbm5vdGF0aW9uPVA7Y2xhc3MgUiBleHRlbmRzIGt7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5kYXRhLmhhc093bkNhbnZhcz0hMDtjb25zdHtldmFsdWF0b3JPcHRpb25zOnQseHJlZjpyfT1lO2lmKHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLkZSRUVURVhULHRoaXMuc2V0RGVmYXVsdEFwcGVhcmFuY2UoZSksdGhpcy5hcHBlYXJhbmNlKXtjb25zdHtmb250Q29sb3I6ZSxmb250U2l6ZTpufT0oMCxpLnBhcnNlQXBwZWFyYW5jZVN0cmVhbSkodGhpcy5hcHBlYXJhbmNlLHQscik7dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250Q29sb3I9ZSx0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnRTaXplPW58fDEwfWVsc2UgaWYodGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpe3ZhciBhO2NvbnN0IHQ9ZS5kaWN0LmdldCgiQ0EiKSxuPW5ldyBpLkZha2VVbmljb2RlRm9udChyLCJzYW5zLXNlcmlmIik7KGE9dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSkuZm9udFNpemV8fChhLmZvbnRTaXplPTEwKTtjb25zdHtmb250Q29sb3I6cyxmb250U2l6ZTpvfT10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhO3RoaXMuYXBwZWFyYW5jZT1uLmNyZWF0ZUFwcGVhcmFuY2UodGhpcy5fY29udGVudHMuc3RyLHRoaXMucmVjdGFuZ2xlLHRoaXMucm90YXRpb24sbyxzLHQpLHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmFwcGVhcmFuY2UsaS5GYWtlVW5pY29kZUZvbnQudG9Vbmljb2RlU3RyZWFtKX1lbHNlKDAsbi53YXJuKSgiRnJlZVRleHRBbm5vdGF0aW9uOiBPZmZzY3JlZW5DYW52YXMgaXMgbm90IHN1cHBvcnRlZCwgYW5ub3RhdGlvbiBtYXkgbm90IHJlbmRlciBjb3JyZWN0bHkuIil9Z2V0IGhhc1RleHRDb250ZW50KCl7cmV0dXJuISF0aGlzLmFwcGVhcmFuY2V9c3RhdGljIGNyZWF0ZU5ld0RpY3QoZSx0LHIpe2xldHthcFJlZjpvLGFwOmN9PXI7Y29uc3R7Y29sb3I6bCxmb250U2l6ZTpoLHJlY3Q6dSxyb3RhdGlvbjpkLHVzZXI6Zix2YWx1ZTpnfT1lLHA9bmV3IHMuRGljdCh0KTtwLnNldCgiVHlwZSIscy5OYW1lLmdldCgiQW5ub3QiKSkscC5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIkZyZWVUZXh0IikpLHAuc2V0KCJDcmVhdGlvbkRhdGUiLCJEOiIuY29uY2F0KCgwLG4uZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKSkpLHAuc2V0KCJSZWN0Iix1KTtjb25zdCBtPSIvSGVsdiAiLmNvbmNhdChoLCIgVGYgIikuY29uY2F0KCgwLGkuZ2V0UGRmQ29sb3IpKGwsITApKTtpZihwLnNldCgiREEiLG0pLHAuc2V0KCJDb250ZW50cyIsKDAsYS5pc0FzY2lpKShnKT9nOigwLGEuc3RyaW5nVG9VVEYxNlN0cmluZykoZywhMCkpLHAuc2V0KCJGIiw0KSxwLnNldCgiQm9yZGVyIixbMCwwLDBdKSxwLnNldCgiUm90YXRlIixkKSxmJiZwLnNldCgiVCIsKDAsYS5pc0FzY2lpKShmKT9mOigwLGEuc3RyaW5nVG9VVEYxNlN0cmluZykoZiwhMCkpLG98fGMpe2NvbnN0IGU9bmV3IHMuRGljdCh0KTtwLnNldCgiQVAiLGUpLG8/ZS5zZXQoIk4iLG8pOmUuc2V0KCJOIixjKX1yZXR1cm4gcH1zdGF0aWMgYXN5bmMgY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShlLHQscil7Y29uc3R7YmFzZUZvbnRSZWY6YyxldmFsdWF0b3I6bCx0YXNrOmh9PXIse2NvbG9yOnUsZm9udFNpemU6ZCxyZWN0OmYscm90YXRpb246Zyx2YWx1ZTpwfT1lLG09bmV3IHMuRGljdCh0KSxiPW5ldyBzLkRpY3QodCk7aWYoYyliLnNldCgiSGVsdiIsYyk7ZWxzZXtjb25zdCBlPW5ldyBzLkRpY3QodCk7ZS5zZXQoIkJhc2VGb250IixzLk5hbWUuZ2V0KCJIZWx2ZXRpY2EiKSksZS5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkZvbnQiKSksZS5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIlR5cGUxIikpLGUuc2V0KCJFbmNvZGluZyIscy5OYW1lLmdldCgiV2luQW5zaUVuY29kaW5nIikpLGIuc2V0KCJIZWx2IixlKX1tLnNldCgiRm9udCIsYik7Y29uc3QgeT1hd2FpdCBDLl9nZXRGb250RGF0YShsLGgse2ZvbnROYW1lOiJIZWx2Iixmb250U2l6ZTpkfSxtKSxbdyx2LHgsU109ZjtsZXQgQT14LXcsaz1TLXY7ZyUxODAhPTAmJihbQSxrXT1bayxBXSk7Y29uc3QgTz1wLnNwbGl0KCJcbiIpLEY9ZC8xZTM7bGV0IEk9LTEvMDtjb25zdCBUPVtdO2ZvcihsZXQgZSBvZiBPKXtjb25zdCB0PXkuZW5jb2RlU3RyaW5nKGUpO2lmKHQubGVuZ3RoPjEpcmV0dXJuIG51bGw7ZT10LmpvaW4oIiIpLFQucHVzaChlKTtsZXQgcj0wO2NvbnN0IG49eS5jaGFyc1RvR2x5cGhzKGUpO2Zvcihjb25zdCBlIG9mIG4pcis9ZS53aWR0aCpGO0k9TWF0aC5tYXgoSSxyKX1sZXQgTT0xO0k+QSYmKE09QS9JKTtsZXQgRT0xO2NvbnN0IFA9bi5MSU5FX0ZBQ1RPUipkLFI9KG4uTElORV9GQUNUT1Itbi5MSU5FX0RFU0NFTlRfRkFDVE9SKSpkLE49UCpPLmxlbmd0aDtOPmsmJihFPWsvTik7Y29uc3QgRD1kKk1hdGgubWluKE0sRSk7bGV0IEIsTCxfO3N3aXRjaChnKXtjYXNlIDA6Xz1bMSwwLDAsMV0sTD1bZlswXSxmWzFdLEEsa10sQj1bZlswXSxmWzNdLVJdO2JyZWFrO2Nhc2UgOTA6Xz1bMCwxLC0xLDBdLEw9W2ZbMV0sLWZbMl0sQSxrXSxCPVtmWzFdLC1mWzBdLVJdO2JyZWFrO2Nhc2UgMTgwOl89Wy0xLDAsMCwtMV0sTD1bLWZbMl0sLWZbM10sQSxrXSxCPVstZlsyXSwtZlsxXS1SXTticmVhaztjYXNlIDI3MDpfPVswLC0xLDEsMF0sTD1bLWZbM10sZlswXSxBLGtdLEI9Wy1mWzNdLGZbMl0tUl19Y29uc3Qgaj1bInEiLCIiLmNvbmNhdChfLmpvaW4oIiAiKSwiIDAgMCBjbSIpLCIiLmNvbmNhdChMLmpvaW4oIiAiKSwiIHJlIFcgbiIpLCJCVCIsIiIuY29uY2F0KCgwLGkuZ2V0UGRmQ29sb3IpKHUsITApKSwiMCBUYyAvSGVsdiAiLmNvbmNhdCgoMCxhLm51bWJlclRvU3RyaW5nKShEKSwiIFRmIildO2oucHVzaCgiIi5jb25jYXQoQi5qb2luKCIgIiksIiBUZCAoIikuY29uY2F0KCgwLGEuZXNjYXBlU3RyaW5nKShUWzBdKSwiKSBUaiIpKTtjb25zdCBVPSgwLGEubnVtYmVyVG9TdHJpbmcpKFApO2ZvcihsZXQgZT0xLHQ9VC5sZW5ndGg7ZTx0O2UrKyl7Y29uc3QgdD1UW2VdO2oucHVzaCgiMCAtIi5jb25jYXQoVSwiIFRkICgiKS5jb25jYXQoKDAsYS5lc2NhcGVTdHJpbmcpKHQpLCIpIFRqIikpfWoucHVzaCgiRVQiLCJRIik7Y29uc3QgJD1qLmpvaW4oIlxuIiksWD1uZXcgcy5EaWN0KHQpO1guc2V0KCJGb3JtVHlwZSIsMSksWC5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIkZvcm0iKSksWC5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIlhPYmplY3QiKSksWC5zZXQoIkJCb3giLGYpLFguc2V0KCJSZXNvdXJjZXMiLG0pLFguc2V0KCJNYXRyaXgiLFsxLDAsMCwxLC1mWzBdLC1mWzFdXSk7Y29uc3QgSD1uZXcgby5TdHJpbmdTdHJlYW0oJCk7cmV0dXJuIEguZGljdD1YLEh9fWNsYXNzIE4gZXh0ZW5kcyBre2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOnJ9PWU7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuTElORSx0aGlzLmRhdGEuaGFzT3duQ2FudmFzPXRoaXMuZGF0YS5ub1JvdGF0ZTtjb25zdCBhPXQuZ2V0QXJyYXkoIkwiKTtpZih0aGlzLmRhdGEubGluZUNvb3JkaW5hdGVzPW4uVXRpbC5ub3JtYWxpemVSZWN0KGEpLHRoaXMuc2V0TGluZUVuZGluZ3ModC5nZXRBcnJheSgiTEUiKSksdGhpcy5kYXRhLmxpbmVFbmRpbmdzPXRoaXMubGluZUVuZGluZ3MsIXRoaXMuYXBwZWFyYW5jZSl7Y29uc3QgZT10aGlzLmNvbG9yP3codGhpcy5jb2xvcik6WzAsMCwwXSxpPXQuZ2V0KCJDQSIpLHM9eSh0LmdldEFycmF5KCJJQyIpLG51bGwpLG89cz93KHMpOm51bGwsYz1vP2k6bnVsbCxsPXRoaXMuYm9yZGVyU3R5bGUud2lkdGh8fDEsaD0yKmwsdT1bdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1swXS1oLHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbMV0taCx0aGlzLmRhdGEubGluZUNvb3JkaW5hdGVzWzJdK2gsdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1szXStoXTtuLlV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLHUpfHwodGhpcy5yZWN0YW5nbGU9dSksdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2Uoe3hyZWY6cixleHRyYToiIi5jb25jYXQobCwiIHciKSxzdHJva2VDb2xvcjplLGZpbGxDb2xvcjpvLHN0cm9rZUFscGhhOmksZmlsbEFscGhhOmMscG9pbnRzQ2FsbGJhY2s6KGUsdCk9PihlLnB1c2goIiIuY29uY2F0KGFbMF0sIiAiKS5jb25jYXQoYVsxXSwiIG0iKSwiIi5jb25jYXQoYVsyXSwiICIpLmNvbmNhdChhWzNdLCIgbCIpLCJTIiksW3RbMF0ueC1sLHRbMV0ueCtsLHRbM10ueS1sLHRbMV0ueStsXSl9KX19fWNsYXNzIEQgZXh0ZW5kcyBre2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOnJ9PWU7aWYodGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuU1FVQVJFLHRoaXMuZGF0YS5oYXNPd25DYW52YXM9dGhpcy5kYXRhLm5vUm90YXRlLCF0aGlzLmFwcGVhcmFuY2Upe2NvbnN0IGU9dGhpcy5jb2xvcj93KHRoaXMuY29sb3IpOlswLDAsMF0sbj10LmdldCgiQ0EiKSxhPXkodC5nZXRBcnJheSgiSUMiKSxudWxsKSxpPWE/dyhhKTpudWxsLHM9aT9uOm51bGw7aWYoMD09PXRoaXMuYm9yZGVyU3R5bGUud2lkdGgmJiFpKXJldHVybjt0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7eHJlZjpyLGV4dHJhOiIiLmNvbmNhdCh0aGlzLmJvcmRlclN0eWxlLndpZHRoLCIgdyIpLHN0cm9rZUNvbG9yOmUsZmlsbENvbG9yOmksc3Ryb2tlQWxwaGE6bixmaWxsQWxwaGE6cyxwb2ludHNDYWxsYmFjazooZSx0KT0+e2NvbnN0IHI9dFsyXS54K3RoaXMuYm9yZGVyU3R5bGUud2lkdGgvMixuPXRbMl0ueSt0aGlzLmJvcmRlclN0eWxlLndpZHRoLzIsYT10WzNdLngtdFsyXS54LXRoaXMuYm9yZGVyU3R5bGUud2lkdGgscz10WzFdLnktdFszXS55LXRoaXMuYm9yZGVyU3R5bGUud2lkdGg7cmV0dXJuIGUucHVzaCgiIi5jb25jYXQociwiICIpLmNvbmNhdChuLCIgIikuY29uY2F0KGEsIiAiKS5jb25jYXQocywiIHJlIikpLGk/ZS5wdXNoKCJCIik6ZS5wdXNoKCJTIiksW3RbMF0ueCx0WzFdLngsdFszXS55LHRbMV0ueV19fSl9fX1jbGFzcyBCIGV4dGVuZHMga3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjpyfT1lO2lmKHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLkNJUkNMRSwhdGhpcy5hcHBlYXJhbmNlKXtjb25zdCBlPXRoaXMuY29sb3I/dyh0aGlzLmNvbG9yKTpbMCwwLDBdLG49dC5nZXQoIkNBIiksYT15KHQuZ2V0QXJyYXkoIklDIiksbnVsbCksaT1hP3coYSk6bnVsbCxzPWk/bjpudWxsO2lmKDA9PT10aGlzLmJvcmRlclN0eWxlLndpZHRoJiYhaSlyZXR1cm47Y29uc3Qgbz00LzMqTWF0aC50YW4oTWF0aC5QSS84KTt0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7eHJlZjpyLGV4dHJhOiIiLmNvbmNhdCh0aGlzLmJvcmRlclN0eWxlLndpZHRoLCIgdyIpLHN0cm9rZUNvbG9yOmUsZmlsbENvbG9yOmksc3Ryb2tlQWxwaGE6bixmaWxsQWxwaGE6cyxwb2ludHNDYWxsYmFjazooZSx0KT0+e2NvbnN0IHI9dFswXS54K3RoaXMuYm9yZGVyU3R5bGUud2lkdGgvMixuPXRbMF0ueS10aGlzLmJvcmRlclN0eWxlLndpZHRoLzIsYT10WzNdLngtdGhpcy5ib3JkZXJTdHlsZS53aWR0aC8yLHM9dFszXS55K3RoaXMuYm9yZGVyU3R5bGUud2lkdGgvMixjPXIrKGEtcikvMixsPW4rKHMtbikvMixoPShhLXIpLzIqbyx1PShzLW4pLzIqbztyZXR1cm4gZS5wdXNoKCIiLmNvbmNhdChjLCIgIikuY29uY2F0KHMsIiBtIiksIiIuY29uY2F0KGMraCwiICIpLmNvbmNhdChzLCIgIikuY29uY2F0KGEsIiAiKS5jb25jYXQobCt1LCIgIikuY29uY2F0KGEsIiAiKS5jb25jYXQobCwiIGMiKSwiIi5jb25jYXQoYSwiICIpLmNvbmNhdChsLXUsIiAiKS5jb25jYXQoYytoLCIgIikuY29uY2F0KG4sIiAiKS5jb25jYXQoYywiICIpLmNvbmNhdChuLCIgYyIpLCIiLmNvbmNhdChjLWgsIiAiKS5jb25jYXQobiwiICIpLmNvbmNhdChyLCIgIikuY29uY2F0KGwtdSwiICIpLmNvbmNhdChyLCIgIikuY29uY2F0KGwsIiBjIiksIiIuY29uY2F0KHIsIiAiKS5jb25jYXQobCt1LCIgIikuY29uY2F0KGMtaCwiICIpLmNvbmNhdChzLCIgIikuY29uY2F0KGMsIiAiKS5jb25jYXQocywiIGMiKSwiaCIpLGk/ZS5wdXNoKCJCIik6ZS5wdXNoKCJTIiksW3RbMF0ueCx0WzFdLngsdFszXS55LHRbMV0ueV19fSl9fX1jbGFzcyBMIGV4dGVuZHMga3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjpyfT1lO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLlBPTFlMSU5FLHRoaXMuZGF0YS5oYXNPd25DYW52YXM9dGhpcy5kYXRhLm5vUm90YXRlLHRoaXMuZGF0YS52ZXJ0aWNlcz1bXSx0aGlzIGluc3RhbmNlb2YgX3x8KHRoaXMuc2V0TGluZUVuZGluZ3ModC5nZXRBcnJheSgiTEUiKSksdGhpcy5kYXRhLmxpbmVFbmRpbmdzPXRoaXMubGluZUVuZGluZ3MpO2NvbnN0IGE9dC5nZXRBcnJheSgiVmVydGljZXMiKTtpZihBcnJheS5pc0FycmF5KGEpKXtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDtlKz0yKXRoaXMuZGF0YS52ZXJ0aWNlcy5wdXNoKHt4OmFbZV0seTphW2UrMV19KTtpZighdGhpcy5hcHBlYXJhbmNlKXtjb25zdCBlPXRoaXMuY29sb3I/dyh0aGlzLmNvbG9yKTpbMCwwLDBdLGE9dC5nZXQoIkNBIiksaT10aGlzLmJvcmRlclN0eWxlLndpZHRofHwxLHM9MippLG89WzEvMCwxLzAsLTEvMCwtMS8wXTtmb3IoY29uc3QgZSBvZiB0aGlzLmRhdGEudmVydGljZXMpb1swXT1NYXRoLm1pbihvWzBdLGUueC1zKSxvWzFdPU1hdGgubWluKG9bMV0sZS55LXMpLG9bMl09TWF0aC5tYXgob1syXSxlLngrcyksb1szXT1NYXRoLm1heChvWzNdLGUueStzKTtuLlV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLG8pfHwodGhpcy5yZWN0YW5nbGU9byksdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2Uoe3hyZWY6cixleHRyYToiIi5jb25jYXQoaSwiIHciKSxzdHJva2VDb2xvcjplLHN0cm9rZUFscGhhOmEscG9pbnRzQ2FsbGJhY2s6KGUsdCk9Pntjb25zdCByPXRoaXMuZGF0YS52ZXJ0aWNlcztmb3IobGV0IHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspZS5wdXNoKCIiLmNvbmNhdChyW3RdLngsIiAiKS5jb25jYXQoclt0XS55LCIgIikuY29uY2F0KDA9PT10PyJtIjoibCIpKTtyZXR1cm4gZS5wdXNoKCJTIiksW3RbMF0ueCx0WzFdLngsdFszXS55LHRbMV0ueV19fSl9fX19Y2xhc3MgXyBleHRlbmRzIEx7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuUE9MWUdPTn19Y2xhc3MgaiBleHRlbmRzIGt7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuQ0FSRVR9fWNsYXNzIFUgZXh0ZW5kcyBre2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuZGF0YS5oYXNPd25DYW52YXM9dGhpcy5kYXRhLm5vUm90YXRlO2NvbnN0e2RpY3Q6dCx4cmVmOnJ9PWU7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuSU5LLHRoaXMuZGF0YS5pbmtMaXN0cz1bXTtjb25zdCBhPXQuZ2V0QXJyYXkoIklua0xpc3QiKTtpZihBcnJheS5pc0FycmF5KGEpKXtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDsrK2Upe3RoaXMuZGF0YS5pbmtMaXN0cy5wdXNoKFtdKTtmb3IobGV0IHQ9MCxuPWFbZV0ubGVuZ3RoO3Q8bjt0Kz0yKXRoaXMuZGF0YS5pbmtMaXN0c1tlXS5wdXNoKHt4OnIuZmV0Y2hJZlJlZihhW2VdW3RdKSx5OnIuZmV0Y2hJZlJlZihhW2VdW3QrMV0pfSl9aWYoIXRoaXMuYXBwZWFyYW5jZSl7Y29uc3QgZT10aGlzLmNvbG9yP3codGhpcy5jb2xvcik6WzAsMCwwXSxhPXQuZ2V0KCJDQSIpLGk9dGhpcy5ib3JkZXJTdHlsZS53aWR0aHx8MSxzPTIqaSxvPVsxLzAsMS8wLC0xLzAsLTEvMF07Zm9yKGNvbnN0IGUgb2YgdGhpcy5kYXRhLmlua0xpc3RzKWZvcihjb25zdCB0IG9mIGUpb1swXT1NYXRoLm1pbihvWzBdLHQueC1zKSxvWzFdPU1hdGgubWluKG9bMV0sdC55LXMpLG9bMl09TWF0aC5tYXgob1syXSx0Lngrcyksb1szXT1NYXRoLm1heChvWzNdLHQueStzKTtuLlV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLG8pfHwodGhpcy5yZWN0YW5nbGU9byksdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2Uoe3hyZWY6cixleHRyYToiIi5jb25jYXQoaSwiIHciKSxzdHJva2VDb2xvcjplLHN0cm9rZUFscGhhOmEscG9pbnRzQ2FsbGJhY2s6KGUsdCk9Pntmb3IoY29uc3QgdCBvZiB0aGlzLmRhdGEuaW5rTGlzdHMpe2ZvcihsZXQgcj0wLG49dC5sZW5ndGg7cjxuO3IrKyllLnB1c2goIiIuY29uY2F0KHRbcl0ueCwiICIpLmNvbmNhdCh0W3JdLnksIiAiKS5jb25jYXQoMD09PXI/Im0iOiJsIikpO2UucHVzaCgiUyIpfXJldHVyblt0WzBdLngsdFsxXS54LHRbM10ueSx0WzFdLnldfX0pfX19c3RhdGljIGNyZWF0ZU5ld0RpY3QoZSx0LHIpe2xldHthcFJlZjphLGFwOml9PXI7Y29uc3R7Y29sb3I6byxvcGFjaXR5OmMscGF0aHM6bCxyZWN0Omgscm90YXRpb246dSx0aGlja25lc3M6ZH09ZSxmPW5ldyBzLkRpY3QodCk7Zi5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkFubm90IikpLGYuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJJbmsiKSksZi5zZXQoIkNyZWF0aW9uRGF0ZSIsIkQ6Ii5jb25jYXQoKDAsbi5nZXRNb2RpZmljYXRpb25EYXRlKSgpKSksZi5zZXQoIlJlY3QiLGgpLGYuc2V0KCJJbmtMaXN0IixsLm1hcCgoZT0+ZS5wb2ludHMpKSksZi5zZXQoIkYiLDQpLGYuc2V0KCJSb3RhdGUiLHUpO2NvbnN0IGc9bmV3IHMuRGljdCh0KTtmLnNldCgiQlMiLGcpLGcuc2V0KCJXIixkKSxmLnNldCgiQyIsQXJyYXkuZnJvbShvLChlPT5lLzI1NSkpKSxmLnNldCgiQ0EiLGMpO2NvbnN0IHA9bmV3IHMuRGljdCh0KTtyZXR1cm4gZi5zZXQoIkFQIixwKSxhP3Auc2V0KCJOIixhKTpwLnNldCgiTiIsaSksZn1zdGF0aWMgYXN5bmMgY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShlLHQscil7Y29uc3R7Y29sb3I6bixyZWN0OmMscGF0aHM6bCx0aGlja25lc3M6aCxvcGFjaXR5OnV9PWUsZD1bIiIuY29uY2F0KGgsIiB3IDEgSiAxIGoiKSwiIi5jb25jYXQoKDAsaS5nZXRQZGZDb2xvcikobiwhMSkpXTsxIT09dSYmZC5wdXNoKCIvUjAgZ3MiKTtjb25zdCBmPVtdO2Zvcihjb25zdHtiZXppZXI6ZX1vZiBsKXtmLmxlbmd0aD0wLGYucHVzaCgiIi5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoZVswXSksIiAiKS5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoZVsxXSksIiBtIikpO2ZvcihsZXQgdD0yLHI9ZS5sZW5ndGg7dDxyO3QrPTYpe2NvbnN0IHI9ZS5zbGljZSh0LHQrNikubWFwKGEubnVtYmVyVG9TdHJpbmcpLmpvaW4oIiAiKTtmLnB1c2goIiIuY29uY2F0KHIsIiBjIikpfWYucHVzaCgiUyIpLGQucHVzaChmLmpvaW4oIlxuIikpfWNvbnN0IGc9ZC5qb2luKCJcbiIpLHA9bmV3IHMuRGljdCh0KTtpZihwLnNldCgiRm9ybVR5cGUiLDEpLHAuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGb3JtIikpLHAuc2V0KCJUeXBlIixzLk5hbWUuZ2V0KCJYT2JqZWN0IikpLHAuc2V0KCJCQm94IixjKSxwLnNldCgiTGVuZ3RoIixnLmxlbmd0aCksMSE9PXUpe2NvbnN0IGU9bmV3IHMuRGljdCh0KSxyPW5ldyBzLkRpY3QodCksbj1uZXcgcy5EaWN0KHQpO24uc2V0KCJDQSIsdSksbi5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkV4dEdTdGF0ZSIpKSxyLnNldCgiUjAiLG4pLGUuc2V0KCJFeHRHU3RhdGUiLHIpLHAuc2V0KCJSZXNvdXJjZXMiLGUpfWNvbnN0IG09bmV3IG8uU3RyaW5nU3RyZWFtKGcpO3JldHVybiBtLmRpY3Q9cCxtfX1jbGFzcyAkIGV4dGVuZHMga3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjpyfT1lO2lmKHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLkhJR0hMSUdIVCx0aGlzLmRhdGEucXVhZFBvaW50cz12KHQsbnVsbCkpe3ZhciBhO2NvbnN0IGU9bnVsbD09PShhPXRoaXMuYXBwZWFyYW5jZSl8fHZvaWQgMD09PWE/dm9pZCAwOmEuZGljdC5nZXQoIlJlc291cmNlcyIpO2lmKCF0aGlzLmFwcGVhcmFuY2V8fG51bGw9PWV8fCFlLmhhcygiRXh0R1N0YXRlIikpe3RoaXMuYXBwZWFyYW5jZSYmKDAsbi53YXJuKSgiSGlnaGxpZ2h0QW5ub3RhdGlvbiAtIGlnbm9yaW5nIGJ1aWx0LWluIGFwcGVhcmFuY2Ugc3RyZWFtLiIpO2NvbnN0IGU9dGhpcy5jb2xvcj93KHRoaXMuY29sb3IpOlsxLDEsMF0sYT10LmdldCgiQ0EiKTt0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7eHJlZjpyLGZpbGxDb2xvcjplLGJsZW5kTW9kZToiTXVsdGlwbHkiLGZpbGxBbHBoYTphLHBvaW50c0NhbGxiYWNrOihlLHQpPT4oZS5wdXNoKCIiLmNvbmNhdCh0WzBdLngsIiAiKS5jb25jYXQodFswXS55LCIgbSIpLCIiLmNvbmNhdCh0WzFdLngsIiAiKS5jb25jYXQodFsxXS55LCIgbCIpLCIiLmNvbmNhdCh0WzNdLngsIiAiKS5jb25jYXQodFszXS55LCIgbCIpLCIiLmNvbmNhdCh0WzJdLngsIiAiKS5jb25jYXQodFsyXS55LCIgbCIpLCJmIiksW3RbMF0ueCx0WzFdLngsdFszXS55LHRbMV0ueV0pfSl9fWVsc2UgdGhpcy5kYXRhLnBvcHVwUmVmPW51bGx9fWNsYXNzIFggZXh0ZW5kcyBre2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOnJ9PWU7aWYodGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FLHRoaXMuZGF0YS5xdWFkUG9pbnRzPXYodCxudWxsKSl7aWYoIXRoaXMuYXBwZWFyYW5jZSl7Y29uc3QgZT10aGlzLmNvbG9yP3codGhpcy5jb2xvcik6WzAsMCwwXSxuPXQuZ2V0KCJDQSIpO3RoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHt4cmVmOnIsZXh0cmE6IltdIDAgZCAwLjU3MSB3IixzdHJva2VDb2xvcjplLHN0cm9rZUFscGhhOm4scG9pbnRzQ2FsbGJhY2s6KGUsdCk9PihlLnB1c2goIiIuY29uY2F0KHRbMl0ueCwiICIpLmNvbmNhdCh0WzJdLnkrMS4zLCIgbSIpLCIiLmNvbmNhdCh0WzNdLngsIiAiKS5jb25jYXQodFszXS55KzEuMywiIGwiKSwiUyIpLFt0WzBdLngsdFsxXS54LHRbM10ueSx0WzFdLnldKX0pfX1lbHNlIHRoaXMuZGF0YS5wb3B1cFJlZj1udWxsfX1jbGFzcyBIIGV4dGVuZHMga3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjpyfT1lO2lmKHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLlNRVUlHR0xZLHRoaXMuZGF0YS5xdWFkUG9pbnRzPXYodCxudWxsKSl7aWYoIXRoaXMuYXBwZWFyYW5jZSl7Y29uc3QgZT10aGlzLmNvbG9yP3codGhpcy5jb2xvcik6WzAsMCwwXSxuPXQuZ2V0KCJDQSIpO3RoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHt4cmVmOnIsZXh0cmE6IltdIDAgZCAxIHciLHN0cm9rZUNvbG9yOmUsc3Ryb2tlQWxwaGE6bixwb2ludHNDYWxsYmFjazooZSx0KT0+e2NvbnN0IHI9KHRbMF0ueS10WzJdLnkpLzY7bGV0IG49cixhPXRbMl0ueDtjb25zdCBpPXRbMl0ueSxzPXRbM10ueDtlLnB1c2goIiIuY29uY2F0KGEsIiAiKS5jb25jYXQoaStuLCIgbSIpKTtkb3thKz0yLG49MD09PW4/cjowLGUucHVzaCgiIi5jb25jYXQoYSwiICIpLmNvbmNhdChpK24sIiBsIikpfXdoaWxlKGE8cyk7cmV0dXJuIGUucHVzaCgiUyIpLFt0WzJdLngscyxpLTIqcixpKzIqcl19fSl9fWVsc2UgdGhpcy5kYXRhLnBvcHVwUmVmPW51bGx9fWNsYXNzIHEgZXh0ZW5kcyBre2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOnJ9PWU7aWYodGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VULHRoaXMuZGF0YS5xdWFkUG9pbnRzPXYodCxudWxsKSl7aWYoIXRoaXMuYXBwZWFyYW5jZSl7Y29uc3QgZT10aGlzLmNvbG9yP3codGhpcy5jb2xvcik6WzAsMCwwXSxuPXQuZ2V0KCJDQSIpO3RoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHt4cmVmOnIsZXh0cmE6IltdIDAgZCAxIHciLHN0cm9rZUNvbG9yOmUsc3Ryb2tlQWxwaGE6bixwb2ludHNDYWxsYmFjazooZSx0KT0+KGUucHVzaCgodFswXS54K3RbMl0ueCkvMisiICIrKHRbMF0ueSt0WzJdLnkpLzIrIiBtIiwodFsxXS54K3RbM10ueCkvMisiICIrKHRbMV0ueSt0WzNdLnkpLzIrIiBsIiwiUyIpLFt0WzBdLngsdFsxXS54LHRbM10ueSx0WzFdLnldKX0pfX1lbHNlIHRoaXMuZGF0YS5wb3B1cFJlZj1udWxsfX1jbGFzcyB6IGV4dGVuZHMga3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9bi5Bbm5vdGF0aW9uVHlwZS5TVEFNUCx0aGlzLmRhdGEuaGFzT3duQ2FudmFzPXRoaXMuZGF0YS5ub1JvdGF0ZX1zdGF0aWMgYXN5bmMgY3JlYXRlSW1hZ2UoZSx0KXtjb25zdHt3aWR0aDpyLGhlaWdodDphfT1lLGk9bmV3IE9mZnNjcmVlbkNhbnZhcyhyLGEpLGM9aS5nZXRDb250ZXh0KCIyZCIse2FscGhhOiEwfSk7Yy5kcmF3SW1hZ2UoZSwwLDApO2NvbnN0IGw9Yy5nZXRJbWFnZURhdGEoMCwwLHIsYSkuZGF0YSxoPW5ldyBVaW50MzJBcnJheShsLmJ1ZmZlciksdT1oLnNvbWUobi5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbj9lPT5lPj4+MjQhPTI1NTplPT4yNTUhPSgyNTUmZSkpO3UmJihjLmZpbGxTdHlsZT0id2hpdGUiLGMuZmlsbFJlY3QoMCwwLHIsYSksYy5kcmF3SW1hZ2UoZSwwLDApKTtjb25zdCBkPWkuY29udmVydFRvQmxvYih7dHlwZToiaW1hZ2UvanBlZyIscXVhbGl0eToxfSkudGhlbigoZT0+ZS5hcnJheUJ1ZmZlcigpKSksZj1zLk5hbWUuZ2V0KCJYT2JqZWN0IiksZz1zLk5hbWUuZ2V0KCJJbWFnZSIpLHA9bmV3IHMuRGljdCh0KTtwLnNldCgiVHlwZSIsZikscC5zZXQoIlN1YnR5cGUiLGcpLHAuc2V0KCJCaXRzUGVyQ29tcG9uZW50Iiw4KSxwLnNldCgiQ29sb3JTcGFjZSIscy5OYW1lLmdldCgiRGV2aWNlUkdCIikpLHAuc2V0KCJGaWx0ZXIiLHMuTmFtZS5nZXQoIkRDVERlY29kZSIpKSxwLnNldCgiQkJveCIsWzAsMCxyLGFdKSxwLnNldCgiV2lkdGgiLHIpLHAuc2V0KCJIZWlnaHQiLGEpO2xldCBtPW51bGw7aWYodSl7Y29uc3QgZT1uZXcgVWludDhBcnJheShoLmxlbmd0aCk7aWYobi5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbilmb3IobGV0IHQ9MCxyPWgubGVuZ3RoO3Q8cjt0KyspZVt0XT1oW3RdPj4+MjQ7ZWxzZSBmb3IobGV0IHQ9MCxyPWgubGVuZ3RoO3Q8cjt0KyspZVt0XT0yNTUmaFt0XTtjb25zdCBpPW5ldyBzLkRpY3QodCk7aS5zZXQoIlR5cGUiLGYpLGkuc2V0KCJTdWJ0eXBlIixnKSxpLnNldCgiQml0c1BlckNvbXBvbmVudCIsOCksaS5zZXQoIkNvbG9yU3BhY2UiLHMuTmFtZS5nZXQoIkRldmljZUdyYXkiKSksaS5zZXQoIldpZHRoIixyKSxpLnNldCgiSGVpZ2h0IixhKSxtPW5ldyBvLlN0cmVhbShlLDAsMCxpKX1yZXR1cm57aW1hZ2VTdHJlYW06bmV3IG8uU3RyZWFtKGF3YWl0IGQsMCwwLHApLHNtYXNrU3RyZWFtOm0sd2lkdGg6cixoZWlnaHQ6YX19c3RhdGljIGNyZWF0ZU5ld0RpY3QoZSx0LHIpe2xldHthcFJlZjppLGFwOm99PXI7Y29uc3R7cmVjdDpjLHJvdGF0aW9uOmwsdXNlcjpofT1lLHU9bmV3IHMuRGljdCh0KTtpZih1LnNldCgiVHlwZSIscy5OYW1lLmdldCgiQW5ub3QiKSksdS5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIlN0YW1wIikpLHUuc2V0KCJDcmVhdGlvbkRhdGUiLCJEOiIuY29uY2F0KCgwLG4uZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKSkpLHUuc2V0KCJSZWN0IixjKSx1LnNldCgiRiIsNCksdS5zZXQoIkJvcmRlciIsWzAsMCwwXSksdS5zZXQoIlJvdGF0ZSIsbCksaCYmdS5zZXQoIlQiLCgwLGEuaXNBc2NpaSkoaCk/aDooMCxhLnN0cmluZ1RvVVRGMTZTdHJpbmcpKGgsITApKSxpfHxvKXtjb25zdCBlPW5ldyBzLkRpY3QodCk7dS5zZXQoIkFQIixlKSxpP2Uuc2V0KCJOIixpKTplLnNldCgiTiIsbyl9cmV0dXJuIHV9c3RhdGljIGFzeW5jIGNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0oZSx0LHIpe2NvbnN0e3JvdGF0aW9uOm59PWUse2ltYWdlUmVmOmksd2lkdGg6YyxoZWlnaHQ6bH09ci5pbWFnZSxoPW5ldyBzLkRpY3QodCksdT1uZXcgcy5EaWN0KHQpO2guc2V0KCJYT2JqZWN0Iix1KSx1LnNldCgiSW0wIixpKTtjb25zdCBkPSJxICIuY29uY2F0KGMsIiAwIDAgIikuY29uY2F0KGwsIiAwIDAgY20gL0ltMCBEbyBRIiksZj1uZXcgcy5EaWN0KHQpO2lmKGYuc2V0KCJGb3JtVHlwZSIsMSksZi5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIkZvcm0iKSksZi5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIlhPYmplY3QiKSksZi5zZXQoIkJCb3giLFswLDAsYyxsXSksZi5zZXQoIlJlc291cmNlcyIsaCksbil7Y29uc3QgZT0oMCxhLmdldFJvdGF0aW9uTWF0cml4KShuLGMsbCk7Zi5zZXQoIk1hdHJpeCIsZSl9Y29uc3QgZz1uZXcgby5TdHJpbmdTdHJlYW0oZCk7cmV0dXJuIGcuZGljdD1mLGd9fWNsYXNzIEcgZXh0ZW5kcyBre2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOnJ9PWUsYT1uZXcgZi5GaWxlU3BlYyh0LmdldCgiRlMiKSxyKTt0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9bi5Bbm5vdGF0aW9uVHlwZS5GSUxFQVRUQUNITUVOVCx0aGlzLmRhdGEuaGFzT3duQ2FudmFzPXRoaXMuZGF0YS5ub1JvdGF0ZSx0aGlzLmRhdGEuZmlsZT1hLnNlcmlhbGl6YWJsZTtjb25zdCBpPXQuZ2V0KCJOYW1lIik7dGhpcy5kYXRhLm5hbWU9aSBpbnN0YW5jZW9mIHMuTmFtZT8oMCxuLnN0cmluZ1RvUERGU3RyaW5nKShpLm5hbWUpOiJQdXNoUGluIn19fSwoZSx0LHIpPT57dmFyIG49cig0KSxhPXIoNiksaT1yKDg3KSxzPXIoMTU4KSxvPXIoNyksYz1uLlJlZ0V4cCxsPWMucHJvdG90eXBlO2EmJm8oKGZ1bmN0aW9uKCl7dmFyIGU9ITA7dHJ5e2MoIi4iLCJkIil9Y2F0Y2godCl7ZT0hMX12YXIgdD17fSxyPSIiLG49ZT8iZGdpbXN5IjoiZ2ltc3kiLGE9ZnVuY3Rpb24oZSxuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcis9biwhMH19KX0saT17ZG90QWxsOiJzIixnbG9iYWw6ImciLGlnbm9yZUNhc2U6ImkiLG11bHRpbGluZToibSIsc3RpY2t5OiJ5In07Zm9yKHZhciBzIGluIGUmJihpLmhhc0luZGljZXM9ImQiKSxpKWEocyxpW3NdKTtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihsLCJmbGFncyIpLmdldC5jYWxsKHQpIT09bnx8ciE9PW59KSkmJmkobCwiZmxhZ3MiLHtjb25maWd1cmFibGU6ITAsZ2V0OnN9KX0sKGUsdCxyKT0+e3ZhciBuPXIoNDcpO2UuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciBlPW4odGhpcyksdD0iIjtyZXR1cm4gZS5oYXNJbmRpY2VzJiYodCs9ImQiKSxlLmdsb2JhbCYmKHQrPSJnIiksZS5pZ25vcmVDYXNlJiYodCs9ImkiKSxlLm11bHRpbGluZSYmKHQrPSJtIiksZS5kb3RBbGwmJih0Kz0icyIpLGUudW5pY29kZSYmKHQrPSJ1IiksZS51bmljb2RlU2V0cyYmKHQrPSJ2IiksZS5zdGlja3kmJih0Kz0ieSIpLHR9fSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoNDApLGk9cig2NCkscz1yKDE0MCksbz1yKDE2MCksYz1yKDE0Mik7bih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsYXJpdHk6MSxmb3JjZWQ6MSE9PVtdLnVuc2hpZnQoMCl8fCFmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sImxlbmd0aCIse3dyaXRhYmxlOiExfSkudW5zaGlmdCgpfWNhdGNoKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVHlwZUVycm9yfX0oKX0se3Vuc2hpZnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9YSh0aGlzKSxyPWkodCksbj1hcmd1bWVudHMubGVuZ3RoO2lmKG4pe2MocituKTtmb3IodmFyIGw9cjtsLS07KXt2YXIgaD1sK247bCBpbiB0P3RbaF09dFtsXTpvKHQsaCl9Zm9yKHZhciB1PTA7dTxuO3UrKyl0W3VdPWFyZ3VtZW50c1t1XX1yZXR1cm4gcyh0LHIrbil9fSl9LChlLHQscik9Pnt2YXIgbj1yKDMyKSxhPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZighZGVsZXRlIGVbdF0pdGhyb3cgYSgiQ2Fubm90IGRlbGV0ZSBwcm9wZXJ0eSAiK24odCkrIiBvZiAiK24oZSkpfX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkZha2VVbmljb2RlRm9udD12b2lkIDAsdC5jcmVhdGVEZWZhdWx0QXBwZWFyYW5jZT1mdW5jdGlvbihlKXtsZXR7Zm9udFNpemU6dCxmb250TmFtZTpyLGZvbnRDb2xvcjpufT1lO3JldHVybiIvIi5jb25jYXQoKDAsYS5lc2NhcGVQREZOYW1lKShyKSwiICIpLmNvbmNhdCh0LCIgVGYgIikuY29uY2F0KGYobiwhMCkpfSx0LmdldFBkZkNvbG9yPWYsdC5wYXJzZUFwcGVhcmFuY2VTdHJlYW09ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBuZXcgZChlLHQscikucGFyc2UoKX0sdC5wYXJzZURlZmF1bHRBcHBlYXJhbmNlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdShlKS5wYXJzZSgpfSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSkscigxMzkpO3ZhciBuPXIoMTUwKSxhPXIoMTQ5KSxpPXIoMTQ0KSxzPXIoMTYyKSxvPXIoMTYzKSxjPXIoMjA5KSxsPXIoMjA3KSxoPXIoMTU0KTtjbGFzcyB1IGV4dGVuZHMgby5FdmFsdWF0b3JQcmVwcm9jZXNzb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIobmV3IGguU3RyaW5nU3RyZWFtKGUpKX1wYXJzZSgpe2NvbnN0IGU9e2ZuOjAsYXJnczpbXX0sdD17Zm9udFNpemU6MCxmb250TmFtZToiIixmb250Q29sb3I6bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMpfTt0cnl7Zm9yKDtlLmFyZ3MubGVuZ3RoPTAsdGhpcy5yZWFkKGUpOyl7aWYoMCE9PXRoaXMuc2F2ZWRTdGF0ZXNEZXB0aCljb250aW51ZTtjb25zdHtmbjpyLGFyZ3M6YX09ZTtzd2l0Y2goMHxyKXtjYXNlIGkuT1BTLnNldEZvbnQ6Y29uc3RbZSxyXT1hO2UgaW5zdGFuY2VvZiBuLk5hbWUmJih0LmZvbnROYW1lPWUubmFtZSksIm51bWJlciI9PXR5cGVvZiByJiZyPjAmJih0LmZvbnRTaXplPXIpO2JyZWFrO2Nhc2UgaS5PUFMuc2V0RmlsbFJHQkNvbG9yOnMuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2JJdGVtKGEsMCx0LmZvbnRDb2xvciwwKTticmVhaztjYXNlIGkuT1BTLnNldEZpbGxHcmF5OnMuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiSXRlbShhLDAsdC5mb250Q29sb3IsMCk7YnJlYWs7Y2FzZSBpLk9QUy5zZXRGaWxsQ01ZS0NvbG9yOnMuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiSXRlbShhLDAsdC5mb250Q29sb3IsMCl9fX1jYXRjaChlKXsoMCxpLndhcm4pKCdwYXJzZURlZmF1bHRBcHBlYXJhbmNlIC0gaWdub3JpbmcgZXJyb3JzOiAiJy5jb25jYXQoZSwnIi4nKSl9cmV0dXJuIHR9fWNsYXNzIGQgZXh0ZW5kcyBvLkV2YWx1YXRvclByZXByb2Nlc3Nvcntjb25zdHJ1Y3RvcihlLHQscil7dmFyIG47c3VwZXIoZSksdGhpcy5zdHJlYW09ZSx0aGlzLmV2YWx1YXRvck9wdGlvbnM9dCx0aGlzLnhyZWY9cix0aGlzLnJlc291cmNlcz1udWxsPT09KG49ZS5kaWN0KXx8dm9pZCAwPT09bj92b2lkIDA6bi5nZXQoIlJlc291cmNlcyIpfXBhcnNlKCl7Y29uc3QgZT17Zm46MCxhcmdzOltdfTtsZXQgdD17c2NhbGVGYWN0b3I6MSxmb250U2l6ZTowLGZvbnROYW1lOiIiLGZvbnRDb2xvcjpuZXcgVWludDhDbGFtcGVkQXJyYXkoMyksZmlsbENvbG9yU3BhY2U6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheX0scj0hMTtjb25zdCBhPVtdO3RyeXtmb3IoO2UuYXJncy5sZW5ndGg9MCwhciYmdGhpcy5yZWFkKGUpOyl7Y29uc3R7Zm46byxhcmdzOmN9PWU7c3dpdGNoKDB8byl7Y2FzZSBpLk9QUy5zYXZlOmEucHVzaCh7c2NhbGVGYWN0b3I6dC5zY2FsZUZhY3Rvcixmb250U2l6ZTp0LmZvbnRTaXplLGZvbnROYW1lOnQuZm9udE5hbWUsZm9udENvbG9yOnQuZm9udENvbG9yLnNsaWNlKCksZmlsbENvbG9yU3BhY2U6dC5maWxsQ29sb3JTcGFjZX0pO2JyZWFrO2Nhc2UgaS5PUFMucmVzdG9yZTp0PWEucG9wKCl8fHQ7YnJlYWs7Y2FzZSBpLk9QUy5zZXRUZXh0TWF0cml4OnQuc2NhbGVGYWN0b3IqPU1hdGguaHlwb3QoY1swXSxjWzFdKTticmVhaztjYXNlIGkuT1BTLnNldEZvbnQ6Y29uc3RbZSxvXT1jO2UgaW5zdGFuY2VvZiBuLk5hbWUmJih0LmZvbnROYW1lPWUubmFtZSksIm51bWJlciI9PXR5cGVvZiBvJiZvPjAmJih0LmZvbnRTaXplPW8qdC5zY2FsZUZhY3Rvcik7YnJlYWs7Y2FzZSBpLk9QUy5zZXRGaWxsQ29sb3JTcGFjZTp0LmZpbGxDb2xvclNwYWNlPXMuQ29sb3JTcGFjZS5wYXJzZSh7Y3M6Y1swXSx4cmVmOnRoaXMueHJlZixyZXNvdXJjZXM6dGhpcy5yZXNvdXJjZXMscGRmRnVuY3Rpb25GYWN0b3J5OnRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSxsb2NhbENvbG9yU3BhY2VDYWNoZTp0aGlzLl9sb2NhbENvbG9yU3BhY2VDYWNoZX0pO2JyZWFrO2Nhc2UgaS5PUFMuc2V0RmlsbENvbG9yOnQuZmlsbENvbG9yU3BhY2UuZ2V0UmdiSXRlbShjLDAsdC5mb250Q29sb3IsMCk7YnJlYWs7Y2FzZSBpLk9QUy5zZXRGaWxsUkdCQ29sb3I6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYkl0ZW0oYywwLHQuZm9udENvbG9yLDApO2JyZWFrO2Nhc2UgaS5PUFMuc2V0RmlsbEdyYXk6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2JJdGVtKGMsMCx0LmZvbnRDb2xvciwwKTticmVhaztjYXNlIGkuT1BTLnNldEZpbGxDTVlLQ29sb3I6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2JJdGVtKGMsMCx0LmZvbnRDb2xvciwwKTticmVhaztjYXNlIGkuT1BTLnNob3dUZXh0OmNhc2UgaS5PUFMuc2hvd1NwYWNlZFRleHQ6Y2FzZSBpLk9QUy5uZXh0TGluZVNob3dUZXh0OmNhc2UgaS5PUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6cj0hMH19fWNhdGNoKGUpeygwLGkud2FybikoJ3BhcnNlQXBwZWFyYW5jZVN0cmVhbSAtIGlnbm9yaW5nIGVycm9yczogIicuY29uY2F0KGUsJyIuJykpfXJldHVybiB0aGlzLnN0cmVhbS5yZXNldCgpLGRlbGV0ZSB0LnNjYWxlRmFjdG9yLGRlbGV0ZSB0LmZpbGxDb2xvclNwYWNlLHR9Z2V0IF9sb2NhbENvbG9yU3BhY2VDYWNoZSgpe3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJfbG9jYWxDb2xvclNwYWNlQ2FjaGUiLG5ldyBjLkxvY2FsQ29sb3JTcGFjZUNhY2hlKX1nZXQgX3BkZkZ1bmN0aW9uRmFjdG9yeSgpe2NvbnN0IGU9bmV3IGwuUERGRnVuY3Rpb25GYWN0b3J5KHt4cmVmOnRoaXMueHJlZixpc0V2YWxTdXBwb3J0ZWQ6dGhpcy5ldmFsdWF0b3JPcHRpb25zLmlzRXZhbFN1cHBvcnRlZH0pO3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJfcGRmRnVuY3Rpb25GYWN0b3J5IixlKX19ZnVuY3Rpb24gZihlLHQpe2lmKGVbMF09PT1lWzFdJiZlWzFdPT09ZVsyXSl7Y29uc3Qgcj1lWzBdLzI1NTtyZXR1cm4iIi5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykociksIiAiKS5jb25jYXQodD8iZyI6IkciKX1yZXR1cm4gQXJyYXkuZnJvbShlLChlPT4oMCxhLm51bWJlclRvU3RyaW5nKShlLzI1NSkpKS5qb2luKCIgIikrIiAiKyh0PyJyZyI6IlJHIil9Y2xhc3MgZ3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMueHJlZj1lLHRoaXMud2lkdGhzPW51bGwsdGhpcy5maXJzdENoYXI9MS8wLHRoaXMubGFzdENoYXI9LTEvMCx0aGlzLmZvbnRGYW1pbHk9dDtjb25zdCByPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKTt0aGlzLmN0eE1lYXN1cmU9ci5nZXRDb250ZXh0KCIyZCIpLGcuX2ZvbnROYW1lSWR8fChnLl9mb250TmFtZUlkPTEpLHRoaXMuZm9udE5hbWU9bi5OYW1lLmdldCgiSW52YWxpZFBERmpzRm9udF8iLmNvbmNhdCh0LCJfIikuY29uY2F0KGcuX2ZvbnROYW1lSWQrKykpfWdldCB0b1VuaWNvZGVSZWYoKXtpZighZy5fdG9Vbmljb2RlUmVmKXtjb25zdCBlPSIvQ0lESW5pdCAvUHJvY1NldCBmaW5kcmVzb3VyY2UgYmVnaW5cbjEyIGRpY3QgYmVnaW5cbmJlZ2luY21hcFxuL0NJRFN5c3RlbUluZm9cbjw8IC9SZWdpc3RyeSAoQWRvYmUpXG4vT3JkZXJpbmcgKFVDUykgL1N1cHBsZW1lbnQgMCA+PiBkZWZcbi9DTWFwTmFtZSAvQWRvYmUtSWRlbnRpdHktVUNTIGRlZlxuL0NNYXBUeXBlIDIgZGVmXG4xIGJlZ2luY29kZXNwYWNlcmFuZ2VcbjwwMDAwPiA8RkZGRj5cbmVuZGNvZGVzcGFjZXJhbmdlXG4xIGJlZ2luYmZyYW5nZVxuPDAwMDA+IDxGRkZGPiA8MDAwMD5cbmVuZGJmcmFuZ2VcbmVuZGNtYXAgQ01hcE5hbWUgY3VycmVudGRpY3QgL0NNYXAgZGVmaW5lcmVzb3VyY2UgcG9wIGVuZCBlbmQiLHQ9Zy50b1VuaWNvZGVTdHJlYW09bmV3IGguU3RyaW5nU3RyZWFtKGUpLHI9bmV3IG4uRGljdCh0aGlzLnhyZWYpO3QuZGljdD1yLHIuc2V0KCJMZW5ndGgiLGUubGVuZ3RoKSxnLl90b1VuaWNvZGVSZWY9dGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYodCl9cmV0dXJuIGcuX3RvVW5pY29kZVJlZn1nZXQgZm9udERlc2NyaXB0b3JSZWYoKXtpZighZy5fZm9udERlc2NyaXB0b3JSZWYpe2NvbnN0IGU9bmV3IG4uRGljdCh0aGlzLnhyZWYpO2Uuc2V0KCJUeXBlIixuLk5hbWUuZ2V0KCJGb250RGVzY3JpcHRvciIpKSxlLnNldCgiRm9udE5hbWUiLHRoaXMuZm9udE5hbWUpLGUuc2V0KCJGb250RmFtaWx5IiwiTXlyaWFkUHJvIFJlZ3VsYXIiKSxlLnNldCgiRm9udEJCb3giLFswLDAsMCwwXSksZS5zZXQoIkZvbnRTdHJldGNoIixuLk5hbWUuZ2V0KCJOb3JtYWwiKSksZS5zZXQoIkZvbnRXZWlnaHQiLDQwMCksZS5zZXQoIkl0YWxpY0FuZ2xlIiwwKSxnLl9mb250RGVzY3JpcHRvclJlZj10aGlzLnhyZWYuZ2V0TmV3UGVyc2lzdGVudFJlZihlKX1yZXR1cm4gZy5fZm9udERlc2NyaXB0b3JSZWZ9Z2V0IGRlc2NlbmRhbnRGb250UmVmKCl7Y29uc3QgZT1uZXcgbi5EaWN0KHRoaXMueHJlZik7ZS5zZXQoIkJhc2VGb250Iix0aGlzLmZvbnROYW1lKSxlLnNldCgiVHlwZSIsbi5OYW1lLmdldCgiRm9udCIpKSxlLnNldCgiU3VidHlwZSIsbi5OYW1lLmdldCgiQ0lERm9udFR5cGUwIikpLGUuc2V0KCJDSURUb0dJRE1hcCIsbi5OYW1lLmdldCgiSWRlbnRpdHkiKSksZS5zZXQoIkZpcnN0Q2hhciIsdGhpcy5maXJzdENoYXIpLGUuc2V0KCJMYXN0Q2hhciIsdGhpcy5sYXN0Q2hhciksZS5zZXQoIkZvbnREZXNjcmlwdG9yIix0aGlzLmZvbnREZXNjcmlwdG9yUmVmKSxlLnNldCgiRFciLDFlMyk7Y29uc3QgdD1bXSxyPVsuLi50aGlzLndpZHRocy5lbnRyaWVzKCldLnNvcnQoKTtsZXQgYT1udWxsLGk9bnVsbDtmb3IoY29uc3RbZSxuXW9mIHIpYT9lPT09YStpLmxlbmd0aD9pLnB1c2gobik6KHQucHVzaChhLGkpLGE9ZSxpPVtuXSk6KGE9ZSxpPVtuXSk7YSYmdC5wdXNoKGEsaSksZS5zZXQoIlciLHQpO2NvbnN0IHM9bmV3IG4uRGljdCh0aGlzLnhyZWYpO3JldHVybiBzLnNldCgiT3JkZXJpbmciLCJJZGVudGl0eSIpLHMuc2V0KCJSZWdpc3RyeSIsIkFkb2JlIikscy5zZXQoIlN1cHBsZW1lbnQiLDApLGUuc2V0KCJDSURTeXN0ZW1JbmZvIixzKSx0aGlzLnhyZWYuZ2V0TmV3UGVyc2lzdGVudFJlZihlKX1nZXQgYmFzZUZvbnRSZWYoKXtjb25zdCBlPW5ldyBuLkRpY3QodGhpcy54cmVmKTtyZXR1cm4gZS5zZXQoIkJhc2VGb250Iix0aGlzLmZvbnROYW1lKSxlLnNldCgiVHlwZSIsbi5OYW1lLmdldCgiRm9udCIpKSxlLnNldCgiU3VidHlwZSIsbi5OYW1lLmdldCgiVHlwZTAiKSksZS5zZXQoIkVuY29kaW5nIixuLk5hbWUuZ2V0KCJJZGVudGl0eS1IIikpLGUuc2V0KCJEZXNjZW5kYW50Rm9udHMiLFt0aGlzLmRlc2NlbmRhbnRGb250UmVmXSksZS5zZXQoIlRvVW5pY29kZSIsdGhpcy50b1VuaWNvZGVSZWYpLHRoaXMueHJlZi5nZXROZXdQZXJzaXN0ZW50UmVmKGUpfWdldCByZXNvdXJjZXMoKXtjb25zdCBlPW5ldyBuLkRpY3QodGhpcy54cmVmKSx0PW5ldyBuLkRpY3QodGhpcy54cmVmKTtyZXR1cm4gdC5zZXQodGhpcy5mb250TmFtZS5uYW1lLHRoaXMuYmFzZUZvbnRSZWYpLGUuc2V0KCJGb250Iix0KSxlfV9jcmVhdGVDb250ZXh0KCl7cmV0dXJuIHRoaXMud2lkdGhzPW5ldyBNYXAsdGhpcy5jdHhNZWFzdXJlLmZvbnQ9IjEwMDBweCAiLmNvbmNhdCh0aGlzLmZvbnRGYW1pbHkpLHRoaXMuY3R4TWVhc3VyZX1jcmVhdGVGb250UmVzb3VyY2VzKGUpe2NvbnN0IHQ9dGhpcy5fY3JlYXRlQ29udGV4dCgpO2Zvcihjb25zdCByIG9mIGUuc3BsaXQoL1xyXG4/fFxuLykpZm9yKGNvbnN0IGUgb2Ygci5zcGxpdCgiIikpe2NvbnN0IHI9ZS5jaGFyQ29kZUF0KDApO2lmKHRoaXMud2lkdGhzLmhhcyhyKSljb250aW51ZTtjb25zdCBuPXQubWVhc3VyZVRleHQoZSksYT1NYXRoLmNlaWwobi53aWR0aCk7dGhpcy53aWR0aHMuc2V0KHIsYSksdGhpcy5maXJzdENoYXI9TWF0aC5taW4ocix0aGlzLmZpcnN0Q2hhciksdGhpcy5sYXN0Q2hhcj1NYXRoLm1heChyLHRoaXMubGFzdENoYXIpfXJldHVybiB0aGlzLnJlc291cmNlc31jcmVhdGVBcHBlYXJhbmNlKGUsdCxyLHMsbyxjKXtjb25zdCBsPXRoaXMuX2NyZWF0ZUNvbnRleHQoKSx1PVtdO2xldCBkPS0xLzA7Zm9yKGNvbnN0IHQgb2YgZS5zcGxpdCgvXHJcbj98XG4vKSl7dS5wdXNoKHQpO2NvbnN0IGU9bC5tZWFzdXJlVGV4dCh0KS53aWR0aDtkPU1hdGgubWF4KGQsZSk7Zm9yKGNvbnN0IGUgb2YgdC5zcGxpdCgiIikpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KDApO2xldCByPXRoaXMud2lkdGhzLmdldCh0KTtpZih2b2lkIDA9PT1yKXtjb25zdCBuPWwubWVhc3VyZVRleHQoZSk7cj1NYXRoLmNlaWwobi53aWR0aCksdGhpcy53aWR0aHMuc2V0KHQsciksdGhpcy5maXJzdENoYXI9TWF0aC5taW4odCx0aGlzLmZpcnN0Q2hhciksdGhpcy5sYXN0Q2hhcj1NYXRoLm1heCh0LHRoaXMubGFzdENoYXIpfX19ZCo9cy8xZTM7Y29uc3RbZyxwLG0sYl09dDtsZXQgeT1tLWcsdz1iLXA7ciUxODAhPTAmJihbeSx3XT1bdyx5XSk7bGV0IHY9MTtkPnkmJih2PXkvZCk7bGV0IHg9MTtjb25zdCBTPWkuTElORV9GQUNUT1IqcyxBPWkuTElORV9ERVNDRU5UX0ZBQ1RPUipzLGs9Uyp1Lmxlbmd0aDtrPncmJih4PXcvayk7Y29uc3QgQz1zKk1hdGgubWluKHYseCksTz1bInEiLCIwIDAgIi5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoeSksIiAiKS5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykodyksIiByZSBXIG4iKSwiQlQiLCIxIDAgMCAxIDAgIi5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykodytBKSwiIFRtIDAgVGMgIikuY29uY2F0KGYobywhMCkpLCIvIi5jb25jYXQodGhpcy5mb250TmFtZS5uYW1lLCIgIikuY29uY2F0KCgwLGEubnVtYmVyVG9TdHJpbmcpKEMpLCIgVGYiKV0se3Jlc291cmNlczpGfT10aGlzO2lmKDEhPT0oYz0ibnVtYmVyIj09dHlwZW9mIGMmJmM+PTAmJmM8PTE/YzoxKSl7Ty5wdXNoKCIvUjAgZ3MiKTtjb25zdCBlPW5ldyBuLkRpY3QodGhpcy54cmVmKSx0PW5ldyBuLkRpY3QodGhpcy54cmVmKTt0LnNldCgiY2EiLGMpLHQuc2V0KCJDQSIsYyksdC5zZXQoIlR5cGUiLG4uTmFtZS5nZXQoIkV4dEdTdGF0ZSIpKSxlLnNldCgiUjAiLHQpLEYuc2V0KCJFeHRHU3RhdGUiLGUpfWNvbnN0IEk9KDAsYS5udW1iZXJUb1N0cmluZykoUyk7Zm9yKGNvbnN0IGUgb2YgdSlPLnB1c2goIjAgLSIuY29uY2F0KEksIiBUZCA8IikuY29uY2F0KCgwLGEuc3RyaW5nVG9VVEYxNkhleFN0cmluZykoZSksIj4gVGoiKSk7Ty5wdXNoKCJFVCIsIlEiKTtjb25zdCBUPU8uam9pbigiXG4iKSxNPW5ldyBuLkRpY3QodGhpcy54cmVmKTtpZihNLnNldCgiU3VidHlwZSIsbi5OYW1lLmdldCgiRm9ybSIpKSxNLnNldCgiVHlwZSIsbi5OYW1lLmdldCgiWE9iamVjdCIpKSxNLnNldCgiQkJveCIsWzAsMCx5LHddKSxNLnNldCgiTGVuZ3RoIixULmxlbmd0aCksTS5zZXQoIlJlc291cmNlcyIsRikscil7Y29uc3QgZT0oMCxhLmdldFJvdGF0aW9uTWF0cml4KShyLHksdyk7TS5zZXQoIk1hdHJpeCIsZSl9Y29uc3QgRT1uZXcgaC5TdHJpbmdTdHJlYW0oVCk7cmV0dXJuIEUuZGljdD1NLEV9fXQuRmFrZVVuaWNvZGVGb250PWd9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Db2xvclNwYWNlPXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSkscigyKTt2YXIgbj1yKDE0NCksYT1yKDE1MCksaT1yKDE1MSkscz1yKDE0OSk7Y2xhc3Mgb3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuY29uc3RydWN0b3I9PT1vJiYoMCxuLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQ29sb3JTcGFjZS4iKSx0aGlzLm5hbWU9ZSx0aGlzLm51bUNvbXBzPXR9Z2V0UmdiKGUsdCl7Y29uc3Qgcj1uZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7cmV0dXJuIHRoaXMuZ2V0UmdiSXRlbShlLHQsciwwKSxyfWdldFJnYkl0ZW0oZSx0LHIsYSl7KDAsbi51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBDb2xvclNwYWNlLmdldFJnYkl0ZW0iKX1nZXRSZ2JCdWZmZXIoZSx0LHIsYSxpLHMsbyl7KDAsbi51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBDb2xvclNwYWNlLmdldFJnYkJ1ZmZlciIpfWdldE91dHB1dExlbmd0aChlLHQpeygwLG4udW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRPdXRwdXRMZW5ndGgiKX1pc1Bhc3N0aHJvdWdoKGUpe3JldHVybiExfWlzRGVmYXVsdERlY29kZShlLHQpe3JldHVybiBvLmlzRGVmYXVsdERlY29kZShlLHRoaXMubnVtQ29tcHMpfWZpbGxSZ2IoZSx0LHIsbixhLGkscyxvLGMpe2NvbnN0IGw9dCpyO2xldCBoPW51bGw7Y29uc3QgdT0xPDxzLGQ9ciE9PWF8fHQhPT1uO2lmKHRoaXMuaXNQYXNzdGhyb3VnaChzKSloPW87ZWxzZSBpZigxPT09dGhpcy5udW1Db21wcyYmbD51JiYiRGV2aWNlR3JheSIhPT10aGlzLm5hbWUmJiJEZXZpY2VSR0IiIT09dGhpcy5uYW1lKXtjb25zdCB0PXM8PTg/bmV3IFVpbnQ4QXJyYXkodSk6bmV3IFVpbnQxNkFycmF5KHUpO2ZvcihsZXQgZT0wO2U8dTtlKyspdFtlXT1lO2NvbnN0IHI9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMqdSk7aWYodGhpcy5nZXRSZ2JCdWZmZXIodCwwLHUsciwwLHMsMCksZCl7aD1uZXcgVWludDhBcnJheSgzKmwpO2xldCBlPTA7Zm9yKGxldCB0PTA7dDxsOysrdCl7Y29uc3Qgbj0zKm9bdF07aFtlKytdPXJbbl0saFtlKytdPXJbbisxXSxoW2UrK109cltuKzJdfX1lbHNle2xldCB0PTA7Zm9yKGxldCBuPTA7bjxsOysrbil7Y29uc3QgYT0zKm9bbl07ZVt0KytdPXJbYV0sZVt0KytdPXJbYSsxXSxlW3QrK109clthKzJdLHQrPWN9fX1lbHNlIGQ/KGg9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMqbCksdGhpcy5nZXRSZ2JCdWZmZXIobywwLGwsaCwwLHMsMCkpOnRoaXMuZ2V0UmdiQnVmZmVyKG8sMCxuKmksZSwwLHMsYyk7aWYoaClpZihkKSFmdW5jdGlvbihlLHQscixuLGEsaSxzKXtzPTEhPT1zPzA6cztjb25zdCBvPXIvYSxjPW4vaTtsZXQgbCxoPTA7Y29uc3QgdT1uZXcgVWludDE2QXJyYXkoYSksZD0zKnI7Zm9yKGxldCBlPTA7ZTxhO2UrKyl1W2VdPTMqTWF0aC5mbG9vcihlKm8pO2ZvcihsZXQgcj0wO3I8aTtyKyspe2NvbnN0IG49TWF0aC5mbG9vcihyKmMpKmQ7Zm9yKGxldCByPTA7cjxhO3IrKylsPW4rdVtyXSx0W2grK109ZVtsKytdLHRbaCsrXT1lW2wrK10sdFtoKytdPWVbbCsrXSxoKz1zfX0oaCxlLHQscixuLGEsYyk7ZWxzZXtsZXQgdD0wLHI9MDtmb3IobGV0IGE9MCxzPW4qaTthPHM7YSsrKWVbdCsrXT1oW3IrK10sZVt0KytdPWhbcisrXSxlW3QrK109aFtyKytdLHQrPWN9fWdldCB1c2VzWmVyb1RvT25lUmFuZ2UoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywidXNlc1plcm9Ub09uZVJhbmdlIiwhMCl9c3RhdGljIF9jYWNoZShlLHQscixuKXtpZighcil0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgImxvY2FsQ29sb3JTcGFjZUNhY2hlIiBhcmd1bWVudC4nKTtpZighbil0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgInBhcnNlZENvbG9yU3BhY2UiIGFyZ3VtZW50LicpO2xldCBpLHM7ZSBpbnN0YW5jZW9mIGEuUmVmJiYocz1lLGU9dC5mZXRjaChlKSksZSBpbnN0YW5jZW9mIGEuTmFtZSYmKGk9ZS5uYW1lKSwoaXx8cykmJnIuc2V0KGkscyxuKX1zdGF0aWMgZ2V0Q2FjaGVkKGUsdCxyKXtpZighcil0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuZ2V0Q2FjaGVkIC0gZXhwZWN0ZWQgImxvY2FsQ29sb3JTcGFjZUNhY2hlIiBhcmd1bWVudC4nKTtpZihlIGluc3RhbmNlb2YgYS5SZWYpe2NvbnN0IG49ci5nZXRCeVJlZihlKTtpZihuKXJldHVybiBuO3RyeXtlPXQuZmV0Y2goZSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZX19aWYoZSBpbnN0YW5jZW9mIGEuTmFtZSl7Y29uc3QgdD1yLmdldEJ5TmFtZShlLm5hbWUpO2lmKHQpcmV0dXJuIHR9cmV0dXJuIG51bGx9c3RhdGljIGFzeW5jIHBhcnNlQXN5bmMoZSl7bGV0e2NzOnQseHJlZjpyLHJlc291cmNlczpuPW51bGwscGRmRnVuY3Rpb25GYWN0b3J5OmEsbG9jYWxDb2xvclNwYWNlQ2FjaGU6aX09ZTtjb25zdCBzPXRoaXMuX3BhcnNlKHQscixuLGEpO3JldHVybiB0aGlzLl9jYWNoZSh0LHIsaSxzKSxzfXN0YXRpYyBwYXJzZShlKXtsZXR7Y3M6dCx4cmVmOnIscmVzb3VyY2VzOm49bnVsbCxwZGZGdW5jdGlvbkZhY3Rvcnk6YSxsb2NhbENvbG9yU3BhY2VDYWNoZTppfT1lO2NvbnN0IHM9dGhpcy5nZXRDYWNoZWQodCxyLGkpO2lmKHMpcmV0dXJuIHM7Y29uc3Qgbz10aGlzLl9wYXJzZSh0LHIsbixhKTtyZXR1cm4gdGhpcy5fY2FjaGUodCxyLGksbyksb31zdGF0aWMgX3BhcnNlKGUsdCl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsaT1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMDtpZigoZT10LmZldGNoSWZSZWYoZSkpaW5zdGFuY2VvZiBhLk5hbWUpc3dpdGNoKGUubmFtZSl7Y2FzZSJHIjpjYXNlIkRldmljZUdyYXkiOnJldHVybiB0aGlzLnNpbmdsZXRvbnMuZ3JheTtjYXNlIlJHQiI6Y2FzZSJEZXZpY2VSR0IiOnJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiO2Nhc2UiQ01ZSyI6Y2FzZSJEZXZpY2VDTVlLIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7Y2FzZSJQYXR0ZXJuIjpyZXR1cm4gbmV3IGwobnVsbCk7ZGVmYXVsdDppZihyIGluc3RhbmNlb2YgYS5EaWN0KXtjb25zdCBuPXIuZ2V0KCJDb2xvclNwYWNlIik7aWYobiBpbnN0YW5jZW9mIGEuRGljdCl7Y29uc3Qgcz1uLmdldChlLm5hbWUpO2lmKHMpe2lmKHMgaW5zdGFuY2VvZiBhLk5hbWUpcmV0dXJuIHRoaXMuX3BhcnNlKHMsdCxyLGkpO2U9czticmVha319fXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbnJlY29nbml6ZWQgQ29sb3JTcGFjZTogIi5jb25jYXQoZS5uYW1lKSl9aWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgYT10LmZldGNoSWZSZWYoZVswXSkubmFtZTtsZXQgcyxvLHUsZCxmLGI7c3dpdGNoKGEpe2Nhc2UiRyI6Y2FzZSJEZXZpY2VHcmF5IjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7Y2FzZSJSR0IiOmNhc2UiRGV2aWNlUkdCIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjtjYXNlIkNNWUsiOmNhc2UiRGV2aWNlQ01ZSyI6cmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrO2Nhc2UiQ2FsR3JheSI6cmV0dXJuIHM9dC5mZXRjaElmUmVmKGVbMV0pLGQ9cy5nZXRBcnJheSgiV2hpdGVQb2ludCIpLGY9cy5nZXRBcnJheSgiQmxhY2tQb2ludCIpLGI9cy5nZXQoIkdhbW1hIiksbmV3IGcoZCxmLGIpO2Nhc2UiQ2FsUkdCIjpzPXQuZmV0Y2hJZlJlZihlWzFdKSxkPXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKSxmPXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKSxiPXMuZ2V0QXJyYXkoIkdhbW1hIik7Y29uc3QgeT1zLmdldEFycmF5KCJNYXRyaXgiKTtyZXR1cm4gbmV3IHAoZCxmLGIseSk7Y2FzZSJJQ0NCYXNlZCI6Y29uc3Qgdz10LmZldGNoSWZSZWYoZVsxXSkuZGljdDtvPXcuZ2V0KCJOIik7Y29uc3Qgdj13LmdldCgiQWx0ZXJuYXRlIik7aWYodil7Y29uc3QgZT10aGlzLl9wYXJzZSh2LHQscixpKTtpZihlLm51bUNvbXBzPT09bylyZXR1cm4gZTsoMCxuLndhcm4pKCJJQ0NCYXNlZCBjb2xvciBzcGFjZTogSWdub3JpbmcgaW5jb3JyZWN0IC9BbHRlcm5hdGUgZW50cnkuIil9aWYoMT09PW8pcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5O2lmKDM9PT1vKXJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiO2lmKDQ9PT1vKXJldHVybiB0aGlzLnNpbmdsZXRvbnMuY215azticmVhaztjYXNlIlBhdHRlcm4iOnJldHVybiB1PWVbMV18fG51bGwsdSYmKHU9dGhpcy5fcGFyc2UodSx0LHIsaSkpLG5ldyBsKHUpO2Nhc2UiSSI6Y2FzZSJJbmRleGVkIjp1PXRoaXMuX3BhcnNlKGVbMV0sdCxyLGkpO2NvbnN0IHg9dC5mZXRjaElmUmVmKGVbMl0pKzEsUz10LmZldGNoSWZSZWYoZVszXSk7cmV0dXJuIG5ldyBoKHUseCxTKTtjYXNlIlNlcGFyYXRpb24iOmNhc2UiRGV2aWNlTiI6Y29uc3QgQT10LmZldGNoSWZSZWYoZVsxXSk7bz1BcnJheS5pc0FycmF5KEEpP0EubGVuZ3RoOjEsdT10aGlzLl9wYXJzZShlWzJdLHQscixpKTtjb25zdCBrPWkuY3JlYXRlKGVbM10pO3JldHVybiBuZXcgYyhvLHUsayk7Y2FzZSJMYWIiOnM9dC5mZXRjaElmUmVmKGVbMV0pLGQ9cy5nZXRBcnJheSgiV2hpdGVQb2ludCIpLGY9cy5nZXRBcnJheSgiQmxhY2tQb2ludCIpO2NvbnN0IEM9cy5nZXRBcnJheSgiUmFuZ2UiKTtyZXR1cm4gbmV3IG0oZCxmLEMpO2RlZmF1bHQ6dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVuaW1wbGVtZW50ZWQgQ29sb3JTcGFjZSBvYmplY3Q6ICIuY29uY2F0KGEpKX19dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVucmVjb2duaXplZCBDb2xvclNwYWNlIG9iamVjdDogIi5jb25jYXQoZSkpfXN0YXRpYyBpc0RlZmF1bHREZWNvZGUoZSx0KXtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4hMDtpZigyKnQhPT1lLmxlbmd0aClyZXR1cm4oMCxuLndhcm4pKCJUaGUgZGVjb2RlIG1hcCBpcyBub3QgdGhlIGNvcnJlY3QgbGVuZ3RoIiksITA7Zm9yKGxldCB0PTAscj1lLmxlbmd0aDt0PHI7dCs9MilpZigwIT09ZVt0XXx8MSE9PWVbdCsxXSlyZXR1cm4hMTtyZXR1cm4hMH1zdGF0aWMgZ2V0IHNpbmdsZXRvbnMoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywic2luZ2xldG9ucyIse2dldCBncmF5KCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImdyYXkiLG5ldyB1KX0sZ2V0IHJnYigpe3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJyZ2IiLG5ldyBkKX0sZ2V0IGNteWsoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiY215ayIsbmV3IGYpfX0pfX10LkNvbG9yU3BhY2U9bztjbGFzcyBjIGV4dGVuZHMgb3tjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIoIkFsdGVybmF0ZSIsZSksdGhpcy5iYXNlPXQsdGhpcy50aW50Rm49cix0aGlzLnRtcEJ1Zj1uZXcgRmxvYXQzMkFycmF5KHQubnVtQ29tcHMpfWdldFJnYkl0ZW0oZSx0LHIsbil7Y29uc3QgYT10aGlzLnRtcEJ1Zjt0aGlzLnRpbnRGbihlLHQsYSwwKSx0aGlzLmJhc2UuZ2V0UmdiSXRlbShhLDAscixuKX1nZXRSZ2JCdWZmZXIoZSx0LHIsbixhLGkscyl7Y29uc3Qgbz10aGlzLnRpbnRGbixjPXRoaXMuYmFzZSxsPTEvKCgxPDxpKS0xKSxoPWMubnVtQ29tcHMsdT1jLnVzZXNaZXJvVG9PbmVSYW5nZSxkPShjLmlzUGFzc3Rocm91Z2goOCl8fCF1KSYmMD09PXM7bGV0IGY9ZD9hOjA7Y29uc3QgZz1kP246bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGgqcikscD10aGlzLm51bUNvbXBzLG09bmV3IEZsb2F0MzJBcnJheShwKSxiPW5ldyBGbG9hdDMyQXJyYXkoaCk7bGV0IHksdztmb3IoeT0wO3k8cjt5Kyspe2Zvcih3PTA7dzxwO3crKyltW3ddPWVbdCsrXSpsO2lmKG8obSwwLGIsMCksdSlmb3Iodz0wO3c8aDt3KyspZ1tmKytdPTI1NSpiW3ddO2Vsc2UgYy5nZXRSZ2JJdGVtKGIsMCxnLGYpLGYrPWh9ZHx8Yy5nZXRSZ2JCdWZmZXIoZywwLHIsbixhLDgscyl9Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIHRoaXMuYmFzZS5nZXRPdXRwdXRMZW5ndGgoZSp0aGlzLmJhc2UubnVtQ29tcHMvdGhpcy5udW1Db21wcyx0KX19Y2xhc3MgbCBleHRlbmRzIG97Y29uc3RydWN0b3IoZSl7c3VwZXIoIlBhdHRlcm4iLG51bGwpLHRoaXMuYmFzZT1lfWlzRGVmYXVsdERlY29kZShlLHQpeygwLG4udW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgUGF0dGVybkNTLmlzRGVmYXVsdERlY29kZSIpfX1jbGFzcyBoIGV4dGVuZHMgb3tjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIoIkluZGV4ZWQiLDEpLHRoaXMuYmFzZT1lLHRoaXMuaGlnaFZhbD10O2NvbnN0IGE9ZS5udW1Db21wcyp0O2lmKHRoaXMubG9va3VwPW5ldyBVaW50OEFycmF5KGEpLHIgaW5zdGFuY2VvZiBpLkJhc2VTdHJlYW0pe2NvbnN0IGU9ci5nZXRCeXRlcyhhKTt0aGlzLmxvb2t1cC5zZXQoZSl9ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkluZGV4ZWRDUyAtIHVucmVjb2duaXplZCBsb29rdXAgdGFibGU6ICIuY29uY2F0KHIpKTtmb3IobGV0IGU9MDtlPGE7KytlKXRoaXMubG9va3VwW2VdPTI1NSZyLmNoYXJDb2RlQXQoZSl9fWdldFJnYkl0ZW0oZSx0LHIsbil7Y29uc3QgYT10aGlzLmJhc2UubnVtQ29tcHMsaT1lW3RdKmE7dGhpcy5iYXNlLmdldFJnYkJ1ZmZlcih0aGlzLmxvb2t1cCxpLDEscixuLDgsMCl9Z2V0UmdiQnVmZmVyKGUsdCxyLG4sYSxpLHMpe2NvbnN0IG89dGhpcy5iYXNlLGM9by5udW1Db21wcyxsPW8uZ2V0T3V0cHV0TGVuZ3RoKGMscyksaD10aGlzLmxvb2t1cDtmb3IobGV0IGk9MDtpPHI7KytpKXtjb25zdCByPWVbdCsrXSpjO28uZ2V0UmdiQnVmZmVyKGgsciwxLG4sYSw4LHMpLGErPWx9fWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGUqdGhpcy5iYXNlLm51bUNvbXBzLHQpfWlzRGVmYXVsdERlY29kZShlLHQpe3JldHVybiFBcnJheS5pc0FycmF5KGUpfHwoMiE9PWUubGVuZ3RoPygoMCxuLndhcm4pKCJEZWNvZGUgbWFwIGxlbmd0aCBpcyBub3QgY29ycmVjdCIpLCEwKTohTnVtYmVyLmlzSW50ZWdlcih0KXx8dDwxPygoMCxuLndhcm4pKCJCaXRzIHBlciBjb21wb25lbnQgaXMgbm90IGNvcnJlY3QiKSwhMCk6MD09PWVbMF0mJmVbMV09PT0oMTw8dCktMSl9fWNsYXNzIHUgZXh0ZW5kcyBve2NvbnN0cnVjdG9yKCl7c3VwZXIoIkRldmljZUdyYXkiLDEpfWdldFJnYkl0ZW0oZSx0LHIsbil7Y29uc3QgYT0yNTUqZVt0XTtyW25dPXJbbisxXT1yW24rMl09YX1nZXRSZ2JCdWZmZXIoZSx0LHIsbixhLGkscyl7Y29uc3Qgbz0yNTUvKCgxPDxpKS0xKTtsZXQgYz10LGw9YTtmb3IobGV0IHQ9MDt0PHI7Kyt0KXtjb25zdCB0PW8qZVtjKytdO25bbCsrXT10LG5bbCsrXT10LG5bbCsrXT10LGwrPXN9fWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiBlKigzK3QpfX1jbGFzcyBkIGV4dGVuZHMgb3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCJEZXZpY2VSR0IiLDMpfWdldFJnYkl0ZW0oZSx0LHIsbil7cltuXT0yNTUqZVt0XSxyW24rMV09MjU1KmVbdCsxXSxyW24rMl09MjU1KmVbdCsyXX1nZXRSZ2JCdWZmZXIoZSx0LHIsbixhLGkscyl7aWYoOD09PWkmJjA9PT1zKXJldHVybiB2b2lkIG4uc2V0KGUuc3ViYXJyYXkodCx0KzMqciksYSk7Y29uc3Qgbz0yNTUvKCgxPDxpKS0xKTtsZXQgYz10LGw9YTtmb3IobGV0IHQ9MDt0PHI7Kyt0KW5bbCsrXT1vKmVbYysrXSxuW2wrK109byplW2MrK10sbltsKytdPW8qZVtjKytdLGwrPXN9Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCkvM3wwfWlzUGFzc3Rocm91Z2goZSl7cmV0dXJuIDg9PT1lfX1jb25zdCBmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQscixuLGEpe2NvbnN0IGk9ZVt0XSpyLHM9ZVt0KzFdKnIsbz1lW3QrMl0qcixjPWVbdCszXSpyO25bYV09MjU1K2kqKC00LjM4NzMzMjM4NDYwOTk4OCppKzU0LjQ4NjE1MTk0MTg5MTc2KnMrMTguODIyOTA1MDIxNjUzMDIqbysyMTIuMjU2NjI0NTE2Mzk1ODUqYy0yODUuMjMzMTAyNjEzNzAwNCkrcyooMS43MTQ5NzYzNDc3MzYyMTM0KnMtNS42MDk2NzM2OTA0MDQ3MzE1Km8rLTE3Ljg3Mzg3MDg2MTQxNTQ0NCpjLTUuNDk3MDA2NDI3MTk2MzY2KStvKigtMi41MjE3MzQwMTMxNjgzMDMzKm8tMjEuMjQ4OTIzMzM3MzUzMDczKmMrMTcuNTExOTI3MDg0MTgxMykrYyooLTIxLjg2MTIyMTQ3NDYzNjA1KmMtMTg5LjQ4MTgwODM1OTIyNzQ3KSxuW2ErMV09MjU1K2kqKDguODQxMDQxNDIyMDM2MTQ5KmkrNjAuMTE4MDI3MDQ1NTk3MzY2KnMrNi44NzE0MjU1OTIwNDkwMDcqbyszMS4xNTkxMDAxMzAwNTU5MjIqYy03OS4yOTcwODQ0ODE2NTQ4KStzKigtMTUuMzEwMzYxMzA2OTY3ODE3KnMrMTcuNTc1MjUxMjYxMTA5NDgyKm8rMTMxLjM1MjUwOTEyNDkzOTc2KmMtMTkwLjk0NTMzMDI1ODg5NTEpK28qKDQuNDQ0MzM5MTAyODUyNzM5Km8rOS44NjMyODYxNDkzNDA1KmMtMjQuODY3NDE1ODI1NTU4NzgpK2MqKC0yMC43MzczMjU0NzExODEwMzQqYy0xODcuODA0NTM3MDk3MTk1NzgpLG5bYSsyXT0yNTUraSooLjg4NDI1MjI0MzAwMDMyOTYqaSs4LjA3ODY3NzUwMzExMjkyOCpzKzMwLjg5OTc4MzA5NzAzNzI5Km8tLjIzODgzMjM4Njg5MTc4OTM0KmMtMTQuMTgzNTc2Nzk5NjczMjg2KStzKigxMC40OTU5MzI3MzQzMjA3MipzKzYzLjAyMzc4NDk0NzU0MDUyKm8rNTAuNjA2OTU3NjU2MzYwNzM0KmMtMTEyLjIzODg0MjUzNzE5MjQ4KStvKiguMDMyOTYwNDExMTQ4NzMyMTcqbysxMTUuNjAzODQ0NDk2NDY2NDEqYy0xOTMuNTgyMDkzNTY4NjE1MDUpK2MqKC0yMi4zMzgxNjgwNzMwOTg4NipjLTE4MC4xMjYxMzk3NDcwODM2Nyl9cmV0dXJuIGNsYXNzIGV4dGVuZHMgb3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCJEZXZpY2VDTVlLIiw0KX1nZXRSZ2JJdGVtKHQscixuLGEpe2UodCxyLDEsbixhKX1nZXRSZ2JCdWZmZXIodCxyLG4sYSxpLHMsbyl7Y29uc3QgYz0xLygoMTw8cyktMSk7Zm9yKGxldCBzPTA7czxuO3MrKyllKHQscixjLGEsaSkscis9NCxpKz0zK299Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUvNCooMyt0KXwwfX19KCksZz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LHIsbixhLGkpe2NvbnN0IHM9KHRbcl0qaSkqKmUuRyxvPWUuWVcqcyxjPU1hdGgubWF4KDI5NS44Km8qKi4zMzMzMzMzMzMzMzMzMzMzLTQwLjgsMCk7blthXT1jLG5bYSsxXT1jLG5bYSsyXT1jfXJldHVybiBjbGFzcyBleHRlbmRzIG97Y29uc3RydWN0b3IoZSx0LHIpe2lmKHN1cGVyKCJDYWxHcmF5IiwxKSwhZSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIENhbEdyYXkiKTtpZih0fHwodD1bMCwwLDBdKSxyfHwocj0xKSx0aGlzLlhXPWVbMF0sdGhpcy5ZVz1lWzFdLHRoaXMuWlc9ZVsyXSx0aGlzLlhCPXRbMF0sdGhpcy5ZQj10WzFdLHRoaXMuWkI9dFsyXSx0aGlzLkc9cix0aGlzLlhXPDB8fHRoaXMuWlc8MHx8MSE9PXRoaXMuWVcpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAiLmNvbmNhdCh0aGlzLm5hbWUsIiwgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIikpOyh0aGlzLlhCPDB8fHRoaXMuWUI8MHx8dGhpcy5aQjwwKSYmKCgwLG4uaW5mbykoIkludmFsaWQgQmxhY2tQb2ludCBmb3IgIi5jb25jYXQodGhpcy5uYW1lLCIsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LiIpKSx0aGlzLlhCPXRoaXMuWUI9dGhpcy5aQj0wKSwwPT09dGhpcy5YQiYmMD09PXRoaXMuWUImJjA9PT10aGlzLlpCfHwoMCxuLndhcm4pKCIiLmNvbmNhdCh0aGlzLm5hbWUsIiwgQmxhY2tQb2ludDogWEI6ICIpLmNvbmNhdCh0aGlzLlhCLCIsIFlCOiAiKS5jb25jYXQodGhpcy5ZQiwiLCBaQjogIikuY29uY2F0KHRoaXMuWkIsIiwgb25seSBkZWZhdWx0IHZhbHVlcyBhcmUgc3VwcG9ydGVkLiIpKSx0aGlzLkc8MSYmKCgwLG4uaW5mbykoIkludmFsaWQgR2FtbWE6ICIuY29uY2F0KHRoaXMuRywiIGZvciAiKS5jb25jYXQodGhpcy5uYW1lLCIsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LiIpKSx0aGlzLkc9MSl9Z2V0UmdiSXRlbSh0LHIsbixhKXtlKHRoaXMsdCxyLG4sYSwxKX1nZXRSZ2JCdWZmZXIodCxyLG4sYSxpLHMsbyl7Y29uc3QgYz0xLygoMTw8cyktMSk7Zm9yKGxldCBzPTA7czxuOysrcyllKHRoaXMsdCxyLGEsaSxjKSxyKz0xLGkrPTMrb31nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gZSooMyt0KX19fSgpLHA9ZnVuY3Rpb24oKXtjb25zdCBlPW5ldyBGbG9hdDMyQXJyYXkoWy44OTUxLC4yNjY0LC0uMTYxNCwtLjc1MDIsMS43MTM1LC4wMzY3LC4wMzg5LC0uMDY4NSwxLjAyOTZdKSx0PW5ldyBGbG9hdDMyQXJyYXkoWy45ODY5OTI5LC0uMTQ3MDU0MywuMTU5OTYyNywuNDMyMzA1MywuNTE4MzYwMywuMDQ5MjkxMiwtLjAwODUyODcsLjA0MDA0MjgsLjk2ODQ4NjddKSxyPW5ldyBGbG9hdDMyQXJyYXkoWzMuMjQwNDU0MiwtMS41MzcxMzg1LC0uNDk4NTMxNCwtLjk2OTI2NiwxLjg3NjAxMDgsLjA0MTU1NiwuMDU1NjQzNCwtLjIwNDAyNTksMS4wNTcyMjUyXSksYT1uZXcgRmxvYXQzMkFycmF5KFsxLDEsMV0pLGk9bmV3IEZsb2F0MzJBcnJheSgzKSxzPW5ldyBGbG9hdDMyQXJyYXkoMyksYz1uZXcgRmxvYXQzMkFycmF5KDMpLGw9KDI0LzExNikqKjMvODtmdW5jdGlvbiBoKGUsdCxyKXtyWzBdPWVbMF0qdFswXStlWzFdKnRbMV0rZVsyXSp0WzJdLHJbMV09ZVszXSp0WzBdK2VbNF0qdFsxXStlWzVdKnRbMl0sclsyXT1lWzZdKnRbMF0rZVs3XSp0WzFdK2VbOF0qdFsyXX1mdW5jdGlvbiB1KGUpe3JldHVybiBlPD0uMDAzMTMwOD9kKDAsMSwxMi45MiplKTplPj0uOTk1NTQ1MjU/MTpkKDAsMSwxLjA1NSplKiooMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIGQoZSx0LHIpe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKHQscikpfWZ1bmN0aW9uIGYoZSl7cmV0dXJuIGU8MD8tZigtZSk6ZT44PygoZSsxNikvMTE2KSoqMzplKmx9ZnVuY3Rpb24gZyhuLG8sbCxnLHAsbSl7Y29uc3QgYj1kKDAsMSxvW2xdKm0pLHk9ZCgwLDEsb1tsKzFdKm0pLHc9ZCgwLDEsb1tsKzJdKm0pLHY9MT09PWI/MTpiKipuLkdSLHg9MT09PXk/MTp5KipuLkdHLFM9MT09PXc/MTp3KipuLkdCLEE9bi5NWEEqdituLk1YQip4K24uTVhDKlMsaz1uLk1ZQSp2K24uTVlCKngrbi5NWUMqUyxDPW4uTVpBKnYrbi5NWkIqeCtuLk1aQypTLE89cztPWzBdPUEsT1sxXT1rLE9bMl09Qztjb25zdCBGPWM7IWZ1bmN0aW9uKHIsbixhKXtpZigxPT09clswXSYmMT09PXJbMl0pcmV0dXJuIGFbMF09blswXSxhWzFdPW5bMV0sdm9pZChhWzJdPW5bMl0pO2NvbnN0IHM9YTtoKGUsbixzKTtjb25zdCBvPWk7IWZ1bmN0aW9uKGUsdCxyKXtyWzBdPTEqdFswXS9lWzBdLHJbMV09MSp0WzFdL2VbMV0sclsyXT0xKnRbMl0vZVsyXX0ocixzLG8pLGgodCxvLGEpfShuLndoaXRlUG9pbnQsTyxGKTtjb25zdCBJPXM7IWZ1bmN0aW9uKGUsdCxyKXtpZigwPT09ZVswXSYmMD09PWVbMV0mJjA9PT1lWzJdKXJldHVybiByWzBdPXRbMF0sclsxXT10WzFdLHZvaWQoclsyXT10WzJdKTtjb25zdCBuPWYoMCksYT0oMS1uKS8oMS1mKGVbMF0pKSxpPTEtYSxzPSgxLW4pLygxLWYoZVsxXSkpLG89MS1zLGM9KDEtbikvKDEtZihlWzJdKSksbD0xLWM7clswXT10WzBdKmEraSxyWzFdPXRbMV0qcytvLHJbMl09dFsyXSpjK2x9KG4uYmxhY2tQb2ludCxGLEkpO2NvbnN0IFQ9YzshZnVuY3Rpb24ocixuLGEpe2NvbnN0IHM9YTtoKGUsbixzKTtjb25zdCBvPWk7IWZ1bmN0aW9uKGUsdCxyKXtyWzBdPS45NTA0Nyp0WzBdL2VbMF0sclsxXT0xKnRbMV0vZVsxXSxyWzJdPTEuMDg4ODMqdFsyXS9lWzJdfShyLHMsbyksaCh0LG8sYSl9KGEsSSxUKTtjb25zdCBNPXM7aChyLFQsTSksZ1twXT0yNTUqdShNWzBdKSxnW3ArMV09MjU1KnUoTVsxXSksZ1twKzJdPTI1NSp1KE1bMl0pfXJldHVybiBjbGFzcyBleHRlbmRzIG97Y29uc3RydWN0b3IoZSx0LHIsYSl7aWYoc3VwZXIoIkNhbFJHQiIsMyksIWUpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxSR0IiKTt0fHwodD1uZXcgRmxvYXQzMkFycmF5KDMpKSxyfHwocj1uZXcgRmxvYXQzMkFycmF5KFsxLDEsMV0pKSxhfHwoYT1uZXcgRmxvYXQzMkFycmF5KFsxLDAsMCwwLDEsMCwwLDAsMV0pKTtjb25zdCBpPWVbMF0scz1lWzFdLG89ZVsyXTt0aGlzLndoaXRlUG9pbnQ9ZTtjb25zdCBjPXRbMF0sbD10WzFdLGg9dFsyXTtpZih0aGlzLmJsYWNrUG9pbnQ9dCx0aGlzLkdSPXJbMF0sdGhpcy5HRz1yWzFdLHRoaXMuR0I9clsyXSx0aGlzLk1YQT1hWzBdLHRoaXMuTVlBPWFbMV0sdGhpcy5NWkE9YVsyXSx0aGlzLk1YQj1hWzNdLHRoaXMuTVlCPWFbNF0sdGhpcy5NWkI9YVs1XSx0aGlzLk1YQz1hWzZdLHRoaXMuTVlDPWFbN10sdGhpcy5NWkM9YVs4XSxpPDB8fG88MHx8MSE9PXMpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAiLmNvbmNhdCh0aGlzLm5hbWUsIiwgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIikpOyhjPDB8fGw8MHx8aDwwKSYmKCgwLG4uaW5mbykoIkludmFsaWQgQmxhY2tQb2ludCBmb3IgIi5jb25jYXQodGhpcy5uYW1lLCIgWyIpLmNvbmNhdChjLCIsICIpLmNvbmNhdChsLCIsICIpLmNvbmNhdChoLCJdLCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC4iKSksdGhpcy5ibGFja1BvaW50PW5ldyBGbG9hdDMyQXJyYXkoMykpLCh0aGlzLkdSPDB8fHRoaXMuR0c8MHx8dGhpcy5HQjwwKSYmKCgwLG4uaW5mbykoIkludmFsaWQgR2FtbWEgWyIuY29uY2F0KHRoaXMuR1IsIiwgIikuY29uY2F0KHRoaXMuR0csIiwgIikuY29uY2F0KHRoaXMuR0IsIl0gZm9yICIpLmNvbmNhdCh0aGlzLm5hbWUsIiwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuIikpLHRoaXMuR1I9dGhpcy5HRz10aGlzLkdCPTEpfWdldFJnYkl0ZW0oZSx0LHIsbil7Zyh0aGlzLGUsdCxyLG4sMSl9Z2V0UmdiQnVmZmVyKGUsdCxyLG4sYSxpLHMpe2NvbnN0IG89MS8oKDE8PGkpLTEpO2ZvcihsZXQgaT0wO2k8cjsrK2kpZyh0aGlzLGUsdCxuLGEsbyksdCs9MyxhKz0zK3N9Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCkvM3wwfX19KCksbT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGU+PTYvMjk/ZSoqMzoxMDgvODQxKihlLTQvMjkpfWZ1bmN0aW9uIHQoZSx0LHIsbil7cmV0dXJuIHIrZSoobi1yKS90fWZ1bmN0aW9uIHIocixuLGEsaSxzLG8pe2xldCBjPW5bYV0sbD1uW2ErMV0saD1uW2ErMl07ITEhPT1pJiYoYz10KGMsaSwwLDEwMCksbD10KGwsaSxyLmFtaW4sci5hbWF4KSxoPXQoaCxpLHIuYm1pbixyLmJtYXgpKSxsPnIuYW1heD9sPXIuYW1heDpsPHIuYW1pbiYmKGw9ci5hbWluKSxoPnIuYm1heD9oPXIuYm1heDpoPHIuYm1pbiYmKGg9ci5ibWluKTtjb25zdCB1PShjKzE2KS8xMTYsZD11K2wvNTAwLGY9dS1oLzIwMCxnPXIuWFcqZShkKSxwPXIuWVcqZSh1KSxtPXIuWlcqZShmKTtsZXQgYix5LHc7ci5aVzwxPyhiPTMuMTMzOSpnKy0xLjYxNypwKy0uNDkwNiptLHk9LS45Nzg1KmcrMS45MTYqcCsuMDMzMyptLHc9LjA3MipnKy0uMjI5KnArMS40MDU3Km0pOihiPTMuMjQwNipnKy0xLjUzNzIqcCstLjQ5ODYqbSx5PS0uOTY4OSpnKzEuODc1OCpwKy4wNDE1Km0sdz0uMDU1NypnKy0uMjA0KnArMS4wNTcqbSksc1tvXT0yNTUqTWF0aC5zcXJ0KGIpLHNbbysxXT0yNTUqTWF0aC5zcXJ0KHkpLHNbbysyXT0yNTUqTWF0aC5zcXJ0KHcpfXJldHVybiBjbGFzcyBleHRlbmRzIG97Y29uc3RydWN0b3IoZSx0LHIpe2lmKHN1cGVyKCJMYWIiLDMpLCFlKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgTGFiIik7aWYodHx8KHQ9WzAsMCwwXSkscnx8KHI9Wy0xMDAsMTAwLC0xMDAsMTAwXSksdGhpcy5YVz1lWzBdLHRoaXMuWVc9ZVsxXSx0aGlzLlpXPWVbMl0sdGhpcy5hbWluPXJbMF0sdGhpcy5hbWF4PXJbMV0sdGhpcy5ibWluPXJbMl0sdGhpcy5ibWF4PXJbM10sdGhpcy5YQj10WzBdLHRoaXMuWUI9dFsxXSx0aGlzLlpCPXRbMl0sdGhpcy5YVzwwfHx0aGlzLlpXPDB8fDEhPT10aGlzLllXKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cywgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIik7KHRoaXMuWEI8MHx8dGhpcy5ZQjwwfHx0aGlzLlpCPDApJiYoKDAsbi5pbmZvKSgiSW52YWxpZCBCbGFja1BvaW50LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCIpLHRoaXMuWEI9dGhpcy5ZQj10aGlzLlpCPTApLCh0aGlzLmFtaW4+dGhpcy5hbWF4fHx0aGlzLmJtaW4+dGhpcy5ibWF4KSYmKCgwLG4uaW5mbykoIkludmFsaWQgUmFuZ2UsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0cyIpLHRoaXMuYW1pbj0tMTAwLHRoaXMuYW1heD0xMDAsdGhpcy5ibWluPS0xMDAsdGhpcy5ibWF4PTEwMCl9Z2V0UmdiSXRlbShlLHQsbixhKXtyKHRoaXMsZSx0LCExLG4sYSl9Z2V0UmdiQnVmZmVyKGUsdCxuLGEsaSxzLG8pe2NvbnN0IGM9KDE8PHMpLTE7Zm9yKGxldCBzPTA7czxuO3MrKylyKHRoaXMsZSx0LGMsYSxpKSx0Kz0zLGkrPTMrb31nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gZSooMyt0KS8zfDB9aXNEZWZhdWx0RGVjb2RlKGUsdCl7cmV0dXJuITB9Z2V0IHVzZXNaZXJvVG9PbmVSYW5nZSgpe3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJ1c2VzWmVyb1RvT25lUmFuZ2UiLCExKX19fSgpfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuUGFydGlhbEV2YWx1YXRvcj10LkV2YWx1YXRvclByZXByb2Nlc3Nvcj12b2lkIDAscigxMzkpLHIoMikscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpLHIoMTE2KSxyKDEyNikscigxMjgpLHIoMTMxKSxyKDEzMykscigxMzUpLHIoMTM3KSxyKDE1NykscigxNTkpO3ZhciBuPXIoMTQ0KSxhPXIoMTY0KSxzPXIoMTUwKSxvPXIoMTg0KSxjPXIoMTg3KSxsPXIoMTkxKSxoPXIoMjAwKSx1PXIoMjAxKSxkPXIoMTkyKSxmPXIoMjA3KSxnPXIoMTY2KSxwPXIoMjA5KSxtPXIoMTU0KSxiPXIoMTUxKSx5PXIoMjEwKSx3PXIoMTYyKSx2PXIoMTY4KSx4PXIoMTg4KSxTPXIoMjExKSxBPXIoMTg5KSxrPXIoMTQ5KSxDPXIoMTk1KSxPPXIoMTkwKSxGPXIoMjEyKSxJPXIoMjEzKSxUPXIoMjE0KSxNPXIoMjE1KTtjb25zdCBFPU9iamVjdC5mcmVlemUoe21heEltYWdlU2l6ZTotMSxkaXNhYmxlRm9udEZhY2U6ITEsaWdub3JlRXJyb3JzOiExLGlzRXZhbFN1cHBvcnRlZDohMCxpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDohMSxjYW52YXNNYXhBcmVhSW5CeXRlczotMSxmb250RXh0cmFQcm9wZXJ0aWVzOiExLHVzZVN5c3RlbUZvbnRzOiEwLGNNYXBVcmw6bnVsbCxzdGFuZGFyZEZvbnREYXRhVXJsOm51bGx9KSxQPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIFIoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPVIodCwhMCk7aWYoZSlyZXR1cm4gZX1yZXR1cm4oMCxuLndhcm4pKCJVbnN1cHBvcnRlZCBibGVuZCBtb2RlIEFycmF5OiAiLmNvbmNhdChlKSksInNvdXJjZS1vdmVyIn1pZighKGUgaW5zdGFuY2VvZiBzLk5hbWUpKXJldHVybiB0P251bGw6InNvdXJjZS1vdmVyIjtzd2l0Y2goZS5uYW1lKXtjYXNlIk5vcm1hbCI6Y2FzZSJDb21wYXRpYmxlIjpyZXR1cm4ic291cmNlLW92ZXIiO2Nhc2UiTXVsdGlwbHkiOnJldHVybiJtdWx0aXBseSI7Y2FzZSJTY3JlZW4iOnJldHVybiJzY3JlZW4iO2Nhc2UiT3ZlcmxheSI6cmV0dXJuIm92ZXJsYXkiO2Nhc2UiRGFya2VuIjpyZXR1cm4iZGFya2VuIjtjYXNlIkxpZ2h0ZW4iOnJldHVybiJsaWdodGVuIjtjYXNlIkNvbG9yRG9kZ2UiOnJldHVybiJjb2xvci1kb2RnZSI7Y2FzZSJDb2xvckJ1cm4iOnJldHVybiJjb2xvci1idXJuIjtjYXNlIkhhcmRMaWdodCI6cmV0dXJuImhhcmQtbGlnaHQiO2Nhc2UiU29mdExpZ2h0IjpyZXR1cm4ic29mdC1saWdodCI7Y2FzZSJEaWZmZXJlbmNlIjpyZXR1cm4iZGlmZmVyZW5jZSI7Y2FzZSJFeGNsdXNpb24iOnJldHVybiJleGNsdXNpb24iO2Nhc2UiSHVlIjpyZXR1cm4iaHVlIjtjYXNlIlNhdHVyYXRpb24iOnJldHVybiJzYXR1cmF0aW9uIjtjYXNlIkNvbG9yIjpyZXR1cm4iY29sb3IiO2Nhc2UiTHVtaW5vc2l0eSI6cmV0dXJuImx1bWlub3NpdHkifXJldHVybiB0P251bGw6KCgwLG4ud2FybikoIlVuc3VwcG9ydGVkIGJsZW5kIG1vZGU6ICIuY29uY2F0KGUubmFtZSkpLCJzb3VyY2Utb3ZlciIpfWZ1bmN0aW9uIE4oZSl7dmFyIHQ7ZS5mbj09PW4uT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCYmKG51bGw9PT0odD1lLmFyZ3NbMF0pfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmNvdW50KT4wJiZlLmFyZ3NbMF0uY291bnQrK31jbGFzcyBEe2NvbnN0cnVjdG9yKCl7dGhpcy5yZXNldCgpfWNoZWNrKCl7cmV0dXJuISgrK3RoaXMuY2hlY2tlZDxELkNIRUNLX1RJTUVfRVZFUlkpJiYodGhpcy5jaGVja2VkPTAsdGhpcy5lbmRUaW1lPD1EYXRlLm5vdygpKX1yZXNldCgpe3RoaXMuZW5kVGltZT1EYXRlLm5vdygpK0QuVElNRV9TTE9UX0RVUkFUSU9OX01TLHRoaXMuY2hlY2tlZD0wfX1pKEQsIlRJTUVfU0xPVF9EVVJBVElPTl9NUyIsMjApLGkoRCwiQ0hFQ0tfVElNRV9FVkVSWSIsMTAwKTtjbGFzcyBCe2NvbnN0cnVjdG9yKGUpe2xldHt4cmVmOnQsaGFuZGxlcjpyLHBhZ2VJbmRleDpuLGlkRmFjdG9yeTphLGZvbnRDYWNoZTppLGJ1aWx0SW5DTWFwQ2FjaGU6cyxzdGFuZGFyZEZvbnREYXRhQ2FjaGU6byxnbG9iYWxJbWFnZUNhY2hlOmMsc3lzdGVtRm9udENhY2hlOmwsb3B0aW9uczpoPW51bGx9PWU7dGhpcy54cmVmPXQsdGhpcy5oYW5kbGVyPXIsdGhpcy5wYWdlSW5kZXg9bix0aGlzLmlkRmFjdG9yeT1hLHRoaXMuZm9udENhY2hlPWksdGhpcy5idWlsdEluQ01hcENhY2hlPXMsdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGU9byx0aGlzLmdsb2JhbEltYWdlQ2FjaGU9Yyx0aGlzLnN5c3RlbUZvbnRDYWNoZT1sLHRoaXMub3B0aW9ucz1ofHxFLHRoaXMucGFyc2luZ1R5cGUzRm9udD0hMSx0aGlzLl9yZWdpb25hbEltYWdlQ2FjaGU9bmV3IHAuUmVnaW9uYWxJbWFnZUNhY2hlLHRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZD10aGlzLmZldGNoQnVpbHRJbkNNYXAuYmluZCh0aGlzKSxGLkltYWdlUmVzaXplci5zZXRNYXhBcmVhKHRoaXMub3B0aW9ucy5jYW52YXNNYXhBcmVhSW5CeXRlcyl9Z2V0IF9wZGZGdW5jdGlvbkZhY3RvcnkoKXtjb25zdCBlPW5ldyBmLlBERkZ1bmN0aW9uRmFjdG9yeSh7eHJlZjp0aGlzLnhyZWYsaXNFdmFsU3VwcG9ydGVkOnRoaXMub3B0aW9ucy5pc0V2YWxTdXBwb3J0ZWR9KTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiX3BkZkZ1bmN0aW9uRmFjdG9yeSIsZSl9Y2xvbmUoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDtjb25zdCB0PU9iamVjdC5jcmVhdGUodGhpcyk7cmV0dXJuIHQub3B0aW9ucz1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5vcHRpb25zLGUpLHR9aGFzQmxlbmRNb2RlcyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuITE7aWYoZS5vYmpJZCYmdC5oYXMoZS5vYmpJZCkpcmV0dXJuITE7Y29uc3Qgcj1uZXcgcy5SZWZTZXQodCk7ZS5vYmpJZCYmci5wdXQoZS5vYmpJZCk7Y29uc3QgYT1bZV0saT10aGlzLnhyZWY7Zm9yKDthLmxlbmd0aDspe2NvbnN0IGU9YS5zaGlmdCgpLG89ZS5nZXQoIkV4dEdTdGF0ZSIpO2lmKG8gaW5zdGFuY2VvZiBzLkRpY3QpZm9yKGxldCBlIG9mIG8uZ2V0UmF3VmFsdWVzKCkpe2lmKGUgaW5zdGFuY2VvZiBzLlJlZil7aWYoci5oYXMoZSkpY29udGludWU7dHJ5e2U9aS5mZXRjaChlKX1jYXRjaCh0KXtyLnB1dChlKSwoMCxuLmluZm8pKCdoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgRXh0R1N0YXRlOiAiJy5jb25jYXQodCwnIi4nKSk7Y29udGludWV9fWlmKCEoZSBpbnN0YW5jZW9mIHMuRGljdCkpY29udGludWU7ZS5vYmpJZCYmci5wdXQoZS5vYmpJZCk7Y29uc3QgYT1lLmdldCgiQk0iKTtpZihhIGluc3RhbmNlb2Ygcy5OYW1lKXtpZigiTm9ybWFsIiE9PWEubmFtZSlyZXR1cm4hMH1lbHNlIGlmKHZvaWQgMCE9PWEmJkFycmF5LmlzQXJyYXkoYSkpZm9yKGNvbnN0IGUgb2YgYSlpZihlIGluc3RhbmNlb2Ygcy5OYW1lJiYiTm9ybWFsIiE9PWUubmFtZSlyZXR1cm4hMH1jb25zdCBjPWUuZ2V0KCJYT2JqZWN0Iik7aWYoYyBpbnN0YW5jZW9mIHMuRGljdClmb3IobGV0IGUgb2YgYy5nZXRSYXdWYWx1ZXMoKSl7aWYoZSBpbnN0YW5jZW9mIHMuUmVmKXtpZihyLmhhcyhlKSljb250aW51ZTt0cnl7ZT1pLmZldGNoKGUpfWNhdGNoKHQpe3IucHV0KGUpLCgwLG4uaW5mbykoJ2hhc0JsZW5kTW9kZXMgLSBpZ25vcmluZyBYT2JqZWN0OiAiJy5jb25jYXQodCwnIi4nKSk7Y29udGludWV9fWlmKCEoZSBpbnN0YW5jZW9mIGIuQmFzZVN0cmVhbSkpY29udGludWU7ZS5kaWN0Lm9iaklkJiZyLnB1dChlLmRpY3Qub2JqSWQpO2NvbnN0IG89ZS5kaWN0LmdldCgiUmVzb3VyY2VzIik7IShvIGluc3RhbmNlb2Ygcy5EaWN0KXx8by5vYmpJZCYmci5oYXMoby5vYmpJZCl8fChhLnB1c2gobyksby5vYmpJZCYmci5wdXQoby5vYmpJZCkpfX1mb3IoY29uc3QgZSBvZiByKXQucHV0KGUpO3JldHVybiExfWFzeW5jIGZldGNoQnVpbHRJbkNNYXAoZSl7Y29uc3QgdD10aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuZ2V0KGUpO2lmKHQpcmV0dXJuIHQ7bGV0IHI7aWYobnVsbCE9PXRoaXMub3B0aW9ucy5jTWFwVXJsKXtjb25zdCB0PSIiLmNvbmNhdCh0aGlzLm9wdGlvbnMuY01hcFVybCkuY29uY2F0KGUsIi5iY21hcCIpLGE9YXdhaXQgZmV0Y2godCk7aWYoIWEub2spdGhyb3cgbmV3IEVycm9yKCdmZXRjaEJ1aWx0SW5DTWFwOiBmYWlsZWQgdG8gZmV0Y2ggZmlsZSAiJy5jb25jYXQodCwnIiB3aXRoICInKS5jb25jYXQoYS5zdGF0dXNUZXh0LCciLicpKTtyPXtjTWFwRGF0YTpuZXcgVWludDhBcnJheShhd2FpdCBhLmFycmF5QnVmZmVyKCkpLGNvbXByZXNzaW9uVHlwZTpuLkNNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZfX1lbHNlIHI9YXdhaXQgdGhpcy5oYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiRmV0Y2hCdWlsdEluQ01hcCIse25hbWU6ZX0pO3JldHVybiByLmNvbXByZXNzaW9uVHlwZSE9PW4uQ01hcENvbXByZXNzaW9uVHlwZS5OT05FJiZ0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuc2V0KGUscikscn1hc3luYyBmZXRjaFN0YW5kYXJkRm9udERhdGEoZSl7Y29uc3QgdD10aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5nZXQoZSk7aWYodClyZXR1cm4gbmV3IG0uU3RyZWFtKHQpO2lmKHRoaXMub3B0aW9ucy51c2VTeXN0ZW1Gb250cyYmIlN5bWJvbCIhPT1lJiYiWmFwZkRpbmdiYXRzIiE9PWUpcmV0dXJuIG51bGw7Y29uc3Qgcj0oMCxsLmdldEZvbnROYW1lVG9GaWxlTWFwKSgpW2VdO2xldCBhO2lmKG51bGwhPT10aGlzLm9wdGlvbnMuc3RhbmRhcmRGb250RGF0YVVybCl7Y29uc3QgZT0iIi5jb25jYXQodGhpcy5vcHRpb25zLnN0YW5kYXJkRm9udERhdGFVcmwpLmNvbmNhdChyKSx0PWF3YWl0IGZldGNoKGUpO3Qub2s/YT1hd2FpdCB0LmFycmF5QnVmZmVyKCk6KDAsbi53YXJuKSgnZmV0Y2hTdGFuZGFyZEZvbnREYXRhOiBmYWlsZWQgdG8gZmV0Y2ggZmlsZSAiJy5jb25jYXQoZSwnIiB3aXRoICInKS5jb25jYXQodC5zdGF0dXNUZXh0LCciLicpKX1lbHNlIHRyeXthPWF3YWl0IHRoaXMuaGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkZldGNoU3RhbmRhcmRGb250RGF0YSIse2ZpbGVuYW1lOnJ9KX1jYXRjaChlKXsoMCxuLndhcm4pKCdmZXRjaFN0YW5kYXJkRm9udERhdGE6IGZhaWxlZCB0byBmZXRjaCBmaWxlICInLmNvbmNhdChyLCciIHdpdGggIicpLmNvbmNhdChlLCciLicpKX1yZXR1cm4gYT8odGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUuc2V0KGUsYSksbmV3IG0uU3RyZWFtKGEpKTpudWxsfWFzeW5jIGJ1aWxkRm9ybVhPYmplY3QoZSx0LHIsYSxpLG8sYyl7Y29uc3QgbD10LmRpY3QsaD1sLmdldEFycmF5KCJNYXRyaXgiKTtsZXQgdSxkLGY9bC5nZXRBcnJheSgiQkJveCIpO2Y9QXJyYXkuaXNBcnJheShmKSYmND09PWYubGVuZ3RoP24uVXRpbC5ub3JtYWxpemVSZWN0KGYpOm51bGwsbC5oYXMoIk9DIikmJih1PWF3YWl0IHRoaXMucGFyc2VNYXJrZWRDb250ZW50UHJvcHMobC5nZXQoIk9DIiksZSkpLHZvaWQgMCE9PXUmJmEuYWRkT3Aobi5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsWyJPQyIsdV0pO2NvbnN0IGc9bC5nZXQoIkdyb3VwIik7aWYoZyl7ZD17bWF0cml4OmgsYmJveDpmLHNtYXNrOnIsaXNvbGF0ZWQ6ITEsa25vY2tvdXQ6ITF9O2NvbnN0IHQ9Zy5nZXQoIlMiKTtsZXQgaT1udWxsO2lmKCgwLHMuaXNOYW1lKSh0LCJUcmFuc3BhcmVuY3kiKSYmKGQuaXNvbGF0ZWQ9Zy5nZXQoIkkiKXx8ITEsZC5rbm9ja291dD1nLmdldCgiSyIpfHwhMSxnLmhhcygiQ1MiKSkpe2NvbnN0IHQ9Zy5nZXRSYXcoIkNTIik7aT13LkNvbG9yU3BhY2UuZ2V0Q2FjaGVkKHQsdGhpcy54cmVmLGMpfHxhd2FpdCB0aGlzLnBhcnNlQ29sb3JTcGFjZSh7Y3M6dCxyZXNvdXJjZXM6ZSxsb2NhbENvbG9yU3BhY2VDYWNoZTpjfSl9bnVsbCE9ciYmci5iYWNrZHJvcCYmKGl8fChpPXcuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYiksci5iYWNrZHJvcD1pLmdldFJnYihyLmJhY2tkcm9wLDApKSxhLmFkZE9wKG4uT1BTLmJlZ2luR3JvdXAsW2RdKX1jb25zdCBwPWc/W2gsbnVsbF06W2gsZl07cmV0dXJuIGEuYWRkT3Aobi5PUFMucGFpbnRGb3JtWE9iamVjdEJlZ2luLHApLHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06dCx0YXNrOmkscmVzb3VyY2VzOmwuZ2V0KCJSZXNvdXJjZXMiKXx8ZSxvcGVyYXRvckxpc3Q6YSxpbml0aWFsU3RhdGU6b30pLnRoZW4oKGZ1bmN0aW9uKCl7YS5hZGRPcChuLk9QUy5wYWludEZvcm1YT2JqZWN0RW5kLFtdKSxnJiZhLmFkZE9wKG4uT1BTLmVuZEdyb3VwLFtkXSksdm9pZCAwIT09dSYmYS5hZGRPcChuLk9QUy5lbmRNYXJrZWRDb250ZW50LFtdKX0pKX1fc2VuZEltZ0RhdGEoZSx0KXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO2NvbnN0IG49dD9bdC5iaXRtYXB8fHQuZGF0YS5idWZmZXJdOm51bGw7cmV0dXJuIHRoaXMucGFyc2luZ1R5cGUzRm9udHx8cj90aGlzLmhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIixbZSwiSW1hZ2UiLHRdLG4pOnRoaXMuaGFuZGxlci5zZW5kKCJvYmoiLFtlLHRoaXMucGFnZUluZGV4LCJJbWFnZSIsdF0sbil9YXN5bmMgYnVpbGRQYWludEltYWdlWE9iamVjdChlKXtsZXR7cmVzb3VyY2VzOnQsaW1hZ2U6cixpc0lubGluZTphPSExLG9wZXJhdG9yTGlzdDppLGNhY2hlS2V5OnMsbG9jYWxJbWFnZUNhY2hlOm8sbG9jYWxDb2xvclNwYWNlQ2FjaGU6Y309ZTtjb25zdCBsPXIuZGljdCxoPWwub2JqSWQsdT1sLmdldCgiVyIsIldpZHRoIiksZD1sLmdldCgiSCIsIkhlaWdodCIpO2lmKCF1fHwibnVtYmVyIiE9dHlwZW9mIHV8fCFkfHwibnVtYmVyIiE9dHlwZW9mIGQpcmV0dXJuIHZvaWQoMCxuLndhcm4pKCJJbWFnZSBkaW1lbnNpb25zIGFyZSBtaXNzaW5nLCBvciBub3QgbnVtYmVycy4iKTtjb25zdCBmPXRoaXMub3B0aW9ucy5tYXhJbWFnZVNpemU7aWYoLTEhPT1mJiZ1KmQ+Zil7Y29uc3QgZT0iSW1hZ2UgZXhjZWVkZWQgbWF4aW11bSBhbGxvd2VkIHNpemUgYW5kIHdhcyByZW1vdmVkLiI7aWYodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycylyZXR1cm4gdm9pZCgwLG4ud2FybikoZSk7dGhyb3cgbmV3IEVycm9yKGUpfWxldCBnLHAsbTtpZihsLmhhcygiT0MiKSYmKGc9YXdhaXQgdGhpcy5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhsLmdldCgiT0MiKSx0KSksbC5nZXQoIklNIiwiSW1hZ2VNYXNrIikpe2NvbnN0IGU9bC5nZXQoIkkiLCJJbnRlcnBvbGF0ZSIpLHQ9dSs3Pj4zLGE9ci5nZXRCeXRlcyh0KmQpLGM9bC5nZXRBcnJheSgiRCIsIkRlY29kZSIpO2lmKHRoaXMucGFyc2luZ1R5cGUzRm9udCl7aWYocD1NLlBERkltYWdlLmNyZWF0ZVJhd01hc2soe2ltZ0FycmF5OmEsd2lkdGg6dSxoZWlnaHQ6ZCxpbWFnZUlzRnJvbURlY29kZVN0cmVhbTpyIGluc3RhbmNlb2Ygdi5EZWNvZGVTdHJlYW0saW52ZXJzZURlY29kZToobnVsbD09Yz92b2lkIDA6Y1swXSk+MCxpbnRlcnBvbGF0ZTplfSkscC5jYWNoZWQ9ISFzLG09W3BdLGkuYWRkSW1hZ2VPcHMobi5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LG0sZykscyl7Y29uc3QgZT17Zm46bi5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LGFyZ3M6bSxvcHRpb25hbENvbnRlbnQ6Z307by5zZXQocyxoLGUpLGgmJnRoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQobnVsbCxoLGUpfXJldHVybn1pZihwPWF3YWl0IE0uUERGSW1hZ2UuY3JlYXRlTWFzayh7aW1nQXJyYXk6YSx3aWR0aDp1LGhlaWdodDpkLGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOnIgaW5zdGFuY2VvZiB2LkRlY29kZVN0cmVhbSxpbnZlcnNlRGVjb2RlOihudWxsPT1jP3ZvaWQgMDpjWzBdKT4wLGludGVycG9sYXRlOmUsaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6dGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkfSkscC5pc1NpbmdsZU9wYXF1ZVBpeGVsKXtpZihpLmFkZEltYWdlT3BzKG4uT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzayxbXSxnKSxzKXtjb25zdCBlPXtmbjpuLk9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2ssYXJnczpbXSxvcHRpb25hbENvbnRlbnQ6Z307by5zZXQocyxoLGUpLGgmJnRoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQobnVsbCxoLGUpfXJldHVybn1jb25zdCBmPSJtYXNrXyIuY29uY2F0KHRoaXMuaWRGYWN0b3J5LmNyZWF0ZU9iaklkKCkpO2lmKGkuYWRkRGVwZW5kZW5jeShmKSx0aGlzLl9zZW5kSW1nRGF0YShmLHApLG09W3tkYXRhOmYsd2lkdGg6cC53aWR0aCxoZWlnaHQ6cC5oZWlnaHQsaW50ZXJwb2xhdGU6cC5pbnRlcnBvbGF0ZSxjb3VudDoxfV0saS5hZGRJbWFnZU9wcyhuLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsbSxnKSxzKXtjb25zdCBlPXtmbjpuLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsYXJnczptLG9wdGlvbmFsQ29udGVudDpnfTtvLnNldChzLGgsZSksaCYmdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLGgsZSl9cmV0dXJufWlmKGEmJiFsLmhhcygiU01hc2siKSYmIWwuaGFzKCJNYXNrIikmJnUrZDwyMDApe2NvbnN0IGU9bmV3IE0uUERGSW1hZ2Uoe3hyZWY6dGhpcy54cmVmLHJlczp0LGltYWdlOnIsaXNJbmxpbmU6YSxwZGZGdW5jdGlvbkZhY3Rvcnk6dGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LGxvY2FsQ29sb3JTcGFjZUNhY2hlOmN9KTtyZXR1cm4gcD1hd2FpdCBlLmNyZWF0ZUltYWdlRGF0YSghMCwhMSksaS5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZD10aGlzLm9wdGlvbnMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQsdm9pZCBpLmFkZEltYWdlT3BzKG4uT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0LFtwXSxnKX1sZXQgYj0iaW1nXyIuY29uY2F0KHRoaXMuaWRGYWN0b3J5LmNyZWF0ZU9iaklkKCkpLHk9ITE7aWYodGhpcy5wYXJzaW5nVHlwZTNGb250P2I9IiIuY29uY2F0KHRoaXMuaWRGYWN0b3J5LmdldERvY0lkKCksIl90eXBlM18iKS5jb25jYXQoYik6aCYmKHk9dGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNob3VsZENhY2hlKGgsdGhpcy5wYWdlSW5kZXgpLHkmJihiPSIiLmNvbmNhdCh0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpLCJfIikuY29uY2F0KGIpKSksaS5hZGREZXBlbmRlbmN5KGIpLG09W2IsdSxkXSxNLlBERkltYWdlLmJ1aWxkSW1hZ2Uoe3hyZWY6dGhpcy54cmVmLHJlczp0LGltYWdlOnIsaXNJbmxpbmU6YSxwZGZGdW5jdGlvbkZhY3Rvcnk6dGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LGxvY2FsQ29sb3JTcGFjZUNhY2hlOmN9KS50aGVuKChhc3luYyBlPT57aWYocD1hd2FpdCBlLmNyZWF0ZUltYWdlRGF0YSghMSx0aGlzLm9wdGlvbnMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpLHMmJmgmJnkpe2NvbnN0IGU9cC5iaXRtYXA/cC53aWR0aCpwLmhlaWdodCo0OnAuZGF0YS5sZW5ndGg7dGhpcy5nbG9iYWxJbWFnZUNhY2hlLmFkZEJ5dGVTaXplKGgsZSl9cmV0dXJuIHRoaXMuX3NlbmRJbWdEYXRhKGIscCx5KX0pKS5jYXRjaCgoZT0+KCgwLG4ud2FybikoJ1VuYWJsZSB0byBkZWNvZGUgaW1hZ2UgIicuY29uY2F0KGIsJyI6ICInKS5jb25jYXQoZSwnIi4nKSksdGhpcy5fc2VuZEltZ0RhdGEoYixudWxsLHkpKSkpLGkuYWRkSW1hZ2VPcHMobi5PUFMucGFpbnRJbWFnZVhPYmplY3QsbSxnKSxzKXtjb25zdCBlPXtmbjpuLk9QUy5wYWludEltYWdlWE9iamVjdCxhcmdzOm0sb3B0aW9uYWxDb250ZW50Omd9O28uc2V0KHMsaCxlKSxoJiYodGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLGgsZSkseSYmKCgwLG4uYXNzZXJ0KSghYSwiQ2Fubm90IGNhY2hlIGFuIGlubGluZSBpbWFnZSBnbG9iYWxseS4iKSx0aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YShoLHtvYmpJZDpiLGZuOm4uT1BTLnBhaW50SW1hZ2VYT2JqZWN0LGFyZ3M6bSxvcHRpb25hbENvbnRlbnQ6ZyxieXRlU2l6ZTowfSkpKX19aGFuZGxlU01hc2soZSx0LHIsbixhLGkpe2NvbnN0IHM9ZS5nZXQoIkciKSxvPXtzdWJ0eXBlOmUuZ2V0KCJTIikubmFtZSxiYWNrZHJvcDplLmdldCgiQkMiKX0sYz1lLmdldCgiVFIiKTtpZigoMCxmLmlzUERGRnVuY3Rpb24pKGMpKXtjb25zdCBlPXRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUoYyksdD1uZXcgVWludDhBcnJheSgyNTYpLHI9bmV3IEZsb2F0MzJBcnJheSgxKTtmb3IobGV0IG49MDtuPDI1NjtuKyspclswXT1uLzI1NSxlKHIsMCxyLDApLHRbbl09MjU1KnJbMF18MDtvLnRyYW5zZmVyTWFwPXR9cmV0dXJuIHRoaXMuYnVpbGRGb3JtWE9iamVjdCh0LHMsbyxyLG4sYS5zdGF0ZS5jbG9uZSgpLGkpfWhhbmRsZVRyYW5zZmVyRnVuY3Rpb24oZSl7bGV0IHQ7aWYoQXJyYXkuaXNBcnJheShlKSl0PWU7ZWxzZXtpZighKDAsZi5pc1BERkZ1bmN0aW9uKShlKSlyZXR1cm4gbnVsbDt0PVtlXX1jb25zdCByPVtdO2xldCBuPTAsYT0wO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0IHQ9dGhpcy54cmVmLmZldGNoSWZSZWYoZSk7aWYobisrLCgwLHMuaXNOYW1lKSh0LCJJZGVudGl0eSIpKXtyLnB1c2gobnVsbCk7Y29udGludWV9aWYoISgwLGYuaXNQREZGdW5jdGlvbikodCkpcmV0dXJuIG51bGw7Y29uc3QgaT10aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKHQpLG89bmV3IFVpbnQ4QXJyYXkoMjU2KSxjPW5ldyBGbG9hdDMyQXJyYXkoMSk7Zm9yKGxldCBlPTA7ZTwyNTY7ZSsrKWNbMF09ZS8yNTUsaShjLDAsYywwKSxvW2VdPTI1NSpjWzBdfDA7ci5wdXNoKG8pLGErK31yZXR1cm4gMSE9PW4mJjQhPT1ufHwwPT09YT9udWxsOnJ9aGFuZGxlVGlsaW5nVHlwZShlLHQscixhLGksbyxjLGwpe2NvbnN0IHU9bmV3IFQuT3BlcmF0b3JMaXN0LGQ9cy5EaWN0Lm1lcmdlKHt4cmVmOnRoaXMueHJlZixkaWN0QXJyYXk6W2kuZ2V0KCJSZXNvdXJjZXMiKSxyXX0pO3JldHVybiB0aGlzLmdldE9wZXJhdG9yTGlzdCh7c3RyZWFtOmEsdGFzazpjLHJlc291cmNlczpkLG9wZXJhdG9yTGlzdDp1fSkudGhlbigoZnVuY3Rpb24oKXtjb25zdCByPXUuZ2V0SVIoKSxuPSgwLGguZ2V0VGlsaW5nUGF0dGVybklSKShyLGksdCk7by5hZGREZXBlbmRlbmNpZXModS5kZXBlbmRlbmNpZXMpLG8uYWRkT3AoZSxuKSxpLm9iaklkJiZsLnNldChudWxsLGkub2JqSWQse29wZXJhdG9yTGlzdElSOnIsZGljdDppfSl9KSkuY2F0Y2goKGU9PntpZighKGUgaW5zdGFuY2VvZiBuLkFib3J0RXhjZXB0aW9uKSl7aWYoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxuLndhcm4pKCdoYW5kbGVUaWxpbmdUeXBlIC0gaWdub3JpbmcgcGF0dGVybjogIicuY29uY2F0KGUsJyIuJykpfX0pKX1oYW5kbGVTZXRGb250KGUsdCxyLG4sYSxpKXtsZXQgYz1hcmd1bWVudHMubGVuZ3RoPjYmJnZvaWQgMCE9PWFyZ3VtZW50c1s2XT9hcmd1bWVudHNbNl06bnVsbCxsPWFyZ3VtZW50cy5sZW5ndGg+NyYmdm9pZCAwIT09YXJndW1lbnRzWzddP2FyZ3VtZW50c1s3XTpudWxsO2NvbnN0IGg9KG51bGw9PXQ/dm9pZCAwOnRbMF0paW5zdGFuY2VvZiBzLk5hbWU/dFswXS5uYW1lOm51bGw7cmV0dXJuIHRoaXMubG9hZEZvbnQoaCxyLGUsYyxsKS50aGVuKCh0PT50LmZvbnQuaXNUeXBlM0ZvbnQ/dC5sb2FkVHlwZTNEYXRhKHRoaXMsZSxhKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBuLmFkZERlcGVuZGVuY2llcyh0LnR5cGUzRGVwZW5kZW5jaWVzKSx0fSkpLmNhdGNoKChlPT5uZXcgTCh7bG9hZGVkTmFtZToiZ19mb250X2Vycm9yIixmb250Om5ldyBvLkVycm9yRm9udCgiVHlwZTMgZm9udCBsb2FkIGVycm9yOiAiLmNvbmNhdChlKSksZGljdDp0LmZvbnQsZXZhbHVhdG9yT3B0aW9uczp0aGlzLm9wdGlvbnN9KSkpOnQpKS50aGVuKChlPT4oaS5mb250PWUuZm9udCxlLnNlbmQodGhpcy5oYW5kbGVyKSxlLmxvYWRlZE5hbWUpKSl9aGFuZGxlVGV4dChlLHQpe2NvbnN0IHI9dC5mb250LGE9ci5jaGFyc1RvR2x5cGhzKGUpO3JldHVybiByLmRhdGEmJih0LnRleHRSZW5kZXJpbmdNb2RlJm4uVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBR3x8IlBhdHRlcm4iPT09dC5maWxsQ29sb3JTcGFjZS5uYW1lfHxyLmRpc2FibGVGb250RmFjZXx8dGhpcy5vcHRpb25zLmRpc2FibGVGb250RmFjZSkmJkIuYnVpbGRGb250UGF0aHMocixhLHRoaXMuaGFuZGxlcix0aGlzLm9wdGlvbnMpLGF9ZW5zdXJlU3RhdGVGb250KGUpe2lmKGUuZm9udClyZXR1cm47Y29uc3QgdD1uZXcgbi5Gb3JtYXRFcnJvcigiTWlzc2luZyBzZXRGb250IChUZikgb3BlcmF0b3IgYmVmb3JlIHRleHQgcmVuZGVyaW5nIG9wZXJhdG9yLiIpO2lmKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IHQ7KDAsbi53YXJuKSgnZW5zdXJlU3RhdGVGb250OiAiJy5jb25jYXQodCwnIi4nKSl9YXN5bmMgc2V0R1N0YXRlKGUpe2xldHtyZXNvdXJjZXM6dCxnU3RhdGU6cixvcGVyYXRvckxpc3Q6YSxjYWNoZUtleTppLHRhc2s6byxzdGF0ZU1hbmFnZXI6Yyxsb2NhbEdTdGF0ZUNhY2hlOmwsbG9jYWxDb2xvclNwYWNlQ2FjaGU6aH09ZTtjb25zdCB1PXIub2JqSWQ7bGV0IGQ9ITA7Y29uc3QgZj1bXTtsZXQgZz1Qcm9taXNlLnJlc29sdmUoKTtmb3IoY29uc3QgZSBvZiByLmdldEtleXMoKSl7Y29uc3QgaT1yLmdldChlKTtzd2l0Y2goZSl7Y2FzZSJUeXBlIjpicmVhaztjYXNlIkxXIjpjYXNlIkxDIjpjYXNlIkxKIjpjYXNlIk1MIjpjYXNlIkQiOmNhc2UiUkkiOmNhc2UiRkwiOmNhc2UiQ0EiOmNhc2UiY2EiOmYucHVzaChbZSxpXSk7YnJlYWs7Y2FzZSJGb250IjpkPSExLGc9Zy50aGVuKCgoKT0+dGhpcy5oYW5kbGVTZXRGb250KHQsbnVsbCxpWzBdLGEsbyxjLnN0YXRlKS50aGVuKChmdW5jdGlvbih0KXthLmFkZERlcGVuZGVuY3kodCksZi5wdXNoKFtlLFt0LGlbMV1dXSl9KSkpKTticmVhaztjYXNlIkJNIjpmLnB1c2goW2UsUihpKV0pO2JyZWFrO2Nhc2UiU01hc2siOmlmKCgwLHMuaXNOYW1lKShpLCJOb25lIikpe2YucHVzaChbZSwhMV0pO2JyZWFrfWkgaW5zdGFuY2VvZiBzLkRpY3Q/KGQ9ITEsZz1nLnRoZW4oKCgpPT50aGlzLmhhbmRsZVNNYXNrKGksdCxhLG8sYyxoKSkpLGYucHVzaChbZSwhMF0pKTooMCxuLndhcm4pKCJVbnN1cHBvcnRlZCBTTWFzayB0eXBlIik7YnJlYWs7Y2FzZSJUUiI6Y29uc3Qgcj10aGlzLmhhbmRsZVRyYW5zZmVyRnVuY3Rpb24oaSk7Zi5wdXNoKFtlLHJdKTticmVhaztjYXNlIk9QIjpjYXNlIm9wIjpjYXNlIk9QTSI6Y2FzZSJCRyI6Y2FzZSJCRzIiOmNhc2UiVUNSIjpjYXNlIlVDUjIiOmNhc2UiVFIyIjpjYXNlIkhUIjpjYXNlIlNNIjpjYXNlIlNBIjpjYXNlIkFJUyI6Y2FzZSJUSyI6KDAsbi5pbmZvKSgiZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAiK2UpO2JyZWFrO2RlZmF1bHQ6KDAsbi5pbmZvKSgiVW5rbm93biBncmFwaGljIHN0YXRlIG9wZXJhdG9yICIrZSl9fXJldHVybiBnLnRoZW4oKGZ1bmN0aW9uKCl7Zi5sZW5ndGg+MCYmYS5hZGRPcChuLk9QUy5zZXRHU3RhdGUsW2ZdKSxkJiZsLnNldChpLHUsZil9KSl9bG9hZEZvbnQoZSx0LHIpe3ZhciBhO2xldCBpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpudWxsLGM9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOm51bGw7Y29uc3QgbD1hc3luYygpPT5uZXcgTCh7bG9hZGVkTmFtZToiZ19mb250X2Vycm9yIixmb250Om5ldyBvLkVycm9yRm9udCgnRm9udCAiJy5jb25jYXQoZSwnIiBpcyBub3QgYXZhaWxhYmxlLicpKSxkaWN0OnQsZXZhbHVhdG9yT3B0aW9uczp0aGlzLm9wdGlvbnN9KTtsZXQgaDtpZih0KXQgaW5zdGFuY2VvZiBzLlJlZiYmKGg9dCk7ZWxzZXtjb25zdCB0PXIuZ2V0KCJGb250Iik7dCYmKGg9dC5nZXRSYXcoZSkpfWlmKGgpe2lmKHRoaXMucGFyc2luZ1R5cGUzRm9udCYmdGhpcy50eXBlM0ZvbnRSZWZzLmhhcyhoKSlyZXR1cm4gbCgpO2lmKHRoaXMuZm9udENhY2hlLmhhcyhoKSlyZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGgpO3Q9dGhpcy54cmVmLmZldGNoSWZSZWYoaCl9aWYoISh0IGluc3RhbmNlb2Ygcy5EaWN0KSl7aWYoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMmJiF0aGlzLnBhcnNpbmdUeXBlM0ZvbnQpcmV0dXJuKDAsbi53YXJuKSgnRm9udCAiJy5jb25jYXQoZSwnIiBpcyBub3QgYXZhaWxhYmxlLicpKSxsKCk7KDAsbi53YXJuKSgnRm9udCAiJy5jb25jYXQoZSwnIiBpcyBub3QgYXZhaWxhYmxlIC0tIGF0dGVtcHRpbmcgdG8gZmFsbGJhY2sgdG8gYSBkZWZhdWx0IGZvbnQuJykpLHQ9aXx8Qi5mYWxsYmFja0ZvbnREaWN0fWlmKHQuY2FjaGVLZXkmJnRoaXMuZm9udENhY2hlLmhhcyh0LmNhY2hlS2V5KSlyZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KHQuY2FjaGVLZXkpO2NvbnN0IHU9bmV3IG4uUHJvbWlzZUNhcGFiaWxpdHk7bGV0IGQ7dHJ5e2Q9dGhpcy5wcmVFdmFsdWF0ZUZvbnQodCksZC5jc3NGb250SW5mbz1jfWNhdGNoKGUpe3JldHVybigwLG4ud2FybikoJ2xvYWRGb250IC0gcHJlRXZhbHVhdGVGb250IGZhaWxlZDogIicuY29uY2F0KGUsJyIuJykpLGwoKX1jb25zdHtkZXNjcmlwdG9yOmYsaGFzaDpnfT1kLHA9aCBpbnN0YW5jZW9mIHMuUmVmO2xldCBtO2lmKGcmJmYgaW5zdGFuY2VvZiBzLkRpY3Qpe2NvbnN0IGU9Zi5mb250QWxpYXNlc3x8KGYuZm9udEFsaWFzZXM9T2JqZWN0LmNyZWF0ZShudWxsKSk7aWYoZVtnXSl7Y29uc3QgdD1lW2ddLmFsaWFzUmVmO2lmKHAmJnQmJnRoaXMuZm9udENhY2hlLmhhcyh0KSlyZXR1cm4gdGhpcy5mb250Q2FjaGUucHV0QWxpYXMoaCx0KSx0aGlzLmZvbnRDYWNoZS5nZXQoaCl9ZWxzZSBlW2ddPXtmb250SUQ6dGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCl9O3AmJihlW2ddLmFsaWFzUmVmPWgpLG09ZVtnXS5mb250SUR9ZWxzZSBtPXRoaXMuaWRGYWN0b3J5LmNyZWF0ZUZvbnRJZCgpO3JldHVybigwLG4uYXNzZXJ0KShudWxsPT09KGE9bSl8fHZvaWQgMD09PWE/dm9pZCAwOmEuc3RhcnRzV2l0aCgiZiIpLCdUaGUgImZvbnRJRCIgbXVzdCBiZSAoY29ycmVjdGx5KSBkZWZpbmVkLicpLHA/dGhpcy5mb250Q2FjaGUucHV0KGgsdS5wcm9taXNlKToodC5jYWNoZUtleT0iY2FjaGVLZXlfIi5jb25jYXQobSksdGhpcy5mb250Q2FjaGUucHV0KHQuY2FjaGVLZXksdS5wcm9taXNlKSksdC5sb2FkZWROYW1lPSIiLmNvbmNhdCh0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpLCJfIikuY29uY2F0KG0pLHRoaXMudHJhbnNsYXRlRm9udChkKS50aGVuKChlPT57dS5yZXNvbHZlKG5ldyBMKHtsb2FkZWROYW1lOnQubG9hZGVkTmFtZSxmb250OmUsZGljdDp0LGV2YWx1YXRvck9wdGlvbnM6dGhpcy5vcHRpb25zfSkpfSkpLmNhdGNoKChlPT57KDAsbi53YXJuKSgnbG9hZEZvbnQgLSB0cmFuc2xhdGVGb250IGZhaWxlZDogIicuY29uY2F0KGUsJyIuJykpLHUucmVzb2x2ZShuZXcgTCh7bG9hZGVkTmFtZTp0LmxvYWRlZE5hbWUsZm9udDpuZXcgby5FcnJvckZvbnQoZSBpbnN0YW5jZW9mIEVycm9yP2UubWVzc2FnZTplKSxkaWN0OnQsZXZhbHVhdG9yT3B0aW9uczp0aGlzLm9wdGlvbnN9KSl9KSksdS5wcm9taXNlfWJ1aWxkUGF0aChlLHQscil7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXTtjb25zdCBpPWUubGVuZ3RoLTE7aWYocnx8KHI9W10pLGk8MHx8ZS5mbkFycmF5W2ldIT09bi5PUFMuY29uc3RydWN0UGF0aCl7bGV0IGk7c3dpdGNoKGEmJigoMCxuLndhcm4pKCdFbmNvdW50ZXJlZCBwYXRoIG9wZXJhdG9yICInLmNvbmNhdCh0LCciIGluc2lkZSBvZiBhIHRleHQgb2JqZWN0LicpKSxlLmFkZE9wKG4uT1BTLnNhdmUsbnVsbCkpLHQpe2Nhc2Ugbi5PUFMucmVjdGFuZ2xlOmNvbnN0IGU9clswXStyWzJdLHQ9clsxXStyWzNdO2k9W01hdGgubWluKHJbMF0sZSksTWF0aC5tYXgoclswXSxlKSxNYXRoLm1pbihyWzFdLHQpLE1hdGgubWF4KHJbMV0sdCldO2JyZWFrO2Nhc2Ugbi5PUFMubW92ZVRvOmNhc2Ugbi5PUFMubGluZVRvOmk9W3JbMF0sclswXSxyWzFdLHJbMV1dO2JyZWFrO2RlZmF1bHQ6aT1bMS8wLC0xLzAsMS8wLC0xLzBdfWUuYWRkT3Aobi5PUFMuY29uc3RydWN0UGF0aCxbW3RdLHIsaV0pLGEmJmUuYWRkT3Aobi5PUFMucmVzdG9yZSxudWxsKX1lbHNle2NvbnN0IGE9ZS5hcmdzQXJyYXlbaV07YVswXS5wdXNoKHQpLGFbMV0ucHVzaCguLi5yKTtjb25zdCBzPWFbMl07c3dpdGNoKHQpe2Nhc2Ugbi5PUFMucmVjdGFuZ2xlOmNvbnN0IGU9clswXStyWzJdLHQ9clsxXStyWzNdO3NbMF09TWF0aC5taW4oc1swXSxyWzBdLGUpLHNbMV09TWF0aC5tYXgoc1sxXSxyWzBdLGUpLHNbMl09TWF0aC5taW4oc1syXSxyWzFdLHQpLHNbM109TWF0aC5tYXgoc1szXSxyWzFdLHQpO2JyZWFrO2Nhc2Ugbi5PUFMubW92ZVRvOmNhc2Ugbi5PUFMubGluZVRvOnNbMF09TWF0aC5taW4oc1swXSxyWzBdKSxzWzFdPU1hdGgubWF4KHNbMV0sclswXSksc1syXT1NYXRoLm1pbihzWzJdLHJbMV0pLHNbM109TWF0aC5tYXgoc1szXSxyWzFdKX19fXBhcnNlQ29sb3JTcGFjZShlKXtsZXR7Y3M6dCxyZXNvdXJjZXM6cixsb2NhbENvbG9yU3BhY2VDYWNoZTphfT1lO3JldHVybiB3LkNvbG9yU3BhY2UucGFyc2VBc3luYyh7Y3M6dCx4cmVmOnRoaXMueHJlZixyZXNvdXJjZXM6cixwZGZGdW5jdGlvbkZhY3Rvcnk6dGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LGxvY2FsQ29sb3JTcGFjZUNhY2hlOmF9KS5jYXRjaCgoZT0+e2lmKGUgaW5zdGFuY2VvZiBuLkFib3J0RXhjZXB0aW9uKXJldHVybiBudWxsO2lmKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpcmV0dXJuKDAsbi53YXJuKSgncGFyc2VDb2xvclNwYWNlIC0gaWdub3JpbmcgQ29sb3JTcGFjZTogIicuY29uY2F0KGUsJyIuJykpLG51bGw7dGhyb3cgZX0pKX1wYXJzZVNoYWRpbmcoZSl7bGV0e3NoYWRpbmc6dCxyZXNvdXJjZXM6cixsb2NhbENvbG9yU3BhY2VDYWNoZTpuLGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZTphfT1lLGk9YS5nZXQodCk7aWYoIWkpe2NvbnN0IGU9aC5QYXR0ZXJuLnBhcnNlU2hhZGluZyh0LHRoaXMueHJlZixyLHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSxuKS5nZXRJUigpO2k9InBhdHRlcm5fIi5jb25jYXQodGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKSksdGhpcy5wYXJzaW5nVHlwZTNGb250JiYoaT0iIi5jb25jYXQodGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKSwiX3R5cGUzXyIpLmNvbmNhdChpKSksYS5zZXQodCxpKSx0aGlzLnBhcnNpbmdUeXBlM0ZvbnQ/dGhpcy5oYW5kbGVyLnNlbmQoImNvbW1vbm9iaiIsW2ksIlBhdHRlcm4iLGVdKTp0aGlzLmhhbmRsZXIuc2VuZCgib2JqIixbaSx0aGlzLnBhZ2VJbmRleCwiUGF0dGVybiIsZV0pfXJldHVybiBpfWhhbmRsZUNvbG9yTihlLHQscixhLGksbyxjLGwsdSxkKXtjb25zdCBmPXIucG9wKCk7aWYoZiBpbnN0YW5jZW9mIHMuTmFtZSl7Y29uc3QgZz1pLmdldFJhdyhmLm5hbWUpLHA9ZyBpbnN0YW5jZW9mIHMuUmVmJiZ1LmdldEJ5UmVmKGcpO2lmKHApdHJ5e2NvbnN0IG49YS5iYXNlP2EuYmFzZS5nZXRSZ2IociwwKTpudWxsLGk9KDAsaC5nZXRUaWxpbmdQYXR0ZXJuSVIpKHAub3BlcmF0b3JMaXN0SVIscC5kaWN0LG4pO3JldHVybiB2b2lkIGUuYWRkT3AodCxpKX1jYXRjaChlKXt9Y29uc3QgbT10aGlzLnhyZWYuZmV0Y2hJZlJlZihnKTtpZihtKXtjb25zdCBpPW0gaW5zdGFuY2VvZiBiLkJhc2VTdHJlYW0/bS5kaWN0Om0scz1pLmdldCgiUGF0dGVyblR5cGUiKTtpZigxPT09cyl7Y29uc3Qgbj1hLmJhc2U/YS5iYXNlLmdldFJnYihyLDApOm51bGw7cmV0dXJuIHRoaXMuaGFuZGxlVGlsaW5nVHlwZSh0LG4sbyxtLGksZSxjLHUpfWlmKDI9PT1zKXtjb25zdCByPWkuZ2V0KCJTaGFkaW5nIiksbj1pLmdldEFycmF5KCJNYXRyaXgiKSxhPXRoaXMucGFyc2VTaGFkaW5nKHtzaGFkaW5nOnIscmVzb3VyY2VzOm8sbG9jYWxDb2xvclNwYWNlQ2FjaGU6bCxsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGU6ZH0pO3JldHVybiB2b2lkIGUuYWRkT3AodCxbIlNoYWRpbmciLGEsbl0pfXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmtub3duIFBhdHRlcm5UeXBlOiAiLmNvbmNhdChzKSl9fXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmtub3duIFBhdHRlcm5OYW1lOiAiLmNvbmNhdChmKSl9X3BhcnNlVmlzaWJpbGl0eUV4cHJlc3Npb24oZSx0LHIpe2lmKCsrdD4xMClyZXR1cm4gdm9pZCgwLG4ud2FybikoIlZpc2liaWxpdHkgZXhwcmVzc2lvbiBpcyB0b28gZGVlcGx5IG5lc3RlZCIpO2NvbnN0IGE9ZS5sZW5ndGgsaT10aGlzLnhyZWYuZmV0Y2hJZlJlZihlWzBdKTtpZighKGE8MikmJmkgaW5zdGFuY2VvZiBzLk5hbWUpe3N3aXRjaChpLm5hbWUpe2Nhc2UiQW5kIjpjYXNlIk9yIjpjYXNlIk5vdCI6ci5wdXNoKGkubmFtZSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdm9pZCgwLG4ud2FybikoIkludmFsaWQgb3BlcmF0b3IgIi5jb25jYXQoaS5uYW1lLCIgaW4gdmlzaWJpbGl0eSBleHByZXNzaW9uIikpfWZvcihsZXQgbj0xO248YTtuKyspe2NvbnN0IGE9ZVtuXSxpPXRoaXMueHJlZi5mZXRjaElmUmVmKGEpO2lmKEFycmF5LmlzQXJyYXkoaSkpe2NvbnN0IGU9W107ci5wdXNoKGUpLHRoaXMuX3BhcnNlVmlzaWJpbGl0eUV4cHJlc3Npb24oaSx0LGUpfWVsc2UgYSBpbnN0YW5jZW9mIHMuUmVmJiZyLnB1c2goYS50b1N0cmluZygpKX19ZWxzZSgwLG4ud2FybikoIkludmFsaWQgdmlzaWJpbGl0eSBleHByZXNzaW9uIil9YXN5bmMgcGFyc2VNYXJrZWRDb250ZW50UHJvcHMoZSx0KXtsZXQgcjtpZihlIGluc3RhbmNlb2Ygcy5OYW1lKXI9dC5nZXQoIlByb3BlcnRpZXMiKS5nZXQoZS5uYW1lKTtlbHNle2lmKCEoZSBpbnN0YW5jZW9mIHMuRGljdCkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIk9wdGlvbmFsIGNvbnRlbnQgcHJvcGVydGllcyBtYWxmb3JtZWQuIik7cj1lfWNvbnN0IGE9ci5nZXQoIlR5cGUiKS5uYW1lO2lmKCJPQ0ciPT09YSlyZXR1cm57dHlwZTphLGlkOnIub2JqSWR9O2lmKCJPQ01EIj09PWEpe2NvbnN0IGU9ci5nZXQoIlZFIik7aWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgdD1bXTtpZih0aGlzLl9wYXJzZVZpc2liaWxpdHlFeHByZXNzaW9uKGUsMCx0KSx0Lmxlbmd0aD4wKXJldHVybnt0eXBlOiJPQ01EIixleHByZXNzaW9uOnR9fWNvbnN0IHQ9ci5nZXQoIk9DR3MiKTtpZihBcnJheS5pc0FycmF5KHQpfHx0IGluc3RhbmNlb2Ygcy5EaWN0KXtjb25zdCBlPVtdO2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKGNvbnN0IHIgb2YgdCllLnB1c2goci50b1N0cmluZygpKTtlbHNlIGUucHVzaCh0Lm9iaklkKTtyZXR1cm57dHlwZTphLGlkczplLHBvbGljeTpyLmdldCgiUCIpaW5zdGFuY2VvZiBzLk5hbWU/ci5nZXQoIlAiKS5uYW1lOm51bGwsZXhwcmVzc2lvbjpudWxsfX1pZih0IGluc3RhbmNlb2Ygcy5SZWYpcmV0dXJue3R5cGU6YSxpZDp0LnRvU3RyaW5nKCl9fXJldHVybiBudWxsfWdldE9wZXJhdG9yTGlzdChlKXtsZXR7c3RyZWFtOnQsdGFzazpyLHJlc291cmNlczphLG9wZXJhdG9yTGlzdDppLGluaXRpYWxTdGF0ZTpvPW51bGwsZmFsbGJhY2tGb250RGljdDpjPW51bGx9PWU7aWYoYXx8KGE9cy5EaWN0LmVtcHR5KSxvfHwobz1uZXcgVSksIWkpdGhyb3cgbmV3IEVycm9yKCdnZXRPcGVyYXRvckxpc3Q6IG1pc3NpbmcgIm9wZXJhdG9yTGlzdCIgcGFyYW1ldGVyJyk7Y29uc3QgbD10aGlzLGg9dGhpcy54cmVmO2xldCB1PSExO2NvbnN0IGQ9bmV3IHAuTG9jYWxJbWFnZUNhY2hlLGY9bmV3IHAuTG9jYWxDb2xvclNwYWNlQ2FjaGUsZz1uZXcgcC5Mb2NhbEdTdGF0ZUNhY2hlLG09bmV3IHAuTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUseT1uZXcgTWFwLHY9YS5nZXQoIlhPYmplY3QiKXx8cy5EaWN0LmVtcHR5LHg9YS5nZXQoIlBhdHRlcm4iKXx8cy5EaWN0LmVtcHR5LFM9bmV3IF8obyksQT1uZXcgJCh0LGgsUyksaz1uZXcgRDtmdW5jdGlvbiBDKGUpe2ZvcihsZXQgZT0wLHQ9QS5zYXZlZFN0YXRlc0RlcHRoO2U8dDtlKyspaS5hZGRPcChuLk9QUy5yZXN0b3JlLFtdKX1yZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uIGUodCxvKXtjb25zdCBwPWZ1bmN0aW9uKHIpe1Byb21pc2UuYWxsKFtyLGkucmVhZHldKS50aGVuKChmdW5jdGlvbigpe3RyeXtlKHQsbyl9Y2F0Y2goZSl7byhlKX19KSxvKX07ci5lbnN1cmVOb3RUZXJtaW5hdGVkKCksay5yZXNldCgpO2NvbnN0IE89e307bGV0IEYsSSxULE0sRSxSO2Zvcig7IShGPWsuY2hlY2soKSkmJihPLmFyZ3M9bnVsbCxBLnJlYWQoTykpOyl7bGV0IGU9Ty5hcmdzLHQ9Ty5mbjtzd2l0Y2goMHx0KXtjYXNlIG4uT1BTLnBhaW50WE9iamVjdDppZihSPWVbMF1pbnN0YW5jZW9mIHMuTmFtZSxFPWVbMF0ubmFtZSxSKXtjb25zdCB0PWQuZ2V0QnlOYW1lKEUpO2lmKHQpe2kuYWRkSW1hZ2VPcHModC5mbix0LmFyZ3MsdC5vcHRpb25hbENvbnRlbnQpLE4odCksZT1udWxsO2NvbnRpbnVlfX1yZXR1cm4gdm9pZCBwKG5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe2lmKCFSKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTtsZXQgbz12LmdldFJhdyhFKTtpZihvIGluc3RhbmNlb2Ygcy5SZWYpe2NvbnN0IHQ9ZC5nZXRCeVJlZihvKXx8bC5fcmVnaW9uYWxJbWFnZUNhY2hlLmdldEJ5UmVmKG8pO2lmKHQpcmV0dXJuIGkuYWRkSW1hZ2VPcHModC5mbix0LmFyZ3MsdC5vcHRpb25hbENvbnRlbnQpLE4odCksdm9pZCBlKCk7Y29uc3Qgcj1sLmdsb2JhbEltYWdlQ2FjaGUuZ2V0RGF0YShvLGwucGFnZUluZGV4KTtpZihyKXJldHVybiBpLmFkZERlcGVuZGVuY3koci5vYmpJZCksaS5hZGRJbWFnZU9wcyhyLmZuLHIuYXJncyxyLm9wdGlvbmFsQ29udGVudCksdm9pZCBlKCk7bz1oLmZldGNoKG8pfWlmKCEobyBpbnN0YW5jZW9mIGIuQmFzZVN0cmVhbSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7Y29uc3QgYz1vLmRpY3QuZ2V0KCJTdWJ0eXBlIik7aWYoIShjIGluc3RhbmNlb2Ygcy5OYW1lKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpO2lmKCJGb3JtIiE9PWMubmFtZSlpZigiSW1hZ2UiIT09Yy5uYW1lKXtpZigiUFMiIT09Yy5uYW1lKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmhhbmRsZWQgWE9iamVjdCBzdWJ0eXBlICIuY29uY2F0KGMubmFtZSkpOygwLG4uaW5mbykoIklnbm9yZWQgWE9iamVjdCBzdWJ0eXBlIFBTIiksZSgpfWVsc2UgbC5idWlsZFBhaW50SW1hZ2VYT2JqZWN0KHtyZXNvdXJjZXM6YSxpbWFnZTpvLG9wZXJhdG9yTGlzdDppLGNhY2hlS2V5OkUsbG9jYWxJbWFnZUNhY2hlOmQsbG9jYWxDb2xvclNwYWNlQ2FjaGU6Zn0pLnRoZW4oZSx0KTtlbHNlIFMuc2F2ZSgpLGwuYnVpbGRGb3JtWE9iamVjdChhLG8sbnVsbCxpLHIsUy5zdGF0ZS5jbG9uZSgpLGYpLnRoZW4oKGZ1bmN0aW9uKCl7Uy5yZXN0b3JlKCksZSgpfSksdCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIG4uQWJvcnRFeGNlcHRpb24pKXtpZighbC5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLG4ud2FybikoJ2dldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIFhPYmplY3Q6ICInLmNvbmNhdChlLCciLicpKX19KSkpO2Nhc2Ugbi5PUFMuc2V0Rm9udDp2YXIgRD1lWzFdO3JldHVybiB2b2lkIHAobC5oYW5kbGVTZXRGb250KGEsZSxudWxsLGkscixTLnN0YXRlLGMpLnRoZW4oKGZ1bmN0aW9uKGUpe2kuYWRkRGVwZW5kZW5jeShlKSxpLmFkZE9wKG4uT1BTLnNldEZvbnQsW2UsRF0pfSkpKTtjYXNlIG4uT1BTLmJlZ2luVGV4dDp1PSEwO2JyZWFrO2Nhc2Ugbi5PUFMuZW5kVGV4dDp1PSExO2JyZWFrO2Nhc2Ugbi5PUFMuZW5kSW5saW5lSW1hZ2U6dmFyIEI9ZVswXS5jYWNoZUtleTtpZihCKXtjb25zdCB0PWQuZ2V0QnlOYW1lKEIpO2lmKHQpe2kuYWRkSW1hZ2VPcHModC5mbix0LmFyZ3MsdC5vcHRpb25hbENvbnRlbnQpLE4odCksZT1udWxsO2NvbnRpbnVlfX1yZXR1cm4gdm9pZCBwKGwuYnVpbGRQYWludEltYWdlWE9iamVjdCh7cmVzb3VyY2VzOmEsaW1hZ2U6ZVswXSxpc0lubGluZTohMCxvcGVyYXRvckxpc3Q6aSxjYWNoZUtleTpCLGxvY2FsSW1hZ2VDYWNoZTpkLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmZ9KSk7Y2FzZSBuLk9QUy5zaG93VGV4dDppZighUy5zdGF0ZS5mb250KXtsLmVuc3VyZVN0YXRlRm9udChTLnN0YXRlKTtjb250aW51ZX1lWzBdPWwuaGFuZGxlVGV4dChlWzBdLFMuc3RhdGUpO2JyZWFrO2Nhc2Ugbi5PUFMuc2hvd1NwYWNlZFRleHQ6aWYoIVMuc3RhdGUuZm9udCl7bC5lbnN1cmVTdGF0ZUZvbnQoUy5zdGF0ZSk7Y29udGludWV9dmFyIEw9W10sXz1TLnN0YXRlO2Zvcihjb25zdCB0IG9mIGVbMF0pInN0cmluZyI9PXR5cGVvZiB0P0wucHVzaCguLi5sLmhhbmRsZVRleHQodCxfKSk6Im51bWJlciI9PXR5cGVvZiB0JiZMLnB1c2godCk7ZVswXT1MLHQ9bi5PUFMuc2hvd1RleHQ7YnJlYWs7Y2FzZSBuLk9QUy5uZXh0TGluZVNob3dUZXh0OmlmKCFTLnN0YXRlLmZvbnQpe2wuZW5zdXJlU3RhdGVGb250KFMuc3RhdGUpO2NvbnRpbnVlfWkuYWRkT3Aobi5PUFMubmV4dExpbmUpLGVbMF09bC5oYW5kbGVUZXh0KGVbMF0sUy5zdGF0ZSksdD1uLk9QUy5zaG93VGV4dDticmVhaztjYXNlIG4uT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OmlmKCFTLnN0YXRlLmZvbnQpe2wuZW5zdXJlU3RhdGVGb250KFMuc3RhdGUpO2NvbnRpbnVlfWkuYWRkT3Aobi5PUFMubmV4dExpbmUpLGkuYWRkT3Aobi5PUFMuc2V0V29yZFNwYWNpbmcsW2Uuc2hpZnQoKV0pLGkuYWRkT3Aobi5PUFMuc2V0Q2hhclNwYWNpbmcsW2Uuc2hpZnQoKV0pLGVbMF09bC5oYW5kbGVUZXh0KGVbMF0sUy5zdGF0ZSksdD1uLk9QUy5zaG93VGV4dDticmVhaztjYXNlIG4uT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlOlMuc3RhdGUudGV4dFJlbmRlcmluZ01vZGU9ZVswXTticmVhaztjYXNlIG4uT1BTLnNldEZpbGxDb2xvclNwYWNlOntjb25zdCB0PXcuQ29sb3JTcGFjZS5nZXRDYWNoZWQoZVswXSxoLGYpO2lmKHQpe1Muc3RhdGUuZmlsbENvbG9yU3BhY2U9dDtjb250aW51ZX1yZXR1cm4gdm9pZCBwKGwucGFyc2VDb2xvclNwYWNlKHtjczplWzBdLHJlc291cmNlczphLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmZ9KS50aGVuKChmdW5jdGlvbihlKXtlJiYoUy5zdGF0ZS5maWxsQ29sb3JTcGFjZT1lKX0pKSl9Y2FzZSBuLk9QUy5zZXRTdHJva2VDb2xvclNwYWNlOntjb25zdCB0PXcuQ29sb3JTcGFjZS5nZXRDYWNoZWQoZVswXSxoLGYpO2lmKHQpe1Muc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZT10O2NvbnRpbnVlfXJldHVybiB2b2lkIHAobC5wYXJzZUNvbG9yU3BhY2Uoe2NzOmVbMF0scmVzb3VyY2VzOmEsbG9jYWxDb2xvclNwYWNlQ2FjaGU6Zn0pLnRoZW4oKGZ1bmN0aW9uKGUpe2UmJihTLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U9ZSl9KSkpfWNhc2Ugbi5PUFMuc2V0RmlsbENvbG9yOk09Uy5zdGF0ZS5maWxsQ29sb3JTcGFjZSxlPU0uZ2V0UmdiKGUsMCksdD1uLk9QUy5zZXRGaWxsUkdCQ29sb3I7YnJlYWs7Y2FzZSBuLk9QUy5zZXRTdHJva2VDb2xvcjpNPVMuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSxlPU0uZ2V0UmdiKGUsMCksdD1uLk9QUy5zZXRTdHJva2VSR0JDb2xvcjticmVhaztjYXNlIG4uT1BTLnNldEZpbGxHcmF5OlMuc3RhdGUuZmlsbENvbG9yU3BhY2U9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheSxlPXcuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiKGUsMCksdD1uLk9QUy5zZXRGaWxsUkdCQ29sb3I7YnJlYWs7Y2FzZSBuLk9QUy5zZXRTdHJva2VHcmF5OlMuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZT13LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LGU9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2IoZSwwKSx0PW4uT1BTLnNldFN0cm9rZVJHQkNvbG9yO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0RmlsbENNWUtDb2xvcjpTLnN0YXRlLmZpbGxDb2xvclNwYWNlPXcuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWssZT13LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLmdldFJnYihlLDApLHQ9bi5PUFMuc2V0RmlsbFJHQkNvbG9yO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yOlMuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZT13LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLGU9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2IoZSwwKSx0PW4uT1BTLnNldFN0cm9rZVJHQkNvbG9yO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0RmlsbFJHQkNvbG9yOlMuc3RhdGUuZmlsbENvbG9yU3BhY2U9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLGU9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihlLDApO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I6Uy5zdGF0ZS5zdHJva2VDb2xvclNwYWNlPXcuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYixlPXcuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoZSwwKTticmVhaztjYXNlIG4uT1BTLnNldEZpbGxDb2xvck46aWYoTT1TLnN0YXRlLmZpbGxDb2xvclNwYWNlLCJQYXR0ZXJuIj09PU0ubmFtZSlyZXR1cm4gdm9pZCBwKGwuaGFuZGxlQ29sb3JOKGksbi5PUFMuc2V0RmlsbENvbG9yTixlLE0seCxhLHIsZixtLHkpKTtlPU0uZ2V0UmdiKGUsMCksdD1uLk9QUy5zZXRGaWxsUkdCQ29sb3I7YnJlYWs7Y2FzZSBuLk9QUy5zZXRTdHJva2VDb2xvck46aWYoTT1TLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UsIlBhdHRlcm4iPT09TS5uYW1lKXJldHVybiB2b2lkIHAobC5oYW5kbGVDb2xvck4oaSxuLk9QUy5zZXRTdHJva2VDb2xvck4sZSxNLHgsYSxyLGYsbSx5KSk7ZT1NLmdldFJnYihlLDApLHQ9bi5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7YnJlYWs7Y2FzZSBuLk9QUy5zaGFkaW5nRmlsbDp2YXIgaj1hLmdldCgiU2hhZGluZyIpO2lmKCFqKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJObyBzaGFkaW5nIHJlc291cmNlIGZvdW5kIik7dmFyIFU9ai5nZXQoZVswXS5uYW1lKTtpZighVSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiTm8gc2hhZGluZyBvYmplY3QgZm91bmQiKTtlPVtsLnBhcnNlU2hhZGluZyh7c2hhZGluZzpVLHJlc291cmNlczphLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmYsbG9jYWxTaGFkaW5nUGF0dGVybkNhY2hlOnl9KV0sdD1uLk9QUy5zaGFkaW5nRmlsbDticmVhaztjYXNlIG4uT1BTLnNldEdTdGF0ZTppZihSPWVbMF1pbnN0YW5jZW9mIHMuTmFtZSxFPWVbMF0ubmFtZSxSKXtjb25zdCB0PWcuZ2V0QnlOYW1lKEUpO2lmKHQpe3QubGVuZ3RoPjAmJmkuYWRkT3Aobi5PUFMuc2V0R1N0YXRlLFt0XSksZT1udWxsO2NvbnRpbnVlfX1yZXR1cm4gdm9pZCBwKG5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe2lmKCFSKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJHU3RhdGUgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpO2NvbnN0IG89YS5nZXQoIkV4dEdTdGF0ZSIpO2lmKCEobyBpbnN0YW5jZW9mIHMuRGljdCkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkV4dEdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LiIpO2NvbnN0IGM9by5nZXQoRSk7aWYoIShjIGluc3RhbmNlb2Ygcy5EaWN0KSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7bC5zZXRHU3RhdGUoe3Jlc291cmNlczphLGdTdGF0ZTpjLG9wZXJhdG9yTGlzdDppLGNhY2hlS2V5OkUsdGFzazpyLHN0YXRlTWFuYWdlcjpTLGxvY2FsR1N0YXRlQ2FjaGU6Zyxsb2NhbENvbG9yU3BhY2VDYWNoZTpmfSkudGhlbihlLHQpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBuLkFib3J0RXhjZXB0aW9uKSl7aWYoIWwub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxuLndhcm4pKCdnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICInLmNvbmNhdChlLCciLicpKX19KSkpO2Nhc2Ugbi5PUFMubW92ZVRvOmNhc2Ugbi5PUFMubGluZVRvOmNhc2Ugbi5PUFMuY3VydmVUbzpjYXNlIG4uT1BTLmN1cnZlVG8yOmNhc2Ugbi5PUFMuY3VydmVUbzM6Y2FzZSBuLk9QUy5jbG9zZVBhdGg6Y2FzZSBuLk9QUy5yZWN0YW5nbGU6bC5idWlsZFBhdGgoaSx0LGUsdSk7Y29udGludWU7Y2FzZSBuLk9QUy5tYXJrUG9pbnQ6Y2FzZSBuLk9QUy5tYXJrUG9pbnRQcm9wczpjYXNlIG4uT1BTLmJlZ2luQ29tcGF0OmNhc2Ugbi5PUFMuZW5kQ29tcGF0OmNvbnRpbnVlO2Nhc2Ugbi5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6aWYoIShlWzBdaW5zdGFuY2VvZiBzLk5hbWUpKXsoMCxuLndhcm4pKCJFeHBlY3RlZCBuYW1lIGZvciBiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyBhcmcwPSIuY29uY2F0KGVbMF0pKTtjb250aW51ZX1pZigiT0MiPT09ZVswXS5uYW1lKXJldHVybiB2b2lkIHAobC5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhlWzFdLGEpLnRoZW4oKGU9PntpLmFkZE9wKG4uT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLFsiT0MiLGVdKX0pKS5jYXRjaCgoZT0+e2lmKCEoZSBpbnN0YW5jZW9mIG4uQWJvcnRFeGNlcHRpb24pKXtpZighbC5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLG4ud2FybikoJ2dldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiAiJy5jb25jYXQoZSwnIi4nKSl9fSkpKTtlPVtlWzBdLm5hbWUsZVsxXWluc3RhbmNlb2Ygcy5EaWN0P2VbMV0uZ2V0KCJNQ0lEIik6bnVsbF07YnJlYWs7Y2FzZSBuLk9QUy5iZWdpbk1hcmtlZENvbnRlbnQ6Y2FzZSBuLk9QUy5lbmRNYXJrZWRDb250ZW50OmRlZmF1bHQ6aWYobnVsbCE9PWUpe2ZvcihJPTAsVD1lLmxlbmd0aDtJPFQmJiEoZVtJXWluc3RhbmNlb2Ygcy5EaWN0KTtJKyspO2lmKEk8VCl7KDAsbi53YXJuKSgiZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3Jpbmcgb3BlcmF0b3I6ICIrdCk7Y29udGludWV9fX1pLmFkZE9wKHQsZSl9Rj9wKFApOihDKCksdCgpKX0pKS5jYXRjaCgoZT0+e2lmKCEoZSBpbnN0YW5jZW9mIG4uQWJvcnRFeGNlcHRpb24pKXtpZighdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLG4ud2FybikoJ2dldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGVycm9ycyBkdXJpbmcgIicuY29uY2F0KHIubmFtZSwnIiB0YXNrOiAiJykuY29uY2F0KGUsJyIuJykpLEMoKX19KSl9Z2V0VGV4dENvbnRlbnQoZSl7bGV0e3N0cmVhbTp0LHRhc2s6cixyZXNvdXJjZXM6YSxzdGF0ZU1hbmFnZXI6aT1udWxsLGluY2x1ZGVNYXJrZWRDb250ZW50Om89ITEsc2luazpjLHNlZW5TdHlsZXM6bD1uZXcgU2V0LHZpZXdCb3g6aCxtYXJrZWRDb250ZW50RGF0YTp1PW51bGwsZGlzYWJsZU5vcm1hbGl6YXRpb246ZD0hMX09ZTthfHwoYT1zLkRpY3QuZW1wdHkpLGl8fChpPW5ldyBfKG5ldyBqKSksbyYmKHV8fCh1PXtsZXZlbDowfSkpO2NvbnN0IGY9e2l0ZW1zOltdLHN0eWxlczpPYmplY3QuY3JlYXRlKG51bGwpfSxnPXtpbml0aWFsaXplZDohMSxzdHI6W10sdG90YWxXaWR0aDowLHRvdGFsSGVpZ2h0OjAsd2lkdGg6MCxoZWlnaHQ6MCx2ZXJ0aWNhbDohMSxwcmV2VHJhbnNmb3JtOm51bGwsdGV4dEFkdmFuY2VTY2FsZTowLHNwYWNlSW5GbG93TWluOjAsc3BhY2VJbkZsb3dNYXg6MCx0cmFja2luZ1NwYWNlTWluOjEvMCxuZWdhdGl2ZVNwYWNlTWF4Oi0xLzAsbm90QVNwYWNlOi0xLzAsdHJhbnNmb3JtOm51bGwsZm9udE5hbWU6bnVsbCxoYXNFT0w6ITF9LG09WyIgIiwiICJdO2xldCB3PTA7ZnVuY3Rpb24gdihlKXtjb25zdCB0PSh3KzEpJTIscj0iICIhPT1tW3ddJiYiICI9PT1tW3RdO3JldHVybiBtW3ddPWUsdz10LHJ9ZnVuY3Rpb24geCgpe3JldHVybiIgIiE9PW1bd10mJiIgIj09PW1bKHcrMSklMl19ZnVuY3Rpb24gUygpe21bMF09bVsxXT0iICIsdz0wfWNvbnN0IEE9dGhpcyxrPXRoaXMueHJlZixDPVtdO2xldCBPPW51bGw7Y29uc3QgRj1uZXcgcC5Mb2NhbEltYWdlQ2FjaGUsST1uZXcgcC5Mb2NhbEdTdGF0ZUNhY2hlLFQ9bmV3ICQodCxrLGkpO2xldCBNO2Z1bmN0aW9uIEUoZSl7bGV0e3dpZHRoOnQ9MCxoZWlnaHQ6cj0wLHRyYW5zZm9ybTpuPWcucHJldlRyYW5zZm9ybSxmb250TmFtZTphPWcuZm9udE5hbWV9PWU7Zi5pdGVtcy5wdXNoKHtzdHI6IiAiLGRpcjoibHRyIix3aWR0aDp0LGhlaWdodDpyLHRyYW5zZm9ybTpuLGZvbnROYW1lOmEsaGFzRU9MOiExfSl9ZnVuY3Rpb24gUigpe2NvbnN0IGU9TS5mb250LHQ9W00uZm9udFNpemUqTS50ZXh0SFNjYWxlLDAsMCxNLmZvbnRTaXplLDAsTS50ZXh0UmlzZV07aWYoZS5pc1R5cGUzRm9udCYmKE0uZm9udFNpemU8PTF8fGUuaXNDaGFyQkJveCkmJiEoMCxuLmlzQXJyYXlFcXVhbCkoTS5mb250TWF0cml4LG4uRk9OVF9JREVOVElUWV9NQVRSSVgpKXtjb25zdCByPWUuYmJveFszXS1lLmJib3hbMV07cj4wJiYodFszXSo9cipNLmZvbnRNYXRyaXhbM10pfXJldHVybiBuLlV0aWwudHJhbnNmb3JtKE0uY3RtLG4uVXRpbC50cmFuc2Zvcm0oTS50ZXh0TWF0cml4LHQpKX1mdW5jdGlvbiBOKCl7aWYoZy5pbml0aWFsaXplZClyZXR1cm4gZztjb25zdHtmb250OmUsbG9hZGVkTmFtZTp0fT1NO2wuaGFzKHQpfHwobC5hZGQodCksZi5zdHlsZXNbdF09e2ZvbnRGYW1pbHk6ZS5mYWxsYmFja05hbWUsYXNjZW50OmUuYXNjZW50LGRlc2NlbnQ6ZS5kZXNjZW50LHZlcnRpY2FsOmUudmVydGljYWx9KSxnLmZvbnROYW1lPXQ7Y29uc3Qgcj1nLnRyYW5zZm9ybT1SKCk7ZS52ZXJ0aWNhbD8oZy53aWR0aD1nLnRvdGFsV2lkdGg9TWF0aC5oeXBvdChyWzBdLHJbMV0pLGcuaGVpZ2h0PWcudG90YWxIZWlnaHQ9MCxnLnZlcnRpY2FsPSEwKTooZy53aWR0aD1nLnRvdGFsV2lkdGg9MCxnLmhlaWdodD1nLnRvdGFsSGVpZ2h0PU1hdGguaHlwb3QoclsyXSxyWzNdKSxnLnZlcnRpY2FsPSExKTtjb25zdCBuPU1hdGguaHlwb3QoTS50ZXh0TGluZU1hdHJpeFswXSxNLnRleHRMaW5lTWF0cml4WzFdKSxhPU1hdGguaHlwb3QoTS5jdG1bMF0sTS5jdG1bMV0pO2cudGV4dEFkdmFuY2VTY2FsZT1hKm47Y29uc3R7Zm9udFNpemU6aX09TTtyZXR1cm4gZy50cmFja2luZ1NwYWNlTWluPS4xMDIqaSxnLm5vdEFTcGFjZT0uMDMqaSxnLm5lZ2F0aXZlU3BhY2VNYXg9LS4yKmksZy5zcGFjZUluRmxvd01pbj0uMTAyKmksZy5zcGFjZUluRmxvd01heD0uNippLGcuaGFzRU9MPSExLGcuaW5pdGlhbGl6ZWQ9ITAsZ31mdW5jdGlvbiBCKCl7aWYoIWcuaW5pdGlhbGl6ZWQpcmV0dXJuO2NvbnN0IGU9TWF0aC5oeXBvdChNLnRleHRMaW5lTWF0cml4WzBdLE0udGV4dExpbmVNYXRyaXhbMV0pLHQ9TWF0aC5oeXBvdChNLmN0bVswXSxNLmN0bVsxXSkqZTt0IT09Zy50ZXh0QWR2YW5jZVNjYWxlJiYoZy52ZXJ0aWNhbD8oZy50b3RhbEhlaWdodCs9Zy5oZWlnaHQqZy50ZXh0QWR2YW5jZVNjYWxlLGcuaGVpZ2h0PTApOihnLnRvdGFsV2lkdGgrPWcud2lkdGgqZy50ZXh0QWR2YW5jZVNjYWxlLGcud2lkdGg9MCksZy50ZXh0QWR2YW5jZVNjYWxlPXQpfWZ1bmN0aW9uIEwoZSx0KXtyZXR1cm4gQS5sb2FkRm9udChlLHQsYSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZm9udC5pc1R5cGUzRm9udD9lLmxvYWRUeXBlM0RhdGEoQSxhLHIpLmNhdGNoKChmdW5jdGlvbigpe30pKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBlfSkpOmV9KSkudGhlbigoZnVuY3Rpb24oZSl7TS5sb2FkZWROYW1lPWUubG9hZGVkTmFtZSxNLmZvbnQ9ZS5mb250LE0uZm9udE1hdHJpeD1lLmZvbnQuZm9udE1hdHJpeHx8bi5GT05UX0lERU5USVRZX01BVFJJWH0pKX1mdW5jdGlvbiBVKGUsdCxyKXtjb25zdCBuPU1hdGguaHlwb3QoclswXSxyWzFdKTtyZXR1cm5bKHJbMF0qZStyWzFdKnQpL24sKHJbMl0qZStyWzNdKnQpL25dfWZ1bmN0aW9uIFgoZSl7dmFyIHQ7Y29uc3Qgcj1SKCk7bGV0IG49cls0XSxhPXJbNV07aWYobnVsbCE9PSh0PU0uZm9udCkmJnZvaWQgMCE9PXQmJnQudmVydGljYWwpe2lmKG48aFswXXx8bj5oWzJdfHxhK2U8aFsxXXx8YT5oWzNdKXJldHVybiExfWVsc2UgaWYobitlPGhbMF18fG4+aFsyXXx8YTxoWzFdfHxhPmhbM10pcmV0dXJuITE7aWYoIU0uZm9udHx8IWcucHJldlRyYW5zZm9ybSlyZXR1cm4hMDtsZXQgaT1nLnByZXZUcmFuc2Zvcm1bNF0scz1nLnByZXZUcmFuc2Zvcm1bNV07aWYoaT09PW4mJnM9PT1hKXJldHVybiEwO2xldCBvPS0xO3N3aXRjaChyWzBdJiYwPT09clsxXSYmMD09PXJbMl0/bz1yWzBdPjA/MDoxODA6clsxXSYmMD09PXJbMF0mJjA9PT1yWzNdJiYobz1yWzFdPjA/OTA6MjcwKSxvKXtjYXNlIDA6YnJlYWs7Y2FzZSA5MDpbbixhXT1bYSxuXSxbaSxzXT1bcyxpXTticmVhaztjYXNlIDE4MDpbbixhLGksc109Wy1uLC1hLC1pLC1zXTticmVhaztjYXNlIDI3MDpbbixhXT1bLWEsLW5dLFtpLHNdPVstcywtaV07YnJlYWs7ZGVmYXVsdDpbbixhXT1VKG4sYSxyKSxbaSxzXT1VKGkscyxnLnByZXZUcmFuc2Zvcm0pfWlmKE0uZm9udC52ZXJ0aWNhbCl7Y29uc3QgZT0ocy1hKS9nLnRleHRBZHZhbmNlU2NhbGUsdD1uLWkscj1NYXRoLnNpZ24oZy5oZWlnaHQpO3JldHVybiBlPHIqZy5uZWdhdGl2ZVNwYWNlTWF4P01hdGguYWJzKHQpPi41Kmcud2lkdGg/KHEoKSwhMCk6KFMoKSxHKCksITApOk1hdGguYWJzKHQpPmcud2lkdGg/KHEoKSwhMCk6KGU8PXIqZy5ub3RBU3BhY2UmJlMoKSxlPD1yKmcudHJhY2tpbmdTcGFjZU1pbj94KCk/KFMoKSxHKCksRSh7aGVpZ2h0Ok1hdGguYWJzKGUpfSkpOmcuaGVpZ2h0Kz1lOnooZSxnLnByZXZUcmFuc2Zvcm0scil8fCgwPT09Zy5zdHIubGVuZ3RoPyhTKCksRSh7aGVpZ2h0Ok1hdGguYWJzKGUpfSkpOmcuaGVpZ2h0Kz1lKSxNYXRoLmFicyh0KT4uMjUqZy53aWR0aCYmRygpLCEwKX1jb25zdCBjPShuLWkpL2cudGV4dEFkdmFuY2VTY2FsZSxsPWEtcyx1PU1hdGguc2lnbihnLndpZHRoKTtyZXR1cm4gYzx1KmcubmVnYXRpdmVTcGFjZU1heD9NYXRoLmFicyhsKT4uNSpnLmhlaWdodD8ocSgpLCEwKTooUygpLEcoKSwhMCk6TWF0aC5hYnMobCk+Zy5oZWlnaHQ/KHEoKSwhMCk6KGM8PXUqZy5ub3RBU3BhY2UmJlMoKSxjPD11KmcudHJhY2tpbmdTcGFjZU1pbj94KCk/KFMoKSxHKCksRSh7d2lkdGg6TWF0aC5hYnMoYyl9KSk6Zy53aWR0aCs9Yzp6KGMsZy5wcmV2VHJhbnNmb3JtLHUpfHwoMD09PWcuc3RyLmxlbmd0aD8oUygpLEUoe3dpZHRoOk1hdGguYWJzKGMpfSkpOmcud2lkdGgrPWMpLE1hdGguYWJzKGwpPi4yNSpnLmhlaWdodCYmRygpLCEwKX1mdW5jdGlvbiBIKGUpe2xldHtjaGFyczp0LGV4dHJhU3BhY2luZzpyfT1lO2NvbnN0IG49TS5mb250O2lmKCF0KXtjb25zdCBlPU0uY2hhclNwYWNpbmcrcjtyZXR1cm4gdm9pZChlJiYobi52ZXJ0aWNhbD9NLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwtZSk6TS50cmFuc2xhdGVUZXh0TWF0cml4KGUqTS50ZXh0SFNjYWxlLDApKSl9Y29uc3QgYT1uLmNoYXJzVG9HbHlwaHModCksaT1NLmZvbnRNYXRyaXhbMF0qTS5mb250U2l6ZTtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDtlKyspe2NvbnN0IHM9YVtlXSx7Y2F0ZWdvcnk6b309cztpZihvLmlzSW52aXNpYmxlRm9ybWF0TWFyayljb250aW51ZTtsZXQgYz1NLmNoYXJTcGFjaW5nKyhlKzE9PT10P3I6MCksbD1zLndpZHRoO24udmVydGljYWwmJihsPXMudm1ldHJpYz9zLnZtZXRyaWNbMF06LWwpO2xldCBoPWwqaTtpZihvLmlzV2hpdGVzcGFjZSl7bi52ZXJ0aWNhbD8oYys9LWgrTS53b3JkU3BhY2luZyxNLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwtYykpOihjKz1oK00ud29yZFNwYWNpbmcsTS50cmFuc2xhdGVUZXh0TWF0cml4KGMqTS50ZXh0SFNjYWxlLDApKSx2KCIgIik7Y29udGludWV9aWYoIW8uaXNaZXJvV2lkdGhEaWFjcml0aWMmJiFYKGgpKXtuLnZlcnRpY2FsP00udHJhbnNsYXRlVGV4dE1hdHJpeCgwLGgpOk0udHJhbnNsYXRlVGV4dE1hdHJpeChoKk0udGV4dEhTY2FsZSwwKTtjb250aW51ZX1jb25zdCB1PU4oKTtvLmlzWmVyb1dpZHRoRGlhY3JpdGljJiYoaD0wKSxuLnZlcnRpY2FsPyhNLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCxoKSxoPU1hdGguYWJzKGgpLHUuaGVpZ2h0Kz1oKTooaCo9TS50ZXh0SFNjYWxlLE0udHJhbnNsYXRlVGV4dE1hdHJpeChoLDApLHUud2lkdGgrPWgpLGgmJih1LnByZXZUcmFuc2Zvcm09UigpKTtjb25zdCBkPXMudW5pY29kZTt2KGQpJiZ1LnN0ci5wdXNoKCIgIiksdS5zdHIucHVzaChkKSxjJiYobi52ZXJ0aWNhbD9NLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwtYyk6TS50cmFuc2xhdGVUZXh0TWF0cml4KGMqTS50ZXh0SFNjYWxlLDApKX19ZnVuY3Rpb24gcSgpe1MoKSxnLmluaXRpYWxpemVkPyhnLmhhc0VPTD0hMCxHKCkpOmYuaXRlbXMucHVzaCh7c3RyOiIiLGRpcjoibHRyIix3aWR0aDowLGhlaWdodDowLHRyYW5zZm9ybTpSKCksZm9udE5hbWU6TS5sb2FkZWROYW1lLGhhc0VPTDohMH0pfWZ1bmN0aW9uIHooZSx0LHIpe2lmKHIqZy5zcGFjZUluRmxvd01pbjw9ZSYmZTw9cipnLnNwYWNlSW5GbG93TWF4KXJldHVybiBnLmluaXRpYWxpemVkJiYoUygpLGcuc3RyLnB1c2goIiAiKSksITE7Y29uc3Qgbj1nLmZvbnROYW1lO2xldCBhPTA7cmV0dXJuIGcudmVydGljYWwmJihhPWUsZT0wKSxHKCksUygpLEUoe3dpZHRoOk1hdGguYWJzKGUpLGhlaWdodDpNYXRoLmFicyhhKSx0cmFuc2Zvcm06dHx8UigpLGZvbnROYW1lOm59KSwhMH1mdW5jdGlvbiBHKCl7Zy5pbml0aWFsaXplZCYmZy5zdHImJihnLnZlcnRpY2FsP2cudG90YWxIZWlnaHQrPWcuaGVpZ2h0KmcudGV4dEFkdmFuY2VTY2FsZTpnLnRvdGFsV2lkdGgrPWcud2lkdGgqZy50ZXh0QWR2YW5jZVNjYWxlLGYuaXRlbXMucHVzaChmdW5jdGlvbihlKXtsZXQgdD1lLnN0ci5qb2luKCIiKTtkfHwodD0oMCxuLm5vcm1hbGl6ZVVuaWNvZGUpKHQpKTtjb25zdCByPSgwLHkuYmlkaSkodCwtMSxlLnZlcnRpY2FsKTtyZXR1cm57c3RyOnIuc3RyLGRpcjpyLmRpcix3aWR0aDpNYXRoLmFicyhlLnRvdGFsV2lkdGgpLGhlaWdodDpNYXRoLmFicyhlLnRvdGFsSGVpZ2h0KSx0cmFuc2Zvcm06ZS50cmFuc2Zvcm0sZm9udE5hbWU6ZS5mb250TmFtZSxoYXNFT0w6ZS5oYXNFT0x9fShnKSksZy5pbml0aWFsaXplZD0hMSxnLnN0ci5sZW5ndGg9MCl9ZnVuY3Rpb24gVygpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07Y29uc3QgdD1mLml0ZW1zLmxlbmd0aDswPT09dHx8ZSYmdDwxMHx8KGMuZW5xdWV1ZShmLHQpLGYuaXRlbXM9W10sZi5zdHlsZXM9T2JqZWN0LmNyZWF0ZShudWxsKSl9Y29uc3QgVj1uZXcgRDtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uIGUodCxnKXtjb25zdCBwPWZ1bmN0aW9uKHIpe1coITApLFByb21pc2UuYWxsKFtyLGMucmVhZHldKS50aGVuKChmdW5jdGlvbigpe3RyeXtlKHQsZyl9Y2F0Y2goZSl7ZyhlKX19KSxnKX07ci5lbnN1cmVOb3RUZXJtaW5hdGVkKCksVi5yZXNldCgpO2NvbnN0IG09e307bGV0IHksdz1bXTtmb3IoOyEoeT1WLmNoZWNrKCkpJiYody5sZW5ndGg9MCxtLmFyZ3M9dyxULnJlYWQobSkpOyl7Y29uc3QgZT1NO009aS5zdGF0ZTtjb25zdCB0PW0uZm47c3dpdGNoKHc9bS5hcmdzLDB8dCl7Y2FzZSBuLk9QUy5zZXRGb250OnZhciB2PXdbMF0ubmFtZSx4PXdbMV07aWYoTS5mb250JiZ2PT09TS5mb250TmFtZSYmeD09PU0uZm9udFNpemUpYnJlYWs7cmV0dXJuIEcoKSxNLmZvbnROYW1lPXYsTS5mb250U2l6ZT14LHZvaWQgcChMKHYsbnVsbCkpO2Nhc2Ugbi5PUFMuc2V0VGV4dFJpc2U6TS50ZXh0UmlzZT13WzBdO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0SFNjYWxlOk0udGV4dEhTY2FsZT13WzBdLzEwMDticmVhaztjYXNlIG4uT1BTLnNldExlYWRpbmc6TS5sZWFkaW5nPXdbMF07YnJlYWs7Y2FzZSBuLk9QUy5tb3ZlVGV4dDpNLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KHdbMF0sd1sxXSksTS50ZXh0TWF0cml4PU0udGV4dExpbmVNYXRyaXguc2xpY2UoKTticmVhaztjYXNlIG4uT1BTLnNldExlYWRpbmdNb3ZlVGV4dDpNLmxlYWRpbmc9LXdbMV0sTS50cmFuc2xhdGVUZXh0TGluZU1hdHJpeCh3WzBdLHdbMV0pLE0udGV4dE1hdHJpeD1NLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7YnJlYWs7Y2FzZSBuLk9QUy5uZXh0TGluZTpNLmNhcnJpYWdlUmV0dXJuKCk7YnJlYWs7Y2FzZSBuLk9QUy5zZXRUZXh0TWF0cml4Ok0uc2V0VGV4dE1hdHJpeCh3WzBdLHdbMV0sd1syXSx3WzNdLHdbNF0sd1s1XSksTS5zZXRUZXh0TGluZU1hdHJpeCh3WzBdLHdbMV0sd1syXSx3WzNdLHdbNF0sd1s1XSksQigpO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0Q2hhclNwYWNpbmc6TS5jaGFyU3BhY2luZz13WzBdO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0V29yZFNwYWNpbmc6TS53b3JkU3BhY2luZz13WzBdO2JyZWFrO2Nhc2Ugbi5PUFMuYmVnaW5UZXh0Ok0udGV4dE1hdHJpeD1uLklERU5USVRZX01BVFJJWC5zbGljZSgpLE0udGV4dExpbmVNYXRyaXg9bi5JREVOVElUWV9NQVRSSVguc2xpY2UoKTticmVhaztjYXNlIG4uT1BTLnNob3dTcGFjZWRUZXh0OmlmKCFpLnN0YXRlLmZvbnQpe0EuZW5zdXJlU3RhdGVGb250KGkuc3RhdGUpO2NvbnRpbnVlfWNvbnN0IHQ9KE0uZm9udC52ZXJ0aWNhbD8xOi0xKSpNLmZvbnRTaXplLzFlMyxnPXdbMF07Zm9yKGxldCBlPTAscj1nLmxlbmd0aDtlPHI7ZSsrKXtjb25zdCByPWdbZV07aWYoInN0cmluZyI9PXR5cGVvZiByKUMucHVzaChyKTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgciYmMCE9PXIpe2NvbnN0IGU9Qy5qb2luKCIiKTtDLmxlbmd0aD0wLEgoe2NoYXJzOmUsZXh0cmFTcGFjaW5nOnIqdH0pfX1pZihDLmxlbmd0aD4wKXtjb25zdCBlPUMuam9pbigiIik7Qy5sZW5ndGg9MCxIKHtjaGFyczplLGV4dHJhU3BhY2luZzowfSl9YnJlYWs7Y2FzZSBuLk9QUy5zaG93VGV4dDppZighaS5zdGF0ZS5mb250KXtBLmVuc3VyZVN0YXRlRm9udChpLnN0YXRlKTtjb250aW51ZX1IKHtjaGFyczp3WzBdLGV4dHJhU3BhY2luZzowfSk7YnJlYWs7Y2FzZSBuLk9QUy5uZXh0TGluZVNob3dUZXh0OmlmKCFpLnN0YXRlLmZvbnQpe0EuZW5zdXJlU3RhdGVGb250KGkuc3RhdGUpO2NvbnRpbnVlfU0uY2FycmlhZ2VSZXR1cm4oKSxIKHtjaGFyczp3WzBdLGV4dHJhU3BhY2luZzowfSk7YnJlYWs7Y2FzZSBuLk9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDppZighaS5zdGF0ZS5mb250KXtBLmVuc3VyZVN0YXRlRm9udChpLnN0YXRlKTtjb250aW51ZX1NLndvcmRTcGFjaW5nPXdbMF0sTS5jaGFyU3BhY2luZz13WzFdLE0uY2FycmlhZ2VSZXR1cm4oKSxIKHtjaGFyczp3WzJdLGV4dHJhU3BhY2luZzowfSk7YnJlYWs7Y2FzZSBuLk9QUy5wYWludFhPYmplY3Q6RygpLE98fChPPWEuZ2V0KCJYT2JqZWN0Iil8fHMuRGljdC5lbXB0eSk7dmFyIFM9d1swXWluc3RhbmNlb2Ygcy5OYW1lLEU9d1swXS5uYW1lO2lmKFMmJkYuZ2V0QnlOYW1lKEUpKWJyZWFrO3JldHVybiB2b2lkIHAobmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsdCl7aWYoIVMpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlhPYmplY3QgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpO2xldCBmPU8uZ2V0UmF3KEUpO2lmKGYgaW5zdGFuY2VvZiBzLlJlZil7aWYoRi5nZXRCeVJlZihmKSlyZXR1cm4gdm9pZCBlKCk7aWYoQS5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEoZixBLnBhZ2VJbmRleCkpcmV0dXJuIHZvaWQgZSgpO2Y9ay5mZXRjaChmKX1pZighKGYgaW5zdGFuY2VvZiBiLkJhc2VTdHJlYW0pKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJYT2JqZWN0IHNob3VsZCBiZSBhIHN0cmVhbSIpO2NvbnN0IGc9Zi5kaWN0LmdldCgiU3VidHlwZSIpO2lmKCEoZyBpbnN0YW5jZW9mIHMuTmFtZSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGhhdmUgYSBOYW1lIHN1YnR5cGUiKTtpZigiRm9ybSIhPT1nLm5hbWUpcmV0dXJuIEYuc2V0KEUsZi5kaWN0Lm9iaklkLCEwKSx2b2lkIGUoKTtjb25zdCBwPWkuc3RhdGUuY2xvbmUoKSxtPW5ldyBfKHApLHk9Zi5kaWN0LmdldEFycmF5KCJNYXRyaXgiKTtBcnJheS5pc0FycmF5KHkpJiY2PT09eS5sZW5ndGgmJm0udHJhbnNmb3JtKHkpLFcoKTtjb25zdCB3PXtlbnF1ZXVlSW52b2tlZDohMSxlbnF1ZXVlKGUsdCl7dGhpcy5lbnF1ZXVlSW52b2tlZD0hMCxjLmVucXVldWUoZSx0KX0sZ2V0IGRlc2lyZWRTaXplKCl7cmV0dXJuIGMuZGVzaXJlZFNpemV9LGdldCByZWFkeSgpe3JldHVybiBjLnJlYWR5fX07QS5nZXRUZXh0Q29udGVudCh7c3RyZWFtOmYsdGFzazpyLHJlc291cmNlczpmLmRpY3QuZ2V0KCJSZXNvdXJjZXMiKXx8YSxzdGF0ZU1hbmFnZXI6bSxpbmNsdWRlTWFya2VkQ29udGVudDpvLHNpbms6dyxzZWVuU3R5bGVzOmwsdmlld0JveDpoLG1hcmtlZENvbnRlbnREYXRhOnUsZGlzYWJsZU5vcm1hbGl6YXRpb246ZH0pLnRoZW4oKGZ1bmN0aW9uKCl7dy5lbnF1ZXVlSW52b2tlZHx8Ri5zZXQoRSxmLmRpY3Qub2JqSWQsITApLGUoKX0pLHQpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBuLkFib3J0RXhjZXB0aW9uKSl7aWYoIUEub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxuLndhcm4pKCdnZXRUZXh0Q29udGVudCAtIGlnbm9yaW5nIFhPYmplY3Q6ICInLmNvbmNhdChlLCciLicpKX19KSkpO2Nhc2Ugbi5PUFMuc2V0R1N0YXRlOmlmKFM9d1swXWluc3RhbmNlb2Ygcy5OYW1lLEU9d1swXS5uYW1lLFMmJkkuZ2V0QnlOYW1lKEUpKWJyZWFrO3JldHVybiB2b2lkIHAobmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsdCl7aWYoIVMpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkdTdGF0ZSBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7Y29uc3Qgcj1hLmdldCgiRXh0R1N0YXRlIik7aWYoIShyIGluc3RhbmNlb2Ygcy5EaWN0KSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7Y29uc3QgaT1yLmdldChFKTtpZighKGkgaW5zdGFuY2VvZiBzLkRpY3QpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS4iKTtjb25zdCBvPWkuZ2V0KCJGb250Iik7bz8oRygpLE0uZm9udE5hbWU9bnVsbCxNLmZvbnRTaXplPW9bMV0sTChudWxsLG9bMF0pLnRoZW4oZSx0KSk6KEkuc2V0KEUsaS5vYmpJZCwhMCksZSgpKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7aWYoIShlIGluc3RhbmNlb2Ygbi5BYm9ydEV4Y2VwdGlvbikpe2lmKCFBLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IGU7KDAsbi53YXJuKSgnZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICInLmNvbmNhdChlLCciLicpKX19KSkpO2Nhc2Ugbi5PUFMuYmVnaW5NYXJrZWRDb250ZW50OkcoKSxvJiYodS5sZXZlbCsrLGYuaXRlbXMucHVzaCh7dHlwZToiYmVnaW5NYXJrZWRDb250ZW50Iix0YWc6d1swXWluc3RhbmNlb2Ygcy5OYW1lP3dbMF0ubmFtZTpudWxsfSkpO2JyZWFrO2Nhc2Ugbi5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6aWYoRygpLG8pe3UubGV2ZWwrKztsZXQgZT1udWxsO3dbMV1pbnN0YW5jZW9mIHMuRGljdCYmKGU9d1sxXS5nZXQoIk1DSUQiKSksZi5pdGVtcy5wdXNoKHt0eXBlOiJiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyIsaWQ6TnVtYmVyLmlzSW50ZWdlcihlKT8iIi5jb25jYXQoQS5pZEZhY3RvcnkuZ2V0UGFnZU9iaklkKCksIl9tYyIpLmNvbmNhdChlKTpudWxsLHRhZzp3WzBdaW5zdGFuY2VvZiBzLk5hbWU/d1swXS5uYW1lOm51bGx9KX1icmVhaztjYXNlIG4uT1BTLmVuZE1hcmtlZENvbnRlbnQ6aWYoRygpLG8pe2lmKDA9PT11LmxldmVsKWJyZWFrO3UubGV2ZWwtLSxmLml0ZW1zLnB1c2goe3R5cGU6ImVuZE1hcmtlZENvbnRlbnQifSl9YnJlYWs7Y2FzZSBuLk9QUy5yZXN0b3JlOiFlfHxlLmZvbnQ9PT1NLmZvbnQmJmUuZm9udFNpemU9PT1NLmZvbnRTaXplJiZlLmZvbnROYW1lPT09TS5mb250TmFtZXx8RygpfWlmKGYuaXRlbXMubGVuZ3RoPj1jLmRlc2lyZWRTaXplKXt5PSEwO2JyZWFrfX15P3AoUCk6KEcoKSxXKCksdCgpKX0pKS5jYXRjaCgoZT0+e2lmKCEoZSBpbnN0YW5jZW9mIG4uQWJvcnRFeGNlcHRpb24pKXtpZighdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLG4ud2FybikoJ2dldFRleHRDb250ZW50IC0gaWdub3JpbmcgZXJyb3JzIGR1cmluZyAiJy5jb25jYXQoci5uYW1lLCciIHRhc2s6ICInKS5jb25jYXQoZSwnIi4nKSksRygpLFcoKX19KSl9ZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKGUsdCxyKXtjb25zdCBhPXRoaXMueHJlZjtsZXQgaTtjb25zdCBvPXRoaXMucmVhZFRvVW5pY29kZShyLnRvVW5pY29kZXx8ZS5nZXQoIlRvVW5pY29kZSIpfHx0LmdldCgiVG9Vbmljb2RlIikpO2lmKHIuY29tcG9zaXRlKXtjb25zdCB0PWUuZ2V0KCJDSURTeXN0ZW1JbmZvIik7dCBpbnN0YW5jZW9mIHMuRGljdCYmKHIuY2lkU3lzdGVtSW5mbz17cmVnaXN0cnk6KDAsbi5zdHJpbmdUb1BERlN0cmluZykodC5nZXQoIlJlZ2lzdHJ5IikpLG9yZGVyaW5nOigwLG4uc3RyaW5nVG9QREZTdHJpbmcpKHQuZ2V0KCJPcmRlcmluZyIpKSxzdXBwbGVtZW50OnQuZ2V0KCJTdXBwbGVtZW50Iil9KTt0cnl7Y29uc3QgdD1lLmdldCgiQ0lEVG9HSURNYXAiKTt0IGluc3RhbmNlb2YgYi5CYXNlU3RyZWFtJiYoaT10LmdldEJ5dGVzKCkpfWNhdGNoKGUpe2lmKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IGU7KDAsbi53YXJuKSgnZXh0cmFjdERhdGFTdHJ1Y3R1cmVzIC0gaWdub3JpbmcgQ0lEVG9HSURNYXAgZGF0YTogIicuY29uY2F0KGUsJyIuJykpfX1jb25zdCBoPVtdO2xldCB1LGQ9bnVsbDtpZihlLmhhcygiRW5jb2RpbmciKSl7aWYodT1lLmdldCgiRW5jb2RpbmciKSx1IGluc3RhbmNlb2Ygcy5EaWN0KXtpZihkPXUuZ2V0KCJCYXNlRW5jb2RpbmciKSxkPWQgaW5zdGFuY2VvZiBzLk5hbWU/ZC5uYW1lOm51bGwsdS5oYXMoIkRpZmZlcmVuY2VzIikpe2NvbnN0IGU9dS5nZXQoIkRpZmZlcmVuY2VzIik7bGV0IHQ9MDtmb3IoY29uc3QgciBvZiBlKXtjb25zdCBlPWEuZmV0Y2hJZlJlZihyKTtpZigibnVtYmVyIj09dHlwZW9mIGUpdD1lO2Vsc2V7aWYoIShlIGluc3RhbmNlb2Ygcy5OYW1lKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiSW52YWxpZCBlbnRyeSBpbiAnRGlmZmVyZW5jZXMnIGFycmF5OiAiLmNvbmNhdChlKSk7aFt0KytdPWUubmFtZX19fX1lbHNlIGlmKHUgaW5zdGFuY2VvZiBzLk5hbWUpZD11Lm5hbWU7ZWxzZXtjb25zdCBlPSJFbmNvZGluZyBpcyBub3QgYSBOYW1lIG5vciBhIERpY3QiO2lmKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKGUpOygwLG4ud2FybikoZSl9Ik1hY1JvbWFuRW5jb2RpbmciIT09ZCYmIk1hY0V4cGVydEVuY29kaW5nIiE9PWQmJiJXaW5BbnNpRW5jb2RpbmciIT09ZCYmKGQ9bnVsbCl9Y29uc3QgZj0hci5maWxlfHxyLmlzSW50ZXJuYWxGb250LGc9KDAsbC5nZXRTeW1ib2xzRm9udHMpKClbci5uYW1lXTtpZihkJiZmJiZnJiYoZD1udWxsKSxkKXIuZGVmYXVsdEVuY29kaW5nPSgwLGMuZ2V0RW5jb2RpbmcpKGQpO2Vsc2V7Y29uc3QgZT0hIShyLmZsYWdzJnguRm9udEZsYWdzLlN5bWJvbGljKSx0PSEhKHIuZmxhZ3MmeC5Gb250RmxhZ3MuTm9uc3ltYm9saWMpO3U9Yy5TdGFuZGFyZEVuY29kaW5nLCJUcnVlVHlwZSIhPT1yLnR5cGV8fHR8fCh1PWMuV2luQW5zaUVuY29kaW5nKSwoZXx8ZykmJih1PWMuTWFjUm9tYW5FbmNvZGluZyxmJiYoL1N5bWJvbC9pLnRlc3Qoci5uYW1lKT91PWMuU3ltYm9sU2V0RW5jb2Rpbmc6L0RpbmdiYXRzL2kudGVzdChyLm5hbWUpP3U9Yy5aYXBmRGluZ2JhdHNFbmNvZGluZzovV2luZ2RpbmdzL2kudGVzdChyLm5hbWUpJiYodT1jLldpbkFuc2lFbmNvZGluZykpKSxyLmRlZmF1bHRFbmNvZGluZz11fXJldHVybiByLmRpZmZlcmVuY2VzPWgsci5iYXNlRW5jb2RpbmdOYW1lPWQsci5oYXNFbmNvZGluZz0hIWR8fGgubGVuZ3RoPjAsci5kaWN0PWUsby50aGVuKChlPT4oci50b1VuaWNvZGU9ZSx0aGlzLmJ1aWxkVG9Vbmljb2RlKHIpKSkpLnRoZW4oKGU9PihyLnRvVW5pY29kZT1lLGkmJihyLmNpZFRvR2lkTWFwPXRoaXMucmVhZENpZFRvR2lkTWFwKGksZSkpLHIpKSl9X3NpbXBsZUZvbnRUb1VuaWNvZGUoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTsoMCxuLmFzc2VydCkoIWUuY29tcG9zaXRlLCJNdXN0IGJlIGEgc2ltcGxlIGZvbnQuIik7Y29uc3Qgcj1bXSxhPWUuZGVmYXVsdEVuY29kaW5nLnNsaWNlKCksaT1lLmJhc2VFbmNvZGluZ05hbWUscz1lLmRpZmZlcmVuY2VzO2Zvcihjb25zdCBlIGluIHMpe2NvbnN0IHQ9c1tlXTsiLm5vdGRlZiIhPT10JiYoYVtlXT10KX1jb25zdCBvPSgwLEEuZ2V0R2x5cGhzVW5pY29kZSkoKTtmb3IoY29uc3QgbiBpbiBhKXtsZXQgcz1hW25dO2lmKCIiPT09cyljb250aW51ZTtsZXQgbD1vW3NdO2lmKHZvaWQgMCE9PWwpe3Jbbl09U3RyaW5nLmZyb21DaGFyQ29kZShsKTtjb250aW51ZX1sZXQgaD0wO3N3aXRjaChzWzBdKXtjYXNlIkciOjM9PT1zLmxlbmd0aCYmKGg9cGFyc2VJbnQocy5zdWJzdHJpbmcoMSksMTYpKTticmVhaztjYXNlImciOjU9PT1zLmxlbmd0aCYmKGg9cGFyc2VJbnQocy5zdWJzdHJpbmcoMSksMTYpKTticmVhaztjYXNlIkMiOmNhc2UiYyI6aWYocy5sZW5ndGg+PTMmJnMubGVuZ3RoPD00KXtjb25zdCByPXMuc3Vic3RyaW5nKDEpO2lmKHQpe2g9cGFyc2VJbnQociwxNik7YnJlYWt9aWYoaD0rcixOdW1iZXIuaXNOYU4oaCkmJk51bWJlci5pc0ludGVnZXIocGFyc2VJbnQociwxNikpKXJldHVybiB0aGlzLl9zaW1wbGVGb250VG9Vbmljb2RlKGUsITApfWJyZWFrO2Nhc2UidSI6bD0oMCxPLmdldFVuaWNvZGVGb3JHbHlwaCkocyxvKSwtMSE9PWwmJihoPWwpO2JyZWFrO2RlZmF1bHQ6c3dpdGNoKHMpe2Nhc2UiZl9oIjpjYXNlImZfdCI6Y2FzZSJUX2giOnJbbl09cy5yZXBsYWNlQWxsKCJfIiwiIik7Y29udGludWV9fWlmKGg+MCYmaDw9MTExNDExMSYmTnVtYmVyLmlzSW50ZWdlcihoKSl7aWYoaSYmaD09PStuKXtjb25zdCBlPSgwLGMuZ2V0RW5jb2RpbmcpKGkpO2lmKGUmJihzPWVbbl0pKXtyW25dPVN0cmluZy5mcm9tQ2hhckNvZGUob1tzXSk7Y29udGludWV9fXJbbl09U3RyaW5nLmZyb21Db2RlUG9pbnQoaCl9fXJldHVybiByfWFzeW5jIGJ1aWxkVG9Vbmljb2RlKGUpe3ZhciB0O2lmKGUuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXA9KG51bGw9PT0odD1lLnRvVW5pY29kZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQubGVuZ3RoKT4wLGUuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXApcmV0dXJuIWUuY29tcG9zaXRlJiZlLmhhc0VuY29kaW5nJiYoZS5mYWxsYmFja1RvVW5pY29kZT10aGlzLl9zaW1wbGVGb250VG9Vbmljb2RlKGUpKSxlLnRvVW5pY29kZTtpZighZS5jb21wb3NpdGUpcmV0dXJuIG5ldyBkLlRvVW5pY29kZU1hcCh0aGlzLl9zaW1wbGVGb250VG9Vbmljb2RlKGUpKTtpZihlLmNvbXBvc2l0ZSYmKGUuY01hcC5idWlsdEluQ01hcCYmIShlLmNNYXAgaW5zdGFuY2VvZiBhLklkZW50aXR5Q01hcCl8fCJBZG9iZSI9PT1lLmNpZFN5c3RlbUluZm8ucmVnaXN0cnkmJigiR0IxIj09PWUuY2lkU3lzdGVtSW5mby5vcmRlcmluZ3x8IkNOUzEiPT09ZS5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nfHwiSmFwYW4xIj09PWUuY2lkU3lzdGVtSW5mby5vcmRlcmluZ3x8IktvcmVhMSI9PT1lLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcpKSl7Y29uc3R7cmVnaXN0cnk6dCxvcmRlcmluZzpyfT1lLmNpZFN5c3RlbUluZm8saT1zLk5hbWUuZ2V0KCIiLmNvbmNhdCh0LCItIikuY29uY2F0KHIsIi1VQ1MyIikpLG89YXdhaXQgYS5DTWFwRmFjdG9yeS5jcmVhdGUoe2VuY29kaW5nOmksZmV0Y2hCdWlsdEluQ01hcDp0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsdXNlQ01hcDpudWxsfSksYz1bXSxsPVtdO3JldHVybiBlLmNNYXAuZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXtpZih0PjY1NTM1KXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJNYXggc2l6ZSBvZiBDSUQgaXMgNjUsNTM1Iik7Y29uc3Qgcj1vLmxvb2t1cCh0KTtpZihyKXtsLmxlbmd0aD0wO2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrPTIpbC5wdXNoKChyLmNoYXJDb2RlQXQoZSk8PDgpK3IuY2hhckNvZGVBdChlKzEpKTtjW2VdPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4ubCl9fSkpLG5ldyBkLlRvVW5pY29kZU1hcChjKX1yZXR1cm4gbmV3IGQuSWRlbnRpdHlUb1VuaWNvZGVNYXAoZS5maXJzdENoYXIsZS5sYXN0Q2hhcil9cmVhZFRvVW5pY29kZShlKXtyZXR1cm4gZT9lIGluc3RhbmNlb2Ygcy5OYW1lP2EuQ01hcEZhY3RvcnkuY3JlYXRlKHtlbmNvZGluZzplLGZldGNoQnVpbHRJbkNNYXA6dGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLHVzZUNNYXA6bnVsbH0pLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYS5JZGVudGl0eUNNYXA/bmV3IGQuSWRlbnRpdHlUb1VuaWNvZGVNYXAoMCw2NTUzNSk6bmV3IGQuVG9Vbmljb2RlTWFwKGUuZ2V0TWFwKCkpfSkpOmUgaW5zdGFuY2VvZiBiLkJhc2VTdHJlYW0/YS5DTWFwRmFjdG9yeS5jcmVhdGUoe2VuY29kaW5nOmUsZmV0Y2hCdWlsdEluQ01hcDp0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsdXNlQ01hcDpudWxsfSkudGhlbigoZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGEuSWRlbnRpdHlDTWFwKXJldHVybiBuZXcgZC5JZGVudGl0eVRvVW5pY29kZU1hcCgwLDY1NTM1KTtjb25zdCB0PW5ldyBBcnJheShlLmxlbmd0aCk7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSxyKXtpZigibnVtYmVyIj09dHlwZW9mIHIpcmV0dXJuIHZvaWQodFtlXT1TdHJpbmcuZnJvbUNvZGVQb2ludChyKSk7Y29uc3Qgbj1bXTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrPTIpe2NvbnN0IHQ9ci5jaGFyQ29kZUF0KGUpPDw4fHIuY2hhckNvZGVBdChlKzEpO2lmKDU1Mjk2IT0oNjM0ODgmdCkpe24ucHVzaCh0KTtjb250aW51ZX1lKz0yO2NvbnN0IGE9ci5jaGFyQ29kZUF0KGUpPDw4fHIuY2hhckNvZGVBdChlKzEpO24ucHVzaCgoKDEwMjMmdCk8PDEwKSsoMTAyMyZhKSs2NTUzNil9dFtlXT1TdHJpbmcuZnJvbUNvZGVQb2ludCguLi5uKX0pKSxuZXcgZC5Ub1VuaWNvZGVNYXAodCl9KSwoZT0+e2lmKGUgaW5zdGFuY2VvZiBuLkFib3J0RXhjZXB0aW9uKXJldHVybiBudWxsO2lmKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpcmV0dXJuKDAsbi53YXJuKSgncmVhZFRvVW5pY29kZSAtIGlnbm9yaW5nIFRvVW5pY29kZSBkYXRhOiAiJy5jb25jYXQoZSwnIi4nKSksbnVsbDt0aHJvdyBlfSkpOlByb21pc2UucmVzb2x2ZShudWxsKTpQcm9taXNlLnJlc29sdmUobnVsbCl9cmVhZENpZFRvR2lkTWFwKGUsdCl7Y29uc3Qgcj1bXTtmb3IobGV0IG49MCxhPWUubGVuZ3RoO248YTtuKyspe2NvbnN0IGE9ZVtuKytdPDw4fGVbbl0saT1uPj4xOygwIT09YXx8dC5oYXMoaSkpJiYocltpXT1hKX1yZXR1cm4gcn1leHRyYWN0V2lkdGhzKGUsdCxyKXtjb25zdCBuPXRoaXMueHJlZjtsZXQgYT1bXSxpPTA7Y29uc3Qgbz1bXTtsZXQgYyxsLGgsdSxkLGYsZyxwO2lmKHIuY29tcG9zaXRlKXtpZihpPWUuaGFzKCJEVyIpP2UuZ2V0KCJEVyIpOjFlMyxwPWUuZ2V0KCJXIikscClmb3IobD0wLGg9cC5sZW5ndGg7bDxoO2wrKylpZihmPW4uZmV0Y2hJZlJlZihwW2wrK10pLGc9bi5mZXRjaElmUmVmKHBbbF0pLEFycmF5LmlzQXJyYXkoZykpZm9yKHU9MCxkPWcubGVuZ3RoO3U8ZDt1KyspYVtmKytdPW4uZmV0Y2hJZlJlZihnW3VdKTtlbHNle2NvbnN0IGU9bi5mZXRjaElmUmVmKHBbKytsXSk7Zm9yKHU9Zjt1PD1nO3UrKylhW3VdPWV9aWYoci52ZXJ0aWNhbCl7bGV0IHQ9ZS5nZXRBcnJheSgiRFcyIil8fFs4ODAsLTFlM107aWYoYz1bdFsxXSwuNSppLHRbMF1dLHQ9ZS5nZXQoIlcyIiksdClmb3IobD0wLGg9dC5sZW5ndGg7bDxoO2wrKylpZihmPW4uZmV0Y2hJZlJlZih0W2wrK10pLGc9bi5mZXRjaElmUmVmKHRbbF0pLEFycmF5LmlzQXJyYXkoZykpZm9yKHU9MCxkPWcubGVuZ3RoO3U8ZDt1Kyspb1tmKytdPVtuLmZldGNoSWZSZWYoZ1t1KytdKSxuLmZldGNoSWZSZWYoZ1t1KytdKSxuLmZldGNoSWZSZWYoZ1t1XSldO2Vsc2V7Y29uc3QgZT1bbi5mZXRjaElmUmVmKHRbKytsXSksbi5mZXRjaElmUmVmKHRbKytsXSksbi5mZXRjaElmUmVmKHRbKytsXSldO2Zvcih1PWY7dTw9Zzt1Kyspb1t1XT1lfX19ZWxzZXtjb25zdCBvPXIuZmlyc3RDaGFyO2lmKHA9ZS5nZXQoIldpZHRocyIpLHApe2Zvcih1PW8sbD0wLGg9cC5sZW5ndGg7bDxoO2wrKylhW3UrK109bi5mZXRjaElmUmVmKHBbbF0pO2k9cGFyc2VGbG9hdCh0LmdldCgiTWlzc2luZ1dpZHRoIikpfHwwfWVsc2V7Y29uc3QgdD1lLmdldCgiQmFzZUZvbnQiKTtpZih0IGluc3RhbmNlb2Ygcy5OYW1lKXtjb25zdCBlPXRoaXMuZ2V0QmFzZUZvbnRNZXRyaWNzKHQubmFtZSk7YT10aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKGUud2lkdGhzLHIpLGk9ZS5kZWZhdWx0V2lkdGh9fX1sZXQgbT0hMCxiPWk7Zm9yKGNvbnN0IGUgaW4gYSl7Y29uc3QgdD1hW2VdO2lmKHQpaWYoYil7aWYoYiE9PXQpe209ITE7YnJlYWt9fWVsc2UgYj10fW0/ci5mbGFnc3w9eC5Gb250RmxhZ3MuRml4ZWRQaXRjaDpyLmZsYWdzJj1+eC5Gb250RmxhZ3MuRml4ZWRQaXRjaCxyLmRlZmF1bHRXaWR0aD1pLHIud2lkdGhzPWEsci5kZWZhdWx0Vk1ldHJpY3M9YyxyLnZtZXRyaWNzPW99aXNTZXJpZkZvbnQoZSl7Y29uc3QgdD1lLnNwbGl0KCItIilbMF07cmV0dXJuIHQgaW4oMCxsLmdldFNlcmlmRm9udHMpKCl8fC9zZXJpZi9naS50ZXN0KHQpfWdldEJhc2VGb250TWV0cmljcyhlKXtsZXQgdD0wLHI9T2JqZWN0LmNyZWF0ZShudWxsKSxuPSExLGE9KDAsbC5nZXRTdGRGb250TWFwKSgpW2VdfHxlO2NvbnN0IGk9KDAsQy5nZXRNZXRyaWNzKSgpO2EgaW4gaXx8KGE9dGhpcy5pc1NlcmlmRm9udChlKT8iVGltZXMtUm9tYW4iOiJIZWx2ZXRpY2EiKTtjb25zdCBzPWlbYV07cmV0dXJuIm51bWJlciI9PXR5cGVvZiBzPyh0PXMsbj0hMCk6cj1zKCkse2RlZmF1bHRXaWR0aDp0LG1vbm9zcGFjZTpuLHdpZHRoczpyfX1idWlsZENoYXJDb2RlVG9XaWR0aChlLHQpe2NvbnN0IHI9T2JqZWN0LmNyZWF0ZShudWxsKSxuPXQuZGlmZmVyZW5jZXMsYT10LmRlZmF1bHRFbmNvZGluZztmb3IobGV0IHQ9MDt0PDI1Njt0KyspdCBpbiBuJiZlW25bdF1dP3JbdF09ZVtuW3RdXTp0IGluIGEmJmVbYVt0XV0mJihyW3RdPWVbYVt0XV0pO3JldHVybiByfXByZUV2YWx1YXRlRm9udChlKXtjb25zdCB0PWU7bGV0IHI9ZS5nZXQoIlN1YnR5cGUiKTtpZighKHIgaW5zdGFuY2VvZiBzLk5hbWUpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgU3VidHlwZSIpO2xldCBhLGksbz0hMTtpZigiVHlwZTAiPT09ci5uYW1lKXtjb25zdCB0PWUuZ2V0KCJEZXNjZW5kYW50Rm9udHMiKTtpZighdCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiRGVzY2VuZGFudCBmb250cyBhcmUgbm90IHNwZWNpZmllZCIpO2lmKCEoKGU9QXJyYXkuaXNBcnJheSh0KT90aGlzLnhyZWYuZmV0Y2hJZlJlZih0WzBdKTp0KWluc3RhbmNlb2Ygcy5EaWN0KSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiRGVzY2VuZGFudCBmb250IGlzIG5vdCBhIGRpY3Rpb25hcnkuIik7aWYocj1lLmdldCgiU3VidHlwZSIpLCEociBpbnN0YW5jZW9mIHMuTmFtZSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBTdWJ0eXBlIik7bz0hMH1jb25zdCBjPWUuZ2V0KCJGaXJzdENoYXIiKXx8MCxsPWUuZ2V0KCJMYXN0Q2hhciIpfHwobz82NTUzNToyNTUpLGg9ZS5nZXQoIkZvbnREZXNjcmlwdG9yIik7aWYoaCl7YT1uZXcgSS5NdXJtdXJIYXNoM182NDtjb25zdCByPXQuZ2V0UmF3KCJFbmNvZGluZyIpO2lmKHIgaW5zdGFuY2VvZiBzLk5hbWUpYS51cGRhdGUoci5uYW1lKTtlbHNlIGlmKHIgaW5zdGFuY2VvZiBzLlJlZilhLnVwZGF0ZShyLnRvU3RyaW5nKCkpO2Vsc2UgaWYociBpbnN0YW5jZW9mIHMuRGljdClmb3IoY29uc3QgZSBvZiByLmdldFJhd1ZhbHVlcygpKWlmKGUgaW5zdGFuY2VvZiBzLk5hbWUpYS51cGRhdGUoZS5uYW1lKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBzLlJlZilhLnVwZGF0ZShlLnRvU3RyaW5nKCkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgdD1lLmxlbmd0aCxyPW5ldyBBcnJheSh0KTtmb3IobGV0IG49MDtuPHQ7bisrKXtjb25zdCB0PWVbbl07dCBpbnN0YW5jZW9mIHMuTmFtZT9yW25dPXQubmFtZTooIm51bWJlciI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2Ygcy5SZWYpJiYocltuXT10LnRvU3RyaW5nKCkpfWEudXBkYXRlKHIuam9pbigpKX1pZihhLnVwZGF0ZSgiIi5jb25jYXQoYywiLSIpLmNvbmNhdChsKSksaT1lLmdldCgiVG9Vbmljb2RlIil8fHQuZ2V0KCJUb1VuaWNvZGUiKSxpIGluc3RhbmNlb2YgYi5CYXNlU3RyZWFtKXtjb25zdCBlPWkuc3RyfHxpLHQ9ZS5idWZmZXI/bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIuYnVmZmVyLDAsZS5idWZmZXJMZW5ndGgpOm5ldyBVaW50OEFycmF5KGUuYnl0ZXMuYnVmZmVyLGUuc3RhcnQsZS5lbmQtZS5zdGFydCk7YS51cGRhdGUodCl9ZWxzZSBpIGluc3RhbmNlb2Ygcy5OYW1lJiZhLnVwZGF0ZShpLm5hbWUpO2NvbnN0IG49ZS5nZXQoIldpZHRocyIpfHx0LmdldCgiV2lkdGhzIik7aWYoQXJyYXkuaXNBcnJheShuKSl7Y29uc3QgZT1bXTtmb3IoY29uc3QgdCBvZiBuKSgibnVtYmVyIj09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBzLlJlZikmJmUucHVzaCh0LnRvU3RyaW5nKCkpO2EudXBkYXRlKGUuam9pbigpKX1pZihvKXthLnVwZGF0ZSgiY29tcG9zaXRlRm9udCIpO2NvbnN0IHI9ZS5nZXQoIlciKXx8dC5nZXQoIlciKTtpZihBcnJheS5pc0FycmF5KHIpKXtjb25zdCBlPVtdO2Zvcihjb25zdCB0IG9mIHIpaWYoIm51bWJlciI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2Ygcy5SZWYpZS5wdXNoKHQudG9TdHJpbmcoKSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXtjb25zdCByPVtdO2Zvcihjb25zdCBlIG9mIHQpKCJudW1iZXIiPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIHMuUmVmKSYmci5wdXNoKGUudG9TdHJpbmcoKSk7ZS5wdXNoKCJbIi5jb25jYXQoci5qb2luKCksIl0iKSl9YS51cGRhdGUoZS5qb2luKCkpfWNvbnN0IG49ZS5nZXRSYXcoIkNJRFRvR0lETWFwIil8fHQuZ2V0UmF3KCJDSURUb0dJRE1hcCIpO24gaW5zdGFuY2VvZiBzLk5hbWU/YS51cGRhdGUobi5uYW1lKTpuIGluc3RhbmNlb2Ygcy5SZWY/YS51cGRhdGUobi50b1N0cmluZygpKTpuIGluc3RhbmNlb2YgYi5CYXNlU3RyZWFtJiZhLnVwZGF0ZShuLnBlZWtCeXRlcygpKX19cmV0dXJue2Rlc2NyaXB0b3I6aCxkaWN0OmUsYmFzZURpY3Q6dCxjb21wb3NpdGU6byx0eXBlOnIubmFtZSxmaXJzdENoYXI6YyxsYXN0Q2hhcjpsLHRvVW5pY29kZTppLGhhc2g6YT9hLmhleGRpZ2VzdCgpOiIifX1hc3luYyB0cmFuc2xhdGVGb250KGUpe3ZhciB0LHI7bGV0e2Rlc2NyaXB0b3I6aSxkaWN0OmMsYmFzZURpY3Q6aCxjb21wb3NpdGU6ZCx0eXBlOmYsZmlyc3RDaGFyOmcsbGFzdENoYXI6cCx0b1VuaWNvZGU6Yixjc3NGb250SW5mbzp5fT1lO2NvbnN0IHc9IlR5cGUzIj09PWY7bGV0IHY7aWYoIWkpe2lmKCF3KXtsZXQgZT1jLmdldCgiQmFzZUZvbnQiKTtpZighKGUgaW5zdGFuY2VvZiBzLk5hbWUpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJCYXNlIGZvbnQgaXMgbm90IHNwZWNpZmllZCIpO2U9ZS5uYW1lLnJlcGxhY2VBbGwoL1ssX10vZywiLSIpO2NvbnN0IHQ9dGhpcy5nZXRCYXNlRm9udE1ldHJpY3MoZSkscj1lLnNwbGl0KCItIilbMF0sYT0odGhpcy5pc1NlcmlmRm9udChyKT94LkZvbnRGbGFncy5TZXJpZjowKXwodC5tb25vc3BhY2U/eC5Gb250RmxhZ3MuRml4ZWRQaXRjaDowKXwoKDAsbC5nZXRTeW1ib2xzRm9udHMpKClbcl0/eC5Gb250RmxhZ3MuU3ltYm9saWM6eC5Gb250RmxhZ3MuTm9uc3ltYm9saWMpO3Y9e3R5cGU6ZixuYW1lOmUsbG9hZGVkTmFtZTpoLmxvYWRlZE5hbWUsc3lzdGVtRm9udEluZm86bnVsbCx3aWR0aHM6dC53aWR0aHMsZGVmYXVsdFdpZHRoOnQuZGVmYXVsdFdpZHRoLGlzU2ltdWxhdGVkRmxhZ3M6ITAsZmxhZ3M6YSxmaXJzdENoYXI6ZyxsYXN0Q2hhcjpwLHRvVW5pY29kZTpiLHhIZWlnaHQ6MCxjYXBIZWlnaHQ6MCxpdGFsaWNBbmdsZTowLGlzVHlwZTNGb250Ond9O2NvbnN0IGk9Yy5nZXQoIldpZHRocyIpLHU9KDAsbC5nZXRTdGFuZGFyZEZvbnROYW1lKShlKTtsZXQgZD1udWxsO3JldHVybiB1JiYoZD1hd2FpdCB0aGlzLmZldGNoU3RhbmRhcmRGb250RGF0YSh1KSx2LmlzSW50ZXJuYWxGb250PSEhZCksIXYuaXNJbnRlcm5hbEZvbnQmJnRoaXMub3B0aW9ucy51c2VTeXN0ZW1Gb250cyYmKHYuc3lzdGVtRm9udEluZm89KDAsUy5nZXRGb250U3Vic3RpdHV0aW9uKSh0aGlzLnN5c3RlbUZvbnRDYWNoZSx0aGlzLmlkRmFjdG9yeSx0aGlzLm9wdGlvbnMuc3RhbmRhcmRGb250RGF0YVVybCxlLHUpKSx0aGlzLmV4dHJhY3REYXRhU3RydWN0dXJlcyhjLGMsdikudGhlbigocj0+e2lmKGkpe2NvbnN0IGU9W107bGV0IHQ9Zztmb3IoY29uc3QgciBvZiBpKWVbdCsrXT10aGlzLnhyZWYuZmV0Y2hJZlJlZihyKTtyLndpZHRocz1lfWVsc2Ugci53aWR0aHM9dGhpcy5idWlsZENoYXJDb2RlVG9XaWR0aCh0LndpZHRocyxyKTtyZXR1cm4gbmV3IG8uRm9udChlLGQscil9KSl9aT1uZXcgcy5EaWN0KG51bGwpLGkuc2V0KCJGb250TmFtZSIscy5OYW1lLmdldChmKSksaS5zZXQoIkZvbnRCQm94IixjLmdldEFycmF5KCJGb250QkJveCIpfHxbMCwwLDAsMF0pfWxldCBBPWkuZ2V0KCJGb250TmFtZSIpLGs9Yy5nZXQoIkJhc2VGb250Iik7InN0cmluZyI9PXR5cGVvZiBBJiYoQT1zLk5hbWUuZ2V0KEEpKSwic3RyaW5nIj09dHlwZW9mIGsmJihrPXMuTmFtZS5nZXQoaykpO2NvbnN0IEM9bnVsbD09PSh0PUEpfHx2b2lkIDA9PT10P3ZvaWQgMDp0Lm5hbWUsTz1udWxsPT09KHI9ayl8fHZvaWQgMD09PXI/dm9pZCAwOnIubmFtZTtpZih3fHxDPT09T3x8KCgwLG4uaW5mbykoIlRoZSBGb250RGVzY3JpcHRvcidzIEZvbnROYW1lIGlzIFwiIi5jb25jYXQoQywnIiBidXQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBGb250XCdzIEJhc2VGb250ICInKS5jb25jYXQoTywnIi4nKSksQyYmTyYmKE8uc3RhcnRzV2l0aChDKXx8ISgwLGwuaXNLbm93bkZvbnROYW1lKShDKSYmKDAsbC5pc0tub3duRm9udE5hbWUpKE8pKSYmKEE9bnVsbCkpLEF8fChBPWspLCEoQSBpbnN0YW5jZW9mIHMuTmFtZSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBuYW1lIik7bGV0IEYsSSxULE0sRTt0cnl7Rj1pLmdldCgiRm9udEZpbGUiLCJGb250RmlsZTIiLCJGb250RmlsZTMiKX1jYXRjaChlKXtpZighdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLG4ud2FybikoJ3RyYW5zbGF0ZUZvbnQgLSBmZXRjaGluZyAiJy5jb25jYXQoQS5uYW1lLCciIGZvbnQgZmlsZTogIicpLmNvbmNhdChlLCciLicpKSxGPW5ldyBtLk51bGxTdHJlYW19bGV0IFA9ITEsUj1udWxsLE49bnVsbDtpZihGKXtpZihGLmRpY3Qpe2NvbnN0IGU9Ri5kaWN0LmdldCgiU3VidHlwZSIpO2UgaW5zdGFuY2VvZiBzLk5hbWUmJihJPWUubmFtZSksVD1GLmRpY3QuZ2V0KCJMZW5ndGgxIiksTT1GLmRpY3QuZ2V0KCJMZW5ndGgyIiksRT1GLmRpY3QuZ2V0KCJMZW5ndGgzIil9fWVsc2UgaWYoeSl7Y29uc3QgZT0oMCx1LmdldFhmYUZvbnROYW1lKShBLm5hbWUpO2UmJih5LmZvbnRGYW1pbHk9IiIuY29uY2F0KHkuZm9udEZhbWlseSwiLVBkZkpTLVhGQSIpLHkubWV0cmljcz1lLm1ldHJpY3N8fG51bGwsUj1lLmZhY3RvcnN8fG51bGwsRj1hd2FpdCB0aGlzLmZldGNoU3RhbmRhcmRGb250RGF0YShlLm5hbWUpLFA9ISFGLGg9Yz0oMCx1LmdldFhmYUZvbnREaWN0KShBLm5hbWUpLGQ9ITApfWVsc2UgaWYoIXcpe2NvbnN0IGU9KDAsbC5nZXRTdGFuZGFyZEZvbnROYW1lKShBLm5hbWUpO2UmJihGPWF3YWl0IHRoaXMuZmV0Y2hTdGFuZGFyZEZvbnREYXRhKGUpLFA9ISFGKSwhUCYmdGhpcy5vcHRpb25zLnVzZVN5c3RlbUZvbnRzJiYoTj0oMCxTLmdldEZvbnRTdWJzdGl0dXRpb24pKHRoaXMuc3lzdGVtRm9udENhY2hlLHRoaXMuaWRGYWN0b3J5LHRoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsLEEubmFtZSxlKSl9aWYodj17dHlwZTpmLG5hbWU6QS5uYW1lLHN1YnR5cGU6SSxmaWxlOkYsbGVuZ3RoMTpULGxlbmd0aDI6TSxsZW5ndGgzOkUsaXNJbnRlcm5hbEZvbnQ6UCxsb2FkZWROYW1lOmgubG9hZGVkTmFtZSxjb21wb3NpdGU6ZCxmaXhlZFBpdGNoOiExLGZvbnRNYXRyaXg6Yy5nZXRBcnJheSgiRm9udE1hdHJpeCIpfHxuLkZPTlRfSURFTlRJVFlfTUFUUklYLGZpcnN0Q2hhcjpnLGxhc3RDaGFyOnAsdG9Vbmljb2RlOmIsYmJveDppLmdldEFycmF5KCJGb250QkJveCIpfHxjLmdldEFycmF5KCJGb250QkJveCIpLGFzY2VudDppLmdldCgiQXNjZW50IiksZGVzY2VudDppLmdldCgiRGVzY2VudCIpLHhIZWlnaHQ6aS5nZXQoIlhIZWlnaHQiKXx8MCxjYXBIZWlnaHQ6aS5nZXQoIkNhcEhlaWdodCIpfHwwLGZsYWdzOmkuZ2V0KCJGbGFncyIpLGl0YWxpY0FuZ2xlOmkuZ2V0KCJJdGFsaWNBbmdsZSIpfHwwLGlzVHlwZTNGb250OncsY3NzRm9udEluZm86eSxzY2FsZUZhY3RvcnM6UixzeXN0ZW1Gb250SW5mbzpOfSxkKXtjb25zdCBlPWguZ2V0KCJFbmNvZGluZyIpO2UgaW5zdGFuY2VvZiBzLk5hbWUmJih2LmNpZEVuY29kaW5nPWUubmFtZSk7Y29uc3QgdD1hd2FpdCBhLkNNYXBGYWN0b3J5LmNyZWF0ZSh7ZW5jb2Rpbmc6ZSxmZXRjaEJ1aWx0SW5DTWFwOnRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZCx1c2VDTWFwOm51bGx9KTt2LmNNYXA9dCx2LnZlcnRpY2FsPXYuY01hcC52ZXJ0aWNhbH1yZXR1cm4gdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoYyxoLHYpLnRoZW4oKGU9Pih0aGlzLmV4dHJhY3RXaWR0aHMoYyxpLGUpLG5ldyBvLkZvbnQoQS5uYW1lLEYsZSkpKSl9c3RhdGljIGJ1aWxkRm9udFBhdGhzKGUsdCxyLGEpe2Z1bmN0aW9uIGkodCl7Y29uc3QgaT0iIi5jb25jYXQoZS5sb2FkZWROYW1lLCJfcGF0aF8iKS5jb25jYXQodCk7dHJ5e2lmKGUucmVuZGVyZXIuaGFzQnVpbHRQYXRoKHQpKXJldHVybjtyLnNlbmQoImNvbW1vbm9iaiIsW2ksIkZvbnRQYXRoIixlLnJlbmRlcmVyLmdldFBhdGhKcyh0KV0pfWNhdGNoKGUpe2lmKGEuaWdub3JlRXJyb3JzKXJldHVybiB2b2lkKDAsbi53YXJuKSgiYnVpbGRGb250UGF0aHMgLSBpZ25vcmluZyAiLmNvbmNhdChpLCcgZ2x5cGg6ICInKS5jb25jYXQoZSwnIi4nKSk7dGhyb3cgZX19Zm9yKGNvbnN0IGUgb2YgdCl7aShlLmZvbnRDaGFyKTtjb25zdCB0PWUuYWNjZW50OyhudWxsPT10P3ZvaWQgMDp0LmZvbnRDaGFyKSYmaSh0LmZvbnRDaGFyKX19c3RhdGljIGdldCBmYWxsYmFja0ZvbnREaWN0KCl7Y29uc3QgZT1uZXcgcy5EaWN0O3JldHVybiBlLnNldCgiQmFzZUZvbnQiLHMuTmFtZS5nZXQoIkhlbHZldGljYSIpKSxlLnNldCgiVHlwZSIscy5OYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpLGUuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGYWxsYmFja1R5cGUiKSksZS5zZXQoIkVuY29kaW5nIixzLk5hbWUuZ2V0KCJXaW5BbnNpRW5jb2RpbmciKSksKDAsbi5zaGFkb3cpKHRoaXMsImZhbGxiYWNrRm9udERpY3QiLGUpfX10LlBhcnRpYWxFdmFsdWF0b3I9QjtjbGFzcyBMe2NvbnN0cnVjdG9yKGUpe2xldHtsb2FkZWROYW1lOnQsZm9udDpyLGRpY3Q6bixldmFsdWF0b3JPcHRpb25zOmF9PWU7dGhpcy5sb2FkZWROYW1lPXQsdGhpcy5mb250PXIsdGhpcy5kaWN0PW4sdGhpcy5fZXZhbHVhdG9yT3B0aW9ucz1hfHxFLHRoaXMudHlwZTNMb2FkZWQ9bnVsbCx0aGlzLnR5cGUzRGVwZW5kZW5jaWVzPXIuaXNUeXBlM0ZvbnQ/bmV3IFNldDpudWxsLHRoaXMuc2VudD0hMX1zZW5kKGUpe3RoaXMuc2VudHx8KHRoaXMuc2VudD0hMCxlLnNlbmQoImNvbW1vbm9iaiIsW3RoaXMubG9hZGVkTmFtZSwiRm9udCIsdGhpcy5mb250LmV4cG9ydERhdGEodGhpcy5fZXZhbHVhdG9yT3B0aW9ucy5mb250RXh0cmFQcm9wZXJ0aWVzKV0pKX1mYWxsYmFjayhlKXt0aGlzLmZvbnQuZGF0YSYmKHRoaXMuZm9udC5kaXNhYmxlRm9udEZhY2U9ITAsQi5idWlsZEZvbnRQYXRocyh0aGlzLmZvbnQsdGhpcy5mb250LmdseXBoQ2FjaGVWYWx1ZXMsZSx0aGlzLl9ldmFsdWF0b3JPcHRpb25zKSl9bG9hZFR5cGUzRGF0YShlLHQscil7aWYodGhpcy50eXBlM0xvYWRlZClyZXR1cm4gdGhpcy50eXBlM0xvYWRlZDtpZighdGhpcy5mb250LmlzVHlwZTNGb250KXRocm93IG5ldyBFcnJvcigiTXVzdCBiZSBhIFR5cGUzIGZvbnQuIik7Y29uc3QgYT1lLmNsb25lKHtpZ25vcmVFcnJvcnM6ITF9KTthLnBhcnNpbmdUeXBlM0ZvbnQ9ITA7Y29uc3QgaT1uZXcgcy5SZWZTZXQoZS50eXBlM0ZvbnRSZWZzKTt0aGlzLmRpY3Qub2JqSWQmJiFpLmhhcyh0aGlzLmRpY3Qub2JqSWQpJiZpLnB1dCh0aGlzLmRpY3Qub2JqSWQpLGEudHlwZTNGb250UmVmcz1pO2NvbnN0IG89dGhpcy5mb250LGM9dGhpcy50eXBlM0RlcGVuZGVuY2llcztsZXQgbD1Qcm9taXNlLnJlc29sdmUoKTtjb25zdCBoPXRoaXMuZGljdC5nZXQoIkNoYXJQcm9jcyIpLHU9dGhpcy5kaWN0LmdldCgiUmVzb3VyY2VzIil8fHQsZD1PYmplY3QuY3JlYXRlKG51bGwpLGY9bi5VdGlsLm5vcm1hbGl6ZVJlY3Qoby5iYm94fHxbMCwwLDAsMF0pLGc9ZlsyXS1mWzBdLHA9ZlszXS1mWzFdLG09TWF0aC5oeXBvdChnLHApO2Zvcihjb25zdCBlIG9mIGguZ2V0S2V5cygpKWw9bC50aGVuKCgoKT0+e2NvbnN0IHQ9aC5nZXQoZSksaT1uZXcgVC5PcGVyYXRvckxpc3Q7cmV0dXJuIGEuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06dCx0YXNrOnIscmVzb3VyY2VzOnUsb3BlcmF0b3JMaXN0Oml9KS50aGVuKCgoKT0+e2kuZm5BcnJheVswXT09PW4uT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kcyYmdGhpcy5fcmVtb3ZlVHlwZTNDb2xvck9wZXJhdG9ycyhpLG0pLGRbZV09aS5nZXRJUigpO2Zvcihjb25zdCBlIG9mIGkuZGVwZW5kZW5jaWVzKWMuYWRkKGUpfSkpLmNhdGNoKChmdW5jdGlvbih0KXsoMCxuLndhcm4pKCdUeXBlMyBmb250IHJlc291cmNlICInLmNvbmNhdChlLCciIGlzIG5vdCBhdmFpbGFibGUuJykpO2NvbnN0IHI9bmV3IFQuT3BlcmF0b3JMaXN0O2RbZV09ci5nZXRJUigpfSkpfSkpO3JldHVybiB0aGlzLnR5cGUzTG9hZGVkPWwudGhlbigoKCk9PntvLmNoYXJQcm9jT3BlcmF0b3JMaXN0PWQsdGhpcy5fYmJveCYmKG8uaXNDaGFyQkJveD0hMCxvLmJib3g9dGhpcy5fYmJveCl9KSksdGhpcy50eXBlM0xvYWRlZH1fcmVtb3ZlVHlwZTNDb2xvck9wZXJhdG9ycyhlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06TmFOO2NvbnN0IHI9bi5VdGlsLm5vcm1hbGl6ZVJlY3QoZS5hcmdzQXJyYXlbMF0uc2xpY2UoMikpLGE9clsyXS1yWzBdLGk9clszXS1yWzFdLHM9TWF0aC5oeXBvdChhLGkpOzA9PT1hfHwwPT09aT8oZS5mbkFycmF5LnNwbGljZSgwLDEpLGUuYXJnc0FycmF5LnNwbGljZSgwLDEpKTooMD09PXR8fE1hdGgucm91bmQocy90KT49MTApJiYodGhpcy5fYmJveHx8KHRoaXMuX2Jib3g9WzEvMCwxLzAsLTEvMCwtMS8wXSksdGhpcy5fYmJveFswXT1NYXRoLm1pbih0aGlzLl9iYm94WzBdLHJbMF0pLHRoaXMuX2Jib3hbMV09TWF0aC5taW4odGhpcy5fYmJveFsxXSxyWzFdKSx0aGlzLl9iYm94WzJdPU1hdGgubWF4KHRoaXMuX2Jib3hbMl0sclsyXSksdGhpcy5fYmJveFszXT1NYXRoLm1heCh0aGlzLl9iYm94WzNdLHJbM10pKTtsZXQgbz0wLGM9ZS5sZW5ndGg7Zm9yKDtvPGM7KXtzd2l0Y2goZS5mbkFycmF5W29dKXtjYXNlIG4uT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kczpicmVhaztjYXNlIG4uT1BTLnNldFN0cm9rZUNvbG9yU3BhY2U6Y2FzZSBuLk9QUy5zZXRGaWxsQ29sb3JTcGFjZTpjYXNlIG4uT1BTLnNldFN0cm9rZUNvbG9yOmNhc2Ugbi5PUFMuc2V0U3Ryb2tlQ29sb3JOOmNhc2Ugbi5PUFMuc2V0RmlsbENvbG9yOmNhc2Ugbi5PUFMuc2V0RmlsbENvbG9yTjpjYXNlIG4uT1BTLnNldFN0cm9rZUdyYXk6Y2FzZSBuLk9QUy5zZXRGaWxsR3JheTpjYXNlIG4uT1BTLnNldFN0cm9rZVJHQkNvbG9yOmNhc2Ugbi5PUFMuc2V0RmlsbFJHQkNvbG9yOmNhc2Ugbi5PUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yOmNhc2Ugbi5PUFMuc2V0RmlsbENNWUtDb2xvcjpjYXNlIG4uT1BTLnNoYWRpbmdGaWxsOmNhc2Ugbi5PUFMuc2V0UmVuZGVyaW5nSW50ZW50OmUuZm5BcnJheS5zcGxpY2UobywxKSxlLmFyZ3NBcnJheS5zcGxpY2UobywxKSxjLS07Y29udGludWU7Y2FzZSBuLk9QUy5zZXRHU3RhdGU6Y29uc3RbdF09ZS5hcmdzQXJyYXlbb107bGV0IHI9MCxhPXQubGVuZ3RoO2Zvcig7cjxhOyl7Y29uc3RbZV09dFtyXTtzd2l0Y2goZSl7Y2FzZSJUUiI6Y2FzZSJUUjIiOmNhc2UiSFQiOmNhc2UiQkciOmNhc2UiQkcyIjpjYXNlIlVDUiI6Y2FzZSJVQ1IyIjp0LnNwbGljZShyLDEpLGEtLTtjb250aW51ZX1yKyt9fW8rK319fWNsYXNzIF97Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bmV3IFU7dGhpcy5zdGF0ZT1lLHRoaXMuc3RhdGVTdGFjaz1bXX1zYXZlKCl7Y29uc3QgZT10aGlzLnN0YXRlO3RoaXMuc3RhdGVTdGFjay5wdXNoKHRoaXMuc3RhdGUpLHRoaXMuc3RhdGU9ZS5jbG9uZSgpfXJlc3RvcmUoKXtjb25zdCBlPXRoaXMuc3RhdGVTdGFjay5wb3AoKTtlJiYodGhpcy5zdGF0ZT1lKX10cmFuc2Zvcm0oZSl7dGhpcy5zdGF0ZS5jdG09bi5VdGlsLnRyYW5zZm9ybSh0aGlzLnN0YXRlLmN0bSxlKX19Y2xhc3Mgantjb25zdHJ1Y3Rvcigpe3RoaXMuY3RtPW5ldyBGbG9hdDMyQXJyYXkobi5JREVOVElUWV9NQVRSSVgpLHRoaXMuZm9udE5hbWU9bnVsbCx0aGlzLmZvbnRTaXplPTAsdGhpcy5sb2FkZWROYW1lPW51bGwsdGhpcy5mb250PW51bGwsdGhpcy5mb250TWF0cml4PW4uRk9OVF9JREVOVElUWV9NQVRSSVgsdGhpcy50ZXh0TWF0cml4PW4uSURFTlRJVFlfTUFUUklYLnNsaWNlKCksdGhpcy50ZXh0TGluZU1hdHJpeD1uLklERU5USVRZX01BVFJJWC5zbGljZSgpLHRoaXMuY2hhclNwYWNpbmc9MCx0aGlzLndvcmRTcGFjaW5nPTAsdGhpcy5sZWFkaW5nPTAsdGhpcy50ZXh0SFNjYWxlPTEsdGhpcy50ZXh0UmlzZT0wfXNldFRleHRNYXRyaXgoZSx0LHIsbixhLGkpe2NvbnN0IHM9dGhpcy50ZXh0TWF0cml4O3NbMF09ZSxzWzFdPXQsc1syXT1yLHNbM109bixzWzRdPWEsc1s1XT1pfXNldFRleHRMaW5lTWF0cml4KGUsdCxyLG4sYSxpKXtjb25zdCBzPXRoaXMudGV4dExpbmVNYXRyaXg7c1swXT1lLHNbMV09dCxzWzJdPXIsc1szXT1uLHNbNF09YSxzWzVdPWl9dHJhbnNsYXRlVGV4dE1hdHJpeChlLHQpe2NvbnN0IHI9dGhpcy50ZXh0TWF0cml4O3JbNF09clswXSplK3JbMl0qdCtyWzRdLHJbNV09clsxXSplK3JbM10qdCtyWzVdfXRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGUsdCl7Y29uc3Qgcj10aGlzLnRleHRMaW5lTWF0cml4O3JbNF09clswXSplK3JbMl0qdCtyWzRdLHJbNV09clsxXSplK3JbM10qdCtyWzVdfWNhcnJpYWdlUmV0dXJuKCl7dGhpcy50cmFuc2xhdGVUZXh0TGluZU1hdHJpeCgwLC10aGlzLmxlYWRpbmcpLHRoaXMudGV4dE1hdHJpeD10aGlzLnRleHRMaW5lTWF0cml4LnNsaWNlKCl9Y2xvbmUoKXtjb25zdCBlPU9iamVjdC5jcmVhdGUodGhpcyk7cmV0dXJuIGUudGV4dE1hdHJpeD10aGlzLnRleHRNYXRyaXguc2xpY2UoKSxlLnRleHRMaW5lTWF0cml4PXRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKSxlLmZvbnRNYXRyaXg9dGhpcy5mb250TWF0cml4LnNsaWNlKCksZX19Y2xhc3MgVXtjb25zdHJ1Y3Rvcigpe3RoaXMuY3RtPW5ldyBGbG9hdDMyQXJyYXkobi5JREVOVElUWV9NQVRSSVgpLHRoaXMuZm9udD1udWxsLHRoaXMudGV4dFJlbmRlcmluZ01vZGU9bi5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMLHRoaXMuZmlsbENvbG9yU3BhY2U9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheSx0aGlzLnN0cm9rZUNvbG9yU3BhY2U9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheX1jbG9uZSgpe3JldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpfX1jbGFzcyAke3N0YXRpYyBnZXQgb3BNYXAoKXtjb25zdCBlPSgwLGsuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS53PXtpZDpuLk9QUy5zZXRMaW5lV2lkdGgsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5KPXtpZDpuLk9QUy5zZXRMaW5lQ2FwLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuaj17aWQ6bi5PUFMuc2V0TGluZUpvaW4sbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5NPXtpZDpuLk9QUy5zZXRNaXRlckxpbWl0LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuZD17aWQ6bi5PUFMuc2V0RGFzaCxudW1BcmdzOjIsdmFyaWFibGVBcmdzOiExfSxlLnJpPXtpZDpuLk9QUy5zZXRSZW5kZXJpbmdJbnRlbnQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5pPXtpZDpuLk9QUy5zZXRGbGF0bmVzcyxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfSxlLmdzPXtpZDpuLk9QUy5zZXRHU3RhdGUsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5xPXtpZDpuLk9QUy5zYXZlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuUT17aWQ6bi5PUFMucmVzdG9yZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfSxlLmNtPXtpZDpuLk9QUy50cmFuc2Zvcm0sbnVtQXJnczo2LHZhcmlhYmxlQXJnczohMX0sZS5tPXtpZDpuLk9QUy5tb3ZlVG8sbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX0sZS5sPXtpZDpuLk9QUy5saW5lVG8sbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX0sZS5jPXtpZDpuLk9QUy5jdXJ2ZVRvLG51bUFyZ3M6Nix2YXJpYWJsZUFyZ3M6ITF9LGUudj17aWQ6bi5PUFMuY3VydmVUbzIsbnVtQXJnczo0LHZhcmlhYmxlQXJnczohMX0sZS55PXtpZDpuLk9QUy5jdXJ2ZVRvMyxudW1BcmdzOjQsdmFyaWFibGVBcmdzOiExfSxlLmg9e2lkOm4uT1BTLmNsb3NlUGF0aCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfSxlLnJlPXtpZDpuLk9QUy5yZWN0YW5nbGUsbnVtQXJnczo0LHZhcmlhYmxlQXJnczohMX0sZS5TPXtpZDpuLk9QUy5zdHJva2UsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZS5zPXtpZDpuLk9QUy5jbG9zZVN0cm9rZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfSxlLmY9e2lkOm4uT1BTLmZpbGwsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZS5GPXtpZDpuLk9QUy5maWxsLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGVbImYqIl09e2lkOm4uT1BTLmVvRmlsbCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfSxlLkI9e2lkOm4uT1BTLmZpbGxTdHJva2UsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZVsiQioiXT17aWQ6bi5PUFMuZW9GaWxsU3Ryb2tlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuYj17aWQ6bi5PUFMuY2xvc2VGaWxsU3Ryb2tlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGVbImIqIl09e2lkOm4uT1BTLmNsb3NlRU9GaWxsU3Ryb2tlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUubj17aWQ6bi5PUFMuZW5kUGF0aCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfSxlLlc9e2lkOm4uT1BTLmNsaXAsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZVsiVyoiXT17aWQ6bi5PUFMuZW9DbGlwLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuQlQ9e2lkOm4uT1BTLmJlZ2luVGV4dCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfSxlLkVUPXtpZDpuLk9QUy5lbmRUZXh0LG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuVGM9e2lkOm4uT1BTLnNldENoYXJTcGFjaW5nLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuVHc9e2lkOm4uT1BTLnNldFdvcmRTcGFjaW5nLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuVHo9e2lkOm4uT1BTLnNldEhTY2FsZSxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfSxlLlRMPXtpZDpuLk9QUy5zZXRMZWFkaW5nLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuVGY9e2lkOm4uT1BTLnNldEZvbnQsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX0sZS5Ucj17aWQ6bi5PUFMuc2V0VGV4dFJlbmRlcmluZ01vZGUsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5Ucz17aWQ6bi5PUFMuc2V0VGV4dFJpc2UsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5UZD17aWQ6bi5PUFMubW92ZVRleHQsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX0sZS5URD17aWQ6bi5PUFMuc2V0TGVhZGluZ01vdmVUZXh0LG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9LGUuVG09e2lkOm4uT1BTLnNldFRleHRNYXRyaXgsbnVtQXJnczo2LHZhcmlhYmxlQXJnczohMX0sZVsiVCoiXT17aWQ6bi5PUFMubmV4dExpbmUsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZS5Uaj17aWQ6bi5PUFMuc2hvd1RleHQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5USj17aWQ6bi5PUFMuc2hvd1NwYWNlZFRleHQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZVsiJyJdPXtpZDpuLk9QUy5uZXh0TGluZVNob3dUZXh0LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGVbJyInXT17aWQ6bi5PUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQsbnVtQXJnczozLHZhcmlhYmxlQXJnczohMX0sZS5kMD17aWQ6bi5PUFMuc2V0Q2hhcldpZHRoLG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9LGUuZDE9e2lkOm4uT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kcyxudW1BcmdzOjYsdmFyaWFibGVBcmdzOiExfSxlLkNTPXtpZDpuLk9QUy5zZXRTdHJva2VDb2xvclNwYWNlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuY3M9e2lkOm4uT1BTLnNldEZpbGxDb2xvclNwYWNlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuU0M9e2lkOm4uT1BTLnNldFN0cm9rZUNvbG9yLG51bUFyZ3M6NCx2YXJpYWJsZUFyZ3M6ITB9LGUuU0NOPXtpZDpuLk9QUy5zZXRTdHJva2VDb2xvck4sbnVtQXJnczozMyx2YXJpYWJsZUFyZ3M6ITB9LGUuc2M9e2lkOm4uT1BTLnNldEZpbGxDb2xvcixudW1BcmdzOjQsdmFyaWFibGVBcmdzOiEwfSxlLnNjbj17aWQ6bi5PUFMuc2V0RmlsbENvbG9yTixudW1BcmdzOjMzLHZhcmlhYmxlQXJnczohMH0sZS5HPXtpZDpuLk9QUy5zZXRTdHJva2VHcmF5LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuZz17aWQ6bi5PUFMuc2V0RmlsbEdyYXksbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5SRz17aWQ6bi5PUFMuc2V0U3Ryb2tlUkdCQ29sb3IsbnVtQXJnczozLHZhcmlhYmxlQXJnczohMX0sZS5yZz17aWQ6bi5PUFMuc2V0RmlsbFJHQkNvbG9yLG51bUFyZ3M6Myx2YXJpYWJsZUFyZ3M6ITF9LGUuSz17aWQ6bi5PUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yLG51bUFyZ3M6NCx2YXJpYWJsZUFyZ3M6ITF9LGUuaz17aWQ6bi5PUFMuc2V0RmlsbENNWUtDb2xvcixudW1BcmdzOjQsdmFyaWFibGVBcmdzOiExfSxlLnNoPXtpZDpuLk9QUy5zaGFkaW5nRmlsbCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfSxlLkJJPXtpZDpuLk9QUy5iZWdpbklubGluZUltYWdlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuSUQ9e2lkOm4uT1BTLmJlZ2luSW1hZ2VEYXRhLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuRUk9e2lkOm4uT1BTLmVuZElubGluZUltYWdlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuRG89e2lkOm4uT1BTLnBhaW50WE9iamVjdCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfSxlLk1QPXtpZDpuLk9QUy5tYXJrUG9pbnQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5EUD17aWQ6bi5PUFMubWFya1BvaW50UHJvcHMsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX0sZS5CTUM9e2lkOm4uT1BTLmJlZ2luTWFya2VkQ29udGVudCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfSxlLkJEQz17aWQ6bi5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX0sZS5FTUM9e2lkOm4uT1BTLmVuZE1hcmtlZENvbnRlbnQsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZS5CWD17aWQ6bi5PUFMuYmVnaW5Db21wYXQsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZS5FWD17aWQ6bi5PUFMuZW5kQ29tcGF0LG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuQk09bnVsbCxlLkJEPW51bGwsZS50cnVlPW51bGwsZS5mYT1udWxsLGUuZmFsPW51bGwsZS5mYWxzPW51bGwsZS5mYWxzZT1udWxsLGUubnU9bnVsbCxlLm51bD1udWxsLGUubnVsbD1udWxsfSkpO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJvcE1hcCIsZSgpKX1jb25zdHJ1Y3RvcihlLHQpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpuZXcgXzt0aGlzLnBhcnNlcj1uZXcgZy5QYXJzZXIoe2xleGVyOm5ldyBnLkxleGVyKGUsJC5vcE1hcCkseHJlZjp0fSksdGhpcy5zdGF0ZU1hbmFnZXI9cix0aGlzLm5vblByb2Nlc3NlZEFyZ3M9W10sdGhpcy5faXNQYXRoT3A9ITEsdGhpcy5fbnVtSW52YWxpZFBhdGhPUFM9MH1nZXQgc2F2ZWRTdGF0ZXNEZXB0aCgpe3JldHVybiB0aGlzLnN0YXRlTWFuYWdlci5zdGF0ZVN0YWNrLmxlbmd0aH1yZWFkKGUpe2xldCB0PWUuYXJncztmb3IoOzspe2NvbnN0IHI9dGhpcy5wYXJzZXIuZ2V0T2JqKCk7aWYociBpbnN0YW5jZW9mIHMuQ21kKXtjb25zdCBhPXIuY21kLGk9JC5vcE1hcFthXTtpZighaSl7KDAsbi53YXJuKSgnVW5rbm93biBjb21tYW5kICInLmNvbmNhdChhLCciLicpKTtjb250aW51ZX1jb25zdCBzPWkuaWQsbz1pLm51bUFyZ3M7bGV0IGM9bnVsbCE9PXQ/dC5sZW5ndGg6MDtpZih0aGlzLl9pc1BhdGhPcHx8KHRoaXMuX251bUludmFsaWRQYXRoT1BTPTApLHRoaXMuX2lzUGF0aE9wPXM+PW4uT1BTLm1vdmVUbyYmczw9bi5PUFMuZW5kUGF0aCxpLnZhcmlhYmxlQXJncyljPm8mJigwLG4uaW5mbykoIkNvbW1hbmQgIi5jb25jYXQoYSwiOiBleHBlY3RlZCBbMCwgIikuY29uY2F0KG8sIl0gYXJncywgYnV0IHJlY2VpdmVkICIpLmNvbmNhdChjLCIgYXJncy4iKSk7ZWxzZXtpZihjIT09byl7Y29uc3QgZT10aGlzLm5vblByb2Nlc3NlZEFyZ3M7Zm9yKDtjPm87KWUucHVzaCh0LnNoaWZ0KCkpLGMtLTtmb3IoO2M8byYmMCE9PWUubGVuZ3RoOyludWxsPT09dCYmKHQ9W10pLHQudW5zaGlmdChlLnBvcCgpKSxjKyt9aWYoYzxvKXtjb25zdCBlPSJjb21tYW5kICIuY29uY2F0KGEsIjogZXhwZWN0ZWQgIikuY29uY2F0KG8sIiBhcmdzLCBidXQgcmVjZWl2ZWQgIikuY29uY2F0KGMsIiBhcmdzLiIpO2lmKHRoaXMuX2lzUGF0aE9wJiYrK3RoaXMuX251bUludmFsaWRQYXRoT1BTPiQuTUFYX0lOVkFMSURfUEFUSF9PUFMpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkludmFsaWQgIi5jb25jYXQoZSkpOygwLG4ud2FybikoIlNraXBwaW5nICIuY29uY2F0KGUpKSxudWxsIT09dCYmKHQubGVuZ3RoPTApO2NvbnRpbnVlfX1yZXR1cm4gdGhpcy5wcmVwcm9jZXNzQ29tbWFuZChzLHQpLGUuZm49cyxlLmFyZ3M9dCwhMH1pZihyPT09cy5FT0YpcmV0dXJuITE7aWYobnVsbCE9PXImJihudWxsPT09dCYmKHQ9W10pLHQucHVzaChyKSx0Lmxlbmd0aD4zMykpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyIpfX1wcmVwcm9jZXNzQ29tbWFuZChlLHQpe3N3aXRjaCgwfGUpe2Nhc2Ugbi5PUFMuc2F2ZTp0aGlzLnN0YXRlTWFuYWdlci5zYXZlKCk7YnJlYWs7Y2FzZSBuLk9QUy5yZXN0b3JlOnRoaXMuc3RhdGVNYW5hZ2VyLnJlc3RvcmUoKTticmVhaztjYXNlIG4uT1BTLnRyYW5zZm9ybTp0aGlzLnN0YXRlTWFuYWdlci50cmFuc2Zvcm0odCl9fX1pKCQsIk1BWF9JTlZBTElEX1BBVEhfT1BTIiwxMCksdC5FdmFsdWF0b3JQcmVwcm9jZXNzb3I9JH0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LklkZW50aXR5Q01hcD10LkNNYXBGYWN0b3J5PXQuQ01hcD12b2lkIDAscigxMzkpLHIoMik7dmFyIG49cigxNDQpLGE9cigxNTApLGk9cigxNTEpLHM9cigxNjUpLG89cigxNjYpLGM9cigxNDkpLGw9cigxNTQpO2NvbnN0IGg9WyJBZG9iZS1HQjEtVUNTMiIsIkFkb2JlLUNOUzEtVUNTMiIsIkFkb2JlLUphcGFuMS1VQ1MyIiwiQWRvYmUtS29yZWExLVVDUzIiLCI3OC1FVUMtSCIsIjc4LUVVQy1WIiwiNzgtSCIsIjc4LVJLU0otSCIsIjc4LVJLU0otViIsIjc4LVYiLCI3OG1zLVJLU0otSCIsIjc4bXMtUktTSi1WIiwiODNwdi1SS1NKLUgiLCI5MG1zLVJLU0otSCIsIjkwbXMtUktTSi1WIiwiOTBtc3AtUktTSi1IIiwiOTBtc3AtUktTSi1WIiwiOTBwdi1SS1NKLUgiLCI5MHB2LVJLU0otViIsIkFkZC1IIiwiQWRkLVJLU0otSCIsIkFkZC1SS1NKLVYiLCJBZGQtViIsIkFkb2JlLUNOUzEtMCIsIkFkb2JlLUNOUzEtMSIsIkFkb2JlLUNOUzEtMiIsIkFkb2JlLUNOUzEtMyIsIkFkb2JlLUNOUzEtNCIsIkFkb2JlLUNOUzEtNSIsIkFkb2JlLUNOUzEtNiIsIkFkb2JlLUdCMS0wIiwiQWRvYmUtR0IxLTEiLCJBZG9iZS1HQjEtMiIsIkFkb2JlLUdCMS0zIiwiQWRvYmUtR0IxLTQiLCJBZG9iZS1HQjEtNSIsIkFkb2JlLUphcGFuMS0wIiwiQWRvYmUtSmFwYW4xLTEiLCJBZG9iZS1KYXBhbjEtMiIsIkFkb2JlLUphcGFuMS0zIiwiQWRvYmUtSmFwYW4xLTQiLCJBZG9iZS1KYXBhbjEtNSIsIkFkb2JlLUphcGFuMS02IiwiQWRvYmUtS29yZWExLTAiLCJBZG9iZS1Lb3JlYTEtMSIsIkFkb2JlLUtvcmVhMS0yIiwiQjUtSCIsIkI1LVYiLCJCNXBjLUgiLCJCNXBjLVYiLCJDTlMtRVVDLUgiLCJDTlMtRVVDLVYiLCJDTlMxLUgiLCJDTlMxLVYiLCJDTlMyLUgiLCJDTlMyLVYiLCJFVEhLLUI1LUgiLCJFVEhLLUI1LVYiLCJFVGVuLUI1LUgiLCJFVGVuLUI1LVYiLCJFVGVubXMtQjUtSCIsIkVUZW5tcy1CNS1WIiwiRVVDLUgiLCJFVUMtViIsIkV4dC1IIiwiRXh0LVJLU0otSCIsIkV4dC1SS1NKLVYiLCJFeHQtViIsIkdCLUVVQy1IIiwiR0ItRVVDLVYiLCJHQi1IIiwiR0ItViIsIkdCSy1FVUMtSCIsIkdCSy1FVUMtViIsIkdCSzJLLUgiLCJHQksySy1WIiwiR0JLcC1FVUMtSCIsIkdCS3AtRVVDLVYiLCJHQlQtRVVDLUgiLCJHQlQtRVVDLVYiLCJHQlQtSCIsIkdCVC1WIiwiR0JUcGMtRVVDLUgiLCJHQlRwYy1FVUMtViIsIkdCcGMtRVVDLUgiLCJHQnBjLUVVQy1WIiwiSCIsIkhLZGxhLUI1LUgiLCJIS2RsYS1CNS1WIiwiSEtkbGItQjUtSCIsIkhLZGxiLUI1LVYiLCJIS2djY3MtQjUtSCIsIkhLZ2Njcy1CNS1WIiwiSEttMzE0LUI1LUgiLCJIS20zMTQtQjUtViIsIkhLbTQ3MS1CNS1IIiwiSEttNDcxLUI1LVYiLCJIS3Njcy1CNS1IIiwiSEtzY3MtQjUtViIsIkhhbmtha3UiLCJIaXJhZ2FuYSIsIktTQy1FVUMtSCIsIktTQy1FVUMtViIsIktTQy1IIiwiS1NDLUpvaGFiLUgiLCJLU0MtSm9oYWItViIsIktTQy1WIiwiS1NDbXMtVUhDLUgiLCJLU0Ntcy1VSEMtSFctSCIsIktTQ21zLVVIQy1IVy1WIiwiS1NDbXMtVUhDLVYiLCJLU0NwYy1FVUMtSCIsIktTQ3BjLUVVQy1WIiwiS2F0YWthbmEiLCJOV1AtSCIsIk5XUC1WIiwiUktTSi1IIiwiUktTSi1WIiwiUm9tYW4iLCJVbmlDTlMtVUNTMi1IIiwiVW5pQ05TLVVDUzItViIsIlVuaUNOUy1VVEYxNi1IIiwiVW5pQ05TLVVURjE2LVYiLCJVbmlDTlMtVVRGMzItSCIsIlVuaUNOUy1VVEYzMi1WIiwiVW5pQ05TLVVURjgtSCIsIlVuaUNOUy1VVEY4LVYiLCJVbmlHQi1VQ1MyLUgiLCJVbmlHQi1VQ1MyLVYiLCJVbmlHQi1VVEYxNi1IIiwiVW5pR0ItVVRGMTYtViIsIlVuaUdCLVVURjMyLUgiLCJVbmlHQi1VVEYzMi1WIiwiVW5pR0ItVVRGOC1IIiwiVW5pR0ItVVRGOC1WIiwiVW5pSklTLVVDUzItSCIsIlVuaUpJUy1VQ1MyLUhXLUgiLCJVbmlKSVMtVUNTMi1IVy1WIiwiVW5pSklTLVVDUzItViIsIlVuaUpJUy1VVEYxNi1IIiwiVW5pSklTLVVURjE2LVYiLCJVbmlKSVMtVVRGMzItSCIsIlVuaUpJUy1VVEYzMi1WIiwiVW5pSklTLVVURjgtSCIsIlVuaUpJUy1VVEY4LVYiLCJVbmlKSVMyMDA0LVVURjE2LUgiLCJVbmlKSVMyMDA0LVVURjE2LVYiLCJVbmlKSVMyMDA0LVVURjMyLUgiLCJVbmlKSVMyMDA0LVVURjMyLVYiLCJVbmlKSVMyMDA0LVVURjgtSCIsIlVuaUpJUzIwMDQtVVRGOC1WIiwiVW5pSklTUHJvLVVDUzItSFctViIsIlVuaUpJU1Byby1VQ1MyLVYiLCJVbmlKSVNQcm8tVVRGOC1WIiwiVW5pSklTWDAyMTMtVVRGMzItSCIsIlVuaUpJU1gwMjEzLVVURjMyLVYiLCJVbmlKSVNYMDIxMzIwMDQtVVRGMzItSCIsIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1WIiwiVW5pS1MtVUNTMi1IIiwiVW5pS1MtVUNTMi1WIiwiVW5pS1MtVVRGMTYtSCIsIlVuaUtTLVVURjE2LVYiLCJVbmlLUy1VVEYzMi1IIiwiVW5pS1MtVVRGMzItViIsIlVuaUtTLVVURjgtSCIsIlVuaUtTLVVURjgtViIsIlYiLCJXUC1TeW1ib2wiXSx1PTIqKjI0LTE7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07dGhpcy5jb2Rlc3BhY2VSYW5nZXM9W1tdLFtdLFtdLFtdXSx0aGlzLm51bUNvZGVzcGFjZVJhbmdlcz0wLHRoaXMuX21hcD1bXSx0aGlzLm5hbWU9IiIsdGhpcy52ZXJ0aWNhbD0hMSx0aGlzLnVzZUNNYXA9bnVsbCx0aGlzLmJ1aWx0SW5DTWFwPWV9YWRkQ29kZXNwYWNlUmFuZ2UoZSx0LHIpe3RoaXMuY29kZXNwYWNlUmFuZ2VzW2UtMV0ucHVzaCh0LHIpLHRoaXMubnVtQ29kZXNwYWNlUmFuZ2VzKyt9bWFwQ2lkUmFuZ2UoZSx0LHIpe2lmKHQtZT51KXRocm93IG5ldyBFcnJvcigibWFwQ2lkUmFuZ2UgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7Zm9yKDtlPD10Oyl0aGlzLl9tYXBbZSsrXT1yKyt9bWFwQmZSYW5nZShlLHQscil7aWYodC1lPnUpdGhyb3cgbmV3IEVycm9yKCJtYXBCZlJhbmdlIC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpO2NvbnN0IG49ci5sZW5ndGgtMTtmb3IoO2U8PXQ7KXt0aGlzLl9tYXBbZSsrXT1yO2NvbnN0IHQ9ci5jaGFyQ29kZUF0KG4pKzE7cj10PjI1NT9yLnN1YnN0cmluZygwLG4tMSkrU3RyaW5nLmZyb21DaGFyQ29kZShyLmNoYXJDb2RlQXQobi0xKSsxKSsiXDAiOnIuc3Vic3RyaW5nKDAsbikrU3RyaW5nLmZyb21DaGFyQ29kZSh0KX19bWFwQmZSYW5nZVRvQXJyYXkoZSx0LHIpe2lmKHQtZT51KXRocm93IG5ldyBFcnJvcigibWFwQmZSYW5nZVRvQXJyYXkgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7Y29uc3Qgbj1yLmxlbmd0aDtsZXQgYT0wO2Zvcig7ZTw9dCYmYTxuOyl0aGlzLl9tYXBbZV09clthKytdLCsrZX1tYXBPbmUoZSx0KXt0aGlzLl9tYXBbZV09dH1sb29rdXAoZSl7cmV0dXJuIHRoaXMuX21hcFtlXX1jb250YWlucyhlKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fbWFwW2VdfWZvckVhY2goZSl7Y29uc3QgdD10aGlzLl9tYXAscj10Lmxlbmd0aDtpZihyPD02NTUzNilmb3IobGV0IG49MDtuPHI7bisrKXZvaWQgMCE9PXRbbl0mJmUobix0W25dKTtlbHNlIGZvcihjb25zdCByIGluIHQpZShyLHRbcl0pfWNoYXJDb2RlT2YoZSl7Y29uc3QgdD10aGlzLl9tYXA7aWYodC5sZW5ndGg8PTY1NTM2KXJldHVybiB0LmluZGV4T2YoZSk7Zm9yKGNvbnN0IHIgaW4gdClpZih0W3JdPT09ZSlyZXR1cm4gMHxyO3JldHVybi0xfWdldE1hcCgpe3JldHVybiB0aGlzLl9tYXB9cmVhZENoYXJDb2RlKGUsdCxyKXtsZXQgbj0wO2NvbnN0IGE9dGhpcy5jb2Rlc3BhY2VSYW5nZXM7Zm9yKGxldCBpPTAscz1hLmxlbmd0aDtpPHM7aSsrKXtuPShuPDw4fGUuY2hhckNvZGVBdCh0K2kpKT4+PjA7Y29uc3Qgcz1hW2ldO2ZvcihsZXQgZT0wLHQ9cy5sZW5ndGg7ZTx0Oyl7Y29uc3QgdD1zW2UrK10sYT1zW2UrK107aWYobj49dCYmbjw9YSlyZXR1cm4gci5jaGFyY29kZT1uLHZvaWQoci5sZW5ndGg9aSsxKX19ci5jaGFyY29kZT0wLHIubGVuZ3RoPTF9Z2V0Q2hhckNvZGVMZW5ndGgoZSl7Y29uc3QgdD10aGlzLmNvZGVzcGFjZVJhbmdlcztmb3IobGV0IHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspe2NvbnN0IG49dFtyXTtmb3IobGV0IHQ9MCxhPW4ubGVuZ3RoO3Q8YTspe2NvbnN0IGE9blt0KytdLGk9blt0KytdO2lmKGU+PWEmJmU8PWkpcmV0dXJuIHIrMX19cmV0dXJuIDF9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLl9tYXAubGVuZ3RofWdldCBpc0lkZW50aXR5Q01hcCgpe2lmKCJJZGVudGl0eS1IIiE9PXRoaXMubmFtZSYmIklkZW50aXR5LVYiIT09dGhpcy5uYW1lKXJldHVybiExO2lmKDY1NTM2IT09dGhpcy5fbWFwLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IGU9MDtlPDY1NTM2O2UrKylpZih0aGlzLl9tYXBbZV0hPT1lKXJldHVybiExO3JldHVybiEwfX10LkNNYXA9ZDtjbGFzcyBmIGV4dGVuZHMgZHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKCksdGhpcy52ZXJ0aWNhbD1lLHRoaXMuYWRkQ29kZXNwYWNlUmFuZ2UodCwwLDY1NTM1KX1tYXBDaWRSYW5nZShlLHQscil7KDAsbi51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgY2FsbCBtYXBDaWRSYW5nZSIpfW1hcEJmUmFuZ2UoZSx0LHIpeygwLG4udW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZSIpfW1hcEJmUmFuZ2VUb0FycmF5KGUsdCxyKXsoMCxuLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIG1hcEJmUmFuZ2VUb0FycmF5Iil9bWFwT25lKGUsdCl7KDAsbi51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgY2FsbCBtYXBDaWRPbmUiKX1sb29rdXAoZSl7cmV0dXJuIE51bWJlci5pc0ludGVnZXIoZSkmJmU8PTY1NTM1P2U6dm9pZCAwfWNvbnRhaW5zKGUpe3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPD02NTUzNX1mb3JFYWNoKGUpe2ZvcihsZXQgdD0wO3Q8PTY1NTM1O3QrKyllKHQsdCl9Y2hhckNvZGVPZihlKXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihlKSYmZTw9NjU1MzU/ZTotMX1nZXRNYXAoKXtjb25zdCBlPW5ldyBBcnJheSg2NTUzNik7Zm9yKGxldCB0PTA7dDw9NjU1MzU7dCsrKWVbdF09dDtyZXR1cm4gZX1nZXQgbGVuZ3RoKCl7cmV0dXJuIDY1NTM2fWdldCBpc0lkZW50aXR5Q01hcCgpeygwLG4udW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGFjY2VzcyAuaXNJZGVudGl0eUNNYXAiKX19ZnVuY3Rpb24gZyhlKXtsZXQgdD0wO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKXQ9dDw8OHxlLmNoYXJDb2RlQXQocik7cmV0dXJuIHQ+Pj4wfWZ1bmN0aW9uIHAoZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJNYWxmb3JtZWQgQ01hcDogZXhwZWN0ZWQgc3RyaW5nLiIpfWZ1bmN0aW9uIG0oZSl7aWYoIU51bWJlci5pc0ludGVnZXIoZSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBpbnQuIil9ZnVuY3Rpb24gYihlLHQpe2Zvcig7Oyl7bGV0IHI9dC5nZXRPYmooKTtpZihyPT09YS5FT0YpYnJlYWs7aWYoKDAsYS5pc0NtZCkociwiZW5kYmZjaGFyIikpcmV0dXJuO3Aocik7Y29uc3Qgbj1nKHIpO3I9dC5nZXRPYmooKSxwKHIpO2NvbnN0IGk9cjtlLm1hcE9uZShuLGkpfX1mdW5jdGlvbiB5KGUsdCl7Zm9yKDs7KXtsZXQgcj10LmdldE9iaigpO2lmKHI9PT1hLkVPRilicmVhaztpZigoMCxhLmlzQ21kKShyLCJlbmRiZnJhbmdlIikpcmV0dXJuO3Aocik7Y29uc3Qgbj1nKHIpO3I9dC5nZXRPYmooKSxwKHIpO2NvbnN0IGk9ZyhyKTtpZihyPXQuZ2V0T2JqKCksTnVtYmVyLmlzSW50ZWdlcihyKXx8InN0cmluZyI9PXR5cGVvZiByKXtjb25zdCB0PU51bWJlci5pc0ludGVnZXIocik/U3RyaW5nLmZyb21DaGFyQ29kZShyKTpyO2UubWFwQmZSYW5nZShuLGksdCl9ZWxzZXtpZighKDAsYS5pc0NtZCkociwiWyIpKWJyZWFrO3tyPXQuZ2V0T2JqKCk7Y29uc3Qgcz1bXTtmb3IoOyEoMCxhLmlzQ21kKShyLCJdIikmJnIhPT1hLkVPRjspcy5wdXNoKHIpLHI9dC5nZXRPYmooKTtlLm1hcEJmUmFuZ2VUb0FycmF5KG4saSxzKX19fXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIGJmIHJhbmdlLiIpfWZ1bmN0aW9uIHcoZSx0KXtmb3IoOzspe2xldCByPXQuZ2V0T2JqKCk7aWYocj09PWEuRU9GKWJyZWFrO2lmKCgwLGEuaXNDbWQpKHIsImVuZGNpZGNoYXIiKSlyZXR1cm47cChyKTtjb25zdCBuPWcocik7cj10LmdldE9iaigpLG0ocik7Y29uc3QgaT1yO2UubWFwT25lKG4saSl9fWZ1bmN0aW9uIHYoZSx0KXtmb3IoOzspe2xldCByPXQuZ2V0T2JqKCk7aWYocj09PWEuRU9GKWJyZWFrO2lmKCgwLGEuaXNDbWQpKHIsImVuZGNpZHJhbmdlIikpcmV0dXJuO3Aocik7Y29uc3Qgbj1nKHIpO3I9dC5nZXRPYmooKSxwKHIpO2NvbnN0IGk9ZyhyKTtyPXQuZ2V0T2JqKCksbShyKTtjb25zdCBzPXI7ZS5tYXBDaWRSYW5nZShuLGkscyl9fWZ1bmN0aW9uIHgoZSx0KXtmb3IoOzspe2xldCByPXQuZ2V0T2JqKCk7aWYocj09PWEuRU9GKWJyZWFrO2lmKCgwLGEuaXNDbWQpKHIsImVuZGNvZGVzcGFjZXJhbmdlIikpcmV0dXJuO2lmKCJzdHJpbmciIT10eXBlb2YgcilicmVhaztjb25zdCBuPWcocik7aWYocj10LmdldE9iaigpLCJzdHJpbmciIT10eXBlb2YgcilicmVhaztjb25zdCBpPWcocik7ZS5hZGRDb2Rlc3BhY2VSYW5nZShyLmxlbmd0aCxuLGkpfXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIGNvZGVzcGFjZSByYW5nZS4iKX1mdW5jdGlvbiBTKGUsdCl7Y29uc3Qgcj10LmdldE9iaigpO051bWJlci5pc0ludGVnZXIocikmJihlLnZlcnRpY2FsPSEhcil9ZnVuY3Rpb24gQShlLHQpe2NvbnN0IHI9dC5nZXRPYmooKTtyIGluc3RhbmNlb2YgYS5OYW1lJiYoZS5uYW1lPXIubmFtZSl9YXN5bmMgZnVuY3Rpb24gayhlLHQscixpKXtsZXQgcyxvO2U6Zm9yKDs7KXRyeXtjb25zdCByPXQuZ2V0T2JqKCk7aWYocj09PWEuRU9GKWJyZWFrO2lmKHIgaW5zdGFuY2VvZiBhLk5hbWUpIldNb2RlIj09PXIubmFtZT9TKGUsdCk6IkNNYXBOYW1lIj09PXIubmFtZSYmQShlLHQpLHM9cjtlbHNlIGlmKHIgaW5zdGFuY2VvZiBhLkNtZClzd2l0Y2goci5jbWQpe2Nhc2UiZW5kY21hcCI6YnJlYWsgZTtjYXNlInVzZWNtYXAiOnMgaW5zdGFuY2VvZiBhLk5hbWUmJihvPXMubmFtZSk7YnJlYWs7Y2FzZSJiZWdpbmNvZGVzcGFjZXJhbmdlIjp4KGUsdCk7YnJlYWs7Y2FzZSJiZWdpbmJmY2hhciI6YihlLHQpO2JyZWFrO2Nhc2UiYmVnaW5jaWRjaGFyIjp3KGUsdCk7YnJlYWs7Y2FzZSJiZWdpbmJmcmFuZ2UiOnkoZSx0KTticmVhaztjYXNlImJlZ2luY2lkcmFuZ2UiOnYoZSx0KX19Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxuLndhcm4pKCJJbnZhbGlkIGNNYXAgZGF0YTogIitlKTtjb250aW51ZX1yZXR1cm4haSYmbyYmKGk9byksaT9DKGUscixpKTplfWFzeW5jIGZ1bmN0aW9uIEMoZSx0LHIpe2lmKGUudXNlQ01hcD1hd2FpdCBPKHIsdCksMD09PWUubnVtQ29kZXNwYWNlUmFuZ2VzKXtjb25zdCB0PWUudXNlQ01hcC5jb2Rlc3BhY2VSYW5nZXM7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZS5jb2Rlc3BhY2VSYW5nZXNbcl09dFtyXS5zbGljZSgpO2UubnVtQ29kZXNwYWNlUmFuZ2VzPWUudXNlQ01hcC5udW1Db2Rlc3BhY2VSYW5nZXN9cmV0dXJuIGUudXNlQ01hcC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2UuY29udGFpbnModCl8fGUubWFwT25lKHQsZS51c2VDTWFwLmxvb2t1cCh0KSl9KSksZX1hc3luYyBmdW5jdGlvbiBPKGUsdCl7aWYoIklkZW50aXR5LUgiPT09ZSlyZXR1cm4gbmV3IGYoITEsMik7aWYoIklkZW50aXR5LVYiPT09ZSlyZXR1cm4gbmV3IGYoITAsMik7aWYoIWguaW5jbHVkZXMoZSkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIENNYXAgbmFtZTogIitlKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoIkJ1aWx0LWluIENNYXAgcGFyYW1ldGVycyBhcmUgbm90IHByb3ZpZGVkLiIpO2NvbnN0e2NNYXBEYXRhOnIsY29tcHJlc3Npb25UeXBlOmF9PWF3YWl0IHQoZSksaT1uZXcgZCghMCk7aWYoYT09PW4uQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUlkpcmV0dXJuKG5ldyBzLkJpbmFyeUNNYXBSZWFkZXIpLnByb2Nlc3MocixpLChlPT5DKGksdCxlKSkpO2lmKGE9PT1uLkNNYXBDb21wcmVzc2lvblR5cGUuTk9ORSl7Y29uc3QgZT1uZXcgby5MZXhlcihuZXcgbC5TdHJlYW0ocikpO3JldHVybiBrKGksZSx0LG51bGwpfXRocm93IG5ldyBFcnJvcignSW52YWxpZCBDTWFwICJjb21wcmVzc2lvblR5cGUiIHZhbHVlOiAnLmNvbmNhdChhKSl9dC5JZGVudGl0eUNNYXA9Zix0LkNNYXBGYWN0b3J5PWNsYXNze3N0YXRpYyBhc3luYyBjcmVhdGUoZSl7bGV0e2VuY29kaW5nOnQsZmV0Y2hCdWlsdEluQ01hcDpyLHVzZUNNYXA6bn09ZTtpZih0IGluc3RhbmNlb2YgYS5OYW1lKXJldHVybiBPKHQubmFtZSxyKTtpZih0IGluc3RhbmNlb2YgaS5CYXNlU3RyZWFtKXtjb25zdCBlPWF3YWl0IGsobmV3IGQsbmV3IG8uTGV4ZXIodCkscixuKTtyZXR1cm4gZS5pc0lkZW50aXR5Q01hcD9PKGUubmFtZSxyKTplfXRocm93IG5ldyBFcnJvcigiRW5jb2RpbmcgcmVxdWlyZWQuIil9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkJpbmFyeUNNYXBSZWFkZXI9dm9pZCAwLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDIpO3ZhciBuPXIoMTQ0KTtmdW5jdGlvbiBhKGUsdCl7bGV0IHI9MDtmb3IobGV0IG49MDtuPD10O24rKylyPXI8PDh8ZVtuXTtyZXR1cm4gcj4+PjB9ZnVuY3Rpb24gaShlLHQpe3JldHVybiAxPT09dD9TdHJpbmcuZnJvbUNoYXJDb2RlKGVbMF0sZVsxXSk6Mz09PXQ/U3RyaW5nLmZyb21DaGFyQ29kZShlWzBdLGVbMV0sZVsyXSxlWzNdKTpTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmUuc3ViYXJyYXkoMCx0KzEpKX1mdW5jdGlvbiBzKGUsdCxyKXtsZXQgbj0wO2ZvcihsZXQgYT1yO2E+PTA7YS0tKW4rPWVbYV0rdFthXSxlW2FdPTI1NSZuLG4+Pj04fWZ1bmN0aW9uIG8oZSx0KXtsZXQgcj0xO2ZvcihsZXQgbj10O24+PTAmJnI+MDtuLS0pcis9ZVtuXSxlW25dPTI1NSZyLHI+Pj04fWNvbnN0IGM9MTY7Y2xhc3MgbHtjb25zdHJ1Y3RvcihlKXt0aGlzLmJ1ZmZlcj1lLHRoaXMucG9zPTAsdGhpcy5lbmQ9ZS5sZW5ndGgsdGhpcy50bXBCdWY9bmV3IFVpbnQ4QXJyYXkoMTkpfXJlYWRCeXRlKCl7cmV0dXJuIHRoaXMucG9zPj10aGlzLmVuZD8tMTp0aGlzLmJ1ZmZlclt0aGlzLnBvcysrXX1yZWFkTnVtYmVyKCl7bGV0IGUsdD0wO2Rve2NvbnN0IHI9dGhpcy5yZWFkQnl0ZSgpO2lmKHI8MCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTtlPSEoMTI4JnIpLHQ9dDw8N3wxMjcmcn13aGlsZSghZSk7cmV0dXJuIHR9cmVhZFNpZ25lZCgpe2NvbnN0IGU9dGhpcy5yZWFkTnVtYmVyKCk7cmV0dXJuIDEmZT9+KGU+Pj4xKTplPj4+MX1yZWFkSGV4KGUsdCl7ZS5zZXQodGhpcy5idWZmZXIuc3ViYXJyYXkodGhpcy5wb3MsdGhpcy5wb3MrdCsxKSksdGhpcy5wb3MrPXQrMX1yZWFkSGV4TnVtYmVyKGUsdCl7bGV0IHI7Y29uc3QgYT10aGlzLnRtcEJ1ZjtsZXQgaT0wO2Rve2NvbnN0IGU9dGhpcy5yZWFkQnl0ZSgpO2lmKGU8MCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTtyPSEoMTI4JmUpLGFbaSsrXT0xMjcmZX13aGlsZSghcik7bGV0IHM9dCxvPTAsYz0wO2Zvcig7cz49MDspe2Zvcig7Yzw4JiZhLmxlbmd0aD4wOylvfD1hWy0taV08PGMsYys9NztlW3NdPTI1NSZvLHMtLSxvPj49OCxjLT04fX1yZWFkSGV4U2lnbmVkKGUsdCl7dGhpcy5yZWFkSGV4TnVtYmVyKGUsdCk7Y29uc3Qgcj0xJmVbdF0/MjU1OjA7bGV0IG49MDtmb3IobGV0IGE9MDthPD10O2ErKyluPSgxJm4pPDw4fGVbYV0sZVthXT1uPj4xXnJ9cmVhZFN0cmluZygpe2NvbnN0IGU9dGhpcy5yZWFkTnVtYmVyKCksdD1uZXcgQXJyYXkoZSk7Zm9yKGxldCByPTA7cjxlO3IrKyl0W3JdPXRoaXMucmVhZE51bWJlcigpO3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLnQpfX10LkJpbmFyeUNNYXBSZWFkZXI9Y2xhc3N7YXN5bmMgcHJvY2VzcyhlLHQscil7Y29uc3Qgbj1uZXcgbChlKSxoPW4ucmVhZEJ5dGUoKTt0LnZlcnRpY2FsPSEhKDEmaCk7bGV0IHU9bnVsbDtjb25zdCBkPW5ldyBVaW50OEFycmF5KGMpLGY9bmV3IFVpbnQ4QXJyYXkoYyksZz1uZXcgVWludDhBcnJheShjKSxwPW5ldyBVaW50OEFycmF5KGMpLG09bmV3IFVpbnQ4QXJyYXkoYyk7bGV0IGIseTtmb3IoOyh5PW4ucmVhZEJ5dGUoKSk+PTA7KXtjb25zdCBlPXk+PjU7aWYoNz09PWUpe3N3aXRjaCgzMSZ5KXtjYXNlIDA6bi5yZWFkU3RyaW5nKCk7YnJlYWs7Y2FzZSAxOnU9bi5yZWFkU3RyaW5nKCl9Y29udGludWV9Y29uc3Qgcj0hISgxNiZ5KSxsPTE1Jnk7aWYobCsxPmMpdGhyb3cgbmV3IEVycm9yKCJCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3M6IEludmFsaWQgZGF0YVNpemUuIik7Y29uc3QgaD0xLHc9bi5yZWFkTnVtYmVyKCk7c3dpdGNoKGUpe2Nhc2UgMDpuLnJlYWRIZXgoZCxsKSxuLnJlYWRIZXhOdW1iZXIoZixsKSxzKGYsZCxsKSx0LmFkZENvZGVzcGFjZVJhbmdlKGwrMSxhKGQsbCksYShmLGwpKTtmb3IobGV0IGU9MTtlPHc7ZSsrKW8oZixsKSxuLnJlYWRIZXhOdW1iZXIoZCxsKSxzKGQsZixsKSxuLnJlYWRIZXhOdW1iZXIoZixsKSxzKGYsZCxsKSx0LmFkZENvZGVzcGFjZVJhbmdlKGwrMSxhKGQsbCksYShmLGwpKTticmVhaztjYXNlIDE6bi5yZWFkSGV4KGQsbCksbi5yZWFkSGV4TnVtYmVyKGYsbCkscyhmLGQsbCksbi5yZWFkTnVtYmVyKCk7Zm9yKGxldCBlPTE7ZTx3O2UrKylvKGYsbCksbi5yZWFkSGV4TnVtYmVyKGQsbCkscyhkLGYsbCksbi5yZWFkSGV4TnVtYmVyKGYsbCkscyhmLGQsbCksbi5yZWFkTnVtYmVyKCk7YnJlYWs7Y2FzZSAyOm4ucmVhZEhleChnLGwpLGI9bi5yZWFkTnVtYmVyKCksdC5tYXBPbmUoYShnLGwpLGIpO2ZvcihsZXQgZT0xO2U8dztlKyspbyhnLGwpLHJ8fChuLnJlYWRIZXhOdW1iZXIobSxsKSxzKGcsbSxsKSksYj1uLnJlYWRTaWduZWQoKSsoYisxKSx0Lm1hcE9uZShhKGcsbCksYik7YnJlYWs7Y2FzZSAzOm4ucmVhZEhleChkLGwpLG4ucmVhZEhleE51bWJlcihmLGwpLHMoZixkLGwpLGI9bi5yZWFkTnVtYmVyKCksdC5tYXBDaWRSYW5nZShhKGQsbCksYShmLGwpLGIpO2ZvcihsZXQgZT0xO2U8dztlKyspbyhmLGwpLHI/ZC5zZXQoZik6KG4ucmVhZEhleE51bWJlcihkLGwpLHMoZCxmLGwpKSxuLnJlYWRIZXhOdW1iZXIoZixsKSxzKGYsZCxsKSxiPW4ucmVhZE51bWJlcigpLHQubWFwQ2lkUmFuZ2UoYShkLGwpLGEoZixsKSxiKTticmVhaztjYXNlIDQ6bi5yZWFkSGV4KGcsaCksbi5yZWFkSGV4KHAsbCksdC5tYXBPbmUoYShnLGgpLGkocCxsKSk7Zm9yKGxldCBlPTE7ZTx3O2UrKylvKGcsaCkscnx8KG4ucmVhZEhleE51bWJlcihtLGgpLHMoZyxtLGgpKSxvKHAsbCksbi5yZWFkSGV4U2lnbmVkKG0sbCkscyhwLG0sbCksdC5tYXBPbmUoYShnLGgpLGkocCxsKSk7YnJlYWs7Y2FzZSA1Om4ucmVhZEhleChkLGgpLG4ucmVhZEhleE51bWJlcihmLGgpLHMoZixkLGgpLG4ucmVhZEhleChwLGwpLHQubWFwQmZSYW5nZShhKGQsaCksYShmLGgpLGkocCxsKSk7Zm9yKGxldCBlPTE7ZTx3O2UrKylvKGYsaCkscj9kLnNldChmKToobi5yZWFkSGV4TnVtYmVyKGQsaCkscyhkLGYsaCkpLG4ucmVhZEhleE51bWJlcihmLGgpLHMoZixkLGgpLG4ucmVhZEhleChwLGwpLHQubWFwQmZSYW5nZShhKGQsaCksYShmLGgpLGkocCxsKSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkJpbmFyeUNNYXBSZWFkZXIucHJvY2VzcyAtIHVua25vd24gdHlwZTogIi5jb25jYXQoZSkpfX1yZXR1cm4gdT9yKHUpOnR9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlBhcnNlcj10LkxpbmVhcml6YXRpb249dC5MZXhlcj12b2lkIDAscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDIpO3ZhciBuPXIoMTQ0KSxhPXIoMTUwKSxpPXIoMTQ5KSxzPXIoMTU0KSxvPXIoMTY3KSxjPXIoMTY5KSxsPXIoMTcwKSxoPXIoMTcyKSx1PXIoMTczKSxkPXIoMTc2KSxmPXIoMTc5KSxnPXIoMTgxKSxwPXIoMTgyKSxtPXIoMTgzKTtjbGFzcyBie2NvbnN0cnVjdG9yKGUpe2xldHtsZXhlcjp0LHhyZWY6cixhbGxvd1N0cmVhbXM6bj0hMSxyZWNvdmVyeU1vZGU6YT0hMX09ZTt0aGlzLmxleGVyPXQsdGhpcy54cmVmPXIsdGhpcy5hbGxvd1N0cmVhbXM9bix0aGlzLnJlY292ZXJ5TW9kZT1hLHRoaXMuaW1hZ2VDYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2ltYWdlSWQ9MCx0aGlzLnJlZmlsbCgpfXJlZmlsbCgpe3RoaXMuYnVmMT10aGlzLmxleGVyLmdldE9iaigpLHRoaXMuYnVmMj10aGlzLmxleGVyLmdldE9iaigpfXNoaWZ0KCl7dGhpcy5idWYyIGluc3RhbmNlb2YgYS5DbWQmJiJJRCI9PT10aGlzLmJ1ZjIuY21kPyh0aGlzLmJ1ZjE9dGhpcy5idWYyLHRoaXMuYnVmMj1udWxsKToodGhpcy5idWYxPXRoaXMuYnVmMix0aGlzLmJ1ZjI9dGhpcy5sZXhlci5nZXRPYmooKSl9dHJ5U2hpZnQoKXt0cnl7cmV0dXJuIHRoaXMuc2hpZnQoKSwhMH1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgaS5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlO3JldHVybiExfX1nZXRPYmooKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDtjb25zdCB0PXRoaXMuYnVmMTtpZih0aGlzLnNoaWZ0KCksdCBpbnN0YW5jZW9mIGEuQ21kKXN3aXRjaCh0LmNtZCl7Y2FzZSJCSSI6cmV0dXJuIHRoaXMubWFrZUlubGluZUltYWdlKGUpO2Nhc2UiWyI6Y29uc3Qgcj1bXTtmb3IoOyEoMCxhLmlzQ21kKSh0aGlzLmJ1ZjEsIl0iKSYmdGhpcy5idWYxIT09YS5FT0Y7KXIucHVzaCh0aGlzLmdldE9iaihlKSk7aWYodGhpcy5idWYxPT09YS5FT0Ype2lmKHRoaXMucmVjb3ZlcnlNb2RlKXJldHVybiByO3Rocm93IG5ldyBpLlBhcnNlckVPRkV4Y2VwdGlvbigiRW5kIG9mIGZpbGUgaW5zaWRlIGFycmF5LiIpfXJldHVybiB0aGlzLnNoaWZ0KCkscjtjYXNlIjw8Ijpjb25zdCBzPW5ldyBhLkRpY3QodGhpcy54cmVmKTtmb3IoOyEoMCxhLmlzQ21kKSh0aGlzLmJ1ZjEsIj4+IikmJnRoaXMuYnVmMSE9PWEuRU9GOyl7aWYoISh0aGlzLmJ1ZjEgaW5zdGFuY2VvZiBhLk5hbWUpKXsoMCxuLmluZm8pKCJNYWxmb3JtZWQgZGljdGlvbmFyeToga2V5IG11c3QgYmUgYSBuYW1lIG9iamVjdCIpLHRoaXMuc2hpZnQoKTtjb250aW51ZX1jb25zdCB0PXRoaXMuYnVmMS5uYW1lO2lmKHRoaXMuc2hpZnQoKSx0aGlzLmJ1ZjE9PT1hLkVPRilicmVhaztzLnNldCh0LHRoaXMuZ2V0T2JqKGUpKX1pZih0aGlzLmJ1ZjE9PT1hLkVPRil7aWYodGhpcy5yZWNvdmVyeU1vZGUpcmV0dXJuIHM7dGhyb3cgbmV3IGkuUGFyc2VyRU9GRXhjZXB0aW9uKCJFbmQgb2YgZmlsZSBpbnNpZGUgZGljdGlvbmFyeS4iKX1yZXR1cm4oMCxhLmlzQ21kKSh0aGlzLmJ1ZjIsInN0cmVhbSIpP3RoaXMuYWxsb3dTdHJlYW1zP3RoaXMubWFrZVN0cmVhbShzLGUpOnM6KHRoaXMuc2hpZnQoKSxzKTtkZWZhdWx0OnJldHVybiB0fWlmKE51bWJlci5pc0ludGVnZXIodCkpe2lmKE51bWJlci5pc0ludGVnZXIodGhpcy5idWYxKSYmKDAsYS5pc0NtZCkodGhpcy5idWYyLCJSIikpe2NvbnN0IGU9YS5SZWYuZ2V0KHQsdGhpcy5idWYxKTtyZXR1cm4gdGhpcy5zaGlmdCgpLHRoaXMuc2hpZnQoKSxlfXJldHVybiB0fXJldHVybiJzdHJpbmciPT10eXBlb2YgdCYmZT9lLmRlY3J5cHRTdHJpbmcodCk6dH1maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChlKXtjb25zdHtrbm93bkNvbW1hbmRzOnR9PXRoaXMubGV4ZXIscj1lLnBvcztsZXQgbyxjLGw9MDtmb3IoOy0xIT09KG89ZS5nZXRCeXRlKCkpOylpZigwPT09bClsPTY5PT09bz8xOjA7ZWxzZSBpZigxPT09bClsPTczPT09bz8yOjA7ZWxzZSBpZigzMj09PW98fDEwPT09b3x8MTM9PT1vKXtjPWUucG9zO2NvbnN0IHI9ZS5wZWVrQnl0ZXMoMTUpLGk9ci5sZW5ndGg7aWYoMD09PWkpYnJlYWs7Zm9yKGxldCBlPTA7ZTxpO2UrKylpZihvPXJbZV0sKDAhPT1vfHwwPT09cltlKzFdKSYmMTAhPT1vJiYxMyE9PW8mJihvPDMyfHxvPjEyNykpe2w9MDticmVha31pZigyIT09bCljb250aW51ZTtpZighdCl7KDAsbi53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQgLSBgbGV4ZXIua25vd25Db21tYW5kc2AgaXMgdW5kZWZpbmVkLiIpO2NvbnRpbnVlfWNvbnN0IGg9bmV3IHYobmV3IHMuU3RyZWFtKHIuc2xpY2UoKSksdCk7aC5faGV4U3RyaW5nV2Fybj0oKT0+e307bGV0IHU9MDtmb3IoOzspe2NvbnN0IGU9aC5nZXRPYmooKTtpZihlPT09YS5FT0Ype2w9MDticmVha31pZihlIGluc3RhbmNlb2YgYS5DbWQpe2NvbnN0IHI9dFtlLmNtZF07aWYoIXIpe2w9MDticmVha31pZihyLnZhcmlhYmxlQXJncz91PD1yLm51bUFyZ3M6dT09PXIubnVtQXJncylicmVhazt1PTB9ZWxzZSB1Kyt9aWYoMj09PWwpYnJlYWt9ZWxzZSBsPTA7LTE9PT1vJiYoKDAsbi53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQ6IFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhvdXQgZmluZGluZyBhIHZhbGlkIEVJIG1hcmtlciIpLGMmJigoMCxuLndhcm4pKCcuLi4gdHJ5aW5nIHRvIHJlY292ZXIgYnkgdXNpbmcgdGhlIGxhc3QgIkVJIiBvY2N1cnJlbmNlLicpLGUuc2tpcCgtKGUucG9zLWMpKSkpO2xldCBoPTQ7cmV0dXJuIGUuc2tpcCgtaCksbz1lLnBlZWtCeXRlKCksZS5za2lwKGgpLCgwLGkuaXNXaGl0ZVNwYWNlKShvKXx8aC0tLGUucG9zLWgtcn1maW5kRENURGVjb2RlSW5saW5lU3RyZWFtRW5kKGUpe2NvbnN0IHQ9ZS5wb3M7bGV0IHIsYSxpPSExO2Zvcig7LTEhPT0ocj1lLmdldEJ5dGUoKSk7KWlmKDI1NT09PXIpe3N3aXRjaChlLmdldEJ5dGUoKSl7Y2FzZSAwOmJyZWFrO2Nhc2UgMjU1OmUuc2tpcCgtMSk7YnJlYWs7Y2FzZSAyMTc6aT0hMDticmVhaztjYXNlIDE5MjpjYXNlIDE5MzpjYXNlIDE5NDpjYXNlIDE5NTpjYXNlIDE5NzpjYXNlIDE5ODpjYXNlIDE5OTpjYXNlIDIwMTpjYXNlIDIwMjpjYXNlIDIwMzpjYXNlIDIwNTpjYXNlIDIwNjpjYXNlIDIwNzpjYXNlIDE5NjpjYXNlIDIwNDpjYXNlIDIxODpjYXNlIDIxOTpjYXNlIDIyMDpjYXNlIDIyMTpjYXNlIDIyMjpjYXNlIDIyMzpjYXNlIDIyNDpjYXNlIDIyNTpjYXNlIDIyNjpjYXNlIDIyNzpjYXNlIDIyODpjYXNlIDIyOTpjYXNlIDIzMDpjYXNlIDIzMTpjYXNlIDIzMjpjYXNlIDIzMzpjYXNlIDIzNDpjYXNlIDIzNTpjYXNlIDIzNjpjYXNlIDIzNzpjYXNlIDIzODpjYXNlIDIzOTpjYXNlIDI1NDphPWUuZ2V0VWludDE2KCksYT4yP2Uuc2tpcChhLTIpOmUuc2tpcCgtMil9aWYoaSlicmVha31jb25zdCBzPWUucG9zLXQ7cmV0dXJuLTE9PT1yPygoMCxuLndhcm4pKCJJbmxpbmUgRENURGVjb2RlIGltYWdlIHN0cmVhbTogRU9JIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpLGUuc2tpcCgtcyksdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChlKSk6KHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKGUpLHMpfWZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kKGUpe2NvbnN0IHQ9ZS5wb3M7bGV0IHI7Zm9yKDstMSE9PShyPWUuZ2V0Qnl0ZSgpKTspaWYoMTI2PT09cil7Y29uc3QgdD1lLnBvcztmb3Iocj1lLnBlZWtCeXRlKCk7KDAsaS5pc1doaXRlU3BhY2UpKHIpOyllLnNraXAoKSxyPWUucGVla0J5dGUoKTtpZig2Mj09PXIpe2Uuc2tpcCgpO2JyZWFrfWlmKGUucG9zPnQpe2NvbnN0IHQ9ZS5wZWVrQnl0ZXMoMik7aWYoNjk9PT10WzBdJiY3Mz09PXRbMV0pYnJlYWt9fWNvbnN0IGE9ZS5wb3MtdDtyZXR1cm4tMT09PXI/KCgwLG4ud2FybikoIklubGluZSBBU0NJSTg1RGVjb2RlIGltYWdlIHN0cmVhbTogRU9EIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpLGUuc2tpcCgtYSksdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChlKSk6KHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKGUpLGEpfWZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChlKXtjb25zdCB0PWUucG9zO2xldCByO2Zvcig7LTEhPT0ocj1lLmdldEJ5dGUoKSkmJjYyIT09cjspO2NvbnN0IGE9ZS5wb3MtdDtyZXR1cm4tMT09PXI/KCgwLG4ud2FybikoIklubGluZSBBU0NJSUhleERlY29kZSBpbWFnZSBzdHJlYW06IEVPRCBtYXJrZXIgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIC9FSS8gaW5zdGVhZC4iKSxlLnNraXAoLWEpLHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoZSkpOih0aGlzLmlubGluZVN0cmVhbVNraXBFSShlKSxhKX1pbmxpbmVTdHJlYW1Ta2lwRUkoZSl7bGV0IHQscj0wO2Zvcig7LTEhPT0odD1lLmdldEJ5dGUoKSk7KWlmKDA9PT1yKXI9Njk9PT10PzE6MDtlbHNlIGlmKDE9PT1yKXI9NzM9PT10PzI6MDtlbHNlIGlmKDI9PT1yKWJyZWFrfW1ha2VJbmxpbmVJbWFnZShlKXtjb25zdCB0PXRoaXMubGV4ZXIscj10LnN0cmVhbSxpPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IHM7Zm9yKDshKDAsYS5pc0NtZCkodGhpcy5idWYxLCJJRCIpJiZ0aGlzLmJ1ZjEhPT1hLkVPRjspe2lmKCEodGhpcy5idWYxIGluc3RhbmNlb2YgYS5OYW1lKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiRGljdGlvbmFyeSBrZXkgbXVzdCBiZSBhIG5hbWUgb2JqZWN0Iik7Y29uc3QgdD10aGlzLmJ1ZjEubmFtZTtpZih0aGlzLnNoaWZ0KCksdGhpcy5idWYxPT09YS5FT0YpYnJlYWs7aVt0XT10aGlzLmdldE9iaihlKX0tMSE9PXQuYmVnaW5JbmxpbmVJbWFnZVBvcyYmKHM9ci5wb3MtdC5iZWdpbklubGluZUltYWdlUG9zKTtjb25zdCBvPXRoaXMueHJlZi5mZXRjaElmUmVmKGkuRnx8aS5GaWx0ZXIpO2xldCBjO2lmKG8gaW5zdGFuY2VvZiBhLk5hbWUpYz1vLm5hbWU7ZWxzZSBpZihBcnJheS5pc0FycmF5KG8pKXtjb25zdCBlPXRoaXMueHJlZi5mZXRjaElmUmVmKG9bMF0pO2UgaW5zdGFuY2VvZiBhLk5hbWUmJihjPWUubmFtZSl9Y29uc3QgbD1yLnBvcztsZXQgaCx1O3N3aXRjaChjKXtjYXNlIkRDVCI6Y2FzZSJEQ1REZWNvZGUiOmg9dGhpcy5maW5kRENURGVjb2RlSW5saW5lU3RyZWFtRW5kKHIpO2JyZWFrO2Nhc2UiQTg1IjpjYXNlIkFTQ0lJODVEZWNvZGUiOmg9dGhpcy5maW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChyKTticmVhaztjYXNlIkFIeCI6Y2FzZSJBU0NJSUhleERlY29kZSI6aD10aGlzLmZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChyKTticmVhaztkZWZhdWx0Omg9dGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChyKX1pZihoPDFlMyYmcz4wKXtjb25zdCBlPXIucG9zO3IucG9zPXQuYmVnaW5JbmxpbmVJbWFnZVBvcyx1PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9W10scj1lLmxlbmd0aDtsZXQgbj0wO2Zvcig7bjxyLTE7KXQucHVzaChlW24rK108PDh8ZVtuKytdKTtyZXR1cm4gbjxyJiZ0LnB1c2goZVtuXSkscisiXyIrU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHQpfShyLmdldEJ5dGVzKHMraCkpLHIucG9zPWU7Y29uc3Qgbj10aGlzLmltYWdlQ2FjaGVbdV07aWYodm9pZCAwIT09bilyZXR1cm4gdGhpcy5idWYyPWEuQ21kLmdldCgiRUkiKSx0aGlzLnNoaWZ0KCksbi5yZXNldCgpLG59Y29uc3QgZD1uZXcgYS5EaWN0KHRoaXMueHJlZik7Zm9yKGNvbnN0IGUgaW4gaSlkLnNldChlLGlbZV0pO2xldCBmPXIubWFrZVN1YlN0cmVhbShsLGgsZCk7cmV0dXJuIGUmJihmPWUuY3JlYXRlU3RyZWFtKGYsaCkpLGY9dGhpcy5maWx0ZXIoZixkLGgpLGYuZGljdD1kLHZvaWQgMCE9PXUmJihmLmNhY2hlS2V5PSJpbmxpbmVfaW1nXyIrICsrdGhpcy5faW1hZ2VJZCx0aGlzLmltYWdlQ2FjaGVbdV09ZiksdGhpcy5idWYyPWEuQ21kLmdldCgiRUkiKSx0aGlzLnNoaWZ0KCksZn1fZmluZFN0cmVhbUxlbmd0aChlLHQpe2NvbnN0e3N0cmVhbTpyfT10aGlzLmxleGVyO3IucG9zPWU7Y29uc3Qgbj10Lmxlbmd0aDtmb3IoO3IucG9zPHIuZW5kOyl7Y29uc3QgYT1yLnBlZWtCeXRlcygyMDQ4KSxpPWEubGVuZ3RoLW47aWYoaTw9MClicmVhaztsZXQgcz0wO2Zvcig7czxpOyl7bGV0IGk9MDtmb3IoO2k8biYmYVtzK2ldPT09dFtpXTspaSsrO2lmKGk+PW4pcmV0dXJuIHIucG9zKz1zLHIucG9zLWU7cysrfXIucG9zKz1pfXJldHVybi0xfW1ha2VTdHJlYW0oZSx0KXtjb25zdCByPXRoaXMubGV4ZXI7bGV0IHM9ci5zdHJlYW07ci5za2lwVG9OZXh0TGluZSgpO2NvbnN0IG89cy5wb3MtMTtsZXQgYz1lLmdldCgiTGVuZ3RoIik7aWYoTnVtYmVyLmlzSW50ZWdlcihjKXx8KCgwLG4uaW5mbykoJ0JhZCBsZW5ndGggIicuY29uY2F0KGMmJmMudG9TdHJpbmcoKSwnIiBpbiBzdHJlYW0uJykpLGM9MCkscy5wb3M9bytjLHIubmV4dENoYXIoKSx0aGlzLnRyeVNoaWZ0KCkmJigwLGEuaXNDbWQpKHRoaXMuYnVmMiwiZW5kc3RyZWFtIikpdGhpcy5zaGlmdCgpO2Vsc2V7Y29uc3QgZT1uZXcgVWludDhBcnJheShbMTAxLDExMCwxMDAsMTE1LDExNiwxMTQsMTAxLDk3LDEwOV0pO2xldCB0PXRoaXMuX2ZpbmRTdHJlYW1MZW5ndGgobyxlKTtpZih0PDApe2NvbnN0IHI9MTtmb3IobGV0IGE9MTthPD1yO2ErKyl7Y29uc3Qgcj1lLmxlbmd0aC1hLGM9ZS5zbGljZSgwLHIpLGw9dGhpcy5fZmluZFN0cmVhbUxlbmd0aChvLGMpO2lmKGw+PTApe2NvbnN0IGU9cy5wZWVrQnl0ZXMocisxKVtyXTtpZighKDAsaS5pc1doaXRlU3BhY2UpKGUpKWJyZWFrOygwLG4uaW5mbykoJ0ZvdW5kICInLmNvbmNhdCgoMCxuLmJ5dGVzVG9TdHJpbmcpKGMpLCciIHdoZW4gc2VhcmNoaW5nIGZvciBlbmRzdHJlYW0gY29tbWFuZC4nKSksdD1sO2JyZWFrfX1pZih0PDApdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIk1pc3NpbmcgZW5kc3RyZWFtIGNvbW1hbmQuIil9Yz10LHIubmV4dENoYXIoKSx0aGlzLnNoaWZ0KCksdGhpcy5zaGlmdCgpfXJldHVybiB0aGlzLnNoaWZ0KCkscz1zLm1ha2VTdWJTdHJlYW0obyxjLGUpLHQmJihzPXQuY3JlYXRlU3RyZWFtKHMsYykpLHM9dGhpcy5maWx0ZXIocyxlLGMpLHMuZGljdD1lLHN9ZmlsdGVyKGUsdCxyKXtsZXQgaT10LmdldCgiRiIsIkZpbHRlciIpLHM9dC5nZXQoIkRQIiwiRGVjb2RlUGFybXMiKTtpZihpIGluc3RhbmNlb2YgYS5OYW1lKXJldHVybiBBcnJheS5pc0FycmF5KHMpJiYoMCxuLndhcm4pKCIvRGVjb2RlUGFybXMgc2hvdWxkIG5vdCBiZSBhbiBBcnJheSwgd2hlbiAvRmlsdGVyIGlzIGEgTmFtZS4iKSx0aGlzLm1ha2VGaWx0ZXIoZSxpLm5hbWUscixzKTtsZXQgbz1yO2lmKEFycmF5LmlzQXJyYXkoaSkpe2NvbnN0IHQ9aSxyPXM7Zm9yKGxldCBjPTAsbD10Lmxlbmd0aDtjPGw7KytjKXtpZihpPXRoaXMueHJlZi5mZXRjaElmUmVmKHRbY10pLCEoaSBpbnN0YW5jZW9mIGEuTmFtZSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoJ0JhZCBmaWx0ZXIgbmFtZSAiJy5jb25jYXQoaSwnIicpKTtzPW51bGwsQXJyYXkuaXNBcnJheShyKSYmYyBpbiByJiYocz10aGlzLnhyZWYuZmV0Y2hJZlJlZihyW2NdKSksZT10aGlzLm1ha2VGaWx0ZXIoZSxpLm5hbWUsbyxzKSxvPW51bGx9fXJldHVybiBlfW1ha2VGaWx0ZXIoZSx0LHIsYSl7aWYoMD09PXIpcmV0dXJuKDAsbi53YXJuKSgnRW1wdHkgIicuY29uY2F0KHQsJyIgc3RyZWFtLicpKSxuZXcgcy5OdWxsU3RyZWFtO3RyeXtzd2l0Y2godCl7Y2FzZSJGbCI6Y2FzZSJGbGF0ZURlY29kZSI6cmV0dXJuIGE/bmV3IHAuUHJlZGljdG9yU3RyZWFtKG5ldyBoLkZsYXRlU3RyZWFtKGUscikscixhKTpuZXcgaC5GbGF0ZVN0cmVhbShlLHIpO2Nhc2UiTFpXIjpjYXNlIkxaV0RlY29kZSI6bGV0IHQ9MTtyZXR1cm4gYT8oYS5oYXMoIkVhcmx5Q2hhbmdlIikmJih0PWEuZ2V0KCJFYXJseUNoYW5nZSIpKSxuZXcgcC5QcmVkaWN0b3JTdHJlYW0obmV3IGcuTFpXU3RyZWFtKGUscix0KSxyLGEpKTpuZXcgZy5MWldTdHJlYW0oZSxyLHQpO2Nhc2UiRENUIjpjYXNlIkRDVERlY29kZSI6cmV0dXJuIG5ldyBkLkpwZWdTdHJlYW0oZSxyLGEpO2Nhc2UiSlBYIjpjYXNlIkpQWERlY29kZSI6cmV0dXJuIG5ldyBmLkpweFN0cmVhbShlLHIsYSk7Y2FzZSJBODUiOmNhc2UiQVNDSUk4NURlY29kZSI6cmV0dXJuIG5ldyBvLkFzY2lpODVTdHJlYW0oZSxyKTtjYXNlIkFIeCI6Y2FzZSJBU0NJSUhleERlY29kZSI6cmV0dXJuIG5ldyBjLkFzY2lpSGV4U3RyZWFtKGUscik7Y2FzZSJDQ0YiOmNhc2UiQ0NJVFRGYXhEZWNvZGUiOnJldHVybiBuZXcgbC5DQ0lUVEZheFN0cmVhbShlLHIsYSk7Y2FzZSJSTCI6Y2FzZSJSdW5MZW5ndGhEZWNvZGUiOnJldHVybiBuZXcgbS5SdW5MZW5ndGhTdHJlYW0oZSxyKTtjYXNlIkpCSUcyRGVjb2RlIjpyZXR1cm4gbmV3IHUuSmJpZzJTdHJlYW0oZSxyLGEpfXJldHVybigwLG4ud2FybikoJ0ZpbHRlciAiJy5jb25jYXQodCwnIiBpcyBub3Qgc3VwcG9ydGVkLicpKSxlfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBpLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7cmV0dXJuKDAsbi53YXJuKSgnSW52YWxpZCBzdHJlYW06ICInLmNvbmNhdChlLCciJykpLG5ldyBzLk51bGxTdHJlYW19fX10LlBhcnNlcj1iO2NvbnN0IHk9WzEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMiwwLDAsMiwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdO2Z1bmN0aW9uIHcoZSl7cmV0dXJuIGU+PTQ4JiZlPD01Nz8xNSZlOmU+PTY1JiZlPD03MHx8ZT49OTcmJmU8PTEwMj85KygxNSZlKTotMX1jbGFzcyB2e2NvbnN0cnVjdG9yKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO3RoaXMuc3RyZWFtPWUsdGhpcy5uZXh0Q2hhcigpLHRoaXMuc3RyQnVmPVtdLHRoaXMua25vd25Db21tYW5kcz10LHRoaXMuX2hleFN0cmluZ051bVdhcm49MCx0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3M9LTF9bmV4dENoYXIoKXtyZXR1cm4gdGhpcy5jdXJyZW50Q2hhcj10aGlzLnN0cmVhbS5nZXRCeXRlKCl9cGVla0NoYXIoKXtyZXR1cm4gdGhpcy5zdHJlYW0ucGVla0J5dGUoKX1nZXROdW1iZXIoKXtsZXQgZT10aGlzLmN1cnJlbnRDaGFyLHQ9ITEscj0wLGE9MTtpZig0NT09PWU/KGE9LTEsZT10aGlzLm5leHRDaGFyKCksNDU9PT1lJiYoZT10aGlzLm5leHRDaGFyKCkpKTo0Mz09PWUmJihlPXRoaXMubmV4dENoYXIoKSksMTA9PT1lfHwxMz09PWUpZG97ZT10aGlzLm5leHRDaGFyKCl9d2hpbGUoMTA9PT1lfHwxMz09PWUpO2lmKDQ2PT09ZSYmKHI9MTAsZT10aGlzLm5leHRDaGFyKCkpLGU8NDh8fGU+NTcpe2NvbnN0IHQ9IkludmFsaWQgbnVtYmVyOiAiLmNvbmNhdChTdHJpbmcuZnJvbUNoYXJDb2RlKGUpLCIgKGNoYXJDb2RlICIpLmNvbmNhdChlLCIpIik7aWYoKDAsaS5pc1doaXRlU3BhY2UpKGUpfHwtMT09PWUpcmV0dXJuKDAsbi5pbmZvKSgnTGV4ZXIuZ2V0TnVtYmVyIC0gIicuY29uY2F0KHQsJyIuJykpLDA7dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IodCl9bGV0IHM9ZS00OCxvPTAsYz0xO2Zvcig7KGU9dGhpcy5uZXh0Q2hhcigpKT49MDspaWYoZT49NDgmJmU8PTU3KXtjb25zdCBuPWUtNDg7dD9vPTEwKm8rbjooMCE9PXImJihyKj0xMCkscz0xMCpzK24pfWVsc2UgaWYoNDY9PT1lKXtpZigwIT09cilicmVhaztyPTF9ZWxzZSBpZig0NT09PWUpKDAsbi53YXJuKSgiQmFkbHkgZm9ybWF0dGVkIG51bWJlcjogbWludXMgc2lnbiBpbiB0aGUgbWlkZGxlIik7ZWxzZXtpZig2OSE9PWUmJjEwMSE9PWUpYnJlYWs7aWYoZT10aGlzLnBlZWtDaGFyKCksNDM9PT1lfHw0NT09PWUpYz00NT09PWU/LTE6MSx0aGlzLm5leHRDaGFyKCk7ZWxzZSBpZihlPDQ4fHxlPjU3KWJyZWFrO3Q9ITB9cmV0dXJuIDAhPT1yJiYocy89ciksdCYmKHMqPTEwKiooYypvKSksYSpzfWdldFN0cmluZygpe2xldCBlPTEsdD0hMTtjb25zdCByPXRoaXMuc3RyQnVmO3IubGVuZ3RoPTA7bGV0IGE9dGhpcy5uZXh0Q2hhcigpO2Zvcig7Oyl7bGV0IGk9ITE7c3dpdGNoKDB8YSl7Y2FzZS0xOigwLG4ud2FybikoIlVudGVybWluYXRlZCBzdHJpbmciKSx0PSEwO2JyZWFrO2Nhc2UgNDA6KytlLHIucHVzaCgiKCIpO2JyZWFrO2Nhc2UgNDE6MD09LS1lPyh0aGlzLm5leHRDaGFyKCksdD0hMCk6ci5wdXNoKCIpIik7YnJlYWs7Y2FzZSA5Mjpzd2l0Y2goYT10aGlzLm5leHRDaGFyKCksYSl7Y2FzZS0xOigwLG4ud2FybikoIlVudGVybWluYXRlZCBzdHJpbmciKSx0PSEwO2JyZWFrO2Nhc2UgMTEwOnIucHVzaCgiXG4iKTticmVhaztjYXNlIDExNDpyLnB1c2goIlxyIik7YnJlYWs7Y2FzZSAxMTY6ci5wdXNoKCJcdCIpO2JyZWFrO2Nhc2UgOTg6ci5wdXNoKCJcYiIpO2JyZWFrO2Nhc2UgMTAyOnIucHVzaCgiXGYiKTticmVhaztjYXNlIDkyOmNhc2UgNDA6Y2FzZSA0MTpyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhKSk7YnJlYWs7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmxldCBlPTE1JmE7YT10aGlzLm5leHRDaGFyKCksaT0hMCxhPj00OCYmYTw9NTUmJihlPShlPDwzKSsoMTUmYSksYT10aGlzLm5leHRDaGFyKCksYT49NDgmJmE8PTU1JiYoaT0hMSxlPShlPDwzKSsoMTUmYSkpKSxyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YnJlYWs7Y2FzZSAxMzoxMD09PXRoaXMucGVla0NoYXIoKSYmdGhpcy5uZXh0Q2hhcigpO2JyZWFrO2Nhc2UgMTA6YnJlYWs7ZGVmYXVsdDpyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhKSl9YnJlYWs7ZGVmYXVsdDpyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhKSl9aWYodClicmVhaztpfHwoYT10aGlzLm5leHRDaGFyKCkpfXJldHVybiByLmpvaW4oIiIpfWdldE5hbWUoKXtsZXQgZSx0O2NvbnN0IHI9dGhpcy5zdHJCdWY7Zm9yKHIubGVuZ3RoPTA7KGU9dGhpcy5uZXh0Q2hhcigpKT49MCYmIXlbZV07KWlmKDM1PT09ZSl7aWYoZT10aGlzLm5leHRDaGFyKCkseVtlXSl7KDAsbi53YXJuKSgiTGV4ZXJfZ2V0TmFtZTogTlVNQkVSIFNJR04gKCMpIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGhleGFkZWNpbWFsIG51bWJlci4iKSxyLnB1c2goIiMiKTticmVha31jb25zdCBhPXcoZSk7aWYoLTEhPT1hKXt0PWUsZT10aGlzLm5leHRDaGFyKCk7Y29uc3QgaT13KGUpO2lmKC0xPT09aSl7aWYoKDAsbi53YXJuKSgiTGV4ZXJfZ2V0TmFtZTogSWxsZWdhbCBkaWdpdCAoIi5jb25jYXQoU3RyaW5nLmZyb21DaGFyQ29kZShlKSwiKSBpbiBoZXhhZGVjaW1hbCBudW1iZXIuIikpLHIucHVzaCgiIyIsU3RyaW5nLmZyb21DaGFyQ29kZSh0KSkseVtlXSlicmVhaztyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7Y29udGludWV9ci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYTw8NHxpKSl9ZWxzZSByLnB1c2goIiMiLFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpfWVsc2Ugci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpO3JldHVybiByLmxlbmd0aD4xMjcmJigwLG4ud2FybikoIk5hbWUgdG9rZW4gaXMgbG9uZ2VyIHRoYW4gYWxsb3dlZCBieSB0aGUgc3BlYzogIi5jb25jYXQoci5sZW5ndGgpKSxhLk5hbWUuZ2V0KHIuam9pbigiIikpfV9oZXhTdHJpbmdXYXJuKGUpezUhPXRoaXMuX2hleFN0cmluZ051bVdhcm4rKz90aGlzLl9oZXhTdHJpbmdOdW1XYXJuPjV8fCgwLG4ud2FybikoImdldEhleFN0cmluZyAtIGlnbm9yaW5nIGludmFsaWQgY2hhcmFjdGVyOiAiLmNvbmNhdChlKSk6KDAsbi53YXJuKSgiZ2V0SGV4U3RyaW5nIC0gaWdub3JpbmcgYWRkaXRpb25hbCBpbnZhbGlkIGNoYXJhY3RlcnMuIil9Z2V0SGV4U3RyaW5nKCl7Y29uc3QgZT10aGlzLnN0ckJ1ZjtlLmxlbmd0aD0wO2xldCB0LHIsYT10aGlzLmN1cnJlbnRDaGFyLGk9ITA7Zm9yKHRoaXMuX2hleFN0cmluZ051bVdhcm49MDs7KXtpZihhPDApeygwLG4ud2FybikoIlVudGVybWluYXRlZCBoZXggc3RyaW5nIik7YnJlYWt9aWYoNjI9PT1hKXt0aGlzLm5leHRDaGFyKCk7YnJlYWt9aWYoMSE9PXlbYV0pe2lmKGkpe2lmKHQ9dyhhKSwtMT09PXQpe3RoaXMuX2hleFN0cmluZ1dhcm4oYSksYT10aGlzLm5leHRDaGFyKCk7Y29udGludWV9fWVsc2V7aWYocj13KGEpLC0xPT09cil7dGhpcy5faGV4U3RyaW5nV2FybihhKSxhPXRoaXMubmV4dENoYXIoKTtjb250aW51ZX1lLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh0PDw0fHIpKX1pPSFpLGE9dGhpcy5uZXh0Q2hhcigpfWVsc2UgYT10aGlzLm5leHRDaGFyKCl9cmV0dXJuIGUuam9pbigiIil9Z2V0T2JqKCl7bGV0IGU9ITEsdD10aGlzLmN1cnJlbnRDaGFyO2Zvcig7Oyl7aWYodDwwKXJldHVybiBhLkVPRjtpZihlKTEwIT09dCYmMTMhPT10fHwoZT0hMSk7ZWxzZSBpZigzNz09PXQpZT0hMDtlbHNlIGlmKDEhPT15W3RdKWJyZWFrO3Q9dGhpcy5uZXh0Q2hhcigpfXN3aXRjaCgwfHQpe2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6Y2FzZSA0MzpjYXNlIDQ1OmNhc2UgNDY6cmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCk7Y2FzZSA0MDpyZXR1cm4gdGhpcy5nZXRTdHJpbmcoKTtjYXNlIDQ3OnJldHVybiB0aGlzLmdldE5hbWUoKTtjYXNlIDkxOnJldHVybiB0aGlzLm5leHRDaGFyKCksYS5DbWQuZ2V0KCJbIik7Y2FzZSA5MzpyZXR1cm4gdGhpcy5uZXh0Q2hhcigpLGEuQ21kLmdldCgiXSIpO2Nhc2UgNjA6cmV0dXJuIHQ9dGhpcy5uZXh0Q2hhcigpLDYwPT09dD8odGhpcy5uZXh0Q2hhcigpLGEuQ21kLmdldCgiPDwiKSk6dGhpcy5nZXRIZXhTdHJpbmcoKTtjYXNlIDYyOnJldHVybiB0PXRoaXMubmV4dENoYXIoKSw2Mj09PXQ/KHRoaXMubmV4dENoYXIoKSxhLkNtZC5nZXQoIj4+IikpOmEuQ21kLmdldCgiPiIpO2Nhc2UgMTIzOnJldHVybiB0aGlzLm5leHRDaGFyKCksYS5DbWQuZ2V0KCJ7Iik7Y2FzZSAxMjU6cmV0dXJuIHRoaXMubmV4dENoYXIoKSxhLkNtZC5nZXQoIn0iKTtjYXNlIDQxOnRocm93IHRoaXMubmV4dENoYXIoKSxuZXcgbi5Gb3JtYXRFcnJvcigiSWxsZWdhbCBjaGFyYWN0ZXI6ICIuY29uY2F0KHQpKX1sZXQgcj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQpO2lmKHQ8MzJ8fHQ+MTI3KXtjb25zdCBlPXRoaXMucGVla0NoYXIoKTtpZihlPj0zMiYmZTw9MTI3KXJldHVybiB0aGlzLm5leHRDaGFyKCksYS5DbWQuZ2V0KHIpfWNvbnN0IGk9dGhpcy5rbm93bkNvbW1hbmRzO2xldCBzPXZvaWQgMCE9PShudWxsPT1pP3ZvaWQgMDppW3JdKTtmb3IoOyh0PXRoaXMubmV4dENoYXIoKSk+PTAmJiF5W3RdOyl7Y29uc3QgZT1yK1N0cmluZy5mcm9tQ2hhckNvZGUodCk7aWYocyYmdm9pZCAwPT09aVtlXSlicmVhaztpZigxMjg9PT1yLmxlbmd0aCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogIi5jb25jYXQoci5sZW5ndGgpKTtyPWUscz12b2lkIDAhPT0obnVsbD09aT92b2lkIDA6aVtyXSl9cmV0dXJuInRydWUiPT09cnx8ImZhbHNlIiE9PXImJigibnVsbCI9PT1yP251bGw6KCJCSSI9PT1yJiYodGhpcy5iZWdpbklubGluZUltYWdlUG9zPXRoaXMuc3RyZWFtLnBvcyksYS5DbWQuZ2V0KHIpKSl9c2tpcFRvTmV4dExpbmUoKXtsZXQgZT10aGlzLmN1cnJlbnRDaGFyO2Zvcig7ZT49MDspe2lmKDEzPT09ZSl7ZT10aGlzLm5leHRDaGFyKCksMTA9PT1lJiZ0aGlzLm5leHRDaGFyKCk7YnJlYWt9aWYoMTA9PT1lKXt0aGlzLm5leHRDaGFyKCk7YnJlYWt9ZT10aGlzLm5leHRDaGFyKCl9fX10LkxleGVyPXYsdC5MaW5lYXJpemF0aW9uPWNsYXNze3N0YXRpYyBjcmVhdGUoZSl7ZnVuY3Rpb24gdChlLHQpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07Y29uc3Qgbj1lLmdldCh0KTtpZihOdW1iZXIuaXNJbnRlZ2VyKG4pJiYocj9uPj0wOm4+MCkpcmV0dXJuIG47dGhyb3cgbmV3IEVycm9yKCdUaGUgIicuY29uY2F0KHQsJyIgcGFyYW1ldGVyIGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4nKSl9Y29uc3Qgcj1uZXcgYih7bGV4ZXI6bmV3IHYoZSkseHJlZjpudWxsfSksbj1yLmdldE9iaigpLGk9ci5nZXRPYmooKSxzPXIuZ2V0T2JqKCksbz1yLmdldE9iaigpO2xldCBjLGw7aWYoIShOdW1iZXIuaXNJbnRlZ2VyKG4pJiZOdW1iZXIuaXNJbnRlZ2VyKGkpJiYoMCxhLmlzQ21kKShzLCJvYmoiKSYmbyBpbnN0YW5jZW9mIGEuRGljdCYmIm51bWJlciI9PXR5cGVvZihjPW8uZ2V0KCJMaW5lYXJpemVkIikpJiZjPjApKXJldHVybiBudWxsO2lmKChsPXQobywiTCIpKSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcignVGhlICJMIiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBkb2VzIG5vdCBlcXVhbCB0aGUgc3RyZWFtIGxlbmd0aC4nKTtyZXR1cm57bGVuZ3RoOmwsaGludHM6ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmdldCgiSCIpO2xldCByO2lmKEFycmF5LmlzQXJyYXkodCkmJigyPT09KHI9dC5sZW5ndGgpfHw0PT09cikpe2ZvcihsZXQgZT0wO2U8cjtlKyspe2NvbnN0IHI9dFtlXTtpZighKE51bWJlci5pc0ludGVnZXIocikmJnI+MCkpdGhyb3cgbmV3IEVycm9yKCJIaW50ICgiLmNvbmNhdChlLCIpIGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKSl9cmV0dXJuIHR9dGhyb3cgbmV3IEVycm9yKCJIaW50IGFycmF5IGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKX0obyksb2JqZWN0TnVtYmVyRmlyc3Q6dChvLCJPIiksZW5kRmlyc3Q6dChvLCJFIiksbnVtUGFnZXM6dChvLCJOIiksbWFpblhSZWZFbnRyaWVzT2Zmc2V0OnQobywiVCIpLHBhZ2VGaXJzdDpvLmhhcygiUCIpP3QobywiUCIsITApOjB9fX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Bc2NpaTg1U3RyZWFtPXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNjgpLGE9cigxNDkpO2NsYXNzIGkgZXh0ZW5kcyBuLkRlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQpe3QmJih0Kj0uOCksc3VwZXIodCksdGhpcy5zdHI9ZSx0aGlzLmRpY3Q9ZS5kaWN0LHRoaXMuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoNSl9cmVhZEJsb2NrKCl7Y29uc3QgZT10aGlzLnN0cjtsZXQgdD1lLmdldEJ5dGUoKTtmb3IoOygwLGEuaXNXaGl0ZVNwYWNlKSh0KTspdD1lLmdldEJ5dGUoKTtpZigtMT09PXR8fDEyNj09PXQpcmV0dXJuIHZvaWQodGhpcy5lb2Y9ITApO2NvbnN0IHI9dGhpcy5idWZmZXJMZW5ndGg7bGV0IG4saTtpZigxMjI9PT10KXtmb3Iobj10aGlzLmVuc3VyZUJ1ZmZlcihyKzQpLGk9MDtpPDQ7KytpKW5bcitpXT0wO3RoaXMuYnVmZmVyTGVuZ3RoKz00fWVsc2V7Y29uc3Qgcz10aGlzLmlucHV0O2ZvcihzWzBdPXQsaT0xO2k8NTsrK2kpe2Zvcih0PWUuZ2V0Qnl0ZSgpOygwLGEuaXNXaGl0ZVNwYWNlKSh0KTspdD1lLmdldEJ5dGUoKTtpZihzW2ldPXQsLTE9PT10fHwxMjY9PT10KWJyZWFrfWlmKG49dGhpcy5lbnN1cmVCdWZmZXIocitpLTEpLHRoaXMuYnVmZmVyTGVuZ3RoKz1pLTEsaTw1KXtmb3IoO2k8NTsrK2kpc1tpXT0xMTc7dGhpcy5lb2Y9ITB9bGV0IG89MDtmb3IoaT0wO2k8NTsrK2kpbz04NSpvKyhzW2ldLTMzKTtmb3IoaT0zO2k+PTA7LS1pKW5bcitpXT0yNTUmbyxvPj49OH19fXQuQXNjaWk4NVN0cmVhbT1pfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuU3RyZWFtc1NlcXVlbmNlU3RyZWFtPXQuRGVjb2RlU3RyZWFtPXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSkscigxMzkpO3ZhciBuPXIoMTUxKSxhPXIoMTU0KTtjb25zdCBpPW5ldyBVaW50OEFycmF5KDApO2NsYXNzIHMgZXh0ZW5kcyBuLkJhc2VTdHJlYW17Y29uc3RydWN0b3IoZSl7aWYoc3VwZXIoKSx0aGlzLl9yYXdNaW5CdWZmZXJMZW5ndGg9ZXx8MCx0aGlzLnBvcz0wLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5lb2Y9ITEsdGhpcy5idWZmZXI9aSx0aGlzLm1pbkJ1ZmZlckxlbmd0aD01MTIsZSlmb3IoO3RoaXMubWluQnVmZmVyTGVuZ3RoPGU7KXRoaXMubWluQnVmZmVyTGVuZ3RoKj0yfWdldCBpc0VtcHR5KCl7Zm9yKDshdGhpcy5lb2YmJjA9PT10aGlzLmJ1ZmZlckxlbmd0aDspdGhpcy5yZWFkQmxvY2soKTtyZXR1cm4gMD09PXRoaXMuYnVmZmVyTGVuZ3RofWVuc3VyZUJ1ZmZlcihlKXtjb25zdCB0PXRoaXMuYnVmZmVyO2lmKGU8PXQuYnl0ZUxlbmd0aClyZXR1cm4gdDtsZXQgcj10aGlzLm1pbkJ1ZmZlckxlbmd0aDtmb3IoO3I8ZTspcio9Mjtjb25zdCBuPW5ldyBVaW50OEFycmF5KHIpO3JldHVybiBuLnNldCh0KSx0aGlzLmJ1ZmZlcj1ufWdldEJ5dGUoKXtjb25zdCBlPXRoaXMucG9zO2Zvcig7dGhpcy5idWZmZXJMZW5ndGg8PWU7KXtpZih0aGlzLmVvZilyZXR1cm4tMTt0aGlzLnJlYWRCbG9jaygpfXJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLnBvcysrXX1nZXRCeXRlcyhlKXtjb25zdCB0PXRoaXMucG9zO2xldCByO2lmKGUpe2Zvcih0aGlzLmVuc3VyZUJ1ZmZlcih0K2UpLHI9dCtlOyF0aGlzLmVvZiYmdGhpcy5idWZmZXJMZW5ndGg8cjspdGhpcy5yZWFkQmxvY2soKTtjb25zdCBuPXRoaXMuYnVmZmVyTGVuZ3RoO3I+biYmKHI9bil9ZWxzZXtmb3IoOyF0aGlzLmVvZjspdGhpcy5yZWFkQmxvY2soKTtyPXRoaXMuYnVmZmVyTGVuZ3RofXJldHVybiB0aGlzLnBvcz1yLHRoaXMuYnVmZmVyLnN1YmFycmF5KHQscil9cmVzZXQoKXt0aGlzLnBvcz0wfW1ha2VTdWJTdHJlYW0oZSx0KXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtpZih2b2lkIDA9PT10KWZvcig7IXRoaXMuZW9mOyl0aGlzLnJlYWRCbG9jaygpO2Vsc2V7Y29uc3Qgcj1lK3Q7Zm9yKDt0aGlzLmJ1ZmZlckxlbmd0aDw9ciYmIXRoaXMuZW9mOyl0aGlzLnJlYWRCbG9jaygpfXJldHVybiBuZXcgYS5TdHJlYW0odGhpcy5idWZmZXIsZSx0LHIpfWdldEJhc2VTdHJlYW1zKCl7cmV0dXJuIHRoaXMuc3RyP3RoaXMuc3RyLmdldEJhc2VTdHJlYW1zKCk6bnVsbH19dC5EZWNvZGVTdHJlYW09cyx0LlN0cmVhbXNTZXF1ZW5jZVN0cmVhbT1jbGFzcyBleHRlbmRzIHN7Y29uc3RydWN0b3IoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGwscj0wO2Zvcihjb25zdCB0IG9mIGUpcis9dCBpbnN0YW5jZW9mIHM/dC5fcmF3TWluQnVmZmVyTGVuZ3RoOnQubGVuZ3RoO3N1cGVyKHIpLHRoaXMuc3RyZWFtcz1lLHRoaXMuX29uRXJyb3I9dH1yZWFkQmxvY2soKXtjb25zdCBlPXRoaXMuc3RyZWFtcztpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHZvaWQodGhpcy5lb2Y9ITApO2NvbnN0IHQ9ZS5zaGlmdCgpO2xldCByO3RyeXtyPXQuZ2V0Qnl0ZXMoKX1jYXRjaChlKXt2YXIgbjtpZih0aGlzLl9vbkVycm9yKXJldHVybiB2b2lkIHRoaXMuX29uRXJyb3IoZSxudWxsPT09KG49dC5kaWN0KXx8dm9pZCAwPT09bj92b2lkIDA6bi5vYmpJZCk7dGhyb3cgZX1jb25zdCBhPXRoaXMuYnVmZmVyTGVuZ3RoLGk9YStyLmxlbmd0aDt0aGlzLmVuc3VyZUJ1ZmZlcihpKS5zZXQocixhKSx0aGlzLmJ1ZmZlckxlbmd0aD1pfWdldEJhc2VTdHJlYW1zKCl7Y29uc3QgZT1bXTtmb3IoY29uc3QgdCBvZiB0aGlzLnN0cmVhbXMpe2NvbnN0IHI9dC5nZXRCYXNlU3RyZWFtcygpO3ImJmUucHVzaCguLi5yKX1yZXR1cm4gZS5sZW5ndGg+MD9lOm51bGx9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkFzY2lpSGV4U3RyZWFtPXZvaWQgMDt2YXIgbj1yKDE2OCk7Y2xhc3MgYSBleHRlbmRzIG4uRGVjb2RlU3RyZWFte2NvbnN0cnVjdG9yKGUsdCl7dCYmKHQqPS41KSxzdXBlcih0KSx0aGlzLnN0cj1lLHRoaXMuZGljdD1lLmRpY3QsdGhpcy5maXJzdERpZ2l0PS0xfXJlYWRCbG9jaygpe2NvbnN0IGU9dGhpcy5zdHIuZ2V0Qnl0ZXMoOGUzKTtpZighZS5sZW5ndGgpcmV0dXJuIHZvaWQodGhpcy5lb2Y9ITApO2NvbnN0IHQ9ZS5sZW5ndGgrMT4+MSxyPXRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoK3QpO2xldCBuPXRoaXMuYnVmZmVyTGVuZ3RoLGE9dGhpcy5maXJzdERpZ2l0O2Zvcihjb25zdCB0IG9mIGUpe2xldCBlO2lmKHQ+PTQ4JiZ0PD01NyllPTE1JnQ7ZWxzZXtpZighKHQ+PTY1JiZ0PD03MHx8dD49OTcmJnQ8PTEwMikpe2lmKDYyPT09dCl7dGhpcy5lb2Y9ITA7YnJlYWt9Y29udGludWV9ZT05KygxNSZ0KX1hPDA/YT1lOihyW24rK109YTw8NHxlLGE9LTEpfWE+PTAmJnRoaXMuZW9mJiYocltuKytdPWE8PDQsYT0tMSksdGhpcy5maXJzdERpZ2l0PWEsdGhpcy5idWZmZXJMZW5ndGg9bn19dC5Bc2NpaUhleFN0cmVhbT1hfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ0NJVFRGYXhTdHJlYW09dm9pZCAwO3ZhciBuPXIoMTcxKSxhPXIoMTY4KSxpPXIoMTUwKTtjbGFzcyBzIGV4dGVuZHMgYS5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKHQpLHRoaXMuc3RyPWUsdGhpcy5kaWN0PWUuZGljdCxyIGluc3RhbmNlb2YgaS5EaWN0fHwocj1pLkRpY3QuZW1wdHkpO2NvbnN0IGE9e25leHQ6KCk9PmUuZ2V0Qnl0ZSgpfTt0aGlzLmNjaXR0RmF4RGVjb2Rlcj1uZXcgbi5DQ0lUVEZheERlY29kZXIoYSx7SzpyLmdldCgiSyIpLEVuZE9mTGluZTpyLmdldCgiRW5kT2ZMaW5lIiksRW5jb2RlZEJ5dGVBbGlnbjpyLmdldCgiRW5jb2RlZEJ5dGVBbGlnbiIpLENvbHVtbnM6ci5nZXQoIkNvbHVtbnMiKSxSb3dzOnIuZ2V0KCJSb3dzIiksRW5kT2ZCbG9jazpyLmdldCgiRW5kT2ZCbG9jayIpLEJsYWNrSXMxOnIuZ2V0KCJCbGFja0lzMSIpfSl9cmVhZEJsb2NrKCl7Zm9yKDshdGhpcy5lb2Y7KXtjb25zdCBlPXRoaXMuY2NpdHRGYXhEZWNvZGVyLnJlYWROZXh0Q2hhcigpO2lmKC0xPT09ZSlyZXR1cm4gdm9pZCh0aGlzLmVvZj0hMCk7dGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGgrMSksdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZX19fXQuQ0NJVFRGYXhTdHJlYW09c30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkNDSVRURmF4RGVjb2Rlcj12b2lkIDAscigyKSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNDQpO2NvbnN0IGE9LTEsaT1bWy0xLC0xXSxbLTEsLTFdLFs3LDhdLFs3LDddLFs2LDZdLFs2LDZdLFs2LDVdLFs2LDVdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdXSxzPVtbLTEsLTFdLFsxMiwtMl0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjExMl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjMwNF0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjQzMl0sWzEyLDI0OTZdLFsxMiwyNTYwXV0sbz1bWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbOCwyOV0sWzgsMjldLFs4LDMwXSxbOCwzMF0sWzgsNDVdLFs4LDQ1XSxbOCw0Nl0sWzgsNDZdLFs3LDIyXSxbNywyMl0sWzcsMjJdLFs3LDIyXSxbNywyM10sWzcsMjNdLFs3LDIzXSxbNywyM10sWzgsNDddLFs4LDQ3XSxbOCw0OF0sWzgsNDhdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzcsMjBdLFs3LDIwXSxbNywyMF0sWzcsMjBdLFs4LDMzXSxbOCwzM10sWzgsMzRdLFs4LDM0XSxbOCwzNV0sWzgsMzVdLFs4LDM2XSxbOCwzNl0sWzgsMzddLFs4LDM3XSxbOCwzOF0sWzgsMzhdLFs3LDE5XSxbNywxOV0sWzcsMTldLFs3LDE5XSxbOCwzMV0sWzgsMzFdLFs4LDMyXSxbOCwzMl0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbOCw1M10sWzgsNTNdLFs4LDU0XSxbOCw1NF0sWzcsMjZdLFs3LDI2XSxbNywyNl0sWzcsMjZdLFs4LDM5XSxbOCwzOV0sWzgsNDBdLFs4LDQwXSxbOCw0MV0sWzgsNDFdLFs4LDQyXSxbOCw0Ml0sWzgsNDNdLFs4LDQzXSxbOCw0NF0sWzgsNDRdLFs3LDIxXSxbNywyMV0sWzcsMjFdLFs3LDIxXSxbNywyOF0sWzcsMjhdLFs3LDI4XSxbNywyOF0sWzgsNjFdLFs4LDYxXSxbOCw2Ml0sWzgsNjJdLFs4LDYzXSxbOCw2M10sWzgsMF0sWzgsMF0sWzgsMzIwXSxbOCwzMjBdLFs4LDM4NF0sWzgsMzg0XSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs3LDI3XSxbNywyN10sWzcsMjddLFs3LDI3XSxbOCw1OV0sWzgsNTldLFs4LDYwXSxbOCw2MF0sWzksMTQ3Ml0sWzksMTUzNl0sWzksMTYwMF0sWzksMTcyOF0sWzcsMThdLFs3LDE4XSxbNywxOF0sWzcsMThdLFs3LDI0XSxbNywyNF0sWzcsMjRdLFs3LDI0XSxbOCw0OV0sWzgsNDldLFs4LDUwXSxbOCw1MF0sWzgsNTFdLFs4LDUxXSxbOCw1Ml0sWzgsNTJdLFs3LDI1XSxbNywyNV0sWzcsMjVdLFs3LDI1XSxbOCw1NV0sWzgsNTVdLFs4LDU2XSxbOCw1Nl0sWzgsNTddLFs4LDU3XSxbOCw1OF0sWzgsNThdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbOCw0NDhdLFs4LDQ0OF0sWzgsNTEyXSxbOCw1MTJdLFs5LDcwNF0sWzksNzY4XSxbOCw2NDBdLFs4LDY0MF0sWzgsNTc2XSxbOCw1NzZdLFs5LDgzMl0sWzksODk2XSxbOSw5NjBdLFs5LDEwMjRdLFs5LDEwODhdLFs5LDExNTJdLFs5LDEyMTZdLFs5LDEyODBdLFs5LDEzNDRdLFs5LDE0MDhdLFs3LDI1Nl0sWzcsMjU2XSxbNywyNTZdLFs3LDI1Nl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XV0sYz1bWy0xLC0xXSxbLTEsLTFdLFsxMiwtMl0sWzEyLC0yXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzExLDE3OTJdLFsxMSwxNzkyXSxbMTIsMTk4NF0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjA0OF0sWzEyLDIxMTJdLFsxMiwyMTEyXSxbMTIsMjE3Nl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjI0MF0sWzEyLDIzMDRdLFsxMiwyMzA0XSxbMTEsMTg1Nl0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTg1Nl0sWzExLDE5MjBdLFsxMSwxOTIwXSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjM2OF0sWzEyLDI0MzJdLFsxMiwyNDMyXSxbMTIsMjQ5Nl0sWzEyLDI0OTZdLFsxMiwyNTYwXSxbMTIsMjU2MF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMiw1Ml0sWzEyLDUyXSxbMTMsNjQwXSxbMTMsNzA0XSxbMTMsNzY4XSxbMTMsODMyXSxbMTIsNTVdLFsxMiw1NV0sWzEyLDU2XSxbMTIsNTZdLFsxMywxMjgwXSxbMTMsMTM0NF0sWzEzLDE0MDhdLFsxMywxNDcyXSxbMTIsNTldLFsxMiw1OV0sWzEyLDYwXSxbMTIsNjBdLFsxMywxNTM2XSxbMTMsMTYwMF0sWzExLDI0XSxbMTEsMjRdLFsxMSwyNF0sWzExLDI0XSxbMTEsMjVdLFsxMSwyNV0sWzExLDI1XSxbMTEsMjVdLFsxMywxNjY0XSxbMTMsMTcyOF0sWzEyLDMyMF0sWzEyLDMyMF0sWzEyLDM4NF0sWzEyLDM4NF0sWzEyLDQ0OF0sWzEyLDQ0OF0sWzEzLDUxMl0sWzEzLDU3Nl0sWzEyLDUzXSxbMTIsNTNdLFsxMiw1NF0sWzEyLDU0XSxbMTMsODk2XSxbMTMsOTYwXSxbMTMsMTAyNF0sWzEzLDEwODhdLFsxMywxMTUyXSxbMTMsMTIxNl0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdXSxsPVtbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzExLDIzXSxbMTEsMjNdLFsxMiw1MF0sWzEyLDUxXSxbMTIsNDRdLFsxMiw0NV0sWzEyLDQ2XSxbMTIsNDddLFsxMiw1N10sWzEyLDU4XSxbMTIsNjFdLFsxMiwyNTZdLFsxMCwxNl0sWzEwLDE2XSxbMTAsMTZdLFsxMCwxNl0sWzEwLDE3XSxbMTAsMTddLFsxMCwxN10sWzEwLDE3XSxbMTIsNDhdLFsxMiw0OV0sWzEyLDYyXSxbMTIsNjNdLFsxMiwzMF0sWzEyLDMxXSxbMTIsMzJdLFsxMiwzM10sWzEyLDQwXSxbMTIsNDFdLFsxMSwyMl0sWzExLDIyXSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzEyLDEyOF0sWzEyLDE5Ml0sWzEyLDI2XSxbMTIsMjddLFsxMiwyOF0sWzEyLDI5XSxbMTEsMTldLFsxMSwxOV0sWzExLDIwXSxbMTEsMjBdLFsxMiwzNF0sWzEyLDM1XSxbMTIsMzZdLFsxMiwzN10sWzEyLDM4XSxbMTIsMzldLFsxMSwyMV0sWzExLDIxXSxbMTIsNDJdLFsxMiw0M10sWzEwLDBdLFsxMCwwXSxbMTAsMF0sWzEwLDBdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl1dLGg9W1stMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWzYsOV0sWzYsOF0sWzUsN10sWzUsN10sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl1dO3QuQ0NJVFRGYXhEZWNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUpe3ZhciB0O2xldCByLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCFlfHwiZnVuY3Rpb24iIT10eXBlb2YgZS5uZXh0KXRocm93IG5ldyBFcnJvcignQ0NJVFRGYXhEZWNvZGVyIC0gaW52YWxpZCAic291cmNlIiBwYXJhbWV0ZXIuJyk7Zm9yKHRoaXMuc291cmNlPWUsdGhpcy5lb2Y9ITEsdGhpcy5lbmNvZGluZz1uLkt8fDAsdGhpcy5lb2xpbmU9bi5FbmRPZkxpbmV8fCExLHRoaXMuYnl0ZUFsaWduPW4uRW5jb2RlZEJ5dGVBbGlnbnx8ITEsdGhpcy5jb2x1bW5zPW4uQ29sdW1uc3x8MTcyOCx0aGlzLnJvd3M9bi5Sb3dzfHwwLHRoaXMuZW9ibG9jaz1udWxsPT09KHQ9bi5FbmRPZkJsb2NrKXx8dm9pZCAwPT09dHx8dCx0aGlzLmJsYWNrPW4uQmxhY2tJczF8fCExLHRoaXMuY29kaW5nTGluZT1uZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zKzEpLHRoaXMucmVmTGluZT1uZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zKzIpLHRoaXMuY29kaW5nTGluZVswXT10aGlzLmNvbHVtbnMsdGhpcy5jb2RpbmdQb3M9MCx0aGlzLnJvdz0wLHRoaXMubmV4dExpbmUyRD10aGlzLmVuY29kaW5nPDAsdGhpcy5pbnB1dEJpdHM9MCx0aGlzLmlucHV0QnVmPTAsdGhpcy5vdXRwdXRCaXRzPTAsdGhpcy5yb3dzRG9uZT0hMTswPT09KHI9dGhpcy5fbG9va0JpdHMoMTIpKTspdGhpcy5fZWF0Qml0cygxKTsxPT09ciYmdGhpcy5fZWF0Qml0cygxMiksdGhpcy5lbmNvZGluZz4wJiYodGhpcy5uZXh0TGluZTJEPSF0aGlzLl9sb29rQml0cygxKSx0aGlzLl9lYXRCaXRzKDEpKX1yZWFkTmV4dENoYXIoKXtpZih0aGlzLmVvZilyZXR1cm4tMTtjb25zdCBlPXRoaXMucmVmTGluZSx0PXRoaXMuY29kaW5nTGluZSxyPXRoaXMuY29sdW1ucztsZXQgaSxzLG8sYyxsO2lmKDA9PT10aGlzLm91dHB1dEJpdHMpe2lmKHRoaXMucm93c0RvbmUmJih0aGlzLmVvZj0hMCksdGhpcy5lb2YpcmV0dXJuLTE7bGV0IG8sbCxoO2lmKHRoaXMuZXJyPSExLHRoaXMubmV4dExpbmUyRCl7Zm9yKGM9MDt0W2NdPHI7KytjKWVbY109dFtjXTtmb3IoZVtjKytdPXIsZVtjXT1yLHRbMF09MCx0aGlzLmNvZGluZ1Bvcz0wLGk9MCxzPTA7dFt0aGlzLmNvZGluZ1Bvc108cjspc3dpdGNoKG89dGhpcy5fZ2V0VHdvRGltQ29kZSgpLG8pe2Nhc2UgMDp0aGlzLl9hZGRQaXhlbHMoZVtpKzFdLHMpLGVbaSsxXTxyJiYoaSs9Mik7YnJlYWs7Y2FzZSAxOmlmKG89bD0wLHMpe2Rve28rPWg9dGhpcy5fZ2V0QmxhY2tDb2RlKCl9d2hpbGUoaD49NjQpO2Rve2wrPWg9dGhpcy5fZ2V0V2hpdGVDb2RlKCl9d2hpbGUoaD49NjQpfWVsc2V7ZG97bys9aD10aGlzLl9nZXRXaGl0ZUNvZGUoKX13aGlsZShoPj02NCk7ZG97bCs9aD10aGlzLl9nZXRCbGFja0NvZGUoKX13aGlsZShoPj02NCl9Zm9yKHRoaXMuX2FkZFBpeGVscyh0W3RoaXMuY29kaW5nUG9zXStvLHMpLHRbdGhpcy5jb2RpbmdQb3NdPHImJnRoaXMuX2FkZFBpeGVscyh0W3RoaXMuY29kaW5nUG9zXStsLDFecyk7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08cjspaSs9MjticmVhaztjYXNlIDc6aWYodGhpcy5fYWRkUGl4ZWxzKGVbaV0rMyxzKSxzXj0xLHRbdGhpcy5jb2RpbmdQb3NdPHIpZm9yKCsraTtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxyOylpKz0yO2JyZWFrO2Nhc2UgNTppZih0aGlzLl9hZGRQaXhlbHMoZVtpXSsyLHMpLHNePTEsdFt0aGlzLmNvZGluZ1Bvc108cilmb3IoKytpO2VbaV08PXRbdGhpcy5jb2RpbmdQb3NdJiZlW2ldPHI7KWkrPTI7YnJlYWs7Y2FzZSAzOmlmKHRoaXMuX2FkZFBpeGVscyhlW2ldKzEscyksc149MSx0W3RoaXMuY29kaW5nUG9zXTxyKWZvcigrK2k7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08cjspaSs9MjticmVhaztjYXNlIDI6aWYodGhpcy5fYWRkUGl4ZWxzKGVbaV0scyksc149MSx0W3RoaXMuY29kaW5nUG9zXTxyKWZvcigrK2k7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08cjspaSs9MjticmVhaztjYXNlIDg6aWYodGhpcy5fYWRkUGl4ZWxzTmVnKGVbaV0tMyxzKSxzXj0xLHRbdGhpcy5jb2RpbmdQb3NdPHIpZm9yKGk+MD8tLWk6KytpO2VbaV08PXRbdGhpcy5jb2RpbmdQb3NdJiZlW2ldPHI7KWkrPTI7YnJlYWs7Y2FzZSA2OmlmKHRoaXMuX2FkZFBpeGVsc05lZyhlW2ldLTIscyksc149MSx0W3RoaXMuY29kaW5nUG9zXTxyKWZvcihpPjA/LS1pOisraTtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxyOylpKz0yO2JyZWFrO2Nhc2UgNDppZih0aGlzLl9hZGRQaXhlbHNOZWcoZVtpXS0xLHMpLHNePTEsdFt0aGlzLmNvZGluZ1Bvc108cilmb3IoaT4wPy0taTorK2k7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08cjspaSs9MjticmVhaztjYXNlIGE6dGhpcy5fYWRkUGl4ZWxzKHIsMCksdGhpcy5lb2Y9ITA7YnJlYWs7ZGVmYXVsdDooMCxuLmluZm8pKCJiYWQgMmQgY29kZSIpLHRoaXMuX2FkZFBpeGVscyhyLDApLHRoaXMuZXJyPSEwfX1lbHNlIGZvcih0WzBdPTAsdGhpcy5jb2RpbmdQb3M9MCxzPTA7dFt0aGlzLmNvZGluZ1Bvc108cjspe2lmKG89MCxzKWRve28rPWg9dGhpcy5fZ2V0QmxhY2tDb2RlKCl9d2hpbGUoaD49NjQpO2Vsc2UgZG97bys9aD10aGlzLl9nZXRXaGl0ZUNvZGUoKX13aGlsZShoPj02NCk7dGhpcy5fYWRkUGl4ZWxzKHRbdGhpcy5jb2RpbmdQb3NdK28scyksc149MX1sZXQgdT0hMTtpZih0aGlzLmJ5dGVBbGlnbiYmKHRoaXMuaW5wdXRCaXRzJj0tOCksdGhpcy5lb2Jsb2NrfHx0aGlzLnJvdyE9PXRoaXMucm93cy0xKXtpZihvPXRoaXMuX2xvb2tCaXRzKDEyKSx0aGlzLmVvbGluZSlmb3IoO28hPT1hJiYxIT09bzspdGhpcy5fZWF0Qml0cygxKSxvPXRoaXMuX2xvb2tCaXRzKDEyKTtlbHNlIGZvcig7MD09PW87KXRoaXMuX2VhdEJpdHMoMSksbz10aGlzLl9sb29rQml0cygxMik7MT09PW8/KHRoaXMuX2VhdEJpdHMoMTIpLHU9ITApOm89PT1hJiYodGhpcy5lb2Y9ITApfWVsc2UgdGhpcy5yb3dzRG9uZT0hMDtpZighdGhpcy5lb2YmJnRoaXMuZW5jb2Rpbmc+MCYmIXRoaXMucm93c0RvbmUmJih0aGlzLm5leHRMaW5lMkQ9IXRoaXMuX2xvb2tCaXRzKDEpLHRoaXMuX2VhdEJpdHMoMSkpLHRoaXMuZW9ibG9jayYmdSYmdGhpcy5ieXRlQWxpZ24pe2lmKG89dGhpcy5fbG9va0JpdHMoMTIpLDE9PT1vKXtpZih0aGlzLl9lYXRCaXRzKDEyKSx0aGlzLmVuY29kaW5nPjAmJih0aGlzLl9sb29rQml0cygxKSx0aGlzLl9lYXRCaXRzKDEpKSx0aGlzLmVuY29kaW5nPj0wKWZvcihjPTA7Yzw0OysrYylvPXRoaXMuX2xvb2tCaXRzKDEyKSwxIT09byYmKDAsbi5pbmZvKSgiYmFkIHJ0YyBjb2RlOiAiK28pLHRoaXMuX2VhdEJpdHMoMTIpLHRoaXMuZW5jb2Rpbmc+MCYmKHRoaXMuX2xvb2tCaXRzKDEpLHRoaXMuX2VhdEJpdHMoMSkpO3RoaXMuZW9mPSEwfX1lbHNlIGlmKHRoaXMuZXJyJiZ0aGlzLmVvbGluZSl7Zm9yKDs7KXtpZihvPXRoaXMuX2xvb2tCaXRzKDEzKSxvPT09YSlyZXR1cm4gdGhpcy5lb2Y9ITAsLTE7aWYobz4+MT09MSlicmVhazt0aGlzLl9lYXRCaXRzKDEpfXRoaXMuX2VhdEJpdHMoMTIpLHRoaXMuZW5jb2Rpbmc+MCYmKHRoaXMuX2VhdEJpdHMoMSksdGhpcy5uZXh0TGluZTJEPSEoMSZvKSl9dGhpcy5vdXRwdXRCaXRzPXRbMF0+MD90W3RoaXMuY29kaW5nUG9zPTBdOnRbdGhpcy5jb2RpbmdQb3M9MV0sdGhpcy5yb3crK31pZih0aGlzLm91dHB1dEJpdHM+PTgpbD0xJnRoaXMuY29kaW5nUG9zPzA6MjU1LHRoaXMub3V0cHV0Qml0cy09OCwwPT09dGhpcy5vdXRwdXRCaXRzJiZ0W3RoaXMuY29kaW5nUG9zXTxyJiYodGhpcy5jb2RpbmdQb3MrKyx0aGlzLm91dHB1dEJpdHM9dFt0aGlzLmNvZGluZ1Bvc10tdFt0aGlzLmNvZGluZ1Bvcy0xXSk7ZWxzZXtvPTgsbD0wO2Rve2lmKCJudW1iZXIiIT10eXBlb2YgdGhpcy5vdXRwdXRCaXRzKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdJbnZhbGlkIC9DQ0lUVEZheERlY29kZSBkYXRhLCAib3V0cHV0Qml0cyIgbXVzdCBiZSBhIG51bWJlci4nKTt0aGlzLm91dHB1dEJpdHM+bz8obDw8PW8sMSZ0aGlzLmNvZGluZ1Bvc3x8KGx8PTI1NT4+OC1vKSx0aGlzLm91dHB1dEJpdHMtPW8sbz0wKToobDw8PXRoaXMub3V0cHV0Qml0cywxJnRoaXMuY29kaW5nUG9zfHwobHw9MjU1Pj44LXRoaXMub3V0cHV0Qml0cyksby09dGhpcy5vdXRwdXRCaXRzLHRoaXMub3V0cHV0Qml0cz0wLHRbdGhpcy5jb2RpbmdQb3NdPHI/KHRoaXMuY29kaW5nUG9zKyssdGhpcy5vdXRwdXRCaXRzPXRbdGhpcy5jb2RpbmdQb3NdLXRbdGhpcy5jb2RpbmdQb3MtMV0pOm8+MCYmKGw8PD1vLG89MCkpfXdoaWxlKG8pfXJldHVybiB0aGlzLmJsYWNrJiYobF49MjU1KSxsfV9hZGRQaXhlbHMoZSx0KXtjb25zdCByPXRoaXMuY29kaW5nTGluZTtsZXQgYT10aGlzLmNvZGluZ1BvcztlPnJbYV0mJihlPnRoaXMuY29sdW1ucyYmKCgwLG4uaW5mbykoInJvdyBpcyB3cm9uZyBsZW5ndGgiKSx0aGlzLmVycj0hMCxlPXRoaXMuY29sdW1ucyksMSZhXnQmJisrYSxyW2FdPWUpLHRoaXMuY29kaW5nUG9zPWF9X2FkZFBpeGVsc05lZyhlLHQpe2NvbnN0IHI9dGhpcy5jb2RpbmdMaW5lO2xldCBhPXRoaXMuY29kaW5nUG9zO2lmKGU+clthXSllPnRoaXMuY29sdW1ucyYmKCgwLG4uaW5mbykoInJvdyBpcyB3cm9uZyBsZW5ndGgiKSx0aGlzLmVycj0hMCxlPXRoaXMuY29sdW1ucyksMSZhXnQmJisrYSxyW2FdPWU7ZWxzZSBpZihlPHJbYV0pe2ZvcihlPDAmJigoMCxuLmluZm8pKCJpbnZhbGlkIGNvZGUiKSx0aGlzLmVycj0hMCxlPTApO2E+MCYmZTxyW2EtMV07KS0tYTtyW2FdPWV9dGhpcy5jb2RpbmdQb3M9YX1fZmluZFRhYmxlQ29kZShlLHQscixuKXtjb25zdCBpPW58fDA7Zm9yKGxldCBuPWU7bjw9dDsrK24pe2xldCBlPXRoaXMuX2xvb2tCaXRzKG4pO2lmKGU9PT1hKXJldHVyblshMCwxLCExXTtpZihuPHQmJihlPDw9dC1uKSwhaXx8ZT49aSl7Y29uc3QgdD1yW2UtaV07aWYodFswXT09PW4pcmV0dXJuIHRoaXMuX2VhdEJpdHMobiksWyEwLHRbMV0sITBdfX1yZXR1cm5bITEsMCwhMV19X2dldFR3b0RpbUNvZGUoKXtsZXQgZSx0PTA7aWYodGhpcy5lb2Jsb2NrKXt2YXIgcjtpZih0PXRoaXMuX2xvb2tCaXRzKDcpLGU9aVt0XSwobnVsbD09PShyPWUpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyWzBdKT4wKXJldHVybiB0aGlzLl9lYXRCaXRzKGVbMF0pLGVbMV19ZWxzZXtjb25zdCBlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMSw3LGkpO2lmKGVbMF0mJmVbMl0pcmV0dXJuIGVbMV19cmV0dXJuKDAsbi5pbmZvKSgiQmFkIHR3byBkaW0gY29kZSIpLGF9X2dldFdoaXRlQ29kZSgpe2xldCBlLHQ9MDtpZih0aGlzLmVvYmxvY2spe2lmKHQ9dGhpcy5fbG9va0JpdHMoMTIpLHQ9PT1hKXJldHVybiAxO2lmKGU9dD4+NT09MD9zW3RdOm9bdD4+M10sZVswXT4wKXJldHVybiB0aGlzLl9lYXRCaXRzKGVbMF0pLGVbMV19ZWxzZXtsZXQgZT10aGlzLl9maW5kVGFibGVDb2RlKDEsOSxvKTtpZihlWzBdKXJldHVybiBlWzFdO2lmKGU9dGhpcy5fZmluZFRhYmxlQ29kZSgxMSwxMixzKSxlWzBdKXJldHVybiBlWzFdfXJldHVybigwLG4uaW5mbykoImJhZCB3aGl0ZSBjb2RlIiksdGhpcy5fZWF0Qml0cygxKSwxfV9nZXRCbGFja0NvZGUoKXtsZXQgZSx0O2lmKHRoaXMuZW9ibG9jayl7aWYoZT10aGlzLl9sb29rQml0cygxMyksZT09PWEpcmV0dXJuIDE7aWYodD1lPj43PT0wP2NbZV06ZT4+OT09MCYmZT4+NyE9MD9sWyhlPj4xKS02NF06aFtlPj43XSx0WzBdPjApcmV0dXJuIHRoaXMuX2VhdEJpdHModFswXSksdFsxXX1lbHNle2xldCBlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMiw2LGgpO2lmKGVbMF0pcmV0dXJuIGVbMV07aWYoZT10aGlzLl9maW5kVGFibGVDb2RlKDcsMTIsbCw2NCksZVswXSlyZXR1cm4gZVsxXTtpZihlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMTAsMTMsYyksZVswXSlyZXR1cm4gZVsxXX1yZXR1cm4oMCxuLmluZm8pKCJiYWQgYmxhY2sgY29kZSIpLHRoaXMuX2VhdEJpdHMoMSksMX1fbG9va0JpdHMoZSl7bGV0IHQ7Zm9yKDt0aGlzLmlucHV0Qml0czxlOyl7aWYoLTE9PT0odD10aGlzLnNvdXJjZS5uZXh0KCkpKXJldHVybiAwPT09dGhpcy5pbnB1dEJpdHM/YTp0aGlzLmlucHV0QnVmPDxlLXRoaXMuaW5wdXRCaXRzJjY1NTM1Pj4xNi1lO3RoaXMuaW5wdXRCdWY9dGhpcy5pbnB1dEJ1Zjw8OHx0LHRoaXMuaW5wdXRCaXRzKz04fXJldHVybiB0aGlzLmlucHV0QnVmPj50aGlzLmlucHV0Qml0cy1lJjY1NTM1Pj4xNi1lfV9lYXRCaXRzKGUpeyh0aGlzLmlucHV0Qml0cy09ZSk8MCYmKHRoaXMuaW5wdXRCaXRzPTApfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5GbGF0ZVN0cmVhbT12b2lkIDAscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTY4KSxhPXIoMTQ0KTtjb25zdCBpPW5ldyBJbnQzMkFycmF5KFsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSkscz1uZXcgSW50MzJBcnJheShbMyw0LDUsNiw3LDgsOSwxMCw2NTU0Nyw2NTU0OSw2NTU1MSw2NTU1MywxMzEwOTEsMTMxMDk1LDEzMTA5OSwxMzExMDMsMTk2NjQzLDE5NjY1MSwxOTY2NTksMTk2NjY3LDI2MjIxMSwyNjIyMjcsMjYyMjQzLDI2MjI1OSwzMjc4MTEsMzI3ODQzLDMyNzg3NSwzMjc5MDcsMjU4LDI1OCwyNThdKSxvPW5ldyBJbnQzMkFycmF5KFsxLDIsMyw0LDY1NTQxLDY1NTQzLDEzMTA4MSwxMzEwODUsMTk2NjI1LDE5NjYzMywyNjIxNzcsMjYyMTkzLDMyNzc0NSwzMjc3NzcsMzkzMzQ1LDM5MzQwOSw0NTkwMDksNDU5MTM3LDUyNDgwMSw1MjUwNTcsNTkwODQ5LDU5MTM2MSw2NTc0MDksNjU4NDMzLDcyNDk5Myw3MjcwNDEsNzk0NjI1LDc5ODcyMSw4NjgzNTMsODc2NTQ1XSksYz1bbmV3IEludDMyQXJyYXkoWzQ1OTAwOCw1MjQzNjgsNTI0MzA0LDUyNDU2OCw0NTkwMjQsNTI0NDAwLDUyNDMzNiw1OTAwMTYsNDU5MDE2LDUyNDM4NCw1MjQzMjAsNTg5OTg0LDUyNDI4OCw1MjQ0MTYsNTI0MzUyLDU5MDA0OCw0NTkwMTIsNTI0Mzc2LDUyNDMxMiw1ODk5NjgsNDU5MDI4LDUyNDQwOCw1MjQzNDQsNTkwMDMyLDQ1OTAyMCw1MjQzOTIsNTI0MzI4LDU5ZTQsNTI0Mjk2LDUyNDQyNCw1MjQzNjAsNTkwMDY0LDQ1OTAxMCw1MjQzNzIsNTI0MzA4LDUyNDU3Miw0NTkwMjYsNTI0NDA0LDUyNDM0MCw1OTAwMjQsNDU5MDE4LDUyNDM4OCw1MjQzMjQsNTg5OTkyLDUyNDI5Miw1MjQ0MjAsNTI0MzU2LDU5MDA1Niw0NTkwMTQsNTI0MzgwLDUyNDMxNiw1ODk5NzYsNDU5MDMwLDUyNDQxMiw1MjQzNDgsNTkwMDQwLDQ1OTAyMiw1MjQzOTYsNTI0MzMyLDU5MDAwOCw1MjQzMDAsNTI0NDI4LDUyNDM2NCw1OTAwNzIsNDU5MDA5LDUyNDM3MCw1MjQzMDYsNTI0NTcwLDQ1OTAyNSw1MjQ0MDIsNTI0MzM4LDU5MDAyMCw0NTkwMTcsNTI0Mzg2LDUyNDMyMiw1ODk5ODgsNTI0MjkwLDUyNDQxOCw1MjQzNTQsNTkwMDUyLDQ1OTAxMyw1MjQzNzgsNTI0MzE0LDU4OTk3Miw0NTkwMjksNTI0NDEwLDUyNDM0Niw1OTAwMzYsNDU5MDIxLDUyNDM5NCw1MjQzMzAsNTkwMDA0LDUyNDI5OCw1MjQ0MjYsNTI0MzYyLDU5MDA2OCw0NTkwMTEsNTI0Mzc0LDUyNDMxMCw1MjQ1NzQsNDU5MDI3LDUyNDQwNiw1MjQzNDIsNTkwMDI4LDQ1OTAxOSw1MjQzOTAsNTI0MzI2LDU4OTk5Niw1MjQyOTQsNTI0NDIyLDUyNDM1OCw1OTAwNjAsNDU5MDE1LDUyNDM4Miw1MjQzMTgsNTg5OTgwLDQ1OTAzMSw1MjQ0MTQsNTI0MzUwLDU5MDA0NCw0NTkwMjMsNTI0Mzk4LDUyNDMzNCw1OTAwMTIsNTI0MzAyLDUyNDQzMCw1MjQzNjYsNTkwMDc2LDQ1OTAwOCw1MjQzNjksNTI0MzA1LDUyNDU2OSw0NTkwMjQsNTI0NDAxLDUyNDMzNyw1OTAwMTgsNDU5MDE2LDUyNDM4NSw1MjQzMjEsNTg5OTg2LDUyNDI4OSw1MjQ0MTcsNTI0MzUzLDU5MDA1MCw0NTkwMTIsNTI0Mzc3LDUyNDMxMyw1ODk5NzAsNDU5MDI4LDUyNDQwOSw1MjQzNDUsNTkwMDM0LDQ1OTAyMCw1MjQzOTMsNTI0MzI5LDU5MDAwMiw1MjQyOTcsNTI0NDI1LDUyNDM2MSw1OTAwNjYsNDU5MDEwLDUyNDM3Myw1MjQzMDksNTI0NTczLDQ1OTAyNiw1MjQ0MDUsNTI0MzQxLDU5MDAyNiw0NTkwMTgsNTI0Mzg5LDUyNDMyNSw1ODk5OTQsNTI0MjkzLDUyNDQyMSw1MjQzNTcsNTkwMDU4LDQ1OTAxNCw1MjQzODEsNTI0MzE3LDU4OTk3OCw0NTkwMzAsNTI0NDEzLDUyNDM0OSw1OTAwNDIsNDU5MDIyLDUyNDM5Nyw1MjQzMzMsNTkwMDEwLDUyNDMwMSw1MjQ0MjksNTI0MzY1LDU5MDA3NCw0NTkwMDksNTI0MzcxLDUyNDMwNyw1MjQ1NzEsNDU5MDI1LDUyNDQwMyw1MjQzMzksNTkwMDIyLDQ1OTAxNyw1MjQzODcsNTI0MzIzLDU4OTk5MCw1MjQyOTEsNTI0NDE5LDUyNDM1NSw1OTAwNTQsNDU5MDEzLDUyNDM3OSw1MjQzMTUsNTg5OTc0LDQ1OTAyOSw1MjQ0MTEsNTI0MzQ3LDU5MDAzOCw0NTkwMjEsNTI0Mzk1LDUyNDMzMSw1OTAwMDYsNTI0Mjk5LDUyNDQyNyw1MjQzNjMsNTkwMDcwLDQ1OTAxMSw1MjQzNzUsNTI0MzExLDUyNDU3NSw0NTkwMjcsNTI0NDA3LDUyNDM0Myw1OTAwMzAsNDU5MDE5LDUyNDM5MSw1MjQzMjcsNTg5OTk4LDUyNDI5NSw1MjQ0MjMsNTI0MzU5LDU5MDA2Miw0NTkwMTUsNTI0MzgzLDUyNDMxOSw1ODk5ODIsNDU5MDMxLDUyNDQxNSw1MjQzNTEsNTkwMDQ2LDQ1OTAyMyw1MjQzOTksNTI0MzM1LDU5MDAxNCw1MjQzMDMsNTI0NDMxLDUyNDM2Nyw1OTAwNzgsNDU5MDA4LDUyNDM2OCw1MjQzMDQsNTI0NTY4LDQ1OTAyNCw1MjQ0MDAsNTI0MzM2LDU5MDAxNyw0NTkwMTYsNTI0Mzg0LDUyNDMyMCw1ODk5ODUsNTI0Mjg4LDUyNDQxNiw1MjQzNTIsNTkwMDQ5LDQ1OTAxMiw1MjQzNzYsNTI0MzEyLDU4OTk2OSw0NTkwMjgsNTI0NDA4LDUyNDM0NCw1OTAwMzMsNDU5MDIwLDUyNDM5Miw1MjQzMjgsNTkwMDAxLDUyNDI5Niw1MjQ0MjQsNTI0MzYwLDU5MDA2NSw0NTkwMTAsNTI0MzcyLDUyNDMwOCw1MjQ1NzIsNDU5MDI2LDUyNDQwNCw1MjQzNDAsNTkwMDI1LDQ1OTAxOCw1MjQzODgsNTI0MzI0LDU4OTk5Myw1MjQyOTIsNTI0NDIwLDUyNDM1Niw1OTAwNTcsNDU5MDE0LDUyNDM4MCw1MjQzMTYsNTg5OTc3LDQ1OTAzMCw1MjQ0MTIsNTI0MzQ4LDU5MDA0MSw0NTkwMjIsNTI0Mzk2LDUyNDMzMiw1OTAwMDksNTI0MzAwLDUyNDQyOCw1MjQzNjQsNTkwMDczLDQ1OTAwOSw1MjQzNzAsNTI0MzA2LDUyNDU3MCw0NTkwMjUsNTI0NDAyLDUyNDMzOCw1OTAwMjEsNDU5MDE3LDUyNDM4Niw1MjQzMjIsNTg5OTg5LDUyNDI5MCw1MjQ0MTgsNTI0MzU0LDU5MDA1Myw0NTkwMTMsNTI0Mzc4LDUyNDMxNCw1ODk5NzMsNDU5MDI5LDUyNDQxMCw1MjQzNDYsNTkwMDM3LDQ1OTAyMSw1MjQzOTQsNTI0MzMwLDU5MDAwNSw1MjQyOTgsNTI0NDI2LDUyNDM2Miw1OTAwNjksNDU5MDExLDUyNDM3NCw1MjQzMTAsNTI0NTc0LDQ1OTAyNyw1MjQ0MDYsNTI0MzQyLDU5MDAyOSw0NTkwMTksNTI0MzkwLDUyNDMyNiw1ODk5OTcsNTI0Mjk0LDUyNDQyMiw1MjQzNTgsNTkwMDYxLDQ1OTAxNSw1MjQzODIsNTI0MzE4LDU4OTk4MSw0NTkwMzEsNTI0NDE0LDUyNDM1MCw1OTAwNDUsNDU5MDIzLDUyNDM5OCw1MjQzMzQsNTkwMDEzLDUyNDMwMiw1MjQ0MzAsNTI0MzY2LDU5MDA3Nyw0NTkwMDgsNTI0MzY5LDUyNDMwNSw1MjQ1NjksNDU5MDI0LDUyNDQwMSw1MjQzMzcsNTkwMDE5LDQ1OTAxNiw1MjQzODUsNTI0MzIxLDU4OTk4Nyw1MjQyODksNTI0NDE3LDUyNDM1Myw1OTAwNTEsNDU5MDEyLDUyNDM3Nyw1MjQzMTMsNTg5OTcxLDQ1OTAyOCw1MjQ0MDksNTI0MzQ1LDU5MDAzNSw0NTkwMjAsNTI0MzkzLDUyNDMyOSw1OTAwMDMsNTI0Mjk3LDUyNDQyNSw1MjQzNjEsNTkwMDY3LDQ1OTAxMCw1MjQzNzMsNTI0MzA5LDUyNDU3Myw0NTkwMjYsNTI0NDA1LDUyNDM0MSw1OTAwMjcsNDU5MDE4LDUyNDM4OSw1MjQzMjUsNTg5OTk1LDUyNDI5Myw1MjQ0MjEsNTI0MzU3LDU5MDA1OSw0NTkwMTQsNTI0MzgxLDUyNDMxNyw1ODk5NzksNDU5MDMwLDUyNDQxMyw1MjQzNDksNTkwMDQzLDQ1OTAyMiw1MjQzOTcsNTI0MzMzLDU5MDAxMSw1MjQzMDEsNTI0NDI5LDUyNDM2NSw1OTAwNzUsNDU5MDA5LDUyNDM3MSw1MjQzMDcsNTI0NTcxLDQ1OTAyNSw1MjQ0MDMsNTI0MzM5LDU5MDAyMyw0NTkwMTcsNTI0Mzg3LDUyNDMyMyw1ODk5OTEsNTI0MjkxLDUyNDQxOSw1MjQzNTUsNTkwMDU1LDQ1OTAxMyw1MjQzNzksNTI0MzE1LDU4OTk3NSw0NTkwMjksNTI0NDExLDUyNDM0Nyw1OTAwMzksNDU5MDIxLDUyNDM5NSw1MjQzMzEsNTkwMDA3LDUyNDI5OSw1MjQ0MjcsNTI0MzYzLDU5MDA3MSw0NTkwMTEsNTI0Mzc1LDUyNDMxMSw1MjQ1NzUsNDU5MDI3LDUyNDQwNyw1MjQzNDMsNTkwMDMxLDQ1OTAxOSw1MjQzOTEsNTI0MzI3LDU4OTk5OSw1MjQyOTUsNTI0NDIzLDUyNDM1OSw1OTAwNjMsNDU5MDE1LDUyNDM4Myw1MjQzMTksNTg5OTgzLDQ1OTAzMSw1MjQ0MTUsNTI0MzUxLDU5MDA0Nyw0NTkwMjMsNTI0Mzk5LDUyNDMzNSw1OTAwMTUsNTI0MzAzLDUyNDQzMSw1MjQzNjcsNTkwMDc5XSksOV0sbD1bbmV3IEludDMyQXJyYXkoWzMyNzY4MCwzMjc2OTYsMzI3Njg4LDMyNzcwNCwzMjc2ODQsMzI3NzAwLDMyNzY5MiwzMjc3MDgsMzI3NjgyLDMyNzY5OCwzMjc2OTAsMzI3NzA2LDMyNzY4NiwzMjc3MDIsMzI3Njk0LDAsMzI3NjgxLDMyNzY5NywzMjc2ODksMzI3NzA1LDMyNzY4NSwzMjc3MDEsMzI3NjkzLDMyNzcwOSwzMjc2ODMsMzI3Njk5LDMyNzY5MSwzMjc3MDcsMzI3Njg3LDMyNzcwMywzMjc2OTUsMF0pLDVdO2NsYXNzIGggZXh0ZW5kcyBuLkRlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKHQpLHRoaXMuc3RyPWUsdGhpcy5kaWN0PWUuZGljdDtjb25zdCByPWUuZ2V0Qnl0ZSgpLG49ZS5nZXRCeXRlKCk7aWYoLTE9PT1yfHwtMT09PW4pdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgaGVhZGVyIGluIGZsYXRlIHN0cmVhbTogIi5jb25jYXQociwiLCAiKS5jb25jYXQobikpO2lmKDghPSgxNSZyKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gZmxhdGUgc3RyZWFtOiAiLmNvbmNhdChyLCIsICIpLmNvbmNhdChuKSk7aWYoKChyPDw4KStuKSUzMSE9MCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQmFkIEZDSEVDSyBpbiBmbGF0ZSBzdHJlYW06ICIuY29uY2F0KHIsIiwgIikuY29uY2F0KG4pKTtpZigzMiZuKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJGRElDVCBiaXQgc2V0IGluIGZsYXRlIHN0cmVhbTogIi5jb25jYXQociwiLCAiKS5jb25jYXQobikpO3RoaXMuY29kZVNpemU9MCx0aGlzLmNvZGVCdWY9MH1nZXRCaXRzKGUpe2NvbnN0IHQ9dGhpcy5zdHI7bGV0IHIsbj10aGlzLmNvZGVTaXplLGk9dGhpcy5jb2RlQnVmO2Zvcig7bjxlOyl7aWYoLTE9PT0ocj10LmdldEJ5dGUoKSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkJhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0iKTtpfD1yPDxuLG4rPTh9cmV0dXJuIHI9aSYoMTw8ZSktMSx0aGlzLmNvZGVCdWY9aT4+ZSx0aGlzLmNvZGVTaXplPW4tPWUscn1nZXRDb2RlKGUpe2NvbnN0IHQ9dGhpcy5zdHIscj1lWzBdLG49ZVsxXTtsZXQgaSxzPXRoaXMuY29kZVNpemUsbz10aGlzLmNvZGVCdWY7Zm9yKDtzPG4mJi0xIT09KGk9dC5nZXRCeXRlKCkpOylvfD1pPDxzLHMrPTg7Y29uc3QgYz1yW28mKDE8PG4pLTFdLGw9Yz4+MTYsaD02NTUzNSZjO2lmKGw8MXx8czxsKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtIik7cmV0dXJuIHRoaXMuY29kZUJ1Zj1vPj5sLHRoaXMuY29kZVNpemU9cy1sLGh9Z2VuZXJhdGVIdWZmbWFuVGFibGUoZSl7Y29uc3QgdD1lLmxlbmd0aDtsZXQgcixuPTA7Zm9yKHI9MDtyPHQ7KytyKWVbcl0+biYmKG49ZVtyXSk7Y29uc3QgYT0xPDxuLGk9bmV3IEludDMyQXJyYXkoYSk7Zm9yKGxldCBzPTEsbz0wLGM9MjtzPD1uOysrcyxvPDw9MSxjPDw9MSlmb3IobGV0IG49MDtuPHQ7KytuKWlmKGVbbl09PT1zKXtsZXQgZT0wLHQ9bztmb3Iocj0wO3I8czsrK3IpZT1lPDwxfDEmdCx0Pj49MTtmb3Iocj1lO3I8YTtyKz1jKWlbcl09czw8MTZ8bjsrK299cmV0dXJuW2ksbl19cmVhZEJsb2NrKCl7bGV0IGUsdDtjb25zdCByPXRoaXMuc3RyO2xldCBuLGgsdT10aGlzLmdldEJpdHMoMyk7aWYoMSZ1JiYodGhpcy5lb2Y9ITApLHU+Pj0xLDA9PT11KXtsZXQgdDtpZigtMT09PSh0PXIuZ2V0Qnl0ZSgpKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTtsZXQgbj10O2lmKC0xPT09KHQ9ci5nZXRCeXRlKCkpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpO2lmKG58PXQ8PDgsLTE9PT0odD1yLmdldEJ5dGUoKSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7bGV0IGk9dDtpZigtMT09PSh0PXIuZ2V0Qnl0ZSgpKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTtpZihpfD10PDw4LGkhPT0oNjU1MzUmfm4pJiYoMCE9PW58fDAhPT1pKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQmFkIHVuY29tcHJlc3NlZCBibG9jayBsZW5ndGggaW4gZmxhdGUgc3RyZWFtIik7dGhpcy5jb2RlQnVmPTAsdGhpcy5jb2RlU2l6ZT0wO2NvbnN0IHM9dGhpcy5idWZmZXJMZW5ndGgsbz1zK247aWYoZT10aGlzLmVuc3VyZUJ1ZmZlcihvKSx0aGlzLmJ1ZmZlckxlbmd0aD1vLDA9PT1uKS0xPT09ci5wZWVrQnl0ZSgpJiYodGhpcy5lb2Y9ITApO2Vsc2V7Y29uc3QgdD1yLmdldEJ5dGVzKG4pO2Uuc2V0KHQscyksdC5sZW5ndGg8biYmKHRoaXMuZW9mPSEwKX1yZXR1cm59aWYoMT09PXUpbj1jLGg9bDtlbHNle2lmKDIhPT11KXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJVbmtub3duIGJsb2NrIHR5cGUgaW4gZmxhdGUgc3RyZWFtIik7e2NvbnN0IGU9dGhpcy5nZXRCaXRzKDUpKzI1NyxyPXRoaXMuZ2V0Qml0cyg1KSsxLGE9dGhpcy5nZXRCaXRzKDQpKzQscz1uZXcgVWludDhBcnJheShpLmxlbmd0aCk7bGV0IG87Zm9yKG89MDtvPGE7KytvKXNbaVtvXV09dGhpcy5nZXRCaXRzKDMpO2NvbnN0IGM9dGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShzKTt0PTAsbz0wO2NvbnN0IGw9ZStyLHU9bmV3IFVpbnQ4QXJyYXkobCk7bGV0IGQsZixnO2Zvcig7bzxsOyl7Y29uc3QgZT10aGlzLmdldENvZGUoYyk7aWYoMTY9PT1lKWQ9MixmPTMsZz10O2Vsc2UgaWYoMTc9PT1lKWQ9MyxmPTMsZz10PTA7ZWxzZXtpZigxOCE9PWUpe3VbbysrXT10PWU7Y29udGludWV9ZD03LGY9MTEsZz10PTB9bGV0IHI9dGhpcy5nZXRCaXRzKGQpK2Y7Zm9yKDtyLS0gPjA7KXVbbysrXT1nfW49dGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZSh1LnN1YmFycmF5KDAsZSkpLGg9dGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZSh1LnN1YmFycmF5KGUsbCkpfX1lPXRoaXMuYnVmZmVyO2xldCBkPWU/ZS5sZW5ndGg6MCxmPXRoaXMuYnVmZmVyTGVuZ3RoO2Zvcig7Oyl7bGV0IHI9dGhpcy5nZXRDb2RlKG4pO2lmKHI8MjU2KXtmKzE+PWQmJihlPXRoaXMuZW5zdXJlQnVmZmVyKGYrMSksZD1lLmxlbmd0aCksZVtmKytdPXI7Y29udGludWV9aWYoMjU2PT09cilyZXR1cm4gdm9pZCh0aGlzLmJ1ZmZlckxlbmd0aD1mKTtyLT0yNTcscj1zW3JdO2xldCBhPXI+PjE2O2E+MCYmKGE9dGhpcy5nZXRCaXRzKGEpKSx0PSg2NTUzNSZyKSthLHI9dGhpcy5nZXRDb2RlKGgpLHI9b1tyXSxhPXI+PjE2LGE+MCYmKGE9dGhpcy5nZXRCaXRzKGEpKTtjb25zdCBpPSg2NTUzNSZyKSthO2YrdD49ZCYmKGU9dGhpcy5lbnN1cmVCdWZmZXIoZit0KSxkPWUubGVuZ3RoKTtmb3IobGV0IHI9MDtyPHQ7KytyLCsrZillW2ZdPWVbZi1pXX19fXQuRmxhdGVTdHJlYW09aH0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkpiaWcyU3RyZWFtPXZvaWQgMCxyKDEzOSk7dmFyIG49cigxNTEpLGE9cigxNjgpLGk9cigxNTApLHM9cigxNzQpLG89cigxNDQpO2NsYXNzIGMgZXh0ZW5kcyBhLkRlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIodCksdGhpcy5zdHJlYW09ZSx0aGlzLmRpY3Q9ZS5kaWN0LHRoaXMubWF5YmVMZW5ndGg9dCx0aGlzLnBhcmFtcz1yfWdldCBieXRlcygpe3JldHVybigwLG8uc2hhZG93KSh0aGlzLCJieXRlcyIsdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpfWVuc3VyZUJ1ZmZlcihlKXt9cmVhZEJsb2NrKCl7aWYodGhpcy5lb2YpcmV0dXJuO2NvbnN0IGU9bmV3IHMuSmJpZzJJbWFnZSx0PVtdO2lmKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgaS5EaWN0KXtjb25zdCBlPXRoaXMucGFyYW1zLmdldCgiSkJJRzJHbG9iYWxzIik7aWYoZSBpbnN0YW5jZW9mIG4uQmFzZVN0cmVhbSl7Y29uc3Qgcj1lLmdldEJ5dGVzKCk7dC5wdXNoKHtkYXRhOnIsc3RhcnQ6MCxlbmQ6ci5sZW5ndGh9KX19dC5wdXNoKHtkYXRhOnRoaXMuYnl0ZXMsc3RhcnQ6MCxlbmQ6dGhpcy5ieXRlcy5sZW5ndGh9KTtjb25zdCByPWUucGFyc2VDaHVua3ModCksYT1yLmxlbmd0aDtmb3IobGV0IGU9MDtlPGE7ZSsrKXJbZV1ePTI1NTt0aGlzLmJ1ZmZlcj1yLHRoaXMuYnVmZmVyTGVuZ3RoPWEsdGhpcy5lb2Y9ITB9fXQuSmJpZzJTdHJlYW09Y30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkpiaWcySW1hZ2U9dm9pZCAwLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDEzOSkscigyKTt2YXIgbj1yKDE0NCksYT1yKDE0OSksaT1yKDE3NSkscz1yKDE3MSk7Y2xhc3MgbyBleHRlbmRzIG4uQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcigiSkJJRzIgZXJyb3I6ICIuY29uY2F0KGUpLCJKYmlnMkVycm9yIil9fWNsYXNzIGN7Z2V0Q29udGV4dHMoZSl7cmV0dXJuIGUgaW4gdGhpcz90aGlzW2VdOnRoaXNbZV09bmV3IEludDhBcnJheSg2NTUzNil9fWNsYXNzIGx7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuZGF0YT1lLHRoaXMuc3RhcnQ9dCx0aGlzLmVuZD1yfWdldCBkZWNvZGVyKCl7Y29uc3QgZT1uZXcgaS5Bcml0aG1ldGljRGVjb2Rlcih0aGlzLmRhdGEsdGhpcy5zdGFydCx0aGlzLmVuZCk7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImRlY29kZXIiLGUpfWdldCBjb250ZXh0Q2FjaGUoKXtjb25zdCBlPW5ldyBjO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJjb250ZXh0Q2FjaGUiLGUpfX1jb25zdCBoPTIqKjMxLTEsdT0tKDIqKjMxKTtmdW5jdGlvbiBkKGUsdCxyKXtjb25zdCBuPWUuZ2V0Q29udGV4dHModCk7bGV0IGE9MTtmdW5jdGlvbiBpKGUpe2xldCB0PTA7Zm9yKGxldCBpPTA7aTxlO2krKyl7Y29uc3QgZT1yLnJlYWRCaXQobixhKTthPWE8MjU2P2E8PDF8ZTo1MTEmKGE8PDF8ZSl8MjU2LHQ9dDw8MXxlfXJldHVybiB0Pj4+MH1jb25zdCBzPWkoMSksbz1pKDEpP2koMSk/aSgxKT9pKDEpP2koMSk/aSgzMikrNDQzNjppKDEyKSszNDA6aSg4KSs4NDppKDYpKzIwOmkoNCkrNDppKDIpO2xldCBjO3JldHVybiAwPT09cz9jPW86bz4wJiYoYz0tbyksYz49dSYmYzw9aD9jOm51bGx9ZnVuY3Rpb24gZihlLHQscil7Y29uc3Qgbj1lLmdldENvbnRleHRzKCJJQUlEIik7bGV0IGE9MTtmb3IobGV0IGU9MDtlPHI7ZSsrKWE9YTw8MXx0LnJlYWRCaXQobixhKTtyZXR1cm4gcjwzMT9hJigxPDxyKS0xOjIxNDc0ODM2NDcmYX1jb25zdCBnPVsiU3ltYm9sRGljdGlvbmFyeSIsbnVsbCxudWxsLG51bGwsIkludGVybWVkaWF0ZVRleHRSZWdpb24iLG51bGwsIkltbWVkaWF0ZVRleHRSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24iLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiUGF0dGVybkRpY3Rpb25hcnkiLG51bGwsbnVsbCxudWxsLCJJbnRlcm1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsbnVsbCwiSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZ2lvbiIsbnVsbCwiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiIsIkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbiIsIkludGVybWVkaWF0ZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uIixudWxsLCJJbW1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsIkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLG51bGwsbnVsbCxudWxsLG51bGwsIlBhZ2VJbmZvcm1hdGlvbiIsIkVuZE9mUGFnZSIsIkVuZE9mU3RyaXBlIiwiRW5kT2ZGaWxlIiwiUHJvZmlsZXMiLCJUYWJsZXMiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiRXh0ZW5zaW9uIl0scD1bW3t4Oi0xLHk6LTJ9LHt4OjAseTotMn0se3g6MSx5Oi0yfSx7eDotMix5Oi0xfSx7eDotMSx5Oi0xfSx7eDowLHk6LTF9LHt4OjEseTotMX0se3g6Mix5Oi0xfSx7eDotNCx5OjB9LHt4Oi0zLHk6MH0se3g6LTIseTowfSx7eDotMSx5OjB9XSxbe3g6LTEseTotMn0se3g6MCx5Oi0yfSx7eDoxLHk6LTJ9LHt4OjIseTotMn0se3g6LTIseTotMX0se3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4OjIseTotMX0se3g6LTMseTowfSx7eDotMix5OjB9LHt4Oi0xLHk6MH1dLFt7eDotMSx5Oi0yfSx7eDowLHk6LTJ9LHt4OjEseTotMn0se3g6LTIseTotMX0se3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0yLHk6MH0se3g6LTEseTowfV0sW3t4Oi0zLHk6LTF9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotNCx5OjB9LHt4Oi0zLHk6MH0se3g6LTIseTowfSx7eDotMSx5OjB9XV0sbT1be2NvZGluZzpbe3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0xLHk6MH1dLHJlZmVyZW5jZTpbe3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0xLHk6MH0se3g6MCx5OjB9LHt4OjEseTowfSx7eDotMSx5OjF9LHt4OjAseToxfSx7eDoxLHk6MX1dfSx7Y29kaW5nOlt7eDotMSx5Oi0xfSx7eDowLHk6LTF9LHt4OjEseTotMX0se3g6LTEseTowfV0scmVmZXJlbmNlOlt7eDowLHk6LTF9LHt4Oi0xLHk6MH0se3g6MCx5OjB9LHt4OjEseTowfSx7eDowLHk6MX0se3g6MSx5OjF9XX1dLGI9WzM5NzE3LDE5NDEsMjI5LDQwNV0seT1bMzIsOF07ZnVuY3Rpb24gdyhlLHQscixuLGEsaSxzLG8pe2lmKGUpcmV0dXJuIEwobmV3IE4oby5kYXRhLG8uc3RhcnQsby5lbmQpLHQsciwhMSk7aWYoMD09PW4mJiFpJiYhYSYmND09PXMubGVuZ3RoJiYzPT09c1swXS54JiYtMT09PXNbMF0ueSYmLTM9PT1zWzFdLngmJi0xPT09c1sxXS55JiYyPT09c1syXS54JiYtMj09PXNbMl0ueSYmLTI9PT1zWzNdLngmJi0yPT09c1szXS55KXJldHVybiBmdW5jdGlvbihlLHQscil7Y29uc3Qgbj1yLmRlY29kZXIsYT1yLmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKSxpPVtdO2xldCBzLG8sYyxsLGgsdSxkO2ZvcihvPTA7bzx0O28rKylmb3IoaD1pW29dPW5ldyBVaW50OEFycmF5KGUpLHU9bzwxP2g6aVtvLTFdLGQ9bzwyP2g6aVtvLTJdLHM9ZFswXTw8MTN8ZFsxXTw8MTJ8ZFsyXTw8MTF8dVswXTw8N3x1WzFdPDw2fHVbMl08PDV8dVszXTw8NCxjPTA7YzxlO2MrKyloW2NdPWw9bi5yZWFkQml0KGEscykscz0oMzE3MzUmcyk8PDF8KGMrMzxlP2RbYyszXTw8MTE6MCl8KGMrNDxlP3VbYys0XTw8NDowKXxsO3JldHVybiBpfSh0LHIsbyk7Y29uc3QgYz0hIWksbD1wW25dLmNvbmNhdChzKTtsLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUueS10Lnl8fGUueC10Lnh9KSk7Y29uc3QgaD1sLmxlbmd0aCx1PW5ldyBJbnQ4QXJyYXkoaCksZD1uZXcgSW50OEFycmF5KGgpLGY9W107bGV0IGcsbSx5PTAsdz0wLHY9MCx4PTA7Zm9yKG09MDttPGg7bSsrKXVbbV09bFttXS54LGRbbV09bFttXS55LHc9TWF0aC5taW4odyxsW21dLngpLHY9TWF0aC5tYXgodixsW21dLngpLHg9TWF0aC5taW4oeCxsW21dLnkpLG08aC0xJiZsW21dLnk9PT1sW20rMV0ueSYmbFttXS54PT09bFttKzFdLngtMT95fD0xPDxoLTEtbTpmLnB1c2gobSk7Y29uc3QgUz1mLmxlbmd0aCxBPW5ldyBJbnQ4QXJyYXkoUyksaz1uZXcgSW50OEFycmF5KFMpLEM9bmV3IFVpbnQxNkFycmF5KFMpO2ZvcihnPTA7ZzxTO2crKyltPWZbZ10sQVtnXT1sW21dLngsa1tnXT1sW21dLnksQ1tnXT0xPDxoLTEtbTtjb25zdCBPPS13LEY9LXgsST10LXYsVD1iW25dO2xldCBNPW5ldyBVaW50OEFycmF5KHQpO2NvbnN0IEU9W10sUD1vLmRlY29kZXIsUj1vLmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKTtsZXQgRCxCLF8saixVLCQ9MCxYPTA7Zm9yKGxldCBlPTA7ZTxyO2UrKylpZihhJiYoJF49UC5yZWFkQml0KFIsVCksJCkpRS5wdXNoKE0pO2Vsc2UgZm9yKE09bmV3IFVpbnQ4QXJyYXkoTSksRS5wdXNoKE0pLEQ9MDtEPHQ7RCsrKXtpZihjJiZpW2VdW0RdKXtNW0RdPTA7Y29udGludWV9aWYoRD49TyYmRDxJJiZlPj1GKWZvcihYPVg8PDEmeSxtPTA7bTxTO20rKylCPWUra1ttXSxfPUQrQVttXSxqPUVbQl1bX10saiYmKGo9Q1ttXSxYfD1qKTtlbHNlIGZvcihYPTAsVT1oLTEsbT0wO208aDttKyssVS0tKV89RCt1W21dLF8+PTAmJl88dCYmKEI9ZStkW21dLEI+PTAmJihqPUVbQl1bX10saiYmKFh8PWo8PFUpKSk7Y29uc3Qgcj1QLnJlYWRCaXQoUixYKTtNW0RdPXJ9cmV0dXJuIEV9ZnVuY3Rpb24gdihlLHQscixuLGEsaSxzLGMsbCl7bGV0IGg9bVtyXS5jb2Rpbmc7MD09PXImJihoPWguY29uY2F0KFtjWzBdXSkpO2NvbnN0IHU9aC5sZW5ndGgsZD1uZXcgSW50MzJBcnJheSh1KSxmPW5ldyBJbnQzMkFycmF5KHUpO2xldCBnO2ZvcihnPTA7Zzx1O2crKylkW2ddPWhbZ10ueCxmW2ddPWhbZ10ueTtsZXQgcD1tW3JdLnJlZmVyZW5jZTswPT09ciYmKHA9cC5jb25jYXQoW2NbMV1dKSk7Y29uc3QgYj1wLmxlbmd0aCx3PW5ldyBJbnQzMkFycmF5KGIpLHY9bmV3IEludDMyQXJyYXkoYik7Zm9yKGc9MDtnPGI7ZysrKXdbZ109cFtnXS54LHZbZ109cFtnXS55O2NvbnN0IHg9blswXS5sZW5ndGgsUz1uLmxlbmd0aCxBPXlbcl0saz1bXSxDPWwuZGVjb2RlcixPPWwuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHUiIpO2xldCBGPTA7Zm9yKGxldCByPTA7cjx0O3IrKyl7aWYocyYmKEZePUMucmVhZEJpdChPLEEpLEYpKXRocm93IG5ldyBvKCJwcmVkaWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTtjb25zdCB0PW5ldyBVaW50OEFycmF5KGUpO2sucHVzaCh0KTtmb3IobGV0IHM9MDtzPGU7cysrKXtsZXQgbyxjLGw9MDtmb3IoZz0wO2c8dTtnKyspbz1yK2ZbZ10sYz1zK2RbZ10sbzwwfHxjPDB8fGM+PWU/bDw8PTE6bD1sPDwxfGtbb11bY107Zm9yKGc9MDtnPGI7ZysrKW89cit2W2ddLWksYz1zK3dbZ10tYSxvPDB8fG8+PVN8fGM8MHx8Yz49eD9sPDw9MTpsPWw8PDF8bltvXVtjXTtjb25zdCBoPUMucmVhZEJpdChPLGwpO3Rbc109aH19cmV0dXJuIGt9ZnVuY3Rpb24geChlLHQscixuLGEsaSxzLGMsbCxoLHUsZyxwLG0sYix5LHcseCxTKXtpZihlJiZ0KXRocm93IG5ldyBvKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7Y29uc3QgQT1bXTtsZXQgayxDO2ZvcihrPTA7azxuO2srKyl7aWYoQz1uZXcgVWludDhBcnJheShyKSxhKWZvcihsZXQgZT0wO2U8cjtlKyspQ1tlXT1hO0EucHVzaChDKX1jb25zdCBPPXcuZGVjb2RlcixGPXcuY29udGV4dENhY2hlO2xldCBJPWU/LW0udGFibGVEZWx0YVQuZGVjb2RlKFMpOi1kKEYsIklBRFQiLE8pLFQ9MDtmb3Ioaz0wO2s8aTspe0krPWU/bS50YWJsZURlbHRhVC5kZWNvZGUoUyk6ZChGLCJJQURUIixPKSxUKz1lP20udGFibGVGaXJzdFMuZGVjb2RlKFMpOmQoRiwiSUFGUyIsTyk7bGV0IG49VDtmb3IoOzspe2xldCBhPTA7cz4xJiYoYT1lP1MucmVhZEJpdHMoeCk6ZChGLCJJQUlUIixPKSk7Y29uc3QgaT1zKkkrYSxUPWU/bS5zeW1ib2xJRFRhYmxlLmRlY29kZShTKTpmKEYsTyxsKSxNPXQmJihlP1MucmVhZEJpdCgpOmQoRiwiSUFSSSIsTykpO2xldCBFPWNbVF0sUD1FWzBdLmxlbmd0aCxSPUUubGVuZ3RoO2lmKE0pe2NvbnN0IGU9ZChGLCJJQVJEVyIsTyksdD1kKEYsIklBUkRIIixPKTtQKz1lLFIrPXQsRT12KFAsUixiLEUsKGU+PjEpK2QoRiwiSUFSRFgiLE8pLCh0Pj4xKStkKEYsIklBUkRZIixPKSwhMSx5LHcpfWNvbnN0IE49aS0oMSZnPzA6Ui0xKSxEPW4tKDImZz9QLTE6MCk7bGV0IEIsTCxfO2lmKGgpe2ZvcihCPTA7QjxSO0IrKyl7aWYoQz1BW0QrQl0sIUMpY29udGludWU7Xz1FW0JdO2NvbnN0IGU9TWF0aC5taW4oci1OLFApO3N3aXRjaChwKXtjYXNlIDA6Zm9yKEw9MDtMPGU7TCsrKUNbTitMXXw9X1tMXTticmVhaztjYXNlIDI6Zm9yKEw9MDtMPGU7TCsrKUNbTitMXV49X1tMXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBvKCJvcGVyYXRvciAiLmNvbmNhdChwLCIgaXMgbm90IHN1cHBvcnRlZCIpKX19bis9Ui0xfWVsc2V7Zm9yKEw9MDtMPFI7TCsrKWlmKEM9QVtOK0xdLEMpc3dpdGNoKF89RVtMXSxwKXtjYXNlIDA6Zm9yKEI9MDtCPFA7QisrKUNbRCtCXXw9X1tCXTticmVhaztjYXNlIDI6Zm9yKEI9MDtCPFA7QisrKUNbRCtCXV49X1tCXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBvKCJvcGVyYXRvciAiLmNvbmNhdChwLCIgaXMgbm90IHN1cHBvcnRlZCIpKX1uKz1QLTF9aysrO2NvbnN0IGo9ZT9tLnRhYmxlRGVsdGFTLmRlY29kZShTKTpkKEYsIklBRFMiLE8pO2lmKG51bGw9PT1qKWJyZWFrO24rPWordX19cmV0dXJuIEF9ZnVuY3Rpb24gUyhlLHQpe2NvbnN0IHI9e307ci5udW1iZXI9KDAsYS5yZWFkVWludDMyKShlLHQpO2NvbnN0IG49ZVt0KzRdLGk9NjMmbjtpZighZ1tpXSl0aHJvdyBuZXcgbygiaW52YWxpZCBzZWdtZW50IHR5cGU6ICIraSk7ci50eXBlPWksci50eXBlTmFtZT1nW2ldLHIuZGVmZXJyZWROb25SZXRhaW49ISEoMTI4Jm4pO2NvbnN0IHM9ISEoNjQmbiksYz1lW3QrNV07bGV0IGw9Yz4+NSY3O2NvbnN0IGg9WzMxJmNdO2xldCB1PXQrNjtpZig3PT09Yyl7bD01MzY4NzA5MTEmKDAsYS5yZWFkVWludDMyKShlLHUtMSksdSs9MztsZXQgdD1sKzc+PjM7Zm9yKGhbMF09ZVt1KytdOy0tdD4wOyloLnB1c2goZVt1KytdKX1lbHNlIGlmKDU9PT1jfHw2PT09Yyl0aHJvdyBuZXcgbygiaW52YWxpZCByZWZlcnJlZC10byBmbGFncyIpO3IucmV0YWluQml0cz1oO2xldCBkPTQ7ci5udW1iZXI8PTI1Nj9kPTE6ci5udW1iZXI8PTY1NTM2JiYoZD0yKTtjb25zdCBmPVtdO2xldCBwLG07Zm9yKHA9MDtwPGw7cCsrKXtsZXQgdDt0PTE9PT1kP2VbdV06Mj09PWQ/KDAsYS5yZWFkVWludDE2KShlLHUpOigwLGEucmVhZFVpbnQzMikoZSx1KSxmLnB1c2godCksdSs9ZH1pZihyLnJlZmVycmVkVG89ZixzPyhyLnBhZ2VBc3NvY2lhdGlvbj0oMCxhLnJlYWRVaW50MzIpKGUsdSksdSs9NCk6ci5wYWdlQXNzb2NpYXRpb249ZVt1KytdLHIubGVuZ3RoPSgwLGEucmVhZFVpbnQzMikoZSx1KSx1Kz00LDQyOTQ5NjcyOTU9PT1yLmxlbmd0aCl7aWYoMzghPT1pKXRocm93IG5ldyBvKCJpbnZhbGlkIHVua25vd24gc2VnbWVudCBsZW5ndGgiKTt7Y29uc3QgdD1rKGUsdSksbj0hISgxJmVbdStDXSksYT02LGk9bmV3IFVpbnQ4QXJyYXkoYSk7Zm9yKG58fChpWzBdPTI1NSxpWzFdPTE3MiksaVsyXT10LmhlaWdodD4+PjI0JjI1NSxpWzNdPXQuaGVpZ2h0Pj4xNiYyNTUsaVs0XT10LmhlaWdodD4+OCYyNTUsaVs1XT0yNTUmdC5oZWlnaHQscD11LG09ZS5sZW5ndGg7cDxtO3ArKyl7bGV0IHQ9MDtmb3IoO3Q8YSYmaVt0XT09PWVbcCt0XTspdCsrO2lmKHQ9PT1hKXtyLmxlbmd0aD1wK2E7YnJlYWt9fWlmKDQyOTQ5NjcyOTU9PT1yLmxlbmd0aCl0aHJvdyBuZXcgbygic2VnbWVudCBlbmQgd2FzIG5vdCBmb3VuZCIpfX1yZXR1cm4gci5oZWFkZXJFbmQ9dSxyfWZ1bmN0aW9uIEEoZSx0LHIsbil7Y29uc3QgYT1bXTtsZXQgaT1yO2Zvcig7aTxuOyl7Y29uc3Qgcj1TKHQsaSk7aT1yLmhlYWRlckVuZDtjb25zdCBuPXtoZWFkZXI6cixkYXRhOnR9O2lmKGUucmFuZG9tQWNjZXNzfHwobi5zdGFydD1pLGkrPXIubGVuZ3RoLG4uZW5kPWkpLGEucHVzaChuKSw1MT09PXIudHlwZSlicmVha31pZihlLnJhbmRvbUFjY2Vzcylmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDtlKyspYVtlXS5zdGFydD1pLGkrPWFbZV0uaGVhZGVyLmxlbmd0aCxhW2VdLmVuZD1pO3JldHVybiBhfWZ1bmN0aW9uIGsoZSx0KXtyZXR1cm57d2lkdGg6KDAsYS5yZWFkVWludDMyKShlLHQpLGhlaWdodDooMCxhLnJlYWRVaW50MzIpKGUsdCs0KSx4OigwLGEucmVhZFVpbnQzMikoZSx0KzgpLHk6KDAsYS5yZWFkVWludDMyKShlLHQrMTIpLGNvbWJpbmF0aW9uT3BlcmF0b3I6NyZlW3QrMTZdfX1jb25zdCBDPTE3O2Z1bmN0aW9uIE8oZSx0KXtjb25zdCByPWUuaGVhZGVyLG49ZS5kYXRhLGk9ZS5lbmQ7bGV0IHMsYyxsLGgsdT1lLnN0YXJ0O3N3aXRjaChyLnR5cGUpe2Nhc2UgMDpjb25zdCBlPXt9LHQ9KDAsYS5yZWFkVWludDE2KShuLHUpO2lmKGUuaHVmZm1hbj0hISgxJnQpLGUucmVmaW5lbWVudD0hISgyJnQpLGUuaHVmZm1hbkRIU2VsZWN0b3I9dD4+MiYzLGUuaHVmZm1hbkRXU2VsZWN0b3I9dD4+NCYzLGUuYml0bWFwU2l6ZVNlbGVjdG9yPXQ+PjYmMSxlLmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3I9dD4+NyYxLGUuYml0bWFwQ29kaW5nQ29udGV4dFVzZWQ9ISEoMjU2JnQpLGUuYml0bWFwQ29kaW5nQ29udGV4dFJldGFpbmVkPSEhKDUxMiZ0KSxlLnRlbXBsYXRlPXQ+PjEwJjMsZS5yZWZpbmVtZW50VGVtcGxhdGU9dD4+MTImMSx1Kz0yLCFlLmh1ZmZtYW4pe2ZvcihoPTA9PT1lLnRlbXBsYXRlPzQ6MSxjPVtdLGw9MDtsPGg7bCsrKWMucHVzaCh7eDooMCxhLnJlYWRJbnQ4KShuLHUpLHk6KDAsYS5yZWFkSW50OCkobix1KzEpfSksdSs9MjtlLmF0PWN9aWYoZS5yZWZpbmVtZW50JiYhZS5yZWZpbmVtZW50VGVtcGxhdGUpe2ZvcihjPVtdLGw9MDtsPDI7bCsrKWMucHVzaCh7eDooMCxhLnJlYWRJbnQ4KShuLHUpLHk6KDAsYS5yZWFkSW50OCkobix1KzEpfSksdSs9MjtlLnJlZmluZW1lbnRBdD1jfWUubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHM9KDAsYS5yZWFkVWludDMyKShuLHUpLHUrPTQsZS5udW1iZXJPZk5ld1N5bWJvbHM9KDAsYS5yZWFkVWludDMyKShuLHUpLHUrPTQscz1bZSxyLm51bWJlcixyLnJlZmVycmVkVG8sbix1LGldO2JyZWFrO2Nhc2UgNjpjYXNlIDc6Y29uc3QgZD17fTtkLmluZm89ayhuLHUpLHUrPUM7Y29uc3QgZj0oMCxhLnJlYWRVaW50MTYpKG4sdSk7aWYodSs9MixkLmh1ZmZtYW49ISEoMSZmKSxkLnJlZmluZW1lbnQ9ISEoMiZmKSxkLmxvZ1N0cmlwU2l6ZT1mPj4yJjMsZC5zdHJpcFNpemU9MTw8ZC5sb2dTdHJpcFNpemUsZC5yZWZlcmVuY2VDb3JuZXI9Zj4+NCYzLGQudHJhbnNwb3NlZD0hISg2NCZmKSxkLmNvbWJpbmF0aW9uT3BlcmF0b3I9Zj4+NyYzLGQuZGVmYXVsdFBpeGVsVmFsdWU9Zj4+OSYxLGQuZHNPZmZzZXQ9Zjw8MTc+PjI3LGQucmVmaW5lbWVudFRlbXBsYXRlPWY+PjE1JjEsZC5odWZmbWFuKXtjb25zdCBlPSgwLGEucmVhZFVpbnQxNikobix1KTt1Kz0yLGQuaHVmZm1hbkZTPTMmZSxkLmh1ZmZtYW5EUz1lPj4yJjMsZC5odWZmbWFuRFQ9ZT4+NCYzLGQuaHVmZm1hblJlZmluZW1lbnREVz1lPj42JjMsZC5odWZmbWFuUmVmaW5lbWVudERIPWU+PjgmMyxkLmh1ZmZtYW5SZWZpbmVtZW50RFg9ZT4+MTAmMyxkLmh1ZmZtYW5SZWZpbmVtZW50RFk9ZT4+MTImMyxkLmh1ZmZtYW5SZWZpbmVtZW50U2l6ZVNlbGVjdG9yPSEhKDE2Mzg0JmUpfWlmKGQucmVmaW5lbWVudCYmIWQucmVmaW5lbWVudFRlbXBsYXRlKXtmb3IoYz1bXSxsPTA7bDwyO2wrKyljLnB1c2goe3g6KDAsYS5yZWFkSW50OCkobix1KSx5OigwLGEucmVhZEludDgpKG4sdSsxKX0pLHUrPTI7ZC5yZWZpbmVtZW50QXQ9Y31kLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzPSgwLGEucmVhZFVpbnQzMikobix1KSx1Kz00LHM9W2Qsci5yZWZlcnJlZFRvLG4sdSxpXTticmVhaztjYXNlIDE2OmNvbnN0IGc9e30scD1uW3UrK107Zy5tbXI9ISEoMSZwKSxnLnRlbXBsYXRlPXA+PjEmMyxnLnBhdHRlcm5XaWR0aD1uW3UrK10sZy5wYXR0ZXJuSGVpZ2h0PW5bdSsrXSxnLm1heFBhdHRlcm5JbmRleD0oMCxhLnJlYWRVaW50MzIpKG4sdSksdSs9NCxzPVtnLHIubnVtYmVyLG4sdSxpXTticmVhaztjYXNlIDIyOmNhc2UgMjM6Y29uc3QgbT17fTttLmluZm89ayhuLHUpLHUrPUM7Y29uc3QgYj1uW3UrK107bS5tbXI9ISEoMSZiKSxtLnRlbXBsYXRlPWI+PjEmMyxtLmVuYWJsZVNraXA9ISEoOCZiKSxtLmNvbWJpbmF0aW9uT3BlcmF0b3I9Yj4+NCY3LG0uZGVmYXVsdFBpeGVsVmFsdWU9Yj4+NyYxLG0uZ3JpZFdpZHRoPSgwLGEucmVhZFVpbnQzMikobix1KSx1Kz00LG0uZ3JpZEhlaWdodD0oMCxhLnJlYWRVaW50MzIpKG4sdSksdSs9NCxtLmdyaWRPZmZzZXRYPTQyOTQ5NjcyOTUmKDAsYS5yZWFkVWludDMyKShuLHUpLHUrPTQsbS5ncmlkT2Zmc2V0WT00Mjk0OTY3Mjk1JigwLGEucmVhZFVpbnQzMikobix1KSx1Kz00LG0uZ3JpZFZlY3Rvclg9KDAsYS5yZWFkVWludDE2KShuLHUpLHUrPTIsbS5ncmlkVmVjdG9yWT0oMCxhLnJlYWRVaW50MTYpKG4sdSksdSs9MixzPVttLHIucmVmZXJyZWRUbyxuLHUsaV07YnJlYWs7Y2FzZSAzODpjYXNlIDM5OmNvbnN0IHk9e307eS5pbmZvPWsobix1KSx1Kz1DO2NvbnN0IHc9blt1KytdO2lmKHkubW1yPSEhKDEmdykseS50ZW1wbGF0ZT13Pj4xJjMseS5wcmVkaWN0aW9uPSEhKDgmdyksIXkubW1yKXtmb3IoaD0wPT09eS50ZW1wbGF0ZT80OjEsYz1bXSxsPTA7bDxoO2wrKyljLnB1c2goe3g6KDAsYS5yZWFkSW50OCkobix1KSx5OigwLGEucmVhZEludDgpKG4sdSsxKX0pLHUrPTI7eS5hdD1jfXM9W3ksbix1LGldO2JyZWFrO2Nhc2UgNDg6Y29uc3Qgdj17d2lkdGg6KDAsYS5yZWFkVWludDMyKShuLHUpLGhlaWdodDooMCxhLnJlYWRVaW50MzIpKG4sdSs0KSxyZXNvbHV0aW9uWDooMCxhLnJlYWRVaW50MzIpKG4sdSs4KSxyZXNvbHV0aW9uWTooMCxhLnJlYWRVaW50MzIpKG4sdSsxMil9OzQyOTQ5NjcyOTU9PT12LmhlaWdodCYmZGVsZXRlIHYuaGVpZ2h0O2NvbnN0IHg9blt1KzE2XTsoMCxhLnJlYWRVaW50MTYpKG4sdSsxNyksdi5sb3NzbGVzcz0hISgxJngpLHYucmVmaW5lbWVudD0hISgyJngpLHYuZGVmYXVsdFBpeGVsVmFsdWU9eD4+MiYxLHYuY29tYmluYXRpb25PcGVyYXRvcj14Pj4zJjMsdi5yZXF1aXJlc0J1ZmZlcj0hISgzMiZ4KSx2LmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZT0hISg2NCZ4KSxzPVt2XTticmVhaztjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDYyOmJyZWFrO2Nhc2UgNTM6cz1bci5udW1iZXIsbix1LGldO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IG8oInNlZ21lbnQgdHlwZSAiLmNvbmNhdChyLnR5cGVOYW1lLCIoIikuY29uY2F0KHIudHlwZSwiKSBpcyBub3QgaW1wbGVtZW50ZWQiKSl9Y29uc3QgZD0ib24iK3IudHlwZU5hbWU7ZCBpbiB0JiZ0W2RdLmFwcGx5KHQscyl9ZnVuY3Rpb24gRihlLHQpe2ZvcihsZXQgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKylPKGVbcl0sdCl9Y2xhc3MgSXtvblBhZ2VJbmZvcm1hdGlvbihlKXt0aGlzLmN1cnJlbnRQYWdlSW5mbz1lO2NvbnN0IHQ9ZS53aWR0aCs3Pj4zLHI9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHQqZS5oZWlnaHQpO2UuZGVmYXVsdFBpeGVsVmFsdWUmJnIuZmlsbCgyNTUpLHRoaXMuYnVmZmVyPXJ9ZHJhd0JpdG1hcChlLHQpe2NvbnN0IHI9dGhpcy5jdXJyZW50UGFnZUluZm8sbj1lLndpZHRoLGE9ZS5oZWlnaHQsaT1yLndpZHRoKzc+PjMscz1yLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZT9lLmNvbWJpbmF0aW9uT3BlcmF0b3I6ci5jb21iaW5hdGlvbk9wZXJhdG9yLGM9dGhpcy5idWZmZXIsbD0xMjg+Pig3JmUueCk7bGV0IGgsdSxkLGYsZz1lLnkqaSsoZS54Pj4zKTtzd2l0Y2gocyl7Y2FzZSAwOmZvcihoPTA7aDxhO2grKyl7Zm9yKGQ9bCxmPWcsdT0wO3U8bjt1KyspdFtoXVt1XSYmKGNbZl18PWQpLGQ+Pj0xLGR8fChkPTEyOCxmKyspO2crPWl9YnJlYWs7Y2FzZSAyOmZvcihoPTA7aDxhO2grKyl7Zm9yKGQ9bCxmPWcsdT0wO3U8bjt1KyspdFtoXVt1XSYmKGNbZl1ePWQpLGQ+Pj0xLGR8fChkPTEyOCxmKyspO2crPWl9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbygib3BlcmF0b3IgIi5jb25jYXQocywiIGlzIG5vdCBzdXBwb3J0ZWQiKSl9fW9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbihlLHQscixuKXtjb25zdCBhPWUuaW5mbyxpPW5ldyBsKHQscixuKSxzPXcoZS5tbXIsYS53aWR0aCxhLmhlaWdodCxlLnRlbXBsYXRlLGUucHJlZGljdGlvbixudWxsLGUuYXQsaSk7dGhpcy5kcmF3Qml0bWFwKGEscyl9b25JbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiguLi5hcmd1bWVudHMpfW9uU3ltYm9sRGljdGlvbmFyeShlLHQscixuLGkscyl7bGV0IGMsaDtlLmh1ZmZtYW4mJihjPWZ1bmN0aW9uKGUsdCxyKXtsZXQgbixhLGkscyxjPTA7c3dpdGNoKGUuaHVmZm1hbkRIU2VsZWN0b3Ipe2Nhc2UgMDpjYXNlIDE6bj1SKGUuaHVmZm1hbkRIU2VsZWN0b3IrNCk7YnJlYWs7Y2FzZSAzOm49RChjLHQsciksYysrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IG8oImludmFsaWQgSHVmZm1hbiBESCBzZWxlY3RvciIpfXN3aXRjaChlLmh1ZmZtYW5EV1NlbGVjdG9yKXtjYXNlIDA6Y2FzZSAxOmE9UihlLmh1ZmZtYW5EV1NlbGVjdG9yKzIpO2JyZWFrO2Nhc2UgMzphPUQoYyx0LHIpLGMrKzticmVhaztkZWZhdWx0OnRocm93IG5ldyBvKCJpbnZhbGlkIEh1ZmZtYW4gRFcgc2VsZWN0b3IiKX1yZXR1cm4gZS5iaXRtYXBTaXplU2VsZWN0b3I/KGk9RChjLHQsciksYysrKTppPVIoMSkscz1lLmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3I/RChjLHQscik6UigxKSx7dGFibGVEZWx0YUhlaWdodDpuLHRhYmxlRGVsdGFXaWR0aDphLHRhYmxlQml0bWFwU2l6ZTppLHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzOnN9fShlLHIsdGhpcy5jdXN0b21UYWJsZXMpLGg9bmV3IE4obixpLHMpKTtsZXQgdT10aGlzLnN5bWJvbHM7dXx8KHRoaXMuc3ltYm9scz11PXt9KTtjb25zdCBnPVtdO2Zvcihjb25zdCBlIG9mIHIpe2NvbnN0IHQ9dVtlXTt0JiZnLnB1c2goLi4udCl9Y29uc3QgcD1uZXcgbChuLGkscyk7dVt0XT1mdW5jdGlvbihlLHQscixuLGkscyxjLGwsaCx1LGcscCl7aWYoZSYmdCl0aHJvdyBuZXcgbygic3ltYm9sIHJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWQiKTtjb25zdCBtPVtdO2xldCBiPTAseT0oMCxhLmxvZzIpKHIubGVuZ3RoK24pO2NvbnN0IFM9Zy5kZWNvZGVyLEE9Zy5jb250ZXh0Q2FjaGU7bGV0IGssQztmb3IoZSYmKGs9UigxKSxDPVtdLHk9TWF0aC5tYXgoeSwxKSk7bS5sZW5ndGg8bjspe2IrPWU/cy50YWJsZURlbHRhSGVpZ2h0LmRlY29kZShwKTpkKEEsIklBREgiLFMpO2xldCBuPTAsYT0wO2NvbnN0IGk9ZT9DLmxlbmd0aDowO2Zvcig7Oyl7Y29uc3QgaT1lP3MudGFibGVEZWx0YVdpZHRoLmRlY29kZShwKTpkKEEsIklBRFciLFMpO2lmKG51bGw9PT1pKWJyZWFrO2xldCBvO2lmKG4rPWksYSs9bix0KXtjb25zdCBhPWQoQSwiSUFBSSIsUyk7aWYoYT4xKW89eChlLHQsbixiLDAsYSwxLHIuY29uY2F0KG0pLHksMCwwLDEsMCxzLGgsdSxnLDAscCk7ZWxzZXtjb25zdCBlPWYoQSxTLHkpLHQ9ZChBLCJJQVJEWCIsUyksYT1kKEEsIklBUkRZIixTKTtvPXYobixiLGgsZTxyLmxlbmd0aD9yW2VdOm1bZS1yLmxlbmd0aF0sdCxhLCExLHUsZyl9bS5wdXNoKG8pfWVsc2UgZT9DLnB1c2gobik6KG89dyghMSxuLGIsYywhMSxudWxsLGwsZyksbS5wdXNoKG8pKX1pZihlJiYhdCl7Y29uc3QgZT1zLnRhYmxlQml0bWFwU2l6ZS5kZWNvZGUocCk7bGV0IHQ7aWYocC5ieXRlQWxpZ24oKSwwPT09ZSl0PUIocCxhLGIpO2Vsc2V7Y29uc3Qgcj1wLmVuZCxuPXAucG9zaXRpb24rZTtwLmVuZD1uLHQ9TChwLGEsYiwhMSkscC5lbmQ9cixwLnBvc2l0aW9uPW59Y29uc3Qgcj1DLmxlbmd0aDtpZihpPT09ci0xKW0ucHVzaCh0KTtlbHNle2xldCBlLG4sYSxzLG8sYz0wO2ZvcihlPWk7ZTxyO2UrKyl7Zm9yKHM9Q1tlXSxhPWMrcyxvPVtdLG49MDtuPGI7bisrKW8ucHVzaCh0W25dLnN1YmFycmF5KGMsYSkpO20ucHVzaChvKSxjPWF9fX19Y29uc3QgTz1bXSxGPVtdO2xldCBJLFQsTT0hMTtjb25zdCBFPXIubGVuZ3RoK247Zm9yKDtGLmxlbmd0aDxFOyl7bGV0IHQ9ZT9rLmRlY29kZShwKTpkKEEsIklBRVgiLFMpO2Zvcig7dC0tOylGLnB1c2goTSk7TT0hTX1mb3IoST0wLFQ9ci5sZW5ndGg7STxUO0krKylGW0ldJiZPLnB1c2gocltJXSk7Zm9yKGxldCBlPTA7ZTxuO0krKyxlKyspRltJXSYmTy5wdXNoKG1bZV0pO3JldHVybiBPfShlLmh1ZmZtYW4sZS5yZWZpbmVtZW50LGcsZS5udW1iZXJPZk5ld1N5bWJvbHMsZS5udW1iZXJPZkV4cG9ydGVkU3ltYm9scyxjLGUudGVtcGxhdGUsZS5hdCxlLnJlZmluZW1lbnRUZW1wbGF0ZSxlLnJlZmluZW1lbnRBdCxwLGgpfW9uSW1tZWRpYXRlVGV4dFJlZ2lvbihlLHQscixuLGkpe2NvbnN0IHM9ZS5pbmZvO2xldCBjLGg7Y29uc3QgdT10aGlzLnN5bWJvbHMsZD1bXTtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PXVbZV07dCYmZC5wdXNoKC4uLnQpfWNvbnN0IGY9KDAsYS5sb2cyKShkLmxlbmd0aCk7ZS5odWZmbWFuJiYoaD1uZXcgTihyLG4saSksYz1mdW5jdGlvbihlLHQscixuLGEpe2NvbnN0IGk9W107Zm9yKGxldCBlPTA7ZTw9MzQ7ZSsrKXtjb25zdCB0PWEucmVhZEJpdHMoNCk7aS5wdXNoKG5ldyBUKFtlLHQsMCwwXSkpfWNvbnN0IHM9bmV3IEUoaSwhMSk7aS5sZW5ndGg9MDtmb3IobGV0IGU9MDtlPG47KXtjb25zdCB0PXMuZGVjb2RlKGEpO2lmKHQ+PTMyKXtsZXQgcixuLHM7c3dpdGNoKHQpe2Nhc2UgMzI6aWYoMD09PWUpdGhyb3cgbmV3IG8oIm5vIHByZXZpb3VzIHZhbHVlIGluIHN5bWJvbCBJRCB0YWJsZSIpO249YS5yZWFkQml0cygyKSszLHI9aVtlLTFdLnByZWZpeExlbmd0aDticmVhaztjYXNlIDMzOm49YS5yZWFkQml0cygzKSszLHI9MDticmVhaztjYXNlIDM0Om49YS5yZWFkQml0cyg3KSsxMSxyPTA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbygiaW52YWxpZCBjb2RlIGxlbmd0aCBpbiBzeW1ib2wgSUQgdGFibGUiKX1mb3Iocz0wO3M8bjtzKyspaS5wdXNoKG5ldyBUKFtlLHIsMCwwXSkpLGUrK31lbHNlIGkucHVzaChuZXcgVChbZSx0LDAsMF0pKSxlKyt9YS5ieXRlQWxpZ24oKTtjb25zdCBjPW5ldyBFKGksITEpO2xldCBsLGgsdSxkPTA7c3dpdGNoKGUuaHVmZm1hbkZTKXtjYXNlIDA6Y2FzZSAxOmw9UihlLmh1ZmZtYW5GUys2KTticmVhaztjYXNlIDM6bD1EKGQsdCxyKSxkKys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbygiaW52YWxpZCBIdWZmbWFuIEZTIHNlbGVjdG9yIil9c3dpdGNoKGUuaHVmZm1hbkRTKXtjYXNlIDA6Y2FzZSAxOmNhc2UgMjpoPVIoZS5odWZmbWFuRFMrOCk7YnJlYWs7Y2FzZSAzOmg9RChkLHQsciksZCsrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IG8oImludmFsaWQgSHVmZm1hbiBEUyBzZWxlY3RvciIpfXN3aXRjaChlLmh1ZmZtYW5EVCl7Y2FzZSAwOmNhc2UgMTpjYXNlIDI6dT1SKGUuaHVmZm1hbkRUKzExKTticmVhaztjYXNlIDM6dT1EKGQsdCxyKSxkKys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbygiaW52YWxpZCBIdWZmbWFuIERUIHNlbGVjdG9yIil9aWYoZS5yZWZpbmVtZW50KXRocm93IG5ldyBvKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7cmV0dXJue3N5bWJvbElEVGFibGU6Yyx0YWJsZUZpcnN0UzpsLHRhYmxlRGVsdGFTOmgsdGFibGVEZWx0YVQ6dX19KGUsdCx0aGlzLmN1c3RvbVRhYmxlcyxkLmxlbmd0aCxoKSk7Y29uc3QgZz1uZXcgbChyLG4saSkscD14KGUuaHVmZm1hbixlLnJlZmluZW1lbnQscy53aWR0aCxzLmhlaWdodCxlLmRlZmF1bHRQaXhlbFZhbHVlLGUubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMsZS5zdHJpcFNpemUsZCxmLGUudHJhbnNwb3NlZCxlLmRzT2Zmc2V0LGUucmVmZXJlbmNlQ29ybmVyLGUuY29tYmluYXRpb25PcGVyYXRvcixjLGUucmVmaW5lbWVudFRlbXBsYXRlLGUucmVmaW5lbWVudEF0LGcsZS5sb2dTdHJpcFNpemUsaCk7dGhpcy5kcmF3Qml0bWFwKHMscCl9b25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlVGV4dFJlZ2lvbiguLi5hcmd1bWVudHMpfW9uUGF0dGVybkRpY3Rpb25hcnkoZSx0LHIsbixhKXtsZXQgaT10aGlzLnBhdHRlcm5zO2l8fCh0aGlzLnBhdHRlcm5zPWk9e30pO2NvbnN0IHM9bmV3IGwocixuLGEpO2lbdF09ZnVuY3Rpb24oZSx0LHIsbixhLGkpe2NvbnN0IHM9W107ZXx8KHMucHVzaCh7eDotdCx5OjB9KSwwPT09YSYmcy5wdXNoKHt4Oi0zLHk6LTF9LHt4OjIseTotMn0se3g6LTIseTotMn0pKTtjb25zdCBvPXcoZSwobisxKSp0LHIsYSwhMSxudWxsLHMsaSksYz1bXTtmb3IobGV0IGU9MDtlPD1uO2UrKyl7Y29uc3Qgbj1bXSxhPXQqZSxpPWErdDtmb3IobGV0IGU9MDtlPHI7ZSsrKW4ucHVzaChvW2VdLnN1YmFycmF5KGEsaSkpO2MucHVzaChuKX1yZXR1cm4gY30oZS5tbXIsZS5wYXR0ZXJuV2lkdGgsZS5wYXR0ZXJuSGVpZ2h0LGUubWF4UGF0dGVybkluZGV4LGUudGVtcGxhdGUscyl9b25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbihlLHQscixuLGkpe2NvbnN0IHM9dGhpcy5wYXR0ZXJuc1t0WzBdXSxjPWUuaW5mbyxoPW5ldyBsKHIsbixpKSx1PWZ1bmN0aW9uKGUsdCxyLG4saSxzLGMsbCxoLHUsZCxmLGcscCxtKXtpZihjKXRocm93IG5ldyBvKCJza2lwIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZigwIT09bCl0aHJvdyBuZXcgbygnb3BlcmF0b3IgIicuY29uY2F0KGwsJyIgaXMgbm90IHN1cHBvcnRlZCBpbiBoYWxmdG9uZSByZWdpb24nKSk7Y29uc3QgYj1bXTtsZXQgeSx2LHg7Zm9yKHk9MDt5PGk7eSsrKXtpZih4PW5ldyBVaW50OEFycmF5KG4pLHMpZm9yKHY9MDt2PG47disrKXhbdl09cztiLnB1c2goeCl9Y29uc3QgUz10Lmxlbmd0aCxBPXRbMF0saz1BWzBdLmxlbmd0aCxDPUEubGVuZ3RoLE89KDAsYS5sb2cyKShTKSxGPVtdO2V8fChGLnB1c2goe3g6cjw9MT8zOjIseTotMX0pLDA9PT1yJiZGLnB1c2goe3g6LTMseTotMX0se3g6Mix5Oi0yfSx7eDotMix5Oi0yfSkpO2NvbnN0IEk9W107bGV0IFQsTSxFLFAsUixELEIsXyxqLFUsJDtmb3IoZSYmKFQ9bmV3IE4obS5kYXRhLG0uc3RhcnQsbS5lbmQpKSx5PU8tMTt5Pj0wO3ktLSlNPWU/TChULGgsdSwhMCk6dyghMSxoLHUsciwhMSxudWxsLEYsbSksSVt5XT1NO2ZvcihFPTA7RTx1O0UrKylmb3IoUD0wO1A8aDtQKyspe2ZvcihSPTAsRD0wLHY9Ty0xO3Y+PTA7di0tKVJePUlbdl1bRV1bUF0sRHw9Ujw8djtpZihCPXRbRF0sXz1kK0UqcCtQKmc+Pjgsaj1mK0UqZy1QKnA+PjgsXz49MCYmXytrPD1uJiZqPj0wJiZqK0M8PWkpZm9yKHk9MDt5PEM7eSsrKWZvcigkPWJbait5XSxVPUJbeV0sdj0wO3Y8azt2KyspJFtfK3ZdfD1VW3ZdO2Vsc2V7bGV0IGUsdDtmb3IoeT0wO3k8Qzt5KyspaWYodD1qK3ksISh0PDB8fHQ+PWkpKWZvcigkPWJbdF0sVT1CW3ldLHY9MDt2PGs7disrKWU9Xyt2LGU+PTAmJmU8biYmKCRbZV18PVVbdl0pfX1yZXR1cm4gYn0oZS5tbXIscyxlLnRlbXBsYXRlLGMud2lkdGgsYy5oZWlnaHQsZS5kZWZhdWx0UGl4ZWxWYWx1ZSxlLmVuYWJsZVNraXAsZS5jb21iaW5hdGlvbk9wZXJhdG9yLGUuZ3JpZFdpZHRoLGUuZ3JpZEhlaWdodCxlLmdyaWRPZmZzZXRYLGUuZ3JpZE9mZnNldFksZS5ncmlkVmVjdG9yWCxlLmdyaWRWZWN0b3JZLGgpO3RoaXMuZHJhd0JpdG1hcChjLHUpfW9uSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbigpe3RoaXMub25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiguLi5hcmd1bWVudHMpfW9uVGFibGVzKGUsdCxyLG4pe2xldCBpPXRoaXMuY3VzdG9tVGFibGVzO2l8fCh0aGlzLmN1c3RvbVRhYmxlcz1pPXt9KSxpW2VdPWZ1bmN0aW9uKGUsdCxyKXtjb25zdCBuPWVbdF0saT00Mjk0OTY3Mjk1JigwLGEucmVhZFVpbnQzMikoZSx0KzEpLHM9NDI5NDk2NzI5NSYoMCxhLnJlYWRVaW50MzIpKGUsdCs1KSxvPW5ldyBOKGUsdCs5LHIpLGM9MSsobj4+MSY3KSxsPTErKG4+PjQmNyksaD1bXTtsZXQgdSxkLGY9aTtkb3t1PW8ucmVhZEJpdHMoYyksZD1vLnJlYWRCaXRzKGwpLGgucHVzaChuZXcgVChbZix1LGQsMF0pKSxmKz0xPDxkfXdoaWxlKGY8cyk7cmV0dXJuIHU9by5yZWFkQml0cyhjKSxoLnB1c2gobmV3IFQoW2ktMSx1LDMyLDAsImxvd2VyIl0pKSx1PW8ucmVhZEJpdHMoYyksaC5wdXNoKG5ldyBUKFtzLHUsMzIsMF0pKSwxJm4mJih1PW8ucmVhZEJpdHMoYyksaC5wdXNoKG5ldyBUKFt1LDBdKSkpLG5ldyBFKGgsITEpfSh0LHIsbil9fWNsYXNzIFR7Y29uc3RydWN0b3IoZSl7Mj09PWUubGVuZ3RoPyh0aGlzLmlzT09CPSEwLHRoaXMucmFuZ2VMb3c9MCx0aGlzLnByZWZpeExlbmd0aD1lWzBdLHRoaXMucmFuZ2VMZW5ndGg9MCx0aGlzLnByZWZpeENvZGU9ZVsxXSx0aGlzLmlzTG93ZXJSYW5nZT0hMSk6KHRoaXMuaXNPT0I9ITEsdGhpcy5yYW5nZUxvdz1lWzBdLHRoaXMucHJlZml4TGVuZ3RoPWVbMV0sdGhpcy5yYW5nZUxlbmd0aD1lWzJdLHRoaXMucHJlZml4Q29kZT1lWzNdLHRoaXMuaXNMb3dlclJhbmdlPSJsb3dlciI9PT1lWzRdKX19Y2xhc3MgTXtjb25zdHJ1Y3RvcihlKXt0aGlzLmNoaWxkcmVuPVtdLGU/KHRoaXMuaXNMZWFmPSEwLHRoaXMucmFuZ2VMZW5ndGg9ZS5yYW5nZUxlbmd0aCx0aGlzLnJhbmdlTG93PWUucmFuZ2VMb3csdGhpcy5pc0xvd2VyUmFuZ2U9ZS5pc0xvd2VyUmFuZ2UsdGhpcy5pc09PQj1lLmlzT09CKTp0aGlzLmlzTGVhZj0hMX1idWlsZFRyZWUoZSx0KXtjb25zdCByPWUucHJlZml4Q29kZT4+dCYxO2lmKHQ8PTApdGhpcy5jaGlsZHJlbltyXT1uZXcgTShlKTtlbHNle2xldCBuPXRoaXMuY2hpbGRyZW5bcl07bnx8KHRoaXMuY2hpbGRyZW5bcl09bj1uZXcgTShudWxsKSksbi5idWlsZFRyZWUoZSx0LTEpfX1kZWNvZGVOb2RlKGUpe2lmKHRoaXMuaXNMZWFmKXtpZih0aGlzLmlzT09CKXJldHVybiBudWxsO2NvbnN0IHQ9ZS5yZWFkQml0cyh0aGlzLnJhbmdlTGVuZ3RoKTtyZXR1cm4gdGhpcy5yYW5nZUxvdysodGhpcy5pc0xvd2VyUmFuZ2U/LXQ6dCl9Y29uc3QgdD10aGlzLmNoaWxkcmVuW2UucmVhZEJpdCgpXTtpZighdCl0aHJvdyBuZXcgbygiaW52YWxpZCBIdWZmbWFuIGRhdGEiKTtyZXR1cm4gdC5kZWNvZGVOb2RlKGUpfX1jbGFzcyBFe2NvbnN0cnVjdG9yKGUsdCl7dHx8dGhpcy5hc3NpZ25QcmVmaXhDb2RlcyhlKSx0aGlzLnJvb3ROb2RlPW5ldyBNKG51bGwpO2ZvcihsZXQgdD0wLHI9ZS5sZW5ndGg7dDxyO3QrKyl7Y29uc3Qgcj1lW3RdO3IucHJlZml4TGVuZ3RoPjAmJnRoaXMucm9vdE5vZGUuYnVpbGRUcmVlKHIsci5wcmVmaXhMZW5ndGgtMSl9fWRlY29kZShlKXtyZXR1cm4gdGhpcy5yb290Tm9kZS5kZWNvZGVOb2RlKGUpfWFzc2lnblByZWZpeENvZGVzKGUpe2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IHI9MDtmb3IobGV0IG49MDtuPHQ7bisrKXI9TWF0aC5tYXgocixlW25dLnByZWZpeExlbmd0aCk7Y29uc3Qgbj1uZXcgVWludDMyQXJyYXkocisxKTtmb3IobGV0IHI9MDtyPHQ7cisrKW5bZVtyXS5wcmVmaXhMZW5ndGhdKys7bGV0IGEsaSxzLG89MSxjPTA7Zm9yKG5bMF09MDtvPD1yOyl7Zm9yKGM9YytuW28tMV08PDEsYT1jLGk9MDtpPHQ7KXM9ZVtpXSxzLnByZWZpeExlbmd0aD09PW8mJihzLnByZWZpeENvZGU9YSxhKyspLGkrKztvKyt9fX1jb25zdCBQPXt9O2Z1bmN0aW9uIFIoZSl7bGV0IHQscj1QW2VdO2lmKHIpcmV0dXJuIHI7c3dpdGNoKGUpe2Nhc2UgMTp0PVtbMCwxLDQsMF0sWzE2LDIsOCwyXSxbMjcyLDMsMTYsNl0sWzY1ODA4LDMsMzIsN11dO2JyZWFrO2Nhc2UgMjp0PVtbMCwxLDAsMF0sWzEsMiwwLDJdLFsyLDMsMCw2XSxbMyw0LDMsMTRdLFsxMSw1LDYsMzBdLFs3NSw2LDMyLDYyXSxbNiw2M11dO2JyZWFrO2Nhc2UgMzp0PVtbLTI1Niw4LDgsMjU0XSxbMCwxLDAsMF0sWzEsMiwwLDJdLFsyLDMsMCw2XSxbMyw0LDMsMTRdLFsxMSw1LDYsMzBdLFstMjU3LDgsMzIsMjU1LCJsb3dlciJdLFs3NSw3LDMyLDEyNl0sWzYsNjJdXTticmVhaztjYXNlIDQ6dD1bWzEsMSwwLDBdLFsyLDIsMCwyXSxbMywzLDAsNl0sWzQsNCwzLDE0XSxbMTIsNSw2LDMwXSxbNzYsNSwzMiwzMV1dO2JyZWFrO2Nhc2UgNTp0PVtbLTI1NSw3LDgsMTI2XSxbMSwxLDAsMF0sWzIsMiwwLDJdLFszLDMsMCw2XSxbNCw0LDMsMTRdLFsxMiw1LDYsMzBdLFstMjU2LDcsMzIsMTI3LCJsb3dlciJdLFs3Niw2LDMyLDYyXV07YnJlYWs7Y2FzZSA2OnQ9W1stMjA0OCw1LDEwLDI4XSxbLTEwMjQsNCw5LDhdLFstNTEyLDQsOCw5XSxbLTI1Niw0LDcsMTBdLFstMTI4LDUsNiwyOV0sWy02NCw1LDUsMzBdLFstMzIsNCw1LDExXSxbMCwyLDcsMF0sWzEyOCwzLDcsMl0sWzI1NiwzLDgsM10sWzUxMiw0LDksMTJdLFsxMDI0LDQsMTAsMTNdLFstMjA0OSw2LDMyLDYyLCJsb3dlciJdLFsyMDQ4LDYsMzIsNjNdXTticmVhaztjYXNlIDc6dD1bWy0xMDI0LDQsOSw4XSxbLTUxMiwzLDgsMF0sWy0yNTYsNCw3LDldLFstMTI4LDUsNiwyNl0sWy02NCw1LDUsMjddLFstMzIsNCw1LDEwXSxbMCw0LDUsMTFdLFszMiw1LDUsMjhdLFs2NCw1LDYsMjldLFsxMjgsNCw3LDEyXSxbMjU2LDMsOCwxXSxbNTEyLDMsOSwyXSxbMTAyNCwzLDEwLDNdLFstMTAyNSw1LDMyLDMwLCJsb3dlciJdLFsyMDQ4LDUsMzIsMzFdXTticmVhaztjYXNlIDg6dD1bWy0xNSw4LDMsMjUyXSxbLTcsOSwxLDUwOF0sWy01LDgsMSwyNTNdLFstMyw5LDAsNTA5XSxbLTIsNywwLDEyNF0sWy0xLDQsMCwxMF0sWzAsMiwxLDBdLFsyLDUsMCwyNl0sWzMsNiwwLDU4XSxbNCwzLDQsNF0sWzIwLDYsMSw1OV0sWzIyLDQsNCwxMV0sWzM4LDQsNSwxMl0sWzcwLDUsNiwyN10sWzEzNCw1LDcsMjhdLFsyNjIsNiw3LDYwXSxbMzkwLDcsOCwxMjVdLFs2NDYsNiwxMCw2MV0sWy0xNiw5LDMyLDUxMCwibG93ZXIiXSxbMTY3MCw5LDMyLDUxMV0sWzIsMV1dO2JyZWFrO2Nhc2UgOTp0PVtbLTMxLDgsNCwyNTJdLFstMTUsOSwyLDUwOF0sWy0xMSw4LDIsMjUzXSxbLTcsOSwxLDUwOV0sWy01LDcsMSwxMjRdLFstMyw0LDEsMTBdLFstMSwzLDEsMl0sWzEsMywxLDNdLFszLDUsMSwyNl0sWzUsNiwxLDU4XSxbNywzLDUsNF0sWzM5LDYsMiw1OV0sWzQzLDQsNSwxMV0sWzc1LDQsNiwxMl0sWzEzOSw1LDcsMjddLFsyNjcsNSw4LDI4XSxbNTIzLDYsOCw2MF0sWzc3OSw3LDksMTI1XSxbMTI5MSw2LDExLDYxXSxbLTMyLDksMzIsNTEwLCJsb3dlciJdLFszMzM5LDksMzIsNTExXSxbMiwwXV07YnJlYWs7Y2FzZSAxMDp0PVtbLTIxLDcsNCwxMjJdLFstNSw4LDAsMjUyXSxbLTQsNywwLDEyM10sWy0zLDUsMCwyNF0sWy0yLDIsMiwwXSxbMiw1LDAsMjVdLFszLDYsMCw1NF0sWzQsNywwLDEyNF0sWzUsOCwwLDI1M10sWzYsMiw2LDFdLFs3MCw1LDUsMjZdLFsxMDIsNiw1LDU1XSxbMTM0LDYsNiw1Nl0sWzE5OCw2LDcsNTddLFszMjYsNiw4LDU4XSxbNTgyLDYsOSw1OV0sWzEwOTQsNiwxMCw2MF0sWzIxMTgsNywxMSwxMjVdLFstMjIsOCwzMiwyNTQsImxvd2VyIl0sWzQxNjYsOCwzMiwyNTVdLFsyLDJdXTticmVhaztjYXNlIDExOnQ9W1sxLDEsMCwwXSxbMiwyLDEsMl0sWzQsNCwwLDEyXSxbNSw0LDEsMTNdLFs3LDUsMSwyOF0sWzksNSwyLDI5XSxbMTMsNiwyLDYwXSxbMTcsNywyLDEyMl0sWzIxLDcsMywxMjNdLFsyOSw3LDQsMTI0XSxbNDUsNyw1LDEyNV0sWzc3LDcsNiwxMjZdLFsxNDEsNywzMiwxMjddXTticmVhaztjYXNlIDEyOnQ9W1sxLDEsMCwwXSxbMiwyLDAsMl0sWzMsMywxLDZdLFs1LDUsMCwyOF0sWzYsNSwxLDI5XSxbOCw2LDEsNjBdLFsxMCw3LDAsMTIyXSxbMTEsNywxLDEyM10sWzEzLDcsMiwxMjRdLFsxNyw3LDMsMTI1XSxbMjUsNyw0LDEyNl0sWzQxLDgsNSwyNTRdLFs3Myw4LDMyLDI1NV1dO2JyZWFrO2Nhc2UgMTM6dD1bWzEsMSwwLDBdLFsyLDMsMCw0XSxbMyw0LDAsMTJdLFs0LDUsMCwyOF0sWzUsNCwxLDEzXSxbNywzLDMsNV0sWzE1LDYsMSw1OF0sWzE3LDYsMiw1OV0sWzIxLDYsMyw2MF0sWzI5LDYsNCw2MV0sWzQ1LDYsNSw2Ml0sWzc3LDcsNiwxMjZdLFsxNDEsNywzMiwxMjddXTticmVhaztjYXNlIDE0OnQ9W1stMiwzLDAsNF0sWy0xLDMsMCw1XSxbMCwxLDAsMF0sWzEsMywwLDZdLFsyLDMsMCw3XV07YnJlYWs7Y2FzZSAxNTp0PVtbLTI0LDcsNCwxMjRdLFstOCw2LDIsNjBdLFstNCw1LDEsMjhdLFstMiw0LDAsMTJdLFstMSwzLDAsNF0sWzAsMSwwLDBdLFsxLDMsMCw1XSxbMiw0LDAsMTNdLFszLDUsMSwyOV0sWzUsNiwyLDYxXSxbOSw3LDQsMTI1XSxbLTI1LDcsMzIsMTI2LCJsb3dlciJdLFsyNSw3LDMyLDEyN11dO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IG8oInN0YW5kYXJkIHRhYmxlIEIuIi5jb25jYXQoZSwiIGRvZXMgbm90IGV4aXN0IikpfWZvcihsZXQgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKyl0W2VdPW5ldyBUKHRbZV0pO3JldHVybiByPW5ldyBFKHQsITApLFBbZV09cixyfWNsYXNzIE57Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuZGF0YT1lLHRoaXMuc3RhcnQ9dCx0aGlzLmVuZD1yLHRoaXMucG9zaXRpb249dCx0aGlzLnNoaWZ0PS0xLHRoaXMuY3VycmVudEJ5dGU9MH1yZWFkQml0KCl7aWYodGhpcy5zaGlmdDwwKXtpZih0aGlzLnBvc2l0aW9uPj10aGlzLmVuZCl0aHJvdyBuZXcgbygiZW5kIG9mIGRhdGEgd2hpbGUgcmVhZGluZyBiaXQiKTt0aGlzLmN1cnJlbnRCeXRlPXRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdLHRoaXMuc2hpZnQ9N31jb25zdCBlPXRoaXMuY3VycmVudEJ5dGU+PnRoaXMuc2hpZnQmMTtyZXR1cm4gdGhpcy5zaGlmdC0tLGV9cmVhZEJpdHMoZSl7bGV0IHQscj0wO2Zvcih0PWUtMTt0Pj0wO3QtLSlyfD10aGlzLnJlYWRCaXQoKTw8dDtyZXR1cm4gcn1ieXRlQWxpZ24oKXt0aGlzLnNoaWZ0PS0xfW5leHQoKXtyZXR1cm4gdGhpcy5wb3NpdGlvbj49dGhpcy5lbmQ/LTE6dGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK119fWZ1bmN0aW9uIEQoZSx0LHIpe2xldCBuPTA7Zm9yKGxldCBhPTAsaT10Lmxlbmd0aDthPGk7YSsrKXtjb25zdCBpPXJbdFthXV07aWYoaSl7aWYoZT09PW4pcmV0dXJuIGk7bisrfX10aHJvdyBuZXcgbygiY2FuJ3QgZmluZCBjdXN0b20gSHVmZm1hbiB0YWJsZSIpfWZ1bmN0aW9uIEIoZSx0LHIpe2NvbnN0IG49W107Zm9yKGxldCBhPTA7YTxyO2ErKyl7Y29uc3Qgcj1uZXcgVWludDhBcnJheSh0KTtuLnB1c2gocik7Zm9yKGxldCBuPTA7bjx0O24rKylyW25dPWUucmVhZEJpdCgpO2UuYnl0ZUFsaWduKCl9cmV0dXJuIG59ZnVuY3Rpb24gTChlLHQscixuKXtjb25zdCBhPXtLOi0xLENvbHVtbnM6dCxSb3dzOnIsQmxhY2tJczE6ITAsRW5kT2ZCbG9jazpufSxpPW5ldyBzLkNDSVRURmF4RGVjb2RlcihlLGEpLG89W107bGV0IGMsbD0hMTtmb3IobGV0IGU9MDtlPHI7ZSsrKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQpO28ucHVzaChlKTtsZXQgcj0tMTtmb3IobGV0IG49MDtuPHQ7bisrKXI8MCYmKGM9aS5yZWFkTmV4dENoYXIoKSwtMT09PWMmJihjPTAsbD0hMCkscj03KSxlW25dPWM+PnImMSxyLS19aWYobiYmIWwpe2NvbnN0IGU9NTtmb3IobGV0IHQ9MDt0PGUmJi0xIT09aS5yZWFkTmV4dENoYXIoKTt0KyspO31yZXR1cm4gb310LkpiaWcySW1hZ2U9Y2xhc3N7cGFyc2VDaHVua3MoZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IEk7Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cisrKXtjb25zdCBuPWVbcl07RihBKHt9LG4uZGF0YSxuLnN0YXJ0LG4uZW5kKSx0KX1yZXR1cm4gdC5idWZmZXJ9KGUpfXBhcnNlKGUpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBKYmlnMkltYWdlLnBhcnNlIil9fX0sKGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Bcml0aG1ldGljRGVjb2Rlcj12b2lkIDA7Y29uc3Qgcj1be3FlOjIyMDE3LG5tcHM6MSxubHBzOjEsc3dpdGNoRmxhZzoxfSx7cWU6MTMzMTMsbm1wczoyLG5scHM6Nixzd2l0Y2hGbGFnOjB9LHtxZTo2MTQ1LG5tcHM6MyxubHBzOjksc3dpdGNoRmxhZzowfSx7cWU6Mjc1MyxubXBzOjQsbmxwczoxMixzd2l0Y2hGbGFnOjB9LHtxZToxMzEzLG5tcHM6NSxubHBzOjI5LHN3aXRjaEZsYWc6MH0se3FlOjU0NSxubXBzOjM4LG5scHM6MzMsc3dpdGNoRmxhZzowfSx7cWU6MjIwMTcsbm1wczo3LG5scHM6Nixzd2l0Y2hGbGFnOjF9LHtxZToyMTUwNSxubXBzOjgsbmxwczoxNCxzd2l0Y2hGbGFnOjB9LHtxZToxODQzMyxubXBzOjksbmxwczoxNCxzd2l0Y2hGbGFnOjB9LHtxZToxNDMzNyxubXBzOjEwLG5scHM6MTQsc3dpdGNoRmxhZzowfSx7cWU6MTIyODksbm1wczoxMSxubHBzOjE3LHN3aXRjaEZsYWc6MH0se3FlOjkyMTcsbm1wczoxMixubHBzOjE4LHN3aXRjaEZsYWc6MH0se3FlOjcxNjksbm1wczoxMyxubHBzOjIwLHN3aXRjaEZsYWc6MH0se3FlOjU2MzMsbm1wczoyOSxubHBzOjIxLHN3aXRjaEZsYWc6MH0se3FlOjIyMDE3LG5tcHM6MTUsbmxwczoxNCxzd2l0Y2hGbGFnOjF9LHtxZToyMTUwNSxubXBzOjE2LG5scHM6MTQsc3dpdGNoRmxhZzowfSx7cWU6MjA3Mzcsbm1wczoxNyxubHBzOjE1LHN3aXRjaEZsYWc6MH0se3FlOjE4NDMzLG5tcHM6MTgsbmxwczoxNixzd2l0Y2hGbGFnOjB9LHtxZToxNDMzNyxubXBzOjE5LG5scHM6MTcsc3dpdGNoRmxhZzowfSx7cWU6MTMzMTMsbm1wczoyMCxubHBzOjE4LHN3aXRjaEZsYWc6MH0se3FlOjEyMjg5LG5tcHM6MjEsbmxwczoxOSxzd2l0Y2hGbGFnOjB9LHtxZToxMDI0MSxubXBzOjIyLG5scHM6MTksc3dpdGNoRmxhZzowfSx7cWU6OTIxNyxubXBzOjIzLG5scHM6MjAsc3dpdGNoRmxhZzowfSx7cWU6ODcwNSxubXBzOjI0LG5scHM6MjEsc3dpdGNoRmxhZzowfSx7cWU6NzE2OSxubXBzOjI1LG5scHM6MjIsc3dpdGNoRmxhZzowfSx7cWU6NjE0NSxubXBzOjI2LG5scHM6MjMsc3dpdGNoRmxhZzowfSx7cWU6NTYzMyxubXBzOjI3LG5scHM6MjQsc3dpdGNoRmxhZzowfSx7cWU6NTEyMSxubXBzOjI4LG5scHM6MjUsc3dpdGNoRmxhZzowfSx7cWU6NDYwOSxubXBzOjI5LG5scHM6MjYsc3dpdGNoRmxhZzowfSx7cWU6NDM1MyxubXBzOjMwLG5scHM6Mjcsc3dpdGNoRmxhZzowfSx7cWU6Mjc1MyxubXBzOjMxLG5scHM6Mjgsc3dpdGNoRmxhZzowfSx7cWU6MjQ5NyxubXBzOjMyLG5scHM6Mjksc3dpdGNoRmxhZzowfSx7cWU6MjIwOSxubXBzOjMzLG5scHM6MzAsc3dpdGNoRmxhZzowfSx7cWU6MTMxMyxubXBzOjM0LG5scHM6MzEsc3dpdGNoRmxhZzowfSx7cWU6MTA4OSxubXBzOjM1LG5scHM6MzIsc3dpdGNoRmxhZzowfSx7cWU6NjczLG5tcHM6MzYsbmxwczozMyxzd2l0Y2hGbGFnOjB9LHtxZTo1NDUsbm1wczozNyxubHBzOjM0LHN3aXRjaEZsYWc6MH0se3FlOjMyMSxubXBzOjM4LG5scHM6MzUsc3dpdGNoRmxhZzowfSx7cWU6MjczLG5tcHM6MzksbmxwczozNixzd2l0Y2hGbGFnOjB9LHtxZToxMzMsbm1wczo0MCxubHBzOjM3LHN3aXRjaEZsYWc6MH0se3FlOjczLG5tcHM6NDEsbmxwczozOCxzd2l0Y2hGbGFnOjB9LHtxZTozNyxubXBzOjQyLG5scHM6Mzksc3dpdGNoRmxhZzowfSx7cWU6MjEsbm1wczo0MyxubHBzOjQwLHN3aXRjaEZsYWc6MH0se3FlOjksbm1wczo0NCxubHBzOjQxLHN3aXRjaEZsYWc6MH0se3FlOjUsbm1wczo0NSxubHBzOjQyLHN3aXRjaEZsYWc6MH0se3FlOjEsbm1wczo0NSxubHBzOjQzLHN3aXRjaEZsYWc6MH0se3FlOjIyMDE3LG5tcHM6NDYsbmxwczo0Nixzd2l0Y2hGbGFnOjB9XTt0LkFyaXRobWV0aWNEZWNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxyKXt0aGlzLmRhdGE9ZSx0aGlzLmJwPXQsdGhpcy5kYXRhRW5kPXIsdGhpcy5jaGlnaD1lW3RdLHRoaXMuY2xvdz0wLHRoaXMuYnl0ZUluKCksdGhpcy5jaGlnaD10aGlzLmNoaWdoPDw3JjY1NTM1fHRoaXMuY2xvdz4+OSYxMjcsdGhpcy5jbG93PXRoaXMuY2xvdzw8NyY2NTUzNSx0aGlzLmN0LT03LHRoaXMuYT0zMjc2OH1ieXRlSW4oKXtjb25zdCBlPXRoaXMuZGF0YTtsZXQgdD10aGlzLmJwOzI1NT09PWVbdF0/ZVt0KzFdPjE0Mz8odGhpcy5jbG93Kz02NTI4MCx0aGlzLmN0PTgpOih0KyssdGhpcy5jbG93Kz1lW3RdPDw5LHRoaXMuY3Q9Nyx0aGlzLmJwPXQpOih0KyssdGhpcy5jbG93Kz10PHRoaXMuZGF0YUVuZD9lW3RdPDw4OjY1MjgwLHRoaXMuY3Q9OCx0aGlzLmJwPXQpLHRoaXMuY2xvdz42NTUzNSYmKHRoaXMuY2hpZ2grPXRoaXMuY2xvdz4+MTYsdGhpcy5jbG93Jj02NTUzNSl9cmVhZEJpdChlLHQpe2xldCBuPWVbdF0+PjEsYT0xJmVbdF07Y29uc3QgaT1yW25dLHM9aS5xZTtsZXQgbyxjPXRoaXMuYS1zO2lmKHRoaXMuY2hpZ2g8cyljPHM/KGM9cyxvPWEsbj1pLm5tcHMpOihjPXMsbz0xXmEsMT09PWkuc3dpdGNoRmxhZyYmKGE9byksbj1pLm5scHMpO2Vsc2V7aWYodGhpcy5jaGlnaC09cywwIT0oMzI3NjgmYykpcmV0dXJuIHRoaXMuYT1jLGE7YzxzPyhvPTFeYSwxPT09aS5zd2l0Y2hGbGFnJiYoYT1vKSxuPWkubmxwcyk6KG89YSxuPWkubm1wcyl9ZG97MD09PXRoaXMuY3QmJnRoaXMuYnl0ZUluKCksYzw8PTEsdGhpcy5jaGlnaD10aGlzLmNoaWdoPDwxJjY1NTM1fHRoaXMuY2xvdz4+MTUmMSx0aGlzLmNsb3c9dGhpcy5jbG93PDwxJjY1NTM1LHRoaXMuY3QtLX13aGlsZSgwPT0oMzI3NjgmYykpO3JldHVybiB0aGlzLmE9YyxlW3RdPW48PDF8YSxvfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5KcGVnU3RyZWFtPXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNjgpLGE9cigxNTApLGk9cigxNzcpLHM9cigxNDQpO2NsYXNzIG8gZXh0ZW5kcyBuLkRlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQscil7bGV0IG47Zm9yKDstMSE9PShuPWUuZ2V0Qnl0ZSgpKTspaWYoMjU1PT09bil7ZS5za2lwKC0xKTticmVha31zdXBlcih0KSx0aGlzLnN0cmVhbT1lLHRoaXMuZGljdD1lLmRpY3QsdGhpcy5tYXliZUxlbmd0aD10LHRoaXMucGFyYW1zPXJ9Z2V0IGJ5dGVzKCl7cmV0dXJuKDAscy5zaGFkb3cpKHRoaXMsImJ5dGVzIix0aGlzLnN0cmVhbS5nZXRCeXRlcyh0aGlzLm1heWJlTGVuZ3RoKSl9ZW5zdXJlQnVmZmVyKGUpe31yZWFkQmxvY2soKXtpZih0aGlzLmVvZilyZXR1cm47Y29uc3QgZT17ZGVjb2RlVHJhbnNmb3JtOnZvaWQgMCxjb2xvclRyYW5zZm9ybTp2b2lkIDB9LHQ9dGhpcy5kaWN0LmdldEFycmF5KCJEIiwiRGVjb2RlIik7aWYoKHRoaXMuZm9yY2VSR0JBfHx0aGlzLmZvcmNlUkdCKSYmQXJyYXkuaXNBcnJheSh0KSl7Y29uc3Qgcj10aGlzLmRpY3QuZ2V0KCJCUEMiLCJCaXRzUGVyQ29tcG9uZW50Iil8fDgsbj10Lmxlbmd0aCxhPW5ldyBJbnQzMkFycmF5KG4pO2xldCBpPSExO2NvbnN0IHM9KDE8PHIpLTE7Zm9yKGxldCBlPTA7ZTxuO2UrPTIpYVtlXT0yNTYqKHRbZSsxXS10W2VdKXwwLGFbZSsxXT10W2VdKnN8MCwyNTY9PT1hW2VdJiYwPT09YVtlKzFdfHwoaT0hMCk7aSYmKGUuZGVjb2RlVHJhbnNmb3JtPWEpfWlmKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgYS5EaWN0KXtjb25zdCB0PXRoaXMucGFyYW1zLmdldCgiQ29sb3JUcmFuc2Zvcm0iKTtOdW1iZXIuaXNJbnRlZ2VyKHQpJiYoZS5jb2xvclRyYW5zZm9ybT10KX1jb25zdCByPW5ldyBpLkpwZWdJbWFnZShlKTtyLnBhcnNlKHRoaXMuYnl0ZXMpO2NvbnN0IG49ci5nZXREYXRhKHt3aWR0aDp0aGlzLmRyYXdXaWR0aCxoZWlnaHQ6dGhpcy5kcmF3SGVpZ2h0LGZvcmNlUkdCQTp0aGlzLmZvcmNlUkdCQSxmb3JjZVJHQjp0aGlzLmZvcmNlUkdCLGlzU291cmNlUERGOiEwfSk7dGhpcy5idWZmZXI9bix0aGlzLmJ1ZmZlckxlbmd0aD1uLmxlbmd0aCx0aGlzLmVvZj0hMH19dC5KcGVnU3RyZWFtPW99LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5KcGVnSW1hZ2U9dm9pZCAwLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDEzOSk7dmFyIG49cigxNDQpLGE9cigxNzgpLGk9cigxNDkpO2NsYXNzIHMgZXh0ZW5kcyBuLkJhc2VFeGNlcHRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoIkpQRUcgZXJyb3I6ICIuY29uY2F0KGUpLCJKcGVnRXJyb3IiKX19Y2xhc3MgbyBleHRlbmRzIG4uQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsIkROTE1hcmtlckVycm9yIiksdGhpcy5zY2FuTGluZXM9dH19Y2xhc3MgYyBleHRlbmRzIG4uQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJFT0lNYXJrZXJFcnJvciIpfX1jb25zdCBsPW5ldyBVaW50OEFycmF5KFswLDEsOCwxNiw5LDIsMywxMCwxNywyNCwzMiwyNSwxOCwxMSw0LDUsMTIsMTksMjYsMzMsNDAsNDgsNDEsMzQsMjcsMjAsMTMsNiw3LDE0LDIxLDI4LDM1LDQyLDQ5LDU2LDU3LDUwLDQzLDM2LDI5LDIyLDE1LDIzLDMwLDM3LDQ0LDUxLDU4LDU5LDUyLDQ1LDM4LDMxLDM5LDQ2LDUzLDYwLDYxLDU0LDQ3LDU1LDYyLDYzXSksaD00MDE3LHU9Nzk5LGQ9MzQwNixmPTIyNzYsZz0xNTY3LHA9Mzc4NCxtPTU3OTMsYj0yODk2O2Z1bmN0aW9uIHkoZSx0KXtsZXQgcixuLGE9MCxpPTE2O2Zvcig7aT4wJiYhZVtpLTFdOylpLS07Y29uc3Qgcz1be2NoaWxkcmVuOltdLGluZGV4OjB9XTtsZXQgbyxjPXNbMF07Zm9yKHI9MDtyPGk7cisrKXtmb3Iobj0wO248ZVtyXTtuKyspe2ZvcihjPXMucG9wKCksYy5jaGlsZHJlbltjLmluZGV4XT10W2FdO2MuaW5kZXg+MDspYz1zLnBvcCgpO2ZvcihjLmluZGV4Kysscy5wdXNoKGMpO3MubGVuZ3RoPD1yOylzLnB1c2gobz17Y2hpbGRyZW46W10saW5kZXg6MH0pLGMuY2hpbGRyZW5bYy5pbmRleF09by5jaGlsZHJlbixjPW87YSsrfXIrMTxpJiYocy5wdXNoKG89e2NoaWxkcmVuOltdLGluZGV4OjB9KSxjLmNoaWxkcmVuW2MuaW5kZXhdPW8uY2hpbGRyZW4sYz1vKX1yZXR1cm4gc1swXS5jaGlsZHJlbn1mdW5jdGlvbiB3KGUsdCxyKXtyZXR1cm4gNjQqKChlLmJsb2Nrc1BlckxpbmUrMSkqdCtyKX1mdW5jdGlvbiB2KGUsdCxyLGEsaCx1LGQsZixnKXtsZXQgcD1hcmd1bWVudHMubGVuZ3RoPjkmJnZvaWQgMCE9PWFyZ3VtZW50c1s5XSYmYXJndW1lbnRzWzldO2NvbnN0IG09ci5tY3VzUGVyTGluZSxiPXIucHJvZ3Jlc3NpdmUseT10O2xldCB2PTAseD0wO2Z1bmN0aW9uIFMoKXtpZih4PjApcmV0dXJuIHgtLSx2Pj54JjE7aWYodj1lW3QrK10sMjU1PT09dil7Y29uc3Qgbj1lW3QrK107aWYobil7aWYoMjIwPT09biYmcCl7dCs9Mjtjb25zdCBuPSgwLGkucmVhZFVpbnQxNikoZSx0KTtpZih0Kz0yLG4+MCYmbiE9PXIuc2NhbkxpbmVzKXRocm93IG5ldyBvKCJGb3VuZCBETkwgbWFya2VyICgweEZGREMpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIixuKX1lbHNlIGlmKDIxNz09PW4pe2lmKHApe2NvbnN0IGU9TSooOD09PXIucHJlY2lzaW9uPzg6MCk7aWYoZT4wJiZNYXRoLnJvdW5kKHIuc2NhbkxpbmVzL2UpPj01KXRocm93IG5ldyBvKCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhLCBwb3NzaWJseSBjYXVzZWQgYnkgaW5jb3JyZWN0IGBzY2FuTGluZXNgIHBhcmFtZXRlciIsZSl9dGhyb3cgbmV3IGMoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEiKX10aHJvdyBuZXcgcygidW5leHBlY3RlZCBtYXJrZXIgIi5jb25jYXQoKHY8PDh8bikudG9TdHJpbmcoMTYpKSl9fXJldHVybiB4PTcsdj4+Pjd9ZnVuY3Rpb24gayhlKXtsZXQgdD1lO2Zvcig7Oyl7c3dpdGNoKHQ9dFtTKCldLHR5cGVvZiB0KXtjYXNlIm51bWJlciI6cmV0dXJuIHQ7Y2FzZSJvYmplY3QiOmNvbnRpbnVlfXRocm93IG5ldyBzKCJpbnZhbGlkIGh1ZmZtYW4gc2VxdWVuY2UiKX19ZnVuY3Rpb24gQyhlKXtsZXQgdD0wO2Zvcig7ZT4wOyl0PXQ8PDF8UygpLGUtLTtyZXR1cm4gdH1mdW5jdGlvbiBPKGUpe2lmKDE9PT1lKXJldHVybiAxPT09UygpPzE6LTE7Y29uc3QgdD1DKGUpO3JldHVybiB0Pj0xPDxlLTE/dDp0KygtMTw8ZSkrMX1sZXQgRixJPTAsVD0wLE09MDtmdW5jdGlvbiBFKGUsdCxyLG4sYSl7Y29uc3QgaT1yJW07TT0oci9tfDApKmUudituO2NvbnN0IHM9aSplLmgrYTt0KGUsdyhlLE0scykpfWZ1bmN0aW9uIFAoZSx0LHIpe009ci9lLmJsb2Nrc1BlckxpbmV8MDtjb25zdCBuPXIlZS5ibG9ja3NQZXJMaW5lO3QoZSx3KGUsTSxuKSl9Y29uc3QgUj1hLmxlbmd0aDtsZXQgTixELEIsTCxfLGo7aj1iPzA9PT11PzA9PT1mP2Z1bmN0aW9uKGUsdCl7Y29uc3Qgcj1rKGUuaHVmZm1hblRhYmxlREMpLG49MD09PXI/MDpPKHIpPDxnO2UuYmxvY2tEYXRhW3RdPWUucHJlZCs9bn06ZnVuY3Rpb24oZSx0KXtlLmJsb2NrRGF0YVt0XXw9UygpPDxnfTowPT09Zj9mdW5jdGlvbihlLHQpe2lmKEk+MClyZXR1cm4gdm9pZCBJLS07bGV0IHI9dTtjb25zdCBuPWQ7Zm9yKDtyPD1uOyl7Y29uc3Qgbj1rKGUuaHVmZm1hblRhYmxlQUMpLGE9MTUmbixpPW4+PjQ7aWYoMD09PWEpe2lmKGk8MTUpe0k9QyhpKSsoMTw8aSktMTticmVha31yKz0xNjtjb250aW51ZX1yKz1pO2NvbnN0IHM9bFtyXTtlLmJsb2NrRGF0YVt0K3NdPU8oYSkqKDE8PGcpLHIrK319OmZ1bmN0aW9uKGUsdCl7bGV0IHI9dTtjb25zdCBuPWQ7bGV0IGEsaSxvPTA7Zm9yKDtyPD1uOyl7Y29uc3Qgbj10K2xbcl0sYz1lLmJsb2NrRGF0YVtuXTwwPy0xOjE7c3dpdGNoKFQpe2Nhc2UgMDppZihpPWsoZS5odWZmbWFuVGFibGVBQyksYT0xNSZpLG89aT4+NCwwPT09YSlvPDE1PyhJPUMobykrKDE8PG8pLFQ9NCk6KG89MTYsVD0xKTtlbHNle2lmKDEhPT1hKXRocm93IG5ldyBzKCJpbnZhbGlkIEFDbiBlbmNvZGluZyIpO0Y9TyhhKSxUPW8/MjozfWNvbnRpbnVlO2Nhc2UgMTpjYXNlIDI6ZS5ibG9ja0RhdGFbbl0/ZS5ibG9ja0RhdGFbbl0rPWMqKFMoKTw8Zyk6KG8tLSwwPT09byYmKFQ9Mj09PVQ/MzowKSk7YnJlYWs7Y2FzZSAzOmUuYmxvY2tEYXRhW25dP2UuYmxvY2tEYXRhW25dKz1jKihTKCk8PGcpOihlLmJsb2NrRGF0YVtuXT1GPDxnLFQ9MCk7YnJlYWs7Y2FzZSA0OmUuYmxvY2tEYXRhW25dJiYoZS5ibG9ja0RhdGFbbl0rPWMqKFMoKTw8ZykpfXIrK300PT09VCYmKEktLSwwPT09SSYmKFQ9MCkpfTpmdW5jdGlvbihlLHQpe2NvbnN0IHI9ayhlLmh1ZmZtYW5UYWJsZURDKSxuPTA9PT1yPzA6TyhyKTtlLmJsb2NrRGF0YVt0XT1lLnByZWQrPW47bGV0IGE9MTtmb3IoO2E8NjQ7KXtjb25zdCByPWsoZS5odWZmbWFuVGFibGVBQyksbj0xNSZyLGk9cj4+NDtpZigwPT09bil7aWYoaTwxNSlicmVhazthKz0xNjtjb250aW51ZX1hKz1pO2NvbnN0IHM9bFthXTtlLmJsb2NrRGF0YVt0K3NdPU8obiksYSsrfX07bGV0IFUsJD0wO2NvbnN0IFg9MT09PVI/YVswXS5ibG9ja3NQZXJMaW5lKmFbMF0uYmxvY2tzUGVyQ29sdW1uOm0qci5tY3VzUGVyQ29sdW1uO2xldCBILHE7Zm9yKDskPD1YOyl7Y29uc3Qgcj1oP01hdGgubWluKFgtJCxoKTpYO2lmKHI+MCl7Zm9yKEQ9MDtEPFI7RCsrKWFbRF0ucHJlZD0wO2lmKEk9MCwxPT09Uilmb3IoTj1hWzBdLF89MDtfPHI7XysrKVAoTixqLCQpLCQrKztlbHNlIGZvcihfPTA7XzxyO18rKyl7Zm9yKEQ9MDtEPFI7RCsrKWZvcihOPWFbRF0sSD1OLmgscT1OLnYsQj0wO0I8cTtCKyspZm9yKEw9MDtMPEg7TCsrKUUoTixqLCQsQixMKTskKyt9fWlmKHg9MCxVPUEoZSx0KSwhVSlicmVhaztpZihVLmludmFsaWQpe2NvbnN0IGU9cj4wPyJ1bmV4cGVjdGVkIjoiZXhjZXNzaXZlIjsoMCxuLndhcm4pKCJkZWNvZGVTY2FuIC0gIi5jb25jYXQoZSwiIE1DVSBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogIikuY29uY2F0KFUuaW52YWxpZCkpLHQ9VS5vZmZzZXR9aWYoIShVLm1hcmtlcj49NjU0ODgmJlUubWFya2VyPD02NTQ5NSkpYnJlYWs7dCs9Mn1yZXR1cm4gdC15fWZ1bmN0aW9uIHgoZSx0LHIpe2NvbnN0IG49ZS5xdWFudGl6YXRpb25UYWJsZSxhPWUuYmxvY2tEYXRhO2xldCBpLG8sYyxsLHksdyx2LHgsUyxBLGssQyxPLEYsSSxULE07aWYoIW4pdGhyb3cgbmV3IHMoIm1pc3NpbmcgcmVxdWlyZWQgUXVhbnRpemF0aW9uIFRhYmxlLiIpO2ZvcihsZXQgZT0wO2U8NjQ7ZSs9OClTPWFbdCtlXSxBPWFbdCtlKzFdLGs9YVt0K2UrMl0sQz1hW3QrZSszXSxPPWFbdCtlKzRdLEY9YVt0K2UrNV0sST1hW3QrZSs2XSxUPWFbdCtlKzddLFMqPW5bZV0sMCE9KEF8a3xDfE98RnxJfFQpPyhBKj1uW2UrMV0sayo9bltlKzJdLEMqPW5bZSszXSxPKj1uW2UrNF0sRio9bltlKzVdLEkqPW5bZSs2XSxUKj1uW2UrN10saT1tKlMrMTI4Pj44LG89bSpPKzEyOD4+OCxjPWssbD1JLHk9YiooQS1UKSsxMjg+PjgseD1iKihBK1QpKzEyOD4+OCx3PUM8PDQsdj1GPDw0LGk9aStvKzE+PjEsbz1pLW8sTT1jKnArbCpnKzEyOD4+OCxjPWMqZy1sKnArMTI4Pj44LGw9TSx5PXkrdisxPj4xLHY9eS12LHg9eCt3KzE+PjEsdz14LXcsaT1pK2wrMT4+MSxsPWktbCxvPW8rYysxPj4xLGM9by1jLE09eSpmK3gqZCsyMDQ4Pj4xMix5PXkqZC14KmYrMjA0OD4+MTIseD1NLE09dyp1K3YqaCsyMDQ4Pj4xMix3PXcqaC12KnUrMjA0OD4+MTIsdj1NLHJbZV09aSt4LHJbZSs3XT1pLXgscltlKzFdPW8rdixyW2UrNl09by12LHJbZSsyXT1jK3cscltlKzVdPWMtdyxyW2UrM109bCt5LHJbZSs0XT1sLXkpOihNPW0qUys1MTI+PjEwLHJbZV09TSxyW2UrMV09TSxyW2UrMl09TSxyW2UrM109TSxyW2UrNF09TSxyW2UrNV09TSxyW2UrNl09TSxyW2UrN109TSk7Zm9yKGxldCBlPTA7ZTw4OysrZSlTPXJbZV0sQT1yW2UrOF0saz1yW2UrMTZdLEM9cltlKzI0XSxPPXJbZSszMl0sRj1yW2UrNDBdLEk9cltlKzQ4XSxUPXJbZSs1Nl0sMCE9KEF8a3xDfE98RnxJfFQpPyhpPW0qUysyMDQ4Pj4xMixvPW0qTysyMDQ4Pj4xMixjPWssbD1JLHk9YiooQS1UKSsyMDQ4Pj4xMix4PWIqKEErVCkrMjA0OD4+MTIsdz1DLHY9RixpPTQxMTIrKGkrbysxPj4xKSxvPWktbyxNPWMqcCtsKmcrMjA0OD4+MTIsYz1jKmctbCpwKzIwNDg+PjEyLGw9TSx5PXkrdisxPj4xLHY9eS12LHg9eCt3KzE+PjEsdz14LXcsaT1pK2wrMT4+MSxsPWktbCxvPW8rYysxPj4xLGM9by1jLE09eSpmK3gqZCsyMDQ4Pj4xMix5PXkqZC14KmYrMjA0OD4+MTIseD1NLE09dyp1K3YqaCsyMDQ4Pj4xMix3PXcqaC12KnUrMjA0OD4+MTIsdj1NLFM9aSt4LFQ9aS14LEE9byt2LEk9by12LGs9Yyt3LEY9Yy13LEM9bCt5LE89bC15LFM8MTY/Uz0wOlM+PTQwODA/Uz0yNTU6Uz4+PTQsQTwxNj9BPTA6QT49NDA4MD9BPTI1NTpBPj49NCxrPDE2P2s9MDprPj00MDgwP2s9MjU1Oms+Pj00LEM8MTY/Qz0wOkM+PTQwODA/Qz0yNTU6Qz4+PTQsTzwxNj9PPTA6Tz49NDA4MD9PPTI1NTpPPj49NCxGPDE2P0Y9MDpGPj00MDgwP0Y9MjU1OkY+Pj00LEk8MTY/ST0wOkk+PTQwODA/ST0yNTU6ST4+PTQsVDwxNj9UPTA6VD49NDA4MD9UPTI1NTpUPj49NCxhW3QrZV09UyxhW3QrZSs4XT1BLGFbdCtlKzE2XT1rLGFbdCtlKzI0XT1DLGFbdCtlKzMyXT1PLGFbdCtlKzQwXT1GLGFbdCtlKzQ4XT1JLGFbdCtlKzU2XT1UKTooTT1tKlMrODE5Mj4+MTQsTT1NPC0yMDQwPzA6TT49MjAyND8yNTU6TSsyMDU2Pj40LGFbdCtlXT1NLGFbdCtlKzhdPU0sYVt0K2UrMTZdPU0sYVt0K2UrMjRdPU0sYVt0K2UrMzJdPU0sYVt0K2UrNDBdPU0sYVt0K2UrNDhdPU0sYVt0K2UrNTZdPU0pfWZ1bmN0aW9uIFMoZSx0KXtjb25zdCByPXQuYmxvY2tzUGVyTGluZSxuPXQuYmxvY2tzUGVyQ29sdW1uLGE9bmV3IEludDE2QXJyYXkoNjQpO2ZvcihsZXQgZT0wO2U8bjtlKyspZm9yKGxldCBuPTA7bjxyO24rKyl4KHQsdyh0LGUsbiksYSk7cmV0dXJuIHQuYmxvY2tEYXRhfWZ1bmN0aW9uIEEoZSx0KXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dDtjb25zdCBuPWUubGVuZ3RoLTE7bGV0IGE9cjx0P3I6dDtpZih0Pj1uKXJldHVybiBudWxsO2NvbnN0IHM9KDAsaS5yZWFkVWludDE2KShlLHQpO2lmKHM+PTY1NDcyJiZzPD02NTUzNClyZXR1cm57aW52YWxpZDpudWxsLG1hcmtlcjpzLG9mZnNldDp0fTtsZXQgbz0oMCxpLnJlYWRVaW50MTYpKGUsYSk7Zm9yKDshKG8+PTY1NDcyJiZvPD02NTUzNCk7KXtpZigrK2E+PW4pcmV0dXJuIG51bGw7bz0oMCxpLnJlYWRVaW50MTYpKGUsYSl9cmV0dXJue2ludmFsaWQ6cy50b1N0cmluZygxNiksbWFya2VyOm8sb2Zmc2V0OmF9fXQuSnBlZ0ltYWdlPWNsYXNze2NvbnN0cnVjdG9yKCl7bGV0e2RlY29kZVRyYW5zZm9ybTplPW51bGwsY29sb3JUcmFuc2Zvcm06dD0tMX09YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3RoaXMuX2RlY29kZVRyYW5zZm9ybT1lLHRoaXMuX2NvbG9yVHJhbnNmb3JtPXR9cGFyc2UoZSl7bGV0e2RubFNjYW5MaW5lczp0PW51bGx9PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtmdW5jdGlvbiByKCl7Y29uc3QgdD0oMCxpLnJlYWRVaW50MTYpKGUsZCk7ZCs9MjtsZXQgcj1kK3QtMjtjb25zdCBhPUEoZSxyLGQpO251bGwhPWEmJmEuaW52YWxpZCYmKCgwLG4ud2FybikoInJlYWREYXRhQmxvY2sgLSBpbmNvcnJlY3QgbGVuZ3RoLCBjdXJyZW50IG1hcmtlciBpczogIithLmludmFsaWQpLHI9YS5vZmZzZXQpO2NvbnN0IHM9ZS5zdWJhcnJheShkLHIpO3JldHVybiBkKz1zLmxlbmd0aCxzfWZ1bmN0aW9uIGEoZSl7Y29uc3QgdD1NYXRoLmNlaWwoZS5zYW1wbGVzUGVyTGluZS84L2UubWF4SCkscj1NYXRoLmNlaWwoZS5zY2FuTGluZXMvOC9lLm1heFYpO2Zvcihjb25zdCBuIG9mIGUuY29tcG9uZW50cyl7Y29uc3QgYT1NYXRoLmNlaWwoTWF0aC5jZWlsKGUuc2FtcGxlc1BlckxpbmUvOCkqbi5oL2UubWF4SCksaT1NYXRoLmNlaWwoTWF0aC5jZWlsKGUuc2NhbkxpbmVzLzgpKm4udi9lLm1heFYpLHM9dCpuLmgsbz1yKm4udio2NCoocysxKTtuLmJsb2NrRGF0YT1uZXcgSW50MTZBcnJheShvKSxuLmJsb2Nrc1BlckxpbmU9YSxuLmJsb2Nrc1BlckNvbHVtbj1pfWUubWN1c1BlckxpbmU9dCxlLm1jdXNQZXJDb2x1bW49cn1sZXQgaCx1LGQ9MCxmPW51bGwsZz1udWxsLHA9MDtjb25zdCBtPVtdLGI9W10sdz1bXTtsZXQgeD0oMCxpLnJlYWRVaW50MTYpKGUsZCk7aWYoZCs9Miw2NTQ5NiE9PXgpdGhyb3cgbmV3IHMoIlNPSSBub3QgZm91bmQiKTt4PSgwLGkucmVhZFVpbnQxNikoZSxkKSxkKz0yO2U6Zm9yKDs2NTQ5NyE9PXg7KXtsZXQgUyxrLEM7c3dpdGNoKHgpe2Nhc2UgNjU1MDQ6Y2FzZSA2NTUwNTpjYXNlIDY1NTA2OmNhc2UgNjU1MDc6Y2FzZSA2NTUwODpjYXNlIDY1NTA5OmNhc2UgNjU1MTA6Y2FzZSA2NTUxMTpjYXNlIDY1NTEyOmNhc2UgNjU1MTM6Y2FzZSA2NTUxNDpjYXNlIDY1NTE1OmNhc2UgNjU1MTY6Y2FzZSA2NTUxNzpjYXNlIDY1NTE4OmNhc2UgNjU1MTk6Y2FzZSA2NTUzNDpjb25zdCBPPXIoKTs2NTUwND09PXgmJjc0PT09T1swXSYmNzA9PT1PWzFdJiY3Mz09PU9bMl0mJjcwPT09T1szXSYmMD09PU9bNF0mJihmPXt2ZXJzaW9uOnttYWpvcjpPWzVdLG1pbm9yOk9bNl19LGRlbnNpdHlVbml0czpPWzddLHhEZW5zaXR5Ok9bOF08PDh8T1s5XSx5RGVuc2l0eTpPWzEwXTw8OHxPWzExXSx0aHVtYldpZHRoOk9bMTJdLHRodW1iSGVpZ2h0Ok9bMTNdLHRodW1iRGF0YTpPLnN1YmFycmF5KDE0LDE0KzMqT1sxMl0qT1sxM10pfSksNjU1MTg9PT14JiY2NT09PU9bMF0mJjEwMD09PU9bMV0mJjExMT09PU9bMl0mJjk4PT09T1szXSYmMTAxPT09T1s0XSYmKGc9e3ZlcnNpb246T1s1XTw8OHxPWzZdLGZsYWdzMDpPWzddPDw4fE9bOF0sZmxhZ3MxOk9bOV08PDh8T1sxMF0sdHJhbnNmb3JtQ29kZTpPWzExXX0pO2JyZWFrO2Nhc2UgNjU0OTk6Y29uc3QgRj0oMCxpLnJlYWRVaW50MTYpKGUsZCk7ZCs9Mjtjb25zdCBJPUYrZC0yO2xldCBUO2Zvcig7ZDxJOyl7Y29uc3QgdD1lW2QrK10scj1uZXcgVWludDE2QXJyYXkoNjQpO2lmKHQ+PjQ9PTApZm9yKGs9MDtrPDY0O2srKylUPWxba10scltUXT1lW2QrK107ZWxzZXtpZih0Pj40IT0xKXRocm93IG5ldyBzKCJEUVQgLSBpbnZhbGlkIHRhYmxlIHNwZWMiKTtmb3Ioaz0wO2s8NjQ7aysrKVQ9bFtrXSxyW1RdPSgwLGkucmVhZFVpbnQxNikoZSxkKSxkKz0yfW1bMTUmdF09cn1icmVhaztjYXNlIDY1NDcyOmNhc2UgNjU0NzM6Y2FzZSA2NTQ3NDppZihoKXRocm93IG5ldyBzKCJPbmx5IHNpbmdsZSBmcmFtZSBKUEVHcyBzdXBwb3J0ZWQiKTtkKz0yLGg9e30saC5leHRlbmRlZD02NTQ3Mz09PXgsaC5wcm9ncmVzc2l2ZT02NTQ3ND09PXgsaC5wcmVjaXNpb249ZVtkKytdO2NvbnN0IE09KDAsaS5yZWFkVWludDE2KShlLGQpO2QrPTIsaC5zY2FuTGluZXM9dHx8TSxoLnNhbXBsZXNQZXJMaW5lPSgwLGkucmVhZFVpbnQxNikoZSxkKSxkKz0yLGguY29tcG9uZW50cz1bXSxoLmNvbXBvbmVudElkcz17fTtjb25zdCBFPWVbZCsrXTtsZXQgUD0wLFI9MDtmb3IoUz0wO1M8RTtTKyspe2NvbnN0IHQ9ZVtkXSxyPWVbZCsxXT4+NCxuPTE1JmVbZCsxXTtQPHImJihQPXIpLFI8biYmKFI9bik7Y29uc3QgYT1lW2QrMl07Qz1oLmNvbXBvbmVudHMucHVzaCh7aDpyLHY6bixxdWFudGl6YXRpb25JZDphLHF1YW50aXphdGlvblRhYmxlOm51bGx9KSxoLmNvbXBvbmVudElkc1t0XT1DLTEsZCs9M31oLm1heEg9UCxoLm1heFY9UixhKGgpO2JyZWFrO2Nhc2UgNjU0NzY6Y29uc3QgTj0oMCxpLnJlYWRVaW50MTYpKGUsZCk7Zm9yKGQrPTIsUz0yO1M8Tjspe2NvbnN0IHQ9ZVtkKytdLHI9bmV3IFVpbnQ4QXJyYXkoMTYpO2xldCBuPTA7Zm9yKGs9MDtrPDE2O2srKyxkKyspbis9cltrXT1lW2RdO2NvbnN0IGE9bmV3IFVpbnQ4QXJyYXkobik7Zm9yKGs9MDtrPG47aysrLGQrKylhW2tdPWVbZF07Uys9MTcrbiwodD4+ND09MD93OmIpWzE1JnRdPXkocixhKX1icmVhaztjYXNlIDY1NTAxOmQrPTIsdT0oMCxpLnJlYWRVaW50MTYpKGUsZCksZCs9MjticmVhaztjYXNlIDY1NDk4OmNvbnN0IEQ9MT09KytwJiYhdDtkKz0yO2NvbnN0IEI9ZVtkKytdLEw9W107Zm9yKFM9MDtTPEI7UysrKXtjb25zdCB0PWVbZCsrXSxyPWguY29tcG9uZW50SWRzW3RdLG49aC5jb21wb25lbnRzW3JdO24uaW5kZXg9dDtjb25zdCBhPWVbZCsrXTtuLmh1ZmZtYW5UYWJsZURDPXdbYT4+NF0sbi5odWZmbWFuVGFibGVBQz1iWzE1JmFdLEwucHVzaChuKX1jb25zdCBfPWVbZCsrXSxqPWVbZCsrXSxVPWVbZCsrXTt0cnl7Y29uc3QgdD12KGUsZCxoLEwsdSxfLGosVT4+NCwxNSZVLEQpO2QrPXR9Y2F0Y2godCl7aWYodCBpbnN0YW5jZW9mIG8pcmV0dXJuKDAsbi53YXJuKSgiIi5jb25jYXQodC5tZXNzYWdlLCIgLS0gYXR0ZW1wdGluZyB0byByZS1wYXJzZSB0aGUgSlBFRyBpbWFnZS4iKSksdGhpcy5wYXJzZShlLHtkbmxTY2FuTGluZXM6dC5zY2FuTGluZXN9KTtpZih0IGluc3RhbmNlb2YgYyl7KDAsbi53YXJuKSgiIi5jb25jYXQodC5tZXNzYWdlLCIgLS0gaWdub3JpbmcgdGhlIHJlc3Qgb2YgdGhlIGltYWdlIGRhdGEuIikpO2JyZWFrIGV9dGhyb3cgdH1icmVhaztjYXNlIDY1NTAwOmQrPTQ7YnJlYWs7Y2FzZSA2NTUzNToyNTUhPT1lW2RdJiZkLS07YnJlYWs7ZGVmYXVsdDpjb25zdCAkPUEoZSxkLTIsZC0zKTtpZihudWxsIT0kJiYkLmludmFsaWQpeygwLG4ud2FybikoIkpwZWdJbWFnZS5wYXJzZSAtIHVuZXhwZWN0ZWQgZGF0YSwgY3VycmVudCBtYXJrZXIgaXM6ICIrJC5pbnZhbGlkKSxkPSQub2Zmc2V0O2JyZWFrfWlmKCEkfHxkPj1lLmxlbmd0aC0xKXsoMCxuLndhcm4pKCJKcGVnSW1hZ2UucGFyc2UgLSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGltYWdlIGRhdGEgd2l0aG91dCBmaW5kaW5nIGFuIEVPSSBtYXJrZXIgKDB4RkZEOSkuIik7YnJlYWsgZX10aHJvdyBuZXcgcygiSnBlZ0ltYWdlLnBhcnNlIC0gdW5rbm93biBtYXJrZXI6ICIreC50b1N0cmluZygxNikpfXg9KDAsaS5yZWFkVWludDE2KShlLGQpLGQrPTJ9dGhpcy53aWR0aD1oLnNhbXBsZXNQZXJMaW5lLHRoaXMuaGVpZ2h0PWguc2NhbkxpbmVzLHRoaXMuamZpZj1mLHRoaXMuYWRvYmU9Zyx0aGlzLmNvbXBvbmVudHM9W107Zm9yKGNvbnN0IGUgb2YgaC5jb21wb25lbnRzKXtjb25zdCB0PW1bZS5xdWFudGl6YXRpb25JZF07dCYmKGUucXVhbnRpemF0aW9uVGFibGU9dCksdGhpcy5jb21wb25lbnRzLnB1c2goe2luZGV4OmUuaW5kZXgsb3V0cHV0OlMoMCxlKSxzY2FsZVg6ZS5oL2gubWF4SCxzY2FsZVk6ZS52L2gubWF4VixibG9ja3NQZXJMaW5lOmUuYmxvY2tzUGVyTGluZSxibG9ja3NQZXJDb2x1bW46ZS5ibG9ja3NQZXJDb2x1bW59KX10aGlzLm51bUNvbXBvbmVudHM9dGhpcy5jb21wb25lbnRzLmxlbmd0aH1fZ2V0TGluZWFyaXplZEJsb2NrRGF0YShlLHQpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07Y29uc3Qgbj10aGlzLndpZHRoL2UsYT10aGlzLmhlaWdodC90O2xldCBpLHMsbyxjLGwsaCx1LGQsZixnLHAsbT0wO2NvbnN0IGI9dGhpcy5jb21wb25lbnRzLmxlbmd0aCx5PWUqdCpiLHc9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHkpLHY9bmV3IFVpbnQzMkFycmF5KGUpLHg9NDI5NDk2NzI4ODtsZXQgUztmb3IodT0wO3U8Yjt1Kyspe2lmKGk9dGhpcy5jb21wb25lbnRzW3VdLHM9aS5zY2FsZVgqbixvPWkuc2NhbGVZKmEsbT11LHA9aS5vdXRwdXQsYz1pLmJsb2Nrc1BlckxpbmUrMTw8MyxzIT09Uyl7Zm9yKGw9MDtsPGU7bCsrKWQ9MHxsKnMsdltsXT0oZCZ4KTw8M3w3JmQ7Uz1zfWZvcihoPTA7aDx0O2grKylmb3IoZD0wfGgqbyxnPWMqKGQmeCl8KDcmZCk8PDMsbD0wO2w8ZTtsKyspd1ttXT1wW2crdltsXV0sbSs9Yn1sZXQgQT10aGlzLl9kZWNvZGVUcmFuc2Zvcm07aWYocnx8NCE9PWJ8fEF8fChBPW5ldyBJbnQzMkFycmF5KFstMjU2LDI1NSwtMjU2LDI1NSwtMjU2LDI1NSwtMjU2LDI1NV0pKSxBKWZvcih1PTA7dTx5Oylmb3IoZD0wLGY9MDtkPGI7ZCsrLHUrKyxmKz0yKXdbdV09KHdbdV0qQVtmXT4+OCkrQVtmKzFdO3JldHVybiB3fWdldCBfaXNDb2xvckNvbnZlcnNpb25OZWVkZWQoKXtyZXR1cm4gdGhpcy5hZG9iZT8hIXRoaXMuYWRvYmUudHJhbnNmb3JtQ29kZTozPT09dGhpcy5udW1Db21wb25lbnRzPzAhPT10aGlzLl9jb2xvclRyYW5zZm9ybSYmKDgyIT09dGhpcy5jb21wb25lbnRzWzBdLmluZGV4fHw3MSE9PXRoaXMuY29tcG9uZW50c1sxXS5pbmRleHx8NjYhPT10aGlzLmNvbXBvbmVudHNbMl0uaW5kZXgpOjE9PT10aGlzLl9jb2xvclRyYW5zZm9ybX1fY29udmVydFljY1RvUmdiKGUpe2xldCB0LHIsbjtmb3IobGV0IGE9MCxpPWUubGVuZ3RoO2E8aTthKz0zKXQ9ZVthXSxyPWVbYSsxXSxuPWVbYSsyXSxlW2FdPXQtMTc5LjQ1NisxLjQwMipuLGVbYSsxXT10KzEzNS40NTktLjM0NCpyLS43MTQqbixlW2ErMl09dC0yMjYuODE2KzEuNzcyKnI7cmV0dXJuIGV9X2NvbnZlcnRZY2NUb1JnYmEoZSx0KXtmb3IobGV0IHI9MCxuPTAsYT1lLmxlbmd0aDtyPGE7cis9MyxuKz00KXtjb25zdCBhPWVbcl0saT1lW3IrMV0scz1lW3IrMl07dFtuXT1hLTE3OS40NTYrMS40MDIqcyx0W24rMV09YSsxMzUuNDU5LS4zNDQqaS0uNzE0KnMsdFtuKzJdPWEtMjI2LjgxNisxLjc3MippLHRbbiszXT0yNTV9cmV0dXJuIHR9X2NvbnZlcnRZY2NrVG9SZ2IoZSl7bGV0IHQscixuLGEsaT0wO2ZvcihsZXQgcz0wLG89ZS5sZW5ndGg7czxvO3MrPTQpdD1lW3NdLHI9ZVtzKzFdLG49ZVtzKzJdLGE9ZVtzKzNdLGVbaSsrXT1yKigtNjYwNjM1NjY5NDIwMzY0ZS0xOSpyKy4wMDA0MzcxMzA0NzU5MjYyMzIqbi01NDA4MDYxMDA2NDU5OWUtMTgqdCsuMDAwNDg0NDk3OTcxMjAyODEqYS0uMTU0MzYyMTUxODcxMTI2KS0xMjIuNjcxOTU0MDY4OTQrbiooLS4wMDA5NTc5NjQzNzg0NDU3NzMqbisuMDAwODE3MDc2OTExMzQ2NjI1KnQtLjAwNDc3MjcxNDA1NDA4NzQ3KmErMS41MzM4MDI1MzIyMTczNCkrdCooLjAwMDk2MTI1MDE4NDEzMDY4OCp0LS4wMDI2NjI1NzMzMjI4MzkzMyphKy40ODM1NzA4ODQ1MTI2NSkrYSooLS4wMDAzMzYxOTcxNzc2MTgzOTQqYSsuNDg0NzkxNTYxNDkwNzc2KSxlW2krK109MTA3LjI2ODAzOTM5NzcyNCtyKigyMTk5MjcxMDQ1MjU3NDFlLTE5KnItLjAwMDY0MDk5MjAxODI5Nzk0NSpuKy4wMDA2NTkzOTcwMDEyNDU1NzcqdCsuMDAwNDI2MTA1NjUyOTM4ODM3KmEtLjE3NjQ5MTc5MjQ2Mjg3NSkrbiooLS4wMDA3NzgyNjk5NDE1MTM2ODMqbisuMDAxMzA4NzIyNjE0MDgyNzUqdCsuMDAwNzcwNDgyNjMxODAxMTMyKmEtLjE1MTA1MTQ5Mjc3NTU2MikrdCooLjAwMTI2OTM1MzY4MTE0ODQzKnQtLjAwMjY1MDkwMTg5MDEwODk4KmErLjI1ODAyOTEwMjA2ODQ1KSthKigtLjAwMDMxODkxMzExNzU4ODMyOCphLS4yMTM3NDI0MDAzMjM2NjUpLGVbaSsrXT1yKigtLjAwMDU3MDExNTE5Njk3MzY3NypyLTI2MzQwOTA1MTAwNDU4OWUtMTkqbisuMDAyMDc0MTA4ODExNTAxMip0LS4wMDI4ODI2MDIzNjg1MzQ0MiphKy44MTQyNzI5NjgzNTkyOTUpLTIwLjgxMDAxMjU0Njk0NytuKigtMTUzNDk2MDU3NDQwOTc1ZS0xOSpuLS4wMDAxMzI2ODkwNDM5NjE0NDYqdCsuMDAwNTYwODMzNjkxMjQyODEyKmEtLjE5NTE1MjAyNzUzNDA0OSkrdCooLjAwMTc0NDE4MTMyOTI3NTgyKnQtLjAwMjU1MjQzMzIxNDM5MzQ3KmErLjExNjkzNTAyMDQ2NTE0NSkrYSooLS4wMDAzNDM1MzE5OTY1MTA1NTUqYSsuMjQxNjUyNjAyMzI0MDcpO3JldHVybiBlLnN1YmFycmF5KDAsaSl9X2NvbnZlcnRZY2NrVG9SZ2JhKGUpe2ZvcihsZXQgdD0wLHI9ZS5sZW5ndGg7dDxyO3QrPTQpe2NvbnN0IHI9ZVt0XSxuPWVbdCsxXSxhPWVbdCsyXSxpPWVbdCszXTtlW3RdPW4qKC02NjA2MzU2Njk0MjAzNjRlLTE5Km4rLjAwMDQzNzEzMDQ3NTkyNjIzMiphLTU0MDgwNjEwMDY0NTk5ZS0xOCpyKy4wMDA0ODQ0OTc5NzEyMDI4MSppLS4xNTQzNjIxNTE4NzExMjYpLTEyMi42NzE5NTQwNjg5NCthKigtLjAwMDk1Nzk2NDM3ODQ0NTc3MyphKy4wMDA4MTcwNzY5MTEzNDY2MjUqci0uMDA0NzcyNzE0MDU0MDg3NDcqaSsxLjUzMzgwMjUzMjIxNzM0KStyKiguMDAwOTYxMjUwMTg0MTMwNjg4KnItLjAwMjY2MjU3MzMyMjgzOTMzKmkrLjQ4MzU3MDg4NDUxMjY1KStpKigtLjAwMDMzNjE5NzE3NzYxODM5NCppKy40ODQ3OTE1NjE0OTA3NzYpLGVbdCsxXT0xMDcuMjY4MDM5Mzk3NzI0K24qKDIxOTkyNzEwNDUyNTc0MWUtMTkqbi0uMDAwNjQwOTkyMDE4Mjk3OTQ1KmErLjAwMDY1OTM5NzAwMTI0NTU3NypyKy4wMDA0MjYxMDU2NTI5Mzg4MzcqaS0uMTc2NDkxNzkyNDYyODc1KSthKigtLjAwMDc3ODI2OTk0MTUxMzY4MyphKy4wMDEzMDg3MjI2MTQwODI3NSpyKy4wMDA3NzA0ODI2MzE4MDExMzIqaS0uMTUxMDUxNDkyNzc1NTYyKStyKiguMDAxMjY5MzUzNjgxMTQ4NDMqci0uMDAyNjUwOTAxODkwMTA4OTgqaSsuMjU4MDI5MTAyMDY4NDUpK2kqKC0uMDAwMzE4OTEzMTE3NTg4MzI4KmktLjIxMzc0MjQwMDMyMzY2NSksZVt0KzJdPW4qKC0uMDAwNTcwMTE1MTk2OTczNjc3Km4tMjYzNDA5MDUxMDA0NTg5ZS0xOSphKy4wMDIwNzQxMDg4MTE1MDEyKnItLjAwMjg4MjYwMjM2ODUzNDQyKmkrLjgxNDI3Mjk2ODM1OTI5NSktMjAuODEwMDEyNTQ2OTQ3K2EqKC0xNTM0OTYwNTc0NDA5NzVlLTE5KmEtLjAwMDEzMjY4OTA0Mzk2MTQ0NipyKy4wMDA1NjA4MzM2OTEyNDI4MTIqaS0uMTk1MTUyMDI3NTM0MDQ5KStyKiguMDAxNzQ0MTgxMzI5Mjc1ODIqci0uMDAyNTUyNDMzMjE0MzkzNDcqaSsuMTE2OTM1MDIwNDY1MTQ1KStpKigtLjAwMDM0MzUzMTk5NjUxMDU1NSppKy4yNDE2NTI2MDIzMjQwNyksZVt0KzNdPTI1NX1yZXR1cm4gZX1fY29udmVydFljY2tUb0NteWsoZSl7bGV0IHQscixuO2ZvcihsZXQgYT0wLGk9ZS5sZW5ndGg7YTxpO2ErPTQpdD1lW2FdLHI9ZVthKzFdLG49ZVthKzJdLGVbYV09NDM0LjQ1Ni10LTEuNDAyKm4sZVthKzFdPTExOS41NDEtdCsuMzQ0KnIrLjcxNCpuLGVbYSsyXT00ODEuODE2LXQtMS43NzIqcjtyZXR1cm4gZX1fY29udmVydENteWtUb1JnYihlKXtsZXQgdCxyLG4sYSxpPTA7Zm9yKGxldCBzPTAsbz1lLmxlbmd0aDtzPG87cys9NCl0PWVbc10scj1lW3MrMV0sbj1lW3MrMl0sYT1lW3MrM10sZVtpKytdPTI1NSt0KigtNjc0NzE0NzA3MzYwMjQ0MWUtMjAqdCsuMDAwODM3OTI2MjEyMTAxMzcyNypyKy4wMDAyODk0NzE4MTg4NjQzMjk0Km4rLjAwMzI2NDIzMTA1NzUzNzgwNiphLTEuMTE4NTYxMTg2NzIwMzkzNykrciooMjYzNzQxMDc2MTYwODk0MDVlLTIxKnItODYyNjk0OTE1ODYzODU3MmUtMjAqbi0uMDAwMjc0ODc2OTA2NzQ5OTQ5MSphLS4wMjE1NTY4ODc5NDk3ODk2NykrbiooLTM4NzgwOTkyMTI4NjkzNjNlLTIwKm4tLjAwMDMyNjc4MDgyNzk0ODUyODYqYSsuMDY4Njc0MjIzODU5NTM0NSktYSooLjAwMDMzNjE5NzE3NzYxODM5MzcqYSsuNzQzMDY1OTE1MTM0MjI1NCksZVtpKytdPTI1NSt0KiguMDAwMTM1OTYzNzI4MTM1ODg4NDgqdCsuMDAwOTI0NTM3MTMyNTczNTg1KnIrLjAwMDEwNTY3MzU5NjE4NjgzNTkzKm4rLjAwMDQ3OTE4NjQ2ODc0MzY1MTIqYS0uMzEwOTY4OTU4NzUxNTg3NSkrciooLS4wMDAyMzU0NTM0NjEwODM3MDM0NCpyKy4wMDAyNzAyODQ1MjUzNTM0NzE0Km4rLjAwMjAyMDAzMDg5NzczMDcxNTYqYS0uNzQ4ODA1MjE2NzAxNTQ5NCkrbiooNjgzNDgxNTk5ODIzNTY2MmUtMjAqbisuMDAwMTUxNjg0NTIzNjM0NjA5NzMqYS0uMDk3NTE5Mjc3NzQ3Mjg5MzMpLWEqKC4wMDAzMTg5MTMxMTc1ODgzMjgxKmErLjczNjQ4ODM4MDc3MzMxNjgpLGVbaSsrXT0yNTUrdCooMTM1OTg2NTA0MTEzODUzMDdlLTIxKnQrLjAwMDEyNDIzOTU2MTc1NDkwODUxKnIrLjAwMDQ3NTE5ODUwOTc1ODM1ODkqbi0zNjcyOTMxNzQ3NjYzMDQyMmUtMjIqYS0uMDU1NjIxODY5ODAyNjQwMzQpK3IqKC4wMDAxNjE0MTM4MDU5ODcyNDY3NipyKy4wMDA5NjkyMjM5MTMwNzI1MTg2Km4rLjAwMDc3ODI2OTI0NTAwMzYyNTMqYS0uNDQwMTUyMzIzNjc1MjY0NjMpK24qKDUuMDY4ODgyOTE0MDY4NzY5ZS03Km4rLjAwMTc3NzgzNjkwMTEzNzUwNzEqYS0uNzU5MTQ1NDY0OTc0OTYwOSktYSooLjAwMDM0MzUzMTk5NjUxMDU1NTMqYSsuNzA2Mzc3MDE4NjE2MDE0NCk7cmV0dXJuIGUuc3ViYXJyYXkoMCxpKX1fY29udmVydENteWtUb1JnYmEoZSl7Zm9yKGxldCB0PTAscj1lLmxlbmd0aDt0PHI7dCs9NCl7Y29uc3Qgcj1lW3RdLG49ZVt0KzFdLGE9ZVt0KzJdLGk9ZVt0KzNdO2VbdF09MjU1K3IqKC02NzQ3MTQ3MDczNjAyNDQxZS0yMCpyKy4wMDA4Mzc5MjYyMTIxMDEzNzI3Km4rLjAwMDI4OTQ3MTgxODg2NDMyOTQqYSsuMDAzMjY0MjMxMDU3NTM3ODA2KmktMS4xMTg1NjExODY3MjAzOTM3KStuKigyNjM3NDEwNzYxNjA4OTQwNWUtMjEqbi04NjI2OTQ5MTU4NjM4NTcyZS0yMCphLS4wMDAyNzQ4NzY5MDY3NDk5NDkxKmktLjAyMTU1Njg4Nzk0OTc4OTY3KSthKigtMzg3ODA5OTIxMjg2OTM2M2UtMjAqYS0uMDAwMzI2NzgwODI3OTQ4NTI4NippKy4wNjg2NzQyMjM4NTk1MzQ1KS1pKiguMDAwMzM2MTk3MTc3NjE4MzkzNyppKy43NDMwNjU5MTUxMzQyMjU0KSxlW3QrMV09MjU1K3IqKC4wMDAxMzU5NjM3MjgxMzU4ODg0OCpyKy4wMDA5MjQ1MzcxMzI1NzM1ODUqbisuMDAwMTA1NjczNTk2MTg2ODM1OTMqYSsuMDAwNDc5MTg2NDY4NzQzNjUxMippLS4zMTA5Njg5NTg3NTE1ODc1KStuKigtLjAwMDIzNTQ1MzQ2MTA4MzcwMzQ0Km4rLjAwMDI3MDI4NDUyNTM1MzQ3MTQqYSsuMDAyMDIwMDMwODk3NzMwNzE1NippLS43NDg4MDUyMTY3MDE1NDk0KSthKig2ODM0ODE1OTk4MjM1NjYyZS0yMCphKy4wMDAxNTE2ODQ1MjM2MzQ2MDk3MyppLS4wOTc1MTkyNzc3NDcyODkzMyktaSooLjAwMDMxODkxMzExNzU4ODMyODEqaSsuNzM2NDg4MzgwNzczMzE2OCksZVt0KzJdPTI1NStyKigxMzU5ODY1MDQxMTM4NTMwN2UtMjEqcisuMDAwMTI0MjM5NTYxNzU0OTA4NTEqbisuMDAwNDc1MTk4NTA5NzU4MzU4OSphLTM2NzI5MzE3NDc2NjMwNDIyZS0yMippLS4wNTU2MjE4Njk4MDI2NDAzNCkrbiooLjAwMDE2MTQxMzgwNTk4NzI0Njc2Km4rLjAwMDk2OTIyMzkxMzA3MjUxODYqYSsuMDAwNzc4MjY5MjQ1MDAzNjI1MyppLS40NDAxNTIzMjM2NzUyNjQ2MykrYSooNS4wNjg4ODI5MTQwNjg3NjllLTcqYSsuMDAxNzc3ODM2OTAxMTM3NTA3MSppLS43NTkxNDU0NjQ5NzQ5NjA5KS1pKiguMDAwMzQzNTMxOTk2NTEwNTU1MyppKy43MDYzNzcwMTg2MTYwMTQ0KSxlW3QrM109MjU1fXJldHVybiBlfWdldERhdGEoZSl7bGV0e3dpZHRoOnQsaGVpZ2h0OnIsZm9yY2VSR0JBOm49ITEsZm9yY2VSR0I6aT0hMSxpc1NvdXJjZVBERjpvPSExfT1lO2lmKHRoaXMubnVtQ29tcG9uZW50cz40KXRocm93IG5ldyBzKCJVbnN1cHBvcnRlZCBjb2xvciBtb2RlIik7Y29uc3QgYz10aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHQscixvKTtpZigxPT09dGhpcy5udW1Db21wb25lbnRzJiYobnx8aSkpe2NvbnN0IGU9Yy5sZW5ndGgqKG4/NDozKSx0PW5ldyBVaW50OENsYW1wZWRBcnJheShlKTtsZXQgcj0wO2lmKG4pKDAsYS5ncmF5VG9SR0JBKShjLG5ldyBVaW50MzJBcnJheSh0LmJ1ZmZlcikpO2Vsc2UgZm9yKGNvbnN0IGUgb2YgYyl0W3IrK109ZSx0W3IrK109ZSx0W3IrK109ZTtyZXR1cm4gdH1pZigzPT09dGhpcy5udW1Db21wb25lbnRzJiZ0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZCl7aWYobil7Y29uc3QgZT1uZXcgVWludDhDbGFtcGVkQXJyYXkoYy5sZW5ndGgvMyo0KTtyZXR1cm4gdGhpcy5fY29udmVydFljY1RvUmdiYShjLGUpfXJldHVybiB0aGlzLl9jb252ZXJ0WWNjVG9SZ2IoYyl9aWYoND09PXRoaXMubnVtQ29tcG9uZW50cyl7aWYodGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpcmV0dXJuIG4/dGhpcy5fY29udmVydFljY2tUb1JnYmEoYyk6aT90aGlzLl9jb252ZXJ0WWNja1RvUmdiKGMpOnRoaXMuX2NvbnZlcnRZY2NrVG9DbXlrKGMpO2lmKG4pcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2JhKGMpO2lmKGkpcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2IoYyl9cmV0dXJuIGN9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBPWEsdC5jb252ZXJ0VG9SR0JBPWZ1bmN0aW9uKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2Ugbi5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFA6cmV0dXJuIGEoZSk7Y2FzZSBuLkltYWdlS2luZC5SR0JfMjRCUFA6cmV0dXJuIGZ1bmN0aW9uKGUpe2xldHtzcmM6dCxzcmNQb3M6cj0wLGRlc3Q6YSxkZXN0UG9zOmk9MCx3aWR0aDpzLGhlaWdodDpvfT1lLGM9MDtjb25zdCBsPXQubGVuZ3RoPj4yLGg9bmV3IFVpbnQzMkFycmF5KHQuYnVmZmVyLHIsbCk7aWYobi5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbil7Zm9yKDtjPGwtMjtjKz0zLGkrPTQpe2NvbnN0IGU9aFtjXSx0PWhbYysxXSxyPWhbYysyXTthW2ldPTQyNzgxOTAwODB8ZSxhW2krMV09ZT4+PjI0fHQ8PDh8NDI3ODE5MDA4MCxhW2krMl09dD4+PjE2fHI8PDE2fDQyNzgxOTAwODAsYVtpKzNdPXI+Pj44fDQyNzgxOTAwODB9Zm9yKGxldCBlPTQqYyxyPXQubGVuZ3RoO2U8cjtlKz0zKWFbaSsrXT10W2VdfHRbZSsxXTw8OHx0W2UrMl08PDE2fDQyNzgxOTAwODB9ZWxzZXtmb3IoO2M8bC0yO2MrPTMsaSs9NCl7Y29uc3QgZT1oW2NdLHQ9aFtjKzFdLHI9aFtjKzJdO2FbaV09MjU1fGUsYVtpKzFdPWU8PDI0fHQ+Pj44fDI1NSxhW2krMl09dDw8MTZ8cj4+PjE2fDI1NSxhW2krM109cjw8OHwyNTV9Zm9yKGxldCBlPTQqYyxyPXQubGVuZ3RoO2U8cjtlKz0zKWFbaSsrXT10W2VdPDwyNHx0W2UrMV08PDE2fHRbZSsyXTw8OHwyNTV9cmV0dXJue3NyY1BvczpyLGRlc3RQb3M6aX19KGUpfXJldHVybiBudWxsfSx0LmdyYXlUb1JHQkE9ZnVuY3Rpb24oZSx0KXtpZihuLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKWZvcihsZXQgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl0W3JdPTY1NzkzKmVbcl18NDI3ODE5MDA4MDtlbHNlIGZvcihsZXQgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl0W3JdPTE2ODQzMDA4KmVbcl18MjU1fSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNDQpO2Z1bmN0aW9uIGEoZSl7bGV0e3NyYzp0LHNyY1BvczpyPTAsZGVzdDphLHdpZHRoOmksaGVpZ2h0OnMsbm9uQmxhY2tDb2xvcjpvPTQyOTQ5NjcyOTUsaW52ZXJzZURlY29kZTpjPSExfT1lO2NvbnN0IGw9bi5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbj80Mjc4MTkwMDgwOjI1NSxbaCx1XT1jP1tvLGxdOltsLG9dLGQ9aT4+MyxmPTcmaSxnPXQubGVuZ3RoO2E9bmV3IFVpbnQzMkFycmF5KGEuYnVmZmVyKTtsZXQgcD0wO2ZvcihsZXQgZT0wO2U8cztlKyspe2Zvcihjb25zdCBlPXIrZDtyPGU7cisrKXtjb25zdCBlPXI8Zz90W3JdOjI1NTthW3ArK109MTI4JmU/dTpoLGFbcCsrXT02NCZlP3U6aCxhW3ArK109MzImZT91OmgsYVtwKytdPTE2JmU/dTpoLGFbcCsrXT04JmU/dTpoLGFbcCsrXT00JmU/dTpoLGFbcCsrXT0yJmU/dTpoLGFbcCsrXT0xJmU/dTpofWlmKDA9PT1mKWNvbnRpbnVlO2NvbnN0IGU9cjxnP3RbcisrXToyNTU7Zm9yKGxldCB0PTA7dDxmO3QrKylhW3ArK109ZSYxPDw3LXQ/dTpofXJldHVybntzcmNQb3M6cixkZXN0UG9zOnB9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkpweFN0cmVhbT12b2lkIDAscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTY4KSxhPXIoMTgwKSxpPXIoMTQ0KTtjbGFzcyBzIGV4dGVuZHMgbi5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKHQpLHRoaXMuc3RyZWFtPWUsdGhpcy5kaWN0PWUuZGljdCx0aGlzLm1heWJlTGVuZ3RoPXQsdGhpcy5wYXJhbXM9cn1nZXQgYnl0ZXMoKXtyZXR1cm4oMCxpLnNoYWRvdykodGhpcywiYnl0ZXMiLHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKX1lbnN1cmVCdWZmZXIoZSl7fXJlYWRCbG9jaygpe2lmKHRoaXMuZW9mKXJldHVybjtjb25zdCBlPW5ldyBhLkpweEltYWdlO2UucGFyc2UodGhpcy5ieXRlcyk7Y29uc3QgdD1lLndpZHRoLHI9ZS5oZWlnaHQsbj1lLmNvbXBvbmVudHNDb3VudCxpPWUudGlsZXMubGVuZ3RoO2lmKDE9PT1pKXRoaXMuYnVmZmVyPWUudGlsZXNbMF0uaXRlbXM7ZWxzZXtjb25zdCBhPW5ldyBVaW50OENsYW1wZWRBcnJheSh0KnIqbik7Zm9yKGxldCByPTA7cjxpO3IrKyl7Y29uc3QgaT1lLnRpbGVzW3JdLHM9aS53aWR0aCxvPWkuaGVpZ2h0LGM9aS5sZWZ0LGw9aS50b3AsaD1pLml0ZW1zO2xldCB1PTAsZD0odCpsK2MpKm47Y29uc3QgZj10Km4sZz1zKm47Zm9yKGxldCBlPTA7ZTxvO2UrKyl7Y29uc3QgZT1oLnN1YmFycmF5KHUsdStnKTthLnNldChlLGQpLHUrPWcsZCs9Zn19dGhpcy5idWZmZXI9YX10aGlzLmJ1ZmZlckxlbmd0aD10aGlzLmJ1ZmZlci5sZW5ndGgsdGhpcy5lb2Y9ITB9fXQuSnB4U3RyZWFtPXN9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5KcHhJbWFnZT12b2lkIDAscigxMzkpLHIoMikscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTQ0KSxhPXIoMTQ5KSxzPXIoMTc1KTtjbGFzcyBvIGV4dGVuZHMgbi5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKCJKUFggZXJyb3I6ICIuY29uY2F0KGUpLCJKcHhFcnJvciIpfX1jb25zdCBjPXtMTDowLExIOjEsSEw6MSxISDoyfTtmdW5jdGlvbiBsKGUsdCl7ZS54MD1NYXRoLmNlaWwodC5YT3Npei9lLlhSc2l6KSxlLngxPU1hdGguY2VpbCh0LlhzaXovZS5YUnNpeiksZS55MD1NYXRoLmNlaWwodC5ZT3Npei9lLllSc2l6KSxlLnkxPU1hdGguY2VpbCh0LllzaXovZS5ZUnNpeiksZS53aWR0aD1lLngxLWUueDAsZS5oZWlnaHQ9ZS55MS1lLnkwfWZ1bmN0aW9uIGgoZSx0KXtjb25zdCByPWUuU0laLG49W107bGV0IGE7Y29uc3QgaT1NYXRoLmNlaWwoKHIuWHNpei1yLlhUT3Npeikvci5YVHNpeikscz1NYXRoLmNlaWwoKHIuWXNpei1yLllUT3Npeikvci5ZVHNpeik7Zm9yKGxldCBlPTA7ZTxzO2UrKylmb3IobGV0IHQ9MDt0PGk7dCsrKWE9e30sYS50eDA9TWF0aC5tYXgoci5YVE9zaXordCpyLlhUc2l6LHIuWE9zaXopLGEudHkwPU1hdGgubWF4KHIuWVRPc2l6K2Uqci5ZVHNpeixyLllPc2l6KSxhLnR4MT1NYXRoLm1pbihyLlhUT3NpeisodCsxKSpyLlhUc2l6LHIuWHNpeiksYS50eTE9TWF0aC5taW4oci5ZVE9zaXorKGUrMSkqci5ZVHNpeixyLllzaXopLGEud2lkdGg9YS50eDEtYS50eDAsYS5oZWlnaHQ9YS50eTEtYS50eTAsYS5jb21wb25lbnRzPVtdLG4ucHVzaChhKTtlLnRpbGVzPW47Zm9yKGxldCBlPTAsaT1yLkNzaXo7ZTxpO2UrKyl7Y29uc3Qgcj10W2VdO2ZvcihsZXQgdD0wLGk9bi5sZW5ndGg7dDxpO3QrKyl7Y29uc3QgaT17fTthPW5bdF0saS50Y3gwPU1hdGguY2VpbChhLnR4MC9yLlhSc2l6KSxpLnRjeTA9TWF0aC5jZWlsKGEudHkwL3IuWVJzaXopLGkudGN4MT1NYXRoLmNlaWwoYS50eDEvci5YUnNpeiksaS50Y3kxPU1hdGguY2VpbChhLnR5MS9yLllSc2l6KSxpLndpZHRoPWkudGN4MS1pLnRjeDAsaS5oZWlnaHQ9aS50Y3kxLWkudGN5MCxhLmNvbXBvbmVudHNbZV09aX19fWZ1bmN0aW9uIHUoZSx0LHIpe2NvbnN0IG49dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMsYT17fTtyZXR1cm4gbi5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzPyhhLlBQeD1uLnByZWNpbmN0c1NpemVzW3JdLlBQeCxhLlBQeT1uLnByZWNpbmN0c1NpemVzW3JdLlBQeSk6KGEuUFB4PTE1LGEuUFB5PTE1KSxhLnhjYl89cj4wP01hdGgubWluKG4ueGNiLGEuUFB4LTEpOk1hdGgubWluKG4ueGNiLGEuUFB4KSxhLnljYl89cj4wP01hdGgubWluKG4ueWNiLGEuUFB5LTEpOk1hdGgubWluKG4ueWNiLGEuUFB5KSxhfWZ1bmN0aW9uIGQoZSx0LHIpe2NvbnN0IG49MTw8ci5QUHgsYT0xPDxyLlBQeSxpPTA9PT10LnJlc0xldmVsLHM9MTw8ci5QUHgrKGk/MDotMSksbz0xPDxyLlBQeSsoaT8wOi0xKSxjPXQudHJ4MT50LnRyeDA/TWF0aC5jZWlsKHQudHJ4MS9uKS1NYXRoLmZsb29yKHQudHJ4MC9uKTowLGw9dC50cnkxPnQudHJ5MD9NYXRoLmNlaWwodC50cnkxL2EpLU1hdGguZmxvb3IodC50cnkwL2EpOjAsaD1jKmw7dC5wcmVjaW5jdFBhcmFtZXRlcnM9e3ByZWNpbmN0V2lkdGg6bixwcmVjaW5jdEhlaWdodDphLG51bXByZWNpbmN0c3dpZGU6YyxudW1wcmVjaW5jdHNoaWdoOmwsbnVtcHJlY2luY3RzOmgscHJlY2luY3RXaWR0aEluU3ViYmFuZDpzLHByZWNpbmN0SGVpZ2h0SW5TdWJiYW5kOm99fWZ1bmN0aW9uIGYoZSx0LHIpe2NvbnN0IG49ci54Y2JfLGE9ci55Y2JfLGk9MTw8bixzPTE8PGEsbz10LnRieDA+Pm4sYz10LnRieTA+PmEsbD10LnRieDEraS0xPj5uLGg9dC50YnkxK3MtMT4+YSx1PXQucmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMsZD1bXSxmPVtdO2xldCBnLHAsbSxiO2ZvcihwPWM7cDxoO3ArKylmb3IoZz1vO2c8bDtnKyspe2lmKG09e2NieDpnLGNieTpwLHRieDA6aSpnLHRieTA6cypwLHRieDE6aSooZysxKSx0YnkxOnMqKHArMSl9LG0udGJ4MF89TWF0aC5tYXgodC50YngwLG0udGJ4MCksbS50YnkwXz1NYXRoLm1heCh0LnRieTAsbS50YnkwKSxtLnRieDFfPU1hdGgubWluKHQudGJ4MSxtLnRieDEpLG0udGJ5MV89TWF0aC5taW4odC50YnkxLG0udGJ5MSksYj1NYXRoLmZsb29yKChtLnRieDBfLXQudGJ4MCkvdS5wcmVjaW5jdFdpZHRoSW5TdWJiYW5kKStNYXRoLmZsb29yKChtLnRieTBfLXQudGJ5MCkvdS5wcmVjaW5jdEhlaWdodEluU3ViYmFuZCkqdS5udW1wcmVjaW5jdHN3aWRlLG0ucHJlY2luY3ROdW1iZXI9YixtLnN1YmJhbmRUeXBlPXQudHlwZSxtLkxibG9jaz0zLG0udGJ4MV88PW0udGJ4MF98fG0udGJ5MV88PW0udGJ5MF8pY29udGludWU7ZC5wdXNoKG0pO2xldCBlPWZbYl07dm9pZCAwIT09ZT8oZzxlLmNieE1pbj9lLmNieE1pbj1nOmc+ZS5jYnhNYXgmJihlLmNieE1heD1nKSxwPGUuY2J5TWluP2UuY2J4TWluPXA6cD5lLmNieU1heCYmKGUuY2J5TWF4PXApKTpmW2JdPWU9e2NieE1pbjpnLGNieU1pbjpwLGNieE1heDpnLGNieU1heDpwfSxtLnByZWNpbmN0PWV9dC5jb2RlYmxvY2tQYXJhbWV0ZXJzPXtjb2RlYmxvY2tXaWR0aDpuLGNvZGVibG9ja0hlaWdodDphLG51bWNvZGVibG9ja3dpZGU6bC1vKzEsbnVtY29kZWJsb2NraGlnaDpoLWMrMX0sdC5jb2RlYmxvY2tzPWQsdC5wcmVjaW5jdHM9Zn1mdW5jdGlvbiBnKGUsdCxyKXtjb25zdCBuPVtdLGE9ZS5zdWJiYW5kcztmb3IobGV0IGU9MCxyPWEubGVuZ3RoO2U8cjtlKyspe2NvbnN0IHI9YVtlXS5jb2RlYmxvY2tzO2ZvcihsZXQgZT0wLGE9ci5sZW5ndGg7ZTxhO2UrKyl7Y29uc3QgYT1yW2VdO2EucHJlY2luY3ROdW1iZXI9PT10JiZuLnB1c2goYSl9fXJldHVybntsYXllck51bWJlcjpyLGNvZGVibG9ja3M6bn19ZnVuY3Rpb24gcChlKXtjb25zdCB0PWUuU0laLHI9ZS5jdXJyZW50VGlsZS5pbmRleCxuPWUudGlsZXNbcl0sYT1uLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQsaT10LkNzaXo7bGV0IHM9MDtmb3IobGV0IGU9MDtlPGk7ZSsrKXM9TWF0aC5tYXgocyxuLmNvbXBvbmVudHNbZV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7bGV0IGM9MCxsPTAsaD0wLHU9MDt0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24oKXtmb3IoO2M8YTtjKyspe2Zvcig7bDw9cztsKyspe2Zvcig7aDxpO2grKyl7Y29uc3QgZT1uLmNvbXBvbmVudHNbaF07aWYobD5lLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpY29udGludWU7Y29uc3QgdD1lLnJlc29sdXRpb25zW2xdLHI9dC5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO2Zvcig7dTxyOyl7Y29uc3QgZT1nKHQsdSxjKTtyZXR1cm4gdSsrLGV9dT0wfWg9MH1sPTB9dGhyb3cgbmV3IG8oIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIG0oZSl7Y29uc3QgdD1lLlNJWixyPWUuY3VycmVudFRpbGUuaW5kZXgsbj1lLnRpbGVzW3JdLGE9bi5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LGk9dC5Dc2l6O2xldCBzPTA7Zm9yKGxldCBlPTA7ZTxpO2UrKylzPU1hdGgubWF4KHMsbi5jb21wb25lbnRzW2VdLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpO2xldCBjPTAsbD0wLGg9MCx1PTA7dGhpcy5uZXh0UGFja2V0PWZ1bmN0aW9uKCl7Zm9yKDtjPD1zO2MrKyl7Zm9yKDtsPGE7bCsrKXtmb3IoO2g8aTtoKyspe2NvbnN0IGU9bi5jb21wb25lbnRzW2hdO2lmKGM+ZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KWNvbnRpbnVlO2NvbnN0IHQ9ZS5yZXNvbHV0aW9uc1tjXSxyPXQucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cztmb3IoO3U8cjspe2NvbnN0IGU9Zyh0LHUsbCk7cmV0dXJuIHUrKyxlfXU9MH1oPTB9bD0wfXRocm93IG5ldyBvKCJPdXQgb2YgcGFja2V0cyIpfX1mdW5jdGlvbiBiKGUpe2NvbnN0IHQ9ZS5TSVoscj1lLmN1cnJlbnRUaWxlLmluZGV4LG49ZS50aWxlc1tyXSxhPW4uY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudCxpPXQuQ3NpejtsZXQgcyxjLGwsaCx1PTA7Zm9yKGw9MDtsPGk7bCsrKXtjb25zdCBlPW4uY29tcG9uZW50c1tsXTt1PU1hdGgubWF4KHUsZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KX1jb25zdCBkPW5ldyBJbnQzMkFycmF5KHUrMSk7Zm9yKGM9MDtjPD11OysrYyl7bGV0IGU9MDtmb3IobD0wO2w8aTsrK2wpe2NvbnN0IHQ9bi5jb21wb25lbnRzW2xdLnJlc29sdXRpb25zO2M8dC5sZW5ndGgmJihlPU1hdGgubWF4KGUsdFtjXS5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzKSl9ZFtjXT1lfXM9MCxjPTAsbD0wLGg9MCx0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24oKXtmb3IoO2M8PXU7YysrKXtmb3IoO2g8ZFtjXTtoKyspe2Zvcig7bDxpO2wrKyl7Y29uc3QgZT1uLmNvbXBvbmVudHNbbF07aWYoYz5lLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpY29udGludWU7Y29uc3QgdD1lLnJlc29sdXRpb25zW2NdLHI9dC5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO2lmKCEoaD49cikpe2Zvcig7czxhOyl7Y29uc3QgZT1nKHQsaCxzKTtyZXR1cm4gcysrLGV9cz0wfX1sPTB9aD0wfXRocm93IG5ldyBvKCJPdXQgb2YgcGFja2V0cyIpfX1mdW5jdGlvbiB5KGUpe2NvbnN0IHQ9ZS5TSVoscj1lLmN1cnJlbnRUaWxlLmluZGV4LG49ZS50aWxlc1tyXSxhPW4uY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudCxpPXQuQ3NpeixzPXgobiksYz1zO2xldCBsPTAsaD0wLHU9MCxkPTAsZj0wO3RoaXMubmV4dFBhY2tldD1mdW5jdGlvbigpe2Zvcig7ZjxjLm1heE51bUhpZ2g7ZisrKXtmb3IoO2Q8Yy5tYXhOdW1XaWRlO2QrKyl7Zm9yKDt1PGk7dSsrKXtjb25zdCBlPW4uY29tcG9uZW50c1t1XSx0PWUuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDtmb3IoO2g8PXQ7aCsrKXtjb25zdCB0PWUucmVzb2x1dGlvbnNbaF0scj1zLmNvbXBvbmVudHNbdV0ucmVzb2x1dGlvbnNbaF0sbj12KGQsZixyLGMsdCk7aWYobnVsbCE9PW4pe2Zvcig7bDxhOyl7Y29uc3QgZT1nKHQsbixsKTtyZXR1cm4gbCsrLGV9bD0wfX1oPTB9dT0wfWQ9MH10aHJvdyBuZXcgbygiT3V0IG9mIHBhY2tldHMiKX19ZnVuY3Rpb24gdyhlKXtjb25zdCB0PWUuU0laLHI9ZS5jdXJyZW50VGlsZS5pbmRleCxuPWUudGlsZXNbcl0sYT1uLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQsaT10LkNzaXoscz14KG4pO2xldCBjPTAsbD0wLGg9MCx1PTAsZD0wO3RoaXMubmV4dFBhY2tldD1mdW5jdGlvbigpe2Zvcig7aDxpOysraCl7Y29uc3QgZT1uLmNvbXBvbmVudHNbaF0sdD1zLmNvbXBvbmVudHNbaF0scj1lLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7Zm9yKDtkPHQubWF4TnVtSGlnaDtkKyspe2Zvcig7dTx0Lm1heE51bVdpZGU7dSsrKXtmb3IoO2w8PXI7bCsrKXtjb25zdCByPWUucmVzb2x1dGlvbnNbbF0sbj10LnJlc29sdXRpb25zW2xdLGk9dih1LGQsbix0LHIpO2lmKG51bGwhPT1pKXtmb3IoO2M8YTspe2NvbnN0IGU9ZyhyLGksYyk7cmV0dXJuIGMrKyxlfWM9MH19bD0wfXU9MH1kPTB9dGhyb3cgbmV3IG8oIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIHYoZSx0LHIsbixhKXtjb25zdCBpPWUqbi5taW5XaWR0aCxzPXQqbi5taW5IZWlnaHQ7aWYoaSVyLndpZHRoIT0wfHxzJXIuaGVpZ2h0IT0wKXJldHVybiBudWxsO2NvbnN0IG89cy9yLndpZHRoKmEucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGU7cmV0dXJuIGkvci5oZWlnaHQrb31mdW5jdGlvbiB4KGUpe2NvbnN0IHQ9ZS5jb21wb25lbnRzLmxlbmd0aDtsZXQgcj1OdW1iZXIuTUFYX1ZBTFVFLG49TnVtYmVyLk1BWF9WQUxVRSxhPTAsaT0wO2NvbnN0IHM9bmV3IEFycmF5KHQpO2ZvcihsZXQgbz0wO288dDtvKyspe2NvbnN0IHQ9ZS5jb21wb25lbnRzW29dLGM9dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50LGw9bmV3IEFycmF5KGMrMSk7bGV0IGg9TnVtYmVyLk1BWF9WQUxVRSx1PU51bWJlci5NQVhfVkFMVUUsZD0wLGY9MCxnPTE7Zm9yKGxldCBlPWM7ZT49MDstLWUpe2NvbnN0IHI9dC5yZXNvbHV0aW9uc1tlXSxuPWcqci5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aCxhPWcqci5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RIZWlnaHQ7aD1NYXRoLm1pbihoLG4pLHU9TWF0aC5taW4odSxhKSxkPU1hdGgubWF4KGQsci5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZSksZj1NYXRoLm1heChmLHIucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c2hpZ2gpLGxbZV09e3dpZHRoOm4saGVpZ2h0OmF9LGc8PD0xfXI9TWF0aC5taW4ocixoKSxuPU1hdGgubWluKG4sdSksYT1NYXRoLm1heChhLGQpLGk9TWF0aC5tYXgoaSxmKSxzW29dPXtyZXNvbHV0aW9uczpsLG1pbldpZHRoOmgsbWluSGVpZ2h0OnUsbWF4TnVtV2lkZTpkLG1heE51bUhpZ2g6Zn19cmV0dXJue2NvbXBvbmVudHM6cyxtaW5XaWR0aDpyLG1pbkhlaWdodDpuLG1heE51bVdpZGU6YSxtYXhOdW1IaWdoOml9fWZ1bmN0aW9uIFMoZSl7Y29uc3QgdD1lLlNJWixyPWUuY3VycmVudFRpbGUuaW5kZXgsbj1lLnRpbGVzW3JdLGE9dC5Dc2l6O2ZvcihsZXQgZT0wO2U8YTtlKyspe2NvbnN0IHQ9bi5jb21wb25lbnRzW2VdLHI9dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50LGE9W10saT1bXTtmb3IobGV0IGU9MDtlPD1yO2UrKyl7Y29uc3Qgbj11KDAsdCxlKSxzPXt9LG89MTw8ci1lO2xldCBjO2lmKHMudHJ4MD1NYXRoLmNlaWwodC50Y3gwL28pLHMudHJ5MD1NYXRoLmNlaWwodC50Y3kwL28pLHMudHJ4MT1NYXRoLmNlaWwodC50Y3gxL28pLHMudHJ5MT1NYXRoLmNlaWwodC50Y3kxL28pLHMucmVzTGV2ZWw9ZSxkKDAscyxuKSxhLnB1c2gocyksMD09PWUpYz17fSxjLnR5cGU9IkxMIixjLnRieDA9TWF0aC5jZWlsKHQudGN4MC9vKSxjLnRieTA9TWF0aC5jZWlsKHQudGN5MC9vKSxjLnRieDE9TWF0aC5jZWlsKHQudGN4MS9vKSxjLnRieTE9TWF0aC5jZWlsKHQudGN5MS9vKSxjLnJlc29sdXRpb249cyxmKDAsYyxuKSxpLnB1c2goYykscy5zdWJiYW5kcz1bY107ZWxzZXtjb25zdCBhPTE8PHItZSsxLG89W107Yz17fSxjLnR5cGU9IkhMIixjLnRieDA9TWF0aC5jZWlsKHQudGN4MC9hLS41KSxjLnRieTA9TWF0aC5jZWlsKHQudGN5MC9hKSxjLnRieDE9TWF0aC5jZWlsKHQudGN4MS9hLS41KSxjLnRieTE9TWF0aC5jZWlsKHQudGN5MS9hKSxjLnJlc29sdXRpb249cyxmKDAsYyxuKSxpLnB1c2goYyksby5wdXNoKGMpLGM9e30sYy50eXBlPSJMSCIsYy50YngwPU1hdGguY2VpbCh0LnRjeDAvYSksYy50YnkwPU1hdGguY2VpbCh0LnRjeTAvYS0uNSksYy50YngxPU1hdGguY2VpbCh0LnRjeDEvYSksYy50YnkxPU1hdGguY2VpbCh0LnRjeTEvYS0uNSksYy5yZXNvbHV0aW9uPXMsZigwLGMsbiksaS5wdXNoKGMpLG8ucHVzaChjKSxjPXt9LGMudHlwZT0iSEgiLGMudGJ4MD1NYXRoLmNlaWwodC50Y3gwL2EtLjUpLGMudGJ5MD1NYXRoLmNlaWwodC50Y3kwL2EtLjUpLGMudGJ4MT1NYXRoLmNlaWwodC50Y3gxL2EtLjUpLGMudGJ5MT1NYXRoLmNlaWwodC50Y3kxL2EtLjUpLGMucmVzb2x1dGlvbj1zLGYoMCxjLG4pLGkucHVzaChjKSxvLnB1c2goYykscy5zdWJiYW5kcz1vfX10LnJlc29sdXRpb25zPWEsdC5zdWJiYW5kcz1pfWNvbnN0IGk9bi5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7c3dpdGNoKGkpe2Nhc2UgMDpuLnBhY2tldHNJdGVyYXRvcj1uZXcgcChlKTticmVhaztjYXNlIDE6bi5wYWNrZXRzSXRlcmF0b3I9bmV3IG0oZSk7YnJlYWs7Y2FzZSAyOm4ucGFja2V0c0l0ZXJhdG9yPW5ldyBiKGUpO2JyZWFrO2Nhc2UgMzpuLnBhY2tldHNJdGVyYXRvcj1uZXcgeShlKTticmVhaztjYXNlIDQ6bi5wYWNrZXRzSXRlcmF0b3I9bmV3IHcoZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbygiVW5zdXBwb3J0ZWQgcHJvZ3Jlc3Npb24gb3JkZXIgIi5jb25jYXQoaSkpfX1mdW5jdGlvbiBBKGUsdCxyLG4pe2xldCBpLHM9MCxjPTAsbD0hMTtmdW5jdGlvbiBoKGUpe2Zvcig7YzxlOyl7Y29uc3QgZT10W3Irc107cysrLGw/KGk9aTw8N3xlLGMrPTcsbD0hMSk6KGk9aTw8OHxlLGMrPTgpLDI1NT09PWUmJihsPSEwKX1yZXR1cm4gYy09ZSxpPj4+YyYoMTw8ZSktMX1mdW5jdGlvbiB1KGUpe3JldHVybiAyNTU9PT10W3Ircy0xXSYmdFtyK3NdPT09ZT8oZCgxKSwhMCk6MjU1PT09dFtyK3NdJiZ0W3IrcysxXT09PWUmJihkKDIpLCEwKX1mdW5jdGlvbiBkKGUpe3MrPWV9ZnVuY3Rpb24gZigpe2M9MCxsJiYocysrLGw9ITEpfWZ1bmN0aW9uIGcoKXtpZigwPT09aCgxKSlyZXR1cm4gMTtpZigwPT09aCgxKSlyZXR1cm4gMjtsZXQgZT1oKDIpO3JldHVybiBlPDM/ZSszOihlPWgoNSksZTwzMT9lKzY6KGU9aCg3KSxlKzM3KSl9Y29uc3QgcD1lLmN1cnJlbnRUaWxlLmluZGV4LG09ZS50aWxlc1twXSxiPWUuQ09ELnNvcE1hcmtlclVzZWQseT1lLkNPRC5lcGhNYXJrZXJVc2VkLHc9bS5wYWNrZXRzSXRlcmF0b3I7Zm9yKDtzPG47KXtmKCksYiYmdSgxNDUpJiZkKDQpO2NvbnN0IGU9dy5uZXh0UGFja2V0KCk7aWYoIWgoMSkpY29udGludWU7Y29uc3Qgbj1lLmxheWVyTnVtYmVyLGk9W107bGV0IGM7Zm9yKGxldCB0PTAscj1lLmNvZGVibG9ja3MubGVuZ3RoO3Q8cjt0Kyspe2M9ZS5jb2RlYmxvY2tzW3RdO2xldCByPWMucHJlY2luY3Q7Y29uc3Qgcz1jLmNieC1yLmNieE1pbixsPWMuY2J5LXIuY2J5TWluO2xldCB1LGQsZj0hMSxwPSExO2lmKHZvaWQgMCE9PWMuaW5jbHVkZWQpZj0hIWgoMSk7ZWxzZXtsZXQgZTtpZihyPWMucHJlY2luY3Qsdm9pZCAwIT09ci5pbmNsdXNpb25UcmVlKWU9ci5pbmNsdXNpb25UcmVlO2Vsc2V7Y29uc3QgdD1yLmNieE1heC1yLmNieE1pbisxLGE9ci5jYnlNYXgtci5jYnlNaW4rMTtlPW5ldyBJKHQsYSxuKSxkPW5ldyBGKHQsYSksci5pbmNsdXNpb25UcmVlPWUsci56ZXJvQml0UGxhbmVzVHJlZT1kO2ZvcihsZXQgZT0wO2U8bjtlKyspaWYoMCE9PWgoMSkpdGhyb3cgbmV3IG8oIkludmFsaWQgdGFnIHRyZWUiKX1pZihlLnJlc2V0KHMsbCxuKSlmb3IoOzspe2lmKCFoKDEpKXtlLmluY3JlbWVudFZhbHVlKG4pO2JyZWFrfWlmKHU9IWUubmV4dExldmVsKCksdSl7Yy5pbmNsdWRlZD0hMCxmPXA9ITA7YnJlYWt9fX1pZighZiljb250aW51ZTtpZihwKXtmb3IoZD1yLnplcm9CaXRQbGFuZXNUcmVlLGQucmVzZXQocyxsKTs7KWlmKGgoMSkpe2lmKHU9IWQubmV4dExldmVsKCksdSlicmVha31lbHNlIGQuaW5jcmVtZW50VmFsdWUoKTtjLnplcm9CaXRQbGFuZXM9ZC52YWx1ZX1jb25zdCBtPWcoKTtmb3IoO2goMSk7KWMuTGJsb2NrKys7Y29uc3QgYj0oMCxhLmxvZzIpKG0pLHk9aCgobTwxPDxiP2ItMTpiKStjLkxibG9jayk7aS5wdXNoKHtjb2RlYmxvY2s6Yyxjb2RpbmdwYXNzZXM6bSxkYXRhTGVuZ3RoOnl9KX1mb3IoZigpLHkmJnUoMTQ2KTtpLmxlbmd0aD4wOyl7Y29uc3QgZT1pLnNoaWZ0KCk7Yz1lLmNvZGVibG9jayx2b2lkIDA9PT1jLmRhdGEmJihjLmRhdGE9W10pLGMuZGF0YS5wdXNoKHtkYXRhOnQsc3RhcnQ6citzLGVuZDpyK3MrZS5kYXRhTGVuZ3RoLGNvZGluZ3Bhc3NlczplLmNvZGluZ3Bhc3Nlc30pLHMrPWUuZGF0YUxlbmd0aH19cmV0dXJuIHN9ZnVuY3Rpb24gayhlLHQscixuLGEsaSxvLGMsbCl7Y29uc3QgaD1uLnRieDAsdT1uLnRieTAsZD1uLnRieDEtbi50YngwLGY9bi5jb2RlYmxvY2tzLGc9IkgiPT09bi50eXBlLmNoYXJBdCgwKT8xOjAscD0iSCI9PT1uLnR5cGUuY2hhckF0KDEpP3Q6MDtmb3IobGV0IHI9MCxtPWYubGVuZ3RoO3I8bTsrK3Ipe2NvbnN0IG09ZltyXSxiPW0udGJ4MV8tbS50YngwXyx5PW0udGJ5MV8tbS50YnkwXztpZigwPT09Ynx8MD09PXkpY29udGludWU7aWYodm9pZCAwPT09bS5kYXRhKWNvbnRpbnVlO2NvbnN0IHc9bmV3IFQoYix5LG0uc3ViYmFuZFR5cGUsbS56ZXJvQml0UGxhbmVzLGkpO2xldCB2PTI7Y29uc3QgeD1tLmRhdGE7bGV0IFMsQSxrLEM9MCxPPTA7Zm9yKFM9MCxBPXgubGVuZ3RoO1M8QTtTKyspaz14W1NdLEMrPWsuZW5kLWsuc3RhcnQsTys9ay5jb2RpbmdwYXNzZXM7Y29uc3QgRj1uZXcgVWludDhBcnJheShDKTtsZXQgST0wO2ZvcihTPTAsQT14Lmxlbmd0aDtTPEE7UysrKXtrPXhbU107Y29uc3QgZT1rLmRhdGEuc3ViYXJyYXkoay5zdGFydCxrLmVuZCk7Ri5zZXQoZSxJKSxJKz1lLmxlbmd0aH1jb25zdCBNPW5ldyBzLkFyaXRobWV0aWNEZWNvZGVyKEYsMCxDKTtmb3Iody5zZXREZWNvZGVyKE0pLFM9MDtTPE87UysrKXtzd2l0Y2godil7Y2FzZSAwOncucnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzKCk7YnJlYWs7Y2FzZSAxOncucnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MoKTticmVhaztjYXNlIDI6dy5ydW5DbGVhbnVwUGFzcygpLGMmJncuY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKX1sJiZ3LnJlc2V0KCksdj0odisxKSUzfWxldCBFPW0udGJ4MF8taCsobS50YnkwXy11KSpkO2NvbnN0IFA9dy5jb2VmZmljZW50c1NpZ24sUj13LmNvZWZmaWNlbnRzTWFnbml0dWRlLE49dy5iaXRzRGVjb2RlZCxEPW8/MDouNTtsZXQgQixMLF87ST0wO2NvbnN0IGo9IkxMIiE9PW4udHlwZTtmb3IoUz0wO1M8eTtTKyspe2NvbnN0IHI9MiooRS9kfDApKih0LWQpK2crcDtmb3IoQj0wO0I8YjtCKyspTD1SW0ldLDAhPT1MJiYoTD0oTCtEKSphLDAhPT1QW0ldJiYoTD0tTCksXz1OW0ldLGVbaj9yKyhFPDwxKTpFXT1vJiZfPj1pP0w6TCooMTw8aS1fKSksRSsrLEkrKztFKz1kLWJ9fX1mdW5jdGlvbiBDKGUsdCxyKXtjb25zdCBuPXQuY29tcG9uZW50c1tyXSxhPW4uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLGk9bi5xdWFudGl6YXRpb25QYXJhbWV0ZXJzLHM9YS5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsbz1pLlNQcWNkcyxsPWkuc2NhbGFyRXhwb3VuZGVkLGg9aS5ndWFyZEJpdHMsdT1hLnNlZ21lbnRhdGlvblN5bWJvbFVzZWQsZD1hLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMsZj1lLmNvbXBvbmVudHNbcl0ucHJlY2lzaW9uLGc9YS5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24scD1nP25ldyBQOm5ldyBFLG09W107bGV0IGI9MDtmb3IobGV0IGU9MDtlPD1zO2UrKyl7Y29uc3QgdD1uLnJlc29sdXRpb25zW2VdLHI9dC50cngxLXQudHJ4MCxhPXQudHJ5MS10LnRyeTAsaT1uZXcgRmxvYXQzMkFycmF5KHIqYSk7Zm9yKGxldCBuPTAsYT10LnN1YmJhbmRzLmxlbmd0aDtuPGE7bisrKXtsZXQgYSxzO2w/KGE9b1tiXS5tdSxzPW9bYl0uZXBzaWxvbixiKyspOihhPW9bMF0ubXUscz1vWzBdLmVwc2lsb24rKGU+MD8xLWU6MCkpO2NvbnN0IHA9dC5zdWJiYW5kc1tuXSxtPWNbcC50eXBlXTtrKGksciwwLHAsZz8xOjIqKihmK20tcykqKDErYS8yMDQ4KSxoK3MtMSxnLHUsZCl9bS5wdXNoKHt3aWR0aDpyLGhlaWdodDphLGl0ZW1zOml9KX1jb25zdCB5PXAuY2FsY3VsYXRlKG0sbi50Y3gwLG4udGN5MCk7cmV0dXJue2xlZnQ6bi50Y3gwLHRvcDpuLnRjeTAsd2lkdGg6eS53aWR0aCxoZWlnaHQ6eS5oZWlnaHQsaXRlbXM6eS5pdGVtc319ZnVuY3Rpb24gTyhlLHQpe2NvbnN0IHI9ZS5TSVouQ3NpeixuPWUudGlsZXNbdF07Zm9yKGxldCB0PTA7dDxyO3QrKyl7Y29uc3Qgcj1uLmNvbXBvbmVudHNbdF0sYT12b2lkIDAhPT1lLmN1cnJlbnRUaWxlLlFDQ1t0XT9lLmN1cnJlbnRUaWxlLlFDQ1t0XTplLmN1cnJlbnRUaWxlLlFDRDtyLnF1YW50aXphdGlvblBhcmFtZXRlcnM9YTtjb25zdCBpPXZvaWQgMCE9PWUuY3VycmVudFRpbGUuQ09DW3RdP2UuY3VycmVudFRpbGUuQ09DW3RdOmUuY3VycmVudFRpbGUuQ09EO3IuY29kaW5nU3R5bGVQYXJhbWV0ZXJzPWl9bi5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzPWUuY3VycmVudFRpbGUuQ09EfXQuSnB4SW1hZ2U9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmZhaWxPbkNvcnJ1cHRlZEltYWdlPSExfXBhcnNlKGUpe2lmKDY1MzU5PT09KDAsYS5yZWFkVWludDE2KShlLDApKXJldHVybiB2b2lkIHRoaXMucGFyc2VDb2Rlc3RyZWFtKGUsMCxlLmxlbmd0aCk7Y29uc3QgdD1lLmxlbmd0aDtsZXQgcj0wO2Zvcig7cjx0Oyl7bGV0IGk9OCxzPSgwLGEucmVhZFVpbnQzMikoZSxyKTtjb25zdCBjPSgwLGEucmVhZFVpbnQzMikoZSxyKzQpO2lmKHIrPWksMT09PXMmJihzPTQyOTQ5NjcyOTYqKDAsYS5yZWFkVWludDMyKShlLHIpKygwLGEucmVhZFVpbnQzMikoZSxyKzQpLHIrPTgsaSs9OCksMD09PXMmJihzPXQtcitpKSxzPGkpdGhyb3cgbmV3IG8oIkludmFsaWQgYm94IGZpZWxkIHNpemUiKTtjb25zdCBsPXMtaTtsZXQgaD0hMDtzd2l0Y2goYyl7Y2FzZSAxNzg1NzM3ODMyOmg9ITE7YnJlYWs7Y2FzZSAxNjY4MjQ2NjQyOmNvbnN0IHQ9ZVtyXTtpZigxPT09dCl7Y29uc3QgdD0oMCxhLnJlYWRVaW50MzIpKGUsciszKTtzd2l0Y2godCl7Y2FzZSAxNjpjYXNlIDE3OmNhc2UgMTg6YnJlYWs7ZGVmYXVsdDooMCxuLndhcm4pKCJVbmtub3duIGNvbG9yc3BhY2UgIit0KX19ZWxzZSAyPT09dCYmKDAsbi5pbmZvKSgiSUNDIHByb2ZpbGUgbm90IHN1cHBvcnRlZCIpO2JyZWFrO2Nhc2UgMTc4NTczNzgyNzp0aGlzLnBhcnNlQ29kZXN0cmVhbShlLHIscitsKTticmVhaztjYXNlIDE3ODM2MzZlMzoyMTg3OTM3MzghPT0oMCxhLnJlYWRVaW50MzIpKGUscikmJigwLG4ud2FybikoIkludmFsaWQgSlAyIHNpZ25hdHVyZSIpO2JyZWFrO2Nhc2UgMTc4MzYzNDQ1ODpjYXNlIDE3MTg5MDkyOTY6Y2FzZSAxOTIwMDk5Njk3OmNhc2UgMTkxOTI1MTIzMjpjYXNlIDE3Njg0NDkxMzg6YnJlYWs7ZGVmYXVsdDpjb25zdCBpPVN0cmluZy5mcm9tQ2hhckNvZGUoYz4+MjQmMjU1LGM+PjE2JjI1NSxjPj44JjI1NSwyNTUmYyk7KDAsbi53YXJuKSgiVW5zdXBwb3J0ZWQgaGVhZGVyIHR5cGUgIi5jb25jYXQoYywiICgiKS5jb25jYXQoaSwiKS4iKSl9aCYmKHIrPWwpfX1wYXJzZUltYWdlUHJvcGVydGllcyhlKXtsZXQgdD1lLmdldEJ5dGUoKTtmb3IoO3Q+PTA7KXtjb25zdCByPXQ7aWYodD1lLmdldEJ5dGUoKSw2NTM2MT09KHI8PDh8dCkpe2Uuc2tpcCg0KTtjb25zdCB0PWUuZ2V0SW50MzIoKT4+PjAscj1lLmdldEludDMyKCk+Pj4wLG49ZS5nZXRJbnQzMigpPj4+MCxhPWUuZ2V0SW50MzIoKT4+PjA7ZS5za2lwKDE2KTtjb25zdCBpPWUuZ2V0VWludDE2KCk7cmV0dXJuIHRoaXMud2lkdGg9dC1uLHRoaXMuaGVpZ2h0PXItYSx0aGlzLmNvbXBvbmVudHNDb3VudD1pLHZvaWQodGhpcy5iaXRzUGVyQ29tcG9uZW50PTgpfX10aHJvdyBuZXcgbygiTm8gc2l6ZSBtYXJrZXIgZm91bmQgaW4gSlBYIHN0cmVhbSIpfXBhcnNlQ29kZXN0cmVhbShlLHQscil7Y29uc3QgaT17fTtsZXQgcz0hMTt0cnl7bGV0IG89dDtmb3IoO28rMTxyOyl7Y29uc3QgdD0oMCxhLnJlYWRVaW50MTYpKGUsbyk7bys9MjtsZXQgcixjLHUsZCxmLGcscD0wO3N3aXRjaCh0KXtjYXNlIDY1MzU5OmkubWFpbkhlYWRlcj0hMDticmVhaztjYXNlIDY1NDk3OmJyZWFrO2Nhc2UgNjUzNjE6cD0oMCxhLnJlYWRVaW50MTYpKGUsbyk7Y29uc3QgbT17fTttLlhzaXo9KDAsYS5yZWFkVWludDMyKShlLG8rNCksbS5Zc2l6PSgwLGEucmVhZFVpbnQzMikoZSxvKzgpLG0uWE9zaXo9KDAsYS5yZWFkVWludDMyKShlLG8rMTIpLG0uWU9zaXo9KDAsYS5yZWFkVWludDMyKShlLG8rMTYpLG0uWFRzaXo9KDAsYS5yZWFkVWludDMyKShlLG8rMjApLG0uWVRzaXo9KDAsYS5yZWFkVWludDMyKShlLG8rMjQpLG0uWFRPc2l6PSgwLGEucmVhZFVpbnQzMikoZSxvKzI4KSxtLllUT3Npej0oMCxhLnJlYWRVaW50MzIpKGUsbyszMik7Y29uc3QgYj0oMCxhLnJlYWRVaW50MTYpKGUsbyszNik7bS5Dc2l6PWI7Y29uc3QgeT1bXTtyPW8rMzg7Zm9yKGxldCB0PTA7dDxiO3QrKyl7Y29uc3QgdD17cHJlY2lzaW9uOjErKDEyNyZlW3JdKSxpc1NpZ25lZDohISgxMjgmZVtyXSksWFJzaXo6ZVtyKzFdLFlSc2l6OmVbcisyXX07cis9MyxsKHQsbSkseS5wdXNoKHQpfWkuU0laPW0saS5jb21wb25lbnRzPXksaChpLHkpLGkuUUNDPVtdLGkuQ09DPVtdO2JyZWFrO2Nhc2UgNjUzNzI6cD0oMCxhLnJlYWRVaW50MTYpKGUsbyk7Y29uc3Qgdz17fTtzd2l0Y2gocj1vKzIsYz1lW3IrK10sMzEmYyl7Y2FzZSAwOmQ9OCxmPSEwO2JyZWFrO2Nhc2UgMTpkPTE2LGY9ITE7YnJlYWs7Y2FzZSAyOmQ9MTYsZj0hMDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBTUWNkIHZhbHVlICIrYyl9Zm9yKHcubm9RdWFudGl6YXRpb249OD09PWQsdy5zY2FsYXJFeHBvdW5kZWQ9Zix3Lmd1YXJkQml0cz1jPj41LHU9W107cjxwK287KXtjb25zdCB0PXt9Ozg9PT1kPyh0LmVwc2lsb249ZVtyKytdPj4zLHQubXU9MCk6KHQuZXBzaWxvbj1lW3JdPj4zLHQubXU9KDcmZVtyXSk8PDh8ZVtyKzFdLHIrPTIpLHUucHVzaCh0KX13LlNQcWNkcz11LGkubWFpbkhlYWRlcj9pLlFDRD13OihpLmN1cnJlbnRUaWxlLlFDRD13LGkuY3VycmVudFRpbGUuUUNDPVtdKTticmVhaztjYXNlIDY1MzczOnA9KDAsYS5yZWFkVWludDE2KShlLG8pO2NvbnN0IHY9e307bGV0IHg7c3dpdGNoKHI9bysyLGkuU0laLkNzaXo8MjU3P3g9ZVtyKytdOih4PSgwLGEucmVhZFVpbnQxNikoZSxyKSxyKz0yKSxjPWVbcisrXSwzMSZjKXtjYXNlIDA6ZD04LGY9ITA7YnJlYWs7Y2FzZSAxOmQ9MTYsZj0hMTticmVhaztjYXNlIDI6ZD0xNixmPSEwO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFNRY2QgdmFsdWUgIitjKX1mb3Iodi5ub1F1YW50aXphdGlvbj04PT09ZCx2LnNjYWxhckV4cG91bmRlZD1mLHYuZ3VhcmRCaXRzPWM+PjUsdT1bXTtyPHArbzspe2NvbnN0IHQ9e307OD09PWQ/KHQuZXBzaWxvbj1lW3IrK10+PjMsdC5tdT0wKToodC5lcHNpbG9uPWVbcl0+PjMsdC5tdT0oNyZlW3JdKTw8OHxlW3IrMV0scis9MiksdS5wdXNoKHQpfXYuU1BxY2RzPXUsaS5tYWluSGVhZGVyP2kuUUNDW3hdPXY6aS5jdXJyZW50VGlsZS5RQ0NbeF09djticmVhaztjYXNlIDY1MzYyOnA9KDAsYS5yZWFkVWludDE2KShlLG8pO2NvbnN0IGs9e307cj1vKzI7Y29uc3QgQz1lW3IrK107ay5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzPSEhKDEmQyksay5zb3BNYXJrZXJVc2VkPSEhKDImQyksay5lcGhNYXJrZXJVc2VkPSEhKDQmQyksay5wcm9ncmVzc2lvbk9yZGVyPWVbcisrXSxrLmxheWVyc0NvdW50PSgwLGEucmVhZFVpbnQxNikoZSxyKSxyKz0yLGsubXVsdGlwbGVDb21wb25lbnRUcmFuc2Zvcm09ZVtyKytdLGsuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50PWVbcisrXSxrLnhjYj0yKygxNSZlW3IrK10pLGsueWNiPTIrKDE1JmVbcisrXSk7Y29uc3QgRj1lW3IrK107aWYoay5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzPSEhKDEmRiksay5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzPSEhKDImRiksay50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3M9ISEoNCZGKSxrLnZlcnRpY2FsbHlTdHJpcGU9ISEoOCZGKSxrLnByZWRpY3RhYmxlVGVybWluYXRpb249ISEoMTYmRiksay5zZWdtZW50YXRpb25TeW1ib2xVc2VkPSEhKDMyJkYpLGsucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uPWVbcisrXSxrLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMpe2NvbnN0IHQ9W107Zm9yKDtyPHArbzspe2NvbnN0IG49ZVtyKytdO3QucHVzaCh7UFB4OjE1Jm4sUFB5Om4+PjR9KX1rLnByZWNpbmN0c1NpemVzPXR9Y29uc3QgST1bXTtrLnNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MmJkkucHVzaCgic2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcyIpLGsudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzJiZJLnB1c2goInRlcm1pbmF0aW9uT25FYWNoQ29kaW5nUGFzcyIpLGsudmVydGljYWxseVN0cmlwZSYmSS5wdXNoKCJ2ZXJ0aWNhbGx5U3RyaXBlIiksay5wcmVkaWN0YWJsZVRlcm1pbmF0aW9uJiZJLnB1c2goInByZWRpY3RhYmxlVGVybWluYXRpb24iKSxJLmxlbmd0aD4wJiYocz0hMCwoMCxuLndhcm4pKCJKUFg6IFVuc3VwcG9ydGVkIENPRCBvcHRpb25zICgiLmNvbmNhdChJLmpvaW4oIiwgIiksIikuIikpKSxpLm1haW5IZWFkZXI/aS5DT0Q9azooaS5jdXJyZW50VGlsZS5DT0Q9ayxpLmN1cnJlbnRUaWxlLkNPQz1bXSk7YnJlYWs7Y2FzZSA2NTQyNDpwPSgwLGEucmVhZFVpbnQxNikoZSxvKSxnPXt9LGcuaW5kZXg9KDAsYS5yZWFkVWludDE2KShlLG8rMiksZy5sZW5ndGg9KDAsYS5yZWFkVWludDMyKShlLG8rNCksZy5kYXRhRW5kPWcubGVuZ3RoK28tMixnLnBhcnRJbmRleD1lW28rOF0sZy5wYXJ0c0NvdW50PWVbbys5XSxpLm1haW5IZWFkZXI9ITEsMD09PWcucGFydEluZGV4JiYoZy5DT0Q9aS5DT0QsZy5DT0M9aS5DT0Muc2xpY2UoMCksZy5RQ0Q9aS5RQ0QsZy5RQ0M9aS5RQ0Muc2xpY2UoMCkpLGkuY3VycmVudFRpbGU9ZzticmVhaztjYXNlIDY1NDI3Omc9aS5jdXJyZW50VGlsZSwwPT09Zy5wYXJ0SW5kZXgmJihPKGksZy5pbmRleCksUyhpKSkscD1nLmRhdGFFbmQtbyxBKGksZSxvLHApO2JyZWFrO2Nhc2UgNjUzNjM6KDAsbi53YXJuKSgiSlBYOiBDb2Rlc3RyZWFtIGNvZGUgMHhGRjUzIChDT0MpIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTtjYXNlIDY1MzY1OmNhc2UgNjUzNjc6Y2FzZSA2NTM2ODpjYXNlIDY1MzgwOnA9KDAsYS5yZWFkVWludDE2KShlLG8pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvZGVzdHJlYW0gY29kZTogIit0LnRvU3RyaW5nKDE2KSl9bys9cH19Y2F0Y2goZSl7aWYoc3x8dGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSl0aHJvdyBuZXcgbyhlLm1lc3NhZ2UpOygwLG4ud2FybikoJ0pQWDogVHJ5aW5nIHRvIHJlY292ZXIgZnJvbTogIicuY29uY2F0KGUubWVzc2FnZSwnIi4nKSl9dGhpcy50aWxlcz1mdW5jdGlvbihlKXtjb25zdCB0PWUuU0laLHI9ZS5jb21wb25lbnRzLG49dC5Dc2l6LGE9W107Zm9yKGxldCB0PTAsaT1lLnRpbGVzLmxlbmd0aDt0PGk7dCsrKXtjb25zdCBpPWUudGlsZXNbdF0scz1bXTtmb3IobGV0IHQ9MDt0PG47dCsrKXNbdF09QyhlLGksdCk7Y29uc3Qgbz1zWzBdLGM9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG8uaXRlbXMubGVuZ3RoKm4pLGw9e2xlZnQ6by5sZWZ0LHRvcDpvLnRvcCx3aWR0aDpvLndpZHRoLGhlaWdodDpvLmhlaWdodCxpdGVtczpjfTtsZXQgaCx1LGQsZixnLHAsbSxiPTA7aWYoaS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtKXtjb25zdCBlPTQ9PT1uLHQ9c1swXS5pdGVtcyxhPXNbMV0uaXRlbXMsbz1zWzJdLml0ZW1zLGw9ZT9zWzNdLml0ZW1zOm51bGw7aD1yWzBdLnByZWNpc2lvbi04LHU9LjUrKDEyODw8aCk7Y29uc3QgeT1pLmNvbXBvbmVudHNbMF0sdz1uLTM7aWYoZj10Lmxlbmd0aCx5LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24pZm9yKGQ9MDtkPGY7ZCsrLGIrPXcpe2c9dFtkXSt1LHA9YVtkXSxtPW9bZF07Y29uc3QgZT1nLShtK3A+PjIpO2NbYisrXT1lK20+PmgsY1tiKytdPWU+PmgsY1tiKytdPWUrcD4+aH1lbHNlIGZvcihkPTA7ZDxmO2QrKyxiKz13KWc9dFtkXSt1LHA9YVtkXSxtPW9bZF0sY1tiKytdPWcrMS40MDIqbT4+aCxjW2IrK109Zy0uMzQ0MTMqcC0uNzE0MTQqbT4+aCxjW2IrK109ZysxLjc3MipwPj5oO2lmKGUpZm9yKGQ9MCxiPTM7ZDxmO2QrKyxiKz00KWNbYl09bFtkXSt1Pj5ofWVsc2UgZm9yKGxldCBlPTA7ZTxuO2UrKyl7Y29uc3QgdD1zW2VdLml0ZW1zO2ZvcihoPXJbZV0ucHJlY2lzaW9uLTgsdT0uNSsoMTI4PDxoKSxiPWUsZD0wLGY9dC5sZW5ndGg7ZDxmO2QrKyljW2JdPXRbZF0rdT4+aCxiKz1ufWEucHVzaChsKX1yZXR1cm4gYX0oaSksdGhpcy53aWR0aD1pLlNJWi5Yc2l6LWkuU0laLlhPc2l6LHRoaXMuaGVpZ2h0PWkuU0laLllzaXotaS5TSVouWU9zaXosdGhpcy5jb21wb25lbnRzQ291bnQ9aS5TSVouQ3Npen19O2NsYXNzIEZ7Y29uc3RydWN0b3IoZSx0KXtjb25zdCByPSgwLGEubG9nMikoTWF0aC5tYXgoZSx0KSkrMTt0aGlzLmxldmVscz1bXTtmb3IobGV0IG49MDtuPHI7bisrKXtjb25zdCByPXt3aWR0aDplLGhlaWdodDp0LGl0ZW1zOltdfTt0aGlzLmxldmVscy5wdXNoKHIpLGU9TWF0aC5jZWlsKGUvMiksdD1NYXRoLmNlaWwodC8yKX19cmVzZXQoZSx0KXtsZXQgcixuPTAsYT0wO2Zvcig7bjx0aGlzLmxldmVscy5sZW5ndGg7KXtyPXRoaXMubGV2ZWxzW25dO2NvbnN0IGk9ZSt0KnIud2lkdGg7aWYodm9pZCAwIT09ci5pdGVtc1tpXSl7YT1yLml0ZW1zW2ldO2JyZWFrfXIuaW5kZXg9aSxlPj49MSx0Pj49MSxuKyt9bi0tLHI9dGhpcy5sZXZlbHNbbl0sci5pdGVtc1tyLmluZGV4XT1hLHRoaXMuY3VycmVudExldmVsPW4sZGVsZXRlIHRoaXMudmFsdWV9aW5jcmVtZW50VmFsdWUoKXtjb25zdCBlPXRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTtlLml0ZW1zW2UuaW5kZXhdKyt9bmV4dExldmVsKCl7bGV0IGU9dGhpcy5jdXJyZW50TGV2ZWwsdD10aGlzLmxldmVsc1tlXTtjb25zdCByPXQuaXRlbXNbdC5pbmRleF07cmV0dXJuIGUtLSxlPDA/KHRoaXMudmFsdWU9ciwhMSk6KHRoaXMuY3VycmVudExldmVsPWUsdD10aGlzLmxldmVsc1tlXSx0Lml0ZW1zW3QuaW5kZXhdPXIsITApfX1jbGFzcyBJe2NvbnN0cnVjdG9yKGUsdCxyKXtjb25zdCBuPSgwLGEubG9nMikoTWF0aC5tYXgoZSx0KSkrMTt0aGlzLmxldmVscz1bXTtmb3IobGV0IGE9MDthPG47YSsrKXtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUqdCk7Zm9yKGxldCBlPTAsdD1uLmxlbmd0aDtlPHQ7ZSsrKW5bZV09cjtjb25zdCBhPXt3aWR0aDplLGhlaWdodDp0LGl0ZW1zOm59O3RoaXMubGV2ZWxzLnB1c2goYSksZT1NYXRoLmNlaWwoZS8yKSx0PU1hdGguY2VpbCh0LzIpfX1yZXNldChlLHQscil7bGV0IG49MDtmb3IoO248dGhpcy5sZXZlbHMubGVuZ3RoOyl7Y29uc3QgYT10aGlzLmxldmVsc1tuXSxpPWUrdCphLndpZHRoO2EuaW5kZXg9aTtjb25zdCBzPWEuaXRlbXNbaV07aWYoMjU1PT09cylicmVhaztpZihzPnIpcmV0dXJuIHRoaXMuY3VycmVudExldmVsPW4sdGhpcy5wcm9wYWdhdGVWYWx1ZXMoKSwhMTtlPj49MSx0Pj49MSxuKyt9cmV0dXJuIHRoaXMuY3VycmVudExldmVsPW4tMSwhMH1pbmNyZW1lbnRWYWx1ZShlKXtjb25zdCB0PXRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTt0Lml0ZW1zW3QuaW5kZXhdPWUrMSx0aGlzLnByb3BhZ2F0ZVZhbHVlcygpfXByb3BhZ2F0ZVZhbHVlcygpe2xldCBlPXRoaXMuY3VycmVudExldmVsLHQ9dGhpcy5sZXZlbHNbZV07Y29uc3Qgcj10Lml0ZW1zW3QuaW5kZXhdO2Zvcig7LS1lPj0wOyl0PXRoaXMubGV2ZWxzW2VdLHQuaXRlbXNbdC5pbmRleF09cn1uZXh0TGV2ZWwoKXtsZXQgZT10aGlzLmN1cnJlbnRMZXZlbCx0PXRoaXMubGV2ZWxzW2VdO2NvbnN0IHI9dC5pdGVtc1t0LmluZGV4XTtyZXR1cm4gdC5pdGVtc1t0LmluZGV4XT0yNTUsZS0tLCEoZTwwfHwodGhpcy5jdXJyZW50TGV2ZWw9ZSx0PXRoaXMubGV2ZWxzW2VdLHQuaXRlbXNbdC5pbmRleF09ciwwKSl9fWNsYXNzIFR7Y29uc3RydWN0b3IoZSx0LHIsbixhKXtsZXQgaTt0aGlzLndpZHRoPWUsdGhpcy5oZWlnaHQ9dCxpPSJISCI9PT1yP1QuSEhDb250ZXh0TGFiZWw6IkhMIj09PXI/VC5ITENvbnRleHRMYWJlbDpULkxMQW5kTEhDb250ZXh0c0xhYmVsLHRoaXMuY29udGV4dExhYmVsVGFibGU9aTtjb25zdCBzPWUqdDtsZXQgbzt0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZT1uZXcgVWludDhBcnJheShzKSx0aGlzLmNvZWZmaWNlbnRzU2lnbj1uZXcgVWludDhBcnJheShzKSxvPWE+MTQ/bmV3IFVpbnQzMkFycmF5KHMpOmE+Nj9uZXcgVWludDE2QXJyYXkocyk6bmV3IFVpbnQ4QXJyYXkocyksdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZT1vLHRoaXMucHJvY2Vzc2luZ0ZsYWdzPW5ldyBVaW50OEFycmF5KHMpO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkocyk7aWYoMCE9PW4pZm9yKGxldCBlPTA7ZTxzO2UrKyljW2VdPW47dGhpcy5iaXRzRGVjb2RlZD1jLHRoaXMucmVzZXQoKX1zZXREZWNvZGVyKGUpe3RoaXMuZGVjb2Rlcj1lfXJlc2V0KCl7dGhpcy5jb250ZXh0cz1uZXcgSW50OEFycmF5KDE5KSx0aGlzLmNvbnRleHRzWzBdPTgsdGhpcy5jb250ZXh0c1tULlVOSUZPUk1fQ09OVEVYVF09OTIsdGhpcy5jb250ZXh0c1tULlJVTkxFTkdUSF9DT05URVhUXT02fXNldE5laWdoYm9yc1NpZ25pZmljYW5jZShlLHQscil7Y29uc3Qgbj10aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSxhPXRoaXMud2lkdGgsaT10aGlzLmhlaWdodCxzPXQ+MCxvPXQrMTxhO2xldCBjO2U+MCYmKGM9ci1hLHMmJihuW2MtMV0rPTE2KSxvJiYobltjKzFdKz0xNiksbltjXSs9NCksZSsxPGkmJihjPXIrYSxzJiYobltjLTFdKz0xNiksbyYmKG5bYysxXSs9MTYpLG5bY10rPTQpLHMmJihuW3ItMV0rPTEpLG8mJihuW3IrMV0rPTEpLG5bcl18PTEyOH1ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKXtjb25zdCBlPXRoaXMuZGVjb2Rlcix0PXRoaXMud2lkdGgscj10aGlzLmhlaWdodCxuPXRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUsYT10aGlzLmNvZWZmaWNlbnRzU2lnbixpPXRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlLHM9dGhpcy5wcm9jZXNzaW5nRmxhZ3Msbz10aGlzLmNvbnRleHRzLGM9dGhpcy5jb250ZXh0TGFiZWxUYWJsZSxsPXRoaXMuYml0c0RlY29kZWQ7Zm9yKGxldCBoPTA7aDxyO2grPTQpZm9yKGxldCB1PTA7dTx0O3UrKyl7bGV0IGQ9aCp0K3U7Zm9yKGxldCBmPTA7Zjw0O2YrKyxkKz10KXtjb25zdCB0PWgrZjtpZih0Pj1yKWJyZWFrO2lmKHNbZF0mPS0yLG5bZF18fCFpW2RdKWNvbnRpbnVlO2NvbnN0IGc9Y1tpW2RdXTtpZihlLnJlYWRCaXQobyxnKSl7Y29uc3QgZT10aGlzLmRlY29kZVNpZ25CaXQodCx1LGQpO2FbZF09ZSxuW2RdPTEsdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UodCx1LGQpLHNbZF18PTJ9bFtkXSsrLHNbZF18PTF9fX1kZWNvZGVTaWduQml0KGUsdCxyKXtjb25zdCBuPXRoaXMud2lkdGgsYT10aGlzLmhlaWdodCxpPXRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUscz10aGlzLmNvZWZmaWNlbnRzU2lnbjtsZXQgbyxjLGwsaCx1LGQ7aD10PjAmJjAhPT1pW3ItMV0sdCsxPG4mJjAhPT1pW3IrMV0/KGw9c1tyKzFdLGg/KGM9c1tyLTFdLG89MS1sLWMpOm89MS1sLWwpOmg/KGM9c1tyLTFdLG89MS1jLWMpOm89MDtjb25zdCBmPTMqbztyZXR1cm4gaD1lPjAmJjAhPT1pW3Itbl0sZSsxPGEmJjAhPT1pW3Irbl0/KGw9c1tyK25dLGg/KGM9c1tyLW5dLG89MS1sLWMrZik6bz0xLWwtbCtmKTpoPyhjPXNbci1uXSxvPTEtYy1jK2YpOm89ZixvPj0wPyh1PTkrbyxkPXRoaXMuZGVjb2Rlci5yZWFkQml0KHRoaXMuY29udGV4dHMsdSkpOih1PTktbyxkPTFedGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cyx1KSksZH1ydW5NYWduaXR1ZGVSZWZpbmVtZW50UGFzcygpe2NvbnN0IGU9dGhpcy5kZWNvZGVyLHQ9dGhpcy53aWR0aCxyPXRoaXMuaGVpZ2h0LG49dGhpcy5jb2VmZmljZW50c01hZ25pdHVkZSxhPXRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlLGk9dGhpcy5jb250ZXh0cyxzPXRoaXMuYml0c0RlY29kZWQsbz10aGlzLnByb2Nlc3NpbmdGbGFncyxjPXQqcixsPTQqdDtmb3IobGV0IHIsaD0wO2g8YztoPXIpe3I9TWF0aC5taW4oYyxoK2wpO2ZvcihsZXQgYz0wO2M8dDtjKyspZm9yKGxldCBsPWgrYztsPHI7bCs9dCl7aWYoIW5bbF18fDAhPSgxJm9bbF0pKWNvbnRpbnVlO2xldCB0PTE2OzAhPSgyJm9bbF0pJiYob1tsXV49Mix0PTA9PSgxMjcmYVtsXSk/MTU6MTQpO2NvbnN0IHI9ZS5yZWFkQml0KGksdCk7bltsXT1uW2xdPDwxfHIsc1tsXSsrLG9bbF18PTF9fX1ydW5DbGVhbnVwUGFzcygpe2NvbnN0IGU9dGhpcy5kZWNvZGVyLHQ9dGhpcy53aWR0aCxyPXRoaXMuaGVpZ2h0LG49dGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2UsYT10aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlLGk9dGhpcy5jb2VmZmljZW50c1NpZ24scz10aGlzLmNvbnRleHRzLG89dGhpcy5jb250ZXh0TGFiZWxUYWJsZSxjPXRoaXMuYml0c0RlY29kZWQsbD10aGlzLnByb2Nlc3NpbmdGbGFncyxoPXQsdT0yKnQsZD0zKnQ7bGV0IGY7Zm9yKGxldCBnPTA7ZzxyO2c9Zil7Zj1NYXRoLm1pbihnKzQscik7Y29uc3QgcD1nKnQsbT1nKzM8cjtmb3IobGV0IHI9MDtyPHQ7cisrKXtjb25zdCBiPXArcjtsZXQgeSx3PTAsdj1iLHg9ZztpZihtJiYwPT09bFtiXSYmMD09PWxbYitoXSYmMD09PWxbYit1XSYmMD09PWxbYitkXSYmMD09PW5bYl0mJjA9PT1uW2IraF0mJjA9PT1uW2IrdV0mJjA9PT1uW2IrZF0pe2lmKCFlLnJlYWRCaXQocyxULlJVTkxFTkdUSF9DT05URVhUKSl7Y1tiXSsrLGNbYitoXSsrLGNbYit1XSsrLGNbYitkXSsrO2NvbnRpbnVlfXc9ZS5yZWFkQml0KHMsVC5VTklGT1JNX0NPTlRFWFQpPDwxfGUucmVhZEJpdChzLFQuVU5JRk9STV9DT05URVhUKSwwIT09dyYmKHg9Zyt3LHYrPXcqdCkseT10aGlzLmRlY29kZVNpZ25CaXQoeCxyLHYpLGlbdl09eSxhW3ZdPTEsdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoeCxyLHYpLGxbdl18PTIsdj1iO2ZvcihsZXQgZT1nO2U8PXg7ZSsrLHYrPXQpY1t2XSsrO3crK31mb3IoeD1nK3c7eDxmO3grKyx2Kz10KXtpZihhW3ZdfHwwIT0oMSZsW3ZdKSljb250aW51ZTtjb25zdCB0PW9bblt2XV07MT09PWUucmVhZEJpdChzLHQpJiYoeT10aGlzLmRlY29kZVNpZ25CaXQoeCxyLHYpLGlbdl09eSxhW3ZdPTEsdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoeCxyLHYpLGxbdl18PTIpLGNbdl0rK319fX1jaGVja1NlZ21lbnRhdGlvblN5bWJvbCgpe2NvbnN0IGU9dGhpcy5kZWNvZGVyLHQ9dGhpcy5jb250ZXh0cztpZigxMCE9KGUucmVhZEJpdCh0LFQuVU5JRk9STV9DT05URVhUKTw8M3xlLnJlYWRCaXQodCxULlVOSUZPUk1fQ09OVEVYVCk8PDJ8ZS5yZWFkQml0KHQsVC5VTklGT1JNX0NPTlRFWFQpPDwxfGUucmVhZEJpdCh0LFQuVU5JRk9STV9DT05URVhUKSkpdGhyb3cgbmV3IG8oIkludmFsaWQgc2VnbWVudGF0aW9uIHN5bWJvbCIpfX1pKFQsIlVOSUZPUk1fQ09OVEVYVCIsMTcpLGkoVCwiUlVOTEVOR1RIX0NPTlRFWFQiLDE4KSxpKFQsIkxMQW5kTEhDb250ZXh0c0xhYmVsIixuZXcgVWludDhBcnJheShbMCw1LDgsMCwzLDcsOCwwLDQsNyw4LDAsMCwwLDAsMCwxLDYsOCwwLDMsNyw4LDAsNCw3LDgsMCwwLDAsMCwwLDIsNiw4LDAsMyw3LDgsMCw0LDcsOCwwLDAsMCwwLDAsMiw2LDgsMCwzLDcsOCwwLDQsNyw4LDAsMCwwLDAsMCwyLDYsOCwwLDMsNyw4LDAsNCw3LDhdKSksaShULCJITENvbnRleHRMYWJlbCIsbmV3IFVpbnQ4QXJyYXkoWzAsMyw0LDAsNSw3LDcsMCw4LDgsOCwwLDAsMCwwLDAsMSwzLDQsMCw2LDcsNywwLDgsOCw4LDAsMCwwLDAsMCwyLDMsNCwwLDYsNyw3LDAsOCw4LDgsMCwwLDAsMCwwLDIsMyw0LDAsNiw3LDcsMCw4LDgsOCwwLDAsMCwwLDAsMiwzLDQsMCw2LDcsNywwLDgsOCw4XSkpLGkoVCwiSEhDb250ZXh0TGFiZWwiLG5ldyBVaW50OEFycmF5KFswLDEsMiwwLDEsMiwyLDAsMiwyLDIsMCwwLDAsMCwwLDMsNCw1LDAsNCw1LDUsMCw1LDUsNSwwLDAsMCwwLDAsNiw3LDcsMCw3LDcsNywwLDcsNyw3LDAsMCwwLDAsMCw4LDgsOCwwLDgsOCw4LDAsOCw4LDgsMCwwLDAsMCwwLDgsOCw4LDAsOCw4LDgsMCw4LDgsOF0pKTtjbGFzcyBNe2NvbnN0cnVjdG9yKCl7dGhpcy5jb25zdHJ1Y3Rvcj09PU0mJigwLG4udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBUcmFuc2Zvcm0uIil9Y2FsY3VsYXRlKGUsdCxyKXtsZXQgbj1lWzBdO2ZvcihsZXQgYT0xLGk9ZS5sZW5ndGg7YTxpO2ErKyluPXRoaXMuaXRlcmF0ZShuLGVbYV0sdCxyKTtyZXR1cm4gbn1leHRlbmQoZSx0LHIpe2xldCBuPXQtMSxhPXQrMSxpPXQrci0yLHM9dCtyO2Vbbi0tXT1lW2ErK10sZVtzKytdPWVbaS0tXSxlW24tLV09ZVthKytdLGVbcysrXT1lW2ktLV0sZVtuLS1dPWVbYSsrXSxlW3MrK109ZVtpLS1dLGVbbl09ZVthXSxlW3NdPWVbaV19ZmlsdGVyKGUsdCxyKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBmaWx0ZXJgIGNhbGxlZCIpfWl0ZXJhdGUoZSx0LHIsbil7Y29uc3QgYT1lLndpZHRoLGk9ZS5oZWlnaHQ7bGV0IHM9ZS5pdGVtcztjb25zdCBvPXQud2lkdGgsYz10LmhlaWdodCxsPXQuaXRlbXM7bGV0IGgsdSxkLGYsZyxwO2ZvcihkPTAsaD0wO2g8aTtoKyspZm9yKGY9MipoKm8sdT0wO3U8YTt1KyssZCsrLGYrPTIpbFtmXT1zW2RdO3M9ZS5pdGVtcz1udWxsO2NvbnN0IG09bmV3IEZsb2F0MzJBcnJheShvKzgpO2lmKDE9PT1vKXtpZigwIT0oMSZyKSlmb3IocD0wLGQ9MDtwPGM7cCsrLGQrPW8pbFtkXSo9LjV9ZWxzZSBmb3IocD0wLGQ9MDtwPGM7cCsrLGQrPW8pbS5zZXQobC5zdWJhcnJheShkLGQrbyksNCksdGhpcy5leHRlbmQobSw0LG8pLHRoaXMuZmlsdGVyKG0sNCxvKSxsLnNldChtLnN1YmFycmF5KDQsNCtvKSxkKTtsZXQgYj0xNjtjb25zdCB5PVtdO2ZvcihoPTA7aDxiO2grKyl5LnB1c2gobmV3IEZsb2F0MzJBcnJheShjKzgpKTtsZXQgdyx2PTA7aWYoZT00K2MsMT09PWMpe2lmKDAhPSgxJm4pKWZvcihnPTA7ZzxvO2crKylsW2ddKj0uNX1lbHNlIGZvcihnPTA7ZzxvO2crKyl7aWYoMD09PXYpe2ZvcihiPU1hdGgubWluKG8tZyxiKSxkPWcsZj00O2Y8ZTtkKz1vLGYrKylmb3Iodz0wO3c8Yjt3KyspeVt3XVtmXT1sW2Qrd107dj1ifXYtLTtjb25zdCB0PXlbdl07aWYodGhpcy5leHRlbmQodCw0LGMpLHRoaXMuZmlsdGVyKHQsNCxjKSwwPT09dilmb3IoZD1nLWIrMSxmPTQ7ZjxlO2QrPW8sZisrKWZvcih3PTA7dzxiO3crKylsW2Qrd109eVt3XVtmXX1yZXR1cm57d2lkdGg6byxoZWlnaHQ6YyxpdGVtczpsfX19Y2xhc3MgRSBleHRlbmRzIE17ZmlsdGVyKGUsdCxyKXtjb25zdCBuPXI+PjE7bGV0IGEsaSxzLG87Y29uc3QgYz0tMS41ODYxMzQzNDIwNTk5MjQsbD0tLjA1Mjk4MDExODU3Mjk2MSxoPS44ODI5MTEwNzU1MzA5MzQsdT0uNDQzNTA2ODUyMDQzOTcxLGQ9MS4yMzAxNzQxMDQ5MTQwMDE7Zm9yKGE9KHR8PTApLTMsaT1uKzQ7aS0tO2ErPTIpZVthXSo9LjgxMjg5MzA2NjExNTk2MDk7Zm9yKGE9dC0yLHM9dSplW2EtMV0saT1uKzM7aS0tJiYobz11KmVbYSsxXSxlW2FdPWQqZVthXS1zLW8saS0tKTthKz0yKWErPTIscz11KmVbYSsxXSxlW2FdPWQqZVthXS1zLW87Zm9yKGE9dC0xLHM9aCplW2EtMV0saT1uKzI7aS0tJiYobz1oKmVbYSsxXSxlW2FdLT1zK28saS0tKTthKz0yKWErPTIscz1oKmVbYSsxXSxlW2FdLT1zK287Zm9yKGE9dCxzPWwqZVthLTFdLGk9bisxO2ktLSYmKG89bCplW2ErMV0sZVthXS09cytvLGktLSk7YSs9MilhKz0yLHM9bCplW2ErMV0sZVthXS09cytvO2lmKDAhPT1uKWZvcihhPXQrMSxzPWMqZVthLTFdLGk9bjtpLS0mJihvPWMqZVthKzFdLGVbYV0tPXMrbyxpLS0pO2ErPTIpYSs9MixzPWMqZVthKzFdLGVbYV0tPXMrb319Y2xhc3MgUCBleHRlbmRzIE17ZmlsdGVyKGUsdCxyKXtjb25zdCBuPXI+PjE7bGV0IGEsaTtmb3IoYT10fD0wLGk9bisxO2ktLTthKz0yKWVbYV0tPWVbYS0xXStlW2ErMV0rMj4+Mjtmb3IoYT10KzEsaT1uO2ktLTthKz0yKWVbYV0rPWVbYS0xXStlW2ErMV0+PjF9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkxaV1N0cmVhbT12b2lkIDAscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTY4KTtjbGFzcyBhIGV4dGVuZHMgbi5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKHQpLHRoaXMuc3RyPWUsdGhpcy5kaWN0PWUuZGljdCx0aGlzLmNhY2hlZERhdGE9MCx0aGlzLmJpdHNDYWNoZWQ9MDtjb25zdCBuPTQwOTYsYT17ZWFybHlDaGFuZ2U6cixjb2RlTGVuZ3RoOjksbmV4dENvZGU6MjU4LGRpY3Rpb25hcnlWYWx1ZXM6bmV3IFVpbnQ4QXJyYXkobiksZGljdGlvbmFyeUxlbmd0aHM6bmV3IFVpbnQxNkFycmF5KG4pLGRpY3Rpb25hcnlQcmV2Q29kZXM6bmV3IFVpbnQxNkFycmF5KG4pLGN1cnJlbnRTZXF1ZW5jZTpuZXcgVWludDhBcnJheShuKSxjdXJyZW50U2VxdWVuY2VMZW5ndGg6MH07Zm9yKGxldCBlPTA7ZTwyNTY7KytlKWEuZGljdGlvbmFyeVZhbHVlc1tlXT1lLGEuZGljdGlvbmFyeUxlbmd0aHNbZV09MTt0aGlzLmx6d1N0YXRlPWF9cmVhZEJpdHMoZSl7bGV0IHQ9dGhpcy5iaXRzQ2FjaGVkLHI9dGhpcy5jYWNoZWREYXRhO2Zvcig7dDxlOyl7Y29uc3QgZT10aGlzLnN0ci5nZXRCeXRlKCk7aWYoLTE9PT1lKXJldHVybiB0aGlzLmVvZj0hMCxudWxsO3I9cjw8OHxlLHQrPTh9cmV0dXJuIHRoaXMuYml0c0NhY2hlZD10LT1lLHRoaXMuY2FjaGVkRGF0YT1yLHRoaXMubGFzdENvZGU9bnVsbCxyPj4+dCYoMTw8ZSktMX1yZWFkQmxvY2soKXtsZXQgZSx0LHIsbj0xMDI0O2NvbnN0IGE9dGhpcy5sendTdGF0ZTtpZighYSlyZXR1cm47Y29uc3QgaT1hLmVhcmx5Q2hhbmdlO2xldCBzPWEubmV4dENvZGU7Y29uc3Qgbz1hLmRpY3Rpb25hcnlWYWx1ZXMsYz1hLmRpY3Rpb25hcnlMZW5ndGhzLGw9YS5kaWN0aW9uYXJ5UHJldkNvZGVzO2xldCBoPWEuY29kZUxlbmd0aCx1PWEucHJldkNvZGU7Y29uc3QgZD1hLmN1cnJlbnRTZXF1ZW5jZTtsZXQgZj1hLmN1cnJlbnRTZXF1ZW5jZUxlbmd0aCxnPTAscD10aGlzLmJ1ZmZlckxlbmd0aCxtPXRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoK24pO2ZvcihlPTA7ZTw1MTI7ZSsrKXtjb25zdCBlPXRoaXMucmVhZEJpdHMoaCksYT1mPjA7aWYoZTwyNTYpZFswXT1lLGY9MTtlbHNle2lmKCEoZT49MjU4KSl7aWYoMjU2PT09ZSl7aD05LHM9MjU4LGY9MDtjb250aW51ZX10aGlzLmVvZj0hMCxkZWxldGUgdGhpcy5sendTdGF0ZTticmVha31pZihlPHMpZm9yKGY9Y1tlXSx0PWYtMSxyPWU7dD49MDt0LS0pZFt0XT1vW3JdLHI9bFtyXTtlbHNlIGRbZisrXT1kWzBdfWlmKGEmJihsW3NdPXUsY1tzXT1jW3VdKzEsb1tzXT1kWzBdLHMrKyxoPXMraSZzK2ktMT9oOjB8TWF0aC5taW4oTWF0aC5sb2cocytpKS8uNjkzMTQ3MTgwNTU5OTQ1MysxLDEyKSksdT1lLGcrPWYsbjxnKXtkb3tuKz01MTJ9d2hpbGUobjxnKTttPXRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoK24pfWZvcih0PTA7dDxmO3QrKyltW3ArK109ZFt0XX1hLm5leHRDb2RlPXMsYS5jb2RlTGVuZ3RoPWgsYS5wcmV2Q29kZT11LGEuY3VycmVudFNlcXVlbmNlTGVuZ3RoPWYsdGhpcy5idWZmZXJMZW5ndGg9cH19dC5MWldTdHJlYW09YX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlByZWRpY3RvclN0cmVhbT12b2lkIDAscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTY4KSxhPXIoMTUwKSxpPXIoMTQ0KTtjbGFzcyBzIGV4dGVuZHMgbi5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0LHIpe2lmKHN1cGVyKHQpLCEociBpbnN0YW5jZW9mIGEuRGljdCkpcmV0dXJuIGU7Y29uc3Qgbj10aGlzLnByZWRpY3Rvcj1yLmdldCgiUHJlZGljdG9yIil8fDE7aWYobjw9MSlyZXR1cm4gZTtpZigyIT09biYmKG48MTB8fG4+MTUpKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJVbnN1cHBvcnRlZCBwcmVkaWN0b3I6ICIuY29uY2F0KG4pKTt0aGlzLnJlYWRCbG9jaz0yPT09bj90aGlzLnJlYWRCbG9ja1RpZmY6dGhpcy5yZWFkQmxvY2tQbmcsdGhpcy5zdHI9ZSx0aGlzLmRpY3Q9ZS5kaWN0O2NvbnN0IHM9dGhpcy5jb2xvcnM9ci5nZXQoIkNvbG9ycyIpfHwxLG89dGhpcy5iaXRzPXIuZ2V0KCJCUEMiLCJCaXRzUGVyQ29tcG9uZW50Iil8fDgsYz10aGlzLmNvbHVtbnM9ci5nZXQoIkNvbHVtbnMiKXx8MTtyZXR1cm4gdGhpcy5waXhCeXRlcz1zKm8rNz4+Myx0aGlzLnJvd0J5dGVzPWMqcypvKzc+PjMsdGhpc31yZWFkQmxvY2tUaWZmKCl7Y29uc3QgZT10aGlzLnJvd0J5dGVzLHQ9dGhpcy5idWZmZXJMZW5ndGgscj10aGlzLmVuc3VyZUJ1ZmZlcih0K2UpLG49dGhpcy5iaXRzLGE9dGhpcy5jb2xvcnMsaT10aGlzLnN0ci5nZXRCeXRlcyhlKTtpZih0aGlzLmVvZj0haS5sZW5ndGgsdGhpcy5lb2YpcmV0dXJuO2xldCBzLG89MCxjPTAsbD0wLGg9MCx1PXQ7aWYoMT09PW4mJjE9PT1hKWZvcihzPTA7czxlOysrcyl7bGV0IGU9aVtzXV5vO2VePWU+PjEsZV49ZT4+MixlXj1lPj40LG89KDEmZSk8PDcsclt1KytdPWV9ZWxzZSBpZig4PT09bil7Zm9yKHM9MDtzPGE7KytzKXJbdSsrXT1pW3NdO2Zvcig7czxlOysrcylyW3VdPXJbdS1hXStpW3NdLHUrK31lbHNlIGlmKDE2PT09bil7Y29uc3QgdD0yKmE7Zm9yKHM9MDtzPHQ7KytzKXJbdSsrXT1pW3NdO2Zvcig7czxlO3MrPTIpe2NvbnN0IGU9KCgyNTUmaVtzXSk8PDgpKygyNTUmaVtzKzFdKSsoKDI1NSZyW3UtdF0pPDw4KSsoMjU1JnJbdS10KzFdKTtyW3UrK109ZT4+OCYyNTUsclt1KytdPTI1NSZlfX1lbHNle2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoYSsxKSx1PSgxPDxuKS0xO2xldCBkPTAsZj10O2NvbnN0IGc9dGhpcy5jb2x1bW5zO2ZvcihzPTA7czxnOysrcylmb3IobGV0IHQ9MDt0PGE7Kyt0KWw8biYmKG89bzw8OHwyNTUmaVtkKytdLGwrPTgpLGVbdF09ZVt0XSsobz4+bC1uKSZ1LGwtPW4sYz1jPDxufGVbdF0saCs9bixoPj04JiYocltmKytdPWM+PmgtOCYyNTUsaC09OCk7aD4wJiYocltmKytdPShjPDw4LWgpKyhvJigxPDw4LWgpLTEpKX10aGlzLmJ1ZmZlckxlbmd0aCs9ZX1yZWFkQmxvY2tQbmcoKXtjb25zdCBlPXRoaXMucm93Qnl0ZXMsdD10aGlzLnBpeEJ5dGVzLHI9dGhpcy5zdHIuZ2V0Qnl0ZSgpLG49dGhpcy5zdHIuZ2V0Qnl0ZXMoZSk7aWYodGhpcy5lb2Y9IW4ubGVuZ3RoLHRoaXMuZW9mKXJldHVybjtjb25zdCBhPXRoaXMuYnVmZmVyTGVuZ3RoLHM9dGhpcy5lbnN1cmVCdWZmZXIoYStlKTtsZXQgbz1zLnN1YmFycmF5KGEtZSxhKTswPT09by5sZW5ndGgmJihvPW5ldyBVaW50OEFycmF5KGUpKTtsZXQgYyxsLGgsdT1hO3N3aXRjaChyKXtjYXNlIDA6Zm9yKGM9MDtjPGU7KytjKXNbdSsrXT1uW2NdO2JyZWFrO2Nhc2UgMTpmb3IoYz0wO2M8dDsrK2Mpc1t1KytdPW5bY107Zm9yKDtjPGU7KytjKXNbdV09c1t1LXRdK25bY10mMjU1LHUrKzticmVhaztjYXNlIDI6Zm9yKGM9MDtjPGU7KytjKXNbdSsrXT1vW2NdK25bY10mMjU1O2JyZWFrO2Nhc2UgMzpmb3IoYz0wO2M8dDsrK2Mpc1t1KytdPShvW2NdPj4xKStuW2NdO2Zvcig7YzxlOysrYylzW3VdPShvW2NdK3NbdS10XT4+MSkrbltjXSYyNTUsdSsrO2JyZWFrO2Nhc2UgNDpmb3IoYz0wO2M8dDsrK2MpbD1vW2NdLGg9bltjXSxzW3UrK109bCtoO2Zvcig7YzxlOysrYyl7bD1vW2NdO2NvbnN0IGU9b1tjLXRdLHI9c1t1LXRdLGE9citsLWU7bGV0IGk9YS1yO2k8MCYmKGk9LWkpO2xldCBkPWEtbDtkPDAmJihkPS1kKTtsZXQgZj1hLWU7ZjwwJiYoZj0tZiksaD1uW2NdLHNbdSsrXT1pPD1kJiZpPD1mP3IraDpkPD1mP2wraDplK2h9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAiLmNvbmNhdChyKSl9dGhpcy5idWZmZXJMZW5ndGgrPWV9fXQuUHJlZGljdG9yU3RyZWFtPXN9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5SdW5MZW5ndGhTdHJlYW09dm9pZCAwO3ZhciBuPXIoMTY4KTtjbGFzcyBhIGV4dGVuZHMgbi5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0KXtzdXBlcih0KSx0aGlzLnN0cj1lLHRoaXMuZGljdD1lLmRpY3R9cmVhZEJsb2NrKCl7Y29uc3QgZT10aGlzLnN0ci5nZXRCeXRlcygyKTtpZighZXx8ZS5sZW5ndGg8Mnx8MTI4PT09ZVswXSlyZXR1cm4gdm9pZCh0aGlzLmVvZj0hMCk7bGV0IHQscj10aGlzLmJ1ZmZlckxlbmd0aCxuPWVbMF07aWYobjwxMjgpe2lmKHQ9dGhpcy5lbnN1cmVCdWZmZXIocituKzEpLHRbcisrXT1lWzFdLG4+MCl7Y29uc3QgZT10aGlzLnN0ci5nZXRCeXRlcyhuKTt0LnNldChlLHIpLHIrPW59fWVsc2V7bj0yNTctbjtjb25zdCBhPWVbMV07dD10aGlzLmVuc3VyZUJ1ZmZlcihyK24rMSk7Zm9yKGxldCBlPTA7ZTxuO2UrKyl0W3IrK109YX10aGlzLmJ1ZmZlckxlbmd0aD1yfX10LlJ1bkxlbmd0aFN0cmVhbT1hfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRm9udD10LkVycm9yRm9udD12b2lkIDAscigxMTYpLHIoMTI2KSxyKDEyOCkscigxMzEpLHIoMTMzKSxyKDEzNSkscigxMzcpLHIoMTM5KSxyKDE1Nykscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTQ0KSxhPXIoMTg1KSxpPXIoMTg4KSxzPXIoMTkwKSxvPXIoMTg5KSxjPXIoMTg3KSxsPXIoMTkxKSxoPXIoMTkyKSx1PXIoMTkzKSxkPXIoMTk0KSxmPXIoMTk1KSxnPXIoMTk2KSxwPXIoMTY0KSxtPXIoMTk3KSxiPXIoMTQ5KSx5PXIoMTU0KSx3PXIoMTk4KTtjb25zdCB2PVtbNTczNDQsNjM3NDNdLFsxMDQ4NTc2LDExMTQxMDldXSx4PTFlMyxTPVsiYXNjZW50IiwiYmJveCIsImJsYWNrIiwiYm9sZCIsImNoYXJQcm9jT3BlcmF0b3JMaXN0IiwiY29tcG9zaXRlIiwiY3NzRm9udEluZm8iLCJkYXRhIiwiZGVmYXVsdFZNZXRyaWNzIiwiZGVmYXVsdFdpZHRoIiwiZGVzY2VudCIsImZhbGxiYWNrTmFtZSIsImZvbnRNYXRyaXgiLCJpc0ludmFsaWRQREZqc0ZvbnQiLCJpc1R5cGUzRm9udCIsIml0YWxpYyIsImxvYWRlZE5hbWUiLCJtaW1ldHlwZSIsIm1pc3NpbmdGaWxlIiwibmFtZSIsInJlbWVhc3VyZSIsInN1YnR5cGUiLCJzeXN0ZW1Gb250SW5mbyIsInR5cGUiLCJ2ZXJ0aWNhbCJdLEE9WyJjTWFwIiwiZGVmYXVsdEVuY29kaW5nIiwiZGlmZmVyZW5jZXMiLCJpc01vbm9zcGFjZSIsImlzU2VyaWZGb250IiwiaXNTeW1ib2xpY0ZvbnQiLCJzZWFjTWFwIiwidG9Gb250Q2hhciIsInRvVW5pY29kZSIsInZtZXRyaWNzIiwid2lkdGhzIl07ZnVuY3Rpb24gayhlKXtpZighZS5mb250TWF0cml4KXJldHVybjtpZihlLmZvbnRNYXRyaXhbMF09PT1uLkZPTlRfSURFTlRJVFlfTUFUUklYWzBdKXJldHVybjtjb25zdCB0PS4wMDEvZS5mb250TWF0cml4WzBdLHI9ZS53aWR0aHM7Zm9yKGNvbnN0IGUgaW4gcilyW2VdKj10O2UuZGVmYXVsdFdpZHRoKj10fWZ1bmN0aW9uIEMoZSl7aWYoIWUuZmFsbGJhY2tUb1VuaWNvZGUpcmV0dXJuO2lmKGUudG9Vbmljb2RlIGluc3RhbmNlb2YgaC5JZGVudGl0eVRvVW5pY29kZU1hcClyZXR1cm47Y29uc3QgdD1bXTtmb3IoY29uc3QgciBpbiBlLmZhbGxiYWNrVG9Vbmljb2RlKWUudG9Vbmljb2RlLmhhcyhyKXx8KHRbcl09ZS5mYWxsYmFja1RvVW5pY29kZVtyXSk7dC5sZW5ndGg+MCYmZS50b1VuaWNvZGUuYW1lbmQodCl9Y2xhc3MgT3tjb25zdHJ1Y3RvcihlLHQscixuLGEsaSxzLG8sYyl7dGhpcy5vcmlnaW5hbENoYXJDb2RlPWUsdGhpcy5mb250Q2hhcj10LHRoaXMudW5pY29kZT1yLHRoaXMuYWNjZW50PW4sdGhpcy53aWR0aD1hLHRoaXMudm1ldHJpYz1pLHRoaXMub3BlcmF0b3JMaXN0SWQ9cyx0aGlzLmlzU3BhY2U9byx0aGlzLmlzSW5Gb250PWN9Z2V0IGNhdGVnb3J5KCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImNhdGVnb3J5IiwoMCxzLmdldENoYXJVbmljb2RlQ2F0ZWdvcnkpKHRoaXMudW5pY29kZSksITApfX1mdW5jdGlvbiBGKGUsdCl7cmV0dXJuKGU8PDgpK3R9ZnVuY3Rpb24gSShlLHQscil7ZVt0KzFdPXIsZVt0XT1yPj4+OH1mdW5jdGlvbiBUKGUsdCl7Y29uc3Qgcj0oZTw8OCkrdDtyZXR1cm4gMzI3Njgmcj9yLTY1NTM2OnJ9ZnVuY3Rpb24gTShlKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlPj44JjI1NSwyNTUmZSl9ZnVuY3Rpb24gRShlKXtyZXR1cm4gZT4zMjc2Nz9lPTMyNzY3OmU8LTMyNzY4JiYoZT0tMzI3NjgpLFN0cmluZy5mcm9tQ2hhckNvZGUoZT4+OCYyNTUsMjU1JmUpfWZ1bmN0aW9uIFAoZSl7Y29uc3QgdD1lLnBlZWtCeXRlcyg0KTtyZXR1cm4idHRjZiI9PT0oMCxuLmJ5dGVzVG9TdHJpbmcpKHQpfWZ1bmN0aW9uIFIoZSx0KXtmb3IoY29uc3QgciBpbiB0KWVbK3JdPXRbcl19ZnVuY3Rpb24gTihlLHQscil7Y29uc3Qgbj1bXTtsZXQgYTtmb3IobGV0IHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspYT0oMCxzLmdldFVuaWNvZGVGb3JHbHlwaCkoZVtyXSx0KSwtMSE9PWEmJihuW3JdPWEpO2Zvcihjb25zdCBlIGluIHIpYT0oMCxzLmdldFVuaWNvZGVGb3JHbHlwaCkocltlXSx0KSwtMSE9PWEmJihuWytlXT1hKTtyZXR1cm4gbn1mdW5jdGlvbiBEKGUpe3JldHVybiAxPT09ZS5wbGF0Zm9ybSYmMD09PWUuZW5jb2RpbmcmJjA9PT1lLmxhbmd1YWdlfWZ1bmN0aW9uIEIoZSl7cmV0dXJuIDM9PT1lLnBsYXRmb3JtJiYxPT09ZS5lbmNvZGluZyYmMTAzMz09PWUubGFuZ3VhZ2V9ZnVuY3Rpb24gTChlLHQpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIHQuY2hhckNvZGVBdCgwKTtjYXNlIDI6cmV0dXJuIHQuY2hhckNvZGVBdCgwKTw8OHx0LmNoYXJDb2RlQXQoMSl9Y29uc3QgYT0iVW5zdXBwb3J0ZWQgQ0lEIHN0cmluZyAoY2hhckNvZGUgIi5jb25jYXQoZSwnKTogIicpLmNvbmNhdCh0LCciLicpO2lmKHIpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoYSk7cmV0dXJuKDAsbi53YXJuKShhKSx0fWZ1bmN0aW9uIF8oZSx0LHIsYSl7Y29uc3QgaT1PYmplY3QuY3JlYXRlKG51bGwpLHM9bmV3IE1hcCxvPVtdLGM9bmV3IFNldDtsZXQgbD0wLGg9dltsXVswXSx1PXZbbF1bMV07Zm9yKGxldCBmIGluIGUpe2Z8PTA7bGV0IGc9ZVtmXTtpZighdChnKSljb250aW51ZTtpZihoPnUpe2lmKGwrKyxsPj12Lmxlbmd0aCl7KDAsbi53YXJuKSgiUmFuIG91dCBvZiBzcGFjZSBpbiBmb250IHByaXZhdGUgdXNlIGFyZWEuIik7YnJlYWt9aD12W2xdWzBdLHU9dltsXVsxXX1jb25zdCBwPWgrKzswPT09ZyYmKGc9cik7bGV0IG09YS5nZXQoZik7InN0cmluZyI9PXR5cGVvZiBtJiYobT1tLmNvZGVQb2ludEF0KDApKSwhbXx8KGQ9bSx2WzBdWzBdPD1kJiZkPD12WzBdWzFdfHx2WzFdWzBdPD1kJiZkPD12WzFdWzFdKXx8Yy5oYXMoZyl8fChzLnNldChtLGcpLGMuYWRkKGcpKSxpW3BdPWcsb1tmXT1wfXZhciBkO3JldHVybnt0b0ZvbnRDaGFyOm8sY2hhckNvZGVUb0dseXBoSWQ6aSx0b1VuaWNvZGVFeHRyYU1hcDpzLG5leHRBdmFpbGFibGVGb250Q2hhckNvZGU6aH19ZnVuY3Rpb24gaihlLHQscil7Y29uc3QgYT1mdW5jdGlvbihlLHQscil7Y29uc3Qgbj1bXTtmb3IoY29uc3QgdCBpbiBlKWVbdF0+PXJ8fG4ucHVzaCh7Zm9udENoYXJDb2RlOjB8dCxnbHlwaElkOmVbdF19KTtpZih0KWZvcihjb25zdFtlLGFdb2YgdClhPj1yfHxuLnB1c2goe2ZvbnRDaGFyQ29kZTplLGdseXBoSWQ6YX0pOzA9PT1uLmxlbmd0aCYmbi5wdXNoKHtmb250Q2hhckNvZGU6MCxnbHlwaElkOjB9KSxuLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuZm9udENoYXJDb2RlLXQuZm9udENoYXJDb2RlfSkpO2NvbnN0IGE9W10saT1uLmxlbmd0aDtmb3IobGV0IGU9MDtlPGk7KXtjb25zdCB0PW5bZV0uZm9udENoYXJDb2RlLHI9W25bZV0uZ2x5cGhJZF07KytlO2xldCBzPXQ7Zm9yKDtlPGkmJnMrMT09PW5bZV0uZm9udENoYXJDb2RlJiYoci5wdXNoKG5bZV0uZ2x5cGhJZCksKytzLCsrZSw2NTUzNSE9PXMpOyk7YS5wdXNoKFt0LHMscl0pfXJldHVybiBhfShlLHQsciksaT1hLmF0KC0xKVsxXT42NTUzNT8yOjE7bGV0IHMsbyxjLGwsaD0iXDBcMCIrTShpKSsiXDADXDABIisoMCxuLnN0cmluZzMyKSg0KzgqaSk7Zm9yKHM9YS5sZW5ndGgtMTtzPj0wJiYhKGFbc11bMF08PTY1NTM1KTstLXMpO2NvbnN0IHU9cysxO2Fbc11bMF08NjU1MzUmJjY1NTM1PT09YVtzXVsxXSYmKGFbc11bMV09NjU1MzQpO2NvbnN0IGQ9YVtzXVsxXTw2NTUzNT8xOjAsZj11K2QsZz1tLk9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zKGYsMik7bGV0IHAsYix5LHcsdj0iIix4PSIiLFM9IiIsQT0iIixrPSIiLEM9MDtmb3Iocz0wLG89dTtzPG87cysrKXtwPWFbc10sYj1wWzBdLHk9cFsxXSx2Kz1NKGIpLHgrPU0oeSksdz1wWzJdO2xldCBlPSEwO2ZvcihjPTEsbD13Lmxlbmd0aDtjPGw7KytjKWlmKHdbY10hPT13W2MtMV0rMSl7ZT0hMTticmVha31pZihlKVMrPU0od1swXS1iJjY1NTM1KSxBKz1NKDApO2Vsc2V7Y29uc3QgZT0yKihmLXMpKzIqQztmb3IoQys9eS1iKzEsUys9TSgwKSxBKz1NKGUpLGM9MCxsPXcubGVuZ3RoO2M8bDsrK2Mpays9TSh3W2NdKX19ZD4wJiYoeCs9IsO/w78iLHYrPSLDv8O/IixTKz0iXDABIixBKz0iXDBcMCIpO2NvbnN0IE89IlwwXDAiK00oMipmKStNKGcucmFuZ2UpK00oZy5lbnRyeSkrTShnLnJhbmdlU2hpZnQpK3grIlwwXDAiK3YrUytBK2s7bGV0IEY9IiIsST0iIjtpZihpPjEpe2ZvcihoKz0iXDADXDBcbiIrKDAsbi5zdHJpbmczMikoNCs4KmkrNCtPLmxlbmd0aCksRj0iIixzPTAsbz1hLmxlbmd0aDtzPG87cysrKXtwPWFbc10sYj1wWzBdLHc9cFsyXTtsZXQgZT13WzBdO2ZvcihjPTEsbD13Lmxlbmd0aDtjPGw7KytjKXdbY10hPT13W2MtMV0rMSYmKHk9cFswXStjLTEsRis9KDAsbi5zdHJpbmczMikoYikrKDAsbi5zdHJpbmczMikoeSkrKDAsbi5zdHJpbmczMikoZSksYj15KzEsZT13W2NdKTtGKz0oMCxuLnN0cmluZzMyKShiKSsoMCxuLnN0cmluZzMyKShwWzFdKSsoMCxuLnN0cmluZzMyKShlKX1JPSJcMFxmXDBcMCIrKDAsbi5zdHJpbmczMikoRi5sZW5ndGgrMTYpKyJcMFwwXDBcMCIrKDAsbi5zdHJpbmczMikoRi5sZW5ndGgvMTIpfXJldHVybiBoKyJcMAQiK00oTy5sZW5ndGgrNCkrTytJK0Z9ZnVuY3Rpb24gVShlLHQscil7cnx8KHI9e3VuaXRzUGVyRW06MCx5TWF4OjAseU1pbjowLGFzY2VudDowLGRlc2NlbnQ6MH0pO2xldCBhPTAsaT0wLG89MCxjPTAsbD1udWxsLGg9MCx1PS0xO2lmKHQpe2ZvcihsZXQgZSBpbiB0KWlmKGV8PTAsKGw+ZXx8IWwpJiYobD1lKSxoPGUmJihoPWUpLHU9KDAscy5nZXRVbmljb2RlUmFuZ2VGb3IpKGUsdSksdTwzMilhfD0xPDx1O2Vsc2UgaWYodTw2NClpfD0xPDx1LTMyO2Vsc2UgaWYodTw5NilvfD0xPDx1LTY0O2Vsc2V7aWYoISh1PDEyMykpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVuaWNvZGUgcmFuZ2VzIEJpdHMgPiAxMjMgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZSIpO2N8PTE8PHUtOTZ9aD42NTUzNSYmKGg9NjU1MzUpfWVsc2UgbD0wLGg9MjU1O2NvbnN0IGQ9ZS5iYm94fHxbMCwwLDAsMF0sZj1yLnVuaXRzUGVyRW18fDEvKGUuZm9udE1hdHJpeHx8bi5GT05UX0lERU5USVRZX01BVFJJWClbMF0sZz1lLmFzY2VudFNjYWxlZD8xOmYveCxwPXIuYXNjZW50fHxNYXRoLnJvdW5kKGcqKGUuYXNjZW50fHxkWzNdKSk7bGV0IG09ci5kZXNjZW50fHxNYXRoLnJvdW5kKGcqKGUuZGVzY2VudHx8ZFsxXSkpO20+MCYmZS5kZXNjZW50PjAmJmRbMV08MCYmKG09LW0pO2NvbnN0IGI9ci55TWF4fHxwLHk9LXIueU1pbnx8LW07cmV0dXJuIlwwAwIkAcO0XDAFXDBcMALCigLCu1wwXDBcMMKMAsKKAsK7XDBcMAHDn1x4MDAxAQJcMFwwXDBcMAYiK1N0cmluZy5mcm9tQ2hhckNvZGUoZS5maXhlZFBpdGNoPzk6MCkrIlwwXDBcMFwwXDBcMCIrKDAsbi5zdHJpbmczMikoYSkrKDAsbi5zdHJpbmczMikoaSkrKDAsbi5zdHJpbmczMikobykrKDAsbi5zdHJpbmczMikoYykrIioyMSoiK00oZS5pdGFsaWNBbmdsZT8xOjApK00obHx8ZS5maXJzdENoYXIpK00oaHx8ZS5sYXN0Q2hhcikrTShwKStNKG0pKyJcMGQiK00oYikrTSh5KSsiXDBcMFwwXDBcMFwwXDBcMCIrTShlLnhIZWlnaHQpK00oZS5jYXBIZWlnaHQpK00oMCkrTShsfHxlLmZpcnN0Q2hhcikrIlwwAyJ9ZnVuY3Rpb24gJChlKXtjb25zdCB0PU1hdGguZmxvb3IoNjU1MzYqZS5pdGFsaWNBbmdsZSk7cmV0dXJuIlwwA1wwXDAiKygwLG4uc3RyaW5nMzIpKHQpKyJcMFwwXDBcMCIrKDAsbi5zdHJpbmczMikoZS5maXhlZFBpdGNoPzE6MCkrIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIn1mdW5jdGlvbiBYKGUpe3JldHVybiBlLnJlcGxhY2VBbGwoL1teXHgyMS1ceDdFXXxbW1xdKCl7fTw+LyVdL2csIiIpLnNsaWNlKDAsNjMpfWZ1bmN0aW9uIEgoZSx0KXt0fHwodD1bW10sW11dKTtjb25zdCByPVt0WzBdWzBdfHwiT3JpZ2luYWwgbGljZW5jZSIsdFswXVsxXXx8ZSx0WzBdWzJdfHwiVW5rbm93biIsdFswXVszXXx8InVuaXF1ZUlEIix0WzBdWzRdfHxlLHRbMF1bNV18fCJWZXJzaW9uIDAuMTEiLHRbMF1bNl18fFgoZSksdFswXVs3XXx8IlVua25vd24iLHRbMF1bOF18fCJVbmtub3duIix0WzBdWzldfHwiVW5rbm93biJdLG49W107bGV0IGEsaSxzLG8sYztmb3IoYT0wLGk9ci5sZW5ndGg7YTxpO2ErKyl7Yz10WzFdW2FdfHxyW2FdO2NvbnN0IGU9W107Zm9yKHM9MCxvPWMubGVuZ3RoO3M8bztzKyspZS5wdXNoKE0oYy5jaGFyQ29kZUF0KHMpKSk7bi5wdXNoKGUuam9pbigiIikpfWNvbnN0IGw9W3Isbl0saD1bIlwwASIsIlwwAyJdLHU9WyJcMFwwIiwiXDABIl0sZD1bIlwwXDAiLCIEXHQiXSxmPXIubGVuZ3RoKmgubGVuZ3RoO2xldCBnPSJcMFwwIitNKGYpK00oMTIqZis2KSxwPTA7Zm9yKGE9MCxpPWgubGVuZ3RoO2E8aTthKyspe2NvbnN0IGU9bFthXTtmb3Iocz0wLG89ZS5sZW5ndGg7czxvO3MrKyljPWVbc10sZys9aFthXSt1W2FdK2RbYV0rTShzKStNKGMubGVuZ3RoKStNKHApLHArPWMubGVuZ3RofXJldHVybiBnKz1yLmpvaW4oIiIpK24uam9pbigiIiksZ310LkZvbnQ9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LHIpe3ZhciBhO3RoaXMubmFtZT1lLHRoaXMucHNOYW1lPW51bGwsdGhpcy5taW1ldHlwZT1udWxsLHRoaXMuZGlzYWJsZUZvbnRGYWNlPSExLHRoaXMubG9hZGVkTmFtZT1yLmxvYWRlZE5hbWUsdGhpcy5pc1R5cGUzRm9udD1yLmlzVHlwZTNGb250LHRoaXMubWlzc2luZ0ZpbGU9ITEsdGhpcy5jc3NGb250SW5mbz1yLmNzc0ZvbnRJbmZvLHRoaXMuX2NoYXJzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9nbHlwaENhY2hlPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IHM9ISEoci5mbGFncyZpLkZvbnRGbGFncy5TZXJpZik7aWYoIXMmJiFyLmlzU2ltdWxhdGVkRmxhZ3Mpe2NvbnN0IHQ9ZS5yZXBsYWNlQWxsKC9bLF9dL2csIi0iKS5zcGxpdCgiLSIpWzBdLHI9KDAsbC5nZXRTZXJpZkZvbnRzKSgpO2Zvcihjb25zdCBlIG9mIHQuc3BsaXQoIisiKSlpZihyW2VdKXtzPSEwO2JyZWFrfX10aGlzLmlzU2VyaWZGb250PXMsdGhpcy5pc1N5bWJvbGljRm9udD0hIShyLmZsYWdzJmkuRm9udEZsYWdzLlN5bWJvbGljKSx0aGlzLmlzTW9ub3NwYWNlPSEhKHIuZmxhZ3MmaS5Gb250RmxhZ3MuRml4ZWRQaXRjaCk7bGV0e3R5cGU6byxzdWJ0eXBlOmN9PXI7dGhpcy50eXBlPW8sdGhpcy5zdWJ0eXBlPWMsdGhpcy5zeXN0ZW1Gb250SW5mbz1yLnN5c3RlbUZvbnRJbmZvO2NvbnN0IGg9ZS5tYXRjaCgvXkludmFsaWRQREZqc0ZvbnRfKC4qKV9cZCskLyk7aWYodGhpcy5pc0ludmFsaWRQREZqc0ZvbnQ9ISFoLHRoaXMuaXNJbnZhbGlkUERGanNGb250P3RoaXMuZmFsbGJhY2tOYW1lPWhbMV06dGhpcy5pc01vbm9zcGFjZT90aGlzLmZhbGxiYWNrTmFtZT0ibW9ub3NwYWNlIjp0aGlzLmlzU2VyaWZGb250P3RoaXMuZmFsbGJhY2tOYW1lPSJzZXJpZiI6dGhpcy5mYWxsYmFja05hbWU9InNhbnMtc2VyaWYiLG51bGwhPT0oYT10aGlzLnN5c3RlbUZvbnRJbmZvKSYmdm9pZCAwIT09YSYmYS5ndWVzc0ZhbGxiYWNrJiYodGhpcy5zeXN0ZW1Gb250SW5mby5ndWVzc0ZhbGxiYWNrPSExLHRoaXMuc3lzdGVtRm9udEluZm8uY3NzKz0iLCIuY29uY2F0KHRoaXMuZmFsbGJhY2tOYW1lKSksdGhpcy5kaWZmZXJlbmNlcz1yLmRpZmZlcmVuY2VzLHRoaXMud2lkdGhzPXIud2lkdGhzLHRoaXMuZGVmYXVsdFdpZHRoPXIuZGVmYXVsdFdpZHRoLHRoaXMuY29tcG9zaXRlPXIuY29tcG9zaXRlLHRoaXMuY01hcD1yLmNNYXAsdGhpcy5jYXBIZWlnaHQ9ci5jYXBIZWlnaHQveCx0aGlzLmFzY2VudD1yLmFzY2VudC94LHRoaXMuZGVzY2VudD1yLmRlc2NlbnQveCx0aGlzLmxpbmVIZWlnaHQ9dGhpcy5hc2NlbnQtdGhpcy5kZXNjZW50LHRoaXMuZm9udE1hdHJpeD1yLmZvbnRNYXRyaXgsdGhpcy5iYm94PXIuYmJveCx0aGlzLmRlZmF1bHRFbmNvZGluZz1yLmRlZmF1bHRFbmNvZGluZyx0aGlzLnRvVW5pY29kZT1yLnRvVW5pY29kZSx0aGlzLnRvRm9udENoYXI9W10sIlR5cGUzIj09PXIudHlwZSl7Zm9yKGxldCBlPTA7ZTwyNTY7ZSsrKXRoaXMudG9Gb250Q2hhcltlXT10aGlzLmRpZmZlcmVuY2VzW2VdfHxyLmRlZmF1bHRFbmNvZGluZ1tlXTtyZXR1cm59aWYodGhpcy5jaWRFbmNvZGluZz1yLmNpZEVuY29kaW5nfHwiIix0aGlzLnZlcnRpY2FsPSEhci52ZXJ0aWNhbCx0aGlzLnZlcnRpY2FsJiYodGhpcy52bWV0cmljcz1yLnZtZXRyaWNzLHRoaXMuZGVmYXVsdFZNZXRyaWNzPXIuZGVmYXVsdFZNZXRyaWNzKSwhdHx8dC5pc0VtcHR5KXJldHVybiB0JiYoMCxuLndhcm4pKCdGb250IGZpbGUgaXMgZW1wdHkgaW4gIicrZSsnIiAoJyt0aGlzLmxvYWRlZE5hbWUrIikiKSx2b2lkIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQocik7bGV0IGQ7W28sY109ZnVuY3Rpb24oZSx0KXtsZXQgcixhLHt0eXBlOmksc3VidHlwZTpzLGNvbXBvc2l0ZTpvfT10O3JldHVybiBmdW5jdGlvbihlKXtjb25zdCB0PWUucGVla0J5dGVzKDQpO3JldHVybiA2NTUzNj09PSgwLGIucmVhZFVpbnQzMikodCwwKXx8InRydWUiPT09KDAsbi5ieXRlc1RvU3RyaW5nKSh0KX0oZSl8fFAoZSk/cj1vPyJDSURGb250VHlwZTIiOiJUcnVlVHlwZSI6ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLnBlZWtCeXRlcyg0KTtyZXR1cm4iT1RUTyI9PT0oMCxuLmJ5dGVzVG9TdHJpbmcpKHQpfShlKT9yPW8/IkNJREZvbnRUeXBlMiI6Ik9wZW5UeXBlIjpmdW5jdGlvbihlKXtjb25zdCB0PWUucGVla0J5dGVzKDIpO3JldHVybiAzNz09PXRbMF0mJjMzPT09dFsxXXx8MTI4PT09dFswXSYmMT09PXRbMV19KGUpP3I9bz8iQ0lERm9udFR5cGUwIjoiTU1UeXBlMSI9PT1pPyJNTVR5cGUxIjoiVHlwZTEiOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZS5wZWVrQnl0ZXMoNCk7cmV0dXJuIHRbMF0+PTEmJnRbM10+PTEmJnRbM108PTR9KGUpP28/KHI9IkNJREZvbnRUeXBlMCIsYT0iQ0lERm9udFR5cGUwQyIpOihyPSJNTVR5cGUxIj09PWk/Ik1NVHlwZTEiOiJUeXBlMSIsYT0iVHlwZTFDIik6KCgwLG4ud2FybikoImdldEZvbnRGaWxlVHlwZTogVW5hYmxlIHRvIGRldGVjdCBjb3JyZWN0IGZvbnQgZmlsZSBUeXBlL1N1YnR5cGUuIikscj1pLGE9cyksW3IsYV19KHQsciksbz09PXRoaXMudHlwZSYmYz09PXRoaXMuc3VidHlwZXx8KDAsbi5pbmZvKSgiSW5jb25zaXN0ZW50IGZvbnQgZmlsZSBUeXBlL1N1YlR5cGUsIGV4cGVjdGVkOiAiLmNvbmNhdCh0aGlzLnR5cGUsIi8iKS5jb25jYXQodGhpcy5zdWJ0eXBlLCIgYnV0IGZvdW5kOiAiKS5jb25jYXQobywiLyIpLmNvbmNhdChjLCIuIikpO3RyeXtzd2l0Y2gobyl7Y2FzZSJNTVR5cGUxIjooMCxuLmluZm8pKCJNTVR5cGUxIGZvbnQgKCIrZSsiKSwgZmFsbGluZyBiYWNrIHRvIFR5cGUxLiIpO2Nhc2UiVHlwZTEiOmNhc2UiQ0lERm9udFR5cGUwIjp0aGlzLm1pbWV0eXBlPSJmb250L29wZW50eXBlIjtjb25zdCBhPSJUeXBlMUMiPT09Y3x8IkNJREZvbnRUeXBlMEMiPT09Yz9uZXcgdS5DRkZGb250KHQscik6bmV3IHcuVHlwZTFGb250KGUsdCxyKTtrKHIpLGQ9dGhpcy5jb252ZXJ0KGUsYSxyKTticmVhaztjYXNlIk9wZW5UeXBlIjpjYXNlIlRydWVUeXBlIjpjYXNlIkNJREZvbnRUeXBlMiI6dGhpcy5taW1ldHlwZT0iZm9udC9vcGVudHlwZSIsZD10aGlzLmNoZWNrQW5kUmVwYWlyKGUsdCxyKSx0aGlzLmlzT3BlblR5cGUmJihrKHIpLG89Ik9wZW5UeXBlIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiRm9udCAiLmNvbmNhdChvLCIgaXMgbm90IHN1cHBvcnRlZCIpKX19Y2F0Y2goZSl7cmV0dXJuKDAsbi53YXJuKShlKSx2b2lkIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQocil9QyhyKSx0aGlzLmRhdGE9ZCx0aGlzLnR5cGU9byx0aGlzLnN1YnR5cGU9Yyx0aGlzLmZvbnRNYXRyaXg9ci5mb250TWF0cml4LHRoaXMud2lkdGhzPXIud2lkdGhzLHRoaXMuZGVmYXVsdFdpZHRoPXIuZGVmYXVsdFdpZHRoLHRoaXMudG9Vbmljb2RlPXIudG9Vbmljb2RlLHRoaXMuc2VhY01hcD1yLnNlYWNNYXB9Z2V0IHJlbmRlcmVyKCl7Y29uc3QgZT1kLkZvbnRSZW5kZXJlckZhY3RvcnkuY3JlYXRlKHRoaXMsaS5TRUFDX0FOQUxZU0lTX0VOQUJMRUQpO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJyZW5kZXJlciIsZSl9ZXhwb3J0RGF0YSgpe2NvbnN0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXT9bLi4uUywuLi5BXTpTLHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtsZXQgcixuO2ZvcihyIG9mIGUpbj10aGlzW3JdLHZvaWQgMCE9PW4mJih0W3JdPW4pO3JldHVybiB0fWZhbGxiYWNrVG9TeXN0ZW1Gb250KGUpe3RoaXMubWlzc2luZ0ZpbGU9ITA7Y29uc3R7bmFtZTp0LHR5cGU6cn09dGhpcztsZXQgbj0oMCxpLm5vcm1hbGl6ZUZvbnROYW1lKSh0KTtjb25zdCBhPSgwLGwuZ2V0U3RkRm9udE1hcCkoKSx1PSgwLGwuZ2V0Tm9uU3RkRm9udE1hcCkoKSxkPSEhYVtuXSxnPSEoIXVbbl18fCFhW3Vbbl1dKTtuPWFbbl18fHVbbl18fG47Y29uc3QgcD0oMCxmLmdldEZvbnRCYXNpY01ldHJpY3MpKClbbl07cCYmKGlzTmFOKHRoaXMuYXNjZW50KSYmKHRoaXMuYXNjZW50PXAuYXNjZW50L3gpLGlzTmFOKHRoaXMuZGVzY2VudCkmJih0aGlzLmRlc2NlbnQ9cC5kZXNjZW50L3gpLGlzTmFOKHRoaXMuY2FwSGVpZ2h0KSYmKHRoaXMuY2FwSGVpZ2h0PXAuY2FwSGVpZ2h0L3gpKSx0aGlzLmJvbGQ9L2JvbGQvZ2kudGVzdChuKSx0aGlzLml0YWxpYz0vb2JsaXF1ZXxpdGFsaWMvZ2kudGVzdChuKSx0aGlzLmJsYWNrPS9CbGFjay9nLnRlc3QodCk7Y29uc3QgbT0vTmFycm93L2cudGVzdCh0KTtpZih0aGlzLnJlbWVhc3VyZT0oIWR8fG0pJiZPYmplY3Qua2V5cyh0aGlzLndpZHRocykubGVuZ3RoPjAsKGR8fGcpJiYiQ0lERm9udFR5cGUyIj09PXImJnRoaXMuY2lkRW5jb2Rpbmcuc3RhcnRzV2l0aCgiSWRlbnRpdHktIikpe2NvbnN0IHI9ZS5jaWRUb0dpZE1hcCxuPVtdO2lmKFIobiwoMCxsLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKSksL0FyaWFsLT9CbGFjay9pLnRlc3QodCk/UihuLCgwLGwuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrKSgpKTovQ2FsaWJyaS9pLnRlc3QodCkmJlIobiwoMCxsLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSkoKSkscil7Zm9yKGNvbnN0IGUgaW4gbil7Y29uc3QgdD1uW2VdO3ZvaWQgMCE9PXJbdF0mJihuWytlXT1yW3RdKX1yLmxlbmd0aCE9PXRoaXMudG9Vbmljb2RlLmxlbmd0aCYmZS5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCYmdGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBoLklkZW50aXR5VG9Vbmljb2RlTWFwJiZ0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChmdW5jdGlvbihlLHQpe2NvbnN0IGE9bltlXTt2b2lkIDA9PT1yW2FdJiYoblsrZV09dCl9KSl9dGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBoLklkZW50aXR5VG9Vbmljb2RlTWFwfHx0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChmdW5jdGlvbihlLHQpe25bK2VdPXR9KSksdGhpcy50b0ZvbnRDaGFyPW4sdGhpcy50b1VuaWNvZGU9bmV3IGguVG9Vbmljb2RlTWFwKG4pfWVsc2UgaWYoL1N5bWJvbC9pLnRlc3QobikpdGhpcy50b0ZvbnRDaGFyPU4oYy5TeW1ib2xTZXRFbmNvZGluZywoMCxvLmdldEdseXBoc1VuaWNvZGUpKCksdGhpcy5kaWZmZXJlbmNlcyk7ZWxzZSBpZigvRGluZ2JhdHMvaS50ZXN0KG4pKXRoaXMudG9Gb250Q2hhcj1OKGMuWmFwZkRpbmdiYXRzRW5jb2RpbmcsKDAsby5nZXREaW5nYmF0c0dseXBoc1VuaWNvZGUpKCksdGhpcy5kaWZmZXJlbmNlcyk7ZWxzZSBpZihkKXtjb25zdCBlPU4odGhpcy5kZWZhdWx0RW5jb2RpbmcsKDAsby5nZXRHbHlwaHNVbmljb2RlKSgpLHRoaXMuZGlmZmVyZW5jZXMpOyJDSURGb250VHlwZTIiIT09cnx8dGhpcy5jaWRFbmNvZGluZy5zdGFydHNXaXRoKCJJZGVudGl0eS0iKXx8dGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBoLklkZW50aXR5VG9Vbmljb2RlTWFwfHx0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2VbK3RdPXJ9KSksdGhpcy50b0ZvbnRDaGFyPWV9ZWxzZXtjb25zdCBlPSgwLG8uZ2V0R2x5cGhzVW5pY29kZSkoKSxyPVtdO3RoaXMudG9Vbmljb2RlLmZvckVhY2goKCh0LG4pPT57aWYoIXRoaXMuY29tcG9zaXRlKXtjb25zdCByPXRoaXMuZGlmZmVyZW5jZXNbdF18fHRoaXMuZGVmYXVsdEVuY29kaW5nW3RdLGE9KDAscy5nZXRVbmljb2RlRm9yR2x5cGgpKHIsZSk7LTEhPT1hJiYobj1hKX1yWyt0XT1ufSkpLHRoaXMuY29tcG9zaXRlJiZ0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIGguSWRlbnRpdHlUb1VuaWNvZGVNYXAmJi9UYWhvbWF8VmVyZGFuYS9pLnRlc3QodCkmJlIociwoMCxsLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKSksdGhpcy50b0ZvbnRDaGFyPXJ9QyhlKSx0aGlzLmxvYWRlZE5hbWU9bi5zcGxpdCgiLSIpWzBdfWNoZWNrQW5kUmVwYWlyKGUsdCxyKXt2YXIgcyxsO2NvbnN0IGQ9WyJPUy8yIiwiY21hcCIsImhlYWQiLCJoaGVhIiwiaG10eCIsIm1heHAiLCJuYW1lIiwicG9zdCIsImxvY2EiLCJnbHlmIiwiZnBnbSIsInByZXAiLCJjdnQgIiwiQ0ZGICJdO2Z1bmN0aW9uIGYoZSx0KXtjb25zdCByPU9iamVjdC5jcmVhdGUobnVsbCk7clsiT1MvMiJdPW51bGwsci5jbWFwPW51bGwsci5oZWFkPW51bGwsci5oaGVhPW51bGwsci5obXR4PW51bGwsci5tYXhwPW51bGwsci5uYW1lPW51bGwsci5wb3N0PW51bGw7Zm9yKGxldCBuPTA7bjx0O24rKyl7Y29uc3QgdD1iKGUpO2QuaW5jbHVkZXModC50YWcpJiYwIT09dC5sZW5ndGgmJihyW3QudGFnXT10KX1yZXR1cm4gcn1mdW5jdGlvbiBiKGUpe2NvbnN0IHQ9ZS5nZXRTdHJpbmcoNCkscj1lLmdldEludDMyKCk+Pj4wLG49ZS5nZXRJbnQzMigpPj4+MCxhPWUuZ2V0SW50MzIoKT4+PjAsaT1lLnBvcztlLnBvcz1lLnN0YXJ0fHwwLGUuc2tpcChuKTtjb25zdCBzPWUuZ2V0Qnl0ZXMoYSk7cmV0dXJuIGUucG9zPWksImhlYWQiPT09dCYmKHNbOF09c1s5XT1zWzEwXT1zWzExXT0wLHNbMTddfD0zMikse3RhZzp0LGNoZWNrc3VtOnIsbGVuZ3RoOmEsb2Zmc2V0Om4sZGF0YTpzfX1mdW5jdGlvbiB3KGUpe3JldHVybnt2ZXJzaW9uOmUuZ2V0U3RyaW5nKDQpLG51bVRhYmxlczplLmdldFVpbnQxNigpLHNlYXJjaFJhbmdlOmUuZ2V0VWludDE2KCksZW50cnlTZWxlY3RvcjplLmdldFVpbnQxNigpLHJhbmdlU2hpZnQ6ZS5nZXRVaW50MTYoKX19ZnVuY3Rpb24gdihlLHQscixuLGEsaSl7Y29uc3Qgcz17bGVuZ3RoOjAsc2l6ZU9mSW5zdHJ1Y3Rpb25zOjB9O2lmKHQ8MHx8dD49ZS5sZW5ndGh8fHI+ZS5sZW5ndGh8fHItdDw9MTIpcmV0dXJuIHM7Y29uc3Qgbz1lLnN1YmFycmF5KHQsciksYz1UKG9bMl0sb1szXSksbD1UKG9bNF0sb1s1XSksaD1UKG9bNl0sb1s3XSksdT1UKG9bOF0sb1s5XSk7Yz5oJiYoSShvLDIsaCksSShvLDYsYykpLGw+dSYmKEkobyw0LHUpLEkobyw4LGwpKTtjb25zdCBkPVQob1swXSxvWzFdKTtpZihkPDApcmV0dXJuIGQ8LTF8fChuLnNldChvLGEpLHMubGVuZ3RoPW8ubGVuZ3RoKSxzO2xldCBmLGc9MTAscD0wO2ZvcihmPTA7ZjxkO2YrKylwPTErKG9bZ108PDh8b1tnKzFdKSxnKz0yO2NvbnN0IG09ZyxiPW9bZ108PDh8b1tnKzFdO3Muc2l6ZU9mSW5zdHJ1Y3Rpb25zPWIsZys9MitiO2NvbnN0IHk9ZztsZXQgdz0wO2ZvcihmPTA7ZjxwO2YrKyl7Y29uc3QgZT1vW2crK107MTkyJmUmJihvW2ctMV09NjMmZSk7bGV0IHQ9MjsyJmU/dD0xOjE2JmUmJih0PTApO2xldCByPTI7NCZlP3I9MTozMiZlJiYocj0wKTtjb25zdCBuPXQrcjtpZih3Kz1uLDgmZSl7Y29uc3QgZT1vW2crK107MD09PWUmJihvW2ctMV1ePTgpLGYrPWUsdys9ZSpufX1pZigwPT09dylyZXR1cm4gcztsZXQgdj1nK3c7cmV0dXJuIHY+by5sZW5ndGg/czohaSYmYj4wPyhuLnNldChvLnN1YmFycmF5KDAsbSksYSksbi5zZXQoWzAsMF0sYSttKSxuLnNldChvLnN1YmFycmF5KHksdiksYSttKzIpLHYtPWIsby5sZW5ndGgtdj4zJiYodj12KzMmLTQpLHMubGVuZ3RoPXYscyk6by5sZW5ndGgtdj4zPyh2PXYrMyYtNCxuLnNldChvLnN1YmFycmF5KDAsdiksYSkscy5sZW5ndGg9dixzKToobi5zZXQobyxhKSxzLmxlbmd0aD1vLmxlbmd0aCxzKX1mdW5jdGlvbiB4KGUpe2NvbnN0IHI9KHQuc3RhcnR8fDApK2Uub2Zmc2V0O3QucG9zPXI7Y29uc3Qgbj1bW10sW11dLGE9W10saT1lLmxlbmd0aCxzPXIraTtpZigwIT09dC5nZXRVaW50MTYoKXx8aTw2KXJldHVybltuLGFdO2NvbnN0IG89dC5nZXRVaW50MTYoKSxjPXQuZ2V0VWludDE2KCk7bGV0IGwsaDtmb3IobD0wO2w8byYmdC5wb3MrMTI8PXM7bCsrKXtjb25zdCBlPXtwbGF0Zm9ybTp0LmdldFVpbnQxNigpLGVuY29kaW5nOnQuZ2V0VWludDE2KCksbGFuZ3VhZ2U6dC5nZXRVaW50MTYoKSxuYW1lOnQuZ2V0VWludDE2KCksbGVuZ3RoOnQuZ2V0VWludDE2KCksb2Zmc2V0OnQuZ2V0VWludDE2KCl9OyhEKGUpfHxCKGUpKSYmYS5wdXNoKGUpfWZvcihsPTAsaD1hLmxlbmd0aDtsPGg7bCsrKXtjb25zdCBlPWFbbF07aWYoZS5sZW5ndGg8PTApY29udGludWU7Y29uc3QgaT1yK2MrZS5vZmZzZXQ7aWYoaStlLmxlbmd0aD5zKWNvbnRpbnVlO3QucG9zPWk7Y29uc3Qgbz1lLm5hbWU7aWYoZS5lbmNvZGluZyl7bGV0IHI9IiI7Zm9yKGxldCBuPTAsYT1lLmxlbmd0aDtuPGE7bis9MilyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHQuZ2V0VWludDE2KCkpO25bMV1bb109cn1lbHNlIG5bMF1bb109dC5nZXRTdHJpbmcoZS5sZW5ndGgpfXJldHVybltuLGFdfWNvbnN0IFM9WzAsMCwwLDAsMCwwLDAsMCwtMiwtMiwtMiwtMiwwLDAsLTIsLTUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMCwwLC0xLDAsLTEsLTEsLTEsLTEsMSwtMSwtOTk5LDAsMSwwLC0xLC0yLDAsLTEsLTIsLTEsLTEsMCwtMSwtMSwwLDAsLTk5OSwtOTk5LC0xLC0xLC0xLC0xLC0yLC05OTksLTIsLTIsLTk5OSwwLC0yLC0yLDAsMCwtMiwwLC0yLDAsMCwwLC0yLC0xLC0xLDEsMSwwLDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMCwwLC0xLDAsLTEsLTEsMCwtOTk5LC0xLC0xLC0xLC0xLC0xLC0xLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLC0yLC05OTksLTk5OSwtOTk5LC05OTksLTk5OSwtMSwtMSwtMiwtMiwwLDAsMCwwLC0xLC0xLC05OTksLTIsLTIsMCwwLC0xLC0yLC0yLDAsMCwwLC0xLC0xLC0xLC0yXTtmdW5jdGlvbiBBKGUsdCl7bGV0IHIsYSxpLHMsbyxjPWUuZGF0YSxsPTAsaD0wLHU9MDtjb25zdCBkPVtdLGY9W10sZz1bXTtsZXQgcD10LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyxtPSExLGI9MCx5PTA7Zm9yKGxldCBlPWMubGVuZ3RoO2w8ZTspe2NvbnN0IGU9Y1tsKytdO2lmKDY0PT09ZSlpZihhPWNbbCsrXSxtfHx5KWwrPWE7ZWxzZSBmb3Iocj0wO3I8YTtyKyspZC5wdXNoKGNbbCsrXSk7ZWxzZSBpZig2NT09PWUpaWYoYT1jW2wrK10sbXx8eSlsKz0yKmE7ZWxzZSBmb3Iocj0wO3I8YTtyKyspaT1jW2wrK10sZC5wdXNoKGk8PDh8Y1tsKytdKTtlbHNlIGlmKDE3Nj09KDI0OCZlKSlpZihhPWUtMTc2KzEsbXx8eSlsKz1hO2Vsc2UgZm9yKHI9MDtyPGE7cisrKWQucHVzaChjW2wrK10pO2Vsc2UgaWYoMTg0PT0oMjQ4JmUpKWlmKGE9ZS0xODQrMSxtfHx5KWwrPTIqYTtlbHNlIGZvcihyPTA7cjxhO3IrKylpPWNbbCsrXSxkLnB1c2goaTw8OHxjW2wrK10pO2Vsc2UgaWYoNDMhPT1lfHxwKWlmKDQ0IT09ZXx8cCl7aWYoNDU9PT1lKWlmKG0pbT0hMSxoPWw7ZWxzZXtpZihvPWYucG9wKCksIW8pcmV0dXJuKDAsbi53YXJuKSgiVFQ6IEVOREYgYmFkIHN0YWNrIiksdm9pZCh0LmhpbnRzVmFsaWQ9ITEpO3M9Zy5wb3AoKSxjPW8uZGF0YSxsPW8uaSx0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzW3NdPWQubGVuZ3RoLW8uc3RhY2tUb3B9ZWxzZSBpZigxMzc9PT1lKShtfHx5KSYmKCgwLG4ud2FybikoIlRUOiBuZXN0ZWQgSURFRnMgbm90IGFsbG93ZWQiKSxwPSEwKSxtPSEwLHU9bDtlbHNlIGlmKDg4PT09ZSkrK2I7ZWxzZSBpZigyNz09PWUpeT1iO2Vsc2UgaWYoODk9PT1lKXk9PT1iJiYoeT0wKSwtLWI7ZWxzZSBpZigyOD09PWUmJiFtJiYheSl7Y29uc3QgZT1kLmF0KC0xKTtlPjAmJihsKz1lLTEpfX1lbHNlKG18fHkpJiYoKDAsbi53YXJuKSgiVFQ6IG5lc3RlZCBGREVGcyBub3QgYWxsb3dlZCIpLHA9ITApLG09ITAsdT1sLHM9ZC5wb3AoKSx0LmZ1bmN0aW9uc0RlZmluZWRbc109e2RhdGE6YyxpOmx9O2Vsc2UgaWYoIW0mJiF5KWlmKHM9ZC5hdCgtMSksaXNOYU4ocykpKDAsbi5pbmZvKSgiVFQ6IENBTEwgZW1wdHkgc3RhY2sgKG9yIGludmFsaWQgZW50cnkpLiIpO2Vsc2UgaWYodC5mdW5jdGlvbnNVc2VkW3NdPSEwLHMgaW4gdC5mdW5jdGlvbnNTdGFja0RlbHRhcyl7Y29uc3QgZT1kLmxlbmd0aCt0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzW3NdO2lmKGU8MClyZXR1cm4oMCxuLndhcm4pKCJUVDogQ0FMTCBpbnZhbGlkIGZ1bmN0aW9ucyBzdGFjayBkZWx0YS4iKSx2b2lkKHQuaGludHNWYWxpZD0hMSk7ZC5sZW5ndGg9ZX1lbHNlIGlmKHMgaW4gdC5mdW5jdGlvbnNEZWZpbmVkJiYhZy5pbmNsdWRlcyhzKSl7aWYoZi5wdXNoKHtkYXRhOmMsaTpsLHN0YWNrVG9wOmQubGVuZ3RoLTF9KSxnLnB1c2gocyksbz10LmZ1bmN0aW9uc0RlZmluZWRbc10sIW8pcmV0dXJuKDAsbi53YXJuKSgiVFQ6IENBTEwgbm9uLWV4aXN0ZW50IGZ1bmN0aW9uIiksdm9pZCh0LmhpbnRzVmFsaWQ9ITEpO2M9by5kYXRhLGw9by5pfWlmKCFtJiYheSl7bGV0IHQ9MDtmb3IoZTw9MTQyP3Q9U1tlXTplPj0xOTImJmU8PTIyMz90PS0xOmU+PTIyNCYmKHQ9LTIpLGU+PTExMyYmZTw9MTE3JiYoYT1kLnBvcCgpLGlzTmFOKGEpfHwodD0yKi1hKSk7dDwwJiZkLmxlbmd0aD4wOylkLnBvcCgpLHQrKztmb3IoO3Q+MDspZC5wdXNoKE5hTiksdC0tfX10LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucz1wO2NvbnN0IHc9W2NdO2w+Yy5sZW5ndGgmJncucHVzaChuZXcgVWludDhBcnJheShsLWMubGVuZ3RoKSksdT5oJiYoKDAsbi53YXJuKSgiVFQ6IGNvbXBsZW1lbnRpbmcgYSBtaXNzaW5nIGZ1bmN0aW9uIHRhaWwiKSx3LnB1c2gobmV3IFVpbnQ4QXJyYXkoWzM0LDQ1XSkpKSxmdW5jdGlvbihlLHQpe2lmKHQubGVuZ3RoPjEpe2xldCByLG4sYT0wO2ZvcihyPTAsbj10Lmxlbmd0aDtyPG47cisrKWErPXRbcl0ubGVuZ3RoO2E9YSszJi00O2NvbnN0IGk9bmV3IFVpbnQ4QXJyYXkoYSk7bGV0IHM9MDtmb3Iocj0wLG49dC5sZW5ndGg7cjxuO3IrKylpLnNldCh0W3JdLHMpLHMrPXRbcl0ubGVuZ3RoO2UuZGF0YT1pLGUubGVuZ3RoPWF9fShlLHcpfWxldCBDLE8sTSxFO2lmKFAodD1uZXcgeS5TdHJlYW0obmV3IFVpbnQ4QXJyYXkodC5nZXRCeXRlcygpKSkpKXtjb25zdCBlPWZ1bmN0aW9uKGUsdCl7Y29uc3R7bnVtRm9udHM6cixvZmZzZXRUYWJsZTphfT1mdW5jdGlvbihlKXtjb25zdCB0PWUuZ2V0U3RyaW5nKDQpOygwLG4uYXNzZXJ0KSgidHRjZiI9PT10LCJNdXN0IGJlIGEgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBmb250LiIpO2NvbnN0IHI9ZS5nZXRVaW50MTYoKSxhPWUuZ2V0VWludDE2KCksaT1lLmdldEludDMyKCk+Pj4wLHM9W107Zm9yKGxldCB0PTA7dDxpO3QrKylzLnB1c2goZS5nZXRJbnQzMigpPj4+MCk7Y29uc3Qgbz17dHRjVGFnOnQsbWFqb3JWZXJzaW9uOnIsbWlub3JWZXJzaW9uOmEsbnVtRm9udHM6aSxvZmZzZXRUYWJsZTpzfTtzd2l0Y2gocil7Y2FzZSAxOnJldHVybiBvO2Nhc2UgMjpyZXR1cm4gby5kc2lnVGFnPWUuZ2V0SW50MzIoKT4+PjAsby5kc2lnTGVuZ3RoPWUuZ2V0SW50MzIoKT4+PjAsby5kc2lnT2Zmc2V0PWUuZ2V0SW50MzIoKT4+PjAsb310aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiSW52YWxpZCBUcnVlVHlwZSBDb2xsZWN0aW9uIG1ham9yVmVyc2lvbjogIi5jb25jYXQociwiLiIpKX0oZSksaT10LnNwbGl0KCIrIik7bGV0IHM7Zm9yKGxldCBjPTA7YzxyO2MrKyl7ZS5wb3M9KGUuc3RhcnR8fDApK2FbY107Y29uc3Qgcj13KGUpLGw9ZihlLHIubnVtVGFibGVzKTtpZighbC5uYW1lKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdUcnVlVHlwZSBDb2xsZWN0aW9uIGZvbnQgbXVzdCBjb250YWluIGEgIm5hbWUiIHRhYmxlLicpO2NvbnN0W2hdPXgobC5uYW1lKTtmb3IobGV0IGU9MCxuPWgubGVuZ3RoO2U8bjtlKyspZm9yKGxldCBuPTAsYT1oW2VdLmxlbmd0aDtuPGE7bisrKXt2YXIgbztjb25zdCBhPW51bGw9PT0obz1oW2VdW25dKXx8dm9pZCAwPT09bz92b2lkIDA6by5yZXBsYWNlQWxsKC9ccy9nLCIiKTtpZihhKXtpZihhPT09dClyZXR1cm57aGVhZGVyOnIsdGFibGVzOmx9O2lmKCEoaS5sZW5ndGg8MikpZm9yKGNvbnN0IGUgb2YgaSlhPT09ZSYmKHM9e25hbWU6ZSxoZWFkZXI6cix0YWJsZXM6bH0pfX19aWYocylyZXR1cm4oMCxuLndhcm4pKCdUcnVlVHlwZSBDb2xsZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gIicuY29uY2F0KHQsJyIgZm9udCwgZmFsbGluZyBiYWNrIHRvICInKS5jb25jYXQocy5uYW1lLCciIGZvbnQgaW5zdGVhZC4nKSkse2hlYWRlcjpzLmhlYWRlcix0YWJsZXM6cy50YWJsZXN9O3Rocm93IG5ldyBuLkZvcm1hdEVycm9yKCdUcnVlVHlwZSBDb2xsZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gIicuY29uY2F0KHQsJyIgZm9udC4nKSl9KHQsdGhpcy5uYW1lKTtDPWUuaGVhZGVyLE89ZS50YWJsZXN9ZWxzZSBDPXcodCksTz1mKHQsQy5udW1UYWJsZXMpO2NvbnN0IFI9IU9bIkNGRiAiXTtpZihSKXtpZighTy5sb2NhKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAibG9jYSIgdGFibGUgaXMgbm90IGZvdW5kJyk7Ty5nbHlmfHwoKDAsbi53YXJuKSgnUmVxdWlyZWQgImdseWYiIHRhYmxlIGlzIG5vdCBmb3VuZCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKSxPLmdseWY9e3RhZzoiZ2x5ZiIsZGF0YTpuZXcgVWludDhBcnJheSgwKX0pLHRoaXMuaXNPcGVuVHlwZT0hMX1lbHNle3ZhciBOO2NvbnN0IHQ9ci5jb21wb3NpdGUmJigobnVsbD09PShOPXIuY2lkVG9HaWRNYXApfHx2b2lkIDA9PT1OP3ZvaWQgMDpOLmxlbmd0aCk+MHx8IShyLmNNYXAgaW5zdGFuY2VvZiBwLklkZW50aXR5Q01hcCkpO2lmKCJPVFRPIj09PUMudmVyc2lvbiYmIXR8fCFPLmhlYWR8fCFPLmhoZWF8fCFPLm1heHB8fCFPLnBvc3QpcmV0dXJuIEU9bmV3IHkuU3RyZWFtKE9bIkNGRiAiXS5kYXRhKSxNPW5ldyB1LkNGRkZvbnQoRSxyKSxrKHIpLHRoaXMuY29udmVydChlLE0scik7ZGVsZXRlIE8uZ2x5ZixkZWxldGUgTy5sb2NhLGRlbGV0ZSBPLmZwZ20sZGVsZXRlIE8ucHJlcCxkZWxldGUgT1siY3Z0ICJdLHRoaXMuaXNPcGVuVHlwZT0hMH1pZighTy5tYXhwKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAibWF4cCIgdGFibGUgaXMgbm90IGZvdW5kJyk7dC5wb3M9KHQuc3RhcnR8fDApK08ubWF4cC5vZmZzZXQ7Y29uc3QgWD10LmdldEludDMyKCkscT10LmdldFVpbnQxNigpO2lmKChudWxsPT09KHM9ci5zY2FsZUZhY3RvcnMpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLmxlbmd0aCk9PT1xJiZSKXtjb25zdHtzY2FsZUZhY3RvcnM6ZX09cix0PUYoTy5oZWFkLmRhdGFbNTBdLE8uaGVhZC5kYXRhWzUxXSksbj1uZXcgZy5HbHlmVGFibGUoe2dseWZUYWJsZTpPLmdseWYuZGF0YSxpc0dseXBoTG9jYXRpb25zTG9uZzp0LGxvY2FUYWJsZTpPLmxvY2EuZGF0YSxudW1HbHlwaHM6cX0pO24uc2NhbGUoZSk7Y29uc3R7Z2x5ZjphLGxvY2E6aSxpc0xvY2F0aW9uTG9uZzpzfT1uLndyaXRlKCk7Ty5nbHlmLmRhdGE9YSxPLmxvY2EuZGF0YT1pLHMhPT0hIXQmJihPLmhlYWQuZGF0YVs1MF09MCxPLmhlYWQuZGF0YVs1MV09cz8xOjApO2NvbnN0IG89Ty5obXR4LmRhdGE7Zm9yKGxldCB0PTA7dDxxO3QrKyl7Y29uc3Qgcj00KnQsbj1NYXRoLnJvdW5kKGVbdF0qRihvW3JdLG9bcisxXSkpO29bcl09bj4+OCYyNTUsb1tyKzFdPTI1NSZuLEkobyxyKzIsTWF0aC5yb3VuZChlW3RdKlQob1tyKzJdLG9bciszXSkpKX19bGV0IHo9cSsxLEc9ITA7ej42NTUzNSYmKEc9ITEsej1xLCgwLG4ud2FybikoIk5vdCBlbm91Z2ggc3BhY2UgaW4gZ2x5ZnMgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLiIpKTtsZXQgVz0wLFY9MDtYPj02NTUzNiYmTy5tYXhwLmxlbmd0aD49MjImJih0LnBvcys9OCx0LmdldFVpbnQxNigpPjImJihPLm1heHAuZGF0YVsxNF09MCxPLm1heHAuZGF0YVsxNV09MiksdC5wb3MrPTQsVz10LmdldFVpbnQxNigpLHQucG9zKz00LFY9dC5nZXRVaW50MTYoKSksTy5tYXhwLmRhdGFbNF09ej4+OCxPLm1heHAuZGF0YVs1XT0yNTUmejtjb25zdCBLPWZ1bmN0aW9uKGUsdCxyLGEpe2NvbnN0IGk9e2Z1bmN0aW9uc0RlZmluZWQ6W10sZnVuY3Rpb25zVXNlZDpbXSxmdW5jdGlvbnNTdGFja0RlbHRhczpbXSx0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnM6ITEsaGludHNWYWxpZDohMH07aWYoZSYmQShlLGkpLHQmJkEodCxpKSxlJiZmdW5jdGlvbihlLHQpe2lmKCFlLnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucylpZihlLmZ1bmN0aW9uc0RlZmluZWQubGVuZ3RoPnQpKDAsbi53YXJuKSgiVFQ6IG1vcmUgZnVuY3Rpb25zIGRlZmluZWQgdGhhbiBleHBlY3RlZCIpLGUuaGludHNWYWxpZD0hMTtlbHNlIGZvcihsZXQgcj0wLGE9ZS5mdW5jdGlvbnNVc2VkLmxlbmd0aDtyPGE7cisrKXtpZihyPnQpcmV0dXJuKDAsbi53YXJuKSgiVFQ6IGludmFsaWQgZnVuY3Rpb24gaWQ6ICIrciksdm9pZChlLmhpbnRzVmFsaWQ9ITEpO2lmKGUuZnVuY3Rpb25zVXNlZFtyXSYmIWUuZnVuY3Rpb25zRGVmaW5lZFtyXSlyZXR1cm4oMCxuLndhcm4pKCJUVDogdW5kZWZpbmVkIGZ1bmN0aW9uOiAiK3IpLHZvaWQoZS5oaW50c1ZhbGlkPSExKX19KGksYSksciYmMSZyLmxlbmd0aCl7Y29uc3QgZT1uZXcgVWludDhBcnJheShyLmxlbmd0aCsxKTtlLnNldChyLmRhdGEpLHIuZGF0YT1lfXJldHVybiBpLmhpbnRzVmFsaWR9KE8uZnBnbSxPLnByZXAsT1siY3Z0ICJdLFcpO2lmKEt8fChkZWxldGUgTy5mcGdtLGRlbGV0ZSBPLnByZXAsZGVsZXRlIE9bImN2dCAiXSksZnVuY3Rpb24oZSx0LHIsYSxpLHMpe2lmKCF0KXJldHVybiB2b2lkKHImJihyLmRhdGE9bnVsbCkpO2UucG9zPShlLnN0YXJ0fHwwKSt0Lm9mZnNldCxlLnBvcys9NCxlLnBvcys9MixlLnBvcys9MixlLnBvcys9MixlLnBvcys9MixlLnBvcys9MixlLnBvcys9MixlLnBvcys9MixlLnBvcys9MixlLnBvcys9Mjtjb25zdCBvPWUuZ2V0VWludDE2KCk7ZS5wb3MrPTgsZS5wb3MrPTI7bGV0IGM9ZS5nZXRVaW50MTYoKTswIT09byYmKDImRihhLmRhdGFbNDRdLGEuZGF0YVs0NV0pfHwodC5kYXRhWzIyXT0wLHQuZGF0YVsyM109MCkpLGM+aSYmKCgwLG4uaW5mbykoIlRoZSBudW1PZk1ldHJpY3MgKCIuY29uY2F0KGMsIikgc2hvdWxkIG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bUdseXBocyAoIikuY29uY2F0KGksIikuIikpLGM9aSx0LmRhdGFbMzRdPSg2NTI4MCZjKT4+OCx0LmRhdGFbMzVdPTI1NSZjKTtjb25zdCBsPWktYy0oci5sZW5ndGgtNCpjPj4xKTtpZihsPjApe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoci5sZW5ndGgrMipsKTtlLnNldChyLmRhdGEpLHMmJihlW3IubGVuZ3RoXT1yLmRhdGFbMl0sZVtyLmxlbmd0aCsxXT1yLmRhdGFbM10pLHIuZGF0YT1lfX0odCxPLmhoZWEsTy5obXR4LE8uaGVhZCx6LEcpLCFPLmhlYWQpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJoZWFkIiB0YWJsZSBpcyBub3QgZm91bmQnKTshZnVuY3Rpb24oZSx0LHIpe2NvbnN0IGE9ZS5kYXRhLGk9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuKGU8PDI0KSsodDw8MTYpKyhyPDw4KStufShhWzBdLGFbMV0sYVsyXSxhWzNdKTtpPj4xNiE9MSYmKCgwLG4uaW5mbykoIkF0dGVtcHRpbmcgdG8gZml4IGludmFsaWQgdmVyc2lvbiBpbiBoZWFkIHRhYmxlOiAiK2kpLGFbMF09MCxhWzFdPTEsYVsyXT0wLGFbM109MCk7Y29uc3Qgcz1GKGFbNTBdLGFbNTFdKTtpZihzPDB8fHM+MSl7KDAsbi5pbmZvKSgiQXR0ZW1wdGluZyB0byBmaXggaW52YWxpZCBpbmRleFRvTG9jRm9ybWF0IGluIGhlYWQgdGFibGU6ICIrcyk7Y29uc3QgZT10KzE7aWYocj09PWU8PDEpYVs1MF09MCxhWzUxXT0wO2Vsc2V7aWYociE9PWU8PDIpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkNvdWxkIG5vdCBmaXggaW5kZXhUb0xvY0Zvcm1hdDogIitzKTthWzUwXT0wLGFbNTFdPTF9fX0oTy5oZWFkLHEsUj9PLmxvY2EubGVuZ3RoOjApO2xldCBZPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoUil7Y29uc3QgZT1GKE8uaGVhZC5kYXRhWzUwXSxPLmhlYWQuZGF0YVs1MV0pLHQ9ZnVuY3Rpb24oZSx0LHIsbixhLGkscyl7bGV0IG8sYyxsO24/KG89NCxjPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbdF08PDI0fGVbdCsxXTw8MTZ8ZVt0KzJdPDw4fGVbdCszXX0sbD1mdW5jdGlvbihlLHQscil7ZVt0XT1yPj4+MjQmMjU1LGVbdCsxXT1yPj4xNiYyNTUsZVt0KzJdPXI+PjgmMjU1LGVbdCszXT0yNTUmcn0pOihvPTIsYz1mdW5jdGlvbihlLHQpe3JldHVybiBlW3RdPDw5fGVbdCsxXTw8MX0sbD1mdW5jdGlvbihlLHQscil7ZVt0XT1yPj45JjI1NSxlW3QrMV09cj4+MSYyNTV9KTtjb25zdCBoPWk/cisxOnIsdT1vKigxK2gpLGQ9bmV3IFVpbnQ4QXJyYXkodSk7ZC5zZXQoZS5kYXRhLnN1YmFycmF5KDAsdSkpLGUuZGF0YT1kO2NvbnN0IGY9dC5kYXRhLGc9Zi5sZW5ndGgscD1uZXcgVWludDhBcnJheShnKTtsZXQgbSxiO2NvbnN0IHk9W107Zm9yKG09MCxiPTA7bTxyKzE7bSsrLGIrPW8pe2xldCBlPWMoZCxiKTtlPmcmJihlPWcpLHkucHVzaCh7aW5kZXg6bSxvZmZzZXQ6ZSxlbmRPZmZzZXQ6MH0pfWZvcih5LnNvcnQoKChlLHQpPT5lLm9mZnNldC10Lm9mZnNldCkpLG09MDttPHI7bSsrKXlbbV0uZW5kT2Zmc2V0PXlbbSsxXS5vZmZzZXQ7Zm9yKHkuc29ydCgoKGUsdCk9PmUuaW5kZXgtdC5pbmRleCkpLG09MDttPHI7bSsrKXtjb25zdHtvZmZzZXQ6ZSxlbmRPZmZzZXQ6dH09eVttXTtpZigwIT09ZXx8MCE9PXQpYnJlYWs7Y29uc3Qgcj15W20rMV0ub2Zmc2V0O2lmKDAhPT1yKXt5W21dLmVuZE9mZnNldD1yO2JyZWFrfX1jb25zdCB3PU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IHg9MDtmb3IobChkLDAseCksbT0wLGI9bzttPHI7bSsrLGIrPW8pe2NvbnN0IGU9dihmLHlbbV0ub2Zmc2V0LHlbbV0uZW5kT2Zmc2V0LHAseCxhKSx0PWUubGVuZ3RoOzA9PT10JiYod1ttXT0hMCksZS5zaXplT2ZJbnN0cnVjdGlvbnM+cyYmKHM9ZS5zaXplT2ZJbnN0cnVjdGlvbnMpLHgrPXQsbChkLGIseCl9aWYoMD09PXgpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoWzAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0OSwwXSk7Zm9yKG09MCxiPW87bTxoO20rKyxiKz1vKWwoZCxiLGUubGVuZ3RoKTt0LmRhdGE9ZX1lbHNlIGlmKGkpe2NvbnN0IHI9YyhkLG8pO3AubGVuZ3RoPnIreD90LmRhdGE9cC5zdWJhcnJheSgwLHIreCk6KHQuZGF0YT1uZXcgVWludDhBcnJheShyK3gpLHQuZGF0YS5zZXQocC5zdWJhcnJheSgwLHgpKSksdC5kYXRhLnNldChwLnN1YmFycmF5KDAscikseCksbChlLmRhdGEsZC5sZW5ndGgtbyx4K3IpfWVsc2UgdC5kYXRhPXAuc3ViYXJyYXkoMCx4KTtyZXR1cm57bWlzc2luZ0dseXBoczp3LG1heFNpemVPZkluc3RydWN0aW9uczpzfX0oTy5sb2NhLE8uZ2x5ZixxLGUsSyxHLFYpO1k9dC5taXNzaW5nR2x5cGhzLFg+PTY1NTM2JiZPLm1heHAubGVuZ3RoPj0yMiYmKE8ubWF4cC5kYXRhWzI2XT10Lm1heFNpemVPZkluc3RydWN0aW9ucz4+OCxPLm1heHAuZGF0YVsyN109MjU1JnQubWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zKX1pZighTy5oaGVhKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAiaGhlYSIgdGFibGUgaXMgbm90IGZvdW5kJyk7MD09PU8uaGhlYS5kYXRhWzEwXSYmMD09PU8uaGhlYS5kYXRhWzExXSYmKE8uaGhlYS5kYXRhWzEwXT0yNTUsTy5oaGVhLmRhdGFbMTFdPTI1NSk7Y29uc3QgSj17dW5pdHNQZXJFbTpGKE8uaGVhZC5kYXRhWzE4XSxPLmhlYWQuZGF0YVsxOV0pLHlNYXg6VChPLmhlYWQuZGF0YVs0Ml0sTy5oZWFkLmRhdGFbNDNdKSx5TWluOlQoTy5oZWFkLmRhdGFbMzhdLE8uaGVhZC5kYXRhWzM5XSksYXNjZW50OlQoTy5oaGVhLmRhdGFbNF0sTy5oaGVhLmRhdGFbNV0pLGRlc2NlbnQ6VChPLmhoZWEuZGF0YVs2XSxPLmhoZWEuZGF0YVs3XSksbGluZUdhcDpUKE8uaGhlYS5kYXRhWzhdLE8uaGhlYS5kYXRhWzldKX07dGhpcy5hc2NlbnQ9Si5hc2NlbnQvSi51bml0c1BlckVtLHRoaXMuZGVzY2VudD1KLmRlc2NlbnQvSi51bml0c1BlckVtLHRoaXMubGluZUdhcD1KLmxpbmVHYXAvSi51bml0c1BlckVtLG51bGwhPT0obD10aGlzLmNzc0ZvbnRJbmZvKSYmdm9pZCAwIT09bCYmbC5saW5lSGVpZ2h0Pyh0aGlzLmxpbmVIZWlnaHQ9dGhpcy5jc3NGb250SW5mby5tZXRyaWNzLmxpbmVIZWlnaHQsdGhpcy5saW5lR2FwPXRoaXMuY3NzRm9udEluZm8ubWV0cmljcy5saW5lR2FwKTp0aGlzLmxpbmVIZWlnaHQ9dGhpcy5hc2NlbnQtdGhpcy5kZXNjZW50K3RoaXMubGluZUdhcCxPLnBvc3QmJmZ1bmN0aW9uKGUscixhKXtjb25zdCBzPSh0LnN0YXJ0fHwwKStlLm9mZnNldDt0LnBvcz1zO2NvbnN0IG89cytlLmxlbmd0aCxjPXQuZ2V0SW50MzIoKTt0LnNraXAoMjgpO2xldCBsLGgsdT0hMDtzd2l0Y2goYyl7Y2FzZSA2NTUzNjpsPWkuTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nO2JyZWFrO2Nhc2UgMTMxMDcyOmNvbnN0IGU9dC5nZXRVaW50MTYoKTtpZihlIT09YSl7dT0hMTticmVha31jb25zdCBzPVtdO2ZvcihoPTA7aDxlOysraCl7Y29uc3QgZT10LmdldFVpbnQxNigpO2lmKGU+PTMyNzY4KXt1PSExO2JyZWFrfXMucHVzaChlKX1pZighdSlicmVhaztjb25zdCBkPVtdLGY9W107Zm9yKDt0LnBvczxvOyl7Y29uc3QgZT10LmdldEJ5dGUoKTtmb3IoZi5sZW5ndGg9ZSxoPTA7aDxlOysraClmW2hdPVN0cmluZy5mcm9tQ2hhckNvZGUodC5nZXRCeXRlKCkpO2QucHVzaChmLmpvaW4oIiIpKX1mb3IobD1bXSxoPTA7aDxlOysraCl7Y29uc3QgZT1zW2hdO2U8MjU4P2wucHVzaChpLk1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZ1tlXSk6bC5wdXNoKGRbZS0yNThdKX1icmVhaztjYXNlIDE5NjYwODpicmVhaztkZWZhdWx0OigwLG4ud2FybikoIlVua25vd24vdW5zdXBwb3J0ZWQgcG9zdCB0YWJsZSB2ZXJzaW9uICIrYyksdT0hMSxyLmRlZmF1bHRFbmNvZGluZyYmKGw9ci5kZWZhdWx0RW5jb2RpbmcpfXIuZ2x5cGhOYW1lcz1sfShPLnBvc3QscixxKSxPLnBvc3Q9e3RhZzoicG9zdCIsZGF0YTokKHIpfTtjb25zdCBaPVtdO2Z1bmN0aW9uIFEoZSl7cmV0dXJuIVlbZV19aWYoci5jb21wb3NpdGUpe2NvbnN0IGU9ci5jaWRUb0dpZE1hcHx8W10sdD0wPT09ZS5sZW5ndGg7ci5jTWFwLmZvckVhY2goKGZ1bmN0aW9uKHIsYSl7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYoYT1MKHIsYSwhMCkpLGE+NjU1MzUpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIk1heCBzaXplIG9mIENJRCBpcyA2NSw1MzUiKTtsZXQgaT0tMTt0P2k9YTp2b2lkIDAhPT1lW2FdJiYoaT1lW2FdKSxpPj0wJiZpPHEmJlEoaSkmJihaW3JdPWkpfSkpfWVsc2V7Y29uc3QgZT1mdW5jdGlvbihlLHQscixhKXtpZighZSlyZXR1cm4oMCxuLndhcm4pKCJObyBjbWFwIHRhYmxlIGF2YWlsYWJsZS4iKSx7cGxhdGZvcm1JZDotMSxlbmNvZGluZ0lkOi0xLG1hcHBpbmdzOltdLGhhc1Nob3J0Q21hcDohMX07bGV0IGkscz0odC5zdGFydHx8MCkrZS5vZmZzZXQ7dC5wb3M9cyx0LnNraXAoMik7Y29uc3Qgbz10LmdldFVpbnQxNigpO2xldCBjLGw9ITE7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7dmFyIGgsdTtjb25zdCBuPXQuZ2V0VWludDE2KCksaT10LmdldFVpbnQxNigpLHM9dC5nZXRJbnQzMigpPj4+MDtsZXQgZD0hMTtpZigobnVsbD09PShoPWMpfHx2b2lkIDA9PT1oP3ZvaWQgMDpoLnBsYXRmb3JtSWQpIT09bnx8KG51bGw9PT0odT1jKXx8dm9pZCAwPT09dT92b2lkIDA6dS5lbmNvZGluZ0lkKSE9PWkpe2lmKDAhPT1ufHwwIT09aSYmMSE9PWkmJjMhPT1pKWlmKDE9PT1uJiYwPT09aSlkPSEwO2Vsc2UgaWYoMyE9PW58fDEhPT1pfHwhYSYmYyl7aWYociYmMz09PW4mJjA9PT1pKXtkPSEwO2xldCByPSEwO2lmKGU8by0xKXtjb25zdCBlPXQucGVla0J5dGVzKDIpO0YoZVswXSxlWzFdKTxuJiYocj0hMSl9ciYmKGw9ITApfX1lbHNlIGQ9ITAscnx8KGw9ITApO2Vsc2UgZD0hMDtpZihkJiYoYz17cGxhdGZvcm1JZDpuLGVuY29kaW5nSWQ6aSxvZmZzZXQ6c30pLGwpYnJlYWt9fWlmKGMmJih0LnBvcz1zK2Mub2Zmc2V0KSwhY3x8LTE9PT10LnBlZWtCeXRlKCkpcmV0dXJuKDAsbi53YXJuKSgiQ291bGQgbm90IGZpbmQgYSBwcmVmZXJyZWQgY21hcCB0YWJsZS4iKSx7cGxhdGZvcm1JZDotMSxlbmNvZGluZ0lkOi0xLG1hcHBpbmdzOltdLGhhc1Nob3J0Q21hcDohMX07Y29uc3QgZD10LmdldFVpbnQxNigpO2xldCBmPSExO2NvbnN0IGc9W107bGV0IHAsbTtpZigwPT09ZCl7Zm9yKHQuc2tpcCg0KSxwPTA7cDwyNTY7cCsrKXtjb25zdCBlPXQuZ2V0Qnl0ZSgpO2UmJmcucHVzaCh7Y2hhckNvZGU6cCxnbHlwaElkOmV9KX1mPSEwfWVsc2UgaWYoMj09PWQpe3Quc2tpcCg0KTtjb25zdCBlPVtdO2xldCByPTA7Zm9yKGxldCBuPTA7bjwyNTY7bisrKXtjb25zdCBuPXQuZ2V0VWludDE2KCk+PjM7ZS5wdXNoKG4pLHI9TWF0aC5tYXgobixyKX1jb25zdCBuPVtdO2ZvcihsZXQgZT0wO2U8PXI7ZSsrKW4ucHVzaCh7Zmlyc3RDb2RlOnQuZ2V0VWludDE2KCksZW50cnlDb3VudDp0LmdldFVpbnQxNigpLGlkRGVsdGE6VCh0LmdldEJ5dGUoKSx0LmdldEJ5dGUoKSksaWRSYW5nZVBvczp0LnBvcyt0LmdldFVpbnQxNigpfSk7Zm9yKGxldCByPTA7cjwyNTY7cisrKWlmKDA9PT1lW3JdKXQucG9zPW5bMF0uaWRSYW5nZVBvcysyKnIsbT10LmdldFVpbnQxNigpLGcucHVzaCh7Y2hhckNvZGU6cixnbHlwaElkOm19KTtlbHNle2NvbnN0IGE9bltlW3JdXTtmb3IocD0wO3A8YS5lbnRyeUNvdW50O3ArKyl7Y29uc3QgZT0ocjw8OCkrcCthLmZpcnN0Q29kZTt0LnBvcz1hLmlkUmFuZ2VQb3MrMipwLG09dC5nZXRVaW50MTYoKSwwIT09bSYmKG09KG0rYS5pZERlbHRhKSU2NTUzNiksZy5wdXNoKHtjaGFyQ29kZTplLGdseXBoSWQ6bX0pfX19ZWxzZSBpZig0PT09ZCl7dC5za2lwKDQpO2NvbnN0IGU9dC5nZXRVaW50MTYoKT4+MTt0LnNraXAoNik7Y29uc3Qgcj1bXTtsZXQgbjtmb3Iobj0wO248ZTtuKyspci5wdXNoKHtlbmQ6dC5nZXRVaW50MTYoKX0pO2Zvcih0LnNraXAoMiksbj0wO248ZTtuKyspcltuXS5zdGFydD10LmdldFVpbnQxNigpO2ZvcihuPTA7bjxlO24rKylyW25dLmRlbHRhPXQuZ2V0VWludDE2KCk7bGV0IGEsbz0wO2ZvcihuPTA7bjxlO24rKyl7aT1yW25dO2NvbnN0IHM9dC5nZXRVaW50MTYoKTtzPyhhPShzPj4xKS0oZS1uKSxpLm9mZnNldEluZGV4PWEsbz1NYXRoLm1heChvLGEraS5lbmQtaS5zdGFydCsxKSk6aS5vZmZzZXRJbmRleD0tMX1jb25zdCBjPVtdO2ZvcihwPTA7cDxvO3ArKyljLnB1c2godC5nZXRVaW50MTYoKSk7Zm9yKG49MDtuPGU7bisrKXtpPXJbbl0scz1pLnN0YXJ0O2NvbnN0IGU9aS5lbmQsdD1pLmRlbHRhO2ZvcihhPWkub2Zmc2V0SW5kZXgscD1zO3A8PWU7cCsrKTY1NTM1IT09cCYmKG09YTwwP3A6Y1thK3Atc10sbT1tK3QmNjU1MzUsZy5wdXNoKHtjaGFyQ29kZTpwLGdseXBoSWQ6bX0pKX19ZWxzZSBpZig2PT09ZCl7dC5za2lwKDQpO2NvbnN0IGU9dC5nZXRVaW50MTYoKSxyPXQuZ2V0VWludDE2KCk7Zm9yKHA9MDtwPHI7cCsrKXttPXQuZ2V0VWludDE2KCk7Y29uc3Qgcj1lK3A7Zy5wdXNoKHtjaGFyQ29kZTpyLGdseXBoSWQ6bX0pfX1lbHNle2lmKDEyIT09ZClyZXR1cm4oMCxuLndhcm4pKCJjbWFwIHRhYmxlIGhhcyB1bnN1cHBvcnRlZCBmb3JtYXQ6ICIrZCkse3BsYXRmb3JtSWQ6LTEsZW5jb2RpbmdJZDotMSxtYXBwaW5nczpbXSxoYXNTaG9ydENtYXA6ITF9O3t0LnNraXAoMTApO2NvbnN0IGU9dC5nZXRJbnQzMigpPj4+MDtmb3IocD0wO3A8ZTtwKyspe2NvbnN0IGU9dC5nZXRJbnQzMigpPj4+MCxyPXQuZ2V0SW50MzIoKT4+PjA7bGV0IG49dC5nZXRJbnQzMigpPj4+MDtmb3IobGV0IHQ9ZTt0PD1yO3QrKylnLnB1c2goe2NoYXJDb2RlOnQsZ2x5cGhJZDpuKyt9KX19fWcuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jaGFyQ29kZS10LmNoYXJDb2RlfSkpO2ZvcihsZXQgZT0xO2U8Zy5sZW5ndGg7ZSsrKWdbZS0xXS5jaGFyQ29kZT09PWdbZV0uY2hhckNvZGUmJihnLnNwbGljZShlLDEpLGUtLSk7cmV0dXJue3BsYXRmb3JtSWQ6Yy5wbGF0Zm9ybUlkLGVuY29kaW5nSWQ6Yy5lbmNvZGluZ0lkLG1hcHBpbmdzOmcsaGFzU2hvcnRDbWFwOmZ9fShPLmNtYXAsdCx0aGlzLmlzU3ltYm9saWNGb250LHIuaGFzRW5jb2RpbmcpLGE9ZS5wbGF0Zm9ybUlkLHM9ZS5lbmNvZGluZ0lkLGw9ZS5tYXBwaW5ncztsZXQgdT1bXSxkPSExO2lmKCFyLmhhc0VuY29kaW5nfHwiTWFjUm9tYW5FbmNvZGluZyIhPT1yLmJhc2VFbmNvZGluZ05hbWUmJiJXaW5BbnNpRW5jb2RpbmciIT09ci5iYXNlRW5jb2RpbmdOYW1lfHwodT0oMCxjLmdldEVuY29kaW5nKShyLmJhc2VFbmNvZGluZ05hbWUpKSxyLmhhc0VuY29kaW5nJiYhdGhpcy5pc1N5bWJvbGljRm9udCYmKDM9PT1hJiYxPT09c3x8MT09PWEmJjA9PT1zKSl7Y29uc3QgZT0oMCxvLmdldEdseXBoc1VuaWNvZGUpKCk7Zm9yKGxldCB0PTA7dDwyNTY7dCsrKXtsZXQgbjtpZihuPXZvaWQgMCE9PXRoaXMuZGlmZmVyZW5jZXNbdF0/dGhpcy5kaWZmZXJlbmNlc1t0XTp1Lmxlbmd0aCYmIiIhPT11W3RdP3VbdF06Yy5TdGFuZGFyZEVuY29kaW5nW3RdLCFuKWNvbnRpbnVlO2NvbnN0IG89KDAsaS5yZWNvdmVyR2x5cGhOYW1lKShuLGUpO2xldCBkO2lmKDM9PT1hJiYxPT09cz9kPWVbb106MT09PWEmJjA9PT1zJiYoZD1jLk1hY1JvbWFuRW5jb2RpbmcuaW5kZXhPZihvKSksdm9pZCAwPT09ZCl7aWYoIXIuZ2x5cGhOYW1lcyYmci5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCYmISh0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIGguSWRlbnRpdHlUb1VuaWNvZGVNYXApKXtjb25zdCBlPXRoaXMudG9Vbmljb2RlLmdldCh0KTtlJiYoZD1lLmNvZGVQb2ludEF0KDApKX1pZih2b2lkIDA9PT1kKWNvbnRpbnVlfWZvcihjb25zdCBlIG9mIGwpaWYoZS5jaGFyQ29kZT09PWQpe1pbdF09ZS5nbHlwaElkO2JyZWFrfX19ZWxzZSBpZigwPT09YSl7Zm9yKGNvbnN0IGUgb2YgbClaW2UuY2hhckNvZGVdPWUuZ2x5cGhJZDtkPSEwfWVsc2UgZm9yKGNvbnN0IGUgb2YgbCl7bGV0IHQ9ZS5jaGFyQ29kZTszPT09YSYmdD49NjE0NDAmJnQ8PTYxNjk1JiYodCY9MjU1KSxaW3RdPWUuZ2x5cGhJZH1pZihyLmdseXBoTmFtZXMmJih1Lmxlbmd0aHx8dGhpcy5kaWZmZXJlbmNlcy5sZW5ndGgpKWZvcihsZXQgZT0wO2U8MjU2OysrZSl7aWYoIWQmJnZvaWQgMCE9PVpbZV0pY29udGludWU7Y29uc3QgdD10aGlzLmRpZmZlcmVuY2VzW2VdfHx1W2VdO2lmKCF0KWNvbnRpbnVlO2NvbnN0IG49ci5nbHlwaE5hbWVzLmluZGV4T2YodCk7bj4wJiZRKG4pJiYoWltlXT1uKX19MD09PVoubGVuZ3RoJiYoWlswXT0wKTtsZXQgZWU9ei0xO2lmKEd8fChlZT0wKSwhci5jc3NGb250SW5mbyl7Y29uc3QgZT1fKFosUSxlZSx0aGlzLnRvVW5pY29kZSk7dGhpcy50b0ZvbnRDaGFyPWUudG9Gb250Q2hhcixPLmNtYXA9e3RhZzoiY21hcCIsZGF0YTpqKGUuY2hhckNvZGVUb0dseXBoSWQsZS50b1VuaWNvZGVFeHRyYU1hcCx6KX0sT1siT1MvMiJdJiZmdW5jdGlvbihlLHQpe3QucG9zPSh0LnN0YXJ0fHwwKStlLm9mZnNldDtjb25zdCByPXQuZ2V0VWludDE2KCk7dC5za2lwKDYwKTtjb25zdCBuPXQuZ2V0VWludDE2KCk7cmV0dXJuIShyPDQmJjc2OCZufHx0LmdldFVpbnQxNigpPnQuZ2V0VWludDE2KCl8fCh0LnNraXAoNiksMD09PXQuZ2V0VWludDE2KCl8fChlLmRhdGFbOF09ZS5kYXRhWzldPTAsMCkpKX0oT1siT1MvMiJdLHQpfHwoT1siT1MvMiJdPXt0YWc6Ik9TLzIiLGRhdGE6VShyLGUuY2hhckNvZGVUb0dseXBoSWQsSil9KX1pZighUil0cnl7RT1uZXcgeS5TdHJlYW0oT1siQ0ZGICJdLmRhdGEpLE09bmV3IGEuQ0ZGUGFyc2VyKEUscixpLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCkucGFyc2UoKSxNLmR1cGxpY2F0ZUZpcnN0R2x5cGgoKTtjb25zdCBlPW5ldyBhLkNGRkNvbXBpbGVyKE0pO09bIkNGRiAiXS5kYXRhPWUuY29tcGlsZSgpfWNhdGNoKGUpeygwLG4ud2FybikoIkZhaWxlZCB0byBjb21waWxlIGZvbnQgIityLmxvYWRlZE5hbWUpfWlmKE8ubmFtZSl7Y29uc3RbdCxuXT14KE8ubmFtZSk7Ty5uYW1lLmRhdGE9SChlLHQpLHRoaXMucHNOYW1lPXRbMF1bNl18fG51bGwsci5jb21wb3NpdGV8fGZ1bmN0aW9uKGUsdCxyKXtpZihlLmlzSW50ZXJuYWxGb250KXJldHVybjtpZihlLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKXJldHVybjtpZihlLmhhc0VuY29kaW5nKXJldHVybjtpZihlLnRvVW5pY29kZSBpbnN0YW5jZW9mIGguSWRlbnRpdHlUb1VuaWNvZGVNYXApcmV0dXJuO2lmKCF0KXJldHVybjtpZigwPT09ci5sZW5ndGgpcmV0dXJuO2lmKGUuZGVmYXVsdEVuY29kaW5nPT09Yy5XaW5BbnNpRW5jb2RpbmcpcmV0dXJuO2Zvcihjb25zdCBlIG9mIHIpaWYoIUIoZSkpcmV0dXJuO2NvbnN0IG49Yy5XaW5BbnNpRW5jb2RpbmcsYT1bXSxpPSgwLG8uZ2V0R2x5cGhzVW5pY29kZSkoKTtmb3IoY29uc3QgZSBpbiBuKXtjb25zdCB0PW5bZV07aWYoIiI9PT10KWNvbnRpbnVlO2NvbnN0IHI9aVt0XTt2b2lkIDAhPT1yJiYoYVtlXT1TdHJpbmcuZnJvbUNoYXJDb2RlKHIpKX1hLmxlbmd0aD4wJiZlLnRvVW5pY29kZS5hbWVuZChhKX0ocix0aGlzLmlzU3ltYm9saWNGb250LG4pfWVsc2UgTy5uYW1lPXt0YWc6Im5hbWUiLGRhdGE6SCh0aGlzLm5hbWUpfTtjb25zdCB0ZT1uZXcgbS5PcGVuVHlwZUZpbGVCdWlsZGVyKEMudmVyc2lvbik7Zm9yKGNvbnN0IGUgaW4gTyl0ZS5hZGRUYWJsZShlLE9bZV0uZGF0YSk7cmV0dXJuIHRlLnRvQXJyYXkoKX1jb252ZXJ0KGUsdCxyKXtyLmZpeGVkUGl0Y2g9ITEsci5idWlsdEluRW5jb2RpbmcmJmZ1bmN0aW9uKGUsdCl7aWYoZS5pc0ludGVybmFsRm9udClyZXR1cm47aWYoZS5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcClyZXR1cm47aWYodD09PWUuZGVmYXVsdEVuY29kaW5nKXJldHVybjtpZihlLnRvVW5pY29kZSBpbnN0YW5jZW9mIGguSWRlbnRpdHlUb1VuaWNvZGVNYXApcmV0dXJuO2NvbnN0IHI9W10sbj0oMCxvLmdldEdseXBoc1VuaWNvZGUpKCk7Zm9yKGNvbnN0IGEgaW4gdCl7aWYoZS5oYXNFbmNvZGluZyYmKGUuYmFzZUVuY29kaW5nTmFtZXx8dm9pZCAwIT09ZS5kaWZmZXJlbmNlc1thXSkpY29udGludWU7Y29uc3QgaT10W2FdLG89KDAscy5nZXRVbmljb2RlRm9yR2x5cGgpKGksbik7LTEhPT1vJiYoclthXT1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pKX1yLmxlbmd0aD4wJiZlLnRvVW5pY29kZS5hbWVuZChyKX0ocixyLmJ1aWx0SW5FbmNvZGluZyk7bGV0IGE9MTt0IGluc3RhbmNlb2YgdS5DRkZGb250JiYoYT10Lm51bUdseXBocy0xKTtjb25zdCBsPXQuZ2V0R2x5cGhNYXBwaW5nKHIpO2xldCBkPW51bGwsZj1sLGc9bnVsbDtyLmNzc0ZvbnRJbmZvfHwoZD1fKGwsdC5oYXNHbHlwaElkLmJpbmQodCksYSx0aGlzLnRvVW5pY29kZSksdGhpcy50b0ZvbnRDaGFyPWQudG9Gb250Q2hhcixmPWQuY2hhckNvZGVUb0dseXBoSWQsZz1kLnRvVW5pY29kZUV4dHJhTWFwKTtjb25zdCBwPXQubnVtR2x5cGhzO2Z1bmN0aW9uIGIoZSx0KXtsZXQgcj1udWxsO2Zvcihjb25zdCBuIGluIGUpdD09PWVbbl0mJihyfHwocj1bXSkpLnB1c2goMHxuKTtyZXR1cm4gcn1mdW5jdGlvbiB5KGUsdCl7Zm9yKGNvbnN0IHIgaW4gZSlpZih0PT09ZVtyXSlyZXR1cm4gMHxyO3JldHVybiBkLmNoYXJDb2RlVG9HbHlwaElkW2QubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZV09dCxkLm5leHRBdmFpbGFibGVGb250Q2hhckNvZGUrK31jb25zdCB3PXQuc2VhY3M7aWYoZCYmaS5TRUFDX0FOQUxZU0lTX0VOQUJMRUQmJm51bGwhPXcmJncubGVuZ3RoKXtjb25zdCBlPXIuZm9udE1hdHJpeHx8bi5GT05UX0lERU5USVRZX01BVFJJWCxhPXQuZ2V0Q2hhcnNldCgpLGk9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IHQgaW4gdyl7dHw9MDtjb25zdCByPXdbdF0sbj1jLlN0YW5kYXJkRW5jb2RpbmdbclsyXV0scz1jLlN0YW5kYXJkRW5jb2RpbmdbclszXV0sbz1hLmluZGV4T2YobiksaD1hLmluZGV4T2Yocyk7aWYobzwwfHxoPDApY29udGludWU7Y29uc3QgdT17eDpyWzBdKmVbMF0rclsxXSplWzJdK2VbNF0seTpyWzBdKmVbMV0rclsxXSplWzNdK2VbNV19LGY9YihsLHQpO2lmKGYpZm9yKGNvbnN0IGUgb2YgZil7Y29uc3QgdD1kLmNoYXJDb2RlVG9HbHlwaElkLHI9eSh0LG8pLG49eSh0LGgpO2lbZV09e2Jhc2VGb250Q2hhckNvZGU6cixhY2NlbnRGb250Q2hhckNvZGU6bixhY2NlbnRPZmZzZXQ6dX19fXIuc2VhY01hcD1pfWNvbnN0IHY9MS8oci5mb250TWF0cml4fHxuLkZPTlRfSURFTlRJVFlfTUFUUklYKVswXSx4PW5ldyBtLk9wZW5UeXBlRmlsZUJ1aWxkZXIoIk9UVE8iKTtyZXR1cm4geC5hZGRUYWJsZSgiQ0ZGICIsdC5kYXRhKSx4LmFkZFRhYmxlKCJPUy8yIixVKHIsZikpLHguYWRkVGFibGUoImNtYXAiLGooZixnLHApKSx4LmFkZFRhYmxlKCJoZWFkIiwiXDABXDBcMFwwXDAQXDBcMFwwXDBcMF8PPMO1XDBcMCIrRSh2KSsiXDBcMFwwXDDCnlx2fidcMFwwXDBcMMKeXHZ+J1wwXDAiK0Uoci5kZXNjZW50KSsiD8O/IitFKHIuYXNjZW50KStNKHIuaXRhbGljQW5nbGU/MjowKSsiXDARXDBcMFwwXDBcMFwwIikseC5hZGRUYWJsZSgiaGhlYSIsIlwwAVwwXDAiK0Uoci5hc2NlbnQpK0Uoci5kZXNjZW50KSsiXDBcMMO/w79cMFwwXDBcMFwwXDAiK0Uoci5jYXBIZWlnaHQpK0UoTWF0aC50YW4oci5pdGFsaWNBbmdsZSkqci54SGVpZ2h0KSsiXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIitNKHApKSx4LmFkZFRhYmxlKCJobXR4IixmdW5jdGlvbigpe2NvbnN0IGU9dC5jaGFyc3RyaW5ncyxyPXQuY2ZmP3QuY2ZmLndpZHRoczpudWxsO2xldCBuPSJcMFwwXDBcMCI7Zm9yKGxldCB0PTEsYT1wO3Q8YTt0Kyspe2xldCBhPTA7aWYoZSl7Y29uc3Qgcj1lW3QtMV07YT0id2lkdGgiaW4gcj9yLndpZHRoOjB9ZWxzZSByJiYoYT1NYXRoLmNlaWwoclt0XXx8MCkpO24rPU0oYSkrTSgwKX1yZXR1cm4gbn0oKSkseC5hZGRUYWJsZSgibWF4cCIsIlwwXDBQXDAiK00ocCkpLHguYWRkVGFibGUoIm5hbWUiLEgoZSkpLHguYWRkVGFibGUoInBvc3QiLCQocikpLHgudG9BcnJheSgpfWdldCBzcGFjZVdpZHRoKCl7Y29uc3QgZT1bInNwYWNlIiwibWludXMiLCJvbmUiLCJpIiwiSSJdO2xldCB0O2Zvcihjb25zdCByIG9mIGUpe2lmKHIgaW4gdGhpcy53aWR0aHMpe3Q9dGhpcy53aWR0aHNbcl07YnJlYWt9Y29uc3QgZT0oMCxvLmdldEdseXBoc1VuaWNvZGUpKClbcl07bGV0IG49MDtpZih0aGlzLmNvbXBvc2l0ZSYmdGhpcy5jTWFwLmNvbnRhaW5zKGUpJiYobj10aGlzLmNNYXAubG9va3VwKGUpLCJzdHJpbmciPT10eXBlb2YgbiYmKG49TChlLG4pKSksIW4mJnRoaXMudG9Vbmljb2RlJiYobj10aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKGUpKSxuPD0wJiYobj1lKSx0PXRoaXMud2lkdGhzW25dLHQpYnJlYWt9cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsInNwYWNlV2lkdGgiLHR8fHRoaXMuZGVmYXVsdFdpZHRoKX1fY2hhclRvR2x5cGgoZSl7dmFyIHQscixhLGk7bGV0IG8sYyxsLGg9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSx1PXRoaXMuX2dseXBoQ2FjaGVbZV07aWYoKG51bGw9PT0odD11KXx8dm9pZCAwPT09dD92b2lkIDA6dC5pc1NwYWNlKT09PWgpcmV0dXJuIHU7bGV0IGQ9ZTtudWxsIT09KHI9dGhpcy5jTWFwKSYmdm9pZCAwIT09ciYmci5jb250YWlucyhlKSYmKGQ9dGhpcy5jTWFwLmxvb2t1cChlKSwic3RyaW5nIj09dHlwZW9mIGQmJihkPUwoZSxkKSkpLGM9dGhpcy53aWR0aHNbZF0sIm51bWJlciIhPXR5cGVvZiBjJiYoYz10aGlzLmRlZmF1bHRXaWR0aCk7Y29uc3QgZj1udWxsPT09KGE9dGhpcy52bWV0cmljcyl8fHZvaWQgMD09PWE/dm9pZCAwOmFbZF07bGV0IGc9dGhpcy50b1VuaWNvZGUuZ2V0KGUpfHxlOyJudW1iZXIiPT10eXBlb2YgZyYmKGc9U3RyaW5nLmZyb21DaGFyQ29kZShnKSk7bGV0IHA9dm9pZCAwIT09dGhpcy50b0ZvbnRDaGFyW2VdO2lmKG89dGhpcy50b0ZvbnRDaGFyW2VdfHxlLHRoaXMubWlzc2luZ0ZpbGUpe2NvbnN0IHQ9dGhpcy5kaWZmZXJlbmNlc1tlXXx8dGhpcy5kZWZhdWx0RW5jb2RpbmdbZV07Ii5ub3RkZWYiIT09dCYmIiIhPT10fHwiVHlwZTEiIT09dGhpcy50eXBlfHwobz0zMiksbz0oMCxzLm1hcFNwZWNpYWxVbmljb2RlVmFsdWVzKShvKX10aGlzLmlzVHlwZTNGb250JiYobD1vKTtsZXQgbT1udWxsO2lmKG51bGwhPT0oaT10aGlzLnNlYWNNYXApJiZ2b2lkIDAhPT1pJiZpW2VdKXtwPSEwO2NvbnN0IHQ9dGhpcy5zZWFjTWFwW2VdO289dC5iYXNlRm9udENoYXJDb2RlLG09e2ZvbnRDaGFyOlN0cmluZy5mcm9tQ29kZVBvaW50KHQuYWNjZW50Rm9udENoYXJDb2RlKSxvZmZzZXQ6dC5hY2NlbnRPZmZzZXR9fWxldCBiPSIiO3JldHVybiJudW1iZXIiPT10eXBlb2YgbyYmKG88PTExMTQxMTE/Yj1TdHJpbmcuZnJvbUNvZGVQb2ludChvKTooMCxuLndhcm4pKCJjaGFyVG9HbHlwaCAtIGludmFsaWQgZm9udENoYXJDb2RlOiAiLmNvbmNhdChvKSkpLHU9bmV3IE8oZSxiLGcsbSxjLGYsbCxoLHApLHRoaXMuX2dseXBoQ2FjaGVbZV09dX1jaGFyc1RvR2x5cGhzKGUpe2xldCB0PXRoaXMuX2NoYXJzQ2FjaGVbZV07aWYodClyZXR1cm4gdDtpZih0PVtdLHRoaXMuY01hcCl7Y29uc3Qgcj1PYmplY3QuY3JlYXRlKG51bGwpLG49ZS5sZW5ndGg7bGV0IGE9MDtmb3IoO2E8bjspe3RoaXMuY01hcC5yZWFkQ2hhckNvZGUoZSxhLHIpO2NvbnN0e2NoYXJjb2RlOm4sbGVuZ3RoOml9PXI7YSs9aTtjb25zdCBzPXRoaXMuX2NoYXJUb0dseXBoKG4sMT09PWkmJjMyPT09ZS5jaGFyQ29kZUF0KGEtMSkpO3QucHVzaChzKX19ZWxzZSBmb3IobGV0IHI9MCxuPWUubGVuZ3RoO3I8bjsrK3Ipe2NvbnN0IG49ZS5jaGFyQ29kZUF0KHIpLGE9dGhpcy5fY2hhclRvR2x5cGgobiwzMj09PW4pO3QucHVzaChhKX1yZXR1cm4gdGhpcy5fY2hhcnNDYWNoZVtlXT10fWdldENoYXJQb3NpdGlvbnMoZSl7Y29uc3QgdD1bXTtpZih0aGlzLmNNYXApe2NvbnN0IHI9T2JqZWN0LmNyZWF0ZShudWxsKTtsZXQgbj0wO2Zvcig7bjxlLmxlbmd0aDspe3RoaXMuY01hcC5yZWFkQ2hhckNvZGUoZSxuLHIpO2NvbnN0IGE9ci5sZW5ndGg7dC5wdXNoKFtuLG4rYV0pLG4rPWF9fWVsc2UgZm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47KytyKXQucHVzaChbcixyKzFdKTtyZXR1cm4gdH1nZXQgZ2x5cGhDYWNoZVZhbHVlcygpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX2dseXBoQ2FjaGUpfWVuY29kZVN0cmluZyhlKXtjb25zdCB0PVtdLHI9W10sbj0oKT0+dC5sZW5ndGglMj09MSxhPXRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgaC5JZGVudGl0eVRvVW5pY29kZU1hcD9lPT50aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKGUpOmU9PnRoaXMudG9Vbmljb2RlLmNoYXJDb2RlT2YoU3RyaW5nLmZyb21Db2RlUG9pbnQoZSkpO2ZvcihsZXQgaT0wLHM9ZS5sZW5ndGg7aTxzO2krKyl7Y29uc3Qgcz1lLmNvZGVQb2ludEF0KGkpO2lmKHM+NTUyOTUmJihzPDU3MzQ0fHxzPjY1NTMzKSYmaSsrLHRoaXMudG9Vbmljb2RlKXtjb25zdCBlPWEocyk7aWYoLTEhPT1lKXtuKCkmJih0LnB1c2goci5qb2luKCIiKSksci5sZW5ndGg9MCk7Zm9yKGxldCB0PSh0aGlzLmNNYXA/dGhpcy5jTWFwLmdldENoYXJDb2RlTGVuZ3RoKGUpOjEpLTE7dD49MDt0LS0pci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZT4+OCp0JjI1NSkpO2NvbnRpbnVlfX1uKCl8fCh0LnB1c2goci5qb2luKCIiKSksci5sZW5ndGg9MCksci5wdXNoKFN0cmluZy5mcm9tQ29kZVBvaW50KHMpKX1yZXR1cm4gdC5wdXNoKHIuam9pbigiIikpLHR9fSx0LkVycm9yRm9udD1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmVycm9yPWUsdGhpcy5sb2FkZWROYW1lPSJnX2ZvbnRfZXJyb3IiLHRoaXMubWlzc2luZ0ZpbGU9ITB9Y2hhcnNUb0dseXBocygpe3JldHVybltdfWVuY29kZVN0cmluZyhlKXtyZXR1cm5bZV19ZXhwb3J0RGF0YSgpe3JldHVybntlcnJvcjp0aGlzLmVycm9yfX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ0ZGVG9wRGljdD10LkNGRlN0cmluZ3M9dC5DRkZTdGFuZGFyZFN0cmluZ3M9dC5DRkZQcml2YXRlRGljdD10LkNGRlBhcnNlcj10LkNGRkluZGV4PXQuQ0ZGSGVhZGVyPXQuQ0ZGRkRTZWxlY3Q9dC5DRkZDb21waWxlcj10LkNGRkNoYXJzZXQ9dC5DRkY9dm9pZCAwLHIoMTM5KSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNDQpLGE9cigxODYpLGk9cigxODcpO2NvbnN0IHM9WyIubm90ZGVmIiwic3BhY2UiLCJleGNsYW0iLCJxdW90ZWRibCIsIm51bWJlcnNpZ24iLCJkb2xsYXIiLCJwZXJjZW50IiwiYW1wZXJzYW5kIiwicXVvdGVyaWdodCIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3RlcmlzayIsInBsdXMiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiYXQiLCJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJQIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsImJyYWNrZXRsZWZ0IiwiYmFja3NsYXNoIiwiYnJhY2tldHJpZ2h0IiwiYXNjaWljaXJjdW0iLCJ1bmRlcnNjb3JlIiwicXVvdGVsZWZ0IiwiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsImgiLCJpIiwiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwicCIsInEiLCJyIiwicyIsInQiLCJ1IiwidiIsInciLCJ4IiwieSIsInoiLCJicmFjZWxlZnQiLCJiYXIiLCJicmFjZXJpZ2h0IiwiYXNjaWl0aWxkZSIsImV4Y2xhbWRvd24iLCJjZW50Iiwic3RlcmxpbmciLCJmcmFjdGlvbiIsInllbiIsImZsb3JpbiIsInNlY3Rpb24iLCJjdXJyZW5jeSIsInF1b3Rlc2luZ2xlIiwicXVvdGVkYmxsZWZ0IiwiZ3VpbGxlbW90bGVmdCIsImd1aWxzaW5nbGxlZnQiLCJndWlsc2luZ2xyaWdodCIsImZpIiwiZmwiLCJlbmRhc2giLCJkYWdnZXIiLCJkYWdnZXJkYmwiLCJwZXJpb2RjZW50ZXJlZCIsInBhcmFncmFwaCIsImJ1bGxldCIsInF1b3Rlc2luZ2xiYXNlIiwicXVvdGVkYmxiYXNlIiwicXVvdGVkYmxyaWdodCIsImd1aWxsZW1vdHJpZ2h0IiwiZWxsaXBzaXMiLCJwZXJ0aG91c2FuZCIsInF1ZXN0aW9uZG93biIsImdyYXZlIiwiYWN1dGUiLCJjaXJjdW1mbGV4IiwidGlsZGUiLCJtYWNyb24iLCJicmV2ZSIsImRvdGFjY2VudCIsImRpZXJlc2lzIiwicmluZyIsImNlZGlsbGEiLCJodW5nYXJ1bWxhdXQiLCJvZ29uZWsiLCJjYXJvbiIsImVtZGFzaCIsIkFFIiwib3JkZmVtaW5pbmUiLCJMc2xhc2giLCJPc2xhc2giLCJPRSIsIm9yZG1hc2N1bGluZSIsImFlIiwiZG90bGVzc2kiLCJsc2xhc2giLCJvc2xhc2giLCJvZSIsImdlcm1hbmRibHMiLCJvbmVzdXBlcmlvciIsImxvZ2ljYWxub3QiLCJtdSIsInRyYWRlbWFyayIsIkV0aCIsIm9uZWhhbGYiLCJwbHVzbWludXMiLCJUaG9ybiIsIm9uZXF1YXJ0ZXIiLCJkaXZpZGUiLCJicm9rZW5iYXIiLCJkZWdyZWUiLCJ0aG9ybiIsInRocmVlcXVhcnRlcnMiLCJ0d29zdXBlcmlvciIsInJlZ2lzdGVyZWQiLCJtaW51cyIsImV0aCIsIm11bHRpcGx5IiwidGhyZWVzdXBlcmlvciIsImNvcHlyaWdodCIsIkFhY3V0ZSIsIkFjaXJjdW1mbGV4IiwiQWRpZXJlc2lzIiwiQWdyYXZlIiwiQXJpbmciLCJBdGlsZGUiLCJDY2VkaWxsYSIsIkVhY3V0ZSIsIkVjaXJjdW1mbGV4IiwiRWRpZXJlc2lzIiwiRWdyYXZlIiwiSWFjdXRlIiwiSWNpcmN1bWZsZXgiLCJJZGllcmVzaXMiLCJJZ3JhdmUiLCJOdGlsZGUiLCJPYWN1dGUiLCJPY2lyY3VtZmxleCIsIk9kaWVyZXNpcyIsIk9ncmF2ZSIsIk90aWxkZSIsIlNjYXJvbiIsIlVhY3V0ZSIsIlVjaXJjdW1mbGV4IiwiVWRpZXJlc2lzIiwiVWdyYXZlIiwiWWFjdXRlIiwiWWRpZXJlc2lzIiwiWmNhcm9uIiwiYWFjdXRlIiwiYWNpcmN1bWZsZXgiLCJhZGllcmVzaXMiLCJhZ3JhdmUiLCJhcmluZyIsImF0aWxkZSIsImNjZWRpbGxhIiwiZWFjdXRlIiwiZWNpcmN1bWZsZXgiLCJlZGllcmVzaXMiLCJlZ3JhdmUiLCJpYWN1dGUiLCJpY2lyY3VtZmxleCIsImlkaWVyZXNpcyIsImlncmF2ZSIsIm50aWxkZSIsIm9hY3V0ZSIsIm9jaXJjdW1mbGV4Iiwib2RpZXJlc2lzIiwib2dyYXZlIiwib3RpbGRlIiwic2Nhcm9uIiwidWFjdXRlIiwidWNpcmN1bWZsZXgiLCJ1ZGllcmVzaXMiLCJ1Z3JhdmUiLCJ5YWN1dGUiLCJ5ZGllcmVzaXMiLCJ6Y2Fyb24iLCJleGNsYW1zbWFsbCIsIkh1bmdhcnVtbGF1dHNtYWxsIiwiZG9sbGFyb2xkc3R5bGUiLCJkb2xsYXJzdXBlcmlvciIsImFtcGVyc2FuZHNtYWxsIiwiQWN1dGVzbWFsbCIsInBhcmVubGVmdHN1cGVyaW9yIiwicGFyZW5yaWdodHN1cGVyaW9yIiwidHdvZG90ZW5sZWFkZXIiLCJvbmVkb3RlbmxlYWRlciIsInplcm9vbGRzdHlsZSIsIm9uZW9sZHN0eWxlIiwidHdvb2xkc3R5bGUiLCJ0aHJlZW9sZHN0eWxlIiwiZm91cm9sZHN0eWxlIiwiZml2ZW9sZHN0eWxlIiwic2l4b2xkc3R5bGUiLCJzZXZlbm9sZHN0eWxlIiwiZWlnaHRvbGRzdHlsZSIsIm5pbmVvbGRzdHlsZSIsImNvbW1hc3VwZXJpb3IiLCJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwicGVyaW9kc3VwZXJpb3IiLCJxdWVzdGlvbnNtYWxsIiwiYXN1cGVyaW9yIiwiYnN1cGVyaW9yIiwiY2VudHN1cGVyaW9yIiwiZHN1cGVyaW9yIiwiZXN1cGVyaW9yIiwiaXN1cGVyaW9yIiwibHN1cGVyaW9yIiwibXN1cGVyaW9yIiwibnN1cGVyaW9yIiwib3N1cGVyaW9yIiwicnN1cGVyaW9yIiwic3N1cGVyaW9yIiwidHN1cGVyaW9yIiwiZmYiLCJmZmkiLCJmZmwiLCJwYXJlbmxlZnRpbmZlcmlvciIsInBhcmVucmlnaHRpbmZlcmlvciIsIkNpcmN1bWZsZXhzbWFsbCIsImh5cGhlbnN1cGVyaW9yIiwiR3JhdmVzbWFsbCIsIkFzbWFsbCIsIkJzbWFsbCIsIkNzbWFsbCIsIkRzbWFsbCIsIkVzbWFsbCIsIkZzbWFsbCIsIkdzbWFsbCIsIkhzbWFsbCIsIklzbWFsbCIsIkpzbWFsbCIsIktzbWFsbCIsIkxzbWFsbCIsIk1zbWFsbCIsIk5zbWFsbCIsIk9zbWFsbCIsIlBzbWFsbCIsIlFzbWFsbCIsIlJzbWFsbCIsIlNzbWFsbCIsIlRzbWFsbCIsIlVzbWFsbCIsIlZzbWFsbCIsIldzbWFsbCIsIlhzbWFsbCIsIllzbWFsbCIsIlpzbWFsbCIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJUaWxkZXNtYWxsIiwiZXhjbGFtZG93bnNtYWxsIiwiY2VudG9sZHN0eWxlIiwiTHNsYXNoc21hbGwiLCJTY2Fyb25zbWFsbCIsIlpjYXJvbnNtYWxsIiwiRGllcmVzaXNzbWFsbCIsIkJyZXZlc21hbGwiLCJDYXJvbnNtYWxsIiwiRG90YWNjZW50c21hbGwiLCJNYWNyb25zbWFsbCIsImZpZ3VyZWRhc2giLCJoeXBoZW5pbmZlcmlvciIsIk9nb25la3NtYWxsIiwiUmluZ3NtYWxsIiwiQ2VkaWxsYXNtYWxsIiwicXVlc3Rpb25kb3duc21hbGwiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiemVyb3N1cGVyaW9yIiwiZm91cnN1cGVyaW9yIiwiZml2ZXN1cGVyaW9yIiwic2l4c3VwZXJpb3IiLCJzZXZlbnN1cGVyaW9yIiwiZWlnaHRzdXBlcmlvciIsIm5pbmVzdXBlcmlvciIsInplcm9pbmZlcmlvciIsIm9uZWluZmVyaW9yIiwidHdvaW5mZXJpb3IiLCJ0aHJlZWluZmVyaW9yIiwiZm91cmluZmVyaW9yIiwiZml2ZWluZmVyaW9yIiwic2l4aW5mZXJpb3IiLCJzZXZlbmluZmVyaW9yIiwiZWlnaHRpbmZlcmlvciIsIm5pbmVpbmZlcmlvciIsImNlbnRpbmZlcmlvciIsImRvbGxhcmluZmVyaW9yIiwicGVyaW9kaW5mZXJpb3IiLCJjb21tYWluZmVyaW9yIiwiQWdyYXZlc21hbGwiLCJBYWN1dGVzbWFsbCIsIkFjaXJjdW1mbGV4c21hbGwiLCJBdGlsZGVzbWFsbCIsIkFkaWVyZXNpc3NtYWxsIiwiQXJpbmdzbWFsbCIsIkFFc21hbGwiLCJDY2VkaWxsYXNtYWxsIiwiRWdyYXZlc21hbGwiLCJFYWN1dGVzbWFsbCIsIkVjaXJjdW1mbGV4c21hbGwiLCJFZGllcmVzaXNzbWFsbCIsIklncmF2ZXNtYWxsIiwiSWFjdXRlc21hbGwiLCJJY2lyY3VtZmxleHNtYWxsIiwiSWRpZXJlc2lzc21hbGwiLCJFdGhzbWFsbCIsIk50aWxkZXNtYWxsIiwiT2dyYXZlc21hbGwiLCJPYWN1dGVzbWFsbCIsIk9jaXJjdW1mbGV4c21hbGwiLCJPdGlsZGVzbWFsbCIsIk9kaWVyZXNpc3NtYWxsIiwiT0VzbWFsbCIsIk9zbGFzaHNtYWxsIiwiVWdyYXZlc21hbGwiLCJVYWN1dGVzbWFsbCIsIlVjaXJjdW1mbGV4c21hbGwiLCJVZGllcmVzaXNzbWFsbCIsIllhY3V0ZXNtYWxsIiwiVGhvcm5zbWFsbCIsIllkaWVyZXNpc3NtYWxsIiwiMDAxLjAwMCIsIjAwMS4wMDEiLCIwMDEuMDAyIiwiMDAxLjAwMyIsIkJsYWNrIiwiQm9sZCIsIkJvb2siLCJMaWdodCIsIk1lZGl1bSIsIlJlZ3VsYXIiLCJSb21hbiIsIlNlbWlib2xkIl07dC5DRkZTdGFuZGFyZFN0cmluZ3M9cztjb25zdCBvPVtudWxsLHtpZDoiaHN0ZW0iLG1pbjoyLHN0YWNrQ2xlYXJpbmc6ITAsc3RlbTohMH0sbnVsbCx7aWQ6InZzdGVtIixtaW46MixzdGFja0NsZWFyaW5nOiEwLHN0ZW06ITB9LHtpZDoidm1vdmV0byIsbWluOjEsc3RhY2tDbGVhcmluZzohMH0se2lkOiJybGluZXRvIixtaW46MixyZXNldFN0YWNrOiEwfSx7aWQ6ImhsaW5ldG8iLG1pbjoxLHJlc2V0U3RhY2s6ITB9LHtpZDoidmxpbmV0byIsbWluOjEscmVzZXRTdGFjazohMH0se2lkOiJycmN1cnZldG8iLG1pbjo2LHJlc2V0U3RhY2s6ITB9LG51bGwse2lkOiJjYWxsc3ViciIsbWluOjEsdW5kZWZTdGFjazohMH0se2lkOiJyZXR1cm4iLG1pbjowLHVuZGVmU3RhY2s6ITB9LG51bGwsbnVsbCx7aWQ6ImVuZGNoYXIiLG1pbjowLHN0YWNrQ2xlYXJpbmc6ITB9LG51bGwsbnVsbCxudWxsLHtpZDoiaHN0ZW1obSIsbWluOjIsc3RhY2tDbGVhcmluZzohMCxzdGVtOiEwfSx7aWQ6ImhpbnRtYXNrIixtaW46MCxzdGFja0NsZWFyaW5nOiEwfSx7aWQ6ImNudHJtYXNrIixtaW46MCxzdGFja0NsZWFyaW5nOiEwfSx7aWQ6InJtb3ZldG8iLG1pbjoyLHN0YWNrQ2xlYXJpbmc6ITB9LHtpZDoiaG1vdmV0byIsbWluOjEsc3RhY2tDbGVhcmluZzohMH0se2lkOiJ2c3RlbWhtIixtaW46MixzdGFja0NsZWFyaW5nOiEwLHN0ZW06ITB9LHtpZDoicmN1cnZlbGluZSIsbWluOjgscmVzZXRTdGFjazohMH0se2lkOiJybGluZWN1cnZlIixtaW46OCxyZXNldFN0YWNrOiEwfSx7aWQ6InZ2Y3VydmV0byIsbWluOjQscmVzZXRTdGFjazohMH0se2lkOiJoaGN1cnZldG8iLG1pbjo0LHJlc2V0U3RhY2s6ITB9LG51bGwse2lkOiJjYWxsZ3N1YnIiLG1pbjoxLHVuZGVmU3RhY2s6ITB9LHtpZDoidmhjdXJ2ZXRvIixtaW46NCxyZXNldFN0YWNrOiEwfSx7aWQ6Imh2Y3VydmV0byIsbWluOjQscmVzZXRTdGFjazohMH1dLGM9W251bGwsbnVsbCxudWxsLHtpZDoiYW5kIixtaW46MixzdGFja0RlbHRhOi0xfSx7aWQ6Im9yIixtaW46MixzdGFja0RlbHRhOi0xfSx7aWQ6Im5vdCIsbWluOjEsc3RhY2tEZWx0YTowfSxudWxsLG51bGwsbnVsbCx7aWQ6ImFicyIsbWluOjEsc3RhY2tEZWx0YTowfSx7aWQ6ImFkZCIsbWluOjIsc3RhY2tEZWx0YTotMSxzdGFja0ZuKGUsdCl7ZVt0LTJdPWVbdC0yXStlW3QtMV19fSx7aWQ6InN1YiIsbWluOjIsc3RhY2tEZWx0YTotMSxzdGFja0ZuKGUsdCl7ZVt0LTJdPWVbdC0yXS1lW3QtMV19fSx7aWQ6ImRpdiIsbWluOjIsc3RhY2tEZWx0YTotMSxzdGFja0ZuKGUsdCl7ZVt0LTJdPWVbdC0yXS9lW3QtMV19fSxudWxsLHtpZDoibmVnIixtaW46MSxzdGFja0RlbHRhOjAsc3RhY2tGbihlLHQpe2VbdC0xXT0tZVt0LTFdfX0se2lkOiJlcSIsbWluOjIsc3RhY2tEZWx0YTotMX0sbnVsbCxudWxsLHtpZDoiZHJvcCIsbWluOjEsc3RhY2tEZWx0YTotMX0sbnVsbCx7aWQ6InB1dCIsbWluOjIsc3RhY2tEZWx0YTotMn0se2lkOiJnZXQiLG1pbjoxLHN0YWNrRGVsdGE6MH0se2lkOiJpZmVsc2UiLG1pbjo0LHN0YWNrRGVsdGE6LTN9LHtpZDoicmFuZG9tIixtaW46MCxzdGFja0RlbHRhOjF9LHtpZDoibXVsIixtaW46MixzdGFja0RlbHRhOi0xLHN0YWNrRm4oZSx0KXtlW3QtMl09ZVt0LTJdKmVbdC0xXX19LG51bGwse2lkOiJzcXJ0IixtaW46MSxzdGFja0RlbHRhOjB9LHtpZDoiZHVwIixtaW46MSxzdGFja0RlbHRhOjF9LHtpZDoiZXhjaCIsbWluOjIsc3RhY2tEZWx0YTowfSx7aWQ6ImluZGV4IixtaW46MixzdGFja0RlbHRhOjB9LHtpZDoicm9sbCIsbWluOjMsc3RhY2tEZWx0YTotMn0sbnVsbCxudWxsLG51bGwse2lkOiJoZmxleCIsbWluOjcscmVzZXRTdGFjazohMH0se2lkOiJmbGV4IixtaW46MTMscmVzZXRTdGFjazohMH0se2lkOiJoZmxleDEiLG1pbjo5LHJlc2V0U3RhY2s6ITB9LHtpZDoiZmxleDEiLG1pbjoxMSxyZXNldFN0YWNrOiEwfV07dC5DRkZQYXJzZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuYnl0ZXM9ZS5nZXRCeXRlcygpLHRoaXMucHJvcGVydGllcz10LHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZD0hIXJ9cGFyc2UoKXtjb25zdCBlPXRoaXMucHJvcGVydGllcyx0PW5ldyBsO3RoaXMuY2ZmPXQ7Y29uc3Qgcj10aGlzLnBhcnNlSGVhZGVyKCksbj10aGlzLnBhcnNlSW5kZXgoci5lbmRQb3MpLGE9dGhpcy5wYXJzZUluZGV4KG4uZW5kUG9zKSxpPXRoaXMucGFyc2VJbmRleChhLmVuZFBvcykscz10aGlzLnBhcnNlSW5kZXgoaS5lbmRQb3MpLG89dGhpcy5wYXJzZURpY3QoYS5vYmouZ2V0KDApKSxjPXRoaXMuY3JlYXRlRGljdChwLG8sdC5zdHJpbmdzKTt0LmhlYWRlcj1yLm9iaix0Lm5hbWVzPXRoaXMucGFyc2VOYW1lSW5kZXgobi5vYmopLHQuc3RyaW5ncz10aGlzLnBhcnNlU3RyaW5nSW5kZXgoaS5vYmopLHQudG9wRGljdD1jLHQuZ2xvYmFsU3VickluZGV4PXMub2JqLHRoaXMucGFyc2VQcml2YXRlRGljdCh0LnRvcERpY3QpLHQuaXNDSURGb250PWMuaGFzTmFtZSgiUk9TIik7Y29uc3QgaD1jLmdldEJ5TmFtZSgiQ2hhclN0cmluZ3MiKSx1PXRoaXMucGFyc2VJbmRleChoKS5vYmosZD1jLmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpO2QmJihlLmZvbnRNYXRyaXg9ZCk7Y29uc3QgZj1jLmdldEJ5TmFtZSgiRm9udEJCb3giKTtsZXQgZyxtO2lmKGYmJihlLmFzY2VudD1NYXRoLm1heChmWzNdLGZbMV0pLGUuZGVzY2VudD1NYXRoLm1pbihmWzFdLGZbM10pLGUuYXNjZW50U2NhbGVkPSEwKSx0LmlzQ0lERm9udCl7Y29uc3QgZT10aGlzLnBhcnNlSW5kZXgoYy5nZXRCeU5hbWUoIkZEQXJyYXkiKSkub2JqO2ZvcihsZXQgcj0wLG49ZS5jb3VudDtyPG47KytyKXtjb25zdCBuPWUuZ2V0KHIpLGE9dGhpcy5jcmVhdGVEaWN0KHAsdGhpcy5wYXJzZURpY3QobiksdC5zdHJpbmdzKTt0aGlzLnBhcnNlUHJpdmF0ZURpY3QoYSksdC5mZEFycmF5LnB1c2goYSl9bT1udWxsLGc9dGhpcy5wYXJzZUNoYXJzZXRzKGMuZ2V0QnlOYW1lKCJjaGFyc2V0IiksdS5jb3VudCx0LnN0cmluZ3MsITApLHQuZmRTZWxlY3Q9dGhpcy5wYXJzZUZEU2VsZWN0KGMuZ2V0QnlOYW1lKCJGRFNlbGVjdCIpLHUuY291bnQpfWVsc2UgZz10aGlzLnBhcnNlQ2hhcnNldHMoYy5nZXRCeU5hbWUoImNoYXJzZXQiKSx1LmNvdW50LHQuc3RyaW5ncywhMSksbT10aGlzLnBhcnNlRW5jb2RpbmcoYy5nZXRCeU5hbWUoIkVuY29kaW5nIiksZSx0LnN0cmluZ3MsZy5jaGFyc2V0KTt0LmNoYXJzZXQ9Zyx0LmVuY29kaW5nPW07Y29uc3QgYj10aGlzLnBhcnNlQ2hhclN0cmluZ3Moe2NoYXJTdHJpbmdzOnUsbG9jYWxTdWJySW5kZXg6Yy5wcml2YXRlRGljdC5zdWJyc0luZGV4LGdsb2JhbFN1YnJJbmRleDpzLm9iaixmZFNlbGVjdDp0LmZkU2VsZWN0LGZkQXJyYXk6dC5mZEFycmF5LHByaXZhdGVEaWN0OmMucHJpdmF0ZURpY3R9KTtyZXR1cm4gdC5jaGFyU3RyaW5ncz1iLmNoYXJTdHJpbmdzLHQuc2VhY3M9Yi5zZWFjcyx0LndpZHRocz1iLndpZHRocyx0fXBhcnNlSGVhZGVyKCl7bGV0IGU9dGhpcy5ieXRlcztjb25zdCB0PWUubGVuZ3RoO2xldCByPTA7Zm9yKDtyPHQmJjEhPT1lW3JdOykrK3I7aWYocj49dCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiSW52YWxpZCBDRkYgaGVhZGVyIik7MCE9PXImJigoMCxuLmluZm8pKCJjZmYgZGF0YSBpcyBzaGlmdGVkIiksZT1lLnN1YmFycmF5KHIpLHRoaXMuYnl0ZXM9ZSk7Y29uc3QgYT1lWzBdLGk9ZVsxXSxzPWVbMl0sbz1lWzNdO3JldHVybntvYmo6bmV3IGgoYSxpLHMsbyksZW5kUG9zOnN9fXBhcnNlRGljdChlKXtsZXQgdD0wO2Z1bmN0aW9uIHIoKXtsZXQgcj1lW3QrK107cmV0dXJuIDMwPT09cj9mdW5jdGlvbigpe2xldCByPSIiO2NvbnN0IG49WyIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiLiIsIkUiLCJFLSIsbnVsbCwiLSJdLGE9ZS5sZW5ndGg7Zm9yKDt0PGE7KXtjb25zdCBhPWVbdCsrXSxpPWE+PjQscz0xNSZhO2lmKDE1PT09aSlicmVhaztpZihyKz1uW2ldLDE1PT09cylicmVhaztyKz1uW3NdfXJldHVybiBwYXJzZUZsb2F0KHIpfSgpOjI4PT09cj8ocj1lW3QrK10scj0ocjw8MjR8ZVt0KytdPDwxNik+PjE2LHIpOjI5PT09cj8ocj1lW3QrK10scj1yPDw4fGVbdCsrXSxyPXI8PDh8ZVt0KytdLHI9cjw8OHxlW3QrK10scik6cj49MzImJnI8PTI0Nj9yLTEzOTpyPj0yNDcmJnI8PTI1MD8yNTYqKHItMjQ3KStlW3QrK10rMTA4OnI+PTI1MSYmcjw9MjU0Py0yNTYqKHItMjUxKS1lW3QrK10tMTA4OigoMCxuLndhcm4pKCdDRkZQYXJzZXJfcGFyc2VEaWN0OiAiJytyKyciIGlzIGEgcmVzZXJ2ZWQgY29tbWFuZC4nKSxOYU4pfWxldCBhPVtdO2NvbnN0IGk9W107dD0wO2NvbnN0IHM9ZS5sZW5ndGg7Zm9yKDt0PHM7KXtsZXQgbj1lW3RdO248PTIxPygxMj09PW4mJihuPW48PDh8ZVsrK3RdKSxpLnB1c2goW24sYV0pLGE9W10sKyt0KTphLnB1c2gocigpKX1yZXR1cm4gaX1wYXJzZUluZGV4KGUpe2NvbnN0IHQ9bmV3IGQscj10aGlzLmJ5dGVzLG49cltlKytdPDw4fHJbZSsrXSxhPVtdO2xldCBpLHMsbz1lO2lmKDAhPT1uKXtjb25zdCB0PXJbZSsrXSxjPWUrKG4rMSkqdC0xO2ZvcihpPTAscz1uKzE7aTxzOysraSl7bGV0IG49MDtmb3IobGV0IGE9MDthPHQ7KythKW48PD04LG4rPXJbZSsrXTthLnB1c2goYytuKX1vPWFbbl19Zm9yKGk9MCxzPWEubGVuZ3RoLTE7aTxzOysraSl7Y29uc3QgZT1hW2ldLG49YVtpKzFdO3QuYWRkKHIuc3ViYXJyYXkoZSxuKSl9cmV0dXJue29iajp0LGVuZFBvczpvfX1wYXJzZU5hbWVJbmRleChlKXtjb25zdCB0PVtdO2ZvcihsZXQgcj0wLGE9ZS5jb3VudDtyPGE7KytyKXtjb25zdCBhPWUuZ2V0KHIpO3QucHVzaCgoMCxuLmJ5dGVzVG9TdHJpbmcpKGEpKX1yZXR1cm4gdH1wYXJzZVN0cmluZ0luZGV4KGUpe2NvbnN0IHQ9bmV3IHU7Zm9yKGxldCByPTAsYT1lLmNvdW50O3I8YTsrK3Ipe2NvbnN0IGE9ZS5nZXQocik7dC5hZGQoKDAsbi5ieXRlc1RvU3RyaW5nKShhKSl9cmV0dXJuIHR9Y3JlYXRlRGljdChlLHQscil7Y29uc3Qgbj1uZXcgZShyKTtmb3IoY29uc3RbZSxyXW9mIHQpbi5zZXRCeUtleShlLHIpO3JldHVybiBufXBhcnNlQ2hhclN0cmluZyhlLHQscixhKXtpZighdHx8ZS5jYWxsRGVwdGg+MTApcmV0dXJuITE7bGV0IGk9ZS5zdGFja1NpemU7Y29uc3Qgcz1lLnN0YWNrO2xldCBsPXQubGVuZ3RoO2ZvcihsZXQgaD0wO2g8bDspe2NvbnN0IHU9dFtoKytdO2xldCBkPW51bGw7aWYoMTI9PT11KXtjb25zdCBlPXRbaCsrXTswPT09ZT8odFtoLTJdPTEzOSx0W2gtMV09MjIsaT0wKTpkPWNbZV19ZWxzZSBpZigyOD09PXUpc1tpXT0odFtoXTw8MjR8dFtoKzFdPDwxNik+PjE2LGgrPTIsaSsrO2Vsc2UgaWYoMTQ9PT11KXtpZihpPj00JiYoaS09NCx0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQpKXJldHVybiBlLnNlYWM9cy5zbGljZShpLGkrNCksITE7ZD1vW3VdfWVsc2UgaWYodT49MzImJnU8PTI0NilzW2ldPXUtMTM5LGkrKztlbHNlIGlmKHU+PTI0NyYmdTw9MjU0KXNbaV09dTwyNTE/KHUtMjQ3PDw4KSt0W2hdKzEwODotKHUtMjUxPDw4KS10W2hdLTEwOCxoKyssaSsrO2Vsc2UgaWYoMjU1PT09dSlzW2ldPSh0W2hdPDwyNHx0W2grMV08PDE2fHRbaCsyXTw8OHx0W2grM10pLzY1NTM2LGgrPTQsaSsrO2Vsc2UgaWYoMTk9PT11fHwyMD09PXUpe2lmKGUuaGludHMrPWk+PjEsMD09PWUuaGludHMpe3QuY29weVdpdGhpbihoLTEsaCwtMSksaC09MSxsLT0xO2NvbnRpbnVlfWgrPWUuaGludHMrNz4+MyxpJT0yLGQ9b1t1XX1lbHNle2lmKDEwPT09dXx8Mjk9PT11KXtjb25zdCB0PTEwPT09dT9yOmE7aWYoIXQpcmV0dXJuIGQ9b1t1XSwoMCxuLndhcm4pKCJNaXNzaW5nIHN1YnJzSW5kZXggZm9yICIrZC5pZCksITE7bGV0IGM9MzI3Njg7dC5jb3VudDwxMjQwP2M9MTA3OnQuY291bnQ8MzM5MDAmJihjPTExMzEpO2NvbnN0IGw9c1stLWldK2M7aWYobDwwfHxsPj10LmNvdW50fHxpc05hTihsKSlyZXR1cm4gZD1vW3VdLCgwLG4ud2FybikoIk91dCBvZiBib3VuZHMgc3VickluZGV4IGZvciAiK2QuaWQpLCExO2lmKGUuc3RhY2tTaXplPWksZS5jYWxsRGVwdGgrKywhdGhpcy5wYXJzZUNoYXJTdHJpbmcoZSx0LmdldChsKSxyLGEpKXJldHVybiExO2UuY2FsbERlcHRoLS0saT1lLnN0YWNrU2l6ZTtjb250aW51ZX1pZigxMT09PXUpcmV0dXJuIGUuc3RhY2tTaXplPWksITA7aWYoMD09PXUmJmg9PT10Lmxlbmd0aCl0W2gtMV09MTQsZD1vWzE0XTtlbHNle2lmKDk9PT11KXt0LmNvcHlXaXRoaW4oaC0xLGgsLTEpLGgtPTEsbC09MTtjb250aW51ZX1kPW9bdV19fWlmKGQpe2lmKGQuc3RlbSYmKGUuaGludHMrPWk+PjEsMz09PXV8fDIzPT09dT9lLmhhc1ZTdGVtcz0hMDohZS5oYXNWU3RlbXN8fDEhPT11JiYxOCE9PXV8fCgoMCxuLndhcm4pKCJDRkYgc3RlbSBoaW50cyBhcmUgaW4gd3Jvbmcgb3JkZXIiKSx0W2gtMV09MT09PXU/MzoyMykpLCJtaW4iaW4gZCYmIWUudW5kZWZTdGFjayYmaTxkLm1pbilyZXR1cm4oMCxuLndhcm4pKCJOb3QgZW5vdWdoIHBhcmFtZXRlcnMgZm9yICIrZC5pZCsiOyBhY3R1YWw6ICIraSsiLCBleHBlY3RlZDogIitkLm1pbiksMD09PWkmJih0W2gtMV09MTQsITApO2UuZmlyc3RTdGFja0NsZWFyaW5nJiZkLnN0YWNrQ2xlYXJpbmcmJihlLmZpcnN0U3RhY2tDbGVhcmluZz0hMSxpLT1kLm1pbixpPj0yJiZkLnN0ZW0/aSU9MjppPjEmJigwLG4ud2FybikoIkZvdW5kIHRvbyBtYW55IHBhcmFtZXRlcnMgZm9yIHN0YWNrLWNsZWFyaW5nIGNvbW1hbmQiKSxpPjAmJihlLndpZHRoPXNbaS0xXSkpLCJzdGFja0RlbHRhImluIGQ/KCJzdGFja0ZuImluIGQmJmQuc3RhY2tGbihzLGkpLGkrPWQuc3RhY2tEZWx0YSk6ZC5zdGFja0NsZWFyaW5nP2k9MDpkLnJlc2V0U3RhY2s/KGk9MCxlLnVuZGVmU3RhY2s9ITEpOmQudW5kZWZTdGFjayYmKGk9MCxlLnVuZGVmU3RhY2s9ITAsZS5maXJzdFN0YWNrQ2xlYXJpbmc9ITEpfX1yZXR1cm4gbDx0Lmxlbmd0aCYmdC5maWxsKDE0LGwpLGUuc3RhY2tTaXplPWksITB9cGFyc2VDaGFyU3RyaW5ncyhlKXtsZXR7Y2hhclN0cmluZ3M6dCxsb2NhbFN1YnJJbmRleDpyLGdsb2JhbFN1YnJJbmRleDphLGZkU2VsZWN0OmksZmRBcnJheTpzLHByaXZhdGVEaWN0Om99PWU7Y29uc3QgYz1bXSxsPVtdLGg9dC5jb3VudDtmb3IobGV0IGU9MDtlPGg7ZSsrKXtjb25zdCBoPXQuZ2V0KGUpLHU9e2NhbGxEZXB0aDowLHN0YWNrU2l6ZTowLHN0YWNrOltdLHVuZGVmU3RhY2s6ITAsaGludHM6MCxmaXJzdFN0YWNrQ2xlYXJpbmc6ITAsc2VhYzpudWxsLHdpZHRoOm51bGwsaGFzVlN0ZW1zOiExfTtsZXQgZD0hMCxmPW51bGwsZz1vO2lmKGkmJnMubGVuZ3RoKXtjb25zdCB0PWkuZ2V0RkRJbmRleChlKTstMT09PXQmJigoMCxuLndhcm4pKCJHbHlwaCBpbmRleCBpcyBub3QgaW4gZmQgc2VsZWN0LiIpLGQ9ITEpLHQ+PXMubGVuZ3RoJiYoKDAsbi53YXJuKSgiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguIiksZD0hMSksZCYmKGc9c1t0XS5wcml2YXRlRGljdCxmPWcuc3VicnNJbmRleCl9ZWxzZSByJiYoZj1yKTtpZihkJiYoZD10aGlzLnBhcnNlQ2hhclN0cmluZyh1LGgsZixhKSksbnVsbCE9PXUud2lkdGgpe2NvbnN0IHQ9Zy5nZXRCeU5hbWUoIm5vbWluYWxXaWR0aFgiKTtsW2VdPXQrdS53aWR0aH1lbHNle2NvbnN0IHQ9Zy5nZXRCeU5hbWUoImRlZmF1bHRXaWR0aFgiKTtsW2VdPXR9bnVsbCE9PXUuc2VhYyYmKGNbZV09dS5zZWFjKSxkfHx0LnNldChlLG5ldyBVaW50OEFycmF5KFsxNF0pKX1yZXR1cm57Y2hhclN0cmluZ3M6dCxzZWFjczpjLHdpZHRoczpsfX1lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KGUpe2NvbnN0IHQ9dGhpcy5jcmVhdGVEaWN0KGIsW10sZS5zdHJpbmdzKTtlLnNldEJ5S2V5KDE4LFswLDBdKSxlLnByaXZhdGVEaWN0PXR9cGFyc2VQcml2YXRlRGljdChlKXtpZighZS5oYXNOYW1lKCJQcml2YXRlIikpcmV0dXJuIHZvaWQgdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KGUpO2NvbnN0IHQ9ZS5nZXRCeU5hbWUoIlByaXZhdGUiKTtpZighQXJyYXkuaXNBcnJheSh0KXx8MiE9PXQubGVuZ3RoKXJldHVybiB2b2lkIGUucmVtb3ZlQnlOYW1lKCJQcml2YXRlIik7Y29uc3Qgcj10WzBdLG49dFsxXTtpZigwPT09cnx8bj49dGhpcy5ieXRlcy5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KGUpO2NvbnN0IGE9bityLGk9dGhpcy5ieXRlcy5zdWJhcnJheShuLGEpLHM9dGhpcy5wYXJzZURpY3QoaSksbz10aGlzLmNyZWF0ZURpY3QoYixzLGUuc3RyaW5ncyk7aWYoZS5wcml2YXRlRGljdD1vLDA9PT1vLmdldEJ5TmFtZSgiRXhwYW5zaW9uRmFjdG9yIikmJm8uc2V0QnlOYW1lKCJFeHBhbnNpb25GYWN0b3IiLC4wNiksIW8uZ2V0QnlOYW1lKCJTdWJycyIpKXJldHVybjtjb25zdCBjPW8uZ2V0QnlOYW1lKCJTdWJycyIpLGw9bitjO2lmKDA9PT1jfHxsPj10aGlzLmJ5dGVzLmxlbmd0aClyZXR1cm4gdm9pZCB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkoZSk7Y29uc3QgaD10aGlzLnBhcnNlSW5kZXgobCk7by5zdWJyc0luZGV4PWgub2JqfXBhcnNlQ2hhcnNldHMoZSx0LHIsaSl7aWYoMD09PWUpcmV0dXJuIG5ldyB3KCEwLHkuSVNPX0FET0JFLGEuSVNPQWRvYmVDaGFyc2V0KTtpZigxPT09ZSlyZXR1cm4gbmV3IHcoITAseS5FWFBFUlQsYS5FeHBlcnRDaGFyc2V0KTtpZigyPT09ZSlyZXR1cm4gbmV3IHcoITAseS5FWFBFUlRfU1VCU0VULGEuRXhwZXJ0U3Vic2V0Q2hhcnNldCk7Y29uc3Qgcz10aGlzLmJ5dGVzLG89ZSxjPXNbZSsrXSxsPVtpPzA6Ii5ub3RkZWYiXTtsZXQgaCx1LGQ7c3dpdGNoKHQtPTEsYyl7Y2FzZSAwOmZvcihkPTA7ZDx0O2QrKyloPXNbZSsrXTw8OHxzW2UrK10sbC5wdXNoKGk/aDpyLmdldChoKSk7YnJlYWs7Y2FzZSAxOmZvcig7bC5sZW5ndGg8PXQ7KWZvcihoPXNbZSsrXTw8OHxzW2UrK10sdT1zW2UrK10sZD0wO2Q8PXU7ZCsrKWwucHVzaChpP2grKzpyLmdldChoKyspKTticmVhaztjYXNlIDI6Zm9yKDtsLmxlbmd0aDw9dDspZm9yKGg9c1tlKytdPDw4fHNbZSsrXSx1PXNbZSsrXTw8OHxzW2UrK10sZD0wO2Q8PXU7ZCsrKWwucHVzaChpP2grKzpyLmdldChoKyspKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmtub3duIGNoYXJzZXQgZm9ybWF0Iil9Y29uc3QgZj1lLGc9cy5zdWJhcnJheShvLGYpO3JldHVybiBuZXcgdyghMSxjLGwsZyl9cGFyc2VFbmNvZGluZyhlLHQscixhKXtjb25zdCBzPU9iamVjdC5jcmVhdGUobnVsbCksbz10aGlzLmJ5dGVzO2xldCBjLGwsaCx1PSExLGQ9bnVsbDtpZigwPT09ZXx8MT09PWUpe3U9ITAsYz1lO2NvbnN0IHQ9ZT9pLkV4cGVydEVuY29kaW5nOmkuU3RhbmRhcmRFbmNvZGluZztmb3IobD0wLGg9YS5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgZT10LmluZGV4T2YoYVtsXSk7LTEhPT1lJiYoc1tlXT1sKX19ZWxzZXtjb25zdCB0PWU7c3dpdGNoKGM9b1tlKytdLDEyNyZjKXtjYXNlIDA6Y29uc3QgdD1vW2UrK107Zm9yKGw9MTtsPD10O2wrKylzW29bZSsrXV09bDticmVhaztjYXNlIDE6Y29uc3Qgcj1vW2UrK107bGV0IGE9MTtmb3IobD0wO2w8cjtsKyspe2NvbnN0IHQ9b1tlKytdLHI9b1tlKytdO2ZvcihsZXQgZT10O2U8PXQrcjtlKyspc1tlXT1hKyt9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiVW5rbm93biBlbmNvZGluZyBmb3JtYXQ6ICIuY29uY2F0KGMsIiBpbiBDRkYiKSl9Y29uc3QgaT1lOzEyOCZjJiYob1t0XSY9MTI3LGZ1bmN0aW9uKCl7Y29uc3QgdD1vW2UrK107Zm9yKGw9MDtsPHQ7bCsrKXtjb25zdCB0PW9bZSsrXSxuPShvW2UrK108PDgpKygyNTUmb1tlKytdKTtzW3RdPWEuaW5kZXhPZihyLmdldChuKSl9fSgpKSxkPW8uc3ViYXJyYXkodCxpKX1yZXR1cm4gYyY9MTI3LG5ldyB2KHUsYyxzLGQpfXBhcnNlRkRTZWxlY3QoZSx0KXtjb25zdCByPXRoaXMuYnl0ZXMsYT1yW2UrK10saT1bXTtsZXQgcztzd2l0Y2goYSl7Y2FzZSAwOmZvcihzPTA7czx0Oysrcyl7Y29uc3QgdD1yW2UrK107aS5wdXNoKHQpfWJyZWFrO2Nhc2UgMzpjb25zdCBvPXJbZSsrXTw8OHxyW2UrK107Zm9yKHM9MDtzPG87KytzKXtsZXQgdD1yW2UrK108PDh8cltlKytdOzA9PT1zJiYwIT09dCYmKCgwLG4ud2FybikoInBhcnNlRkRTZWxlY3Q6IFRoZSBmaXJzdCByYW5nZSBtdXN0IGhhdmUgYSBmaXJzdCBHSUQgb2YgMCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4iKSx0PTApO2NvbnN0IGE9cltlKytdLG89cltlXTw8OHxyW2UrMV07Zm9yKGxldCBlPXQ7ZTxvOysrZSlpLnB1c2goYSl9ZSs9MjticmVhaztkZWZhdWx0OnRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdwYXJzZUZEU2VsZWN0OiBVbmtub3duIGZvcm1hdCAiJy5jb25jYXQoYSwnIi4nKSl9aWYoaS5sZW5ndGghPT10KXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJwYXJzZUZEU2VsZWN0OiBJbnZhbGlkIGZvbnQgZGF0YS4iKTtyZXR1cm4gbmV3IHgoYSxpKX19O2NsYXNzIGx7Y29uc3RydWN0b3IoKXt0aGlzLmhlYWRlcj1udWxsLHRoaXMubmFtZXM9W10sdGhpcy50b3BEaWN0PW51bGwsdGhpcy5zdHJpbmdzPW5ldyB1LHRoaXMuZ2xvYmFsU3VickluZGV4PW51bGwsdGhpcy5lbmNvZGluZz1udWxsLHRoaXMuY2hhcnNldD1udWxsLHRoaXMuY2hhclN0cmluZ3M9bnVsbCx0aGlzLmZkQXJyYXk9W10sdGhpcy5mZFNlbGVjdD1udWxsLHRoaXMuaXNDSURGb250PSExfWR1cGxpY2F0ZUZpcnN0R2x5cGgoKXtpZih0aGlzLmNoYXJTdHJpbmdzLmNvdW50Pj02NTUzNSlyZXR1cm4gdm9pZCgwLG4ud2FybikoIk5vdCBlbm91Z2ggc3BhY2UgaW4gY2hhcnN0cmluZ3MgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLiIpO2NvbnN0IGU9dGhpcy5jaGFyU3RyaW5ncy5nZXQoMCk7dGhpcy5jaGFyU3RyaW5ncy5hZGQoZSksdGhpcy5pc0NJREZvbnQmJnRoaXMuZmRTZWxlY3QuZmRTZWxlY3QucHVzaCh0aGlzLmZkU2VsZWN0LmZkU2VsZWN0WzBdKX1oYXNHbHlwaElkKGUpe3JldHVybiEoZTwwfHxlPj10aGlzLmNoYXJTdHJpbmdzLmNvdW50KSYmdGhpcy5jaGFyU3RyaW5ncy5nZXQoZSkubGVuZ3RoPjB9fXQuQ0ZGPWw7Y2xhc3MgaHtjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLm1ham9yPWUsdGhpcy5taW5vcj10LHRoaXMuaGRyU2l6ZT1yLHRoaXMub2ZmU2l6ZT1ufX10LkNGRkhlYWRlcj1oO2NsYXNzIHV7Y29uc3RydWN0b3IoKXt0aGlzLnN0cmluZ3M9W119Z2V0KGUpe3JldHVybiBlPj0wJiZlPD0zOTA/c1tlXTplLTM5MTw9dGhpcy5zdHJpbmdzLmxlbmd0aD90aGlzLnN0cmluZ3NbZS0zOTFdOnNbMF19Z2V0U0lEKGUpe2xldCB0PXMuaW5kZXhPZihlKTtyZXR1cm4tMSE9PXQ/dDoodD10aGlzLnN0cmluZ3MuaW5kZXhPZihlKSwtMSE9PXQ/dCszOTE6LTEpfWFkZChlKXt0aGlzLnN0cmluZ3MucHVzaChlKX1nZXQgY291bnQoKXtyZXR1cm4gdGhpcy5zdHJpbmdzLmxlbmd0aH19dC5DRkZTdHJpbmdzPXU7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe3RoaXMub2JqZWN0cz1bXSx0aGlzLmxlbmd0aD0wfWFkZChlKXt0aGlzLmxlbmd0aCs9ZS5sZW5ndGgsdGhpcy5vYmplY3RzLnB1c2goZSl9c2V0KGUsdCl7dGhpcy5sZW5ndGgrPXQubGVuZ3RoLXRoaXMub2JqZWN0c1tlXS5sZW5ndGgsdGhpcy5vYmplY3RzW2VdPXR9Z2V0KGUpe3JldHVybiB0aGlzLm9iamVjdHNbZV19Z2V0IGNvdW50KCl7cmV0dXJuIHRoaXMub2JqZWN0cy5sZW5ndGh9fXQuQ0ZGSW5kZXg9ZDtjbGFzcyBme2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5rZXlUb05hbWVNYXA9ZS5rZXlUb05hbWVNYXAsdGhpcy5uYW1lVG9LZXlNYXA9ZS5uYW1lVG9LZXlNYXAsdGhpcy5kZWZhdWx0cz1lLmRlZmF1bHRzLHRoaXMudHlwZXM9ZS50eXBlcyx0aGlzLm9wY29kZXM9ZS5vcGNvZGVzLHRoaXMub3JkZXI9ZS5vcmRlcix0aGlzLnN0cmluZ3M9dCx0aGlzLnZhbHVlcz1PYmplY3QuY3JlYXRlKG51bGwpfXNldEJ5S2V5KGUsdCl7aWYoIShlIGluIHRoaXMua2V5VG9OYW1lTWFwKSlyZXR1cm4hMTtpZigwPT09dC5sZW5ndGgpcmV0dXJuITA7Zm9yKGNvbnN0IHIgb2YgdClpZihpc05hTihyKSlyZXR1cm4oMCxuLndhcm4pKCdJbnZhbGlkIENGRkRpY3QgdmFsdWU6ICInLmNvbmNhdCh0LCciIGZvciBrZXkgIicpLmNvbmNhdChlLCciLicpKSwhMDtjb25zdCByPXRoaXMudHlwZXNbZV07cmV0dXJuIm51bSIhPT1yJiYic2lkIiE9PXImJiJvZmZzZXQiIT09cnx8KHQ9dFswXSksdGhpcy52YWx1ZXNbZV09dCwhMH1zZXRCeU5hbWUoZSx0KXtpZighKGUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdJbnZhbGlkIGRpY3Rpb25hcnkgbmFtZSAiJy5jb25jYXQoZSwnIicpKTt0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtlXV09dH1oYXNOYW1lKGUpe3JldHVybiB0aGlzLm5hbWVUb0tleU1hcFtlXWluIHRoaXMudmFsdWVzfWdldEJ5TmFtZShlKXtpZighKGUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIGRpY3Rpb25hcnkgbmFtZSAiLmNvbmNhdChlLCciJykpO2NvbnN0IHQ9dGhpcy5uYW1lVG9LZXlNYXBbZV07cmV0dXJuIHQgaW4gdGhpcy52YWx1ZXM/dGhpcy52YWx1ZXNbdF06dGhpcy5kZWZhdWx0c1t0XX1yZW1vdmVCeU5hbWUoZSl7ZGVsZXRlIHRoaXMudmFsdWVzW3RoaXMubmFtZVRvS2V5TWFwW2VdXX1zdGF0aWMgY3JlYXRlVGFibGVzKGUpe2NvbnN0IHQ9e2tleVRvTmFtZU1hcDp7fSxuYW1lVG9LZXlNYXA6e30sZGVmYXVsdHM6e30sdHlwZXM6e30sb3Bjb2Rlczp7fSxvcmRlcjpbXX07Zm9yKGNvbnN0IHIgb2YgZSl7Y29uc3QgZT1BcnJheS5pc0FycmF5KHJbMF0pPyhyWzBdWzBdPDw4KStyWzBdWzFdOnJbMF07dC5rZXlUb05hbWVNYXBbZV09clsxXSx0Lm5hbWVUb0tleU1hcFtyWzFdXT1lLHQudHlwZXNbZV09clsyXSx0LmRlZmF1bHRzW2VdPXJbM10sdC5vcGNvZGVzW2VdPUFycmF5LmlzQXJyYXkoclswXSk/clswXTpbclswXV0sdC5vcmRlci5wdXNoKGUpfXJldHVybiB0fX1jb25zdCBnPVtbWzEyLDMwXSwiUk9TIixbInNpZCIsInNpZCIsIm51bSJdLG51bGxdLFtbMTIsMjBdLCJTeW50aGV0aWNCYXNlIiwibnVtIixudWxsXSxbMCwidmVyc2lvbiIsInNpZCIsbnVsbF0sWzEsIk5vdGljZSIsInNpZCIsbnVsbF0sW1sxMiwwXSwiQ29weXJpZ2h0Iiwic2lkIixudWxsXSxbMiwiRnVsbE5hbWUiLCJzaWQiLG51bGxdLFszLCJGYW1pbHlOYW1lIiwic2lkIixudWxsXSxbNCwiV2VpZ2h0Iiwic2lkIixudWxsXSxbWzEyLDFdLCJpc0ZpeGVkUGl0Y2giLCJudW0iLDBdLFtbMTIsMl0sIkl0YWxpY0FuZ2xlIiwibnVtIiwwXSxbWzEyLDNdLCJVbmRlcmxpbmVQb3NpdGlvbiIsIm51bSIsLTEwMF0sW1sxMiw0XSwiVW5kZXJsaW5lVGhpY2tuZXNzIiwibnVtIiw1MF0sW1sxMiw1XSwiUGFpbnRUeXBlIiwibnVtIiwwXSxbWzEyLDZdLCJDaGFyc3RyaW5nVHlwZSIsIm51bSIsMl0sW1sxMiw3XSwiRm9udE1hdHJpeCIsWyJudW0iLCJudW0iLCJudW0iLCJudW0iLCJudW0iLCJudW0iXSxbLjAwMSwwLDAsLjAwMSwwLDBdXSxbMTMsIlVuaXF1ZUlEIiwibnVtIixudWxsXSxbNSwiRm9udEJCb3giLFsibnVtIiwibnVtIiwibnVtIiwibnVtIl0sWzAsMCwwLDBdXSxbWzEyLDhdLCJTdHJva2VXaWR0aCIsIm51bSIsMF0sWzE0LCJYVUlEIiwiYXJyYXkiLG51bGxdLFsxNSwiY2hhcnNldCIsIm9mZnNldCIsMF0sWzE2LCJFbmNvZGluZyIsIm9mZnNldCIsMF0sWzE3LCJDaGFyU3RyaW5ncyIsIm9mZnNldCIsMF0sWzE4LCJQcml2YXRlIixbIm9mZnNldCIsIm9mZnNldCJdLG51bGxdLFtbMTIsMjFdLCJQb3N0U2NyaXB0Iiwic2lkIixudWxsXSxbWzEyLDIyXSwiQmFzZUZvbnROYW1lIiwic2lkIixudWxsXSxbWzEyLDIzXSwiQmFzZUZvbnRCbGVuZCIsImRlbHRhIixudWxsXSxbWzEyLDMxXSwiQ0lERm9udFZlcnNpb24iLCJudW0iLDBdLFtbMTIsMzJdLCJDSURGb250UmV2aXNpb24iLCJudW0iLDBdLFtbMTIsMzNdLCJDSURGb250VHlwZSIsIm51bSIsMF0sW1sxMiwzNF0sIkNJRENvdW50IiwibnVtIiw4NzIwXSxbWzEyLDM1XSwiVUlEQmFzZSIsIm51bSIsbnVsbF0sW1sxMiwzN10sIkZEU2VsZWN0Iiwib2Zmc2V0IixudWxsXSxbWzEyLDM2XSwiRkRBcnJheSIsIm9mZnNldCIsbnVsbF0sW1sxMiwzOF0sIkZvbnROYW1lIiwic2lkIixudWxsXV07Y2xhc3MgcCBleHRlbmRzIGZ7c3RhdGljIGdldCB0YWJsZXMoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywidGFibGVzIix0aGlzLmNyZWF0ZVRhYmxlcyhnKSl9Y29uc3RydWN0b3IoZSl7c3VwZXIocC50YWJsZXMsZSksdGhpcy5wcml2YXRlRGljdD1udWxsfX10LkNGRlRvcERpY3Q9cDtjb25zdCBtPVtbNiwiQmx1ZVZhbHVlcyIsImRlbHRhIixudWxsXSxbNywiT3RoZXJCbHVlcyIsImRlbHRhIixudWxsXSxbOCwiRmFtaWx5Qmx1ZXMiLCJkZWx0YSIsbnVsbF0sWzksIkZhbWlseU90aGVyQmx1ZXMiLCJkZWx0YSIsbnVsbF0sW1sxMiw5XSwiQmx1ZVNjYWxlIiwibnVtIiwuMDM5NjI1XSxbWzEyLDEwXSwiQmx1ZVNoaWZ0IiwibnVtIiw3XSxbWzEyLDExXSwiQmx1ZUZ1enoiLCJudW0iLDFdLFsxMCwiU3RkSFciLCJudW0iLG51bGxdLFsxMSwiU3RkVlciLCJudW0iLG51bGxdLFtbMTIsMTJdLCJTdGVtU25hcEgiLCJkZWx0YSIsbnVsbF0sW1sxMiwxM10sIlN0ZW1TbmFwViIsImRlbHRhIixudWxsXSxbWzEyLDE0XSwiRm9yY2VCb2xkIiwibnVtIiwwXSxbWzEyLDE3XSwiTGFuZ3VhZ2VHcm91cCIsIm51bSIsMF0sW1sxMiwxOF0sIkV4cGFuc2lvbkZhY3RvciIsIm51bSIsLjA2XSxbWzEyLDE5XSwiaW5pdGlhbFJhbmRvbVNlZWQiLCJudW0iLDBdLFsyMCwiZGVmYXVsdFdpZHRoWCIsIm51bSIsMF0sWzIxLCJub21pbmFsV2lkdGhYIiwibnVtIiwwXSxbMTksIlN1YnJzIiwib2Zmc2V0IixudWxsXV07Y2xhc3MgYiBleHRlbmRzIGZ7c3RhdGljIGdldCB0YWJsZXMoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywidGFibGVzIix0aGlzLmNyZWF0ZVRhYmxlcyhtKSl9Y29uc3RydWN0b3IoZSl7c3VwZXIoYi50YWJsZXMsZSksdGhpcy5zdWJyc0luZGV4PW51bGx9fXQuQ0ZGUHJpdmF0ZURpY3Q9Yjtjb25zdCB5PXtJU09fQURPQkU6MCxFWFBFUlQ6MSxFWFBFUlRfU1VCU0VUOjJ9O2NsYXNzIHd7Y29uc3RydWN0b3IoZSx0LHIsbil7dGhpcy5wcmVkZWZpbmVkPWUsdGhpcy5mb3JtYXQ9dCx0aGlzLmNoYXJzZXQ9cix0aGlzLnJhdz1ufX10LkNGRkNoYXJzZXQ9dztjbGFzcyB2e2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMucHJlZGVmaW5lZD1lLHRoaXMuZm9ybWF0PXQsdGhpcy5lbmNvZGluZz1yLHRoaXMucmF3PW59fWNsYXNzIHh7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmZvcm1hdD1lLHRoaXMuZmRTZWxlY3Q9dH1nZXRGREluZGV4KGUpe3JldHVybiBlPDB8fGU+PXRoaXMuZmRTZWxlY3QubGVuZ3RoPy0xOnRoaXMuZmRTZWxlY3RbZV19fXQuQ0ZGRkRTZWxlY3Q9eDtjbGFzcyBTe2NvbnN0cnVjdG9yKCl7dGhpcy5vZmZzZXRzPU9iamVjdC5jcmVhdGUobnVsbCl9aXNUcmFja2luZyhlKXtyZXR1cm4gZSBpbiB0aGlzLm9mZnNldHN9dHJhY2soZSx0KXtpZihlIGluIHRoaXMub2Zmc2V0cyl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiQWxyZWFkeSB0cmFja2luZyBsb2NhdGlvbiBvZiAiLmNvbmNhdChlKSk7dGhpcy5vZmZzZXRzW2VdPXR9b2Zmc2V0KGUpe2Zvcihjb25zdCB0IGluIHRoaXMub2Zmc2V0cyl0aGlzLm9mZnNldHNbdF0rPWV9c2V0RW50cnlMb2NhdGlvbihlLHQscil7aWYoIShlIGluIHRoaXMub2Zmc2V0cykpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIk5vdCB0cmFja2luZyBsb2NhdGlvbiBvZiAiLmNvbmNhdChlKSk7Y29uc3QgYT1yLmRhdGEsaT10aGlzLm9mZnNldHNbZV07Zm9yKGxldCBlPTAscj10Lmxlbmd0aDtlPHI7KytlKXtjb25zdCByPTUqZStpLHM9cisxLG89cisyLGM9ciszLGw9cis0O2lmKDI5IT09YVtyXXx8MCE9PWFbc118fDAhPT1hW29dfHwwIT09YVtjXXx8MCE9PWFbbF0pdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIndyaXRpbmcgdG8gYW4gb2Zmc2V0IHRoYXQgaXMgbm90IGVtcHR5Iik7Y29uc3QgaD10W2VdO2Fbcl09MjksYVtzXT1oPj4yNCYyNTUsYVtvXT1oPj4xNiYyNTUsYVtjXT1oPj44JjI1NSxhW2xdPTI1NSZofX19Y2xhc3MgQXtjb25zdHJ1Y3RvcihlKXt0aGlzLmNmZj1lfWNvbXBpbGUoKXtjb25zdCBlPXRoaXMuY2ZmLHQ9e2RhdGE6W10sbGVuZ3RoOjAsYWRkKGUpe3RyeXt0aGlzLmRhdGEucHVzaCguLi5lKX1jYXRjaCh0KXt0aGlzLmRhdGE9dGhpcy5kYXRhLmNvbmNhdChlKX10aGlzLmxlbmd0aD10aGlzLmRhdGEubGVuZ3RofX0scj10aGlzLmNvbXBpbGVIZWFkZXIoZS5oZWFkZXIpO3QuYWRkKHIpO2NvbnN0IGE9dGhpcy5jb21waWxlTmFtZUluZGV4KGUubmFtZXMpO2lmKHQuYWRkKGEpLGUuaXNDSURGb250JiZlLnRvcERpY3QuaGFzTmFtZSgiRm9udE1hdHJpeCIpKXtjb25zdCB0PWUudG9wRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTtlLnRvcERpY3QucmVtb3ZlQnlOYW1lKCJGb250TWF0cml4Iik7Zm9yKGNvbnN0IHIgb2YgZS5mZEFycmF5KXtsZXQgZT10LnNsaWNlKDApO3IuaGFzTmFtZSgiRm9udE1hdHJpeCIpJiYoZT1uLlV0aWwudHJhbnNmb3JtKGUsci5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKSkpLHIuc2V0QnlOYW1lKCJGb250TWF0cml4IixlKX19Y29uc3QgaT1lLnRvcERpY3QuZ2V0QnlOYW1lKCJYVUlEIik7KG51bGw9PWk/dm9pZCAwOmkubGVuZ3RoKT4xNiYmZS50b3BEaWN0LnJlbW92ZUJ5TmFtZSgiWFVJRCIpLGUudG9wRGljdC5zZXRCeU5hbWUoImNoYXJzZXQiLDApO2xldCBzPXRoaXMuY29tcGlsZVRvcERpY3RzKFtlLnRvcERpY3RdLHQubGVuZ3RoLGUuaXNDSURGb250KTt0LmFkZChzLm91dHB1dCk7Y29uc3Qgbz1zLnRyYWNrZXJzWzBdLGM9dGhpcy5jb21waWxlU3RyaW5nSW5kZXgoZS5zdHJpbmdzLnN0cmluZ3MpO3QuYWRkKGMpO2NvbnN0IGw9dGhpcy5jb21waWxlSW5kZXgoZS5nbG9iYWxTdWJySW5kZXgpO2lmKHQuYWRkKGwpLGUuZW5jb2RpbmcmJmUudG9wRGljdC5oYXNOYW1lKCJFbmNvZGluZyIpKWlmKGUuZW5jb2RpbmcucHJlZGVmaW5lZClvLnNldEVudHJ5TG9jYXRpb24oIkVuY29kaW5nIixbZS5lbmNvZGluZy5mb3JtYXRdLHQpO2Vsc2V7Y29uc3Qgcj10aGlzLmNvbXBpbGVFbmNvZGluZyhlLmVuY29kaW5nKTtvLnNldEVudHJ5TG9jYXRpb24oIkVuY29kaW5nIixbdC5sZW5ndGhdLHQpLHQuYWRkKHIpfWNvbnN0IGg9dGhpcy5jb21waWxlQ2hhcnNldChlLmNoYXJzZXQsZS5jaGFyU3RyaW5ncy5jb3VudCxlLnN0cmluZ3MsZS5pc0NJREZvbnQpO28uc2V0RW50cnlMb2NhdGlvbigiY2hhcnNldCIsW3QubGVuZ3RoXSx0KSx0LmFkZChoKTtjb25zdCB1PXRoaXMuY29tcGlsZUNoYXJTdHJpbmdzKGUuY2hhclN0cmluZ3MpO2lmKG8uc2V0RW50cnlMb2NhdGlvbigiQ2hhclN0cmluZ3MiLFt0Lmxlbmd0aF0sdCksdC5hZGQodSksZS5pc0NJREZvbnQpe28uc2V0RW50cnlMb2NhdGlvbigiRkRTZWxlY3QiLFt0Lmxlbmd0aF0sdCk7Y29uc3Qgcj10aGlzLmNvbXBpbGVGRFNlbGVjdChlLmZkU2VsZWN0KTt0LmFkZChyKSxzPXRoaXMuY29tcGlsZVRvcERpY3RzKGUuZmRBcnJheSx0Lmxlbmd0aCwhMCksby5zZXRFbnRyeUxvY2F0aW9uKCJGREFycmF5IixbdC5sZW5ndGhdLHQpLHQuYWRkKHMub3V0cHV0KTtjb25zdCBuPXMudHJhY2tlcnM7dGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKGUuZmRBcnJheSxuLHQpfXJldHVybiB0aGlzLmNvbXBpbGVQcml2YXRlRGljdHMoW2UudG9wRGljdF0sW29dLHQpLHQuYWRkKFswXSksdC5kYXRhfWVuY29kZU51bWJlcihlKXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihlKT90aGlzLmVuY29kZUludGVnZXIoZSk6dGhpcy5lbmNvZGVGbG9hdChlKX1zdGF0aWMgZ2V0IEVuY29kZUZsb2F0UmVnRXhwKCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIkVuY29kZUZsb2F0UmVnRXhwIiwvXC4oXGQqPykoPzo5ezUsMjB9fDB7NSwyMH0pXGR7MCwyfSg/OmUoLispfCQpLyl9ZW5jb2RlRmxvYXQoZSl7bGV0IHQ9ZS50b1N0cmluZygpO2NvbnN0IHI9QS5FbmNvZGVGbG9hdFJlZ0V4cC5leGVjKHQpO2lmKHIpe2NvbnN0IG49cGFyc2VGbG9hdCgiMWUiKygoclsyXT8rclsyXTowKStyWzFdLmxlbmd0aCkpO3Q9KE1hdGgucm91bmQoZSpuKS9uKS50b1N0cmluZygpfWxldCBuLGEsaT0iIjtmb3Iobj0wLGE9dC5sZW5ndGg7bjxhOysrbil7Y29uc3QgZT10W25dO2krPSJlIj09PWU/Ii0iPT09dFsrK25dPyJjIjoiYiI6Ii4iPT09ZT8iYSI6Ii0iPT09ZT8iZSI6ZX1pKz0xJmkubGVuZ3RoPyJmIjoiZmYiO2NvbnN0IHM9WzMwXTtmb3Iobj0wLGE9aS5sZW5ndGg7bjxhO24rPTIpcy5wdXNoKHBhcnNlSW50KGkuc3Vic3RyaW5nKG4sbisyKSwxNikpO3JldHVybiBzfWVuY29kZUludGVnZXIoZSl7bGV0IHQ7cmV0dXJuIHQ9ZT49LTEwNyYmZTw9MTA3P1tlKzEzOV06ZT49MTA4JiZlPD0xMTMxP1syNDcrKChlLT0xMDgpPj44KSwyNTUmZV06ZT49LTExMzEmJmU8PS0xMDg/WzI1MSsoKGU9LWUtMTA4KT4+OCksMjU1JmVdOmU+PS0zMjc2OCYmZTw9MzI3Njc/WzI4LGU+PjgmMjU1LDI1NSZlXTpbMjksZT4+MjQmMjU1LGU+PjE2JjI1NSxlPj44JjI1NSwyNTUmZV0sdH1jb21waWxlSGVhZGVyKGUpe3JldHVybltlLm1ham9yLGUubWlub3IsNCxlLm9mZlNpemVdfWNvbXBpbGVOYW1lSW5kZXgoZSl7Y29uc3QgdD1uZXcgZDtmb3IoY29uc3QgciBvZiBlKXtjb25zdCBlPU1hdGgubWluKHIubGVuZ3RoLDEyNyk7bGV0IGE9bmV3IEFycmF5KGUpO2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPXJbdF07KGU8IiEifHxlPiJ+Inx8IlsiPT09ZXx8Il0iPT09ZXx8IigiPT09ZXx8IikiPT09ZXx8InsiPT09ZXx8In0iPT09ZXx8IjwiPT09ZXx8Ij4iPT09ZXx8Ii8iPT09ZXx8IiUiPT09ZSkmJihlPSJfIiksYVt0XT1lfWE9YS5qb2luKCIiKSwiIj09PWEmJihhPSJCYWRfRm9udF9OYW1lIiksdC5hZGQoKDAsbi5zdHJpbmdUb0J5dGVzKShhKSl9cmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KHQpfWNvbXBpbGVUb3BEaWN0cyhlLHQscil7Y29uc3Qgbj1bXTtsZXQgYT1uZXcgZDtmb3IoY29uc3QgaSBvZiBlKXtyJiYoaS5yZW1vdmVCeU5hbWUoIkNJREZvbnRWZXJzaW9uIiksaS5yZW1vdmVCeU5hbWUoIkNJREZvbnRSZXZpc2lvbiIpLGkucmVtb3ZlQnlOYW1lKCJDSURGb250VHlwZSIpLGkucmVtb3ZlQnlOYW1lKCJDSURDb3VudCIpLGkucmVtb3ZlQnlOYW1lKCJVSURCYXNlIikpO2NvbnN0IGU9bmV3IFMscz10aGlzLmNvbXBpbGVEaWN0KGksZSk7bi5wdXNoKGUpLGEuYWRkKHMpLGUub2Zmc2V0KHQpfXJldHVybiBhPXRoaXMuY29tcGlsZUluZGV4KGEsbikse3RyYWNrZXJzOm4sb3V0cHV0OmF9fWNvbXBpbGVQcml2YXRlRGljdHMoZSx0LHIpe2ZvcihsZXQgYT0wLGk9ZS5sZW5ndGg7YTxpOysrYSl7Y29uc3QgaT1lW2FdLHM9aS5wcml2YXRlRGljdDtpZighc3x8IWkuaGFzTmFtZSgiUHJpdmF0ZSIpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJUaGVyZSBtdXN0IGJlIGEgcHJpdmF0ZSBkaWN0aW9uYXJ5LiIpO2NvbnN0IG89bmV3IFMsYz10aGlzLmNvbXBpbGVEaWN0KHMsbyk7bGV0IGw9ci5sZW5ndGg7aWYoby5vZmZzZXQobCksYy5sZW5ndGh8fChsPTApLHRbYV0uc2V0RW50cnlMb2NhdGlvbigiUHJpdmF0ZSIsW2MubGVuZ3RoLGxdLHIpLHIuYWRkKGMpLHMuc3VicnNJbmRleCYmcy5oYXNOYW1lKCJTdWJycyIpKXtjb25zdCBlPXRoaXMuY29tcGlsZUluZGV4KHMuc3VicnNJbmRleCk7by5zZXRFbnRyeUxvY2F0aW9uKCJTdWJycyIsW2MubGVuZ3RoXSxyKSxyLmFkZChlKX19fWNvbXBpbGVEaWN0KGUsdCl7Y29uc3Qgcj1bXTtmb3IoY29uc3QgYSBvZiBlLm9yZGVyKXtpZighKGEgaW4gZS52YWx1ZXMpKWNvbnRpbnVlO2xldCBpPWUudmFsdWVzW2FdLHM9ZS50eXBlc1thXTtpZihBcnJheS5pc0FycmF5KHMpfHwocz1bc10pLEFycmF5LmlzQXJyYXkoaSl8fChpPVtpXSksMCE9PWkubGVuZ3RoKXtmb3IobGV0IG89MCxjPXMubGVuZ3RoO288YzsrK28pe2NvbnN0IGM9c1tvXSxsPWlbb107c3dpdGNoKGMpe2Nhc2UibnVtIjpjYXNlInNpZCI6ci5wdXNoKC4uLnRoaXMuZW5jb2RlTnVtYmVyKGwpKTticmVhaztjYXNlIm9mZnNldCI6Y29uc3Qgcz1lLmtleVRvTmFtZU1hcFthXTt0LmlzVHJhY2tpbmcocyl8fHQudHJhY2socyxyLmxlbmd0aCksci5wdXNoKDI5LDAsMCwwLDApO2JyZWFrO2Nhc2UiYXJyYXkiOmNhc2UiZGVsdGEiOnIucHVzaCguLi50aGlzLmVuY29kZU51bWJlcihsKSk7Zm9yKGxldCBlPTEsdD1pLmxlbmd0aDtlPHQ7KytlKXIucHVzaCguLi50aGlzLmVuY29kZU51bWJlcihpW2VdKSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiVW5rbm93biBkYXRhIHR5cGUgb2YgIi5jb25jYXQoYykpfX1yLnB1c2goLi4uZS5vcGNvZGVzW2FdKX19cmV0dXJuIHJ9Y29tcGlsZVN0cmluZ0luZGV4KGUpe2NvbnN0IHQ9bmV3IGQ7Zm9yKGNvbnN0IHIgb2YgZSl0LmFkZCgoMCxuLnN0cmluZ1RvQnl0ZXMpKHIpKTtyZXR1cm4gdGhpcy5jb21waWxlSW5kZXgodCl9Y29tcGlsZUNoYXJTdHJpbmdzKGUpe2NvbnN0IHQ9bmV3IGQ7Zm9yKGxldCByPTA7cjxlLmNvdW50O3IrKyl7Y29uc3Qgbj1lLmdldChyKTswIT09bi5sZW5ndGg/dC5hZGQobik6dC5hZGQobmV3IFVpbnQ4QXJyYXkoWzEzOSwxNF0pKX1yZXR1cm4gdGhpcy5jb21waWxlSW5kZXgodCl9Y29tcGlsZUNoYXJzZXQoZSx0LHIsYSl7bGV0IGk7Y29uc3Qgcz10LTE7aWYoYSlpPW5ldyBVaW50OEFycmF5KFsyLDAsMCxzPj44JjI1NSwyNTUmc10pO2Vsc2V7aT1uZXcgVWludDhBcnJheSgxKzIqcyksaVswXT0wO2xldCB0PTA7Y29uc3QgYT1lLmNoYXJzZXQubGVuZ3RoO2xldCBvPSExO2ZvcihsZXQgcz0xO3M8aS5sZW5ndGg7cys9Mil7bGV0IGM9MDtpZih0PGEpe2NvbnN0IGE9ZS5jaGFyc2V0W3QrK107Yz1yLmdldFNJRChhKSwtMT09PWMmJihjPTAsb3x8KG89ITAsKDAsbi53YXJuKSgiQ291bGRuJ3QgZmluZCAiLmNvbmNhdChhLCIgaW4gQ0ZGIHN0cmluZ3MiKSkpKX1pW3NdPWM+PjgmMjU1LGlbcysxXT0yNTUmY319cmV0dXJuIHRoaXMuY29tcGlsZVR5cGVkQXJyYXkoaSl9Y29tcGlsZUVuY29kaW5nKGUpe3JldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KGUucmF3KX1jb21waWxlRkRTZWxlY3QoZSl7Y29uc3QgdD1lLmZvcm1hdDtsZXQgcixuO3N3aXRjaCh0KXtjYXNlIDA6Zm9yKHI9bmV3IFVpbnQ4QXJyYXkoMStlLmZkU2VsZWN0Lmxlbmd0aCksclswXT10LG49MDtuPGUuZmRTZWxlY3QubGVuZ3RoO24rKylyW24rMV09ZS5mZFNlbGVjdFtuXTticmVhaztjYXNlIDM6Y29uc3QgYT0wO2xldCBpPWUuZmRTZWxlY3RbMF07Y29uc3Qgcz1bdCwwLDAsYT4+OCYyNTUsMjU1JmEsaV07Zm9yKG49MTtuPGUuZmRTZWxlY3QubGVuZ3RoO24rKyl7Y29uc3QgdD1lLmZkU2VsZWN0W25dO3QhPT1pJiYocy5wdXNoKG4+PjgmMjU1LDI1NSZuLHQpLGk9dCl9Y29uc3Qgbz0ocy5sZW5ndGgtMykvMztzWzFdPW8+PjgmMjU1LHNbMl09MjU1Jm8scy5wdXNoKG4+PjgmMjU1LDI1NSZuKSxyPW5ldyBVaW50OEFycmF5KHMpfXJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KHIpfWNvbXBpbGVUeXBlZEFycmF5KGUpe3JldHVybiBBcnJheS5mcm9tKGUpfWNvbXBpbGVJbmRleChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06W107Y29uc3Qgcj1lLm9iamVjdHMsbj1yLmxlbmd0aDtpZigwPT09bilyZXR1cm5bMCwwXTtjb25zdCBhPVtuPj44JjI1NSwyNTUmbl07bGV0IGkscyxvPTE7Zm9yKGk9MDtpPG47KytpKW8rPXJbaV0ubGVuZ3RoO3M9bzwyNTY/MTpvPDY1NTM2PzI6bzwxNjc3NzIxNj8zOjQsYS5wdXNoKHMpO2xldCBjPTE7Zm9yKGk9MDtpPG4rMTtpKyspMT09PXM/YS5wdXNoKDI1NSZjKToyPT09cz9hLnB1c2goYz4+OCYyNTUsMjU1JmMpOjM9PT1zP2EucHVzaChjPj4xNiYyNTUsYz4+OCYyNTUsMjU1JmMpOmEucHVzaChjPj4+MjQmMjU1LGM+PjE2JjI1NSxjPj44JjI1NSwyNTUmYykscltpXSYmKGMrPXJbaV0ubGVuZ3RoKTtmb3IoaT0wO2k8bjtpKyspdFtpXSYmdFtpXS5vZmZzZXQoYS5sZW5ndGgpLGEucHVzaCguLi5yW2ldKTtyZXR1cm4gYX19dC5DRkZDb21waWxlcj1BfSwoZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LklTT0Fkb2JlQ2hhcnNldD10LkV4cGVydFN1YnNldENoYXJzZXQ9dC5FeHBlcnRDaGFyc2V0PXZvaWQgMCx0LklTT0Fkb2JlQ2hhcnNldD1bIi5ub3RkZWYiLCJzcGFjZSIsImV4Y2xhbSIsInF1b3RlZGJsIiwibnVtYmVyc2lnbiIsImRvbGxhciIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJxdW90ZXJpZ2h0IiwicGFyZW5sZWZ0IiwicGFyZW5yaWdodCIsImFzdGVyaXNrIiwicGx1cyIsImNvbW1hIiwiaHlwaGVuIiwicGVyaW9kIiwic2xhc2giLCJ6ZXJvIiwib25lIiwidHdvIiwidGhyZWUiLCJmb3VyIiwiZml2ZSIsInNpeCIsInNldmVuIiwiZWlnaHQiLCJuaW5lIiwiY29sb24iLCJzZW1pY29sb24iLCJsZXNzIiwiZXF1YWwiLCJncmVhdGVyIiwicXVlc3Rpb24iLCJhdCIsIkEiLCJCIiwiQyIsIkQiLCJFIiwiRiIsIkciLCJIIiwiSSIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlAiLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiYnJhY2tldGxlZnQiLCJiYWNrc2xhc2giLCJicmFja2V0cmlnaHQiLCJhc2NpaWNpcmN1bSIsInVuZGVyc2NvcmUiLCJxdW90ZWxlZnQiLCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLCJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJhc2NpaXRpbGRlIiwiZXhjbGFtZG93biIsImNlbnQiLCJzdGVybGluZyIsImZyYWN0aW9uIiwieWVuIiwiZmxvcmluIiwic2VjdGlvbiIsImN1cnJlbmN5IiwicXVvdGVzaW5nbGUiLCJxdW90ZWRibGxlZnQiLCJndWlsbGVtb3RsZWZ0IiwiZ3VpbHNpbmdsbGVmdCIsImd1aWxzaW5nbHJpZ2h0IiwiZmkiLCJmbCIsImVuZGFzaCIsImRhZ2dlciIsImRhZ2dlcmRibCIsInBlcmlvZGNlbnRlcmVkIiwicGFyYWdyYXBoIiwiYnVsbGV0IiwicXVvdGVzaW5nbGJhc2UiLCJxdW90ZWRibGJhc2UiLCJxdW90ZWRibHJpZ2h0IiwiZ3VpbGxlbW90cmlnaHQiLCJlbGxpcHNpcyIsInBlcnRob3VzYW5kIiwicXVlc3Rpb25kb3duIiwiZ3JhdmUiLCJhY3V0ZSIsImNpcmN1bWZsZXgiLCJ0aWxkZSIsIm1hY3JvbiIsImJyZXZlIiwiZG90YWNjZW50IiwiZGllcmVzaXMiLCJyaW5nIiwiY2VkaWxsYSIsImh1bmdhcnVtbGF1dCIsIm9nb25layIsImNhcm9uIiwiZW1kYXNoIiwiQUUiLCJvcmRmZW1pbmluZSIsIkxzbGFzaCIsIk9zbGFzaCIsIk9FIiwib3JkbWFzY3VsaW5lIiwiYWUiLCJkb3RsZXNzaSIsImxzbGFzaCIsIm9zbGFzaCIsIm9lIiwiZ2VybWFuZGJscyIsIm9uZXN1cGVyaW9yIiwibG9naWNhbG5vdCIsIm11IiwidHJhZGVtYXJrIiwiRXRoIiwib25laGFsZiIsInBsdXNtaW51cyIsIlRob3JuIiwib25lcXVhcnRlciIsImRpdmlkZSIsImJyb2tlbmJhciIsImRlZ3JlZSIsInRob3JuIiwidGhyZWVxdWFydGVycyIsInR3b3N1cGVyaW9yIiwicmVnaXN0ZXJlZCIsIm1pbnVzIiwiZXRoIiwibXVsdGlwbHkiLCJ0aHJlZXN1cGVyaW9yIiwiY29weXJpZ2h0IiwiQWFjdXRlIiwiQWNpcmN1bWZsZXgiLCJBZGllcmVzaXMiLCJBZ3JhdmUiLCJBcmluZyIsIkF0aWxkZSIsIkNjZWRpbGxhIiwiRWFjdXRlIiwiRWNpcmN1bWZsZXgiLCJFZGllcmVzaXMiLCJFZ3JhdmUiLCJJYWN1dGUiLCJJY2lyY3VtZmxleCIsIklkaWVyZXNpcyIsIklncmF2ZSIsIk50aWxkZSIsIk9hY3V0ZSIsIk9jaXJjdW1mbGV4IiwiT2RpZXJlc2lzIiwiT2dyYXZlIiwiT3RpbGRlIiwiU2Nhcm9uIiwiVWFjdXRlIiwiVWNpcmN1bWZsZXgiLCJVZGllcmVzaXMiLCJVZ3JhdmUiLCJZYWN1dGUiLCJZZGllcmVzaXMiLCJaY2Fyb24iLCJhYWN1dGUiLCJhY2lyY3VtZmxleCIsImFkaWVyZXNpcyIsImFncmF2ZSIsImFyaW5nIiwiYXRpbGRlIiwiY2NlZGlsbGEiLCJlYWN1dGUiLCJlY2lyY3VtZmxleCIsImVkaWVyZXNpcyIsImVncmF2ZSIsImlhY3V0ZSIsImljaXJjdW1mbGV4IiwiaWRpZXJlc2lzIiwiaWdyYXZlIiwibnRpbGRlIiwib2FjdXRlIiwib2NpcmN1bWZsZXgiLCJvZGllcmVzaXMiLCJvZ3JhdmUiLCJvdGlsZGUiLCJzY2Fyb24iLCJ1YWN1dGUiLCJ1Y2lyY3VtZmxleCIsInVkaWVyZXNpcyIsInVncmF2ZSIsInlhY3V0ZSIsInlkaWVyZXNpcyIsInpjYXJvbiJdLHQuRXhwZXJ0Q2hhcnNldD1bIi5ub3RkZWYiLCJzcGFjZSIsImV4Y2xhbXNtYWxsIiwiSHVuZ2FydW1sYXV0c21hbGwiLCJkb2xsYXJvbGRzdHlsZSIsImRvbGxhcnN1cGVyaW9yIiwiYW1wZXJzYW5kc21hbGwiLCJBY3V0ZXNtYWxsIiwicGFyZW5sZWZ0c3VwZXJpb3IiLCJwYXJlbnJpZ2h0c3VwZXJpb3IiLCJ0d29kb3RlbmxlYWRlciIsIm9uZWRvdGVubGVhZGVyIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJmcmFjdGlvbiIsInplcm9vbGRzdHlsZSIsIm9uZW9sZHN0eWxlIiwidHdvb2xkc3R5bGUiLCJ0aHJlZW9sZHN0eWxlIiwiZm91cm9sZHN0eWxlIiwiZml2ZW9sZHN0eWxlIiwic2l4b2xkc3R5bGUiLCJzZXZlbm9sZHN0eWxlIiwiZWlnaHRvbGRzdHlsZSIsIm5pbmVvbGRzdHlsZSIsImNvbG9uIiwic2VtaWNvbG9uIiwiY29tbWFzdXBlcmlvciIsInRocmVlcXVhcnRlcnNlbWRhc2giLCJwZXJpb2RzdXBlcmlvciIsInF1ZXN0aW9uc21hbGwiLCJhc3VwZXJpb3IiLCJic3VwZXJpb3IiLCJjZW50c3VwZXJpb3IiLCJkc3VwZXJpb3IiLCJlc3VwZXJpb3IiLCJpc3VwZXJpb3IiLCJsc3VwZXJpb3IiLCJtc3VwZXJpb3IiLCJuc3VwZXJpb3IiLCJvc3VwZXJpb3IiLCJyc3VwZXJpb3IiLCJzc3VwZXJpb3IiLCJ0c3VwZXJpb3IiLCJmZiIsImZpIiwiZmwiLCJmZmkiLCJmZmwiLCJwYXJlbmxlZnRpbmZlcmlvciIsInBhcmVucmlnaHRpbmZlcmlvciIsIkNpcmN1bWZsZXhzbWFsbCIsImh5cGhlbnN1cGVyaW9yIiwiR3JhdmVzbWFsbCIsIkFzbWFsbCIsIkJzbWFsbCIsIkNzbWFsbCIsIkRzbWFsbCIsIkVzbWFsbCIsIkZzbWFsbCIsIkdzbWFsbCIsIkhzbWFsbCIsIklzbWFsbCIsIkpzbWFsbCIsIktzbWFsbCIsIkxzbWFsbCIsIk1zbWFsbCIsIk5zbWFsbCIsIk9zbWFsbCIsIlBzbWFsbCIsIlFzbWFsbCIsIlJzbWFsbCIsIlNzbWFsbCIsIlRzbWFsbCIsIlVzbWFsbCIsIlZzbWFsbCIsIldzbWFsbCIsIlhzbWFsbCIsIllzbWFsbCIsIlpzbWFsbCIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJUaWxkZXNtYWxsIiwiZXhjbGFtZG93bnNtYWxsIiwiY2VudG9sZHN0eWxlIiwiTHNsYXNoc21hbGwiLCJTY2Fyb25zbWFsbCIsIlpjYXJvbnNtYWxsIiwiRGllcmVzaXNzbWFsbCIsIkJyZXZlc21hbGwiLCJDYXJvbnNtYWxsIiwiRG90YWNjZW50c21hbGwiLCJNYWNyb25zbWFsbCIsImZpZ3VyZWRhc2giLCJoeXBoZW5pbmZlcmlvciIsIk9nb25la3NtYWxsIiwiUmluZ3NtYWxsIiwiQ2VkaWxsYXNtYWxsIiwib25lcXVhcnRlciIsIm9uZWhhbGYiLCJ0aHJlZXF1YXJ0ZXJzIiwicXVlc3Rpb25kb3duc21hbGwiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiemVyb3N1cGVyaW9yIiwib25lc3VwZXJpb3IiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJmb3Vyc3VwZXJpb3IiLCJmaXZlc3VwZXJpb3IiLCJzaXhzdXBlcmlvciIsInNldmVuc3VwZXJpb3IiLCJlaWdodHN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb2luZmVyaW9yIiwib25laW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJmb3VyaW5mZXJpb3IiLCJmaXZlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsInNldmVuaW5mZXJpb3IiLCJlaWdodGluZmVyaW9yIiwibmluZWluZmVyaW9yIiwiY2VudGluZmVyaW9yIiwiZG9sbGFyaW5mZXJpb3IiLCJwZXJpb2RpbmZlcmlvciIsImNvbW1haW5mZXJpb3IiLCJBZ3JhdmVzbWFsbCIsIkFhY3V0ZXNtYWxsIiwiQWNpcmN1bWZsZXhzbWFsbCIsIkF0aWxkZXNtYWxsIiwiQWRpZXJlc2lzc21hbGwiLCJBcmluZ3NtYWxsIiwiQUVzbWFsbCIsIkNjZWRpbGxhc21hbGwiLCJFZ3JhdmVzbWFsbCIsIkVhY3V0ZXNtYWxsIiwiRWNpcmN1bWZsZXhzbWFsbCIsIkVkaWVyZXNpc3NtYWxsIiwiSWdyYXZlc21hbGwiLCJJYWN1dGVzbWFsbCIsIkljaXJjdW1mbGV4c21hbGwiLCJJZGllcmVzaXNzbWFsbCIsIkV0aHNtYWxsIiwiTnRpbGRlc21hbGwiLCJPZ3JhdmVzbWFsbCIsIk9hY3V0ZXNtYWxsIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk90aWxkZXNtYWxsIiwiT2RpZXJlc2lzc21hbGwiLCJPRXNtYWxsIiwiT3NsYXNoc21hbGwiLCJVZ3JhdmVzbWFsbCIsIlVhY3V0ZXNtYWxsIiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVkaWVyZXNpc3NtYWxsIiwiWWFjdXRlc21hbGwiLCJUaG9ybnNtYWxsIiwiWWRpZXJlc2lzc21hbGwiXSx0LkV4cGVydFN1YnNldENoYXJzZXQ9WyIubm90ZGVmIiwic3BhY2UiLCJkb2xsYXJvbGRzdHlsZSIsImRvbGxhcnN1cGVyaW9yIiwicGFyZW5sZWZ0c3VwZXJpb3IiLCJwYXJlbnJpZ2h0c3VwZXJpb3IiLCJ0d29kb3RlbmxlYWRlciIsIm9uZWRvdGVubGVhZGVyIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJmcmFjdGlvbiIsInplcm9vbGRzdHlsZSIsIm9uZW9sZHN0eWxlIiwidHdvb2xkc3R5bGUiLCJ0aHJlZW9sZHN0eWxlIiwiZm91cm9sZHN0eWxlIiwiZml2ZW9sZHN0eWxlIiwic2l4b2xkc3R5bGUiLCJzZXZlbm9sZHN0eWxlIiwiZWlnaHRvbGRzdHlsZSIsIm5pbmVvbGRzdHlsZSIsImNvbG9uIiwic2VtaWNvbG9uIiwiY29tbWFzdXBlcmlvciIsInRocmVlcXVhcnRlcnNlbWRhc2giLCJwZXJpb2RzdXBlcmlvciIsImFzdXBlcmlvciIsImJzdXBlcmlvciIsImNlbnRzdXBlcmlvciIsImRzdXBlcmlvciIsImVzdXBlcmlvciIsImlzdXBlcmlvciIsImxzdXBlcmlvciIsIm1zdXBlcmlvciIsIm5zdXBlcmlvciIsIm9zdXBlcmlvciIsInJzdXBlcmlvciIsInNzdXBlcmlvciIsInRzdXBlcmlvciIsImZmIiwiZmkiLCJmbCIsImZmaSIsImZmbCIsInBhcmVubGVmdGluZmVyaW9yIiwicGFyZW5yaWdodGluZmVyaW9yIiwiaHlwaGVuc3VwZXJpb3IiLCJjb2xvbm1vbmV0YXJ5Iiwib25lZml0dGVkIiwicnVwaWFoIiwiY2VudG9sZHN0eWxlIiwiZmlndXJlZGFzaCIsImh5cGhlbmluZmVyaW9yIiwib25lcXVhcnRlciIsIm9uZWhhbGYiLCJ0aHJlZXF1YXJ0ZXJzIiwib25lZWlnaHRoIiwidGhyZWVlaWdodGhzIiwiZml2ZWVpZ2h0aHMiLCJzZXZlbmVpZ2h0aHMiLCJvbmV0aGlyZCIsInR3b3RoaXJkcyIsInplcm9zdXBlcmlvciIsIm9uZXN1cGVyaW9yIiwidHdvc3VwZXJpb3IiLCJ0aHJlZXN1cGVyaW9yIiwiZm91cnN1cGVyaW9yIiwiZml2ZXN1cGVyaW9yIiwic2l4c3VwZXJpb3IiLCJzZXZlbnN1cGVyaW9yIiwiZWlnaHRzdXBlcmlvciIsIm5pbmVzdXBlcmlvciIsInplcm9pbmZlcmlvciIsIm9uZWluZmVyaW9yIiwidHdvaW5mZXJpb3IiLCJ0aHJlZWluZmVyaW9yIiwiZm91cmluZmVyaW9yIiwiZml2ZWluZmVyaW9yIiwic2l4aW5mZXJpb3IiLCJzZXZlbmluZmVyaW9yIiwiZWlnaHRpbmZlcmlvciIsIm5pbmVpbmZlcmlvciIsImNlbnRpbmZlcmlvciIsImRvbGxhcmluZmVyaW9yIiwicGVyaW9kaW5mZXJpb3IiLCJjb21tYWluZmVyaW9yIl19LChlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuWmFwZkRpbmdiYXRzRW5jb2Rpbmc9dC5XaW5BbnNpRW5jb2Rpbmc9dC5TeW1ib2xTZXRFbmNvZGluZz10LlN0YW5kYXJkRW5jb2Rpbmc9dC5NYWNSb21hbkVuY29kaW5nPXQuRXhwZXJ0RW5jb2Rpbmc9dm9pZCAwLHQuZ2V0RW5jb2Rpbmc9ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UiV2luQW5zaUVuY29kaW5nIjpyZXR1cm4gcztjYXNlIlN0YW5kYXJkRW5jb2RpbmciOnJldHVybiBpO2Nhc2UiTWFjUm9tYW5FbmNvZGluZyI6cmV0dXJuIGE7Y2FzZSJTeW1ib2xTZXRFbmNvZGluZyI6cmV0dXJuIG87Y2FzZSJaYXBmRGluZ2JhdHNFbmNvZGluZyI6cmV0dXJuIGM7Y2FzZSJFeHBlcnRFbmNvZGluZyI6cmV0dXJuIHI7Y2FzZSJNYWNFeHBlcnRFbmNvZGluZyI6cmV0dXJuIG47ZGVmYXVsdDpyZXR1cm4gbnVsbH19O2NvbnN0IHI9WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbXNtYWxsIiwiSHVuZ2FydW1sYXV0c21hbGwiLCIiLCJkb2xsYXJvbGRzdHlsZSIsImRvbGxhcnN1cGVyaW9yIiwiYW1wZXJzYW5kc21hbGwiLCJBY3V0ZXNtYWxsIiwicGFyZW5sZWZ0c3VwZXJpb3IiLCJwYXJlbnJpZ2h0c3VwZXJpb3IiLCJ0d29kb3RlbmxlYWRlciIsIm9uZWRvdGVubGVhZGVyIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJmcmFjdGlvbiIsInplcm9vbGRzdHlsZSIsIm9uZW9sZHN0eWxlIiwidHdvb2xkc3R5bGUiLCJ0aHJlZW9sZHN0eWxlIiwiZm91cm9sZHN0eWxlIiwiZml2ZW9sZHN0eWxlIiwic2l4b2xkc3R5bGUiLCJzZXZlbm9sZHN0eWxlIiwiZWlnaHRvbGRzdHlsZSIsIm5pbmVvbGRzdHlsZSIsImNvbG9uIiwic2VtaWNvbG9uIiwiY29tbWFzdXBlcmlvciIsInRocmVlcXVhcnRlcnNlbWRhc2giLCJwZXJpb2RzdXBlcmlvciIsInF1ZXN0aW9uc21hbGwiLCIiLCJhc3VwZXJpb3IiLCJic3VwZXJpb3IiLCJjZW50c3VwZXJpb3IiLCJkc3VwZXJpb3IiLCJlc3VwZXJpb3IiLCIiLCIiLCIiLCJpc3VwZXJpb3IiLCIiLCIiLCJsc3VwZXJpb3IiLCJtc3VwZXJpb3IiLCJuc3VwZXJpb3IiLCJvc3VwZXJpb3IiLCIiLCIiLCJyc3VwZXJpb3IiLCJzc3VwZXJpb3IiLCJ0c3VwZXJpb3IiLCIiLCJmZiIsImZpIiwiZmwiLCJmZmkiLCJmZmwiLCJwYXJlbmxlZnRpbmZlcmlvciIsIiIsInBhcmVucmlnaHRpbmZlcmlvciIsIkNpcmN1bWZsZXhzbWFsbCIsImh5cGhlbnN1cGVyaW9yIiwiR3JhdmVzbWFsbCIsIkFzbWFsbCIsIkJzbWFsbCIsIkNzbWFsbCIsIkRzbWFsbCIsIkVzbWFsbCIsIkZzbWFsbCIsIkdzbWFsbCIsIkhzbWFsbCIsIklzbWFsbCIsIkpzbWFsbCIsIktzbWFsbCIsIkxzbWFsbCIsIk1zbWFsbCIsIk5zbWFsbCIsIk9zbWFsbCIsIlBzbWFsbCIsIlFzbWFsbCIsIlJzbWFsbCIsIlNzbWFsbCIsIlRzbWFsbCIsIlVzbWFsbCIsIlZzbWFsbCIsIldzbWFsbCIsIlhzbWFsbCIsIllzbWFsbCIsIlpzbWFsbCIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJUaWxkZXNtYWxsIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiZXhjbGFtZG93bnNtYWxsIiwiY2VudG9sZHN0eWxlIiwiTHNsYXNoc21hbGwiLCIiLCIiLCJTY2Fyb25zbWFsbCIsIlpjYXJvbnNtYWxsIiwiRGllcmVzaXNzbWFsbCIsIkJyZXZlc21hbGwiLCJDYXJvbnNtYWxsIiwiIiwiRG90YWNjZW50c21hbGwiLCIiLCIiLCJNYWNyb25zbWFsbCIsIiIsIiIsImZpZ3VyZWRhc2giLCJoeXBoZW5pbmZlcmlvciIsIiIsIiIsIk9nb25la3NtYWxsIiwiUmluZ3NtYWxsIiwiQ2VkaWxsYXNtYWxsIiwiIiwiIiwiIiwib25lcXVhcnRlciIsIm9uZWhhbGYiLCJ0aHJlZXF1YXJ0ZXJzIiwicXVlc3Rpb25kb3duc21hbGwiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiIiwiIiwiemVyb3N1cGVyaW9yIiwib25lc3VwZXJpb3IiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJmb3Vyc3VwZXJpb3IiLCJmaXZlc3VwZXJpb3IiLCJzaXhzdXBlcmlvciIsInNldmVuc3VwZXJpb3IiLCJlaWdodHN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb2luZmVyaW9yIiwib25laW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJmb3VyaW5mZXJpb3IiLCJmaXZlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsInNldmVuaW5mZXJpb3IiLCJlaWdodGluZmVyaW9yIiwibmluZWluZmVyaW9yIiwiY2VudGluZmVyaW9yIiwiZG9sbGFyaW5mZXJpb3IiLCJwZXJpb2RpbmZlcmlvciIsImNvbW1haW5mZXJpb3IiLCJBZ3JhdmVzbWFsbCIsIkFhY3V0ZXNtYWxsIiwiQWNpcmN1bWZsZXhzbWFsbCIsIkF0aWxkZXNtYWxsIiwiQWRpZXJlc2lzc21hbGwiLCJBcmluZ3NtYWxsIiwiQUVzbWFsbCIsIkNjZWRpbGxhc21hbGwiLCJFZ3JhdmVzbWFsbCIsIkVhY3V0ZXNtYWxsIiwiRWNpcmN1bWZsZXhzbWFsbCIsIkVkaWVyZXNpc3NtYWxsIiwiSWdyYXZlc21hbGwiLCJJYWN1dGVzbWFsbCIsIkljaXJjdW1mbGV4c21hbGwiLCJJZGllcmVzaXNzbWFsbCIsIkV0aHNtYWxsIiwiTnRpbGRlc21hbGwiLCJPZ3JhdmVzbWFsbCIsIk9hY3V0ZXNtYWxsIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk90aWxkZXNtYWxsIiwiT2RpZXJlc2lzc21hbGwiLCJPRXNtYWxsIiwiT3NsYXNoc21hbGwiLCJVZ3JhdmVzbWFsbCIsIlVhY3V0ZXNtYWxsIiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVkaWVyZXNpc3NtYWxsIiwiWWFjdXRlc21hbGwiLCJUaG9ybnNtYWxsIiwiWWRpZXJlc2lzc21hbGwiXTt0LkV4cGVydEVuY29kaW5nPXI7Y29uc3Qgbj1bIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsInNwYWNlIiwiZXhjbGFtc21hbGwiLCJIdW5nYXJ1bWxhdXRzbWFsbCIsImNlbnRvbGRzdHlsZSIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJhbXBlcnNhbmRzbWFsbCIsIkFjdXRlc21hbGwiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR3b2RvdGVubGVhZGVyIiwib25lZG90ZW5sZWFkZXIiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsImZyYWN0aW9uIiwiemVyb29sZHN0eWxlIiwib25lb2xkc3R5bGUiLCJ0d29vbGRzdHlsZSIsInRocmVlb2xkc3R5bGUiLCJmb3Vyb2xkc3R5bGUiLCJmaXZlb2xkc3R5bGUiLCJzaXhvbGRzdHlsZSIsInNldmVub2xkc3R5bGUiLCJlaWdodG9sZHN0eWxlIiwibmluZW9sZHN0eWxlIiwiY29sb24iLCJzZW1pY29sb24iLCIiLCJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwiIiwicXVlc3Rpb25zbWFsbCIsIiIsIiIsIiIsIiIsIkV0aHNtYWxsIiwiIiwiIiwib25lcXVhcnRlciIsIm9uZWhhbGYiLCJ0aHJlZXF1YXJ0ZXJzIiwib25lZWlnaHRoIiwidGhyZWVlaWdodGhzIiwiZml2ZWVpZ2h0aHMiLCJzZXZlbmVpZ2h0aHMiLCJvbmV0aGlyZCIsInR3b3RoaXJkcyIsIiIsIiIsIiIsIiIsIiIsIiIsImZmIiwiZmkiLCJmbCIsImZmaSIsImZmbCIsInBhcmVubGVmdGluZmVyaW9yIiwiIiwicGFyZW5yaWdodGluZmVyaW9yIiwiQ2lyY3VtZmxleHNtYWxsIiwiaHlwaGVuaW5mZXJpb3IiLCJHcmF2ZXNtYWxsIiwiQXNtYWxsIiwiQnNtYWxsIiwiQ3NtYWxsIiwiRHNtYWxsIiwiRXNtYWxsIiwiRnNtYWxsIiwiR3NtYWxsIiwiSHNtYWxsIiwiSXNtYWxsIiwiSnNtYWxsIiwiS3NtYWxsIiwiTHNtYWxsIiwiTXNtYWxsIiwiTnNtYWxsIiwiT3NtYWxsIiwiUHNtYWxsIiwiUXNtYWxsIiwiUnNtYWxsIiwiU3NtYWxsIiwiVHNtYWxsIiwiVXNtYWxsIiwiVnNtYWxsIiwiV3NtYWxsIiwiWHNtYWxsIiwiWXNtYWxsIiwiWnNtYWxsIiwiY29sb25tb25ldGFyeSIsIm9uZWZpdHRlZCIsInJ1cGlhaCIsIlRpbGRlc21hbGwiLCIiLCIiLCJhc3VwZXJpb3IiLCJjZW50c3VwZXJpb3IiLCIiLCIiLCIiLCIiLCJBYWN1dGVzbWFsbCIsIkFncmF2ZXNtYWxsIiwiQWNpcmN1bWZsZXhzbWFsbCIsIkFkaWVyZXNpc3NtYWxsIiwiQXRpbGRlc21hbGwiLCJBcmluZ3NtYWxsIiwiQ2NlZGlsbGFzbWFsbCIsIkVhY3V0ZXNtYWxsIiwiRWdyYXZlc21hbGwiLCJFY2lyY3VtZmxleHNtYWxsIiwiRWRpZXJlc2lzc21hbGwiLCJJYWN1dGVzbWFsbCIsIklncmF2ZXNtYWxsIiwiSWNpcmN1bWZsZXhzbWFsbCIsIklkaWVyZXNpc3NtYWxsIiwiTnRpbGRlc21hbGwiLCJPYWN1dGVzbWFsbCIsIk9ncmF2ZXNtYWxsIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk9kaWVyZXNpc3NtYWxsIiwiT3RpbGRlc21hbGwiLCJVYWN1dGVzbWFsbCIsIlVncmF2ZXNtYWxsIiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVkaWVyZXNpc3NtYWxsIiwiIiwiZWlnaHRzdXBlcmlvciIsImZvdXJpbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsImVpZ2h0aW5mZXJpb3IiLCJzZXZlbmluZmVyaW9yIiwiU2Nhcm9uc21hbGwiLCIiLCJjZW50aW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsIiIsIkRpZXJlc2lzc21hbGwiLCIiLCJDYXJvbnNtYWxsIiwib3N1cGVyaW9yIiwiZml2ZWluZmVyaW9yIiwiIiwiY29tbWFpbmZlcmlvciIsInBlcmlvZGluZmVyaW9yIiwiWWFjdXRlc21hbGwiLCIiLCJkb2xsYXJpbmZlcmlvciIsIiIsIiIsIlRob3Juc21hbGwiLCIiLCJuaW5laW5mZXJpb3IiLCJ6ZXJvaW5mZXJpb3IiLCJaY2Fyb25zbWFsbCIsIkFFc21hbGwiLCJPc2xhc2hzbWFsbCIsInF1ZXN0aW9uZG93bnNtYWxsIiwib25laW5mZXJpb3IiLCJMc2xhc2hzbWFsbCIsIiIsIiIsIiIsIiIsIiIsIiIsIkNlZGlsbGFzbWFsbCIsIiIsIiIsIiIsIiIsIiIsIk9Fc21hbGwiLCJmaWd1cmVkYXNoIiwiaHlwaGVuc3VwZXJpb3IiLCIiLCIiLCIiLCIiLCJleGNsYW1kb3duc21hbGwiLCIiLCJZZGllcmVzaXNzbWFsbCIsIiIsIm9uZXN1cGVyaW9yIiwidHdvc3VwZXJpb3IiLCJ0aHJlZXN1cGVyaW9yIiwiZm91cnN1cGVyaW9yIiwiZml2ZXN1cGVyaW9yIiwic2l4c3VwZXJpb3IiLCJzZXZlbnN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb3N1cGVyaW9yIiwiIiwiZXN1cGVyaW9yIiwicnN1cGVyaW9yIiwidHN1cGVyaW9yIiwiIiwiIiwiaXN1cGVyaW9yIiwic3N1cGVyaW9yIiwiZHN1cGVyaW9yIiwiIiwiIiwiIiwiIiwiIiwibHN1cGVyaW9yIiwiT2dvbmVrc21hbGwiLCJCcmV2ZXNtYWxsIiwiTWFjcm9uc21hbGwiLCJic3VwZXJpb3IiLCJuc3VwZXJpb3IiLCJtc3VwZXJpb3IiLCJjb21tYXN1cGVyaW9yIiwicGVyaW9kc3VwZXJpb3IiLCJEb3RhY2NlbnRzbWFsbCIsIlJpbmdzbWFsbCIsIiIsIiIsIiIsIiJdLGE9WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbSIsInF1b3RlZGJsIiwibnVtYmVyc2lnbiIsImRvbGxhciIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJxdW90ZXNpbmdsZSIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3RlcmlzayIsInBsdXMiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiYXQiLCJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJQIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsImJyYWNrZXRsZWZ0IiwiYmFja3NsYXNoIiwiYnJhY2tldHJpZ2h0IiwiYXNjaWljaXJjdW0iLCJ1bmRlcnNjb3JlIiwiZ3JhdmUiLCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLCJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJhc2NpaXRpbGRlIiwiIiwiQWRpZXJlc2lzIiwiQXJpbmciLCJDY2VkaWxsYSIsIkVhY3V0ZSIsIk50aWxkZSIsIk9kaWVyZXNpcyIsIlVkaWVyZXNpcyIsImFhY3V0ZSIsImFncmF2ZSIsImFjaXJjdW1mbGV4IiwiYWRpZXJlc2lzIiwiYXRpbGRlIiwiYXJpbmciLCJjY2VkaWxsYSIsImVhY3V0ZSIsImVncmF2ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiaWFjdXRlIiwiaWdyYXZlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJudGlsZGUiLCJvYWN1dGUiLCJvZ3JhdmUiLCJvY2lyY3VtZmxleCIsIm9kaWVyZXNpcyIsIm90aWxkZSIsInVhY3V0ZSIsInVncmF2ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwiZGFnZ2VyIiwiZGVncmVlIiwiY2VudCIsInN0ZXJsaW5nIiwic2VjdGlvbiIsImJ1bGxldCIsInBhcmFncmFwaCIsImdlcm1hbmRibHMiLCJyZWdpc3RlcmVkIiwiY29weXJpZ2h0IiwidHJhZGVtYXJrIiwiYWN1dGUiLCJkaWVyZXNpcyIsIm5vdGVxdWFsIiwiQUUiLCJPc2xhc2giLCJpbmZpbml0eSIsInBsdXNtaW51cyIsImxlc3NlcXVhbCIsImdyZWF0ZXJlcXVhbCIsInllbiIsIm11IiwicGFydGlhbGRpZmYiLCJzdW1tYXRpb24iLCJwcm9kdWN0IiwicGkiLCJpbnRlZ3JhbCIsIm9yZGZlbWluaW5lIiwib3JkbWFzY3VsaW5lIiwiT21lZ2EiLCJhZSIsIm9zbGFzaCIsInF1ZXN0aW9uZG93biIsImV4Y2xhbWRvd24iLCJsb2dpY2Fsbm90IiwicmFkaWNhbCIsImZsb3JpbiIsImFwcHJveGVxdWFsIiwiRGVsdGEiLCJndWlsbGVtb3RsZWZ0IiwiZ3VpbGxlbW90cmlnaHQiLCJlbGxpcHNpcyIsInNwYWNlIiwiQWdyYXZlIiwiQXRpbGRlIiwiT3RpbGRlIiwiT0UiLCJvZSIsImVuZGFzaCIsImVtZGFzaCIsInF1b3RlZGJsbGVmdCIsInF1b3RlZGJscmlnaHQiLCJxdW90ZWxlZnQiLCJxdW90ZXJpZ2h0IiwiZGl2aWRlIiwibG96ZW5nZSIsInlkaWVyZXNpcyIsIllkaWVyZXNpcyIsImZyYWN0aW9uIiwiY3VycmVuY3kiLCJndWlsc2luZ2xsZWZ0IiwiZ3VpbHNpbmdscmlnaHQiLCJmaSIsImZsIiwiZGFnZ2VyZGJsIiwicGVyaW9kY2VudGVyZWQiLCJxdW90ZXNpbmdsYmFzZSIsInF1b3RlZGJsYmFzZSIsInBlcnRob3VzYW5kIiwiQWNpcmN1bWZsZXgiLCJFY2lyY3VtZmxleCIsIkFhY3V0ZSIsIkVkaWVyZXNpcyIsIkVncmF2ZSIsIklhY3V0ZSIsIkljaXJjdW1mbGV4IiwiSWRpZXJlc2lzIiwiSWdyYXZlIiwiT2FjdXRlIiwiT2NpcmN1bWZsZXgiLCJhcHBsZSIsIk9ncmF2ZSIsIlVhY3V0ZSIsIlVjaXJjdW1mbGV4IiwiVWdyYXZlIiwiZG90bGVzc2kiLCJjaXJjdW1mbGV4IiwidGlsZGUiLCJtYWNyb24iLCJicmV2ZSIsImRvdGFjY2VudCIsInJpbmciLCJjZWRpbGxhIiwiaHVuZ2FydW1sYXV0Iiwib2dvbmVrIiwiY2Fyb24iXTt0Lk1hY1JvbWFuRW5jb2Rpbmc9YTtjb25zdCBpPVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwic3BhY2UiLCJleGNsYW0iLCJxdW90ZWRibCIsIm51bWJlcnNpZ24iLCJkb2xsYXIiLCJwZXJjZW50IiwiYW1wZXJzYW5kIiwicXVvdGVyaWdodCIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3RlcmlzayIsInBsdXMiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiYXQiLCJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJQIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsImJyYWNrZXRsZWZ0IiwiYmFja3NsYXNoIiwiYnJhY2tldHJpZ2h0IiwiYXNjaWljaXJjdW0iLCJ1bmRlcnNjb3JlIiwicXVvdGVsZWZ0IiwiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsImgiLCJpIiwiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwicCIsInEiLCJyIiwicyIsInQiLCJ1IiwidiIsInciLCJ4IiwieSIsInoiLCJicmFjZWxlZnQiLCJiYXIiLCJicmFjZXJpZ2h0IiwiYXNjaWl0aWxkZSIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsImV4Y2xhbWRvd24iLCJjZW50Iiwic3RlcmxpbmciLCJmcmFjdGlvbiIsInllbiIsImZsb3JpbiIsInNlY3Rpb24iLCJjdXJyZW5jeSIsInF1b3Rlc2luZ2xlIiwicXVvdGVkYmxsZWZ0IiwiZ3VpbGxlbW90bGVmdCIsImd1aWxzaW5nbGxlZnQiLCJndWlsc2luZ2xyaWdodCIsImZpIiwiZmwiLCIiLCJlbmRhc2giLCJkYWdnZXIiLCJkYWdnZXJkYmwiLCJwZXJpb2RjZW50ZXJlZCIsIiIsInBhcmFncmFwaCIsImJ1bGxldCIsInF1b3Rlc2luZ2xiYXNlIiwicXVvdGVkYmxiYXNlIiwicXVvdGVkYmxyaWdodCIsImd1aWxsZW1vdHJpZ2h0IiwiZWxsaXBzaXMiLCJwZXJ0aG91c2FuZCIsIiIsInF1ZXN0aW9uZG93biIsIiIsImdyYXZlIiwiYWN1dGUiLCJjaXJjdW1mbGV4IiwidGlsZGUiLCJtYWNyb24iLCJicmV2ZSIsImRvdGFjY2VudCIsImRpZXJlc2lzIiwiIiwicmluZyIsImNlZGlsbGEiLCIiLCJodW5nYXJ1bWxhdXQiLCJvZ29uZWsiLCJjYXJvbiIsImVtZGFzaCIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIkFFIiwiIiwib3JkZmVtaW5pbmUiLCIiLCIiLCIiLCIiLCJMc2xhc2giLCJPc2xhc2giLCJPRSIsIm9yZG1hc2N1bGluZSIsIiIsIiIsIiIsIiIsIiIsImFlIiwiIiwiIiwiIiwiZG90bGVzc2kiLCIiLCIiLCJsc2xhc2giLCJvc2xhc2giLCJvZSIsImdlcm1hbmRibHMiLCIiLCIiLCIiLCIiXTt0LlN0YW5kYXJkRW5jb2Rpbmc9aTtjb25zdCBzPVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwic3BhY2UiLCJleGNsYW0iLCJxdW90ZWRibCIsIm51bWJlcnNpZ24iLCJkb2xsYXIiLCJwZXJjZW50IiwiYW1wZXJzYW5kIiwicXVvdGVzaW5nbGUiLCJwYXJlbmxlZnQiLCJwYXJlbnJpZ2h0IiwiYXN0ZXJpc2siLCJwbHVzIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJzbGFzaCIsInplcm8iLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImZvdXIiLCJmaXZlIiwic2l4Iiwic2V2ZW4iLCJlaWdodCIsIm5pbmUiLCJjb2xvbiIsInNlbWljb2xvbiIsImxlc3MiLCJlcXVhbCIsImdyZWF0ZXIiLCJxdWVzdGlvbiIsImF0IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJJIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUCIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCJicmFja2V0bGVmdCIsImJhY2tzbGFzaCIsImJyYWNrZXRyaWdodCIsImFzY2lpY2lyY3VtIiwidW5kZXJzY29yZSIsImdyYXZlIiwiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsImgiLCJpIiwiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwicCIsInEiLCJyIiwicyIsInQiLCJ1IiwidiIsInciLCJ4IiwieSIsInoiLCJicmFjZWxlZnQiLCJiYXIiLCJicmFjZXJpZ2h0IiwiYXNjaWl0aWxkZSIsImJ1bGxldCIsIkV1cm8iLCJidWxsZXQiLCJxdW90ZXNpbmdsYmFzZSIsImZsb3JpbiIsInF1b3RlZGJsYmFzZSIsImVsbGlwc2lzIiwiZGFnZ2VyIiwiZGFnZ2VyZGJsIiwiY2lyY3VtZmxleCIsInBlcnRob3VzYW5kIiwiU2Nhcm9uIiwiZ3VpbHNpbmdsbGVmdCIsIk9FIiwiYnVsbGV0IiwiWmNhcm9uIiwiYnVsbGV0IiwiYnVsbGV0IiwicXVvdGVsZWZ0IiwicXVvdGVyaWdodCIsInF1b3RlZGJsbGVmdCIsInF1b3RlZGJscmlnaHQiLCJidWxsZXQiLCJlbmRhc2giLCJlbWRhc2giLCJ0aWxkZSIsInRyYWRlbWFyayIsInNjYXJvbiIsImd1aWxzaW5nbHJpZ2h0Iiwib2UiLCJidWxsZXQiLCJ6Y2Fyb24iLCJZZGllcmVzaXMiLCJzcGFjZSIsImV4Y2xhbWRvd24iLCJjZW50Iiwic3RlcmxpbmciLCJjdXJyZW5jeSIsInllbiIsImJyb2tlbmJhciIsInNlY3Rpb24iLCJkaWVyZXNpcyIsImNvcHlyaWdodCIsIm9yZGZlbWluaW5lIiwiZ3VpbGxlbW90bGVmdCIsImxvZ2ljYWxub3QiLCJoeXBoZW4iLCJyZWdpc3RlcmVkIiwibWFjcm9uIiwiZGVncmVlIiwicGx1c21pbnVzIiwidHdvc3VwZXJpb3IiLCJ0aHJlZXN1cGVyaW9yIiwiYWN1dGUiLCJtdSIsInBhcmFncmFwaCIsInBlcmlvZGNlbnRlcmVkIiwiY2VkaWxsYSIsIm9uZXN1cGVyaW9yIiwib3JkbWFzY3VsaW5lIiwiZ3VpbGxlbW90cmlnaHQiLCJvbmVxdWFydGVyIiwib25laGFsZiIsInRocmVlcXVhcnRlcnMiLCJxdWVzdGlvbmRvd24iLCJBZ3JhdmUiLCJBYWN1dGUiLCJBY2lyY3VtZmxleCIsIkF0aWxkZSIsIkFkaWVyZXNpcyIsIkFyaW5nIiwiQUUiLCJDY2VkaWxsYSIsIkVncmF2ZSIsIkVhY3V0ZSIsIkVjaXJjdW1mbGV4IiwiRWRpZXJlc2lzIiwiSWdyYXZlIiwiSWFjdXRlIiwiSWNpcmN1bWZsZXgiLCJJZGllcmVzaXMiLCJFdGgiLCJOdGlsZGUiLCJPZ3JhdmUiLCJPYWN1dGUiLCJPY2lyY3VtZmxleCIsIk90aWxkZSIsIk9kaWVyZXNpcyIsIm11bHRpcGx5IiwiT3NsYXNoIiwiVWdyYXZlIiwiVWFjdXRlIiwiVWNpcmN1bWZsZXgiLCJVZGllcmVzaXMiLCJZYWN1dGUiLCJUaG9ybiIsImdlcm1hbmRibHMiLCJhZ3JhdmUiLCJhYWN1dGUiLCJhY2lyY3VtZmxleCIsImF0aWxkZSIsImFkaWVyZXNpcyIsImFyaW5nIiwiYWUiLCJjY2VkaWxsYSIsImVncmF2ZSIsImVhY3V0ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiaWdyYXZlIiwiaWFjdXRlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJldGgiLCJudGlsZGUiLCJvZ3JhdmUiLCJvYWN1dGUiLCJvY2lyY3VtZmxleCIsIm90aWxkZSIsIm9kaWVyZXNpcyIsImRpdmlkZSIsIm9zbGFzaCIsInVncmF2ZSIsInVhY3V0ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwieWFjdXRlIiwidGhvcm4iLCJ5ZGllcmVzaXMiXTt0LldpbkFuc2lFbmNvZGluZz1zO2NvbnN0IG89WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbSIsInVuaXZlcnNhbCIsIm51bWJlcnNpZ24iLCJleGlzdGVudGlhbCIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJzdWNodGhhdCIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3Rlcmlza21hdGgiLCJwbHVzIiwiY29tbWEiLCJtaW51cyIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiY29uZ3J1ZW50IiwiQWxwaGEiLCJCZXRhIiwiQ2hpIiwiRGVsdGEiLCJFcHNpbG9uIiwiUGhpIiwiR2FtbWEiLCJFdGEiLCJJb3RhIiwidGhldGExIiwiS2FwcGEiLCJMYW1iZGEiLCJNdSIsIk51IiwiT21pY3JvbiIsIlBpIiwiVGhldGEiLCJSaG8iLCJTaWdtYSIsIlRhdSIsIlVwc2lsb24iLCJzaWdtYTEiLCJPbWVnYSIsIlhpIiwiUHNpIiwiWmV0YSIsImJyYWNrZXRsZWZ0IiwidGhlcmVmb3JlIiwiYnJhY2tldHJpZ2h0IiwicGVycGVuZGljdWxhciIsInVuZGVyc2NvcmUiLCJyYWRpY2FsZXgiLCJhbHBoYSIsImJldGEiLCJjaGkiLCJkZWx0YSIsImVwc2lsb24iLCJwaGkiLCJnYW1tYSIsImV0YSIsImlvdGEiLCJwaGkxIiwia2FwcGEiLCJsYW1iZGEiLCJtdSIsIm51Iiwib21pY3JvbiIsInBpIiwidGhldGEiLCJyaG8iLCJzaWdtYSIsInRhdSIsInVwc2lsb24iLCJvbWVnYTEiLCJvbWVnYSIsInhpIiwicHNpIiwiemV0YSIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJzaW1pbGFyIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiRXVybyIsIlVwc2lsb24xIiwibWludXRlIiwibGVzc2VxdWFsIiwiZnJhY3Rpb24iLCJpbmZpbml0eSIsImZsb3JpbiIsImNsdWIiLCJkaWFtb25kIiwiaGVhcnQiLCJzcGFkZSIsImFycm93Ym90aCIsImFycm93bGVmdCIsImFycm93dXAiLCJhcnJvd3JpZ2h0IiwiYXJyb3dkb3duIiwiZGVncmVlIiwicGx1c21pbnVzIiwic2Vjb25kIiwiZ3JlYXRlcmVxdWFsIiwibXVsdGlwbHkiLCJwcm9wb3J0aW9uYWwiLCJwYXJ0aWFsZGlmZiIsImJ1bGxldCIsImRpdmlkZSIsIm5vdGVxdWFsIiwiZXF1aXZhbGVuY2UiLCJhcHByb3hlcXVhbCIsImVsbGlwc2lzIiwiYXJyb3d2ZXJ0ZXgiLCJhcnJvd2hvcml6ZXgiLCJjYXJyaWFnZXJldHVybiIsImFsZXBoIiwiSWZyYWt0dXIiLCJSZnJha3R1ciIsIndlaWVyc3RyYXNzIiwiY2lyY2xlbXVsdGlwbHkiLCJjaXJjbGVwbHVzIiwiZW1wdHlzZXQiLCJpbnRlcnNlY3Rpb24iLCJ1bmlvbiIsInByb3BlcnN1cGVyc2V0IiwicmVmbGV4c3VwZXJzZXQiLCJub3RzdWJzZXQiLCJwcm9wZXJzdWJzZXQiLCJyZWZsZXhzdWJzZXQiLCJlbGVtZW50Iiwibm90ZWxlbWVudCIsImFuZ2xlIiwiZ3JhZGllbnQiLCJyZWdpc3RlcnNlcmlmIiwiY29weXJpZ2h0c2VyaWYiLCJ0cmFkZW1hcmtzZXJpZiIsInByb2R1Y3QiLCJyYWRpY2FsIiwiZG90bWF0aCIsImxvZ2ljYWxub3QiLCJsb2dpY2FsYW5kIiwibG9naWNhbG9yIiwiYXJyb3dkYmxib3RoIiwiYXJyb3dkYmxsZWZ0IiwiYXJyb3dkYmx1cCIsImFycm93ZGJscmlnaHQiLCJhcnJvd2RibGRvd24iLCJsb3plbmdlIiwiYW5nbGVsZWZ0IiwicmVnaXN0ZXJzYW5zIiwiY29weXJpZ2h0c2FucyIsInRyYWRlbWFya3NhbnMiLCJzdW1tYXRpb24iLCJwYXJlbmxlZnR0cCIsInBhcmVubGVmdGV4IiwicGFyZW5sZWZ0YnQiLCJicmFja2V0bGVmdHRwIiwiYnJhY2tldGxlZnRleCIsImJyYWNrZXRsZWZ0YnQiLCJicmFjZWxlZnR0cCIsImJyYWNlbGVmdG1pZCIsImJyYWNlbGVmdGJ0IiwiYnJhY2VleCIsIiIsImFuZ2xlcmlnaHQiLCJpbnRlZ3JhbCIsImludGVncmFsdHAiLCJpbnRlZ3JhbGV4IiwiaW50ZWdyYWxidCIsInBhcmVucmlnaHR0cCIsInBhcmVucmlnaHRleCIsInBhcmVucmlnaHRidCIsImJyYWNrZXRyaWdodHRwIiwiYnJhY2tldHJpZ2h0ZXgiLCJicmFja2V0cmlnaHRidCIsImJyYWNlcmlnaHR0cCIsImJyYWNlcmlnaHRtaWQiLCJicmFjZXJpZ2h0YnQiLCIiXTt0LlN5bWJvbFNldEVuY29kaW5nPW87Y29uc3QgYz1bIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsInNwYWNlIiwiYTEiLCJhMiIsImEyMDIiLCJhMyIsImE0IiwiYTUiLCJhMTE5IiwiYTExOCIsImExMTciLCJhMTEiLCJhMTIiLCJhMTMiLCJhMTQiLCJhMTUiLCJhMTYiLCJhMTA1IiwiYTE3IiwiYTE4IiwiYTE5IiwiYTIwIiwiYTIxIiwiYTIyIiwiYTIzIiwiYTI0IiwiYTI1IiwiYTI2IiwiYTI3IiwiYTI4IiwiYTYiLCJhNyIsImE4IiwiYTkiLCJhMTAiLCJhMjkiLCJhMzAiLCJhMzEiLCJhMzIiLCJhMzMiLCJhMzQiLCJhMzUiLCJhMzYiLCJhMzciLCJhMzgiLCJhMzkiLCJhNDAiLCJhNDEiLCJhNDIiLCJhNDMiLCJhNDQiLCJhNDUiLCJhNDYiLCJhNDciLCJhNDgiLCJhNDkiLCJhNTAiLCJhNTEiLCJhNTIiLCJhNTMiLCJhNTQiLCJhNTUiLCJhNTYiLCJhNTciLCJhNTgiLCJhNTkiLCJhNjAiLCJhNjEiLCJhNjIiLCJhNjMiLCJhNjQiLCJhNjUiLCJhNjYiLCJhNjciLCJhNjgiLCJhNjkiLCJhNzAiLCJhNzEiLCJhNzIiLCJhNzMiLCJhNzQiLCJhMjAzIiwiYTc1IiwiYTIwNCIsImE3NiIsImE3NyIsImE3OCIsImE3OSIsImE4MSIsImE4MiIsImE4MyIsImE4NCIsImE5NyIsImE5OCIsImE5OSIsImExMDAiLCIiLCJhODkiLCJhOTAiLCJhOTMiLCJhOTQiLCJhOTEiLCJhOTIiLCJhMjA1IiwiYTg1IiwiYTIwNiIsImE4NiIsImE4NyIsImE4OCIsImE5NSIsImE5NiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsImExMDEiLCJhMTAyIiwiYTEwMyIsImExMDQiLCJhMTA2IiwiYTEwNyIsImExMDgiLCJhMTEyIiwiYTExMSIsImExMTAiLCJhMTA5IiwiYTEyMCIsImExMjEiLCJhMTIyIiwiYTEyMyIsImExMjQiLCJhMTI1IiwiYTEyNiIsImExMjciLCJhMTI4IiwiYTEyOSIsImExMzAiLCJhMTMxIiwiYTEzMiIsImExMzMiLCJhMTM0IiwiYTEzNSIsImExMzYiLCJhMTM3IiwiYTEzOCIsImExMzkiLCJhMTQwIiwiYTE0MSIsImExNDIiLCJhMTQzIiwiYTE0NCIsImExNDUiLCJhMTQ2IiwiYTE0NyIsImExNDgiLCJhMTQ5IiwiYTE1MCIsImExNTEiLCJhMTUyIiwiYTE1MyIsImExNTQiLCJhMTU1IiwiYTE1NiIsImExNTciLCJhMTU4IiwiYTE1OSIsImExNjAiLCJhMTYxIiwiYTE2MyIsImExNjQiLCJhMTk2IiwiYTE2NSIsImExOTIiLCJhMTY2IiwiYTE2NyIsImExNjgiLCJhMTY5IiwiYTE3MCIsImExNzEiLCJhMTcyIiwiYTE3MyIsImExNjIiLCJhMTc0IiwiYTE3NSIsImExNzYiLCJhMTc3IiwiYTE3OCIsImExNzkiLCJhMTkzIiwiYTE4MCIsImExOTkiLCJhMTgxIiwiYTIwMCIsImExODIiLCIiLCJhMjAxIiwiYTE4MyIsImExODQiLCJhMTk3IiwiYTE4NSIsImExOTQiLCJhMTk4IiwiYTE4NiIsImExOTUiLCJhMTg3IiwiYTE4OCIsImExODkiLCJhMTkwIiwiYTE5MSIsIiJdO3QuWmFwZkRpbmdiYXRzRW5jb2Rpbmc9Y30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlNFQUNfQU5BTFlTSVNfRU5BQkxFRD10Lk1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZz10LkZvbnRGbGFncz12b2lkIDAsdC5ub3JtYWxpemVGb250TmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlQWxsKC9bLF9dL2csIi0iKS5yZXBsYWNlQWxsKC9ccy9nLCIiKX0sdC5yZWNvdmVyR2x5cGhOYW1lPWMsdC50eXBlMUZvbnRHbHlwaE1hcHBpbmc9ZnVuY3Rpb24oZSx0LHIpe2NvbnN0IGk9T2JqZWN0LmNyZWF0ZShudWxsKTtsZXQgcyxsLGg7Y29uc3QgdT0hIShlLmZsYWdzJm8uU3ltYm9saWMpO2lmKGUuaXNJbnRlcm5hbEZvbnQpZm9yKGg9dCxsPTA7bDxoLmxlbmd0aDtsKyspcz1yLmluZGV4T2YoaFtsXSksaVtsXT1zPj0wP3M6MDtlbHNlIGlmKGUuYmFzZUVuY29kaW5nTmFtZSlmb3IoaD0oMCxuLmdldEVuY29kaW5nKShlLmJhc2VFbmNvZGluZ05hbWUpLGw9MDtsPGgubGVuZ3RoO2wrKylzPXIuaW5kZXhPZihoW2xdKSxpW2xdPXM+PTA/czowO2Vsc2UgaWYodSlmb3IobCBpbiB0KWlbbF09dFtsXTtlbHNlIGZvcihoPW4uU3RhbmRhcmRFbmNvZGluZyxsPTA7bDxoLmxlbmd0aDtsKyspcz1yLmluZGV4T2YoaFtsXSksaVtsXT1zPj0wP3M6MDtjb25zdCBkPWUuZGlmZmVyZW5jZXM7bGV0IGY7aWYoZClmb3IobCBpbiBkKXtjb25zdCBlPWRbbF07aWYocz1yLmluZGV4T2YoZSksLTE9PT1zKXtmfHwoZj0oMCxhLmdldEdseXBoc1VuaWNvZGUpKCkpO2NvbnN0IHQ9YyhlLGYpO3QhPT1lJiYocz1yLmluZGV4T2YodCkpfWlbbF09cz49MD9zOjB9cmV0dXJuIGl9LHIoMTU3KTt2YXIgbj1yKDE4NyksYT1yKDE4OSksaT1yKDE5MCkscz1yKDE0NCk7dC5TRUFDX0FOQUxZU0lTX0VOQUJMRUQ9ITA7Y29uc3Qgbz17Rml4ZWRQaXRjaDoxLFNlcmlmOjIsU3ltYm9saWM6NCxTY3JpcHQ6OCxOb25zeW1ib2xpYzozMixJdGFsaWM6NjQsQWxsQ2FwOjY1NTM2LFNtYWxsQ2FwOjEzMTA3MixGb3JjZUJvbGQ6MjYyMTQ0fTtmdW5jdGlvbiBjKGUsdCl7aWYodm9pZCAwIT09dFtlXSlyZXR1cm4gZTtjb25zdCByPSgwLGkuZ2V0VW5pY29kZUZvckdseXBoKShlLHQpO2lmKC0xIT09cilmb3IoY29uc3QgZSBpbiB0KWlmKHRbZV09PT1yKXJldHVybiBlO3JldHVybigwLHMuaW5mbykoIlVuYWJsZSB0byByZWNvdmVyIGEgc3RhbmRhcmQgZ2x5cGggbmFtZSBmb3I6ICIrZSksZX10LkZvbnRGbGFncz1vLHQuTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nPVsiLm5vdGRlZiIsIi5udWxsIiwibm9ubWFya2luZ3JldHVybiIsInNwYWNlIiwiZXhjbGFtIiwicXVvdGVkYmwiLCJudW1iZXJzaWduIiwiZG9sbGFyIiwicGVyY2VudCIsImFtcGVyc2FuZCIsInF1b3Rlc2luZ2xlIiwicGFyZW5sZWZ0IiwicGFyZW5yaWdodCIsImFzdGVyaXNrIiwicGx1cyIsImNvbW1hIiwiaHlwaGVuIiwicGVyaW9kIiwic2xhc2giLCJ6ZXJvIiwib25lIiwidHdvIiwidGhyZWUiLCJmb3VyIiwiZml2ZSIsInNpeCIsInNldmVuIiwiZWlnaHQiLCJuaW5lIiwiY29sb24iLCJzZW1pY29sb24iLCJsZXNzIiwiZXF1YWwiLCJncmVhdGVyIiwicXVlc3Rpb24iLCJhdCIsIkEiLCJCIiwiQyIsIkQiLCJFIiwiRiIsIkciLCJIIiwiSSIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlAiLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiYnJhY2tldGxlZnQiLCJiYWNrc2xhc2giLCJicmFja2V0cmlnaHQiLCJhc2NpaWNpcmN1bSIsInVuZGVyc2NvcmUiLCJncmF2ZSIsImEiLCJiIiwiYyIsImQiLCJlIiwiZiIsImciLCJoIiwiaSIsImoiLCJrIiwibCIsIm0iLCJuIiwibyIsInAiLCJxIiwiciIsInMiLCJ0IiwidSIsInYiLCJ3IiwieCIsInkiLCJ6IiwiYnJhY2VsZWZ0IiwiYmFyIiwiYnJhY2VyaWdodCIsImFzY2lpdGlsZGUiLCJBZGllcmVzaXMiLCJBcmluZyIsIkNjZWRpbGxhIiwiRWFjdXRlIiwiTnRpbGRlIiwiT2RpZXJlc2lzIiwiVWRpZXJlc2lzIiwiYWFjdXRlIiwiYWdyYXZlIiwiYWNpcmN1bWZsZXgiLCJhZGllcmVzaXMiLCJhdGlsZGUiLCJhcmluZyIsImNjZWRpbGxhIiwiZWFjdXRlIiwiZWdyYXZlIiwiZWNpcmN1bWZsZXgiLCJlZGllcmVzaXMiLCJpYWN1dGUiLCJpZ3JhdmUiLCJpY2lyY3VtZmxleCIsImlkaWVyZXNpcyIsIm50aWxkZSIsIm9hY3V0ZSIsIm9ncmF2ZSIsIm9jaXJjdW1mbGV4Iiwib2RpZXJlc2lzIiwib3RpbGRlIiwidWFjdXRlIiwidWdyYXZlIiwidWNpcmN1bWZsZXgiLCJ1ZGllcmVzaXMiLCJkYWdnZXIiLCJkZWdyZWUiLCJjZW50Iiwic3RlcmxpbmciLCJzZWN0aW9uIiwiYnVsbGV0IiwicGFyYWdyYXBoIiwiZ2VybWFuZGJscyIsInJlZ2lzdGVyZWQiLCJjb3B5cmlnaHQiLCJ0cmFkZW1hcmsiLCJhY3V0ZSIsImRpZXJlc2lzIiwibm90ZXF1YWwiLCJBRSIsIk9zbGFzaCIsImluZmluaXR5IiwicGx1c21pbnVzIiwibGVzc2VxdWFsIiwiZ3JlYXRlcmVxdWFsIiwieWVuIiwibXUiLCJwYXJ0aWFsZGlmZiIsInN1bW1hdGlvbiIsInByb2R1Y3QiLCJwaSIsImludGVncmFsIiwib3JkZmVtaW5pbmUiLCJvcmRtYXNjdWxpbmUiLCJPbWVnYSIsImFlIiwib3NsYXNoIiwicXVlc3Rpb25kb3duIiwiZXhjbGFtZG93biIsImxvZ2ljYWxub3QiLCJyYWRpY2FsIiwiZmxvcmluIiwiYXBwcm94ZXF1YWwiLCJEZWx0YSIsImd1aWxsZW1vdGxlZnQiLCJndWlsbGVtb3RyaWdodCIsImVsbGlwc2lzIiwibm9uYnJlYWtpbmdzcGFjZSIsIkFncmF2ZSIsIkF0aWxkZSIsIk90aWxkZSIsIk9FIiwib2UiLCJlbmRhc2giLCJlbWRhc2giLCJxdW90ZWRibGxlZnQiLCJxdW90ZWRibHJpZ2h0IiwicXVvdGVsZWZ0IiwicXVvdGVyaWdodCIsImRpdmlkZSIsImxvemVuZ2UiLCJ5ZGllcmVzaXMiLCJZZGllcmVzaXMiLCJmcmFjdGlvbiIsImN1cnJlbmN5IiwiZ3VpbHNpbmdsbGVmdCIsImd1aWxzaW5nbHJpZ2h0IiwiZmkiLCJmbCIsImRhZ2dlcmRibCIsInBlcmlvZGNlbnRlcmVkIiwicXVvdGVzaW5nbGJhc2UiLCJxdW90ZWRibGJhc2UiLCJwZXJ0aG91c2FuZCIsIkFjaXJjdW1mbGV4IiwiRWNpcmN1bWZsZXgiLCJBYWN1dGUiLCJFZGllcmVzaXMiLCJFZ3JhdmUiLCJJYWN1dGUiLCJJY2lyY3VtZmxleCIsIklkaWVyZXNpcyIsIklncmF2ZSIsIk9hY3V0ZSIsIk9jaXJjdW1mbGV4IiwiYXBwbGUiLCJPZ3JhdmUiLCJVYWN1dGUiLCJVY2lyY3VtZmxleCIsIlVncmF2ZSIsImRvdGxlc3NpIiwiY2lyY3VtZmxleCIsInRpbGRlIiwibWFjcm9uIiwiYnJldmUiLCJkb3RhY2NlbnQiLCJyaW5nIiwiY2VkaWxsYSIsImh1bmdhcnVtbGF1dCIsIm9nb25layIsImNhcm9uIiwiTHNsYXNoIiwibHNsYXNoIiwiU2Nhcm9uIiwic2Nhcm9uIiwiWmNhcm9uIiwiemNhcm9uIiwiYnJva2VuYmFyIiwiRXRoIiwiZXRoIiwiWWFjdXRlIiwieWFjdXRlIiwiVGhvcm4iLCJ0aG9ybiIsIm1pbnVzIiwibXVsdGlwbHkiLCJvbmVzdXBlcmlvciIsInR3b3N1cGVyaW9yIiwidGhyZWVzdXBlcmlvciIsIm9uZWhhbGYiLCJvbmVxdWFydGVyIiwidGhyZWVxdWFydGVycyIsImZyYW5jIiwiR2JyZXZlIiwiZ2JyZXZlIiwiSWRvdGFjY2VudCIsIlNjZWRpbGxhIiwic2NlZGlsbGEiLCJDYWN1dGUiLCJjYWN1dGUiLCJDY2Fyb24iLCJjY2Fyb24iLCJkY3JvYXQiXX0sKGUsdCxyKT0+e3Iucih0KSxyLmQodCx7Z2V0RGluZ2JhdHNHbHlwaHNVbmljb2RlOigpPT5pLGdldEdseXBoc1VuaWNvZGU6KCk9PmF9KTt2YXIgbj1yKDE0OSk7Y29uc3QgYT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2UuQT02NSxlLkFFPTE5OCxlLkFFYWN1dGU9NTA4LGUuQUVtYWNyb249NDgyLGUuQUVzbWFsbD02MzQ2MixlLkFhY3V0ZT0xOTMsZS5BYWN1dGVzbWFsbD02MzQ1NyxlLkFicmV2ZT0yNTgsZS5BYnJldmVhY3V0ZT03ODU0LGUuQWJyZXZlY3lyaWxsaWM9MTIzMixlLkFicmV2ZWRvdGJlbG93PTc4NjIsZS5BYnJldmVncmF2ZT03ODU2LGUuQWJyZXZlaG9va2Fib3ZlPTc4NTgsZS5BYnJldmV0aWxkZT03ODYwLGUuQWNhcm9uPTQ2MSxlLkFjaXJjbGU9OTM5OCxlLkFjaXJjdW1mbGV4PTE5NCxlLkFjaXJjdW1mbGV4YWN1dGU9Nzg0NCxlLkFjaXJjdW1mbGV4ZG90YmVsb3c9Nzg1MixlLkFjaXJjdW1mbGV4Z3JhdmU9Nzg0NixlLkFjaXJjdW1mbGV4aG9va2Fib3ZlPTc4NDgsZS5BY2lyY3VtZmxleHNtYWxsPTYzNDU4LGUuQWNpcmN1bWZsZXh0aWxkZT03ODUwLGUuQWN1dGU9NjMxNzcsZS5BY3V0ZXNtYWxsPTYzNDEyLGUuQWN5cmlsbGljPTEwNDAsZS5BZGJsZ3JhdmU9NTEyLGUuQWRpZXJlc2lzPTE5NixlLkFkaWVyZXNpc2N5cmlsbGljPTEyMzQsZS5BZGllcmVzaXNtYWNyb249NDc4LGUuQWRpZXJlc2lzc21hbGw9NjM0NjAsZS5BZG90YmVsb3c9Nzg0MCxlLkFkb3RtYWNyb249NDgwLGUuQWdyYXZlPTE5MixlLkFncmF2ZXNtYWxsPTYzNDU2LGUuQWhvb2thYm92ZT03ODQyLGUuQWllY3lyaWxsaWM9MTIzNixlLkFpbnZlcnRlZGJyZXZlPTUxNCxlLkFscGhhPTkxMyxlLkFscGhhdG9ub3M9OTAyLGUuQW1hY3Jvbj0yNTYsZS5BbW9ub3NwYWNlPTY1MzEzLGUuQW9nb25laz0yNjAsZS5BcmluZz0xOTcsZS5BcmluZ2FjdXRlPTUwNixlLkFyaW5nYmVsb3c9NzY4MCxlLkFyaW5nc21hbGw9NjM0NjEsZS5Bc21hbGw9NjMzMjksZS5BdGlsZGU9MTk1LGUuQXRpbGRlc21hbGw9NjM0NTksZS5BeWJhcm1lbmlhbj0xMzI5LGUuQj02NixlLkJjaXJjbGU9OTM5OSxlLkJkb3RhY2NlbnQ9NzY4MixlLkJkb3RiZWxvdz03Njg0LGUuQmVjeXJpbGxpYz0xMDQxLGUuQmVuYXJtZW5pYW49MTMzMCxlLkJldGE9OTE0LGUuQmhvb2s9Mzg1LGUuQmxpbmViZWxvdz03Njg2LGUuQm1vbm9zcGFjZT02NTMxNCxlLkJyZXZlc21hbGw9NjMyMjAsZS5Cc21hbGw9NjMzMzAsZS5CdG9wYmFyPTM4NixlLkM9NjcsZS5DYWFybWVuaWFuPTEzNDIsZS5DYWN1dGU9MjYyLGUuQ2Fyb249NjMxNzgsZS5DYXJvbnNtYWxsPTYzMjIxLGUuQ2Nhcm9uPTI2OCxlLkNjZWRpbGxhPTE5OSxlLkNjZWRpbGxhYWN1dGU9NzY4OCxlLkNjZWRpbGxhc21hbGw9NjM0NjMsZS5DY2lyY2xlPTk0MDAsZS5DY2lyY3VtZmxleD0yNjQsZS5DZG90PTI2NixlLkNkb3RhY2NlbnQ9MjY2LGUuQ2VkaWxsYXNtYWxsPTYzNDE2LGUuQ2hhYXJtZW5pYW49MTM1MyxlLkNoZWFia2hhc2lhbmN5cmlsbGljPTEyMTIsZS5DaGVjeXJpbGxpYz0xMDYzLGUuQ2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWM9MTIxNCxlLkNoZWRlc2NlbmRlcmN5cmlsbGljPTEyMDYsZS5DaGVkaWVyZXNpc2N5cmlsbGljPTEyNjgsZS5DaGVoYXJtZW5pYW49MTM0NyxlLkNoZWtoYWthc3NpYW5jeXJpbGxpYz0xMjI3LGUuQ2hldmVydGljYWxzdHJva2VjeXJpbGxpYz0xMjA4LGUuQ2hpPTkzNSxlLkNob29rPTM5MSxlLkNpcmN1bWZsZXhzbWFsbD02MzIyMixlLkNtb25vc3BhY2U9NjUzMTUsZS5Db2FybWVuaWFuPTEzNjEsZS5Dc21hbGw9NjMzMzEsZS5EPTY4LGUuRFo9NDk3LGUuRFpjYXJvbj00NTIsZS5EYWFybWVuaWFuPTEzMzIsZS5EYWZyaWNhbj0zOTMsZS5EY2Fyb249MjcwLGUuRGNlZGlsbGE9NzY5NixlLkRjaXJjbGU9OTQwMSxlLkRjaXJjdW1mbGV4YmVsb3c9NzY5OCxlLkRjcm9hdD0yNzIsZS5EZG90YWNjZW50PTc2OTAsZS5EZG90YmVsb3c9NzY5MixlLkRlY3lyaWxsaWM9MTA0NCxlLkRlaWNvcHRpYz0xMDA2LGUuRGVsdGE9ODcxMCxlLkRlbHRhZ3JlZWs9OTE2LGUuRGhvb2s9Mzk0LGUuRGllcmVzaXM9NjMxNzksZS5EaWVyZXNpc0FjdXRlPTYzMTgwLGUuRGllcmVzaXNHcmF2ZT02MzE4MSxlLkRpZXJlc2lzc21hbGw9NjM0MDAsZS5EaWdhbW1hZ3JlZWs9OTg4LGUuRGplY3lyaWxsaWM9MTAyNixlLkRsaW5lYmVsb3c9NzY5NCxlLkRtb25vc3BhY2U9NjUzMTYsZS5Eb3RhY2NlbnRzbWFsbD02MzIyMyxlLkRzbGFzaD0yNzIsZS5Ec21hbGw9NjMzMzIsZS5EdG9wYmFyPTM5NSxlLkR6PTQ5OCxlLkR6Y2Fyb249NDUzLGUuRHplYWJraGFzaWFuY3lyaWxsaWM9MTI0OCxlLkR6ZWN5cmlsbGljPTEwMjksZS5EemhlY3lyaWxsaWM9MTAzOSxlLkU9NjksZS5FYWN1dGU9MjAxLGUuRWFjdXRlc21hbGw9NjM0NjUsZS5FYnJldmU9Mjc2LGUuRWNhcm9uPTI4MixlLkVjZWRpbGxhYnJldmU9NzcwOCxlLkVjaGFybWVuaWFuPTEzMzMsZS5FY2lyY2xlPTk0MDIsZS5FY2lyY3VtZmxleD0yMDIsZS5FY2lyY3VtZmxleGFjdXRlPTc4NzAsZS5FY2lyY3VtZmxleGJlbG93PTc3MDQsZS5FY2lyY3VtZmxleGRvdGJlbG93PTc4NzgsZS5FY2lyY3VtZmxleGdyYXZlPTc4NzIsZS5FY2lyY3VtZmxleGhvb2thYm92ZT03ODc0LGUuRWNpcmN1bWZsZXhzbWFsbD02MzQ2NixlLkVjaXJjdW1mbGV4dGlsZGU9Nzg3NixlLkVjeXJpbGxpYz0xMDI4LGUuRWRibGdyYXZlPTUxNixlLkVkaWVyZXNpcz0yMDMsZS5FZGllcmVzaXNzbWFsbD02MzQ2NyxlLkVkb3Q9Mjc4LGUuRWRvdGFjY2VudD0yNzgsZS5FZG90YmVsb3c9Nzg2NCxlLkVmY3lyaWxsaWM9MTA2MCxlLkVncmF2ZT0yMDAsZS5FZ3JhdmVzbWFsbD02MzQ2NCxlLkVoYXJtZW5pYW49MTMzNSxlLkVob29rYWJvdmU9Nzg2NixlLkVpZ2h0cm9tYW49ODU1MSxlLkVpbnZlcnRlZGJyZXZlPTUxOCxlLkVpb3RpZmllZGN5cmlsbGljPTExMjQsZS5FbGN5cmlsbGljPTEwNTEsZS5FbGV2ZW5yb21hbj04NTU0LGUuRW1hY3Jvbj0yNzQsZS5FbWFjcm9uYWN1dGU9NzcwMixlLkVtYWNyb25ncmF2ZT03NzAwLGUuRW1jeXJpbGxpYz0xMDUyLGUuRW1vbm9zcGFjZT02NTMxNyxlLkVuY3lyaWxsaWM9MTA1MyxlLkVuZGVzY2VuZGVyY3lyaWxsaWM9MTE4NixlLkVuZz0zMzAsZS5FbmdoZWN5cmlsbGljPTExODgsZS5Fbmhvb2tjeXJpbGxpYz0xMjIzLGUuRW9nb25laz0yODAsZS5Fb3Blbj00MDAsZS5FcHNpbG9uPTkxNyxlLkVwc2lsb250b25vcz05MDQsZS5FcmN5cmlsbGljPTEwNTYsZS5FcmV2ZXJzZWQ9Mzk4LGUuRXJldmVyc2VkY3lyaWxsaWM9MTA2OSxlLkVzY3lyaWxsaWM9MTA1NyxlLkVzZGVzY2VuZGVyY3lyaWxsaWM9MTE5NCxlLkVzaD00MjUsZS5Fc21hbGw9NjMzMzMsZS5FdGE9OTE5LGUuRXRhcm1lbmlhbj0xMzM2LGUuRXRhdG9ub3M9OTA1LGUuRXRoPTIwOCxlLkV0aHNtYWxsPTYzNDcyLGUuRXRpbGRlPTc4NjgsZS5FdGlsZGViZWxvdz03NzA2LGUuRXVybz04MzY0LGUuRXpoPTQzOSxlLkV6aGNhcm9uPTQ5NCxlLkV6aHJldmVyc2VkPTQ0MCxlLkY9NzAsZS5GY2lyY2xlPTk0MDMsZS5GZG90YWNjZW50PTc3MTAsZS5GZWhhcm1lbmlhbj0xMzY2LGUuRmVpY29wdGljPTk5NixlLkZob29rPTQwMSxlLkZpdGFjeXJpbGxpYz0xMTM4LGUuRml2ZXJvbWFuPTg1NDgsZS5GbW9ub3NwYWNlPTY1MzE4LGUuRm91cnJvbWFuPTg1NDcsZS5Gc21hbGw9NjMzMzQsZS5HPTcxLGUuR0JzcXVhcmU9MTMxOTEsZS5HYWN1dGU9NTAwLGUuR2FtbWE9OTE1LGUuR2FtbWFhZnJpY2FuPTQwNCxlLkdhbmdpYWNvcHRpYz0xMDAyLGUuR2JyZXZlPTI4NixlLkdjYXJvbj00ODYsZS5HY2VkaWxsYT0yOTAsZS5HY2lyY2xlPTk0MDQsZS5HY2lyY3VtZmxleD0yODQsZS5HY29tbWFhY2NlbnQ9MjkwLGUuR2RvdD0yODgsZS5HZG90YWNjZW50PTI4OCxlLkdlY3lyaWxsaWM9MTA0MyxlLkdoYWRhcm1lbmlhbj0xMzQ2LGUuR2hlbWlkZGxlaG9va2N5cmlsbGljPTExNzIsZS5HaGVzdHJva2VjeXJpbGxpYz0xMTcwLGUuR2hldXB0dXJuY3lyaWxsaWM9MTE2OCxlLkdob29rPTQwMyxlLkdpbWFybWVuaWFuPTEzMzEsZS5HamVjeXJpbGxpYz0xMDI3LGUuR21hY3Jvbj03NzEyLGUuR21vbm9zcGFjZT02NTMxOSxlLkdyYXZlPTYzMTgyLGUuR3JhdmVzbWFsbD02MzMyOCxlLkdzbWFsbD02MzMzNSxlLkdzbWFsbGhvb2s9NjY3LGUuR3N0cm9rZT00ODQsZS5IPTcyLGUuSDE4NTMzPTk2NzksZS5IMTg1NDM9OTY0MixlLkgxODU1MT05NjQzLGUuSDIyMDczPTk2MzMsZS5IUHNxdWFyZT0xMzI1OSxlLkhhYWJraGFzaWFuY3lyaWxsaWM9MTE5MixlLkhhZGVzY2VuZGVyY3lyaWxsaWM9MTIwMixlLkhhcmRzaWduY3lyaWxsaWM9MTA2NixlLkhiYXI9Mjk0LGUuSGJyZXZlYmVsb3c9NzcyMixlLkhjZWRpbGxhPTc3MjAsZS5IY2lyY2xlPTk0MDUsZS5IY2lyY3VtZmxleD0yOTIsZS5IZGllcmVzaXM9NzcxOCxlLkhkb3RhY2NlbnQ9NzcxNCxlLkhkb3RiZWxvdz03NzE2LGUuSG1vbm9zcGFjZT02NTMyMCxlLkhvYXJtZW5pYW49MTM0NCxlLkhvcmljb3B0aWM9MWUzLGUuSHNtYWxsPTYzMzM2LGUuSHVuZ2FydW1sYXV0PTYzMTgzLGUuSHVuZ2FydW1sYXV0c21hbGw9NjMyMjQsZS5IenNxdWFyZT0xMzIwMCxlLkk9NzMsZS5JQWN5cmlsbGljPTEwNzEsZS5JSj0zMDYsZS5JVWN5cmlsbGljPTEwNzAsZS5JYWN1dGU9MjA1LGUuSWFjdXRlc21hbGw9NjM0NjksZS5JYnJldmU9MzAwLGUuSWNhcm9uPTQ2MyxlLkljaXJjbGU9OTQwNixlLkljaXJjdW1mbGV4PTIwNixlLkljaXJjdW1mbGV4c21hbGw9NjM0NzAsZS5JY3lyaWxsaWM9MTAzMCxlLklkYmxncmF2ZT01MjAsZS5JZGllcmVzaXM9MjA3LGUuSWRpZXJlc2lzYWN1dGU9NzcyNixlLklkaWVyZXNpc2N5cmlsbGljPTEyNTIsZS5JZGllcmVzaXNzbWFsbD02MzQ3MSxlLklkb3Q9MzA0LGUuSWRvdGFjY2VudD0zMDQsZS5JZG90YmVsb3c9Nzg4MixlLkllYnJldmVjeXJpbGxpYz0xMjM4LGUuSWVjeXJpbGxpYz0xMDQ1LGUuSWZyYWt0dXI9ODQ2NSxlLklncmF2ZT0yMDQsZS5JZ3JhdmVzbWFsbD02MzQ2OCxlLklob29rYWJvdmU9Nzg4MCxlLklpY3lyaWxsaWM9MTA0OCxlLklpbnZlcnRlZGJyZXZlPTUyMixlLklpc2hvcnRjeXJpbGxpYz0xMDQ5LGUuSW1hY3Jvbj0yOTgsZS5JbWFjcm9uY3lyaWxsaWM9MTI1MCxlLkltb25vc3BhY2U9NjUzMjEsZS5Jbmlhcm1lbmlhbj0xMzM5LGUuSW9jeXJpbGxpYz0xMDI1LGUuSW9nb25laz0zMDIsZS5Jb3RhPTkyMSxlLklvdGFhZnJpY2FuPTQwNixlLklvdGFkaWVyZXNpcz05MzgsZS5Jb3RhdG9ub3M9OTA2LGUuSXNtYWxsPTYzMzM3LGUuSXN0cm9rZT00MDcsZS5JdGlsZGU9Mjk2LGUuSXRpbGRlYmVsb3c9NzcyNCxlLkl6aGl0c2FjeXJpbGxpYz0xMTQwLGUuSXpoaXRzYWRibGdyYXZlY3lyaWxsaWM9MTE0MixlLko9NzQsZS5KYWFybWVuaWFuPTEzNDUsZS5KY2lyY2xlPTk0MDcsZS5KY2lyY3VtZmxleD0zMDgsZS5KZWN5cmlsbGljPTEwMzIsZS5KaGVoYXJtZW5pYW49MTM1NSxlLkptb25vc3BhY2U9NjUzMjIsZS5Kc21hbGw9NjMzMzgsZS5LPTc1LGUuS0JzcXVhcmU9MTMxODksZS5LS3NxdWFyZT0xMzI2MSxlLkthYmFzaGtpcmN5cmlsbGljPTExODQsZS5LYWN1dGU9NzcyOCxlLkthY3lyaWxsaWM9MTA1MCxlLkthZGVzY2VuZGVyY3lyaWxsaWM9MTE3OCxlLkthaG9va2N5cmlsbGljPTEyMTksZS5LYXBwYT05MjIsZS5LYXN0cm9rZWN5cmlsbGljPTExODIsZS5LYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWM9MTE4MCxlLktjYXJvbj00ODgsZS5LY2VkaWxsYT0zMTAsZS5LY2lyY2xlPTk0MDgsZS5LY29tbWFhY2NlbnQ9MzEwLGUuS2RvdGJlbG93PTc3MzAsZS5LZWhhcm1lbmlhbj0xMzY0LGUuS2VuYXJtZW5pYW49MTM0MyxlLktoYWN5cmlsbGljPTEwNjEsZS5LaGVpY29wdGljPTk5OCxlLktob29rPTQwOCxlLktqZWN5cmlsbGljPTEwMzYsZS5LbGluZWJlbG93PTc3MzIsZS5LbW9ub3NwYWNlPTY1MzIzLGUuS29wcGFjeXJpbGxpYz0xMTUyLGUuS29wcGFncmVlaz05OTAsZS5Lc2ljeXJpbGxpYz0xMTM0LGUuS3NtYWxsPTYzMzM5LGUuTD03NixlLkxKPTQ1NSxlLkxMPTYzMTY3LGUuTGFjdXRlPTMxMyxlLkxhbWJkYT05MjMsZS5MY2Fyb249MzE3LGUuTGNlZGlsbGE9MzE1LGUuTGNpcmNsZT05NDA5LGUuTGNpcmN1bWZsZXhiZWxvdz03NzQwLGUuTGNvbW1hYWNjZW50PTMxNSxlLkxkb3Q9MzE5LGUuTGRvdGFjY2VudD0zMTksZS5MZG90YmVsb3c9NzczNCxlLkxkb3RiZWxvd21hY3Jvbj03NzM2LGUuTGl3bmFybWVuaWFuPTEzNDAsZS5Maj00NTYsZS5MamVjeXJpbGxpYz0xMDMzLGUuTGxpbmViZWxvdz03NzM4LGUuTG1vbm9zcGFjZT02NTMyNCxlLkxzbGFzaD0zMjEsZS5Mc2xhc2hzbWFsbD02MzIyNSxlLkxzbWFsbD02MzM0MCxlLk09NzcsZS5NQnNxdWFyZT0xMzE5MCxlLk1hY3Jvbj02MzE4NCxlLk1hY3JvbnNtYWxsPTYzNDA3LGUuTWFjdXRlPTc3NDIsZS5NY2lyY2xlPTk0MTAsZS5NZG90YWNjZW50PTc3NDQsZS5NZG90YmVsb3c9Nzc0NixlLk1lbmFybWVuaWFuPTEzNDgsZS5NbW9ub3NwYWNlPTY1MzI1LGUuTXNtYWxsPTYzMzQxLGUuTXR1cm5lZD00MTIsZS5NdT05MjQsZS5OPTc4LGUuTko9NDU4LGUuTmFjdXRlPTMyMyxlLk5jYXJvbj0zMjcsZS5OY2VkaWxsYT0zMjUsZS5OY2lyY2xlPTk0MTEsZS5OY2lyY3VtZmxleGJlbG93PTc3NTQsZS5OY29tbWFhY2NlbnQ9MzI1LGUuTmRvdGFjY2VudD03NzQ4LGUuTmRvdGJlbG93PTc3NTAsZS5OaG9va2xlZnQ9NDEzLGUuTmluZXJvbWFuPTg1NTIsZS5Oaj00NTksZS5OamVjeXJpbGxpYz0xMDM0LGUuTmxpbmViZWxvdz03NzUyLGUuTm1vbm9zcGFjZT02NTMyNixlLk5vd2FybWVuaWFuPTEzNTAsZS5Oc21hbGw9NjMzNDIsZS5OdGlsZGU9MjA5LGUuTnRpbGRlc21hbGw9NjM0NzMsZS5OdT05MjUsZS5PPTc5LGUuT0U9MzM4LGUuT0VzbWFsbD02MzIyNixlLk9hY3V0ZT0yMTEsZS5PYWN1dGVzbWFsbD02MzQ3NSxlLk9iYXJyZWRjeXJpbGxpYz0xMjU2LGUuT2JhcnJlZGRpZXJlc2lzY3lyaWxsaWM9MTI1OCxlLk9icmV2ZT0zMzQsZS5PY2Fyb249NDY1LGUuT2NlbnRlcmVkdGlsZGU9NDE1LGUuT2NpcmNsZT05NDEyLGUuT2NpcmN1bWZsZXg9MjEyLGUuT2NpcmN1bWZsZXhhY3V0ZT03ODg4LGUuT2NpcmN1bWZsZXhkb3RiZWxvdz03ODk2LGUuT2NpcmN1bWZsZXhncmF2ZT03ODkwLGUuT2NpcmN1bWZsZXhob29rYWJvdmU9Nzg5MixlLk9jaXJjdW1mbGV4c21hbGw9NjM0NzYsZS5PY2lyY3VtZmxleHRpbGRlPTc4OTQsZS5PY3lyaWxsaWM9MTA1NCxlLk9kYmxhY3V0ZT0zMzYsZS5PZGJsZ3JhdmU9NTI0LGUuT2RpZXJlc2lzPTIxNCxlLk9kaWVyZXNpc2N5cmlsbGljPTEyNTQsZS5PZGllcmVzaXNzbWFsbD02MzQ3OCxlLk9kb3RiZWxvdz03ODg0LGUuT2dvbmVrc21hbGw9NjMyMjcsZS5PZ3JhdmU9MjEwLGUuT2dyYXZlc21hbGw9NjM0NzQsZS5PaGFybWVuaWFuPTEzNjUsZS5PaG09ODQ4NixlLk9ob29rYWJvdmU9Nzg4NixlLk9ob3JuPTQxNixlLk9ob3JuYWN1dGU9Nzg5OCxlLk9ob3JuZG90YmVsb3c9NzkwNixlLk9ob3JuZ3JhdmU9NzkwMCxlLk9ob3JuaG9va2Fib3ZlPTc5MDIsZS5PaG9ybnRpbGRlPTc5MDQsZS5PaHVuZ2FydW1sYXV0PTMzNixlLk9pPTQxOCxlLk9pbnZlcnRlZGJyZXZlPTUyNixlLk9tYWNyb249MzMyLGUuT21hY3JvbmFjdXRlPTc3NjIsZS5PbWFjcm9uZ3JhdmU9Nzc2MCxlLk9tZWdhPTg0ODYsZS5PbWVnYWN5cmlsbGljPTExMjAsZS5PbWVnYWdyZWVrPTkzNyxlLk9tZWdhcm91bmRjeXJpbGxpYz0xMTQ2LGUuT21lZ2F0aXRsb2N5cmlsbGljPTExNDgsZS5PbWVnYXRvbm9zPTkxMSxlLk9taWNyb249OTI3LGUuT21pY3JvbnRvbm9zPTkwOCxlLk9tb25vc3BhY2U9NjUzMjcsZS5PbmVyb21hbj04NTQ0LGUuT29nb25laz00OTAsZS5Pb2dvbmVrbWFjcm9uPTQ5MixlLk9vcGVuPTM5MCxlLk9zbGFzaD0yMTYsZS5Pc2xhc2hhY3V0ZT01MTAsZS5Pc2xhc2hzbWFsbD02MzQ4MCxlLk9zbWFsbD02MzM0MyxlLk9zdHJva2VhY3V0ZT01MTAsZS5PdGN5cmlsbGljPTExNTAsZS5PdGlsZGU9MjEzLGUuT3RpbGRlYWN1dGU9Nzc1NixlLk90aWxkZWRpZXJlc2lzPTc3NTgsZS5PdGlsZGVzbWFsbD02MzQ3NyxlLlA9ODAsZS5QYWN1dGU9Nzc2NCxlLlBjaXJjbGU9OTQxMyxlLlBkb3RhY2NlbnQ9Nzc2NixlLlBlY3lyaWxsaWM9MTA1NSxlLlBlaGFybWVuaWFuPTEzNTQsZS5QZW1pZGRsZWhvb2tjeXJpbGxpYz0xMTkwLGUuUGhpPTkzNCxlLlBob29rPTQyMCxlLlBpPTkyOCxlLlBpd3Jhcm1lbmlhbj0xMzYzLGUuUG1vbm9zcGFjZT02NTMyOCxlLlBzaT05MzYsZS5Qc2ljeXJpbGxpYz0xMTM2LGUuUHNtYWxsPTYzMzQ0LGUuUT04MSxlLlFjaXJjbGU9OTQxNCxlLlFtb25vc3BhY2U9NjUzMjksZS5Rc21hbGw9NjMzNDUsZS5SPTgyLGUuUmFhcm1lbmlhbj0xMzU2LGUuUmFjdXRlPTM0MCxlLlJjYXJvbj0zNDQsZS5SY2VkaWxsYT0zNDIsZS5SY2lyY2xlPTk0MTUsZS5SY29tbWFhY2NlbnQ9MzQyLGUuUmRibGdyYXZlPTUyOCxlLlJkb3RhY2NlbnQ9Nzc2OCxlLlJkb3RiZWxvdz03NzcwLGUuUmRvdGJlbG93bWFjcm9uPTc3NzIsZS5SZWhhcm1lbmlhbj0xMzYwLGUuUmZyYWt0dXI9ODQ3NixlLlJobz05MjksZS5SaW5nc21hbGw9NjMyMjgsZS5SaW52ZXJ0ZWRicmV2ZT01MzAsZS5SbGluZWJlbG93PTc3NzQsZS5SbW9ub3NwYWNlPTY1MzMwLGUuUnNtYWxsPTYzMzQ2LGUuUnNtYWxsaW52ZXJ0ZWQ9NjQxLGUuUnNtYWxsaW52ZXJ0ZWRzdXBlcmlvcj02OTQsZS5TPTgzLGUuU0YwMTAwMDA9OTQ4NCxlLlNGMDIwMDAwPTk0OTIsZS5TRjAzMDAwMD05NDg4LGUuU0YwNDAwMDA9OTQ5NixlLlNGMDUwMDAwPTk1MzIsZS5TRjA2MDAwMD05NTE2LGUuU0YwNzAwMDA9OTUyNCxlLlNGMDgwMDAwPTk1MDAsZS5TRjA5MDAwMD05NTA4LGUuU0YxMDAwMDA9OTQ3MixlLlNGMTEwMDAwPTk0NzQsZS5TRjE5MDAwMD05NTY5LGUuU0YyMDAwMDA9OTU3MCxlLlNGMjEwMDAwPTk1NTgsZS5TRjIyMDAwMD05NTU3LGUuU0YyMzAwMDA9OTU3MSxlLlNGMjQwMDAwPTk1NTMsZS5TRjI1MDAwMD05NTU5LGUuU0YyNjAwMDA9OTU2NSxlLlNGMjcwMDAwPTk1NjQsZS5TRjI4MDAwMD05NTYzLGUuU0YzNjAwMDA9OTU2NixlLlNGMzcwMDAwPTk1NjcsZS5TRjM4MDAwMD05NTYyLGUuU0YzOTAwMDA9OTU1NixlLlNGNDAwMDAwPTk1NzcsZS5TRjQxMDAwMD05NTc0LGUuU0Y0MjAwMDA9OTU2OCxlLlNGNDMwMDAwPTk1NTIsZS5TRjQ0MDAwMD05NTgwLGUuU0Y0NTAwMDA9OTU3NSxlLlNGNDYwMDAwPTk1NzYsZS5TRjQ3MDAwMD05NTcyLGUuU0Y0ODAwMDA9OTU3MyxlLlNGNDkwMDAwPTk1NjEsZS5TRjUwMDAwMD05NTYwLGUuU0Y1MTAwMDA9OTU1NCxlLlNGNTIwMDAwPTk1NTUsZS5TRjUzMDAwMD05NTc5LGUuU0Y1NDAwMDA9OTU3OCxlLlNhY3V0ZT0zNDYsZS5TYWN1dGVkb3RhY2NlbnQ9Nzc4MCxlLlNhbXBpZ3JlZWs9OTkyLGUuU2Nhcm9uPTM1MixlLlNjYXJvbmRvdGFjY2VudD03NzgyLGUuU2Nhcm9uc21hbGw9NjMyMjksZS5TY2VkaWxsYT0zNTAsZS5TY2h3YT0zOTksZS5TY2h3YWN5cmlsbGljPTEyNDAsZS5TY2h3YWRpZXJlc2lzY3lyaWxsaWM9MTI0MixlLlNjaXJjbGU9OTQxNixlLlNjaXJjdW1mbGV4PTM0OCxlLlNjb21tYWFjY2VudD01MzYsZS5TZG90YWNjZW50PTc3NzYsZS5TZG90YmVsb3c9Nzc3OCxlLlNkb3RiZWxvd2RvdGFjY2VudD03Nzg0LGUuU2VoYXJtZW5pYW49MTM1NyxlLlNldmVucm9tYW49ODU1MCxlLlNoYWFybWVuaWFuPTEzNTEsZS5TaGFjeXJpbGxpYz0xMDY0LGUuU2hjaGFjeXJpbGxpYz0xMDY1LGUuU2hlaWNvcHRpYz05OTQsZS5TaGhhY3lyaWxsaWM9MTIxMCxlLlNoaW1hY29wdGljPTEwMDQsZS5TaWdtYT05MzEsZS5TaXhyb21hbj04NTQ5LGUuU21vbm9zcGFjZT02NTMzMSxlLlNvZnRzaWduY3lyaWxsaWM9MTA2OCxlLlNzbWFsbD02MzM0NyxlLlN0aWdtYWdyZWVrPTk4NixlLlQ9ODQsZS5UYXU9OTMyLGUuVGJhcj0zNTgsZS5UY2Fyb249MzU2LGUuVGNlZGlsbGE9MzU0LGUuVGNpcmNsZT05NDE3LGUuVGNpcmN1bWZsZXhiZWxvdz03NzkyLGUuVGNvbW1hYWNjZW50PTM1NCxlLlRkb3RhY2NlbnQ9Nzc4NixlLlRkb3RiZWxvdz03Nzg4LGUuVGVjeXJpbGxpYz0xMDU4LGUuVGVkZXNjZW5kZXJjeXJpbGxpYz0xMTk2LGUuVGVucm9tYW49ODU1MyxlLlRldHNlY3lyaWxsaWM9MTIwNCxlLlRoZXRhPTkyMCxlLlRob29rPTQyOCxlLlRob3JuPTIyMixlLlRob3Juc21hbGw9NjM0ODYsZS5UaHJlZXJvbWFuPTg1NDYsZS5UaWxkZXNtYWxsPTYzMjMwLGUuVGl3bmFybWVuaWFuPTEzNTksZS5UbGluZWJlbG93PTc3OTAsZS5UbW9ub3NwYWNlPTY1MzMyLGUuVG9hcm1lbmlhbj0xMzM3LGUuVG9uZWZpdmU9NDQ0LGUuVG9uZXNpeD0zODgsZS5Ub25ldHdvPTQyMyxlLlRyZXRyb2ZsZXhob29rPTQzMCxlLlRzZWN5cmlsbGljPTEwNjIsZS5Uc2hlY3lyaWxsaWM9MTAzNSxlLlRzbWFsbD02MzM0OCxlLlR3ZWx2ZXJvbWFuPTg1NTUsZS5Ud29yb21hbj04NTQ1LGUuVT04NSxlLlVhY3V0ZT0yMTgsZS5VYWN1dGVzbWFsbD02MzQ4MixlLlVicmV2ZT0zNjQsZS5VY2Fyb249NDY3LGUuVWNpcmNsZT05NDE4LGUuVWNpcmN1bWZsZXg9MjE5LGUuVWNpcmN1bWZsZXhiZWxvdz03Nzk4LGUuVWNpcmN1bWZsZXhzbWFsbD02MzQ4MyxlLlVjeXJpbGxpYz0xMDU5LGUuVWRibGFjdXRlPTM2OCxlLlVkYmxncmF2ZT01MzIsZS5VZGllcmVzaXM9MjIwLGUuVWRpZXJlc2lzYWN1dGU9NDcxLGUuVWRpZXJlc2lzYmVsb3c9Nzc5NCxlLlVkaWVyZXNpc2Nhcm9uPTQ3MyxlLlVkaWVyZXNpc2N5cmlsbGljPTEyNjQsZS5VZGllcmVzaXNncmF2ZT00NzUsZS5VZGllcmVzaXNtYWNyb249NDY5LGUuVWRpZXJlc2lzc21hbGw9NjM0ODQsZS5VZG90YmVsb3c9NzkwOCxlLlVncmF2ZT0yMTcsZS5VZ3JhdmVzbWFsbD02MzQ4MSxlLlVob29rYWJvdmU9NzkxMCxlLlVob3JuPTQzMSxlLlVob3JuYWN1dGU9NzkxMixlLlVob3JuZG90YmVsb3c9NzkyMCxlLlVob3JuZ3JhdmU9NzkxNCxlLlVob3JuaG9va2Fib3ZlPTc5MTYsZS5VaG9ybnRpbGRlPTc5MTgsZS5VaHVuZ2FydW1sYXV0PTM2OCxlLlVodW5nYXJ1bWxhdXRjeXJpbGxpYz0xMjY2LGUuVWludmVydGVkYnJldmU9NTM0LGUuVWtjeXJpbGxpYz0xMTQ0LGUuVW1hY3Jvbj0zNjIsZS5VbWFjcm9uY3lyaWxsaWM9MTI2MixlLlVtYWNyb25kaWVyZXNpcz03ODAyLGUuVW1vbm9zcGFjZT02NTMzMyxlLlVvZ29uZWs9MzcwLGUuVXBzaWxvbj05MzMsZS5VcHNpbG9uMT05NzgsZS5VcHNpbG9uYWN1dGVob29rc3ltYm9sZ3JlZWs9OTc5LGUuVXBzaWxvbmFmcmljYW49NDMzLGUuVXBzaWxvbmRpZXJlc2lzPTkzOSxlLlVwc2lsb25kaWVyZXNpc2hvb2tzeW1ib2xncmVlaz05ODAsZS5VcHNpbG9uaG9va3N5bWJvbD05NzgsZS5VcHNpbG9udG9ub3M9OTEwLGUuVXJpbmc9MzY2LGUuVXNob3J0Y3lyaWxsaWM9MTAzOCxlLlVzbWFsbD02MzM0OSxlLlVzdHJhaWdodGN5cmlsbGljPTExOTgsZS5Vc3RyYWlnaHRzdHJva2VjeXJpbGxpYz0xMjAwLGUuVXRpbGRlPTM2MCxlLlV0aWxkZWFjdXRlPTc4MDAsZS5VdGlsZGViZWxvdz03Nzk2LGUuVj04NixlLlZjaXJjbGU9OTQxOSxlLlZkb3RiZWxvdz03ODA2LGUuVmVjeXJpbGxpYz0xMDQyLGUuVmV3YXJtZW5pYW49MTM1OCxlLlZob29rPTQzNCxlLlZtb25vc3BhY2U9NjUzMzQsZS5Wb2FybWVuaWFuPTEzNTIsZS5Wc21hbGw9NjMzNTAsZS5WdGlsZGU9NzgwNCxlLlc9ODcsZS5XYWN1dGU9NzgxMCxlLldjaXJjbGU9OTQyMCxlLldjaXJjdW1mbGV4PTM3MixlLldkaWVyZXNpcz03ODEyLGUuV2RvdGFjY2VudD03ODE0LGUuV2RvdGJlbG93PTc4MTYsZS5XZ3JhdmU9NzgwOCxlLldtb25vc3BhY2U9NjUzMzUsZS5Xc21hbGw9NjMzNTEsZS5YPTg4LGUuWGNpcmNsZT05NDIxLGUuWGRpZXJlc2lzPTc4MjAsZS5YZG90YWNjZW50PTc4MTgsZS5YZWhhcm1lbmlhbj0xMzQxLGUuWGk9OTI2LGUuWG1vbm9zcGFjZT02NTMzNixlLlhzbWFsbD02MzM1MixlLlk9ODksZS5ZYWN1dGU9MjIxLGUuWWFjdXRlc21hbGw9NjM0ODUsZS5ZYXRjeXJpbGxpYz0xMTIyLGUuWWNpcmNsZT05NDIyLGUuWWNpcmN1bWZsZXg9Mzc0LGUuWWRpZXJlc2lzPTM3NixlLllkaWVyZXNpc3NtYWxsPTYzNDg3LGUuWWRvdGFjY2VudD03ODIyLGUuWWRvdGJlbG93PTc5MjQsZS5ZZXJpY3lyaWxsaWM9MTA2NyxlLlllcnVkaWVyZXNpc2N5cmlsbGljPTEyNzIsZS5ZZ3JhdmU9NzkyMixlLllob29rPTQzNSxlLllob29rYWJvdmU9NzkyNixlLllpYXJtZW5pYW49MTM0OSxlLllpY3lyaWxsaWM9MTAzMSxlLllpd25hcm1lbmlhbj0xMzYyLGUuWW1vbm9zcGFjZT02NTMzNyxlLllzbWFsbD02MzM1MyxlLll0aWxkZT03OTI4LGUuWXVzYmlnY3lyaWxsaWM9MTEzMCxlLll1c2JpZ2lvdGlmaWVkY3lyaWxsaWM9MTEzMixlLll1c2xpdHRsZWN5cmlsbGljPTExMjYsZS5ZdXNsaXR0bGVpb3RpZmllZGN5cmlsbGljPTExMjgsZS5aPTkwLGUuWmFhcm1lbmlhbj0xMzM0LGUuWmFjdXRlPTM3NyxlLlpjYXJvbj0zODEsZS5aY2Fyb25zbWFsbD02MzIzMSxlLlpjaXJjbGU9OTQyMyxlLlpjaXJjdW1mbGV4PTc4MjQsZS5aZG90PTM3OSxlLlpkb3RhY2NlbnQ9Mzc5LGUuWmRvdGJlbG93PTc4MjYsZS5aZWN5cmlsbGljPTEwNDcsZS5aZWRlc2NlbmRlcmN5cmlsbGljPTExNzYsZS5aZWRpZXJlc2lzY3lyaWxsaWM9MTI0NixlLlpldGE9OTE4LGUuWmhlYXJtZW5pYW49MTMzOCxlLlpoZWJyZXZlY3lyaWxsaWM9MTIxNyxlLlpoZWN5cmlsbGljPTEwNDYsZS5aaGVkZXNjZW5kZXJjeXJpbGxpYz0xMTc0LGUuWmhlZGllcmVzaXNjeXJpbGxpYz0xMjQ0LGUuWmxpbmViZWxvdz03ODI4LGUuWm1vbm9zcGFjZT02NTMzOCxlLlpzbWFsbD02MzM1NCxlLlpzdHJva2U9NDM3LGUuYT05NyxlLmFhYmVuZ2FsaT0yNDM4LGUuYWFjdXRlPTIyNSxlLmFhZGV2YT0yMzEwLGUuYWFndWphcmF0aT0yNjk0LGUuYWFndXJtdWtoaT0yNTY2LGUuYWFtYXRyYWd1cm11a2hpPTI2MjIsZS5hYXJ1c3F1YXJlPTEzMDU5LGUuYWF2b3dlbHNpZ25iZW5nYWxpPTI0OTQsZS5hYXZvd2Vsc2lnbmRldmE9MjM2NixlLmFhdm93ZWxzaWduZ3VqYXJhdGk9Mjc1MCxlLmFiYnJldmlhdGlvbm1hcmthcm1lbmlhbj0xMzc1LGUuYWJicmV2aWF0aW9uc2lnbmRldmE9MjQxNixlLmFiZW5nYWxpPTI0MzcsZS5hYm9wb21vZm89MTI1NzAsZS5hYnJldmU9MjU5LGUuYWJyZXZlYWN1dGU9Nzg1NSxlLmFicmV2ZWN5cmlsbGljPTEyMzMsZS5hYnJldmVkb3RiZWxvdz03ODYzLGUuYWJyZXZlZ3JhdmU9Nzg1NyxlLmFicmV2ZWhvb2thYm92ZT03ODU5LGUuYWJyZXZldGlsZGU9Nzg2MSxlLmFjYXJvbj00NjIsZS5hY2lyY2xlPTk0MjQsZS5hY2lyY3VtZmxleD0yMjYsZS5hY2lyY3VtZmxleGFjdXRlPTc4NDUsZS5hY2lyY3VtZmxleGRvdGJlbG93PTc4NTMsZS5hY2lyY3VtZmxleGdyYXZlPTc4NDcsZS5hY2lyY3VtZmxleGhvb2thYm92ZT03ODQ5LGUuYWNpcmN1bWZsZXh0aWxkZT03ODUxLGUuYWN1dGU9MTgwLGUuYWN1dGViZWxvd2NtYj03OTEsZS5hY3V0ZWNtYj03NjksZS5hY3V0ZWNvbWI9NzY5LGUuYWN1dGVkZXZhPTIzODgsZS5hY3V0ZWxvd21vZD03MTksZS5hY3V0ZXRvbmVjbWI9ODMzLGUuYWN5cmlsbGljPTEwNzIsZS5hZGJsZ3JhdmU9NTEzLGUuYWRkYWtndXJtdWtoaT0yNjczLGUuYWRldmE9MjMwOSxlLmFkaWVyZXNpcz0yMjgsZS5hZGllcmVzaXNjeXJpbGxpYz0xMjM1LGUuYWRpZXJlc2lzbWFjcm9uPTQ3OSxlLmFkb3RiZWxvdz03ODQxLGUuYWRvdG1hY3Jvbj00ODEsZS5hZT0yMzAsZS5hZWFjdXRlPTUwOSxlLmFla29yZWFuPTEyNjI0LGUuYWVtYWNyb249NDgzLGUuYWZpaTAwMjA4PTgyMTMsZS5hZmlpMDg5NDE9ODM1NixlLmFmaWkxMDAxNz0xMDQwLGUuYWZpaTEwMDE4PTEwNDEsZS5hZmlpMTAwMTk9MTA0MixlLmFmaWkxMDAyMD0xMDQzLGUuYWZpaTEwMDIxPTEwNDQsZS5hZmlpMTAwMjI9MTA0NSxlLmFmaWkxMDAyMz0xMDI1LGUuYWZpaTEwMDI0PTEwNDYsZS5hZmlpMTAwMjU9MTA0NyxlLmFmaWkxMDAyNj0xMDQ4LGUuYWZpaTEwMDI3PTEwNDksZS5hZmlpMTAwMjg9MTA1MCxlLmFmaWkxMDAyOT0xMDUxLGUuYWZpaTEwMDMwPTEwNTI7ZS5hZmlpMTAwMzE9MTA1MyxlLmFmaWkxMDAzMj0xMDU0LGUuYWZpaTEwMDMzPTEwNTUsZS5hZmlpMTAwMzQ9MTA1NixlLmFmaWkxMDAzNT0xMDU3LGUuYWZpaTEwMDM2PTEwNTgsZS5hZmlpMTAwMzc9MTA1OSxlLmFmaWkxMDAzOD0xMDYwLGUuYWZpaTEwMDM5PTEwNjEsZS5hZmlpMTAwNDA9MTA2MixlLmFmaWkxMDA0MT0xMDYzLGUuYWZpaTEwMDQyPTEwNjQsZS5hZmlpMTAwNDM9MTA2NSxlLmFmaWkxMDA0ND0xMDY2LGUuYWZpaTEwMDQ1PTEwNjcsZS5hZmlpMTAwNDY9MTA2OCxlLmFmaWkxMDA0Nz0xMDY5LGUuYWZpaTEwMDQ4PTEwNzAsZS5hZmlpMTAwNDk9MTA3MSxlLmFmaWkxMDA1MD0xMTY4LGUuYWZpaTEwMDUxPTEwMjYsZS5hZmlpMTAwNTI9MTAyNyxlLmFmaWkxMDA1Mz0xMDI4LGUuYWZpaTEwMDU0PTEwMjksZS5hZmlpMTAwNTU9MTAzMCxlLmFmaWkxMDA1Nj0xMDMxLGUuYWZpaTEwMDU3PTEwMzIsZS5hZmlpMTAwNTg9MTAzMyxlLmFmaWkxMDA1OT0xMDM0LGUuYWZpaTEwMDYwPTEwMzUsZS5hZmlpMTAwNjE9MTAzNixlLmFmaWkxMDA2Mj0xMDM4LGUuYWZpaTEwMDYzPTYzMTcyLGUuYWZpaTEwMDY0PTYzMTczLGUuYWZpaTEwMDY1PTEwNzIsZS5hZmlpMTAwNjY9MTA3MyxlLmFmaWkxMDA2Nz0xMDc0LGUuYWZpaTEwMDY4PTEwNzUsZS5hZmlpMTAwNjk9MTA3NixlLmFmaWkxMDA3MD0xMDc3LGUuYWZpaTEwMDcxPTExMDUsZS5hZmlpMTAwNzI9MTA3OCxlLmFmaWkxMDA3Mz0xMDc5LGUuYWZpaTEwMDc0PTEwODAsZS5hZmlpMTAwNzU9MTA4MSxlLmFmaWkxMDA3Nj0xMDgyLGUuYWZpaTEwMDc3PTEwODMsZS5hZmlpMTAwNzg9MTA4NCxlLmFmaWkxMDA3OT0xMDg1LGUuYWZpaTEwMDgwPTEwODYsZS5hZmlpMTAwODE9MTA4NyxlLmFmaWkxMDA4Mj0xMDg4LGUuYWZpaTEwMDgzPTEwODksZS5hZmlpMTAwODQ9MTA5MCxlLmFmaWkxMDA4NT0xMDkxLGUuYWZpaTEwMDg2PTEwOTIsZS5hZmlpMTAwODc9MTA5MyxlLmFmaWkxMDA4OD0xMDk0LGUuYWZpaTEwMDg5PTEwOTUsZS5hZmlpMTAwOTA9MTA5NixlLmFmaWkxMDA5MT0xMDk3LGUuYWZpaTEwMDkyPTEwOTgsZS5hZmlpMTAwOTM9MTA5OSxlLmFmaWkxMDA5ND0xMTAwLGUuYWZpaTEwMDk1PTExMDEsZS5hZmlpMTAwOTY9MTEwMixlLmFmaWkxMDA5Nz0xMTAzLGUuYWZpaTEwMDk4PTExNjksZS5hZmlpMTAwOTk9MTEwNixlLmFmaWkxMDEwMD0xMTA3LGUuYWZpaTEwMTAxPTExMDgsZS5hZmlpMTAxMDI9MTEwOSxlLmFmaWkxMDEwMz0xMTEwLGUuYWZpaTEwMTA0PTExMTEsZS5hZmlpMTAxMDU9MTExMixlLmFmaWkxMDEwNj0xMTEzLGUuYWZpaTEwMTA3PTExMTQsZS5hZmlpMTAxMDg9MTExNSxlLmFmaWkxMDEwOT0xMTE2LGUuYWZpaTEwMTEwPTExMTgsZS5hZmlpMTAxNDU9MTAzOSxlLmFmaWkxMDE0Nj0xMTIyLGUuYWZpaTEwMTQ3PTExMzgsZS5hZmlpMTAxNDg9MTE0MCxlLmFmaWkxMDE5Mj02MzE3NCxlLmFmaWkxMDE5Mz0xMTE5LGUuYWZpaTEwMTk0PTExMjMsZS5hZmlpMTAxOTU9MTEzOSxlLmFmaWkxMDE5Nj0xMTQxLGUuYWZpaTEwODMxPTYzMTc1LGUuYWZpaTEwODMyPTYzMTc2LGUuYWZpaTEwODQ2PTEyNDEsZS5hZmlpMjk5PTgyMDYsZS5hZmlpMzAwPTgyMDcsZS5hZmlpMzAxPTgyMDUsZS5hZmlpNTczODE9MTY0MixlLmFmaWk1NzM4OD0xNTQ4LGUuYWZpaTU3MzkyPTE2MzIsZS5hZmlpNTczOTM9MTYzMyxlLmFmaWk1NzM5ND0xNjM0LGUuYWZpaTU3Mzk1PTE2MzUsZS5hZmlpNTczOTY9MTYzNixlLmFmaWk1NzM5Nz0xNjM3LGUuYWZpaTU3Mzk4PTE2MzgsZS5hZmlpNTczOTk9MTYzOSxlLmFmaWk1NzQwMD0xNjQwLGUuYWZpaTU3NDAxPTE2NDEsZS5hZmlpNTc0MDM9MTU2MyxlLmFmaWk1NzQwNz0xNTY3LGUuYWZpaTU3NDA5PTE1NjksZS5hZmlpNTc0MTA9MTU3MCxlLmFmaWk1NzQxMT0xNTcxLGUuYWZpaTU3NDEyPTE1NzIsZS5hZmlpNTc0MTM9MTU3MyxlLmFmaWk1NzQxND0xNTc0LGUuYWZpaTU3NDE1PTE1NzUsZS5hZmlpNTc0MTY9MTU3NixlLmFmaWk1NzQxNz0xNTc3LGUuYWZpaTU3NDE4PTE1NzgsZS5hZmlpNTc0MTk9MTU3OSxlLmFmaWk1NzQyMD0xNTgwLGUuYWZpaTU3NDIxPTE1ODEsZS5hZmlpNTc0MjI9MTU4MixlLmFmaWk1NzQyMz0xNTgzLGUuYWZpaTU3NDI0PTE1ODQsZS5hZmlpNTc0MjU9MTU4NSxlLmFmaWk1NzQyNj0xNTg2LGUuYWZpaTU3NDI3PTE1ODcsZS5hZmlpNTc0Mjg9MTU4OCxlLmFmaWk1NzQyOT0xNTg5LGUuYWZpaTU3NDMwPTE1OTAsZS5hZmlpNTc0MzE9MTU5MSxlLmFmaWk1NzQzMj0xNTkyLGUuYWZpaTU3NDMzPTE1OTMsZS5hZmlpNTc0MzQ9MTU5NCxlLmFmaWk1NzQ0MD0xNjAwLGUuYWZpaTU3NDQxPTE2MDEsZS5hZmlpNTc0NDI9MTYwMixlLmFmaWk1NzQ0Mz0xNjAzLGUuYWZpaTU3NDQ0PTE2MDQsZS5hZmlpNTc0NDU9MTYwNSxlLmFmaWk1NzQ0Nj0xNjA2LGUuYWZpaTU3NDQ4PTE2MDgsZS5hZmlpNTc0NDk9MTYwOSxlLmFmaWk1NzQ1MD0xNjEwLGUuYWZpaTU3NDUxPTE2MTEsZS5hZmlpNTc0NTI9MTYxMixlLmFmaWk1NzQ1Mz0xNjEzLGUuYWZpaTU3NDU0PTE2MTQsZS5hZmlpNTc0NTU9MTYxNSxlLmFmaWk1NzQ1Nj0xNjE2LGUuYWZpaTU3NDU3PTE2MTcsZS5hZmlpNTc0NTg9MTYxOCxlLmFmaWk1NzQ3MD0xNjA3LGUuYWZpaTU3NTA1PTE3MDAsZS5hZmlpNTc1MDY9MTY2MixlLmFmaWk1NzUwNz0xNjcwLGUuYWZpaTU3NTA4PTE2ODgsZS5hZmlpNTc1MDk9MTcxMSxlLmFmaWk1NzUxMT0xNjU3LGUuYWZpaTU3NTEyPTE2NzIsZS5hZmlpNTc1MTM9MTY4MSxlLmFmaWk1NzUxND0xNzIyLGUuYWZpaTU3NTE5PTE3NDYsZS5hZmlpNTc1MzQ9MTc0OSxlLmFmaWk1NzYzNj04MzYyLGUuYWZpaTU3NjQ1PTE0NzAsZS5hZmlpNTc2NTg9MTQ3NSxlLmFmaWk1NzY2ND0xNDg4LGUuYWZpaTU3NjY1PTE0ODksZS5hZmlpNTc2NjY9MTQ5MCxlLmFmaWk1NzY2Nz0xNDkxLGUuYWZpaTU3NjY4PTE0OTIsZS5hZmlpNTc2Njk9MTQ5MyxlLmFmaWk1NzY3MD0xNDk0LGUuYWZpaTU3NjcxPTE0OTUsZS5hZmlpNTc2NzI9MTQ5NixlLmFmaWk1NzY3Mz0xNDk3LGUuYWZpaTU3Njc0PTE0OTgsZS5hZmlpNTc2NzU9MTQ5OSxlLmFmaWk1NzY3Nj0xNTAwLGUuYWZpaTU3Njc3PTE1MDEsZS5hZmlpNTc2Nzg9MTUwMixlLmFmaWk1NzY3OT0xNTAzLGUuYWZpaTU3NjgwPTE1MDQsZS5hZmlpNTc2ODE9MTUwNSxlLmFmaWk1NzY4Mj0xNTA2LGUuYWZpaTU3NjgzPTE1MDcsZS5hZmlpNTc2ODQ9MTUwOCxlLmFmaWk1NzY4NT0xNTA5LGUuYWZpaTU3Njg2PTE1MTAsZS5hZmlpNTc2ODc9MTUxMSxlLmFmaWk1NzY4OD0xNTEyLGUuYWZpaTU3Njg5PTE1MTMsZS5hZmlpNTc2OTA9MTUxNCxlLmFmaWk1NzY5ND02NDI5OCxlLmFmaWk1NzY5NT02NDI5OSxlLmFmaWk1NzcwMD02NDMzMSxlLmFmaWk1NzcwNT02NDI4NyxlLmFmaWk1NzcxNj0xNTIwLGUuYWZpaTU3NzE3PTE1MjEsZS5hZmlpNTc3MTg9MTUyMixlLmFmaWk1NzcyMz02NDMwOSxlLmFmaWk1Nzc5Mz0xNDYwLGUuYWZpaTU3Nzk0PTE0NjEsZS5hZmlpNTc3OTU9MTQ2MixlLmFmaWk1Nzc5Nj0xNDY3LGUuYWZpaTU3Nzk3PTE0NjQsZS5hZmlpNTc3OTg9MTQ2MyxlLmFmaWk1Nzc5OT0xNDU2LGUuYWZpaTU3ODAwPTE0NTgsZS5hZmlpNTc4MDE9MTQ1NyxlLmFmaWk1NzgwMj0xNDU5LGUuYWZpaTU3ODAzPTE0NzQsZS5hZmlpNTc4MDQ9MTQ3MyxlLmFmaWk1NzgwNj0xNDY1LGUuYWZpaTU3ODA3PTE0NjgsZS5hZmlpNTc4Mzk9MTQ2OSxlLmFmaWk1Nzg0MT0xNDcxLGUuYWZpaTU3ODQyPTE0NzIsZS5hZmlpNTc5Mjk9NzAwLGUuYWZpaTYxMjQ4PTg0NTMsZS5hZmlpNjEyODk9ODQ2NyxlLmFmaWk2MTM1Mj04NDcwLGUuYWZpaTYxNTczPTgyMzYsZS5hZmlpNjE1NzQ9ODIzNyxlLmFmaWk2MTU3NT04MjM4LGUuYWZpaTYxNjY0PTgyMDQsZS5hZmlpNjMxNjc9MTY0NSxlLmFmaWk2NDkzNz03MDEsZS5hZ3JhdmU9MjI0LGUuYWd1amFyYXRpPTI2OTMsZS5hZ3VybXVraGk9MjU2NSxlLmFoaXJhZ2FuYT0xMjM1NCxlLmFob29rYWJvdmU9Nzg0MyxlLmFpYmVuZ2FsaT0yNDQ4LGUuYWlib3BvbW9mbz0xMjU3NCxlLmFpZGV2YT0yMzIwLGUuYWllY3lyaWxsaWM9MTIzNyxlLmFpZ3VqYXJhdGk9MjcwNCxlLmFpZ3VybXVraGk9MjU3NixlLmFpbWF0cmFndXJtdWtoaT0yNjMyLGUuYWluYXJhYmljPTE1OTMsZS5haW5maW5hbGFyYWJpYz02NTIyNixlLmFpbmluaXRpYWxhcmFiaWM9NjUyMjcsZS5haW5tZWRpYWxhcmFiaWM9NjUyMjgsZS5haW52ZXJ0ZWRicmV2ZT01MTUsZS5haXZvd2Vsc2lnbmJlbmdhbGk9MjUwNCxlLmFpdm93ZWxzaWduZGV2YT0yMzc2LGUuYWl2b3dlbHNpZ25ndWphcmF0aT0yNzYwLGUuYWthdGFrYW5hPTEyNDUwLGUuYWthdGFrYW5haGFsZndpZHRoPTY1MzkzLGUuYWtvcmVhbj0xMjYyMyxlLmFsZWY9MTQ4OCxlLmFsZWZhcmFiaWM9MTU3NSxlLmFsZWZkYWdlc2hoZWJyZXc9NjQzMDQsZS5hbGVmZmluYWxhcmFiaWM9NjUxNjYsZS5hbGVmaGFtemFhYm92ZWFyYWJpYz0xNTcxLGUuYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYz02NTE1NixlLmFsZWZoYW16YWJlbG93YXJhYmljPTE1NzMsZS5hbGVmaGFtemFiZWxvd2ZpbmFsYXJhYmljPTY1MTYwLGUuYWxlZmhlYnJldz0xNDg4LGUuYWxlZmxhbWVkaGVicmV3PTY0MzM1LGUuYWxlZm1hZGRhYWJvdmVhcmFiaWM9MTU3MCxlLmFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWM9NjUxNTQsZS5hbGVmbWFrc3VyYWFyYWJpYz0xNjA5LGUuYWxlZm1ha3N1cmFmaW5hbGFyYWJpYz02NTI2NCxlLmFsZWZtYWtzdXJhaW5pdGlhbGFyYWJpYz02NTI2NyxlLmFsZWZtYWtzdXJhbWVkaWFsYXJhYmljPTY1MjY4LGUuYWxlZnBhdGFoaGVicmV3PTY0MzAyLGUuYWxlZnFhbWF0c2hlYnJldz02NDMwMyxlLmFsZXBoPTg1MDEsZS5hbGxlcXVhbD04NzgwLGUuYWxwaGE9OTQ1LGUuYWxwaGF0b25vcz05NDAsZS5hbWFjcm9uPTI1NyxlLmFtb25vc3BhY2U9NjUzNDUsZS5hbXBlcnNhbmQ9MzgsZS5hbXBlcnNhbmRtb25vc3BhY2U9NjUyODYsZS5hbXBlcnNhbmRzbWFsbD02MzI3MCxlLmFtc3F1YXJlPTEzMjUwLGUuYW5ib3BvbW9mbz0xMjU3OCxlLmFuZ2JvcG9tb2ZvPTEyNTgwLGUuYW5nYnJhY2tldGxlZnQ9MTIyOTYsZS5hbmdicmFja2V0cmlnaHQ9MTIyOTcsZS5hbmdraGFua2h1dGhhaT0zNjc0LGUuYW5nbGU9ODczNixlLmFuZ2xlYnJhY2tldGxlZnQ9MTIyOTYsZS5hbmdsZWJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODcsZS5hbmdsZWJyYWNrZXRyaWdodD0xMjI5NyxlLmFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwODgsZS5hbmdsZWxlZnQ9OTAwMSxlLmFuZ2xlcmlnaHQ9OTAwMixlLmFuZ3N0cm9tPTg0OTEsZS5hbm90ZWxlaWE9OTAzLGUuYW51ZGF0dGFkZXZhPTIzODYsZS5hbnVzdmFyYWJlbmdhbGk9MjQzNCxlLmFudXN2YXJhZGV2YT0yMzA2LGUuYW51c3ZhcmFndWphcmF0aT0yNjkwLGUuYW9nb25laz0yNjEsZS5hcGFhdG9zcXVhcmU9MTMwNTYsZS5hcGFyZW49OTM3MixlLmFwb3N0cm9waGVhcm1lbmlhbj0xMzcwLGUuYXBvc3Ryb3BoZW1vZD03MDAsZS5hcHBsZT02Mzc0MyxlLmFwcHJvYWNoZXM9ODc4NCxlLmFwcHJveGVxdWFsPTg3NzYsZS5hcHByb3hlcXVhbG9yaW1hZ2U9ODc4NixlLmFwcHJveGltYXRlbHllcXVhbD04NzczLGUuYXJhZWFla29yZWFuPTEyNjg2LGUuYXJhZWFrb3JlYW49MTI2ODUsZS5hcmM9ODk3OCxlLmFyaWdodGhhbGZyaW5nPTc4MzQsZS5hcmluZz0yMjksZS5hcmluZ2FjdXRlPTUwNyxlLmFyaW5nYmVsb3c9NzY4MSxlLmFycm93Ym90aD04NTk2LGUuYXJyb3dkYXNoZG93bj04Njc1LGUuYXJyb3dkYXNobGVmdD04NjcyLGUuYXJyb3dkYXNocmlnaHQ9ODY3NCxlLmFycm93ZGFzaHVwPTg2NzMsZS5hcnJvd2RibGJvdGg9ODY2MCxlLmFycm93ZGJsZG93bj04NjU5LGUuYXJyb3dkYmxsZWZ0PTg2NTYsZS5hcnJvd2RibHJpZ2h0PTg2NTgsZS5hcnJvd2RibHVwPTg2NTcsZS5hcnJvd2Rvd249ODU5NSxlLmFycm93ZG93bmxlZnQ9ODYwMSxlLmFycm93ZG93bnJpZ2h0PTg2MDAsZS5hcnJvd2Rvd253aGl0ZT04NjgxLGUuYXJyb3doZWFkZG93bm1vZD03MDksZS5hcnJvd2hlYWRsZWZ0bW9kPTcwNixlLmFycm93aGVhZHJpZ2h0bW9kPTcwNyxlLmFycm93aGVhZHVwbW9kPTcwOCxlLmFycm93aG9yaXpleD02MzcxOSxlLmFycm93bGVmdD04NTkyLGUuYXJyb3dsZWZ0ZGJsPTg2NTYsZS5hcnJvd2xlZnRkYmxzdHJva2U9ODY1MyxlLmFycm93bGVmdG92ZXJyaWdodD04NjQ2LGUuYXJyb3dsZWZ0d2hpdGU9ODY3OCxlLmFycm93cmlnaHQ9ODU5NCxlLmFycm93cmlnaHRkYmxzdHJva2U9ODY1NSxlLmFycm93cmlnaHRoZWF2eT0xMDE0MixlLmFycm93cmlnaHRvdmVybGVmdD04NjQ0LGUuYXJyb3dyaWdodHdoaXRlPTg2ODAsZS5hcnJvd3RhYmxlZnQ9ODY3NixlLmFycm93dGFicmlnaHQ9ODY3NyxlLmFycm93dXA9ODU5MyxlLmFycm93dXBkbj04NTk3LGUuYXJyb3d1cGRuYnNlPTg2MTYsZS5hcnJvd3VwZG93bmJhc2U9ODYxNixlLmFycm93dXBsZWZ0PTg1OTgsZS5hcnJvd3VwbGVmdG9mZG93bj04NjQ1LGUuYXJyb3d1cHJpZ2h0PTg1OTksZS5hcnJvd3Vwd2hpdGU9ODY3OSxlLmFycm93dmVydGV4PTYzNzE4LGUuYXNjaWljaXJjdW09OTQsZS5hc2NpaWNpcmN1bW1vbm9zcGFjZT02NTM0MixlLmFzY2lpdGlsZGU9MTI2LGUuYXNjaWl0aWxkZW1vbm9zcGFjZT02NTM3NCxlLmFzY3JpcHQ9NTkzLGUuYXNjcmlwdHR1cm5lZD01OTQsZS5hc21hbGxoaXJhZ2FuYT0xMjM1MyxlLmFzbWFsbGthdGFrYW5hPTEyNDQ5LGUuYXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODMsZS5hc3Rlcmlzaz00MixlLmFzdGVyaXNrYWx0b25lYXJhYmljPTE2NDUsZS5hc3Rlcmlza2FyYWJpYz0xNjQ1LGUuYXN0ZXJpc2ttYXRoPTg3MjcsZS5hc3Rlcmlza21vbm9zcGFjZT02NTI5MCxlLmFzdGVyaXNrc21hbGw9NjUxMjEsZS5hc3RlcmlzbT04MjU4LGUuYXN1cGVyaW9yPTYzMjA5LGUuYXN5bXB0b3RpY2FsbHllcXVhbD04NzcxLGUuYXQ9NjQsZS5hdGlsZGU9MjI3LGUuYXRtb25vc3BhY2U9NjUzMTIsZS5hdHNtYWxsPTY1MTMxLGUuYXR1cm5lZD01OTIsZS5hdWJlbmdhbGk9MjQ1MixlLmF1Ym9wb21vZm89MTI1NzYsZS5hdWRldmE9MjMyNCxlLmF1Z3VqYXJhdGk9MjcwOCxlLmF1Z3VybXVraGk9MjU4MCxlLmF1bGVuZ3RobWFya2JlbmdhbGk9MjUxOSxlLmF1bWF0cmFndXJtdWtoaT0yNjM2LGUuYXV2b3dlbHNpZ25iZW5nYWxpPTI1MDgsZS5hdXZvd2Vsc2lnbmRldmE9MjM4MCxlLmF1dm93ZWxzaWduZ3VqYXJhdGk9Mjc2NCxlLmF2YWdyYWhhZGV2YT0yMzY1LGUuYXliYXJtZW5pYW49MTM3NyxlLmF5aW49MTUwNixlLmF5aW5hbHRvbmVoZWJyZXc9NjQyODgsZS5heWluaGVicmV3PTE1MDYsZS5iPTk4LGUuYmFiZW5nYWxpPTI0NzYsZS5iYWNrc2xhc2g9OTIsZS5iYWNrc2xhc2htb25vc3BhY2U9NjUzNDAsZS5iYWRldmE9MjM0OCxlLmJhZ3VqYXJhdGk9MjczMixlLmJhZ3VybXVraGk9MjYwNCxlLmJhaGlyYWdhbmE9MTI0MDAsZS5iYWh0dGhhaT0zNjQ3LGUuYmFrYXRha2FuYT0xMjQ5NixlLmJhcj0xMjQsZS5iYXJtb25vc3BhY2U9NjUzNzIsZS5iYm9wb21vZm89MTI1NDksZS5iY2lyY2xlPTk0MjUsZS5iZG90YWNjZW50PTc2ODMsZS5iZG90YmVsb3c9NzY4NSxlLmJlYW1lZHNpeHRlZW50aG5vdGVzPTk4MzYsZS5iZWNhdXNlPTg3NTcsZS5iZWN5cmlsbGljPTEwNzMsZS5iZWhhcmFiaWM9MTU3NixlLmJlaGZpbmFsYXJhYmljPTY1MTY4LGUuYmVoaW5pdGlhbGFyYWJpYz02NTE2OSxlLmJlaGlyYWdhbmE9MTI0MDksZS5iZWhtZWRpYWxhcmFiaWM9NjUxNzAsZS5iZWhtZWVtaW5pdGlhbGFyYWJpYz02NDY3MSxlLmJlaG1lZW1pc29sYXRlZGFyYWJpYz02NDUyMCxlLmJlaG5vb25maW5hbGFyYWJpYz02NDYyMSxlLmJla2F0YWthbmE9MTI1MDUsZS5iZW5hcm1lbmlhbj0xMzc4LGUuYmV0PTE0ODksZS5iZXRhPTk0NixlLmJldGFzeW1ib2xncmVlaz05NzYsZS5iZXRkYWdlc2g9NjQzMDUsZS5iZXRkYWdlc2hoZWJyZXc9NjQzMDUsZS5iZXRoZWJyZXc9MTQ4OSxlLmJldHJhZmVoZWJyZXc9NjQzMzIsZS5iaGFiZW5nYWxpPTI0NzcsZS5iaGFkZXZhPTIzNDksZS5iaGFndWphcmF0aT0yNzMzLGUuYmhhZ3VybXVraGk9MjYwNSxlLmJob29rPTU5NSxlLmJpaGlyYWdhbmE9MTI0MDMsZS5iaWthdGFrYW5hPTEyNDk5LGUuYmlsYWJpYWxjbGljaz02NjQsZS5iaW5kaWd1cm11a2hpPTI1NjIsZS5iaXJ1c3F1YXJlPTEzMTA1LGUuYmxhY2tjaXJjbGU9OTY3OSxlLmJsYWNrZGlhbW9uZD05NjcwLGUuYmxhY2tkb3ducG9pbnRpbmd0cmlhbmdsZT05NjYwLGUuYmxhY2tsZWZ0cG9pbnRpbmdwb2ludGVyPTk2NjgsZS5ibGFja2xlZnRwb2ludGluZ3RyaWFuZ2xlPTk2NjQsZS5ibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdD0xMjMwNCxlLmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODMsZS5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHQ9MTIzMDUsZS5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHR2ZXJ0aWNhbD02NTA4NCxlLmJsYWNrbG93ZXJsZWZ0dHJpYW5nbGU9OTY5OSxlLmJsYWNrbG93ZXJyaWdodHRyaWFuZ2xlPTk2OTgsZS5ibGFja3JlY3RhbmdsZT05NjQ0LGUuYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlcj05NjU4LGUuYmxhY2tyaWdodHBvaW50aW5ndHJpYW5nbGU9OTY1NCxlLmJsYWNrc21hbGxzcXVhcmU9OTY0MixlLmJsYWNrc21pbGluZ2ZhY2U9OTc4NyxlLmJsYWNrc3F1YXJlPTk2MzIsZS5ibGFja3N0YXI9OTczMyxlLmJsYWNrdXBwZXJsZWZ0dHJpYW5nbGU9OTcwMCxlLmJsYWNrdXBwZXJyaWdodHRyaWFuZ2xlPTk3MDEsZS5ibGFja3VwcG9pbnRpbmdzbWFsbHRyaWFuZ2xlPTk2NTIsZS5ibGFja3VwcG9pbnRpbmd0cmlhbmdsZT05NjUwLGUuYmxhbms9OTI1MSxlLmJsaW5lYmVsb3c9NzY4NyxlLmJsb2NrPTk2MDgsZS5ibW9ub3NwYWNlPTY1MzQ2LGUuYm9iYWltYWl0aGFpPTM2MTAsZS5ib2hpcmFnYW5hPTEyNDEyLGUuYm9rYXRha2FuYT0xMjUwOCxlLmJwYXJlbj05MzczLGUuYnFzcXVhcmU9MTMyNTEsZS5icmFjZWV4PTYzNzMyLGUuYnJhY2VsZWZ0PTEyMyxlLmJyYWNlbGVmdGJ0PTYzNzMxLGUuYnJhY2VsZWZ0bWlkPTYzNzMwLGUuYnJhY2VsZWZ0bW9ub3NwYWNlPTY1MzcxLGUuYnJhY2VsZWZ0c21hbGw9NjUxMTUsZS5icmFjZWxlZnR0cD02MzcyOSxlLmJyYWNlbGVmdHZlcnRpY2FsPTY1MDc5LGUuYnJhY2VyaWdodD0xMjUsZS5icmFjZXJpZ2h0YnQ9NjM3NDIsZS5icmFjZXJpZ2h0bWlkPTYzNzQxLGUuYnJhY2VyaWdodG1vbm9zcGFjZT02NTM3MyxlLmJyYWNlcmlnaHRzbWFsbD02NTExNixlLmJyYWNlcmlnaHR0cD02Mzc0MCxlLmJyYWNlcmlnaHR2ZXJ0aWNhbD02NTA4MCxlLmJyYWNrZXRsZWZ0PTkxLGUuYnJhY2tldGxlZnRidD02MzcyOCxlLmJyYWNrZXRsZWZ0ZXg9NjM3MjcsZS5icmFja2V0bGVmdG1vbm9zcGFjZT02NTMzOSxlLmJyYWNrZXRsZWZ0dHA9NjM3MjYsZS5icmFja2V0cmlnaHQ9OTMsZS5icmFja2V0cmlnaHRidD02MzczOSxlLmJyYWNrZXRyaWdodGV4PTYzNzM4LGUuYnJhY2tldHJpZ2h0bW9ub3NwYWNlPTY1MzQxLGUuYnJhY2tldHJpZ2h0dHA9NjM3MzcsZS5icmV2ZT03MjgsZS5icmV2ZWJlbG93Y21iPTgxNCxlLmJyZXZlY21iPTc3NCxlLmJyZXZlaW52ZXJ0ZWRiZWxvd2NtYj04MTUsZS5icmV2ZWludmVydGVkY21iPTc4NSxlLmJyZXZlaW52ZXJ0ZWRkb3VibGVjbWI9ODY1LGUuYnJpZGdlYmVsb3djbWI9ODEwLGUuYnJpZGdlaW52ZXJ0ZWRiZWxvd2NtYj04MjYsZS5icm9rZW5iYXI9MTY2LGUuYnN0cm9rZT0zODQsZS5ic3VwZXJpb3I9NjMyMTAsZS5idG9wYmFyPTM4NyxlLmJ1aGlyYWdhbmE9MTI0MDYsZS5idWthdGFrYW5hPTEyNTAyLGUuYnVsbGV0PTgyMjYsZS5idWxsZXRpbnZlcnNlPTk2ODgsZS5idWxsZXRvcGVyYXRvcj04NzI5LGUuYnVsbHNleWU9OTY3OCxlLmM9OTksZS5jYWFybWVuaWFuPTEzOTAsZS5jYWJlbmdhbGk9MjQ1OCxlLmNhY3V0ZT0yNjMsZS5jYWRldmE9MjMzMCxlLmNhZ3VqYXJhdGk9MjcxNCxlLmNhZ3VybXVraGk9MjU4NixlLmNhbHNxdWFyZT0xMzE5MixlLmNhbmRyYWJpbmR1YmVuZ2FsaT0yNDMzLGUuY2FuZHJhYmluZHVjbWI9Nzg0LGUuY2FuZHJhYmluZHVkZXZhPTIzMDUsZS5jYW5kcmFiaW5kdWd1amFyYXRpPTI2ODksZS5jYXBzbG9jaz04NjgyLGUuY2FyZW9mPTg0NTMsZS5jYXJvbj03MTEsZS5jYXJvbmJlbG93Y21iPTgxMixlLmNhcm9uY21iPTc4MCxlLmNhcnJpYWdlcmV0dXJuPTg2MjksZS5jYm9wb21vZm89MTI1NjgsZS5jY2Fyb249MjY5LGUuY2NlZGlsbGE9MjMxLGUuY2NlZGlsbGFhY3V0ZT03Njg5LGUuY2NpcmNsZT05NDI2LGUuY2NpcmN1bWZsZXg9MjY1LGUuY2N1cmw9NTk3LGUuY2RvdD0yNjcsZS5jZG90YWNjZW50PTI2NyxlLmNkc3F1YXJlPTEzMjUzLGUuY2VkaWxsYT0xODQsZS5jZWRpbGxhY21iPTgwNyxlLmNlbnQ9MTYyLGUuY2VudGlncmFkZT04NDUxLGUuY2VudGluZmVyaW9yPTYzMTk5LGUuY2VudG1vbm9zcGFjZT02NTUwNCxlLmNlbnRvbGRzdHlsZT02MzM5NCxlLmNlbnRzdXBlcmlvcj02MzIwMCxlLmNoYWFybWVuaWFuPTE0MDEsZS5jaGFiZW5nYWxpPTI0NTksZS5jaGFkZXZhPTIzMzEsZS5jaGFndWphcmF0aT0yNzE1LGUuY2hhZ3VybXVraGk9MjU4NyxlLmNoYm9wb21vZm89MTI1NjQsZS5jaGVhYmtoYXNpYW5jeXJpbGxpYz0xMjEzLGUuY2hlY2ttYXJrPTEwMDAzLGUuY2hlY3lyaWxsaWM9MTA5NSxlLmNoZWRlc2NlbmRlcmFia2hhc2lhbmN5cmlsbGljPTEyMTUsZS5jaGVkZXNjZW5kZXJjeXJpbGxpYz0xMjA3LGUuY2hlZGllcmVzaXNjeXJpbGxpYz0xMjY5LGUuY2hlaGFybWVuaWFuPTEzOTUsZS5jaGVraGFrYXNzaWFuY3lyaWxsaWM9MTIyOCxlLmNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWM9MTIwOSxlLmNoaT05NjcsZS5jaGlldWNoYWNpcmNsZWtvcmVhbj0xMjkxOSxlLmNoaWV1Y2hhcGFyZW5rb3JlYW49MTI4MjMsZS5jaGlldWNoY2lyY2xla29yZWFuPTEyOTA1LGUuY2hpZXVjaGtvcmVhbj0xMjYxOCxlLmNoaWV1Y2hwYXJlbmtvcmVhbj0xMjgwOSxlLmNob2NoYW5ndGhhaT0zNTk0LGUuY2hvY2hhbnRoYWk9MzU5MixlLmNob2NoaW5ndGhhaT0zNTkzLGUuY2hvY2hvZXRoYWk9MzU5NixlLmNob29rPTM5MixlLmNpZXVjYWNpcmNsZWtvcmVhbj0xMjkxOCxlLmNpZXVjYXBhcmVua29yZWFuPTEyODIyLGUuY2lldWNjaXJjbGVrb3JlYW49MTI5MDQsZS5jaWV1Y2tvcmVhbj0xMjYxNixlLmNpZXVjcGFyZW5rb3JlYW49MTI4MDgsZS5jaWV1Y3VwYXJlbmtvcmVhbj0xMjgyOCxlLmNpcmNsZT05Njc1LGUuY2lyY2xlY29weXJ0PTE2OSxlLmNpcmNsZW11bHRpcGx5PTg4NTUsZS5jaXJjbGVvdD04ODU3LGUuY2lyY2xlcGx1cz04ODUzLGUuY2lyY2xlcG9zdGFsbWFyaz0xMjM0MixlLmNpcmNsZXdpdGhsZWZ0aGFsZmJsYWNrPTk2ODAsZS5jaXJjbGV3aXRocmlnaHRoYWxmYmxhY2s9OTY4MSxlLmNpcmN1bWZsZXg9NzEwLGUuY2lyY3VtZmxleGJlbG93Y21iPTgxMyxlLmNpcmN1bWZsZXhjbWI9NzcwLGUuY2xlYXI9ODk5OSxlLmNsaWNrYWx2ZW9sYXI9NDUwLGUuY2xpY2tkZW50YWw9NDQ4LGUuY2xpY2tsYXRlcmFsPTQ0OSxlLmNsaWNrcmV0cm9mbGV4PTQ1MSxlLmNsdWI9OTgyNyxlLmNsdWJzdWl0YmxhY2s9OTgyNyxlLmNsdWJzdWl0d2hpdGU9OTgzMSxlLmNtY3ViZWRzcXVhcmU9MTMyMjAsZS5jbW9ub3NwYWNlPTY1MzQ3LGUuY21zcXVhcmVkc3F1YXJlPTEzMjE2LGUuY29hcm1lbmlhbj0xNDA5LGUuY29sb249NTgsZS5jb2xvbm1vbmV0YXJ5PTgzNTMsZS5jb2xvbm1vbm9zcGFjZT02NTMwNixlLmNvbG9uc2lnbj04MzUzLGUuY29sb25zbWFsbD02NTEwOSxlLmNvbG9udHJpYW5ndWxhcmhhbGZtb2Q9NzIxLGUuY29sb250cmlhbmd1bGFybW9kPTcyMCxlLmNvbW1hPTQ0LGUuY29tbWFhYm92ZWNtYj03ODcsZS5jb21tYWFib3ZlcmlnaHRjbWI9Nzg5LGUuY29tbWFhY2NlbnQ9NjMxNzEsZS5jb21tYWFyYWJpYz0xNTQ4LGUuY29tbWFhcm1lbmlhbj0xMzczLGUuY29tbWFpbmZlcmlvcj02MzIwMSxlLmNvbW1hbW9ub3NwYWNlPTY1MjkyLGUuY29tbWFyZXZlcnNlZGFib3ZlY21iPTc4OCxlLmNvbW1hcmV2ZXJzZWRtb2Q9NzAxLGUuY29tbWFzbWFsbD02NTEwNCxlLmNvbW1hc3VwZXJpb3I9NjMyMDIsZS5jb21tYXR1cm5lZGFib3ZlY21iPTc4NixlLmNvbW1hdHVybmVkbW9kPTY5OSxlLmNvbXBhc3M9OTc4OCxlLmNvbmdydWVudD04NzczLGUuY29udG91cmludGVncmFsPTg3NTAsZS5jb250cm9sPTg5NjMsZS5jb250cm9sQUNLPTYsZS5jb250cm9sQkVMPTcsZS5jb250cm9sQlM9OCxlLmNvbnRyb2xDQU49MjQsZS5jb250cm9sQ1I9MTMsZS5jb250cm9sREMxPTE3LGUuY29udHJvbERDMj0xOCxlLmNvbnRyb2xEQzM9MTksZS5jb250cm9sREM0PTIwLGUuY29udHJvbERFTD0xMjcsZS5jb250cm9sRExFPTE2LGUuY29udHJvbEVNPTI1LGUuY29udHJvbEVOUT01LGUuY29udHJvbEVPVD00LGUuY29udHJvbEVTQz0yNyxlLmNvbnRyb2xFVEI9MjMsZS5jb250cm9sRVRYPTMsZS5jb250cm9sRkY9MTIsZS5jb250cm9sRlM9MjgsZS5jb250cm9sR1M9MjksZS5jb250cm9sSFQ9OSxlLmNvbnRyb2xMRj0xMCxlLmNvbnRyb2xOQUs9MjEsZS5jb250cm9sTlVMTD0wLGUuY29udHJvbFJTPTMwLGUuY29udHJvbFNJPTE1LGUuY29udHJvbFNPPTE0LGUuY29udHJvbFNPVD0yLGUuY29udHJvbFNUWD0xLGUuY29udHJvbFNVQj0yNixlLmNvbnRyb2xTWU49MjIsZS5jb250cm9sVVM9MzEsZS5jb250cm9sVlQ9MTEsZS5jb3B5cmlnaHQ9MTY5LGUuY29weXJpZ2h0c2Fucz02MzcyMSxlLmNvcHlyaWdodHNlcmlmPTYzMTkzLGUuY29ybmVyYnJhY2tldGxlZnQ9MTIzMDAsZS5jb3JuZXJicmFja2V0bGVmdGhhbGZ3aWR0aD02NTM3OCxlLmNvcm5lcmJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODksZS5jb3JuZXJicmFja2V0cmlnaHQ9MTIzMDEsZS5jb3JuZXJicmFja2V0cmlnaHRoYWxmd2lkdGg9NjUzNzksZS5jb3JuZXJicmFja2V0cmlnaHR2ZXJ0aWNhbD02NTA5MCxlLmNvcnBvcmF0aW9uc3F1YXJlPTEzMTgzLGUuY29zcXVhcmU9MTMyNTUsZS5jb3Zlcmtnc3F1YXJlPTEzMjU0LGUuY3BhcmVuPTkzNzQsZS5jcnV6ZWlybz04MzU0LGUuY3N0cmV0Y2hlZD02NjMsZS5jdXJseWFuZD04OTExLGUuY3VybHlvcj04OTEwLGUuY3VycmVuY3k9MTY0LGUuY3lyQnJldmU9NjMxODUsZS5jeXJGbGV4PTYzMTg2LGUuY3lyYnJldmU9NjMxODgsZS5jeXJmbGV4PTYzMTg5LGUuZD0xMDAsZS5kYWFybWVuaWFuPTEzODAsZS5kYWJlbmdhbGk9MjQ3MCxlLmRhZGFyYWJpYz0xNTkwLGUuZGFkZXZhPTIzNDIsZS5kYWRmaW5hbGFyYWJpYz02NTIxNCxlLmRhZGluaXRpYWxhcmFiaWM9NjUyMTUsZS5kYWRtZWRpYWxhcmFiaWM9NjUyMTYsZS5kYWdlc2g9MTQ2OCxlLmRhZ2VzaGhlYnJldz0xNDY4LGUuZGFnZ2VyPTgyMjQsZS5kYWdnZXJkYmw9ODIyNSxlLmRhZ3VqYXJhdGk9MjcyNixlLmRhZ3VybXVraGk9MjU5OCxlLmRhaGlyYWdhbmE9MTIzODQsZS5kYWthdGFrYW5hPTEyNDgwLGUuZGFsYXJhYmljPTE1ODMsZS5kYWxldD0xNDkxLGUuZGFsZXRkYWdlc2g9NjQzMDcsZS5kYWxldGRhZ2VzaGhlYnJldz02NDMwNyxlLmRhbGV0aGVicmV3PTE0OTEsZS5kYWxmaW5hbGFyYWJpYz02NTE5NCxlLmRhbW1hYXJhYmljPTE2MTUsZS5kYW1tYWxvd2FyYWJpYz0xNjE1LGUuZGFtbWF0YW5hbHRvbmVhcmFiaWM9MTYxMixlLmRhbW1hdGFuYXJhYmljPTE2MTIsZS5kYW5kYT0yNDA0LGUuZGFyZ2FoZWJyZXc9MTQ0NyxlLmRhcmdhbGVmdGhlYnJldz0xNDQ3LGUuZGFzaWFwbmV1bWF0YWN5cmlsbGljY21iPTExNTcsZS5kYmxHcmF2ZT02MzE4NyxlLmRibGFuZ2xlYnJhY2tldGxlZnQ9MTIyOTgsZS5kYmxhbmdsZWJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODUsZS5kYmxhbmdsZWJyYWNrZXRyaWdodD0xMjI5OSxlLmRibGFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwODYsZS5kYmxhcmNoaW52ZXJ0ZWRiZWxvd2NtYj04MTEsZS5kYmxhcnJvd2xlZnQ9ODY2MCxlLmRibGFycm93cmlnaHQ9ODY1OCxlLmRibGRhbmRhPTI0MDUsZS5kYmxncmF2ZT02MzE5MCxlLmRibGdyYXZlY21iPTc4MyxlLmRibGludGVncmFsPTg3NDgsZS5kYmxsb3dsaW5lPTgyMTUsZS5kYmxsb3dsaW5lY21iPTgxOSxlLmRibG92ZXJsaW5lY21iPTgzMSxlLmRibHByaW1lbW9kPTY5OCxlLmRibHZlcnRpY2FsYmFyPTgyMTQsZS5kYmx2ZXJ0aWNhbGxpbmVhYm92ZWNtYj03ODIsZS5kYm9wb21vZm89MTI1NTMsZS5kYnNxdWFyZT0xMzI1NixlLmRjYXJvbj0yNzEsZS5kY2VkaWxsYT03Njk3LGUuZGNpcmNsZT05NDI3LGUuZGNpcmN1bWZsZXhiZWxvdz03Njk5LGUuZGNyb2F0PTI3MyxlLmRkYWJlbmdhbGk9MjQ2NSxlLmRkYWRldmE9MjMzNyxlLmRkYWd1amFyYXRpPTI3MjEsZS5kZGFndXJtdWtoaT0yNTkzLGUuZGRhbGFyYWJpYz0xNjcyLGUuZGRhbGZpbmFsYXJhYmljPTY0MzkzLGUuZGRkaGFkZXZhPTIzOTYsZS5kZGhhYmVuZ2FsaT0yNDY2LGUuZGRoYWRldmE9MjMzOCxlLmRkaGFndWphcmF0aT0yNzIyLGUuZGRoYWd1cm11a2hpPTI1OTQsZS5kZG90YWNjZW50PTc2OTEsZS5kZG90YmVsb3c9NzY5MyxlLmRlY2ltYWxzZXBhcmF0b3JhcmFiaWM9MTY0MyxlLmRlY2ltYWxzZXBhcmF0b3JwZXJzaWFuPTE2NDMsZS5kZWN5cmlsbGljPTEwNzYsZS5kZWdyZWU9MTc2LGUuZGVoaWhlYnJldz0xNDUzLGUuZGVoaXJhZ2FuYT0xMjM5MSxlLmRlaWNvcHRpYz0xMDA3LGUuZGVrYXRha2FuYT0xMjQ4NyxlLmRlbGV0ZWxlZnQ9OTAwMyxlLmRlbGV0ZXJpZ2h0PTg5OTgsZS5kZWx0YT05NDgsZS5kZWx0YXR1cm5lZD0zOTcsZS5kZW5vbWluYXRvcm1pbnVzb25lbnVtZXJhdG9yYmVuZ2FsaT0yNTUyLGUuZGV6aD02NzYsZS5kaGFiZW5nYWxpPTI0NzEsZS5kaGFkZXZhPTIzNDMsZS5kaGFndWphcmF0aT0yNzI3LGUuZGhhZ3VybXVraGk9MjU5OSxlLmRob29rPTU5OSxlLmRpYWx5dGlrYXRvbm9zPTkwMSxlLmRpYWx5dGlrYXRvbm9zY21iPTgzNixlLmRpYW1vbmQ9OTgzMCxlLmRpYW1vbmRzdWl0d2hpdGU9OTgyNixlLmRpZXJlc2lzPTE2OCxlLmRpZXJlc2lzYWN1dGU9NjMxOTEsZS5kaWVyZXNpc2JlbG93Y21iPTgwNCxlLmRpZXJlc2lzY21iPTc3NixlLmRpZXJlc2lzZ3JhdmU9NjMxOTIsZS5kaWVyZXNpc3Rvbm9zPTkwMSxlLmRpaGlyYWdhbmE9MTIzODYsZS5kaWthdGFrYW5hPTEyNDgyLGUuZGl0dG9tYXJrPTEyMjkxLGUuZGl2aWRlPTI0NyxlLmRpdmlkZXM9ODczOSxlLmRpdmlzaW9uc2xhc2g9ODcyNSxlLmRqZWN5cmlsbGljPTExMDYsZS5ka3NoYWRlPTk2MTksZS5kbGluZWJlbG93PTc2OTUsZS5kbHNxdWFyZT0xMzIwNyxlLmRtYWNyb249MjczLGUuZG1vbm9zcGFjZT02NTM0OCxlLmRuYmxvY2s9OTYwNCxlLmRvY2hhZGF0aGFpPTM1OTgsZS5kb2Rla3RoYWk9MzYwNCxlLmRvaGlyYWdhbmE9MTIzOTMsZS5kb2thdGFrYW5hPTEyNDg5LGUuZG9sbGFyPTM2O2UuZG9sbGFyaW5mZXJpb3I9NjMyMDMsZS5kb2xsYXJtb25vc3BhY2U9NjUyODQsZS5kb2xsYXJvbGRzdHlsZT02MzI2OCxlLmRvbGxhcnNtYWxsPTY1MTI5LGUuZG9sbGFyc3VwZXJpb3I9NjMyMDQsZS5kb25nPTgzNjMsZS5kb3J1c3F1YXJlPTEzMDk0LGUuZG90YWNjZW50PTcyOSxlLmRvdGFjY2VudGNtYj03NzUsZS5kb3RiZWxvd2NtYj04MDMsZS5kb3RiZWxvd2NvbWI9ODAzLGUuZG90a2F0YWthbmE9MTI1MzksZS5kb3RsZXNzaT0zMDUsZS5kb3RsZXNzaj02MzE2NixlLmRvdGxlc3Nqc3Ryb2tlaG9vaz02NDQsZS5kb3RtYXRoPTg5MDEsZS5kb3R0ZWRjaXJjbGU9OTY3NixlLmRvdWJsZXlvZHBhdGFoPTY0Mjg3LGUuZG91YmxleW9kcGF0YWhoZWJyZXc9NjQyODcsZS5kb3dudGFja2JlbG93Y21iPTc5OCxlLmRvd250YWNrbW9kPTcyNSxlLmRwYXJlbj05Mzc1LGUuZHN1cGVyaW9yPTYzMjExLGUuZHRhaWw9NTk4LGUuZHRvcGJhcj0zOTYsZS5kdWhpcmFnYW5hPTEyMzg5LGUuZHVrYXRha2FuYT0xMjQ4NSxlLmR6PTQ5OSxlLmR6YWx0b25lPTY3NSxlLmR6Y2Fyb249NDU0LGUuZHpjdXJsPTY3NyxlLmR6ZWFia2hhc2lhbmN5cmlsbGljPTEyNDksZS5kemVjeXJpbGxpYz0xMTA5LGUuZHpoZWN5cmlsbGljPTExMTksZS5lPTEwMSxlLmVhY3V0ZT0yMzMsZS5lYXJ0aD05NzkzLGUuZWJlbmdhbGk9MjQ0NyxlLmVib3BvbW9mbz0xMjU3MixlLmVicmV2ZT0yNzcsZS5lY2FuZHJhZGV2YT0yMzE3LGUuZWNhbmRyYWd1amFyYXRpPTI3MDEsZS5lY2FuZHJhdm93ZWxzaWduZGV2YT0yMzczLGUuZWNhbmRyYXZvd2Vsc2lnbmd1amFyYXRpPTI3NTcsZS5lY2Fyb249MjgzLGUuZWNlZGlsbGFicmV2ZT03NzA5LGUuZWNoYXJtZW5pYW49MTM4MSxlLmVjaHlpd25hcm1lbmlhbj0xNDE1LGUuZWNpcmNsZT05NDI4LGUuZWNpcmN1bWZsZXg9MjM0LGUuZWNpcmN1bWZsZXhhY3V0ZT03ODcxLGUuZWNpcmN1bWZsZXhiZWxvdz03NzA1LGUuZWNpcmN1bWZsZXhkb3RiZWxvdz03ODc5LGUuZWNpcmN1bWZsZXhncmF2ZT03ODczLGUuZWNpcmN1bWZsZXhob29rYWJvdmU9Nzg3NSxlLmVjaXJjdW1mbGV4dGlsZGU9Nzg3NyxlLmVjeXJpbGxpYz0xMTA4LGUuZWRibGdyYXZlPTUxNyxlLmVkZXZhPTIzMTksZS5lZGllcmVzaXM9MjM1LGUuZWRvdD0yNzksZS5lZG90YWNjZW50PTI3OSxlLmVkb3RiZWxvdz03ODY1LGUuZWVndXJtdWtoaT0yNTc1LGUuZWVtYXRyYWd1cm11a2hpPTI2MzEsZS5lZmN5cmlsbGljPTEwOTIsZS5lZ3JhdmU9MjMyLGUuZWd1amFyYXRpPTI3MDMsZS5laGFybWVuaWFuPTEzODMsZS5laGJvcG9tb2ZvPTEyNTczLGUuZWhpcmFnYW5hPTEyMzYwLGUuZWhvb2thYm92ZT03ODY3LGUuZWlib3BvbW9mbz0xMjU3NSxlLmVpZ2h0PTU2LGUuZWlnaHRhcmFiaWM9MTY0MCxlLmVpZ2h0YmVuZ2FsaT0yNTQyLGUuZWlnaHRjaXJjbGU9OTMxOSxlLmVpZ2h0Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyOSxlLmVpZ2h0ZGV2YT0yNDE0LGUuZWlnaHRlZW5jaXJjbGU9OTMyOSxlLmVpZ2h0ZWVucGFyZW49OTM0OSxlLmVpZ2h0ZWVucGVyaW9kPTkzNjksZS5laWdodGd1amFyYXRpPTI3OTgsZS5laWdodGd1cm11a2hpPTI2NzAsZS5laWdodGhhY2thcmFiaWM9MTY0MCxlLmVpZ2h0aGFuZ3pob3U9MTIzMjgsZS5laWdodGhub3RlYmVhbWVkPTk4MzUsZS5laWdodGlkZW9ncmFwaGljcGFyZW49MTI4MzksZS5laWdodGluZmVyaW9yPTgzMjgsZS5laWdodG1vbm9zcGFjZT02NTMwNCxlLmVpZ2h0b2xkc3R5bGU9NjMyODgsZS5laWdodHBhcmVuPTkzMzksZS5laWdodHBlcmlvZD05MzU5LGUuZWlnaHRwZXJzaWFuPTE3ODQsZS5laWdodHJvbWFuPTg1NjcsZS5laWdodHN1cGVyaW9yPTgzMTIsZS5laWdodHRoYWk9MzY3MixlLmVpbnZlcnRlZGJyZXZlPTUxOSxlLmVpb3RpZmllZGN5cmlsbGljPTExMjUsZS5la2F0YWthbmE9MTI0NTYsZS5la2F0YWthbmFoYWxmd2lkdGg9NjUzOTYsZS5la29ua2FyZ3VybXVraGk9MjY3NixlLmVrb3JlYW49MTI2MjgsZS5lbGN5cmlsbGljPTEwODMsZS5lbGVtZW50PTg3MTIsZS5lbGV2ZW5jaXJjbGU9OTMyMixlLmVsZXZlbnBhcmVuPTkzNDIsZS5lbGV2ZW5wZXJpb2Q9OTM2MixlLmVsZXZlbnJvbWFuPTg1NzAsZS5lbGxpcHNpcz04MjMwLGUuZWxsaXBzaXN2ZXJ0aWNhbD04OTQyLGUuZW1hY3Jvbj0yNzUsZS5lbWFjcm9uYWN1dGU9NzcwMyxlLmVtYWNyb25ncmF2ZT03NzAxLGUuZW1jeXJpbGxpYz0xMDg0LGUuZW1kYXNoPTgyMTIsZS5lbWRhc2h2ZXJ0aWNhbD02NTA3MyxlLmVtb25vc3BhY2U9NjUzNDksZS5lbXBoYXNpc21hcmthcm1lbmlhbj0xMzcxLGUuZW1wdHlzZXQ9ODcwOSxlLmVuYm9wb21vZm89MTI1NzksZS5lbmN5cmlsbGljPTEwODUsZS5lbmRhc2g9ODIxMSxlLmVuZGFzaHZlcnRpY2FsPTY1MDc0LGUuZW5kZXNjZW5kZXJjeXJpbGxpYz0xMTg3LGUuZW5nPTMzMSxlLmVuZ2JvcG9tb2ZvPTEyNTgxLGUuZW5naGVjeXJpbGxpYz0xMTg5LGUuZW5ob29rY3lyaWxsaWM9MTIyNCxlLmVuc3BhY2U9ODE5NCxlLmVvZ29uZWs9MjgxLGUuZW9rb3JlYW49MTI2MjcsZS5lb3Blbj02MDMsZS5lb3BlbmNsb3NlZD02NjYsZS5lb3BlbnJldmVyc2VkPTYwNCxlLmVvcGVucmV2ZXJzZWRjbG9zZWQ9NjA2LGUuZW9wZW5yZXZlcnNlZGhvb2s9NjA1LGUuZXBhcmVuPTkzNzYsZS5lcHNpbG9uPTk0OSxlLmVwc2lsb250b25vcz05NDEsZS5lcXVhbD02MSxlLmVxdWFsbW9ub3NwYWNlPTY1MzA5LGUuZXF1YWxzbWFsbD02NTEyNixlLmVxdWFsc3VwZXJpb3I9ODMxNixlLmVxdWl2YWxlbmNlPTg4MDEsZS5lcmJvcG9tb2ZvPTEyNTgyLGUuZXJjeXJpbGxpYz0xMDg4LGUuZXJldmVyc2VkPTYwMCxlLmVyZXZlcnNlZGN5cmlsbGljPTExMDEsZS5lc2N5cmlsbGljPTEwODksZS5lc2Rlc2NlbmRlcmN5cmlsbGljPTExOTUsZS5lc2g9NjQzLGUuZXNoY3VybD02NDYsZS5lc2hvcnRkZXZhPTIzMTgsZS5lc2hvcnR2b3dlbHNpZ25kZXZhPTIzNzQsZS5lc2hyZXZlcnNlZGxvb3A9NDI2LGUuZXNoc3F1YXRyZXZlcnNlZD02NDUsZS5lc21hbGxoaXJhZ2FuYT0xMjM1OSxlLmVzbWFsbGthdGFrYW5hPTEyNDU1LGUuZXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODYsZS5lc3RpbWF0ZWQ9ODQ5NCxlLmVzdXBlcmlvcj02MzIxMixlLmV0YT05NTEsZS5ldGFybWVuaWFuPTEzODQsZS5ldGF0b25vcz05NDIsZS5ldGg9MjQwLGUuZXRpbGRlPTc4NjksZS5ldGlsZGViZWxvdz03NzA3LGUuZXRuYWh0YWZvdWtoaGVicmV3PTE0MjUsZS5ldG5haHRhZm91a2hsZWZ0aGVicmV3PTE0MjUsZS5ldG5haHRhaGVicmV3PTE0MjUsZS5ldG5haHRhbGVmdGhlYnJldz0xNDI1LGUuZXR1cm5lZD00NzcsZS5ldWtvcmVhbj0xMjY0MSxlLmV1cm89ODM2NCxlLmV2b3dlbHNpZ25iZW5nYWxpPTI1MDMsZS5ldm93ZWxzaWduZGV2YT0yMzc1LGUuZXZvd2Vsc2lnbmd1amFyYXRpPTI3NTksZS5leGNsYW09MzMsZS5leGNsYW1hcm1lbmlhbj0xMzcyLGUuZXhjbGFtZGJsPTgyNTIsZS5leGNsYW1kb3duPTE2MSxlLmV4Y2xhbWRvd25zbWFsbD02MzM5MyxlLmV4Y2xhbW1vbm9zcGFjZT02NTI4MSxlLmV4Y2xhbXNtYWxsPTYzMjY1LGUuZXhpc3RlbnRpYWw9ODcwNyxlLmV6aD02NTgsZS5lemhjYXJvbj00OTUsZS5lemhjdXJsPTY1OSxlLmV6aHJldmVyc2VkPTQ0MSxlLmV6aHRhaWw9NDQyLGUuZj0xMDIsZS5mYWRldmE9MjM5OCxlLmZhZ3VybXVraGk9MjY1NCxlLmZhaHJlbmhlaXQ9ODQ1NyxlLmZhdGhhYXJhYmljPTE2MTQsZS5mYXRoYWxvd2FyYWJpYz0xNjE0LGUuZmF0aGF0YW5hcmFiaWM9MTYxMSxlLmZib3BvbW9mbz0xMjU1MixlLmZjaXJjbGU9OTQyOSxlLmZkb3RhY2NlbnQ9NzcxMSxlLmZlaGFyYWJpYz0xNjAxLGUuZmVoYXJtZW5pYW49MTQxNCxlLmZlaGZpbmFsYXJhYmljPTY1MjM0LGUuZmVoaW5pdGlhbGFyYWJpYz02NTIzNSxlLmZlaG1lZGlhbGFyYWJpYz02NTIzNixlLmZlaWNvcHRpYz05OTcsZS5mZW1hbGU9OTc5MixlLmZmPTY0MjU2LGUuZl9mPTY0MjU2LGUuZmZpPTY0MjU5LGUuZl9mX2k9NjQyNTksZS5mZmw9NjQyNjAsZS5mX2ZfbD02NDI2MCxlLmZpPTY0MjU3LGUuZl9pPTY0MjU3LGUuZmlmdGVlbmNpcmNsZT05MzI2LGUuZmlmdGVlbnBhcmVuPTkzNDYsZS5maWZ0ZWVucGVyaW9kPTkzNjYsZS5maWd1cmVkYXNoPTgyMTAsZS5maWxsZWRib3g9OTYzMixlLmZpbGxlZHJlY3Q9OTY0NCxlLmZpbmFsa2FmPTE0OTgsZS5maW5hbGthZmRhZ2VzaD02NDMxNCxlLmZpbmFsa2FmZGFnZXNoaGVicmV3PTY0MzE0LGUuZmluYWxrYWZoZWJyZXc9MTQ5OCxlLmZpbmFsbWVtPTE1MDEsZS5maW5hbG1lbWhlYnJldz0xNTAxLGUuZmluYWxudW49MTUwMyxlLmZpbmFsbnVuaGVicmV3PTE1MDMsZS5maW5hbHBlPTE1MDcsZS5maW5hbHBlaGVicmV3PTE1MDcsZS5maW5hbHRzYWRpPTE1MDksZS5maW5hbHRzYWRpaGVicmV3PTE1MDksZS5maXJzdHRvbmVjaGluZXNlPTcxMyxlLmZpc2hleWU9OTY3MyxlLmZpdGFjeXJpbGxpYz0xMTM5LGUuZml2ZT01MyxlLmZpdmVhcmFiaWM9MTYzNyxlLmZpdmViZW5nYWxpPTI1MzksZS5maXZlY2lyY2xlPTkzMTYsZS5maXZlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyNixlLmZpdmVkZXZhPTI0MTEsZS5maXZlZWlnaHRocz04NTQxLGUuZml2ZWd1amFyYXRpPTI3OTUsZS5maXZlZ3VybXVraGk9MjY2NyxlLmZpdmVoYWNrYXJhYmljPTE2MzcsZS5maXZlaGFuZ3pob3U9MTIzMjUsZS5maXZlaWRlb2dyYXBoaWNwYXJlbj0xMjgzNixlLmZpdmVpbmZlcmlvcj04MzI1LGUuZml2ZW1vbm9zcGFjZT02NTMwMSxlLmZpdmVvbGRzdHlsZT02MzI4NSxlLmZpdmVwYXJlbj05MzM2LGUuZml2ZXBlcmlvZD05MzU2LGUuZml2ZXBlcnNpYW49MTc4MSxlLmZpdmVyb21hbj04NTY0LGUuZml2ZXN1cGVyaW9yPTgzMDksZS5maXZldGhhaT0zNjY5LGUuZmw9NjQyNTgsZS5mX2w9NjQyNTgsZS5mbG9yaW49NDAyLGUuZm1vbm9zcGFjZT02NTM1MCxlLmZtc3F1YXJlPTEzMjA5LGUuZm9mYW50aGFpPTM2MTUsZS5mb2ZhdGhhaT0zNjEzLGUuZm9uZ21hbnRoYWk9MzY2MyxlLmZvcmFsbD04NzA0LGUuZm91cj01MixlLmZvdXJhcmFiaWM9MTYzNixlLmZvdXJiZW5nYWxpPTI1MzgsZS5mb3VyY2lyY2xlPTkzMTUsZS5mb3VyY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyNSxlLmZvdXJkZXZhPTI0MTAsZS5mb3VyZ3VqYXJhdGk9Mjc5NCxlLmZvdXJndXJtdWtoaT0yNjY2LGUuZm91cmhhY2thcmFiaWM9MTYzNixlLmZvdXJoYW5nemhvdT0xMjMyNCxlLmZvdXJpZGVvZ3JhcGhpY3BhcmVuPTEyODM1LGUuZm91cmluZmVyaW9yPTgzMjQsZS5mb3VybW9ub3NwYWNlPTY1MzAwLGUuZm91cm51bWVyYXRvcmJlbmdhbGk9MjU1MSxlLmZvdXJvbGRzdHlsZT02MzI4NCxlLmZvdXJwYXJlbj05MzM1LGUuZm91cnBlcmlvZD05MzU1LGUuZm91cnBlcnNpYW49MTc4MCxlLmZvdXJyb21hbj04NTYzLGUuZm91cnN1cGVyaW9yPTgzMDgsZS5mb3VydGVlbmNpcmNsZT05MzI1LGUuZm91cnRlZW5wYXJlbj05MzQ1LGUuZm91cnRlZW5wZXJpb2Q9OTM2NSxlLmZvdXJ0aGFpPTM2NjgsZS5mb3VydGh0b25lY2hpbmVzZT03MTUsZS5mcGFyZW49OTM3NyxlLmZyYWN0aW9uPTgyNjAsZS5mcmFuYz04MzU1LGUuZz0xMDMsZS5nYWJlbmdhbGk9MjQ1NSxlLmdhY3V0ZT01MDEsZS5nYWRldmE9MjMyNyxlLmdhZmFyYWJpYz0xNzExLGUuZ2FmZmluYWxhcmFiaWM9NjQ0MDMsZS5nYWZpbml0aWFsYXJhYmljPTY0NDA0LGUuZ2FmbWVkaWFsYXJhYmljPTY0NDA1LGUuZ2FndWphcmF0aT0yNzExLGUuZ2FndXJtdWtoaT0yNTgzLGUuZ2FoaXJhZ2FuYT0xMjM2NCxlLmdha2F0YWthbmE9MTI0NjAsZS5nYW1tYT05NDcsZS5nYW1tYWxhdGluc21hbGw9NjExLGUuZ2FtbWFzdXBlcmlvcj03MzYsZS5nYW5naWFjb3B0aWM9MTAwMyxlLmdib3BvbW9mbz0xMjU1NyxlLmdicmV2ZT0yODcsZS5nY2Fyb249NDg3LGUuZ2NlZGlsbGE9MjkxLGUuZ2NpcmNsZT05NDMwLGUuZ2NpcmN1bWZsZXg9Mjg1LGUuZ2NvbW1hYWNjZW50PTI5MSxlLmdkb3Q9Mjg5LGUuZ2RvdGFjY2VudD0yODksZS5nZWN5cmlsbGljPTEwNzUsZS5nZWhpcmFnYW5hPTEyMzcwLGUuZ2VrYXRha2FuYT0xMjQ2NixlLmdlb21ldHJpY2FsbHllcXVhbD04Nzg1LGUuZ2VyZXNoYWNjZW50aGVicmV3PTE0MzYsZS5nZXJlc2hoZWJyZXc9MTUyMyxlLmdlcmVzaG11cWRhbWhlYnJldz0xNDM3LGUuZ2VybWFuZGJscz0yMjMsZS5nZXJzaGF5aW1hY2NlbnRoZWJyZXc9MTQzOCxlLmdlcnNoYXlpbWhlYnJldz0xNTI0LGUuZ2V0YW1hcms9MTIzMDcsZS5naGFiZW5nYWxpPTI0NTYsZS5naGFkYXJtZW5pYW49MTM5NCxlLmdoYWRldmE9MjMyOCxlLmdoYWd1amFyYXRpPTI3MTIsZS5naGFndXJtdWtoaT0yNTg0LGUuZ2hhaW5hcmFiaWM9MTU5NCxlLmdoYWluZmluYWxhcmFiaWM9NjUyMzAsZS5naGFpbmluaXRpYWxhcmFiaWM9NjUyMzEsZS5naGFpbm1lZGlhbGFyYWJpYz02NTIzMixlLmdoZW1pZGRsZWhvb2tjeXJpbGxpYz0xMTczLGUuZ2hlc3Ryb2tlY3lyaWxsaWM9MTE3MSxlLmdoZXVwdHVybmN5cmlsbGljPTExNjksZS5naGhhZGV2YT0yMzk0LGUuZ2hoYWd1cm11a2hpPTI2NTAsZS5naG9vaz02MDgsZS5naHpzcXVhcmU9MTMyMDMsZS5naWhpcmFnYW5hPTEyMzY2LGUuZ2lrYXRha2FuYT0xMjQ2MixlLmdpbWFybWVuaWFuPTEzNzksZS5naW1lbD0xNDkwLGUuZ2ltZWxkYWdlc2g9NjQzMDYsZS5naW1lbGRhZ2VzaGhlYnJldz02NDMwNixlLmdpbWVsaGVicmV3PTE0OTAsZS5namVjeXJpbGxpYz0xMTA3LGUuZ2xvdHRhbGludmVydGVkc3Ryb2tlPTQ0NixlLmdsb3R0YWxzdG9wPTY2MCxlLmdsb3R0YWxzdG9waW52ZXJ0ZWQ9NjYyLGUuZ2xvdHRhbHN0b3Btb2Q9NzA0LGUuZ2xvdHRhbHN0b3ByZXZlcnNlZD02NjEsZS5nbG90dGFsc3RvcHJldmVyc2VkbW9kPTcwNSxlLmdsb3R0YWxzdG9wcmV2ZXJzZWRzdXBlcmlvcj03NDAsZS5nbG90dGFsc3RvcHN0cm9rZT02NzMsZS5nbG90dGFsc3RvcHN0cm9rZXJldmVyc2VkPTY3NCxlLmdtYWNyb249NzcxMyxlLmdtb25vc3BhY2U9NjUzNTEsZS5nb2hpcmFnYW5hPTEyMzcyLGUuZ29rYXRha2FuYT0xMjQ2OCxlLmdwYXJlbj05Mzc4LGUuZ3Bhc3F1YXJlPTEzMjI4LGUuZ3JhZGllbnQ9ODcxMSxlLmdyYXZlPTk2LGUuZ3JhdmViZWxvd2NtYj03OTAsZS5ncmF2ZWNtYj03NjgsZS5ncmF2ZWNvbWI9NzY4LGUuZ3JhdmVkZXZhPTIzODcsZS5ncmF2ZWxvd21vZD03MTgsZS5ncmF2ZW1vbm9zcGFjZT02NTM0NCxlLmdyYXZldG9uZWNtYj04MzIsZS5ncmVhdGVyPTYyLGUuZ3JlYXRlcmVxdWFsPTg4MDUsZS5ncmVhdGVyZXF1YWxvcmxlc3M9ODkyMyxlLmdyZWF0ZXJtb25vc3BhY2U9NjUzMTAsZS5ncmVhdGVyb3JlcXVpdmFsZW50PTg4MTksZS5ncmVhdGVyb3JsZXNzPTg4MjMsZS5ncmVhdGVyb3ZlcmVxdWFsPTg4MDcsZS5ncmVhdGVyc21hbGw9NjUxMjUsZS5nc2NyaXB0PTYwOSxlLmdzdHJva2U9NDg1LGUuZ3VoaXJhZ2FuYT0xMjM2OCxlLmd1aWxsZW1vdGxlZnQ9MTcxLGUuZ3VpbGxlbW90cmlnaHQ9MTg3LGUuZ3VpbHNpbmdsbGVmdD04MjQ5LGUuZ3VpbHNpbmdscmlnaHQ9ODI1MCxlLmd1a2F0YWthbmE9MTI0NjQsZS5ndXJhbXVzcXVhcmU9MTMwODAsZS5neXNxdWFyZT0xMzI1NyxlLmg9MTA0LGUuaGFhYmtoYXNpYW5jeXJpbGxpYz0xMTkzLGUuaGFhbHRvbmVhcmFiaWM9MTcyOSxlLmhhYmVuZ2FsaT0yNDg5LGUuaGFkZXNjZW5kZXJjeXJpbGxpYz0xMjAzLGUuaGFkZXZhPTIzNjEsZS5oYWd1amFyYXRpPTI3NDUsZS5oYWd1cm11a2hpPTI2MTcsZS5oYWhhcmFiaWM9MTU4MSxlLmhhaGZpbmFsYXJhYmljPTY1MTg2LGUuaGFoaW5pdGlhbGFyYWJpYz02NTE4NyxlLmhhaGlyYWdhbmE9MTIzOTksZS5oYWhtZWRpYWxhcmFiaWM9NjUxODgsZS5oYWl0dXNxdWFyZT0xMzA5OCxlLmhha2F0YWthbmE9MTI0OTUsZS5oYWthdGFrYW5haGFsZndpZHRoPTY1NDE4LGUuaGFsYW50Z3VybXVraGk9MjYzNyxlLmhhbXphYXJhYmljPTE1NjksZS5oYW16YWxvd2FyYWJpYz0xNTY5LGUuaGFuZ3VsZmlsbGVyPTEyNjQ0LGUuaGFyZHNpZ25jeXJpbGxpYz0xMDk4LGUuaGFycG9vbmxlZnRiYXJidXA9ODYzNixlLmhhcnBvb25yaWdodGJhcmJ1cD04NjQwLGUuaGFzcXVhcmU9MTMyNTgsZS5oYXRhZnBhdGFoPTE0NTgsZS5oYXRhZnBhdGFoMTY9MTQ1OCxlLmhhdGFmcGF0YWgyMz0xNDU4LGUuaGF0YWZwYXRhaDJmPTE0NTgsZS5oYXRhZnBhdGFoaGVicmV3PTE0NTgsZS5oYXRhZnBhdGFobmFycm93aGVicmV3PTE0NTgsZS5oYXRhZnBhdGFocXVhcnRlcmhlYnJldz0xNDU4LGUuaGF0YWZwYXRhaHdpZGVoZWJyZXc9MTQ1OCxlLmhhdGFmcWFtYXRzPTE0NTksZS5oYXRhZnFhbWF0czFiPTE0NTksZS5oYXRhZnFhbWF0czI4PTE0NTksZS5oYXRhZnFhbWF0czM0PTE0NTksZS5oYXRhZnFhbWF0c2hlYnJldz0xNDU5LGUuaGF0YWZxYW1hdHNuYXJyb3doZWJyZXc9MTQ1OSxlLmhhdGFmcWFtYXRzcXVhcnRlcmhlYnJldz0xNDU5LGUuaGF0YWZxYW1hdHN3aWRlaGVicmV3PTE0NTksZS5oYXRhZnNlZ29sPTE0NTcsZS5oYXRhZnNlZ29sMTc9MTQ1NyxlLmhhdGFmc2Vnb2wyND0xNDU3LGUuaGF0YWZzZWdvbDMwPTE0NTcsZS5oYXRhZnNlZ29saGVicmV3PTE0NTcsZS5oYXRhZnNlZ29sbmFycm93aGVicmV3PTE0NTcsZS5oYXRhZnNlZ29scXVhcnRlcmhlYnJldz0xNDU3LGUuaGF0YWZzZWdvbHdpZGVoZWJyZXc9MTQ1NyxlLmhiYXI9Mjk1LGUuaGJvcG9tb2ZvPTEyNTU5LGUuaGJyZXZlYmVsb3c9NzcyMyxlLmhjZWRpbGxhPTc3MjEsZS5oY2lyY2xlPTk0MzEsZS5oY2lyY3VtZmxleD0yOTMsZS5oZGllcmVzaXM9NzcxOSxlLmhkb3RhY2NlbnQ9NzcxNSxlLmhkb3RiZWxvdz03NzE3LGUuaGU9MTQ5MixlLmhlYXJ0PTk4MjksZS5oZWFydHN1aXRibGFjaz05ODI5LGUuaGVhcnRzdWl0d2hpdGU9OTgyNSxlLmhlZGFnZXNoPTY0MzA4LGUuaGVkYWdlc2hoZWJyZXc9NjQzMDgsZS5oZWhhbHRvbmVhcmFiaWM9MTcyOSxlLmhlaGFyYWJpYz0xNjA3LGUuaGVoZWJyZXc9MTQ5MixlLmhlaGZpbmFsYWx0b25lYXJhYmljPTY0NDIzLGUuaGVoZmluYWxhbHR0d29hcmFiaWM9NjUyNTgsZS5oZWhmaW5hbGFyYWJpYz02NTI1OCxlLmhlaGhhbXphYWJvdmVmaW5hbGFyYWJpYz02NDQyMSxlLmhlaGhhbXphYWJvdmVpc29sYXRlZGFyYWJpYz02NDQyMCxlLmhlaGluaXRpYWxhbHRvbmVhcmFiaWM9NjQ0MjQsZS5oZWhpbml0aWFsYXJhYmljPTY1MjU5LGUuaGVoaXJhZ2FuYT0xMjQwOCxlLmhlaG1lZGlhbGFsdG9uZWFyYWJpYz02NDQyNSxlLmhlaG1lZGlhbGFyYWJpYz02NTI2MCxlLmhlaXNlaWVyYXNxdWFyZT0xMzE3OSxlLmhla2F0YWthbmE9MTI1MDQsZS5oZWthdGFrYW5haGFsZndpZHRoPTY1NDIxLGUuaGVrdXRhYXJ1c3F1YXJlPTEzMTEwLGUuaGVuZ2hvb2s9NjE1LGUuaGVydXR1c3F1YXJlPTEzMTEzLGUuaGV0PTE0OTUsZS5oZXRoZWJyZXc9MTQ5NSxlLmhob29rPTYxNCxlLmhob29rc3VwZXJpb3I9Njg5LGUuaGlldWhhY2lyY2xla29yZWFuPTEyOTIzLGUuaGlldWhhcGFyZW5rb3JlYW49MTI4MjcsZS5oaWV1aGNpcmNsZWtvcmVhbj0xMjkwOSxlLmhpZXVoa29yZWFuPTEyNjIyLGUuaGlldWhwYXJlbmtvcmVhbj0xMjgxMyxlLmhpaGlyYWdhbmE9MTI0MDIsZS5oaWthdGFrYW5hPTEyNDk4LGUuaGlrYXRha2FuYWhhbGZ3aWR0aD02NTQxOSxlLmhpcmlxPTE0NjAsZS5oaXJpcTE0PTE0NjAsZS5oaXJpcTIxPTE0NjAsZS5oaXJpcTJkPTE0NjAsZS5oaXJpcWhlYnJldz0xNDYwLGUuaGlyaXFuYXJyb3doZWJyZXc9MTQ2MCxlLmhpcmlxcXVhcnRlcmhlYnJldz0xNDYwLGUuaGlyaXF3aWRlaGVicmV3PTE0NjAsZS5obGluZWJlbG93PTc4MzAsZS5obW9ub3NwYWNlPTY1MzUyLGUuaG9hcm1lbmlhbj0xMzkyLGUuaG9oaXB0aGFpPTM2MjcsZS5ob2hpcmFnYW5hPTEyNDExLGUuaG9rYXRha2FuYT0xMjUwNyxlLmhva2F0YWthbmFoYWxmd2lkdGg9NjU0MjIsZS5ob2xhbT0xNDY1LGUuaG9sYW0xOT0xNDY1LGUuaG9sYW0yNj0xNDY1LGUuaG9sYW0zMj0xNDY1LGUuaG9sYW1oZWJyZXc9MTQ2NSxlLmhvbGFtbmFycm93aGVicmV3PTE0NjUsZS5ob2xhbXF1YXJ0ZXJoZWJyZXc9MTQ2NSxlLmhvbGFtd2lkZWhlYnJldz0xNDY1LGUuaG9ub2todWt0aGFpPTM2MzAsZS5ob29rYWJvdmVjb21iPTc3NyxlLmhvb2tjbWI9Nzc3LGUuaG9va3BhbGF0YWxpemVkYmVsb3djbWI9ODAxLGUuaG9va3JldHJvZmxleGJlbG93Y21iPTgwMixlLmhvb25zcXVhcmU9MTMxMjIsZS5ob3JpY29wdGljPTEwMDEsZS5ob3Jpem9udGFsYmFyPTgyMTMsZS5ob3JuY21iPTc5NSxlLmhvdHNwcmluZ3M9OTgzMixlLmhvdXNlPTg5NjIsZS5ocGFyZW49OTM3OSxlLmhzdXBlcmlvcj02ODgsZS5odHVybmVkPTYxMyxlLmh1aGlyYWdhbmE9MTI0MDUsZS5odWlpdG9zcXVhcmU9MTMxMDcsZS5odWthdGFrYW5hPTEyNTAxLGUuaHVrYXRha2FuYWhhbGZ3aWR0aD02NTQyMCxlLmh1bmdhcnVtbGF1dD03MzMsZS5odW5nYXJ1bWxhdXRjbWI9Nzc5LGUuaHY9NDA1LGUuaHlwaGVuPTQ1LGUuaHlwaGVuaW5mZXJpb3I9NjMyMDUsZS5oeXBoZW5tb25vc3BhY2U9NjUyOTMsZS5oeXBoZW5zbWFsbD02NTEyMyxlLmh5cGhlbnN1cGVyaW9yPTYzMjA2LGUuaHlwaGVudHdvPTgyMDgsZS5pPTEwNSxlLmlhY3V0ZT0yMzcsZS5pYWN5cmlsbGljPTExMDMsZS5pYmVuZ2FsaT0yNDM5LGUuaWJvcG9tb2ZvPTEyNTgzLGUuaWJyZXZlPTMwMSxlLmljYXJvbj00NjQsZS5pY2lyY2xlPTk0MzIsZS5pY2lyY3VtZmxleD0yMzgsZS5pY3lyaWxsaWM9MTExMCxlLmlkYmxncmF2ZT01MjEsZS5pZGVvZ3JhcGhlYXJ0aGNpcmNsZT0xMjk0MyxlLmlkZW9ncmFwaGZpcmVjaXJjbGU9MTI5MzksZS5pZGVvZ3JhcGhpY2FsbGlhbmNlcGFyZW49MTI4NjMsZS5pZGVvZ3JhcGhpY2NhbGxwYXJlbj0xMjg1OCxlLmlkZW9ncmFwaGljY2VudHJlY2lyY2xlPTEyOTY1LGUuaWRlb2dyYXBoaWNjbG9zZT0xMjI5NCxlLmlkZW9ncmFwaGljY29tbWE9MTIyODksZS5pZGVvZ3JhcGhpY2NvbW1hbGVmdD02NTM4MCxlLmlkZW9ncmFwaGljY29uZ3JhdHVsYXRpb25wYXJlbj0xMjg1NSxlLmlkZW9ncmFwaGljY29ycmVjdGNpcmNsZT0xMjk2MyxlLmlkZW9ncmFwaGljZWFydGhwYXJlbj0xMjg0NyxlLmlkZW9ncmFwaGljZW50ZXJwcmlzZXBhcmVuPTEyODYxLGUuaWRlb2dyYXBoaWNleGNlbGxlbnRjaXJjbGU9MTI5NTcsZS5pZGVvZ3JhcGhpY2Zlc3RpdmFscGFyZW49MTI4NjQsZS5pZGVvZ3JhcGhpY2ZpbmFuY2lhbGNpcmNsZT0xMjk1MCxlLmlkZW9ncmFwaGljZmluYW5jaWFscGFyZW49MTI4NTQsZS5pZGVvZ3JhcGhpY2ZpcmVwYXJlbj0xMjg0MyxlLmlkZW9ncmFwaGljaGF2ZXBhcmVuPTEyODUwLGUuaWRlb2dyYXBoaWNoaWdoY2lyY2xlPTEyOTY0LGUuaWRlb2dyYXBoaWNpdGVyYXRpb25tYXJrPTEyMjkzLGUuaWRlb2dyYXBoaWNsYWJvcmNpcmNsZT0xMjk1MixlLmlkZW9ncmFwaGljbGFib3JwYXJlbj0xMjg1NixlLmlkZW9ncmFwaGljbGVmdGNpcmNsZT0xMjk2NyxlLmlkZW9ncmFwaGljbG93Y2lyY2xlPTEyOTY2LGUuaWRlb2dyYXBoaWNtZWRpY2luZWNpcmNsZT0xMjk2OSxlLmlkZW9ncmFwaGljbWV0YWxwYXJlbj0xMjg0NixlLmlkZW9ncmFwaGljbW9vbnBhcmVuPTEyODQyLGUuaWRlb2dyYXBoaWNuYW1lcGFyZW49MTI4NTIsZS5pZGVvZ3JhcGhpY3BlcmlvZD0xMjI5MCxlLmlkZW9ncmFwaGljcHJpbnRjaXJjbGU9MTI5NTgsZS5pZGVvZ3JhcGhpY3JlYWNocGFyZW49MTI4NjcsZS5pZGVvZ3JhcGhpY3JlcHJlc2VudHBhcmVuPTEyODU3LGUuaWRlb2dyYXBoaWNyZXNvdXJjZXBhcmVuPTEyODYyLGUuaWRlb2dyYXBoaWNyaWdodGNpcmNsZT0xMjk2OCxlLmlkZW9ncmFwaGljc2VjcmV0Y2lyY2xlPTEyOTUzLGUuaWRlb2dyYXBoaWNzZWxmcGFyZW49MTI4NjYsZS5pZGVvZ3JhcGhpY3NvY2lldHlwYXJlbj0xMjg1MSxlLmlkZW9ncmFwaGljc3BhY2U9MTIyODgsZS5pZGVvZ3JhcGhpY3NwZWNpYWxwYXJlbj0xMjg1MyxlLmlkZW9ncmFwaGljc3RvY2twYXJlbj0xMjg0OSxlLmlkZW9ncmFwaGljc3R1ZHlwYXJlbj0xMjg1OSxlLmlkZW9ncmFwaGljc3VucGFyZW49MTI4NDgsZS5pZGVvZ3JhcGhpY3N1cGVydmlzZXBhcmVuPTEyODYwLGUuaWRlb2dyYXBoaWN3YXRlcnBhcmVuPTEyODQ0LGUuaWRlb2dyYXBoaWN3b29kcGFyZW49MTI4NDUsZS5pZGVvZ3JhcGhpY3plcm89MTIyOTUsZS5pZGVvZ3JhcGhtZXRhbGNpcmNsZT0xMjk0MixlLmlkZW9ncmFwaG1vb25jaXJjbGU9MTI5MzgsZS5pZGVvZ3JhcGhuYW1lY2lyY2xlPTEyOTQ4LGUuaWRlb2dyYXBoc3VuY2lyY2xlPTEyOTQ0LGUuaWRlb2dyYXBod2F0ZXJjaXJjbGU9MTI5NDAsZS5pZGVvZ3JhcGh3b29kY2lyY2xlPTEyOTQxLGUuaWRldmE9MjMxMSxlLmlkaWVyZXNpcz0yMzksZS5pZGllcmVzaXNhY3V0ZT03NzI3LGUuaWRpZXJlc2lzY3lyaWxsaWM9MTI1MyxlLmlkb3RiZWxvdz03ODgzLGUuaWVicmV2ZWN5cmlsbGljPTEyMzksZS5pZWN5cmlsbGljPTEwNzcsZS5pZXVuZ2FjaXJjbGVrb3JlYW49MTI5MTcsZS5pZXVuZ2FwYXJlbmtvcmVhbj0xMjgyMSxlLmlldW5nY2lyY2xla29yZWFuPTEyOTAzLGUuaWV1bmdrb3JlYW49MTI2MTUsZS5pZXVuZ3BhcmVua29yZWFuPTEyODA3LGUuaWdyYXZlPTIzNixlLmlndWphcmF0aT0yNjk1LGUuaWd1cm11a2hpPTI1NjcsZS5paGlyYWdhbmE9MTIzNTYsZS5paG9va2Fib3ZlPTc4ODEsZS5paWJlbmdhbGk9MjQ0MCxlLmlpY3lyaWxsaWM9MTA4MCxlLmlpZGV2YT0yMzEyLGUuaWlndWphcmF0aT0yNjk2LGUuaWlndXJtdWtoaT0yNTY4LGUuaWltYXRyYWd1cm11a2hpPTI2MjQsZS5paW52ZXJ0ZWRicmV2ZT01MjMsZS5paXNob3J0Y3lyaWxsaWM9MTA4MSxlLmlpdm93ZWxzaWduYmVuZ2FsaT0yNDk2LGUuaWl2b3dlbHNpZ25kZXZhPTIzNjgsZS5paXZvd2Vsc2lnbmd1amFyYXRpPTI3NTIsZS5paj0zMDcsZS5pa2F0YWthbmE9MTI0NTIsZS5pa2F0YWthbmFoYWxmd2lkdGg9NjUzOTQsZS5pa29yZWFuPTEyNjQzLGUuaWxkZT03MzIsZS5pbHV5aGVicmV3PTE0NTIsZS5pbWFjcm9uPTI5OSxlLmltYWNyb25jeXJpbGxpYz0xMjUxLGUuaW1hZ2VvcmFwcHJveGltYXRlbHllcXVhbD04Nzg3LGUuaW1hdHJhZ3VybXVraGk9MjYyMyxlLmltb25vc3BhY2U9NjUzNTMsZS5pbmNyZW1lbnQ9ODcxMCxlLmluZmluaXR5PTg3MzQsZS5pbmlhcm1lbmlhbj0xMzg3LGUuaW50ZWdyYWw9ODc0NyxlLmludGVncmFsYm90dG9tPTg5OTMsZS5pbnRlZ3JhbGJ0PTg5OTMsZS5pbnRlZ3JhbGV4PTYzNzMzLGUuaW50ZWdyYWx0b3A9ODk5MixlLmludGVncmFsdHA9ODk5MixlLmludGVyc2VjdGlvbj04NzQ1LGUuaW50aXNxdWFyZT0xMzA2MSxlLmludmJ1bGxldD05Njg4LGUuaW52Y2lyY2xlPTk2ODksZS5pbnZzbWlsZWZhY2U9OTc4NyxlLmlvY3lyaWxsaWM9MTEwNSxlLmlvZ29uZWs9MzAzLGUuaW90YT05NTMsZS5pb3RhZGllcmVzaXM9OTcwLGUuaW90YWRpZXJlc2lzdG9ub3M9OTEyLGUuaW90YWxhdGluPTYxNyxlLmlvdGF0b25vcz05NDMsZS5pcGFyZW49OTM4MCxlLmlyaWd1cm11a2hpPTI2NzQsZS5pc21hbGxoaXJhZ2FuYT0xMjM1NSxlLmlzbWFsbGthdGFrYW5hPTEyNDUxLGUuaXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODQsZS5pc3NoYXJiZW5nYWxpPTI1NTQsZS5pc3Ryb2tlPTYxNixlLmlzdXBlcmlvcj02MzIxMyxlLml0ZXJhdGlvbmhpcmFnYW5hPTEyNDQ1LGUuaXRlcmF0aW9ua2F0YWthbmE9MTI1NDEsZS5pdGlsZGU9Mjk3LGUuaXRpbGRlYmVsb3c9NzcyNSxlLml1Ym9wb21vZm89MTI1ODUsZS5pdWN5cmlsbGljPTExMDIsZS5pdm93ZWxzaWduYmVuZ2FsaT0yNDk1LGUuaXZvd2Vsc2lnbmRldmE9MjM2NyxlLml2b3dlbHNpZ25ndWphcmF0aT0yNzUxLGUuaXpoaXRzYWN5cmlsbGljPTExNDEsZS5pemhpdHNhZGJsZ3JhdmVjeXJpbGxpYz0xMTQzLGUuaj0xMDYsZS5qYWFybWVuaWFuPTEzOTMsZS5qYWJlbmdhbGk9MjQ2MCxlLmphZGV2YT0yMzMyLGUuamFndWphcmF0aT0yNzE2LGUuamFndXJtdWtoaT0yNTg4LGUuamJvcG9tb2ZvPTEyNTYwLGUuamNhcm9uPTQ5NixlLmpjaXJjbGU9OTQzMyxlLmpjaXJjdW1mbGV4PTMwOSxlLmpjcm9zc2VkdGFpbD02NjksZS5qZG90bGVzc3N0cm9rZT02MDcsZS5qZWN5cmlsbGljPTExMTIsZS5qZWVtYXJhYmljPTE1ODAsZS5qZWVtZmluYWxhcmFiaWM9NjUxODIsZS5qZWVtaW5pdGlhbGFyYWJpYz02NTE4MyxlLmplZW1tZWRpYWxhcmFiaWM9NjUxODQsZS5qZWhhcmFiaWM9MTY4OCxlLmplaGZpbmFsYXJhYmljPTY0Mzk1LGUuamhhYmVuZ2FsaT0yNDYxLGUuamhhZGV2YT0yMzMzLGUuamhhZ3VqYXJhdGk9MjcxNyxlLmpoYWd1cm11a2hpPTI1ODksZS5qaGVoYXJtZW5pYW49MTQwMyxlLmppcz0xMjI5MixlLmptb25vc3BhY2U9NjUzNTQsZS5qcGFyZW49OTM4MSxlLmpzdXBlcmlvcj02OTAsZS5rPTEwNyxlLmthYmFzaGtpcmN5cmlsbGljPTExODUsZS5rYWJlbmdhbGk9MjQ1MyxlLmthY3V0ZT03NzI5LGUua2FjeXJpbGxpYz0xMDgyLGUua2FkZXNjZW5kZXJjeXJpbGxpYz0xMTc5LGUua2FkZXZhPTIzMjUsZS5rYWY9MTQ5OSxlLmthZmFyYWJpYz0xNjAzLGUua2FmZGFnZXNoPTY0MzE1LGUua2FmZGFnZXNoaGVicmV3PTY0MzE1LGUua2FmZmluYWxhcmFiaWM9NjUyNDIsZS5rYWZoZWJyZXc9MTQ5OSxlLmthZmluaXRpYWxhcmFiaWM9NjUyNDMsZS5rYWZtZWRpYWxhcmFiaWM9NjUyNDQsZS5rYWZyYWZlaGVicmV3PTY0MzMzLGUua2FndWphcmF0aT0yNzA5LGUua2FndXJtdWtoaT0yNTgxLGUua2FoaXJhZ2FuYT0xMjM2MyxlLmthaG9va2N5cmlsbGljPTEyMjAsZS5rYWthdGFrYW5hPTEyNDU5LGUua2FrYXRha2FuYWhhbGZ3aWR0aD02NTM5OCxlLmthcHBhPTk1NCxlLmthcHBhc3ltYm9sZ3JlZWs9MTAwOCxlLmthcHllb3VubWlldW1rb3JlYW49MTI2NTcsZS5rYXB5ZW91bnBoaWV1cGhrb3JlYW49MTI2NzYsZS5rYXB5ZW91bnBpZXVwa29yZWFuPTEyNjY0LGUua2FweWVvdW5zc2FuZ3BpZXVwa29yZWFuPTEyNjY1LGUua2Fyb3JpaXNxdWFyZT0xMzA2OSxlLmthc2hpZGFhdXRvYXJhYmljPTE2MDAsZS5rYXNoaWRhYXV0b25vc2lkZWJlYXJpbmdhcmFiaWM9MTYwMCxlLmthc21hbGxrYXRha2FuYT0xMjUzMyxlLmthc3F1YXJlPTEzMTg4LGUua2FzcmFhcmFiaWM9MTYxNixlLmthc3JhdGFuYXJhYmljPTE2MTMsZS5rYXN0cm9rZWN5cmlsbGljPTExODMsZS5rYXRhaGlyYXByb2xvbmdtYXJraGFsZndpZHRoPTY1MzkyLGUua2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljPTExODEsZS5rYm9wb21vZm89MTI1NTgsZS5rY2Fsc3F1YXJlPTEzMTkzLGUua2Nhcm9uPTQ4OSxlLmtjZWRpbGxhPTMxMSxlLmtjaXJjbGU9OTQzNCxlLmtjb21tYWFjY2VudD0zMTEsZS5rZG90YmVsb3c9NzczMSxlLmtlaGFybWVuaWFuPTE0MTIsZS5rZWhpcmFnYW5hPTEyMzY5LGUua2VrYXRha2FuYT0xMjQ2NSxlLmtla2F0YWthbmFoYWxmd2lkdGg9NjU0MDEsZS5rZW5hcm1lbmlhbj0xMzkxLGUua2VzbWFsbGthdGFrYW5hPTEyNTM0LGUua2dyZWVubGFuZGljPTMxMixlLmtoYWJlbmdhbGk9MjQ1NCxlLmtoYWN5cmlsbGljPTEwOTMsZS5raGFkZXZhPTIzMjYsZS5raGFndWphcmF0aT0yNzEwLGUua2hhZ3VybXVraGk9MjU4MixlLmtoYWhhcmFiaWM9MTU4MixlLmtoYWhmaW5hbGFyYWJpYz02NTE5MCxlLmtoYWhpbml0aWFsYXJhYmljPTY1MTkxLGUua2hhaG1lZGlhbGFyYWJpYz02NTE5MixlLmtoZWljb3B0aWM9OTk5LGUua2hoYWRldmE9MjM5MyxlLmtoaGFndXJtdWtoaT0yNjQ5LGUua2hpZXVraGFjaXJjbGVrb3JlYW49MTI5MjAsZS5raGlldWtoYXBhcmVua29yZWFuPTEyODI0LGUua2hpZXVraGNpcmNsZWtvcmVhbj0xMjkwNixlLmtoaWV1a2hrb3JlYW49MTI2MTksZS5raGlldWtocGFyZW5rb3JlYW49MTI4MTAsZS5raG9raGFpdGhhaT0zNTg2LGUua2hva2hvbnRoYWk9MzU4OSxlLmtob2todWF0dGhhaT0zNTg3LGUua2hva2h3YWl0aGFpPTM1ODgsZS5raG9tdXR0aGFpPTM2NzUsZS5raG9vaz00MDksZS5raG9yYWtoYW5ndGhhaT0zNTkwLGUua2h6c3F1YXJlPTEzMjAxLGUua2loaXJhZ2FuYT0xMjM2NSxlLmtpa2F0YWthbmE9MTI0NjEsZS5raWthdGFrYW5haGFsZndpZHRoPTY1Mzk5LGUua2lyb2d1cmFtdXNxdWFyZT0xMzA3NyxlLmtpcm9tZWV0b3J1c3F1YXJlPTEzMDc4LGUua2lyb3NxdWFyZT0xMzA3NixlLmtpeWVva2FjaXJjbGVrb3JlYW49MTI5MTAsZS5raXllb2thcGFyZW5rb3JlYW49MTI4MTQsZS5raXllb2tjaXJjbGVrb3JlYW49MTI4OTYsZS5raXllb2trb3JlYW49MTI1OTMsZS5raXllb2twYXJlbmtvcmVhbj0xMjgwMCxlLmtpeWVva3Npb3Nrb3JlYW49MTI1OTU7ZS5ramVjeXJpbGxpYz0xMTE2LGUua2xpbmViZWxvdz03NzMzLGUua2xzcXVhcmU9MTMyMDgsZS5rbWN1YmVkc3F1YXJlPTEzMjIyLGUua21vbm9zcGFjZT02NTM1NSxlLmttc3F1YXJlZHNxdWFyZT0xMzIxOCxlLmtvaGlyYWdhbmE9MTIzNzEsZS5rb2htc3F1YXJlPTEzMjQ4LGUua29rYWl0aGFpPTM1ODUsZS5rb2thdGFrYW5hPTEyNDY3LGUua29rYXRha2FuYWhhbGZ3aWR0aD02NTQwMixlLmtvb3Bvc3F1YXJlPTEzMDg2LGUua29wcGFjeXJpbGxpYz0xMTUzLGUua29yZWFuc3RhbmRhcmRzeW1ib2w9MTI5MjcsZS5rb3JvbmlzY21iPTgzNSxlLmtwYXJlbj05MzgyLGUua3Bhc3F1YXJlPTEzMjI2LGUua3NpY3lyaWxsaWM9MTEzNSxlLmt0c3F1YXJlPTEzMjYzLGUua3R1cm5lZD02NzAsZS5rdWhpcmFnYW5hPTEyMzY3LGUua3VrYXRha2FuYT0xMjQ2MyxlLmt1a2F0YWthbmFoYWxmd2lkdGg9NjU0MDAsZS5rdnNxdWFyZT0xMzI0MCxlLmt3c3F1YXJlPTEzMjQ2LGUubD0xMDgsZS5sYWJlbmdhbGk9MjQ4MixlLmxhY3V0ZT0zMTQsZS5sYWRldmE9MjM1NCxlLmxhZ3VqYXJhdGk9MjczOCxlLmxhZ3VybXVraGk9MjYxMCxlLmxha2toYW5neWFvdGhhaT0zNjUzLGUubGFtYWxlZmZpbmFsYXJhYmljPTY1Mjc2LGUubGFtYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYz02NTI3MixlLmxhbWFsZWZoYW16YWFib3ZlaXNvbGF0ZWRhcmFiaWM9NjUyNzEsZS5sYW1hbGVmaGFtemFiZWxvd2ZpbmFsYXJhYmljPTY1Mjc0LGUubGFtYWxlZmhhbXphYmVsb3dpc29sYXRlZGFyYWJpYz02NTI3MyxlLmxhbWFsZWZpc29sYXRlZGFyYWJpYz02NTI3NSxlLmxhbWFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWM9NjUyNzAsZS5sYW1hbGVmbWFkZGFhYm92ZWlzb2xhdGVkYXJhYmljPTY1MjY5LGUubGFtYXJhYmljPTE2MDQsZS5sYW1iZGE9OTU1LGUubGFtYmRhc3Ryb2tlPTQxMSxlLmxhbWVkPTE1MDAsZS5sYW1lZGRhZ2VzaD02NDMxNixlLmxhbWVkZGFnZXNoaGVicmV3PTY0MzE2LGUubGFtZWRoZWJyZXc9MTUwMCxlLmxhbWZpbmFsYXJhYmljPTY1MjQ2LGUubGFtaGFoaW5pdGlhbGFyYWJpYz02NDcxNCxlLmxhbWluaXRpYWxhcmFiaWM9NjUyNDcsZS5sYW1qZWVtaW5pdGlhbGFyYWJpYz02NDcxMyxlLmxhbWtoYWhpbml0aWFsYXJhYmljPTY0NzE1LGUubGFtbGFtaGVoaXNvbGF0ZWRhcmFiaWM9NjUwMTAsZS5sYW1tZWRpYWxhcmFiaWM9NjUyNDgsZS5sYW1tZWVtaGFoaW5pdGlhbGFyYWJpYz02NDkwNCxlLmxhbW1lZW1pbml0aWFsYXJhYmljPTY0NzE2LGUubGFyZ2VjaXJjbGU9OTcxMSxlLmxiYXI9NDEwLGUubGJlbHQ9NjIwLGUubGJvcG9tb2ZvPTEyNTU2LGUubGNhcm9uPTMxOCxlLmxjZWRpbGxhPTMxNixlLmxjaXJjbGU9OTQzNSxlLmxjaXJjdW1mbGV4YmVsb3c9Nzc0MSxlLmxjb21tYWFjY2VudD0zMTYsZS5sZG90PTMyMCxlLmxkb3RhY2NlbnQ9MzIwLGUubGRvdGJlbG93PTc3MzUsZS5sZG90YmVsb3dtYWNyb249NzczNyxlLmxlZnRhbmdsZWFib3ZlY21iPTc5NCxlLmxlZnR0YWNrYmVsb3djbWI9NzkyLGUubGVzcz02MCxlLmxlc3NlcXVhbD04ODA0LGUubGVzc2VxdWFsb3JncmVhdGVyPTg5MjIsZS5sZXNzbW9ub3NwYWNlPTY1MzA4LGUubGVzc29yZXF1aXZhbGVudD04ODE4LGUubGVzc29yZ3JlYXRlcj04ODIyLGUubGVzc292ZXJlcXVhbD04ODA2LGUubGVzc3NtYWxsPTY1MTI0LGUubGV6aD02MjIsZS5sZmJsb2NrPTk2MTIsZS5saG9va3JldHJvZmxleD02MjEsZS5saXJhPTgzNTYsZS5saXduYXJtZW5pYW49MTM4OCxlLmxqPTQ1NyxlLmxqZWN5cmlsbGljPTExMTMsZS5sbD02MzE2OCxlLmxsYWRldmE9MjM1NSxlLmxsYWd1amFyYXRpPTI3MzksZS5sbGluZWJlbG93PTc3MzksZS5sbGxhZGV2YT0yMzU2LGUubGx2b2NhbGljYmVuZ2FsaT0yNTI5LGUubGx2b2NhbGljZGV2YT0yNDAxLGUubGx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaT0yNTMxLGUubGx2b2NhbGljdm93ZWxzaWduZGV2YT0yNDAzLGUubG1pZGRsZXRpbGRlPTYxOSxlLmxtb25vc3BhY2U9NjUzNTYsZS5sbXNxdWFyZT0xMzI2NCxlLmxvY2h1bGF0aGFpPTM2MjgsZS5sb2dpY2FsYW5kPTg3NDMsZS5sb2dpY2Fsbm90PTE3MixlLmxvZ2ljYWxub3RyZXZlcnNlZD04OTc2LGUubG9naWNhbG9yPTg3NDQsZS5sb2xpbmd0aGFpPTM2MjEsZS5sb25ncz0zODMsZS5sb3dsaW5lY2VudGVybGluZT02NTEwMixlLmxvd2xpbmVjbWI9ODE4LGUubG93bGluZWRhc2hlZD02NTEwMSxlLmxvemVuZ2U9OTY3NCxlLmxwYXJlbj05MzgzLGUubHNsYXNoPTMyMixlLmxzcXVhcmU9ODQ2NyxlLmxzdXBlcmlvcj02MzIxNCxlLmx0c2hhZGU9OTYxNyxlLmx1dGhhaT0zNjIyLGUubHZvY2FsaWNiZW5nYWxpPTI0NDQsZS5sdm9jYWxpY2RldmE9MjMxNixlLmx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaT0yNTMwLGUubHZvY2FsaWN2b3dlbHNpZ25kZXZhPTI0MDIsZS5seHNxdWFyZT0xMzI2NyxlLm09MTA5LGUubWFiZW5nYWxpPTI0NzgsZS5tYWNyb249MTc1LGUubWFjcm9uYmVsb3djbWI9ODE3LGUubWFjcm9uY21iPTc3MixlLm1hY3Jvbmxvd21vZD03MTcsZS5tYWNyb25tb25vc3BhY2U9NjU1MDcsZS5tYWN1dGU9Nzc0MyxlLm1hZGV2YT0yMzUwLGUubWFndWphcmF0aT0yNzM0LGUubWFndXJtdWtoaT0yNjA2LGUubWFoYXBha2hoZWJyZXc9MTQ0NCxlLm1haGFwYWtobGVmdGhlYnJldz0xNDQ0LGUubWFoaXJhZ2FuYT0xMjQxNCxlLm1haWNoYXR0YXdhbG93bGVmdHRoYWk9NjM2MzcsZS5tYWljaGF0dGF3YWxvd3JpZ2h0dGhhaT02MzYzNixlLm1haWNoYXR0YXdhdGhhaT0zNjU5LGUubWFpY2hhdHRhd2F1cHBlcmxlZnR0aGFpPTYzNjM1LGUubWFpZWtsb3dsZWZ0dGhhaT02MzYyOCxlLm1haWVrbG93cmlnaHR0aGFpPTYzNjI3LGUubWFpZWt0aGFpPTM2NTYsZS5tYWlla3VwcGVybGVmdHRoYWk9NjM2MjYsZS5tYWloYW5ha2F0bGVmdHRoYWk9NjM2MjAsZS5tYWloYW5ha2F0dGhhaT0zNjMzLGUubWFpdGFpa2h1bGVmdHRoYWk9NjM2MjUsZS5tYWl0YWlraHV0aGFpPTM2NTUsZS5tYWl0aG9sb3dsZWZ0dGhhaT02MzYzMSxlLm1haXRob2xvd3JpZ2h0dGhhaT02MzYzMCxlLm1haXRob3RoYWk9MzY1NyxlLm1haXRob3VwcGVybGVmdHRoYWk9NjM2MjksZS5tYWl0cmlsb3dsZWZ0dGhhaT02MzYzNCxlLm1haXRyaWxvd3JpZ2h0dGhhaT02MzYzMyxlLm1haXRyaXRoYWk9MzY1OCxlLm1haXRyaXVwcGVybGVmdHRoYWk9NjM2MzIsZS5tYWl5YW1va3RoYWk9MzY1NCxlLm1ha2F0YWthbmE9MTI1MTAsZS5tYWthdGFrYW5haGFsZndpZHRoPTY1NDIzLGUubWFsZT05Nzk0LGUubWFuc3lvbnNxdWFyZT0xMzEyNyxlLm1hcWFmaGVicmV3PTE0NzAsZS5tYXJzPTk3OTQsZS5tYXNvcmFjaXJjbGVoZWJyZXc9MTQ1NSxlLm1hc3F1YXJlPTEzMTg3LGUubWJvcG9tb2ZvPTEyNTUxLGUubWJzcXVhcmU9MTMyNjgsZS5tY2lyY2xlPTk0MzYsZS5tY3ViZWRzcXVhcmU9MTMyMjEsZS5tZG90YWNjZW50PTc3NDUsZS5tZG90YmVsb3c9Nzc0NyxlLm1lZW1hcmFiaWM9MTYwNSxlLm1lZW1maW5hbGFyYWJpYz02NTI1MCxlLm1lZW1pbml0aWFsYXJhYmljPTY1MjUxLGUubWVlbW1lZGlhbGFyYWJpYz02NTI1MixlLm1lZW1tZWVtaW5pdGlhbGFyYWJpYz02NDcyMSxlLm1lZW1tZWVtaXNvbGF0ZWRhcmFiaWM9NjQ1ODQsZS5tZWV0b3J1c3F1YXJlPTEzMTMzLGUubWVoaXJhZ2FuYT0xMjQxNyxlLm1laXppZXJhc3F1YXJlPTEzMTgyLGUubWVrYXRha2FuYT0xMjUxMyxlLm1la2F0YWthbmFoYWxmd2lkdGg9NjU0MjYsZS5tZW09MTUwMixlLm1lbWRhZ2VzaD02NDMxOCxlLm1lbWRhZ2VzaGhlYnJldz02NDMxOCxlLm1lbWhlYnJldz0xNTAyLGUubWVuYXJtZW5pYW49MTM5NixlLm1lcmtoYWhlYnJldz0xNDQ1LGUubWVya2hha2VmdWxhaGVicmV3PTE0NDYsZS5tZXJraGFrZWZ1bGFsZWZ0aGVicmV3PTE0NDYsZS5tZXJraGFsZWZ0aGVicmV3PTE0NDUsZS5taG9vaz02MjUsZS5taHpzcXVhcmU9MTMyMDIsZS5taWRkbGVkb3RrYXRha2FuYWhhbGZ3aWR0aD02NTM4MSxlLm1pZGRvdD0xODMsZS5taWV1bWFjaXJjbGVrb3JlYW49MTI5MTQsZS5taWV1bWFwYXJlbmtvcmVhbj0xMjgxOCxlLm1pZXVtY2lyY2xla29yZWFuPTEyOTAwLGUubWlldW1rb3JlYW49MTI2MDksZS5taWV1bXBhbnNpb3Nrb3JlYW49MTI2NTYsZS5taWV1bXBhcmVua29yZWFuPTEyODA0LGUubWlldW1waWV1cGtvcmVhbj0xMjY1NCxlLm1pZXVtc2lvc2tvcmVhbj0xMjY1NSxlLm1paGlyYWdhbmE9MTI0MTUsZS5taWthdGFrYW5hPTEyNTExLGUubWlrYXRha2FuYWhhbGZ3aWR0aD02NTQyNCxlLm1pbnVzPTg3MjIsZS5taW51c2JlbG93Y21iPTgwMCxlLm1pbnVzY2lyY2xlPTg4NTQsZS5taW51c21vZD03MjcsZS5taW51c3BsdXM9ODcyMyxlLm1pbnV0ZT04MjQyLGUubWlyaWJhYXJ1c3F1YXJlPTEzMTMwLGUubWlyaXNxdWFyZT0xMzEyOSxlLm1sb25nbGVndHVybmVkPTYyNCxlLm1sc3F1YXJlPTEzMjA2LGUubW1jdWJlZHNxdWFyZT0xMzIxOSxlLm1tb25vc3BhY2U9NjUzNTcsZS5tbXNxdWFyZWRzcXVhcmU9MTMyMTUsZS5tb2hpcmFnYW5hPTEyNDE4LGUubW9obXNxdWFyZT0xMzI0OSxlLm1va2F0YWthbmE9MTI1MTQsZS5tb2thdGFrYW5haGFsZndpZHRoPTY1NDI3LGUubW9sc3F1YXJlPTEzMjcwLGUubW9tYXRoYWk9MzYxNyxlLm1vdmVyc3NxdWFyZT0xMzIyMyxlLm1vdmVyc3NxdWFyZWRzcXVhcmU9MTMyMjQsZS5tcGFyZW49OTM4NCxlLm1wYXNxdWFyZT0xMzIyNyxlLm1zc3F1YXJlPTEzMjM1LGUubXN1cGVyaW9yPTYzMjE1LGUubXR1cm5lZD02MjMsZS5tdT0xODEsZS5tdTE9MTgxLGUubXVhc3F1YXJlPTEzMTg2LGUubXVjaGdyZWF0ZXI9ODgxMSxlLm11Y2hsZXNzPTg4MTAsZS5tdWZzcXVhcmU9MTMxOTYsZS5tdWdyZWVrPTk1NixlLm11Z3NxdWFyZT0xMzE5NyxlLm11aGlyYWdhbmE9MTI0MTYsZS5tdWthdGFrYW5hPTEyNTEyLGUubXVrYXRha2FuYWhhbGZ3aWR0aD02NTQyNSxlLm11bHNxdWFyZT0xMzIwNSxlLm11bHRpcGx5PTIxNSxlLm11bXNxdWFyZT0xMzIxMSxlLm11bmFoaGVicmV3PTE0NDMsZS5tdW5haGxlZnRoZWJyZXc9MTQ0MyxlLm11c2ljYWxub3RlPTk4MzQsZS5tdXNpY2Fsbm90ZWRibD05ODM1LGUubXVzaWNmbGF0c2lnbj05ODM3LGUubXVzaWNzaGFycHNpZ249OTgzOSxlLm11c3NxdWFyZT0xMzIzNCxlLm11dnNxdWFyZT0xMzIzOCxlLm11d3NxdWFyZT0xMzI0NCxlLm12bWVnYXNxdWFyZT0xMzI0MSxlLm12c3F1YXJlPTEzMjM5LGUubXdtZWdhc3F1YXJlPTEzMjQ3LGUubXdzcXVhcmU9MTMyNDUsZS5uPTExMCxlLm5hYmVuZ2FsaT0yNDcyLGUubmFibGE9ODcxMSxlLm5hY3V0ZT0zMjQsZS5uYWRldmE9MjM0NCxlLm5hZ3VqYXJhdGk9MjcyOCxlLm5hZ3VybXVraGk9MjYwMCxlLm5haGlyYWdhbmE9MTIzOTQsZS5uYWthdGFrYW5hPTEyNDkwLGUubmFrYXRha2FuYWhhbGZ3aWR0aD02NTQxMyxlLm5hcG9zdHJvcGhlPTMyOSxlLm5hc3F1YXJlPTEzMTg1LGUubmJvcG9tb2ZvPTEyNTU1LGUubmJzcGFjZT0xNjAsZS5uY2Fyb249MzI4LGUubmNlZGlsbGE9MzI2LGUubmNpcmNsZT05NDM3LGUubmNpcmN1bWZsZXhiZWxvdz03NzU1LGUubmNvbW1hYWNjZW50PTMyNixlLm5kb3RhY2NlbnQ9Nzc0OSxlLm5kb3RiZWxvdz03NzUxLGUubmVoaXJhZ2FuYT0xMjM5NyxlLm5la2F0YWthbmE9MTI0OTMsZS5uZWthdGFrYW5haGFsZndpZHRoPTY1NDE2LGUubmV3c2hlcWVsc2lnbj04MzYyLGUubmZzcXVhcmU9MTMxOTUsZS5uZ2FiZW5nYWxpPTI0NTcsZS5uZ2FkZXZhPTIzMjksZS5uZ2FndWphcmF0aT0yNzEzLGUubmdhZ3VybXVraGk9MjU4NSxlLm5nb25ndXRoYWk9MzU5MSxlLm5oaXJhZ2FuYT0xMjQzNSxlLm5ob29rbGVmdD02MjYsZS5uaG9va3JldHJvZmxleD02MjcsZS5uaWV1bmFjaXJjbGVrb3JlYW49MTI5MTEsZS5uaWV1bmFwYXJlbmtvcmVhbj0xMjgxNSxlLm5pZXVuY2lldWNrb3JlYW49MTI1OTcsZS5uaWV1bmNpcmNsZWtvcmVhbj0xMjg5NyxlLm5pZXVuaGlldWhrb3JlYW49MTI1OTgsZS5uaWV1bmtvcmVhbj0xMjU5NixlLm5pZXVucGFuc2lvc2tvcmVhbj0xMjY0OCxlLm5pZXVucGFyZW5rb3JlYW49MTI4MDEsZS5uaWV1bnNpb3Nrb3JlYW49MTI2NDcsZS5uaWV1bnRpa2V1dGtvcmVhbj0xMjY0NixlLm5paGlyYWdhbmE9MTIzOTUsZS5uaWthdGFrYW5hPTEyNDkxLGUubmlrYXRha2FuYWhhbGZ3aWR0aD02NTQxNCxlLm5pa2hhaGl0bGVmdHRoYWk9NjM2NDEsZS5uaWtoYWhpdHRoYWk9MzY2MSxlLm5pbmU9NTcsZS5uaW5lYXJhYmljPTE2NDEsZS5uaW5lYmVuZ2FsaT0yNTQzLGUubmluZWNpcmNsZT05MzIwLGUubmluZWNpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMzAsZS5uaW5lZGV2YT0yNDE1LGUubmluZWd1amFyYXRpPTI3OTksZS5uaW5lZ3VybXVraGk9MjY3MSxlLm5pbmVoYWNrYXJhYmljPTE2NDEsZS5uaW5laGFuZ3pob3U9MTIzMjksZS5uaW5laWRlb2dyYXBoaWNwYXJlbj0xMjg0MCxlLm5pbmVpbmZlcmlvcj04MzI5LGUubmluZW1vbm9zcGFjZT02NTMwNSxlLm5pbmVvbGRzdHlsZT02MzI4OSxlLm5pbmVwYXJlbj05MzQwLGUubmluZXBlcmlvZD05MzYwLGUubmluZXBlcnNpYW49MTc4NSxlLm5pbmVyb21hbj04NTY4LGUubmluZXN1cGVyaW9yPTgzMTMsZS5uaW5ldGVlbmNpcmNsZT05MzMwLGUubmluZXRlZW5wYXJlbj05MzUwLGUubmluZXRlZW5wZXJpb2Q9OTM3MCxlLm5pbmV0aGFpPTM2NzMsZS5uaj00NjAsZS5uamVjeXJpbGxpYz0xMTE0LGUubmthdGFrYW5hPTEyNTMxLGUubmthdGFrYW5haGFsZndpZHRoPTY1NDM3LGUubmxlZ3JpZ2h0bG9uZz00MTQsZS5ubGluZWJlbG93PTc3NTMsZS5ubW9ub3NwYWNlPTY1MzU4LGUubm1zcXVhcmU9MTMyMTAsZS5ubmFiZW5nYWxpPTI0NjcsZS5ubmFkZXZhPTIzMzksZS5ubmFndWphcmF0aT0yNzIzLGUubm5hZ3VybXVraGk9MjU5NSxlLm5ubmFkZXZhPTIzNDUsZS5ub2hpcmFnYW5hPTEyMzk4LGUubm9rYXRha2FuYT0xMjQ5NCxlLm5va2F0YWthbmFoYWxmd2lkdGg9NjU0MTcsZS5ub25icmVha2luZ3NwYWNlPTE2MCxlLm5vbmVudGhhaT0zNjAzLGUubm9udXRoYWk9MzYwOSxlLm5vb25hcmFiaWM9MTYwNixlLm5vb25maW5hbGFyYWJpYz02NTI1NCxlLm5vb25naHVubmFhcmFiaWM9MTcyMixlLm5vb25naHVubmFmaW5hbGFyYWJpYz02NDQxNSxlLm5vb25pbml0aWFsYXJhYmljPTY1MjU1LGUubm9vbmplZW1pbml0aWFsYXJhYmljPTY0NzIyLGUubm9vbmplZW1pc29sYXRlZGFyYWJpYz02NDU4NyxlLm5vb25tZWRpYWxhcmFiaWM9NjUyNTYsZS5ub29ubWVlbWluaXRpYWxhcmFiaWM9NjQ3MjUsZS5ub29ubWVlbWlzb2xhdGVkYXJhYmljPTY0NTkwLGUubm9vbm5vb25maW5hbGFyYWJpYz02NDY1MyxlLm5vdGNvbnRhaW5zPTg3MTYsZS5ub3RlbGVtZW50PTg3MTMsZS5ub3RlbGVtZW50b2Y9ODcxMyxlLm5vdGVxdWFsPTg4MDAsZS5ub3RncmVhdGVyPTg4MTUsZS5ub3RncmVhdGVybm9yZXF1YWw9ODgxNyxlLm5vdGdyZWF0ZXJub3JsZXNzPTg4MjUsZS5ub3RpZGVudGljYWw9ODgwMixlLm5vdGxlc3M9ODgxNCxlLm5vdGxlc3Nub3JlcXVhbD04ODE2LGUubm90cGFyYWxsZWw9ODc0MixlLm5vdHByZWNlZGVzPTg4MzIsZS5ub3RzdWJzZXQ9ODgzNixlLm5vdHN1Y2NlZWRzPTg4MzMsZS5ub3RzdXBlcnNldD04ODM3LGUubm93YXJtZW5pYW49MTM5OCxlLm5wYXJlbj05Mzg1LGUubnNzcXVhcmU9MTMyMzMsZS5uc3VwZXJpb3I9ODMxOSxlLm50aWxkZT0yNDEsZS5udT05NTcsZS5udWhpcmFnYW5hPTEyMzk2LGUubnVrYXRha2FuYT0xMjQ5MixlLm51a2F0YWthbmFoYWxmd2lkdGg9NjU0MTUsZS5udWt0YWJlbmdhbGk9MjQ5MixlLm51a3RhZGV2YT0yMzY0LGUubnVrdGFndWphcmF0aT0yNzQ4LGUubnVrdGFndXJtdWtoaT0yNjIwLGUubnVtYmVyc2lnbj0zNSxlLm51bWJlcnNpZ25tb25vc3BhY2U9NjUyODMsZS5udW1iZXJzaWduc21hbGw9NjUxMTksZS5udW1lcmFsc2lnbmdyZWVrPTg4NCxlLm51bWVyYWxzaWdubG93ZXJncmVlaz04ODUsZS5udW1lcm89ODQ3MCxlLm51bj0xNTA0LGUubnVuZGFnZXNoPTY0MzIwLGUubnVuZGFnZXNoaGVicmV3PTY0MzIwLGUubnVuaGVicmV3PTE1MDQsZS5udnNxdWFyZT0xMzIzNyxlLm53c3F1YXJlPTEzMjQzLGUubnlhYmVuZ2FsaT0yNDYyLGUubnlhZGV2YT0yMzM0LGUubnlhZ3VqYXJhdGk9MjcxOCxlLm55YWd1cm11a2hpPTI1OTAsZS5vPTExMSxlLm9hY3V0ZT0yNDMsZS5vYW5ndGhhaT0zNjI5LGUub2JhcnJlZD02MjksZS5vYmFycmVkY3lyaWxsaWM9MTI1NyxlLm9iYXJyZWRkaWVyZXNpc2N5cmlsbGljPTEyNTksZS5vYmVuZ2FsaT0yNDUxLGUub2JvcG9tb2ZvPTEyNTcxLGUub2JyZXZlPTMzNSxlLm9jYW5kcmFkZXZhPTIzMjEsZS5vY2FuZHJhZ3VqYXJhdGk9MjcwNSxlLm9jYW5kcmF2b3dlbHNpZ25kZXZhPTIzNzcsZS5vY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGk9Mjc2MSxlLm9jYXJvbj00NjYsZS5vY2lyY2xlPTk0MzgsZS5vY2lyY3VtZmxleD0yNDQsZS5vY2lyY3VtZmxleGFjdXRlPTc4ODksZS5vY2lyY3VtZmxleGRvdGJlbG93PTc4OTcsZS5vY2lyY3VtZmxleGdyYXZlPTc4OTEsZS5vY2lyY3VtZmxleGhvb2thYm92ZT03ODkzLGUub2NpcmN1bWZsZXh0aWxkZT03ODk1LGUub2N5cmlsbGljPTEwODYsZS5vZGJsYWN1dGU9MzM3LGUub2RibGdyYXZlPTUyNSxlLm9kZXZhPTIzMjMsZS5vZGllcmVzaXM9MjQ2LGUub2RpZXJlc2lzY3lyaWxsaWM9MTI1NSxlLm9kb3RiZWxvdz03ODg1LGUub2U9MzM5LGUub2Vrb3JlYW49MTI2MzQsZS5vZ29uZWs9NzMxLGUub2dvbmVrY21iPTgwOCxlLm9ncmF2ZT0yNDIsZS5vZ3VqYXJhdGk9MjcwNyxlLm9oYXJtZW5pYW49MTQxMyxlLm9oaXJhZ2FuYT0xMjM2MixlLm9ob29rYWJvdmU9Nzg4NyxlLm9ob3JuPTQxNyxlLm9ob3JuYWN1dGU9Nzg5OSxlLm9ob3JuZG90YmVsb3c9NzkwNyxlLm9ob3JuZ3JhdmU9NzkwMSxlLm9ob3JuaG9va2Fib3ZlPTc5MDMsZS5vaG9ybnRpbGRlPTc5MDUsZS5vaHVuZ2FydW1sYXV0PTMzNyxlLm9pPTQxOSxlLm9pbnZlcnRlZGJyZXZlPTUyNyxlLm9rYXRha2FuYT0xMjQ1OCxlLm9rYXRha2FuYWhhbGZ3aWR0aD02NTM5NyxlLm9rb3JlYW49MTI2MzEsZS5vbGVoZWJyZXc9MTQ1MSxlLm9tYWNyb249MzMzLGUub21hY3JvbmFjdXRlPTc3NjMsZS5vbWFjcm9uZ3JhdmU9Nzc2MSxlLm9tZGV2YT0yMzg0LGUub21lZ2E9OTY5LGUub21lZ2ExPTk4MixlLm9tZWdhY3lyaWxsaWM9MTEyMSxlLm9tZWdhbGF0aW5jbG9zZWQ9NjMxLGUub21lZ2Fyb3VuZGN5cmlsbGljPTExNDcsZS5vbWVnYXRpdGxvY3lyaWxsaWM9MTE0OSxlLm9tZWdhdG9ub3M9OTc0LGUub21ndWphcmF0aT0yNzY4LGUub21pY3Jvbj05NTksZS5vbWljcm9udG9ub3M9OTcyLGUub21vbm9zcGFjZT02NTM1OSxlLm9uZT00OSxlLm9uZWFyYWJpYz0xNjMzLGUub25lYmVuZ2FsaT0yNTM1LGUub25lY2lyY2xlPTkzMTIsZS5vbmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTIyLGUub25lZGV2YT0yNDA3LGUub25lZG90ZW5sZWFkZXI9ODIyOCxlLm9uZWVpZ2h0aD04NTM5LGUub25lZml0dGVkPTYzMTk2LGUub25lZ3VqYXJhdGk9Mjc5MSxlLm9uZWd1cm11a2hpPTI2NjMsZS5vbmVoYWNrYXJhYmljPTE2MzMsZS5vbmVoYWxmPTE4OSxlLm9uZWhhbmd6aG91PTEyMzIxLGUub25laWRlb2dyYXBoaWNwYXJlbj0xMjgzMixlLm9uZWluZmVyaW9yPTgzMjEsZS5vbmVtb25vc3BhY2U9NjUyOTcsZS5vbmVudW1lcmF0b3JiZW5nYWxpPTI1NDgsZS5vbmVvbGRzdHlsZT02MzI4MSxlLm9uZXBhcmVuPTkzMzIsZS5vbmVwZXJpb2Q9OTM1MixlLm9uZXBlcnNpYW49MTc3NyxlLm9uZXF1YXJ0ZXI9MTg4LGUub25lcm9tYW49ODU2MCxlLm9uZXN1cGVyaW9yPTE4NSxlLm9uZXRoYWk9MzY2NSxlLm9uZXRoaXJkPTg1MzEsZS5vb2dvbmVrPTQ5MSxlLm9vZ29uZWttYWNyb249NDkzLGUub29ndXJtdWtoaT0yNTc5LGUub29tYXRyYWd1cm11a2hpPTI2MzUsZS5vb3Blbj01OTYsZS5vcGFyZW49OTM4NixlLm9wZW5idWxsZXQ9OTcwMixlLm9wdGlvbj04OTk3LGUub3JkZmVtaW5pbmU9MTcwLGUub3JkbWFzY3VsaW5lPTE4NixlLm9ydGhvZ29uYWw9ODczNSxlLm9zaG9ydGRldmE9MjMyMixlLm9zaG9ydHZvd2Vsc2lnbmRldmE9MjM3OCxlLm9zbGFzaD0yNDgsZS5vc2xhc2hhY3V0ZT01MTEsZS5vc21hbGxoaXJhZ2FuYT0xMjM2MSxlLm9zbWFsbGthdGFrYW5hPTEyNDU3LGUub3NtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODcsZS5vc3Ryb2tlYWN1dGU9NTExLGUub3N1cGVyaW9yPTYzMjE2LGUub3RjeXJpbGxpYz0xMTUxLGUub3RpbGRlPTI0NSxlLm90aWxkZWFjdXRlPTc3NTcsZS5vdGlsZGVkaWVyZXNpcz03NzU5LGUub3Vib3BvbW9mbz0xMjU3NyxlLm92ZXJsaW5lPTgyNTQsZS5vdmVybGluZWNlbnRlcmxpbmU9NjUwOTgsZS5vdmVybGluZWNtYj03NzMsZS5vdmVybGluZWRhc2hlZD02NTA5NyxlLm92ZXJsaW5lZGJsd2F2eT02NTEwMCxlLm92ZXJsaW5ld2F2eT02NTA5OSxlLm92ZXJzY29yZT0xNzUsZS5vdm93ZWxzaWduYmVuZ2FsaT0yNTA3LGUub3Zvd2Vsc2lnbmRldmE9MjM3OSxlLm92b3dlbHNpZ25ndWphcmF0aT0yNzYzLGUucD0xMTIsZS5wYWFtcHNzcXVhcmU9MTMxODQsZS5wYWFzZW50b3NxdWFyZT0xMzA5OSxlLnBhYmVuZ2FsaT0yNDc0LGUucGFjdXRlPTc3NjUsZS5wYWRldmE9MjM0NixlLnBhZ2Vkb3duPTg2NzEsZS5wYWdldXA9ODY3MCxlLnBhZ3VqYXJhdGk9MjczMCxlLnBhZ3VybXVraGk9MjYwMixlLnBhaGlyYWdhbmE9MTI0MDEsZS5wYWl5YW5ub2l0aGFpPTM2MzEsZS5wYWthdGFrYW5hPTEyNDk3LGUucGFsYXRhbGl6YXRpb25jeXJpbGxpY2NtYj0xMTU2LGUucGFsb2Noa2FjeXJpbGxpYz0xMjE2LGUucGFuc2lvc2tvcmVhbj0xMjY3MSxlLnBhcmFncmFwaD0xODIsZS5wYXJhbGxlbD04NzQxLGUucGFyZW5sZWZ0PTQwLGUucGFyZW5sZWZ0YWx0b25lYXJhYmljPTY0ODMwLGUucGFyZW5sZWZ0YnQ9NjM3MjUsZS5wYXJlbmxlZnRleD02MzcyNCxlLnBhcmVubGVmdGluZmVyaW9yPTgzMzMsZS5wYXJlbmxlZnRtb25vc3BhY2U9NjUyODgsZS5wYXJlbmxlZnRzbWFsbD02NTExMyxlLnBhcmVubGVmdHN1cGVyaW9yPTgzMTcsZS5wYXJlbmxlZnR0cD02MzcyMyxlLnBhcmVubGVmdHZlcnRpY2FsPTY1MDc3LGUucGFyZW5yaWdodD00MSxlLnBhcmVucmlnaHRhbHRvbmVhcmFiaWM9NjQ4MzEsZS5wYXJlbnJpZ2h0YnQ9NjM3MzYsZS5wYXJlbnJpZ2h0ZXg9NjM3MzUsZS5wYXJlbnJpZ2h0aW5mZXJpb3I9ODMzNCxlLnBhcmVucmlnaHRtb25vc3BhY2U9NjUyODksZS5wYXJlbnJpZ2h0c21hbGw9NjUxMTQsZS5wYXJlbnJpZ2h0c3VwZXJpb3I9ODMxOCxlLnBhcmVucmlnaHR0cD02MzczNCxlLnBhcmVucmlnaHR2ZXJ0aWNhbD02NTA3OCxlLnBhcnRpYWxkaWZmPTg3MDYsZS5wYXNlcWhlYnJldz0xNDcyLGUucGFzaHRhaGVicmV3PTE0MzMsZS5wYXNxdWFyZT0xMzIyNSxlLnBhdGFoPTE0NjMsZS5wYXRhaDExPTE0NjMsZS5wYXRhaDFkPTE0NjMsZS5wYXRhaDJhPTE0NjMsZS5wYXRhaGhlYnJldz0xNDYzLGUucGF0YWhuYXJyb3doZWJyZXc9MTQ2MyxlLnBhdGFocXVhcnRlcmhlYnJldz0xNDYzLGUucGF0YWh3aWRlaGVicmV3PTE0NjMsZS5wYXplcmhlYnJldz0xNDQxLGUucGJvcG9tb2ZvPTEyNTUwLGUucGNpcmNsZT05NDM5LGUucGRvdGFjY2VudD03NzY3LGUucGU9MTUwOCxlLnBlY3lyaWxsaWM9MTA4NyxlLnBlZGFnZXNoPTY0MzI0LGUucGVkYWdlc2hoZWJyZXc9NjQzMjQsZS5wZWV6aXNxdWFyZT0xMzExNSxlLnBlZmluYWxkYWdlc2hoZWJyZXc9NjQzMjMsZS5wZWhhcmFiaWM9MTY2MixlLnBlaGFybWVuaWFuPTE0MDIsZS5wZWhlYnJldz0xNTA4LGUucGVoZmluYWxhcmFiaWM9NjQzNDMsZS5wZWhpbml0aWFsYXJhYmljPTY0MzQ0LGUucGVoaXJhZ2FuYT0xMjQxMCxlLnBlaG1lZGlhbGFyYWJpYz02NDM0NSxlLnBla2F0YWthbmE9MTI1MDYsZS5wZW1pZGRsZWhvb2tjeXJpbGxpYz0xMTkxLGUucGVyYWZlaGVicmV3PTY0MzM0LGUucGVyY2VudD0zNyxlLnBlcmNlbnRhcmFiaWM9MTY0MixlLnBlcmNlbnRtb25vc3BhY2U9NjUyODUsZS5wZXJjZW50c21hbGw9NjUxMzAsZS5wZXJpb2Q9NDYsZS5wZXJpb2Rhcm1lbmlhbj0xNDE3LGUucGVyaW9kY2VudGVyZWQ9MTgzLGUucGVyaW9kaGFsZndpZHRoPTY1Mzc3LGUucGVyaW9kaW5mZXJpb3I9NjMyMDcsZS5wZXJpb2Rtb25vc3BhY2U9NjUyOTQsZS5wZXJpb2RzbWFsbD02NTEwNixlLnBlcmlvZHN1cGVyaW9yPTYzMjA4LGUucGVyaXNwb21lbmlncmVla2NtYj04MzQsZS5wZXJwZW5kaWN1bGFyPTg4NjksZS5wZXJ0aG91c2FuZD04MjQwLGUucGVzZXRhPTgzNTksZS5wZnNxdWFyZT0xMzE5NCxlLnBoYWJlbmdhbGk9MjQ3NSxlLnBoYWRldmE9MjM0NyxlLnBoYWd1amFyYXRpPTI3MzEsZS5waGFndXJtdWtoaT0yNjAzLGUucGhpPTk2NixlLnBoaTE9OTgxLGUucGhpZXVwaGFjaXJjbGVrb3JlYW49MTI5MjIsZS5waGlldXBoYXBhcmVua29yZWFuPTEyODI2LGUucGhpZXVwaGNpcmNsZWtvcmVhbj0xMjkwOCxlLnBoaWV1cGhrb3JlYW49MTI2MjEsZS5waGlldXBocGFyZW5rb3JlYW49MTI4MTIsZS5waGlsYXRpbj02MzIsZS5waGludGh1dGhhaT0zNjQyLGUucGhpc3ltYm9sZ3JlZWs9OTgxLGUucGhvb2s9NDIxLGUucGhvcGhhbnRoYWk9MzYxNCxlLnBob3BodW5ndGhhaT0zNjEyLGUucGhvc2FtcGhhb3RoYWk9MzYxNixlLnBpPTk2MCxlLnBpZXVwYWNpcmNsZWtvcmVhbj0xMjkxNSxlLnBpZXVwYXBhcmVua29yZWFuPTEyODE5LGUucGlldXBjaWV1Y2tvcmVhbj0xMjY2MixlLnBpZXVwY2lyY2xla29yZWFuPTEyOTAxLGUucGlldXBraXllb2trb3JlYW49MTI2NTgsZS5waWV1cGtvcmVhbj0xMjYxMCxlLnBpZXVwcGFyZW5rb3JlYW49MTI4MDUsZS5waWV1cHNpb3NraXllb2trb3JlYW49MTI2NjAsZS5waWV1cHNpb3Nrb3JlYW49MTI2MTIsZS5waWV1cHNpb3N0aWtldXRrb3JlYW49MTI2NjEsZS5waWV1cHRoaWV1dGhrb3JlYW49MTI2NjMsZS5waWV1cHRpa2V1dGtvcmVhbj0xMjY1OSxlLnBpaGlyYWdhbmE9MTI0MDQsZS5waWthdGFrYW5hPTEyNTAwLGUucGlzeW1ib2xncmVlaz05ODIsZS5waXdyYXJtZW5pYW49MTQxMSxlLnBsYW5ja292ZXIycGk9ODQ2MyxlLnBsYW5ja292ZXIycGkxPTg0NjMsZS5wbHVzPTQzLGUucGx1c2JlbG93Y21iPTc5OSxlLnBsdXNjaXJjbGU9ODg1MyxlLnBsdXNtaW51cz0xNzcsZS5wbHVzbW9kPTcyNixlLnBsdXNtb25vc3BhY2U9NjUyOTEsZS5wbHVzc21hbGw9NjUxMjIsZS5wbHVzc3VwZXJpb3I9ODMxNCxlLnBtb25vc3BhY2U9NjUzNjAsZS5wbXNxdWFyZT0xMzI3MixlLnBvaGlyYWdhbmE9MTI0MTMsZS5wb2ludGluZ2luZGV4ZG93bndoaXRlPTk3NTksZS5wb2ludGluZ2luZGV4bGVmdHdoaXRlPTk3NTYsZS5wb2ludGluZ2luZGV4cmlnaHR3aGl0ZT05NzU4LGUucG9pbnRpbmdpbmRleHVwd2hpdGU9OTc1NyxlLnBva2F0YWthbmE9MTI1MDksZS5wb3BsYXRoYWk9MzYxMSxlLnBvc3RhbG1hcms9MTIzMDYsZS5wb3N0YWxtYXJrZmFjZT0xMjMyMCxlLnBwYXJlbj05Mzg3LGUucHJlY2VkZXM9ODgyNixlLnByZXNjcmlwdGlvbj04NDc4LGUucHJpbWVtb2Q9Njk3LGUucHJpbWVyZXZlcnNlZD04MjQ1LGUucHJvZHVjdD04NzE5LGUucHJvamVjdGl2ZT04OTY1LGUucHJvbG9uZ2Vka2FuYT0xMjU0MCxlLnByb3BlbGxvcj04OTg0LGUucHJvcGVyc3Vic2V0PTg4MzQsZS5wcm9wZXJzdXBlcnNldD04ODM1LGUucHJvcG9ydGlvbj04NzU5LGUucHJvcG9ydGlvbmFsPTg3MzMsZS5wc2k9OTY4LGUucHNpY3lyaWxsaWM9MTEzNyxlLnBzaWxpcG5ldW1hdGFjeXJpbGxpY2NtYj0xMTU4LGUucHNzcXVhcmU9MTMyMzIsZS5wdWhpcmFnYW5hPTEyNDA3LGUucHVrYXRha2FuYT0xMjUwMyxlLnB2c3F1YXJlPTEzMjM2LGUucHdzcXVhcmU9MTMyNDIsZS5xPTExMyxlLnFhZGV2YT0yMzkyLGUucWFkbWFoZWJyZXc9MTQ0OCxlLnFhZmFyYWJpYz0xNjAyLGUucWFmZmluYWxhcmFiaWM9NjUyMzgsZS5xYWZpbml0aWFsYXJhYmljPTY1MjM5LGUucWFmbWVkaWFsYXJhYmljPTY1MjQwLGUucWFtYXRzPTE0NjQsZS5xYW1hdHMxMD0xNDY0LGUucWFtYXRzMWE9MTQ2NCxlLnFhbWF0czFjPTE0NjQsZS5xYW1hdHMyNz0xNDY0LGUucWFtYXRzMjk9MTQ2NCxlLnFhbWF0czMzPTE0NjQsZS5xYW1hdHNkZT0xNDY0LGUucWFtYXRzaGVicmV3PTE0NjQsZS5xYW1hdHNuYXJyb3doZWJyZXc9MTQ2NCxlLnFhbWF0c3FhdGFuaGVicmV3PTE0NjQsZS5xYW1hdHNxYXRhbm5hcnJvd2hlYnJldz0xNDY0LGUucWFtYXRzcWF0YW5xdWFydGVyaGVicmV3PTE0NjQsZS5xYW1hdHNxYXRhbndpZGVoZWJyZXc9MTQ2NCxlLnFhbWF0c3F1YXJ0ZXJoZWJyZXc9MTQ2NCxlLnFhbWF0c3dpZGVoZWJyZXc9MTQ2NCxlLnFhcm5leXBhcmFoZWJyZXc9MTQzOSxlLnFib3BvbW9mbz0xMjU2MSxlLnFjaXJjbGU9OTQ0MCxlLnFob29rPTY3MixlLnFtb25vc3BhY2U9NjUzNjEsZS5xb2Y9MTUxMSxlLnFvZmRhZ2VzaD02NDMyNyxlLnFvZmRhZ2VzaGhlYnJldz02NDMyNyxlLnFvZmhlYnJldz0xNTExLGUucXBhcmVuPTkzODgsZS5xdWFydGVybm90ZT05ODMzLGUucXVidXRzPTE0NjcsZS5xdWJ1dHMxOD0xNDY3LGUucXVidXRzMjU9MTQ2NyxlLnF1YnV0czMxPTE0NjcsZS5xdWJ1dHNoZWJyZXc9MTQ2NyxlLnF1YnV0c25hcnJvd2hlYnJldz0xNDY3LGUucXVidXRzcXVhcnRlcmhlYnJldz0xNDY3LGUucXVidXRzd2lkZWhlYnJldz0xNDY3LGUucXVlc3Rpb249NjMsZS5xdWVzdGlvbmFyYWJpYz0xNTY3LGUucXVlc3Rpb25hcm1lbmlhbj0xMzc0LGUucXVlc3Rpb25kb3duPTE5MSxlLnF1ZXN0aW9uZG93bnNtYWxsPTYzNDIzLGUucXVlc3Rpb25ncmVlaz04OTQsZS5xdWVzdGlvbm1vbm9zcGFjZT02NTMxMSxlLnF1ZXN0aW9uc21hbGw9NjMyOTUsZS5xdW90ZWRibD0zNCxlLnF1b3RlZGJsYmFzZT04MjIyLGUucXVvdGVkYmxsZWZ0PTgyMjAsZS5xdW90ZWRibG1vbm9zcGFjZT02NTI4MixlLnF1b3RlZGJscHJpbWU9MTIzMTgsZS5xdW90ZWRibHByaW1lcmV2ZXJzZWQ9MTIzMTcsZS5xdW90ZWRibHJpZ2h0PTgyMjEsZS5xdW90ZWxlZnQ9ODIxNixlLnF1b3RlbGVmdHJldmVyc2VkPTgyMTksZS5xdW90ZXJldmVyc2VkPTgyMTksZS5xdW90ZXJpZ2h0PTgyMTcsZS5xdW90ZXJpZ2h0bj0zMjksZS5xdW90ZXNpbmdsYmFzZT04MjE4LGUucXVvdGVzaW5nbGU9MzksZS5xdW90ZXNpbmdsZW1vbm9zcGFjZT02NTI4NyxlLnI9MTE0LGUucmFhcm1lbmlhbj0xNDA0LGUucmFiZW5nYWxpPTI0ODAsZS5yYWN1dGU9MzQxLGUucmFkZXZhPTIzNTIsZS5yYWRpY2FsPTg3MzAsZS5yYWRpY2FsZXg9NjM3MTcsZS5yYWRvdmVyc3NxdWFyZT0xMzIzMCxlLnJhZG92ZXJzc3F1YXJlZHNxdWFyZT0xMzIzMSxlLnJhZHNxdWFyZT0xMzIyOSxlLnJhZmU9MTQ3MSxlLnJhZmVoZWJyZXc9MTQ3MSxlLnJhZ3VqYXJhdGk9MjczNixlLnJhZ3VybXVraGk9MjYwOCxlLnJhaGlyYWdhbmE9MTI0MjUsZS5yYWthdGFrYW5hPTEyNTIxLGUucmFrYXRha2FuYWhhbGZ3aWR0aD02NTQzMSxlLnJhbG93ZXJkaWFnb25hbGJlbmdhbGk9MjU0NSxlLnJhbWlkZGxlZGlhZ29uYWxiZW5nYWxpPTI1NDQsZS5yYW1zaG9ybj02MTIsZS5yYXRpbz04NzU4LGUucmJvcG9tb2ZvPTEyNTY2LGUucmNhcm9uPTM0NSxlLnJjZWRpbGxhPTM0MyxlLnJjaXJjbGU9OTQ0MSxlLnJjb21tYWFjY2VudD0zNDMsZS5yZGJsZ3JhdmU9NTI5LGUucmRvdGFjY2VudD03NzY5LGUucmRvdGJlbG93PTc3NzEsZS5yZG90YmVsb3dtYWNyb249Nzc3MyxlLnJlZmVyZW5jZW1hcms9ODI1MSxlLnJlZmxleHN1YnNldD04ODM4LGUucmVmbGV4c3VwZXJzZXQ9ODgzOSxlLnJlZ2lzdGVyZWQ9MTc0LGUucmVnaXN0ZXJzYW5zPTYzNzIwLGUucmVnaXN0ZXJzZXJpZj02MzE5NCxlLnJlaGFyYWJpYz0xNTg1LGUucmVoYXJtZW5pYW49MTQwOCxlLnJlaGZpbmFsYXJhYmljPTY1MTk4LGUucmVoaXJhZ2FuYT0xMjQyOCxlLnJla2F0YWthbmE9MTI1MjQ7ZS5yZWthdGFrYW5haGFsZndpZHRoPTY1NDM0LGUucmVzaD0xNTEyLGUucmVzaGRhZ2VzaGhlYnJldz02NDMyOCxlLnJlc2hoZWJyZXc9MTUxMixlLnJldmVyc2VkdGlsZGU9ODc2NSxlLnJldmlhaGVicmV3PTE0MzEsZS5yZXZpYW11Z3Jhc2hoZWJyZXc9MTQzMSxlLnJldmxvZ2ljYWxub3Q9ODk3NixlLnJmaXNoaG9vaz02MzgsZS5yZmlzaGhvb2tyZXZlcnNlZD02MzksZS5yaGFiZW5nYWxpPTI1MjUsZS5yaGFkZXZhPTIzOTcsZS5yaG89OTYxLGUucmhvb2s9NjM3LGUucmhvb2t0dXJuZWQ9NjM1LGUucmhvb2t0dXJuZWRzdXBlcmlvcj02OTMsZS5yaG9zeW1ib2xncmVlaz0xMDA5LGUucmhvdGljaG9va21vZD03MzQsZS5yaWV1bGFjaXJjbGVrb3JlYW49MTI5MTMsZS5yaWV1bGFwYXJlbmtvcmVhbj0xMjgxNyxlLnJpZXVsY2lyY2xla29yZWFuPTEyODk5LGUucmlldWxoaWV1aGtvcmVhbj0xMjYwOCxlLnJpZXVsa2l5ZW9ra29yZWFuPTEyNjAyLGUucmlldWxraXllb2tzaW9za29yZWFuPTEyNjQ5LGUucmlldWxrb3JlYW49MTI2MDEsZS5yaWV1bG1pZXVta29yZWFuPTEyNjAzLGUucmlldWxwYW5zaW9za29yZWFuPTEyNjUyLGUucmlldWxwYXJlbmtvcmVhbj0xMjgwMyxlLnJpZXVscGhpZXVwaGtvcmVhbj0xMjYwNyxlLnJpZXVscGlldXBrb3JlYW49MTI2MDQsZS5yaWV1bHBpZXVwc2lvc2tvcmVhbj0xMjY1MSxlLnJpZXVsc2lvc2tvcmVhbj0xMjYwNSxlLnJpZXVsdGhpZXV0aGtvcmVhbj0xMjYwNixlLnJpZXVsdGlrZXV0a29yZWFuPTEyNjUwLGUucmlldWx5ZW9yaW5oaWV1aGtvcmVhbj0xMjY1MyxlLnJpZ2h0YW5nbGU9ODczNSxlLnJpZ2h0dGFja2JlbG93Y21iPTc5MyxlLnJpZ2h0dHJpYW5nbGU9ODg5NSxlLnJpaGlyYWdhbmE9MTI0MjYsZS5yaWthdGFrYW5hPTEyNTIyLGUucmlrYXRha2FuYWhhbGZ3aWR0aD02NTQzMixlLnJpbmc9NzMwLGUucmluZ2JlbG93Y21iPTgwNSxlLnJpbmdjbWI9Nzc4LGUucmluZ2hhbGZsZWZ0PTcwMyxlLnJpbmdoYWxmbGVmdGFybWVuaWFuPTEzNjksZS5yaW5naGFsZmxlZnRiZWxvd2NtYj03OTYsZS5yaW5naGFsZmxlZnRjZW50ZXJlZD03MjMsZS5yaW5naGFsZnJpZ2h0PTcwMixlLnJpbmdoYWxmcmlnaHRiZWxvd2NtYj04MjUsZS5yaW5naGFsZnJpZ2h0Y2VudGVyZWQ9NzIyLGUucmludmVydGVkYnJldmU9NTMxLGUucml0dG9ydXNxdWFyZT0xMzEzNyxlLnJsaW5lYmVsb3c9Nzc3NSxlLnJsb25nbGVnPTYzNixlLnJsb25nbGVndHVybmVkPTYzNCxlLnJtb25vc3BhY2U9NjUzNjIsZS5yb2hpcmFnYW5hPTEyNDI5LGUucm9rYXRha2FuYT0xMjUyNSxlLnJva2F0YWthbmFoYWxmd2lkdGg9NjU0MzUsZS5yb3J1YXRoYWk9MzYxOSxlLnJwYXJlbj05Mzg5LGUucnJhYmVuZ2FsaT0yNTI0LGUucnJhZGV2YT0yMzUzLGUucnJhZ3VybXVraGk9MjY1MixlLnJyZWhhcmFiaWM9MTY4MSxlLnJyZWhmaW5hbGFyYWJpYz02NDM5NyxlLnJydm9jYWxpY2JlbmdhbGk9MjUyOCxlLnJydm9jYWxpY2RldmE9MjQwMCxlLnJydm9jYWxpY2d1amFyYXRpPTI3ODQsZS5ycnZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpPTI1MDAsZS5ycnZvY2FsaWN2b3dlbHNpZ25kZXZhPTIzNzIsZS5ycnZvY2FsaWN2b3dlbHNpZ25ndWphcmF0aT0yNzU2LGUucnN1cGVyaW9yPTYzMjE3LGUucnRibG9jaz05NjE2LGUucnR1cm5lZD02MzMsZS5ydHVybmVkc3VwZXJpb3I9NjkyLGUucnVoaXJhZ2FuYT0xMjQyNyxlLnJ1a2F0YWthbmE9MTI1MjMsZS5ydWthdGFrYW5haGFsZndpZHRoPTY1NDMzLGUucnVwZWVtYXJrYmVuZ2FsaT0yNTQ2LGUucnVwZWVzaWduYmVuZ2FsaT0yNTQ3LGUucnVwaWFoPTYzMTk3LGUucnV0aGFpPTM2MjAsZS5ydm9jYWxpY2JlbmdhbGk9MjQ0MyxlLnJ2b2NhbGljZGV2YT0yMzE1LGUucnZvY2FsaWNndWphcmF0aT0yNjk5LGUucnZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpPTI0OTksZS5ydm9jYWxpY3Zvd2Vsc2lnbmRldmE9MjM3MSxlLnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGk9Mjc1NSxlLnM9MTE1LGUuc2FiZW5nYWxpPTI0ODgsZS5zYWN1dGU9MzQ3LGUuc2FjdXRlZG90YWNjZW50PTc3ODEsZS5zYWRhcmFiaWM9MTU4OSxlLnNhZGV2YT0yMzYwLGUuc2FkZmluYWxhcmFiaWM9NjUyMTAsZS5zYWRpbml0aWFsYXJhYmljPTY1MjExLGUuc2FkbWVkaWFsYXJhYmljPTY1MjEyLGUuc2FndWphcmF0aT0yNzQ0LGUuc2FndXJtdWtoaT0yNjE2LGUuc2FoaXJhZ2FuYT0xMjM3MyxlLnNha2F0YWthbmE9MTI0NjksZS5zYWthdGFrYW5haGFsZndpZHRoPTY1NDAzLGUuc2FsbGFsbGFob3VhbGF5aGV3YXNhbGxhbWFyYWJpYz02NTAxOCxlLnNhbWVraD0xNTA1LGUuc2FtZWtoZGFnZXNoPTY0MzIxLGUuc2FtZWtoZGFnZXNoaGVicmV3PTY0MzIxLGUuc2FtZWtoaGVicmV3PTE1MDUsZS5zYXJhYWF0aGFpPTM2MzQsZS5zYXJhYWV0aGFpPTM2NDksZS5zYXJhYWltYWltYWxhaXRoYWk9MzY1MixlLnNhcmFhaW1haW11YW50aGFpPTM2NTEsZS5zYXJhYW10aGFpPTM2MzUsZS5zYXJhYXRoYWk9MzYzMixlLnNhcmFldGhhaT0zNjQ4LGUuc2FyYWlpbGVmdHRoYWk9NjM2MjIsZS5zYXJhaWl0aGFpPTM2MzcsZS5zYXJhaWxlZnR0aGFpPTYzNjIxLGUuc2FyYWl0aGFpPTM2MzYsZS5zYXJhb3RoYWk9MzY1MCxlLnNhcmF1ZWVsZWZ0dGhhaT02MzYyNCxlLnNhcmF1ZWV0aGFpPTM2MzksZS5zYXJhdWVsZWZ0dGhhaT02MzYyMyxlLnNhcmF1ZXRoYWk9MzYzOCxlLnNhcmF1dGhhaT0zNjQwLGUuc2FyYXV1dGhhaT0zNjQxLGUuc2JvcG9tb2ZvPTEyNTY5LGUuc2Nhcm9uPTM1MyxlLnNjYXJvbmRvdGFjY2VudD03NzgzLGUuc2NlZGlsbGE9MzUxLGUuc2Nod2E9NjAxLGUuc2Nod2FjeXJpbGxpYz0xMjQxLGUuc2Nod2FkaWVyZXNpc2N5cmlsbGljPTEyNDMsZS5zY2h3YWhvb2s9NjAyLGUuc2NpcmNsZT05NDQyLGUuc2NpcmN1bWZsZXg9MzQ5LGUuc2NvbW1hYWNjZW50PTUzNyxlLnNkb3RhY2NlbnQ9Nzc3NyxlLnNkb3RiZWxvdz03Nzc5LGUuc2RvdGJlbG93ZG90YWNjZW50PTc3ODUsZS5zZWFndWxsYmVsb3djbWI9ODI4LGUuc2Vjb25kPTgyNDMsZS5zZWNvbmR0b25lY2hpbmVzZT03MTQsZS5zZWN0aW9uPTE2NyxlLnNlZW5hcmFiaWM9MTU4NyxlLnNlZW5maW5hbGFyYWJpYz02NTIwMixlLnNlZW5pbml0aWFsYXJhYmljPTY1MjAzLGUuc2Vlbm1lZGlhbGFyYWJpYz02NTIwNCxlLnNlZ29sPTE0NjIsZS5zZWdvbDEzPTE0NjIsZS5zZWdvbDFmPTE0NjIsZS5zZWdvbDJjPTE0NjIsZS5zZWdvbGhlYnJldz0xNDYyLGUuc2Vnb2xuYXJyb3doZWJyZXc9MTQ2MixlLnNlZ29scXVhcnRlcmhlYnJldz0xNDYyLGUuc2Vnb2x0YWhlYnJldz0xNDI2LGUuc2Vnb2x3aWRlaGVicmV3PTE0NjIsZS5zZWhhcm1lbmlhbj0xNDA1LGUuc2VoaXJhZ2FuYT0xMjM3OSxlLnNla2F0YWthbmE9MTI0NzUsZS5zZWthdGFrYW5haGFsZndpZHRoPTY1NDA2LGUuc2VtaWNvbG9uPTU5LGUuc2VtaWNvbG9uYXJhYmljPTE1NjMsZS5zZW1pY29sb25tb25vc3BhY2U9NjUzMDcsZS5zZW1pY29sb25zbWFsbD02NTEwOCxlLnNlbWl2b2ljZWRtYXJra2FuYT0xMjQ0NCxlLnNlbWl2b2ljZWRtYXJra2FuYWhhbGZ3aWR0aD02NTQzOSxlLnNlbnRpc3F1YXJlPTEzMDkwLGUuc2VudG9zcXVhcmU9MTMwOTEsZS5zZXZlbj01NSxlLnNldmVuYXJhYmljPTE2MzksZS5zZXZlbmJlbmdhbGk9MjU0MSxlLnNldmVuY2lyY2xlPTkzMTgsZS5zZXZlbmNpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMjgsZS5zZXZlbmRldmE9MjQxMyxlLnNldmVuZWlnaHRocz04NTQyLGUuc2V2ZW5ndWphcmF0aT0yNzk3LGUuc2V2ZW5ndXJtdWtoaT0yNjY5LGUuc2V2ZW5oYWNrYXJhYmljPTE2MzksZS5zZXZlbmhhbmd6aG91PTEyMzI3LGUuc2V2ZW5pZGVvZ3JhcGhpY3BhcmVuPTEyODM4LGUuc2V2ZW5pbmZlcmlvcj04MzI3LGUuc2V2ZW5tb25vc3BhY2U9NjUzMDMsZS5zZXZlbm9sZHN0eWxlPTYzMjg3LGUuc2V2ZW5wYXJlbj05MzM4LGUuc2V2ZW5wZXJpb2Q9OTM1OCxlLnNldmVucGVyc2lhbj0xNzgzLGUuc2V2ZW5yb21hbj04NTY2LGUuc2V2ZW5zdXBlcmlvcj04MzExLGUuc2V2ZW50ZWVuY2lyY2xlPTkzMjgsZS5zZXZlbnRlZW5wYXJlbj05MzQ4LGUuc2V2ZW50ZWVucGVyaW9kPTkzNjgsZS5zZXZlbnRoYWk9MzY3MSxlLnNmdGh5cGhlbj0xNzMsZS5zaGFhcm1lbmlhbj0xMzk5LGUuc2hhYmVuZ2FsaT0yNDg2LGUuc2hhY3lyaWxsaWM9MTA5NixlLnNoYWRkYWFyYWJpYz0xNjE3LGUuc2hhZGRhZGFtbWFhcmFiaWM9NjQ2MDksZS5zaGFkZGFkYW1tYXRhbmFyYWJpYz02NDYwNixlLnNoYWRkYWZhdGhhYXJhYmljPTY0NjA4LGUuc2hhZGRha2FzcmFhcmFiaWM9NjQ2MTAsZS5zaGFkZGFrYXNyYXRhbmFyYWJpYz02NDYwNyxlLnNoYWRlPTk2MTgsZS5zaGFkZWRhcms9OTYxOSxlLnNoYWRlbGlnaHQ9OTYxNyxlLnNoYWRlbWVkaXVtPTk2MTgsZS5zaGFkZXZhPTIzNTgsZS5zaGFndWphcmF0aT0yNzQyLGUuc2hhZ3VybXVraGk9MjYxNCxlLnNoYWxzaGVsZXRoZWJyZXc9MTQyNyxlLnNoYm9wb21vZm89MTI1NjUsZS5zaGNoYWN5cmlsbGljPTEwOTcsZS5zaGVlbmFyYWJpYz0xNTg4LGUuc2hlZW5maW5hbGFyYWJpYz02NTIwNixlLnNoZWVuaW5pdGlhbGFyYWJpYz02NTIwNyxlLnNoZWVubWVkaWFsYXJhYmljPTY1MjA4LGUuc2hlaWNvcHRpYz05OTUsZS5zaGVxZWw9ODM2MixlLnNoZXFlbGhlYnJldz04MzYyLGUuc2hldmE9MTQ1NixlLnNoZXZhMTE1PTE0NTYsZS5zaGV2YTE1PTE0NTYsZS5zaGV2YTIyPTE0NTYsZS5zaGV2YTJlPTE0NTYsZS5zaGV2YWhlYnJldz0xNDU2LGUuc2hldmFuYXJyb3doZWJyZXc9MTQ1NixlLnNoZXZhcXVhcnRlcmhlYnJldz0xNDU2LGUuc2hldmF3aWRlaGVicmV3PTE0NTYsZS5zaGhhY3lyaWxsaWM9MTIxMSxlLnNoaW1hY29wdGljPTEwMDUsZS5zaGluPTE1MTMsZS5zaGluZGFnZXNoPTY0MzI5LGUuc2hpbmRhZ2VzaGhlYnJldz02NDMyOSxlLnNoaW5kYWdlc2hzaGluZG90PTY0MzAwLGUuc2hpbmRhZ2VzaHNoaW5kb3RoZWJyZXc9NjQzMDAsZS5zaGluZGFnZXNoc2luZG90PTY0MzAxLGUuc2hpbmRhZ2VzaHNpbmRvdGhlYnJldz02NDMwMSxlLnNoaW5kb3RoZWJyZXc9MTQ3MyxlLnNoaW5oZWJyZXc9MTUxMyxlLnNoaW5zaGluZG90PTY0Mjk4LGUuc2hpbnNoaW5kb3RoZWJyZXc9NjQyOTgsZS5zaGluc2luZG90PTY0Mjk5LGUuc2hpbnNpbmRvdGhlYnJldz02NDI5OSxlLnNob29rPTY0MixlLnNpZ21hPTk2MyxlLnNpZ21hMT05NjIsZS5zaWdtYWZpbmFsPTk2MixlLnNpZ21hbHVuYXRlc3ltYm9sZ3JlZWs9MTAxMCxlLnNpaGlyYWdhbmE9MTIzNzUsZS5zaWthdGFrYW5hPTEyNDcxLGUuc2lrYXRha2FuYWhhbGZ3aWR0aD02NTQwNCxlLnNpbHVxaGVicmV3PTE0NjksZS5zaWx1cWxlZnRoZWJyZXc9MTQ2OSxlLnNpbWlsYXI9ODc2NCxlLnNpbmRvdGhlYnJldz0xNDc0LGUuc2lvc2FjaXJjbGVrb3JlYW49MTI5MTYsZS5zaW9zYXBhcmVua29yZWFuPTEyODIwLGUuc2lvc2NpZXVja29yZWFuPTEyNjcwLGUuc2lvc2NpcmNsZWtvcmVhbj0xMjkwMixlLnNpb3NraXllb2trb3JlYW49MTI2NjYsZS5zaW9za29yZWFuPTEyNjEzLGUuc2lvc25pZXVua29yZWFuPTEyNjY3LGUuc2lvc3BhcmVua29yZWFuPTEyODA2LGUuc2lvc3BpZXVwa29yZWFuPTEyNjY5LGUuc2lvc3Rpa2V1dGtvcmVhbj0xMjY2OCxlLnNpeD01NCxlLnNpeGFyYWJpYz0xNjM4LGUuc2l4YmVuZ2FsaT0yNTQwLGUuc2l4Y2lyY2xlPTkzMTcsZS5zaXhjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTI3LGUuc2l4ZGV2YT0yNDEyLGUuc2l4Z3VqYXJhdGk9Mjc5NixlLnNpeGd1cm11a2hpPTI2NjgsZS5zaXhoYWNrYXJhYmljPTE2MzgsZS5zaXhoYW5nemhvdT0xMjMyNixlLnNpeGlkZW9ncmFwaGljcGFyZW49MTI4MzcsZS5zaXhpbmZlcmlvcj04MzI2LGUuc2l4bW9ub3NwYWNlPTY1MzAyLGUuc2l4b2xkc3R5bGU9NjMyODYsZS5zaXhwYXJlbj05MzM3LGUuc2l4cGVyaW9kPTkzNTcsZS5zaXhwZXJzaWFuPTE3ODIsZS5zaXhyb21hbj04NTY1LGUuc2l4c3VwZXJpb3I9ODMxMCxlLnNpeHRlZW5jaXJjbGU9OTMyNyxlLnNpeHRlZW5jdXJyZW5jeWRlbm9taW5hdG9yYmVuZ2FsaT0yNTUzLGUuc2l4dGVlbnBhcmVuPTkzNDcsZS5zaXh0ZWVucGVyaW9kPTkzNjcsZS5zaXh0aGFpPTM2NzAsZS5zbGFzaD00NyxlLnNsYXNobW9ub3NwYWNlPTY1Mjk1LGUuc2xvbmc9MzgzLGUuc2xvbmdkb3RhY2NlbnQ9NzgzNSxlLnNtaWxlZmFjZT05Nzg2LGUuc21vbm9zcGFjZT02NTM2MyxlLnNvZnBhc3VxaGVicmV3PTE0NzUsZS5zb2Z0aHlwaGVuPTE3MyxlLnNvZnRzaWduY3lyaWxsaWM9MTEwMCxlLnNvaGlyYWdhbmE9MTIzODEsZS5zb2thdGFrYW5hPTEyNDc3LGUuc29rYXRha2FuYWhhbGZ3aWR0aD02NTQwNyxlLnNvbGlkdXNsb25nb3ZlcmxheWNtYj04MjQsZS5zb2xpZHVzc2hvcnRvdmVybGF5Y21iPTgyMyxlLnNvcnVzaXRoYWk9MzYyNSxlLnNvc2FsYXRoYWk9MzYyNCxlLnNvc290aGFpPTM1OTUsZS5zb3N1YXRoYWk9MzYyNixlLnNwYWNlPTMyLGUuc3BhY2VoYWNrYXJhYmljPTMyLGUuc3BhZGU9OTgyNCxlLnNwYWRlc3VpdGJsYWNrPTk4MjQsZS5zcGFkZXN1aXR3aGl0ZT05ODI4LGUuc3BhcmVuPTkzOTAsZS5zcXVhcmViZWxvd2NtYj04MjcsZS5zcXVhcmVjYz0xMzI1MixlLnNxdWFyZWNtPTEzMjEzLGUuc3F1YXJlZGlhZ29uYWxjcm9zc2hhdGNoZmlsbD05NjQxLGUuc3F1YXJlaG9yaXpvbnRhbGZpbGw9OTYzNixlLnNxdWFyZWtnPTEzMTk5LGUuc3F1YXJla209MTMyMTQsZS5zcXVhcmVrbWNhcGl0YWw9MTMyNjIsZS5zcXVhcmVsbj0xMzI2NSxlLnNxdWFyZWxvZz0xMzI2NixlLnNxdWFyZW1nPTEzMTk4LGUuc3F1YXJlbWlsPTEzMjY5LGUuc3F1YXJlbW09MTMyMTIsZS5zcXVhcmVtc3F1YXJlZD0xMzIxNyxlLnNxdWFyZW9ydGhvZ29uYWxjcm9zc2hhdGNoZmlsbD05NjM4LGUuc3F1YXJldXBwZXJsZWZ0dG9sb3dlcnJpZ2h0ZmlsbD05NjM5LGUuc3F1YXJldXBwZXJyaWdodHRvbG93ZXJsZWZ0ZmlsbD05NjQwLGUuc3F1YXJldmVydGljYWxmaWxsPTk2MzcsZS5zcXVhcmV3aGl0ZXdpdGhzbWFsbGJsYWNrPTk2MzUsZS5zcnNxdWFyZT0xMzI3NSxlLnNzYWJlbmdhbGk9MjQ4NyxlLnNzYWRldmE9MjM1OSxlLnNzYWd1amFyYXRpPTI3NDMsZS5zc2FuZ2NpZXVja29yZWFuPTEyNjE3LGUuc3NhbmdoaWV1aGtvcmVhbj0xMjY3NyxlLnNzYW5naWV1bmdrb3JlYW49MTI2NzIsZS5zc2FuZ2tpeWVva2tvcmVhbj0xMjU5NCxlLnNzYW5nbmlldW5rb3JlYW49MTI2NDUsZS5zc2FuZ3BpZXVwa29yZWFuPTEyNjExLGUuc3NhbmdzaW9za29yZWFuPTEyNjE0LGUuc3Nhbmd0aWtldXRrb3JlYW49MTI2MDAsZS5zc3VwZXJpb3I9NjMyMTgsZS5zdGVybGluZz0xNjMsZS5zdGVybGluZ21vbm9zcGFjZT02NTUwNSxlLnN0cm9rZWxvbmdvdmVybGF5Y21iPTgyMixlLnN0cm9rZXNob3J0b3ZlcmxheWNtYj04MjEsZS5zdWJzZXQ9ODgzNCxlLnN1YnNldG5vdGVxdWFsPTg4NDIsZS5zdWJzZXRvcmVxdWFsPTg4MzgsZS5zdWNjZWVkcz04ODI3LGUuc3VjaHRoYXQ9ODcxNSxlLnN1aGlyYWdhbmE9MTIzNzcsZS5zdWthdGFrYW5hPTEyNDczLGUuc3VrYXRha2FuYWhhbGZ3aWR0aD02NTQwNSxlLnN1a3VuYXJhYmljPTE2MTgsZS5zdW1tYXRpb249ODcyMSxlLnN1bj05Nzg4LGUuc3VwZXJzZXQ9ODgzNSxlLnN1cGVyc2V0bm90ZXF1YWw9ODg0MyxlLnN1cGVyc2V0b3JlcXVhbD04ODM5LGUuc3ZzcXVhcmU9MTMyNzYsZS5zeW91d2FlcmFzcXVhcmU9MTMxODAsZS50PTExNixlLnRhYmVuZ2FsaT0yNDY4LGUudGFja2Rvd249ODg2OCxlLnRhY2tsZWZ0PTg4NjcsZS50YWRldmE9MjM0MCxlLnRhZ3VqYXJhdGk9MjcyNCxlLnRhZ3VybXVraGk9MjU5NixlLnRhaGFyYWJpYz0xNTkxLGUudGFoZmluYWxhcmFiaWM9NjUyMTgsZS50YWhpbml0aWFsYXJhYmljPTY1MjE5LGUudGFoaXJhZ2FuYT0xMjM4MyxlLnRhaG1lZGlhbGFyYWJpYz02NTIyMCxlLnRhaXN5b3VlcmFzcXVhcmU9MTMxODEsZS50YWthdGFrYW5hPTEyNDc5LGUudGFrYXRha2FuYWhhbGZ3aWR0aD02NTQwOCxlLnRhdHdlZWxhcmFiaWM9MTYwMCxlLnRhdT05NjQsZS50YXY9MTUxNCxlLnRhdmRhZ2VzPTY0MzMwLGUudGF2ZGFnZXNoPTY0MzMwLGUudGF2ZGFnZXNoaGVicmV3PTY0MzMwLGUudGF2aGVicmV3PTE1MTQsZS50YmFyPTM1OSxlLnRib3BvbW9mbz0xMjU1NCxlLnRjYXJvbj0zNTcsZS50Y2N1cmw9NjgwLGUudGNlZGlsbGE9MzU1LGUudGNoZWhhcmFiaWM9MTY3MCxlLnRjaGVoZmluYWxhcmFiaWM9NjQzNzksZS50Y2hlaGluaXRpYWxhcmFiaWM9NjQzODAsZS50Y2hlaG1lZGlhbGFyYWJpYz02NDM4MSxlLnRjaXJjbGU9OTQ0MyxlLnRjaXJjdW1mbGV4YmVsb3c9Nzc5MyxlLnRjb21tYWFjY2VudD0zNTUsZS50ZGllcmVzaXM9NzgzMSxlLnRkb3RhY2NlbnQ9Nzc4NyxlLnRkb3RiZWxvdz03Nzg5LGUudGVjeXJpbGxpYz0xMDkwLGUudGVkZXNjZW5kZXJjeXJpbGxpYz0xMTk3LGUudGVoYXJhYmljPTE1NzgsZS50ZWhmaW5hbGFyYWJpYz02NTE3NCxlLnRlaGhhaGluaXRpYWxhcmFiaWM9NjQ2NzQsZS50ZWhoYWhpc29sYXRlZGFyYWJpYz02NDUyNCxlLnRlaGluaXRpYWxhcmFiaWM9NjUxNzUsZS50ZWhpcmFnYW5hPTEyMzkwLGUudGVoamVlbWluaXRpYWxhcmFiaWM9NjQ2NzMsZS50ZWhqZWVtaXNvbGF0ZWRhcmFiaWM9NjQ1MjMsZS50ZWhtYXJidXRhYXJhYmljPTE1NzcsZS50ZWhtYXJidXRhZmluYWxhcmFiaWM9NjUxNzIsZS50ZWhtZWRpYWxhcmFiaWM9NjUxNzYsZS50ZWhtZWVtaW5pdGlhbGFyYWJpYz02NDY3NixlLnRlaG1lZW1pc29sYXRlZGFyYWJpYz02NDUyNixlLnRlaG5vb25maW5hbGFyYWJpYz02NDYyNyxlLnRla2F0YWthbmE9MTI0ODYsZS50ZWthdGFrYW5haGFsZndpZHRoPTY1NDExLGUudGVsZXBob25lPTg0ODEsZS50ZWxlcGhvbmVibGFjaz05NzQyLGUudGVsaXNoYWdlZG9sYWhlYnJldz0xNDQwLGUudGVsaXNoYXFldGFuYWhlYnJldz0xNDQ5LGUudGVuY2lyY2xlPTkzMjEsZS50ZW5pZGVvZ3JhcGhpY3BhcmVuPTEyODQxLGUudGVucGFyZW49OTM0MSxlLnRlbnBlcmlvZD05MzYxLGUudGVucm9tYW49ODU2OSxlLnRlc2g9Njc5LGUudGV0PTE0OTYsZS50ZXRkYWdlc2g9NjQzMTIsZS50ZXRkYWdlc2hoZWJyZXc9NjQzMTIsZS50ZXRoZWJyZXc9MTQ5NixlLnRldHNlY3lyaWxsaWM9MTIwNSxlLnRldmlyaGVicmV3PTE0MzUsZS50ZXZpcmxlZnRoZWJyZXc9MTQzNSxlLnRoYWJlbmdhbGk9MjQ2OSxlLnRoYWRldmE9MjM0MSxlLnRoYWd1amFyYXRpPTI3MjUsZS50aGFndXJtdWtoaT0yNTk3LGUudGhhbGFyYWJpYz0xNTg0LGUudGhhbGZpbmFsYXJhYmljPTY1MTk2LGUudGhhbnRoYWtoYXRsb3dsZWZ0dGhhaT02MzY0MCxlLnRoYW50aGFraGF0bG93cmlnaHR0aGFpPTYzNjM5LGUudGhhbnRoYWtoYXR0aGFpPTM2NjAsZS50aGFudGhha2hhdHVwcGVybGVmdHRoYWk9NjM2MzgsZS50aGVoYXJhYmljPTE1NzksZS50aGVoZmluYWxhcmFiaWM9NjUxNzgsZS50aGVoaW5pdGlhbGFyYWJpYz02NTE3OSxlLnRoZWhtZWRpYWxhcmFiaWM9NjUxODAsZS50aGVyZWV4aXN0cz04NzA3LGUudGhlcmVmb3JlPTg3NTYsZS50aGV0YT05NTIsZS50aGV0YTE9OTc3LGUudGhldGFzeW1ib2xncmVlaz05NzcsZS50aGlldXRoYWNpcmNsZWtvcmVhbj0xMjkyMSxlLnRoaWV1dGhhcGFyZW5rb3JlYW49MTI4MjUsZS50aGlldXRoY2lyY2xla29yZWFuPTEyOTA3LGUudGhpZXV0aGtvcmVhbj0xMjYyMCxlLnRoaWV1dGhwYXJlbmtvcmVhbj0xMjgxMSxlLnRoaXJ0ZWVuY2lyY2xlPTkzMjQsZS50aGlydGVlbnBhcmVuPTkzNDQsZS50aGlydGVlbnBlcmlvZD05MzY0LGUudGhvbmFuZ21vbnRob3RoYWk9MzYwMSxlLnRob29rPTQyOSxlLnRob3BodXRoYW90aGFpPTM2MDIsZS50aG9ybj0yNTQsZS50aG90aGFoYW50aGFpPTM2MDcsZS50aG90aGFudGhhaT0zNjAwLGUudGhvdGhvbmd0aGFpPTM2MDgsZS50aG90aHVuZ3RoYWk9MzYwNixlLnRob3VzYW5kY3lyaWxsaWM9MTE1NCxlLnRob3VzYW5kc3NlcGFyYXRvcmFyYWJpYz0xNjQ0LGUudGhvdXNhbmRzc2VwYXJhdG9ycGVyc2lhbj0xNjQ0LGUudGhyZWU9NTEsZS50aHJlZWFyYWJpYz0xNjM1LGUudGhyZWViZW5nYWxpPTI1MzcsZS50aHJlZWNpcmNsZT05MzE0LGUudGhyZWVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTI0LGUudGhyZWVkZXZhPTI0MDksZS50aHJlZWVpZ2h0aHM9ODU0MCxlLnRocmVlZ3VqYXJhdGk9Mjc5MyxlLnRocmVlZ3VybXVraGk9MjY2NSxlLnRocmVlaGFja2FyYWJpYz0xNjM1LGUudGhyZWVoYW5nemhvdT0xMjMyMyxlLnRocmVlaWRlb2dyYXBoaWNwYXJlbj0xMjgzNCxlLnRocmVlaW5mZXJpb3I9ODMyMyxlLnRocmVlbW9ub3NwYWNlPTY1Mjk5LGUudGhyZWVudW1lcmF0b3JiZW5nYWxpPTI1NTAsZS50aHJlZW9sZHN0eWxlPTYzMjgzLGUudGhyZWVwYXJlbj05MzM0LGUudGhyZWVwZXJpb2Q9OTM1NCxlLnRocmVlcGVyc2lhbj0xNzc5LGUudGhyZWVxdWFydGVycz0xOTAsZS50aHJlZXF1YXJ0ZXJzZW1kYXNoPTYzMTk4LGUudGhyZWVyb21hbj04NTYyLGUudGhyZWVzdXBlcmlvcj0xNzksZS50aHJlZXRoYWk9MzY2NyxlLnRoenNxdWFyZT0xMzIwNCxlLnRpaGlyYWdhbmE9MTIzODUsZS50aWthdGFrYW5hPTEyNDgxLGUudGlrYXRha2FuYWhhbGZ3aWR0aD02NTQwOSxlLnRpa2V1dGFjaXJjbGVrb3JlYW49MTI5MTIsZS50aWtldXRhcGFyZW5rb3JlYW49MTI4MTYsZS50aWtldXRjaXJjbGVrb3JlYW49MTI4OTgsZS50aWtldXRrb3JlYW49MTI1OTksZS50aWtldXRwYXJlbmtvcmVhbj0xMjgwMixlLnRpbGRlPTczMixlLnRpbGRlYmVsb3djbWI9ODE2LGUudGlsZGVjbWI9NzcxLGUudGlsZGVjb21iPTc3MSxlLnRpbGRlZG91YmxlY21iPTg2NCxlLnRpbGRlb3BlcmF0b3I9ODc2NCxlLnRpbGRlb3ZlcmxheWNtYj04MjAsZS50aWxkZXZlcnRpY2FsY21iPTgzMCxlLnRpbWVzY2lyY2xlPTg4NTUsZS50aXBlaGFoZWJyZXc9MTQzMCxlLnRpcGVoYWxlZnRoZWJyZXc9MTQzMCxlLnRpcHBpZ3VybXVraGk9MjY3MixlLnRpdGxvY3lyaWxsaWNjbWI9MTE1NSxlLnRpd25hcm1lbmlhbj0xNDA3LGUudGxpbmViZWxvdz03NzkxLGUudG1vbm9zcGFjZT02NTM2NCxlLnRvYXJtZW5pYW49MTM4NSxlLnRvaGlyYWdhbmE9MTIzOTIsZS50b2thdGFrYW5hPTEyNDg4LGUudG9rYXRha2FuYWhhbGZ3aWR0aD02NTQxMixlLnRvbmViYXJleHRyYWhpZ2htb2Q9NzQxLGUudG9uZWJhcmV4dHJhbG93bW9kPTc0NSxlLnRvbmViYXJoaWdobW9kPTc0MixlLnRvbmViYXJsb3dtb2Q9NzQ0LGUudG9uZWJhcm1pZG1vZD03NDMsZS50b25lZml2ZT00NDUsZS50b25lc2l4PTM4OSxlLnRvbmV0d289NDI0LGUudG9ub3M9OTAwLGUudG9uc3F1YXJlPTEzMDk1LGUudG9wYXRha3RoYWk9MzU5OSxlLnRvcnRvaXNlc2hlbGxicmFja2V0bGVmdD0xMjMwOCxlLnRvcnRvaXNlc2hlbGxicmFja2V0bGVmdHNtYWxsPTY1MTE3LGUudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODEsZS50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0PTEyMzA5LGUudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodHNtYWxsPTY1MTE4LGUudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodHZlcnRpY2FsPTY1MDgyLGUudG90YW90aGFpPTM2MDUsZS50cGFsYXRhbGhvb2s9NDI3LGUudHBhcmVuPTkzOTEsZS50cmFkZW1hcms9ODQ4MixlLnRyYWRlbWFya3NhbnM9NjM3MjIsZS50cmFkZW1hcmtzZXJpZj02MzE5NSxlLnRyZXRyb2ZsZXhob29rPTY0OCxlLnRyaWFnZG49OTY2MCxlLnRyaWFnbGY9OTY2OCxlLnRyaWFncnQ9OTY1OCxlLnRyaWFndXA9OTY1MCxlLnRzPTY3OCxlLnRzYWRpPTE1MTAsZS50c2FkaWRhZ2VzaD02NDMyNixlLnRzYWRpZGFnZXNoaGVicmV3PTY0MzI2LGUudHNhZGloZWJyZXc9MTUxMCxlLnRzZWN5cmlsbGljPTEwOTQsZS50c2VyZT0xNDYxLGUudHNlcmUxMj0xNDYxLGUudHNlcmUxZT0xNDYxLGUudHNlcmUyYj0xNDYxLGUudHNlcmVoZWJyZXc9MTQ2MSxlLnRzZXJlbmFycm93aGVicmV3PTE0NjEsZS50c2VyZXF1YXJ0ZXJoZWJyZXc9MTQ2MSxlLnRzZXJld2lkZWhlYnJldz0xNDYxLGUudHNoZWN5cmlsbGljPTExMTUsZS50c3VwZXJpb3I9NjMyMTksZS50dGFiZW5nYWxpPTI0NjMsZS50dGFkZXZhPTIzMzUsZS50dGFndWphcmF0aT0yNzE5LGUudHRhZ3VybXVraGk9MjU5MSxlLnR0ZWhhcmFiaWM9MTY1NyxlLnR0ZWhmaW5hbGFyYWJpYz02NDM1OSxlLnR0ZWhpbml0aWFsYXJhYmljPTY0MzYwLGUudHRlaG1lZGlhbGFyYWJpYz02NDM2MSxlLnR0aGFiZW5nYWxpPTI0NjQsZS50dGhhZGV2YT0yMzM2LGUudHRoYWd1amFyYXRpPTI3MjAsZS50dGhhZ3VybXVraGk9MjU5MixlLnR0dXJuZWQ9NjQ3LGUudHVoaXJhZ2FuYT0xMjM4OCxlLnR1a2F0YWthbmE9MTI0ODQsZS50dWthdGFrYW5haGFsZndpZHRoPTY1NDEwLGUudHVzbWFsbGhpcmFnYW5hPTEyMzg3LGUudHVzbWFsbGthdGFrYW5hPTEyNDgzLGUudHVzbWFsbGthdGFrYW5haGFsZndpZHRoPTY1MzkxLGUudHdlbHZlY2lyY2xlPTkzMjMsZS50d2VsdmVwYXJlbj05MzQzLGUudHdlbHZlcGVyaW9kPTkzNjMsZS50d2VsdmVyb21hbj04NTcxLGUudHdlbnR5Y2lyY2xlPTkzMzEsZS50d2VudHloYW5nemhvdT0yMTMxNixlLnR3ZW50eXBhcmVuPTkzNTEsZS50d2VudHlwZXJpb2Q9OTM3MSxlLnR3bz01MCxlLnR3b2FyYWJpYz0xNjM0LGUudHdvYmVuZ2FsaT0yNTM2LGUudHdvY2lyY2xlPTkzMTMsZS50d29jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTIzLGUudHdvZGV2YT0yNDA4LGUudHdvZG90ZW5sZWFkZXI9ODIyOSxlLnR3b2RvdGxlYWRlcj04MjI5LGUudHdvZG90bGVhZGVydmVydGljYWw9NjUwNzIsZS50d29ndWphcmF0aT0yNzkyLGUudHdvZ3VybXVraGk9MjY2NCxlLnR3b2hhY2thcmFiaWM9MTYzNCxlLnR3b2hhbmd6aG91PTEyMzIyLGUudHdvaWRlb2dyYXBoaWNwYXJlbj0xMjgzMyxlLnR3b2luZmVyaW9yPTgzMjIsZS50d29tb25vc3BhY2U9NjUyOTgsZS50d29udW1lcmF0b3JiZW5nYWxpPTI1NDksZS50d29vbGRzdHlsZT02MzI4MixlLnR3b3BhcmVuPTkzMzMsZS50d29wZXJpb2Q9OTM1MyxlLnR3b3BlcnNpYW49MTc3OCxlLnR3b3JvbWFuPTg1NjEsZS50d29zdHJva2U9NDQzLGUudHdvc3VwZXJpb3I9MTc4LGUudHdvdGhhaT0zNjY2LGUudHdvdGhpcmRzPTg1MzIsZS51PTExNyxlLnVhY3V0ZT0yNTAsZS51YmFyPTY0OSxlLnViZW5nYWxpPTI0NDEsZS51Ym9wb21vZm89MTI1ODQsZS51YnJldmU9MzY1LGUudWNhcm9uPTQ2OCxlLnVjaXJjbGU9OTQ0NCxlLnVjaXJjdW1mbGV4PTI1MSxlLnVjaXJjdW1mbGV4YmVsb3c9Nzc5OSxlLnVjeXJpbGxpYz0xMDkxLGUudWRhdHRhZGV2YT0yMzg1LGUudWRibGFjdXRlPTM2OSxlLnVkYmxncmF2ZT01MzMsZS51ZGV2YT0yMzEzLGUudWRpZXJlc2lzPTI1MixlLnVkaWVyZXNpc2FjdXRlPTQ3MixlLnVkaWVyZXNpc2JlbG93PTc3OTUsZS51ZGllcmVzaXNjYXJvbj00NzQsZS51ZGllcmVzaXNjeXJpbGxpYz0xMjY1LGUudWRpZXJlc2lzZ3JhdmU9NDc2LGUudWRpZXJlc2lzbWFjcm9uPTQ3MCxlLnVkb3RiZWxvdz03OTA5LGUudWdyYXZlPTI0OSxlLnVndWphcmF0aT0yNjk3LGUudWd1cm11a2hpPTI1NjksZS51aGlyYWdhbmE9MTIzNTgsZS51aG9va2Fib3ZlPTc5MTEsZS51aG9ybj00MzIsZS51aG9ybmFjdXRlPTc5MTMsZS51aG9ybmRvdGJlbG93PTc5MjEsZS51aG9ybmdyYXZlPTc5MTUsZS51aG9ybmhvb2thYm92ZT03OTE3LGUudWhvcm50aWxkZT03OTE5LGUudWh1bmdhcnVtbGF1dD0zNjksZS51aHVuZ2FydW1sYXV0Y3lyaWxsaWM9MTI2NyxlLnVpbnZlcnRlZGJyZXZlPTUzNSxlLnVrYXRha2FuYT0xMjQ1NCxlLnVrYXRha2FuYWhhbGZ3aWR0aD02NTM5NSxlLnVrY3lyaWxsaWM9MTE0NSxlLnVrb3JlYW49MTI2MzYsZS51bWFjcm9uPTM2MyxlLnVtYWNyb25jeXJpbGxpYz0xMjYzLGUudW1hY3JvbmRpZXJlc2lzPTc4MDMsZS51bWF0cmFndXJtdWtoaT0yNjI1LGUudW1vbm9zcGFjZT02NTM2NSxlLnVuZGVyc2NvcmU9OTUsZS51bmRlcnNjb3JlZGJsPTgyMTUsZS51bmRlcnNjb3JlbW9ub3NwYWNlPTY1MzQzLGUudW5kZXJzY29yZXZlcnRpY2FsPTY1MDc1LGUudW5kZXJzY29yZXdhdnk9NjUxMDMsZS51bmlvbj04NzQ2LGUudW5pdmVyc2FsPTg3MDQsZS51b2dvbmVrPTM3MSxlLnVwYXJlbj05MzkyLGUudXBibG9jaz05NjAwLGUudXBwZXJkb3RoZWJyZXc9MTQ3NixlLnVwc2lsb249OTY1LGUudXBzaWxvbmRpZXJlc2lzPTk3MSxlLnVwc2lsb25kaWVyZXNpc3Rvbm9zPTk0NCxlLnVwc2lsb25sYXRpbj02NTAsZS51cHNpbG9udG9ub3M9OTczLGUudXB0YWNrYmVsb3djbWI9Nzk3LGUudXB0YWNrbW9kPTcyNCxlLnVyYWd1cm11a2hpPTI2NzUsZS51cmluZz0zNjcsZS51c2hvcnRjeXJpbGxpYz0xMTE4LGUudXNtYWxsaGlyYWdhbmE9MTIzNTcsZS51c21hbGxrYXRha2FuYT0xMjQ1MyxlLnVzbWFsbGthdGFrYW5haGFsZndpZHRoPTY1Mzg1LGUudXN0cmFpZ2h0Y3lyaWxsaWM9MTE5OSxlLnVzdHJhaWdodHN0cm9rZWN5cmlsbGljPTEyMDEsZS51dGlsZGU9MzYxLGUudXRpbGRlYWN1dGU9NzgwMSxlLnV0aWxkZWJlbG93PTc3OTcsZS51dWJlbmdhbGk9MjQ0MixlLnV1ZGV2YT0yMzE0LGUudXVndWphcmF0aT0yNjk4LGUudXVndXJtdWtoaT0yNTcwLGUudXVtYXRyYWd1cm11a2hpPTI2MjYsZS51dXZvd2Vsc2lnbmJlbmdhbGk9MjQ5OCxlLnV1dm93ZWxzaWduZGV2YT0yMzcwLGUudXV2b3dlbHNpZ25ndWphcmF0aT0yNzU0LGUudXZvd2Vsc2lnbmJlbmdhbGk9MjQ5NyxlLnV2b3dlbHNpZ25kZXZhPTIzNjksZS51dm93ZWxzaWduZ3VqYXJhdGk9Mjc1MyxlLnY9MTE4LGUudmFkZXZhPTIzNTcsZS52YWd1amFyYXRpPTI3NDEsZS52YWd1cm11a2hpPTI2MTMsZS52YWthdGFrYW5hPTEyNTM1LGUudmF2PTE0OTMsZS52YXZkYWdlc2g9NjQzMDksZS52YXZkYWdlc2g2NT02NDMwOSxlLnZhdmRhZ2VzaGhlYnJldz02NDMwOSxlLnZhdmhlYnJldz0xNDkzLGUudmF2aG9sYW09NjQzMzEsZS52YXZob2xhbWhlYnJldz02NDMzMSxlLnZhdnZhdmhlYnJldz0xNTIwLGUudmF2eW9kaGVicmV3PTE1MjEsZS52Y2lyY2xlPTk0NDUsZS52ZG90YmVsb3c9NzgwNyxlLnZlY3lyaWxsaWM9MTA3NCxlLnZlaGFyYWJpYz0xNzAwLGUudmVoZmluYWxhcmFiaWM9NjQzNjMsZS52ZWhpbml0aWFsYXJhYmljPTY0MzY0LGUudmVobWVkaWFsYXJhYmljPTY0MzY1LGUudmVrYXRha2FuYT0xMjUzNyxlLnZlbnVzPTk3OTIsZS52ZXJ0aWNhbGJhcj0xMjQsZS52ZXJ0aWNhbGxpbmVhYm92ZWNtYj03ODEsZS52ZXJ0aWNhbGxpbmViZWxvd2NtYj04MDksZS52ZXJ0aWNhbGxpbmVsb3dtb2Q9NzE2LGUudmVydGljYWxsaW5lbW9kPTcxMixlLnZld2FybWVuaWFuPTE0MDYsZS52aG9vaz02NTEsZS52aWthdGFrYW5hPTEyNTM2LGUudmlyYW1hYmVuZ2FsaT0yNTA5LGUudmlyYW1hZGV2YT0yMzgxLGUudmlyYW1hZ3VqYXJhdGk9Mjc2NSxlLnZpc2FyZ2FiZW5nYWxpPTI0MzUsZS52aXNhcmdhZGV2YT0yMzA3LGUudmlzYXJnYWd1amFyYXRpPTI2OTEsZS52bW9ub3NwYWNlPTY1MzY2LGUudm9hcm1lbmlhbj0xNDAwLGUudm9pY2VkaXRlcmF0aW9uaGlyYWdhbmE9MTI0NDYsZS52b2ljZWRpdGVyYXRpb25rYXRha2FuYT0xMjU0MixlLnZvaWNlZG1hcmtrYW5hPTEyNDQzLGUudm9pY2VkbWFya2thbmFoYWxmd2lkdGg9NjU0MzgsZS52b2thdGFrYW5hPTEyNTM4LGUudnBhcmVuPTkzOTMsZS52dGlsZGU9NzgwNSxlLnZ0dXJuZWQ9NjUyLGUudnVoaXJhZ2FuYT0xMjQzNixlLnZ1a2F0YWthbmE9MTI1MzIsZS53PTExOSxlLndhY3V0ZT03ODExLGUud2Fla29yZWFuPTEyNjMzLGUud2FoaXJhZ2FuYT0xMjQzMSxlLndha2F0YWthbmE9MTI1MjcsZS53YWthdGFrYW5haGFsZndpZHRoPTY1NDM2LGUud2Frb3JlYW49MTI2MzIsZS53YXNtYWxsaGlyYWdhbmE9MTI0MzAsZS53YXNtYWxsa2F0YWthbmE9MTI1MjYsZS53YXR0b3NxdWFyZT0xMzE0MyxlLndhdmVkYXNoPTEyMzE2LGUud2F2eXVuZGVyc2NvcmV2ZXJ0aWNhbD02NTA3NixlLndhd2FyYWJpYz0xNjA4LGUud2F3ZmluYWxhcmFiaWM9NjUyNjIsZS53YXdoYW16YWFib3ZlYXJhYmljPTE1NzIsZS53YXdoYW16YWFib3ZlZmluYWxhcmFiaWM9NjUxNTgsZS53YnNxdWFyZT0xMzI3NyxlLndjaXJjbGU9OTQ0NixlLndjaXJjdW1mbGV4PTM3MyxlLndkaWVyZXNpcz03ODEzLGUud2RvdGFjY2VudD03ODE1LGUud2RvdGJlbG93PTc4MTcsZS53ZWhpcmFnYW5hPTEyNDMzLGUud2VpZXJzdHJhc3M9ODQ3MixlLndla2F0YWthbmE9MTI1MjksZS53ZWtvcmVhbj0xMjYzOCxlLndlb2tvcmVhbj0xMjYzNyxlLndncmF2ZT03ODA5LGUud2hpdGVidWxsZXQ9OTcwMixlLndoaXRlY2lyY2xlPTk2NzUsZS53aGl0ZWNpcmNsZWludmVyc2U9OTY4OSxlLndoaXRlY29ybmVyYnJhY2tldGxlZnQ9MTIzMDIsZS53aGl0ZWNvcm5lcmJyYWNrZXRsZWZ0dmVydGljYWw9NjUwOTEsZS53aGl0ZWNvcm5lcmJyYWNrZXRyaWdodD0xMjMwMyxlLndoaXRlY29ybmVyYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwOTIsZS53aGl0ZWRpYW1vbmQ9OTY3MSxlLndoaXRlZGlhbW9uZGNvbnRhaW5pbmdibGFja3NtYWxsZGlhbW9uZD05NjcyLGUud2hpdGVkb3ducG9pbnRpbmdzbWFsbHRyaWFuZ2xlPTk2NjM7ZS53aGl0ZWRvd25wb2ludGluZ3RyaWFuZ2xlPTk2NjEsZS53aGl0ZWxlZnRwb2ludGluZ3NtYWxsdHJpYW5nbGU9OTY2NyxlLndoaXRlbGVmdHBvaW50aW5ndHJpYW5nbGU9OTY2NSxlLndoaXRlbGVudGljdWxhcmJyYWNrZXRsZWZ0PTEyMzEwLGUud2hpdGVsZW50aWN1bGFyYnJhY2tldHJpZ2h0PTEyMzExLGUud2hpdGVyaWdodHBvaW50aW5nc21hbGx0cmlhbmdsZT05NjU3LGUud2hpdGVyaWdodHBvaW50aW5ndHJpYW5nbGU9OTY1NSxlLndoaXRlc21hbGxzcXVhcmU9OTY0MyxlLndoaXRlc21pbGluZ2ZhY2U9OTc4NixlLndoaXRlc3F1YXJlPTk2MzMsZS53aGl0ZXN0YXI9OTczNCxlLndoaXRldGVsZXBob25lPTk3NDMsZS53aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0bGVmdD0xMjMxMixlLndoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodD0xMjMxMyxlLndoaXRldXBwb2ludGluZ3NtYWxsdHJpYW5nbGU9OTY1MyxlLndoaXRldXBwb2ludGluZ3RyaWFuZ2xlPTk2NTEsZS53aWhpcmFnYW5hPTEyNDMyLGUud2lrYXRha2FuYT0xMjUyOCxlLndpa29yZWFuPTEyNjM5LGUud21vbm9zcGFjZT02NTM2NyxlLndvaGlyYWdhbmE9MTI0MzQsZS53b2thdGFrYW5hPTEyNTMwLGUud29rYXRha2FuYWhhbGZ3aWR0aD02NTM4MixlLndvbj04MzYxLGUud29ubW9ub3NwYWNlPTY1NTEwLGUud293YWVudGhhaT0zNjIzLGUud3BhcmVuPTkzOTQsZS53cmluZz03ODMyLGUud3N1cGVyaW9yPTY5NSxlLnd0dXJuZWQ9NjUzLGUud3lubj00NDcsZS54PTEyMCxlLnhhYm92ZWNtYj04MjksZS54Ym9wb21vZm89MTI1NjIsZS54Y2lyY2xlPTk0NDcsZS54ZGllcmVzaXM9NzgyMSxlLnhkb3RhY2NlbnQ9NzgxOSxlLnhlaGFybWVuaWFuPTEzODksZS54aT05NTgsZS54bW9ub3NwYWNlPTY1MzY4LGUueHBhcmVuPTkzOTUsZS54c3VwZXJpb3I9NzM5LGUueT0xMjEsZS55YWFkb3NxdWFyZT0xMzEzNCxlLnlhYmVuZ2FsaT0yNDc5LGUueWFjdXRlPTI1MyxlLnlhZGV2YT0yMzUxLGUueWFla29yZWFuPTEyNjI2LGUueWFndWphcmF0aT0yNzM1LGUueWFndXJtdWtoaT0yNjA3LGUueWFoaXJhZ2FuYT0xMjQyMCxlLnlha2F0YWthbmE9MTI1MTYsZS55YWthdGFrYW5haGFsZndpZHRoPTY1NDI4LGUueWFrb3JlYW49MTI2MjUsZS55YW1ha2thbnRoYWk9MzY2MixlLnlhc21hbGxoaXJhZ2FuYT0xMjQxOSxlLnlhc21hbGxrYXRha2FuYT0xMjUxNSxlLnlhc21hbGxrYXRha2FuYWhhbGZ3aWR0aD02NTM4OCxlLnlhdGN5cmlsbGljPTExMjMsZS55Y2lyY2xlPTk0NDgsZS55Y2lyY3VtZmxleD0zNzUsZS55ZGllcmVzaXM9MjU1LGUueWRvdGFjY2VudD03ODIzLGUueWRvdGJlbG93PTc5MjUsZS55ZWhhcmFiaWM9MTYxMCxlLnllaGJhcnJlZWFyYWJpYz0xNzQ2LGUueWVoYmFycmVlZmluYWxhcmFiaWM9NjQ0MzEsZS55ZWhmaW5hbGFyYWJpYz02NTI2NixlLnllaGhhbXphYWJvdmVhcmFiaWM9MTU3NCxlLnllaGhhbXphYWJvdmVmaW5hbGFyYWJpYz02NTE2MixlLnllaGhhbXphYWJvdmVpbml0aWFsYXJhYmljPTY1MTYzLGUueWVoaGFtemFhYm92ZW1lZGlhbGFyYWJpYz02NTE2NCxlLnllaGluaXRpYWxhcmFiaWM9NjUyNjcsZS55ZWhtZWRpYWxhcmFiaWM9NjUyNjgsZS55ZWhtZWVtaW5pdGlhbGFyYWJpYz02NDczMyxlLnllaG1lZW1pc29sYXRlZGFyYWJpYz02NDYwMCxlLnllaG5vb25maW5hbGFyYWJpYz02NDY2MCxlLnllaHRocmVlZG90c2JlbG93YXJhYmljPTE3NDUsZS55ZWtvcmVhbj0xMjYzMCxlLnllbj0xNjUsZS55ZW5tb25vc3BhY2U9NjU1MDksZS55ZW9rb3JlYW49MTI2MjksZS55ZW9yaW5oaWV1aGtvcmVhbj0xMjY3OCxlLnllcmFoYmVueW9tb2hlYnJldz0xNDUwLGUueWVyYWhiZW55b21vbGVmdGhlYnJldz0xNDUwLGUueWVyaWN5cmlsbGljPTEwOTksZS55ZXJ1ZGllcmVzaXNjeXJpbGxpYz0xMjczLGUueWVzaWV1bmdrb3JlYW49MTI2NzMsZS55ZXNpZXVuZ3BhbnNpb3Nrb3JlYW49MTI2NzUsZS55ZXNpZXVuZ3Npb3Nrb3JlYW49MTI2NzQsZS55ZXRpdmhlYnJldz0xNDM0LGUueWdyYXZlPTc5MjMsZS55aG9vaz00MzYsZS55aG9va2Fib3ZlPTc5MjcsZS55aWFybWVuaWFuPTEzOTcsZS55aWN5cmlsbGljPTExMTEsZS55aWtvcmVhbj0xMjY0MixlLnlpbnlhbmc9OTc3NSxlLnlpd25hcm1lbmlhbj0xNDEwLGUueW1vbm9zcGFjZT02NTM2OSxlLnlvZD0xNDk3LGUueW9kZGFnZXNoPTY0MzEzLGUueW9kZGFnZXNoaGVicmV3PTY0MzEzLGUueW9kaGVicmV3PTE0OTcsZS55b2R5b2RoZWJyZXc9MTUyMixlLnlvZHlvZHBhdGFoaGVicmV3PTY0Mjg3LGUueW9oaXJhZ2FuYT0xMjQyNCxlLnlvaWtvcmVhbj0xMjY4MSxlLnlva2F0YWthbmE9MTI1MjAsZS55b2thdGFrYW5haGFsZndpZHRoPTY1NDMwLGUueW9rb3JlYW49MTI2MzUsZS55b3NtYWxsaGlyYWdhbmE9MTI0MjMsZS55b3NtYWxsa2F0YWthbmE9MTI1MTksZS55b3NtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzOTAsZS55b3RncmVlaz0xMDExLGUueW95YWVrb3JlYW49MTI2ODAsZS55b3lha29yZWFuPTEyNjc5LGUueW95YWt0aGFpPTM2MTgsZS55b3lpbmd0aGFpPTM1OTcsZS55cGFyZW49OTM5NixlLnlwb2dlZ3JhbW1lbmk9ODkwLGUueXBvZ2VncmFtbWVuaWdyZWVrY21iPTgzNyxlLnlyPTQyMixlLnlyaW5nPTc4MzMsZS55c3VwZXJpb3I9Njk2LGUueXRpbGRlPTc5MjksZS55dHVybmVkPTY1NCxlLnl1aGlyYWdhbmE9MTI0MjIsZS55dWlrb3JlYW49MTI2ODQsZS55dWthdGFrYW5hPTEyNTE4LGUueXVrYXRha2FuYWhhbGZ3aWR0aD02NTQyOSxlLnl1a29yZWFuPTEyNjQwLGUueXVzYmlnY3lyaWxsaWM9MTEzMSxlLnl1c2JpZ2lvdGlmaWVkY3lyaWxsaWM9MTEzMyxlLnl1c2xpdHRsZWN5cmlsbGljPTExMjcsZS55dXNsaXR0bGVpb3RpZmllZGN5cmlsbGljPTExMjksZS55dXNtYWxsaGlyYWdhbmE9MTI0MjEsZS55dXNtYWxsa2F0YWthbmE9MTI1MTcsZS55dXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODksZS55dXlla29yZWFuPTEyNjgzLGUueXV5ZW9rb3JlYW49MTI2ODIsZS55eWFiZW5nYWxpPTI1MjcsZS55eWFkZXZhPTIzOTksZS56PTEyMixlLnphYXJtZW5pYW49MTM4MixlLnphY3V0ZT0zNzgsZS56YWRldmE9MjM5NSxlLnphZ3VybXVraGk9MjY1MSxlLnphaGFyYWJpYz0xNTkyLGUuemFoZmluYWxhcmFiaWM9NjUyMjIsZS56YWhpbml0aWFsYXJhYmljPTY1MjIzLGUuemFoaXJhZ2FuYT0xMjM3NCxlLnphaG1lZGlhbGFyYWJpYz02NTIyNCxlLnphaW5hcmFiaWM9MTU4NixlLnphaW5maW5hbGFyYWJpYz02NTIwMCxlLnpha2F0YWthbmE9MTI0NzAsZS56YXFlZmdhZG9saGVicmV3PTE0MjksZS56YXFlZnFhdGFuaGVicmV3PTE0MjgsZS56YXJxYWhlYnJldz0xNDMyLGUuemF5aW49MTQ5NCxlLnpheWluZGFnZXNoPTY0MzEwLGUuemF5aW5kYWdlc2hoZWJyZXc9NjQzMTAsZS56YXlpbmhlYnJldz0xNDk0LGUuemJvcG9tb2ZvPTEyNTY3LGUuemNhcm9uPTM4MixlLnpjaXJjbGU9OTQ0OSxlLnpjaXJjdW1mbGV4PTc4MjUsZS56Y3VybD02NTcsZS56ZG90PTM4MCxlLnpkb3RhY2NlbnQ9MzgwLGUuemRvdGJlbG93PTc4MjcsZS56ZWN5cmlsbGljPTEwNzksZS56ZWRlc2NlbmRlcmN5cmlsbGljPTExNzcsZS56ZWRpZXJlc2lzY3lyaWxsaWM9MTI0NyxlLnplaGlyYWdhbmE9MTIzODAsZS56ZWthdGFrYW5hPTEyNDc2LGUuemVybz00OCxlLnplcm9hcmFiaWM9MTYzMixlLnplcm9iZW5nYWxpPTI1MzQsZS56ZXJvZGV2YT0yNDA2LGUuemVyb2d1amFyYXRpPTI3OTAsZS56ZXJvZ3VybXVraGk9MjY2MixlLnplcm9oYWNrYXJhYmljPTE2MzIsZS56ZXJvaW5mZXJpb3I9ODMyMCxlLnplcm9tb25vc3BhY2U9NjUyOTYsZS56ZXJvb2xkc3R5bGU9NjMyODAsZS56ZXJvcGVyc2lhbj0xNzc2LGUuemVyb3N1cGVyaW9yPTgzMDQsZS56ZXJvdGhhaT0zNjY0LGUuemVyb3dpZHRoam9pbmVyPTY1Mjc5LGUuemVyb3dpZHRobm9uam9pbmVyPTgyMDQsZS56ZXJvd2lkdGhzcGFjZT04MjAzLGUuemV0YT05NTAsZS56aGJvcG9tb2ZvPTEyNTYzLGUuemhlYXJtZW5pYW49MTM4NixlLnpoZWJyZXZlY3lyaWxsaWM9MTIxOCxlLnpoZWN5cmlsbGljPTEwNzgsZS56aGVkZXNjZW5kZXJjeXJpbGxpYz0xMTc1LGUuemhlZGllcmVzaXNjeXJpbGxpYz0xMjQ1LGUuemloaXJhZ2FuYT0xMjM3NixlLnppa2F0YWthbmE9MTI0NzIsZS56aW5vcmhlYnJldz0xNDU0LGUuemxpbmViZWxvdz03ODI5LGUuem1vbm9zcGFjZT02NTM3MCxlLnpvaGlyYWdhbmE9MTIzODIsZS56b2thdGFrYW5hPTEyNDc4LGUuenBhcmVuPTkzOTcsZS56cmV0cm9mbGV4aG9vaz02NTYsZS56c3Ryb2tlPTQzOCxlLnp1aGlyYWdhbmE9MTIzNzgsZS56dWthdGFrYW5hPTEyNDc0LGVbIi5ub3RkZWYiXT0wLGUuYW5nYnJhY2tldGxlZnRiaWc9OTAwMSxlLmFuZ2JyYWNrZXRsZWZ0QmlnPTkwMDEsZS5hbmdicmFja2V0bGVmdGJpZ2c9OTAwMSxlLmFuZ2JyYWNrZXRsZWZ0QmlnZz05MDAxLGUuYW5nYnJhY2tldHJpZ2h0QmlnPTkwMDIsZS5hbmdicmFja2V0cmlnaHRiaWc9OTAwMixlLmFuZ2JyYWNrZXRyaWdodEJpZ2c9OTAwMixlLmFuZ2JyYWNrZXRyaWdodGJpZ2c9OTAwMixlLmFycm93aG9va2xlZnQ9ODYxOCxlLmFycm93aG9va3JpZ2h0PTg2MTcsZS5hcnJvd2xlZnR0b3BoYWxmPTg2MzYsZS5hcnJvd2xlZnRib3RoYWxmPTg2MzcsZS5hcnJvd25vcnRoZWFzdD04NTk5LGUuYXJyb3dub3J0aHdlc3Q9ODU5OCxlLmFycm93cmlnaHR0b3BoYWxmPTg2NDAsZS5hcnJvd3JpZ2h0Ym90aGFsZj04NjQxLGUuYXJyb3dzb3V0aGVhc3Q9ODYwMCxlLmFycm93c291dGh3ZXN0PTg2MDEsZS5iYWNrc2xhc2hiaWc9ODcyNixlLmJhY2tzbGFzaEJpZz04NzI2LGUuYmFja3NsYXNoQmlnZz04NzI2LGUuYmFja3NsYXNoYmlnZz04NzI2LGUuYmFyZGJsPTgyMTQsZS5icmFjZWh0aXBkb3dubGVmdD02NTA3OSxlLmJyYWNlaHRpcGRvd25yaWdodD02NTA3OSxlLmJyYWNlaHRpcHVwbGVmdD02NTA4MCxlLmJyYWNlaHRpcHVwcmlnaHQ9NjUwODAsZS5icmFjZWxlZnRCaWc9MTIzLGUuYnJhY2VsZWZ0YmlnPTEyMyxlLmJyYWNlbGVmdGJpZ2c9MTIzLGUuYnJhY2VsZWZ0QmlnZz0xMjMsZS5icmFjZXJpZ2h0QmlnPTEyNSxlLmJyYWNlcmlnaHRiaWc9MTI1LGUuYnJhY2VyaWdodGJpZ2c9MTI1LGUuYnJhY2VyaWdodEJpZ2c9MTI1LGUuYnJhY2tldGxlZnRiaWc9OTEsZS5icmFja2V0bGVmdEJpZz05MSxlLmJyYWNrZXRsZWZ0YmlnZz05MSxlLmJyYWNrZXRsZWZ0QmlnZz05MSxlLmJyYWNrZXRyaWdodEJpZz05MyxlLmJyYWNrZXRyaWdodGJpZz05MyxlLmJyYWNrZXRyaWdodGJpZ2c9OTMsZS5icmFja2V0cmlnaHRCaWdnPTkzLGUuY2VpbGluZ2xlZnRiaWc9ODk2OCxlLmNlaWxpbmdsZWZ0QmlnPTg5NjgsZS5jZWlsaW5nbGVmdEJpZ2c9ODk2OCxlLmNlaWxpbmdsZWZ0YmlnZz04OTY4LGUuY2VpbGluZ3JpZ2h0YmlnPTg5NjksZS5jZWlsaW5ncmlnaHRCaWc9ODk2OSxlLmNlaWxpbmdyaWdodGJpZ2c9ODk2OSxlLmNlaWxpbmdyaWdodEJpZ2c9ODk2OSxlLmNpcmNsZWRvdGRpc3BsYXk9ODg1NyxlLmNpcmNsZWRvdHRleHQ9ODg1NyxlLmNpcmNsZW11bHRpcGx5ZGlzcGxheT04ODU1LGUuY2lyY2xlbXVsdGlwbHl0ZXh0PTg4NTUsZS5jaXJjbGVwbHVzZGlzcGxheT04ODUzLGUuY2lyY2xlcGx1c3RleHQ9ODg1MyxlLmNvbnRpbnRlZ3JhbGRpc3BsYXk9ODc1MCxlLmNvbnRpbnRlZ3JhbHRleHQ9ODc1MCxlLmNvcHJvZHVjdGRpc3BsYXk9ODcyMCxlLmNvcHJvZHVjdHRleHQ9ODcyMCxlLmZsb29ybGVmdEJpZz04OTcwLGUuZmxvb3JsZWZ0YmlnPTg5NzAsZS5mbG9vcmxlZnRiaWdnPTg5NzAsZS5mbG9vcmxlZnRCaWdnPTg5NzAsZS5mbG9vcnJpZ2h0YmlnPTg5NzEsZS5mbG9vcnJpZ2h0QmlnPTg5NzEsZS5mbG9vcnJpZ2h0QmlnZz04OTcxLGUuZmxvb3JyaWdodGJpZ2c9ODk3MSxlLmhhdHdpZGU9NzcwLGUuaGF0d2lkZXI9NzcwLGUuaGF0d2lkZXN0PTc3MCxlLmludGVyY2FsPTc0ODgsZS5pbnRlZ3JhbGRpc3BsYXk9ODc0NyxlLmludGVncmFsdGV4dD04NzQ3LGUuaW50ZXJzZWN0aW9uZGlzcGxheT04ODk4LGUuaW50ZXJzZWN0aW9udGV4dD04ODk4LGUubG9naWNhbGFuZGRpc3BsYXk9ODc0MyxlLmxvZ2ljYWxhbmR0ZXh0PTg3NDMsZS5sb2dpY2Fsb3JkaXNwbGF5PTg3NDQsZS5sb2dpY2Fsb3J0ZXh0PTg3NDQsZS5wYXJlbmxlZnRCaWc9NDAsZS5wYXJlbmxlZnRiaWc9NDAsZS5wYXJlbmxlZnRCaWdnPTQwLGUucGFyZW5sZWZ0YmlnZz00MCxlLnBhcmVucmlnaHRCaWc9NDEsZS5wYXJlbnJpZ2h0YmlnPTQxLGUucGFyZW5yaWdodEJpZ2c9NDEsZS5wYXJlbnJpZ2h0YmlnZz00MSxlLnByaW1lPTgyNDIsZS5wcm9kdWN0ZGlzcGxheT04NzE5LGUucHJvZHVjdHRleHQ9ODcxOSxlLnJhZGljYWxiaWc9ODczMCxlLnJhZGljYWxCaWc9ODczMCxlLnJhZGljYWxCaWdnPTg3MzAsZS5yYWRpY2FsYmlnZz04NzMwLGUucmFkaWNhbGJ0PTg3MzAsZS5yYWRpY2FsdHA9ODczMCxlLnJhZGljYWx2ZXJ0ZXg9ODczMCxlLnNsYXNoYmlnPTQ3LGUuc2xhc2hCaWc9NDcsZS5zbGFzaEJpZ2c9NDcsZS5zbGFzaGJpZ2c9NDcsZS5zdW1tYXRpb25kaXNwbGF5PTg3MjEsZS5zdW1tYXRpb250ZXh0PTg3MjEsZS50aWxkZXdpZGU9NzMyLGUudGlsZGV3aWRlcj03MzIsZS50aWxkZXdpZGVzdD03MzIsZS51bmlvbmRpc3BsYXk9ODg5OSxlLnVuaW9ubXVsdGlkaXNwbGF5PTg4NDYsZS51bmlvbm11bHRpdGV4dD04ODQ2LGUudW5pb25zcWRpc3BsYXk9ODg1MixlLnVuaW9uc3F0ZXh0PTg4NTIsZS51bmlvbnRleHQ9ODg5OSxlLnZleHRlbmRkb3VibGU9ODc0MSxlLnZleHRlbmRzaW5nbGU9ODczOX0pKSxpPSgwLG4uZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5zcGFjZT0zMixlLmExPTk5ODUsZS5hMj05OTg2LGUuYTIwMj05OTg3LGUuYTM9OTk4OCxlLmE0PTk3NDIsZS5hNT05OTkwLGUuYTExOT05OTkxLGUuYTExOD05OTkyLGUuYTExNz05OTkzLGUuYTExPTk3NTUsZS5hMTI9OTc1OCxlLmExMz05OTk2LGUuYTE0PTk5OTcsZS5hMTU9OTk5OCxlLmExNj05OTk5LGUuYTEwNT0xZTQsZS5hMTc9MTAwMDEsZS5hMTg9MTAwMDIsZS5hMTk9MTAwMDMsZS5hMjA9MTAwMDQsZS5hMjE9MTAwMDUsZS5hMjI9MTAwMDYsZS5hMjM9MTAwMDcsZS5hMjQ9MTAwMDgsZS5hMjU9MTAwMDksZS5hMjY9MTAwMTAsZS5hMjc9MTAwMTEsZS5hMjg9MTAwMTIsZS5hNj0xMDAxMyxlLmE3PTEwMDE0LGUuYTg9MTAwMTUsZS5hOT0xMDAxNixlLmExMD0xMDAxNyxlLmEyOT0xMDAxOCxlLmEzMD0xMDAxOSxlLmEzMT0xMDAyMCxlLmEzMj0xMDAyMSxlLmEzMz0xMDAyMixlLmEzND0xMDAyMyxlLmEzNT05NzMzLGUuYTM2PTEwMDI1LGUuYTM3PTEwMDI2LGUuYTM4PTEwMDI3LGUuYTM5PTEwMDI4LGUuYTQwPTEwMDI5LGUuYTQxPTEwMDMwLGUuYTQyPTEwMDMxLGUuYTQzPTEwMDMyLGUuYTQ0PTEwMDMzLGUuYTQ1PTEwMDM0LGUuYTQ2PTEwMDM1LGUuYTQ3PTEwMDM2LGUuYTQ4PTEwMDM3LGUuYTQ5PTEwMDM4LGUuYTUwPTEwMDM5LGUuYTUxPTEwMDQwLGUuYTUyPTEwMDQxLGUuYTUzPTEwMDQyLGUuYTU0PTEwMDQzLGUuYTU1PTEwMDQ0LGUuYTU2PTEwMDQ1LGUuYTU3PTEwMDQ2LGUuYTU4PTEwMDQ3LGUuYTU5PTEwMDQ4LGUuYTYwPTEwMDQ5LGUuYTYxPTEwMDUwLGUuYTYyPTEwMDUxLGUuYTYzPTEwMDUyLGUuYTY0PTEwMDUzLGUuYTY1PTEwMDU0LGUuYTY2PTEwMDU1LGUuYTY3PTEwMDU2LGUuYTY4PTEwMDU3LGUuYTY5PTEwMDU4LGUuYTcwPTEwMDU5LGUuYTcxPTk2NzksZS5hNzI9MTAwNjEsZS5hNzM9OTYzMixlLmE3ND0xMDA2MyxlLmEyMDM9MTAwNjQsZS5hNzU9MTAwNjUsZS5hMjA0PTEwMDY2LGUuYTc2PTk2NTAsZS5hNzc9OTY2MCxlLmE3OD05NjcwLGUuYTc5PTEwMDcwLGUuYTgxPTk2ODcsZS5hODI9MTAwNzIsZS5hODM9MTAwNzMsZS5hODQ9MTAwNzQsZS5hOTc9MTAwNzUsZS5hOTg9MTAwNzYsZS5hOTk9MTAwNzcsZS5hMTAwPTEwMDc4LGUuYTEwMT0xMDA4MSxlLmExMDI9MTAwODIsZS5hMTAzPTEwMDgzLGUuYTEwND0xMDA4NCxlLmExMDY9MTAwODUsZS5hMTA3PTEwMDg2LGUuYTEwOD0xMDA4NyxlLmExMTI9OTgyNyxlLmExMTE9OTgzMCxlLmExMTA9OTgyOSxlLmExMDk9OTgyNCxlLmExMjA9OTMxMixlLmExMjE9OTMxMyxlLmExMjI9OTMxNCxlLmExMjM9OTMxNSxlLmExMjQ9OTMxNixlLmExMjU9OTMxNyxlLmExMjY9OTMxOCxlLmExMjc9OTMxOSxlLmExMjg9OTMyMCxlLmExMjk9OTMyMSxlLmExMzA9MTAxMDIsZS5hMTMxPTEwMTAzLGUuYTEzMj0xMDEwNCxlLmExMzM9MTAxMDUsZS5hMTM0PTEwMTA2LGUuYTEzNT0xMDEwNyxlLmExMzY9MTAxMDgsZS5hMTM3PTEwMTA5LGUuYTEzOD0xMDExMCxlLmExMzk9MTAxMTEsZS5hMTQwPTEwMTEyLGUuYTE0MT0xMDExMyxlLmExNDI9MTAxMTQsZS5hMTQzPTEwMTE1LGUuYTE0ND0xMDExNixlLmExNDU9MTAxMTcsZS5hMTQ2PTEwMTE4LGUuYTE0Nz0xMDExOSxlLmExNDg9MTAxMjAsZS5hMTQ5PTEwMTIxLGUuYTE1MD0xMDEyMixlLmExNTE9MTAxMjMsZS5hMTUyPTEwMTI0LGUuYTE1Mz0xMDEyNSxlLmExNTQ9MTAxMjYsZS5hMTU1PTEwMTI3LGUuYTE1Nj0xMDEyOCxlLmExNTc9MTAxMjksZS5hMTU4PTEwMTMwLGUuYTE1OT0xMDEzMSxlLmExNjA9MTAxMzIsZS5hMTYxPTg1OTQsZS5hMTYzPTg1OTYsZS5hMTY0PTg1OTcsZS5hMTk2PTEwMTM2LGUuYTE2NT0xMDEzNyxlLmExOTI9MTAxMzgsZS5hMTY2PTEwMTM5LGUuYTE2Nz0xMDE0MCxlLmExNjg9MTAxNDEsZS5hMTY5PTEwMTQyLGUuYTE3MD0xMDE0MyxlLmExNzE9MTAxNDQsZS5hMTcyPTEwMTQ1LGUuYTE3Mz0xMDE0NixlLmExNjI9MTAxNDcsZS5hMTc0PTEwMTQ4LGUuYTE3NT0xMDE0OSxlLmExNzY9MTAxNTAsZS5hMTc3PTEwMTUxLGUuYTE3OD0xMDE1MixlLmExNzk9MTAxNTMsZS5hMTkzPTEwMTU0LGUuYTE4MD0xMDE1NSxlLmExOTk9MTAxNTYsZS5hMTgxPTEwMTU3LGUuYTIwMD0xMDE1OCxlLmExODI9MTAxNTksZS5hMjAxPTEwMTYxLGUuYTE4Mz0xMDE2MixlLmExODQ9MTAxNjMsZS5hMTk3PTEwMTY0LGUuYTE4NT0xMDE2NSxlLmExOTQ9MTAxNjYsZS5hMTk4PTEwMTY3LGUuYTE4Nj0xMDE2OCxlLmExOTU9MTAxNjksZS5hMTg3PTEwMTcwLGUuYTE4OD0xMDE3MSxlLmExODk9MTAxNzIsZS5hMTkwPTEwMTczLGUuYTE5MT0xMDE3NCxlLmE4OT0xMDA4OCxlLmE5MD0xMDA4OSxlLmE5Mz0xMDA5MCxlLmE5ND0xMDA5MSxlLmE5MT0xMDA5MixlLmE5Mj0xMDA5MyxlLmEyMDU9MTAwOTQsZS5hODU9MTAwOTUsZS5hMjA2PTEwMDk2LGUuYTg2PTEwMDk3LGUuYTg3PTEwMDk4LGUuYTg4PTEwMDk5LGUuYTk1PTEwMTAwLGUuYTk2PTEwMTAxLGVbIi5ub3RkZWYiXT0wfSkpfSwoZSx0LHIpPT57ci5yKHQpLHIuZCh0LHtjbGVhclVuaWNvZGVDYWNoZXM6KCk9PnUsZ2V0Q2hhclVuaWNvZGVDYXRlZ29yeTooKT0+aCxnZXRVbmljb2RlRm9yR2x5cGg6KCk9PmksZ2V0VW5pY29kZVJhbmdlRm9yOigpPT5vLG1hcFNwZWNpYWxVbmljb2RlVmFsdWVzOigpPT5hfSk7Y29uc3Qgbj0oMCxyKDE0OSkuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZVs2MzcyMV09MTY5LGVbNjMxOTNdPTE2OSxlWzYzNzIwXT0xNzQsZVs2MzE5NF09MTc0LGVbNjM3MjJdPTg0ODIsZVs2MzE5NV09ODQ4MixlWzYzNzI5XT05MTI3LGVbNjM3MzBdPTkxMjgsZVs2MzczMV09OTEyOSxlWzYzNzQwXT05MTMxLGVbNjM3NDFdPTkxMzIsZVs2Mzc0Ml09OTEzMyxlWzYzNzI2XT05MTIxLGVbNjM3MjddPTkxMjIsZVs2MzcyOF09OTEyMyxlWzYzNzM3XT05MTI0LGVbNjM3MzhdPTkxMjUsZVs2MzczOV09OTEyNixlWzYzNzIzXT05MTE1LGVbNjM3MjRdPTkxMTYsZVs2MzcyNV09OTExNyxlWzYzNzM0XT05MTE4LGVbNjM3MzVdPTkxMTksZVs2MzczNl09OTEyMH0pKTtmdW5jdGlvbiBhKGUpe3JldHVybiBlPj02NTUyMCYmZTw9NjU1MzU/MDplPj02Mjk3NiYmZTw9NjM3NDM/bigpW2VdfHxlOjE3Mz09PWU/NDU6ZX1mdW5jdGlvbiBpKGUsdCl7bGV0IHI9dFtlXTtpZih2b2lkIDAhPT1yKXJldHVybiByO2lmKCFlKXJldHVybi0xO2lmKCJ1Ij09PWVbMF0pe2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IG47aWYoNz09PXQmJiJuIj09PWVbMV0mJiJpIj09PWVbMl0pbj1lLnN1YnN0cmluZygzKTtlbHNle2lmKCEodD49NSYmdDw9NykpcmV0dXJuLTE7bj1lLnN1YnN0cmluZygxKX1pZihuPT09bi50b1VwcGVyQ2FzZSgpJiYocj1wYXJzZUludChuLDE2KSxyPj0wKSlyZXR1cm4gcn1yZXR1cm4tMX1jb25zdCBzPVtbMCwxMjddLFsxMjgsMjU1XSxbMjU2LDM4M10sWzM4NCw1OTFdLFs1OTIsNjg3LDc0MjQsNzU1MSw3NTUyLDc2MTVdLFs2ODgsNzY3LDQyNzUyLDQyNzgzXSxbNzY4LDg3OSw3NjE2LDc2NzldLFs4ODAsMTAyM10sWzExMzkyLDExNTE5XSxbMTAyNCwxMjc5LDEyODAsMTMyNywxMTc0NCwxMTc3NSw0MjU2MCw0MjY1NV0sWzEzMjgsMTQyM10sWzE0MjQsMTUzNV0sWzQyMjQwLDQyNTU5XSxbMTUzNiwxNzkxLDE4NzIsMTkxOV0sWzE5ODQsMjA0N10sWzIzMDQsMjQzMV0sWzI0MzIsMjU1OV0sWzI1NjAsMjY4N10sWzI2ODgsMjgxNV0sWzI4MTYsMjk0M10sWzI5NDQsMzA3MV0sWzMwNzIsMzE5OV0sWzMyMDAsMzMyN10sWzMzMjgsMzQ1NV0sWzM1ODQsMzcxMV0sWzM3MTIsMzgzOV0sWzQyNTYsNDM1MSwxMTUyMCwxMTU2N10sWzY5MTIsNzAzOV0sWzQzNTIsNDYwN10sWzc2ODAsNzkzNSwxMTM2MCwxMTM5MSw0Mjc4NCw0MzAwN10sWzc5MzYsODE5MV0sWzgxOTIsODMwMywxMTc3NiwxMTkwM10sWzgzMDQsODM1MV0sWzgzNTIsODM5OV0sWzg0MDAsODQ0N10sWzg0NDgsODUyN10sWzg1MjgsODU5MV0sWzg1OTIsODcwMywxMDIyNCwxMDIzOSwxMDQ5NiwxMDYyMywxMTAwOCwxMTI2M10sWzg3MDQsODk1OSwxMDc1MiwxMTAwNywxMDE3NiwxMDIyMywxMDYyNCwxMDc1MV0sWzg5NjAsOTIxNV0sWzkyMTYsOTI3OV0sWzkyODAsOTMxMV0sWzkzMTIsOTQ3MV0sWzk0NzIsOTU5OV0sWzk2MDAsOTYzMV0sWzk2MzIsOTcyN10sWzk3MjgsOTk4M10sWzk5ODQsMTAxNzVdLFsxMjI4OCwxMjM1MV0sWzEyMzUyLDEyNDQ3XSxbMTI0NDgsMTI1NDMsMTI3ODQsMTI3OTldLFsxMjU0NCwxMjU5MSwxMjcwNCwxMjczNV0sWzEyNTkyLDEyNjg3XSxbNDMwNzIsNDMxMzVdLFsxMjgwMCwxMzA1NV0sWzEzMDU2LDEzMzExXSxbNDQwMzIsNTUyMTVdLFs1NTI5Niw1NzM0M10sWzY3ODQwLDY3ODcxXSxbMTk5NjgsNDA5NTksMTE5MDQsMTIwMzEsMTIwMzIsMTIyNTUsMTIyNzIsMTIyODcsMTMzMTIsMTk5MDMsMTMxMDcyLDE3Mzc5MSwxMjY4OCwxMjcwM10sWzU3MzQ0LDYzNzQzXSxbMTI3MzYsMTI3ODMsNjM3NDQsNjQyNTUsMTk0NTYwLDE5NTEwM10sWzY0MjU2LDY0MzM1XSxbNjQzMzYsNjUwMjNdLFs2NTA1Niw2NTA3MV0sWzY1MDQwLDY1MDU1XSxbNjUxMDQsNjUxMzVdLFs2NTEzNiw2NTI3OV0sWzY1MjgwLDY1NTE5XSxbNjU1MjAsNjU1MzVdLFszODQwLDQwOTVdLFsxNzkyLDE4NzFdLFsxOTIwLDE5ODNdLFszNDU2LDM1ODNdLFs0MDk2LDQyNTVdLFs0NjA4LDQ5OTEsNDk5Miw1MDIzLDExNjQ4LDExNzQzXSxbNTAyNCw1MTE5XSxbNTEyMCw1NzU5XSxbNTc2MCw1NzkxXSxbNTc5Miw1ODg3XSxbNjAxNiw2MTQzXSxbNjE0NCw2MzE5XSxbMTAyNDAsMTA0OTVdLFs0MDk2MCw0MjEyN10sWzU4ODgsNTkxOSw1OTIwLDU5NTEsNTk1Miw1OTgzLDU5ODQsNjAxNV0sWzY2MzA0LDY2MzUxXSxbNjYzNTIsNjYzODNdLFs2NjU2MCw2NjYzOV0sWzExODc4NCwxMTkwMzksMTE5MDQwLDExOTI5NSwxMTkyOTYsMTE5Mzc1XSxbMTE5ODA4LDEyMDgzMV0sWzEwNDQ0ODAsMTA0ODU3M10sWzY1MDI0LDY1MDM5LDkxNzc2MCw5MTc5OTldLFs5MTc1MDQsOTE3NjMxXSxbNjQwMCw2NDc5XSxbNjQ4MCw2NTI3XSxbNjUyOCw2NjIzXSxbNjY1Niw2Njg3XSxbMTEyNjQsMTEzNTldLFsxMTU2OCwxMTY0N10sWzE5OTA0LDE5OTY3XSxbNDMwMDgsNDMwNTVdLFs2NTUzNiw2NTY2Myw2NTY2NCw2NTc5MSw2NTc5Miw2NTg1NV0sWzY1ODU2LDY1OTM1XSxbNjY0MzIsNjY0NjNdLFs2NjQ2NCw2NjUyN10sWzY2NjQwLDY2Njg3XSxbNjY2ODgsNjY3MzVdLFs2NzU4NCw2NzY0N10sWzY4MDk2LDY4MTkxXSxbMTE5NTUyLDExOTY0N10sWzczNzI4LDc0NzUxLDc0NzUyLDc0ODc5XSxbMTE5NjQ4LDExOTY3OV0sWzcwNDAsNzEwM10sWzcxNjgsNzI0N10sWzcyNDgsNzI5NV0sWzQzMTM2LDQzMjMxXSxbNDMyNjQsNDMzMTFdLFs0MzMxMiw0MzM1OV0sWzQzNTIwLDQzNjE1XSxbNjU5MzYsNjU5OTldLFs2NmUzLDY2MDQ3XSxbNjYyMDgsNjYyNzEsNjYxNzYsNjYyMDcsNjc4NzIsNjc5MDNdLFsxMjcwMjQsMTI3MTM1LDEyNjk3NiwxMjcwMjNdXTtmdW5jdGlvbiBvKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTotMTtpZigtMSE9PXQpe2NvbnN0IHI9c1t0XTtmb3IobGV0IG49MCxhPXIubGVuZ3RoO248YTtuKz0yKWlmKGU+PXJbbl0mJmU8PXJbbisxXSlyZXR1cm4gdH1mb3IobGV0IHQ9MCxyPXMubGVuZ3RoO3Q8cjt0Kyspe2NvbnN0IHI9c1t0XTtmb3IobGV0IG49MCxhPXIubGVuZ3RoO248YTtuKz0yKWlmKGU+PXJbbl0mJmU8PXJbbisxXSlyZXR1cm4gdH1yZXR1cm4tMX1jb25zdCBjPW5ldyBSZWdFeHAoIl4oXFxzKXwoXFxwe01ufSl8KFxccHtDZn0pJCIsInUiKSxsPW5ldyBNYXA7ZnVuY3Rpb24gaChlKXtjb25zdCB0PWwuZ2V0KGUpO2lmKHQpcmV0dXJuIHQ7Y29uc3Qgcj1lLm1hdGNoKGMpLG49e2lzV2hpdGVzcGFjZTohKG51bGw9PXJ8fCFyWzFdKSxpc1plcm9XaWR0aERpYWNyaXRpYzohKG51bGw9PXJ8fCFyWzJdKSxpc0ludmlzaWJsZUZvcm1hdE1hcms6IShudWxsPT1yfHwhclszXSl9O3JldHVybiBsLnNldChlLG4pLG59ZnVuY3Rpb24gdSgpe2wuY2xlYXIoKX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5nZXRTZXJpZkZvbnRzPXQuZ2V0Tm9uU3RkRm9udE1hcD10LmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cz10LmdldEZvbnROYW1lVG9GaWxlTWFwPXZvaWQgMCx0LmdldFN0YW5kYXJkRm9udE5hbWU9ZnVuY3Rpb24oZSl7Y29uc3QgdD0oMCxhLm5vcm1hbGl6ZUZvbnROYW1lKShlKTtyZXR1cm4gaSgpW3RdfSx0LmdldFN5bWJvbHNGb250cz10LmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaT10LmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjaz10LmdldFN0ZEZvbnRNYXA9dm9pZCAwLHQuaXNLbm93bkZvbnROYW1lPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9KDAsYS5ub3JtYWxpemVGb250TmFtZSkoZSk7cmV0dXJuISEoaSgpW3RdfHxvKClbdF18fGMoKVt0XXx8bCgpW3RdKX07dmFyIG49cigxNDkpLGE9cigxODgpO2NvbnN0IGk9KDAsbi5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlWyJUaW1lcy1Sb21hbiJdPSJUaW1lcy1Sb21hbiIsZS5IZWx2ZXRpY2E9IkhlbHZldGljYSIsZS5Db3VyaWVyPSJDb3VyaWVyIixlLlN5bWJvbD0iU3ltYm9sIixlWyJUaW1lcy1Cb2xkIl09IlRpbWVzLUJvbGQiLGVbIkhlbHZldGljYS1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIixlWyJDb3VyaWVyLUJvbGQiXT0iQ291cmllci1Cb2xkIixlLlphcGZEaW5nYmF0cz0iWmFwZkRpbmdiYXRzIixlWyJUaW1lcy1JdGFsaWMiXT0iVGltZXMtSXRhbGljIixlWyJIZWx2ZXRpY2EtT2JsaXF1ZSJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSIsZVsiQ291cmllci1PYmxpcXVlIl09IkNvdXJpZXItT2JsaXF1ZSIsZVsiVGltZXMtQm9sZEl0YWxpYyJdPSJUaW1lcy1Cb2xkSXRhbGljIixlWyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIixlWyJDb3VyaWVyLUJvbGRPYmxpcXVlIl09IkNvdXJpZXItQm9sZE9ibGlxdWUiLGUuQXJpYWxOYXJyb3c9IkhlbHZldGljYSIsZVsiQXJpYWxOYXJyb3ctQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCIsZVsiQXJpYWxOYXJyb3ctQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLGVbIkFyaWFsTmFycm93LUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSIsZS5BcmlhbEJsYWNrPSJIZWx2ZXRpY2EiLGVbIkFyaWFsQmxhY2stQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCIsZVsiQXJpYWxCbGFjay1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsZVsiQXJpYWxCbGFjay1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiLGVbIkFyaWFsLUJsYWNrIl09IkhlbHZldGljYSIsZVsiQXJpYWwtQmxhY2stQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCIsZVsiQXJpYWwtQmxhY2stQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLGVbIkFyaWFsLUJsYWNrLUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSIsZS5BcmlhbD0iSGVsdmV0aWNhIixlWyJBcmlhbC1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIixlWyJBcmlhbC1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsZVsiQXJpYWwtSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIixlLkFyaWFsTVQ9IkhlbHZldGljYSIsZVsiQXJpYWwtQm9sZEl0YWxpY01UIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsZVsiQXJpYWwtQm9sZE1UIl09IkhlbHZldGljYS1Cb2xkIixlWyJBcmlhbC1JdGFsaWNNVCJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSIsZVsiQXJpYWwtQm9sZEl0YWxpY01ULUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIixlWyJBcmlhbC1Cb2xkTVQtQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCIsZVsiQXJpYWwtSXRhbGljTVQtSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIixlLkFyaWFsVW5pY29kZU1TPSJIZWx2ZXRpY2EiLGVbIkFyaWFsVW5pY29kZU1TLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiLGVbIkFyaWFsVW5pY29kZU1TLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIixlWyJBcmlhbFVuaWNvZGVNUy1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiLGVbIkNvdXJpZXItQm9sZEl0YWxpYyJdPSJDb3VyaWVyLUJvbGRPYmxpcXVlIixlWyJDb3VyaWVyLUl0YWxpYyJdPSJDb3VyaWVyLU9ibGlxdWUiLGUuQ291cmllck5ldz0iQ291cmllciIsZVsiQ291cmllck5ldy1Cb2xkIl09IkNvdXJpZXItQm9sZCIsZVsiQ291cmllck5ldy1Cb2xkSXRhbGljIl09IkNvdXJpZXItQm9sZE9ibGlxdWUiLGVbIkNvdXJpZXJOZXctSXRhbGljIl09IkNvdXJpZXItT2JsaXF1ZSIsZVsiQ291cmllck5ld1BTLUJvbGRJdGFsaWNNVCJdPSJDb3VyaWVyLUJvbGRPYmxpcXVlIixlWyJDb3VyaWVyTmV3UFMtQm9sZE1UIl09IkNvdXJpZXItQm9sZCIsZVsiQ291cmllck5ld1BTLUl0YWxpY01UIl09IkNvdXJpZXItT2JsaXF1ZSIsZS5Db3VyaWVyTmV3UFNNVD0iQ291cmllciIsZVsiSGVsdmV0aWNhLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIixlWyJIZWx2ZXRpY2EtSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIixlWyJTeW1ib2wtQm9sZCJdPSJTeW1ib2wiLGVbIlN5bWJvbC1Cb2xkSXRhbGljIl09IlN5bWJvbCIsZVsiU3ltYm9sLUl0YWxpYyJdPSJTeW1ib2wiLGUuVGltZXNOZXdSb21hbj0iVGltZXMtUm9tYW4iLGVbIlRpbWVzTmV3Um9tYW4tQm9sZCJdPSJUaW1lcy1Cb2xkIixlWyJUaW1lc05ld1JvbWFuLUJvbGRJdGFsaWMiXT0iVGltZXMtQm9sZEl0YWxpYyIsZVsiVGltZXNOZXdSb21hbi1JdGFsaWMiXT0iVGltZXMtSXRhbGljIixlLlRpbWVzTmV3Um9tYW5QUz0iVGltZXMtUm9tYW4iLGVbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkIl09IlRpbWVzLUJvbGQiLGVbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljIl09IlRpbWVzLUJvbGRJdGFsaWMiLGVbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljTVQiXT0iVGltZXMtQm9sZEl0YWxpYyIsZVsiVGltZXNOZXdSb21hblBTLUJvbGRNVCJdPSJUaW1lcy1Cb2xkIixlWyJUaW1lc05ld1JvbWFuUFMtSXRhbGljIl09IlRpbWVzLUl0YWxpYyIsZVsiVGltZXNOZXdSb21hblBTLUl0YWxpY01UIl09IlRpbWVzLUl0YWxpYyIsZS5UaW1lc05ld1JvbWFuUFNNVD0iVGltZXMtUm9tYW4iLGVbIlRpbWVzTmV3Um9tYW5QU01ULUJvbGQiXT0iVGltZXMtQm9sZCIsZVsiVGltZXNOZXdSb21hblBTTVQtQm9sZEl0YWxpYyJdPSJUaW1lcy1Cb2xkSXRhbGljIixlWyJUaW1lc05ld1JvbWFuUFNNVC1JdGFsaWMiXT0iVGltZXMtSXRhbGljIn0pKTt0LmdldFN0ZEZvbnRNYXA9aTtjb25zdCBzPSgwLG4uZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5Db3VyaWVyPSJGb3hpdEZpeGVkLnBmYiIsZVsiQ291cmllci1Cb2xkIl09IkZveGl0Rml4ZWRCb2xkLnBmYiIsZVsiQ291cmllci1Cb2xkT2JsaXF1ZSJdPSJGb3hpdEZpeGVkQm9sZEl0YWxpYy5wZmIiLGVbIkNvdXJpZXItT2JsaXF1ZSJdPSJGb3hpdEZpeGVkSXRhbGljLnBmYiIsZS5IZWx2ZXRpY2E9IkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIudHRmIixlWyJIZWx2ZXRpY2EtQm9sZCJdPSJMaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZiIsZVsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl09IkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMudHRmIixlWyJIZWx2ZXRpY2EtT2JsaXF1ZSJdPSJMaWJlcmF0aW9uU2Fucy1JdGFsaWMudHRmIixlWyJUaW1lcy1Sb21hbiJdPSJGb3hpdFNlcmlmLnBmYiIsZVsiVGltZXMtQm9sZCJdPSJGb3hpdFNlcmlmQm9sZC5wZmIiLGVbIlRpbWVzLUJvbGRJdGFsaWMiXT0iRm94aXRTZXJpZkJvbGRJdGFsaWMucGZiIixlWyJUaW1lcy1JdGFsaWMiXT0iRm94aXRTZXJpZkl0YWxpYy5wZmIiLGUuU3ltYm9sPSJGb3hpdFN5bWJvbC5wZmIiLGUuWmFwZkRpbmdiYXRzPSJGb3hpdERpbmdiYXRzLnBmYiIsZVsiTGliZXJhdGlvblNhbnMtUmVndWxhciJdPSJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiIsZVsiTGliZXJhdGlvblNhbnMtQm9sZCJdPSJMaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZiIsZVsiTGliZXJhdGlvblNhbnMtSXRhbGljIl09IkxpYmVyYXRpb25TYW5zLUl0YWxpYy50dGYiLGVbIkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMiXT0iTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYifSkpO3QuZ2V0Rm9udE5hbWVUb0ZpbGVNYXA9cztjb25zdCBvPSgwLG4uZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5DYWxpYnJpPSJIZWx2ZXRpY2EiLGVbIkNhbGlicmktQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCIsZVsiQ2FsaWJyaS1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsZVsiQ2FsaWJyaS1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiLGUuQ2VudHVyeUdvdGhpYz0iSGVsdmV0aWNhIixlWyJDZW50dXJ5R290aGljLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiLGVbIkNlbnR1cnlHb3RoaWMtQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLGVbIkNlbnR1cnlHb3RoaWMtSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIixlLkNvbWljU2Fuc01TPSJDb21pYyBTYW5zIE1TIixlWyJDb21pY1NhbnNNUy1Cb2xkIl09IkNvbWljIFNhbnMgTVMtQm9sZCIsZVsiQ29taWNTYW5zTVMtQm9sZEl0YWxpYyJdPSJDb21pYyBTYW5zIE1TLUJvbGRJdGFsaWMiLGVbIkNvbWljU2Fuc01TLUl0YWxpYyJdPSJDb21pYyBTYW5zIE1TLUl0YWxpYyIsZS5JbXBhY3Q9IkhlbHZldGljYSIsZVsiSXRjU3ltYm9sLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiLGVbIkl0Y1N5bWJvbC1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsZVsiSXRjU3ltYm9sLUJvb2siXT0iSGVsdmV0aWNhIixlWyJJdGNTeW1ib2wtQm9va0l0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSIsZVsiSXRjU3ltYm9sLU1lZGl1bSJdPSJIZWx2ZXRpY2EiLGVbIkl0Y1N5bWJvbC1NZWRpdW1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiLGUuTHVjaWRhQ29uc29sZT0iQ291cmllciIsZVsiTHVjaWRhQ29uc29sZS1Cb2xkIl09IkNvdXJpZXItQm9sZCIsZVsiTHVjaWRhQ29uc29sZS1Cb2xkSXRhbGljIl09IkNvdXJpZXItQm9sZE9ibGlxdWUiLGVbIkx1Y2lkYUNvbnNvbGUtSXRhbGljIl09IkNvdXJpZXItT2JsaXF1ZSIsZVsiTHVjaWRhU2Fucy1EZW1pIl09IkhlbHZldGljYS1Cb2xkIixlWyJNUy1Hb3RoaWMiXT0iTVMgR290aGljIixlWyJNUy1Hb3RoaWMtQm9sZCJdPSJNUyBHb3RoaWMtQm9sZCIsZVsiTVMtR290aGljLUJvbGRJdGFsaWMiXT0iTVMgR290aGljLUJvbGRJdGFsaWMiLGVbIk1TLUdvdGhpYy1JdGFsaWMiXT0iTVMgR290aGljLUl0YWxpYyIsZVsiTVMtTWluY2hvIl09Ik1TIE1pbmNobyIsZVsiTVMtTWluY2hvLUJvbGQiXT0iTVMgTWluY2hvLUJvbGQiLGVbIk1TLU1pbmNoby1Cb2xkSXRhbGljIl09Ik1TIE1pbmNoby1Cb2xkSXRhbGljIixlWyJNUy1NaW5jaG8tSXRhbGljIl09Ik1TIE1pbmNoby1JdGFsaWMiLGVbIk1TLVBHb3RoaWMiXT0iTVMgUEdvdGhpYyIsZVsiTVMtUEdvdGhpYy1Cb2xkIl09Ik1TIFBHb3RoaWMtQm9sZCIsZVsiTVMtUEdvdGhpYy1Cb2xkSXRhbGljIl09Ik1TIFBHb3RoaWMtQm9sZEl0YWxpYyIsZVsiTVMtUEdvdGhpYy1JdGFsaWMiXT0iTVMgUEdvdGhpYy1JdGFsaWMiLGVbIk1TLVBNaW5jaG8iXT0iTVMgUE1pbmNobyIsZVsiTVMtUE1pbmNoby1Cb2xkIl09Ik1TIFBNaW5jaG8tQm9sZCIsZVsiTVMtUE1pbmNoby1Cb2xkSXRhbGljIl09Ik1TIFBNaW5jaG8tQm9sZEl0YWxpYyIsZVsiTVMtUE1pbmNoby1JdGFsaWMiXT0iTVMgUE1pbmNoby1JdGFsaWMiLGUuTnVwdGlhbFNjcmlwdD0iVGltZXMtSXRhbGljIixlLlNlZ29lVUlTeW1ib2w9IkhlbHZldGljYSJ9KSk7dC5nZXROb25TdGRGb250TWFwPW87Y29uc3QgYz0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2VbIkFkb2JlIEplbnNvbiJdPSEwLGVbIkFkb2JlIFRleHQiXT0hMCxlLkFsYmVydHVzPSEwLGUuQWxkdXM9ITAsZS5BbGV4YW5kcmlhPSEwLGUuQWxnZXJpYW49ITAsZVsiQW1lcmljYW4gVHlwZXdyaXRlciJdPSEwLGUuQW50aXF1YT0hMCxlLkFwZXg9ITAsZS5Bcm5vPSEwLGUuQXN0ZXI9ITAsZS5BdXJvcmE9ITAsZS5CYXNrZXJ2aWxsZT0hMCxlLkJlbGw9ITAsZS5CZW1ibz0hMCxlWyJCZW1ibyBTY2hvb2xib29rIl09ITAsZS5CZW5ndWlhdD0hMCxlWyJCZXJrZWxleSBPbGQgU3R5bGUiXT0hMCxlWyJCZXJuaGFyZCBNb2Rlcm4iXT0hMCxlWyJCZXJ0aG9sZCBDaXR5Il09ITAsZS5Cb2Rvbmk9ITAsZVsiQmF1ZXIgQm9kb25pIl09ITAsZVsiQm9vayBBbnRpcXVhIl09ITAsZS5Cb29rbWFuPSEwLGVbIkJvcmRlYXV4IFJvbWFuIl09ITAsZVsiQ2FsaWZvcm5pYW4gRkIiXT0hMCxlLkNhbGlzdG89ITAsZS5DYWx2ZXJ0PSEwLGUuQ2FwaXRhbHM9ITAsZS5DYW1icmlhPSEwLGUuQ2FydGllcj0hMCxlLkNhc2xvbj0hMCxlLkNhdHVsbD0hMCxlLkNlbnRhdXI9ITAsZVsiQ2VudHVyeSBPbGQgU3R5bGUiXT0hMCxlWyJDZW50dXJ5IFNjaG9vbGJvb2siXT0hMCxlLkNoYXBhcnJhbD0hMCxlWyJDaGFyaXMgU0lMIl09ITAsZS5DaGVsdGVuaGFtPSEwLGVbIkNob2xsYSBTbGFiIl09ITAsZS5DbGFyZW5kb249ITAsZS5DbGVhcmZhY2U9ITAsZS5Db2NoaW49ITAsZS5Db2xvbm5hPSEwLGVbIkNvbXB1dGVyIE1vZGVybiJdPSEwLGVbIkNvbmNyZXRlIFJvbWFuIl09ITAsZS5Db25zdGFudGlhPSEwLGVbIkNvb3BlciBCbGFjayJdPSEwLGUuQ29yb25hPSEwLGUuRWNvdHlwZT0hMCxlLkVneXB0aWVubmU9ITAsZS5FbGVwaGFudD0hMCxlLkV4Y2Vsc2lvcj0hMCxlLkZhaXJmaWVsZD0hMCxlWyJGRiBTY2FsYSJdPSEwLGUuRm9sa2FyZD0hMCxlLkZvb3RsaWdodD0hMCxlLkZyZWVTZXJpZj0hMCxlWyJGcml6IFF1YWRyYXRhIl09ITAsZS5HYXJhbW9uZD0hMCxlLkdlbnRpdW09ITAsZS5HZW9yZ2lhPSEwLGUuR2xvdWNlc3Rlcj0hMCxlWyJHb3VkeSBPbGQgU3R5bGUiXT0hMCxlWyJHb3VkeSBTY2hvb2xib29rIl09ITAsZVsiR291ZHkgUHJvIEZvbnQiXT0hMCxlLkdyYW5qb249ITAsZVsiR3VhcmRpYW4gRWd5cHRpYW4iXT0hMCxlLkhlYXRoZXI9ITAsZS5IZXJjdWxlcz0hMCxlWyJIaWdoIFRvd2VyIFRleHQiXT0hMCxlLkhpcm9zaGlnZT0hMCxlWyJIb2VmbGVyIFRleHQiXT0hMCxlWyJIdW1hbmEgU2VyaWYiXT0hMCxlLkltcHJpbnQ9ITAsZVsiSW9uaWMgTm8uIDUiXT0hMCxlLkphbnNvbj0hMCxlLkpvYW5uYT0hMCxlLktvcmlubmE9ITAsZS5MZXhpY29uPSEwLGUuTGliZXJhdGlvblNlcmlmPSEwLGVbIkxpYmVyYXRpb24gU2VyaWYiXT0hMCxlWyJMaW51eCBMaWJlcnRpbmUiXT0hMCxlLkxpdGVyYXR1cm5heWE9ITAsZS5MdWNpZGE9ITAsZVsiTHVjaWRhIEJyaWdodCJdPSEwLGUuTWVsaW9yPSEwLGUuTWVtcGhpcz0hMCxlLk1pbGxlcj0hMCxlLk1pbmlvbj0hMCxlLk1vZGVybj0hMCxlWyJNb25hIExpc2EiXT0hMCxlWyJNcnMgRWF2ZXMiXT0hMCxlWyJNUyBTZXJpZiJdPSEwLGVbIk11c2VvIFNsYWIiXT0hMCxlWyJOZXcgWW9yayJdPSEwLGVbIk5pbWJ1cyBSb21hbiJdPSEwLGVbIk5QUyBSYXdsaW5zb24gUm9hZHdheSJdPSEwLGUuTnVwdGlhbFNjcmlwdD0hMCxlLlBhbGF0aW5vPSEwLGUuUGVycGV0dWE9ITAsZS5QbGFudGluPSEwLGVbIlBsYW50aW4gU2Nob29sYm9vayJdPSEwLGUuUGxheWJpbGw9ITAsZVsiUG9vciBSaWNoYXJkIl09ITAsZVsiUmF3bGluc29uIFJvYWR3YXkiXT0hMCxlLlJlbmF1bHQ9ITAsZS5SZXF1aWVtPSEwLGUuUm9ja3dlbGw9ITAsZS5Sb21hbj0hMCxlWyJSb3RpcyBTZXJpZiJdPSEwLGUuU2Fib249ITAsZS5TY2FsYT0hMCxlLlNlYWd1bGw9ITAsZS5TaXN0aW5hPSEwLGUuU291dmVuaXI9ITAsZS5TVElYPSEwLGVbIlN0b25lIEluZm9ybWFsIl09ITAsZVsiU3RvbmUgU2VyaWYiXT0hMCxlLlN5bGZhZW49ITAsZS5UaW1lcz0hMCxlLlRyYWphbj0hMCxlWyJUcmluaXTDqSJdPSEwLGVbIlRydW1wIE1lZGlhZXZhbCJdPSEwLGUuVXRvcGlhPSEwLGVbIlZhbGUgVHlwZSJdPSEwLGVbIkJpdHN0cmVhbSBWZXJhIl09ITAsZVsiVmVyYSBTZXJpZiJdPSEwLGUuVmVyc2FpbGxlcz0hMCxlLldhbnRlZD0hMCxlLldlaXNzPSEwLGVbIldpZGUgTGF0aW4iXT0hMCxlLldpbmRzb3I9ITAsZS5YSVRTPSEwfSkpO3QuZ2V0U2VyaWZGb250cz1jO2NvbnN0IGw9KDAsbi5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLkRpbmdiYXRzPSEwLGUuU3ltYm9sPSEwLGUuWmFwZkRpbmdiYXRzPSEwLGUuV2luZ2RpbmdzPSEwLGVbIldpbmdkaW5ncy1Cb2xkIl09ITAsZVsiV2luZ2RpbmdzLVJlZ3VsYXIiXT0hMH0pKTt0LmdldFN5bWJvbHNGb250cz1sO2NvbnN0IGg9KDAsbi5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlWzJdPTEwLGVbM109MzIsZVs0XT0zMyxlWzVdPTM0LGVbNl09MzUsZVs3XT0zNixlWzhdPTM3LGVbOV09MzgsZVsxMF09MzksZVsxMV09NDAsZVsxMl09NDEsZVsxM109NDIsZVsxNF09NDMsZVsxNV09NDQsZVsxNl09NDUsZVsxN109NDYsZVsxOF09NDcsZVsxOV09NDgsZVsyMF09NDksZVsyMV09NTAsZVsyMl09NTEsZVsyM109NTIsZVsyNF09NTMsZVsyNV09NTQsZVsyNl09NTUsZVsyN109NTYsZVsyOF09NTcsZVsyOV09NTgsZVszMF09ODk0LGVbMzFdPTYwLGVbMzJdPTYxLGVbMzNdPTYyLGVbMzRdPTYzLGVbMzVdPTY0LGVbMzZdPTY1LGVbMzddPTY2LGVbMzhdPTY3LGVbMzldPTY4LGVbNDBdPTY5LGVbNDFdPTcwLGVbNDJdPTcxLGVbNDNdPTcyLGVbNDRdPTczLGVbNDVdPTc0LGVbNDZdPTc1LGVbNDddPTc2LGVbNDhdPTc3LGVbNDldPTc4LGVbNTBdPTc5LGVbNTFdPTgwLGVbNTJdPTgxLGVbNTNdPTgyLGVbNTRdPTgzLGVbNTVdPTg0LGVbNTZdPTg1LGVbNTddPTg2LGVbNThdPTg3LGVbNTldPTg4LGVbNjBdPTg5LGVbNjFdPTkwLGVbNjJdPTkxLGVbNjNdPTkyLGVbNjRdPTkzLGVbNjVdPTk0LGVbNjZdPTk1LGVbNjddPTk2LGVbNjhdPTk3LGVbNjldPTk4LGVbNzBdPTk5LGVbNzFdPTEwMCxlWzcyXT0xMDEsZVs3M109MTAyLGVbNzRdPTEwMyxlWzc1XT0xMDQsZVs3Nl09MTA1LGVbNzddPTEwNixlWzc4XT0xMDcsZVs3OV09MTA4LGVbODBdPTEwOSxlWzgxXT0xMTAsZVs4Ml09MTExLGVbODNdPTExMixlWzg0XT0xMTMsZVs4NV09MTE0LGVbODZdPTExNSxlWzg3XT0xMTYsZVs4OF09MTE3LGVbODldPTExOCxlWzkwXT0xMTksZVs5MV09MTIwLGVbOTJdPTEyMSxlWzkzXT0xMjIsZVs5NF09MTIzLGVbOTVdPTEyNCxlWzk2XT0xMjUsZVs5N109MTI2LGVbOThdPTE5NixlWzk5XT0xOTcsZVsxMDBdPTE5OSxlWzEwMV09MjAxLGVbMTAyXT0yMDksZVsxMDNdPTIxNCxlWzEwNF09MjIwLGVbMTA1XT0yMjUsZVsxMDZdPTIyNCxlWzEwN109MjI2LGVbMTA4XT0yMjgsZVsxMDldPTIyNyxlWzExMF09MjI5LGVbMTExXT0yMzEsZVsxMTJdPTIzMyxlWzExM109MjMyLGVbMTE0XT0yMzQsZVsxMTVdPTIzNSxlWzExNl09MjM3LGVbMTE3XT0yMzYsZVsxMThdPTIzOCxlWzExOV09MjM5LGVbMTIwXT0yNDEsZVsxMjFdPTI0MyxlWzEyMl09MjQyLGVbMTIzXT0yNDQsZVsxMjRdPTI0NixlWzEyNV09MjQ1LGVbMTI2XT0yNTAsZVsxMjddPTI0OSxlWzEyOF09MjUxLGVbMTI5XT0yNTIsZVsxMzBdPTgyMjQsZVsxMzFdPTE3NixlWzEzMl09MTYyLGVbMTMzXT0xNjMsZVsxMzRdPTE2NyxlWzEzNV09ODIyNixlWzEzNl09MTgyLGVbMTM3XT0yMjMsZVsxMzhdPTE3NCxlWzEzOV09MTY5LGVbMTQwXT04NDgyLGVbMTQxXT0xODAsZVsxNDJdPTE2OCxlWzE0M109ODgwMCxlWzE0NF09MTk4LGVbMTQ1XT0yMTYsZVsxNDZdPTg3MzQsZVsxNDddPTE3NyxlWzE0OF09ODgwNCxlWzE0OV09ODgwNSxlWzE1MF09MTY1LGVbMTUxXT0xODEsZVsxNTJdPTg3MDYsZVsxNTNdPTg3MjEsZVsxNTRdPTg3MTksZVsxNTZdPTg3NDcsZVsxNTddPTE3MCxlWzE1OF09MTg2LGVbMTU5XT04NDg2LGVbMTYwXT0yMzAsZVsxNjFdPTI0OCxlWzE2Ml09MTkxLGVbMTYzXT0xNjEsZVsxNjRdPTE3MixlWzE2NV09ODczMCxlWzE2Nl09NDAyLGVbMTY3XT04Nzc2LGVbMTY4XT04NzEwLGVbMTY5XT0xNzEsZVsxNzBdPTE4NyxlWzE3MV09ODIzMCxlWzE3OV09ODIyMCxlWzE4MF09ODIyMSxlWzE4MV09ODIxNixlWzE4Ml09ODIxNyxlWzIwMF09MTkzLGVbMjAzXT0yMDUsZVsyMDddPTIxMSxlWzIxMF09MjE4LGVbMjIzXT03MTEsZVsyMjRdPTMyMSxlWzIyNV09MzIyLGVbMjI2XT0zNTIsZVsyMjddPTM1MyxlWzIyOF09MzgxLGVbMjI5XT0zODIsZVsyMzNdPTIyMSxlWzIzNF09MjUzLGVbMjUyXT0yNjMsZVsyNTNdPTI2OCxlWzI1NF09MjY5LGVbMjU4XT0yNTgsZVsyNjBdPTI2MCxlWzI2MV09MjYxLGVbMjY1XT0yODAsZVsyNjZdPTI4MSxlWzI2N109MjgyLGVbMjY4XT0yODMsZVsyNjldPTMxMyxlWzI3NV09MzIzLGVbMjc2XT0zMjQsZVsyNzhdPTMyOCxlWzI4M109MzQ0LGVbMjg0XT0zNDUsZVsyODVdPTM0NixlWzI4Nl09MzQ3LGVbMjkyXT0zNjcsZVsyOTVdPTM3NyxlWzI5Nl09Mzc4LGVbMjk4XT0zODAsZVszMDVdPTk2MyxlWzMwNl09OTY0LGVbMzA3XT05NjYsZVszMDhdPTgyMTUsZVszMDldPTgyNTIsZVszMTBdPTgzMTksZVszMTFdPTgzNTksZVszMTJdPTg1OTIsZVszMTNdPTg1OTMsZVszMzddPTk1NTIsZVs0OTNdPTEwMzksZVs0OTRdPTEwNDAsZVs2NzJdPTE0ODgsZVs2NzNdPTE0ODksZVs2NzRdPTE0OTAsZVs2NzVdPTE0OTEsZVs2NzZdPTE0OTIsZVs2NzddPTE0OTMsZVs2NzhdPTE0OTQsZVs2NzldPTE0OTUsZVs2ODBdPTE0OTYsZVs2ODFdPTE0OTcsZVs2ODJdPTE0OTgsZVs2ODNdPTE0OTksZVs2ODRdPTE1MDAsZVs2ODVdPTE1MDEsZVs2ODZdPTE1MDIsZVs2ODddPTE1MDMsZVs2ODhdPTE1MDQsZVs2ODldPTE1MDUsZVs2OTBdPTE1MDYsZVs2OTFdPTE1MDcsZVs2OTJdPTE1MDgsZVs2OTNdPTE1MDksZVs2OTRdPTE1MTAsZVs2OTVdPTE1MTEsZVs2OTZdPTE1MTIsZVs2OTddPTE1MTMsZVs2OThdPTE1MTQsZVs3MDVdPTE1MjQsZVs3MDZdPTgzNjIsZVs3MTBdPTY0Mjg4LGVbNzExXT02NDI5OCxlWzc1OV09MTYxNyxlWzc2MV09MTc3NixlWzc2M109MTc3OCxlWzc3NV09MTY1MixlWzc3N109MTc2NCxlWzc3OF09MTc4MCxlWzc3OV09MTc4MSxlWzc4MF09MTc4MixlWzc4Ml09NzcxLGVbNzgzXT02NDcyNixlWzc4Nl09ODM2MyxlWzc4OF09ODUzMixlWzc5MF09NzY4LGVbNzkxXT03NjksZVs3OTJdPTc2OCxlWzc5NV09ODAzLGVbNzk3XT02NDMzNixlWzc5OF09NjQzMzcsZVs3OTldPTY0MzQyLGVbODAwXT02NDM0MyxlWzgwMV09NjQzNDQsZVs4MDJdPTY0MzQ1LGVbODAzXT02NDM2MixlWzgwNF09NjQzNjMsZVs4MDVdPTY0MzY0LGVbMjQyNF09NzgyMSxlWzI0MjVdPTc4MjIsZVsyNDI2XT03ODIzLGVbMjQyN109NzgyNCxlWzI0MjhdPTc4MjUsZVsyNDI5XT03ODI2LGVbMjQzMF09NzgyNyxlWzI0MzNdPTc2ODIsZVsyNjc4XT04MDQ1LGVbMjY3OV09ODA0NixlWzI4MzBdPTE1NTIsZVsyODM4XT02ODYsZVsyODQwXT03NTEsZVsyODQyXT03NTMsZVsyODQzXT03NTQsZVsyODQ0XT03NTUsZVsyODQ2XT03NTcsZVsyODU2XT03NjcsZVsyODU3XT04NDgsZVsyODU4XT04NDksZVsyODYyXT04NTMsZVsyODYzXT04NTQsZVsyODY0XT04NTUsZVsyODY1XT04NjEsZVsyODY2XT04NjIsZVsyOTA2XT03NDYwLGVbMjkwOF09NzQ2MixlWzI5MDldPTc0NjMsZVsyOTEwXT03NDY0LGVbMjkxMl09NzQ2NixlWzI5MTNdPTc0NjcsZVsyOTE0XT03NDY4LGVbMjkxNl09NzQ3MCxlWzI5MTddPTc0NzEsZVsyOTE4XT03NDcyLGVbMjkyMF09NzQ3NCxlWzI5MjFdPTc0NzUsZVsyOTIyXT03NDc2LGVbMjkyNF09NzQ3OCxlWzI5MjVdPTc0NzksZVsyOTI2XT03NDgwLGVbMjkyOF09NzQ4MixlWzI5MjldPTc0ODMsZVsyOTMwXT03NDg0LGVbMjkzMl09NzQ4NixlWzI5MzNdPTc0ODcsZVsyOTM0XT03NDg4LGVbMjkzNl09NzQ5MCxlWzI5MzddPTc0OTEsZVsyOTM4XT03NDkyLGVbMjk0MF09NzQ5NCxlWzI5NDFdPTc0OTUsZVsyOTQyXT03NDk2LGVbMjk0NF09NzQ5OCxlWzI5NDZdPTc1MDAsZVsyOTQ4XT03NTAyLGVbMjk1MF09NzUwNCxlWzI5NTFdPTc1MDUsZVsyOTUyXT03NTA2LGVbMjk1NF09NzUwOCxlWzI5NTVdPTc1MDksZVsyOTU2XT03NTEwLGVbMjk1OF09NzUxMixlWzI5NTldPTc1MTMsZVsyOTYwXT03NTE0LGVbMjk2Ml09NzUxNixlWzI5NjNdPTc1MTcsZVsyOTY0XT03NTE4LGVbMjk2Nl09NzUyMCxlWzI5NjddPTc1MjEsZVsyOTY4XT03NTIyLGVbMjk3MF09NzUyNCxlWzI5NzFdPTc1MjUsZVsyOTcyXT03NTI2LGVbMjk3NF09NzUyOCxlWzI5NzVdPTc1MjksZVsyOTc2XT03NTMwLGVbMjk3OF09MTUzNyxlWzI5NzldPTE1MzgsZVsyOTgwXT0xNTM5LGVbMjk4Ml09MTU0OSxlWzI5ODNdPTE1NTEsZVsyOTg0XT0xNTUyLGVbMjk4Nl09MTU1NCxlWzI5ODddPTE1NTUsZVsyOTg4XT0xNTU2LGVbMjk5MF09MTYyMyxlWzI5OTFdPTE2MjQsZVsyOTk1XT0xNzc1LGVbMjk5OV09MTc5MSxlWzMwMDJdPTY0MjkwLGVbMzAwM109NjQyOTEsZVszMDA0XT02NDI5MixlWzMwMDZdPTY0Mjk0LGVbMzAwN109NjQyOTUsZVszMDA4XT02NDI5NixlWzMwMTFdPTE5MDAsZVszMDE0XT04MjIzLGVbMzAxNV09ODI0NCxlWzMwMTddPTc1MzIsZVszMDE4XT03NTMzLGVbMzAxOV09NzUzNCxlWzMwNzVdPTc1OTAsZVszMDc2XT03NTkxLGVbMzA3OV09NzU5NCxlWzMwODBdPTc1OTUsZVszMDgzXT03NTk4LGVbMzA4NF09NzU5OSxlWzMwODddPTc2MDIsZVszMDg4XT03NjAzLGVbMzA5MV09NzYwNixlWzMwOTJdPTc2MDcsZVszMDk1XT03NjEwLGVbMzA5Nl09NzYxMSxlWzMwOTldPTc2MTQsZVszMTAwXT03NjE1LGVbMzEwM109NzYxOCxlWzMxMDRdPTc2MTksZVszMTA3XT04MzM3LGVbMzEwOF09ODMzOCxlWzMxMTZdPTE4ODQsZVszMTE5XT0xODg1LGVbMzEyMF09MTg4NSxlWzMxMjNdPTE4ODYsZVszMTI0XT0xODg2LGVbMzEyN109MTg4NyxlWzMxMjhdPTE4ODcsZVszMTMxXT0xODg4LGVbMzEzMl09MTg4OCxlWzMxMzVdPTE4ODksZVszMTM2XT0xODg5LGVbMzEzOV09MTg5MCxlWzMxNDBdPTE4OTAsZVszMTQzXT0xODkxLGVbMzE0NF09MTg5MSxlWzMxNDddPTE4OTIsZVszMTQ4XT0xODkyLGVbMzE1M109NTgwLGVbMzE1NF09NTgxLGVbMzE1N109NTg0LGVbMzE1OF09NTg1LGVbMzE2MV09NTg4LGVbMzE2Ml09NTg5LGVbMzE2NV09ODkxLGVbMzE2Nl09ODkyLGVbMzE2OV09MTI3NCxlWzMxNzBdPTEyNzUsZVszMTczXT0xMjc4LGVbMzE3NF09MTI3OSxlWzMxODFdPTc2MjIsZVszMTgyXT03NjIzLGVbMzI4Ml09MTE3OTksZVszMzE2XT01NzgsZVszMzc5XT00Mjc4NSxlWzMzOTNdPTExNTksZVszNDE2XT04Mzc3fSkpO3QuZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzPWg7Y29uc3QgdT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2VbMjI3XT0zMjIsZVsyNjRdPTI2MSxlWzI5MV09MzQ2fSkpO3QuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrPXU7Y29uc3QgZD0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2VbMV09MzIsZVs0XT02NSxlWzVdPTE5MixlWzZdPTE5MyxlWzldPTE5NixlWzE3XT02NixlWzE4XT02NyxlWzIxXT0yNjgsZVsyNF09NjgsZVsyOF09NjksZVsyOV09MjAwLGVbMzBdPTIwMSxlWzMyXT0yODIsZVszOF09NzAsZVszOV09NzEsZVs0NF09NzIsZVs0N109NzMsZVs0OF09MjA0LGVbNDldPTIwNSxlWzU4XT03NCxlWzYwXT03NSxlWzYyXT03NixlWzY4XT03NyxlWzY5XT03OCxlWzc1XT03OSxlWzc2XT0yMTAsZVs4MF09MjE0LGVbODddPTgwLGVbODldPTgxLGVbOTBdPTgyLGVbOTJdPTM0NCxlWzk0XT04MyxlWzk3XT0zNTIsZVsxMDBdPTg0LGVbMTA0XT04NSxlWzEwOV09MjIwLGVbMTE1XT04NixlWzExNl09ODcsZVsxMjFdPTg4LGVbMTIyXT04OSxlWzEyNF09MjIxLGVbMTI3XT05MCxlWzEyOV09MzgxLGVbMjU4XT05NyxlWzI1OV09MjI0LGVbMjYwXT0yMjUsZVsyNjNdPTIyOCxlWzI2OF09MjYxLGVbMjcxXT05OCxlWzI3Ml09OTksZVsyNzNdPTI2MyxlWzI3NV09MjY5LGVbMjgyXT0xMDAsZVsyODZdPTEwMSxlWzI4N109MjMyLGVbMjg4XT0yMzMsZVsyOTBdPTI4MyxlWzI5NV09MjgxLGVbMjk2XT0xMDIsZVszMzZdPTEwMyxlWzM0Nl09MTA0LGVbMzQ5XT0xMDUsZVszNTBdPTIzNixlWzM1MV09MjM3LGVbMzYxXT0xMDYsZVszNjRdPTEwNyxlWzM2N109MTA4LGVbMzcxXT0zMjIsZVszNzNdPTEwOSxlWzM3NF09MTEwLGVbMzgxXT0xMTEsZVszODJdPTI0MixlWzM4M109MjQzLGVbMzg2XT0yNDYsZVszOTNdPTExMixlWzM5NV09MTEzLGVbMzk2XT0xMTQsZVszOThdPTM0NSxlWzQwMF09MTE1LGVbNDAxXT0zNDcsZVs0MDNdPTM1MyxlWzQxMF09MTE2LGVbNDM3XT0xMTcsZVs0NDJdPTI1MixlWzQ0OF09MTE4LGVbNDQ5XT0xMTksZVs0NTRdPTEyMCxlWzQ1NV09MTIxLGVbNDU3XT0yNTMsZVs0NjBdPTEyMixlWzQ2Ml09MzgyLGVbNDYzXT0zODAsZVs4NTNdPTQ0LGVbODU1XT01OCxlWzg1Nl09NDYsZVs4NzZdPTQ3LGVbODc4XT00NSxlWzg4Ml09NDUsZVs4OTRdPTQwLGVbODk1XT00MSxlWzg5Nl09OTEsZVs4OTddPTkzLGVbOTIzXT02NCxlWzEwMDRdPTQ4LGVbMTAwNV09NDksZVsxMDA2XT01MCxlWzEwMDddPTUxLGVbMTAwOF09NTIsZVsxMDA5XT01MyxlWzEwMTBdPTU0LGVbMTAxMV09NTUsZVsxMDEyXT01NixlWzEwMTNdPTU3LGVbMTA4MV09MzcsZVsxMDg1XT00MyxlWzEwODZdPTQ1fSkpO3QuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpPWR9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Ub1VuaWNvZGVNYXA9dC5JZGVudGl0eVRvVW5pY29kZU1hcD12b2lkIDA7dmFyIG49cigxNDQpO3QuVG9Vbmljb2RlTWFwPWNsYXNze2NvbnN0cnVjdG9yKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOltdO3RoaXMuX21hcD1lfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5fbWFwLmxlbmd0aH1mb3JFYWNoKGUpe2Zvcihjb25zdCB0IGluIHRoaXMuX21hcCllKHQsdGhpcy5fbWFwW3RdLmNoYXJDb2RlQXQoMCkpfWhhcyhlKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fbWFwW2VdfWdldChlKXtyZXR1cm4gdGhpcy5fbWFwW2VdfWNoYXJDb2RlT2YoZSl7Y29uc3QgdD10aGlzLl9tYXA7aWYodC5sZW5ndGg8PTY1NTM2KXJldHVybiB0LmluZGV4T2YoZSk7Zm9yKGNvbnN0IHIgaW4gdClpZih0W3JdPT09ZSlyZXR1cm4gMHxyO3JldHVybi0xfWFtZW5kKGUpe2Zvcihjb25zdCB0IGluIGUpdGhpcy5fbWFwW3RdPWVbdF19fSx0LklkZW50aXR5VG9Vbmljb2RlTWFwPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5maXJzdENoYXI9ZSx0aGlzLmxhc3RDaGFyPXR9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmxhc3RDaGFyKzEtdGhpcy5maXJzdENoYXJ9Zm9yRWFjaChlKXtmb3IobGV0IHQ9dGhpcy5maXJzdENoYXIscj10aGlzLmxhc3RDaGFyO3Q8PXI7dCsrKWUodCx0KX1oYXMoZSl7cmV0dXJuIHRoaXMuZmlyc3RDaGFyPD1lJiZlPD10aGlzLmxhc3RDaGFyfWdldChlKXtpZih0aGlzLmZpcnN0Q2hhcjw9ZSYmZTw9dGhpcy5sYXN0Q2hhcilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlKX1jaGFyQ29kZU9mKGUpe3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj10aGlzLmZpcnN0Q2hhciYmZTw9dGhpcy5sYXN0Q2hhcj9lOi0xfWFtZW5kKGUpeygwLG4udW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgYW1lbmQoKSIpfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5DRkZGb250PXZvaWQgMDt2YXIgbj1yKDE4NSksYT1yKDE4OCksaT1yKDE0NCk7dC5DRkZGb250PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5wcm9wZXJ0aWVzPXQ7Y29uc3Qgcj1uZXcgbi5DRkZQYXJzZXIoZSx0LGEuU0VBQ19BTkFMWVNJU19FTkFCTEVEKTt0aGlzLmNmZj1yLnBhcnNlKCksdGhpcy5jZmYuZHVwbGljYXRlRmlyc3RHbHlwaCgpO2NvbnN0IHM9bmV3IG4uQ0ZGQ29tcGlsZXIodGhpcy5jZmYpO3RoaXMuc2VhY3M9dGhpcy5jZmYuc2VhY3M7dHJ5e3RoaXMuZGF0YT1zLmNvbXBpbGUoKX1jYXRjaChyKXsoMCxpLndhcm4pKCJGYWlsZWQgdG8gY29tcGlsZSBmb250ICIrdC5sb2FkZWROYW1lKSx0aGlzLmRhdGE9ZX10aGlzLl9jcmVhdGVCdWlsdEluRW5jb2RpbmcoKX1nZXQgbnVtR2x5cGhzKCl7cmV0dXJuIHRoaXMuY2ZmLmNoYXJTdHJpbmdzLmNvdW50fWdldENoYXJzZXQoKXtyZXR1cm4gdGhpcy5jZmYuY2hhcnNldC5jaGFyc2V0fWdldEdseXBoTWFwcGluZygpe2NvbnN0IGU9dGhpcy5jZmYsdD10aGlzLnByb3BlcnRpZXMse2NpZFRvR2lkTWFwOnIsY01hcDpufT10LGk9ZS5jaGFyc2V0LmNoYXJzZXQ7bGV0IHMsbztpZih0LmNvbXBvc2l0ZSl7bGV0IHQsYTtpZigobnVsbD09cj92b2lkIDA6ci5sZW5ndGgpPjApe3Q9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IGU9MCxuPXIubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49cltlXTt2b2lkIDAhPT1uJiYodFtuXT1lKX19aWYocz1PYmplY3QuY3JlYXRlKG51bGwpLGUuaXNDSURGb250KWZvcihvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBjO2NvbnN0IGU9aVtvXTthPW4uY2hhckNvZGVPZihlKSx2b2lkIDAhPT0obnVsbD09PShjPXQpfHx2b2lkIDA9PT1jP3ZvaWQgMDpjW2FdKSYmKGE9dFthXSksc1thXT1vfWVsc2UgZm9yKG89MDtvPGUuY2hhclN0cmluZ3MuY291bnQ7bysrKWE9bi5jaGFyQ29kZU9mKG8pLHNbYV09bztyZXR1cm4gc31sZXQgbD1lLmVuY29kaW5nP2UuZW5jb2RpbmcuZW5jb2Rpbmc6bnVsbDtyZXR1cm4gdC5pc0ludGVybmFsRm9udCYmKGw9dC5kZWZhdWx0RW5jb2RpbmcpLHM9KDAsYS50eXBlMUZvbnRHbHlwaE1hcHBpbmcpKHQsbCxpKSxzfWhhc0dseXBoSWQoZSl7cmV0dXJuIHRoaXMuY2ZmLmhhc0dseXBoSWQoZSl9X2NyZWF0ZUJ1aWx0SW5FbmNvZGluZygpe2NvbnN0e2NoYXJzZXQ6ZSxlbmNvZGluZzp0fT10aGlzLmNmZjtpZighZXx8IXQpcmV0dXJuO2NvbnN0IHI9ZS5jaGFyc2V0LG49dC5lbmNvZGluZyxhPVtdO2Zvcihjb25zdCBlIGluIG4pe2NvbnN0IHQ9bltlXTtpZih0Pj0wKXtjb25zdCBuPXJbdF07biYmKGFbZV09bil9fWEubGVuZ3RoPjAmJih0aGlzLnByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nPWEpfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Gb250UmVuZGVyZXJGYWN0b3J5PXZvaWQgMCxyKDEzOSkscigxNTcpLHIoMTU5KSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNDQpLGE9cigxODUpLGk9cigxODkpLHM9cigxODcpLG89cigxNTQpO2Z1bmN0aW9uIGMoZSx0KXtyZXR1cm4oZVt0XTw8MjR8ZVt0KzFdPDwxNnxlW3QrMl08PDh8ZVt0KzNdKT4+PjB9ZnVuY3Rpb24gbChlLHQpe3JldHVybiBlW3RdPDw4fGVbdCsxXX1mdW5jdGlvbiBoKGUsdCl7cmV0dXJuKGVbdF08PDI0fGVbdCsxXTw8MTYpPj4xNn1mdW5jdGlvbiB1KGUsdCl7cmV0dXJuIGVbdF08PDI0Pj4yNH1mdW5jdGlvbiBkKGUsdCl7cmV0dXJuIGgoZSx0KS8xNjM4NH1mdW5jdGlvbiBmKGUpe2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IHI9MzI3Njg7cmV0dXJuIHQ8MTI0MD9yPTEwNzp0PDMzOTAwJiYocj0xMTMxKSxyfWZ1bmN0aW9uIGcoZSx0LHIpe2NvbnN0IGE9MT09PWwoZSx0KzIpP2MoZSx0KzgpOmMoZSx0KzE2KSxpPWwoZSx0K2EpO2xldCBzLG8saDtpZig0PT09aSl7bChlLHQrYSsyKTtjb25zdCByPWwoZSx0K2ErNik+PjE7Zm9yKG89dCthKzE0LHM9W10saD0wO2g8cjtoKyssbys9MilzW2hdPXtlbmQ6bChlLG8pfTtmb3Iobys9MixoPTA7aDxyO2grKyxvKz0yKXNbaF0uc3RhcnQ9bChlLG8pO2ZvcihoPTA7aDxyO2grKyxvKz0yKXNbaF0uaWREZWx0YT1sKGUsbyk7Zm9yKGg9MDtoPHI7aCsrLG8rPTIpe2xldCB0PWwoZSxvKTtpZigwIT09dCl7c1toXS5pZHM9W107Zm9yKGxldCByPTAsbj1zW2hdLmVuZC1zW2hdLnN0YXJ0KzE7cjxuO3IrKylzW2hdLmlkc1tyXT1sKGUsbyt0KSx0Kz0yfX1yZXR1cm4gc31pZigxMj09PWkpe2NvbnN0IHI9YyhlLHQrYSsxMik7Zm9yKG89dCthKzE2LHM9W10saD0wO2g8cjtoKyspdD1jKGUsbykscy5wdXNoKHtzdGFydDp0LGVuZDpjKGUsbys0KSxpZERlbHRhOmMoZSxvKzgpLXR9KSxvKz0xMjtyZXR1cm4gc310aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigidW5zdXBwb3J0ZWQgY21hcDogIi5jb25jYXQoaSkpfWZ1bmN0aW9uIHAoZSx0LHIsbil7dmFyIGkscztjb25zdCBjPW5ldyBhLkNGRlBhcnNlcihuZXcgby5TdHJlYW0oZSx0LHItdCkse30sbikucGFyc2UoKTtyZXR1cm57Z2x5cGhzOmMuY2hhclN0cmluZ3Mub2JqZWN0cyxzdWJyczpudWxsPT09KGk9Yy50b3BEaWN0LnByaXZhdGVEaWN0KXx8dm9pZCAwPT09aXx8bnVsbD09PShpPWkuc3VicnNJbmRleCl8fHZvaWQgMD09PWk/dm9pZCAwOmkub2JqZWN0cyxnc3VicnM6bnVsbD09PShzPWMuZ2xvYmFsU3VickluZGV4KXx8dm9pZCAwPT09cz92b2lkIDA6cy5vYmplY3RzLGlzQ0ZGQ0lERm9udDpjLmlzQ0lERm9udCxmZFNlbGVjdDpjLmZkU2VsZWN0LGZkQXJyYXk6Yy5mZEFycmF5fX1mdW5jdGlvbiBtKGUsdCl7Y29uc3Qgcj10LmNvZGVQb2ludEF0KDApO2xldCBuPTAsYT0wLGk9ZS5sZW5ndGgtMTtmb3IoO2E8aTspe2NvbnN0IHQ9YStpKzE+PjE7cjxlW3RdLnN0YXJ0P2k9dC0xOmE9dH1yZXR1cm4gZVthXS5zdGFydDw9ciYmcjw9ZVthXS5lbmQmJihuPWVbYV0uaWREZWx0YSsoZVthXS5pZHM/ZVthXS5pZHNbci1lW2FdLnN0YXJ0XTpyKSY2NTUzNSkse2NoYXJDb2RlOnIsZ2x5cGhJZDpufX1mdW5jdGlvbiBiKGUsdCxyKXtmdW5jdGlvbiBuKGUscil7dC5wdXNoKHtjbWQ6Im1vdmVUbyIsYXJnczpbZSxyXX0pfWZ1bmN0aW9uIGEoZSxyKXt0LnB1c2goe2NtZDoibGluZVRvIixhcmdzOltlLHJdfSl9ZnVuY3Rpb24gaShlLHIsbixhKXt0LnB1c2goe2NtZDoicXVhZHJhdGljQ3VydmVUbyIsYXJnczpbZSxyLG4sYV19KX1sZXQgcz0wO2NvbnN0IG89aChlLHMpO2xldCBjLGY9MCxnPTA7aWYocys9MTAsbzwwKWRve2M9bChlLHMpO2NvbnN0IG49bChlLHMrMik7bGV0IGEsaTtzKz00LDEmYz8oMiZjPyhhPWgoZSxzKSxpPWgoZSxzKzIpKTooYT1sKGUscyksaT1sKGUscysyKSkscys9NCk6MiZjPyhhPXUoZSxzKyspLGk9dShlLHMrKykpOihhPWVbcysrXSxpPWVbcysrXSksMiZjPyhmPWEsZz1pKTooZj0wLGc9MCk7bGV0IG89MSxwPTEsbT0wLHk9MDs4JmM/KG89cD1kKGUscykscys9Mik6NjQmYz8obz1kKGUscykscD1kKGUscysyKSxzKz00KToxMjgmYyYmKG89ZChlLHMpLG09ZChlLHMrMikseT1kKGUscys0KSxwPWQoZSxzKzYpLHMrPTgpO2NvbnN0IHc9ci5nbHlwaHNbbl07dyYmKHQucHVzaCh7Y21kOiJzYXZlIn0se2NtZDoidHJhbnNmb3JtIixhcmdzOltvLG0seSxwLGYsZ119KSxiKHcsdCxyKSx0LnB1c2goe2NtZDoicmVzdG9yZSJ9KSl9d2hpbGUoMzImYyk7ZWxzZXtjb25zdCB0PVtdO2xldCByLHU7Zm9yKHI9MDtyPG87cisrKXQucHVzaChsKGUscykpLHMrPTI7cys9MitsKGUscyk7Y29uc3QgZD10LmF0KC0xKSsxLHA9W107Zm9yKDtwLmxlbmd0aDxkOyl7Yz1lW3MrK107bGV0IHQ9MTtmb3IoOCZjJiYodCs9ZVtzKytdKTt0LS0gPjA7KXAucHVzaCh7ZmxhZ3M6Y30pfWZvcihyPTA7cjxkO3IrKyl7c3dpdGNoKDE4JnBbcl0uZmxhZ3Mpe2Nhc2UgMDpmKz1oKGUscykscys9MjticmVhaztjYXNlIDI6Zi09ZVtzKytdO2JyZWFrO2Nhc2UgMTg6Zis9ZVtzKytdfXBbcl0ueD1mfWZvcihyPTA7cjxkO3IrKyl7c3dpdGNoKDM2JnBbcl0uZmxhZ3Mpe2Nhc2UgMDpnKz1oKGUscykscys9MjticmVhaztjYXNlIDQ6Zy09ZVtzKytdO2JyZWFrO2Nhc2UgMzY6Zys9ZVtzKytdfXBbcl0ueT1nfWxldCBtPTA7Zm9yKHM9MDtzPG87cysrKXtjb25zdCBlPXRbc10sbz1wLnNsaWNlKG0sZSsxKTtpZigxJm9bMF0uZmxhZ3Mpby5wdXNoKG9bMF0pO2Vsc2UgaWYoMSZvLmF0KC0xKS5mbGFncylvLnVuc2hpZnQoby5hdCgtMSkpO2Vsc2V7Y29uc3QgZT17ZmxhZ3M6MSx4OihvWzBdLngrby5hdCgtMSkueCkvMix5OihvWzBdLnkrby5hdCgtMSkueSkvMn07by51bnNoaWZ0KGUpLG8ucHVzaChlKX1mb3IobihvWzBdLngsb1swXS55KSxyPTEsdT1vLmxlbmd0aDtyPHU7cisrKTEmb1tyXS5mbGFncz9hKG9bcl0ueCxvW3JdLnkpOjEmb1tyKzFdLmZsYWdzPyhpKG9bcl0ueCxvW3JdLnksb1tyKzFdLngsb1tyKzFdLnkpLHIrKyk6aShvW3JdLngsb1tyXS55LChvW3JdLngrb1tyKzFdLngpLzIsKG9bcl0ueStvW3IrMV0ueSkvMik7bT1lKzF9fX1mdW5jdGlvbiB5KGUsdCxyLGEpe2Z1bmN0aW9uIGkoZSxyKXt0LnB1c2goe2NtZDoibW92ZVRvIixhcmdzOltlLHJdfSl9ZnVuY3Rpb24gbyhlLHIpe3QucHVzaCh7Y21kOiJsaW5lVG8iLGFyZ3M6W2Uscl19KX1mdW5jdGlvbiBjKGUscixuLGEsaSxzKXt0LnB1c2goe2NtZDoiYmV6aWVyQ3VydmVUbyIsYXJnczpbZSxyLG4sYSxpLHNdfSl9Y29uc3QgbD1bXTtsZXQgaD0wLHU9MCxkPTA7IWZ1bmN0aW9uIGUoZyl7bGV0IHA9MDtmb3IoO3A8Zy5sZW5ndGg7KXtsZXQgdyx2LHgsUyxBLGssQyxPLEYsST0hMSxUPWdbcCsrXTtzd2l0Y2goVCl7Y2FzZSAxOmNhc2UgMzpjYXNlIDE4OmNhc2UgMjM6ZCs9bC5sZW5ndGg+PjEsST0hMDticmVhaztjYXNlIDQ6dSs9bC5wb3AoKSxpKGgsdSksST0hMDticmVhaztjYXNlIDU6Zm9yKDtsLmxlbmd0aD4wOyloKz1sLnNoaWZ0KCksdSs9bC5zaGlmdCgpLG8oaCx1KTticmVhaztjYXNlIDY6Zm9yKDtsLmxlbmd0aD4wJiYoaCs9bC5zaGlmdCgpLG8oaCx1KSwwIT09bC5sZW5ndGgpOyl1Kz1sLnNoaWZ0KCksbyhoLHUpO2JyZWFrO2Nhc2UgNzpmb3IoO2wubGVuZ3RoPjAmJih1Kz1sLnNoaWZ0KCksbyhoLHUpLDAhPT1sLmxlbmd0aCk7KWgrPWwuc2hpZnQoKSxvKGgsdSk7YnJlYWs7Y2FzZSA4OmZvcig7bC5sZW5ndGg+MDspdz1oK2wuc2hpZnQoKSx4PXUrbC5zaGlmdCgpLHY9dytsLnNoaWZ0KCksUz14K2wuc2hpZnQoKSxoPXYrbC5zaGlmdCgpLHU9UytsLnNoaWZ0KCksYyh3LHgsdixTLGgsdSk7YnJlYWs7Y2FzZSAxMDppZihPPWwucG9wKCksRj1udWxsLHIuaXNDRkZDSURGb250KXtjb25zdCBlPXIuZmRTZWxlY3QuZ2V0RkRJbmRleChhKTtpZihlPj0wJiZlPHIuZmRBcnJheS5sZW5ndGgpe3ZhciBiO2NvbnN0IHQ9ci5mZEFycmF5W2VdO2xldCBuOyhudWxsPT09KGI9dC5wcml2YXRlRGljdCl8fHZvaWQgMD09PWI/dm9pZCAwOmIuc3VicnNJbmRleCkmJihuPXQucHJpdmF0ZURpY3Quc3VicnNJbmRleC5vYmplY3RzKSxuJiYoTys9ZihuKSxGPW5bT10pfWVsc2UoMCxuLndhcm4pKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKX1lbHNlIEY9ci5zdWJyc1tPK3Iuc3VicnNCaWFzXTtGJiZlKEYpO2JyZWFrO2Nhc2UgMTE6cmV0dXJuO2Nhc2UgMTI6c3dpdGNoKFQ9Z1twKytdLFQpe2Nhc2UgMzQ6dz1oK2wuc2hpZnQoKSx2PXcrbC5zaGlmdCgpLEE9dStsLnNoaWZ0KCksaD12K2wuc2hpZnQoKSxjKHcsdSx2LEEsaCxBKSx3PWgrbC5zaGlmdCgpLHY9dytsLnNoaWZ0KCksaD12K2wuc2hpZnQoKSxjKHcsQSx2LHUsaCx1KTticmVhaztjYXNlIDM1Onc9aCtsLnNoaWZ0KCkseD11K2wuc2hpZnQoKSx2PXcrbC5zaGlmdCgpLFM9eCtsLnNoaWZ0KCksaD12K2wuc2hpZnQoKSx1PVMrbC5zaGlmdCgpLGModyx4LHYsUyxoLHUpLHc9aCtsLnNoaWZ0KCkseD11K2wuc2hpZnQoKSx2PXcrbC5zaGlmdCgpLFM9eCtsLnNoaWZ0KCksaD12K2wuc2hpZnQoKSx1PVMrbC5zaGlmdCgpLGModyx4LHYsUyxoLHUpLGwucG9wKCk7YnJlYWs7Y2FzZSAzNjp3PWgrbC5zaGlmdCgpLEE9dStsLnNoaWZ0KCksdj13K2wuc2hpZnQoKSxrPUErbC5zaGlmdCgpLGg9ditsLnNoaWZ0KCksYyh3LEEsdixrLGgsayksdz1oK2wuc2hpZnQoKSx2PXcrbC5zaGlmdCgpLEM9aytsLnNoaWZ0KCksaD12K2wuc2hpZnQoKSxjKHcsayx2LEMsaCx1KTticmVhaztjYXNlIDM3OmNvbnN0IGU9aCx0PXU7dz1oK2wuc2hpZnQoKSx4PXUrbC5zaGlmdCgpLHY9dytsLnNoaWZ0KCksUz14K2wuc2hpZnQoKSxoPXYrbC5zaGlmdCgpLHU9UytsLnNoaWZ0KCksYyh3LHgsdixTLGgsdSksdz1oK2wuc2hpZnQoKSx4PXUrbC5zaGlmdCgpLHY9dytsLnNoaWZ0KCksUz14K2wuc2hpZnQoKSxoPXYsdT1TLE1hdGguYWJzKGgtZSk+TWF0aC5hYnModS10KT9oKz1sLnNoaWZ0KCk6dSs9bC5zaGlmdCgpLGModyx4LHYsUyxoLHUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoInVua25vd24gb3BlcmF0b3I6IDEyICIuY29uY2F0KFQpKX1icmVhaztjYXNlIDE0OmlmKGwubGVuZ3RoPj00KXtjb25zdCBlPWwucG9wKCksbj1sLnBvcCgpO3U9bC5wb3AoKSxoPWwucG9wKCksdC5wdXNoKHtjbWQ6InNhdmUifSx7Y21kOiJ0cmFuc2xhdGUiLGFyZ3M6W2gsdV19KTtsZXQgYT1tKHIuY21hcCxTdHJpbmcuZnJvbUNoYXJDb2RlKHIuZ2x5cGhOYW1lTWFwW3MuU3RhbmRhcmRFbmNvZGluZ1tlXV0pKTt5KHIuZ2x5cGhzW2EuZ2x5cGhJZF0sdCxyLGEuZ2x5cGhJZCksdC5wdXNoKHtjbWQ6InJlc3RvcmUifSksYT1tKHIuY21hcCxTdHJpbmcuZnJvbUNoYXJDb2RlKHIuZ2x5cGhOYW1lTWFwW3MuU3RhbmRhcmRFbmNvZGluZ1tuXV0pKSx5KHIuZ2x5cGhzW2EuZ2x5cGhJZF0sdCxyLGEuZ2x5cGhJZCl9cmV0dXJuO2Nhc2UgMTk6Y2FzZSAyMDpkKz1sLmxlbmd0aD4+MSxwKz1kKzc+PjMsST0hMDticmVhaztjYXNlIDIxOnUrPWwucG9wKCksaCs9bC5wb3AoKSxpKGgsdSksST0hMDticmVhaztjYXNlIDIyOmgrPWwucG9wKCksaShoLHUpLEk9ITA7YnJlYWs7Y2FzZSAyNDpmb3IoO2wubGVuZ3RoPjI7KXc9aCtsLnNoaWZ0KCkseD11K2wuc2hpZnQoKSx2PXcrbC5zaGlmdCgpLFM9eCtsLnNoaWZ0KCksaD12K2wuc2hpZnQoKSx1PVMrbC5zaGlmdCgpLGModyx4LHYsUyxoLHUpO2grPWwuc2hpZnQoKSx1Kz1sLnNoaWZ0KCksbyhoLHUpO2JyZWFrO2Nhc2UgMjU6Zm9yKDtsLmxlbmd0aD42OyloKz1sLnNoaWZ0KCksdSs9bC5zaGlmdCgpLG8oaCx1KTt3PWgrbC5zaGlmdCgpLHg9dStsLnNoaWZ0KCksdj13K2wuc2hpZnQoKSxTPXgrbC5zaGlmdCgpLGg9ditsLnNoaWZ0KCksdT1TK2wuc2hpZnQoKSxjKHcseCx2LFMsaCx1KTticmVhaztjYXNlIDI2OmZvcihsLmxlbmd0aCUyJiYoaCs9bC5zaGlmdCgpKTtsLmxlbmd0aD4wOyl3PWgseD11K2wuc2hpZnQoKSx2PXcrbC5zaGlmdCgpLFM9eCtsLnNoaWZ0KCksaD12LHU9UytsLnNoaWZ0KCksYyh3LHgsdixTLGgsdSk7YnJlYWs7Y2FzZSAyNzpmb3IobC5sZW5ndGglMiYmKHUrPWwuc2hpZnQoKSk7bC5sZW5ndGg+MDspdz1oK2wuc2hpZnQoKSx4PXUsdj13K2wuc2hpZnQoKSxTPXgrbC5zaGlmdCgpLGg9ditsLnNoaWZ0KCksdT1TLGModyx4LHYsUyxoLHUpO2JyZWFrO2Nhc2UgMjg6bC5wdXNoKChnW3BdPDwyNHxnW3ArMV08PDE2KT4+MTYpLHArPTI7YnJlYWs7Y2FzZSAyOTpPPWwucG9wKCkrci5nc3VicnNCaWFzLEY9ci5nc3VicnNbT10sRiYmZShGKTticmVhaztjYXNlIDMwOmZvcig7bC5sZW5ndGg+MCYmKHc9aCx4PXUrbC5zaGlmdCgpLHY9dytsLnNoaWZ0KCksUz14K2wuc2hpZnQoKSxoPXYrbC5zaGlmdCgpLHU9UysoMT09PWwubGVuZ3RoP2wuc2hpZnQoKTowKSxjKHcseCx2LFMsaCx1KSwwIT09bC5sZW5ndGgpOyl3PWgrbC5zaGlmdCgpLHg9dSx2PXcrbC5zaGlmdCgpLFM9eCtsLnNoaWZ0KCksdT1TK2wuc2hpZnQoKSxoPXYrKDE9PT1sLmxlbmd0aD9sLnNoaWZ0KCk6MCksYyh3LHgsdixTLGgsdSk7YnJlYWs7Y2FzZSAzMTpmb3IoO2wubGVuZ3RoPjAmJih3PWgrbC5zaGlmdCgpLHg9dSx2PXcrbC5zaGlmdCgpLFM9eCtsLnNoaWZ0KCksdT1TK2wuc2hpZnQoKSxoPXYrKDE9PT1sLmxlbmd0aD9sLnNoaWZ0KCk6MCksYyh3LHgsdixTLGgsdSksMCE9PWwubGVuZ3RoKTspdz1oLHg9dStsLnNoaWZ0KCksdj13K2wuc2hpZnQoKSxTPXgrbC5zaGlmdCgpLGg9ditsLnNoaWZ0KCksdT1TKygxPT09bC5sZW5ndGg/bC5zaGlmdCgpOjApLGModyx4LHYsUyxoLHUpO2JyZWFrO2RlZmF1bHQ6aWYoVDwzMil0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigidW5rbm93biBvcGVyYXRvcjogIi5jb25jYXQoVCkpO1Q8MjQ3P2wucHVzaChULTEzOSk6VDwyNTE/bC5wdXNoKDI1NiooVC0yNDcpK2dbcCsrXSsxMDgpOlQ8MjU1P2wucHVzaCgyNTYqLShULTI1MSktZ1twKytdLTEwOCk6KGwucHVzaCgoZ1twXTw8MjR8Z1twKzFdPDwxNnxnW3ArMl08PDh8Z1twKzNdKS82NTUzNikscCs9NCl9SSYmKGwubGVuZ3RoPTApfX0oZSl9Y29uc3Qgdz1bXTtjbGFzcyB2e2NvbnN0cnVjdG9yKGUpe3RoaXMuY29uc3RydWN0b3I9PT12JiYoMCxuLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQ29tcGlsZWRGb250LiIpLHRoaXMuZm9udE1hdHJpeD1lLHRoaXMuY29tcGlsZWRHbHlwaHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWQ9T2JqZWN0LmNyZWF0ZShudWxsKX1nZXRQYXRoSnMoZSl7Y29uc3R7Y2hhckNvZGU6dCxnbHlwaElkOnJ9PW0odGhpcy5jbWFwLGUpO2xldCBuPXRoaXMuY29tcGlsZWRHbHlwaHNbcl07aWYoIW4pdHJ5e249dGhpcy5jb21waWxlR2x5cGgodGhpcy5nbHlwaHNbcl0sciksdGhpcy5jb21waWxlZEdseXBoc1tyXT1ufWNhdGNoKGUpe3Rocm93IHRoaXMuY29tcGlsZWRHbHlwaHNbcl09dyx2b2lkIDA9PT10aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbdF0mJih0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbdF09ciksZX1yZXR1cm4gdm9pZCAwPT09dGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW3RdJiYodGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW3RdPXIpLG59Y29tcGlsZUdseXBoKGUsdCl7aWYoIWV8fDA9PT1lLmxlbmd0aHx8MTQ9PT1lWzBdKXJldHVybiB3O2xldCByPXRoaXMuZm9udE1hdHJpeDtpZih0aGlzLmlzQ0ZGQ0lERm9udCl7Y29uc3QgZT10aGlzLmZkU2VsZWN0LmdldEZESW5kZXgodCk7ZT49MCYmZTx0aGlzLmZkQXJyYXkubGVuZ3RoP3I9dGhpcy5mZEFycmF5W2VdLmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpfHxuLkZPTlRfSURFTlRJVFlfTUFUUklYOigwLG4ud2FybikoIkludmFsaWQgZmQgaW5kZXggZm9yIGdseXBoIGluZGV4LiIpfWNvbnN0IGE9W3tjbWQ6InNhdmUifSx7Y21kOiJ0cmFuc2Zvcm0iLGFyZ3M6ci5zbGljZSgpfSx7Y21kOiJzY2FsZSIsYXJnczpbInNpemUiLCItc2l6ZSJdfV07cmV0dXJuIHRoaXMuY29tcGlsZUdseXBoSW1wbChlLGEsdCksYS5wdXNoKHtjbWQ6InJlc3RvcmUifSksYX1jb21waWxlR2x5cGhJbXBsKCl7KDAsbi51bnJlYWNoYWJsZSkoIkNoaWxkcmVuIGNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzLiIpfWhhc0J1aWx0UGF0aChlKXtjb25zdHtjaGFyQ29kZTp0LGdseXBoSWQ6cn09bSh0aGlzLmNtYXAsZSk7cmV0dXJuIHZvaWQgMCE9PXRoaXMuY29tcGlsZWRHbHlwaHNbcl0mJnZvaWQgMCE9PXRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFt0XX19Y2xhc3MgeCBleHRlbmRzIHZ7Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKHJ8fFs0ODhlLTYsMCwwLDQ4OGUtNiwwLDBdKSx0aGlzLmdseXBocz1lLHRoaXMuY21hcD10fWNvbXBpbGVHbHlwaEltcGwoZSx0KXtiKGUsdCx0aGlzKX19Y2xhc3MgUyBleHRlbmRzIHZ7Y29uc3RydWN0b3IoZSx0LHIsbil7c3VwZXIocnx8Wy4wMDEsMCwwLC4wMDEsMCwwXSksdGhpcy5nbHlwaHM9ZS5nbHlwaHMsdGhpcy5nc3VicnM9ZS5nc3VicnN8fFtdLHRoaXMuc3VicnM9ZS5zdWJyc3x8W10sdGhpcy5jbWFwPXQsdGhpcy5nbHlwaE5hbWVNYXA9bnx8KDAsaS5nZXRHbHlwaHNVbmljb2RlKSgpLHRoaXMuZ3N1YnJzQmlhcz1mKHRoaXMuZ3N1YnJzKSx0aGlzLnN1YnJzQmlhcz1mKHRoaXMuc3VicnMpLHRoaXMuaXNDRkZDSURGb250PWUuaXNDRkZDSURGb250LHRoaXMuZmRTZWxlY3Q9ZS5mZFNlbGVjdCx0aGlzLmZkQXJyYXk9ZS5mZEFycmF5fWNvbXBpbGVHbHlwaEltcGwoZSx0LHIpe3koZSx0LHRoaXMscil9fXQuRm9udFJlbmRlcmVyRmFjdG9yeT1jbGFzc3tzdGF0aWMgY3JlYXRlKGUsdCl7Y29uc3Qgcj1uZXcgVWludDhBcnJheShlLmRhdGEpO2xldCBhLGkscyxvLGgsdTtjb25zdCBkPWwociw0KTtmb3IobGV0IGU9MCxmPTEyO2U8ZDtlKyssZis9MTYpe2NvbnN0IGU9KDAsbi5ieXRlc1RvU3RyaW5nKShyLnN1YmFycmF5KGYsZis0KSksZD1jKHIsZis4KSxtPWMocixmKzEyKTtzd2l0Y2goZSl7Y2FzZSJjbWFwIjphPWcocixkKTticmVhaztjYXNlImdseWYiOmk9ci5zdWJhcnJheShkLGQrbSk7YnJlYWs7Y2FzZSJsb2NhIjpzPXIuc3ViYXJyYXkoZCxkK20pO2JyZWFrO2Nhc2UiaGVhZCI6dT1sKHIsZCsxOCksaD1sKHIsZCs1MCk7YnJlYWs7Y2FzZSJDRkYgIjpvPXAocixkLGQrbSx0KX19aWYoaSl7Y29uc3QgdD11P1sxL3UsMCwwLDEvdSwwLDBdOmUuZm9udE1hdHJpeDtyZXR1cm4gbmV3IHgoZnVuY3Rpb24oZSx0LHIpe2xldCBuLGE7cj8obj00LGE9Yyk6KG49MixhPShlLHQpPT4yKmwoZSx0KSk7Y29uc3QgaT1bXTtsZXQgcz1hKHQsMCk7Zm9yKGxldCByPW47cjx0Lmxlbmd0aDtyKz1uKXtjb25zdCBuPWEodCxyKTtpLnB1c2goZS5zdWJhcnJheShzLG4pKSxzPW59cmV0dXJuIGl9KGkscyxoKSxhLHQpfXJldHVybiBuZXcgUyhvLGEsZS5mb250TWF0cml4LGUuZ2x5cGhOYW1lTWFwKX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0TWV0cmljcz10LmdldEZvbnRCYXNpY01ldHJpY3M9dm9pZCAwO3ZhciBuPXIoMTQ5KTtjb25zdCBhPSgwLG4uZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5Db3VyaWVyPTYwMCxlWyJDb3VyaWVyLUJvbGQiXT02MDAsZVsiQ291cmllci1Cb2xkT2JsaXF1ZSJdPTYwMCxlWyJDb3VyaWVyLU9ibGlxdWUiXT02MDAsZS5IZWx2ZXRpY2E9KDAsbi5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnNwYWNlPTI3OCxlLmV4Y2xhbT0yNzgsZS5xdW90ZWRibD0zNTUsZS5udW1iZXJzaWduPTU1NixlLmRvbGxhcj01NTYsZS5wZXJjZW50PTg4OSxlLmFtcGVyc2FuZD02NjcsZS5xdW90ZXJpZ2h0PTIyMixlLnBhcmVubGVmdD0zMzMsZS5wYXJlbnJpZ2h0PTMzMyxlLmFzdGVyaXNrPTM4OSxlLnBsdXM9NTg0LGUuY29tbWE9Mjc4LGUuaHlwaGVuPTMzMyxlLnBlcmlvZD0yNzgsZS5zbGFzaD0yNzgsZS56ZXJvPTU1NixlLm9uZT01NTYsZS50d289NTU2LGUudGhyZWU9NTU2LGUuZm91cj01NTYsZS5maXZlPTU1NixlLnNpeD01NTYsZS5zZXZlbj01NTYsZS5laWdodD01NTYsZS5uaW5lPTU1NixlLmNvbG9uPTI3OCxlLnNlbWljb2xvbj0yNzgsZS5sZXNzPTU4NCxlLmVxdWFsPTU4NCxlLmdyZWF0ZXI9NTg0LGUucXVlc3Rpb249NTU2LGUuYXQ9MTAxNSxlLkE9NjY3LGUuQj02NjcsZS5DPTcyMixlLkQ9NzIyLGUuRT02NjcsZS5GPTYxMSxlLkc9Nzc4LGUuSD03MjIsZS5JPTI3OCxlLko9NTAwLGUuSz02NjcsZS5MPTU1NixlLk09ODMzLGUuTj03MjIsZS5PPTc3OCxlLlA9NjY3LGUuUT03NzgsZS5SPTcyMixlLlM9NjY3LGUuVD02MTEsZS5VPTcyMixlLlY9NjY3LGUuVz05NDQsZS5YPTY2NyxlLlk9NjY3LGUuWj02MTEsZS5icmFja2V0bGVmdD0yNzgsZS5iYWNrc2xhc2g9Mjc4LGUuYnJhY2tldHJpZ2h0PTI3OCxlLmFzY2lpY2lyY3VtPTQ2OSxlLnVuZGVyc2NvcmU9NTU2LGUucXVvdGVsZWZ0PTIyMixlLmE9NTU2LGUuYj01NTYsZS5jPTUwMCxlLmQ9NTU2LGUuZT01NTYsZS5mPTI3OCxlLmc9NTU2LGUuaD01NTYsZS5pPTIyMixlLmo9MjIyLGUuaz01MDAsZS5sPTIyMixlLm09ODMzLGUubj01NTYsZS5vPTU1NixlLnA9NTU2LGUucT01NTYsZS5yPTMzMyxlLnM9NTAwLGUudD0yNzgsZS51PTU1NixlLnY9NTAwLGUudz03MjIsZS54PTUwMCxlLnk9NTAwLGUuej01MDAsZS5icmFjZWxlZnQ9MzM0LGUuYmFyPTI2MCxlLmJyYWNlcmlnaHQ9MzM0LGUuYXNjaWl0aWxkZT01ODQsZS5leGNsYW1kb3duPTMzMyxlLmNlbnQ9NTU2LGUuc3Rlcmxpbmc9NTU2LGUuZnJhY3Rpb249MTY3LGUueWVuPTU1NixlLmZsb3Jpbj01NTYsZS5zZWN0aW9uPTU1NixlLmN1cnJlbmN5PTU1NixlLnF1b3Rlc2luZ2xlPTE5MSxlLnF1b3RlZGJsbGVmdD0zMzMsZS5ndWlsbGVtb3RsZWZ0PTU1NixlLmd1aWxzaW5nbGxlZnQ9MzMzLGUuZ3VpbHNpbmdscmlnaHQ9MzMzLGUuZmk9NTAwLGUuZmw9NTAwLGUuZW5kYXNoPTU1NixlLmRhZ2dlcj01NTYsZS5kYWdnZXJkYmw9NTU2LGUucGVyaW9kY2VudGVyZWQ9Mjc4LGUucGFyYWdyYXBoPTUzNyxlLmJ1bGxldD0zNTAsZS5xdW90ZXNpbmdsYmFzZT0yMjIsZS5xdW90ZWRibGJhc2U9MzMzLGUucXVvdGVkYmxyaWdodD0zMzMsZS5ndWlsbGVtb3RyaWdodD01NTYsZS5lbGxpcHNpcz0xZTMsZS5wZXJ0aG91c2FuZD0xZTMsZS5xdWVzdGlvbmRvd249NjExLGUuZ3JhdmU9MzMzLGUuYWN1dGU9MzMzLGUuY2lyY3VtZmxleD0zMzMsZS50aWxkZT0zMzMsZS5tYWNyb249MzMzLGUuYnJldmU9MzMzLGUuZG90YWNjZW50PTMzMyxlLmRpZXJlc2lzPTMzMyxlLnJpbmc9MzMzLGUuY2VkaWxsYT0zMzMsZS5odW5nYXJ1bWxhdXQ9MzMzLGUub2dvbmVrPTMzMyxlLmNhcm9uPTMzMyxlLmVtZGFzaD0xZTMsZS5BRT0xZTMsZS5vcmRmZW1pbmluZT0zNzAsZS5Mc2xhc2g9NTU2LGUuT3NsYXNoPTc3OCxlLk9FPTFlMyxlLm9yZG1hc2N1bGluZT0zNjUsZS5hZT04ODksZS5kb3RsZXNzaT0yNzgsZS5sc2xhc2g9MjIyLGUub3NsYXNoPTYxMSxlLm9lPTk0NCxlLmdlcm1hbmRibHM9NjExLGUuSWRpZXJlc2lzPTI3OCxlLmVhY3V0ZT01NTYsZS5hYnJldmU9NTU2LGUudWh1bmdhcnVtbGF1dD01NTYsZS5lY2Fyb249NTU2LGUuWWRpZXJlc2lzPTY2NyxlLmRpdmlkZT01ODQsZS5ZYWN1dGU9NjY3LGUuQWNpcmN1bWZsZXg9NjY3LGUuYWFjdXRlPTU1NixlLlVjaXJjdW1mbGV4PTcyMixlLnlhY3V0ZT01MDAsZS5zY29tbWFhY2NlbnQ9NTAwLGUuZWNpcmN1bWZsZXg9NTU2LGUuVXJpbmc9NzIyLGUuVWRpZXJlc2lzPTcyMixlLmFvZ29uZWs9NTU2LGUuVWFjdXRlPTcyMixlLnVvZ29uZWs9NTU2LGUuRWRpZXJlc2lzPTY2NyxlLkRjcm9hdD03MjIsZS5jb21tYWFjY2VudD0yNTAsZS5jb3B5cmlnaHQ9NzM3LGUuRW1hY3Jvbj02NjcsZS5jY2Fyb249NTAwLGUuYXJpbmc9NTU2LGUuTmNvbW1hYWNjZW50PTcyMixlLmxhY3V0ZT0yMjIsZS5hZ3JhdmU9NTU2LGUuVGNvbW1hYWNjZW50PTYxMSxlLkNhY3V0ZT03MjIsZS5hdGlsZGU9NTU2LGUuRWRvdGFjY2VudD02NjcsZS5zY2Fyb249NTAwLGUuc2NlZGlsbGE9NTAwLGUuaWFjdXRlPTI3OCxlLmxvemVuZ2U9NDcxLGUuUmNhcm9uPTcyMixlLkdjb21tYWFjY2VudD03NzgsZS51Y2lyY3VtZmxleD01NTYsZS5hY2lyY3VtZmxleD01NTYsZS5BbWFjcm9uPTY2NyxlLnJjYXJvbj0zMzMsZS5jY2VkaWxsYT01MDAsZS5aZG90YWNjZW50PTYxMSxlLlRob3JuPTY2NyxlLk9tYWNyb249Nzc4LGUuUmFjdXRlPTcyMixlLlNhY3V0ZT02NjcsZS5kY2Fyb249NjQzLGUuVW1hY3Jvbj03MjIsZS51cmluZz01NTYsZS50aHJlZXN1cGVyaW9yPTMzMyxlLk9ncmF2ZT03NzgsZS5BZ3JhdmU9NjY3LGUuQWJyZXZlPTY2NyxlLm11bHRpcGx5PTU4NCxlLnVhY3V0ZT01NTYsZS5UY2Fyb249NjExLGUucGFydGlhbGRpZmY9NDc2LGUueWRpZXJlc2lzPTUwMCxlLk5hY3V0ZT03MjIsZS5pY2lyY3VtZmxleD0yNzgsZS5FY2lyY3VtZmxleD02NjcsZS5hZGllcmVzaXM9NTU2LGUuZWRpZXJlc2lzPTU1NixlLmNhY3V0ZT01MDAsZS5uYWN1dGU9NTU2LGUudW1hY3Jvbj01NTYsZS5OY2Fyb249NzIyLGUuSWFjdXRlPTI3OCxlLnBsdXNtaW51cz01ODQsZS5icm9rZW5iYXI9MjYwLGUucmVnaXN0ZXJlZD03MzcsZS5HYnJldmU9Nzc4LGUuSWRvdGFjY2VudD0yNzgsZS5zdW1tYXRpb249NjAwLGUuRWdyYXZlPTY2NyxlLnJhY3V0ZT0zMzMsZS5vbWFjcm9uPTU1NixlLlphY3V0ZT02MTEsZS5aY2Fyb249NjExLGUuZ3JlYXRlcmVxdWFsPTU0OSxlLkV0aD03MjIsZS5DY2VkaWxsYT03MjIsZS5sY29tbWFhY2NlbnQ9MjIyLGUudGNhcm9uPTMxNyxlLmVvZ29uZWs9NTU2LGUuVW9nb25laz03MjIsZS5BYWN1dGU9NjY3LGUuQWRpZXJlc2lzPTY2NyxlLmVncmF2ZT01NTYsZS56YWN1dGU9NTAwLGUuaW9nb25laz0yMjIsZS5PYWN1dGU9Nzc4LGUub2FjdXRlPTU1NixlLmFtYWNyb249NTU2LGUuc2FjdXRlPTUwMCxlLmlkaWVyZXNpcz0yNzgsZS5PY2lyY3VtZmxleD03NzgsZS5VZ3JhdmU9NzIyLGUuRGVsdGE9NjEyLGUudGhvcm49NTU2LGUudHdvc3VwZXJpb3I9MzMzLGUuT2RpZXJlc2lzPTc3OCxlLm11PTU1NixlLmlncmF2ZT0yNzgsZS5vaHVuZ2FydW1sYXV0PTU1NixlLkVvZ29uZWs9NjY3LGUuZGNyb2F0PTU1NixlLnRocmVlcXVhcnRlcnM9ODM0LGUuU2NlZGlsbGE9NjY3LGUubGNhcm9uPTI5OSxlLktjb21tYWFjY2VudD02NjcsZS5MYWN1dGU9NTU2LGUudHJhZGVtYXJrPTFlMyxlLmVkb3RhY2NlbnQ9NTU2LGUuSWdyYXZlPTI3OCxlLkltYWNyb249Mjc4LGUuTGNhcm9uPTU1NixlLm9uZWhhbGY9ODM0LGUubGVzc2VxdWFsPTU0OSxlLm9jaXJjdW1mbGV4PTU1NixlLm50aWxkZT01NTYsZS5VaHVuZ2FydW1sYXV0PTcyMixlLkVhY3V0ZT02NjcsZS5lbWFjcm9uPTU1NixlLmdicmV2ZT01NTYsZS5vbmVxdWFydGVyPTgzNCxlLlNjYXJvbj02NjcsZS5TY29tbWFhY2NlbnQ9NjY3LGUuT2h1bmdhcnVtbGF1dD03NzgsZS5kZWdyZWU9NDAwLGUub2dyYXZlPTU1NixlLkNjYXJvbj03MjIsZS51Z3JhdmU9NTU2LGUucmFkaWNhbD00NTMsZS5EY2Fyb249NzIyLGUucmNvbW1hYWNjZW50PTMzMyxlLk50aWxkZT03MjIsZS5vdGlsZGU9NTU2LGUuUmNvbW1hYWNjZW50PTcyMixlLkxjb21tYWFjY2VudD01NTYsZS5BdGlsZGU9NjY3LGUuQW9nb25laz02NjcsZS5BcmluZz02NjcsZS5PdGlsZGU9Nzc4LGUuemRvdGFjY2VudD01MDAsZS5FY2Fyb249NjY3LGUuSW9nb25laz0yNzgsZS5rY29tbWFhY2NlbnQ9NTAwLGUubWludXM9NTg0LGUuSWNpcmN1bWZsZXg9Mjc4LGUubmNhcm9uPTU1NixlLnRjb21tYWFjY2VudD0yNzgsZS5sb2dpY2Fsbm90PTU4NCxlLm9kaWVyZXNpcz01NTYsZS51ZGllcmVzaXM9NTU2LGUubm90ZXF1YWw9NTQ5LGUuZ2NvbW1hYWNjZW50PTU1NixlLmV0aD01NTYsZS56Y2Fyb249NTAwLGUubmNvbW1hYWNjZW50PTU1NixlLm9uZXN1cGVyaW9yPTMzMyxlLmltYWNyb249Mjc4LGUuRXVybz01NTZ9KSksZVsiSGVsdmV0aWNhLUJvbGQiXT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9Mjc4LGUuZXhjbGFtPTMzMyxlLnF1b3RlZGJsPTQ3NCxlLm51bWJlcnNpZ249NTU2LGUuZG9sbGFyPTU1NixlLnBlcmNlbnQ9ODg5LGUuYW1wZXJzYW5kPTcyMixlLnF1b3RlcmlnaHQ9Mjc4LGUucGFyZW5sZWZ0PTMzMyxlLnBhcmVucmlnaHQ9MzMzLGUuYXN0ZXJpc2s9Mzg5LGUucGx1cz01ODQsZS5jb21tYT0yNzgsZS5oeXBoZW49MzMzLGUucGVyaW9kPTI3OCxlLnNsYXNoPTI3OCxlLnplcm89NTU2LGUub25lPTU1NixlLnR3bz01NTYsZS50aHJlZT01NTYsZS5mb3VyPTU1NixlLmZpdmU9NTU2LGUuc2l4PTU1NixlLnNldmVuPTU1NixlLmVpZ2h0PTU1NixlLm5pbmU9NTU2LGUuY29sb249MzMzLGUuc2VtaWNvbG9uPTMzMyxlLmxlc3M9NTg0LGUuZXF1YWw9NTg0LGUuZ3JlYXRlcj01ODQsZS5xdWVzdGlvbj02MTEsZS5hdD05NzUsZS5BPTcyMixlLkI9NzIyLGUuQz03MjIsZS5EPTcyMixlLkU9NjY3LGUuRj02MTEsZS5HPTc3OCxlLkg9NzIyLGUuST0yNzgsZS5KPTU1NixlLks9NzIyLGUuTD02MTEsZS5NPTgzMyxlLk49NzIyLGUuTz03NzgsZS5QPTY2NyxlLlE9Nzc4LGUuUj03MjIsZS5TPTY2NyxlLlQ9NjExLGUuVT03MjIsZS5WPTY2NyxlLlc9OTQ0LGUuWD02NjcsZS5ZPTY2NyxlLlo9NjExLGUuYnJhY2tldGxlZnQ9MzMzLGUuYmFja3NsYXNoPTI3OCxlLmJyYWNrZXRyaWdodD0zMzMsZS5hc2NpaWNpcmN1bT01ODQsZS51bmRlcnNjb3JlPTU1NixlLnF1b3RlbGVmdD0yNzgsZS5hPTU1NixlLmI9NjExLGUuYz01NTYsZS5kPTYxMSxlLmU9NTU2LGUuZj0zMzMsZS5nPTYxMSxlLmg9NjExLGUuaT0yNzgsZS5qPTI3OCxlLms9NTU2LGUubD0yNzgsZS5tPTg4OSxlLm49NjExLGUubz02MTEsZS5wPTYxMSxlLnE9NjExLGUucj0zODksZS5zPTU1NixlLnQ9MzMzLGUudT02MTEsZS52PTU1NixlLnc9Nzc4LGUueD01NTYsZS55PTU1NixlLno9NTAwLGUuYnJhY2VsZWZ0PTM4OSxlLmJhcj0yODAsZS5icmFjZXJpZ2h0PTM4OSxlLmFzY2lpdGlsZGU9NTg0LGUuZXhjbGFtZG93bj0zMzMsZS5jZW50PTU1NixlLnN0ZXJsaW5nPTU1NixlLmZyYWN0aW9uPTE2NyxlLnllbj01NTYsZS5mbG9yaW49NTU2LGUuc2VjdGlvbj01NTYsZS5jdXJyZW5jeT01NTYsZS5xdW90ZXNpbmdsZT0yMzgsZS5xdW90ZWRibGxlZnQ9NTAwLGUuZ3VpbGxlbW90bGVmdD01NTYsZS5ndWlsc2luZ2xsZWZ0PTMzMyxlLmd1aWxzaW5nbHJpZ2h0PTMzMyxlLmZpPTYxMSxlLmZsPTYxMSxlLmVuZGFzaD01NTYsZS5kYWdnZXI9NTU2LGUuZGFnZ2VyZGJsPTU1NixlLnBlcmlvZGNlbnRlcmVkPTI3OCxlLnBhcmFncmFwaD01NTYsZS5idWxsZXQ9MzUwLGUucXVvdGVzaW5nbGJhc2U9Mjc4LGUucXVvdGVkYmxiYXNlPTUwMCxlLnF1b3RlZGJscmlnaHQ9NTAwLGUuZ3VpbGxlbW90cmlnaHQ9NTU2LGUuZWxsaXBzaXM9MWUzLGUucGVydGhvdXNhbmQ9MWUzLGUucXVlc3Rpb25kb3duPTYxMSxlLmdyYXZlPTMzMyxlLmFjdXRlPTMzMyxlLmNpcmN1bWZsZXg9MzMzLGUudGlsZGU9MzMzLGUubWFjcm9uPTMzMyxlLmJyZXZlPTMzMyxlLmRvdGFjY2VudD0zMzMsZS5kaWVyZXNpcz0zMzMsZS5yaW5nPTMzMyxlLmNlZGlsbGE9MzMzLGUuaHVuZ2FydW1sYXV0PTMzMyxlLm9nb25laz0zMzMsZS5jYXJvbj0zMzMsZS5lbWRhc2g9MWUzLGUuQUU9MWUzLGUub3JkZmVtaW5pbmU9MzcwLGUuTHNsYXNoPTYxMSxlLk9zbGFzaD03NzgsZS5PRT0xZTMsZS5vcmRtYXNjdWxpbmU9MzY1LGUuYWU9ODg5LGUuZG90bGVzc2k9Mjc4LGUubHNsYXNoPTI3OCxlLm9zbGFzaD02MTEsZS5vZT05NDQsZS5nZXJtYW5kYmxzPTYxMSxlLklkaWVyZXNpcz0yNzgsZS5lYWN1dGU9NTU2LGUuYWJyZXZlPTU1NixlLnVodW5nYXJ1bWxhdXQ9NjExLGUuZWNhcm9uPTU1NixlLllkaWVyZXNpcz02NjcsZS5kaXZpZGU9NTg0LGUuWWFjdXRlPTY2NyxlLkFjaXJjdW1mbGV4PTcyMixlLmFhY3V0ZT01NTYsZS5VY2lyY3VtZmxleD03MjIsZS55YWN1dGU9NTU2LGUuc2NvbW1hYWNjZW50PTU1NixlLmVjaXJjdW1mbGV4PTU1NixlLlVyaW5nPTcyMixlLlVkaWVyZXNpcz03MjIsZS5hb2dvbmVrPTU1NixlLlVhY3V0ZT03MjIsZS51b2dvbmVrPTYxMSxlLkVkaWVyZXNpcz02NjcsZS5EY3JvYXQ9NzIyLGUuY29tbWFhY2NlbnQ9MjUwLGUuY29weXJpZ2h0PTczNyxlLkVtYWNyb249NjY3LGUuY2Nhcm9uPTU1NixlLmFyaW5nPTU1NixlLk5jb21tYWFjY2VudD03MjIsZS5sYWN1dGU9Mjc4LGUuYWdyYXZlPTU1NixlLlRjb21tYWFjY2VudD02MTEsZS5DYWN1dGU9NzIyLGUuYXRpbGRlPTU1NixlLkVkb3RhY2NlbnQ9NjY3LGUuc2Nhcm9uPTU1NixlLnNjZWRpbGxhPTU1NixlLmlhY3V0ZT0yNzgsZS5sb3plbmdlPTQ5NCxlLlJjYXJvbj03MjIsZS5HY29tbWFhY2NlbnQ9Nzc4LGUudWNpcmN1bWZsZXg9NjExLGUuYWNpcmN1bWZsZXg9NTU2LGUuQW1hY3Jvbj03MjIsZS5yY2Fyb249Mzg5LGUuY2NlZGlsbGE9NTU2LGUuWmRvdGFjY2VudD02MTEsZS5UaG9ybj02NjcsZS5PbWFjcm9uPTc3OCxlLlJhY3V0ZT03MjIsZS5TYWN1dGU9NjY3LGUuZGNhcm9uPTc0MyxlLlVtYWNyb249NzIyLGUudXJpbmc9NjExLGUudGhyZWVzdXBlcmlvcj0zMzMsZS5PZ3JhdmU9Nzc4LGUuQWdyYXZlPTcyMixlLkFicmV2ZT03MjIsZS5tdWx0aXBseT01ODQsZS51YWN1dGU9NjExLGUuVGNhcm9uPTYxMSxlLnBhcnRpYWxkaWZmPTQ5NCxlLnlkaWVyZXNpcz01NTYsZS5OYWN1dGU9NzIyLGUuaWNpcmN1bWZsZXg9Mjc4LGUuRWNpcmN1bWZsZXg9NjY3LGUuYWRpZXJlc2lzPTU1NixlLmVkaWVyZXNpcz01NTYsZS5jYWN1dGU9NTU2LGUubmFjdXRlPTYxMSxlLnVtYWNyb249NjExLGUuTmNhcm9uPTcyMixlLklhY3V0ZT0yNzgsZS5wbHVzbWludXM9NTg0LGUuYnJva2VuYmFyPTI4MCxlLnJlZ2lzdGVyZWQ9NzM3LGUuR2JyZXZlPTc3OCxlLklkb3RhY2NlbnQ9Mjc4LGUuc3VtbWF0aW9uPTYwMCxlLkVncmF2ZT02NjcsZS5yYWN1dGU9Mzg5LGUub21hY3Jvbj02MTEsZS5aYWN1dGU9NjExLGUuWmNhcm9uPTYxMSxlLmdyZWF0ZXJlcXVhbD01NDksZS5FdGg9NzIyLGUuQ2NlZGlsbGE9NzIyLGUubGNvbW1hYWNjZW50PTI3OCxlLnRjYXJvbj0zODksZS5lb2dvbmVrPTU1NixlLlVvZ29uZWs9NzIyLGUuQWFjdXRlPTcyMixlLkFkaWVyZXNpcz03MjIsZS5lZ3JhdmU9NTU2LGUuemFjdXRlPTUwMCxlLmlvZ29uZWs9Mjc4LGUuT2FjdXRlPTc3OCxlLm9hY3V0ZT02MTEsZS5hbWFjcm9uPTU1NixlLnNhY3V0ZT01NTYsZS5pZGllcmVzaXM9Mjc4LGUuT2NpcmN1bWZsZXg9Nzc4LGUuVWdyYXZlPTcyMixlLkRlbHRhPTYxMixlLnRob3JuPTYxMSxlLnR3b3N1cGVyaW9yPTMzMyxlLk9kaWVyZXNpcz03NzgsZS5tdT02MTEsZS5pZ3JhdmU9Mjc4LGUub2h1bmdhcnVtbGF1dD02MTEsZS5Fb2dvbmVrPTY2NyxlLmRjcm9hdD02MTEsZS50aHJlZXF1YXJ0ZXJzPTgzNCxlLlNjZWRpbGxhPTY2NyxlLmxjYXJvbj00MDAsZS5LY29tbWFhY2NlbnQ9NzIyLGUuTGFjdXRlPTYxMSxlLnRyYWRlbWFyaz0xZTMsZS5lZG90YWNjZW50PTU1NixlLklncmF2ZT0yNzgsZS5JbWFjcm9uPTI3OCxlLkxjYXJvbj02MTEsZS5vbmVoYWxmPTgzNCxlLmxlc3NlcXVhbD01NDksZS5vY2lyY3VtZmxleD02MTEsZS5udGlsZGU9NjExLGUuVWh1bmdhcnVtbGF1dD03MjIsZS5FYWN1dGU9NjY3LGUuZW1hY3Jvbj01NTYsZS5nYnJldmU9NjExLGUub25lcXVhcnRlcj04MzQsZS5TY2Fyb249NjY3LGUuU2NvbW1hYWNjZW50PTY2NyxlLk9odW5nYXJ1bWxhdXQ9Nzc4LGUuZGVncmVlPTQwMCxlLm9ncmF2ZT02MTEsZS5DY2Fyb249NzIyLGUudWdyYXZlPTYxMSxlLnJhZGljYWw9NTQ5LGUuRGNhcm9uPTcyMixlLnJjb21tYWFjY2VudD0zODksZS5OdGlsZGU9NzIyLGUub3RpbGRlPTYxMSxlLlJjb21tYWFjY2VudD03MjIsZS5MY29tbWFhY2NlbnQ9NjExLGUuQXRpbGRlPTcyMixlLkFvZ29uZWs9NzIyLGUuQXJpbmc9NzIyLGUuT3RpbGRlPTc3OCxlLnpkb3RhY2NlbnQ9NTAwLGUuRWNhcm9uPTY2NyxlLklvZ29uZWs9Mjc4LGUua2NvbW1hYWNjZW50PTU1NixlLm1pbnVzPTU4NCxlLkljaXJjdW1mbGV4PTI3OCxlLm5jYXJvbj02MTEsZS50Y29tbWFhY2NlbnQ9MzMzLGUubG9naWNhbG5vdD01ODQsZS5vZGllcmVzaXM9NjExLGUudWRpZXJlc2lzPTYxMSxlLm5vdGVxdWFsPTU0OSxlLmdjb21tYWFjY2VudD02MTEsZS5ldGg9NjExLGUuemNhcm9uPTUwMCxlLm5jb21tYWFjY2VudD02MTEsZS5vbmVzdXBlcmlvcj0zMzMsZS5pbWFjcm9uPTI3OCxlLkV1cm89NTU2fSkpLGVbIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJdPSgwLG4uZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5zcGFjZT0yNzgsZS5leGNsYW09MzMzLGUucXVvdGVkYmw9NDc0LGUubnVtYmVyc2lnbj01NTYsZS5kb2xsYXI9NTU2LGUucGVyY2VudD04ODksZS5hbXBlcnNhbmQ9NzIyLGUucXVvdGVyaWdodD0yNzgsZS5wYXJlbmxlZnQ9MzMzLGUucGFyZW5yaWdodD0zMzMsZS5hc3Rlcmlzaz0zODksZS5wbHVzPTU4NCxlLmNvbW1hPTI3OCxlLmh5cGhlbj0zMzMsZS5wZXJpb2Q9Mjc4LGUuc2xhc2g9Mjc4LGUuemVybz01NTYsZS5vbmU9NTU2LGUudHdvPTU1NixlLnRocmVlPTU1NixlLmZvdXI9NTU2LGUuZml2ZT01NTYsZS5zaXg9NTU2LGUuc2V2ZW49NTU2LGUuZWlnaHQ9NTU2LGUubmluZT01NTYsZS5jb2xvbj0zMzMsZS5zZW1pY29sb249MzMzLGUubGVzcz01ODQsZS5lcXVhbD01ODQsZS5ncmVhdGVyPTU4NCxlLnF1ZXN0aW9uPTYxMSxlLmF0PTk3NSxlLkE9NzIyLGUuQj03MjIsZS5DPTcyMixlLkQ9NzIyLGUuRT02NjcsZS5GPTYxMSxlLkc9Nzc4LGUuSD03MjIsZS5JPTI3OCxlLko9NTU2LGUuSz03MjIsZS5MPTYxMSxlLk09ODMzLGUuTj03MjIsZS5PPTc3OCxlLlA9NjY3LGUuUT03NzgsZS5SPTcyMixlLlM9NjY3LGUuVD02MTEsZS5VPTcyMixlLlY9NjY3LGUuVz05NDQsZS5YPTY2NyxlLlk9NjY3LGUuWj02MTEsZS5icmFja2V0bGVmdD0zMzMsZS5iYWNrc2xhc2g9Mjc4LGUuYnJhY2tldHJpZ2h0PTMzMyxlLmFzY2lpY2lyY3VtPTU4NCxlLnVuZGVyc2NvcmU9NTU2LGUucXVvdGVsZWZ0PTI3OCxlLmE9NTU2LGUuYj02MTEsZS5jPTU1NixlLmQ9NjExLGUuZT01NTYsZS5mPTMzMyxlLmc9NjExLGUuaD02MTEsZS5pPTI3OCxlLmo9Mjc4LGUuaz01NTYsZS5sPTI3OCxlLm09ODg5LGUubj02MTEsZS5vPTYxMSxlLnA9NjExLGUucT02MTEsZS5yPTM4OSxlLnM9NTU2LGUudD0zMzMsZS51PTYxMSxlLnY9NTU2LGUudz03NzgsZS54PTU1NixlLnk9NTU2LGUuej01MDAsZS5icmFjZWxlZnQ9Mzg5LGUuYmFyPTI4MCxlLmJyYWNlcmlnaHQ9Mzg5LGUuYXNjaWl0aWxkZT01ODQsZS5leGNsYW1kb3duPTMzMyxlLmNlbnQ9NTU2LGUuc3Rlcmxpbmc9NTU2LGUuZnJhY3Rpb249MTY3LGUueWVuPTU1NixlLmZsb3Jpbj01NTYsZS5zZWN0aW9uPTU1NixlLmN1cnJlbmN5PTU1NixlLnF1b3Rlc2luZ2xlPTIzOCxlLnF1b3RlZGJsbGVmdD01MDAsZS5ndWlsbGVtb3RsZWZ0PTU1NixlLmd1aWxzaW5nbGxlZnQ9MzMzLGUuZ3VpbHNpbmdscmlnaHQ9MzMzLGUuZmk9NjExLGUuZmw9NjExLGUuZW5kYXNoPTU1NixlLmRhZ2dlcj01NTYsZS5kYWdnZXJkYmw9NTU2LGUucGVyaW9kY2VudGVyZWQ9Mjc4LGUucGFyYWdyYXBoPTU1NixlLmJ1bGxldD0zNTAsZS5xdW90ZXNpbmdsYmFzZT0yNzgsZS5xdW90ZWRibGJhc2U9NTAwLGUucXVvdGVkYmxyaWdodD01MDAsZS5ndWlsbGVtb3RyaWdodD01NTYsZS5lbGxpcHNpcz0xZTMsZS5wZXJ0aG91c2FuZD0xZTMsZS5xdWVzdGlvbmRvd249NjExLGUuZ3JhdmU9MzMzLGUuYWN1dGU9MzMzLGUuY2lyY3VtZmxleD0zMzMsZS50aWxkZT0zMzMsZS5tYWNyb249MzMzLGUuYnJldmU9MzMzLGUuZG90YWNjZW50PTMzMyxlLmRpZXJlc2lzPTMzMyxlLnJpbmc9MzMzLGUuY2VkaWxsYT0zMzMsZS5odW5nYXJ1bWxhdXQ9MzMzLGUub2dvbmVrPTMzMyxlLmNhcm9uPTMzMyxlLmVtZGFzaD0xZTMsZS5BRT0xZTMsZS5vcmRmZW1pbmluZT0zNzAsZS5Mc2xhc2g9NjExLGUuT3NsYXNoPTc3OCxlLk9FPTFlMyxlLm9yZG1hc2N1bGluZT0zNjUsZS5hZT04ODksZS5kb3RsZXNzaT0yNzgsZS5sc2xhc2g9Mjc4LGUub3NsYXNoPTYxMSxlLm9lPTk0NCxlLmdlcm1hbmRibHM9NjExLGUuSWRpZXJlc2lzPTI3OCxlLmVhY3V0ZT01NTYsZS5hYnJldmU9NTU2LGUudWh1bmdhcnVtbGF1dD02MTEsZS5lY2Fyb249NTU2LGUuWWRpZXJlc2lzPTY2NyxlLmRpdmlkZT01ODQsZS5ZYWN1dGU9NjY3LGUuQWNpcmN1bWZsZXg9NzIyLGUuYWFjdXRlPTU1NixlLlVjaXJjdW1mbGV4PTcyMixlLnlhY3V0ZT01NTYsZS5zY29tbWFhY2NlbnQ9NTU2LGUuZWNpcmN1bWZsZXg9NTU2LGUuVXJpbmc9NzIyLGUuVWRpZXJlc2lzPTcyMixlLmFvZ29uZWs9NTU2LGUuVWFjdXRlPTcyMixlLnVvZ29uZWs9NjExLGUuRWRpZXJlc2lzPTY2NyxlLkRjcm9hdD03MjIsZS5jb21tYWFjY2VudD0yNTAsZS5jb3B5cmlnaHQ9NzM3LGUuRW1hY3Jvbj02NjcsZS5jY2Fyb249NTU2LGUuYXJpbmc9NTU2LGUuTmNvbW1hYWNjZW50PTcyMixlLmxhY3V0ZT0yNzgsZS5hZ3JhdmU9NTU2LGUuVGNvbW1hYWNjZW50PTYxMSxlLkNhY3V0ZT03MjIsZS5hdGlsZGU9NTU2LGUuRWRvdGFjY2VudD02NjcsZS5zY2Fyb249NTU2LGUuc2NlZGlsbGE9NTU2LGUuaWFjdXRlPTI3OCxlLmxvemVuZ2U9NDk0LGUuUmNhcm9uPTcyMixlLkdjb21tYWFjY2VudD03NzgsZS51Y2lyY3VtZmxleD02MTEsZS5hY2lyY3VtZmxleD01NTYsZS5BbWFjcm9uPTcyMixlLnJjYXJvbj0zODksZS5jY2VkaWxsYT01NTYsZS5aZG90YWNjZW50PTYxMSxlLlRob3JuPTY2NyxlLk9tYWNyb249Nzc4LGUuUmFjdXRlPTcyMixlLlNhY3V0ZT02NjcsZS5kY2Fyb249NzQzLGUuVW1hY3Jvbj03MjIsZS51cmluZz02MTEsZS50aHJlZXN1cGVyaW9yPTMzMyxlLk9ncmF2ZT03NzgsZS5BZ3JhdmU9NzIyLGUuQWJyZXZlPTcyMixlLm11bHRpcGx5PTU4NCxlLnVhY3V0ZT02MTEsZS5UY2Fyb249NjExLGUucGFydGlhbGRpZmY9NDk0LGUueWRpZXJlc2lzPTU1NixlLk5hY3V0ZT03MjIsZS5pY2lyY3VtZmxleD0yNzgsZS5FY2lyY3VtZmxleD02NjcsZS5hZGllcmVzaXM9NTU2LGUuZWRpZXJlc2lzPTU1NixlLmNhY3V0ZT01NTYsZS5uYWN1dGU9NjExLGUudW1hY3Jvbj02MTEsZS5OY2Fyb249NzIyLGUuSWFjdXRlPTI3OCxlLnBsdXNtaW51cz01ODQsZS5icm9rZW5iYXI9MjgwLGUucmVnaXN0ZXJlZD03MzcsZS5HYnJldmU9Nzc4LGUuSWRvdGFjY2VudD0yNzgsZS5zdW1tYXRpb249NjAwLGUuRWdyYXZlPTY2NyxlLnJhY3V0ZT0zODksZS5vbWFjcm9uPTYxMSxlLlphY3V0ZT02MTEsZS5aY2Fyb249NjExLGUuZ3JlYXRlcmVxdWFsPTU0OSxlLkV0aD03MjIsZS5DY2VkaWxsYT03MjIsZS5sY29tbWFhY2NlbnQ9Mjc4LGUudGNhcm9uPTM4OSxlLmVvZ29uZWs9NTU2LGUuVW9nb25laz03MjIsZS5BYWN1dGU9NzIyLGUuQWRpZXJlc2lzPTcyMixlLmVncmF2ZT01NTYsZS56YWN1dGU9NTAwLGUuaW9nb25laz0yNzgsZS5PYWN1dGU9Nzc4LGUub2FjdXRlPTYxMSxlLmFtYWNyb249NTU2LGUuc2FjdXRlPTU1NixlLmlkaWVyZXNpcz0yNzgsZS5PY2lyY3VtZmxleD03NzgsZS5VZ3JhdmU9NzIyLGUuRGVsdGE9NjEyLGUudGhvcm49NjExLGUudHdvc3VwZXJpb3I9MzMzLGUuT2RpZXJlc2lzPTc3OCxlLm11PTYxMSxlLmlncmF2ZT0yNzgsZS5vaHVuZ2FydW1sYXV0PTYxMSxlLkVvZ29uZWs9NjY3LGUuZGNyb2F0PTYxMSxlLnRocmVlcXVhcnRlcnM9ODM0LGUuU2NlZGlsbGE9NjY3LGUubGNhcm9uPTQwMCxlLktjb21tYWFjY2VudD03MjIsZS5MYWN1dGU9NjExLGUudHJhZGVtYXJrPTFlMyxlLmVkb3RhY2NlbnQ9NTU2LGUuSWdyYXZlPTI3OCxlLkltYWNyb249Mjc4LGUuTGNhcm9uPTYxMSxlLm9uZWhhbGY9ODM0LGUubGVzc2VxdWFsPTU0OSxlLm9jaXJjdW1mbGV4PTYxMSxlLm50aWxkZT02MTEsZS5VaHVuZ2FydW1sYXV0PTcyMixlLkVhY3V0ZT02NjcsZS5lbWFjcm9uPTU1NixlLmdicmV2ZT02MTEsZS5vbmVxdWFydGVyPTgzNCxlLlNjYXJvbj02NjcsZS5TY29tbWFhY2NlbnQ9NjY3LGUuT2h1bmdhcnVtbGF1dD03NzgsZS5kZWdyZWU9NDAwLGUub2dyYXZlPTYxMSxlLkNjYXJvbj03MjIsZS51Z3JhdmU9NjExLGUucmFkaWNhbD01NDksZS5EY2Fyb249NzIyLGUucmNvbW1hYWNjZW50PTM4OSxlLk50aWxkZT03MjIsZS5vdGlsZGU9NjExLGUuUmNvbW1hYWNjZW50PTcyMixlLkxjb21tYWFjY2VudD02MTEsZS5BdGlsZGU9NzIyLGUuQW9nb25laz03MjIsZS5BcmluZz03MjIsZS5PdGlsZGU9Nzc4LGUuemRvdGFjY2VudD01MDAsZS5FY2Fyb249NjY3LGUuSW9nb25laz0yNzgsZS5rY29tbWFhY2NlbnQ9NTU2LGUubWludXM9NTg0LGUuSWNpcmN1bWZsZXg9Mjc4LGUubmNhcm9uPTYxMSxlLnRjb21tYWFjY2VudD0zMzMsZS5sb2dpY2Fsbm90PTU4NCxlLm9kaWVyZXNpcz02MTEsZS51ZGllcmVzaXM9NjExLGUubm90ZXF1YWw9NTQ5LGUuZ2NvbW1hYWNjZW50PTYxMSxlLmV0aD02MTEsZS56Y2Fyb249NTAwLGUubmNvbW1hYWNjZW50PTYxMSxlLm9uZXN1cGVyaW9yPTMzMyxlLmltYWNyb249Mjc4LGUuRXVybz01NTZ9KSksZVsiSGVsdmV0aWNhLU9ibGlxdWUiXT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9Mjc4LGUuZXhjbGFtPTI3OCxlLnF1b3RlZGJsPTM1NSxlLm51bWJlcnNpZ249NTU2LGUuZG9sbGFyPTU1NixlLnBlcmNlbnQ9ODg5LGUuYW1wZXJzYW5kPTY2NyxlLnF1b3RlcmlnaHQ9MjIyLGUucGFyZW5sZWZ0PTMzMyxlLnBhcmVucmlnaHQ9MzMzLGUuYXN0ZXJpc2s9Mzg5LGUucGx1cz01ODQsZS5jb21tYT0yNzgsZS5oeXBoZW49MzMzLGUucGVyaW9kPTI3OCxlLnNsYXNoPTI3OCxlLnplcm89NTU2LGUub25lPTU1NixlLnR3bz01NTYsZS50aHJlZT01NTYsZS5mb3VyPTU1NixlLmZpdmU9NTU2LGUuc2l4PTU1NixlLnNldmVuPTU1NixlLmVpZ2h0PTU1NixlLm5pbmU9NTU2LGUuY29sb249Mjc4LGUuc2VtaWNvbG9uPTI3OCxlLmxlc3M9NTg0LGUuZXF1YWw9NTg0LGUuZ3JlYXRlcj01ODQsZS5xdWVzdGlvbj01NTYsZS5hdD0xMDE1LGUuQT02NjcsZS5CPTY2NyxlLkM9NzIyLGUuRD03MjIsZS5FPTY2NyxlLkY9NjExLGUuRz03NzgsZS5IPTcyMixlLkk9Mjc4LGUuSj01MDAsZS5LPTY2NyxlLkw9NTU2LGUuTT04MzMsZS5OPTcyMixlLk89Nzc4LGUuUD02NjcsZS5RPTc3OCxlLlI9NzIyLGUuUz02NjcsZS5UPTYxMSxlLlU9NzIyLGUuVj02NjcsZS5XPTk0NCxlLlg9NjY3LGUuWT02NjcsZS5aPTYxMSxlLmJyYWNrZXRsZWZ0PTI3OCxlLmJhY2tzbGFzaD0yNzgsZS5icmFja2V0cmlnaHQ9Mjc4LGUuYXNjaWljaXJjdW09NDY5LGUudW5kZXJzY29yZT01NTYsZS5xdW90ZWxlZnQ9MjIyLGUuYT01NTYsZS5iPTU1NixlLmM9NTAwLGUuZD01NTYsZS5lPTU1NixlLmY9Mjc4LGUuZz01NTYsZS5oPTU1NixlLmk9MjIyLGUuaj0yMjIsZS5rPTUwMCxlLmw9MjIyLGUubT04MzMsZS5uPTU1NixlLm89NTU2LGUucD01NTYsZS5xPTU1NixlLnI9MzMzLGUucz01MDAsZS50PTI3OCxlLnU9NTU2LGUudj01MDAsZS53PTcyMixlLng9NTAwLGUueT01MDAsZS56PTUwMCxlLmJyYWNlbGVmdD0zMzQsZS5iYXI9MjYwLGUuYnJhY2VyaWdodD0zMzQsZS5hc2NpaXRpbGRlPTU4NCxlLmV4Y2xhbWRvd249MzMzLGUuY2VudD01NTYsZS5zdGVybGluZz01NTYsZS5mcmFjdGlvbj0xNjcsZS55ZW49NTU2LGUuZmxvcmluPTU1NixlLnNlY3Rpb249NTU2LGUuY3VycmVuY3k9NTU2LGUucXVvdGVzaW5nbGU9MTkxLGUucXVvdGVkYmxsZWZ0PTMzMyxlLmd1aWxsZW1vdGxlZnQ9NTU2LGUuZ3VpbHNpbmdsbGVmdD0zMzMsZS5ndWlsc2luZ2xyaWdodD0zMzMsZS5maT01MDAsZS5mbD01MDAsZS5lbmRhc2g9NTU2LGUuZGFnZ2VyPTU1NixlLmRhZ2dlcmRibD01NTYsZS5wZXJpb2RjZW50ZXJlZD0yNzgsZS5wYXJhZ3JhcGg9NTM3LGUuYnVsbGV0PTM1MCxlLnF1b3Rlc2luZ2xiYXNlPTIyMixlLnF1b3RlZGJsYmFzZT0zMzMsZS5xdW90ZWRibHJpZ2h0PTMzMyxlLmd1aWxsZW1vdHJpZ2h0PTU1NixlLmVsbGlwc2lzPTFlMyxlLnBlcnRob3VzYW5kPTFlMyxlLnF1ZXN0aW9uZG93bj02MTEsZS5ncmF2ZT0zMzMsZS5hY3V0ZT0zMzMsZS5jaXJjdW1mbGV4PTMzMyxlLnRpbGRlPTMzMyxlLm1hY3Jvbj0zMzMsZS5icmV2ZT0zMzMsZS5kb3RhY2NlbnQ9MzMzLGUuZGllcmVzaXM9MzMzLGUucmluZz0zMzMsZS5jZWRpbGxhPTMzMyxlLmh1bmdhcnVtbGF1dD0zMzMsZS5vZ29uZWs9MzMzLGUuY2Fyb249MzMzLGUuZW1kYXNoPTFlMyxlLkFFPTFlMyxlLm9yZGZlbWluaW5lPTM3MCxlLkxzbGFzaD01NTYsZS5Pc2xhc2g9Nzc4LGUuT0U9MWUzLGUub3JkbWFzY3VsaW5lPTM2NSxlLmFlPTg4OSxlLmRvdGxlc3NpPTI3OCxlLmxzbGFzaD0yMjIsZS5vc2xhc2g9NjExLGUub2U9OTQ0LGUuZ2VybWFuZGJscz02MTEsZS5JZGllcmVzaXM9Mjc4LGUuZWFjdXRlPTU1NixlLmFicmV2ZT01NTYsZS51aHVuZ2FydW1sYXV0PTU1NixlLmVjYXJvbj01NTYsZS5ZZGllcmVzaXM9NjY3LGUuZGl2aWRlPTU4NCxlLllhY3V0ZT02NjcsZS5BY2lyY3VtZmxleD02NjcsZS5hYWN1dGU9NTU2LGUuVWNpcmN1bWZsZXg9NzIyLGUueWFjdXRlPTUwMCxlLnNjb21tYWFjY2VudD01MDAsZS5lY2lyY3VtZmxleD01NTYsZS5VcmluZz03MjIsZS5VZGllcmVzaXM9NzIyLGUuYW9nb25laz01NTYsZS5VYWN1dGU9NzIyLGUudW9nb25laz01NTYsZS5FZGllcmVzaXM9NjY3LGUuRGNyb2F0PTcyMixlLmNvbW1hYWNjZW50PTI1MCxlLmNvcHlyaWdodD03MzcsZS5FbWFjcm9uPTY2NyxlLmNjYXJvbj01MDAsZS5hcmluZz01NTYsZS5OY29tbWFhY2NlbnQ9NzIyLGUubGFjdXRlPTIyMixlLmFncmF2ZT01NTYsZS5UY29tbWFhY2NlbnQ9NjExLGUuQ2FjdXRlPTcyMixlLmF0aWxkZT01NTYsZS5FZG90YWNjZW50PTY2NyxlLnNjYXJvbj01MDAsZS5zY2VkaWxsYT01MDAsZS5pYWN1dGU9Mjc4LGUubG96ZW5nZT00NzEsZS5SY2Fyb249NzIyLGUuR2NvbW1hYWNjZW50PTc3OCxlLnVjaXJjdW1mbGV4PTU1NixlLmFjaXJjdW1mbGV4PTU1NixlLkFtYWNyb249NjY3LGUucmNhcm9uPTMzMyxlLmNjZWRpbGxhPTUwMCxlLlpkb3RhY2NlbnQ9NjExLGUuVGhvcm49NjY3LGUuT21hY3Jvbj03NzgsZS5SYWN1dGU9NzIyLGUuU2FjdXRlPTY2NyxlLmRjYXJvbj02NDMsZS5VbWFjcm9uPTcyMixlLnVyaW5nPTU1NixlLnRocmVlc3VwZXJpb3I9MzMzLGUuT2dyYXZlPTc3OCxlLkFncmF2ZT02NjcsZS5BYnJldmU9NjY3LGUubXVsdGlwbHk9NTg0LGUudWFjdXRlPTU1NixlLlRjYXJvbj02MTEsZS5wYXJ0aWFsZGlmZj00NzYsZS55ZGllcmVzaXM9NTAwLGUuTmFjdXRlPTcyMixlLmljaXJjdW1mbGV4PTI3OCxlLkVjaXJjdW1mbGV4PTY2NyxlLmFkaWVyZXNpcz01NTYsZS5lZGllcmVzaXM9NTU2LGUuY2FjdXRlPTUwMCxlLm5hY3V0ZT01NTYsZS51bWFjcm9uPTU1NixlLk5jYXJvbj03MjIsZS5JYWN1dGU9Mjc4LGUucGx1c21pbnVzPTU4NCxlLmJyb2tlbmJhcj0yNjAsZS5yZWdpc3RlcmVkPTczNyxlLkdicmV2ZT03NzgsZS5JZG90YWNjZW50PTI3OCxlLnN1bW1hdGlvbj02MDAsZS5FZ3JhdmU9NjY3LGUucmFjdXRlPTMzMyxlLm9tYWNyb249NTU2LGUuWmFjdXRlPTYxMSxlLlpjYXJvbj02MTEsZS5ncmVhdGVyZXF1YWw9NTQ5LGUuRXRoPTcyMixlLkNjZWRpbGxhPTcyMixlLmxjb21tYWFjY2VudD0yMjIsZS50Y2Fyb249MzE3LGUuZW9nb25laz01NTYsZS5Vb2dvbmVrPTcyMixlLkFhY3V0ZT02NjcsZS5BZGllcmVzaXM9NjY3LGUuZWdyYXZlPTU1NixlLnphY3V0ZT01MDAsZS5pb2dvbmVrPTIyMixlLk9hY3V0ZT03NzgsZS5vYWN1dGU9NTU2LGUuYW1hY3Jvbj01NTYsZS5zYWN1dGU9NTAwLGUuaWRpZXJlc2lzPTI3OCxlLk9jaXJjdW1mbGV4PTc3OCxlLlVncmF2ZT03MjIsZS5EZWx0YT02MTIsZS50aG9ybj01NTYsZS50d29zdXBlcmlvcj0zMzMsZS5PZGllcmVzaXM9Nzc4LGUubXU9NTU2LGUuaWdyYXZlPTI3OCxlLm9odW5nYXJ1bWxhdXQ9NTU2LGUuRW9nb25laz02NjcsZS5kY3JvYXQ9NTU2LGUudGhyZWVxdWFydGVycz04MzQsZS5TY2VkaWxsYT02NjcsZS5sY2Fyb249Mjk5LGUuS2NvbW1hYWNjZW50PTY2NyxlLkxhY3V0ZT01NTYsZS50cmFkZW1hcms9MWUzLGUuZWRvdGFjY2VudD01NTYsZS5JZ3JhdmU9Mjc4LGUuSW1hY3Jvbj0yNzgsZS5MY2Fyb249NTU2LGUub25laGFsZj04MzQsZS5sZXNzZXF1YWw9NTQ5LGUub2NpcmN1bWZsZXg9NTU2LGUubnRpbGRlPTU1NixlLlVodW5nYXJ1bWxhdXQ9NzIyLGUuRWFjdXRlPTY2NyxlLmVtYWNyb249NTU2LGUuZ2JyZXZlPTU1NixlLm9uZXF1YXJ0ZXI9ODM0LGUuU2Nhcm9uPTY2NyxlLlNjb21tYWFjY2VudD02NjcsZS5PaHVuZ2FydW1sYXV0PTc3OCxlLmRlZ3JlZT00MDAsZS5vZ3JhdmU9NTU2LGUuQ2Nhcm9uPTcyMixlLnVncmF2ZT01NTYsZS5yYWRpY2FsPTQ1MyxlLkRjYXJvbj03MjIsZS5yY29tbWFhY2NlbnQ9MzMzLGUuTnRpbGRlPTcyMixlLm90aWxkZT01NTYsZS5SY29tbWFhY2NlbnQ9NzIyLGUuTGNvbW1hYWNjZW50PTU1NixlLkF0aWxkZT02NjcsZS5Bb2dvbmVrPTY2NyxlLkFyaW5nPTY2NyxlLk90aWxkZT03NzgsZS56ZG90YWNjZW50PTUwMCxlLkVjYXJvbj02NjcsZS5Jb2dvbmVrPTI3OCxlLmtjb21tYWFjY2VudD01MDAsZS5taW51cz01ODQsZS5JY2lyY3VtZmxleD0yNzgsZS5uY2Fyb249NTU2LGUudGNvbW1hYWNjZW50PTI3OCxlLmxvZ2ljYWxub3Q9NTg0LGUub2RpZXJlc2lzPTU1NixlLnVkaWVyZXNpcz01NTYsZS5ub3RlcXVhbD01NDksZS5nY29tbWFhY2NlbnQ9NTU2LGUuZXRoPTU1NixlLnpjYXJvbj01MDAsZS5uY29tbWFhY2NlbnQ9NTU2LGUub25lc3VwZXJpb3I9MzMzLGUuaW1hY3Jvbj0yNzgsZS5FdXJvPTU1Nn0pKSxlLlN5bWJvbD0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwLGUuZXhjbGFtPTMzMyxlLnVuaXZlcnNhbD03MTMsZS5udW1iZXJzaWduPTUwMCxlLmV4aXN0ZW50aWFsPTU0OSxlLnBlcmNlbnQ9ODMzLGUuYW1wZXJzYW5kPTc3OCxlLnN1Y2h0aGF0PTQzOSxlLnBhcmVubGVmdD0zMzMsZS5wYXJlbnJpZ2h0PTMzMyxlLmFzdGVyaXNrbWF0aD01MDAsZS5wbHVzPTU0OSxlLmNvbW1hPTI1MCxlLm1pbnVzPTU0OSxlLnBlcmlvZD0yNTAsZS5zbGFzaD0yNzgsZS56ZXJvPTUwMCxlLm9uZT01MDAsZS50d289NTAwLGUudGhyZWU9NTAwLGUuZm91cj01MDAsZS5maXZlPTUwMCxlLnNpeD01MDAsZS5zZXZlbj01MDAsZS5laWdodD01MDAsZS5uaW5lPTUwMCxlLmNvbG9uPTI3OCxlLnNlbWljb2xvbj0yNzgsZS5sZXNzPTU0OSxlLmVxdWFsPTU0OSxlLmdyZWF0ZXI9NTQ5LGUucXVlc3Rpb249NDQ0LGUuY29uZ3J1ZW50PTU0OSxlLkFscGhhPTcyMixlLkJldGE9NjY3LGUuQ2hpPTcyMixlLkRlbHRhPTYxMixlLkVwc2lsb249NjExLGUuUGhpPTc2MyxlLkdhbW1hPTYwMyxlLkV0YT03MjIsZS5Jb3RhPTMzMyxlLnRoZXRhMT02MzEsZS5LYXBwYT03MjIsZS5MYW1iZGE9Njg2LGUuTXU9ODg5LGUuTnU9NzIyLGUuT21pY3Jvbj03MjIsZS5QaT03NjgsZS5UaGV0YT03NDEsZS5SaG89NTU2LGUuU2lnbWE9NTkyLGUuVGF1PTYxMSxlLlVwc2lsb249NjkwLGUuc2lnbWExPTQzOSxlLk9tZWdhPTc2OCxlLlhpPTY0NSxlLlBzaT03OTUsZS5aZXRhPTYxMSxlLmJyYWNrZXRsZWZ0PTMzMyxlLnRoZXJlZm9yZT04NjMsZS5icmFja2V0cmlnaHQ9MzMzLGUucGVycGVuZGljdWxhcj02NTgsZS51bmRlcnNjb3JlPTUwMCxlLnJhZGljYWxleD01MDAsZS5hbHBoYT02MzEsZS5iZXRhPTU0OSxlLmNoaT01NDksZS5kZWx0YT00OTQsZS5lcHNpbG9uPTQzOSxlLnBoaT01MjEsZS5nYW1tYT00MTEsZS5ldGE9NjAzLGUuaW90YT0zMjksZS5waGkxPTYwMyxlLmthcHBhPTU0OSxlLmxhbWJkYT01NDksZS5tdT01NzYsZS5udT01MjEsZS5vbWljcm9uPTU0OSxlLnBpPTU0OSxlLnRoZXRhPTUyMSxlLnJobz01NDksZS5zaWdtYT02MDMsZS50YXU9NDM5LGUudXBzaWxvbj01NzYsZS5vbWVnYTE9NzEzLGUub21lZ2E9Njg2LGUueGk9NDkzLGUucHNpPTY4NixlLnpldGE9NDk0LGUuYnJhY2VsZWZ0PTQ4MCxlLmJhcj0yMDAsZS5icmFjZXJpZ2h0PTQ4MCxlLnNpbWlsYXI9NTQ5LGUuRXVybz03NTAsZS5VcHNpbG9uMT02MjAsZS5taW51dGU9MjQ3LGUubGVzc2VxdWFsPTU0OSxlLmZyYWN0aW9uPTE2NyxlLmluZmluaXR5PTcxMyxlLmZsb3Jpbj01MDAsZS5jbHViPTc1MyxlLmRpYW1vbmQ9NzUzLGUuaGVhcnQ9NzUzLGUuc3BhZGU9NzUzLGUuYXJyb3dib3RoPTEwNDIsZS5hcnJvd2xlZnQ9OTg3LGUuYXJyb3d1cD02MDMsZS5hcnJvd3JpZ2h0PTk4NyxlLmFycm93ZG93bj02MDMsZS5kZWdyZWU9NDAwLGUucGx1c21pbnVzPTU0OSxlLnNlY29uZD00MTEsZS5ncmVhdGVyZXF1YWw9NTQ5LGUubXVsdGlwbHk9NTQ5LGUucHJvcG9ydGlvbmFsPTcxMyxlLnBhcnRpYWxkaWZmPTQ5NCxlLmJ1bGxldD00NjAsZS5kaXZpZGU9NTQ5LGUubm90ZXF1YWw9NTQ5LGUuZXF1aXZhbGVuY2U9NTQ5LGUuYXBwcm94ZXF1YWw9NTQ5LGUuZWxsaXBzaXM9MWUzLGUuYXJyb3d2ZXJ0ZXg9NjAzLGUuYXJyb3dob3JpemV4PTFlMyxlLmNhcnJpYWdlcmV0dXJuPTY1OCxlLmFsZXBoPTgyMyxlLklmcmFrdHVyPTY4NixlLlJmcmFrdHVyPTc5NSxlLndlaWVyc3RyYXNzPTk4NyxlLmNpcmNsZW11bHRpcGx5PTc2OCxlLmNpcmNsZXBsdXM9NzY4LGUuZW1wdHlzZXQ9ODIzLGUuaW50ZXJzZWN0aW9uPTc2OCxlLnVuaW9uPTc2OCxlLnByb3BlcnN1cGVyc2V0PTcxMyxlLnJlZmxleHN1cGVyc2V0PTcxMyxlLm5vdHN1YnNldD03MTMsZS5wcm9wZXJzdWJzZXQ9NzEzLGUucmVmbGV4c3Vic2V0PTcxMyxlLmVsZW1lbnQ9NzEzLGUubm90ZWxlbWVudD03MTMsZS5hbmdsZT03NjgsZS5ncmFkaWVudD03MTMsZS5yZWdpc3RlcnNlcmlmPTc5MCxlLmNvcHlyaWdodHNlcmlmPTc5MCxlLnRyYWRlbWFya3NlcmlmPTg5MCxlLnByb2R1Y3Q9ODIzLGUucmFkaWNhbD01NDksZS5kb3RtYXRoPTI1MCxlLmxvZ2ljYWxub3Q9NzEzLGUubG9naWNhbGFuZD02MDMsZS5sb2dpY2Fsb3I9NjAzLGUuYXJyb3dkYmxib3RoPTEwNDIsZS5hcnJvd2RibGxlZnQ9OTg3LGUuYXJyb3dkYmx1cD02MDMsZS5hcnJvd2RibHJpZ2h0PTk4NyxlLmFycm93ZGJsZG93bj02MDMsZS5sb3plbmdlPTQ5NCxlLmFuZ2xlbGVmdD0zMjksZS5yZWdpc3RlcnNhbnM9NzkwLGUuY29weXJpZ2h0c2Fucz03OTAsZS50cmFkZW1hcmtzYW5zPTc4NixlLnN1bW1hdGlvbj03MTMsZS5wYXJlbmxlZnR0cD0zODQsZS5wYXJlbmxlZnRleD0zODQsZS5wYXJlbmxlZnRidD0zODQsZS5icmFja2V0bGVmdHRwPTM4NCxlLmJyYWNrZXRsZWZ0ZXg9Mzg0LGUuYnJhY2tldGxlZnRidD0zODQsZS5icmFjZWxlZnR0cD00OTQsZS5icmFjZWxlZnRtaWQ9NDk0LGUuYnJhY2VsZWZ0YnQ9NDk0LGUuYnJhY2VleD00OTQsZS5hbmdsZXJpZ2h0PTMyOSxlLmludGVncmFsPTI3NCxlLmludGVncmFsdHA9Njg2LGUuaW50ZWdyYWxleD02ODYsZS5pbnRlZ3JhbGJ0PTY4NixlLnBhcmVucmlnaHR0cD0zODQsZS5wYXJlbnJpZ2h0ZXg9Mzg0LGUucGFyZW5yaWdodGJ0PTM4NCxlLmJyYWNrZXRyaWdodHRwPTM4NCxlLmJyYWNrZXRyaWdodGV4PTM4NCxlLmJyYWNrZXRyaWdodGJ0PTM4NCxlLmJyYWNlcmlnaHR0cD00OTQsZS5icmFjZXJpZ2h0bWlkPTQ5NCxlLmJyYWNlcmlnaHRidD00OTQsZS5hcHBsZT03OTB9KSksZVsiVGltZXMtUm9tYW4iXT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwLGUuZXhjbGFtPTMzMyxlLnF1b3RlZGJsPTQwOCxlLm51bWJlcnNpZ249NTAwLGUuZG9sbGFyPTUwMCxlLnBlcmNlbnQ9ODMzLGUuYW1wZXJzYW5kPTc3OCxlLnF1b3RlcmlnaHQ9MzMzLGUucGFyZW5sZWZ0PTMzMyxlLnBhcmVucmlnaHQ9MzMzLGUuYXN0ZXJpc2s9NTAwLGUucGx1cz01NjQsZS5jb21tYT0yNTAsZS5oeXBoZW49MzMzLGUucGVyaW9kPTI1MCxlLnNsYXNoPTI3OCxlLnplcm89NTAwLGUub25lPTUwMCxlLnR3bz01MDAsZS50aHJlZT01MDAsZS5mb3VyPTUwMCxlLmZpdmU9NTAwLGUuc2l4PTUwMCxlLnNldmVuPTUwMCxlLmVpZ2h0PTUwMCxlLm5pbmU9NTAwLGUuY29sb249Mjc4LGUuc2VtaWNvbG9uPTI3OCxlLmxlc3M9NTY0LGUuZXF1YWw9NTY0LGUuZ3JlYXRlcj01NjQsZS5xdWVzdGlvbj00NDQsZS5hdD05MjEsZS5BPTcyMixlLkI9NjY3LGUuQz02NjcsZS5EPTcyMixlLkU9NjExLGUuRj01NTYsZS5HPTcyMixlLkg9NzIyLGUuST0zMzMsZS5KPTM4OSxlLks9NzIyLGUuTD02MTEsZS5NPTg4OSxlLk49NzIyLGUuTz03MjIsZS5QPTU1NixlLlE9NzIyLGUuUj02NjcsZS5TPTU1NixlLlQ9NjExLGUuVT03MjIsZS5WPTcyMixlLlc9OTQ0LGUuWD03MjIsZS5ZPTcyMixlLlo9NjExLGUuYnJhY2tldGxlZnQ9MzMzLGUuYmFja3NsYXNoPTI3OCxlLmJyYWNrZXRyaWdodD0zMzMsZS5hc2NpaWNpcmN1bT00NjksZS51bmRlcnNjb3JlPTUwMCxlLnF1b3RlbGVmdD0zMzMsZS5hPTQ0NCxlLmI9NTAwLGUuYz00NDQsZS5kPTUwMCxlLmU9NDQ0LGUuZj0zMzMsZS5nPTUwMCxlLmg9NTAwLGUuaT0yNzgsZS5qPTI3OCxlLms9NTAwLGUubD0yNzgsZS5tPTc3OCxlLm49NTAwLGUubz01MDAsZS5wPTUwMCxlLnE9NTAwLGUucj0zMzMsZS5zPTM4OSxlLnQ9Mjc4LGUudT01MDAsZS52PTUwMCxlLnc9NzIyLGUueD01MDAsZS55PTUwMCxlLno9NDQ0LGUuYnJhY2VsZWZ0PTQ4MCxlLmJhcj0yMDAsZS5icmFjZXJpZ2h0PTQ4MCxlLmFzY2lpdGlsZGU9NTQxLGUuZXhjbGFtZG93bj0zMzMsZS5jZW50PTUwMCxlLnN0ZXJsaW5nPTUwMCxlLmZyYWN0aW9uPTE2NyxlLnllbj01MDAsZS5mbG9yaW49NTAwLGUuc2VjdGlvbj01MDAsZS5jdXJyZW5jeT01MDAsZS5xdW90ZXNpbmdsZT0xODAsZS5xdW90ZWRibGxlZnQ9NDQ0LGUuZ3VpbGxlbW90bGVmdD01MDAsZS5ndWlsc2luZ2xsZWZ0PTMzMyxlLmd1aWxzaW5nbHJpZ2h0PTMzMyxlLmZpPTU1NixlLmZsPTU1NixlLmVuZGFzaD01MDAsZS5kYWdnZXI9NTAwLGUuZGFnZ2VyZGJsPTUwMCxlLnBlcmlvZGNlbnRlcmVkPTI1MCxlLnBhcmFncmFwaD00NTMsZS5idWxsZXQ9MzUwLGUucXVvdGVzaW5nbGJhc2U9MzMzLGUucXVvdGVkYmxiYXNlPTQ0NCxlLnF1b3RlZGJscmlnaHQ9NDQ0LGUuZ3VpbGxlbW90cmlnaHQ9NTAwLGUuZWxsaXBzaXM9MWUzLGUucGVydGhvdXNhbmQ9MWUzLGUucXVlc3Rpb25kb3duPTQ0NCxlLmdyYXZlPTMzMyxlLmFjdXRlPTMzMyxlLmNpcmN1bWZsZXg9MzMzLGUudGlsZGU9MzMzLGUubWFjcm9uPTMzMyxlLmJyZXZlPTMzMyxlLmRvdGFjY2VudD0zMzMsZS5kaWVyZXNpcz0zMzMsZS5yaW5nPTMzMyxlLmNlZGlsbGE9MzMzLGUuaHVuZ2FydW1sYXV0PTMzMyxlLm9nb25laz0zMzMsZS5jYXJvbj0zMzMsZS5lbWRhc2g9MWUzLGUuQUU9ODg5LGUub3JkZmVtaW5pbmU9Mjc2LGUuTHNsYXNoPTYxMSxlLk9zbGFzaD03MjIsZS5PRT04ODksZS5vcmRtYXNjdWxpbmU9MzEwLGUuYWU9NjY3LGUuZG90bGVzc2k9Mjc4LGUubHNsYXNoPTI3OCxlLm9zbGFzaD01MDAsZS5vZT03MjIsZS5nZXJtYW5kYmxzPTUwMCxlLklkaWVyZXNpcz0zMzMsZS5lYWN1dGU9NDQ0LGUuYWJyZXZlPTQ0NCxlLnVodW5nYXJ1bWxhdXQ9NTAwLGUuZWNhcm9uPTQ0NCxlLllkaWVyZXNpcz03MjIsZS5kaXZpZGU9NTY0LGUuWWFjdXRlPTcyMixlLkFjaXJjdW1mbGV4PTcyMixlLmFhY3V0ZT00NDQsZS5VY2lyY3VtZmxleD03MjIsZS55YWN1dGU9NTAwLGUuc2NvbW1hYWNjZW50PTM4OSxlLmVjaXJjdW1mbGV4PTQ0NCxlLlVyaW5nPTcyMixlLlVkaWVyZXNpcz03MjIsZS5hb2dvbmVrPTQ0NCxlLlVhY3V0ZT03MjIsZS51b2dvbmVrPTUwMCxlLkVkaWVyZXNpcz02MTEsZS5EY3JvYXQ9NzIyLGUuY29tbWFhY2NlbnQ9MjUwLGUuY29weXJpZ2h0PTc2MCxlLkVtYWNyb249NjExLGUuY2Nhcm9uPTQ0NCxlLmFyaW5nPTQ0NCxlLk5jb21tYWFjY2VudD03MjIsZS5sYWN1dGU9Mjc4LGUuYWdyYXZlPTQ0NCxlLlRjb21tYWFjY2VudD02MTEsZS5DYWN1dGU9NjY3LGUuYXRpbGRlPTQ0NCxlLkVkb3RhY2NlbnQ9NjExLGUuc2Nhcm9uPTM4OSxlLnNjZWRpbGxhPTM4OSxlLmlhY3V0ZT0yNzgsZS5sb3plbmdlPTQ3MSxlLlJjYXJvbj02NjcsZS5HY29tbWFhY2NlbnQ9NzIyLGUudWNpcmN1bWZsZXg9NTAwLGUuYWNpcmN1bWZsZXg9NDQ0LGUuQW1hY3Jvbj03MjIsZS5yY2Fyb249MzMzLGUuY2NlZGlsbGE9NDQ0LGUuWmRvdGFjY2VudD02MTEsZS5UaG9ybj01NTYsZS5PbWFjcm9uPTcyMixlLlJhY3V0ZT02NjcsZS5TYWN1dGU9NTU2LGUuZGNhcm9uPTU4OCxlLlVtYWNyb249NzIyLGUudXJpbmc9NTAwLGUudGhyZWVzdXBlcmlvcj0zMDAsZS5PZ3JhdmU9NzIyLGUuQWdyYXZlPTcyMixlLkFicmV2ZT03MjIsZS5tdWx0aXBseT01NjQsZS51YWN1dGU9NTAwLGUuVGNhcm9uPTYxMSxlLnBhcnRpYWxkaWZmPTQ3NixlLnlkaWVyZXNpcz01MDAsZS5OYWN1dGU9NzIyLGUuaWNpcmN1bWZsZXg9Mjc4LGUuRWNpcmN1bWZsZXg9NjExLGUuYWRpZXJlc2lzPTQ0NCxlLmVkaWVyZXNpcz00NDQsZS5jYWN1dGU9NDQ0LGUubmFjdXRlPTUwMCxlLnVtYWNyb249NTAwLGUuTmNhcm9uPTcyMixlLklhY3V0ZT0zMzMsZS5wbHVzbWludXM9NTY0LGUuYnJva2VuYmFyPTIwMCxlLnJlZ2lzdGVyZWQ9NzYwLGUuR2JyZXZlPTcyMixlLklkb3RhY2NlbnQ9MzMzLGUuc3VtbWF0aW9uPTYwMCxlLkVncmF2ZT02MTEsZS5yYWN1dGU9MzMzLGUub21hY3Jvbj01MDAsZS5aYWN1dGU9NjExLGUuWmNhcm9uPTYxMSxlLmdyZWF0ZXJlcXVhbD01NDksZS5FdGg9NzIyLGUuQ2NlZGlsbGE9NjY3LGUubGNvbW1hYWNjZW50PTI3OCxlLnRjYXJvbj0zMjYsZS5lb2dvbmVrPTQ0NCxlLlVvZ29uZWs9NzIyLGUuQWFjdXRlPTcyMixlLkFkaWVyZXNpcz03MjIsZS5lZ3JhdmU9NDQ0LGUuemFjdXRlPTQ0NCxlLmlvZ29uZWs9Mjc4LGUuT2FjdXRlPTcyMixlLm9hY3V0ZT01MDAsZS5hbWFjcm9uPTQ0NCxlLnNhY3V0ZT0zODksZS5pZGllcmVzaXM9Mjc4LGUuT2NpcmN1bWZsZXg9NzIyLGUuVWdyYXZlPTcyMixlLkRlbHRhPTYxMixlLnRob3JuPTUwMCxlLnR3b3N1cGVyaW9yPTMwMCxlLk9kaWVyZXNpcz03MjIsZS5tdT01MDAsZS5pZ3JhdmU9Mjc4LGUub2h1bmdhcnVtbGF1dD01MDAsZS5Fb2dvbmVrPTYxMSxlLmRjcm9hdD01MDAsZS50aHJlZXF1YXJ0ZXJzPTc1MCxlLlNjZWRpbGxhPTU1NixlLmxjYXJvbj0zNDQsZS5LY29tbWFhY2NlbnQ9NzIyLGUuTGFjdXRlPTYxMSxlLnRyYWRlbWFyaz05ODAsZS5lZG90YWNjZW50PTQ0NCxlLklncmF2ZT0zMzMsZS5JbWFjcm9uPTMzMyxlLkxjYXJvbj02MTEsZS5vbmVoYWxmPTc1MCxlLmxlc3NlcXVhbD01NDksZS5vY2lyY3VtZmxleD01MDAsZS5udGlsZGU9NTAwLGUuVWh1bmdhcnVtbGF1dD03MjIsZS5FYWN1dGU9NjExLGUuZW1hY3Jvbj00NDQsZS5nYnJldmU9NTAwLGUub25lcXVhcnRlcj03NTAsZS5TY2Fyb249NTU2LGUuU2NvbW1hYWNjZW50PTU1NixlLk9odW5nYXJ1bWxhdXQ9NzIyLGUuZGVncmVlPTQwMCxlLm9ncmF2ZT01MDAsZS5DY2Fyb249NjY3LGUudWdyYXZlPTUwMCxlLnJhZGljYWw9NDUzLGUuRGNhcm9uPTcyMixlLnJjb21tYWFjY2VudD0zMzMsZS5OdGlsZGU9NzIyLGUub3RpbGRlPTUwMCxlLlJjb21tYWFjY2VudD02NjcsZS5MY29tbWFhY2NlbnQ9NjExLGUuQXRpbGRlPTcyMixlLkFvZ29uZWs9NzIyLGUuQXJpbmc9NzIyLGUuT3RpbGRlPTcyMixlLnpkb3RhY2NlbnQ9NDQ0LGUuRWNhcm9uPTYxMSxlLklvZ29uZWs9MzMzLGUua2NvbW1hYWNjZW50PTUwMCxlLm1pbnVzPTU2NCxlLkljaXJjdW1mbGV4PTMzMyxlLm5jYXJvbj01MDAsZS50Y29tbWFhY2NlbnQ9Mjc4LGUubG9naWNhbG5vdD01NjQsZS5vZGllcmVzaXM9NTAwLGUudWRpZXJlc2lzPTUwMCxlLm5vdGVxdWFsPTU0OSxlLmdjb21tYWFjY2VudD01MDAsZS5ldGg9NTAwLGUuemNhcm9uPTQ0NCxlLm5jb21tYWFjY2VudD01MDAsZS5vbmVzdXBlcmlvcj0zMDAsZS5pbWFjcm9uPTI3OCxlLkV1cm89NTAwfSkpLGVbIlRpbWVzLUJvbGQiXT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwLGUuZXhjbGFtPTMzMyxlLnF1b3RlZGJsPTU1NSxlLm51bWJlcnNpZ249NTAwLGUuZG9sbGFyPTUwMCxlLnBlcmNlbnQ9MWUzLGUuYW1wZXJzYW5kPTgzMyxlLnF1b3RlcmlnaHQ9MzMzLGUucGFyZW5sZWZ0PTMzMyxlLnBhcmVucmlnaHQ9MzMzLGUuYXN0ZXJpc2s9NTAwLGUucGx1cz01NzAsZS5jb21tYT0yNTAsZS5oeXBoZW49MzMzLGUucGVyaW9kPTI1MCxlLnNsYXNoPTI3OCxlLnplcm89NTAwLGUub25lPTUwMCxlLnR3bz01MDAsZS50aHJlZT01MDAsZS5mb3VyPTUwMCxlLmZpdmU9NTAwLGUuc2l4PTUwMCxlLnNldmVuPTUwMCxlLmVpZ2h0PTUwMCxlLm5pbmU9NTAwLGUuY29sb249MzMzLGUuc2VtaWNvbG9uPTMzMyxlLmxlc3M9NTcwLGUuZXF1YWw9NTcwLGUuZ3JlYXRlcj01NzAsZS5xdWVzdGlvbj01MDAsZS5hdD05MzAsZS5BPTcyMixlLkI9NjY3LGUuQz03MjIsZS5EPTcyMixlLkU9NjY3LGUuRj02MTEsZS5HPTc3OCxlLkg9Nzc4LGUuST0zODksZS5KPTUwMCxlLks9Nzc4LGUuTD02NjcsZS5NPTk0NCxlLk49NzIyLGUuTz03NzgsZS5QPTYxMSxlLlE9Nzc4LGUuUj03MjIsZS5TPTU1NixlLlQ9NjY3LGUuVT03MjIsZS5WPTcyMixlLlc9MWUzLGUuWD03MjIsZS5ZPTcyMixlLlo9NjY3LGUuYnJhY2tldGxlZnQ9MzMzLGUuYmFja3NsYXNoPTI3OCxlLmJyYWNrZXRyaWdodD0zMzMsZS5hc2NpaWNpcmN1bT01ODEsZS51bmRlcnNjb3JlPTUwMCxlLnF1b3RlbGVmdD0zMzMsZS5hPTUwMCxlLmI9NTU2LGUuYz00NDQsZS5kPTU1NixlLmU9NDQ0LGUuZj0zMzMsZS5nPTUwMCxlLmg9NTU2LGUuaT0yNzgsZS5qPTMzMyxlLms9NTU2LGUubD0yNzgsZS5tPTgzMyxlLm49NTU2LGUubz01MDAsZS5wPTU1NixlLnE9NTU2LGUucj00NDQsZS5zPTM4OSxlLnQ9MzMzLGUudT01NTYsZS52PTUwMCxlLnc9NzIyLGUueD01MDAsZS55PTUwMCxlLno9NDQ0LGUuYnJhY2VsZWZ0PTM5NCxlLmJhcj0yMjAsZS5icmFjZXJpZ2h0PTM5NCxlLmFzY2lpdGlsZGU9NTIwLGUuZXhjbGFtZG93bj0zMzMsZS5jZW50PTUwMCxlLnN0ZXJsaW5nPTUwMCxlLmZyYWN0aW9uPTE2NyxlLnllbj01MDAsZS5mbG9yaW49NTAwLGUuc2VjdGlvbj01MDAsZS5jdXJyZW5jeT01MDAsZS5xdW90ZXNpbmdsZT0yNzgsZS5xdW90ZWRibGxlZnQ9NTAwLGUuZ3VpbGxlbW90bGVmdD01MDAsZS5ndWlsc2luZ2xsZWZ0PTMzMyxlLmd1aWxzaW5nbHJpZ2h0PTMzMyxlLmZpPTU1NixlLmZsPTU1NixlLmVuZGFzaD01MDAsZS5kYWdnZXI9NTAwLGUuZGFnZ2VyZGJsPTUwMCxlLnBlcmlvZGNlbnRlcmVkPTI1MCxlLnBhcmFncmFwaD01NDAsZS5idWxsZXQ9MzUwLGUucXVvdGVzaW5nbGJhc2U9MzMzLGUucXVvdGVkYmxiYXNlPTUwMCxlLnF1b3RlZGJscmlnaHQ9NTAwLGUuZ3VpbGxlbW90cmlnaHQ9NTAwLGUuZWxsaXBzaXM9MWUzLGUucGVydGhvdXNhbmQ9MWUzLGUucXVlc3Rpb25kb3duPTUwMCxlLmdyYXZlPTMzMyxlLmFjdXRlPTMzMyxlLmNpcmN1bWZsZXg9MzMzLGUudGlsZGU9MzMzLGUubWFjcm9uPTMzMyxlLmJyZXZlPTMzMyxlLmRvdGFjY2VudD0zMzMsZS5kaWVyZXNpcz0zMzMsZS5yaW5nPTMzMyxlLmNlZGlsbGE9MzMzLGUuaHVuZ2FydW1sYXV0PTMzMyxlLm9nb25laz0zMzMsZS5jYXJvbj0zMzMsZS5lbWRhc2g9MWUzLGUuQUU9MWUzLGUub3JkZmVtaW5pbmU9MzAwLGUuTHNsYXNoPTY2NyxlLk9zbGFzaD03NzgsZS5PRT0xZTMsZS5vcmRtYXNjdWxpbmU9MzMwLGUuYWU9NzIyLGUuZG90bGVzc2k9Mjc4LGUubHNsYXNoPTI3OCxlLm9zbGFzaD01MDAsZS5vZT03MjIsZS5nZXJtYW5kYmxzPTU1NixlLklkaWVyZXNpcz0zODksZS5lYWN1dGU9NDQ0LGUuYWJyZXZlPTUwMCxlLnVodW5nYXJ1bWxhdXQ9NTU2LGUuZWNhcm9uPTQ0NCxlLllkaWVyZXNpcz03MjIsZS5kaXZpZGU9NTcwLGUuWWFjdXRlPTcyMixlLkFjaXJjdW1mbGV4PTcyMixlLmFhY3V0ZT01MDAsZS5VY2lyY3VtZmxleD03MjIsZS55YWN1dGU9NTAwLGUuc2NvbW1hYWNjZW50PTM4OSxlLmVjaXJjdW1mbGV4PTQ0NCxlLlVyaW5nPTcyMixlLlVkaWVyZXNpcz03MjIsZS5hb2dvbmVrPTUwMCxlLlVhY3V0ZT03MjIsZS51b2dvbmVrPTU1NixlLkVkaWVyZXNpcz02NjcsZS5EY3JvYXQ9NzIyLGUuY29tbWFhY2NlbnQ9MjUwLGUuY29weXJpZ2h0PTc0NyxlLkVtYWNyb249NjY3LGUuY2Nhcm9uPTQ0NCxlLmFyaW5nPTUwMCxlLk5jb21tYWFjY2VudD03MjIsZS5sYWN1dGU9Mjc4LGUuYWdyYXZlPTUwMCxlLlRjb21tYWFjY2VudD02NjcsZS5DYWN1dGU9NzIyLGUuYXRpbGRlPTUwMCxlLkVkb3RhY2NlbnQ9NjY3LGUuc2Nhcm9uPTM4OSxlLnNjZWRpbGxhPTM4OSxlLmlhY3V0ZT0yNzgsZS5sb3plbmdlPTQ5NCxlLlJjYXJvbj03MjIsZS5HY29tbWFhY2NlbnQ9Nzc4LGUudWNpcmN1bWZsZXg9NTU2LGUuYWNpcmN1bWZsZXg9NTAwLGUuQW1hY3Jvbj03MjIsZS5yY2Fyb249NDQ0LGUuY2NlZGlsbGE9NDQ0LGUuWmRvdGFjY2VudD02NjcsZS5UaG9ybj02MTEsZS5PbWFjcm9uPTc3OCxlLlJhY3V0ZT03MjIsZS5TYWN1dGU9NTU2LGUuZGNhcm9uPTY3MixlLlVtYWNyb249NzIyLGUudXJpbmc9NTU2LGUudGhyZWVzdXBlcmlvcj0zMDAsZS5PZ3JhdmU9Nzc4LGUuQWdyYXZlPTcyMixlLkFicmV2ZT03MjIsZS5tdWx0aXBseT01NzAsZS51YWN1dGU9NTU2LGUuVGNhcm9uPTY2NyxlLnBhcnRpYWxkaWZmPTQ5NCxlLnlkaWVyZXNpcz01MDAsZS5OYWN1dGU9NzIyLGUuaWNpcmN1bWZsZXg9Mjc4LGUuRWNpcmN1bWZsZXg9NjY3LGUuYWRpZXJlc2lzPTUwMCxlLmVkaWVyZXNpcz00NDQsZS5jYWN1dGU9NDQ0LGUubmFjdXRlPTU1NixlLnVtYWNyb249NTU2LGUuTmNhcm9uPTcyMixlLklhY3V0ZT0zODksZS5wbHVzbWludXM9NTcwLGUuYnJva2VuYmFyPTIyMCxlLnJlZ2lzdGVyZWQ9NzQ3LGUuR2JyZXZlPTc3OCxlLklkb3RhY2NlbnQ9Mzg5LGUuc3VtbWF0aW9uPTYwMCxlLkVncmF2ZT02NjcsZS5yYWN1dGU9NDQ0LGUub21hY3Jvbj01MDAsZS5aYWN1dGU9NjY3LGUuWmNhcm9uPTY2NyxlLmdyZWF0ZXJlcXVhbD01NDksZS5FdGg9NzIyLGUuQ2NlZGlsbGE9NzIyLGUubGNvbW1hYWNjZW50PTI3OCxlLnRjYXJvbj00MTYsZS5lb2dvbmVrPTQ0NCxlLlVvZ29uZWs9NzIyLGUuQWFjdXRlPTcyMixlLkFkaWVyZXNpcz03MjIsZS5lZ3JhdmU9NDQ0LGUuemFjdXRlPTQ0NCxlLmlvZ29uZWs9Mjc4LGUuT2FjdXRlPTc3OCxlLm9hY3V0ZT01MDAsZS5hbWFjcm9uPTUwMCxlLnNhY3V0ZT0zODksZS5pZGllcmVzaXM9Mjc4LGUuT2NpcmN1bWZsZXg9Nzc4LGUuVWdyYXZlPTcyMixlLkRlbHRhPTYxMixlLnRob3JuPTU1NixlLnR3b3N1cGVyaW9yPTMwMCxlLk9kaWVyZXNpcz03NzgsZS5tdT01NTYsZS5pZ3JhdmU9Mjc4LGUub2h1bmdhcnVtbGF1dD01MDAsZS5Fb2dvbmVrPTY2NyxlLmRjcm9hdD01NTYsZS50aHJlZXF1YXJ0ZXJzPTc1MCxlLlNjZWRpbGxhPTU1NixlLmxjYXJvbj0zOTQsZS5LY29tbWFhY2NlbnQ9Nzc4LGUuTGFjdXRlPTY2NyxlLnRyYWRlbWFyaz0xZTMsZS5lZG90YWNjZW50PTQ0NCxlLklncmF2ZT0zODksZS5JbWFjcm9uPTM4OSxlLkxjYXJvbj02NjcsZS5vbmVoYWxmPTc1MCxlLmxlc3NlcXVhbD01NDksZS5vY2lyY3VtZmxleD01MDAsZS5udGlsZGU9NTU2LGUuVWh1bmdhcnVtbGF1dD03MjIsZS5FYWN1dGU9NjY3LGUuZW1hY3Jvbj00NDQsZS5nYnJldmU9NTAwLGUub25lcXVhcnRlcj03NTAsZS5TY2Fyb249NTU2LGUuU2NvbW1hYWNjZW50PTU1NixlLk9odW5nYXJ1bWxhdXQ9Nzc4LGUuZGVncmVlPTQwMCxlLm9ncmF2ZT01MDAsZS5DY2Fyb249NzIyLGUudWdyYXZlPTU1NixlLnJhZGljYWw9NTQ5LGUuRGNhcm9uPTcyMixlLnJjb21tYWFjY2VudD00NDQsZS5OdGlsZGU9NzIyLGUub3RpbGRlPTUwMCxlLlJjb21tYWFjY2VudD03MjIsZS5MY29tbWFhY2NlbnQ9NjY3LGUuQXRpbGRlPTcyMixlLkFvZ29uZWs9NzIyLGUuQXJpbmc9NzIyLGUuT3RpbGRlPTc3OCxlLnpkb3RhY2NlbnQ9NDQ0LGUuRWNhcm9uPTY2NyxlLklvZ29uZWs9Mzg5LGUua2NvbW1hYWNjZW50PTU1NixlLm1pbnVzPTU3MCxlLkljaXJjdW1mbGV4PTM4OSxlLm5jYXJvbj01NTYsZS50Y29tbWFhY2NlbnQ9MzMzLGUubG9naWNhbG5vdD01NzAsZS5vZGllcmVzaXM9NTAwLGUudWRpZXJlc2lzPTU1NixlLm5vdGVxdWFsPTU0OSxlLmdjb21tYWFjY2VudD01MDAsZS5ldGg9NTAwLGUuemNhcm9uPTQ0NCxlLm5jb21tYWFjY2VudD01NTYsZS5vbmVzdXBlcmlvcj0zMDAsZS5pbWFjcm9uPTI3OCxlLkV1cm89NTAwfSkpLGVbIlRpbWVzLUJvbGRJdGFsaWMiXT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwLGUuZXhjbGFtPTM4OSxlLnF1b3RlZGJsPTU1NSxlLm51bWJlcnNpZ249NTAwLGUuZG9sbGFyPTUwMCxlLnBlcmNlbnQ9ODMzLGUuYW1wZXJzYW5kPTc3OCxlLnF1b3RlcmlnaHQ9MzMzLGUucGFyZW5sZWZ0PTMzMyxlLnBhcmVucmlnaHQ9MzMzLGUuYXN0ZXJpc2s9NTAwLGUucGx1cz01NzAsZS5jb21tYT0yNTAsZS5oeXBoZW49MzMzLGUucGVyaW9kPTI1MCxlLnNsYXNoPTI3OCxlLnplcm89NTAwLGUub25lPTUwMCxlLnR3bz01MDAsZS50aHJlZT01MDAsZS5mb3VyPTUwMCxlLmZpdmU9NTAwLGUuc2l4PTUwMCxlLnNldmVuPTUwMCxlLmVpZ2h0PTUwMCxlLm5pbmU9NTAwLGUuY29sb249MzMzLGUuc2VtaWNvbG9uPTMzMyxlLmxlc3M9NTcwLGUuZXF1YWw9NTcwLGUuZ3JlYXRlcj01NzAsZS5xdWVzdGlvbj01MDAsZS5hdD04MzIsZS5BPTY2NyxlLkI9NjY3LGUuQz02NjcsZS5EPTcyMixlLkU9NjY3LGUuRj02NjcsZS5HPTcyMixlLkg9Nzc4LGUuST0zODksZS5KPTUwMCxlLks9NjY3LGUuTD02MTEsZS5NPTg4OSxlLk49NzIyLGUuTz03MjIsZS5QPTYxMSxlLlE9NzIyLGUuUj02NjcsZS5TPTU1NixlLlQ9NjExLGUuVT03MjIsZS5WPTY2NyxlLlc9ODg5LGUuWD02NjcsZS5ZPTYxMSxlLlo9NjExLGUuYnJhY2tldGxlZnQ9MzMzLGUuYmFja3NsYXNoPTI3OCxlLmJyYWNrZXRyaWdodD0zMzMsZS5hc2NpaWNpcmN1bT01NzAsZS51bmRlcnNjb3JlPTUwMCxlLnF1b3RlbGVmdD0zMzMsZS5hPTUwMCxlLmI9NTAwLGUuYz00NDQsZS5kPTUwMCxlLmU9NDQ0LGUuZj0zMzMsZS5nPTUwMCxlLmg9NTU2LGUuaT0yNzgsZS5qPTI3OCxlLms9NTAwLGUubD0yNzgsZS5tPTc3OCxlLm49NTU2LGUubz01MDAsZS5wPTUwMCxlLnE9NTAwLGUucj0zODksZS5zPTM4OSxlLnQ9Mjc4LGUudT01NTYsZS52PTQ0NCxlLnc9NjY3LGUueD01MDAsZS55PTQ0NCxlLno9Mzg5LGUuYnJhY2VsZWZ0PTM0OCxlLmJhcj0yMjAsZS5icmFjZXJpZ2h0PTM0OCxlLmFzY2lpdGlsZGU9NTcwLGUuZXhjbGFtZG93bj0zODksZS5jZW50PTUwMCxlLnN0ZXJsaW5nPTUwMCxlLmZyYWN0aW9uPTE2NyxlLnllbj01MDAsZS5mbG9yaW49NTAwLGUuc2VjdGlvbj01MDAsZS5jdXJyZW5jeT01MDAsZS5xdW90ZXNpbmdsZT0yNzgsZS5xdW90ZWRibGxlZnQ9NTAwLGUuZ3VpbGxlbW90bGVmdD01MDAsZS5ndWlsc2luZ2xsZWZ0PTMzMyxlLmd1aWxzaW5nbHJpZ2h0PTMzMyxlLmZpPTU1NixlLmZsPTU1NixlLmVuZGFzaD01MDAsZS5kYWdnZXI9NTAwLGUuZGFnZ2VyZGJsPTUwMCxlLnBlcmlvZGNlbnRlcmVkPTI1MCxlLnBhcmFncmFwaD01MDAsZS5idWxsZXQ9MzUwLGUucXVvdGVzaW5nbGJhc2U9MzMzLGUucXVvdGVkYmxiYXNlPTUwMCxlLnF1b3RlZGJscmlnaHQ9NTAwLGUuZ3VpbGxlbW90cmlnaHQ9NTAwLGUuZWxsaXBzaXM9MWUzLGUucGVydGhvdXNhbmQ9MWUzLGUucXVlc3Rpb25kb3duPTUwMCxlLmdyYXZlPTMzMyxlLmFjdXRlPTMzMyxlLmNpcmN1bWZsZXg9MzMzLGUudGlsZGU9MzMzLGUubWFjcm9uPTMzMyxlLmJyZXZlPTMzMyxlLmRvdGFjY2VudD0zMzMsZS5kaWVyZXNpcz0zMzMsZS5yaW5nPTMzMyxlLmNlZGlsbGE9MzMzLGUuaHVuZ2FydW1sYXV0PTMzMyxlLm9nb25laz0zMzMsZS5jYXJvbj0zMzMsZS5lbWRhc2g9MWUzLGUuQUU9OTQ0LGUub3JkZmVtaW5pbmU9MjY2LGUuTHNsYXNoPTYxMSxlLk9zbGFzaD03MjIsZS5PRT05NDQsZS5vcmRtYXNjdWxpbmU9MzAwLGUuYWU9NzIyLGUuZG90bGVzc2k9Mjc4LGUubHNsYXNoPTI3OCxlLm9zbGFzaD01MDAsZS5vZT03MjIsZS5nZXJtYW5kYmxzPTUwMCxlLklkaWVyZXNpcz0zODksZS5lYWN1dGU9NDQ0LGUuYWJyZXZlPTUwMCxlLnVodW5nYXJ1bWxhdXQ9NTU2LGUuZWNhcm9uPTQ0NCxlLllkaWVyZXNpcz02MTEsZS5kaXZpZGU9NTcwLGUuWWFjdXRlPTYxMSxlLkFjaXJjdW1mbGV4PTY2NyxlLmFhY3V0ZT01MDAsZS5VY2lyY3VtZmxleD03MjIsZS55YWN1dGU9NDQ0LGUuc2NvbW1hYWNjZW50PTM4OSxlLmVjaXJjdW1mbGV4PTQ0NCxlLlVyaW5nPTcyMixlLlVkaWVyZXNpcz03MjIsZS5hb2dvbmVrPTUwMCxlLlVhY3V0ZT03MjIsZS51b2dvbmVrPTU1NixlLkVkaWVyZXNpcz02NjcsZS5EY3JvYXQ9NzIyLGUuY29tbWFhY2NlbnQ9MjUwLGUuY29weXJpZ2h0PTc0NyxlLkVtYWNyb249NjY3LGUuY2Nhcm9uPTQ0NCxlLmFyaW5nPTUwMCxlLk5jb21tYWFjY2VudD03MjIsZS5sYWN1dGU9Mjc4LGUuYWdyYXZlPTUwMCxlLlRjb21tYWFjY2VudD02MTEsZS5DYWN1dGU9NjY3LGUuYXRpbGRlPTUwMCxlLkVkb3RhY2NlbnQ9NjY3LGUuc2Nhcm9uPTM4OSxlLnNjZWRpbGxhPTM4OSxlLmlhY3V0ZT0yNzgsZS5sb3plbmdlPTQ5NCxlLlJjYXJvbj02NjcsZS5HY29tbWFhY2NlbnQ9NzIyLGUudWNpcmN1bWZsZXg9NTU2LGUuYWNpcmN1bWZsZXg9NTAwLGUuQW1hY3Jvbj02NjcsZS5yY2Fyb249Mzg5LGUuY2NlZGlsbGE9NDQ0LGUuWmRvdGFjY2VudD02MTEsZS5UaG9ybj02MTEsZS5PbWFjcm9uPTcyMixlLlJhY3V0ZT02NjcsZS5TYWN1dGU9NTU2LGUuZGNhcm9uPTYwOCxlLlVtYWNyb249NzIyLGUudXJpbmc9NTU2LGUudGhyZWVzdXBlcmlvcj0zMDAsZS5PZ3JhdmU9NzIyLGUuQWdyYXZlPTY2NyxlLkFicmV2ZT02NjcsZS5tdWx0aXBseT01NzAsZS51YWN1dGU9NTU2LGUuVGNhcm9uPTYxMSxlLnBhcnRpYWxkaWZmPTQ5NCxlLnlkaWVyZXNpcz00NDQsZS5OYWN1dGU9NzIyLGUuaWNpcmN1bWZsZXg9Mjc4LGUuRWNpcmN1bWZsZXg9NjY3LGUuYWRpZXJlc2lzPTUwMCxlLmVkaWVyZXNpcz00NDQsZS5jYWN1dGU9NDQ0LGUubmFjdXRlPTU1NixlLnVtYWNyb249NTU2LGUuTmNhcm9uPTcyMixlLklhY3V0ZT0zODksZS5wbHVzbWludXM9NTcwLGUuYnJva2VuYmFyPTIyMCxlLnJlZ2lzdGVyZWQ9NzQ3LGUuR2JyZXZlPTcyMixlLklkb3RhY2NlbnQ9Mzg5LGUuc3VtbWF0aW9uPTYwMCxlLkVncmF2ZT02NjcsZS5yYWN1dGU9Mzg5LGUub21hY3Jvbj01MDAsZS5aYWN1dGU9NjExLGUuWmNhcm9uPTYxMSxlLmdyZWF0ZXJlcXVhbD01NDksZS5FdGg9NzIyLGUuQ2NlZGlsbGE9NjY3LGUubGNvbW1hYWNjZW50PTI3OCxlLnRjYXJvbj0zNjYsZS5lb2dvbmVrPTQ0NCxlLlVvZ29uZWs9NzIyLGUuQWFjdXRlPTY2NyxlLkFkaWVyZXNpcz02NjcsZS5lZ3JhdmU9NDQ0LGUuemFjdXRlPTM4OSxlLmlvZ29uZWs9Mjc4LGUuT2FjdXRlPTcyMixlLm9hY3V0ZT01MDAsZS5hbWFjcm9uPTUwMCxlLnNhY3V0ZT0zODksZS5pZGllcmVzaXM9Mjc4LGUuT2NpcmN1bWZsZXg9NzIyLGUuVWdyYXZlPTcyMixlLkRlbHRhPTYxMixlLnRob3JuPTUwMCxlLnR3b3N1cGVyaW9yPTMwMCxlLk9kaWVyZXNpcz03MjIsZS5tdT01NzYsZS5pZ3JhdmU9Mjc4LGUub2h1bmdhcnVtbGF1dD01MDAsZS5Fb2dvbmVrPTY2NyxlLmRjcm9hdD01MDAsZS50aHJlZXF1YXJ0ZXJzPTc1MCxlLlNjZWRpbGxhPTU1NixlLmxjYXJvbj0zODIsZS5LY29tbWFhY2NlbnQ9NjY3LGUuTGFjdXRlPTYxMSxlLnRyYWRlbWFyaz0xZTMsZS5lZG90YWNjZW50PTQ0NCxlLklncmF2ZT0zODksZS5JbWFjcm9uPTM4OSxlLkxjYXJvbj02MTEsZS5vbmVoYWxmPTc1MCxlLmxlc3NlcXVhbD01NDksZS5vY2lyY3VtZmxleD01MDAsZS5udGlsZGU9NTU2LGUuVWh1bmdhcnVtbGF1dD03MjIsZS5FYWN1dGU9NjY3LGUuZW1hY3Jvbj00NDQsZS5nYnJldmU9NTAwLGUub25lcXVhcnRlcj03NTAsZS5TY2Fyb249NTU2LGUuU2NvbW1hYWNjZW50PTU1NixlLk9odW5nYXJ1bWxhdXQ9NzIyLGUuZGVncmVlPTQwMCxlLm9ncmF2ZT01MDAsZS5DY2Fyb249NjY3LGUudWdyYXZlPTU1NixlLnJhZGljYWw9NTQ5LGUuRGNhcm9uPTcyMixlLnJjb21tYWFjY2VudD0zODksZS5OdGlsZGU9NzIyLGUub3RpbGRlPTUwMCxlLlJjb21tYWFjY2VudD02NjcsZS5MY29tbWFhY2NlbnQ9NjExLGUuQXRpbGRlPTY2NyxlLkFvZ29uZWs9NjY3LGUuQXJpbmc9NjY3LGUuT3RpbGRlPTcyMixlLnpkb3RhY2NlbnQ9Mzg5LGUuRWNhcm9uPTY2NyxlLklvZ29uZWs9Mzg5LGUua2NvbW1hYWNjZW50PTUwMCxlLm1pbnVzPTYwNixlLkljaXJjdW1mbGV4PTM4OSxlLm5jYXJvbj01NTYsZS50Y29tbWFhY2NlbnQ9Mjc4LGUubG9naWNhbG5vdD02MDYsZS5vZGllcmVzaXM9NTAwLGUudWRpZXJlc2lzPTU1NixlLm5vdGVxdWFsPTU0OSxlLmdjb21tYWFjY2VudD01MDAsZS5ldGg9NTAwLGUuemNhcm9uPTM4OSxlLm5jb21tYWFjY2VudD01NTYsZS5vbmVzdXBlcmlvcj0zMDAsZS5pbWFjcm9uPTI3OCxlLkV1cm89NTAwfSkpLGVbIlRpbWVzLUl0YWxpYyJdPSgwLG4uZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5zcGFjZT0yNTAsZS5leGNsYW09MzMzLGUucXVvdGVkYmw9NDIwLGUubnVtYmVyc2lnbj01MDAsZS5kb2xsYXI9NTAwLGUucGVyY2VudD04MzMsZS5hbXBlcnNhbmQ9Nzc4LGUucXVvdGVyaWdodD0zMzMsZS5wYXJlbmxlZnQ9MzMzLGUucGFyZW5yaWdodD0zMzMsZS5hc3Rlcmlzaz01MDAsZS5wbHVzPTY3NSxlLmNvbW1hPTI1MCxlLmh5cGhlbj0zMzMsZS5wZXJpb2Q9MjUwLGUuc2xhc2g9Mjc4LGUuemVybz01MDAsZS5vbmU9NTAwLGUudHdvPTUwMCxlLnRocmVlPTUwMCxlLmZvdXI9NTAwLGUuZml2ZT01MDAsZS5zaXg9NTAwLGUuc2V2ZW49NTAwLGUuZWlnaHQ9NTAwLGUubmluZT01MDAsZS5jb2xvbj0zMzMsZS5zZW1pY29sb249MzMzLGUubGVzcz02NzUsZS5lcXVhbD02NzUsZS5ncmVhdGVyPTY3NSxlLnF1ZXN0aW9uPTUwMCxlLmF0PTkyMCxlLkE9NjExLGUuQj02MTEsZS5DPTY2NyxlLkQ9NzIyLGUuRT02MTEsZS5GPTYxMSxlLkc9NzIyLGUuSD03MjIsZS5JPTMzMyxlLko9NDQ0LGUuSz02NjcsZS5MPTU1NixlLk09ODMzLGUuTj02NjcsZS5PPTcyMixlLlA9NjExLGUuUT03MjIsZS5SPTYxMSxlLlM9NTAwLGUuVD01NTYsZS5VPTcyMixlLlY9NjExLGUuVz04MzMsZS5YPTYxMSxlLlk9NTU2LGUuWj01NTYsZS5icmFja2V0bGVmdD0zODksZS5iYWNrc2xhc2g9Mjc4LGUuYnJhY2tldHJpZ2h0PTM4OSxlLmFzY2lpY2lyY3VtPTQyMixlLnVuZGVyc2NvcmU9NTAwLGUucXVvdGVsZWZ0PTMzMyxlLmE9NTAwLGUuYj01MDAsZS5jPTQ0NCxlLmQ9NTAwLGUuZT00NDQsZS5mPTI3OCxlLmc9NTAwLGUuaD01MDAsZS5pPTI3OCxlLmo9Mjc4LGUuaz00NDQsZS5sPTI3OCxlLm09NzIyLGUubj01MDAsZS5vPTUwMCxlLnA9NTAwLGUucT01MDAsZS5yPTM4OSxlLnM9Mzg5LGUudD0yNzgsZS51PTUwMCxlLnY9NDQ0LGUudz02NjcsZS54PTQ0NCxlLnk9NDQ0LGUuej0zODksZS5icmFjZWxlZnQ9NDAwLGUuYmFyPTI3NSxlLmJyYWNlcmlnaHQ9NDAwLGUuYXNjaWl0aWxkZT01NDEsZS5leGNsYW1kb3duPTM4OSxlLmNlbnQ9NTAwLGUuc3Rlcmxpbmc9NTAwLGUuZnJhY3Rpb249MTY3LGUueWVuPTUwMCxlLmZsb3Jpbj01MDAsZS5zZWN0aW9uPTUwMCxlLmN1cnJlbmN5PTUwMCxlLnF1b3Rlc2luZ2xlPTIxNCxlLnF1b3RlZGJsbGVmdD01NTYsZS5ndWlsbGVtb3RsZWZ0PTUwMCxlLmd1aWxzaW5nbGxlZnQ9MzMzLGUuZ3VpbHNpbmdscmlnaHQ9MzMzLGUuZmk9NTAwLGUuZmw9NTAwLGUuZW5kYXNoPTUwMCxlLmRhZ2dlcj01MDAsZS5kYWdnZXJkYmw9NTAwLGUucGVyaW9kY2VudGVyZWQ9MjUwLGUucGFyYWdyYXBoPTUyMyxlLmJ1bGxldD0zNTAsZS5xdW90ZXNpbmdsYmFzZT0zMzMsZS5xdW90ZWRibGJhc2U9NTU2LGUucXVvdGVkYmxyaWdodD01NTYsZS5ndWlsbGVtb3RyaWdodD01MDAsZS5lbGxpcHNpcz04ODksZS5wZXJ0aG91c2FuZD0xZTMsZS5xdWVzdGlvbmRvd249NTAwLGUuZ3JhdmU9MzMzLGUuYWN1dGU9MzMzLGUuY2lyY3VtZmxleD0zMzMsZS50aWxkZT0zMzMsZS5tYWNyb249MzMzLGUuYnJldmU9MzMzLGUuZG90YWNjZW50PTMzMyxlLmRpZXJlc2lzPTMzMyxlLnJpbmc9MzMzLGUuY2VkaWxsYT0zMzMsZS5odW5nYXJ1bWxhdXQ9MzMzLGUub2dvbmVrPTMzMyxlLmNhcm9uPTMzMyxlLmVtZGFzaD04ODksZS5BRT04ODksZS5vcmRmZW1pbmluZT0yNzYsZS5Mc2xhc2g9NTU2LGUuT3NsYXNoPTcyMixlLk9FPTk0NCxlLm9yZG1hc2N1bGluZT0zMTAsZS5hZT02NjcsZS5kb3RsZXNzaT0yNzgsZS5sc2xhc2g9Mjc4LGUub3NsYXNoPTUwMCxlLm9lPTY2NyxlLmdlcm1hbmRibHM9NTAwLGUuSWRpZXJlc2lzPTMzMyxlLmVhY3V0ZT00NDQsZS5hYnJldmU9NTAwLGUudWh1bmdhcnVtbGF1dD01MDAsZS5lY2Fyb249NDQ0LGUuWWRpZXJlc2lzPTU1NixlLmRpdmlkZT02NzUsZS5ZYWN1dGU9NTU2LGUuQWNpcmN1bWZsZXg9NjExLGUuYWFjdXRlPTUwMCxlLlVjaXJjdW1mbGV4PTcyMixlLnlhY3V0ZT00NDQsZS5zY29tbWFhY2NlbnQ9Mzg5LGUuZWNpcmN1bWZsZXg9NDQ0LGUuVXJpbmc9NzIyLGUuVWRpZXJlc2lzPTcyMixlLmFvZ29uZWs9NTAwLGUuVWFjdXRlPTcyMixlLnVvZ29uZWs9NTAwLGUuRWRpZXJlc2lzPTYxMSxlLkRjcm9hdD03MjIsZS5jb21tYWFjY2VudD0yNTAsZS5jb3B5cmlnaHQ9NzYwLGUuRW1hY3Jvbj02MTEsZS5jY2Fyb249NDQ0LGUuYXJpbmc9NTAwLGUuTmNvbW1hYWNjZW50PTY2NyxlLmxhY3V0ZT0yNzgsZS5hZ3JhdmU9NTAwLGUuVGNvbW1hYWNjZW50PTU1NixlLkNhY3V0ZT02NjcsZS5hdGlsZGU9NTAwLGUuRWRvdGFjY2VudD02MTEsZS5zY2Fyb249Mzg5LGUuc2NlZGlsbGE9Mzg5LGUuaWFjdXRlPTI3OCxlLmxvemVuZ2U9NDcxLGUuUmNhcm9uPTYxMSxlLkdjb21tYWFjY2VudD03MjIsZS51Y2lyY3VtZmxleD01MDAsZS5hY2lyY3VtZmxleD01MDAsZS5BbWFjcm9uPTYxMSxlLnJjYXJvbj0zODksZS5jY2VkaWxsYT00NDQsZS5aZG90YWNjZW50PTU1NixlLlRob3JuPTYxMSxlLk9tYWNyb249NzIyLGUuUmFjdXRlPTYxMSxlLlNhY3V0ZT01MDAsZS5kY2Fyb249NTQ0LGUuVW1hY3Jvbj03MjIsZS51cmluZz01MDAsZS50aHJlZXN1cGVyaW9yPTMwMCxlLk9ncmF2ZT03MjIsZS5BZ3JhdmU9NjExLGUuQWJyZXZlPTYxMSxlLm11bHRpcGx5PTY3NSxlLnVhY3V0ZT01MDAsZS5UY2Fyb249NTU2LGUucGFydGlhbGRpZmY9NDc2LGUueWRpZXJlc2lzPTQ0NCxlLk5hY3V0ZT02NjcsZS5pY2lyY3VtZmxleD0yNzgsZS5FY2lyY3VtZmxleD02MTEsZS5hZGllcmVzaXM9NTAwLGUuZWRpZXJlc2lzPTQ0NCxlLmNhY3V0ZT00NDQsZS5uYWN1dGU9NTAwLGUudW1hY3Jvbj01MDAsZS5OY2Fyb249NjY3LGUuSWFjdXRlPTMzMyxlLnBsdXNtaW51cz02NzUsZS5icm9rZW5iYXI9Mjc1LGUucmVnaXN0ZXJlZD03NjAsZS5HYnJldmU9NzIyLGUuSWRvdGFjY2VudD0zMzMsZS5zdW1tYXRpb249NjAwLGUuRWdyYXZlPTYxMSxlLnJhY3V0ZT0zODksZS5vbWFjcm9uPTUwMCxlLlphY3V0ZT01NTYsZS5aY2Fyb249NTU2LGUuZ3JlYXRlcmVxdWFsPTU0OSxlLkV0aD03MjIsZS5DY2VkaWxsYT02NjcsZS5sY29tbWFhY2NlbnQ9Mjc4LGUudGNhcm9uPTMwMCxlLmVvZ29uZWs9NDQ0LGUuVW9nb25laz03MjIsZS5BYWN1dGU9NjExLGUuQWRpZXJlc2lzPTYxMSxlLmVncmF2ZT00NDQsZS56YWN1dGU9Mzg5LGUuaW9nb25laz0yNzgsZS5PYWN1dGU9NzIyLGUub2FjdXRlPTUwMCxlLmFtYWNyb249NTAwLGUuc2FjdXRlPTM4OSxlLmlkaWVyZXNpcz0yNzgsZS5PY2lyY3VtZmxleD03MjIsZS5VZ3JhdmU9NzIyLGUuRGVsdGE9NjEyLGUudGhvcm49NTAwLGUudHdvc3VwZXJpb3I9MzAwLGUuT2RpZXJlc2lzPTcyMixlLm11PTUwMCxlLmlncmF2ZT0yNzgsZS5vaHVuZ2FydW1sYXV0PTUwMCxlLkVvZ29uZWs9NjExLGUuZGNyb2F0PTUwMCxlLnRocmVlcXVhcnRlcnM9NzUwLGUuU2NlZGlsbGE9NTAwLGUubGNhcm9uPTMwMCxlLktjb21tYWFjY2VudD02NjcsZS5MYWN1dGU9NTU2LGUudHJhZGVtYXJrPTk4MCxlLmVkb3RhY2NlbnQ9NDQ0LGUuSWdyYXZlPTMzMyxlLkltYWNyb249MzMzLGUuTGNhcm9uPTYxMSxlLm9uZWhhbGY9NzUwLGUubGVzc2VxdWFsPTU0OSxlLm9jaXJjdW1mbGV4PTUwMCxlLm50aWxkZT01MDAsZS5VaHVuZ2FydW1sYXV0PTcyMixlLkVhY3V0ZT02MTEsZS5lbWFjcm9uPTQ0NCxlLmdicmV2ZT01MDAsZS5vbmVxdWFydGVyPTc1MCxlLlNjYXJvbj01MDAsZS5TY29tbWFhY2NlbnQ9NTAwLGUuT2h1bmdhcnVtbGF1dD03MjIsZS5kZWdyZWU9NDAwLGUub2dyYXZlPTUwMCxlLkNjYXJvbj02NjcsZS51Z3JhdmU9NTAwLGUucmFkaWNhbD00NTMsZS5EY2Fyb249NzIyLGUucmNvbW1hYWNjZW50PTM4OSxlLk50aWxkZT02NjcsZS5vdGlsZGU9NTAwLGUuUmNvbW1hYWNjZW50PTYxMSxlLkxjb21tYWFjY2VudD01NTYsZS5BdGlsZGU9NjExLGUuQW9nb25laz02MTEsZS5BcmluZz02MTEsZS5PdGlsZGU9NzIyLGUuemRvdGFjY2VudD0zODksZS5FY2Fyb249NjExLGUuSW9nb25laz0zMzMsZS5rY29tbWFhY2NlbnQ9NDQ0LGUubWludXM9Njc1LGUuSWNpcmN1bWZsZXg9MzMzLGUubmNhcm9uPTUwMCxlLnRjb21tYWFjY2VudD0yNzgsZS5sb2dpY2Fsbm90PTY3NSxlLm9kaWVyZXNpcz01MDAsZS51ZGllcmVzaXM9NTAwLGUubm90ZXF1YWw9NTQ5LGUuZ2NvbW1hYWNjZW50PTUwMCxlLmV0aD01MDAsZS56Y2Fyb249Mzg5LGUubmNvbW1hYWNjZW50PTUwMCxlLm9uZXN1cGVyaW9yPTMwMCxlLmltYWNyb249Mjc4LGUuRXVybz01MDB9KSksZS5aYXBmRGluZ2JhdHM9KDAsbi5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnNwYWNlPTI3OCxlLmExPTk3NCxlLmEyPTk2MSxlLmEyMDI9OTc0LGUuYTM9OTgwLGUuYTQ9NzE5LGUuYTU9Nzg5LGUuYTExOT03OTAsZS5hMTE4PTc5MSxlLmExMTc9NjkwLGUuYTExPTk2MCxlLmExMj05MzksZS5hMTM9NTQ5LGUuYTE0PTg1NSxlLmExNT05MTEsZS5hMTY9OTMzLGUuYTEwNT05MTEsZS5hMTc9OTQ1LGUuYTE4PTk3NCxlLmExOT03NTUsZS5hMjA9ODQ2LGUuYTIxPTc2MixlLmEyMj03NjEsZS5hMjM9NTcxLGUuYTI0PTY3NyxlLmEyNT03NjMsZS5hMjY9NzYwLGUuYTI3PTc1OSxlLmEyOD03NTQsZS5hNj00OTQsZS5hNz01NTIsZS5hOD01MzcsZS5hOT01NzcsZS5hMTA9NjkyLGUuYTI5PTc4NixlLmEzMD03ODgsZS5hMzE9Nzg4LGUuYTMyPTc5MCxlLmEzMz03OTMsZS5hMzQ9Nzk0LGUuYTM1PTgxNixlLmEzNj04MjMsZS5hMzc9Nzg5LGUuYTM4PTg0MSxlLmEzOT04MjMsZS5hNDA9ODMzLGUuYTQxPTgxNixlLmE0Mj04MzEsZS5hNDM9OTIzLGUuYTQ0PTc0NCxlLmE0NT03MjMsZS5hNDY9NzQ5LGUuYTQ3PTc5MCxlLmE0OD03OTIsZS5hNDk9Njk1LGUuYTUwPTc3NixlLmE1MT03NjgsZS5hNTI9NzkyLGUuYTUzPTc1OSxlLmE1ND03MDcsZS5hNTU9NzA4LGUuYTU2PTY4MixlLmE1Nz03MDEsZS5hNTg9ODI2LGUuYTU5PTgxNSxlLmE2MD03ODksZS5hNjE9Nzg5LGUuYTYyPTcwNyxlLmE2Mz02ODcsZS5hNjQ9Njk2LGUuYTY1PTY4OSxlLmE2Nj03ODYsZS5hNjc9Nzg3LGUuYTY4PTcxMyxlLmE2OT03OTEsZS5hNzA9Nzg1LGUuYTcxPTc5MSxlLmE3Mj04NzMsZS5hNzM9NzYxLGUuYTc0PTc2MixlLmEyMDM9NzYyLGUuYTc1PTc1OSxlLmEyMDQ9NzU5LGUuYTc2PTg5MixlLmE3Nz04OTIsZS5hNzg9Nzg4LGUuYTc5PTc4NCxlLmE4MT00MzgsZS5hODI9MTM4LGUuYTgzPTI3NyxlLmE4ND00MTUsZS5hOTc9MzkyLGUuYTk4PTM5MixlLmE5OT02NjgsZS5hMTAwPTY2OCxlLmE4OT0zOTAsZS5hOTA9MzkwLGUuYTkzPTMxNyxlLmE5ND0zMTcsZS5hOTE9Mjc2LGUuYTkyPTI3NixlLmEyMDU9NTA5LGUuYTg1PTUwOSxlLmEyMDY9NDEwLGUuYTg2PTQxMCxlLmE4Nz0yMzQsZS5hODg9MjM0LGUuYTk1PTMzNCxlLmE5Nj0zMzQsZS5hMTAxPTczMixlLmExMDI9NTQ0LGUuYTEwMz01NDQsZS5hMTA0PTkxMCxlLmExMDY9NjY3LGUuYTEwNz03NjAsZS5hMTA4PTc2MCxlLmExMTI9Nzc2LGUuYTExMT01OTUsZS5hMTEwPTY5NCxlLmExMDk9NjI2LGUuYTEyMD03ODgsZS5hMTIxPTc4OCxlLmExMjI9Nzg4LGUuYTEyMz03ODgsZS5hMTI0PTc4OCxlLmExMjU9Nzg4LGUuYTEyNj03ODgsZS5hMTI3PTc4OCxlLmExMjg9Nzg4LGUuYTEyOT03ODgsZS5hMTMwPTc4OCxlLmExMzE9Nzg4LGUuYTEzMj03ODgsZS5hMTMzPTc4OCxlLmExMzQ9Nzg4LGUuYTEzNT03ODgsZS5hMTM2PTc4OCxlLmExMzc9Nzg4LGUuYTEzOD03ODgsZS5hMTM5PTc4OCxlLmExNDA9Nzg4LGUuYTE0MT03ODgsZS5hMTQyPTc4OCxlLmExNDM9Nzg4LGUuYTE0ND03ODgsZS5hMTQ1PTc4OCxlLmExNDY9Nzg4LGUuYTE0Nz03ODgsZS5hMTQ4PTc4OCxlLmExNDk9Nzg4LGUuYTE1MD03ODgsZS5hMTUxPTc4OCxlLmExNTI9Nzg4LGUuYTE1Mz03ODgsZS5hMTU0PTc4OCxlLmExNTU9Nzg4LGUuYTE1Nj03ODgsZS5hMTU3PTc4OCxlLmExNTg9Nzg4LGUuYTE1OT03ODgsZS5hMTYwPTg5NCxlLmExNjE9ODM4LGUuYTE2Mz0xMDE2LGUuYTE2ND00NTgsZS5hMTk2PTc0OCxlLmExNjU9OTI0LGUuYTE5Mj03NDgsZS5hMTY2PTkxOCxlLmExNjc9OTI3LGUuYTE2OD05MjgsZS5hMTY5PTkyOCxlLmExNzA9ODM0LGUuYTE3MT04NzMsZS5hMTcyPTgyOCxlLmExNzM9OTI0LGUuYTE2Mj05MjQsZS5hMTc0PTkxNyxlLmExNzU9OTMwLGUuYTE3Nj05MzEsZS5hMTc3PTQ2MyxlLmExNzg9ODgzLGUuYTE3OT04MzYsZS5hMTkzPTgzNixlLmExODA9ODY3LGUuYTE5OT04NjcsZS5hMTgxPTY5NixlLmEyMDA9Njk2LGUuYTE4Mj04NzQsZS5hMjAxPTg3NCxlLmExODM9NzYwLGUuYTE4ND05NDYsZS5hMTk3PTc3MSxlLmExODU9ODY1LGUuYTE5ND03NzEsZS5hMTk4PTg4OCxlLmExODY9OTY3LGUuYTE5NT04ODgsZS5hMTg3PTgzMSxlLmExODg9ODczLGUuYTE4OT05MjcsZS5hMTkwPTk3MCxlLmExOTE9OTE4fSkpfSkpO3QuZ2V0TWV0cmljcz1hO2NvbnN0IGk9KDAsbi5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLkNvdXJpZXI9e2FzY2VudDo2MjksZGVzY2VudDotMTU3LGNhcEhlaWdodDo1NjIseEhlaWdodDotNDI2fSxlWyJDb3VyaWVyLUJvbGQiXT17YXNjZW50OjYyOSxkZXNjZW50Oi0xNTcsY2FwSGVpZ2h0OjU2Mix4SGVpZ2h0OjQzOX0sZVsiQ291cmllci1PYmxpcXVlIl09e2FzY2VudDo2MjksZGVzY2VudDotMTU3LGNhcEhlaWdodDo1NjIseEhlaWdodDo0MjZ9LGVbIkNvdXJpZXItQm9sZE9ibGlxdWUiXT17YXNjZW50OjYyOSxkZXNjZW50Oi0xNTcsY2FwSGVpZ2h0OjU2Mix4SGVpZ2h0OjQyNn0sZS5IZWx2ZXRpY2E9e2FzY2VudDo3MTgsZGVzY2VudDotMjA3LGNhcEhlaWdodDo3MTgseEhlaWdodDo1MjN9LGVbIkhlbHZldGljYS1Cb2xkIl09e2FzY2VudDo3MTgsZGVzY2VudDotMjA3LGNhcEhlaWdodDo3MTgseEhlaWdodDo1MzJ9LGVbIkhlbHZldGljYS1PYmxpcXVlIl09e2FzY2VudDo3MTgsZGVzY2VudDotMjA3LGNhcEhlaWdodDo3MTgseEhlaWdodDo1MjN9LGVbIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJdPXthc2NlbnQ6NzE4LGRlc2NlbnQ6LTIwNyxjYXBIZWlnaHQ6NzE4LHhIZWlnaHQ6NTMyfSxlWyJUaW1lcy1Sb21hbiJdPXthc2NlbnQ6NjgzLGRlc2NlbnQ6LTIxNyxjYXBIZWlnaHQ6NjYyLHhIZWlnaHQ6NDUwfSxlWyJUaW1lcy1Cb2xkIl09e2FzY2VudDo2ODMsZGVzY2VudDotMjE3LGNhcEhlaWdodDo2NzYseEhlaWdodDo0NjF9LGVbIlRpbWVzLUl0YWxpYyJdPXthc2NlbnQ6NjgzLGRlc2NlbnQ6LTIxNyxjYXBIZWlnaHQ6NjUzLHhIZWlnaHQ6NDQxfSxlWyJUaW1lcy1Cb2xkSXRhbGljIl09e2FzY2VudDo2ODMsZGVzY2VudDotMjE3LGNhcEhlaWdodDo2NjkseEhlaWdodDo0NjJ9LGUuU3ltYm9sPXthc2NlbnQ6TWF0aC5OYU4sZGVzY2VudDpNYXRoLk5hTixjYXBIZWlnaHQ6TWF0aC5OYU4seEhlaWdodDpNYXRoLk5hTn0sZS5aYXBmRGluZ2JhdHM9e2FzY2VudDpNYXRoLk5hTixkZXNjZW50Ok1hdGguTmFOLGNhcEhlaWdodDpNYXRoLk5hTix4SGVpZ2h0Ok1hdGguTmFOfX0pKTt0LmdldEZvbnRCYXNpY01ldHJpY3M9aX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkdseWZUYWJsZT12b2lkIDAscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDE1NyksdC5HbHlmVGFibGU9Y2xhc3N7Y29uc3RydWN0b3IoZSl7bGV0e2dseWZUYWJsZTp0LGlzR2x5cGhMb2NhdGlvbnNMb25nOnIsbG9jYVRhYmxlOmEsbnVtR2x5cGhzOml9PWU7dGhpcy5nbHlwaHM9W107Y29uc3Qgcz1uZXcgRGF0YVZpZXcoYS5idWZmZXIsYS5ieXRlT2Zmc2V0LGEuYnl0ZUxlbmd0aCksbz1uZXcgRGF0YVZpZXcodC5idWZmZXIsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCksYz1yPzQ6MjtsZXQgbD1yP3MuZ2V0VWludDMyKDApOjIqcy5nZXRVaW50MTYoMCksaD0wO2ZvcihsZXQgZT0wO2U8aTtlKyspe2grPWM7Y29uc3QgZT1yP3MuZ2V0VWludDMyKGgpOjIqcy5nZXRVaW50MTYoaCk7aWYoZT09PWwpe3RoaXMuZ2x5cGhzLnB1c2gobmV3IG4oe30pKTtjb250aW51ZX1jb25zdCB0PW4ucGFyc2UobCxvKTt0aGlzLmdseXBocy5wdXNoKHQpLGw9ZX19Z2V0U2l6ZSgpe3JldHVybiB0aGlzLmdseXBocy5yZWR1Y2UoKChlLHQpPT5lKyh0LmdldFNpemUoKSszJi00KSksMCl9d3JpdGUoKXtjb25zdCBlPXRoaXMuZ2V0U2l6ZSgpLHQ9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcihlKSkscj1lPjEzMTA3MCxuPXI/NDoyLGE9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigodGhpcy5nbHlwaHMubGVuZ3RoKzEpKm4pKTtyP2Euc2V0VWludDMyKDAsMCk6YS5zZXRVaW50MTYoMCwwKTtsZXQgaT0wLHM9MDtmb3IoY29uc3QgZSBvZiB0aGlzLmdseXBocylpKz1lLndyaXRlKGksdCksaT1pKzMmLTQscys9bixyP2Euc2V0VWludDMyKHMsaSk6YS5zZXRVaW50MTYocyxpPj4xKTtyZXR1cm57aXNMb2NhdGlvbkxvbmc6cixsb2NhOm5ldyBVaW50OEFycmF5KGEuYnVmZmVyKSxnbHlmOm5ldyBVaW50OEFycmF5KHQuYnVmZmVyKX19c2NhbGUoZSl7Zm9yKGxldCB0PTAscj10aGlzLmdseXBocy5sZW5ndGg7dDxyO3QrKyl0aGlzLmdseXBoc1t0XS5zY2FsZShlW3RdKX19O2NsYXNzIG57Y29uc3RydWN0b3IoZSl7bGV0e2hlYWRlcjp0PW51bGwsc2ltcGxlOnI9bnVsbCxjb21wb3NpdGVzOm49bnVsbH09ZTt0aGlzLmhlYWRlcj10LHRoaXMuc2ltcGxlPXIsdGhpcy5jb21wb3NpdGVzPW59c3RhdGljIHBhcnNlKGUsdCl7Y29uc3RbcixpXT1hLnBhcnNlKGUsdCk7aWYoZSs9cixpLm51bWJlck9mQ29udG91cnM8MCl7Y29uc3Qgcj1bXTtmb3IoOzspe2NvbnN0W24sYV09by5wYXJzZShlLHQpO2lmKGUrPW4sci5wdXNoKGEpLCEoMzImYS5mbGFncykpYnJlYWt9cmV0dXJuIG5ldyBuKHtoZWFkZXI6aSxjb21wb3NpdGVzOnJ9KX1jb25zdCBjPXMucGFyc2UoZSx0LGkubnVtYmVyT2ZDb250b3Vycyk7cmV0dXJuIG5ldyBuKHtoZWFkZXI6aSxzaW1wbGU6Y30pfWdldFNpemUoKXtpZighdGhpcy5oZWFkZXIpcmV0dXJuIDA7Y29uc3QgZT10aGlzLnNpbXBsZT90aGlzLnNpbXBsZS5nZXRTaXplKCk6dGhpcy5jb21wb3NpdGVzLnJlZHVjZSgoKGUsdCk9PmUrdC5nZXRTaXplKCkpLDApO3JldHVybiB0aGlzLmhlYWRlci5nZXRTaXplKCkrZX13cml0ZShlLHQpe2lmKCF0aGlzLmhlYWRlcilyZXR1cm4gMDtjb25zdCByPWU7aWYoZSs9dGhpcy5oZWFkZXIud3JpdGUoZSx0KSx0aGlzLnNpbXBsZSllKz10aGlzLnNpbXBsZS53cml0ZShlLHQpO2Vsc2UgZm9yKGNvbnN0IHIgb2YgdGhpcy5jb21wb3NpdGVzKWUrPXIud3JpdGUoZSx0KTtyZXR1cm4gZS1yfXNjYWxlKGUpe2lmKCF0aGlzLmhlYWRlcilyZXR1cm47Y29uc3QgdD0odGhpcy5oZWFkZXIueE1pbit0aGlzLmhlYWRlci54TWF4KS8yO2lmKHRoaXMuaGVhZGVyLnNjYWxlKHQsZSksdGhpcy5zaW1wbGUpdGhpcy5zaW1wbGUuc2NhbGUodCxlKTtlbHNlIGZvcihjb25zdCByIG9mIHRoaXMuY29tcG9zaXRlcylyLnNjYWxlKHQsZSl9fWNsYXNzIGF7Y29uc3RydWN0b3IoZSl7bGV0e251bWJlck9mQ29udG91cnM6dCx4TWluOnIseU1pbjpuLHhNYXg6YSx5TWF4Oml9PWU7dGhpcy5udW1iZXJPZkNvbnRvdXJzPXQsdGhpcy54TWluPXIsdGhpcy55TWluPW4sdGhpcy54TWF4PWEsdGhpcy55TWF4PWl9c3RhdGljIHBhcnNlKGUsdCl7cmV0dXJuWzEwLG5ldyBhKHtudW1iZXJPZkNvbnRvdXJzOnQuZ2V0SW50MTYoZSkseE1pbjp0LmdldEludDE2KGUrMikseU1pbjp0LmdldEludDE2KGUrNCkseE1heDp0LmdldEludDE2KGUrNikseU1heDp0LmdldEludDE2KGUrOCl9KV19Z2V0U2l6ZSgpe3JldHVybiAxMH13cml0ZShlLHQpe3JldHVybiB0LnNldEludDE2KGUsdGhpcy5udW1iZXJPZkNvbnRvdXJzKSx0LnNldEludDE2KGUrMix0aGlzLnhNaW4pLHQuc2V0SW50MTYoZSs0LHRoaXMueU1pbiksdC5zZXRJbnQxNihlKzYsdGhpcy54TWF4KSx0LnNldEludDE2KGUrOCx0aGlzLnlNYXgpLDEwfXNjYWxlKGUsdCl7dGhpcy54TWluPU1hdGgucm91bmQoZSsodGhpcy54TWluLWUpKnQpLHRoaXMueE1heD1NYXRoLnJvdW5kKGUrKHRoaXMueE1heC1lKSp0KX19Y2xhc3MgaXtjb25zdHJ1Y3RvcihlKXtsZXR7ZmxhZ3M6dCx4Q29vcmRpbmF0ZXM6cix5Q29vcmRpbmF0ZXM6bn09ZTt0aGlzLnhDb29yZGluYXRlcz1yLHRoaXMueUNvb3JkaW5hdGVzPW4sdGhpcy5mbGFncz10fX1jbGFzcyBze2NvbnN0cnVjdG9yKGUpe2xldHtjb250b3Vyczp0LGluc3RydWN0aW9uczpyfT1lO3RoaXMuY29udG91cnM9dCx0aGlzLmluc3RydWN0aW9ucz1yfXN0YXRpYyBwYXJzZShlLHQscil7Y29uc3Qgbj1bXTtmb3IobGV0IGE9MDthPHI7YSsrKXtjb25zdCByPXQuZ2V0VWludDE2KGUpO2UrPTIsbi5wdXNoKHIpfWNvbnN0IGE9bltyLTFdKzEsbz10LmdldFVpbnQxNihlKTtlKz0yO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkodCkuc2xpY2UoZSxlK28pO2UrPW87Y29uc3QgbD1bXTtmb3IobGV0IHI9MDtyPGE7ZSsrLHIrKyl7bGV0IG49dC5nZXRVaW50OChlKTtpZihsLnB1c2gobiksOCZuKXtjb25zdCBhPXQuZ2V0VWludDgoKytlKTtuXj04O2ZvcihsZXQgZT0wO2U8YTtlKyspbC5wdXNoKG4pO3IrPWF9fWNvbnN0IGg9W107bGV0IHU9W10sZD1bXSxmPVtdO2NvbnN0IGc9W107bGV0IHA9MCxtPTA7Zm9yKGxldCByPTA7cjxhO3IrKyl7Y29uc3QgYT1sW3JdO2lmKDImYSl7Y29uc3Qgcj10LmdldFVpbnQ4KGUrKyk7bSs9MTYmYT9yOi1yLHUucHVzaChtKX1lbHNlIDE2JmF8fChtKz10LmdldEludDE2KGUpLGUrPTIpLHUucHVzaChtKTtuW3BdPT09ciYmKHArKyxoLnB1c2godSksdT1bXSl9bT0wLHA9MDtmb3IobGV0IHI9MDtyPGE7cisrKXtjb25zdCBhPWxbcl07aWYoNCZhKXtjb25zdCByPXQuZ2V0VWludDgoZSsrKTttKz0zMiZhP3I6LXIsZC5wdXNoKG0pfWVsc2UgMzImYXx8KG0rPXQuZ2V0SW50MTYoZSksZSs9MiksZC5wdXNoKG0pO2YucHVzaCgxJmF8NjQmYSksbltwXT09PXImJih1PWhbcF0scCsrLGcucHVzaChuZXcgaSh7ZmxhZ3M6Zix4Q29vcmRpbmF0ZXM6dSx5Q29vcmRpbmF0ZXM6ZH0pKSxkPVtdLGY9W10pfXJldHVybiBuZXcgcyh7Y29udG91cnM6ZyxpbnN0cnVjdGlvbnM6Y30pfWdldFNpemUoKXtsZXQgZT0yKnRoaXMuY29udG91cnMubGVuZ3RoKzIrdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoLHQ9MCxyPTA7Zm9yKGNvbnN0IG4gb2YgdGhpcy5jb250b3Vycyl7ZSs9bi5mbGFncy5sZW5ndGg7Zm9yKGxldCBhPTAsaT1uLnhDb29yZGluYXRlcy5sZW5ndGg7YTxpO2ErKyl7Y29uc3QgaT1uLnhDb29yZGluYXRlc1thXSxzPW4ueUNvb3JkaW5hdGVzW2FdO2xldCBvPU1hdGguYWJzKGktdCk7bz4yNTU/ZSs9MjpvPjAmJihlKz0xKSx0PWksbz1NYXRoLmFicyhzLXIpLG8+MjU1P2UrPTI6bz4wJiYoZSs9MSkscj1zfX1yZXR1cm4gZX13cml0ZShlLHQpe2NvbnN0IHI9ZSxuPVtdLGE9W10saT1bXTtsZXQgcz0wLG89MDtmb3IoY29uc3QgciBvZiB0aGlzLmNvbnRvdXJzKXtmb3IobGV0IGU9MCx0PXIueENvb3JkaW5hdGVzLmxlbmd0aDtlPHQ7ZSsrKXtsZXQgdD1yLmZsYWdzW2VdO2NvbnN0IGM9ci54Q29vcmRpbmF0ZXNbZV07bGV0IGw9Yy1zO2lmKDA9PT1sKXR8PTE2LG4ucHVzaCgwKTtlbHNle2NvbnN0IGU9TWF0aC5hYnMobCk7ZTw9MjU1Pyh0fD1sPj0wPzE4OjIsbi5wdXNoKGUpKTpuLnB1c2gobCl9cz1jO2NvbnN0IGg9ci55Q29vcmRpbmF0ZXNbZV07aWYobD1oLW8sMD09PWwpdHw9MzIsYS5wdXNoKDApO2Vsc2V7Y29uc3QgZT1NYXRoLmFicyhsKTtlPD0yNTU/KHR8PWw+PTA/MzY6NCxhLnB1c2goZSkpOmEucHVzaChsKX1vPWgsaS5wdXNoKHQpfXQuc2V0VWludDE2KGUsbi5sZW5ndGgtMSksZSs9Mn10LnNldFVpbnQxNihlLHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCksZSs9Mix0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgmJihuZXcgVWludDhBcnJheSh0LmJ1ZmZlciwwLHQuYnVmZmVyLmJ5dGVMZW5ndGgpLnNldCh0aGlzLmluc3RydWN0aW9ucyxlKSxlKz10aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpO2Zvcihjb25zdCByIG9mIGkpdC5zZXRVaW50OChlKysscik7Zm9yKGxldCByPTAsYT1uLmxlbmd0aDtyPGE7cisrKXtjb25zdCBhPW5bcl0scz1pW3JdOzImcz90LnNldFVpbnQ4KGUrKyxhKToxNiZzfHwodC5zZXRJbnQxNihlLGEpLGUrPTIpfWZvcihsZXQgcj0wLG49YS5sZW5ndGg7cjxuO3IrKyl7Y29uc3Qgbj1hW3JdLHM9aVtyXTs0JnM/dC5zZXRVaW50OChlKyssbik6MzImc3x8KHQuc2V0SW50MTYoZSxuKSxlKz0yKX1yZXR1cm4gZS1yfXNjYWxlKGUsdCl7Zm9yKGNvbnN0IHIgb2YgdGhpcy5jb250b3VycylpZigwIT09ci54Q29vcmRpbmF0ZXMubGVuZ3RoKWZvcihsZXQgbj0wLGE9ci54Q29vcmRpbmF0ZXMubGVuZ3RoO248YTtuKyspci54Q29vcmRpbmF0ZXNbbl09TWF0aC5yb3VuZChlKyhyLnhDb29yZGluYXRlc1tuXS1lKSp0KX19Y2xhc3Mgb3tjb25zdHJ1Y3RvcihlKXtsZXR7ZmxhZ3M6dCxnbHlwaEluZGV4OnIsYXJndW1lbnQxOm4sYXJndW1lbnQyOmEsdHJhbnNmOmksaW5zdHJ1Y3Rpb25zOnN9PWU7dGhpcy5mbGFncz10LHRoaXMuZ2x5cGhJbmRleD1yLHRoaXMuYXJndW1lbnQxPW4sdGhpcy5hcmd1bWVudDI9YSx0aGlzLnRyYW5zZj1pLHRoaXMuaW5zdHJ1Y3Rpb25zPXN9c3RhdGljIHBhcnNlKGUsdCl7Y29uc3Qgcj1lLG49W107bGV0IGE9dC5nZXRVaW50MTYoZSk7Y29uc3QgaT10LmdldFVpbnQxNihlKzIpO2xldCBzLGM7ZSs9NCwxJmE/KDImYT8ocz10LmdldEludDE2KGUpLGM9dC5nZXRJbnQxNihlKzIpKToocz10LmdldFVpbnQxNihlKSxjPXQuZ2V0VWludDE2KGUrMikpLGUrPTQsYV49MSk6KDImYT8ocz10LmdldEludDgoZSksYz10LmdldEludDgoZSsxKSk6KHM9dC5nZXRVaW50OChlKSxjPXQuZ2V0VWludDgoZSsxKSksZSs9MiksOCZhPyhuLnB1c2godC5nZXRVaW50MTYoZSkpLGUrPTIpOjY0JmE/KG4ucHVzaCh0LmdldFVpbnQxNihlKSx0LmdldFVpbnQxNihlKzIpKSxlKz00KToxMjgmYSYmKG4ucHVzaCh0LmdldFVpbnQxNihlKSx0LmdldFVpbnQxNihlKzIpLHQuZ2V0VWludDE2KGUrNCksdC5nZXRVaW50MTYoZSs2KSksZSs9OCk7bGV0IGw9bnVsbDtpZigyNTYmYSl7Y29uc3Qgcj10LmdldFVpbnQxNihlKTtlKz0yLGw9bmV3IFVpbnQ4QXJyYXkodCkuc2xpY2UoZSxlK3IpLGUrPXJ9cmV0dXJuW2UtcixuZXcgbyh7ZmxhZ3M6YSxnbHlwaEluZGV4OmksYXJndW1lbnQxOnMsYXJndW1lbnQyOmMsdHJhbnNmOm4saW5zdHJ1Y3Rpb25zOmx9KV19Z2V0U2l6ZSgpe2xldCBlPTQrMip0aGlzLnRyYW5zZi5sZW5ndGg7cmV0dXJuIDI1NiZ0aGlzLmZsYWdzJiYoZSs9Mit0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpLGUrPTIsMiZ0aGlzLmZsYWdzP3RoaXMuYXJndW1lbnQxPj0tMTI4JiZ0aGlzLmFyZ3VtZW50MTw9MTI3JiZ0aGlzLmFyZ3VtZW50Mj49LTEyOCYmdGhpcy5hcmd1bWVudDI8PTEyN3x8KGUrPTIpOnRoaXMuYXJndW1lbnQxPj0wJiZ0aGlzLmFyZ3VtZW50MTw9MjU1JiZ0aGlzLmFyZ3VtZW50Mj49MCYmdGhpcy5hcmd1bWVudDI8PTI1NXx8KGUrPTIpLGV9d3JpdGUoZSx0KXtjb25zdCByPWU7cmV0dXJuIDImdGhpcy5mbGFncz90aGlzLmFyZ3VtZW50MT49LTEyOCYmdGhpcy5hcmd1bWVudDE8PTEyNyYmdGhpcy5hcmd1bWVudDI+PS0xMjgmJnRoaXMuYXJndW1lbnQyPD0xMjd8fCh0aGlzLmZsYWdzfD0xKTp0aGlzLmFyZ3VtZW50MT49MCYmdGhpcy5hcmd1bWVudDE8PTI1NSYmdGhpcy5hcmd1bWVudDI+PTAmJnRoaXMuYXJndW1lbnQyPD0yNTV8fCh0aGlzLmZsYWdzfD0xKSx0LnNldFVpbnQxNihlLHRoaXMuZmxhZ3MpLHQuc2V0VWludDE2KGUrMix0aGlzLmdseXBoSW5kZXgpLGUrPTQsMSZ0aGlzLmZsYWdzPygyJnRoaXMuZmxhZ3M/KHQuc2V0SW50MTYoZSx0aGlzLmFyZ3VtZW50MSksdC5zZXRJbnQxNihlKzIsdGhpcy5hcmd1bWVudDIpKToodC5zZXRVaW50MTYoZSx0aGlzLmFyZ3VtZW50MSksdC5zZXRVaW50MTYoZSsyLHRoaXMuYXJndW1lbnQyKSksZSs9NCk6KHQuc2V0VWludDgoZSx0aGlzLmFyZ3VtZW50MSksdC5zZXRVaW50OChlKzEsdGhpcy5hcmd1bWVudDIpLGUrPTIpLDI1NiZ0aGlzLmZsYWdzJiYodC5zZXRVaW50MTYoZSx0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpLGUrPTIsdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoJiYobmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsMCx0LmJ1ZmZlci5ieXRlTGVuZ3RoKS5zZXQodGhpcy5pbnN0cnVjdGlvbnMsZSksZSs9dGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoKSksZS1yfXNjYWxlKGUsdCl7fX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5PcGVuVHlwZUZpbGVCdWlsZGVyPXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSkscigxMzkpLHIoMik7dmFyIG49cigxNDkpLGE9cigxNDQpO2Z1bmN0aW9uIGkoZSx0LHIpe2VbdF09cj4+OCYyNTUsZVt0KzFdPTI1NSZyfWZ1bmN0aW9uIHMoZSx0LHIpe2VbdF09cj4+MjQmMjU1LGVbdCsxXT1yPj4xNiYyNTUsZVt0KzJdPXI+PjgmMjU1LGVbdCszXT0yNTUmcn1mdW5jdGlvbiBvKGUsdCxyKXtpZihyIGluc3RhbmNlb2YgVWludDhBcnJheSllLnNldChyLHQpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiByKWZvcihsZXQgbj0wLGE9ci5sZW5ndGg7bjxhO24rKyllW3QrK109MjU1JnIuY2hhckNvZGVBdChuKTtlbHNlIGZvcihjb25zdCBuIG9mIHIpZVt0KytdPTI1NSZufWNsYXNzIGN7Y29uc3RydWN0b3IoZSl7dGhpcy5zZm50PWUsdGhpcy50YWJsZXM9T2JqZWN0LmNyZWF0ZShudWxsKX1zdGF0aWMgZ2V0U2VhcmNoUGFyYW1zKGUsdCl7bGV0IHI9MSxuPTA7Zm9yKDsocl5lKT5yOylyPDw9MSxuKys7Y29uc3QgYT1yKnQ7cmV0dXJue3JhbmdlOmEsZW50cnk6bixyYW5nZVNoaWZ0OnQqZS1hfX10b0FycmF5KCl7bGV0IGU9dGhpcy5zZm50O2NvbnN0IHQ9dGhpcy50YWJsZXMscj1PYmplY3Qua2V5cyh0KTtyLnNvcnQoKTtjb25zdCBsPXIubGVuZ3RoO2xldCBoLHUsZCxmLGcscD0xMisxNipsO2NvbnN0IG09W3BdO2ZvcihoPTA7aDxsO2grKylmPXRbcltoXV0scCs9KGYubGVuZ3RoKzMmLTQpPj4+MCxtLnB1c2gocCk7Y29uc3QgYj1uZXcgVWludDhBcnJheShwKTtmb3IoaD0wO2g8bDtoKyspZj10W3JbaF1dLG8oYixtW2hdLGYpOyJ0cnVlIj09PWUmJihlPSgwLGEuc3RyaW5nMzIpKDY1NTM2KSksYlswXT0yNTUmZS5jaGFyQ29kZUF0KDApLGJbMV09MjU1JmUuY2hhckNvZGVBdCgxKSxiWzJdPTI1NSZlLmNoYXJDb2RlQXQoMiksYlszXT0yNTUmZS5jaGFyQ29kZUF0KDMpLGkoYiw0LGwpO2NvbnN0IHk9Yy5nZXRTZWFyY2hQYXJhbXMobCwxNik7Zm9yKGkoYiw2LHkucmFuZ2UpLGkoYiw4LHkuZW50cnkpLGkoYiwxMCx5LnJhbmdlU2hpZnQpLHA9MTIsaD0wO2g8bDtoKyspe2c9cltoXSxiW3BdPTI1NSZnLmNoYXJDb2RlQXQoMCksYltwKzFdPTI1NSZnLmNoYXJDb2RlQXQoMSksYltwKzJdPTI1NSZnLmNoYXJDb2RlQXQoMiksYltwKzNdPTI1NSZnLmNoYXJDb2RlQXQoMyk7bGV0IGU9MDtmb3IodT1tW2hdLGQ9bVtoKzFdO3U8ZDt1Kz00KWU9ZSsoMCxuLnJlYWRVaW50MzIpKGIsdSk+Pj4wO3MoYixwKzQsZSkscyhiLHArOCxtW2hdKSxzKGIscCsxMix0W2ddLmxlbmd0aCkscCs9MTZ9cmV0dXJuIGJ9YWRkVGFibGUoZSx0KXtpZihlIGluIHRoaXMudGFibGVzKXRocm93IG5ldyBFcnJvcigiVGFibGUgIitlKyIgYWxyZWFkeSBleGlzdHMiKTt0aGlzLnRhYmxlc1tlXT10fX10Lk9wZW5UeXBlRmlsZUJ1aWxkZXI9Y30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlR5cGUxRm9udD12b2lkIDAscigxMzkpO3ZhciBuPXIoMTg1KSxhPXIoMTQ0KSxpPXIoMTg4KSxzPXIoMTQ5KSxvPXIoMTU0KSxjPXIoMTk5KTtmdW5jdGlvbiBsKGUsdCxyKXtjb25zdCBuPWUubGVuZ3RoLGE9dC5sZW5ndGgsaT1uLWE7bGV0IG89cixjPSExO2Zvcig7bzxpOyl7bGV0IHI9MDtmb3IoO3I8YSYmZVtvK3JdPT09dFtyXTspcisrO2lmKHI+PWEpe2ZvcihvKz1yO288biYmKDAscy5pc1doaXRlU3BhY2UpKGVbb10pOylvKys7Yz0hMDticmVha31vKyt9cmV0dXJue2ZvdW5kOmMsbGVuZ3RoOm99fXQuVHlwZTFGb250PWNsYXNze2NvbnN0cnVjdG9yKGUsdCxyKXtsZXQgbj1yLmxlbmd0aDEscz1yLmxlbmd0aDIsaD10LnBlZWtCeXRlcyg2KTtjb25zdCB1PTEyOD09PWhbMF0mJjE9PT1oWzFdO3UmJih0LnNraXAoNiksbj1oWzVdPDwyNHxoWzRdPDwxNnxoWzNdPDw4fGhbMl0pO2NvbnN0IGQ9ZnVuY3Rpb24oZSx0KXtjb25zdCByPVsxMDEsMTAxLDEyMCwxMDEsOTldLG49ZS5wb3M7bGV0IGkscyxjLGg7dHJ5e2k9ZS5nZXRCeXRlcyh0KSxzPWkubGVuZ3RofWNhdGNoKGUpe31pZihzPT09dCYmKGM9bChpLHIsdC0yKnIubGVuZ3RoKSxjLmZvdW5kJiZjLmxlbmd0aD09PXQpKXJldHVybntzdHJlYW06bmV3IG8uU3RyZWFtKGkpLGxlbmd0aDp0fTtmb3IoKDAsYS53YXJuKSgnSW52YWxpZCAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKSxlLnBvcz1uO2M9bChlLnBlZWtCeXRlcygyMDQ4KSxyLDApLDAhPT1jLmxlbmd0aDspaWYoZS5wb3MrPWMubGVuZ3RoLGMuZm91bmQpe2g9ZS5wb3MtbjticmVha31yZXR1cm4gZS5wb3M9bixoP3tzdHJlYW06bmV3IG8uU3RyZWFtKGUuZ2V0Qnl0ZXMoaCkpLGxlbmd0aDpofTooKDAsYS53YXJuKSgnVW5hYmxlIHRvIHJlY292ZXIgIkxlbmd0aDEiIHByb3BlcnR5IGluIFR5cGUxIGZvbnQgLS0gdXNpbmcgYXMgaXMuJykse3N0cmVhbTpuZXcgby5TdHJlYW0oZS5nZXRCeXRlcyh0KSksbGVuZ3RoOnR9KX0odCxuKTtuZXcgYy5UeXBlMVBhcnNlcihkLnN0cmVhbSwhMSxpLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCkuZXh0cmFjdEZvbnRIZWFkZXIociksdSYmKGg9dC5nZXRCeXRlcyg2KSxzPWhbNV08PDI0fGhbNF08PDE2fGhbM108PDh8aFsyXSk7Y29uc3QgZj1mdW5jdGlvbihlLHQpe2NvbnN0IHI9ZS5nZXRCeXRlcygpO2lmKDA9PT1yLmxlbmd0aCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiZ2V0RWV4ZWNCbG9jayAtIG5vIGZvbnQgcHJvZ3JhbSBmb3VuZC4iKTtyZXR1cm57c3RyZWFtOm5ldyBvLlN0cmVhbShyKSxsZW5ndGg6ci5sZW5ndGh9fSh0KSxnPW5ldyBjLlR5cGUxUGFyc2VyKGYuc3RyZWFtLCEwLGkuU0VBQ19BTkFMWVNJU19FTkFCTEVEKS5leHRyYWN0Rm9udFByb2dyYW0ocik7Zm9yKGNvbnN0IGUgaW4gZy5wcm9wZXJ0aWVzKXJbZV09Zy5wcm9wZXJ0aWVzW2VdO2NvbnN0IHA9Zy5jaGFyc3RyaW5ncyxtPXRoaXMuZ2V0VHlwZTJDaGFyc3RyaW5ncyhwKSxiPXRoaXMuZ2V0VHlwZTJTdWJycyhnLnN1YnJzKTt0aGlzLmNoYXJzdHJpbmdzPXAsdGhpcy5kYXRhPXRoaXMud3JhcChlLG0sdGhpcy5jaGFyc3RyaW5ncyxiLHIpLHRoaXMuc2VhY3M9dGhpcy5nZXRTZWFjcyhnLmNoYXJzdHJpbmdzKX1nZXQgbnVtR2x5cGhzKCl7cmV0dXJuIHRoaXMuY2hhcnN0cmluZ3MubGVuZ3RoKzF9Z2V0Q2hhcnNldCgpe2NvbnN0IGU9WyIubm90ZGVmIl07Zm9yKGNvbnN0e2dseXBoTmFtZTp0fW9mIHRoaXMuY2hhcnN0cmluZ3MpZS5wdXNoKHQpO3JldHVybiBlfWdldEdseXBoTWFwcGluZyhlKXtjb25zdCB0PXRoaXMuY2hhcnN0cmluZ3M7aWYoZS5jb21wb3NpdGUpe2NvbnN0IHI9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IG49MCxhPXQubGVuZ3RoO248YTtuKyspcltlLmNNYXAuY2hhckNvZGVPZihuKV09bisxO3JldHVybiByfWNvbnN0IHI9WyIubm90ZGVmIl07bGV0IG4sYTtmb3IoYT0wO2E8dC5sZW5ndGg7YSsrKXIucHVzaCh0W2FdLmdseXBoTmFtZSk7Y29uc3Qgcz1lLmJ1aWx0SW5FbmNvZGluZztpZihzKXtuPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGNvbnN0IGUgaW4gcylhPXIuaW5kZXhPZihzW2VdKSxhPj0wJiYobltlXT1hKX1yZXR1cm4oMCxpLnR5cGUxRm9udEdseXBoTWFwcGluZykoZSxuLHIpfWhhc0dseXBoSWQoZSl7cmV0dXJuIShlPDB8fGU+PXRoaXMubnVtR2x5cGhzKSYmKDA9PT1lfHx0aGlzLmNoYXJzdHJpbmdzW2UtMV0uY2hhcnN0cmluZy5sZW5ndGg+MCl9Z2V0U2VhY3MoZSl7Y29uc3QgdD1bXTtmb3IobGV0IHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe2NvbnN0IG49ZVtyXTtuLnNlYWMmJih0W3IrMV09bi5zZWFjKX1yZXR1cm4gdH1nZXRUeXBlMkNoYXJzdHJpbmdzKGUpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IHIgb2YgZSl0LnB1c2goci5jaGFyc3RyaW5nKTtyZXR1cm4gdH1nZXRUeXBlMlN1YnJzKGUpe2xldCB0PTA7Y29uc3Qgcj1lLmxlbmd0aDt0PXI8MTEzMz8xMDc6cjwzMzc2OT8xMTMxOjMyNzY4O2NvbnN0IG49W107bGV0IGE7Zm9yKGE9MDthPHQ7YSsrKW4ucHVzaChbMTFdKTtmb3IoYT0wO2E8cjthKyspbi5wdXNoKGVbYV0pO3JldHVybiBufXdyYXAoZSx0LHIsYSxpKXtjb25zdCBzPW5ldyBuLkNGRjtzLmhlYWRlcj1uZXcgbi5DRkZIZWFkZXIoMSwwLDQsNCkscy5uYW1lcz1bZV07Y29uc3Qgbz1uZXcgbi5DRkZUb3BEaWN0O28uc2V0QnlOYW1lKCJ2ZXJzaW9uIiwzOTEpLG8uc2V0QnlOYW1lKCJOb3RpY2UiLDM5Miksby5zZXRCeU5hbWUoIkZ1bGxOYW1lIiwzOTMpLG8uc2V0QnlOYW1lKCJGYW1pbHlOYW1lIiwzOTQpLG8uc2V0QnlOYW1lKCJXZWlnaHQiLDM5NSksby5zZXRCeU5hbWUoIkVuY29kaW5nIixudWxsKSxvLnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsaS5mb250TWF0cml4KSxvLnNldEJ5TmFtZSgiRm9udEJCb3giLGkuYmJveCksby5zZXRCeU5hbWUoImNoYXJzZXQiLG51bGwpLG8uc2V0QnlOYW1lKCJDaGFyU3RyaW5ncyIsbnVsbCksby5zZXRCeU5hbWUoIlByaXZhdGUiLG51bGwpLHMudG9wRGljdD1vO2NvbnN0IGM9bmV3IG4uQ0ZGU3RyaW5ncztjLmFkZCgiVmVyc2lvbiAwLjExIiksYy5hZGQoIlNlZSBvcmlnaW5hbCBub3RpY2UiKSxjLmFkZChlKSxjLmFkZChlKSxjLmFkZCgiTWVkaXVtIikscy5zdHJpbmdzPWMscy5nbG9iYWxTdWJySW5kZXg9bmV3IG4uQ0ZGSW5kZXg7Y29uc3QgbD10Lmxlbmd0aCxoPVsiLm5vdGRlZiJdO2xldCB1LGQ7Zm9yKHU9MDt1PGw7dSsrKXtjb25zdCBlPXJbdV0uZ2x5cGhOYW1lOy0xPT09bi5DRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihlKSYmYy5hZGQoZSksaC5wdXNoKGUpfXMuY2hhcnNldD1uZXcgbi5DRkZDaGFyc2V0KCExLDAsaCk7Y29uc3QgZj1uZXcgbi5DRkZJbmRleDtmb3IoZi5hZGQoWzEzOSwxNF0pLHU9MDt1PGw7dSsrKWYuYWRkKHRbdV0pO3MuY2hhclN0cmluZ3M9Zjtjb25zdCBnPW5ldyBuLkNGRlByaXZhdGVEaWN0O2cuc2V0QnlOYW1lKCJTdWJycyIsbnVsbCk7Y29uc3QgcD1bIkJsdWVWYWx1ZXMiLCJPdGhlckJsdWVzIiwiRmFtaWx5Qmx1ZXMiLCJGYW1pbHlPdGhlckJsdWVzIiwiU3RlbVNuYXBIIiwiU3RlbVNuYXBWIiwiQmx1ZVNoaWZ0IiwiQmx1ZUZ1enoiLCJCbHVlU2NhbGUiLCJMYW5ndWFnZUdyb3VwIiwiRXhwYW5zaW9uRmFjdG9yIiwiRm9yY2VCb2xkIiwiU3RkSFciLCJTdGRWVyJdO2Zvcih1PTAsZD1wLmxlbmd0aDt1PGQ7dSsrKXtjb25zdCBlPXBbdV07aWYoIShlIGluIGkucHJpdmF0ZURhdGEpKWNvbnRpbnVlO2NvbnN0IHQ9aS5wcml2YXRlRGF0YVtlXTtpZihBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgZT10Lmxlbmd0aC0xO2U+MDtlLS0pdFtlXS09dFtlLTFdO2cuc2V0QnlOYW1lKGUsdCl9cy50b3BEaWN0LnByaXZhdGVEaWN0PWc7Y29uc3QgbT1uZXcgbi5DRkZJbmRleDtmb3IodT0wLGQ9YS5sZW5ndGg7dTxkO3UrKyltLmFkZChhW3VdKTtyZXR1cm4gZy5zdWJyc0luZGV4PW0sbmV3IG4uQ0ZGQ29tcGlsZXIocykuY29tcGlsZSgpfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UeXBlMVBhcnNlcj12b2lkIDAscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDE1OSk7dmFyIG49cigxODcpLGE9cigxNDkpLGk9cigxNTQpLHM9cigxNDQpO2NvbnN0IG89WzRdLGM9WzVdLGw9WzZdLGg9WzddLHU9WzhdLGQ9WzEyLDM1XSxmPVsxNF0sZz1bMjFdLHA9WzIyXSxtPVszMF0sYj1bMzFdO2NsYXNzIHl7Y29uc3RydWN0b3IoKXt0aGlzLndpZHRoPTAsdGhpcy5sc2I9MCx0aGlzLmZsZXhpbmc9ITEsdGhpcy5vdXRwdXQ9W10sdGhpcy5zdGFjaz1bXX1jb252ZXJ0KGUsdCxyKXtjb25zdCBuPWUubGVuZ3RoO2xldCBhLGkseSx3PSExO2ZvcihsZXQgdj0wO3Y8bjt2Kyspe2xldCBuPWVbdl07aWYobjwzMil7c3dpdGNoKDEyPT09biYmKG49KG48PDgpK2VbKyt2XSksbil7Y2FzZSAxOmNhc2UgMzpjYXNlIDk6Y2FzZSAzMDcyOmNhc2UgMzA3MzpjYXNlIDMwNzQ6Y2FzZSAzMTA1OnRoaXMuc3RhY2s9W107YnJlYWs7Y2FzZSA0OmlmKHRoaXMuZmxleGluZyl7aWYodGhpcy5zdGFjay5sZW5ndGg8MSl7dz0hMDticmVha31jb25zdCBlPXRoaXMuc3RhY2sucG9wKCk7dGhpcy5zdGFjay5wdXNoKDAsZSk7YnJlYWt9dz10aGlzLmV4ZWN1dGVDb21tYW5kKDEsbyk7YnJlYWs7Y2FzZSA1Onc9dGhpcy5leGVjdXRlQ29tbWFuZCgyLGMpO2JyZWFrO2Nhc2UgNjp3PXRoaXMuZXhlY3V0ZUNvbW1hbmQoMSxsKTticmVhaztjYXNlIDc6dz10aGlzLmV4ZWN1dGVDb21tYW5kKDEsaCk7YnJlYWs7Y2FzZSA4Onc9dGhpcy5leGVjdXRlQ29tbWFuZCg2LHUpO2JyZWFrO2Nhc2UgMTA6aWYodGhpcy5zdGFjay5sZW5ndGg8MSl7dz0hMDticmVha31pZih5PXRoaXMuc3RhY2sucG9wKCksIXRbeV0pe3c9ITA7YnJlYWt9dz10aGlzLmNvbnZlcnQodFt5XSx0LHIpO2JyZWFrO2Nhc2UgMTE6cmV0dXJuIHc7Y2FzZSAxMzppZih0aGlzLnN0YWNrLmxlbmd0aDwyKXt3PSEwO2JyZWFrfWE9dGhpcy5zdGFjay5wb3AoKSxpPXRoaXMuc3RhY2sucG9wKCksdGhpcy5sc2I9aSx0aGlzLndpZHRoPWEsdGhpcy5zdGFjay5wdXNoKGEsaSksdz10aGlzLmV4ZWN1dGVDb21tYW5kKDIscCk7YnJlYWs7Y2FzZSAxNDp0aGlzLm91dHB1dC5wdXNoKGZbMF0pO2JyZWFrO2Nhc2UgMjE6aWYodGhpcy5mbGV4aW5nKWJyZWFrO3c9dGhpcy5leGVjdXRlQ29tbWFuZCgyLGcpO2JyZWFrO2Nhc2UgMjI6aWYodGhpcy5mbGV4aW5nKXt0aGlzLnN0YWNrLnB1c2goMCk7YnJlYWt9dz10aGlzLmV4ZWN1dGVDb21tYW5kKDEscCk7YnJlYWs7Y2FzZSAzMDp3PXRoaXMuZXhlY3V0ZUNvbW1hbmQoNCxtKTticmVhaztjYXNlIDMxOnc9dGhpcy5leGVjdXRlQ29tbWFuZCg0LGIpO2JyZWFrO2Nhc2UgMzA3ODppZihyKXtjb25zdCBlPXRoaXMuc3RhY2suYXQoLTUpO3RoaXMuc2VhYz10aGlzLnN0YWNrLnNwbGljZSgtNCw0KSx0aGlzLnNlYWNbMF0rPXRoaXMubHNiLWUsdz10aGlzLmV4ZWN1dGVDb21tYW5kKDAsZil9ZWxzZSB3PXRoaXMuZXhlY3V0ZUNvbW1hbmQoNCxmKTticmVhaztjYXNlIDMwNzk6aWYodGhpcy5zdGFjay5sZW5ndGg8NCl7dz0hMDticmVha310aGlzLnN0YWNrLnBvcCgpLGE9dGhpcy5zdGFjay5wb3AoKTtjb25zdCBlPXRoaXMuc3RhY2sucG9wKCk7aT10aGlzLnN0YWNrLnBvcCgpLHRoaXMubHNiPWksdGhpcy53aWR0aD1hLHRoaXMuc3RhY2sucHVzaChhLGksZSksdz10aGlzLmV4ZWN1dGVDb21tYW5kKDMsZyk7YnJlYWs7Y2FzZSAzMDg0OmlmKHRoaXMuc3RhY2subGVuZ3RoPDIpe3c9ITA7YnJlYWt9Y29uc3Qgdj10aGlzLnN0YWNrLnBvcCgpLHg9dGhpcy5zdGFjay5wb3AoKTt0aGlzLnN0YWNrLnB1c2goeC92KTticmVhaztjYXNlIDMwODg6aWYodGhpcy5zdGFjay5sZW5ndGg8Mil7dz0hMDticmVha315PXRoaXMuc3RhY2sucG9wKCk7Y29uc3QgUz10aGlzLnN0YWNrLnBvcCgpO2lmKDA9PT15JiYzPT09Uyl7Y29uc3QgZT10aGlzLnN0YWNrLnNwbGljZSgtMTcsMTcpO3RoaXMuc3RhY2sucHVzaChlWzJdK2VbMF0sZVszXStlWzFdLGVbNF0sZVs1XSxlWzZdLGVbN10sZVs4XSxlWzldLGVbMTBdLGVbMTFdLGVbMTJdLGVbMTNdLGVbMTRdKSx3PXRoaXMuZXhlY3V0ZUNvbW1hbmQoMTMsZCwhMCksdGhpcy5mbGV4aW5nPSExLHRoaXMuc3RhY2sucHVzaChlWzE1XSxlWzE2XSl9ZWxzZSAxPT09eSYmMD09PVMmJih0aGlzLmZsZXhpbmc9ITApO2JyZWFrO2Nhc2UgMzA4OTpicmVhaztkZWZhdWx0OigwLHMud2FybikoJ1Vua25vd24gdHlwZSAxIGNoYXJzdHJpbmcgY29tbWFuZCBvZiAiJytuKyciJyl9aWYodylicmVha31lbHNlIG48PTI0Nj9uLT0xMzk6bj1uPD0yNTA/MjU2KihuLTI0NykrZVsrK3ZdKzEwODpuPD0yNTQ/LTI1Nioobi0yNTEpLWVbKyt2XS0xMDg6KDI1NSZlWysrdl0pPDwyNHwoMjU1JmVbKyt2XSk8PDE2fCgyNTUmZVsrK3ZdKTw8OHwoMjU1JmVbKyt2XSk8PDAsdGhpcy5zdGFjay5wdXNoKG4pfXJldHVybiB3fWV4ZWN1dGVDb21tYW5kKGUsdCxyKXtjb25zdCBuPXRoaXMuc3RhY2subGVuZ3RoO2lmKGU+bilyZXR1cm4hMDtjb25zdCBhPW4tZTtmb3IobGV0IGU9YTtlPG47ZSsrKXtsZXQgdD10aGlzLnN0YWNrW2VdO051bWJlci5pc0ludGVnZXIodCk/dGhpcy5vdXRwdXQucHVzaCgyOCx0Pj44JjI1NSwyNTUmdCk6KHQ9NjU1MzYqdHwwLHRoaXMub3V0cHV0LnB1c2goMjU1LHQ+PjI0JjI1NSx0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQpKX1yZXR1cm4gdGhpcy5vdXRwdXQucHVzaCguLi50KSxyP3RoaXMuc3RhY2suc3BsaWNlKGEsZSk6dGhpcy5zdGFjay5sZW5ndGg9MCwhMX19ZnVuY3Rpb24gdyhlKXtyZXR1cm4gZT49NDgmJmU8PTU3fHxlPj02NSYmZTw9NzB8fGU+PTk3JiZlPD0xMDJ9ZnVuY3Rpb24gdihlLHQscil7aWYocj49ZS5sZW5ndGgpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2xldCBuLGEsaT0wfHQ7Zm9yKG49MDtuPHI7bisrKWk9NTI4NDUqKGVbbl0raSkrMjI3MTkmNjU1MzU7Y29uc3Qgcz1lLmxlbmd0aC1yLG89bmV3IFVpbnQ4QXJyYXkocyk7Zm9yKG49cixhPTA7YTxzO24rKyxhKyspe2NvbnN0IHQ9ZVtuXTtvW2FdPXReaT4+OCxpPTUyODQ1Kih0K2kpKzIyNzE5JjY1NTM1fXJldHVybiBvfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIDQ3PT09ZXx8OTE9PT1lfHw5Mz09PWV8fDEyMz09PWV8fDEyNT09PWV8fDQwPT09ZXx8NDE9PT1lfXQuVHlwZTFQYXJzZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LHIpe2lmKHQpe2NvbnN0IHQ9ZS5nZXRCeXRlcygpLHI9ISgodyh0WzBdKXx8KDAsYS5pc1doaXRlU3BhY2UpKHRbMF0pKSYmdyh0WzFdKSYmdyh0WzJdKSYmdyh0WzNdKSYmdyh0WzRdKSYmdyh0WzVdKSYmdyh0WzZdKSYmdyh0WzddKSk7ZT1uZXcgaS5TdHJlYW0ocj92KHQsNTU2NjUsNCk6ZnVuY3Rpb24oZSx0LHIpe2xldCBuPTU1NjY1O2NvbnN0IGE9ZS5sZW5ndGgsaT1uZXcgVWludDhBcnJheShhPj4+MSk7bGV0IHMsbztmb3Iocz0wLG89MDtzPGE7cysrKXtjb25zdCB0PWVbc107aWYoIXcodCkpY29udGludWU7bGV0IHI7Zm9yKHMrKztzPGEmJiF3KHI9ZVtzXSk7KXMrKztpZihzPGEpe2NvbnN0IGU9cGFyc2VJbnQoU3RyaW5nLmZyb21DaGFyQ29kZSh0LHIpLDE2KTtpW28rK109ZV5uPj44LG49NTI4NDUqKGUrbikrMjI3MTkmNjU1MzV9fXJldHVybiBpLnNsaWNlKDQsbyl9KHQpKX10aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQ9ISFyLHRoaXMuc3RyZWFtPWUsdGhpcy5uZXh0Q2hhcigpfXJlYWROdW1iZXJBcnJheSgpe3RoaXMuZ2V0VG9rZW4oKTtjb25zdCBlPVtdO2Zvcig7Oyl7Y29uc3QgdD10aGlzLmdldFRva2VuKCk7aWYobnVsbD09PXR8fCJdIj09PXR8fCJ9Ij09PXQpYnJlYWs7ZS5wdXNoKHBhcnNlRmxvYXQodHx8MCkpfXJldHVybiBlfXJlYWROdW1iZXIoKXtjb25zdCBlPXRoaXMuZ2V0VG9rZW4oKTtyZXR1cm4gcGFyc2VGbG9hdChlfHwwKX1yZWFkSW50KCl7Y29uc3QgZT10aGlzLmdldFRva2VuKCk7cmV0dXJuIDB8cGFyc2VJbnQoZXx8MCwxMCl9cmVhZEJvb2xlYW4oKXtyZXR1cm4idHJ1ZSI9PT10aGlzLmdldFRva2VuKCk/MTowfW5leHRDaGFyKCl7cmV0dXJuIHRoaXMuY3VycmVudENoYXI9dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpfXByZXZDaGFyKCl7cmV0dXJuIHRoaXMuc3RyZWFtLnNraXAoLTIpLHRoaXMuY3VycmVudENoYXI9dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpfWdldFRva2VuKCl7bGV0IGU9ITEsdD10aGlzLmN1cnJlbnRDaGFyO2Zvcig7Oyl7aWYoLTE9PT10KXJldHVybiBudWxsO2lmKGUpMTAhPT10JiYxMyE9PXR8fChlPSExKTtlbHNlIGlmKDM3PT09dCllPSEwO2Vsc2UgaWYoISgwLGEuaXNXaGl0ZVNwYWNlKSh0KSlicmVhazt0PXRoaXMubmV4dENoYXIoKX1pZih4KHQpKXJldHVybiB0aGlzLm5leHRDaGFyKCksU3RyaW5nLmZyb21DaGFyQ29kZSh0KTtsZXQgcj0iIjtkb3tyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHQpLHQ9dGhpcy5uZXh0Q2hhcigpfXdoaWxlKHQ+PTAmJiEoMCxhLmlzV2hpdGVTcGFjZSkodCkmJiF4KHQpKTtyZXR1cm4gcn1yZWFkQ2hhclN0cmluZ3MoZSx0KXtyZXR1cm4tMT09PXQ/ZTp2KGUsNDMzMCx0KX1leHRyYWN0Rm9udFByb2dyYW0oZSl7Y29uc3QgdD10aGlzLnN0cmVhbSxyPVtdLG49W10sYT1PYmplY3QuY3JlYXRlKG51bGwpO2EubGVuSVY9NDtjb25zdCBpPXtzdWJyczpbXSxjaGFyc3RyaW5nczpbXSxwcm9wZXJ0aWVzOntwcml2YXRlRGF0YTphfX07bGV0IHMsbyxjLGw7Zm9yKDtudWxsIT09KHM9dGhpcy5nZXRUb2tlbigpKTspaWYoIi8iPT09cylzd2l0Y2gocz10aGlzLmdldFRva2VuKCkscyl7Y2FzZSJDaGFyU3RyaW5ncyI6Zm9yKHRoaXMuZ2V0VG9rZW4oKSx0aGlzLmdldFRva2VuKCksdGhpcy5nZXRUb2tlbigpLHRoaXMuZ2V0VG9rZW4oKTtzPXRoaXMuZ2V0VG9rZW4oKSxudWxsIT09cyYmImVuZCIhPT1zOyl7aWYoIi8iIT09cyljb250aW51ZTtjb25zdCBlPXRoaXMuZ2V0VG9rZW4oKTtvPXRoaXMucmVhZEludCgpLHRoaXMuZ2V0VG9rZW4oKSxjPW8+MD90LmdldEJ5dGVzKG8pOm5ldyBVaW50OEFycmF5KDApLGw9aS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhLmxlbklWO2NvbnN0IHI9dGhpcy5yZWFkQ2hhclN0cmluZ3MoYyxsKTt0aGlzLm5leHRDaGFyKCkscz10aGlzLmdldFRva2VuKCksIm5vYWNjZXNzIj09PXM/dGhpcy5nZXRUb2tlbigpOiIvIj09PXMmJnRoaXMucHJldkNoYXIoKSxuLnB1c2goe2dseXBoOmUsZW5jb2RlZDpyfSl9YnJlYWs7Y2FzZSJTdWJycyI6Zm9yKHRoaXMucmVhZEludCgpLHRoaXMuZ2V0VG9rZW4oKTsiZHVwIj09PXRoaXMuZ2V0VG9rZW4oKTspe2NvbnN0IGU9dGhpcy5yZWFkSW50KCk7bz10aGlzLnJlYWRJbnQoKSx0aGlzLmdldFRva2VuKCksYz1vPjA/dC5nZXRCeXRlcyhvKTpuZXcgVWludDhBcnJheSgwKSxsPWkucHJvcGVydGllcy5wcml2YXRlRGF0YS5sZW5JVjtjb25zdCBuPXRoaXMucmVhZENoYXJTdHJpbmdzKGMsbCk7dGhpcy5uZXh0Q2hhcigpLHM9dGhpcy5nZXRUb2tlbigpLCJub2FjY2VzcyI9PT1zJiZ0aGlzLmdldFRva2VuKCkscltlXT1ufWJyZWFrO2Nhc2UiQmx1ZVZhbHVlcyI6Y2FzZSJPdGhlckJsdWVzIjpjYXNlIkZhbWlseUJsdWVzIjpjYXNlIkZhbWlseU90aGVyQmx1ZXMiOmNvbnN0IGU9dGhpcy5yZWFkTnVtYmVyQXJyYXkoKTtlLmxlbmd0aD4wJiZlLmxlbmd0aDticmVhaztjYXNlIlN0ZW1TbmFwSCI6Y2FzZSJTdGVtU25hcFYiOmkucHJvcGVydGllcy5wcml2YXRlRGF0YVtzXT10aGlzLnJlYWROdW1iZXJBcnJheSgpO2JyZWFrO2Nhc2UiU3RkSFciOmNhc2UiU3RkVlciOmkucHJvcGVydGllcy5wcml2YXRlRGF0YVtzXT10aGlzLnJlYWROdW1iZXJBcnJheSgpWzBdO2JyZWFrO2Nhc2UiQmx1ZVNoaWZ0IjpjYXNlImxlbklWIjpjYXNlIkJsdWVGdXp6IjpjYXNlIkJsdWVTY2FsZSI6Y2FzZSJMYW5ndWFnZUdyb3VwIjppLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbc109dGhpcy5yZWFkTnVtYmVyKCk7YnJlYWs7Y2FzZSJFeHBhbnNpb25GYWN0b3IiOmkucHJvcGVydGllcy5wcml2YXRlRGF0YVtzXT10aGlzLnJlYWROdW1iZXIoKXx8LjA2O2JyZWFrO2Nhc2UiRm9yY2VCb2xkIjppLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbc109dGhpcy5yZWFkQm9vbGVhbigpfWZvcihjb25zdHtlbmNvZGVkOnQsZ2x5cGg6YX1vZiBuKXtjb25zdCBuPW5ldyB5LHM9bi5jb252ZXJ0KHQscix0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQpO2xldCBvPW4ub3V0cHV0O3MmJihvPVsxNF0pO2NvbnN0IGM9e2dseXBoTmFtZTphLGNoYXJzdHJpbmc6byx3aWR0aDpuLndpZHRoLGxzYjpuLmxzYixzZWFjOm4uc2VhY307aWYoIi5ub3RkZWYiPT09YT9pLmNoYXJzdHJpbmdzLnVuc2hpZnQoYyk6aS5jaGFyc3RyaW5ncy5wdXNoKGMpLGUuYnVpbHRJbkVuY29kaW5nKXtjb25zdCB0PWUuYnVpbHRJbkVuY29kaW5nLmluZGV4T2YoYSk7dD4tMSYmdm9pZCAwPT09ZS53aWR0aHNbdF0mJnQ+PWUuZmlyc3RDaGFyJiZ0PD1lLmxhc3RDaGFyJiYoZS53aWR0aHNbdF09bi53aWR0aCl9fXJldHVybiBpfWV4dHJhY3RGb250SGVhZGVyKGUpe2xldCB0O2Zvcig7bnVsbCE9PSh0PXRoaXMuZ2V0VG9rZW4oKSk7KWlmKCIvIj09PXQpc3dpdGNoKHQ9dGhpcy5nZXRUb2tlbigpLHQpe2Nhc2UiRm9udE1hdHJpeCI6Y29uc3Qgcj10aGlzLnJlYWROdW1iZXJBcnJheSgpO2UuZm9udE1hdHJpeD1yO2JyZWFrO2Nhc2UiRW5jb2RpbmciOmNvbnN0IGE9dGhpcy5nZXRUb2tlbigpO2xldCBpO2lmKC9eXGQrJC8udGVzdChhKSl7aT1bXTtjb25zdCBlPTB8cGFyc2VJbnQoYSwxMCk7dGhpcy5nZXRUb2tlbigpO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2Zvcih0PXRoaXMuZ2V0VG9rZW4oKTsiZHVwIiE9PXQmJiJkZWYiIT09dDspaWYodD10aGlzLmdldFRva2VuKCksbnVsbD09PXQpcmV0dXJuO2lmKCJkZWYiPT09dClicmVhaztjb25zdCBlPXRoaXMucmVhZEludCgpO3RoaXMuZ2V0VG9rZW4oKTtjb25zdCByPXRoaXMuZ2V0VG9rZW4oKTtpW2VdPXIsdGhpcy5nZXRUb2tlbigpfX1lbHNlIGk9KDAsbi5nZXRFbmNvZGluZykoYSk7ZS5idWlsdEluRW5jb2Rpbmc9aTticmVhaztjYXNlIkZvbnRCQm94Ijpjb25zdCBzPXRoaXMucmVhZE51bWJlckFycmF5KCk7ZS5hc2NlbnQ9TWF0aC5tYXgoc1szXSxzWzFdKSxlLmRlc2NlbnQ9TWF0aC5taW4oc1sxXSxzWzNdKSxlLmFzY2VudFNjYWxlZD0hMH19fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlBhdHRlcm49dm9pZCAwLHQuZ2V0VGlsaW5nUGF0dGVybklSPWZ1bmN0aW9uKGUsdCxyKXtjb25zdCBhPXQuZ2V0QXJyYXkoIk1hdHJpeCIpLGk9bi5VdGlsLm5vcm1hbGl6ZVJlY3QodC5nZXRBcnJheSgiQkJveCIpKSxzPXQuZ2V0KCJYU3RlcCIpLG89dC5nZXQoIllTdGVwIiksYz10LmdldCgiUGFpbnRUeXBlIiksbD10LmdldCgiVGlsaW5nVHlwZSIpO2lmKGlbMl0taVswXT09MHx8aVszXS1pWzFdPT0wKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvQkJveCBhcnJheTogWyIuY29uY2F0KGksIl0uIikpO3JldHVyblsiVGlsaW5nUGF0dGVybiIscixlLGEsaSxzLG8sYyxsXX0scig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpLHIoMTM5KSxyKDE1OSk7dmFyIG49cigxNDQpLGE9cigxNTEpLHM9cigxNjIpLG89cigxNDkpO3QuUGF0dGVybj1jbGFzc3tjb25zdHJ1Y3RvcigpeygwLG4udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBQYXR0ZXJuLiIpfXN0YXRpYyBwYXJzZVNoYWRpbmcoZSx0LHIsaSxzKXtjb25zdCBjPWUgaW5zdGFuY2VvZiBhLkJhc2VTdHJlYW0/ZS5kaWN0OmUsaD1jLmdldCgiU2hhZGluZ1R5cGUiKTt0cnl7c3dpdGNoKGgpe2Nhc2UgMjpjYXNlIDM6cmV0dXJuIG5ldyBsKGMsdCxyLGkscyk7Y2FzZSA0OmNhc2UgNTpjYXNlIDY6Y2FzZSA3OnJldHVybiBuZXcgZChlLHQscixpLHMpO2RlZmF1bHQ6dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVuc3VwcG9ydGVkIFNoYWRpbmdUeXBlOiAiK2gpfX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygby5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlO3JldHVybigwLG4ud2FybikoZSksbmV3IGZ9fX07Y2xhc3MgY3tjb25zdHJ1Y3Rvcigpe3RoaXMuY29uc3RydWN0b3I9PT1jJiYoMCxuLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZVNoYWRpbmcuIil9Z2V0SVIoKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBnZXRJUmAgY2FsbGVkLiIpfX1pKGMsIlNNQUxMX05VTUJFUiIsMWUtNik7Y2xhc3MgbCBleHRlbmRzIGN7Y29uc3RydWN0b3IoZSx0LHIsYSxpKXtzdXBlcigpLHRoaXMuY29vcmRzQXJyPWUuZ2V0QXJyYXkoIkNvb3JkcyIpLHRoaXMuc2hhZGluZ1R5cGU9ZS5nZXQoIlNoYWRpbmdUeXBlIik7Y29uc3Qgbz1zLkNvbG9yU3BhY2UucGFyc2Uoe2NzOmUuZ2V0UmF3KCJDUyIpfHxlLmdldFJhdygiQ29sb3JTcGFjZSIpLHhyZWY6dCxyZXNvdXJjZXM6cixwZGZGdW5jdGlvbkZhY3Rvcnk6YSxsb2NhbENvbG9yU3BhY2VDYWNoZTppfSksbD1lLmdldEFycmF5KCJCQm94Iik7dGhpcy5iYm94PUFycmF5LmlzQXJyYXkobCkmJjQ9PT1sLmxlbmd0aD9uLlV0aWwubm9ybWFsaXplUmVjdChsKTpudWxsO2xldCBoPTAsdT0xO2lmKGUuaGFzKCJEb21haW4iKSl7Y29uc3QgdD1lLmdldEFycmF5KCJEb21haW4iKTtoPXRbMF0sdT10WzFdfWxldCBkPSExLGY9ITE7aWYoZS5oYXMoIkV4dGVuZCIpKXtjb25zdCB0PWUuZ2V0QXJyYXkoIkV4dGVuZCIpO2Q9dFswXSxmPXRbMV19aWYoISgzIT09dGhpcy5zaGFkaW5nVHlwZXx8ZCYmZikpe2NvbnN0W2UsdCxyLGEsaSxzXT10aGlzLmNvb3Jkc0FycixvPU1hdGguaHlwb3QoZS1hLHQtaSk7cjw9cytvJiZzPD1yK28mJigwLG4ud2FybikoIlVuc3VwcG9ydGVkIHJhZGlhbCBncmFkaWVudC4iKX10aGlzLmV4dGVuZFN0YXJ0PWQsdGhpcy5leHRlbmRFbmQ9Zjtjb25zdCBnPWUuZ2V0UmF3KCJGdW5jdGlvbiIpLHA9YS5jcmVhdGVGcm9tQXJyYXkoZyksbT0odS1oKS84NDAsYj10aGlzLmNvbG9yU3RvcHM9W107aWYoaD49dXx8bTw9MClyZXR1cm4gdm9pZCgwLG4uaW5mbykoIkJhZCBzaGFkaW5nIGRvbWFpbi4iKTtjb25zdCB5PW5ldyBGbG9hdDMyQXJyYXkoby5udW1Db21wcyksdz1uZXcgRmxvYXQzMkFycmF5KDEpO2xldCB2LHg9MDt3WzBdPWgscCh3LDAseSwwKTtsZXQgUz1vLmdldFJnYih5LDApO2NvbnN0IEE9bi5VdGlsLm1ha2VIZXhDb2xvcihTWzBdLFNbMV0sU1syXSk7Yi5wdXNoKFswLEFdKTtsZXQgaz0xO3dbMF09aCttLHAodywwLHksMCk7bGV0IEM9by5nZXRSZ2IoeSwwKSxPPUNbMF0tU1swXSsxLEY9Q1sxXS1TWzFdKzEsST1DWzJdLVNbMl0rMSxUPUNbMF0tU1swXS0xLE09Q1sxXS1TWzFdLTEsRT1DWzJdLVNbMl0tMTtmb3IobGV0IGU9MjtlPDg0MDtlKyspe3dbMF09aCtlKm0scCh3LDAseSwwKSx2PW8uZ2V0UmdiKHksMCk7Y29uc3QgdD1lLXg7aWYoTz1NYXRoLm1pbihPLCh2WzBdLVNbMF0rMSkvdCksRj1NYXRoLm1pbihGLCh2WzFdLVNbMV0rMSkvdCksST1NYXRoLm1pbihJLCh2WzJdLVNbMl0rMSkvdCksVD1NYXRoLm1heChULCh2WzBdLVNbMF0tMSkvdCksTT1NYXRoLm1heChNLCh2WzFdLVNbMV0tMSkvdCksRT1NYXRoLm1heChFLCh2WzJdLVNbMl0tMSkvdCksIShUPD1PJiZNPD1GJiZFPD1JKSl7Y29uc3QgZT1uLlV0aWwubWFrZUhleENvbG9yKENbMF0sQ1sxXSxDWzJdKTtiLnB1c2goW2svODQwLGVdKSxPPXZbMF0tQ1swXSsxLEY9dlsxXS1DWzFdKzEsST12WzJdLUNbMl0rMSxUPXZbMF0tQ1swXS0xLE09dlsxXS1DWzFdLTEsRT12WzJdLUNbMl0tMSx4PWssUz1DfWs9ZSxDPXZ9Y29uc3QgUD1uLlV0aWwubWFrZUhleENvbG9yKENbMF0sQ1sxXSxDWzJdKTtiLnB1c2goWzEsUF0pO2xldCBSPSJ0cmFuc3BhcmVudCI7ZS5oYXMoIkJhY2tncm91bmQiKSYmKHY9by5nZXRSZ2IoZS5nZXQoIkJhY2tncm91bmQiKSwwKSxSPW4uVXRpbC5tYWtlSGV4Q29sb3IodlswXSx2WzFdLHZbMl0pKSxkfHwoYi51bnNoaWZ0KFswLFJdKSxiWzFdWzBdKz1jLlNNQUxMX05VTUJFUiksZnx8KGIuYXQoLTEpWzBdLT1jLlNNQUxMX05VTUJFUixiLnB1c2goWzEsUl0pKSx0aGlzLmNvbG9yU3RvcHM9Yn1nZXRJUigpe2NvbnN0IGU9dGhpcy5jb29yZHNBcnIsdD10aGlzLnNoYWRpbmdUeXBlO2xldCByLGEsaSxzLG87cmV0dXJuIDI9PT10PyhhPVtlWzBdLGVbMV1dLGk9W2VbMl0sZVszXV0scz1udWxsLG89bnVsbCxyPSJheGlhbCIpOjM9PT10PyhhPVtlWzBdLGVbMV1dLGk9W2VbM10sZVs0XV0scz1lWzJdLG89ZVs1XSxyPSJyYWRpYWwiKTooMCxuLnVucmVhY2hhYmxlKSgiZ2V0UGF0dGVybiB0eXBlIHVua25vd246ICIuY29uY2F0KHQpKSxbIlJhZGlhbEF4aWFsIixyLHRoaXMuYmJveCx0aGlzLmNvbG9yU3RvcHMsYSxpLHMsb119fWNsYXNzIGh7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnN0cmVhbT1lLHRoaXMuY29udGV4dD10LHRoaXMuYnVmZmVyPTAsdGhpcy5idWZmZXJMZW5ndGg9MDtjb25zdCByPXQubnVtQ29tcHM7dGhpcy50bXBDb21wc0J1Zj1uZXcgRmxvYXQzMkFycmF5KHIpO2NvbnN0IG49dC5jb2xvclNwYWNlLm51bUNvbXBzO3RoaXMudG1wQ3NDb21wc0J1Zj10LmNvbG9yRm4/bmV3IEZsb2F0MzJBcnJheShuKTp0aGlzLnRtcENvbXBzQnVmfWdldCBoYXNEYXRhKCl7aWYodGhpcy5zdHJlYW0uZW5kKXJldHVybiB0aGlzLnN0cmVhbS5wb3M8dGhpcy5zdHJlYW0uZW5kO2lmKHRoaXMuYnVmZmVyTGVuZ3RoPjApcmV0dXJuITA7Y29uc3QgZT10aGlzLnN0cmVhbS5nZXRCeXRlKCk7cmV0dXJuIShlPDB8fCh0aGlzLmJ1ZmZlcj1lLHRoaXMuYnVmZmVyTGVuZ3RoPTgsMCkpfXJlYWRCaXRzKGUpe2xldCB0PXRoaXMuYnVmZmVyLHI9dGhpcy5idWZmZXJMZW5ndGg7aWYoMzI9PT1lKXtpZigwPT09cilyZXR1cm4odGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpPDwyNHx0aGlzLnN0cmVhbS5nZXRCeXRlKCk8PDE2fHRoaXMuc3RyZWFtLmdldEJ5dGUoKTw8OHx0aGlzLnN0cmVhbS5nZXRCeXRlKCkpPj4+MDt0PXQ8PDI0fHRoaXMuc3RyZWFtLmdldEJ5dGUoKTw8MTZ8dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpPDw4fHRoaXMuc3RyZWFtLmdldEJ5dGUoKTtjb25zdCBlPXRoaXMuc3RyZWFtLmdldEJ5dGUoKTtyZXR1cm4gdGhpcy5idWZmZXI9ZSYoMTw8ciktMSwodDw8OC1yfCgyNTUmZSk+PnIpPj4+MH1pZig4PT09ZSYmMD09PXIpcmV0dXJuIHRoaXMuc3RyZWFtLmdldEJ5dGUoKTtmb3IoO3I8ZTspdD10PDw4fHRoaXMuc3RyZWFtLmdldEJ5dGUoKSxyKz04O3JldHVybiByLT1lLHRoaXMuYnVmZmVyTGVuZ3RoPXIsdGhpcy5idWZmZXI9dCYoMTw8ciktMSx0Pj5yfWFsaWduKCl7dGhpcy5idWZmZXI9MCx0aGlzLmJ1ZmZlckxlbmd0aD0wfXJlYWRGbGFnKCl7cmV0dXJuIHRoaXMucmVhZEJpdHModGhpcy5jb250ZXh0LmJpdHNQZXJGbGFnKX1yZWFkQ29vcmRpbmF0ZSgpe2NvbnN0IGU9dGhpcy5jb250ZXh0LmJpdHNQZXJDb29yZGluYXRlLHQ9dGhpcy5yZWFkQml0cyhlKSxyPXRoaXMucmVhZEJpdHMoZSksbj10aGlzLmNvbnRleHQuZGVjb2RlLGE9ZTwzMj8xLygoMTw8ZSktMSk6Mi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDtyZXR1cm5bdCphKihuWzFdLW5bMF0pK25bMF0sciphKihuWzNdLW5bMl0pK25bMl1dfXJlYWRDb21wb25lbnRzKCl7Y29uc3QgZT10aGlzLmNvbnRleHQubnVtQ29tcHMsdD10aGlzLmNvbnRleHQuYml0c1BlckNvbXBvbmVudCxyPXQ8MzI/MS8oKDE8PHQpLTEpOjIuMzI4MzA2NDM2NTM4Njk2M2UtMTAsbj10aGlzLmNvbnRleHQuZGVjb2RlLGE9dGhpcy50bXBDb21wc0J1Zjtmb3IobGV0IGk9MCxzPTQ7aTxlO2krKyxzKz0yKXtjb25zdCBlPXRoaXMucmVhZEJpdHModCk7YVtpXT1lKnIqKG5bcysxXS1uW3NdKStuW3NdfWNvbnN0IGk9dGhpcy50bXBDc0NvbXBzQnVmO3JldHVybiB0aGlzLmNvbnRleHQuY29sb3JGbiYmdGhpcy5jb250ZXh0LmNvbG9yRm4oYSwwLGksMCksdGhpcy5jb250ZXh0LmNvbG9yU3BhY2UuZ2V0UmdiKGksMCl9fWNvbnN0IHU9ZnVuY3Rpb24oKXtjb25zdCBlPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfHwoZVt0XT1mdW5jdGlvbihlKXtjb25zdCB0PVtdO2ZvcihsZXQgcj0wO3I8PWU7cisrKXtjb25zdCBuPXIvZSxhPTEtbjt0LnB1c2gobmV3IEZsb2F0MzJBcnJheShbYSphKmEsMypuKmEqYSwzKm4qbiphLG4qbipuXSkpfXJldHVybiB0fSh0KSl9fSgpO2NsYXNzIGQgZXh0ZW5kcyBje2NvbnN0cnVjdG9yKGUsdCxyLGksbyl7aWYoc3VwZXIoKSwhKGUgaW5zdGFuY2VvZiBhLkJhc2VTdHJlYW0pKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJNZXNoIGRhdGEgaXMgbm90IGEgc3RyZWFtIik7Y29uc3QgYz1lLmRpY3Q7dGhpcy5zaGFkaW5nVHlwZT1jLmdldCgiU2hhZGluZ1R5cGUiKTtjb25zdCBsPWMuZ2V0QXJyYXkoIkJCb3giKTt0aGlzLmJib3g9QXJyYXkuaXNBcnJheShsKSYmND09PWwubGVuZ3RoP24uVXRpbC5ub3JtYWxpemVSZWN0KGwpOm51bGw7Y29uc3QgdT1zLkNvbG9yU3BhY2UucGFyc2Uoe2NzOmMuZ2V0UmF3KCJDUyIpfHxjLmdldFJhdygiQ29sb3JTcGFjZSIpLHhyZWY6dCxyZXNvdXJjZXM6cixwZGZGdW5jdGlvbkZhY3Rvcnk6aSxsb2NhbENvbG9yU3BhY2VDYWNoZTpvfSk7dGhpcy5iYWNrZ3JvdW5kPWMuaGFzKCJCYWNrZ3JvdW5kIik/dS5nZXRSZ2IoYy5nZXQoIkJhY2tncm91bmQiKSwwKTpudWxsO2NvbnN0IGQ9Yy5nZXRSYXcoIkZ1bmN0aW9uIiksZj1kP2kuY3JlYXRlRnJvbUFycmF5KGQpOm51bGw7dGhpcy5jb29yZHM9W10sdGhpcy5jb2xvcnM9W10sdGhpcy5maWd1cmVzPVtdO2NvbnN0IGc9e2JpdHNQZXJDb29yZGluYXRlOmMuZ2V0KCJCaXRzUGVyQ29vcmRpbmF0ZSIpLGJpdHNQZXJDb21wb25lbnQ6Yy5nZXQoIkJpdHNQZXJDb21wb25lbnQiKSxiaXRzUGVyRmxhZzpjLmdldCgiQml0c1BlckZsYWciKSxkZWNvZGU6Yy5nZXRBcnJheSgiRGVjb2RlIiksY29sb3JGbjpmLGNvbG9yU3BhY2U6dSxudW1Db21wczpmPzE6dS5udW1Db21wc30scD1uZXcgaChlLGcpO2xldCBtPSExO3N3aXRjaCh0aGlzLnNoYWRpbmdUeXBlKXtjYXNlIDQ6dGhpcy5fZGVjb2RlVHlwZTRTaGFkaW5nKHApO2JyZWFrO2Nhc2UgNTpjb25zdCBlPTB8Yy5nZXQoIlZlcnRpY2VzUGVyUm93Iik7aWYoZTwyKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIFZlcnRpY2VzUGVyUm93Iik7dGhpcy5fZGVjb2RlVHlwZTVTaGFkaW5nKHAsZSk7YnJlYWs7Y2FzZSA2OnRoaXMuX2RlY29kZVR5cGU2U2hhZGluZyhwKSxtPSEwO2JyZWFrO2Nhc2UgNzp0aGlzLl9kZWNvZGVUeXBlN1NoYWRpbmcocCksbT0hMDticmVhaztkZWZhdWx0OigwLG4udW5yZWFjaGFibGUpKCJVbnN1cHBvcnRlZCBtZXNoIHR5cGUuIil9aWYobSl7dGhpcy5fdXBkYXRlQm91bmRzKCk7Zm9yKGxldCBlPTAsdD10aGlzLmZpZ3VyZXMubGVuZ3RoO2U8dDtlKyspdGhpcy5fYnVpbGRGaWd1cmVGcm9tUGF0Y2goZSl9dGhpcy5fdXBkYXRlQm91bmRzKCksdGhpcy5fcGFja0RhdGEoKX1fZGVjb2RlVHlwZTRTaGFkaW5nKGUpe2NvbnN0IHQ9dGhpcy5jb29yZHMscj10aGlzLmNvbG9ycyxhPVtdLGk9W107bGV0IHM9MDtmb3IoO2UuaGFzRGF0YTspe2NvbnN0IG89ZS5yZWFkRmxhZygpLGM9ZS5yZWFkQ29vcmRpbmF0ZSgpLGw9ZS5yZWFkQ29tcG9uZW50cygpO2lmKDA9PT1zKXtpZighKDA8PW8mJm88PTIpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmtub3duIHR5cGU0IGZsYWciKTtzd2l0Y2gobyl7Y2FzZSAwOnM9MzticmVhaztjYXNlIDE6aS5wdXNoKGkuYXQoLTIpLGkuYXQoLTEpKSxzPTE7YnJlYWs7Y2FzZSAyOmkucHVzaChpLmF0KC0zKSxpLmF0KC0xKSkscz0xfWEucHVzaChvKX1pLnB1c2godC5sZW5ndGgpLHQucHVzaChjKSxyLnB1c2gobCkscy0tLGUuYWxpZ24oKX10aGlzLmZpZ3VyZXMucHVzaCh7dHlwZToidHJpYW5nbGVzIixjb29yZHM6bmV3IEludDMyQXJyYXkoaSksY29sb3JzOm5ldyBJbnQzMkFycmF5KGkpfSl9X2RlY29kZVR5cGU1U2hhZGluZyhlLHQpe2NvbnN0IHI9dGhpcy5jb29yZHMsbj10aGlzLmNvbG9ycyxhPVtdO2Zvcig7ZS5oYXNEYXRhOyl7Y29uc3QgdD1lLnJlYWRDb29yZGluYXRlKCksaT1lLnJlYWRDb21wb25lbnRzKCk7YS5wdXNoKHIubGVuZ3RoKSxyLnB1c2godCksbi5wdXNoKGkpfXRoaXMuZmlndXJlcy5wdXNoKHt0eXBlOiJsYXR0aWNlIixjb29yZHM6bmV3IEludDMyQXJyYXkoYSksY29sb3JzOm5ldyBJbnQzMkFycmF5KGEpLHZlcnRpY2VzUGVyUm93OnR9KX1fZGVjb2RlVHlwZTZTaGFkaW5nKGUpe2NvbnN0IHQ9dGhpcy5jb29yZHMscj10aGlzLmNvbG9ycyxhPW5ldyBJbnQzMkFycmF5KDE2KSxpPW5ldyBJbnQzMkFycmF5KDQpO2Zvcig7ZS5oYXNEYXRhOyl7Y29uc3Qgcz1lLnJlYWRGbGFnKCk7aWYoISgwPD1zJiZzPD0zKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNiBmbGFnIik7Y29uc3Qgbz10Lmxlbmd0aDtmb3IobGV0IHI9MCxuPTAhPT1zPzg6MTI7cjxuO3IrKyl0LnB1c2goZS5yZWFkQ29vcmRpbmF0ZSgpKTtjb25zdCBjPXIubGVuZ3RoO2ZvcihsZXQgdD0wLG49MCE9PXM/Mjo0O3Q8bjt0Kyspci5wdXNoKGUucmVhZENvbXBvbmVudHMoKSk7bGV0IGwsaCx1LGQ7c3dpdGNoKHMpe2Nhc2UgMDphWzEyXT1vKzMsYVsxM109bys0LGFbMTRdPW8rNSxhWzE1XT1vKzYsYVs4XT1vKzIsYVsxMV09bys3LGFbNF09bysxLGFbN109bys4LGFbMF09byxhWzFdPW8rMTEsYVsyXT1vKzEwLGFbM109bys5LGlbMl09YysxLGlbM109YysyLGlbMF09YyxpWzFdPWMrMzticmVhaztjYXNlIDE6bD1hWzEyXSxoPWFbMTNdLHU9YVsxNF0sZD1hWzE1XSxhWzEyXT1kLGFbMTNdPW8rMCxhWzE0XT1vKzEsYVsxNV09bysyLGFbOF09dSxhWzExXT1vKzMsYVs0XT1oLGFbN109bys0LGFbMF09bCxhWzFdPW8rNyxhWzJdPW8rNixhWzNdPW8rNSxsPWlbMl0saD1pWzNdLGlbMl09aCxpWzNdPWMsaVswXT1sLGlbMV09YysxO2JyZWFrO2Nhc2UgMjpsPWFbMTVdLGg9YVsxMV0sYVsxMl09YVszXSxhWzEzXT1vKzAsYVsxNF09bysxLGFbMTVdPW8rMixhWzhdPWFbN10sYVsxMV09byszLGFbNF09aCxhWzddPW8rNCxhWzBdPWwsYVsxXT1vKzcsYVsyXT1vKzYsYVszXT1vKzUsbD1pWzNdLGlbMl09aVsxXSxpWzNdPWMsaVswXT1sLGlbMV09YysxO2JyZWFrO2Nhc2UgMzphWzEyXT1hWzBdLGFbMTNdPW8rMCxhWzE0XT1vKzEsYVsxNV09bysyLGFbOF09YVsxXSxhWzExXT1vKzMsYVs0XT1hWzJdLGFbN109bys0LGFbMF09YVszXSxhWzFdPW8rNyxhWzJdPW8rNixhWzNdPW8rNSxpWzJdPWlbMF0saVszXT1jLGlbMF09aVsxXSxpWzFdPWMrMX1hWzVdPXQubGVuZ3RoLHQucHVzaChbKC00KnRbYVswXV1bMF0tdFthWzE1XV1bMF0rNioodFthWzRdXVswXSt0W2FbMV1dWzBdKS0yKih0W2FbMTJdXVswXSt0W2FbM11dWzBdKSszKih0W2FbMTNdXVswXSt0W2FbN11dWzBdKSkvOSwoLTQqdFthWzBdXVsxXS10W2FbMTVdXVsxXSs2Kih0W2FbNF1dWzFdK3RbYVsxXV1bMV0pLTIqKHRbYVsxMl1dWzFdK3RbYVszXV1bMV0pKzMqKHRbYVsxM11dWzFdK3RbYVs3XV1bMV0pKS85XSksYVs2XT10Lmxlbmd0aCx0LnB1c2goWygtNCp0W2FbM11dWzBdLXRbYVsxMl1dWzBdKzYqKHRbYVsyXV1bMF0rdFthWzddXVswXSktMioodFthWzBdXVswXSt0W2FbMTVdXVswXSkrMyoodFthWzRdXVswXSt0W2FbMTRdXVswXSkpLzksKC00KnRbYVszXV1bMV0tdFthWzEyXV1bMV0rNioodFthWzJdXVsxXSt0W2FbN11dWzFdKS0yKih0W2FbMF1dWzFdK3RbYVsxNV1dWzFdKSszKih0W2FbNF1dWzFdK3RbYVsxNF1dWzFdKSkvOV0pLGFbOV09dC5sZW5ndGgsdC5wdXNoKFsoLTQqdFthWzEyXV1bMF0tdFthWzNdXVswXSs2Kih0W2FbOF1dWzBdK3RbYVsxM11dWzBdKS0yKih0W2FbMF1dWzBdK3RbYVsxNV1dWzBdKSszKih0W2FbMTFdXVswXSt0W2FbMV1dWzBdKSkvOSwoLTQqdFthWzEyXV1bMV0tdFthWzNdXVsxXSs2Kih0W2FbOF1dWzFdK3RbYVsxM11dWzFdKS0yKih0W2FbMF1dWzFdK3RbYVsxNV1dWzFdKSszKih0W2FbMTFdXVsxXSt0W2FbMV1dWzFdKSkvOV0pLGFbMTBdPXQubGVuZ3RoLHQucHVzaChbKC00KnRbYVsxNV1dWzBdLXRbYVswXV1bMF0rNioodFthWzExXV1bMF0rdFthWzE0XV1bMF0pLTIqKHRbYVsxMl1dWzBdK3RbYVszXV1bMF0pKzMqKHRbYVsyXV1bMF0rdFthWzhdXVswXSkpLzksKC00KnRbYVsxNV1dWzFdLXRbYVswXV1bMV0rNioodFthWzExXV1bMV0rdFthWzE0XV1bMV0pLTIqKHRbYVsxMl1dWzFdK3RbYVszXV1bMV0pKzMqKHRbYVsyXV1bMV0rdFthWzhdXVsxXSkpLzldKSx0aGlzLmZpZ3VyZXMucHVzaCh7dHlwZToicGF0Y2giLGNvb3JkczpuZXcgSW50MzJBcnJheShhKSxjb2xvcnM6bmV3IEludDMyQXJyYXkoaSl9KX19X2RlY29kZVR5cGU3U2hhZGluZyhlKXtjb25zdCB0PXRoaXMuY29vcmRzLHI9dGhpcy5jb2xvcnMsYT1uZXcgSW50MzJBcnJheSgxNiksaT1uZXcgSW50MzJBcnJheSg0KTtmb3IoO2UuaGFzRGF0YTspe2NvbnN0IHM9ZS5yZWFkRmxhZygpO2lmKCEoMDw9cyYmczw9MykpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZTcgZmxhZyIpO2NvbnN0IG89dC5sZW5ndGg7Zm9yKGxldCByPTAsbj0wIT09cz8xMjoxNjtyPG47cisrKXQucHVzaChlLnJlYWRDb29yZGluYXRlKCkpO2NvbnN0IGM9ci5sZW5ndGg7Zm9yKGxldCB0PTAsbj0wIT09cz8yOjQ7dDxuO3QrKylyLnB1c2goZS5yZWFkQ29tcG9uZW50cygpKTtsZXQgbCxoLHUsZDtzd2l0Y2gocyl7Y2FzZSAwOmFbMTJdPW8rMyxhWzEzXT1vKzQsYVsxNF09bys1LGFbMTVdPW8rNixhWzhdPW8rMixhWzldPW8rMTMsYVsxMF09bysxNCxhWzExXT1vKzcsYVs0XT1vKzEsYVs1XT1vKzEyLGFbNl09bysxNSxhWzddPW8rOCxhWzBdPW8sYVsxXT1vKzExLGFbMl09bysxMCxhWzNdPW8rOSxpWzJdPWMrMSxpWzNdPWMrMixpWzBdPWMsaVsxXT1jKzM7YnJlYWs7Y2FzZSAxOmw9YVsxMl0saD1hWzEzXSx1PWFbMTRdLGQ9YVsxNV0sYVsxMl09ZCxhWzEzXT1vKzAsYVsxNF09bysxLGFbMTVdPW8rMixhWzhdPXUsYVs5XT1vKzksYVsxMF09bysxMCxhWzExXT1vKzMsYVs0XT1oLGFbNV09bys4LGFbNl09bysxMSxhWzddPW8rNCxhWzBdPWwsYVsxXT1vKzcsYVsyXT1vKzYsYVszXT1vKzUsbD1pWzJdLGg9aVszXSxpWzJdPWgsaVszXT1jLGlbMF09bCxpWzFdPWMrMTticmVhaztjYXNlIDI6bD1hWzE1XSxoPWFbMTFdLGFbMTJdPWFbM10sYVsxM109byswLGFbMTRdPW8rMSxhWzE1XT1vKzIsYVs4XT1hWzddLGFbOV09bys5LGFbMTBdPW8rMTAsYVsxMV09byszLGFbNF09aCxhWzVdPW8rOCxhWzZdPW8rMTEsYVs3XT1vKzQsYVswXT1sLGFbMV09bys3LGFbMl09bys2LGFbM109bys1LGw9aVszXSxpWzJdPWlbMV0saVszXT1jLGlbMF09bCxpWzFdPWMrMTticmVhaztjYXNlIDM6YVsxMl09YVswXSxhWzEzXT1vKzAsYVsxNF09bysxLGFbMTVdPW8rMixhWzhdPWFbMV0sYVs5XT1vKzksYVsxMF09bysxMCxhWzExXT1vKzMsYVs0XT1hWzJdLGFbNV09bys4LGFbNl09bysxMSxhWzddPW8rNCxhWzBdPWFbM10sYVsxXT1vKzcsYVsyXT1vKzYsYVszXT1vKzUsaVsyXT1pWzBdLGlbM109YyxpWzBdPWlbMV0saVsxXT1jKzF9dGhpcy5maWd1cmVzLnB1c2goe3R5cGU6InBhdGNoIixjb29yZHM6bmV3IEludDMyQXJyYXkoYSksY29sb3JzOm5ldyBJbnQzMkFycmF5KGkpfSl9fV9idWlsZEZpZ3VyZUZyb21QYXRjaChlKXtjb25zdCB0PXRoaXMuZmlndXJlc1tlXTsoMCxuLmFzc2VydCkoInBhdGNoIj09PXQudHlwZSwiVW5leHBlY3RlZCBwYXRjaCBtZXNoIGZpZ3VyZSIpO2NvbnN0IHI9dGhpcy5jb29yZHMsYT10aGlzLmNvbG9ycyxpPXQuY29vcmRzLHM9dC5jb2xvcnMsbz1NYXRoLm1pbihyW2lbMF1dWzBdLHJbaVszXV1bMF0scltpWzEyXV1bMF0scltpWzE1XV1bMF0pLGM9TWF0aC5taW4ocltpWzBdXVsxXSxyW2lbM11dWzFdLHJbaVsxMl1dWzFdLHJbaVsxNV1dWzFdKSxsPU1hdGgubWF4KHJbaVswXV1bMF0scltpWzNdXVswXSxyW2lbMTJdXVswXSxyW2lbMTVdXVswXSksaD1NYXRoLm1heChyW2lbMF1dWzFdLHJbaVszXV1bMV0scltpWzEyXV1bMV0scltpWzE1XV1bMV0pO2xldCBmPU1hdGguY2VpbCgobC1vKSpkLlRSSUFOR0xFX0RFTlNJVFkvKHRoaXMuYm91bmRzWzJdLXRoaXMuYm91bmRzWzBdKSk7Zj1NYXRoLm1heChkLk1JTl9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5ULE1hdGgubWluKGQuTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsZikpO2xldCBnPU1hdGguY2VpbCgoaC1jKSpkLlRSSUFOR0xFX0RFTlNJVFkvKHRoaXMuYm91bmRzWzNdLXRoaXMuYm91bmRzWzFdKSk7Zz1NYXRoLm1heChkLk1JTl9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5ULE1hdGgubWluKGQuTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsZykpO2NvbnN0IHA9ZisxLG09bmV3IEludDMyQXJyYXkoKGcrMSkqcCksYj1uZXcgSW50MzJBcnJheSgoZysxKSpwKTtsZXQgeT0wO2NvbnN0IHc9bmV3IFVpbnQ4QXJyYXkoMyksdj1uZXcgVWludDhBcnJheSgzKSx4PWFbc1swXV0sUz1hW3NbMV1dLEE9YVtzWzJdXSxrPWFbc1szXV0sQz11KGcpLE89dShmKTtmb3IobGV0IGU9MDtlPD1nO2UrKyl7d1swXT0oeFswXSooZy1lKStBWzBdKmUpL2d8MCx3WzFdPSh4WzFdKihnLWUpK0FbMV0qZSkvZ3wwLHdbMl09KHhbMl0qKGctZSkrQVsyXSplKS9nfDAsdlswXT0oU1swXSooZy1lKStrWzBdKmUpL2d8MCx2WzFdPShTWzFdKihnLWUpK2tbMV0qZSkvZ3wwLHZbMl09KFNbMl0qKGctZSkra1syXSplKS9nfDA7Zm9yKGxldCB0PTA7dDw9Zjt0KysseSsrKXtpZighKDAhPT1lJiZlIT09Z3x8MCE9PXQmJnQhPT1mKSljb250aW51ZTtsZXQgbj0wLHM9MCxvPTA7Zm9yKGxldCBhPTA7YTw9MzthKyspZm9yKGxldCBjPTA7Yzw9MztjKyssbysrKXtjb25zdCBsPUNbZV1bYV0qT1t0XVtjXTtuKz1yW2lbb11dWzBdKmwscys9cltpW29dXVsxXSpsfW1beV09ci5sZW5ndGgsci5wdXNoKFtuLHNdKSxiW3ldPWEubGVuZ3RoO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkoMyk7Y1swXT0od1swXSooZi10KSt2WzBdKnQpL2Z8MCxjWzFdPSh3WzFdKihmLXQpK3ZbMV0qdCkvZnwwLGNbMl09KHdbMl0qKGYtdCkrdlsyXSp0KS9mfDAsYS5wdXNoKGMpfX1tWzBdPWlbMF0sYlswXT1zWzBdLG1bZl09aVszXSxiW2ZdPXNbMV0sbVtwKmddPWlbMTJdLGJbcCpnXT1zWzJdLG1bcCpnK2ZdPWlbMTVdLGJbcCpnK2ZdPXNbM10sdGhpcy5maWd1cmVzW2VdPXt0eXBlOiJsYXR0aWNlIixjb29yZHM6bSxjb2xvcnM6Yix2ZXJ0aWNlc1BlclJvdzpwfX1fdXBkYXRlQm91bmRzKCl7bGV0IGU9dGhpcy5jb29yZHNbMF1bMF0sdD10aGlzLmNvb3Jkc1swXVsxXSxyPWUsbj10O2ZvcihsZXQgYT0xLGk9dGhpcy5jb29yZHMubGVuZ3RoO2E8aTthKyspe2NvbnN0IGk9dGhpcy5jb29yZHNbYV1bMF0scz10aGlzLmNvb3Jkc1thXVsxXTtlPWU+aT9pOmUsdD10PnM/czp0LHI9cjxpP2k6cixuPW48cz9zOm59dGhpcy5ib3VuZHM9W2UsdCxyLG5dfV9wYWNrRGF0YSgpe2xldCBlLHQscixuO2NvbnN0IGE9dGhpcy5jb29yZHMsaT1uZXcgRmxvYXQzMkFycmF5KDIqYS5sZW5ndGgpO2ZvcihlPTAscj0wLHQ9YS5sZW5ndGg7ZTx0O2UrKyl7Y29uc3QgdD1hW2VdO2lbcisrXT10WzBdLGlbcisrXT10WzFdfXRoaXMuY29vcmRzPWk7Y29uc3Qgcz10aGlzLmNvbG9ycyxvPW5ldyBVaW50OEFycmF5KDMqcy5sZW5ndGgpO2ZvcihlPTAscj0wLHQ9cy5sZW5ndGg7ZTx0O2UrKyl7Y29uc3QgdD1zW2VdO29bcisrXT10WzBdLG9bcisrXT10WzFdLG9bcisrXT10WzJdfXRoaXMuY29sb3JzPW87Y29uc3QgYz10aGlzLmZpZ3VyZXM7Zm9yKGU9MCx0PWMubGVuZ3RoO2U8dDtlKyspe2NvbnN0IHQ9Y1tlXSxhPXQuY29vcmRzLGk9dC5jb2xvcnM7Zm9yKHI9MCxuPWEubGVuZ3RoO3I8bjtyKyspYVtyXSo9MixpW3JdKj0zfX1nZXRJUigpe3JldHVyblsiTWVzaCIsdGhpcy5zaGFkaW5nVHlwZSx0aGlzLmNvb3Jkcyx0aGlzLmNvbG9ycyx0aGlzLmZpZ3VyZXMsdGhpcy5ib3VuZHMsdGhpcy5iYm94LHRoaXMuYmFja2dyb3VuZF19fWkoZCwiTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQiLDMpLGkoZCwiTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQiLDIwKSxpKGQsIlRSSUFOR0xFX0RFTlNJVFkiLDIwKTtjbGFzcyBmIGV4dGVuZHMgY3tnZXRJUigpe3JldHVyblsiRHVtbXkiXX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0WGZhRm9udERpY3Q9ZnVuY3Rpb24oZSl7Y29uc3QgdD1mdW5jdGlvbihlKXtjb25zdCB0PWQoZSk7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3R7YmFzZVdpZHRoczpyLGJhc2VNYXBwaW5nOm4sZmFjdG9yczphfT10LGk9YT9yLm1hcCgoKGUsdCk9PmUqYVt0XSkpOnI7bGV0IHMsbz0tMjtjb25zdCBjPVtdO2Zvcihjb25zdFtlLHRdb2Ygbi5tYXAoKChlLHQpPT5bZSx0XSkpLnNvcnQoKChlLHQpPT57bGV0W3JdPWUsW25dPXQ7cmV0dXJuIHItbn0pKSktMSE9PWUmJihlPT09bysxPyhzLnB1c2goaVt0XSksbys9MSk6KG89ZSxzPVtpW3RdXSxjLnB1c2goZSxzKSkpO3JldHVybiBjfShlKSxyPW5ldyBhLkRpY3QobnVsbCk7ci5zZXQoIkJhc2VGb250IixhLk5hbWUuZ2V0KGUpKSxyLnNldCgiVHlwZSIsYS5OYW1lLmdldCgiRm9udCIpKSxyLnNldCgiU3VidHlwZSIsYS5OYW1lLmdldCgiQ0lERm9udFR5cGUyIikpLHIuc2V0KCJFbmNvZGluZyIsYS5OYW1lLmdldCgiSWRlbnRpdHktSCIpKSxyLnNldCgiQ0lEVG9HSURNYXAiLGEuTmFtZS5nZXQoIklkZW50aXR5IikpLHIuc2V0KCJXIix0KSxyLnNldCgiRmlyc3RDaGFyIix0WzBdKSxyLnNldCgiTGFzdENoYXIiLHQuYXQoLTIpK3QuYXQoLTEpLmxlbmd0aC0xKTtjb25zdCBuPW5ldyBhLkRpY3QobnVsbCk7ci5zZXQoIkZvbnREZXNjcmlwdG9yIixuKTtjb25zdCBpPW5ldyBhLkRpY3QobnVsbCk7cmV0dXJuIGkuc2V0KCJPcmRlcmluZyIsIklkZW50aXR5IiksaS5zZXQoIlJlZ2lzdHJ5IiwiQWRvYmUiKSxpLnNldCgiU3VwcGxlbWVudCIsMCksci5zZXQoIkNJRFN5c3RlbUluZm8iLGkpLHJ9LHQuZ2V0WGZhRm9udE5hbWU9ZCxyKDEzOSk7dmFyIG49cigyMDIpLGE9cigxNTApLGk9cigyMDMpLHM9cigyMDQpLG89cigyMDUpLGM9cigyMDYpLGw9cigxNDkpLGg9cigxODgpO2NvbnN0IHU9KDAsbC5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlWyJNeXJpYWRQcm8tUmVndWxhciJdPWVbIlBkZkpTLUZhbGxiYWNrLVJlZ3VsYXIiXT17bmFtZToiTGliZXJhdGlvblNhbnMtUmVndWxhciIsZmFjdG9yczpvLk15cmlhZFByb1JlZ3VsYXJGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nLG1ldHJpY3M6by5NeXJpYWRQcm9SZWd1bGFyTWV0cmljc30sZVsiTXlyaWFkUHJvLUJvbGQiXT1lWyJQZGZKUy1GYWxsYmFjay1Cb2xkIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUJvbGQiLGZhY3RvcnM6by5NeXJpYWRQcm9Cb2xkRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZyxtZXRyaWNzOm8uTXlyaWFkUHJvQm9sZE1ldHJpY3N9LGVbIk15cmlhZFByby1JdCJdPWVbIk15cmlhZFByby1JdGFsaWMiXT1lWyJQZGZKUy1GYWxsYmFjay1JdGFsaWMiXT17bmFtZToiTGliZXJhdGlvblNhbnMtSXRhbGljIixmYWN0b3JzOm8uTXlyaWFkUHJvSXRhbGljRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsbWV0cmljczpvLk15cmlhZFByb0l0YWxpY01ldHJpY3N9LGVbIk15cmlhZFByby1Cb2xkSXQiXT1lWyJNeXJpYWRQcm8tQm9sZEl0YWxpYyJdPWVbIlBkZkpTLUZhbGxiYWNrLUJvbGRJdGFsaWMiXT17bmFtZToiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsZmFjdG9yczpvLk15cmlhZFByb0JvbGRJdGFsaWNGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNNYXBwaW5nLG1ldHJpY3M6by5NeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljc30sZS5BcmlhbE1UPWUuQXJpYWw9ZVsiQXJpYWwtUmVndWxhciJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIixiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZ30sZVsiQXJpYWwtQm9sZE1UIl09ZVsiQXJpYWwtQm9sZCJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkIixiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZ30sZVsiQXJpYWwtSXRhbGljTVQiXT1lWyJBcmlhbC1JdGFsaWMiXT17bmFtZToiTGliZXJhdGlvblNhbnMtSXRhbGljIixiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmd9LGVbIkFyaWFsLUJvbGRJdGFsaWNNVCJdPWVbIkFyaWFsLUJvbGRJdGFsaWMiXT17bmFtZToiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsYmFzZVdpZHRoczpzLkxpYmVyYXRpb25TYW5zQm9sZEl0YWxpY1dpZHRocyxiYXNlTWFwcGluZzpzLkxpYmVyYXRpb25TYW5zQm9sZEl0YWxpY01hcHBpbmd9LGVbIkNhbGlicmktUmVndWxhciJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIixmYWN0b3JzOm4uQ2FsaWJyaVJlZ3VsYXJGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nLG1ldHJpY3M6bi5DYWxpYnJpUmVndWxhck1ldHJpY3N9LGVbIkNhbGlicmktQm9sZCJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkIixmYWN0b3JzOm4uQ2FsaWJyaUJvbGRGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0JvbGRNYXBwaW5nLG1ldHJpY3M6bi5DYWxpYnJpQm9sZE1ldHJpY3N9LGVbIkNhbGlicmktSXRhbGljIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsZmFjdG9yczpuLkNhbGlicmlJdGFsaWNGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocyxiYXNlTWFwcGluZzpzLkxpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZyxtZXRyaWNzOm4uQ2FsaWJyaUl0YWxpY01ldHJpY3N9LGVbIkNhbGlicmktQm9sZEl0YWxpYyJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIixmYWN0b3JzOm4uQ2FsaWJyaUJvbGRJdGFsaWNGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNNYXBwaW5nLG1ldHJpY3M6bi5DYWxpYnJpQm9sZEl0YWxpY01ldHJpY3N9LGVbIlNlZ29ldWktUmVndWxhciJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIixmYWN0b3JzOmMuU2Vnb2V1aVJlZ3VsYXJGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nLG1ldHJpY3M6Yy5TZWdvZXVpUmVndWxhck1ldHJpY3N9LGVbIlNlZ29ldWktQm9sZCJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkIixmYWN0b3JzOmMuU2Vnb2V1aUJvbGRGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0JvbGRNYXBwaW5nLG1ldHJpY3M6Yy5TZWdvZXVpQm9sZE1ldHJpY3N9LGVbIlNlZ29ldWktSXRhbGljIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsZmFjdG9yczpjLlNlZ29ldWlJdGFsaWNGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocyxiYXNlTWFwcGluZzpzLkxpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZyxtZXRyaWNzOmMuU2Vnb2V1aUl0YWxpY01ldHJpY3N9LGVbIlNlZ29ldWktQm9sZEl0YWxpYyJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIixmYWN0b3JzOmMuU2Vnb2V1aUJvbGRJdGFsaWNGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNNYXBwaW5nLG1ldHJpY3M6Yy5TZWdvZXVpQm9sZEl0YWxpY01ldHJpY3N9LGVbIkhlbHZldGljYS1SZWd1bGFyIl09ZS5IZWx2ZXRpY2E9e25hbWU6IkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiLGZhY3RvcnM6aS5IZWx2ZXRpY2FSZWd1bGFyRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZyxtZXRyaWNzOmkuSGVsdmV0aWNhUmVndWxhck1ldHJpY3N9LGVbIkhlbHZldGljYS1Cb2xkIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUJvbGQiLGZhY3RvcnM6aS5IZWx2ZXRpY2FCb2xkRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZyxtZXRyaWNzOmkuSGVsdmV0aWNhQm9sZE1ldHJpY3N9LGVbIkhlbHZldGljYS1JdGFsaWMiXT17bmFtZToiTGliZXJhdGlvblNhbnMtSXRhbGljIixmYWN0b3JzOmkuSGVsdmV0aWNhSXRhbGljRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsbWV0cmljczppLkhlbHZldGljYUl0YWxpY01ldHJpY3N9LGVbIkhlbHZldGljYS1Cb2xkSXRhbGljIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMiLGZhY3RvcnM6aS5IZWx2ZXRpY2FCb2xkSXRhbGljRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZyxtZXRyaWNzOmkuSGVsdmV0aWNhQm9sZEl0YWxpY01ldHJpY3N9fSkpO2Z1bmN0aW9uIGQoZSl7Y29uc3QgdD0oMCxoLm5vcm1hbGl6ZUZvbnROYW1lKShlKTtyZXR1cm4gdSgpW3RdfX0sKGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5DYWxpYnJpUmVndWxhck1ldHJpY3M9dC5DYWxpYnJpUmVndWxhckZhY3RvcnM9dC5DYWxpYnJpSXRhbGljTWV0cmljcz10LkNhbGlicmlJdGFsaWNGYWN0b3JzPXQuQ2FsaWJyaUJvbGRNZXRyaWNzPXQuQ2FsaWJyaUJvbGRJdGFsaWNNZXRyaWNzPXQuQ2FsaWJyaUJvbGRJdGFsaWNGYWN0b3JzPXQuQ2FsaWJyaUJvbGRGYWN0b3JzPXZvaWQgMCx0LkNhbGlicmlCb2xkRmFjdG9ycz1bMS4zODc3LDEsMSwxLC45NzgwMSwuOTI0ODIsLjg5NTUyLC45MTEzMywuODE5ODgsLjk3NTY2LC45ODE1MiwuOTM1NDgsLjkzNTQ4LDEuMjc5OCwuODUyODQsLjkyNzk0LDEsLjk2MTM0LDEuNTQ2NTcsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC44Mjg0NSwuODI4NDUsLjg1Mjg0LC44NTI4NCwuODUyODQsLjc1ODU5LC45MjEzOCwuODM5MDgsLjc3NjIsLjczMjkzLC44NzI4OSwuNzMxMzMsLjc1MTQsLjgxOTIxLC44NzM1NiwuOTU5NTgsLjU5NTI2LC43NTcyNywuNjkyMjUsMS4wNDkyNCwuOTEyMSwuODY5NDMsLjc5Nzk1LC44ODE5OCwuNzc5NTgsLjcwODY0LC44MTA1NSwuOTAzOTksLjg4NjUzLC45NjAxNywuODI1NzcsLjc3ODkyLC43ODI1NywuOTc1MDcsMS41NDY1NywuOTc1MDcsLjg1Mjg0LC44OTU1MiwuOTAxNzYsLjg4NzYyLC44Nzg1LC43NTI0MSwuODc4NSwuOTA1MTgsLjk1MDE1LC43NzYxOCwuODc4NSwuODg0MDEsLjkxOTE2LC44NjMwNCwuODg0MDEsLjkxNDg4LC44Nzg1LC44ODAxLC44Nzg1LC44Nzg1LC45MTM0MywuNzE3MywxLjA0MTA2LC44Nzg1LC44NTA3NSwuOTU3OTQsLjgyNjE2LC44NTE2MiwuNzk0OTIsLjg4MzMxLDEuNjk4MDgsLjg4MzMxLC44NTI4NCwuOTc4MDEsLjg5NTUyLC45MTEzMywuODk1NTIsLjkxMTMzLDEuNzgwMSwuODk1NTIsMS4yNDQ4NywxLjEzMjU0LDEuMTI0MDEsLjk2ODM5LC44NTI4NCwuNjg3ODcsLjcwNjQ1LC44NTU5MiwuOTA3NDcsMS4wMTQ2NiwxLjAwODgsLjkwMzIzLDEsMS4wNzQ2MywxLC45MTA1NiwuNzU4MDYsMS4xOTExOCwuOTY4MzksLjc4ODY0LC44Mjg0NSwuODQxMzMsLjc1ODU5LC44MzkwOCwuODM5MDgsLjgzOTA4LC44MzkwOCwuODM5MDgsLjgzOTA4LC43NzUzOSwuNzMyOTMsLjczMTMzLC43MzEzMywuNzMxMzMsLjczMTMzLC45NTk1OCwuOTU5NTgsLjk1OTU4LC45NTk1OCwuODg1MDYsLjkxMjEsLjg2OTQzLC44Njk0MywuODY5NDMsLjg2OTQzLC44Njk0MywuODUyODQsLjg3NTA4LC45MDM5OSwuOTAzOTksLjkwMzk5LC45MDM5OSwuNzc4OTIsLjc5Nzk1LC45MDgwNywuODg3NjIsLjg4NzYyLC44ODc2MiwuODg3NjIsLjg4NzYyLC44ODc2MiwuODcxNSwuNzUyNDEsLjkwNTE4LC45MDUxOCwuOTA1MTgsLjkwNTE4LC44ODQwMSwuODg0MDEsLjg4NDAxLC44ODQwMSwuODc4NSwuODc4NSwuODgwMSwuODgwMSwuODgwMSwuODgwMSwuODgwMSwuOTA3NDcsLjg5MDQ5LC44Nzg1LC44Nzg1LC44Nzg1LC44Nzg1LC44NTE2MiwuODc4NSwuODUxNjIsLjgzOTA4LC44ODc2MiwuODM5MDgsLjg4NzYyLC44MzkwOCwuODg3NjIsLjczMjkzLC43NTI0MSwuNzMyOTMsLjc1MjQxLC43MzI5MywuNzUyNDEsLjczMjkzLC43NTI0MSwuODcyODksLjgzMDE2LC44ODUwNiwuOTMxMjUsLjczMTMzLC45MDUxOCwuNzMxMzMsLjkwNTE4LC43MzEzMywuOTA1MTgsLjczMTMzLC45MDUxOCwuNzMxMzMsLjkwNTE4LC44MTkyMSwuNzc2MTgsLjgxOTIxLC43NzYxOCwuODE5MjEsLjc3NjE4LDEsMSwuODczNTYsLjg3ODUsLjkxMDc1LC44OTYwOCwuOTU5NTgsLjg4NDAxLC45NTk1OCwuODg0MDEsLjk1OTU4LC44ODQwMSwuOTU5NTgsLjg4NDAxLC45NTk1OCwuODg0MDEsLjc2MjI5LC45MDE2NywuNTk1MjYsLjkxOTE2LDEsMSwuODYzMDQsLjY5MjI1LC44ODQwMSwxLDEsLjcwNDI0LC43OTQ2OCwuOTE5MjYsLjg4MTc1LC43MDgyMywuOTQ5MDMsLjkxMjEsLjg3ODUsMSwxLC45MTIxLC44Nzg1LC44NzgwMiwuODg2NTYsLjg3ODUsLjg2OTQzLC44ODAxLC44Njk0MywuODgwMSwuODY5NDMsLjg4MDEsLjg3NDAyLC44OTI5MSwuNzc5NTgsLjkxMzQzLDEsMSwuNzc5NTgsLjkxMzQzLC43MDg2NCwuNzE3MywuNzA4NjQsLjcxNzMsLjcwODY0LC43MTczLC43MDg2NCwuNzE3MywxLDEsLjgxMDU1LC43NTg0MSwuODEwNTUsMS4wNjQ1MiwuOTAzOTksLjg3ODUsLjkwMzk5LC44Nzg1LC45MDM5OSwuODc4NSwuOTAzOTksLjg3ODUsLjkwMzk5LC44Nzg1LC45MDM5OSwuODc4NSwuOTYwMTcsLjk1Nzk0LC43Nzg5MiwuODUxNjIsLjc3ODkyLC43ODI1NywuNzk0OTIsLjc4MjU3LC43OTQ5MiwuNzgyNTcsLjc5NDkyLC45Mjk3LC41Njg5MiwuODM5MDgsLjg4NzYyLC43NzUzOSwuODcxNSwuODc1MDgsLjg5MDQ5LDEsMSwuODEwNTUsMS4wNDEwNiwxLjIwNTI4LDEuMjA1MjgsMSwxLjE1NTQzLC43MDY3NCwuOTgzODcsLjk0NzIxLDEuMzM0MzEsMS40NTg5NCwuOTUxNjEsMS4wNjMwMywuODM5MDgsLjgwMzUyLC41NzE4NCwuNjk2NSwuNTYyODksLjgyMDAxLC41NjAyOSwuODEyMzUsMS4wMjk4OCwuODM5MDgsLjc3NjIsLjY4MTU2LC44MDM2NywuNzMxMzMsLjc4MjU3LC44NzM1NiwuODY5NDMsLjk1OTU4LC43NTcyNywuODkwMTksMS4wNDkyNCwuOTEyMSwuNzY0OCwuODY5NDMsLjg3MzU2LC43OTc5NSwuNzgyNzUsLjgxMDU1LC43Nzg5MiwuOTc2MiwuODI1NzcsLjk5ODE5LC44NDg5NiwuOTU5NTgsLjc3ODkyLC45NjEwOCwxLjAxNDA3LC44OTA0OSwxLjAyOTg4LC45NDIxMSwuOTYxMDgsLjg5MzYsLjg0MDIxLC44Nzg0MiwuOTYzOTksLjc5MTA5LC44OTA0OSwxLjAwODEzLDEuMDI5ODgsLjg2MDc3LC44NzQ0NSwuOTIwOTksLjg0NzIzLC44NjUxMywuODgwMSwuNzU2MzgsLjg1NzE0LC43ODIxNiwuNzk1ODYsLjg3OTY1LC45NDIxMSwuOTc3NDcsLjc4Mjg3LC45NzkyNiwuODQ5NzEsMS4wMjk4OCwuOTQyMTEsLjg4MDEsLjk0MjExLC44NDk3MSwuNzMxMzMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjkwMjY0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC45MDUxOCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTA1NDgsMSwxLDEsMSwxLDEsLjk2MDE3LC45NTc5NCwuOTYwMTcsLjk1Nzk0LC45NjAxNywuOTU3OTQsLjc3ODkyLC44NTE2MiwxLDEsLjg5NTUyLC45MDUyNywxLC45MDM2MywuOTI3OTQsLjkyNzk0LC45Mjc5NCwuOTI3OTQsLjg3MDEyLC44NzAxMiwuODcwMTIsLjg5NTUyLC44OTU1MiwxLjQyMjU5LC43MTE0MywxLjA2MTUyLDEsMSwxLjAzMzcyLDEuMDMzNzIsLjk3MTcxLDEuNDk1NiwyLjI4MDcsLjkzODM1LC44MzQwNiwuOTExMzMsLjg0MTA3LC45MTEzMywxLDEsMSwuNzIwMjEsMSwxLjIzMTA4LC44MzQ4OSwuODg1MjUsLjg4NTI1LC44MTQ5OSwuOTA1MjcsMS44MTA1NSwuOTA1MjcsMS44MTA1NSwxLjMxMDA2LDEuNTM3MTEsLjk0NDM0LDEuMDg2OTYsMSwuOTUwMTgsLjc3MTkyLC44NTI4NCwuOTA3NDcsMS4xNzUzNCwuNjk4MjUsLjk3MTYsMS4zNzA3NywuOTA3NDcsLjkwNzQ3LC44NTM1NiwuOTA3NDcsLjkwNzQ3LDEuNDQ5NDcsLjg1Mjg0LC44OTQxLC44OTQxLC43MDU3MiwuOCwuNzA1NzIsLjcwNTcyLC43MDU3MiwuNzA1NzIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC45OTg2MiwuOTk4NjIsMSwxLDEsMSwxLDEuMDgwMDQsLjkxMDI3LDEsMSwxLC45OTg2MiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTA3MjcsLjkwNzI3LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0LkNhbGlicmlCb2xkTWV0cmljcz17bGluZUhlaWdodDoxLjIyMDcsbGluZUdhcDouMjIwN30sdC5DYWxpYnJpQm9sZEl0YWxpY0ZhY3RvcnM9WzEuMzg3NywxLDEsMSwuOTc4MDEsLjkyNDgyLC44OTU1MiwuOTExMzMsLjgxOTg4LC45NzU2NiwuOTgxNTIsLjkzNTQ4LC45MzU0OCwxLjI3OTgsLjg1Mjg0LC45Mjc5NCwxLC45NjEzNCwxLjU2MjM5LC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuODI4NDUsLjgyODQ1LC44NTI4NCwuODUyODQsLjg1Mjg0LC43NTg1OSwuOTIxMzgsLjgzOTA4LC43NzYyLC43MTgwNSwuODcyODksLjczMTMzLC43NTE0LC44MTkyMSwuODczNTYsLjk1OTU4LC41OTUyNiwuNzU3MjcsLjY5MjI1LDEuMDQ5MjQsLjkwODcyLC44NTkzOCwuNzk3OTUsLjg3MDY4LC43Nzk1OCwuNjk3NjYsLjgxMDU1LC45MDM5OSwuODg2NTMsLjk2MDY4LC44MjU3NywuNzc4OTIsLjc4MjU3LC45NzUwNywxLjUyOSwuOTc1MDcsLjg1Mjg0LC44OTU1MiwuOTAxNzYsLjk0OTA4LC44NjQxMSwuNzQwMTIsLjg2NDExLC44ODMyMywuOTUwMTUsLjg2NDExLC44NjMzMSwuODg0MDEsLjkxOTE2LC44NjMwNCwuODg0MDEsLjkwMzksLjg2MzMxLC44NjMzMSwuODY0MTEsLjg2NDExLC45MDQ2NCwuNzA4NTIsMS4wNDEwNiwuODYzMzEsLjg0MzcyLC45NTc5NCwuODI2MTYsLjg0NTQ4LC43OTQ5MiwuODgzMzEsMS42OTgwOCwuODgzMzEsLjg1Mjg0LC45NzgwMSwuODk1NTIsLjkxMTMzLC44OTU1MiwuOTExMzMsMS43ODAxLC44OTU1MiwxLjI0NDg3LDEuMTMyNTQsMS4xOTEyOSwuOTY4MzksLjg1Mjg0LC42ODc4NywuNzA2NDUsLjg1NTkyLC45MDc0NywxLjAxNDY2LDEuMDA4OCwuOTAzMjMsMSwxLjA3NDYzLDEsLjkxMDU2LC43NTgwNiwxLjE5MTE4LC45NjgzOSwuNzg4NjQsLjgyODQ1LC44NDEzMywuNzU4NTksLjgzOTA4LC44MzkwOCwuODM5MDgsLjgzOTA4LC44MzkwOCwuODM5MDgsLjc3NTM5LC43MTgwNSwuNzMxMzMsLjczMTMzLC43MzEzMywuNzMxMzMsLjk1OTU4LC45NTk1OCwuOTU5NTgsLjk1OTU4LC44ODUwNiwuOTA4NzIsLjg1OTM4LC44NTkzOCwuODU5MzgsLjg1OTM4LC44NTkzOCwuODUyODQsLjg3MDY4LC45MDM5OSwuOTAzOTksLjkwMzk5LC45MDM5OSwuNzc4OTIsLjc5Nzk1LC45MDgwNywuOTQ5MDgsLjk0OTA4LC45NDkwOCwuOTQ5MDgsLjk0OTA4LC45NDkwOCwuODU4ODcsLjc0MDEyLC44ODMyMywuODgzMjMsLjg4MzIzLC44ODMyMywuODg0MDEsLjg4NDAxLC44ODQwMSwuODg0MDEsLjg3ODUsLjg2MzMxLC44NjMzMSwuODYzMzEsLjg2MzMxLC44NjMzMSwuODYzMzEsLjkwNzQ3LC44OTA0OSwuODYzMzEsLjg2MzMxLC44NjMzMSwuODYzMzEsLjg0NTQ4LC44NjQxMSwuODQ1NDgsLjgzOTA4LC45NDkwOCwuODM5MDgsLjk0OTA4LC44MzkwOCwuOTQ5MDgsLjcxODA1LC43NDAxMiwuNzE4MDUsLjc0MDEyLC43MTgwNSwuNzQwMTIsLjcxODA1LC43NDAxMiwuODcyODksLjc5NTM4LC44ODUwNiwuOTI3MjYsLjczMTMzLC44ODMyMywuNzMxMzMsLjg4MzIzLC43MzEzMywuODgzMjMsLjczMTMzLC44ODMyMywuNzMxMzMsLjg4MzIzLC44MTkyMSwuODY0MTEsLjgxOTIxLC44NjQxMSwuODE5MjEsLjg2NDExLDEsMSwuODczNTYsLjg2MzMxLC45MTA3NSwuODc3NywuOTU5NTgsLjg4NDAxLC45NTk1OCwuODg0MDEsLjk1OTU4LC44ODQwMSwuOTU5NTgsLjg4NDAxLC45NTk1OCwuODg0MDEsLjc2NDY3LC45MDE2NywuNTk1MjYsLjkxOTE2LDEsMSwuODYzMDQsLjY5MjI1LC44ODQwMSwxLDEsLjcwNDI0LC43NzMxMiwuOTE5MjYsLjg4MTc1LC43MDgyMywuOTQ5MDMsLjkwODcyLC44NjMzMSwxLDEsLjkwODcyLC44NjMzMSwuODY5MDYsLjg4MTE2LC44NjMzMSwuODU5MzgsLjg2MzMxLC44NTkzOCwuODYzMzEsLjg1OTM4LC44NjMzMSwuODc0MDIsLjg2NTQ5LC43Nzk1OCwuOTA0NjQsMSwxLC43Nzk1OCwuOTA0NjQsLjY5NzY2LC43MDg1MiwuNjk3NjYsLjcwODUyLC42OTc2NiwuNzA4NTIsLjY5NzY2LC43MDg1MiwxLDEsLjgxMDU1LC43NTg0MSwuODEwNTUsMS4wNjQ1MiwuOTAzOTksLjg2MzMxLC45MDM5OSwuODYzMzEsLjkwMzk5LC44NjMzMSwuOTAzOTksLjg2MzMxLC45MDM5OSwuODYzMzEsLjkwMzk5LC44NjMzMSwuOTYwNjgsLjk1Nzk0LC43Nzg5MiwuODQ1NDgsLjc3ODkyLC43ODI1NywuNzk0OTIsLjc4MjU3LC43OTQ5MiwuNzgyNTcsLjc5NDkyLC45Mjk3LC41Njg5MiwuODM5MDgsLjk0OTA4LC43NzUzOSwuODU4ODcsLjg3MDY4LC44OTA0OSwxLDEsLjgxMDU1LDEuMDQxMDYsMS4yMDUyOCwxLjIwNTI4LDEsMS4xNTU0MywuNzAwODgsLjk4Mzg3LC45NDcyMSwxLjMzNDMxLDEuNDU4OTQsLjk1MTYxLDEuNDgzODcsLjgzOTA4LC44MDM1MiwuNTcxMTgsLjY5NjUsLjU2MzQ3LC43OTE3OSwuNTU4NTMsLjgwMzQ2LDEuMDI5ODgsLjgzOTA4LC43NzYyLC42NzE3NCwuODYwMzYsLjczMTMzLC43ODI1NywuODczNTYsLjg2NDQxLC45NTk1OCwuNzU3MjcsLjg5MDE5LDEuMDQ5MjQsLjkwODcyLC43NDg4OSwuODU5MzgsLjg3ODkxLC43OTc5NSwuNzk1NywuODEwNTUsLjc3ODkyLC45NzQ0NywuODI1NzcsLjk3NDY2LC44NzE3OSwuOTU5NTgsLjc3ODkyLC45NDI1MiwuOTU2MTIsLjg3NTMsMS4wMjk4OCwuOTI3MzMsLjk0MjUyLC44NzQxMSwuODQwMjEsLjg3MjgsLjk1NjEyLC43NDA4MSwuODc1MywxLjAyMTg5LDEuMDI5ODgsLjg0ODE0LC44NzQ0NSwuOTE4MjIsLjg0NzIzLC44NTY2OCwuODYzMzEsLjgxMzQ0LC44NzU4MSwuNzY0MjIsLjgyMDQ2LC45NjA1NywuOTI3MzMsLjk5Mzc1LC43ODAyMiwuOTU0NTIsLjg2MDE1LDEuMDI5ODgsLjkyNzMzLC44NjMzMSwuOTI3MzMsLjg2MDE1LC43MzEzMywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTA2MzEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjg4MzIzLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44NTE3NCwxLDEsMSwxLDEsMSwuOTYwNjgsLjk1Nzk0LC45NjA2OCwuOTU3OTQsLjk2MDY4LC45NTc5NCwuNzc4OTIsLjg0NTQ4LDEsMSwuODk1NTIsLjkwNTI3LDEsLjkwMzYzLC45Mjc5NCwuOTI3OTQsLjkyNzk0LC44OTgwNywuODcwMTIsLjg3MDEyLC44NzAxMiwuODk1NTIsLjg5NTUyLDEuNDIyNTksLjcxMDk0LDEuMDYxNTIsMSwxLDEuMDMzNzIsMS4wMzM3MiwuOTcxNzEsMS40OTU2LDIuMjgwNywuOTI5NzIsLjgzNDA2LC45MTEzMywuODMzMjYsLjkxMTMzLDEsMSwxLC43MjAyMSwxLDEuMjMxMDgsLjgzNDg5LC44ODUyNSwuODg1MjUsLjgxNDk5LC45MDYxNiwxLjgxMDU1LC45MDUyNywxLjgxMDU1LDEuMzEwNywxLjUzNzExLC45NDQzNCwxLjA4Njk2LDEsLjk1MDE4LC43NzE5MiwuODUyODQsLjkwNzQ3LDEuMTc1MzQsLjY5ODI1LC45NzE2LDEuMzcwNzcsLjkwNzQ3LC45MDc0NywuODUzNTYsLjkwNzQ3LC45MDc0NywxLjQ0OTQ3LC44NTI4NCwuODk0MSwuODk0MSwuNzA1NzIsLjgsLjcwNTcyLC43MDU3MiwuNzA1NzIsLjcwNTcyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTk4NjIsLjk5ODYyLDEsMSwxLDEsMSwxLjA4MDA0LC45MTAyNywxLDEsMSwuOTk4NjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjkwNzI3LC45MDcyNywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMV0sdC5DYWxpYnJpQm9sZEl0YWxpY01ldHJpY3M9e2xpbmVIZWlnaHQ6MS4yMjA3LGxpbmVHYXA6LjIyMDd9LHQuQ2FsaWJyaUl0YWxpY0ZhY3RvcnM9WzEuMzg3NywxLDEsMSwxLjE3MjIzLDEuMTI5MywuODk1NTIsLjkxMTMzLC44MDM5NSwxLjAyMjY5LDEuMTU2MDEsLjkxMDU2LC45MTA1NiwxLjI3OTgsLjg1Mjg0LC44OTgwNywxLC45MDg2MSwxLjM5NTQzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTYzMDksLjk2MzA5LC44NTI4NCwuODUyODQsLjg1Mjg0LC44MzMxOSwuODgwNzEsLjg2NzUsLjgxNTUyLC43MjM0NiwuODUxOTMsLjczMjA2LC43NTIyLC44MTEwNSwuODYyNzUsLjkwNjg1LC42Mzc3LC43Nzg5MiwuNzU1OTMsMS4wMjYzOCwuODkyNDksLjg0MTE4LC43NzQ1MiwuODUzNzQsLjc1MTg2LC42Nzc4OSwuNzk3NzYsLjg4ODQ0LC44NTA2NiwuOTQzMDksLjc3ODE4LC43MzA2LC43NjY1OSwxLjEwMzY5LDEuMzgzMTMsMS4xMDM2OSwxLjA2MTM5LC44OTU1MiwuODczOSwuOTI0NSwuOTI0NSwuODMyMDMsLjkyNDUsLjg1ODY1LDEuMDk4NDIsLjkyNDUsLjkyNDUsMS4wMzI5NywxLjA3NjkyLC45MDkxOCwxLjAzMjk3LC45NDk1OSwuOTI0NSwuOTIyNzQsLjkyNDUsLjkyNDUsMS4wMjkzMywuNzc4MzIsMS4yMDU2MiwuOTI0NSwuODkxNiwuOTg5ODYsLjg2NjIxLC44OTQ1MywuNzkwMDQsLjk0MTUyLDEuNzcyNTYsLjk0MTUyLC44NTI4NCwuOTc4MDEsLjg5NTUyLC45MTEzMywuODk1NTIsLjkxMTMzLDEuOTE3MjksLjg5NTUyLDEuMTc4ODksMS4xMzI1NCwxLjE2MzU5LC45MjA5OCwuODUyODQsLjY4Nzg3LC43MTM1MywuODQ3MzcsLjkwNzQ3LDEuMDA4OCwxLjAwNDQsLjg3NjgzLDEsMS4wOTA5MSwxLC45MjIyOSwuNzM5LDEuMTU2NDIsLjkyMDk4LC43NjI4OCwuODA1MDQsLjgwOTcyLC43NTg1OSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuNzYzMTgsLjcyMzQ2LC43MzIwNiwuNzMyMDYsLjczMjA2LC43MzIwNiwuOTA2ODUsLjkwNjg1LC45MDY4NSwuOTA2ODUsLjg2NDc3LC44OTI0OSwuODQxMTgsLjg0MTE4LC44NDExOCwuODQxMTgsLjg0MTE4LC44NTI4NCwuODQ1NTcsLjg4ODQ0LC44ODg0NCwuODg4NDQsLjg4ODQ0LC43MzA2LC43NzQ1MiwuODYzMzEsLjkyNDUsLjkyNDUsLjkyNDUsLjkyNDUsLjkyNDUsLjkyNDUsLjg0ODQzLC44MzIwMywuODU4NjUsLjg1ODY1LC44NTg2NSwuODU4NjUsLjgyNjAxLC44MjYwMSwuODI2MDEsLjgyNjAxLC45NDQ2OSwuOTI0NSwuOTIyNzQsLjkyMjc0LC45MjI3NCwuOTIyNzQsLjkyMjc0LC45MDc0NywuODY2NTEsLjkyNDUsLjkyNDUsLjkyNDUsLjkyNDUsLjg5NDUzLC45MjQ1LC44OTQ1MywuODY3NSwuOTI0NSwuODY3NSwuOTI0NSwuODY3NSwuOTI0NSwuNzIzNDYsLjgzMjAzLC43MjM0NiwuODMyMDMsLjcyMzQ2LC44MzIwMywuNzIzNDYsLjgzMjAzLC44NTE5MywuODg3NSwuODY0NzcsLjk5MDM0LC43MzIwNiwuODU4NjUsLjczMjA2LC44NTg2NSwuNzMyMDYsLjg1ODY1LC43MzIwNiwuODU4NjUsLjczMjA2LC44NTg2NSwuODExMDUsLjkyNDUsLjgxMTA1LC45MjQ1LC44MTEwNSwuOTI0NSwxLDEsLjg2Mjc1LC45MjQ1LC45MDg3MiwuOTM1OTEsLjkwNjg1LC44MjYwMSwuOTA2ODUsLjgyNjAxLC45MDY4NSwuODI2MDEsLjkwNjg1LDEuMDMyOTcsLjkwNjg1LC44MjYwMSwuNzc4OTYsMS4wNTYxMSwuNjM3NywxLjA3NjkyLDEsMSwuOTA5MTgsLjc1NTkzLDEuMDMyOTcsMSwxLC43NjAzMiwuOTM3NSwuOTgxNTYsLjkzNDA3LC43NzI2MSwxLjExNDI5LC44OTI0OSwuOTI0NSwxLDEsLjg5MjQ5LC45MjQ1LC45MjUzNCwuODY2OTgsLjkyNDUsLjg0MTE4LC45MjI3NCwuODQxMTgsLjkyMjc0LC44NDExOCwuOTIyNzQsLjg2NjcsLjg2MjkxLC43NTE4NiwxLjAyOTMzLDEsMSwuNzUxODYsMS4wMjkzMywuNjc3ODksLjc3ODMyLC42Nzc4OSwuNzc4MzIsLjY3Nzg5LC43NzgzMiwuNjc3ODksLjc3ODMyLDEsMSwuNzk3NzYsLjk3NjU1LC43OTc3NiwxLjIzMDIzLC44ODg0NCwuOTI0NSwuODg4NDQsLjkyNDUsLjg4ODQ0LC45MjQ1LC44ODg0NCwuOTI0NSwuODg4NDQsLjkyNDUsLjg4ODQ0LC45MjQ1LC45NDMwOSwuOTg5ODYsLjczMDYsLjg5NDUzLC43MzA2LC43NjY1OSwuNzkwMDQsLjc2NjU5LC43OTAwNCwuNzY2NTksLjc5MDA0LDEuMDkyMzEsLjU0ODczLC44Njc1LC45MjQ1LC43NjMxOCwuODQ4NDMsLjg0NTU3LC44NjY1MSwxLDEsLjc5Nzc2LDEuMjA1NjIsMS4xODYyMiwxLjE4NjIyLDEsMS4xNDM3LC42NzAwOSwuOTYzMzQsLjkzNjk1LDEuMzUxOTEsMS40MDkwOSwuOTUxNjEsMS40ODM4NywuODY3NSwuOTA4NjEsLjYxOTIsLjczNjMsLjY0ODI0LC44MjQxMSwuNTYzMjEsLjg1Njk2LDEuMjM1MTYsLjg2NzUsLjgxNTUyLC43Mjg2LC44NDEzNCwuNzMyMDYsLjc2NjU5LC44NjI3NSwuODQzNjksLjkwNjg1LC43Nzg5MiwuODU4NzEsMS4wMjYzOCwuODkyNDksLjc1ODI4LC44NDExOCwuODU5ODQsLjc3NDUyLC43NjQ2NiwuNzk3NzYsLjczMDYsLjkwNzgyLC43NzgxOCwuOTAzLC44NzI5MSwuOTA2ODUsLjczMDYsLjk5MDU4LDEuMDM2NjcsLjk0NjM1LDEuMjM1MTYsLjk4NDksLjk5MDU4LC45MjM5MywuODkxNiwuOTQyLDEuMDM2NjcsLjc1MDI2LC45NDYzNSwxLjAyOTcsMS4yMzUxNiwuOTA5MTgsLjk0MDQ4LC45ODIxNywuODk3NDYsLjg0MTUzLC45MjI3NCwuODI1MDcsLjg4ODMyLC44NDQzOCwuODgxNzgsMS4wMzUyNSwuOTg0OSwxLjAwMjI1LC43ODA4NiwuOTcyNDgsLjg5NDA0LDEuMjM1MTYsLjk4NDksLjkyMjc0LC45ODQ5LC44OTQwNCwuNzMyMDYsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjg5NjkzLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44NTg2NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTA5MzMsMSwxLDEsMSwxLDEsLjk0MzA5LC45ODk4NiwuOTQzMDksLjk4OTg2LC45NDMwOSwuOTg5ODYsLjczMDYsLjg5NDUzLDEsMSwuODk1NTIsLjkwNTI3LDEsLjkwMTg2LDEuMTIzMDgsMS4xMjMwOCwxLjEyMzA4LDEuMTIzMDgsMS4yNTY2LDEuMjU2NiwxLjI1NjYsLjg5NTUyLC44OTU1MiwxLjQyMjU5LC42ODk5NCwxLjAzODA5LDEsMSwxLjAxNzYsMS4wMTc2LDEuMTE1MjMsMS40OTU2LDIuMDE0NjIsLjk3ODU4LC44MjYxNiwuOTExMzMsLjgzNDM3LC45MTEzMywxLDEsMSwuNzA1MDgsMSwxLjIzMTA4LC43OTgwMSwuODQ0MjYsLjg0NDI2LC43NzQsLjkwNTcyLDEuODEwNTUsLjkwNzQ5LDEuODEwNTUsMS4yODgwOSwxLjU1NDY5LC45NDQzNCwxLjA3ODA2LDEsLjk3MDk0LC43NTg5LC44NTI4NCwuOTA3NDcsMS4xOTY1OCwuNjk4MjUsLjk3NjIyLDEuMzM1MTIsLjkwNzQ3LC45MDc0NywuODUyODQsLjkwNzQ3LC45MDc0NywxLjQ0OTQ3LC44NTI4NCwuODk0MSwuODk0MSwuNzA1NzIsLjgsLjcwNTcyLC43MDU3MiwuNzA1NzIsLjcwNTcyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTk4NjIsLjk5ODYyLDEsMSwxLDEsMSwxLjAzMzYsLjkxMDI3LDEsMSwxLC45OTg2MiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjA1ODU5LDEuMDU4NTksMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdLHQuQ2FsaWJyaUl0YWxpY01ldHJpY3M9e2xpbmVIZWlnaHQ6MS4yMjA3LGxpbmVHYXA6LjIyMDd9LHQuQ2FsaWJyaVJlZ3VsYXJGYWN0b3JzPVsxLjM4NzcsMSwxLDEsMS4xNzIyMywxLjEyOTMsLjg5NTUyLC45MTEzMywuODAzOTUsMS4wMjI2OSwxLjE1NjAxLC45MTA1NiwuOTEwNTYsMS4yNzk4LC44NTI4NCwuODk4MDcsMSwuOTA4NjEsMS4zOTAxNiwuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjk2MzA5LC45NjMwOSwuODUyODQsLjg1Mjg0LC44NTI4NCwuODMzMTksLjg4MDcxLC44Njc1LC44MTU1MiwuNzM4MzQsLjg1MTkzLC43MzIwNiwuNzUyMiwuODExMDUsLjg2Mjc1LC45MDY4NSwuNjM3NywuNzc4OTIsLjc1NTkzLDEuMDI2MzgsLjg5Mzg1LC44NTEyMiwuNzc0NTIsLjg2NTAzLC43NTE4NiwuNjg4ODcsLjc5Nzc2LC44ODg0NCwuODUwNjYsLjk0MjU4LC43NzgxOCwuNzMwNiwuNzY2NTksMS4xMDM2OSwxLjM5MDE2LDEuMTAzNjksMS4wNjEzOSwuODk1NTIsLjg3MzksLjg2MTI4LC45NDQ2OSwuODQ1NywuOTQ0NjksLjg5NDY0LDEuMDk4NDIsLjg0NjM2LC45NDQ2OSwxLjAzMjk3LDEuMDc2OTIsLjkwOTE4LDEuMDMyOTcsLjk1ODk3LC45NDQ2OSwuOTQ4MiwuOTQ0NjksLjk0NDY5LDEuMDQ2OTIsLjc4MjIzLDEuMjA1NjIsLjk0NDY5LC45MDMzMiwuOTg5ODYsLjg2NjIxLC45MDUyNywuNzkwMDQsLjk0MTUyLDEuNzcyNTYsLjk0MTUyLC44NTI4NCwuOTc4MDEsLjg5NTUyLC45MTEzMywuODk1NTIsLjkxMTMzLDEuOTE3MjksLjg5NTUyLDEuMTc4ODksMS4xMzI1NCwxLjA4NzA3LC45MjA5OCwuODUyODQsLjY4Nzg3LC43MTM1MywuODQ3MzcsLjkwNzQ3LDEuMDA4OCwxLjAwNDQsLjg3NjgzLDEsMS4wOTA5MSwxLC45MjIyOSwuNzM5LDEuMTU2NDIsLjkyMDk4LC43NjI4OCwuODA1MDQsLjgwOTcyLC43NTg1OSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuNzYzMTgsLjczODM0LC43MzIwNiwuNzMyMDYsLjczMjA2LC43MzIwNiwuOTA2ODUsLjkwNjg1LC45MDY4NSwuOTA2ODUsLjg2NDc3LC44OTM4NSwuODUxMjIsLjg1MTIyLC44NTEyMiwuODUxMjIsLjg1MTIyLC44NTI4NCwuODUzMTEsLjg4ODQ0LC44ODg0NCwuODg4NDQsLjg4ODQ0LC43MzA2LC43NzQ1MiwuODYzMzEsLjg2MTI4LC44NjEyOCwuODYxMjgsLjg2MTI4LC44NjEyOCwuODYxMjgsLjg2OTMsLjg0NTcsLjg5NDY0LC44OTQ2NCwuODk0NjQsLjg5NDY0LC44MjYwMSwuODI2MDEsLjgyNjAxLC44MjYwMSwuOTQ0NjksLjk0NDY5LC45NDgyLC45NDgyLC45NDgyLC45NDgyLC45NDgyLC45MDc0NywuODY2NTEsLjk0NDY5LC45NDQ2OSwuOTQ0NjksLjk0NDY5LC45MDUyNywuOTQ0NjksLjkwNTI3LC44Njc1LC44NjEyOCwuODY3NSwuODYxMjgsLjg2NzUsLjg2MTI4LC43MzgzNCwuODQ1NywuNzM4MzQsLjg0NTcsLjczODM0LC44NDU3LC43MzgzNCwuODQ1NywuODUxOTMsLjkyNDU0LC44NjQ3NywuOTkyMSwuNzMyMDYsLjg5NDY0LC43MzIwNiwuODk0NjQsLjczMjA2LC44OTQ2NCwuNzMyMDYsLjg5NDY0LC43MzIwNiwuODk0NjQsLjgxMTA1LC44NDYzNiwuODExMDUsLjg0NjM2LC44MTEwNSwuODQ2MzYsMSwxLC44NjI3NSwuOTQ0NjksLjkwODcyLC45NTc4NiwuOTA2ODUsLjgyNjAxLC45MDY4NSwuODI2MDEsLjkwNjg1LC44MjYwMSwuOTA2ODUsMS4wMzI5NywuOTA2ODUsLjgyNjAxLC43Nzc0MSwxLjA1NjExLC42Mzc3LDEuMDc2OTIsMSwxLC45MDkxOCwuNzU1OTMsMS4wMzI5NywxLDEsLjc2MDMyLC45MDQ1MiwuOTgxNTYsMS4xMTg0MiwuNzcyNjEsMS4xMTQyOSwuODkzODUsLjk0NDY5LDEsMSwuODkzODUsLjk0NDY5LC45NTg3NywuODY5MDEsLjk0NDY5LC44NTEyMiwuOTQ4MiwuODUxMjIsLjk0ODIsLjg1MTIyLC45NDgyLC44NjY3LC45MDAxNiwuNzUxODYsMS4wNDY5MiwxLDEsLjc1MTg2LDEuMDQ2OTIsLjY4ODg3LC43ODIyMywuNjg4ODcsLjc4MjIzLC42ODg4NywuNzgyMjMsLjY4ODg3LC43ODIyMywxLDEsLjc5Nzc2LC45MjE4OCwuNzk3NzYsMS4yMzAyMywuODg4NDQsLjk0NDY5LC44ODg0NCwuOTQ0NjksLjg4ODQ0LC45NDQ2OSwuODg4NDQsLjk0NDY5LC44ODg0NCwuOTQ0NjksLjg4ODQ0LC45NDQ2OSwuOTQyNTgsLjk4OTg2LC43MzA2LC45MDUyNywuNzMwNiwuNzY2NTksLjc5MDA0LC43NjY1OSwuNzkwMDQsLjc2NjU5LC43OTAwNCwxLjA5MjMxLC41NDg3MywuODY3NSwuODYxMjgsLjc2MzE4LC44NjkzLC44NTMxMSwuODY2NTEsMSwxLC43OTc3NiwxLjIwNTYyLDEuMTg2MjIsMS4xODYyMiwxLDEuMTQzNywuNjc3NDIsLjk2MzM0LC45MzY5NSwxLjM1MTkxLDEuNDA5MDksLjk1MTYxLDEuNDgzODcsLjg2Njg2LC45MDg2MSwuNjIyNjcsLjc0MzU5LC42NTY0OSwuODU0OTgsLjU2OTYzLC44ODI1NCwxLjIzNTE2LC44Njc1LC44MTU1MiwuNzU0NDMsLjg0NTAzLC43MzIwNiwuNzY2NTksLjg2Mjc1LC44NTEyMiwuOTA2ODUsLjc3ODkyLC44NTc0NiwxLjAyNjM4LC44OTM4NSwuNzU2NTcsLjg1MTIyLC44NjI3NSwuNzc0NTIsLjc0MTcxLC43OTc3NiwuNzMwNiwuOTUxNjUsLjc3ODE4LC44OTc3MiwuODg4MzEsLjkwNjg1LC43MzA2LC45ODE0MiwxLjAyMTkxLC45NjU3NiwxLjIzNTE2LC45OTAxOCwuOTgxNDIsLjkyMzYsLjg5MjU4LC45NDAzNSwxLjAyMTkxLC43ODg0OCwuOTY1NzYsLjk1NjEsMS4yMzUxNiwuOTA5MTgsLjkyNTc4LC45NTQyNCwuODk3NDYsLjgzOTY5LC45NDgyLC44MDExMywuODk0NDIsLjg1MjA4LC44NjE1NSwuOTgwMjIsLjk5MDE4LDEuMDA0NTIsLjgxMjA5LC45OTI0NywuODkxODEsMS4yMzUxNiwuOTkwMTgsLjk0ODIsLjk5MDE4LC44OTE4MSwuNzMyMDYsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjg4ODQ0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44OTQ2NCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTY3NjYsMSwxLDEsMSwxLDEsLjk0MjU4LC45ODk4NiwuOTQyNTgsLjk4OTg2LC45NDI1OCwuOTg5ODYsLjczMDYsLjkwNTI3LDEsMSwuODk1NTIsLjkwNTI3LDEsLjkwMTg2LDEuMTIzMDgsMS4xMjMwOCwxLjEyMzA4LDEuMTIzMDgsMS4yNTY2LDEuMjU2NiwxLjI1NjYsLjg5NTUyLC44OTU1MiwxLjQyMjU5LC42OTA0MywxLjAzODA5LDEsMSwxLjAxNzYsMS4wMTc2LDEuMTE1MjMsMS40OTU2LDIuMDE0NjIsLjk5MzMxLC44MjYxNiwuOTExMzMsLjg0Mjg2LC45MTEzMywxLDEsMSwuNzA1MDgsMSwxLjIzMTA4LC43OTgwMSwuODQ0MjYsLjg0NDI2LC43NzQsLjkwNTI3LDEuODEwNTUsLjkwNTI3LDEuODEwNTUsMS4yODgwOSwxLjU1NDY5LC45NDQzNCwxLjA3ODA2LDEsLjk3MDk0LC43NTg5LC44NTI4NCwuOTA3NDcsMS4xOTY1OCwuNjk4MjUsLjk3NjIyLDEuMzM1MTIsLjkwNzQ3LC45MDc0NywuODUzNTYsLjkwNzQ3LC45MDc0NywxLjQ0OTQ3LC44NTI4NCwuODk0MSwuODk0MSwuNzA1NzIsLjgsLjcwNTcyLC43MDU3MiwuNzA1NzIsLjcwNTcyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTk4NjIsLjk5ODYyLDEsMSwxLDEsMSwxLjAzMzYsLjkxMDI3LDEsMSwxLC45OTg2MiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjA1ODU5LDEuMDU4NTksMSwxLDEsMS4wNzE4NSwuOTk0MTMsLjk2MzM0LDEuMDgwNjUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0LkNhbGlicmlSZWd1bGFyTWV0cmljcz17bGluZUhlaWdodDoxLjIyMDcsbGluZUdhcDouMjIwN319LChlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuSGVsdmV0aWNhUmVndWxhck1ldHJpY3M9dC5IZWx2ZXRpY2FSZWd1bGFyRmFjdG9ycz10LkhlbHZldGljYUl0YWxpY01ldHJpY3M9dC5IZWx2ZXRpY2FJdGFsaWNGYWN0b3JzPXQuSGVsdmV0aWNhQm9sZE1ldHJpY3M9dC5IZWx2ZXRpY2FCb2xkSXRhbGljTWV0cmljcz10LkhlbHZldGljYUJvbGRJdGFsaWNGYWN0b3JzPXQuSGVsdmV0aWNhQm9sZEZhY3RvcnM9dm9pZCAwLHQuSGVsdmV0aWNhQm9sZEZhY3RvcnM9Wy43NjExNiwxLDEsMS4wMDA2LC45OTk5OCwuOTk5NzQsLjk5OTczLC45OTk3MywuOTk5ODIsLjk5OTc3LDEuMDAwODcsLjk5OTk4LC45OTk5OCwuOTk5NTksMS4wMDAwMywxLjAwMDYsLjk5OTk4LDEuMDAwNiwxLjAwMDYsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk5OCwxLDEuMDAwMDMsMS4wMDAwMywxLjAwMDAzLDEuMDAwMjYsLjk5OTksLjk5OTc3LC45OTk3NywuOTk5NzcsLjk5OTc3LDEuMDAwMDEsMS4wMDAyNiwxLjAwMDIyLC45OTk3NywxLjAwMDYsLjk5OTczLC45OTk3NywxLjAwMDI2LC45OTk5OSwuOTk5NzcsMS4wMDAyMiwxLjAwMDAxLDEuMDAwMjIsLjk5OTc3LDEuMDAwMDEsMS4wMDAyNiwuOTk5NzcsMS4wMDAwMSwxLjAwMDE2LDEuMDAwMDEsMS4wMDAwMSwxLjAwMDI2LC45OTk5OCwxLjAwMDYsLjk5OTk4LDEuMDAwMDMsLjk5OTczLC45OTk5OCwuOTk5NzMsMS4wMDAyNiwuOTk5NzMsMS4wMDAyNiwuOTk5NzMsLjk5OTk4LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDYsMS4wMDA2LC45OTk3MywxLjAwMDYsLjk5OTgyLDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsLjk5OTU5LC45OTk3MywuOTk5OTgsMS4wMDAyNiwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsLjk5OTczLDEsLjk5OTU5LDEuMDAwNzcsLjk5OTU5LDEuMDAwMDMsLjk5OTk4LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDc3LC45OTk3MywuOTk5OTgsMS4wMDAyNSwuOTk5NjgsLjk5OTczLDEuMDAwMDMsMS4wMDAyNSwuNjAyOTksMS4wMDAyNCwxLjA2NDA5LDEsMSwuOTk5OTgsMSwuOTk5NzMsMS4wMDA2LC45OTk5OCwxLC45OTkzNiwuOTk5NzMsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMS4wMDAyNiwuOTk5NzcsLjk5OTc3LC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywxLC45OTk3NywxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwuOTk5NzcsLjk5OTc3LDEuMDAwMjIsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMjIsMS4wMDAyMiwxLjAwMDAzLDEuMDAwMjIsLjk5OTc3LC45OTk3NywuOTk5NzcsLjk5OTc3LDEuMDAwMDEsMS4wMDAwMSwxLjAwMDI2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk4MiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDY0MDksMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LC45OTk3MywxLjAwMDI2LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywxLjAzMzc0LC45OTk3NywxLjAwMDI2LDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMjIsMS4wMDAyNiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMjIsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA0MiwuOTk5NzMsLjk5OTczLDEuMDAwNiwuOTk5NzcsLjk5OTczLC45OTk3MywxLjAwMDI2LDEuMDAwNiwxLjAwMDI2LDEuMDAwNiwxLjAwMDI2LDEuMDM4MjgsMS4wMDAyNiwuOTk5OTksMS4wMDAyNiwxLjAwMDYsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsLjk5OTMsLjk5OTgsMS4wMDAyNiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMjIsMS4wMDAyNiwxLDEuMDAwMTYsLjk5OTc3LC45OTk1OSwuOTk5NzcsLjk5OTU5LC45OTk3NywuOTk5NTksMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsMS4wMDAyNiwuOTk5OTgsMS4wMDAyNiwuODEyMSwxLjAwMDI2LC45OTk5OCwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwxLjAwMDE2LDEuMDAwMjIsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwxLjAwMDI2LDEsMS4wMDAyNiwxLDEuMDAwMjYsMSwxLjAwMDYsLjk5OTczLC45OTk3NywuOTk5NzMsMSwuOTk5ODIsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMDEsLjk5OTczLDEuMDAwMjYsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwxLjAwMDM0LC45OTk3NywxLC45OTk5NywxLjAwMDI2LDEuMDAwNzgsMS4wMDAzNiwuOTk5NzMsMS4wMDAxMywxLjAwMDYsLjk5OTc3LC45OTk3NywuOTk5ODgsLjg1MTQ4LDEuMDAwMDEsMS4wMDAyNiwuOTk5NzcsMS4wMDAyMiwxLjAwMDYsLjk5OTc3LDEuMDAwMDEsLjk5OTk5LC45OTk3NywxLjAwMDY5LDEuMDAwMjIsLjk5OTc3LDEuMDAwMDEsLjk5OTg0LDEuMDAwMjYsMS4wMDAwMSwxLjAwMDI0LDEuMDAwMDEsLjk5OTksMSwxLjAwMDYsMS4wMDAwMSwxLjAwMDQxLC45OTk2MiwxLjAwMDI2LDEuMDAwNiwuOTk5OTUsMS4wMDA0MSwuOTk5NDIsLjk5OTczLC45OTkyNywxLjAwMDgyLC45OTkwMiwxLjAwMDI2LDEuMDAwODcsMS4wMDA2LDEuMDAwNjksLjk5OTczLC45OTg2NywuOTk5NzMsLjk5OTMsMS4wMDAyNiwxLjAwMDQ5LDEuMDAwNTYsMSwuOTk5ODgsLjk5OTM1LC45OTk5NSwuOTk5NTQsMS4wMDA1NSwuOTk5NDUsMS4wMDAzMiwxLjAwMDYsLjk5OTk1LDEuMDAwMjYsLjk5OTk1LDEuMDAwMzIsMS4wMDAwMSwxLjAwMDA4LC45OTk3MSwxLjAwMDE5LC45OTk0LDEuMDAwMDEsMS4wMDA2LDEuMDAwNDQsLjk5OTczLDEuMDAwMjMsMS4wMDA0NywxLC45OTk0MiwuOTk1NjEsLjk5OTg5LDEuMDAwMzUsLjk5OTc3LDEuMDAwMzUsLjk5OTc3LDEuMDAwMTksLjk5OTQ0LDEuMDAwMDEsMS4wMDAyMSwuOTk5MjYsMS4wMDAzNSwxLjAwMDM1LC45OTk0MiwxLjAwMDQ4LC45OTk5OSwuOTk5NzcsMS4wMDAyMiwxLjAwMDM1LDEuMDAwMDEsLjk5OTc3LDEuMDAwMjYsLjk5OTg5LDEuMDAwNTcsMS4wMDAwMSwuOTk5MzYsMS4wMDA1MiwxLjAwMDEyLC45OTk5NiwxLjAwMDQzLDEsMS4wMDAzNSwuOTk5NCwuOTk5NzYsMS4wMDAzNSwuOTk5NzMsMS4wMDA1MiwxLjAwMDQxLDEuMDAxMTksMS4wMDAzNywuOTk5NzMsMS4wMDAwMiwuOTk5ODYsMS4wMDA0MSwxLjAwMDQxLC45OTkwMiwuOTk5NiwxLjAwMDM0LC45OTk5OSwxLjAwMDI2LC45OTk5OSwxLjAwMDI2LC45OTk3MywxLjAwMDUyLC45OTk3MywxLC45OTk3MywxLjAwMDQxLDEuMDAwNzUsLjk5OTQsMS4wMDAzLC45OTk5OSwxLDEuMDAwNDEsLjk5OTU1LDEsLjk5OTE1LC45OTk3MywuOTk5NzMsMS4wMDAyNiwxLjAwMTE5LC45OTk1NSwuOTk5NzMsMS4wMDA2LC45OTkxMSwxLjAwMDYsMS4wMDAyNiwuOTk5NzIsMS4wMDAyNiwuOTk5MDIsMS4wMDA0MSwuOTk5NzMsLjk5OTk5LDEsMSwxLjAwMDM4LDEuMDAwNSwxLjAwMDE2LDEuMDAwMjIsMS4wMDAxNiwxLjAwMDIyLDEuMDAwMTYsMS4wMDAyMiwxLjAwMDAxLC45OTk3MywxLDEsLjk5OTczLDEsMSwuOTk5NTUsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEsMSwxLC45OTk3MywuOTk5NzMsLjk5OTcyLDEsMSwxLjAwMTA2LC45OTk5OSwuOTk5OTgsLjk5OTk4LC45OTk5OSwuOTk5OTgsMS42NjQ3NSwxLC45OTk3MywuOTk5NzMsMS4wMDAyMywuOTk5NzMsLjk5OTcxLDEuMDAwNDcsMS4wMDAyMywxLC45OTk5MSwuOTk5ODQsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMS4wMDAwMiwxLDEsMSwxLDEsMSwxLC45OTk3MiwxLDEuMjA5ODUsMS4zOTcxMywxLjAwMDAzLDEuMDAwMzEsMS4wMDAxNSwxLC45OTU2MSwxLjAwMDI3LDEuMDAwMzEsMS4wMDAzMSwuOTk5MTUsMS4wMDAzMSwxLjAwMDMxLC45OTk5OSwxLjAwMDAzLC45OTk5OSwuOTk5OTksMS40MTE0NCwxLjYsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQwNTc5LDEuNDA1NzksMS4zNjYyNSwuOTk5OTksMSwuOTk4NjEsLjk5ODYxLDEsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwuOTk5NzIsLjk5OTk5LC45OTk5OSwuOTk5OTksLjk5OTk5LDEuNDA0ODMsMSwuOTk5NzcsMS4wMDA1NCwxLDEsLjk5OTUzLC45OTk2MiwxLjAwMDQyLC45OTk1LDEsMSwxLDEsMSwxLDEsMSwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0LkhlbHZldGljYUJvbGRNZXRyaWNzPXtsaW5lSGVpZ2h0OjEuMixsaW5lR2FwOi4yfSx0LkhlbHZldGljYUJvbGRJdGFsaWNGYWN0b3JzPVsuNzYxMTYsMSwxLDEuMDAwNiwuOTk5OTgsLjk5OTc0LC45OTk3MywuOTk5NzMsLjk5OTgyLC45OTk3NywxLjAwMDg3LC45OTk5OCwuOTk5OTgsLjk5OTU5LDEuMDAwMDMsMS4wMDA2LC45OTk5OCwxLjAwMDYsMS4wMDA2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5OTgsMSwxLjAwMDAzLDEuMDAwMDMsMS4wMDAwMywxLjAwMDI2LC45OTk5LC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywxLjAwMDAxLDEuMDAwMjYsMS4wMDAyMiwuOTk5NzcsMS4wMDA2LC45OTk3MywuOTk5NzcsMS4wMDAyNiwuOTk5OTksLjk5OTc3LDEuMDAwMjIsMS4wMDAwMSwxLjAwMDIyLC45OTk3NywxLjAwMDAxLDEuMDAwMjYsLjk5OTc3LDEuMDAwMDEsMS4wMDAxNiwxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNiwuOTk5OTgsMS4wMDA2LC45OTk5OCwxLjAwMDAzLC45OTk3MywuOTk5OTgsLjk5OTczLDEuMDAwMjYsLjk5OTczLDEuMDAwMjYsLjk5OTczLC45OTk5OCwxLjAwMDI2LDEuMDAwMjYsMS4wMDA2LDEuMDAwNiwuOTk5NzMsMS4wMDA2LC45OTk4MiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LC45OTk1OSwuOTk5NzMsLjk5OTk4LDEuMDAwMjYsLjk5OTczLDEuMDAwMjIsLjk5OTczLC45OTk3MywxLC45OTk1OSwxLjAwMDc3LC45OTk1OSwxLjAwMDAzLC45OTk5OCwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wMDA3NywuOTk5NzMsLjk5OTk4LDEuMDAwMjUsLjk5OTY4LC45OTk3MywxLjAwMDAzLDEuMDAwMjUsLjYwMjk5LDEuMDAwMjQsMS4wNjQwOSwxLDEsLjk5OTk4LDEsLjk5OTczLDEuMDAwNiwuOTk5OTgsMSwuOTk5MzYsLjk5OTczLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMjYsLjk5OTc3LC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywuOTk5NzcsMSwuOTk5NzcsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTc3LC45OTk3NywxLjAwMDIyLDEuMDAwMjIsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMjIsMS4wMDAwMywxLjAwMDIyLC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5ODIsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjA2NDA5LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwuOTk5NzMsMS4wMDAyNiwuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsMS4wMDQ0LC45OTk3NywxLjAwMDI2LDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMjIsMS4wMDAyNiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMjIsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTcxLC45OTk3MywuOTk5NzMsMS4wMDA2LC45OTk3NywuOTk5NzMsLjk5OTczLDEuMDAwMjYsMS4wMDA2LDEuMDAwMjYsMS4wMDA2LDEuMDAwMjYsMS4wMTAxMSwxLjAwMDI2LC45OTk5OSwxLjAwMDI2LDEuMDAwNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5MywuOTk5OCwxLjAwMDI2LDEuMDAwMjIsMS4wMDAyNiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAyMiwxLjAwMDI2LDEsMS4wMDAxNiwuOTk5NzcsLjk5OTU5LC45OTk3NywuOTk5NTksLjk5OTc3LC45OTk1OSwxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDI2LC45OTk5OCwxLjAwMDI2LC44MTIxLDEuMDAwMjYsLjk5OTk4LC45OTk3NywxLjAwMDI2LC45OTk3NywxLjAwMDI2LC45OTk3NywxLjAwMDI2LC45OTk3NywxLjAwMDI2LC45OTk3NywxLjAwMDI2LC45OTk3NywxLjAwMDI2LDEuMDAwMTYsMS4wMDAyMiwxLjAwMDAxLC45OTk3MywxLjAwMDAxLDEuMDAwMjYsMSwxLjAwMDI2LDEsMS4wMDAyNiwxLDEuMDAwNiwuOTk5NzMsLjk5OTc3LC45OTk3MywxLC45OTk4MiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAwMSwuOTk5NzMsMS4wMDAyNiwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5NzcsMSwxLDEuMDAwMjYsLjk5OTY5LC45OTk3MiwuOTk5ODEsLjk5OTgsMS4wMDA2LC45OTk3NywuOTk5NzcsMS4wMDAyMiwuOTExNTUsMS4wMDAwMSwxLjAwMDI2LC45OTk3NywxLjAwMDIyLDEuMDAwNiwuOTk5NzcsMS4wMDAwMSwuOTk5OTksLjk5OTc3LC45OTk2NiwxLjAwMDIyLDEuMDAwMzIsMS4wMDAwMSwuOTk5NDQsMS4wMDAyNiwxLjAwMDAxLC45OTk2OCwxLjAwMDAxLDEuMDAwNDcsMSwxLjAwMDYsMS4wMDAwMSwuOTk5ODEsMS4wMDEwMSwxLjAwMDI2LDEuMDAwNiwuOTk5NDgsLjk5OTgxLDEuMDAwNjQsLjk5OTczLC45OTk0MiwxLjAwMTAxLDEuMDAwNjEsMS4wMDAyNiwxLjAwMDY5LDEuMDAwNiwxLjAwMDE0LC45OTk3MywxLjAxMzIyLC45OTk3MywxLjAwMDY1LDEuMDAwMjYsMS4wMDAxMiwuOTk5MjMsMSwxLjAwMDY0LDEuMDAwNzYsLjk5OTQ4LDEuMDAwNTUsMS4wMDA2MywxLjAwMDA3LC45OTk0MywxLjAwMDYsLjk5OTQ4LDEuMDAwMjYsLjk5OTQ4LC45OTk0MywxLjAwMDAxLDEuMDAwMDEsMS4wMDAyOSwxLjAwMDM4LDEuMDAwMzUsMS4wMDAwMSwxLjAwMDYsMS4wMDA2LC45OTk3MywuOTk5NzgsMS4wMDAwMSwxLjAwMDU3LC45OTk4OSwuOTk5NjcsLjk5OTY0LC45OTk2NywuOTk5NzcsLjk5OTk5LC45OTk3NywxLjAwMDM4LC45OTk3NywxLjAwMDAxLC45OTk3MywxLjAwMDY2LC45OTk2NywuOTk5NjcsMS4wMDA0MSwuOTk5OTgsLjk5OTk5LC45OTk3NywxLjAwMDIyLC45OTk2NywxLjAwMDAxLC45OTk3NywxLjAwMDI2LC45OTk2NCwxLjAwMDMxLDEuMDAwMDEsLjk5OTk5LC45OTk5OSwxLDEuMDAwMjMsMSwxLC45OTk5OSwxLjAwMDM1LDEuMDAwMDEsLjk5OTk5LC45OTk3MywuOTk5NzcsLjk5OTk5LDEuMDAwNTgsLjk5OTczLC45OTk3MywuOTk5NTUsLjk5OTUsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMzIsLjk5OTg5LDEuMDAwMzQsLjk5OTk5LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LC45OTk3MywuNDU5OTgsLjk5OTczLDEuMDAwMjYsLjk5OTczLDEuMDAwMDEsLjk5OTk5LC45OTk4MiwuOTk5OTQsLjk5OTk2LDEsMS4wMDA0MiwxLjAwMDQ0LDEuMDAwMjksMS4wMDAyMywuOTk5NzMsLjk5OTczLDEuMDAwMjYsLjk5OTQ5LDEuMDAwMDIsLjk5OTczLDEuMDAwNiwxLjAwMDYsMS4wMDA2LC45OTk3NSwxLjAwMDI2LDEuMDAwMjYsMS4wMDAzMiwuOTg2ODUsLjk5OTczLDEuMDAwMjYsMSwxLC45OTk2NiwxLjAwMDQ0LDEuMDAwMTYsMS4wMDAyMiwxLjAwMDE2LDEuMDAwMjIsMS4wMDAxNiwxLjAwMDIyLDEuMDAwMDEsLjk5OTczLDEsMSwuOTk5NzMsMSwxLC45OTk1NSwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMSwxLDEsLjk5OTczLC45OTk3MywuOTk5NzIsMSwxLDEuMDAxMDYsLjk5OTk5LC45OTk5OCwuOTk5OTgsLjk5OTk5LC45OTk5OCwxLjY2NDc1LDEsLjk5OTczLC45OTk3MywxLC45OTk3MywuOTk5NzEsLjk5OTc4LDEsMSwuOTk5OTEsLjk5OTg0LDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMS4wMDA5OCwxLDEsMSwxLjAwMDQ5LDEsMSwuOTk5NzIsMSwxLjIwOTg1LDEuMzk3MTMsMS4wMDAwMywxLjAwMDMxLDEuMDAwMTUsMSwuOTk1NjEsMS4wMDAyNywxLjAwMDMxLDEuMDAwMzEsLjk5OTE1LDEuMDAwMzEsMS4wMDAzMSwuOTk5OTksMS4wMDAwMywuOTk5OTksLjk5OTk5LDEuNDExNDQsMS42LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MDU3OSwxLjQwNTc5LDEuMzY2MjUsLjk5OTk5LDEsLjk5ODYxLC45OTg2MSwxLDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsLjk5OTcyLC45OTk5OSwuOTk5OTksLjk5OTk5LC45OTk5OSwxLjQwNDgzLDEsLjk5OTc3LDEuMDAwNTQsMSwxLC45OTk1MywuOTk5NjIsMS4wMDA0MiwuOTk5NSwxLDEsMSwxLDEsMSwxLDEsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LDEsMSwxLDEsMSwxLDEsMSwxLDEsMV0sdC5IZWx2ZXRpY2FCb2xkSXRhbGljTWV0cmljcz17bGluZUhlaWdodDoxLjM1LGxpbmVHYXA6LjJ9LHQuSGVsdmV0aWNhSXRhbGljRmFjdG9ycz1bLjc2MTE2LDEsMSwxLjAwMDYsMS4wMDA2LDEuMDAwMDYsLjk5OTczLC45OTk3MywuOTk5ODIsMS4wMDAwMSwxLjAwMDQzLC45OTk5OCwuOTk5OTgsLjk5OTU5LDEuMDAwMDMsMS4wMDA2LC45OTk5OCwxLjAwMDYsMS4wMDA2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDYsMSwxLjAwMDAzLDEuMDAwMDMsMS4wMDAwMywuOTk5NzMsLjk5OTg3LDEuMDAwMDEsMS4wMDAwMSwuOTk5NzcsLjk5OTc3LDEuMDAwMDEsMS4wMDAyNiwxLjAwMDIyLC45OTk3NywxLjAwMDYsMSwxLjAwMDAxLC45OTk3MywuOTk5OTksLjk5OTc3LDEuMDAwMjIsMS4wMDAwMSwxLjAwMDIyLC45OTk3NywxLjAwMDAxLDEuMDAwMjYsLjk5OTc3LDEuMDAwMDEsMS4wMDAxNiwxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwuOTk5NDksLjk5OTczLC45OTk5OCwuOTk5NzMsLjk5OTczLDEsLjk5OTczLC45OTk3MywxLjAwMDYsLjk5OTczLC45OTk3MywuOTk5MjQsLjk5OTI0LDEsLjk5OTI0LC45OTk5OSwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTk4LDEsMS4wMDA2LC45OTk3MywxLC45OTk3NywxLDEsMSwxLjAwMDA1LDEuMDAwOSwxLjAwMDA1LDEuMDAwMDMsLjk5OTk4LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDksLjk5OTczLC45OTk5OCwxLjAwMDI1LC45OTk2OCwuOTk5NzMsMS4wMDAwMywxLjAwMDI1LC42MDI5OSwxLjAwMDI0LDEuMDY0MDksMSwxLC45OTk5OCwxLC45OTk4LDEuMDAwNiwuOTk5OTgsMSwuOTk5MzYsLjk5OTczLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMjYsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMSwuOTk5NzcsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTc3LC45OTk3NywxLjAwMDIyLDEuMDAwMjIsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMjIsMS4wMDAwMywxLjAwMDIyLC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5ODIsMSwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjA2NDA5LDEuMDAwMjYsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEsLjk5OTczLDEsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsLjk5OTc3LDEsLjk5OTc3LDEsLjk5OTc3LDEsLjk5OTc3LDEsLjk5OTc3LDEuMDI4OCwuOTk5NzcsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTI0LDEuMDAwNiwxLjAwMDYsLjk5OTQ2LDEuMDAwMzQsMSwuOTk5MjQsMS4wMDAwMSwxLDEsLjk5OTczLC45OTkyNCwuOTk5NzMsLjk5OTI0LC45OTk3MywxLjA2MzExLC45OTk3MywxLjAwMDI0LC45OTk3MywuOTk5MjQsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsMS4wMDA0MSwuOTk5OCwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsMSwxLjAwMDE2LC45OTk3NywuOTk5OTgsLjk5OTc3LC45OTk5OCwuOTk5NzcsLjk5OTk4LDEuMDAwMDEsMSwxLjAwMDAxLDEsMS4wMDAwMSwxLDEuMDAwMDEsMSwxLjAwMDI2LDEuMDAwNiwxLjAwMDI2LC44OTU0NywxLjAwMDI2LDEuMDAwNiwuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywxLjAwMDE2LC45OTk3NywxLjAwMDAxLDEsMS4wMDAwMSwxLjAwMDI2LDEsMS4wMDAyNiwxLDEuMDAwMjYsMSwuOTk5MjQsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEsLjk5OTgyLDEuMDAwMjIsMS4wMDAyNiwxLjAwMDAxLDEsMS4wMDAyNiwxLjAwMDYsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwxLjAwMDAxLDEsMS4wMDA1NCwuOTk5NzcsMS4wMDA4NCwxLjAwMDA3LC45OTk3MywxLjAwMDEzLC45OTkyNCwxLjAwMDAxLDEuMDAwMDEsLjk5OTQ1LC45MTIyMSwxLjAwMDAxLDEuMDAwMjYsLjk5OTc3LDEuMDAwMjIsMS4wMDA2LDEuMDAwMDEsMS4wMDAwMSwuOTk5OTksLjk5OTc3LC45OTkzMywxLjAwMDIyLDEuMDAwNTQsMS4wMDAwMSwxLjAwMDY1LDEuMDAwMjYsMS4wMDAwMSwxLjAwMDEsMS4wMDAwMSwxLjAwMDUyLDEsMS4wMDA2LDEuMDAwMDEsLjk5OTQ1LC45OTg5NywuOTk5NjgsLjk5OTI0LDEuMDAwMzYsLjk5OTQ1LC45OTk0OSwxLDEuMDAwNiwuOTk4OTcsLjk5OTE4LC45OTk2OCwuOTk5MTEsLjk5OTI0LDEsLjk5OTYyLDEuMDE0ODcsMSwxLjAwMDUsLjk5OTczLDEuMDAwMTIsMS4wMDA0MywxLC45OTk5NSwuOTk5OTQsMS4wMDAzNiwuOTk5NDcsMS4wMDAxOSwxLjAwMDYzLDEuMDAwMjUsLjk5OTI0LDEuMDAwMzYsLjk5OTczLDEuMDAwMzYsMS4wMDAyNSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNywxLjAwMDEsMS4wMDA2OCwxLjAwMDAxLDEuMDAwNiwxLjAwMDYsMSwxLjAwMDA4LC45OTk1NywuOTk5NzIsLjk5OTQsLjk5OTU0LC45OTk3NSwxLjAwMDUxLDEuMDAwMDEsMS4wMDAxOSwxLjAwMDAxLDEuMDAwMSwuOTk5ODYsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMzgsLjk5OTU0LC45OTk1NCwuOTk5NCwxLjAwMDY2LC45OTk5OSwuOTk5NzcsMS4wMDAyMiwxLjAwMDU0LDEuMDAwMDEsLjk5OTc3LDEuMDAwMjYsLjk5OTc1LDEuMDAwMSwxLjAwMDAxLC45OTk5MywuOTk5NSwuOTk5NTUsMS4wMDAxNiwuOTk5NzgsLjk5OTc0LDEuMDAwMTksMS4wMDAyMiwuOTk5NTUsMS4wMDA1MywuOTk5NzMsMS4wMDA4OSwxLjAwMDA1LC45OTk2NywxLjAwMDQ4LC45OTk3MywxLjAwMDAyLDEuMDAwMzQsLjk5OTczLC45OTk3MywuOTk5NjQsMS4wMDAwNiwxLjAwMDY2LC45OTk0NywuOTk5NzMsLjk4ODk0LC45OTk3MywxLC40NDg5OCwxLC45OTk0NiwxLDEuMDAwMzksMS4wMDA4MiwuOTk5OTEsLjk5OTkxLC45OTk4NSwxLjAwMDIyLDEuMDAwMjMsMS4wMDA2MSwxLjAwMDA2LC45OTk2NiwuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDE5LDEuMDAwOCwxLC45OTkyNCwuOTk5MjQsLjk5OTI0LC45OTk4MywxLjAwMDQ0LC45OTk3MywuOTk5NjQsLjk4MzMyLDEsLjk5OTczLDEsMSwuOTk5NjIsLjk5ODk1LDEuMDAwMTYsLjk5OTc3LDEuMDAwMTYsLjk5OTc3LDEuMDAwMTYsLjk5OTc3LDEuMDAwMDEsMSwxLDEsLjk5OTczLDEsMSwuOTk5NTUsLjk5OTI0LC45OTkyNCwuOTk5MjQsLjk5OTI0LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk3MywuOTk5NzMsLjk5OTcyLDEsMSwxLjAwMjY3LC45OTk5OSwuOTk5OTgsLjk5OTk4LDEsLjk5OTk4LDEuNjY0NzUsMSwuOTk5NzMsLjk5OTczLDEuMDAwMjMsLjk5OTczLDEuMDA0MjMsLjk5OTI1LC45OTk5OSwxLC45OTk5MSwuOTk5ODQsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDQ5LDEsMS4wMDI0NSwxLDEsMSwxLC45NjMyOSwxLDEuMjA5ODUsMS4zOTcxMywxLjAwMDAzLC44MjU0LDEuMDAwMTUsMSwxLjAwMDM1LDEuMDAwMjcsMS4wMDAzMSwxLjAwMDMxLDEuMDAwMDMsMS4wMDAzMSwxLjAwMDMxLC45OTk5OSwxLjAwMDAzLC45OTk5OSwuOTk5OTksMS40MTE0NCwxLjYsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQwNTc5LDEuNDA1NzksMS4zNjYyNSwuOTk5OTksMSwuOTk4NjEsLjk5ODYxLDEsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwuOTUzMTcsLjk5OTk5LC45OTk5OSwuOTk5OTksLjk5OTk5LDEuNDA0ODMsMSwuOTk5NzcsMS4wMDA1NCwxLDEsLjk5OTUzLC45OTk2MiwxLjAwMDQyLC45OTk1LDEsMSwxLDEsMSwxLDEsMSwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0LkhlbHZldGljYUl0YWxpY01ldHJpY3M9e2xpbmVIZWlnaHQ6MS4zNSxsaW5lR2FwOi4yfSx0LkhlbHZldGljYVJlZ3VsYXJGYWN0b3JzPVsuNzYxMTYsMSwxLDEuMDAwNiwxLjAwMDYsMS4wMDAwNiwuOTk5NzMsLjk5OTczLC45OTk4MiwxLjAwMDAxLDEuMDAwNDMsLjk5OTk4LC45OTk5OCwuOTk5NTksMS4wMDAwMywxLjAwMDYsLjk5OTk4LDEuMDAwNiwxLjAwMDYsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEuMDAwNiwxLDEuMDAwMDMsMS4wMDAwMywxLjAwMDAzLC45OTk3MywuOTk5ODcsMS4wMDAwMSwxLjAwMDAxLC45OTk3NywuOTk5NzcsMS4wMDAwMSwxLjAwMDI2LDEuMDAwMjIsLjk5OTc3LDEuMDAwNiwxLDEuMDAwMDEsLjk5OTczLC45OTk5OSwuOTk5NzcsMS4wMDAyMiwxLjAwMDAxLDEuMDAwMjIsLjk5OTc3LDEuMDAwMDEsMS4wMDAyNiwuOTk5NzcsMS4wMDAwMSwxLjAwMDE2LDEuMDAwMDEsMS4wMDAwMSwxLjAwMDI2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LC45OTk0OSwuOTk5NzMsLjk5OTk4LC45OTk3MywuOTk5NzMsMSwuOTk5NzMsLjk5OTczLDEuMDAwNiwuOTk5NzMsLjk5OTczLC45OTkyNCwuOTk5MjQsMSwuOTk5MjQsLjk5OTk5LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5OTgsMSwxLjAwMDYsLjk5OTczLDEsLjk5OTc3LDEsMSwxLDEuMDAwMDUsMS4wMDA5LDEuMDAwMDUsMS4wMDAwMywuOTk5OTgsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEuMDAwOSwuOTk5NzMsLjk5OTk4LDEuMDAwMjUsLjk5OTY4LC45OTk3MywxLjAwMDAzLDEuMDAwMjUsLjYwMjk5LDEuMDAwMjQsMS4wNjQwOSwxLDEsLjk5OTk4LDEsLjk5OTgsMS4wMDA2LC45OTk5OCwxLC45OTkzNiwuOTk5NzMsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMS4wMDAyNiwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLC45OTk3NywxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwuOTk5NzcsLjk5OTc3LDEuMDAwMjIsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMjIsMS4wMDAyMiwxLjAwMDAzLDEuMDAwMjIsLjk5OTc3LC45OTk3NywuOTk5NzcsLjk5OTc3LDEuMDAwMDEsMS4wMDAwMSwxLjAwMDI2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk4MiwxLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEuMDY0MDksMS4wMDAyNiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsMSwuOTk5NzMsMSwxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywuOTk5NzcsMSwuOTk5NzcsMSwuOTk5NzcsMSwuOTk5NzcsMSwuOTk5NzcsMS4wNDU5NiwuOTk5NzcsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTI0LDEuMDAwNiwxLjAwMDYsMS4wMDAxOSwxLjAwMDM0LDEsLjk5OTI0LDEuMDAwMDEsMSwxLC45OTk3MywuOTk5MjQsLjk5OTczLC45OTkyNCwuOTk5NzMsMS4wMjU3MiwuOTk5NzMsMS4wMDAwNSwuOTk5NzMsLjk5OTI0LC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk5OSwuOTk5OCwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsMSwxLjAwMDE2LC45OTk3NywuOTk5OTgsLjk5OTc3LC45OTk5OCwuOTk5NzcsLjk5OTk4LDEuMDAwMDEsMSwxLjAwMDAxLDEsMS4wMDAwMSwxLDEuMDAwMDEsMSwxLjAwMDI2LDEuMDAwNiwxLjAwMDI2LC44NDUzMywxLjAwMDI2LDEuMDAwNiwuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywxLjAwMDE2LC45OTk3NywxLjAwMDAxLDEsMS4wMDAwMSwxLjAwMDI2LDEsMS4wMDAyNiwxLDEuMDAwMjYsMSwuOTk5MjQsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEsLjk5OTgyLDEuMDAwMjIsMS4wMDAyNiwxLjAwMDAxLDEsMS4wMDAyNiwxLjAwMDYsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5MjgsMSwuOTk5NzcsMS4wMDAxMywxLjAwMDU1LC45OTk0NywuOTk5NDUsLjk5OTQxLC45OTkyNCwxLjAwMDAxLDEuMDAwMDEsMS4wMDA0LC45MTYyMSwxLjAwMDAxLDEuMDAwMjYsLjk5OTc3LDEuMDAwMjIsMS4wMDA2LDEuMDAwMDEsMS4wMDAwNSwuOTk5OTksLjk5OTc3LDEuMDAwMTUsMS4wMDAyMiwuOTk5NzcsMS4wMDAwMSwuOTk5NzMsMS4wMDAyNiwxLjAwMDAxLDEuMDAwMTksMS4wMDAwMSwuOTk5NDYsMSwxLjAwMDYsMS4wMDAwMSwuOTk5NzgsMS4wMDA0NSwuOTk5NzMsLjk5OTI0LDEuMDAwMjMsLjk5OTc4LC45OTk2NiwxLDEuMDAwNjUsMS4wMDA0NSwxLjAwMDE5LC45OTk3MywuOTk5NzMsLjk5OTI0LDEsMSwuOTY0OTksMSwxLjAwMDU1LC45OTk3MywxLjAwMDA4LDEuMDAwMjcsMSwuOTk5NywuOTk5OTUsMS4wMDAyMywuOTk5MzMsMS4wMDAxOSwxLjAwMDE1LDEuMDAwMzEsLjk5OTI0LDEuMDAwMjMsLjk5OTczLDEuMDAwMjMsMS4wMDAzMSwxLjAwMDAxLC45OTkyOCwxLjAwMDI5LDEuMDAwOTIsMS4wMDAzNSwxLjAwMDAxLDEuMDAwNiwxLjAwMDYsMSwuOTk5ODgsLjk5OTc1LDEsMS4wMDA4MiwuOTk1NjEsLjk5OTYsMS4wMDAzNSwxLjAwMDAxLC45OTk2MiwxLjAwMDAxLDEuMDAwOTIsLjk5OTY0LDEuMDAwMDEsLjk5OTYzLC45OTk5OSwxLjAwMDM1LDEuMDAwMzUsMS4wMDA4MiwuOTk5NjIsLjk5OTk5LC45OTk3NywxLjAwMDIyLDEuMDAwMzUsMS4wMDAwMSwuOTk5NzcsMS4wMDAyNiwuOTk5NiwuOTk5NjcsMS4wMDAwMSwxLjAwMDM0LDEuMDAwNzQsMS4wMDA1NCwxLjAwMDUzLDEuMDAwNjMsLjk5OTcxLC45OTk2MiwxLjAwMDM1LC45OTk3NSwuOTk5NzcsLjk5OTczLDEuMDAwNDMsLjk5OTUzLDEuMDAwNywuOTk5MTUsLjk5OTczLDEuMDAwMDgsLjk5ODkyLDEuMDAwNzMsMS4wMDA3MywxLjAwMTE0LC45OTkxNSwxLjAwMDczLC45OTk1NSwuOTk5NzMsMS4wMDA5MiwuOTk5NzMsMSwuOTk5OTgsMSwxLjAwMDMsMSwxLjAwMDQzLDEuMDAwMDEsLjk5OTY5LDEuMDAwMywxLDEuMDAwMzUsMS4wMDAwMSwuOTk5NSwxLDEuMDAwOTIsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wMDA3LC45OTk1LDEsLjk5OTI0LDEuMDAwNiwuOTk5MjQsLjk5OTcyLDEuMDAwNjIsLjk5OTczLDEuMDAxMTQsMS4wMDA3MywxLC45OTk1NSwxLDEsMS4wMDA0NywuOTk5NjgsMS4wMDAxNiwuOTk5NzcsMS4wMDAxNiwuOTk5NzcsMS4wMDAxNiwuOTk5NzcsMS4wMDAwMSwxLDEsMSwuOTk5NzMsMSwxLC45OTk1NSwuOTk5MjQsLjk5OTI0LC45OTkyNCwuOTk5MjQsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTczLC45OTk3MywuOTk5NzIsMSwxLDEuMDAyNjcsLjk5OTk5LC45OTk5OCwuOTk5OTgsMSwuOTk5OTgsMS42NjQ3NSwxLC45OTk3MywuOTk5NzMsMS4wMDAyMywuOTk5NzMsLjk5OTcxLC45OTkyNSwxLjAwMDIzLDEsLjk5OTkxLC45OTk4NCwxLjAwMDAyLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEsMSwxLDEsMSwxLDEsLjk2MzI5LDEsMS4yMDk4NSwxLjM5NzEzLDEuMDAwMDMsLjgyNTQsMS4wMDAxNSwxLDEuMDAwMzUsMS4wMDAyNywxLjAwMDMxLDEuMDAwMzEsLjk5OTE1LDEuMDAwMzEsMS4wMDAzMSwuOTk5OTksMS4wMDAwMywuOTk5OTksLjk5OTk5LDEuNDExNDQsMS42LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MDU3OSwxLjQwNTc5LDEuMzY2MjUsLjk5OTk5LDEsLjk5ODYxLC45OTg2MSwxLDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsLjk1MzE3LC45OTk5OSwuOTk5OTksLjk5OTk5LC45OTk5OSwxLjQwNDgzLDEsLjk5OTc3LDEuMDAwNTQsMSwxLC45OTk1MywuOTk5NjIsMS4wMDA0MiwuOTk5NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdLHQuSGVsdmV0aWNhUmVndWxhck1ldHJpY3M9e2xpbmVIZWlnaHQ6MS4yLGxpbmVHYXA6LjJ9fSwoZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkxpYmVyYXRpb25TYW5zUmVndWxhcldpZHRocz10LkxpYmVyYXRpb25TYW5zUmVndWxhck1hcHBpbmc9dC5MaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocz10LkxpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZz10LkxpYmVyYXRpb25TYW5zQm9sZFdpZHRocz10LkxpYmVyYXRpb25TYW5zQm9sZE1hcHBpbmc9dC5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHM9dC5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNNYXBwaW5nPXZvaWQgMCx0LkxpYmVyYXRpb25TYW5zQm9sZFdpZHRocz1bMzY1LDAsMzMzLDI3OCwzMzMsNDc0LDU1Niw1NTYsODg5LDcyMiwyMzgsMzMzLDMzMywzODksNTg0LDI3OCwzMzMsMjc4LDI3OCw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsMzMzLDMzMyw1ODQsNTg0LDU4NCw2MTEsOTc1LDcyMiw3MjIsNzIyLDcyMiw2NjcsNjExLDc3OCw3MjIsMjc4LDU1Niw3MjIsNjExLDgzMyw3MjIsNzc4LDY2Nyw3NzgsNzIyLDY2Nyw2MTEsNzIyLDY2Nyw5NDQsNjY3LDY2Nyw2MTEsMzMzLDI3OCwzMzMsNTg0LDU1NiwzMzMsNTU2LDYxMSw1NTYsNjExLDU1NiwzMzMsNjExLDYxMSwyNzgsMjc4LDU1NiwyNzgsODg5LDYxMSw2MTEsNjExLDYxMSwzODksNTU2LDMzMyw2MTEsNTU2LDc3OCw1NTYsNTU2LDUwMCwzODksMjgwLDM4OSw1ODQsMzMzLDU1Niw1NTYsNTU2LDU1NiwyODAsNTU2LDMzMyw3MzcsMzcwLDU1Niw1ODQsNzM3LDU1Miw0MDAsNTQ5LDMzMywzMzMsMzMzLDU3Niw1NTYsMjc4LDMzMywzMzMsMzY1LDU1Niw4MzQsODM0LDgzNCw2MTEsNzIyLDcyMiw3MjIsNzIyLDcyMiw3MjIsMWUzLDcyMiw2NjcsNjY3LDY2Nyw2NjcsMjc4LDI3OCwyNzgsMjc4LDcyMiw3MjIsNzc4LDc3OCw3NzgsNzc4LDc3OCw1ODQsNzc4LDcyMiw3MjIsNzIyLDcyMiw2NjcsNjY3LDYxMSw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw4ODksNTU2LDU1Niw1NTYsNTU2LDU1NiwyNzgsMjc4LDI3OCwyNzgsNjExLDYxMSw2MTEsNjExLDYxMSw2MTEsNjExLDU0OSw2MTEsNjExLDYxMSw2MTEsNjExLDU1Niw2MTEsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDcxOSw3MjIsNjExLDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw3NzgsNjExLDc3OCw2MTEsNzc4LDYxMSw3NzgsNjExLDcyMiw2MTEsNzIyLDYxMSwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsNzg1LDU1Niw1NTYsMjc4LDcyMiw1NTYsNTU2LDYxMSwyNzgsNjExLDI3OCw2MTEsMzg1LDYxMSw0NzksNjExLDI3OCw3MjIsNjExLDcyMiw2MTEsNzIyLDYxMSw3MDgsNzIzLDYxMSw3NzgsNjExLDc3OCw2MTEsNzc4LDYxMSwxZTMsOTQ0LDcyMiwzODksNzIyLDM4OSw3MjIsMzg5LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjExLDMzMyw2MTEsNDc5LDYxMSwzMzMsNzIyLDYxMSw3MjIsNjExLDcyMiw2MTEsNzIyLDYxMSw3MjIsNjExLDcyMiw2MTEsOTQ0LDc3OCw2NjcsNTU2LDY2Nyw2MTEsNTAwLDYxMSw1MDAsNjExLDUwMCwyNzgsNTU2LDcyMiw1NTYsMWUzLDg4OSw3NzgsNjExLDY2Nyw1NTYsNjExLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsNDY1LDcyMiwzMzMsODUzLDkwNiw0NzQsODI1LDkyNyw4MzgsMjc4LDcyMiw3MjIsNjAxLDcxOSw2NjcsNjExLDcyMiw3NzgsMjc4LDcyMiw2NjcsODMzLDcyMiw2NDQsNzc4LDcyMiw2NjcsNjAwLDYxMSw2NjcsODIxLDY2Nyw4MDksODAyLDI3OCw2NjcsNjE1LDQ1MSw2MTEsMjc4LDU4Miw2MTUsNjEwLDU1Niw2MDYsNDc1LDQ2MCw2MTEsNTQxLDI3OCw1NTgsNTU2LDYxMiw1NTYsNDQ1LDYxMSw3NjYsNjE5LDUyMCw2ODQsNDQ2LDU4Miw3MTUsNTc2LDc1Myw4NDUsMjc4LDU4Miw2MTEsNTgyLDg0NSw2NjcsNjY5LDg4NSw1NjcsNzExLDY2NywyNzgsMjc2LDU1NiwxMDk0LDEwNjIsODc1LDYxMCw3MjIsNjIyLDcxOSw3MjIsNzE5LDcyMiw1NjcsNzEyLDY2Nyw5MDQsNjI2LDcxOSw3MTksNjEwLDcwMiw4MzMsNzIyLDc3OCw3MTksNjY3LDcyMiw2MTEsNjIyLDg1NCw2NjcsNzMwLDcwMywxMDA1LDEwMTksODcwLDk3OSw3MTksNzExLDEwMzEsNzE5LDU1Niw2MTgsNjE1LDQxNyw2MzUsNTU2LDcwOSw0OTcsNjE1LDYxNSw1MDAsNjM1LDc0MCw2MDQsNjExLDYwNCw2MTEsNTU2LDQ5MCw1NTYsODc1LDU1Niw2MTUsNTgxLDgzMyw4NDQsNzI5LDg1NCw2MTUsNTUyLDg1NCw1ODMsNTU2LDU1Niw2MTEsNDE3LDU1Miw1NTYsMjc4LDI4MSwyNzgsOTY5LDkwNiw2MTEsNTAwLDYxNSw1NTYsNjA0LDc3OCw2MTEsNDg3LDQ0Nyw5NDQsNzc4LDk0NCw3NzgsOTQ0LDc3OCw2NjcsNTU2LDMzMywzMzMsNTU2LDFlMywxZTMsNTUyLDI3OCwyNzgsMjc4LDI3OCw1MDAsNTAwLDUwMCw1NTYsNTU2LDM1MCwxZTMsMWUzLDI0MCw0NzksMzMzLDMzMyw2MDQsMzMzLDE2NywzOTYsNTU2LDU1NiwxMDk0LDU1Niw4ODUsNDg5LDExMTUsMWUzLDc2OCw2MDAsODM0LDgzNCw4MzQsODM0LDFlMyw1MDAsMWUzLDUwMCwxZTMsNTAwLDUwMCw0OTQsNjEyLDgyMyw3MTMsNTg0LDU0OSw3MTMsOTc5LDcyMiwyNzQsNTQ5LDU0OSw1ODMsNTQ5LDU0OSw2MDQsNTg0LDYwNCw2MDQsNzA4LDYyNSw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MjksNjA0LDYwNCwzNTQsMzU0LDFlMyw5OTAsOTkwLDk5MCw5OTAsNDk0LDYwNCw2MDQsNjA0LDYwNCwzNTQsMTAyMSwxMDUyLDkxNyw3NTAsNzUwLDUzMSw2NTYsNTk0LDUxMCw1MDAsNzUwLDc1MCw2MTEsNjExLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMjIyLDIyMiwzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzXSx0LkxpYmVyYXRpb25TYW5zQm9sZE1hcHBpbmc9Wy0xLC0xLC0xLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMjU0LDI1NSwyNTYsMjU3LDI1OCwyNTksMjYwLDI2MSwyNjIsMjYzLDI2NCwyNjUsMjY2LDI2NywyNjgsMjY5LDI3MCwyNzEsMjcyLDI3MywyNzQsMjc1LDI3NiwyNzcsMjc4LDI3OSwyODAsMjgxLDI4MiwyODMsMjg0LDI4NSwyODYsMjg3LDI4OCwyODksMjkwLDI5MSwyOTIsMjkzLDI5NCwyOTUsMjk2LDI5NywyOTgsMjk5LDMwMCwzMDEsMzAyLDMwMywzMDQsMzA1LDMwNiwzMDcsMzA4LDMwOSwzMTAsMzExLDMxMiwzMTMsMzE0LDMxNSwzMTYsMzE3LDMxOCwzMTksMzIwLDMyMSwzMjIsMzIzLDMyNCwzMjUsMzI2LDMyNywzMjgsMzI5LDMzMCwzMzEsMzMyLDMzMywzMzQsMzM1LDMzNiwzMzcsMzM4LDMzOSwzNDAsMzQxLDM0MiwzNDMsMzQ0LDM0NSwzNDYsMzQ3LDM0OCwzNDksMzUwLDM1MSwzNTIsMzUzLDM1NCwzNTUsMzU2LDM1NywzNTgsMzU5LDM2MCwzNjEsMzYyLDM2MywzNjQsMzY1LDM2NiwzNjcsMzY4LDM2OSwzNzAsMzcxLDM3MiwzNzMsMzc0LDM3NSwzNzYsMzc3LDM3OCwzNzksMzgwLDM4MSwzODIsMzgzLDQwMiw1MDYsNTA3LDUwOCw1MDksNTEwLDUxMSw1MzYsNTM3LDUzOCw1MzksNzEwLDcxMSw3MTMsNzI4LDcyOSw3MzAsNzMxLDczMiw3MzMsOTAwLDkwMSw5MDIsOTAzLDkwNCw5MDUsOTA2LDkwOCw5MTAsOTExLDkxMiw5MTMsOTE0LDkxNSw5MTYsOTE3LDkxOCw5MTksOTIwLDkyMSw5MjIsOTIzLDkyNCw5MjUsOTI2LDkyNyw5MjgsOTI5LDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyw5MzgsOTM5LDk0MCw5NDEsOTQyLDk0Myw5NDQsOTQ1LDk0Niw5NDcsOTQ4LDk0OSw5NTAsOTUxLDk1Miw5NTMsOTU0LDk1NSw5NTYsOTU3LDk1OCw5NTksOTYwLDk2MSw5NjIsOTYzLDk2NCw5NjUsOTY2LDk2Nyw5NjgsOTY5LDk3MCw5NzEsOTcyLDk3Myw5NzQsMTAyNCwxMDI1LDEwMjYsMTAyNywxMDI4LDEwMjksMTAzMCwxMDMxLDEwMzIsMTAzMywxMDM0LDEwMzUsMTAzNiwxMDM3LDEwMzgsMTAzOSwxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTA3OCwxMDc5LDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4NywxMDg4LDEwODksMTA5MCwxMDkxLDEwOTIsMTA5MywxMDk0LDEwOTUsMTA5NiwxMDk3LDEwOTgsMTA5OSwxMTAwLDExMDEsMTEwMiwxMTAzLDExMDQsMTEwNSwxMTA2LDExMDcsMTEwOCwxMTA5LDExMTAsMTExMSwxMTEyLDExMTMsMTExNCwxMTE1LDExMTYsMTExNywxMTE4LDExMTksMTEzOCwxMTM5LDExNjgsMTE2OSw3ODA4LDc4MDksNzgxMCw3ODExLDc4MTIsNzgxMyw3OTIyLDc5MjMsODIwOCw4MjA5LDgyMTEsODIxMiw4MjEzLDgyMTUsODIxNiw4MjE3LDgyMTgsODIxOSw4MjIwLDgyMjEsODIyMiw4MjI0LDgyMjUsODIyNiw4MjMwLDgyNDAsODI0Miw4MjQzLDgyNDksODI1MCw4MjUyLDgyNTQsODI2MCw4MzE5LDgzNTUsODM1Niw4MzU5LDgzNjQsODQ1Myw4NDY3LDg0NzAsODQ4Miw4NDg2LDg0OTQsODUzOSw4NTQwLDg1NDEsODU0Miw4NTkyLDg1OTMsODU5NCw4NTk1LDg1OTYsODU5Nyw4NjE2LDg3MDYsODcxMCw4NzE5LDg3MjEsODcyMiw4NzMwLDg3MzQsODczNSw4NzQ1LDg3NDcsODc3Niw4ODAwLDg4MDEsODgwNCw4ODA1LDg5NjIsODk3Niw4OTkyLDg5OTMsOTQ3Miw5NDc0LDk0ODQsOTQ4OCw5NDkyLDk0OTYsOTUwMCw5NTA4LDk1MTYsOTUyNCw5NTMyLDk1NTIsOTU1Myw5NTU0LDk1NTUsOTU1Niw5NTU3LDk1NTgsOTU1OSw5NTYwLDk1NjEsOTU2Miw5NTYzLDk1NjQsOTU2NSw5NTY2LDk1NjcsOTU2OCw5NTY5LDk1NzAsOTU3MSw5NTcyLDk1NzMsOTU3NCw5NTc1LDk1NzYsOTU3Nyw5NTc4LDk1NzksOTU4MCw5NjAwLDk2MDQsOTYwOCw5NjEyLDk2MTYsOTYxNyw5NjE4LDk2MTksOTYzMiw5NjMzLDk2NDIsOTY0Myw5NjQ0LDk2NTAsOTY1OCw5NjYwLDk2NjgsOTY3NCw5Njc1LDk2NzksOTY4OCw5Njg5LDk3MDIsOTc4Niw5Nzg3LDk3ODgsOTc5Miw5Nzk0LDk4MjQsOTgyNyw5ODI5LDk4MzAsOTgzNCw5ODM1LDk4MzYsNjE0NDEsNjE0NDIsNjE0NDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTFdLHQuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzPVszNjUsMCwzMzMsMjc4LDMzMyw0NzQsNTU2LDU1Niw4ODksNzIyLDIzOCwzMzMsMzMzLDM4OSw1ODQsMjc4LDMzMywyNzgsMjc4LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1NiwzMzMsMzMzLDU4NCw1ODQsNTg0LDYxMSw5NzUsNzIyLDcyMiw3MjIsNzIyLDY2Nyw2MTEsNzc4LDcyMiwyNzgsNTU2LDcyMiw2MTEsODMzLDcyMiw3NzgsNjY3LDc3OCw3MjIsNjY3LDYxMSw3MjIsNjY3LDk0NCw2NjcsNjY3LDYxMSwzMzMsMjc4LDMzMyw1ODQsNTU2LDMzMyw1NTYsNjExLDU1Niw2MTEsNTU2LDMzMyw2MTEsNjExLDI3OCwyNzgsNTU2LDI3OCw4ODksNjExLDYxMSw2MTEsNjExLDM4OSw1NTYsMzMzLDYxMSw1NTYsNzc4LDU1Niw1NTYsNTAwLDM4OSwyODAsMzg5LDU4NCwzMzMsNTU2LDU1Niw1NTYsNTU2LDI4MCw1NTYsMzMzLDczNywzNzAsNTU2LDU4NCw3MzcsNTUyLDQwMCw1NDksMzMzLDMzMywzMzMsNTc2LDU1NiwyNzgsMzMzLDMzMywzNjUsNTU2LDgzNCw4MzQsODM0LDYxMSw3MjIsNzIyLDcyMiw3MjIsNzIyLDcyMiwxZTMsNzIyLDY2Nyw2NjcsNjY3LDY2NywyNzgsMjc4LDI3OCwyNzgsNzIyLDcyMiw3NzgsNzc4LDc3OCw3NzgsNzc4LDU4NCw3NzgsNzIyLDcyMiw3MjIsNzIyLDY2Nyw2NjcsNjExLDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDg4OSw1NTYsNTU2LDU1Niw1NTYsNTU2LDI3OCwyNzgsMjc4LDI3OCw2MTEsNjExLDYxMSw2MTEsNjExLDYxMSw2MTEsNTQ5LDYxMSw2MTEsNjExLDYxMSw2MTEsNTU2LDYxMSw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNzQwLDcyMiw2MTEsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDc3OCw2MTEsNzc4LDYxMSw3NzgsNjExLDc3OCw2MTEsNzIyLDYxMSw3MjIsNjExLDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCw3ODIsNTU2LDU1NiwyNzgsNzIyLDU1Niw1NTYsNjExLDI3OCw2MTEsMjc4LDYxMSwzOTYsNjExLDQ3OSw2MTEsMjc4LDcyMiw2MTEsNzIyLDYxMSw3MjIsNjExLDcwOCw3MjMsNjExLDc3OCw2MTEsNzc4LDYxMSw3NzgsNjExLDFlMyw5NDQsNzIyLDM4OSw3MjIsMzg5LDcyMiwzODksNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2MTEsMzMzLDYxMSw0NzksNjExLDMzMyw3MjIsNjExLDcyMiw2MTEsNzIyLDYxMSw3MjIsNjExLDcyMiw2MTEsNzIyLDYxMSw5NDQsNzc4LDY2Nyw1NTYsNjY3LDYxMSw1MDAsNjExLDUwMCw2MTEsNTAwLDI3OCw1NTYsNzIyLDU1NiwxZTMsODg5LDc3OCw2MTEsNjY3LDU1Niw2MTEsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsNzIyLDMzMyw4NTQsOTA2LDQ3Myw4NDQsOTMwLDg0NywyNzgsNzIyLDcyMiw2MTAsNjcxLDY2Nyw2MTEsNzIyLDc3OCwyNzgsNzIyLDY2Nyw4MzMsNzIyLDY1Nyw3NzgsNzE4LDY2Nyw1OTAsNjExLDY2Nyw4MjIsNjY3LDgyOSw3ODEsMjc4LDY2Nyw2MjAsNDc5LDYxMSwyNzgsNTkxLDYyMCw2MjEsNTU2LDYxMCw0NzksNDkyLDYxMSw1NTgsMjc4LDU2Niw1NTYsNjAzLDU1Niw0NTAsNjExLDcxMiw2MDUsNTMyLDY2NCw0MDksNTkxLDcwNCw1NzgsNzczLDgzNCwyNzgsNTkxLDYxMSw1OTEsODM0LDY2Nyw2NjcsODg2LDYxNCw3MTksNjY3LDI3OCwyNzgsNTU2LDEwOTQsMTA0Miw4NTQsNjIyLDcxOSw2NzcsNzE5LDcyMiw3MDgsNzIyLDYxNCw3MjIsNjY3LDkyNyw2NDMsNzE5LDcxOSw2MTUsNjg3LDgzMyw3MjIsNzc4LDcxOSw2NjcsNzIyLDYxMSw2NzcsNzgxLDY2Nyw3MjksNzA4LDk3OSw5ODksODU0LDFlMyw3MDgsNzE5LDEwNDIsNzI5LDU1Niw2MTksNjA0LDUzNCw2MTgsNTU2LDczNiw1MTAsNjExLDYxMSw1MDcsNjIyLDc0MCw2MDQsNjExLDYxMSw2MTEsNTU2LDg4OSw1NTYsODg1LDU1Niw2NDYsNTgzLDg4OSw5MzUsNzA3LDg1NCw1OTQsNTUyLDg2NSw1ODksNTU2LDU1Niw2MTEsNDY5LDU2Myw1NTYsMjc4LDI3OCwyNzgsOTY5LDkwNiw2MTEsNTA3LDYxOSw1NTYsNjExLDc3OCw2MTEsNTc1LDQ2Nyw5NDQsNzc4LDk0NCw3NzgsOTQ0LDc3OCw2NjcsNTU2LDMzMywzMzMsNTU2LDFlMywxZTMsNTUyLDI3OCwyNzgsMjc4LDI3OCw1MDAsNTAwLDUwMCw1NTYsNTU2LDM1MCwxZTMsMWUzLDI0MCw0NzksMzMzLDMzMyw2MDQsMzMzLDE2NywzOTYsNTU2LDU1NiwxMTA0LDU1Niw4ODUsNTE2LDExNDYsMWUzLDc2OCw2MDAsODM0LDgzNCw4MzQsODM0LDk5OSw1MDAsMWUzLDUwMCwxZTMsNTAwLDUwMCw0OTQsNjEyLDgyMyw3MTMsNTg0LDU0OSw3MTMsOTc5LDcyMiwyNzQsNTQ5LDU0OSw1ODMsNTQ5LDU0OSw2MDQsNTg0LDYwNCw2MDQsNzA4LDYyNSw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MjksNjA0LDYwNCwzNTQsMzU0LDFlMyw5OTAsOTkwLDk5MCw5OTAsNDk0LDYwNCw2MDQsNjA0LDYwNCwzNTQsMTAyMSwxMDUyLDkxNyw3NTAsNzUwLDUzMSw2NTYsNTk0LDUxMCw1MDAsNzUwLDc1MCw2MTEsNjExLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMjIyLDIyMiwzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzXSx0LkxpYmVyYXRpb25TYW5zQm9sZEl0YWxpY01hcHBpbmc9Wy0xLC0xLC0xLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMjU0LDI1NSwyNTYsMjU3LDI1OCwyNTksMjYwLDI2MSwyNjIsMjYzLDI2NCwyNjUsMjY2LDI2NywyNjgsMjY5LDI3MCwyNzEsMjcyLDI3MywyNzQsMjc1LDI3NiwyNzcsMjc4LDI3OSwyODAsMjgxLDI4MiwyODMsMjg0LDI4NSwyODYsMjg3LDI4OCwyODksMjkwLDI5MSwyOTIsMjkzLDI5NCwyOTUsMjk2LDI5NywyOTgsMjk5LDMwMCwzMDEsMzAyLDMwMywzMDQsMzA1LDMwNiwzMDcsMzA4LDMwOSwzMTAsMzExLDMxMiwzMTMsMzE0LDMxNSwzMTYsMzE3LDMxOCwzMTksMzIwLDMyMSwzMjIsMzIzLDMyNCwzMjUsMzI2LDMyNywzMjgsMzI5LDMzMCwzMzEsMzMyLDMzMywzMzQsMzM1LDMzNiwzMzcsMzM4LDMzOSwzNDAsMzQxLDM0MiwzNDMsMzQ0LDM0NSwzNDYsMzQ3LDM0OCwzNDksMzUwLDM1MSwzNTIsMzUzLDM1NCwzNTUsMzU2LDM1NywzNTgsMzU5LDM2MCwzNjEsMzYyLDM2MywzNjQsMzY1LDM2NiwzNjcsMzY4LDM2OSwzNzAsMzcxLDM3MiwzNzMsMzc0LDM3NSwzNzYsMzc3LDM3OCwzNzksMzgwLDM4MSwzODIsMzgzLDQwMiw1MDYsNTA3LDUwOCw1MDksNTEwLDUxMSw1MzYsNTM3LDUzOCw1MzksNzEwLDcxMSw3MTMsNzI4LDcyOSw3MzAsNzMxLDczMiw3MzMsOTAwLDkwMSw5MDIsOTAzLDkwNCw5MDUsOTA2LDkwOCw5MTAsOTExLDkxMiw5MTMsOTE0LDkxNSw5MTYsOTE3LDkxOCw5MTksOTIwLDkyMSw5MjIsOTIzLDkyNCw5MjUsOTI2LDkyNyw5MjgsOTI5LDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyw5MzgsOTM5LDk0MCw5NDEsOTQyLDk0Myw5NDQsOTQ1LDk0Niw5NDcsOTQ4LDk0OSw5NTAsOTUxLDk1Miw5NTMsOTU0LDk1NSw5NTYsOTU3LDk1OCw5NTksOTYwLDk2MSw5NjIsOTYzLDk2NCw5NjUsOTY2LDk2Nyw5NjgsOTY5LDk3MCw5NzEsOTcyLDk3Myw5NzQsMTAyNCwxMDI1LDEwMjYsMTAyNywxMDI4LDEwMjksMTAzMCwxMDMxLDEwMzIsMTAzMywxMDM0LDEwMzUsMTAzNiwxMDM3LDEwMzgsMTAzOSwxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTA3OCwxMDc5LDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4NywxMDg4LDEwODksMTA5MCwxMDkxLDEwOTIsMTA5MywxMDk0LDEwOTUsMTA5NiwxMDk3LDEwOTgsMTA5OSwxMTAwLDExMDEsMTEwMiwxMTAzLDExMDQsMTEwNSwxMTA2LDExMDcsMTEwOCwxMTA5LDExMTAsMTExMSwxMTEyLDExMTMsMTExNCwxMTE1LDExMTYsMTExNywxMTE4LDExMTksMTEzOCwxMTM5LDExNjgsMTE2OSw3ODA4LDc4MDksNzgxMCw3ODExLDc4MTIsNzgxMyw3OTIyLDc5MjMsODIwOCw4MjA5LDgyMTEsODIxMiw4MjEzLDgyMTUsODIxNiw4MjE3LDgyMTgsODIxOSw4MjIwLDgyMjEsODIyMiw4MjI0LDgyMjUsODIyNiw4MjMwLDgyNDAsODI0Miw4MjQzLDgyNDksODI1MCw4MjUyLDgyNTQsODI2MCw4MzE5LDgzNTUsODM1Niw4MzU5LDgzNjQsODQ1Myw4NDY3LDg0NzAsODQ4Miw4NDg2LDg0OTQsODUzOSw4NTQwLDg1NDEsODU0Miw4NTkyLDg1OTMsODU5NCw4NTk1LDg1OTYsODU5Nyw4NjE2LDg3MDYsODcxMCw4NzE5LDg3MjEsODcyMiw4NzMwLDg3MzQsODczNSw4NzQ1LDg3NDcsODc3Niw4ODAwLDg4MDEsODgwNCw4ODA1LDg5NjIsODk3Niw4OTkyLDg5OTMsOTQ3Miw5NDc0LDk0ODQsOTQ4OCw5NDkyLDk0OTYsOTUwMCw5NTA4LDk1MTYsOTUyNCw5NTMyLDk1NTIsOTU1Myw5NTU0LDk1NTUsOTU1Niw5NTU3LDk1NTgsOTU1OSw5NTYwLDk1NjEsOTU2Miw5NTYzLDk1NjQsOTU2NSw5NTY2LDk1NjcsOTU2OCw5NTY5LDk1NzAsOTU3MSw5NTcyLDk1NzMsOTU3NCw5NTc1LDk1NzYsOTU3Nyw5NTc4LDk1NzksOTU4MCw5NjAwLDk2MDQsOTYwOCw5NjEyLDk2MTYsOTYxNyw5NjE4LDk2MTksOTYzMiw5NjMzLDk2NDIsOTY0Myw5NjQ0LDk2NTAsOTY1OCw5NjYwLDk2NjgsOTY3NCw5Njc1LDk2NzksOTY4OCw5Njg5LDk3MDIsOTc4Niw5Nzg3LDk3ODgsOTc5Miw5Nzk0LDk4MjQsOTgyNyw5ODI5LDk4MzAsOTgzNCw5ODM1LDk4MzYsNjE0NDEsNjE0NDIsNjE0NDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTFdLHQuTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHM9WzM2NSwwLDMzMywyNzgsMjc4LDM1NSw1NTYsNTU2LDg4OSw2NjcsMTkxLDMzMywzMzMsMzg5LDU4NCwyNzgsMzMzLDI3OCwyNzgsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDI3OCwyNzgsNTg0LDU4NCw1ODQsNTU2LDEwMTUsNjY3LDY2Nyw3MjIsNzIyLDY2Nyw2MTEsNzc4LDcyMiwyNzgsNTAwLDY2Nyw1NTYsODMzLDcyMiw3NzgsNjY3LDc3OCw3MjIsNjY3LDYxMSw3MjIsNjY3LDk0NCw2NjcsNjY3LDYxMSwyNzgsMjc4LDI3OCw0NjksNTU2LDMzMyw1NTYsNTU2LDUwMCw1NTYsNTU2LDI3OCw1NTYsNTU2LDIyMiwyMjIsNTAwLDIyMiw4MzMsNTU2LDU1Niw1NTYsNTU2LDMzMyw1MDAsMjc4LDU1Niw1MDAsNzIyLDUwMCw1MDAsNTAwLDMzNCwyNjAsMzM0LDU4NCwzMzMsNTU2LDU1Niw1NTYsNTU2LDI2MCw1NTYsMzMzLDczNywzNzAsNTU2LDU4NCw3MzcsNTUyLDQwMCw1NDksMzMzLDMzMywzMzMsNTc2LDUzNywyNzgsMzMzLDMzMywzNjUsNTU2LDgzNCw4MzQsODM0LDYxMSw2NjcsNjY3LDY2Nyw2NjcsNjY3LDY2NywxZTMsNzIyLDY2Nyw2NjcsNjY3LDY2NywyNzgsMjc4LDI3OCwyNzgsNzIyLDcyMiw3NzgsNzc4LDc3OCw3NzgsNzc4LDU4NCw3NzgsNzIyLDcyMiw3MjIsNzIyLDY2Nyw2NjcsNjExLDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDg4OSw1MDAsNTU2LDU1Niw1NTYsNTU2LDI3OCwyNzgsMjc4LDI3OCw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTQ5LDYxMSw1NTYsNTU2LDU1Niw1NTYsNTAwLDU1Niw1MDAsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNzIyLDUwMCw3MjIsNTAwLDcyMiw1MDAsNzIyLDUwMCw3MjIsNjI1LDcyMiw1NTYsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDc3OCw1NTYsNzc4LDU1Niw3NzgsNTU2LDc3OCw1NTYsNzIyLDU1Niw3MjIsNTU2LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyMjIsMjc4LDI3OCw3MzMsNDQ0LDUwMCwyMjIsNjY3LDUwMCw1MDAsNTU2LDIyMiw1NTYsMjIyLDU1NiwyODEsNTU2LDQwMCw1NTYsMjIyLDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDYxNSw3MjMsNTU2LDc3OCw1NTYsNzc4LDU1Niw3NzgsNTU2LDFlMyw5NDQsNzIyLDMzMyw3MjIsMzMzLDcyMiwzMzMsNjY3LDUwMCw2NjcsNTAwLDY2Nyw1MDAsNjY3LDUwMCw2MTEsMjc4LDYxMSwzNTQsNjExLDI3OCw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw5NDQsNzIyLDY2Nyw1MDAsNjY3LDYxMSw1MDAsNjExLDUwMCw2MTEsNTAwLDIyMiw1NTYsNjY3LDU1NiwxZTMsODg5LDc3OCw2MTEsNjY3LDUwMCw2MTEsMjc4LDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsNjY3LDI3OCw3ODksODQ2LDM4OSw3OTQsODY1LDc3NSwyMjIsNjY3LDY2Nyw1NzAsNjcxLDY2Nyw2MTEsNzIyLDc3OCwyNzgsNjY3LDY2Nyw4MzMsNzIyLDY0OCw3NzgsNzI1LDY2Nyw2MDAsNjExLDY2Nyw4MzcsNjY3LDgzMSw3NjEsMjc4LDY2Nyw1NzAsNDM5LDU1NSwyMjIsNTUwLDU3MCw1NzEsNTAwLDU1Niw0MzksNDYzLDU1NSw1NDIsMjIyLDUwMCw0OTIsNTQ4LDUwMCw0NDcsNTU2LDY3MCw1NzMsNDg2LDYwMywzNzQsNTUwLDY1Miw1NDYsNzI4LDc3OSwyMjIsNTUwLDU1Niw1NTAsNzc5LDY2Nyw2NjcsODQzLDU0NCw3MDgsNjY3LDI3OCwyNzgsNTAwLDEwNjYsOTgyLDg0NCw1ODksNzE1LDYzOSw3MjQsNjY3LDY1MSw2NjcsNTQ0LDcwNCw2NjcsOTE3LDYxNCw3MTUsNzE1LDU4OSw2ODYsODMzLDcyMiw3NzgsNzI1LDY2Nyw3MjIsNjExLDYzOSw3OTUsNjY3LDcyNyw2NzMsOTIwLDkyMyw4MDUsODg2LDY1MSw2OTQsMTAyMiw2ODIsNTU2LDU2Miw1MjIsNDkzLDU1Myw1NTYsNjg4LDQ2NSw1NTYsNTU2LDQ3Miw1NjQsNjg2LDU1MCw1NTYsNTU2LDU1Niw1MDAsODMzLDUwMCw4MzUsNTAwLDU3Miw1MTgsODMwLDg1MSw2MjEsNzM2LDUyNiw0OTIsNzUyLDUzNCw1NTYsNTU2LDU1NiwzNzgsNDk2LDUwMCwyMjIsMjIyLDIyMiw5MTAsODI4LDU1Niw0NzIsNTY1LDUwMCw1NTYsNzc4LDU1Niw0OTIsMzM5LDk0NCw3MjIsOTQ0LDcyMiw5NDQsNzIyLDY2Nyw1MDAsMzMzLDMzMyw1NTYsMWUzLDFlMyw1NTIsMjIyLDIyMiwyMjIsMjIyLDMzMywzMzMsMzMzLDU1Niw1NTYsMzUwLDFlMywxZTMsMTg4LDM1NCwzMzMsMzMzLDUwMCwzMzMsMTY3LDM2NSw1NTYsNTU2LDEwOTQsNTU2LDg4NSwzMjMsMTA4MywxZTMsNzY4LDYwMCw4MzQsODM0LDgzNCw4MzQsMWUzLDUwMCw5OTgsNTAwLDFlMyw1MDAsNTAwLDQ5NCw2MTIsODIzLDcxMyw1ODQsNTQ5LDcxMyw5NzksNzE5LDI3NCw1NDksNTQ5LDU4NCw1NDksNTQ5LDYwNCw1ODQsNjA0LDYwNCw3MDgsNjI1LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcyOSw2MDQsNjA0LDM1NCwzNTQsMWUzLDk5MCw5OTAsOTkwLDk5MCw0OTQsNjA0LDYwNCw2MDQsNjA0LDM1NCwxMDIxLDEwNTIsOTE3LDc1MCw3NTAsNTMxLDY1Niw1OTQsNTEwLDUwMCw3NTAsNzUwLDUwMCw1MDAsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywyMjIsMjIyLDI5NCwyOTQsMzI0LDMyNCwzMTYsMzI4LDM5OCwyODVdLHQuTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nPVstMSwtMSwtMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5NSw5Niw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTA3LDEwOCwxMDksMTEwLDExMSwxMTIsMTEzLDExNCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDEyMywxMjQsMTI1LDEyNiwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLDE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLDI1NCwyNTUsMjU2LDI1NywyNTgsMjU5LDI2MCwyNjEsMjYyLDI2MywyNjQsMjY1LDI2NiwyNjcsMjY4LDI2OSwyNzAsMjcxLDI3MiwyNzMsMjc0LDI3NSwyNzYsMjc3LDI3OCwyNzksMjgwLDI4MSwyODIsMjgzLDI4NCwyODUsMjg2LDI4NywyODgsMjg5LDI5MCwyOTEsMjkyLDI5MywyOTQsMjk1LDI5NiwyOTcsMjk4LDI5OSwzMDAsMzAxLDMwMiwzMDMsMzA0LDMwNSwzMDYsMzA3LDMwOCwzMDksMzEwLDMxMSwzMTIsMzEzLDMxNCwzMTUsMzE2LDMxNywzMTgsMzE5LDMyMCwzMjEsMzIyLDMyMywzMjQsMzI1LDMyNiwzMjcsMzI4LDMyOSwzMzAsMzMxLDMzMiwzMzMsMzM0LDMzNSwzMzYsMzM3LDMzOCwzMzksMzQwLDM0MSwzNDIsMzQzLDM0NCwzNDUsMzQ2LDM0NywzNDgsMzQ5LDM1MCwzNTEsMzUyLDM1MywzNTQsMzU1LDM1NiwzNTcsMzU4LDM1OSwzNjAsMzYxLDM2MiwzNjMsMzY0LDM2NSwzNjYsMzY3LDM2OCwzNjksMzcwLDM3MSwzNzIsMzczLDM3NCwzNzUsMzc2LDM3NywzNzgsMzc5LDM4MCwzODEsMzgyLDM4Myw0MDIsNTA2LDUwNyw1MDgsNTA5LDUxMCw1MTEsNTM2LDUzNyw1MzgsNTM5LDcxMCw3MTEsNzEzLDcyOCw3MjksNzMwLDczMSw3MzIsNzMzLDkwMCw5MDEsOTAyLDkwMyw5MDQsOTA1LDkwNiw5MDgsOTEwLDkxMSw5MTIsOTEzLDkxNCw5MTUsOTE2LDkxNyw5MTgsOTE5LDkyMCw5MjEsOTIyLDkyMyw5MjQsOTI1LDkyNiw5MjcsOTI4LDkyOSw5MzEsOTMyLDkzMyw5MzQsOTM1LDkzNiw5MzcsOTM4LDkzOSw5NDAsOTQxLDk0Miw5NDMsOTQ0LDk0NSw5NDYsOTQ3LDk0OCw5NDksOTUwLDk1MSw5NTIsOTUzLDk1NCw5NTUsOTU2LDk1Nyw5NTgsOTU5LDk2MCw5NjEsOTYyLDk2Myw5NjQsOTY1LDk2Niw5NjcsOTY4LDk2OSw5NzAsOTcxLDk3Miw5NzMsOTc0LDEwMjQsMTAyNSwxMDI2LDEwMjcsMTAyOCwxMDI5LDEwMzAsMTAzMSwxMDMyLDEwMzMsMTAzNCwxMDM1LDEwMzYsMTAzNywxMDM4LDEwMzksMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTA0NiwxMDQ3LDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNjAsMTA2MSwxMDYyLDEwNjMsMTA2NCwxMDY1LDEwNjYsMTA2NywxMDY4LDEwNjksMTA3MCwxMDcxLDEwNzIsMTA3MywxMDc0LDEwNzUsMTA3NiwxMDc3LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwMywxMTA0LDExMDUsMTEwNiwxMTA3LDExMDgsMTEwOSwxMTEwLDExMTEsMTExMiwxMTEzLDExMTQsMTExNSwxMTE2LDExMTcsMTExOCwxMTE5LDExMzgsMTEzOSwxMTY4LDExNjksNzgwOCw3ODA5LDc4MTAsNzgxMSw3ODEyLDc4MTMsNzkyMiw3OTIzLDgyMDgsODIwOSw4MjExLDgyMTIsODIxMyw4MjE1LDgyMTYsODIxNyw4MjE4LDgyMTksODIyMCw4MjIxLDgyMjIsODIyNCw4MjI1LDgyMjYsODIzMCw4MjQwLDgyNDIsODI0Myw4MjQ5LDgyNTAsODI1Miw4MjU0LDgyNjAsODMxOSw4MzU1LDgzNTYsODM1OSw4MzY0LDg0NTMsODQ2Nyw4NDcwLDg0ODIsODQ4Niw4NDk0LDg1MzksODU0MCw4NTQxLDg1NDIsODU5Miw4NTkzLDg1OTQsODU5NSw4NTk2LDg1OTcsODYxNiw4NzA2LDg3MTAsODcxOSw4NzIxLDg3MjIsODczMCw4NzM0LDg3MzUsODc0NSw4NzQ3LDg3NzYsODgwMCw4ODAxLDg4MDQsODgwNSw4OTYyLDg5NzYsODk5Miw4OTkzLDk0NzIsOTQ3NCw5NDg0LDk0ODgsOTQ5Miw5NDk2LDk1MDAsOTUwOCw5NTE2LDk1MjQsOTUzMiw5NTUyLDk1NTMsOTU1NCw5NTU1LDk1NTYsOTU1Nyw5NTU4LDk1NTksOTU2MCw5NTYxLDk1NjIsOTU2Myw5NTY0LDk1NjUsOTU2Niw5NTY3LDk1NjgsOTU2OSw5NTcwLDk1NzEsOTU3Miw5NTczLDk1NzQsOTU3NSw5NTc2LDk1NzcsOTU3OCw5NTc5LDk1ODAsOTYwMCw5NjA0LDk2MDgsOTYxMiw5NjE2LDk2MTcsOTYxOCw5NjE5LDk2MzIsOTYzMyw5NjQyLDk2NDMsOTY0NCw5NjUwLDk2NTgsOTY2MCw5NjY4LDk2NzQsOTY3NSw5Njc5LDk2ODgsOTY4OSw5NzAyLDk3ODYsOTc4Nyw5Nzg4LDk3OTIsOTc5NCw5ODI0LDk4MjcsOTgyOSw5ODMwLDk4MzQsOTgzNSw5ODM2LDYxNDQxLDYxNDQyLDYxNDQ1LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xXSx0LkxpYmVyYXRpb25TYW5zUmVndWxhcldpZHRocz1bMzY1LDAsMzMzLDI3OCwyNzgsMzU1LDU1Niw1NTYsODg5LDY2NywxOTEsMzMzLDMzMywzODksNTg0LDI3OCwzMzMsMjc4LDI3OCw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsMjc4LDI3OCw1ODQsNTg0LDU4NCw1NTYsMTAxNSw2NjcsNjY3LDcyMiw3MjIsNjY3LDYxMSw3NzgsNzIyLDI3OCw1MDAsNjY3LDU1Niw4MzMsNzIyLDc3OCw2NjcsNzc4LDcyMiw2NjcsNjExLDcyMiw2NjcsOTQ0LDY2Nyw2NjcsNjExLDI3OCwyNzgsMjc4LDQ2OSw1NTYsMzMzLDU1Niw1NTYsNTAwLDU1Niw1NTYsMjc4LDU1Niw1NTYsMjIyLDIyMiw1MDAsMjIyLDgzMyw1NTYsNTU2LDU1Niw1NTYsMzMzLDUwMCwyNzgsNTU2LDUwMCw3MjIsNTAwLDUwMCw1MDAsMzM0LDI2MCwzMzQsNTg0LDMzMyw1NTYsNTU2LDU1Niw1NTYsMjYwLDU1NiwzMzMsNzM3LDM3MCw1NTYsNTg0LDczNyw1NTIsNDAwLDU0OSwzMzMsMzMzLDMzMyw1NzYsNTM3LDI3OCwzMzMsMzMzLDM2NSw1NTYsODM0LDgzNCw4MzQsNjExLDY2Nyw2NjcsNjY3LDY2Nyw2NjcsNjY3LDFlMyw3MjIsNjY3LDY2Nyw2NjcsNjY3LDI3OCwyNzgsMjc4LDI3OCw3MjIsNzIyLDc3OCw3NzgsNzc4LDc3OCw3NzgsNTg0LDc3OCw3MjIsNzIyLDcyMiw3MjIsNjY3LDY2Nyw2MTEsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsODg5LDUwMCw1NTYsNTU2LDU1Niw1NTYsMjc4LDI3OCwyNzgsMjc4LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NDksNjExLDU1Niw1NTYsNTU2LDU1Niw1MDAsNTU2LDUwMCw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw3MjIsNTAwLDcyMiw1MDAsNzIyLDUwMCw3MjIsNTAwLDcyMiw2MTUsNzIyLDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNzc4LDU1Niw3NzgsNTU2LDc3OCw1NTYsNzc4LDU1Niw3MjIsNTU2LDcyMiw1NTYsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDIyMiwyNzgsMjc4LDczNSw0NDQsNTAwLDIyMiw2NjcsNTAwLDUwMCw1NTYsMjIyLDU1NiwyMjIsNTU2LDI5Miw1NTYsMzM0LDU1NiwyMjIsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNjA0LDcyMyw1NTYsNzc4LDU1Niw3NzgsNTU2LDc3OCw1NTYsMWUzLDk0NCw3MjIsMzMzLDcyMiwzMzMsNzIyLDMzMyw2NjcsNTAwLDY2Nyw1MDAsNjY3LDUwMCw2NjcsNTAwLDYxMSwyNzgsNjExLDM3NSw2MTEsMjc4LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDk0NCw3MjIsNjY3LDUwMCw2NjcsNjExLDUwMCw2MTEsNTAwLDYxMSw1MDAsMjIyLDU1Niw2NjcsNTU2LDFlMyw4ODksNzc4LDYxMSw2NjcsNTAwLDYxMSwyNzgsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMyw2NjcsMjc4LDc4NCw4MzgsMzg0LDc3NCw4NTUsNzUyLDIyMiw2NjcsNjY3LDU1MSw2NjgsNjY3LDYxMSw3MjIsNzc4LDI3OCw2NjcsNjY4LDgzMyw3MjIsNjUwLDc3OCw3MjIsNjY3LDYxOCw2MTEsNjY3LDc5OCw2NjcsODM1LDc0OCwyNzgsNjY3LDU3OCw0NDYsNTU2LDIyMiw1NDcsNTc4LDU3NSw1MDAsNTU3LDQ0Niw0NDEsNTU2LDU1NiwyMjIsNTAwLDUwMCw1NzYsNTAwLDQ0OCw1NTYsNjkwLDU2OSw0ODIsNjE3LDM5NSw1NDcsNjQ4LDUyNSw3MTMsNzgxLDIyMiw1NDcsNTU2LDU0Nyw3ODEsNjY3LDY2Nyw4NjUsNTQyLDcxOSw2NjcsMjc4LDI3OCw1MDAsMTA1NywxMDEwLDg1NCw1ODMsNzIyLDYzNSw3MTksNjY3LDY1Niw2NjcsNTQyLDY3Nyw2NjcsOTIzLDYwNCw3MTksNzE5LDU4Myw2NTYsODMzLDcyMiw3NzgsNzE5LDY2Nyw3MjIsNjExLDYzNSw3NjAsNjY3LDc0MCw2NjcsOTE3LDkzOCw3OTIsODg1LDY1Niw3MTksMTAxMCw3MjIsNTU2LDU3Myw1MzEsMzY1LDU4Myw1NTYsNjY5LDQ1OCw1NTksNTU5LDQzOCw1ODMsNjg4LDU1Miw1NTYsNTQyLDU1Niw1MDAsNDU4LDUwMCw4MjMsNTAwLDU3Myw1MjEsODAyLDgyMyw2MjUsNzE5LDUyMSw1MTAsNzUwLDU0Miw1NTYsNTU2LDU1NiwzNjUsNTEwLDUwMCwyMjIsMjc4LDIyMiw5MDYsODEyLDU1Niw0MzgsNTU5LDUwMCw1NTIsNzc4LDU1Niw0ODksNDExLDk0NCw3MjIsOTQ0LDcyMiw5NDQsNzIyLDY2Nyw1MDAsMzMzLDMzMyw1NTYsMWUzLDFlMyw1NTIsMjIyLDIyMiwyMjIsMjIyLDMzMywzMzMsMzMzLDU1Niw1NTYsMzUwLDFlMywxZTMsMTg4LDM1NCwzMzMsMzMzLDUwMCwzMzMsMTY3LDM2NSw1NTYsNTU2LDEwOTQsNTU2LDg4NSwzMjMsMTA3MywxZTMsNzY4LDYwMCw4MzQsODM0LDgzNCw4MzQsMWUzLDUwMCwxZTMsNTAwLDFlMyw1MDAsNTAwLDQ5NCw2MTIsODIzLDcxMyw1ODQsNTQ5LDcxMyw5NzksNzE5LDI3NCw1NDksNTQ5LDU4Myw1NDksNTQ5LDYwNCw1ODQsNjA0LDYwNCw3MDgsNjI1LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcyOSw2MDQsNjA0LDM1NCwzNTQsMWUzLDk5MCw5OTAsOTkwLDk5MCw0OTQsNjA0LDYwNCw2MDQsNjA0LDM1NCwxMDIxLDEwNTIsOTE3LDc1MCw3NTAsNTMxLDY1Niw1OTQsNTEwLDUwMCw3NTAsNzUwLDUwMCw1MDAsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywyMjIsMjIyLDI5NCwyOTQsMzI0LDMyNCwzMTYsMzI4LDM5OCwyODVdLHQuTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZz1bLTEsLTEsLTEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTUsOTYsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwxMTEsMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTI0LDEyNSwxMjYsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1LDI1NiwyNTcsMjU4LDI1OSwyNjAsMjYxLDI2MiwyNjMsMjY0LDI2NSwyNjYsMjY3LDI2OCwyNjksMjcwLDI3MSwyNzIsMjczLDI3NCwyNzUsMjc2LDI3NywyNzgsMjc5LDI4MCwyODEsMjgyLDI4MywyODQsMjg1LDI4NiwyODcsMjg4LDI4OSwyOTAsMjkxLDI5MiwyOTMsMjk0LDI5NSwyOTYsMjk3LDI5OCwyOTksMzAwLDMwMSwzMDIsMzAzLDMwNCwzMDUsMzA2LDMwNywzMDgsMzA5LDMxMCwzMTEsMzEyLDMxMywzMTQsMzE1LDMxNiwzMTcsMzE4LDMxOSwzMjAsMzIxLDMyMiwzMjMsMzI0LDMyNSwzMjYsMzI3LDMyOCwzMjksMzMwLDMzMSwzMzIsMzMzLDMzNCwzMzUsMzM2LDMzNywzMzgsMzM5LDM0MCwzNDEsMzQyLDM0MywzNDQsMzQ1LDM0NiwzNDcsMzQ4LDM0OSwzNTAsMzUxLDM1MiwzNTMsMzU0LDM1NSwzNTYsMzU3LDM1OCwzNTksMzYwLDM2MSwzNjIsMzYzLDM2NCwzNjUsMzY2LDM2NywzNjgsMzY5LDM3MCwzNzEsMzcyLDM3MywzNzQsMzc1LDM3NiwzNzcsMzc4LDM3OSwzODAsMzgxLDM4MiwzODMsNDAyLDUwNiw1MDcsNTA4LDUwOSw1MTAsNTExLDUzNiw1MzcsNTM4LDUzOSw3MTAsNzExLDcxMyw3MjgsNzI5LDczMCw3MzEsNzMyLDczMyw5MDAsOTAxLDkwMiw5MDMsOTA0LDkwNSw5MDYsOTA4LDkxMCw5MTEsOTEyLDkxMyw5MTQsOTE1LDkxNiw5MTcsOTE4LDkxOSw5MjAsOTIxLDkyMiw5MjMsOTI0LDkyNSw5MjYsOTI3LDkyOCw5MjksOTMxLDkzMiw5MzMsOTM0LDkzNSw5MzYsOTM3LDkzOCw5MzksOTQwLDk0MSw5NDIsOTQzLDk0NCw5NDUsOTQ2LDk0Nyw5NDgsOTQ5LDk1MCw5NTEsOTUyLDk1Myw5NTQsOTU1LDk1Niw5NTcsOTU4LDk1OSw5NjAsOTYxLDk2Miw5NjMsOTY0LDk2NSw5NjYsOTY3LDk2OCw5NjksOTcwLDk3MSw5NzIsOTczLDk3NCwxMDI0LDEwMjUsMTAyNiwxMDI3LDEwMjgsMTAyOSwxMDMwLDEwMzEsMTAzMiwxMDMzLDEwMzQsMTAzNSwxMDM2LDEwMzcsMTAzOCwxMDM5LDEwNDAsMTA0MSwxMDQyLDEwNDMsMTA0NCwxMDQ1LDEwNDYsMTA0NywxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA1NiwxMDU3LDEwNTgsMTA1OSwxMDYwLDEwNjEsMTA2MiwxMDYzLDEwNjQsMTA2NSwxMDY2LDEwNjcsMTA2OCwxMDY5LDEwNzAsMTA3MSwxMDcyLDEwNzMsMTA3NCwxMDc1LDEwNzYsMTA3NywxMDc4LDEwNzksMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDEwODgsMTA4OSwxMDkwLDEwOTEsMTA5MiwxMDkzLDEwOTQsMTA5NSwxMDk2LDEwOTcsMTA5OCwxMDk5LDExMDAsMTEwMSwxMTAyLDExMDMsMTEwNCwxMTA1LDExMDYsMTEwNywxMTA4LDExMDksMTExMCwxMTExLDExMTIsMTExMywxMTE0LDExMTUsMTExNiwxMTE3LDExMTgsMTExOSwxMTM4LDExMzksMTE2OCwxMTY5LDc4MDgsNzgwOSw3ODEwLDc4MTEsNzgxMiw3ODEzLDc5MjIsNzkyMyw4MjA4LDgyMDksODIxMSw4MjEyLDgyMTMsODIxNSw4MjE2LDgyMTcsODIxOCw4MjE5LDgyMjAsODIyMSw4MjIyLDgyMjQsODIyNSw4MjI2LDgyMzAsODI0MCw4MjQyLDgyNDMsODI0OSw4MjUwLDgyNTIsODI1NCw4MjYwLDgzMTksODM1NSw4MzU2LDgzNTksODM2NCw4NDUzLDg0NjcsODQ3MCw4NDgyLDg0ODYsODQ5NCw4NTM5LDg1NDAsODU0MSw4NTQyLDg1OTIsODU5Myw4NTk0LDg1OTUsODU5Niw4NTk3LDg2MTYsODcwNiw4NzEwLDg3MTksODcyMSw4NzIyLDg3MzAsODczNCw4NzM1LDg3NDUsODc0Nyw4Nzc2LDg4MDAsODgwMSw4ODA0LDg4MDUsODk2Miw4OTc2LDg5OTIsODk5Myw5NDcyLDk0NzQsOTQ4NCw5NDg4LDk0OTIsOTQ5Niw5NTAwLDk1MDgsOTUxNiw5NTI0LDk1MzIsOTU1Miw5NTUzLDk1NTQsOTU1NSw5NTU2LDk1NTcsOTU1OCw5NTU5LDk1NjAsOTU2MSw5NTYyLDk1NjMsOTU2NCw5NTY1LDk1NjYsOTU2Nyw5NTY4LDk1NjksOTU3MCw5NTcxLDk1NzIsOTU3Myw5NTc0LDk1NzUsOTU3Niw5NTc3LDk1NzgsOTU3OSw5NTgwLDk2MDAsOTYwNCw5NjA4LDk2MTIsOTYxNiw5NjE3LDk2MTgsOTYxOSw5NjMyLDk2MzMsOTY0Miw5NjQzLDk2NDQsOTY1MCw5NjU4LDk2NjAsOTY2OCw5Njc0LDk2NzUsOTY3OSw5Njg4LDk2ODksOTcwMiw5Nzg2LDk3ODcsOTc4OCw5NzkyLDk3OTQsOTgyNCw5ODI3LDk4MjksOTgzMCw5ODM0LDk4MzUsOTgzNiw2MTQ0MSw2MTQ0Miw2MTQ0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMV19LChlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuTXlyaWFkUHJvUmVndWxhck1ldHJpY3M9dC5NeXJpYWRQcm9SZWd1bGFyRmFjdG9ycz10Lk15cmlhZFByb0l0YWxpY01ldHJpY3M9dC5NeXJpYWRQcm9JdGFsaWNGYWN0b3JzPXQuTXlyaWFkUHJvQm9sZE1ldHJpY3M9dC5NeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljcz10Lk15cmlhZFByb0JvbGRJdGFsaWNGYWN0b3JzPXQuTXlyaWFkUHJvQm9sZEZhY3RvcnM9dm9pZCAwLHQuTXlyaWFkUHJvQm9sZEZhY3RvcnM9WzEuMzY4OTgsMSwxLC43MjcwNiwuODA0NzksLjgzNzM0LC45ODg5NCwuOTk3OTMsLjk4OTcsLjkzODg0LC44NjIwOSwuOTQyOTIsLjk0MjkyLDEuMTY2NjEsMS4wMjA1OCwuOTM1ODIsLjk2Njk0LC45MzU4MiwxLjE5MTM3LC45OTc5MywuOTk3OTMsLjk5NzkzLC45OTc5MywuOTk3OTMsLjk5NzkzLC45OTc5MywuOTk3OTMsLjk5NzkzLC45OTc5MywuNzgwNzYsLjc4MDc2LDEuMDIwNTgsMS4wMjA1OCwxLjAyMDU4LC43Mjg1MSwuNzg5NjYsLjkwODM4LC44MzYzNywuODIzOTEsLjk2Mzc2LC44MDA2MSwuODYyNzUsLjg3NjgsLjk1NDA3LDEuMDI1OCwuNzM5MDEsLjg1MDIyLC44MzY1NSwxLjAxNTYsLjk1NTQ2LC45MjE3OSwuODcxMDcsLjkyMTc5LC44MjExNCwuODA5NiwuODk3MTMsLjk0NDM4LC45NTM1MywuOTQwODMsLjkxOTA1LC45MDQwNiwuOTQ0NiwuOTQyOTIsMS4xODc3NywuOTQyOTIsMS4wMjA1OCwuODk5MDMsLjkwMDg4LC45NDkzOCwuOTc4OTgsLjgxMDkzLC45NzU3MSwuOTQ5MzgsMS4wMjQsLjk1NzcsLjk1OTMzLC45ODYyMSwxLjA0NzQsLjk3NDU1LC45ODk4MSwuOTY3MiwuOTU5MzMsLjk0NDYsLjk3ODk4LC45NzQwNywuOTc2NDYsLjc4MDM2LDEuMTAyMDgsLjk1NDQyLC45NTI5OCwuOTc1NzksLjkzMzIsLjk0MDM5LC45MzgsLjgwNjg3LDEuMDExNDksLjgwNjg3LDEuMDIwNTgsLjgwNDc5LC45OTc5MywuOTk3OTMsLjk5NzkzLC45OTc5MywxLjAxMTQ5LDEuMDA4NzIsLjkwMDg4LC45MTg4MiwxLjAyMTMsLjgzNjEsMS4wMjA1OCwuNjIyOTUsLjU0MzI0LC44OTAyMiwxLjA4NTk1LDEsMSwuOTAwODgsMSwuOTc0NTUsLjkzNTgyLC45MDA4OCwxLDEuMDU2ODYsLjgzNjEsLjk5NjQyLC45OTY0MiwuOTk2NDIsLjcyODUxLC45MDgzOCwuOTA4MzgsLjkwODM4LC45MDgzOCwuOTA4MzgsLjkwODM4LC44NjgsLjgyMzkxLC44MDA2MSwuODAwNjEsLjgwMDYxLC44MDA2MSwxLjAyNTgsMS4wMjU4LDEuMDI1OCwxLjAyNTgsLjk3NDg0LC45NTU0NiwuOTIxNzksLjkyMTc5LC45MjE3OSwuOTIxNzksLjkyMTc5LDEuMDIwNTgsLjkyMTc5LC45NDQzOCwuOTQ0MzgsLjk0NDM4LC45NDQzOCwuOTA0MDYsLjg2OTU4LC45ODIyNSwuOTQ5MzgsLjk0OTM4LC45NDkzOCwuOTQ5MzgsLjk0OTM4LC45NDkzOCwuOTAzMSwuODEwOTMsLjk0OTM4LC45NDkzOCwuOTQ5MzgsLjk0OTM4LC45ODYyMSwuOTg2MjEsLjk4NjIxLC45ODYyMSwuOTM5NjksLjk1OTMzLC45NDQ2LC45NDQ2LC45NDQ2LC45NDQ2LC45NDQ2LDEuMDg1OTUsLjk0NDYsLjk1NDQyLC45NTQ0MiwuOTU0NDIsLjk1NDQyLC45NDAzOSwuOTc4OTgsLjk0MDM5LC45MDgzOCwuOTQ5MzgsLjkwODM4LC45NDkzOCwuOTA4MzgsLjk0OTM4LC44MjM5MSwuODEwOTMsLjgyMzkxLC44MTA5MywuODIzOTEsLjgxMDkzLC44MjM5MSwuODEwOTMsLjk2Mzc2LC44NDMxMywuOTc0ODQsLjk3NTcxLC44MDA2MSwuOTQ5MzgsLjgwMDYxLC45NDkzOCwuODAwNjEsLjk0OTM4LC44MDA2MSwuOTQ5MzgsLjgwMDYxLC45NDkzOCwuODc2OCwuOTU3NywuODc2OCwuOTU3NywuODc2OCwuOTU3NywxLDEsLjk1NDA3LC45NTkzMywuOTcwNjksLjk1OTMzLDEuMDI1OCwuOTg2MjEsMS4wMjU4LC45ODYyMSwxLjAyNTgsLjk4NjIxLDEuMDI1OCwuOTg2MjEsMS4wMjU4LC45ODYyMSwuODg3LDEuMDE1OTEsLjczOTAxLDEuMDQ3NCwxLDEsLjk3NDU1LC44MzY1NSwuOTg5ODEsMSwxLC44MzY1NSwuNzM5NzcsLjgzNjU1LC43MzkwMywuODQ2MzgsMS4wMzMsLjk1NTQ2LC45NTkzMywxLDEsLjk1NTQ2LC45NTkzMywuODI3MSwuOTU0MTcsLjk1OTMzLC45MjE3OSwuOTQ0NiwuOTIxNzksLjk0NDYsLjkyMTc5LC45NDQ2LC45MzYsLjkxOTY0LC44MjExNCwuOTc2NDYsMSwxLC44MjExNCwuOTc2NDYsLjgwOTYsLjc4MDM2LC44MDk2LC43ODAzNiwxLDEsLjgwOTYsLjc4MDM2LDEsMSwuODk3MTMsLjc3NDUyLC44OTcxMywxLjEwMjA4LC45NDQzOCwuOTU0NDIsLjk0NDM4LC45NTQ0MiwuOTQ0MzgsLjk1NDQyLC45NDQzOCwuOTU0NDIsLjk0NDM4LC45NTQ0MiwuOTQ0MzgsLjk1NDQyLC45NDA4MywuOTc1NzksLjkwNDA2LC45NDAzOSwuOTA0MDYsLjk0NDYsLjkzOCwuOTQ0NiwuOTM4LC45NDQ2LC45MzgsMSwuOTk3OTMsLjkwODM4LC45NDkzOCwuODY4LC45MDMxLC45MjE3OSwuOTQ0NiwxLDEsLjg5NzEzLDEuMTAyMDgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwOTg5LC45MzU4LC45MTk0NSwuODMxODEsLjc1MjYxLC44Nzk5MiwuODI5NzYsLjk2MDM0LC44MzY4OSwuOTcyNjgsMS4wMDc4LC45MDgzOCwuODM2MzcsLjgwMTksLjkwMTU3LC44MDA2MSwuOTQ0NiwuOTU0MDcsLjkyNDM2LDEuMDI1OCwuODUwMjIsLjk3MTUzLDEuMDE1NiwuOTU1NDYsLjg5MTkyLC45MjE3OSwuOTIzNjEsLjg3MTA3LC45NjMxOCwuODk3MTMsLjkzNzA0LC45NTYzOCwuOTE5MDUsLjkxNzA5LC45Mjc5NiwxLjAyNTgsLjkzNzA0LC45NDgzNiwxLjAzNzMsLjk1OTMzLDEuMDA3OCwuOTU4NzEsLjk0ODM2LC45NjE3NCwuOTI2MDEsLjk0OTgsLjk4NjA3LC45NTc3NiwuOTU5MzMsMS4wNTQ1MywxLjAwNzgsLjk4Mjc1LC45MzE0LC45NTYxNywuOTE3MDEsMS4wNTk5MywuOTQ0NiwuNzgzNjcsLjk1NTMsMSwuODY4MzIsMS4wMTI4LC45NTg3MSwuOTkzOTQsLjg3NTQ4LC45NjM2MSwuODY3NzQsMS4wMDc4LC45NTg3MSwuOTQ0NiwuOTU4NzEsLjg2Nzc0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjk0MDgzLC45NzU3OSwuOTQwODMsLjk3NTc5LC45NDA4MywuOTc1NzksLjkwNDA2LC45NDAzOSwuOTY2OTQsMSwuODk5MDMsMSwxLDEsLjkzNTgyLC45MzU4MiwuOTM1ODIsMSwuOTA4LC45MDgsLjkxOCwuOTQyMTksLjk0MjE5LC45NjU0NCwxLDEuMjg1LDEsMSwuODEwNzksLjgxMDc5LDEsMSwuNzQ4NTQsMSwxLDEsMSwuOTk3OTMsMSwxLDEsLjY1LDEsMS4zNjE0NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4xNzE3MywxLC44MDUzNSwuNzYxNjksMS4wMjA1OCwxLjA3MzIsMS4wNTQ4NiwxLDEsMS4zMDY5MiwxLjA4NTk1LDEuMDg1OTUsMSwxLjA4NTk1LDEuMDg1OTUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjE2MTYxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdLHQuTXlyaWFkUHJvQm9sZE1ldHJpY3M9e2xpbmVIZWlnaHQ6MS4yLGxpbmVHYXA6LjJ9LHQuTXlyaWFkUHJvQm9sZEl0YWxpY0ZhY3RvcnM9WzEuMzY4OTgsMSwxLC42NjIyNywuODA3NzksLjgxNjI1LC45NzI3NiwuOTcyNzYsLjk3NzMzLC45MjIyMiwuODMyNjYsLjk0MjkyLC45NDI5MiwxLjE2MTQ4LDEuMDIwNTgsLjkzNTgyLC45NjY5NCwuOTM1ODIsMS4xNzMzNywuOTcyNzYsLjk3Mjc2LC45NzI3NiwuOTcyNzYsLjk3Mjc2LC45NzI3NiwuOTcyNzYsLjk3Mjc2LC45NzI3NiwuOTcyNzYsLjc4MDc2LC43ODA3NiwxLjAyMDU4LDEuMDIwNTgsMS4wMjA1OCwuNzE1NDEsLjc2ODEzLC44NTU3NiwuODA1OTEsLjgwNzI5LC45NDI5OSwuNzc1MTIsLjgzNjU1LC44NjUyMywuOTIyMjIsLjk4NjIxLC43MTc0MywuODE2OTgsLjc5NzI2LC45ODU1OCwuOTIyMjIsLjkwNjM3LC44MzgwOSwuOTA2MzcsLjgwNzI5LC43NjQ2MywuODYyNzUsLjkwNjk5LC45MTYwNSwuOTE1NCwuODUzMDgsLjg1NDU4LC45MDUzMSwuOTQyOTIsMS4yMTI5NiwuOTQyOTIsMS4wMjA1OCwuODk5MDMsMS4xODYxNiwuOTk2MTMsLjkxNjc3LC43ODIxNiwuOTE2NzcsLjkwMDgzLC45ODc5NiwuOTEzNSwuOTIxNjgsLjk1MzgxLC45ODk4MSwuOTUyOTgsLjk1MzgxLC45MzQ1OSwuOTIxNjgsLjkxNTEzLC45MjAwNCwuOTE2NzcsLjk1MDc3LC43NDgsMS4wNDUwMiwuOTE2NzcsLjkyMDYxLC45NDIzNiwuODk1NDQsLjg5MzY0LC45LC44MDY4NywuODU3OCwuODA2ODcsMS4wMjA1OCwuODA3NzksLjk3Mjc2LC45NzI3NiwuOTcyNzYsLjk3Mjc2LC44NTc4LC45OTk3MywxLjE4NjE2LC45MTMzOSwxLjA4MDc0LC44Mjg5MSwxLjAyMDU4LC41NTUwOSwuNzE1MjYsLjg5MDIyLDEuMDg1OTUsMSwxLDEuMTg2MTYsMSwuOTY3MzYsLjkzNTgyLDEuMTg2MTYsMSwxLjA0ODY0LC44MjcxMSwuOTkwNDMsLjk5MDQzLC45OTA0MywuNzE1NDEsLjg1NTc2LC44NTU3NiwuODU1NzYsLjg1NTc2LC44NTU3NiwuODU1NzYsLjg0NSwuODA3MjksLjc3NTEyLC43NzUxMiwuNzc1MTIsLjc3NTEyLC45ODYyMSwuOTg2MjEsLjk4NjIxLC45ODYyMSwuOTU5NjEsLjkyMjIyLC45MDYzNywuOTA2MzcsLjkwNjM3LC45MDYzNywuOTA2MzcsMS4wMjA1OCwuOTAyNTEsLjkwNjk5LC45MDY5OSwuOTA2OTksLjkwNjk5LC44NTQ1OCwuODM2NTksLjk0OTUxLC45OTYxMywuOTk2MTMsLjk5NjEzLC45OTYxMywuOTk2MTMsLjk5NjEzLC44NTgxMSwuNzgyMTYsLjkwMDgzLC45MDA4MywuOTAwODMsLjkwMDgzLC45NTM4MSwuOTUzODEsLjk1MzgxLC45NTM4MSwuOTEzNSwuOTIxNjgsLjkxNTEzLC45MTUxMywuOTE1MTMsLjkxNTEzLC45MTUxMywxLjA4NTk1LC45MTY3NywuOTE2NzcsLjkxNjc3LC45MTY3NywuOTE2NzcsLjg5MzY0LC45MjMzMiwuODkzNjQsLjg1NTc2LC45OTYxMywuODU1NzYsLjk5NjEzLC44NTU3NiwuOTk2MTMsLjgwNzI5LC43ODIxNiwuODA3MjksLjc4MjE2LC44MDcyOSwuNzgyMTYsLjgwNzI5LC43ODIxNiwuOTQyOTksLjc2NzgzLC45NTk2MSwuOTE2NzcsLjc3NTEyLC45MDA4MywuNzc1MTIsLjkwMDgzLC43NzUxMiwuOTAwODMsLjc3NTEyLC45MDA4MywuNzc1MTIsLjkwMDgzLC44NjUyMywuOTEzNSwuODY1MjMsLjkxMzUsLjg2NTIzLC45MTM1LDEsMSwuOTIyMjIsLjkyMTY4LC45MjIyMiwuOTIxNjgsLjk4NjIxLC45NTM4MSwuOTg2MjEsLjk1MzgxLC45ODYyMSwuOTUzODEsLjk4NjIxLC45NTM4MSwuOTg2MjEsLjk1MzgxLC44NjAzNiwuOTcwOTYsLjcxNzQzLC45ODk4MSwxLDEsLjk1Mjk4LC43OTcyNiwuOTUzODEsMSwxLC43OTcyNiwuNjg5NCwuNzk3MjYsLjc0MzIxLC44MTY5MSwxLjAwMDYsLjkyMjIyLC45MjE2OCwxLDEsLjkyMjIyLC45MjE2OCwuNzk0NjQsLjkyMDk4LC45MjE2OCwuOTA2MzcsLjkxNTEzLC45MDYzNywuOTE1MTMsLjkwNjM3LC45MTUxMywuOTA5LC44NzUxNCwuODA3MjksLjk1MDc3LDEsMSwuODA3MjksLjk1MDc3LC43NjQ2MywuNzQ4LC43NjQ2MywuNzQ4LDEsMSwuNzY0NjMsLjc0OCwxLDEsLjg2Mjc1LC43MjY1MSwuODYyNzUsMS4wNDUwMiwuOTA2OTksLjkxNjc3LC45MDY5OSwuOTE2NzcsLjkwNjk5LC45MTY3NywuOTA2OTksLjkxNjc3LC45MDY5OSwuOTE2NzcsLjkwNjk5LC45MTY3NywuOTE1NCwuOTQyMzYsLjg1NDU4LC44OTM2NCwuODU0NTgsLjkwNTMxLC45LC45MDUzMSwuOSwuOTA1MzEsLjksMSwuOTcyNzYsLjg1NTc2LC45OTYxMywuODQ1LC44NTgxMSwuOTAyNTEsLjkxNjc3LDEsMSwuODYyNzUsMS4wNDUwMiwxLjE4NjE2LDEuMTg2MTYsMS4xODYxNiwxLjE4NjE2LDEuMTg2MTYsMS4xODYxNiwxLjE4NjE2LDEuMTg2MTYsMS4xODYxNiwxLjAwODk5LDEuMzA2MjgsLjg1NTc2LC44MDE3OCwuNjY4NjIsLjc5MjcsLjY5MzIzLC44ODEyNywuNzI0NTksLjg5NzExLC45NTM4MSwuODU1NzYsLjgwNTkxLC43ODA1LC45NDcyOSwuNzc1MTIsLjkwNTMxLC45MjIyMiwuOTA2MzcsLjk4NjIxLC44MTY5OCwuOTI2NTUsLjk4NTU4LC45MjIyMiwuODUzNTksLjkwNjM3LC45MDk3NiwuODM4MDksLjk0NTIzLC44NjI3NSwuODM1MDksLjkzMTU3LC44NTMwOCwuODMzOTIsLjkyMzQ2LC45ODYyMSwuODM1MDksLjkyODg2LC45MTMyNCwuOTIxNjgsLjk1MzgxLC45MDY0NiwuOTI4ODYsLjkwNTU3LC44Njg0NywuOTAyNzYsLjkxMzI0LC44Njg0MiwuOTIxNjgsLjk5NTMxLC45NTM4MSwuOTIyNCwuODU0MDgsLjkyNjk5LC44Njg0NywxLjAwNTEsLjkxNTEzLC44MDQ4NywuOTM0ODEsMSwuODgxNTksMS4wNTIxNCwuOTA2NDYsLjk3MzU1LC44MTUzOSwuODkzOTgsLjg1OTIzLC45NTM4MSwuOTA2NDYsLjkxNTEzLC45MDY0NiwuODU5MjMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTE1NCwuOTQyMzYsLjkxNTQsLjk0MjM2LC45MTU0LC45NDIzNiwuODU0NTgsLjg5MzY0LC45NjY5NCwxLC44OTkwMywxLDEsMSwuOTE3ODIsLjkxNzgyLC45MTc4MiwxLC44OTYsLjg5NiwuODk2LC45MzMyLC45MzMyLC45NTk3MywxLDEuMjYsMSwxLC44MDQ3OSwuODAxNzgsMSwxLC44NTYzMywxLDEsMSwxLC45NzI3NiwxLDEsMSwuNjk4LDEsMS4zNjE0NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4xNDU0MiwxLC43OTE5OSwuNzg2OTQsMS4wMjA1OCwxLjAzNDkzLDEuMDU0ODYsMSwxLDEuMjMwMjYsMS4wODU5NSwxLjA4NTk1LDEsMS4wODU5NSwxLjA4NTk1LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4yMDAwNiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0Lk15cmlhZFByb0JvbGRJdGFsaWNNZXRyaWNzPXtsaW5lSGVpZ2h0OjEuMixsaW5lR2FwOi4yfSx0Lk15cmlhZFByb0l0YWxpY0ZhY3RvcnM9WzEuMzY4OTgsMSwxLC42NTUwNywuODQ5NDMsLjg1NjM5LC44ODQ2NSwuODg0NjUsLjg2OTM2LC44ODMwNywuODY5NDgsLjg1MjgzLC44NTI4MywxLjA2MzgzLDEuMDIwNTgsLjc1OTQ1LC45MjE5LC43NTk0NSwxLjE3MzM3LC44ODQ2NSwuODg0NjUsLjg4NDY1LC44ODQ2NSwuODg0NjUsLjg4NDY1LC44ODQ2NSwuODg0NjUsLjg4NDY1LC44ODQ2NSwuNzU5NDUsLjc1OTQ1LDEuMDIwNTgsMS4wMjA1OCwxLjAyMDU4LC42OTA0NiwuNzA5MjYsLjg1MTU4LC43NzgxMiwuNzY4NTIsLjg5NTkxLC43MDQ2NiwuNzYxMjUsLjgwMDk0LC44NjgyMiwuODM4NjQsLjcyOCwuNzcyMTIsLjc5NDc1LC45MzYzNywuODc1MTQsLjg1ODgsLjc2MDEzLC44NTg4LC43MjQyMSwuNjk4NjYsLjc3NTk4LC44NTk5MSwuODA4MTEsLjg3ODMyLC43ODExMiwuNzc1MTIsLjg1NjIsMS4wMjIyLDEuMTg0MTcsMS4wMjIyLDEuMjcwMTQsLjg5OTAzLDEuMTUwMTIsLjkzODU5LC45NDM5OSwuODQ2LC45NDM5OSwuODE0NTMsMS4wMTg2LC45NDIxOSwuOTYwMTcsMS4wMzA3NSwxLjAyMTc1LC45MTIsMS4wMzA3NSwuOTY5OTgsLjk2MDE3LC45Mzg1OSwuOTQzOTksLjk0Mzk5LC45NTQ5MywuNzQ2LDEuMTI2NTgsLjk0NTc4LC45MSwuOTc5LC44ODIsLjg4MiwuODMsLjg1MDM0LC44MzUzNywuODUwMzQsMS4wMjA1OCwuNzA4NjksLjg4NDY1LC44ODQ2NSwuODg0NjUsLjg4NDY1LC44MzUzNywuOTAwODMsMS4xNTAxMiwuOTE2MSwuOTQ1NjUsLjczNTQxLDEuMDIwNTgsLjUzNjA5LC42OTM1MywuNzk1MTksMS4wODU5NSwxLDEsMS4xNTAxMiwxLC45MTk3NCwuNzU5NDUsMS4xNTAxMiwxLC45NDQ2LC43MzM2MSwuOTAwNSwuOTAwNSwuOTAwNSwuNjI4NjQsLjg1MTU4LC44NTE1OCwuODUxNTgsLjg1MTU4LC44NTE1OCwuODUxNTgsLjc3MywuNzY4NTIsLjcwNDY2LC43MDQ2NiwuNzA0NjYsLjcwNDY2LC44Mzg2NCwuODM4NjQsLjgzODY0LC44Mzg2NCwuOTA1NjEsLjg3NTE0LC44NTg4LC44NTg4LC44NTg4LC44NTg4LC44NTg4LDEuMDIwNTgsLjg1NzUxLC44NTk5MSwuODU5OTEsLjg1OTkxLC44NTk5MSwuNzc1MTIsLjc2MDEzLC44ODA3NSwuOTM4NTksLjkzODU5LC45Mzg1OSwuOTM4NTksLjkzODU5LC45Mzg1OSwuODA3NSwuODQ2LC44MTQ1MywuODE0NTMsLjgxNDUzLC44MTQ1MywuODI0MjQsLjgyNDI0LC44MjQyNCwuODI0MjQsLjkyNzgsLjk2MDE3LC45Mzg1OSwuOTM4NTksLjkzODU5LC45Mzg1OSwuOTM4NTksMS4wODU5NSwuODU2MiwuOTQ1NzgsLjk0NTc4LC45NDU3OCwuOTQ1NzgsLjg4MiwuOTQ1NzgsLjg4MiwuODUxNTgsLjkzODU5LC44NTE1OCwuOTM4NTksLjg1MTU4LC45Mzg1OSwuNzY4NTIsLjg0NiwuNzY4NTIsLjg0NiwuNzY4NTIsLjg0NiwuNzY4NTIsLjg0NiwuODk1OTEsLjg1NDQsLjkwNTYxLC45NDM5OSwuNzA0NjYsLjgxNDUzLC43MDQ2NiwuODE0NTMsLjcwNDY2LC44MTQ1MywuNzA0NjYsLjgxNDUzLC43MDQ2NiwuODE0NTMsLjgwMDk0LC45NDIxOSwuODAwOTQsLjk0MjE5LC44MDA5NCwuOTQyMTksMSwxLC44NjgyMiwuOTYwMTcsLjg2ODIyLC45NjAxNywuODM4NjQsLjgyNDI0LC44Mzg2NCwuODI0MjQsLjgzODY0LC44MjQyNCwuODM4NjQsMS4wMzA3NSwuODM4NjQsLjgyNDI0LC44MTQwMiwxLjAyNzM4LC43MjgsMS4wMjE3NSwxLDEsLjkxMiwuNzk0NzUsMS4wMzA3NSwxLDEsLjc5NDc1LC44MzkxMSwuNzk0NzUsLjY2MjY2LC44MDU1MywxLjA2Njc2LC44NzUxNCwuOTYwMTcsMSwxLC44NzUxNCwuOTYwMTcsLjg2ODY1LC44NzM5NiwuOTYwMTcsLjg1ODgsLjkzODU5LC44NTg4LC45Mzg1OSwuODU4OCwuOTM4NTksLjg2NywuODQ3NTksLjcyNDIxLC45NTQ5MywxLDEsLjcyNDIxLC45NTQ5MywuNjk4NjYsLjc0NiwuNjk4NjYsLjc0NiwxLDEsLjY5ODY2LC43NDYsMSwxLC43NzU5OCwuODg0MTcsLjc3NTk4LDEuMTI2NTgsLjg1OTkxLC45NDU3OCwuODU5OTEsLjk0NTc4LC44NTk5MSwuOTQ1NzgsLjg1OTkxLC45NDU3OCwuODU5OTEsLjk0NTc4LC44NTk5MSwuOTQ1NzgsLjg3ODMyLC45NzksLjc3NTEyLC44ODIsLjc3NTEyLC44NTYyLC44MywuODU2MiwuODMsLjg1NjIsLjgzLDEsLjg4NDY1LC44NTE1OCwuOTM4NTksLjc3MywuODA3NSwuODU3NTEsLjg1NjIsMSwxLC43NzU5OCwxLjEyNjU4LDEuMTUwMTIsMS4xNTAxMiwxLjE1MDEyLDEuMTUwMTIsMS4xNTAxMiwxLjE1MzEzLDEuMTUwMTIsMS4xNTAxMiwxLjE1MDEyLDEuMDgxMDYsMS4wMzkwMSwuODUxNTgsLjc3MDI1LC42MjI2NCwuNzY0NiwuNjUzNTEsLjg2MDI2LC42OTQ2MSwuODk5NDcsMS4wMzA3NSwuODUxNTgsLjc3ODEyLC43NjQ0OSwuODg4MzYsLjcwNDY2LC44NTYyLC44NjgyMiwuODU4OCwuODM4NjQsLjc3MjEyLC44NTMwOCwuOTM2MzcsLjg3NTE0LC44MjM1MiwuODU4OCwuODU3MDEsLjc2MDEzLC44OTA1OCwuNzc1OTgsLjgxNTYsLjgyNTY1LC43ODExMiwuNzc4OTksLjg5Mzg2LC44Mzg2NCwuODE1NiwuOTQ4NiwuOTIzODgsLjk2MTg2LDEuMDMwNzUsLjkxMTIzLC45NDg2LC45MzI5OCwuODc4LC45Mzk0MiwuOTIzODgsLjg0NTk2LC45NjE4NiwuOTUxMTksMS4wMzA3NSwuOTIyLC44ODc4NywuOTU4MjksLjg4LC45MzU1OSwuOTM4NTksLjc4ODE1LC45Mzc1OCwxLC44OTIxNywxLjAzNzM3LC45MTEyMywuOTM5NjksLjc3NDg3LC44NTc2OSwuODY3OTksMS4wMzA3NSwuOTExMjMsLjkzODU5LC45MTEyMywuODY3OTksMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuODc4MzIsLjk3OSwuODc4MzIsLjk3OSwuODc4MzIsLjk3OSwuNzc1MTIsLjg4MiwuOTIxOSwxLC44OTkwMywxLDEsMSwuODczMjEsLjg3MzIxLC44NzMyMSwxLDEuMDI3LDEuMDI3LDEuMDI3LC44Njg0NywuODY4NDcsLjc5MTIxLDEsMS4xMjQsMSwxLC43MzU3MiwuNzM1NzIsMSwxLC44NTAzNCwxLDEsMSwxLC44ODQ2NSwxLDEsMSwuNjY5LDEsMS4zNjE0NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4wNDgyOCwxLC43NDk0OCwuNzUxODcsMS4wMjA1OCwuOTgzOTEsMS4wMjExOSwxLDEsMS4wNjIzMywxLjA4NTk1LDEuMDg1OTUsMSwxLjA4NTk1LDEuMDg1OTUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjA1MjMzLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdLHQuTXlyaWFkUHJvSXRhbGljTWV0cmljcz17bGluZUhlaWdodDoxLjIsbGluZUdhcDouMn0sdC5NeXJpYWRQcm9SZWd1bGFyRmFjdG9ycz1bMS4zNjg5OCwxLDEsLjc2MzA1LC44Mjc4NCwuOTQ5MzUsLjg5MzY0LC45MjI0MSwuODkwNzMsLjkwNzA2LC45ODQ3MiwuODUyODMsLjg1MjgzLDEuMDY2NCwxLjAyMDU4LC43NDUwNSwuOTIxOSwuNzQ1MDUsMS4yMzQ1NiwuOTIyNDEsLjkyMjQxLC45MjI0MSwuOTIyNDEsLjkyMjQxLC45MjI0MSwuOTIyNDEsLjkyMjQxLC45MjI0MSwuOTIyNDEsLjc0NTA1LC43NDUwNSwxLjAyMDU4LDEuMDIwNTgsMS4wMjA1OCwuNzMwMDIsLjcyNjAxLC45MTc1NSwuODEyNiwuODAzMTQsLjkyMjIyLC43Mzc2NCwuNzk3MjYsLjgzMDUxLC45MDI4NCwuODYwMjMsLjc0LC44MTI2LC44NDg2OSwuOTY1MTgsLjkxMTE1LC44ODU4LC43OTc2MSwuODg1OCwuNzQ0OTgsLjczOTE0LC44MTM2MywuODk1OTEsLjgzNjU5LC44OTYzMywuODU2MDgsLjgxMTEsLjkwNTMxLDEuMDIyMiwxLjIyNzM2LDEuMDIyMiwxLjI3MDE0LC44OTkwMywuOTAwODgsLjg2NjY3LDEuMDIzMSwuODk2LDEuMDE0MTEsLjkwMDgzLDEuMDUwOTksMS4wMDUxMiwuOTk3OTMsMS4wNTMyNiwxLjA5Mzc3LC45MzgsMS4wNjIyNiwxLjAwMTE5LC45OTc5MywuOTg3MTQsMS4wMjMxLDEuMDEyMzEsLjk4MTk2LC43OTIsMS4xOTEzNywuOTkwNzQsLjk2MiwxLjAxOTE1LC45MjYsLjk0MiwuODU2LC44NTAzNCwuOTIwMDYsLjg1MDM0LDEuMDIwNTgsLjY5MDY3LC45MjI0MSwuOTIyNDEsLjkyMjQxLC45MjI0MSwuOTIwMDYsLjkzMzIsLjkwMDg4LC45MTg4MiwuOTM0ODQsLjc1MzM5LDEuMDIwNTgsLjU2ODY2LC41NDMyNCwuNzk1MTksMS4wODU5NSwxLDEsLjkwMDg4LDEsLjk1MzI1LC43NDUwNSwuOTAwODgsMSwuOTcxOTgsLjc1MzM5LC45MTAwOSwuOTEwMDksLjkxMDA5LC42NjQ2NiwuOTE3NTUsLjkxNzU1LC45MTc1NSwuOTE3NTUsLjkxNzU1LC45MTc1NSwuNzg4LC44MDMxNCwuNzM3NjQsLjczNzY0LC43Mzc2NCwuNzM3NjQsLjg2MDIzLC44NjAyMywuODYwMjMsLjg2MDIzLC45MjkxNSwuOTExMTUsLjg4NTgsLjg4NTgsLjg4NTgsLjg4NTgsLjg4NTgsMS4wMjA1OCwuODg1OCwuODk1OTEsLjg5NTkxLC44OTU5MSwuODk1OTEsLjgxMTEsLjc5NjExLC44OTcxMywuODY2NjcsLjg2NjY3LC44NjY2NywuODY2NjcsLjg2NjY3LC44NjY2NywuODY5MzYsLjg5NiwuOTAwODMsLjkwMDgzLC45MDA4MywuOTAwODMsLjg0MjI0LC44NDIyNCwuODQyMjQsLjg0MjI0LC45NzI3NiwuOTk3OTMsLjk4NzE0LC45ODcxNCwuOTg3MTQsLjk4NzE0LC45ODcxNCwxLjA4NTk1LC44OTg3NiwuOTkwNzQsLjk5MDc0LC45OTA3NCwuOTkwNzQsLjk0MiwxLjAyMzEsLjk0MiwuOTE3NTUsLjg2NjY3LC45MTc1NSwuODY2NjcsLjkxNzU1LC44NjY2NywuODAzMTQsLjg5NiwuODAzMTQsLjg5NiwuODAzMTQsLjg5NiwuODAzMTQsLjg5NiwuOTIyMjIsLjkzMzcyLC45MjkxNSwxLjAxNDExLC43Mzc2NCwuOTAwODMsLjczNzY0LC45MDA4MywuNzM3NjQsLjkwMDgzLC43Mzc2NCwuOTAwODMsLjczNzY0LC45MDA4MywuODMwNTEsMS4wMDUxMiwuODMwNTEsMS4wMDUxMiwuODMwNTEsMS4wMDUxMiwxLDEsLjkwMjg0LC45OTc5MywuOTA5NzYsLjk5NzkzLC44NjAyMywuODQyMjQsLjg2MDIzLC44NDIyNCwuODYwMjMsLjg0MjI0LC44NjAyMywxLjA1MzI2LC44NjAyMywuODQyMjQsLjgyODczLDEuMDc0NjksLjc0LDEuMDkzNzcsMSwxLC45MzgsLjg0ODY5LDEuMDYyMjYsMSwxLC44NDg2OSwuODM3MDQsLjg0ODY5LC44MTQ0MSwuODU1ODgsMS4wODkyNywuOTExMTUsLjk5NzkzLDEsMSwuOTExMTUsLjk5NzkzLC45MTg4NywuOTA5OTEsLjk5NzkzLC44ODU4LC45ODcxNCwuODg1OCwuOTg3MTQsLjg4NTgsLjk4NzE0LC44OTQsLjkxNDM0LC43NDQ5OCwuOTgxOTYsMSwxLC43NDQ5OCwuOTgxOTYsLjczOTE0LC43OTIsLjczOTE0LC43OTIsMSwxLC43MzkxNCwuNzkyLDEsMSwuODEzNjMsLjkwNCwuODEzNjMsMS4xOTEzNywuODk1OTEsLjk5MDc0LC44OTU5MSwuOTkwNzQsLjg5NTkxLC45OTA3NCwuODk1OTEsLjk5MDc0LC44OTU5MSwuOTkwNzQsLjg5NTkxLC45OTA3NCwuODk2MzMsMS4wMTkxNSwuODExMSwuOTQyLC44MTExLC45MDUzMSwuODU2LC45MDUzMSwuODU2LC45MDUzMSwuODU2LDEsLjkyMjQxLC45MTc1NSwuODY2NjcsLjc4OCwuODY5MzYsLjg4NTgsLjg5ODc2LDEsMSwuODEzNjMsMS4xOTEzNywuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAzODgsMS4wMzkwMSwuOTIxMzgsLjc4MTA1LC43MTU0LC44NjE2OSwuODA1MTMsLjk0MDA3LC44MjUyOCwuOTg2MTIsMS4wNjIyNiwuOTE3NTUsLjgxMjYsLjgxODg0LC45MjgxOSwuNzM3NjQsLjkwNTMxLC45MDI4NCwuODg1OCwuODYwMjMsLjgxMjYsLjkxMTcyLC45NjUxOCwuOTExMTUsLjgzMDg5LC44ODU4LC44Nzc5MSwuNzk3NjEsLjg5Mjk3LC44MTM2MywuODgxNTcsLjg5OTkyLC44NTYwOCwuODE5OTIsLjk0MzA3LC44NjAyMywuODgxNTcsLjk1MzA4LC45ODY5OSwuOTk3OTMsMS4wNjIyNiwuOTU4MTcsLjk1MzA4LC45NzM1OCwuOTI4LC45ODA4OCwuOTg2OTksLjkyNzYxLC45OTc5MywuOTYwMTcsMS4wNjIyNiwuOTg2LC45NDQsLjk1OTc4LC45MzgsLjk2NzA1LC45ODcxNCwuODA0NDIsLjk4OTcyLDEsLjg5NzYyLDEuMDQ1NTIsLjk1ODE3LC45OTAwNywuODcwNjQsLjkxODc5LC44ODg4OCwxLjA2MjI2LC45NTgxNywuOTg3MTQsLjk1ODE3LC44ODg4OCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44OTYzMywxLjAxOTE1LC44OTYzMywxLjAxOTE1LC44OTYzMywxLjAxOTE1LC44MTExLC45NDIsLjkyMTksMSwuODk5MDMsMSwxLDEsLjkzMTczLC45MzE3MywuOTMxNzMsMSwxLjA2MzA0LDEuMDYzMDQsMS4wNjkwNCwuODk5MDMsLjg5OTAzLC44MDU0OSwxLDEuMTU2LDEsMSwuNzY1NzUsLjc2NTc1LDEsMSwuNzI0NTgsMSwxLDEsMSwuOTIyNDEsMSwxLDEsLjYxOSwxLDEuMzYxNDUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDcyNTcsMSwuNzQ3MDUsLjcxMTE5LDEuMDIwNTgsMS4wMjQsMS4wMjExOSwxLDEsMS4xNTM2LDEuMDg1OTUsMS4wODU5NSwxLDEuMDg1OTUsMS4wODU5NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDU2MzgsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMV0sdC5NeXJpYWRQcm9SZWd1bGFyTWV0cmljcz17bGluZUhlaWdodDoxLjIsbGluZUdhcDouMn19LChlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuU2Vnb2V1aVJlZ3VsYXJNZXRyaWNzPXQuU2Vnb2V1aVJlZ3VsYXJGYWN0b3JzPXQuU2Vnb2V1aUl0YWxpY01ldHJpY3M9dC5TZWdvZXVpSXRhbGljRmFjdG9ycz10LlNlZ29ldWlCb2xkTWV0cmljcz10LlNlZ29ldWlCb2xkSXRhbGljTWV0cmljcz10LlNlZ29ldWlCb2xkSXRhbGljRmFjdG9ycz10LlNlZ29ldWlCb2xkRmFjdG9ycz12b2lkIDAsdC5TZWdvZXVpQm9sZEZhY3RvcnM9WzEuNzY3MzgsMSwxLC45OTI5NywuOTgyNCwxLjA0MDE2LDEuMDY0OTcsMS4wMzQyNCwuOTc1MjksMS4xNzY0NywxLjIzMjAzLDEuMTA4NSwxLjEwODUsMS4xNjkzOSwxLjIxMDcsLjk3NTQsMS4yMTQwOCwuOTc1NCwxLjU5NTc4LDEuMDM0MjQsMS4wMzQyNCwxLjAzNDI0LDEuMDM0MjQsMS4wMzQyNCwxLjAzNDI0LDEuMDM0MjQsMS4wMzQyNCwxLjAzNDI0LDEuMDM0MjQsLjgxMzc4LC44MTM3OCwxLjIxMDcsMS4yMTA3LDEuMjEwNywuNzE3MDMsLjk3ODQ3LC45NzM2MywuODg3NzYsLjg2NDEsMS4wMjA5NiwuNzk3OTUsLjg1MTMyLC45MTQsMS4wNjA4NSwxLjE0MDYsLjgwMDcsLjg5ODU4LC44MzY5MywxLjE0ODg5LDEuMDkzOTgsLjk3NDg5LC45MjA5NCwuOTc0ODksLjkwMzk5LC44NDA0MSwuOTU5MjMsMS4wMDEzNSwxLDEuMDY0NjcsLjk4MjQzLC45MDk5NiwuOTkzNjEsMS4xMDg1LDEuNTY5NDIsMS4xMDg1LDEuMjEwNywuNzQ2MjcsLjk0MjgyLC45Njc1MiwxLjAxNTE5LC44NjMwNCwxLjAxMzU5LC45NzI3OCwxLjE1MTAzLDEuMDEzNTksLjk4NTYxLDEuMDIyODUsMS4wMjI4NSwxLjAwNTI3LDEuMDIyODUsMS4wMzAyLC45OTA0MSwxLjAwMDgsMS4wMTUxOSwxLjAxMzU5LDEuMDIyNTgsLjc5MTA0LDEuMTY4NjIsLjk5MDQxLC45NzQ1NCwxLjAyNTExLC45OTI5OCwuOTY3NTIsLjk1ODAxLC45NDg1NiwxLjE2NTc5LC45NDg1NiwxLjIxMDcsLjk4MjQsMS4wMzQyNCwxLjAzNDI0LDEsMS4wMzQyNCwxLjE2NTc5LC44NzI3LDEuMzg3MSwxLjE4NjIyLDEuMTA4MTgsMS4wNDQ3OCwxLjIxMDcsMS4xODYyMiwuNzUxNTUsLjk0OTk0LDEuMjg4MjYsMS4yMTQwOCwxLjIxNDA4LC45MTA1NiwxLC45MTU3MiwuOTc1NCwuNjQ2NjMsMS4xODMyOCwxLjI0ODY2LDEuMDQ0NzgsMS4xNDE2OSwxLjE1NzQ5LDEuMTczODksLjcxNzAzLC45NzM2MywuOTczNjMsLjk3MzYzLC45NzM2MywuOTczNjMsLjk3MzYzLC45MzUwNiwuODY0MSwuNzk3OTUsLjc5Nzk1LC43OTc5NSwuNzk3OTUsMS4xNDA2LDEuMTQwNiwxLjE0MDYsMS4xNDA2LDEuMDIwOTYsMS4wOTM5OCwuOTc0MjYsLjk3NDI2LC45NzQyNiwuOTc0MjYsLjk3NDI2LDEuMjEwNywuOTc0ODksMS4wMDEzNSwxLjAwMTM1LDEuMDAxMzUsMS4wMDEzNSwuOTA5OTYsLjkyMDk0LDEuMDI3OTgsLjk2NzUyLC45Njc1MiwuOTY3NTIsLjk2NzUyLC45Njc1MiwuOTY3NTIsLjkzMTM2LC44NjMwNCwuOTcyNzgsLjk3Mjc4LC45NzI3OCwuOTcyNzgsMS4wMjI4NSwxLjAyMjg1LDEuMDIyODUsMS4wMjI4NSwuOTcxMjIsLjk5MDQxLDEsMSwxLDEsMSwxLjI4ODI2LDEuMDAwOCwuOTkwNDEsLjk5MDQxLC45OTA0MSwuOTkwNDEsLjk2NzUyLDEuMDE1MTksLjk2NzUyLC45NzM2MywuOTY3NTIsLjk3MzYzLC45Njc1MiwuOTczNjMsLjk2NzUyLC44NjQxLC44NjMwNCwuODY0MSwuODYzMDQsLjg2NDEsLjg2MzA0LC44NjQxLC44NjMwNCwxLjAyMDk2LDEuMDMwNTcsMS4wMjA5NiwxLjAzNTE3LC43OTc5NSwuOTcyNzgsLjc5Nzk1LC45NzI3OCwuNzk3OTUsLjk3Mjc4LC43OTc5NSwuOTcyNzgsLjc5Nzk1LC45NzI3OCwuOTE0LDEuMDEzNTksLjkxNCwxLjAxMzU5LC45MTQsMS4wMTM1OSwxLDEsMS4wNjA4NSwuOTg1NjEsMS4wNjA4NSwxLjAwODc5LDEuMTQwNiwxLjAyMjg1LDEuMTQwNiwxLjAyMjg1LDEuMTQwNiwxLjAyMjg1LDEuMTQwNiwxLjAyMjg1LDEuMTQwNiwxLjAyMjg1LC45NzEzOCwxLjA4NjkyLC44MDA3LDEuMDIyODUsMSwxLDEuMDA1MjcsLjgzNjkzLDEuMDIyODUsMSwxLC44MzY5MywuOTQ1NSwuODM2OTMsLjkwNDE4LC44MzY5MywxLjEzMDA1LDEuMDkzOTgsLjk5MDQxLDEsMSwxLjA5Mzk4LC45OTA0MSwuOTY2OTIsMS4wOTI1MSwuOTkwNDEsLjk3NDg5LDEuMDAwOCwuOTc0ODksMS4wMDA4LC45NzQ4OSwxLjAwMDgsLjkzOTk0LC45NzkzMSwuOTAzOTksMS4wMjI1OCwxLDEsLjkwMzk5LDEuMDIyNTgsLjg0MDQxLC43OTEwNCwuODQwNDEsLjc5MTA0LC44NDA0MSwuNzkxMDQsLjg0MDQxLC43OTEwNCwxLDEsLjk1OTIzLDEuMDcwMzQsLjk1OTIzLDEuMTY4NjIsMS4wMDEzNSwuOTkwNDEsMS4wMDEzNSwuOTkwNDEsMS4wMDEzNSwuOTkwNDEsMS4wMDEzNSwuOTkwNDEsMS4wMDEzNSwuOTkwNDEsMS4wMDEzNSwuOTkwNDEsMS4wNjQ2NywxLjAyNTExLC45MDk5NiwuOTY3NTIsLjkwOTk2LC45OTM2MSwuOTU4MDEsLjk5MzYxLC45NTgwMSwuOTkzNjEsLjk1ODAxLDEuMDc3MzMsMS4wMzQyNCwuOTczNjMsLjk2NzUyLC45MzUwNiwuOTMxMzYsLjk3NDg5LDEuMDAwOCwxLDEsLjk1OTIzLDEuMTY4NjIsMS4xNTEwMywxLjE1MTAzLDEuMDExNzMsMS4wMzk1OSwuNzU5NTMsLjgxMzc4LC43OTkxMiwxLjE1MTAzLDEuMjE5OTQsLjk1MTYxLC44NzgxNSwxLjAxMTQ5LC44MTUyNSwuNzY3NiwuOTgxNjcsMS4wMTEzNCwxLjAyNTQ2LC44NDA5NywxLjAzMDg5LDEuMTgxMDIsLjk3MzYzLC44ODc3NiwuODUxMzQsLjk3ODI2LC43OTc5NSwuOTkzNjEsMS4wNjA4NSwuOTc0ODksMS4xNDA2LC44OTg1OCwxLjAzODgsMS4xNDg4OSwxLjA5Mzk4LC44NjAzOSwuOTc0ODksMS4wNTk1LC45MjA5NCwuOTQ3OTMsLjk1OTIzLC45MDk5NiwuOTkzNDYsLjk4MjQzLDEuMDIxMTIsLjk1NDkzLDEuMTQwNiwuOTA5OTYsMS4wMzU3NCwxLjAyNTk3LDEuMDAwOCwxLjE4MTAyLDEuMDY2MjgsMS4wMzU3NCwxLjAxOTIsMS4wMTkzMiwxLjAwODg2LC45NzUzMSwxLjAxMDYsMS4wMDA4LDEuMTMxODksMS4xODEwMiwxLjAyMjc3LC45ODY4MywxLjAwMTYsLjk5NTYxLDEuMDcyMzcsMS4wMDA4LC45MDQzNCwuOTk5MjEsLjkzODAzLC44OTY1LDEuMjMwODUsMS4wNjYyOCwxLjA0OTgzLC45NjI2OCwxLjA0OTksLjk4NDM5LDEuMTgxMDIsMS4wNjYyOCwxLjAwMDgsMS4wNjYyOCwuOTg0MzksLjc5Nzk1LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDk0NjYsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjk3Mjc4LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDIwNjUsMSwxLDEsMSwxLDEsMS4wNjQ2NywxLjAyNTExLDEuMDY0NjcsMS4wMjUxMSwxLjA2NDY3LDEuMDI1MTEsLjkwOTk2LC45Njc1MiwxLDEuMjE0MDgsLjg5OTAzLDEsMSwuNzUxNTUsMS4wNDM5NCwxLjA0Mzk0LDEuMDQzOTQsMS4wNDM5NCwuOTg2MzMsLjk4NjMzLC45ODYzMywuNzMwNDcsLjczMDQ3LDEuMjA2NDIsLjkxMjExLDEuMjU2MzUsMS4yMjIsMS4wMjk1NiwxLjAzMzcyLDEuMDMzNzIsLjk2MDM5LDEuMjQ2MzMsMSwxLjEyNDU0LC45MzUwMywxLjAzNDI0LDEuMTk2ODcsMS4wMzQyNCwxLDEsMSwuNzcxLDEsMSwxLjE1NzQ5LDEuMTU3NDksMS4xNTc0OSwxLjEwOTQ4LC44NjI3OSwuOTQ0MzQsLjg2Mjc5LC45NDQzNCwuODYxODIsMSwxLDEuMTY4OTcsMSwuOTYwODUsLjkwMTM3LDEuMjEwNywxLjE4NDE2LDEuMTM5NzMsLjY5ODI1LC45NzE2LDIuMTAzMzksMS4yOTAwNCwxLjI5MDA0LDEuMjExNzIsMS4yOTAwNCwxLjI5MDA0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS40MjYwMywxLC45OTg2MiwuOTk4NjIsMSwuODcwMjUsLjg3MDI1LC44NzAyNSwuODcwMjUsMS4xODg3NCwxLjQyNjAzLDEsMS40MjYwMywxLjQyNjAzLC45OTg2MiwxLDEsMSwxLDEsMS4yODg2LDEuMDQzMTUsMS4xNTI5NiwxLjM0MTYzLDEsMSwxLDEuMDkxOTMsMS4wOTE5MywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMV0sdC5TZWdvZXVpQm9sZE1ldHJpY3M9e2xpbmVIZWlnaHQ6MS4zMzAwOCxsaW5lR2FwOjB9LHQuU2Vnb2V1aUJvbGRJdGFsaWNGYWN0b3JzPVsxLjc2NzM4LDEsMSwuOTg5NDYsMS4wMzk1OSwxLjA0MDE2LDEuMDI4MDksMS4wMzYsLjk3NjM5LDEuMTA5NTMsMS4yMzIwMywxLjExMTQ0LDEuMTExNDQsMS4xNjkzOSwxLjIxMjM3LC45NzU0LDEuMjEyNjEsLjk3NTQsMS41OTc1NCwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwuODEzNzgsLjgxMzc4LDEuMjEyMzcsMS4yMTIzNywxLjIxMjM3LC43MzU0MSwuOTc4NDcsLjk3MzYzLC44OTcyMywuODc4OTcsMS4wNDI2LC43OTQyOSwuODUyOTIsLjkxMTQ5LDEuMDU4MTUsMS4xNDA2LC43OTYzMSwuOTAxMjgsLjgzODUzLDEuMDQzOTYsMS4xMDYxNSwuOTc1NTIsLjk0NDM2LC45NzU1MiwuODg2NDEsLjgwNTI3LC45NjA4MywxLjAwMTM1LDEsMS4wNjc3NywuOTgxNywuOTExNDIsLjk5MzYxLDEuMTExNDQsMS41NzI5MywxLjExMTQ0LDEuMjEyMzcsLjc0NjI3LDEuMzE4MTgsMS4wNjU4NSwuOTcwNDIsLjgzMDU1LC45NzA0MiwuOTM1MDMsMS4xMjYxLC45NzA0MiwuOTc5MjIsMS4xNDIzNiwuOTQ1NTIsMS4wMTA1NCwxLjE0MjM2LDEuMDI0NzEsLjk3OTIyLC45NDE2NSwuOTcwNDIsLjk3MDQyLDEuMDI3NiwuNzg5MjksMS4xMjYxLC45NzkyMiwuOTU4NzQsMS4wMjE5NywuOTg1MDcsLjk2NzUyLC45NzE2OCwuOTUxMDcsMS4xNjU3OSwuOTUxMDcsMS4yMTIzNywxLjAzOTU5LDEuMDM2LDEuMDM2LDEsMS4wMzYsMS4xNjU3OSwuODczNTcsMS4zMTgxOCwxLjE4NzU0LDEuMjY3ODEsMS4wNTM1NiwxLjIxMjM3LDEuMTg2MjIsLjc5NDg3LC45NDk5NCwxLjI5MDA0LDEuMjQwNDcsMS4yNDA0NywxLjMxODE4LDEsLjkxNDg0LC45NzU0LDEuMzE4MTgsMS4xMzQ5LDEuMjQ4NjYsMS4wNTM1NiwxLjEzOTM0LDEuMTU1NzQsMS4xNzM4OSwuNzM1NDEsLjk3MzYzLC45NzM2MywuOTczNjMsLjk3MzYzLC45NzM2MywuOTczNjMsLjk0Mzg1LC44Nzg5NywuNzk0MjksLjc5NDI5LC43OTQyOSwuNzk0MjksMS4xNDA2LDEuMTQwNiwxLjE0MDYsMS4xNDA2LDEuMDQyNiwxLjEwNjE1LC45NzU1MiwuOTc1NTIsLjk3NTUyLC45NzU1MiwuOTc1NTIsMS4yMTIzNywuOTc1NTIsMS4wMDEzNSwxLjAwMTM1LDEuMDAxMzUsMS4wMDEzNSwuOTExNDIsLjk0NDM2LC45ODcyMSwxLjA2NTg1LDEuMDY1ODUsMS4wNjU4NSwxLjA2NTg1LDEuMDY1ODUsMS4wNjU4NSwuOTY3MDUsLjgzMDU1LC45MzUwMywuOTM1MDMsLjkzNTAzLC45MzUwMywxLjE0MjM2LDEuMTQyMzYsMS4xNDIzNiwxLjE0MjM2LC45MzEyNSwuOTc5MjIsLjk0MTY1LC45NDE2NSwuOTQxNjUsLjk0MTY1LC45NDE2NSwxLjI5MDA0LC45NDE2NSwuOTc5MjIsLjk3OTIyLC45NzkyMiwuOTc5MjIsLjk2NzUyLC45NzA0MiwuOTY3NTIsLjk3MzYzLDEuMDY1ODUsLjk3MzYzLDEuMDY1ODUsLjk3MzYzLDEuMDY1ODUsLjg3ODk3LC44MzA1NSwuODc4OTcsLjgzMDU1LC44Nzg5NywuODMwNTUsLjg3ODk3LC44MzA1NSwxLjA0MjYsMS4wMDMzLDEuMDQyNiwuOTcwNDIsLjc5NDI5LC45MzUwMywuNzk0MjksLjkzNTAzLC43OTQyOSwuOTM1MDMsLjc5NDI5LC45MzUwMywuNzk0MjksLjkzNTAzLC45MTE0OSwuOTcwNDIsLjkxMTQ5LC45NzA0MiwuOTExNDksLjk3MDQyLDEsMSwxLjA1ODE1LC45NzkyMiwxLjA1ODE1LC45NzkyMiwxLjE0MDYsMS4xNDIzNiwxLjE0MDYsMS4xNDIzNiwxLjE0MDYsMS4xNDIzNiwxLjE0MDYsMS4xNDIzNiwxLjE0MDYsMS4xNDIzNiwuOTc0NDEsMS4wNDMwMiwuNzk2MzEsMS4wMTU4MiwxLDEsMS4wMTA1NCwuODM4NTMsMS4xNDIzNiwxLDEsLjgzODUzLDEuMDkxMjUsLjgzODUzLC45MDQxOCwuODM4NTMsMS4xOTUwOCwxLjEwNjE1LC45NzkyMiwxLDEsMS4xMDYxNSwuOTc5MjIsMS4wMTAzNCwxLjEwNDY2LC45NzkyMiwuOTc1NTIsLjk0MTY1LC45NzU1MiwuOTQxNjUsLjk3NTUyLC45NDE2NSwuOTE2MDIsLjkxOTgxLC44ODY0MSwxLjAyNzYsMSwxLC44ODY0MSwxLjAyNzYsLjgwNTI3LC43ODkyOSwuODA1MjcsLjc4OTI5LC44MDUyNywuNzg5MjksLjgwNTI3LC43ODkyOSwxLDEsLjk2MDgzLDEuMDU0MDMsLjk1OTIzLDEuMTY4NjIsMS4wMDEzNSwuOTc5MjIsMS4wMDEzNSwuOTc5MjIsMS4wMDEzNSwuOTc5MjIsMS4wMDEzNSwuOTc5MjIsMS4wMDEzNSwuOTc5MjIsMS4wMDEzNSwuOTc5MjIsMS4wNjc3NywxLjAyMTk3LC45MTE0MiwuOTY3NTIsLjkxMTQyLC45OTM2MSwuOTcxNjgsLjk5MzYxLC45NzE2OCwuOTkzNjEsLjk3MTY4LDEuMjMxOTksMS4wMzYsLjk3MzYzLDEuMDY1ODUsLjk0Mzg1LC45NjcwNSwuOTc1NTIsLjk0MTY1LDEsMSwuOTYwODMsMS4xMjYxLDEuMzE4MTgsMS4zMTgxOCwxLjMxODE4LDEuMzE4MTgsMS4zMTgxOCwxLjMxODE4LDEuMzE4MTgsMS4zMTgxOCwxLjMxODE4LC45NTE2MSwxLjI3MTI2LDEuMDA4MTEsLjgzMjg0LC43NzcwMiwuOTkxMzcsLjk1MjUzLDEuMDM0NywuODYxNDIsMS4wNzIwNSwxLjE0MjM2LC45NzM2MywuODk3MjMsLjg2ODY5LDEuMDk4MTgsLjc5NDI5LC45OTM2MSwxLjA1ODE1LC45NzU1MiwxLjE0MDYsLjkwMTI4LDEuMDY2NjIsMS4wNDM5NiwxLjEwNjE1LC44NDkxOCwuOTc1NTIsMS4wNDY5NCwuOTQ0MzYsLjk4MDE1LC45NjA4MywuOTExNDIsMS4wMDM1NiwuOTgxNywxLjAxOTQ1LC45ODk5OSwxLjE0MDYsLjkxMTQyLDEuMDQ5NjEsLjk4OTgsMS4wMDYzOSwxLjE0MjM2LDEuMDc1MTQsMS4wNDk2MSwuOTk2MDcsMS4wMjg5NywxLjAwOCwuOTg5OCwuOTUxMzQsMS4wMDYzOSwxLjExMTIxLDEuMTQyMzYsMS4wMDUxOCwuOTc5ODEsMS4wMjE4NiwxLDEuMDg1NzgsLjk0MTY1LC45OTMxNCwuOTgzODcsLjkzMDI4LC45MzM3NywxLjM1MTI1LDEuMDc1MTQsMS4xMDY4NywuOTM0OTEsMS4wNDIzMiwxLjAwMzUxLDEuMTQyMzYsMS4wNzUxNCwuOTQxNjUsMS4wNzUxNCwxLjAwMzUxLC43OTQyOSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjA5MDk3LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC45MzUwMywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTY2MDksMSwxLDEsMSwxLDEsMS4wNjc3NywxLjAyMTk3LDEuMDY3NzcsMS4wMjE5NywxLjA2Nzc3LDEuMDIxOTcsLjkxMTQyLC45Njc1MiwxLDEuMjEyNjEsLjg5OTAzLDEsMSwuNzUxNTUsMS4wNDc0NSwxLjA0NzQ1LDEuMDQ3NDUsMS4wNDM5NCwuOTg2MzMsLjk4NjMzLC45ODYzMywuNzI5NTksLjcyOTU5LDEuMjA1MDIsLjkxNDA2LDEuMjY1MTQsMS4yMjIsMS4wMjk1NiwxLjAzMzcyLDEuMDMzNzIsLjk2MDM5LDEuMjQ2MzMsMSwxLjA5MTI1LC45MzMyNywxLjAzMzM2LDEuMTY1NDEsMS4wMzYsMSwxLDEsLjc3MSwxLDEsMS4xNTU3NCwxLjE1NTc0LDEuMTU1NzQsMS4xNTU3NCwuODYzNjQsLjk0NDM0LC44NjI3OSwuOTQ0MzQsLjg2MjI0LDEsMSwxLjE2Nzk4LDEsLjk2MDg1LC45MDA2OCwxLjIxMjM3LDEuMTg0MTYsMS4xMzkwNCwuNjk4MjUsLjk3MTYsMi4xMDMzOSwxLjI5MDA0LDEuMjkwMDQsMS4yMTMzOSwxLjI5MDA0LDEuMjkwMDQsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjQyNjAzLDEsLjk5ODYyLC45OTg2MiwxLC44NzAyNSwuODcwMjUsLjg3MDI1LC44NzAyNSwxLjE4Nzc1LDEuNDI2MDMsMSwxLjQyNjAzLDEuNDI2MDMsLjk5ODYyLDEsMSwxLDEsMSwxLjI4ODYsMS4wNDMxNSwxLjE1Mjk2LDEuMzQxNjMsMSwxLDEsMS4xMzI2OSwxLjEzMjY5LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0LlNlZ29ldWlCb2xkSXRhbGljTWV0cmljcz17bGluZUhlaWdodDoxLjMzMDA4LGxpbmVHYXA6MH0sdC5TZWdvZXVpSXRhbGljRmFjdG9ycz1bMS43NjczOCwxLDEsLjk4OTQ2LDEuMTQ3NjMsMS4wNTM2NSwxLjA2MjM0LC45NjkyNywuOTI1ODYsMS4xNTM3MywxLjE4NDE0LC45MTM0OSwuOTEzNDksMS4wNzQwMywxLjE3MzA4LC43ODM4MywxLjIwMDg4LC43ODM4MywxLjQyNTMxLC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuNzgzODMsLjc4MzgzLDEuMTczMDgsMS4xNzMwOCwxLjE3MzA4LC43NzM0OSwuOTQ1NjUsLjk0NzI5LC44NTk0NCwuODg1MDYsLjk4NTgsLjc0ODE3LC44MDAxNiwuODg0NDksLjk4MDM5LC45NTc4MiwuNjkyMzgsLjg5ODk4LC44MzIzMSwuOTgxODMsMS4wMzk4OSwuOTY5MjQsLjg2MjM3LC45NjkyNCwuODA1OTUsLjc0NTI0LC44NjA5MSwuOTU0MDIsLjk0MTQzLC45ODQ0OCwuODg1OCwuODMwODksLjkzMjg1LDEuMDk0OSwxLjM5MDE2LDEuMDk0OSwxLjQ1OTk0LC43NDYyNywxLjA0ODM5LC45NzQ1NCwuOTc0NTQsLjg3MjA3LC45NzQ1NCwuODc1MzMsMS4wNjE1MSwuOTc0NTQsMS4wMDE3NiwxLjE2NDg0LDEuMDgxMzIsLjk4MDQ3LDEuMTY0ODQsMS4wMjk4OSwxLjAxMDU0LC45NjIyNSwuOTc0NTQsLjk3NDU0LDEuMDY1OTgsLjc5MDA0LDEuMTYzNDQsMS4wMDM1MSwuOTQ2MjksLjk5NzMsLjkxMDE2LC45Njc3NywuOTA0MywuOTEwODIsLjkyNDgxLC45MTA4MiwxLjE3MzA4LC45NTc0OCwuOTY5MjcsLjk2OTI3LDEsLjk2OTI3LC45MjQ4MSwuODA1OTcsMS4wNDgzOSwxLjIzMzkzLDEuMTc4MSwuOTI0NSwxLjE3MzA4LDEuMjA4MDgsLjYzMjE4LC45NDI2MSwxLjI0ODIyLDEuMDk5NzEsMS4wOTk3MSwxLjA0ODM5LDEsLjg1MjczLC43ODAzMiwxLjA0ODM5LDEuMDk5NzEsMS4yMjMyNiwuOTI0NSwxLjA5ODM2LDEuMTM1MjUsMS4xNTIyMiwuNzA0MjQsLjk0NzI5LC45NDcyOSwuOTQ3MjksLjk0NzI5LC45NDcyOSwuOTQ3MjksLjg1NDk4LC44ODUwNiwuNzQ4MTcsLjc0ODE3LC43NDgxNywuNzQ4MTcsLjk1NzgyLC45NTc4MiwuOTU3ODIsLjk1NzgyLC45ODU4LDEuMDM5ODksLjk2OTI0LC45NjkyNCwuOTY5MjQsLjk2OTI0LC45NjkyNCwxLjE3MzA4LC45NjkyNCwuOTU0MDIsLjk1NDAyLC45NTQwMiwuOTU0MDIsLjgzMDg5LC44NjIzNywuODg0MDksLjk3NDU0LC45NzQ1NCwuOTc0NTQsLjk3NDU0LC45NzQ1NCwuOTc0NTQsLjkyOTE2LC44NzIwNywuODc1MzMsLjg3NTMzLC44NzUzMywuODc1MzMsLjkzMTQ2LC45MzE0NiwuOTMxNDYsLjkzMTQ2LC45Mzg1NCwxLjAxMDU0LC45NjIyNSwuOTYyMjUsLjk2MjI1LC45NjIyNSwuOTYyMjUsMS4yNDgyMiwuODc2MSwxLjAwMzUxLDEuMDAzNTEsMS4wMDM1MSwxLjAwMzUxLC45Njc3NywuOTc0NTQsLjk2Nzc3LC45NDcyOSwuOTc0NTQsLjk0NzI5LC45NzQ1NCwuOTQ3MjksLjk3NDU0LC44ODUwNiwuODcyMDcsLjg4NTA2LC44NzIwNywuODg1MDYsLjg3MjA3LC44ODUwNiwuODcyMDcsLjk4NTgsLjk1MzkxLC45ODU4LC45NzQ1NCwuNzQ4MTcsLjg3NTMzLC43NDgxNywuODc1MzMsLjc0ODE3LC44NzUzMywuNzQ4MTcsLjg3NTMzLC43NDgxNywuODc1MzMsLjg4NDQ5LC45NzQ1NCwuODg0NDksLjk3NDU0LC44ODQ0OSwuOTc0NTQsMSwxLC45ODAzOSwxLjAwMTc2LC45ODAzOSwxLjAwMTc2LC45NTc4MiwuOTMxNDYsLjk1NzgyLC45MzE0NiwuOTU3ODIsLjkzMTQ2LC45NTc4MiwxLjE2NDg0LC45NTc4MiwuOTMxNDYsLjg0NDIxLDEuMTI3NjEsLjY5MjM4LDEuMDgxMzIsMSwxLC45ODA0NywuODMyMzEsMS4xNjQ4NCwxLDEsLjg0NzIzLDEuMDQ4NjEsLjg0NzIzLC43ODc1NSwuODMyMzEsMS4yMzczNiwxLjAzOTg5LDEuMDEwNTQsMSwxLDEuMDM5ODksMS4wMTA1NCwuOTg1NywxLjAzODQ5LDEuMDEwNTQsLjk2OTI0LC45NjIyNSwuOTY5MjQsLjk2MjI1LC45NjkyNCwuOTYyMjUsLjkyMzgzLC45MDE3MSwuODA1OTUsMS4wNjU5OCwxLDEsLjgwNTk1LDEuMDY1OTgsLjc0NTI0LC43OTAwNCwuNzQ1MjQsLjc5MDA0LC43NDUyNCwuNzkwMDQsLjc0NTI0LC43OTAwNCwxLDEsLjg2MDkxLDEuMDI3NTksLjg1NzcxLDEuMTYzNDQsLjk1NDAyLDEuMDAzNTEsLjk1NDAyLDEuMDAzNTEsLjk1NDAyLDEuMDAzNTEsLjk1NDAyLDEuMDAzNTEsLjk1NDAyLDEuMDAzNTEsLjk1NDAyLDEuMDAzNTEsLjk4NDQ4LC45OTczLC44MzA4OSwuOTY3NzcsLjgzMDg5LC45MzI4NSwuOTA0MywuOTMyODUsLjkwNDMsLjkzMjg1LC45MDQzLDEuMzE4NjgsLjk2OTI3LC45NDcyOSwuOTc0NTQsLjg1NDk4LC45MjkxNiwuOTY5MjQsLjg3NjEsMSwxLC44NjA5MSwxLjE2MzQ0LDEuMDQ4MzksMS4wNDgzOSwxLjA0ODM5LDEuMDQ4MzksMS4wNDgzOSwxLjA0ODM5LDEuMDQ4MzksMS4wNDgzOSwxLjA0ODM5LC44MTk2NSwuODE5NjUsLjk0NzI5LC43ODAzMiwuNzEwMjIsLjkwODgzLC44NDE3MSwuOTk4NzcsLjc3NTk2LDEuMDU3MzQsMS4yLC45NDcyOSwuODU5NDQsLjgyNzkxLC45NjA3LC43NDgxNywuOTMyODUsLjk4MDM5LC45NjkyNCwuOTU3ODIsLjg5ODk4LC45ODMxNiwuOTgxODMsMS4wMzk4OSwuNzg2MTQsLjk2OTI0LC45NzY0MiwuODYyMzcsLjg2MDc1LC44NjA5MSwuODMwODksLjkwMDgyLC44ODU4LC45NzI5NiwxLjAxMjg0LC45NTc4MiwuODMwODksMS4wOTc2LDEuMDQsMS4wMzM0MiwxLjIsMS4wNjc1LDEuMDk3NiwuOTgyMDUsMS4wMzgwOSwxLjA1MDk3LDEuMDQsLjk1MzY0LDEuMDMzNDIsMS4wNTQwMSwxLjIsMS4wMjE0OCwxLjAxMTksMS4wNDcyNCwxLjAxMjcsMS4wMjczMiwuOTYyMjUsLjg5NjUsLjk3NzgzLC45MzU3NCwuOTQ4MTgsMS4zMDY3OSwxLjA2NzUsMS4xMTgyNiwuOTk4MjEsMS4wNTU3LDEuMDMyNiwxLjIsMS4wNjc1LC45NjIyNSwxLjA2NzUsMS4wMzI2LC43NDgxNywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjAzNzU0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44NzUzMywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTg3MDUsMSwxLDEsMSwxLDEsLjk4NDQ4LC45OTczLC45ODQ0OCwuOTk3MywuOTg0NDgsLjk5NzMsLjgzMDg5LC45Njc3NywxLDEuMjAwODgsLjg5OTAzLDEsMSwuNzUxNTUsLjk0OTQ1LC45NDk0NSwuOTQ5NDUsLjk0OTQ1LDEuMTIzMTcsMS4xMjMxNywxLjEyMzE3LC42NzYwMywuNjc2MDMsMS4xNTYyMSwuNzM1ODQsMS4yMTE5MSwxLjIyMTM1LDEuMDY0ODMsLjk0ODY4LC45NDg2OCwuOTU5OTYsMS4yNDYzMywxLDEuMDc0OTcsLjg3NzA5LC45NjkyNywxLjAxNDczLC45NjkyNywxLDEsMSwuNzcyOTUsMSwxLDEuMDk4MzYsMS4wOTgzNiwxLjA5ODM2LDEuMDE1MjIsLjg2MzIxLC45NDQzNCwuODY0OSwuOTQ0MzQsLjg2MTgyLDEsMSwxLjA4MywxLC45MTU3OCwuODY0MzgsMS4xNzMwOCwxLjE4NDE2LDEuMTQ1ODksLjY5ODI1LC45NzYyMiwxLjk2NzkxLDEuMjQ4MjIsMS4yNDgyMiwxLjE3MzA4LDEuMjQ4MjIsMS4yNDgyMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuNDI2MDMsMSwuOTk4NjIsLjk5ODYyLDEsLjg3MDI1LC44NzAyNSwuODcwMjUsLjg3MDI1LDEuMTc5ODQsMS40MjYwMywxLDEuNDI2MDMsMS40MjYwMywuOTk4NjIsMSwxLDEsMSwxLDEuMjg4NiwxLjA0MzE1LDEuMTUyOTYsMS4zNDE2MywxLDEsMSwxLjEwNzQyLDEuMTA3NDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdLHQuU2Vnb2V1aUl0YWxpY01ldHJpY3M9e2xpbmVIZWlnaHQ6MS4zMzAwOCxsaW5lR2FwOjB9LHQuU2Vnb2V1aVJlZ3VsYXJGYWN0b3JzPVsxLjc2NzM4LDEsMSwuOTg1OTQsMS4wMjI4NSwxLjEwNDU0LDEuMDYyMzQsLjk2OTI3LC45MjAzNywxLjE5OTg1LDEuMjA0NiwuOTA2MTYsLjkwNjE2LDEuMDcxNTIsMS4xNzE0LC43ODAzMiwxLjIwMDg4LC43ODAzMiwxLjQwMjQ2LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuNzgwMzIsLjc4MDMyLDEuMTcxNCwxLjE3MTQsMS4xNzE0LC44MDU5NywuOTQwODQsLjk2NzA2LC44NTk0NCwuODU3MzQsLjk3MDkzLC43NTg0MiwuNzk5MzYsLjg4MTk4LC45ODMxLC45NTc4MiwuNzEzODcsLjg2OTY5LC44NDYzNiwxLjA3Nzk2LDEuMDM1ODQsLjk2OTI0LC44Mzk2OCwuOTY5MjQsLjgyODI2LC43OTY0OSwuODU3NzEsLjk1MTMyLC45MzExOSwuOTg5NjUsLjg4NDMzLC44Mjg3LC45MzM2NSwxLjA4NjEyLDEuMzYzOCwxLjA4NjEyLDEuNDU3ODYsLjc0NjI3LC44MDQ5OSwuOTE0ODQsMS4wNTcwNywuOTIzODMsMS4wNTg4MiwuOTQwMywxLjEyNjU0LDEuMDU4ODIsMS4wMTc1NiwxLjA5MDExLDEuMDkwMTEsLjk5NDE0LDEuMDkwMTEsMS4wMzQsMS4wMTc1NiwxLjA1MzU2LDEuMDU3MDcsMS4wNTg4MiwxLjA0Mzk5LC44NDg2MywxLjIxOTY4LDEuMDE3NTYsLjk1ODAxLDEuMDAwNjgsLjkxNzk3LC45Njc3NywuOTA0MywuOTAzNTEsLjkyMTA1LC45MDM1MSwxLjE3MTQsLjg1MzM3LC45NjkyNywuOTY5MjcsLjk5OTEyLC45NjkyNywuOTIxMDUsLjgwNTk3LDEuMjQzNCwxLjIwODA4LDEuMDU5MzcsLjkwOTU3LDEuMTcxNCwxLjIwODA4LC43NTE1NSwuOTQyNjEsMS4yNDY0NCwxLjA5OTcxLDEuMDk5NzEsLjg0NzUxLDEsLjg1MjczLC43ODAzMiwuNjE1ODQsMS4wNTQyNSwxLjE3OTE0LC45MDk1NywxLjA4NjY1LDEuMTE1OTMsMS4xNDE2OSwuNzMzODEsLjk2NzA2LC45NjcwNiwuOTY3MDYsLjk2NzA2LC45NjcwNiwuOTY3MDYsLjg2MDM1LC44NTczNCwuNzU4NDIsLjc1ODQyLC43NTg0MiwuNzU4NDIsLjk1NzgyLC45NTc4MiwuOTU3ODIsLjk1NzgyLC45NzA5MywxLjAzNTg0LC45NjkyNCwuOTY5MjQsLjk2OTI0LC45NjkyNCwuOTY5MjQsMS4xNzE0LC45NjkyNCwuOTUxMzIsLjk1MTMyLC45NTEzMiwuOTUxMzIsLjgyODcsLjgzOTY4LC44OTA0OSwuOTE0ODQsLjkxNDg0LC45MTQ4NCwuOTE0ODQsLjkxNDg0LC45MTQ4NCwuOTM1NzUsLjkyMzgzLC45NDAzLC45NDAzLC45NDAzLC45NDAzLC44NzE3LC44NzE3LC44NzE3LC44NzE3LDEuMDA1MjcsMS4wMTc1NiwxLjA1MzU2LDEuMDUzNTYsMS4wNTM1NiwxLjA1MzU2LDEuMDUzNTYsMS4yNDY0NCwuOTU5MjMsMS4wMTc1NiwxLjAxNzU2LDEuMDE3NTYsMS4wMTc1NiwuOTY3NzcsMS4wNTcwNywuOTY3NzcsLjk2NzA2LC45MTQ4NCwuOTY3MDYsLjkxNDg0LC45NjcwNiwuOTE0ODQsLjg1NzM0LC45MjM4MywuODU3MzQsLjkyMzgzLC44NTczNCwuOTIzODMsLjg1NzM0LC45MjM4MywuOTcwOTMsMS4wOTY5LC45NzA5MywxLjA1ODgyLC43NTg0MiwuOTQwMywuNzU4NDIsLjk0MDMsLjc1ODQyLC45NDAzLC43NTg0MiwuOTQwMywuNzU4NDIsLjk0MDMsLjg4MTk4LDEuMDU4ODIsLjg4MTk4LDEuMDU4ODIsLjg4MTk4LDEuMDU4ODIsMSwxLC45ODMxLDEuMDE3NTYsLjk4MzEsMS4wMTc1NiwuOTU3ODIsLjg3MTcsLjk1NzgyLC44NzE3LC45NTc4MiwuODcxNywuOTU3ODIsMS4wOTAxMSwuOTU3ODIsLjg3MTcsLjg0Nzg0LDEuMTE1NTEsLjcxMzg3LDEuMDkwMTEsMSwxLC45OTQxNCwuODQ2MzYsMS4wOTAxMSwxLDEsLjg0NjM2LDEuMDUzNiwuODQ2MzYsLjk0Mjk4LC44NDYzNiwxLjIzMjk3LDEuMDM1ODQsMS4wMTc1NiwxLDEsMS4wMzU4NCwxLjAxNzU2LDEuMDAzMjMsMS4wMzQ0NCwxLjAxNzU2LC45NjkyNCwxLjA1MzU2LC45NjkyNCwxLjA1MzU2LC45NjkyNCwxLjA1MzU2LC45MzA2NiwuOTgyOTMsLjgyODI2LDEuMDQzOTksMSwxLC44MjgyNiwxLjA0Mzk5LC43OTY0OSwuODQ4NjMsLjc5NjQ5LC44NDg2MywuNzk2NDksLjg0ODYzLC43OTY0OSwuODQ4NjMsMSwxLC44NTc3MSwxLjE3MzE4LC44NTc3MSwxLjIxOTY4LC45NTEzMiwxLjAxNzU2LC45NTEzMiwxLjAxNzU2LC45NTEzMiwxLjAxNzU2LC45NTEzMiwxLjAxNzU2LC45NTEzMiwxLjAxNzU2LC45NTEzMiwxLjAxNzU2LC45ODk2NSwxLjAwMDY4LC44Mjg3LC45Njc3NywuODI4NywuOTMzNjUsLjkwNDMsLjkzMzY1LC45MDQzLC45MzM2NSwuOTA0MywxLjA4NTcxLC45NjkyNywuOTY3MDYsLjkxNDg0LC44NjAzNSwuOTM1NzUsLjk2OTI0LC45NTkyMywxLDEsLjg1NzcxLDEuMjE5NjgsMS4xMTQzNywxLjExNDM3LC45MzEwOSwuOTEyMDIsLjYwNDExLC44NDE2NCwuNTU1NzIsMS4wMTE3MywuOTczNjEsLjgxODE4LC44MTgxOCwuOTY2MzUsLjc4MDMyLC43MjcyNywuOTIzNjYsLjk4NjAxLDEuMDM0MDUsLjc3OTY4LDEuMDk3OTksMS4yLC45NjcwNiwuODU5NDQsLjg1NjM4LC45NjQ5MSwuNzU4NDIsLjkzMzY1LC45ODMxLC45NjkyNCwuOTU3ODIsLjg2OTY5LC45NDE1MiwxLjA3Nzk2LDEuMDM1ODQsLjc4NDM3LC45NjkyNCwuOTg3MTUsLjgzOTY4LC44MzQ5MSwuODU3NzEsLjgyODcsLjk0NDkyLC44ODQzMywuOTI4NywxLjAwOTgsLjk1NzgyLC44Mjg3LDEuMDYyNSwuOTgyNDgsMS4wMzQyNCwxLjIsMS4wMTA3MSwxLjA2MjUsLjk1MjQ2LDEuMDM4MDksMS4wNDkxMiwuOTgyNDgsMS4wMDIyMSwxLjAzNDI0LDEuMDU0NDMsMS4yLDEuMDQ3ODUsLjk5NjA5LDEuMDAxNjksMS4wNTE3NiwuOTkzNDYsMS4wNTM1NiwuOTA4NywxLjAzMDA0LC45NTU0MiwuOTMxMTcsMS4yMzM2MiwxLjAxMDcxLDEuMDc4MzEsMS4wMjUxMiwxLjA1MjA1LDEuMDM1MDIsMS4yLDEuMDEwNzEsMS4wNTM1NiwxLjAxMDcxLDEuMDM1MDIsLjc1ODQyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDM3MTksMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjk0MDMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4wNDAyMSwxLDEsMSwxLDEsMSwuOTg5NjUsMS4wMDA2OCwuOTg5NjUsMS4wMDA2OCwuOTg5NjUsMS4wMDA2OCwuODI4NywuOTY3NzcsMSwxLjIwMDg4LC44OTkwMywxLDEsLjc1MTU1LDEuMDMwNzcsMS4wMzA3NywxLjAzMDc3LDEuMDMwNzcsMS4xMzE5NiwxLjEzMTk2LDEuMTMxOTYsLjY3NDI4LC42NzQyOCwxLjE2MDM5LC43MzI5MSwxLjIwOTk2LDEuMjIxMzUsMS4wNjQ4MywuOTQ4NjgsLjk0ODY4LC45NTk5NiwxLjI0NjMzLDEsMS4wNzQ5NywuODc3OTYsLjk2OTI3LDEuMDE1MTgsLjk2OTI3LDEsMSwxLC43NzI5NSwxLDEsMS4xMDUzOSwxLjEwNTM5LDEuMTEzNTgsMS4wNjk2NywuODYyNzksLjk0NDM0LC44NjI3OSwuOTQ0MzQsLjg2MTgyLDEsMSwxLjA4MywxLC45MTU3OCwuODY1MDcsMS4xNzE0LDEuMTg0MTYsMS4xNDU4OSwuNjk4MjUsLjk3NjIyLDEuOTY5NywxLjI0ODIyLDEuMjQ4MjIsMS4xNzIzOCwxLjI0ODIyLDEuMjQ4MjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjQyNjAzLDEsLjk5ODYyLC45OTg2MiwxLC44NzAyNSwuODcwMjUsLjg3MDI1LC44NzAyNSwxLjE4MDgzLDEuNDI2MDMsMSwxLjQyNjAzLDEuNDI2MDMsLjk5ODYyLDEsMSwxLDEsMSwxLjI4ODYsMS4wNDMxNSwxLjE1Mjk2LDEuMzQxNjMsMSwxLDEsMS4xMDkzOCwxLjEwOTM4LDEsMSwxLDEuMDU0MjUsMS4wOTk3MSwxLjA5OTcxLDEuMDk5NzEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0LlNlZ29ldWlSZWd1bGFyTWV0cmljcz17bGluZUhlaWdodDoxLjMzMDA4LGxpbmVHYXA6MH19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Qb3N0U2NyaXB0RXZhbHVhdG9yPXQuUG9zdFNjcmlwdENvbXBpbGVyPXQuUERGRnVuY3Rpb25GYWN0b3J5PXZvaWQgMCx0LmlzUERGRnVuY3Rpb249ZnVuY3Rpb24oZSl7bGV0IHQ7aWYoZSBpbnN0YW5jZW9mIG4uRGljdCl0PWU7ZWxzZXtpZighKGUgaW5zdGFuY2VvZiBvLkJhc2VTdHJlYW0pKXJldHVybiExO3Q9ZS5kaWN0fXJldHVybiB0LmhhcygiRnVuY3Rpb25UeXBlIil9LHIoMikscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDE1OSk7dmFyIG49cigxNTApLGE9cigxNDQpLHM9cigyMDgpLG89cigxNTEpLGM9cigyMDkpO2Z1bmN0aW9uIGwoZSl7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG51bGw7Y29uc3QgdD1lLmxlbmd0aDtmb3IobGV0IHI9MDtyPHQ7cisrKWlmKCJudW1iZXIiIT10eXBlb2YgZVtyXSl7Y29uc3Qgcj1uZXcgQXJyYXkodCk7Zm9yKGxldCBuPTA7bjx0O24rKylyW25dPStlW25dO3JldHVybiByfXJldHVybiBlfXQuUERGRnVuY3Rpb25GYWN0b3J5PWNsYXNze2NvbnN0cnVjdG9yKGUpe2xldHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOnI9ITB9PWU7dGhpcy54cmVmPXQsdGhpcy5pc0V2YWxTdXBwb3J0ZWQ9ITEhPT1yfWNyZWF0ZShlKXtjb25zdCB0PXRoaXMuZ2V0Q2FjaGVkKGUpO2lmKHQpcmV0dXJuIHQ7Y29uc3Qgcj1oLnBhcnNlKHt4cmVmOnRoaXMueHJlZixpc0V2YWxTdXBwb3J0ZWQ6dGhpcy5pc0V2YWxTdXBwb3J0ZWQsZm46ZSBpbnN0YW5jZW9mIG4uUmVmP3RoaXMueHJlZi5mZXRjaChlKTplfSk7cmV0dXJuIHRoaXMuX2NhY2hlKGUscikscn1jcmVhdGVGcm9tQXJyYXkoZSl7Y29uc3QgdD10aGlzLmdldENhY2hlZChlKTtpZih0KXJldHVybiB0O2NvbnN0IHI9aC5wYXJzZUFycmF5KHt4cmVmOnRoaXMueHJlZixpc0V2YWxTdXBwb3J0ZWQ6dGhpcy5pc0V2YWxTdXBwb3J0ZWQsZm5PYmo6ZSBpbnN0YW5jZW9mIG4uUmVmP3RoaXMueHJlZi5mZXRjaChlKTplfSk7cmV0dXJuIHRoaXMuX2NhY2hlKGUscikscn1nZXRDYWNoZWQoZSl7dmFyIHQ7bGV0IHI7aWYoZSBpbnN0YW5jZW9mIG4uUmVmP3I9ZTplIGluc3RhbmNlb2Ygbi5EaWN0P3I9ZS5vYmpJZDplIGluc3RhbmNlb2Ygby5CYXNlU3RyZWFtJiYocj1udWxsPT09KHQ9ZS5kaWN0KXx8dm9pZCAwPT09dD92b2lkIDA6dC5vYmpJZCkscil7Y29uc3QgZT10aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUuZ2V0QnlSZWYocik7aWYoZSlyZXR1cm4gZX1yZXR1cm4gbnVsbH1fY2FjaGUoZSx0KXt2YXIgcjtpZighdCl0aHJvdyBuZXcgRXJyb3IoJ1BERkZ1bmN0aW9uRmFjdG9yeS5fY2FjaGUgLSBleHBlY3RlZCAicGFyc2VkRnVuY3Rpb24iIGFyZ3VtZW50LicpO2xldCBhO2UgaW5zdGFuY2VvZiBuLlJlZj9hPWU6ZSBpbnN0YW5jZW9mIG4uRGljdD9hPWUub2JqSWQ6ZSBpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbSYmKGE9bnVsbD09PShyPWUuZGljdCl8fHZvaWQgMD09PXI/dm9pZCAwOnIub2JqSWQpLGEmJnRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZS5zZXQobnVsbCxhLHQpfWdldCBfbG9jYWxGdW5jdGlvbkNhY2hlKCl7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIl9sb2NhbEZ1bmN0aW9uQ2FjaGUiLG5ldyBjLkxvY2FsRnVuY3Rpb25DYWNoZSl9fTtjbGFzcyBoe3N0YXRpYyBnZXRTYW1wbGVBcnJheShlLHQscixuKXtsZXQgYSxpLHM9MTtmb3IoYT0wLGk9ZS5sZW5ndGg7YTxpO2ErKylzKj1lW2FdO3MqPXQ7Y29uc3Qgbz1uZXcgQXJyYXkocyk7bGV0IGM9MCxsPTA7Y29uc3QgaD0xLygyKipyLTEpLHU9bi5nZXRCeXRlcygocypyKzcpLzgpO2xldCBkPTA7Zm9yKGE9MDthPHM7YSsrKXtmb3IoO2M8cjspbDw8PTgsbHw9dVtkKytdLGMrPTg7Yy09cixvW2FdPShsPj5jKSpoLGwmPSgxPDxjKS0xfXJldHVybiBvfXN0YXRpYyBwYXJzZShlKXtsZXR7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDpyLGZuOm59PWU7Y29uc3QgaT1uLmRpY3R8fG47c3dpdGNoKGkuZ2V0KCJGdW5jdGlvblR5cGUiKSl7Y2FzZSAwOnJldHVybiB0aGlzLmNvbnN0cnVjdFNhbXBsZWQoe3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6cixmbjpuLGRpY3Q6aX0pO2Nhc2UgMTpicmVhaztjYXNlIDI6cmV0dXJuIHRoaXMuY29uc3RydWN0SW50ZXJwb2xhdGVkKHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOnIsZGljdDppfSk7Y2FzZSAzOnJldHVybiB0aGlzLmNvbnN0cnVjdFN0aWNoZWQoe3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6cixkaWN0Oml9KTtjYXNlIDQ6cmV0dXJuIHRoaXMuY29uc3RydWN0UG9zdFNjcmlwdCh7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDpyLGZuOm4sZGljdDppfSl9dGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZSBvZiBmdW5jdGlvbiIpfXN0YXRpYyBwYXJzZUFycmF5KGUpe2xldHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOnIsZm5PYmo6bn09ZTtpZighQXJyYXkuaXNBcnJheShuKSlyZXR1cm4gdGhpcy5wYXJzZSh7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDpyLGZuOm59KTtjb25zdCBhPVtdO2Zvcihjb25zdCBlIG9mIG4pYS5wdXNoKHRoaXMucGFyc2Uoe3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6cixmbjp0LmZldGNoSWZSZWYoZSl9KSk7cmV0dXJuIGZ1bmN0aW9uKGUsdCxyLG4pe2ZvcihsZXQgaT0wLHM9YS5sZW5ndGg7aTxzO2krKylhW2ldKGUsdCxyLG4raSl9fXN0YXRpYyBjb25zdHJ1Y3RTYW1wbGVkKGUpe2xldHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOnIsZm46bixkaWN0Oml9PWU7ZnVuY3Rpb24gcyhlKXtjb25zdCB0PWUubGVuZ3RoLHI9W107bGV0IG49MDtmb3IobGV0IGE9MDthPHQ7YSs9MilyW24rK109W2VbYV0sZVthKzFdXTtyZXR1cm4gcn1mdW5jdGlvbiBvKGUsdCxyLG4sYSl7cmV0dXJuIG4rKGEtbikvKHItdCkqKGUtdCl9bGV0IGM9bChpLmdldEFycmF5KCJEb21haW4iKSksaD1sKGkuZ2V0QXJyYXkoIlJhbmdlIikpO2lmKCFjfHwhaCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiTm8gZG9tYWluIG9yIHJhbmdlIik7Y29uc3QgdT1jLmxlbmd0aC8yLGQ9aC5sZW5ndGgvMjtjPXMoYyksaD1zKGgpO2NvbnN0IGY9bChpLmdldEFycmF5KCJTaXplIikpLGc9aS5nZXQoIkJpdHNQZXJTYW1wbGUiKSxwPWkuZ2V0KCJPcmRlciIpfHwxOzEhPT1wJiYoMCxhLmluZm8pKCJObyBzdXBwb3J0IGZvciBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhdGlvbjogIitwKTtsZXQgbT1sKGkuZ2V0QXJyYXkoIkVuY29kZSIpKTtpZihtKW09cyhtKTtlbHNle209W107Zm9yKGxldCBlPTA7ZTx1OysrZSltLnB1c2goWzAsZltlXS0xXSl9bGV0IGI9bChpLmdldEFycmF5KCJEZWNvZGUiKSk7Yj1iP3MoYik6aDtjb25zdCB5PXRoaXMuZ2V0U2FtcGxlQXJyYXkoZixkLGcsbik7cmV0dXJuIGZ1bmN0aW9uKGUsdCxyLG4pe2NvbnN0IGE9MTw8dSxpPW5ldyBGbG9hdDY0QXJyYXkoYSkscz1uZXcgVWludDMyQXJyYXkoYSk7bGV0IGwsZztmb3IoZz0wO2c8YTtnKyspaVtnXT0xO2xldCBwPWQsdz0xO2ZvcihsPTA7bDx1OysrbCl7Y29uc3Qgcj1jW2xdWzBdLG49Y1tsXVsxXTtsZXQgaD1vKE1hdGgubWluKE1hdGgubWF4KGVbdCtsXSxyKSxuKSxyLG4sbVtsXVswXSxtW2xdWzFdKTtjb25zdCB1PWZbbF07aD1NYXRoLm1pbihNYXRoLm1heChoLDApLHUtMSk7Y29uc3QgZD1oPHUtMT9NYXRoLmZsb29yKGgpOmgtMSxiPWQrMS1oLHk9aC1kLHY9ZCpwLHg9ditwO2ZvcihnPTA7ZzxhO2crKylnJnc/KGlbZ10qPXksc1tnXSs9eCk6KGlbZ10qPWIsc1tnXSs9dik7cCo9dSx3PDw9MX1mb3IoZz0wO2c8ZDsrK2cpe2xldCBlPTA7Zm9yKGw9MDtsPGE7bCsrKWUrPXlbc1tsXStnXSppW2xdO2U9byhlLDAsMSxiW2ddWzBdLGJbZ11bMV0pLHJbbitnXT1NYXRoLm1pbihNYXRoLm1heChlLGhbZ11bMF0pLGhbZ11bMV0pfX19c3RhdGljIGNvbnN0cnVjdEludGVycG9sYXRlZChlKXtsZXR7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDpyLGRpY3Q6bn09ZTtjb25zdCBhPWwobi5nZXRBcnJheSgiQzAiKSl8fFswXSxpPWwobi5nZXRBcnJheSgiQzEiKSl8fFsxXSxzPW4uZ2V0KCJOIiksbz1bXTtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDsrK2Upby5wdXNoKGlbZV0tYVtlXSk7Y29uc3QgYz1vLmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSx0LHIsbil7Y29uc3QgaT0xPT09cz9lW3RdOmVbdF0qKnM7Zm9yKGxldCBlPTA7ZTxjOysrZSlyW24rZV09YVtlXStpKm9bZV19fXN0YXRpYyBjb25zdHJ1Y3RTdGljaGVkKGUpe2xldHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOnIsZGljdDpufT1lO2NvbnN0IGk9bChuLmdldEFycmF5KCJEb21haW4iKSk7aWYoIWkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIk5vIGRvbWFpbiIpO2lmKDEhPWkubGVuZ3RoLzIpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkJhZCBkb21haW4gZm9yIHN0aWNoZWQgZnVuY3Rpb24iKTtjb25zdCBzPVtdO2Zvcihjb25zdCBlIG9mIG4uZ2V0KCJGdW5jdGlvbnMiKSlzLnB1c2godGhpcy5wYXJzZSh7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDpyLGZuOnQuZmV0Y2hJZlJlZihlKX0pKTtjb25zdCBvPWwobi5nZXRBcnJheSgiQm91bmRzIikpLGM9bChuLmdldEFycmF5KCJFbmNvZGUiKSksaD1uZXcgRmxvYXQzMkFycmF5KDEpO3JldHVybiBmdW5jdGlvbihlLHQscixuKXtjb25zdCBhPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT5yP2U9cjplPHQmJihlPXQpLGV9KGVbdF0saVswXSxpWzFdKSxsPW8ubGVuZ3RoO2xldCB1O2Zvcih1PTA7dTxsJiYhKGE8b1t1XSk7Kyt1KTtsZXQgZD1pWzBdO3U+MCYmKGQ9b1t1LTFdKTtsZXQgZj1pWzFdO3U8by5sZW5ndGgmJihmPW9bdV0pO2NvbnN0IGc9Y1syKnVdLHA9Y1syKnUrMV07aFswXT1kPT09Zj9nOmcrKGEtZCkqKHAtZykvKGYtZCksc1t1XShoLDAscixuKX19c3RhdGljIGNvbnN0cnVjdFBvc3RTY3JpcHQoZSl7bGV0e3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6cixmbjpuLGRpY3Q6aX09ZTtjb25zdCBvPWwoaS5nZXRBcnJheSgiRG9tYWluIikpLGM9bChpLmdldEFycmF5KCJSYW5nZSIpKTtpZighbyl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiTm8gZG9tYWluLiIpO2lmKCFjKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJObyByYW5nZS4iKTtjb25zdCBoPW5ldyBzLlBvc3RTY3JpcHRMZXhlcihuKSx1PW5ldyBzLlBvc3RTY3JpcHRQYXJzZXIoaCkucGFyc2UoKTtpZihyJiZhLkZlYXR1cmVUZXN0LmlzRXZhbFN1cHBvcnRlZCl7Y29uc3QgZT0obmV3IEMpLmNvbXBpbGUodSxvLGMpO2lmKGUpcmV0dXJuIG5ldyBGdW5jdGlvbigic3JjIiwic3JjT2Zmc2V0IiwiZGVzdCIsImRlc3RPZmZzZXQiLGUpfSgwLGEuaW5mbykoIlVuYWJsZSB0byBjb21waWxlIFBTIGZ1bmN0aW9uIik7Y29uc3QgZj1jLmxlbmd0aD4+MSxnPW8ubGVuZ3RoPj4xLHA9bmV3IGQodSksbT1PYmplY3QuY3JlYXRlKG51bGwpO2xldCBiPTgxOTI7Y29uc3QgeT1uZXcgRmxvYXQzMkFycmF5KGcpO3JldHVybiBmdW5jdGlvbihlLHQscixuKXtsZXQgYSxpLHM9IiI7Y29uc3Qgbz15O2ZvcihhPTA7YTxnO2ErKylpPWVbdCthXSxvW2FdPWkscys9aSsiXyI7Y29uc3QgbD1tW3NdO2lmKHZvaWQgMCE9PWwpcmV0dXJuIHZvaWQgci5zZXQobCxuKTtjb25zdCBoPW5ldyBGbG9hdDMyQXJyYXkoZiksdT1wLmV4ZWN1dGUobyksZD11Lmxlbmd0aC1mO2ZvcihhPTA7YTxmO2ErKyl7aT11W2QrYV07bGV0IGU9Y1syKmFdO2k8ZT9pPWU6KGU9Y1syKmErMV0saT5lJiYoaT1lKSksaFthXT1pfWI+MCYmKGItLSxtW3NdPWgpLHIuc2V0KGgsbil9fX1jbGFzcyB1e2NvbnN0cnVjdG9yKGUpe3RoaXMuc3RhY2s9ZT9BcnJheS5mcm9tKGUpOltdfXB1c2goZSl7aWYodGhpcy5zdGFjay5sZW5ndGg+PXUuTUFYX1NUQUNLX1NJWkUpdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIG92ZXJmbG93LiIpO3RoaXMuc3RhY2sucHVzaChlKX1wb3AoKXtpZih0aGlzLnN0YWNrLmxlbmd0aDw9MCl0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgdW5kZXJmbG93LiIpO3JldHVybiB0aGlzLnN0YWNrLnBvcCgpfWNvcHkoZSl7aWYodGhpcy5zdGFjay5sZW5ndGgrZT49dS5NQVhfU1RBQ0tfU0laRSl0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgb3ZlcmZsb3cuIik7Y29uc3QgdD10aGlzLnN0YWNrO2ZvcihsZXQgcj10Lmxlbmd0aC1lLG49ZS0xO24+PTA7bi0tLHIrKyl0LnB1c2godFtyXSl9aW5kZXgoZSl7dGhpcy5wdXNoKHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtZS0xXSl9cm9sbChlLHQpe2NvbnN0IHI9dGhpcy5zdGFjayxuPXIubGVuZ3RoLWUsYT1yLmxlbmd0aC0xLGk9bisodC1NYXRoLmZsb29yKHQvZSkqZSk7Zm9yKGxldCBlPW4sdD1hO2U8dDtlKyssdC0tKXtjb25zdCBuPXJbZV07cltlXT1yW3RdLHJbdF09bn1mb3IobGV0IGU9bix0PWktMTtlPHQ7ZSsrLHQtLSl7Y29uc3Qgbj1yW2VdO3JbZV09clt0XSxyW3RdPW59Zm9yKGxldCBlPWksdD1hO2U8dDtlKyssdC0tKXtjb25zdCBuPXJbZV07cltlXT1yW3RdLHJbdF09bn19fWkodSwiTUFYX1NUQUNLX1NJWkUiLDEwMCk7Y2xhc3MgZHtjb25zdHJ1Y3RvcihlKXt0aGlzLm9wZXJhdG9ycz1lfWV4ZWN1dGUoZSl7Y29uc3QgdD1uZXcgdShlKTtsZXQgcj0wO2NvbnN0IG49dGhpcy5vcGVyYXRvcnMsaT1uLmxlbmd0aDtsZXQgcyxvLGM7Zm9yKDtyPGk7KWlmKHM9bltyKytdLCJudW1iZXIiIT10eXBlb2Ygcylzd2l0Y2gocyl7Y2FzZSJqeiI6Yz10LnBvcCgpLG89dC5wb3AoKSxvfHwocj1jKTticmVhaztjYXNlImoiOm89dC5wb3AoKSxyPW87YnJlYWs7Y2FzZSJhYnMiOm89dC5wb3AoKSx0LnB1c2goTWF0aC5hYnMobykpO2JyZWFrO2Nhc2UiYWRkIjpjPXQucG9wKCksbz10LnBvcCgpLHQucHVzaChvK2MpO2JyZWFrO2Nhc2UiYW5kIjpjPXQucG9wKCksbz10LnBvcCgpLCJib29sZWFuIj09dHlwZW9mIG8mJiJib29sZWFuIj09dHlwZW9mIGM/dC5wdXNoKG8mJmMpOnQucHVzaChvJmMpO2JyZWFrO2Nhc2UiYXRhbiI6Yz10LnBvcCgpLG89dC5wb3AoKSxvPU1hdGguYXRhbjIobyxjKS9NYXRoLlBJKjE4MCxvPDAmJihvKz0zNjApLHQucHVzaChvKTticmVhaztjYXNlImJpdHNoaWZ0IjpjPXQucG9wKCksbz10LnBvcCgpLG8+MD90LnB1c2gobzw8Yyk6dC5wdXNoKG8+PmMpO2JyZWFrO2Nhc2UiY2VpbGluZyI6bz10LnBvcCgpLHQucHVzaChNYXRoLmNlaWwobykpO2JyZWFrO2Nhc2UiY29weSI6bz10LnBvcCgpLHQuY29weShvKTticmVhaztjYXNlImNvcyI6bz10LnBvcCgpLHQucHVzaChNYXRoLmNvcyhvJTM2MC8xODAqTWF0aC5QSSkpO2JyZWFrO2Nhc2UiY3ZpIjpvPTB8dC5wb3AoKSx0LnB1c2gobyk7YnJlYWs7Y2FzZSJjdnIiOmJyZWFrO2Nhc2UiZGl2IjpjPXQucG9wKCksbz10LnBvcCgpLHQucHVzaChvL2MpO2JyZWFrO2Nhc2UiZHVwIjp0LmNvcHkoMSk7YnJlYWs7Y2FzZSJlcSI6Yz10LnBvcCgpLG89dC5wb3AoKSx0LnB1c2gobz09PWMpO2JyZWFrO2Nhc2UiZXhjaCI6dC5yb2xsKDIsMSk7YnJlYWs7Y2FzZSJleHAiOmM9dC5wb3AoKSxvPXQucG9wKCksdC5wdXNoKG8qKmMpO2JyZWFrO2Nhc2UiZmFsc2UiOnQucHVzaCghMSk7YnJlYWs7Y2FzZSJmbG9vciI6bz10LnBvcCgpLHQucHVzaChNYXRoLmZsb29yKG8pKTticmVhaztjYXNlImdlIjpjPXQucG9wKCksbz10LnBvcCgpLHQucHVzaChvPj1jKTticmVhaztjYXNlImd0IjpjPXQucG9wKCksbz10LnBvcCgpLHQucHVzaChvPmMpO2JyZWFrO2Nhc2UiaWRpdiI6Yz10LnBvcCgpLG89dC5wb3AoKSx0LnB1c2goby9jfDApO2JyZWFrO2Nhc2UiaW5kZXgiOm89dC5wb3AoKSx0LmluZGV4KG8pO2JyZWFrO2Nhc2UibGUiOmM9dC5wb3AoKSxvPXQucG9wKCksdC5wdXNoKG88PWMpO2JyZWFrO2Nhc2UibG4iOm89dC5wb3AoKSx0LnB1c2goTWF0aC5sb2cobykpO2JyZWFrO2Nhc2UibG9nIjpvPXQucG9wKCksdC5wdXNoKE1hdGgubG9nMTAobykpO2JyZWFrO2Nhc2UibHQiOmM9dC5wb3AoKSxvPXQucG9wKCksdC5wdXNoKG88Yyk7YnJlYWs7Y2FzZSJtb2QiOmM9dC5wb3AoKSxvPXQucG9wKCksdC5wdXNoKG8lYyk7YnJlYWs7Y2FzZSJtdWwiOmM9dC5wb3AoKSxvPXQucG9wKCksdC5wdXNoKG8qYyk7YnJlYWs7Y2FzZSJuZSI6Yz10LnBvcCgpLG89dC5wb3AoKSx0LnB1c2gobyE9PWMpO2JyZWFrO2Nhc2UibmVnIjpvPXQucG9wKCksdC5wdXNoKC1vKTticmVhaztjYXNlIm5vdCI6bz10LnBvcCgpLCJib29sZWFuIj09dHlwZW9mIG8/dC5wdXNoKCFvKTp0LnB1c2gofm8pO2JyZWFrO2Nhc2Uib3IiOmM9dC5wb3AoKSxvPXQucG9wKCksImJvb2xlYW4iPT10eXBlb2YgbyYmImJvb2xlYW4iPT10eXBlb2YgYz90LnB1c2gob3x8Yyk6dC5wdXNoKG98Yyk7YnJlYWs7Y2FzZSJwb3AiOnQucG9wKCk7YnJlYWs7Y2FzZSJyb2xsIjpjPXQucG9wKCksbz10LnBvcCgpLHQucm9sbChvLGMpO2JyZWFrO2Nhc2Uicm91bmQiOm89dC5wb3AoKSx0LnB1c2goTWF0aC5yb3VuZChvKSk7YnJlYWs7Y2FzZSJzaW4iOm89dC5wb3AoKSx0LnB1c2goTWF0aC5zaW4obyUzNjAvMTgwKk1hdGguUEkpKTticmVhaztjYXNlInNxcnQiOm89dC5wb3AoKSx0LnB1c2goTWF0aC5zcXJ0KG8pKTticmVhaztjYXNlInN1YiI6Yz10LnBvcCgpLG89dC5wb3AoKSx0LnB1c2goby1jKTticmVhaztjYXNlInRydWUiOnQucHVzaCghMCk7YnJlYWs7Y2FzZSJ0cnVuY2F0ZSI6bz10LnBvcCgpLG89bzwwP01hdGguY2VpbChvKTpNYXRoLmZsb29yKG8pLHQucHVzaChvKTticmVhaztjYXNlInhvciI6Yz10LnBvcCgpLG89dC5wb3AoKSwiYm9vbGVhbiI9PXR5cGVvZiBvJiYiYm9vbGVhbiI9PXR5cGVvZiBjP3QucHVzaChvIT09Yyk6dC5wdXNoKG9eYyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiVW5rbm93biBvcGVyYXRvciAiLmNvbmNhdChzKSl9ZWxzZSB0LnB1c2gocyk7cmV0dXJuIHQuc3RhY2t9fXQuUG9zdFNjcmlwdEV2YWx1YXRvcj1kO2NsYXNzIGZ7Y29uc3RydWN0b3IoZSl7dGhpcy50eXBlPWV9dmlzaXQoZSl7KDAsYS51bnJlYWNoYWJsZSkoImFic3RyYWN0IG1ldGhvZCIpfX1jbGFzcyBnIGV4dGVuZHMgZntjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIoImFyZ3MiKSx0aGlzLmluZGV4PWUsdGhpcy5taW49dCx0aGlzLm1heD1yfXZpc2l0KGUpe2UudmlzaXRBcmd1bWVudCh0aGlzKX19Y2xhc3MgcCBleHRlbmRzIGZ7Y29uc3RydWN0b3IoZSl7c3VwZXIoImxpdGVyYWwiKSx0aGlzLm51bWJlcj1lLHRoaXMubWluPWUsdGhpcy5tYXg9ZX12aXNpdChlKXtlLnZpc2l0TGl0ZXJhbCh0aGlzKX19Y2xhc3MgbSBleHRlbmRzIGZ7Y29uc3RydWN0b3IoZSx0LHIsbixhKXtzdXBlcigiYmluYXJ5IiksdGhpcy5vcD1lLHRoaXMuYXJnMT10LHRoaXMuYXJnMj1yLHRoaXMubWluPW4sdGhpcy5tYXg9YX12aXNpdChlKXtlLnZpc2l0QmluYXJ5T3BlcmF0aW9uKHRoaXMpfX1jbGFzcyBiIGV4dGVuZHMgZntjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKCJtYXgiKSx0aGlzLmFyZz1lLHRoaXMubWluPWUubWluLHRoaXMubWF4PXR9dmlzaXQoZSl7ZS52aXNpdE1pbih0aGlzKX19Y2xhc3MgeSBleHRlbmRzIGZ7Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKCJ2YXIiKSx0aGlzLmluZGV4PWUsdGhpcy5taW49dCx0aGlzLm1heD1yfXZpc2l0KGUpe2UudmlzaXRWYXJpYWJsZSh0aGlzKX19Y2xhc3MgdyBleHRlbmRzIGZ7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigiZGVmaW5pdGlvbiIpLHRoaXMudmFyaWFibGU9ZSx0aGlzLmFyZz10fXZpc2l0KGUpe2UudmlzaXRWYXJpYWJsZURlZmluaXRpb24odGhpcyl9fWNsYXNzIHZ7Y29uc3RydWN0b3IoKXt0aGlzLnBhcnRzPVtdfXZpc2l0QXJndW1lbnQoZSl7dGhpcy5wYXJ0cy5wdXNoKCJNYXRoLm1heCgiLGUubWluLCIsIE1hdGgubWluKCIsZS5tYXgsIiwgc3JjW3NyY09mZnNldCArICIsZS5pbmRleCwiXSkpIil9dmlzaXRWYXJpYWJsZShlKXt0aGlzLnBhcnRzLnB1c2goInYiLGUuaW5kZXgpfXZpc2l0TGl0ZXJhbChlKXt0aGlzLnBhcnRzLnB1c2goZS5udW1iZXIpfXZpc2l0QmluYXJ5T3BlcmF0aW9uKGUpe3RoaXMucGFydHMucHVzaCgiKCIpLGUuYXJnMS52aXNpdCh0aGlzKSx0aGlzLnBhcnRzLnB1c2goIiAiLGUub3AsIiAiKSxlLmFyZzIudmlzaXQodGhpcyksdGhpcy5wYXJ0cy5wdXNoKCIpIil9dmlzaXRWYXJpYWJsZURlZmluaXRpb24oZSl7dGhpcy5wYXJ0cy5wdXNoKCJ2YXIgIiksZS52YXJpYWJsZS52aXNpdCh0aGlzKSx0aGlzLnBhcnRzLnB1c2goIiA9ICIpLGUuYXJnLnZpc2l0KHRoaXMpLHRoaXMucGFydHMucHVzaCgiOyIpfXZpc2l0TWluKGUpe3RoaXMucGFydHMucHVzaCgiTWF0aC5taW4oIiksZS5hcmcudmlzaXQodGhpcyksdGhpcy5wYXJ0cy5wdXNoKCIsICIsZS5tYXgsIikiKX10b1N0cmluZygpe3JldHVybiB0aGlzLnBhcnRzLmpvaW4oIiIpfX1mdW5jdGlvbiB4KGUsdCl7cmV0dXJuImxpdGVyYWwiPT09dC50eXBlJiYwPT09dC5udW1iZXI/ZToibGl0ZXJhbCI9PT1lLnR5cGUmJjA9PT1lLm51bWJlcj90OiJsaXRlcmFsIj09PXQudHlwZSYmImxpdGVyYWwiPT09ZS50eXBlP25ldyBwKGUubnVtYmVyK3QubnVtYmVyKTpuZXcgbSgiKyIsZSx0LGUubWluK3QubWluLGUubWF4K3QubWF4KX1mdW5jdGlvbiBTKGUsdCl7aWYoImxpdGVyYWwiPT09dC50eXBlKXtpZigwPT09dC5udW1iZXIpcmV0dXJuIG5ldyBwKDApO2lmKDE9PT10Lm51bWJlcilyZXR1cm4gZTtpZigibGl0ZXJhbCI9PT1lLnR5cGUpcmV0dXJuIG5ldyBwKGUubnVtYmVyKnQubnVtYmVyKX1pZigibGl0ZXJhbCI9PT1lLnR5cGUpe2lmKDA9PT1lLm51bWJlcilyZXR1cm4gbmV3IHAoMCk7aWYoMT09PWUubnVtYmVyKXJldHVybiB0fWNvbnN0IHI9TWF0aC5taW4oZS5taW4qdC5taW4sZS5taW4qdC5tYXgsZS5tYXgqdC5taW4sZS5tYXgqdC5tYXgpLG49TWF0aC5tYXgoZS5taW4qdC5taW4sZS5taW4qdC5tYXgsZS5tYXgqdC5taW4sZS5tYXgqdC5tYXgpO3JldHVybiBuZXcgbSgiKiIsZSx0LHIsbil9ZnVuY3Rpb24gQShlLHQpe2lmKCJsaXRlcmFsIj09PXQudHlwZSl7aWYoMD09PXQubnVtYmVyKXJldHVybiBlO2lmKCJsaXRlcmFsIj09PWUudHlwZSlyZXR1cm4gbmV3IHAoZS5udW1iZXItdC5udW1iZXIpfXJldHVybiJiaW5hcnkiPT09dC50eXBlJiYiLSI9PT10Lm9wJiYibGl0ZXJhbCI9PT1lLnR5cGUmJjE9PT1lLm51bWJlciYmImxpdGVyYWwiPT09dC5hcmcxLnR5cGUmJjE9PT10LmFyZzEubnVtYmVyP3QuYXJnMjpuZXcgbSgiLSIsZSx0LGUubWluLXQubWF4LGUubWF4LXQubWluKX1mdW5jdGlvbiBrKGUsdCl7cmV0dXJuIGUubWluPj10P25ldyBwKHQpOmUubWF4PD10P2U6bmV3IGIoZSx0KX1jbGFzcyBDe2NvbXBpbGUoZSx0LHIpe2NvbnN0IG49W10sYT1bXSxpPXQubGVuZ3RoPj4xLHM9ci5sZW5ndGg+PjE7bGV0IG8sYyxsLGgsdSxkLGYsbSxiPTA7Zm9yKGxldCBlPTA7ZTxpO2UrKyluLnB1c2gobmV3IGcoZSx0WzIqZV0sdFsyKmUrMV0pKTtmb3IobGV0IHQ9MCxyPWUubGVuZ3RoO3Q8cjt0KyspaWYobT1lW3RdLCJudW1iZXIiIT10eXBlb2YgbSlzd2l0Y2gobSl7Y2FzZSJhZGQiOmlmKG4ubGVuZ3RoPDIpcmV0dXJuIG51bGw7aD1uLnBvcCgpLGw9bi5wb3AoKSxuLnB1c2goeChsLGgpKTticmVhaztjYXNlImN2ciI6aWYobi5sZW5ndGg8MSlyZXR1cm4gbnVsbDticmVhaztjYXNlIm11bCI6aWYobi5sZW5ndGg8MilyZXR1cm4gbnVsbDtoPW4ucG9wKCksbD1uLnBvcCgpLG4ucHVzaChTKGwsaCkpO2JyZWFrO2Nhc2Uic3ViIjppZihuLmxlbmd0aDwyKXJldHVybiBudWxsO2g9bi5wb3AoKSxsPW4ucG9wKCksbi5wdXNoKEEobCxoKSk7YnJlYWs7Y2FzZSJleGNoIjppZihuLmxlbmd0aDwyKXJldHVybiBudWxsO3U9bi5wb3AoKSxkPW4ucG9wKCksbi5wdXNoKHUsZCk7YnJlYWs7Y2FzZSJwb3AiOmlmKG4ubGVuZ3RoPDEpcmV0dXJuIG51bGw7bi5wb3AoKTticmVhaztjYXNlImluZGV4IjppZihuLmxlbmd0aDwxKXJldHVybiBudWxsO2lmKGw9bi5wb3AoKSwibGl0ZXJhbCIhPT1sLnR5cGUpcmV0dXJuIG51bGw7aWYobz1sLm51bWJlcixvPDB8fCFOdW1iZXIuaXNJbnRlZ2VyKG8pfHxuLmxlbmd0aDxvKXJldHVybiBudWxsO2lmKHU9bltuLmxlbmd0aC1vLTFdLCJsaXRlcmFsIj09PXUudHlwZXx8InZhciI9PT11LnR5cGUpe24ucHVzaCh1KTticmVha31mPW5ldyB5KGIrKyx1Lm1pbix1Lm1heCksbltuLmxlbmd0aC1vLTFdPWYsbi5wdXNoKGYpLGEucHVzaChuZXcgdyhmLHUpKTticmVhaztjYXNlImR1cCI6aWYobi5sZW5ndGg8MSlyZXR1cm4gbnVsbDtpZigibnVtYmVyIj09dHlwZW9mIGVbdCsxXSYmImd0Ij09PWVbdCsyXSYmZVt0KzNdPT09dCs3JiYianoiPT09ZVt0KzRdJiYicG9wIj09PWVbdCs1XSYmZVt0KzZdPT09ZVt0KzFdKXtsPW4ucG9wKCksbi5wdXNoKGsobCxlW3QrMV0pKSx0Kz02O2JyZWFrfWlmKHU9bi5hdCgtMSksImxpdGVyYWwiPT09dS50eXBlfHwidmFyIj09PXUudHlwZSl7bi5wdXNoKHUpO2JyZWFrfWY9bmV3IHkoYisrLHUubWluLHUubWF4KSxuW24ubGVuZ3RoLTFdPWYsbi5wdXNoKGYpLGEucHVzaChuZXcgdyhmLHUpKTticmVhaztjYXNlInJvbGwiOmlmKG4ubGVuZ3RoPDIpcmV0dXJuIG51bGw7aWYoaD1uLnBvcCgpLGw9bi5wb3AoKSwibGl0ZXJhbCIhPT1oLnR5cGV8fCJsaXRlcmFsIiE9PWwudHlwZSlyZXR1cm4gbnVsbDtpZihjPWgubnVtYmVyLG89bC5udW1iZXIsbzw9MHx8IU51bWJlci5pc0ludGVnZXIobyl8fCFOdW1iZXIuaXNJbnRlZ2VyKGMpfHxuLmxlbmd0aDxvKXJldHVybiBudWxsO2lmKGM9KGMlbytvKSVvLDA9PT1jKWJyZWFrO24ucHVzaCguLi5uLnNwbGljZShuLmxlbmd0aC1vLG8tYykpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIG51bGx9ZWxzZSBuLnB1c2gobmV3IHAobSkpO2lmKG4ubGVuZ3RoIT09cylyZXR1cm4gbnVsbDtjb25zdCBDPVtdO2Zvcihjb25zdCBlIG9mIGEpe2NvbnN0IHQ9bmV3IHY7ZS52aXNpdCh0KSxDLnB1c2godC50b1N0cmluZygpKX1mb3IobGV0IGU9MCx0PW4ubGVuZ3RoO2U8dDtlKyspe2NvbnN0IHQ9bltlXSxhPW5ldyB2O3QudmlzaXQoYSk7Y29uc3QgaT1yWzIqZV0scz1yWzIqZSsxXSxvPVthLnRvU3RyaW5nKCldO2k+dC5taW4mJihvLnVuc2hpZnQoIk1hdGgubWF4KCIsaSwiLCAiKSxvLnB1c2goIikiKSksczx0Lm1heCYmKG8udW5zaGlmdCgiTWF0aC5taW4oIixzLCIsICIpLG8ucHVzaCgiKSIpKSxvLnVuc2hpZnQoImRlc3RbZGVzdE9mZnNldCArICIsZSwiXSA9ICIpLG8ucHVzaCgiOyIpLEMucHVzaChvLmpvaW4oIiIpKX1yZXR1cm4gQy5qb2luKCJcbiIpfX10LlBvc3RTY3JpcHRDb21waWxlcj1DfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuUG9zdFNjcmlwdFBhcnNlcj10LlBvc3RTY3JpcHRMZXhlcj12b2lkIDAscigxMzkpO3ZhciBuPXIoMTQ0KSxhPXIoMTUwKSxpPXIoMTQ5KTt0LlBvc3RTY3JpcHRQYXJzZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5sZXhlcj1lLHRoaXMub3BlcmF0b3JzPVtdLHRoaXMudG9rZW49bnVsbCx0aGlzLnByZXY9bnVsbH1uZXh0VG9rZW4oKXt0aGlzLnByZXY9dGhpcy50b2tlbix0aGlzLnRva2VuPXRoaXMubGV4ZXIuZ2V0VG9rZW4oKX1hY2NlcHQoZSl7cmV0dXJuIHRoaXMudG9rZW4udHlwZT09PWUmJih0aGlzLm5leHRUb2tlbigpLCEwKX1leHBlY3QoZSl7aWYodGhpcy5hY2NlcHQoZSkpcmV0dXJuITA7dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVuZXhwZWN0ZWQgc3ltYm9sOiBmb3VuZCAiLmNvbmNhdCh0aGlzLnRva2VuLnR5cGUsIiBleHBlY3RlZCAiKS5jb25jYXQoZSwiLiIpKX1wYXJzZSgpe3JldHVybiB0aGlzLm5leHRUb2tlbigpLHRoaXMuZXhwZWN0KHMuTEJSQUNFKSx0aGlzLnBhcnNlQmxvY2soKSx0aGlzLmV4cGVjdChzLlJCUkFDRSksdGhpcy5vcGVyYXRvcnN9cGFyc2VCbG9jaygpe2Zvcig7OylpZih0aGlzLmFjY2VwdChzLk5VTUJFUikpdGhpcy5vcGVyYXRvcnMucHVzaCh0aGlzLnByZXYudmFsdWUpO2Vsc2UgaWYodGhpcy5hY2NlcHQocy5PUEVSQVRPUikpdGhpcy5vcGVyYXRvcnMucHVzaCh0aGlzLnByZXYudmFsdWUpO2Vsc2V7aWYoIXRoaXMuYWNjZXB0KHMuTEJSQUNFKSlyZXR1cm47dGhpcy5wYXJzZUNvbmRpdGlvbigpfX1wYXJzZUNvbmRpdGlvbigpe2NvbnN0IGU9dGhpcy5vcGVyYXRvcnMubGVuZ3RoO2lmKHRoaXMub3BlcmF0b3JzLnB1c2gobnVsbCxudWxsKSx0aGlzLnBhcnNlQmxvY2soKSx0aGlzLmV4cGVjdChzLlJCUkFDRSksdGhpcy5hY2NlcHQocy5JRikpdGhpcy5vcGVyYXRvcnNbZV09dGhpcy5vcGVyYXRvcnMubGVuZ3RoLHRoaXMub3BlcmF0b3JzW2UrMV09Imp6IjtlbHNle2lmKCF0aGlzLmFjY2VwdChzLkxCUkFDRSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlBTIEZ1bmN0aW9uOiBlcnJvciBwYXJzaW5nIGNvbmRpdGlvbmFsLiIpO3tjb25zdCB0PXRoaXMub3BlcmF0b3JzLmxlbmd0aDt0aGlzLm9wZXJhdG9ycy5wdXNoKG51bGwsbnVsbCk7Y29uc3Qgcj10aGlzLm9wZXJhdG9ycy5sZW5ndGg7dGhpcy5wYXJzZUJsb2NrKCksdGhpcy5leHBlY3Qocy5SQlJBQ0UpLHRoaXMuZXhwZWN0KHMuSUZFTFNFKSx0aGlzLm9wZXJhdG9yc1t0XT10aGlzLm9wZXJhdG9ycy5sZW5ndGgsdGhpcy5vcGVyYXRvcnNbdCsxXT0iaiIsdGhpcy5vcGVyYXRvcnNbZV09cix0aGlzLm9wZXJhdG9yc1tlKzFdPSJqeiJ9fX19O2NvbnN0IHM9e0xCUkFDRTowLFJCUkFDRToxLE5VTUJFUjoyLE9QRVJBVE9SOjMsSUY6NCxJRkVMU0U6NX07Y2xhc3Mgb3tzdGF0aWMgZ2V0IG9wQ2FjaGUoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywib3BDYWNoZSIsT2JqZWN0LmNyZWF0ZShudWxsKSl9Y29uc3RydWN0b3IoZSx0KXt0aGlzLnR5cGU9ZSx0aGlzLnZhbHVlPXR9c3RhdGljIGdldE9wZXJhdG9yKGUpe3ZhciB0O3JldHVybih0PW8ub3BDYWNoZSlbZV18fCh0W2VdPW5ldyBvKHMuT1BFUkFUT1IsZSkpfXN0YXRpYyBnZXQgTEJSQUNFKCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIkxCUkFDRSIsbmV3IG8ocy5MQlJBQ0UsInsiKSl9c3RhdGljIGdldCBSQlJBQ0UoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiUkJSQUNFIixuZXcgbyhzLlJCUkFDRSwifSIpKX1zdGF0aWMgZ2V0IElGKCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIklGIixuZXcgbyhzLklGLCJJRiIpKX1zdGF0aWMgZ2V0IElGRUxTRSgpe3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJJRkVMU0UiLG5ldyBvKHMuSUZFTFNFLCJJRkVMU0UiKSl9fXQuUG9zdFNjcmlwdExleGVyPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuc3RyZWFtPWUsdGhpcy5uZXh0Q2hhcigpLHRoaXMuc3RyQnVmPVtdfW5leHRDaGFyKCl7cmV0dXJuIHRoaXMuY3VycmVudENoYXI9dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpfWdldFRva2VuKCl7bGV0IGU9ITEsdD10aGlzLmN1cnJlbnRDaGFyO2Zvcig7Oyl7aWYodDwwKXJldHVybiBhLkVPRjtpZihlKTEwIT09dCYmMTMhPT10fHwoZT0hMSk7ZWxzZSBpZigzNz09PXQpZT0hMDtlbHNlIGlmKCEoMCxpLmlzV2hpdGVTcGFjZSkodCkpYnJlYWs7dD10aGlzLm5leHRDaGFyKCl9c3dpdGNoKDB8dCl7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmNhc2UgNTY6Y2FzZSA1NzpjYXNlIDQzOmNhc2UgNDU6Y2FzZSA0NjpyZXR1cm4gbmV3IG8ocy5OVU1CRVIsdGhpcy5nZXROdW1iZXIoKSk7Y2FzZSAxMjM6cmV0dXJuIHRoaXMubmV4dENoYXIoKSxvLkxCUkFDRTtjYXNlIDEyNTpyZXR1cm4gdGhpcy5uZXh0Q2hhcigpLG8uUkJSQUNFfWNvbnN0IHI9dGhpcy5zdHJCdWY7Zm9yKHIubGVuZ3RoPTAsclswXT1TdHJpbmcuZnJvbUNoYXJDb2RlKHQpOyh0PXRoaXMubmV4dENoYXIoKSk+PTAmJih0Pj02NSYmdDw9OTB8fHQ+PTk3JiZ0PD0xMjIpOylyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh0KSk7Y29uc3Qgbj1yLmpvaW4oIiIpO3N3aXRjaChuLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaWYiOnJldHVybiBvLklGO2Nhc2UiaWZlbHNlIjpyZXR1cm4gby5JRkVMU0U7ZGVmYXVsdDpyZXR1cm4gby5nZXRPcGVyYXRvcihuKX19Z2V0TnVtYmVyKCl7bGV0IGU9dGhpcy5jdXJyZW50Q2hhcjtjb25zdCB0PXRoaXMuc3RyQnVmO2Zvcih0Lmxlbmd0aD0wLHRbMF09U3RyaW5nLmZyb21DaGFyQ29kZShlKTsoZT10aGlzLm5leHRDaGFyKCkpPj0wJiYoZT49NDgmJmU8PTU3fHw0NT09PWV8fDQ2PT09ZSk7KXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKTtjb25zdCByPXBhcnNlRmxvYXQodC5qb2luKCIiKSk7aWYoaXNOYU4ocikpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkludmFsaWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyOiAiLmNvbmNhdChyKSk7cmV0dXJuIHJ9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlJlZ2lvbmFsSW1hZ2VDYWNoZT10LkxvY2FsVGlsaW5nUGF0dGVybkNhY2hlPXQuTG9jYWxJbWFnZUNhY2hlPXQuTG9jYWxHU3RhdGVDYWNoZT10LkxvY2FsRnVuY3Rpb25DYWNoZT10LkxvY2FsQ29sb3JTcGFjZUNhY2hlPXQuR2xvYmFsSW1hZ2VDYWNoZT12b2lkIDAscigyKSxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNyk7dmFyIG49cigxNDQpLGE9cigxNTApO2NsYXNzIHN7Y29uc3RydWN0b3IoZSl7dGhpcy5jb25zdHJ1Y3Rvcj09PXMmJigwLG4udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlTG9jYWxDYWNoZS4iKSx0aGlzLl9vbmx5UmVmcz0hMD09PShudWxsPT1lP3ZvaWQgMDplLm9ubHlSZWZzKSx0aGlzLl9vbmx5UmVmc3x8KHRoaXMuX25hbWVSZWZNYXA9bmV3IE1hcCx0aGlzLl9pbWFnZU1hcD1uZXcgTWFwKSx0aGlzLl9pbWFnZUNhY2hlPW5ldyBhLlJlZlNldENhY2hlfWdldEJ5TmFtZShlKXt0aGlzLl9vbmx5UmVmcyYmKDAsbi51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBgZ2V0QnlOYW1lYCBtZXRob2QuIik7Y29uc3QgdD10aGlzLl9uYW1lUmVmTWFwLmdldChlKTtyZXR1cm4gdD90aGlzLmdldEJ5UmVmKHQpOnRoaXMuX2ltYWdlTWFwLmdldChlKXx8bnVsbH1nZXRCeVJlZihlKXtyZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQoZSl8fG51bGx9c2V0KGUsdCxyKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBzZXRgIGNhbGxlZC4iKX19dC5Mb2NhbEltYWdlQ2FjaGU9Y2xhc3MgZXh0ZW5kcyBze3NldChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbCxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwO2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsSW1hZ2VDYWNoZS5zZXQgLSBleHBlY3RlZCAibmFtZSIgYXJndW1lbnQuJyk7aWYodCl7aWYodGhpcy5faW1hZ2VDYWNoZS5oYXModCkpcmV0dXJuO3RoaXMuX25hbWVSZWZNYXAuc2V0KGUsdCksdGhpcy5faW1hZ2VDYWNoZS5wdXQodCxyKX1lbHNlIHRoaXMuX2ltYWdlTWFwLmhhcyhlKXx8dGhpcy5faW1hZ2VNYXAuc2V0KGUscil9fSx0LkxvY2FsQ29sb3JTcGFjZUNhY2hlPWNsYXNzIGV4dGVuZHMgc3tzZXQoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbCx0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLHI9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDA7aWYoInN0cmluZyIhPXR5cGVvZiBlJiYhdCl0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsQ29sb3JTcGFjZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhbmQvb3IgInJlZiIgYXJndW1lbnQuJyk7aWYodCl7aWYodGhpcy5faW1hZ2VDYWNoZS5oYXModCkpcmV0dXJuO251bGwhPT1lJiZ0aGlzLl9uYW1lUmVmTWFwLnNldChlLHQpLHRoaXMuX2ltYWdlQ2FjaGUucHV0KHQscil9ZWxzZSB0aGlzLl9pbWFnZU1hcC5oYXMoZSl8fHRoaXMuX2ltYWdlTWFwLnNldChlLHIpfX0sdC5Mb2NhbEZ1bmN0aW9uQ2FjaGU9Y2xhc3MgZXh0ZW5kcyBze2NvbnN0cnVjdG9yKGUpe3N1cGVyKHtvbmx5UmVmczohMH0pfXNldCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLHQ9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDA7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCdMb2NhbEZ1bmN0aW9uQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7dGhpcy5faW1hZ2VDYWNoZS5oYXMoZSl8fHRoaXMuX2ltYWdlQ2FjaGUucHV0KGUsdCl9fSx0LkxvY2FsR1N0YXRlQ2FjaGU9Y2xhc3MgZXh0ZW5kcyBze3NldChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbCxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwO2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsR1N0YXRlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgIm5hbWUiIGFyZ3VtZW50LicpO2lmKHQpe2lmKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHQpKXJldHVybjt0aGlzLl9uYW1lUmVmTWFwLnNldChlLHQpLHRoaXMuX2ltYWdlQ2FjaGUucHV0KHQscil9ZWxzZSB0aGlzLl9pbWFnZU1hcC5oYXMoZSl8fHRoaXMuX2ltYWdlTWFwLnNldChlLHIpfX0sdC5Mb2NhbFRpbGluZ1BhdHRlcm5DYWNoZT1jbGFzcyBleHRlbmRzIHN7Y29uc3RydWN0b3IoZSl7c3VwZXIoe29ubHlSZWZzOiEwfSl9c2V0KCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsdD1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMDtpZighZSl0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsVGlsaW5nUGF0dGVybkNhY2hlLnNldCAtIGV4cGVjdGVkICJyZWYiIGFyZ3VtZW50LicpO3RoaXMuX2ltYWdlQ2FjaGUuaGFzKGUpfHx0aGlzLl9pbWFnZUNhY2hlLnB1dChlLHQpfX0sdC5SZWdpb25hbEltYWdlQ2FjaGU9Y2xhc3MgZXh0ZW5kcyBze2NvbnN0cnVjdG9yKGUpe3N1cGVyKHtvbmx5UmVmczohMH0pfXNldCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLHQ9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDA7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCdSZWdpb25hbEltYWdlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7dGhpcy5faW1hZ2VDYWNoZS5oYXMoZSl8fHRoaXMuX2ltYWdlQ2FjaGUucHV0KGUsdCl9fTtjbGFzcyBve2NvbnN0cnVjdG9yKCl7dGhpcy5fcmVmQ2FjaGU9bmV3IGEuUmVmU2V0Q2FjaGUsdGhpcy5faW1hZ2VDYWNoZT1uZXcgYS5SZWZTZXRDYWNoZX1nZXQgX2J5dGVTaXplKCl7bGV0IGU9MDtmb3IoY29uc3QgdCBvZiB0aGlzLl9pbWFnZUNhY2hlKWUrPXQuYnl0ZVNpemU7cmV0dXJuIGV9Z2V0IF9jYWNoZUxpbWl0UmVhY2hlZCgpe3JldHVybiEodGhpcy5faW1hZ2VDYWNoZS5zaXplPG8uTUlOX0lNQUdFU19UT19DQUNIRXx8dGhpcy5fYnl0ZVNpemU8by5NQVhfQllURV9TSVpFKX1zaG91bGRDYWNoZShlLHQpe2xldCByPXRoaXMuX3JlZkNhY2hlLmdldChlKTtyZXR1cm4gcnx8KHI9bmV3IFNldCx0aGlzLl9yZWZDYWNoZS5wdXQoZSxyKSksci5hZGQodCksIShyLnNpemU8by5OVU1fUEFHRVNfVEhSRVNIT0xEfHwhdGhpcy5faW1hZ2VDYWNoZS5oYXMoZSkmJnRoaXMuX2NhY2hlTGltaXRSZWFjaGVkKX1hZGRCeXRlU2l6ZShlLHQpe2NvbnN0IHI9dGhpcy5faW1hZ2VDYWNoZS5nZXQoZSk7ciYmKHIuYnl0ZVNpemV8fChyLmJ5dGVTaXplPXQpKX1nZXREYXRhKGUsdCl7Y29uc3Qgcj10aGlzLl9yZWZDYWNoZS5nZXQoZSk7aWYoIXIpcmV0dXJuIG51bGw7aWYoci5zaXplPG8uTlVNX1BBR0VTX1RIUkVTSE9MRClyZXR1cm4gbnVsbDtjb25zdCBuPXRoaXMuX2ltYWdlQ2FjaGUuZ2V0KGUpO3JldHVybiBuPyhyLmFkZCh0KSxuKTpudWxsfXNldERhdGEoZSx0KXtpZighdGhpcy5fcmVmQ2FjaGUuaGFzKGUpKXRocm93IG5ldyBFcnJvcignR2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhIC0gZXhwZWN0ZWQgInNob3VsZENhY2hlIiB0byBoYXZlIGJlZW4gY2FsbGVkLicpO3RoaXMuX2ltYWdlQ2FjaGUuaGFzKGUpfHwodGhpcy5fY2FjaGVMaW1pdFJlYWNoZWQ/KDAsbi53YXJuKSgiR2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhIC0gY2FjaGUgbGltaXQgcmVhY2hlZC4iKTp0aGlzLl9pbWFnZUNhY2hlLnB1dChlLHQpKX1jbGVhcigpe2FyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF18fHRoaXMuX3JlZkNhY2hlLmNsZWFyKCksdGhpcy5faW1hZ2VDYWNoZS5jbGVhcigpfX1pKG8sIk5VTV9QQUdFU19USFJFU0hPTEQiLDIpLGkobywiTUlOX0lNQUdFU19UT19DQUNIRSIsMTApLGkobywiTUFYX0JZVEVfU0laRSIsNSpuLk1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFKSx0Lkdsb2JhbEltYWdlQ2FjaGU9b30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmJpZGk9ZnVuY3Rpb24oZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOi0xLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxnPSEwO2NvbnN0IHA9ZS5sZW5ndGg7aWYoMD09PXB8fHIpcmV0dXJuIHUoZSxnLHIpO2QubGVuZ3RoPXAsZi5sZW5ndGg9cDtsZXQgbSxiLHk9MDtmb3IobT0wO208cDsrK20pe2RbbV09ZS5jaGFyQXQobSk7Y29uc3QgdD1lLmNoYXJDb2RlQXQobSk7bGV0IHI9IkwiO3Q8PTI1NT9yPWFbdF06MTQyNDw9dCYmdDw9MTUyND9yPSJSIjoxNTM2PD10JiZ0PD0xNzkxPyhyPWlbMjU1JnRdLHJ8fCgwLG4ud2FybikoIkJpZGk6IGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgIit0LnRvU3RyaW5nKDE2KSkpOigxNzkyPD10JiZ0PD0yMjIwfHw2NDMzNjw9dCYmdDw9NjUwMjN8fDY1MTM2PD10JiZ0PD02NTI3OSkmJihyPSJBTCIpLCJSIiE9PXImJiJBTCIhPT1yJiYiQU4iIT09cnx8eSsrLGZbbV09cn1pZigwPT09eSlyZXR1cm4gZz0hMCx1KGUsZyk7LTE9PT10JiYoeS9wPC4zJiZwPjQ/KGc9ITAsdD0wKTooZz0hMSx0PTEpKTtjb25zdCB3PVtdO2ZvcihtPTA7bTxwOysrbSl3W21dPXQ7Y29uc3Qgdj1zKHQpPyJSIjoiTCIseD12LFM9eDtsZXQgQSxrPXg7Zm9yKG09MDttPHA7KyttKSJOU00iPT09ZlttXT9mW21dPWs6az1mW21dO2ZvcihrPXgsbT0wO208cDsrK20pQT1mW21dLCJFTiI9PT1BP2ZbbV09IkFMIj09PWs/IkFOIjoiRU4iOiJSIiE9PUEmJiJMIiE9PUEmJiJBTCIhPT1BfHwoaz1BKTtmb3IobT0wO208cDsrK20pQT1mW21dLCJBTCI9PT1BJiYoZlttXT0iUiIpO2ZvcihtPTE7bTxwLTE7KyttKSJFUyI9PT1mW21dJiYiRU4iPT09ZlttLTFdJiYiRU4iPT09ZlttKzFdJiYoZlttXT0iRU4iKSwiQ1MiIT09ZlttXXx8IkVOIiE9PWZbbS0xXSYmIkFOIiE9PWZbbS0xXXx8ZlttKzFdIT09ZlttLTFdfHwoZlttXT1mW20tMV0pO2ZvcihtPTA7bTxwOysrbSlpZigiRU4iPT09ZlttXSl7Zm9yKGxldCBlPW0tMTtlPj0wJiYiRVQiPT09ZltlXTstLWUpZltlXT0iRU4iO2ZvcihsZXQgZT1tKzE7ZTxwJiYiRVQiPT09ZltlXTsrK2UpZltlXT0iRU4ifWZvcihtPTA7bTxwOysrbSlBPWZbbV0sIldTIiE9PUEmJiJFUyIhPT1BJiYiRVQiIT09QSYmIkNTIiE9PUF8fChmW21dPSJPTiIpO2ZvcihrPXgsbT0wO208cDsrK20pQT1mW21dLCJFTiI9PT1BP2ZbbV09IkwiPT09az8iTCI6IkVOIjoiUiIhPT1BJiYiTCIhPT1BfHwoaz1BKTtmb3IobT0wO208cDsrK20paWYoIk9OIj09PWZbbV0pe2NvbnN0IGU9YyhmLG0rMSwiT04iKTtsZXQgdD14O20+MCYmKHQ9ZlttLTFdKTtsZXQgcj1TO2UrMTxwJiYocj1mW2UrMV0pLCJMIiE9PXQmJih0PSJSIiksIkwiIT09ciYmKHI9IlIiKSx0PT09ciYmbChmLG0sZSx0KSxtPWUtMX1mb3IobT0wO208cDsrK20pIk9OIj09PWZbbV0mJihmW21dPXYpO2ZvcihtPTA7bTxwOysrbSlBPWZbbV0sbyh3W21dKT8iUiI9PT1BP3dbbV0rPTE6IkFOIiE9PUEmJiJFTiIhPT1BfHwod1ttXSs9Mik6IkwiIT09QSYmIkFOIiE9PUEmJiJFTiIhPT1BfHwod1ttXSs9MSk7bGV0IEMsTz0tMSxGPTk5O2ZvcihtPTAsYj13Lmxlbmd0aDttPGI7KyttKUM9d1ttXSxPPEMmJihPPUMpLEY+QyYmcyhDKSYmKEY9Qyk7Zm9yKEM9TztDPj1GOy0tQyl7bGV0IGU9LTE7Zm9yKG09MCxiPXcubGVuZ3RoO208YjsrK20pd1ttXTxDP2U+PTAmJihoKGQsZSxtKSxlPS0xKTplPDAmJihlPW0pO2U+PTAmJmgoZCxlLHcubGVuZ3RoKX1mb3IobT0wLGI9ZC5sZW5ndGg7bTxiOysrbSl7Y29uc3QgZT1kW21dOyI8IiE9PWUmJiI+IiE9PWV8fChkW21dPSIiKX1yZXR1cm4gdShkLmpvaW4oIiIpLGcpfTt2YXIgbj1yKDE0NCk7Y29uc3QgYT1bIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIlMiLCJCIiwiUyIsIldTIiwiQiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCIiwiQiIsIkIiLCJTIiwiV1MiLCJPTiIsIk9OIiwiRVQiLCJFVCIsIkVUIiwiT04iLCJPTiIsIk9OIiwiT04iLCJPTiIsIkVTIiwiQ1MiLCJFUyIsIkNTIiwiQ1MiLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkNTIiwiT04iLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiT04iLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIk9OIiwiT04iLCJPTiIsIk9OIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJDUyIsIk9OIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJPTiIsIk9OIiwiT04iLCJPTiIsIkwiLCJPTiIsIk9OIiwiQk4iLCJPTiIsIk9OIiwiRVQiLCJFVCIsIkVOIiwiRU4iLCJPTiIsIkwiLCJPTiIsIk9OIiwiT04iLCJFTiIsIkwiLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIl0saT1bIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIk9OIiwiT04iLCJBTCIsIkVUIiwiRVQiLCJBTCIsIkNTIiwiQUwiLCJPTiIsIk9OIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiQUwiLCJBTCIsIiIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiRVQiLCJBTiIsIkFOIiwiQUwiLCJBTCIsIkFMIiwiTlNNIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIkFOIiwiT04iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJBTCIsIkFMIiwiTlNNIiwiTlNNIiwiT04iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJBTCIsIkFMIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiXTtmdW5jdGlvbiBzKGUpe3JldHVybiAwIT0oMSZlKX1mdW5jdGlvbiBvKGUpe3JldHVybiAwPT0oMSZlKX1mdW5jdGlvbiBjKGUsdCxyKXtsZXQgbixhO2ZvcihuPXQsYT1lLmxlbmd0aDtuPGE7KytuKWlmKGVbbl0hPT1yKXJldHVybiBuO3JldHVybiBufWZ1bmN0aW9uIGwoZSx0LHIsbil7Zm9yKGxldCBhPXQ7YTxyOysrYSllW2FdPW59ZnVuY3Rpb24gaChlLHQscil7Zm9yKGxldCBuPXQsYT1yLTE7bjxhOysrbiwtLWEpe2NvbnN0IHQ9ZVtuXTtlW25dPWVbYV0sZVthXT10fX1mdW5jdGlvbiB1KGUsdCl7bGV0IHI9Imx0ciI7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0/cj0idHRiIjp0fHwocj0icnRsIikse3N0cjplLGRpcjpyfX1jb25zdCBkPVtdLGY9W119LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5nZXRGb250U3Vic3RpdHV0aW9uPWZ1bmN0aW9uKGUsdCxyLGQsZil7Y29uc3QgZz1kPSgwLG4ubm9ybWFsaXplRm9udE5hbWUpKGQpO2xldCBwPWUuZ2V0KGcpO2lmKHApcmV0dXJuIHA7bGV0IG09bC5nZXQoZCk7aWYoIW0pZm9yKGNvbnN0W2UsdF1vZiBoKWlmKGQuc3RhcnRzV2l0aChlKSl7ZD0iIi5jb25jYXQodCkuY29uY2F0KGQuc3Vic3RyaW5nKGUubGVuZ3RoKSksbT1sLmdldChkKTticmVha31sZXQgYj0hMTttfHwobT1sLmdldChmKSxiPSEwKTtjb25zdCB5PSIiLmNvbmNhdCh0LmdldERvY0lkKCksIl9zIikuY29uY2F0KHQuY3JlYXRlRm9udElkKCkpO2lmKCFtKXtpZighKDAsYS52YWxpZGF0ZUZvbnROYW1lKShkKSlyZXR1cm4gZS5zZXQoZyxudWxsKSxudWxsO2NvbnN0IHQ9L2JvbGQvZ2kudGVzdChkKSxyPS9vYmxpcXVlfGl0YWxpYy9naS50ZXN0KGQpO3JldHVybiBwPXtjc3M6eSxndWVzc0ZhbGxiYWNrOiEwLGxvYWRlZE5hbWU6eSxiYXNlRm9udE5hbWU6ZCxzcmM6ImxvY2FsKCIuY29uY2F0KGQsIikiKSxzdHlsZTp0JiZyJiZjfHx0JiZzfHxyJiZvfHxpfSxlLnNldChnLHApLHB9Y29uc3Qgdz1bXTtiJiYoMCxhLnZhbGlkYXRlRm9udE5hbWUpKGQpJiZ3LnB1c2goImxvY2FsKCIuY29uY2F0KGQsIikiKSk7Y29uc3R7c3R5bGU6dix1bHRpbWF0ZTp4fT11KG0sdyxyKSxTPW51bGw9PT14O3JldHVybiBwPXtjc3M6IiIuY29uY2F0KHkpLmNvbmNhdChTPyIiOiIsIi5jb25jYXQoeCkpLGd1ZXNzRmFsbGJhY2s6Uyxsb2FkZWROYW1lOnksYmFzZUZvbnROYW1lOmQsc3JjOncuam9pbigiLCIpLHN0eWxlOnZ9LGUuc2V0KGcscCkscH0scigxMzkpO3ZhciBuPXIoMTg4KSxhPXIoMTQ5KTtjb25zdCBpPXtzdHlsZToibm9ybWFsIix3ZWlnaHQ6Im5vcm1hbCJ9LHM9e3N0eWxlOiJub3JtYWwiLHdlaWdodDoiYm9sZCJ9LG89e3N0eWxlOiJpdGFsaWMiLHdlaWdodDoibm9ybWFsIn0sYz17c3R5bGU6Iml0YWxpYyIsd2VpZ2h0OiJib2xkIn0sbD1uZXcgTWFwKFtbIlRpbWVzLVJvbWFuIix7bG9jYWw6WyJUaW1lcyBOZXcgUm9tYW4iLCJUaW1lcy1Sb21hbiIsIlRpbWVzIiwiTGliZXJhdGlvbiBTZXJpZiIsIk5pbWJ1cyBSb21hbiIsIk5pbWJ1cyBSb21hbiBMIiwiVGlub3MiLCJUaG9ybmRhbGUiLCJUZVggR3lyZSBUZXJtZXMiLCJGcmVlU2VyaWYiLCJEZWphVnUgU2VyaWYiLCJCaXRzdHJlYW0gVmVyYSBTZXJpZiIsIlVidW50dSJdLHN0eWxlOmksdWx0aW1hdGU6InNlcmlmIn1dLFsiVGltZXMtQm9sZCIse2FsaWFzOiJUaW1lcy1Sb21hbiIsc3R5bGU6cyx1bHRpbWF0ZToic2VyaWYifV0sWyJUaW1lcy1JdGFsaWMiLHthbGlhczoiVGltZXMtUm9tYW4iLHN0eWxlOm8sdWx0aW1hdGU6InNlcmlmIn1dLFsiVGltZXMtQm9sZEl0YWxpYyIse2FsaWFzOiJUaW1lcy1Sb21hbiIsc3R5bGU6Yyx1bHRpbWF0ZToic2VyaWYifV0sWyJIZWx2ZXRpY2EiLHtsb2NhbDpbIkhlbHZldGljYSIsIkhlbHZldGljYSBOZXVlIiwiQXJpYWwiLCJBcmlhbCBOb3ZhIiwiTGliZXJhdGlvbiBTYW5zIiwiQXJpbW8iLCJOaW1idXMgU2FucyIsIk5pbWJ1cyBTYW5zIEwiLCJBMDMwIiwiVGVYIEd5cmUgSGVyb3MiLCJGcmVlU2FucyIsIkRlamFWdSBTYW5zIiwiQWxiYW55IiwiQml0c3RyZWFtIFZlcmEgU2FucyIsIkFyaWFsIFVuaWNvZGUgTVMiLCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsIkFwcGxlIFN5bWJvbHMiLCJDYW50YXJlbGwiXSxwYXRoOiJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiIsc3R5bGU6aSx1bHRpbWF0ZToic2Fucy1zZXJpZiJ9XSxbIkhlbHZldGljYS1Cb2xkIix7YWxpYXM6IkhlbHZldGljYSIscGF0aDoiTGliZXJhdGlvblNhbnMtQm9sZC50dGYiLHN0eWxlOnMsdWx0aW1hdGU6InNhbnMtc2VyaWYifV0sWyJIZWx2ZXRpY2EtT2JsaXF1ZSIse2FsaWFzOiJIZWx2ZXRpY2EiLHBhdGg6IkxpYmVyYXRpb25TYW5zLUl0YWxpYy50dGYiLHN0eWxlOm8sdWx0aW1hdGU6InNhbnMtc2VyaWYifV0sWyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLHthbGlhczoiSGVsdmV0aWNhIixwYXRoOiJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljLnR0ZiIsc3R5bGU6Yyx1bHRpbWF0ZToic2Fucy1zZXJpZiJ9XSxbIkNvdXJpZXIiLHtsb2NhbDpbIkNvdXJpZXIiLCJDb3VyaWVyIE5ldyIsIkxpYmVyYXRpb24gTW9ubyIsIk5pbWJ1cyBNb25vIiwiTmltYnVzIE1vbm8gTCIsIkNvdXNpbmUiLCJDdW1iZXJsYW5kIiwiVGVYIEd5cmUgQ3Vyc29yIiwiRnJlZU1vbm8iXSxzdHlsZTppLHVsdGltYXRlOiJtb25vc3BhY2UifV0sWyJDb3VyaWVyLUJvbGQiLHthbGlhczoiQ291cmllciIsc3R5bGU6cyx1bHRpbWF0ZToibW9ub3NwYWNlIn1dLFsiQ291cmllci1PYmxpcXVlIix7YWxpYXM6IkNvdXJpZXIiLHN0eWxlOm8sdWx0aW1hdGU6Im1vbm9zcGFjZSJ9XSxbIkNvdXJpZXItQm9sZE9ibGlxdWUiLHthbGlhczoiQ291cmllciIsc3R5bGU6Yyx1bHRpbWF0ZToibW9ub3NwYWNlIn1dLFsiQXJpYWxCbGFjayIse2xvY2FsOlsiQXJpYWwgQmxhY2siXSxzdHlsZTp7c3R5bGU6Im5vcm1hbCIsd2VpZ2h0OiI5MDAifSxmYWxsYmFjazoiSGVsdmV0aWNhLUJvbGQifV0sWyJBcmlhbEJsYWNrLUJvbGQiLHthbGlhczoiQXJpYWxCbGFjayJ9XSxbIkFyaWFsQmxhY2stSXRhbGljIix7YWxpYXM6IkFyaWFsQmxhY2siLHN0eWxlOntzdHlsZToiaXRhbGljIix3ZWlnaHQ6IjkwMCJ9LGZhbGxiYWNrOiJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUifV0sWyJBcmlhbEJsYWNrLUJvbGRJdGFsaWMiLHthbGlhczoiQXJpYWxCbGFjay1JdGFsaWMifV0sWyJBcmlhbE5hcnJvdyIse2xvY2FsOlsiQXJpYWwgTmFycm93IiwiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyIsIkhlbHZldGljYSBDb25kZW5zZWQiLCJOaW1idXMgU2FucyBOYXJyb3ciLCJUZVggR3lyZSBIZXJvcyBDbiJdLHN0eWxlOmksZmFsbGJhY2s6IkhlbHZldGljYSJ9XSxbIkFyaWFsTmFycm93LUJvbGQiLHthbGlhczoiQXJpYWxOYXJyb3ciLHN0eWxlOnMsZmFsbGJhY2s6IkhlbHZldGljYS1Cb2xkIn1dLFsiQXJpYWxOYXJyb3ctSXRhbGljIix7YWxpYXM6IkFyaWFsTmFycm93IixzdHlsZTpvLGZhbGxiYWNrOiJIZWx2ZXRpY2EtT2JsaXF1ZSJ9XSxbIkFyaWFsTmFycm93LUJvbGRJdGFsaWMiLHthbGlhczoiQXJpYWxOYXJyb3ciLHN0eWxlOmMsZmFsbGJhY2s6IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJ9XSxbIkNhbGlicmkiLHtsb2NhbDpbIkNhbGlicmkiLCJDYXJsaXRvIl0sc3R5bGU6aSxmYWxsYmFjazoiSGVsdmV0aWNhIn1dLFsiQ2FsaWJyaS1Cb2xkIix7YWxpYXM6IkNhbGlicmkiLHN0eWxlOnMsZmFsbGJhY2s6IkhlbHZldGljYS1Cb2xkIn1dLFsiQ2FsaWJyaS1JdGFsaWMiLHthbGlhczoiQ2FsaWJyaSIsc3R5bGU6byxmYWxsYmFjazoiSGVsdmV0aWNhLU9ibGlxdWUifV0sWyJDYWxpYnJpLUJvbGRJdGFsaWMiLHthbGlhczoiQ2FsaWJyaSIsc3R5bGU6YyxmYWxsYmFjazoiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIn1dLFsiV2luZ2RpbmdzIix7bG9jYWw6WyJXaW5nZGluZ3MiLCJVUlcgRGluZ2JhdHMiXSxzdHlsZTppfV0sWyJXaW5nZGluZ3MtUmVndWxhciIse2FsaWFzOiJXaW5nZGluZ3MifV0sWyJXaW5nZGluZ3MtQm9sZCIse2FsaWFzOiJXaW5nZGluZ3MifV1dKSxoPW5ldyBNYXAoW1siQXJpYWwtQmxhY2siLCJBcmlhbEJsYWNrIl1dKTtmdW5jdGlvbiB1KGUsdCxyKXtsZXR7YWxpYXM6bixsb2NhbDphLHBhdGg6aSxmYWxsYmFjazpoLHN0eWxlOmQsdWx0aW1hdGU6Zn09ZSxnPSEoYXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10pfHxhcmd1bWVudHNbM10scD0hKGFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdKXx8YXJndW1lbnRzWzRdLG09YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOiIiO2NvbnN0IGI9e3N0eWxlOm51bGwsdWx0aW1hdGU6bnVsbH07aWYoYSl7Y29uc3QgZT1tPyIgIi5jb25jYXQobSk6IiI7Zm9yKGNvbnN0IHIgb2YgYSl0LnB1c2goImxvY2FsKCIuY29uY2F0KHIpLmNvbmNhdChlLCIpIikpfWlmKG4pe2NvbnN0IGU9bC5nZXQobiksYT1tfHxmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSBzOnJldHVybiJCb2xkIjtjYXNlIG86cmV0dXJuIkl0YWxpYyI7Y2FzZSBjOnJldHVybiJCb2xkIEl0YWxpYyI7ZGVmYXVsdDppZigiYm9sZCI9PT0obnVsbD09ZT92b2lkIDA6ZS53ZWlnaHQpKXJldHVybiJCb2xkIjtpZigiaXRhbGljIj09PShudWxsPT1lP3ZvaWQgMDplLnN0eWxlKSlyZXR1cm4iSXRhbGljIn1yZXR1cm4iIn0oZCk7T2JqZWN0LmFzc2lnbihiLHUoZSx0LHIsZyYmIWgscCYmIWksYSkpfWlmKGQmJihiLnN0eWxlPWQpLGYmJihiLnVsdGltYXRlPWYpLGcmJmgpe2NvbnN0IGU9bC5nZXQoaCkse3VsdGltYXRlOm59PXUoZSx0LHIsZyxwJiYhaSxtKTtiLnVsdGltYXRlfHwoYi51bHRpbWF0ZT1uKX1yZXR1cm4gcCYmaSYmciYmdC5wdXNoKCJ1cmwoIi5jb25jYXQocikuY29uY2F0KGksIikiKSksYn19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5JbWFnZVJlc2l6ZXI9dm9pZCAwLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDIpO3ZhciBuPXIoMTQ0KTtjbGFzcyBhe2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5faW1nRGF0YT1lLHRoaXMuX2lzTWFzaz10fXN0YXRpYyBuZWVkc1RvQmVSZXNpemVkKGUsdCl7aWYoZTw9dGhpcy5fZ29vZFNxdWFyZUxlbmd0aCYmdDw9dGhpcy5fZ29vZFNxdWFyZUxlbmd0aClyZXR1cm4hMTtjb25zdHtNQVhfRElNOnJ9PXRoaXM7aWYoZT5yfHx0PnIpcmV0dXJuITA7Y29uc3Qgbj1lKnQ7cmV0dXJuIHRoaXMuX2hhc01heEFyZWE/bj50aGlzLk1BWF9BUkVBOiEobjx0aGlzLl9nb29kU3F1YXJlTGVuZ3RoKioyKSYmKHRoaXMuX2FyZUdvb2REaW1zKGUsdCk/KHRoaXMuX2dvb2RTcXVhcmVMZW5ndGg9TWF0aC5tYXgodGhpcy5fZ29vZFNxdWFyZUxlbmd0aCxNYXRoLmZsb29yKE1hdGguc3FydChlKnQpKSksITEpOih0aGlzLl9nb29kU3F1YXJlTGVuZ3RoPXRoaXMuX2d1ZXNzTWF4KHRoaXMuX2dvb2RTcXVhcmVMZW5ndGgsciwxMjgsMCksbj4odGhpcy5NQVhfQVJFQT10aGlzLl9nb29kU3F1YXJlTGVuZ3RoKioyKSkpfXN0YXRpYyBnZXQgTUFYX0RJTSgpe3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJNQVhfRElNIix0aGlzLl9ndWVzc01heCgyMDQ4LDY1NTM3LDAsMSkpfXN0YXRpYyBnZXQgTUFYX0FSRUEoKXtyZXR1cm4gdGhpcy5faGFzTWF4QXJlYT0hMCwoMCxuLnNoYWRvdykodGhpcywiTUFYX0FSRUEiLHRoaXMuX2d1ZXNzTWF4KGEuX2dvb2RTcXVhcmVMZW5ndGgsdGhpcy5NQVhfRElNLDEyOCwwKSoqMil9c3RhdGljIHNldCBNQVhfQVJFQShlKXtlPj0wJiYodGhpcy5faGFzTWF4QXJlYT0hMCwoMCxuLnNoYWRvdykodGhpcywiTUFYX0FSRUEiLGUpKX1zdGF0aWMgc2V0TWF4QXJlYShlKXt0aGlzLl9oYXNNYXhBcmVhfHwodGhpcy5NQVhfQVJFQT1lPj4yKX1zdGF0aWMgX2FyZUdvb2REaW1zKGUsdCl7dHJ5e2NvbnN0IHI9bmV3IE9mZnNjcmVlbkNhbnZhcyhlLHQpLG49ci5nZXRDb250ZXh0KCIyZCIpO24uZmlsbFJlY3QoMCwwLDEsMSk7Y29uc3QgYT1uLmdldEltYWdlRGF0YSgwLDAsMSwxKS5kYXRhWzNdO3JldHVybiByLndpZHRoPXIuaGVpZ2h0PTEsMCE9PWF9Y2F0Y2goZSl7cmV0dXJuITF9fXN0YXRpYyBfZ3Vlc3NNYXgoZSx0LHIsbil7Zm9yKDtlK3IrMTx0Oyl7Y29uc3Qgcj1NYXRoLmZsb29yKChlK3QpLzIpLGE9bnx8cjt0aGlzLl9hcmVHb29kRGltcyhyLGEpP2U9cjp0PXJ9cmV0dXJuIGV9c3RhdGljIGFzeW5jIGNyZWF0ZUltYWdlKGUpe3JldHVybiBuZXcgYShlLGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0pLl9jcmVhdGVJbWFnZSgpfWFzeW5jIF9jcmVhdGVJbWFnZSgpe2NvbnN0IGU9dGhpcy5fZW5jb2RlQk1QKCksdD1uZXcgQmxvYihbZS5idWZmZXJdLHt0eXBlOiJpbWFnZS9ibXAifSkscj1jcmVhdGVJbWFnZUJpdG1hcCh0KSx7TUFYX0FSRUE6bixNQVhfRElNOml9PWEse19pbWdEYXRhOnN9PXRoaXMse3dpZHRoOm8saGVpZ2h0OmN9PXMsbD1NYXRoLm1heChvL2ksYy9pLE1hdGguc3FydChvKmMvbikpLGg9TWF0aC5tYXgobCwyKSx1PU1hdGgucm91bmQoMTAqKGwrMS4yNSkpLzEwL2gsZD1NYXRoLmZsb29yKE1hdGgubG9nMih1KSksZj1uZXcgQXJyYXkoZCsyKS5maWxsKDIpO2ZbMF09aCxmLnNwbGljZSgtMSwxLHUvKDE8PGQpKTtsZXQgZz1vLHA9YyxtPWF3YWl0IHI7Zm9yKGNvbnN0IGUgb2YgZil7Y29uc3QgdD1nLHI9cDtnPU1hdGguZmxvb3IoZy9lKS0xLHA9TWF0aC5mbG9vcihwL2UpLTE7Y29uc3Qgbj1uZXcgT2Zmc2NyZWVuQ2FudmFzKGcscCk7bi5nZXRDb250ZXh0KCIyZCIpLmRyYXdJbWFnZShtLDAsMCx0LHIsMCwwLGcscCksbT1uLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpfXJldHVybiBzLmRhdGE9bnVsbCxzLmJpdG1hcD1tLHMud2lkdGg9ZyxzLmhlaWdodD1wLHN9X2VuY29kZUJNUCgpe2NvbnN0e3dpZHRoOmUsaGVpZ2h0OnQsa2luZDpyfT10aGlzLl9pbWdEYXRhO2xldCBhLGk9dGhpcy5faW1nRGF0YS5kYXRhLHM9bmV3IFVpbnQ4QXJyYXkoMCksbz1zLGM9MDtzd2l0Y2gocil7Y2FzZSBuLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDp7YT0xLHM9bmV3IFVpbnQ4QXJyYXkodGhpcy5faXNNYXNrP1syNTUsMjU1LDI1NSwyNTUsMCwwLDAsMF06WzAsMCwwLDAsMjU1LDI1NSwyNTUsMjU1XSk7Y29uc3Qgcj1lKzc+PjMsbj1yKzMmLTQ7aWYociE9PW4pe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkobip0KTtsZXQgYT0wO2ZvcihsZXQgcz0wLG89dCpyO3M8bztzKz1yLGErPW4pZS5zZXQoaS5zdWJhcnJheShzLHMrciksYSk7aT1lfWJyZWFrfWNhc2Ugbi5JbWFnZUtpbmQuUkdCXzI0QlBQOmlmKGE9MjQsMyZlKXtjb25zdCByPTMqZSxuPXIrMyYtNCxhPW4tcixzPW5ldyBVaW50OEFycmF5KG4qdCk7bGV0IG89MDtmb3IobGV0IGU9MCxuPXQqcjtlPG47ZSs9cil7Y29uc3QgdD1pLnN1YmFycmF5KGUsZStyKTtmb3IobGV0IGU9MDtlPHI7ZSs9MylzW28rK109dFtlKzJdLHNbbysrXT10W2UrMV0sc1tvKytdPXRbZV07bys9YX1pPXN9ZWxzZSBmb3IobGV0IGU9MCx0PWkubGVuZ3RoO2U8dDtlKz0zKXtjb25zdCB0PWlbZV07aVtlXT1pW2UrMl0saVtlKzJdPXR9YnJlYWs7Y2FzZSBuLkltYWdlS2luZC5SR0JBXzMyQlBQOmE9MzIsYz0zLG89bmV3IFVpbnQ4QXJyYXkoNjgpO2NvbnN0IHI9bmV3IERhdGFWaWV3KG8uYnVmZmVyKTtuLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuPyhyLnNldFVpbnQzMigwLDI1NSwhMCksci5zZXRVaW50MzIoNCw2NTI4MCwhMCksci5zZXRVaW50MzIoOCwxNjcxMTY4MCwhMCksci5zZXRVaW50MzIoMTIsNDI3ODE5MDA4MCwhMCkpOihyLnNldFVpbnQzMigwLDQyNzgxOTAwODAsITApLHIuc2V0VWludDMyKDQsMTY3MTE2ODAsITApLHIuc2V0VWludDMyKDgsNjUyODAsITApLHIuc2V0VWludDMyKDEyLDI1NSwhMCkpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdCIpfWxldCBsPTA7Y29uc3QgaD00MCtvLmxlbmd0aCx1PTE0K2grcy5sZW5ndGgraS5sZW5ndGgsZD1uZXcgVWludDhBcnJheSh1KSxmPW5ldyBEYXRhVmlldyhkLmJ1ZmZlcik7cmV0dXJuIGYuc2V0VWludDE2KGwsMTk3NzgsITApLGwrPTIsZi5zZXRVaW50MzIobCx1LCEwKSxsKz00LGYuc2V0VWludDMyKGwsMCwhMCksbCs9NCxmLnNldFVpbnQzMihsLDE0K2grcy5sZW5ndGgsITApLGwrPTQsZi5zZXRVaW50MzIobCxoLCEwKSxsKz00LGYuc2V0SW50MzIobCxlLCEwKSxsKz00LGYuc2V0SW50MzIobCwtdCwhMCksbCs9NCxmLnNldFVpbnQxNihsLDEsITApLGwrPTIsZi5zZXRVaW50MTYobCxhLCEwKSxsKz0yLGYuc2V0VWludDMyKGwsYywhMCksbCs9NCxmLnNldFVpbnQzMihsLDAsITApLGwrPTQsZi5zZXRJbnQzMihsLDAsITApLGwrPTQsZi5zZXRJbnQzMihsLDAsITApLGwrPTQsZi5zZXRVaW50MzIobCxzLmxlbmd0aC80LCEwKSxsKz00LGYuc2V0VWludDMyKGwsMCwhMCksbCs9NCxkLnNldChvLGwpLGwrPW8ubGVuZ3RoLGQuc2V0KHMsbCksbCs9cy5sZW5ndGgsZC5zZXQoaSxsKSxkfX10LkltYWdlUmVzaXplcj1hLGEuX2dvb2RTcXVhcmVMZW5ndGg9MjA0OH0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lk11cm11ckhhc2gzXzY0PXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSkscigyKTt2YXIgbj1yKDE0NCk7Y29uc3QgYT0zMjg1Mzc3NTIwLGk9NDI5NDkwMTc2MCxzPTY1NTM1O3QuTXVybXVySGFzaDNfNjQ9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5oMT1lPzQyOTQ5NjcyOTUmZTphLHRoaXMuaDI9ZT80Mjk0OTY3Mjk1JmU6YX11cGRhdGUoZSl7bGV0IHQscjtpZigic3RyaW5nIj09dHlwZW9mIGUpe3Q9bmV3IFVpbnQ4QXJyYXkoMiplLmxlbmd0aCkscj0wO2ZvcihsZXQgbj0wLGE9ZS5sZW5ndGg7bjxhO24rKyl7Y29uc3QgYT1lLmNoYXJDb2RlQXQobik7YTw9MjU1P3RbcisrXT1hOih0W3IrK109YT4+PjgsdFtyKytdPTI1NSZhKX19ZWxzZXtpZighKDAsbi5pc0FycmF5QnVmZmVyKShlKSl0aHJvdyBuZXcgRXJyb3IoIldyb25nIGRhdGEgZm9ybWF0IGluIE11cm11ckhhc2gzXzY0X3VwZGF0ZS4gSW5wdXQgbXVzdCBiZSBhIHN0cmluZyBvciBhcnJheS4iKTt0PWUuc2xpY2UoKSxyPXQuYnl0ZUxlbmd0aH1jb25zdCBhPXI+PjIsbz1yLTQqYSxjPW5ldyBVaW50MzJBcnJheSh0LmJ1ZmZlciwwLGEpO2xldCBsPTAsaD0wLHU9dGhpcy5oMSxkPXRoaXMuaDI7Y29uc3QgZj0zNDMyOTE4MzUzLGc9NDYxODQ1OTA3LHA9MTE2MDEsbT0xMzcxNTtmb3IobGV0IGU9MDtlPGE7ZSsrKTEmZT8obD1jW2VdLGw9bCpmJml8bCpwJnMsbD1sPDwxNXxsPj4+MTcsbD1sKmcmaXxsKm0mcyx1Xj1sLHU9dTw8MTN8dT4+PjE5LHU9NSp1KzM4NjQyOTIxOTYpOihoPWNbZV0saD1oKmYmaXxoKnAmcyxoPWg8PDE1fGg+Pj4xNyxoPWgqZyZpfGgqbSZzLGRePWgsZD1kPDwxM3xkPj4+MTksZD01KmQrMzg2NDI5MjE5Nik7c3dpdGNoKGw9MCxvKXtjYXNlIDM6bF49dFs0KmErMl08PDE2O2Nhc2UgMjpsXj10WzQqYSsxXTw8ODtjYXNlIDE6bF49dFs0KmFdLGw9bCpmJml8bCpwJnMsbD1sPDwxNXxsPj4+MTcsbD1sKmcmaXxsKm0mcywxJmE/dV49bDpkXj1sfXRoaXMuaDE9dSx0aGlzLmgyPWR9aGV4ZGlnZXN0KCl7bGV0IGU9dGhpcy5oMSx0PXRoaXMuaDI7cmV0dXJuIGVePXQ+Pj4xLGU9Mzk4MTgwNjc5NyplJml8MzYwNDUqZSZzLHQ9NDI4MzU0MzUxMSp0Jml8KDI5NTAxNjM3OTcqKHQ8PDE2fGU+Pj4xNikmaSk+Pj4xNixlXj10Pj4+MSxlPTQ0NDk4NDQwMyplJml8NjA0OTkqZSZzLHQ9MzMwMTg4MjM2Nip0Jml8KDMxMjA0Mzc4OTMqKHQ8PDE2fGU+Pj4xNikmaSk+Pj4xNixlXj10Pj4+MSwoZT4+PjApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCIwIikrKHQ+Pj4wKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwiMCIpfX19LChlLHQscik9Pnt2YXIgbjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5PcGVyYXRvckxpc3Q9dm9pZCAwLHIoMikscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNyk7dmFyIGE9cigxNDQpO2Z1bmN0aW9uIHMoZSx0LHIsbixhKXtsZXQgaT1lO2ZvcihsZXQgZT0wLHI9dC5sZW5ndGgtMTtlPHI7ZSsrKXt2YXIgcztjb25zdCByPXRbZV07aT0ocz1pKVtyXXx8KHNbcl09W10pfWlbdC5hdCgtMSldPXtjaGVja0ZuOnIsaXRlcmF0ZUZuOm4scHJvY2Vzc0ZuOmF9fWNvbnN0IG89W107cyhvLFthLk9QUy5zYXZlLGEuT1BTLnRyYW5zZm9ybSxhLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdCxhLk9QUy5yZXN0b3JlXSxudWxsLChmdW5jdGlvbihlLHQpe2NvbnN0IHI9ZS5mbkFycmF5LG49KHQtKGUuaUN1cnItMykpJTQ7c3dpdGNoKG4pe2Nhc2UgMDpyZXR1cm4gclt0XT09PWEuT1BTLnNhdmU7Y2FzZSAxOnJldHVybiByW3RdPT09YS5PUFMudHJhbnNmb3JtO2Nhc2UgMjpyZXR1cm4gclt0XT09PWEuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0O2Nhc2UgMzpyZXR1cm4gclt0XT09PWEuT1BTLnJlc3RvcmV9dGhyb3cgbmV3IEVycm9yKCJpdGVyYXRlSW5saW5lSW1hZ2VHcm91cCAtIGludmFsaWQgcG9zOiAiLmNvbmNhdChuKSl9KSwoZnVuY3Rpb24oZSx0KXtjb25zdCByPWUuZm5BcnJheSxuPWUuYXJnc0FycmF5LGk9ZS5pQ3VycixzPWktMyxvPWktMixjPWktMSxsPU1hdGgubWluKE1hdGguZmxvb3IoKHQtcykvNCksMjAwKTtpZihsPDEwKXJldHVybiB0LSh0LXMpJTQ7bGV0IGg9MDtjb25zdCB1PVtdO2xldCBkPTAsZj0xLGc9MTtmb3IobGV0IGU9MDtlPGw7ZSsrKXtjb25zdCB0PW5bbysoZTw8MildLHI9bltjKyhlPDwyKV1bMF07ZityLndpZHRoPjFlMyYmKGg9TWF0aC5tYXgoaCxmKSxnKz1kKzIsZj0wLGQ9MCksdS5wdXNoKHt0cmFuc2Zvcm06dCx4OmYseTpnLHc6ci53aWR0aCxoOnIuaGVpZ2h0fSksZis9ci53aWR0aCsyLGQ9TWF0aC5tYXgoZCxyLmhlaWdodCl9Y29uc3QgcD1NYXRoLm1heChoLGYpKzEsbT1nK2QrMSxiPW5ldyBVaW50OEFycmF5KHAqbSo0KSx5PXA8PDI7Zm9yKGxldCBlPTA7ZTxsO2UrKyl7Y29uc3QgdD1uW2MrKGU8PDIpXVswXS5kYXRhLHI9dVtlXS53PDwyO2xldCBhPTAsaT11W2VdLngrdVtlXS55KnA8PDI7Yi5zZXQodC5zdWJhcnJheSgwLHIpLGkteSk7Zm9yKGxldCBuPTAscz11W2VdLmg7bjxzO24rKyliLnNldCh0LnN1YmFycmF5KGEsYStyKSxpKSxhKz1yLGkrPXk7Zm9yKGIuc2V0KHQuc3ViYXJyYXkoYS1yLGEpLGkpO2k+PTA7KXRbaS00XT10W2ldLHRbaS0zXT10W2krMV0sdFtpLTJdPXRbaSsyXSx0W2ktMV09dFtpKzNdLHRbaStyXT10W2krci00XSx0W2krcisxXT10W2krci0zXSx0W2krcisyXT10W2krci0yXSx0W2krciszXT10W2krci0xXSxpLT15fWNvbnN0IHc9e3dpZHRoOnAsaGVpZ2h0Om19O2lmKGUuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpe2NvbnN0IGU9bmV3IE9mZnNjcmVlbkNhbnZhcyhwLG0pO2UuZ2V0Q29udGV4dCgiMmQiKS5wdXRJbWFnZURhdGEobmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkoYi5idWZmZXIpLHAsbSksMCwwKSx3LmJpdG1hcD1lLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpLHcuZGF0YT1udWxsfWVsc2Ugdy5raW5kPWEuSW1hZ2VLaW5kLlJHQkFfMzJCUFAsdy5kYXRhPWI7cmV0dXJuIHIuc3BsaWNlKHMsNCpsLGEuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXApLG4uc3BsaWNlKHMsNCpsLFt3LHVdKSxzKzF9KSkscyhvLFthLk9QUy5zYXZlLGEuT1BTLnRyYW5zZm9ybSxhLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsYS5PUFMucmVzdG9yZV0sbnVsbCwoZnVuY3Rpb24oZSx0KXtjb25zdCByPWUuZm5BcnJheSxuPSh0LShlLmlDdXJyLTMpKSU0O3N3aXRjaChuKXtjYXNlIDA6cmV0dXJuIHJbdF09PT1hLk9QUy5zYXZlO2Nhc2UgMTpyZXR1cm4gclt0XT09PWEuT1BTLnRyYW5zZm9ybTtjYXNlIDI6cmV0dXJuIHJbdF09PT1hLk9QUy5wYWludEltYWdlTWFza1hPYmplY3Q7Y2FzZSAzOnJldHVybiByW3RdPT09YS5PUFMucmVzdG9yZX10aHJvdyBuZXcgRXJyb3IoIml0ZXJhdGVJbWFnZU1hc2tHcm91cCAtIGludmFsaWQgcG9zOiAiLmNvbmNhdChuKSl9KSwoZnVuY3Rpb24oZSx0KXtjb25zdCByPWUuZm5BcnJheSxuPWUuYXJnc0FycmF5LGk9ZS5pQ3VycixzPWktMyxvPWktMixjPWktMTtsZXQgbD1NYXRoLmZsb29yKCh0LXMpLzQpO2lmKGw8MTApcmV0dXJuIHQtKHQtcyklNDtsZXQgaCx1LGQ9ITE7Y29uc3QgZj1uW2NdWzBdLGc9bltvXVswXSxwPW5bb11bMV0sbT1uW29dWzJdLGI9bltvXVszXTtpZihwPT09bSl7ZD0hMCxoPW8rNDtsZXQgZT1jKzQ7Zm9yKGxldCB0PTE7dDxsO3QrKyxoKz00LGUrPTQpaWYodT1uW2hdLG5bZV1bMF0hPT1mfHx1WzBdIT09Z3x8dVsxXSE9PXB8fHVbMl0hPT1tfHx1WzNdIT09Yil7dDwxMD9kPSExOmw9dDticmVha319aWYoZCl7bD1NYXRoLm1pbihsLDFlMyk7Y29uc3QgZT1uZXcgRmxvYXQzMkFycmF5KDIqbCk7aD1vO2ZvcihsZXQgdD0wO3Q8bDt0KyssaCs9NCl1PW5baF0sZVt0PDwxXT11WzRdLGVbMSsodDw8MSldPXVbNV07ci5zcGxpY2Uocyw0KmwsYS5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0KSxuLnNwbGljZShzLDQqbCxbZixnLHAsbSxiLGVdKX1lbHNle2w9TWF0aC5taW4obCwxMDApO2NvbnN0IGU9W107Zm9yKGxldCB0PTA7dDxsO3QrKyl7dT1uW28rKHQ8PDIpXTtjb25zdCByPW5bYysodDw8MildWzBdO2UucHVzaCh7ZGF0YTpyLmRhdGEsd2lkdGg6ci53aWR0aCxoZWlnaHQ6ci5oZWlnaHQsaW50ZXJwb2xhdGU6ci5pbnRlcnBvbGF0ZSxjb3VudDpyLmNvdW50LHRyYW5zZm9ybTp1fSl9ci5zcGxpY2Uocyw0KmwsYS5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXApLG4uc3BsaWNlKHMsNCpsLFtlXSl9cmV0dXJuIHMrMX0pKSxzKG8sW2EuT1BTLnNhdmUsYS5PUFMudHJhbnNmb3JtLGEuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LGEuT1BTLnJlc3RvcmVdLChmdW5jdGlvbihlKXtjb25zdCB0PWUuYXJnc0FycmF5LHI9ZS5pQ3Vyci0yO3JldHVybiAwPT09dFtyXVsxXSYmMD09PXRbcl1bMl19KSwoZnVuY3Rpb24oZSx0KXtjb25zdCByPWUuZm5BcnJheSxuPWUuYXJnc0FycmF5LGk9KHQtKGUuaUN1cnItMykpJTQ7c3dpdGNoKGkpe2Nhc2UgMDpyZXR1cm4gclt0XT09PWEuT1BTLnNhdmU7Y2FzZSAxOmlmKHJbdF0hPT1hLk9QUy50cmFuc2Zvcm0pcmV0dXJuITE7Y29uc3QgaT1lLmlDdXJyLTIscz1uW2ldWzBdLG89bltpXVszXTtyZXR1cm4gblt0XVswXT09PXMmJjA9PT1uW3RdWzFdJiYwPT09blt0XVsyXSYmblt0XVszXT09PW87Y2FzZSAyOmlmKHJbdF0hPT1hLk9QUy5wYWludEltYWdlWE9iamVjdClyZXR1cm4hMTtjb25zdCBjPW5bZS5pQ3Vyci0xXVswXTtyZXR1cm4gblt0XVswXT09PWM7Y2FzZSAzOnJldHVybiByW3RdPT09YS5PUFMucmVzdG9yZX10aHJvdyBuZXcgRXJyb3IoIml0ZXJhdGVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICIuY29uY2F0KGkpKX0pLChmdW5jdGlvbihlLHQpe2NvbnN0IHI9ZS5mbkFycmF5LG49ZS5hcmdzQXJyYXksaT1lLmlDdXJyLHM9aS0zLG89aS0yLGM9bltpLTFdWzBdLGw9bltvXVswXSxoPW5bb11bM10sdT1NYXRoLm1pbihNYXRoLmZsb29yKCh0LXMpLzQpLDFlMyk7aWYodTwzKXJldHVybiB0LSh0LXMpJTQ7Y29uc3QgZD1uZXcgRmxvYXQzMkFycmF5KDIqdSk7bGV0IGY9bztmb3IobGV0IGU9MDtlPHU7ZSsrLGYrPTQpe2NvbnN0IHQ9bltmXTtkW2U8PDFdPXRbNF0sZFsxKyhlPDwxKV09dFs1XX1jb25zdCBnPVtjLGwsaCxkXTtyZXR1cm4gci5zcGxpY2Uocyw0KnUsYS5PUFMucGFpbnRJbWFnZVhPYmplY3RSZXBlYXQpLG4uc3BsaWNlKHMsNCp1LGcpLHMrMX0pKSxzKG8sW2EuT1BTLmJlZ2luVGV4dCxhLk9QUy5zZXRGb250LGEuT1BTLnNldFRleHRNYXRyaXgsYS5PUFMuc2hvd1RleHQsYS5PUFMuZW5kVGV4dF0sbnVsbCwoZnVuY3Rpb24oZSx0KXtjb25zdCByPWUuZm5BcnJheSxuPWUuYXJnc0FycmF5LGk9KHQtKGUuaUN1cnItNCkpJTU7c3dpdGNoKGkpe2Nhc2UgMDpyZXR1cm4gclt0XT09PWEuT1BTLmJlZ2luVGV4dDtjYXNlIDE6cmV0dXJuIHJbdF09PT1hLk9QUy5zZXRGb250O2Nhc2UgMjpyZXR1cm4gclt0XT09PWEuT1BTLnNldFRleHRNYXRyaXg7Y2FzZSAzOmlmKHJbdF0hPT1hLk9QUy5zaG93VGV4dClyZXR1cm4hMTtjb25zdCBpPWUuaUN1cnItMyxzPW5baV1bMF0sbz1uW2ldWzFdO3JldHVybiBuW3RdWzBdPT09cyYmblt0XVsxXT09PW87Y2FzZSA0OnJldHVybiByW3RdPT09YS5PUFMuZW5kVGV4dH10aHJvdyBuZXcgRXJyb3IoIml0ZXJhdGVTaG93VGV4dEdyb3VwIC0gaW52YWxpZCBwb3M6ICIuY29uY2F0KGkpKX0pLChmdW5jdGlvbihlLHQpe2NvbnN0IHI9ZS5mbkFycmF5LG49ZS5hcmdzQXJyYXksYT1lLmlDdXJyLGk9YS00LHM9YS0zLG89YS0yLGM9YS0xLGw9YSxoPW5bc11bMF0sdT1uW3NdWzFdO2xldCBkPU1hdGgubWluKE1hdGguZmxvb3IoKHQtaSkvNSksMWUzKTtpZihkPDMpcmV0dXJuIHQtKHQtaSklNTtsZXQgZj1pO2k+PTQmJnJbaS00XT09PXJbc10mJnJbaS0zXT09PXJbb10mJnJbaS0yXT09PXJbY10mJnJbaS0xXT09PXJbbF0mJm5baS00XVswXT09PWgmJm5baS00XVsxXT09PXUmJihkKyssZi09NSk7bGV0IGc9Zis0O2ZvcihsZXQgZT0xO2U8ZDtlKyspci5zcGxpY2UoZywzKSxuLnNwbGljZShnLDMpLGcrPTI7cmV0dXJuIGcrMX0pKTtjbGFzcyBje2NvbnN0cnVjdG9yKGUpe3RoaXMucXVldWU9ZX1fb3B0aW1pemUoKXt9cHVzaChlLHQpe3RoaXMucXVldWUuZm5BcnJheS5wdXNoKGUpLHRoaXMucXVldWUuYXJnc0FycmF5LnB1c2godCksdGhpcy5fb3B0aW1pemUoKX1mbHVzaCgpe31yZXNldCgpe319Y2xhc3MgbCBleHRlbmRzIGN7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5zdGF0ZT1udWxsLHRoaXMuY29udGV4dD17aUN1cnI6MCxmbkFycmF5OmUuZm5BcnJheSxhcmdzQXJyYXk6ZS5hcmdzQXJyYXksaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6ITF9LHRoaXMubWF0Y2g9bnVsbCx0aGlzLmxhc3RQcm9jZXNzZWQ9MH1zZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoZSl7dGhpcy5jb250ZXh0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkPWV9X29wdGltaXplKCl7Y29uc3QgZT10aGlzLnF1ZXVlLmZuQXJyYXk7bGV0IHQ9dGhpcy5sYXN0UHJvY2Vzc2VkLHI9ZS5sZW5ndGgsbj10aGlzLnN0YXRlLGE9dGhpcy5tYXRjaDtpZighbiYmIWEmJnQrMT09PXImJiFvW2VbdF1dKXJldHVybiB2b2lkKHRoaXMubGFzdFByb2Nlc3NlZD1yKTtjb25zdCBpPXRoaXMuY29udGV4dDtmb3IoO3Q8cjspe2lmKGEpe2lmKCgwLGEuaXRlcmF0ZUZuKShpLHQpKXt0Kys7Y29udGludWV9aWYodD0oMCxhLnByb2Nlc3NGbikoaSx0KzEpLHI9ZS5sZW5ndGgsYT1udWxsLG49bnVsbCx0Pj1yKWJyZWFrfW49KG58fG8pW2VbdF1dLG4mJiFBcnJheS5pc0FycmF5KG4pPyhpLmlDdXJyPXQsdCsrLCFuLmNoZWNrRm58fCgwLG4uY2hlY2tGbikoaSk/KGE9bixuPW51bGwpOm49bnVsbCk6dCsrfXRoaXMuc3RhdGU9bix0aGlzLm1hdGNoPWEsdGhpcy5sYXN0UHJvY2Vzc2VkPXR9Zmx1c2goKXtmb3IoO3RoaXMubWF0Y2g7KXtjb25zdCBlPXRoaXMucXVldWUuZm5BcnJheS5sZW5ndGg7dGhpcy5sYXN0UHJvY2Vzc2VkPSgwLHRoaXMubWF0Y2gucHJvY2Vzc0ZuKSh0aGlzLmNvbnRleHQsZSksdGhpcy5tYXRjaD1udWxsLHRoaXMuc3RhdGU9bnVsbCx0aGlzLl9vcHRpbWl6ZSgpfX1yZXNldCgpe3RoaXMuc3RhdGU9bnVsbCx0aGlzLm1hdGNoPW51bGwsdGhpcy5sYXN0UHJvY2Vzc2VkPTB9fWNsYXNzIGh7Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MCx0PWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwO3RoaXMuX3N0cmVhbVNpbms9dCx0aGlzLmZuQXJyYXk9W10sdGhpcy5hcmdzQXJyYXk9W10sdGhpcy5vcHRpbWl6ZXI9IXR8fGUmYS5SZW5kZXJpbmdJbnRlbnRGbGFnLk9QTElTVD9uZXcgYyh0aGlzKTpuZXcgbCh0aGlzKSx0aGlzLmRlcGVuZGVuY2llcz1uZXcgU2V0LHRoaXMuX3RvdGFsTGVuZ3RoPTAsdGhpcy53ZWlnaHQ9MCx0aGlzLl9yZXNvbHZlZD10P251bGw6UHJvbWlzZS5yZXNvbHZlKCl9c2V0IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKGUpe3RoaXMub3B0aW1pemVyLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkPWV9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmFyZ3NBcnJheS5sZW5ndGh9Z2V0IHJlYWR5KCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVkfHx0aGlzLl9zdHJlYW1TaW5rLnJlYWR5fWdldCB0b3RhbExlbmd0aCgpe3JldHVybiB0aGlzLl90b3RhbExlbmd0aCt0aGlzLmxlbmd0aH1hZGRPcChlLHQpe3RoaXMub3B0aW1pemVyLnB1c2goZSx0KSx0aGlzLndlaWdodCsrLHRoaXMuX3N0cmVhbVNpbmsmJih0aGlzLndlaWdodD49aC5DSFVOS19TSVpFfHx0aGlzLndlaWdodD49aC5DSFVOS19TSVpFX0FCT1VUJiYoZT09PWEuT1BTLnJlc3RvcmV8fGU9PT1hLk9QUy5lbmRUZXh0KSkmJnRoaXMuZmx1c2goKX1hZGRJbWFnZU9wcyhlLHQscil7dm9pZCAwIT09ciYmdGhpcy5hZGRPcChhLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcyxbIk9DIixyXSksdGhpcy5hZGRPcChlLHQpLHZvaWQgMCE9PXImJnRoaXMuYWRkT3AoYS5PUFMuZW5kTWFya2VkQ29udGVudCxbXSl9YWRkRGVwZW5kZW5jeShlKXt0aGlzLmRlcGVuZGVuY2llcy5oYXMoZSl8fCh0aGlzLmRlcGVuZGVuY2llcy5hZGQoZSksdGhpcy5hZGRPcChhLk9QUy5kZXBlbmRlbmN5LFtlXSkpfWFkZERlcGVuZGVuY2llcyhlKXtmb3IoY29uc3QgdCBvZiBlKXRoaXMuYWRkRGVwZW5kZW5jeSh0KX1hZGRPcExpc3QoZSl7aWYoZSBpbnN0YW5jZW9mIGgpe2Zvcihjb25zdCB0IG9mIGUuZGVwZW5kZW5jaWVzKXRoaXMuZGVwZW5kZW5jaWVzLmFkZCh0KTtmb3IobGV0IHQ9MCxyPWUubGVuZ3RoO3Q8cjt0KyspdGhpcy5hZGRPcChlLmZuQXJyYXlbdF0sZS5hcmdzQXJyYXlbdF0pfWVsc2UoMCxhLndhcm4pKCdhZGRPcExpc3QgLSBpZ25vcmluZyBpbnZhbGlkICJvcExpc3QiIHBhcmFtZXRlci4nKX1nZXRJUigpe3JldHVybntmbkFycmF5OnRoaXMuZm5BcnJheSxhcmdzQXJyYXk6dGhpcy5hcmdzQXJyYXksbGVuZ3RoOnRoaXMubGVuZ3RofX1nZXQgX3RyYW5zZmVycygpe3ZhciBlO2NvbnN0IHQ9W10se2ZuQXJyYXk6cixhcmdzQXJyYXk6bixsZW5ndGg6aX09dGhpcztmb3IobGV0IHM9MDtzPGk7cysrKXN3aXRjaChyW3NdKXtjYXNlIGEuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OmNhc2UgYS5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDpjYXNlIGEuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDpjb25zdCByPW5bc11bMF07IXIuY2FjaGVkJiYobnVsbD09PShlPXIuZGF0YSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuYnVmZmVyKWluc3RhbmNlb2YgQXJyYXlCdWZmZXImJnQucHVzaChyLmRhdGEuYnVmZmVyKX1yZXR1cm4gdH1mbHVzaCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF0sdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbDt0aGlzLm9wdGltaXplci5mbHVzaCgpO2NvbnN0IHI9dGhpcy5sZW5ndGg7dGhpcy5fdG90YWxMZW5ndGgrPXIsdGhpcy5fc3RyZWFtU2luay5lbnF1ZXVlKHtmbkFycmF5OnRoaXMuZm5BcnJheSxhcmdzQXJyYXk6dGhpcy5hcmdzQXJyYXksbGFzdENodW5rOmUsc2VwYXJhdGVBbm5vdHM6dCxsZW5ndGg6cn0sMSx0aGlzLl90cmFuc2ZlcnMpLHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCksdGhpcy5mbkFycmF5Lmxlbmd0aD0wLHRoaXMuYXJnc0FycmF5Lmxlbmd0aD0wLHRoaXMud2VpZ2h0PTAsdGhpcy5vcHRpbWl6ZXIucmVzZXQoKX19bj1oLGkoaCwiQ0hVTktfU0laRSIsMWUzKSxpKGgsIkNIVU5LX1NJWkVfQUJPVVQiLG4uQ0hVTktfU0laRS01KSx0Lk9wZXJhdG9yTGlzdD1ofSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuUERGSW1hZ2U9dm9pZCAwLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDIpO3ZhciBuPXIoMTQ0KSxhPXIoMTc4KSxpPXIoMTUxKSxzPXIoMTYyKSxvPXIoMTY4KSxjPXIoMjEyKSxsPXIoMTc2KSxoPXIoMTgwKSx1PXIoMTUwKTtmdW5jdGlvbiBkKGUsdCxyLG4pe3JldHVybihlPXQrZSpyKTwwP2U9MDplPm4mJihlPW4pLGV9ZnVuY3Rpb24gZihlLHQscixuLGEsaSl7Y29uc3Qgcz1hKmk7bGV0IG87bz10PD04P25ldyBVaW50OEFycmF5KHMpOnQ8PTE2P25ldyBVaW50MTZBcnJheShzKTpuZXcgVWludDMyQXJyYXkocyk7Y29uc3QgYz1yL2EsbD1uL2k7bGV0IGgsdSxkLGYsZz0wO2NvbnN0IHA9bmV3IFVpbnQxNkFycmF5KGEpLG09cjtmb3IoaD0wO2g8YTtoKyspcFtoXT1NYXRoLmZsb29yKGgqYyk7Zm9yKGg9MDtoPGk7aCsrKWZvcihkPU1hdGguZmxvb3IoaCpsKSptLHU9MDt1PGE7dSsrKWY9ZCtwW3VdLG9bZysrXT1lW2ZdO3JldHVybiBvfWNsYXNzIGd7Y29uc3RydWN0b3IoZSl7bGV0e3hyZWY6dCxyZXM6cixpbWFnZTphLGlzSW5saW5lOm89ITEsc21hc2s6Yz1udWxsLG1hc2s6bD1udWxsLGlzTWFzazpkPSExLHBkZkZ1bmN0aW9uRmFjdG9yeTpmLGxvY2FsQ29sb3JTcGFjZUNhY2hlOnB9PWU7dGhpcy5pbWFnZT1hO2NvbnN0IG09YS5kaWN0LGI9bS5nZXQoIkYiLCJGaWx0ZXIiKTtsZXQgeTtpZihiIGluc3RhbmNlb2YgdS5OYW1lKXk9Yi5uYW1lO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShiKSl7Y29uc3QgZT10LmZldGNoSWZSZWYoYlswXSk7ZSBpbnN0YW5jZW9mIHUuTmFtZSYmKHk9ZS5uYW1lKX1zd2l0Y2goeSl7Y2FzZSJKUFhEZWNvZGUiOmNvbnN0IGU9bmV3IGguSnB4SW1hZ2U7ZS5wYXJzZUltYWdlUHJvcGVydGllcyhhLnN0cmVhbSksYS5zdHJlYW0ucmVzZXQoKSxhLndpZHRoPWUud2lkdGgsYS5oZWlnaHQ9ZS5oZWlnaHQsYS5iaXRzUGVyQ29tcG9uZW50PWUuYml0c1BlckNvbXBvbmVudCxhLm51bUNvbXBzPWUuY29tcG9uZW50c0NvdW50O2JyZWFrO2Nhc2UiSkJJRzJEZWNvZGUiOmEuYml0c1BlckNvbXBvbmVudD0xLGEubnVtQ29tcHM9MX1sZXQgdz1tLmdldCgiVyIsIldpZHRoIiksdj1tLmdldCgiSCIsIkhlaWdodCIpO2lmKE51bWJlci5pc0ludGVnZXIoYS53aWR0aCkmJmEud2lkdGg+MCYmTnVtYmVyLmlzSW50ZWdlcihhLmhlaWdodCkmJmEuaGVpZ2h0PjAmJihhLndpZHRoIT09d3x8YS5oZWlnaHQhPT12KSYmKCgwLG4ud2FybikoIlBERkltYWdlIC0gdXNpbmcgdGhlIFdpZHRoL0hlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YSwgcmF0aGVyIHRoYW4gdGhlIGltYWdlIGRpY3Rpb25hcnkuIiksdz1hLndpZHRoLHY9YS5oZWlnaHQpLHc8MXx8djwxKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIGltYWdlIHdpZHRoOiAiLmNvbmNhdCh3LCIgb3IgaGVpZ2h0OiAiKS5jb25jYXQodikpO3RoaXMud2lkdGg9dyx0aGlzLmhlaWdodD12LHRoaXMuaW50ZXJwb2xhdGU9bS5nZXQoIkkiLCJJbnRlcnBvbGF0ZSIpLHRoaXMuaW1hZ2VNYXNrPW0uZ2V0KCJJTSIsIkltYWdlTWFzayIpfHwhMSx0aGlzLm1hdHRlPW0uZ2V0KCJNYXR0ZSIpfHwhMTtsZXQgeD1hLmJpdHNQZXJDb21wb25lbnQ7aWYoIXgmJih4PW0uZ2V0KCJCUEMiLCJCaXRzUGVyQ29tcG9uZW50IiksIXgpKXtpZighdGhpcy5pbWFnZU1hc2spdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkJpdHMgcGVyIGNvbXBvbmVudCBtaXNzaW5nIGluIGltYWdlOiAiLmNvbmNhdCh0aGlzLmltYWdlTWFzaykpO3g9MX1pZih0aGlzLmJwYz14LCF0aGlzLmltYWdlTWFzayl7bGV0IGU9bS5nZXRSYXcoIkNTIil8fG0uZ2V0UmF3KCJDb2xvclNwYWNlIik7aWYoIWUpc3dpdGNoKCgwLG4uaW5mbykoIkpQWCBpbWFnZXMgKHdoaWNoIGRvIG5vdCByZXF1aXJlIGNvbG9yIHNwYWNlcykiKSxhLm51bUNvbXBzKXtjYXNlIDE6ZT11Lk5hbWUuZ2V0KCJEZXZpY2VHcmF5Iik7YnJlYWs7Y2FzZSAzOmU9dS5OYW1lLmdldCgiRGV2aWNlUkdCIik7YnJlYWs7Y2FzZSA0OmU9dS5OYW1lLmdldCgiRGV2aWNlQ01ZSyIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJKUFggaW1hZ2VzIHdpdGggIi5jb25jYXQoYS5udW1Db21wcywiIGNvbG9yIGNvbXBvbmVudHMgbm90IHN1cHBvcnRlZC4iKSl9dGhpcy5jb2xvclNwYWNlPXMuQ29sb3JTcGFjZS5wYXJzZSh7Y3M6ZSx4cmVmOnQscmVzb3VyY2VzOm8/cjpudWxsLHBkZkZ1bmN0aW9uRmFjdG9yeTpmLGxvY2FsQ29sb3JTcGFjZUNhY2hlOnB9KSx0aGlzLm51bUNvbXBzPXRoaXMuY29sb3JTcGFjZS5udW1Db21wc31pZih0aGlzLmRlY29kZT1tLmdldEFycmF5KCJEIiwiRGVjb2RlIiksdGhpcy5uZWVkc0RlY29kZT0hMSx0aGlzLmRlY29kZSYmKHRoaXMuY29sb3JTcGFjZSYmIXRoaXMuY29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUodGhpcy5kZWNvZGUseCl8fGQmJiFzLkNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKHRoaXMuZGVjb2RlLDEpKSl7dmFyIFM7dGhpcy5uZWVkc0RlY29kZT0hMDtjb25zdCBlPSgxPDx4KS0xO3RoaXMuZGVjb2RlQ29lZmZpY2llbnRzPVtdLHRoaXMuZGVjb2RlQWRkZW5kcz1bXTtjb25zdCB0PSJJbmRleGVkIj09PShudWxsPT09KFM9dGhpcy5jb2xvclNwYWNlKXx8dm9pZCAwPT09Uz92b2lkIDA6Uy5uYW1lKTtmb3IobGV0IHI9MCxuPTA7cjx0aGlzLmRlY29kZS5sZW5ndGg7cis9MiwrK24pe2NvbnN0IGE9dGhpcy5kZWNvZGVbcl0saT10aGlzLmRlY29kZVtyKzFdO3RoaXMuZGVjb2RlQ29lZmZpY2llbnRzW25dPXQ/KGktYSkvZTppLWEsdGhpcy5kZWNvZGVBZGRlbmRzW25dPXQ/YTplKmF9fWM/dGhpcy5zbWFzaz1uZXcgZyh7eHJlZjp0LHJlczpyLGltYWdlOmMsaXNJbmxpbmU6byxwZGZGdW5jdGlvbkZhY3Rvcnk6Zixsb2NhbENvbG9yU3BhY2VDYWNoZTpwfSk6bCYmKGwgaW5zdGFuY2VvZiBpLkJhc2VTdHJlYW0/bC5kaWN0LmdldCgiSU0iLCJJbWFnZU1hc2siKT90aGlzLm1hc2s9bmV3IGcoe3hyZWY6dCxyZXM6cixpbWFnZTpsLGlzSW5saW5lOm8saXNNYXNrOiEwLHBkZkZ1bmN0aW9uRmFjdG9yeTpmLGxvY2FsQ29sb3JTcGFjZUNhY2hlOnB9KTooMCxuLndhcm4pKCJJZ25vcmluZyAvTWFzayBpbiBpbWFnZSB3aXRob3V0IC9JbWFnZU1hc2suIik6dGhpcy5tYXNrPWwpfXN0YXRpYyBhc3luYyBidWlsZEltYWdlKGUpe2xldHt4cmVmOnQscmVzOnIsaW1hZ2U6YSxpc0lubGluZTpzPSExLHBkZkZ1bmN0aW9uRmFjdG9yeTpvLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmN9PWU7Y29uc3QgbD1hO2xldCBoPW51bGwsdT1udWxsO2NvbnN0IGQ9YS5kaWN0LmdldCgiU01hc2siKSxmPWEuZGljdC5nZXQoIk1hc2siKTtyZXR1cm4gZD9kIGluc3RhbmNlb2YgaS5CYXNlU3RyZWFtP2g9ZDooMCxuLndhcm4pKCJVbnN1cHBvcnRlZCAvU01hc2sgZm9ybWF0LiIpOmYmJihmIGluc3RhbmNlb2YgaS5CYXNlU3RyZWFtfHxBcnJheS5pc0FycmF5KGYpP3U9ZjooMCxuLndhcm4pKCJVbnN1cHBvcnRlZCAvTWFzayBmb3JtYXQuIikpLG5ldyBnKHt4cmVmOnQscmVzOnIsaW1hZ2U6bCxpc0lubGluZTpzLHNtYXNrOmgsbWFzazp1LHBkZkZ1bmN0aW9uRmFjdG9yeTpvLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmN9KX1zdGF0aWMgY3JlYXRlUmF3TWFzayhlKXtsZXR7aW1nQXJyYXk6dCx3aWR0aDpyLGhlaWdodDpuLGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOmEsaW52ZXJzZURlY29kZTppLGludGVycG9sYXRlOnN9PWU7Y29uc3Qgbz0ocis3Pj4zKSpuLGM9dC5ieXRlTGVuZ3RoO2xldCBsLGg7aWYoIWF8fGkmJm8hPT1jP2k/KGw9bmV3IFVpbnQ4QXJyYXkobyksbC5zZXQodCksbC5maWxsKDI1NSxjKSk6bD1uZXcgVWludDhBcnJheSh0KTpsPXQsaSlmb3IoaD0wO2g8YztoKyspbFtoXV49MjU1O3JldHVybntkYXRhOmwsd2lkdGg6cixoZWlnaHQ6bixpbnRlcnBvbGF0ZTpzfX1zdGF0aWMgYXN5bmMgY3JlYXRlTWFzayhlKXtsZXR7aW1nQXJyYXk6dCx3aWR0aDpyLGhlaWdodDppLGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOnMsaW52ZXJzZURlY29kZTpvLGludGVycG9sYXRlOmwsaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6aD0hMX09ZTtjb25zdCB1PTE9PT1yJiYxPT09aSYmbz09PSgwPT09dC5sZW5ndGh8fCEhKDEyOCZ0WzBdKSk7aWYodSlyZXR1cm57aXNTaW5nbGVPcGFxdWVQaXhlbDp1fTtpZihoKXtpZihjLkltYWdlUmVzaXplci5uZWVkc1RvQmVSZXNpemVkKHIsaSkpe2NvbnN0IGU9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHIqaSo0KTtyZXR1cm4oMCxhLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKSh7c3JjOnQsZGVzdDplLHdpZHRoOnIsaGVpZ2h0Omksbm9uQmxhY2tDb2xvcjowLGludmVyc2VEZWNvZGU6b30pLGMuSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKHtraW5kOm4uSW1hZ2VLaW5kLlJHQkFfMzJCUFAsZGF0YTplLHdpZHRoOnIsaGVpZ2h0OmksaW50ZXJwb2xhdGU6bH0pfWNvbnN0IGU9bmV3IE9mZnNjcmVlbkNhbnZhcyhyLGkpLHM9ZS5nZXRDb250ZXh0KCIyZCIpLGg9cy5jcmVhdGVJbWFnZURhdGEocixpKTtyZXR1cm4oMCxhLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKSh7c3JjOnQsZGVzdDpoLmRhdGEsd2lkdGg6cixoZWlnaHQ6aSxub25CbGFja0NvbG9yOjAsaW52ZXJzZURlY29kZTpvfSkscy5wdXRJbWFnZURhdGEoaCwwLDApLHtkYXRhOm51bGwsd2lkdGg6cixoZWlnaHQ6aSxpbnRlcnBvbGF0ZTpsLGJpdG1hcDplLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpfX1yZXR1cm4gdGhpcy5jcmVhdGVSYXdNYXNrKHtpbWdBcnJheTp0LHdpZHRoOnIsaGVpZ2h0OmksaW52ZXJzZURlY29kZTpvLGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOnMsaW50ZXJwb2xhdGU6bH0pfWdldCBkcmF3V2lkdGgoKXt2YXIgZSx0O3JldHVybiBNYXRoLm1heCh0aGlzLndpZHRoLChudWxsPT09KGU9dGhpcy5zbWFzayl8fHZvaWQgMD09PWU/dm9pZCAwOmUud2lkdGgpfHwwLChudWxsPT09KHQ9dGhpcy5tYXNrKXx8dm9pZCAwPT09dD92b2lkIDA6dC53aWR0aCl8fDApfWdldCBkcmF3SGVpZ2h0KCl7dmFyIGUsdDtyZXR1cm4gTWF0aC5tYXgodGhpcy5oZWlnaHQsKG51bGw9PT0oZT10aGlzLnNtYXNrKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5oZWlnaHQpfHwwLChudWxsPT09KHQ9dGhpcy5tYXNrKXx8dm9pZCAwPT09dD92b2lkIDA6dC5oZWlnaHQpfHwwKX1kZWNvZGVCdWZmZXIoZSl7Y29uc3QgdD10aGlzLmJwYyxyPXRoaXMubnVtQ29tcHMsbj10aGlzLmRlY29kZUFkZGVuZHMsYT10aGlzLmRlY29kZUNvZWZmaWNpZW50cyxpPSgxPDx0KS0xO2xldCBzLG87aWYoMT09PXQpe2ZvcihzPTAsbz1lLmxlbmd0aDtzPG87cysrKWVbc109KyFlW3NdO3JldHVybn1sZXQgYz0wO2ZvcihzPTAsbz10aGlzLndpZHRoKnRoaXMuaGVpZ2h0O3M8bztzKyspZm9yKGxldCB0PTA7dDxyO3QrKyllW2NdPWQoZVtjXSxuW3RdLGFbdF0saSksYysrfWdldENvbXBvbmVudHMoZSl7Y29uc3QgdD10aGlzLmJwYztpZig4PT09dClyZXR1cm4gZTtjb25zdCByPXRoaXMud2lkdGgsbj10aGlzLmhlaWdodCxhPXRoaXMubnVtQ29tcHMsaT1yKm4qYTtsZXQgcyxvPTA7cz10PD04P25ldyBVaW50OEFycmF5KGkpOnQ8PTE2P25ldyBVaW50MTZBcnJheShpKTpuZXcgVWludDMyQXJyYXkoaSk7Y29uc3QgYz1yKmEsbD0oMTw8dCktMTtsZXQgaCx1LGQ9MDtpZigxPT09dCl7bGV0IHQscixhO2ZvcihsZXQgaT0wO2k8bjtpKyspe2ZvcihyPWQrKC04JmMpLGE9ZCtjO2Q8cjspdT1lW28rK10sc1tkXT11Pj43JjEsc1tkKzFdPXU+PjYmMSxzW2QrMl09dT4+NSYxLHNbZCszXT11Pj40JjEsc1tkKzRdPXU+PjMmMSxzW2QrNV09dT4+MiYxLHNbZCs2XT11Pj4xJjEsc1tkKzddPTEmdSxkKz04O2lmKGQ8YSlmb3IodT1lW28rK10sdD0xMjg7ZDxhOylzW2QrK109KyEhKHUmdCksdD4+PTF9fWVsc2V7bGV0IHI9MDtmb3IodT0wLGQ9MCxoPWk7ZDxoOysrZCl7Zm9yKGQlYz09MCYmKHU9MCxyPTApO3I8dDspdT11PDw4fGVbbysrXSxyKz04O2NvbnN0IG49ci10O2xldCBhPXU+Pm47YTwwP2E9MDphPmwmJihhPWwpLHNbZF09YSx1Jj0oMTw8biktMSxyPW59fXJldHVybiBzfWZpbGxPcGFjaXR5KGUsdCxyLGEsaSl7Y29uc3Qgcz10aGlzLnNtYXNrLG89dGhpcy5tYXNrO2xldCBjLGwsaCx1LGQscDtpZihzKWw9cy53aWR0aCxoPXMuaGVpZ2h0LGM9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGwqaCkscy5maWxsR3JheUJ1ZmZlcihjKSxsPT09dCYmaD09PXJ8fChjPWYoYyxzLmJwYyxsLGgsdCxyKSk7ZWxzZSBpZihvKWlmKG8gaW5zdGFuY2VvZiBnKXtmb3IobD1vLndpZHRoLGg9by5oZWlnaHQsYz1uZXcgVWludDhDbGFtcGVkQXJyYXkobCpoKSxvLm51bUNvbXBzPTEsby5maWxsR3JheUJ1ZmZlcihjKSx1PTAsZD1sKmg7dTxkOysrdSljW3VdPTI1NS1jW3VdO2w9PT10JiZoPT09cnx8KGM9ZihjLG8uYnBjLGwsaCx0LHIpKX1lbHNle2lmKCFBcnJheS5pc0FycmF5KG8pKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmtub3duIG1hc2sgZm9ybWF0LiIpO3tjPW5ldyBVaW50OENsYW1wZWRBcnJheSh0KnIpO2NvbnN0IGU9dGhpcy5udW1Db21wcztmb3IodT0wLGQ9dCpyO3U8ZDsrK3Upe2xldCB0PTA7Y29uc3Qgcj11KmU7Zm9yKHA9MDtwPGU7KytwKXtjb25zdCBlPWlbcitwXSxuPTIqcDtpZihlPG9bbl18fGU+b1tuKzFdKXt0PTI1NTticmVha319Y1t1XT10fX19aWYoYylmb3IodT0wLHA9MyxkPXQqYTt1PGQ7Kyt1LHArPTQpZVtwXT1jW3VdO2Vsc2UgZm9yKHU9MCxwPTMsZD10KmE7dTxkOysrdSxwKz00KWVbcF09MjU1fXVuZG9QcmVibGVuZChlLHQscil7dmFyIG47Y29uc3QgYT1udWxsPT09KG49dGhpcy5zbWFzayl8fHZvaWQgMD09PW4/dm9pZCAwOm4ubWF0dGU7aWYoIWEpcmV0dXJuO2NvbnN0IGk9dGhpcy5jb2xvclNwYWNlLmdldFJnYihhLDApLHM9aVswXSxvPWlbMV0sYz1pWzJdLGw9dCpyKjQ7Zm9yKGxldCB0PTA7dDxsO3QrPTQpe2NvbnN0IHI9ZVt0KzNdO2lmKDA9PT1yKXtlW3RdPTI1NSxlW3QrMV09MjU1LGVbdCsyXT0yNTU7Y29udGludWV9Y29uc3Qgbj0yNTUvcjtlW3RdPShlW3RdLXMpKm4rcyxlW3QrMV09KGVbdCsxXS1vKSpuK28sZVt0KzJdPShlW3QrMl0tYykqbitjfX1hc3luYyBjcmVhdGVJbWFnZURhdGEoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdLHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtjb25zdCByPXRoaXMuZHJhd1dpZHRoLGE9dGhpcy5kcmF3SGVpZ2h0LGk9e3dpZHRoOnIsaGVpZ2h0OmEsaW50ZXJwb2xhdGU6dGhpcy5pbnRlcnBvbGF0ZSxraW5kOjAsZGF0YTpudWxsfSxzPXRoaXMubnVtQ29tcHMsbz10aGlzLndpZHRoLGg9dGhpcy5oZWlnaHQsdT10aGlzLmJwYyxkPW8qcyp1Kzc+PjMsZj10JiZjLkltYWdlUmVzaXplci5uZWVkc1RvQmVSZXNpemVkKHIsYSk7aWYoIWUpe2xldCBlO2lmKCJEZXZpY2VHcmF5Ij09PXRoaXMuY29sb3JTcGFjZS5uYW1lJiYxPT09dT9lPW4uSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOiJEZXZpY2VSR0IiIT09dGhpcy5jb2xvclNwYWNlLm5hbWV8fDghPT11fHx0aGlzLm5lZWRzRGVjb2RlfHwoZT1uLkltYWdlS2luZC5SR0JfMjRCUFApLGUmJiF0aGlzLnNtYXNrJiYhdGhpcy5tYXNrJiZyPT09byYmYT09PWgpe2NvbnN0IHM9dGhpcy5nZXRJbWFnZUJ5dGVzKGgqZCx7fSk7aWYodClyZXR1cm4gZj9jLkltYWdlUmVzaXplci5jcmVhdGVJbWFnZSh7ZGF0YTpzLGtpbmQ6ZSx3aWR0aDpyLGhlaWdodDphLGludGVycG9sYXRlOnRoaXMuaW50ZXJwb2xhdGV9LHRoaXMubmVlZHNEZWNvZGUpOnRoaXMuY3JlYXRlQml0bWFwKGUsbyxoLHMpO2lmKGkua2luZD1lLGkuZGF0YT1zLHRoaXMubmVlZHNEZWNvZGUpeygwLG4uYXNzZXJ0KShlPT09bi5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAsIlBERkltYWdlLmNyZWF0ZUltYWdlRGF0YTogVGhlIGltYWdlIG11c3QgYmUgZ3JheXNjYWxlLiIpO2NvbnN0IHQ9aS5kYXRhO2ZvcihsZXQgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKyl0W2VdXj0yNTV9cmV0dXJuIGl9aWYodGhpcy5pbWFnZSBpbnN0YW5jZW9mIGwuSnBlZ1N0cmVhbSYmIXRoaXMuc21hc2smJiF0aGlzLm1hc2smJiF0aGlzLm5lZWRzRGVjb2RlKXtsZXQgZT1oKmQ7aWYodCYmIWYpe2xldCB0PSExO3N3aXRjaCh0aGlzLmNvbG9yU3BhY2UubmFtZSl7Y2FzZSJEZXZpY2VHcmF5IjplKj00LHQ9ITA7YnJlYWs7Y2FzZSJEZXZpY2VSR0IiOmU9ZS8zKjQsdD0hMDticmVhaztjYXNlIkRldmljZUNNWUsiOnQ9ITB9aWYodCl7Y29uc3QgdD10aGlzLmdldEltYWdlQnl0ZXMoZSx7ZHJhd1dpZHRoOnIsZHJhd0hlaWdodDphLGZvcmNlUkdCQTohMH0pO3JldHVybiB0aGlzLmNyZWF0ZUJpdG1hcChuLkltYWdlS2luZC5SR0JBXzMyQlBQLHIsYSx0KX19ZWxzZSBzd2l0Y2godGhpcy5jb2xvclNwYWNlLm5hbWUpe2Nhc2UiRGV2aWNlR3JheSI6ZSo9MztjYXNlIkRldmljZVJHQiI6Y2FzZSJEZXZpY2VDTVlLIjpyZXR1cm4gaS5raW5kPW4uSW1hZ2VLaW5kLlJHQl8yNEJQUCxpLmRhdGE9dGhpcy5nZXRJbWFnZUJ5dGVzKGUse2RyYXdXaWR0aDpyLGRyYXdIZWlnaHQ6YSxmb3JjZVJHQjohMH0pLGY/Yy5JbWFnZVJlc2l6ZXIuY3JlYXRlSW1hZ2UoaSk6aX19fWNvbnN0IGc9dGhpcy5nZXRJbWFnZUJ5dGVzKGgqZCx7aW50ZXJuYWw6ITB9KSxwPTB8Zy5sZW5ndGgvZCphL2gsbT10aGlzLmdldENvbXBvbmVudHMoZyk7bGV0IGIseSx3LHYseCxTO3JldHVybiB0JiYhZiYmKHc9bmV3IE9mZnNjcmVlbkNhbnZhcyhyLGEpLHY9dy5nZXRDb250ZXh0KCIyZCIpLHg9di5jcmVhdGVJbWFnZURhdGEocixhKSxTPXguZGF0YSksaS5raW5kPW4uSW1hZ2VLaW5kLlJHQkFfMzJCUFAsZXx8dGhpcy5zbWFza3x8dGhpcy5tYXNrPyh0JiYhZnx8KFM9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHIqYSo0KSksYj0xLHk9ITAsdGhpcy5maWxsT3BhY2l0eShTLHIsYSxwLG0pKTooIXR8fGY/KGkua2luZD1uLkltYWdlS2luZC5SR0JfMjRCUFAsUz1uZXcgVWludDhDbGFtcGVkQXJyYXkociphKjMpLGI9MCk6KG5ldyBVaW50MzJBcnJheShTLmJ1ZmZlcikuZmlsbChuLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuPzQyNzgxOTAwODA6MjU1KSxiPTEpLHk9ITEpLHRoaXMubmVlZHNEZWNvZGUmJnRoaXMuZGVjb2RlQnVmZmVyKG0pLHRoaXMuY29sb3JTcGFjZS5maWxsUmdiKFMsbyxoLHIsYSxwLHUsbSxiKSx5JiZ0aGlzLnVuZG9QcmVibGVuZChTLHIscCksdCYmIWY/KHYucHV0SW1hZ2VEYXRhKHgsMCwwKSx7ZGF0YTpudWxsLHdpZHRoOnIsaGVpZ2h0OmEsYml0bWFwOncudHJhbnNmZXJUb0ltYWdlQml0bWFwKCksaW50ZXJwb2xhdGU6dGhpcy5pbnRlcnBvbGF0ZX0pOihpLmRhdGE9UyxmP2MuSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKGkpOmkpfWZpbGxHcmF5QnVmZmVyKGUpe2NvbnN0IHQ9dGhpcy5udW1Db21wcztpZigxIT09dCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiUmVhZGluZyBncmF5IHNjYWxlIGZyb20gYSBjb2xvciBpbWFnZTogIi5jb25jYXQodCkpO2NvbnN0IHI9dGhpcy53aWR0aCxhPXRoaXMuaGVpZ2h0LGk9dGhpcy5icGMscz1yKnQqaSs3Pj4zLG89dGhpcy5nZXRJbWFnZUJ5dGVzKGEqcyx7aW50ZXJuYWw6ITB9KSxjPXRoaXMuZ2V0Q29tcG9uZW50cyhvKTtsZXQgbCxoO2lmKDE9PT1pKXtpZihoPXIqYSx0aGlzLm5lZWRzRGVjb2RlKWZvcihsPTA7bDxoOysrbCllW2xdPWNbbF0tMSYyNTU7ZWxzZSBmb3IobD0wO2w8aDsrK2wpZVtsXT0yNTUmLWNbbF07cmV0dXJufXRoaXMubmVlZHNEZWNvZGUmJnRoaXMuZGVjb2RlQnVmZmVyKGMpLGg9ciphO2NvbnN0IHU9MjU1LygoMTw8aSktMSk7Zm9yKGw9MDtsPGg7KytsKWVbbF09dSpjW2xdfWNyZWF0ZUJpdG1hcChlLHQscixpKXtjb25zdCBzPW5ldyBPZmZzY3JlZW5DYW52YXModCxyKSxvPXMuZ2V0Q29udGV4dCgiMmQiKTtsZXQgYztyZXR1cm4gZT09PW4uSW1hZ2VLaW5kLlJHQkFfMzJCUFA/Yz1uZXcgSW1hZ2VEYXRhKGksdCxyKTooYz1vLmNyZWF0ZUltYWdlRGF0YSh0LHIpLCgwLGEuY29udmVydFRvUkdCQSkoe2tpbmQ6ZSxzcmM6aSxkZXN0Om5ldyBVaW50MzJBcnJheShjLmRhdGEuYnVmZmVyKSx3aWR0aDp0LGhlaWdodDpyLGludmVyc2VEZWNvZGU6dGhpcy5uZWVkc0RlY29kZX0pKSxvLnB1dEltYWdlRGF0YShjLDAsMCkse2RhdGE6bnVsbCx3aWR0aDp0LGhlaWdodDpyLGJpdG1hcDpzLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpLGludGVycG9sYXRlOnRoaXMuaW50ZXJwb2xhdGV9fWdldEltYWdlQnl0ZXMoZSx0KXtsZXR7ZHJhd1dpZHRoOnIsZHJhd0hlaWdodDphLGZvcmNlUkdCQTppPSExLGZvcmNlUkdCOnM9ITEsaW50ZXJuYWw6Yz0hMX09dDt0aGlzLmltYWdlLnJlc2V0KCksdGhpcy5pbWFnZS5kcmF3V2lkdGg9cnx8dGhpcy53aWR0aCx0aGlzLmltYWdlLmRyYXdIZWlnaHQ9YXx8dGhpcy5oZWlnaHQsdGhpcy5pbWFnZS5mb3JjZVJHQkE9ISFpLHRoaXMuaW1hZ2UuZm9yY2VSR0I9ISFzO2NvbnN0IGw9dGhpcy5pbWFnZS5nZXRCeXRlcyhlKTtyZXR1cm4gY3x8dGhpcy5pbWFnZSBpbnN0YW5jZW9mIG8uRGVjb2RlU3RyZWFtP2w6KCgwLG4uYXNzZXJ0KShsIGluc3RhbmNlb2YgVWludDhBcnJheSwnUERGSW1hZ2UuZ2V0SW1hZ2VCeXRlczogVW5zdXBwb3J0ZWQgImltYWdlQnl0ZXMiIHR5cGUuJyksbmV3IFVpbnQ4QXJyYXkobCkpfX10LlBERkltYWdlPWd9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5pbmNyZW1lbnRhbFVwZGF0ZT1hc3luYyBmdW5jdGlvbihlKXtsZXR7b3JpZ2luYWxEYXRhOnQseHJlZkluZm86cixuZXdSZWZzOm8seHJlZjp1PW51bGwsaGFzWGZhOmQ9ITEseGZhRGF0YXNldHNSZWY6cD1udWxsLGhhc1hmYURhdGFzZXRzRW50cnk6bT0hMSxuZWVkQXBwZWFyYW5jZXM6YixhY3JvRm9ybVJlZjp5PW51bGwsYWNyb0Zvcm06dz1udWxsLHhmYURhdGE6dj1udWxsfT1lO2F3YWl0IGFzeW5jIGZ1bmN0aW9uKGUpe2xldHt4cmVmOnQsYWNyb0Zvcm06cixhY3JvRm9ybVJlZjppLGhhc1hmYTpzLGhhc1hmYURhdGFzZXRzRW50cnk6byx4ZmFEYXRhc2V0c1JlZjpjLG5lZWRBcHBlYXJhbmNlczpoLG5ld1JlZnM6dX09ZTtpZighc3x8b3x8Y3x8KDAsbi53YXJuKSgiWEZBIC0gQ2Fubm90IHNhdmUgaXQiKSwhaCYmKCFzfHwhY3x8bykpcmV0dXJuO2NvbnN0IGQ9bmV3IGEuRGljdCh0KTtmb3IoY29uc3QgZSBvZiByLmdldEtleXMoKSlkLnNldChlLHIuZ2V0UmF3KGUpKTtpZihzJiYhbyl7Y29uc3QgZT1yLmdldCgiWEZBIikuc2xpY2UoKTtlLnNwbGljZSgyLDAsImRhdGFzZXRzIiksZS5zcGxpY2UoMywwLGMpLGQuc2V0KCJYRkEiLGUpfWgmJmQuc2V0KCJOZWVkQXBwZWFyYW5jZXMiLCEwKTtjb25zdCBmPXQuZW5jcnlwdDtsZXQgZz1udWxsO2YmJihnPWYuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKGkubnVtLGkuZ2VuKSk7Y29uc3QgcD1bXTthd2FpdCBsKGksZCxwLGcpLHUucHVzaCh7cmVmOmksZGF0YTpwLmpvaW4oIiIpfSl9KHt4cmVmOnUsYWNyb0Zvcm06dyxhY3JvRm9ybVJlZjp5LGhhc1hmYTpkLGhhc1hmYURhdGFzZXRzRW50cnk6bSx4ZmFEYXRhc2V0c1JlZjpwLG5lZWRBcHBlYXJhbmNlczpiLG5ld1JlZnM6b30pLGQmJmZ1bmN0aW9uKGUpe2xldHt4ZmFEYXRhOnQseGZhRGF0YXNldHNSZWY6cixuZXdSZWZzOmEseHJlZjpvfT1lO251bGw9PT10JiYodD1mdW5jdGlvbihlLHQpe2NvbnN0IHI9bmV3IHMuU2ltcGxlWE1MUGFyc2VyKHtoYXNBdHRyaWJ1dGVzOiEwfSkucGFyc2VGcm9tU3RyaW5nKGUpO2Zvcihjb25zdHt4ZmE6ZX1vZiB0KXtpZighZSljb250aW51ZTtjb25zdHtwYXRoOnQsdmFsdWU6YX09ZTtpZighdCljb250aW51ZTtjb25zdCBvPSgwLGkucGFyc2VYRkFQYXRoKSh0KTtsZXQgYz1yLmRvY3VtZW50RWxlbWVudC5zZWFyY2hOb2RlKG8sMCk7IWMmJm8ubGVuZ3RoPjEmJihjPXIuZG9jdW1lbnRFbGVtZW50LnNlYXJjaE5vZGUoW28uYXQoLTEpXSwwKSksYz9jLmNoaWxkTm9kZXM9QXJyYXkuaXNBcnJheShhKT9hLm1hcCgoZT0+bmV3IHMuU2ltcGxlRE9NTm9kZSgidmFsdWUiLGUpKSk6W25ldyBzLlNpbXBsZURPTU5vZGUoIiN0ZXh0IixhKV06KDAsbi53YXJuKSgiTm9kZSBub3QgZm91bmQgZm9yIHBhdGg6ICIuY29uY2F0KHQpKX1jb25zdCBhPVtdO3JldHVybiByLmRvY3VtZW50RWxlbWVudC5kdW1wKGEpLGEuam9pbigiIil9KG8uZmV0Y2hJZlJlZihyKS5nZXRTdHJpbmcoKSxhKSk7Y29uc3QgYz1vLmVuY3J5cHQ7YyYmKHQ9Yy5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0oci5udW0sci5nZW4pLmVuY3J5cHRTdHJpbmcodCkpO2NvbnN0IGw9IiIuY29uY2F0KHIubnVtLCIgIikuY29uY2F0KHIuZ2VuLCIgb2JqXG48PCAvVHlwZSAvRW1iZWRkZWRGaWxlIC9MZW5ndGggIikuY29uY2F0KHQubGVuZ3RoLCI+Plxuc3RyZWFtXG4iKSt0KyJcbmVuZHN0cmVhbVxuZW5kb2JqXG4iO2EucHVzaCh7cmVmOnIsZGF0YTpsfSl9KHt4ZmFEYXRhOnYseGZhRGF0YXNldHNSZWY6cCxuZXdSZWZzOm8seHJlZjp1fSk7Y29uc3QgeD1uZXcgYS5EaWN0KG51bGwpLFM9ci5uZXdSZWY7bGV0IEEsaztjb25zdCBDPXQuYXQoLTEpOzEwPT09Q3x8MTM9PT1DPyhBPVtdLGs9dC5sZW5ndGgpOihBPVsiXG4iXSxrPXQubGVuZ3RoKzEpLHguc2V0KCJTaXplIixTLm51bSsxKSx4LnNldCgiUHJldiIsci5zdGFydFhSZWYpLHguc2V0KCJUeXBlIixhLk5hbWUuZ2V0KCJYUmVmIikpLG51bGwhPT1yLnJvb3RSZWYmJnguc2V0KCJSb290IixyLnJvb3RSZWYpLG51bGwhPT1yLmluZm9SZWYmJnguc2V0KCJJbmZvIixyLmluZm9SZWYpLG51bGwhPT1yLmVuY3J5cHRSZWYmJnguc2V0KCJFbmNyeXB0IixyLmVuY3J5cHRSZWYpLG8ucHVzaCh7cmVmOlMsZGF0YToiIn0pLG89by5zb3J0KCgoZSx0KT0+ZS5yZWYubnVtLXQucmVmLm51bSkpO2NvbnN0IE89W1swLDEsNjU1MzVdXSxGPVswLDFdO2xldCBJPTA7Zm9yKGNvbnN0e3JlZjplLGRhdGE6dH1vZiBvKUk9TWF0aC5tYXgoSSxrKSxPLnB1c2goWzEsayxNYXRoLm1pbihlLmdlbiw2NTUzNSldKSxrKz10Lmxlbmd0aCxGLnB1c2goZS5udW0sMSksQS5wdXNoKHQpO2lmKHguc2V0KCJJbmRleCIsRiksQXJyYXkuaXNBcnJheShyLmZpbGVJZHMpJiZyLmZpbGVJZHMubGVuZ3RoPjApe2NvbnN0IGU9ZnVuY3Rpb24oZSx0KXtjb25zdCByPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpLGE9dC5maWxlbmFtZXx8IiIsaT1bci50b1N0cmluZygpLGEsZS50b1N0cmluZygpXTtsZXQgcz1pLnJlZHVjZSgoKGUsdCk9PmUrdC5sZW5ndGgpLDApO2Zvcihjb25zdCBlIG9mIE9iamVjdC52YWx1ZXModC5pbmZvKSlpLnB1c2goZSkscys9ZS5sZW5ndGg7Y29uc3Qgbz1uZXcgVWludDhBcnJheShzKTtsZXQgbD0wO2Zvcihjb25zdCBlIG9mIGkpZyhlLGwsbyksbCs9ZS5sZW5ndGg7cmV0dXJuKDAsbi5ieXRlc1RvU3RyaW5nKSgoMCxjLmNhbGN1bGF0ZU1ENSkobykpfShrLHIpO3guc2V0KCJJRCIsW3IuZmlsZUlkc1swXSxlXSl9Y29uc3QgVD1bMSxNYXRoLmNlaWwoTWF0aC5sb2cyKEkpLzgpLDJdLE09KFRbMF0rVFsxXStUWzJdKSpPLmxlbmd0aDt4LnNldCgiVyIsVCkseC5zZXQoIkxlbmd0aCIsTSksQS5wdXNoKCIiLmNvbmNhdChTLm51bSwiICIpLmNvbmNhdChTLmdlbiwiIG9ialxuIikpLGF3YWl0IGgoeCxBLG51bGwpLEEucHVzaCgiIHN0cmVhbVxuIik7Y29uc3QgRT1BLnJlZHVjZSgoKGUsdCk9PmUrdC5sZW5ndGgpLDApLFA9IlxuZW5kc3RyZWFtXG5lbmRvYmpcbnN0YXJ0eHJlZlxuIi5jb25jYXQoaywiXG4lJUVPRlxuIiksUj1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCtFK00rUC5sZW5ndGgpO1Iuc2V0KHQpO2xldCBOPXQubGVuZ3RoO2Zvcihjb25zdCBlIG9mIEEpZyhlLE4sUiksTis9ZS5sZW5ndGg7Zm9yKGNvbnN0W2UsdCxyXW9mIE8pTj1mKGUsVFswXSxOLFIpLE49Zih0LFRbMV0sTixSKSxOPWYocixUWzJdLE4sUik7cmV0dXJuIGcoUCxOLFIpLFJ9LHQud3JpdGVEaWN0PWgsdC53cml0ZU9iamVjdD1sLHIoMTM5KSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNDQpLGE9cigxNTApLGk9cigxNDkpLHM9cigyMTcpLG89cigxNTEpLGM9cigyMTgpO2FzeW5jIGZ1bmN0aW9uIGwoZSx0LHIsbil7ci5wdXNoKCIiLmNvbmNhdChlLm51bSwiICIpLmNvbmNhdChlLmdlbiwiIG9ialxuIikpLHQgaW5zdGFuY2VvZiBhLkRpY3Q/YXdhaXQgaCh0LHIsbik6dCBpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbSYmYXdhaXQgdSh0LHIsbiksci5wdXNoKCJcbmVuZG9ialxuIil9YXN5bmMgZnVuY3Rpb24gaChlLHQscil7dC5wdXNoKCI8PCIpO2Zvcihjb25zdCBuIG9mIGUuZ2V0S2V5cygpKXQucHVzaCgiIC8iLmNvbmNhdCgoMCxpLmVzY2FwZVBERk5hbWUpKG4pLCIgIikpLGF3YWl0IGQoZS5nZXRSYXcobiksdCxyKTt0LnB1c2goIj4+Iil9YXN5bmMgZnVuY3Rpb24gdShlLHQscil7bGV0IGk9ZS5nZXRTdHJpbmcoKTtudWxsIT09ciYmKGk9ci5lbmNyeXB0U3RyaW5nKGkpKTtjb25zdHtkaWN0OnN9PWUsW28sY109YXdhaXQgUHJvbWlzZS5hbGwoW3MuZ2V0QXN5bmMoIkZpbHRlciIpLHMuZ2V0QXN5bmMoIkRlY29kZVBhcm1zIildKSxsPUFycmF5LmlzQXJyYXkobyk/YXdhaXQgcy54cmVmLmZldGNoSWZSZWZBc3luYyhvWzBdKTpvLHU9KDAsYS5pc05hbWUpKGwsIkZsYXRlRGVjb2RlIik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBDb21wcmVzc2lvblN0cmVhbSYmKGkubGVuZ3RoPj0yNTZ8fHUpKXRyeXtjb25zdCBlPSgwLG4uc3RyaW5nVG9CeXRlcykoaSksdD1uZXcgQ29tcHJlc3Npb25TdHJlYW0oImRlZmxhdGUiKSxyPXQud3JpdGFibGUuZ2V0V3JpdGVyKCk7ci53cml0ZShlKSxyLmNsb3NlKCk7Y29uc3QgbD1hd2FpdCBuZXcgUmVzcG9uc2UodC5yZWFkYWJsZSkuYXJyYXlCdWZmZXIoKTtsZXQgaCxkO2k9KDAsbi5ieXRlc1RvU3RyaW5nKShuZXcgVWludDhBcnJheShsKSksbz91fHwoaD1BcnJheS5pc0FycmF5KG8pP1thLk5hbWUuZ2V0KCJGbGF0ZURlY29kZSIpLC4uLm9dOlthLk5hbWUuZ2V0KCJGbGF0ZURlY29kZSIpLG9dLGMmJihkPUFycmF5LmlzQXJyYXkoYyk/W251bGwsLi4uY106W251bGwsY10pKTpoPWEuTmFtZS5nZXQoIkZsYXRlRGVjb2RlIiksaCYmcy5zZXQoIkZpbHRlciIsaCksZCYmcy5zZXQoIkRlY29kZVBhcm1zIixkKX1jYXRjaChlKXsoMCxuLmluZm8pKCd3cml0ZVN0cmVhbSAtIGNhbm5vdCBjb21wcmVzcyBkYXRhOiAiJy5jb25jYXQoZSwnIi4nKSl9cy5zZXQoIkxlbmd0aCIsaS5sZW5ndGgpLGF3YWl0IGgocyx0LHIpLHQucHVzaCgiIHN0cmVhbVxuIixpLCJcbmVuZHN0cmVhbSIpfWFzeW5jIGZ1bmN0aW9uIGQoZSx0LHIpe2UgaW5zdGFuY2VvZiBhLk5hbWU/dC5wdXNoKCIvIi5jb25jYXQoKDAsaS5lc2NhcGVQREZOYW1lKShlLm5hbWUpKSk6ZSBpbnN0YW5jZW9mIGEuUmVmP3QucHVzaCgiIi5jb25jYXQoZS5udW0sIiAiKS5jb25jYXQoZS5nZW4sIiBSIikpOkFycmF5LmlzQXJyYXkoZSk/YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0LHIpe3QucHVzaCgiWyIpO2xldCBuPSEwO2Zvcihjb25zdCBhIG9mIGUpbj9uPSExOnQucHVzaCgiICIpLGF3YWl0IGQoYSx0LHIpO3QucHVzaCgiXSIpfShlLHQscik6InN0cmluZyI9PXR5cGVvZiBlPyhudWxsIT09ciYmKGU9ci5lbmNyeXB0U3RyaW5nKGUpKSx0LnB1c2goIigiLmNvbmNhdCgoMCxpLmVzY2FwZVN0cmluZykoZSksIikiKSkpOiJudW1iZXIiPT10eXBlb2YgZT90LnB1c2goKDAsaS5udW1iZXJUb1N0cmluZykoZSkpOiJib29sZWFuIj09dHlwZW9mIGU/dC5wdXNoKGUudG9TdHJpbmcoKSk6ZSBpbnN0YW5jZW9mIGEuRGljdD9hd2FpdCBoKGUsdCxyKTplIGluc3RhbmNlb2Ygby5CYXNlU3RyZWFtP2F3YWl0IHUoZSx0LHIpOm51bGw9PT1lP3QucHVzaCgibnVsbCIpOigwLG4ud2FybikoIlVuaGFuZGxlZCB2YWx1ZSBpbiB3cml0ZXI6ICIuY29uY2F0KHR5cGVvZiBlLCIsIHBsZWFzZSBmaWxlIGEgYnVnLiIpKX1mdW5jdGlvbiBmKGUsdCxyLG4pe2ZvcihsZXQgYT10K3ItMTthPnItMTthLS0pblthXT0yNTUmZSxlPj49ODtyZXR1cm4gcit0fWZ1bmN0aW9uIGcoZSx0LHIpe2ZvcihsZXQgbj0wLGE9ZS5sZW5ndGg7bjxhO24rKylyW3Qrbl09MjU1JmUuY2hhckNvZGVBdChuKX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5YTUxQYXJzZXJFcnJvckNvZGU9dC5YTUxQYXJzZXJCYXNlPXQuU2ltcGxlWE1MUGFyc2VyPXQuU2ltcGxlRE9NTm9kZT12b2lkIDAscigxMzkpO3ZhciBuPXIoMTQ5KTtjb25zdCBhPXtOb0Vycm9yOjAsRW5kT2ZEb2N1bWVudDotMSxVbnRlcm1pbmF0ZWRDZGF0Oi0yLFVudGVybWluYXRlZFhtbERlY2xhcmF0aW9uOi0zLFVudGVybWluYXRlZERvY3R5cGVEZWNsYXJhdGlvbjotNCxVbnRlcm1pbmF0ZWRDb21tZW50Oi01LE1hbGZvcm1lZEVsZW1lbnQ6LTYsT3V0T2ZNZW1vcnk6LTcsVW50ZXJtaW5hdGVkQXR0cmlidXRlVmFsdWU6LTgsVW50ZXJtaW5hdGVkRWxlbWVudDotOSxFbGVtZW50TmV2ZXJCZWd1bjotMTB9O2Z1bmN0aW9uIGkoZSx0KXtjb25zdCByPWVbdF07cmV0dXJuIiAiPT09cnx8IlxuIj09PXJ8fCJcciI9PT1yfHwiXHQiPT09cn10LlhNTFBhcnNlckVycm9yQ29kZT1hO2NsYXNzIHN7X3Jlc29sdmVFbnRpdGllcyhlKXtyZXR1cm4gZS5yZXBsYWNlQWxsKC8mKFteO10rKTsvZywoKGUsdCk9PntpZigiI3giPT09dC5zdWJzdHJpbmcoMCwyKSlyZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQodC5zdWJzdHJpbmcoMiksMTYpKTtpZigiIyI9PT10LnN1YnN0cmluZygwLDEpKXJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChwYXJzZUludCh0LnN1YnN0cmluZygxKSwxMCkpO3N3aXRjaCh0KXtjYXNlImx0IjpyZXR1cm4iPCI7Y2FzZSJndCI6cmV0dXJuIj4iO2Nhc2UiYW1wIjpyZXR1cm4iJiI7Y2FzZSJxdW90IjpyZXR1cm4nIic7Y2FzZSJhcG9zIjpyZXR1cm4iJyJ9cmV0dXJuIHRoaXMub25SZXNvbHZlRW50aXR5KHQpfSkpfV9wYXJzZUNvbnRlbnQoZSx0KXtjb25zdCByPVtdO2xldCBuPXQ7ZnVuY3Rpb24gYSgpe2Zvcig7bjxlLmxlbmd0aCYmaShlLG4pOykrK259Zm9yKDtuPGUubGVuZ3RoJiYhaShlLG4pJiYiPiIhPT1lW25dJiYiLyIhPT1lW25dOykrK247Y29uc3Qgcz1lLnN1YnN0cmluZyh0LG4pO2ZvcihhKCk7bjxlLmxlbmd0aCYmIj4iIT09ZVtuXSYmIi8iIT09ZVtuXSYmIj8iIT09ZVtuXTspe2EoKTtsZXQgdD0iIixzPSIiO2Zvcig7bjxlLmxlbmd0aCYmIWkoZSxuKSYmIj0iIT09ZVtuXTspdCs9ZVtuXSwrK247aWYoYSgpLCI9IiE9PWVbbl0pcmV0dXJuIG51bGw7KytuLGEoKTtjb25zdCBvPWVbbl07aWYoJyInIT09byYmIiciIT09bylyZXR1cm4gbnVsbDtjb25zdCBjPWUuaW5kZXhPZihvLCsrbik7aWYoYzwwKXJldHVybiBudWxsO3M9ZS5zdWJzdHJpbmcobixjKSxyLnB1c2goe25hbWU6dCx2YWx1ZTp0aGlzLl9yZXNvbHZlRW50aXRpZXMocyl9KSxuPWMrMSxhKCl9cmV0dXJue25hbWU6cyxhdHRyaWJ1dGVzOnIscGFyc2VkOm4tdH19X3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKGUsdCl7bGV0IHI9dDtmb3IoO3I8ZS5sZW5ndGgmJiFpKGUscikmJiI+IiE9PWVbcl0mJiI/IiE9PWVbcl0mJiIvIiE9PWVbcl07KSsrcjtjb25zdCBuPWUuc3Vic3RyaW5nKHQscik7IWZ1bmN0aW9uKCl7Zm9yKDtyPGUubGVuZ3RoJiZpKGUscik7KSsrcn0oKTtjb25zdCBhPXI7Zm9yKDtyPGUubGVuZ3RoJiYoIj8iIT09ZVtyXXx8Ij4iIT09ZVtyKzFdKTspKytyO3JldHVybntuYW1lOm4sdmFsdWU6ZS5zdWJzdHJpbmcoYSxyKSxwYXJzZWQ6ci10fX1wYXJzZVhtbChlKXtsZXQgdD0wO2Zvcig7dDxlLmxlbmd0aDspe2xldCByPXQ7aWYoIjwiPT09ZVt0XSl7bGV0IHQ7c3dpdGNoKCsrcixlW3JdKXtjYXNlIi8iOmlmKCsrcix0PWUuaW5kZXhPZigiPiIsciksdDwwKXJldHVybiB2b2lkIHRoaXMub25FcnJvcihhLlVudGVybWluYXRlZEVsZW1lbnQpO3RoaXMub25FbmRFbGVtZW50KGUuc3Vic3RyaW5nKHIsdCkpLHI9dCsxO2JyZWFrO2Nhc2UiPyI6KytyO2NvbnN0IG49dGhpcy5fcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oZSxyKTtpZigiPz4iIT09ZS5zdWJzdHJpbmcocituLnBhcnNlZCxyK24ucGFyc2VkKzIpKXJldHVybiB2b2lkIHRoaXMub25FcnJvcihhLlVudGVybWluYXRlZFhtbERlY2xhcmF0aW9uKTt0aGlzLm9uUGkobi5uYW1lLG4udmFsdWUpLHIrPW4ucGFyc2VkKzI7YnJlYWs7Y2FzZSIhIjppZigiLS0iPT09ZS5zdWJzdHJpbmcocisxLHIrMykpe2lmKHQ9ZS5pbmRleE9mKCItLVx4M2UiLHIrMyksdDwwKXJldHVybiB2b2lkIHRoaXMub25FcnJvcihhLlVudGVybWluYXRlZENvbW1lbnQpO3RoaXMub25Db21tZW50KGUuc3Vic3RyaW5nKHIrMyx0KSkscj10KzN9ZWxzZSBpZigiW0NEQVRBWyI9PT1lLnN1YnN0cmluZyhyKzEscis4KSl7aWYodD1lLmluZGV4T2YoIl1dPiIscis4KSx0PDApcmV0dXJuIHZvaWQgdGhpcy5vbkVycm9yKGEuVW50ZXJtaW5hdGVkQ2RhdCk7dGhpcy5vbkNkYXRhKGUuc3Vic3RyaW5nKHIrOCx0KSkscj10KzN9ZWxzZXtpZigiRE9DVFlQRSIhPT1lLnN1YnN0cmluZyhyKzEscis4KSlyZXR1cm4gdm9pZCB0aGlzLm9uRXJyb3IoYS5NYWxmb3JtZWRFbGVtZW50KTt7Y29uc3Qgbj1lLmluZGV4T2YoIlsiLHIrOCk7bGV0IGk9ITE7aWYodD1lLmluZGV4T2YoIj4iLHIrOCksdDwwKXJldHVybiB2b2lkIHRoaXMub25FcnJvcihhLlVudGVybWluYXRlZERvY3R5cGVEZWNsYXJhdGlvbik7aWYobj4wJiZ0Pm4pe2lmKHQ9ZS5pbmRleE9mKCJdPiIscis4KSx0PDApcmV0dXJuIHZvaWQgdGhpcy5vbkVycm9yKGEuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTtpPSEwfWNvbnN0IHM9ZS5zdWJzdHJpbmcocis4LHQrKGk/MTowKSk7dGhpcy5vbkRvY3R5cGUocykscj10KyhpPzI6MSl9fWJyZWFrO2RlZmF1bHQ6Y29uc3QgaT10aGlzLl9wYXJzZUNvbnRlbnQoZSxyKTtpZihudWxsPT09aSlyZXR1cm4gdm9pZCB0aGlzLm9uRXJyb3IoYS5NYWxmb3JtZWRFbGVtZW50KTtsZXQgcz0hMTtpZigiLz4iPT09ZS5zdWJzdHJpbmcocitpLnBhcnNlZCxyK2kucGFyc2VkKzIpKXM9ITA7ZWxzZSBpZigiPiIhPT1lLnN1YnN0cmluZyhyK2kucGFyc2VkLHIraS5wYXJzZWQrMSkpcmV0dXJuIHZvaWQgdGhpcy5vbkVycm9yKGEuVW50ZXJtaW5hdGVkRWxlbWVudCk7dGhpcy5vbkJlZ2luRWxlbWVudChpLm5hbWUsaS5hdHRyaWJ1dGVzLHMpLHIrPWkucGFyc2VkKyhzPzI6MSl9fWVsc2V7Zm9yKDtyPGUubGVuZ3RoJiYiPCIhPT1lW3JdOylyKys7Y29uc3Qgbj1lLnN1YnN0cmluZyh0LHIpO3RoaXMub25UZXh0KHRoaXMuX3Jlc29sdmVFbnRpdGllcyhuKSl9dD1yfX1vblJlc29sdmVFbnRpdHkoZSl7cmV0dXJuIiYiLmNvbmNhdChlLCI7Iil9b25QaShlLHQpe31vbkNvbW1lbnQoZSl7fW9uQ2RhdGEoZSl7fW9uRG9jdHlwZShlKXt9b25UZXh0KGUpe31vbkJlZ2luRWxlbWVudChlLHQscil7fW9uRW5kRWxlbWVudChlKXt9b25FcnJvcihlKXt9fXQuWE1MUGFyc2VyQmFzZT1zO2NsYXNzIG97Y29uc3RydWN0b3IoZSx0KXt0aGlzLm5vZGVOYW1lPWUsdGhpcy5ub2RlVmFsdWU9dCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGFyZW50Tm9kZSIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX1nZXQgZmlyc3RDaGlsZCgpe3ZhciBlO3JldHVybiBudWxsPT09KGU9dGhpcy5jaGlsZE5vZGVzKXx8dm9pZCAwPT09ZT92b2lkIDA6ZVswXX1nZXQgbmV4dFNpYmxpbmcoKXtjb25zdCBlPXRoaXMucGFyZW50Tm9kZS5jaGlsZE5vZGVzO2lmKCFlKXJldHVybjtjb25zdCB0PWUuaW5kZXhPZih0aGlzKTtyZXR1cm4tMSE9PXQ/ZVt0KzFdOnZvaWQgMH1nZXQgdGV4dENvbnRlbnQoKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzP3RoaXMuY2hpbGROb2Rlcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRleHRDb250ZW50fSkpLmpvaW4oIiIpOnRoaXMubm9kZVZhbHVlfHwiIn1nZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzfHxbXX1oYXNDaGlsZE5vZGVzKCl7dmFyIGU7cmV0dXJuKG51bGw9PT0oZT10aGlzLmNoaWxkTm9kZXMpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmxlbmd0aCk+MH1zZWFyY2hOb2RlKGUsdCl7aWYodD49ZS5sZW5ndGgpcmV0dXJuIHRoaXM7Y29uc3Qgcj1lW3RdLG49W107bGV0IGE9dGhpcztmb3IoOzspe3ZhciBpO2lmKHIubmFtZT09PWEubm9kZU5hbWUpe2lmKDAhPT1yLnBvcyl7aWYoMD09PW4ubGVuZ3RoKXJldHVybiBudWxsO3tjb25zdFtpXT1uLnBvcCgpO2xldCBzPTA7Zm9yKGNvbnN0IG4gb2YgaS5jaGlsZE5vZGVzKWlmKHIubmFtZT09PW4ubm9kZU5hbWUpe2lmKHM9PT1yLnBvcylyZXR1cm4gbi5zZWFyY2hOb2RlKGUsdCsxKTtzKyt9cmV0dXJuIGEuc2VhcmNoTm9kZShlLHQrMSl9fXtjb25zdCByPWEuc2VhcmNoTm9kZShlLHQrMSk7aWYobnVsbCE9PXIpcmV0dXJuIHJ9fWlmKChudWxsPT09KGk9YS5jaGlsZE5vZGVzKXx8dm9pZCAwPT09aT92b2lkIDA6aS5sZW5ndGgpPjApbi5wdXNoKFthLDBdKSxhPWEuY2hpbGROb2Rlc1swXTtlbHNle2lmKDA9PT1uLmxlbmd0aClyZXR1cm4gbnVsbDtmb3IoOzAhPT1uLmxlbmd0aDspe2NvbnN0W2UsdF09bi5wb3AoKSxyPXQrMTtpZihyPGUuY2hpbGROb2Rlcy5sZW5ndGgpe24ucHVzaChbZSxyXSksYT1lLmNoaWxkTm9kZXNbcl07YnJlYWt9fWlmKDA9PT1uLmxlbmd0aClyZXR1cm4gbnVsbH19fWR1bXAoZSl7aWYoIiN0ZXh0IiE9PXRoaXMubm9kZU5hbWUpe2lmKGUucHVzaCgiPCIuY29uY2F0KHRoaXMubm9kZU5hbWUpKSx0aGlzLmF0dHJpYnV0ZXMpZm9yKGNvbnN0IHQgb2YgdGhpcy5hdHRyaWJ1dGVzKWUucHVzaCgiICIuY29uY2F0KHQubmFtZSwnPSInKS5jb25jYXQoKDAsbi5lbmNvZGVUb1htbFN0cmluZykodC52YWx1ZSksJyInKSk7aWYodGhpcy5oYXNDaGlsZE5vZGVzKCkpe2UucHVzaCgiPiIpO2Zvcihjb25zdCB0IG9mIHRoaXMuY2hpbGROb2Rlcyl0LmR1bXAoZSk7ZS5wdXNoKCI8LyIuY29uY2F0KHRoaXMubm9kZU5hbWUsIj4iKSl9ZWxzZSB0aGlzLm5vZGVWYWx1ZT9lLnB1c2goIj4iLmNvbmNhdCgoMCxuLmVuY29kZVRvWG1sU3RyaW5nKSh0aGlzLm5vZGVWYWx1ZSksIjwvIikuY29uY2F0KHRoaXMubm9kZU5hbWUsIj4iKSk6ZS5wdXNoKCIvPiIpfWVsc2UgZS5wdXNoKCgwLG4uZW5jb2RlVG9YbWxTdHJpbmcpKHRoaXMubm9kZVZhbHVlKSl9fXQuU2ltcGxlRE9NTm9kZT1vLHQuU2ltcGxlWE1MUGFyc2VyPWNsYXNzIGV4dGVuZHMgc3tjb25zdHJ1Y3RvcihlKXtsZXR7aGFzQXR0cmlidXRlczp0PSExLGxvd2VyQ2FzZU5hbWU6cj0hMX09ZTtzdXBlcigpLHRoaXMuX2N1cnJlbnRGcmFnbWVudD1udWxsLHRoaXMuX3N0YWNrPW51bGwsdGhpcy5fZXJyb3JDb2RlPWEuTm9FcnJvcix0aGlzLl9oYXNBdHRyaWJ1dGVzPXQsdGhpcy5fbG93ZXJDYXNlTmFtZT1yfXBhcnNlRnJvbVN0cmluZyhlKXtpZih0aGlzLl9jdXJyZW50RnJhZ21lbnQ9W10sdGhpcy5fc3RhY2s9W10sdGhpcy5fZXJyb3JDb2RlPWEuTm9FcnJvcix0aGlzLnBhcnNlWG1sKGUpLHRoaXMuX2Vycm9yQ29kZSE9PWEuTm9FcnJvcilyZXR1cm47Y29uc3RbdF09dGhpcy5fY3VycmVudEZyYWdtZW50O3JldHVybiB0P3tkb2N1bWVudEVsZW1lbnQ6dH06dm9pZCAwfW9uVGV4dChlKXtpZihmdW5jdGlvbihlKXtmb3IobGV0IHQ9MCxyPWUubGVuZ3RoO3Q8cjt0KyspaWYoIWkoZSx0KSlyZXR1cm4hMTtyZXR1cm4hMH0oZSkpcmV0dXJuO2NvbnN0IHQ9bmV3IG8oIiN0ZXh0IixlKTt0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaCh0KX1vbkNkYXRhKGUpe2NvbnN0IHQ9bmV3IG8oIiN0ZXh0IixlKTt0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaCh0KX1vbkJlZ2luRWxlbWVudChlLHQscil7dGhpcy5fbG93ZXJDYXNlTmFtZSYmKGU9ZS50b0xvd2VyQ2FzZSgpKTtjb25zdCBuPW5ldyBvKGUpO24uY2hpbGROb2Rlcz1bXSx0aGlzLl9oYXNBdHRyaWJ1dGVzJiYobi5hdHRyaWJ1dGVzPXQpLHRoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKG4pLHJ8fCh0aGlzLl9zdGFjay5wdXNoKHRoaXMuX2N1cnJlbnRGcmFnbWVudCksdGhpcy5fY3VycmVudEZyYWdtZW50PW4uY2hpbGROb2Rlcyl9b25FbmRFbGVtZW50KGUpe3RoaXMuX2N1cnJlbnRGcmFnbWVudD10aGlzLl9zdGFjay5wb3AoKXx8W107Y29uc3QgdD10aGlzLl9jdXJyZW50RnJhZ21lbnQuYXQoLTEpO2lmKCF0KXJldHVybiBudWxsO2Zvcihjb25zdCBlIG9mIHQuY2hpbGROb2RlcyllLnBhcmVudE5vZGU9dDtyZXR1cm4gdH1vbkVycm9yKGUpe3RoaXMuX2Vycm9yQ29kZT1lfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jYWxjdWxhdGVTSEEyNTY9dC5jYWxjdWxhdGVNRDU9dC5QREYyMD10LlBERjE3PXQuQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeT10LkFSQ0ZvdXJDaXBoZXI9dC5BRVMyNTZDaXBoZXI9dC5BRVMxMjhDaXBoZXI9dm9pZCAwLHQuY2FsY3VsYXRlU0hBMzg0PXUsdC5jYWxjdWxhdGVTSEE1MTI9dm9pZCAwLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDEzOSk7dmFyIG49cigxNDQpLGE9cigxNTApLGk9cigyMTkpO2NsYXNzIHN7Y29uc3RydWN0b3IoZSl7dGhpcy5hPTAsdGhpcy5iPTA7Y29uc3QgdD1uZXcgVWludDhBcnJheSgyNTYpLHI9ZS5sZW5ndGg7Zm9yKGxldCBlPTA7ZTwyNTY7KytlKXRbZV09ZTtmb3IobGV0IG49MCxhPTA7bjwyNTY7KytuKXtjb25zdCBpPXRbbl07YT1hK2krZVtuJXJdJjI1NSx0W25dPXRbYV0sdFthXT1pfXRoaXMucz10fWVuY3J5cHRCbG9jayhlKXtsZXQgdD10aGlzLmEscj10aGlzLmI7Y29uc3Qgbj10aGlzLnMsYT1lLmxlbmd0aCxpPW5ldyBVaW50OEFycmF5KGEpO2ZvcihsZXQgcz0wO3M8YTsrK3Mpe3Q9dCsxJjI1NTtjb25zdCBhPW5bdF07cj1yK2EmMjU1O2NvbnN0IG89bltyXTtuW3RdPW8sbltyXT1hLGlbc109ZVtzXV5uW2ErbyYyNTVdfXJldHVybiB0aGlzLmE9dCx0aGlzLmI9cixpfWRlY3J5cHRCbG9jayhlKXtyZXR1cm4gdGhpcy5lbmNyeXB0QmxvY2soZSl9ZW5jcnlwdChlKXtyZXR1cm4gdGhpcy5lbmNyeXB0QmxvY2soZSl9fXQuQVJDRm91ckNpcGhlcj1zO2NvbnN0IG89ZnVuY3Rpb24oKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KFs3LDEyLDE3LDIyLDcsMTIsMTcsMjIsNywxMiwxNywyMiw3LDEyLDE3LDIyLDUsOSwxNCwyMCw1LDksMTQsMjAsNSw5LDE0LDIwLDUsOSwxNCwyMCw0LDExLDE2LDIzLDQsMTEsMTYsMjMsNCwxMSwxNiwyMyw0LDExLDE2LDIzLDYsMTAsMTUsMjEsNiwxMCwxNSwyMSw2LDEwLDE1LDIxLDYsMTAsMTUsMjFdKSx0PW5ldyBJbnQzMkFycmF5KFstNjgwODc2OTM2LC0zODk1NjQ1ODYsNjA2MTA1ODE5LC0xMDQ0NTI1MzMwLC0xNzY0MTg4OTcsMTIwMDA4MDQyNiwtMTQ3MzIzMTM0MSwtNDU3MDU5ODMsMTc3MDAzNTQxNiwtMTk1ODQxNDQxNywtNDIwNjMsLTE5OTA0MDQxNjIsMTgwNDYwMzY4MiwtNDAzNDExMDEsLTE1MDIwMDIyOTAsMTIzNjUzNTMyOSwtMTY1Nzk2NTEwLC0xMDY5NTAxNjMyLDY0MzcxNzcxMywtMzczODk3MzAyLC03MDE1NTg2OTEsMzgwMTYwODMsLTY2MDQ3ODMzNSwtNDA1NTM3ODQ4LDU2ODQ0NjQzOCwtMTAxOTgwMzY5MCwtMTg3MzYzOTYxLDExNjM1MzE1MDEsLTE0NDQ2ODE0NjcsLTUxNDAzNzg0LDE3MzUzMjg0NzMsLTE5MjY2MDc3MzQsLTM3ODU1OCwtMjAyMjU3NDQ2MywxODM5MDMwNTYyLC0zNTMwOTU1NiwtMTUzMDk5MjA2MCwxMjcyODkzMzUzLC0xNTU0OTc2MzIsLTEwOTQ3MzA2NDAsNjgxMjc5MTc0LC0zNTg1MzcyMjIsLTcyMjUyMTk3OSw3NjAyOTE4OSwtNjQwMzY0NDg3LC00MjE4MTU4MzUsNTMwNzQyNTIwLC05OTUzMzg2NTEsLTE5ODYzMDg0NCwxMTI2ODkxNDE1LC0xNDE2MzU0OTA1LC01NzQzNDA1NSwxNzAwNDg1NTcxLC0xODk0OTg2NjA2LC0xMDUxNTIzLC0yMDU0OTIyNzk5LDE4NzMzMTMzNTksLTMwNjExNzQ0LC0xNTYwMTk4MzgwLDEzMDkxNTE2NDksLTE0NTUyMzA3MCwtMTEyMDIxMDM3OSw3MTg3ODcyNTksLTM0MzQ4NTU1MV0pO3JldHVybiBmdW5jdGlvbihyLG4sYSl7bGV0IGk9MTczMjU4NDE5MyxzPS0yNzE3MzM4Nzksbz0tMTczMjU4NDE5NCxjPTI3MTczMzg3ODtjb25zdCBsPWErNzImLTY0LGg9bmV3IFVpbnQ4QXJyYXkobCk7bGV0IHUsZDtmb3IodT0wO3U8YTsrK3UpaFt1XT1yW24rK107aFt1KytdPTEyODtjb25zdCBmPWwtODtmb3IoO3U8ZjspaFt1KytdPTA7aFt1KytdPWE8PDMmMjU1LGhbdSsrXT1hPj41JjI1NSxoW3UrK109YT4+MTMmMjU1LGhbdSsrXT1hPj4yMSYyNTUsaFt1KytdPWE+Pj4yOSYyNTUsaFt1KytdPTAsaFt1KytdPTAsaFt1KytdPTA7Y29uc3QgZz1uZXcgSW50MzJBcnJheSgxNik7Zm9yKHU9MDt1PGw7KXtmb3IoZD0wO2Q8MTY7KytkLHUrPTQpZ1tkXT1oW3VdfGhbdSsxXTw8OHxoW3UrMl08PDE2fGhbdSszXTw8MjQ7bGV0IHIsbixhPWksbD1zLGY9byxwPWM7Zm9yKGQ9MDtkPDY0OysrZCl7ZDwxNj8ocj1sJmZ8fmwmcCxuPWQpOmQ8MzI/KHI9cCZsfH5wJmYsbj01KmQrMSYxNSk6ZDw0OD8ocj1sXmZecCxuPTMqZCs1JjE1KToocj1mXihsfH5wKSxuPTcqZCYxNSk7Y29uc3QgaT1wLHM9YStyK3RbZF0rZ1tuXXwwLG89ZVtkXTtwPWYsZj1sLGw9bCsoczw8b3xzPj4+MzItbyl8MCxhPWl9aT1pK2F8MCxzPXMrbHwwLG89bytmfDAsYz1jK3B8MH1yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzI1NSZpLGk+PjgmMjU1LGk+PjE2JjI1NSxpPj4+MjQmMjU1LDI1NSZzLHM+PjgmMjU1LHM+PjE2JjI1NSxzPj4+MjQmMjU1LDI1NSZvLG8+PjgmMjU1LG8+PjE2JjI1NSxvPj4+MjQmMjU1LDI1NSZjLGM+PjgmMjU1LGM+PjE2JjI1NSxjPj4+MjQmMjU1XSl9fSgpO3QuY2FsY3VsYXRlTUQ1PW87Y2xhc3MgY3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuaGlnaD0wfGUsdGhpcy5sb3c9MHx0fWFuZChlKXt0aGlzLmhpZ2gmPWUuaGlnaCx0aGlzLmxvdyY9ZS5sb3d9eG9yKGUpe3RoaXMuaGlnaF49ZS5oaWdoLHRoaXMubG93Xj1lLmxvd31vcihlKXt0aGlzLmhpZ2h8PWUuaGlnaCx0aGlzLmxvd3w9ZS5sb3d9c2hpZnRSaWdodChlKXtlPj0zMj8odGhpcy5sb3c9dGhpcy5oaWdoPj4+ZS0zMnwwLHRoaXMuaGlnaD0wKToodGhpcy5sb3c9dGhpcy5sb3c+Pj5lfHRoaXMuaGlnaDw8MzItZSx0aGlzLmhpZ2g9dGhpcy5oaWdoPj4+ZXwwKX1zaGlmdExlZnQoZSl7ZT49MzI/KHRoaXMuaGlnaD10aGlzLmxvdzw8ZS0zMix0aGlzLmxvdz0wKToodGhpcy5oaWdoPXRoaXMuaGlnaDw8ZXx0aGlzLmxvdz4+PjMyLWUsdGhpcy5sb3c8PD1lKX1yb3RhdGVSaWdodChlKXtsZXQgdCxyOzMyJmU/KHI9dGhpcy5sb3csdD10aGlzLmhpZ2gpOih0PXRoaXMubG93LHI9dGhpcy5oaWdoKSxlJj0zMSx0aGlzLmxvdz10Pj4+ZXxyPDwzMi1lLHRoaXMuaGlnaD1yPj4+ZXx0PDwzMi1lfW5vdCgpe3RoaXMuaGlnaD1+dGhpcy5oaWdoLHRoaXMubG93PX50aGlzLmxvd31hZGQoZSl7Y29uc3QgdD0odGhpcy5sb3c+Pj4wKSsoZS5sb3c+Pj4wKTtsZXQgcj0odGhpcy5oaWdoPj4+MCkrKGUuaGlnaD4+PjApO3Q+NDI5NDk2NzI5NSYmKHIrPTEpLHRoaXMubG93PTB8dCx0aGlzLmhpZ2g9MHxyfWNvcHlUbyhlLHQpe2VbdF09dGhpcy5oaWdoPj4+MjQmMjU1LGVbdCsxXT10aGlzLmhpZ2g+PjE2JjI1NSxlW3QrMl09dGhpcy5oaWdoPj44JjI1NSxlW3QrM109MjU1JnRoaXMuaGlnaCxlW3QrNF09dGhpcy5sb3c+Pj4yNCYyNTUsZVt0KzVdPXRoaXMubG93Pj4xNiYyNTUsZVt0KzZdPXRoaXMubG93Pj44JjI1NSxlW3QrN109MjU1JnRoaXMubG93fWFzc2lnbihlKXt0aGlzLmhpZ2g9ZS5oaWdoLHRoaXMubG93PWUubG93fX1jb25zdCBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3JldHVybiBlPj4+dHxlPDwzMi10fWZ1bmN0aW9uIHQoZSx0LHIpe3JldHVybiBlJnRefmUmcn1mdW5jdGlvbiByKGUsdCxyKXtyZXR1cm4gZSZ0XmUmcl50JnJ9ZnVuY3Rpb24gbih0KXtyZXR1cm4gZSh0LDIpXmUodCwxMyleZSh0LDIyKX1mdW5jdGlvbiBhKHQpe3JldHVybiBlKHQsNileZSh0LDExKV5lKHQsMjUpfWZ1bmN0aW9uIGkodCl7cmV0dXJuIGUodCw3KV5lKHQsMTgpXnQ+Pj4zfWNvbnN0IHM9WzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OF07cmV0dXJuIGZ1bmN0aW9uKG8sYyxsKXtsZXQgaD0xNzc5MDMzNzAzLHU9MzE0NDEzNDI3NyxkPTEwMTM5MDQyNDIsZj0yNzczNDgwNzYyLGc9MTM1OTg5MzExOSxwPTI2MDA4MjI5MjQsbT01Mjg3MzQ2MzUsYj0xNTQxNDU5MjI1O2NvbnN0IHk9NjQqTWF0aC5jZWlsKChsKzkpLzY0KSx3PW5ldyBVaW50OEFycmF5KHkpO2xldCB2LHg7Zm9yKHY9MDt2PGw7Kyt2KXdbdl09b1tjKytdO3dbdisrXT0xMjg7Y29uc3QgUz15LTg7Zm9yKDt2PFM7KXdbdisrXT0wO3dbdisrXT0wLHdbdisrXT0wLHdbdisrXT0wLHdbdisrXT1sPj4+MjkmMjU1LHdbdisrXT1sPj4yMSYyNTUsd1t2KytdPWw+PjEzJjI1NSx3W3YrK109bD4+NSYyNTUsd1t2KytdPWw8PDMmMjU1O2NvbnN0IEE9bmV3IFVpbnQzMkFycmF5KDY0KTtmb3Iodj0wO3Y8eTspe2Zvcih4PTA7eDwxNjsrK3gpQVt4XT13W3ZdPDwyNHx3W3YrMV08PDE2fHdbdisyXTw8OHx3W3YrM10sdis9NDtmb3IoeD0xNjt4PDY0OysreClBW3hdPShlKGs9QVt4LTJdLDE3KV5lKGssMTkpXms+Pj4xMCkrQVt4LTddK2koQVt4LTE1XSkrQVt4LTE2XXwwO2xldCBvLGMsbD1oLHk9dSxTPWQsQz1mLE89ZyxGPXAsST1tLFQ9Yjtmb3IoeD0wO3g8NjQ7Kyt4KW89VCthKE8pK3QoTyxGLEkpK3NbeF0rQVt4XSxjPW4obCkrcihsLHksUyksVD1JLEk9RixGPU8sTz1DK298MCxDPVMsUz15LHk9bCxsPW8rY3wwO2g9aCtsfDAsdT11K3l8MCxkPWQrU3wwLGY9ZitDfDAsZz1nK098MCxwPXArRnwwLG09bStJfDAsYj1iK1R8MH12YXIgaztyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoW2g+PjI0JjI1NSxoPj4xNiYyNTUsaD4+OCYyNTUsMjU1JmgsdT4+MjQmMjU1LHU+PjE2JjI1NSx1Pj44JjI1NSwyNTUmdSxkPj4yNCYyNTUsZD4+MTYmMjU1LGQ+PjgmMjU1LDI1NSZkLGY+PjI0JjI1NSxmPj4xNiYyNTUsZj4+OCYyNTUsMjU1JmYsZz4+MjQmMjU1LGc+PjE2JjI1NSxnPj44JjI1NSwyNTUmZyxwPj4yNCYyNTUscD4+MTYmMjU1LHA+PjgmMjU1LDI1NSZwLG0+PjI0JjI1NSxtPj4xNiYyNTUsbT4+OCYyNTUsMjU1Jm0sYj4+MjQmMjU1LGI+PjE2JjI1NSxiPj44JjI1NSwyNTUmYl0pfX0oKTt0LmNhbGN1bGF0ZVNIQTI1Nj1sO2NvbnN0IGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxyLG4sYSl7ZS5hc3NpZ24odCksZS5hbmQociksYS5hc3NpZ24odCksYS5ub3QoKSxhLmFuZChuKSxlLnhvcihhKX1mdW5jdGlvbiB0KGUsdCxyLG4sYSl7ZS5hc3NpZ24odCksZS5hbmQociksYS5hc3NpZ24odCksYS5hbmQobiksZS54b3IoYSksYS5hc3NpZ24ociksYS5hbmQobiksZS54b3IoYSl9ZnVuY3Rpb24gcihlLHQscil7ZS5hc3NpZ24odCksZS5yb3RhdGVSaWdodCgyOCksci5hc3NpZ24odCksci5yb3RhdGVSaWdodCgzNCksZS54b3Iociksci5hc3NpZ24odCksci5yb3RhdGVSaWdodCgzOSksZS54b3Iocil9ZnVuY3Rpb24gbihlLHQscil7ZS5hc3NpZ24odCksZS5yb3RhdGVSaWdodCgxNCksci5hc3NpZ24odCksci5yb3RhdGVSaWdodCgxOCksZS54b3Iociksci5hc3NpZ24odCksci5yb3RhdGVSaWdodCg0MSksZS54b3Iocil9ZnVuY3Rpb24gYShlLHQscil7ZS5hc3NpZ24odCksZS5yb3RhdGVSaWdodCgxKSxyLmFzc2lnbih0KSxyLnJvdGF0ZVJpZ2h0KDgpLGUueG9yKHIpLHIuYXNzaWduKHQpLHIuc2hpZnRSaWdodCg3KSxlLnhvcihyKX1mdW5jdGlvbiBpKGUsdCxyKXtlLmFzc2lnbih0KSxlLnJvdGF0ZVJpZ2h0KDE5KSxyLmFzc2lnbih0KSxyLnJvdGF0ZVJpZ2h0KDYxKSxlLnhvcihyKSxyLmFzc2lnbih0KSxyLnNoaWZ0UmlnaHQoNiksZS54b3Iocil9Y29uc3Qgcz1bbmV3IGMoMTExNjM1MjQwOCwzNjA5NzY3NDU4KSxuZXcgYygxODk5NDQ3NDQxLDYwMjg5MTcyNSksbmV3IGMoMzA0OTMyMzQ3MSwzOTY0NDg0Mzk5KSxuZXcgYygzOTIxMDA5NTczLDIxNzMyOTU1NDgpLG5ldyBjKDk2MTk4NzE2Myw0MDgxNjI4NDcyKSxuZXcgYygxNTA4OTcwOTkzLDMwNTM4MzQyNjUpLG5ldyBjKDI0NTM2MzU3NDgsMjkzNzY3MTU3OSksbmV3IGMoMjg3MDc2MzIyMSwzNjY0NjA5NTYwKSxuZXcgYygzNjI0MzgxMDgwLDI3MzQ4ODMzOTQpLG5ldyBjKDMxMDU5ODQwMSwxMTY0OTk2NTQyKSxuZXcgYyg2MDcyMjUyNzgsMTMyMzYxMDc2NCksbmV3IGMoMTQyNjg4MTk4NywzNTkwMzA0OTk0KSxuZXcgYygxOTI1MDc4Mzg4LDQwNjgxODIzODMpLG5ldyBjKDIxNjIwNzgyMDYsOTkxMzM2MTEzKSxuZXcgYygyNjE0ODg4MTAzLDYzMzgwMzMxNyksbmV3IGMoMzI0ODIyMjU4MCwzNDc5Nzc0ODY4KSxuZXcgYygzODM1MzkwNDAxLDI2NjY2MTM0NTgpLG5ldyBjKDQwMjIyMjQ3NzQsOTQ0NzExMTM5KSxuZXcgYygyNjQzNDcwNzgsMjM0MTI2Mjc3MyksbmV3IGMoNjA0ODA3NjI4LDIwMDc4MDA5MzMpLG5ldyBjKDc3MDI1NTk4MywxNDk1OTkwOTAxKSxuZXcgYygxMjQ5MTUwMTIyLDE4NTY0MzEyMzUpLG5ldyBjKDE1NTUwODE2OTIsMzE3NTIxODEzMiksbmV3IGMoMTk5NjA2NDk4NiwyMTk4OTUwODM3KSxuZXcgYygyNTU0MjIwODgyLDM5OTk3MTkzMzkpLG5ldyBjKDI4MjE4MzQzNDksNzY2Nzg0MDE2KSxuZXcgYygyOTUyOTk2ODA4LDI1NjY1OTQ4NzkpLG5ldyBjKDMyMTAzMTM2NzEsMzIwMzMzNzk1NiksbmV3IGMoMzMzNjU3MTg5MSwxMDM0NDU3MDI2KSxuZXcgYygzNTg0NTI4NzExLDI0NjY5NDg5MDEpLG5ldyBjKDExMzkyNjk5MywzNzU4MzI2MzgzKSxuZXcgYygzMzgyNDE4OTUsMTY4NzE3OTM2KSxuZXcgYyg2NjYzMDcyMDUsMTE4ODE3OTk2NCksbmV3IGMoNzczNTI5OTEyLDE1NDYwNDU3MzQpLG5ldyBjKDEyOTQ3NTczNzIsMTUyMjgwNTQ4NSksbmV3IGMoMTM5NjE4MjI5MSwyNjQzODMzODIzKSxuZXcgYygxNjk1MTgzNzAwLDIzNDM1MjczOTApLG5ldyBjKDE5ODY2NjEwNTEsMTAxNDQ3NzQ4MCksbmV3IGMoMjE3NzAyNjM1MCwxMjA2NzU5MTQyKSxuZXcgYygyNDU2OTU2MDM3LDM0NDA3NzYyNyksbmV3IGMoMjczMDQ4NTkyMSwxMjkwODYzNDYwKSxuZXcgYygyODIwMzAyNDExLDMxNTg0NTQyNzMpLG5ldyBjKDMyNTk3MzA4MDAsMzUwNTk1MjY1NyksbmV3IGMoMzM0NTc2NDc3MSwxMDYyMTcwMDgpLG5ldyBjKDM1MTYwNjU4MTcsMzYwNjAwODM0NCksbmV3IGMoMzYwMDM1MjgwNCwxNDMyNzI1Nzc2KSxuZXcgYyg0MDk0NTcxOTA5LDE0NjcwMzE1OTQpLG5ldyBjKDI3NTQyMzM0NCw4NTExNjk3MjApLG5ldyBjKDQzMDIyNzczNCwzMTAwODIzNzUyKSxuZXcgYyg1MDY5NDg2MTYsMTM2MzI1ODE5NSksbmV3IGMoNjU5MDYwNTU2LDM3NTA2ODU1OTMpLG5ldyBjKDg4Mzk5Nzg3NywzNzg1MDUwMjgwKSxuZXcgYyg5NTgxMzk1NzEsMzMxODMwNzQyNyksbmV3IGMoMTMyMjgyMjIxOCwzODEyNzIzNDAzKSxuZXcgYygxNTM3MDAyMDYzLDIwMDMwMzQ5OTUpLG5ldyBjKDE3NDc4NzM3NzksMzYwMjAzNjg5OSksbmV3IGMoMTk1NTU2MjIyMiwxNTc1OTkwMDEyKSxuZXcgYygyMDI0MTA0ODE1LDExMjU1OTI5MjgpLG5ldyBjKDIyMjc3MzA0NTIsMjcxNjkwNDMwNiksbmV3IGMoMjM2MTg1MjQyNCw0NDI3NzYwNDQpLG5ldyBjKDI0Mjg0MzY0NzQsNTkzNjk4MzQ0KSxuZXcgYygyNzU2NzM0MTg3LDM3MzMxMTAyNDkpLG5ldyBjKDMyMDQwMzE0NzksMjk5OTM1MTU3MyksbmV3IGMoMzMyOTMyNTI5OCwzODE1OTIwNDI3KSxuZXcgYygzMzkxNTY5NjE0LDM5MjgzODM5MDApLG5ldyBjKDM1MTUyNjcyNzEsNTY2MjgwNzExKSxuZXcgYygzOTQwMTg3NjA2LDM0NTQwNjk1MzQpLG5ldyBjKDQxMTg2MzAyNzEsNDAwMDIzOTk5MiksbmV3IGMoMTE2NDE4NDc0LDE5MTQxMzg1NTQpLG5ldyBjKDE3NDI5MjQyMSwyNzMxMDU1MjcwKSxuZXcgYygyODkzODAzNTYsMzIwMzk5MzAwNiksbmV3IGMoNDYwMzkzMjY5LDMyMDYyMDMxNSksbmV3IGMoNjg1NDcxNzMzLDU4NzQ5NjgzNiksbmV3IGMoODUyMTQyOTcxLDEwODY3OTI4NTEpLG5ldyBjKDEwMTcwMzYyOTgsMzY1NTQzMTAwKSxuZXcgYygxMTI2MDAwNTgwLDI2MTgyOTc2NzYpLG5ldyBjKDEyODgwMzM0NzAsMzQwOTg1NTE1OCksbmV3IGMoMTUwMTUwNTk0OCw0MjM0NTA5ODY2KSxuZXcgYygxNjA3MTY3OTE1LDk4NzE2NzQ2OCksbmV3IGMoMTgxNjQwMjMxNiwxMjQ2MTg5NTkxKV07cmV0dXJuIGZ1bmN0aW9uKG8sbCxoKXtsZXQgdSxkLGYsZyxwLG0sYix5LHc9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXTt3Pyh1PW5ldyBjKDM0MTgwNzAzNjUsMzIzODM3MTAzMiksZD1uZXcgYygxNjU0MjcwMjUwLDkxNDE1MDY2MyksZj1uZXcgYygyNDM4NTI5MzcwLDgxMjcwMjk5OSksZz1uZXcgYygzNTU0NjIzNjAsNDE0NDkxMjY5NykscD1uZXcgYygxNzMxNDA1NDE1LDQyOTA3NzU4NTcpLG09bmV3IGMoMjM5NDE4MDIzMSwxNzUwNjAzMDI1KSxiPW5ldyBjKDM2NzUwMDg1MjUsMTY5NDA3NjgzOSkseT1uZXcgYygxMjAzMDYyODEzLDMyMDQwNzU0MjgpKToodT1uZXcgYygxNzc5MDMzNzAzLDQwODkyMzU3MjApLGQ9bmV3IGMoMzE0NDEzNDI3NywyMjI3ODczNTk1KSxmPW5ldyBjKDEwMTM5MDQyNDIsNDI3MTE3NTcyMyksZz1uZXcgYygyNzczNDgwNzYyLDE1OTU3NTAxMjkpLHA9bmV3IGMoMTM1OTg5MzExOSwyOTE3NTY1MTM3KSxtPW5ldyBjKDI2MDA4MjI5MjQsNzI1NTExMTk5KSxiPW5ldyBjKDUyODczNDYzNSw0MjE1Mzg5NTQ3KSx5PW5ldyBjKDE1NDE0NTkyMjUsMzI3MDMzMjA5KSk7Y29uc3Qgdj0xMjgqTWF0aC5jZWlsKChoKzE3KS8xMjgpLHg9bmV3IFVpbnQ4QXJyYXkodik7bGV0IFMsQTtmb3IoUz0wO1M8aDsrK1MpeFtTXT1vW2wrK107eFtTKytdPTEyODtjb25zdCBrPXYtMTY7Zm9yKDtTPGs7KXhbUysrXT0wO3hbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT1oPj4+MjkmMjU1LHhbUysrXT1oPj4yMSYyNTUseFtTKytdPWg+PjEzJjI1NSx4W1MrK109aD4+NSYyNTUseFtTKytdPWg8PDMmMjU1O2NvbnN0IEM9bmV3IEFycmF5KDgwKTtmb3IoUz0wO1M8ODA7UysrKUNbU109bmV3IGMoMCwwKTtsZXQgTz1uZXcgYygwLDApLEY9bmV3IGMoMCwwKSxJPW5ldyBjKDAsMCksVD1uZXcgYygwLDApLE09bmV3IGMoMCwwKSxFPW5ldyBjKDAsMCksUD1uZXcgYygwLDApLFI9bmV3IGMoMCwwKTtjb25zdCBOPW5ldyBjKDAsMCksRD1uZXcgYygwLDApLEI9bmV3IGMoMCwwKSxMPW5ldyBjKDAsMCk7bGV0IF8sajtmb3IoUz0wO1M8djspe2ZvcihBPTA7QTwxNjsrK0EpQ1tBXS5oaWdoPXhbU108PDI0fHhbUysxXTw8MTZ8eFtTKzJdPDw4fHhbUyszXSxDW0FdLmxvdz14W1MrNF08PDI0fHhbUys1XTw8MTZ8eFtTKzZdPDw4fHhbUys3XSxTKz04O2ZvcihBPTE2O0E8ODA7KytBKV89Q1tBXSxpKF8sQ1tBLTJdLEwpLF8uYWRkKENbQS03XSksYShCLENbQS0xNV0sTCksXy5hZGQoQiksXy5hZGQoQ1tBLTE2XSk7Zm9yKE8uYXNzaWduKHUpLEYuYXNzaWduKGQpLEkuYXNzaWduKGYpLFQuYXNzaWduKGcpLE0uYXNzaWduKHApLEUuYXNzaWduKG0pLFAuYXNzaWduKGIpLFIuYXNzaWduKHkpLEE9MDtBPDgwOysrQSlOLmFzc2lnbihSKSxuKEIsTSxMKSxOLmFkZChCKSxlKEIsTSxFLFAsTCksTi5hZGQoQiksTi5hZGQoc1tBXSksTi5hZGQoQ1tBXSkscihELE8sTCksdChCLE8sRixJLEwpLEQuYWRkKEIpLF89UixSPVAsUD1FLEU9TSxULmFkZChOKSxNPVQsVD1JLEk9RixGPU8sXy5hc3NpZ24oTiksXy5hZGQoRCksTz1fO3UuYWRkKE8pLGQuYWRkKEYpLGYuYWRkKEkpLGcuYWRkKFQpLHAuYWRkKE0pLG0uYWRkKEUpLGIuYWRkKFApLHkuYWRkKFIpfXJldHVybiB3PyhqPW5ldyBVaW50OEFycmF5KDQ4KSx1LmNvcHlUbyhqLDApLGQuY29weVRvKGosOCksZi5jb3B5VG8oaiwxNiksZy5jb3B5VG8oaiwyNCkscC5jb3B5VG8oaiwzMiksbS5jb3B5VG8oaiw0MCkpOihqPW5ldyBVaW50OEFycmF5KDY0KSx1LmNvcHlUbyhqLDApLGQuY29weVRvKGosOCksZi5jb3B5VG8oaiwxNiksZy5jb3B5VG8oaiwyNCkscC5jb3B5VG8oaiwzMiksbS5jb3B5VG8oaiw0MCksYi5jb3B5VG8oaiw0OCkseS5jb3B5VG8oaiw1NikpLGp9fSgpO2Z1bmN0aW9uIHUoZSx0LHIpe3JldHVybiBoKGUsdCxyLCEwKX10LmNhbGN1bGF0ZVNIQTUxMj1oO2NsYXNzIGR7ZGVjcnlwdEJsb2NrKGUpe3JldHVybiBlfWVuY3J5cHQoZSl7cmV0dXJuIGV9fWNsYXNzIGZ7Y29uc3RydWN0b3IoKXt0aGlzLmNvbnN0cnVjdG9yPT09ZiYmKDAsbi51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEFFU0Jhc2VDaXBoZXIuIiksdGhpcy5fcz1uZXcgVWludDhBcnJheShbOTksMTI0LDExOSwxMjMsMjQyLDEwNywxMTEsMTk3LDQ4LDEsMTAzLDQzLDI1NCwyMTUsMTcxLDExOCwyMDIsMTMwLDIwMSwxMjUsMjUwLDg5LDcxLDI0MCwxNzMsMjEyLDE2MiwxNzUsMTU2LDE2NCwxMTQsMTkyLDE4MywyNTMsMTQ3LDM4LDU0LDYzLDI0NywyMDQsNTIsMTY1LDIyOSwyNDEsMTEzLDIxNiw0OSwyMSw0LDE5OSwzNSwxOTUsMjQsMTUwLDUsMTU0LDcsMTgsMTI4LDIyNiwyMzUsMzksMTc4LDExNyw5LDEzMSw0NCwyNiwyNywxMTAsOTAsMTYwLDgyLDU5LDIxNCwxNzksNDEsMjI3LDQ3LDEzMiw4MywyMDksMCwyMzcsMzIsMjUyLDE3Nyw5MSwxMDYsMjAzLDE5MCw1Nyw3NCw3Niw4OCwyMDcsMjA4LDIzOSwxNzAsMjUxLDY3LDc3LDUxLDEzMyw2OSwyNDksMiwxMjcsODAsNjAsMTU5LDE2OCw4MSwxNjMsNjQsMTQzLDE0NiwxNTcsNTYsMjQ1LDE4OCwxODIsMjE4LDMzLDE2LDI1NSwyNDMsMjEwLDIwNSwxMiwxOSwyMzYsOTUsMTUxLDY4LDIzLDE5NiwxNjcsMTI2LDYxLDEwMCw5MywyNSwxMTUsOTYsMTI5LDc5LDIyMCwzNCw0MiwxNDQsMTM2LDcwLDIzOCwxODQsMjAsMjIyLDk0LDExLDIxOSwyMjQsNTAsNTgsMTAsNzMsNiwzNiw5MiwxOTQsMjExLDE3Miw5OCwxNDUsMTQ5LDIyOCwxMjEsMjMxLDIwMCw1NSwxMDksMTQxLDIxMyw3OCwxNjksMTA4LDg2LDI0NCwyMzQsMTAxLDEyMiwxNzQsOCwxODYsMTIwLDM3LDQ2LDI4LDE2NiwxODAsMTk4LDIzMiwyMjEsMTE2LDMxLDc1LDE4OSwxMzksMTM4LDExMiw2MiwxODEsMTAyLDcyLDMsMjQ2LDE0LDk3LDUzLDg3LDE4NSwxMzQsMTkzLDI5LDE1OCwyMjUsMjQ4LDE1MiwxNywxMDUsMjE3LDE0MiwxNDgsMTU1LDMwLDEzNSwyMzMsMjA2LDg1LDQwLDIyMywxNDAsMTYxLDEzNywxMywxOTEsMjMwLDY2LDEwNCw2NSwxNTMsNDUsMTUsMTc2LDg0LDE4NywyMl0pLHRoaXMuX2ludl9zPW5ldyBVaW50OEFycmF5KFs4Miw5LDEwNiwyMTMsNDgsNTQsMTY1LDU2LDE5MSw2NCwxNjMsMTU4LDEyOSwyNDMsMjE1LDI1MSwxMjQsMjI3LDU3LDEzMCwxNTUsNDcsMjU1LDEzNSw1MiwxNDIsNjcsNjgsMTk2LDIyMiwyMzMsMjAzLDg0LDEyMywxNDgsNTAsMTY2LDE5NCwzNSw2MSwyMzgsNzYsMTQ5LDExLDY2LDI1MCwxOTUsNzgsOCw0NiwxNjEsMTAyLDQwLDIxNywzNiwxNzgsMTE4LDkxLDE2Miw3MywxMDksMTM5LDIwOSwzNywxMTQsMjQ4LDI0NiwxMDAsMTM0LDEwNCwxNTIsMjIsMjEyLDE2NCw5MiwyMDQsOTMsMTAxLDE4MiwxNDYsMTA4LDExMiw3Miw4MCwyNTMsMjM3LDE4NSwyMTgsOTQsMjEsNzAsODcsMTY3LDE0MSwxNTcsMTMyLDE0NCwyMTYsMTcxLDAsMTQwLDE4OCwyMTEsMTAsMjQ3LDIyOCw4OCw1LDE4NCwxNzksNjksNiwyMDgsNDQsMzAsMTQzLDIwMiw2MywxNSwyLDE5MywxNzUsMTg5LDMsMSwxOSwxMzgsMTA3LDU4LDE0NSwxNyw2NSw3OSwxMDMsMjIwLDIzNCwxNTEsMjQyLDIwNywyMDYsMjQwLDE4MCwyMzAsMTE1LDE1MCwxNzIsMTE2LDM0LDIzMSwxNzMsNTMsMTMzLDIyNiwyNDksNTUsMjMyLDI4LDExNywyMjMsMTEwLDcxLDI0MSwyNiwxMTMsMjksNDEsMTk3LDEzNywxMTEsMTgzLDk4LDE0LDE3MCwyNCwxOTAsMjcsMjUyLDg2LDYyLDc1LDE5OCwyMTAsMTIxLDMyLDE1NCwyMTksMTkyLDI1NCwxMjAsMjA1LDkwLDI0NCwzMSwyMjEsMTY4LDUxLDEzNiw3LDE5OSw0OSwxNzcsMTgsMTYsODksMzksMTI4LDIzNiw5NSw5Niw4MSwxMjcsMTY5LDI1LDE4MSw3NCwxMyw0NSwyMjksMTIyLDE1OSwxNDcsMjAxLDE1NiwyMzksMTYwLDIyNCw1OSw3NywxNzQsNDIsMjQ1LDE3NiwyMDAsMjM1LDE4Nyw2MCwxMzEsODMsMTUzLDk3LDIzLDQzLDQsMTI2LDE4NiwxMTksMjE0LDM4LDIyNSwxMDUsMjAsOTksODUsMzMsMTIsMTI1XSksdGhpcy5fbWl4PW5ldyBVaW50MzJBcnJheShbMCwyMzU0NzQxODcsNDcwOTQ4Mzc0LDMwMzc2NTI3Nyw5NDE4OTY3NDgsOTA4OTMzNDE1LDYwNzUzMDU1NCw3MDg3ODA4NDksMTg4Mzc5MzQ5NiwyMTE4MjE0OTk1LDE4MTc4NjY4MzAsMTY0OTYzOTIzNywxMjE1MDYxMTA4LDExODEwNDUxMTksMTQxNzU2MTY5OCwxNTE3NzY3NTI5LDM3Njc1ODY5OTIsNDAwMzA2MTE3OSw0MjM2NDI5OTkwLDQwNjkyNDY4OTMsMzYzNTczMzY2MCwzNjAyNzcwMzI3LDMyOTkyNzg0NzQsMzQwMDUyODc2OSwyNDMwMTIyMjE2LDI2NjQ1NDM3MTUsMjM2MjA5MDIzOCwyMTkzODYyNjQ1LDI4MzUxMjMzOTYsMjgwMTEwNzQwNywzMDM1NTM1MDU4LDMxMzU3NDA4ODksMzY3ODEyNDkyMywzNTc2ODcwNTEyLDMzNDEzOTQyODUsMzM3NDM2MTcwMiwzODEwNDk2MzQzLDM5Nzc2NzUzNTYsNDI3OTA4MDI1Nyw0MDQzNjEwMTg2LDI4NzY0OTQ2MjcsMjc3NjI5MjkwNCwzMDc2NjM5MDI5LDMxMTA2NTA5NDIsMjQ3MjAxMTUzNSwyNjQwMjQzMjA0LDI0MDM3Mjg2NjUsMjE2OTMwMzA1OCwxMDAxMDg5OTk1LDg5OTgzNTU4NCw2NjY0NjQ3MzMsNjk5NDMyMTUwLDU5NzI3ODQ3LDIyNjkwNjg2MCw1MzA0MDA3NTMsMjk0OTMwNjgyLDEyNzMxNjg3ODcsMTE3Mjk2NzA2NCwxNDc1NDE4NTAxLDE1MDk0MzA0MTQsMTk0MjQzNTc3NSwyMTEwNjY3NDQ0LDE4NzYyNDE4MzMsMTY0MTgxNjIyNiwyOTEwMjE5NzY2LDI3NDMwMzQxMDksMjk3NjE1MTUyMCwzMjExNjIzMTQ3LDI1MDUyMDIxMzgsMjYwNjQ1Mzk2OSwyMzAyNjkwMjUyLDIyNjk3Mjg0NTUsMzcxMTgyOTQyMiwzNTQzNTk5MjY5LDMyNDA4OTQzOTIsMzQ3NTMxMzMzMSwzODQzNjk5MDc0LDM5NDM5MDY0NDEsNDE3ODA2MjIyOCw0MTQ0MDQ3Nzc1LDEzMDY5NjczNjYsMTEzOTc4MTcwOSwxMzc0OTg4MTEyLDE2MTA0NTk3MzksMTk3NTY4MzQzNCwyMDc2OTM1MjY1LDE3NzUyNzY5MjQsMTc0MjMxNTEyNywxMDM0ODY3OTk4LDg2NjYzNzg0NSw1NjYwMjE4OTYsODAwNDQwODM1LDkyOTg3Njk4LDE5MzE5NTA2NSw0Mjk0NTYxNjQsMzk1NDQxNzExLDE5ODQ4MTI2ODUsMjAxNzc3ODU2NiwxNzg0NjYzMTk1LDE2ODM0MDcyNDgsMTMxNTU2MjE0NSwxMDgwMDk0NjM0LDEzODM4NTYzMTEsMTU1MTAzNzg4NCwxMDEwMzk4MjksMTM1MDUwMjA2LDQzNzc1NzEyMywzMzc1NTM4NjQsMTA0MjM4NTY1Nyw4MDc5NjI2MTAsNTczODA0NzgzLDc0MjAzOTAxMiwyNTMxMDY3NDUzLDI1NjQwMzMzMzQsMjMyODgyODk3MSwyMjI3NTczMDI0LDI5MzU1NjY4NjUsMjcwMDA5OTM1NCwzMDAxNzU1NjU1LDMxNjg5MzcyMjgsMzg2ODU1MjgwNSwzOTAyNTYzMTgyLDQyMDMxODExNzEsNDEwMjk3NzkxMiwzNzM2MTY0OTM3LDM1MDE3NDE4OTAsMzI2NTQ3ODc1MSwzNDMzNzEyOTgwLDExMDYwNDE1OTEsMTM0MDQ2MzEwMCwxNTc2OTc2NjA5LDE0MDg3NDkwMzQsMjA0MzIxMTQ4MywyMDA5MTk1NDcyLDE3MDg4NDgzMzMsMTgwOTA1NDE1MCw4MzI4NzcyMzEsMTA2ODM1MTM5Niw3NjY5NDU0NjUsNTk5NzYyMzU0LDE1OTQxNzk4NywxMjY0NTQ2NjQsMzYxOTI5ODc3LDQ2MzE4MDE5MCwyNzA5MjYwODcxLDI5NDM2ODIzODAsMzE3ODEwNjk2MSwzMDA5ODc5Mzg2LDI1NzI2OTcxOTUsMjUzODY4MTE4NCwyMjM2MjI4NzMzLDIzMzY0MzQ1NTAsMzUwOTg3MTEzNSwzNzQ1MzQ1MzAwLDM0NDE4NTAzNzcsMzI3NDY2NzI2NiwzOTEwMTYxOTcxLDM4NzcxOTg2NDgsNDExMDU2ODQ4NSw0MjExODE4Nzk4LDI1OTc4MDY0NzYsMjQ5NzYwNDc0MywyMjYxMDg5MTc4LDIyOTUxMDEwNzMsMjczMzg1NjE2MCwyOTAyMDg3ODUxLDMyMDI0MzcwNDYsMjk2ODAxMTQ1MywzOTM2MjkxMjg0LDM4MzUwMzY4OTUsNDEzNjQ0MDc3MCw0MTY5NDA4MjAxLDM1MzU0ODY0NTYsMzcwMjY2NTQ1OSwzNDY3MTkyMzAyLDMyMzE3MjIyMTMsMjA1MTUxODc4MCwxOTUxMzE3MDQ3LDE3MTY4OTA0MTAsMTc1MDkwMjMwNSwxMTEzODE4Mzg0LDEyODIwNTAwNzUsMTU4NDUwNDU4MiwxMzUwMDc4OTg5LDE2ODgxMDg1Miw2NzU1NjQ2MywzNzEwNDkzMzAsNDA0MDE2NzYxLDg0MTczOTU5MiwxMDA4OTE4NTk1LDc3NTU1MDgxNCw1NDAwODA3MjUsMzk2OTU2MjM2OSwzODAxMzMyMjM0LDQwMzU0ODkwNDcsNDI2OTkwNzk5NiwzNTY5MjU1MjEzLDM2Njk0NjI1NjYsMzM2Njc1NDYxOSwzMzMyNzQwMTQ0LDI2MzEwNjU0MzMsMjQ2Mzg3OTc2MiwyMTYwMTE3MDcxLDIzOTU1ODg2NzYsMjc2NzY0NTU1NywyODY4ODk3NDA2LDMxMDIwMTE3NDcsMzA2OTA0OTk2MCwyMDIwMDg0OTcsMzM3NzgzNjIsMjcwMDQwNDg3LDUwNDQ1OTQzNiw4NzU0NTEyOTMsOTc1NjU4NjQ2LDY3NTAzOTYyNyw2NDEwMjUxNTIsMjA4NDcwNDIzMywxOTE3NTE4NTYyLDE2MTU4NjEyNDcsMTg1MTMzMjg1MiwxMTQ3NTUwNjYxLDEyNDg4MDI1MTAsMTQ4NDAwNTg0MywxNDUxMDQ0MDU2LDkzMzMwMTM3MCw5NjczMTE3MjksNzMzMTU2OTcyLDYzMjk1MzcwMywyNjAzODg5NTAsMjU5NjU5MTcsMzI4NjcxODA4LDQ5NjkwNjA1OSwxMjA2NDc3ODU4LDEyMzk0NDM3NTMsMTU0MzIwODUwMCwxNDQxOTUyNTc1LDIxNDQxNjE4MDYsMTkwODY5NDI3NywxNjc1NTc3ODgwLDE4NDI3NTk0NDMsMzYxMDM2OTIyNiwzNjQ0Mzc5NTg1LDM0MDgxMTk1MTYsMzMwNzkxNjI0Nyw0MDExMTkwNTAyLDM3NzY3Njc0NjksNDA3NzM4NDQzMiw0MjQ1NjE4NjgzLDI4MDk3NzExNTQsMjg0MjczNzA0OSwzMTQ0Mzk2NDIwLDMwNDMxNDA0OTUsMjY3MzcwNTE1MCwyNDM4MjM3NjIxLDIyMDMwMzIyMzIsMjM3MDIxMzc5NV0pLHRoaXMuX21peENvbD1uZXcgVWludDhBcnJheSgyNTYpO2ZvcihsZXQgZT0wO2U8MjU2O2UrKyl0aGlzLl9taXhDb2xbZV09ZTwxMjg/ZTw8MTplPDwxXjI3O3RoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDE2KSx0aGlzLmJ1ZmZlclBvc2l0aW9uPTB9X2V4cGFuZEtleShlKXsoMCxuLnVucmVhY2hhYmxlKSgiQ2Fubm90IGNhbGwgYF9leHBhbmRLZXlgIG9uIHRoZSBiYXNlIGNsYXNzIil9X2RlY3J5cHQoZSx0KXtsZXQgcixuLGE7Y29uc3QgaT1uZXcgVWludDhBcnJheSgxNik7aS5zZXQoZSk7Zm9yKGxldCBlPTAscj10aGlzLl9rZXlTaXplO2U8MTY7KytlLCsrcilpW2VdXj10W3JdO2ZvcihsZXQgZT10aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24tMTtlPj0xOy0tZSl7cj1pWzEzXSxpWzEzXT1pWzldLGlbOV09aVs1XSxpWzVdPWlbMV0saVsxXT1yLHI9aVsxNF0sbj1pWzEwXSxpWzE0XT1pWzZdLGlbMTBdPWlbMl0saVs2XT1yLGlbMl09bixyPWlbMTVdLG49aVsxMV0sYT1pWzddLGlbMTVdPWlbM10saVsxMV09cixpWzddPW4saVszXT1hO2ZvcihsZXQgZT0wO2U8MTY7KytlKWlbZV09dGhpcy5faW52X3NbaVtlXV07Zm9yKGxldCByPTAsbj0xNiplO3I8MTY7KytyLCsrbilpW3JdXj10W25dO2ZvcihsZXQgZT0wO2U8MTY7ZSs9NCl7Y29uc3QgdD10aGlzLl9taXhbaVtlXV0sbj10aGlzLl9taXhbaVtlKzFdXSxhPXRoaXMuX21peFtpW2UrMl1dLHM9dGhpcy5fbWl4W2lbZSszXV07cj10Xm4+Pj44Xm48PDI0XmE+Pj4xNl5hPDwxNl5zPj4+MjReczw8OCxpW2VdPXI+Pj4yNCYyNTUsaVtlKzFdPXI+PjE2JjI1NSxpW2UrMl09cj4+OCYyNTUsaVtlKzNdPTI1NSZyfX1yPWlbMTNdLGlbMTNdPWlbOV0saVs5XT1pWzVdLGlbNV09aVsxXSxpWzFdPXIscj1pWzE0XSxuPWlbMTBdLGlbMTRdPWlbNl0saVsxMF09aVsyXSxpWzZdPXIsaVsyXT1uLHI9aVsxNV0sbj1pWzExXSxhPWlbN10saVsxNV09aVszXSxpWzExXT1yLGlbN109bixpWzNdPWE7Zm9yKGxldCBlPTA7ZTwxNjsrK2UpaVtlXT10aGlzLl9pbnZfc1tpW2VdXSxpW2VdXj10W2VdO3JldHVybiBpfV9lbmNyeXB0KGUsdCl7Y29uc3Qgcj10aGlzLl9zO2xldCBuLGEsaTtjb25zdCBzPW5ldyBVaW50OEFycmF5KDE2KTtzLnNldChlKTtmb3IobGV0IGU9MDtlPDE2OysrZSlzW2VdXj10W2VdO2ZvcihsZXQgZT0xO2U8dGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uO2UrKyl7Zm9yKGxldCBlPTA7ZTwxNjsrK2Upc1tlXT1yW3NbZV1dO2k9c1sxXSxzWzFdPXNbNV0sc1s1XT1zWzldLHNbOV09c1sxM10sc1sxM109aSxpPXNbMl0sYT1zWzZdLHNbMl09c1sxMF0sc1s2XT1zWzE0XSxzWzEwXT1pLHNbMTRdPWEsaT1zWzNdLGE9c1s3XSxuPXNbMTFdLHNbM109c1sxNV0sc1s3XT1pLHNbMTFdPWEsc1sxNV09bjtmb3IobGV0IGU9MDtlPDE2O2UrPTQpe2NvbnN0IHQ9c1tlKzBdLHI9c1tlKzFdLGE9c1tlKzJdLGk9c1tlKzNdO249dF5yXmFeaSxzW2UrMF1ePW5edGhpcy5fbWl4Q29sW3Recl0sc1tlKzFdXj1uXnRoaXMuX21peENvbFtyXmFdLHNbZSsyXV49bl50aGlzLl9taXhDb2xbYV5pXSxzW2UrM11ePW5edGhpcy5fbWl4Q29sW2ledF19Zm9yKGxldCByPTAsbj0xNiplO3I8MTY7KytyLCsrbilzW3JdXj10W25dfWZvcihsZXQgZT0wO2U8MTY7KytlKXNbZV09cltzW2VdXTtpPXNbMV0sc1sxXT1zWzVdLHNbNV09c1s5XSxzWzldPXNbMTNdLHNbMTNdPWksaT1zWzJdLGE9c1s2XSxzWzJdPXNbMTBdLHNbNl09c1sxNF0sc1sxMF09aSxzWzE0XT1hLGk9c1szXSxhPXNbN10sbj1zWzExXSxzWzNdPXNbMTVdLHNbN109aSxzWzExXT1hLHNbMTVdPW47Zm9yKGxldCBlPTAscj10aGlzLl9rZXlTaXplO2U8MTY7KytlLCsrcilzW2VdXj10W3JdO3JldHVybiBzfV9kZWNyeXB0QmxvY2syKGUsdCl7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgbj10aGlzLmJ1ZmZlcixhPXRoaXMuYnVmZmVyUG9zaXRpb247Y29uc3QgaT1bXTtsZXQgcz10aGlzLml2O2ZvcihsZXQgdD0wO3Q8cjsrK3Qpe2lmKG5bYV09ZVt0XSwrK2EsYTwxNiljb250aW51ZTtjb25zdCByPXRoaXMuX2RlY3J5cHQobix0aGlzLl9rZXkpO2ZvcihsZXQgZT0wO2U8MTY7KytlKXJbZV1ePXNbZV07cz1uLGkucHVzaChyKSxuPW5ldyBVaW50OEFycmF5KDE2KSxhPTB9aWYodGhpcy5idWZmZXI9bix0aGlzLmJ1ZmZlckxlbmd0aD1hLHRoaXMuaXY9cywwPT09aS5sZW5ndGgpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2xldCBvPTE2KmkubGVuZ3RoO2lmKHQpe2NvbnN0IGU9aS5hdCgtMSk7bGV0IHQ9ZVsxNV07aWYodDw9MTYpe2ZvcihsZXQgcj0xNSxuPTE2LXQ7cj49bjstLXIpaWYoZVtyXSE9PXQpe3Q9MDticmVha31vLT10LGlbaS5sZW5ndGgtMV09ZS5zdWJhcnJheSgwLDE2LXQpfX1jb25zdCBjPW5ldyBVaW50OEFycmF5KG8pO2ZvcihsZXQgZT0wLHQ9MCxyPWkubGVuZ3RoO2U8cjsrK2UsdCs9MTYpYy5zZXQoaVtlXSx0KTtyZXR1cm4gY31kZWNyeXB0QmxvY2soZSx0KXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtjb25zdCBuPWUubGVuZ3RoLGE9dGhpcy5idWZmZXI7bGV0IGk9dGhpcy5idWZmZXJQb3NpdGlvbjtpZihyKXRoaXMuaXY9cjtlbHNle2ZvcihsZXQgdD0wO2k8MTYmJnQ8bjsrK3QsKytpKWFbaV09ZVt0XTtpZihpPDE2KXJldHVybiB0aGlzLmJ1ZmZlckxlbmd0aD1pLG5ldyBVaW50OEFycmF5KDApO3RoaXMuaXY9YSxlPWUuc3ViYXJyYXkoMTYpfXJldHVybiB0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxNiksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmRlY3J5cHRCbG9jaz10aGlzLl9kZWNyeXB0QmxvY2syLHRoaXMuZGVjcnlwdEJsb2NrKGUsdCl9ZW5jcnlwdChlLHQpe2NvbnN0IHI9ZS5sZW5ndGg7bGV0IG49dGhpcy5idWZmZXIsYT10aGlzLmJ1ZmZlclBvc2l0aW9uO2NvbnN0IGk9W107dHx8KHQ9bmV3IFVpbnQ4QXJyYXkoMTYpKTtmb3IobGV0IHM9MDtzPHI7KytzKXtpZihuW2FdPWVbc10sKythLGE8MTYpY29udGludWU7Zm9yKGxldCBlPTA7ZTwxNjsrK2UpbltlXV49dFtlXTtjb25zdCByPXRoaXMuX2VuY3J5cHQobix0aGlzLl9rZXkpO3Q9cixpLnB1c2gociksbj1uZXcgVWludDhBcnJheSgxNiksYT0wfWlmKHRoaXMuYnVmZmVyPW4sdGhpcy5idWZmZXJMZW5ndGg9YSx0aGlzLml2PXQsMD09PWkubGVuZ3RoKXJldHVybiBuZXcgVWludDhBcnJheSgwKTtjb25zdCBzPTE2KmkubGVuZ3RoLG89bmV3IFVpbnQ4QXJyYXkocyk7Zm9yKGxldCBlPTAsdD0wLHI9aS5sZW5ndGg7ZTxyOysrZSx0Kz0xNilvLnNldChpW2VdLHQpO3JldHVybiBvfX1jbGFzcyBnIGV4dGVuZHMgZntjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbj0xMCx0aGlzLl9rZXlTaXplPTE2MCx0aGlzLl9yY29uPW5ldyBVaW50OEFycmF5KFsxNDEsMSwyLDQsOCwxNiwzMiw2NCwxMjgsMjcsNTQsMTA4LDIxNiwxNzEsNzcsMTU0LDQ3LDk0LDE4OCw5OSwxOTgsMTUxLDUzLDEwNiwyMTIsMTc5LDEyNSwyNTAsMjM5LDE5NywxNDUsNTcsMTE0LDIyOCwyMTEsMTg5LDk3LDE5NCwxNTksMzcsNzQsMTQ4LDUxLDEwMiwyMDQsMTMxLDI5LDU4LDExNiwyMzIsMjAzLDE0MSwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NCwxMDgsMjE2LDE3MSw3NywxNTQsNDcsOTQsMTg4LDk5LDE5OCwxNTEsNTMsMTA2LDIxMiwxNzksMTI1LDI1MCwyMzksMTk3LDE0NSw1NywxMTQsMjI4LDIxMSwxODksOTcsMTk0LDE1OSwzNyw3NCwxNDgsNTEsMTAyLDIwNCwxMzEsMjksNTgsMTE2LDIzMiwyMDMsMTQxLDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI3LDU0LDEwOCwyMTYsMTcxLDc3LDE1NCw0Nyw5NCwxODgsOTksMTk4LDE1MSw1MywxMDYsMjEyLDE3OSwxMjUsMjUwLDIzOSwxOTcsMTQ1LDU3LDExNCwyMjgsMjExLDE4OSw5NywxOTQsMTU5LDM3LDc0LDE0OCw1MSwxMDIsMjA0LDEzMSwyOSw1OCwxMTYsMjMyLDIwMywxNDEsMSwyLDQsOCwxNiwzMiw2NCwxMjgsMjcsNTQsMTA4LDIxNiwxNzEsNzcsMTU0LDQ3LDk0LDE4OCw5OSwxOTgsMTUxLDUzLDEwNiwyMTIsMTc5LDEyNSwyNTAsMjM5LDE5NywxNDUsNTcsMTE0LDIyOCwyMTEsMTg5LDk3LDE5NCwxNTksMzcsNzQsMTQ4LDUxLDEwMiwyMDQsMTMxLDI5LDU4LDExNiwyMzIsMjAzLDE0MSwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NCwxMDgsMjE2LDE3MSw3NywxNTQsNDcsOTQsMTg4LDk5LDE5OCwxNTEsNTMsMTA2LDIxMiwxNzksMTI1LDI1MCwyMzksMTk3LDE0NSw1NywxMTQsMjI4LDIxMSwxODksOTcsMTk0LDE1OSwzNyw3NCwxNDgsNTEsMTAyLDIwNCwxMzEsMjksNTgsMTE2LDIzMiwyMDMsMTQxXSksdGhpcy5fa2V5PXRoaXMuX2V4cGFuZEtleShlKX1fZXhwYW5kS2V5KGUpe2NvbnN0IHQ9dGhpcy5fcyxyPXRoaXMuX3Jjb24sbj1uZXcgVWludDhBcnJheSgxNzYpO24uc2V0KGUpO2ZvcihsZXQgZT0xNixhPTE7ZTwxNzY7KythKXtsZXQgaT1uW2UtM10scz1uW2UtMl0sbz1uW2UtMV0sYz1uW2UtNF07aT10W2ldLHM9dFtzXSxvPXRbb10sYz10W2NdLGlePXJbYV07Zm9yKGxldCB0PTA7dDw0OysrdCluW2VdPWlePW5bZS0xNl0sZSsrLG5bZV09c149bltlLTE2XSxlKyssbltlXT1vXj1uW2UtMTZdLGUrKyxuW2VdPWNePW5bZS0xNl0sZSsrfXJldHVybiBufX10LkFFUzEyOENpcGhlcj1nO2NsYXNzIHAgZXh0ZW5kcyBme2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uPTE0LHRoaXMuX2tleVNpemU9MjI0LHRoaXMuX2tleT10aGlzLl9leHBhbmRLZXkoZSl9X2V4cGFuZEtleShlKXtjb25zdCB0PXRoaXMuX3Mscj1uZXcgVWludDhBcnJheSgyNDApO3Iuc2V0KGUpO2xldCBuLGEsaSxzLG89MTtmb3IobGV0IGU9MzIsYz0xO2U8MjQwOysrYyl7ZSUzMj09MTY/KG49dFtuXSxhPXRbYV0saT10W2ldLHM9dFtzXSk6ZSUzMj09MCYmKG49cltlLTNdLGE9cltlLTJdLGk9cltlLTFdLHM9cltlLTRdLG49dFtuXSxhPXRbYV0saT10W2ldLHM9dFtzXSxuXj1vLChvPDw9MSk+PTI1NiYmKG89MjU1JigyN15vKSkpO2ZvcihsZXQgdD0wO3Q8NDsrK3QpcltlXT1uXj1yW2UtMzJdLGUrKyxyW2VdPWFePXJbZS0zMl0sZSsrLHJbZV09aV49cltlLTMyXSxlKysscltlXT1zXj1yW2UtMzJdLGUrK31yZXR1cm4gcn19dC5BRVMyNTZDaXBoZXI9cDtjbGFzcyBte2NoZWNrT3duZXJQYXNzd29yZChlLHQscixhKXtjb25zdCBpPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzU2KTtpLnNldChlLDApLGkuc2V0KHQsZS5sZW5ndGgpLGkuc2V0KHIsZS5sZW5ndGgrdC5sZW5ndGgpO2NvbnN0IHM9bChpLDAsaS5sZW5ndGgpO3JldHVybigwLG4uaXNBcnJheUVxdWFsKShzLGEpfWNoZWNrVXNlclBhc3N3b3JkKGUsdCxyKXtjb25zdCBhPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzgpO2Euc2V0KGUsMCksYS5zZXQodCxlLmxlbmd0aCk7Y29uc3QgaT1sKGEsMCxhLmxlbmd0aCk7cmV0dXJuKDAsbi5pc0FycmF5RXF1YWwpKGkscil9Z2V0T3duZXJLZXkoZSx0LHIsbil7Y29uc3QgYT1uZXcgVWludDhBcnJheShlLmxlbmd0aCs1Nik7YS5zZXQoZSwwKSxhLnNldCh0LGUubGVuZ3RoKSxhLnNldChyLGUubGVuZ3RoK3QubGVuZ3RoKTtjb25zdCBpPWwoYSwwLGEubGVuZ3RoKTtyZXR1cm4gbmV3IHAoaSkuZGVjcnlwdEJsb2NrKG4sITEsbmV3IFVpbnQ4QXJyYXkoMTYpKX1nZXRVc2VyS2V5KGUsdCxyKXtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzgpO24uc2V0KGUsMCksbi5zZXQodCxlLmxlbmd0aCk7Y29uc3QgYT1sKG4sMCxuLmxlbmd0aCk7cmV0dXJuIG5ldyBwKGEpLmRlY3J5cHRCbG9jayhyLCExLG5ldyBVaW50OEFycmF5KDE2KSl9fXQuUERGMTc9bTtjbGFzcyBie19oYXNoKGUsdCxyKXtsZXQgbj1sKHQsMCx0Lmxlbmd0aCkuc3ViYXJyYXkoMCwzMiksYT1bMF0saT0wO2Zvcig7aTw2NHx8YS5hdCgtMSk+aS0zMjspe2NvbnN0IHQ9ZS5sZW5ndGgrbi5sZW5ndGgrci5sZW5ndGgscz1uZXcgVWludDhBcnJheSh0KTtsZXQgbz0wO3Muc2V0KGUsbyksbys9ZS5sZW5ndGgscy5zZXQobixvKSxvKz1uLmxlbmd0aCxzLnNldChyLG8pO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkoNjQqdCk7Zm9yKGxldCBlPTAscj0wO2U8NjQ7ZSsrLHIrPXQpYy5zZXQocyxyKTthPW5ldyBnKG4uc3ViYXJyYXkoMCwxNikpLmVuY3J5cHQoYyxuLnN1YmFycmF5KDE2LDMyKSk7Y29uc3QgZD1hLnNsaWNlKDAsMTYpLnJlZHVjZSgoKGUsdCk9PmUrdCksMCklMzswPT09ZD9uPWwoYSwwLGEubGVuZ3RoKToxPT09ZD9uPXUoYSwwLGEubGVuZ3RoKToyPT09ZCYmKG49aChhLDAsYS5sZW5ndGgpKSxpKyt9cmV0dXJuIG4uc3ViYXJyYXkoMCwzMil9Y2hlY2tPd25lclBhc3N3b3JkKGUsdCxyLGEpe2NvbnN0IGk9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrNTYpO2kuc2V0KGUsMCksaS5zZXQodCxlLmxlbmd0aCksaS5zZXQocixlLmxlbmd0aCt0Lmxlbmd0aCk7Y29uc3Qgcz10aGlzLl9oYXNoKGUsaSxyKTtyZXR1cm4oMCxuLmlzQXJyYXlFcXVhbCkocyxhKX1jaGVja1VzZXJQYXNzd29yZChlLHQscil7Y29uc3QgYT1uZXcgVWludDhBcnJheShlLmxlbmd0aCs4KTthLnNldChlLDApLGEuc2V0KHQsZS5sZW5ndGgpO2NvbnN0IGk9dGhpcy5faGFzaChlLGEsW10pO3JldHVybigwLG4uaXNBcnJheUVxdWFsKShpLHIpfWdldE93bmVyS2V5KGUsdCxyLG4pe2NvbnN0IGE9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrNTYpO2Euc2V0KGUsMCksYS5zZXQodCxlLmxlbmd0aCksYS5zZXQocixlLmxlbmd0aCt0Lmxlbmd0aCk7Y29uc3QgaT10aGlzLl9oYXNoKGUsYSxyKTtyZXR1cm4gbmV3IHAoaSkuZGVjcnlwdEJsb2NrKG4sITEsbmV3IFVpbnQ4QXJyYXkoMTYpKX1nZXRVc2VyS2V5KGUsdCxyKXtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzgpO24uc2V0KGUsMCksbi5zZXQodCxlLmxlbmd0aCk7Y29uc3QgYT10aGlzLl9oYXNoKGUsbixbXSk7cmV0dXJuIG5ldyBwKGEpLmRlY3J5cHRCbG9jayhyLCExLG5ldyBVaW50OEFycmF5KDE2KSl9fXQuUERGMjA9YjtjbGFzcyB5e2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3Rvcj1lLHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3I9dH1jcmVhdGVTdHJlYW0oZSx0KXtjb25zdCByPW5ldyB0aGlzLlN0cmVhbUNpcGhlckNvbnN0cnVjdG9yO3JldHVybiBuZXcgaS5EZWNyeXB0U3RyZWFtKGUsdCwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5kZWNyeXB0QmxvY2soZSx0KX0pKX1kZWNyeXB0U3RyaW5nKGUpe2NvbnN0IHQ9bmV3IHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3I7bGV0IHI9KDAsbi5zdHJpbmdUb0J5dGVzKShlKTtyZXR1cm4gcj10LmRlY3J5cHRCbG9jayhyLCEwKSwoMCxuLmJ5dGVzVG9TdHJpbmcpKHIpfWVuY3J5cHRTdHJpbmcoZSl7Y29uc3QgdD1uZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcjtpZih0IGluc3RhbmNlb2YgZil7Y29uc3Qgcj0xNi1lLmxlbmd0aCUxNjtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHIpLnJlcGVhdChyKTtjb25zdCBhPW5ldyBVaW50OEFycmF5KDE2KTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGNyeXB0byljcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGEpO2Vsc2UgZm9yKGxldCBlPTA7ZTwxNjtlKyspYVtlXT1NYXRoLmZsb29yKDI1NipNYXRoLnJhbmRvbSgpKTtsZXQgaT0oMCxuLnN0cmluZ1RvQnl0ZXMpKGUpO2k9dC5lbmNyeXB0KGksYSk7Y29uc3Qgcz1uZXcgVWludDhBcnJheSgxNitpLmxlbmd0aCk7cmV0dXJuIHMuc2V0KGEpLHMuc2V0KGksMTYpLCgwLG4uYnl0ZXNUb1N0cmluZykocyl9bGV0IHI9KDAsbi5zdHJpbmdUb0J5dGVzKShlKTtyZXR1cm4gcj10LmVuY3J5cHQociksKDAsbi5ieXRlc1RvU3RyaW5nKShyKX19Y29uc3Qgdz1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoWzQwLDE5MSw3OCw5NCw3OCwxMTcsMTM4LDY1LDEwMCwwLDc4LDg2LDI1NSwyNTAsMSw4LDQ2LDQ2LDAsMTgyLDIwOCwxMDQsNjIsMTI4LDQ3LDEyLDE2OSwyNTQsMTAwLDgzLDEwNSwxMjJdKTtmdW5jdGlvbiB0KHQscixuLGEsaSxjLGwsaCl7Y29uc3QgdT00MCtuLmxlbmd0aCt0Lmxlbmd0aCxkPW5ldyBVaW50OEFycmF5KHUpO2xldCBmLGcscD0wO2lmKHIpZm9yKGc9TWF0aC5taW4oMzIsci5sZW5ndGgpO3A8ZzsrK3ApZFtwXT1yW3BdO2ZvcihmPTA7cDwzMjspZFtwKytdPWVbZisrXTtmb3IoZj0wLGc9bi5sZW5ndGg7ZjxnOysrZilkW3ArK109bltmXTtmb3IoZFtwKytdPTI1NSZpLGRbcCsrXT1pPj44JjI1NSxkW3ArK109aT4+MTYmMjU1LGRbcCsrXT1pPj4+MjQmMjU1LGY9MCxnPXQubGVuZ3RoO2Y8ZzsrK2YpZFtwKytdPXRbZl07Yz49NCYmIWgmJihkW3ArK109MjU1LGRbcCsrXT0yNTUsZFtwKytdPTI1NSxkW3ArK109MjU1KTtsZXQgbT1vKGQsMCxwKTtjb25zdCBiPWw+PjM7aWYoYz49Mylmb3IoZj0wO2Y8NTA7KytmKW09byhtLDAsYik7Y29uc3QgeT1tLnN1YmFycmF5KDAsYik7bGV0IHcsdjtpZihjPj0zKXtmb3IocD0wO3A8MzI7KytwKWRbcF09ZVtwXTtmb3IoZj0wLGc9dC5sZW5ndGg7ZjxnOysrZilkW3ArK109dFtmXTt3PW5ldyBzKHkpLHY9dy5lbmNyeXB0QmxvY2sobyhkLDAscCkpLGc9eS5sZW5ndGg7Y29uc3Qgcj1uZXcgVWludDhBcnJheShnKTtmb3IoZj0xO2Y8PTE5OysrZil7Zm9yKGxldCBlPTA7ZTxnOysrZSlyW2VdPXlbZV1eZjt3PW5ldyBzKHIpLHY9dy5lbmNyeXB0QmxvY2sodil9Zm9yKGY9MCxnPXYubGVuZ3RoO2Y8ZzsrK2YpaWYoYVtmXSE9PXZbZl0pcmV0dXJuIG51bGx9ZWxzZSBmb3Iodz1uZXcgcyh5KSx2PXcuZW5jcnlwdEJsb2NrKGUpLGY9MCxnPXYubGVuZ3RoO2Y8ZzsrK2YpaWYoYVtmXSE9PXZbZl0pcmV0dXJuIG51bGw7cmV0dXJuIHl9Y29uc3Qgcj1hLk5hbWUuZ2V0KCJJZGVudGl0eSIpO2Z1bmN0aW9uIGkoZSx0LHIpe2xldCBuPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM107Y29uc3QgYT1uZXcgVWludDhBcnJheShyLmxlbmd0aCs5KSxpPXIubGVuZ3RoO2xldCBzO2ZvcihzPTA7czxpOysrcylhW3NdPXJbc107cmV0dXJuIGFbcysrXT0yNTUmZSxhW3MrK109ZT4+OCYyNTUsYVtzKytdPWU+PjE2JjI1NSxhW3MrK109MjU1JnQsYVtzKytdPXQ+PjgmMjU1LG4mJihhW3MrK109MTE1LGFbcysrXT02NSxhW3MrK109MTA4LGFbcysrXT04NCksbyhhLDAscykuc3ViYXJyYXkoMCxNYXRoLm1pbihyLmxlbmd0aCs1LDE2KSl9ZnVuY3Rpb24gYyhlLHQscixvLGMpe2lmKCEodCBpbnN0YW5jZW9mIGEuTmFtZSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkludmFsaWQgY3J5cHQgZmlsdGVyIG5hbWUuIik7Y29uc3QgbD1lLmdldCh0Lm5hbWUpO2xldCBoO2lmKG51bGwhPWwmJihoPWwuZ2V0KCJDRk0iKSksIWh8fCJOb25lIj09PWgubmFtZSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGR9O2lmKCJWMiI9PT1oLm5hbWUpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBzKGkocixvLGMsITEpKX07aWYoIkFFU1YyIj09PWgubmFtZSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGcoaShyLG8sYywhMCkpfTtpZigiQUVTVjMiPT09aC5uYW1lKXJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgcChjKX07dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVua25vd24gY3J5cHRvIG1ldGhvZCIpfXJldHVybiBjbGFzc3tjb25zdHJ1Y3RvcihpLGMsbCl7Y29uc3QgaD1pLmdldCgiRmlsdGVyIik7aWYoISgwLGEuaXNOYW1lKShoLCJTdGFuZGFyZCIpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJ1bmtub3duIGVuY3J5cHRpb24gbWV0aG9kIik7dGhpcy5maWx0ZXJOYW1lPWgubmFtZSx0aGlzLmRpY3Q9aTtjb25zdCB1PWkuZ2V0KCJWIik7aWYoIU51bWJlci5pc0ludGVnZXIodSl8fDEhPT11JiYyIT09dSYmNCE9PXUmJjUhPT11KXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJ1bnN1cHBvcnRlZCBlbmNyeXB0aW9uIGFsZ29yaXRobSIpO3RoaXMuYWxnb3JpdGhtPXU7bGV0IGQ9aS5nZXQoIkxlbmd0aCIpO2lmKCFkKWlmKHU8PTMpZD00MDtlbHNle2NvbnN0IGU9aS5nZXQoIkNGIiksdD1pLmdldCgiU3RtRiIpO2lmKGUgaW5zdGFuY2VvZiBhLkRpY3QmJnQgaW5zdGFuY2VvZiBhLk5hbWUpe2Uuc3VwcHJlc3NFbmNyeXB0aW9uPSEwO2NvbnN0IHI9ZS5nZXQodC5uYW1lKTtkPShudWxsPT1yP3ZvaWQgMDpyLmdldCgiTGVuZ3RoIikpfHwxMjgsZDw0MCYmKGQ8PD0zKX19aWYoIU51bWJlci5pc0ludGVnZXIoZCl8fGQ8NDB8fGQlOCE9MCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiaW52YWxpZCBrZXkgbGVuZ3RoIik7Y29uc3QgZj0oMCxuLnN0cmluZ1RvQnl0ZXMpKGkuZ2V0KCJPIikpLGc9KDAsbi5zdHJpbmdUb0J5dGVzKShpLmdldCgiVSIpKSxwPWYuc3ViYXJyYXkoMCwzMikseT1nLnN1YmFycmF5KDAsMzIpLHc9aS5nZXQoIlAiKSx2PWkuZ2V0KCJSIikseD0oND09PXV8fDU9PT11KSYmITEhPT1pLmdldCgiRW5jcnlwdE1ldGFkYXRhIik7dGhpcy5lbmNyeXB0TWV0YWRhdGE9eDtjb25zdCBTPSgwLG4uc3RyaW5nVG9CeXRlcykoYyk7bGV0IEEsaztpZihsKXtpZig2PT09dil0cnl7bD0oMCxuLnV0ZjhTdHJpbmdUb1N0cmluZykobCl9Y2F0Y2goZSl7KDAsbi53YXJuKSgiQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeTogVW5hYmxlIHRvIGNvbnZlcnQgVVRGOCBlbmNvZGVkIHBhc3N3b3JkLiIpfUE9KDAsbi5zdHJpbmdUb0J5dGVzKShsKX1pZig1IT09dSlrPXQoUyxBLHAseSx3LHYsZCx4KTtlbHNle2NvbnN0IGU9Zi5zdWJhcnJheSgzMiw0MCksdD1mLnN1YmFycmF5KDQwLDQ4KSxyPWcuc3ViYXJyYXkoMCw0OCksYT1nLnN1YmFycmF5KDMyLDQwKSxzPWcuc3ViYXJyYXkoNDAsNDgpLG89KDAsbi5zdHJpbmdUb0J5dGVzKShpLmdldCgiT0UiKSksYz0oMCxuLnN0cmluZ1RvQnl0ZXMpKGkuZ2V0KCJVRSIpKTsoMCxuLnN0cmluZ1RvQnl0ZXMpKGkuZ2V0KCJQZXJtcyIpKSxrPWZ1bmN0aW9uKGUsdCxyLG4sYSxpLHMsbyxjLGwsaCx1KXtpZih0KXtjb25zdCBlPU1hdGgubWluKDEyNyx0Lmxlbmd0aCk7dD10LnN1YmFycmF5KDAsZSl9ZWxzZSB0PVtdO2NvbnN0IGQ9Nj09PWU/bmV3IGI6bmV3IG07cmV0dXJuIGQuY2hlY2tVc2VyUGFzc3dvcmQodCxvLHMpP2QuZ2V0VXNlcktleSh0LGMsaCk6dC5sZW5ndGgmJmQuY2hlY2tPd25lclBhc3N3b3JkKHQsbixpLHIpP2QuZ2V0T3duZXJLZXkodCxhLGksbCk6bnVsbH0odixBLHAsZSx0LHIseSxhLHMsbyxjKX1pZighayYmIWwpdGhyb3cgbmV3IG4uUGFzc3dvcmRFeGNlcHRpb24oIk5vIHBhc3N3b3JkIGdpdmVuIixuLlBhc3N3b3JkUmVzcG9uc2VzLk5FRURfUEFTU1dPUkQpO2lmKCFrJiZsKXtjb25zdCByPWZ1bmN0aW9uKHQscixuLGEpe2NvbnN0IGk9bmV3IFVpbnQ4QXJyYXkoMzIpO2xldCBjPTA7Y29uc3QgbD1NYXRoLm1pbigzMix0Lmxlbmd0aCk7Zm9yKDtjPGw7KytjKWlbY109dFtjXTtsZXQgaD0wO2Zvcig7YzwzMjspaVtjKytdPWVbaCsrXTtsZXQgdT1vKGksMCxjKTtjb25zdCBkPWE+PjM7aWYobj49Mylmb3IoaD0wO2g8NTA7KytoKXU9byh1LDAsdS5sZW5ndGgpO2xldCBmLGc7aWYobj49Myl7Zz1yO2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoZCk7Zm9yKGg9MTk7aD49MDtoLS0pe2ZvcihsZXQgdD0wO3Q8ZDsrK3QpZVt0XT11W3RdXmg7Zj1uZXcgcyhlKSxnPWYuZW5jcnlwdEJsb2NrKGcpfX1lbHNlIGY9bmV3IHModS5zdWJhcnJheSgwLGQpKSxnPWYuZW5jcnlwdEJsb2NrKHIpO3JldHVybiBnfShBLHAsdixkKTtrPXQoUyxyLHAseSx3LHYsZCx4KX1pZighayl0aHJvdyBuZXcgbi5QYXNzd29yZEV4Y2VwdGlvbigiSW5jb3JyZWN0IFBhc3N3b3JkIixuLlBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRCk7aWYodGhpcy5lbmNyeXB0aW9uS2V5PWssdT49NCl7Y29uc3QgZT1pLmdldCgiQ0YiKTtlIGluc3RhbmNlb2YgYS5EaWN0JiYoZS5zdXBwcmVzc0VuY3J5cHRpb249ITApLHRoaXMuY2Y9ZSx0aGlzLnN0bWY9aS5nZXQoIlN0bUYiKXx8cix0aGlzLnN0cmY9aS5nZXQoIlN0ckYiKXx8cix0aGlzLmVmZj1pLmdldCgiRUZGIil8fHRoaXMuc3RtZn19Y3JlYXRlQ2lwaGVyVHJhbnNmb3JtKGUsdCl7aWYoND09PXRoaXMuYWxnb3JpdGhtfHw1PT09dGhpcy5hbGdvcml0aG0pcmV0dXJuIG5ldyB5KGModGhpcy5jZix0aGlzLnN0cmYsZSx0LHRoaXMuZW5jcnlwdGlvbktleSksYyh0aGlzLmNmLHRoaXMuc3RtZixlLHQsdGhpcy5lbmNyeXB0aW9uS2V5KSk7Y29uc3Qgcj1pKGUsdCx0aGlzLmVuY3J5cHRpb25LZXksITEpLG49ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHMocil9O3JldHVybiBuZXcgeShuLG4pfX19KCk7dC5DaXBoZXJUcmFuc2Zvcm1GYWN0b3J5PXd9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5EZWNyeXB0U3RyZWFtPXZvaWQgMDt2YXIgbj1yKDE2OCk7Y2xhc3MgYSBleHRlbmRzIG4uRGVjb2RlU3RyZWFte2NvbnN0cnVjdG9yKGUsdCxyKXtzdXBlcih0KSx0aGlzLnN0cj1lLHRoaXMuZGljdD1lLmRpY3QsdGhpcy5kZWNyeXB0PXIsdGhpcy5uZXh0Q2h1bms9bnVsbCx0aGlzLmluaXRpYWxpemVkPSExfXJlYWRCbG9jaygpe3ZhciBlO2xldCB0O2lmKHRoaXMuaW5pdGlhbGl6ZWQ/dD10aGlzLm5leHRDaHVuazoodD10aGlzLnN0ci5nZXRCeXRlcyg1MTIpLHRoaXMuaW5pdGlhbGl6ZWQ9ITApLCF0fHwwPT09dC5sZW5ndGgpcmV0dXJuIHZvaWQodGhpcy5lb2Y9ITApO3RoaXMubmV4dENodW5rPXRoaXMuc3RyLmdldEJ5dGVzKDUxMik7Y29uc3Qgcj0obnVsbD09PShlPXRoaXMubmV4dENodW5rKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5sZW5ndGgpPjA7dD0oMCx0aGlzLmRlY3J5cHQpKHQsIXIpO2NvbnN0IG49dGhpcy5idWZmZXJMZW5ndGgsYT1uK3QubGVuZ3RoO3RoaXMuZW5zdXJlQnVmZmVyKGEpLnNldCh0LG4pLHRoaXMuYnVmZmVyTGVuZ3RoPWF9fXQuRGVjcnlwdFN0cmVhbT1hfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ2F0YWxvZz12b2lkIDAscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpLHIoMTM5KSxyKDIpO3ZhciBuPXIoMTQ5KSxhPXIoMTQ0KSxpPXIoMTUwKSxzPXIoMjIxKSxvPXIoMTUxKSxjPXIoMjIyKSxsPXIoMTYyKSxoPXIoMjIzKSx1PXIoMjA5KSxkPXIoMjI0KSxmPXIoMjI1KTtmdW5jdGlvbiBnKGUpe3JldHVybiBlIGluc3RhbmNlb2YgaS5EaWN0JiYoZT1lLmdldCgiRCIpKSxBcnJheS5pc0FycmF5KGUpP2U6bnVsbH1jbGFzcyBwe2NvbnN0cnVjdG9yKGUsdCl7aWYodGhpcy5wZGZNYW5hZ2VyPWUsdGhpcy54cmVmPXQsdGhpcy5fY2F0RGljdD10LmdldENhdGFsb2dPYmooKSwhKHRoaXMuX2NhdERpY3QgaW5zdGFuY2VvZiBpLkRpY3QpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJDYXRhbG9nIG9iamVjdCBpcyBub3QgYSBkaWN0aW9uYXJ5LiIpO3RoaXMudG9wbGV2ZWxQYWdlc0RpY3QsdGhpcy5fYWN0dWFsTnVtUGFnZXM9bnVsbCx0aGlzLmZvbnRDYWNoZT1uZXcgaS5SZWZTZXRDYWNoZSx0aGlzLmJ1aWx0SW5DTWFwQ2FjaGU9bmV3IE1hcCx0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZT1uZXcgTWFwLHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZT1uZXcgdS5HbG9iYWxJbWFnZUNhY2hlLHRoaXMucGFnZUtpZHNDb3VudENhY2hlPW5ldyBpLlJlZlNldENhY2hlLHRoaXMucGFnZUluZGV4Q2FjaGU9bmV3IGkuUmVmU2V0Q2FjaGUsdGhpcy5ub25CbGVuZE1vZGVzU2V0PW5ldyBpLlJlZlNldCx0aGlzLnN5c3RlbUZvbnRDYWNoZT1uZXcgTWFwfWdldCB2ZXJzaW9uKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiVmVyc2lvbiIpO2lmKGUgaW5zdGFuY2VvZiBpLk5hbWUpe2lmKG4uUERGX1ZFUlNJT05fUkVHRVhQLnRlc3QoZS5uYW1lKSlyZXR1cm4oMCxhLnNoYWRvdykodGhpcywidmVyc2lvbiIsZS5uYW1lKTsoMCxhLndhcm4pKCJJbnZhbGlkIFBERiBjYXRhbG9nIHZlcnNpb246ICIuY29uY2F0KGUubmFtZSkpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJ2ZXJzaW9uIixudWxsKX1nZXQgbGFuZygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIkxhbmciKTtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywibGFuZyIsInN0cmluZyI9PXR5cGVvZiBlPygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGUpOm51bGwpfWdldCBuZWVkc1JlbmRlcmluZygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIk5lZWRzUmVuZGVyaW5nIik7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIm5lZWRzUmVuZGVyaW5nIiwiYm9vbGVhbiI9PXR5cGVvZiBlJiZlKX1nZXQgY29sbGVjdGlvbigpe2xldCBlPW51bGw7dHJ5e2NvbnN0IHQ9dGhpcy5fY2F0RGljdC5nZXQoIkNvbGxlY3Rpb24iKTt0IGluc3RhbmNlb2YgaS5EaWN0JiZ0LnNpemU+MCYmKGU9dCl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIG4uTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLmluZm8pKCJDYW5ub3QgZmV0Y2ggQ29sbGVjdGlvbiBlbnRyeTsgYXNzdW1pbmcgbm8gY29sbGVjdGlvbiBpcyBwcmVzZW50LiIpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJjb2xsZWN0aW9uIixlKX1nZXQgYWNyb0Zvcm0oKXtsZXQgZT1udWxsO3RyeXtjb25zdCB0PXRoaXMuX2NhdERpY3QuZ2V0KCJBY3JvRm9ybSIpO3QgaW5zdGFuY2VvZiBpLkRpY3QmJnQuc2l6ZT4wJiYoZT10KX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygbi5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEuaW5mbykoIkNhbm5vdCBmZXRjaCBBY3JvRm9ybSBlbnRyeTsgYXNzdW1pbmcgbm8gZm9ybXMgYXJlIHByZXNlbnQuIil9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsImFjcm9Gb3JtIixlKX1nZXQgYWNyb0Zvcm1SZWYoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0UmF3KCJBY3JvRm9ybSIpO3JldHVybigwLGEuc2hhZG93KSh0aGlzLCJhY3JvRm9ybVJlZiIsZSBpbnN0YW5jZW9mIGkuUmVmP2U6bnVsbCl9Z2V0IG1ldGFkYXRhKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldFJhdygiTWV0YWRhdGEiKTtpZighKGUgaW5zdGFuY2VvZiBpLlJlZikpcmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIm1ldGFkYXRhIixudWxsKTtsZXQgdD1udWxsO3RyeXt2YXIgcjtjb25zdCBuPXRoaXMueHJlZi5mZXRjaChlLCEobnVsbCE9PShyPXRoaXMueHJlZi5lbmNyeXB0KSYmdm9pZCAwIT09ciYmci5lbmNyeXB0TWV0YWRhdGEpKTtpZihuIGluc3RhbmNlb2Ygby5CYXNlU3RyZWFtJiZuLmRpY3QgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IGU9bi5kaWN0LmdldCgiVHlwZSIpLHI9bi5kaWN0LmdldCgiU3VidHlwZSIpO2lmKCgwLGkuaXNOYW1lKShlLCJNZXRhZGF0YSIpJiYoMCxpLmlzTmFtZSkociwiWE1MIikpe2NvbnN0IGU9KDAsYS5zdHJpbmdUb1VURjhTdHJpbmcpKG4uZ2V0U3RyaW5nKCkpO2UmJih0PW5ldyBkLk1ldGFkYXRhUGFyc2VyKGUpLnNlcmlhbGl6YWJsZSl9fX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygbi5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEuaW5mbykoJ1NraXBwaW5nIGludmFsaWQgTWV0YWRhdGE6ICInLmNvbmNhdChlLCciLicpKX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywibWV0YWRhdGEiLHQpfWdldCBtYXJrSW5mbygpe2xldCBlPW51bGw7dHJ5e2U9dGhpcy5fcmVhZE1hcmtJbmZvKCl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIG4uTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKCJVbmFibGUgdG8gcmVhZCBtYXJrIGluZm8uIil9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIm1hcmtJbmZvIixlKX1fcmVhZE1hcmtJbmZvKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiTWFya0luZm8iKTtpZighKGUgaW5zdGFuY2VvZiBpLkRpY3QpKXJldHVybiBudWxsO2NvbnN0IHQ9e01hcmtlZDohMSxVc2VyUHJvcGVydGllczohMSxTdXNwZWN0czohMX07Zm9yKGNvbnN0IHIgaW4gdCl7Y29uc3Qgbj1lLmdldChyKTsiYm9vbGVhbiI9PXR5cGVvZiBuJiYodFtyXT1uKX1yZXR1cm4gdH1nZXQgc3RydWN0VHJlZVJvb3QoKXtsZXQgZT1udWxsO3RyeXtlPXRoaXMuX3JlYWRTdHJ1Y3RUcmVlUm9vdCgpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBuLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsYS53YXJuKSgiVW5hYmxlIHJlYWQgdG8gc3RydWN0VHJlZVJvb3QgaW5mby4iKX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywic3RydWN0VHJlZVJvb3QiLGUpfV9yZWFkU3RydWN0VHJlZVJvb3QoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJTdHJ1Y3RUcmVlUm9vdCIpO2lmKCEoZSBpbnN0YW5jZW9mIGkuRGljdCkpcmV0dXJuIG51bGw7Y29uc3QgdD1uZXcgZi5TdHJ1Y3RUcmVlUm9vdChlKTtyZXR1cm4gdC5pbml0KCksdH1nZXQgdG9wbGV2ZWxQYWdlc0RpY3QoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJQYWdlcyIpO2lmKCEoZSBpbnN0YW5jZW9mIGkuRGljdCkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgdG9wLWxldmVsIHBhZ2VzIGRpY3Rpb25hcnkuIik7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsInRvcGxldmVsUGFnZXNEaWN0IixlKX1nZXQgZG9jdW1lbnRPdXRsaW5lKCl7bGV0IGU9bnVsbDt0cnl7ZT10aGlzLl9yZWFkRG9jdW1lbnRPdXRsaW5lKCl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIG4uTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKCJVbmFibGUgdG8gcmVhZCBkb2N1bWVudCBvdXRsaW5lLiIpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJkb2N1bWVudE91dGxpbmUiLGUpfV9yZWFkRG9jdW1lbnRPdXRsaW5lKCl7bGV0IGU9dGhpcy5fY2F0RGljdC5nZXQoIk91dGxpbmVzIik7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSlyZXR1cm4gbnVsbDtpZihlPWUuZ2V0UmF3KCJGaXJzdCIpLCEoZSBpbnN0YW5jZW9mIGkuUmVmKSlyZXR1cm4gbnVsbDtjb25zdCB0PXtpdGVtczpbXX0scj1be29iajplLHBhcmVudDp0fV0sbj1uZXcgaS5SZWZTZXQ7bi5wdXQoZSk7Y29uc3Qgcz10aGlzLnhyZWYsbz1uZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7Zm9yKDtyLmxlbmd0aD4wOyl7Y29uc3QgdD1yLnNoaWZ0KCksYz1zLmZldGNoSWZSZWYodC5vYmopO2lmKG51bGw9PT1jKWNvbnRpbnVlO2lmKCFjLmhhcygiVGl0bGUiKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBvdXRsaW5lIGl0ZW0gZW5jb3VudGVyZWQuIik7Y29uc3QgaD17dXJsOm51bGwsZGVzdDpudWxsLGFjdGlvbjpudWxsfTtwLnBhcnNlRGVzdERpY3Rpb25hcnkoe2Rlc3REaWN0OmMscmVzdWx0T2JqOmgsZG9jQmFzZVVybDp0aGlzLnBkZk1hbmFnZXIuZG9jQmFzZVVybCxkb2NBdHRhY2htZW50czp0aGlzLmF0dGFjaG1lbnRzfSk7Y29uc3QgdT1jLmdldCgiVGl0bGUiKSxkPWMuZ2V0KCJGIil8fDAsZj1jLmdldEFycmF5KCJDIiksZz1jLmdldCgiQ291bnQiKTtsZXQgbT1vOyFBcnJheS5pc0FycmF5KGYpfHwzIT09Zi5sZW5ndGh8fDA9PT1mWzBdJiYwPT09ZlsxXSYmMD09PWZbMl18fChtPWwuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoZiwwKSk7Y29uc3QgYj17YWN0aW9uOmguYWN0aW9uLGF0dGFjaG1lbnQ6aC5hdHRhY2htZW50LGRlc3Q6aC5kZXN0LHVybDpoLnVybCx1bnNhZmVVcmw6aC51bnNhZmVVcmwsbmV3V2luZG93OmgubmV3V2luZG93LHNldE9DR1N0YXRlOmguc2V0T0NHU3RhdGUsdGl0bGU6KDAsYS5zdHJpbmdUb1BERlN0cmluZykodSksY29sb3I6bSxjb3VudDpOdW1iZXIuaXNJbnRlZ2VyKGcpP2c6dm9pZCAwLGJvbGQ6ISEoMiZkKSxpdGFsaWM6ISEoMSZkKSxpdGVtczpbXX07dC5wYXJlbnQuaXRlbXMucHVzaChiKSxlPWMuZ2V0UmF3KCJGaXJzdCIpLGUgaW5zdGFuY2VvZiBpLlJlZiYmIW4uaGFzKGUpJiYoci5wdXNoKHtvYmo6ZSxwYXJlbnQ6Yn0pLG4ucHV0KGUpKSxlPWMuZ2V0UmF3KCJOZXh0IiksZSBpbnN0YW5jZW9mIGkuUmVmJiYhbi5oYXMoZSkmJihyLnB1c2goe29iajplLHBhcmVudDp0LnBhcmVudH0pLG4ucHV0KGUpKX1yZXR1cm4gdC5pdGVtcy5sZW5ndGg+MD90Lml0ZW1zOm51bGx9Z2V0IHBlcm1pc3Npb25zKCl7bGV0IGU9bnVsbDt0cnl7ZT10aGlzLl9yZWFkUGVybWlzc2lvbnMoKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygbi5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEud2FybikoIlVuYWJsZSB0byByZWFkIHBlcm1pc3Npb25zLiIpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJwZXJtaXNzaW9ucyIsZSl9X3JlYWRQZXJtaXNzaW9ucygpe2NvbnN0IGU9dGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJFbmNyeXB0Iik7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSlyZXR1cm4gbnVsbDtsZXQgdD1lLmdldCgiUCIpO2lmKCJudW1iZXIiIT10eXBlb2YgdClyZXR1cm4gbnVsbDt0Kz0yKiozMjtjb25zdCByPVtdO2Zvcihjb25zdCBlIGluIGEuUGVybWlzc2lvbkZsYWcpe2NvbnN0IG49YS5QZXJtaXNzaW9uRmxhZ1tlXTt0Jm4mJnIucHVzaChuKX1yZXR1cm4gcn1nZXQgb3B0aW9uYWxDb250ZW50Q29uZmlnKCl7bGV0IGU9bnVsbDt0cnl7Y29uc3QgdD10aGlzLl9jYXREaWN0LmdldCgiT0NQcm9wZXJ0aWVzIik7aWYoIXQpcmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIm9wdGlvbmFsQ29udGVudENvbmZpZyIsbnVsbCk7Y29uc3Qgcj10LmdldCgiRCIpO2lmKCFyKXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJvcHRpb25hbENvbnRlbnRDb25maWciLG51bGwpO2NvbnN0IG49dC5nZXQoIk9DR3MiKTtpZighQXJyYXkuaXNBcnJheShuKSlyZXR1cm4oMCxhLnNoYWRvdykodGhpcywib3B0aW9uYWxDb250ZW50Q29uZmlnIixudWxsKTtjb25zdCBzPVtdLG89W107Zm9yKGNvbnN0IGUgb2Ygbil7aWYoIShlIGluc3RhbmNlb2YgaS5SZWYpKWNvbnRpbnVlO28ucHVzaChlKTtjb25zdCB0PXRoaXMueHJlZi5mZXRjaElmUmVmKGUpO3MucHVzaCh7aWQ6ZS50b1N0cmluZygpLG5hbWU6InN0cmluZyI9PXR5cGVvZiB0LmdldCgiTmFtZSIpPygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHQuZ2V0KCJOYW1lIikpOm51bGwsaW50ZW50OiJzdHJpbmciPT10eXBlb2YgdC5nZXQoIkludGVudCIpPygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHQuZ2V0KCJJbnRlbnQiKSk6bnVsbH0pfWU9dGhpcy5fcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhyLG8pLGUuZ3JvdXBzPXN9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIG4uTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKCJVbmFibGUgdG8gcmVhZCBvcHRpb25hbCBjb250ZW50IGNvbmZpZzogIi5jb25jYXQoZSkpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJvcHRpb25hbENvbnRlbnRDb25maWciLGUpfV9yZWFkT3B0aW9uYWxDb250ZW50Q29uZmlnKGUsdCl7ZnVuY3Rpb24gcihlKXtjb25zdCByPVtdO2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKGNvbnN0IG4gb2YgZSluIGluc3RhbmNlb2YgaS5SZWYmJnQuaW5jbHVkZXMobikmJnIucHVzaChuLnRvU3RyaW5nKCkpO3JldHVybiByfWZ1bmN0aW9uIG4oZSl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG51bGw7Y29uc3Qgbj1bXTtmb3IoY29uc3QgYSBvZiBlKXtpZihhIGluc3RhbmNlb2YgaS5SZWYmJnQuaW5jbHVkZXMoYSkpe2MucHV0KGEpLG4ucHVzaChhLnRvU3RyaW5nKCkpO2NvbnRpbnVlfWNvbnN0IGU9cyhhLHIpO2UmJm4ucHVzaChlKX1pZihyPjApcmV0dXJuIG47Y29uc3QgYT1bXTtmb3IoY29uc3QgZSBvZiB0KWMuaGFzKGUpfHxhLnB1c2goZS50b1N0cmluZygpKTtyZXR1cm4gYS5sZW5ndGgmJm4ucHVzaCh7bmFtZTpudWxsLG9yZGVyOmF9KSxufWZ1bmN0aW9uIHMoZSx0KXtpZigrK3Q+bClyZXR1cm4oMCxhLndhcm4pKCJwYXJzZU5lc3RlZE9yZGVyIC0gcmVhY2hlZCBNQVhfTkVTVEVEX0xFVkVMUy4iKSxudWxsO2NvbnN0IHI9by5mZXRjaElmUmVmKGUpO2lmKCFBcnJheS5pc0FycmF5KHIpKXJldHVybiBudWxsO2NvbnN0IGk9by5mZXRjaElmUmVmKHJbMF0pO2lmKCJzdHJpbmciIT10eXBlb2YgaSlyZXR1cm4gbnVsbDtjb25zdCBzPW4oci5zbGljZSgxKSx0KTtyZXR1cm4gcyYmcy5sZW5ndGg/e25hbWU6KDAsYS5zdHJpbmdUb1BERlN0cmluZykoaSksb3JkZXI6c306bnVsbH1jb25zdCBvPXRoaXMueHJlZixjPW5ldyBpLlJlZlNldCxsPTEwO3JldHVybntuYW1lOiJzdHJpbmciPT10eXBlb2YgZS5nZXQoIk5hbWUiKT8oMCxhLnN0cmluZ1RvUERGU3RyaW5nKShlLmdldCgiTmFtZSIpKTpudWxsLGNyZWF0b3I6InN0cmluZyI9PXR5cGVvZiBlLmdldCgiQ3JlYXRvciIpPygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGUuZ2V0KCJDcmVhdG9yIikpOm51bGwsYmFzZVN0YXRlOmUuZ2V0KCJCYXNlU3RhdGUiKWluc3RhbmNlb2YgaS5OYW1lP2UuZ2V0KCJCYXNlU3RhdGUiKS5uYW1lOm51bGwsb246cihlLmdldCgiT04iKSksb2ZmOnIoZS5nZXQoIk9GRiIpKSxvcmRlcjpuKGUuZ2V0KCJPcmRlciIpKSxncm91cHM6bnVsbH19c2V0QWN0dWFsTnVtUGFnZXMoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDt0aGlzLl9hY3R1YWxOdW1QYWdlcz1lfWdldCBoYXNBY3R1YWxOdW1QYWdlcygpe3JldHVybiBudWxsIT09dGhpcy5fYWN0dWFsTnVtUGFnZXN9Z2V0IF9wYWdlc0NvdW50KCl7Y29uc3QgZT10aGlzLnRvcGxldmVsUGFnZXNEaWN0LmdldCgiQ291bnQiKTtpZighTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiUGFnZSBjb3VudCBpbiB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeSBpcyBub3QgYW4gaW50ZWdlci4iKTtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiX3BhZ2VzQ291bnQiLGUpfWdldCBudW1QYWdlcygpe3JldHVybiB0aGlzLmhhc0FjdHVhbE51bVBhZ2VzP3RoaXMuX2FjdHVhbE51bVBhZ2VzOnRoaXMuX3BhZ2VzQ291bnR9Z2V0IGRlc3RpbmF0aW9ucygpe2NvbnN0IGU9dGhpcy5fcmVhZERlc3RzKCksdD1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGUgaW5zdGFuY2VvZiBzLk5hbWVUcmVlKWZvcihjb25zdFtyLG5db2YgZS5nZXRBbGwoKSl7Y29uc3QgZT1nKG4pO2UmJih0WygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHIpXT1lKX1lbHNlIGUgaW5zdGFuY2VvZiBpLkRpY3QmJmUuZm9yRWFjaCgoZnVuY3Rpb24oZSxyKXtjb25zdCBuPWcocik7biYmKHRbZV09bil9KSk7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsImRlc3RpbmF0aW9ucyIsdCl9Z2V0RGVzdGluYXRpb24oZSl7Y29uc3QgdD10aGlzLl9yZWFkRGVzdHMoKTtpZih0IGluc3RhbmNlb2Ygcy5OYW1lVHJlZSl7Y29uc3Qgcj1nKHQuZ2V0KGUpKTtpZihyKXJldHVybiByO2NvbnN0IG49dGhpcy5kZXN0aW5hdGlvbnNbZV07aWYobilyZXR1cm4oMCxhLndhcm4pKCdGb3VuZCAiJy5jb25jYXQoZSwnIiBhdCBhbiBpbmNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIE5hbWVUcmVlLicpKSxufWVsc2UgaWYodCBpbnN0YW5jZW9mIGkuRGljdCl7Y29uc3Qgcj1nKHQuZ2V0KGUpKTtpZihyKXJldHVybiByfXJldHVybiBudWxsfV9yZWFkRGVzdHMoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpO3JldHVybiBudWxsIT1lJiZlLmhhcygiRGVzdHMiKT9uZXcgcy5OYW1lVHJlZShlLmdldFJhdygiRGVzdHMiKSx0aGlzLnhyZWYpOnRoaXMuX2NhdERpY3QuaGFzKCJEZXN0cyIpP3RoaXMuX2NhdERpY3QuZ2V0KCJEZXN0cyIpOnZvaWQgMH1nZXQgcGFnZUxhYmVscygpe2xldCBlPW51bGw7dHJ5e2U9dGhpcy5fcmVhZFBhZ2VMYWJlbHMoKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygbi5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEud2FybikoIlVuYWJsZSB0byByZWFkIHBhZ2UgbGFiZWxzLiIpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJwYWdlTGFiZWxzIixlKX1fcmVhZFBhZ2VMYWJlbHMoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlTGFiZWxzIik7aWYoIWUpcmV0dXJuIG51bGw7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5udW1QYWdlcyk7bGV0IHI9bnVsbCxvPSIiO2NvbnN0IGM9bmV3IHMuTnVtYmVyVHJlZShlLHRoaXMueHJlZikuZ2V0QWxsKCk7bGV0IGw9IiIsaD0xO2ZvcihsZXQgZT0wLHM9dGhpcy5udW1QYWdlcztlPHM7ZSsrKXtjb25zdCBzPWMuZ2V0KGUpO2lmKHZvaWQgMCE9PXMpe2lmKCEocyBpbnN0YW5jZW9mIGkuRGljdCkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIlBhZ2VMYWJlbCBpcyBub3QgYSBkaWN0aW9uYXJ5LiIpO2lmKHMuaGFzKCJUeXBlIikmJiEoMCxpLmlzTmFtZSkocy5nZXQoIlR5cGUiKSwiUGFnZUxhYmVsIikpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgdHlwZSBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTtpZihzLmhhcygiUyIpKXtjb25zdCBlPXMuZ2V0KCJTIik7aWYoIShlIGluc3RhbmNlb2YgaS5OYW1lKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBzdHlsZSBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTtyPWUubmFtZX1lbHNlIHI9bnVsbDtpZihzLmhhcygiUCIpKXtjb25zdCBlPXMuZ2V0KCJQIik7aWYoInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIHByZWZpeCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTtvPSgwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGUpfWVsc2Ugbz0iIjtpZihzLmhhcygiU3QiKSl7Y29uc3QgZT1zLmdldCgiU3QiKTtpZighKE51bWJlci5pc0ludGVnZXIoZSkmJmU+PTEpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIHN0YXJ0IGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpO2g9ZX1lbHNlIGg9MX1zd2l0Y2gocil7Y2FzZSJEIjpsPWg7YnJlYWs7Y2FzZSJSIjpjYXNlInIiOmw9KDAsbi50b1JvbWFuTnVtZXJhbHMpKGgsInIiPT09cik7YnJlYWs7Y2FzZSJBIjpjYXNlImEiOmNvbnN0IGU9MjYsdD0iYSI9PT1yPzk3OjY1LGk9aC0xO2w9U3RyaW5nLmZyb21DaGFyQ29kZSh0K2klZSkucmVwZWF0KE1hdGguZmxvb3IoaS9lKSsxKTticmVhaztkZWZhdWx0OmlmKHIpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoJ0ludmFsaWQgc3R5bGUgIicuY29uY2F0KHIsJyIgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuJykpO2w9IiJ9dFtlXT1vK2wsaCsrfXJldHVybiB0fWdldCBwYWdlTGF5b3V0KCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiUGFnZUxheW91dCIpO2xldCB0PSIiO2lmKGUgaW5zdGFuY2VvZiBpLk5hbWUpc3dpdGNoKGUubmFtZSl7Y2FzZSJTaW5nbGVQYWdlIjpjYXNlIk9uZUNvbHVtbiI6Y2FzZSJUd29Db2x1bW5MZWZ0IjpjYXNlIlR3b0NvbHVtblJpZ2h0IjpjYXNlIlR3b1BhZ2VMZWZ0IjpjYXNlIlR3b1BhZ2VSaWdodCI6dD1lLm5hbWV9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsInBhZ2VMYXlvdXQiLHQpfWdldCBwYWdlTW9kZSgpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIlBhZ2VNb2RlIik7bGV0IHQ9IlVzZU5vbmUiO2lmKGUgaW5zdGFuY2VvZiBpLk5hbWUpc3dpdGNoKGUubmFtZSl7Y2FzZSJVc2VOb25lIjpjYXNlIlVzZU91dGxpbmVzIjpjYXNlIlVzZVRodW1icyI6Y2FzZSJGdWxsU2NyZWVuIjpjYXNlIlVzZU9DIjpjYXNlIlVzZUF0dGFjaG1lbnRzIjp0PWUubmFtZX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywicGFnZU1vZGUiLHQpfWdldCB2aWV3ZXJQcmVmZXJlbmNlcygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIlZpZXdlclByZWZlcmVuY2VzIik7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSlyZXR1cm4oMCxhLnNoYWRvdykodGhpcywidmlld2VyUHJlZmVyZW5jZXMiLG51bGwpO2xldCB0PW51bGw7Zm9yKGNvbnN0IHIgb2YgZS5nZXRLZXlzKCkpe2NvbnN0IG49ZS5nZXQocik7bGV0IHM7c3dpdGNoKHIpe2Nhc2UiSGlkZVRvb2xiYXIiOmNhc2UiSGlkZU1lbnViYXIiOmNhc2UiSGlkZVdpbmRvd1VJIjpjYXNlIkZpdFdpbmRvdyI6Y2FzZSJDZW50ZXJXaW5kb3ciOmNhc2UiRGlzcGxheURvY1RpdGxlIjpjYXNlIlBpY2tUcmF5QnlQREZTaXplIjoiYm9vbGVhbiI9PXR5cGVvZiBuJiYocz1uKTticmVhaztjYXNlIk5vbkZ1bGxTY3JlZW5QYWdlTW9kZSI6aWYobiBpbnN0YW5jZW9mIGkuTmFtZSlzd2l0Y2gobi5uYW1lKXtjYXNlIlVzZU5vbmUiOmNhc2UiVXNlT3V0bGluZXMiOmNhc2UiVXNlVGh1bWJzIjpjYXNlIlVzZU9DIjpzPW4ubmFtZTticmVhaztkZWZhdWx0OnM9IlVzZU5vbmUifWJyZWFrO2Nhc2UiRGlyZWN0aW9uIjppZihuIGluc3RhbmNlb2YgaS5OYW1lKXN3aXRjaChuLm5hbWUpe2Nhc2UiTDJSIjpjYXNlIlIyTCI6cz1uLm5hbWU7YnJlYWs7ZGVmYXVsdDpzPSJMMlIifWJyZWFrO2Nhc2UiVmlld0FyZWEiOmNhc2UiVmlld0NsaXAiOmNhc2UiUHJpbnRBcmVhIjpjYXNlIlByaW50Q2xpcCI6aWYobiBpbnN0YW5jZW9mIGkuTmFtZSlzd2l0Y2gobi5uYW1lKXtjYXNlIk1lZGlhQm94IjpjYXNlIkNyb3BCb3giOmNhc2UiQmxlZWRCb3giOmNhc2UiVHJpbUJveCI6Y2FzZSJBcnRCb3giOnM9bi5uYW1lO2JyZWFrO2RlZmF1bHQ6cz0iQ3JvcEJveCJ9YnJlYWs7Y2FzZSJQcmludFNjYWxpbmciOmlmKG4gaW5zdGFuY2VvZiBpLk5hbWUpc3dpdGNoKG4ubmFtZSl7Y2FzZSJOb25lIjpjYXNlIkFwcERlZmF1bHQiOnM9bi5uYW1lO2JyZWFrO2RlZmF1bHQ6cz0iQXBwRGVmYXVsdCJ9YnJlYWs7Y2FzZSJEdXBsZXgiOmlmKG4gaW5zdGFuY2VvZiBpLk5hbWUpc3dpdGNoKG4ubmFtZSl7Y2FzZSJTaW1wbGV4IjpjYXNlIkR1cGxleEZsaXBTaG9ydEVkZ2UiOmNhc2UiRHVwbGV4RmxpcExvbmdFZGdlIjpzPW4ubmFtZTticmVhaztkZWZhdWx0OnM9Ik5vbmUifWJyZWFrO2Nhc2UiUHJpbnRQYWdlUmFuZ2UiOkFycmF5LmlzQXJyYXkobikmJm4ubGVuZ3RoJTI9PTAmJm4uZXZlcnkoKChlLHQscik9Pk51bWJlci5pc0ludGVnZXIoZSkmJmU+MCYmKDA9PT10fHxlPj1yW3QtMV0pJiZlPD10aGlzLm51bVBhZ2VzKSkmJihzPW4pO2JyZWFrO2Nhc2UiTnVtQ29waWVzIjpOdW1iZXIuaXNJbnRlZ2VyKG4pJiZuPjAmJihzPW4pO2JyZWFrO2RlZmF1bHQ6KDAsYS53YXJuKSgiSWdub3Jpbmcgbm9uLXN0YW5kYXJkIGtleSBpbiBWaWV3ZXJQcmVmZXJlbmNlczogIi5jb25jYXQociwiLiIpKTtjb250aW51ZX12b2lkIDAhPT1zPyh0fHwodD1PYmplY3QuY3JlYXRlKG51bGwpKSx0W3JdPXMpOigwLGEud2FybikoJ0JhZCB2YWx1ZSwgZm9yIGtleSAiJy5jb25jYXQociwnIiwgaW4gVmlld2VyUHJlZmVyZW5jZXM6ICcpLmNvbmNhdChuLCIuIikpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJ2aWV3ZXJQcmVmZXJlbmNlcyIsdCl9Z2V0IG9wZW5BY3Rpb24oKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJPcGVuQWN0aW9uIiksdD1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGUgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IHI9bmV3IGkuRGljdCh0aGlzLnhyZWYpO3Iuc2V0KCJBIixlKTtjb25zdCBuPXt1cmw6bnVsbCxkZXN0Om51bGwsYWN0aW9uOm51bGx9O3AucGFyc2VEZXN0RGljdGlvbmFyeSh7ZGVzdERpY3Q6cixyZXN1bHRPYmo6bn0pLEFycmF5LmlzQXJyYXkobi5kZXN0KT90LmRlc3Q9bi5kZXN0Om4uYWN0aW9uJiYodC5hY3Rpb249bi5hY3Rpb24pfWVsc2UgQXJyYXkuaXNBcnJheShlKSYmKHQuZGVzdD1lKTtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywib3BlbkFjdGlvbiIsKDAsYS5vYmplY3RTaXplKSh0KT4wP3Q6bnVsbCl9Z2V0IGF0dGFjaG1lbnRzKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTtsZXQgdD1udWxsO2lmKGUgaW5zdGFuY2VvZiBpLkRpY3QmJmUuaGFzKCJFbWJlZGRlZEZpbGVzIikpe2NvbnN0IHI9bmV3IHMuTmFtZVRyZWUoZS5nZXRSYXcoIkVtYmVkZGVkRmlsZXMiKSx0aGlzLnhyZWYpO2Zvcihjb25zdFtlLG5db2Ygci5nZXRBbGwoKSl7Y29uc3Qgcj1uZXcgaC5GaWxlU3BlYyhuLHRoaXMueHJlZik7dHx8KHQ9T2JqZWN0LmNyZWF0ZShudWxsKSksdFsoMCxhLnN0cmluZ1RvUERGU3RyaW5nKShlKV09ci5zZXJpYWxpemFibGV9fXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJhdHRhY2htZW50cyIsdCl9Z2V0IHhmYUltYWdlcygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7bGV0IHQ9bnVsbDtpZihlIGluc3RhbmNlb2YgaS5EaWN0JiZlLmhhcygiWEZBSW1hZ2VzIikpe2NvbnN0IHI9bmV3IHMuTmFtZVRyZWUoZS5nZXRSYXcoIlhGQUltYWdlcyIpLHRoaXMueHJlZik7Zm9yKGNvbnN0W2Usbl1vZiByLmdldEFsbCgpKXR8fCh0PW5ldyBpLkRpY3QodGhpcy54cmVmKSksdC5zZXQoKDAsYS5zdHJpbmdUb1BERlN0cmluZykoZSksbil9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsInhmYUltYWdlcyIsdCl9X2NvbGxlY3RKYXZhU2NyaXB0KCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTtsZXQgdD1udWxsO2Z1bmN0aW9uIHIoZSxyKXtpZighKHIgaW5zdGFuY2VvZiBpLkRpY3QpKXJldHVybjtpZighKDAsaS5pc05hbWUpKHIuZ2V0KCJTIiksIkphdmFTY3JpcHQiKSlyZXR1cm47bGV0IG49ci5nZXQoIkpTIik7aWYobiBpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbSluPW4uZ2V0U3RyaW5nKCk7ZWxzZSBpZigic3RyaW5nIiE9dHlwZW9mIG4pcmV0dXJuO249KDAsYS5zdHJpbmdUb1BERlN0cmluZykobikucmVwbGFjZUFsbCgiXDAiLCIiKSwodHx8KHQ9bmV3IE1hcCkpLnNldChlLG4pfWlmKGUgaW5zdGFuY2VvZiBpLkRpY3QmJmUuaGFzKCJKYXZhU2NyaXB0Iikpe2NvbnN0IHQ9bmV3IHMuTmFtZVRyZWUoZS5nZXRSYXcoIkphdmFTY3JpcHQiKSx0aGlzLnhyZWYpO2Zvcihjb25zdFtlLG5db2YgdC5nZXRBbGwoKSlyKCgwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGUpLG4pfWNvbnN0IG49dGhpcy5fY2F0RGljdC5nZXQoIk9wZW5BY3Rpb24iKTtyZXR1cm4gbiYmcigiT3BlbkFjdGlvbiIsbiksdH1nZXQgamF2YVNjcmlwdCgpe2NvbnN0IGU9dGhpcy5fY29sbGVjdEphdmFTY3JpcHQoKTtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiamF2YVNjcmlwdCIsZT9bLi4uZS52YWx1ZXMoKV06bnVsbCl9Z2V0IGpzQWN0aW9ucygpe2NvbnN0IGU9dGhpcy5fY29sbGVjdEphdmFTY3JpcHQoKTtsZXQgdD0oMCxuLmNvbGxlY3RBY3Rpb25zKSh0aGlzLnhyZWYsdGhpcy5fY2F0RGljdCxhLkRvY3VtZW50QWN0aW9uRXZlbnRUeXBlKTtpZihlKXt0fHwodD1PYmplY3QuY3JlYXRlKG51bGwpKTtmb3IoY29uc3RbcixuXW9mIGUpciBpbiB0P3Rbcl0ucHVzaChuKTp0W3JdPVtuXX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywianNBY3Rpb25zIix0KX1hc3luYyBmb250RmFsbGJhY2soZSx0KXtjb25zdCByPWF3YWl0IFByb21pc2UuYWxsKHRoaXMuZm9udENhY2hlKTtmb3IoY29uc3QgbiBvZiByKWlmKG4ubG9hZGVkTmFtZT09PWUpcmV0dXJuIHZvaWQgbi5mYWxsYmFjayh0KX1hc3luYyBjbGVhbnVwKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTsoMCxjLmNsZWFyR2xvYmFsQ2FjaGVzKSgpLHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5jbGVhcihlKSx0aGlzLnBhZ2VLaWRzQ291bnRDYWNoZS5jbGVhcigpLHRoaXMucGFnZUluZGV4Q2FjaGUuY2xlYXIoKSx0aGlzLm5vbkJsZW5kTW9kZXNTZXQuY2xlYXIoKTtjb25zdCB0PWF3YWl0IFByb21pc2UuYWxsKHRoaXMuZm9udENhY2hlKTtmb3IoY29uc3R7ZGljdDplfW9mIHQpZGVsZXRlIGUuY2FjaGVLZXk7dGhpcy5mb250Q2FjaGUuY2xlYXIoKSx0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuY2xlYXIoKSx0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5jbGVhcigpLHRoaXMuc3lzdGVtRm9udENhY2hlLmNsZWFyKCl9YXN5bmMgZ2V0UGFnZURpY3QoZSl7Y29uc3QgdD1bdGhpcy50b3BsZXZlbFBhZ2VzRGljdF0scj1uZXcgaS5SZWZTZXQsbj10aGlzLl9jYXREaWN0LmdldFJhdygiUGFnZXMiKTtuIGluc3RhbmNlb2YgaS5SZWYmJnIucHV0KG4pO2NvbnN0IHM9dGhpcy54cmVmLG89dGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUsYz10aGlzLnBhZ2VJbmRleENhY2hlO2xldCBsPTA7Zm9yKDt0Lmxlbmd0aDspe2NvbnN0IG49dC5wb3AoKTtpZihuIGluc3RhbmNlb2YgaS5SZWYpe2NvbnN0IGg9by5nZXQobik7aWYoaD49MCYmbCtoPD1lKXtsKz1oO2NvbnRpbnVlfWlmKHIuaGFzKG4pKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJQYWdlcyB0cmVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTtyLnB1dChuKTtjb25zdCB1PWF3YWl0IHMuZmV0Y2hBc3luYyhuKTtpZih1IGluc3RhbmNlb2YgaS5EaWN0KXtsZXQgdD11LmdldFJhdygiVHlwZSIpO2lmKHQgaW5zdGFuY2VvZiBpLlJlZiYmKHQ9YXdhaXQgcy5mZXRjaEFzeW5jKHQpKSwoMCxpLmlzTmFtZSkodCwiUGFnZSIpfHwhdS5oYXMoIktpZHMiKSl7aWYoby5oYXMobil8fG8ucHV0KG4sMSksYy5oYXMobil8fGMucHV0KG4sbCksbD09PWUpcmV0dXJuW3Usbl07bCsrO2NvbnRpbnVlfX10LnB1c2godSk7Y29udGludWV9aWYoIShuIGluc3RhbmNlb2YgaS5EaWN0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZCByZWZlcmVuY2UgcG9pbnRzIHRvIHdyb25nIHR5cGUgb2Ygb2JqZWN0LiIpO2NvbnN0e29iaklkOmh9PW47bGV0IHU9bi5nZXRSYXcoIkNvdW50Iik7aWYodSBpbnN0YW5jZW9mIGkuUmVmJiYodT1hd2FpdCBzLmZldGNoQXN5bmModSkpLE51bWJlci5pc0ludGVnZXIodSkmJnU+PTAmJihoJiYhby5oYXMoaCkmJm8ucHV0KGgsdSksbCt1PD1lKSl7bCs9dTtjb250aW51ZX1sZXQgZD1uLmdldFJhdygiS2lkcyIpO2lmKGQgaW5zdGFuY2VvZiBpLlJlZiYmKGQ9YXdhaXQgcy5mZXRjaEFzeW5jKGQpKSwhQXJyYXkuaXNBcnJheShkKSl7bGV0IHQ9bi5nZXRSYXcoIlR5cGUiKTtpZih0IGluc3RhbmNlb2YgaS5SZWYmJih0PWF3YWl0IHMuZmV0Y2hBc3luYyh0KSksKDAsaS5pc05hbWUpKHQsIlBhZ2UiKXx8IW4uaGFzKCJLaWRzIikpe2lmKGw9PT1lKXJldHVybltuLG51bGxdO2wrKztjb250aW51ZX10aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZHMgb2JqZWN0IGlzIG5vdCBhbiBhcnJheS4iKX1mb3IobGV0IGU9ZC5sZW5ndGgtMTtlPj0wO2UtLSl0LnB1c2goZFtlXSl9dGhyb3cgbmV3IEVycm9yKCJQYWdlIGluZGV4ICIuY29uY2F0KGUsIiBub3QgZm91bmQuIikpfWFzeW5jIGdldEFsbFBhZ2VEaWN0cygpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07Y29uc3R7aWdub3JlRXJyb3JzOnR9PXRoaXMucGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zLHI9W3tjdXJyZW50Tm9kZTp0aGlzLnRvcGxldmVsUGFnZXNEaWN0LHBvc0luS2lkczowfV0scz1uZXcgaS5SZWZTZXQsbz10aGlzLl9jYXREaWN0LmdldFJhdygiUGFnZXMiKTtvIGluc3RhbmNlb2YgaS5SZWYmJnMucHV0KG8pO2NvbnN0IGM9bmV3IE1hcCxsPXRoaXMueHJlZixoPXRoaXMucGFnZUluZGV4Q2FjaGU7bGV0IHU9MDtmdW5jdGlvbiBkKGUsdCl7dCYmIWguaGFzKHQpJiZoLnB1dCh0LHUpLGMuc2V0KHUrKyxbZSx0XSl9ZnVuY3Rpb24gZihyKXtpZihyIGluc3RhbmNlb2Ygbi5YUmVmRW50cnlFeGNlcHRpb24mJiFlKXRocm93IHI7ZSYmdCYmMD09PXUmJigoMCxhLndhcm4pKCdnZXRBbGxQYWdlRGljdHMgLSBTa2lwcGluZyBpbnZhbGlkIGZpcnN0IHBhZ2U6ICInLmNvbmNhdChyLCciLicpKSxyPWkuRGljdC5lbXB0eSksYy5zZXQodSsrLFtyLG51bGxdKX1mb3IoO3IubGVuZ3RoPjA7KXtjb25zdCB0PXIuYXQoLTEpLHtjdXJyZW50Tm9kZTpuLHBvc0luS2lkczpvfT10O2xldCBjPW4uZ2V0UmF3KCJLaWRzIik7aWYoYyBpbnN0YW5jZW9mIGkuUmVmKXRyeXtjPWF3YWl0IGwuZmV0Y2hBc3luYyhjKX1jYXRjaChlKXtmKGUpO2JyZWFrfWlmKCFBcnJheS5pc0FycmF5KGMpKXtmKG5ldyBhLkZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpKTticmVha31pZihvPj1jLmxlbmd0aCl7ci5wb3AoKTtjb250aW51ZX1jb25zdCBoPWNbb107bGV0IHU7aWYoaCBpbnN0YW5jZW9mIGkuUmVmKXtpZihzLmhhcyhoKSl7ZihuZXcgYS5Gb3JtYXRFcnJvcigiUGFnZXMgdHJlZSBjb250YWlucyBjaXJjdWxhciByZWZlcmVuY2UuIikpO2JyZWFrfXMucHV0KGgpO3RyeXt1PWF3YWl0IGwuZmV0Y2hBc3luYyhoKX1jYXRjaChlKXtmKGUpO2JyZWFrfX1lbHNlIHU9aDtpZighKHUgaW5zdGFuY2VvZiBpLkRpY3QpKXtmKG5ldyBhLkZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkIHJlZmVyZW5jZSBwb2ludHMgdG8gd3JvbmcgdHlwZSBvZiBvYmplY3QuIikpO2JyZWFrfWxldCBnPXUuZ2V0UmF3KCJUeXBlIik7aWYoZyBpbnN0YW5jZW9mIGkuUmVmKXRyeXtnPWF3YWl0IGwuZmV0Y2hBc3luYyhnKX1jYXRjaChlKXtmKGUpO2JyZWFrfSgwLGkuaXNOYW1lKShnLCJQYWdlIil8fCF1LmhhcygiS2lkcyIpP2QodSxoIGluc3RhbmNlb2YgaS5SZWY/aDpudWxsKTpyLnB1c2goe2N1cnJlbnROb2RlOnUscG9zSW5LaWRzOjB9KSx0LnBvc0luS2lkcysrfXJldHVybiBjfWdldFBhZ2VJbmRleChlKXtjb25zdCB0PXRoaXMucGFnZUluZGV4Q2FjaGUuZ2V0KGUpO2lmKHZvaWQgMCE9PXQpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0KTtjb25zdCByPXRoaXMueHJlZjtsZXQgbj0wO2NvbnN0IHM9dD0+ZnVuY3Rpb24odCl7bGV0IG4scz0wO3JldHVybiByLmZldGNoQXN5bmModCkudGhlbigoZnVuY3Rpb24ocil7aWYoKDAsaS5pc1JlZnNFcXVhbCkodCxlKSYmISgwLGkuaXNEaWN0KShyLCJQYWdlIikmJiEociBpbnN0YW5jZW9mIGkuRGljdCYmIXIuaGFzKCJUeXBlIikmJnIuaGFzKCJDb250ZW50cyIpKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiVGhlIHJlZmVyZW5jZSBkb2VzIG5vdCBwb2ludCB0byBhIC9QYWdlIGRpY3Rpb25hcnkuIik7aWYoIXIpcmV0dXJuIG51bGw7aWYoIShyIGluc3RhbmNlb2YgaS5EaWN0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiTm9kZSBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTtyZXR1cm4gbj1yLmdldFJhdygiUGFyZW50Iiksci5nZXRBc3luYygiUGFyZW50Iil9KSkudGhlbigoZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiUGFyZW50IG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpO3JldHVybiBlLmdldEFzeW5jKCJLaWRzIil9KSkudGhlbigoZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7Y29uc3Qgbz1bXTtsZXQgYz0hMTtmb3IoY29uc3QgbiBvZiBlKXtpZighKG4gaW5zdGFuY2VvZiBpLlJlZikpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIktpZCBtdXN0IGJlIGEgcmVmZXJlbmNlLiIpO2lmKCgwLGkuaXNSZWZzRXF1YWwpKG4sdCkpe2M9ITA7YnJlYWt9by5wdXNoKHIuZmV0Y2hBc3luYyhuKS50aGVuKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBpLkRpY3QpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJLaWQgbm9kZSBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTtlLmhhcygiQ291bnQiKT9zKz1lLmdldCgiQ291bnQiKTpzKyt9KSkpfWlmKCFjKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJLaWQgcmVmZXJlbmNlIG5vdCBmb3VuZCBpbiBwYXJlbnQncyBraWRzLiIpO3JldHVybiBQcm9taXNlLmFsbChvKS50aGVuKChmdW5jdGlvbigpe3JldHVybltzLG5dfSkpfSkpfSh0KS50aGVuKCh0PT57aWYoIXQpcmV0dXJuIHRoaXMucGFnZUluZGV4Q2FjaGUucHV0KGUsbiksbjtjb25zdFtyLGFdPXQ7cmV0dXJuIG4rPXIscyhhKX0pKTtyZXR1cm4gcyhlKX1nZXQgYmFzZVVybCgpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIlVSSSIpO2lmKGUgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IHQ9ZS5nZXQoIkJhc2UiKTtpZigic3RyaW5nIj09dHlwZW9mIHQpe2NvbnN0IGU9KDAsYS5jcmVhdGVWYWxpZEFic29sdXRlVXJsKSh0LG51bGwse3RyeUNvbnZlcnRFbmNvZGluZzohMH0pO2lmKGUpcmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsImJhc2VVcmwiLGUuaHJlZil9fXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJiYXNlVXJsIixudWxsKX1zdGF0aWMgcGFyc2VEZXN0RGljdGlvbmFyeShlKXtjb25zdCB0PWUuZGVzdERpY3Q7aWYoISh0IGluc3RhbmNlb2YgaS5EaWN0KSlyZXR1cm4gdm9pZCgwLGEud2FybikoInBhcnNlRGVzdERpY3Rpb25hcnk6IGBkZXN0RGljdGAgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7Y29uc3Qgcj1lLnJlc3VsdE9iajtpZigib2JqZWN0IiE9dHlwZW9mIHIpcmV0dXJuIHZvaWQoMCxhLndhcm4pKCJwYXJzZURlc3REaWN0aW9uYXJ5OiBgcmVzdWx0T2JqYCBtdXN0IGJlIGFuIG9iamVjdC4iKTtjb25zdCBzPWUuZG9jQmFzZVVybHx8bnVsbCxjPWUuZG9jQXR0YWNobWVudHN8fG51bGw7bGV0IGwsaCx1PXQuZ2V0KCJBIik7aWYodSBpbnN0YW5jZW9mIGkuRGljdHx8KHQuaGFzKCJEZXN0Iik/dT10LmdldCgiRGVzdCIpOih1PXQuZ2V0KCJBQSIpLHUgaW5zdGFuY2VvZiBpLkRpY3QmJih1LmhhcygiRCIpP3U9dS5nZXQoIkQiKTp1LmhhcygiVSIpJiYodT11LmdldCgiVSIpKSkpKSx1IGluc3RhbmNlb2YgaS5EaWN0KXtjb25zdCBlPXUuZ2V0KCJTIik7aWYoIShlIGluc3RhbmNlb2YgaS5OYW1lKSlyZXR1cm4gdm9pZCgwLGEud2FybikoInBhcnNlRGVzdERpY3Rpb25hcnk6IEludmFsaWQgdHlwZSBpbiBBY3Rpb24gZGljdGlvbmFyeS4iKTtjb25zdCB0PWUubmFtZTtzd2l0Y2godCl7Y2FzZSJSZXNldEZvcm0iOmNvbnN0IGU9dS5nZXQoIkZsYWdzIikscz0wPT0oMSYoIm51bWJlciI9PXR5cGVvZiBlP2U6MCkpLGQ9W10sZj1bXTtmb3IoY29uc3QgZSBvZiB1LmdldCgiRmllbGRzIil8fFtdKWUgaW5zdGFuY2VvZiBpLlJlZj9mLnB1c2goZS50b1N0cmluZygpKToic3RyaW5nIj09dHlwZW9mIGUmJmQucHVzaCgoMCxhLnN0cmluZ1RvUERGU3RyaW5nKShlKSk7ci5yZXNldEZvcm09e2ZpZWxkczpkLHJlZnM6ZixpbmNsdWRlOnN9O2JyZWFrO2Nhc2UiVVJJIjpsPXUuZ2V0KCJVUkkiKSxsIGluc3RhbmNlb2YgaS5OYW1lJiYobD0iLyIrbC5uYW1lKTticmVhaztjYXNlIkdvVG8iOmg9dS5nZXQoIkQiKTticmVhaztjYXNlIkxhdW5jaCI6Y2FzZSJHb1RvUiI6Y29uc3QgZz11LmdldCgiRiIpO2cgaW5zdGFuY2VvZiBpLkRpY3Q/bD1nLmdldCgiRiIpfHxudWxsOiJzdHJpbmciPT10eXBlb2YgZyYmKGw9Zyk7bGV0IHA9dS5nZXQoIkQiKTtpZihwJiYocCBpbnN0YW5jZW9mIGkuTmFtZSYmKHA9cC5uYW1lKSwic3RyaW5nIj09dHlwZW9mIGwpKXtjb25zdCBlPWwuc3BsaXQoIiMiKVswXTsic3RyaW5nIj09dHlwZW9mIHA/bD1lKyIjIitwOkFycmF5LmlzQXJyYXkocCkmJihsPWUrIiMiK0pTT04uc3RyaW5naWZ5KHApKX1jb25zdCBtPXUuZ2V0KCJOZXdXaW5kb3ciKTsiYm9vbGVhbiI9PXR5cGVvZiBtJiYoci5uZXdXaW5kb3c9bSk7YnJlYWs7Y2FzZSJHb1RvRSI6Y29uc3QgYj11LmdldCgiVCIpO2xldCB5O2lmKGMmJmIgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IGU9Yi5nZXQoIlIiKSx0PWIuZ2V0KCJOIik7KDAsaS5pc05hbWUpKGUsIkMiKSYmInN0cmluZyI9PXR5cGVvZiB0JiYoeT1jWygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHQpXSl9eT9yLmF0dGFjaG1lbnQ9eTooMCxhLndhcm4pKCdwYXJzZURlc3REaWN0aW9uYXJ5IC0gdW5pbXBsZW1lbnRlZCAiR29Ub0UiIGFjdGlvbi4nKTticmVhaztjYXNlIk5hbWVkIjpjb25zdCB3PXUuZ2V0KCJOIik7dyBpbnN0YW5jZW9mIGkuTmFtZSYmKHIuYWN0aW9uPXcubmFtZSk7YnJlYWs7Y2FzZSJTZXRPQ0dTdGF0ZSI6Y29uc3Qgdj11LmdldCgiU3RhdGUiKSx4PXUuZ2V0KCJQcmVzZXJ2ZVJCIik7aWYoIUFycmF5LmlzQXJyYXkodil8fDA9PT12Lmxlbmd0aClicmVhaztjb25zdCBTPVtdO2Zvcihjb25zdCBlIG9mIHYpaWYoZSBpbnN0YW5jZW9mIGkuTmFtZSlzd2l0Y2goZS5uYW1lKXtjYXNlIk9OIjpjYXNlIk9GRiI6Y2FzZSJUb2dnbGUiOlMucHVzaChlLm5hbWUpfWVsc2UgZSBpbnN0YW5jZW9mIGkuUmVmJiZTLnB1c2goZS50b1N0cmluZygpKTtpZihTLmxlbmd0aCE9PXYubGVuZ3RoKWJyZWFrO3Iuc2V0T0NHU3RhdGU9e3N0YXRlOlMscHJlc2VydmVSQjoiYm9vbGVhbiIhPXR5cGVvZiB4fHx4fTticmVhaztjYXNlIkphdmFTY3JpcHQiOmNvbnN0IEE9dS5nZXQoIkpTIik7bGV0IGs7QSBpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbT9rPUEuZ2V0U3RyaW5nKCk6InN0cmluZyI9PXR5cGVvZiBBJiYoaz1BKTtjb25zdCBDPWsmJigwLG4ucmVjb3ZlckpzVVJMKSgoMCxhLnN0cmluZ1RvUERGU3RyaW5nKShrKSk7aWYoQyl7bD1DLnVybCxyLm5ld1dpbmRvdz1DLm5ld1dpbmRvdzticmVha31kZWZhdWx0OmlmKCJKYXZhU2NyaXB0Ij09PXR8fCJTdWJtaXRGb3JtIj09PXQpYnJlYWs7KDAsYS53YXJuKSgncGFyc2VEZXN0RGljdGlvbmFyeSAtIHVuc3VwcG9ydGVkIGFjdGlvbjogIicuY29uY2F0KHQsJyIuJykpfX1lbHNlIHQuaGFzKCJEZXN0IikmJihoPXQuZ2V0KCJEZXN0IikpO2lmKCJzdHJpbmciPT10eXBlb2YgbCl7Y29uc3QgZT0oMCxhLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKGwscyx7YWRkRGVmYXVsdFByb3RvY29sOiEwLHRyeUNvbnZlcnRFbmNvZGluZzohMH0pO2UmJihyLnVybD1lLmhyZWYpLHIudW5zYWZlVXJsPWx9aCYmKGggaW5zdGFuY2VvZiBpLk5hbWUmJihoPWgubmFtZSksInN0cmluZyI9PXR5cGVvZiBoP3IuZGVzdD0oMCxhLnN0cmluZ1RvUERGU3RyaW5nKShoKTpBcnJheS5pc0FycmF5KGgpJiYoci5kZXN0PWgpKX19dC5DYXRhbG9nPXB9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5OdW1iZXJUcmVlPXQuTmFtZVRyZWU9dm9pZCAwLHIoMTM5KTt2YXIgbj1yKDE1MCksYT1yKDE0NCk7Y2xhc3MgaXtjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5jb25zdHJ1Y3Rvcj09PWkmJigwLGEudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBOYW1lT3JOdW1iZXJUcmVlLiIpLHRoaXMucm9vdD1lLHRoaXMueHJlZj10LHRoaXMuX3R5cGU9cn1nZXRBbGwoKXtjb25zdCBlPW5ldyBNYXA7aWYoIXRoaXMucm9vdClyZXR1cm4gZTtjb25zdCB0PXRoaXMueHJlZixyPW5ldyBuLlJlZlNldDtyLnB1dCh0aGlzLnJvb3QpO2NvbnN0IGk9W3RoaXMucm9vdF07Zm9yKDtpLmxlbmd0aD4wOyl7Y29uc3Qgcz10LmZldGNoSWZSZWYoaS5zaGlmdCgpKTtpZighKHMgaW5zdGFuY2VvZiBuLkRpY3QpKWNvbnRpbnVlO2lmKHMuaGFzKCJLaWRzIikpe2NvbnN0IGU9cy5nZXQoIktpZHMiKTtpZighQXJyYXkuaXNBcnJheShlKSljb250aW51ZTtmb3IoY29uc3QgdCBvZiBlKXtpZihyLmhhcyh0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcignRHVwbGljYXRlIGVudHJ5IGluICInLmNvbmNhdCh0aGlzLl90eXBlLCciIHRyZWUuJykpO2kucHVzaCh0KSxyLnB1dCh0KX1jb250aW51ZX1jb25zdCBvPXMuZ2V0KHRoaXMuX3R5cGUpO2lmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCByPTAsbj1vLmxlbmd0aDtyPG47cis9MillLnNldCh0LmZldGNoSWZSZWYob1tyXSksdC5mZXRjaElmUmVmKG9bcisxXSkpfXJldHVybiBlfWdldChlKXtpZighdGhpcy5yb290KXJldHVybiBudWxsO2NvbnN0IHQ9dGhpcy54cmVmO2xldCByPXQuZmV0Y2hJZlJlZih0aGlzLnJvb3QpLG49MDtmb3IoO3IuaGFzKCJLaWRzIik7KXtpZigrK24+MTApcmV0dXJuKDAsYS53YXJuKSgnU2VhcmNoIGRlcHRoIGxpbWl0IHJlYWNoZWQgZm9yICInLmNvbmNhdCh0aGlzLl90eXBlLCciIHRyZWUuJykpLG51bGw7Y29uc3QgaT1yLmdldCgiS2lkcyIpO2lmKCFBcnJheS5pc0FycmF5KGkpKXJldHVybiBudWxsO2xldCBzPTAsbz1pLmxlbmd0aC0xO2Zvcig7czw9bzspe2NvbnN0IG49cytvPj4xLGE9dC5mZXRjaElmUmVmKGlbbl0pLGM9YS5nZXQoIkxpbWl0cyIpO2lmKGU8dC5mZXRjaElmUmVmKGNbMF0pKW89bi0xO2Vsc2V7aWYoIShlPnQuZmV0Y2hJZlJlZihjWzFdKSkpe3I9YTticmVha31zPW4rMX19aWYocz5vKXJldHVybiBudWxsfWNvbnN0IGk9ci5nZXQodGhpcy5fdHlwZSk7aWYoQXJyYXkuaXNBcnJheShpKSl7bGV0IHI9MCxuPWkubGVuZ3RoLTI7Zm9yKDtyPD1uOyl7Y29uc3QgYT1yK24+PjEscz1hKygxJmEpLG89dC5mZXRjaElmUmVmKGlbc10pO2lmKGU8byluPXMtMjtlbHNle2lmKCEoZT5vKSlyZXR1cm4gdC5mZXRjaElmUmVmKGlbcysxXSk7cj1zKzJ9fX1yZXR1cm4gbnVsbH19dC5OYW1lVHJlZT1jbGFzcyBleHRlbmRzIGl7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQsIk5hbWVzIil9fSx0Lk51bWJlclRyZWU9Y2xhc3MgZXh0ZW5kcyBpe2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0LCJOdW1zIil9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNsZWFyR2xvYmFsQ2FjaGVzPWZ1bmN0aW9uKCl7KDAsbi5jbGVhclByaW1pdGl2ZUNhY2hlcykoKSwoMCxhLmNsZWFyVW5pY29kZUNhY2hlcykoKX07dmFyIG49cigxNTApLGE9cigxOTApfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRmlsZVNwZWM9dm9pZCAwO3ZhciBuPXIoMTQ0KSxhPXIoMTUxKSxpPXIoMTUwKTtmdW5jdGlvbiBzKGUpe3JldHVybiBlLmhhcygiVUYiKT9lLmdldCgiVUYiKTplLmhhcygiRiIpP2UuZ2V0KCJGIik6ZS5oYXMoIlVuaXgiKT9lLmdldCgiVW5peCIpOmUuaGFzKCJNYWMiKT9lLmdldCgiTWFjIik6ZS5oYXMoIkRPUyIpP2UuZ2V0KCJET1MiKTpudWxsfXQuRmlsZVNwZWM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXtlIGluc3RhbmNlb2YgaS5EaWN0JiYodGhpcy54cmVmPXQsdGhpcy5yb290PWUsZS5oYXMoIkZTIikmJih0aGlzLmZzPWUuZ2V0KCJGUyIpKSx0aGlzLmRlc2NyaXB0aW9uPWUuaGFzKCJEZXNjIik/KDAsbi5zdHJpbmdUb1BERlN0cmluZykoZS5nZXQoIkRlc2MiKSk6IiIsZS5oYXMoIlJGIikmJigwLG4ud2FybikoIlJlbGF0ZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpLHRoaXMuY29udGVudEF2YWlsYWJsZT0hMCxlLmhhcygiRUYiKXx8KHRoaXMuY29udGVudEF2YWlsYWJsZT0hMSwoMCxuLndhcm4pKCJOb24tZW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpKSl9Z2V0IGZpbGVuYW1lKCl7aWYoIXRoaXMuX2ZpbGVuYW1lJiZ0aGlzLnJvb3Qpe2NvbnN0IGU9cyh0aGlzLnJvb3QpfHwidW5uYW1lZCI7dGhpcy5fZmlsZW5hbWU9KDAsbi5zdHJpbmdUb1BERlN0cmluZykoZSkucmVwbGFjZUFsbCgiXFxcXCIsIlxcIikucmVwbGFjZUFsbCgiXFwvIiwiLyIpLnJlcGxhY2VBbGwoIlxcIiwiLyIpfXJldHVybiB0aGlzLl9maWxlbmFtZX1nZXQgY29udGVudCgpe2lmKCF0aGlzLmNvbnRlbnRBdmFpbGFibGUpcmV0dXJuIG51bGw7IXRoaXMuY29udGVudFJlZiYmdGhpcy5yb290JiYodGhpcy5jb250ZW50UmVmPXModGhpcy5yb290LmdldCgiRUYiKSkpO2xldCBlPW51bGw7aWYodGhpcy5jb250ZW50UmVmKXtjb25zdCB0PXRoaXMueHJlZi5mZXRjaElmUmVmKHRoaXMuY29udGVudFJlZik7dCBpbnN0YW5jZW9mIGEuQmFzZVN0cmVhbT9lPXQuZ2V0Qnl0ZXMoKTooMCxuLndhcm4pKCJFbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb24gcG9pbnRzIHRvIG5vbi1leGlzdGluZy9pbnZhbGlkIGNvbnRlbnQiKX1lbHNlKDAsbi53YXJuKSgiRW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYSBjb250ZW50Iik7cmV0dXJuIGV9Z2V0IHNlcmlhbGl6YWJsZSgpe3JldHVybntmaWxlbmFtZTp0aGlzLmZpbGVuYW1lLGNvbnRlbnQ6dGhpcy5jb250ZW50fX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuTWV0YWRhdGFQYXJzZXI9dm9pZCAwLHIoMikscigxMzkpO3ZhciBuPXIoMjE3KTt0Lk1ldGFkYXRhUGFyc2VyPWNsYXNze2NvbnN0cnVjdG9yKGUpe2U9dGhpcy5fcmVwYWlyKGUpO2NvbnN0IHQ9bmV3IG4uU2ltcGxlWE1MUGFyc2VyKHtsb3dlckNhc2VOYW1lOiEwfSkucGFyc2VGcm9tU3RyaW5nKGUpO3RoaXMuX21ldGFkYXRhTWFwPW5ldyBNYXAsdGhpcy5fZGF0YT1lLHQmJnRoaXMuX3BhcnNlKHQpfV9yZXBhaXIoZSl7cmV0dXJuIGUucmVwbGFjZSgvXltePF0rLywiIikucmVwbGFjZUFsbCgvPlxcMzc2XFwzNzcoW148XSspL2csKGZ1bmN0aW9uKGUsdCl7Y29uc3Qgcj10LnJlcGxhY2VBbGwoL1xcKFswLTNdKShbMC03XSkoWzAtN10pL2csKGZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDY0KnQrOCpyKzEqbil9KSkucmVwbGFjZUFsbCgvJihhbXB8YXBvc3xndHxsdHxxdW90KTsvZywoZnVuY3Rpb24oZSx0KXtzd2l0Y2godCl7Y2FzZSJhbXAiOnJldHVybiImIjtjYXNlImFwb3MiOnJldHVybiInIjtjYXNlImd0IjpyZXR1cm4iPiI7Y2FzZSJsdCI6cmV0dXJuIjwiO2Nhc2UicXVvdCI6cmV0dXJuJyInfXRocm93IG5ldyBFcnJvcigiX3JlcGFpcjogIi5jb25jYXQodCwiIGlzbid0IGRlZmluZWQuIikpfSkpLG49WyI+Il07Zm9yKGxldCBlPTAsdD1yLmxlbmd0aDtlPHQ7ZSs9Mil7Y29uc3QgdD0yNTYqci5jaGFyQ29kZUF0KGUpK3IuY2hhckNvZGVBdChlKzEpO3Q+PTMyJiZ0PDEyNyYmNjAhPT10JiY2MiE9PXQmJjM4IT09dD9uLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh0KSk6bi5wdXNoKCImI3giKyg2NTUzNit0KS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpKyI7Iil9cmV0dXJuIG4uam9pbigiIil9KSl9X2dldFNlcXVlbmNlKGUpe2NvbnN0IHQ9ZS5ub2RlTmFtZTtyZXR1cm4icmRmOmJhZyIhPT10JiYicmRmOnNlcSIhPT10JiYicmRmOmFsdCIhPT10P251bGw6ZS5jaGlsZE5vZGVzLmZpbHRlcigoZT0+InJkZjpsaSI9PT1lLm5vZGVOYW1lKSl9X3BhcnNlQXJyYXkoZSl7aWYoIWUuaGFzQ2hpbGROb2RlcygpKXJldHVybjtjb25zdFt0XT1lLmNoaWxkTm9kZXMscj10aGlzLl9nZXRTZXF1ZW5jZSh0KXx8W107dGhpcy5fbWV0YWRhdGFNYXAuc2V0KGUubm9kZU5hbWUsci5tYXAoKGU9PmUudGV4dENvbnRlbnQudHJpbSgpKSkpfV9wYXJzZShlKXtsZXQgdD1lLmRvY3VtZW50RWxlbWVudDtpZigicmRmOnJkZiIhPT10Lm5vZGVOYW1lKWZvcih0PXQuZmlyc3RDaGlsZDt0JiYicmRmOnJkZiIhPT10Lm5vZGVOYW1lOyl0PXQubmV4dFNpYmxpbmc7aWYodCYmInJkZjpyZGYiPT09dC5ub2RlTmFtZSYmdC5oYXNDaGlsZE5vZGVzKCkpZm9yKGNvbnN0IGUgb2YgdC5jaGlsZE5vZGVzKWlmKCJyZGY6ZGVzY3JpcHRpb24iPT09ZS5ub2RlTmFtZSlmb3IoY29uc3QgdCBvZiBlLmNoaWxkTm9kZXMpe2NvbnN0IGU9dC5ub2RlTmFtZTtzd2l0Y2goZSl7Y2FzZSIjdGV4dCI6Y29udGludWU7Y2FzZSJkYzpjcmVhdG9yIjpjYXNlImRjOnN1YmplY3QiOnRoaXMuX3BhcnNlQXJyYXkodCk7Y29udGludWV9dGhpcy5fbWV0YWRhdGFNYXAuc2V0KGUsdC50ZXh0Q29udGVudC50cmltKCkpfX1nZXQgc2VyaWFsaXphYmxlKCl7cmV0dXJue3BhcnNlZERhdGE6dGhpcy5fbWV0YWRhdGFNYXAscmF3RGF0YTp0aGlzLl9kYXRhfX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuU3RydWN0VHJlZVJvb3Q9dC5TdHJ1Y3RUcmVlUGFnZT12b2lkIDAscigxMzkpO3ZhciBuPXIoMTUwKSxhPXIoMTQ0KSxpPXIoMjIxKTtjb25zdCBzPSJQQUdFX0NPTlRFTlQiLG89IlNUUkVBTV9DT05URU5UIixjPSJPQkpFQ1QiLGw9IkVMRU1FTlQiO3QuU3RydWN0VHJlZVJvb3Q9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5kaWN0PWUsdGhpcy5yb2xlTWFwPW5ldyBNYXB9aW5pdCgpe3RoaXMucmVhZFJvbGVNYXAoKX1yZWFkUm9sZU1hcCgpe2NvbnN0IGU9dGhpcy5kaWN0LmdldCgiUm9sZU1hcCIpO2UgaW5zdGFuY2VvZiBuLkRpY3QmJmUuZm9yRWFjaCgoKGUsdCk9Pnt0IGluc3RhbmNlb2Ygbi5OYW1lJiZ0aGlzLnJvbGVNYXAuc2V0KGUsdC5uYW1lKX0pKX19O2NsYXNzIGh7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnRyZWU9ZSx0aGlzLmRpY3Q9dCx0aGlzLmtpZHM9W10sdGhpcy5wYXJzZUtpZHMoKX1nZXQgcm9sZSgpe2NvbnN0IGU9dGhpcy5kaWN0LmdldCgiUyIpLHQ9ZSBpbnN0YW5jZW9mIG4uTmFtZT9lLm5hbWU6IiIse3Jvb3Q6cn09dGhpcy50cmVlO3JldHVybiByLnJvbGVNYXAuaGFzKHQpP3Iucm9sZU1hcC5nZXQodCk6dH1wYXJzZUtpZHMoKXtsZXQgZT1udWxsO2NvbnN0IHQ9dGhpcy5kaWN0LmdldFJhdygiUGciKTt0IGluc3RhbmNlb2Ygbi5SZWYmJihlPXQudG9TdHJpbmcoKSk7Y29uc3Qgcj10aGlzLmRpY3QuZ2V0KCJLIik7aWYoQXJyYXkuaXNBcnJheShyKSlmb3IoY29uc3QgdCBvZiByKXtjb25zdCByPXRoaXMucGFyc2VLaWQoZSx0KTtyJiZ0aGlzLmtpZHMucHVzaChyKX1lbHNle2NvbnN0IHQ9dGhpcy5wYXJzZUtpZChlLHIpO3QmJnRoaXMua2lkcy5wdXNoKHQpfX1wYXJzZUtpZChlLHQpe2lmKE51bWJlci5pc0ludGVnZXIodCkpcmV0dXJuIHRoaXMudHJlZS5wYWdlRGljdC5vYmpJZCE9PWU/bnVsbDpuZXcgdSh7dHlwZTpzLG1jaWQ6dCxwYWdlT2JqSWQ6ZX0pO2xldCByPW51bGw7aWYodCBpbnN0YW5jZW9mIG4uUmVmP3I9dGhpcy5kaWN0LnhyZWYuZmV0Y2godCk6dCBpbnN0YW5jZW9mIG4uRGljdCYmKHI9dCksIXIpcmV0dXJuIG51bGw7Y29uc3QgYT1yLmdldFJhdygiUGciKTthIGluc3RhbmNlb2Ygbi5SZWYmJihlPWEudG9TdHJpbmcoKSk7Y29uc3QgaT1yLmdldCgiVHlwZSIpaW5zdGFuY2VvZiBuLk5hbWU/ci5nZXQoIlR5cGUiKS5uYW1lOm51bGw7cmV0dXJuIk1DUiI9PT1pP3RoaXMudHJlZS5wYWdlRGljdC5vYmpJZCE9PWU/bnVsbDpuZXcgdSh7dHlwZTpvLHJlZk9iaklkOnIuZ2V0UmF3KCJTdG0iKWluc3RhbmNlb2Ygbi5SZWY/ci5nZXRSYXcoIlN0bSIpLnRvU3RyaW5nKCk6bnVsbCxwYWdlT2JqSWQ6ZSxtY2lkOnIuZ2V0KCJNQ0lEIil9KToiT0JKUiI9PT1pP3RoaXMudHJlZS5wYWdlRGljdC5vYmpJZCE9PWU/bnVsbDpuZXcgdSh7dHlwZTpjLHJlZk9iaklkOnIuZ2V0UmF3KCJPYmoiKWluc3RhbmNlb2Ygbi5SZWY/ci5nZXRSYXcoIk9iaiIpLnRvU3RyaW5nKCk6bnVsbCxwYWdlT2JqSWQ6ZX0pOm5ldyB1KHt0eXBlOmwsZGljdDpyfSl9fWNsYXNzIHV7Y29uc3RydWN0b3IoZSl7bGV0e3R5cGU6dCxkaWN0OnI9bnVsbCxtY2lkOm49bnVsbCxwYWdlT2JqSWQ6YT1udWxsLHJlZk9iaklkOmk9bnVsbH09ZTt0aGlzLnR5cGU9dCx0aGlzLmRpY3Q9cix0aGlzLm1jaWQ9bix0aGlzLnBhZ2VPYmpJZD1hLHRoaXMucmVmT2JqSWQ9aSx0aGlzLnBhcmVudE5vZGU9bnVsbH19dC5TdHJ1Y3RUcmVlUGFnZT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMucm9vdD1lLHRoaXMucm9vdERpY3Q9ZT9lLmRpY3Q6bnVsbCx0aGlzLnBhZ2VEaWN0PXQsdGhpcy5ub2Rlcz1bXX1wYXJzZSgpe2lmKCF0aGlzLnJvb3R8fCF0aGlzLnJvb3REaWN0KXJldHVybjtjb25zdCBlPXRoaXMucm9vdERpY3QuZ2V0KCJQYXJlbnRUcmVlIik7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9dGhpcy5wYWdlRGljdC5nZXQoIlN0cnVjdFBhcmVudHMiKTtpZighTnVtYmVyLmlzSW50ZWdlcih0KSlyZXR1cm47Y29uc3Qgcj1uZXcgaS5OdW1iZXJUcmVlKGUsdGhpcy5yb290RGljdC54cmVmKS5nZXQodCk7aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuO2NvbnN0IGE9bmV3IE1hcDtmb3IoY29uc3QgZSBvZiByKWUgaW5zdGFuY2VvZiBuLlJlZiYmdGhpcy5hZGROb2RlKHRoaXMucm9vdERpY3QueHJlZi5mZXRjaChlKSxhKX1hZGROb2RlKGUsdCl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOjA7aWYocj40MClyZXR1cm4oMCxhLndhcm4pKCJTdHJ1Y3RUcmVlIE1BWF9ERVBUSCByZWFjaGVkLiIpLG51bGw7aWYodC5oYXMoZSkpcmV0dXJuIHQuZ2V0KGUpO2NvbnN0IGk9bmV3IGgodGhpcyxlKTt0LnNldChlLGkpO2NvbnN0IHM9ZS5nZXQoIlAiKTtpZighc3x8KDAsbi5pc05hbWUpKHMuZ2V0KCJUeXBlIiksIlN0cnVjdFRyZWVSb290IikpcmV0dXJuIHRoaXMuYWRkVG9wTGV2ZWxOb2RlKGUsaSl8fHQuZGVsZXRlKGUpLGk7Y29uc3Qgbz10aGlzLmFkZE5vZGUocyx0LHIrMSk7aWYoIW8pcmV0dXJuIGk7bGV0IGM9ITE7Zm9yKGNvbnN0IHQgb2Ygby5raWRzKXQudHlwZT09PWwmJnQuZGljdD09PWUmJih0LnBhcmVudE5vZGU9aSxjPSEwKTtyZXR1cm4gY3x8dC5kZWxldGUoZSksaX1hZGRUb3BMZXZlbE5vZGUoZSx0KXtjb25zdCByPXRoaXMucm9vdERpY3QuZ2V0KCJLIik7aWYoIXIpcmV0dXJuITE7aWYociBpbnN0YW5jZW9mIG4uRGljdClyZXR1cm4gci5vYmpJZD09PWUub2JqSWQmJih0aGlzLm5vZGVzWzBdPXQsITApO2lmKCFBcnJheS5pc0FycmF5KHIpKXJldHVybiEwO2xldCBhPSExO2ZvcihsZXQgbj0wO248ci5sZW5ndGg7bisrKXtjb25zdCBpPXJbbl07KG51bGw9PWk/dm9pZCAwOmkudG9TdHJpbmcoKSk9PT1lLm9iaklkJiYodGhpcy5ub2Rlc1tuXT10LGE9ITApfXJldHVybiBhfWdldCBzZXJpYWxpemFibGUoKXtmdW5jdGlvbiBlKHQscil7bGV0IG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOjA7aWYobj40MClyZXR1cm4gdm9pZCgwLGEud2FybikoIlN0cnVjdFRyZWUgdG9vIGRlZXAgdG8gYmUgZnVsbHkgc2VyaWFsaXplZC4iKTtjb25zdCBpPU9iamVjdC5jcmVhdGUobnVsbCk7aS5yb2xlPXQucm9sZSxpLmNoaWxkcmVuPVtdLHIuY2hpbGRyZW4ucHVzaChpKTtjb25zdCBoPXQuZGljdC5nZXQoIkFsdCIpOyJzdHJpbmciPT10eXBlb2YgaCYmKGkuYWx0PSgwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGgpKTtjb25zdCB1PXQuZGljdC5nZXQoIkxhbmciKTsic3RyaW5nIj09dHlwZW9mIHUmJihpLmxhbmc9KDAsYS5zdHJpbmdUb1BERlN0cmluZykodSkpO2Zvcihjb25zdCByIG9mIHQua2lkcyl7Y29uc3QgdD1yLnR5cGU9PT1sP3IucGFyZW50Tm9kZTpudWxsO3Q/ZSh0LGksbisxKTpyLnR5cGU9PT1zfHxyLnR5cGU9PT1vP2kuY2hpbGRyZW4ucHVzaCh7dHlwZToiY29udGVudCIsaWQ6InAiLmNvbmNhdChyLnBhZ2VPYmpJZCwiX21jIikuY29uY2F0KHIubWNpZCl9KTpyLnR5cGU9PT1jJiZpLmNoaWxkcmVuLnB1c2goe3R5cGU6Im9iamVjdCIsaWQ6ci5yZWZPYmpJZH0pfX1jb25zdCB0PU9iamVjdC5jcmVhdGUobnVsbCk7dC5jaGlsZHJlbj1bXSx0LnJvbGU9IlJvb3QiO2Zvcihjb25zdCByIG9mIHRoaXMubm9kZXMpciYmZShyLHQpO3JldHVybiB0fX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5PYmplY3RMb2FkZXI9dm9pZCAwLHIoMTM5KTt2YXIgbj1yKDE1MCksYT1yKDE1MSksaT1yKDE0OSkscz1yKDE0NCk7ZnVuY3Rpb24gbyhlLHQpe2lmKGUgaW5zdGFuY2VvZiBuLkRpY3QpZT1lLmdldFJhd1ZhbHVlcygpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGEuQmFzZVN0cmVhbSllPWUuZGljdC5nZXRSYXdWYWx1ZXMoKTtlbHNlIGlmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybjtmb3IoY29uc3QgaSBvZiBlKSgocj1pKWluc3RhbmNlb2Ygbi5SZWZ8fHIgaW5zdGFuY2VvZiBuLkRpY3R8fHIgaW5zdGFuY2VvZiBhLkJhc2VTdHJlYW18fEFycmF5LmlzQXJyYXkocikpJiZ0LnB1c2goaSk7dmFyIHJ9dC5PYmplY3RMb2FkZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuZGljdD1lLHRoaXMua2V5cz10LHRoaXMueHJlZj1yLHRoaXMucmVmU2V0PW51bGx9YXN5bmMgbG9hZCgpe2lmKHRoaXMueHJlZi5zdHJlYW0uaXNEYXRhTG9hZGVkKXJldHVybjtjb25zdHtrZXlzOmUsZGljdDp0fT10aGlzO3RoaXMucmVmU2V0PW5ldyBuLlJlZlNldDtjb25zdCByPVtdO2Zvcihjb25zdCBuIG9mIGUpe2NvbnN0IGU9dC5nZXRSYXcobik7dm9pZCAwIT09ZSYmci5wdXNoKGUpfXJldHVybiB0aGlzLl93YWxrKHIpfWFzeW5jIF93YWxrKGUpe2NvbnN0IHQ9W10scj1bXTtmb3IoO2UubGVuZ3RoOyl7bGV0IGM9ZS5wb3AoKTtpZihjIGluc3RhbmNlb2Ygbi5SZWYpe2lmKHRoaXMucmVmU2V0LmhhcyhjKSljb250aW51ZTt0cnl7dGhpcy5yZWZTZXQucHV0KGMpLGM9dGhpcy54cmVmLmZldGNoKGMpfWNhdGNoKGUpe2lmKCEoZSBpbnN0YW5jZW9mIGkuTWlzc2luZ0RhdGFFeGNlcHRpb24pKXsoMCxzLndhcm4pKCdPYmplY3RMb2FkZXIuX3dhbGsgLSByZXF1ZXN0aW5nIGFsbCBkYXRhOiAiJy5jb25jYXQoZSwnIi4nKSksdGhpcy5yZWZTZXQ9bnVsbDtjb25zdHttYW5hZ2VyOnR9PXRoaXMueHJlZi5zdHJlYW07cmV0dXJuIHQucmVxdWVzdEFsbENodW5rcygpfXQucHVzaChjKSxyLnB1c2goe2JlZ2luOmUuYmVnaW4sZW5kOmUuZW5kfSl9fWlmKGMgaW5zdGFuY2VvZiBhLkJhc2VTdHJlYW0pe2NvbnN0IGU9Yy5nZXRCYXNlU3RyZWFtcygpO2lmKGUpe2xldCBuPSExO2Zvcihjb25zdCB0IG9mIGUpdC5pc0RhdGFMb2FkZWR8fChuPSEwLHIucHVzaCh7YmVnaW46dC5zdGFydCxlbmQ6dC5lbmR9KSk7biYmdC5wdXNoKGMpfX1vKGMsZSl9aWYoci5sZW5ndGgpe2F3YWl0IHRoaXMueHJlZi5zdHJlYW0ubWFuYWdlci5yZXF1ZXN0UmFuZ2VzKHIpO2Zvcihjb25zdCBlIG9mIHQpZSBpbnN0YW5jZW9mIG4uUmVmJiZ0aGlzLnJlZlNldC5yZW1vdmUoZSk7cmV0dXJuIHRoaXMuX3dhbGsodCl9dGhpcy5yZWZTZXQ9bnVsbH19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuWEZBRmFjdG9yeT12b2lkIDAscigxMzkpO3ZhciBuPXIoMjI4KSxhPXIoMjI5KSxpPXIoMjQyKSxzPXIoMjM4KSxvPXIoMjM3KSxjPXIoMTQ0KSxsPXIoMjQzKSxoPXIoMjUzKTtjbGFzcyB1e2NvbnN0cnVjdG9yKGUpe3RyeXt0aGlzLnJvb3Q9KG5ldyBsLlhGQVBhcnNlcikucGFyc2UodS5fY3JlYXRlRG9jdW1lbnQoZSkpO2NvbnN0IHQ9bmV3IGEuQmluZGVyKHRoaXMucm9vdCk7dGhpcy5mb3JtPXQuYmluZCgpLHRoaXMuZGF0YUhhbmRsZXI9bmV3IGkuRGF0YUhhbmRsZXIodGhpcy5yb290LHQuZ2V0RGF0YSgpKSx0aGlzLmZvcm1bbi4kZ2xvYmFsRGF0YV0udGVtcGxhdGU9dGhpcy5mb3JtfWNhdGNoKGUpeygwLGMud2FybikoIlhGQSAtIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBwYXJzaW5nIGFuZCBiaW5kaW5nOiAiLmNvbmNhdChlKSl9fWlzVmFsaWQoKXtyZXR1cm4gdGhpcy5yb290JiZ0aGlzLmZvcm19X2NyZWF0ZVBhZ2VzSGVscGVyKCl7Y29uc3QgZT10aGlzLmZvcm1bbi4kdG9QYWdlc10oKTtyZXR1cm4gbmV3IFByb21pc2UoKCh0LHIpPT57Y29uc3Qgbj0oKT0+e3RyeXtjb25zdCByPWUubmV4dCgpO3IuZG9uZT90KHIudmFsdWUpOnNldFRpbWVvdXQobiwwKX1jYXRjaChlKXtyKGUpfX07c2V0VGltZW91dChuLDApfSkpfWFzeW5jIF9jcmVhdGVQYWdlcygpe3RyeXt0aGlzLnBhZ2VzPWF3YWl0IHRoaXMuX2NyZWF0ZVBhZ2VzSGVscGVyKCksdGhpcy5kaW1zPXRoaXMucGFnZXMuY2hpbGRyZW4ubWFwKChlPT57Y29uc3R7d2lkdGg6dCxoZWlnaHQ6cn09ZS5hdHRyaWJ1dGVzLnN0eWxlO3JldHVyblswLDAscGFyc2VJbnQodCkscGFyc2VJbnQocildfSkpfWNhdGNoKGUpeygwLGMud2FybikoIlhGQSAtIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBsYXlvdXQ6ICIuY29uY2F0KGUpKX19Z2V0Qm91bmRpbmdCb3goZSl7cmV0dXJuIHRoaXMuZGltc1tlXX1hc3luYyBnZXROdW1QYWdlcygpe3JldHVybiB0aGlzLnBhZ2VzfHxhd2FpdCB0aGlzLl9jcmVhdGVQYWdlcygpLHRoaXMuZGltcy5sZW5ndGh9c2V0SW1hZ2VzKGUpe3RoaXMuZm9ybVtuLiRnbG9iYWxEYXRhXS5pbWFnZXM9ZX1zZXRGb250cyhlKXt0aGlzLmZvcm1bbi4kZ2xvYmFsRGF0YV0uZm9udEZpbmRlcj1uZXcgcy5Gb250RmluZGVyKGUpO2NvbnN0IHQ9W107Zm9yKGxldCBlIG9mIHRoaXMuZm9ybVtuLiRnbG9iYWxEYXRhXS51c2VkVHlwZWZhY2VzKWU9KDAsby5zdHJpcFF1b3RlcykoZSksdGhpcy5mb3JtW24uJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIuZmluZChlKXx8dC5wdXNoKGUpO3JldHVybiB0Lmxlbmd0aD4wP3Q6bnVsbH1hcHBlbmRGb250cyhlLHQpe3RoaXMuZm9ybVtuLiRnbG9iYWxEYXRhXS5mb250RmluZGVyLmFkZChlLHQpfWFzeW5jIGdldFBhZ2VzKCl7dGhpcy5wYWdlc3x8YXdhaXQgdGhpcy5fY3JlYXRlUGFnZXMoKTtjb25zdCBlPXRoaXMucGFnZXM7cmV0dXJuIHRoaXMucGFnZXM9bnVsbCxlfXNlcmlhbGl6ZURhdGEoZSl7cmV0dXJuIHRoaXMuZGF0YUhhbmRsZXIuc2VyaWFsaXplKGUpfXN0YXRpYyBfY3JlYXRlRG9jdW1lbnQoZSl7cmV0dXJuIGVbIi94ZHA6eGRwIl0/T2JqZWN0LnZhbHVlcyhlKS5qb2luKCIiKTplWyJ4ZHA6eGRwIl19c3RhdGljIGdldFJpY2hUZXh0QXNIdG1sKGUpe2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dHJ5e2xldCB0PW5ldyBsLlhGQVBhcnNlcihoLlhodG1sTmFtZXNwYWNlLCEwKS5wYXJzZShlKTtpZighWyJib2R5IiwieGh0bWwiXS5pbmNsdWRlcyh0W24uJG5vZGVOYW1lXSkpe2NvbnN0IGU9aC5YaHRtbE5hbWVzcGFjZS5ib2R5KHt9KTtlW24uJGFwcGVuZENoaWxkXSh0KSx0PWV9Y29uc3Qgcj10W24uJHRvSFRNTF0oKTtpZighci5zdWNjZXNzKXJldHVybiBudWxsO2NvbnN0e2h0bWw6YX09cix7YXR0cmlidXRlczppfT1hO3JldHVybiBpJiYoaS5jbGFzcyYmKGkuY2xhc3M9aS5jbGFzcy5maWx0ZXIoKGU9PiFlLnN0YXJ0c1dpdGgoInhmYSIpKSkpLGkuZGlyPSJhdXRvIikse2h0bWw6YSxzdHI6dFtuLiR0ZXh0XSgpfX1jYXRjaChlKXsoMCxjLndhcm4pKCJYRkEgLSBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcGFyc2luZyBvZiByaWNoIHRleHQ6ICIuY29uY2F0KGUpKX1yZXR1cm4gbnVsbH19dC5YRkFGYWN0b3J5PXV9LChlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuJHVpZD10LiR0b1N0eWxlPXQuJHRvU3RyaW5nPXQuJHRvUGFnZXM9dC4kdG9IVE1MPXQuJHRleHQ9dC4kdGFiSW5kZXg9dC4kc2V0VmFsdWU9dC4kc2V0U2V0QXR0cmlidXRlcz10LiRzZXRJZD10LiRzZWFyY2hOb2RlPXQuJHJvb3Q9dC4kcmVzb2x2ZVByb3RvdHlwZXM9dC4kcmVtb3ZlQ2hpbGQ9dC4kcHVzaFBhcmE9dC4kcHVzaEdseXBocz10LiRwb3BQYXJhPXQuJG9uVGV4dD10LiRvbkNoaWxkQ2hlY2s9dC4kb25DaGlsZD10LiRuc0F0dHJpYnV0ZXM9dC4kbm9kZU5hbWU9dC4kbmFtZXNwYWNlSWQ9dC4kbGFzdEF0dHJpYnV0ZT10LiRpc1VzYWJsZT10LiRpc1RyYW5zcGFyZW50PXQuJGlzVGhlcmVNb3JlV2lkdGg9dC4kaXNTcGxpdHRhYmxlPXQuJGlzTnNBZ25vc3RpYz10LiRpc0Rlc2NlbmRlbnQ9dC4kaXNEYXRhVmFsdWU9dC4kaXNDREFUQVhtbD10LiRpc0JpbmRhYmxlPXQuJGluc2VydEF0PXQuJGluZGV4T2Y9dC4kaWRzPXQuJGhhc1NldHRhYmxlVmFsdWU9dC4kZ2xvYmFsRGF0YT10LiRnZXRUZW1wbGF0ZVJvb3Q9dC4kZ2V0U3ViZm9ybVBhcmVudD10LiRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdD10LiRnZXRQYXJlbnQ9dC4kZ2V0TmV4dFBhZ2U9dC4kZ2V0RXh0cmE9dC4kZ2V0RGF0YVZhbHVlPXQuJGdldENvbnRhaW5lZENoaWxkcmVuPXQuJGdldENoaWxkcmVuQnlOYW1lSXQ9dC4kZ2V0Q2hpbGRyZW5CeU5hbWU9dC4kZ2V0Q2hpbGRyZW5CeUNsYXNzPXQuJGdldENoaWxkcmVuPXQuJGdldEF2YWlsYWJsZVNwYWNlPXQuJGdldEF0dHJpYnV0ZXM9dC4kZ2V0QXR0cmlidXRlSXQ9dC4kZmx1c2hIVE1MPXQuJGZpbmFsaXplPXQuJGV4dHJhPXQuJGR1bXA9dC4kZGF0YT10LiRjb250ZW50PXQuJGNvbnN1bWVkPXQuJGNsb25lPXQuJGNsZWFudXA9dC4kY2xlYW5QYWdlPXQuJGNsZWFuPXQuJGNoaWxkcmVuVG9IVE1MPXQuJGFwcGVuZENoaWxkPXQuJGFkZEhUTUw9dC4kYWNjZXB0V2hpdGVzcGFjZT12b2lkIDA7Y29uc3Qgcj1TeW1ib2woKTt0LiRhY2NlcHRXaGl0ZXNwYWNlPXI7Y29uc3Qgbj1TeW1ib2woKTt0LiRhZGRIVE1MPW47Y29uc3QgYT1TeW1ib2woKTt0LiRhcHBlbmRDaGlsZD1hO2NvbnN0IGk9U3ltYm9sKCk7dC4kY2hpbGRyZW5Ub0hUTUw9aTtjb25zdCBzPVN5bWJvbCgpO3QuJGNsZWFuPXM7Y29uc3Qgbz1TeW1ib2woKTt0LiRjbGVhblBhZ2U9bztjb25zdCBjPVN5bWJvbCgpO3QuJGNsZWFudXA9Yztjb25zdCBsPVN5bWJvbCgpO3QuJGNsb25lPWw7Y29uc3QgaD1TeW1ib2woKTt0LiRjb25zdW1lZD1oO2NvbnN0IHU9U3ltYm9sKCJjb250ZW50Iik7dC4kY29udGVudD11O2NvbnN0IGQ9U3ltYm9sKCJkYXRhIik7dC4kZGF0YT1kO2NvbnN0IGY9U3ltYm9sKCk7dC4kZHVtcD1mO2NvbnN0IGc9U3ltYm9sKCJleHRyYSIpO3QuJGV4dHJhPWc7Y29uc3QgcD1TeW1ib2woKTt0LiRmaW5hbGl6ZT1wO2NvbnN0IG09U3ltYm9sKCk7dC4kZmx1c2hIVE1MPW07Y29uc3QgYj1TeW1ib2woKTt0LiRnZXRBdHRyaWJ1dGVJdD1iO2NvbnN0IHk9U3ltYm9sKCk7dC4kZ2V0QXR0cmlidXRlcz15O2NvbnN0IHc9U3ltYm9sKCk7dC4kZ2V0QXZhaWxhYmxlU3BhY2U9dztjb25zdCB2PVN5bWJvbCgpO3QuJGdldENoaWxkcmVuQnlDbGFzcz12O2NvbnN0IHg9U3ltYm9sKCk7dC4kZ2V0Q2hpbGRyZW5CeU5hbWU9eDtjb25zdCBTPVN5bWJvbCgpO3QuJGdldENoaWxkcmVuQnlOYW1lSXQ9Uztjb25zdCBBPVN5bWJvbCgpO3QuJGdldERhdGFWYWx1ZT1BO2NvbnN0IGs9U3ltYm9sKCk7dC4kZ2V0RXh0cmE9aztjb25zdCBDPVN5bWJvbCgpO3QuJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0PUM7Y29uc3QgTz1TeW1ib2woKTt0LiRnZXRDaGlsZHJlbj1PO2NvbnN0IEY9U3ltYm9sKCk7dC4kZ2V0Q29udGFpbmVkQ2hpbGRyZW49Rjtjb25zdCBJPVN5bWJvbCgpO3QuJGdldE5leHRQYWdlPUk7Y29uc3QgVD1TeW1ib2woKTt0LiRnZXRTdWJmb3JtUGFyZW50PVQ7Y29uc3QgTT1TeW1ib2woKTt0LiRnZXRQYXJlbnQ9TTtjb25zdCBFPVN5bWJvbCgpO3QuJGdldFRlbXBsYXRlUm9vdD1FO2NvbnN0IFA9U3ltYm9sKCk7dC4kZ2xvYmFsRGF0YT1QO2NvbnN0IFI9U3ltYm9sKCk7dC4kaGFzU2V0dGFibGVWYWx1ZT1SO2NvbnN0IE49U3ltYm9sKCk7dC4kaWRzPU47Y29uc3QgRD1TeW1ib2woKTt0LiRpbmRleE9mPUQ7Y29uc3QgQj1TeW1ib2woKTt0LiRpbnNlcnRBdD1CO2NvbnN0IEw9U3ltYm9sKCk7dC4kaXNDREFUQVhtbD1MO2NvbnN0IF89U3ltYm9sKCk7dC4kaXNCaW5kYWJsZT1fO2NvbnN0IGo9U3ltYm9sKCk7dC4kaXNEYXRhVmFsdWU9ajtjb25zdCBVPVN5bWJvbCgpO3QuJGlzRGVzY2VuZGVudD1VO2NvbnN0ICQ9U3ltYm9sKCk7dC4kaXNOc0Fnbm9zdGljPSQ7Y29uc3QgWD1TeW1ib2woKTt0LiRpc1NwbGl0dGFibGU9WDtjb25zdCBIPVN5bWJvbCgpO3QuJGlzVGhlcmVNb3JlV2lkdGg9SDtjb25zdCBxPVN5bWJvbCgpO3QuJGlzVHJhbnNwYXJlbnQ9cTtjb25zdCB6PVN5bWJvbCgpO3QuJGlzVXNhYmxlPXo7Y29uc3QgRz1TeW1ib2woKTt0LiRsYXN0QXR0cmlidXRlPUc7Y29uc3QgVz1TeW1ib2woIm5hbWVzcGFjZUlkIik7dC4kbmFtZXNwYWNlSWQ9Vztjb25zdCBWPVN5bWJvbCgibm9kZU5hbWUiKTt0LiRub2RlTmFtZT1WO2NvbnN0IEs9U3ltYm9sKCk7dC4kbnNBdHRyaWJ1dGVzPUs7Y29uc3QgWT1TeW1ib2woKTt0LiRvbkNoaWxkPVk7Y29uc3QgSj1TeW1ib2woKTt0LiRvbkNoaWxkQ2hlY2s9Sjtjb25zdCBaPVN5bWJvbCgpO3QuJG9uVGV4dD1aO2NvbnN0IFE9U3ltYm9sKCk7dC4kcHVzaEdseXBocz1RO2NvbnN0IGVlPVN5bWJvbCgpO3QuJHBvcFBhcmE9ZWU7Y29uc3QgdGU9U3ltYm9sKCk7dC4kcHVzaFBhcmE9dGU7Y29uc3QgcmU9U3ltYm9sKCk7dC4kcmVtb3ZlQ2hpbGQ9cmU7Y29uc3QgbmU9U3ltYm9sKCJyb290Iik7dC4kcm9vdD1uZTtjb25zdCBhZT1TeW1ib2woKTt0LiRyZXNvbHZlUHJvdG90eXBlcz1hZTtjb25zdCBpZT1TeW1ib2woKTt0LiRzZWFyY2hOb2RlPWllO2NvbnN0IHNlPVN5bWJvbCgpO3QuJHNldElkPXNlO2NvbnN0IG9lPVN5bWJvbCgpO3QuJHNldFNldEF0dHJpYnV0ZXM9b2U7Y29uc3QgY2U9U3ltYm9sKCk7dC4kc2V0VmFsdWU9Y2U7Y29uc3QgbGU9U3ltYm9sKCk7dC4kdGFiSW5kZXg9bGU7Y29uc3QgaGU9U3ltYm9sKCk7dC4kdGV4dD1oZTtjb25zdCB1ZT1TeW1ib2woKTt0LiR0b1BhZ2VzPXVlO2NvbnN0IGRlPVN5bWJvbCgpO3QuJHRvSFRNTD1kZTtjb25zdCBmZT1TeW1ib2woKTt0LiR0b1N0cmluZz1mZTtjb25zdCBnZT1TeW1ib2woKTt0LiR0b1N0eWxlPWdlO2NvbnN0IHBlPVN5bWJvbCgidWlkIik7dC4kdWlkPXBlfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQmluZGVyPXZvaWQgMCxyKDEzOSk7dmFyIG49cigyMjgpLGE9cigyMzApLGk9cigyNDEpLHM9cigyNDApLG89cigyMzQpLGM9cigxNDQpO2NvbnN0IGw9by5OYW1lc3BhY2VJZHMuZGF0YXNldHMuaWQ7ZnVuY3Rpb24gaChlKXtjb25zdCB0PW5ldyBhLlRleHQoe30pO3JldHVybiB0W24uJGNvbnRlbnRdPWUsdH10LkJpbmRlcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt2YXIgdDt0aGlzLnJvb3Q9ZSx0aGlzLmRhdGFzZXRzPWUuZGF0YXNldHMsdGhpcy5kYXRhPShudWxsPT09KHQ9ZS5kYXRhc2V0cyl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuZGF0YSl8fG5ldyBzLlhtbE9iamVjdChvLk5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZCwiZGF0YSIpLHRoaXMuZW1wdHlNZXJnZT0wPT09dGhpcy5kYXRhW24uJGdldENoaWxkcmVuXSgpLmxlbmd0aCx0aGlzLnJvb3QuZm9ybT10aGlzLmZvcm09ZS50ZW1wbGF0ZVtuLiRjbG9uZV0oKX1faXNDb25zdW1lRGF0YSgpe3JldHVybiF0aGlzLmVtcHR5TWVyZ2UmJnRoaXMuX21lcmdlTW9kZX1faXNNYXRjaFRlbXBsYXRlKCl7cmV0dXJuIXRoaXMuX2lzQ29uc3VtZURhdGEoKX1iaW5kKCl7cmV0dXJuIHRoaXMuX2JpbmRFbGVtZW50KHRoaXMuZm9ybSx0aGlzLmRhdGEpLHRoaXMuZm9ybX1nZXREYXRhKCl7cmV0dXJuIHRoaXMuZGF0YX1fYmluZFZhbHVlKGUsdCxyKXt2YXIgaTtpZihlW24uJGRhdGFdPXQsZVtuLiRoYXNTZXR0YWJsZVZhbHVlXSgpKWlmKHRbbi4kaXNEYXRhVmFsdWVdKCkpe2NvbnN0IHI9dFtuLiRnZXREYXRhVmFsdWVdKCk7ZVtuLiRzZXRWYWx1ZV0oaChyKSl9ZWxzZSBpZihlIGluc3RhbmNlb2YgYS5GaWVsZCYmIm11bHRpU2VsZWN0Ij09PShudWxsPT09KGk9ZS51aSl8fHZvaWQgMD09PWl8fG51bGw9PT0oaT1pLmNob2ljZUxpc3QpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLm9wZW4pKXtjb25zdCByPXRbbi4kZ2V0Q2hpbGRyZW5dKCkubWFwKChlPT5lW24uJGNvbnRlbnRdLnRyaW0oKSkpLmpvaW4oIlxuIik7ZVtuLiRzZXRWYWx1ZV0oaChyKSl9ZWxzZSB0aGlzLl9pc0NvbnN1bWVEYXRhKCkmJigwLGMud2FybikoIlhGQSAtIE5vZGVzIGhhdmVuJ3QgdGhlIHNhbWUgdHlwZS4iKTtlbHNlIXRbbi4kaXNEYXRhVmFsdWVdKCl8fHRoaXMuX2lzTWF0Y2hUZW1wbGF0ZSgpP3RoaXMuX2JpbmRFbGVtZW50KGUsdCk6KDAsYy53YXJuKSgiWEZBIC0gTm9kZXMgaGF2ZW4ndCB0aGUgc2FtZSB0eXBlLiIpfV9maW5kRGF0YUJ5TmFtZVRvQ29uc3VtZShlLHQscixhKXt2YXIgaTtpZighZSlyZXR1cm4gbnVsbDtsZXQgcyxjO2ZvcihsZXQgYT0wO2E8MzthKyspe2ZvcihzPXJbbi4kZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXRdKGUsITEsITApO2M9cy5uZXh0KCkudmFsdWUsYzspaWYodD09PWNbbi4kaXNEYXRhVmFsdWVdKCkpcmV0dXJuIGM7aWYocltuLiRuYW1lc3BhY2VJZF09PT1vLk5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZCYmImRhdGEiPT09cltuLiRub2RlTmFtZV0pYnJlYWs7cj1yW24uJGdldFBhcmVudF0oKX1yZXR1cm4gYT8ocz10aGlzLmRhdGFbbi4kZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXRdKGUsITAsITEpLGM9cy5uZXh0KCkudmFsdWUsY3x8KHM9dGhpcy5kYXRhW24uJGdldEF0dHJpYnV0ZUl0XShlLCEwKSxjPXMubmV4dCgpLnZhbHVlLG51bGwhPT0oaT1jKSYmdm9pZCAwIT09aSYmaVtuLiRpc0RhdGFWYWx1ZV0oKT9jOm51bGwpKTpudWxsfV9zZXRQcm9wZXJ0aWVzKGUsdCl7aWYoZS5oYXNPd25Qcm9wZXJ0eSgic2V0UHJvcGVydHkiKSlmb3IoY29uc3R7cmVmOnIsdGFyZ2V0Om8sY29ubmVjdGlvbjpsfW9mIGUuc2V0UHJvcGVydHkuY2hpbGRyZW4pe2lmKGwpY29udGludWU7aWYoIXIpY29udGludWU7Y29uc3QgaD0oMCxpLnNlYXJjaE5vZGUpKHRoaXMucm9vdCx0LHIsITEsITEpO2lmKCFoKXsoMCxjLndhcm4pKCJYRkEgLSBJbnZhbGlkIHJlZmVyZW5jZTogIi5jb25jYXQociwiLiIpKTtjb250aW51ZX1jb25zdFt1XT1oO2lmKCF1W24uJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhKSl7KDAsYy53YXJuKSgiWEZBIC0gSW52YWxpZCBub2RlOiBtdXN0IGJlIGEgZGF0YSBub2RlLiIpO2NvbnRpbnVlfWNvbnN0IGQ9KDAsaS5zZWFyY2hOb2RlKSh0aGlzLnJvb3QsZSxvLCExLCExKTtpZighZCl7KDAsYy53YXJuKSgiWEZBIC0gSW52YWxpZCB0YXJnZXQ6ICIuY29uY2F0KG8sIi4iKSk7Y29udGludWV9Y29uc3RbZl09ZDtpZighZltuLiRpc0Rlc2NlbmRlbnRdKGUpKXsoMCxjLndhcm4pKCJYRkEgLSBJbnZhbGlkIHRhcmdldDogbXVzdCBiZSBhIHByb3BlcnR5IG9yIHN1YnByb3BlcnR5LiIpO2NvbnRpbnVlfWNvbnN0IGc9ZltuLiRnZXRQYXJlbnRdKCk7aWYoZiBpbnN0YW5jZW9mIGEuU2V0UHJvcGVydHl8fGcgaW5zdGFuY2VvZiBhLlNldFByb3BlcnR5KXsoMCxjLndhcm4pKCJYRkEgLSBJbnZhbGlkIHRhcmdldDogY2Fubm90IGJlIGEgc2V0UHJvcGVydHkgb3Igb25lIG9mIGl0cyBwcm9wZXJ0aWVzLiIpO2NvbnRpbnVlfWlmKGYgaW5zdGFuY2VvZiBhLkJpbmRJdGVtc3x8ZyBpbnN0YW5jZW9mIGEuQmluZEl0ZW1zKXsoMCxjLndhcm4pKCJYRkEgLSBJbnZhbGlkIHRhcmdldDogY2Fubm90IGJlIGEgYmluZEl0ZW1zIG9yIG9uZSBvZiBpdHMgcHJvcGVydGllcy4iKTtjb250aW51ZX1jb25zdCBwPXVbbi4kdGV4dF0oKSxtPWZbbi4kbm9kZU5hbWVdO2lmKGYgaW5zdGFuY2VvZiBzLlhGQUF0dHJpYnV0ZSl7Y29uc3QgZT1PYmplY3QuY3JlYXRlKG51bGwpO2VbbV09cDtjb25zdCB0PVJlZmxlY3QuY29uc3RydWN0KE9iamVjdC5nZXRQcm90b3R5cGVPZihnKS5jb25zdHJ1Y3RvcixbZV0pO2dbbV09dFttXX1lbHNlIGYuaGFzT3duUHJvcGVydHkobi4kY29udGVudCk/KGZbbi4kZGF0YV09dSxmW24uJGNvbnRlbnRdPXAsZltuLiRmaW5hbGl6ZV0oKSk6KDAsYy53YXJuKSgiWEZBIC0gSW52YWxpZCBub2RlIHRvIHVzZSBpbiBzZXRQcm9wZXJ0eSIpfX1fYmluZEl0ZW1zKGUsdCl7aWYoIWUuaGFzT3duUHJvcGVydHkoIml0ZW1zIil8fCFlLmhhc093blByb3BlcnR5KCJiaW5kSXRlbXMiKXx8ZS5iaW5kSXRlbXMuaXNFbXB0eSgpKXJldHVybjtmb3IoY29uc3QgdCBvZiBlLml0ZW1zLmNoaWxkcmVuKWVbbi4kcmVtb3ZlQ2hpbGRdKHQpO2UuaXRlbXMuY2xlYXIoKTtjb25zdCByPW5ldyBhLkl0ZW1zKHt9KSxzPW5ldyBhLkl0ZW1zKHt9KTtlW24uJGFwcGVuZENoaWxkXShyKSxlLml0ZW1zLnB1c2gociksZVtuLiRhcHBlbmRDaGlsZF0ocyksZS5pdGVtcy5wdXNoKHMpO2Zvcihjb25zdHtyZWY6YSxsYWJlbFJlZjpvLHZhbHVlUmVmOmwsY29ubmVjdGlvbjp1fW9mIGUuYmluZEl0ZW1zLmNoaWxkcmVuKXtpZih1KWNvbnRpbnVlO2lmKCFhKWNvbnRpbnVlO2NvbnN0IGU9KDAsaS5zZWFyY2hOb2RlKSh0aGlzLnJvb3QsdCxhLCExLCExKTtpZihlKWZvcihjb25zdCB0IG9mIGUpe2lmKCF0W24uJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhc2V0cykpeygwLGMud2FybikoIlhGQSAtIEludmFsaWQgcmVmICgiLmNvbmNhdChhLCIpOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuIikpO2NvbnRpbnVlfWNvbnN0IGU9KDAsaS5zZWFyY2hOb2RlKSh0aGlzLnJvb3QsdCxvLCEwLCExKTtpZighZSl7KDAsYy53YXJuKSgiWEZBIC0gSW52YWxpZCBsYWJlbDogIi5jb25jYXQobywiLiIpKTtjb250aW51ZX1jb25zdFt1XT1lO2lmKCF1W24uJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhc2V0cykpeygwLGMud2FybikoIlhGQSAtIEludmFsaWQgbGFiZWw6IG11c3QgYmUgYSBkYXRhc2V0cyBjaGlsZC4iKTtjb250aW51ZX1jb25zdCBkPSgwLGkuc2VhcmNoTm9kZSkodGhpcy5yb290LHQsbCwhMCwhMSk7aWYoIWQpeygwLGMud2FybikoIlhGQSAtIEludmFsaWQgdmFsdWU6ICIuY29uY2F0KGwsIi4iKSk7Y29udGludWV9Y29uc3RbZl09ZDtpZighZltuLiRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YXNldHMpKXsoMCxjLndhcm4pKCJYRkEgLSBJbnZhbGlkIHZhbHVlOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuIik7Y29udGludWV9Y29uc3QgZz1oKHVbbi4kdGV4dF0oKSkscD1oKGZbbi4kdGV4dF0oKSk7cltuLiRhcHBlbmRDaGlsZF0oZyksci50ZXh0LnB1c2goZyksc1tuLiRhcHBlbmRDaGlsZF0ocCkscy50ZXh0LnB1c2gocCl9ZWxzZSgwLGMud2FybikoIlhGQSAtIEludmFsaWQgcmVmZXJlbmNlOiAiLmNvbmNhdChhLCIuIikpfX1fYmluZE9jY3VycmVuY2VzKGUsdCxyKXtsZXQgYTtpZih0Lmxlbmd0aD4xJiYoYT1lW24uJGNsb25lXSgpLGFbbi4kcmVtb3ZlQ2hpbGRdKGEub2NjdXIpLGEub2NjdXI9bnVsbCksdGhpcy5fYmluZFZhbHVlKGUsdFswXSxyKSx0aGlzLl9zZXRQcm9wZXJ0aWVzKGUsdFswXSksdGhpcy5fYmluZEl0ZW1zKGUsdFswXSksMT09PXQubGVuZ3RoKXJldHVybjtjb25zdCBpPWVbbi4kZ2V0UGFyZW50XSgpLHM9ZVtuLiRub2RlTmFtZV0sbz1pW24uJGluZGV4T2ZdKGUpO2ZvcihsZXQgZT0xLGM9dC5sZW5ndGg7ZTxjO2UrKyl7Y29uc3QgYz10W2VdLGw9YVtuLiRjbG9uZV0oKTtpW3NdLnB1c2gobCksaVtuLiRpbnNlcnRBdF0obytlLGwpLHRoaXMuX2JpbmRWYWx1ZShsLGMsciksdGhpcy5fc2V0UHJvcGVydGllcyhsLGMpLHRoaXMuX2JpbmRJdGVtcyhsLGMpfX1fY3JlYXRlT2NjdXJyZW5jZXMoZSl7aWYoIXRoaXMuZW1wdHlNZXJnZSlyZXR1cm47Y29uc3R7b2NjdXI6dH09ZTtpZighdHx8dC5pbml0aWFsPD0xKXJldHVybjtjb25zdCByPWVbbi4kZ2V0UGFyZW50XSgpLGE9ZVtuLiRub2RlTmFtZV07aWYoIShyW2FdaW5zdGFuY2VvZiBzLlhGQU9iamVjdEFycmF5KSlyZXR1cm47bGV0IGk7aT1lLm5hbWU/clthXS5jaGlsZHJlbi5maWx0ZXIoKHQ9PnQubmFtZT09PWUubmFtZSkpLmxlbmd0aDpyW2FdLmNoaWxkcmVuLmxlbmd0aDtjb25zdCBvPXJbbi4kaW5kZXhPZl0oZSkrMSxjPXQuaW5pdGlhbC1pO2lmKGMpe2NvbnN0IHQ9ZVtuLiRjbG9uZV0oKTt0W24uJHJlbW92ZUNoaWxkXSh0Lm9jY3VyKSx0Lm9jY3VyPW51bGwsclthXS5wdXNoKHQpLHJbbi4kaW5zZXJ0QXRdKG8sdCk7Zm9yKGxldCBlPTE7ZTxjO2UrKyl7Y29uc3QgaT10W24uJGNsb25lXSgpO3JbYV0ucHVzaChpKSxyW24uJGluc2VydEF0XShvK2UsaSl9fX1fZ2V0T2NjdXJJbmZvKGUpe2NvbnN0e25hbWU6dCxvY2N1cjpyfT1lO2lmKCFyfHwhdClyZXR1cm5bMSwxXTtjb25zdCBuPS0xPT09ci5tYXg/MS8wOnIubWF4O3JldHVybltyLm1pbixuXX1fc2V0QW5kQmluZChlLHQpe3RoaXMuX3NldFByb3BlcnRpZXMoZSx0KSx0aGlzLl9iaW5kSXRlbXMoZSx0KSx0aGlzLl9iaW5kRWxlbWVudChlLHQpfV9iaW5kRWxlbWVudChlLHQpe2NvbnN0IHI9W107dGhpcy5fY3JlYXRlT2NjdXJyZW5jZXMoZSk7Zm9yKGNvbnN0IGEgb2YgZVtuLiRnZXRDaGlsZHJlbl0oKSl7aWYoYVtuLiRkYXRhXSljb250aW51ZTtpZih2b2lkIDA9PT10aGlzLl9tZXJnZU1vZGUmJiJzdWJmb3JtIj09PWFbbi4kbm9kZU5hbWVdKXt0aGlzLl9tZXJnZU1vZGU9ImNvbnN1bWVEYXRhIj09PWEubWVyZ2VNb2RlO2NvbnN0IGU9dFtuLiRnZXRDaGlsZHJlbl0oKTtpZihlLmxlbmd0aD4wKXRoaXMuX2JpbmRPY2N1cnJlbmNlcyhhLFtlWzBdXSxudWxsKTtlbHNlIGlmKHRoaXMuZW1wdHlNZXJnZSl7Y29uc3QgZT10W24uJG5hbWVzcGFjZUlkXT09PWw/LTE6dFtuLiRuYW1lc3BhY2VJZF0scj1hW24uJGRhdGFdPW5ldyBzLlhtbE9iamVjdChlLGEubmFtZXx8InJvb3QiKTt0W24uJGFwcGVuZENoaWxkXShyKSx0aGlzLl9iaW5kRWxlbWVudChhLHIpfWNvbnRpbnVlfWlmKCFhW24uJGlzQmluZGFibGVdKCkpY29udGludWU7bGV0IGU9ITEsbz1udWxsLGg9bnVsbCx1PW51bGw7aWYoYS5iaW5kKXtzd2l0Y2goYS5iaW5kLm1hdGNoKXtjYXNlIm5vbmUiOnRoaXMuX3NldEFuZEJpbmQoYSx0KTtjb250aW51ZTtjYXNlImdsb2JhbCI6ZT0hMDticmVhaztjYXNlImRhdGFSZWYiOmlmKCFhLmJpbmQucmVmKXsoMCxjLndhcm4pKCJYRkEgLSByZWYgaXMgZW1wdHkgaW4gbm9kZSAiLmNvbmNhdChhW24uJG5vZGVOYW1lXSwiLiIpKSx0aGlzLl9zZXRBbmRCaW5kKGEsdCk7Y29udGludWV9aD1hLmJpbmQucmVmfWEuYmluZC5waWN0dXJlJiYobz1hLmJpbmQucGljdHVyZVtuLiRjb250ZW50XSl9Y29uc3RbZCxmXT10aGlzLl9nZXRPY2N1ckluZm8oYSk7aWYoaCl7aWYodT0oMCxpLnNlYXJjaE5vZGUpKHRoaXMucm9vdCx0LGgsITAsITEpLG51bGw9PT11KXtpZih1PSgwLGkuY3JlYXRlRGF0YU5vZGUpKHRoaXMuZGF0YSx0LGgpLCF1KWNvbnRpbnVlO3RoaXMuX2lzQ29uc3VtZURhdGEoKSYmKHVbbi4kY29uc3VtZWRdPSEwKSx0aGlzLl9zZXRBbmRCaW5kKGEsdSk7Y29udGludWV9dGhpcy5faXNDb25zdW1lRGF0YSgpJiYodT11LmZpbHRlcigoZT0+IWVbbi4kY29uc3VtZWRdKSkpLHUubGVuZ3RoPmY/dT11LnNsaWNlKDAsZik6MD09PXUubGVuZ3RoJiYodT1udWxsKSx1JiZ0aGlzLl9pc0NvbnN1bWVEYXRhKCkmJnUuZm9yRWFjaCgoZT0+e2Vbbi4kY29uc3VtZWRdPSEwfSkpfWVsc2V7aWYoIWEubmFtZSl7dGhpcy5fc2V0QW5kQmluZChhLHQpO2NvbnRpbnVlfWlmKHRoaXMuX2lzQ29uc3VtZURhdGEoKSl7Y29uc3Qgcj1bXTtmb3IoO3IubGVuZ3RoPGY7KXtjb25zdCBpPXRoaXMuX2ZpbmREYXRhQnlOYW1lVG9Db25zdW1lKGEubmFtZSxhW24uJGhhc1NldHRhYmxlVmFsdWVdKCksdCxlKTtpZighaSlicmVhaztpW24uJGNvbnN1bWVkXT0hMCxyLnB1c2goaSl9dT1yLmxlbmd0aD4wP3I6bnVsbH1lbHNle2lmKHU9dFtuLiRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0oYS5uYW1lLCExLHRoaXMuZW1wdHlNZXJnZSkubmV4dCgpLnZhbHVlLCF1KXtpZigwPT09ZCl7ci5wdXNoKGEpO2NvbnRpbnVlfWNvbnN0IGU9dFtuLiRuYW1lc3BhY2VJZF09PT1sPy0xOnRbbi4kbmFtZXNwYWNlSWRdO3U9YVtuLiRkYXRhXT1uZXcgcy5YbWxPYmplY3QoZSxhLm5hbWUpLHRoaXMuZW1wdHlNZXJnZSYmKHVbbi4kY29uc3VtZWRdPSEwKSx0W24uJGFwcGVuZENoaWxkXSh1KSx0aGlzLl9zZXRBbmRCaW5kKGEsdSk7Y29udGludWV9dGhpcy5lbXB0eU1lcmdlJiYodVtuLiRjb25zdW1lZF09ITApLHU9W3VdfX11P3RoaXMuX2JpbmRPY2N1cnJlbmNlcyhhLHUsbyk6ZD4wP3RoaXMuX3NldEFuZEJpbmQoYSx0KTpyLnB1c2goYSl9ci5mb3JFYWNoKChlPT5lW24uJGdldFBhcmVudF0oKVtuLiRyZW1vdmVDaGlsZF0oZSkpKX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuVmFsdWU9dC5UZXh0PXQuVGVtcGxhdGVOYW1lc3BhY2U9dC5UZW1wbGF0ZT10LlNldFByb3BlcnR5PXQuSXRlbXM9dC5GaWVsZD10LkJpbmRJdGVtcz12b2lkIDAscigxMTYpLHIoMTI2KSxyKDEyOCkscigxMzEpLHIoMTMzKSxyKDEzNSkscigxMzcpLHIoMTM5KSxyKDIzMSkscigxNDUpLHIoMTQ3KSxyKDE0OCk7dmFyIG49cigyMjgpLGE9cigyMzQpLGk9cigyMzUpLHM9cigyMzYpLG89cigyNDApLGM9cigyMzcpLGw9cigxNDQpLGg9cigyMzgpLHU9cigxNDkpLGQ9cigyNDEpO2NvbnN0IGY9YS5OYW1lc3BhY2VJZHMudGVtcGxhdGUuaWQsZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHA9L15IKFxkKykkLyxtPW5ldyBTZXQoWyJpbWFnZS9naWYiLCJpbWFnZS9qcGVnIiwiaW1hZ2UvanBnIiwiaW1hZ2UvcGpwZWciLCJpbWFnZS9wbmciLCJpbWFnZS9hcG5nIiwiaW1hZ2UveC1wbmciLCJpbWFnZS9ibXAiLCJpbWFnZS94LW1zLWJtcCIsImltYWdlL3RpZmYiLCJpbWFnZS90aWYiLCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iXSksYj1bW1s2Niw3N10sImltYWdlL2JtcCJdLFtbMjU1LDIxNiwyNTVdLCJpbWFnZS9qcGVnIl0sW1s3Myw3Myw0MiwwXSwiaW1hZ2UvdGlmZiJdLFtbNzcsNzcsMCw0Ml0sImltYWdlL3RpZmYiXSxbWzcxLDczLDcwLDU2LDU3LDk3XSwiaW1hZ2UvZ2lmIl0sW1sxMzcsODAsNzgsNzEsMTMsMTAsMjYsMTBdLCJpbWFnZS9wbmciXV07ZnVuY3Rpb24geShlKXtpZighZXx8IWUuYm9yZGVyKXJldHVybnt3OjAsaDowfTtjb25zdCB0PWUuYm9yZGVyW24uJGdldEV4dHJhXSgpO3JldHVybiB0P3t3OnQud2lkdGhzWzBdK3Qud2lkdGhzWzJdK3QuaW5zZXRzWzBdK3QuaW5zZXRzWzJdLGg6dC53aWR0aHNbMV0rdC53aWR0aHNbM10rdC5pbnNldHNbMV0rdC5pbnNldHNbM119Ont3OjAsaDowfX1mdW5jdGlvbiB3KGUpe3JldHVybiBlLm1hcmdpbiYmKGUubWFyZ2luLnRvcEluc2V0fHxlLm1hcmdpbi5yaWdodEluc2V0fHxlLm1hcmdpbi5ib3R0b21JbnNldHx8ZS5tYXJnaW4ubGVmdEluc2V0KX1mdW5jdGlvbiB2KGUsdCl7aWYoIWUudmFsdWUpe2NvbnN0IHQ9bmV3IE50KHt9KTtlW24uJGFwcGVuZENoaWxkXSh0KSxlLnZhbHVlPXR9ZS52YWx1ZVtuLiRzZXRWYWx1ZV0odCl9ZnVuY3Rpb24qeChlKXtmb3IoY29uc3QgdCBvZiBlW24uJGdldENoaWxkcmVuXSgpKXQgaW5zdGFuY2VvZiB2dD95aWVsZCp0W24uJGdldENvbnRhaW5lZENoaWxkcmVuXSgpOnlpZWxkIHR9ZnVuY3Rpb24gUyhlKXt2YXIgdDtyZXR1cm4iZXJyb3IiPT09KG51bGw9PT0odD1lLnZhbGlkYXRlKXx8dm9pZCAwPT09dD92b2lkIDA6dC5udWxsVGVzdCl9ZnVuY3Rpb24gQShlKXtmb3IoO2U7KXtpZighZS50cmF2ZXJzYWwpcmV0dXJuIHZvaWQoZVtuLiR0YWJJbmRleF09ZVtuLiRnZXRQYXJlbnRdKClbbi4kdGFiSW5kZXhdKTtpZihlW24uJHRhYkluZGV4XSlyZXR1cm47bGV0IHQ9bnVsbDtmb3IoY29uc3QgciBvZiBlLnRyYXZlcnNhbFtuLiRnZXRDaGlsZHJlbl0oKSlpZigibmV4dCI9PT1yLm9wZXJhdGlvbil7dD1yO2JyZWFrfWlmKCF0fHwhdC5yZWYpcmV0dXJuIHZvaWQoZVtuLiR0YWJJbmRleF09ZVtuLiRnZXRQYXJlbnRdKClbbi4kdGFiSW5kZXhdKTtjb25zdCByPWVbbi4kZ2V0VGVtcGxhdGVSb290XSgpO2Vbbi4kdGFiSW5kZXhdPSsrcltuLiR0YWJJbmRleF07Y29uc3QgYT1yW24uJHNlYXJjaE5vZGVdKHQucmVmLGUpO2lmKCFhKXJldHVybjtlPWFbMF19fWZ1bmN0aW9uIGsoZSx0KXtjb25zdCByPWUuYXNzaXN0O2lmKHIpe2NvbnN0IGU9cltuLiR0b0hUTUxdKCk7ZSYmKHQudGl0bGU9ZSk7Y29uc3QgYT1yLnJvbGUubWF0Y2gocCk7aWYoYSl7Y29uc3QgZT0iaGVhZGluZyIscj1hWzFdO3Qucm9sZT1lLHRbImFyaWEtbGV2ZWwiXT1yfX1pZigidGFibGUiPT09ZS5sYXlvdXQpdC5yb2xlPSJ0YWJsZSI7ZWxzZSBpZigicm93Ij09PWUubGF5b3V0KXQucm9sZT0icm93IjtlbHNle3ZhciBhO2NvbnN0IHI9ZVtuLiRnZXRQYXJlbnRdKCk7InJvdyI9PT1yLmxheW91dCYmKHQucm9sZT0iVEgiPT09KG51bGw9PT0oYT1yLmFzc2lzdCl8fHZvaWQgMD09PWE/dm9pZCAwOmEucm9sZSk/ImNvbHVtbmhlYWRlciI6ImNlbGwiKX19ZnVuY3Rpb24gQyhlKXtpZighZS5hc3Npc3QpcmV0dXJuIG51bGw7Y29uc3QgdD1lLmFzc2lzdDtyZXR1cm4gdC5zcGVhayYmIiIhPT10LnNwZWFrW24uJGNvbnRlbnRdP3Quc3BlYWtbbi4kY29udGVudF06dC50b29sVGlwP3QudG9vbFRpcFtuLiRjb250ZW50XTpudWxsfWZ1bmN0aW9uIE8oZSl7cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsieGZhUmljaCJdLHN0eWxlOk9iamVjdC5jcmVhdGUobnVsbCl9LGNoaWxkcmVuOlt7bmFtZToic3BhbiIsYXR0cmlidXRlczp7c3R5bGU6T2JqZWN0LmNyZWF0ZShudWxsKX0sdmFsdWU6ZX1dfSl9ZnVuY3Rpb24gRihlKXtjb25zdCB0PWVbbi4kZ2V0VGVtcGxhdGVSb290XSgpO251bGw9PT10W24uJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSYmKHRbbi4kZXh0cmFdLmZpcnN0VW5zcGxpdHRhYmxlPWUsdFtuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlPSEwKX1mdW5jdGlvbiBJKGUpe2NvbnN0IHQ9ZVtuLiRnZXRUZW1wbGF0ZVJvb3RdKCk7dFtuLiRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGU9PT1lJiYodFtuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlPSExKX1mdW5jdGlvbiBUKGUpe2lmKGVbbi4kZXh0cmFdKXJldHVybiExO2lmKGVbbi4kZXh0cmFdPU9iamVjdC5jcmVhdGUobnVsbCksImF1dG8iPT09ZS50YXJnZXRUeXBlKXJldHVybiExO2NvbnN0IHQ9ZVtuLiRnZXRUZW1wbGF0ZVJvb3RdKCk7bGV0IHI9bnVsbDtpZihlLnRhcmdldCl7aWYocj10W24uJHNlYXJjaE5vZGVdKGUudGFyZ2V0LGVbbi4kZ2V0UGFyZW50XSgpKSwhcilyZXR1cm4hMTtyPXJbMF19Y29uc3R7Y3VycmVudFBhZ2VBcmVhOmEsY3VycmVudENvbnRlbnRBcmVhOml9PXRbbi4kZXh0cmFdO2lmKCJwYWdlQXJlYSI9PT1lLnRhcmdldFR5cGUpcmV0dXJuIHIgaW5zdGFuY2VvZiBRZXx8KHI9bnVsbCksZS5zdGFydE5ldz8oZVtuLiRleHRyYV0udGFyZ2V0PXJ8fGEsITApOiEoIXJ8fHI9PT1hfHwoZVtuLiRleHRyYV0udGFyZ2V0PXIsMCkpO3IgaW5zdGFuY2VvZiBlZXx8KHI9bnVsbCk7Y29uc3Qgcz1yJiZyW24uJGdldFBhcmVudF0oKTtsZXQgbyxjPXM7aWYoZS5zdGFydE5ldylpZihyKXtjb25zdCBlPXMuY29udGVudEFyZWEuY2hpbGRyZW4sdD1lLmluZGV4T2YoaSksbj1lLmluZGV4T2Yocik7LTEhPT10JiZ0PG4mJihjPW51bGwpLG89bi0xfWVsc2Ugbz1hLmNvbnRlbnRBcmVhLmNoaWxkcmVuLmluZGV4T2YoaSk7ZWxzZXtpZighcnx8cj09PWkpcmV0dXJuITE7bz1zLmNvbnRlbnRBcmVhLmNoaWxkcmVuLmluZGV4T2YociktMSxjPXM9PT1hP251bGw6c31yZXR1cm4gZVtuLiRleHRyYV0udGFyZ2V0PWMsZVtuLiRleHRyYV0uaW5kZXg9bywhMH1mdW5jdGlvbiBNKGUsdCxyKXtjb25zdCBhPWVbbi4kZ2V0VGVtcGxhdGVSb290XSgpLGk9YVtuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlLHM9dFtuLiRnZXRTdWJmb3JtUGFyZW50XTt0W24uJGdldFN1YmZvcm1QYXJlbnRdPSgpPT5lLGFbbi4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZT0hMDtjb25zdCBvPXRbbi4kdG9IVE1MXShyKTtlW24uJGFkZEhUTUxdKG8uaHRtbCxvLmJib3gpLGFbbi4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZT1pLHRbbi4kZ2V0U3ViZm9ybVBhcmVudF09c31jbGFzcyBFIGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYXBwZWFyYW5jZUZpbHRlciIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgUCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImFyYyIsITApLHRoaXMuY2lyY3VsYXI9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmNpcmN1bGFyLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy5oYW5kPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhhbmQsWyJldmVuIiwibGVmdCIsInJpZ2h0Il0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5zdGFydEFuZ2xlPSgwLGMuZ2V0RmxvYXQpKHtkYXRhOmUuc3RhcnRBbmdsZSxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4hMH0pLHRoaXMuc3dlZXBBbmdsZT0oMCxjLmdldEZsb2F0KSh7ZGF0YTplLnN3ZWVwQW5nbGUsZGVmYXVsdFZhbHVlOjM2MCx2YWxpZGF0ZTplPT4hMH0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmVkZ2U9bnVsbCx0aGlzLmZpbGw9bnVsbH1bbi4kdG9IVE1MXSgpe3ZhciBlO2NvbnN0IHQ9dGhpcy5lZGdlfHxuZXcgdWUoe30pLHI9dFtuLiR0b1N0eWxlXSgpLGE9T2JqZWN0LmNyZWF0ZShudWxsKTtsZXQgaTsidmlzaWJsZSI9PT0obnVsbD09PShlPXRoaXMuZmlsbCl8fHZvaWQgMD09PWU/dm9pZCAwOmUucHJlc2VuY2UpP09iamVjdC5hc3NpZ24oYSx0aGlzLmZpbGxbbi4kdG9TdHlsZV0oKSk6YS5maWxsPSJ0cmFuc3BhcmVudCIsYS5zdHJva2VXaWR0aD0oMCxzLm1lYXN1cmVUb1N0cmluZykoInZpc2libGUiPT09dC5wcmVzZW5jZT90LnRoaWNrbmVzczowKSxhLnN0cm9rZT1yLmNvbG9yO2NvbnN0IG89e3htbG5zOmcsc3R5bGU6e3dpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUiLG92ZXJmbG93OiJ2aXNpYmxlIn19O2lmKDM2MD09PXRoaXMuc3dlZXBBbmdsZSlpPXtuYW1lOiJlbGxpcHNlIixhdHRyaWJ1dGVzOnt4bWxuczpnLGN4OiI1MCUiLGN5OiI1MCUiLHJ4OiI1MCUiLHJ5OiI1MCUiLHN0eWxlOmF9fTtlbHNle2NvbnN0IGU9dGhpcy5zdGFydEFuZ2xlKk1hdGguUEkvMTgwLHQ9dGhpcy5zd2VlcEFuZ2xlKk1hdGguUEkvMTgwLHI9dGhpcy5zd2VlcEFuZ2xlPjE4MD8xOjAsW24scyxjLGxdPVs1MCooMStNYXRoLmNvcyhlKSksNTAqKDEtTWF0aC5zaW4oZSkpLDUwKigxK01hdGguY29zKGUrdCkpLDUwKigxLU1hdGguc2luKGUrdCkpXTtpPXtuYW1lOiJwYXRoIixhdHRyaWJ1dGVzOnt4bWxuczpnLGQ6Ik0gIi5jb25jYXQobiwiICIpLmNvbmNhdChzLCIgQSA1MCA1MCAwICIpLmNvbmNhdChyLCIgMCAiKS5jb25jYXQoYywiICIpLmNvbmNhdChsKSx2ZWN0b3JFZmZlY3Q6Im5vbi1zY2FsaW5nLXN0cm9rZSIsc3R5bGU6YX19LE9iamVjdC5hc3NpZ24obyx7dmlld0JveDoiMCAwIDEwMCAxMDAiLHByZXNlcnZlQXNwZWN0UmF0aW86Im5vbmUifSl9Y29uc3QgbD17bmFtZToic3ZnIixjaGlsZHJlbjpbaV0sYXR0cmlidXRlczpvfTtyZXR1cm4gdyh0aGlzW24uJGdldFBhcmVudF0oKVtuLiRnZXRQYXJlbnRdKCkpP2MuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e3N0eWxlOntkaXNwbGF5OiJpbmxpbmUiLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUifX0sY2hpbGRyZW46W2xdfSk6KGwuYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuSFRNTFJlc3VsdC5zdWNjZXNzKGwpKX19Y2xhc3MgUiBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImFyZWEiLCEwKSx0aGlzLmNvbFNwYW49KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmNvbFNwYW4sZGVmYXVsdFZhbHVlOjEsdmFsaWRhdGU6ZT0+ZT49MXx8LTE9PT1lfSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnJlbGV2YW50PSgwLGMuZ2V0UmVsZXZhbnQpKGUucmVsZXZhbnQpLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLng9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS54LCIwcHQiKSx0aGlzLnk9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS55LCIwcHQiKSx0aGlzLmRlc2M9bnVsbCx0aGlzLmV4dHJhcz1udWxsLHRoaXMuYXJlYT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRyYXc9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5leE9iamVjdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4Y2xHcm91cD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZpZWxkPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc3ViZm9ybT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN1YmZvcm1TZXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXl9KltuLiRnZXRDb250YWluZWRDaGlsZHJlbl0oKXt5aWVsZCp4KHRoaXMpfVtuLiRpc1RyYW5zcGFyZW50XSgpe3JldHVybiEwfVtuLiRpc0JpbmRhYmxlXSgpe3JldHVybiEwfVtuLiRhZGRIVE1MXShlLHQpe2NvbnN0W3IsYSxpLHNdPXQ7dGhpc1tuLiRleHRyYV0ud2lkdGg9TWF0aC5tYXgodGhpc1tuLiRleHRyYV0ud2lkdGgscitpKSx0aGlzW24uJGV4dHJhXS5oZWlnaHQ9TWF0aC5tYXgodGhpc1tuLiRleHRyYV0uaGVpZ2h0LGErcyksdGhpc1tuLiRleHRyYV0uY2hpbGRyZW4ucHVzaChlKX1bbi4kZ2V0QXZhaWxhYmxlU3BhY2VdKCl7cmV0dXJuIHRoaXNbbi4kZXh0cmFdLmF2YWlsYWJsZVNwYWNlfVtuLiR0b0hUTUxdKGUpe2NvbnN0IHQ9KDAscy50b1N0eWxlKSh0aGlzLCJwb3NpdGlvbiIpLHI9e3N0eWxlOnQsaWQ6dGhpc1tuLiR1aWRdLGNsYXNzOlsieGZhQXJlYSJdfTsoMCxzLmlzUHJpbnRPbmx5KSh0aGlzKSYmci5jbGFzcy5wdXNoKCJ4ZmFQcmludE9ubHkiKSx0aGlzLm5hbWUmJihyLnhmYU5hbWU9dGhpcy5uYW1lKTtjb25zdCBhPVtdO3RoaXNbbi4kZXh0cmFdPXtjaGlsZHJlbjphLHdpZHRoOjAsaGVpZ2h0OjAsYXZhaWxhYmxlU3BhY2U6ZX07Y29uc3QgaT10aGlzW24uJGNoaWxkcmVuVG9IVE1MXSh7ZmlsdGVyOm5ldyBTZXQoWyJhcmVhIiwiZHJhdyIsImZpZWxkIiwiZXhjbEdyb3VwIiwic3ViZm9ybSIsInN1YmZvcm1TZXQiXSksaW5jbHVkZTohMH0pO2lmKCFpLnN1Y2Nlc3MpcmV0dXJuIGkuaXNCcmVhaygpP2k6KGRlbGV0ZSB0aGlzW24uJGV4dHJhXSxjLkhUTUxSZXN1bHQuRkFJTFVSRSk7dC53aWR0aD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpc1tuLiRleHRyYV0ud2lkdGgpLHQuaGVpZ2h0PSgwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzW24uJGV4dHJhXS5oZWlnaHQpO2NvbnN0IG89e25hbWU6ImRpdiIsYXR0cmlidXRlczpyLGNoaWxkcmVuOmF9LGw9W3RoaXMueCx0aGlzLnksdGhpc1tuLiRleHRyYV0ud2lkdGgsdGhpc1tuLiRleHRyYV0uaGVpZ2h0XTtyZXR1cm4gZGVsZXRlIHRoaXNbbi4kZXh0cmFdLGMuSFRNTFJlc3VsdC5zdWNjZXNzKG8sbCl9fWNsYXNzIE4gZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJhc3Npc3QiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucm9sZT1lLnJvbGV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLnNwZWFrPW51bGwsdGhpcy50b29sVGlwPW51bGx9W24uJHRvSFRNTF0oKXt2YXIgZTtyZXR1cm4obnVsbD09PShlPXRoaXMudG9vbFRpcCl8fHZvaWQgMD09PWU/dm9pZCAwOmVbbi4kY29udGVudF0pfHxudWxsfX1jbGFzcyBEIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYmFyY29kZSIsITApLHRoaXMuY2hhckVuY29kaW5nPSgwLGMuZ2V0S2V5d29yZCkoe2RhdGE6ZS5jaGFyRW5jb2Rpbmc/ZS5jaGFyRW5jb2RpbmcudG9Mb3dlckNhc2UoKToiIixkZWZhdWx0VmFsdWU6IiIsdmFsaWRhdGU6ZT0+WyJ1dGYtOCIsImJpZy1maXZlIiwiZm9udHNwZWNpZmljIiwiZ2JrIiwiZ2ItMTgwMzAiLCJnYi0yMzEyIiwia3NjLTU2MDEiLCJub25lIiwic2hpZnQtamlzIiwidWNzLTIiLCJ1dGYtMTYiXS5pbmNsdWRlcyhlKXx8ZS5tYXRjaCgvaXNvLTg4NTktXGR7Mn0vKX0pLHRoaXMuY2hlY2tzdW09KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuY2hlY2tzdW0sWyJub25lIiwiMW1vZDEwIiwiMW1vZDEwXzFtb2QxMSIsIjJtb2QxMCIsImF1dG8iXSksdGhpcy5kYXRhQ29sdW1uQ291bnQ9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmRhdGFDb2x1bW5Db3VudCxkZWZhdWx0VmFsdWU6LTEsdmFsaWRhdGU6ZT0+ZT49MH0pLHRoaXMuZGF0YUxlbmd0aD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZGF0YUxlbmd0aCxkZWZhdWx0VmFsdWU6LTEsdmFsaWRhdGU6ZT0+ZT49MH0pLHRoaXMuZGF0YVByZXA9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuZGF0YVByZXAsWyJub25lIiwiZmxhdGVDb21wcmVzcyJdKSx0aGlzLmRhdGFSb3dDb3VudD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZGF0YVJvd0NvdW50LGRlZmF1bHRWYWx1ZTotMSx2YWxpZGF0ZTplPT5lPj0wfSksdGhpcy5lbmRDaGFyPWUuZW5kQ2hhcnx8IiIsdGhpcy5lcnJvckNvcnJlY3Rpb25MZXZlbD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZXJyb3JDb3JyZWN0aW9uTGV2ZWwsZGVmYXVsdFZhbHVlOi0xLHZhbGlkYXRlOmU9PmU+PTAmJmU8PTh9KSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubW9kdWxlSGVpZ2h0PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubW9kdWxlSGVpZ2h0LCI1bW0iKSx0aGlzLm1vZHVsZVdpZHRoPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubW9kdWxlV2lkdGgsIjAuMjVtbSIpLHRoaXMucHJpbnRDaGVja0RpZ2l0PSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5wcmludENoZWNrRGlnaXQsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLnJvd0NvbHVtblJhdGlvPSgwLGMuZ2V0UmF0aW8pKGUucm93Q29sdW1uUmF0aW8pLHRoaXMuc3RhcnRDaGFyPWUuc3RhcnRDaGFyfHwiIix0aGlzLnRleHRMb2NhdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50ZXh0TG9jYXRpb24sWyJiZWxvdyIsImFib3ZlIiwiYWJvdmVFbWJlZGRlZCIsImJlbG93RW1iZWRkZWQiLCJub25lIl0pLHRoaXMudHJ1bmNhdGU9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnRydW5jYXRlLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGU/ZS50eXBlLnRvTG93ZXJDYXNlKCk6IiIsWyJhenRlYyIsImNvZGFiYXIiLCJjb2RlMm9mNWluZHVzdHJpYWwiLCJjb2RlMm9mNWludGVybGVhdmVkIiwiY29kZTJvZjVtYXRyaXgiLCJjb2RlMm9mNXN0YW5kYXJkIiwiY29kZTNvZjkiLCJjb2RlM29mOWV4dGVuZGVkIiwiY29kZTExIiwiY29kZTQ5IiwiY29kZTkzIiwiY29kZTEyOCIsImNvZGUxMjhhIiwiY29kZTEyOGIiLCJjb2RlMTI4YyIsImNvZGUxMjhzc2NjIiwiZGF0YW1hdHJpeCIsImVhbjgiLCJlYW44YWRkMiIsImVhbjhhZGQ1IiwiZWFuMTMiLCJlYW4xM2FkZDIiLCJlYW4xM2FkZDUiLCJlYW4xM3B3Y2QiLCJmaW0iLCJsb2dtYXJzIiwibWF4aWNvZGUiLCJtc2kiLCJwZGY0MTciLCJwZGY0MTdtYWNybyIsInBsZXNzZXkiLCJwb3N0YXVzY3VzdDIiLCJwb3N0YXVzY3VzdDMiLCJwb3N0YXVzcmVwbHlwYWlkIiwicG9zdGF1c3N0YW5kYXJkIiwicG9zdHVrcm00c2NjIiwicG9zdHVzZHBiYyIsInBvc3R1c2ltYiIsInBvc3R1c3N0YW5kYXJkIiwicG9zdHVzNXppcCIsInFyY29kZSIsInJmaWQiLCJyc3MxNCIsInJzczE0ZXhwYW5kZWQiLCJyc3MxNGxpbWl0ZWQiLCJyc3MxNHN0YWNrZWQiLCJyc3MxNHN0YWNrZWRvbW5pIiwicnNzMTR0cnVuY2F0ZWQiLCJ0ZWxlcGVuIiwidWNjMTI4IiwidWNjMTI4cmFuZG9tIiwidWNjMTI4c3NjYyIsInVwY2EiLCJ1cGNhYWRkMiIsInVwY2FhZGQ1IiwidXBjYXB3Y2QiLCJ1cGNlIiwidXBjZWFkZDIiLCJ1cGNlYWRkNSIsInVwY2VhbjIiLCJ1cGNlYW41IiwidXBzbWF4aWNvZGUiXSksdGhpcy51cHNNb2RlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnVwc01vZGUsWyJ1c0NhcnJpZXIiLCJpbnRlcm5hdGlvbmFsQ2FycmllciIsInNlY3VyZVN5bWJvbCIsInN0YW5kYXJkU3ltYm9sIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLndpZGVOYXJyb3dSYXRpbz0oMCxjLmdldFJhdGlvKShlLndpZGVOYXJyb3dSYXRpbyksdGhpcy5lbmNyeXB0PW51bGwsdGhpcy5leHRyYXM9bnVsbH19Y2xhc3MgQiBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJpbmQiLCEwKSx0aGlzLm1hdGNoPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm1hdGNoLFsib25jZSIsImRhdGFSZWYiLCJnbG9iYWwiLCJub25lIl0pLHRoaXMucmVmPWUucmVmfHwiIix0aGlzLnBpY3R1cmU9bnVsbH19Y2xhc3MgTCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJpbmRJdGVtcyIpLHRoaXMuY29ubmVjdGlvbj1lLmNvbm5lY3Rpb258fCIiLHRoaXMubGFiZWxSZWY9ZS5sYWJlbFJlZnx8IiIsdGhpcy5yZWY9ZS5yZWZ8fCIiLHRoaXMudmFsdWVSZWY9ZS52YWx1ZVJlZnx8IiJ9fXQuQmluZEl0ZW1zPUw7Y2xhc3MgXyBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJvb2tlbmQiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubGVhZGVyPWUubGVhZGVyfHwiIix0aGlzLnRyYWlsZXI9ZS50cmFpbGVyfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIGogZXh0ZW5kcyBvLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJvb2xlYW4iKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn1bbi4kdG9IVE1MXShlKXtyZXR1cm4gTygxPT09dGhpc1tuLiRjb250ZW50XT8iMSI6IjAiKX19Y2xhc3MgVSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJvcmRlciIsITApLHRoaXMuYnJlYWs9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYnJlYWssWyJjbG9zZSIsIm9wZW4iXSksdGhpcy5oYW5kPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhhbmQsWyJldmVuIiwibGVmdCIsInJpZ2h0Il0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5wcmVzZW5jZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmVzZW5jZSxbInZpc2libGUiLCJoaWRkZW4iLCJpbmFjdGl2ZSIsImludmlzaWJsZSJdKSx0aGlzLnJlbGV2YW50PSgwLGMuZ2V0UmVsZXZhbnQpKGUucmVsZXZhbnQpLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNvcm5lcj1uZXcgby5YRkFPYmplY3RBcnJheSg0KSx0aGlzLmVkZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXkoNCksdGhpcy5leHRyYXM9bnVsbCx0aGlzLmZpbGw9bnVsbCx0aGlzLm1hcmdpbj1udWxsfVtuLiRnZXRFeHRyYV0oKXtpZighdGhpc1tuLiRleHRyYV0pe2NvbnN0IGU9dGhpcy5lZGdlLmNoaWxkcmVuLnNsaWNlKCk7aWYoZS5sZW5ndGg8NCl7Y29uc3QgdD1lLmF0KC0xKXx8bmV3IHVlKHt9KTtmb3IobGV0IHI9ZS5sZW5ndGg7cjw0O3IrKyllLnB1c2godCl9Y29uc3QgdD1lLm1hcCgoZT0+ZS50aGlja25lc3MpKSxyPVswLDAsMCwwXTt0aGlzLm1hcmdpbiYmKHJbMF09dGhpcy5tYXJnaW4udG9wSW5zZXQsclsxXT10aGlzLm1hcmdpbi5yaWdodEluc2V0LHJbMl09dGhpcy5tYXJnaW4uYm90dG9tSW5zZXQsclszXT10aGlzLm1hcmdpbi5sZWZ0SW5zZXQpLHRoaXNbbi4kZXh0cmFdPXt3aWR0aHM6dCxpbnNldHM6cixlZGdlczplfX1yZXR1cm4gdGhpc1tuLiRleHRyYV19W24uJHRvU3R5bGVdKCl7dmFyIGU7Y29uc3R7ZWRnZXM6dH09dGhpc1tuLiRnZXRFeHRyYV0oKSxyPXQubWFwKChlPT57Y29uc3QgdD1lW24uJHRvU3R5bGVdKCk7cmV0dXJuIHQuY29sb3J8fCh0LmNvbG9yPSIjMDAwMDAwIiksdH0pKSxhPU9iamVjdC5jcmVhdGUobnVsbCk7aWYodGhpcy5tYXJnaW4mJk9iamVjdC5hc3NpZ24oYSx0aGlzLm1hcmdpbltuLiR0b1N0eWxlXSgpKSwidmlzaWJsZSI9PT0obnVsbD09PShlPXRoaXMuZmlsbCl8fHZvaWQgMD09PWU/dm9pZCAwOmUucHJlc2VuY2UpJiZPYmplY3QuYXNzaWduKGEsdGhpcy5maWxsW24uJHRvU3R5bGVdKCkpLHRoaXMuY29ybmVyLmNoaWxkcmVuLnNvbWUoKGU9PjAhPT1lLnJhZGl1cykpKXtjb25zdCBlPXRoaXMuY29ybmVyLmNoaWxkcmVuLm1hcCgoZT0+ZVtuLiR0b1N0eWxlXSgpKSk7aWYoMj09PWUubGVuZ3RofHwzPT09ZS5sZW5ndGgpe2NvbnN0IHQ9ZS5hdCgtMSk7Zm9yKGxldCByPWUubGVuZ3RoO3I8NDtyKyspZS5wdXNoKHQpfWEuYm9yZGVyUmFkaXVzPWUubWFwKChlPT5lLnJhZGl1cykpLmpvaW4oIiAiKX1zd2l0Y2godGhpcy5wcmVzZW5jZSl7Y2FzZSJpbnZpc2libGUiOmNhc2UiaGlkZGVuIjphLmJvcmRlclN0eWxlPSIiO2JyZWFrO2Nhc2UiaW5hY3RpdmUiOmEuYm9yZGVyU3R5bGU9Im5vbmUiO2JyZWFrO2RlZmF1bHQ6YS5ib3JkZXJTdHlsZT1yLm1hcCgoZT0+ZS5zdHlsZSkpLmpvaW4oIiAiKX1yZXR1cm4gYS5ib3JkZXJXaWR0aD1yLm1hcCgoZT0+ZS53aWR0aCkpLmpvaW4oIiAiKSxhLmJvcmRlckNvbG9yPXIubWFwKChlPT5lLmNvbG9yKSkuam9pbigiICIpLGF9fWNsYXNzICQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJicmVhayIsITApLHRoaXMuYWZ0ZXI9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYWZ0ZXIsWyJhdXRvIiwiY29udGVudEFyZWEiLCJwYWdlQXJlYSIsInBhZ2VFdmVuIiwicGFnZU9kZCJdKSx0aGlzLmFmdGVyVGFyZ2V0PWUuYWZ0ZXJUYXJnZXR8fCIiLHRoaXMuYmVmb3JlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmJlZm9yZSxbImF1dG8iLCJjb250ZW50QXJlYSIsInBhZ2VBcmVhIiwicGFnZUV2ZW4iLCJwYWdlT2RkIl0pLHRoaXMuYmVmb3JlVGFyZ2V0PWUuYmVmb3JlVGFyZ2V0fHwiIix0aGlzLmJvb2tlbmRMZWFkZXI9ZS5ib29rZW5kTGVhZGVyfHwiIix0aGlzLmJvb2tlbmRUcmFpbGVyPWUuYm9va2VuZFRyYWlsZXJ8fCIiLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5vdmVyZmxvd0xlYWRlcj1lLm92ZXJmbG93TGVhZGVyfHwiIix0aGlzLm92ZXJmbG93VGFyZ2V0PWUub3ZlcmZsb3dUYXJnZXR8fCIiLHRoaXMub3ZlcmZsb3dUcmFpbGVyPWUub3ZlcmZsb3dUcmFpbGVyfHwiIix0aGlzLnN0YXJ0TmV3PSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5zdGFydE5ldyxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4xPT09ZX0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmV4dHJhcz1udWxsfX1jbGFzcyBYIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYnJlYWtBZnRlciIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5sZWFkZXI9ZS5sZWFkZXJ8fCIiLHRoaXMuc3RhcnROZXc9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnN0YXJ0TmV3LGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy50YXJnZXQ9ZS50YXJnZXR8fCIiLHRoaXMudGFyZ2V0VHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50YXJnZXRUeXBlLFsiYXV0byIsImNvbnRlbnRBcmVhIiwicGFnZUFyZWEiXSksdGhpcy50cmFpbGVyPWUudHJhaWxlcnx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuc2NyaXB0PW51bGx9fWNsYXNzIEggZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJicmVha0JlZm9yZSIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5sZWFkZXI9ZS5sZWFkZXJ8fCIiLHRoaXMuc3RhcnROZXc9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnN0YXJ0TmV3LGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy50YXJnZXQ9ZS50YXJnZXR8fCIiLHRoaXMudGFyZ2V0VHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50YXJnZXRUeXBlLFsiYXV0byIsImNvbnRlbnRBcmVhIiwicGFnZUFyZWEiXSksdGhpcy50cmFpbGVyPWUudHJhaWxlcnx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuc2NyaXB0PW51bGx9W24uJHRvSFRNTF0oZSl7cmV0dXJuIHRoaXNbbi4kZXh0cmFdPXt9LGMuSFRNTFJlc3VsdC5GQUlMVVJFfX1jbGFzcyBxIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYnV0dG9uIiwhMCksdGhpcy5oaWdobGlnaHQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaGlnaGxpZ2h0LFsiaW52ZXJ0ZWQiLCJub25lIiwib3V0bGluZSIsInB1c2giXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbH1bbi4kdG9IVE1MXShlKXtjb25zdCB0PXRoaXNbbi4kZ2V0UGFyZW50XSgpW24uJGdldFBhcmVudF0oKSxyPXtuYW1lOiJidXR0b24iLGF0dHJpYnV0ZXM6e2lkOnRoaXNbbi4kdWlkXSxjbGFzczpbInhmYUJ1dHRvbiJdLHN0eWxlOnt9fSxjaGlsZHJlbjpbXX07Zm9yKGNvbnN0IGUgb2YgdC5ldmVudC5jaGlsZHJlbil7aWYoImNsaWNrIiE9PWUuYWN0aXZpdHl8fCFlLnNjcmlwdCljb250aW51ZTtjb25zdCB0PSgwLHUucmVjb3ZlckpzVVJMKShlLnNjcmlwdFtuLiRjb250ZW50XSk7aWYoIXQpY29udGludWU7Y29uc3QgYT0oMCxzLmZpeFVSTCkodC51cmwpO2EmJnIuY2hpbGRyZW4ucHVzaCh7bmFtZToiYSIsYXR0cmlidXRlczp7aWQ6ImxpbmsiK3RoaXNbbi4kdWlkXSxocmVmOmEsbmV3V2luZG93OnQubmV3V2luZG93LGNsYXNzOlsieGZhTGluayJdLHN0eWxlOnt9fSxjaGlsZHJlbjpbXX0pfXJldHVybiBjLkhUTUxSZXN1bHQuc3VjY2VzcyhyKX19Y2xhc3MgeiBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImNhbGN1bGF0ZSIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5vdmVycmlkZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5vdmVycmlkZSxbImRpc2FibGVkIiwiZXJyb3IiLCJpZ25vcmUiLCJ3YXJuaW5nIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmV4dHJhcz1udWxsLHRoaXMubWVzc2FnZT1udWxsLHRoaXMuc2NyaXB0PW51bGx9fWNsYXNzIEcgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJjYXB0aW9uIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnBsYWNlbWVudD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wbGFjZW1lbnQsWyJsZWZ0IiwiYm90dG9tIiwiaW5saW5lIiwicmlnaHQiLCJ0b3AiXSksdGhpcy5wcmVzZW5jZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmVzZW5jZSxbInZpc2libGUiLCJoaWRkZW4iLCJpbmFjdGl2ZSIsImludmlzaWJsZSJdKSx0aGlzLnJlc2VydmU9TWF0aC5jZWlsKCgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUucmVzZXJ2ZSkpLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmV4dHJhcz1udWxsLHRoaXMuZm9udD1udWxsLHRoaXMubWFyZ2luPW51bGwsdGhpcy5wYXJhPW51bGwsdGhpcy52YWx1ZT1udWxsfVtuLiRzZXRWYWx1ZV0oZSl7dih0aGlzLGUpfVtuLiRnZXRFeHRyYV0oZSl7aWYoIXRoaXNbbi4kZXh0cmFdKXtsZXR7d2lkdGg6dCxoZWlnaHQ6cn09ZTtzd2l0Y2godGhpcy5wbGFjZW1lbnQpe2Nhc2UibGVmdCI6Y2FzZSJyaWdodCI6Y2FzZSJpbmxpbmUiOnQ9dGhpcy5yZXNlcnZlPD0wP3Q6dGhpcy5yZXNlcnZlO2JyZWFrO2Nhc2UidG9wIjpjYXNlImJvdHRvbSI6cj10aGlzLnJlc2VydmU8PTA/cjp0aGlzLnJlc2VydmV9dGhpc1tuLiRleHRyYV09KDAscy5sYXlvdXROb2RlKSh0aGlzLHt3aWR0aDp0LGhlaWdodDpyfSl9cmV0dXJuIHRoaXNbbi4kZXh0cmFdfVtuLiR0b0hUTUxdKGUpe2lmKCF0aGlzLnZhbHVlKXJldHVybiBjLkhUTUxSZXN1bHQuRU1QVFk7dGhpc1tuLiRwdXNoUGFyYV0oKTtjb25zdCB0PXRoaXMudmFsdWVbbi4kdG9IVE1MXShlKS5odG1sO2lmKCF0KXJldHVybiB0aGlzW24uJHBvcFBhcmFdKCksYy5IVE1MUmVzdWx0LkVNUFRZO2NvbnN0IHI9dGhpcy5yZXNlcnZlO2lmKHRoaXMucmVzZXJ2ZTw9MCl7Y29uc3R7dzp0LGg6cn09dGhpc1tuLiRnZXRFeHRyYV0oZSk7c3dpdGNoKHRoaXMucGxhY2VtZW50KXtjYXNlImxlZnQiOmNhc2UicmlnaHQiOmNhc2UiaW5saW5lIjp0aGlzLnJlc2VydmU9dDticmVhaztjYXNlInRvcCI6Y2FzZSJib3R0b20iOnRoaXMucmVzZXJ2ZT1yfX1jb25zdCBhPVtdOyJzdHJpbmciPT10eXBlb2YgdD9hLnB1c2goe25hbWU6IiN0ZXh0Iix2YWx1ZTp0fSk6YS5wdXNoKHQpO2NvbnN0IGk9KDAscy50b1N0eWxlKSh0aGlzLCJmb250IiwibWFyZ2luIiwidmlzaWJpbGl0eSIpO3N3aXRjaCh0aGlzLnBsYWNlbWVudCl7Y2FzZSJsZWZ0IjpjYXNlInJpZ2h0Ijp0aGlzLnJlc2VydmU+MCYmKGkud2lkdGg9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMucmVzZXJ2ZSkpO2JyZWFrO2Nhc2UidG9wIjpjYXNlImJvdHRvbSI6dGhpcy5yZXNlcnZlPjAmJihpLmhlaWdodD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5yZXNlcnZlKSl9cmV0dXJuKDAscy5zZXRQYXJhKSh0aGlzLG51bGwsdCksdGhpc1tuLiRwb3BQYXJhXSgpLHRoaXMucmVzZXJ2ZT1yLGMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e3N0eWxlOmksY2xhc3M6WyJ4ZmFDYXB0aW9uIl19LGNoaWxkcmVuOmF9KX19Y2xhc3MgVyBleHRlbmRzIG8uU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImNlcnRpZmljYXRlIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIFYgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJjZXJ0aWZpY2F0ZXMiLCEwKSx0aGlzLmNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuY3JlZGVudGlhbFNlcnZlclBvbGljeSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVybD1lLnVybHx8IiIsdGhpcy51cmxQb2xpY3k9ZS51cmxQb2xpY3l8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmVuY3J5cHRpb249bnVsbCx0aGlzLmlzc3VlcnM9bnVsbCx0aGlzLmtleVVzYWdlPW51bGwsdGhpcy5vaWRzPW51bGwsdGhpcy5zaWduaW5nPW51bGwsdGhpcy5zdWJqZWN0RE5zPW51bGx9fWNsYXNzIEsgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJjaGVja0J1dHRvbiIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5tYXJrPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm1hcmssWyJkZWZhdWx0IiwiY2hlY2siLCJjaXJjbGUiLCJjcm9zcyIsImRpYW1vbmQiLCJzcXVhcmUiLCJzdGFyIl0pLHRoaXMuc2hhcGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuc2hhcGUsWyJzcXVhcmUiLCJyb3VuZCJdKSx0aGlzLnNpemU9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5zaXplLCIxMHB0IiksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuYm9yZGVyPW51bGwsdGhpcy5leHRyYXM9bnVsbCx0aGlzLm1hcmdpbj1udWxsfVtuLiR0b0hUTUxdKGUpe3ZhciB0O2NvbnN0IHI9KDAscy50b1N0eWxlKSgibWFyZ2luIiksYT0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5zaXplKTtsZXQgaSxvLGw7ci53aWR0aD1yLmhlaWdodD1hO2NvbnN0IGg9dGhpc1tuLiRnZXRQYXJlbnRdKClbbi4kZ2V0UGFyZW50XSgpLHU9aC5pdGVtcy5jaGlsZHJlbi5sZW5ndGgmJmguaXRlbXMuY2hpbGRyZW5bMF1bbi4kdG9IVE1MXSgpLmh0bWx8fFtdLGQ9e29uOih2b2lkIDAhPT11WzBdP3VbMF06Im9uIikudG9TdHJpbmcoKSxvZmY6KHZvaWQgMCE9PXVbMV0/dVsxXToib2ZmIikudG9TdHJpbmcoKX0sZj0oKG51bGw9PT0odD1oLnZhbHVlKXx8dm9pZCAwPT09dD92b2lkIDA6dFtuLiR0ZXh0XSgpKXx8Im9mZiIpPT09ZC5vbnx8dm9pZCAwLGc9aFtuLiRnZXRTdWJmb3JtUGFyZW50XSgpLHA9aFtuLiR1aWRdO2xldCBtO3ZhciBiLHk7ZyBpbnN0YW5jZW9mIFNlPyhsPWdbbi4kdWlkXSxpPSJyYWRpbyIsbz0ieGZhUmFkaW8iLG09KG51bGw9PT0oYj1nW24uJGRhdGFdKXx8dm9pZCAwPT09Yj92b2lkIDA6YltuLiR1aWRdKXx8Z1tuLiR1aWRdKTooaT0iY2hlY2tib3giLG89InhmYUNoZWNrYm94IixtPShudWxsPT09KHk9aFtuLiRkYXRhXSl8fHZvaWQgMD09PXk/dm9pZCAwOnlbbi4kdWlkXSl8fGhbbi4kdWlkXSk7Y29uc3Qgdz17bmFtZToiaW5wdXQiLGF0dHJpYnV0ZXM6e2NsYXNzOltvXSxzdHlsZTpyLGZpZWxkSWQ6cCxkYXRhSWQ6bSx0eXBlOmksY2hlY2tlZDpmLHhmYU9uOmQub24seGZhT2ZmOmQub2ZmLCJhcmlhLWxhYmVsIjpDKGgpLCJhcmlhLXJlcXVpcmVkIjohMX19O3JldHVybiBsJiYody5hdHRyaWJ1dGVzLm5hbWU9bCksUyhoKSYmKHcuYXR0cmlidXRlc1siYXJpYS1yZXF1aXJlZCJdPSEwLHcuYXR0cmlidXRlcy5yZXF1aXJlZD0hMCksYy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImxhYmVsIixhdHRyaWJ1dGVzOntjbGFzczpbInhmYUxhYmVsIl19LGNoaWxkcmVuOlt3XX0pfX1jbGFzcyBZIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiY2hvaWNlTGlzdCIsITApLHRoaXMuY29tbWl0T249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuY29tbWl0T24sWyJzZWxlY3QiLCJleGl0Il0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5vcGVuPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm9wZW4sWyJ1c2VyQ29udHJvbCIsImFsd2F5cyIsIm11bHRpU2VsZWN0Iiwib25FbnRyeSJdKSx0aGlzLnRleHRFbnRyeT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUudGV4dEVudHJ5LGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuYm9yZGVyPW51bGwsdGhpcy5leHRyYXM9bnVsbCx0aGlzLm1hcmdpbj1udWxsfVtuLiR0b0hUTUxdKGUpe3ZhciB0LHI7Y29uc3QgYT0oMCxzLnRvU3R5bGUpKHRoaXMsImJvcmRlciIsIm1hcmdpbiIpLGk9dGhpc1tuLiRnZXRQYXJlbnRdKClbbi4kZ2V0UGFyZW50XSgpLG89e2ZvbnRTaXplOiJjYWxjKCIuY29uY2F0KChudWxsPT09KHQ9aS5mb250KXx8dm9pZCAwPT09dD92b2lkIDA6dC5zaXplKXx8MTAsInB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSkiKX0sbD1bXTtpZihpLml0ZW1zLmNoaWxkcmVuLmxlbmd0aD4wKXt2YXIgaDtjb25zdCBlPWkuaXRlbXM7bGV0IHQ9MCxyPTA7Mj09PWUuY2hpbGRyZW4ubGVuZ3RoJiYodD1lLmNoaWxkcmVuWzBdLnNhdmUscj0xLXQpO2NvbnN0IGE9ZS5jaGlsZHJlblt0XVtuLiR0b0hUTUxdKCkuaHRtbCxzPWUuY2hpbGRyZW5bcl1bbi4kdG9IVE1MXSgpLmh0bWw7bGV0IGM9ITE7Y29uc3QgdT0obnVsbD09PShoPWkudmFsdWUpfHx2b2lkIDA9PT1oP3ZvaWQgMDpoW24uJHRleHRdKCkpfHwiIjtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDtlKyspe2NvbnN0IHQ9e25hbWU6Im9wdGlvbiIsYXR0cmlidXRlczp7dmFsdWU6c1tlXXx8YVtlXSxzdHlsZTpvfSx2YWx1ZTphW2VdfTtzW2VdPT09dSYmKHQuYXR0cmlidXRlcy5zZWxlY3RlZD1jPSEwKSxsLnB1c2godCl9Y3x8bC5zcGxpY2UoMCwwLHtuYW1lOiJvcHRpb24iLGF0dHJpYnV0ZXM6e2hpZGRlbjohMCxzZWxlY3RlZDohMH0sdmFsdWU6IiAifSl9Y29uc3QgdT17Y2xhc3M6WyJ4ZmFTZWxlY3QiXSxmaWVsZElkOmlbbi4kdWlkXSxkYXRhSWQ6KG51bGw9PT0ocj1pW24uJGRhdGFdKXx8dm9pZCAwPT09cj92b2lkIDA6cltuLiR1aWRdKXx8aVtuLiR1aWRdLHN0eWxlOmEsImFyaWEtbGFiZWwiOkMoaSksImFyaWEtcmVxdWlyZWQiOiExfTtyZXR1cm4gUyhpKSYmKHVbImFyaWEtcmVxdWlyZWQiXT0hMCx1LnJlcXVpcmVkPSEwKSwibXVsdGlTZWxlY3QiPT09dGhpcy5vcGVuJiYodS5tdWx0aXBsZT0hMCksYy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImxhYmVsIixhdHRyaWJ1dGVzOntjbGFzczpbInhmYUxhYmVsIl19LGNoaWxkcmVuOlt7bmFtZToic2VsZWN0IixjaGlsZHJlbjpsLGF0dHJpYnV0ZXM6dX1dfSl9fWNsYXNzIEogZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJjb2xvciIsITApLHRoaXMuY1NwYWNlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmNTcGFjZSxbIlNSR0IiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy52YWx1ZT1lLnZhbHVlPygwLGMuZ2V0Q29sb3IpKGUudmFsdWUpOiIiLHRoaXMuZXh0cmFzPW51bGx9W24uJGhhc1NldHRhYmxlVmFsdWVdKCl7cmV0dXJuITF9W24uJHRvU3R5bGVdKCl7cmV0dXJuIHRoaXMudmFsdWU/bC5VdGlsLm1ha2VIZXhDb2xvcih0aGlzLnZhbHVlLnIsdGhpcy52YWx1ZS5nLHRoaXMudmFsdWUuYik6bnVsbH19Y2xhc3MgWiBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImNvbWIiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubnVtYmVyT2ZDZWxscz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubnVtYmVyT2ZDZWxscyxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT5lPj0wfSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBRIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiY29ubmVjdCIsITApLHRoaXMuY29ubmVjdGlvbj1lLmNvbm5lY3Rpb258fCIiLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5yZWY9ZS5yZWZ8fCIiLHRoaXMudXNhZ2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudXNhZ2UsWyJleHBvcnRBbmRJbXBvcnQiLCJleHBvcnRPbmx5IiwiaW1wb3J0T25seSJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5waWN0dXJlPW51bGx9fWNsYXNzIGVlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiY29udGVudEFyZWEiLCEwKSx0aGlzLmg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5oKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMudz0oMCxjLmdldE1lYXN1cmVtZW50KShlLncpLHRoaXMueD0oMCxjLmdldE1lYXN1cmVtZW50KShlLngsIjBwdCIpLHRoaXMueT0oMCxjLmdldE1lYXN1cmVtZW50KShlLnksIjBwdCIpLHRoaXMuZGVzYz1udWxsLHRoaXMuZXh0cmFzPW51bGx9W24uJHRvSFRNTF0oZSl7Y29uc3QgdD17bGVmdDooMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy54KSx0b3A6KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMueSksd2lkdGg6KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMudyksaGVpZ2h0OigwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLmgpfSxyPVsieGZhQ29udGVudGFyZWEiXTtyZXR1cm4oMCxzLmlzUHJpbnRPbmx5KSh0aGlzKSYmci5wdXNoKCJ4ZmFQcmludE9ubHkiKSxjLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixjaGlsZHJlbjpbXSxhdHRyaWJ1dGVzOntzdHlsZTp0LGNsYXNzOnIsaWQ6dGhpc1tuLiR1aWRdfX0pfX1jbGFzcyB0ZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImNvcm5lciIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5pbnZlcnRlZD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuaW52ZXJ0ZWQsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLmpvaW49KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuam9pbixbInNxdWFyZSIsInJvdW5kIl0pLHRoaXMucHJlc2VuY2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJlc2VuY2UsWyJ2aXNpYmxlIiwiaGlkZGVuIiwiaW5hY3RpdmUiLCJpbnZpc2libGUiXSksdGhpcy5yYWRpdXM9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5yYWRpdXMpLHRoaXMuc3Ryb2tlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnN0cm9rZSxbInNvbGlkIiwiZGFzaERvdCIsImRhc2hEb3REb3QiLCJkYXNoZWQiLCJkb3R0ZWQiLCJlbWJvc3NlZCIsImV0Y2hlZCIsImxvd2VyZWQiLCJyYWlzZWQiXSksdGhpcy50aGlja25lc3M9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS50aGlja25lc3MsIjAuNXB0IiksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuY29sb3I9bnVsbCx0aGlzLmV4dHJhcz1udWxsfVtuLiR0b1N0eWxlXSgpe2NvbnN0IGU9KDAscy50b1N0eWxlKSh0aGlzLCJ2aXNpYmlsaXR5Iik7cmV0dXJuIGUucmFkaXVzPSgwLHMubWVhc3VyZVRvU3RyaW5nKSgic3F1YXJlIj09PXRoaXMuam9pbj8wOnRoaXMucmFkaXVzKSxlfX1jbGFzcyByZSBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkYXRlIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W24uJGZpbmFsaXplXSgpe2NvbnN0IGU9dGhpc1tuLiRjb250ZW50XS50cmltKCk7dGhpc1tuLiRjb250ZW50XT1lP25ldyBEYXRlKGUpOm51bGx9W24uJHRvSFRNTF0oZSl7cmV0dXJuIE8odGhpc1tuLiRjb250ZW50XT90aGlzW24uJGNvbnRlbnRdLnRvU3RyaW5nKCk6IiIpfX1jbGFzcyBuZSBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkYXRlVGltZSIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifVtuLiRmaW5hbGl6ZV0oKXtjb25zdCBlPXRoaXNbbi4kY29udGVudF0udHJpbSgpO3RoaXNbbi4kY29udGVudF09ZT9uZXcgRGF0ZShlKTpudWxsfVtuLiR0b0hUTUxdKGUpe3JldHVybiBPKHRoaXNbbi4kY29udGVudF0/dGhpc1tuLiRjb250ZW50XS50b1N0cmluZygpOiIiKX19Y2xhc3MgYWUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkYXRlVGltZUVkaXQiLCEwKSx0aGlzLmhTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaFNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucGlja2VyPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnBpY2tlcixbImhvc3QiLCJub25lIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmJvcmRlcj1udWxsLHRoaXMuY29tYj1udWxsLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5tYXJnaW49bnVsbH1bbi4kdG9IVE1MXShlKXt2YXIgdDtjb25zdCByPSgwLHMudG9TdHlsZSkodGhpcywiYm9yZGVyIiwiZm9udCIsIm1hcmdpbiIpLGE9dGhpc1tuLiRnZXRQYXJlbnRdKClbbi4kZ2V0UGFyZW50XSgpLGk9e25hbWU6ImlucHV0IixhdHRyaWJ1dGVzOnt0eXBlOiJ0ZXh0IixmaWVsZElkOmFbbi4kdWlkXSxkYXRhSWQ6KG51bGw9PT0odD1hW24uJGRhdGFdKXx8dm9pZCAwPT09dD92b2lkIDA6dFtuLiR1aWRdKXx8YVtuLiR1aWRdLGNsYXNzOlsieGZhVGV4dGZpZWxkIl0sc3R5bGU6ciwiYXJpYS1sYWJlbCI6QyhhKSwiYXJpYS1yZXF1aXJlZCI6ITF9fTtyZXR1cm4gUyhhKSYmKGkuYXR0cmlidXRlc1siYXJpYS1yZXF1aXJlZCJdPSEwLGkuYXR0cmlidXRlcy5yZXF1aXJlZD0hMCksYy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImxhYmVsIixhdHRyaWJ1dGVzOntjbGFzczpbInhmYUxhYmVsIl19LGNoaWxkcmVuOltpXX0pfX1jbGFzcyBpZSBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkZWNpbWFsIiksdGhpcy5mcmFjRGlnaXRzPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5mcmFjRGlnaXRzLGRlZmF1bHRWYWx1ZToyLHZhbGlkYXRlOmU9PiEwfSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmxlYWREaWdpdHM9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmxlYWREaWdpdHMsZGVmYXVsdFZhbHVlOi0xLHZhbGlkYXRlOmU9PiEwfSksdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifVtuLiRmaW5hbGl6ZV0oKXtjb25zdCBlPXBhcnNlRmxvYXQodGhpc1tuLiRjb250ZW50XS50cmltKCkpO3RoaXNbbi4kY29udGVudF09aXNOYU4oZSk/bnVsbDplfVtuLiR0b0hUTUxdKGUpe3JldHVybiBPKG51bGwhPT10aGlzW24uJGNvbnRlbnRdP3RoaXNbbi4kY29udGVudF0udG9TdHJpbmcoKToiIil9fWNsYXNzIHNlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZGVmYXVsdFVpIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbH19Y2xhc3Mgb2UgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkZXNjIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5ib29sZWFuPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRhdGVUaW1lPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGVjaW1hbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZsb2F0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuaW1hZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5pbnRlZ2VyPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGV4dD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnRpbWU9bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIGNlIGV4dGVuZHMgby5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZGlnZXN0TWV0aG9kIixbIiIsIlNIQTEiLCJTSEEyNTYiLCJTSEE1MTIiLCJSSVBFTUQxNjAiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIGxlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZGlnZXN0TWV0aG9kcyIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmRpZ2VzdE1ldGhvZD1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3MgaGUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkcmF3IiwhMCksdGhpcy5hbmNob3JUeXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFuY2hvclR5cGUsWyJ0b3BMZWZ0IiwiYm90dG9tQ2VudGVyIiwiYm90dG9tTGVmdCIsImJvdHRvbVJpZ2h0IiwibWlkZGxlQ2VudGVyIiwibWlkZGxlTGVmdCIsIm1pZGRsZVJpZ2h0IiwidG9wQ2VudGVyIiwidG9wUmlnaHQiXSksdGhpcy5jb2xTcGFuPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5jb2xTcGFuLGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PmU+PTF8fC0xPT09ZX0pLHRoaXMuaD1lLmg/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5oKToiIix0aGlzLmhBbGlnbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5oQWxpZ24sWyJsZWZ0IiwiY2VudGVyIiwianVzdGlmeSIsImp1c3RpZnlBbGwiLCJyYWRpeCIsInJpZ2h0Il0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5sb2NhbGU9ZS5sb2NhbGV8fCIiLHRoaXMubWF4SD0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1heEgsIjBwdCIpLHRoaXMubWF4Vz0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1heFcsIjBwdCIpLHRoaXMubWluSD0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1pbkgsIjBwdCIpLHRoaXMubWluVz0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1pblcsIjBwdCIpLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMucHJlc2VuY2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJlc2VuY2UsWyJ2aXNpYmxlIiwiaGlkZGVuIiwiaW5hY3RpdmUiLCJpbnZpc2libGUiXSksdGhpcy5yZWxldmFudD0oMCxjLmdldFJlbGV2YW50KShlLnJlbGV2YW50KSx0aGlzLnJvdGF0ZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUucm90YXRlLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PmUlOTA9PTB9KSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy53PWUudz8oMCxjLmdldE1lYXN1cmVtZW50KShlLncpOiIiLHRoaXMueD0oMCxjLmdldE1lYXN1cmVtZW50KShlLngsIjBwdCIpLHRoaXMueT0oMCxjLmdldE1lYXN1cmVtZW50KShlLnksIjBwdCIpLHRoaXMuYXNzaXN0PW51bGwsdGhpcy5ib3JkZXI9bnVsbCx0aGlzLmNhcHRpb249bnVsbCx0aGlzLmRlc2M9bnVsbCx0aGlzLmV4dHJhcz1udWxsLHRoaXMuZm9udD1udWxsLHRoaXMua2VlcD1udWxsLHRoaXMubWFyZ2luPW51bGwsdGhpcy5wYXJhPW51bGwsdGhpcy50cmF2ZXJzYWw9bnVsbCx0aGlzLnVpPW51bGwsdGhpcy52YWx1ZT1udWxsLHRoaXMuc2V0UHJvcGVydHk9bmV3IG8uWEZBT2JqZWN0QXJyYXl9W24uJHNldFZhbHVlXShlKXt2KHRoaXMsZSl9W24uJHRvSFRNTF0oZSl7aWYoQSh0aGlzKSwiaGlkZGVuIj09PXRoaXMucHJlc2VuY2V8fCJpbmFjdGl2ZSI9PT10aGlzLnByZXNlbmNlKXJldHVybiBjLkhUTUxSZXN1bHQuRU1QVFk7KDAscy5maXhEaW1lbnNpb25zKSh0aGlzKSx0aGlzW24uJHB1c2hQYXJhXSgpO2NvbnN0IHQ9dGhpcy53LHI9dGhpcy5oLHt3OmEsaDpvLGlzQnJva2VuOmx9PSgwLHMubGF5b3V0Tm9kZSkodGhpcyxlKTtpZihhJiYiIj09PXRoaXMudyl7aWYobCYmdGhpc1tuLiRnZXRTdWJmb3JtUGFyZW50XSgpW24uJGlzVGhlcmVNb3JlV2lkdGhdKCkpcmV0dXJuIHRoaXNbbi4kcG9wUGFyYV0oKSxjLkhUTUxSZXN1bHQuRkFJTFVSRTt0aGlzLnc9YX1pZihvJiYiIj09PXRoaXMuaCYmKHRoaXMuaD1vKSxGKHRoaXMpLCEoMCxpLmNoZWNrRGltZW5zaW9ucykodGhpcyxlKSlyZXR1cm4gdGhpcy53PXQsdGhpcy5oPXIsdGhpc1tuLiRwb3BQYXJhXSgpLGMuSFRNTFJlc3VsdC5GQUlMVVJFO0kodGhpcyk7Y29uc3QgaD0oMCxzLnRvU3R5bGUpKHRoaXMsImZvbnQiLCJoQWxpZ24iLCJkaW1lbnNpb25zIiwicG9zaXRpb24iLCJwcmVzZW5jZSIsInJvdGF0ZSIsImFuY2hvclR5cGUiLCJib3JkZXIiLCJtYXJnaW4iKTsoMCxzLnNldE1pbk1heERpbWVuc2lvbnMpKHRoaXMsaCksaC5tYXJnaW4mJihoLnBhZGRpbmc9aC5tYXJnaW4sZGVsZXRlIGgubWFyZ2luKTtjb25zdCB1PVsieGZhRHJhdyJdO3RoaXMuZm9udCYmdS5wdXNoKCJ4ZmFGb250IiksKDAscy5pc1ByaW50T25seSkodGhpcykmJnUucHVzaCgieGZhUHJpbnRPbmx5Iik7Y29uc3QgZD17c3R5bGU6aCxpZDp0aGlzW24uJHVpZF0sY2xhc3M6dX07dGhpcy5uYW1lJiYoZC54ZmFOYW1lPXRoaXMubmFtZSk7Y29uc3QgZj17bmFtZToiZGl2IixhdHRyaWJ1dGVzOmQsY2hpbGRyZW46W119O2sodGhpcyxkKTtjb25zdCBnPSgwLHMuY29tcHV0ZUJib3gpKHRoaXMsZixlKSxwPXRoaXMudmFsdWU/dGhpcy52YWx1ZVtuLiR0b0hUTUxdKGUpLmh0bWw6bnVsbDtyZXR1cm4gbnVsbD09PXA/KHRoaXMudz10LHRoaXMuaD1yLHRoaXNbbi4kcG9wUGFyYV0oKSxjLkhUTUxSZXN1bHQuc3VjY2VzcygoMCxzLmNyZWF0ZVdyYXBwZXIpKHRoaXMsZiksZykpOihmLmNoaWxkcmVuLnB1c2gocCksKDAscy5zZXRQYXJhKSh0aGlzLGgscCksdGhpcy53PXQsdGhpcy5oPXIsdGhpc1tuLiRwb3BQYXJhXSgpLGMuSFRNTFJlc3VsdC5zdWNjZXNzKCgwLHMuY3JlYXRlV3JhcHBlcikodGhpcyxmKSxnKSl9fWNsYXNzIHVlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZWRnZSIsITApLHRoaXMuY2FwPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmNhcCxbInNxdWFyZSIsImJ1dHQiLCJyb3VuZCJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucHJlc2VuY2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJlc2VuY2UsWyJ2aXNpYmxlIiwiaGlkZGVuIiwiaW5hY3RpdmUiLCJpbnZpc2libGUiXSksdGhpcy5zdHJva2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuc3Ryb2tlLFsic29saWQiLCJkYXNoRG90IiwiZGFzaERvdERvdCIsImRhc2hlZCIsImRvdHRlZCIsImVtYm9zc2VkIiwiZXRjaGVkIiwibG93ZXJlZCIsInJhaXNlZCJdKSx0aGlzLnRoaWNrbmVzcz0oMCxjLmdldE1lYXN1cmVtZW50KShlLnRoaWNrbmVzcywiMC41cHQiKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5jb2xvcj1udWxsLHRoaXMuZXh0cmFzPW51bGx9W24uJHRvU3R5bGVdKCl7Y29uc3QgZT0oMCxzLnRvU3R5bGUpKHRoaXMsInZpc2liaWxpdHkiKTtpZihPYmplY3QuYXNzaWduKGUse2xpbmVjYXA6dGhpcy5jYXAsd2lkdGg6KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMudGhpY2tuZXNzKSxjb2xvcjp0aGlzLmNvbG9yP3RoaXMuY29sb3Jbbi4kdG9TdHlsZV0oKToiIzAwMDAwMCIsc3R5bGU6IiJ9KSwidmlzaWJsZSIhPT10aGlzLnByZXNlbmNlKWUuc3R5bGU9Im5vbmUiO2Vsc2Ugc3dpdGNoKHRoaXMuc3Ryb2tlKXtjYXNlInNvbGlkIjplLnN0eWxlPSJzb2xpZCI7YnJlYWs7Y2FzZSJkYXNoRG90IjpjYXNlImRhc2hEb3REb3QiOmNhc2UiZGFzaGVkIjplLnN0eWxlPSJkYXNoZWQiO2JyZWFrO2Nhc2UiZG90dGVkIjplLnN0eWxlPSJkb3R0ZWQiO2JyZWFrO2Nhc2UiZW1ib3NzZWQiOmUuc3R5bGU9InJpZGdlIjticmVhaztjYXNlImV0Y2hlZCI6ZS5zdHlsZT0iZ3Jvb3ZlIjticmVhaztjYXNlImxvd2VyZWQiOmUuc3R5bGU9Imluc2V0IjticmVhaztjYXNlInJhaXNlZCI6ZS5zdHlsZT0ib3V0c2V0In1yZXR1cm4gZX19Y2xhc3MgZGUgZXh0ZW5kcyBvLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJlbmNvZGluZyIsWyJhZGJlLng1MDkucnNhX3NoYTEiLCJhZGJlLnBrY3M3LmRldGFjaGVkIiwiYWRiZS5wa2NzNy5zaGExIl0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBmZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImVuY29kaW5ncyIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmVuY29kaW5nPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBnZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImVuY3J5cHQiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNlcnRpZmljYXRlPW51bGx9fWNsYXNzIHBlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZW5jcnlwdERhdGEiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMub3BlcmF0aW9uPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm9wZXJhdGlvbixbImVuY3J5cHQiLCJkZWNyeXB0Il0pLHRoaXMudGFyZ2V0PWUudGFyZ2V0fHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5maWx0ZXI9bnVsbCx0aGlzLm1hbmlmZXN0PW51bGx9fWNsYXNzIG1lIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZW5jcnlwdGlvbiIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNlcnRpZmljYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBiZSBleHRlbmRzIG8uT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImVuY3J5cHRpb25NZXRob2QiLFsiIiwiQUVTMjU2LUNCQyIsIlRSSVBMRURFUy1DQkMiLCJBRVMxMjgtQ0JDIiwiQUVTMTkyLUNCQyJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgeWUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJlbmNyeXB0aW9uTWV0aG9kcyIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmVuY3J5cHRpb25NZXRob2Q9bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIHdlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZXZlbnQiLCEwKSx0aGlzLmFjdGl2aXR5PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFjdGl2aXR5LFsiY2xpY2siLCJjaGFuZ2UiLCJkb2NDbG9zZSIsImRvY1JlYWR5IiwiZW50ZXIiLCJleGl0IiwiZnVsbCIsImluZGV4Q2hhbmdlIiwiaW5pdGlhbGl6ZSIsIm1vdXNlRG93biIsIm1vdXNlRW50ZXIiLCJtb3VzZUV4aXQiLCJtb3VzZVVwIiwicG9zdEV4ZWN1dGUiLCJwb3N0T3BlbiIsInBvc3RQcmludCIsInBvc3RTYXZlIiwicG9zdFNpZ24iLCJwb3N0U3VibWl0IiwicHJlRXhlY3V0ZSIsInByZU9wZW4iLCJwcmVQcmludCIsInByZVNhdmUiLCJwcmVTaWduIiwicHJlU3VibWl0IiwicmVhZHkiLCJ2YWxpZGF0aW9uU3RhdGUiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmxpc3Rlbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5saXN0ZW4sWyJyZWZPbmx5IiwicmVmQW5kRGVzY2VuZGVudHMiXSksdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy5yZWY9ZS5yZWZ8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmV4dHJhcz1udWxsLHRoaXMuZW5jcnlwdERhdGE9bnVsbCx0aGlzLmV4ZWN1dGU9bnVsbCx0aGlzLnNjcmlwdD1udWxsLHRoaXMuc2lnbkRhdGE9bnVsbCx0aGlzLnN1Ym1pdD1udWxsfX1jbGFzcyB2ZSBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJleERhdGEiKSx0aGlzLmNvbnRlbnRUeXBlPWUuY29udGVudFR5cGV8fCIiLHRoaXMuaHJlZj1lLmhyZWZ8fCIiLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5tYXhMZW5ndGg9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLm1heExlbmd0aCxkZWZhdWx0VmFsdWU6LTEsdmFsaWRhdGU6ZT0+ZT49LTF9KSx0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnJpZD1lLnJpZHx8IiIsdGhpcy50cmFuc2ZlckVuY29kaW5nPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnRyYW5zZmVyRW5jb2RpbmcsWyJub25lIiwiYmFzZTY0IiwicGFja2FnZSJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W24uJGlzQ0RBVEFYbWxdKCl7cmV0dXJuInRleHQvaHRtbCI9PT10aGlzLmNvbnRlbnRUeXBlfVtuLiRvbkNoaWxkXShlKXtyZXR1cm4oInRleHQvaHRtbCI9PT10aGlzLmNvbnRlbnRUeXBlJiZlW24uJG5hbWVzcGFjZUlkXT09PWEuTmFtZXNwYWNlSWRzLnhodG1sLmlkfHwidGV4dC94bWwiPT09dGhpcy5jb250ZW50VHlwZSkmJih0aGlzW24uJGNvbnRlbnRdPWUsITApfVtuLiR0b0hUTUxdKGUpe3JldHVybiJ0ZXh0L2h0bWwiPT09dGhpcy5jb250ZW50VHlwZSYmdGhpc1tuLiRjb250ZW50XT90aGlzW24uJGNvbnRlbnRdW24uJHRvSFRNTF0oZSk6Yy5IVE1MUmVzdWx0LkVNUFRZfX1jbGFzcyB4ZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImV4T2JqZWN0IiwhMCksdGhpcy5hcmNoaXZlPWUuYXJjaGl2ZXx8IiIsdGhpcy5jbGFzc0lkPWUuY2xhc3NJZHx8IiIsdGhpcy5jb2RlQmFzZT1lLmNvZGVCYXNlfHwiIix0aGlzLmNvZGVUeXBlPWUuY29kZVR5cGV8fCIiLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5ib29sZWFuPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRhdGVUaW1lPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGVjaW1hbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4T2JqZWN0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZmxvYXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5pbWFnZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmludGVnZXI9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy50ZXh0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGltZT1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3MgU2UgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJleGNsR3JvdXAiLCEwKSx0aGlzLmFjY2Vzcz0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5hY2Nlc3MsWyJvcGVuIiwibm9uSW50ZXJhY3RpdmUiLCJwcm90ZWN0ZWQiLCJyZWFkT25seSJdKSx0aGlzLmFjY2Vzc0tleT1lLmFjY2Vzc0tleXx8IiIsdGhpcy5hbmNob3JUeXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFuY2hvclR5cGUsWyJ0b3BMZWZ0IiwiYm90dG9tQ2VudGVyIiwiYm90dG9tTGVmdCIsImJvdHRvbVJpZ2h0IiwibWlkZGxlQ2VudGVyIiwibWlkZGxlTGVmdCIsIm1pZGRsZVJpZ2h0IiwidG9wQ2VudGVyIiwidG9wUmlnaHQiXSksdGhpcy5jb2xTcGFuPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5jb2xTcGFuLGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PmU+PTF8fC0xPT09ZX0pLHRoaXMuaD1lLmg/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5oKToiIix0aGlzLmhBbGlnbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5oQWxpZ24sWyJsZWZ0IiwiY2VudGVyIiwianVzdGlmeSIsImp1c3RpZnlBbGwiLCJyYWRpeCIsInJpZ2h0Il0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5sYXlvdXQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUubGF5b3V0LFsicG9zaXRpb24iLCJsci10YiIsInJsLXJvdyIsInJsLXRiIiwicm93IiwidGFibGUiLCJ0YiJdKSx0aGlzLm1heEg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5tYXhILCIwcHQiKSx0aGlzLm1heFc9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5tYXhXLCIwcHQiKSx0aGlzLm1pbkg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5taW5ILCIwcHQiKSx0aGlzLm1pblc9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5taW5XLCIwcHQiKSx0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnByZXNlbmNlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnByZXNlbmNlLFsidmlzaWJsZSIsImhpZGRlbiIsImluYWN0aXZlIiwiaW52aXNpYmxlIl0pLHRoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMudz1lLnc/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS53KToiIix0aGlzLng9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS54LCIwcHQiKSx0aGlzLnk9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS55LCIwcHQiKSx0aGlzLmFzc2lzdD1udWxsLHRoaXMuYmluZD1udWxsLHRoaXMuYm9yZGVyPW51bGwsdGhpcy5jYWxjdWxhdGU9bnVsbCx0aGlzLmNhcHRpb249bnVsbCx0aGlzLmRlc2M9bnVsbCx0aGlzLmV4dHJhcz1udWxsLHRoaXMubWFyZ2luPW51bGwsdGhpcy5wYXJhPW51bGwsdGhpcy50cmF2ZXJzYWw9bnVsbCx0aGlzLnZhbGlkYXRlPW51bGwsdGhpcy5jb25uZWN0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZXZlbnQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5maWVsZD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnNldFByb3BlcnR5PW5ldyBvLlhGQU9iamVjdEFycmF5fVtuLiRpc0JpbmRhYmxlXSgpe3JldHVybiEwfVtuLiRoYXNTZXR0YWJsZVZhbHVlXSgpe3JldHVybiEwfVtuLiRzZXRWYWx1ZV0oZSl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5maWVsZC5jaGlsZHJlbil7aWYoIXQudmFsdWUpe2NvbnN0IGU9bmV3IE50KHt9KTt0W24uJGFwcGVuZENoaWxkXShlKSx0LnZhbHVlPWV9dC52YWx1ZVtuLiRzZXRWYWx1ZV0oZSl9fVtuLiRpc1RoZXJlTW9yZVdpZHRoXSgpe3JldHVybiB0aGlzLmxheW91dC5lbmRzV2l0aCgiLXRiIikmJjA9PT10aGlzW24uJGV4dHJhXS5hdHRlbXB0JiZ0aGlzW24uJGV4dHJhXS5udW1iZXJJbkxpbmU+MHx8dGhpc1tuLiRnZXRQYXJlbnRdKClbbi4kaXNUaGVyZU1vcmVXaWR0aF0oKX1bbi4kaXNTcGxpdHRhYmxlXSgpe3ZhciBlO2NvbnN0IHQ9dGhpc1tuLiRnZXRTdWJmb3JtUGFyZW50XSgpO3JldHVybiEhdFtuLiRpc1NwbGl0dGFibGVdKCkmJih2b2lkIDAhPT10aGlzW24uJGV4dHJhXS5faXNTcGxpdHRhYmxlP3RoaXNbbi4kZXh0cmFdLl9pc1NwbGl0dGFibGU6InBvc2l0aW9uIj09PXRoaXMubGF5b3V0fHx0aGlzLmxheW91dC5pbmNsdWRlcygicm93Iik/KHRoaXNbbi4kZXh0cmFdLl9pc1NwbGl0dGFibGU9ITEsITEpOiEobnVsbCE9PShlPXQubGF5b3V0KSYmdm9pZCAwIT09ZSYmZS5lbmRzV2l0aCgiLXRiIikmJjAhPT10W24uJGV4dHJhXS5udW1iZXJJbkxpbmV8fCh0aGlzW24uJGV4dHJhXS5faXNTcGxpdHRhYmxlPSEwLDApKSl9W24uJGZsdXNoSFRNTF0oKXtyZXR1cm4oMCxpLmZsdXNoSFRNTCkodGhpcyl9W24uJGFkZEhUTUxdKGUsdCl7KDAsaS5hZGRIVE1MKSh0aGlzLGUsdCl9W24uJGdldEF2YWlsYWJsZVNwYWNlXSgpe3JldHVybigwLGkuZ2V0QXZhaWxhYmxlU3BhY2UpKHRoaXMpfVtuLiR0b0hUTUxdKGUpe2lmKEEodGhpcyksImhpZGRlbiI9PT10aGlzLnByZXNlbmNlfHwiaW5hY3RpdmUiPT09dGhpcy5wcmVzZW5jZXx8MD09PXRoaXMuaHx8MD09PXRoaXMudylyZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZOygwLHMuZml4RGltZW5zaW9ucykodGhpcyk7Y29uc3QgdD1bXSxyPXtpZDp0aGlzW24uJHVpZF0sY2xhc3M6W119OygwLHMuc2V0QWNjZXNzKSh0aGlzLHIuY2xhc3MpLHRoaXNbbi4kZXh0cmFdfHwodGhpc1tuLiRleHRyYV09T2JqZWN0LmNyZWF0ZShudWxsKSksT2JqZWN0LmFzc2lnbih0aGlzW24uJGV4dHJhXSx7Y2hpbGRyZW46dCxhdHRyaWJ1dGVzOnIsYXR0ZW1wdDowLGxpbmU6bnVsbCxudW1iZXJJbkxpbmU6MCxhdmFpbGFibGVTcGFjZTp7d2lkdGg6TWF0aC5taW4odGhpcy53fHwxLzAsZS53aWR0aCksaGVpZ2h0Ok1hdGgubWluKHRoaXMuaHx8MS8wLGUuaGVpZ2h0KX0sd2lkdGg6MCxoZWlnaHQ6MCxwcmV2SGVpZ2h0OjAsY3VycmVudFdpZHRoOjB9KTtjb25zdCBhPXRoaXNbbi4kaXNTcGxpdHRhYmxlXSgpO2lmKGF8fEYodGhpcyksISgwLGkuY2hlY2tEaW1lbnNpb25zKSh0aGlzLGUpKXJldHVybiBjLkhUTUxSZXN1bHQuRkFJTFVSRTtjb25zdCBvPW5ldyBTZXQoWyJmaWVsZCJdKTtpZih0aGlzLmxheW91dC5pbmNsdWRlcygicm93Iikpe2NvbnN0IGU9dGhpc1tuLiRnZXRTdWJmb3JtUGFyZW50XSgpLmNvbHVtbldpZHRocztBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD4wJiYodGhpc1tuLiRleHRyYV0uY29sdW1uV2lkdGhzPWUsdGhpc1tuLiRleHRyYV0uY3VycmVudENvbHVtbj0wKX1jb25zdCBsPSgwLHMudG9TdHlsZSkodGhpcywiYW5jaG9yVHlwZSIsImRpbWVuc2lvbnMiLCJwb3NpdGlvbiIsInByZXNlbmNlIiwiYm9yZGVyIiwibWFyZ2luIiwiaEFsaWduIiksaD1bInhmYUV4Y2xncm91cCJdLHU9KDAscy5sYXlvdXRDbGFzcykodGhpcyk7dSYmaC5wdXNoKHUpLCgwLHMuaXNQcmludE9ubHkpKHRoaXMpJiZoLnB1c2goInhmYVByaW50T25seSIpLHIuc3R5bGU9bCxyLmNsYXNzPWgsdGhpcy5uYW1lJiYoci54ZmFOYW1lPXRoaXMubmFtZSksdGhpc1tuLiRwdXNoUGFyYV0oKTtjb25zdCBkPSJsci10YiI9PT10aGlzLmxheW91dHx8InJsLXRiIj09PXRoaXMubGF5b3V0LGY9ZD8yOjE7Zm9yKDt0aGlzW24uJGV4dHJhXS5hdHRlbXB0PGY7dGhpc1tuLiRleHRyYV0uYXR0ZW1wdCsrKXtkJiYxPT09dGhpc1tuLiRleHRyYV0uYXR0ZW1wdCYmKHRoaXNbbi4kZXh0cmFdLm51bWJlckluTGluZT0wKTtjb25zdCBlPXRoaXNbbi4kY2hpbGRyZW5Ub0hUTUxdKHtmaWx0ZXI6byxpbmNsdWRlOiEwfSk7aWYoZS5zdWNjZXNzKWJyZWFrO2lmKGUuaXNCcmVhaygpKXJldHVybiB0aGlzW24uJHBvcFBhcmFdKCksZTtpZihkJiYwPT09dGhpc1tuLiRleHRyYV0uYXR0ZW1wdCYmMD09PXRoaXNbbi4kZXh0cmFdLm51bWJlckluTGluZSYmIXRoaXNbbi4kZ2V0VGVtcGxhdGVSb290XSgpW24uJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpe3RoaXNbbi4kZXh0cmFdLmF0dGVtcHQ9ZjticmVha319aWYodGhpc1tuLiRwb3BQYXJhXSgpLGF8fEkodGhpcyksdGhpc1tuLiRleHRyYV0uYXR0ZW1wdD09PWYpcmV0dXJuIGF8fGRlbGV0ZSB0aGlzW24uJGV4dHJhXSxjLkhUTUxSZXN1bHQuRkFJTFVSRTtsZXQgZz0wLHA9MDt0aGlzLm1hcmdpbiYmKGc9dGhpcy5tYXJnaW4ubGVmdEluc2V0K3RoaXMubWFyZ2luLnJpZ2h0SW5zZXQscD10aGlzLm1hcmdpbi50b3BJbnNldCt0aGlzLm1hcmdpbi5ib3R0b21JbnNldCk7Y29uc3QgbT1NYXRoLm1heCh0aGlzW24uJGV4dHJhXS53aWR0aCtnLHRoaXMud3x8MCksYj1NYXRoLm1heCh0aGlzW24uJGV4dHJhXS5oZWlnaHQrcCx0aGlzLmh8fDApLHk9W3RoaXMueCx0aGlzLnksbSxiXTsiIj09PXRoaXMudyYmKGwud2lkdGg9KDAscy5tZWFzdXJlVG9TdHJpbmcpKG0pKSwiIj09PXRoaXMuaCYmKGwuaGVpZ2h0PSgwLHMubWVhc3VyZVRvU3RyaW5nKShiKSk7Y29uc3Qgdz17bmFtZToiZGl2IixhdHRyaWJ1dGVzOnIsY2hpbGRyZW46dH07cmV0dXJuIGsodGhpcyxyKSxkZWxldGUgdGhpc1tuLiRleHRyYV0sYy5IVE1MUmVzdWx0LnN1Y2Nlc3MoKDAscy5jcmVhdGVXcmFwcGVyKSh0aGlzLHcpLHkpfX1jbGFzcyBBZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImV4ZWN1dGUiKSx0aGlzLmNvbm5lY3Rpb249ZS5jb25uZWN0aW9ufHwiIix0aGlzLmV4ZWN1dGVUeXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmV4ZWN1dGVUeXBlLFsiaW1wb3J0IiwicmVtZXJnZSJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucnVuQXQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucnVuQXQsWyJjbGllbnQiLCJib3RoIiwic2VydmVyIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3Mga2UgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJleHRyYXMiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmJvb2xlYW49bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5kYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZVRpbWU9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5kZWNpbWFsPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZXhEYXRhPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZXh0cmFzPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZmxvYXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5pbWFnZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmludGVnZXI9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy50ZXh0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGltZT1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3MgQ2UgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJmaWVsZCIsITApLHRoaXMuYWNjZXNzPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFjY2VzcyxbIm9wZW4iLCJub25JbnRlcmFjdGl2ZSIsInByb3RlY3RlZCIsInJlYWRPbmx5Il0pLHRoaXMuYWNjZXNzS2V5PWUuYWNjZXNzS2V5fHwiIix0aGlzLmFuY2hvclR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYW5jaG9yVHlwZSxbInRvcExlZnQiLCJib3R0b21DZW50ZXIiLCJib3R0b21MZWZ0IiwiYm90dG9tUmlnaHQiLCJtaWRkbGVDZW50ZXIiLCJtaWRkbGVMZWZ0IiwibWlkZGxlUmlnaHQiLCJ0b3BDZW50ZXIiLCJ0b3BSaWdodCJdKSx0aGlzLmNvbFNwYW49KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmNvbFNwYW4sZGVmYXVsdFZhbHVlOjEsdmFsaWRhdGU6ZT0+ZT49MXx8LTE9PT1lfSksdGhpcy5oPWUuaD8oMCxjLmdldE1lYXN1cmVtZW50KShlLmgpOiIiLHRoaXMuaEFsaWduPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhBbGlnbixbImxlZnQiLCJjZW50ZXIiLCJqdXN0aWZ5IiwianVzdGlmeUFsbCIsInJhZGl4IiwicmlnaHQiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmxvY2FsZT1lLmxvY2FsZXx8IiIsdGhpcy5tYXhIPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWF4SCwiMHB0IiksdGhpcy5tYXhXPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWF4VywiMHB0IiksdGhpcy5taW5IPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWluSCwiMHB0IiksdGhpcy5taW5XPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWluVywiMHB0IiksdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy5wcmVzZW5jZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmVzZW5jZSxbInZpc2libGUiLCJoaWRkZW4iLCJpbmFjdGl2ZSIsImludmlzaWJsZSJdKSx0aGlzLnJlbGV2YW50PSgwLGMuZ2V0UmVsZXZhbnQpKGUucmVsZXZhbnQpLHRoaXMucm90YXRlPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5yb3RhdGUsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+ZSU5MD09MH0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLnc9ZS53PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUudyk6IiIsdGhpcy54PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUueCwiMHB0IiksdGhpcy55PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUueSwiMHB0IiksdGhpcy5hc3Npc3Q9bnVsbCx0aGlzLmJpbmQ9bnVsbCx0aGlzLmJvcmRlcj1udWxsLHRoaXMuY2FsY3VsYXRlPW51bGwsdGhpcy5jYXB0aW9uPW51bGwsdGhpcy5kZXNjPW51bGwsdGhpcy5leHRyYXM9bnVsbCx0aGlzLmZvbnQ9bnVsbCx0aGlzLmZvcm1hdD1udWxsLHRoaXMuaXRlbXM9bmV3IG8uWEZBT2JqZWN0QXJyYXkoMiksdGhpcy5rZWVwPW51bGwsdGhpcy5tYXJnaW49bnVsbCx0aGlzLnBhcmE9bnVsbCx0aGlzLnRyYXZlcnNhbD1udWxsLHRoaXMudWk9bnVsbCx0aGlzLnZhbGlkYXRlPW51bGwsdGhpcy52YWx1ZT1udWxsLHRoaXMuYmluZEl0ZW1zPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY29ubmVjdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV2ZW50PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc2V0UHJvcGVydHk9bmV3IG8uWEZBT2JqZWN0QXJyYXl9W24uJGlzQmluZGFibGVdKCl7cmV0dXJuITB9W24uJHNldFZhbHVlXShlKXt2KHRoaXMsZSl9W24uJHRvSFRNTF0oZSl7dmFyIHQscjtpZihBKHRoaXMpLCF0aGlzLnVpKXtsZXQgZTtzd2l0Y2godGhpcy51aT1uZXcgUHQoe30pLHRoaXMudWlbbi4kZ2xvYmFsRGF0YV09dGhpc1tuLiRnbG9iYWxEYXRhXSx0aGlzW24uJGFwcGVuZENoaWxkXSh0aGlzLnVpKSx0aGlzLml0ZW1zLmNoaWxkcmVuLmxlbmd0aCl7Y2FzZSAwOmU9bmV3IE90KHt9KSx0aGlzLnVpLnRleHRFZGl0PWU7YnJlYWs7Y2FzZSAxOmU9bmV3IEsoe30pLHRoaXMudWkuY2hlY2tCdXR0b249ZTticmVhaztjYXNlIDI6ZT1uZXcgWSh7fSksdGhpcy51aS5jaG9pY2VMaXN0PWV9dGhpcy51aVtuLiRhcHBlbmRDaGlsZF0oZSl9aWYoIXRoaXMudWl8fCJoaWRkZW4iPT09dGhpcy5wcmVzZW5jZXx8ImluYWN0aXZlIj09PXRoaXMucHJlc2VuY2V8fDA9PT10aGlzLmh8fDA9PT10aGlzLncpcmV0dXJuIGMuSFRNTFJlc3VsdC5FTVBUWTt0aGlzLmNhcHRpb24mJmRlbGV0ZSB0aGlzLmNhcHRpb25bbi4kZXh0cmFdLHRoaXNbbi4kcHVzaFBhcmFdKCk7Y29uc3QgYT10aGlzLmNhcHRpb24/dGhpcy5jYXB0aW9uW24uJHRvSFRNTF0oZSkuaHRtbDpudWxsLG89dGhpcy53LGw9dGhpcy5oO2xldCB1PTAsZD0wO3RoaXMubWFyZ2luJiYodT10aGlzLm1hcmdpbi5sZWZ0SW5zZXQrdGhpcy5tYXJnaW4ucmlnaHRJbnNldCxkPXRoaXMubWFyZ2luLnRvcEluc2V0K3RoaXMubWFyZ2luLmJvdHRvbUluc2V0KTtsZXQgZj1udWxsO2lmKCIiPT09dGhpcy53fHwiIj09PXRoaXMuaCl7bGV0IHQ9bnVsbCxyPW51bGwsYT0wLGk9MDtpZih0aGlzLnVpLmNoZWNrQnV0dG9uKWE9aT10aGlzLnVpLmNoZWNrQnV0dG9uLnNpemU7ZWxzZXtjb25zdHt3OnQsaDpyfT0oMCxzLmxheW91dE5vZGUpKHRoaXMsZSk7bnVsbCE9PXQ/KGE9dCxpPXIpOmk9KDAsaC5nZXRNZXRyaWNzKSh0aGlzLmZvbnQsITApLmxpbmVOb0dhcH1pZihmPXkodGhpcy51aVtuLiRnZXRFeHRyYV0oKSksYSs9Zi53LGkrPWYuaCx0aGlzLmNhcHRpb24pe2NvbnN0e3c6cyxoOm8saXNCcm9rZW46bH09dGhpcy5jYXB0aW9uW24uJGdldEV4dHJhXShlKTtpZihsJiZ0aGlzW24uJGdldFN1YmZvcm1QYXJlbnRdKClbbi4kaXNUaGVyZU1vcmVXaWR0aF0oKSlyZXR1cm4gdGhpc1tuLiRwb3BQYXJhXSgpLGMuSFRNTFJlc3VsdC5GQUlMVVJFO3N3aXRjaCh0PXMscj1vLHRoaXMuY2FwdGlvbi5wbGFjZW1lbnQpe2Nhc2UibGVmdCI6Y2FzZSJyaWdodCI6Y2FzZSJpbmxpbmUiOnQrPWE7YnJlYWs7Y2FzZSJ0b3AiOmNhc2UiYm90dG9tIjpyKz1pfX1lbHNlIHQ9YSxyPWk7dCYmIiI9PT10aGlzLncmJih0Kz11LHRoaXMudz1NYXRoLm1pbih0aGlzLm1heFc8PTA/MS8wOnRoaXMubWF4Vyx0aGlzLm1pblcrMTx0P3Q6dGhpcy5taW5XKSksciYmIiI9PT10aGlzLmgmJihyKz1kLHRoaXMuaD1NYXRoLm1pbih0aGlzLm1heEg8PTA/MS8wOnRoaXMubWF4SCx0aGlzLm1pbkgrMTxyP3I6dGhpcy5taW5IKSl9aWYodGhpc1tuLiRwb3BQYXJhXSgpLCgwLHMuZml4RGltZW5zaW9ucykodGhpcyksRih0aGlzKSwhKDAsaS5jaGVja0RpbWVuc2lvbnMpKHRoaXMsZSkpcmV0dXJuIHRoaXMudz1vLHRoaXMuaD1sLHRoaXNbbi4kcG9wUGFyYV0oKSxjLkhUTUxSZXN1bHQuRkFJTFVSRTtJKHRoaXMpO2NvbnN0IGc9KDAscy50b1N0eWxlKSh0aGlzLCJmb250IiwiZGltZW5zaW9ucyIsInBvc2l0aW9uIiwicm90YXRlIiwiYW5jaG9yVHlwZSIsInByZXNlbmNlIiwibWFyZ2luIiwiaEFsaWduIik7KDAscy5zZXRNaW5NYXhEaW1lbnNpb25zKSh0aGlzLGcpO2NvbnN0IHA9WyJ4ZmFGaWVsZCJdO3RoaXMuZm9udCYmcC5wdXNoKCJ4ZmFGb250IiksKDAscy5pc1ByaW50T25seSkodGhpcykmJnAucHVzaCgieGZhUHJpbnRPbmx5Iik7Y29uc3QgbT17c3R5bGU6ZyxpZDp0aGlzW24uJHVpZF0sY2xhc3M6cH07Zy5tYXJnaW4mJihnLnBhZGRpbmc9Zy5tYXJnaW4sZGVsZXRlIGcubWFyZ2luKSwoMCxzLnNldEFjY2VzcykodGhpcyxwKSx0aGlzLm5hbWUmJihtLnhmYU5hbWU9dGhpcy5uYW1lKTtjb25zdCBiPVtdLHc9e25hbWU6ImRpdiIsYXR0cmlidXRlczptLGNoaWxkcmVuOmJ9O2sodGhpcyxtKTtjb25zdCB2PXRoaXMuYm9yZGVyP3RoaXMuYm9yZGVyW24uJHRvU3R5bGVdKCk6bnVsbCx4PSgwLHMuY29tcHV0ZUJib3gpKHRoaXMsdyxlKSxTPXRoaXMudWlbbi4kdG9IVE1MXSgpLmh0bWw7aWYoIVMpcmV0dXJuIE9iamVjdC5hc3NpZ24oZyx2KSxjLkhUTUxSZXN1bHQuc3VjY2VzcygoMCxzLmNyZWF0ZVdyYXBwZXIpKHRoaXMsdykseCk7dGhpc1tuLiR0YWJJbmRleF0mJihudWxsIT09KHQ9Uy5jaGlsZHJlbikmJnZvaWQgMCE9PXQmJnRbMF0/Uy5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLnRhYmluZGV4PXRoaXNbbi4kdGFiSW5kZXhdOlMuYXR0cmlidXRlcy50YWJpbmRleD10aGlzW24uJHRhYkluZGV4XSksUy5hdHRyaWJ1dGVzLnN0eWxlfHwoUy5hdHRyaWJ1dGVzLnN0eWxlPU9iamVjdC5jcmVhdGUobnVsbCkpO2xldCBDPW51bGw7aWYodGhpcy51aS5idXR0b24/KDE9PT1TLmNoaWxkcmVuLmxlbmd0aCYmKFtDXT1TLmNoaWxkcmVuLnNwbGljZSgwLDEpKSxPYmplY3QuYXNzaWduKFMuYXR0cmlidXRlcy5zdHlsZSx2KSk6T2JqZWN0LmFzc2lnbihnLHYpLGIucHVzaChTKSx0aGlzLnZhbHVlKWlmKHRoaXMudWkuaW1hZ2VFZGl0KVMuY2hpbGRyZW4ucHVzaCh0aGlzLnZhbHVlW24uJHRvSFRNTF0oKS5odG1sKTtlbHNlIGlmKCF0aGlzLnVpLmJ1dHRvbil7dmFyIE87bGV0IGU9IiI7aWYodGhpcy52YWx1ZS5leERhdGEpZT10aGlzLnZhbHVlLmV4RGF0YVtuLiR0ZXh0XSgpO2Vsc2UgaWYodGhpcy52YWx1ZS50ZXh0KWU9dGhpcy52YWx1ZS50ZXh0W24uJGdldEV4dHJhXSgpO2Vsc2V7Y29uc3QgdD10aGlzLnZhbHVlW24uJHRvSFRNTF0oKS5odG1sO251bGwhPT10JiYoZT10LmNoaWxkcmVuWzBdLnZhbHVlKX10aGlzLnVpLnRleHRFZGl0JiYobnVsbD09PShPPXRoaXMudmFsdWUudGV4dCl8fHZvaWQgMD09PU8/dm9pZCAwOk8ubWF4Q2hhcnMpJiYoUy5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLm1heExlbmd0aD10aGlzLnZhbHVlLnRleHQubWF4Q2hhcnMpLGUmJih0aGlzLnVpLm51bWVyaWNFZGl0JiYoZT1wYXJzZUZsb2F0KGUpLGU9aXNOYU4oZSk/IiI6ZS50b1N0cmluZygpKSwidGV4dGFyZWEiPT09Uy5jaGlsZHJlblswXS5uYW1lP1MuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy50ZXh0Q29udGVudD1lOlMuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy52YWx1ZT1lKX1pZighdGhpcy51aS5pbWFnZUVkaXQmJm51bGwhPT0ocj1TLmNoaWxkcmVuKSYmdm9pZCAwIT09ciYmclswXSYmdGhpcy5oKXtmPWZ8fHkodGhpcy51aVtuLiRnZXRFeHRyYV0oKSk7bGV0IHQ9MDtpZih0aGlzLmNhcHRpb24mJlsidG9wIiwiYm90dG9tIl0uaW5jbHVkZXModGhpcy5jYXB0aW9uLnBsYWNlbWVudCkpe3Q9dGhpcy5jYXB0aW9uLnJlc2VydmUsdDw9MCYmKHQ9dGhpcy5jYXB0aW9uW24uJGdldEV4dHJhXShlKS5oKTtjb25zdCByPXRoaXMuaC10LWQtZi5oO1MuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy5zdHlsZS5oZWlnaHQ9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHIpfWVsc2UgUy5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLnN0eWxlLmhlaWdodD0iMTAwJSJ9aWYoQyYmUy5jaGlsZHJlbi5wdXNoKEMpLCFhKXJldHVybiBTLmF0dHJpYnV0ZXMuY2xhc3MmJlMuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFMZWZ0IiksdGhpcy53PW8sdGhpcy5oPWwsYy5IVE1MUmVzdWx0LnN1Y2Nlc3MoKDAscy5jcmVhdGVXcmFwcGVyKSh0aGlzLHcpLHgpO2lmKHRoaXMudWkuYnV0dG9uKXJldHVybiBnLnBhZGRpbmcmJmRlbGV0ZSBnLnBhZGRpbmcsImRpdiI9PT1hLm5hbWUmJihhLm5hbWU9InNwYW4iKSxTLmNoaWxkcmVuLnB1c2goYSksYy5IVE1MUmVzdWx0LnN1Y2Nlc3Modyx4KTtzd2l0Y2godGhpcy51aS5jaGVja0J1dHRvbiYmKGEuYXR0cmlidXRlcy5jbGFzc1swXT0ieGZhQ2FwdGlvbkZvckNoZWNrQnV0dG9uIiksUy5hdHRyaWJ1dGVzLmNsYXNzfHwoUy5hdHRyaWJ1dGVzLmNsYXNzPVtdKSxTLmNoaWxkcmVuLnNwbGljZSgwLDAsYSksdGhpcy5jYXB0aW9uLnBsYWNlbWVudCl7Y2FzZSJsZWZ0IjpjYXNlImlubGluZSI6Uy5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYUxlZnQiKTticmVhaztjYXNlInJpZ2h0IjpTLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhUmlnaHQiKTticmVhaztjYXNlInRvcCI6Uy5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYVRvcCIpO2JyZWFrO2Nhc2UiYm90dG9tIjpTLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhQm90dG9tIil9cmV0dXJuIHRoaXMudz1vLHRoaXMuaD1sLGMuSFRNTFJlc3VsdC5zdWNjZXNzKCgwLHMuY3JlYXRlV3JhcHBlcikodGhpcyx3KSx4KX19dC5GaWVsZD1DZTtjbGFzcyBPZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImZpbGwiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucHJlc2VuY2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJlc2VuY2UsWyJ2aXNpYmxlIiwiaGlkZGVuIiwiaW5hY3RpdmUiLCJpbnZpc2libGUiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuY29sb3I9bnVsbCx0aGlzLmV4dHJhcz1udWxsLHRoaXMubGluZWFyPW51bGwsdGhpcy5wYXR0ZXJuPW51bGwsdGhpcy5yYWRpYWw9bnVsbCx0aGlzLnNvbGlkPW51bGwsdGhpcy5zdGlwcGxlPW51bGx9W24uJHRvU3R5bGVdKCl7dmFyIGU7Y29uc3QgdD10aGlzW24uJGdldFBhcmVudF0oKSxyPXRbbi4kZ2V0UGFyZW50XSgpW24uJGdldFBhcmVudF0oKSxhPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IGk9ImNvbG9yIixzPWk7dCBpbnN0YW5jZW9mIFUmJihpPSJiYWNrZ3JvdW5kLWNvbG9yIixzPSJiYWNrZ3JvdW5kIixyIGluc3RhbmNlb2YgUHQmJihhLmJhY2tncm91bmRDb2xvcj0id2hpdGUiKSksKHQgaW5zdGFuY2VvZiBsdHx8dCBpbnN0YW5jZW9mIFApJiYoaT1zPSJmaWxsIixhLmZpbGw9IndoaXRlIik7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2lmKCJleHRyYXMiPT09ZXx8ImNvbG9yIj09PWUpY29udGludWU7Y29uc3QgdD10aGlzW2VdO2lmKCEodCBpbnN0YW5jZW9mIG8uWEZBT2JqZWN0KSljb250aW51ZTtjb25zdCByPXRbbi4kdG9TdHlsZV0odGhpcy5jb2xvcik7cmV0dXJuIHImJihhW3Iuc3RhcnRzV2l0aCgiIyIpP2k6c109ciksYX1pZihudWxsIT09KGU9dGhpcy5jb2xvcikmJnZvaWQgMCE9PWUmJmUudmFsdWUpe2NvbnN0IGU9dGhpcy5jb2xvcltuLiR0b1N0eWxlXSgpO2FbZS5zdGFydHNXaXRoKCIjIik/aTpzXT1lfXJldHVybiBhfX1jbGFzcyBGZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImZpbHRlciIsITApLHRoaXMuYWRkUmV2b2NhdGlvbkluZm89KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYWRkUmV2b2NhdGlvbkluZm8sWyIiLCJyZXF1aXJlZCIsIm9wdGlvbmFsIiwibm9uZSJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLnZlcnNpb249KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTp0aGlzLnZlcnNpb24sZGVmYXVsdFZhbHVlOjUsdmFsaWRhdGU6ZT0+ZT49MSYmZTw9NX0pLHRoaXMuYXBwZWFyYW5jZUZpbHRlcj1udWxsLHRoaXMuY2VydGlmaWNhdGVzPW51bGwsdGhpcy5kaWdlc3RNZXRob2RzPW51bGwsdGhpcy5lbmNvZGluZ3M9bnVsbCx0aGlzLmVuY3J5cHRpb25NZXRob2RzPW51bGwsdGhpcy5oYW5kbGVyPW51bGwsdGhpcy5sb2NrRG9jdW1lbnQ9bnVsbCx0aGlzLm1kcD1udWxsLHRoaXMucmVhc29ucz1udWxsLHRoaXMudGltZVN0YW1wPW51bGx9fWNsYXNzIEllIGV4dGVuZHMgby5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImZsb2F0IiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W24uJGZpbmFsaXplXSgpe2NvbnN0IGU9cGFyc2VGbG9hdCh0aGlzW24uJGNvbnRlbnRdLnRyaW0oKSk7dGhpc1tuLiRjb250ZW50XT1pc05hTihlKT9udWxsOmV9W24uJHRvSFRNTF0oZSl7cmV0dXJuIE8obnVsbCE9PXRoaXNbbi4kY29udGVudF0/dGhpc1tuLiRjb250ZW50XS50b1N0cmluZygpOiIiKX19Y2xhc3MgVGUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJmb250IiwhMCksdGhpcy5iYXNlbGluZVNoaWZ0PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUuYmFzZWxpbmVTaGlmdCksdGhpcy5mb250SG9yaXpvbnRhbFNjYWxlPSgwLGMuZ2V0RmxvYXQpKHtkYXRhOmUuZm9udEhvcml6b250YWxTY2FsZSxkZWZhdWx0VmFsdWU6MTAwLHZhbGlkYXRlOmU9PmU+PTB9KSx0aGlzLmZvbnRWZXJ0aWNhbFNjYWxlPSgwLGMuZ2V0RmxvYXQpKHtkYXRhOmUuZm9udFZlcnRpY2FsU2NhbGUsZGVmYXVsdFZhbHVlOjEwMCx2YWxpZGF0ZTplPT5lPj0wfSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmtlcm5pbmdNb2RlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmtlcm5pbmdNb2RlLFsibm9uZSIsInBhaXIiXSksdGhpcy5sZXR0ZXJTcGFjaW5nPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubGV0dGVyU3BhY2luZywiMCIpLHRoaXMubGluZVRocm91Z2g9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmxpbmVUaHJvdWdoLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfHwyPT09ZX0pLHRoaXMubGluZVRocm91Z2hQZXJpb2Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUubGluZVRocm91Z2hQZXJpb2QsWyJhbGwiLCJ3b3JkIl0pLHRoaXMub3ZlcmxpbmU9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLm92ZXJsaW5lLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfHwyPT09ZX0pLHRoaXMub3ZlcmxpbmVQZXJpb2Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUub3ZlcmxpbmVQZXJpb2QsWyJhbGwiLCJ3b3JkIl0pLHRoaXMucG9zdHVyZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wb3N0dXJlLFsibm9ybWFsIiwiaXRhbGljIl0pLHRoaXMuc2l6ZT0oMCxjLmdldE1lYXN1cmVtZW50KShlLnNpemUsIjEwcHQiKSx0aGlzLnR5cGVmYWNlPWUudHlwZWZhY2V8fCJDb3VyaWVyIix0aGlzLnVuZGVybGluZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUudW5kZXJsaW5lLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfHwyPT09ZX0pLHRoaXMudW5kZXJsaW5lUGVyaW9kPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnVuZGVybGluZVBlcmlvZCxbImFsbCIsIndvcmQiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMud2VpZ2h0PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLndlaWdodCxbIm5vcm1hbCIsImJvbGQiXSksdGhpcy5leHRyYXM9bnVsbCx0aGlzLmZpbGw9bnVsbH1bbi4kY2xlYW5dKGUpe3N1cGVyW24uJGNsZWFuXShlKSx0aGlzW24uJGdsb2JhbERhdGFdLnVzZWRUeXBlZmFjZXMuYWRkKHRoaXMudHlwZWZhY2UpfVtuLiR0b1N0eWxlXSgpe2NvbnN0IGU9KDAscy50b1N0eWxlKSh0aGlzLCJmaWxsIiksdD1lLmNvbG9yO3JldHVybiB0JiYoIiMwMDAwMDAiPT09dD9kZWxldGUgZS5jb2xvcjp0LnN0YXJ0c1dpdGgoIiMiKXx8KGUuYmFja2dyb3VuZD10LGUuYmFja2dyb3VuZENsaXA9InRleHQiLGUuY29sb3I9InRyYW5zcGFyZW50IikpLHRoaXMuYmFzZWxpbmVTaGlmdCYmKGUudmVydGljYWxBbGlnbj0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5iYXNlbGluZVNoaWZ0KSksZS5mb250S2VybmluZz0ibm9uZSI9PT10aGlzLmtlcm5pbmdNb2RlPyJub25lIjoibm9ybWFsIixlLmxldHRlclNwYWNpbmc9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMubGV0dGVyU3BhY2luZyksMCE9PXRoaXMubGluZVRocm91Z2gmJihlLnRleHREZWNvcmF0aW9uPSJsaW5lLXRocm91Z2giLDI9PT10aGlzLmxpbmVUaHJvdWdoJiYoZS50ZXh0RGVjb3JhdGlvblN0eWxlPSJkb3VibGUiKSksMCE9PXRoaXMub3ZlcmxpbmUmJihlLnRleHREZWNvcmF0aW9uPSJvdmVybGluZSIsMj09PXRoaXMub3ZlcmxpbmUmJihlLnRleHREZWNvcmF0aW9uU3R5bGU9ImRvdWJsZSIpKSxlLmZvbnRTdHlsZT10aGlzLnBvc3R1cmUsZS5mb250U2l6ZT0oMCxzLm1lYXN1cmVUb1N0cmluZykoLjk5KnRoaXMuc2l6ZSksKDAscy5zZXRGb250RmFtaWx5KSh0aGlzLHRoaXMsdGhpc1tuLiRnbG9iYWxEYXRhXS5mb250RmluZGVyLGUpLDAhPT10aGlzLnVuZGVybGluZSYmKGUudGV4dERlY29yYXRpb249InVuZGVybGluZSIsMj09PXRoaXMudW5kZXJsaW5lJiYoZS50ZXh0RGVjb3JhdGlvblN0eWxlPSJkb3VibGUiKSksZS5mb250V2VpZ2h0PXRoaXMud2VpZ2h0LGV9fWNsYXNzIE1lIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZm9ybWF0IiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbCx0aGlzLnBpY3R1cmU9bnVsbH19Y2xhc3MgRWUgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJoYW5kbGVyIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBQZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImh5cGhlbmF0aW9uIiksdGhpcy5leGNsdWRlQWxsQ2Fwcz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZXhjbHVkZUFsbENhcHMsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLmV4Y2x1ZGVJbml0aWFsQ2FwPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5leGNsdWRlSW5pdGlhbENhcCxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4xPT09ZX0pLHRoaXMuaHlwaGVuYXRlPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5oeXBoZW5hdGUsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucHVzaENoYXJhY3RlckNvdW50PSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5wdXNoQ2hhcmFjdGVyQ291bnQsZGVmYXVsdFZhbHVlOjMsdmFsaWRhdGU6ZT0+ZT49MH0pLHRoaXMucmVtYWluQ2hhcmFjdGVyQ291bnQ9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnJlbWFpbkNoYXJhY3RlckNvdW50LGRlZmF1bHRWYWx1ZTozLHZhbGlkYXRlOmU9PmU+PTB9KSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy53b3JkQ2hhcmFjdGVyQ291bnQ9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLndvcmRDaGFyYWN0ZXJDb3VudCxkZWZhdWx0VmFsdWU6Nyx2YWxpZGF0ZTplPT5lPj0wfSl9fWNsYXNzIFJlIGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiaW1hZ2UiKSx0aGlzLmFzcGVjdD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5hc3BlY3QsWyJmaXQiLCJhY3R1YWwiLCJoZWlnaHQiLCJub25lIiwid2lkdGgiXSksdGhpcy5jb250ZW50VHlwZT1lLmNvbnRlbnRUeXBlfHwiIix0aGlzLmhyZWY9ZS5ocmVmfHwiIix0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudHJhbnNmZXJFbmNvZGluZz0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50cmFuc2ZlckVuY29kaW5nLFsiYmFzZTY0Iiwibm9uZSIsInBhY2thZ2UiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifVtuLiR0b0hUTUxdKCl7aWYodGhpcy5jb250ZW50VHlwZSYmIW0uaGFzKHRoaXMuY29udGVudFR5cGUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIGMuSFRNTFJlc3VsdC5FTVBUWTtsZXQgZT10aGlzW24uJGdsb2JhbERhdGFdLmltYWdlcyYmdGhpc1tuLiRnbG9iYWxEYXRhXS5pbWFnZXMuZ2V0KHRoaXMuaHJlZik7aWYoIWUmJih0aGlzLmhyZWZ8fCF0aGlzW24uJGNvbnRlbnRdKSlyZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZO2lmKGV8fCJiYXNlNjQiIT09dGhpcy50cmFuc2ZlckVuY29kaW5nfHwoZT0oMCxsLnN0cmluZ1RvQnl0ZXMpKGF0b2IodGhpc1tuLiRjb250ZW50XSkpKSwhZSlyZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZO2lmKCF0aGlzLmNvbnRlbnRUeXBlKXtmb3IoY29uc3RbdCxyXW9mIGIpaWYoZS5sZW5ndGg+dC5sZW5ndGgmJnQuZXZlcnkoKCh0LHIpPT50PT09ZVtyXSkpKXt0aGlzLmNvbnRlbnRUeXBlPXI7YnJlYWt9aWYoIXRoaXMuY29udGVudFR5cGUpcmV0dXJuIGMuSFRNTFJlc3VsdC5FTVBUWX1jb25zdCB0PW5ldyBCbG9iKFtlXSx7dHlwZTp0aGlzLmNvbnRlbnRUeXBlfSk7bGV0IHI7c3dpdGNoKHRoaXMuYXNwZWN0KXtjYXNlImZpdCI6Y2FzZSJhY3R1YWwiOmJyZWFrO2Nhc2UiaGVpZ2h0IjpyPXtoZWlnaHQ6IjEwMCUiLG9iamVjdEZpdDoiZmlsbCJ9O2JyZWFrO2Nhc2Uibm9uZSI6cj17d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsb2JqZWN0Rml0OiJmaWxsIn07YnJlYWs7Y2FzZSJ3aWR0aCI6cj17d2lkdGg6IjEwMCUiLG9iamVjdEZpdDoiZmlsbCJ9fWNvbnN0IGE9dGhpc1tuLiRnZXRQYXJlbnRdKCk7cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJpbWciLGF0dHJpYnV0ZXM6e2NsYXNzOlsieGZhSW1hZ2UiXSxzdHlsZTpyLHNyYzpVUkwuY3JlYXRlT2JqZWN0VVJMKHQpLGFsdDphP0MoYVtuLiRnZXRQYXJlbnRdKCkpOm51bGx9fSl9fWNsYXNzIE5lIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiaW1hZ2VFZGl0IiwhMCksdGhpcy5kYXRhPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmRhdGEsWyJsaW5rIiwiZW1iZWQiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5ib3JkZXI9bnVsbCx0aGlzLmV4dHJhcz1udWxsLHRoaXMubWFyZ2luPW51bGx9W24uJHRvSFRNTF0oZSl7cmV0dXJuImVtYmVkIj09PXRoaXMuZGF0YT9jLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixjaGlsZHJlbjpbXSxhdHRyaWJ1dGVzOnt9fSk6Yy5IVE1MUmVzdWx0LkVNUFRZfX1jbGFzcyBEZSBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJpbnRlZ2VyIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W24uJGZpbmFsaXplXSgpe2NvbnN0IGU9cGFyc2VJbnQodGhpc1tuLiRjb250ZW50XS50cmltKCksMTApO3RoaXNbbi4kY29udGVudF09aXNOYU4oZSk/bnVsbDplfVtuLiR0b0hUTUxdKGUpe3JldHVybiBPKG51bGwhPT10aGlzW24uJGNvbnRlbnRdP3RoaXNbbi4kY29udGVudF0udG9TdHJpbmcoKToiIil9fWNsYXNzIEJlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiaXNzdWVycyIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNlcnRpZmljYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBMZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsIml0ZW1zIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnByZXNlbmNlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnByZXNlbmNlLFsidmlzaWJsZSIsImhpZGRlbiIsImluYWN0aXZlIiwiaW52aXNpYmxlIl0pLHRoaXMucmVmPWUucmVmfHwiIix0aGlzLnNhdmU9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnNhdmUsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5ib29sZWFuPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRhdGVUaW1lPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGVjaW1hbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZsb2F0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuaW1hZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5pbnRlZ2VyPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGV4dD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnRpbWU9bmV3IG8uWEZBT2JqZWN0QXJyYXl9W24uJHRvSFRNTF0oKXtjb25zdCBlPVtdO2Zvcihjb25zdCB0IG9mIHRoaXNbbi4kZ2V0Q2hpbGRyZW5dKCkpZS5wdXNoKHRbbi4kdGV4dF0oKSk7cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKGUpfX10Lkl0ZW1zPUxlO2NsYXNzIF9lIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwia2VlcCIsITApLHRoaXMuaWQ9ZS5pZHx8IiI7Y29uc3QgdD1bIm5vbmUiLCJjb250ZW50QXJlYSIsInBhZ2VBcmVhIl07dGhpcy5pbnRhY3Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaW50YWN0LHQpLHRoaXMubmV4dD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5uZXh0LHQpLHRoaXMucHJldmlvdXM9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJldmlvdXMsdCksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuZXh0cmFzPW51bGx9fWNsYXNzIGplIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwia2V5VXNhZ2UiKTtjb25zdCB0PVsiIiwieWVzIiwibm8iXTt0aGlzLmNybFNpZ249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuY3JsU2lnbix0KSx0aGlzLmRhdGFFbmNpcGhlcm1lbnQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuZGF0YUVuY2lwaGVybWVudCx0KSx0aGlzLmRlY2lwaGVyT25seT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5kZWNpcGhlck9ubHksdCksdGhpcy5kaWdpdGFsU2lnbmF0dXJlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmRpZ2l0YWxTaWduYXR1cmUsdCksdGhpcy5lbmNpcGhlck9ubHk9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuZW5jaXBoZXJPbmx5LHQpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5rZXlBZ3JlZW1lbnQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUua2V5QWdyZWVtZW50LHQpLHRoaXMua2V5Q2VydFNpZ249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUua2V5Q2VydFNpZ24sdCksdGhpcy5rZXlFbmNpcGhlcm1lbnQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUua2V5RW5jaXBoZXJtZW50LHQpLHRoaXMubm9uUmVwdWRpYXRpb249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUubm9uUmVwdWRpYXRpb24sdCksdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgVWUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJsaW5lIiwhMCksdGhpcy5oYW5kPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhhbmQsWyJldmVuIiwibGVmdCIsInJpZ2h0Il0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5zbG9wZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5zbG9wZSxbIlxcIiwiLyJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5lZGdlPW51bGx9W24uJHRvSFRNTF0oKXtjb25zdCBlPXRoaXNbbi4kZ2V0UGFyZW50XSgpW24uJGdldFBhcmVudF0oKSx0PXRoaXMuZWRnZXx8bmV3IHVlKHt9KSxyPXRbbi4kdG9TdHlsZV0oKSxhPU9iamVjdC5jcmVhdGUobnVsbCksaT0idmlzaWJsZSI9PT10LnByZXNlbmNlP3QudGhpY2tuZXNzOjA7YS5zdHJva2VXaWR0aD0oMCxzLm1lYXN1cmVUb1N0cmluZykoaSksYS5zdHJva2U9ci5jb2xvcjtsZXQgbyxsLGgsdSxkPSIxMDAlIixmPSIxMDAlIjtlLnc8PWk/KFtvLGwsaCx1XT1bIjUwJSIsMCwiNTAlIiwiMTAwJSJdLGQ9YS5zdHJva2VXaWR0aCk6ZS5oPD1pPyhbbyxsLGgsdV09WzAsIjUwJSIsIjEwMCUiLCI1MCUiXSxmPWEuc3Ryb2tlV2lkdGgpOiJcXCI9PT10aGlzLnNsb3BlP1tvLGwsaCx1XT1bMCwwLCIxMDAlIiwiMTAwJSJdOltvLGwsaCx1XT1bMCwiMTAwJSIsIjEwMCUiLDBdO2NvbnN0IHA9e25hbWU6InN2ZyIsY2hpbGRyZW46W3tuYW1lOiJsaW5lIixhdHRyaWJ1dGVzOnt4bWxuczpnLHgxOm8seTE6bCx4MjpoLHkyOnUsc3R5bGU6YX19XSxhdHRyaWJ1dGVzOnt4bWxuczpnLHdpZHRoOmQsaGVpZ2h0OmYsc3R5bGU6e292ZXJmbG93OiJ2aXNpYmxlIn19fTtyZXR1cm4gdyhlKT9jLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixhdHRyaWJ1dGVzOntzdHlsZTp7ZGlzcGxheToiaW5saW5lIix3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIn19LGNoaWxkcmVuOltwXX0pOihwLmF0dHJpYnV0ZXMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLkhUTUxSZXN1bHQuc3VjY2VzcyhwKSl9fWNsYXNzICRlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibGluZWFyIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbInRvUmlnaHQiLCJ0b0JvdHRvbSIsInRvTGVmdCIsInRvVG9wIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNvbG9yPW51bGwsdGhpcy5leHRyYXM9bnVsbH1bbi4kdG9TdHlsZV0oZSl7cmV0dXJuIGU9ZT9lW24uJHRvU3R5bGVdKCk6IiNGRkZGRkYiLCJsaW5lYXItZ3JhZGllbnQoIi5jb25jYXQodGhpcy50eXBlLnJlcGxhY2UoLyhbUkJMVF0pLywiICQxIikudG9Mb3dlckNhc2UoKSwiLCAiKS5jb25jYXQoZSwiLCAiKS5jb25jYXQodGhpcy5jb2xvcj90aGlzLmNvbG9yW24uJHRvU3R5bGVdKCk6IiMwMDAwMDAiLCIpIil9fWNsYXNzIFhlIGV4dGVuZHMgby5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImxvY2tEb2N1bWVudCIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn1bbi4kZmluYWxpemVdKCl7dGhpc1tuLiRjb250ZW50XT0oMCxjLmdldFN0cmluZ09wdGlvbikodGhpc1tuLiRjb250ZW50XSxbImF1dG8iLCIwIiwiMSJdKX19Y2xhc3MgSGUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJtYW5pZmVzdCIsITApLHRoaXMuYWN0aW9uPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFjdGlvbixbImluY2x1ZGUiLCJhbGwiLCJleGNsdWRlIl0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5yZWY9bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIHFlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibWFyZ2luIiwhMCksdGhpcy5ib3R0b21JbnNldD0oMCxjLmdldE1lYXN1cmVtZW50KShlLmJvdHRvbUluc2V0LCIwIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmxlZnRJbnNldD0oMCxjLmdldE1lYXN1cmVtZW50KShlLmxlZnRJbnNldCwiMCIpLHRoaXMucmlnaHRJbnNldD0oMCxjLmdldE1lYXN1cmVtZW50KShlLnJpZ2h0SW5zZXQsIjAiKSx0aGlzLnRvcEluc2V0PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUudG9wSW5zZXQsIjAiKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbH1bbi4kdG9TdHlsZV0oKXtyZXR1cm57bWFyZ2luOigwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnRvcEluc2V0KSsiICIrKDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMucmlnaHRJbnNldCkrIiAiKygwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLmJvdHRvbUluc2V0KSsiICIrKDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMubGVmdEluc2V0KX19fWNsYXNzIHplIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibWRwIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnBlcm1pc3Npb25zPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5wZXJtaXNzaW9ucyxkZWZhdWx0VmFsdWU6Mix2YWxpZGF0ZTplPT4xPT09ZXx8Mz09PWV9KSx0aGlzLnNpZ25hdHVyZVR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuc2lnbmF0dXJlVHlwZSxbImZpbGxlciIsImF1dGhvciJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIEdlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibWVkaXVtIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmltYWdpbmdCQm94PSgwLGMuZ2V0QkJveCkoZS5pbWFnaW5nQkJveCksdGhpcy5sb25nPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubG9uZyksdGhpcy5vcmllbnRhdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5vcmllbnRhdGlvbixbInBvcnRyYWl0IiwibGFuZHNjYXBlIl0pLHRoaXMuc2hvcnQ9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5zaG9ydCksdGhpcy5zdG9jaz1lLnN0b2NrfHwiIix0aGlzLnRyYXlJbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50cmF5SW4sWyJhdXRvIiwiZGVsZWdhdGUiLCJwYWdlRnJvbnQiXSksdGhpcy50cmF5T3V0PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnRyYXlPdXQsWyJhdXRvIiwiZGVsZWdhdGUiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBXZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsIm1lc3NhZ2UiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLnRleHQ9bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIFZlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibnVtZXJpY0VkaXQiLCEwKSx0aGlzLmhTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaFNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmJvcmRlcj1udWxsLHRoaXMuY29tYj1udWxsLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5tYXJnaW49bnVsbH1bbi4kdG9IVE1MXShlKXt2YXIgdDtjb25zdCByPSgwLHMudG9TdHlsZSkodGhpcywiYm9yZGVyIiwiZm9udCIsIm1hcmdpbiIpLGE9dGhpc1tuLiRnZXRQYXJlbnRdKClbbi4kZ2V0UGFyZW50XSgpLGk9e25hbWU6ImlucHV0IixhdHRyaWJ1dGVzOnt0eXBlOiJ0ZXh0IixmaWVsZElkOmFbbi4kdWlkXSxkYXRhSWQ6KG51bGw9PT0odD1hW24uJGRhdGFdKXx8dm9pZCAwPT09dD92b2lkIDA6dFtuLiR1aWRdKXx8YVtuLiR1aWRdLGNsYXNzOlsieGZhVGV4dGZpZWxkIl0sc3R5bGU6ciwiYXJpYS1sYWJlbCI6QyhhKSwiYXJpYS1yZXF1aXJlZCI6ITF9fTtyZXR1cm4gUyhhKSYmKGkuYXR0cmlidXRlc1siYXJpYS1yZXF1aXJlZCJdPSEwLGkuYXR0cmlidXRlcy5yZXF1aXJlZD0hMCksYy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImxhYmVsIixhdHRyaWJ1dGVzOntjbGFzczpbInhmYUxhYmVsIl19LGNoaWxkcmVuOltpXX0pfX1jbGFzcyBLZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsIm9jY3VyIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmluaXRpYWw9IiIhPT1lLmluaXRpYWw/KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmluaXRpYWwsZGVmYXVsdFZhbHVlOiIiLHZhbGlkYXRlOmU9PiEwfSk6IiIsdGhpcy5tYXg9IiIhPT1lLm1heD8oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubWF4LGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PiEwfSk6IiIsdGhpcy5taW49IiIhPT1lLm1pbj8oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubWluLGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PiEwfSk6IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuZXh0cmFzPW51bGx9W24uJGNsZWFuXSgpe2NvbnN0IGU9dGhpc1tuLiRnZXRQYXJlbnRdKCksdD10aGlzLm1pbjsiIj09PXRoaXMubWluJiYodGhpcy5taW49ZSBpbnN0YW5jZW9mIFFlfHxlIGluc3RhbmNlb2YgZXQ/MDoxKSwiIj09PXRoaXMubWF4JiYodGhpcy5tYXg9IiI9PT10P2UgaW5zdGFuY2VvZiBRZXx8ZSBpbnN0YW5jZW9mIGV0Py0xOjE6dGhpcy5taW4pLC0xIT09dGhpcy5tYXgmJnRoaXMubWF4PHRoaXMubWluJiYodGhpcy5tYXg9dGhpcy5taW4pLCIiPT09dGhpcy5pbml0aWFsJiYodGhpcy5pbml0aWFsPWUgaW5zdGFuY2VvZiBrdD8xOnRoaXMubWluKX19Y2xhc3MgWWUgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJvaWQiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgSmUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJvaWRzIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMub2lkPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBaZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsIm92ZXJmbG93IiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmxlYWRlcj1lLmxlYWRlcnx8IiIsdGhpcy50YXJnZXQ9ZS50YXJnZXR8fCIiLHRoaXMudHJhaWxlcj1lLnRyYWlsZXJ8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn1bbi4kZ2V0RXh0cmFdKCl7aWYoIXRoaXNbbi4kZXh0cmFdKXtjb25zdCBlPXRoaXNbbi4kZ2V0UGFyZW50XSgpLHQ9dGhpc1tuLiRnZXRUZW1wbGF0ZVJvb3RdKCkscj10W24uJHNlYXJjaE5vZGVdKHRoaXMudGFyZ2V0LGUpLGE9dFtuLiRzZWFyY2hOb2RlXSh0aGlzLmxlYWRlcixlKSxpPXRbbi4kc2VhcmNoTm9kZV0odGhpcy50cmFpbGVyLGUpO3RoaXNbbi4kZXh0cmFdPXt0YXJnZXQ6KG51bGw9PXI/dm9pZCAwOnJbMF0pfHxudWxsLGxlYWRlcjoobnVsbD09YT92b2lkIDA6YVswXSl8fG51bGwsdHJhaWxlcjoobnVsbD09aT92b2lkIDA6aVswXSl8fG51bGwsYWRkTGVhZGVyOiExLGFkZFRyYWlsZXI6ITF9fXJldHVybiB0aGlzW24uJGV4dHJhXX19Y2xhc3MgUWUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJwYWdlQXJlYSIsITApLHRoaXMuYmxhbmtPck5vdEJsYW5rPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmJsYW5rT3JOb3RCbGFuayxbImFueSIsImJsYW5rIiwibm90QmxhbmsiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmluaXRpYWxOdW1iZXI9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmluaXRpYWxOdW1iZXIsZGVmYXVsdFZhbHVlOjEsdmFsaWRhdGU6ZT0+ITB9KSx0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLm51bWJlcmVkPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5udW1iZXJlZCxkZWZhdWx0VmFsdWU6MSx2YWxpZGF0ZTplPT4hMH0pLHRoaXMub2RkT3JFdmVuPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm9kZE9yRXZlbixbImFueSIsImV2ZW4iLCJvZGQiXSksdGhpcy5wYWdlUG9zaXRpb249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucGFnZVBvc2l0aW9uLFsiYW55IiwiZmlyc3QiLCJsYXN0Iiwib25seSIsInJlc3QiXSksdGhpcy5yZWxldmFudD0oMCxjLmdldFJlbGV2YW50KShlLnJlbGV2YW50KSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5kZXNjPW51bGwsdGhpcy5leHRyYXM9bnVsbCx0aGlzLm1lZGl1bT1udWxsLHRoaXMub2NjdXI9bnVsbCx0aGlzLmFyZWE9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5jb250ZW50QXJlYT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRyYXc9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5leGNsR3JvdXA9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5maWVsZD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN1YmZvcm09bmV3IG8uWEZBT2JqZWN0QXJyYXl9W24uJGlzVXNhYmxlXSgpe3JldHVybiB0aGlzW24uJGV4dHJhXT8hdGhpcy5vY2N1cnx8LTE9PT10aGlzLm9jY3VyLm1heHx8dGhpc1tuLiRleHRyYV0ubnVtYmVyT2ZVc2U8dGhpcy5vY2N1ci5tYXg6KHRoaXNbbi4kZXh0cmFdPXtudW1iZXJPZlVzZTowfSwhMCl9W24uJGNsZWFuUGFnZV0oKXtkZWxldGUgdGhpc1tuLiRleHRyYV19W24uJGdldE5leHRQYWdlXSgpe3RoaXNbbi4kZXh0cmFdfHwodGhpc1tuLiRleHRyYV09e251bWJlck9mVXNlOjB9KTtjb25zdCBlPXRoaXNbbi4kZ2V0UGFyZW50XSgpO3JldHVybiJvcmRlcmVkT2NjdXJyZW5jZSI9PT1lLnJlbGF0aW9uJiZ0aGlzW24uJGlzVXNhYmxlXSgpPyh0aGlzW24uJGV4dHJhXS5udW1iZXJPZlVzZSs9MSx0aGlzKTplW24uJGdldE5leHRQYWdlXSgpfVtuLiRnZXRBdmFpbGFibGVTcGFjZV0oKXtyZXR1cm4gdGhpc1tuLiRleHRyYV0uc3BhY2V8fHt3aWR0aDowLGhlaWdodDowfX1bbi4kdG9IVE1MXSgpe3RoaXNbbi4kZXh0cmFdfHwodGhpc1tuLiRleHRyYV09e251bWJlck9mVXNlOjF9KTtjb25zdCBlPVtdO3RoaXNbbi4kZXh0cmFdLmNoaWxkcmVuPWU7Y29uc3QgdD1PYmplY3QuY3JlYXRlKG51bGwpO2lmKHRoaXMubWVkaXVtJiZ0aGlzLm1lZGl1bS5zaG9ydCYmdGhpcy5tZWRpdW0ubG9uZyl7aWYodC53aWR0aD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5tZWRpdW0uc2hvcnQpLHQuaGVpZ2h0PSgwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLm1lZGl1bS5sb25nKSx0aGlzW24uJGV4dHJhXS5zcGFjZT17d2lkdGg6dGhpcy5tZWRpdW0uc2hvcnQsaGVpZ2h0OnRoaXMubWVkaXVtLmxvbmd9LCJsYW5kc2NhcGUiPT09dGhpcy5tZWRpdW0ub3JpZW50YXRpb24pe2NvbnN0IGU9dC53aWR0aDt0LndpZHRoPXQuaGVpZ2h0LHQuaGVpZ2h0PWUsdGhpc1tuLiRleHRyYV0uc3BhY2U9e3dpZHRoOnRoaXMubWVkaXVtLmxvbmcsaGVpZ2h0OnRoaXMubWVkaXVtLnNob3J0fX19ZWxzZSgwLGwud2FybikoIlhGQSAtIE5vIG1lZGl1bSBzcGVjaWZpZWQgaW4gcGFnZUFyZWE6IHBsZWFzZSBmaWxlIGEgYnVnLiIpO3JldHVybiB0aGlzW24uJGNoaWxkcmVuVG9IVE1MXSh7ZmlsdGVyOm5ldyBTZXQoWyJhcmVhIiwiZHJhdyIsImZpZWxkIiwic3ViZm9ybSJdKSxpbmNsdWRlOiEwfSksdGhpc1tuLiRjaGlsZHJlblRvSFRNTF0oe2ZpbHRlcjpuZXcgU2V0KFsiY29udGVudEFyZWEiXSksaW5jbHVkZTohMH0pLGMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGNoaWxkcmVuOmUsYXR0cmlidXRlczp7Y2xhc3M6WyJ4ZmFQYWdlIl0saWQ6dGhpc1tuLiR1aWRdLHN0eWxlOnQseGZhTmFtZTp0aGlzLm5hbWV9fSl9fWNsYXNzIGV0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwicGFnZVNldCIsITApLHRoaXMuZHVwbGV4SW1wb3NpdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5kdXBsZXhJbXBvc2l0aW9uLFsibG9uZ0VkZ2UiLCJzaG9ydEVkZ2UiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnJlbGF0aW9uPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnJlbGF0aW9uLFsib3JkZXJlZE9jY3VycmVuY2UiLCJkdXBsZXhQYWdpbmF0ZWQiLCJzaW1wbGV4UGFnaW5hdGVkIl0pLHRoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5vY2N1cj1udWxsLHRoaXMucGFnZUFyZWE9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5wYWdlU2V0PW5ldyBvLlhGQU9iamVjdEFycmF5fVtuLiRjbGVhblBhZ2VdKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5wYWdlQXJlYS5jaGlsZHJlbillW24uJGNsZWFuUGFnZV0oKTtmb3IoY29uc3QgZSBvZiB0aGlzLnBhZ2VTZXQuY2hpbGRyZW4pZVtuLiRjbGVhblBhZ2VdKCl9W24uJGlzVXNhYmxlXSgpe3JldHVybiF0aGlzLm9jY3VyfHwtMT09PXRoaXMub2NjdXIubWF4fHx0aGlzW24uJGV4dHJhXS5udW1iZXJPZlVzZTx0aGlzLm9jY3VyLm1heH1bbi4kZ2V0TmV4dFBhZ2VdKCl7aWYodGhpc1tuLiRleHRyYV18fCh0aGlzW24uJGV4dHJhXT17bnVtYmVyT2ZVc2U6MSxwYWdlSW5kZXg6LTEscGFnZVNldEluZGV4Oi0xfSksIm9yZGVyZWRPY2N1cnJlbmNlIj09PXRoaXMucmVsYXRpb24pe2lmKHRoaXNbbi4kZXh0cmFdLnBhZ2VJbmRleCsxPHRoaXMucGFnZUFyZWEuY2hpbGRyZW4ubGVuZ3RoKXJldHVybiB0aGlzW24uJGV4dHJhXS5wYWdlSW5kZXgrPTEsdGhpcy5wYWdlQXJlYS5jaGlsZHJlblt0aGlzW24uJGV4dHJhXS5wYWdlSW5kZXhdW24uJGdldE5leHRQYWdlXSgpO2lmKHRoaXNbbi4kZXh0cmFdLnBhZ2VTZXRJbmRleCsxPHRoaXMucGFnZVNldC5jaGlsZHJlbi5sZW5ndGgpcmV0dXJuIHRoaXNbbi4kZXh0cmFdLnBhZ2VTZXRJbmRleCs9MSx0aGlzLnBhZ2VTZXQuY2hpbGRyZW5bdGhpc1tuLiRleHRyYV0ucGFnZVNldEluZGV4XVtuLiRnZXROZXh0UGFnZV0oKTtpZih0aGlzW24uJGlzVXNhYmxlXSgpKXJldHVybiB0aGlzW24uJGV4dHJhXS5udW1iZXJPZlVzZSs9MSx0aGlzW24uJGV4dHJhXS5wYWdlSW5kZXg9LTEsdGhpc1tuLiRleHRyYV0ucGFnZVNldEluZGV4PS0xLHRoaXNbbi4kZ2V0TmV4dFBhZ2VdKCk7Y29uc3QgZT10aGlzW24uJGdldFBhcmVudF0oKTtyZXR1cm4gZSBpbnN0YW5jZW9mIGV0P2Vbbi4kZ2V0TmV4dFBhZ2VdKCk6KHRoaXNbbi4kY2xlYW5QYWdlXSgpLHRoaXNbbi4kZ2V0TmV4dFBhZ2VdKCkpfWNvbnN0IGU9dGhpc1tuLiRnZXRUZW1wbGF0ZVJvb3RdKClbbi4kZXh0cmFdLnBhZ2VOdW1iZXIsdD1lJTI9PTA/ImV2ZW4iOiJvZGQiLHI9MD09PWU/ImZpcnN0IjoicmVzdCI7bGV0IGE9dGhpcy5wYWdlQXJlYS5jaGlsZHJlbi5maW5kKChlPT5lLm9kZE9yRXZlbj09PXQmJmUucGFnZVBvc2l0aW9uPT09cikpO3JldHVybiBhfHwoYT10aGlzLnBhZ2VBcmVhLmNoaWxkcmVuLmZpbmQoKGU9PiJhbnkiPT09ZS5vZGRPckV2ZW4mJmUucGFnZVBvc2l0aW9uPT09cikpLGF8fChhPXRoaXMucGFnZUFyZWEuY2hpbGRyZW4uZmluZCgoZT0+ImFueSI9PT1lLm9kZE9yRXZlbiYmImFueSI9PT1lLnBhZ2VQb3NpdGlvbikpLGF8fHRoaXMucGFnZUFyZWEuY2hpbGRyZW5bMF0pKX19Y2xhc3MgdHQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJwYXJhIiwhMCksdGhpcy5oQWxpZ249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaEFsaWduLFsibGVmdCIsImNlbnRlciIsImp1c3RpZnkiLCJqdXN0aWZ5QWxsIiwicmFkaXgiLCJyaWdodCJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubGluZUhlaWdodD1lLmxpbmVIZWlnaHQ/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5saW5lSGVpZ2h0LCIwcHQiKToiIix0aGlzLm1hcmdpbkxlZnQ9ZS5tYXJnaW5MZWZ0PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWFyZ2luTGVmdCwiMHB0Iik6IiIsdGhpcy5tYXJnaW5SaWdodD1lLm1hcmdpblJpZ2h0PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWFyZ2luUmlnaHQsIjBwdCIpOiIiLHRoaXMub3JwaGFucz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUub3JwaGFucyxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT5lPj0wfSksdGhpcy5wcmVzZXJ2ZT1lLnByZXNlcnZlfHwiIix0aGlzLnJhZGl4T2Zmc2V0PWUucmFkaXhPZmZzZXQ/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5yYWRpeE9mZnNldCwiMHB0Iik6IiIsdGhpcy5zcGFjZUFib3ZlPWUuc3BhY2VBYm92ZT8oMCxjLmdldE1lYXN1cmVtZW50KShlLnNwYWNlQWJvdmUsIjBwdCIpOiIiLHRoaXMuc3BhY2VCZWxvdz1lLnNwYWNlQmVsb3c/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5zcGFjZUJlbG93LCIwcHQiKToiIix0aGlzLnRhYkRlZmF1bHQ9ZS50YWJEZWZhdWx0PygwLGMuZ2V0TWVhc3VyZW1lbnQpKHRoaXMudGFiRGVmYXVsdCk6IiIsdGhpcy50YWJTdG9wcz0oZS50YWJTdG9wc3x8IiIpLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKCgoZSx0KT0+dCUyPT0xPygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUpOmUpKSx0aGlzLnRleHRJbmRlbnQ9ZS50ZXh0SW5kZW50PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUudGV4dEluZGVudCwiMHB0Iik6IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMudkFsaWduPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnZBbGlnbixbInRvcCIsImJvdHRvbSIsIm1pZGRsZSJdKSx0aGlzLndpZG93cz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUud2lkb3dzLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PmU+PTB9KSx0aGlzLmh5cGhlbmF0aW9uPW51bGx9W24uJHRvU3R5bGVdKCl7Y29uc3QgZT0oMCxzLnRvU3R5bGUpKHRoaXMsImhBbGlnbiIpO3JldHVybiIiIT09dGhpcy5tYXJnaW5MZWZ0JiYoZS5wYWRkaW5nTGVmdD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5tYXJnaW5MZWZ0KSksIiIhPT10aGlzLm1hcmdpblJpZ2h0JiYoZS5wYWRkaW5naWdodD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5tYXJnaW5SaWdodCkpLCIiIT09dGhpcy5zcGFjZUFib3ZlJiYoZS5wYWRkaW5nVG9wPSgwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnNwYWNlQWJvdmUpKSwiIiE9PXRoaXMuc3BhY2VCZWxvdyYmKGUucGFkZGluZ0JvdHRvbT0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5zcGFjZUJlbG93KSksIiIhPT10aGlzLnRleHRJbmRlbnQmJihlLnRleHRJbmRlbnQ9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMudGV4dEluZGVudCksKDAscy5maXhUZXh0SW5kZW50KShlKSksdGhpcy5saW5lSGVpZ2h0PjAmJihlLmxpbmVIZWlnaHQ9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMubGluZUhlaWdodCkpLCIiIT09dGhpcy50YWJEZWZhdWx0JiYoZS50YWJTaXplPSgwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnRhYkRlZmF1bHQpKSx0aGlzLnRhYlN0b3BzLmxlbmd0aCx0aGlzLmh5cGhlbmF0YXRpb24mJk9iamVjdC5hc3NpZ24oZSx0aGlzLmh5cGhlbmF0YXRpb25bbi4kdG9TdHlsZV0oKSksZX19Y2xhc3MgcnQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJwYXNzd29yZEVkaXQiLCEwKSx0aGlzLmhTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaFNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucGFzc3dvcmRDaGFyPWUucGFzc3dvcmRDaGFyfHwiKiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuYm9yZGVyPW51bGwsdGhpcy5leHRyYXM9bnVsbCx0aGlzLm1hcmdpbj1udWxsfX1jbGFzcyBudCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInBhdHRlcm4iLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50eXBlLFsiY3Jvc3NIYXRjaCIsImNyb3NzRGlhZ29uYWwiLCJkaWFnb25hbExlZnQiLCJkaWFnb25hbFJpZ2h0IiwiaG9yaXpvbnRhbCIsInZlcnRpY2FsIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNvbG9yPW51bGwsdGhpcy5leHRyYXM9bnVsbH1bbi4kdG9TdHlsZV0oZSl7ZT1lP2Vbbi4kdG9TdHlsZV0oKToiI0ZGRkZGRiI7Y29uc3QgdD10aGlzLmNvbG9yP3RoaXMuY29sb3Jbbi4kdG9TdHlsZV0oKToiIzAwMDAwMCIscj0icmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCIsYT0iIi5jb25jYXQoZSwiLCIpLmNvbmNhdChlLCIgNXB4LCIpLmNvbmNhdCh0LCIgNXB4LCIpLmNvbmNhdCh0LCIgMTBweCIpO3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UiY3Jvc3NIYXRjaCI6cmV0dXJuIiIuY29uY2F0KHIsIih0byB0b3AsIikuY29uY2F0KGEsIikgIikuY29uY2F0KHIsIih0byByaWdodCwiKS5jb25jYXQoYSwiKSIpO2Nhc2UiY3Jvc3NEaWFnb25hbCI6cmV0dXJuIiIuY29uY2F0KHIsIig0NWRlZywiKS5jb25jYXQoYSwiKSAiKS5jb25jYXQociwiKC00NWRlZywiKS5jb25jYXQoYSwiKSIpO2Nhc2UiZGlhZ29uYWxMZWZ0IjpyZXR1cm4iIi5jb25jYXQociwiKDQ1ZGVnLCIpLmNvbmNhdChhLCIpIik7Y2FzZSJkaWFnb25hbFJpZ2h0IjpyZXR1cm4iIi5jb25jYXQociwiKC00NWRlZywiKS5jb25jYXQoYSwiKSIpO2Nhc2UiaG9yaXpvbnRhbCI6cmV0dXJuIiIuY29uY2F0KHIsIih0byB0b3AsIikuY29uY2F0KGEsIikiKTtjYXNlInZlcnRpY2FsIjpyZXR1cm4iIi5jb25jYXQociwiKHRvIHJpZ2h0LCIpLmNvbmNhdChhLCIpIil9cmV0dXJuIiJ9fWNsYXNzIGF0IGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwicGljdHVyZSIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBpdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInByb3RvIiwhMCksdGhpcy5hcHBlYXJhbmNlRmlsdGVyPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuYXJjPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuYXJlYT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmFzc2lzdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmJhcmNvZGU9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5iaW5kSXRlbXM9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5ib29rZW5kPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuYm9vbGVhbj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmJvcmRlcj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmJyZWFrPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuYnJlYWtBZnRlcj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmJyZWFrQmVmb3JlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuYnV0dG9uPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY2FsY3VsYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY2FwdGlvbj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmNlcnRpZmljYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY2VydGlmaWNhdGVzPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY2hlY2tCdXR0b249bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5jaG9pY2VMaXN0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY29sb3I9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5jb21iPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY29ubmVjdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmNvbnRlbnRBcmVhPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY29ybmVyPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRhdGVUaW1lPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZVRpbWVFZGl0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGVjaW1hbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRlZmF1bHRVaT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRlc2M9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5kaWdlc3RNZXRob2Q9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5kaWdlc3RNZXRob2RzPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZHJhdz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmVkZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5lbmNvZGluZz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmVuY29kaW5ncz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmVuY3J5cHQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5lbmNyeXB0RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmVuY3J5cHRpb249bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5lbmNyeXB0aW9uTWV0aG9kPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZW5jcnlwdGlvbk1ldGhvZHM9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5ldmVudD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4T2JqZWN0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZXhjbEdyb3VwPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZXhlY3V0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4dHJhcz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZpZWxkPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZmlsbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZpbHRlcj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZsb2F0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZm9udD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZvcm1hdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmhhbmRsZXI9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5oeXBoZW5hdGlvbj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmltYWdlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuaW1hZ2VFZGl0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuaW50ZWdlcj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmlzc3VlcnM9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5pdGVtcz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmtlZXA9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5rZXlVc2FnZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmxpbmU9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5saW5lYXI9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5sb2NrRG9jdW1lbnQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5tYW5pZmVzdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLm1hcmdpbj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLm1kcD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLm1lZGl1bT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLm1lc3NhZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5udW1lcmljRWRpdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLm9jY3VyPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMub2lkPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMub2lkcz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLm92ZXJmbG93PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMucGFnZUFyZWE9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5wYWdlU2V0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMucGFyYT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnBhc3N3b3JkRWRpdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnBhdHRlcm49bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5waWN0dXJlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMucmFkaWFsPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMucmVhc29uPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMucmVhc29ucz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnJlY3RhbmdsZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnJlZj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnNjcmlwdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnNldFByb3BlcnR5PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc2lnbkRhdGE9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zaWduYXR1cmU9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zaWduaW5nPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc29saWQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zcGVhaz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN0aXBwbGU9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zdWJmb3JtPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc3ViZm9ybVNldD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN1YmplY3RETj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN1YmplY3RETnM9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zdWJtaXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy50ZXh0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGV4dEVkaXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy50aW1lPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGltZVN0YW1wPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudG9vbFRpcD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnRyYXZlcnNhbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnRyYXZlcnNlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudWk9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy52YWxpZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnZhbHVlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudmFyaWFibGVzPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBzdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInJhZGlhbCIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJ0b0VkZ2UiLCJ0b0NlbnRlciJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5jb2xvcj1udWxsLHRoaXMuZXh0cmFzPW51bGx9W24uJHRvU3R5bGVdKGUpe2U9ZT9lW24uJHRvU3R5bGVdKCk6IiNGRkZGRkYiO2NvbnN0IHQ9dGhpcy5jb2xvcj90aGlzLmNvbG9yW24uJHRvU3R5bGVdKCk6IiMwMDAwMDAiO3JldHVybiJyYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IGNlbnRlciwgIi5jb25jYXQoInRvRWRnZSI9PT10aGlzLnR5cGU/IiIuY29uY2F0KGUsIiwiKS5jb25jYXQodCk6IiIuY29uY2F0KHQsIiwiKS5jb25jYXQoZSksIikiKX19Y2xhc3Mgb3QgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJyZWFzb24iKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgY3QgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJyZWFzb25zIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMucmVhc29uPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBsdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInJlY3RhbmdsZSIsITApLHRoaXMuaGFuZD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5oYW5kLFsiZXZlbiIsImxlZnQiLCJyaWdodCJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNvcm5lcj1uZXcgby5YRkFPYmplY3RBcnJheSg0KSx0aGlzLmVkZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXkoNCksdGhpcy5maWxsPW51bGx9W24uJHRvSFRNTF0oKXt2YXIgZTtjb25zdCB0PXRoaXMuZWRnZS5jaGlsZHJlbi5sZW5ndGg/dGhpcy5lZGdlLmNoaWxkcmVuWzBdOm5ldyB1ZSh7fSkscj10W24uJHRvU3R5bGVdKCksYT1PYmplY3QuY3JlYXRlKG51bGwpOyJ2aXNpYmxlIj09PShudWxsPT09KGU9dGhpcy5maWxsKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5wcmVzZW5jZSk/T2JqZWN0LmFzc2lnbihhLHRoaXMuZmlsbFtuLiR0b1N0eWxlXSgpKTphLmZpbGw9InRyYW5zcGFyZW50IixhLnN0cm9rZVdpZHRoPSgwLHMubWVhc3VyZVRvU3RyaW5nKSgidmlzaWJsZSI9PT10LnByZXNlbmNlP3QudGhpY2tuZXNzOjApLGEuc3Ryb2tlPXIuY29sb3I7Y29uc3QgaT0odGhpcy5jb3JuZXIuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY29ybmVyLmNoaWxkcmVuWzBdOm5ldyB0ZSh7fSkpW24uJHRvU3R5bGVdKCksbz17bmFtZToic3ZnIixjaGlsZHJlbjpbe25hbWU6InJlY3QiLGF0dHJpYnV0ZXM6e3htbG5zOmcsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIseDowLHk6MCxyeDppLnJhZGl1cyxyeTppLnJhZGl1cyxzdHlsZTphfX1dLGF0dHJpYnV0ZXM6e3htbG5zOmcsc3R5bGU6e292ZXJmbG93OiJ2aXNpYmxlIn0sd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSJ9fTtyZXR1cm4gdyh0aGlzW24uJGdldFBhcmVudF0oKVtuLiRnZXRQYXJlbnRdKCkpP2MuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e3N0eWxlOntkaXNwbGF5OiJpbmxpbmUiLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUifX0sY2hpbGRyZW46W29dfSk6KG8uYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuSFRNTFJlc3VsdC5zdWNjZXNzKG8pKX19Y2xhc3MgaHQgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJyZWYiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgdXQgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzY3JpcHQiKSx0aGlzLmJpbmRpbmc9ZS5iaW5kaW5nfHwiIix0aGlzLmNvbnRlbnRUeXBlPWUuY29udGVudFR5cGV8fCIiLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy5ydW5BdD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5ydW5BdCxbImNsaWVudCIsImJvdGgiLCJzZXJ2ZXIiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBkdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInNldFByb3BlcnR5IiksdGhpcy5jb25uZWN0aW9uPWUuY29ubmVjdGlvbnx8IiIsdGhpcy5yZWY9ZS5yZWZ8fCIiLHRoaXMudGFyZ2V0PWUudGFyZ2V0fHwiIn19dC5TZXRQcm9wZXJ0eT1kdDtjbGFzcyBmdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInNpZ25EYXRhIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm9wZXJhdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5vcGVyYXRpb24sWyJzaWduIiwiY2xlYXIiLCJ2ZXJpZnkiXSksdGhpcy5yZWY9ZS5yZWZ8fCIiLHRoaXMudGFyZ2V0PWUudGFyZ2V0fHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5maWx0ZXI9bnVsbCx0aGlzLm1hbmlmZXN0PW51bGx9fWNsYXNzIGd0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwic2lnbmF0dXJlIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIlBERjEuMyIsIlBERjEuNiJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5ib3JkZXI9bnVsbCx0aGlzLmV4dHJhcz1udWxsLHRoaXMuZmlsdGVyPW51bGwsdGhpcy5tYW5pZmVzdD1udWxsLHRoaXMubWFyZ2luPW51bGx9fWNsYXNzIHB0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwic2lnbmluZyIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNlcnRpZmljYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBtdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInNvbGlkIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbH1bbi4kdG9TdHlsZV0oZSl7cmV0dXJuIGU/ZVtuLiR0b1N0eWxlXSgpOiIjRkZGRkZGIn19Y2xhc3MgYnQgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzcGVhayIpLHRoaXMuZGlzYWJsZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZGlzYWJsZSxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4xPT09ZX0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5wcmlvcml0eT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmlvcml0eSxbImN1c3RvbSIsImNhcHRpb24iLCJuYW1lIiwidG9vbFRpcCJdKSx0aGlzLnJpZD1lLnJpZHx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyB5dCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInN0aXBwbGUiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucmF0ZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUucmF0ZSxkZWZhdWx0VmFsdWU6NTAsdmFsaWRhdGU6ZT0+ZT49MCYmZTw9MTAwfSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuY29sb3I9bnVsbCx0aGlzLmV4dHJhcz1udWxsfVtuLiR0b1N0eWxlXShlKXtjb25zdCB0PXRoaXMucmF0ZS8xMDA7cmV0dXJuIGwuVXRpbC5tYWtlSGV4Q29sb3IoTWF0aC5yb3VuZChlLnZhbHVlLnIqKDEtdCkrdGhpcy52YWx1ZS5yKnQpLE1hdGgucm91bmQoZS52YWx1ZS5nKigxLXQpK3RoaXMudmFsdWUuZyp0KSxNYXRoLnJvdW5kKGUudmFsdWUuYiooMS10KSt0aGlzLnZhbHVlLmIqdCkpfX1jbGFzcyB3dCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInN1YmZvcm0iLCEwKSx0aGlzLmFjY2Vzcz0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5hY2Nlc3MsWyJvcGVuIiwibm9uSW50ZXJhY3RpdmUiLCJwcm90ZWN0ZWQiLCJyZWFkT25seSJdKSx0aGlzLmFsbG93TWFjcm89KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmFsbG93TWFjcm8sZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLmFuY2hvclR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYW5jaG9yVHlwZSxbInRvcExlZnQiLCJib3R0b21DZW50ZXIiLCJib3R0b21MZWZ0IiwiYm90dG9tUmlnaHQiLCJtaWRkbGVDZW50ZXIiLCJtaWRkbGVMZWZ0IiwibWlkZGxlUmlnaHQiLCJ0b3BDZW50ZXIiLCJ0b3BSaWdodCJdKSx0aGlzLmNvbFNwYW49KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmNvbFNwYW4sZGVmYXVsdFZhbHVlOjEsdmFsaWRhdGU6ZT0+ZT49MXx8LTE9PT1lfSksdGhpcy5jb2x1bW5XaWR0aHM9KGUuY29sdW1uV2lkdGhzfHwiIikudHJpbSgpLnNwbGl0KC9ccysvKS5tYXAoKGU9PiItMSI9PT1lPy0xOigwLGMuZ2V0TWVhc3VyZW1lbnQpKGUpKSksdGhpcy5oPWUuaD8oMCxjLmdldE1lYXN1cmVtZW50KShlLmgpOiIiLHRoaXMuaEFsaWduPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhBbGlnbixbImxlZnQiLCJjZW50ZXIiLCJqdXN0aWZ5IiwianVzdGlmeUFsbCIsInJhZGl4IiwicmlnaHQiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmxheW91dD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5sYXlvdXQsWyJwb3NpdGlvbiIsImxyLXRiIiwicmwtcm93IiwicmwtdGIiLCJyb3ciLCJ0YWJsZSIsInRiIl0pLHRoaXMubG9jYWxlPWUubG9jYWxlfHwiIix0aGlzLm1heEg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5tYXhILCIwcHQiKSx0aGlzLm1heFc9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5tYXhXLCIwcHQiKSx0aGlzLm1lcmdlTW9kZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5tZXJnZU1vZGUsWyJjb25zdW1lRGF0YSIsIm1hdGNoVGVtcGxhdGUiXSksdGhpcy5taW5IPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWluSCwiMHB0IiksdGhpcy5taW5XPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWluVywiMHB0IiksdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy5wcmVzZW5jZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmVzZW5jZSxbInZpc2libGUiLCJoaWRkZW4iLCJpbmFjdGl2ZSIsImludmlzaWJsZSJdKSx0aGlzLnJlbGV2YW50PSgwLGMuZ2V0UmVsZXZhbnQpKGUucmVsZXZhbnQpLHRoaXMucmVzdG9yZVN0YXRlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnJlc3RvcmVTdGF0ZSxbIm1hbnVhbCIsImF1dG8iXSksdGhpcy5zY29wZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5zY29wZSxbIm5hbWUiLCJub25lIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLnc9ZS53PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUudyk6IiIsdGhpcy54PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUueCwiMHB0IiksdGhpcy55PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUueSwiMHB0IiksdGhpcy5hc3Npc3Q9bnVsbCx0aGlzLmJpbmQ9bnVsbCx0aGlzLmJvb2tlbmQ9bnVsbCx0aGlzLmJvcmRlcj1udWxsLHRoaXMuYnJlYWs9bnVsbCx0aGlzLmNhbGN1bGF0ZT1udWxsLHRoaXMuZGVzYz1udWxsLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5rZWVwPW51bGwsdGhpcy5tYXJnaW49bnVsbCx0aGlzLm9jY3VyPW51bGwsdGhpcy5vdmVyZmxvdz1udWxsLHRoaXMucGFnZVNldD1udWxsLHRoaXMucGFyYT1udWxsLHRoaXMudHJhdmVyc2FsPW51bGwsdGhpcy52YWxpZGF0ZT1udWxsLHRoaXMudmFyaWFibGVzPW51bGwsdGhpcy5hcmVhPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuYnJlYWtBZnRlcj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmJyZWFrQmVmb3JlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY29ubmVjdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRyYXc9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5ldmVudD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4T2JqZWN0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZXhjbEdyb3VwPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZmllbGQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5wcm90bz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnNldFByb3BlcnR5PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc3ViZm9ybT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN1YmZvcm1TZXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXl9W24uJGdldFN1YmZvcm1QYXJlbnRdKCl7Y29uc3QgZT10aGlzW24uJGdldFBhcmVudF0oKTtyZXR1cm4gZSBpbnN0YW5jZW9mIHZ0P2Vbbi4kZ2V0U3ViZm9ybVBhcmVudF0oKTplfVtuLiRpc0JpbmRhYmxlXSgpe3JldHVybiEwfVtuLiRpc1RoZXJlTW9yZVdpZHRoXSgpe3JldHVybiB0aGlzLmxheW91dC5lbmRzV2l0aCgiLXRiIikmJjA9PT10aGlzW24uJGV4dHJhXS5hdHRlbXB0JiZ0aGlzW24uJGV4dHJhXS5udW1iZXJJbkxpbmU+MHx8dGhpc1tuLiRnZXRQYXJlbnRdKClbbi4kaXNUaGVyZU1vcmVXaWR0aF0oKX0qW24uJGdldENvbnRhaW5lZENoaWxkcmVuXSgpe3lpZWxkKngodGhpcyl9W24uJGZsdXNoSFRNTF0oKXtyZXR1cm4oMCxpLmZsdXNoSFRNTCkodGhpcyl9W24uJGFkZEhUTUxdKGUsdCl7KDAsaS5hZGRIVE1MKSh0aGlzLGUsdCl9W24uJGdldEF2YWlsYWJsZVNwYWNlXSgpe3JldHVybigwLGkuZ2V0QXZhaWxhYmxlU3BhY2UpKHRoaXMpfVtuLiRpc1NwbGl0dGFibGVdKCl7dmFyIGU7Y29uc3QgdD10aGlzW24uJGdldFN1YmZvcm1QYXJlbnRdKCk7cmV0dXJuISF0W24uJGlzU3BsaXR0YWJsZV0oKSYmKHZvaWQgMCE9PXRoaXNbbi4kZXh0cmFdLl9pc1NwbGl0dGFibGU/dGhpc1tuLiRleHRyYV0uX2lzU3BsaXR0YWJsZToicG9zaXRpb24iPT09dGhpcy5sYXlvdXR8fHRoaXMubGF5b3V0LmluY2x1ZGVzKCJyb3ciKXx8dGhpcy5rZWVwJiYibm9uZSIhPT10aGlzLmtlZXAuaW50YWN0Pyh0aGlzW24uJGV4dHJhXS5faXNTcGxpdHRhYmxlPSExLCExKTohKG51bGwhPT0oZT10LmxheW91dCkmJnZvaWQgMCE9PWUmJmUuZW5kc1dpdGgoIi10YiIpJiYwIT09dFtuLiRleHRyYV0ubnVtYmVySW5MaW5lfHwodGhpc1tuLiRleHRyYV0uX2lzU3BsaXR0YWJsZT0hMCwwKSkpfVtuLiR0b0hUTUxdKGUpe3ZhciB0O2lmKEEodGhpcyksdGhpcy5icmVhayl7aWYoImF1dG8iIT09dGhpcy5icmVhay5hZnRlcnx8IiIhPT10aGlzLmJyZWFrLmFmdGVyVGFyZ2V0KXtjb25zdCBlPW5ldyBYKHt0YXJnZXRUeXBlOnRoaXMuYnJlYWsuYWZ0ZXIsdGFyZ2V0OnRoaXMuYnJlYWsuYWZ0ZXJUYXJnZXQsc3RhcnROZXc6dGhpcy5icmVhay5zdGFydE5ldy50b1N0cmluZygpfSk7ZVtuLiRnbG9iYWxEYXRhXT10aGlzW24uJGdsb2JhbERhdGFdLHRoaXNbbi4kYXBwZW5kQ2hpbGRdKGUpLHRoaXMuYnJlYWtBZnRlci5wdXNoKGUpfWlmKCJhdXRvIiE9PXRoaXMuYnJlYWsuYmVmb3JlfHwiIiE9PXRoaXMuYnJlYWsuYmVmb3JlVGFyZ2V0KXtjb25zdCBlPW5ldyBIKHt0YXJnZXRUeXBlOnRoaXMuYnJlYWsuYmVmb3JlLHRhcmdldDp0aGlzLmJyZWFrLmJlZm9yZVRhcmdldCxzdGFydE5ldzp0aGlzLmJyZWFrLnN0YXJ0TmV3LnRvU3RyaW5nKCl9KTtlW24uJGdsb2JhbERhdGFdPXRoaXNbbi4kZ2xvYmFsRGF0YV0sdGhpc1tuLiRhcHBlbmRDaGlsZF0oZSksdGhpcy5icmVha0JlZm9yZS5wdXNoKGUpfWlmKCIiIT09dGhpcy5icmVhay5vdmVyZmxvd1RhcmdldCl7Y29uc3QgZT1uZXcgWmUoe3RhcmdldDp0aGlzLmJyZWFrLm92ZXJmbG93VGFyZ2V0LGxlYWRlcjp0aGlzLmJyZWFrLm92ZXJmbG93TGVhZGVyLHRyYWlsZXI6dGhpcy5icmVhay5vdmVyZmxvd1RyYWlsZXJ9KTtlW24uJGdsb2JhbERhdGFdPXRoaXNbbi4kZ2xvYmFsRGF0YV0sdGhpc1tuLiRhcHBlbmRDaGlsZF0oZSksdGhpcy5vdmVyZmxvdy5wdXNoKGUpfXRoaXNbbi4kcmVtb3ZlQ2hpbGRdKHRoaXMuYnJlYWspLHRoaXMuYnJlYWs9bnVsbH1pZigiaGlkZGVuIj09PXRoaXMucHJlc2VuY2V8fCJpbmFjdGl2ZSI9PT10aGlzLnByZXNlbmNlKXJldHVybiBjLkhUTUxSZXN1bHQuRU1QVFk7aWYoKHRoaXMuYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoPjF8fHRoaXMuYnJlYWtBZnRlci5jaGlsZHJlbi5sZW5ndGg+MSkmJigwLGwud2FybikoIlhGQSAtIFNldmVyYWwgYnJlYWtCZWZvcmUgb3IgYnJlYWtBZnRlciBpbiBzdWJmb3JtczogcGxlYXNlIGZpbGUgYSBidWcuIiksdGhpcy5icmVha0JlZm9yZS5jaGlsZHJlbi5sZW5ndGg+PTEpe2NvbnN0IGU9dGhpcy5icmVha0JlZm9yZS5jaGlsZHJlblswXTtpZihUKGUpKXJldHVybiBjLkhUTUxSZXN1bHQuYnJlYWtOb2RlKGUpfWlmKG51bGwhPT0odD10aGlzW24uJGV4dHJhXSkmJnZvaWQgMCE9PXQmJnQuYWZ0ZXJCcmVha0FmdGVyKXJldHVybiBjLkhUTUxSZXN1bHQuRU1QVFk7KDAscy5maXhEaW1lbnNpb25zKSh0aGlzKTtjb25zdCByPVtdLGE9e2lkOnRoaXNbbi4kdWlkXSxjbGFzczpbXX07KDAscy5zZXRBY2Nlc3MpKHRoaXMsYS5jbGFzcyksdGhpc1tuLiRleHRyYV18fCh0aGlzW24uJGV4dHJhXT1PYmplY3QuY3JlYXRlKG51bGwpKSxPYmplY3QuYXNzaWduKHRoaXNbbi4kZXh0cmFdLHtjaGlsZHJlbjpyLGxpbmU6bnVsbCxhdHRyaWJ1dGVzOmEsYXR0ZW1wdDowLG51bWJlckluTGluZTowLGF2YWlsYWJsZVNwYWNlOnt3aWR0aDpNYXRoLm1pbih0aGlzLnd8fDEvMCxlLndpZHRoKSxoZWlnaHQ6TWF0aC5taW4odGhpcy5ofHwxLzAsZS5oZWlnaHQpfSx3aWR0aDowLGhlaWdodDowLHByZXZIZWlnaHQ6MCxjdXJyZW50V2lkdGg6MH0pO2NvbnN0IG89dGhpc1tuLiRnZXRUZW1wbGF0ZVJvb3RdKCksaD1vW24uJGV4dHJhXS5ub0xheW91dEZhaWx1cmUsdT10aGlzW24uJGlzU3BsaXR0YWJsZV0oKTtpZih1fHxGKHRoaXMpLCEoMCxpLmNoZWNrRGltZW5zaW9ucykodGhpcyxlKSlyZXR1cm4gYy5IVE1MUmVzdWx0LkZBSUxVUkU7Y29uc3QgZD1uZXcgU2V0KFsiYXJlYSIsImRyYXciLCJleGNsR3JvdXAiLCJmaWVsZCIsInN1YmZvcm0iLCJzdWJmb3JtU2V0Il0pO2lmKHRoaXMubGF5b3V0LmluY2x1ZGVzKCJyb3ciKSl7Y29uc3QgZT10aGlzW24uJGdldFN1YmZvcm1QYXJlbnRdKCkuY29sdW1uV2lkdGhzO0FycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPjAmJih0aGlzW24uJGV4dHJhXS5jb2x1bW5XaWR0aHM9ZSx0aGlzW24uJGV4dHJhXS5jdXJyZW50Q29sdW1uPTApfWNvbnN0IGY9KDAscy50b1N0eWxlKSh0aGlzLCJhbmNob3JUeXBlIiwiZGltZW5zaW9ucyIsInBvc2l0aW9uIiwicHJlc2VuY2UiLCJib3JkZXIiLCJtYXJnaW4iLCJoQWxpZ24iKSxnPVsieGZhU3ViZm9ybSJdLHA9KDAscy5sYXlvdXRDbGFzcykodGhpcyk7aWYocCYmZy5wdXNoKHApLGEuc3R5bGU9ZixhLmNsYXNzPWcsdGhpcy5uYW1lJiYoYS54ZmFOYW1lPXRoaXMubmFtZSksdGhpcy5vdmVyZmxvdyl7Y29uc3QgdD10aGlzLm92ZXJmbG93W24uJGdldEV4dHJhXSgpO3QuYWRkTGVhZGVyJiYodC5hZGRMZWFkZXI9ITEsTSh0aGlzLHQubGVhZGVyLGUpKX10aGlzW24uJHB1c2hQYXJhXSgpO2NvbnN0IG09ImxyLXRiIj09PXRoaXMubGF5b3V0fHwicmwtdGIiPT09dGhpcy5sYXlvdXQsYj1tPzI6MTtmb3IoO3RoaXNbbi4kZXh0cmFdLmF0dGVtcHQ8Yjt0aGlzW24uJGV4dHJhXS5hdHRlbXB0Kyspe20mJjE9PT10aGlzW24uJGV4dHJhXS5hdHRlbXB0JiYodGhpc1tuLiRleHRyYV0ubnVtYmVySW5MaW5lPTApO2NvbnN0IGU9dGhpc1tuLiRjaGlsZHJlblRvSFRNTF0oe2ZpbHRlcjpkLGluY2x1ZGU6ITB9KTtpZihlLnN1Y2Nlc3MpYnJlYWs7aWYoZS5pc0JyZWFrKCkpcmV0dXJuIHRoaXNbbi4kcG9wUGFyYV0oKSxlO2lmKG0mJjA9PT10aGlzW24uJGV4dHJhXS5hdHRlbXB0JiYwPT09dGhpc1tuLiRleHRyYV0ubnVtYmVySW5MaW5lJiYhb1tuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKXt0aGlzW24uJGV4dHJhXS5hdHRlbXB0PWI7YnJlYWt9fWlmKHRoaXNbbi4kcG9wUGFyYV0oKSx1fHxJKHRoaXMpLG9bbi4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZT1oLHRoaXNbbi4kZXh0cmFdLmF0dGVtcHQ9PT1iKXJldHVybiB0aGlzLm92ZXJmbG93JiYodGhpc1tuLiRnZXRUZW1wbGF0ZVJvb3RdKClbbi4kZXh0cmFdLm92ZXJmbG93Tm9kZT10aGlzLm92ZXJmbG93KSx1fHxkZWxldGUgdGhpc1tuLiRleHRyYV0sYy5IVE1MUmVzdWx0LkZBSUxVUkU7aWYodGhpcy5vdmVyZmxvdyl7Y29uc3QgdD10aGlzLm92ZXJmbG93W24uJGdldEV4dHJhXSgpO3QuYWRkVHJhaWxlciYmKHQuYWRkVHJhaWxlcj0hMSxNKHRoaXMsdC50cmFpbGVyLGUpKX1sZXQgeT0wLHc9MDt0aGlzLm1hcmdpbiYmKHk9dGhpcy5tYXJnaW4ubGVmdEluc2V0K3RoaXMubWFyZ2luLnJpZ2h0SW5zZXQsdz10aGlzLm1hcmdpbi50b3BJbnNldCt0aGlzLm1hcmdpbi5ib3R0b21JbnNldCk7Y29uc3Qgdj1NYXRoLm1heCh0aGlzW24uJGV4dHJhXS53aWR0aCt5LHRoaXMud3x8MCkseD1NYXRoLm1heCh0aGlzW24uJGV4dHJhXS5oZWlnaHQrdyx0aGlzLmh8fDApLFM9W3RoaXMueCx0aGlzLnksdix4XTtpZigiIj09PXRoaXMudyYmKGYud2lkdGg9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHYpKSwiIj09PXRoaXMuaCYmKGYuaGVpZ2h0PSgwLHMubWVhc3VyZVRvU3RyaW5nKSh4KSksKCIwcHgiPT09Zi53aWR0aHx8IjBweCI9PT1mLmhlaWdodCkmJjA9PT1yLmxlbmd0aClyZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZO2NvbnN0IEM9e25hbWU6ImRpdiIsYXR0cmlidXRlczphLGNoaWxkcmVuOnJ9O2sodGhpcyxhKTtjb25zdCBPPWMuSFRNTFJlc3VsdC5zdWNjZXNzKCgwLHMuY3JlYXRlV3JhcHBlcikodGhpcyxDKSxTKTtpZih0aGlzLmJyZWFrQWZ0ZXIuY2hpbGRyZW4ubGVuZ3RoPj0xKXtjb25zdCBlPXRoaXMuYnJlYWtBZnRlci5jaGlsZHJlblswXTtpZihUKGUpKXJldHVybiB0aGlzW24uJGV4dHJhXS5hZnRlckJyZWFrQWZ0ZXI9TyxjLkhUTUxSZXN1bHQuYnJlYWtOb2RlKGUpfXJldHVybiBkZWxldGUgdGhpc1tuLiRleHRyYV0sT319Y2xhc3MgdnQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzdWJmb3JtU2V0IiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnJlbGF0aW9uPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnJlbGF0aW9uLFsib3JkZXJlZCIsImNob2ljZSIsInVub3JkZXJlZCJdKSx0aGlzLnJlbGV2YW50PSgwLGMuZ2V0UmVsZXZhbnQpKGUucmVsZXZhbnQpLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmJvb2tlbmQ9bnVsbCx0aGlzLmJyZWFrPW51bGwsdGhpcy5kZXNjPW51bGwsdGhpcy5leHRyYXM9bnVsbCx0aGlzLm9jY3VyPW51bGwsdGhpcy5vdmVyZmxvdz1udWxsLHRoaXMuYnJlYWtBZnRlcj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmJyZWFrQmVmb3JlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc3ViZm9ybT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN1YmZvcm1TZXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXl9KltuLiRnZXRDb250YWluZWRDaGlsZHJlbl0oKXt5aWVsZCp4KHRoaXMpfVtuLiRnZXRTdWJmb3JtUGFyZW50XSgpe2xldCBlPXRoaXNbbi4kZ2V0UGFyZW50XSgpO2Zvcig7IShlIGluc3RhbmNlb2Ygd3QpOyllPWVbbi4kZ2V0UGFyZW50XSgpO3JldHVybiBlfVtuLiRpc0JpbmRhYmxlXSgpe3JldHVybiEwfX1jbGFzcyB4dCBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzdWJqZWN0RE4iKSx0aGlzLmRlbGltaXRlcj1lLmRlbGltaXRlcnx8IiwiLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifVtuLiRmaW5hbGl6ZV0oKXt0aGlzW24uJGNvbnRlbnRdPW5ldyBNYXAodGhpc1tuLiRjb250ZW50XS5zcGxpdCh0aGlzLmRlbGltaXRlcikubWFwKChlPT4oKGU9ZS5zcGxpdCgiPSIsMikpWzBdPWVbMF0udHJpbSgpLGUpKSkpfX1jbGFzcyBTdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInN1YmplY3RETnMiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50eXBlLFsib3B0aW9uYWwiLCJyZXF1aXJlZCJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5zdWJqZWN0RE49bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIEF0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwic3VibWl0IiwhMCksdGhpcy5lbWJlZFBERj0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZW1iZWRQREYsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLmZvcm1hdD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5mb3JtYXQsWyJ4ZHAiLCJmb3JtZGF0YSIsInBkZiIsInVybGVuY29kZWQiLCJ4ZmQiLCJ4bWwiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnRhcmdldD1lLnRhcmdldHx8IiIsdGhpcy50ZXh0RW5jb2Rpbmc9KDAsYy5nZXRLZXl3b3JkKSh7ZGF0YTplLnRleHRFbmNvZGluZz9lLnRleHRFbmNvZGluZy50b0xvd2VyQ2FzZSgpOiIiLGRlZmF1bHRWYWx1ZToiIix2YWxpZGF0ZTplPT5bInV0Zi04IiwiYmlnLWZpdmUiLCJmb250c3BlY2lmaWMiLCJnYmsiLCJnYi0xODAzMCIsImdiLTIzMTIiLCJrc2MtNTYwMSIsIm5vbmUiLCJzaGlmdC1qaXMiLCJ1Y3MtMiIsInV0Zi0xNiJdLmluY2x1ZGVzKGUpfHxlLm1hdGNoKC9pc28tODg1OS1cZHsyfS8pfSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMueGRwQ29udGVudD1lLnhkcENvbnRlbnR8fCIiLHRoaXMuZW5jcnlwdD1udWxsLHRoaXMuZW5jcnlwdERhdGE9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zaWduRGF0YT1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3Mga3QgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJ0ZW1wbGF0ZSIsITApLHRoaXMuYmFzZVByb2ZpbGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYmFzZVByb2ZpbGUsWyJmdWxsIiwiaW50ZXJhY3RpdmVGb3JtcyJdKSx0aGlzLmV4dHJhcz1udWxsLHRoaXMuc3ViZm9ybT1uZXcgby5YRkFPYmplY3RBcnJheX1bbi4kZmluYWxpemVdKCl7MD09PXRoaXMuc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGgmJigwLGwud2FybikoIlhGQSAtIE5vIHN1YmZvcm1zIGluIHRlbXBsYXRlIG5vZGUuIiksdGhpcy5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aD49MiYmKDAsbC53YXJuKSgiWEZBIC0gU2V2ZXJhbCBzdWJmb3JtcyBpbiB0ZW1wbGF0ZSBub2RlOiBwbGVhc2UgZmlsZSBhIGJ1Zy4iKSx0aGlzW24uJHRhYkluZGV4XT01ZTN9W24uJGlzU3BsaXR0YWJsZV0oKXtyZXR1cm4hMH1bbi4kc2VhcmNoTm9kZV0oZSx0KXtyZXR1cm4gZS5zdGFydHNXaXRoKCIjIik/W3RoaXNbbi4kaWRzXS5nZXQoZS5zbGljZSgxKSldOigwLGQuc2VhcmNoTm9kZSkodGhpcyx0LGUsITAsITApfSpbbi4kdG9QYWdlc10oKXt2YXIgZSx0O2lmKCF0aGlzLnN1YmZvcm0uY2hpbGRyZW4ubGVuZ3RoKXJldHVybiBjLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixjaGlsZHJlbjpbXX0pO3RoaXNbbi4kZXh0cmFdPXtvdmVyZmxvd05vZGU6bnVsbCxmaXJzdFVuc3BsaXR0YWJsZTpudWxsLGN1cnJlbnRDb250ZW50QXJlYTpudWxsLGN1cnJlbnRQYWdlQXJlYTpudWxsLG5vTGF5b3V0RmFpbHVyZTohMSxwYWdlTnVtYmVyOjEscGFnZVBvc2l0aW9uOiJmaXJzdCIsb2RkT3JFdmVuOiJvZGQiLGJsYW5rT3JOb3RCbGFuazoibm9uQmxhbmsiLHBhcmFTdGFjazpbXX07Y29uc3Qgcj10aGlzLnN1YmZvcm0uY2hpbGRyZW5bMF07ci5wYWdlU2V0W24uJGNsZWFuUGFnZV0oKTtjb25zdCBhPXIucGFnZVNldC5wYWdlQXJlYS5jaGlsZHJlbixpPXtuYW1lOiJkaXYiLGNoaWxkcmVuOltdfTtsZXQgcz1udWxsLG89bnVsbCxoPW51bGw7aWYoci5icmVha0JlZm9yZS5jaGlsZHJlbi5sZW5ndGg+PTE/KG89ci5icmVha0JlZm9yZS5jaGlsZHJlblswXSxoPW8udGFyZ2V0KTpyLnN1YmZvcm0uY2hpbGRyZW4ubGVuZ3RoPj0xJiZyLnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoPj0xPyhvPXIuc3ViZm9ybS5jaGlsZHJlblswXS5icmVha0JlZm9yZS5jaGlsZHJlblswXSxoPW8udGFyZ2V0KTpudWxsIT09KGU9ci5icmVhaykmJnZvaWQgMCE9PWUmJmUuYmVmb3JlVGFyZ2V0PyhvPXIuYnJlYWssaD1vLmJlZm9yZVRhcmdldCk6ci5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aD49MSYmbnVsbCE9PSh0PXIuc3ViZm9ybS5jaGlsZHJlblswXS5icmVhaykmJnZvaWQgMCE9PXQmJnQuYmVmb3JlVGFyZ2V0JiYobz1yLnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWssaD1vLmJlZm9yZVRhcmdldCksbyl7Y29uc3QgZT10aGlzW24uJHNlYXJjaE5vZGVdKGgsb1tuLiRnZXRQYXJlbnRdKCkpO2UgaW5zdGFuY2VvZiBRZSYmKHM9ZSxvW24uJGV4dHJhXT17fSl9c3x8KHM9YVswXSksc1tuLiRleHRyYV09e251bWJlck9mVXNlOjF9O2NvbnN0IHU9c1tuLiRnZXRQYXJlbnRdKCk7dVtuLiRleHRyYV09e251bWJlck9mVXNlOjEscGFnZUluZGV4OnUucGFnZUFyZWEuY2hpbGRyZW4uaW5kZXhPZihzKSxwYWdlU2V0SW5kZXg6MH07bGV0IGQsZj1udWxsLGc9bnVsbCxwPSEwLG09MCxiPTA7Zm9yKDs7KXtpZihwKW09MDtlbHNlIGlmKGkuY2hpbGRyZW4ucG9wKCksMz09KyttKXJldHVybigwLGwud2FybikoIlhGQSAtIFNvbWV0aGluZyBnb2VzIHdyb25nOiBwbGVhc2UgZmlsZSBhIGJ1Zy4iKSxpO2Q9bnVsbCx0aGlzW24uJGV4dHJhXS5jdXJyZW50UGFnZUFyZWE9cztjb25zdCBlPXNbbi4kdG9IVE1MXSgpLmh0bWw7aS5jaGlsZHJlbi5wdXNoKGUpLGYmJih0aGlzW24uJGV4dHJhXS5ub0xheW91dEZhaWx1cmU9ITAsZS5jaGlsZHJlbi5wdXNoKGZbbi4kdG9IVE1MXShzW24uJGV4dHJhXS5zcGFjZSkuaHRtbCksZj1udWxsKSxnJiYodGhpc1tuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlPSEwLGUuY2hpbGRyZW4ucHVzaChnW24uJHRvSFRNTF0oc1tuLiRleHRyYV0uc3BhY2UpLmh0bWwpLGc9bnVsbCk7Y29uc3QgdD1zLmNvbnRlbnRBcmVhLmNoaWxkcmVuLGE9ZS5jaGlsZHJlbi5maWx0ZXIoKGU9PmUuYXR0cmlidXRlcy5jbGFzcy5pbmNsdWRlcygieGZhQ29udGVudGFyZWEiKSkpO3A9ITEsdGhpc1tuLiRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGU9bnVsbCx0aGlzW24uJGV4dHJhXS5ub0xheW91dEZhaWx1cmU9ITE7Y29uc3Qgbz1lPT57Y29uc3QgdD1yW24uJGZsdXNoSFRNTF0oKTt2YXIgaTt0JiYocHx8KHA9KG51bGw9PT0oaT10LmNoaWxkcmVuKXx8dm9pZCAwPT09aT92b2lkIDA6aS5sZW5ndGgpPjApLGFbZV0uY2hpbGRyZW4ucHVzaCh0KSl9O2ZvcihsZXQgZT1iLHM9dC5sZW5ndGg7ZTxzO2UrKyl7Y29uc3Qgcz10aGlzW24uJGV4dHJhXS5jdXJyZW50Q29udGVudEFyZWE9dFtlXSxjPXt3aWR0aDpzLncsaGVpZ2h0OnMuaH07Yj0wLGYmJihhW2VdLmNoaWxkcmVuLnB1c2goZltuLiR0b0hUTUxdKGMpLmh0bWwpLGY9bnVsbCksZyYmKGFbZV0uY2hpbGRyZW4ucHVzaChnW24uJHRvSFRNTF0oYykuaHRtbCksZz1udWxsKTtjb25zdCBsPXJbbi4kdG9IVE1MXShjKTt2YXIgeTtpZihsLnN1Y2Nlc3MpcmV0dXJuIGwuaHRtbD8ocHx8KHA9KG51bGw9PT0oeT1sLmh0bWwuY2hpbGRyZW4pfHx2b2lkIDA9PT15P3ZvaWQgMDp5Lmxlbmd0aCk+MCksYVtlXS5jaGlsZHJlbi5wdXNoKGwuaHRtbCkpOiFwJiZpLmNoaWxkcmVuLmxlbmd0aD4xJiZpLmNoaWxkcmVuLnBvcCgpLGk7aWYobC5pc0JyZWFrKCkpe2NvbnN0IHQ9bC5icmVha05vZGU7aWYobyhlKSwiYXV0byI9PT10LnRhcmdldFR5cGUpY29udGludWU7dC5sZWFkZXImJihmPXRoaXNbbi4kc2VhcmNoTm9kZV0odC5sZWFkZXIsdFtuLiRnZXRQYXJlbnRdKCkpLGY9Zj9mWzBdOm51bGwpLHQudHJhaWxlciYmKGc9dGhpc1tuLiRzZWFyY2hOb2RlXSh0LnRyYWlsZXIsdFtuLiRnZXRQYXJlbnRdKCkpLGc9Zz9nWzBdOm51bGwpLCJwYWdlQXJlYSI9PT10LnRhcmdldFR5cGU/KGQ9dFtuLiRleHRyYV0udGFyZ2V0LGU9MS8wKTp0W24uJGV4dHJhXS50YXJnZXQ/KGQ9dFtuLiRleHRyYV0udGFyZ2V0LGI9dFtuLiRleHRyYV0uaW5kZXgrMSxlPTEvMCk6ZT10W24uJGV4dHJhXS5pbmRleH1lbHNlIGlmKHRoaXNbbi4kZXh0cmFdLm92ZXJmbG93Tm9kZSl7Y29uc3Qgcj10aGlzW24uJGV4dHJhXS5vdmVyZmxvd05vZGU7dGhpc1tuLiRleHRyYV0ub3ZlcmZsb3dOb2RlPW51bGw7Y29uc3QgYT1yW24uJGdldEV4dHJhXSgpLGk9YS50YXJnZXQ7YS5hZGRMZWFkZXI9bnVsbCE9PWEubGVhZGVyLGEuYWRkVHJhaWxlcj1udWxsIT09YS50cmFpbGVyLG8oZSk7Y29uc3Qgcz1lO2lmKGU9MS8wLGkgaW5zdGFuY2VvZiBRZSlkPWk7ZWxzZSBpZihpIGluc3RhbmNlb2YgZWUpe2NvbnN0IHI9dC5pbmRleE9mKGkpOy0xIT09cj9yPnM/ZT1yLTE6Yj1yOihkPWlbbi4kZ2V0UGFyZW50XSgpLGI9ZC5jb250ZW50QXJlYS5jaGlsZHJlbi5pbmRleE9mKGkpKX19ZWxzZSBvKGUpfXRoaXNbbi4kZXh0cmFdLnBhZ2VOdW1iZXIrPTEsZCYmKGRbbi4kaXNVc2FibGVdKCk/ZFtuLiRleHRyYV0ubnVtYmVyT2ZVc2UrPTE6ZD1udWxsKSxzPWR8fHNbbi4kZ2V0TmV4dFBhZ2VdKCkseWllbGQgbnVsbH19fXQuVGVtcGxhdGU9a3Q7Y2xhc3MgQ3QgZXh0ZW5kcyBvLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidGV4dCIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5tYXhDaGFycz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubWF4Q2hhcnMsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+ZT49MH0pLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMucmlkPWUucmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W24uJGFjY2VwdFdoaXRlc3BhY2VdKCl7cmV0dXJuITB9W24uJG9uQ2hpbGRdKGUpe3JldHVybiBlW24uJG5hbWVzcGFjZUlkXT09PWEuTmFtZXNwYWNlSWRzLnhodG1sLmlkPyh0aGlzW24uJGNvbnRlbnRdPWUsITApOigoMCxsLndhcm4pKCJYRkEgLSBJbnZhbGlkIGNvbnRlbnQgaW4gVGV4dDogIi5jb25jYXQoZVtuLiRub2RlTmFtZV0sIi4iKSksITEpfVtuLiRvblRleHRdKGUpe3RoaXNbbi4kY29udGVudF1pbnN0YW5jZW9mIG8uWEZBT2JqZWN0fHxzdXBlcltuLiRvblRleHRdKGUpfVtuLiRmaW5hbGl6ZV0oKXsic3RyaW5nIj09dHlwZW9mIHRoaXNbbi4kY29udGVudF0mJih0aGlzW24uJGNvbnRlbnRdPXRoaXNbbi4kY29udGVudF0ucmVwbGFjZUFsbCgiXHJcbiIsIlxuIikpfVtuLiRnZXRFeHRyYV0oKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHRoaXNbbi4kY29udGVudF0/dGhpc1tuLiRjb250ZW50XS5zcGxpdCgvW1x1MjAyOVx1MjAyOFxuXS8pLnJlZHVjZSgoKGUsdCk9Pih0JiZlLnB1c2godCksZSkpLFtdKS5qb2luKCJcbiIpOnRoaXNbbi4kY29udGVudF1bbi4kdGV4dF0oKX1bbi4kdG9IVE1MXShlKXtpZigic3RyaW5nIj09dHlwZW9mIHRoaXNbbi4kY29udGVudF0pe2NvbnN0IGU9Tyh0aGlzW24uJGNvbnRlbnRdKS5odG1sO3JldHVybiB0aGlzW24uJGNvbnRlbnRdLmluY2x1ZGVzKCJcdTIwMjkiKT8oZS5uYW1lPSJkaXYiLGUuY2hpbGRyZW49W10sdGhpc1tuLiRjb250ZW50XS5zcGxpdCgiXHUyMDI5IikubWFwKChlPT5lLnNwbGl0KC9bXHUyMDI4XG5dLykucmVkdWNlKCgoZSx0KT0+KGUucHVzaCh7bmFtZToic3BhbiIsdmFsdWU6dH0se25hbWU6ImJyIn0pLGUpKSxbXSkpKS5mb3JFYWNoKCh0PT57ZS5jaGlsZHJlbi5wdXNoKHtuYW1lOiJwIixjaGlsZHJlbjp0fSl9KSkpOi9bXHUyMDI4XG5dLy50ZXN0KHRoaXNbbi4kY29udGVudF0pJiYoZS5uYW1lPSJkaXYiLGUuY2hpbGRyZW49W10sdGhpc1tuLiRjb250ZW50XS5zcGxpdCgvW1x1MjAyOFxuXS8pLmZvckVhY2goKHQ9PntlLmNoaWxkcmVuLnB1c2goe25hbWU6InNwYW4iLHZhbHVlOnR9LHtuYW1lOiJiciJ9KX0pKSksYy5IVE1MUmVzdWx0LnN1Y2Nlc3MoZSl9cmV0dXJuIHRoaXNbbi4kY29udGVudF1bbi4kdG9IVE1MXShlKX19dC5UZXh0PUN0O2NsYXNzIE90IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidGV4dEVkaXQiLCEwKSx0aGlzLmFsbG93UmljaFRleHQ9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmFsbG93UmljaFRleHQsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLmhTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaFNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubXVsdGlMaW5lPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5tdWx0aUxpbmUsZGVmYXVsdFZhbHVlOiIiLHZhbGlkYXRlOmU9PjA9PT1lfHwxPT09ZX0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLnZTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudlNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKSx0aGlzLmJvcmRlcj1udWxsLHRoaXMuY29tYj1udWxsLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5tYXJnaW49bnVsbH1bbi4kdG9IVE1MXShlKXt2YXIgdCxyO2NvbnN0IGE9KDAscy50b1N0eWxlKSh0aGlzLCJib3JkZXIiLCJmb250IiwibWFyZ2luIik7bGV0IGk7Y29uc3Qgbz10aGlzW24uJGdldFBhcmVudF0oKVtuLiRnZXRQYXJlbnRdKCk7cmV0dXJuIiI9PT10aGlzLm11bHRpTGluZSYmKHRoaXMubXVsdGlMaW5lPW8gaW5zdGFuY2VvZiBoZT8xOjApLGk9MT09PXRoaXMubXVsdGlMaW5lP3tuYW1lOiJ0ZXh0YXJlYSIsYXR0cmlidXRlczp7ZGF0YUlkOihudWxsPT09KHQ9b1tuLiRkYXRhXSl8fHZvaWQgMD09PXQ/dm9pZCAwOnRbbi4kdWlkXSl8fG9bbi4kdWlkXSxmaWVsZElkOm9bbi4kdWlkXSxjbGFzczpbInhmYVRleHRmaWVsZCJdLHN0eWxlOmEsImFyaWEtbGFiZWwiOkMobyksImFyaWEtcmVxdWlyZWQiOiExfX06e25hbWU6ImlucHV0IixhdHRyaWJ1dGVzOnt0eXBlOiJ0ZXh0IixkYXRhSWQ6KG51bGw9PT0ocj1vW24uJGRhdGFdKXx8dm9pZCAwPT09cj92b2lkIDA6cltuLiR1aWRdKXx8b1tuLiR1aWRdLGZpZWxkSWQ6b1tuLiR1aWRdLGNsYXNzOlsieGZhVGV4dGZpZWxkIl0sc3R5bGU6YSwiYXJpYS1sYWJlbCI6QyhvKSwiYXJpYS1yZXF1aXJlZCI6ITF9fSxTKG8pJiYoaS5hdHRyaWJ1dGVzWyJhcmlhLXJlcXVpcmVkIl09ITAsaS5hdHRyaWJ1dGVzLnJlcXVpcmVkPSEwKSxjLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToibGFiZWwiLGF0dHJpYnV0ZXM6e2NsYXNzOlsieGZhTGFiZWwiXX0sY2hpbGRyZW46W2ldfSl9fWNsYXNzIEZ0IGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidGltZSIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifVtuLiRmaW5hbGl6ZV0oKXtjb25zdCBlPXRoaXNbbi4kY29udGVudF0udHJpbSgpO3RoaXNbbi4kY29udGVudF09ZT9uZXcgRGF0ZShlKTpudWxsfVtuLiR0b0hUTUxdKGUpe3JldHVybiBPKHRoaXNbbi4kY29udGVudF0/dGhpc1tuLiRjb250ZW50XS50b1N0cmluZygpOiIiKX19Y2xhc3MgSXQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJ0aW1lU3RhbXAiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMuc2VydmVyPWUuc2VydmVyfHwiIix0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBUdCBleHRlbmRzIG8uU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInRvb2xUaXAiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucmlkPWUucmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIE10IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidHJhdmVyc2FsIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbCx0aGlzLnRyYXZlcnNlPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBFdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInRyYXZlcnNlIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm9wZXJhdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5vcGVyYXRpb24sWyJuZXh0IiwiYmFjayIsImRvd24iLCJmaXJzdCIsImxlZnQiLCJyaWdodCIsInVwIl0pLHRoaXMucmVmPWUucmVmfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbCx0aGlzLnNjcmlwdD1udWxsfWdldCBuYW1lKCl7cmV0dXJuIHRoaXMub3BlcmF0aW9ufVtuLiRpc1RyYW5zcGFyZW50XSgpe3JldHVybiExfX1jbGFzcyBQdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInVpIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbCx0aGlzLnBpY3R1cmU9bnVsbCx0aGlzLmJhcmNvZGU9bnVsbCx0aGlzLmJ1dHRvbj1udWxsLHRoaXMuY2hlY2tCdXR0b249bnVsbCx0aGlzLmNob2ljZUxpc3Q9bnVsbCx0aGlzLmRhdGVUaW1lRWRpdD1udWxsLHRoaXMuZGVmYXVsdFVpPW51bGwsdGhpcy5pbWFnZUVkaXQ9bnVsbCx0aGlzLm51bWVyaWNFZGl0PW51bGwsdGhpcy5wYXNzd29yZEVkaXQ9bnVsbCx0aGlzLnNpZ25hdHVyZT1udWxsLHRoaXMudGV4dEVkaXQ9bnVsbH1bbi4kZ2V0RXh0cmFdKCl7aWYodm9pZCAwPT09dGhpc1tuLiRleHRyYV0pe2Zvcihjb25zdCBlIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKXtpZigiZXh0cmFzIj09PWV8fCJwaWN0dXJlIj09PWUpY29udGludWU7Y29uc3QgdD10aGlzW2VdO2lmKHQgaW5zdGFuY2VvZiBvLlhGQU9iamVjdClyZXR1cm4gdGhpc1tuLiRleHRyYV09dCx0fXRoaXNbbi4kZXh0cmFdPW51bGx9cmV0dXJuIHRoaXNbbi4kZXh0cmFdfVtuLiR0b0hUTUxdKGUpe2NvbnN0IHQ9dGhpc1tuLiRnZXRFeHRyYV0oKTtyZXR1cm4gdD90W24uJHRvSFRNTF0oZSk6Yy5IVE1MUmVzdWx0LkVNUFRZfX1jbGFzcyBSdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInZhbGlkYXRlIiwhMCksdGhpcy5mb3JtYXRUZXN0PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmZvcm1hdFRlc3QsWyJ3YXJuaW5nIiwiZGlzYWJsZWQiLCJlcnJvciJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubnVsbFRlc3Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUubnVsbFRlc3QsWyJkaXNhYmxlZCIsImVycm9yIiwid2FybmluZyJdKSx0aGlzLnNjcmlwdFRlc3Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuc2NyaXB0VGVzdCxbImVycm9yIiwiZGlzYWJsZWQiLCJ3YXJuaW5nIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmV4dHJhcz1udWxsLHRoaXMubWVzc2FnZT1udWxsLHRoaXMucGljdHVyZT1udWxsLHRoaXMuc2NyaXB0PW51bGx9fWNsYXNzIE50IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidmFsdWUiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMub3ZlcnJpZGU9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLm92ZXJyaWRlLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy5yZWxldmFudD0oMCxjLmdldFJlbGV2YW50KShlLnJlbGV2YW50KSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5hcmM9bnVsbCx0aGlzLmJvb2xlYW49bnVsbCx0aGlzLmRhdGU9bnVsbCx0aGlzLmRhdGVUaW1lPW51bGwsdGhpcy5kZWNpbWFsPW51bGwsdGhpcy5leERhdGE9bnVsbCx0aGlzLmZsb2F0PW51bGwsdGhpcy5pbWFnZT1udWxsLHRoaXMuaW50ZWdlcj1udWxsLHRoaXMubGluZT1udWxsLHRoaXMucmVjdGFuZ2xlPW51bGwsdGhpcy50ZXh0PW51bGwsdGhpcy50aW1lPW51bGx9W24uJHNldFZhbHVlXShlKXt2YXIgdDtjb25zdCByPXRoaXNbbi4kZ2V0UGFyZW50XSgpO2lmKHIgaW5zdGFuY2VvZiBDZSYmbnVsbCE9PSh0PXIudWkpJiZ2b2lkIDAhPT10JiZ0LmltYWdlRWRpdClyZXR1cm4gdGhpcy5pbWFnZXx8KHRoaXMuaW1hZ2U9bmV3IFJlKHt9KSx0aGlzW24uJGFwcGVuZENoaWxkXSh0aGlzLmltYWdlKSksdm9pZCh0aGlzLmltYWdlW24uJGNvbnRlbnRdPWVbbi4kY29udGVudF0pO2NvbnN0IGE9ZVtuLiRub2RlTmFtZV07aWYobnVsbD09PXRoaXNbYV0pe2Zvcihjb25zdCBlIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKXtjb25zdCB0PXRoaXNbZV07dCBpbnN0YW5jZW9mIG8uWEZBT2JqZWN0JiYodGhpc1tlXT1udWxsLHRoaXNbbi4kcmVtb3ZlQ2hpbGRdKHQpKX10aGlzW2Vbbi4kbm9kZU5hbWVdXT1lLHRoaXNbbi4kYXBwZW5kQ2hpbGRdKGUpfWVsc2UgdGhpc1thXVtuLiRjb250ZW50XT1lW24uJGNvbnRlbnRdfVtuLiR0ZXh0XSgpe2lmKHRoaXMuZXhEYXRhKXJldHVybiJzdHJpbmciPT10eXBlb2YgdGhpcy5leERhdGFbbi4kY29udGVudF0/dGhpcy5leERhdGFbbi4kY29udGVudF0udHJpbSgpOnRoaXMuZXhEYXRhW24uJGNvbnRlbnRdW24uJHRleHRdKCkudHJpbSgpO2Zvcihjb25zdCBlIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKXtpZigiaW1hZ2UiPT09ZSljb250aW51ZTtjb25zdCB0PXRoaXNbZV07aWYodCBpbnN0YW5jZW9mIG8uWEZBT2JqZWN0KXJldHVybih0W24uJGNvbnRlbnRdfHwiIikudG9TdHJpbmcoKS50cmltKCl9cmV0dXJuIG51bGx9W24uJHRvSFRNTF0oZSl7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2NvbnN0IHI9dGhpc1t0XTtpZihyIGluc3RhbmNlb2Ygby5YRkFPYmplY3QpcmV0dXJuIHJbbi4kdG9IVE1MXShlKX1yZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZfX10LlZhbHVlPU50O2NsYXNzIER0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidmFyaWFibGVzIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5ib29sZWFuPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRhdGVUaW1lPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGVjaW1hbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZsb2F0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuaW1hZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5pbnRlZ2VyPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMubWFuaWZlc3Q9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zY3JpcHQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy50ZXh0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGltZT1uZXcgby5YRkFPYmplY3RBcnJheX1bbi4kaXNUcmFuc3BhcmVudF0oKXtyZXR1cm4hMH19Y2xhc3MgQnR7c3RhdGljW2EuJGJ1aWxkWEZBT2JqZWN0XShlLHQpe2lmKEJ0Lmhhc093blByb3BlcnR5KGUpKXtjb25zdCByPUJ0W2VdKHQpO3JldHVybiByW24uJHNldFNldEF0dHJpYnV0ZXNdKHQpLHJ9fXN0YXRpYyBhcHBlYXJhbmNlRmlsdGVyKGUpe3JldHVybiBuZXcgRShlKX1zdGF0aWMgYXJjKGUpe3JldHVybiBuZXcgUChlKX1zdGF0aWMgYXJlYShlKXtyZXR1cm4gbmV3IFIoZSl9c3RhdGljIGFzc2lzdChlKXtyZXR1cm4gbmV3IE4oZSl9c3RhdGljIGJhcmNvZGUoZSl7cmV0dXJuIG5ldyBEKGUpfXN0YXRpYyBiaW5kKGUpe3JldHVybiBuZXcgQihlKX1zdGF0aWMgYmluZEl0ZW1zKGUpe3JldHVybiBuZXcgTChlKX1zdGF0aWMgYm9va2VuZChlKXtyZXR1cm4gbmV3IF8oZSl9c3RhdGljIGJvb2xlYW4oZSl7cmV0dXJuIG5ldyBqKGUpfXN0YXRpYyBib3JkZXIoZSl7cmV0dXJuIG5ldyBVKGUpfXN0YXRpYyBicmVhayhlKXtyZXR1cm4gbmV3ICQoZSl9c3RhdGljIGJyZWFrQWZ0ZXIoZSl7cmV0dXJuIG5ldyBYKGUpfXN0YXRpYyBicmVha0JlZm9yZShlKXtyZXR1cm4gbmV3IEgoZSl9c3RhdGljIGJ1dHRvbihlKXtyZXR1cm4gbmV3IHEoZSl9c3RhdGljIGNhbGN1bGF0ZShlKXtyZXR1cm4gbmV3IHooZSl9c3RhdGljIGNhcHRpb24oZSl7cmV0dXJuIG5ldyBHKGUpfXN0YXRpYyBjZXJ0aWZpY2F0ZShlKXtyZXR1cm4gbmV3IFcoZSl9c3RhdGljIGNlcnRpZmljYXRlcyhlKXtyZXR1cm4gbmV3IFYoZSl9c3RhdGljIGNoZWNrQnV0dG9uKGUpe3JldHVybiBuZXcgSyhlKX1zdGF0aWMgY2hvaWNlTGlzdChlKXtyZXR1cm4gbmV3IFkoZSl9c3RhdGljIGNvbG9yKGUpe3JldHVybiBuZXcgSihlKX1zdGF0aWMgY29tYihlKXtyZXR1cm4gbmV3IFooZSl9c3RhdGljIGNvbm5lY3QoZSl7cmV0dXJuIG5ldyBRKGUpfXN0YXRpYyBjb250ZW50QXJlYShlKXtyZXR1cm4gbmV3IGVlKGUpfXN0YXRpYyBjb3JuZXIoZSl7cmV0dXJuIG5ldyB0ZShlKX1zdGF0aWMgZGF0ZShlKXtyZXR1cm4gbmV3IHJlKGUpfXN0YXRpYyBkYXRlVGltZShlKXtyZXR1cm4gbmV3IG5lKGUpfXN0YXRpYyBkYXRlVGltZUVkaXQoZSl7cmV0dXJuIG5ldyBhZShlKX1zdGF0aWMgZGVjaW1hbChlKXtyZXR1cm4gbmV3IGllKGUpfXN0YXRpYyBkZWZhdWx0VWkoZSl7cmV0dXJuIG5ldyBzZShlKX1zdGF0aWMgZGVzYyhlKXtyZXR1cm4gbmV3IG9lKGUpfXN0YXRpYyBkaWdlc3RNZXRob2QoZSl7cmV0dXJuIG5ldyBjZShlKX1zdGF0aWMgZGlnZXN0TWV0aG9kcyhlKXtyZXR1cm4gbmV3IGxlKGUpfXN0YXRpYyBkcmF3KGUpe3JldHVybiBuZXcgaGUoZSl9c3RhdGljIGVkZ2UoZSl7cmV0dXJuIG5ldyB1ZShlKX1zdGF0aWMgZW5jb2RpbmcoZSl7cmV0dXJuIG5ldyBkZShlKX1zdGF0aWMgZW5jb2RpbmdzKGUpe3JldHVybiBuZXcgZmUoZSl9c3RhdGljIGVuY3J5cHQoZSl7cmV0dXJuIG5ldyBnZShlKX1zdGF0aWMgZW5jcnlwdERhdGEoZSl7cmV0dXJuIG5ldyBwZShlKX1zdGF0aWMgZW5jcnlwdGlvbihlKXtyZXR1cm4gbmV3IG1lKGUpfXN0YXRpYyBlbmNyeXB0aW9uTWV0aG9kKGUpe3JldHVybiBuZXcgYmUoZSl9c3RhdGljIGVuY3J5cHRpb25NZXRob2RzKGUpe3JldHVybiBuZXcgeWUoZSl9c3RhdGljIGV2ZW50KGUpe3JldHVybiBuZXcgd2UoZSl9c3RhdGljIGV4RGF0YShlKXtyZXR1cm4gbmV3IHZlKGUpfXN0YXRpYyBleE9iamVjdChlKXtyZXR1cm4gbmV3IHhlKGUpfXN0YXRpYyBleGNsR3JvdXAoZSl7cmV0dXJuIG5ldyBTZShlKX1zdGF0aWMgZXhlY3V0ZShlKXtyZXR1cm4gbmV3IEFlKGUpfXN0YXRpYyBleHRyYXMoZSl7cmV0dXJuIG5ldyBrZShlKX1zdGF0aWMgZmllbGQoZSl7cmV0dXJuIG5ldyBDZShlKX1zdGF0aWMgZmlsbChlKXtyZXR1cm4gbmV3IE9lKGUpfXN0YXRpYyBmaWx0ZXIoZSl7cmV0dXJuIG5ldyBGZShlKX1zdGF0aWMgZmxvYXQoZSl7cmV0dXJuIG5ldyBJZShlKX1zdGF0aWMgZm9udChlKXtyZXR1cm4gbmV3IFRlKGUpfXN0YXRpYyBmb3JtYXQoZSl7cmV0dXJuIG5ldyBNZShlKX1zdGF0aWMgaGFuZGxlcihlKXtyZXR1cm4gbmV3IEVlKGUpfXN0YXRpYyBoeXBoZW5hdGlvbihlKXtyZXR1cm4gbmV3IFBlKGUpfXN0YXRpYyBpbWFnZShlKXtyZXR1cm4gbmV3IFJlKGUpfXN0YXRpYyBpbWFnZUVkaXQoZSl7cmV0dXJuIG5ldyBOZShlKX1zdGF0aWMgaW50ZWdlcihlKXtyZXR1cm4gbmV3IERlKGUpfXN0YXRpYyBpc3N1ZXJzKGUpe3JldHVybiBuZXcgQmUoZSl9c3RhdGljIGl0ZW1zKGUpe3JldHVybiBuZXcgTGUoZSl9c3RhdGljIGtlZXAoZSl7cmV0dXJuIG5ldyBfZShlKX1zdGF0aWMga2V5VXNhZ2UoZSl7cmV0dXJuIG5ldyBqZShlKX1zdGF0aWMgbGluZShlKXtyZXR1cm4gbmV3IFVlKGUpfXN0YXRpYyBsaW5lYXIoZSl7cmV0dXJuIG5ldyAkZShlKX1zdGF0aWMgbG9ja0RvY3VtZW50KGUpe3JldHVybiBuZXcgWGUoZSl9c3RhdGljIG1hbmlmZXN0KGUpe3JldHVybiBuZXcgSGUoZSl9c3RhdGljIG1hcmdpbihlKXtyZXR1cm4gbmV3IHFlKGUpfXN0YXRpYyBtZHAoZSl7cmV0dXJuIG5ldyB6ZShlKX1zdGF0aWMgbWVkaXVtKGUpe3JldHVybiBuZXcgR2UoZSl9c3RhdGljIG1lc3NhZ2UoZSl7cmV0dXJuIG5ldyBXZShlKX1zdGF0aWMgbnVtZXJpY0VkaXQoZSl7cmV0dXJuIG5ldyBWZShlKX1zdGF0aWMgb2NjdXIoZSl7cmV0dXJuIG5ldyBLZShlKX1zdGF0aWMgb2lkKGUpe3JldHVybiBuZXcgWWUoZSl9c3RhdGljIG9pZHMoZSl7cmV0dXJuIG5ldyBKZShlKX1zdGF0aWMgb3ZlcmZsb3coZSl7cmV0dXJuIG5ldyBaZShlKX1zdGF0aWMgcGFnZUFyZWEoZSl7cmV0dXJuIG5ldyBRZShlKX1zdGF0aWMgcGFnZVNldChlKXtyZXR1cm4gbmV3IGV0KGUpfXN0YXRpYyBwYXJhKGUpe3JldHVybiBuZXcgdHQoZSl9c3RhdGljIHBhc3N3b3JkRWRpdChlKXtyZXR1cm4gbmV3IHJ0KGUpfXN0YXRpYyBwYXR0ZXJuKGUpe3JldHVybiBuZXcgbnQoZSl9c3RhdGljIHBpY3R1cmUoZSl7cmV0dXJuIG5ldyBhdChlKX1zdGF0aWMgcHJvdG8oZSl7cmV0dXJuIG5ldyBpdChlKX1zdGF0aWMgcmFkaWFsKGUpe3JldHVybiBuZXcgc3QoZSl9c3RhdGljIHJlYXNvbihlKXtyZXR1cm4gbmV3IG90KGUpfXN0YXRpYyByZWFzb25zKGUpe3JldHVybiBuZXcgY3QoZSl9c3RhdGljIHJlY3RhbmdsZShlKXtyZXR1cm4gbmV3IGx0KGUpfXN0YXRpYyByZWYoZSl7cmV0dXJuIG5ldyBodChlKX1zdGF0aWMgc2NyaXB0KGUpe3JldHVybiBuZXcgdXQoZSl9c3RhdGljIHNldFByb3BlcnR5KGUpe3JldHVybiBuZXcgZHQoZSl9c3RhdGljIHNpZ25EYXRhKGUpe3JldHVybiBuZXcgZnQoZSl9c3RhdGljIHNpZ25hdHVyZShlKXtyZXR1cm4gbmV3IGd0KGUpfXN0YXRpYyBzaWduaW5nKGUpe3JldHVybiBuZXcgcHQoZSl9c3RhdGljIHNvbGlkKGUpe3JldHVybiBuZXcgbXQoZSl9c3RhdGljIHNwZWFrKGUpe3JldHVybiBuZXcgYnQoZSl9c3RhdGljIHN0aXBwbGUoZSl7cmV0dXJuIG5ldyB5dChlKX1zdGF0aWMgc3ViZm9ybShlKXtyZXR1cm4gbmV3IHd0KGUpfXN0YXRpYyBzdWJmb3JtU2V0KGUpe3JldHVybiBuZXcgdnQoZSl9c3RhdGljIHN1YmplY3RETihlKXtyZXR1cm4gbmV3IHh0KGUpfXN0YXRpYyBzdWJqZWN0RE5zKGUpe3JldHVybiBuZXcgU3QoZSl9c3RhdGljIHN1Ym1pdChlKXtyZXR1cm4gbmV3IEF0KGUpfXN0YXRpYyB0ZW1wbGF0ZShlKXtyZXR1cm4gbmV3IGt0KGUpfXN0YXRpYyB0ZXh0KGUpe3JldHVybiBuZXcgQ3QoZSl9c3RhdGljIHRleHRFZGl0KGUpe3JldHVybiBuZXcgT3QoZSl9c3RhdGljIHRpbWUoZSl7cmV0dXJuIG5ldyBGdChlKX1zdGF0aWMgdGltZVN0YW1wKGUpe3JldHVybiBuZXcgSXQoZSl9c3RhdGljIHRvb2xUaXAoZSl7cmV0dXJuIG5ldyBUdChlKX1zdGF0aWMgdHJhdmVyc2FsKGUpe3JldHVybiBuZXcgTXQoZSl9c3RhdGljIHRyYXZlcnNlKGUpe3JldHVybiBuZXcgRXQoZSl9c3RhdGljIHVpKGUpe3JldHVybiBuZXcgUHQoZSl9c3RhdGljIHZhbGlkYXRlKGUpe3JldHVybiBuZXcgUnQoZSl9c3RhdGljIHZhbHVlKGUpe3JldHVybiBuZXcgTnQoZSl9c3RhdGljIHZhcmlhYmxlcyhlKXtyZXR1cm4gbmV3IER0KGUpfX10LlRlbXBsYXRlTmFtZXNwYWNlPUJ0fSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoNCksaT1yKDI0KSxzPXIoMTEpLG89cig0NSkuZixjPXIoMzkpLGw9cigyMzIpLGg9cig3NSksdT1yKDc2KSxkPXIoMjMzKSxmPXIoODIpLGc9cig2KSxwPXIoMzYpLG09IkRPTUV4Y2VwdGlvbiIsYj1pKCJFcnJvciIpLHk9aShtKSx3PWZ1bmN0aW9uKCl7bCh0aGlzLHYpO3ZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD11KGU8MT92b2lkIDA6YXJndW1lbnRzWzBdKSxyPXUoZTwyP3ZvaWQgMDphcmd1bWVudHNbMV0sIkVycm9yIiksbj1uZXcgeSh0LHIpLGE9Yih0KTtyZXR1cm4gYS5uYW1lPW0sbyhuLCJzdGFjayIscygxLGYoYS5zdGFjaywxKSkpLGgobix0aGlzLHcpLG59LHY9dy5wcm90b3R5cGU9eS5wcm90b3R5cGUseD0ic3RhY2siaW4gYihtKSxTPSJzdGFjayJpbiBuZXcgeSgxLDIpLEE9eSYmZyYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLG0pLGs9ISghQXx8QS53cml0YWJsZSYmQS5jb25maWd1cmFibGUpLEM9eCYmIWsmJiFTO24oe2dsb2JhbDohMCxjb25zdHJ1Y3RvcjohMCxmb3JjZWQ6cHx8Q30se0RPTUV4Y2VwdGlvbjpDP3c6eX0pO3ZhciBPPWkobSksRj1PLnByb3RvdHlwZTtpZihGLmNvbnN0cnVjdG9yIT09Tylmb3IodmFyIEkgaW4gcHx8byhGLCJjb25zdHJ1Y3RvciIscygxLE8pKSxkKWlmKGMoZCxJKSl7dmFyIFQ9ZFtJXSxNPVQucztjKE8sTSl8fG8oTyxNLHMoNixULmMpKX19LChlLHQscik9Pnt2YXIgbj1yKDI1KSxhPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihuKHQsZSkpcmV0dXJuIGU7dGhyb3cgYSgiSW5jb3JyZWN0IGludm9jYXRpb24iKX19LGU9PntlLmV4cG9ydHM9e0luZGV4U2l6ZUVycm9yOntzOiJJTkRFWF9TSVpFX0VSUiIsYzoxLG06MX0sRE9NU3RyaW5nU2l6ZUVycm9yOntzOiJET01TVFJJTkdfU0laRV9FUlIiLGM6MixtOjB9LEhpZXJhcmNoeVJlcXVlc3RFcnJvcjp7czoiSElFUkFSQ0hZX1JFUVVFU1RfRVJSIixjOjMsbToxfSxXcm9uZ0RvY3VtZW50RXJyb3I6e3M6IldST05HX0RPQ1VNRU5UX0VSUiIsYzo0LG06MX0sSW52YWxpZENoYXJhY3RlckVycm9yOntzOiJJTlZBTElEX0NIQVJBQ1RFUl9FUlIiLGM6NSxtOjF9LE5vRGF0YUFsbG93ZWRFcnJvcjp7czoiTk9fREFUQV9BTExPV0VEX0VSUiIsYzo2LG06MH0sTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyb3I6e3M6Ik5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiIsYzo3LG06MX0sTm90Rm91bmRFcnJvcjp7czoiTk9UX0ZPVU5EX0VSUiIsYzo4LG06MX0sTm90U3VwcG9ydGVkRXJyb3I6e3M6Ik5PVF9TVVBQT1JURURfRVJSIixjOjksbToxfSxJblVzZUF0dHJpYnV0ZUVycm9yOntzOiJJTlVTRV9BVFRSSUJVVEVfRVJSIixjOjEwLG06MX0sSW52YWxpZFN0YXRlRXJyb3I6e3M6IklOVkFMSURfU1RBVEVfRVJSIixjOjExLG06MX0sU3ludGF4RXJyb3I6e3M6IlNZTlRBWF9FUlIiLGM6MTIsbToxfSxJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3I6e3M6IklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiIsYzoxMyxtOjF9LE5hbWVzcGFjZUVycm9yOntzOiJOQU1FU1BBQ0VfRVJSIixjOjE0LG06MX0sSW52YWxpZEFjY2Vzc0Vycm9yOntzOiJJTlZBTElEX0FDQ0VTU19FUlIiLGM6MTUsbToxfSxWYWxpZGF0aW9uRXJyb3I6e3M6IlZBTElEQVRJT05fRVJSIixjOjE2LG06MH0sVHlwZU1pc21hdGNoRXJyb3I6e3M6IlRZUEVfTUlTTUFUQ0hfRVJSIixjOjE3LG06MX0sU2VjdXJpdHlFcnJvcjp7czoiU0VDVVJJVFlfRVJSIixjOjE4LG06MX0sTmV0d29ya0Vycm9yOntzOiJORVRXT1JLX0VSUiIsYzoxOSxtOjF9LEFib3J0RXJyb3I6e3M6IkFCT1JUX0VSUiIsYzoyMCxtOjF9LFVSTE1pc21hdGNoRXJyb3I6e3M6IlVSTF9NSVNNQVRDSF9FUlIiLGM6MjEsbToxfSxRdW90YUV4Y2VlZGVkRXJyb3I6e3M6IlFVT1RBX0VYQ0VFREVEX0VSUiIsYzoyMixtOjF9LFRpbWVvdXRFcnJvcjp7czoiVElNRU9VVF9FUlIiLGM6MjMsbToxfSxJbnZhbGlkTm9kZVR5cGVFcnJvcjp7czoiSU5WQUxJRF9OT0RFX1RZUEVfRVJSIixjOjI0LG06MX0sRGF0YUNsb25lRXJyb3I6e3M6IkRBVEFfQ0xPTkVfRVJSIixjOjI1LG06MX19fSwoZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lk5hbWVzcGFjZUlkcz10LiRidWlsZFhGQU9iamVjdD12b2lkIDA7Y29uc3Qgcj1TeW1ib2woKTt0LiRidWlsZFhGQU9iamVjdD1yLHQuTmFtZXNwYWNlSWRzPXtjb25maWc6e2lkOjAsY2hlY2s6ZT0+ZS5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hjaS8iKX0sY29ubmVjdGlvblNldDp7aWQ6MSxjaGVjazplPT5lLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWNvbm5lY3Rpb24tc2V0LyIpfSxkYXRhc2V0czp7aWQ6MixjaGVjazplPT5lLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvIil9LGZvcm06e2lkOjMsY2hlY2s6ZT0+ZS5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1mb3JtLyIpfSxsb2NhbGVTZXQ6e2lkOjQsY2hlY2s6ZT0+ZS5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1sb2NhbGUtc2V0LyIpfSxwZGY6e2lkOjUsY2hlY2s6ZT0+Imh0dHA6Ly9ucy5hZG9iZS5jb20veGRwL3BkZi8iPT09ZX0sc2lnbmF0dXJlOntpZDo2LGNoZWNrOmU9PiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj09PWV9LHNvdXJjZVNldDp7aWQ6NyxjaGVjazplPT5lLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXNvdXJjZS1zZXQvIil9LHN0eWxlc2hlZXQ6e2lkOjgsY2hlY2s6ZT0+Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI9PT1lfSx0ZW1wbGF0ZTp7aWQ6OSxjaGVjazplPT5lLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXRlbXBsYXRlLyIpfSx4ZGM6e2lkOjEwLGNoZWNrOmU9PmUuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZGMvIil9LHhkcDp7aWQ6MTEsY2hlY2s6ZT0+Imh0dHA6Ly9ucy5hZG9iZS5jb20veGRwLyI9PT1lfSx4ZmRmOntpZDoxMixjaGVjazplPT4iaHR0cDovL25zLmFkb2JlLmNvbS94ZmRmLyI9PT1lfSx4aHRtbDp7aWQ6MTMsY2hlY2s6ZT0+Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPT09ZX0seG1wbWV0YTp7aWQ6MTQsY2hlY2s6ZT0+Imh0dHA6Ly9ucy5hZG9iZS5jb20veG1wbWV0YS8iPT09ZX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuYWRkSFRNTD1mdW5jdGlvbihlLHQscil7Y29uc3Qgcz1lW24uJGV4dHJhXSxvPXMuYXZhaWxhYmxlU3BhY2UsW2MsbCxoLHVdPXI7c3dpdGNoKGUubGF5b3V0KXtjYXNlInBvc2l0aW9uIjpzLndpZHRoPU1hdGgubWF4KHMud2lkdGgsYytoKSxzLmhlaWdodD1NYXRoLm1heChzLmhlaWdodCxsK3UpLHMuY2hpbGRyZW4ucHVzaCh0KTticmVhaztjYXNlImxyLXRiIjpjYXNlInJsLXRiIjpzLmxpbmUmJjEhPT1zLmF0dGVtcHR8fChzLmxpbmU9aShlLFtdKSxzLmNoaWxkcmVuLnB1c2gocy5saW5lKSxzLm51bWJlckluTGluZT0wKSxzLm51bWJlckluTGluZSs9MSxzLmxpbmUuY2hpbGRyZW4ucHVzaCh0KSwwPT09cy5hdHRlbXB0PyhzLmN1cnJlbnRXaWR0aCs9aCxzLmhlaWdodD1NYXRoLm1heChzLmhlaWdodCxzLnByZXZIZWlnaHQrdSkpOihzLmN1cnJlbnRXaWR0aD1oLHMucHJldkhlaWdodD1zLmhlaWdodCxzLmhlaWdodCs9dSxzLmF0dGVtcHQ9MCkscy53aWR0aD1NYXRoLm1heChzLndpZHRoLHMuY3VycmVudFdpZHRoKTticmVhaztjYXNlInJsLXJvdyI6Y2FzZSJyb3ciOntzLmNoaWxkcmVuLnB1c2godCkscy53aWR0aCs9aCxzLmhlaWdodD1NYXRoLm1heChzLmhlaWdodCx1KTtjb25zdCBlPSgwLGEubWVhc3VyZVRvU3RyaW5nKShzLmhlaWdodCk7Zm9yKGNvbnN0IHQgb2Ygcy5jaGlsZHJlbil0LmF0dHJpYnV0ZXMuc3R5bGUuaGVpZ2h0PWU7YnJlYWt9Y2FzZSJ0YWJsZSI6Y2FzZSJ0YiI6cy53aWR0aD1NYXRoLm1pbihvLndpZHRoLE1hdGgubWF4KHMud2lkdGgsaCkpLHMuaGVpZ2h0Kz11LHMuY2hpbGRyZW4ucHVzaCh0KX19LHQuY2hlY2tEaW1lbnNpb25zPWZ1bmN0aW9uKGUsdCl7dmFyIHI7aWYobnVsbD09PWVbbi4kZ2V0VGVtcGxhdGVSb290XSgpW24uJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSlyZXR1cm4hMDtpZigwPT09ZS53fHwwPT09ZS5oKXJldHVybiEwO2NvbnN0IGE9ZVtuLiRnZXRTdWJmb3JtUGFyZW50XSgpLGk9KG51bGw9PT0ocj1hW24uJGV4dHJhXSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuYXR0ZW1wdCl8fDAsWyxzLG8sY109ZnVuY3Rpb24oZSl7bGV0IHQscixuPSIiPT09ZS53P05hTjplLncsYT0iIj09PWUuaD9OYU46ZS5oLFtpLHNdPVswLDBdO3N3aXRjaChlLmFuY2hvclR5cGV8fCIiKXtjYXNlImJvdHRvbUNlbnRlciI6W2ksc109W24vMixhXTticmVhaztjYXNlImJvdHRvbUxlZnQiOltpLHNdPVswLGFdO2JyZWFrO2Nhc2UiYm90dG9tUmlnaHQiOltpLHNdPVtuLGFdO2JyZWFrO2Nhc2UibWlkZGxlQ2VudGVyIjpbaSxzXT1bbi8yLGEvMl07YnJlYWs7Y2FzZSJtaWRkbGVMZWZ0IjpbaSxzXT1bMCxhLzJdO2JyZWFrO2Nhc2UibWlkZGxlUmlnaHQiOltpLHNdPVtuLGEvMl07YnJlYWs7Y2FzZSJ0b3BDZW50ZXIiOltpLHNdPVtuLzIsMF07YnJlYWs7Y2FzZSJ0b3BSaWdodCI6W2ksc109W24sMF19c3dpdGNoKGUucm90YXRlfHwwKXtjYXNlIDA6W3Qscl09Wy1pLC1zXTticmVhaztjYXNlIDkwOlt0LHJdPVstcyxpXSxbbixhXT1bYSwtbl07YnJlYWs7Y2FzZSAxODA6W3Qscl09W2ksc10sW24sYV09Wy1uLC1hXTticmVhaztjYXNlIDI3MDpbdCxyXT1bcywtaV0sW24sYV09Wy1hLG5dfXJldHVybltlLngrdCtNYXRoLm1pbigwLG4pLGUueStyK01hdGgubWluKDAsYSksTWF0aC5hYnMobiksTWF0aC5hYnMoYSldfShlKTtzd2l0Y2goYS5sYXlvdXQpe2Nhc2UibHItdGIiOmNhc2UicmwtdGIiOnJldHVybiAwPT09aT9lW24uJGdldFRlbXBsYXRlUm9vdF0oKVtuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlPyIiIT09ZS53P01hdGgucm91bmQoby10LndpZHRoKTw9Mjp0LndpZHRoPjI6ISgiIiE9PWUuaCYmTWF0aC5yb3VuZChjLXQuaGVpZ2h0KT4yKSYmKCIiIT09ZS53P01hdGgucm91bmQoby10LndpZHRoKTw9Mnx8MD09PWFbbi4kZXh0cmFdLm51bWJlckluTGluZSYmdC5oZWlnaHQ+Mjp0LndpZHRoPjIpOiEhZVtuLiRnZXRUZW1wbGF0ZVJvb3RdKClbbi4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZXx8ISgiIiE9PWUuaCYmTWF0aC5yb3VuZChjLXQuaGVpZ2h0KT4yKSYmKCIiPT09ZS53fHxNYXRoLnJvdW5kKG8tdC53aWR0aCk8PTJ8fCFhW24uJGlzVGhlcmVNb3JlV2lkdGhdKCkpJiZ0LmhlaWdodD4yO2Nhc2UidGFibGUiOmNhc2UidGIiOnJldHVybiEhZVtuLiRnZXRUZW1wbGF0ZVJvb3RdKClbbi4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZXx8KCIiPT09ZS5ofHxlW24uJGlzU3BsaXR0YWJsZV0oKT8oIiI9PT1lLnd8fE1hdGgucm91bmQoby10LndpZHRoKTw9Mnx8IWFbbi4kaXNUaGVyZU1vcmVXaWR0aF0oKSkmJnQuaGVpZ2h0PjI6TWF0aC5yb3VuZChjLXQuaGVpZ2h0KTw9Mik7Y2FzZSJwb3NpdGlvbiI6cmV0dXJuISFlW24uJGdldFRlbXBsYXRlUm9vdF0oKVtuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlfHwiIj09PWUuaHx8TWF0aC5yb3VuZChjK3MtdC5oZWlnaHQpPD0yfHxjK3M+ZVtuLiRnZXRUZW1wbGF0ZVJvb3RdKClbbi4kZXh0cmFdLmN1cnJlbnRDb250ZW50QXJlYS5oO2Nhc2Uicmwtcm93IjpjYXNlInJvdyI6cmV0dXJuISFlW24uJGdldFRlbXBsYXRlUm9vdF0oKVtuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlfHwiIj09PWUuaHx8TWF0aC5yb3VuZChjLXQuaGVpZ2h0KTw9MjtkZWZhdWx0OnJldHVybiEwfX0sdC5mbHVzaEhUTUw9ZnVuY3Rpb24oZSl7aWYoIWVbbi4kZXh0cmFdKXJldHVybiBudWxsO2NvbnN0IHQ9e25hbWU6ImRpdiIsYXR0cmlidXRlczplW24uJGV4dHJhXS5hdHRyaWJ1dGVzLGNoaWxkcmVuOmVbbi4kZXh0cmFdLmNoaWxkcmVufTtpZihlW24uJGV4dHJhXS5mYWlsaW5nTm9kZSl7Y29uc3Qgcj1lW24uJGV4dHJhXS5mYWlsaW5nTm9kZVtuLiRmbHVzaEhUTUxdKCk7ciYmKGUubGF5b3V0LmVuZHNXaXRoKCItdGIiKT90LmNoaWxkcmVuLnB1c2goaShlLFtyXSkpOnQuY2hpbGRyZW4ucHVzaChyKSl9cmV0dXJuIDA9PT10LmNoaWxkcmVuLmxlbmd0aD9udWxsOnR9LHQuZ2V0QXZhaWxhYmxlU3BhY2U9ZnVuY3Rpb24oZSl7Y29uc3QgdD1lW24uJGV4dHJhXS5hdmFpbGFibGVTcGFjZSxyPWUubWFyZ2luP2UubWFyZ2luLnRvcEluc2V0K2UubWFyZ2luLmJvdHRvbUluc2V0OjAsYT1lLm1hcmdpbj9lLm1hcmdpbi5sZWZ0SW5zZXQrZS5tYXJnaW4ucmlnaHRJbnNldDowO3N3aXRjaChlLmxheW91dCl7Y2FzZSJsci10YiI6Y2FzZSJybC10YiI6cmV0dXJuIDA9PT1lW24uJGV4dHJhXS5hdHRlbXB0P3t3aWR0aDp0LndpZHRoLWEtZVtuLiRleHRyYV0uY3VycmVudFdpZHRoLGhlaWdodDp0LmhlaWdodC1yLWVbbi4kZXh0cmFdLnByZXZIZWlnaHR9Ont3aWR0aDp0LndpZHRoLWEsaGVpZ2h0OnQuaGVpZ2h0LXItZVtuLiRleHRyYV0uaGVpZ2h0fTtjYXNlInJsLXJvdyI6Y2FzZSJyb3ciOnJldHVybnt3aWR0aDplW24uJGV4dHJhXS5jb2x1bW5XaWR0aHMuc2xpY2UoZVtuLiRleHRyYV0uY3VycmVudENvbHVtbikucmVkdWNlKCgoZSx0KT0+ZSt0KSksaGVpZ2h0OnQuaGVpZ2h0LWF9O2Nhc2UidGFibGUiOmNhc2UidGIiOnJldHVybnt3aWR0aDp0LndpZHRoLWEsaGVpZ2h0OnQuaGVpZ2h0LXItZVtuLiRleHRyYV0uaGVpZ2h0fTtkZWZhdWx0OnJldHVybiB0fX0scigxMzkpO3ZhciBuPXIoMjI4KSxhPXIoMjM2KTtmdW5jdGlvbiBpKGUsdCl7cmV0dXJue25hbWU6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJsci10YiI9PT1lLmxheW91dD8ieGZhTHIiOiJ4ZmFSbCJdfSxjaGlsZHJlbjp0fX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jb21wdXRlQmJveD1mdW5jdGlvbihlLHQscil7bGV0IGE7aWYoIiIhPT1lLncmJiIiIT09ZS5oKWE9W2UueCxlLnksZS53LGUuaF07ZWxzZXtpZighcilyZXR1cm4gbnVsbDtsZXQgaT1lLnc7aWYoIiI9PT1pKXtpZigwPT09ZS5tYXhXKXtjb25zdCB0PWVbbi4kZ2V0U3ViZm9ybVBhcmVudF0oKTtpPSJwb3NpdGlvbiI9PT10LmxheW91dCYmIiIhPT10Lnc/MDplLm1pbld9ZWxzZSBpPU1hdGgubWluKGUubWF4VyxyLndpZHRoKTt0LmF0dHJpYnV0ZXMuc3R5bGUud2lkdGg9bChpKX1sZXQgcz1lLmg7aWYoIiI9PT1zKXtpZigwPT09ZS5tYXhIKXtjb25zdCB0PWVbbi4kZ2V0U3ViZm9ybVBhcmVudF0oKTtzPSJwb3NpdGlvbiI9PT10LmxheW91dCYmIiIhPT10Lmg/MDplLm1pbkh9ZWxzZSBzPU1hdGgubWluKGUubWF4SCxyLmhlaWdodCk7dC5hdHRyaWJ1dGVzLnN0eWxlLmhlaWdodD1sKHMpfWE9W2UueCxlLnksaSxzXX1yZXR1cm4gYX0sdC5jcmVhdGVXcmFwcGVyPWZ1bmN0aW9uKGUsdCl7Y29uc3R7YXR0cmlidXRlczpyfT10LHtzdHlsZTphfT1yLGk9e25hbWU6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJ4ZmFXcmFwcGVyIl0sc3R5bGU6T2JqZWN0LmNyZWF0ZShudWxsKX0sY2hpbGRyZW46W119O2lmKHIuY2xhc3MucHVzaCgieGZhV3JhcHBlZCIpLGUuYm9yZGVyKXtjb25zdHt3aWR0aHM6cixpbnNldHM6c309ZS5ib3JkZXJbbi4kZXh0cmFdO2xldCBvLGMsbD1zWzBdLGg9c1szXTtjb25zdCB1PXNbMF0rc1syXSxmPXNbMV0rc1szXTtzd2l0Y2goZS5ib3JkZXIuaGFuZCl7Y2FzZSJldmVuIjpsLT1yWzBdLzIsaC09clszXS8yLG89ImNhbGMoMTAwJSArICIuY29uY2F0KChyWzFdK3JbM10pLzItZiwicHgpIiksYz0iY2FsYygxMDAlICsgIi5jb25jYXQoKHJbMF0rclsyXSkvMi11LCJweCkiKTticmVhaztjYXNlImxlZnQiOmwtPXJbMF0saC09clszXSxvPSJjYWxjKDEwMCUgKyAiLmNvbmNhdChyWzFdK3JbM10tZiwicHgpIiksYz0iY2FsYygxMDAlICsgIi5jb25jYXQoclswXStyWzJdLXUsInB4KSIpO2JyZWFrO2Nhc2UicmlnaHQiOm89Zj8iY2FsYygxMDAlIC0gIi5jb25jYXQoZiwicHgpIik6IjEwMCUiLGM9dT8iY2FsYygxMDAlIC0gIi5jb25jYXQodSwicHgpIik6IjEwMCUifWNvbnN0IGc9WyJ4ZmFCb3JkZXIiXTtkKGUuYm9yZGVyKSYmZy5wdXNoKCJ4ZmFQcmludE9ubHkiKTtjb25zdCBwPXtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOmcsc3R5bGU6e3RvcDoiIi5jb25jYXQobCwicHgiKSxsZWZ0OiIiLmNvbmNhdChoLCJweCIpLHdpZHRoOm8saGVpZ2h0OmN9fSxjaGlsZHJlbjpbXX07Zm9yKGNvbnN0IGUgb2ZbImJvcmRlciIsImJvcmRlcldpZHRoIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJSYWRpdXMiLCJib3JkZXJTdHlsZSJdKXZvaWQgMCE9PWFbZV0mJihwLmF0dHJpYnV0ZXMuc3R5bGVbZV09YVtlXSxkZWxldGUgYVtlXSk7aS5jaGlsZHJlbi5wdXNoKHAsdCl9ZWxzZSBpLmNoaWxkcmVuLnB1c2godCk7Zm9yKGNvbnN0IGUgb2ZbImJhY2tncm91bmQiLCJiYWNrZ3JvdW5kQ2xpcCIsInRvcCIsImxlZnQiLCJ3aWR0aCIsImhlaWdodCIsIm1pbldpZHRoIiwibWluSGVpZ2h0IiwibWF4V2lkdGgiLCJtYXhIZWlnaHQiLCJ0cmFuc2Zvcm0iLCJ0cmFuc2Zvcm1PcmlnaW4iLCJ2aXNpYmlsaXR5Il0pdm9pZCAwIT09YVtlXSYmKGkuYXR0cmlidXRlcy5zdHlsZVtlXT1hW2VdLGRlbGV0ZSBhW2VdKTtyZXR1cm4gaS5hdHRyaWJ1dGVzLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI9PT1hLnBvc2l0aW9uPyJhYnNvbHV0ZSI6InJlbGF0aXZlIixkZWxldGUgYS5wb3NpdGlvbixhLmFsaWduU2VsZiYmKGkuYXR0cmlidXRlcy5zdHlsZS5hbGlnblNlbGY9YS5hbGlnblNlbGYsZGVsZXRlIGEuYWxpZ25TZWxmKSxpfSx0LmZpeERpbWVuc2lvbnM9ZnVuY3Rpb24oZSl7dmFyIHQ7Y29uc3Qgcj1lW24uJGdldFN1YmZvcm1QYXJlbnRdKCk7aWYobnVsbCE9PSh0PXIubGF5b3V0KSYmdm9pZCAwIT09dCYmdC5pbmNsdWRlcygicm93Iikpe2NvbnN0IHQ9cltuLiRleHRyYV0sYT1lLmNvbFNwYW47bGV0IGk7aT0tMT09PWE/dC5jb2x1bW5XaWR0aHMuc2xpY2UodC5jdXJyZW50Q29sdW1uKS5yZWR1Y2UoKChlLHQpPT5lK3QpLDApOnQuY29sdW1uV2lkdGhzLnNsaWNlKHQuY3VycmVudENvbHVtbix0LmN1cnJlbnRDb2x1bW4rYSkucmVkdWNlKCgoZSx0KT0+ZSt0KSwwKSxpc05hTihpKXx8KGUudz1pKX1yLmxheW91dCYmInBvc2l0aW9uIiE9PXIubGF5b3V0JiYoZS54PWUueT0wKSwidGFibGUiPT09ZS5sYXlvdXQmJiIiPT09ZS53JiZBcnJheS5pc0FycmF5KGUuY29sdW1uV2lkdGhzKSYmKGUudz1lLmNvbHVtbldpZHRocy5yZWR1Y2UoKChlLHQpPT5lK3QpLDApKX0sdC5maXhUZXh0SW5kZW50PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9KDAsaS5nZXRNZWFzdXJlbWVudCkoZS50ZXh0SW5kZW50LCIwcHgiKTtpZih0Pj0wKXJldHVybjtjb25zdCByPSJwYWRkaW5nIisoImxlZnQiPT0oInJpZ2h0Ij09PWUudGV4dEFsaWduPyJyaWdodCI6ImxlZnQiKT8iTGVmdCI6IlJpZ2h0Iiksbj0oMCxpLmdldE1lYXN1cmVtZW50KShlW3JdLCIwcHgiKTtlW3JdPW4tdCsicHgifSx0LmZpeFVSTD1mdW5jdGlvbihlKXtjb25zdCB0PSgwLGEuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkoZSxudWxsLHthZGREZWZhdWx0UHJvdG9jb2w6ITAsdHJ5Q29udmVydEVuY29kaW5nOiEwfSk7cmV0dXJuIHQ/dC5ocmVmOm51bGx9LHQuaXNQcmludE9ubHk9ZCx0LmxheW91dENsYXNzPWZ1bmN0aW9uKGUpe3N3aXRjaChlLmxheW91dCl7Y2FzZSJwb3NpdGlvbiI6ZGVmYXVsdDpyZXR1cm4ieGZhUG9zaXRpb24iO2Nhc2UibHItdGIiOnJldHVybiJ4ZmFMclRiIjtjYXNlInJsLXJvdyI6cmV0dXJuInhmYVJsUm93IjtjYXNlInJsLXRiIjpyZXR1cm4ieGZhUmxUYiI7Y2FzZSJyb3ciOnJldHVybiJ4ZmFSb3ciO2Nhc2UidGFibGUiOnJldHVybiJ4ZmFUYWJsZSI7Y2FzZSJ0YiI6cmV0dXJuInhmYVRiIn19LHQubGF5b3V0Tm9kZT1mdW5jdGlvbihlLHQpe2xldCByPW51bGwsYT1udWxsLGk9ITE7aWYoKCFlLnd8fCFlLmgpJiZlLnZhbHVlKXtsZXQgcz0wLG89MDtlLm1hcmdpbiYmKHM9ZS5tYXJnaW4ubGVmdEluc2V0K2UubWFyZ2luLnJpZ2h0SW5zZXQsbz1lLm1hcmdpbi50b3BJbnNldCtlLm1hcmdpbi5ib3R0b21JbnNldCk7bGV0IGM9bnVsbCxsPW51bGw7ZS5wYXJhJiYobD1PYmplY3QuY3JlYXRlKG51bGwpLGM9IiI9PT1lLnBhcmEubGluZUhlaWdodD9udWxsOmUucGFyYS5saW5lSGVpZ2h0LGwudG9wPSIiPT09ZS5wYXJhLnNwYWNlQWJvdmU/MDplLnBhcmEuc3BhY2VBYm92ZSxsLmJvdHRvbT0iIj09PWUucGFyYS5zcGFjZUJlbG93PzA6ZS5wYXJhLnNwYWNlQmVsb3csbC5sZWZ0PSIiPT09ZS5wYXJhLm1hcmdpbkxlZnQ/MDplLnBhcmEubWFyZ2luTGVmdCxsLnJpZ2h0PSIiPT09ZS5wYXJhLm1hcmdpblJpZ2h0PzA6ZS5wYXJhLm1hcmdpblJpZ2h0KTtsZXQgaD1lLmZvbnQ7aWYoIWgpe2NvbnN0IHQ9ZVtuLiRnZXRUZW1wbGF0ZVJvb3RdKCk7bGV0IHI9ZVtuLiRnZXRQYXJlbnRdKCk7Zm9yKDtyJiZyIT09dDspe2lmKHIuZm9udCl7aD1yLmZvbnQ7YnJlYWt9cj1yW24uJGdldFBhcmVudF0oKX19Y29uc3QgZD0oZS53fHx0LndpZHRoKS1zLGY9ZVtuLiRnbG9iYWxEYXRhXS5mb250RmluZGVyO2lmKGUudmFsdWUuZXhEYXRhJiZlLnZhbHVlLmV4RGF0YVtuLiRjb250ZW50XSYmInRleHQvaHRtbCI9PT1lLnZhbHVlLmV4RGF0YS5jb250ZW50VHlwZSl7Y29uc3QgdD11KGUudmFsdWUuZXhEYXRhW24uJGNvbnRlbnRdLGgsbCxjLGYsZCk7YT10LndpZHRoLHI9dC5oZWlnaHQsaT10LmlzQnJva2VufWVsc2V7Y29uc3QgdD1lLnZhbHVlW24uJHRleHRdKCk7aWYodCl7Y29uc3QgZT11KHQsaCxsLGMsZixkKTthPWUud2lkdGgscj1lLmhlaWdodCxpPWUuaXNCcm9rZW59fW51bGw9PT1hfHxlLnd8fChhKz1zKSxudWxsPT09cnx8ZS5ofHwocis9byl9cmV0dXJue3c6YSxoOnIsaXNCcm9rZW46aX19LHQubWVhc3VyZVRvU3RyaW5nPWwsdC5zZXRBY2Nlc3M9ZnVuY3Rpb24oZSx0KXtzd2l0Y2goZS5hY2Nlc3Mpe2Nhc2Uibm9uSW50ZXJhY3RpdmUiOnQucHVzaCgieGZhTm9uSW50ZXJhY3RpdmUiKTticmVhaztjYXNlInJlYWRPbmx5Ijp0LnB1c2goInhmYVJlYWRPbmx5Iik7YnJlYWs7Y2FzZSJwcm90ZWN0ZWQiOnQucHVzaCgieGZhRGlzYWJsZWQiKX19LHQuc2V0Rm9udEZhbWlseT1mdW5jdGlvbihlLHQscixuKXtpZighcilyZXR1cm4gdm9pZCBkZWxldGUgbi5mb250RmFtaWx5O2NvbnN0IGE9KDAsaS5zdHJpcFF1b3RlcykoZS50eXBlZmFjZSk7bi5mb250RmFtaWx5PSciJy5jb25jYXQoYSwnIicpO2NvbnN0IG89ci5maW5kKGEpO2lmKG8pe2NvbnN0e2ZvbnRGYW1pbHk6cn09by5yZWd1bGFyLmNzc0ZvbnRJbmZvO3IhPT1hJiYobi5mb250RmFtaWx5PSciJy5jb25jYXQociwnIicpKTtjb25zdCBpPWYodCk7aWYoaSYmIiIhPT1pLmxpbmVIZWlnaHQpcmV0dXJuO2lmKG4ubGluZUhlaWdodClyZXR1cm47Y29uc3QgYz0oMCxzLnNlbGVjdEZvbnQpKGUsbyk7YyYmKG4ubGluZUhlaWdodD1NYXRoLm1heCgxLjIsYy5saW5lSGVpZ2h0KSl9fSx0LnNldE1pbk1heERpbWVuc2lvbnM9ZnVuY3Rpb24oZSx0KXsicG9zaXRpb24iPT09ZVtuLiRnZXRTdWJmb3JtUGFyZW50XSgpLmxheW91dCYmKGUubWluVz4wJiYodC5taW5XaWR0aD1sKGUubWluVykpLGUubWF4Vz4wJiYodC5tYXhXaWR0aD1sKGUubWF4VykpLGUubWluSD4wJiYodC5taW5IZWlnaHQ9bChlLm1pbkgpKSxlLm1heEg+MCYmKHQubWF4SGVpZ2h0PWwoZS5tYXhIKSkpfSx0LnNldFBhcmE9ZnVuY3Rpb24oZSx0LHIpe3ZhciBhO2lmKG51bGwhPT0oYT1yLmF0dHJpYnV0ZXMuY2xhc3MpJiZ2b2lkIDAhPT1hJiZhLmluY2x1ZGVzKCJ4ZmFSaWNoIikpe3QmJigiIj09PWUuaCYmKHQuaGVpZ2h0PSJhdXRvIiksIiI9PT1lLncmJih0LndpZHRoPSJhdXRvIikpO2NvbnN0IGE9ZihlKTtpZihhKXtjb25zdCBlPXIuYXR0cmlidXRlcy5zdHlsZTtzd2l0Y2goZS5kaXNwbGF5PSJmbGV4IixlLmZsZXhEaXJlY3Rpb249ImNvbHVtbiIsYS52QWxpZ24pe2Nhc2UidG9wIjplLmp1c3RpZnlDb250ZW50PSJzdGFydCI7YnJlYWs7Y2FzZSJib3R0b20iOmUuanVzdGlmeUNvbnRlbnQ9ImVuZCI7YnJlYWs7Y2FzZSJtaWRkbGUiOmUuanVzdGlmeUNvbnRlbnQ9ImNlbnRlciJ9Y29uc3QgdD1hW24uJHRvU3R5bGVdKCk7Zm9yKGNvbnN0W3Isbl1vZiBPYmplY3QuZW50cmllcyh0KSlyIGluIGV8fChlW3JdPW4pfX19LHQudG9TdHlsZT1mdW5jdGlvbihlKXtjb25zdCB0PU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsaT1uZXcgQXJyYXkocj4xP3ItMTowKSxzPTE7czxyO3MrKylpW3MtMV09YXJndW1lbnRzW3NdO2Zvcihjb25zdCByIG9mIGkpe2NvbnN0IGk9ZVtyXTtpZihudWxsIT09aSlpZihoLmhhc093blByb3BlcnR5KHIpKWhbcl0oZSx0KTtlbHNlIGlmKGkgaW5zdGFuY2VvZiBjLlhGQU9iamVjdCl7Y29uc3QgZT1pW24uJHRvU3R5bGVdKCk7ZT9PYmplY3QuYXNzaWduKHQsZSk6KDAsYS53YXJuKSgiKERFQlVHKSAtIFhGQSAtIHN0eWxlIGZvciAiLmNvbmNhdChyLCIgbm90IGltcGxlbWVudGVkIHlldCIpKX19cmV0dXJuIHR9LHIoMTM5KTt2YXIgbj1yKDIyOCksYT1yKDE0NCksaT1yKDIzNykscz1yKDIzOCksbz1yKDIzOSksYz1yKDI0MCk7ZnVuY3Rpb24gbChlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/IjBweCI6TnVtYmVyLmlzSW50ZWdlcihlKT8iIi5jb25jYXQoZSwicHgiKToiIi5jb25jYXQoZS50b0ZpeGVkKDIpLCJweCIpfWNvbnN0IGg9e2FuY2hvclR5cGUoZSx0KXtjb25zdCByPWVbbi4kZ2V0U3ViZm9ybVBhcmVudF0oKTtpZihyJiYoIXIubGF5b3V0fHwicG9zaXRpb24iPT09ci5sYXlvdXQpKXN3aXRjaCgidHJhbnNmb3JtImluIHR8fCh0LnRyYW5zZm9ybT0iIiksZS5hbmNob3JUeXBlKXtjYXNlImJvdHRvbUNlbnRlciI6dC50cmFuc2Zvcm0rPSJ0cmFuc2xhdGUoLTUwJSwgLTEwMCUpIjticmVhaztjYXNlImJvdHRvbUxlZnQiOnQudHJhbnNmb3JtKz0idHJhbnNsYXRlKDAsLTEwMCUpIjticmVhaztjYXNlImJvdHRvbVJpZ2h0Ijp0LnRyYW5zZm9ybSs9InRyYW5zbGF0ZSgtMTAwJSwtMTAwJSkiO2JyZWFrO2Nhc2UibWlkZGxlQ2VudGVyIjp0LnRyYW5zZm9ybSs9InRyYW5zbGF0ZSgtNTAlLC01MCUpIjticmVhaztjYXNlIm1pZGRsZUxlZnQiOnQudHJhbnNmb3JtKz0idHJhbnNsYXRlKDAsLTUwJSkiO2JyZWFrO2Nhc2UibWlkZGxlUmlnaHQiOnQudHJhbnNmb3JtKz0idHJhbnNsYXRlKC0xMDAlLC01MCUpIjticmVhaztjYXNlInRvcENlbnRlciI6dC50cmFuc2Zvcm0rPSJ0cmFuc2xhdGUoLTUwJSwwKSI7YnJlYWs7Y2FzZSJ0b3BSaWdodCI6dC50cmFuc2Zvcm0rPSJ0cmFuc2xhdGUoLTEwMCUsMCkifX0sZGltZW5zaW9ucyhlLHQpe3ZhciByO2NvbnN0IGE9ZVtuLiRnZXRTdWJmb3JtUGFyZW50XSgpO2xldCBpPWUudztjb25zdCBzPWUuaDtpZihudWxsIT09KHI9YS5sYXlvdXQpJiZ2b2lkIDAhPT1yJiZyLmluY2x1ZGVzKCJyb3ciKSl7Y29uc3QgdD1hW24uJGV4dHJhXSxyPWUuY29sU3BhbjtsZXQgczstMT09PXI/KHM9dC5jb2x1bW5XaWR0aHMuc2xpY2UodC5jdXJyZW50Q29sdW1uKS5yZWR1Y2UoKChlLHQpPT5lK3QpLDApLHQuY3VycmVudENvbHVtbj0wKToocz10LmNvbHVtbldpZHRocy5zbGljZSh0LmN1cnJlbnRDb2x1bW4sdC5jdXJyZW50Q29sdW1uK3IpLnJlZHVjZSgoKGUsdCk9PmUrdCksMCksdC5jdXJyZW50Q29sdW1uPSh0LmN1cnJlbnRDb2x1bW4rZS5jb2xTcGFuKSV0LmNvbHVtbldpZHRocy5sZW5ndGgpLGlzTmFOKHMpfHwoaT1lLnc9cyl9dC53aWR0aD0iIiE9PWk/bChpKToiYXV0byIsdC5oZWlnaHQ9IiIhPT1zP2wocyk6ImF1dG8ifSxwb3NpdGlvbihlLHQpe2NvbnN0IHI9ZVtuLiRnZXRTdWJmb3JtUGFyZW50XSgpO251bGwhPXImJnIubGF5b3V0JiYicG9zaXRpb24iIT09ci5sYXlvdXR8fCh0LnBvc2l0aW9uPSJhYnNvbHV0ZSIsdC5sZWZ0PWwoZS54KSx0LnRvcD1sKGUueSkpfSxyb3RhdGUoZSx0KXtlLnJvdGF0ZSYmKCJ0cmFuc2Zvcm0iaW4gdHx8KHQudHJhbnNmb3JtPSIiKSx0LnRyYW5zZm9ybSs9InJvdGF0ZSgtIi5jb25jYXQoZS5yb3RhdGUsImRlZykiKSx0LnRyYW5zZm9ybU9yaWdpbj0idG9wIGxlZnQiKX0scHJlc2VuY2UoZSx0KXtzd2l0Y2goZS5wcmVzZW5jZSl7Y2FzZSJpbnZpc2libGUiOnQudmlzaWJpbGl0eT0iaGlkZGVuIjticmVhaztjYXNlImhpZGRlbiI6Y2FzZSJpbmFjdGl2ZSI6dC5kaXNwbGF5PSJub25lIn19LGhBbGlnbihlLHQpe2lmKCJwYXJhIj09PWVbbi4kbm9kZU5hbWVdKXN3aXRjaChlLmhBbGlnbil7Y2FzZSJqdXN0aWZ5QWxsIjp0LnRleHRBbGlnbj0ianVzdGlmeS1hbGwiO2JyZWFrO2Nhc2UicmFkaXgiOnQudGV4dEFsaWduPSJsZWZ0IjticmVhaztkZWZhdWx0OnQudGV4dEFsaWduPWUuaEFsaWdufWVsc2Ugc3dpdGNoKGUuaEFsaWduKXtjYXNlImxlZnQiOnQuYWxpZ25TZWxmPSJzdGFydCI7YnJlYWs7Y2FzZSJjZW50ZXIiOnQuYWxpZ25TZWxmPSJjZW50ZXIiO2JyZWFrO2Nhc2UicmlnaHQiOnQuYWxpZ25TZWxmPSJlbmQifX0sbWFyZ2luKGUsdCl7ZS5tYXJnaW4mJih0Lm1hcmdpbj1lLm1hcmdpbltuLiR0b1N0eWxlXSgpLm1hcmdpbil9fTtmdW5jdGlvbiB1KGUsdCxyLGEsaSxzKXtjb25zdCBjPW5ldyBvLlRleHRNZWFzdXJlKHQscixhLGkpO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9jLmFkZFN0cmluZyhlKTplW24uJHB1c2hHbHlwaHNdKGMpLGMuY29tcHV0ZShzKX1mdW5jdGlvbiBkKGUpe3JldHVybiBlLnJlbGV2YW50Lmxlbmd0aD4wJiYhZS5yZWxldmFudFswXS5leGNsdWRlZCYmInByaW50Ij09PWUucmVsZXZhbnRbMF0udmlld25hbWV9ZnVuY3Rpb24gZihlKXtjb25zdCB0PWVbbi4kZ2V0VGVtcGxhdGVSb290XSgpW24uJGV4dHJhXS5wYXJhU3RhY2s7cmV0dXJuIHQubGVuZ3RoP3QuYXQoLTEpOm51bGx9fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuSFRNTFJlc3VsdD12b2lkIDAsdC5nZXRCQm94PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9LTE7aWYoIWUpcmV0dXJue3g6dCx5OnQsd2lkdGg6dCxoZWlnaHQ6dH07Y29uc3Qgcj1lLnRyaW0oKS5zcGxpdCgvXHMqLFxzKi8pLm1hcCgoZT0+byhlLCItMSIpKSk7aWYoci5sZW5ndGg8NHx8clsyXTwwfHxyWzNdPDApcmV0dXJue3g6dCx5OnQsd2lkdGg6dCxoZWlnaHQ6dH07Y29uc3RbbixhLGksc109cjtyZXR1cm57eDpuLHk6YSx3aWR0aDppLGhlaWdodDpzfX0sdC5nZXRDb2xvcj1mdW5jdGlvbihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06WzAsMCwwXSxbcixuLGFdPXQ7aWYoIWUpcmV0dXJue3IsZzpuLGI6YX07Y29uc3QgaT1lLnRyaW0oKS5zcGxpdCgvXHMqLFxzKi8pLm1hcCgoZT0+TWF0aC5taW4oTWF0aC5tYXgoMCxwYXJzZUludChlLnRyaW0oKSwxMCkpLDI1NSkpKS5tYXAoKGU9PmlzTmFOKGUpPzA6ZSkpO3JldHVybiBpLmxlbmd0aDwzfHwoW3IsbixhXT1pKSx7cixnOm4sYjphfX0sdC5nZXRGbG9hdD1mdW5jdGlvbihlKXtsZXR7ZGF0YTp0LGRlZmF1bHRWYWx1ZTpyLHZhbGlkYXRlOm59PWU7aWYoIXQpcmV0dXJuIHI7dD10LnRyaW0oKTtjb25zdCBhPXBhcnNlRmxvYXQodCk7cmV0dXJuIWlzTmFOKGEpJiZuKGEpP2E6cn0sdC5nZXRJbnRlZ2VyPWZ1bmN0aW9uKGUpe2xldHtkYXRhOnQsZGVmYXVsdFZhbHVlOnIsdmFsaWRhdGU6bn09ZTtpZighdClyZXR1cm4gcjt0PXQudHJpbSgpO2NvbnN0IGE9cGFyc2VJbnQodCwxMCk7cmV0dXJuIWlzTmFOKGEpJiZuKGEpP2E6cn0sdC5nZXRLZXl3b3JkPXMsdC5nZXRNZWFzdXJlbWVudD1vLHQuZ2V0UmF0aW89ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJue251bToxLGRlbjoxfTtjb25zdCB0PWUudHJpbSgpLnNwbGl0KC9ccyo6XHMqLykubWFwKChlPT5wYXJzZUZsb2F0KGUpKSkuZmlsdGVyKChlPT4haXNOYU4oZSkpKTtpZigxPT09dC5sZW5ndGgmJnQucHVzaCgxKSwwPT09dC5sZW5ndGgpcmV0dXJue251bToxLGRlbjoxfTtjb25zdFtyLG5dPXQ7cmV0dXJue251bTpyLGRlbjpufX0sdC5nZXRSZWxldmFudD1mdW5jdGlvbihlKXtyZXR1cm4gZT9lLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKChlPT4oe2V4Y2x1ZGVkOiItIj09PWVbMF0sdmlld25hbWU6ZS5zdWJzdHJpbmcoMSl9KSkpOltdfSx0LmdldFN0cmluZ09wdGlvbj1mdW5jdGlvbihlLHQpe3JldHVybiBzKHtkYXRhOmUsZGVmYXVsdFZhbHVlOnRbMF0sdmFsaWRhdGU6ZT0+dC5pbmNsdWRlcyhlKX0pfSx0LnN0cmlwUXVvdGVzPWZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXJ0c1dpdGgoIiciKXx8ZS5zdGFydHNXaXRoKCciJyk/ZS5zbGljZSgxLC0xKTplfSxyKDEzOSk7dmFyIG49cigxNDQpO2NvbnN0IGE9e3B0OmU9PmUsY206ZT0+ZS8yLjU0KjcyLG1tOmU9PmUvMjUuNCo3MixpbjplPT43MiplLHB4OmU9PmV9LGk9LyhbKy1dP1xkK1wuP1xkKikoLiopLztmdW5jdGlvbiBzKGUpe2xldHtkYXRhOnQsZGVmYXVsdFZhbHVlOnIsdmFsaWRhdGU6bn09ZTtyZXR1cm4gdD8odD10LnRyaW0oKSxuKHQpP3Q6cik6cn1mdW5jdGlvbiBvKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToiMCI7aWYodHx8KHQ9IjAiKSwhZSlyZXR1cm4gbyh0KTtjb25zdCByPWUudHJpbSgpLm1hdGNoKGkpO2lmKCFyKXJldHVybiBvKHQpO2NvbnN0WyxuLHNdPXIsYz1wYXJzZUZsb2F0KG4pO2lmKGlzTmFOKGMpKXJldHVybiBvKHQpO2lmKDA9PT1jKXJldHVybiAwO2NvbnN0IGw9YVtzXTtyZXR1cm4gbD9sKGMpOmN9Y2xhc3MgY3tzdGF0aWMgZ2V0IEZBSUxVUkUoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiRkFJTFVSRSIsbmV3IGMoITEsbnVsbCxudWxsLG51bGwpKX1zdGF0aWMgZ2V0IEVNUFRZKCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIkVNUFRZIixuZXcgYyghMCxudWxsLG51bGwsbnVsbCkpfWNvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMuc3VjY2Vzcz1lLHRoaXMuaHRtbD10LHRoaXMuYmJveD1yLHRoaXMuYnJlYWtOb2RlPW59aXNCcmVhaygpe3JldHVybiEhdGhpcy5icmVha05vZGV9c3RhdGljIGJyZWFrTm9kZShlKXtyZXR1cm4gbmV3IGMoITEsbnVsbCxudWxsLGUpfXN0YXRpYyBzdWNjZXNzKGUpe3JldHVybiBuZXcgYyghMCxlLGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLG51bGwpfX10LkhUTUxSZXN1bHQ9Y30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkZvbnRGaW5kZXI9dm9pZCAwLHQuZ2V0TWV0cmljcz1mdW5jdGlvbihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLHI9bnVsbDtpZihlKXtjb25zdCB0PSgwLGEuc3RyaXBRdW90ZXMpKGUudHlwZWZhY2UpLGk9ZVtuLiRnbG9iYWxEYXRhXS5mb250RmluZGVyLmZpbmQodCk7cj1zKGUsaSl9aWYoIXIpcmV0dXJue2xpbmVIZWlnaHQ6MTIsbGluZUdhcDoyLGxpbmVOb0dhcDoxMH07Y29uc3QgaT1lLnNpemV8fDEwLG89ci5saW5lSGVpZ2h0P01hdGgubWF4KHQ/MDoxLjIsci5saW5lSGVpZ2h0KToxLjIsYz12b2lkIDA9PT1yLmxpbmVHYXA/LjI6ci5saW5lR2FwO3JldHVybntsaW5lSGVpZ2h0Om8qaSxsaW5lR2FwOmMqaSxsaW5lTm9HYXA6TWF0aC5tYXgoMSxvLWMpKml9fSx0LnNlbGVjdEZvbnQ9cyxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNykscigxMzkpO3ZhciBuPXIoMjI4KSxhPXIoMjM3KSxpPXIoMTQ0KTtmdW5jdGlvbiBzKGUsdCl7cmV0dXJuIml0YWxpYyI9PT1lLnBvc3R1cmU/ImJvbGQiPT09ZS53ZWlnaHQ/dC5ib2xkaXRhbGljOnQuaXRhbGljOiJib2xkIj09PWUud2VpZ2h0P3QuYm9sZDp0LnJlZ3VsYXJ9dC5Gb250RmluZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuZm9udHM9bmV3IE1hcCx0aGlzLmNhY2hlPW5ldyBNYXAsdGhpcy53YXJuZWQ9bmV3IFNldCx0aGlzLmRlZmF1bHRGb250PW51bGwsdGhpcy5hZGQoZSl9YWRkKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO2Zvcihjb25zdCB0IG9mIGUpdGhpcy5hZGRQZGZGb250KHQpO2Zvcihjb25zdCBlIG9mIHRoaXMuZm9udHMudmFsdWVzKCkpZS5yZWd1bGFyfHwoZS5yZWd1bGFyPWUuaXRhbGljfHxlLmJvbGR8fGUuYm9sZGl0YWxpYyk7aWYoIXR8fDA9PT10LnNpemUpcmV0dXJuO2NvbnN0IHI9dGhpcy5mb250cy5nZXQoIlBkZkpTLUZhbGxiYWNrLVBkZkpTLVhGQSIpO2Zvcihjb25zdCBlIG9mIHQpdGhpcy5mb250cy5zZXQoZSxyKX1hZGRQZGZGb250KGUpe2NvbnN0IHQ9ZS5jc3NGb250SW5mbyxyPXQuZm9udEZhbWlseTtsZXQgbj10aGlzLmZvbnRzLmdldChyKTtufHwobj1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuZm9udHMuc2V0KHIsbiksdGhpcy5kZWZhdWx0Rm9udHx8KHRoaXMuZGVmYXVsdEZvbnQ9bikpO2xldCBhPSIiO2NvbnN0IGk9cGFyc2VGbG9hdCh0LmZvbnRXZWlnaHQpO3ZhciBzLG8sYzswIT09cGFyc2VGbG9hdCh0Lml0YWxpY0FuZ2xlKT9hPWk+PTcwMD8iYm9sZGl0YWxpYyI6Iml0YWxpYyI6aT49NzAwJiYoYT0iYm9sZCIpLGF8fCgoZS5uYW1lLmluY2x1ZGVzKCJCb2xkIil8fChudWxsPT09KHM9ZS5wc05hbWUpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLmluY2x1ZGVzKCJCb2xkIikpKSYmKGE9ImJvbGQiKSwoZS5uYW1lLmluY2x1ZGVzKCJJdGFsaWMiKXx8ZS5uYW1lLmVuZHNXaXRoKCJJdCIpfHwobnVsbD09PShvPWUucHNOYW1lKXx8dm9pZCAwPT09bz92b2lkIDA6by5pbmNsdWRlcygiSXRhbGljIikpfHwobnVsbD09PShjPWUucHNOYW1lKXx8dm9pZCAwPT09Yz92b2lkIDA6Yy5lbmRzV2l0aCgiSXQiKSkpJiYoYSs9Iml0YWxpYyIpKSxhfHwoYT0icmVndWxhciIpLG5bYV09ZX1nZXREZWZhdWx0KCl7cmV0dXJuIHRoaXMuZGVmYXVsdEZvbnR9ZmluZChlKXtsZXQgdD0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdLHI9dGhpcy5mb250cy5nZXQoZSl8fHRoaXMuY2FjaGUuZ2V0KGUpO2lmKHIpcmV0dXJuIHI7Y29uc3Qgbj0vLHwtfF98IHxib2xkaXRhbGljfGJvbGR8aXRhbGljfHJlZ3VsYXJ8aXQvZ2k7bGV0IGE9ZS5yZXBsYWNlQWxsKG4sIiIpO2lmKHI9dGhpcy5mb250cy5nZXQoYSkscilyZXR1cm4gdGhpcy5jYWNoZS5zZXQoZSxyKSxyO2E9YS50b0xvd2VyQ2FzZSgpO2NvbnN0IHM9W107Zm9yKGNvbnN0W2UsdF1vZiB0aGlzLmZvbnRzLmVudHJpZXMoKSllLnJlcGxhY2VBbGwobiwiIikudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGEpJiZzLnB1c2godCk7aWYoMD09PXMubGVuZ3RoKWZvcihjb25zdFssZV1vZiB0aGlzLmZvbnRzLmVudHJpZXMoKSl7dmFyIG87KG51bGw9PT0obz1lLnJlZ3VsYXIubmFtZSl8fHZvaWQgMD09PW8/dm9pZCAwOm8ucmVwbGFjZUFsbChuLCIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoYSkpJiZzLnB1c2goZSl9aWYoMD09PXMubGVuZ3RoKXthPWEucmVwbGFjZUFsbCgvcHNtdHxtdC9naSwiIik7Zm9yKGNvbnN0W2UsdF1vZiB0aGlzLmZvbnRzLmVudHJpZXMoKSllLnJlcGxhY2VBbGwobiwiIikudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGEpJiZzLnB1c2godCl9aWYoMD09PXMubGVuZ3RoKWZvcihjb25zdCBlIG9mIHRoaXMuZm9udHMudmFsdWVzKCkpe3ZhciBjOyhudWxsPT09KGM9ZS5yZWd1bGFyLm5hbWUpfHx2b2lkIDA9PT1jP3ZvaWQgMDpjLnJlcGxhY2VBbGwobiwiIikudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGEpKSYmcy5wdXNoKGUpfXJldHVybiBzLmxlbmd0aD49MT8oMSE9PXMubGVuZ3RoJiZ0JiYoMCxpLndhcm4pKCJYRkEgLSBUb28gbWFueSBjaG9pY2VzIHRvIGd1ZXNzIHRoZSBjb3JyZWN0IGZvbnQ6ICIuY29uY2F0KGUpKSx0aGlzLmNhY2hlLnNldChlLHNbMF0pLHNbMF0pOih0JiYhdGhpcy53YXJuZWQuaGFzKGUpJiYodGhpcy53YXJuZWQuYWRkKGUpLCgwLGkud2FybikoIlhGQSAtIENhbm5vdCBmaW5kIHRoZSBmb250OiAiLmNvbmNhdChlKSkpLG51bGwpfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZXh0TWVhc3VyZT12b2lkIDAscigxMzkpO3ZhciBuPXIoMjM4KTtjbGFzcyBhe2NvbnN0cnVjdG9yKGUsdCxyLGEpe2lmKHRoaXMubGluZUhlaWdodD1yLHRoaXMucGFyYU1hcmdpbj10fHx7dG9wOjAsYm90dG9tOjAsbGVmdDowLHJpZ2h0OjB9LCFlKXJldHVybiB2b2lkKFt0aGlzLnBkZkZvbnQsdGhpcy54ZmFGb250XT10aGlzLmRlZmF1bHRGb250KGEpKTt0aGlzLnhmYUZvbnQ9e3R5cGVmYWNlOmUudHlwZWZhY2UscG9zdHVyZTplLnBvc3R1cmUsd2VpZ2h0OmUud2VpZ2h0LHNpemU6ZS5zaXplLGxldHRlclNwYWNpbmc6ZS5sZXR0ZXJTcGFjaW5nfTtjb25zdCBpPWEuZmluZChlLnR5cGVmYWNlKTtpPyh0aGlzLnBkZkZvbnQ9KDAsbi5zZWxlY3RGb250KShlLGkpLHRoaXMucGRmRm9udHx8KFt0aGlzLnBkZkZvbnQsdGhpcy54ZmFGb250XT10aGlzLmRlZmF1bHRGb250KGEpKSk6W3RoaXMucGRmRm9udCx0aGlzLnhmYUZvbnRdPXRoaXMuZGVmYXVsdEZvbnQoYSl9ZGVmYXVsdEZvbnQoZSl7Y29uc3QgdD1lLmZpbmQoIkhlbHZldGljYSIsITEpfHxlLmZpbmQoIk15cmlhZCBQcm8iLCExKXx8ZS5maW5kKCJBcmlhbCIsITEpfHxlLmdldERlZmF1bHQoKTtpZihudWxsIT10JiZ0LnJlZ3VsYXIpe2NvbnN0IGU9dC5yZWd1bGFyO3JldHVybltlLHt0eXBlZmFjZTplLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHkscG9zdHVyZToibm9ybWFsIix3ZWlnaHQ6Im5vcm1hbCIsc2l6ZToxMCxsZXR0ZXJTcGFjaW5nOjB9XX1yZXR1cm5bbnVsbCx7dHlwZWZhY2U6IkNvdXJpZXIiLHBvc3R1cmU6Im5vcm1hbCIsd2VpZ2h0OiJub3JtYWwiLHNpemU6MTAsbGV0dGVyU3BhY2luZzowfV19fWNsYXNzIGl7Y29uc3RydWN0b3IoZSx0LHIsbil7dGhpcy5mb250RmluZGVyPW4sdGhpcy5zdGFjaz1bbmV3IGEoZSx0LHIsbildfXB1c2hEYXRhKGUsdCxyKXtjb25zdCBuPXRoaXMuc3RhY2suYXQoLTEpO2Zvcihjb25zdCB0IG9mWyJ0eXBlZmFjZSIsInBvc3R1cmUiLCJ3ZWlnaHQiLCJzaXplIiwibGV0dGVyU3BhY2luZyJdKWVbdF18fChlW3RdPW4ueGZhRm9udFt0XSk7Zm9yKGNvbnN0IGUgb2ZbInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdKWlzTmFOKHRbZV0pJiYodFtlXT1uLnBhcmFNYXJnaW5bZV0pO2NvbnN0IGk9bmV3IGEoZSx0LHJ8fG4ubGluZUhlaWdodCx0aGlzLmZvbnRGaW5kZXIpO2kucGRmRm9udHx8KGkucGRmRm9udD1uLnBkZkZvbnQpLHRoaXMuc3RhY2sucHVzaChpKX1wb3BGb250KCl7dGhpcy5zdGFjay5wb3AoKX10b3BGb250KCl7cmV0dXJuIHRoaXMuc3RhY2suYXQoLTEpfX10LlRleHRNZWFzdXJlPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMuZ2x5cGhzPVtdLHRoaXMuZm9udFNlbGVjdG9yPW5ldyBpKGUsdCxyLG4pLHRoaXMuZXh0cmFIZWlnaHQ9MH1wdXNoRGF0YShlLHQscil7dGhpcy5mb250U2VsZWN0b3IucHVzaERhdGEoZSx0LHIpfXBvcEZvbnQoZSl7cmV0dXJuIHRoaXMuZm9udFNlbGVjdG9yLnBvcEZvbnQoKX1hZGRQYXJhKCl7Y29uc3QgZT10aGlzLmZvbnRTZWxlY3Rvci50b3BGb250KCk7dGhpcy5leHRyYUhlaWdodCs9ZS5wYXJhTWFyZ2luLnRvcCtlLnBhcmFNYXJnaW4uYm90dG9tfWFkZFN0cmluZyhlKXtpZighZSlyZXR1cm47Y29uc3QgdD10aGlzLmZvbnRTZWxlY3Rvci50b3BGb250KCkscj10LnhmYUZvbnQuc2l6ZTtpZih0LnBkZkZvbnQpe2NvbnN0IG49dC54ZmFGb250LmxldHRlclNwYWNpbmcsYT10LnBkZkZvbnQsaT1hLmxpbmVIZWlnaHR8fDEuMixzPXQubGluZUhlaWdodHx8TWF0aC5tYXgoMS4yLGkpKnIsbz1pLSh2b2lkIDA9PT1hLmxpbmVHYXA/LjI6YS5saW5lR2FwKSxjPU1hdGgubWF4KDEsbykqcixsPXIvMWUzLGg9YS5kZWZhdWx0V2lkdGh8fGEuY2hhcnNUb0dseXBocygiICIpWzBdLndpZHRoO2Zvcihjb25zdCB0IG9mIGUuc3BsaXQoL1tcdTIwMjlcbl0vKSl7Y29uc3QgZT1hLmVuY29kZVN0cmluZyh0KS5qb2luKCIiKSxyPWEuY2hhcnNUb0dseXBocyhlKTtmb3IoY29uc3QgZSBvZiByKXtjb25zdCB0PWUud2lkdGh8fGg7dGhpcy5nbHlwaHMucHVzaChbdCpsK24scyxjLGUudW5pY29kZSwhMV0pfXRoaXMuZ2x5cGhzLnB1c2goWzAsMCwwLCJcbiIsITBdKX10aGlzLmdseXBocy5wb3AoKX1lbHNle2Zvcihjb25zdCB0IG9mIGUuc3BsaXQoL1tcdTIwMjlcbl0vKSl7Zm9yKGNvbnN0IGUgb2YgdC5zcGxpdCgiIikpdGhpcy5nbHlwaHMucHVzaChbciwxLjIqcixyLGUsITFdKTt0aGlzLmdseXBocy5wdXNoKFswLDAsMCwiXG4iLCEwXSl9dGhpcy5nbHlwaHMucG9wKCl9fWNvbXB1dGUoZSl7bGV0IHQ9LTEscj0wLG49MCxhPTAsaT0wLHM9MCxvPSExLGM9ITA7Zm9yKGxldCBsPTAsaD10aGlzLmdseXBocy5sZW5ndGg7bDxoO2wrKyl7Y29uc3RbaCx1LGQsZixnXT10aGlzLmdseXBoc1tsXSxwPSIgIj09PWYsbT1jP2Q6dTtnPyhuPU1hdGgubWF4KG4saSksaT0wLGErPXMscz1tLHQ9LTEscj0wLGM9ITEpOnA/aStoPmU/KG49TWF0aC5tYXgobixpKSxpPTAsYSs9cyxzPW0sdD0tMSxyPTAsbz0hMCxjPSExKToocz1NYXRoLm1heChtLHMpLHI9aSxpKz1oLHQ9bCk6aStoPmU/KGErPXMscz1tLC0xIT09dD8obD10LG49TWF0aC5tYXgobixyKSxpPTAsdD0tMSxyPTApOihuPU1hdGgubWF4KG4saSksaT1oKSxvPSEwLGM9ITEpOihpKz1oLHM9TWF0aC5tYXgobSxzKSl9cmV0dXJuIG49TWF0aC5tYXgobixpKSxhKz1zK3RoaXMuZXh0cmFIZWlnaHQse3dpZHRoOjEuMDIqbixoZWlnaHQ6YSxpc0Jyb2tlbjpvfX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuWG1sT2JqZWN0PXQuWEZBT2JqZWN0QXJyYXk9dC5YRkFPYmplY3Q9dC5YRkFBdHRyaWJ1dGU9dC5TdHJpbmdPYmplY3Q9dC5PcHRpb25PYmplY3Q9dC5PcHRpb24xMD10Lk9wdGlvbjAxPXQuSW50ZWdlck9iamVjdD10LkNvbnRlbnRPYmplY3Q9dm9pZCAwLHIoMTM5KSxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNyk7dmFyIG49cigyMjgpLGE9cigyMzcpLGk9cigxNDQpLHM9cigxNDkpLG89cigyMzQpLGM9cigyNDEpO2NvbnN0IGw9U3ltYm9sKCksaD1TeW1ib2woKSx1PVN5bWJvbCgpLGQ9U3ltYm9sKCJfY2hpbGRyZW4iKSxmPVN5bWJvbCgpLGc9U3ltYm9sKCkscD1TeW1ib2woKSxtPVN5bWJvbCgpLGI9U3ltYm9sKCkseT1TeW1ib2woKSx3PVN5bWJvbCgpLHY9U3ltYm9sKCkseD1TeW1ib2woKSxTPVN5bWJvbCgicGFyZW50IiksQT1TeW1ib2woKSxrPVN5bWJvbCgpLEM9U3ltYm9sKCk7bGV0IE89MDtjb25zdCBGPW8uTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkO2NsYXNzIEl7Y29uc3RydWN0b3IoZSx0KXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO3RoaXNbbi4kbmFtZXNwYWNlSWRdPWUsdGhpc1tuLiRub2RlTmFtZV09dCx0aGlzW3ddPXIsdGhpc1tTXT1udWxsLHRoaXNbZF09W10sdGhpc1tuLiR1aWRdPSIiLmNvbmNhdCh0KS5jb25jYXQoTysrKSx0aGlzW24uJGdsb2JhbERhdGFdPW51bGx9Z2V0IGlzWEZBT2JqZWN0KCl7cmV0dXJuITB9Z2V0IGlzWEZBT2JqZWN0QXJyYXkoKXtyZXR1cm4hMX1jcmVhdGVOb2RlcyhlKXtsZXQgdD10aGlzLHI9bnVsbDtmb3IoY29uc3R7bmFtZTphLGluZGV4Oml9b2YgZSl7Zm9yKGxldCBlPTAscz1pc0Zpbml0ZShpKT9pOjA7ZTw9cztlKyspe2NvbnN0IGU9dFtuLiRuYW1lc3BhY2VJZF09PT1GPy0xOnRbbi4kbmFtZXNwYWNlSWRdO3I9bmV3IEUoZSxhKSx0W24uJGFwcGVuZENoaWxkXShyKX10PXJ9cmV0dXJuIHJ9W24uJG9uQ2hpbGRdKGUpe2lmKCF0aGlzW3ddfHwhdGhpc1tuLiRvbkNoaWxkQ2hlY2tdKGUpKXJldHVybiExO2NvbnN0IHQ9ZVtuLiRub2RlTmFtZV0scj10aGlzW3RdO2lmKCEociBpbnN0YW5jZW9mIFQpKXJldHVybiBudWxsIT09ciYmdGhpc1tuLiRyZW1vdmVDaGlsZF0ociksdGhpc1t0XT1lLHRoaXNbbi4kYXBwZW5kQ2hpbGRdKGUpLCEwO2lmKHIucHVzaChlKSlyZXR1cm4gdGhpc1tuLiRhcHBlbmRDaGlsZF0oZSksITA7bGV0IGE9IiI7cmV0dXJuIHRoaXMuaWQ/YT0iIChpZDogIi5jb25jYXQodGhpcy5pZCwiKSIpOnRoaXMubmFtZSYmKGE9IiAobmFtZTogIi5jb25jYXQodGhpcy5uYW1lLCIgIikuY29uY2F0KHRoaXMuaC52YWx1ZSwiKSIpKSwoMCxpLndhcm4pKCdYRkEgLSBub2RlICInLmNvbmNhdCh0aGlzW24uJG5vZGVOYW1lXSwnIicpLmNvbmNhdChhLCcgaGFzIGFscmVhZHkgZW5vdWdoICInKS5jb25jYXQodCwnIiEnKSksITF9W24uJG9uQ2hpbGRDaGVja10oZSl7cmV0dXJuIHRoaXMuaGFzT3duUHJvcGVydHkoZVtuLiRub2RlTmFtZV0pJiZlW24uJG5hbWVzcGFjZUlkXT09PXRoaXNbbi4kbmFtZXNwYWNlSWRdfVtuLiRpc05zQWdub3N0aWNdKCl7cmV0dXJuITF9W24uJGFjY2VwdFdoaXRlc3BhY2VdKCl7cmV0dXJuITF9W24uJGlzQ0RBVEFYbWxdKCl7cmV0dXJuITF9W24uJGlzQmluZGFibGVdKCl7cmV0dXJuITF9W24uJHBvcFBhcmFdKCl7dGhpcy5wYXJhJiZ0aGlzW24uJGdldFRlbXBsYXRlUm9vdF0oKVtuLiRleHRyYV0ucGFyYVN0YWNrLnBvcCgpfVtuLiRwdXNoUGFyYV0oKXt0aGlzW24uJGdldFRlbXBsYXRlUm9vdF0oKVtuLiRleHRyYV0ucGFyYVN0YWNrLnB1c2godGhpcy5wYXJhKX1bbi4kc2V0SWRdKGUpe3RoaXMuaWQmJnRoaXNbbi4kbmFtZXNwYWNlSWRdPT09by5OYW1lc3BhY2VJZHMudGVtcGxhdGUuaWQmJmUuc2V0KHRoaXMuaWQsdGhpcyl9W24uJGdldFRlbXBsYXRlUm9vdF0oKXtyZXR1cm4gdGhpc1tuLiRnbG9iYWxEYXRhXS50ZW1wbGF0ZX1bbi4kaXNTcGxpdHRhYmxlXSgpe3JldHVybiExfVtuLiRpc1RoZXJlTW9yZVdpZHRoXSgpe3JldHVybiExfVtuLiRhcHBlbmRDaGlsZF0oZSl7ZVtTXT10aGlzLHRoaXNbZF0ucHVzaChlKSwhZVtuLiRnbG9iYWxEYXRhXSYmdGhpc1tuLiRnbG9iYWxEYXRhXSYmKGVbbi4kZ2xvYmFsRGF0YV09dGhpc1tuLiRnbG9iYWxEYXRhXSl9W24uJHJlbW92ZUNoaWxkXShlKXtjb25zdCB0PXRoaXNbZF0uaW5kZXhPZihlKTt0aGlzW2RdLnNwbGljZSh0LDEpfVtuLiRoYXNTZXR0YWJsZVZhbHVlXSgpe3JldHVybiB0aGlzLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpfVtuLiRzZXRWYWx1ZV0oZSl7fVtuLiRvblRleHRdKGUpe31bbi4kZmluYWxpemVdKCl7fVtuLiRjbGVhbl0oZSl7ZGVsZXRlIHRoaXNbd10sdGhpc1tuLiRjbGVhbnVwXSYmKGUuY2xlYW4odGhpc1tuLiRjbGVhbnVwXSksZGVsZXRlIHRoaXNbbi4kY2xlYW51cF0pfVtuLiRpbmRleE9mXShlKXtyZXR1cm4gdGhpc1tkXS5pbmRleE9mKGUpfVtuLiRpbnNlcnRBdF0oZSx0KXt0W1NdPXRoaXMsdGhpc1tkXS5zcGxpY2UoZSwwLHQpLCF0W24uJGdsb2JhbERhdGFdJiZ0aGlzW24uJGdsb2JhbERhdGFdJiYodFtuLiRnbG9iYWxEYXRhXT10aGlzW24uJGdsb2JhbERhdGFdKX1bbi4kaXNUcmFuc3BhcmVudF0oKXtyZXR1cm4hdGhpcy5uYW1lfVtuLiRsYXN0QXR0cmlidXRlXSgpe3JldHVybiIifVtuLiR0ZXh0XSgpe3JldHVybiAwPT09dGhpc1tkXS5sZW5ndGg/dGhpc1tuLiRjb250ZW50XTp0aGlzW2RdLm1hcCgoZT0+ZVtuLiR0ZXh0XSgpKSkuam9pbigiIil9Z2V0W3VdKCl7Y29uc3QgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7aWYoIWUuX2F0dHJpYnV0ZXMpe2NvbnN0IHQ9ZS5fYXR0cmlidXRlcz1uZXcgU2V0O2Zvcihjb25zdCBlIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKXtpZihudWxsPT09dGhpc1tlXXx8dGhpc1tlXWluc3RhbmNlb2YgSXx8dGhpc1tlXWluc3RhbmNlb2YgVClicmVhazt0LmFkZChlKX19cmV0dXJuKDAsaS5zaGFkb3cpKHRoaXMsdSxlLl9hdHRyaWJ1dGVzKX1bbi4kaXNEZXNjZW5kZW50XShlKXtsZXQgdD10aGlzO2Zvcig7dDspe2lmKHQ9PT1lKXJldHVybiEwO3Q9dFtuLiRnZXRQYXJlbnRdKCl9cmV0dXJuITF9W24uJGdldFBhcmVudF0oKXtyZXR1cm4gdGhpc1tTXX1bbi4kZ2V0U3ViZm9ybVBhcmVudF0oKXtyZXR1cm4gdGhpc1tuLiRnZXRQYXJlbnRdKCl9W24uJGdldENoaWxkcmVuXSgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO3JldHVybiBlP3RoaXNbZV06dGhpc1tkXX1bbi4kZHVtcF0oKXtjb25zdCBlPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpc1tuLiRjb250ZW50XSYmKGUuJGNvbnRlbnQ9dGhpc1tuLiRjb250ZW50XSk7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2NvbnN0IHI9dGhpc1t0XTtudWxsIT09ciYmKHIgaW5zdGFuY2VvZiBJP2VbdF09cltuLiRkdW1wXSgpOnIgaW5zdGFuY2VvZiBUP3IuaXNFbXB0eSgpfHwoZVt0XT1yLmR1bXAoKSk6ZVt0XT1yKX1yZXR1cm4gZX1bbi4kdG9TdHlsZV0oKXtyZXR1cm4gbnVsbH1bbi4kdG9IVE1MXSgpe3JldHVybiBhLkhUTUxSZXN1bHQuRU1QVFl9KltuLiRnZXRDb250YWluZWRDaGlsZHJlbl0oKXtmb3IoY29uc3QgZSBvZiB0aGlzW24uJGdldENoaWxkcmVuXSgpKXlpZWxkIGV9KlttXShlLHQpe2Zvcihjb25zdCByIG9mIHRoaXNbbi4kZ2V0Q29udGFpbmVkQ2hpbGRyZW5dKCkpaWYoIWV8fHQ9PT1lLmhhcyhyW24uJG5vZGVOYW1lXSkpe2NvbnN0IGU9dGhpc1tuLiRnZXRBdmFpbGFibGVTcGFjZV0oKSx0PXJbbi4kdG9IVE1MXShlKTt0LnN1Y2Nlc3N8fCh0aGlzW24uJGV4dHJhXS5mYWlsaW5nTm9kZT1yKSx5aWVsZCB0fX1bbi4kZmx1c2hIVE1MXSgpe3JldHVybiBudWxsfVtuLiRhZGRIVE1MXShlLHQpe3RoaXNbbi4kZXh0cmFdLmNoaWxkcmVuLnB1c2goZSl9W24uJGdldEF2YWlsYWJsZVNwYWNlXSgpe31bbi4kY2hpbGRyZW5Ub0hUTUxdKGUpe2xldHtmaWx0ZXI6dD1udWxsLGluY2x1ZGU6cj0hMH09ZTtpZih0aGlzW24uJGV4dHJhXS5nZW5lcmF0b3Ipe2NvbnN0IGU9dGhpc1tuLiRnZXRBdmFpbGFibGVTcGFjZV0oKSx0PXRoaXNbbi4kZXh0cmFdLmZhaWxpbmdOb2RlW24uJHRvSFRNTF0oZSk7aWYoIXQuc3VjY2VzcylyZXR1cm4gdDt0Lmh0bWwmJnRoaXNbbi4kYWRkSFRNTF0odC5odG1sLHQuYmJveCksZGVsZXRlIHRoaXNbbi4kZXh0cmFdLmZhaWxpbmdOb2RlfWVsc2UgdGhpc1tuLiRleHRyYV0uZ2VuZXJhdG9yPXRoaXNbbV0odCxyKTtmb3IoOzspe2NvbnN0IGU9dGhpc1tuLiRleHRyYV0uZ2VuZXJhdG9yLm5leHQoKTtpZihlLmRvbmUpYnJlYWs7Y29uc3QgdD1lLnZhbHVlO2lmKCF0LnN1Y2Nlc3MpcmV0dXJuIHQ7dC5odG1sJiZ0aGlzW24uJGFkZEhUTUxdKHQuaHRtbCx0LmJib3gpfXJldHVybiB0aGlzW24uJGV4dHJhXS5nZW5lcmF0b3I9bnVsbCxhLkhUTUxSZXN1bHQuRU1QVFl9W24uJHNldFNldEF0dHJpYnV0ZXNdKGUpe3RoaXNba109bmV3IFNldChPYmplY3Qua2V5cyhlKSl9W3ldKGUpe2NvbnN0IHQ9dGhpc1t1XSxyPXRoaXNba107cmV0dXJuWy4uLmVdLmZpbHRlcigoZT0+dC5oYXMoZSkmJiFyLmhhcyhlKSkpfVtuLiRyZXNvbHZlUHJvdG90eXBlc10oZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm5ldyBTZXQ7Zm9yKGNvbnN0IHIgb2YgdGhpc1tkXSlyW0FdKGUsdCl9W0FdKGUsdCl7Y29uc3Qgcj10aGlzW2JdKGUsdCk7cj90aGlzW2xdKHIsZSx0KTp0aGlzW24uJHJlc29sdmVQcm90b3R5cGVzXShlLHQpfVtiXShlLHQpe2NvbnN0e3VzZTpyLHVzZWhyZWY6YX09dGhpcztpZighciYmIWEpcmV0dXJuIG51bGw7bGV0IHM9bnVsbCxvPW51bGwsaD1udWxsLHU9cjtpZihhPyh1PWEsYS5zdGFydHNXaXRoKCIjc29tKCIpJiZhLmVuZHNXaXRoKCIpIik/bz1hLnNsaWNlKDUsLTEpOmEuc3RhcnRzV2l0aCgiLiNzb20oIikmJmEuZW5kc1dpdGgoIikiKT9vPWEuc2xpY2UoNiwtMSk6YS5zdGFydHNXaXRoKCIjIik/aD1hLnNsaWNlKDEpOmEuc3RhcnRzV2l0aCgiLiMiKSYmKGg9YS5zbGljZSgyKSkpOnIuc3RhcnRzV2l0aCgiIyIpP2g9ci5zbGljZSgxKTpvPXIsdGhpcy51c2U9dGhpcy51c2VocmVmPSIiLGg/cz1lLmdldChoKToocz0oMCxjLnNlYXJjaE5vZGUpKGUuZ2V0KG4uJHJvb3QpLHRoaXMsbywhMCwhMSkscyYmKHM9c1swXSkpLCFzKXJldHVybigwLGkud2FybikoIlhGQSAtIEludmFsaWQgcHJvdG90eXBlIHJlZmVyZW5jZTogIi5jb25jYXQodSwiLiIpKSxudWxsO2lmKHNbbi4kbm9kZU5hbWVdIT09dGhpc1tuLiRub2RlTmFtZV0pcmV0dXJuKDAsaS53YXJuKSgiWEZBIC0gSW5jb21wYXRpYmxlIHByb3RvdHlwZTogIi5jb25jYXQoc1tuLiRub2RlTmFtZV0sIiAhPT0gIikuY29uY2F0KHRoaXNbbi4kbm9kZU5hbWVdLCIuIikpLG51bGw7aWYodC5oYXMocykpcmV0dXJuKDAsaS53YXJuKSgiWEZBIC0gQ3ljbGUgZGV0ZWN0ZWQgaW4gcHJvdG90eXBlcyB1c2UuIiksbnVsbDt0LmFkZChzKTtjb25zdCBkPXNbYl0oZSx0KTtyZXR1cm4gZCYmc1tsXShkLGUsdCksc1tuLiRyZXNvbHZlUHJvdG90eXBlc10oZSx0KSx0LmRlbGV0ZShzKSxzfVtsXShlLHQscil7aWYoci5oYXMoZSkpKDAsaS53YXJuKSgiWEZBIC0gQ3ljbGUgZGV0ZWN0ZWQgaW4gcHJvdG90eXBlcyB1c2UuIik7ZWxzZXshdGhpc1tuLiRjb250ZW50XSYmZVtuLiRjb250ZW50XSYmKHRoaXNbbi4kY29udGVudF09ZVtuLiRjb250ZW50XSksbmV3IFNldChyKS5hZGQoZSk7Zm9yKGNvbnN0IHQgb2YgdGhpc1t5XShlW2tdKSl0aGlzW3RdPWVbdF0sdGhpc1trXSYmdGhpc1trXS5hZGQodCk7Zm9yKGNvbnN0IGEgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2lmKHRoaXNbdV0uaGFzKGEpKWNvbnRpbnVlO2NvbnN0IGk9dGhpc1thXSxzPWVbYV07aWYoaSBpbnN0YW5jZW9mIFQpe2Zvcihjb25zdCBlIG9mIGlbZF0pZVtBXSh0LHIpO2ZvcihsZXQgYT1pW2RdLmxlbmd0aCxvPXNbZF0ubGVuZ3RoO2E8bzthKyspe2NvbnN0IHM9ZVtkXVthXVtuLiRjbG9uZV0oKTtpZighaS5wdXNoKHMpKWJyZWFrO3NbU109dGhpcyx0aGlzW2RdLnB1c2gocyksc1tBXSh0LHIpfX1lbHNlIGlmKG51bGw9PT1pKXtpZihudWxsIT09cyl7Y29uc3QgZT1zW24uJGNsb25lXSgpO2VbU109dGhpcyx0aGlzW2FdPWUsdGhpc1tkXS5wdXNoKGUpLGVbQV0odCxyKX19ZWxzZSBpW24uJHJlc29sdmVQcm90b3R5cGVzXSh0LHIpLHMmJmlbbF0ocyx0LHIpfX19c3RhdGljW2ZdKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2UubWFwKChlPT5JW2ZdKGUpKSk6Im9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZT9PYmplY3QuYXNzaWduKHt9LGUpOmV9W24uJGNsb25lXSgpe2NvbnN0IGU9T2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpO2Zvcihjb25zdCB0IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGhpcykpdHJ5e2VbdF09dGhpc1t0XX1jYXRjaChyKXsoMCxpLnNoYWRvdykoZSx0LHRoaXNbdF0pfWVbbi4kdWlkXT0iIi5jb25jYXQoZVtuLiRub2RlTmFtZV0pLmNvbmNhdChPKyspLGVbZF09W107Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2lmKHRoaXNbdV0uaGFzKHQpKXtlW3RdPUlbZl0odGhpc1t0XSk7Y29udGludWV9Y29uc3Qgcj10aGlzW3RdO2VbdF09ciBpbnN0YW5jZW9mIFQ/bmV3IFQoclt2XSk6bnVsbH1mb3IoY29uc3QgdCBvZiB0aGlzW2RdKXtjb25zdCByPXRbbi4kbm9kZU5hbWVdLGE9dFtuLiRjbG9uZV0oKTtlW2RdLnB1c2goYSksYVtTXT1lLG51bGw9PT1lW3JdP2Vbcl09YTplW3JdW2RdLnB1c2goYSl9cmV0dXJuIGV9W24uJGdldENoaWxkcmVuXSgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO3JldHVybiBlP3RoaXNbZF0uZmlsdGVyKCh0PT50W24uJG5vZGVOYW1lXT09PWUpKTp0aGlzW2RdfVtuLiRnZXRDaGlsZHJlbkJ5Q2xhc3NdKGUpe3JldHVybiB0aGlzW2VdfVtuLiRnZXRDaGlsZHJlbkJ5TmFtZV0oZSx0KXtsZXQgcj0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO3JldHVybiBBcnJheS5mcm9tKHRoaXNbbi4kZ2V0Q2hpbGRyZW5CeU5hbWVJdF0oZSx0LHIpKX1bbi4kZ2V0Q2hpbGRyZW5CeU5hbWVJdF0oZSx0KXt2YXIgcj10aGlzO2xldCBhPSEoYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0pfHxhcmd1bWVudHNbMl07cmV0dXJuIGZ1bmN0aW9uKigpe2lmKCJwYXJlbnQiIT09ZSl7Zm9yKGNvbnN0IGEgb2YgcltkXSlhW24uJG5vZGVOYW1lXT09PWUmJih5aWVsZCBhKSxhLm5hbWU9PT1lJiYoeWllbGQgYSksKHR8fGFbbi4kaXNUcmFuc3BhcmVudF0oKSkmJih5aWVsZCphW24uJGdldENoaWxkcmVuQnlOYW1lSXRdKGUsdCwhMSkpO2EmJnJbdV0uaGFzKGUpJiYoeWllbGQgbmV3IE0ocixlLHJbZV0pKX1lbHNlIHlpZWxkIHJbU119KCl9fXQuWEZBT2JqZWN0PUk7Y2xhc3MgVHtjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXToxLzA7dGhpc1t2XT1lLHRoaXNbZF09W119Z2V0IGlzWEZBT2JqZWN0KCl7cmV0dXJuITF9Z2V0IGlzWEZBT2JqZWN0QXJyYXkoKXtyZXR1cm4hMH1wdXNoKGUpe3JldHVybiB0aGlzW2RdLmxlbmd0aDw9dGhpc1t2XT8odGhpc1tkXS5wdXNoKGUpLCEwKTooKDAsaS53YXJuKSgnWEZBIC0gbm9kZSAiJy5jb25jYXQoZVtuLiRub2RlTmFtZV0sJyIgYWNjZXB0cyBubyBtb3JlIHRoYW4gJykuY29uY2F0KHRoaXNbdl0sIiBjaGlsZHJlbiIpKSwhMSl9aXNFbXB0eSgpe3JldHVybiAwPT09dGhpc1tkXS5sZW5ndGh9ZHVtcCgpe3JldHVybiAxPT09dGhpc1tkXS5sZW5ndGg/dGhpc1tkXVswXVtuLiRkdW1wXSgpOnRoaXNbZF0ubWFwKChlPT5lW24uJGR1bXBdKCkpKX1bbi4kY2xvbmVdKCl7Y29uc3QgZT1uZXcgVCh0aGlzW3ZdKTtyZXR1cm4gZVtkXT10aGlzW2RdLm1hcCgoZT0+ZVtuLiRjbG9uZV0oKSkpLGV9Z2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXNbZF19Y2xlYXIoKXt0aGlzW2RdLmxlbmd0aD0wfX10LlhGQU9iamVjdEFycmF5PVQ7Y2xhc3MgTXtjb25zdHJ1Y3RvcihlLHQscil7dGhpc1tTXT1lLHRoaXNbbi4kbm9kZU5hbWVdPXQsdGhpc1tuLiRjb250ZW50XT1yLHRoaXNbbi4kY29uc3VtZWRdPSExLHRoaXNbbi4kdWlkXT0iYXR0cmlidXRlIitPKyt9W24uJGdldFBhcmVudF0oKXtyZXR1cm4gdGhpc1tTXX1bbi4kaXNEYXRhVmFsdWVdKCl7cmV0dXJuITB9W24uJGdldERhdGFWYWx1ZV0oKXtyZXR1cm4gdGhpc1tuLiRjb250ZW50XS50cmltKCl9W24uJHNldFZhbHVlXShlKXtlPWUudmFsdWV8fCIiLHRoaXNbbi4kY29udGVudF09ZS50b1N0cmluZygpfVtuLiR0ZXh0XSgpe3JldHVybiB0aGlzW24uJGNvbnRlbnRdfVtuLiRpc0Rlc2NlbmRlbnRdKGUpe3JldHVybiB0aGlzW1NdPT09ZXx8dGhpc1tTXVtuLiRpc0Rlc2NlbmRlbnRdKGUpfX10LlhGQUF0dHJpYnV0ZT1NO2NsYXNzIEUgZXh0ZW5kcyBJe2NvbnN0cnVjdG9yKGUsdCl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O2lmKHN1cGVyKGUsdCksdGhpc1tuLiRjb250ZW50XT0iIix0aGlzW2ddPW51bGwsIiN0ZXh0IiE9PXQpe2NvbnN0IGU9bmV3IE1hcDt0aGlzW2hdPWU7Zm9yKGNvbnN0W3Qsbl1vZiBPYmplY3QuZW50cmllcyhyKSllLnNldCh0LG5ldyBNKHRoaXMsdCxuKSk7aWYoci5oYXNPd25Qcm9wZXJ0eShuLiRuc0F0dHJpYnV0ZXMpKXtjb25zdCBlPXJbbi4kbnNBdHRyaWJ1dGVzXS54ZmEuZGF0YU5vZGU7dm9pZCAwIT09ZSYmKCJkYXRhR3JvdXAiPT09ZT90aGlzW2ddPSExOiJkYXRhVmFsdWUiPT09ZSYmKHRoaXNbZ109ITApKX19dGhpc1tuLiRjb25zdW1lZF09ITF9W24uJHRvU3RyaW5nXShlKXtjb25zdCB0PXRoaXNbbi4kbm9kZU5hbWVdO2lmKCIjdGV4dCI9PT10KXJldHVybiB2b2lkIGUucHVzaCgoMCxzLmVuY29kZVRvWG1sU3RyaW5nKSh0aGlzW24uJGNvbnRlbnRdKSk7Y29uc3Qgcj0oMCxpLnV0ZjhTdHJpbmdUb1N0cmluZykodCksYT10aGlzW24uJG5hbWVzcGFjZUlkXT09PUY/InhmYToiOiIiO2UucHVzaCgiPCIuY29uY2F0KGEpLmNvbmNhdChyKSk7Zm9yKGNvbnN0W3Qscl1vZiB0aGlzW2hdLmVudHJpZXMoKSl7Y29uc3QgYT0oMCxpLnV0ZjhTdHJpbmdUb1N0cmluZykodCk7ZS5wdXNoKCIgIi5jb25jYXQoYSwnPSInKS5jb25jYXQoKDAscy5lbmNvZGVUb1htbFN0cmluZykocltuLiRjb250ZW50XSksJyInKSl9aWYobnVsbCE9PXRoaXNbZ10mJih0aGlzW2ddP2UucHVzaCgnIHhmYTpkYXRhTm9kZT0iZGF0YVZhbHVlIicpOmUucHVzaCgnIHhmYTpkYXRhTm9kZT0iZGF0YUdyb3VwIicpKSx0aGlzW24uJGNvbnRlbnRdfHwwIT09dGhpc1tkXS5sZW5ndGgpe2lmKGUucHVzaCgiPiIpLHRoaXNbbi4kY29udGVudF0pInN0cmluZyI9PXR5cGVvZiB0aGlzW24uJGNvbnRlbnRdP2UucHVzaCgoMCxzLmVuY29kZVRvWG1sU3RyaW5nKSh0aGlzW24uJGNvbnRlbnRdKSk6dGhpc1tuLiRjb250ZW50XVtuLiR0b1N0cmluZ10oZSk7ZWxzZSBmb3IoY29uc3QgdCBvZiB0aGlzW2RdKXRbbi4kdG9TdHJpbmddKGUpO2UucHVzaCgiPC8iLmNvbmNhdChhKS5jb25jYXQociwiPiIpKX1lbHNlIGUucHVzaCgiLz4iKX1bbi4kb25DaGlsZF0oZSl7aWYodGhpc1tuLiRjb250ZW50XSl7Y29uc3QgZT1uZXcgRSh0aGlzW24uJG5hbWVzcGFjZUlkXSwiI3RleHQiKTt0aGlzW24uJGFwcGVuZENoaWxkXShlKSxlW24uJGNvbnRlbnRdPXRoaXNbbi4kY29udGVudF0sdGhpc1tuLiRjb250ZW50XT0iIn1yZXR1cm4gdGhpc1tuLiRhcHBlbmRDaGlsZF0oZSksITB9W24uJG9uVGV4dF0oZSl7dGhpc1tuLiRjb250ZW50XSs9ZX1bbi4kZmluYWxpemVdKCl7aWYodGhpc1tuLiRjb250ZW50XSYmdGhpc1tkXS5sZW5ndGg+MCl7Y29uc3QgZT1uZXcgRSh0aGlzW24uJG5hbWVzcGFjZUlkXSwiI3RleHQiKTt0aGlzW24uJGFwcGVuZENoaWxkXShlKSxlW24uJGNvbnRlbnRdPXRoaXNbbi4kY29udGVudF0sZGVsZXRlIHRoaXNbbi4kY29udGVudF19fVtuLiR0b0hUTUxdKCl7cmV0dXJuIiN0ZXh0Ij09PXRoaXNbbi4kbm9kZU5hbWVdP2EuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiIjdGV4dCIsdmFsdWU6dGhpc1tuLiRjb250ZW50XX0pOmEuSFRNTFJlc3VsdC5FTVBUWX1bbi4kZ2V0Q2hpbGRyZW5dKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGw7cmV0dXJuIGU/dGhpc1tkXS5maWx0ZXIoKHQ9PnRbbi4kbm9kZU5hbWVdPT09ZSkpOnRoaXNbZF19W24uJGdldEF0dHJpYnV0ZXNdKCl7cmV0dXJuIHRoaXNbaF19W24uJGdldENoaWxkcmVuQnlDbGFzc10oZSl7Y29uc3QgdD10aGlzW2hdLmdldChlKTtyZXR1cm4gdm9pZCAwIT09dD90OnRoaXNbbi4kZ2V0Q2hpbGRyZW5dKGUpfSpbbi4kZ2V0Q2hpbGRyZW5CeU5hbWVJdF0oZSx0KXtjb25zdCByPXRoaXNbaF0uZ2V0KGUpO3ImJih5aWVsZCByKTtmb3IoY29uc3QgciBvZiB0aGlzW2RdKXJbbi4kbm9kZU5hbWVdPT09ZSYmKHlpZWxkIHIpLHQmJih5aWVsZCpyW24uJGdldENoaWxkcmVuQnlOYW1lSXRdKGUsdCkpfSpbbi4kZ2V0QXR0cmlidXRlSXRdKGUsdCl7Y29uc3Qgcj10aGlzW2hdLmdldChlKTshcnx8dCYmcltuLiRjb25zdW1lZF18fCh5aWVsZCByKTtmb3IoY29uc3QgciBvZiB0aGlzW2RdKXlpZWxkKnJbbi4kZ2V0QXR0cmlidXRlSXRdKGUsdCl9KltuLiRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0oZSx0LHIpe2Zvcihjb25zdCBhIG9mIHRoaXNbZF0pYVtuLiRub2RlTmFtZV0hPT1lfHxyJiZhW24uJGNvbnN1bWVkXXx8KHlpZWxkIGEpLHQmJih5aWVsZCphW24uJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0XShlLHQscikpfVtuLiRpc0RhdGFWYWx1ZV0oKXtyZXR1cm4gbnVsbD09PXRoaXNbZ10/MD09PXRoaXNbZF0ubGVuZ3RofHx0aGlzW2RdWzBdW24uJG5hbWVzcGFjZUlkXT09PW8uTmFtZXNwYWNlSWRzLnhodG1sLmlkOnRoaXNbZ119W24uJGdldERhdGFWYWx1ZV0oKXtyZXR1cm4gbnVsbD09PXRoaXNbZ10/MD09PXRoaXNbZF0ubGVuZ3RoP3RoaXNbbi4kY29udGVudF0udHJpbSgpOnRoaXNbZF1bMF1bbi4kbmFtZXNwYWNlSWRdPT09by5OYW1lc3BhY2VJZHMueGh0bWwuaWQ/dGhpc1tkXVswXVtuLiR0ZXh0XSgpLnRyaW0oKTpudWxsOnRoaXNbbi4kY29udGVudF0udHJpbSgpfVtuLiRzZXRWYWx1ZV0oZSl7ZT1lLnZhbHVlfHwiIix0aGlzW24uJGNvbnRlbnRdPWUudG9TdHJpbmcoKX1bbi4kZHVtcF0oKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtlJiYodC4kbnM9dGhpc1tuLiRuYW1lc3BhY2VJZF0pLHRoaXNbbi4kY29udGVudF0mJih0LiRjb250ZW50PXRoaXNbbi4kY29udGVudF0pLHQuJG5hbWU9dGhpc1tuLiRub2RlTmFtZV0sdC5jaGlsZHJlbj1bXTtmb3IoY29uc3QgciBvZiB0aGlzW2RdKXQuY2hpbGRyZW4ucHVzaChyW24uJGR1bXBdKGUpKTt0LmF0dHJpYnV0ZXM9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoY29uc3RbZSxyXW9mIHRoaXNbaF0pdC5hdHRyaWJ1dGVzW2VdPXJbbi4kY29udGVudF07cmV0dXJuIHR9fXQuWG1sT2JqZWN0PUU7Y2xhc3MgUCBleHRlbmRzIEl7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpLHRoaXNbbi4kY29udGVudF09IiJ9W24uJG9uVGV4dF0oZSl7dGhpc1tuLiRjb250ZW50XSs9ZX1bbi4kZmluYWxpemVdKCl7fX10LkNvbnRlbnRPYmplY3Q9UDtjbGFzcyBSIGV4dGVuZHMgUHtjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIoZSx0KSx0aGlzW3hdPXJ9W24uJGZpbmFsaXplXSgpe3RoaXNbbi4kY29udGVudF09KDAsYS5nZXRLZXl3b3JkKSh7ZGF0YTp0aGlzW24uJGNvbnRlbnRdLGRlZmF1bHRWYWx1ZTp0aGlzW3hdWzBdLHZhbGlkYXRlOmU9PnRoaXNbeF0uaW5jbHVkZXMoZSl9KX1bbi4kY2xlYW5dKGUpe3N1cGVyW24uJGNsZWFuXShlKSxkZWxldGUgdGhpc1t4XX19dC5PcHRpb25PYmplY3Q9UjtjbGFzcyBOIGV4dGVuZHMgUHtbbi4kZmluYWxpemVdKCl7dGhpc1tuLiRjb250ZW50XT10aGlzW24uJGNvbnRlbnRdLnRyaW0oKX19dC5TdHJpbmdPYmplY3Q9TjtjbGFzcyBEIGV4dGVuZHMgUHtjb25zdHJ1Y3RvcihlLHQscixuKXtzdXBlcihlLHQpLHRoaXNbcF09cix0aGlzW0NdPW59W24uJGZpbmFsaXplXSgpe3RoaXNbbi4kY29udGVudF09KDAsYS5nZXRJbnRlZ2VyKSh7ZGF0YTp0aGlzW24uJGNvbnRlbnRdLGRlZmF1bHRWYWx1ZTp0aGlzW3BdLHZhbGlkYXRlOnRoaXNbQ119KX1bbi4kY2xlYW5dKGUpe3N1cGVyW24uJGNsZWFuXShlKSxkZWxldGUgdGhpc1twXSxkZWxldGUgdGhpc1tDXX19dC5JbnRlZ2VyT2JqZWN0PUQsdC5PcHRpb24wMT1jbGFzcyBleHRlbmRzIER7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQsMCwoZT0+MT09PWUpKX19LHQuT3B0aW9uMTA9Y2xhc3MgZXh0ZW5kcyBEe2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0LDEsKGU9PjA9PT1lKSl9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZURhdGFOb2RlPWZ1bmN0aW9uKGUsdCxyKXtjb25zdCBpPWgocik7aWYoIWkpcmV0dXJuIG51bGw7aWYoaS5zb21lKChlPT5lLm9wZXJhdG9yPT09by5kb3REb3QpKSlyZXR1cm4gbnVsbDtjb25zdCBzPWMuZ2V0KGlbMF0ubmFtZSk7bGV0IGw9MDtzPyhlPXMoZSx0KSxsPTEpOmU9dHx8ZTtmb3IobGV0IHQ9aS5sZW5ndGg7bDx0O2wrKyl7Y29uc3R7bmFtZTp0LG9wZXJhdG9yOnIsaW5kZXg6c309aVtsXTtpZighaXNGaW5pdGUocykpcmV0dXJuIGlbbF0uaW5kZXg9MCxlLmNyZWF0ZU5vZGVzKGkuc2xpY2UobCkpO2xldCBjO3N3aXRjaChyKXtjYXNlIG8uZG90OmM9ZVtuLiRnZXRDaGlsZHJlbkJ5TmFtZV0odCwhMSk7YnJlYWs7Y2FzZSBvLmRvdERvdDpjPWVbbi4kZ2V0Q2hpbGRyZW5CeU5hbWVdKHQsITApO2JyZWFrO2Nhc2Ugby5kb3RIYXNoOmM9ZVtuLiRnZXRDaGlsZHJlbkJ5Q2xhc3NdKHQpLGM9Yy5pc1hGQU9iamVjdEFycmF5P2MuY2hpbGRyZW46W2NdfWlmKDA9PT1jLmxlbmd0aClyZXR1cm4gZS5jcmVhdGVOb2RlcyhpLnNsaWNlKGwpKTtpZighKHM8Yy5sZW5ndGgpKXJldHVybiBpW2xdLmluZGV4PXMtYy5sZW5ndGgsZS5jcmVhdGVOb2RlcyhpLnNsaWNlKGwpKTt7Y29uc3QgdD1jW3NdO2lmKCF0LmlzWEZBT2JqZWN0KXJldHVybigwLGEud2FybikoIlhGQSAtIENhbm5vdCBjcmVhdGUgYSBub2RlLiIpLG51bGw7ZT10fX1yZXR1cm4gbnVsbH0sdC5zZWFyY2hOb2RlPWZ1bmN0aW9uKGUsdCxyKXtsZXQgYT0hKGFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdKXx8YXJndW1lbnRzWzRdO2NvbnN0IGk9aChyLCEoYXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10pfHxhcmd1bWVudHNbM10pO2lmKCFpKXJldHVybiBudWxsO2NvbnN0IHM9Yy5nZXQoaVswXS5uYW1lKTtsZXQgdSxkPTA7cz8odT0hMCxlPVtzKGUsdCldLGQ9MSk6KHU9bnVsbD09PXQsZT1bdHx8ZV0pO2ZvcihsZXQgcj1pLmxlbmd0aDtkPHI7ZCsrKXtjb25zdHtuYW1lOnIsY2FjaGVOYW1lOnMsb3BlcmF0b3I6YyxpbmRleDpofT1pW2RdLGY9W107Zm9yKGNvbnN0IHQgb2YgZSl7aWYoIXQuaXNYRkFPYmplY3QpY29udGludWU7bGV0IGUsaTtpZihhJiYoaT1sLmdldCh0KSxpfHwoaT1uZXcgTWFwLGwuc2V0KHQsaSkpLGU9aS5nZXQocykpLCFlKXtzd2l0Y2goYyl7Y2FzZSBvLmRvdDplPXRbbi4kZ2V0Q2hpbGRyZW5CeU5hbWVdKHIsITEpO2JyZWFrO2Nhc2Ugby5kb3REb3Q6ZT10W24uJGdldENoaWxkcmVuQnlOYW1lXShyLCEwKTticmVhaztjYXNlIG8uZG90SGFzaDplPXRbbi4kZ2V0Q2hpbGRyZW5CeUNsYXNzXShyKSxlPWUuaXNYRkFPYmplY3RBcnJheT9lLmNoaWxkcmVuOltlXX1hJiZpLnNldChzLGUpfWUubGVuZ3RoPjAmJmYucHVzaChlKX1pZigwIT09Zi5sZW5ndGh8fHV8fDAhPT1kKWU9aXNGaW5pdGUoaCk/Zi5maWx0ZXIoKGU9Pmg8ZS5sZW5ndGgpKS5tYXAoKGU9PmVbaF0pKTpmLmZsYXQoKTtlbHNle2NvbnN0IHI9dFtuLiRnZXRQYXJlbnRdKCk7aWYoISh0PXIpKXJldHVybiBudWxsO2Q9LTEsZT1bdF19fXJldHVybiAwPT09ZS5sZW5ndGg/bnVsbDplfSxyKDEzOSk7dmFyIG49cigyMjgpLGE9cigxNDQpO2NvbnN0IGk9L15bXi5bXSsvLHM9L15bXlxdXSsvLG89e2RvdDowLGRvdERvdDoxLGRvdEhhc2g6Mixkb3RCcmFja2V0OjMsZG90UGFyZW46NH0sYz1uZXcgTWFwKFtbIiRkYXRhIiwoZSx0KT0+ZS5kYXRhc2V0cz9lLmRhdGFzZXRzLmRhdGE6ZV0sWyIkcmVjb3JkIiwoZSx0KT0+KGUuZGF0YXNldHM/ZS5kYXRhc2V0cy5kYXRhOmUpW24uJGdldENoaWxkcmVuXSgpWzBdXSxbIiR0ZW1wbGF0ZSIsKGUsdCk9PmUudGVtcGxhdGVdLFsiJGNvbm5lY3Rpb25TZXQiLChlLHQpPT5lLmNvbm5lY3Rpb25TZXRdLFsiJGZvcm0iLChlLHQpPT5lLmZvcm1dLFsiJGxheW91dCIsKGUsdCk9PmUubGF5b3V0XSxbIiRob3N0IiwoZSx0KT0+ZS5ob3N0XSxbIiRkYXRhV2luZG93IiwoZSx0KT0+ZS5kYXRhV2luZG93XSxbIiRldmVudCIsKGUsdCk9PmUuZXZlbnRdLFsiISIsKGUsdCk9PmUuZGF0YXNldHNdLFsiJHhmYSIsKGUsdCk9PmVdLFsieGZhIiwoZSx0KT0+ZV0sWyIkIiwoZSx0KT0+dF1dKSxsPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIGgoZSx0KXtsZXQgcj0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdLG49ZS5tYXRjaChpKTtpZighbilyZXR1cm4gbnVsbDtsZXRbY109bjtjb25zdCBsPVt7bmFtZTpjLGNhY2hlTmFtZToiLiIrYyxpbmRleDowLGpzOm51bGwsZm9ybUNhbGM6bnVsbCxvcGVyYXRvcjpvLmRvdH1dO2xldCBoPWMubGVuZ3RoO2Zvcig7aDxlLmxlbmd0aDspe2NvbnN0IGQ9aDtpZigiWyI9PT1lLmNoYXJBdChoKyspKXtpZihuPWUuc2xpY2UoaCkubWF0Y2gocyksIW4pcmV0dXJuKDAsYS53YXJuKSgiWEZBIC0gSW52YWxpZCBpbmRleCBpbiBTT00gZXhwcmVzc2lvbiIpLG51bGw7bC5hdCgtMSkuaW5kZXg9IioiPT09KHU9KHU9blswXSkudHJpbSgpKT8xLzA6cGFyc2VJbnQodSwxMCl8fDAsaCs9blswXS5sZW5ndGgrMTtjb250aW51ZX1sZXQgZjtzd2l0Y2goZS5jaGFyQXQoaCkpe2Nhc2UiLiI6aWYoIXQpcmV0dXJuIG51bGw7aCsrLGY9by5kb3REb3Q7YnJlYWs7Y2FzZSIjIjpoKyssZj1vLmRvdEhhc2g7YnJlYWs7Y2FzZSJbIjppZihyKXJldHVybigwLGEud2FybikoIlhGQSAtIFNPTSBleHByZXNzaW9uIGNvbnRhaW5zIGEgRm9ybUNhbGMgc3ViZXhwcmVzc2lvbiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGZvciBub3cuIiksbnVsbDtmPW8uZG90QnJhY2tldDticmVhaztjYXNlIigiOmlmKHIpcmV0dXJuKDAsYS53YXJuKSgiWEZBIC0gU09NIGV4cHJlc3Npb24gY29udGFpbnMgYSBKYXZhU2NyaXB0IHN1YmV4cHJlc3Npb24gd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBmb3Igbm93LiIpLG51bGw7Zj1vLmRvdFBhcmVuO2JyZWFrO2RlZmF1bHQ6Zj1vLmRvdH1pZihuPWUuc2xpY2UoaCkubWF0Y2goaSksIW4pYnJlYWs7W2NdPW4saCs9Yy5sZW5ndGgsbC5wdXNoKHtuYW1lOmMsY2FjaGVOYW1lOmUuc2xpY2UoZCxoKSxvcGVyYXRvcjpmLGluZGV4OjAsanM6bnVsbCxmb3JtQ2FsYzpudWxsfSl9dmFyIHU7cmV0dXJuIGx9fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRGF0YUhhbmRsZXI9dm9pZCAwLHIoMTM5KTt2YXIgbj1yKDIyOCk7dC5EYXRhSGFuZGxlcj1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZGF0YT10LHRoaXMuZGF0YXNldD1lLmRhdGFzZXRzfHxudWxsfXNlcmlhbGl6ZShlKXtjb25zdCB0PVtbLTEsdGhpcy5kYXRhW24uJGdldENoaWxkcmVuXSgpXV07Zm9yKDt0Lmxlbmd0aD4wOyl7Y29uc3Qgcj10LmF0KC0xKSxbYSxpXT1yO2lmKGErMT09PWkubGVuZ3RoKXt0LnBvcCgpO2NvbnRpbnVlfWNvbnN0IHM9aVsrK3JbMF1dLG89ZS5nZXQoc1tuLiR1aWRdKTtpZihvKXNbbi4kc2V0VmFsdWVdKG8pO2Vsc2V7Y29uc3QgdD1zW24uJGdldEF0dHJpYnV0ZXNdKCk7Zm9yKGNvbnN0IHIgb2YgdC52YWx1ZXMoKSl7Y29uc3QgdD1lLmdldChyW24uJHVpZF0pO2lmKHQpe3Jbbi4kc2V0VmFsdWVdKHQpO2JyZWFrfX19Y29uc3QgYz1zW24uJGdldENoaWxkcmVuXSgpO2MubGVuZ3RoPjAmJnQucHVzaChbLTEsY10pfWNvbnN0IHI9Wyc8eGZhOmRhdGFzZXRzIHhtbG5zOnhmYT0iaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtZGF0YS8xLjAvIj4nXTtpZih0aGlzLmRhdGFzZXQpZm9yKGNvbnN0IGUgb2YgdGhpcy5kYXRhc2V0W24uJGdldENoaWxkcmVuXSgpKSJkYXRhIiE9PWVbbi4kbm9kZU5hbWVdJiZlW24uJHRvU3RyaW5nXShyKTtyZXR1cm4gdGhpcy5kYXRhW24uJHRvU3RyaW5nXShyKSxyLnB1c2goIjwveGZhOmRhdGFzZXRzPiIpLHIuam9pbigiIil9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlhGQVBhcnNlcj12b2lkIDAscigxMTYpLHIoMTI2KSxyKDEyOCkscigxMzEpLHIoMTMzKSxyKDEzNSkscigxMzcpLHIoMTM5KTt2YXIgbj1yKDIyOCksYT1yKDIxNyksaT1yKDI0NCkscz1yKDE0NCk7Y2xhc3MgbyBleHRlbmRzIGEuWE1MUGFyc2VyQmFzZXtjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsLHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtzdXBlcigpLHRoaXMuX2J1aWxkZXI9bmV3IGkuQnVpbGRlcihlKSx0aGlzLl9zdGFjaz1bXSx0aGlzLl9nbG9iYWxEYXRhPXt1c2VkVHlwZWZhY2VzOm5ldyBTZXR9LHRoaXMuX2lkcz1uZXcgTWFwLHRoaXMuX2N1cnJlbnQ9dGhpcy5fYnVpbGRlci5idWlsZFJvb3QodGhpcy5faWRzKSx0aGlzLl9lcnJvckNvZGU9YS5YTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcix0aGlzLl93aGl0ZVJlZ2V4PS9eXHMrJC8sdGhpcy5fbmJzcHM9L1x4YTArL2csdGhpcy5fcmljaFRleHQ9dH1wYXJzZShlKXtpZih0aGlzLnBhcnNlWG1sKGUpLHRoaXMuX2Vycm9yQ29kZT09PWEuWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3IpcmV0dXJuIHRoaXMuX2N1cnJlbnRbbi4kZmluYWxpemVdKCksdGhpcy5fY3VycmVudC5lbGVtZW50fW9uVGV4dChlKXtlPWUucmVwbGFjZSh0aGlzLl9uYnNwcywoZT0+ZS5zbGljZSgxKSsiICIpKSx0aGlzLl9yaWNoVGV4dHx8dGhpcy5fY3VycmVudFtuLiRhY2NlcHRXaGl0ZXNwYWNlXSgpP3RoaXMuX2N1cnJlbnRbbi4kb25UZXh0XShlLHRoaXMuX3JpY2hUZXh0KTp0aGlzLl93aGl0ZVJlZ2V4LnRlc3QoZSl8fHRoaXMuX2N1cnJlbnRbbi4kb25UZXh0XShlLnRyaW0oKSl9b25DZGF0YShlKXt0aGlzLl9jdXJyZW50W24uJG9uVGV4dF0oZSl9X21rQXR0cmlidXRlcyhlLHQpe2xldCByPW51bGwsYT1udWxsO2NvbnN0IGk9T2JqZWN0LmNyZWF0ZSh7fSk7Zm9yKGNvbnN0e25hbWU6Yyx2YWx1ZTpsfW9mIGUpaWYoInhtbG5zIj09PWMpcj8oMCxzLndhcm4pKCJYRkEgLSBtdWx0aXBsZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBpbiA8Ii5jb25jYXQodCwiPiIpKTpyPWw7ZWxzZSBpZihjLnN0YXJ0c1dpdGgoInhtbG5zOiIpKXtjb25zdCBlPWMuc3Vic3RyaW5nKDYpO2F8fChhPVtdKSxhLnB1c2goe3ByZWZpeDplLHZhbHVlOmx9KX1lbHNle2NvbnN0IGU9Yy5pbmRleE9mKCI6Iik7aWYoLTE9PT1lKWlbY109bDtlbHNle3ZhciBvO2xldCB0PWlbbi4kbnNBdHRyaWJ1dGVzXTt0fHwodD1pW24uJG5zQXR0cmlidXRlc109T2JqZWN0LmNyZWF0ZShudWxsKSk7Y29uc3RbcixhXT1bYy5zbGljZSgwLGUpLGMuc2xpY2UoZSsxKV07KChvPXQpW3JdfHwob1tyXT1PYmplY3QuY3JlYXRlKG51bGwpKSlbYV09bH19cmV0dXJuW3IsYSxpXX1fZ2V0TmFtZUFuZFByZWZpeChlLHQpe2NvbnN0IHI9ZS5pbmRleE9mKCI6Iik7cmV0dXJuLTE9PT1yP1tlLG51bGxdOltlLnN1YnN0cmluZyhyKzEpLHQ/IiI6ZS5zdWJzdHJpbmcoMCxyKV19b25CZWdpbkVsZW1lbnQoZSx0LHIpe2NvbnN0W2EsaSxzXT10aGlzLl9ta0F0dHJpYnV0ZXModCxlKSxbbyxjXT10aGlzLl9nZXROYW1lQW5kUHJlZml4KGUsdGhpcy5fYnVpbGRlci5pc05zQWdub3N0aWMoKSksbD10aGlzLl9idWlsZGVyLmJ1aWxkKHtuc1ByZWZpeDpjLG5hbWU6byxhdHRyaWJ1dGVzOnMsbmFtZXNwYWNlOmEscHJlZml4ZXM6aX0pO2xbbi4kZ2xvYmFsRGF0YV09dGhpcy5fZ2xvYmFsRGF0YSxyPyhsW24uJGZpbmFsaXplXSgpLHRoaXMuX2N1cnJlbnRbbi4kb25DaGlsZF0obCkmJmxbbi4kc2V0SWRdKHRoaXMuX2lkcyksbFtuLiRjbGVhbl0odGhpcy5fYnVpbGRlcikpOih0aGlzLl9zdGFjay5wdXNoKHRoaXMuX2N1cnJlbnQpLHRoaXMuX2N1cnJlbnQ9bCl9b25FbmRFbGVtZW50KGUpe2NvbnN0IHQ9dGhpcy5fY3VycmVudDtpZih0W24uJGlzQ0RBVEFYbWxdKCkmJiJzdHJpbmciPT10eXBlb2YgdFtuLiRjb250ZW50XSl7Y29uc3QgZT1uZXcgbztlLl9nbG9iYWxEYXRhPXRoaXMuX2dsb2JhbERhdGE7Y29uc3Qgcj1lLnBhcnNlKHRbbi4kY29udGVudF0pO3Rbbi4kY29udGVudF09bnVsbCx0W24uJG9uQ2hpbGRdKHIpfXRbbi4kZmluYWxpemVdKCksdGhpcy5fY3VycmVudD10aGlzLl9zdGFjay5wb3AoKSx0aGlzLl9jdXJyZW50W24uJG9uQ2hpbGRdKHQpJiZ0W24uJHNldElkXSh0aGlzLl9pZHMpLHRbbi4kY2xlYW5dKHRoaXMuX2J1aWxkZXIpfW9uRXJyb3IoZSl7dGhpcy5fZXJyb3JDb2RlPWV9fXQuWEZBUGFyc2VyPW99LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5CdWlsZGVyPXZvaWQgMCxyKDEzOSk7dmFyIG49cigyMzQpLGE9cigyMjgpLGk9cigyNDUpLHM9cigyMzApLG89cigyNTQpLGM9cigxNDQpLGw9cigyNDApO2NsYXNzIGggZXh0ZW5kcyBsLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigtMSwicm9vdCIsT2JqZWN0LmNyZWF0ZShudWxsKSksdGhpcy5lbGVtZW50PW51bGwsdGhpc1thLiRpZHNdPWV9W2EuJG9uQ2hpbGRdKGUpe3JldHVybiB0aGlzLmVsZW1lbnQ9ZSwhMH1bYS4kZmluYWxpemVdKCl7c3VwZXJbYS4kZmluYWxpemVdKCksdGhpcy5lbGVtZW50LnRlbXBsYXRlIGluc3RhbmNlb2Ygcy5UZW1wbGF0ZSYmKHRoaXNbYS4kaWRzXS5zZXQoYS4kcm9vdCx0aGlzLmVsZW1lbnQpLHRoaXMuZWxlbWVudC50ZW1wbGF0ZVthLiRyZXNvbHZlUHJvdG90eXBlc10odGhpc1thLiRpZHNdKSx0aGlzLmVsZW1lbnQudGVtcGxhdGVbYS4kaWRzXT10aGlzW2EuJGlkc10pfX1jbGFzcyB1IGV4dGVuZHMgbC5YRkFPYmplY3R7Y29uc3RydWN0b3IoKXtzdXBlcigtMSwiIixPYmplY3QuY3JlYXRlKG51bGwpKX1bYS4kb25DaGlsZF0oZSl7cmV0dXJuITF9fXQuQnVpbGRlcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO3RoaXMuX25hbWVzcGFjZVN0YWNrPVtdLHRoaXMuX25zQWdub3N0aWNMZXZlbD0wLHRoaXMuX25hbWVzcGFjZVByZWZpeGVzPW5ldyBNYXAsdGhpcy5fbmFtZXNwYWNlcz1uZXcgTWFwLHRoaXMuX25leHROc0lkPU1hdGgubWF4KC4uLk9iamVjdC52YWx1ZXMobi5OYW1lc3BhY2VJZHMpLm1hcCgoZT0+e2xldHtpZDp0fT1lO3JldHVybiB0fSkpKSx0aGlzLl9jdXJyZW50TmFtZXNwYWNlPWV8fG5ldyBvLlVua25vd25OYW1lc3BhY2UoKyt0aGlzLl9uZXh0TnNJZCl9YnVpbGRSb290KGUpe3JldHVybiBuZXcgaChlKX1idWlsZChlKXtsZXR7bnNQcmVmaXg6dCxuYW1lOnIsYXR0cmlidXRlczpzLG5hbWVzcGFjZTpvLHByZWZpeGVzOmN9PWU7Y29uc3QgbD1udWxsIT09bztpZihsJiYodGhpcy5fbmFtZXNwYWNlU3RhY2sucHVzaCh0aGlzLl9jdXJyZW50TmFtZXNwYWNlKSx0aGlzLl9jdXJyZW50TmFtZXNwYWNlPXRoaXMuX3NlYXJjaE5hbWVzcGFjZShvKSksYyYmdGhpcy5fYWRkTmFtZXNwYWNlUHJlZml4KGMpLHMuaGFzT3duUHJvcGVydHkoYS4kbnNBdHRyaWJ1dGVzKSl7Y29uc3QgZT1pLk5hbWVzcGFjZVNldFVwLmRhdGFzZXRzLHQ9c1thLiRuc0F0dHJpYnV0ZXNdO2xldCByPW51bGw7Zm9yKGNvbnN0W24sYV1vZiBPYmplY3QuZW50cmllcyh0KSlpZih0aGlzLl9nZXROYW1lc3BhY2VUb1VzZShuKT09PWUpe3I9e3hmYTphfTticmVha31yP3NbYS4kbnNBdHRyaWJ1dGVzXT1yOmRlbGV0ZSBzW2EuJG5zQXR0cmlidXRlc119Y29uc3QgaD10aGlzLl9nZXROYW1lc3BhY2VUb1VzZSh0KSxkPShudWxsPT1oP3ZvaWQgMDpoW24uJGJ1aWxkWEZBT2JqZWN0XShyLHMpKXx8bmV3IHU7cmV0dXJuIGRbYS4kaXNOc0Fnbm9zdGljXSgpJiZ0aGlzLl9uc0Fnbm9zdGljTGV2ZWwrKywobHx8Y3x8ZFthLiRpc05zQWdub3N0aWNdKCkpJiYoZFthLiRjbGVhbnVwXT17aGFzTmFtZXNwYWNlOmwscHJlZml4ZXM6Yyxuc0Fnbm9zdGljOmRbYS4kaXNOc0Fnbm9zdGljXSgpfSksZH1pc05zQWdub3N0aWMoKXtyZXR1cm4gdGhpcy5fbnNBZ25vc3RpY0xldmVsPjB9X3NlYXJjaE5hbWVzcGFjZShlKXtsZXQgdD10aGlzLl9uYW1lc3BhY2VzLmdldChlKTtpZih0KXJldHVybiB0O2Zvcihjb25zdFtyLHtjaGVjazphfV1vZiBPYmplY3QuZW50cmllcyhuLk5hbWVzcGFjZUlkcykpaWYoYShlKSl7aWYodD1pLk5hbWVzcGFjZVNldFVwW3JdLHQpcmV0dXJuIHRoaXMuX25hbWVzcGFjZXMuc2V0KGUsdCksdDticmVha31yZXR1cm4gdD1uZXcgby5Vbmtub3duTmFtZXNwYWNlKCsrdGhpcy5fbmV4dE5zSWQpLHRoaXMuX25hbWVzcGFjZXMuc2V0KGUsdCksdH1fYWRkTmFtZXNwYWNlUHJlZml4KGUpe2Zvcihjb25zdHtwcmVmaXg6dCx2YWx1ZTpyfW9mIGUpe2NvbnN0IGU9dGhpcy5fc2VhcmNoTmFtZXNwYWNlKHIpO2xldCBuPXRoaXMuX25hbWVzcGFjZVByZWZpeGVzLmdldCh0KTtufHwobj1bXSx0aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5zZXQodCxuKSksbi5wdXNoKGUpfX1fZ2V0TmFtZXNwYWNlVG9Vc2UoZSl7aWYoIWUpcmV0dXJuIHRoaXMuX2N1cnJlbnROYW1lc3BhY2U7Y29uc3QgdD10aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5nZXQoZSk7cmV0dXJuKG51bGw9PXQ/dm9pZCAwOnQubGVuZ3RoKT4wP3QuYXQoLTEpOigoMCxjLndhcm4pKCJVbmtub3duIG5hbWVzcGFjZSBwcmVmaXg6ICIuY29uY2F0KGUsIi4iKSksbnVsbCl9Y2xlYW4oZSl7Y29uc3R7aGFzTmFtZXNwYWNlOnQscHJlZml4ZXM6cixuc0Fnbm9zdGljOm59PWU7dCYmKHRoaXMuX2N1cnJlbnROYW1lc3BhY2U9dGhpcy5fbmFtZXNwYWNlU3RhY2sucG9wKCkpLHImJnIuZm9yRWFjaCgoZT0+e2xldHtwcmVmaXg6dH09ZTt0aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5nZXQodCkucG9wKCl9KSksbiYmdGhpcy5fbnNBZ25vc3RpY0xldmVsLS19fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lk5hbWVzcGFjZVNldFVwPXZvaWQgMDt2YXIgbj1yKDI0NiksYT1yKDI0NyksaT1yKDI0OCkscz1yKDI0OSksbz1yKDI1MCksYz1yKDI1MSksbD1yKDIzMCksaD1yKDI1MiksdT1yKDI1Myk7Y29uc3QgZD17Y29uZmlnOm4uQ29uZmlnTmFtZXNwYWNlLGNvbm5lY3Rpb246YS5Db25uZWN0aW9uU2V0TmFtZXNwYWNlLGRhdGFzZXRzOmkuRGF0YXNldHNOYW1lc3BhY2UsbG9jYWxlU2V0OnMuTG9jYWxlU2V0TmFtZXNwYWNlLHNpZ25hdHVyZTpvLlNpZ25hdHVyZU5hbWVzcGFjZSxzdHlsZXNoZWV0OmMuU3R5bGVzaGVldE5hbWVzcGFjZSx0ZW1wbGF0ZTpsLlRlbXBsYXRlTmFtZXNwYWNlLHhkcDpoLlhkcE5hbWVzcGFjZSx4aHRtbDp1LlhodG1sTmFtZXNwYWNlfTt0Lk5hbWVzcGFjZVNldFVwPWR9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Db25maWdOYW1lc3BhY2U9dm9pZCAwLHIoMTM5KTt2YXIgbj1yKDIzNCksYT1yKDIyOCksaT1yKDI0MCkscz1yKDIzNyksbz1yKDE0NCk7Y29uc3QgYz1uLk5hbWVzcGFjZUlkcy5jb25maWcuaWQ7Y2xhc3MgbCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImFjcm9iYXQiLCEwKSx0aGlzLmFjcm9iYXQ3PW51bGwsdGhpcy5hdXRvU2F2ZT1udWxsLHRoaXMuY29tbW9uPW51bGwsdGhpcy52YWxpZGF0ZT1udWxsLHRoaXMudmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXM9bnVsbCx0aGlzLnN1Ym1pdFVybD1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgaCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImFjcm9iYXQ3IiwhMCksdGhpcy5keW5hbWljUmVuZGVyPW51bGx9fWNsYXNzIHUgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJBREJFX0pTQ29uc29sZSIsWyJkZWxlZ2F0ZSIsIkVuYWJsZSIsIkRpc2FibGUiXSl9fWNsYXNzIGQgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJBREJFX0pTRGVidWdnZXIiLFsiZGVsZWdhdGUiLCJFbmFibGUiLCJEaXNhYmxlIl0pfX1jbGFzcyBmIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJhZGRTaWxlbnRQcmludCIpfX1jbGFzcyBnIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJhZGRWaWV3ZXJQcmVmZXJlbmNlcyIpfX1jbGFzcyBwIGV4dGVuZHMgaS5PcHRpb24xMHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJhZGp1c3REYXRhIil9fWNsYXNzIG0gZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYWRvYmVFeHRlbnNpb25MZXZlbCIsMCwoZT0+ZT49MSYmZTw9OCkpfX1jbGFzcyBiIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYWdlbnQiLCEwKSx0aGlzLm5hbWU9ZS5uYW1lP2UubmFtZS50cmltKCk6IiIsdGhpcy5jb21tb249bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIHkgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYWx3YXlzRW1iZWQiKX19Y2xhc3MgdyBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImFtZCIpfX1jbGFzcyB2IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYXJlYSIpLHRoaXMubGV2ZWw9KDAscy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmxldmVsLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PmU+PTEmJmU8PTN9KSx0aGlzLm5hbWU9KDAscy5nZXRTdHJpbmdPcHRpb24pKGUubmFtZSxbIiIsImJhcmNvZGUiLCJjb3JlaW5pdCIsImRldmljZURyaXZlciIsImZvbnQiLCJnZW5lcmFsIiwibGF5b3V0IiwibWVyZ2UiLCJzY3JpcHQiLCJzaWduYXR1cmUiLCJzb3VyY2VTZXQiLCJ0ZW1wbGF0ZUNhY2hlIl0pfX1jbGFzcyB4IGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYXR0cmlidXRlcyIsWyJwcmVzZXJ2ZSIsImRlbGVnYXRlIiwiaWdub3JlIl0pfX1jbGFzcyBTIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYXV0b1NhdmUiLFsiZGlzYWJsZWQiLCJlbmFibGVkIl0pfX1jbGFzcyBBIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYmFzZSIpfX1jbGFzcyBrIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYmF0Y2hPdXRwdXQiKSx0aGlzLmZvcm1hdD0oMCxzLmdldFN0cmluZ09wdGlvbikoZS5mb3JtYXQsWyJub25lIiwiY29uY2F0IiwiemlwIiwiemlwQ29tcHJlc3MiXSl9fWNsYXNzIEMgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYmVoYXZpb3JPdmVycmlkZSIpfVthLiRmaW5hbGl6ZV0oKXt0aGlzW2EuJGNvbnRlbnRdPW5ldyBNYXAodGhpc1thLiRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcigoZT0+ZS5pbmNsdWRlcygiOiIpKSkubWFwKChlPT5lLnNwbGl0KCI6IiwyKSkpKX19Y2xhc3MgTyBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNhY2hlIiwhMCksdGhpcy50ZW1wbGF0ZUNhY2hlPW51bGx9fWNsYXNzIEYgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNoYW5nZSIpfX1jbGFzcyBJIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY29tbW9uIiwhMCksdGhpcy5kYXRhPW51bGwsdGhpcy5sb2NhbGU9bnVsbCx0aGlzLmxvY2FsZVNldD1udWxsLHRoaXMubWVzc2FnaW5nPW51bGwsdGhpcy5zdXBwcmVzc0Jhbm5lcj1udWxsLHRoaXMudGVtcGxhdGU9bnVsbCx0aGlzLnZhbGlkYXRpb25NZXNzYWdpbmc9bnVsbCx0aGlzLnZlcnNpb25Db250cm9sPW51bGwsdGhpcy5sb2c9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIFQgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJjb21wcmVzcyIpLHRoaXMuc2NvcGU9KDAscy5nZXRTdHJpbmdPcHRpb24pKGUuc2NvcGUsWyJpbWFnZU9ubHkiLCJkb2N1bWVudCJdKX19Y2xhc3MgTSBleHRlbmRzIGkuT3B0aW9uMDF7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlIil9fWNsYXNzIEUgZXh0ZW5kcyBpLk9wdGlvbjEwe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNvbXByZXNzT2JqZWN0U3RyZWFtIil9fWNsYXNzIFAgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJjb21wcmVzc2lvbiIsITApLHRoaXMuY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlPW51bGwsdGhpcy5jb21wcmVzc09iamVjdFN0cmVhbT1udWxsLHRoaXMubGV2ZWw9bnVsbCx0aGlzLnR5cGU9bnVsbH19Y2xhc3MgUiBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNvbmZpZyIsITApLHRoaXMuYWNyb2JhdD1udWxsLHRoaXMucHJlc2VudD1udWxsLHRoaXMudHJhY2U9bnVsbCx0aGlzLmFnZW50PW5ldyBpLlhGQU9iamVjdEFycmF5fX1jbGFzcyBOIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY29uZm9ybWFuY2UiLFsiQSIsIkIiXSl9fWNsYXNzIEQgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNvbnRlbnRDb3B5Iil9fWNsYXNzIEIgZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY29waWVzIiwxLChlPT5lPj0xKSl9fWNsYXNzIEwgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJjcmVhdG9yIil9fWNsYXNzIF8gZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY3VycmVudFBhZ2UiLDAsKGU9PmU+PTApKX19Y2xhc3MgaiBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImRhdGEiLCEwKSx0aGlzLmFkanVzdERhdGE9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9bnVsbCx0aGlzLmluY3JlbWVudGFsTG9hZD1udWxsLHRoaXMub3V0cHV0WFNMPW51bGwsdGhpcy5yYW5nZT1udWxsLHRoaXMucmVjb3JkPW51bGwsdGhpcy5zdGFydE5vZGU9bnVsbCx0aGlzLnVyaT1udWxsLHRoaXMud2luZG93PW51bGwsdGhpcy54c2w9bnVsbCx0aGlzLmV4Y2x1ZGVOUz1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLnRyYW5zZm9ybT1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgVSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImRlYnVnIiwhMCksdGhpcy51cmk9bnVsbH19Y2xhc3MgJCBleHRlbmRzIGkuQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkZWZhdWx0VHlwZWZhY2UiKSx0aGlzLndyaXRpbmdTY3JpcHQ9KDAscy5nZXRTdHJpbmdPcHRpb24pKGUud3JpdGluZ1NjcmlwdCxbIioiLCJBcmFiaWMiLCJDeXJpbGxpYyIsIkVhc3RFdXJvcGVhblJvbWFuIiwiR3JlZWsiLCJIZWJyZXciLCJKYXBhbmVzZSIsIktvcmVhbiIsIlJvbWFuIiwiU2ltcGxpZmllZENoaW5lc2UiLCJUaGFpIiwiVHJhZGl0aW9uYWxDaGluZXNlIiwiVmlldG5hbWVzZSJdKX19Y2xhc3MgWCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImRlc3RpbmF0aW9uIixbInBkZiIsInBjbCIsInBzIiwid2ViQ2xpZW50IiwienBsIl0pfX1jbGFzcyBIIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkb2N1bWVudEFzc2VtYmx5Iil9fWNsYXNzIHEgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkcml2ZXIiLCEwKSx0aGlzLm5hbWU9ZS5uYW1lP2UubmFtZS50cmltKCk6IiIsdGhpcy5mb250SW5mbz1udWxsLHRoaXMueGRjPW51bGx9fWNsYXNzIHogZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkdXBsZXhPcHRpb24iLFsic2ltcGxleCIsImR1cGxleEZsaXBMb25nRWRnZSIsImR1cGxleEZsaXBTaG9ydEVkZ2UiXSl9fWNsYXNzIEcgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkeW5hbWljUmVuZGVyIixbImZvcmJpZGRlbiIsInJlcXVpcmVkIl0pfX1jbGFzcyBXIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbWJlZCIpfX1jbGFzcyBWIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbmNyeXB0Iil9fWNsYXNzIEsgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbmNyeXB0aW9uIiwhMCksdGhpcy5lbmNyeXB0PW51bGwsdGhpcy5lbmNyeXB0aW9uTGV2ZWw9bnVsbCx0aGlzLnBlcm1pc3Npb25zPW51bGx9fWNsYXNzIFkgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbmNyeXB0aW9uTGV2ZWwiLFsiNDBiaXQiLCIxMjhiaXQiXSl9fWNsYXNzIEogZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbmZvcmNlIil9fWNsYXNzIFogZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlcXVhdGUiKSx0aGlzLmZvcmNlPSgwLHMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5mb3JjZSxkZWZhdWx0VmFsdWU6MSx2YWxpZGF0ZTplPT4wPT09ZX0pLHRoaXMuZnJvbT1lLmZyb218fCIiLHRoaXMudG89ZS50b3x8IiJ9fWNsYXNzIFEgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlcXVhdGVSYW5nZSIpLHRoaXMuZnJvbT1lLmZyb218fCIiLHRoaXMudG89ZS50b3x8IiIsdGhpcy5fdW5pY29kZVJhbmdlPWUudW5pY29kZVJhbmdlfHwiIn1nZXQgdW5pY29kZVJhbmdlKCl7Y29uc3QgZT1bXSx0PS9VXCsoWzAtOWEtZkEtRl0rKS8scj10aGlzLl91bmljb2RlUmFuZ2U7Zm9yKGxldCBuIG9mIHIuc3BsaXQoIiwiKS5tYXAoKGU9PmUudHJpbSgpKSkuZmlsdGVyKChlPT4hIWUpKSluPW4uc3BsaXQoIi0iLDIpLm1hcCgoZT0+e2NvbnN0IHI9ZS5tYXRjaCh0KTtyZXR1cm4gcj9wYXJzZUludChyWzFdLDE2KTowfSkpLDE9PT1uLmxlbmd0aCYmbi5wdXNoKG5bMF0pLGUucHVzaChuKTtyZXR1cm4oMCxvLnNoYWRvdykodGhpcywidW5pY29kZVJhbmdlIixlKX19Y2xhc3MgZWUgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZXhjbHVkZSIpfVthLiRmaW5hbGl6ZV0oKXt0aGlzW2EuJGNvbnRlbnRdPXRoaXNbYS4kY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoKGU9PmUmJlsiY2FsY3VsYXRlIiwiY2xvc2UiLCJlbnRlciIsImV4aXQiLCJpbml0aWFsaXplIiwicmVhZHkiLCJ2YWxpZGF0ZSJdLmluY2x1ZGVzKGUpKSl9fWNsYXNzIHRlIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZXhjbHVkZU5TIil9fWNsYXNzIHJlIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZmxpcExhYmVsIixbInVzZVByaW50ZXJTZXR0aW5nIiwib24iLCJvZmYiXSl9fWNsYXNzIG5lIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZm9udEluZm8iLCEwKSx0aGlzLmVtYmVkPW51bGwsdGhpcy5tYXA9bnVsbCx0aGlzLnN1YnNldEJlbG93PW51bGwsdGhpcy5hbHdheXNFbWJlZD1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLmRlZmF1bHRUeXBlZmFjZT1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLm5ldmVyRW1iZWQ9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIGFlIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJmb3JtRmllbGRGaWxsaW5nIil9fWNsYXNzIGllIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZ3JvdXBQYXJlbnQiKX19Y2xhc3Mgc2UgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJpZkVtcHR5IixbImRhdGFWYWx1ZSIsImRhdGFHcm91cCIsImlnbm9yZSIsInJlbW92ZSJdKX19Y2xhc3Mgb2UgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJpbmNsdWRlWERQQ29udGVudCIpfX1jbGFzcyBjZSBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImluY3JlbWVudGFsTG9hZCIsWyJub25lIiwiZm9yd2FyZE9ubHkiXSl9fWNsYXNzIGxlIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJpbmNyZW1lbnRhbE1lcmdlIil9fWNsYXNzIGhlIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJpbnRlcmFjdGl2ZSIpfX1jbGFzcyB1ZSBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImpvZyIsWyJ1c2VQcmludGVyU2V0dGluZyIsIm5vbmUiLCJwYWdlU2V0Il0pfX1jbGFzcyBkZSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImxhYmVsUHJpbnRlciIsITApLHRoaXMubmFtZT0oMCxzLmdldFN0cmluZ09wdGlvbikoZS5uYW1lLFsienBsIiwiZHBsIiwiaXBsIiwidGNwbCJdKSx0aGlzLmJhdGNoT3V0cHV0PW51bGwsdGhpcy5mbGlwTGFiZWw9bnVsbCx0aGlzLmZvbnRJbmZvPW51bGwsdGhpcy54ZGM9bnVsbH19Y2xhc3MgZmUgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJsYXlvdXQiLFsicGFnaW5hdGUiLCJwYW5lbCJdKX19Y2xhc3MgZ2UgZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibGV2ZWwiLDAsKGU9PmU+MCkpfX1jbGFzcyBwZSBleHRlbmRzIGkuT3B0aW9uMDF7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibGluZWFyaXplZCIpfX1jbGFzcyBtZSBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImxvY2FsZSIpfX1jbGFzcyBiZSBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImxvY2FsZVNldCIpfX1jbGFzcyB5ZSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImxvZyIsITApLHRoaXMubW9kZT1udWxsLHRoaXMudGhyZXNob2xkPW51bGwsdGhpcy50bz1udWxsLHRoaXMudXJpPW51bGx9fWNsYXNzIHdlIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibWFwIiwhMCksdGhpcy5lcXVhdGU9bmV3IGkuWEZBT2JqZWN0QXJyYXksdGhpcy5lcXVhdGVSYW5nZT1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgdmUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJtZWRpdW1JbmZvIiwhMCksdGhpcy5tYXA9bnVsbH19Y2xhc3MgeGUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJtZXNzYWdlIiwhMCksdGhpcy5tc2dJZD1udWxsLHRoaXMuc2V2ZXJpdHk9bnVsbH19Y2xhc3MgU2UgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJtZXNzYWdpbmciLCEwKSx0aGlzLm1lc3NhZ2U9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIEFlIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibW9kZSIsWyJhcHBlbmQiLCJvdmVyd3JpdGUiXSl9fWNsYXNzIGtlIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJtb2RpZnlBbm5vdHMiKX19Y2xhc3MgQ2UgZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibXNnSWQiLDEsKGU9PmU+PTEpKX19Y2xhc3MgT2UgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJuYW1lQXR0ciIpfX1jbGFzcyBGZSBleHRlbmRzIGkuQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJuZXZlckVtYmVkIil9fWNsYXNzIEllIGV4dGVuZHMgaS5JbnRlZ2VyT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIm51bWJlck9mQ29waWVzIixudWxsLChlPT5lPj0yJiZlPD01KSl9fWNsYXNzIFRlIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywib3BlbkFjdGlvbiIsITApLHRoaXMuZGVzdGluYXRpb249bnVsbH19Y2xhc3MgTWUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJvdXRwdXQiLCEwKSx0aGlzLnRvPW51bGwsdGhpcy50eXBlPW51bGwsdGhpcy51cmk9bnVsbH19Y2xhc3MgRWUgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJvdXRwdXRCaW4iKX19Y2xhc3MgUGUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJvdXRwdXRYU0wiLCEwKSx0aGlzLnVyaT1udWxsfX1jbGFzcyBSZSBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIm92ZXJwcmludCIsWyJub25lIiwiYm90aCIsImRyYXciLCJmaWVsZCJdKX19Y2xhc3MgTmUgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYWNrZXRzIil9W2EuJGZpbmFsaXplXSgpeyIqIiE9PXRoaXNbYS4kY29udGVudF0mJih0aGlzW2EuJGNvbnRlbnRdPXRoaXNbYS4kY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoKGU9PlsiY29uZmlnIiwiZGF0YXNldHMiLCJ0ZW1wbGF0ZSIsInhmZGYiLCJ4c2x0Il0uaW5jbHVkZXMoZSkpKSl9fWNsYXNzIERlIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicGFnZU9mZnNldCIpLHRoaXMueD0oMCxzLmdldEludGVnZXIpKHtkYXRhOmUueCxkZWZhdWx0VmFsdWU6InVzZVhEQ1NldHRpbmciLHZhbGlkYXRlOmU9PiEwfSksdGhpcy55PSgwLHMuZ2V0SW50ZWdlcikoe2RhdGE6ZS55LGRlZmF1bHRWYWx1ZToidXNlWERDU2V0dGluZyIsdmFsaWRhdGU6ZT0+ITB9KX19Y2xhc3MgQmUgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYWdlUmFuZ2UiKX1bYS4kZmluYWxpemVdKCl7Y29uc3QgZT10aGlzW2EuJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKChlPT5wYXJzZUludChlLDEwKSkpLHQ9W107Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cis9Mil0LnB1c2goZS5zbGljZShyLHIrMikpO3RoaXNbYS4kY29udGVudF09dH19Y2xhc3MgTGUgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYWdpbmF0aW9uIixbInNpbXBsZXgiLCJkdXBsZXhTaG9ydEVkZ2UiLCJkdXBsZXhMb25nRWRnZSJdKX19Y2xhc3MgX2UgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYWdpbmF0aW9uT3ZlcnJpZGUiLFsibm9uZSIsImZvcmNlRHVwbGV4IiwiZm9yY2VEdXBsZXhMb25nRWRnZSIsImZvcmNlRHVwbGV4U2hvcnRFZGdlIiwiZm9yY2VTaW1wbGV4Il0pfX1jbGFzcyBqZSBleHRlbmRzIGkuSW50ZWdlck9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYXJ0IiwxLChlPT4hMSkpfX1jbGFzcyBVZSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInBjbCIsITApLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMuYmF0Y2hPdXRwdXQ9bnVsbCx0aGlzLmZvbnRJbmZvPW51bGwsdGhpcy5qb2c9bnVsbCx0aGlzLm1lZGl1bUluZm89bnVsbCx0aGlzLm91dHB1dEJpbj1udWxsLHRoaXMucGFnZU9mZnNldD1udWxsLHRoaXMuc3RhcGxlPW51bGwsdGhpcy54ZGM9bnVsbH19Y2xhc3MgJGUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwZGYiLCEwKSx0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLmFkb2JlRXh0ZW5zaW9uTGV2ZWw9bnVsbCx0aGlzLmJhdGNoT3V0cHV0PW51bGwsdGhpcy5jb21wcmVzc2lvbj1udWxsLHRoaXMuY3JlYXRvcj1udWxsLHRoaXMuZW5jcnlwdGlvbj1udWxsLHRoaXMuZm9udEluZm89bnVsbCx0aGlzLmludGVyYWN0aXZlPW51bGwsdGhpcy5saW5lYXJpemVkPW51bGwsdGhpcy5vcGVuQWN0aW9uPW51bGwsdGhpcy5wZGZhPW51bGwsdGhpcy5wcm9kdWNlcj1udWxsLHRoaXMucmVuZGVyUG9saWN5PW51bGwsdGhpcy5zY3JpcHRNb2RlbD1udWxsLHRoaXMuc2lsZW50UHJpbnQ9bnVsbCx0aGlzLnN1Ym1pdEZvcm1hdD1udWxsLHRoaXMudGFnZ2VkPW51bGwsdGhpcy52ZXJzaW9uPW51bGwsdGhpcy52aWV3ZXJQcmVmZXJlbmNlcz1udWxsLHRoaXMueGRjPW51bGx9fWNsYXNzIFhlIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicGRmYSIsITApLHRoaXMuYW1kPW51bGwsdGhpcy5jb25mb3JtYW5jZT1udWxsLHRoaXMuaW5jbHVkZVhEUENvbnRlbnQ9bnVsbCx0aGlzLnBhcnQ9bnVsbH19Y2xhc3MgSGUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwZXJtaXNzaW9ucyIsITApLHRoaXMuYWNjZXNzaWJsZUNvbnRlbnQ9bnVsbCx0aGlzLmNoYW5nZT1udWxsLHRoaXMuY29udGVudENvcHk9bnVsbCx0aGlzLmRvY3VtZW50QXNzZW1ibHk9bnVsbCx0aGlzLmZvcm1GaWVsZEZpbGxpbmc9bnVsbCx0aGlzLm1vZGlmeUFubm90cz1udWxsLHRoaXMucGxhaW50ZXh0TWV0YWRhdGE9bnVsbCx0aGlzLnByaW50PW51bGwsdGhpcy5wcmludEhpZ2hRdWFsaXR5PW51bGx9fWNsYXNzIHFlIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwaWNrVHJheUJ5UERGU2l6ZSIpfX1jbGFzcyB6ZSBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInBpY3R1cmUiKX19Y2xhc3MgR2UgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInBsYWludGV4dE1ldGFkYXRhIil9fWNsYXNzIFdlIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicHJlc2VuY2UiLFsicHJlc2VydmUiLCJkaXNzb2x2ZSIsImRpc3NvbHZlU3RydWN0dXJlIiwiaWdub3JlIiwicmVtb3ZlIl0pfX1jbGFzcyBWZSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInByZXNlbnQiLCEwKSx0aGlzLmJlaGF2aW9yT3ZlcnJpZGU9bnVsbCx0aGlzLmNhY2hlPW51bGwsdGhpcy5jb21tb249bnVsbCx0aGlzLmNvcGllcz1udWxsLHRoaXMuZGVzdGluYXRpb249bnVsbCx0aGlzLmluY3JlbWVudGFsTWVyZ2U9bnVsbCx0aGlzLmxheW91dD1udWxsLHRoaXMub3V0cHV0PW51bGwsdGhpcy5vdmVycHJpbnQ9bnVsbCx0aGlzLnBhZ2luYXRpb249bnVsbCx0aGlzLnBhZ2luYXRpb25PdmVycmlkZT1udWxsLHRoaXMuc2NyaXB0PW51bGwsdGhpcy52YWxpZGF0ZT1udWxsLHRoaXMueGRwPW51bGwsdGhpcy5kcml2ZXI9bmV3IGkuWEZBT2JqZWN0QXJyYXksdGhpcy5sYWJlbFByaW50ZXI9bmV3IGkuWEZBT2JqZWN0QXJyYXksdGhpcy5wY2w9bmV3IGkuWEZBT2JqZWN0QXJyYXksdGhpcy5wZGY9bmV3IGkuWEZBT2JqZWN0QXJyYXksdGhpcy5wcz1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLnN1Ym1pdFVybD1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLndlYkNsaWVudD1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLnpwbD1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgS2UgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInByaW50Iil9fWNsYXNzIFllIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwcmludEhpZ2hRdWFsaXR5Iil9fWNsYXNzIEplIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicHJpbnRTY2FsaW5nIixbImFwcGRlZmF1bHQiLCJub1NjYWxpbmciXSl9fWNsYXNzIFplIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicHJpbnRlck5hbWUiKX19Y2xhc3MgUWUgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwcm9kdWNlciIpfX1jbGFzcyBldCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInBzIiwhMCksdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy5iYXRjaE91dHB1dD1udWxsLHRoaXMuZm9udEluZm89bnVsbCx0aGlzLmpvZz1udWxsLHRoaXMubWVkaXVtSW5mbz1udWxsLHRoaXMub3V0cHV0QmluPW51bGwsdGhpcy5zdGFwbGU9bnVsbCx0aGlzLnhkYz1udWxsfX1jbGFzcyB0dCBleHRlbmRzIGkuQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJyYW5nZSIpfVthLiRmaW5hbGl6ZV0oKXt0aGlzW2EuJGNvbnRlbnRdPXRoaXNbYS4kY29udGVudF0udHJpbSgpLnNwbGl0KC9ccyosXHMqLywyKS5tYXAoKGU9PmUuc3BsaXQoIi0iKS5tYXAoKGU9PnBhcnNlSW50KGUudHJpbSgpLDEwKSkpKSkuZmlsdGVyKChlPT5lLmV2ZXJ5KChlPT4haXNOYU4oZSkpKSkpLm1hcCgoZT0+KDE9PT1lLmxlbmd0aCYmZS5wdXNoKGVbMF0pLGUpKSl9fWNsYXNzIHJ0IGV4dGVuZHMgaS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInJlY29yZCIpfVthLiRmaW5hbGl6ZV0oKXt0aGlzW2EuJGNvbnRlbnRdPXRoaXNbYS4kY29udGVudF0udHJpbSgpO2NvbnN0IGU9cGFyc2VJbnQodGhpc1thLiRjb250ZW50XSwxMCk7IWlzTmFOKGUpJiZlPj0wJiYodGhpc1thLiRjb250ZW50XT1lKX19Y2xhc3MgbnQgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicmVsZXZhbnQiKX1bYS4kZmluYWxpemVdKCl7dGhpc1thLiRjb250ZW50XT10aGlzW2EuJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMrLyl9fWNsYXNzIGF0IGV4dGVuZHMgaS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInJlbmFtZSIpfVthLiRmaW5hbGl6ZV0oKXt0aGlzW2EuJGNvbnRlbnRdPXRoaXNbYS4kY29udGVudF0udHJpbSgpLCh0aGlzW2EuJGNvbnRlbnRdLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgieG1sIil8fG5ldyBSZWdFeHAoIltcXHB7TH1fXVtcXHB7TH1cXGQuX1xccHtNfS1dKiIsInUiKS50ZXN0KHRoaXNbYS4kY29udGVudF0pKSYmKDAsby53YXJuKSgiWEZBIC0gUmVuYW1lOiBpbnZhbGlkIFhGQSBuYW1lIil9fWNsYXNzIGl0IGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicmVuZGVyUG9saWN5IixbInNlcnZlciIsImNsaWVudCJdKX19Y2xhc3Mgc3QgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJydW5TY3JpcHRzIixbImJvdGgiLCJjbGllbnQiLCJub25lIiwic2VydmVyIl0pfX1jbGFzcyBvdCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInNjcmlwdCIsITApLHRoaXMuY3VycmVudFBhZ2U9bnVsbCx0aGlzLmV4Y2x1ZGU9bnVsbCx0aGlzLnJ1blNjcmlwdHM9bnVsbH19Y2xhc3MgY3QgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJzY3JpcHRNb2RlbCIsWyJYRkEiLCJub25lIl0pfX1jbGFzcyBsdCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInNldmVyaXR5IixbImlnbm9yZSIsImVycm9yIiwiaW5mb3JtYXRpb24iLCJ0cmFjZSIsIndhcm5pbmciXSl9fWNsYXNzIGh0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywic2lsZW50UHJpbnQiLCEwKSx0aGlzLmFkZFNpbGVudFByaW50PW51bGwsdGhpcy5wcmludGVyTmFtZT1udWxsfX1jbGFzcyB1dCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInN0YXBsZSIpLHRoaXMubW9kZT0oMCxzLmdldFN0cmluZ09wdGlvbikoZS5tb2RlLFsidXNlUHJpbnRlclNldHRpbmciLCJvbiIsIm9mZiJdKX19Y2xhc3MgZHQgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJzdGFydE5vZGUiKX19Y2xhc3MgZnQgZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywic3RhcnRQYWdlIiwwLChlPT4hMCkpfX1jbGFzcyBndCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInN1Ym1pdEZvcm1hdCIsWyJodG1sIiwiZGVsZWdhdGUiLCJmZGYiLCJ4bWwiLCJwZGYiXSl9fWNsYXNzIHB0IGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywic3VibWl0VXJsIil9fWNsYXNzIG10IGV4dGVuZHMgaS5JbnRlZ2VyT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInN1YnNldEJlbG93IiwxMDAsKGU9PmU+PTAmJmU8PTEwMCkpfX1jbGFzcyBidCBleHRlbmRzIGkuT3B0aW9uMDF7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywic3VwcHJlc3NCYW5uZXIiKX19Y2xhc3MgeXQgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInRhZ2dlZCIpfX1jbGFzcyB3dCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInRlbXBsYXRlIiwhMCksdGhpcy5iYXNlPW51bGwsdGhpcy5yZWxldmFudD1udWxsLHRoaXMuc3RhcnRQYWdlPW51bGwsdGhpcy51cmk9bnVsbCx0aGlzLnhzbD1udWxsfX1jbGFzcyB2dCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInRocmVzaG9sZCIsWyJ0cmFjZSIsImVycm9yIiwiaW5mb3JtYXRpb24iLCJ3YXJuaW5nIl0pfX1jbGFzcyB4dCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInRvIixbIm51bGwiLCJtZW1vcnkiLCJzdGRlcnIiLCJzdGRvdXQiLCJzeXN0ZW0iLCJ1cmkiXSl9fWNsYXNzIFN0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywidGVtcGxhdGVDYWNoZSIpLHRoaXMubWF4RW50cmllcz0oMCxzLmdldEludGVnZXIpKHtkYXRhOmUubWF4RW50cmllcyxkZWZhdWx0VmFsdWU6NSx2YWxpZGF0ZTplPT5lPj0wfSl9fWNsYXNzIEF0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywidHJhY2UiLCEwKSx0aGlzLmFyZWE9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIGt0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywidHJhbnNmb3JtIiwhMCksdGhpcy5ncm91cFBhcmVudD1udWxsLHRoaXMuaWZFbXB0eT1udWxsLHRoaXMubmFtZUF0dHI9bnVsbCx0aGlzLnBpY3R1cmU9bnVsbCx0aGlzLnByZXNlbmNlPW51bGwsdGhpcy5yZW5hbWU9bnVsbCx0aGlzLndoaXRlc3BhY2U9bnVsbH19Y2xhc3MgQ3QgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJ0eXBlIixbIm5vbmUiLCJhc2NpaTg1IiwiYXNjaWlIZXgiLCJjY2l0dGZheCIsImZsYXRlIiwibHp3IiwicnVuTGVuZ3RoIiwibmF0aXZlIiwieGRwIiwibWVyZ2VkWERQIl0pfX1jbGFzcyBPdCBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInVyaSIpfX1jbGFzcyBGdCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInZhbGlkYXRlIixbInByZVN1Ym1pdCIsInByZVByaW50IiwicHJlRXhlY3V0ZSIsInByZVNhdmUiXSl9fWNsYXNzIEl0IGV4dGVuZHMgaS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzIil9W2EuJGZpbmFsaXplXSgpe3RoaXNbYS4kY29udGVudF09dGhpc1thLiRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcigoZT0+WyJkb2NSZWFkeSIsInBvc3RTaWduIl0uaW5jbHVkZXMoZSkpKX19Y2xhc3MgVHQgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJ2YWxpZGF0aW9uTWVzc2FnaW5nIixbImFsbE1lc3NhZ2VzSW5kaXZpZHVhbGx5IiwiYWxsTWVzc2FnZXNUb2dldGhlciIsImZpcnN0TWVzc2FnZU9ubHkiLCJub01lc3NhZ2VzIl0pfX1jbGFzcyBNdCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInZlcnNpb24iLFsiMS43IiwiMS42IiwiMS41IiwiMS40IiwiMS4zIiwiMS4yIl0pfX1jbGFzcyBFdCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIlZlcnNpb25Db250cm9sIiksdGhpcy5vdXRwdXRCZWxvdz0oMCxzLmdldFN0cmluZ09wdGlvbikoZS5vdXRwdXRCZWxvdyxbIndhcm4iLCJlcnJvciIsInVwZGF0ZSJdKSx0aGlzLnNvdXJjZUFib3ZlPSgwLHMuZ2V0U3RyaW5nT3B0aW9uKShlLnNvdXJjZUFib3ZlLFsid2FybiIsImVycm9yIl0pLHRoaXMuc291cmNlQmVsb3c9KDAscy5nZXRTdHJpbmdPcHRpb24pKGUuc291cmNlQmVsb3csWyJ1cGRhdGUiLCJtYWludGFpbiJdKX19Y2xhc3MgUHQgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJ2aWV3ZXJQcmVmZXJlbmNlcyIsITApLHRoaXMuQURCRV9KU0NvbnNvbGU9bnVsbCx0aGlzLkFEQkVfSlNEZWJ1Z2dlcj1udWxsLHRoaXMuYWRkVmlld2VyUHJlZmVyZW5jZXM9bnVsbCx0aGlzLmR1cGxleE9wdGlvbj1udWxsLHRoaXMuZW5mb3JjZT1udWxsLHRoaXMubnVtYmVyT2ZDb3BpZXM9bnVsbCx0aGlzLnBhZ2VSYW5nZT1udWxsLHRoaXMucGlja1RyYXlCeVBERlNpemU9bnVsbCx0aGlzLnByaW50U2NhbGluZz1udWxsfX1jbGFzcyBSdCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIndlYkNsaWVudCIsITApLHRoaXMubmFtZT1lLm5hbWU/ZS5uYW1lLnRyaW0oKToiIix0aGlzLmZvbnRJbmZvPW51bGwsdGhpcy54ZGM9bnVsbH19Y2xhc3MgTnQgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJ3aGl0ZXNwYWNlIixbInByZXNlcnZlIiwibHRyaW0iLCJub3JtYWxpemUiLCJydHJpbSIsInRyaW0iXSl9fWNsYXNzIER0IGV4dGVuZHMgaS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIndpbmRvdyIpfVthLiRmaW5hbGl6ZV0oKXtjb25zdCBlPXRoaXNbYS4kY29udGVudF0udHJpbSgpLnNwbGl0KC9ccyosXHMqLywyKS5tYXAoKGU9PnBhcnNlSW50KGUsMTApKSk7ZS5zb21lKChlPT5pc05hTihlKSkpP3RoaXNbYS4kY29udGVudF09WzAsMF06KDE9PT1lLmxlbmd0aCYmZS5wdXNoKGVbMF0pLHRoaXNbYS4kY29udGVudF09ZSl9fWNsYXNzIEJ0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywieGRjIiwhMCksdGhpcy51cmk9bmV3IGkuWEZBT2JqZWN0QXJyYXksdGhpcy54c2w9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIEx0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywieGRwIiwhMCksdGhpcy5wYWNrZXRzPW51bGx9fWNsYXNzIF90IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywieHNsIiwhMCksdGhpcy5kZWJ1Zz1udWxsLHRoaXMudXJpPW51bGx9fWNsYXNzIGp0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywienBsIiwhMCksdGhpcy5uYW1lPWUubmFtZT9lLm5hbWUudHJpbSgpOiIiLHRoaXMuYmF0Y2hPdXRwdXQ9bnVsbCx0aGlzLmZsaXBMYWJlbD1udWxsLHRoaXMuZm9udEluZm89bnVsbCx0aGlzLnhkYz1udWxsfX1jbGFzcyBVdHtzdGF0aWNbbi4kYnVpbGRYRkFPYmplY3RdKGUsdCl7aWYoVXQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIFV0W2VdKHQpfXN0YXRpYyBhY3JvYmF0KGUpe3JldHVybiBuZXcgbChlKX1zdGF0aWMgYWNyb2JhdDcoZSl7cmV0dXJuIG5ldyBoKGUpfXN0YXRpYyBBREJFX0pTQ29uc29sZShlKXtyZXR1cm4gbmV3IHUoZSl9c3RhdGljIEFEQkVfSlNEZWJ1Z2dlcihlKXtyZXR1cm4gbmV3IGQoZSl9c3RhdGljIGFkZFNpbGVudFByaW50KGUpe3JldHVybiBuZXcgZihlKX1zdGF0aWMgYWRkVmlld2VyUHJlZmVyZW5jZXMoZSl7cmV0dXJuIG5ldyBnKGUpfXN0YXRpYyBhZGp1c3REYXRhKGUpe3JldHVybiBuZXcgcChlKX1zdGF0aWMgYWRvYmVFeHRlbnNpb25MZXZlbChlKXtyZXR1cm4gbmV3IG0oZSl9c3RhdGljIGFnZW50KGUpe3JldHVybiBuZXcgYihlKX1zdGF0aWMgYWx3YXlzRW1iZWQoZSl7cmV0dXJuIG5ldyB5KGUpfXN0YXRpYyBhbWQoZSl7cmV0dXJuIG5ldyB3KGUpfXN0YXRpYyBhcmVhKGUpe3JldHVybiBuZXcgdihlKX1zdGF0aWMgYXR0cmlidXRlcyhlKXtyZXR1cm4gbmV3IHgoZSl9c3RhdGljIGF1dG9TYXZlKGUpe3JldHVybiBuZXcgUyhlKX1zdGF0aWMgYmFzZShlKXtyZXR1cm4gbmV3IEEoZSl9c3RhdGljIGJhdGNoT3V0cHV0KGUpe3JldHVybiBuZXcgayhlKX1zdGF0aWMgYmVoYXZpb3JPdmVycmlkZShlKXtyZXR1cm4gbmV3IEMoZSl9c3RhdGljIGNhY2hlKGUpe3JldHVybiBuZXcgTyhlKX1zdGF0aWMgY2hhbmdlKGUpe3JldHVybiBuZXcgRihlKX1zdGF0aWMgY29tbW9uKGUpe3JldHVybiBuZXcgSShlKX1zdGF0aWMgY29tcHJlc3MoZSl7cmV0dXJuIG5ldyBUKGUpfXN0YXRpYyBjb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUoZSl7cmV0dXJuIG5ldyBNKGUpfXN0YXRpYyBjb21wcmVzc09iamVjdFN0cmVhbShlKXtyZXR1cm4gbmV3IEUoZSl9c3RhdGljIGNvbXByZXNzaW9uKGUpe3JldHVybiBuZXcgUChlKX1zdGF0aWMgY29uZmlnKGUpe3JldHVybiBuZXcgUihlKX1zdGF0aWMgY29uZm9ybWFuY2UoZSl7cmV0dXJuIG5ldyBOKGUpfXN0YXRpYyBjb250ZW50Q29weShlKXtyZXR1cm4gbmV3IEQoZSl9c3RhdGljIGNvcGllcyhlKXtyZXR1cm4gbmV3IEIoZSl9c3RhdGljIGNyZWF0b3IoZSl7cmV0dXJuIG5ldyBMKGUpfXN0YXRpYyBjdXJyZW50UGFnZShlKXtyZXR1cm4gbmV3IF8oZSl9c3RhdGljIGRhdGEoZSl7cmV0dXJuIG5ldyBqKGUpfXN0YXRpYyBkZWJ1ZyhlKXtyZXR1cm4gbmV3IFUoZSl9c3RhdGljIGRlZmF1bHRUeXBlZmFjZShlKXtyZXR1cm4gbmV3ICQoZSl9c3RhdGljIGRlc3RpbmF0aW9uKGUpe3JldHVybiBuZXcgWChlKX1zdGF0aWMgZG9jdW1lbnRBc3NlbWJseShlKXtyZXR1cm4gbmV3IEgoZSl9c3RhdGljIGRyaXZlcihlKXtyZXR1cm4gbmV3IHEoZSl9c3RhdGljIGR1cGxleE9wdGlvbihlKXtyZXR1cm4gbmV3IHooZSl9c3RhdGljIGR5bmFtaWNSZW5kZXIoZSl7cmV0dXJuIG5ldyBHKGUpfXN0YXRpYyBlbWJlZChlKXtyZXR1cm4gbmV3IFcoZSl9c3RhdGljIGVuY3J5cHQoZSl7cmV0dXJuIG5ldyBWKGUpfXN0YXRpYyBlbmNyeXB0aW9uKGUpe3JldHVybiBuZXcgSyhlKX1zdGF0aWMgZW5jcnlwdGlvbkxldmVsKGUpe3JldHVybiBuZXcgWShlKX1zdGF0aWMgZW5mb3JjZShlKXtyZXR1cm4gbmV3IEooZSl9c3RhdGljIGVxdWF0ZShlKXtyZXR1cm4gbmV3IFooZSl9c3RhdGljIGVxdWF0ZVJhbmdlKGUpe3JldHVybiBuZXcgUShlKX1zdGF0aWMgZXhjbHVkZShlKXtyZXR1cm4gbmV3IGVlKGUpfXN0YXRpYyBleGNsdWRlTlMoZSl7cmV0dXJuIG5ldyB0ZShlKX1zdGF0aWMgZmxpcExhYmVsKGUpe3JldHVybiBuZXcgcmUoZSl9c3RhdGljIGZvbnRJbmZvKGUpe3JldHVybiBuZXcgbmUoZSl9c3RhdGljIGZvcm1GaWVsZEZpbGxpbmcoZSl7cmV0dXJuIG5ldyBhZShlKX1zdGF0aWMgZ3JvdXBQYXJlbnQoZSl7cmV0dXJuIG5ldyBpZShlKX1zdGF0aWMgaWZFbXB0eShlKXtyZXR1cm4gbmV3IHNlKGUpfXN0YXRpYyBpbmNsdWRlWERQQ29udGVudChlKXtyZXR1cm4gbmV3IG9lKGUpfXN0YXRpYyBpbmNyZW1lbnRhbExvYWQoZSl7cmV0dXJuIG5ldyBjZShlKX1zdGF0aWMgaW5jcmVtZW50YWxNZXJnZShlKXtyZXR1cm4gbmV3IGxlKGUpfXN0YXRpYyBpbnRlcmFjdGl2ZShlKXtyZXR1cm4gbmV3IGhlKGUpfXN0YXRpYyBqb2coZSl7cmV0dXJuIG5ldyB1ZShlKX1zdGF0aWMgbGFiZWxQcmludGVyKGUpe3JldHVybiBuZXcgZGUoZSl9c3RhdGljIGxheW91dChlKXtyZXR1cm4gbmV3IGZlKGUpfXN0YXRpYyBsZXZlbChlKXtyZXR1cm4gbmV3IGdlKGUpfXN0YXRpYyBsaW5lYXJpemVkKGUpe3JldHVybiBuZXcgcGUoZSl9c3RhdGljIGxvY2FsZShlKXtyZXR1cm4gbmV3IG1lKGUpfXN0YXRpYyBsb2NhbGVTZXQoZSl7cmV0dXJuIG5ldyBiZShlKX1zdGF0aWMgbG9nKGUpe3JldHVybiBuZXcgeWUoZSl9c3RhdGljIG1hcChlKXtyZXR1cm4gbmV3IHdlKGUpfXN0YXRpYyBtZWRpdW1JbmZvKGUpe3JldHVybiBuZXcgdmUoZSl9c3RhdGljIG1lc3NhZ2UoZSl7cmV0dXJuIG5ldyB4ZShlKX1zdGF0aWMgbWVzc2FnaW5nKGUpe3JldHVybiBuZXcgU2UoZSl9c3RhdGljIG1vZGUoZSl7cmV0dXJuIG5ldyBBZShlKX1zdGF0aWMgbW9kaWZ5QW5ub3RzKGUpe3JldHVybiBuZXcga2UoZSl9c3RhdGljIG1zZ0lkKGUpe3JldHVybiBuZXcgQ2UoZSl9c3RhdGljIG5hbWVBdHRyKGUpe3JldHVybiBuZXcgT2UoZSl9c3RhdGljIG5ldmVyRW1iZWQoZSl7cmV0dXJuIG5ldyBGZShlKX1zdGF0aWMgbnVtYmVyT2ZDb3BpZXMoZSl7cmV0dXJuIG5ldyBJZShlKX1zdGF0aWMgb3BlbkFjdGlvbihlKXtyZXR1cm4gbmV3IFRlKGUpfXN0YXRpYyBvdXRwdXQoZSl7cmV0dXJuIG5ldyBNZShlKX1zdGF0aWMgb3V0cHV0QmluKGUpe3JldHVybiBuZXcgRWUoZSl9c3RhdGljIG91dHB1dFhTTChlKXtyZXR1cm4gbmV3IFBlKGUpfXN0YXRpYyBvdmVycHJpbnQoZSl7cmV0dXJuIG5ldyBSZShlKX1zdGF0aWMgcGFja2V0cyhlKXtyZXR1cm4gbmV3IE5lKGUpfXN0YXRpYyBwYWdlT2Zmc2V0KGUpe3JldHVybiBuZXcgRGUoZSl9c3RhdGljIHBhZ2VSYW5nZShlKXtyZXR1cm4gbmV3IEJlKGUpfXN0YXRpYyBwYWdpbmF0aW9uKGUpe3JldHVybiBuZXcgTGUoZSl9c3RhdGljIHBhZ2luYXRpb25PdmVycmlkZShlKXtyZXR1cm4gbmV3IF9lKGUpfXN0YXRpYyBwYXJ0KGUpe3JldHVybiBuZXcgamUoZSl9c3RhdGljIHBjbChlKXtyZXR1cm4gbmV3IFVlKGUpfXN0YXRpYyBwZGYoZSl7cmV0dXJuIG5ldyAkZShlKX1zdGF0aWMgcGRmYShlKXtyZXR1cm4gbmV3IFhlKGUpfXN0YXRpYyBwZXJtaXNzaW9ucyhlKXtyZXR1cm4gbmV3IEhlKGUpfXN0YXRpYyBwaWNrVHJheUJ5UERGU2l6ZShlKXtyZXR1cm4gbmV3IHFlKGUpfXN0YXRpYyBwaWN0dXJlKGUpe3JldHVybiBuZXcgemUoZSl9c3RhdGljIHBsYWludGV4dE1ldGFkYXRhKGUpe3JldHVybiBuZXcgR2UoZSl9c3RhdGljIHByZXNlbmNlKGUpe3JldHVybiBuZXcgV2UoZSl9c3RhdGljIHByZXNlbnQoZSl7cmV0dXJuIG5ldyBWZShlKX1zdGF0aWMgcHJpbnQoZSl7cmV0dXJuIG5ldyBLZShlKX1zdGF0aWMgcHJpbnRIaWdoUXVhbGl0eShlKXtyZXR1cm4gbmV3IFllKGUpfXN0YXRpYyBwcmludFNjYWxpbmcoZSl7cmV0dXJuIG5ldyBKZShlKX1zdGF0aWMgcHJpbnRlck5hbWUoZSl7cmV0dXJuIG5ldyBaZShlKX1zdGF0aWMgcHJvZHVjZXIoZSl7cmV0dXJuIG5ldyBRZShlKX1zdGF0aWMgcHMoZSl7cmV0dXJuIG5ldyBldChlKX1zdGF0aWMgcmFuZ2UoZSl7cmV0dXJuIG5ldyB0dChlKX1zdGF0aWMgcmVjb3JkKGUpe3JldHVybiBuZXcgcnQoZSl9c3RhdGljIHJlbGV2YW50KGUpe3JldHVybiBuZXcgbnQoZSl9c3RhdGljIHJlbmFtZShlKXtyZXR1cm4gbmV3IGF0KGUpfXN0YXRpYyByZW5kZXJQb2xpY3koZSl7cmV0dXJuIG5ldyBpdChlKX1zdGF0aWMgcnVuU2NyaXB0cyhlKXtyZXR1cm4gbmV3IHN0KGUpfXN0YXRpYyBzY3JpcHQoZSl7cmV0dXJuIG5ldyBvdChlKX1zdGF0aWMgc2NyaXB0TW9kZWwoZSl7cmV0dXJuIG5ldyBjdChlKX1zdGF0aWMgc2V2ZXJpdHkoZSl7cmV0dXJuIG5ldyBsdChlKX1zdGF0aWMgc2lsZW50UHJpbnQoZSl7cmV0dXJuIG5ldyBodChlKX1zdGF0aWMgc3RhcGxlKGUpe3JldHVybiBuZXcgdXQoZSl9c3RhdGljIHN0YXJ0Tm9kZShlKXtyZXR1cm4gbmV3IGR0KGUpfXN0YXRpYyBzdGFydFBhZ2UoZSl7cmV0dXJuIG5ldyBmdChlKX1zdGF0aWMgc3VibWl0Rm9ybWF0KGUpe3JldHVybiBuZXcgZ3QoZSl9c3RhdGljIHN1Ym1pdFVybChlKXtyZXR1cm4gbmV3IHB0KGUpfXN0YXRpYyBzdWJzZXRCZWxvdyhlKXtyZXR1cm4gbmV3IG10KGUpfXN0YXRpYyBzdXBwcmVzc0Jhbm5lcihlKXtyZXR1cm4gbmV3IGJ0KGUpfXN0YXRpYyB0YWdnZWQoZSl7cmV0dXJuIG5ldyB5dChlKX1zdGF0aWMgdGVtcGxhdGUoZSl7cmV0dXJuIG5ldyB3dChlKX1zdGF0aWMgdGVtcGxhdGVDYWNoZShlKXtyZXR1cm4gbmV3IFN0KGUpfXN0YXRpYyB0aHJlc2hvbGQoZSl7cmV0dXJuIG5ldyB2dChlKX1zdGF0aWMgdG8oZSl7cmV0dXJuIG5ldyB4dChlKX1zdGF0aWMgdHJhY2UoZSl7cmV0dXJuIG5ldyBBdChlKX1zdGF0aWMgdHJhbnNmb3JtKGUpe3JldHVybiBuZXcga3QoZSl9c3RhdGljIHR5cGUoZSl7cmV0dXJuIG5ldyBDdChlKX1zdGF0aWMgdXJpKGUpe3JldHVybiBuZXcgT3QoZSl9c3RhdGljIHZhbGlkYXRlKGUpe3JldHVybiBuZXcgRnQoZSl9c3RhdGljIHZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzKGUpe3JldHVybiBuZXcgSXQoZSl9c3RhdGljIHZhbGlkYXRpb25NZXNzYWdpbmcoZSl7cmV0dXJuIG5ldyBUdChlKX1zdGF0aWMgdmVyc2lvbihlKXtyZXR1cm4gbmV3IE10KGUpfXN0YXRpYyB2ZXJzaW9uQ29udHJvbChlKXtyZXR1cm4gbmV3IEV0KGUpfXN0YXRpYyB2aWV3ZXJQcmVmZXJlbmNlcyhlKXtyZXR1cm4gbmV3IFB0KGUpfXN0YXRpYyB3ZWJDbGllbnQoZSl7cmV0dXJuIG5ldyBSdChlKX1zdGF0aWMgd2hpdGVzcGFjZShlKXtyZXR1cm4gbmV3IE50KGUpfXN0YXRpYyB3aW5kb3coZSl7cmV0dXJuIG5ldyBEdChlKX1zdGF0aWMgeGRjKGUpe3JldHVybiBuZXcgQnQoZSl9c3RhdGljIHhkcChlKXtyZXR1cm4gbmV3IEx0KGUpfXN0YXRpYyB4c2woZSl7cmV0dXJuIG5ldyBfdChlKX1zdGF0aWMgenBsKGUpe3JldHVybiBuZXcganQoZSl9fXQuQ29uZmlnTmFtZXNwYWNlPVV0fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ29ubmVjdGlvblNldE5hbWVzcGFjZT12b2lkIDA7dmFyIG49cigyMzQpLGE9cigyNDApO2NvbnN0IGk9bi5OYW1lc3BhY2VJZHMuY29ubmVjdGlvblNldC5pZDtjbGFzcyBzIGV4dGVuZHMgYS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoaSwiY29ubmVjdGlvblNldCIsITApLHRoaXMud3NkbENvbm5lY3Rpb249bmV3IGEuWEZBT2JqZWN0QXJyYXksdGhpcy54bWxDb25uZWN0aW9uPW5ldyBhLlhGQU9iamVjdEFycmF5LHRoaXMueHNkQ29ubmVjdGlvbj1uZXcgYS5YRkFPYmplY3RBcnJheX19Y2xhc3MgbyBleHRlbmRzIGEuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksImVmZmVjdGl2ZUlucHV0UG9saWN5IiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIGMgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJlZmZlY3RpdmVPdXRwdXRQb2xpY3kiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgbCBleHRlbmRzIGEuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksIm9wZXJhdGlvbiIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5pbnB1dD1lLmlucHV0fHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLm91dHB1dD1lLm91dHB1dHx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBoIGV4dGVuZHMgYS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoaSwicm9vdEVsZW1lbnQiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgdSBleHRlbmRzIGEuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksInNvYXBBY3Rpb24iKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgZCBleHRlbmRzIGEuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksInNvYXBBZGRyZXNzIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIGYgZXh0ZW5kcyBhLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJ1cmkiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgZyBleHRlbmRzIGEuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksIndzZGxBZGRyZXNzIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIHAgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJ3c2RsQ29ubmVjdGlvbiIsITApLHRoaXMuZGF0YURlc2NyaXB0aW9uPWUuZGF0YURlc2NyaXB0aW9ufHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLmVmZmVjdGl2ZUlucHV0UG9saWN5PW51bGwsdGhpcy5lZmZlY3RpdmVPdXRwdXRQb2xpY3k9bnVsbCx0aGlzLm9wZXJhdGlvbj1udWxsLHRoaXMuc29hcEFjdGlvbj1udWxsLHRoaXMuc29hcEFkZHJlc3M9bnVsbCx0aGlzLndzZGxBZGRyZXNzPW51bGx9fWNsYXNzIG0gZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJ4bWxDb25uZWN0aW9uIiwhMCksdGhpcy5kYXRhRGVzY3JpcHRpb249ZS5kYXRhRGVzY3JpcHRpb258fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXJpPW51bGx9fWNsYXNzIGIgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJ4c2RDb25uZWN0aW9uIiwhMCksdGhpcy5kYXRhRGVzY3JpcHRpb249ZS5kYXRhRGVzY3JpcHRpb258fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMucm9vdEVsZW1lbnQ9bnVsbCx0aGlzLnVyaT1udWxsfX1jbGFzcyB5e3N0YXRpY1tuLiRidWlsZFhGQU9iamVjdF0oZSx0KXtpZih5Lmhhc093blByb3BlcnR5KGUpKXJldHVybiB5W2VdKHQpfXN0YXRpYyBjb25uZWN0aW9uU2V0KGUpe3JldHVybiBuZXcgcyhlKX1zdGF0aWMgZWZmZWN0aXZlSW5wdXRQb2xpY3koZSl7cmV0dXJuIG5ldyBvKGUpfXN0YXRpYyBlZmZlY3RpdmVPdXRwdXRQb2xpY3koZSl7cmV0dXJuIG5ldyBjKGUpfXN0YXRpYyBvcGVyYXRpb24oZSl7cmV0dXJuIG5ldyBsKGUpfXN0YXRpYyByb290RWxlbWVudChlKXtyZXR1cm4gbmV3IGgoZSl9c3RhdGljIHNvYXBBY3Rpb24oZSl7cmV0dXJuIG5ldyB1KGUpfXN0YXRpYyBzb2FwQWRkcmVzcyhlKXtyZXR1cm4gbmV3IGQoZSl9c3RhdGljIHVyaShlKXtyZXR1cm4gbmV3IGYoZSl9c3RhdGljIHdzZGxBZGRyZXNzKGUpe3JldHVybiBuZXcgZyhlKX1zdGF0aWMgd3NkbENvbm5lY3Rpb24oZSl7cmV0dXJuIG5ldyBwKGUpfXN0YXRpYyB4bWxDb25uZWN0aW9uKGUpe3JldHVybiBuZXcgbShlKX1zdGF0aWMgeHNkQ29ubmVjdGlvbihlKXtyZXR1cm4gbmV3IGIoZSl9fXQuQ29ubmVjdGlvblNldE5hbWVzcGFjZT15fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRGF0YXNldHNOYW1lc3BhY2U9dm9pZCAwO3ZhciBuPXIoMjI4KSxhPXIoMjM0KSxpPXIoMjQwKTtjb25zdCBzPWEuTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkO2NsYXNzIG8gZXh0ZW5kcyBpLlhtbE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJkYXRhIixlKX1bbi4kaXNOc0Fnbm9zdGljXSgpe3JldHVybiEwfX1jbGFzcyBjIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZGF0YXNldHMiLCEwKSx0aGlzLmRhdGE9bnVsbCx0aGlzLlNpZ25hdHVyZT1udWxsfVtuLiRvbkNoaWxkXShlKXtjb25zdCB0PWVbbi4kbm9kZU5hbWVdOygiZGF0YSI9PT10JiZlW24uJG5hbWVzcGFjZUlkXT09PXN8fCJTaWduYXR1cmUiPT09dCYmZVtuLiRuYW1lc3BhY2VJZF09PT1hLk5hbWVzcGFjZUlkcy5zaWduYXR1cmUuaWQpJiYodGhpc1t0XT1lKSx0aGlzW24uJGFwcGVuZENoaWxkXShlKX19Y2xhc3MgbHtzdGF0aWNbYS4kYnVpbGRYRkFPYmplY3RdKGUsdCl7aWYobC5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gbFtlXSh0KX1zdGF0aWMgZGF0YXNldHMoZSl7cmV0dXJuIG5ldyBjKGUpfXN0YXRpYyBkYXRhKGUpe3JldHVybiBuZXcgbyhlKX19dC5EYXRhc2V0c05hbWVzcGFjZT1sfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuTG9jYWxlU2V0TmFtZXNwYWNlPXZvaWQgMDt2YXIgbj1yKDIzNCksYT1yKDI0MCksaT1yKDIzNyk7Y29uc3Qgcz1uLk5hbWVzcGFjZUlkcy5sb2NhbGVTZXQuaWQ7Y2xhc3MgbyBleHRlbmRzIGEuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsImNhbGVuZGFyU3ltYm9scyIsITApLHRoaXMubmFtZT0iZ3JlZ29yaWFuIix0aGlzLmRheU5hbWVzPW5ldyBhLlhGQU9iamVjdEFycmF5KDIpLHRoaXMuZXJhTmFtZXM9bnVsbCx0aGlzLm1lcmlkaWVtTmFtZXM9bnVsbCx0aGlzLm1vbnRoTmFtZXM9bmV3IGEuWEZBT2JqZWN0QXJyYXkoMil9fWNsYXNzIGMgZXh0ZW5kcyBhLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJjdXJyZW5jeVN5bWJvbCIpLHRoaXMubmFtZT0oMCxpLmdldFN0cmluZ09wdGlvbikoZS5uYW1lLFsic3ltYm9sIiwiaXNvbmFtZSIsImRlY2ltYWwiXSl9fWNsYXNzIGwgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJjdXJyZW5jeVN5bWJvbHMiLCEwKSx0aGlzLmN1cnJlbmN5U3ltYm9sPW5ldyBhLlhGQU9iamVjdEFycmF5KDMpfX1jbGFzcyBoIGV4dGVuZHMgYS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZGF0ZVBhdHRlcm4iKSx0aGlzLm5hbWU9KDAsaS5nZXRTdHJpbmdPcHRpb24pKGUubmFtZSxbImZ1bGwiLCJsb25nIiwibWVkIiwic2hvcnQiXSl9fWNsYXNzIHUgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJkYXRlUGF0dGVybnMiLCEwKSx0aGlzLmRhdGVQYXR0ZXJuPW5ldyBhLlhGQU9iamVjdEFycmF5KDQpfX1jbGFzcyBkIGV4dGVuZHMgYS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsImRhdGVUaW1lU3ltYm9scyIpfX1jbGFzcyBmIGV4dGVuZHMgYS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZGF5Iil9fWNsYXNzIGcgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJkYXlOYW1lcyIsITApLHRoaXMuYWJicj0oMCxpLmdldEludGVnZXIpKHtkYXRhOmUuYWJicixkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4xPT09ZX0pLHRoaXMuZGF5PW5ldyBhLlhGQU9iamVjdEFycmF5KDcpfX1jbGFzcyBwIGV4dGVuZHMgYS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZXJhIil9fWNsYXNzIG0gZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJlcmFOYW1lcyIsITApLHRoaXMuZXJhPW5ldyBhLlhGQU9iamVjdEFycmF5KDIpfX1jbGFzcyBiIGV4dGVuZHMgYS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywibG9jYWxlIiwhMCksdGhpcy5kZXNjPWUuZGVzY3x8IiIsdGhpcy5uYW1lPSJpc29uYW1lIix0aGlzLmNhbGVuZGFyU3ltYm9scz1udWxsLHRoaXMuY3VycmVuY3lTeW1ib2xzPW51bGwsdGhpcy5kYXRlUGF0dGVybnM9bnVsbCx0aGlzLmRhdGVUaW1lU3ltYm9scz1udWxsLHRoaXMubnVtYmVyUGF0dGVybnM9bnVsbCx0aGlzLm51bWJlclN5bWJvbHM9bnVsbCx0aGlzLnRpbWVQYXR0ZXJucz1udWxsLHRoaXMudHlwZUZhY2VzPW51bGx9fWNsYXNzIHkgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJsb2NhbGVTZXQiLCEwKSx0aGlzLmxvY2FsZT1uZXcgYS5YRkFPYmplY3RBcnJheX19Y2xhc3MgdyBleHRlbmRzIGEuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsIm1lcmlkaWVtIil9fWNsYXNzIHYgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJtZXJpZGllbU5hbWVzIiwhMCksdGhpcy5tZXJpZGllbT1uZXcgYS5YRkFPYmplY3RBcnJheSgyKX19Y2xhc3MgeCBleHRlbmRzIGEuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsIm1vbnRoIil9fWNsYXNzIFMgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJtb250aE5hbWVzIiwhMCksdGhpcy5hYmJyPSgwLGkuZ2V0SW50ZWdlcikoe2RhdGE6ZS5hYmJyLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy5tb250aD1uZXcgYS5YRkFPYmplY3RBcnJheSgxMil9fWNsYXNzIEEgZXh0ZW5kcyBhLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJudW1iZXJQYXR0ZXJuIiksdGhpcy5uYW1lPSgwLGkuZ2V0U3RyaW5nT3B0aW9uKShlLm5hbWUsWyJmdWxsIiwibG9uZyIsIm1lZCIsInNob3J0Il0pfX1jbGFzcyBrIGV4dGVuZHMgYS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywibnVtYmVyUGF0dGVybnMiLCEwKSx0aGlzLm51bWJlclBhdHRlcm49bmV3IGEuWEZBT2JqZWN0QXJyYXkoNCl9fWNsYXNzIEMgZXh0ZW5kcyBhLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJudW1iZXJTeW1ib2wiKSx0aGlzLm5hbWU9KDAsaS5nZXRTdHJpbmdPcHRpb24pKGUubmFtZSxbImRlY2ltYWwiLCJncm91cGluZyIsInBlcmNlbnQiLCJtaW51cyIsInplcm8iXSl9fWNsYXNzIE8gZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJudW1iZXJTeW1ib2xzIiwhMCksdGhpcy5udW1iZXJTeW1ib2w9bmV3IGEuWEZBT2JqZWN0QXJyYXkoNSl9fWNsYXNzIEYgZXh0ZW5kcyBhLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJ0aW1lUGF0dGVybiIpLHRoaXMubmFtZT0oMCxpLmdldFN0cmluZ09wdGlvbikoZS5uYW1lLFsiZnVsbCIsImxvbmciLCJtZWQiLCJzaG9ydCJdKX19Y2xhc3MgSSBleHRlbmRzIGEuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsInRpbWVQYXR0ZXJucyIsITApLHRoaXMudGltZVBhdHRlcm49bmV3IGEuWEZBT2JqZWN0QXJyYXkoNCl9fWNsYXNzIFQgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJ0eXBlRmFjZSIsITApLHRoaXMubmFtZT0iInxlLm5hbWV9fWNsYXNzIE0gZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJ0eXBlRmFjZXMiLCEwKSx0aGlzLnR5cGVGYWNlPW5ldyBhLlhGQU9iamVjdEFycmF5fX1jbGFzcyBFe3N0YXRpY1tuLiRidWlsZFhGQU9iamVjdF0oZSx0KXtpZihFLmhhc093blByb3BlcnR5KGUpKXJldHVybiBFW2VdKHQpfXN0YXRpYyBjYWxlbmRhclN5bWJvbHMoZSl7cmV0dXJuIG5ldyBvKGUpfXN0YXRpYyBjdXJyZW5jeVN5bWJvbChlKXtyZXR1cm4gbmV3IGMoZSl9c3RhdGljIGN1cnJlbmN5U3ltYm9scyhlKXtyZXR1cm4gbmV3IGwoZSl9c3RhdGljIGRhdGVQYXR0ZXJuKGUpe3JldHVybiBuZXcgaChlKX1zdGF0aWMgZGF0ZVBhdHRlcm5zKGUpe3JldHVybiBuZXcgdShlKX1zdGF0aWMgZGF0ZVRpbWVTeW1ib2xzKGUpe3JldHVybiBuZXcgZChlKX1zdGF0aWMgZGF5KGUpe3JldHVybiBuZXcgZihlKX1zdGF0aWMgZGF5TmFtZXMoZSl7cmV0dXJuIG5ldyBnKGUpfXN0YXRpYyBlcmEoZSl7cmV0dXJuIG5ldyBwKGUpfXN0YXRpYyBlcmFOYW1lcyhlKXtyZXR1cm4gbmV3IG0oZSl9c3RhdGljIGxvY2FsZShlKXtyZXR1cm4gbmV3IGIoZSl9c3RhdGljIGxvY2FsZVNldChlKXtyZXR1cm4gbmV3IHkoZSl9c3RhdGljIG1lcmlkaWVtKGUpe3JldHVybiBuZXcgdyhlKX1zdGF0aWMgbWVyaWRpZW1OYW1lcyhlKXtyZXR1cm4gbmV3IHYoZSl9c3RhdGljIG1vbnRoKGUpe3JldHVybiBuZXcgeChlKX1zdGF0aWMgbW9udGhOYW1lcyhlKXtyZXR1cm4gbmV3IFMoZSl9c3RhdGljIG51bWJlclBhdHRlcm4oZSl7cmV0dXJuIG5ldyBBKGUpfXN0YXRpYyBudW1iZXJQYXR0ZXJucyhlKXtyZXR1cm4gbmV3IGsoZSl9c3RhdGljIG51bWJlclN5bWJvbChlKXtyZXR1cm4gbmV3IEMoZSl9c3RhdGljIG51bWJlclN5bWJvbHMoZSl7cmV0dXJuIG5ldyBPKGUpfXN0YXRpYyB0aW1lUGF0dGVybihlKXtyZXR1cm4gbmV3IEYoZSl9c3RhdGljIHRpbWVQYXR0ZXJucyhlKXtyZXR1cm4gbmV3IEkoZSl9c3RhdGljIHR5cGVGYWNlKGUpe3JldHVybiBuZXcgVChlKX1zdGF0aWMgdHlwZUZhY2VzKGUpe3JldHVybiBuZXcgTShlKX19dC5Mb2NhbGVTZXROYW1lc3BhY2U9RX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlNpZ25hdHVyZU5hbWVzcGFjZT12b2lkIDA7dmFyIG49cigyMzQpLGE9cigyNDApO2NvbnN0IGk9bi5OYW1lc3BhY2VJZHMuc2lnbmF0dXJlLmlkO2NsYXNzIHMgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJzaWduYXR1cmUiLCEwKX19Y2xhc3Mgb3tzdGF0aWNbbi4kYnVpbGRYRkFPYmplY3RdKGUsdCl7aWYoby5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gb1tlXSh0KX1zdGF0aWMgc2lnbmF0dXJlKGUpe3JldHVybiBuZXcgcyhlKX19dC5TaWduYXR1cmVOYW1lc3BhY2U9b30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlN0eWxlc2hlZXROYW1lc3BhY2U9dm9pZCAwO3ZhciBuPXIoMjM0KSxhPXIoMjQwKTtjb25zdCBpPW4uTmFtZXNwYWNlSWRzLnN0eWxlc2hlZXQuaWQ7Y2xhc3MgcyBleHRlbmRzIGEuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksInN0eWxlc2hlZXQiLCEwKX19Y2xhc3Mgb3tzdGF0aWNbbi4kYnVpbGRYRkFPYmplY3RdKGUsdCl7aWYoby5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gb1tlXSh0KX1zdGF0aWMgc3R5bGVzaGVldChlKXtyZXR1cm4gbmV3IHMoZSl9fXQuU3R5bGVzaGVldE5hbWVzcGFjZT1vfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuWGRwTmFtZXNwYWNlPXZvaWQgMDt2YXIgbj1yKDIzNCksYT1yKDIyOCksaT1yKDI0MCk7Y29uc3Qgcz1uLk5hbWVzcGFjZUlkcy54ZHAuaWQ7Y2xhc3MgbyBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsInhkcCIsITApLHRoaXMudXVpZD1lLnV1aWR8fCIiLHRoaXMudGltZVN0YW1wPWUudGltZVN0YW1wfHwiIix0aGlzLmNvbmZpZz1udWxsLHRoaXMuY29ubmVjdGlvblNldD1udWxsLHRoaXMuZGF0YXNldHM9bnVsbCx0aGlzLmxvY2FsZVNldD1udWxsLHRoaXMuc3R5bGVzaGVldD1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLnRlbXBsYXRlPW51bGx9W2EuJG9uQ2hpbGRDaGVja10oZSl7Y29uc3QgdD1uLk5hbWVzcGFjZUlkc1tlW2EuJG5vZGVOYW1lXV07cmV0dXJuIHQmJmVbYS4kbmFtZXNwYWNlSWRdPT09dC5pZH19Y2xhc3MgY3tzdGF0aWNbbi4kYnVpbGRYRkFPYmplY3RdKGUsdCl7aWYoYy5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gY1tlXSh0KX1zdGF0aWMgeGRwKGUpe3JldHVybiBuZXcgbyhlKX19dC5YZHBOYW1lc3BhY2U9Y30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlhodG1sTmFtZXNwYWNlPXZvaWQgMCxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNyk7dmFyIG49cigyMjgpLGE9cigyMzQpLGk9cigyMzYpLHM9cigyMzcpLG89cigyNDApO2NvbnN0IGM9YS5OYW1lc3BhY2VJZHMueGh0bWwuaWQsbD1TeW1ib2woKSxoPW5ldyBTZXQoWyJjb2xvciIsImZvbnQiLCJmb250LWZhbWlseSIsImZvbnQtc2l6ZSIsImZvbnQtc3RyZXRjaCIsImZvbnQtc3R5bGUiLCJmb250LXdlaWdodCIsIm1hcmdpbiIsIm1hcmdpbi1ib3R0b20iLCJtYXJnaW4tbGVmdCIsIm1hcmdpbi1yaWdodCIsIm1hcmdpbi10b3AiLCJsZXR0ZXItc3BhY2luZyIsImxpbmUtaGVpZ2h0Iiwib3JwaGFucyIsInBhZ2UtYnJlYWstYWZ0ZXIiLCJwYWdlLWJyZWFrLWJlZm9yZSIsInBhZ2UtYnJlYWstaW5zaWRlIiwidGFiLWludGVydmFsIiwidGFiLXN0b3AiLCJ0ZXh0LWFsaWduIiwidGV4dC1kZWNvcmF0aW9uIiwidGV4dC1pbmRlbnQiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndpZG93cyIsImtlcm5pbmctbW9kZSIsInhmYS1mb250LWhvcml6b250YWwtc2NhbGUiLCJ4ZmEtZm9udC12ZXJ0aWNhbC1zY2FsZSIsInhmYS1zcGFjZXJ1biIsInhmYS10YWItc3RvcHMiXSksdT1uZXcgTWFwKFtbInBhZ2UtYnJlYWstYWZ0ZXIiLCJicmVha0FmdGVyIl0sWyJwYWdlLWJyZWFrLWJlZm9yZSIsImJyZWFrQmVmb3JlIl0sWyJwYWdlLWJyZWFrLWluc2lkZSIsImJyZWFrSW5zaWRlIl0sWyJrZXJuaW5nLW1vZGUiLGU9PiJub25lIj09PWU/Im5vbmUiOiJub3JtYWwiXSxbInhmYS1mb250LWhvcml6b250YWwtc2NhbGUiLGU9PiJzY2FsZVgoIi5jb25jYXQoTWF0aC5tYXgoMCxNYXRoLm1pbihwYXJzZUludChlKS8xMDApKS50b0ZpeGVkKDIpLCIpIildLFsieGZhLWZvbnQtdmVydGljYWwtc2NhbGUiLGU9PiJzY2FsZVkoIi5jb25jYXQoTWF0aC5tYXgoMCxNYXRoLm1pbihwYXJzZUludChlKS8xMDApKS50b0ZpeGVkKDIpLCIpIildLFsieGZhLXNwYWNlcnVuIiwiIl0sWyJ4ZmEtdGFiLXN0b3BzIiwiIl0sWyJmb250LXNpemUiLChlLHQpPT4oZT10LmZvbnRTaXplPSgwLHMuZ2V0TWVhc3VyZW1lbnQpKGUpLCgwLGkubWVhc3VyZVRvU3RyaW5nKSguOTkqZSkpXSxbImxldHRlci1zcGFjaW5nIixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbImxpbmUtaGVpZ2h0IixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbIm1hcmdpbiIsZT0+KDAsaS5tZWFzdXJlVG9TdHJpbmcpKCgwLHMuZ2V0TWVhc3VyZW1lbnQpKGUpKV0sWyJtYXJnaW4tYm90dG9tIixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbIm1hcmdpbi1sZWZ0IixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbIm1hcmdpbi1yaWdodCIsZT0+KDAsaS5tZWFzdXJlVG9TdHJpbmcpKCgwLHMuZ2V0TWVhc3VyZW1lbnQpKGUpKV0sWyJtYXJnaW4tdG9wIixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbInRleHQtaW5kZW50IixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbImZvbnQtZmFtaWx5IixlPT5lXSxbInZlcnRpY2FsLWFsaWduIixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXV0pLGQ9L1xzKy9nLGY9L1tcclxuXSsvZyxnPS9cclxuPy9nO2Z1bmN0aW9uIHAoZSx0LHIpe2NvbnN0IGE9T2JqZWN0LmNyZWF0ZShudWxsKTtpZighZSlyZXR1cm4gYTtjb25zdCBvPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGNvbnN0W3Qscl1vZiBlLnNwbGl0KCI7IikubWFwKChlPT5lLnNwbGl0KCI6IiwyKSkpKXtjb25zdCBlPXUuZ2V0KHQpO2lmKCIiPT09ZSljb250aW51ZTtsZXQgbj1yO2UmJihuPSJzdHJpbmciPT10eXBlb2YgZT9lOmUocixvKSksdC5lbmRzV2l0aCgic2NhbGUiKT9hLnRyYW5zZm9ybT1hLnRyYW5zZm9ybT8iIi5jb25jYXQoYVt0XSwiICIpLmNvbmNhdChuKTpuOmFbdC5yZXBsYWNlQWxsKC8tKFthLXpBLVpdKS9nLCgoZSx0KT0+dC50b1VwcGVyQ2FzZSgpKSldPW59aWYoYS5mb250RmFtaWx5JiYoMCxpLnNldEZvbnRGYW1pbHkpKHt0eXBlZmFjZTphLmZvbnRGYW1pbHksd2VpZ2h0OmEuZm9udFdlaWdodHx8Im5vcm1hbCIscG9zdHVyZTphLmZvbnRTdHlsZXx8Im5vcm1hbCIsc2l6ZTpvLmZvbnRTaXplfHwwfSx0LHRbbi4kZ2xvYmFsRGF0YV0uZm9udEZpbmRlcixhKSxyJiZhLnZlcnRpY2FsQWxpZ24mJiIwcHgiIT09YS52ZXJ0aWNhbEFsaWduJiZhLmZvbnRTaXplKXtjb25zdCBlPS41ODMsdD0uMzMzLHI9KDAscy5nZXRNZWFzdXJlbWVudCkoYS5mb250U2l6ZSk7YS5mb250U2l6ZT0oMCxpLm1lYXN1cmVUb1N0cmluZykociplKSxhLnZlcnRpY2FsQWxpZ249KDAsaS5tZWFzdXJlVG9TdHJpbmcpKE1hdGguc2lnbigoMCxzLmdldE1lYXN1cmVtZW50KShhLnZlcnRpY2FsQWxpZ24pKSpyKnQpfXJldHVybiByJiZhLmZvbnRTaXplJiYoYS5mb250U2l6ZT0iY2FsYygiLmNvbmNhdChhLmZvbnRTaXplLCIgKiB2YXIoLS1zY2FsZS1mYWN0b3IpKSIpKSwoMCxpLmZpeFRleHRJbmRlbnQpKGEpLGF9Y29uc3QgbT1uZXcgU2V0KFsiYm9keSIsImh0bWwiXSk7Y2xhc3MgYiBleHRlbmRzIG8uWG1sT2JqZWN0e2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoYyx0KSx0aGlzW2xdPSExLHRoaXMuc3R5bGU9ZS5zdHlsZXx8IiJ9W24uJGNsZWFuXShlKXtzdXBlcltuLiRjbGVhbl0oZSksdGhpcy5zdHlsZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5zdHlsZT9lLnN0eWxlLnRyaW0oKS5zcGxpdCgvXHMqO1xzKi8pLmZpbHRlcigoZT0+ISFlKSkubWFwKChlPT5lLnNwbGl0KC9ccyo6XHMqLywyKSkpLmZpbHRlcigodD0+e2xldFtyLGFdPXQ7cmV0dXJuImZvbnQtZmFtaWx5Ij09PXImJmVbbi4kZ2xvYmFsRGF0YV0udXNlZFR5cGVmYWNlcy5hZGQoYSksaC5oYXMocil9KSkubWFwKChlPT5lLmpvaW4oIjoiKSkpLmpvaW4oIjsiKToiIn0odGhpcyl9W24uJGFjY2VwdFdoaXRlc3BhY2VdKCl7cmV0dXJuIW0uaGFzKHRoaXNbbi4kbm9kZU5hbWVdKX1bbi4kb25UZXh0XShlKXthcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdP3RoaXNbbF09ITA6KGU9ZS5yZXBsYWNlQWxsKGYsIiIpLHRoaXMuc3R5bGUuaW5jbHVkZXMoInhmYS1zcGFjZXJ1bjp5ZXMiKXx8KGU9ZS5yZXBsYWNlQWxsKGQsIiAiKSkpLGUmJih0aGlzW24uJGNvbnRlbnRdKz1lKX1bbi4kcHVzaEdseXBoc10oZSl7bGV0IHQ9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXTtjb25zdCByPU9iamVjdC5jcmVhdGUobnVsbCksYT17dG9wOk5hTixib3R0b206TmFOLGxlZnQ6TmFOLHJpZ2h0Ok5hTn07bGV0IGk9bnVsbDtmb3IoY29uc3RbZSx0XW9mIHRoaXMuc3R5bGUuc3BsaXQoIjsiKS5tYXAoKGU9PmUuc3BsaXQoIjoiLDIpKSkpc3dpdGNoKGUpe2Nhc2UiZm9udC1mYW1pbHkiOnIudHlwZWZhY2U9KDAscy5zdHJpcFF1b3RlcykodCk7YnJlYWs7Y2FzZSJmb250LXNpemUiOnIuc2l6ZT0oMCxzLmdldE1lYXN1cmVtZW50KSh0KTticmVhaztjYXNlImZvbnQtd2VpZ2h0IjpyLndlaWdodD10O2JyZWFrO2Nhc2UiZm9udC1zdHlsZSI6ci5wb3N0dXJlPXQ7YnJlYWs7Y2FzZSJsZXR0ZXItc3BhY2luZyI6ci5sZXR0ZXJTcGFjaW5nPSgwLHMuZ2V0TWVhc3VyZW1lbnQpKHQpO2JyZWFrO2Nhc2UibWFyZ2luIjpjb25zdCBlPXQuc3BsaXQoLyBcdC8pLm1hcCgoZT0+KDAscy5nZXRNZWFzdXJlbWVudCkoZSkpKTtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMTphLnRvcD1hLmJvdHRvbT1hLmxlZnQ9YS5yaWdodD1lWzBdO2JyZWFrO2Nhc2UgMjphLnRvcD1hLmJvdHRvbT1lWzBdLGEubGVmdD1hLnJpZ2h0PWVbMV07YnJlYWs7Y2FzZSAzOmEudG9wPWVbMF0sYS5ib3R0b209ZVsyXSxhLmxlZnQ9YS5yaWdodD1lWzFdO2JyZWFrO2Nhc2UgNDphLnRvcD1lWzBdLGEubGVmdD1lWzFdLGEuYm90dG9tPWVbMl0sYS5yaWdodD1lWzNdfWJyZWFrO2Nhc2UibWFyZ2luLXRvcCI6YS50b3A9KDAscy5nZXRNZWFzdXJlbWVudCkodCk7YnJlYWs7Y2FzZSJtYXJnaW4tYm90dG9tIjphLmJvdHRvbT0oMCxzLmdldE1lYXN1cmVtZW50KSh0KTticmVhaztjYXNlIm1hcmdpbi1sZWZ0IjphLmxlZnQ9KDAscy5nZXRNZWFzdXJlbWVudCkodCk7YnJlYWs7Y2FzZSJtYXJnaW4tcmlnaHQiOmEucmlnaHQ9KDAscy5nZXRNZWFzdXJlbWVudCkodCk7YnJlYWs7Y2FzZSJsaW5lLWhlaWdodCI6aT0oMCxzLmdldE1lYXN1cmVtZW50KSh0KX1pZihlLnB1c2hEYXRhKHIsYSxpKSx0aGlzW24uJGNvbnRlbnRdKWUuYWRkU3RyaW5nKHRoaXNbbi4kY29udGVudF0pO2Vsc2UgZm9yKGNvbnN0IHQgb2YgdGhpc1tuLiRnZXRDaGlsZHJlbl0oKSkiI3RleHQiIT09dFtuLiRub2RlTmFtZV0/dFtuLiRwdXNoR2x5cGhzXShlKTplLmFkZFN0cmluZyh0W24uJGNvbnRlbnRdKTt0JiZlLnBvcEZvbnQoKX1bbi4kdG9IVE1MXShlKXtjb25zdCB0PVtdO2lmKHRoaXNbbi4kZXh0cmFdPXtjaGlsZHJlbjp0fSx0aGlzW24uJGNoaWxkcmVuVG9IVE1MXSh7fSksMD09PXQubGVuZ3RoJiYhdGhpc1tuLiRjb250ZW50XSlyZXR1cm4gcy5IVE1MUmVzdWx0LkVNUFRZO2xldCByO3JldHVybiByPXRoaXNbbF0/dGhpc1tuLiRjb250ZW50XT90aGlzW24uJGNvbnRlbnRdLnJlcGxhY2VBbGwoZywiXG4iKTp2b2lkIDA6dGhpc1tuLiRjb250ZW50XXx8dm9pZCAwLHMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOnRoaXNbbi4kbm9kZU5hbWVdLGF0dHJpYnV0ZXM6e2hyZWY6dGhpcy5ocmVmLHN0eWxlOnAodGhpcy5zdHlsZSx0aGlzLHRoaXNbbF0pfSxjaGlsZHJlbjp0LHZhbHVlOnJ9KX19Y2xhc3MgeSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiYSIpLHRoaXMuaHJlZj0oMCxpLmZpeFVSTCkoZS5ocmVmKXx8IiJ9fWNsYXNzIHcgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsImIiKX1bbi4kcHVzaEdseXBoc10oZSl7ZS5wdXNoRm9udCh7d2VpZ2h0OiJib2xkIn0pLHN1cGVyW24uJHB1c2hHbHlwaHNdKGUpLGUucG9wRm9udCgpfX1jbGFzcyB2IGV4dGVuZHMgYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJib2R5Iil9W24uJHRvSFRNTF0oZSl7Y29uc3QgdD1zdXBlcltuLiR0b0hUTUxdKGUpLHtodG1sOnJ9PXQ7cmV0dXJuIHI/KHIubmFtZT0iZGl2IixyLmF0dHJpYnV0ZXMuY2xhc3M9WyJ4ZmFSaWNoIl0sdCk6cy5IVE1MUmVzdWx0LkVNUFRZfX1jbGFzcyB4IGV4dGVuZHMgYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJiciIpfVtuLiR0ZXh0XSgpe3JldHVybiJcbiJ9W24uJHB1c2hHbHlwaHNdKGUpe2UuYWRkU3RyaW5nKCJcbiIpfVtuLiR0b0hUTUxdKGUpe3JldHVybiBzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiYnIifSl9fWNsYXNzIFMgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsImh0bWwiKX1bbi4kdG9IVE1MXShlKXtjb25zdCB0PVtdO2lmKHRoaXNbbi4kZXh0cmFdPXtjaGlsZHJlbjp0fSx0aGlzW24uJGNoaWxkcmVuVG9IVE1MXSh7fSksMD09PXQubGVuZ3RoKXJldHVybiBzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixhdHRyaWJ1dGVzOntjbGFzczpbInhmYVJpY2giXSxzdHlsZTp7fX0sdmFsdWU6dGhpc1tuLiRjb250ZW50XXx8IiJ9KTtpZigxPT09dC5sZW5ndGgpe3ZhciByO2NvbnN0IGU9dFswXTtpZihudWxsIT09KHI9ZS5hdHRyaWJ1dGVzKSYmdm9pZCAwIT09ciYmci5jbGFzcy5pbmNsdWRlcygieGZhUmljaCIpKXJldHVybiBzLkhUTUxSZXN1bHQuc3VjY2VzcyhlKX1yZXR1cm4gcy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJ4ZmFSaWNoIl0sc3R5bGU6e319LGNoaWxkcmVuOnR9KX19Y2xhc3MgQSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiaSIpfVtuLiRwdXNoR2x5cGhzXShlKXtlLnB1c2hGb250KHtwb3N0dXJlOiJpdGFsaWMifSksc3VwZXJbbi4kcHVzaEdseXBoc10oZSksZS5wb3BGb250KCl9fWNsYXNzIGsgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsImxpIil9fWNsYXNzIEMgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIm9sIil9fWNsYXNzIE8gZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsInAiKX1bbi4kcHVzaEdseXBoc10oZSl7c3VwZXJbbi4kcHVzaEdseXBoc10oZSwhMSksZS5hZGRTdHJpbmcoIlxuIiksZS5hZGRQYXJhKCksZS5wb3BGb250KCl9W24uJHRleHRdKCl7cmV0dXJuIHRoaXNbbi4kZ2V0UGFyZW50XSgpW24uJGdldENoaWxkcmVuXSgpLmF0KC0xKT09PXRoaXM/c3VwZXJbbi4kdGV4dF0oKTpzdXBlcltuLiR0ZXh0XSgpKyJcbiJ9fWNsYXNzIEYgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsInNwYW4iKX19Y2xhc3MgSSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwic3ViIil9fWNsYXNzIFQgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsInN1cCIpfX1jbGFzcyBNIGV4dGVuZHMgYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJ1bCIpfX1jbGFzcyBFe3N0YXRpY1thLiRidWlsZFhGQU9iamVjdF0oZSx0KXtpZihFLmhhc093blByb3BlcnR5KGUpKXJldHVybiBFW2VdKHQpfXN0YXRpYyBhKGUpe3JldHVybiBuZXcgeShlKX1zdGF0aWMgYihlKXtyZXR1cm4gbmV3IHcoZSl9c3RhdGljIGJvZHkoZSl7cmV0dXJuIG5ldyB2KGUpfXN0YXRpYyBicihlKXtyZXR1cm4gbmV3IHgoZSl9c3RhdGljIGh0bWwoZSl7cmV0dXJuIG5ldyBTKGUpfXN0YXRpYyBpKGUpe3JldHVybiBuZXcgQShlKX1zdGF0aWMgbGkoZSl7cmV0dXJuIG5ldyBrKGUpfXN0YXRpYyBvbChlKXtyZXR1cm4gbmV3IEMoZSl9c3RhdGljIHAoZSl7cmV0dXJuIG5ldyBPKGUpfXN0YXRpYyBzcGFuKGUpe3JldHVybiBuZXcgRihlKX1zdGF0aWMgc3ViKGUpe3JldHVybiBuZXcgSShlKX1zdGF0aWMgc3VwKGUpe3JldHVybiBuZXcgVChlKX1zdGF0aWMgdWwoZSl7cmV0dXJuIG5ldyBNKGUpfX10LlhodG1sTmFtZXNwYWNlPUV9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Vbmtub3duTmFtZXNwYWNlPXZvaWQgMDt2YXIgbj1yKDIzNCksYT1yKDI0MCk7Y2xhc3MgaXtjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWVzcGFjZUlkPWV9W24uJGJ1aWxkWEZBT2JqZWN0XShlLHQpe3JldHVybiBuZXcgYS5YbWxPYmplY3QodGhpcy5uYW1lc3BhY2VJZCxlLHQpfX10LlVua25vd25OYW1lc3BhY2U9aX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkRhdGFzZXRSZWFkZXI9dm9pZCAwLHIoMik7dmFyIG49cigxNDQpLGE9cigxNDkpLGk9cigyMTcpO2Z1bmN0aW9uIHMoZSl7dHJ5e3JldHVybigwLG4uc3RyaW5nVG9VVEY4U3RyaW5nKShlKX1jYXRjaCh0KXtyZXR1cm4oMCxuLndhcm4pKCdVVEYtOCBkZWNvZGluZyBmYWlsZWQ6ICInLmNvbmNhdCh0LCciLicpKSxlfX1jbGFzcyBvIGV4dGVuZHMgaS5TaW1wbGVYTUxQYXJzZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5ub2RlPW51bGx9b25FbmRFbGVtZW50KGUpe2NvbnN0IHQ9c3VwZXIub25FbmRFbGVtZW50KGUpO2lmKHQmJiJ4ZmE6ZGF0YXNldHMiPT09ZSl0aHJvdyB0aGlzLm5vZGU9dCxuZXcgRXJyb3IoIkFib3J0aW5nIERhdGFzZXRYTUxQYXJzZXIuIil9fXQuRGF0YXNldFJlYWRlcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXtpZihlLmRhdGFzZXRzKXRoaXMubm9kZT1uZXcgaS5TaW1wbGVYTUxQYXJzZXIoe2hhc0F0dHJpYnV0ZXM6ITB9KS5wYXJzZUZyb21TdHJpbmcoZS5kYXRhc2V0cykuZG9jdW1lbnRFbGVtZW50O2Vsc2V7Y29uc3QgdD1uZXcgbyh7aGFzQXR0cmlidXRlczohMH0pO3RyeXt0LnBhcnNlRnJvbVN0cmluZyhlWyJ4ZHA6eGRwIl0pfWNhdGNoKGUpe310aGlzLm5vZGU9dC5ub2RlfX1nZXRWYWx1ZShlKXtpZighdGhpcy5ub2RlfHwhZSlyZXR1cm4iIjtjb25zdCB0PXRoaXMubm9kZS5zZWFyY2hOb2RlKCgwLGEucGFyc2VYRkFQYXRoKShlKSwwKTtpZighdClyZXR1cm4iIjtjb25zdCByPXQuZmlyc3RDaGlsZDtyZXR1cm4idmFsdWUiPT09KG51bGw9PXI/dm9pZCAwOnIubm9kZU5hbWUpP3QuY2hpbGRyZW4ubWFwKChlPT5zKGUudGV4dENvbnRlbnQpKSk6cyh0LnRleHRDb250ZW50KX19fSwoZSx0LHIpPT57dmFyIG47T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuWFJlZj12b2lkIDAscigxMTYpLHIoMTI2KSxyKDEyOCkscigxMzEpLHIoMTMzKSxyKDEzNSkscigxMzcpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDEzOSkscigyKTt2YXIgYT1yKDE0NCksaT1yKDE1MCkscz1yKDE2Niksbz1yKDE0OSksbD1yKDE1MSksZD1yKDIxOCk7dC5YUmVmPShuPW5ldyBXZWFrTWFwLGNsYXNze2NvbnN0cnVjdG9yKGUsdCl7Yyh0aGlzLG4se3dyaXRhYmxlOiEwLHZhbHVlOm51bGx9KSx0aGlzLnN0cmVhbT1lLHRoaXMucGRmTWFuYWdlcj10LHRoaXMuZW50cmllcz1bXSx0aGlzLl94cmVmU3Rtcz1uZXcgU2V0LHRoaXMuX2NhY2hlTWFwPW5ldyBNYXAsdGhpcy5fcGVuZGluZ1JlZnM9bmV3IGkuUmVmU2V0LHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW09bnVsbCx0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW09bnVsbH1nZXROZXdQZXJzaXN0ZW50UmVmKGUpe251bGw9PT10aGlzLl9uZXdQZXJzaXN0ZW50UmVmTnVtJiYodGhpcy5fbmV3UGVyc2lzdGVudFJlZk51bT10aGlzLmVudHJpZXMubGVuZ3RofHwxKTtjb25zdCB0PXRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0rKztyZXR1cm4gdGhpcy5fY2FjaGVNYXAuc2V0KHQsZSksaS5SZWYuZ2V0KHQsMCl9Z2V0TmV3VGVtcG9yYXJ5UmVmKCl7cmV0dXJuIG51bGw9PT10aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW0mJih0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW09dGhpcy5lbnRyaWVzLmxlbmd0aHx8MSksaS5SZWYuZ2V0KHRoaXMuX25ld1RlbXBvcmFyeVJlZk51bSsrLDApfXJlc2V0TmV3VGVtcG9yYXJ5UmVmKCl7dGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtPW51bGx9c2V0U3RhcnRYUmVmKGUpe3RoaXMuc3RhcnRYUmVmUXVldWU9W2VdfXBhcnNlKCl7bGV0IGUsdCxyLG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTtuPygoMCxhLndhcm4pKCJJbmRleGluZyBhbGwgUERGIG9iamVjdHMiKSxlPXRoaXMuaW5kZXhPYmplY3RzKCkpOmU9dGhpcy5yZWFkWFJlZigpLGUuYXNzaWduWHJlZih0aGlzKSx0aGlzLnRyYWlsZXI9ZTt0cnl7dD1lLmdldCgiRW5jcnlwdCIpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBvLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsYS53YXJuKSgnWFJlZi5wYXJzZSAtIEludmFsaWQgIkVuY3J5cHQiIHJlZmVyZW5jZTogIicuY29uY2F0KGUsJyIuJykpfWlmKHQgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IHI9ZS5nZXQoIklEIiksbj1udWxsIT1yJiZyLmxlbmd0aD9yWzBdOiIiO3Quc3VwcHJlc3NFbmNyeXB0aW9uPSEwLHRoaXMuZW5jcnlwdD1uZXcgZC5DaXBoZXJUcmFuc2Zvcm1GYWN0b3J5KHQsbix0aGlzLnBkZk1hbmFnZXIucGFzc3dvcmQpfXRyeXtyPWUuZ2V0KCJSb290Iil9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIG8uTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKCdYUmVmLnBhcnNlIC0gSW52YWxpZCAiUm9vdCIgcmVmZXJlbmNlOiAiJy5jb25jYXQoZSwnIi4nKSl9aWYociBpbnN0YW5jZW9mIGkuRGljdCl0cnl7aWYoci5nZXQoIlBhZ2VzIilpbnN0YW5jZW9mIGkuRGljdClyZXR1cm4gdm9pZCh0aGlzLnJvb3Q9cil9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIG8uTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKCdYUmVmLnBhcnNlIC0gSW52YWxpZCAiUGFnZXMiIHJlZmVyZW5jZTogIicuY29uY2F0KGUsJyIuJykpfWlmKCFuKXRocm93IG5ldyBvLlhSZWZQYXJzZUV4Y2VwdGlvbjt0aHJvdyBuZXcgYS5JbnZhbGlkUERGRXhjZXB0aW9uKCJJbnZhbGlkIFJvb3QgcmVmZXJlbmNlLiIpfXByb2Nlc3NYUmVmVGFibGUoZSl7InRhYmxlU3RhdGUiaW4gdGhpc3x8KHRoaXMudGFibGVTdGF0ZT17ZW50cnlOdW06MCxzdHJlYW1Qb3M6ZS5sZXhlci5zdHJlYW0ucG9zLHBhcnNlckJ1ZjE6ZS5idWYxLHBhcnNlckJ1ZjI6ZS5idWYyfSk7Y29uc3QgdD10aGlzLnJlYWRYUmVmVGFibGUoZSk7aWYoISgwLGkuaXNDbWQpKHQsInRyYWlsZXIiKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiBjb3VsZCBub3QgZmluZCB0cmFpbGVyIGRpY3Rpb25hcnkiKTtsZXQgcj1lLmdldE9iaigpO2lmKHIgaW5zdGFuY2VvZiBpLkRpY3R8fCFyLmRpY3R8fChyPXIuZGljdCksIShyIGluc3RhbmNlb2YgaS5EaWN0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiBjb3VsZCBub3QgcGFyc2UgdHJhaWxlciBkaWN0aW9uYXJ5Iik7cmV0dXJuIGRlbGV0ZSB0aGlzLnRhYmxlU3RhdGUscn1yZWFkWFJlZlRhYmxlKGUpe2NvbnN0IHQ9ZS5sZXhlci5zdHJlYW0scj10aGlzLnRhYmxlU3RhdGU7bGV0IG47Zm9yKHQucG9zPXIuc3RyZWFtUG9zLGUuYnVmMT1yLnBhcnNlckJ1ZjEsZS5idWYyPXIucGFyc2VyQnVmMjs7KXtpZighKCJmaXJzdEVudHJ5TnVtImluIHIpfHwhKCJlbnRyeUNvdW50ImluIHIpKXtpZigoMCxpLmlzQ21kKShuPWUuZ2V0T2JqKCksInRyYWlsZXIiKSlicmVhaztyLmZpcnN0RW50cnlOdW09bixyLmVudHJ5Q291bnQ9ZS5nZXRPYmooKX1sZXQgcz1yLmZpcnN0RW50cnlOdW07Y29uc3Qgbz1yLmVudHJ5Q291bnQ7aWYoIU51bWJlci5pc0ludGVnZXIocyl8fCFOdW1iZXIuaXNJbnRlZ2VyKG8pKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHdyb25nIHR5cGVzIGluIHN1YnNlY3Rpb24gaGVhZGVyIik7Zm9yKGxldCBuPXIuZW50cnlOdW07bjxvO24rKyl7ci5zdHJlYW1Qb3M9dC5wb3Msci5lbnRyeU51bT1uLHIucGFyc2VyQnVmMT1lLmJ1ZjEsci5wYXJzZXJCdWYyPWUuYnVmMjtjb25zdCBjPXt9O2Mub2Zmc2V0PWUuZ2V0T2JqKCksYy5nZW49ZS5nZXRPYmooKTtjb25zdCBsPWUuZ2V0T2JqKCk7aWYobCBpbnN0YW5jZW9mIGkuQ21kKXN3aXRjaChsLmNtZCl7Y2FzZSJmIjpjLmZyZWU9ITA7YnJlYWs7Y2FzZSJuIjpjLnVuY29tcHJlc3NlZD0hMH1pZighTnVtYmVyLmlzSW50ZWdlcihjLm9mZnNldCl8fCFOdW1iZXIuaXNJbnRlZ2VyKGMuZ2VuKXx8IWMuZnJlZSYmIWMudW5jb21wcmVzc2VkKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIGVudHJ5IGluIFhSZWYgc3Vic2VjdGlvbjogIi5jb25jYXQocywiLCAiKS5jb25jYXQobykpOzA9PT1uJiZjLmZyZWUmJjE9PT1zJiYocz0wKSx0aGlzLmVudHJpZXNbbitzXXx8KHRoaXMuZW50cmllc1tuK3NdPWMpfXIuZW50cnlOdW09MCxyLnN0cmVhbVBvcz10LnBvcyxyLnBhcnNlckJ1ZjE9ZS5idWYxLHIucGFyc2VyQnVmMj1lLmJ1ZjIsZGVsZXRlIHIuZmlyc3RFbnRyeU51bSxkZWxldGUgci5lbnRyeUNvdW50fWlmKHRoaXMuZW50cmllc1swXSYmIXRoaXMuZW50cmllc1swXS5mcmVlKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHVuZXhwZWN0ZWQgZmlyc3Qgb2JqZWN0Iik7cmV0dXJuIG59cHJvY2Vzc1hSZWZTdHJlYW0oZSl7aWYoISgic3RyZWFtU3RhdGUiaW4gdGhpcykpe2NvbnN0IHQ9ZS5kaWN0LHI9dC5nZXQoIlciKTtsZXQgbj10LmdldCgiSW5kZXgiKTtufHwobj1bMCx0LmdldCgiU2l6ZSIpXSksdGhpcy5zdHJlYW1TdGF0ZT17ZW50cnlSYW5nZXM6bixieXRlV2lkdGhzOnIsZW50cnlOdW06MCxzdHJlYW1Qb3M6ZS5wb3N9fXJldHVybiB0aGlzLnJlYWRYUmVmU3RyZWFtKGUpLGRlbGV0ZSB0aGlzLnN0cmVhbVN0YXRlLGUuZGljdH1yZWFkWFJlZlN0cmVhbShlKXtjb25zdCB0PXRoaXMuc3RyZWFtU3RhdGU7ZS5wb3M9dC5zdHJlYW1Qb3M7Y29uc3RbcixuLGldPXQuYnl0ZVdpZHRocyxzPXQuZW50cnlSYW5nZXM7Zm9yKDtzLmxlbmd0aD4wOyl7Y29uc3RbbyxjXT1zO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG8pfHwhTnVtYmVyLmlzSW50ZWdlcihjKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHJhbmdlIGZpZWxkczogIi5jb25jYXQobywiLCAiKS5jb25jYXQoYykpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHIpfHwhTnVtYmVyLmlzSW50ZWdlcihuKXx8IU51bWJlci5pc0ludGVnZXIoaSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBlbnRyeSBmaWVsZHMgbGVuZ3RoOiAiLmNvbmNhdChvLCIsICIpLmNvbmNhdChjKSk7Zm9yKGxldCBzPXQuZW50cnlOdW07czxjOysrcyl7dC5lbnRyeU51bT1zLHQuc3RyZWFtUG9zPWUucG9zO2xldCBjPTAsbD0wLGg9MDtmb3IobGV0IHQ9MDt0PHI7Kyt0KXtjb25zdCB0PWUuZ2V0Qnl0ZSgpO2lmKC0xPT09dCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIGJ5dGVXaWR0aHMgJ3R5cGUnLiIpO2M9Yzw8OHx0fTA9PT1yJiYoYz0xKTtmb3IobGV0IHQ9MDt0PG47Kyt0KXtjb25zdCB0PWUuZ2V0Qnl0ZSgpO2lmKC0xPT09dCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIGJ5dGVXaWR0aHMgJ29mZnNldCcuIik7bD1sPDw4fHR9Zm9yKGxldCB0PTA7dDxpOysrdCl7Y29uc3QgdD1lLmdldEJ5dGUoKTtpZigtMT09PXQpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBieXRlV2lkdGhzICdnZW5lcmF0aW9uJy4iKTtoPWg8PDh8dH1jb25zdCB1PXt9O3N3aXRjaCh1Lm9mZnNldD1sLHUuZ2VuPWgsYyl7Y2FzZSAwOnUuZnJlZT0hMDticmVhaztjYXNlIDE6dS51bmNvbXByZXNzZWQ9ITA7YnJlYWs7Y2FzZSAyOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBlbnRyeSB0eXBlOiAiLmNvbmNhdChjKSl9dGhpcy5lbnRyaWVzW28rc118fCh0aGlzLmVudHJpZXNbbytzXT11KX10LmVudHJ5TnVtPTAsdC5zdHJlYW1Qb3M9ZS5wb3Mscy5zcGxpY2UoMCwyKX19aW5kZXhPYmplY3RzKCl7ZnVuY3Rpb24gZShlLHQpe2xldCByPSIiLG49ZVt0XTtmb3IoOzEwIT09biYmMTMhPT1uJiY2MCE9PW4mJiEoKyt0Pj1lLmxlbmd0aCk7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUobiksbj1lW3RdO3JldHVybiByfWZ1bmN0aW9uIHQoZSx0LHIpe2NvbnN0IG49ci5sZW5ndGgsYT1lLmxlbmd0aDtsZXQgaT0wO2Zvcig7dDxhOyl7bGV0IGE9MDtmb3IoO2E8biYmZVt0K2FdPT09clthXTspKythO2lmKGE+PW4pYnJlYWs7dCsrLGkrK31yZXR1cm4gaX1jb25zdCByPS9cYihlbmRvYmp8XGQrXHMrXGQrXHMrb2JqfHhyZWZ8dHJhaWxlclxzKjw8KVxiL2csbj0vXGIoc3RhcnR4cmVmfFxkK1xzK1xkK1xzK29iailcYi9nLGM9L14oXGQrKVxzKyhcZCspXHMrb2JqXGIvLGw9bmV3IFVpbnQ4QXJyYXkoWzExNiwxMTQsOTcsMTA1LDEwOCwxMDEsMTE0XSksaD1uZXcgVWludDhBcnJheShbMTE1LDExNiw5NywxMTQsMTE2LDEyMCwxMTQsMTAxLDEwMl0pLHU9bmV3IFVpbnQ4QXJyYXkoWzQ3LDg4LDgyLDEwMSwxMDJdKTt0aGlzLmVudHJpZXMubGVuZ3RoPTAsdGhpcy5fY2FjaGVNYXAuY2xlYXIoKTtjb25zdCBkPXRoaXMuc3RyZWFtO2QucG9zPTA7Y29uc3QgZj1kLmdldEJ5dGVzKCksZz0oMCxhLmJ5dGVzVG9TdHJpbmcpKGYpLHA9Zi5sZW5ndGg7bGV0IG09ZC5zdGFydDtjb25zdCBiPVtdLHk9W107Zm9yKDttPHA7KXtsZXQgaT1mW21dO2lmKDk9PT1pfHwxMD09PWl8fDEzPT09aXx8MzI9PT1pKXsrK207Y29udGludWV9aWYoMzc9PT1pKXtkb3tpZigrK20sbT49cClicmVhaztpPWZbbV19d2hpbGUoMTAhPT1pJiYxMyE9PWkpO2NvbnRpbnVlfWNvbnN0IHc9ZShmLG0pO2xldCB2O2lmKHcuc3RhcnRzV2l0aCgieHJlZiIpJiYoND09PXcubGVuZ3RofHwvXHMvLnRlc3Qod1s0XSkpKW0rPXQoZixtLGwpLGIucHVzaChtKSxtKz10KGYsbSxoKTtlbHNlIGlmKHY9Yy5leGVjKHcpKXtjb25zdCBlPTB8dlsxXSxuPTB8dlsyXSxpPW0rdy5sZW5ndGg7bGV0IGMsbD0hMTtpZih0aGlzLmVudHJpZXNbZV0pe2lmKHRoaXMuZW50cmllc1tlXS5nZW49PT1uKXRyeXtuZXcgcy5QYXJzZXIoe2xleGVyOm5ldyBzLkxleGVyKGQubWFrZVN1YlN0cmVhbShpKSl9KS5nZXRPYmooKSxsPSEwfWNhdGNoKHIpe3IgaW5zdGFuY2VvZiBvLlBhcnNlckVPRkV4Y2VwdGlvbj8oMCxhLndhcm4pKCJpbmRleE9iamVjdHMgLS0gY2hlY2tpbmcgb2JqZWN0ICgiLmNvbmNhdCh3LCcpOiAiJykuY29uY2F0KHIsJyIuJykpOmw9ITB9fWVsc2UgbD0hMDtsJiYodGhpcy5lbnRyaWVzW2VdPXtvZmZzZXQ6bS1kLnN0YXJ0LGdlbjpuLHVuY29tcHJlc3NlZDohMH0pLHIubGFzdEluZGV4PWk7Y29uc3QgaD1yLmV4ZWMoZyk7aD8oYz1yLmxhc3RJbmRleCsxLW0sImVuZG9iaiIhPT1oWzFdJiYoKDAsYS53YXJuKSgnaW5kZXhPYmplY3RzOiBGb3VuZCAiJy5jb25jYXQoaFsxXSwnIiBpbnNpZGUgb2YgYW5vdGhlciAib2JqIiwgY2F1c2VkIGJ5IG1pc3NpbmcgImVuZG9iaiIgLS0gdHJ5aW5nIHRvIHJlY292ZXIuJykpLGMtPWhbMV0ubGVuZ3RoKzEpKTpjPXAtbTtjb25zdCBiPWYuc3ViYXJyYXkobSxtK2MpLHg9dChiLDAsdSk7eDxjJiZiW3grNV08NjQmJih5LnB1c2gobS1kLnN0YXJ0KSx0aGlzLl94cmVmU3Rtcy5hZGQobS1kLnN0YXJ0KSksbSs9Y31lbHNlIGlmKHcuc3RhcnRzV2l0aCgidHJhaWxlciIpJiYoNz09PXcubGVuZ3RofHwvXHMvLnRlc3Qod1s3XSkpKXtiLnB1c2gobSk7Y29uc3QgZT1tK3cubGVuZ3RoO2xldCB0O24ubGFzdEluZGV4PWU7Y29uc3Qgcj1uLmV4ZWMoZyk7cj8odD1uLmxhc3RJbmRleCsxLW0sInN0YXJ0eHJlZiIhPT1yWzFdJiYoKDAsYS53YXJuKSgnaW5kZXhPYmplY3RzOiBGb3VuZCAiJy5jb25jYXQoclsxXSwnIiBhZnRlciAidHJhaWxlciIsIGNhdXNlZCBieSBtaXNzaW5nICJzdGFydHhyZWYiIC0tIHRyeWluZyB0byByZWNvdmVyLicpKSx0LT1yWzFdLmxlbmd0aCsxKSk6dD1wLW0sbSs9dH1lbHNlIG0rPXcubGVuZ3RoKzF9Zm9yKGNvbnN0IGUgb2YgeSl0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2goZSksdGhpcy5yZWFkWFJlZighMCk7Y29uc3Qgdz1bXTtsZXQgdix4LFM9ITE7Zm9yKGNvbnN0IGUgb2YgYil7ZC5wb3M9ZTtjb25zdCB0PW5ldyBzLlBhcnNlcih7bGV4ZXI6bmV3IHMuTGV4ZXIoZCkseHJlZjp0aGlzLGFsbG93U3RyZWFtczohMCxyZWNvdmVyeU1vZGU6ITB9KSxyPXQuZ2V0T2JqKCk7aWYoISgwLGkuaXNDbWQpKHIsInRyYWlsZXIiKSljb250aW51ZTtjb25zdCBuPXQuZ2V0T2JqKCk7biBpbnN0YW5jZW9mIGkuRGljdCYmKHcucHVzaChuKSxuLmhhcygiRW5jcnlwdCIpJiYoUz0hMCkpfWZvcihjb25zdCBlIG9mWy4uLncsImdlbkZhbGxiYWNrIiwuLi53XSl7aWYoImdlbkZhbGxiYWNrIj09PWUpe2lmKCF4KWJyZWFrO3RoaXMuX2dlbmVyYXRpb25GYWxsYmFjaz0hMDtjb250aW51ZX1sZXQgdD0hMTt0cnl7Y29uc3Qgcj1lLmdldCgiUm9vdCIpO2lmKCEociBpbnN0YW5jZW9mIGkuRGljdCkpY29udGludWU7Y29uc3Qgbj1yLmdldCgiUGFnZXMiKTtpZighKG4gaW5zdGFuY2VvZiBpLkRpY3QpKWNvbnRpbnVlO2NvbnN0IGE9bi5nZXQoIkNvdW50Iik7TnVtYmVyLmlzSW50ZWdlcihhKSYmKHQ9ITApfWNhdGNoKHIpe3g9cjtjb250aW51ZX1pZih0JiYoIVN8fGUuaGFzKCJFbmNyeXB0IikpJiZlLmhhcygiSUQiKSlyZXR1cm4gZTt2PWV9aWYodilyZXR1cm4gdjtpZih0aGlzLnRvcERpY3QpcmV0dXJuIHRoaXMudG9wRGljdDt0aHJvdyBuZXcgYS5JbnZhbGlkUERGRXhjZXB0aW9uKCJJbnZhbGlkIFBERiBzdHJ1Y3R1cmUuIil9cmVhZFhSZWYoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2NvbnN0IHQ9dGhpcy5zdHJlYW0scj1uZXcgU2V0O2Zvcig7dGhpcy5zdGFydFhSZWZRdWV1ZS5sZW5ndGg7KXt0cnl7Y29uc3QgZT10aGlzLnN0YXJ0WFJlZlF1ZXVlWzBdO2lmKHIuaGFzKGUpKXsoMCxhLndhcm4pKCJyZWFkWFJlZiAtIHNraXBwaW5nIFhSZWYgdGFibGUgc2luY2UgaXQgd2FzIGFscmVhZHkgcGFyc2VkLiIpLHRoaXMuc3RhcnRYUmVmUXVldWUuc2hpZnQoKTtjb250aW51ZX1yLmFkZChlKSx0LnBvcz1lK3Quc3RhcnQ7Y29uc3Qgbz1uZXcgcy5QYXJzZXIoe2xleGVyOm5ldyBzLkxleGVyKHQpLHhyZWY6dGhpcyxhbGxvd1N0cmVhbXM6ITB9KTtsZXQgZCxmPW8uZ2V0T2JqKCk7aWYoKDAsaS5pc0NtZCkoZiwieHJlZiIpKXt2YXIgYztkPXRoaXMucHJvY2Vzc1hSZWZUYWJsZShvKSx0aGlzLnRvcERpY3R8fCh0aGlzLnRvcERpY3Q9ZCksZj1kLmdldCgiWFJlZlN0bSIpLE51bWJlci5pc0ludGVnZXIoZikmJiF0aGlzLl94cmVmU3Rtcy5oYXMoZikmJih0aGlzLl94cmVmU3Rtcy5hZGQoZiksdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKGYpLG51bGwhPT0oYz1oKHRoaXMsbikpJiZ2b2lkIDAhPT1jfHx1KHRoaXMsbixmKSl9ZWxzZXtpZighTnVtYmVyLmlzSW50ZWdlcihmKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHN0cmVhbSBoZWFkZXIiKTtpZighKE51bWJlci5pc0ludGVnZXIoby5nZXRPYmooKSkmJigwLGkuaXNDbWQpKG8uZ2V0T2JqKCksIm9iaiIpJiYoZj1vLmdldE9iaigpKWluc3RhbmNlb2YgbC5CYXNlU3RyZWFtKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHN0cmVhbSIpO2lmKGQ9dGhpcy5wcm9jZXNzWFJlZlN0cmVhbShmKSx0aGlzLnRvcERpY3R8fCh0aGlzLnRvcERpY3Q9ZCksIWQpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkZhaWxlZCB0byByZWFkIFhSZWYgc3RyZWFtIil9Zj1kLmdldCgiUHJldiIpLE51bWJlci5pc0ludGVnZXIoZik/dGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKGYpOmYgaW5zdGFuY2VvZiBpLlJlZiYmdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKGYubnVtKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygby5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEuaW5mbykoIih3aGlsZSByZWFkaW5nIFhSZWYpOiAiK2UpfXRoaXMuc3RhcnRYUmVmUXVldWUuc2hpZnQoKX1pZih0aGlzLnRvcERpY3QpcmV0dXJuIHRoaXMudG9wRGljdDtpZighZSl0aHJvdyBuZXcgby5YUmVmUGFyc2VFeGNlcHRpb259Z2V0IGxhc3RYUmVmU3RyZWFtUG9zKCl7dmFyIGU7cmV0dXJuIG51bGwhPT0oZT1oKHRoaXMsbikpJiZ2b2lkIDAhPT1lP2U6dGhpcy5feHJlZlN0bXMuc2l6ZT4wP01hdGgubWF4KC4uLnRoaXMuX3hyZWZTdG1zKTpudWxsfWdldEVudHJ5KGUpe2NvbnN0IHQ9dGhpcy5lbnRyaWVzW2VdO3JldHVybiB0JiYhdC5mcmVlJiZ0Lm9mZnNldD90Om51bGx9ZmV0Y2hJZlJlZihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO3JldHVybiBlIGluc3RhbmNlb2YgaS5SZWY/dGhpcy5mZXRjaChlLHQpOmV9ZmV0Y2goZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtpZighKGUgaW5zdGFuY2VvZiBpLlJlZikpdGhyb3cgbmV3IEVycm9yKCJyZWYgb2JqZWN0IGlzIG5vdCBhIHJlZmVyZW5jZSIpO2NvbnN0IHI9ZS5udW0sbj10aGlzLl9jYWNoZU1hcC5nZXQocik7aWYodm9pZCAwIT09bilyZXR1cm4gbiBpbnN0YW5jZW9mIGkuRGljdCYmIW4ub2JqSWQmJihuLm9iaklkPWUudG9TdHJpbmcoKSksbjtsZXQgcz10aGlzLmdldEVudHJ5KHIpO2lmKG51bGw9PT1zKXJldHVybiB0aGlzLl9jYWNoZU1hcC5zZXQocixzKSxzO2lmKHRoaXMuX3BlbmRpbmdSZWZzLmhhcyhlKSlyZXR1cm4gdGhpcy5fcGVuZGluZ1JlZnMucmVtb3ZlKGUpLCgwLGEud2FybikoIklnbm9yaW5nIGNpcmN1bGFyIHJlZmVyZW5jZTogIi5jb25jYXQoZSwiLiIpKSxpLkNJUkNVTEFSX1JFRjt0aGlzLl9wZW5kaW5nUmVmcy5wdXQoZSk7dHJ5e3M9cy51bmNvbXByZXNzZWQ/dGhpcy5mZXRjaFVuY29tcHJlc3NlZChlLHMsdCk6dGhpcy5mZXRjaENvbXByZXNzZWQoZSxzLHQpLHRoaXMuX3BlbmRpbmdSZWZzLnJlbW92ZShlKX1jYXRjaCh0KXt0aHJvdyB0aGlzLl9wZW5kaW5nUmVmcy5yZW1vdmUoZSksdH1yZXR1cm4gcyBpbnN0YW5jZW9mIGkuRGljdD9zLm9iaklkPWUudG9TdHJpbmcoKTpzIGluc3RhbmNlb2YgbC5CYXNlU3RyZWFtJiYocy5kaWN0Lm9iaklkPWUudG9TdHJpbmcoKSksc31mZXRjaFVuY29tcHJlc3NlZChlLHQpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07Y29uc3Qgbj1lLmdlbjtsZXQgYz1lLm51bTtpZih0LmdlbiE9PW4pe2NvbnN0IHM9IkluY29uc2lzdGVudCBnZW5lcmF0aW9uIGluIFhSZWY6ICIuY29uY2F0KGUpO2lmKHRoaXMuX2dlbmVyYXRpb25GYWxsYmFjayYmdC5nZW48bilyZXR1cm4oMCxhLndhcm4pKHMpLHRoaXMuZmV0Y2hVbmNvbXByZXNzZWQoaS5SZWYuZ2V0KGMsdC5nZW4pLHQscik7dGhyb3cgbmV3IG8uWFJlZkVudHJ5RXhjZXB0aW9uKHMpfWNvbnN0IGg9dGhpcy5zdHJlYW0ubWFrZVN1YlN0cmVhbSh0Lm9mZnNldCt0aGlzLnN0cmVhbS5zdGFydCksdT1uZXcgcy5QYXJzZXIoe2xleGVyOm5ldyBzLkxleGVyKGgpLHhyZWY6dGhpcyxhbGxvd1N0cmVhbXM6ITB9KSxkPXUuZ2V0T2JqKCksZj11LmdldE9iaigpLGc9dS5nZXRPYmooKTtpZihkIT09Y3x8ZiE9PW58fCEoZyBpbnN0YW5jZW9mIGkuQ21kKSl0aHJvdyBuZXcgby5YUmVmRW50cnlFeGNlcHRpb24oIkJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAiLmNvbmNhdChlKSk7aWYoIm9iaiIhPT1nLmNtZCl7aWYoZy5jbWQuc3RhcnRzV2l0aCgib2JqIikmJihjPXBhcnNlSW50KGcuY21kLnN1YnN0cmluZygzKSwxMCksIU51bWJlci5pc05hTihjKSkpcmV0dXJuIGM7dGhyb3cgbmV3IG8uWFJlZkVudHJ5RXhjZXB0aW9uKCJCYWQgKHVuY29tcHJlc3NlZCkgWFJlZiBlbnRyeTogIi5jb25jYXQoZSkpfXJldHVybih0PXRoaXMuZW5jcnlwdCYmIXI/dS5nZXRPYmoodGhpcy5lbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybShjLG4pKTp1LmdldE9iaigpKWluc3RhbmNlb2YgbC5CYXNlU3RyZWFtfHx0aGlzLl9jYWNoZU1hcC5zZXQoYyx0KSx0fWZldGNoQ29tcHJlc3NlZChlLHQpe2NvbnN0IHI9dC5vZmZzZXQsbj10aGlzLmZldGNoKGkuUmVmLmdldChyLDApKTtpZighKG4gaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0pKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJiYWQgT2JqU3RtIHN0cmVhbSIpO2NvbnN0IGM9bi5kaWN0LmdldCgiRmlyc3QiKSxoPW4uZGljdC5nZXQoIk4iKTtpZighTnVtYmVyLmlzSW50ZWdlcihjKXx8IU51bWJlci5pc0ludGVnZXIoaCkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoImludmFsaWQgZmlyc3QgYW5kIG4gcGFyYW1ldGVycyBmb3IgT2JqU3RtIHN0cmVhbSIpO2xldCB1PW5ldyBzLlBhcnNlcih7bGV4ZXI6bmV3IHMuTGV4ZXIobikseHJlZjp0aGlzLGFsbG93U3RyZWFtczohMH0pO2NvbnN0IGQ9bmV3IEFycmF5KGgpLGY9bmV3IEFycmF5KGgpO2ZvcihsZXQgZT0wO2U8aDsrK2Upe2NvbnN0IHQ9dS5nZXRPYmooKTtpZighTnVtYmVyLmlzSW50ZWdlcih0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiaW52YWxpZCBvYmplY3QgbnVtYmVyIGluIHRoZSBPYmpTdG0gc3RyZWFtOiAiLmNvbmNhdCh0KSk7Y29uc3Qgcj11LmdldE9iaigpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHIpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJpbnZhbGlkIG9iamVjdCBvZmZzZXQgaW4gdGhlIE9ialN0bSBzdHJlYW06ICIuY29uY2F0KHIpKTtkW2VdPXQsZltlXT1yfWNvbnN0IGc9KG4uc3RhcnR8fDApK2MscD1uZXcgQXJyYXkoaCk7Zm9yKGxldCBlPTA7ZTxoOysrZSl7Y29uc3QgdD1lPGgtMT9mW2UrMV0tZltlXTp2b2lkIDA7aWYodDwwKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIG9mZnNldCBpbiB0aGUgT2JqU3RtIHN0cmVhbS4iKTt1PW5ldyBzLlBhcnNlcih7bGV4ZXI6bmV3IHMuTGV4ZXIobi5tYWtlU3ViU3RyZWFtKGcrZltlXSx0LG4uZGljdCkpLHhyZWY6dGhpcyxhbGxvd1N0cmVhbXM6ITB9KTtjb25zdCBpPXUuZ2V0T2JqKCk7aWYocFtlXT1pLGkgaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0pY29udGludWU7Y29uc3Qgbz1kW2VdLGM9dGhpcy5lbnRyaWVzW29dO2MmJmMub2Zmc2V0PT09ciYmYy5nZW49PT1lJiZ0aGlzLl9jYWNoZU1hcC5zZXQobyxpKX1pZih2b2lkIDA9PT0odD1wW3QuZ2VuXSkpdGhyb3cgbmV3IG8uWFJlZkVudHJ5RXhjZXB0aW9uKCJCYWQgKGNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICIuY29uY2F0KGUpKTtyZXR1cm4gdH1hc3luYyBmZXRjaElmUmVmQXN5bmMoZSx0KXtyZXR1cm4gZSBpbnN0YW5jZW9mIGkuUmVmP3RoaXMuZmV0Y2hBc3luYyhlLHQpOmV9YXN5bmMgZmV0Y2hBc3luYyhlLHQpe3RyeXtyZXR1cm4gdGhpcy5mZXRjaChlLHQpfWNhdGNoKHIpe2lmKCEociBpbnN0YW5jZW9mIG8uTWlzc2luZ0RhdGFFeGNlcHRpb24pKXRocm93IHI7cmV0dXJuIGF3YWl0IHRoaXMucGRmTWFuYWdlci5yZXF1ZXN0UmFuZ2Uoci5iZWdpbixyLmVuZCksdGhpcy5mZXRjaEFzeW5jKGUsdCl9fWdldENhdGFsb2dPYmooKXtyZXR1cm4gdGhpcy5yb290fX0pfSwoZSx0LHIpPT57dmFyIG4sYSxpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lk1lc3NhZ2VIYW5kbGVyPXZvaWQgMCxyKDIpO3ZhciBjPXIoMTQ0KTtmdW5jdGlvbiBsKGUpe3N3aXRjaChlIGluc3RhbmNlb2YgRXJyb3J8fCJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV8fCgwLGMudW5yZWFjaGFibGUpKCd3cmFwUmVhc29uOiBFeHBlY3RlZCAicmVhc29uIiB0byBiZSBhIChwb3NzaWJseSBjbG9uZWQpIEVycm9yLicpLGUubmFtZSl7Y2FzZSJBYm9ydEV4Y2VwdGlvbiI6cmV0dXJuIG5ldyBjLkFib3J0RXhjZXB0aW9uKGUubWVzc2FnZSk7Y2FzZSJNaXNzaW5nUERGRXhjZXB0aW9uIjpyZXR1cm4gbmV3IGMuTWlzc2luZ1BERkV4Y2VwdGlvbihlLm1lc3NhZ2UpO2Nhc2UiUGFzc3dvcmRFeGNlcHRpb24iOnJldHVybiBuZXcgYy5QYXNzd29yZEV4Y2VwdGlvbihlLm1lc3NhZ2UsZS5jb2RlKTtjYXNlIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiI6cmV0dXJuIG5ldyBjLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihlLm1lc3NhZ2UsZS5zdGF0dXMpO2Nhc2UiVW5rbm93bkVycm9yRXhjZXB0aW9uIjpyZXR1cm4gbmV3IGMuVW5rbm93bkVycm9yRXhjZXB0aW9uKGUubWVzc2FnZSxlLmRldGFpbHMpO2RlZmF1bHQ6cmV0dXJuIG5ldyBjLlVua25vd25FcnJvckV4Y2VwdGlvbihlLm1lc3NhZ2UsZS50b1N0cmluZygpKX19ZnVuY3Rpb24gaChlKXtjb25zdCB0PWUuc3RyZWFtSWQscj10aGlzLnNvdXJjZU5hbWUsbj1lLnNvdXJjZU5hbWUsYT10aGlzLmNvbU9iaixpPXRoaXMscz10aGlzLmFjdGlvbkhhbmRsZXJbZS5hY3Rpb25dLG89e2VucXVldWUoZSl7bGV0IGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjEscz1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMDtpZih0aGlzLmlzQ2FuY2VsbGVkKXJldHVybjtjb25zdCBvPXRoaXMuZGVzaXJlZFNpemU7dGhpcy5kZXNpcmVkU2l6ZS09aSxvPjAmJnRoaXMuZGVzaXJlZFNpemU8PTAmJih0aGlzLnNpbmtDYXBhYmlsaXR5PW5ldyBjLlByb21pc2VDYXBhYmlsaXR5LHRoaXMucmVhZHk9dGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlKSxhLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTpuLHN0cmVhbTo0LHN0cmVhbUlkOnQsY2h1bms6ZX0scyl9LGNsb3NlKCl7dGhpcy5pc0NhbmNlbGxlZHx8KHRoaXMuaXNDYW5jZWxsZWQ9ITAsYS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpyLHRhcmdldE5hbWU6bixzdHJlYW06MyxzdHJlYW1JZDp0fSksZGVsZXRlIGkuc3RyZWFtU2lua3NbdF0pfSxlcnJvcihlKXsoMCxjLmFzc2VydCkoZSBpbnN0YW5jZW9mIEVycm9yLCJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKSx0aGlzLmlzQ2FuY2VsbGVkfHwodGhpcy5pc0NhbmNlbGxlZD0hMCxhLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTpuLHN0cmVhbTo1LHN0cmVhbUlkOnQscmVhc29uOmwoZSl9KSl9LHNpbmtDYXBhYmlsaXR5Om5ldyBjLlByb21pc2VDYXBhYmlsaXR5LG9uUHVsbDpudWxsLG9uQ2FuY2VsOm51bGwsaXNDYW5jZWxsZWQ6ITEsZGVzaXJlZFNpemU6ZS5kZXNpcmVkU2l6ZSxyZWFkeTpudWxsfTtvLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKSxvLnJlYWR5PW8uc2lua0NhcGFiaWxpdHkucHJvbWlzZSx0aGlzLnN0cmVhbVNpbmtzW3RdPW8sbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQpe3QocyhlLmRhdGEsbykpfSkpLnRoZW4oKGZ1bmN0aW9uKCl7YS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpyLHRhcmdldE5hbWU6bixzdHJlYW06OCxzdHJlYW1JZDp0LHN1Y2Nlc3M6ITB9KX0pLChmdW5jdGlvbihlKXthLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTpuLHN0cmVhbTo4LHN0cmVhbUlkOnQscmVhc29uOmwoZSl9KX0pKX1mdW5jdGlvbiB1KGUpe2NvbnN0IHQ9ZS5zdHJlYW1JZCxyPXRoaXMuc291cmNlTmFtZSxuPWUuc291cmNlTmFtZSxhPXRoaXMuY29tT2JqLHM9dGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XSxoPXRoaXMuc3RyZWFtU2lua3NbdF07c3dpdGNoKGUuc3RyZWFtKXtjYXNlIDg6ZS5zdWNjZXNzP3Muc3RhcnRDYWxsLnJlc29sdmUoKTpzLnN0YXJ0Q2FsbC5yZWplY3QobChlLnJlYXNvbikpO2JyZWFrO2Nhc2UgNzplLnN1Y2Nlc3M/cy5wdWxsQ2FsbC5yZXNvbHZlKCk6cy5wdWxsQ2FsbC5yZWplY3QobChlLnJlYXNvbikpO2JyZWFrO2Nhc2UgNjppZighaCl7YS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpyLHRhcmdldE5hbWU6bixzdHJlYW06NyxzdHJlYW1JZDp0LHN1Y2Nlc3M6ITB9KTticmVha31oLmRlc2lyZWRTaXplPD0wJiZlLmRlc2lyZWRTaXplPjAmJmguc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpLGguZGVzaXJlZFNpemU9ZS5kZXNpcmVkU2l6ZSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7dmFyIHQ7ZShudWxsPT09KHQ9aC5vblB1bGwpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmNhbGwoaCkpfSkpLnRoZW4oKGZ1bmN0aW9uKCl7YS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpyLHRhcmdldE5hbWU6bixzdHJlYW06NyxzdHJlYW1JZDp0LHN1Y2Nlc3M6ITB9KX0pLChmdW5jdGlvbihlKXthLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTpuLHN0cmVhbTo3LHN0cmVhbUlkOnQscmVhc29uOmwoZSl9KX0pKTticmVhaztjYXNlIDQ6aWYoKDAsYy5hc3NlcnQpKHMsImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKSxzLmlzQ2xvc2VkKWJyZWFrO3MuY29udHJvbGxlci5lbnF1ZXVlKGUuY2h1bmspO2JyZWFrO2Nhc2UgMzppZigoMCxjLmFzc2VydCkocywiY2xvc2Ugc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKSxzLmlzQ2xvc2VkKWJyZWFrO3MuaXNDbG9zZWQ9ITAscy5jb250cm9sbGVyLmNsb3NlKCksbyh0aGlzLGksZCkuY2FsbCh0aGlzLHMsdCk7YnJlYWs7Y2FzZSA1OigwLGMuYXNzZXJ0KShzLCJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpLHMuY29udHJvbGxlci5lcnJvcihsKGUucmVhc29uKSksbyh0aGlzLGksZCkuY2FsbCh0aGlzLHMsdCk7YnJlYWs7Y2FzZSAyOmUuc3VjY2Vzcz9zLmNhbmNlbENhbGwucmVzb2x2ZSgpOnMuY2FuY2VsQ2FsbC5yZWplY3QobChlLnJlYXNvbikpLG8odGhpcyxpLGQpLmNhbGwodGhpcyxzLHQpO2JyZWFrO2Nhc2UgMTppZighaClicmVhaztuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCl7dmFyIHI7dChudWxsPT09KHI9aC5vbkNhbmNlbCl8fHZvaWQgMD09PXI/dm9pZCAwOnIuY2FsbChoLGwoZS5yZWFzb24pKSl9KSkudGhlbigoZnVuY3Rpb24oKXthLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTpuLHN0cmVhbToyLHN0cmVhbUlkOnQsc3VjY2VzczohMH0pfSksKGZ1bmN0aW9uKGUpe2EucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6cix0YXJnZXROYW1lOm4sc3RyZWFtOjIsc3RyZWFtSWQ6dCxyZWFzb246bChlKX0pfSkpLGguc2lua0NhcGFiaWxpdHkucmVqZWN0KGwoZS5yZWFzb24pKSxoLmlzQ2FuY2VsbGVkPSEwLGRlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW3RdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHN0cmVhbSBjYXNlIil9fWFzeW5jIGZ1bmN0aW9uIGQoZSx0KXt2YXIgcixuLGE7YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtudWxsPT09KHI9ZS5zdGFydENhbGwpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnByb21pc2UsbnVsbD09PShuPWUucHVsbENhbGwpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnByb21pc2UsbnVsbD09PShhPWUuY2FuY2VsQ2FsbCl8fHZvaWQgMD09PWE/dm9pZCAwOmEucHJvbWlzZV0pLGRlbGV0ZSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdfXQuTWVzc2FnZUhhbmRsZXI9KG49bmV3IFdlYWtTZXQsYT1uZXcgV2Vha1NldCxpPW5ldyBXZWFrU2V0LGNsYXNze2NvbnN0cnVjdG9yKGUsdCxyKXtzKHRoaXMsaSkscyh0aGlzLGEpLHModGhpcyxuKSx0aGlzLnNvdXJjZU5hbWU9ZSx0aGlzLnRhcmdldE5hbWU9dCx0aGlzLmNvbU9iaj1yLHRoaXMuY2FsbGJhY2tJZD0xLHRoaXMuc3RyZWFtSWQ9MSx0aGlzLnN0cmVhbVNpbmtzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5zdHJlYW1Db250cm9sbGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmFjdGlvbkhhbmRsZXI9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9vbkNvbU9iak9uTWVzc2FnZT1lPT57Y29uc3QgdD1lLmRhdGE7aWYodC50YXJnZXROYW1lIT09dGhpcy5zb3VyY2VOYW1lKXJldHVybjtpZih0LnN0cmVhbSlyZXR1cm4gdm9pZCBvKHRoaXMsYSx1KS5jYWxsKHRoaXMsdCk7aWYodC5jYWxsYmFjayl7Y29uc3QgZT10LmNhbGxiYWNrSWQscj10aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2VdO2lmKCFyKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgIi5jb25jYXQoZSkpO2lmKGRlbGV0ZSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2VdLDE9PT10LmNhbGxiYWNrKXIucmVzb2x2ZSh0LmRhdGEpO2Vsc2V7aWYoMiE9PXQuY2FsbGJhY2spdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2UiKTtyLnJlamVjdChsKHQucmVhc29uKSl9cmV0dXJufWNvbnN0IGk9dGhpcy5hY3Rpb25IYW5kbGVyW3QuYWN0aW9uXTtpZighaSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gYWN0aW9uIGZyb20gd29ya2VyOiAiLmNvbmNhdCh0LmFjdGlvbikpO2lmKHQuY2FsbGJhY2tJZCl7Y29uc3QgZT10aGlzLnNvdXJjZU5hbWUsbj10LnNvdXJjZU5hbWU7bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe2UoaSh0LmRhdGEpKX0pKS50aGVuKChmdW5jdGlvbihhKXtyLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmUsdGFyZ2V0TmFtZTpuLGNhbGxiYWNrOjEsY2FsbGJhY2tJZDp0LmNhbGxiYWNrSWQsZGF0YTphfSl9KSwoZnVuY3Rpb24oYSl7ci5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTplLHRhcmdldE5hbWU6bixjYWxsYmFjazoyLGNhbGxiYWNrSWQ6dC5jYWxsYmFja0lkLHJlYXNvbjpsKGEpfSl9KSl9ZWxzZSB0LnN0cmVhbUlkP28odGhpcyxuLGgpLmNhbGwodGhpcyx0KTppKHQuZGF0YSl9LHIuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpfW9uKGUsdCl7Y29uc3Qgcj10aGlzLmFjdGlvbkhhbmRsZXI7aWYocltlXSl0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgIicuY29uY2F0KGUsJyInKSk7cltlXT10fXNlbmQoZSx0LHIpe3RoaXMuY29tT2JqLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnRoaXMuc291cmNlTmFtZSx0YXJnZXROYW1lOnRoaXMudGFyZ2V0TmFtZSxhY3Rpb246ZSxkYXRhOnR9LHIpfXNlbmRXaXRoUHJvbWlzZShlLHQscil7Y29uc3Qgbj10aGlzLmNhbGxiYWNrSWQrKyxhPW5ldyBjLlByb21pc2VDYXBhYmlsaXR5O3RoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbbl09YTt0cnl7dGhpcy5jb21PYmoucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6dGhpcy5zb3VyY2VOYW1lLHRhcmdldE5hbWU6dGhpcy50YXJnZXROYW1lLGFjdGlvbjplLGNhbGxiYWNrSWQ6bixkYXRhOnR9LHIpfWNhdGNoKGUpe2EucmVqZWN0KGUpfXJldHVybiBhLnByb21pc2V9c2VuZFdpdGhTdHJlYW0oZSx0LHIsbil7Y29uc3QgYT10aGlzLnN0cmVhbUlkKyssaT10aGlzLnNvdXJjZU5hbWUscz10aGlzLnRhcmdldE5hbWUsbz10aGlzLmNvbU9iajtyZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtzdGFydDpyPT57Y29uc3QgbD1uZXcgYy5Qcm9taXNlQ2FwYWJpbGl0eTtyZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyc1thXT17Y29udHJvbGxlcjpyLHN0YXJ0Q2FsbDpsLHB1bGxDYWxsOm51bGwsY2FuY2VsQ2FsbDpudWxsLGlzQ2xvc2VkOiExfSxvLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmksdGFyZ2V0TmFtZTpzLGFjdGlvbjplLHN0cmVhbUlkOmEsZGF0YTp0LGRlc2lyZWRTaXplOnIuZGVzaXJlZFNpemV9LG4pLGwucHJvbWlzZX0scHVsbDplPT57Y29uc3QgdD1uZXcgYy5Qcm9taXNlQ2FwYWJpbGl0eTtyZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyc1thXS5wdWxsQ2FsbD10LG8ucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6aSx0YXJnZXROYW1lOnMsc3RyZWFtOjYsc3RyZWFtSWQ6YSxkZXNpcmVkU2l6ZTplLmRlc2lyZWRTaXplfSksdC5wcm9taXNlfSxjYW5jZWw6ZT0+eygwLGMuYXNzZXJ0KShlIGluc3RhbmNlb2YgRXJyb3IsImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTtjb25zdCB0PW5ldyBjLlByb21pc2VDYXBhYmlsaXR5O3JldHVybiB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW2FdLmNhbmNlbENhbGw9dCx0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW2FdLmlzQ2xvc2VkPSEwLG8ucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6aSx0YXJnZXROYW1lOnMsc3RyZWFtOjEsc3RyZWFtSWQ6YSxyZWFzb246bChlKX0pLHQucHJvbWlzZX19LHIpfWRlc3Ryb3koKXt0aGlzLmNvbU9iai5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSl9fSl9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5QREZXb3JrZXJTdHJlYW09dm9pZCAwLHIoMTM5KTt2YXIgbj1yKDE0NCk7dC5QREZXb3JrZXJTdHJlYW09Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fbXNnSGFuZGxlcj1lLHRoaXMuX2NvbnRlbnRMZW5ndGg9bnVsbCx0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj1udWxsLHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnM9W119Z2V0RnVsbFJlYWRlcigpe3JldHVybigwLG4uYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIlBERldvcmtlclN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpLHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPW5ldyBhKHRoaXMuX21zZ0hhbmRsZXIpLHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyfWdldFJhbmdlUmVhZGVyKGUsdCl7Y29uc3Qgcj1uZXcgaShlLHQsdGhpcy5fbXNnSGFuZGxlcik7cmV0dXJuIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyKSxyfWNhbmNlbEFsbFJlcXVlc3RzKGUpe3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyJiZ0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwoZSk7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSl0LmNhbmNlbChlKX19O2NsYXNzIGF7Y29uc3RydWN0b3IoZSl7dGhpcy5fbXNnSGFuZGxlcj1lLHRoaXMub25Qcm9ncmVzcz1udWxsLHRoaXMuX2NvbnRlbnRMZW5ndGg9bnVsbCx0aGlzLl9pc1JhbmdlU3VwcG9ydGVkPSExLHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSExO2NvbnN0IHQ9dGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0UmVhZGVyIik7dGhpcy5fcmVhZGVyPXQuZ2V0UmVhZGVyKCksdGhpcy5faGVhZGVyc1JlYWR5PXRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJSZWFkZXJIZWFkZXJzUmVhZHkiKS50aGVuKChlPT57dGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ9ZS5pc1N0cmVhbWluZ1N1cHBvcnRlZCx0aGlzLl9pc1JhbmdlU3VwcG9ydGVkPWUuaXNSYW5nZVN1cHBvcnRlZCx0aGlzLl9jb250ZW50TGVuZ3RoPWUuY29udGVudExlbmd0aH0pKX1nZXQgaGVhZGVyc1JlYWR5KCl7cmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeX1nZXQgY29udGVudExlbmd0aCgpe3JldHVybiB0aGlzLl9jb250ZW50TGVuZ3RofWdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpe3JldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZH1nZXQgaXNSYW5nZVN1cHBvcnRlZCgpe3JldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkfWFzeW5jIHJlYWQoKXtjb25zdHt2YWx1ZTplLGRvbmU6dH09YXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtyZXR1cm4gdD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9Ont2YWx1ZTplLmJ1ZmZlcixkb25lOiExfX1jYW5jZWwoZSl7dGhpcy5fcmVhZGVyLmNhbmNlbChlKX19Y2xhc3MgaXtjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5fbXNnSGFuZGxlcj1yLHRoaXMub25Qcm9ncmVzcz1udWxsO2NvbnN0IG49dGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0UmFuZ2VSZWFkZXIiLHtiZWdpbjplLGVuZDp0fSk7dGhpcy5fcmVhZGVyPW4uZ2V0UmVhZGVyKCl9Z2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCl7cmV0dXJuITF9YXN5bmMgcmVhZCgpe2NvbnN0e3ZhbHVlOmUsZG9uZTp0fT1hd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpO3JldHVybiB0P3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06e3ZhbHVlOmUuYnVmZmVyLGRvbmU6ITF9fWNhbmNlbChlKXt0aGlzLl9yZWFkZXIuY2FuY2VsKGUpfX19XSx0PXt9O2Z1bmN0aW9uIG4ocil7dmFyIGE9dFtyXTtpZih2b2lkIDAhPT1hKXJldHVybiBhLmV4cG9ydHM7dmFyIGk9dFtyXT17ZXhwb3J0czp7fX07cmV0dXJuIGVbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5leHBvcnRzfW4uZD0oZSx0KT0+e2Zvcih2YXIgciBpbiB0KW4ubyh0LHIpJiYhbi5vKGUscikmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIse2VudW1lcmFibGU6ITAsZ2V0OnRbcl19KX0sbi5vPShlLHQpPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KSxuLnI9ZT0+eyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9O3ZhciBhPXt9O3JldHVybigoKT0+e3ZhciBlPWE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJXb3JrZXJNZXNzYWdlSGFuZGxlciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuV29ya2VyTWVzc2FnZUhhbmRsZXJ9fSk7dmFyIHQ9bigxKX0pKCksYX0pKCksIm9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2UuZXhwb3J0cz1hKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmci5hbWRPP2RlZmluZSgicGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyIixbXSxhKToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0c1sicGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyIl09YSgpOm5bInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciJdPW4ucGRmanNXb3JrZXI9YSgpfSw5NjYyOihlLHQscik9Pnt2YXIgbj1yKDYxNCksYT1yKDYzMzApLGk9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZihuKGUpKXJldHVybiBlO3Rocm93IGkoYShlKSsiIGlzIG5vdCBhIGZ1bmN0aW9uIil9fSw5NDgzOihlLHQscik9Pnt2YXIgbj1yKDQ0MTEpLGE9cig2MzMwKSxpPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYobihlKSlyZXR1cm4gZTt0aHJvdyBpKGEoZSkrIiBpcyBub3QgYSBjb25zdHJ1Y3RvciIpfX0sNjA3NzooZSx0LHIpPT57dmFyIG49cig2MTQpLGE9U3RyaW5nLGk9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGV8fG4oZSkpcmV0dXJuIGU7dGhyb3cgaSgiQ2FuJ3Qgc2V0ICIrYShlKSsiIGFzIGEgcHJvdG90eXBlIil9fSwxMjIzOihlLHQscik9Pnt2YXIgbj1yKDUxMTIpLGE9cigzMCksaT1yKDMwNzApLmYscz1uKCJ1bnNjb3BhYmxlcyIpLG89QXJyYXkucHJvdG90eXBlO251bGw9PW9bc10mJmkobyxzLHtjb25maWd1cmFibGU6ITAsdmFsdWU6YShudWxsKX0pLGUuZXhwb3J0cz1mdW5jdGlvbihlKXtvW3NdW2VdPSEwfX0sMTUzMDooZSx0LHIpPT57dmFyIG49cig4NzEwKS5jaGFyQXQ7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdCsocj9uKGUsdCkubGVuZ3RoOjEpfX0sNTc4NzooZSx0LHIpPT57dmFyIG49cig3OTc2KSxhPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihuKHQsZSkpcmV0dXJuIGU7dGhyb3cgYSgiSW5jb3JyZWN0IGludm9jYXRpb24iKX19LDk2NzA6KGUsdCxyKT0+e3ZhciBuPXIoMTExKSxhPVN0cmluZyxpPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYobihlKSlyZXR1cm4gZTt0aHJvdyBpKGEoZSkrIiBpcyBub3QgYW4gb2JqZWN0Iil9fSwzMDEzOmU9PntlLmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmInVuZGVmaW5lZCIhPXR5cGVvZiBEYXRhVmlld30sNzU1NjooZSx0LHIpPT57dmFyIG49cig3MjkzKTtlLmV4cG9ydHM9bigoZnVuY3Rpb24oKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIpe3ZhciBlPW5ldyBBcnJheUJ1ZmZlcig4KTtPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiYSIse3ZhbHVlOjh9KX19KSl9LDI2MDooZSx0LHIpPT57dmFyIG4sYSxpLHM9cigzMDEzKSxvPXIoOTc4MSksYz1yKDc4NTQpLGw9cig2MTQpLGg9cigxMTEpLHU9cigyNTk3KSxkPXIoNjQ4KSxmPXIoNjMzMCksZz1yKDg4ODApLHA9cig4MDUyKSxtPXIoNzA0NSksYj1yKDc5NzYpLHk9cig5NTE4KSx3PXIoNzY3NCksdj1yKDUxMTIpLHg9cig5NzExKSxTPXIoOTkwOSksQT1TLmVuZm9yY2Usaz1TLmdldCxDPWMuSW50OEFycmF5LE89QyYmQy5wcm90b3R5cGUsRj1jLlVpbnQ4Q2xhbXBlZEFycmF5LEk9RiYmRi5wcm90b3R5cGUsVD1DJiZ5KEMpLE09TyYmeShPKSxFPU9iamVjdC5wcm90b3R5cGUsUD1jLlR5cGVFcnJvcixSPXYoInRvU3RyaW5nVGFnIiksTj14KCJUWVBFRF9BUlJBWV9UQUciKSxEPSJUeXBlZEFycmF5Q29uc3RydWN0b3IiLEI9cyYmISF3JiYiT3BlcmEiIT09ZChjLm9wZXJhKSxMPSExLF89e0ludDhBcnJheToxLFVpbnQ4QXJyYXk6MSxVaW50OENsYW1wZWRBcnJheToxLEludDE2QXJyYXk6MixVaW50MTZBcnJheToyLEludDMyQXJyYXk6NCxVaW50MzJBcnJheTo0LEZsb2F0MzJBcnJheTo0LEZsb2F0NjRBcnJheTo4fSxqPXtCaWdJbnQ2NEFycmF5OjgsQmlnVWludDY0QXJyYXk6OH0sVT1mdW5jdGlvbihlKXt2YXIgdD15KGUpO2lmKGgodCkpe3ZhciByPWsodCk7cmV0dXJuIHImJnUocixEKT9yW0RdOlUodCl9fSwkPWZ1bmN0aW9uKGUpe2lmKCFoKGUpKXJldHVybiExO3ZhciB0PWQoZSk7cmV0dXJuIHUoXyx0KXx8dShqLHQpfTtmb3IobiBpbiBfKShpPShhPWNbbl0pJiZhLnByb3RvdHlwZSk/QShpKVtEXT1hOkI9ITE7Zm9yKG4gaW4gaikoaT0oYT1jW25dKSYmYS5wcm90b3R5cGUpJiYoQShpKVtEXT1hKTtpZigoIUJ8fCFsKFQpfHxUPT09RnVuY3Rpb24ucHJvdG90eXBlKSYmKFQ9ZnVuY3Rpb24oKXt0aHJvdyBQKCJJbmNvcnJlY3QgaW52b2NhdGlvbiIpfSxCKSlmb3IobiBpbiBfKWNbbl0mJncoY1tuXSxUKTtpZigoIUJ8fCFNfHxNPT09RSkmJihNPVQucHJvdG90eXBlLEIpKWZvcihuIGluIF8pY1tuXSYmdyhjW25dLnByb3RvdHlwZSxNKTtpZihCJiZ5KEkpIT09TSYmdyhJLE0pLG8mJiF1KE0sUikpZm9yKG4gaW4gTD0hMCxtKE0sUix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBoKHRoaXMpP3RoaXNbTl06dm9pZCAwfX0pLF8pY1tuXSYmZyhjW25dLE4sbik7ZS5leHBvcnRzPXtOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTOkIsVFlQRURfQVJSQVlfVEFHOkwmJk4sYVR5cGVkQXJyYXk6ZnVuY3Rpb24oZSl7aWYoJChlKSlyZXR1cm4gZTt0aHJvdyBQKCJUYXJnZXQgaXMgbm90IGEgdHlwZWQgYXJyYXkiKX0sYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtpZihsKGUpJiYoIXd8fGIoVCxlKSkpcmV0dXJuIGU7dGhyb3cgUChmKGUpKyIgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3IiKX0sZXhwb3J0VHlwZWRBcnJheU1ldGhvZDpmdW5jdGlvbihlLHQscixuKXtpZihvKXtpZihyKWZvcih2YXIgYSBpbiBfKXt2YXIgaT1jW2FdO2lmKGkmJnUoaS5wcm90b3R5cGUsZSkpdHJ5e2RlbGV0ZSBpLnByb3RvdHlwZVtlXX1jYXRjaChyKXt0cnl7aS5wcm90b3R5cGVbZV09dH1jYXRjaChlKXt9fX1NW2VdJiYhcnx8cChNLGUscj90OkImJk9bZV18fHQsbil9fSxleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kOmZ1bmN0aW9uKGUsdCxyKXt2YXIgbixhO2lmKG8pe2lmKHcpe2lmKHIpZm9yKG4gaW4gXylpZigoYT1jW25dKSYmdShhLGUpKXRyeXtkZWxldGUgYVtlXX1jYXRjaChlKXt9aWYoVFtlXSYmIXIpcmV0dXJuO3RyeXtyZXR1cm4gcChULGUscj90OkImJlRbZV18fHQpfWNhdGNoKGUpe319Zm9yKG4gaW4gXykhKGE9Y1tuXSl8fGFbZV0mJiFyfHxwKGEsZSx0KX19LGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjpVLGlzVmlldzpmdW5jdGlvbihlKXtpZighaChlKSlyZXR1cm4hMTt2YXIgdD1kKGUpO3JldHVybiJEYXRhVmlldyI9PT10fHx1KF8sdCl8fHUoaix0KX0saXNUeXBlZEFycmF5OiQsVHlwZWRBcnJheTpULFR5cGVkQXJyYXlQcm90b3R5cGU6TX19LDMzMzE6KGUsdCxyKT0+e3ZhciBuPXIoNzg1NCksYT1yKDE3MDIpLGk9cig5NzgxKSxzPXIoMzAxMyksbz1yKDY1MzApLGM9cig4ODgwKSxsPXIoNzA0NSksaD1yKDkxOTApLHU9cig3MjkzKSxkPXIoNTc4NyksZj1yKDkzMDMpLGc9cig3NDY2KSxwPXIoNzA2NyksbT1yKDExNzkpLGI9cig5NTE4KSx5PXIoNzY3NCksdz1yKDgwMDYpLmYsdj1yKDEyODUpLHg9cigxNTg5KSxTPXIoODAwMyksQT1yKDk5MDkpLGs9by5QUk9QRVIsQz1vLkNPTkZJR1VSQUJMRSxPPSJBcnJheUJ1ZmZlciIsRj0iRGF0YVZpZXciLEk9InByb3RvdHlwZSIsVD0iV3JvbmcgaW5kZXgiLE09QS5nZXR0ZXJGb3IoTyksRT1BLmdldHRlckZvcihGKSxQPUEuc2V0LFI9bltPXSxOPVIsRD1OJiZOW0ldLEI9bltGXSxMPUImJkJbSV0sXz1PYmplY3QucHJvdG90eXBlLGo9bi5BcnJheSxVPW4uUmFuZ2VFcnJvciwkPWEodiksWD1hKFtdLnJldmVyc2UpLEg9bS5wYWNrLHE9bS51bnBhY2ssej1mdW5jdGlvbihlKXtyZXR1cm5bMjU1JmVdfSxHPWZ1bmN0aW9uKGUpe3JldHVyblsyNTUmZSxlPj44JjI1NV19LFc9ZnVuY3Rpb24oZSl7cmV0dXJuWzI1NSZlLGU+PjgmMjU1LGU+PjE2JjI1NSxlPj4yNCYyNTVdfSxWPWZ1bmN0aW9uKGUpe3JldHVybiBlWzNdPDwyNHxlWzJdPDwxNnxlWzFdPDw4fGVbMF19LEs9ZnVuY3Rpb24oZSl7cmV0dXJuIEgoZSwyMyw0KX0sWT1mdW5jdGlvbihlKXtyZXR1cm4gSChlLDUyLDgpfSxKPWZ1bmN0aW9uKGUsdCxyKXtsKGVbSV0sdCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByKHRoaXMpW3RdfX0pfSxaPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBhPUUoZSksaT1wKHIpLHM9ISFuO2lmKGkrdD5hLmJ5dGVMZW5ndGgpdGhyb3cgVShUKTt2YXIgbz1hLmJ5dGVzLGM9aSthLmJ5dGVPZmZzZXQsbD14KG8sYyxjK3QpO3JldHVybiBzP2w6WChsKX0sUT1mdW5jdGlvbihlLHQscixuLGEsaSl7dmFyIHM9RShlKSxvPXAociksYz1uKCthKSxsPSEhaTtpZihvK3Q+cy5ieXRlTGVuZ3RoKXRocm93IFUoVCk7Zm9yKHZhciBoPXMuYnl0ZXMsdT1vK3MuYnl0ZU9mZnNldCxkPTA7ZDx0O2QrKyloW3UrZF09Y1tsP2Q6dC1kLTFdfTtpZihzKXt2YXIgZWU9ayYmUi5uYW1lIT09TztpZih1KChmdW5jdGlvbigpe1IoMSl9KSkmJnUoKGZ1bmN0aW9uKCl7bmV3IFIoLTEpfSkpJiYhdSgoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFIsbmV3IFIoMS41KSxuZXcgUihOYU4pLDEhPVIubGVuZ3RofHxlZSYmIUN9KSkpZWUmJkMmJmMoUiwibmFtZSIsTyk7ZWxzZXsoTj1mdW5jdGlvbihlKXtyZXR1cm4gZCh0aGlzLEQpLG5ldyBSKHAoZSkpfSlbSV09RDtmb3IodmFyIHRlLHJlPXcoUiksbmU9MDtyZS5sZW5ndGg+bmU7KSh0ZT1yZVtuZSsrXSlpbiBOfHxjKE4sdGUsUlt0ZV0pO0QuY29uc3RydWN0b3I9Tn15JiZiKEwpIT09XyYmeShMLF8pO3ZhciBhZT1uZXcgQihuZXcgTigyKSksaWU9YShMLnNldEludDgpO2FlLnNldEludDgoMCwyMTQ3NDgzNjQ4KSxhZS5zZXRJbnQ4KDEsMjE0NzQ4MzY0OSksIWFlLmdldEludDgoMCkmJmFlLmdldEludDgoMSl8fGgoTCx7c2V0SW50ODpmdW5jdGlvbihlLHQpe2llKHRoaXMsZSx0PDwyND4+MjQpfSxzZXRVaW50ODpmdW5jdGlvbihlLHQpe2llKHRoaXMsZSx0PDwyND4+MjQpfX0se3Vuc2FmZTohMH0pfWVsc2UgRD0oTj1mdW5jdGlvbihlKXtkKHRoaXMsRCk7dmFyIHQ9cChlKTtQKHRoaXMse3R5cGU6TyxieXRlczokKGoodCksMCksYnl0ZUxlbmd0aDp0fSksaXx8KHRoaXMuYnl0ZUxlbmd0aD10LHRoaXMuZGV0YWNoZWQ9ITEpfSlbSV0sTD0oQj1mdW5jdGlvbihlLHQscil7ZCh0aGlzLEwpLGQoZSxEKTt2YXIgbj1NKGUpLGE9bi5ieXRlTGVuZ3RoLHM9Zih0KTtpZihzPDB8fHM+YSl0aHJvdyBVKCJXcm9uZyBvZmZzZXQiKTtpZihzKyhyPXZvaWQgMD09PXI/YS1zOmcocikpPmEpdGhyb3cgVSgiV3JvbmcgbGVuZ3RoIik7UCh0aGlzLHt0eXBlOkYsYnVmZmVyOmUsYnl0ZUxlbmd0aDpyLGJ5dGVPZmZzZXQ6cyxieXRlczpuLmJ5dGVzfSksaXx8KHRoaXMuYnVmZmVyPWUsdGhpcy5ieXRlTGVuZ3RoPXIsdGhpcy5ieXRlT2Zmc2V0PXMpfSlbSV0saSYmKEooTiwiYnl0ZUxlbmd0aCIsTSksSihCLCJidWZmZXIiLEUpLEooQiwiYnl0ZUxlbmd0aCIsRSksSihCLCJieXRlT2Zmc2V0IixFKSksaChMLHtnZXRJbnQ4OmZ1bmN0aW9uKGUpe3JldHVybiBaKHRoaXMsMSxlKVswXTw8MjQ+PjI0fSxnZXRVaW50ODpmdW5jdGlvbihlKXtyZXR1cm4gWih0aGlzLDEsZSlbMF19LGdldEludDE2OmZ1bmN0aW9uKGUpe3ZhciB0PVoodGhpcywyLGUsYXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0pO3JldHVybih0WzFdPDw4fHRbMF0pPDwxNj4+MTZ9LGdldFVpbnQxNjpmdW5jdGlvbihlKXt2YXIgdD1aKHRoaXMsMixlLGFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdKTtyZXR1cm4gdFsxXTw8OHx0WzBdfSxnZXRJbnQzMjpmdW5jdGlvbihlKXtyZXR1cm4gVihaKHRoaXMsNCxlLGFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdKSl9LGdldFVpbnQzMjpmdW5jdGlvbihlKXtyZXR1cm4gVihaKHRoaXMsNCxlLGFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdKSk+Pj4wfSxnZXRGbG9hdDMyOmZ1bmN0aW9uKGUpe3JldHVybiBxKFoodGhpcyw0LGUsYXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0pLDIzKX0sZ2V0RmxvYXQ2NDpmdW5jdGlvbihlKXtyZXR1cm4gcShaKHRoaXMsOCxlLGFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdKSw1Mil9LHNldEludDg6ZnVuY3Rpb24oZSx0KXtRKHRoaXMsMSxlLHosdCl9LHNldFVpbnQ4OmZ1bmN0aW9uKGUsdCl7USh0aGlzLDEsZSx6LHQpfSxzZXRJbnQxNjpmdW5jdGlvbihlLHQpe1EodGhpcywyLGUsRyx0LGFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdKX0sc2V0VWludDE2OmZ1bmN0aW9uKGUsdCl7USh0aGlzLDIsZSxHLHQsYXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0pfSxzZXRJbnQzMjpmdW5jdGlvbihlLHQpe1EodGhpcyw0LGUsVyx0LGFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdKX0sc2V0VWludDMyOmZ1bmN0aW9uKGUsdCl7USh0aGlzLDQsZSxXLHQsYXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0pfSxzZXRGbG9hdDMyOmZ1bmN0aW9uKGUsdCl7USh0aGlzLDQsZSxLLHQsYXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0pfSxzZXRGbG9hdDY0OmZ1bmN0aW9uKGUsdCl7USh0aGlzLDgsZSxZLHQsYXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0pfX0pO1MoTixPKSxTKEIsRiksZS5leHBvcnRzPXtBcnJheUJ1ZmZlcjpOLERhdGFWaWV3OkJ9fSwxMjg1OihlLHQscik9Pnt2YXIgbj1yKDc5MDgpLGE9cigxNDAwKSxpPXIoNjI0NCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1uKHRoaXMpLHI9aSh0KSxzPWFyZ3VtZW50cy5sZW5ndGgsbz1hKHM+MT9hcmd1bWVudHNbMV06dm9pZCAwLHIpLGM9cz4yP2FyZ3VtZW50c1syXTp2b2lkIDAsbD12b2lkIDA9PT1jP3I6YShjLHIpO2w+bzspdFtvKytdPWU7cmV0dXJuIHR9fSw3NzQ1OihlLHQscik9Pnt2YXIgbj1yKDYyNDQpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj0wLGE9bih0KSxpPW5ldyBlKGEpO2E+cjspaVtyXT10W3IrK107cmV0dXJuIGl9fSw4NDU3OihlLHQscik9Pnt2YXIgbj1yKDk5NzQpLGE9cig2OTE2KSxpPXIoNzkwOCkscz1yKDM0MTEpLG89cig3NjU5KSxjPXIoNDQxMSksbD1yKDYyNDQpLGg9cig2MTM1KSx1PXIoNDEyMSksZD1yKDEyNDYpLGY9QXJyYXk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWkoZSkscj1jKHRoaXMpLGc9YXJndW1lbnRzLmxlbmd0aCxwPWc+MT9hcmd1bWVudHNbMV06dm9pZCAwLG09dm9pZCAwIT09cDttJiYocD1uKHAsZz4yP2FyZ3VtZW50c1syXTp2b2lkIDApKTt2YXIgYix5LHcsdix4LFMsQT1kKHQpLGs9MDtpZighQXx8dGhpcz09PWYmJm8oQSkpZm9yKGI9bCh0KSx5PXI/bmV3IHRoaXMoYik6ZihiKTtiPms7aysrKVM9bT9wKHRba10sayk6dFtrXSxoKHksayxTKTtlbHNlIGZvcih4PSh2PXUodCxBKSkubmV4dCx5PXI/bmV3IHRoaXM6W107ISh3PWEoeCx2KSkuZG9uZTtrKyspUz1tP3ModixwLFt3LnZhbHVlLGtdLCEwKTp3LnZhbHVlLGgoeSxrLFMpO3JldHVybiB5Lmxlbmd0aD1rLHl9fSwxMzE4OihlLHQscik9Pnt2YXIgbj1yKDU2NTYpLGE9cigxNDAwKSxpPXIoNjI0NCkscz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyLHMpe3ZhciBvLGM9bih0KSxsPWkoYyksaD1hKHMsbCk7aWYoZSYmciE9cil7Zm9yKDtsPmg7KWlmKChvPWNbaCsrXSkhPW8pcmV0dXJuITB9ZWxzZSBmb3IoO2w+aDtoKyspaWYoKGV8fGggaW4gYykmJmNbaF09PT1yKXJldHVybiBlfHxofHwwO3JldHVybiFlJiYtMX19O2UuZXhwb3J0cz17aW5jbHVkZXM6cyghMCksaW5kZXhPZjpzKCExKX19LDk2NzE6KGUsdCxyKT0+e3ZhciBuPXIoOTk3NCksYT1yKDgzNjEpLGk9cig3OTA4KSxzPXIoNjI0NCksbz1mdW5jdGlvbihlKXt2YXIgdD0xPT1lO3JldHVybiBmdW5jdGlvbihyLG8sYyl7Zm9yKHZhciBsLGg9aShyKSx1PWEoaCksZD1uKG8sYyksZj1zKHUpO2YtLSA+MDspaWYoZChsPXVbZl0sZixoKSlzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiBsO2Nhc2UgMTpyZXR1cm4gZn1yZXR1cm4gdD8tMTp2b2lkIDB9fTtlLmV4cG9ydHM9e2ZpbmRMYXN0Om8oMCksZmluZExhc3RJbmRleDpvKDEpfX0sMjA5MjooZSx0LHIpPT57dmFyIG49cig5OTc0KSxhPXIoMTcwMiksaT1yKDgzNjEpLHM9cig3OTA4KSxvPXIoNjI0NCksYz1yKDU0MTcpLGw9YShbXS5wdXNoKSxoPWZ1bmN0aW9uKGUpe3ZhciB0PTE9PWUscj0yPT1lLGE9Mz09ZSxoPTQ9PWUsdT02PT1lLGQ9Nz09ZSxmPTU9PWV8fHU7cmV0dXJuIGZ1bmN0aW9uKGcscCxtLGIpe2Zvcih2YXIgeSx3LHY9cyhnKSx4PWkodiksUz1uKHAsbSksQT1vKHgpLGs9MCxDPWJ8fGMsTz10P0MoZyxBKTpyfHxkP0MoZywwKTp2b2lkIDA7QT5rO2srKylpZigoZnx8ayBpbiB4KSYmKHc9Uyh5PXhba10sayx2KSxlKSlpZih0KU9ba109dztlbHNlIGlmKHcpc3dpdGNoKGUpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBrO2Nhc2UgMjpsKE8seSl9ZWxzZSBzd2l0Y2goZSl7Y2FzZSA0OnJldHVybiExO2Nhc2UgNzpsKE8seSl9cmV0dXJuIHU/LTE6YXx8aD9oOk99fTtlLmV4cG9ydHM9e2ZvckVhY2g6aCgwKSxtYXA6aCgxKSxmaWx0ZXI6aCgyKSxzb21lOmgoMyksZXZlcnk6aCg0KSxmaW5kOmgoNSksZmluZEluZGV4OmgoNiksZmlsdGVyUmVqZWN0OmgoNyl9fSw5MzQxOihlLHQscik9Pnt2YXIgbj1yKDcyOTMpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByPVtdW2VdO3JldHVybiEhciYmbigoZnVuY3Rpb24oKXtyLmNhbGwobnVsbCx0fHxmdW5jdGlvbigpe3JldHVybiAxfSwxKX0pKX19LDM2NzE6KGUsdCxyKT0+e3ZhciBuPXIoOTY2MiksYT1yKDc5MDgpLGk9cig4MzYxKSxzPXIoNjI0NCksbz1UeXBlRXJyb3IsYz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyLGMsbCl7bihyKTt2YXIgaD1hKHQpLHU9aShoKSxkPXMoaCksZj1lP2QtMTowLGc9ZT8tMToxO2lmKGM8Milmb3IoOzspe2lmKGYgaW4gdSl7bD11W2ZdLGYrPWc7YnJlYWt9aWYoZis9ZyxlP2Y8MDpkPD1mKXRocm93IG8oIlJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKX1mb3IoO2U/Zj49MDpkPmY7Zis9ZylmIGluIHUmJihsPXIobCx1W2ZdLGYsaCkpO3JldHVybiBsfX07ZS5leHBvcnRzPXtsZWZ0OmMoITEpLHJpZ2h0OmMoITApfX0sMzY1ODooZSx0LHIpPT57dmFyIG49cig5NzgxKSxhPXIoMzE1NyksaT1UeXBlRXJyb3Iscz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLG89biYmIWZ1bmN0aW9uKCl7aWYodm9pZCAwIT09dGhpcylyZXR1cm4hMDt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCJsZW5ndGgiLHt3cml0YWJsZTohMX0pLmxlbmd0aD0xfWNhdGNoKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVHlwZUVycm9yfX0oKTtlLmV4cG9ydHM9bz9mdW5jdGlvbihlLHQpe2lmKGEoZSkmJiFzKGUsImxlbmd0aCIpLndyaXRhYmxlKXRocm93IGkoIkNhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGgiKTtyZXR1cm4gZS5sZW5ndGg9dH06ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5sZW5ndGg9dH19LDE1ODk6KGUsdCxyKT0+e3ZhciBuPXIoMTQwMCksYT1yKDYyNDQpLGk9cig2MTM1KSxzPUFycmF5LG89TWF0aC5tYXg7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtmb3IodmFyIGM9YShlKSxsPW4odCxjKSxoPW4odm9pZCAwPT09cj9jOnIsYyksdT1zKG8oaC1sLDApKSxkPTA7bDxoO2wrKyxkKyspaSh1LGQsZVtsXSk7cmV0dXJuIHUubGVuZ3RoPWQsdX19LDIwNjooZSx0LHIpPT57dmFyIG49cigxNzAyKTtlLmV4cG9ydHM9bihbXS5zbGljZSl9LDQzNjI6KGUsdCxyKT0+e3ZhciBuPXIoMTU4OSksYT1NYXRoLmZsb29yLGk9ZnVuY3Rpb24oZSx0KXt2YXIgcj1lLmxlbmd0aCxjPWEoci8yKTtyZXR1cm4gcjw4P3MoZSx0KTpvKGUsaShuKGUsMCxjKSx0KSxpKG4oZSxjKSx0KSx0KX0scz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuLGE9ZS5sZW5ndGgsaT0xO2k8YTspe2ZvcihuPWkscj1lW2ldO24mJnQoZVtuLTFdLHIpPjA7KWVbbl09ZVstLW5dO24hPT1pKysmJihlW25dPXIpfXJldHVybiBlfSxvPWZ1bmN0aW9uKGUsdCxyLG4pe2Zvcih2YXIgYT10Lmxlbmd0aCxpPXIubGVuZ3RoLHM9MCxvPTA7czxhfHxvPGk7KWVbcytvXT1zPGEmJm88aT9uKHRbc10scltvXSk8PTA/dFtzKytdOnJbbysrXTpzPGE/dFtzKytdOnJbbysrXTtyZXR1cm4gZX07ZS5leHBvcnRzPWl9LDc0NzU6KGUsdCxyKT0+e3ZhciBuPXIoMzE1NyksYT1yKDQ0MTEpLGk9cigxMTEpLHM9cig1MTEyKSgic3BlY2llcyIpLG89QXJyYXk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBuKGUpJiYodD1lLmNvbnN0cnVjdG9yLChhKHQpJiYodD09PW98fG4odC5wcm90b3R5cGUpKXx8aSh0KSYmbnVsbD09PSh0PXRbc10pKSYmKHQ9dm9pZCAwKSksdm9pZCAwPT09dD9vOnR9fSw1NDE3OihlLHQscik9Pnt2YXIgbj1yKDc0NzUpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcobihlKSkoMD09PXQ/MDp0KX19LDE4NDM6KGUsdCxyKT0+e3ZhciBuPXIoNjI0NCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPW4oZSksYT1uZXcgdChyKSxpPTA7aTxyO2krKylhW2ldPWVbci1pLTFdO3JldHVybiBhfX0sMTU3MjooZSx0LHIpPT57dmFyIG49cig2MjQ0KSxhPXIoOTMwMyksaT1SYW5nZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscixzKXt2YXIgbz1uKGUpLGM9YShyKSxsPWM8MD9vK2M6YztpZihsPj1vfHxsPDApdGhyb3cgaSgiSW5jb3JyZWN0IGluZGV4Iik7Zm9yKHZhciBoPW5ldyB0KG8pLHU9MDt1PG87dSsrKWhbdV09dT09PWw/czplW3VdO3JldHVybiBofX0sMzQxMTooZSx0LHIpPT57dmFyIG49cig5NjcwKSxhPXIoOTIxMik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLGkpe3RyeXtyZXR1cm4gaT90KG4ocilbMF0sclsxXSk6dChyKX1jYXRjaCh0KXthKGUsInRocm93Iix0KX19fSw3MDcyOihlLHQscik9Pnt2YXIgbj1yKDUxMTIpKCJpdGVyYXRvciIpLGE9ITE7dHJ5e3ZhciBpPTAscz17bmV4dDpmdW5jdGlvbigpe3JldHVybntkb25lOiEhaSsrfX0scmV0dXJuOmZ1bmN0aW9uKCl7YT0hMH19O3Nbbl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sQXJyYXkuZnJvbShzLChmdW5jdGlvbigpe3Rocm93IDJ9KSl9Y2F0Y2goZSl7fWUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKCF0JiYhYSlyZXR1cm4hMTt2YXIgcj0hMTt0cnl7dmFyIGk9e307aVtuXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6cj0hMH19fX0sZShpKX1jYXRjaChlKXt9cmV0dXJuIHJ9fSw0MzI2OihlLHQscik9Pnt2YXIgbj1yKDE3MDIpLGE9bih7fS50b1N0cmluZyksaT1uKCIiLnNsaWNlKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGkoYShlKSw4LC0xKX19LDY0ODooZSx0LHIpPT57dmFyIG49cigxNjk0KSxhPXIoNjE0KSxpPXIoNDMyNikscz1yKDUxMTIpKCJ0b1N0cmluZ1RhZyIpLG89T2JqZWN0LGM9IkFyZ3VtZW50cyI9PWkoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKTtlLmV4cG9ydHM9bj9pOmZ1bmN0aW9uKGUpe3ZhciB0LHIsbjtyZXR1cm4gdm9pZCAwPT09ZT8iVW5kZWZpbmVkIjpudWxsPT09ZT8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihyPWZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiBlW3RdfWNhdGNoKGUpe319KHQ9byhlKSxzKSk/cjpjP2kodCk6Ik9iamVjdCI9PShuPWkodCkpJiZhKHQuY2FsbGVlKT8iQXJndW1lbnRzIjpufX0sOTMyMDooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoOTE5MCksaT1yKDI0MjMpLmdldFdlYWtEYXRhLHM9cig1Nzg3KSxvPXIoOTY3MCksYz1yKDg1NTQpLGw9cigxMTEpLGg9cig0MDgpLHU9cigyMDkyKSxkPXIoMjU5NyksZj1yKDk5MDkpLGc9Zi5zZXQscD1mLmdldHRlckZvcixtPXUuZmluZCxiPXUuZmluZEluZGV4LHk9bihbXS5zcGxpY2UpLHc9MCx2PWZ1bmN0aW9uKGUpe3JldHVybiBlLmZyb3plbnx8KGUuZnJvemVuPW5ldyB4KX0seD1mdW5jdGlvbigpe3RoaXMuZW50cmllcz1bXX0sUz1mdW5jdGlvbihlLHQpe3JldHVybiBtKGUuZW50cmllcywoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF09PT10fSkpfTt4LnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVModGhpcyxlKTtpZih0KXJldHVybiB0WzFdfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFTKHRoaXMsZSl9LHNldDpmdW5jdGlvbihlLHQpe3ZhciByPVModGhpcyxlKTtyP3JbMV09dDp0aGlzLmVudHJpZXMucHVzaChbZSx0XSl9LGRlbGV0ZTpmdW5jdGlvbihlKXt2YXIgdD1iKHRoaXMuZW50cmllcywoZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09PT1lfSkpO3JldHVybn50JiZ5KHRoaXMuZW50cmllcyx0LDEpLCEhfnR9fSxlLmV4cG9ydHM9e2dldENvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCxyLG4pe3ZhciB1PWUoKGZ1bmN0aW9uKGUsYSl7cyhlLGYpLGcoZSx7dHlwZTp0LGlkOncrKyxmcm96ZW46dm9pZCAwfSksYyhhKXx8aChhLGVbbl0se3RoYXQ6ZSxBU19FTlRSSUVTOnJ9KX0pKSxmPXUucHJvdG90eXBlLG09cCh0KSxiPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1tKGUpLGE9aShvKHQpLCEwKTtyZXR1cm4hMD09PWE/dihuKS5zZXQodCxyKTphW24uaWRdPXIsZX07cmV0dXJuIGEoZix7ZGVsZXRlOmZ1bmN0aW9uKGUpe3ZhciB0PW0odGhpcyk7aWYoIWwoZSkpcmV0dXJuITE7dmFyIHI9aShlKTtyZXR1cm4hMD09PXI/dih0KS5kZWxldGUoZSk6ciYmZChyLHQuaWQpJiZkZWxldGUgclt0LmlkXX0saGFzOmZ1bmN0aW9uKGUpe3ZhciB0PW0odGhpcyk7aWYoIWwoZSkpcmV0dXJuITE7dmFyIHI9aShlKTtyZXR1cm4hMD09PXI/dih0KS5oYXMoZSk6ciYmZChyLHQuaWQpfX0pLGEoZixyP3tnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bSh0aGlzKTtpZihsKGUpKXt2YXIgcj1pKGUpO3JldHVybiEwPT09cj92KHQpLmdldChlKTpyP3JbdC5pZF06dm9pZCAwfX0sc2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGIodGhpcyxlLHQpfX06e2FkZDpmdW5jdGlvbihlKXtyZXR1cm4gYih0aGlzLGUsITApfX0pLHV9fX0sNzcxMDooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNzg1NCksaT1yKDE3MDIpLHM9cig0NzA1KSxvPXIoODA1MiksYz1yKDI0MjMpLGw9cig0MDgpLGg9cig1Nzg3KSx1PXIoNjE0KSxkPXIoODU1NCksZj1yKDExMSksZz1yKDcyOTMpLHA9cig3MDcyKSxtPXIoODAwMyksYj1yKDk1ODcpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dmFyIHk9LTEhPT1lLmluZGV4T2YoIk1hcCIpLHc9LTEhPT1lLmluZGV4T2YoIldlYWsiKSx2PXk/InNldCI6ImFkZCIseD1hW2VdLFM9eCYmeC5wcm90b3R5cGUsQT14LGs9e30sQz1mdW5jdGlvbihlKXt2YXIgdD1pKFNbZV0pO28oUyxlLCJhZGQiPT1lP2Z1bmN0aW9uKGUpe3JldHVybiB0KHRoaXMsMD09PWU/MDplKSx0aGlzfToiZGVsZXRlIj09ZT9mdW5jdGlvbihlKXtyZXR1cm4hKHcmJiFmKGUpKSYmdCh0aGlzLDA9PT1lPzA6ZSl9OiJnZXQiPT1lP2Z1bmN0aW9uKGUpe3JldHVybiB3JiYhZihlKT92b2lkIDA6dCh0aGlzLDA9PT1lPzA6ZSl9OiJoYXMiPT1lP2Z1bmN0aW9uKGUpe3JldHVybiEodyYmIWYoZSkpJiZ0KHRoaXMsMD09PWU/MDplKX06ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdCh0aGlzLDA9PT1lPzA6ZSxyKSx0aGlzfSl9O2lmKHMoZSwhdSh4KXx8ISh3fHxTLmZvckVhY2gmJiFnKChmdW5jdGlvbigpeyhuZXcgeCkuZW50cmllcygpLm5leHQoKX0pKSkpKUE9ci5nZXRDb25zdHJ1Y3Rvcih0LGUseSx2KSxjLmVuYWJsZSgpO2Vsc2UgaWYocyhlLCEwKSl7dmFyIE89bmV3IEEsRj1PW3ZdKHc/e306LTAsMSkhPU8sST1nKChmdW5jdGlvbigpe08uaGFzKDEpfSkpLFQ9cCgoZnVuY3Rpb24oZSl7bmV3IHgoZSl9KSksTT0hdyYmZygoZnVuY3Rpb24oKXtmb3IodmFyIGU9bmV3IHgsdD01O3QtLTspZVt2XSh0LHQpO3JldHVybiFlLmhhcygtMCl9KSk7VHx8KChBPXQoKGZ1bmN0aW9uKGUsdCl7aChlLFMpO3ZhciByPWIobmV3IHgsZSxBKTtyZXR1cm4gZCh0KXx8bCh0LHJbdl0se3RoYXQ6cixBU19FTlRSSUVTOnl9KSxyfSkpKS5wcm90b3R5cGU9UyxTLmNvbnN0cnVjdG9yPUEpLChJfHxNKSYmKEMoImRlbGV0ZSIpLEMoImhhcyIpLHkmJkMoImdldCIpKSwoTXx8RikmJkModiksdyYmUy5jbGVhciYmZGVsZXRlIFMuY2xlYXJ9cmV0dXJuIGtbZV09QSxuKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsZm9yY2VkOkEhPXh9LGspLG0oQSxlKSx3fHxyLnNldFN0cm9uZyhBLGUseSksQX19LDk5MjA6KGUsdCxyKT0+e3ZhciBuPXIoMjU5NyksYT1yKDM4ODcpLGk9cigxMjM2KSxzPXIoMzA3MCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtmb3IodmFyIG89YSh0KSxjPXMuZixsPWkuZixoPTA7aDxvLmxlbmd0aDtoKyspe3ZhciB1PW9baF07bihlLHUpfHxyJiZuKHIsdSl8fGMoZSx1LGwodCx1KSl9fX0sNDk2NDooZSx0LHIpPT57dmFyIG49cig1MTEyKSgibWF0Y2giKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9Ly4vO3RyeXsiLy4vIltlXSh0KX1jYXRjaChyKXt0cnl7cmV0dXJuIHRbbl09ITEsIi8uLyJbZV0odCl9Y2F0Y2goZSl7fX1yZXR1cm4hMX19LDg1NDQ6KGUsdCxyKT0+e3ZhciBuPXIoNzI5Myk7ZS5leHBvcnRzPSFuKChmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBlKSE9PWUucHJvdG90eXBlfSkpfSw2MTc4OmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm57dmFsdWU6ZSxkb25lOnR9fX0sODg4MDooZSx0LHIpPT57dmFyIG49cig5NzgxKSxhPXIoMzA3MCksaT1yKDkxMTQpO2UuZXhwb3J0cz1uP2Z1bmN0aW9uKGUsdCxyKXtyZXR1cm4gYS5mKGUsdCxpKDEscikpfTpmdW5jdGlvbihlLHQscil7cmV0dXJuIGVbdF09cixlfX0sOTExNDplPT57ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJue2VudW1lcmFibGU6ISgxJmUpLGNvbmZpZ3VyYWJsZTohKDImZSksd3JpdGFibGU6ISg0JmUpLHZhbHVlOnR9fX0sNjEzNTooZSx0LHIpPT57dmFyIG49cig0OTQ4KSxhPXIoMzA3MCksaT1yKDkxMTQpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dmFyIHM9bih0KTtzIGluIGU/YS5mKGUscyxpKDAscikpOmVbc109cn19LDcwNDU6KGUsdCxyKT0+e3ZhciBuPXIoNjMzOSksYT1yKDMwNzApO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7cmV0dXJuIHIuZ2V0JiZuKHIuZ2V0LHQse2dldHRlcjohMH0pLHIuc2V0JiZuKHIuc2V0LHQse3NldHRlcjohMH0pLGEuZihlLHQscil9fSw4MDUyOihlLHQscik9Pnt2YXIgbj1yKDYxNCksYT1yKDMwNzApLGk9cig2MzM5KSxzPXIoMzA3Mik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLG8pe298fChvPXt9KTt2YXIgYz1vLmVudW1lcmFibGUsbD12b2lkIDAhPT1vLm5hbWU/by5uYW1lOnQ7aWYobihyKSYmaShyLGwsbyksby5nbG9iYWwpYz9lW3RdPXI6cyh0LHIpO2Vsc2V7dHJ5e28udW5zYWZlP2VbdF0mJihjPSEwKTpkZWxldGUgZVt0XX1jYXRjaChlKXt9Yz9lW3RdPXI6YS5mKGUsdCx7dmFsdWU6cixlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohby5ub25Db25maWd1cmFibGUsd3JpdGFibGU6IW8ubm9uV3JpdGFibGV9KX1yZXR1cm4gZX19LDkxOTA6KGUsdCxyKT0+e3ZhciBuPXIoODA1Mik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtmb3IodmFyIGEgaW4gdCluKGUsYSx0W2FdLHIpO3JldHVybiBlfX0sMzA3MjooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt0cnl7YShuLGUse3ZhbHVlOnQsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSl9Y2F0Y2gocil7bltlXT10fXJldHVybiB0fX0sNTExNzooZSx0LHIpPT57dmFyIG49cig2MzMwKSxhPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZighZGVsZXRlIGVbdF0pdGhyb3cgYSgiQ2Fubm90IGRlbGV0ZSBwcm9wZXJ0eSAiK24odCkrIiBvZiAiK24oZSkpfX0sOTc4MTooZSx0LHIpPT57dmFyIG49cig3MjkzKTtlLmV4cG9ydHM9IW4oKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwxLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KVsxXX0pKX0sNDE1NDplPT57dmFyIHQ9Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuYWxsLHI9dm9pZCAwPT09dCYmdm9pZCAwIT09dDtlLmV4cG9ydHM9e2FsbDp0LElTX0hUTUxEREE6cn19LDMxNzooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPXIoMTExKSxpPW4uZG9jdW1lbnQscz1hKGkpJiZhKGkuY3JlYXRlRWxlbWVudCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBzP2kuY3JlYXRlRWxlbWVudChlKTp7fX19LDcyMDc6ZT0+e3ZhciB0PVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoZT45MDA3MTk5MjU0NzQwOTkxKXRocm93IHQoIk1heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCIpO3JldHVybiBlfX0sMzY3ODplPT57ZS5leHBvcnRzPXtJbmRleFNpemVFcnJvcjp7czoiSU5ERVhfU0laRV9FUlIiLGM6MSxtOjF9LERPTVN0cmluZ1NpemVFcnJvcjp7czoiRE9NU1RSSU5HX1NJWkVfRVJSIixjOjIsbTowfSxIaWVyYXJjaHlSZXF1ZXN0RXJyb3I6e3M6IkhJRVJBUkNIWV9SRVFVRVNUX0VSUiIsYzozLG06MX0sV3JvbmdEb2N1bWVudEVycm9yOntzOiJXUk9OR19ET0NVTUVOVF9FUlIiLGM6NCxtOjF9LEludmFsaWRDaGFyYWN0ZXJFcnJvcjp7czoiSU5WQUxJRF9DSEFSQUNURVJfRVJSIixjOjUsbToxfSxOb0RhdGFBbGxvd2VkRXJyb3I6e3M6Ik5PX0RBVEFfQUxMT1dFRF9FUlIiLGM6NixtOjB9LE5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycm9yOntzOiJOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIiLGM6NyxtOjF9LE5vdEZvdW5kRXJyb3I6e3M6Ik5PVF9GT1VORF9FUlIiLGM6OCxtOjF9LE5vdFN1cHBvcnRlZEVycm9yOntzOiJOT1RfU1VQUE9SVEVEX0VSUiIsYzo5LG06MX0sSW5Vc2VBdHRyaWJ1dGVFcnJvcjp7czoiSU5VU0VfQVRUUklCVVRFX0VSUiIsYzoxMCxtOjF9LEludmFsaWRTdGF0ZUVycm9yOntzOiJJTlZBTElEX1NUQVRFX0VSUiIsYzoxMSxtOjF9LFN5bnRheEVycm9yOntzOiJTWU5UQVhfRVJSIixjOjEyLG06MX0sSW52YWxpZE1vZGlmaWNhdGlvbkVycm9yOntzOiJJTlZBTElEX01PRElGSUNBVElPTl9FUlIiLGM6MTMsbToxfSxOYW1lc3BhY2VFcnJvcjp7czoiTkFNRVNQQUNFX0VSUiIsYzoxNCxtOjF9LEludmFsaWRBY2Nlc3NFcnJvcjp7czoiSU5WQUxJRF9BQ0NFU1NfRVJSIixjOjE1LG06MX0sVmFsaWRhdGlvbkVycm9yOntzOiJWQUxJREFUSU9OX0VSUiIsYzoxNixtOjB9LFR5cGVNaXNtYXRjaEVycm9yOntzOiJUWVBFX01JU01BVENIX0VSUiIsYzoxNyxtOjF9LFNlY3VyaXR5RXJyb3I6e3M6IlNFQ1VSSVRZX0VSUiIsYzoxOCxtOjF9LE5ldHdvcmtFcnJvcjp7czoiTkVUV09SS19FUlIiLGM6MTksbToxfSxBYm9ydEVycm9yOntzOiJBQk9SVF9FUlIiLGM6MjAsbToxfSxVUkxNaXNtYXRjaEVycm9yOntzOiJVUkxfTUlTTUFUQ0hfRVJSIixjOjIxLG06MX0sUXVvdGFFeGNlZWRlZEVycm9yOntzOiJRVU9UQV9FWENFRURFRF9FUlIiLGM6MjIsbToxfSxUaW1lb3V0RXJyb3I6e3M6IlRJTUVPVVRfRVJSIixjOjIzLG06MX0sSW52YWxpZE5vZGVUeXBlRXJyb3I6e3M6IklOVkFMSURfTk9ERV9UWVBFX0VSUiIsYzoyNCxtOjF9LERhdGFDbG9uZUVycm9yOntzOiJEQVRBX0NMT05FX0VSUiIsYzoyNSxtOjF9fX0sODMyNDplPT57ZS5leHBvcnRzPXtDU1NSdWxlTGlzdDowLENTU1N0eWxlRGVjbGFyYXRpb246MCxDU1NWYWx1ZUxpc3Q6MCxDbGllbnRSZWN0TGlzdDowLERPTVJlY3RMaXN0OjAsRE9NU3RyaW5nTGlzdDowLERPTVRva2VuTGlzdDoxLERhdGFUcmFuc2Zlckl0ZW1MaXN0OjAsRmlsZUxpc3Q6MCxIVE1MQWxsQ29sbGVjdGlvbjowLEhUTUxDb2xsZWN0aW9uOjAsSFRNTEZvcm1FbGVtZW50OjAsSFRNTFNlbGVjdEVsZW1lbnQ6MCxNZWRpYUxpc3Q6MCxNaW1lVHlwZUFycmF5OjAsTmFtZWROb2RlTWFwOjAsTm9kZUxpc3Q6MSxQYWludFJlcXVlc3RMaXN0OjAsUGx1Z2luOjAsUGx1Z2luQXJyYXk6MCxTVkdMZW5ndGhMaXN0OjAsU1ZHTnVtYmVyTGlzdDowLFNWR1BhdGhTZWdMaXN0OjAsU1ZHUG9pbnRMaXN0OjAsU1ZHU3RyaW5nTGlzdDowLFNWR1RyYW5zZm9ybUxpc3Q6MCxTb3VyY2VCdWZmZXJMaXN0OjAsU3R5bGVTaGVldExpc3Q6MCxUZXh0VHJhY2tDdWVMaXN0OjAsVGV4dFRyYWNrTGlzdDowLFRvdWNoTGlzdDowfX0sODUwOTooZSx0LHIpPT57dmFyIG49cigzMTcpKCJzcGFuIikuY2xhc3NMaXN0LGE9biYmbi5jb25zdHJ1Y3RvciYmbi5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7ZS5leHBvcnRzPWE9PT1PYmplY3QucHJvdG90eXBlP3ZvaWQgMDphfSw4ODg2OihlLHQscik9Pnt2YXIgbj1yKDgxMTMpLm1hdGNoKC9maXJlZm94XC8oXGQrKS9pKTtlLmV4cG9ydHM9ISFuJiYrblsxXX0sNzg3MTooZSx0LHIpPT57dmFyIG49cigzODIzKSxhPXIoNTI2OCk7ZS5leHBvcnRzPSFuJiYhYSYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJiJvYmplY3QiPT10eXBlb2YgZG9jdW1lbnR9LDM4MjM6ZT0+e2UuZXhwb3J0cz0ib2JqZWN0Ij09dHlwZW9mIERlbm8mJkRlbm8mJiJvYmplY3QiPT10eXBlb2YgRGVuby52ZXJzaW9ufSwyNTY6KGUsdCxyKT0+e3ZhciBuPXIoODExMyk7ZS5leHBvcnRzPS9NU0lFfFRyaWRlbnQvLnRlc3Qobil9LDE1Mjg6KGUsdCxyKT0+e3ZhciBuPXIoODExMyk7ZS5leHBvcnRzPS9pcGFkfGlwaG9uZXxpcG9kL2kudGVzdChuKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBQZWJibGV9LDY4MzM6KGUsdCxyKT0+e3ZhciBuPXIoODExMyk7ZS5leHBvcnRzPS8oPzppcGFkfGlwaG9uZXxpcG9kKS4qYXBwbGV3ZWJraXQvaS50ZXN0KG4pfSw1MjY4OihlLHQscik9Pnt2YXIgbj1yKDQzMjYpO2UuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJiJwcm9jZXNzIj09bihwcm9jZXNzKX0sMTAzNjooZSx0LHIpPT57dmFyIG49cig4MTEzKTtlLmV4cG9ydHM9L3dlYjBzKD8hLipjaHJvbWUpL2kudGVzdChuKX0sODExMzplPT57ZS5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiZTdHJpbmcobmF2aWdhdG9yLnVzZXJBZ2VudCl8fCIifSw3MzkyOihlLHQscik9Pnt2YXIgbixhLGk9cig3ODU0KSxzPXIoODExMyksbz1pLnByb2Nlc3MsYz1pLkRlbm8sbD1vJiZvLnZlcnNpb25zfHxjJiZjLnZlcnNpb24saD1sJiZsLnY4O2gmJihhPShuPWguc3BsaXQoIi4iKSlbMF0+MCYmblswXTw0PzE6KyhuWzBdK25bMV0pKSwhYSYmcyYmKCEobj1zLm1hdGNoKC9FZGdlXC8oXGQrKS8pKXx8blsxXT49NzQpJiYobj1zLm1hdGNoKC9DaHJvbWVcLyhcZCspLykpJiYoYT0rblsxXSksZS5leHBvcnRzPWF9LDgwMDg6KGUsdCxyKT0+e3ZhciBuPXIoODExMykubWF0Y2goL0FwcGxlV2ViS2l0XC8oXGQrKVwuLyk7ZS5leHBvcnRzPSEhbiYmK25bMV19LDc0ODplPT57ZS5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LDEwNjA6KGUsdCxyKT0+e3ZhciBuPXIoMTcwMiksYT1FcnJvcixpPW4oIiIucmVwbGFjZSkscz1TdHJpbmcoYSgienhjYXNkIikuc3RhY2spLG89L1xuXHMqYXQgW146XSo6W15cbl0qLyxjPW8udGVzdChzKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihjJiYic3RyaW5nIj09dHlwZW9mIGUmJiFhLnByZXBhcmVTdGFja1RyYWNlKWZvcig7dC0tOyllPWkoZSxvLCIiKTtyZXR1cm4gZX19LDUzOTI6KGUsdCxyKT0+e3ZhciBuPXIoODg4MCksYT1yKDEwNjApLGk9cigyOTE0KSxzPUVycm9yLmNhcHR1cmVTdGFja1RyYWNlO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscixvKXtpJiYocz9zKGUsdCk6bihlLCJzdGFjayIsYShyLG8pKSl9fSwyOTE0OihlLHQscik9Pnt2YXIgbj1yKDcyOTMpLGE9cig5MTE0KTtlLmV4cG9ydHM9IW4oKGZ1bmN0aW9uKCl7dmFyIGU9RXJyb3IoImEiKTtyZXR1cm4hKCJzdGFjayJpbiBlKXx8KE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzdGFjayIsYSgxLDcpKSw3IT09ZS5zdGFjayl9KSl9LDc3NjI6KGUsdCxyKT0+e3ZhciBuPXIoOTc4MSksYT1yKDcyOTMpLGk9cig5NjcwKSxzPXIoMzApLG89cig2Mjc3KSxjPUVycm9yLnByb3RvdHlwZS50b1N0cmluZyxsPWEoKGZ1bmN0aW9uKCl7aWYobil7dmFyIGU9cyhPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIm5hbWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PWV9fSkpO2lmKCJ0cnVlIiE9PWMuY2FsbChlKSlyZXR1cm4hMH1yZXR1cm4iMjogMSIhPT1jLmNhbGwoe21lc3NhZ2U6MSxuYW1lOjJ9KXx8IkVycm9yIiE9PWMuY2FsbCh7fSl9KSk7ZS5leHBvcnRzPWw/ZnVuY3Rpb24oKXt2YXIgZT1pKHRoaXMpLHQ9byhlLm5hbWUsIkVycm9yIikscj1vKGUubWVzc2FnZSk7cmV0dXJuIHQ/cj90KyI6ICIrcjp0OnJ9OmN9LDIxMDk6KGUsdCxyKT0+e3ZhciBuPXIoNzg1NCksYT1yKDEyMzYpLmYsaT1yKDg4ODApLHM9cig4MDUyKSxvPXIoMzA3MiksYz1yKDk5MjApLGw9cig0NzA1KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgcixoLHUsZCxmLGc9ZS50YXJnZXQscD1lLmdsb2JhbCxtPWUuc3RhdDtpZihyPXA/bjptP25bZ118fG8oZyx7fSk6KG5bZ118fHt9KS5wcm90b3R5cGUpZm9yKGggaW4gdCl7aWYoZD10W2hdLHU9ZS5kb250Q2FsbEdldFNldD8oZj1hKHIsaCkpJiZmLnZhbHVlOnJbaF0sIWwocD9oOmcrKG0/Ii4iOiIjIikraCxlLmZvcmNlZCkmJnZvaWQgMCE9PXUpe2lmKHR5cGVvZiBkPT10eXBlb2YgdSljb250aW51ZTtjKGQsdSl9KGUuc2hhbXx8dSYmdS5zaGFtKSYmaShkLCJzaGFtIiwhMCkscyhyLGgsZCxlKX19fSw3MjkzOmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiEhZSgpfWNhdGNoKGUpe3JldHVybiEwfX19LDcwMDc6KGUsdCxyKT0+e3IoNDkxNik7dmFyIG49cigxNDcwKSxhPXIoODA1MiksaT1yKDIyNjEpLHM9cig3MjkzKSxvPXIoNTExMiksYz1yKDg4ODApLGw9bygic3BlY2llcyIpLGg9UmVnRXhwLnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIsdSl7dmFyIGQ9byhlKSxmPSFzKChmdW5jdGlvbigpe3ZhciB0PXt9O3JldHVybiB0W2RdPWZ1bmN0aW9uKCl7cmV0dXJuIDd9LDchPSIiW2VdKHQpfSkpLGc9ZiYmIXMoKGZ1bmN0aW9uKCl7dmFyIHQ9ITEscj0vYS87cmV0dXJuInNwbGl0Ij09PWUmJigocj17fSkuY29uc3RydWN0b3I9e30sci5jb25zdHJ1Y3RvcltsXT1mdW5jdGlvbigpe3JldHVybiByfSxyLmZsYWdzPSIiLHJbZF09Ly4vW2RdKSxyLmV4ZWM9ZnVuY3Rpb24oKXtyZXR1cm4gdD0hMCxudWxsfSxyW2RdKCIiKSwhdH0pKTtpZighZnx8IWd8fHIpe3ZhciBwPW4oLy4vW2RdKSxtPXQoZCwiIltlXSwoZnVuY3Rpb24oZSx0LHIsYSxzKXt2YXIgbz1uKGUpLGM9dC5leGVjO3JldHVybiBjPT09aXx8Yz09PWguZXhlYz9mJiYhcz97ZG9uZTohMCx2YWx1ZTpwKHQscixhKX06e2RvbmU6ITAsdmFsdWU6byhyLHQsYSl9Ontkb25lOiExfX0pKTthKFN0cmluZy5wcm90b3R5cGUsZSxtWzBdKSxhKGgsZCxtWzFdKX11JiZjKGhbZF0sInNoYW0iLCEwKX19LDY3OTA6KGUsdCxyKT0+e3ZhciBuPXIoMzE1NyksYT1yKDYyNDQpLGk9cig3MjA3KSxzPXIoOTk3NCksbz1mdW5jdGlvbihlLHQscixjLGwsaCx1LGQpe2Zvcih2YXIgZixnLHA9bCxtPTAsYj0hIXUmJnModSxkKTttPGM7KW0gaW4gciYmKGY9Yj9iKHJbbV0sbSx0KTpyW21dLGg+MCYmbihmKT8oZz1hKGYpLHA9byhlLHQsZixnLHAsaC0xKS0xKTooaShwKzEpLGVbcF09ZikscCsrKSxtKys7cmV0dXJuIHB9O2UuZXhwb3J0cz1vfSw2Njc3OihlLHQscik9Pnt2YXIgbj1yKDcyOTMpO2UuZXhwb3J0cz0hbigoZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pKX0sMjEwNDooZSx0LHIpPT57dmFyIG49cig0Mzc0KSxhPUZ1bmN0aW9uLnByb3RvdHlwZSxpPWEuYXBwbHkscz1hLmNhbGw7ZS5leHBvcnRzPSJvYmplY3QiPT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdC5hcHBseXx8KG4/cy5iaW5kKGkpOmZ1bmN0aW9uKCl7cmV0dXJuIHMuYXBwbHkoaSxhcmd1bWVudHMpfSl9LDk5NzQ6KGUsdCxyKT0+e3ZhciBuPXIoMTQ3MCksYT1yKDk2NjIpLGk9cig0Mzc0KSxzPW4obi5iaW5kKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYShlKSx2b2lkIDA9PT10P2U6aT9zKGUsdCk6ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0LGFyZ3VtZW50cyl9fX0sNDM3NDooZSx0LHIpPT57dmFyIG49cig3MjkzKTtlLmV4cG9ydHM9IW4oKGZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oKXt9LmJpbmQoKTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgZXx8ZS5oYXNPd25Qcm9wZXJ0eSgicHJvdG90eXBlIil9KSl9LDY5MTY6KGUsdCxyKT0+e3ZhciBuPXIoNDM3NCksYT1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtlLmV4cG9ydHM9bj9hLmJpbmQoYSk6ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShhLGFyZ3VtZW50cyl9fSw2NTMwOihlLHQscik9Pnt2YXIgbj1yKDk3ODEpLGE9cigyNTk3KSxpPUZ1bmN0aW9uLnByb3RvdHlwZSxzPW4mJk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Isbz1hKGksIm5hbWUiKSxjPW8mJiJzb21ldGhpbmciPT09ZnVuY3Rpb24oKXt9Lm5hbWUsbD1vJiYoIW58fG4mJnMoaSwibmFtZSIpLmNvbmZpZ3VyYWJsZSk7ZS5leHBvcnRzPXtFWElTVFM6byxQUk9QRVI6YyxDT05GSUdVUkFCTEU6bH19LDU2Njg6KGUsdCxyKT0+e3ZhciBuPXIoMTcwMiksYT1yKDk2NjIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dHJ5e3JldHVybiBuKGEoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpW3JdKSl9Y2F0Y2goZSl7fX19LDE0NzA6KGUsdCxyKT0+e3ZhciBuPXIoNDMyNiksYT1yKDE3MDIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiRnVuY3Rpb24iPT09bihlKSlyZXR1cm4gYShlKX19LDE3MDI6KGUsdCxyKT0+e3ZhciBuPXIoNDM3NCksYT1GdW5jdGlvbi5wcm90b3R5cGUsaT1hLmNhbGwscz1uJiZhLmJpbmQuYmluZChpLGkpO2UuZXhwb3J0cz1uP3M6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkoZSxhcmd1bWVudHMpfX19LDUwMDU6KGUsdCxyKT0+e3ZhciBuPXIoNzg1NCksYT1yKDYxNCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj8ocj1uW2VdLGEocik/cjp2b2lkIDApOm5bZV0mJm5bZV1bdF07dmFyIHJ9fSwxMjQ2OihlLHQscik9Pnt2YXIgbj1yKDY0OCksYT1yKDgxNzMpLGk9cig4NTU0KSxzPXIoNzQ5Nyksbz1yKDUxMTIpKCJpdGVyYXRvciIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZighaShlKSlyZXR1cm4gYShlLG8pfHxhKGUsIkBAaXRlcmF0b3IiKXx8c1tuKGUpXX19LDQxMjE6KGUsdCxyKT0+e3ZhciBuPXIoNjkxNiksYT1yKDk2NjIpLGk9cig5NjcwKSxzPXIoNjMzMCksbz1yKDEyNDYpLGM9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg8Mj9vKGUpOnQ7aWYoYShyKSlyZXR1cm4gaShuKHIsZSkpO3Rocm93IGMocyhlKSsiIGlzIG5vdCBpdGVyYWJsZSIpfX0sODA0NDooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoMzE1NyksaT1yKDYxNCkscz1yKDQzMjYpLG89cigxMzQwKSxjPW4oW10ucHVzaCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKGkoZSkpcmV0dXJuIGU7aWYoYShlKSl7Zm9yKHZhciB0PWUubGVuZ3RoLHI9W10sbj0wO248dDtuKyspe3ZhciBsPWVbbl07InN0cmluZyI9PXR5cGVvZiBsP2MocixsKToibnVtYmVyIiE9dHlwZW9mIGwmJiJOdW1iZXIiIT1zKGwpJiYiU3RyaW5nIiE9cyhsKXx8YyhyLG8obCkpfXZhciBoPXIubGVuZ3RoLHU9ITA7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYodSlyZXR1cm4gdT0hMSx0O2lmKGEodGhpcykpcmV0dXJuIHQ7Zm9yKHZhciBuPTA7bjxoO24rKylpZihyW25dPT09ZSlyZXR1cm4gdH19fX0sODE3MzooZSx0LHIpPT57dmFyIG49cig5NjYyKSxhPXIoODU1NCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9ZVt0XTtyZXR1cm4gYShyKT92b2lkIDA6bihyKX19LDY0NzooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoNzkwOCksaT1NYXRoLmZsb29yLHM9bigiIi5jaGFyQXQpLG89bigiIi5yZXBsYWNlKSxjPW4oIiIuc2xpY2UpLGw9L1wkKFskJidgXXxcZHsxLDJ9fDxbXj5dKj4pL2csaD0vXCQoWyQmJ2BdfFxkezEsMn0pL2c7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLG4sdSxkKXt2YXIgZj1yK2UubGVuZ3RoLGc9bi5sZW5ndGgscD1oO3JldHVybiB2b2lkIDAhPT11JiYodT1hKHUpLHA9bCksbyhkLHAsKGZ1bmN0aW9uKGEsbyl7dmFyIGw7c3dpdGNoKHMobywwKSl7Y2FzZSIkIjpyZXR1cm4iJCI7Y2FzZSImIjpyZXR1cm4gZTtjYXNlImAiOnJldHVybiBjKHQsMCxyKTtjYXNlIiciOnJldHVybiBjKHQsZik7Y2FzZSI8IjpsPXVbYyhvLDEsLTEpXTticmVhaztkZWZhdWx0OnZhciBoPStvO2lmKDA9PT1oKXJldHVybiBhO2lmKGg+Zyl7dmFyIGQ9aShoLzEwKTtyZXR1cm4gMD09PWQ/YTpkPD1nP3ZvaWQgMD09PW5bZC0xXT9zKG8sMSk6bltkLTFdK3MobywxKTphfWw9bltoLTFdfXJldHVybiB2b2lkIDA9PT1sPyIiOmx9KSl9fSw3ODU0OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5NYXRoPT1NYXRoJiZlfTtlLmV4cG9ydHM9bigib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMpfHxuKCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cpfHxuKCJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZil8fG4oIm9iamVjdCI9PXR5cGVvZiByLmcmJnIuZyl8fGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCl8fHRoaXN8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9LDI1OTc6KGUsdCxyKT0+e3ZhciBuPXIoMTcwMiksYT1yKDc5MDgpLGk9bih7fS5oYXNPd25Qcm9wZXJ0eSk7ZS5leHBvcnRzPU9iamVjdC5oYXNPd258fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoYShlKSx0KX19LDM1MDE6ZT0+e2UuZXhwb3J0cz17fX0sODQyOmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt0cnl7MT09YXJndW1lbnRzLmxlbmd0aD9jb25zb2xlLmVycm9yKGUpOmNvbnNvbGUuZXJyb3IoZSx0KX1jYXRjaChlKXt9fX0sNDkwOihlLHQscik9Pnt2YXIgbj1yKDUwMDUpO2UuZXhwb3J0cz1uKCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIpfSw0NjY0OihlLHQscik9Pnt2YXIgbj1yKDk3ODEpLGE9cig3MjkzKSxpPXIoMzE3KTtlLmV4cG9ydHM9IW4mJiFhKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoaSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSkpfSwxMTc5OmU9Pnt2YXIgdD1BcnJheSxyPU1hdGguYWJzLG49TWF0aC5wb3csYT1NYXRoLmZsb29yLGk9TWF0aC5sb2cscz1NYXRoLkxOMjtlLmV4cG9ydHM9e3BhY2s6ZnVuY3Rpb24oZSxvLGMpe3ZhciBsLGgsdSxkPXQoYyksZj04KmMtby0xLGc9KDE8PGYpLTEscD1nPj4xLG09MjM9PT1vP24oMiwtMjQpLW4oMiwtNzcpOjAsYj1lPDB8fDA9PT1lJiYxL2U8MD8xOjAseT0wO2ZvcigoZT1yKGUpKSE9ZXx8ZT09PTEvMD8oaD1lIT1lPzE6MCxsPWcpOihsPWEoaShlKS9zKSxlKih1PW4oMiwtbCkpPDEmJihsLS0sdSo9MiksKGUrPWwrcD49MT9tL3U6bSpuKDIsMS1wKSkqdT49MiYmKGwrKyx1Lz0yKSxsK3A+PWc/KGg9MCxsPWcpOmwrcD49MT8oaD0oZSp1LTEpKm4oMixvKSxsKz1wKTooaD1lKm4oMixwLTEpKm4oMixvKSxsPTApKTtvPj04OylkW3krK109MjU1JmgsaC89MjU2LG8tPTg7Zm9yKGw9bDw8b3xoLGYrPW87Zj4wOylkW3krK109MjU1JmwsbC89MjU2LGYtPTg7cmV0dXJuIGRbLS15XXw9MTI4KmIsZH0sdW5wYWNrOmZ1bmN0aW9uKGUsdCl7dmFyIHIsYT1lLmxlbmd0aCxpPTgqYS10LTEscz0oMTw8aSktMSxvPXM+PjEsYz1pLTcsbD1hLTEsaD1lW2wtLV0sdT0xMjcmaDtmb3IoaD4+PTc7Yz4wOyl1PTI1Nip1K2VbbC0tXSxjLT04O2ZvcihyPXUmKDE8PC1jKS0xLHU+Pj0tYyxjKz10O2M+MDspcj0yNTYqcitlW2wtLV0sYy09ODtpZigwPT09dSl1PTEtbztlbHNle2lmKHU9PT1zKXJldHVybiByP05hTjpoPy0xLzA6MS8wO3IrPW4oMix0KSx1LT1vfXJldHVybihoPy0xOjEpKnIqbigyLHUtdCl9fX0sODM2MTooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoNzI5MyksaT1yKDQzMjYpLHM9T2JqZWN0LG89bigiIi5zcGxpdCk7ZS5leHBvcnRzPWEoKGZ1bmN0aW9uKCl7cmV0dXJuIXMoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKX0pKT9mdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIj09aShlKT9vKGUsIiIpOnMoZSl9OnN9LDk1ODc6KGUsdCxyKT0+e3ZhciBuPXIoNjE0KSxhPXIoMTExKSxpPXIoNzY3NCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXt2YXIgcyxvO3JldHVybiBpJiZuKHM9dC5jb25zdHJ1Y3RvcikmJnMhPT1yJiZhKG89cy5wcm90b3R5cGUpJiZvIT09ci5wcm90b3R5cGUmJmkoZSxvKSxlfX0sMjc4ODooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoNjE0KSxpPXIoNTQ2NSkscz1uKEZ1bmN0aW9uLnRvU3RyaW5nKTthKGkuaW5zcGVjdFNvdXJjZSl8fChpLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHMoZSl9KSxlLmV4cG9ydHM9aS5pbnNwZWN0U291cmNlfSw4MzQwOihlLHQscik9Pnt2YXIgbj1yKDExMSksYT1yKDg4ODApO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe24odCkmJiJjYXVzZSJpbiB0JiZhKGUsImNhdXNlIix0LmNhdXNlKX19LDI0MjM6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDE3MDIpLGk9cigzNTAxKSxzPXIoMTExKSxvPXIoMjU5NyksYz1yKDMwNzApLmYsbD1yKDgwMDYpLGg9cigxMTU2KSx1PXIoMjA1MCksZD1yKDk3MTEpLGY9cig2Njc3KSxnPSExLHA9ZCgibWV0YSIpLG09MCxiPWZ1bmN0aW9uKGUpe2MoZSxwLHt2YWx1ZTp7b2JqZWN0SUQ6Ik8iK20rKyx3ZWFrRGF0YTp7fX19KX0seT1lLmV4cG9ydHM9e2VuYWJsZTpmdW5jdGlvbigpe3kuZW5hYmxlPWZ1bmN0aW9uKCl7fSxnPSEwO3ZhciBlPWwuZix0PWEoW10uc3BsaWNlKSxyPXt9O3JbcF09MSxlKHIpLmxlbmd0aCYmKGwuZj1mdW5jdGlvbihyKXtmb3IodmFyIG49ZShyKSxhPTAsaT1uLmxlbmd0aDthPGk7YSsrKWlmKG5bYV09PT1wKXt0KG4sYSwxKTticmVha31yZXR1cm4gbn0sbih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiEwfSx7Z2V0T3duUHJvcGVydHlOYW1lczpoLmZ9KSl9LGZhc3RLZXk6ZnVuY3Rpb24oZSx0KXtpZighcyhlKSlyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGU/ZTooInN0cmluZyI9PXR5cGVvZiBlPyJTIjoiUCIpK2U7aWYoIW8oZSxwKSl7aWYoIXUoZSkpcmV0dXJuIkYiO2lmKCF0KXJldHVybiJFIjtiKGUpfXJldHVybiBlW3BdLm9iamVjdElEfSxnZXRXZWFrRGF0YTpmdW5jdGlvbihlLHQpe2lmKCFvKGUscCkpe2lmKCF1KGUpKXJldHVybiEwO2lmKCF0KXJldHVybiExO2IoZSl9cmV0dXJuIGVbcF0ud2Vha0RhdGF9LG9uRnJlZXplOmZ1bmN0aW9uKGUpe3JldHVybiBmJiZnJiZ1KGUpJiYhbyhlLHApJiZiKGUpLGV9fTtpW3BdPSEwfSw5OTA5OihlLHQscik9Pnt2YXIgbixhLGkscz1yKDQ4MTEpLG89cig3ODU0KSxjPXIoMTExKSxsPXIoODg4MCksaD1yKDI1OTcpLHU9cig1NDY1KSxkPXIoNjIwMCksZj1yKDM1MDEpLGc9Ik9iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkIixwPW8uVHlwZUVycm9yLG09by5XZWFrTWFwO2lmKHN8fHUuc3RhdGUpe3ZhciBiPXUuc3RhdGV8fCh1LnN0YXRlPW5ldyBtKTtiLmdldD1iLmdldCxiLmhhcz1iLmhhcyxiLnNldD1iLnNldCxuPWZ1bmN0aW9uKGUsdCl7aWYoYi5oYXMoZSkpdGhyb3cgcChnKTtyZXR1cm4gdC5mYWNhZGU9ZSxiLnNldChlLHQpLHR9LGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGIuZ2V0KGUpfHx7fX0saT1mdW5jdGlvbihlKXtyZXR1cm4gYi5oYXMoZSl9fWVsc2V7dmFyIHk9ZCgic3RhdGUiKTtmW3ldPSEwLG49ZnVuY3Rpb24oZSx0KXtpZihoKGUseSkpdGhyb3cgcChnKTtyZXR1cm4gdC5mYWNhZGU9ZSxsKGUseSx0KSx0fSxhPWZ1bmN0aW9uKGUpe3JldHVybiBoKGUseSk/ZVt5XTp7fX0saT1mdW5jdGlvbihlKXtyZXR1cm4gaChlLHkpfX1lLmV4cG9ydHM9e3NldDpuLGdldDphLGhhczppLGVuZm9yY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSk/YShlKTpuKGUse30pfSxnZXR0ZXJGb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByO2lmKCFjKHQpfHwocj1hKHQpKS50eXBlIT09ZSl0aHJvdyBwKCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICIrZSsiIHJlcXVpcmVkIik7cmV0dXJuIHJ9fX19LDc2NTk6KGUsdCxyKT0+e3ZhciBuPXIoNTExMiksYT1yKDc0OTcpLGk9bigiaXRlcmF0b3IiKSxzPUFycmF5LnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUmJihhLkFycmF5PT09ZXx8c1tpXT09PWUpfX0sMzE1NzooZSx0LHIpPT57dmFyIG49cig0MzI2KTtlLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIkFycmF5Ij09bihlKX19LDQwNjc6KGUsdCxyKT0+e3ZhciBuPXIoNjQ4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bihlKTtyZXR1cm4iQmlnSW50NjRBcnJheSI9PXR8fCJCaWdVaW50NjRBcnJheSI9PXR9fSw2MTQ6KGUsdCxyKT0+e3ZhciBuPXIoNDE1NCksYT1uLmFsbDtlLmV4cG9ydHM9bi5JU19IVE1MRERBP2Z1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfHxlPT09YX06ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9fSw0NDExOihlLHQscik9Pnt2YXIgbj1yKDE3MDIpLGE9cig3MjkzKSxpPXIoNjE0KSxzPXIoNjQ4KSxvPXIoNTAwNSksYz1yKDI3ODgpLGw9ZnVuY3Rpb24oKXt9LGg9W10sdT1vKCJSZWZsZWN0IiwiY29uc3RydWN0IiksZD0vXlxzKig/OmNsYXNzfGZ1bmN0aW9uKVxiLyxmPW4oZC5leGVjKSxnPSFkLmV4ZWMobCkscD1mdW5jdGlvbihlKXtpZighaShlKSlyZXR1cm4hMTt0cnl7cmV0dXJuIHUobCxoLGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX0sbT1mdW5jdGlvbihlKXtpZighaShlKSlyZXR1cm4hMTtzd2l0Y2gocyhlKSl7Y2FzZSJBc3luY0Z1bmN0aW9uIjpjYXNlIkdlbmVyYXRvckZ1bmN0aW9uIjpjYXNlIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb24iOnJldHVybiExfXRyeXtyZXR1cm4gZ3x8ISFmKGQsYyhlKSl9Y2F0Y2goZSl7cmV0dXJuITB9fTttLnNoYW09ITAsZS5leHBvcnRzPSF1fHxhKChmdW5jdGlvbigpe3ZhciBlO3JldHVybiBwKHAuY2FsbCl8fCFwKE9iamVjdCl8fCFwKChmdW5jdGlvbigpe2U9ITB9KSl8fGV9KSk/bTpwfSw0NzA1OihlLHQscik9Pnt2YXIgbj1yKDcyOTMpLGE9cig2MTQpLGk9LyN8XC5wcm90b3R5cGVcLi8scz1mdW5jdGlvbihlLHQpe3ZhciByPWNbbyhlKV07cmV0dXJuIHI9PWh8fHIhPWwmJihhKHQpP24odCk6ISF0KX0sbz1zLm5vcm1hbGl6ZT1mdW5jdGlvbihlKXtyZXR1cm4gU3RyaW5nKGUpLnJlcGxhY2UoaSwiLiIpLnRvTG93ZXJDYXNlKCl9LGM9cy5kYXRhPXt9LGw9cy5OQVRJVkU9Ik4iLGg9cy5QT0xZRklMTD0iUCI7ZS5leHBvcnRzPXN9LDU5ODg6KGUsdCxyKT0+e3ZhciBuPXIoMTExKSxhPU1hdGguZmxvb3I7ZS5leHBvcnRzPU51bWJlci5pc0ludGVnZXJ8fGZ1bmN0aW9uKGUpe3JldHVybiFuKGUpJiZpc0Zpbml0ZShlKSYmYShlKT09PWV9fSw4NTU0OmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV9fSwxMTE6KGUsdCxyKT0+e3ZhciBuPXIoNjE0KSxhPXIoNDE1NCksaT1hLmFsbDtlLmV4cG9ydHM9YS5JU19IVE1MRERBP2Z1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZT9udWxsIT09ZTpuKGUpfHxlPT09aX06ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP251bGwhPT1lOm4oZSl9fSwxOTEzOmU9PntlLmV4cG9ydHM9ITF9LDc4NTA6KGUsdCxyKT0+e3ZhciBuPXIoMTExKSxhPXIoNDMyNiksaT1yKDUxMTIpKCJtYXRjaCIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gbihlKSYmKHZvaWQgMCE9PSh0PWVbaV0pPyEhdDoiUmVnRXhwIj09YShlKSl9fSwyMTkwOihlLHQscik9Pnt2YXIgbj1yKDUwMDUpLGE9cig2MTQpLGk9cig3OTc2KSxzPXIoMzMwNyksbz1PYmplY3Q7ZS5leHBvcnRzPXM/ZnVuY3Rpb24oZSl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiBlfTpmdW5jdGlvbihlKXt2YXIgdD1uKCJTeW1ib2wiKTtyZXR1cm4gYSh0KSYmaSh0LnByb3RvdHlwZSxvKGUpKX19LDQwODooZSx0LHIpPT57dmFyIG49cig5OTc0KSxhPXIoNjkxNiksaT1yKDk2NzApLHM9cig2MzMwKSxvPXIoNzY1OSksYz1yKDYyNDQpLGw9cig3OTc2KSxoPXIoNDEyMSksdT1yKDEyNDYpLGQ9cig5MjEyKSxmPVR5cGVFcnJvcixnPWZ1bmN0aW9uKGUsdCl7dGhpcy5zdG9wcGVkPWUsdGhpcy5yZXN1bHQ9dH0scD1nLnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe3ZhciBtLGIseSx3LHYseCxTLEE9ciYmci50aGF0LGs9ISghcnx8IXIuQVNfRU5UUklFUyksQz0hKCFyfHwhci5JU19SRUNPUkQpLE89ISghcnx8IXIuSVNfSVRFUkFUT1IpLEY9ISghcnx8IXIuSU5URVJSVVBURUQpLEk9bih0LEEpLFQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG0mJmQobSwibm9ybWFsIixlKSxuZXcgZyghMCxlKX0sTT1mdW5jdGlvbihlKXtyZXR1cm4gaz8oaShlKSxGP0koZVswXSxlWzFdLFQpOkkoZVswXSxlWzFdKSk6Rj9JKGUsVCk6SShlKX07aWYoQyltPWUuaXRlcmF0b3I7ZWxzZSBpZihPKW09ZTtlbHNle2lmKCEoYj11KGUpKSl0aHJvdyBmKHMoZSkrIiBpcyBub3QgaXRlcmFibGUiKTtpZihvKGIpKXtmb3IoeT0wLHc9YyhlKTt3Pnk7eSsrKWlmKCh2PU0oZVt5XSkpJiZsKHAsdikpcmV0dXJuIHY7cmV0dXJuIG5ldyBnKCExKX1tPWgoZSxiKX1mb3IoeD1DP2UubmV4dDptLm5leHQ7IShTPWEoeCxtKSkuZG9uZTspe3RyeXt2PU0oUy52YWx1ZSl9Y2F0Y2goZSl7ZChtLCJ0aHJvdyIsZSl9aWYoIm9iamVjdCI9PXR5cGVvZiB2JiZ2JiZsKHAsdikpcmV0dXJuIHZ9cmV0dXJuIG5ldyBnKCExKX19LDkyMTI6KGUsdCxyKT0+e3ZhciBuPXIoNjkxNiksYT1yKDk2NzApLGk9cig4MTczKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe3ZhciBzLG87YShlKTt0cnl7aWYoIShzPWkoZSwicmV0dXJuIikpKXtpZigidGhyb3ciPT09dCl0aHJvdyByO3JldHVybiByfXM9bihzLGUpfWNhdGNoKGUpe289ITAscz1lfWlmKCJ0aHJvdyI9PT10KXRocm93IHI7aWYobyl0aHJvdyBzO3JldHVybiBhKHMpLHJ9fSwzMDYxOihlLHQscik9Pnt2YXIgbj1yKDMzODMpLkl0ZXJhdG9yUHJvdG90eXBlLGE9cigzMCksaT1yKDkxMTQpLHM9cig4MDAzKSxvPXIoNzQ5NyksYz1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIsbCl7dmFyIGg9dCsiIEl0ZXJhdG9yIjtyZXR1cm4gZS5wcm90b3R5cGU9YShuLHtuZXh0OmkoKyFsLHIpfSkscyhlLGgsITEsITApLG9baF09YyxlfX0sMTY1NjooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNjkxNiksaT1yKDE5MTMpLHM9cig2NTMwKSxvPXIoNjE0KSxjPXIoMzA2MSksbD1yKDk1MTgpLGg9cig3Njc0KSx1PXIoODAwMyksZD1yKDg4ODApLGY9cig4MDUyKSxnPXIoNTExMikscD1yKDc0OTcpLG09cigzMzgzKSxiPXMuUFJPUEVSLHk9cy5DT05GSUdVUkFCTEUsdz1tLkl0ZXJhdG9yUHJvdG90eXBlLHY9bS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLHg9ZygiaXRlcmF0b3IiKSxTPSJrZXlzIixBPSJ2YWx1ZXMiLGs9ImVudHJpZXMiLEM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLHMsZyxtLE8pe2Mocix0LHMpO3ZhciBGLEksVCxNPWZ1bmN0aW9uKGUpe2lmKGU9PT1nJiZEKXJldHVybiBEO2lmKCF2JiZlIGluIFIpcmV0dXJuIFJbZV07c3dpdGNoKGUpe2Nhc2UgUzpjYXNlIEE6Y2FzZSBrOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgcih0aGlzLGUpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIodGhpcyl9fSxFPXQrIiBJdGVyYXRvciIsUD0hMSxSPWUucHJvdG90eXBlLE49Ult4XXx8UlsiQEBpdGVyYXRvciJdfHxnJiZSW2ddLEQ9IXYmJk58fE0oZyksQj0iQXJyYXkiPT10JiZSLmVudHJpZXN8fE47aWYoQiYmKEY9bChCLmNhbGwobmV3IGUpKSkhPT1PYmplY3QucHJvdG90eXBlJiZGLm5leHQmJihpfHxsKEYpPT09d3x8KGg/aChGLHcpOm8oRlt4XSl8fGYoRix4LEMpKSx1KEYsRSwhMCwhMCksaSYmKHBbRV09QykpLGImJmc9PUEmJk4mJk4ubmFtZSE9PUEmJighaSYmeT9kKFIsIm5hbWUiLEEpOihQPSEwLEQ9ZnVuY3Rpb24oKXtyZXR1cm4gYShOLHRoaXMpfSkpLGcpaWYoST17dmFsdWVzOk0oQSksa2V5czptP0Q6TShTKSxlbnRyaWVzOk0oayl9LE8pZm9yKFQgaW4gSSkodnx8UHx8IShUIGluIFIpKSYmZihSLFQsSVtUXSk7ZWxzZSBuKHt0YXJnZXQ6dCxwcm90bzohMCxmb3JjZWQ6dnx8UH0sSSk7cmV0dXJuIGkmJiFPfHxSW3hdPT09RHx8ZihSLHgsRCx7bmFtZTpnfSkscFt0XT1ELEl9fSwzMzgzOihlLHQscik9Pnt2YXIgbixhLGkscz1yKDcyOTMpLG89cig2MTQpLGM9cigxMTEpLGw9cigzMCksaD1yKDk1MTgpLHU9cig4MDUyKSxkPXIoNTExMiksZj1yKDE5MTMpLGc9ZCgiaXRlcmF0b3IiKSxwPSExO1tdLmtleXMmJigibmV4dCJpbihpPVtdLmtleXMoKSk/KGE9aChoKGkpKSkhPT1PYmplY3QucHJvdG90eXBlJiYobj1hKTpwPSEwKSwhYyhuKXx8cygoZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4gbltnXS5jYWxsKGUpIT09ZX0pKT9uPXt9OmYmJihuPWwobikpLG8obltnXSl8fHUobixnLChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpLGUuZXhwb3J0cz17SXRlcmF0b3JQcm90b3R5cGU6bixCVUdHWV9TQUZBUklfSVRFUkFUT1JTOnB9fSw3NDk3OmU9PntlLmV4cG9ydHM9e319LDYyNDQ6KGUsdCxyKT0+e3ZhciBuPXIoNzQ2Nik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBuKGUubGVuZ3RoKX19LDYzMzk6KGUsdCxyKT0+e3ZhciBuPXIoMTcwMiksYT1yKDcyOTMpLGk9cig2MTQpLHM9cigyNTk3KSxvPXIoOTc4MSksYz1yKDY1MzApLkNPTkZJR1VSQUJMRSxsPXIoMjc4OCksaD1yKDk5MDkpLHU9aC5lbmZvcmNlLGQ9aC5nZXQsZj1TdHJpbmcsZz1PYmplY3QuZGVmaW5lUHJvcGVydHkscD1uKCIiLnNsaWNlKSxtPW4oIiIucmVwbGFjZSksYj1uKFtdLmpvaW4pLHk9byYmIWEoKGZ1bmN0aW9uKCl7cmV0dXJuIDghPT1nKChmdW5jdGlvbigpe30pLCJsZW5ndGgiLHt2YWx1ZTo4fSkubGVuZ3RofSkpLHc9U3RyaW5nKFN0cmluZykuc3BsaXQoIlN0cmluZyIpLHY9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXsiU3ltYm9sKCI9PT1wKGYodCksMCw3KSYmKHQ9IlsiK20oZih0KSwvXlN5bWJvbFwoKFteKV0qKVwpLywiJDEiKSsiXSIpLHImJnIuZ2V0dGVyJiYodD0iZ2V0ICIrdCksciYmci5zZXR0ZXImJih0PSJzZXQgIit0KSwoIXMoZSwibmFtZSIpfHxjJiZlLm5hbWUhPT10KSYmKG8/ZyhlLCJuYW1lIix7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KTplLm5hbWU9dCkseSYmciYmcyhyLCJhcml0eSIpJiZlLmxlbmd0aCE9PXIuYXJpdHkmJmcoZSwibGVuZ3RoIix7dmFsdWU6ci5hcml0eX0pO3RyeXtyJiZzKHIsImNvbnN0cnVjdG9yIikmJnIuY29uc3RydWN0b3I/byYmZyhlLCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pOmUucHJvdG90eXBlJiYoZS5wcm90b3R5cGU9dm9pZCAwKX1jYXRjaChlKXt9dmFyIG49dShlKTtyZXR1cm4gcyhuLCJzb3VyY2UiKXx8KG4uc291cmNlPWIodywic3RyaW5nIj09dHlwZW9mIHQ/dDoiIikpLGV9O0Z1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZz12KChmdW5jdGlvbigpe3JldHVybiBpKHRoaXMpJiZkKHRoaXMpLnNvdXJjZXx8bCh0aGlzKX0pLCJ0b1N0cmluZyIpfSw0NzU4OmU9Pnt2YXIgdD1NYXRoLmNlaWwscj1NYXRoLmZsb29yO2UuZXhwb3J0cz1NYXRoLnRydW5jfHxmdW5jdGlvbihlKXt2YXIgbj0rZTtyZXR1cm4obj4wP3I6dCkobil9fSw1OTQ4OihlLHQscik9Pnt2YXIgbixhLGkscyxvLGM9cig3ODU0KSxsPXIoOTk3NCksaD1yKDEyMzYpLmYsdT1yKDI2MSkuc2V0LGQ9cig4NTcyKSxmPXIoNjgzMyksZz1yKDE1MjgpLHA9cigxMDM2KSxtPXIoNTI2OCksYj1jLk11dGF0aW9uT2JzZXJ2ZXJ8fGMuV2ViS2l0TXV0YXRpb25PYnNlcnZlcix5PWMuZG9jdW1lbnQsdz1jLnByb2Nlc3Msdj1jLlByb21pc2UseD1oKGMsInF1ZXVlTWljcm90YXNrIiksUz14JiZ4LnZhbHVlO2lmKCFTKXt2YXIgQT1uZXcgZCxrPWZ1bmN0aW9uKCl7dmFyIGUsdDtmb3IobSYmKGU9dy5kb21haW4pJiZlLmV4aXQoKTt0PUEuZ2V0KCk7KXRyeXt0KCl9Y2F0Y2goZSl7dGhyb3cgQS5oZWFkJiZuKCksZX1lJiZlLmVudGVyKCl9O2Z8fG18fHB8fCFifHwheT8hZyYmdiYmdi5yZXNvbHZlPygocz12LnJlc29sdmUodm9pZCAwKSkuY29uc3RydWN0b3I9dixvPWwocy50aGVuLHMpLG49ZnVuY3Rpb24oKXtvKGspfSk6bT9uPWZ1bmN0aW9uKCl7dy5uZXh0VGljayhrKX06KHU9bCh1LGMpLG49ZnVuY3Rpb24oKXt1KGspfSk6KGE9ITAsaT15LmNyZWF0ZVRleHROb2RlKCIiKSxuZXcgYihrKS5vYnNlcnZlKGkse2NoYXJhY3RlckRhdGE6ITB9KSxuPWZ1bmN0aW9uKCl7aS5kYXRhPWE9IWF9KSxTPWZ1bmN0aW9uKGUpe0EuaGVhZHx8bigpLEEuYWRkKGUpfX1lLmV4cG9ydHM9U30sODUyMzooZSx0LHIpPT57dmFyIG49cig5NjYyKSxhPVR5cGVFcnJvcixpPWZ1bmN0aW9uKGUpe3ZhciB0LHI7dGhpcy5wcm9taXNlPW5ldyBlKChmdW5jdGlvbihlLG4pe2lmKHZvaWQgMCE9PXR8fHZvaWQgMCE9PXIpdGhyb3cgYSgiQmFkIFByb21pc2UgY29uc3RydWN0b3IiKTt0PWUscj1ufSkpLHRoaXMucmVzb2x2ZT1uKHQpLHRoaXMucmVqZWN0PW4ocil9O2UuZXhwb3J0cy5mPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgaShlKX19LDYyNzc6KGUsdCxyKT0+e3ZhciBuPXIoMTM0MCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PWU/YXJndW1lbnRzLmxlbmd0aDwyPyIiOnQ6bihlKX19LDM5Mjk6KGUsdCxyKT0+e3ZhciBuPXIoNzg1MCksYT1UeXBlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKG4oZSkpdGhyb3cgYSgiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zIik7cmV0dXJuIGV9fSwyODE0OihlLHQscik9Pnt2YXIgbj1yKDc4NTQpLGE9cig3MjkzKSxpPXIoMTcwMikscz1yKDEzNDApLG89cigzMTExKS50cmltLGM9cigxMzYxKSxsPWkoIiIuY2hhckF0KSxoPW4ucGFyc2VGbG9hdCx1PW4uU3ltYm9sLGQ9dSYmdS5pdGVyYXRvcixmPTEvaChjKyItMCIpIT0tMS8wfHxkJiYhYSgoZnVuY3Rpb24oKXtoKE9iamVjdChkKSl9KSk7ZS5leHBvcnRzPWY/ZnVuY3Rpb24oZSl7dmFyIHQ9byhzKGUpKSxyPWgodCk7cmV0dXJuIDA9PT1yJiYiLSI9PWwodCwwKT8tMDpyfTpofSwzMDA5OihlLHQscik9Pnt2YXIgbj1yKDc4NTQpLGE9cig3MjkzKSxpPXIoMTcwMikscz1yKDEzNDApLG89cigzMTExKS50cmltLGM9cigxMzYxKSxsPW4ucGFyc2VJbnQsaD1uLlN5bWJvbCx1PWgmJmguaXRlcmF0b3IsZD0vXlsrLV0/MHgvaSxmPWkoZC5leGVjKSxnPTghPT1sKGMrIjA4Iil8fDIyIT09bChjKyIweDE2Iil8fHUmJiFhKChmdW5jdGlvbigpe2woT2JqZWN0KHUpKX0pKTtlLmV4cG9ydHM9Zz9mdW5jdGlvbihlLHQpe3ZhciByPW8ocyhlKSk7cmV0dXJuIGwocix0Pj4+MHx8KGYoZCxyKT8xNjoxMCkpfTpsfSwxNTc0OihlLHQscik9Pnt2YXIgbj1yKDk3ODEpLGE9cigxNzAyKSxpPXIoNjkxNikscz1yKDcyOTMpLG89cigxOTU2KSxjPXIoNTE4MSksbD1yKDUyOTYpLGg9cig3OTA4KSx1PXIoODM2MSksZD1PYmplY3QuYXNzaWduLGY9T2JqZWN0LmRlZmluZVByb3BlcnR5LGc9YShbXS5jb25jYXQpO2UuZXhwb3J0cz0hZHx8cygoZnVuY3Rpb24oKXtpZihuJiYxIT09ZCh7YjoxfSxkKGYoe30sImEiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2YodGhpcywiYiIse3ZhbHVlOjMsZW51bWVyYWJsZTohMX0pfX0pLHtiOjJ9KSkuYilyZXR1cm4hMDt2YXIgZT17fSx0PXt9LHI9U3ltYm9sKCksYT0iYWJjZGVmZ2hpamtsbW5vcHFyc3QiO3JldHVybiBlW3JdPTcsYS5zcGxpdCgiIikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dFtlXT1lfSkpLDchPWQoe30sZSlbcl18fG8oZCh7fSx0KSkuam9pbigiIikhPWF9KSk/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9aChlKSxhPWFyZ3VtZW50cy5sZW5ndGgscz0xLGQ9Yy5mLGY9bC5mO2E+czspZm9yKHZhciBwLG09dShhcmd1bWVudHNbcysrXSksYj1kP2cobyhtKSxkKG0pKTpvKG0pLHk9Yi5sZW5ndGgsdz0wO3k+dzspcD1iW3crK10sbiYmIWkoZixtLHApfHwocltwXT1tW3BdKTtyZXR1cm4gcn06ZH0sMzA6KGUsdCxyKT0+e3ZhciBuLGE9cig5NjcwKSxpPXIoNjA0OCkscz1yKDc0OCksbz1yKDM1MDEpLGM9cig0OTApLGw9cigzMTcpLGg9cig2MjAwKSx1PSJwcm90b3R5cGUiLGQ9InNjcmlwdCIsZj1oKCJJRV9QUk9UTyIpLGc9ZnVuY3Rpb24oKXt9LHA9ZnVuY3Rpb24oZSl7cmV0dXJuIjwiK2QrIj4iK2UrIjwvIitkKyI+In0sbT1mdW5jdGlvbihlKXtlLndyaXRlKHAoIiIpKSxlLmNsb3NlKCk7dmFyIHQ9ZS5wYXJlbnRXaW5kb3cuT2JqZWN0O3JldHVybiBlPW51bGwsdH0sYj1mdW5jdGlvbigpe3RyeXtuPW5ldyBBY3RpdmVYT2JqZWN0KCJodG1sZmlsZSIpfWNhdGNoKGUpe312YXIgZSx0LHI7Yj0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50LmRvbWFpbiYmbj9tKG4pOih0PWwoImlmcmFtZSIpLHI9ImphdmEiK2QrIjoiLHQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYy5hcHBlbmRDaGlsZCh0KSx0LnNyYz1TdHJpbmcociksKGU9dC5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCksZS53cml0ZShwKCJkb2N1bWVudC5GPU9iamVjdCIpKSxlLmNsb3NlKCksZS5GKTptKG4pO2Zvcih2YXIgYT1zLmxlbmd0aDthLS07KWRlbGV0ZSBiW3VdW3NbYV1dO3JldHVybiBiKCl9O29bZl09ITAsZS5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKGUsdCl7dmFyIHI7cmV0dXJuIG51bGwhPT1lPyhnW3VdPWEoZSkscj1uZXcgZyxnW3VdPW51bGwscltmXT1lKTpyPWIoKSx2b2lkIDA9PT10P3I6aS5mKHIsdCl9fSw2MDQ4OihlLHQscik9Pnt2YXIgbj1yKDk3ODEpLGE9cigzMzUzKSxpPXIoMzA3MCkscz1yKDk2NzApLG89cig1NjU2KSxjPXIoMTk1Nik7dC5mPW4mJiFhP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKGUsdCl7cyhlKTtmb3IodmFyIHIsbj1vKHQpLGE9Yyh0KSxsPWEubGVuZ3RoLGg9MDtsPmg7KWkuZihlLHI9YVtoKytdLG5bcl0pO3JldHVybiBlfX0sMzA3MDooZSx0LHIpPT57dmFyIG49cig5NzgxKSxhPXIoNDY2NCksaT1yKDMzNTMpLHM9cig5NjcwKSxvPXIoNDk0OCksYz1UeXBlRXJyb3IsbD1PYmplY3QuZGVmaW5lUHJvcGVydHksaD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHU9ImVudW1lcmFibGUiLGQ9ImNvbmZpZ3VyYWJsZSIsZj0id3JpdGFibGUiO3QuZj1uP2k/ZnVuY3Rpb24oZSx0LHIpe2lmKHMoZSksdD1vKHQpLHMociksImZ1bmN0aW9uIj09dHlwZW9mIGUmJiJwcm90b3R5cGUiPT09dCYmInZhbHVlImluIHImJmYgaW4gciYmIXJbZl0pe3ZhciBuPWgoZSx0KTtuJiZuW2ZdJiYoZVt0XT1yLnZhbHVlLHI9e2NvbmZpZ3VyYWJsZTpkIGluIHI/cltkXTpuW2RdLGVudW1lcmFibGU6dSBpbiByP3JbdV06blt1XSx3cml0YWJsZTohMX0pfXJldHVybiBsKGUsdCxyKX06bDpmdW5jdGlvbihlLHQscil7aWYocyhlKSx0PW8odCkscyhyKSxhKXRyeXtyZXR1cm4gbChlLHQscil9Y2F0Y2goZSl7fWlmKCJnZXQiaW4gcnx8InNldCJpbiByKXRocm93IGMoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIHImJihlW3RdPXIudmFsdWUpLGV9fSwxMjM2OihlLHQscik9Pnt2YXIgbj1yKDk3ODEpLGE9cig2OTE2KSxpPXIoNTI5Nikscz1yKDkxMTQpLG89cig1NjU2KSxjPXIoNDk0OCksbD1yKDI1OTcpLGg9cig0NjY0KSx1PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7dC5mPW4/dTpmdW5jdGlvbihlLHQpe2lmKGU9byhlKSx0PWModCksaCl0cnl7cmV0dXJuIHUoZSx0KX1jYXRjaChlKXt9aWYobChlLHQpKXJldHVybiBzKCFhKGkuZixlLHQpLGVbdF0pfX0sMTE1NjooZSx0LHIpPT57dmFyIG49cig0MzI2KSxhPXIoNTY1NiksaT1yKDgwMDYpLmYscz1yKDE1ODkpLG89Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTtlLmV4cG9ydHMuZj1mdW5jdGlvbihlKXtyZXR1cm4gbyYmIldpbmRvdyI9PW4oZSk/ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBpKGUpfWNhdGNoKGUpe3JldHVybiBzKG8pfX0oZSk6aShhKGUpKX19LDgwMDY6KGUsdCxyKT0+e3ZhciBuPXIoNjMyNCksYT1yKDc0OCkuY29uY2F0KCJsZW5ndGgiLCJwcm90b3R5cGUiKTt0LmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uKGUpe3JldHVybiBuKGUsYSl9fSw1MTgxOihlLHQpPT57dC5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHN9LDk1MTg6KGUsdCxyKT0+e3ZhciBuPXIoMjU5NyksYT1yKDYxNCksaT1yKDc5MDgpLHM9cig2MjAwKSxvPXIoODU0NCksYz1zKCJJRV9QUk9UTyIpLGw9T2JqZWN0LGg9bC5wcm90b3R5cGU7ZS5leHBvcnRzPW8/bC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihlKXt2YXIgdD1pKGUpO2lmKG4odCxjKSlyZXR1cm4gdFtjXTt2YXIgcj10LmNvbnN0cnVjdG9yO3JldHVybiBhKHIpJiZ0IGluc3RhbmNlb2Ygcj9yLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgbD9oOm51bGx9fSwyMDUwOihlLHQscik9Pnt2YXIgbj1yKDcyOTMpLGE9cigxMTEpLGk9cig0MzI2KSxzPXIoNzU1Niksbz1PYmplY3QuaXNFeHRlbnNpYmxlLGM9bigoZnVuY3Rpb24oKXtvKDEpfSkpO2UuZXhwb3J0cz1jfHxzP2Z1bmN0aW9uKGUpe3JldHVybiEhYShlKSYmKCFzfHwiQXJyYXlCdWZmZXIiIT1pKGUpKSYmKCFvfHxvKGUpKX06b30sNzk3NjooZSx0LHIpPT57dmFyIG49cigxNzAyKTtlLmV4cG9ydHM9bih7fS5pc1Byb3RvdHlwZU9mKX0sNjMyNDooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoMjU5NyksaT1yKDU2NTYpLHM9cigxMzE4KS5pbmRleE9mLG89cigzNTAxKSxjPW4oW10ucHVzaCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbj1pKGUpLGw9MCxoPVtdO2ZvcihyIGluIG4pIWEobyxyKSYmYShuLHIpJiZjKGgscik7Zm9yKDt0Lmxlbmd0aD5sOylhKG4scj10W2wrK10pJiYofnMoaCxyKXx8YyhoLHIpKTtyZXR1cm4gaH19LDE5NTY6KGUsdCxyKT0+e3ZhciBuPXIoNjMyNCksYT1yKDc0OCk7ZS5leHBvcnRzPU9iamVjdC5rZXlzfHxmdW5jdGlvbihlKXtyZXR1cm4gbihlLGEpfX0sNTI5NjooZSx0KT0+e3ZhciByPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixhPW4mJiFyLmNhbGwoezE6Mn0sMSk7dC5mPWE/ZnVuY3Rpb24oZSl7dmFyIHQ9bih0aGlzLGUpO3JldHVybiEhdCYmdC5lbnVtZXJhYmxlfTpyfSw3Njc0OihlLHQscik9Pnt2YXIgbj1yKDU2NjgpLGE9cig5NjcwKSxpPXIoNjA3Nyk7ZS5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciBlLHQ9ITEscj17fTt0cnl7KGU9bihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iLCJzZXQiKSkocixbXSksdD1yIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2goZSl7fXJldHVybiBmdW5jdGlvbihyLG4pe3JldHVybiBhKHIpLGkobiksdD9lKHIsbik6ci5fX3Byb3RvX189bixyfX0oKTp2b2lkIDApfSwyMTQwOihlLHQscik9Pnt2YXIgbj1yKDY5MTYpLGE9cig2MTQpLGk9cigxMTEpLHM9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByLG87aWYoInN0cmluZyI9PT10JiZhKHI9ZS50b1N0cmluZykmJiFpKG89bihyLGUpKSlyZXR1cm4gbztpZihhKHI9ZS52YWx1ZU9mKSYmIWkobz1uKHIsZSkpKXJldHVybiBvO2lmKCJzdHJpbmciIT09dCYmYShyPWUudG9TdHJpbmcpJiYhaShvPW4ocixlKSkpcmV0dXJuIG87dGhyb3cgcygiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSwzODg3OihlLHQscik9Pnt2YXIgbj1yKDUwMDUpLGE9cigxNzAyKSxpPXIoODAwNikscz1yKDUxODEpLG89cig5NjcwKSxjPWEoW10uY29uY2F0KTtlLmV4cG9ydHM9bigiUmVmbGVjdCIsIm93bktleXMiKXx8ZnVuY3Rpb24oZSl7dmFyIHQ9aS5mKG8oZSkpLHI9cy5mO3JldHVybiByP2ModCxyKGUpKTp0fX0sMjUzNDplPT57ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm57ZXJyb3I6ITEsdmFsdWU6ZSgpfX1jYXRjaChlKXtyZXR1cm57ZXJyb3I6ITAsdmFsdWU6ZX19fX0sMzcwMjooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPXIoMjQ5MiksaT1yKDYxNCkscz1yKDQ3MDUpLG89cigyNzg4KSxjPXIoNTExMiksbD1yKDc4NzEpLGg9cigzODIzKSx1PXIoMTkxMyksZD1yKDczOTIpLGY9YSYmYS5wcm90b3R5cGUsZz1jKCJzcGVjaWVzIikscD0hMSxtPWkobi5Qcm9taXNlUmVqZWN0aW9uRXZlbnQpLGI9cygiUHJvbWlzZSIsKGZ1bmN0aW9uKCl7dmFyIGU9byhhKSx0PWUhPT1TdHJpbmcoYSk7aWYoIXQmJjY2PT09ZClyZXR1cm4hMDtpZih1JiYoIWYuY2F0Y2h8fCFmLmZpbmFsbHkpKXJldHVybiEwO2lmKCFkfHxkPDUxfHwhL25hdGl2ZSBjb2RlLy50ZXN0KGUpKXt2YXIgcj1uZXcgYSgoZnVuY3Rpb24oZSl7ZSgxKX0pKSxuPWZ1bmN0aW9uKGUpe2UoKGZ1bmN0aW9uKCl7fSksKGZ1bmN0aW9uKCl7fSkpfTtpZigoci5jb25zdHJ1Y3Rvcj17fSlbZ109biwhKHA9ci50aGVuKChmdW5jdGlvbigpe30pKWluc3RhbmNlb2YgbikpcmV0dXJuITB9cmV0dXJuIXQmJihsfHxoKSYmIW19KSk7ZS5leHBvcnRzPXtDT05TVFJVQ1RPUjpiLFJFSkVDVElPTl9FVkVOVDptLFNVQkNMQVNTSU5HOnB9fSwyNDkyOihlLHQscik9Pnt2YXIgbj1yKDc4NTQpO2UuZXhwb3J0cz1uLlByb21pc2V9LDk0Nzg6KGUsdCxyKT0+e3ZhciBuPXIoOTY3MCksYT1yKDExMSksaT1yKDg1MjMpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKG4oZSksYSh0KSYmdC5jb25zdHJ1Y3Rvcj09PWUpcmV0dXJuIHQ7dmFyIHI9aS5mKGUpO3JldHVybigwLHIucmVzb2x2ZSkodCksci5wcm9taXNlfX0sNjEyOihlLHQscik9Pnt2YXIgbj1yKDI0OTIpLGE9cig3MDcyKSxpPXIoMzcwMikuQ09OU1RSVUNUT1I7ZS5leHBvcnRzPWl8fCFhKChmdW5jdGlvbihlKXtuLmFsbChlKS50aGVuKHZvaWQgMCwoZnVuY3Rpb24oKXt9KSl9KSl9LDI2MjY6KGUsdCxyKT0+e3ZhciBuPXIoMzA3MCkuZjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe3IgaW4gZXx8bihlLHIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtyXX0sc2V0OmZ1bmN0aW9uKGUpe3Rbcl09ZX19KX19LDg1NzI6ZT0+e3ZhciB0PWZ1bmN0aW9uKCl7dGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGx9O3QucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24oZSl7dmFyIHQ9e2l0ZW06ZSxuZXh0Om51bGx9LHI9dGhpcy50YWlsO3I/ci5uZXh0PXQ6dGhpcy5oZWFkPXQsdGhpcy50YWlsPXR9LGdldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaGVhZDtpZihlKXJldHVybiBudWxsPT09KHRoaXMuaGVhZD1lLm5leHQpJiYodGhpcy50YWlsPW51bGwpLGUuaXRlbX19LGUuZXhwb3J0cz10fSw3NjUxOihlLHQscik9Pnt2YXIgbj1yKDY5MTYpLGE9cig5NjcwKSxpPXIoNjE0KSxzPXIoNDMyNiksbz1yKDIyNjEpLGM9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByPWUuZXhlYztpZihpKHIpKXt2YXIgbD1uKHIsZSx0KTtyZXR1cm4gbnVsbCE9PWwmJmEobCksbH1pZigiUmVnRXhwIj09PXMoZSkpcmV0dXJuIG4obyxlLHQpO3Rocm93IGMoIlJlZ0V4cCNleGVjIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgcmVjZWl2ZXIiKX19LDIyNjE6KGUsdCxyKT0+e3ZhciBuLGEsaT1yKDY5MTYpLHM9cigxNzAyKSxvPXIoMTM0MCksYz1yKDcwNjYpLGw9cigyOTk5KSxoPXIoMjMwOSksdT1yKDMwKSxkPXIoOTkwOSkuZ2V0LGY9cig5NDQxKSxnPXIoNzE2OCkscD1oKCJuYXRpdmUtc3RyaW5nLXJlcGxhY2UiLFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSksbT1SZWdFeHAucHJvdG90eXBlLmV4ZWMsYj1tLHk9cygiIi5jaGFyQXQpLHc9cygiIi5pbmRleE9mKSx2PXMoIiIucmVwbGFjZSkseD1zKCIiLnNsaWNlKSxTPShhPS9iKi9nLGkobSxuPS9hLywiYSIpLGkobSxhLCJhIiksMCE9PW4ubGFzdEluZGV4fHwwIT09YS5sYXN0SW5kZXgpLEE9bC5CUk9LRU5fQ0FSRVQsaz12b2lkIDAhPT0vKCk/Py8uZXhlYygiIilbMV07KFN8fGt8fEF8fGZ8fGcpJiYoYj1mdW5jdGlvbihlKXt2YXIgdCxyLG4sYSxzLGwsaCxmPXRoaXMsZz1kKGYpLEM9byhlKSxPPWcucmF3O2lmKE8pcmV0dXJuIE8ubGFzdEluZGV4PWYubGFzdEluZGV4LHQ9aShiLE8sQyksZi5sYXN0SW5kZXg9Ty5sYXN0SW5kZXgsdDt2YXIgRj1nLmdyb3VwcyxJPUEmJmYuc3RpY2t5LFQ9aShjLGYpLE09Zi5zb3VyY2UsRT0wLFA9QztpZihJJiYoVD12KFQsInkiLCIiKSwtMT09PXcoVCwiZyIpJiYoVCs9ImciKSxQPXgoQyxmLmxhc3RJbmRleCksZi5sYXN0SW5kZXg+MCYmKCFmLm11bHRpbGluZXx8Zi5tdWx0aWxpbmUmJiJcbiIhPT15KEMsZi5sYXN0SW5kZXgtMSkpJiYoTT0iKD86ICIrTSsiKSIsUD0iICIrUCxFKyspLHI9bmV3IFJlZ0V4cCgiXig/OiIrTSsiKSIsVCkpLGsmJihyPW5ldyBSZWdFeHAoIl4iK00rIiQoPyFcXHMpIixUKSksUyYmKG49Zi5sYXN0SW5kZXgpLGE9aShtLEk/cjpmLFApLEk/YT8oYS5pbnB1dD14KGEuaW5wdXQsRSksYVswXT14KGFbMF0sRSksYS5pbmRleD1mLmxhc3RJbmRleCxmLmxhc3RJbmRleCs9YVswXS5sZW5ndGgpOmYubGFzdEluZGV4PTA6UyYmYSYmKGYubGFzdEluZGV4PWYuZ2xvYmFsP2EuaW5kZXgrYVswXS5sZW5ndGg6biksayYmYSYmYS5sZW5ndGg+MSYmaShwLGFbMF0sciwoZnVuY3Rpb24oKXtmb3Iocz0xO3M8YXJndW1lbnRzLmxlbmd0aC0yO3MrKyl2b2lkIDA9PT1hcmd1bWVudHNbc10mJihhW3NdPXZvaWQgMCl9KSksYSYmRilmb3IoYS5ncm91cHM9bD11KG51bGwpLHM9MDtzPEYubGVuZ3RoO3MrKylsWyhoPUZbc10pWzBdXT1hW2hbMV1dO3JldHVybiBhfSksZS5leHBvcnRzPWJ9LDcwNjY6KGUsdCxyKT0+e3ZhciBuPXIoOTY3MCk7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIGU9bih0aGlzKSx0PSIiO3JldHVybiBlLmhhc0luZGljZXMmJih0Kz0iZCIpLGUuZ2xvYmFsJiYodCs9ImciKSxlLmlnbm9yZUNhc2UmJih0Kz0iaSIpLGUubXVsdGlsaW5lJiYodCs9Im0iKSxlLmRvdEFsbCYmKHQrPSJzIiksZS51bmljb2RlJiYodCs9InUiKSxlLnVuaWNvZGVTZXRzJiYodCs9InYiKSxlLnN0aWNreSYmKHQrPSJ5IiksdH19LDQ3MDY6KGUsdCxyKT0+e3ZhciBuPXIoNjkxNiksYT1yKDI1OTcpLGk9cig3OTc2KSxzPXIoNzA2Niksbz1SZWdFeHAucHJvdG90eXBlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1lLmZsYWdzO3JldHVybiB2b2lkIDAhPT10fHwiZmxhZ3MiaW4gb3x8YShlLCJmbGFncyIpfHwhaShvLGUpP3Q6bihzLGUpfX0sMjk5OTooZSx0LHIpPT57dmFyIG49cig3MjkzKSxhPXIoNzg1NCkuUmVnRXhwLGk9bigoZnVuY3Rpb24oKXt2YXIgZT1hKCJhIiwieSIpO3JldHVybiBlLmxhc3RJbmRleD0yLG51bGwhPWUuZXhlYygiYWJjZCIpfSkpLHM9aXx8bigoZnVuY3Rpb24oKXtyZXR1cm4hYSgiYSIsInkiKS5zdGlja3l9KSksbz1pfHxuKChmdW5jdGlvbigpe3ZhciBlPWEoIl5yIiwiZ3kiKTtyZXR1cm4gZS5sYXN0SW5kZXg9MixudWxsIT1lLmV4ZWMoInN0ciIpfSkpO2UuZXhwb3J0cz17QlJPS0VOX0NBUkVUOm8sTUlTU0VEX1NUSUNLWTpzLFVOU1VQUE9SVEVEX1k6aX19LDk0NDE6KGUsdCxyKT0+e3ZhciBuPXIoNzI5MyksYT1yKDc4NTQpLlJlZ0V4cDtlLmV4cG9ydHM9bigoZnVuY3Rpb24oKXt2YXIgZT1hKCIuIiwicyIpO3JldHVybiEoZS5kb3RBbGwmJmUuZXhlYygiXG4iKSYmInMiPT09ZS5mbGFncyl9KSl9LDcxNjg6KGUsdCxyKT0+e3ZhciBuPXIoNzI5MyksYT1yKDc4NTQpLlJlZ0V4cDtlLmV4cG9ydHM9bigoZnVuY3Rpb24oKXt2YXIgZT1hKCIoPzxhPmIpIiwiZyIpO3JldHVybiJiIiE9PWUuZXhlYygiYiIpLmdyb3Vwcy5hfHwiYmMiIT09ImIiLnJlcGxhY2UoZSwiJDxhPmMiKX0pKX0sNDQ4ODooZSx0LHIpPT57dmFyIG49cig4NTU0KSxhPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYobihlKSl0aHJvdyBhKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiK2UpO3JldHVybiBlfX0sNjM0MDooZSx0LHIpPT57dmFyIG49cig1MDA1KSxhPXIoNzA0NSksaT1yKDUxMTIpLHM9cig5NzgxKSxvPWkoInNwZWNpZXMiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bihlKTtzJiZ0JiYhdFtvXSYmYSh0LG8se2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LDgwMDM6KGUsdCxyKT0+e3ZhciBuPXIoMzA3MCkuZixhPXIoMjU5NyksaT1yKDUxMTIpKCJ0b1N0cmluZ1RhZyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7ZSYmIXImJihlPWUucHJvdG90eXBlKSxlJiYhYShlLGkpJiZuKGUsaSx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOnR9KX19LDYyMDA6KGUsdCxyKT0+e3ZhciBuPXIoMjMwOSksYT1yKDk3MTEpLGk9bigia2V5cyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaVtlXXx8KGlbZV09YShlKSl9fSw1NDY1OihlLHQscik9Pnt2YXIgbj1yKDc4NTQpLGE9cigzMDcyKSxpPSJfX2NvcmUtanNfc2hhcmVkX18iLHM9bltpXXx8YShpLHt9KTtlLmV4cG9ydHM9c30sMjMwOTooZSx0LHIpPT57dmFyIG49cigxOTEzKSxhPXIoNTQ2NSk7KGUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBhW2VdfHwoYVtlXT12b2lkIDAhPT10P3Q6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4zMi4wIixtb2RlOm4/InB1cmUiOiJnbG9iYWwiLGNvcHlyaWdodDoiwqkgMjAxNC0yMDIzIERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIixsaWNlbnNlOiJodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9ibG9iL3YzLjMyLjAvTElDRU5TRSIsc291cmNlOiJodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcyJ9KX0sNjcwNzooZSx0LHIpPT57dmFyIG49cig5NjcwKSxhPXIoOTQ4MyksaT1yKDg1NTQpLHM9cig1MTEyKSgic3BlY2llcyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByLG89bihlKS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09b3x8aShyPW4obylbc10pP3Q6YShyKX19LDg3MTA6KGUsdCxyKT0+e3ZhciBuPXIoMTcwMiksYT1yKDkzMDMpLGk9cigxMzQwKSxzPXIoNDQ4OCksbz1uKCIiLmNoYXJBdCksYz1uKCIiLmNoYXJDb2RlQXQpLGw9bigiIi5zbGljZSksaD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyKXt2YXIgbixoLHU9aShzKHQpKSxkPWEociksZj11Lmxlbmd0aDtyZXR1cm4gZDwwfHxkPj1mP2U/IiI6dm9pZCAwOihuPWModSxkKSk8NTUyOTZ8fG4+NTYzMTl8fGQrMT09PWZ8fChoPWModSxkKzEpKTw1NjMyMHx8aD41NzM0Mz9lP28odSxkKTpuOmU/bCh1LGQsZCsyKTpoLTU2MzIwKyhuLTU1Mjk2PDwxMCkrNjU1MzZ9fTtlLmV4cG9ydHM9e2NvZGVBdDpoKCExKSxjaGFyQXQ6aCghMCl9fSwzMTk3OihlLHQscik9Pnt2YXIgbj1yKDE3MDIpLGE9MjE0NzQ4MzY0NyxpPS9bXlwwLVx1MDA3RV0vLHM9L1suXHUzMDAyXHVGRjBFXHVGRjYxXS9nLG89Ik92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIixjPVJhbmdlRXJyb3IsbD1uKHMuZXhlYyksaD1NYXRoLmZsb29yLHU9U3RyaW5nLmZyb21DaGFyQ29kZSxkPW4oIiIuY2hhckNvZGVBdCksZj1uKFtdLmpvaW4pLGc9bihbXS5wdXNoKSxwPW4oIiIucmVwbGFjZSksbT1uKCIiLnNwbGl0KSxiPW4oIiIudG9Mb3dlckNhc2UpLHk9ZnVuY3Rpb24oZSl7cmV0dXJuIGUrMjIrNzUqKGU8MjYpfSx3PWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj0wO2ZvcihlPXI/aChlLzcwMCk6ZT4+MSxlKz1oKGUvdCk7ZT40NTU7KWU9aChlLzM1KSxuKz0zNjtyZXR1cm4gaChuKzM2KmUvKGUrMzgpKX0sdj1mdW5jdGlvbihlKXt2YXIgdD1bXTtlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxyPTAsbj1lLmxlbmd0aDtyPG47KXt2YXIgYT1kKGUscisrKTtpZihhPj01NTI5NiYmYTw9NTYzMTkmJnI8bil7dmFyIGk9ZChlLHIrKyk7NTYzMjA9PSg2NDUxMiZpKT9nKHQsKCgxMDIzJmEpPDwxMCkrKDEwMjMmaSkrNjU1MzYpOihnKHQsYSksci0tKX1lbHNlIGcodCxhKX1yZXR1cm4gdH0oZSk7dmFyIHIsbixpPWUubGVuZ3RoLHM9MTI4LGw9MCxwPTcyO2ZvcihyPTA7cjxlLmxlbmd0aDtyKyspKG49ZVtyXSk8MTI4JiZnKHQsdShuKSk7dmFyIG09dC5sZW5ndGgsYj1tO2ZvcihtJiZnKHQsIi0iKTtiPGk7KXt2YXIgdj1hO2ZvcihyPTA7cjxlLmxlbmd0aDtyKyspKG49ZVtyXSk+PXMmJm48diYmKHY9bik7dmFyIHg9YisxO2lmKHYtcz5oKChhLWwpL3gpKXRocm93IGMobyk7Zm9yKGwrPSh2LXMpKngscz12LHI9MDtyPGUubGVuZ3RoO3IrKyl7aWYoKG49ZVtyXSk8cyYmKytsPmEpdGhyb3cgYyhvKTtpZihuPT1zKXtmb3IodmFyIFM9bCxBPTM2Ozspe3ZhciBrPUE8PXA/MTpBPj1wKzI2PzI2OkEtcDtpZihTPGspYnJlYWs7dmFyIEM9Uy1rLE89MzYtaztnKHQsdSh5KGsrQyVPKSkpLFM9aChDL08pLEErPTM2fWcodCx1KHkoUykpKSxwPXcobCx4LGI9PW0pLGw9MCxiKyt9fWwrKyxzKyt9cmV0dXJuIGYodCwiIil9O2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdCxyLG49W10sYT1tKHAoYihlKSxzLCIuIiksIi4iKTtmb3IodD0wO3Q8YS5sZW5ndGg7dCsrKXI9YVt0XSxnKG4sbChpLHIpPyJ4bi0tIit2KHIpOnIpO3JldHVybiBmKG4sIi4iKX19LDg0MTU6KGUsdCxyKT0+e3ZhciBuPXIoOTMwMyksYT1yKDEzNDApLGk9cig0NDg4KSxzPVJhbmdlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWEoaSh0aGlzKSkscj0iIixvPW4oZSk7aWYobzwwfHxvPT0xLzApdGhyb3cgcygiV3JvbmcgbnVtYmVyIG9mIHJlcGV0aXRpb25zIik7Zm9yKDtvPjA7KG8+Pj49MSkmJih0Kz10KSkxJm8mJihyKz10KTtyZXR1cm4gcn19LDYwOTE6KGUsdCxyKT0+e3ZhciBuPXIoNjUzMCkuUFJPUEVSLGE9cig3MjkzKSxpPXIoMTM2MSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBhKChmdW5jdGlvbigpe3JldHVybiEhaVtlXSgpfHwi4oCLwoXhoI4iIT09IuKAi8KF4aCOIltlXSgpfHxuJiZpW2VdLm5hbWUhPT1lfSkpfX0sMzExMTooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoNDQ4OCksaT1yKDEzNDApLHM9cigxMzYxKSxvPW4oIiIucmVwbGFjZSksYz1SZWdFeHAoIl5bIitzKyJdKyIpLGw9UmVnRXhwKCIoXnxbXiIrcysiXSlbIitzKyJdKyQiKSxoPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1pKGEodCkpO3JldHVybiAxJmUmJihyPW8ocixjLCIiKSksMiZlJiYocj1vKHIsbCwiJDEiKSkscn19O2UuZXhwb3J0cz17c3RhcnQ6aCgxKSxlbmQ6aCgyKSx0cmltOmgoMyl9fSw2MjkzOihlLHQscik9Pnt2YXIgbj1yKDczOTIpLGE9cig3MjkzKSxpPXIoNzg1NCkuU3RyaW5nO2UuZXhwb3J0cz0hIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJiFhKChmdW5jdGlvbigpe3ZhciBlPVN5bWJvbCgpO3JldHVybiFpKGUpfHwhKE9iamVjdChlKWluc3RhbmNlb2YgU3ltYm9sKXx8IVN5bWJvbC5zaGFtJiZuJiZuPDQxfSkpfSwyNjE6KGUsdCxyKT0+e3ZhciBuLGEsaSxzLG89cig3ODU0KSxjPXIoMjEwNCksbD1yKDk5NzQpLGg9cig2MTQpLHU9cigyNTk3KSxkPXIoNzI5MyksZj1yKDQ5MCksZz1yKDIwNikscD1yKDMxNyksbT1yKDgwNTMpLGI9cig2ODMzKSx5PXIoNTI2OCksdz1vLnNldEltbWVkaWF0ZSx2PW8uY2xlYXJJbW1lZGlhdGUseD1vLnByb2Nlc3MsUz1vLkRpc3BhdGNoLEE9by5GdW5jdGlvbixrPW8uTWVzc2FnZUNoYW5uZWwsQz1vLlN0cmluZyxPPTAsRj17fSxJPSJvbnJlYWR5c3RhdGVjaGFuZ2UiO2QoKGZ1bmN0aW9uKCl7bj1vLmxvY2F0aW9ufSkpO3ZhciBUPWZ1bmN0aW9uKGUpe2lmKHUoRixlKSl7dmFyIHQ9RltlXTtkZWxldGUgRltlXSx0KCl9fSxNPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe1QoZSl9fSxFPWZ1bmN0aW9uKGUpe1QoZS5kYXRhKX0sUD1mdW5jdGlvbihlKXtvLnBvc3RNZXNzYWdlKEMoZSksbi5wcm90b2NvbCsiLy8iK24uaG9zdCl9O3cmJnZ8fCh3PWZ1bmN0aW9uKGUpe20oYXJndW1lbnRzLmxlbmd0aCwxKTt2YXIgdD1oKGUpP2U6QShlKSxyPWcoYXJndW1lbnRzLDEpO3JldHVybiBGWysrT109ZnVuY3Rpb24oKXtjKHQsdm9pZCAwLHIpfSxhKE8pLE99LHY9ZnVuY3Rpb24oZSl7ZGVsZXRlIEZbZV19LHk/YT1mdW5jdGlvbihlKXt4Lm5leHRUaWNrKE0oZSkpfTpTJiZTLm5vdz9hPWZ1bmN0aW9uKGUpe1Mubm93KE0oZSkpfTprJiYhYj8ocz0oaT1uZXcgaykucG9ydDIsaS5wb3J0MS5vbm1lc3NhZ2U9RSxhPWwocy5wb3N0TWVzc2FnZSxzKSk6by5hZGRFdmVudExpc3RlbmVyJiZoKG8ucG9zdE1lc3NhZ2UpJiYhby5pbXBvcnRTY3JpcHRzJiZuJiYiZmlsZToiIT09bi5wcm90b2NvbCYmIWQoUCk/KGE9UCxvLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLEUsITEpKTphPUkgaW4gcCgic2NyaXB0Iik/ZnVuY3Rpb24oZSl7Zi5hcHBlbmRDaGlsZChwKCJzY3JpcHQiKSlbSV09ZnVuY3Rpb24oKXtmLnJlbW92ZUNoaWxkKHRoaXMpLFQoZSl9fTpmdW5jdGlvbihlKXtzZXRUaW1lb3V0KE0oZSksMCl9KSxlLmV4cG9ydHM9e3NldDp3LGNsZWFyOnZ9fSw4NjM6KGUsdCxyKT0+e3ZhciBuPXIoMTcwMik7ZS5leHBvcnRzPW4oMS4udmFsdWVPZil9LDE0MDA6KGUsdCxyKT0+e3ZhciBuPXIoOTMwMyksYT1NYXRoLm1heCxpPU1hdGgubWluO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByPW4oZSk7cmV0dXJuIHI8MD9hKHIrdCwwKTppKHIsdCl9fSw0NTk5OihlLHQscik9Pnt2YXIgbj1yKDc1OTMpLGE9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKGUsIm51bWJlciIpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBhKCJDYW4ndCBjb252ZXJ0IG51bWJlciB0byBiaWdpbnQiKTtyZXR1cm4gQmlnSW50KHQpfX0sNzA2NzooZSx0LHIpPT57dmFyIG49cig5MzAzKSxhPXIoNzQ2NiksaT1SYW5nZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lKXJldHVybiAwO3ZhciB0PW4oZSkscj1hKHQpO2lmKHQhPT1yKXRocm93IGkoIldyb25nIGxlbmd0aCBvciBpbmRleCIpO3JldHVybiByfX0sNTY1NjooZSx0LHIpPT57dmFyIG49cig4MzYxKSxhPXIoNDQ4OCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBuKGEoZSkpfX0sOTMwMzooZSx0LHIpPT57dmFyIG49cig0NzU4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9K2U7cmV0dXJuIHQhPXR8fDA9PT10PzA6bih0KX19LDc0NjY6KGUsdCxyKT0+e3ZhciBuPXIoOTMwMyksYT1NYXRoLm1pbjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+MD9hKG4oZSksOTAwNzE5OTI1NDc0MDk5MSk6MH19LDc5MDg6KGUsdCxyKT0+e3ZhciBuPXIoNDQ4OCksYT1PYmplY3Q7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBhKG4oZSkpfX0sNDU5MDooZSx0LHIpPT57dmFyIG49cigzMDAyKSxhPVJhbmdlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9bihlKTtpZihyJXQpdGhyb3cgYSgiV3Jvbmcgb2Zmc2V0Iik7cmV0dXJuIHJ9fSwzMDAyOihlLHQscik9Pnt2YXIgbj1yKDkzMDMpLGE9UmFuZ2VFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bihlKTtpZih0PDApdGhyb3cgYSgiVGhlIGFyZ3VtZW50IGNhbid0IGJlIGxlc3MgdGhhbiAwIik7cmV0dXJuIHR9fSw3NTkzOihlLHQscik9Pnt2YXIgbj1yKDY5MTYpLGE9cigxMTEpLGk9cigyMTkwKSxzPXIoODE3Myksbz1yKDIxNDApLGM9cig1MTEyKSxsPVR5cGVFcnJvcixoPWMoInRvUHJpbWl0aXZlIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoIWEoZSl8fGkoZSkpcmV0dXJuIGU7dmFyIHIsYz1zKGUsaCk7aWYoYyl7aWYodm9pZCAwPT09dCYmKHQ9ImRlZmF1bHQiKSxyPW4oYyxlLHQpLCFhKHIpfHxpKHIpKXJldHVybiByO3Rocm93IGwoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfXJldHVybiB2b2lkIDA9PT10JiYodD0ibnVtYmVyIiksbyhlLHQpfX0sNDk0ODooZSx0LHIpPT57dmFyIG49cig3NTkzKSxhPXIoMjE5MCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW4oZSwic3RyaW5nIik7cmV0dXJuIGEodCk/dDp0KyIifX0sMTY5NDooZSx0LHIpPT57dmFyIG49e307bltyKDUxMTIpKCJ0b1N0cmluZ1RhZyIpXT0ieiIsZS5leHBvcnRzPSJbb2JqZWN0IHpdIj09PVN0cmluZyhuKX0sMTM0MDooZSx0LHIpPT57dmFyIG49cig2NDgpLGE9U3RyaW5nO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiU3ltYm9sIj09PW4oZSkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyIpO3JldHVybiBhKGUpfX0sNzg5MjplPT57dmFyIHQ9TWF0aC5yb3VuZDtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHI9dChlKTtyZXR1cm4gcjwwPzA6cj4yNTU/MjU1OjI1NSZyfX0sNDAzODooZSx0LHIpPT57dmFyIG49cig1MjY4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5e2lmKG4pcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gcmVxdWlyZSgiJytlKyciKScpKCl9Y2F0Y2goZSl7fX19LDYzMzA6ZT0+e3ZhciB0PVN0cmluZztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiB0KGUpfWNhdGNoKGUpe3JldHVybiJPYmplY3QifX19LDk4NDM6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc4NTQpLGk9cig2OTE2KSxzPXIoOTc4MSksbz1yKDM4MzIpLGM9cigyNjApLGw9cigzMzMxKSxoPXIoNTc4NyksdT1yKDkxMTQpLGQ9cig4ODgwKSxmPXIoNTk4OCksZz1yKDc0NjYpLHA9cig3MDY3KSxtPXIoNDU5MCksYj1yKDc4OTIpLHk9cig0OTQ4KSx3PXIoMjU5Nyksdj1yKDY0OCkseD1yKDExMSksUz1yKDIxOTApLEE9cigzMCksaz1yKDc5NzYpLEM9cig3Njc0KSxPPXIoODAwNikuZixGPXIoNzMyMSksST1yKDIwOTIpLmZvckVhY2gsVD1yKDYzNDApLE09cig3MDQ1KSxFPXIoMzA3MCksUD1yKDEyMzYpLFI9cig5OTA5KSxOPXIoOTU4NyksRD1SLmdldCxCPVIuc2V0LEw9Ui5lbmZvcmNlLF89RS5mLGo9UC5mLFU9YS5SYW5nZUVycm9yLCQ9bC5BcnJheUJ1ZmZlcixYPSQucHJvdG90eXBlLEg9bC5EYXRhVmlldyxxPWMuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyx6PWMuVFlQRURfQVJSQVlfVEFHLEc9Yy5UeXBlZEFycmF5LFc9Yy5UeXBlZEFycmF5UHJvdG90eXBlLFY9Yy5hVHlwZWRBcnJheUNvbnN0cnVjdG9yLEs9Yy5pc1R5cGVkQXJyYXksWT0iQllURVNfUEVSX0VMRU1FTlQiLEo9Ildyb25nIGxlbmd0aCIsWj1mdW5jdGlvbihlLHQpe1YoZSk7Zm9yKHZhciByPTAsbj10Lmxlbmd0aCxhPW5ldyBlKG4pO24+cjspYVtyXT10W3IrK107cmV0dXJuIGF9LFE9ZnVuY3Rpb24oZSx0KXtNKGUsdCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBEKHRoaXMpW3RdfX0pfSxlZT1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gayhYLGUpfHwiQXJyYXlCdWZmZXIiPT0odD12KGUpKXx8IlNoYXJlZEFycmF5QnVmZmVyIj09dH0sdGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSyhlKSYmIVModCkmJnQgaW4gZSYmZigrdCkmJnQ+PTB9LHJlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9eSh0KSx0ZShlLHQpP3UoMixlW3RdKTpqKGUsdCl9LG5lPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdD15KHQpLCEodGUoZSx0KSYmeChyKSYmdyhyLCJ2YWx1ZSIpKXx8dyhyLCJnZXQiKXx8dyhyLCJzZXQiKXx8ci5jb25maWd1cmFibGV8fHcociwid3JpdGFibGUiKSYmIXIud3JpdGFibGV8fHcociwiZW51bWVyYWJsZSIpJiYhci5lbnVtZXJhYmxlP18oZSx0LHIpOihlW3RdPXIudmFsdWUsZSl9O3M/KHF8fChQLmY9cmUsRS5mPW5lLFEoVywiYnVmZmVyIiksUShXLCJieXRlT2Zmc2V0IiksUShXLCJieXRlTGVuZ3RoIiksUShXLCJsZW5ndGgiKSksbih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFxfSx7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOnJlLGRlZmluZVByb3BlcnR5Om5lfSksZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXt2YXIgcz1lLm1hdGNoKC9cZCsvKVswXS84LGM9ZSsocj8iQ2xhbXBlZCI6IiIpKyJBcnJheSIsbD0iZ2V0IitlLHU9InNldCIrZSxmPWFbY10seT1mLHc9eSYmeS5wcm90b3R5cGUsdj17fSxTPWZ1bmN0aW9uKGUsdCl7XyhlLHQse2dldDpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciByPUQoZSk7cmV0dXJuIHIudmlld1tsXSh0KnMrci5ieXRlT2Zmc2V0LCEwKX0odGhpcyx0KX0sc2V0OmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIGE9RChlKTthLnZpZXdbdV0odCpzK2EuYnl0ZU9mZnNldCxyP2Iobik6biwhMCl9KHRoaXMsdCxlKX0sZW51bWVyYWJsZTohMH0pfTtxP28mJih5PXQoKGZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiBoKGUsdyksTih4KHQpP2VlKHQpP3ZvaWQgMCE9PW4/bmV3IGYodCxtKHIscyksbik6dm9pZCAwIT09cj9uZXcgZih0LG0ocixzKSk6bmV3IGYodCk6Syh0KT9aKHksdCk6aShGLHksdCk6bmV3IGYocCh0KSksZSx5KX0pKSxDJiZDKHksRyksSShPKGYpLChmdW5jdGlvbihlKXtlIGluIHl8fGQoeSxlLGZbZV0pfSkpLHkucHJvdG90eXBlPXcpOih5PXQoKGZ1bmN0aW9uKGUsdCxyLG4pe2goZSx3KTt2YXIgYSxvLGMsbD0wLHU9MDtpZih4KHQpKXtpZighZWUodCkpcmV0dXJuIEsodCk/Wih5LHQpOmkoRix5LHQpO2E9dCx1PW0ocixzKTt2YXIgZD10LmJ5dGVMZW5ndGg7aWYodm9pZCAwPT09bil7aWYoZCVzKXRocm93IFUoSik7aWYoKG89ZC11KTwwKXRocm93IFUoSil9ZWxzZSBpZigobz1nKG4pKnMpK3U+ZCl0aHJvdyBVKEopO2M9by9zfWVsc2UgYz1wKHQpLGE9bmV3ICQobz1jKnMpO2ZvcihCKGUse2J1ZmZlcjphLGJ5dGVPZmZzZXQ6dSxieXRlTGVuZ3RoOm8sbGVuZ3RoOmMsdmlldzpuZXcgSChhKX0pO2w8YzspUyhlLGwrKyl9KSksQyYmQyh5LEcpLHc9eS5wcm90b3R5cGU9QShXKSksdy5jb25zdHJ1Y3RvciE9PXkmJmQodywiY29uc3RydWN0b3IiLHkpLEwodykuVHlwZWRBcnJheUNvbnN0cnVjdG9yPXkseiYmZCh3LHosYyk7dmFyIGs9eSE9Zjt2W2NdPXksbih7Z2xvYmFsOiEwLGNvbnN0cnVjdG9yOiEwLGZvcmNlZDprLHNoYW06IXF9LHYpLFkgaW4geXx8ZCh5LFkscyksWSBpbiB3fHxkKHcsWSxzKSxUKGMpfSk6ZS5leHBvcnRzPWZ1bmN0aW9uKCl7fX0sMzgzMjooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPXIoNzI5MyksaT1yKDcwNzIpLHM9cigyNjApLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1Msbz1uLkFycmF5QnVmZmVyLGM9bi5JbnQ4QXJyYXk7ZS5leHBvcnRzPSFzfHwhYSgoZnVuY3Rpb24oKXtjKDEpfSkpfHwhYSgoZnVuY3Rpb24oKXtuZXcgYygtMSl9KSl8fCFpKChmdW5jdGlvbihlKXtuZXcgYyxuZXcgYyhudWxsKSxuZXcgYygxLjUpLG5ldyBjKGUpfSksITApfHxhKChmdW5jdGlvbigpe3JldHVybiAxIT09bmV3IGMobmV3IG8oMiksMSx2b2lkIDApLmxlbmd0aH0pKX0sNzMyMTooZSx0LHIpPT57dmFyIG49cig5OTc0KSxhPXIoNjkxNiksaT1yKDk0ODMpLHM9cig3OTA4KSxvPXIoNjI0NCksYz1yKDQxMjEpLGw9cigxMjQ2KSxoPXIoNzY1OSksdT1yKDQwNjcpLGQ9cigyNjApLmFUeXBlZEFycmF5Q29uc3RydWN0b3IsZj1yKDQ1OTkpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdCxyLGcscCxtLGIseSx3LHY9aSh0aGlzKSx4PXMoZSksUz1hcmd1bWVudHMubGVuZ3RoLEE9Uz4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsaz12b2lkIDAhPT1BLEM9bCh4KTtpZihDJiYhaChDKSlmb3Iodz0oeT1jKHgsQykpLm5leHQseD1bXTshKGI9YSh3LHkpKS5kb25lOyl4LnB1c2goYi52YWx1ZSk7Zm9yKGsmJlM+MiYmKEE9bihBLGFyZ3VtZW50c1syXSkpLHI9byh4KSxnPW5ldyhkKHYpKShyKSxwPXUoZyksdD0wO3I+dDt0KyspbT1rP0EoeFt0XSx0KTp4W3RdLGdbdF09cD9mKG0pOittO3JldHVybiBnfX0sOTcxMTooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPTAsaT1NYXRoLnJhbmRvbSgpLHM9bigxLi50b1N0cmluZyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiJTeW1ib2woIisodm9pZCAwPT09ZT8iIjplKSsiKV8iK3MoKythK2ksMzYpfX0sNTE0MzooZSx0LHIpPT57dmFyIG49cig3MjkzKSxhPXIoNTExMiksaT1yKDk3ODEpLHM9cigxOTEzKSxvPWEoIml0ZXJhdG9yIik7ZS5leHBvcnRzPSFuKChmdW5jdGlvbigpe3ZhciBlPW5ldyBVUkwoImI/YT0xJmI9MiZjPTMiLCJodHRwOi8vYSIpLHQ9ZS5zZWFyY2hQYXJhbXMscj1uZXcgVVJMU2VhcmNoUGFyYW1zKCJhPTEmYT0yJmI9MyIpLG49IiI7cmV0dXJuIGUucGF0aG5hbWU9ImMlMjBkIix0LmZvckVhY2goKGZ1bmN0aW9uKGUscil7dC5kZWxldGUoImIiKSxuKz1yK2V9KSksci5kZWxldGUoImEiLDIpLHIuZGVsZXRlKCJiIix2b2lkIDApLHMmJighZS50b0pTT058fCFyLmhhcygiYSIsMSl8fHIuaGFzKCJhIiwyKXx8IXIuaGFzKCJhIix2b2lkIDApfHxyLmhhcygiYiIpKXx8IXQuc2l6ZSYmKHN8fCFpKXx8IXQuc29ydHx8Imh0dHA6Ly9hL2MlMjBkP2E9MSZjPTMiIT09ZS5ocmVmfHwiMyIhPT10LmdldCgiYyIpfHwiYT0xIiE9PVN0cmluZyhuZXcgVVJMU2VhcmNoUGFyYW1zKCI/YT0xIikpfHwhdFtvXXx8ImEiIT09bmV3IFVSTCgiaHR0cHM6Ly9hQGIiKS51c2VybmFtZXx8ImIiIT09bmV3IFVSTFNlYXJjaFBhcmFtcyhuZXcgVVJMU2VhcmNoUGFyYW1zKCJhPWIiKSkuZ2V0KCJhIil8fCJ4bi0tZTFheWJjIiE9PW5ldyBVUkwoImh0dHA6Ly/RgtC10YHRgiIpLmhvc3R8fCIjJUQwJUIxIiE9PW5ldyBVUkwoImh0dHA6Ly9hI9CxIikuaGFzaHx8ImExYzMiIT09bnx8IngiIT09bmV3IFVSTCgiaHR0cDovL3giLHZvaWQgMCkuaG9zdH0pKX0sMzMwNzooZSx0LHIpPT57dmFyIG49cig2MjkzKTtlLmV4cG9ydHM9biYmIVN5bWJvbC5zaGFtJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcn0sMzM1MzooZSx0LHIpPT57dmFyIG49cig5NzgxKSxhPXIoNzI5Myk7ZS5leHBvcnRzPW4mJmEoKGZ1bmN0aW9uKCl7cmV0dXJuIDQyIT1PYmplY3QuZGVmaW5lUHJvcGVydHkoKGZ1bmN0aW9uKCl7fSksInByb3RvdHlwZSIse3ZhbHVlOjQyLHdyaXRhYmxlOiExfSkucHJvdG90eXBlfSkpfSw4MDUzOmU9Pnt2YXIgdD1UeXBlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUscil7aWYoZTxyKXRocm93IHQoIk5vdCBlbm91Z2ggYXJndW1lbnRzIik7cmV0dXJuIGV9fSw0ODExOihlLHQscik9Pnt2YXIgbj1yKDc4NTQpLGE9cig2MTQpLGk9bi5XZWFrTWFwO2UuZXhwb3J0cz1hKGkpJiYvbmF0aXZlIGNvZGUvLnRlc3QoU3RyaW5nKGkpKX0sNTExMjooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPXIoMjMwOSksaT1yKDI1OTcpLHM9cig5NzExKSxvPXIoNjI5MyksYz1yKDMzMDcpLGw9bi5TeW1ib2wsaD1hKCJ3a3MiKSx1PWM/bC5mb3J8fGw6bCYmbC53aXRob3V0U2V0dGVyfHxzO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaShoLGUpfHwoaFtlXT1vJiZpKGwsZSk/bFtlXTp1KCJTeW1ib2wuIitlKSksaFtlXX19LDEzNjE6ZT0+e2UuZXhwb3J0cz0iXHRcblx2XGZcciDCoOGagOKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFx1MjAyOFx1MjAyOVx1ZmVmZiJ9LDkxOTE6KGUsdCxyKT0+e3ZhciBuPXIoNTAwNSksYT1yKDI1OTcpLGk9cig4ODgwKSxzPXIoNzk3Niksbz1yKDc2NzQpLGM9cig5OTIwKSxsPXIoMjYyNiksaD1yKDk1ODcpLHU9cig2Mjc3KSxkPXIoODM0MCksZj1yKDUzOTIpLGc9cig5NzgxKSxwPXIoMTkxMyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLG0pe3ZhciBiPSJzdGFja1RyYWNlTGltaXQiLHk9bT8yOjEsdz1lLnNwbGl0KCIuIiksdj13W3cubGVuZ3RoLTFdLHg9bi5hcHBseShudWxsLHcpO2lmKHgpe3ZhciBTPXgucHJvdG90eXBlO2lmKCFwJiZhKFMsImNhdXNlIikmJmRlbGV0ZSBTLmNhdXNlLCFyKXJldHVybiB4O3ZhciBBPW4oIkVycm9yIiksaz10KChmdW5jdGlvbihlLHQpe3ZhciByPXUobT90OmUsdm9pZCAwKSxuPW0/bmV3IHgoZSk6bmV3IHg7cmV0dXJuIHZvaWQgMCE9PXImJmkobiwibWVzc2FnZSIsciksZihuLGssbi5zdGFjaywyKSx0aGlzJiZzKFMsdGhpcykmJmgobix0aGlzLGspLGFyZ3VtZW50cy5sZW5ndGg+eSYmZChuLGFyZ3VtZW50c1t5XSksbn0pKTtpZihrLnByb3RvdHlwZT1TLCJFcnJvciIhPT12P28/byhrLEEpOmMoayxBLHtuYW1lOiEwfSk6ZyYmYiBpbiB4JiYobChrLHgsYiksbChrLHgsInByZXBhcmVTdGFja1RyYWNlIikpLGMoayx4KSwhcCl0cnl7Uy5uYW1lIT09diYmaShTLCJuYW1lIix2KSxTLmNvbnN0cnVjdG9yPWt9Y2F0Y2goZSl7fXJldHVybiBrfX19LDgyNjQ6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc4NTQpLGk9cigzMzMxKSxzPXIoNjM0MCksbz0iQXJyYXlCdWZmZXIiLGM9aVtvXTtuKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsZm9yY2VkOmFbb10hPT1jfSx7QXJyYXlCdWZmZXI6Y30pLHMobyl9LDk1NzU6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDE0NzApLGk9cig3MjkzKSxzPXIoMzMzMSksbz1yKDk2NzApLGM9cigxNDAwKSxsPXIoNzQ2NiksaD1yKDY3MDcpLHU9cy5BcnJheUJ1ZmZlcixkPXMuRGF0YVZpZXcsZj1kLnByb3RvdHlwZSxnPWEodS5wcm90b3R5cGUuc2xpY2UpLHA9YShmLmdldFVpbnQ4KSxtPWEoZi5zZXRVaW50OCk7bih7dGFyZ2V0OiJBcnJheUJ1ZmZlciIscHJvdG86ITAsdW5zYWZlOiEwLGZvcmNlZDppKChmdW5jdGlvbigpe3JldHVybiFuZXcgdSgyKS5zbGljZSgxLHZvaWQgMCkuYnl0ZUxlbmd0aH0pKX0se3NsaWNlOmZ1bmN0aW9uKGUsdCl7aWYoZyYmdm9pZCAwPT09dClyZXR1cm4gZyhvKHRoaXMpLGUpO2Zvcih2YXIgcj1vKHRoaXMpLmJ5dGVMZW5ndGgsbj1jKGUsciksYT1jKHZvaWQgMD09PXQ/cjp0LHIpLGk9bmV3KGgodGhpcyx1KSkobChhLW4pKSxzPW5ldyBkKHRoaXMpLGY9bmV3IGQoaSksYj0wO248YTspbShmLGIrKyxwKHMsbisrKSk7cmV0dXJuIGl9fSl9LDIyNjI6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc5MDgpLGk9cig2MjQ0KSxzPXIoOTMwMyksbz1yKDEyMjMpO24oe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwfSx7YXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9YSh0aGlzKSxyPWkodCksbj1zKGUpLG89bj49MD9uOnIrbjtyZXR1cm4gbzwwfHxvPj1yP3ZvaWQgMDp0W29dfX0pLG8oImF0Iil9LDcyODc6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDk2NzEpLmZpbmRMYXN0SW5kZXgsaT1yKDEyMjMpO24oe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwfSx7ZmluZExhc3RJbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gYSh0aGlzLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmRMYXN0SW5kZXgiKX0sNzYzNTooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoOTY3MSkuZmluZExhc3QsaT1yKDEyMjMpO24oe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwfSx7ZmluZExhc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGEodGhpcyxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxpKCJmaW5kTGFzdCIpfSw0OTQ0OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cig2NzkwKSxpPXIoNzkwOCkscz1yKDYyNDQpLG89cig5MzAzKSxjPXIoNTQxNyk7bih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITB9LHtmbGF0OmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwLHQ9aSh0aGlzKSxyPXModCksbj1jKHQsMCk7cmV0dXJuIG4ubGVuZ3RoPWEobix0LHQsciwwLHZvaWQgMD09PWU/MTpvKGUpKSxufX0pfSw2Njk5OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cigxMzE4KS5pbmNsdWRlcyxpPXIoNzI5Mykscz1yKDEyMjMpO24oe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDppKChmdW5jdGlvbigpe3JldHVybiFBcnJheSgxKS5pbmNsdWRlcygpfSkpfSx7aW5jbHVkZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGEodGhpcyxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxzKCJpbmNsdWRlcyIpfSw2OTkyOihlLHQscik9Pnt2YXIgbj1yKDU2NTYpLGE9cigxMjIzKSxpPXIoNzQ5Nykscz1yKDk5MDkpLG89cigzMDcwKS5mLGM9cigxNjU2KSxsPXIoNjE3OCksaD1yKDE5MTMpLHU9cig5NzgxKSxkPSJBcnJheSBJdGVyYXRvciIsZj1zLnNldCxnPXMuZ2V0dGVyRm9yKGQpO2UuZXhwb3J0cz1jKEFycmF5LCJBcnJheSIsKGZ1bmN0aW9uKGUsdCl7Zih0aGlzLHt0eXBlOmQsdGFyZ2V0Om4oZSksaW5kZXg6MCxraW5kOnR9KX0pLChmdW5jdGlvbigpe3ZhciBlPWcodGhpcyksdD1lLnRhcmdldCxyPWUua2luZCxuPWUuaW5kZXgrKztyZXR1cm4hdHx8bj49dC5sZW5ndGg/KGUudGFyZ2V0PXZvaWQgMCxsKHZvaWQgMCwhMCkpOmwoImtleXMiPT1yP246InZhbHVlcyI9PXI/dFtuXTpbbix0W25dXSwhMSl9KSwidmFsdWVzIik7dmFyIHA9aS5Bcmd1bWVudHM9aS5BcnJheTtpZihhKCJrZXlzIiksYSgidmFsdWVzIiksYSgiZW50cmllcyIpLCFoJiZ1JiYidmFsdWVzIiE9PXAubmFtZSl0cnl7byhwLCJuYW1lIix7dmFsdWU6InZhbHVlcyJ9KX1jYXRjaChlKXt9fSw3NjU4OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cig3OTA4KSxpPXIoNjI0NCkscz1yKDM2NTgpLG89cig3MjA3KTtuKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxhcml0eToxLGZvcmNlZDpyKDcyOTMpKChmdW5jdGlvbigpe3JldHVybiA0Mjk0OTY3Mjk3IT09W10ucHVzaC5jYWxsKHtsZW5ndGg6NDI5NDk2NzI5Nn0sMSl9KSl8fCFmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sImxlbmd0aCIse3dyaXRhYmxlOiExfSkucHVzaCgpfWNhdGNoKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVHlwZUVycm9yfX0oKX0se3B1c2g6ZnVuY3Rpb24oZSl7dmFyIHQ9YSh0aGlzKSxyPWkodCksbj1hcmd1bWVudHMubGVuZ3RoO28ocituKTtmb3IodmFyIGM9MDtjPG47YysrKXRbcl09YXJndW1lbnRzW2NdLHIrKztyZXR1cm4gcyh0LHIpLHJ9fSl9LDU4Mjc6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDM2NzEpLmxlZnQsaT1yKDkzNDEpLHM9cig3MzkyKTtuKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IXIoNTI2OCkmJnM+NzkmJnM8ODN8fCFpKCJyZWR1Y2UiKX0se3JlZHVjZTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoO3JldHVybiBhKHRoaXMsZSx0LHQ+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sMjcwNzooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoMTcwMiksaT1yKDk2NjIpLHM9cig3OTA4KSxvPXIoNjI0NCksYz1yKDUxMTcpLGw9cigxMzQwKSxoPXIoNzI5MyksdT1yKDQzNjIpLGQ9cig5MzQxKSxmPXIoODg4NiksZz1yKDI1NikscD1yKDczOTIpLG09cig4MDA4KSxiPVtdLHk9YShiLnNvcnQpLHc9YShiLnB1c2gpLHY9aCgoZnVuY3Rpb24oKXtiLnNvcnQodm9pZCAwKX0pKSx4PWgoKGZ1bmN0aW9uKCl7Yi5zb3J0KG51bGwpfSkpLFM9ZCgic29ydCIpLEE9IWgoKGZ1bmN0aW9uKCl7aWYocClyZXR1cm4gcDw3MDtpZighKGYmJmY+Mykpe2lmKGcpcmV0dXJuITA7aWYobSlyZXR1cm4gbTw2MDM7dmFyIGUsdCxyLG4sYT0iIjtmb3IoZT02NTtlPDc2O2UrKyl7c3dpdGNoKHQ9U3RyaW5nLmZyb21DaGFyQ29kZShlKSxlKXtjYXNlIDY2OmNhc2UgNjk6Y2FzZSA3MDpjYXNlIDcyOnI9MzticmVhaztjYXNlIDY4OmNhc2UgNzE6cj00O2JyZWFrO2RlZmF1bHQ6cj0yfWZvcihuPTA7bjw0NztuKyspYi5wdXNoKHtrOnQrbix2OnJ9KX1mb3IoYi5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiB0LnYtZS52fSkpLG49MDtuPGIubGVuZ3RoO24rKyl0PWJbbl0uay5jaGFyQXQoMCksYS5jaGFyQXQoYS5sZW5ndGgtMSkhPT10JiYoYSs9dCk7cmV0dXJuIkRHQkVGSEFDSUpLIiE9PWF9fSkpO24oe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDp2fHwheHx8IVN8fCFBfSx7c29ydDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lJiZpKGUpO3ZhciB0PXModGhpcyk7aWYoQSlyZXR1cm4gdm9pZCAwPT09ZT95KHQpOnkodCxlKTt2YXIgcixuLGE9W10saD1vKHQpO2ZvcihuPTA7bjxoO24rKyluIGluIHQmJncoYSx0W25dKTtmb3IodShhLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LHIpe3JldHVybiB2b2lkIDA9PT1yPy0xOnZvaWQgMD09PXQ/MTp2b2lkIDAhPT1lPytlKHQscil8fDA6bCh0KT5sKHIpPzE6LTF9fShlKSkscj1vKGEpLG49MDtuPHI7KXRbbl09YVtuKytdO2Zvcig7bjxoOyljKHQsbisrKTtyZXR1cm4gdH19KX0sMzc5MjooZSx0LHIpPT57cigxMjIzKSgiZmxhdCIpfSw1NDE6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc5MDgpLGk9cig2MjQ0KSxzPXIoMzY1OCksbz1yKDUxMTcpLGM9cig3MjA3KTtuKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxhcml0eToxLGZvcmNlZDoxIT09W10udW5zaGlmdCgwKXx8IWZ1bmN0aW9uKCl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwibGVuZ3RoIix7d3JpdGFibGU6ITF9KS51bnNoaWZ0KCl9Y2F0Y2goZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBUeXBlRXJyb3J9fSgpfSx7dW5zaGlmdDpmdW5jdGlvbihlKXt2YXIgdD1hKHRoaXMpLHI9aSh0KSxuPWFyZ3VtZW50cy5sZW5ndGg7aWYobil7YyhyK24pO2Zvcih2YXIgbD1yO2wtLTspe3ZhciBoPWwrbjtsIGluIHQ/dFtoXT10W2xdOm8odCxoKX1mb3IodmFyIHU9MDt1PG47dSsrKXRbdV09YXJndW1lbnRzW3VdfXJldHVybiBzKHQscituKX19KX0sNTU4MTooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoMTU3MiksaT1yKDU2NTYpLHM9QXJyYXk7bih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITB9LHt3aXRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEoaSh0aGlzKSxzLGUsdCl9fSl9LDE3MDM6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc4NTQpLGk9cigyMTA0KSxzPXIoOTE5MSksbz0iV2ViQXNzZW1ibHkiLGM9YVtvXSxsPTchPT1FcnJvcigiZSIse2NhdXNlOjd9KS5jYXVzZSxoPWZ1bmN0aW9uKGUsdCl7dmFyIHI9e307cltlXT1zKGUsdCxsKSxuKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsYXJpdHk6MSxmb3JjZWQ6bH0scil9LHU9ZnVuY3Rpb24oZSx0KXtpZihjJiZjW2VdKXt2YXIgcj17fTtyW2VdPXMobysiLiIrZSx0LGwpLG4oe3RhcmdldDpvLHN0YXQ6ITAsY29uc3RydWN0b3I6ITAsYXJpdHk6MSxmb3JjZWQ6bH0scil9fTtoKCJFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksaCgiRXZhbEVycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKSxoKCJSYW5nZUVycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKSxoKCJSZWZlcmVuY2VFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksaCgiU3ludGF4RXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpLGgoIlR5cGVFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksaCgiVVJJRXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpLHUoIkNvbXBpbGVFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksdSgiTGlua0Vycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKSx1KCJSdW50aW1lRXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpfSw1ODM3OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cig3ODU0KTtuKHtnbG9iYWw6ITAsZm9yY2VkOmEuZ2xvYmFsVGhpcyE9PWF9LHtnbG9iYWxUaGlzOmF9KX0sODg2MjooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNTAwNSksaT1yKDIxMDQpLHM9cig2OTE2KSxvPXIoMTcwMiksYz1yKDcyOTMpLGw9cig2MTQpLGg9cigyMTkwKSx1PXIoMjA2KSxkPXIoODA0NCksZj1yKDYyOTMpLGc9U3RyaW5nLHA9YSgiSlNPTiIsInN0cmluZ2lmeSIpLG09bygvLi8uZXhlYyksYj1vKCIiLmNoYXJBdCkseT1vKCIiLmNoYXJDb2RlQXQpLHc9bygiIi5yZXBsYWNlKSx2PW8oMS4udG9TdHJpbmcpLHg9L1tcdUQ4MDAtXHVERkZGXS9nLFM9L15bXHVEODAwLVx1REJGRl0kLyxBPS9eW1x1REMwMC1cdURGRkZdJC8saz0hZnx8YygoZnVuY3Rpb24oKXt2YXIgZT1hKCJTeW1ib2wiKSgpO3JldHVybiJbbnVsbF0iIT1wKFtlXSl8fCJ7fSIhPXAoe2E6ZX0pfHwie30iIT1wKE9iamVjdChlKSl9KSksQz1jKChmdW5jdGlvbigpe3JldHVybiciXFx1ZGYwNlxcdWQ4MzQiJyE9PXAoIlx1ZGYwNlx1ZDgzNCIpfHwnIlxcdWRlYWQiJyE9PXAoIlx1ZGVhZCIpfSkpLE89ZnVuY3Rpb24oZSx0KXt2YXIgcj11KGFyZ3VtZW50cyksbj1kKHQpO2lmKGwobil8fHZvaWQgMCE9PWUmJiFoKGUpKXJldHVybiByWzFdPWZ1bmN0aW9uKGUsdCl7aWYobChuKSYmKHQ9cyhuLHRoaXMsZyhlKSx0KSksIWgodCkpcmV0dXJuIHR9LGkocCxudWxsLHIpfSxGPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1iKHIsdC0xKSxhPWIocix0KzEpO3JldHVybiBtKFMsZSkmJiFtKEEsYSl8fG0oQSxlKSYmIW0oUyxuKT8iXFx1Iit2KHkoZSwwKSwxNik6ZX07cCYmbih7dGFyZ2V0OiJKU09OIixzdGF0OiEwLGFyaXR5OjMsZm9yY2VkOmt8fEN9LHtzdHJpbmdpZnk6ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXUoYXJndW1lbnRzKSxhPWkoaz9POnAsbnVsbCxuKTtyZXR1cm4gQyYmInN0cmluZyI9PXR5cGVvZiBhP3coYSx4LEYpOmF9fSl9LDU0Mzg6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1NYXRoLmh5cG90LGk9TWF0aC5hYnMscz1NYXRoLnNxcnQ7bih7dGFyZ2V0OiJNYXRoIixzdGF0OiEwLGFyaXR5OjIsZm9yY2VkOiEhYSYmYSgxLzAsTmFOKSE9PTEvMH0se2h5cG90OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByLG4sYT0wLG89MCxjPWFyZ3VtZW50cy5sZW5ndGgsbD0wO288YzspbDwocj1pKGFyZ3VtZW50c1tvKytdKSk/KGE9YSoobj1sL3IpKm4rMSxsPXIpOmErPXI+MD8obj1yL2wpKm46cjtyZXR1cm4gbD09PTEvMD8xLzA6bCpzKGEpfX0pfSw2OTc3OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cigxNzAyKSxpPXIoOTMwMykscz1yKDg2Myksbz1yKDg0MTUpLGM9cig3MjkzKSxsPVJhbmdlRXJyb3IsaD1TdHJpbmcsdT1NYXRoLmZsb29yLGQ9YShvKSxmPWEoIiIuc2xpY2UpLGc9YSgxLi50b0ZpeGVkKSxwPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gMD09PXQ/cjp0JTI9PTE/cChlLHQtMSxyKmUpOnAoZSplLHQvMixyKX0sbT1mdW5jdGlvbihlLHQscil7Zm9yKHZhciBuPS0xLGE9cjsrK248NjspYSs9dCplW25dLGVbbl09YSUxZTcsYT11KGEvMWU3KX0sYj1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj02LG49MDstLXI+PTA7KW4rPWVbcl0sZVtyXT11KG4vdCksbj1uJXQqMWU3fSx5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD02LHI9IiI7LS10Pj0wOylpZigiIiE9PXJ8fDA9PT10fHwwIT09ZVt0XSl7dmFyIG49aChlW3RdKTtyPSIiPT09cj9uOnIrZCgiMCIsNy1uLmxlbmd0aCkrbn1yZXR1cm4gcn07bih7dGFyZ2V0OiJOdW1iZXIiLHByb3RvOiEwLGZvcmNlZDpjKChmdW5jdGlvbigpe3JldHVybiIwLjAwMCIhPT1nKDhlLTUsMyl8fCIxIiE9PWcoLjksMCl8fCIxLjI1IiE9PWcoMS4yNTUsMil8fCIxMDAwMDAwMDAwMDAwMDAwMTI4IiE9PWcoMHhkZTBiNmIzYTc2NDAwODAsMCl9KSl8fCFjKChmdW5jdGlvbigpe2coe30pfSkpfSx7dG9GaXhlZDpmdW5jdGlvbihlKXt2YXIgdCxyLG4sYSxvPXModGhpcyksYz1pKGUpLHU9WzAsMCwwLDAsMCwwXSxnPSIiLHc9IjAiO2lmKGM8MHx8Yz4yMCl0aHJvdyBsKCJJbmNvcnJlY3QgZnJhY3Rpb24gZGlnaXRzIik7aWYobyE9bylyZXR1cm4iTmFOIjtpZihvPD0tMWUyMXx8bz49MWUyMSlyZXR1cm4gaChvKTtpZihvPDAmJihnPSItIixvPS1vKSxvPjFlLTIxKWlmKHI9KHQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAscj1lO3I+PTQwOTY7KXQrPTEyLHIvPTQwOTY7Zm9yKDtyPj0yOyl0Kz0xLHIvPTI7cmV0dXJuIHR9KG8qcCgyLDY5LDEpKS02OSk8MD9vKnAoMiwtdCwxKTpvL3AoMix0LDEpLHIqPTQ1MDM1OTk2MjczNzA0OTYsKHQ9NTItdCk+MCl7Zm9yKG0odSwwLHIpLG49YztuPj03OyltKHUsMWU3LDApLG4tPTc7Zm9yKG0odSxwKDEwLG4sMSksMCksbj10LTE7bj49MjM7KWIodSwxPDwyMyksbi09MjM7Yih1LDE8PG4pLG0odSwxLDEpLGIodSwyKSx3PXkodSl9ZWxzZSBtKHUsMCxyKSxtKHUsMTw8LXQsMCksdz15KHUpK2QoIjAiLGMpO3JldHVybiBjPjA/ZysoKGE9dy5sZW5ndGgpPD1jPyIwLiIrZCgiMCIsYy1hKSt3OmYodywwLGEtYykrIi4iK2YodyxhLWMpKTpnK3d9fSl9LDk2MDE6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDE1NzQpO24oe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGFyaXR5OjIsZm9yY2VkOk9iamVjdC5hc3NpZ24hPT1hfSx7YXNzaWduOmF9KX0sNjMxNDooZSx0LHIpPT57cigyMTA5KSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtoYXNPd246cigyNTk3KX0pfSw0Njc4OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cigyODE0KTtuKHtnbG9iYWw6ITAsZm9yY2VkOnBhcnNlRmxvYXQhPWF9LHtwYXJzZUZsb2F0OmF9KX0sMTA1ODooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoMzAwOSk7bih7Z2xvYmFsOiEwLGZvcmNlZDpwYXJzZUludCE9YX0se3BhcnNlSW50OmF9KX0sNzkyMjooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNjkxNiksaT1yKDk2NjIpLHM9cig4NTIzKSxvPXIoMjUzNCksYz1yKDQwOCk7bih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwLGZvcmNlZDpyKDYxMil9LHthbGxTZXR0bGVkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMscj1zLmYodCksbj1yLnJlc29sdmUsbD1yLnJlamVjdCxoPW8oKGZ1bmN0aW9uKCl7dmFyIHI9aSh0LnJlc29sdmUpLHM9W10sbz0wLGw9MTtjKGUsKGZ1bmN0aW9uKGUpe3ZhciBpPW8rKyxjPSExO2wrKyxhKHIsdCxlKS50aGVuKChmdW5jdGlvbihlKXtjfHwoYz0hMCxzW2ldPXtzdGF0dXM6ImZ1bGZpbGxlZCIsdmFsdWU6ZX0sLS1sfHxuKHMpKX0pLChmdW5jdGlvbihlKXtjfHwoYz0hMCxzW2ldPXtzdGF0dXM6InJlamVjdGVkIixyZWFzb246ZX0sLS1sfHxuKHMpKX0pKX0pKSwtLWx8fG4ocyl9KSk7cmV0dXJuIGguZXJyb3ImJmwoaC52YWx1ZSksci5wcm9taXNlfX0pfSw4MjE6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDY5MTYpLGk9cig5NjYyKSxzPXIoODUyMyksbz1yKDI1MzQpLGM9cig0MDgpO24oe3RhcmdldDoiUHJvbWlzZSIsc3RhdDohMCxmb3JjZWQ6cig2MTIpfSx7YWxsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMscj1zLmYodCksbj1yLnJlc29sdmUsbD1yLnJlamVjdCxoPW8oKGZ1bmN0aW9uKCl7dmFyIHI9aSh0LnJlc29sdmUpLHM9W10sbz0wLGg9MTtjKGUsKGZ1bmN0aW9uKGUpe3ZhciBpPW8rKyxjPSExO2grKyxhKHIsdCxlKS50aGVuKChmdW5jdGlvbihlKXtjfHwoYz0hMCxzW2ldPWUsLS1ofHxuKHMpKX0pLGwpfSkpLC0taHx8bihzKX0pKTtyZXR1cm4gaC5lcnJvciYmbChoLnZhbHVlKSxyLnByb21pc2V9fSl9LDQxNjQ6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDE5MTMpLGk9cigzNzAyKS5DT05TVFJVQ1RPUixzPXIoMjQ5Miksbz1yKDUwMDUpLGM9cig2MTQpLGw9cig4MDUyKSxoPXMmJnMucHJvdG90eXBlO2lmKG4oe3RhcmdldDoiUHJvbWlzZSIscHJvdG86ITAsZm9yY2VkOmkscmVhbDohMH0se2NhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLGUpfX0pLCFhJiZjKHMpKXt2YXIgdT1vKCJQcm9taXNlIikucHJvdG90eXBlLmNhdGNoO2guY2F0Y2ghPT11JiZsKGgsImNhdGNoIix1LHt1bnNhZmU6ITB9KX19LDM0MDE6KGUsdCxyKT0+e3ZhciBuLGEsaSxzPXIoMjEwOSksbz1yKDE5MTMpLGM9cig1MjY4KSxsPXIoNzg1NCksaD1yKDY5MTYpLHU9cig4MDUyKSxkPXIoNzY3NCksZj1yKDgwMDMpLGc9cig2MzQwKSxwPXIoOTY2MiksbT1yKDYxNCksYj1yKDExMSkseT1yKDU3ODcpLHc9cig2NzA3KSx2PXIoMjYxKS5zZXQseD1yKDU5NDgpLFM9cig4NDIpLEE9cigyNTM0KSxrPXIoODU3MiksQz1yKDk5MDkpLE89cigyNDkyKSxGPXIoMzcwMiksST1yKDg1MjMpLFQ9IlByb21pc2UiLE09Ri5DT05TVFJVQ1RPUixFPUYuUkVKRUNUSU9OX0VWRU5ULFA9Ri5TVUJDTEFTU0lORyxSPUMuZ2V0dGVyRm9yKFQpLE49Qy5zZXQsRD1PJiZPLnByb3RvdHlwZSxCPU8sTD1ELF89bC5UeXBlRXJyb3Isaj1sLmRvY3VtZW50LFU9bC5wcm9jZXNzLCQ9SS5mLFg9JCxIPSEhKGomJmouY3JlYXRlRXZlbnQmJmwuZGlzcGF0Y2hFdmVudCkscT0idW5oYW5kbGVkcmVqZWN0aW9uIix6PWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiEoIWIoZSl8fCFtKHQ9ZS50aGVuKSkmJnR9LEc9ZnVuY3Rpb24oZSx0KXt2YXIgcixuLGEsaT10LnZhbHVlLHM9MT09dC5zdGF0ZSxvPXM/ZS5vazplLmZhaWwsYz1lLnJlc29sdmUsbD1lLnJlamVjdCx1PWUuZG9tYWluO3RyeXtvPyhzfHwoMj09PXQucmVqZWN0aW9uJiZKKHQpLHQucmVqZWN0aW9uPTEpLCEwPT09bz9yPWk6KHUmJnUuZW50ZXIoKSxyPW8oaSksdSYmKHUuZXhpdCgpLGE9ITApKSxyPT09ZS5wcm9taXNlP2woXygiUHJvbWlzZS1jaGFpbiBjeWNsZSIpKToobj16KHIpKT9oKG4scixjLGwpOmMocikpOmwoaSl9Y2F0Y2goZSl7dSYmIWEmJnUuZXhpdCgpLGwoZSl9fSxXPWZ1bmN0aW9uKGUsdCl7ZS5ub3RpZmllZHx8KGUubm90aWZpZWQ9ITAseCgoZnVuY3Rpb24oKXtmb3IodmFyIHIsbj1lLnJlYWN0aW9ucztyPW4uZ2V0KCk7KUcocixlKTtlLm5vdGlmaWVkPSExLHQmJiFlLnJlamVjdGlvbiYmSyhlKX0pKSl9LFY9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGE7SD8oKG49ai5jcmVhdGVFdmVudCgiRXZlbnQiKSkucHJvbWlzZT10LG4ucmVhc29uPXIsbi5pbml0RXZlbnQoZSwhMSwhMCksbC5kaXNwYXRjaEV2ZW50KG4pKTpuPXtwcm9taXNlOnQscmVhc29uOnJ9LCFFJiYoYT1sWyJvbiIrZV0pP2Eobik6ZT09PXEmJlMoIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiIscil9LEs9ZnVuY3Rpb24oZSl7aCh2LGwsKGZ1bmN0aW9uKCl7dmFyIHQscj1lLmZhY2FkZSxuPWUudmFsdWU7aWYoWShlKSYmKHQ9QSgoZnVuY3Rpb24oKXtjP1UuZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixuLHIpOlYocSxyLG4pfSkpLGUucmVqZWN0aW9uPWN8fFkoZSk/MjoxLHQuZXJyb3IpKXRocm93IHQudmFsdWV9KSl9LFk9ZnVuY3Rpb24oZSl7cmV0dXJuIDEhPT1lLnJlamVjdGlvbiYmIWUucGFyZW50fSxKPWZ1bmN0aW9uKGUpe2godixsLChmdW5jdGlvbigpe3ZhciB0PWUuZmFjYWRlO2M/VS5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTpWKCJyZWplY3Rpb25oYW5kbGVkIix0LGUudmFsdWUpfSkpfSxaPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24obil7ZSh0LG4scil9fSxRPWZ1bmN0aW9uKGUsdCxyKXtlLmRvbmV8fChlLmRvbmU9ITAsciYmKGU9ciksZS52YWx1ZT10LGUuc3RhdGU9MixXKGUsITApKX0sZWU9ZnVuY3Rpb24oZSx0LHIpe2lmKCFlLmRvbmUpe2UuZG9uZT0hMCxyJiYoZT1yKTt0cnl7aWYoZS5mYWNhZGU9PT10KXRocm93IF8oIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmIik7dmFyIG49eih0KTtuP3goKGZ1bmN0aW9uKCl7dmFyIHI9e2RvbmU6ITF9O3RyeXtoKG4sdCxaKGVlLHIsZSksWihRLHIsZSkpfWNhdGNoKHQpe1Eocix0LGUpfX0pKTooZS52YWx1ZT10LGUuc3RhdGU9MSxXKGUsITEpKX1jYXRjaCh0KXtRKHtkb25lOiExfSx0LGUpfX19O2lmKE0mJihMPShCPWZ1bmN0aW9uKGUpe3kodGhpcyxMKSxwKGUpLGgobix0aGlzKTt2YXIgdD1SKHRoaXMpO3RyeXtlKFooZWUsdCksWihRLHQpKX1jYXRjaChlKXtRKHQsZSl9fSkucHJvdG90eXBlLChuPWZ1bmN0aW9uKGUpe04odGhpcyx7dHlwZTpULGRvbmU6ITEsbm90aWZpZWQ6ITEscGFyZW50OiExLHJlYWN0aW9uczpuZXcgayxyZWplY3Rpb246ITEsc3RhdGU6MCx2YWx1ZTp2b2lkIDB9KX0pLnByb3RvdHlwZT11KEwsInRoZW4iLChmdW5jdGlvbihlLHQpe3ZhciByPVIodGhpcyksbj0kKHcodGhpcyxCKSk7cmV0dXJuIHIucGFyZW50PSEwLG4ub2s9IW0oZSl8fGUsbi5mYWlsPW0odCkmJnQsbi5kb21haW49Yz9VLmRvbWFpbjp2b2lkIDAsMD09ci5zdGF0ZT9yLnJlYWN0aW9ucy5hZGQobik6eCgoZnVuY3Rpb24oKXtHKG4scil9KSksbi5wcm9taXNlfSkpLGE9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgbix0PVIoZSk7dGhpcy5wcm9taXNlPWUsdGhpcy5yZXNvbHZlPVooZWUsdCksdGhpcy5yZWplY3Q9WihRLHQpfSxJLmY9JD1mdW5jdGlvbihlKXtyZXR1cm4gZT09PUJ8fHZvaWQgMD09PWU/bmV3IGEoZSk6WChlKX0sIW8mJm0oTykmJkQhPT1PYmplY3QucHJvdG90eXBlKSl7aT1ELnRoZW4sUHx8dShELCJ0aGVuIiwoZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzO3JldHVybiBuZXcgQigoZnVuY3Rpb24oZSx0KXtoKGkscixlLHQpfSkpLnRoZW4oZSx0KX0pLHt1bnNhZmU6ITB9KTt0cnl7ZGVsZXRlIEQuY29uc3RydWN0b3J9Y2F0Y2goZSl7fWQmJmQoRCxMKX1zKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsd3JhcDohMCxmb3JjZWQ6TX0se1Byb21pc2U6Qn0pLGYoQixULCExLCEwKSxnKFQpfSw3NzI3OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cigxOTEzKSxpPXIoMjQ5Mikscz1yKDcyOTMpLG89cig1MDA1KSxjPXIoNjE0KSxsPXIoNjcwNyksaD1yKDk0NzgpLHU9cig4MDUyKSxkPWkmJmkucHJvdG90eXBlO2lmKG4oe3RhcmdldDoiUHJvbWlzZSIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6ISFpJiZzKChmdW5jdGlvbigpe2QuZmluYWxseS5jYWxsKHt0aGVuOmZ1bmN0aW9uKCl7fX0sKGZ1bmN0aW9uKCl7fSkpfSkpfSx7ZmluYWxseTpmdW5jdGlvbihlKXt2YXIgdD1sKHRoaXMsbygiUHJvbWlzZSIpKSxyPWMoZSk7cmV0dXJuIHRoaXMudGhlbihyP2Z1bmN0aW9uKHIpe3JldHVybiBoKHQsZSgpKS50aGVuKChmdW5jdGlvbigpe3JldHVybiByfSkpfTplLHI/ZnVuY3Rpb24ocil7cmV0dXJuIGgodCxlKCkpLnRoZW4oKGZ1bmN0aW9uKCl7dGhyb3cgcn0pKX06ZSl9fSksIWEmJmMoaSkpe3ZhciBmPW8oIlByb21pc2UiKS5wcm90b3R5cGUuZmluYWxseTtkLmZpbmFsbHkhPT1mJiZ1KGQsImZpbmFsbHkiLGYse3Vuc2FmZTohMH0pfX0sODY3NDooZSx0LHIpPT57cigzNDAxKSxyKDgyMSkscig0MTY0KSxyKDYwMjcpLHIoNjgzKSxyKDYyOTQpfSw2MDI3OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cig2OTE2KSxpPXIoOTY2Mikscz1yKDg1MjMpLG89cigyNTM0KSxjPXIoNDA4KTtuKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITAsZm9yY2VkOnIoNjEyKX0se3JhY2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxyPXMuZih0KSxuPXIucmVqZWN0LGw9bygoZnVuY3Rpb24oKXt2YXIgcz1pKHQucmVzb2x2ZSk7YyhlLChmdW5jdGlvbihlKXthKHMsdCxlKS50aGVuKHIucmVzb2x2ZSxuKX0pKX0pKTtyZXR1cm4gbC5lcnJvciYmbihsLnZhbHVlKSxyLnByb21pc2V9fSl9LDY4MzooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNjkxNiksaT1yKDg1MjMpO24oe3RhcmdldDoiUHJvbWlzZSIsc3RhdDohMCxmb3JjZWQ6cigzNzAyKS5DT05TVFJVQ1RPUn0se3JlamVjdDpmdW5jdGlvbihlKXt2YXIgdD1pLmYodGhpcyk7cmV0dXJuIGEodC5yZWplY3Qsdm9pZCAwLGUpLHQucHJvbWlzZX19KX0sNjI5NDooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNTAwNSksaT1yKDE5MTMpLHM9cigyNDkyKSxvPXIoMzcwMikuQ09OU1RSVUNUT1IsYz1yKDk0NzgpLGw9YSgiUHJvbWlzZSIpLGg9aSYmIW87bih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwLGZvcmNlZDppfHxvfSx7cmVzb2x2ZTpmdW5jdGlvbihlKXtyZXR1cm4gYyhoJiZ0aGlzPT09bD9zOnRoaXMsZSl9fSl9LDEyOTk6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc4NTQpLGk9cig4MDAzKTtuKHtnbG9iYWw6ITB9LHtSZWZsZWN0Ont9fSksaShhLlJlZmxlY3QsIlJlZmxlY3QiLCEwKX0sNDYwMzooZSx0LHIpPT57dmFyIG49cig5NzgxKSxhPXIoNzg1NCksaT1yKDE3MDIpLHM9cig0NzA1KSxvPXIoOTU4NyksYz1yKDg4ODApLGw9cig4MDA2KS5mLGg9cig3OTc2KSx1PXIoNzg1MCksZD1yKDEzNDApLGY9cig0NzA2KSxnPXIoMjk5OSkscD1yKDI2MjYpLG09cig4MDUyKSxiPXIoNzI5MykseT1yKDI1OTcpLHc9cig5OTA5KS5lbmZvcmNlLHY9cig2MzQwKSx4PXIoNTExMiksUz1yKDk0NDEpLEE9cig3MTY4KSxrPXgoIm1hdGNoIiksQz1hLlJlZ0V4cCxPPUMucHJvdG90eXBlLEY9YS5TeW50YXhFcnJvcixJPWkoTy5leGVjKSxUPWkoIiIuY2hhckF0KSxNPWkoIiIucmVwbGFjZSksRT1pKCIiLmluZGV4T2YpLFA9aSgiIi5zbGljZSksUj0vXlw/PFteXHNcZCEjJSYqKzw9PkBeXVteXHMhIyUmKis8PT5AXl0qPi8sTj0vYS9nLEQ9L2EvZyxCPW5ldyBDKE4pIT09TixMPWcuTUlTU0VEX1NUSUNLWSxfPWcuVU5TVVBQT1JURURfWTtpZihzKCJSZWdFeHAiLG4mJighQnx8THx8U3x8QXx8YigoZnVuY3Rpb24oKXtyZXR1cm4gRFtrXT0hMSxDKE4pIT1OfHxDKEQpPT1EfHwiL2EvaSIhPUMoTiwiaSIpfSkpKSkpe2Zvcih2YXIgaj1mdW5jdGlvbihlLHQpe3ZhciByLG4sYSxpLHMsbCxnPWgoTyx0aGlzKSxwPXUoZSksbT12b2lkIDA9PT10LGI9W10sdj1lO2lmKCFnJiZwJiZtJiZlLmNvbnN0cnVjdG9yPT09ailyZXR1cm4gZTtpZigocHx8aChPLGUpKSYmKGU9ZS5zb3VyY2UsbSYmKHQ9Zih2KSkpLGU9dm9pZCAwPT09ZT8iIjpkKGUpLHQ9dm9pZCAwPT09dD8iIjpkKHQpLHY9ZSxTJiYiZG90QWxsImluIE4mJihuPSEhdCYmRSh0LCJzIik+LTEpJiYodD1NKHQsL3MvZywiIikpLHI9dCxMJiYic3RpY2t5ImluIE4mJihhPSEhdCYmRSh0LCJ5Iik+LTEpJiZfJiYodD1NKHQsL3kvZywiIikpLEEmJihpPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyPWUubGVuZ3RoLG49MCxhPSIiLGk9W10scz17fSxvPSExLGM9ITEsbD0wLGg9IiI7bjw9cjtuKyspe2lmKCJcXCI9PT0odD1UKGUsbikpKXQrPVQoZSwrK24pO2Vsc2UgaWYoIl0iPT09dClvPSExO2Vsc2UgaWYoIW8pc3dpdGNoKCEwKXtjYXNlIlsiPT09dDpvPSEwO2JyZWFrO2Nhc2UiKCI9PT10OkkoUixQKGUsbisxKSkmJihuKz0yLGM9ITApLGErPXQsbCsrO2NvbnRpbnVlO2Nhc2UiPiI9PT10JiZjOmlmKCIiPT09aHx8eShzLGgpKXRocm93IG5ldyBGKCJJbnZhbGlkIGNhcHR1cmUgZ3JvdXAgbmFtZSIpO3NbaF09ITAsaVtpLmxlbmd0aF09W2gsbF0sYz0hMSxoPSIiO2NvbnRpbnVlfWM/aCs9dDphKz10fXJldHVyblthLGldfShlKSxlPWlbMF0sYj1pWzFdKSxzPW8oQyhlLHQpLGc/dGhpczpPLGopLChufHxhfHxiLmxlbmd0aCkmJihsPXcocyksbiYmKGwuZG90QWxsPSEwLGwucmF3PWooZnVuY3Rpb24oZSl7Zm9yKHZhciB0LHI9ZS5sZW5ndGgsbj0wLGE9IiIsaT0hMTtuPD1yO24rKykiXFwiIT09KHQ9VChlLG4pKT9pfHwiLiIhPT10PygiWyI9PT10P2k9ITA6Il0iPT09dCYmKGk9ITEpLGErPXQpOmErPSJbXFxzXFxTXSI6YSs9dCtUKGUsKytuKTtyZXR1cm4gYX0oZSkscikpLGEmJihsLnN0aWNreT0hMCksYi5sZW5ndGgmJihsLmdyb3Vwcz1iKSksZSE9PXYpdHJ5e2Mocywic291cmNlIiwiIj09PXY/Iig/OikiOnYpfWNhdGNoKGUpe31yZXR1cm4gc30sVT1sKEMpLCQ9MDtVLmxlbmd0aD4kOylwKGosQyxVWyQrK10pO08uY29uc3RydWN0b3I9aixqLnByb3RvdHlwZT1PLG0oYSwiUmVnRXhwIixqLHtjb25zdHJ1Y3RvcjohMH0pfXYoIlJlZ0V4cCIpfSw4NDUwOihlLHQscik9Pnt2YXIgbj1yKDk3ODEpLGE9cig5NDQxKSxpPXIoNDMyNikscz1yKDcwNDUpLG89cig5OTA5KS5nZXQsYz1SZWdFeHAucHJvdG90eXBlLGw9VHlwZUVycm9yO24mJmEmJnMoYywiZG90QWxsIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHRoaXMhPT1jKXtpZigiUmVnRXhwIj09PWkodGhpcykpcmV0dXJuISFvKHRoaXMpLmRvdEFsbDt0aHJvdyBsKCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsIFJlZ0V4cCByZXF1aXJlZCIpfX19KX0sNDkxNjooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoMjI2MSk7bih7dGFyZ2V0OiJSZWdFeHAiLHByb3RvOiEwLGZvcmNlZDovLi8uZXhlYyE9PWF9LHtleGVjOmF9KX0sMjA4NzooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPXIoOTc4MSksaT1yKDcwNDUpLHM9cig3MDY2KSxvPXIoNzI5MyksYz1uLlJlZ0V4cCxsPWMucHJvdG90eXBlO2EmJm8oKGZ1bmN0aW9uKCl7dmFyIGU9ITA7dHJ5e2MoIi4iLCJkIil9Y2F0Y2godCl7ZT0hMX12YXIgdD17fSxyPSIiLG49ZT8iZGdpbXN5IjoiZ2ltc3kiLGE9ZnVuY3Rpb24oZSxuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcis9biwhMH19KX0saT17ZG90QWxsOiJzIixnbG9iYWw6ImciLGlnbm9yZUNhc2U6ImkiLG11bHRpbGluZToibSIsc3RpY2t5OiJ5In07Zm9yKHZhciBzIGluIGUmJihpLmhhc0luZGljZXM9ImQiKSxpKWEocyxpW3NdKTtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihsLCJmbGFncyIpLmdldC5jYWxsKHQpIT09bnx8ciE9PW59KSkmJmkobCwiZmxhZ3MiLHtjb25maWd1cmFibGU6ITAsZ2V0OnN9KX0sNzYwMTooZSx0LHIpPT57cig0OTE2KTt2YXIgbixhLGk9cigyMTA5KSxzPXIoNjkxNiksbz1yKDYxNCksYz1yKDk2NzApLGw9cigxMzQwKSxoPShuPSExLChhPS9bYWNdLykuZXhlYz1mdW5jdGlvbigpe3JldHVybiBuPSEwLC8uLy5leGVjLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sITA9PT1hLnRlc3QoImFiYyIpJiZuKSx1PS8uLy50ZXN0O2koe3RhcmdldDoiUmVnRXhwIixwcm90bzohMCxmb3JjZWQ6IWh9LHt0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWModGhpcykscj1sKGUpLG49dC5leGVjO2lmKCFvKG4pKXJldHVybiBzKHUsdCxyKTt2YXIgYT1zKG4sdCxyKTtyZXR1cm4gbnVsbCE9PWEmJihjKGEpLCEwKX19KX0sOTcxNDooZSx0LHIpPT57dmFyIG49cig2NTMwKS5QUk9QRVIsYT1yKDgwNTIpLGk9cig5NjcwKSxzPXIoMTM0MCksbz1yKDcyOTMpLGM9cig0NzA2KSxsPSJ0b1N0cmluZyIsaD1SZWdFeHAucHJvdG90eXBlW2xdLHU9bygoZnVuY3Rpb24oKXtyZXR1cm4iL2EvYiIhPWguY2FsbCh7c291cmNlOiJhIixmbGFnczoiYiJ9KX0pKSxkPW4mJmgubmFtZSE9bDsodXx8ZCkmJmEoUmVnRXhwLnByb3RvdHlwZSxsLChmdW5jdGlvbigpe3ZhciBlPWkodGhpcyk7cmV0dXJuIi8iK3MoZS5zb3VyY2UpKyIvIitzKGMoZSkpfSkse3Vuc2FmZTohMH0pfSw0NTA2OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cigxNzAyKSxpPXIoNDQ4OCkscz1yKDkzMDMpLG89cigxMzQwKSxjPXIoNzI5MyksbD1hKCIiLmNoYXJBdCk7bih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDpjKChmdW5jdGlvbigpe3JldHVybiJcdWQ4NDIiIT09Iu2hgu2+tyIuYXQoLTIpfSkpfSx7YXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9byhpKHRoaXMpKSxyPXQubGVuZ3RoLG49cyhlKSxhPW4+PTA/bjpyK247cmV0dXJuIGE8MHx8YT49cj92b2lkIDA6bCh0LGEpfX0pfSw3ODUyOihlLHQscik9Pnt2YXIgbixhPXIoMjEwOSksaT1yKDE0NzApLHM9cigxMjM2KS5mLG89cig3NDY2KSxjPXIoMTM0MCksbD1yKDM5MjkpLGg9cig0NDg4KSx1PXIoNDk2NCksZD1yKDE5MTMpLGY9aSgiIi5lbmRzV2l0aCksZz1pKCIiLnNsaWNlKSxwPU1hdGgubWluLG09dSgiZW5kc1dpdGgiKTthKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOiEoIWQmJiFtJiYobj1zKFN0cmluZy5wcm90b3R5cGUsImVuZHNXaXRoIiksbiYmIW4ud3JpdGFibGUpfHxtKX0se2VuZHNXaXRoOmZ1bmN0aW9uKGUpe3ZhciB0PWMoaCh0aGlzKSk7bChlKTt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCxuPXQubGVuZ3RoLGE9dm9pZCAwPT09cj9uOnAobyhyKSxuKSxpPWMoZSk7cmV0dXJuIGY/Zih0LGksYSk6Zyh0LGEtaS5sZW5ndGgsYSk9PT1pfX0pfSwyMDIzOihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cigxNzAyKSxpPXIoMzkyOSkscz1yKDQ0ODgpLG89cigxMzQwKSxjPXIoNDk2NCksbD1hKCIiLmluZGV4T2YpO24oe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6IWMoImluY2x1ZGVzIil9LHtpbmNsdWRlczpmdW5jdGlvbihlKXtyZXR1cm4hIX5sKG8ocyh0aGlzKSksbyhpKGUpKSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LDg3ODM6KGUsdCxyKT0+e3ZhciBuPXIoODcxMCkuY2hhckF0LGE9cigxMzQwKSxpPXIoOTkwOSkscz1yKDE2NTYpLG89cig2MTc4KSxjPSJTdHJpbmcgSXRlcmF0b3IiLGw9aS5zZXQsaD1pLmdldHRlckZvcihjKTtzKFN0cmluZywiU3RyaW5nIiwoZnVuY3Rpb24oZSl7bCh0aGlzLHt0eXBlOmMsc3RyaW5nOmEoZSksaW5kZXg6MH0pfSksKGZ1bmN0aW9uKCl7dmFyIGUsdD1oKHRoaXMpLHI9dC5zdHJpbmcsYT10LmluZGV4O3JldHVybiBhPj1yLmxlbmd0aD9vKHZvaWQgMCwhMCk6KGU9bihyLGEpLHQuaW5kZXgrPWUubGVuZ3RoLG8oZSwhMSkpfSkpfSw0NzIzOihlLHQscik9Pnt2YXIgbj1yKDY5MTYpLGE9cig3MDA3KSxpPXIoOTY3MCkscz1yKDg1NTQpLG89cig3NDY2KSxjPXIoMTM0MCksbD1yKDQ0ODgpLGg9cig4MTczKSx1PXIoMTUzMCksZD1yKDc2NTEpO2EoIm1hdGNoIiwoZnVuY3Rpb24oZSx0LHIpe3JldHVybltmdW5jdGlvbih0KXt2YXIgcj1sKHRoaXMpLGE9cyh0KT92b2lkIDA6aCh0LGUpO3JldHVybiBhP24oYSx0LHIpOm5ldyBSZWdFeHAodClbZV0oYyhyKSl9LGZ1bmN0aW9uKGUpe3ZhciBuPWkodGhpcyksYT1jKGUpLHM9cih0LG4sYSk7aWYocy5kb25lKXJldHVybiBzLnZhbHVlO2lmKCFuLmdsb2JhbClyZXR1cm4gZChuLGEpO3ZhciBsPW4udW5pY29kZTtuLmxhc3RJbmRleD0wO2Zvcih2YXIgaCxmPVtdLGc9MDtudWxsIT09KGg9ZChuLGEpKTspe3ZhciBwPWMoaFswXSk7ZltnXT1wLCIiPT09cCYmKG4ubGFzdEluZGV4PXUoYSxvKG4ubGFzdEluZGV4KSxsKSksZysrfXJldHVybiAwPT09Zz9udWxsOmZ9XX0pKX0sODc1NzooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNjkxNiksaT1yKDE3MDIpLHM9cig0NDg4KSxvPXIoNjE0KSxjPXIoODU1NCksbD1yKDc4NTApLGg9cigxMzQwKSx1PXIoODE3MyksZD1yKDQ3MDYpLGY9cig2NDcpLGc9cig1MTEyKSxwPXIoMTkxMyksbT1nKCJyZXBsYWNlIiksYj1UeXBlRXJyb3IseT1pKCIiLmluZGV4T2YpLHc9aSgiIi5yZXBsYWNlKSx2PWkoIiIuc2xpY2UpLHg9TWF0aC5tYXgsUz1mdW5jdGlvbihlLHQscil7cmV0dXJuIHI+ZS5sZW5ndGg/LTE6IiI9PT10P3I6eShlLHQscil9O24oe3RhcmdldDoiU3RyaW5nIixwcm90bzohMH0se3JlcGxhY2VBbGw6ZnVuY3Rpb24oZSx0KXt2YXIgcixuLGksZyxBLGssQyxPLEYsST1zKHRoaXMpLFQ9MCxNPTAsRT0iIjtpZighYyhlKSl7aWYoKHI9bChlKSkmJihuPWgocyhkKGUpKSksIX55KG4sImciKSkpdGhyb3cgYigiYC5yZXBsYWNlQWxsYCBkb2VzIG5vdCBhbGxvdyBub24tZ2xvYmFsIHJlZ2V4ZXMiKTtpZihpPXUoZSxtKSlyZXR1cm4gYShpLGUsSSx0KTtpZihwJiZyKXJldHVybiB3KGgoSSksZSx0KX1mb3IoZz1oKEkpLEE9aChlKSwoaz1vKHQpKXx8KHQ9aCh0KSksQz1BLmxlbmd0aCxPPXgoMSxDKSxUPVMoZyxBLDApOy0xIT09VDspRj1rP2godChBLFQsZykpOmYoQSxnLFQsW10sdm9pZCAwLHQpLEUrPXYoZyxNLFQpK0YsTT1UK0MsVD1TKGcsQSxUK08pO3JldHVybiBNPGcubGVuZ3RoJiYoRSs9dihnLE0pKSxFfX0pfSw1MzA2OihlLHQscik9Pnt2YXIgbj1yKDIxMDQpLGE9cig2OTE2KSxpPXIoMTcwMikscz1yKDcwMDcpLG89cig3MjkzKSxjPXIoOTY3MCksbD1yKDYxNCksaD1yKDg1NTQpLHU9cig5MzAzKSxkPXIoNzQ2NiksZj1yKDEzNDApLGc9cig0NDg4KSxwPXIoMTUzMCksbT1yKDgxNzMpLGI9cig2NDcpLHk9cig3NjUxKSx3PXIoNTExMikoInJlcGxhY2UiKSx2PU1hdGgubWF4LHg9TWF0aC5taW4sUz1pKFtdLmNvbmNhdCksQT1pKFtdLnB1c2gpLGs9aSgiIi5pbmRleE9mKSxDPWkoIiIuc2xpY2UpLE89IiQwIj09PSJhIi5yZXBsYWNlKC8uLywiJDAiKSxGPSEhLy4vW3ddJiYiIj09PS8uL1t3XSgiYSIsIiQwIik7cygicmVwbGFjZSIsKGZ1bmN0aW9uKGUsdCxyKXt2YXIgaT1GPyIkIjoiJDAiO3JldHVybltmdW5jdGlvbihlLHIpe3ZhciBuPWcodGhpcyksaT1oKGUpP3ZvaWQgMDptKGUsdyk7cmV0dXJuIGk/YShpLGUsbixyKTphKHQsZihuKSxlLHIpfSxmdW5jdGlvbihlLGEpe3ZhciBzPWModGhpcyksbz1mKGUpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmLTE9PT1rKGEsaSkmJi0xPT09ayhhLCIkPCIpKXt2YXIgaD1yKHQscyxvLGEpO2lmKGguZG9uZSlyZXR1cm4gaC52YWx1ZX12YXIgZz1sKGEpO2d8fChhPWYoYSkpO3ZhciBtPXMuZ2xvYmFsO2lmKG0pe3ZhciB3PXMudW5pY29kZTtzLmxhc3RJbmRleD0wfWZvcih2YXIgTz1bXTs7KXt2YXIgRj15KHMsbyk7aWYobnVsbD09PUYpYnJlYWs7aWYoQShPLEYpLCFtKWJyZWFrOyIiPT09ZihGWzBdKSYmKHMubGFzdEluZGV4PXAobyxkKHMubGFzdEluZGV4KSx3KSl9Zm9yKHZhciBJLFQ9IiIsTT0wLEU9MDtFPE8ubGVuZ3RoO0UrKyl7Zm9yKHZhciBQPWYoKEY9T1tFXSlbMF0pLFI9dih4KHUoRi5pbmRleCksby5sZW5ndGgpLDApLE49W10sRD0xO0Q8Ri5sZW5ndGg7RCsrKUEoTix2b2lkIDA9PT0oST1GW0RdKT9JOlN0cmluZyhJKSk7dmFyIEI9Ri5ncm91cHM7aWYoZyl7dmFyIEw9UyhbUF0sTixSLG8pO3ZvaWQgMCE9PUImJkEoTCxCKTt2YXIgXz1mKG4oYSx2b2lkIDAsTCkpfWVsc2UgXz1iKFAsbyxSLE4sQixhKTtSPj1NJiYoVCs9QyhvLE0sUikrXyxNPVIrUC5sZW5ndGgpfXJldHVybiBUK0MobyxNKX1dfSksISFvKChmdW5jdGlvbigpe3ZhciBlPS8uLztyZXR1cm4gZS5leGVjPWZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIGUuZ3JvdXBzPXthOiI3In0sZX0sIjciIT09IiIucmVwbGFjZShlLCIkPGE+Iil9KSl8fCFPfHxGKX0sMzEyMzooZSx0LHIpPT57dmFyIG49cigyMTA0KSxhPXIoNjkxNiksaT1yKDE3MDIpLHM9cig3MDA3KSxvPXIoOTY3MCksYz1yKDg1NTQpLGw9cig3ODUwKSxoPXIoNDQ4OCksdT1yKDY3MDcpLGQ9cigxNTMwKSxmPXIoNzQ2NiksZz1yKDEzNDApLHA9cig4MTczKSxtPXIoMTU4OSksYj1yKDc2NTEpLHk9cigyMjYxKSx3PXIoMjk5OSksdj1yKDcyOTMpLHg9dy5VTlNVUFBPUlRFRF9ZLFM9NDI5NDk2NzI5NSxBPU1hdGgubWluLGs9W10ucHVzaCxDPWkoLy4vLmV4ZWMpLE89aShrKSxGPWkoIiIuc2xpY2UpO3MoInNwbGl0IiwoZnVuY3Rpb24oZSx0LHIpe3ZhciBpO3JldHVybiBpPSJjIj09ImFiYmMiLnNwbGl0KC8oYikqLylbMV18fDQhPSJ0ZXN0Ii5zcGxpdCgvKD86KS8sLTEpLmxlbmd0aHx8MiE9ImFiIi5zcGxpdCgvKD86YWIpKi8pLmxlbmd0aHx8NCE9Ii4iLnNwbGl0KC8oLj8pKC4/KS8pLmxlbmd0aHx8Ii4iLnNwbGl0KC8oKSgpLykubGVuZ3RoPjF8fCIiLnNwbGl0KC8uPy8pLmxlbmd0aD9mdW5jdGlvbihlLHIpe3ZhciBpPWcoaCh0aGlzKSkscz12b2lkIDA9PT1yP1M6cj4+PjA7aWYoMD09PXMpcmV0dXJuW107aWYodm9pZCAwPT09ZSlyZXR1cm5baV07aWYoIWwoZSkpcmV0dXJuIGEodCxpLGUscyk7Zm9yKHZhciBvLGMsdSxkPVtdLGY9KGUuaWdub3JlQ2FzZT8iaSI6IiIpKyhlLm11bHRpbGluZT8ibSI6IiIpKyhlLnVuaWNvZGU/InUiOiIiKSsoZS5zdGlja3k/InkiOiIiKSxwPTAsYj1uZXcgUmVnRXhwKGUuc291cmNlLGYrImciKTsobz1hKHksYixpKSkmJiEoKGM9Yi5sYXN0SW5kZXgpPnAmJihPKGQsRihpLHAsby5pbmRleCkpLG8ubGVuZ3RoPjEmJm8uaW5kZXg8aS5sZW5ndGgmJm4oayxkLG0obywxKSksdT1vWzBdLmxlbmd0aCxwPWMsZC5sZW5ndGg+PXMpKTspYi5sYXN0SW5kZXg9PT1vLmluZGV4JiZiLmxhc3RJbmRleCsrO3JldHVybiBwPT09aS5sZW5ndGg/IXUmJkMoYiwiIil8fE8oZCwiIik6TyhkLEYoaSxwKSksZC5sZW5ndGg+cz9tKGQsMCxzKTpkfToiMCIuc3BsaXQodm9pZCAwLDApLmxlbmd0aD9mdW5jdGlvbihlLHIpe3JldHVybiB2b2lkIDA9PT1lJiYwPT09cj9bXTphKHQsdGhpcyxlLHIpfTp0LFtmdW5jdGlvbih0LHIpe3ZhciBuPWgodGhpcykscz1jKHQpP3ZvaWQgMDpwKHQsZSk7cmV0dXJuIHM/YShzLHQsbixyKTphKGksZyhuKSx0LHIpfSxmdW5jdGlvbihlLG4pe3ZhciBhPW8odGhpcykscz1nKGUpLGM9cihpLGEscyxuLGkhPT10KTtpZihjLmRvbmUpcmV0dXJuIGMudmFsdWU7dmFyIGw9dShhLFJlZ0V4cCksaD1hLnVuaWNvZGUscD0oYS5pZ25vcmVDYXNlPyJpIjoiIikrKGEubXVsdGlsaW5lPyJtIjoiIikrKGEudW5pY29kZT8idSI6IiIpKyh4PyJnIjoieSIpLG09bmV3IGwoeD8iXig/OiIrYS5zb3VyY2UrIikiOmEscCkseT12b2lkIDA9PT1uP1M6bj4+PjA7aWYoMD09PXkpcmV0dXJuW107aWYoMD09PXMubGVuZ3RoKXJldHVybiBudWxsPT09YihtLHMpP1tzXTpbXTtmb3IodmFyIHc9MCx2PTAsaz1bXTt2PHMubGVuZ3RoOyl7bS5sYXN0SW5kZXg9eD8wOnY7dmFyIEMsST1iKG0seD9GKHMsdik6cyk7aWYobnVsbD09PUl8fChDPUEoZihtLmxhc3RJbmRleCsoeD92OjApKSxzLmxlbmd0aCkpPT09dyl2PWQocyx2LGgpO2Vsc2V7aWYoTyhrLEYocyx3LHYpKSxrLmxlbmd0aD09PXkpcmV0dXJuIGs7Zm9yKHZhciBUPTE7VDw9SS5sZW5ndGgtMTtUKyspaWYoTyhrLElbVF0pLGsubGVuZ3RoPT09eSlyZXR1cm4gazt2PXc9Q319cmV0dXJuIE8oayxGKHMsdykpLGt9XX0pLCEhdigoZnVuY3Rpb24oKXt2YXIgZT0vKD86KS8sdD1lLmV4ZWM7ZS5leGVjPWZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt2YXIgcj0iYWIiLnNwbGl0KGUpO3JldHVybiAyIT09ci5sZW5ndGh8fCJhIiE9PXJbMF18fCJiIiE9PXJbMV19KSkseCl9LDY3NTU6KGUsdCxyKT0+e3ZhciBuLGE9cigyMTA5KSxpPXIoMTQ3MCkscz1yKDEyMzYpLmYsbz1yKDc0NjYpLGM9cigxMzQwKSxsPXIoMzkyOSksaD1yKDQ0ODgpLHU9cig0OTY0KSxkPXIoMTkxMyksZj1pKCIiLnN0YXJ0c1dpdGgpLGc9aSgiIi5zbGljZSkscD1NYXRoLm1pbixtPXUoInN0YXJ0c1dpdGgiKTthKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOiEoIWQmJiFtJiYobj1zKFN0cmluZy5wcm90b3R5cGUsInN0YXJ0c1dpdGgiKSxuJiYhbi53cml0YWJsZSl8fG0pfSx7c3RhcnRzV2l0aDpmdW5jdGlvbihlKXt2YXIgdD1jKGgodGhpcykpO2woZSk7dmFyIHI9byhwKGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLHQubGVuZ3RoKSksbj1jKGUpO3JldHVybiBmP2YodCxuLHIpOmcodCxyLHIrbi5sZW5ndGgpPT09bn19KX0sMzIxMDooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoMzExMSkudHJpbTtuKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOnIoNjA5MSkoInRyaW0iKX0se3RyaW06ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzKX19KX0sMTgxNzooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoOTc4MSksaT1yKDc4NTQpLHM9cigxNzAyKSxvPXIoMjU5NyksYz1yKDYxNCksbD1yKDc5NzYpLGg9cigxMzQwKSx1PXIoNzA0NSksZD1yKDk5MjApLGY9aS5TeW1ib2wsZz1mJiZmLnByb3RvdHlwZTtpZihhJiZjKGYpJiYoISgiZGVzY3JpcHRpb24iaW4gZyl8fHZvaWQgMCE9PWYoKS5kZXNjcmlwdGlvbikpe3ZhciBwPXt9LG09ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPDF8fHZvaWQgMD09PWFyZ3VtZW50c1swXT92b2lkIDA6aChhcmd1bWVudHNbMF0pLHQ9bChnLHRoaXMpP25ldyBmKGUpOnZvaWQgMD09PWU/ZigpOmYoZSk7cmV0dXJuIiI9PT1lJiYocFt0XT0hMCksdH07ZChtLGYpLG0ucHJvdG90eXBlPWcsZy5jb25zdHJ1Y3Rvcj1tO3ZhciBiPSJTeW1ib2wodGVzdCkiPT1TdHJpbmcoZigidGVzdCIpKSx5PXMoZy52YWx1ZU9mKSx3PXMoZy50b1N0cmluZyksdj0vXlN5bWJvbFwoKC4qKVwpW14pXSskLyx4PXMoIiIucmVwbGFjZSksUz1zKCIiLnNsaWNlKTt1KGcsImRlc2NyaXB0aW9uIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciBlPXkodGhpcyk7aWYobyhwLGUpKXJldHVybiIiO3ZhciB0PXcoZSkscj1iP1ModCw3LC0xKTp4KHQsdiwiJDEiKTtyZXR1cm4iIj09PXI/dm9pZCAwOnJ9fSksbih7Z2xvYmFsOiEwLGNvbnN0cnVjdG9yOiEwLGZvcmNlZDohMH0se1N5bWJvbDptfSl9fSw4Njc1OihlLHQscik9Pnt2YXIgbj1yKDI2MCksYT1yKDYyNDQpLGk9cig5MzAzKSxzPW4uYVR5cGVkQXJyYXk7KDAsbi5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiYXQiLChmdW5jdGlvbihlKXt2YXIgdD1zKHRoaXMpLHI9YSh0KSxuPWkoZSksbz1uPj0wP246cituO3JldHVybiBvPDB8fG8+PXI/dm9pZCAwOnRbb119KSl9LDMxMDU6KGUsdCxyKT0+e3ZhciBuPXIoMjYwKSxhPXIoMTI4NSksaT1yKDQ1OTkpLHM9cig2NDgpLG89cig2OTE2KSxjPXIoMTcwMiksbD1yKDcyOTMpLGg9bi5hVHlwZWRBcnJheSx1PW4uZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxkPWMoIiIuc2xpY2UpO3UoImZpbGwiLChmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoO2godGhpcyk7dmFyIHI9IkJpZyI9PT1kKHModGhpcyksMCwzKT9pKGUpOitlO3JldHVybiBvKGEsdGhpcyxyLHQ+MT9hcmd1bWVudHNbMV06dm9pZCAwLHQ+Mj9hcmd1bWVudHNbMl06dm9pZCAwKX0pLGwoKGZ1bmN0aW9uKCl7dmFyIGU9MDtyZXR1cm4gbmV3IEludDhBcnJheSgyKS5maWxsKHt2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIGUrK319KSwxIT09ZX0pKSl9LDI5NTg6KGUsdCxyKT0+e3ZhciBuPXIoMjYwKSxhPXIoOTY3MSkuZmluZExhc3RJbmRleCxpPW4uYVR5cGVkQXJyYXk7KDAsbi5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiZmluZExhc3RJbmRleCIsKGZ1bmN0aW9uKGUpe3JldHVybiBhKGkodGhpcyksZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSl9LDM0MDg6KGUsdCxyKT0+e3ZhciBuPXIoMjYwKSxhPXIoOTY3MSkuZmluZExhc3QsaT1uLmFUeXBlZEFycmF5OygwLG4uZXhwb3J0VHlwZWRBcnJheU1ldGhvZCkoImZpbmRMYXN0IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEoaSh0aGlzKSxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0pKX0sNDE5NzooZSx0LHIpPT57cig5ODQzKSgiRmxvYXQzMiIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LHIsbil7cmV0dXJuIGUodGhpcyx0LHIsbil9fSkpfSw2NDk1OihlLHQscik9PntyKDk4NDMpKCJGbG9hdDY0IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtyZXR1cm4gZSh0aGlzLHQscixuKX19KSl9LDUxMDk6KGUsdCxyKT0+e3IoOTg0MykoIkludDE2IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtyZXR1cm4gZSh0aGlzLHQscixuKX19KSl9LDUxMjU6KGUsdCxyKT0+e3IoOTg0MykoIkludDMyIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtyZXR1cm4gZSh0aGlzLHQscixuKX19KSl9LDcxNDU6KGUsdCxyKT0+e3IoOTg0MykoIkludDgiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyLG4pe3JldHVybiBlKHRoaXMsdCxyLG4pfX0pKX0sMzQ2MjooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPXIoNjkxNiksaT1yKDI2MCkscz1yKDYyNDQpLG89cig0NTkwKSxjPXIoNzkwOCksbD1yKDcyOTMpLGg9bi5SYW5nZUVycm9yLHU9bi5JbnQ4QXJyYXksZD11JiZ1LnByb3RvdHlwZSxmPWQmJmQuc2V0LGc9aS5hVHlwZWRBcnJheSxwPWkuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxtPSFsKChmdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OENsYW1wZWRBcnJheSgyKTtyZXR1cm4gYShmLGUse2xlbmd0aDoxLDA6M30sMSksMyE9PWVbMV19KSksYj1tJiZpLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MmJmwoKGZ1bmN0aW9uKCl7dmFyIGU9bmV3IHUoMik7cmV0dXJuIGUuc2V0KDEpLGUuc2V0KCIyIiwxKSwwIT09ZVswXXx8MiE9PWVbMV19KSk7cCgic2V0IiwoZnVuY3Rpb24oZSl7Zyh0aGlzKTt2YXIgdD1vKGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDEpLHI9YyhlKTtpZihtKXJldHVybiBhKGYsdGhpcyxyLHQpO3ZhciBuPXRoaXMubGVuZ3RoLGk9cyhyKSxsPTA7aWYoaSt0Pm4pdGhyb3cgaCgiV3JvbmcgbGVuZ3RoIik7Zm9yKDtsPGk7KXRoaXNbdCtsXT1yW2wrK119KSwhbXx8Yil9LDM4MjQ6KGUsdCxyKT0+e3ZhciBuPXIoNzg1NCksYT1yKDE0NzApLGk9cig3MjkzKSxzPXIoOTY2Miksbz1yKDQzNjIpLGM9cigyNjApLGw9cig4ODg2KSxoPXIoMjU2KSx1PXIoNzM5MiksZD1yKDgwMDgpLGY9Yy5hVHlwZWRBcnJheSxnPWMuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxwPW4uVWludDE2QXJyYXksbT1wJiZhKHAucHJvdG90eXBlLnNvcnQpLGI9ISghbXx8aSgoZnVuY3Rpb24oKXttKG5ldyBwKDIpLG51bGwpfSkpJiZpKChmdW5jdGlvbigpe20obmV3IHAoMikse30pfSkpKSx5PSEhbSYmIWkoKGZ1bmN0aW9uKCl7aWYodSlyZXR1cm4gdTw3NDtpZihsKXJldHVybiBsPDY3O2lmKGgpcmV0dXJuITA7aWYoZClyZXR1cm4gZDw2MDI7dmFyIGUsdCxyPW5ldyBwKDUxNiksbj1BcnJheSg1MTYpO2ZvcihlPTA7ZTw1MTY7ZSsrKXQ9ZSU0LHJbZV09NTE1LWUsbltlXT1lLTIqdCszO2ZvcihtKHIsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUvNHwwKS0odC80fDApfSkpLGU9MDtlPDUxNjtlKyspaWYocltlXSE9PW5bZV0pcmV0dXJuITB9KSk7Zygic29ydCIsKGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lJiZzKGUpLHk/bSh0aGlzLGUpOm8oZih0aGlzKSxmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyKXtyZXR1cm4gdm9pZCAwIT09ZT8rZSh0LHIpfHwwOnIhPXI/LTE6dCE9dD8xOjA9PT10JiYwPT09cj8xL3Q+MCYmMS9yPDA/MTotMTp0PnJ9fShlKSl9KSwheXx8Yil9LDI5NzQ6KGUsdCxyKT0+e3ZhciBuPXIoNzg1NCksYT1yKDIxMDQpLGk9cigyNjApLHM9cig3MjkzKSxvPXIoMjA2KSxjPW4uSW50OEFycmF5LGw9aS5hVHlwZWRBcnJheSxoPWkuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCx1PVtdLnRvTG9jYWxlU3RyaW5nLGQ9ISFjJiZzKChmdW5jdGlvbigpe3UuY2FsbChuZXcgYygxKSl9KSk7aCgidG9Mb2NhbGVTdHJpbmciLChmdW5jdGlvbigpe3JldHVybiBhKHUsZD9vKGwodGhpcykpOmwodGhpcyksbyhhcmd1bWVudHMpKX0pLHMoKGZ1bmN0aW9uKCl7cmV0dXJuWzEsMl0udG9Mb2NhbGVTdHJpbmcoKSE9bmV3IGMoWzEsMl0pLnRvTG9jYWxlU3RyaW5nKCl9KSl8fCFzKChmdW5jdGlvbigpe2MucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nLmNhbGwoWzEsMl0pfSkpKX0sMTQzOTooZSx0LHIpPT57dmFyIG49cigxODQzKSxhPXIoMjYwKSxpPWEuYVR5cGVkQXJyYXkscz1hLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Qsbz1hLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtzKCJ0b1JldmVyc2VkIiwoZnVuY3Rpb24oKXtyZXR1cm4gbihpKHRoaXMpLG8odGhpcykpfSkpfSw3NTg1OihlLHQscik9Pnt2YXIgbj1yKDI2MCksYT1yKDE3MDIpLGk9cig5NjYyKSxzPXIoNzc0NSksbz1uLmFUeXBlZEFycmF5LGM9bi5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3IsbD1uLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsaD1hKG4uVHlwZWRBcnJheVByb3RvdHlwZS5zb3J0KTtsKCJ0b1NvcnRlZCIsKGZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJmkoZSk7dmFyIHQ9byh0aGlzKSxyPXMoYyh0KSx0KTtyZXR1cm4gaChyLGUpfSkpfSw4MjU1OihlLHQscik9PntyKDk4NDMpKCJVaW50MTYiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyLG4pe3JldHVybiBlKHRoaXMsdCxyLG4pfX0pKX0sOTEzNTooZSx0LHIpPT57cig5ODQzKSgiVWludDMyIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtyZXR1cm4gZSh0aGlzLHQscixuKX19KSl9LDI0NzI6KGUsdCxyKT0+e3IoOTg0MykoIlVpbnQ4IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtyZXR1cm4gZSh0aGlzLHQscixuKX19KSl9LDk3NDM6KGUsdCxyKT0+e3IoOTg0MykoIlVpbnQ4IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtyZXR1cm4gZSh0aGlzLHQscixuKX19KSwhMCl9LDUzMTU6KGUsdCxyKT0+e3ZhciBuPXIoMTU3MiksYT1yKDI2MCksaT1yKDQwNjcpLHM9cig5MzAzKSxvPXIoNDU5OSksYz1hLmFUeXBlZEFycmF5LGw9YS5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3IsaD1hLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsdT0hIWZ1bmN0aW9uKCl7dHJ5e25ldyBJbnQ4QXJyYXkoMSkud2l0aCgyLHt2YWx1ZU9mOmZ1bmN0aW9uKCl7dGhyb3cgOH19KX1jYXRjaChlKXtyZXR1cm4gOD09PWV9fSgpO2goIndpdGgiLHt3aXRoOmZ1bmN0aW9uKGUsdCl7dmFyIHI9Yyh0aGlzKSxhPXMoZSksaD1pKHIpP28odCk6K3Q7cmV0dXJuIG4ocixsKHIpLGEsaCl9fS53aXRoLCF1KX0sMTIwMjooZSx0LHIpPT57dmFyIG4sYT1yKDY2NzcpLGk9cig3ODU0KSxzPXIoMTcwMiksbz1yKDkxOTApLGM9cigyNDIzKSxsPXIoNzcxMCksaD1yKDkzMjApLHU9cigxMTEpLGQ9cig5OTA5KS5lbmZvcmNlLGY9cig3MjkzKSxnPXIoNDgxMSkscD1PYmplY3QsbT1BcnJheS5pc0FycmF5LGI9cC5pc0V4dGVuc2libGUseT1wLmlzRnJvemVuLHc9cC5pc1NlYWxlZCx2PXAuZnJlZXplLHg9cC5zZWFsLFM9e30sQT17fSxrPSFpLkFjdGl2ZVhPYmplY3QmJiJBY3RpdmVYT2JqZWN0ImluIGksQz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzLGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOnZvaWQgMCl9fSxPPWwoIldlYWtNYXAiLEMsaCksRj1PLnByb3RvdHlwZSxJPXMoRi5zZXQpO2lmKGcpaWYoayl7bj1oLmdldENvbnN0cnVjdG9yKEMsIldlYWtNYXAiLCEwKSxjLmVuYWJsZSgpO3ZhciBUPXMoRi5kZWxldGUpLE09cyhGLmhhcyksRT1zKEYuZ2V0KTtvKEYse2RlbGV0ZTpmdW5jdGlvbihlKXtpZih1KGUpJiYhYihlKSl7dmFyIHQ9ZCh0aGlzKTtyZXR1cm4gdC5mcm96ZW58fCh0LmZyb3plbj1uZXcgbiksVCh0aGlzLGUpfHx0LmZyb3plbi5kZWxldGUoZSl9cmV0dXJuIFQodGhpcyxlKX0saGFzOmZ1bmN0aW9uKGUpe2lmKHUoZSkmJiFiKGUpKXt2YXIgdD1kKHRoaXMpO3JldHVybiB0LmZyb3plbnx8KHQuZnJvemVuPW5ldyBuKSxNKHRoaXMsZSl8fHQuZnJvemVuLmhhcyhlKX1yZXR1cm4gTSh0aGlzLGUpfSxnZXQ6ZnVuY3Rpb24oZSl7aWYodShlKSYmIWIoZSkpe3ZhciB0PWQodGhpcyk7cmV0dXJuIHQuZnJvemVufHwodC5mcm96ZW49bmV3IG4pLE0odGhpcyxlKT9FKHRoaXMsZSk6dC5mcm96ZW4uZ2V0KGUpfXJldHVybiBFKHRoaXMsZSl9LHNldDpmdW5jdGlvbihlLHQpe2lmKHUoZSkmJiFiKGUpKXt2YXIgcj1kKHRoaXMpO3IuZnJvemVufHwoci5mcm96ZW49bmV3IG4pLE0odGhpcyxlKT9JKHRoaXMsZSx0KTpyLmZyb3plbi5zZXQoZSx0KX1lbHNlIEkodGhpcyxlLHQpO3JldHVybiB0aGlzfX0pfWVsc2UgYSYmZigoZnVuY3Rpb24oKXt2YXIgZT12KFtdKTtyZXR1cm4gSShuZXcgTyxlLDEpLCF5KGUpfSkpJiZvKEYse3NldDpmdW5jdGlvbihlLHQpe3ZhciByO3JldHVybiBtKGUpJiYoeShlKT9yPVM6dyhlKSYmKHI9QSkpLEkodGhpcyxlLHQpLHI9PVMmJnYoZSkscj09QSYmeChlKSx0aGlzfX0pfSw0MTI5OihlLHQscik9PntyKDEyMDIpfSwzOTQ4OihlLHQscik9Pnt2YXIgbj1yKDc4NTQpLGE9cig4MzI0KSxpPXIoODUwOSkscz1yKDY5OTIpLG89cig4ODgwKSxjPXIoNTExMiksbD1jKCJpdGVyYXRvciIpLGg9YygidG9TdHJpbmdUYWciKSx1PXMudmFsdWVzLGQ9ZnVuY3Rpb24oZSx0KXtpZihlKXtpZihlW2xdIT09dSl0cnl7byhlLGwsdSl9Y2F0Y2godCl7ZVtsXT11fWlmKGVbaF18fG8oZSxoLHQpLGFbdF0pZm9yKHZhciByIGluIHMpaWYoZVtyXSE9PXNbcl0pdHJ5e28oZSxyLHNbcl0pfWNhdGNoKHQpe2Vbcl09c1tyXX19fTtmb3IodmFyIGYgaW4gYSlkKG5bZl0mJm5bZl0ucHJvdG90eXBlLGYpO2QoaSwiRE9NVG9rZW5MaXN0Iil9LDc3MTQ6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDQwMzgpLGk9cig1MDA1KSxzPXIoNzI5Myksbz1yKDMwKSxjPXIoOTExNCksbD1yKDMwNzApLmYsaD1yKDgwNTIpLHU9cig3MDQ1KSxkPXIoMjU5NyksZj1yKDU3ODcpLGc9cig5NjcwKSxwPXIoNzc2MiksbT1yKDYyNzcpLGI9cigzNjc4KSx5PXIoMTA2MCksdz1yKDk5MDkpLHY9cig5NzgxKSx4PXIoMTkxMyksUz0iRE9NRXhjZXB0aW9uIixBPSJEQVRBX0NMT05FX0VSUiIsaz1pKCJFcnJvciIpLEM9aShTKXx8ZnVuY3Rpb24oKXt0cnl7KG5ldyhpKCJNZXNzYWdlQ2hhbm5lbCIpfHxhKCJ3b3JrZXJfdGhyZWFkcyIpLk1lc3NhZ2VDaGFubmVsKSkucG9ydDEucG9zdE1lc3NhZ2UobmV3IFdlYWtNYXApfWNhdGNoKGUpe2lmKGUubmFtZT09QSYmMjU9PWUuY29kZSlyZXR1cm4gZS5jb25zdHJ1Y3Rvcn19KCksTz1DJiZDLnByb3RvdHlwZSxGPWsucHJvdG90eXBlLEk9dy5zZXQsVD13LmdldHRlckZvcihTKSxNPSJzdGFjayJpbiBrKFMpLEU9ZnVuY3Rpb24oZSl7cmV0dXJuIGQoYixlKSYmYltlXS5tP2JbZV0uYzowfSxQPWZ1bmN0aW9uKCl7Zih0aGlzLFIpO3ZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1tKGU8MT92b2lkIDA6YXJndW1lbnRzWzBdKSxyPW0oZTwyP3ZvaWQgMDphcmd1bWVudHNbMV0sIkVycm9yIiksbj1FKHIpO2lmKEkodGhpcyx7dHlwZTpTLG5hbWU6cixtZXNzYWdlOnQsY29kZTpufSksdnx8KHRoaXMubmFtZT1yLHRoaXMubWVzc2FnZT10LHRoaXMuY29kZT1uKSxNKXt2YXIgYT1rKHQpO2EubmFtZT1TLGwodGhpcywic3RhY2siLGMoMSx5KGEuc3RhY2ssMSkpKX19LFI9UC5wcm90b3R5cGU9byhGKSxOPWZ1bmN0aW9uKGUpe3JldHVybntlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZX19LEQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE4oKGZ1bmN0aW9uKCl7cmV0dXJuIFQodGhpcylbZV19KSl9O3YmJih1KFIsImNvZGUiLEQoImNvZGUiKSksdShSLCJtZXNzYWdlIixEKCJtZXNzYWdlIikpLHUoUiwibmFtZSIsRCgibmFtZSIpKSksbChSLCJjb25zdHJ1Y3RvciIsYygxLFApKTt2YXIgQj1zKChmdW5jdGlvbigpe3JldHVybiEobmV3IEMgaW5zdGFuY2VvZiBrKX0pKSxMPUJ8fHMoKGZ1bmN0aW9uKCl7cmV0dXJuIEYudG9TdHJpbmchPT1wfHwiMjogMSIhPT1TdHJpbmcobmV3IEMoMSwyKSl9KSksXz1CfHxzKChmdW5jdGlvbigpe3JldHVybiAyNSE9PW5ldyBDKDEsIkRhdGFDbG9uZUVycm9yIikuY29kZX0pKSxqPUJ8fDI1IT09Q1tBXXx8MjUhPT1PW0FdLFU9eD9MfHxffHxqOkI7bih7Z2xvYmFsOiEwLGNvbnN0cnVjdG9yOiEwLGZvcmNlZDpVfSx7RE9NRXhjZXB0aW9uOlU/UDpDfSk7dmFyICQ9aShTKSxYPSQucHJvdG90eXBlO2Zvcih2YXIgSCBpbiBMJiYoeHx8Qz09PSQpJiZoKFgsInRvU3RyaW5nIixwKSxfJiZ2JiZDPT09JCYmdShYLCJjb2RlIixOKChmdW5jdGlvbigpe3JldHVybiBFKGcodGhpcykubmFtZSl9KSkpLGIpaWYoZChiLEgpKXt2YXIgcT1iW0hdLHo9cS5zLEc9Yyg2LHEuYyk7ZCgkLHopfHxsKCQseixHKSxkKFgseil8fGwoWCx6LEcpfX0sMjgwMTooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNzg1NCksaT1yKDUwMDUpLHM9cig5MTE0KSxvPXIoMzA3MCkuZixjPXIoMjU5NyksbD1yKDU3ODcpLGg9cig5NTg3KSx1PXIoNjI3NyksZD1yKDM2NzgpLGY9cigxMDYwKSxnPXIoOTc4MSkscD1yKDE5MTMpLG09IkRPTUV4Y2VwdGlvbiIsYj1pKCJFcnJvciIpLHk9aShtKSx3PWZ1bmN0aW9uKCl7bCh0aGlzLHYpO3ZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD11KGU8MT92b2lkIDA6YXJndW1lbnRzWzBdKSxyPXUoZTwyP3ZvaWQgMDphcmd1bWVudHNbMV0sIkVycm9yIiksbj1uZXcgeSh0LHIpLGE9Yih0KTtyZXR1cm4gYS5uYW1lPW0sbyhuLCJzdGFjayIscygxLGYoYS5zdGFjaywxKSkpLGgobix0aGlzLHcpLG59LHY9dy5wcm90b3R5cGU9eS5wcm90b3R5cGUseD0ic3RhY2siaW4gYihtKSxTPSJzdGFjayJpbiBuZXcgeSgxLDIpLEE9eSYmZyYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLG0pLGs9ISghQXx8QS53cml0YWJsZSYmQS5jb25maWd1cmFibGUpLEM9eCYmIWsmJiFTO24oe2dsb2JhbDohMCxjb25zdHJ1Y3RvcjohMCxmb3JjZWQ6cHx8Q30se0RPTUV4Y2VwdGlvbjpDP3c6eX0pO3ZhciBPPWkobSksRj1PLnByb3RvdHlwZTtpZihGLmNvbnN0cnVjdG9yIT09Tylmb3IodmFyIEkgaW4gcHx8byhGLCJjb25zdHJ1Y3RvciIscygxLE8pKSxkKWlmKGMoZCxJKSl7dmFyIFQ9ZFtJXSxNPVQucztjKE8sTSl8fG8oTyxNLHMoNixULmMpKX19LDExNzQ6KGUsdCxyKT0+e3ZhciBuPXIoNTAwNSksYT0iRE9NRXhjZXB0aW9uIjtyKDgwMDMpKG4oYSksYSl9LDE1NTA6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc4NTQpLGk9cig3MDQ1KSxzPXIoOTc4MSksbz1UeXBlRXJyb3IsYz1PYmplY3QuZGVmaW5lUHJvcGVydHksbD1hLnNlbGYhPT1hO3RyeXtpZihzKXt2YXIgaD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsInNlbGYiKTshbCYmaCYmaC5nZXQmJmguZW51bWVyYWJsZXx8aShhLCJzZWxmIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldDpmdW5jdGlvbihlKXtpZih0aGlzIT09YSl0aHJvdyBvKCJJbGxlZ2FsIGludm9jYXRpb24iKTtjKGEsInNlbGYiLHt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9ZWxzZSBuKHtnbG9iYWw6ITAsc2ltcGxlOiEwLGZvcmNlZDpsfSx7c2VsZjphfSl9Y2F0Y2goZSl7fX0sNTU1NjooZSx0LHIpPT57cig2OTkyKTt2YXIgbj1yKDIxMDkpLGE9cig3ODU0KSxpPXIoNjkxNikscz1yKDE3MDIpLG89cig5NzgxKSxjPXIoNTE0MyksbD1yKDgwNTIpLGg9cig3MDQ1KSx1PXIoOTE5MCksZD1yKDgwMDMpLGY9cigzMDYxKSxnPXIoOTkwOSkscD1yKDU3ODcpLG09cig2MTQpLGI9cigyNTk3KSx5PXIoOTk3NCksdz1yKDY0OCksdj1yKDk2NzApLHg9cigxMTEpLFM9cigxMzQwKSxBPXIoMzApLGs9cig5MTE0KSxDPXIoNDEyMSksTz1yKDEyNDYpLEY9cig4MDUzKSxJPXIoNTExMiksVD1yKDQzNjIpLE09SSgiaXRlcmF0b3IiKSxFPSJVUkxTZWFyY2hQYXJhbXMiLFA9RSsiSXRlcmF0b3IiLFI9Zy5zZXQsTj1nLmdldHRlckZvcihFKSxEPWcuZ2V0dGVyRm9yKFApLEI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixMPWZ1bmN0aW9uKGUpe2lmKCFvKXJldHVybiBhW2VdO3ZhciB0PUIoYSxlKTtyZXR1cm4gdCYmdC52YWx1ZX0sXz1MKCJmZXRjaCIpLGo9TCgiUmVxdWVzdCIpLFU9TCgiSGVhZGVycyIpLCQ9aiYmai5wcm90b3R5cGUsWD1VJiZVLnByb3RvdHlwZSxIPWEuUmVnRXhwLHE9YS5UeXBlRXJyb3Isej1hLmRlY29kZVVSSUNvbXBvbmVudCxHPWEuZW5jb2RlVVJJQ29tcG9uZW50LFc9cygiIi5jaGFyQXQpLFY9cyhbXS5qb2luKSxLPXMoW10ucHVzaCksWT1zKCIiLnJlcGxhY2UpLEo9cyhbXS5zaGlmdCksWj1zKFtdLnNwbGljZSksUT1zKCIiLnNwbGl0KSxlZT1zKCIiLnNsaWNlKSx0ZT0vXCsvZyxyZT1BcnJheSg0KSxuZT1mdW5jdGlvbihlKXtyZXR1cm4gcmVbZS0xXXx8KHJlW2UtMV09SCgiKCg/OiVbXFxkYS1mXXsyfSl7IitlKyJ9KSIsImdpIikpfSxhZT1mdW5jdGlvbihlKXt0cnl7cmV0dXJuIHooZSl9Y2F0Y2godCl7cmV0dXJuIGV9fSxpZT1mdW5jdGlvbihlKXt2YXIgdD1ZKGUsdGUsIiAiKSxyPTQ7dHJ5e3JldHVybiB6KHQpfWNhdGNoKGUpe2Zvcig7cjspdD1ZKHQsbmUoci0tKSxhZSk7cmV0dXJuIHR9fSxzZT0vWyEnKCl+XXwlMjAvZyxvZT17IiEiOiIlMjEiLCInIjoiJTI3IiwiKCI6IiUyOCIsIikiOiIlMjkiLCJ+IjoiJTdFIiwiJTIwIjoiKyJ9LGNlPWZ1bmN0aW9uKGUpe3JldHVybiBvZVtlXX0sbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIFkoRyhlKSxzZSxjZSl9LGhlPWYoKGZ1bmN0aW9uKGUsdCl7Uih0aGlzLHt0eXBlOlAsaXRlcmF0b3I6QyhOKGUpLmVudHJpZXMpLGtpbmQ6dH0pfSksIkl0ZXJhdG9yIiwoZnVuY3Rpb24oKXt2YXIgZT1EKHRoaXMpLHQ9ZS5raW5kLHI9ZS5pdGVyYXRvci5uZXh0KCksbj1yLnZhbHVlO3JldHVybiByLmRvbmV8fChyLnZhbHVlPSJrZXlzIj09PXQ/bi5rZXk6InZhbHVlcyI9PT10P24udmFsdWU6W24ua2V5LG4udmFsdWVdKSxyfSksITApLHVlPWZ1bmN0aW9uKGUpe3RoaXMuZW50cmllcz1bXSx0aGlzLnVybD1udWxsLHZvaWQgMCE9PWUmJih4KGUpP3RoaXMucGFyc2VPYmplY3QoZSk6dGhpcy5wYXJzZVF1ZXJ5KCJzdHJpbmciPT10eXBlb2YgZT8iPyI9PT1XKGUsMCk/ZWUoZSwxKTplOlMoZSkpKX07dWUucHJvdG90eXBlPXt0eXBlOkUsYmluZFVSTDpmdW5jdGlvbihlKXt0aGlzLnVybD1lLHRoaXMudXBkYXRlKCl9LHBhcnNlT2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhLHMsbyxjLGw9TyhlKTtpZihsKWZvcihyPSh0PUMoZSxsKSkubmV4dDshKG49aShyLHQpKS5kb25lOyl7aWYocz0oYT1DKHYobi52YWx1ZSkpKS5uZXh0LChvPWkocyxhKSkuZG9uZXx8KGM9aShzLGEpKS5kb25lfHwhaShzLGEpLmRvbmUpdGhyb3cgcSgiRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMiIpO0sodGhpcy5lbnRyaWVzLHtrZXk6UyhvLnZhbHVlKSx2YWx1ZTpTKGMudmFsdWUpfSl9ZWxzZSBmb3IodmFyIGggaW4gZSliKGUsaCkmJksodGhpcy5lbnRyaWVzLHtrZXk6aCx2YWx1ZTpTKGVbaF0pfSl9LHBhcnNlUXVlcnk6ZnVuY3Rpb24oZSl7aWYoZSlmb3IodmFyIHQscixuPVEoZSwiJiIpLGE9MDthPG4ubGVuZ3RoOykodD1uW2ErK10pLmxlbmd0aCYmKHI9USh0LCI9IiksSyh0aGlzLmVudHJpZXMse2tleTppZShKKHIpKSx2YWx1ZTppZShWKHIsIj0iKSl9KSl9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PXRoaXMuZW50cmllcyxyPVtdLG49MDtuPHQubGVuZ3RoOyllPXRbbisrXSxLKHIsbGUoZS5rZXkpKyI9IitsZShlLnZhbHVlKSk7cmV0dXJuIFYociwiJiIpfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLmVudHJpZXMubGVuZ3RoPTAsdGhpcy5wYXJzZVF1ZXJ5KHRoaXMudXJsLnF1ZXJ5KX0sdXBkYXRlVVJMOmZ1bmN0aW9uKCl7dGhpcy51cmwmJnRoaXMudXJsLnVwZGF0ZSgpfX07dmFyIGRlPWZ1bmN0aW9uKCl7cCh0aGlzLGZlKTt2YXIgZT1SKHRoaXMsbmV3IHVlKGFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06dm9pZCAwKSk7b3x8KHRoaXMuc2l6ZT1lLmVudHJpZXMubGVuZ3RoKX0sZmU9ZGUucHJvdG90eXBlO2lmKHUoZmUse2FwcGVuZDpmdW5jdGlvbihlLHQpe3ZhciByPU4odGhpcyk7Rihhcmd1bWVudHMubGVuZ3RoLDIpLEsoci5lbnRyaWVzLHtrZXk6UyhlKSx2YWx1ZTpTKHQpfSksb3x8dGhpcy5sZW5ndGgrKyxyLnVwZGF0ZVVSTCgpfSxkZWxldGU6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU4odGhpcykscj1GKGFyZ3VtZW50cy5sZW5ndGgsMSksbj10LmVudHJpZXMsYT1TKGUpLGk9cjwyP3ZvaWQgMDphcmd1bWVudHNbMV0scz12b2lkIDA9PT1pP2k6UyhpKSxjPTA7YzxuLmxlbmd0aDspe3ZhciBsPW5bY107aWYobC5rZXkhPT1hfHx2b2lkIDAhPT1zJiZsLnZhbHVlIT09cyljKys7ZWxzZSBpZihaKG4sYywxKSx2b2lkIDAhPT1zKWJyZWFrfW98fCh0aGlzLnNpemU9bi5sZW5ndGgpLHQudXBkYXRlVVJMKCl9LGdldDpmdW5jdGlvbihlKXt2YXIgdD1OKHRoaXMpLmVudHJpZXM7Rihhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgcj1TKGUpLG49MDtuPHQubGVuZ3RoO24rKylpZih0W25dLmtleT09PXIpcmV0dXJuIHRbbl0udmFsdWU7cmV0dXJuIG51bGx9LGdldEFsbDpmdW5jdGlvbihlKXt2YXIgdD1OKHRoaXMpLmVudHJpZXM7Rihhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgcj1TKGUpLG49W10sYT0wO2E8dC5sZW5ndGg7YSsrKXRbYV0ua2V5PT09ciYmSyhuLHRbYV0udmFsdWUpO3JldHVybiBufSxoYXM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU4odGhpcykuZW50cmllcyxyPUYoYXJndW1lbnRzLmxlbmd0aCwxKSxuPVMoZSksYT1yPDI/dm9pZCAwOmFyZ3VtZW50c1sxXSxpPXZvaWQgMD09PWE/YTpTKGEpLHM9MDtzPHQubGVuZ3RoOyl7dmFyIG89dFtzKytdO2lmKG8ua2V5PT09biYmKHZvaWQgMD09PWl8fG8udmFsdWU9PT1pKSlyZXR1cm4hMH1yZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIHI9Tih0aGlzKTtGKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBuLGE9ci5lbnRyaWVzLGk9ITEscz1TKGUpLGM9Uyh0KSxsPTA7bDxhLmxlbmd0aDtsKyspKG49YVtsXSkua2V5PT09cyYmKGk/WihhLGwtLSwxKTooaT0hMCxuLnZhbHVlPWMpKTtpfHxLKGEse2tleTpzLHZhbHVlOmN9KSxvfHwodGhpcy5zaXplPWEubGVuZ3RoKSxyLnVwZGF0ZVVSTCgpfSxzb3J0OmZ1bmN0aW9uKCl7dmFyIGU9Tih0aGlzKTtUKGUuZW50cmllcywoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5rZXk+dC5rZXk/MTotMX0pKSxlLnVwZGF0ZVVSTCgpfSxmb3JFYWNoOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyPU4odGhpcykuZW50cmllcyxuPXkoZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCksYT0wO2E8ci5sZW5ndGg7KW4oKHQ9clthKytdKS52YWx1ZSx0LmtleSx0aGlzKX0sa2V5czpmdW5jdGlvbigpe3JldHVybiBuZXcgaGUodGhpcywia2V5cyIpfSx2YWx1ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGhlKHRoaXMsInZhbHVlcyIpfSxlbnRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBoZSh0aGlzLCJlbnRyaWVzIil9fSx7ZW51bWVyYWJsZTohMH0pLGwoZmUsTSxmZS5lbnRyaWVzLHtuYW1lOiJlbnRyaWVzIn0pLGwoZmUsInRvU3RyaW5nIiwoZnVuY3Rpb24oKXtyZXR1cm4gTih0aGlzKS5zZXJpYWxpemUoKX0pLHtlbnVtZXJhYmxlOiEwfSksbyYmaChmZSwic2l6ZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBOKHRoaXMpLmVudHJpZXMubGVuZ3RofSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pLGQoZGUsRSksbih7Z2xvYmFsOiEwLGNvbnN0cnVjdG9yOiEwLGZvcmNlZDohY30se1VSTFNlYXJjaFBhcmFtczpkZX0pLCFjJiZtKFUpKXt2YXIgZ2U9cyhYLmhhcykscGU9cyhYLnNldCksbWU9ZnVuY3Rpb24oZSl7aWYoeChlKSl7dmFyIHQscj1lLmJvZHk7aWYodyhyKT09PUUpcmV0dXJuIHQ9ZS5oZWFkZXJzP25ldyBVKGUuaGVhZGVycyk6bmV3IFUsZ2UodCwiY29udGVudC10eXBlIil8fHBlKHQsImNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04IiksQShlLHtib2R5OmsoMCxTKHIpKSxoZWFkZXJzOmsoMCx0KX0pfXJldHVybiBlfTtpZihtKF8pJiZuKHtnbG9iYWw6ITAsZW51bWVyYWJsZTohMCxkb250Q2FsbEdldFNldDohMCxmb3JjZWQ6ITB9LHtmZXRjaDpmdW5jdGlvbihlKXtyZXR1cm4gXyhlLGFyZ3VtZW50cy5sZW5ndGg+MT9tZShhcmd1bWVudHNbMV0pOnt9KX19KSxtKGopKXt2YXIgYmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHAodGhpcywkKSxuZXcgaihlLGFyZ3VtZW50cy5sZW5ndGg+MT9tZShhcmd1bWVudHNbMV0pOnt9KX07JC5jb25zdHJ1Y3Rvcj1iZSxiZS5wcm90b3R5cGU9JCxuKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsZG9udENhbGxHZXRTZXQ6ITAsZm9yY2VkOiEwfSx7UmVxdWVzdDpiZX0pfX1lLmV4cG9ydHM9e1VSTFNlYXJjaFBhcmFtczpkZSxnZXRTdGF0ZTpOfX0sNjIyOTooZSx0LHIpPT57dmFyIG49cig4MDUyKSxhPXIoMTcwMiksaT1yKDEzNDApLHM9cig4MDUzKSxvPVVSTFNlYXJjaFBhcmFtcyxjPW8ucHJvdG90eXBlLGw9YShjLmFwcGVuZCksaD1hKGMuZGVsZXRlKSx1PWEoYy5mb3JFYWNoKSxkPWEoW10ucHVzaCksZj1uZXcgbygiYT0xJmE9MiZiPTMiKTtmLmRlbGV0ZSgiYSIsMSksZi5kZWxldGUoImIiLHZvaWQgMCksZisiIiE9ImE9MiImJm4oYywiZGVsZXRlIiwoZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPXQ8Mj92b2lkIDA6YXJndW1lbnRzWzFdO2lmKHQmJnZvaWQgMD09PXIpcmV0dXJuIGgodGhpcyxlKTt2YXIgbj1bXTt1KHRoaXMsKGZ1bmN0aW9uKGUsdCl7ZChuLHtrZXk6dCx2YWx1ZTplfSl9KSkscyh0LDEpO2Zvcih2YXIgYSxvPWkoZSksYz1pKHIpLGY9MCxnPTAscD0hMSxtPW4ubGVuZ3RoO2Y8bTspYT1uW2YrK10scHx8YS5rZXk9PT1vPyhwPSEwLGgodGhpcyxhLmtleSkpOmcrKztmb3IoO2c8bTspKGE9bltnKytdKS5rZXk9PT1vJiZhLnZhbHVlPT09Y3x8bCh0aGlzLGEua2V5LGEudmFsdWUpfSkse2VudW1lcmFibGU6ITAsdW5zYWZlOiEwfSl9LDczMzA6KGUsdCxyKT0+e3ZhciBuPXIoODA1MiksYT1yKDE3MDIpLGk9cigxMzQwKSxzPXIoODA1Myksbz1VUkxTZWFyY2hQYXJhbXMsYz1vLnByb3RvdHlwZSxsPWEoYy5nZXRBbGwpLGg9YShjLmhhcyksdT1uZXcgbygiYT0xIik7IXUuaGFzKCJhIiwyKSYmdS5oYXMoImEiLHZvaWQgMCl8fG4oYywiaGFzIiwoZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPXQ8Mj92b2lkIDA6YXJndW1lbnRzWzFdO2lmKHQmJnZvaWQgMD09PXIpcmV0dXJuIGgodGhpcyxlKTt2YXIgbj1sKHRoaXMsZSk7cyh0LDEpO2Zvcih2YXIgYT1pKHIpLG89MDtvPG4ubGVuZ3RoOylpZihuW28rK109PT1hKXJldHVybiEwO3JldHVybiExfSkse2VudW1lcmFibGU6ITAsdW5zYWZlOiEwfSl9LDE2Mzc6KGUsdCxyKT0+e3IoNTU1Nil9LDIwNjI6KGUsdCxyKT0+e3ZhciBuPXIoOTc4MSksYT1yKDE3MDIpLGk9cig3MDQ1KSxzPVVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUsbz1hKHMuZm9yRWFjaCk7biYmISgic2l6ZSJpbiBzKSYmaShzLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9MDtyZXR1cm4gbyh0aGlzLChmdW5jdGlvbigpe2UrK30pKSxlfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pfSw4Nzg5OihlLHQscik9PntyKDg3ODMpO3ZhciBuLGE9cigyMTA5KSxpPXIoOTc4MSkscz1yKDUxNDMpLG89cig3ODU0KSxjPXIoOTk3NCksbD1yKDE3MDIpLGg9cig4MDUyKSx1PXIoNzA0NSksZD1yKDU3ODcpLGY9cigyNTk3KSxnPXIoMTU3NCkscD1yKDg0NTcpLG09cigxNTg5KSxiPXIoODcxMCkuY29kZUF0LHk9cigzMTk3KSx3PXIoMTM0MCksdj1yKDgwMDMpLHg9cig4MDUzKSxTPXIoNTU1NiksQT1yKDk5MDkpLGs9QS5zZXQsQz1BLmdldHRlckZvcigiVVJMIiksTz1TLlVSTFNlYXJjaFBhcmFtcyxGPVMuZ2V0U3RhdGUsST1vLlVSTCxUPW8uVHlwZUVycm9yLE09by5wYXJzZUludCxFPU1hdGguZmxvb3IsUD1NYXRoLnBvdyxSPWwoIiIuY2hhckF0KSxOPWwoLy4vLmV4ZWMpLEQ9bChbXS5qb2luKSxCPWwoMS4udG9TdHJpbmcpLEw9bChbXS5wb3ApLF89bChbXS5wdXNoKSxqPWwoIiIucmVwbGFjZSksVT1sKFtdLnNoaWZ0KSwkPWwoIiIuc3BsaXQpLFg9bCgiIi5zbGljZSksSD1sKCIiLnRvTG93ZXJDYXNlKSxxPWwoW10udW5zaGlmdCksej0iSW52YWxpZCBzY2hlbWUiLEc9IkludmFsaWQgaG9zdCIsVz0iSW52YWxpZCBwb3J0IixWPS9bYS16XS9pLEs9L1tcZCstLmEtel0vaSxZPS9cZC8sSj0vXjB4L2ksWj0vXlswLTddKyQvLFE9L15cZCskLyxlZT0vXltcZGEtZl0rJC9pLHRlPS9bXDBcdFxuXHIgIyUvOjw+P0BbXFxcXV58XS8scmU9L1tcMFx0XG5cciAjLzo8Pj9AW1xcXF1efF0vLG5lPS9eW1x1MDAwMC1cdTAwMjBdKy8sYWU9LyhefFteXHUwMDAwLVx1MDAyMF0pW1x1MDAwMC1cdTAwMjBdKyQvLGllPS9bXHRcblxyXS9nLHNlPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhO2lmKCJudW1iZXIiPT10eXBlb2YgZSl7Zm9yKHQ9W10scj0wO3I8NDtyKyspcSh0LGUlMjU2KSxlPUUoZS8yNTYpO3JldHVybiBEKHQsIi4iKX1pZigib2JqZWN0Ij09dHlwZW9mIGUpe2Zvcih0PSIiLG49ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW51bGwscj0xLG49bnVsbCxhPTAsaT0wO2k8ODtpKyspMCE9PWVbaV0/KGE+ciYmKHQ9bixyPWEpLG49bnVsbCxhPTApOihudWxsPT09biYmKG49aSksKythKTtyZXR1cm4gYT5yJiYodD1uLHI9YSksdH0oZSkscj0wO3I8ODtyKyspYSYmMD09PWVbcl18fChhJiYoYT0hMSksbj09PXI/KHQrPXI/IjoiOiI6OiIsYT0hMCk6KHQrPUIoZVtyXSwxNikscjw3JiYodCs9IjoiKSkpO3JldHVybiJbIit0KyJdIn1yZXR1cm4gZX0sb2U9e30sY2U9Zyh7fSxvZSx7IiAiOjEsJyInOjEsIjwiOjEsIj4iOjEsImAiOjF9KSxsZT1nKHt9LGNlLHsiIyI6MSwiPyI6MSwieyI6MSwifSI6MX0pLGhlPWcoe30sbGUseyIvIjoxLCI6IjoxLCI7IjoxLCI9IjoxLCJAIjoxLCJbIjoxLCJcXCI6MSwiXSI6MSwiXiI6MSwifCI6MX0pLHVlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9YihlLDApO3JldHVybiByPjMyJiZyPDEyNyYmIWYodCxlKT9lOmVuY29kZVVSSUNvbXBvbmVudChlKX0sZGU9e2Z0cDoyMSxmaWxlOm51bGwsaHR0cDo4MCxodHRwczo0NDMsd3M6ODAsd3NzOjQ0M30sZmU9ZnVuY3Rpb24oZSx0KXt2YXIgcjtyZXR1cm4gMj09ZS5sZW5ndGgmJk4oVixSKGUsMCkpJiYoIjoiPT0ocj1SKGUsMSkpfHwhdCYmInwiPT1yKX0sZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGUubGVuZ3RoPjEmJmZlKFgoZSwwLDIpKSYmKDI9PWUubGVuZ3RofHwiLyI9PT0odD1SKGUsMikpfHwiXFwiPT09dHx8Ij8iPT09dHx8IiMiPT09dCl9LHBlPWZ1bmN0aW9uKGUpe3JldHVybiIuIj09PWV8fCIlMmUiPT09SChlKX0sbWU9e30sYmU9e30seWU9e30sd2U9e30sdmU9e30seGU9e30sU2U9e30sQWU9e30sa2U9e30sQ2U9e30sT2U9e30sRmU9e30sSWU9e30sVGU9e30sTWU9e30sRWU9e30sUGU9e30sUmU9e30sTmU9e30sRGU9e30sQmU9e30sTGU9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGEsaSxzPXcoZSk7aWYodCl7aWYoYT10aGlzLnBhcnNlKHMpKXRocm93IFQoYSk7dGhpcy5zZWFyY2hQYXJhbXM9bnVsbH1lbHNle2lmKHZvaWQgMCE9PXImJihuPW5ldyBMZShyLCEwKSksYT10aGlzLnBhcnNlKHMsbnVsbCxuKSl0aHJvdyBUKGEpOyhpPUYobmV3IE8pKS5iaW5kVVJMKHRoaXMpLHRoaXMuc2VhcmNoUGFyYW1zPWl9fTtMZS5wcm90b3R5cGU9e3R5cGU6IlVSTCIscGFyc2U6ZnVuY3Rpb24oZSx0LHIpe3ZhciBhLGkscyxvLGMsbD10aGlzLGg9dHx8bWUsdT0wLGQ9IiIsZz0hMSxiPSExLHk9ITE7Zm9yKGU9dyhlKSx0fHwobC5zY2hlbWU9IiIsbC51c2VybmFtZT0iIixsLnBhc3N3b3JkPSIiLGwuaG9zdD1udWxsLGwucG9ydD1udWxsLGwucGF0aD1bXSxsLnF1ZXJ5PW51bGwsbC5mcmFnbWVudD1udWxsLGwuY2Fubm90QmVBQmFzZVVSTD0hMSxlPWooZSxuZSwiIiksZT1qKGUsYWUsIiQxIikpLGU9aihlLGllLCIiKSxhPXAoZSk7dTw9YS5sZW5ndGg7KXtzd2l0Y2goaT1hW3VdLGgpe2Nhc2UgbWU6aWYoIWl8fCFOKFYsaSkpe2lmKHQpcmV0dXJuIHo7aD15ZTtjb250aW51ZX1kKz1IKGkpLGg9YmU7YnJlYWs7Y2FzZSBiZTppZihpJiYoTihLLGkpfHwiKyI9PWl8fCItIj09aXx8Ii4iPT1pKSlkKz1IKGkpO2Vsc2V7aWYoIjoiIT1pKXtpZih0KXJldHVybiB6O2Q9IiIsaD15ZSx1PTA7Y29udGludWV9aWYodCYmKGwuaXNTcGVjaWFsKCkhPWYoZGUsZCl8fCJmaWxlIj09ZCYmKGwuaW5jbHVkZXNDcmVkZW50aWFscygpfHxudWxsIT09bC5wb3J0KXx8ImZpbGUiPT1sLnNjaGVtZSYmIWwuaG9zdCkpcmV0dXJuO2lmKGwuc2NoZW1lPWQsdClyZXR1cm4gdm9pZChsLmlzU3BlY2lhbCgpJiZkZVtsLnNjaGVtZV09PWwucG9ydCYmKGwucG9ydD1udWxsKSk7ZD0iIiwiZmlsZSI9PWwuc2NoZW1lP2g9VGU6bC5pc1NwZWNpYWwoKSYmciYmci5zY2hlbWU9PWwuc2NoZW1lP2g9d2U6bC5pc1NwZWNpYWwoKT9oPUFlOiIvIj09YVt1KzFdPyhoPXZlLHUrKyk6KGwuY2Fubm90QmVBQmFzZVVSTD0hMCxfKGwucGF0aCwiIiksaD1OZSl9YnJlYWs7Y2FzZSB5ZTppZighcnx8ci5jYW5ub3RCZUFCYXNlVVJMJiYiIyIhPWkpcmV0dXJuIHo7aWYoci5jYW5ub3RCZUFCYXNlVVJMJiYiIyI9PWkpe2wuc2NoZW1lPXIuc2NoZW1lLGwucGF0aD1tKHIucGF0aCksbC5xdWVyeT1yLnF1ZXJ5LGwuZnJhZ21lbnQ9IiIsbC5jYW5ub3RCZUFCYXNlVVJMPSEwLGg9QmU7YnJlYWt9aD0iZmlsZSI9PXIuc2NoZW1lP1RlOnhlO2NvbnRpbnVlO2Nhc2Ugd2U6aWYoIi8iIT1pfHwiLyIhPWFbdSsxXSl7aD14ZTtjb250aW51ZX1oPWtlLHUrKzticmVhaztjYXNlIHZlOmlmKCIvIj09aSl7aD1DZTticmVha31oPVJlO2NvbnRpbnVlO2Nhc2UgeGU6aWYobC5zY2hlbWU9ci5zY2hlbWUsaT09bilsLnVzZXJuYW1lPXIudXNlcm5hbWUsbC5wYXNzd29yZD1yLnBhc3N3b3JkLGwuaG9zdD1yLmhvc3QsbC5wb3J0PXIucG9ydCxsLnBhdGg9bShyLnBhdGgpLGwucXVlcnk9ci5xdWVyeTtlbHNlIGlmKCIvIj09aXx8IlxcIj09aSYmbC5pc1NwZWNpYWwoKSloPVNlO2Vsc2UgaWYoIj8iPT1pKWwudXNlcm5hbWU9ci51c2VybmFtZSxsLnBhc3N3b3JkPXIucGFzc3dvcmQsbC5ob3N0PXIuaG9zdCxsLnBvcnQ9ci5wb3J0LGwucGF0aD1tKHIucGF0aCksbC5xdWVyeT0iIixoPURlO2Vsc2V7aWYoIiMiIT1pKXtsLnVzZXJuYW1lPXIudXNlcm5hbWUsbC5wYXNzd29yZD1yLnBhc3N3b3JkLGwuaG9zdD1yLmhvc3QsbC5wb3J0PXIucG9ydCxsLnBhdGg9bShyLnBhdGgpLGwucGF0aC5sZW5ndGgtLSxoPVJlO2NvbnRpbnVlfWwudXNlcm5hbWU9ci51c2VybmFtZSxsLnBhc3N3b3JkPXIucGFzc3dvcmQsbC5ob3N0PXIuaG9zdCxsLnBvcnQ9ci5wb3J0LGwucGF0aD1tKHIucGF0aCksbC5xdWVyeT1yLnF1ZXJ5LGwuZnJhZ21lbnQ9IiIsaD1CZX1icmVhaztjYXNlIFNlOmlmKCFsLmlzU3BlY2lhbCgpfHwiLyIhPWkmJiJcXCIhPWkpe2lmKCIvIiE9aSl7bC51c2VybmFtZT1yLnVzZXJuYW1lLGwucGFzc3dvcmQ9ci5wYXNzd29yZCxsLmhvc3Q9ci5ob3N0LGwucG9ydD1yLnBvcnQsaD1SZTtjb250aW51ZX1oPUNlfWVsc2UgaD1rZTticmVhaztjYXNlIEFlOmlmKGg9a2UsIi8iIT1pfHwiLyIhPVIoZCx1KzEpKWNvbnRpbnVlO3UrKzticmVhaztjYXNlIGtlOmlmKCIvIiE9aSYmIlxcIiE9aSl7aD1DZTtjb250aW51ZX1icmVhaztjYXNlIENlOmlmKCJAIj09aSl7ZyYmKGQ9IiU0MCIrZCksZz0hMCxzPXAoZCk7Zm9yKHZhciB2PTA7djxzLmxlbmd0aDt2Kyspe3ZhciB4PXNbdl07aWYoIjoiIT14fHx5KXt2YXIgUz11ZSh4LGhlKTt5P2wucGFzc3dvcmQrPVM6bC51c2VybmFtZSs9U31lbHNlIHk9ITB9ZD0iIn1lbHNlIGlmKGk9PW58fCIvIj09aXx8Ij8iPT1pfHwiIyI9PWl8fCJcXCI9PWkmJmwuaXNTcGVjaWFsKCkpe2lmKGcmJiIiPT1kKXJldHVybiJJbnZhbGlkIGF1dGhvcml0eSI7dS09cChkKS5sZW5ndGgrMSxkPSIiLGg9T2V9ZWxzZSBkKz1pO2JyZWFrO2Nhc2UgT2U6Y2FzZSBGZTppZih0JiYiZmlsZSI9PWwuc2NoZW1lKXtoPUVlO2NvbnRpbnVlfWlmKCI6IiE9aXx8Yil7aWYoaT09bnx8Ii8iPT1pfHwiPyI9PWl8fCIjIj09aXx8IlxcIj09aSYmbC5pc1NwZWNpYWwoKSl7aWYobC5pc1NwZWNpYWwoKSYmIiI9PWQpcmV0dXJuIEc7aWYodCYmIiI9PWQmJihsLmluY2x1ZGVzQ3JlZGVudGlhbHMoKXx8bnVsbCE9PWwucG9ydCkpcmV0dXJuO2lmKG89bC5wYXJzZUhvc3QoZCkpcmV0dXJuIG87aWYoZD0iIixoPVBlLHQpcmV0dXJuO2NvbnRpbnVlfSJbIj09aT9iPSEwOiJdIj09aSYmKGI9ITEpLGQrPWl9ZWxzZXtpZigiIj09ZClyZXR1cm4gRztpZihvPWwucGFyc2VIb3N0KGQpKXJldHVybiBvO2lmKGQ9IiIsaD1JZSx0PT1GZSlyZXR1cm59YnJlYWs7Y2FzZSBJZTppZighTihZLGkpKXtpZihpPT1ufHwiLyI9PWl8fCI/Ij09aXx8IiMiPT1pfHwiXFwiPT1pJiZsLmlzU3BlY2lhbCgpfHx0KXtpZigiIiE9ZCl7dmFyIEE9TShkLDEwKTtpZihBPjY1NTM1KXJldHVybiBXO2wucG9ydD1sLmlzU3BlY2lhbCgpJiZBPT09ZGVbbC5zY2hlbWVdP251bGw6QSxkPSIifWlmKHQpcmV0dXJuO2g9UGU7Y29udGludWV9cmV0dXJuIFd9ZCs9aTticmVhaztjYXNlIFRlOmlmKGwuc2NoZW1lPSJmaWxlIiwiLyI9PWl8fCJcXCI9PWkpaD1NZTtlbHNle2lmKCFyfHwiZmlsZSIhPXIuc2NoZW1lKXtoPVJlO2NvbnRpbnVlfWlmKGk9PW4pbC5ob3N0PXIuaG9zdCxsLnBhdGg9bShyLnBhdGgpLGwucXVlcnk9ci5xdWVyeTtlbHNlIGlmKCI/Ij09aSlsLmhvc3Q9ci5ob3N0LGwucGF0aD1tKHIucGF0aCksbC5xdWVyeT0iIixoPURlO2Vsc2V7aWYoIiMiIT1pKXtnZShEKG0oYSx1KSwiIikpfHwobC5ob3N0PXIuaG9zdCxsLnBhdGg9bShyLnBhdGgpLGwuc2hvcnRlblBhdGgoKSksaD1SZTtjb250aW51ZX1sLmhvc3Q9ci5ob3N0LGwucGF0aD1tKHIucGF0aCksbC5xdWVyeT1yLnF1ZXJ5LGwuZnJhZ21lbnQ9IiIsaD1CZX19YnJlYWs7Y2FzZSBNZTppZigiLyI9PWl8fCJcXCI9PWkpe2g9RWU7YnJlYWt9ciYmImZpbGUiPT1yLnNjaGVtZSYmIWdlKEQobShhLHUpLCIiKSkmJihmZShyLnBhdGhbMF0sITApP18obC5wYXRoLHIucGF0aFswXSk6bC5ob3N0PXIuaG9zdCksaD1SZTtjb250aW51ZTtjYXNlIEVlOmlmKGk9PW58fCIvIj09aXx8IlxcIj09aXx8Ij8iPT1pfHwiIyI9PWkpe2lmKCF0JiZmZShkKSloPVJlO2Vsc2UgaWYoIiI9PWQpe2lmKGwuaG9zdD0iIix0KXJldHVybjtoPVBlfWVsc2V7aWYobz1sLnBhcnNlSG9zdChkKSlyZXR1cm4gbztpZigibG9jYWxob3N0Ij09bC5ob3N0JiYobC5ob3N0PSIiKSx0KXJldHVybjtkPSIiLGg9UGV9Y29udGludWV9ZCs9aTticmVhaztjYXNlIFBlOmlmKGwuaXNTcGVjaWFsKCkpe2lmKGg9UmUsIi8iIT1pJiYiXFwiIT1pKWNvbnRpbnVlfWVsc2UgaWYodHx8Ij8iIT1pKWlmKHR8fCIjIiE9aSl7aWYoaSE9biYmKGg9UmUsIi8iIT1pKSljb250aW51ZX1lbHNlIGwuZnJhZ21lbnQ9IiIsaD1CZTtlbHNlIGwucXVlcnk9IiIsaD1EZTticmVhaztjYXNlIFJlOmlmKGk9PW58fCIvIj09aXx8IlxcIj09aSYmbC5pc1NwZWNpYWwoKXx8IXQmJigiPyI9PWl8fCIjIj09aSkpe2lmKCIuLiI9PT0oYz1IKGM9ZCkpfHwiJTJlLiI9PT1jfHwiLiUyZSI9PT1jfHwiJTJlJTJlIj09PWM/KGwuc2hvcnRlblBhdGgoKSwiLyI9PWl8fCJcXCI9PWkmJmwuaXNTcGVjaWFsKCl8fF8obC5wYXRoLCIiKSk6cGUoZCk/Ii8iPT1pfHwiXFwiPT1pJiZsLmlzU3BlY2lhbCgpfHxfKGwucGF0aCwiIik6KCJmaWxlIj09bC5zY2hlbWUmJiFsLnBhdGgubGVuZ3RoJiZmZShkKSYmKGwuaG9zdCYmKGwuaG9zdD0iIiksZD1SKGQsMCkrIjoiKSxfKGwucGF0aCxkKSksZD0iIiwiZmlsZSI9PWwuc2NoZW1lJiYoaT09bnx8Ij8iPT1pfHwiIyI9PWkpKWZvcig7bC5wYXRoLmxlbmd0aD4xJiYiIj09PWwucGF0aFswXTspVShsLnBhdGgpOyI/Ij09aT8obC5xdWVyeT0iIixoPURlKToiIyI9PWkmJihsLmZyYWdtZW50PSIiLGg9QmUpfWVsc2UgZCs9dWUoaSxsZSk7YnJlYWs7Y2FzZSBOZToiPyI9PWk/KGwucXVlcnk9IiIsaD1EZSk6IiMiPT1pPyhsLmZyYWdtZW50PSIiLGg9QmUpOmkhPW4mJihsLnBhdGhbMF0rPXVlKGksb2UpKTticmVhaztjYXNlIERlOnR8fCIjIiE9aT9pIT1uJiYoIiciPT1pJiZsLmlzU3BlY2lhbCgpP2wucXVlcnkrPSIlMjciOmwucXVlcnkrPSIjIj09aT8iJTIzIjp1ZShpLG9lKSk6KGwuZnJhZ21lbnQ9IiIsaD1CZSk7YnJlYWs7Y2FzZSBCZTppIT1uJiYobC5mcmFnbWVudCs9dWUoaSxjZSkpfXUrK319LHBhcnNlSG9zdDpmdW5jdGlvbihlKXt2YXIgdCxyLG47aWYoIlsiPT1SKGUsMCkpe2lmKCJdIiE9UihlLGUubGVuZ3RoLTEpKXJldHVybiBHO2lmKHQ9ZnVuY3Rpb24oZSl7dmFyIHQscixuLGEsaSxzLG8sYz1bMCwwLDAsMCwwLDAsMCwwXSxsPTAsaD1udWxsLHU9MCxkPWZ1bmN0aW9uKCl7cmV0dXJuIFIoZSx1KX07aWYoIjoiPT1kKCkpe2lmKCI6IiE9UihlLDEpKXJldHVybjt1Kz0yLGg9KytsfWZvcig7ZCgpOyl7aWYoOD09bClyZXR1cm47aWYoIjoiIT1kKCkpe2Zvcih0PXI9MDtyPDQmJk4oZWUsZCgpKTspdD0xNip0K00oZCgpLDE2KSx1KysscisrO2lmKCIuIj09ZCgpKXtpZigwPT1yKXJldHVybjtpZih1LT1yLGw+NilyZXR1cm47Zm9yKG49MDtkKCk7KXtpZihhPW51bGwsbj4wKXtpZighKCIuIj09ZCgpJiZuPDQpKXJldHVybjt1Kyt9aWYoIU4oWSxkKCkpKXJldHVybjtmb3IoO04oWSxkKCkpOyl7aWYoaT1NKGQoKSwxMCksbnVsbD09PWEpYT1pO2Vsc2V7aWYoMD09YSlyZXR1cm47YT0xMCphK2l9aWYoYT4yNTUpcmV0dXJuO3UrK31jW2xdPTI1NipjW2xdK2EsMiE9KytuJiY0IT1ufHxsKyt9aWYoNCE9bilyZXR1cm47YnJlYWt9aWYoIjoiPT1kKCkpe2lmKHUrKywhZCgpKXJldHVybn1lbHNlIGlmKGQoKSlyZXR1cm47Y1tsKytdPXR9ZWxzZXtpZihudWxsIT09aClyZXR1cm47dSsrLGg9KytsfX1pZihudWxsIT09aClmb3Iocz1sLWgsbD03OzAhPWwmJnM+MDspbz1jW2xdLGNbbC0tXT1jW2grcy0xXSxjW2grLS1zXT1vO2Vsc2UgaWYoOCE9bClyZXR1cm47cmV0dXJuIGN9KFgoZSwxLC0xKSksIXQpcmV0dXJuIEc7dGhpcy5ob3N0PXR9ZWxzZSBpZih0aGlzLmlzU3BlY2lhbCgpKXtpZihlPXkoZSksTih0ZSxlKSlyZXR1cm4gRztpZih0PWZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhLGkscyxvLGM9JChlLCIuIik7aWYoYy5sZW5ndGgmJiIiPT1jW2MubGVuZ3RoLTFdJiZjLmxlbmd0aC0tLCh0PWMubGVuZ3RoKT40KXJldHVybiBlO2ZvcihyPVtdLG49MDtuPHQ7bisrKXtpZigiIj09KGE9Y1tuXSkpcmV0dXJuIGU7aWYoaT0xMCxhLmxlbmd0aD4xJiYiMCI9PVIoYSwwKSYmKGk9TihKLGEpPzE2OjgsYT1YKGEsOD09aT8xOjIpKSwiIj09PWEpcz0wO2Vsc2V7aWYoIU4oMTA9PWk/UTo4PT1pP1o6ZWUsYSkpcmV0dXJuIGU7cz1NKGEsaSl9XyhyLHMpfWZvcihuPTA7bjx0O24rKylpZihzPXJbbl0sbj09dC0xKXtpZihzPj1QKDI1Niw1LXQpKXJldHVybiBudWxsfWVsc2UgaWYocz4yNTUpcmV0dXJuIG51bGw7Zm9yKG89TChyKSxuPTA7bjxyLmxlbmd0aDtuKyspbys9cltuXSpQKDI1NiwzLW4pO3JldHVybiBvfShlKSxudWxsPT09dClyZXR1cm4gRzt0aGlzLmhvc3Q9dH1lbHNle2lmKE4ocmUsZSkpcmV0dXJuIEc7Zm9yKHQ9IiIscj1wKGUpLG49MDtuPHIubGVuZ3RoO24rKyl0Kz11ZShyW25dLG9lKTt0aGlzLmhvc3Q9dH19LGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydDpmdW5jdGlvbigpe3JldHVybiF0aGlzLmhvc3R8fHRoaXMuY2Fubm90QmVBQmFzZVVSTHx8ImZpbGUiPT10aGlzLnNjaGVtZX0saW5jbHVkZXNDcmVkZW50aWFsczpmdW5jdGlvbigpe3JldHVybiIiIT10aGlzLnVzZXJuYW1lfHwiIiE9dGhpcy5wYXNzd29yZH0saXNTcGVjaWFsOmZ1bmN0aW9uKCl7cmV0dXJuIGYoZGUsdGhpcy5zY2hlbWUpfSxzaG9ydGVuUGF0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucGF0aCx0PWUubGVuZ3RoOyF0fHwiZmlsZSI9PXRoaXMuc2NoZW1lJiYxPT10JiZmZShlWzBdLCEwKXx8ZS5sZW5ndGgtLX0sc2VyaWFsaXplOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuc2NoZW1lLHI9ZS51c2VybmFtZSxuPWUucGFzc3dvcmQsYT1lLmhvc3QsaT1lLnBvcnQscz1lLnBhdGgsbz1lLnF1ZXJ5LGM9ZS5mcmFnbWVudCxsPXQrIjoiO3JldHVybiBudWxsIT09YT8obCs9Ii8vIixlLmluY2x1ZGVzQ3JlZGVudGlhbHMoKSYmKGwrPXIrKG4/IjoiK246IiIpKyJAIiksbCs9c2UoYSksbnVsbCE9PWkmJihsKz0iOiIraSkpOiJmaWxlIj09dCYmKGwrPSIvLyIpLGwrPWUuY2Fubm90QmVBQmFzZVVSTD9zWzBdOnMubGVuZ3RoPyIvIitEKHMsIi8iKToiIixudWxsIT09byYmKGwrPSI/IitvKSxudWxsIT09YyYmKGwrPSIjIitjKSxsfSxzZXRIcmVmOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyc2UoZSk7aWYodCl0aHJvdyBUKHQpO3RoaXMuc2VhcmNoUGFyYW1zLnVwZGF0ZSgpfSxnZXRPcmlnaW46ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNjaGVtZSx0PXRoaXMucG9ydDtpZigiYmxvYiI9PWUpdHJ5e3JldHVybiBuZXcgX2UoZS5wYXRoWzBdKS5vcmlnaW59Y2F0Y2goZSl7cmV0dXJuIm51bGwifXJldHVybiJmaWxlIiE9ZSYmdGhpcy5pc1NwZWNpYWwoKT9lKyI6Ly8iK3NlKHRoaXMuaG9zdCkrKG51bGwhPT10PyI6Iit0OiIiKToibnVsbCJ9LGdldFByb3RvY29sOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2NoZW1lKyI6In0sc2V0UHJvdG9jb2w6ZnVuY3Rpb24oZSl7dGhpcy5wYXJzZSh3KGUpKyI6IixtZSl9LGdldFVzZXJuYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXNlcm5hbWV9LHNldFVzZXJuYW1lOmZ1bmN0aW9uKGUpe3ZhciB0PXAodyhlKSk7aWYoIXRoaXMuY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KCkpe3RoaXMudXNlcm5hbWU9IiI7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspdGhpcy51c2VybmFtZSs9dWUodFtyXSxoZSl9fSxnZXRQYXNzd29yZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhc3N3b3JkfSxzZXRQYXNzd29yZDpmdW5jdGlvbihlKXt2YXIgdD1wKHcoZSkpO2lmKCF0aGlzLmNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCgpKXt0aGlzLnBhc3N3b3JkPSIiO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXRoaXMucGFzc3dvcmQrPXVlKHRbcl0saGUpfX0sZ2V0SG9zdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG9zdCx0PXRoaXMucG9ydDtyZXR1cm4gbnVsbD09PWU/IiI6bnVsbD09PXQ/c2UoZSk6c2UoZSkrIjoiK3R9LHNldEhvc3Q6ZnVuY3Rpb24oZSl7dGhpcy5jYW5ub3RCZUFCYXNlVVJMfHx0aGlzLnBhcnNlKGUsT2UpfSxnZXRIb3N0bmFtZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG9zdDtyZXR1cm4gbnVsbD09PWU/IiI6c2UoZSl9LHNldEhvc3RuYW1lOmZ1bmN0aW9uKGUpe3RoaXMuY2Fubm90QmVBQmFzZVVSTHx8dGhpcy5wYXJzZShlLEZlKX0sZ2V0UG9ydDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucG9ydDtyZXR1cm4gbnVsbD09PWU/IiI6dyhlKX0sc2V0UG9ydDpmdW5jdGlvbihlKXt0aGlzLmNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCgpfHwoIiI9PShlPXcoZSkpP3RoaXMucG9ydD1udWxsOnRoaXMucGFyc2UoZSxJZSkpfSxnZXRQYXRobmFtZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucGF0aDtyZXR1cm4gdGhpcy5jYW5ub3RCZUFCYXNlVVJMP2VbMF06ZS5sZW5ndGg/Ii8iK0QoZSwiLyIpOiIifSxzZXRQYXRobmFtZTpmdW5jdGlvbihlKXt0aGlzLmNhbm5vdEJlQUJhc2VVUkx8fCh0aGlzLnBhdGg9W10sdGhpcy5wYXJzZShlLFBlKSl9LGdldFNlYXJjaDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucXVlcnk7cmV0dXJuIGU/Ij8iK2U6IiJ9LHNldFNlYXJjaDpmdW5jdGlvbihlKXsiIj09KGU9dyhlKSk/dGhpcy5xdWVyeT1udWxsOigiPyI9PVIoZSwwKSYmKGU9WChlLDEpKSx0aGlzLnF1ZXJ5PSIiLHRoaXMucGFyc2UoZSxEZSkpLHRoaXMuc2VhcmNoUGFyYW1zLnVwZGF0ZSgpfSxnZXRTZWFyY2hQYXJhbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWFyY2hQYXJhbXMuZmFjYWRlfSxnZXRIYXNoOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5mcmFnbWVudDtyZXR1cm4gZT8iIyIrZToiIn0sc2V0SGFzaDpmdW5jdGlvbihlKXsiIiE9KGU9dyhlKSk/KCIjIj09UihlLDApJiYoZT1YKGUsMSkpLHRoaXMuZnJhZ21lbnQ9IiIsdGhpcy5wYXJzZShlLEJlKSk6dGhpcy5mcmFnbWVudD1udWxsfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLnF1ZXJ5PXRoaXMuc2VhcmNoUGFyYW1zLnNlcmlhbGl6ZSgpfHxudWxsfX07dmFyIF9lPWZ1bmN0aW9uKGUpe3ZhciB0PWQodGhpcyxqZSkscj14KGFyZ3VtZW50cy5sZW5ndGgsMSk+MT9hcmd1bWVudHNbMV06dm9pZCAwLG49ayh0LG5ldyBMZShlLCExLHIpKTtpfHwodC5ocmVmPW4uc2VyaWFsaXplKCksdC5vcmlnaW49bi5nZXRPcmlnaW4oKSx0LnByb3RvY29sPW4uZ2V0UHJvdG9jb2woKSx0LnVzZXJuYW1lPW4uZ2V0VXNlcm5hbWUoKSx0LnBhc3N3b3JkPW4uZ2V0UGFzc3dvcmQoKSx0Lmhvc3Q9bi5nZXRIb3N0KCksdC5ob3N0bmFtZT1uLmdldEhvc3RuYW1lKCksdC5wb3J0PW4uZ2V0UG9ydCgpLHQucGF0aG5hbWU9bi5nZXRQYXRobmFtZSgpLHQuc2VhcmNoPW4uZ2V0U2VhcmNoKCksdC5zZWFyY2hQYXJhbXM9bi5nZXRTZWFyY2hQYXJhbXMoKSx0Lmhhc2g9bi5nZXRIYXNoKCkpfSxqZT1fZS5wcm90b3R5cGUsVWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEModGhpcylbZV0oKX0sc2V0OnQmJmZ1bmN0aW9uKGUpe3JldHVybiBDKHRoaXMpW3RdKGUpfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH19O2lmKGkmJih1KGplLCJocmVmIixVZSgic2VyaWFsaXplIiwic2V0SHJlZiIpKSx1KGplLCJvcmlnaW4iLFVlKCJnZXRPcmlnaW4iKSksdShqZSwicHJvdG9jb2wiLFVlKCJnZXRQcm90b2NvbCIsInNldFByb3RvY29sIikpLHUoamUsInVzZXJuYW1lIixVZSgiZ2V0VXNlcm5hbWUiLCJzZXRVc2VybmFtZSIpKSx1KGplLCJwYXNzd29yZCIsVWUoImdldFBhc3N3b3JkIiwic2V0UGFzc3dvcmQiKSksdShqZSwiaG9zdCIsVWUoImdldEhvc3QiLCJzZXRIb3N0IikpLHUoamUsImhvc3RuYW1lIixVZSgiZ2V0SG9zdG5hbWUiLCJzZXRIb3N0bmFtZSIpKSx1KGplLCJwb3J0IixVZSgiZ2V0UG9ydCIsInNldFBvcnQiKSksdShqZSwicGF0aG5hbWUiLFVlKCJnZXRQYXRobmFtZSIsInNldFBhdGhuYW1lIikpLHUoamUsInNlYXJjaCIsVWUoImdldFNlYXJjaCIsInNldFNlYXJjaCIpKSx1KGplLCJzZWFyY2hQYXJhbXMiLFVlKCJnZXRTZWFyY2hQYXJhbXMiKSksdShqZSwiaGFzaCIsVWUoImdldEhhc2giLCJzZXRIYXNoIikpKSxoKGplLCJ0b0pTT04iLChmdW5jdGlvbigpe3JldHVybiBDKHRoaXMpLnNlcmlhbGl6ZSgpfSkse2VudW1lcmFibGU6ITB9KSxoKGplLCJ0b1N0cmluZyIsKGZ1bmN0aW9uKCl7cmV0dXJuIEModGhpcykuc2VyaWFsaXplKCl9KSx7ZW51bWVyYWJsZTohMH0pLEkpe3ZhciAkZT1JLmNyZWF0ZU9iamVjdFVSTCxYZT1JLnJldm9rZU9iamVjdFVSTDskZSYmaChfZSwiY3JlYXRlT2JqZWN0VVJMIixjKCRlLEkpKSxYZSYmaChfZSwicmV2b2tlT2JqZWN0VVJMIixjKFhlLEkpKX12KF9lLCJVUkwiKSxhKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsZm9yY2VkOiFzLHNoYW06IWl9LHtVUkw6X2V9KX0sMjg1OihlLHQscik9PntyKDg3ODkpfX0sdD17fTtmdW5jdGlvbiByKG4pe3ZhciBhPXRbbl07aWYodm9pZCAwIT09YSlyZXR1cm4gYS5leHBvcnRzO3ZhciBpPXRbbl09e2lkOm4sbG9hZGVkOiExLGV4cG9ydHM6e319O3JldHVybiBlW25dLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLHIpLGkubG9hZGVkPSEwLGkuZXhwb3J0c31yLmFtZE89e30sci5uPWU9Pnt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/KCk9PmUuZGVmYXVsdDooKT0+ZTtyZXR1cm4gci5kKHQse2E6dH0pLHR9LHIuZD0oZSx0KT0+e2Zvcih2YXIgbiBpbiB0KXIubyh0LG4pJiYhci5vKGUsbikmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2VudW1lcmFibGU6ITAsZ2V0OnRbbl19KX0sci5nPWZ1bmN0aW9uKCl7aWYoIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzKXJldHVybiBnbG9iYWxUaGlzO3RyeXtyZXR1cm4gdGhpc3x8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2goZSl7aWYoIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cpcmV0dXJuIHdpbmRvd319KCksci5obWQ9ZT0+KChlPU9iamVjdC5jcmVhdGUoZSkpLmNoaWxkcmVufHwoZS5jaGlsZHJlbj1bXSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImV4cG9ydHMiLHtlbnVtZXJhYmxlOiEwLHNldDooKT0+e3Rocm93IG5ldyBFcnJvcigiRVMgTW9kdWxlcyBtYXkgbm90IGFzc2lnbiBtb2R1bGUuZXhwb3J0cyBvciBleHBvcnRzLiosIFVzZSBFU00gZXhwb3J0IHN5bnRheCwgaW5zdGVhZDogIitlLmlkKX19KSxlKSxyLm89KGUsdCk9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpLHIoNzc1Nyl9KSgpOw==",s="KCgpPT57InVzZSBzdHJpY3QiO3ZhciBfX3dlYnBhY2tfbW9kdWxlc19fPSh7Ii4vcGRmLmpzIjooKG1vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19nbG9iYWxfdGhpc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19nbG9iYWxfdGhpc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19nbG9iYWxfdGhpc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3N0YXJ0c193aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3N0YXJ0c193aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19zdGFydHNfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2V4ZWNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2V4ZWNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2V4ZWNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19tYXRjaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19tYXRjaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfbWF0Y2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9kb21fY29sbGVjdGlvbnNfaXRlcmF0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9kb21fY29sbGVjdGlvbnNfaXRlcmF0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX2RvbV9jb2xsZWN0aW9uc19pdGVyYXRvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL3dlYi51cmwuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfZGVsZXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmRlbGV0ZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuZGVsZXRlLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfZGVsZXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19kZWxldGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19oYXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuaGFzLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5oYXMuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19oYXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX2hhc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX3NpemVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuc2l6ZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuc2l6ZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX3NpemVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX3NpemVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF90b19zdHJpbmdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZy5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfdG9fc3RyaW5nX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfdG9fc3RyaW5nX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfYnVmZmVyX3NsaWNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LWJ1ZmZlci5zbGljZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuc2xpY2UuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2J1ZmZlcl9zbGljZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfYnVmZmVyX3NsaWNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdWludDhfYXJyYXlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEyX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtYXJyYXkuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtYXJyYXkuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3VpbnQ4X2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV91aW50OF9hcnJheV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTJfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2F0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmF0LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmF0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9hdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTNfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfYXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maWxsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmlsbC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfZmlsbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTRfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfZmlsbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTRfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWxhc3QuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maW5kX2xhc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTVfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWxhc3QtaW5kZXguanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LWluZGV4LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maW5kX2xhc3RfaW5kZXhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE2X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3NldF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc2V0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zZXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE3X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3NldF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTdfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3NvcnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE4X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29ydC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zb3J0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zb3J0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xOF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zb3J0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xOF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fbG9jYWxlX3N0cmluZ19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1sb2NhbGUtc3RyaW5nLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLWxvY2FsZS1zdHJpbmcuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX2xvY2FsZV9zdHJpbmdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE5X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX2xvY2FsZV9zdHJpbmdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE5X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV90b19yZXZlcnNlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1yZXZlcnNlZC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1yZXZlcnNlZC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fcmV2ZXJzZWRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIwX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX3JldmVyc2VkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fc29ydGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLXNvcnRlZC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zb3J0ZWQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX3NvcnRlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fc29ydGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS53aXRoLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LndpdGguanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfcmVwbGFjZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3JlcGxhY2VfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19yZXBsYWNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3JlcGxhY2VfYWxsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLWFsbC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS1hbGwuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19yZXBsYWNlX2FsbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjRfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3JlcGxhY2VfYWxsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfcHVzaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3B1c2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3B1c2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19lcnJvcl9jYXVzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfZXJyb3JfY2F1c2VfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI2X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2Vycm9yX2NhdXNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNl9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdWludDMyX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yN19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQzMi1hcnJheS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50MzItYXJyYXkuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3VpbnQzMl9hcnJheV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjdfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdWludDMyX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yN19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfaW5jbHVkZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI4X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2luY2x1ZGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yOF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9pbmNsdWRlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjhfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19pbmNsdWRlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfaW5jbHVkZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI5X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19pbmNsdWRlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjlfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3dlYWtfbWFwX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLndlYWstbWFwLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLndlYWstbWFwLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc193ZWFrX21hcF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfd2Vha19tYXBfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMwX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19wcm9taXNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcHJvbWlzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcHJvbWlzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzFfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9zZWxmX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL3dlYi5zZWxmLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5zZWxmLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfc2VsZl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX3NlbGZfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMyX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfc3BsaXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNwbGl0LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3NwbGl0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zM19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfc3BsaXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zeW1ib2xfZGVzY3JpcHRpb25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3ltYm9sX2Rlc2NyaXB0aW9uX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19zeW1ib2xfZGVzY3JpcHRpb25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19vYmplY3RfaGFzX293bl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaGFzLW93bi5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaGFzLW93bi5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfb2JqZWN0X2hhc19vd25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX29iamVjdF9oYXNfb3duX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX3Rlc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM2X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF90ZXN0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNl9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfdGVzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzZfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZmxlY3RfdG9fc3RyaW5nX3RhZ19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LnRvLXN0cmluZy10YWcuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC50by1zdHJpbmctdGFnLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWZsZWN0X3RvX3N0cmluZ190YWdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM3X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3JlZmxlY3RfdG9fc3RyaW5nX3RhZ19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzdfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC1sYXN0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9maW5kX2xhc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM4X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzhfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2J1ZmZlcl9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLmNvbnN0cnVjdG9yLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9idWZmZXJfY29uc3RydWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM5X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2J1ZmZlcl9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzlfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QtaW5kZXguanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC1sYXN0LWluZGV4LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9maW5kX2xhc3RfaW5kZXhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQwX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDBfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3VpbnQ4X2NsYW1wZWRfYXJyYXlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQxX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtY2xhbXBlZC1hcnJheS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1jbGFtcGVkLWFycmF5LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV91aW50OF9jbGFtcGVkX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80MV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV91aW50OF9jbGFtcGVkX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80MV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfc29ydF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb3J0LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3NvcnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQyX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3NvcnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQyX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV93aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80M19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LndpdGguanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkud2l0aC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDNfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ludDhfYXJyYXlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50OC1hcnJheS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQ4LWFycmF5LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9pbnQ4X2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80NF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9pbnQ4X2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80NF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfb2JqZWN0X2Fzc2lnbl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX29iamVjdF9hc3NpZ25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX29iamVjdF9hc3NpZ25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ1X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfZG9tX2V4Y2VwdGlvbl9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5jb25zdHJ1Y3Rvci5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5jb25zdHJ1Y3Rvci5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX2RvbV9leGNlcHRpb25fY29uc3RydWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ2X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX3dlYl9kb21fZXhjZXB0aW9uX2NvbnN0cnVjdG9yX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80Nl9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX2RvbV9leGNlcHRpb25fc3RhY2tfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ3X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24uc3RhY2suanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24uc3RhY2suanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9kb21fZXhjZXB0aW9uX3N0YWNrX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80N19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc193ZWJfZG9tX2V4Y2VwdGlvbl9zdGFja19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDdfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9kb21fZXhjZXB0aW9uX3RvX3N0cmluZ190YWdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ4X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24udG8tc3RyaW5nLXRhZy5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi50by1zdHJpbmctdGFnLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfZG9tX2V4Y2VwdGlvbl90b19zdHJpbmdfdGFnX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80OF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc193ZWJfZG9tX2V4Y2VwdGlvbl90b19zdHJpbmdfdGFnX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80OF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3N0cnVjdHVyZWRfY2xvbmVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvd2ViLnN0cnVjdHVyZWQtY2xvbmUuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnN0cnVjdHVyZWQtY2xvbmUuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9zdHJ1Y3R1cmVkX2Nsb25lX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80OV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc193ZWJfc3RydWN0dXJlZF9jbG9uZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDlfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3Byb21pc2VfZmluYWxseV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHkuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19wcm9taXNlX2ZpbmFsbHlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUwX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3Byb21pc2VfZmluYWxseV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTBfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfY29uc3RydWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUxX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTFfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF9kb3RfYWxsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81Ml9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfZG90X2FsbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2RvdF9hbGxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUyX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfZmxhZ3NfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmZsYWdzLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2ZsYWdzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81M19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfZmxhZ3NfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19qc29uX3N0cmluZ2lmeV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfanNvbl9zdHJpbmdpZnlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU0X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2pzb25fc3RyaW5naWZ5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81NF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfbnVtYmVyX3RvX2ZpeGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81NV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX251bWJlcl90b19maXhlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTVfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfbnVtYmVyX3RvX2ZpeGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81NV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX2VuZHNfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZW5kcy13aXRoLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGguanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19lbmRzX3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU2X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19lbmRzX3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU2X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19wYXJzZV9mbG9hdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcGFyc2VfZmxvYXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU3X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3BhcnNlX2Zsb2F0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81N19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfbWF0aF9oeXBvdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNThfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmh5cG90LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX21hdGhfaHlwb3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU4X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX21hdGhfaHlwb3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU4X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9hdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5hdC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5hdC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfYXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU5X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2F0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81OV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX2F0X2FsdGVybmF0aXZlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82MF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hdC1hbHRlcm5hdGl2ZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuYXQtYWx0ZXJuYXRpdmUuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19hdF9hbHRlcm5hdGl2ZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX2F0X2FsdGVybmF0aXZlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82MF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcGFyc2VfaW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82MV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnBhcnNlLWludC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1pbnQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3BhcnNlX2ludF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcGFyc2VfaW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82MV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3RyaW1fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzYyX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ190cmltX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82Ml9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfdHJpbV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjJfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ludDMyX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82M19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDMyLWFycmF5LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDMyLWFycmF5LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9pbnQzMl9hcnJheV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjNfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfaW50MzJfYXJyYXlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzYzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19wcm9taXNlX2FsbF9zZXR0bGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82NF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5hbGwtc2V0dGxlZC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcHJvbWlzZV9hbGxfc2V0dGxlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjRfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcHJvbWlzZV9hbGxfc2V0dGxlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjRfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ190cmltX2VuZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS1lbmQuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfdHJpbV9lbmRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ190cmltX2VuZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjVfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZsYXRfbWFwX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82Nl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9mbGF0X21hcF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjZfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfZmxhdF9tYXBfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY2X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV91bnNjb3BhYmxlc19mbGF0X21hcF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfdW5zY29wYWJsZXNfZmxhdF9tYXBfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY3X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3Vuc2NvcGFibGVzX2ZsYXRfbWFwX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82N19fKTtcbi8qIG1vZHVsZSBkZWNvcmF0b3IgKi8gbW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXy5obWQobW9kdWxlKTtcbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZERlc3RydWN0dXJlU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7IHZhciBkZXNjcmlwdG9yID0gX2NsYXNzRXh0cmFjdEZpZWxkRGVzY3JpcHRvcihyZWNlaXZlciwgcHJpdmF0ZU1hcCwgXCJzZXRcIik7IHJldHVybiBfY2xhc3NBcHBseURlc2NyaXB0b3JEZXN0cnVjdHVyZVNldChyZWNlaXZlciwgZGVzY3JpcHRvcik7IH1cbmZ1bmN0aW9uIF9jbGFzc0FwcGx5RGVzY3JpcHRvckRlc3RydWN0dXJlU2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKSB7IGlmIChkZXNjcmlwdG9yLnNldCkgeyBpZiAoIShcIl9fZGVzdHJPYmpcIiBpbiBkZXNjcmlwdG9yKSkgeyBkZXNjcmlwdG9yLl9fZGVzdHJPYmogPSB7IHNldCB2YWx1ZSh2KSB7IGRlc2NyaXB0b3Iuc2V0LmNhbGwocmVjZWl2ZXIsIHYpOyB9IH07IH0gcmV0dXJuIGRlc2NyaXB0b3IuX19kZXN0ck9iajsgfSBlbHNlIHsgaWYgKCFkZXNjcmlwdG9yLndyaXRhYmxlKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHJlYWQgb25seSBwcml2YXRlIGZpZWxkXCIpOyB9IHJldHVybiBkZXNjcmlwdG9yOyB9IH1cbmZ1bmN0aW9uIF9jbGFzc1N0YXRpY1ByaXZhdGVNZXRob2RHZXQocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IsIG1ldGhvZCkgeyBfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNBY2Nlc3MocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IpOyByZXR1cm4gbWV0aG9kOyB9XG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHsgdmFyIGtleSA9IF90b1ByaW1pdGl2ZShhcmcsIFwic3RyaW5nXCIpOyByZXR1cm4gdHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmICh0eXBlb2YgcmVzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7IH1cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyhvYmosIHByaXZhdGVTZXQpIHsgX2NoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24ob2JqLCBwcml2YXRlU2V0KTsgcHJpdmF0ZVNldC5hZGQob2JqKTsgfVxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldChyZWNlaXZlciwgcHJpdmF0ZVNldCwgZm4pIHsgaWYgKCFwcml2YXRlU2V0LmhhcyhyZWNlaXZlcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBnZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7IH0gcmV0dXJuIGZuOyB9XG5mdW5jdGlvbiBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjU2V0KHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yLCBkZXNjcmlwdG9yLCB2YWx1ZSkgeyBfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNBY2Nlc3MocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IpOyBfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNGaWVsZERlc2NyaXB0b3IoZGVzY3JpcHRvciwgXCJzZXRcIik7IF9jbGFzc0FwcGx5RGVzY3JpcHRvclNldChyZWNlaXZlciwgZGVzY3JpcHRvciwgdmFsdWUpOyByZXR1cm4gdmFsdWU7IH1cbmZ1bmN0aW9uIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IsIGRlc2NyaXB0b3IpIHsgX2NsYXNzQ2hlY2tQcml2YXRlU3RhdGljQWNjZXNzKHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yKTsgX2NsYXNzQ2hlY2tQcml2YXRlU3RhdGljRmllbGREZXNjcmlwdG9yKGRlc2NyaXB0b3IsIFwiZ2V0XCIpOyByZXR1cm4gX2NsYXNzQXBwbHlEZXNjcmlwdG9yR2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKTsgfVxuZnVuY3Rpb24gX2NsYXNzQ2hlY2tQcml2YXRlU3RhdGljRmllbGREZXNjcmlwdG9yKGRlc2NyaXB0b3IsIGFjdGlvbikgeyBpZiAoZGVzY3JpcHRvciA9PT0gdW5kZWZpbmVkKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gXCIgKyBhY3Rpb24gKyBcIiBwcml2YXRlIHN0YXRpYyBmaWVsZCBiZWZvcmUgaXRzIGRlY2xhcmF0aW9uXCIpOyB9IH1cbmZ1bmN0aW9uIF9jbGFzc0NoZWNrUHJpdmF0ZVN0YXRpY0FjY2VzcyhyZWNlaXZlciwgY2xhc3NDb25zdHJ1Y3RvcikgeyBpZiAocmVjZWl2ZXIgIT09IGNsYXNzQ29uc3RydWN0b3IpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgc3RhdGljIGFjY2VzcyBvZiB3cm9uZyBwcm92ZW5hbmNlXCIpOyB9IH1cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKG9iaiwgcHJpdmF0ZU1hcCwgdmFsdWUpIHsgX2NoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24ob2JqLCBwcml2YXRlTWFwKTsgcHJpdmF0ZU1hcC5zZXQob2JqLCB2YWx1ZSk7IH1cbmZ1bmN0aW9uIF9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uKG9iaiwgcHJpdmF0ZUNvbGxlY3Rpb24pIHsgaWYgKHByaXZhdGVDb2xsZWN0aW9uLmhhcyhvYmopKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgc2FtZSBwcml2YXRlIGVsZW1lbnRzIHR3aWNlIG9uIGFuIG9iamVjdFwiKTsgfSB9XG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHsgdmFyIGRlc2NyaXB0b3IgPSBfY2xhc3NFeHRyYWN0RmllbGREZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCBcImdldFwiKTsgcmV0dXJuIF9jbGFzc0FwcGx5RGVzY3JpcHRvckdldChyZWNlaXZlciwgZGVzY3JpcHRvcik7IH1cbmZ1bmN0aW9uIF9jbGFzc0FwcGx5RGVzY3JpcHRvckdldChyZWNlaXZlciwgZGVzY3JpcHRvcikgeyBpZiAoZGVzY3JpcHRvci5nZXQpIHsgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0LmNhbGwocmVjZWl2ZXIpOyB9IHJldHVybiBkZXNjcmlwdG9yLnZhbHVlOyB9XG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7IHZhciBkZXNjcmlwdG9yID0gX2NsYXNzRXh0cmFjdEZpZWxkRGVzY3JpcHRvcihyZWNlaXZlciwgcHJpdmF0ZU1hcCwgXCJzZXRcIik7IF9jbGFzc0FwcGx5RGVzY3JpcHRvclNldChyZWNlaXZlciwgZGVzY3JpcHRvciwgdmFsdWUpOyByZXR1cm4gdmFsdWU7IH1cbmZ1bmN0aW9uIF9jbGFzc0V4dHJhY3RGaWVsZERlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsIGFjdGlvbikgeyBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIFwiICsgYWN0aW9uICsgXCIgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7IH0gcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTsgfVxuZnVuY3Rpb24gX2NsYXNzQXBwbHlEZXNjcmlwdG9yU2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yLCB2YWx1ZSkgeyBpZiAoZGVzY3JpcHRvci5zZXQpIHsgZGVzY3JpcHRvci5zZXQuY2FsbChyZWNlaXZlciwgdmFsdWUpOyB9IGVsc2UgeyBpZiAoIWRlc2NyaXB0b3Iud3JpdGFibGUpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcmVhZCBvbmx5IHByaXZhdGUgZmllbGRcIik7IH0gZGVzY3JpcHRvci52YWx1ZSA9IHZhbHVlOyB9IH1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4hZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24odCwgZSkge1xuICBcIm9iamVjdFwiID09IHR5cGVvZiBleHBvcnRzICYmIFwib2JqZWN0XCIgPT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzID0gZSgpIDogXCJmdW5jdGlvblwiID09IHR5cGVvZiBkZWZpbmUgJiYgX193ZWJwYWNrX3JlcXVpcmVfXy5hbWRPID8gZGVmaW5lKFwicGRmanMtZGlzdC9idWlsZC9wZGZcIiwgW10sIGUpIDogXCJvYmplY3RcIiA9PSB0eXBlb2YgZXhwb3J0cyA/IGV4cG9ydHNbXCJwZGZqcy1kaXN0L2J1aWxkL3BkZlwiXSA9IGUoKSA6IHRbXCJwZGZqcy1kaXN0L2J1aWxkL3BkZlwiXSA9IHQucGRmanNMaWIgPSBlKCk7XG59KGdsb2JhbFRoaXMsICgpID0+ICgoKSA9PiB7XG4gIHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gWywgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgX3Q7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuVmVyYm9zaXR5TGV2ZWwgPSBlLlV0aWwgPSBlLlVua25vd25FcnJvckV4Y2VwdGlvbiA9IGUuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gZS5UZXh0UmVuZGVyaW5nTW9kZSA9IGUuUmVuZGVyaW5nSW50ZW50RmxhZyA9IGUuUHJvbWlzZUNhcGFiaWxpdHkgPSBlLlBlcm1pc3Npb25GbGFnID0gZS5QYXNzd29yZFJlc3BvbnNlcyA9IGUuUGFzc3dvcmRFeGNlcHRpb24gPSBlLlBhZ2VBY3Rpb25FdmVudFR5cGUgPSBlLk9QUyA9IGUuTWlzc2luZ1BERkV4Y2VwdGlvbiA9IGUuTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEUgPSBlLkxJTkVfRkFDVE9SID0gZS5MSU5FX0RFU0NFTlRfRkFDVE9SID0gZS5JbnZhbGlkUERGRXhjZXB0aW9uID0gZS5JbWFnZUtpbmQgPSBlLklERU5USVRZX01BVFJJWCA9IGUuRm9ybWF0RXJyb3IgPSBlLkZlYXR1cmVUZXN0ID0gZS5GT05UX0lERU5USVRZX01BVFJJWCA9IGUuRG9jdW1lbnRBY3Rpb25FdmVudFR5cGUgPSBlLkNNYXBDb21wcmVzc2lvblR5cGUgPSBlLkJhc2VFeGNlcHRpb24gPSBlLkJBU0VMSU5FX0ZBQ1RPUiA9IGUuQW5ub3RhdGlvblR5cGUgPSBlLkFubm90YXRpb25SZXBseVR5cGUgPSBlLkFubm90YXRpb25Nb2RlID0gZS5Bbm5vdGF0aW9uRmxhZyA9IGUuQW5ub3RhdGlvbkZpZWxkRmxhZyA9IGUuQW5ub3RhdGlvbkVkaXRvclR5cGUgPSBlLkFubm90YXRpb25FZGl0b3JQcmVmaXggPSBlLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlID0gZS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gZS5Bbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlID0gZS5BYm9ydEV4Y2VwdGlvbiA9IHZvaWQgMDtcbiAgICAgIGUuYXNzZXJ0ID0gZnVuY3Rpb24gYXNzZXJ0KHQsIGUpIHtcbiAgICAgICAgdCB8fCB1bnJlYWNoYWJsZShlKTtcbiAgICAgIH07XG4gICAgICBlLmJ5dGVzVG9TdHJpbmcgPSBieXRlc1RvU3RyaW5nO1xuICAgICAgZS5jcmVhdGVWYWxpZEFic29sdXRlVXJsID0gZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh0KSB7XG4gICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsLFxuICAgICAgICAgIG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICAgIGlmICghdCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG4gJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkge1xuICAgICAgICAgICAgaWYgKG4uYWRkRGVmYXVsdFByb3RvY29sICYmIHQuc3RhcnRzV2l0aChcInd3dy5cIikpIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IHQubWF0Y2goL1xcLi9nKTtcbiAgICAgICAgICAgICAgKGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5sZW5ndGgpID49IDIgJiYgKHQgPSBcImh0dHA6Ly9cIi5jb25jYXQodCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG4udHJ5Q29udmVydEVuY29kaW5nKSB0cnkge1xuICAgICAgICAgICAgICB0ID0gc3RyaW5nVG9VVEY4U3RyaW5nKHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoX3VudXNlZCkge31cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaSA9IGUgPyBuZXcgVVJMKHQsIGUpIDogbmV3IFVSTCh0KTtcbiAgICAgICAgICBpZiAoZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHQgPT09IG51bGwgfHwgdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdC5wcm90b2NvbCkge1xuICAgICAgICAgICAgICBjYXNlIFwiaHR0cDpcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImh0dHBzOlwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZnRwOlwiOlxuICAgICAgICAgICAgICBjYXNlIFwibWFpbHRvOlwiOlxuICAgICAgICAgICAgICBjYXNlIFwidGVsOlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfShpKSkgcmV0dXJuIGk7XG4gICAgICAgIH0gY2F0Y2ggKF91bnVzZWQyKSB7fVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICBlLmdldE1vZGlmaWNhdGlvbkRhdGUgPSBmdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKCkge1xuICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogbmV3IERhdGUoKTtcbiAgICAgICAgcmV0dXJuIFt0LmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwgKHQuZ2V0VVRDTW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCB0LmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgdC5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCB0LmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgdC5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIildLmpvaW4oXCJcIik7XG4gICAgICB9O1xuICAgICAgZS5nZXRVdWlkID0gZnVuY3Rpb24gZ2V0VXVpZCgpIHtcbiAgICAgICAgdmFyIF9jcnlwdG8sIF9jcnlwdG8yO1xuICAgICAgICBpZiAoXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgY3J5cHRvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgKChfY3J5cHRvID0gY3J5cHRvKSA9PT0gbnVsbCB8fCBfY3J5cHRvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY3J5cHRvLnJhbmRvbVVVSUQpKSByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGNyeXB0byAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mICgoX2NyeXB0bzIgPSBjcnlwdG8pID09PSBudWxsIHx8IF9jcnlwdG8yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY3J5cHRvMi5nZXRSYW5kb21WYWx1ZXMpKSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpO2Vsc2UgZm9yIChsZXQgZSA9IDA7IGUgPCAzMjsgZSsrKSB0W2VdID0gTWF0aC5mbG9vcigyNTUgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcodCk7XG4gICAgICB9O1xuICAgICAgZS5nZXRWZXJib3NpdHlMZXZlbCA9IGZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCkge1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH07XG4gICAgICBlLmluZm8gPSBmdW5jdGlvbiBpbmZvKHQpIHtcbiAgICAgICAgcyA+PSByLklORk9TICYmIGNvbnNvbGUubG9nKFwiSW5mbzogXCIuY29uY2F0KHQpKTtcbiAgICAgIH07XG4gICAgICBlLmlzQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBpc0FycmF5QnVmZmVyKHQpIHtcbiAgICAgICAgcmV0dXJuIFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgdm9pZCAwICE9PSAodCA9PT0gbnVsbCB8fCB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0LmJ5dGVMZW5ndGgpO1xuICAgICAgfTtcbiAgICAgIGUuaXNBcnJheUVxdWFsID0gZnVuY3Rpb24gaXNBcnJheUVxdWFsKHQsIGUpIHtcbiAgICAgICAgaWYgKHQubGVuZ3RoICE9PSBlLmxlbmd0aCkgcmV0dXJuICExO1xuICAgICAgICBmb3IgKGxldCBuID0gMCwgaSA9IHQubGVuZ3RoOyBuIDwgaTsgbisrKSBpZiAodFtuXSAhPT0gZVtuXSkgcmV0dXJuICExO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9O1xuICAgICAgZS5pc05vZGVKUyA9IHZvaWQgMDtcbiAgICAgIGUubm9ybWFsaXplVW5pY29kZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaWNvZGUodCkge1xuICAgICAgICBpZiAoIWMpIHtcbiAgICAgICAgICBjID0gLyhbXFx4QTBcXHhCNVxcdTAzN0VcXHUwRUIzXFx1MjAwMC1cXHUyMDBBXFx1MjAyRlxcdTIxMjZcXHVGQjAwLVxcdUZCMDRcXHVGQjA2XFx1RkIyMC1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQTFcXHVGQkE0LVxcdUZCQTlcXHVGQkFFLVxcdUZCQjFcXHVGQkQzLVxcdUZCRENcXHVGQkRFLVxcdUZCRTdcXHVGQkVBLVxcdUZCRjhcXHVGQkZDXFx1RkJGRFxcdUZDMDAtXFx1RkM1RFxcdUZDNjQtXFx1RkNGMVxcdUZDRjUtXFx1RkQzRFxcdUZEODhcXHVGREY0XFx1RkRGQVxcdUZERkJcXHVGRTcxXFx1RkU3N1xcdUZFNzlcXHVGRTdCXFx1RkU3RF0rKXwoXFx1RkIwNSspL2c7XG4gICAgICAgICAgaCA9IG5ldyBNYXAoW1tcIu+shVwiLCBcIsW/dFwiXV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0LnJlcGxhY2VBbGwoYywgKHQsIGUsIG4pID0+IGUgPyBlLm5vcm1hbGl6ZShcIk5GS0NcIikgOiBoLmdldChuKSk7XG4gICAgICB9O1xuICAgICAgZS5vYmplY3RGcm9tTWFwID0gZnVuY3Rpb24gb2JqZWN0RnJvbU1hcCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGNvbnN0IFtuLCBpXSBvZiB0KSBlW25dID0gaTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9O1xuICAgICAgZS5vYmplY3RTaXplID0gZnVuY3Rpb24gb2JqZWN0U2l6ZSh0KSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0KS5sZW5ndGg7XG4gICAgICB9O1xuICAgICAgZS5zZXRWZXJib3NpdHlMZXZlbCA9IGZ1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKHQpIHtcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih0KSAmJiAocyA9IHQpO1xuICAgICAgfTtcbiAgICAgIGUuc2hhZG93ID0gc2hhZG93O1xuICAgICAgZS5zdHJpbmczMiA9IGZ1bmN0aW9uIHN0cmluZzMyKHQpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodCA+PiAyNCAmIDI1NSwgdCA+PiAxNiAmIDI1NSwgdCA+PiA4ICYgMjU1LCAyNTUgJiB0KTtcbiAgICAgIH07XG4gICAgICBlLnN0cmluZ1RvQnl0ZXMgPSBzdHJpbmdUb0J5dGVzO1xuICAgICAgZS5zdHJpbmdUb1BERlN0cmluZyA9IGZ1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHQpIHtcbiAgICAgICAgaWYgKHRbMF0gPj0gXCLDr1wiKSB7XG4gICAgICAgICAgbGV0IGU7XG4gICAgICAgICAgXCLDvlwiID09PSB0WzBdICYmIFwiw79cIiA9PT0gdFsxXSA/IGUgPSBcInV0Zi0xNmJlXCIgOiBcIsO/XCIgPT09IHRbMF0gJiYgXCLDvlwiID09PSB0WzFdID8gZSA9IFwidXRmLTE2bGVcIiA6IFwiw69cIiA9PT0gdFswXSAmJiBcIsK7XCIgPT09IHRbMV0gJiYgXCLCv1wiID09PSB0WzJdICYmIChlID0gXCJ1dGYtOFwiKTtcbiAgICAgICAgICBpZiAoZSkgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgVGV4dERlY29kZXIoZSwge1xuICAgICAgICAgICAgICAgIGZhdGFsOiAhMFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgaSA9IHN0cmluZ1RvQnl0ZXModCk7XG4gICAgICAgICAgICByZXR1cm4gbi5kZWNvZGUoaSk7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgd2FybihcInN0cmluZ1RvUERGU3RyaW5nOiBcXFwiXCIuY29uY2F0KHQsIFwiXFxcIi5cIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuKyspIHtcbiAgICAgICAgICBjb25zdCBpID0gbFt0LmNoYXJDb2RlQXQobildO1xuICAgICAgICAgIGUucHVzaChpID8gU3RyaW5nLmZyb21DaGFyQ29kZShpKSA6IHQuY2hhckF0KG4pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZS5qb2luKFwiXCIpO1xuICAgICAgfTtcbiAgICAgIGUuc3RyaW5nVG9VVEY4U3RyaW5nID0gc3RyaW5nVG9VVEY4U3RyaW5nO1xuICAgICAgZS51bnJlYWNoYWJsZSA9IHVucmVhY2hhYmxlO1xuICAgICAgZS51dGY4U3RyaW5nVG9TdHJpbmcgPSBmdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcodCkge1xuICAgICAgICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHQpKTtcbiAgICAgIH07XG4gICAgICBlLndhcm4gPSB3YXJuO1xuICAgICAgbigyKTtcbiAgICAgIG4oODQpO1xuICAgICAgbig4Nik7XG4gICAgICBuKDg3KTtcbiAgICAgIG4oODkpO1xuICAgICAgbig5Myk7XG4gICAgICBuKDEwMSk7XG4gICAgICBuKDEwMik7XG4gICAgICBuKDEwNSk7XG4gICAgICBuKDEwNyk7XG4gICAgICBuKDEwOSk7XG4gICAgICBuKDExMyk7XG4gICAgICBuKDExNik7XG4gICAgICBuKDEyMyk7XG4gICAgICBjb25zdCBpID0gIShcIm9iamVjdFwiICE9IHR5cGVvZiBwcm9jZXNzIHx8IHByb2Nlc3MgKyBcIlwiICE9IFwiW29iamVjdCBwcm9jZXNzXVwiIHx8IHByb2Nlc3MudmVyc2lvbnMubncgfHwgcHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgXCJicm93c2VyXCIgIT09IHByb2Nlc3MudHlwZSk7XG4gICAgICBlLmlzTm9kZUpTID0gaTtcbiAgICAgIGUuSURFTlRJVFlfTUFUUklYID0gWzEsIDAsIDAsIDEsIDAsIDBdO1xuICAgICAgZS5GT05UX0lERU5USVRZX01BVFJJWCA9IFsuMDAxLCAwLCAwLCAuMDAxLCAwLCAwXTtcbiAgICAgIGUuTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEUgPSAxZTc7XG4gICAgICBlLkxJTkVfRkFDVE9SID0gMS4zNTtcbiAgICAgIGUuTElORV9ERVNDRU5UX0ZBQ1RPUiA9IC4zNTtcbiAgICAgIGUuQkFTRUxJTkVfRkFDVE9SID0gLjI1OTI1OTI1OTI1OTI1OTI0O1xuICAgICAgZS5SZW5kZXJpbmdJbnRlbnRGbGFnID0ge1xuICAgICAgICBBTlk6IDEsXG4gICAgICAgIERJU1BMQVk6IDIsXG4gICAgICAgIFBSSU5UOiA0LFxuICAgICAgICBTQVZFOiA4LFxuICAgICAgICBBTk5PVEFUSU9OU19GT1JNUzogMTYsXG4gICAgICAgIEFOTk9UQVRJT05TX1NUT1JBR0U6IDMyLFxuICAgICAgICBBTk5PVEFUSU9OU19ESVNBQkxFOiA2NCxcbiAgICAgICAgT1BMSVNUOiAyNTZcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25Nb2RlID0ge1xuICAgICAgICBESVNBQkxFOiAwLFxuICAgICAgICBFTkFCTEU6IDEsXG4gICAgICAgIEVOQUJMRV9GT1JNUzogMixcbiAgICAgICAgRU5BQkxFX1NUT1JBR0U6IDNcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25FZGl0b3JQcmVmaXggPSBcInBkZmpzX2ludGVybmFsX2VkaXRvcl9cIjtcbiAgICAgIGUuQW5ub3RhdGlvbkVkaXRvclR5cGUgPSB7XG4gICAgICAgIERJU0FCTEU6IC0xLFxuICAgICAgICBOT05FOiAwLFxuICAgICAgICBGUkVFVEVYVDogMyxcbiAgICAgICAgU1RBTVA6IDEzLFxuICAgICAgICBJTks6IDE1XG4gICAgICB9O1xuICAgICAgZS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSA9IHtcbiAgICAgICAgUkVTSVpFOiAxLFxuICAgICAgICBGUkVFVEVYVF9TSVpFOiAxMSxcbiAgICAgICAgRlJFRVRFWFRfQ09MT1I6IDEyLFxuICAgICAgICBGUkVFVEVYVF9PUEFDSVRZOiAxMyxcbiAgICAgICAgSU5LX0NPTE9SOiAyMSxcbiAgICAgICAgSU5LX1RISUNLTkVTUzogMjIsXG4gICAgICAgIElOS19PUEFDSVRZOiAyM1xuICAgICAgfTtcbiAgICAgIGUuUGVybWlzc2lvbkZsYWcgPSB7XG4gICAgICAgIFBSSU5UOiA0LFxuICAgICAgICBNT0RJRllfQ09OVEVOVFM6IDgsXG4gICAgICAgIENPUFk6IDE2LFxuICAgICAgICBNT0RJRllfQU5OT1RBVElPTlM6IDMyLFxuICAgICAgICBGSUxMX0lOVEVSQUNUSVZFX0ZPUk1TOiAyNTYsXG4gICAgICAgIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDUxMixcbiAgICAgICAgQVNTRU1CTEU6IDEwMjQsXG4gICAgICAgIFBSSU5UX0hJR0hfUVVBTElUWTogMjA0OFxuICAgICAgfTtcbiAgICAgIGUuVGV4dFJlbmRlcmluZ01vZGUgPSB7XG4gICAgICAgIEZJTEw6IDAsXG4gICAgICAgIFNUUk9LRTogMSxcbiAgICAgICAgRklMTF9TVFJPS0U6IDIsXG4gICAgICAgIElOVklTSUJMRTogMyxcbiAgICAgICAgRklMTF9BRERfVE9fUEFUSDogNCxcbiAgICAgICAgU1RST0tFX0FERF9UT19QQVRIOiA1LFxuICAgICAgICBGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDogNixcbiAgICAgICAgQUREX1RPX1BBVEg6IDcsXG4gICAgICAgIEZJTExfU1RST0tFX01BU0s6IDMsXG4gICAgICAgIEFERF9UT19QQVRIX0ZMQUc6IDRcbiAgICAgIH07XG4gICAgICBlLkltYWdlS2luZCA9IHtcbiAgICAgICAgR1JBWVNDQUxFXzFCUFA6IDEsXG4gICAgICAgIFJHQl8yNEJQUDogMixcbiAgICAgICAgUkdCQV8zMkJQUDogM1xuICAgICAgfTtcbiAgICAgIGUuQW5ub3RhdGlvblR5cGUgPSB7XG4gICAgICAgIFRFWFQ6IDEsXG4gICAgICAgIExJTks6IDIsXG4gICAgICAgIEZSRUVURVhUOiAzLFxuICAgICAgICBMSU5FOiA0LFxuICAgICAgICBTUVVBUkU6IDUsXG4gICAgICAgIENJUkNMRTogNixcbiAgICAgICAgUE9MWUdPTjogNyxcbiAgICAgICAgUE9MWUxJTkU6IDgsXG4gICAgICAgIEhJR0hMSUdIVDogOSxcbiAgICAgICAgVU5ERVJMSU5FOiAxMCxcbiAgICAgICAgU1FVSUdHTFk6IDExLFxuICAgICAgICBTVFJJS0VPVVQ6IDEyLFxuICAgICAgICBTVEFNUDogMTMsXG4gICAgICAgIENBUkVUOiAxNCxcbiAgICAgICAgSU5LOiAxNSxcbiAgICAgICAgUE9QVVA6IDE2LFxuICAgICAgICBGSUxFQVRUQUNITUVOVDogMTcsXG4gICAgICAgIFNPVU5EOiAxOCxcbiAgICAgICAgTU9WSUU6IDE5LFxuICAgICAgICBXSURHRVQ6IDIwLFxuICAgICAgICBTQ1JFRU46IDIxLFxuICAgICAgICBQUklOVEVSTUFSSzogMjIsXG4gICAgICAgIFRSQVBORVQ6IDIzLFxuICAgICAgICBXQVRFUk1BUks6IDI0LFxuICAgICAgICBUSFJFRUQ6IDI1LFxuICAgICAgICBSRURBQ1Q6IDI2XG4gICAgICB9O1xuICAgICAgZS5Bbm5vdGF0aW9uUmVwbHlUeXBlID0ge1xuICAgICAgICBHUk9VUDogXCJHcm91cFwiLFxuICAgICAgICBSRVBMWTogXCJSXCJcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25GbGFnID0ge1xuICAgICAgICBJTlZJU0lCTEU6IDEsXG4gICAgICAgIEhJRERFTjogMixcbiAgICAgICAgUFJJTlQ6IDQsXG4gICAgICAgIE5PWk9PTTogOCxcbiAgICAgICAgTk9ST1RBVEU6IDE2LFxuICAgICAgICBOT1ZJRVc6IDMyLFxuICAgICAgICBSRUFET05MWTogNjQsXG4gICAgICAgIExPQ0tFRDogMTI4LFxuICAgICAgICBUT0dHTEVOT1ZJRVc6IDI1NixcbiAgICAgICAgTE9DS0VEQ09OVEVOVFM6IDUxMlxuICAgICAgfTtcbiAgICAgIGUuQW5ub3RhdGlvbkZpZWxkRmxhZyA9IHtcbiAgICAgICAgUkVBRE9OTFk6IDEsXG4gICAgICAgIFJFUVVJUkVEOiAyLFxuICAgICAgICBOT0VYUE9SVDogNCxcbiAgICAgICAgTVVMVElMSU5FOiA0MDk2LFxuICAgICAgICBQQVNTV09SRDogODE5MixcbiAgICAgICAgTk9UT0dHTEVUT09GRjogMTYzODQsXG4gICAgICAgIFJBRElPOiAzMjc2OCxcbiAgICAgICAgUFVTSEJVVFRPTjogNjU1MzYsXG4gICAgICAgIENPTUJPOiAxMzEwNzIsXG4gICAgICAgIEVESVQ6IDI2MjE0NCxcbiAgICAgICAgU09SVDogNTI0Mjg4LFxuICAgICAgICBGSUxFU0VMRUNUOiAxMDQ4NTc2LFxuICAgICAgICBNVUxUSVNFTEVDVDogMjA5NzE1MixcbiAgICAgICAgRE9OT1RTUEVMTENIRUNLOiA0MTk0MzA0LFxuICAgICAgICBET05PVFNDUk9MTDogODM4ODYwOCxcbiAgICAgICAgQ09NQjogMTY3NzcyMTYsXG4gICAgICAgIFJJQ0hURVhUOiAzMzU1NDQzMixcbiAgICAgICAgUkFESU9TSU5VTklTT046IDMzNTU0NDMyLFxuICAgICAgICBDT01NSVRPTlNFTENIQU5HRTogNjcxMDg4NjRcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUgPSB7XG4gICAgICAgIFNPTElEOiAxLFxuICAgICAgICBEQVNIRUQ6IDIsXG4gICAgICAgIEJFVkVMRUQ6IDMsXG4gICAgICAgIElOU0VUOiA0LFxuICAgICAgICBVTkRFUkxJTkU6IDVcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25BY3Rpb25FdmVudFR5cGUgPSB7XG4gICAgICAgIEU6IFwiTW91c2UgRW50ZXJcIixcbiAgICAgICAgWDogXCJNb3VzZSBFeGl0XCIsXG4gICAgICAgIEQ6IFwiTW91c2UgRG93blwiLFxuICAgICAgICBVOiBcIk1vdXNlIFVwXCIsXG4gICAgICAgIEZvOiBcIkZvY3VzXCIsXG4gICAgICAgIEJsOiBcIkJsdXJcIixcbiAgICAgICAgUE86IFwiUGFnZU9wZW5cIixcbiAgICAgICAgUEM6IFwiUGFnZUNsb3NlXCIsXG4gICAgICAgIFBWOiBcIlBhZ2VWaXNpYmxlXCIsXG4gICAgICAgIFBJOiBcIlBhZ2VJbnZpc2libGVcIixcbiAgICAgICAgSzogXCJLZXlzdHJva2VcIixcbiAgICAgICAgRjogXCJGb3JtYXRcIixcbiAgICAgICAgVjogXCJWYWxpZGF0ZVwiLFxuICAgICAgICBDOiBcIkNhbGN1bGF0ZVwiXG4gICAgICB9O1xuICAgICAgZS5Eb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IHtcbiAgICAgICAgV0M6IFwiV2lsbENsb3NlXCIsXG4gICAgICAgIFdTOiBcIldpbGxTYXZlXCIsXG4gICAgICAgIERTOiBcIkRpZFNhdmVcIixcbiAgICAgICAgV1A6IFwiV2lsbFByaW50XCIsXG4gICAgICAgIERQOiBcIkRpZFByaW50XCJcbiAgICAgIH07XG4gICAgICBlLlBhZ2VBY3Rpb25FdmVudFR5cGUgPSB7XG4gICAgICAgIE86IFwiUGFnZU9wZW5cIixcbiAgICAgICAgQzogXCJQYWdlQ2xvc2VcIlxuICAgICAgfTtcbiAgICAgIGNvbnN0IHIgPSB7XG4gICAgICAgIEVSUk9SUzogMCxcbiAgICAgICAgV0FSTklOR1M6IDEsXG4gICAgICAgIElORk9TOiA1XG4gICAgICB9O1xuICAgICAgZS5WZXJib3NpdHlMZXZlbCA9IHI7XG4gICAgICBlLkNNYXBDb21wcmVzc2lvblR5cGUgPSB7XG4gICAgICAgIE5PTkU6IDAsXG4gICAgICAgIEJJTkFSWTogMVxuICAgICAgfTtcbiAgICAgIGUuT1BTID0ge1xuICAgICAgICBkZXBlbmRlbmN5OiAxLFxuICAgICAgICBzZXRMaW5lV2lkdGg6IDIsXG4gICAgICAgIHNldExpbmVDYXA6IDMsXG4gICAgICAgIHNldExpbmVKb2luOiA0LFxuICAgICAgICBzZXRNaXRlckxpbWl0OiA1LFxuICAgICAgICBzZXREYXNoOiA2LFxuICAgICAgICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsXG4gICAgICAgIHNldEZsYXRuZXNzOiA4LFxuICAgICAgICBzZXRHU3RhdGU6IDksXG4gICAgICAgIHNhdmU6IDEwLFxuICAgICAgICByZXN0b3JlOiAxMSxcbiAgICAgICAgdHJhbnNmb3JtOiAxMixcbiAgICAgICAgbW92ZVRvOiAxMyxcbiAgICAgICAgbGluZVRvOiAxNCxcbiAgICAgICAgY3VydmVUbzogMTUsXG4gICAgICAgIGN1cnZlVG8yOiAxNixcbiAgICAgICAgY3VydmVUbzM6IDE3LFxuICAgICAgICBjbG9zZVBhdGg6IDE4LFxuICAgICAgICByZWN0YW5nbGU6IDE5LFxuICAgICAgICBzdHJva2U6IDIwLFxuICAgICAgICBjbG9zZVN0cm9rZTogMjEsXG4gICAgICAgIGZpbGw6IDIyLFxuICAgICAgICBlb0ZpbGw6IDIzLFxuICAgICAgICBmaWxsU3Ryb2tlOiAyNCxcbiAgICAgICAgZW9GaWxsU3Ryb2tlOiAyNSxcbiAgICAgICAgY2xvc2VGaWxsU3Ryb2tlOiAyNixcbiAgICAgICAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LFxuICAgICAgICBlbmRQYXRoOiAyOCxcbiAgICAgICAgY2xpcDogMjksXG4gICAgICAgIGVvQ2xpcDogMzAsXG4gICAgICAgIGJlZ2luVGV4dDogMzEsXG4gICAgICAgIGVuZFRleHQ6IDMyLFxuICAgICAgICBzZXRDaGFyU3BhY2luZzogMzMsXG4gICAgICAgIHNldFdvcmRTcGFjaW5nOiAzNCxcbiAgICAgICAgc2V0SFNjYWxlOiAzNSxcbiAgICAgICAgc2V0TGVhZGluZzogMzYsXG4gICAgICAgIHNldEZvbnQ6IDM3LFxuICAgICAgICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsXG4gICAgICAgIHNldFRleHRSaXNlOiAzOSxcbiAgICAgICAgbW92ZVRleHQ6IDQwLFxuICAgICAgICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLFxuICAgICAgICBzZXRUZXh0TWF0cml4OiA0MixcbiAgICAgICAgbmV4dExpbmU6IDQzLFxuICAgICAgICBzaG93VGV4dDogNDQsXG4gICAgICAgIHNob3dTcGFjZWRUZXh0OiA0NSxcbiAgICAgICAgbmV4dExpbmVTaG93VGV4dDogNDYsXG4gICAgICAgIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NyxcbiAgICAgICAgc2V0Q2hhcldpZHRoOiA0OCxcbiAgICAgICAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSxcbiAgICAgICAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsXG4gICAgICAgIHNldEZpbGxDb2xvclNwYWNlOiA1MSxcbiAgICAgICAgc2V0U3Ryb2tlQ29sb3I6IDUyLFxuICAgICAgICBzZXRTdHJva2VDb2xvck46IDUzLFxuICAgICAgICBzZXRGaWxsQ29sb3I6IDU0LFxuICAgICAgICBzZXRGaWxsQ29sb3JOOiA1NSxcbiAgICAgICAgc2V0U3Ryb2tlR3JheTogNTYsXG4gICAgICAgIHNldEZpbGxHcmF5OiA1NyxcbiAgICAgICAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LFxuICAgICAgICBzZXRGaWxsUkdCQ29sb3I6IDU5LFxuICAgICAgICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLFxuICAgICAgICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSxcbiAgICAgICAgc2hhZGluZ0ZpbGw6IDYyLFxuICAgICAgICBiZWdpbklubGluZUltYWdlOiA2MyxcbiAgICAgICAgYmVnaW5JbWFnZURhdGE6IDY0LFxuICAgICAgICBlbmRJbmxpbmVJbWFnZTogNjUsXG4gICAgICAgIHBhaW50WE9iamVjdDogNjYsXG4gICAgICAgIG1hcmtQb2ludDogNjcsXG4gICAgICAgIG1hcmtQb2ludFByb3BzOiA2OCxcbiAgICAgICAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSxcbiAgICAgICAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLFxuICAgICAgICBlbmRNYXJrZWRDb250ZW50OiA3MSxcbiAgICAgICAgYmVnaW5Db21wYXQ6IDcyLFxuICAgICAgICBlbmRDb21wYXQ6IDczLFxuICAgICAgICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LFxuICAgICAgICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSxcbiAgICAgICAgYmVnaW5Hcm91cDogNzYsXG4gICAgICAgIGVuZEdyb3VwOiA3NyxcbiAgICAgICAgYmVnaW5Bbm5vdGF0aW9uOiA4MCxcbiAgICAgICAgZW5kQW5ub3RhdGlvbjogODEsXG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogODMsXG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOiA4NCxcbiAgICAgICAgcGFpbnRJbWFnZVhPYmplY3Q6IDg1LFxuICAgICAgICBwYWludElubGluZUltYWdlWE9iamVjdDogODYsXG4gICAgICAgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6IDg3LFxuICAgICAgICBwYWludEltYWdlWE9iamVjdFJlcGVhdDogODgsXG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDogODksXG4gICAgICAgIHBhaW50U29saWRDb2xvckltYWdlTWFzazogOTAsXG4gICAgICAgIGNvbnN0cnVjdFBhdGg6IDkxXG4gICAgICB9O1xuICAgICAgZS5QYXNzd29yZFJlc3BvbnNlcyA9IHtcbiAgICAgICAgTkVFRF9QQVNTV09SRDogMSxcbiAgICAgICAgSU5DT1JSRUNUX1BBU1NXT1JEOiAyXG4gICAgICB9O1xuICAgICAgbGV0IHMgPSByLldBUk5JTkdTO1xuICAgICAgZnVuY3Rpb24gd2Fybih0KSB7XG4gICAgICAgIHMgPj0gci5XQVJOSU5HUyAmJiBjb25zb2xlLmxvZyhcIldhcm5pbmc6IFwiLmNvbmNhdCh0KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1bnJlYWNoYWJsZSh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHNoYWRvdyh0LCBlLCBuKSB7XG4gICAgICAgIGxldCBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10gJiYgYXJndW1lbnRzWzNdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgZSwge1xuICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgIGVudW1lcmFibGU6ICFpLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICAgICAgd3JpdGFibGU6ICExXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGEgPSBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpIHtcbiAgICAgICAgZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbih0LCBlKSB7XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUV4Y2VwdGlvbiAmJiB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uXCIpO1xuICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHQ7XG4gICAgICAgICAgdGhpcy5uYW1lID0gZTtcbiAgICAgICAgfVxuICAgICAgICBCYXNlRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuICAgICAgICBCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yID0gQmFzZUV4Y2VwdGlvbjtcbiAgICAgICAgcmV0dXJuIEJhc2VFeGNlcHRpb247XG4gICAgICB9KCk7XG4gICAgICBlLkJhc2VFeGNlcHRpb24gPSBhO1xuICAgICAgZS5QYXNzd29yZEV4Y2VwdGlvbiA9IGNsYXNzIFBhc3N3b3JkRXhjZXB0aW9uIGV4dGVuZHMgYSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICBzdXBlcih0LCBcIlBhc3N3b3JkRXhjZXB0aW9uXCIpO1xuICAgICAgICAgIHRoaXMuY29kZSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlLlVua25vd25FcnJvckV4Y2VwdGlvbiA9IGNsYXNzIFVua25vd25FcnJvckV4Y2VwdGlvbiBleHRlbmRzIGEge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgc3VwZXIodCwgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIik7XG4gICAgICAgICAgdGhpcy5kZXRhaWxzID0gZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGUuSW52YWxpZFBERkV4Y2VwdGlvbiA9IGNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIFwiSW52YWxpZFBERkV4Y2VwdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGUuTWlzc2luZ1BERkV4Y2VwdGlvbiA9IGNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIFwiTWlzc2luZ1BERkV4Y2VwdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGUuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gY2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgYSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICBzdXBlcih0LCBcIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvblwiKTtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IGU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlLkZvcm1hdEVycm9yID0gY2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIFwiRm9ybWF0RXJyb3JcIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlLkFib3J0RXhjZXB0aW9uID0gY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIFwiQWJvcnRFeGNlcHRpb25cIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBieXRlc1RvU3RyaW5nKHQpIHtcbiAgICAgICAgXCJvYmplY3RcIiA9PSB0eXBlb2YgdCAmJiB2b2lkIDAgIT09ICh0ID09PSBudWxsIHx8IHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHQubGVuZ3RoKSB8fCB1bnJlYWNoYWJsZShcIkludmFsaWQgYXJndW1lbnQgZm9yIGJ5dGVzVG9TdHJpbmdcIik7XG4gICAgICAgIGNvbnN0IGUgPSB0Lmxlbmd0aCxcbiAgICAgICAgICBuID0gODE5MjtcbiAgICAgICAgaWYgKGUgPCBuKSByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB0KTtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICBmb3IgKGxldCByID0gMDsgciA8IGU7IHIgKz0gbikge1xuICAgICAgICAgIGNvbnN0IHMgPSBNYXRoLm1pbihyICsgbiwgZSksXG4gICAgICAgICAgICBhID0gdC5zdWJhcnJheShyLCBzKTtcbiAgICAgICAgICBpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGkuam9pbihcIlwiKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXModCkge1xuICAgICAgICBcInN0cmluZ1wiICE9IHR5cGVvZiB0ICYmIHVucmVhY2hhYmxlKFwiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlc1wiKTtcbiAgICAgICAgY29uc3QgZSA9IHQubGVuZ3RoLFxuICAgICAgICAgIG4gPSBuZXcgVWludDhBcnJheShlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlOyArK2kpIG5baV0gPSAyNTUgJiB0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfVxuICAgICAgZS5GZWF0dXJlVGVzdCA9IGNsYXNzIEZlYXR1cmVUZXN0IHtcbiAgICAgICAgc3RhdGljIGdldCBpc0xpdHRsZUVuZGlhbigpIHtcbiAgICAgICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNMaXR0bGVFbmRpYW5cIiwgZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgICAgICB0WzBdID0gMTtcbiAgICAgICAgICAgIHJldHVybiAxID09PSBuZXcgVWludDMyQXJyYXkodC5idWZmZXIsIDAsIDEpWzBdO1xuICAgICAgICAgIH0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBpc0V2YWxTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzRXZhbFN1cHBvcnRlZFwiLCBmdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBuZXcgRnVuY3Rpb24oXCJcIik7XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQzKSB7XG4gICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KCkpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkXCIsIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBwbGF0Zm9ybSgpIHtcbiAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgbmF2aWdhdG9yID8gc2hhZG93KHRoaXMsIFwicGxhdGZvcm1cIiwge1xuICAgICAgICAgICAgaXNXaW46ICExLFxuICAgICAgICAgICAgaXNNYWM6ICExXG4gICAgICAgICAgfSkgOiBzaGFkb3codGhpcywgXCJwbGF0Zm9ybVwiLCB7XG4gICAgICAgICAgICBpc1dpbjogbmF2aWdhdG9yLnBsYXRmb3JtLmluY2x1ZGVzKFwiV2luXCIpLFxuICAgICAgICAgICAgaXNNYWM6IG5hdmlnYXRvci5wbGF0Zm9ybS5pbmNsdWRlcyhcIk1hY1wiKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgbyA9IFsuLi5BcnJheSgyNTYpLmtleXMoKV0ubWFwKHQgPT4gdC50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKTtcbiAgICAgIGUuVXRpbCA9IGNsYXNzIFV0aWwge1xuICAgICAgICBzdGF0aWMgbWFrZUhleENvbG9yKHQsIGUsIG4pIHtcbiAgICAgICAgICByZXR1cm4gXCIjXCIuY29uY2F0KG9bdF0pLmNvbmNhdChvW2VdKS5jb25jYXQob1tuXSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIHNjYWxlTWluTWF4KHQsIGUpIHtcbiAgICAgICAgICBsZXQgbjtcbiAgICAgICAgICBpZiAodFswXSkge1xuICAgICAgICAgICAgaWYgKHRbMF0gPCAwKSB7XG4gICAgICAgICAgICAgIG4gPSBlWzBdO1xuICAgICAgICAgICAgICBlWzBdID0gZVsxXTtcbiAgICAgICAgICAgICAgZVsxXSA9IG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlWzBdICo9IHRbMF07XG4gICAgICAgICAgICBlWzFdICo9IHRbMF07XG4gICAgICAgICAgICBpZiAodFszXSA8IDApIHtcbiAgICAgICAgICAgICAgbiA9IGVbMl07XG4gICAgICAgICAgICAgIGVbMl0gPSBlWzNdO1xuICAgICAgICAgICAgICBlWzNdID0gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVbMl0gKj0gdFszXTtcbiAgICAgICAgICAgIGVbM10gKj0gdFszXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbiA9IGVbMF07XG4gICAgICAgICAgICBlWzBdID0gZVsyXTtcbiAgICAgICAgICAgIGVbMl0gPSBuO1xuICAgICAgICAgICAgbiA9IGVbMV07XG4gICAgICAgICAgICBlWzFdID0gZVszXTtcbiAgICAgICAgICAgIGVbM10gPSBuO1xuICAgICAgICAgICAgaWYgKHRbMV0gPCAwKSB7XG4gICAgICAgICAgICAgIG4gPSBlWzJdO1xuICAgICAgICAgICAgICBlWzJdID0gZVszXTtcbiAgICAgICAgICAgICAgZVszXSA9IG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlWzJdICo9IHRbMV07XG4gICAgICAgICAgICBlWzNdICo9IHRbMV07XG4gICAgICAgICAgICBpZiAodFsyXSA8IDApIHtcbiAgICAgICAgICAgICAgbiA9IGVbMF07XG4gICAgICAgICAgICAgIGVbMF0gPSBlWzFdO1xuICAgICAgICAgICAgICBlWzFdID0gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVbMF0gKj0gdFsyXTtcbiAgICAgICAgICAgIGVbMV0gKj0gdFsyXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZVswXSArPSB0WzRdO1xuICAgICAgICAgIGVbMV0gKz0gdFs0XTtcbiAgICAgICAgICBlWzJdICs9IHRbNV07XG4gICAgICAgICAgZVszXSArPSB0WzVdO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyB0cmFuc2Zvcm0odCwgZSkge1xuICAgICAgICAgIHJldHVybiBbdFswXSAqIGVbMF0gKyB0WzJdICogZVsxXSwgdFsxXSAqIGVbMF0gKyB0WzNdICogZVsxXSwgdFswXSAqIGVbMl0gKyB0WzJdICogZVszXSwgdFsxXSAqIGVbMl0gKyB0WzNdICogZVszXSwgdFswXSAqIGVbNF0gKyB0WzJdICogZVs1XSArIHRbNF0sIHRbMV0gKiBlWzRdICsgdFszXSAqIGVbNV0gKyB0WzVdXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgYXBwbHlUcmFuc2Zvcm0odCwgZSkge1xuICAgICAgICAgIHJldHVybiBbdFswXSAqIGVbMF0gKyB0WzFdICogZVsyXSArIGVbNF0sIHRbMF0gKiBlWzFdICsgdFsxXSAqIGVbM10gKyBlWzVdXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gZVswXSAqIGVbM10gLSBlWzFdICogZVsyXTtcbiAgICAgICAgICByZXR1cm4gWyh0WzBdICogZVszXSAtIHRbMV0gKiBlWzJdICsgZVsyXSAqIGVbNV0gLSBlWzRdICogZVszXSkgLyBuLCAoLXRbMF0gKiBlWzFdICsgdFsxXSAqIGVbMF0gKyBlWzRdICogZVsxXSAtIGVbNV0gKiBlWzBdKSAvIG5dO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveCh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0odCwgZSksXG4gICAgICAgICAgICBpID0gdGhpcy5hcHBseVRyYW5zZm9ybSh0LnNsaWNlKDIsIDQpLCBlKSxcbiAgICAgICAgICAgIHIgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFt0WzBdLCB0WzNdXSwgZSksXG4gICAgICAgICAgICBzID0gdGhpcy5hcHBseVRyYW5zZm9ybShbdFsyXSwgdFsxXV0sIGUpO1xuICAgICAgICAgIHJldHVybiBbTWF0aC5taW4oblswXSwgaVswXSwgclswXSwgc1swXSksIE1hdGgubWluKG5bMV0sIGlbMV0sIHJbMV0sIHNbMV0pLCBNYXRoLm1heChuWzBdLCBpWzBdLCByWzBdLCBzWzBdKSwgTWF0aC5tYXgoblsxXSwgaVsxXSwgclsxXSwgc1sxXSldO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdFswXSAqIHRbM10gLSB0WzFdICogdFsyXTtcbiAgICAgICAgICByZXR1cm4gW3RbM10gLyBlLCAtdFsxXSAvIGUsIC10WzJdIC8gZSwgdFswXSAvIGUsICh0WzJdICogdFs1XSAtIHRbNF0gKiB0WzNdKSAvIGUsICh0WzRdICogdFsxXSAtIHRbNV0gKiB0WzBdKSAvIGVdO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IFt0WzBdLCB0WzJdLCB0WzFdLCB0WzNdXSxcbiAgICAgICAgICAgIG4gPSB0WzBdICogZVswXSArIHRbMV0gKiBlWzJdLFxuICAgICAgICAgICAgaSA9IHRbMF0gKiBlWzFdICsgdFsxXSAqIGVbM10sXG4gICAgICAgICAgICByID0gdFsyXSAqIGVbMF0gKyB0WzNdICogZVsyXSxcbiAgICAgICAgICAgIHMgPSB0WzJdICogZVsxXSArIHRbM10gKiBlWzNdLFxuICAgICAgICAgICAgYSA9IChuICsgcykgLyAyLFxuICAgICAgICAgICAgbyA9IE1hdGguc3FydCgobiArIHMpICoqIDIgLSA0ICogKG4gKiBzIC0gciAqIGkpKSAvIDIsXG4gICAgICAgICAgICBsID0gYSArIG8gfHwgMSxcbiAgICAgICAgICAgIGMgPSBhIC0gbyB8fCAxO1xuICAgICAgICAgIHJldHVybiBbTWF0aC5zcXJ0KGwpLCBNYXRoLnNxcnQoYyldO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBub3JtYWxpemVSZWN0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdC5zbGljZSgwKTtcbiAgICAgICAgICBpZiAodFswXSA+IHRbMl0pIHtcbiAgICAgICAgICAgIGVbMF0gPSB0WzJdO1xuICAgICAgICAgICAgZVsyXSA9IHRbMF07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0WzFdID4gdFszXSkge1xuICAgICAgICAgICAgZVsxXSA9IHRbM107XG4gICAgICAgICAgICBlWzNdID0gdFsxXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGludGVyc2VjdCh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IE1hdGgubWF4KE1hdGgubWluKHRbMF0sIHRbMl0pLCBNYXRoLm1pbihlWzBdLCBlWzJdKSksXG4gICAgICAgICAgICBpID0gTWF0aC5taW4oTWF0aC5tYXgodFswXSwgdFsyXSksIE1hdGgubWF4KGVbMF0sIGVbMl0pKTtcbiAgICAgICAgICBpZiAobiA+IGkpIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLm1heChNYXRoLm1pbih0WzFdLCB0WzNdKSwgTWF0aC5taW4oZVsxXSwgZVszXSkpLFxuICAgICAgICAgICAgcyA9IE1hdGgubWluKE1hdGgubWF4KHRbMV0sIHRbM10pLCBNYXRoLm1heChlWzFdLCBlWzNdKSk7XG4gICAgICAgICAgcmV0dXJuIHIgPiBzID8gbnVsbCA6IFtuLCByLCBpLCBzXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgYmV6aWVyQm91bmRpbmdCb3godCwgZSwgbiwgaSwgciwgcywgYSwgbykge1xuICAgICAgICAgIGNvbnN0IGwgPSBbXSxcbiAgICAgICAgICAgIGMgPSBbW10sIFtdXTtcbiAgICAgICAgICBsZXQgaCwgZCwgdSwgcCwgZiwgZywgbSwgYjtcbiAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IDI7ICsrYykge1xuICAgICAgICAgICAgaWYgKDAgPT09IGMpIHtcbiAgICAgICAgICAgICAgZCA9IDYgKiB0IC0gMTIgKiBuICsgNiAqIHI7XG4gICAgICAgICAgICAgIGggPSAtMyAqIHQgKyA5ICogbiAtIDkgKiByICsgMyAqIGE7XG4gICAgICAgICAgICAgIHUgPSAzICogbiAtIDMgKiB0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZCA9IDYgKiBlIC0gMTIgKiBpICsgNiAqIHM7XG4gICAgICAgICAgICAgIGggPSAtMyAqIGUgKyA5ICogaSAtIDkgKiBzICsgMyAqIG87XG4gICAgICAgICAgICAgIHUgPSAzICogaSAtIDMgKiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGgpIDwgMWUtMTIpIHtcbiAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGQpIDwgMWUtMTIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICBwID0gLXUgLyBkO1xuICAgICAgICAgICAgICAwIDwgcCAmJiBwIDwgMSAmJiBsLnB1c2gocCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtID0gZCAqIGQgLSA0ICogdSAqIGg7XG4gICAgICAgICAgICAgIGIgPSBNYXRoLnNxcnQobSk7XG4gICAgICAgICAgICAgIGlmICghKG0gPCAwKSkge1xuICAgICAgICAgICAgICAgIGYgPSAoLWQgKyBiKSAvICgyICogaCk7XG4gICAgICAgICAgICAgICAgMCA8IGYgJiYgZiA8IDEgJiYgbC5wdXNoKGYpO1xuICAgICAgICAgICAgICAgIGcgPSAoLWQgLSBiKSAvICgyICogaCk7XG4gICAgICAgICAgICAgICAgMCA8IGcgJiYgZyA8IDEgJiYgbC5wdXNoKGcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB2LFxuICAgICAgICAgICAgeSA9IGwubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IEEgPSB5O1xuICAgICAgICAgIGZvciAoOyB5LS07KSB7XG4gICAgICAgICAgICBwID0gbFt5XTtcbiAgICAgICAgICAgIHYgPSAxIC0gcDtcbiAgICAgICAgICAgIGNbMF1beV0gPSB2ICogdiAqIHYgKiB0ICsgMyAqIHYgKiB2ICogcCAqIG4gKyAzICogdiAqIHAgKiBwICogciArIHAgKiBwICogcCAqIGE7XG4gICAgICAgICAgICBjWzFdW3ldID0gdiAqIHYgKiB2ICogZSArIDMgKiB2ICogdiAqIHAgKiBpICsgMyAqIHYgKiBwICogcCAqIHMgKyBwICogcCAqIHAgKiBvO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjWzBdW0FdID0gdDtcbiAgICAgICAgICBjWzFdW0FdID0gZTtcbiAgICAgICAgICBjWzBdW0EgKyAxXSA9IGE7XG4gICAgICAgICAgY1sxXVtBICsgMV0gPSBvO1xuICAgICAgICAgIGNbMF0ubGVuZ3RoID0gY1sxXS5sZW5ndGggPSBBICsgMjtcbiAgICAgICAgICByZXR1cm4gW01hdGgubWluKC4uLmNbMF0pLCBNYXRoLm1pbiguLi5jWzFdKSwgTWF0aC5tYXgoLi4uY1swXSksIE1hdGgubWF4KC4uLmNbMV0pXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGwgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNzI4LCA3MTEsIDcxMCwgNzI5LCA3MzMsIDczMSwgNzMwLCA3MzIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDgyMjYsIDgyMjQsIDgyMjUsIDgyMzAsIDgyMTIsIDgyMTEsIDQwMiwgODI2MCwgODI0OSwgODI1MCwgODcyMiwgODI0MCwgODIyMiwgODIyMCwgODIyMSwgODIxNiwgODIxNywgODIxOCwgODQ4MiwgNjQyNTcsIDY0MjU4LCAzMjEsIDMzOCwgMzUyLCAzNzYsIDM4MSwgMzA1LCAzMjIsIDMzOSwgMzUzLCAzODIsIDAsIDgzNjRdO1xuICAgICAgZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKHQpIHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUodCkpO1xuICAgICAgfVxuICAgICAgZS5Qcm9taXNlQ2FwYWJpbGl0eSA9IChfdCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpLCBjbGFzcyBQcm9taXNlQ2FwYWJpbGl0eSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF90LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSBlID0+IHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF90LCAhMCk7XG4gICAgICAgICAgICAgIHQoZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5yZWplY3QgPSB0ID0+IHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF90LCAhMCk7XG4gICAgICAgICAgICAgIGUodCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCBzZXR0bGVkKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3QpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxldCBjID0gbnVsbCxcbiAgICAgICAgaCA9IG51bGw7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzKSxcbiAgICAgICAgciA9IG4oNCksXG4gICAgICAgIHMgPSBuKDY5KSxcbiAgICAgICAgYSA9IG4oNzApLFxuICAgICAgICBvID0gXCJXZWJBc3NlbWJseVwiLFxuICAgICAgICBsID0gcltvXSxcbiAgICAgICAgYyA9IDcgIT09IEVycm9yKFwiZVwiLCB7XG4gICAgICAgICAgY2F1c2U6IDdcbiAgICAgICAgfSkuY2F1c2UsXG4gICAgICAgIGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyID0gZnVuY3Rpb24gZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIodCwgZSkge1xuICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgblt0XSA9IGEodCwgZSwgYyk7XG4gICAgICAgICAgaSh7XG4gICAgICAgICAgICBnbG9iYWw6ICEwLFxuICAgICAgICAgICAgY29uc3RydWN0b3I6ICEwLFxuICAgICAgICAgICAgYXJpdHk6IDEsXG4gICAgICAgICAgICBmb3JjZWQ6IGNcbiAgICAgICAgICB9LCBuKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlciA9IGZ1bmN0aW9uIGV4cG9ydFdlYkFzc2VtYmx5RXJyb3JDYXVzZVdyYXBwZXIodCwgZSkge1xuICAgICAgICAgIGlmIChsICYmIGxbdF0pIHtcbiAgICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgICBuW3RdID0gYShvICsgXCIuXCIgKyB0LCBlLCBjKTtcbiAgICAgICAgICAgIGkoe1xuICAgICAgICAgICAgICB0YXJnZXQ6IG8sXG4gICAgICAgICAgICAgIHN0YXQ6ICEwLFxuICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogITAsXG4gICAgICAgICAgICAgIGFyaXR5OiAxLFxuICAgICAgICAgICAgICBmb3JjZWQ6IGNcbiAgICAgICAgICAgIH0sIG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKFwiRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIEVycm9yKGUpIHtcbiAgICAgICAgICByZXR1cm4gcyh0LCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcihcIkV2YWxFcnJvclwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gRXZhbEVycm9yKGUpIHtcbiAgICAgICAgICByZXR1cm4gcyh0LCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcihcIlJhbmdlRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFJhbmdlRXJyb3IoZSkge1xuICAgICAgICAgIHJldHVybiBzKHQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKFwiUmVmZXJlbmNlRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFJlZmVyZW5jZUVycm9yKGUpIHtcbiAgICAgICAgICByZXR1cm4gcyh0LCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcihcIlN5bnRheEVycm9yXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBTeW50YXhFcnJvcihlKSB7XG4gICAgICAgICAgcmV0dXJuIHModCwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoXCJUeXBlRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFR5cGVFcnJvcihlKSB7XG4gICAgICAgICAgcmV0dXJuIHModCwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoXCJVUklFcnJvclwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gVVJJRXJyb3IoZSkge1xuICAgICAgICAgIHJldHVybiBzKHQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydFdlYkFzc2VtYmx5RXJyb3JDYXVzZVdyYXBwZXIoXCJDb21waWxlRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIENvbXBpbGVFcnJvcihlKSB7XG4gICAgICAgICAgcmV0dXJuIHModCwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlcihcIkxpbmtFcnJvclwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gTGlua0Vycm9yKGUpIHtcbiAgICAgICAgICByZXR1cm4gcyh0LCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBleHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyKFwiUnVudGltZUVycm9yXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBSdW50aW1lRXJyb3IoZSkge1xuICAgICAgICAgIHJldHVybiBzKHQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gbig1KS5mLFxuICAgICAgICBzID0gbig0NCksXG4gICAgICAgIGEgPSBuKDQ4KSxcbiAgICAgICAgbyA9IG4oMzgpLFxuICAgICAgICBsID0gbig1NiksXG4gICAgICAgIGMgPSBuKDY4KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBuLFxuICAgICAgICAgIGgsXG4gICAgICAgICAgZCxcbiAgICAgICAgICB1LFxuICAgICAgICAgIHAsXG4gICAgICAgICAgZiA9IHQudGFyZ2V0LFxuICAgICAgICAgIGcgPSB0Lmdsb2JhbCxcbiAgICAgICAgICBtID0gdC5zdGF0O1xuICAgICAgICBpZiAobiA9IGcgPyBpIDogbSA/IGlbZl0gfHwgbyhmLCB7fSkgOiAoaVtmXSB8fCB7fSkucHJvdG90eXBlKSBmb3IgKGggaW4gZSkge1xuICAgICAgICAgIHUgPSBlW2hdO1xuICAgICAgICAgIGQgPSB0LmRvbnRDYWxsR2V0U2V0ID8gKHAgPSByKG4sIGgpKSAmJiBwLnZhbHVlIDogbltoXTtcbiAgICAgICAgICBpZiAoIWMoZyA/IGggOiBmICsgKG0gPyBcIi5cIiA6IFwiI1wiKSArIGgsIHQuZm9yY2VkKSAmJiB2b2lkIDAgIT09IGQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdSA9PSB0eXBlb2YgZCkgY29udGludWU7XG4gICAgICAgICAgICBsKHUsIGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAodC5zaGFtIHx8IGQgJiYgZC5zaGFtKSAmJiBzKHUsIFwic2hhbVwiLCAhMCk7XG4gICAgICAgICAgYShuLCBoLCB1LCB0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGNoZWNrID0gZnVuY3Rpb24gY2hlY2sodCkge1xuICAgICAgICByZXR1cm4gdCAmJiB0Lk1hdGggPT0gTWF0aCAmJiB0O1xuICAgICAgfTtcbiAgICAgIHQuZXhwb3J0cyA9IGNoZWNrKFwib2JqZWN0XCIgPT0gdHlwZW9mIGdsb2JhbFRoaXMgJiYgZ2xvYmFsVGhpcykgfHwgY2hlY2soXCJvYmplY3RcIiA9PSB0eXBlb2Ygd2luZG93ICYmIHdpbmRvdykgfHwgY2hlY2soXCJvYmplY3RcIiA9PSB0eXBlb2Ygc2VsZiAmJiBzZWxmKSB8fCBjaGVjayhcIm9iamVjdFwiID09IHR5cGVvZiBfX3dlYnBhY2tfcmVxdWlyZV9fLmcgJiYgX193ZWJwYWNrX3JlcXVpcmVfXy5nKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSgpIHx8IHRoaXMgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNiksXG4gICAgICAgIHIgPSBuKDgpLFxuICAgICAgICBzID0gbigxMCksXG4gICAgICAgIGEgPSBuKDExKSxcbiAgICAgICAgbyA9IG4oMTIpLFxuICAgICAgICBsID0gbigxOCksXG4gICAgICAgIGMgPSBuKDM5KSxcbiAgICAgICAgaCA9IG4oNDIpLFxuICAgICAgICBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgIGUuZiA9IGkgPyBkIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIGUpIHtcbiAgICAgICAgdCA9IG8odCk7XG4gICAgICAgIGUgPSBsKGUpO1xuICAgICAgICBpZiAoaCkgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZCh0LCBlKTtcbiAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgaWYgKGModCwgZSkpIHJldHVybiBhKCFyKHMuZiwgdCwgZSksIHRbZV0pO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDcpO1xuICAgICAgdC5leHBvcnRzID0gIWkoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gNyAhPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIDEsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiA3O1xuICAgICAgICAgIH1cbiAgICAgICAgfSlbMV07XG4gICAgICB9KTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuICEhdCgpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOSksXG4gICAgICAgIHIgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbiAgICAgIHQuZXhwb3J0cyA9IGkgPyByLmJpbmQocikgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiByLmFwcGx5KHIsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNyk7XG4gICAgICB0LmV4cG9ydHMgPSAhaShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gZnVuY3Rpb24gKCkge30uYmluZCgpO1xuICAgICAgICByZXR1cm4gXCJmdW5jdGlvblwiICE9IHR5cGVvZiB0IHx8IHQuaGFzT3duUHJvcGVydHkoXCJwcm90b3R5cGVcIik7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSkgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBuID0ge30ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIGkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAgICAgICByID0gaSAmJiAhbi5jYWxsKHtcbiAgICAgICAgICAxOiAyXG4gICAgICAgIH0sIDEpO1xuICAgICAgZS5mID0gciA/IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKHQpIHtcbiAgICAgICAgdmFyIGUgPSBpKHRoaXMsIHQpO1xuICAgICAgICByZXR1cm4gISFlICYmIGUuZW51bWVyYWJsZTtcbiAgICAgIH0gOiBuO1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiAhKDEgJiB0KSxcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEoMiAmIHQpLFxuICAgICAgICAgIHdyaXRhYmxlOiAhKDQgJiB0KSxcbiAgICAgICAgICB2YWx1ZTogZVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDEzKSxcbiAgICAgICAgciA9IG4oMTYpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGkocih0KSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbig3KSxcbiAgICAgICAgcyA9IG4oMTUpLFxuICAgICAgICBhID0gT2JqZWN0LFxuICAgICAgICBvID0gaShcIlwiLnNwbGl0KTtcbiAgICAgIHQuZXhwb3J0cyA9IHIoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIWEoXCJ6XCIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xuICAgICAgfSkgPyBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJTdHJpbmdcIiA9PSBzKHQpID8gbyh0LCBcIlwiKSA6IGEodCk7XG4gICAgICB9IDogYTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDkpLFxuICAgICAgICByID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgICAgICBzID0gci5jYWxsLFxuICAgICAgICBhID0gaSAmJiByLmJpbmQuYmluZChzLCBzKTtcbiAgICAgIHQuZXhwb3J0cyA9IGkgPyBhIDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcy5hcHBseSh0LCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE0KSxcbiAgICAgICAgciA9IGkoe30udG9TdHJpbmcpLFxuICAgICAgICBzID0gaShcIlwiLnNsaWNlKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBzKHIodCksIDgsIC0xKTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxNyksXG4gICAgICAgIHIgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoaSh0KSkgdGhyb3cgcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgdCk7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBudWxsID09IHQ7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTkpLFxuICAgICAgICByID0gbigyMyk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IGkodCwgXCJzdHJpbmdcIik7XG4gICAgICAgIHJldHVybiByKGUpID8gZSA6IGUgKyBcIlwiO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDgpLFxuICAgICAgICByID0gbigyMCksXG4gICAgICAgIHMgPSBuKDIzKSxcbiAgICAgICAgYSA9IG4oMzApLFxuICAgICAgICBvID0gbigzMyksXG4gICAgICAgIGwgPSBuKDM0KSxcbiAgICAgICAgYyA9IFR5cGVFcnJvcixcbiAgICAgICAgaCA9IGwoXCJ0b1ByaW1pdGl2ZVwiKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGlmICghcih0KSB8fCBzKHQpKSByZXR1cm4gdDtcbiAgICAgICAgdmFyIG4sXG4gICAgICAgICAgbCA9IGEodCwgaCk7XG4gICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gXCJkZWZhdWx0XCIpO1xuICAgICAgICAgIG4gPSBpKGwsIHQsIGUpO1xuICAgICAgICAgIGlmICghcihuKSB8fCBzKG4pKSByZXR1cm4gbjtcbiAgICAgICAgICB0aHJvdyBjKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IFwibnVtYmVyXCIpO1xuICAgICAgICByZXR1cm4gbyh0LCBlKTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyMSksXG4gICAgICAgIHIgPSBuKDIyKSxcbiAgICAgICAgcyA9IHIuYWxsO1xuICAgICAgdC5leHBvcnRzID0gci5JU19IVE1MRERBID8gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgPyBudWxsICE9PSB0IDogaSh0KSB8fCB0ID09PSBzO1xuICAgICAgfSA6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBcIm9iamVjdFwiID09IHR5cGVvZiB0ID8gbnVsbCAhPT0gdCA6IGkodCk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjIpLFxuICAgICAgICByID0gaS5hbGw7XG4gICAgICB0LmV4cG9ydHMgPSBpLklTX0hUTUxEREEgPyBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJmdW5jdGlvblwiID09IHR5cGVvZiB0IHx8IHQgPT09IHI7XG4gICAgICB9IDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdDtcbiAgICAgIH07XG4gICAgfSwgdCA9PiB7XG4gICAgICB2YXIgZSA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIGRvY3VtZW50ICYmIGRvY3VtZW50LmFsbCxcbiAgICAgICAgbiA9IHZvaWQgMCA9PT0gZSAmJiB2b2lkIDAgIT09IGU7XG4gICAgICB0LmV4cG9ydHMgPSB7XG4gICAgICAgIGFsbDogZSxcbiAgICAgICAgSVNfSFRNTEREQTogblxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDI0KSxcbiAgICAgICAgciA9IG4oMjEpLFxuICAgICAgICBzID0gbigyNSksXG4gICAgICAgIGEgPSBuKDI2KSxcbiAgICAgICAgbyA9IE9iamVjdDtcbiAgICAgIHQuZXhwb3J0cyA9IGEgPyBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJzeW1ib2xcIiA9PSB0eXBlb2YgdDtcbiAgICAgIH0gOiBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IGkoXCJTeW1ib2xcIik7XG4gICAgICAgIHJldHVybiByKGUpICYmIHMoZS5wcm90b3R5cGUsIG8odCkpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gbigyMSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyAobiA9IGlbdF0sIHIobikgPyBuIDogdm9pZCAwKSA6IGlbdF0gJiYgaVt0XVtlXTtcbiAgICAgICAgdmFyIG47XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpO1xuICAgICAgdC5leHBvcnRzID0gaSh7fS5pc1Byb3RvdHlwZU9mKTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDI3KTtcbiAgICAgIHQuZXhwb3J0cyA9IGkgJiYgIVN5bWJvbC5zaGFtICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvcjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDI4KSxcbiAgICAgICAgciA9IG4oNyksXG4gICAgICAgIHMgPSBuKDQpLlN0cmluZztcbiAgICAgIHQuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gU3ltYm9sKCk7XG4gICAgICAgIHJldHVybiAhcyh0KSB8fCAhKE9iamVjdCh0KSBpbnN0YW5jZW9mIFN5bWJvbCkgfHwgIVN5bWJvbC5zaGFtICYmIGkgJiYgaSA8IDQxO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpLFxuICAgICAgICByLFxuICAgICAgICBzID0gbig0KSxcbiAgICAgICAgYSA9IG4oMjkpLFxuICAgICAgICBvID0gcy5wcm9jZXNzLFxuICAgICAgICBsID0gcy5EZW5vLFxuICAgICAgICBjID0gbyAmJiBvLnZlcnNpb25zIHx8IGwgJiYgbC52ZXJzaW9uLFxuICAgICAgICBoID0gYyAmJiBjLnY4O1xuICAgICAgaCAmJiAociA9IChpID0gaC5zcGxpdChcIi5cIikpWzBdID4gMCAmJiBpWzBdIDwgNCA/IDEgOiArKGlbMF0gKyBpWzFdKSk7XG4gICAgICAhciAmJiBhICYmICghKGkgPSBhLm1hdGNoKC9FZGdlXFwvKFxcZCspLykpIHx8IGlbMV0gPj0gNzQpICYmIChpID0gYS5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLykpICYmIChyID0gK2lbMV0pO1xuICAgICAgdC5leHBvcnRzID0gcjtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIG5hdmlnYXRvciAmJiBTdHJpbmcobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgXCJcIjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMxKSxcbiAgICAgICAgciA9IG4oMTcpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIG4gPSB0W2VdO1xuICAgICAgICByZXR1cm4gcihuKSA/IHZvaWQgMCA6IGkobik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjEpLFxuICAgICAgICByID0gbigzMiksXG4gICAgICAgIHMgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoaSh0KSkgcmV0dXJuIHQ7XG4gICAgICAgIHRocm93IHMocih0KSArIFwiIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgICAgfTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHZhciBlID0gU3RyaW5nO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZSh0KTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiBcIk9iamVjdFwiO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOCksXG4gICAgICAgIHIgPSBuKDIxKSxcbiAgICAgICAgcyA9IG4oMjApLFxuICAgICAgICBhID0gVHlwZUVycm9yO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIG4sIG87XG4gICAgICAgIGlmIChcInN0cmluZ1wiID09PSBlICYmIHIobiA9IHQudG9TdHJpbmcpICYmICFzKG8gPSBpKG4sIHQpKSkgcmV0dXJuIG87XG4gICAgICAgIGlmIChyKG4gPSB0LnZhbHVlT2YpICYmICFzKG8gPSBpKG4sIHQpKSkgcmV0dXJuIG87XG4gICAgICAgIGlmIChcInN0cmluZ1wiICE9PSBlICYmIHIobiA9IHQudG9TdHJpbmcpICYmICFzKG8gPSBpKG4sIHQpKSkgcmV0dXJuIG87XG4gICAgICAgIHRocm93IGEoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNCksXG4gICAgICAgIHIgPSBuKDM1KSxcbiAgICAgICAgcyA9IG4oMzkpLFxuICAgICAgICBhID0gbig0MSksXG4gICAgICAgIG8gPSBuKDI3KSxcbiAgICAgICAgbCA9IG4oMjYpLFxuICAgICAgICBjID0gaS5TeW1ib2wsXG4gICAgICAgIGggPSByKFwid2tzXCIpLFxuICAgICAgICBkID0gbCA/IGMuZm9yIHx8IGMgOiBjICYmIGMud2l0aG91dFNldHRlciB8fCBhO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcyhoLCB0KSB8fCAoaFt0XSA9IG8gJiYgcyhjLCB0KSA/IGNbdF0gOiBkKFwiU3ltYm9sLlwiICsgdCkpO1xuICAgICAgICByZXR1cm4gaFt0XTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzNiksXG4gICAgICAgIHIgPSBuKDM3KTtcbiAgICAgICh0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gclt0XSB8fCAoclt0XSA9IHZvaWQgMCAhPT0gZSA/IGUgOiB7fSk7XG4gICAgICB9KShcInZlcnNpb25zXCIsIFtdKS5wdXNoKHtcbiAgICAgICAgdmVyc2lvbjogXCIzLjMxLjFcIixcbiAgICAgICAgbW9kZTogaSA/IFwicHVyZVwiIDogXCJnbG9iYWxcIixcbiAgICAgICAgY29weXJpZ2h0OiBcIsKpIDIwMTQtMjAyMyBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KVwiLFxuICAgICAgICBsaWNlbnNlOiBcImh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2Jsb2IvdjMuMzEuMS9MSUNFTlNFXCIsXG4gICAgICAgIHNvdXJjZTogXCJodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qc1wiXG4gICAgICB9KTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9ICExO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNCksXG4gICAgICAgIHIgPSBuKDM4KSxcbiAgICAgICAgcyA9IFwiX19jb3JlLWpzX3NoYXJlZF9fXCIsXG4gICAgICAgIGEgPSBpW3NdIHx8IHIocywge30pO1xuICAgICAgdC5leHBvcnRzID0gYTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByKGksIHQsIHtcbiAgICAgICAgICAgIHZhbHVlOiBlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICAgIHdyaXRhYmxlOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChuKSB7XG4gICAgICAgICAgaVt0XSA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbig0MCksXG4gICAgICAgIHMgPSBpKHt9Lmhhc093blByb3BlcnR5KTtcbiAgICAgIHQuZXhwb3J0cyA9IE9iamVjdC5oYXNPd24gfHwgZnVuY3Rpb24gaGFzT3duKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHMocih0KSwgZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTYpLFxuICAgICAgICByID0gT2JqZWN0O1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHIoaSh0KSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gMCxcbiAgICAgICAgcyA9IE1hdGgucmFuZG9tKCksXG4gICAgICAgIGEgPSBpKDEuLnRvU3RyaW5nKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBcIlN5bWJvbChcIiArICh2b2lkIDAgPT09IHQgPyBcIlwiIDogdCkgKyBcIilfXCIgKyBhKCsrciArIHMsIDM2KTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig2KSxcbiAgICAgICAgciA9IG4oNyksXG4gICAgICAgIHMgPSBuKDQzKTtcbiAgICAgIHQuZXhwb3J0cyA9ICFpICYmICFyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDcgIT0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHMoXCJkaXZcIiksIFwiYVwiLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gNztcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmE7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gbigyMCksXG4gICAgICAgIHMgPSBpLmRvY3VtZW50LFxuICAgICAgICBhID0gcihzKSAmJiByKHMuY3JlYXRlRWxlbWVudCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gYSA/IHMuY3JlYXRlRWxlbWVudCh0KSA6IHt9O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDYpLFxuICAgICAgICByID0gbig0NSksXG4gICAgICAgIHMgPSBuKDExKTtcbiAgICAgIHQuZXhwb3J0cyA9IGkgPyBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gci5mKHQsIGUsIHMoMSwgbikpO1xuICAgICAgfSA6IGZ1bmN0aW9uICh0LCBlLCBuKSB7XG4gICAgICAgIHRbZV0gPSBuO1xuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig2KSxcbiAgICAgICAgciA9IG4oNDIpLFxuICAgICAgICBzID0gbig0NiksXG4gICAgICAgIGEgPSBuKDQ3KSxcbiAgICAgICAgbyA9IG4oMTgpLFxuICAgICAgICBsID0gVHlwZUVycm9yLFxuICAgICAgICBjID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LFxuICAgICAgICBoID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgICAgICAgZCA9IFwiZW51bWVyYWJsZVwiLFxuICAgICAgICB1ID0gXCJjb25maWd1cmFibGVcIixcbiAgICAgICAgcCA9IFwid3JpdGFibGVcIjtcbiAgICAgIGUuZiA9IGkgPyBzID8gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodCwgZSwgbikge1xuICAgICAgICBhKHQpO1xuICAgICAgICBlID0gbyhlKTtcbiAgICAgICAgYShuKTtcbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdCAmJiBcInByb3RvdHlwZVwiID09PSBlICYmIFwidmFsdWVcIiBpbiBuICYmIHAgaW4gbiAmJiAhbltwXSkge1xuICAgICAgICAgIHZhciBpID0gaCh0LCBlKTtcbiAgICAgICAgICBpZiAoaSAmJiBpW3BdKSB7XG4gICAgICAgICAgICB0W2VdID0gbi52YWx1ZTtcbiAgICAgICAgICAgIG4gPSB7XG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdSBpbiBuID8gblt1XSA6IGlbdV0sXG4gICAgICAgICAgICAgIGVudW1lcmFibGU6IGQgaW4gbiA/IG5bZF0gOiBpW2RdLFxuICAgICAgICAgICAgICB3cml0YWJsZTogITFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjKHQsIGUsIG4pO1xuICAgICAgfSA6IGMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0LCBlLCBuKSB7XG4gICAgICAgIGEodCk7XG4gICAgICAgIGUgPSBvKGUpO1xuICAgICAgICBhKG4pO1xuICAgICAgICBpZiAocikgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYyh0LCBlLCBuKTtcbiAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgaWYgKFwiZ2V0XCIgaW4gbiB8fCBcInNldFwiIGluIG4pIHRocm93IGwoXCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgXCJ2YWx1ZVwiIGluIG4gJiYgKHRbZV0gPSBuLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNiksXG4gICAgICAgIHIgPSBuKDcpO1xuICAgICAgdC5leHBvcnRzID0gaSAmJiByKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDQyICE9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7fSwgXCJwcm90b3R5cGVcIiwge1xuICAgICAgICAgIHZhbHVlOiA0MixcbiAgICAgICAgICB3cml0YWJsZTogITFcbiAgICAgICAgfSkucHJvdG90eXBlO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyMCksXG4gICAgICAgIHIgPSBTdHJpbmcsXG4gICAgICAgIHMgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoaSh0KSkgcmV0dXJuIHQ7XG4gICAgICAgIHRocm93IHMocih0KSArIFwiIGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjEpLFxuICAgICAgICByID0gbig0NSksXG4gICAgICAgIHMgPSBuKDQ5KSxcbiAgICAgICAgYSA9IG4oMzgpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUsIG4sIG8pIHtcbiAgICAgICAgbyB8fCAobyA9IHt9KTtcbiAgICAgICAgdmFyIGwgPSBvLmVudW1lcmFibGUsXG4gICAgICAgICAgYyA9IHZvaWQgMCAhPT0gby5uYW1lID8gby5uYW1lIDogZTtcbiAgICAgICAgaShuKSAmJiBzKG4sIGMsIG8pO1xuICAgICAgICBpZiAoby5nbG9iYWwpIGwgPyB0W2VdID0gbiA6IGEoZSwgbik7ZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG8udW5zYWZlID8gdFtlXSAmJiAobCA9ICEwKSA6IGRlbGV0ZSB0W2VdO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgbCA/IHRbZV0gPSBuIDogci5mKHQsIGUsIHtcbiAgICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICFvLm5vbkNvbmZpZ3VyYWJsZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiAhby5ub25Xcml0YWJsZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE0KSxcbiAgICAgICAgciA9IG4oNyksXG4gICAgICAgIHMgPSBuKDIxKSxcbiAgICAgICAgYSA9IG4oMzkpLFxuICAgICAgICBvID0gbig2KSxcbiAgICAgICAgbCA9IG4oNTApLkNPTkZJR1VSQUJMRSxcbiAgICAgICAgYyA9IG4oNTEpLFxuICAgICAgICBoID0gbig1MiksXG4gICAgICAgIGQgPSBoLmVuZm9yY2UsXG4gICAgICAgIHUgPSBoLmdldCxcbiAgICAgICAgcCA9IFN0cmluZyxcbiAgICAgICAgZiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSxcbiAgICAgICAgZyA9IGkoXCJcIi5zbGljZSksXG4gICAgICAgIG0gPSBpKFwiXCIucmVwbGFjZSksXG4gICAgICAgIGIgPSBpKFtdLmpvaW4pLFxuICAgICAgICB2ID0gbyAmJiAhcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIDggIT09IGYoZnVuY3Rpb24gKCkge30sIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgICAgIHZhbHVlOiA4XG4gICAgICAgICAgfSkubGVuZ3RoO1xuICAgICAgICB9KSxcbiAgICAgICAgeSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KFwiU3RyaW5nXCIpLFxuICAgICAgICBBID0gdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUsIG4pIHtcbiAgICAgICAgICBcIlN5bWJvbChcIiA9PT0gZyhwKGUpLCAwLCA3KSAmJiAoZSA9IFwiW1wiICsgbShwKGUpLCAvXlN5bWJvbFxcKChbXildKilcXCkvLCBcIiQxXCIpICsgXCJdXCIpO1xuICAgICAgICAgIG4gJiYgbi5nZXR0ZXIgJiYgKGUgPSBcImdldCBcIiArIGUpO1xuICAgICAgICAgIG4gJiYgbi5zZXR0ZXIgJiYgKGUgPSBcInNldCBcIiArIGUpO1xuICAgICAgICAgICghYSh0LCBcIm5hbWVcIikgfHwgbCAmJiB0Lm5hbWUgIT09IGUpICYmIChvID8gZih0LCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgdmFsdWU6IGUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgICAgfSkgOiB0Lm5hbWUgPSBlKTtcbiAgICAgICAgICB2ICYmIG4gJiYgYShuLCBcImFyaXR5XCIpICYmIHQubGVuZ3RoICE9PSBuLmFyaXR5ICYmIGYodCwgXCJsZW5ndGhcIiwge1xuICAgICAgICAgICAgdmFsdWU6IG4uYXJpdHlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbiAmJiBhKG4sIFwiY29uc3RydWN0b3JcIikgJiYgbi5jb25zdHJ1Y3RvciA/IG8gJiYgZih0LCBcInByb3RvdHlwZVwiLCB7XG4gICAgICAgICAgICAgIHdyaXRhYmxlOiAhMVxuICAgICAgICAgICAgfSkgOiB0LnByb3RvdHlwZSAmJiAodC5wcm90b3R5cGUgPSB2b2lkIDApO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgdmFyIGkgPSBkKHQpO1xuICAgICAgICAgIGEoaSwgXCJzb3VyY2VcIikgfHwgKGkuc291cmNlID0gYih5LCBcInN0cmluZ1wiID09IHR5cGVvZiBlID8gZSA6IFwiXCIpKTtcbiAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfTtcbiAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IEEoZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBzKHRoaXMpICYmIHUodGhpcykuc291cmNlIHx8IGModGhpcyk7XG4gICAgICB9LCBcInRvU3RyaW5nXCIpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNiksXG4gICAgICAgIHIgPSBuKDM5KSxcbiAgICAgICAgcyA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgYSA9IGkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgICAgICAgbyA9IHIocywgXCJuYW1lXCIpLFxuICAgICAgICBsID0gbyAmJiBcInNvbWV0aGluZ1wiID09PSBmdW5jdGlvbiBzb21ldGhpbmcoKSB7fS5uYW1lLFxuICAgICAgICBjID0gbyAmJiAoIWkgfHwgaSAmJiBhKHMsIFwibmFtZVwiKS5jb25maWd1cmFibGUpO1xuICAgICAgdC5leHBvcnRzID0ge1xuICAgICAgICBFWElTVFM6IG8sXG4gICAgICAgIFBST1BFUjogbCxcbiAgICAgICAgQ09ORklHVVJBQkxFOiBjXG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigyMSksXG4gICAgICAgIHMgPSBuKDM3KSxcbiAgICAgICAgYSA9IGkoRnVuY3Rpb24udG9TdHJpbmcpO1xuICAgICAgcihzLmluc3BlY3RTb3VyY2UpIHx8IChzLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gYSh0KTtcbiAgICAgIH0pO1xuICAgICAgdC5leHBvcnRzID0gcy5pbnNwZWN0U291cmNlO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSxcbiAgICAgICAgcixcbiAgICAgICAgcyxcbiAgICAgICAgYSA9IG4oNTMpLFxuICAgICAgICBvID0gbig0KSxcbiAgICAgICAgbCA9IG4oMjApLFxuICAgICAgICBjID0gbig0NCksXG4gICAgICAgIGggPSBuKDM5KSxcbiAgICAgICAgZCA9IG4oMzcpLFxuICAgICAgICB1ID0gbig1NCksXG4gICAgICAgIHAgPSBuKDU1KSxcbiAgICAgICAgZiA9IFwiT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWRcIixcbiAgICAgICAgZyA9IG8uVHlwZUVycm9yLFxuICAgICAgICBtID0gby5XZWFrTWFwO1xuICAgICAgaWYgKGEgfHwgZC5zdGF0ZSkge1xuICAgICAgICB2YXIgYiA9IGQuc3RhdGUgfHwgKGQuc3RhdGUgPSBuZXcgbSgpKTtcbiAgICAgICAgYi5nZXQgPSBiLmdldDtcbiAgICAgICAgYi5oYXMgPSBiLmhhcztcbiAgICAgICAgYi5zZXQgPSBiLnNldDtcbiAgICAgICAgaSA9IGZ1bmN0aW9uIGkodCwgZSkge1xuICAgICAgICAgIGlmIChiLmhhcyh0KSkgdGhyb3cgZyhmKTtcbiAgICAgICAgICBlLmZhY2FkZSA9IHQ7XG4gICAgICAgICAgYi5zZXQodCwgZSk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH07XG4gICAgICAgIHIgPSBmdW5jdGlvbiByKHQpIHtcbiAgICAgICAgICByZXR1cm4gYi5nZXQodCkgfHwge307XG4gICAgICAgIH07XG4gICAgICAgIHMgPSBmdW5jdGlvbiBzKHQpIHtcbiAgICAgICAgICByZXR1cm4gYi5oYXModCk7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdiA9IHUoXCJzdGF0ZVwiKTtcbiAgICAgICAgcFt2XSA9ICEwO1xuICAgICAgICBpID0gZnVuY3Rpb24gaSh0LCBlKSB7XG4gICAgICAgICAgaWYgKGgodCwgdikpIHRocm93IGcoZik7XG4gICAgICAgICAgZS5mYWNhZGUgPSB0O1xuICAgICAgICAgIGModCwgdiwgZSk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH07XG4gICAgICAgIHIgPSBmdW5jdGlvbiByKHQpIHtcbiAgICAgICAgICByZXR1cm4gaCh0LCB2KSA/IHRbdl0gOiB7fTtcbiAgICAgICAgfTtcbiAgICAgICAgcyA9IGZ1bmN0aW9uIHModCkge1xuICAgICAgICAgIHJldHVybiBoKHQsIHYpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdC5leHBvcnRzID0ge1xuICAgICAgICBzZXQ6IGksXG4gICAgICAgIGdldDogcixcbiAgICAgICAgaGFzOiBzLFxuICAgICAgICBlbmZvcmNlOiBmdW5jdGlvbiBlbmZvcmNlKHQpIHtcbiAgICAgICAgICByZXR1cm4gcyh0KSA/IHIodCkgOiBpKHQsIHt9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0dGVyRm9yOiBmdW5jdGlvbiBnZXR0ZXJGb3IodCkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyIG47XG4gICAgICAgICAgICBpZiAoIWwoZSkgfHwgKG4gPSByKGUpKS50eXBlICE9PSB0KSB0aHJvdyBnKFwiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCBcIiArIHQgKyBcIiByZXF1aXJlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig0KSxcbiAgICAgICAgciA9IG4oMjEpLFxuICAgICAgICBzID0gaS5XZWFrTWFwO1xuICAgICAgdC5leHBvcnRzID0gcihzKSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoU3RyaW5nKHMpKTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDM1KSxcbiAgICAgICAgciA9IG4oNDEpLFxuICAgICAgICBzID0gaShcImtleXNcIik7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gc1t0XSB8fCAoc1t0XSA9IHIodCkpO1xuICAgICAgfTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IHt9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMzkpLFxuICAgICAgICByID0gbig1NyksXG4gICAgICAgIHMgPSBuKDUpLFxuICAgICAgICBhID0gbig0NSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICBmb3IgKHZhciBvID0gcihlKSwgbCA9IGEuZiwgYyA9IHMuZiwgaCA9IDA7IGggPCBvLmxlbmd0aDsgaCsrKSB7XG4gICAgICAgICAgdmFyIGQgPSBvW2hdO1xuICAgICAgICAgIGkodCwgZCkgfHwgbiAmJiBpKG4sIGQpIHx8IGwodCwgZCwgYyhlLCBkKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyNCksXG4gICAgICAgIHIgPSBuKDE0KSxcbiAgICAgICAgcyA9IG4oNTgpLFxuICAgICAgICBhID0gbig2NyksXG4gICAgICAgIG8gPSBuKDQ3KSxcbiAgICAgICAgbCA9IHIoW10uY29uY2F0KTtcbiAgICAgIHQuZXhwb3J0cyA9IGkoXCJSZWZsZWN0XCIsIFwib3duS2V5c1wiKSB8fCBmdW5jdGlvbiBvd25LZXlzKHQpIHtcbiAgICAgICAgdmFyIGUgPSBzLmYobyh0KSksXG4gICAgICAgICAgbiA9IGEuZjtcbiAgICAgICAgcmV0dXJuIG4gPyBsKGUsIG4odCkpIDogZTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig1OSksXG4gICAgICAgIHIgPSBuKDY2KS5jb25jYXQoXCJsZW5ndGhcIiwgXCJwcm90b3R5cGVcIik7XG4gICAgICBlLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKHQpIHtcbiAgICAgICAgcmV0dXJuIGkodCwgcik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigzOSksXG4gICAgICAgIHMgPSBuKDEyKSxcbiAgICAgICAgYSA9IG4oNjApLmluZGV4T2YsXG4gICAgICAgIG8gPSBuKDU1KSxcbiAgICAgICAgbCA9IGkoW10ucHVzaCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgbixcbiAgICAgICAgICBpID0gcyh0KSxcbiAgICAgICAgICBjID0gMCxcbiAgICAgICAgICBoID0gW107XG4gICAgICAgIGZvciAobiBpbiBpKSAhcihvLCBuKSAmJiByKGksIG4pICYmIGwoaCwgbik7XG4gICAgICAgIGZvciAoOyBlLmxlbmd0aCA+IGM7KSByKGksIG4gPSBlW2MrK10pICYmICh+YShoLCBuKSB8fCBsKGgsIG4pKTtcbiAgICAgICAgcmV0dXJuIGg7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTIpLFxuICAgICAgICByID0gbig2MSksXG4gICAgICAgIHMgPSBuKDY0KSxcbiAgICAgICAgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gY3JlYXRlTWV0aG9kKHQpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIG4sIGEpIHtcbiAgICAgICAgICAgIHZhciBvLFxuICAgICAgICAgICAgICBsID0gaShlKSxcbiAgICAgICAgICAgICAgYyA9IHMobCksXG4gICAgICAgICAgICAgIGggPSByKGEsIGMpO1xuICAgICAgICAgICAgaWYgKHQgJiYgbiAhPSBuKSB7XG4gICAgICAgICAgICAgIGZvciAoOyBjID4gaDspIGlmICgobyA9IGxbaCsrXSkgIT0gbykgcmV0dXJuICEwO1xuICAgICAgICAgICAgfSBlbHNlIGZvciAoOyBjID4gaDsgaCsrKSBpZiAoKHQgfHwgaCBpbiBsKSAmJiBsW2hdID09PSBuKSByZXR1cm4gdCB8fCBoIHx8IDA7XG4gICAgICAgICAgICByZXR1cm4gIXQgJiYgLTE7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIHQuZXhwb3J0cyA9IHtcbiAgICAgICAgaW5jbHVkZXM6IGNyZWF0ZU1ldGhvZCghMCksXG4gICAgICAgIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZCghMSlcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig2MiksXG4gICAgICAgIHIgPSBNYXRoLm1heCxcbiAgICAgICAgcyA9IE1hdGgubWluO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIG4gPSBpKHQpO1xuICAgICAgICByZXR1cm4gbiA8IDAgPyByKG4gKyBlLCAwKSA6IHMobiwgZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNjMpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSArdDtcbiAgICAgICAgcmV0dXJuIGUgIT0gZSB8fCAwID09PSBlID8gMCA6IGkoZSk7XG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdmFyIGUgPSBNYXRoLmNlaWwsXG4gICAgICAgIG4gPSBNYXRoLmZsb29yO1xuICAgICAgdC5leHBvcnRzID0gTWF0aC50cnVuYyB8fCBmdW5jdGlvbiB0cnVuYyh0KSB7XG4gICAgICAgIHZhciBpID0gK3Q7XG4gICAgICAgIHJldHVybiAoaSA+IDAgPyBuIDogZSkoaSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNjUpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGkodC5sZW5ndGgpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDYyKSxcbiAgICAgICAgciA9IE1hdGgubWluO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPiAwID8gcihpKHQpLCA5MDA3MTk5MjU0NzQwOTkxKSA6IDA7XG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0gW1wiY29uc3RydWN0b3JcIiwgXCJoYXNPd25Qcm9wZXJ0eVwiLCBcImlzUHJvdG90eXBlT2ZcIiwgXCJwcm9wZXJ0eUlzRW51bWVyYWJsZVwiLCBcInRvTG9jYWxlU3RyaW5nXCIsIFwidG9TdHJpbmdcIiwgXCJ2YWx1ZU9mXCJdO1xuICAgIH0sICh0LCBlKSA9PiB7XG4gICAgICBlLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNyksXG4gICAgICAgIHIgPSBuKDIxKSxcbiAgICAgICAgcyA9IC8jfFxcLnByb3RvdHlwZVxcLi8sXG4gICAgICAgIGlzRm9yY2VkID0gZnVuY3Rpb24gaXNGb3JjZWQodCwgZSkge1xuICAgICAgICAgIHZhciBuID0gb1thKHQpXTtcbiAgICAgICAgICByZXR1cm4gbiA9PSBjIHx8IG4gIT0gbCAmJiAocihlKSA/IGkoZSkgOiAhIWUpO1xuICAgICAgICB9LFxuICAgICAgICBhID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UocywgXCIuXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG8gPSBpc0ZvcmNlZC5kYXRhID0ge30sXG4gICAgICAgIGwgPSBpc0ZvcmNlZC5OQVRJVkUgPSBcIk5cIixcbiAgICAgICAgYyA9IGlzRm9yY2VkLlBPTFlGSUxMID0gXCJQXCI7XG4gICAgICB0LmV4cG9ydHMgPSBpc0ZvcmNlZDtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDkpLFxuICAgICAgICByID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgICAgICBzID0gci5hcHBseSxcbiAgICAgICAgYSA9IHIuY2FsbDtcbiAgICAgIHQuZXhwb3J0cyA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIFJlZmxlY3QgJiYgUmVmbGVjdC5hcHBseSB8fCAoaSA/IGEuYmluZChzKSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGEuYXBwbHkocywgYXJndW1lbnRzKTtcbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDI0KSxcbiAgICAgICAgciA9IG4oMzkpLFxuICAgICAgICBzID0gbig0NCksXG4gICAgICAgIGEgPSBuKDI1KSxcbiAgICAgICAgbyA9IG4oNzEpLFxuICAgICAgICBsID0gbig1NiksXG4gICAgICAgIGMgPSBuKDc0KSxcbiAgICAgICAgaCA9IG4oNzUpLFxuICAgICAgICBkID0gbig3NiksXG4gICAgICAgIHUgPSBuKDgwKSxcbiAgICAgICAgcCA9IG4oODEpLFxuICAgICAgICBmID0gbig2KSxcbiAgICAgICAgZyA9IG4oMzYpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUsIG4sIG0pIHtcbiAgICAgICAgdmFyIGIgPSBcInN0YWNrVHJhY2VMaW1pdFwiLFxuICAgICAgICAgIHYgPSBtID8gMiA6IDEsXG4gICAgICAgICAgeSA9IHQuc3BsaXQoXCIuXCIpLFxuICAgICAgICAgIEEgPSB5W3kubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgXyA9IGkuYXBwbHkobnVsbCwgeSk7XG4gICAgICAgIGlmIChfKSB7XG4gICAgICAgICAgdmFyIFMgPSBfLnByb3RvdHlwZTtcbiAgICAgICAgICAhZyAmJiByKFMsIFwiY2F1c2VcIikgJiYgZGVsZXRlIFMuY2F1c2U7XG4gICAgICAgICAgaWYgKCFuKSByZXR1cm4gXztcbiAgICAgICAgICB2YXIgRSA9IGkoXCJFcnJvclwiKSxcbiAgICAgICAgICAgIHggPSBlKGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgIHZhciBuID0gZChtID8gZSA6IHQsIHZvaWQgMCksXG4gICAgICAgICAgICAgICAgaSA9IG0gPyBuZXcgXyh0KSA6IG5ldyBfKCk7XG4gICAgICAgICAgICAgIHZvaWQgMCAhPT0gbiAmJiBzKGksIFwibWVzc2FnZVwiLCBuKTtcbiAgICAgICAgICAgICAgcChpLCB4LCBpLnN0YWNrLCAyKTtcbiAgICAgICAgICAgICAgdGhpcyAmJiBhKFMsIHRoaXMpICYmIGgoaSwgdGhpcywgeCk7XG4gICAgICAgICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiB2ICYmIHUoaSwgYXJndW1lbnRzW3ZdKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB4LnByb3RvdHlwZSA9IFM7XG4gICAgICAgICAgaWYgKFwiRXJyb3JcIiAhPT0gQSkgbyA/IG8oeCwgRSkgOiBsKHgsIEUsIHtcbiAgICAgICAgICAgIG5hbWU6ICEwXG4gICAgICAgICAgfSk7ZWxzZSBpZiAoZiAmJiBiIGluIF8pIHtcbiAgICAgICAgICAgIGMoeCwgXywgYik7XG4gICAgICAgICAgICBjKHgsIF8sIFwicHJlcGFyZVN0YWNrVHJhY2VcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGwoeCwgXyk7XG4gICAgICAgICAgaWYgKCFnKSB0cnkge1xuICAgICAgICAgICAgUy5uYW1lICE9PSBBICYmIHMoUywgXCJuYW1lXCIsIEEpO1xuICAgICAgICAgICAgUy5jb25zdHJ1Y3RvciA9IHg7XG4gICAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDcyKSxcbiAgICAgICAgciA9IG4oNDcpLFxuICAgICAgICBzID0gbig3Myk7XG4gICAgICB0LmV4cG9ydHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKFwiX19wcm90b19fXCIgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0LFxuICAgICAgICAgIGUgPSAhMSxcbiAgICAgICAgICBuID0ge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgKHQgPSBpKE9iamVjdC5wcm90b3R5cGUsIFwiX19wcm90b19fXCIsIFwic2V0XCIpKShuLCBbXSk7XG4gICAgICAgICAgZSA9IG4gaW5zdGFuY2VvZiBBcnJheTtcbiAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKG4sIGkpIHtcbiAgICAgICAgICByKG4pO1xuICAgICAgICAgIHMoaSk7XG4gICAgICAgICAgZSA/IHQobiwgaSkgOiBuLl9fcHJvdG9fXyA9IGk7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH07XG4gICAgICB9KCkgOiB2b2lkIDApO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigzMSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBpKHIoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCBlKVtuXSkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7fVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDIxKSxcbiAgICAgICAgciA9IFN0cmluZyxcbiAgICAgICAgcyA9IFR5cGVFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmIChcIm9iamVjdFwiID09IHR5cGVvZiB0IHx8IGkodCkpIHJldHVybiB0O1xuICAgICAgICB0aHJvdyBzKFwiQ2FuJ3Qgc2V0IFwiICsgcih0KSArIFwiIGFzIGEgcHJvdG90eXBlXCIpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQ1KS5mO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUsIG4pIHtcbiAgICAgICAgbiBpbiB0IHx8IGkodCwgbiwge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gZVtuXTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24gc2V0KHQpIHtcbiAgICAgICAgICAgIGVbbl0gPSB0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjEpLFxuICAgICAgICByID0gbigyMCksXG4gICAgICAgIHMgPSBuKDcxKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuKSB7XG4gICAgICAgIHZhciBhLCBvO1xuICAgICAgICBzICYmIGkoYSA9IGUuY29uc3RydWN0b3IpICYmIGEgIT09IG4gJiYgcihvID0gYS5wcm90b3R5cGUpICYmIG8gIT09IG4ucHJvdG90eXBlICYmIHModCwgbyk7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDc3KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgPT09IHQgPyBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IFwiXCIgOiBlIDogaSh0KTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig3OCksXG4gICAgICAgIHIgPSBTdHJpbmc7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoXCJTeW1ib2xcIiA9PT0gaSh0KSkgdGhyb3cgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmdcIik7XG4gICAgICAgIHJldHVybiByKHQpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDc5KSxcbiAgICAgICAgciA9IG4oMjEpLFxuICAgICAgICBzID0gbigxNSksXG4gICAgICAgIGEgPSBuKDM0KShcInRvU3RyaW5nVGFnXCIpLFxuICAgICAgICBvID0gT2JqZWN0LFxuICAgICAgICBsID0gXCJBcmd1bWVudHNcIiA9PSBzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzO1xuICAgICAgICB9KCkpO1xuICAgICAgdC5leHBvcnRzID0gaSA/IHMgOiBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSwgbiwgaTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdCA/IFwiVW5kZWZpbmVkXCIgOiBudWxsID09PSB0ID8gXCJOdWxsXCIgOiBcInN0cmluZ1wiID09IHR5cGVvZiAobiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0W2VdO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgIH0oZSA9IG8odCksIGEpKSA/IG4gOiBsID8gcyhlKSA6IFwiT2JqZWN0XCIgPT0gKGkgPSBzKGUpKSAmJiByKGUuY2FsbGVlKSA/IFwiQXJndW1lbnRzXCIgOiBpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSB7fTtcbiAgICAgIGlbbigzNCkoXCJ0b1N0cmluZ1RhZ1wiKV0gPSBcInpcIjtcbiAgICAgIHQuZXhwb3J0cyA9IFwiW29iamVjdCB6XVwiID09PSBTdHJpbmcoaSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyMCksXG4gICAgICAgIHIgPSBuKDQ0KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGkoZSkgJiYgXCJjYXVzZVwiIGluIGUgJiYgcih0LCBcImNhdXNlXCIsIGUuY2F1c2UpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQ0KSxcbiAgICAgICAgciA9IG4oODIpLFxuICAgICAgICBzID0gbig4MyksXG4gICAgICAgIGEgPSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuLCBvKSB7XG4gICAgICAgIHMgJiYgKGEgPyBhKHQsIGUpIDogaSh0LCBcInN0YWNrXCIsIHIobiwgbykpKTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxNCksXG4gICAgICAgIHIgPSBFcnJvcixcbiAgICAgICAgcyA9IGkoXCJcIi5yZXBsYWNlKSxcbiAgICAgICAgYSA9IFN0cmluZyhyKFwienhjYXNkXCIpLnN0YWNrKSxcbiAgICAgICAgbyA9IC9cXG5cXHMqYXQgW146XSo6W15cXG5dKi8sXG4gICAgICAgIGwgPSBvLnRlc3QoYSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBpZiAobCAmJiBcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmICFyLnByZXBhcmVTdGFja1RyYWNlKSBmb3IgKDsgZS0tOykgdCA9IHModCwgbywgXCJcIik7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDcpLFxuICAgICAgICByID0gbigxMSk7XG4gICAgICB0LmV4cG9ydHMgPSAhaShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gRXJyb3IoXCJhXCIpO1xuICAgICAgICBpZiAoIShcInN0YWNrXCIgaW4gdCkpIHJldHVybiAhMDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwic3RhY2tcIiwgcigxLCA3KSk7XG4gICAgICAgIHJldHVybiA3ICE9PSB0LnN0YWNrO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oNDgpLFxuICAgICAgICByID0gbigxNCksXG4gICAgICAgIHMgPSBuKDc3KSxcbiAgICAgICAgYSA9IG4oODUpLFxuICAgICAgICBvID0gVVJMU2VhcmNoUGFyYW1zLFxuICAgICAgICBsID0gby5wcm90b3R5cGUsXG4gICAgICAgIGMgPSByKGwuYXBwZW5kKSxcbiAgICAgICAgaCA9IHIobC5kZWxldGUpLFxuICAgICAgICBkID0gcihsLmZvckVhY2gpLFxuICAgICAgICB1ID0gcihbXS5wdXNoKSxcbiAgICAgICAgcCA9IG5ldyBvKFwiYT0xJmE9MlwiKTtcbiAgICAgIHAuZGVsZXRlKFwiYVwiLCAxKTtcbiAgICAgIHAgKyBcIlwiICE9IFwiYT0yXCIgJiYgaShsLCBcImRlbGV0ZVwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgbiA9IGUgPCAyID8gdm9pZCAwIDogYXJndW1lbnRzWzFdO1xuICAgICAgICBpZiAoZSAmJiB2b2lkIDAgPT09IG4pIHJldHVybiBoKHRoaXMsIHQpO1xuICAgICAgICB2YXIgaSA9IFtdO1xuICAgICAgICBkKHRoaXMsIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdShpLCB7XG4gICAgICAgICAgICBrZXk6IGUsXG4gICAgICAgICAgICB2YWx1ZTogdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYShlLCAxKTtcbiAgICAgICAgZm9yICh2YXIgciwgbyA9IHModCksIGwgPSBzKG4pLCBwID0gMCwgZiA9IDAsIGcgPSAhMSwgbSA9IGkubGVuZ3RoOyBwIDwgbTspIHtcbiAgICAgICAgICByID0gaVtwKytdO1xuICAgICAgICAgIGlmIChnIHx8IHIua2V5ID09PSBvKSB7XG4gICAgICAgICAgICBnID0gITA7XG4gICAgICAgICAgICBoKHRoaXMsIHIua2V5KTtcbiAgICAgICAgICB9IGVsc2UgZisrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBmIDwgbTspIChyID0gaVtmKytdKS5rZXkgPT09IG8gJiYgci52YWx1ZSA9PT0gbCB8fCBjKHRoaXMsIHIua2V5LCByLnZhbHVlKTtcbiAgICAgIH0sIHtcbiAgICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICAgIHVuc2FmZTogITBcbiAgICAgIH0pO1xuICAgIH0sIHQgPT4ge1xuICAgICAgdmFyIGUgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgbikge1xuICAgICAgICBpZiAodCA8IG4pIHRocm93IGUoXCJOb3QgZW5vdWdoIGFyZ3VtZW50c1wiKTtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDQ4KSxcbiAgICAgICAgciA9IG4oMTQpLFxuICAgICAgICBzID0gbig3NyksXG4gICAgICAgIGEgPSBuKDg1KSxcbiAgICAgICAgbyA9IFVSTFNlYXJjaFBhcmFtcyxcbiAgICAgICAgbCA9IG8ucHJvdG90eXBlLFxuICAgICAgICBjID0gcihsLmdldEFsbCksXG4gICAgICAgIGggPSByKGwuaGFzKTtcbiAgICAgIG5ldyBvKFwiYT0xXCIpLmhhcyhcImFcIiwgMikgJiYgaShsLCBcImhhc1wiLCBmdW5jdGlvbiBoYXModCkge1xuICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgbiA9IGUgPCAyID8gdm9pZCAwIDogYXJndW1lbnRzWzFdO1xuICAgICAgICBpZiAoZSAmJiB2b2lkIDAgPT09IG4pIHJldHVybiBoKHRoaXMsIHQpO1xuICAgICAgICB2YXIgaSA9IGModGhpcywgdCk7XG4gICAgICAgIGEoZSwgMSk7XG4gICAgICAgIGZvciAodmFyIHIgPSBzKG4pLCBvID0gMDsgbyA8IGkubGVuZ3RoOykgaWYgKGlbbysrXSA9PT0gcikgcmV0dXJuICEwO1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCB7XG4gICAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgICB1bnNhZmU6ICEwXG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbig2KSxcbiAgICAgICAgciA9IG4oMTQpLFxuICAgICAgICBzID0gbig4OCksXG4gICAgICAgIGEgPSBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLFxuICAgICAgICBvID0gcihhLmZvckVhY2gpO1xuICAgICAgaSAmJiAhKFwic2l6ZVwiIGluIGEpICYmIHMoYSwgXCJzaXplXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBzaXplKCkge1xuICAgICAgICAgIHZhciB0ID0gMDtcbiAgICAgICAgICBvKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHQrKztcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgZW51bWVyYWJsZTogITBcbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNDkpLFxuICAgICAgICByID0gbig0NSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICBuLmdldCAmJiBpKG4uZ2V0LCBlLCB7XG4gICAgICAgICAgZ2V0dGVyOiAhMFxuICAgICAgICB9KTtcbiAgICAgICAgbi5zZXQgJiYgaShuLnNldCwgZSwge1xuICAgICAgICAgIHNldHRlcjogITBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByLmYodCwgZSwgbik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbig0MCksXG4gICAgICAgIHMgPSBuKDY0KSxcbiAgICAgICAgYSA9IG4oOTApLFxuICAgICAgICBvID0gbig5Mik7XG4gICAgICBpKHtcbiAgICAgICAgdGFyZ2V0OiBcIkFycmF5XCIsXG4gICAgICAgIHByb3RvOiAhMCxcbiAgICAgICAgYXJpdHk6IDEsXG4gICAgICAgIGZvcmNlZDogbig3KShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIDQyOTQ5NjcyOTcgIT09IFtdLnB1c2guY2FsbCh7XG4gICAgICAgICAgICBsZW5ndGg6IDQyOTQ5NjcyOTZcbiAgICAgICAgICB9LCAxKTtcbiAgICAgICAgfSkgfHwgIWZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCBcImxlbmd0aFwiLCB7XG4gICAgICAgICAgICAgIHdyaXRhYmxlOiAhMVxuICAgICAgICAgICAgfSkucHVzaCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSgpXG4gICAgICB9LCB7XG4gICAgICAgIHB1c2g6IGZ1bmN0aW9uIHB1c2godCkge1xuICAgICAgICAgIHZhciBlID0gcih0aGlzKSxcbiAgICAgICAgICAgIG4gPSBzKGUpLFxuICAgICAgICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgbyhuICsgaSk7XG4gICAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBpOyBsKyspIHtcbiAgICAgICAgICAgIGVbbl0gPSBhcmd1bWVudHNbbF07XG4gICAgICAgICAgICBuKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGEoZSwgbik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDYpLFxuICAgICAgICByID0gbig5MSksXG4gICAgICAgIHMgPSBUeXBlRXJyb3IsXG4gICAgICAgIGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAgICAgICBvID0gaSAmJiAhZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHRoaXMpIHJldHVybiAhMDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCBcImxlbmd0aFwiLCB7XG4gICAgICAgICAgICAgIHdyaXRhYmxlOiAhMVxuICAgICAgICAgICAgfSkubGVuZ3RoID0gMTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0oKTtcbiAgICAgIHQuZXhwb3J0cyA9IG8gPyBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBpZiAocih0KSAmJiAhYSh0LCBcImxlbmd0aFwiKS53cml0YWJsZSkgdGhyb3cgcyhcIkNhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGhcIik7XG4gICAgICAgIHJldHVybiB0Lmxlbmd0aCA9IGU7XG4gICAgICB9IDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHQubGVuZ3RoID0gZTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxNSk7XG4gICAgICB0LmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkodCkge1xuICAgICAgICByZXR1cm4gXCJBcnJheVwiID09IGkodCk7XG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdmFyIGUgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodCA+IDkwMDcxOTkyNTQ3NDA5OTEpIHRocm93IGUoXCJNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWRcIik7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbig5NCksXG4gICAgICAgIHIgPSBuKDk4KS5maW5kTGFzdCxcbiAgICAgICAgcyA9IGkuYVR5cGVkQXJyYXk7XG4gICAgICAoMCwgaS5leHBvcnRUeXBlZEFycmF5TWV0aG9kKShcImZpbmRMYXN0XCIsIGZ1bmN0aW9uIGZpbmRMYXN0KHQpIHtcbiAgICAgICAgcmV0dXJuIHIocyh0aGlzKSwgdCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDApO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSxcbiAgICAgICAgcixcbiAgICAgICAgcyxcbiAgICAgICAgYSA9IG4oOTUpLFxuICAgICAgICBvID0gbig2KSxcbiAgICAgICAgbCA9IG4oNCksXG4gICAgICAgIGMgPSBuKDIxKSxcbiAgICAgICAgaCA9IG4oMjApLFxuICAgICAgICBkID0gbigzOSksXG4gICAgICAgIHUgPSBuKDc4KSxcbiAgICAgICAgcCA9IG4oMzIpLFxuICAgICAgICBmID0gbig0NCksXG4gICAgICAgIGcgPSBuKDQ4KSxcbiAgICAgICAgbSA9IG4oODgpLFxuICAgICAgICBiID0gbigyNSksXG4gICAgICAgIHYgPSBuKDk2KSxcbiAgICAgICAgeSA9IG4oNzEpLFxuICAgICAgICBBID0gbigzNCksXG4gICAgICAgIF8gPSBuKDQxKSxcbiAgICAgICAgUyA9IG4oNTIpLFxuICAgICAgICBFID0gUy5lbmZvcmNlLFxuICAgICAgICB4ID0gUy5nZXQsXG4gICAgICAgIHcgPSBsLkludDhBcnJheSxcbiAgICAgICAgQyA9IHcgJiYgdy5wcm90b3R5cGUsXG4gICAgICAgIFQgPSBsLlVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICBQID0gVCAmJiBULnByb3RvdHlwZSxcbiAgICAgICAgayA9IHcgJiYgdih3KSxcbiAgICAgICAgTSA9IEMgJiYgdihDKSxcbiAgICAgICAgUiA9IE9iamVjdC5wcm90b3R5cGUsXG4gICAgICAgIEkgPSBsLlR5cGVFcnJvcixcbiAgICAgICAgRCA9IEEoXCJ0b1N0cmluZ1RhZ1wiKSxcbiAgICAgICAgTyA9IF8oXCJUWVBFRF9BUlJBWV9UQUdcIiksXG4gICAgICAgIEwgPSBcIlR5cGVkQXJyYXlDb25zdHJ1Y3RvclwiLFxuICAgICAgICBOID0gYSAmJiAhIXkgJiYgXCJPcGVyYVwiICE9PSB1KGwub3BlcmEpLFxuICAgICAgICBCID0gITEsXG4gICAgICAgIGogPSB7XG4gICAgICAgICAgSW50OEFycmF5OiAxLFxuICAgICAgICAgIFVpbnQ4QXJyYXk6IDEsXG4gICAgICAgICAgVWludDhDbGFtcGVkQXJyYXk6IDEsXG4gICAgICAgICAgSW50MTZBcnJheTogMixcbiAgICAgICAgICBVaW50MTZBcnJheTogMixcbiAgICAgICAgICBJbnQzMkFycmF5OiA0LFxuICAgICAgICAgIFVpbnQzMkFycmF5OiA0LFxuICAgICAgICAgIEZsb2F0MzJBcnJheTogNCxcbiAgICAgICAgICBGbG9hdDY0QXJyYXk6IDhcbiAgICAgICAgfSxcbiAgICAgICAgVSA9IHtcbiAgICAgICAgICBCaWdJbnQ2NEFycmF5OiA4LFxuICAgICAgICAgIEJpZ1VpbnQ2NEFycmF5OiA4XG4gICAgICAgIH0sXG4gICAgICAgIGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIGdldFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIGUgPSB2KHQpO1xuICAgICAgICAgIGlmIChoKGUpKSB7XG4gICAgICAgICAgICB2YXIgbiA9IHgoZSk7XG4gICAgICAgICAgICByZXR1cm4gbiAmJiBkKG4sIEwpID8gbltMXSA6IGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIGlzVHlwZWRBcnJheSh0KSB7XG4gICAgICAgICAgaWYgKCFoKHQpKSByZXR1cm4gITE7XG4gICAgICAgICAgdmFyIGUgPSB1KHQpO1xuICAgICAgICAgIHJldHVybiBkKGosIGUpIHx8IGQoVSwgZSk7XG4gICAgICAgIH07XG4gICAgICBmb3IgKGkgaW4gaikgKHMgPSAociA9IGxbaV0pICYmIHIucHJvdG90eXBlKSA/IEUocylbTF0gPSByIDogTiA9ICExO1xuICAgICAgZm9yIChpIGluIFUpIChzID0gKHIgPSBsW2ldKSAmJiByLnByb3RvdHlwZSkgJiYgKEUocylbTF0gPSByKTtcbiAgICAgIGlmICghTiB8fCAhYyhrKSB8fCBrID09PSBGdW5jdGlvbi5wcm90b3R5cGUpIHtcbiAgICAgICAgayA9IGZ1bmN0aW9uIFR5cGVkQXJyYXkoKSB7XG4gICAgICAgICAgdGhyb3cgSShcIkluY29ycmVjdCBpbnZvY2F0aW9uXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoTikgZm9yIChpIGluIGopIGxbaV0gJiYgeShsW2ldLCBrKTtcbiAgICAgIH1cbiAgICAgIGlmICghTiB8fCAhTSB8fCBNID09PSBSKSB7XG4gICAgICAgIE0gPSBrLnByb3RvdHlwZTtcbiAgICAgICAgaWYgKE4pIGZvciAoaSBpbiBqKSBsW2ldICYmIHkobFtpXS5wcm90b3R5cGUsIE0pO1xuICAgICAgfVxuICAgICAgTiAmJiB2KFApICE9PSBNICYmIHkoUCwgTSk7XG4gICAgICBpZiAobyAmJiAhZChNLCBEKSkge1xuICAgICAgICBCID0gITA7XG4gICAgICAgIG0oTSwgRCwge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gaCh0aGlzKSA/IHRoaXNbT10gOiB2b2lkIDA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChpIGluIGopIGxbaV0gJiYgZihsW2ldLCBPLCBpKTtcbiAgICAgIH1cbiAgICAgIHQuZXhwb3J0cyA9IHtcbiAgICAgICAgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzogTixcbiAgICAgICAgVFlQRURfQVJSQVlfVEFHOiBCICYmIE8sXG4gICAgICAgIGFUeXBlZEFycmF5OiBmdW5jdGlvbiBhVHlwZWRBcnJheSh0KSB7XG4gICAgICAgICAgaWYgKGlzVHlwZWRBcnJheSh0KSkgcmV0dXJuIHQ7XG4gICAgICAgICAgdGhyb3cgSShcIlRhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheVwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjogZnVuY3Rpb24gYVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgaWYgKGModCkgJiYgKCF5IHx8IGIoaywgdCkpKSByZXR1cm4gdDtcbiAgICAgICAgICB0aHJvdyBJKHAodCkgKyBcIiBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvclwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXhwb3J0VHlwZWRBcnJheU1ldGhvZDogZnVuY3Rpb24gZXhwb3J0VHlwZWRBcnJheU1ldGhvZCh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICAgIGlmIChuKSBmb3IgKHZhciByIGluIGopIHtcbiAgICAgICAgICAgICAgdmFyIHMgPSBsW3JdO1xuICAgICAgICAgICAgICBpZiAocyAmJiBkKHMucHJvdG90eXBlLCB0KSkgdHJ5IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcy5wcm90b3R5cGVbdF07XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgcy5wcm90b3R5cGVbdF0gPSBlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE1bdF0gJiYgIW4gfHwgZyhNLCB0LCBuID8gZSA6IE4gJiYgQ1t0XSB8fCBlLCBpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q6IGZ1bmN0aW9uIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QodCwgZSwgbikge1xuICAgICAgICAgIHZhciBpLCByO1xuICAgICAgICAgIGlmIChvKSB7XG4gICAgICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgICBpZiAobikgZm9yIChpIGluIGopIGlmICgociA9IGxbaV0pICYmIGQociwgdCkpIHRyeSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHJbdF07XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICAgIGlmIChrW3RdICYmICFuKSByZXR1cm47XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGcoaywgdCwgbiA/IGUgOiBOICYmIGtbdF0gfHwgZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgaW4gaikgIShyID0gbFtpXSkgfHwgclt0XSAmJiAhbiB8fCBnKHIsIHQsIGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yOiBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IsXG4gICAgICAgIGlzVmlldzogZnVuY3Rpb24gaXNWaWV3KHQpIHtcbiAgICAgICAgICBpZiAoIWgodCkpIHJldHVybiAhMTtcbiAgICAgICAgICB2YXIgZSA9IHUodCk7XG4gICAgICAgICAgcmV0dXJuIFwiRGF0YVZpZXdcIiA9PT0gZSB8fCBkKGosIGUpIHx8IGQoVSwgZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGlzVHlwZWRBcnJheTogaXNUeXBlZEFycmF5LFxuICAgICAgICBUeXBlZEFycmF5OiBrLFxuICAgICAgICBUeXBlZEFycmF5UHJvdG90eXBlOiBNXG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgQXJyYXlCdWZmZXIgJiYgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgRGF0YVZpZXc7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzOSksXG4gICAgICAgIHIgPSBuKDIxKSxcbiAgICAgICAgcyA9IG4oNDApLFxuICAgICAgICBhID0gbig1NCksXG4gICAgICAgIG8gPSBuKDk3KSxcbiAgICAgICAgbCA9IGEoXCJJRV9QUk9UT1wiKSxcbiAgICAgICAgYyA9IE9iamVjdCxcbiAgICAgICAgaCA9IGMucHJvdG90eXBlO1xuICAgICAgdC5leHBvcnRzID0gbyA/IGMuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHModCk7XG4gICAgICAgIGlmIChpKGUsIGwpKSByZXR1cm4gZVtsXTtcbiAgICAgICAgdmFyIG4gPSBlLmNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gcihuKSAmJiBlIGluc3RhbmNlb2YgbiA/IG4ucHJvdG90eXBlIDogZSBpbnN0YW5jZW9mIGMgPyBoIDogbnVsbDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig3KTtcbiAgICAgIHQuZXhwb3J0cyA9ICFpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gRigpIHt9XG4gICAgICAgIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRigpKSAhPT0gRi5wcm90b3R5cGU7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDk5KSxcbiAgICAgICAgciA9IG4oMTMpLFxuICAgICAgICBzID0gbig0MCksXG4gICAgICAgIGEgPSBuKDY0KSxcbiAgICAgICAgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gY3JlYXRlTWV0aG9kKHQpIHtcbiAgICAgICAgICB2YXIgZSA9IDEgPT0gdDtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4sIG8sIGwpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGMsIGggPSBzKG4pLCBkID0gcihoKSwgdSA9IGkobywgbCksIHAgPSBhKGQpOyBwLS0gPiAwOykgaWYgKHUoYyA9IGRbcF0sIHAsIGgpKSBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZSA/IC0xIDogdm9pZCAwO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB0LmV4cG9ydHMgPSB7XG4gICAgICAgIGZpbmRMYXN0OiBjcmVhdGVNZXRob2QoMCksXG4gICAgICAgIGZpbmRMYXN0SW5kZXg6IGNyZWF0ZU1ldGhvZCgxKVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDEwMCksXG4gICAgICAgIHIgPSBuKDMxKSxcbiAgICAgICAgcyA9IG4oOSksXG4gICAgICAgIGEgPSBpKGkuYmluZCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByKHQpO1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlID8gdCA6IHMgPyBhKHQsIGUpIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB0LmFwcGx5KGUsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTUpLFxuICAgICAgICByID0gbigxNCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoXCJGdW5jdGlvblwiID09PSBpKHQpKSByZXR1cm4gcih0KTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oOTQpLFxuICAgICAgICByID0gbig5OCkuZmluZExhc3RJbmRleCxcbiAgICAgICAgcyA9IGkuYVR5cGVkQXJyYXk7XG4gICAgICAoMCwgaS5leHBvcnRUeXBlZEFycmF5TWV0aG9kKShcImZpbmRMYXN0SW5kZXhcIiwgZnVuY3Rpb24gZmluZExhc3RJbmRleCh0KSB7XG4gICAgICAgIHJldHVybiByKHModGhpcyksIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwKTtcbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gbig4KSxcbiAgICAgICAgcyA9IG4oOTQpLFxuICAgICAgICBhID0gbig2NCksXG4gICAgICAgIG8gPSBuKDEwMyksXG4gICAgICAgIGwgPSBuKDQwKSxcbiAgICAgICAgYyA9IG4oNyksXG4gICAgICAgIGggPSBpLlJhbmdlRXJyb3IsXG4gICAgICAgIGQgPSBpLkludDhBcnJheSxcbiAgICAgICAgdSA9IGQgJiYgZC5wcm90b3R5cGUsXG4gICAgICAgIHAgPSB1ICYmIHUuc2V0LFxuICAgICAgICBmID0gcy5hVHlwZWRBcnJheSxcbiAgICAgICAgZyA9IHMuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgICAgICAgbSA9ICFjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgyKTtcbiAgICAgICAgICByKHAsIHQsIHtcbiAgICAgICAgICAgIGxlbmd0aDogMSxcbiAgICAgICAgICAgIDA6IDNcbiAgICAgICAgICB9LCAxKTtcbiAgICAgICAgICByZXR1cm4gMyAhPT0gdFsxXTtcbiAgICAgICAgfSksXG4gICAgICAgIGIgPSBtICYmIHMuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBkKDIpO1xuICAgICAgICAgIHQuc2V0KDEpO1xuICAgICAgICAgIHQuc2V0KFwiMlwiLCAxKTtcbiAgICAgICAgICByZXR1cm4gMCAhPT0gdFswXSB8fCAyICE9PSB0WzFdO1xuICAgICAgICB9KTtcbiAgICAgIGcoXCJzZXRcIiwgZnVuY3Rpb24gc2V0KHQpIHtcbiAgICAgICAgZih0aGlzKTtcbiAgICAgICAgdmFyIGUgPSBvKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwLCAxKSxcbiAgICAgICAgICBuID0gbCh0KTtcbiAgICAgICAgaWYgKG0pIHJldHVybiByKHAsIHRoaXMsIG4sIGUpO1xuICAgICAgICB2YXIgaSA9IHRoaXMubGVuZ3RoLFxuICAgICAgICAgIHMgPSBhKG4pLFxuICAgICAgICAgIGMgPSAwO1xuICAgICAgICBpZiAocyArIGUgPiBpKSB0aHJvdyBoKFwiV3JvbmcgbGVuZ3RoXCIpO1xuICAgICAgICBmb3IgKDsgYyA8IHM7KSB0aGlzW2UgKyBjXSA9IG5bYysrXTtcbiAgICAgIH0sICFtIHx8IGIpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTA0KSxcbiAgICAgICAgciA9IFJhbmdlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgbiA9IGkodCk7XG4gICAgICAgIGlmIChuICUgZSkgdGhyb3cgcihcIldyb25nIG9mZnNldFwiKTtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNjIpLFxuICAgICAgICByID0gUmFuZ2VFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gaSh0KTtcbiAgICAgICAgaWYgKGUgPCAwKSB0aHJvdyByKFwiVGhlIGFyZ3VtZW50IGNhbid0IGJlIGxlc3MgdGhhbiAwXCIpO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMTA2KSxcbiAgICAgICAgciA9IG4oOTQpLFxuICAgICAgICBzID0gci5hVHlwZWRBcnJheSxcbiAgICAgICAgYSA9IHIuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgICAgICAgbyA9IHIuZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuICAgICAgYShcInRvUmV2ZXJzZWRcIiwgZnVuY3Rpb24gdG9SZXZlcnNlZCgpIHtcbiAgICAgICAgcmV0dXJuIGkocyh0aGlzKSwgbyh0aGlzKSk7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDY0KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGZvciAodmFyIG4gPSBpKHQpLCByID0gbmV3IGUobiksIHMgPSAwOyBzIDwgbjsgcysrKSByW3NdID0gdFtuIC0gcyAtIDFdO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oOTQpLFxuICAgICAgICByID0gbigxNCksXG4gICAgICAgIHMgPSBuKDMxKSxcbiAgICAgICAgYSA9IG4oMTA4KSxcbiAgICAgICAgbyA9IGkuYVR5cGVkQXJyYXksXG4gICAgICAgIGwgPSBpLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgICAgICAgYyA9IGkuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgICAgICAgaCA9IHIoaS5UeXBlZEFycmF5UHJvdG90eXBlLnNvcnQpO1xuICAgICAgYyhcInRvU29ydGVkXCIsIGZ1bmN0aW9uIHRvU29ydGVkKHQpIHtcbiAgICAgICAgdm9pZCAwICE9PSB0ICYmIHModCk7XG4gICAgICAgIHZhciBlID0gbyh0aGlzKSxcbiAgICAgICAgICBuID0gYShsKGUpLCBlKTtcbiAgICAgICAgcmV0dXJuIGgobiwgdCk7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDY0KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGZvciAodmFyIG4gPSAwLCByID0gaShlKSwgcyA9IG5ldyB0KHIpOyByID4gbjspIHNbbl0gPSBlW24rK107XG4gICAgICAgIHJldHVybiBzO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigxMTApLFxuICAgICAgICByID0gbig5NCksXG4gICAgICAgIHMgPSBuKDExMSksXG4gICAgICAgIGEgPSBuKDYyKSxcbiAgICAgICAgbyA9IG4oMTEyKSxcbiAgICAgICAgbCA9IHIuYVR5cGVkQXJyYXksXG4gICAgICAgIGMgPSByLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgICAgICAgaCA9IHIuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgICAgICAgZCA9ICEhZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgSW50OEFycmF5KDEpLndpdGgoMiwge1xuICAgICAgICAgICAgICB2YWx1ZU9mOiBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgICAgICAgICAgICAgIHRocm93IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIHJldHVybiA4ID09PSB0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSgpO1xuICAgICAgaChcIndpdGhcIiwge1xuICAgICAgICB3aXRoOiBmdW5jdGlvbiBfd2l0aCh0LCBlKSB7XG4gICAgICAgICAgdmFyIG4gPSBsKHRoaXMpLFxuICAgICAgICAgICAgciA9IGEodCksXG4gICAgICAgICAgICBoID0gcyhuKSA/IG8oZSkgOiArZTtcbiAgICAgICAgICByZXR1cm4gaShuLCBjKG4pLCByLCBoKTtcbiAgICAgICAgfVxuICAgICAgfS53aXRoLCAhZCk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig2NCksXG4gICAgICAgIHIgPSBuKDYyKSxcbiAgICAgICAgcyA9IFJhbmdlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbiwgYSkge1xuICAgICAgICB2YXIgbyA9IGkodCksXG4gICAgICAgICAgbCA9IHIobiksXG4gICAgICAgICAgYyA9IGwgPCAwID8gbyArIGwgOiBsO1xuICAgICAgICBpZiAoYyA+PSBvIHx8IGMgPCAwKSB0aHJvdyBzKFwiSW5jb3JyZWN0IGluZGV4XCIpO1xuICAgICAgICBmb3IgKHZhciBoID0gbmV3IGUobyksIGQgPSAwOyBkIDwgbzsgZCsrKSBoW2RdID0gZCA9PT0gYyA/IGEgOiB0W2RdO1xuICAgICAgICByZXR1cm4gaDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig3OCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IGkodCk7XG4gICAgICAgIHJldHVybiBcIkJpZ0ludDY0QXJyYXlcIiA9PSBlIHx8IFwiQmlnVWludDY0QXJyYXlcIiA9PSBlO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE5KSxcbiAgICAgICAgciA9IFR5cGVFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gaSh0LCBcIm51bWJlclwiKTtcbiAgICAgICAgaWYgKFwibnVtYmVyXCIgPT0gdHlwZW9mIGUpIHRocm93IHIoXCJDYW4ndCBjb252ZXJ0IG51bWJlciB0byBiaWdpbnRcIik7XG4gICAgICAgIHJldHVybiBCaWdJbnQoZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDYpLFxuICAgICAgICByID0gbig4OCksXG4gICAgICAgIHMgPSBuKDExNCksXG4gICAgICAgIGEgPSBBcnJheUJ1ZmZlci5wcm90b3R5cGU7XG4gICAgICBpICYmICEoXCJkZXRhY2hlZFwiIGluIGEpICYmIHIoYSwgXCJkZXRhY2hlZFwiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZGV0YWNoZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHModGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigxMTUpLFxuICAgICAgICBzID0gaShBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKDAgIT09IHIodCkpIHJldHVybiAhMTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzKHQsIDAsIDApO1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDcyKSxcbiAgICAgICAgciA9IG4oMTUpLFxuICAgICAgICBzID0gVHlwZUVycm9yO1xuICAgICAgdC5leHBvcnRzID0gaShBcnJheUJ1ZmZlci5wcm90b3R5cGUsIFwiYnl0ZUxlbmd0aFwiLCBcImdldFwiKSB8fCBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoXCJBcnJheUJ1ZmZlclwiICE9IHIodCkpIHRocm93IHMoXCJBcnJheUJ1ZmZlciBleHBlY3RlZFwiKTtcbiAgICAgICAgcmV0dXJuIHQuYnl0ZUxlbmd0aDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMyksXG4gICAgICAgIHIgPSBuKDExNyk7XG4gICAgICByICYmIGkoe1xuICAgICAgICB0YXJnZXQ6IFwiQXJyYXlCdWZmZXJcIixcbiAgICAgICAgcHJvdG86ICEwXG4gICAgICB9LCB7XG4gICAgICAgIHRyYW5zZmVyOiBmdW5jdGlvbiB0cmFuc2ZlcigpIHtcbiAgICAgICAgICByZXR1cm4gcih0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdm9pZCAwLCAhMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNCksXG4gICAgICAgIHIgPSBuKDE0KSxcbiAgICAgICAgcyA9IG4oNzIpLFxuICAgICAgICBhID0gbigxMTgpLFxuICAgICAgICBvID0gbigxMTQpLFxuICAgICAgICBsID0gbigxMTUpLFxuICAgICAgICBjID0gbigxMTkpLFxuICAgICAgICBoID0gaS5UeXBlRXJyb3IsXG4gICAgICAgIGQgPSBpLnN0cnVjdHVyZWRDbG9uZSxcbiAgICAgICAgdSA9IGkuQXJyYXlCdWZmZXIsXG4gICAgICAgIHAgPSBpLkRhdGFWaWV3LFxuICAgICAgICBmID0gTWF0aC5taW4sXG4gICAgICAgIGcgPSB1LnByb3RvdHlwZSxcbiAgICAgICAgbSA9IHAucHJvdG90eXBlLFxuICAgICAgICBiID0gcihnLnNsaWNlKSxcbiAgICAgICAgdiA9IHMoZywgXCJyZXNpemFibGVcIiwgXCJnZXRcIiksXG4gICAgICAgIHkgPSBzKGcsIFwibWF4Qnl0ZUxlbmd0aFwiLCBcImdldFwiKSxcbiAgICAgICAgQSA9IHIobS5nZXRJbnQ4KSxcbiAgICAgICAgXyA9IHIobS5zZXRJbnQ4KTtcbiAgICAgIHQuZXhwb3J0cyA9IGMgJiYgZnVuY3Rpb24gKHQsIGUsIG4pIHtcbiAgICAgICAgdmFyIGkgPSBsKHQpLFxuICAgICAgICAgIHIgPSB2b2lkIDAgPT09IGUgPyBpIDogYShlKSxcbiAgICAgICAgICBzID0gIXYgfHwgIXYodCk7XG4gICAgICAgIGlmIChvKHQpKSB0aHJvdyBoKFwiQXJyYXlCdWZmZXIgaXMgZGV0YWNoZWRcIik7XG4gICAgICAgIHZhciBjID0gZCh0LCB7XG4gICAgICAgICAgdHJhbnNmZXI6IFt0XVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGkgPT0gciAmJiAobiB8fCBzKSkgcmV0dXJuIGM7XG4gICAgICAgIGlmIChpID49IHIgJiYgKCFuIHx8IHMpKSByZXR1cm4gYihjLCAwLCByKTtcbiAgICAgICAgZm9yICh2YXIgZyA9IG4gJiYgIXMgJiYgeSA/IHtcbiAgICAgICAgICAgIG1heEJ5dGVMZW5ndGg6IHkoYylcbiAgICAgICAgICB9IDogdm9pZCAwLCBtID0gbmV3IHUociwgZyksIFMgPSBuZXcgcChjKSwgRSA9IG5ldyBwKG0pLCB4ID0gZihyLCBpKSwgdyA9IDA7IHcgPCB4OyB3KyspIF8oRSwgdywgQShTLCB3KSk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDYyKSxcbiAgICAgICAgciA9IG4oNjUpLFxuICAgICAgICBzID0gUmFuZ2VFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IHQpIHJldHVybiAwO1xuICAgICAgICB2YXIgZSA9IGkodCksXG4gICAgICAgICAgbiA9IHIoZSk7XG4gICAgICAgIGlmIChlICE9PSBuKSB0aHJvdyBzKFwiV3JvbmcgbGVuZ3RoIG9yIGluZGV4XCIpO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig0KSxcbiAgICAgICAgciA9IG4oNyksXG4gICAgICAgIHMgPSBuKDI4KSxcbiAgICAgICAgYSA9IG4oMTIwKSxcbiAgICAgICAgbyA9IG4oMTIxKSxcbiAgICAgICAgbCA9IG4oMTIyKSxcbiAgICAgICAgYyA9IGkuc3RydWN0dXJlZENsb25lO1xuICAgICAgdC5leHBvcnRzID0gISFjICYmICFyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG8gJiYgcyA+IDkyIHx8IGwgJiYgcyA+IDk0IHx8IGEgJiYgcyA+IDk3KSByZXR1cm4gITE7XG4gICAgICAgIHZhciB0ID0gbmV3IEFycmF5QnVmZmVyKDgpLFxuICAgICAgICAgIGUgPSBjKHQsIHtcbiAgICAgICAgICAgIHRyYW5zZmVyOiBbdF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIDAgIT0gdC5ieXRlTGVuZ3RoIHx8IDggIT0gZS5ieXRlTGVuZ3RoO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxMjEpLFxuICAgICAgICByID0gbigxMjIpO1xuICAgICAgdC5leHBvcnRzID0gIWkgJiYgIXIgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2Ygd2luZG93ICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIGRvY3VtZW50O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0gXCJvYmplY3RcIiA9PSB0eXBlb2YgRGVubyAmJiBEZW5vICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIERlbm8udmVyc2lvbjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE1KTtcbiAgICAgIHQuZXhwb3J0cyA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIHByb2Nlc3MgJiYgXCJwcm9jZXNzXCIgPT0gaShwcm9jZXNzKTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigzKSxcbiAgICAgICAgciA9IG4oMTE3KTtcbiAgICAgIHIgJiYgaSh7XG4gICAgICAgIHRhcmdldDogXCJBcnJheUJ1ZmZlclwiLFxuICAgICAgICBwcm90bzogITBcbiAgICAgIH0sIHtcbiAgICAgICAgdHJhbnNmZXJUb0ZpeGVkTGVuZ3RoOiBmdW5jdGlvbiB0cmFuc2ZlclRvRml4ZWRMZW5ndGgoKSB7XG4gICAgICAgICAgcmV0dXJuIHIodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHZvaWQgMCwgITEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGV4cG9ydHMuUmVuZGVyVGFzayA9IGV4cG9ydHMuUERGV29ya2VyVXRpbCA9IGV4cG9ydHMuUERGV29ya2VyID0gZXhwb3J0cy5QREZQYWdlUHJveHkgPSBleHBvcnRzLlBERkRvY3VtZW50UHJveHkgPSBleHBvcnRzLlBERkRvY3VtZW50TG9hZGluZ1Rhc2sgPSBleHBvcnRzLlBERkRhdGFSYW5nZVRyYW5zcG9ydCA9IGV4cG9ydHMuTG9vcGJhY2tQb3J0ID0gZXhwb3J0cy5EZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBleHBvcnRzLkRlZmF1bHRGaWx0ZXJGYWN0b3J5ID0gZXhwb3J0cy5EZWZhdWx0Q2FudmFzRmFjdG9yeSA9IGV4cG9ydHMuRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gdm9pZCAwO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU1ZHR3JhcGhpY3NcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIF9kaXNwbGF5U3ZnLlNWR0dyYXBoaWNzO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydHMuYnVpbGQgPSB2b2lkIDA7XG4gICAgICBleHBvcnRzLmdldERvY3VtZW50ID0gZ2V0RG9jdW1lbnQ7XG4gICAgICBleHBvcnRzLnZlcnNpb24gPSB2b2lkIDA7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDg0KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oODYpO1xuICAgICAgX193X3BkZmpzX3JlcXVpcmVfXyg4Nyk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDIpO1xuICAgICAgX193X3BkZmpzX3JlcXVpcmVfXyg5Myk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwMSk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwMik7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwNSk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwNyk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwOSk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDExMyk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDExNik7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEyMyk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDg5KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTI1KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTM1KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTM3KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQwKTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQyKTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQ0KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQ2KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQ4KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTUxKTtcbiAgICAgIHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSksXG4gICAgICAgIF9hbm5vdGF0aW9uX3N0b3JhZ2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2MiksXG4gICAgICAgIF9kaXNwbGF5X3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjcpLFxuICAgICAgICBfZm9udF9sb2FkZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3MCksXG4gICAgICAgIF9kaXNwbGF5Tm9kZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcxKSxcbiAgICAgICAgX2NhbnZhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcyKSxcbiAgICAgICAgX3dvcmtlcl9vcHRpb25zID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzUpLFxuICAgICAgICBfbWVzc2FnZV9oYW5kbGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzYpLFxuICAgICAgICBfbWV0YWRhdGEgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3NyksXG4gICAgICAgIF9vcHRpb25hbF9jb250ZW50X2NvbmZpZyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTc4KSxcbiAgICAgICAgX3RyYW5zcG9ydF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3OSksXG4gICAgICAgIF9kaXNwbGF5RmV0Y2hfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxODApLFxuICAgICAgICBfZGlzcGxheU5ldHdvcmsgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4MyksXG4gICAgICAgIF9kaXNwbGF5Tm9kZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4NCksXG4gICAgICAgIF9kaXNwbGF5U3ZnID0gX193X3BkZmpzX3JlcXVpcmVfXygxODUpLFxuICAgICAgICBfeGZhX3RleHQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5Myk7XG4gICAgICBjb25zdCBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkUgPSA2NTUzNixcbiAgICAgICAgUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUID0gMTAwLFxuICAgICAgICBERUxBWUVEX0NMRUFOVVBfVElNRU9VVCA9IDVlMyxcbiAgICAgICAgRGVmYXVsdENhbnZhc0ZhY3RvcnkgPSBfdXRpbC5pc05vZGVKUyA/IF9kaXNwbGF5Tm9kZV91dGlscy5Ob2RlQ2FudmFzRmFjdG9yeSA6IF9kaXNwbGF5X3V0aWxzLkRPTUNhbnZhc0ZhY3Rvcnk7XG4gICAgICBleHBvcnRzLkRlZmF1bHRDYW52YXNGYWN0b3J5ID0gRGVmYXVsdENhbnZhc0ZhY3Rvcnk7XG4gICAgICBjb25zdCBEZWZhdWx0Q01hcFJlYWRlckZhY3RvcnkgPSBfdXRpbC5pc05vZGVKUyA/IF9kaXNwbGF5Tm9kZV91dGlscy5Ob2RlQ01hcFJlYWRlckZhY3RvcnkgOiBfZGlzcGxheV91dGlscy5ET01DTWFwUmVhZGVyRmFjdG9yeTtcbiAgICAgIGV4cG9ydHMuRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5O1xuICAgICAgY29uc3QgRGVmYXVsdEZpbHRlckZhY3RvcnkgPSBfdXRpbC5pc05vZGVKUyA/IF9kaXNwbGF5Tm9kZV91dGlscy5Ob2RlRmlsdGVyRmFjdG9yeSA6IF9kaXNwbGF5X3V0aWxzLkRPTUZpbHRlckZhY3Rvcnk7XG4gICAgICBleHBvcnRzLkRlZmF1bHRGaWx0ZXJGYWN0b3J5ID0gRGVmYXVsdEZpbHRlckZhY3Rvcnk7XG4gICAgICBjb25zdCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBfdXRpbC5pc05vZGVKUyA/IF9kaXNwbGF5Tm9kZV91dGlscy5Ob2RlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgOiBfZGlzcGxheV91dGlscy5ET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcbiAgICAgIGV4cG9ydHMuRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuICAgICAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQodCkge1xuICAgICAgICB2YXIgX3QkcGFzc3dvcmQsIF90JGxlbmd0aDtcbiAgICAgICAgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCB8fCB0IGluc3RhbmNlb2YgVVJMID8gdCA9IHtcbiAgICAgICAgICB1cmw6IHRcbiAgICAgICAgfSA6ICgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKSh0KSAmJiAodCA9IHtcbiAgICAgICAgICBkYXRhOiB0XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgdCkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXIgaW4gZ2V0RG9jdW1lbnQsIG5lZWQgcGFyYW1ldGVyIG9iamVjdC5cIik7XG4gICAgICAgIGlmICghdC51cmwgJiYgIXQuZGF0YSAmJiAhdC5yYW5nZSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXIgb2JqZWN0OiBuZWVkIGVpdGhlciAuZGF0YSwgLnJhbmdlIG9yIC51cmxcIik7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgUERGRG9jdW1lbnRMb2FkaW5nVGFzaygpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRvY0lkOiBuXG4gICAgICAgICAgfSA9IGUsXG4gICAgICAgICAgaSA9IHQudXJsID8gZ2V0VXJsUHJvcCh0LnVybCkgOiBudWxsLFxuICAgICAgICAgIHIgPSB0LmRhdGEgPyBnZXREYXRhUHJvcCh0LmRhdGEpIDogbnVsbCxcbiAgICAgICAgICBzID0gdC5odHRwSGVhZGVycyB8fCBudWxsLFxuICAgICAgICAgIGEgPSAhMCA9PT0gdC53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgbyA9IChfdCRwYXNzd29yZCA9IHQucGFzc3dvcmQpICE9PSBudWxsICYmIF90JHBhc3N3b3JkICE9PSB2b2lkIDAgPyBfdCRwYXNzd29yZCA6IG51bGwsXG4gICAgICAgICAgbCA9IHQucmFuZ2UgaW5zdGFuY2VvZiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQgPyB0LnJhbmdlIDogbnVsbCxcbiAgICAgICAgICBjID0gTnVtYmVyLmlzSW50ZWdlcih0LnJhbmdlQ2h1bmtTaXplKSAmJiB0LnJhbmdlQ2h1bmtTaXplID4gMCA/IHQucmFuZ2VDaHVua1NpemUgOiBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkU7XG4gICAgICAgIGxldCBoID0gdC53b3JrZXIgaW5zdGFuY2VvZiBQREZXb3JrZXIgPyB0LndvcmtlciA6IG51bGw7XG4gICAgICAgIGNvbnN0IGQgPSB0LnZlcmJvc2l0eSxcbiAgICAgICAgICB1ID0gXCJzdHJpbmdcIiAhPSB0eXBlb2YgdC5kb2NCYXNlVXJsIHx8ICgwLCBfZGlzcGxheV91dGlscy5pc0RhdGFTY2hlbWUpKHQuZG9jQmFzZVVybCkgPyBudWxsIDogdC5kb2NCYXNlVXJsLFxuICAgICAgICAgIHAgPSBcInN0cmluZ1wiID09IHR5cGVvZiB0LmNNYXBVcmwgPyB0LmNNYXBVcmwgOiBudWxsLFxuICAgICAgICAgIGYgPSAhMSAhPT0gdC5jTWFwUGFja2VkLFxuICAgICAgICAgIGcgPSB0LkNNYXBSZWFkZXJGYWN0b3J5IHx8IERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeSxcbiAgICAgICAgICBtID0gXCJzdHJpbmdcIiA9PSB0eXBlb2YgdC5zdGFuZGFyZEZvbnREYXRhVXJsID8gdC5zdGFuZGFyZEZvbnREYXRhVXJsIDogbnVsbCxcbiAgICAgICAgICBiID0gdC5TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB8fCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnksXG4gICAgICAgICAgdiA9ICEwICE9PSB0LnN0b3BBdEVycm9ycyxcbiAgICAgICAgICB5ID0gTnVtYmVyLmlzSW50ZWdlcih0Lm1heEltYWdlU2l6ZSkgJiYgdC5tYXhJbWFnZVNpemUgPiAtMSA/IHQubWF4SW1hZ2VTaXplIDogLTEsXG4gICAgICAgICAgQSA9ICExICE9PSB0LmlzRXZhbFN1cHBvcnRlZCxcbiAgICAgICAgICBfID0gXCJib29sZWFuXCIgPT0gdHlwZW9mIHQuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPyB0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIDogIV91dGlsLmlzTm9kZUpTLFxuICAgICAgICAgIFMgPSBOdW1iZXIuaXNJbnRlZ2VyKHQuY2FudmFzTWF4QXJlYUluQnl0ZXMpID8gdC5jYW52YXNNYXhBcmVhSW5CeXRlcyA6IC0xLFxuICAgICAgICAgIEUgPSBcImJvb2xlYW5cIiA9PSB0eXBlb2YgdC5kaXNhYmxlRm9udEZhY2UgPyB0LmRpc2FibGVGb250RmFjZSA6IF91dGlsLmlzTm9kZUpTLFxuICAgICAgICAgIHggPSAhMCA9PT0gdC5mb250RXh0cmFQcm9wZXJ0aWVzLFxuICAgICAgICAgIHcgPSAhMCA9PT0gdC5lbmFibGVYZmEsXG4gICAgICAgICAgQyA9IHQub3duZXJEb2N1bWVudCB8fCBnbG9iYWxUaGlzLmRvY3VtZW50LFxuICAgICAgICAgIFQgPSAhMCA9PT0gdC5kaXNhYmxlUmFuZ2UsXG4gICAgICAgICAgUCA9ICEwID09PSB0LmRpc2FibGVTdHJlYW0sXG4gICAgICAgICAgayA9ICEwID09PSB0LmRpc2FibGVBdXRvRmV0Y2gsXG4gICAgICAgICAgTSA9ICEwID09PSB0LnBkZkJ1ZyxcbiAgICAgICAgICBSID0gbCA/IGwubGVuZ3RoIDogKF90JGxlbmd0aCA9IHQubGVuZ3RoKSAhPT0gbnVsbCAmJiBfdCRsZW5ndGggIT09IHZvaWQgMCA/IF90JGxlbmd0aCA6IE5hTixcbiAgICAgICAgICBJID0gXCJib29sZWFuXCIgPT0gdHlwZW9mIHQudXNlU3lzdGVtRm9udHMgPyB0LnVzZVN5c3RlbUZvbnRzIDogIV91dGlsLmlzTm9kZUpTICYmICFFLFxuICAgICAgICAgIEQgPSBcImJvb2xlYW5cIiA9PSB0eXBlb2YgdC51c2VXb3JrZXJGZXRjaCA/IHQudXNlV29ya2VyRmV0Y2ggOiBnID09PSBfZGlzcGxheV91dGlscy5ET01DTWFwUmVhZGVyRmFjdG9yeSAmJiBiID09PSBfZGlzcGxheV91dGlscy5ET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSAmJiBwICYmIG0gJiYgKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkocCwgZG9jdW1lbnQuYmFzZVVSSSkgJiYgKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkobSwgZG9jdW1lbnQuYmFzZVVSSSksXG4gICAgICAgICAgTyA9IHQuY2FudmFzRmFjdG9yeSB8fCBuZXcgRGVmYXVsdENhbnZhc0ZhY3Rvcnkoe1xuICAgICAgICAgICAgb3duZXJEb2N1bWVudDogQ1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIEwgPSB0LmZpbHRlckZhY3RvcnkgfHwgbmV3IERlZmF1bHRGaWx0ZXJGYWN0b3J5KHtcbiAgICAgICAgICAgIGRvY0lkOiBuLFxuICAgICAgICAgICAgb3duZXJEb2N1bWVudDogQ1xuICAgICAgICAgIH0pO1xuICAgICAgICAoMCwgX3V0aWwuc2V0VmVyYm9zaXR5TGV2ZWwpKGQpO1xuICAgICAgICBjb25zdCBOID0ge1xuICAgICAgICAgIGNhbnZhc0ZhY3Rvcnk6IE8sXG4gICAgICAgICAgZmlsdGVyRmFjdG9yeTogTFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIUQpIHtcbiAgICAgICAgICBOLmNNYXBSZWFkZXJGYWN0b3J5ID0gbmV3IGcoe1xuICAgICAgICAgICAgYmFzZVVybDogcCxcbiAgICAgICAgICAgIGlzQ29tcHJlc3NlZDogZlxuICAgICAgICAgIH0pO1xuICAgICAgICAgIE4uc3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBuZXcgYih7XG4gICAgICAgICAgICBiYXNlVXJsOiBtXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHtcbiAgICAgICAgICAgIHZlcmJvc2l0eTogZCxcbiAgICAgICAgICAgIHBvcnQ6IF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGggPSB0LnBvcnQgPyBQREZXb3JrZXIuZnJvbVBvcnQodCkgOiBuZXcgUERGV29ya2VyKHQpO1xuICAgICAgICAgIGUuX3dvcmtlciA9IGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgQiA9IHtcbiAgICAgICAgICAgIGRvY0lkOiBuLFxuICAgICAgICAgICAgYXBpVmVyc2lvbjogXCIzLjkuMTc5XCIsXG4gICAgICAgICAgICBkYXRhOiByLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IG8sXG4gICAgICAgICAgICBkaXNhYmxlQXV0b0ZldGNoOiBrLFxuICAgICAgICAgICAgcmFuZ2VDaHVua1NpemU6IGMsXG4gICAgICAgICAgICBsZW5ndGg6IFIsXG4gICAgICAgICAgICBkb2NCYXNlVXJsOiB1LFxuICAgICAgICAgICAgZW5hYmxlWGZhOiB3LFxuICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczoge1xuICAgICAgICAgICAgICBtYXhJbWFnZVNpemU6IHksXG4gICAgICAgICAgICAgIGRpc2FibGVGb250RmFjZTogRSxcbiAgICAgICAgICAgICAgaWdub3JlRXJyb3JzOiB2LFxuICAgICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IEEsXG4gICAgICAgICAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOiBfLFxuICAgICAgICAgICAgICBjYW52YXNNYXhBcmVhSW5CeXRlczogUyxcbiAgICAgICAgICAgICAgZm9udEV4dHJhUHJvcGVydGllczogeCxcbiAgICAgICAgICAgICAgdXNlU3lzdGVtRm9udHM6IEksXG4gICAgICAgICAgICAgIGNNYXBVcmw6IEQgPyBwIDogbnVsbCxcbiAgICAgICAgICAgICAgc3RhbmRhcmRGb250RGF0YVVybDogRCA/IG0gOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBqID0ge1xuICAgICAgICAgICAgaWdub3JlRXJyb3JzOiB2LFxuICAgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiBBLFxuICAgICAgICAgICAgZGlzYWJsZUZvbnRGYWNlOiBFLFxuICAgICAgICAgICAgZm9udEV4dHJhUHJvcGVydGllczogeCxcbiAgICAgICAgICAgIGVuYWJsZVhmYTogdyxcbiAgICAgICAgICAgIG93bmVyRG9jdW1lbnQ6IEMsXG4gICAgICAgICAgICBkaXNhYmxlQXV0b0ZldGNoOiBrLFxuICAgICAgICAgICAgcGRmQnVnOiBNLFxuICAgICAgICAgICAgc3R5bGVFbGVtZW50OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgaC5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChlLmRlc3Ryb3llZCkgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSBfZmV0Y2hEb2N1bWVudChoLCBCKSxcbiAgICAgICAgICAgIG8gPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICBsZXQgZTtcbiAgICAgICAgICAgICAgaWYgKGwpIGUgPSBuZXcgX3RyYW5zcG9ydF9zdHJlYW0uUERGRGF0YVRyYW5zcG9ydFN0cmVhbSh7XG4gICAgICAgICAgICAgICAgbGVuZ3RoOiBSLFxuICAgICAgICAgICAgICAgIGluaXRpYWxEYXRhOiBsLmluaXRpYWxEYXRhLFxuICAgICAgICAgICAgICAgIHByb2dyZXNzaXZlRG9uZTogbC5wcm9ncmVzc2l2ZURvbmUsXG4gICAgICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU6IGwuY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgZGlzYWJsZVJhbmdlOiBULFxuICAgICAgICAgICAgICAgIGRpc2FibGVTdHJlYW06IFBcbiAgICAgICAgICAgICAgfSwgbCk7ZWxzZSBpZiAoIXIpIHtcbiAgICAgICAgICAgICAgICBlID0gKHQgPT4gX3V0aWwuaXNOb2RlSlMgPyBuZXcgX2Rpc3BsYXlOb2RlX3N0cmVhbS5QREZOb2RlU3RyZWFtKHQpIDogKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkodC51cmwpID8gbmV3IF9kaXNwbGF5RmV0Y2hfc3RyZWFtLlBERkZldGNoU3RyZWFtKHQpIDogbmV3IF9kaXNwbGF5TmV0d29yay5QREZOZXR3b3JrU3RyZWFtKHQpKSh7XG4gICAgICAgICAgICAgICAgICB1cmw6IGksXG4gICAgICAgICAgICAgICAgICBsZW5ndGg6IFIsXG4gICAgICAgICAgICAgICAgICBodHRwSGVhZGVyczogcyxcbiAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogYSxcbiAgICAgICAgICAgICAgICAgIHJhbmdlQ2h1bmtTaXplOiBjLFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZVJhbmdlOiBULFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZVN0cmVhbTogUFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHQoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3QsIG9dKS50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICBsZXQgW2ksIHJdID0gdDtcbiAgICAgICAgICAgIGlmIChlLmRlc3Ryb3llZCkgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG4sIGksIGgucG9ydCksXG4gICAgICAgICAgICAgIGEgPSBuZXcgV29ya2VyVHJhbnNwb3J0KHMsIGUsIHIsIGosIE4pO1xuICAgICAgICAgICAgZS5fdHJhbnNwb3J0ID0gYTtcbiAgICAgICAgICAgIHMuc2VuZChcIlJlYWR5XCIsIG51bGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KS5jYXRjaChlLl9jYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgICAgYXN5bmMgZnVuY3Rpb24gX2ZldGNoRG9jdW1lbnQodCwgZSkge1xuICAgICAgICBpZiAodC5kZXN0cm95ZWQpIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpO1xuICAgICAgICBjb25zdCBuID0gYXdhaXQgdC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREb2NSZXF1ZXN0XCIsIGUsIGUuZGF0YSA/IFtlLmRhdGEuYnVmZmVyXSA6IG51bGwpO1xuICAgICAgICBpZiAodC5kZXN0cm95ZWQpIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGdldFVybFByb3AodCkge1xuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFVSTCkgcmV0dXJuIHQuaHJlZjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbmV3IFVSTCh0LCB3aW5kb3cubG9jYXRpb24pLmhyZWY7XG4gICAgICAgIH0gY2F0Y2ggKF91bnVzZWQ0KSB7XG4gICAgICAgICAgaWYgKF91dGlsLmlzTm9kZUpTICYmIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHJldHVybiB0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgUERGIHVybCBkYXRhOiBlaXRoZXIgc3RyaW5nIG9yIFVSTC1vYmplY3QgaXMgZXhwZWN0ZWQgaW4gdGhlIHVybCBwcm9wZXJ0eS5cIik7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBnZXREYXRhUHJvcCh0KSB7XG4gICAgICAgIGlmIChfdXRpbC5pc05vZGVKUyAmJiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBCdWZmZXIgJiYgdCBpbnN0YW5jZW9mIEJ1ZmZlcikgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgYmluYXJ5IGRhdGEgYXMgYFVpbnQ4QXJyYXlgLCByYXRoZXIgdGhhbiBgQnVmZmVyYC5cIik7XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgVWludDhBcnJheSAmJiB0LmJ5dGVMZW5ndGggPT09IHQuYnVmZmVyLmJ5dGVMZW5ndGgpIHJldHVybiB0O1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkgcmV0dXJuICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKSh0KTtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgIWlzTmFOKHQgPT09IG51bGwgfHwgdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdC5sZW5ndGgpIHx8ICgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKSh0KSkgcmV0dXJuIG5ldyBVaW50OEFycmF5KHQpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFBERiBiaW5hcnkgZGF0YTogZWl0aGVyIFR5cGVkQXJyYXksIHN0cmluZywgb3IgYXJyYXktbGlrZSBvYmplY3QgaXMgZXhwZWN0ZWQgaW4gdGhlIGRhdGEgcHJvcGVydHkuXCIpO1xuICAgICAgfVxuICAgICAgY2xhc3MgUERGRG9jdW1lbnRMb2FkaW5nVGFzayB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIHZhciBfUERGRG9jdW1lbnRMb2FkaW5nVGEsIF9QREZEb2N1bWVudExvYWRpbmdUYTI7XG4gICAgICAgICAgdGhpcy5fY2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmRvY0lkID0gXCJkXCIgKyAoX2NsYXNzU3RhdGljUHJpdmF0ZUZpZWxkU3BlY1NldChQREZEb2N1bWVudExvYWRpbmdUYXNrLCBQREZEb2N1bWVudExvYWRpbmdUYXNrLCBfZSwgKF9QREZEb2N1bWVudExvYWRpbmdUYSA9IF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoUERGRG9jdW1lbnRMb2FkaW5nVGFzaywgUERGRG9jdW1lbnRMb2FkaW5nVGFzaywgX2UpLCBfUERGRG9jdW1lbnRMb2FkaW5nVGEyID0gX1BERkRvY3VtZW50TG9hZGluZ1RhKyssIF9QREZEb2N1bWVudExvYWRpbmdUYSkpLCBfUERGRG9jdW1lbnRMb2FkaW5nVGEyKTtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3llZCA9ICExO1xuICAgICAgICAgIHRoaXMub25QYXNzd29yZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF90cmFuc3BvcnQ7XG4gICAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSAhMDtcbiAgICAgICAgICBhd2FpdCAoKF90aGlzJF90cmFuc3BvcnQgPSB0aGlzLl90cmFuc3BvcnQpID09PSBudWxsIHx8IF90aGlzJF90cmFuc3BvcnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF90cmFuc3BvcnQuZGVzdHJveSgpKTtcbiAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLl93b3JrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIF9lID0ge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IDBcbiAgICAgIH07XG4gICAgICBleHBvcnRzLlBERkRvY3VtZW50TG9hZGluZ1Rhc2sgPSBQREZEb2N1bWVudExvYWRpbmdUYXNrO1xuICAgICAgY2xhc3MgUERGRGF0YVJhbmdlVHJhbnNwb3J0IHtcbiAgICAgICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICAgIGxldCBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdLFxuICAgICAgICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzNdID8gYXJndW1lbnRzWzNdIDogbnVsbDtcbiAgICAgICAgICB0aGlzLmxlbmd0aCA9IHQ7XG4gICAgICAgICAgdGhpcy5pbml0aWFsRGF0YSA9IGU7XG4gICAgICAgICAgdGhpcy5wcm9ncmVzc2l2ZURvbmUgPSBuO1xuICAgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBpO1xuICAgICAgICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzID0gW107XG4gICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRSYW5nZUxpc3RlbmVyKHQpIHtcbiAgICAgICAgICB0aGlzLl9yYW5nZUxpc3RlbmVycy5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFByb2dyZXNzTGlzdGVuZXIodCkge1xuICAgICAgICAgIHRoaXMuX3Byb2dyZXNzTGlzdGVuZXJzLnB1c2godCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIodCkge1xuICAgICAgICAgIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycy5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKHQpIHtcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMucHVzaCh0KTtcbiAgICAgICAgfVxuICAgICAgICBvbkRhdGFSYW5nZSh0LCBlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBuIG9mIHRoaXMuX3JhbmdlTGlzdGVuZXJzKSBuKHQsIGUpO1xuICAgICAgICB9XG4gICAgICAgIG9uRGF0YVByb2dyZXNzKHQsIGUpIHtcbiAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycykgbih0LCBlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBvbkRhdGFQcm9ncmVzc2l2ZVJlYWQodCkge1xuICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycykgZSh0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBvbkRhdGFQcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzKSB0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNwb3J0UmVhZHkoKSB7XG4gICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0RGF0YVJhbmdlKHQsIGUpIHtcbiAgICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiQWJzdHJhY3QgbWV0aG9kIFBERkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGFib3J0KCkge31cbiAgICAgIH1cbiAgICAgIGV4cG9ydHMuUERGRGF0YVJhbmdlVHJhbnNwb3J0ID0gUERGRGF0YVJhbmdlVHJhbnNwb3J0O1xuICAgICAgY2xhc3MgUERGRG9jdW1lbnRQcm94eSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICB0aGlzLl9wZGZJbmZvID0gdDtcbiAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBhbm5vdGF0aW9uU3RvcmFnZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmFubm90YXRpb25TdG9yYWdlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBmaWx0ZXJGYWN0b3J5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgbnVtUGFnZXMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BkZkluZm8ubnVtUGFnZXM7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZpbmdlcnByaW50cygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcGRmSW5mby5maW5nZXJwcmludHM7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUHVyZVhmYSgpIHtcbiAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJpc1B1cmVYZmFcIiwgISF0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBhbGxYZmFIdG1sKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmE7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGFnZSh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlKHQpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhZ2VJbmRleCh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlSW5kZXgodCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RGVzdGluYXRpb25zKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RGVzdGluYXRpb24odCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb24odCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGFnZUxhYmVscygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYWJlbHMoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRQYWdlTGF5b3V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxheW91dCgpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhZ2VNb2RlKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZU1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFZpZXdlclByZWZlcmVuY2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0T3BlbkFjdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wZW5BY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRBdHRhY2htZW50cygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEF0dGFjaG1lbnRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SmF2YVNjcmlwdCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEphdmFTY3JpcHQoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRKU0FjdGlvbnMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREb2NKU0FjdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRPdXRsaW5lKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3V0bGluZSgpO1xuICAgICAgICB9XG4gICAgICAgIGdldE9wdGlvbmFsQ29udGVudENvbmZpZygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBlcm1pc3Npb25zKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGVybWlzc2lvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRNZXRhZGF0YSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE1ldGFkYXRhKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWFya0luZm8oKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNYXJrSW5mbygpO1xuICAgICAgICB9XG4gICAgICAgIGdldERhdGEoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREYXRhKCk7XG4gICAgICAgIH1cbiAgICAgICAgc2F2ZURvY3VtZW50KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuc2F2ZURvY3VtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RG93bmxvYWRJbmZvKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFudXAoKSB7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSAmJiBhcmd1bWVudHNbMF07XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zdGFydENsZWFudXAodCB8fCB0aGlzLmlzUHVyZVhmYSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nVGFzay5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGxvYWRpbmdQYXJhbXMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nUGFyYW1zO1xuICAgICAgICB9XG4gICAgICAgIGdldCBsb2FkaW5nVGFzaygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmxvYWRpbmdUYXNrO1xuICAgICAgICB9XG4gICAgICAgIGdldEZpZWxkT2JqZWN0cygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEZpZWxkT2JqZWN0cygpO1xuICAgICAgICB9XG4gICAgICAgIGhhc0pTQWN0aW9ucygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Lmhhc0pTQWN0aW9ucygpO1xuICAgICAgICB9XG4gICAgICAgIGdldENhbGN1bGF0aW9uT3JkZXJJZHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRDYWxjdWxhdGlvbk9yZGVySWRzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGV4cG9ydHMuUERGRG9jdW1lbnRQcm94eSA9IFBERkRvY3VtZW50UHJveHk7XG4gICAgICB2YXIgX24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfaSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9zID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3IgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIFBERlBhZ2VQcm94eSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF90MiwgX2UyLCBuKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9yKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3MpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9uLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2ksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1szXSAmJiBhcmd1bWVudHNbM107XG4gICAgICAgICAgdGhpcy5fcGFnZUluZGV4ID0gX3QyO1xuICAgICAgICAgIHRoaXMuX3BhZ2VJbmZvID0gX2UyO1xuICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydCA9IG47XG4gICAgICAgICAgdGhpcy5fc3RhdHMgPSBpID8gbmV3IF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcigpIDogbnVsbDtcbiAgICAgICAgICB0aGlzLl9wZGZCdWcgPSBpO1xuICAgICAgICAgIHRoaXMuY29tbW9uT2JqcyA9IG4uY29tbW9uT2JqcztcbiAgICAgICAgICB0aGlzLm9ianMgPSBuZXcgUERGT2JqZWN0cygpO1xuICAgICAgICAgIHRoaXMuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyID0gITE7XG4gICAgICAgICAgdGhpcy5faW50ZW50U3RhdGVzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuZGVzdHJveWVkID0gITE7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBhZ2VOdW1iZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmRleCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHJvdGF0ZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucm90YXRlO1xuICAgICAgICB9XG4gICAgICAgIGdldCByZWYoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJlZjtcbiAgICAgICAgfVxuICAgICAgICBnZXQgdXNlclVuaXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnVzZXJVbml0O1xuICAgICAgICB9XG4gICAgICAgIGdldCB2aWV3KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby52aWV3O1xuICAgICAgICB9XG4gICAgICAgIGdldFZpZXdwb3J0KCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBzY2FsZTogdCxcbiAgICAgICAgICAgIHJvdGF0aW9uOiBlID0gdGhpcy5yb3RhdGUsXG4gICAgICAgICAgICBvZmZzZXRYOiBuID0gMCxcbiAgICAgICAgICAgIG9mZnNldFk6IGkgPSAwLFxuICAgICAgICAgICAgZG9udEZsaXA6IHIgPSAhMVxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIHJldHVybiBuZXcgX2Rpc3BsYXlfdXRpbHMuUGFnZVZpZXdwb3J0KHtcbiAgICAgICAgICAgIHZpZXdCb3g6IHRoaXMudmlldyxcbiAgICAgICAgICAgIHNjYWxlOiB0LFxuICAgICAgICAgICAgcm90YXRpb246IGUsXG4gICAgICAgICAgICBvZmZzZXRYOiBuLFxuICAgICAgICAgICAgb2Zmc2V0WTogaSxcbiAgICAgICAgICAgIGRvbnRGbGlwOiByXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0QW5ub3RhdGlvbnMoKSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGludGVudDogdCA9IFwiZGlzcGxheVwiXG4gICAgICAgICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQodCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRBbm5vdGF0aW9ucyh0aGlzLl9wYWdlSW5kZXgsIGUucmVuZGVyaW5nSW50ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRKU0FjdGlvbnMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlSlNBY3Rpb25zKHRoaXMuX3BhZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZpbHRlckZhY3RvcnkoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5maWx0ZXJGYWN0b3J5O1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1B1cmVYZmEoKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiaXNQdXJlWGZhXCIsICEhdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBnZXRYZmEoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF90cmFuc3BvcnQkX2h0bTtcbiAgICAgICAgICByZXR1cm4gKChfdGhpcyRfdHJhbnNwb3J0JF9odG0gPSB0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpID09PSBudWxsIHx8IF90aGlzJF90cmFuc3BvcnQkX2h0bSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX3RyYW5zcG9ydCRfaHRtLmNoaWxkcmVuW3RoaXMuX3BhZ2VJbmRleF0pIHx8IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX3N0YXRzLCBfdTtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgY2FudmFzQ29udGV4dDogZSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiBuLFxuICAgICAgICAgICAgaW50ZW50OiBpID0gXCJkaXNwbGF5XCIsXG4gICAgICAgICAgICBhbm5vdGF0aW9uTW9kZTogciA9IF91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRSxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcyA9IG51bGwsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBhID0gbnVsbCxcbiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U6IG8gPSBudWxsLFxuICAgICAgICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcDogbCA9IG51bGwsXG4gICAgICAgICAgICBwYWdlQ29sb3JzOiBjID0gbnVsbCxcbiAgICAgICAgICAgIHByaW50QW5ub3RhdGlvblN0b3JhZ2U6IGggPSBudWxsXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgKF90aGlzJF9zdGF0cyA9IHRoaXMuX3N0YXRzKSA9PT0gbnVsbCB8fCBfdGhpcyRfc3RhdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9zdGF0cy50aW1lKFwiT3ZlcmFsbFwiKTtcbiAgICAgICAgICBjb25zdCBkID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudChpLCByLCBoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2ksICExKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9yLCBfcjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgbyB8fCAobyA9IHRoaXMuX3RyYW5zcG9ydC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSk7XG4gICAgICAgICAgbGV0IHUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGQuY2FjaGVLZXkpO1xuICAgICAgICAgIGlmICghdSkge1xuICAgICAgICAgICAgdSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KGQuY2FjaGVLZXksIHUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtcbiAgICAgICAgICAgIHUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHAgPSAhIShkLnJlbmRlcmluZ0ludGVudCAmIF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQpO1xuICAgICAgICAgIGlmICghdS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkX3N0YXRzMjtcbiAgICAgICAgICAgIHUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgICAgdS5vcGVyYXRvckxpc3QgPSB7XG4gICAgICAgICAgICAgIGZuQXJyYXk6IFtdLFxuICAgICAgICAgICAgICBhcmdzQXJyYXk6IFtdLFxuICAgICAgICAgICAgICBsYXN0Q2h1bms6ICExLFxuICAgICAgICAgICAgICBzZXBhcmF0ZUFubm90czogbnVsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChfdGhpcyRfc3RhdHMyID0gdGhpcy5fc3RhdHMpID09PSBudWxsIHx8IF90aGlzJF9zdGF0czIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9zdGF0czIudGltZShcIlBhZ2UgUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRoaXMuX3B1bXBPcGVyYXRvckxpc3QoZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlID0gdCA9PiB7XG4gICAgICAgICAgICAgIHZhciBfdGhpcyRfc3RhdHMzLCBfdGhpcyRfc3RhdHM0O1xuICAgICAgICAgICAgICB1LnJlbmRlclRhc2tzLmRlbGV0ZShmKTtcbiAgICAgICAgICAgICAgKHRoaXMuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyIHx8IHApICYmIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaSwgITApO1xuICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9zLCBfczIpLmNhbGwodGhpcywgIXApO1xuICAgICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICAgIGYuY2FwYWJpbGl0eS5yZWplY3QodCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgICAgICAgICAgaW50ZW50U3RhdGU6IHUsXG4gICAgICAgICAgICAgICAgICByZWFzb246IHQgaW5zdGFuY2VvZiBFcnJvciA/IHQgOiBuZXcgRXJyb3IodClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGYuY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIChfdGhpcyRfc3RhdHMzID0gdGhpcy5fc3RhdHMpID09PSBudWxsIHx8IF90aGlzJF9zdGF0czMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9zdGF0czMudGltZUVuZChcIlJlbmRlcmluZ1wiKTtcbiAgICAgICAgICAgICAgKF90aGlzJF9zdGF0czQgPSB0aGlzLl9zdGF0cykgPT09IG51bGwgfHwgX3RoaXMkX3N0YXRzNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX3N0YXRzNC50aW1lRW5kKFwiT3ZlcmFsbFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmID0gbmV3IEludGVybmFsUmVuZGVyVGFzayh7XG4gICAgICAgICAgICAgIGNhbGxiYWNrOiBjb21wbGV0ZSxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgY2FudmFzQ29udGV4dDogZSxcbiAgICAgICAgICAgICAgICB2aWV3cG9ydDogbixcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHMsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogYVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvYmpzOiB0aGlzLm9ianMsXG4gICAgICAgICAgICAgIGNvbW1vbk9ianM6IHRoaXMuY29tbW9uT2JqcyxcbiAgICAgICAgICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcDogbCxcbiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0OiB1Lm9wZXJhdG9yTGlzdCxcbiAgICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICAgICAgICAgIGNhbnZhc0ZhY3Rvcnk6IHRoaXMuX3RyYW5zcG9ydC5jYW52YXNGYWN0b3J5LFxuICAgICAgICAgICAgICBmaWx0ZXJGYWN0b3J5OiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeSxcbiAgICAgICAgICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOiAhcCxcbiAgICAgICAgICAgICAgcGRmQnVnOiB0aGlzLl9wZGZCdWcsXG4gICAgICAgICAgICAgIHBhZ2VDb2xvcnM6IGNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICgoX3UgPSB1KS5yZW5kZXJUYXNrcyB8fCAoX3UucmVuZGVyVGFza3MgPSBuZXcgU2V0KCkpKS5hZGQoZik7XG4gICAgICAgICAgY29uc3QgZyA9IGYudGFzaztcbiAgICAgICAgICBQcm9taXNlLmFsbChbdS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnByb21pc2UsIG9dKS50aGVuKHQgPT4ge1xuICAgICAgICAgICAgbGV0IFtlLCBuXSA9IHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIGNvbXBsZXRlKCk7ZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfdGhpcyRfc3RhdHM1O1xuICAgICAgICAgICAgICAoX3RoaXMkX3N0YXRzNSA9IHRoaXMuX3N0YXRzKSA9PT0gbnVsbCB8fCBfdGhpcyRfc3RhdHM1ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfc3RhdHM1LnRpbWUoXCJSZW5kZXJpbmdcIik7XG4gICAgICAgICAgICAgIGYuaW5pdGlhbGl6ZUdyYXBoaWNzKHtcbiAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3k6IGUsXG4gICAgICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnOiBuXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBmLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KS5jYXRjaChjb21wbGV0ZSk7XG4gICAgICAgICAgcmV0dXJuIGc7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0T3BlcmF0b3JMaXN0KCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpbnRlbnQ6IHQgPSBcImRpc3BsYXlcIixcbiAgICAgICAgICAgIGFubm90YXRpb25Nb2RlOiBlID0gX3V0aWwuQW5ub3RhdGlvbk1vZGUuRU5BQkxFLFxuICAgICAgICAgICAgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZTogbiA9IG51bGxcbiAgICAgICAgICB9ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudCh0LCBlLCBuLCAhMCk7XG4gICAgICAgICAgbGV0IHIsXG4gICAgICAgICAgICBzID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChpLmNhY2hlS2V5KTtcbiAgICAgICAgICBpZiAoIXMpIHtcbiAgICAgICAgICAgIHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5faW50ZW50U3RhdGVzLnNldChpLmNhY2hlS2V5LCBzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzLm9wTGlzdFJlYWRDYXBhYmlsaXR5KSB7XG4gICAgICAgICAgICB2YXIgX3MzLCBfdGhpcyRfc3RhdHM2O1xuICAgICAgICAgICAgciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICByLm9wZXJhdG9yTGlzdENoYW5nZWQgPSBmdW5jdGlvbiBvcGVyYXRvckxpc3RDaGFuZ2VkKCkge1xuICAgICAgICAgICAgICBpZiAocy5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG4gICAgICAgICAgICAgICAgcy5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKHMub3BlcmF0b3JMaXN0KTtcbiAgICAgICAgICAgICAgICBzLnJlbmRlclRhc2tzLmRlbGV0ZShyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHMub3BMaXN0UmVhZENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgICgoX3MzID0gcykucmVuZGVyVGFza3MgfHwgKF9zMy5yZW5kZXJUYXNrcyA9IG5ldyBTZXQoKSkpLmFkZChyKTtcbiAgICAgICAgICAgIHMub3BlcmF0b3JMaXN0ID0ge1xuICAgICAgICAgICAgICBmbkFycmF5OiBbXSxcbiAgICAgICAgICAgICAgYXJnc0FycmF5OiBbXSxcbiAgICAgICAgICAgICAgbGFzdENodW5rOiAhMSxcbiAgICAgICAgICAgICAgc2VwYXJhdGVBbm5vdHM6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAoX3RoaXMkX3N0YXRzNiA9IHRoaXMuX3N0YXRzKSA9PT0gbnVsbCB8fCBfdGhpcyRfc3RhdHM2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfc3RhdHM2LnRpbWUoXCJQYWdlIFJlcXVlc3RcIik7XG4gICAgICAgICAgICB0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcy5vcExpc3RSZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbVRleHRDb250ZW50KCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpbmNsdWRlTWFya2VkQ29udGVudDogdCA9ICExLFxuICAgICAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb246IGUgPSAhMVxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXCJHZXRUZXh0Q29udGVudFwiLCB7XG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCxcbiAgICAgICAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50OiAhMCA9PT0gdCxcbiAgICAgICAgICAgIGRpc2FibGVOb3JtYWxpemF0aW9uOiAhMCA9PT0gZVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGhpZ2hXYXRlck1hcms6IDEwMCxcbiAgICAgICAgICAgIHNpemU6IHQgPT4gdC5pdGVtcy5sZW5ndGhcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRUZXh0Q29udGVudCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYSkgcmV0dXJuIHRoaXMuZ2V0WGZhKCkudGhlbih0ID0+IF94ZmFfdGV4dC5YZmFUZXh0LnRleHRDb250ZW50KHQpKTtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5zdHJlYW1UZXh0Q29udGVudCh0KTtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHQsIG4pIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBlLmdldFJlYWRlcigpLFxuICAgICAgICAgICAgICByID0ge1xuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICFmdW5jdGlvbiBwdW1wKCkge1xuICAgICAgICAgICAgICBpLnJlYWQoKS50aGVuKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgICAgICAgICAgZG9uZTogaVxuICAgICAgICAgICAgICAgIH0gPSBlO1xuICAgICAgICAgICAgICAgIGlmIChpKSB0KHIpO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyLnN0eWxlcywgbi5zdHlsZXMpO1xuICAgICAgICAgICAgICAgICAgci5pdGVtcy5wdXNoKC4uLm4uaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgcHVtcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSwgbik7XG4gICAgICAgICAgICB9KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0U3RydWN0VHJlZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFN0cnVjdFRyZWUodGhpcy5fcGFnZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBfZGVzdHJveSgpIHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3llZCA9ICEwO1xuICAgICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5faW50ZW50U3RhdGVzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7XG4gICAgICAgICAgICAgIGludGVudFN0YXRlOiBlLFxuICAgICAgICAgICAgICByZWFzb246IG5ldyBFcnJvcihcIlBhZ2Ugd2FzIGRlc3Ryb3llZC5cIiksXG4gICAgICAgICAgICAgIGZvcmNlOiAhMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWUub3BMaXN0UmVhZENhcGFiaWxpdHkpIGZvciAoY29uc3QgbiBvZiBlLnJlbmRlclRhc2tzKSB7XG4gICAgICAgICAgICAgIHQucHVzaChuLmNvbXBsZXRlZCk7XG4gICAgICAgICAgICAgIG4uY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub2Jqcy5jbGVhcigpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaSwgITEpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3IsIF9yMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodCk7XG4gICAgICAgIH1cbiAgICAgICAgY2xlYW51cCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdICYmIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2ksICEwKTtcbiAgICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcywgX3MyKS5jYWxsKHRoaXMsICExKTtcbiAgICAgICAgICB0ICYmIGUgJiYgdGhpcy5fc3RhdHMgJiYgKHRoaXMuX3N0YXRzID0gbmV3IF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcigpKTtcbiAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfVxuICAgICAgICBfc3RhcnRSZW5kZXJQYWdlKHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChlKTtcbiAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgdmFyIF90aGlzJF9zdGF0czcsIF9uJGRpc3BsYXlSZWFkeUNhcGFiaTtcbiAgICAgICAgICAgIChfdGhpcyRfc3RhdHM3ID0gdGhpcy5fc3RhdHMpID09PSBudWxsIHx8IF90aGlzJF9zdGF0czcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9zdGF0czcudGltZUVuZChcIlBhZ2UgUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIChfbiRkaXNwbGF5UmVhZHlDYXBhYmkgPSBuLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpID09PSBudWxsIHx8IF9uJGRpc3BsYXlSZWFkeUNhcGFiaSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX24kZGlzcGxheVJlYWR5Q2FwYWJpLnJlc29sdmUodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9yZW5kZXJQYWdlQ2h1bmsodCwgZSkge1xuICAgICAgICAgIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuKyspIHtcbiAgICAgICAgICAgIGUub3BlcmF0b3JMaXN0LmZuQXJyYXkucHVzaCh0LmZuQXJyYXlbbl0pO1xuICAgICAgICAgICAgZS5vcGVyYXRvckxpc3QuYXJnc0FycmF5LnB1c2godC5hcmdzQXJyYXlbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmsgPSB0Lmxhc3RDaHVuaztcbiAgICAgICAgICBlLm9wZXJhdG9yTGlzdC5zZXBhcmF0ZUFubm90cyA9IHQuc2VwYXJhdGVBbm5vdHM7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIGUucmVuZGVyVGFza3MpIHQub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO1xuICAgICAgICAgIHQubGFzdENodW5rICYmIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3MsIF9zMikuY2FsbCh0aGlzLCAhMCk7XG4gICAgICAgIH1cbiAgICAgICAgX3B1bXBPcGVyYXRvckxpc3QodCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICByZW5kZXJpbmdJbnRlbnQ6IGUsXG4gICAgICAgICAgICBjYWNoZUtleTogbixcbiAgICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlOiBpXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBtYXA6IHIsXG4gICAgICAgICAgICAgIHRyYW5zZmVyczogc1xuICAgICAgICAgICAgfSA9IGksXG4gICAgICAgICAgICBhID0gdGhpcy5fdHJhbnNwb3J0Lm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKFwiR2V0T3BlcmF0b3JMaXN0XCIsIHtcbiAgICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICAgICAgICAgIGludGVudDogZSxcbiAgICAgICAgICAgICAgY2FjaGVLZXk6IG4sXG4gICAgICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiByXG4gICAgICAgICAgICB9LCBzKS5nZXRSZWFkZXIoKSxcbiAgICAgICAgICAgIG8gPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KG4pO1xuICAgICAgICAgIG8uc3RyZWFtUmVhZGVyID0gYTtcbiAgICAgICAgICBjb25zdCBwdW1wID0gKCkgPT4ge1xuICAgICAgICAgICAgYS5yZWFkKCkudGhlbih0ID0+IHtcbiAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZSxcbiAgICAgICAgICAgICAgICBkb25lOiBuXG4gICAgICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICAgICBpZiAobikgby5zdHJlYW1SZWFkZXIgPSBudWxsO2Vsc2UgaWYgKCF0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyUGFnZUNodW5rKGUsIG8pO1xuICAgICAgICAgICAgICAgIHB1bXAoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdCA9PiB7XG4gICAgICAgICAgICAgIG8uc3RyZWFtUmVhZGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKG8ub3BlcmF0b3JMaXN0KSB7XG4gICAgICAgICAgICAgICAgICBvLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmsgPSAhMDtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBvLnJlbmRlclRhc2tzKSB0Lm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3MsIF9zMikuY2FsbCh0aGlzLCAhMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpIG8uZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5yZWplY3QodCk7ZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIW8ub3BMaXN0UmVhZENhcGFiaWxpdHkpIHRocm93IHQ7XG4gICAgICAgICAgICAgICAgICBvLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlamVjdCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcHVtcCgpO1xuICAgICAgICB9XG4gICAgICAgIF9hYm9ydE9wZXJhdG9yTGlzdCh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGludGVudFN0YXRlOiBlLFxuICAgICAgICAgICAgcmVhc29uOiBuLFxuICAgICAgICAgICAgZm9yY2U6IGkgPSAhMVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIGlmIChlLnN0cmVhbVJlYWRlcikge1xuICAgICAgICAgICAgaWYgKGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCkge1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtcbiAgICAgICAgICAgICAgZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaSkge1xuICAgICAgICAgICAgICBpZiAoZS5yZW5kZXJUYXNrcy5zaXplID4gMCkgcmV0dXJuO1xuICAgICAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIF9kaXNwbGF5X3V0aWxzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUO1xuICAgICAgICAgICAgICAgIG4uZXh0cmFEZWxheSA+IDAgJiYgbi5leHRyYURlbGF5IDwgMWUzICYmICh0ICs9IG4uZXh0cmFEZWxheSk7XG4gICAgICAgICAgICAgICAgZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgICAgICAgICAgICBpbnRlbnRTdGF0ZTogZSxcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBuLFxuICAgICAgICAgICAgICAgICAgICBmb3JjZTogITBcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIHQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZS5zdHJlYW1SZWFkZXIuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbihuLm1lc3NhZ2UpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICBlLnN0cmVhbVJlYWRlciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbdCwgbl0gb2YgdGhpcy5faW50ZW50U3RhdGVzKSBpZiAobiA9PT0gZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5kZWxldGUodCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBzdGF0cygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9zMigpIHtcbiAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSAmJiBhcmd1bWVudHNbMF07XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3IsIF9yMikuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2kpIHx8IHRoaXMuZGVzdHJveWVkKSByZXR1cm4gITE7XG4gICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9uLCBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbiwgbnVsbCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9zLCBfczIpLmNhbGwodGhpcywgITEpO1xuICAgICAgICAgIH0sIERFTEFZRURfQ0xFQU5VUF9USU1FT1VUKSk7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgIHJlbmRlclRhc2tzOiB0LFxuICAgICAgICAgIG9wZXJhdG9yTGlzdDogZVxuICAgICAgICB9IG9mIHRoaXMuX2ludGVudFN0YXRlcy52YWx1ZXMoKSkgaWYgKHQuc2l6ZSA+IDAgfHwgIWUubGFzdENodW5rKSByZXR1cm4gITE7XG4gICAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLm9ianMuY2xlYXIoKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9pLCAhMSk7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9yMigpIHtcbiAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbikpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9uKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9uLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZXhwb3J0cy5QREZQYWdlUHJveHkgPSBQREZQYWdlUHJveHk7XG4gICAgICB2YXIgX2EgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgTG9vcGJhY2tQb3J0IHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2EsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBTZXQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9vLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHBvc3RNZXNzYWdlKHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0ge1xuICAgICAgICAgICAgZGF0YTogc3RydWN0dXJlZENsb25lKHQsIG51bGwpXG4gICAgICAgICAgfTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX28pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYSkpIHQuY2FsbCh0aGlzLCBuKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhZGRFdmVudExpc3RlbmVyKHQsIGUpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2EpLmFkZChlKTtcbiAgICAgICAgfVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKHQsIGUpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2EpLmRlbGV0ZShlKTtcbiAgICAgICAgfVxuICAgICAgICB0ZXJtaW5hdGUoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9hKS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBleHBvcnRzLkxvb3BiYWNrUG9ydCA9IExvb3BiYWNrUG9ydDtcbiAgICAgIGNvbnN0IFBERldvcmtlclV0aWwgPSB7XG4gICAgICAgIGlzV29ya2VyRGlzYWJsZWQ6ICExLFxuICAgICAgICBmYWxsYmFja1dvcmtlclNyYzogbnVsbCxcbiAgICAgICAgZmFrZVdvcmtlcklkOiAwXG4gICAgICB9O1xuICAgICAgZXhwb3J0cy5QREZXb3JrZXJVdGlsID0gUERGV29ya2VyVXRpbDtcbiAgICAgIGlmIChfdXRpbC5pc05vZGVKUyAmJiBcImZ1bmN0aW9uXCIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIFBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCA9ICEwO1xuICAgICAgICBQREZXb3JrZXJVdGlsLmZhbGxiYWNrV29ya2VyU3JjID0gXCIuL3BkZi53b3JrZXIuanNcIjtcbiAgICAgIH0gZWxzZSBpZiAoXCJvYmplY3RcIiA9PSB0eXBlb2YgZG9jdW1lbnQpIHtcbiAgICAgICAgdmFyIF9kb2N1bWVudDtcbiAgICAgICAgY29uc3QgdCA9IChfZG9jdW1lbnQgPSBkb2N1bWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50ID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCA9IF9kb2N1bWVudC5jdXJyZW50U2NyaXB0KSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kb2N1bWVudC5zcmM7XG4gICAgICAgIHQgJiYgKFBERldvcmtlclV0aWwuZmFsbGJhY2tXb3JrZXJTcmMgPSB0LnJlcGxhY2UoLyhcXC4oPzptaW5cXC4pP2pzKShcXD8uKik/JC9pLCBcIi53b3JrZXIkMSQyXCIpKTtcbiAgICAgIH1cbiAgICAgIFBERldvcmtlclV0aWwuaXNTYW1lT3JpZ2luID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgbGV0IG47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbiA9IG5ldyBVUkwodCk7XG4gICAgICAgICAgaWYgKCFuLm9yaWdpbiB8fCBcIm51bGxcIiA9PT0gbi5vcmlnaW4pIHJldHVybiAhMTtcbiAgICAgICAgfSBjYXRjaCAoX3VudXNlZDUpIHtcbiAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaSA9IG5ldyBVUkwoZSwgbik7XG4gICAgICAgIHJldHVybiBuLm9yaWdpbiA9PT0gaS5vcmlnaW47XG4gICAgICB9O1xuICAgICAgUERGV29ya2VyVXRpbC5jcmVhdGVDRE5XcmFwcGVyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFwiaW1wb3J0U2NyaXB0cyhcXFwiXCIuY29uY2F0KHQsIFwiXFxcIik7XCIpO1xuICAgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbZV0pKTtcbiAgICAgIH07XG4gICAgICBjbGFzcyBQREZXb3JrZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgbmFtZTogdCA9IG51bGwsXG4gICAgICAgICAgICBwb3J0OiBlID0gbnVsbCxcbiAgICAgICAgICAgIHZlcmJvc2l0eTogbiA9ICgwLCBfdXRpbC5nZXRWZXJib3NpdHlMZXZlbCkoKVxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIGlmIChlICYmIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoUERGV29ya2VyLCBQREZXb3JrZXIsIF9sKS5oYXMoZSkpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgbW9yZSB0aGFuIG9uZSBQREZXb3JrZXIgcGVyIHBvcnQuXCIpO1xuICAgICAgICAgIHRoaXMubmFtZSA9IHQ7XG4gICAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSAhMTtcbiAgICAgICAgICB0aGlzLnZlcmJvc2l0eSA9IG47XG4gICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5fcG9ydCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fd2ViV29ya2VyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoUERGV29ya2VyLCBQREZXb3JrZXIsIF9sKS5zZXQoZSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplRnJvbVBvcnQoZSk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuX2luaXRpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBvcnQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IG1lc3NhZ2VIYW5kbGVyKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlSGFuZGxlcjtcbiAgICAgICAgfVxuICAgICAgICBfaW5pdGlhbGl6ZUZyb21Qb3J0KHQpIHtcbiAgICAgICAgICB0aGlzLl9wb3J0ID0gdDtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKFwibWFpblwiLCBcIndvcmtlclwiLCB0KTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5vbihcInJlYWR5XCIsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyLnNlbmQoXCJjb25maWd1cmVcIiwge1xuICAgICAgICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIF9pbml0aWFsaXplKCkge1xuICAgICAgICAgIGlmICghUERGV29ya2VyVXRpbC5pc1dvcmtlckRpc2FibGVkICYmICFQREZXb3JrZXIuX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgd29ya2VyU3JjOiB0XG4gICAgICAgICAgICB9ID0gUERGV29ya2VyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgUERGV29ya2VyVXRpbC5pc1NhbWVPcmlnaW4od2luZG93LmxvY2F0aW9uLmhyZWYsIHQpIHx8ICh0ID0gUERGV29ya2VyVXRpbC5jcmVhdGVDRE5XcmFwcGVyKG5ldyBVUkwodCwgd2luZG93LmxvY2F0aW9uKS5ocmVmKSk7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgV29ya2VyKHQpLFxuICAgICAgICAgICAgICAgIG4gPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihcIm1haW5cIiwgXCJ3b3JrZXJcIiwgZSksXG4gICAgICAgICAgICAgICAgdGVybWluYXRlRWFybHkgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbldvcmtlckVycm9yKTtcbiAgICAgICAgICAgICAgICAgIG4uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveWVkID8gdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKSkgOiB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uV29ya2VyRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl93ZWJXb3JrZXIgfHwgdGVybWluYXRlRWFybHkoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBlLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbldvcmtlckVycm9yKTtcbiAgICAgICAgICAgICAgbi5vbihcInRlc3RcIiwgdCA9PiB7XG4gICAgICAgICAgICAgICAgZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25Xb3JrZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB0ZXJtaW5hdGVFYXJseSgpO2Vsc2UgaWYgKHQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbjtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcnQgPSBlO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fd2ViV29ya2VyID0gZTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICBuLnNlbmQoXCJjb25maWd1cmVcIiwge1xuICAgICAgICAgICAgICAgICAgICB2ZXJib3NpdHk6IHRoaXMudmVyYm9zaXR5XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICAgICAgICAgICAgICBuLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgIGUudGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbi5vbihcInJlYWR5XCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uV29ya2VyRXJyb3IpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgdGVybWluYXRlRWFybHkoKTtlbHNlIHRyeSB7XG4gICAgICAgICAgICAgICAgICBzZW5kVGVzdCgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQ2KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjb25zdCBzZW5kVGVzdCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgICAgICBuLnNlbmQoXCJ0ZXN0XCIsIHQsIFt0LmJ1ZmZlcl0pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBzZW5kVGVzdCgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGNhdGNoIChfdW51c2VkNykge1xuICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoXCJUaGUgd29ya2VyIGhhcyBiZWVuIGRpc2FibGVkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgX3NldHVwRmFrZVdvcmtlcigpIHtcbiAgICAgICAgICBpZiAoIVBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCkge1xuICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKFwiU2V0dGluZyB1cCBmYWtlIHdvcmtlci5cIik7XG4gICAgICAgICAgICBQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQgPSAhMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgUERGV29ya2VyLl9zZXR1cEZha2VXb3JrZXJHbG9iYWwudGhlbih0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBMb29wYmFja1BvcnQoKTtcbiAgICAgICAgICAgIHRoaXMuX3BvcnQgPSBlO1xuICAgICAgICAgICAgY29uc3QgbiA9IFwiZmFrZVwiICsgUERGV29ya2VyVXRpbC5mYWtlV29ya2VySWQrKyxcbiAgICAgICAgICAgICAgaSA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG4gKyBcIl93b3JrZXJcIiwgbiwgZSk7XG4gICAgICAgICAgICB0LnNldHVwKGksIGUpO1xuICAgICAgICAgICAgY29uc3QgciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG4sIG4gKyBcIl93b3JrZXJcIiwgZSk7XG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IHI7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgci5zZW5kKFwiY29uZmlndXJlXCIsIHtcbiAgICAgICAgICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkuY2F0Y2godCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIlNldHRpbmcgdXAgZmFrZSB3b3JrZXIgZmFpbGVkOiBcXFwiXCIuY29uY2F0KHQubWVzc2FnZSwgXCJcXFwiLlwiKSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSAhMDtcbiAgICAgICAgICBpZiAodGhpcy5fd2ViV29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWJXb3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgICAgICB0aGlzLl93ZWJXb3JrZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjR2V0KFBERldvcmtlciwgUERGV29ya2VyLCBfbCkuZGVsZXRlKHRoaXMuX3BvcnQpO1xuICAgICAgICAgIHRoaXMuX3BvcnQgPSBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLl9tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZnJvbVBvcnQodCkge1xuICAgICAgICAgIGlmICghKHQgIT09IG51bGwgJiYgdCAhPT0gdm9pZCAwICYmIHQucG9ydCkpIHRocm93IG5ldyBFcnJvcihcIlBERldvcmtlci5mcm9tUG9ydCAtIGludmFsaWQgbWV0aG9kIHNpZ25hdHVyZS5cIik7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQodGhpcywgUERGV29ya2VyLCBfbCkuaGFzKHQucG9ydCkgPyBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjR2V0KHRoaXMsIFBERldvcmtlciwgX2wpLmdldCh0LnBvcnQpIDogbmV3IFBERldvcmtlcih0KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IHdvcmtlclNyYygpIHtcbiAgICAgICAgICBpZiAoX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjKSByZXR1cm4gX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjO1xuICAgICAgICAgIGlmIChudWxsICE9PSBQREZXb3JrZXJVdGlsLmZhbGxiYWNrV29ya2VyU3JjKSB7XG4gICAgICAgICAgICBfdXRpbC5pc05vZGVKUyB8fCAoMCwgX2Rpc3BsYXlfdXRpbHMuZGVwcmVjYXRlZCkoJ05vIFwiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmNcIiBzcGVjaWZpZWQuJyk7XG4gICAgICAgICAgICByZXR1cm4gUERGV29ya2VyVXRpbC5mYWxsYmFja1dvcmtlclNyYztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBcIkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjXCIgc3BlY2lmaWVkLicpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcigpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIF9nbG9iYWxUaGlzJHBkZmpzV29yaztcbiAgICAgICAgICAgIHJldHVybiAoKF9nbG9iYWxUaGlzJHBkZmpzV29yayA9IGdsb2JhbFRoaXMucGRmanNXb3JrZXIpID09PSBudWxsIHx8IF9nbG9iYWxUaGlzJHBkZmpzV29yayA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dsb2JhbFRoaXMkcGRmanNXb3JrLldvcmtlck1lc3NhZ2VIYW5kbGVyKSB8fCBudWxsO1xuICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQ4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBfc2V0dXBGYWtlV29ya2VyR2xvYmFsKCkge1xuICAgICAgICAgIGNvbnN0IGxvYWRlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlciA9IHRoaXMuX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICAgICAgICAgIGlmIChtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIpIHJldHVybiBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgICAgICAgICBpZiAoX3V0aWwuaXNOb2RlSlMgJiYgXCJmdW5jdGlvblwiID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICBjb25zdCB3b3JrZXIgPSBldmFsKFwicmVxdWlyZVwiKSh0aGlzLndvcmtlclNyYyk7XG4gICAgICAgICAgICAgIHJldHVybiB3b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCAoMCwgX2Rpc3BsYXlfdXRpbHMubG9hZFNjcmlwdCkodGhpcy53b3JrZXJTcmMpO1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5wZGZqc1dvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCBcIl9zZXR1cEZha2VXb3JrZXJHbG9iYWxcIiwgbG9hZGVyKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX2wgPSB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbmV3IFdlYWtNYXAoKVxuICAgICAgfTtcbiAgICAgIGV4cG9ydHMuUERGV29ya2VyID0gUERGV29ya2VyO1xuICAgICAgdmFyIF9jID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2ggPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF91MiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9wID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBXb3JrZXJUcmFuc3BvcnQge1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDMsIF9lMywgX24yLCBfaTIsIHIpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3ApO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9jLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgTWFwKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3IE1hcCgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2QsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF91Miwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBfdDM7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nVGFzayA9IF9lMztcbiAgICAgICAgICB0aGlzLmNvbW1vbk9ianMgPSBuZXcgUERGT2JqZWN0cygpO1xuICAgICAgICAgIHRoaXMuZm9udExvYWRlciA9IG5ldyBfZm9udF9sb2FkZXIuRm9udExvYWRlcih7XG4gICAgICAgICAgICBvd25lckRvY3VtZW50OiBfaTIub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIHN0eWxlRWxlbWVudDogX2kyLnN0eWxlRWxlbWVudFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3BhcmFtcyA9IF9pMjtcbiAgICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSByLmNhbnZhc0ZhY3Rvcnk7XG4gICAgICAgICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gci5maWx0ZXJGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuY01hcFJlYWRlckZhY3RvcnkgPSByLmNNYXBSZWFkZXJGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSByLnN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuZGVzdHJveWVkID0gITE7XG4gICAgICAgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fbmV0d29ya1N0cmVhbSA9IF9uMjtcbiAgICAgICAgICB0aGlzLl9mdWxsUmVhZGVyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuc2V0dXBNZXNzYWdlSGFuZGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBhbm5vdGF0aW9uU3RvcmFnZSgpIHtcbiAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJhbm5vdGF0aW9uU3RvcmFnZVwiLCBuZXcgX2Fubm90YXRpb25fc3RvcmFnZS5Bbm5vdGF0aW9uU3RvcmFnZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRSZW5kZXJpbmdJbnRlbnQodCkge1xuICAgICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEUsXG4gICAgICAgICAgICBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiBudWxsLFxuICAgICAgICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzNdICYmIGFyZ3VtZW50c1szXSxcbiAgICAgICAgICAgIHIgPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVksXG4gICAgICAgICAgICBzID0gX2Fubm90YXRpb25fc3RvcmFnZS5TZXJpYWxpemFibGVFbXB0eTtcbiAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgICAgICAgICAgciA9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5ZO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkaXNwbGF5XCI6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInByaW50XCI6XG4gICAgICAgICAgICAgIHIgPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShcImdldFJlbmRlcmluZ0ludGVudCAtIGludmFsaWQgaW50ZW50OiBcIi5jb25jYXQodCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbk1vZGUuRElTQUJMRTpcbiAgICAgICAgICAgICAgciArPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0RJU0FCTEU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEU6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEVfRk9STVM6XG4gICAgICAgICAgICAgIHIgKz0gX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5BTk5PVEFUSU9OU19GT1JNUztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRV9TVE9SQUdFOlxuICAgICAgICAgICAgICByICs9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfU1RPUkFHRTtcbiAgICAgICAgICAgICAgcyA9IChyICYgX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCAmJiBuIGluc3RhbmNlb2YgX2Fubm90YXRpb25fc3RvcmFnZS5QcmludEFubm90YXRpb25TdG9yYWdlID8gbiA6IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UpLnNlcmlhbGl6YWJsZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoXCJnZXRSZW5kZXJpbmdJbnRlbnQgLSBpbnZhbGlkIGFubm90YXRpb25Nb2RlOiBcIi5jb25jYXQoZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpICYmIChyICs9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuT1BMSVNUKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVuZGVyaW5nSW50ZW50OiByLFxuICAgICAgICAgICAgY2FjaGVLZXk6IFwiXCIuY29uY2F0KHIsIFwiX1wiKS5jb25jYXQocy5oYXNoKSxcbiAgICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlOiBzXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQyO1xuICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5KSByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICAgIHRoaXMuZGVzdHJveWVkID0gITA7XG4gICAgICAgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQyID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF91MikpID09PSBudWxsIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDIucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkIGR1cmluZyBvblBhc3N3b3JkIGNhbGxiYWNrXCIpKTtcbiAgICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaCkudmFsdWVzKCkpIHQucHVzaChlLl9kZXN0cm95KCkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaCkuY2xlYXIoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2QpLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5oYXNPd25Qcm9wZXJ0eShcImFubm90YXRpb25TdG9yYWdlXCIpICYmIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpO1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIlRlcm1pbmF0ZVwiLCBudWxsKTtcbiAgICAgICAgICB0LnB1c2goZSk7XG4gICAgICAgICAgUHJvbWlzZS5hbGwodCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuZm9udExvYWRlci5jbGVhcigpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jKS5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJGYWN0b3J5LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX25ldHdvcmtTdHJlYW0gJiYgdGhpcy5fbmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oXCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuXCIpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgIH0sIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHNldHVwTWVzc2FnZUhhbmRsZXIoKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXI6IHQsXG4gICAgICAgICAgICBsb2FkaW5nVGFzazogZVxuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIHQub24oXCJHZXRSZWFkZXJcIiwgKHQsIGUpID0+IHtcbiAgICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHRoaXMuX25ldHdvcmtTdHJlYW0sIFwiR2V0UmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIik7XG4gICAgICAgICAgICB0aGlzLl9mdWxsUmVhZGVyID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyKCk7XG4gICAgICAgICAgICB0aGlzLl9mdWxsUmVhZGVyLm9uUHJvZ3Jlc3MgPSB0ID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzID0ge1xuICAgICAgICAgICAgICAgIGxvYWRlZDogdC5sb2FkZWQsXG4gICAgICAgICAgICAgICAgdG90YWw6IHQudG90YWxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlLm9uUHVsbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fZnVsbFJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogbixcbiAgICAgICAgICAgICAgICAgIGRvbmU6IGlcbiAgICAgICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICAgICAgICBpZiAoaSkgZS5jbG9zZSgpO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgKDAsIF91dGlsLmFzc2VydCkobiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyLCBcIkdldFJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLlwiKTtcbiAgICAgICAgICAgICAgICAgIGUuZW5xdWV1ZShuZXcgVWludDhBcnJheShuKSwgMSwgW25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4ge1xuICAgICAgICAgICAgICAgIGUuZXJyb3IodCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGUub25DYW5jZWwgPSB0ID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fZnVsbFJlYWRlci5jYW5jZWwodCk7XG4gICAgICAgICAgICAgIGUucmVhZHkuY2F0Y2godCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkgdGhyb3cgdDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHQub24oXCJSZWFkZXJIZWFkZXJzUmVhZHlcIiwgdCA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCksXG4gICAgICAgICAgICAgIGkgPSB0aGlzLl9mdWxsUmVhZGVyO1xuICAgICAgICAgICAgaS5oZWFkZXJzUmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaS5pc1N0cmVhbWluZ1N1cHBvcnRlZCB8fCAhaS5pc1JhbmdlU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9lJG9uUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzICYmICgoX2Ukb25Qcm9ncmVzcyA9IGUub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX2Ukb25Qcm9ncmVzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Ukb25Qcm9ncmVzcy5jYWxsKGUsIHRoaXMuX2xhc3RQcm9ncmVzcykpO1xuICAgICAgICAgICAgICAgIGkub25Qcm9ncmVzcyA9IHQgPT4ge1xuICAgICAgICAgICAgICAgICAgdmFyIF9lJG9uUHJvZ3Jlc3MyO1xuICAgICAgICAgICAgICAgICAgKF9lJG9uUHJvZ3Jlc3MyID0gZS5vblByb2dyZXNzKSA9PT0gbnVsbCB8fCBfZSRvblByb2dyZXNzMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Ukb25Qcm9ncmVzczIuY2FsbChlLCB7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdC5sb2FkZWQsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsOiB0LnRvdGFsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG4ucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgaXNTdHJlYW1pbmdTdXBwb3J0ZWQ6IGkuaXNTdHJlYW1pbmdTdXBwb3J0ZWQsXG4gICAgICAgICAgICAgICAgaXNSYW5nZVN1cHBvcnRlZDogaS5pc1JhbmdlU3VwcG9ydGVkLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGkuY29udGVudExlbmd0aFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIG4ucmVqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBuLnByb21pc2U7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIkdldFJhbmdlUmVhZGVyXCIsICh0LCBlKSA9PiB7XG4gICAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0aGlzLl9uZXR3b3JrU3RyZWFtLCBcIkdldFJhbmdlUmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIik7XG4gICAgICAgICAgICBjb25zdCBuID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcih0LmJlZ2luLCB0LmVuZCk7XG4gICAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgICBlLm9uUHVsbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBuLnJlYWQoKS50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbixcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogaVxuICAgICAgICAgICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgICAgICAgICBpZiAoaSkgZS5jbG9zZSgpO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShuIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIsIFwiR2V0UmFuZ2VSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci5cIik7XG4gICAgICAgICAgICAgICAgICAgIGUuZW5xdWV1ZShuZXcgVWludDhBcnJheShuKSwgMSwgW25dKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuZXJyb3IodCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGUub25DYW5jZWwgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBuLmNhbmNlbCh0KTtcbiAgICAgICAgICAgICAgICBlLnJlYWR5LmNhdGNoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkgdGhyb3cgdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBlLmNsb3NlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIkdldERvY1wiLCB0ID0+IHtcbiAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgIHBkZkluZm86IG5cbiAgICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICAgdGhpcy5fbnVtUGFnZXMgPSBuLm51bVBhZ2VzO1xuICAgICAgICAgICAgdGhpcy5faHRtbEZvclhmYSA9IG4uaHRtbEZvclhmYTtcbiAgICAgICAgICAgIGRlbGV0ZSBuLmh0bWxGb3JYZmE7XG4gICAgICAgICAgICBlLl9jYXBhYmlsaXR5LnJlc29sdmUobmV3IFBERkRvY3VtZW50UHJveHkobiwgdGhpcykpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHQub24oXCJEb2NFeGNlcHRpb25cIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGxldCBuO1xuICAgICAgICAgICAgc3dpdGNoICh0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIlBhc3N3b3JkRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICAgICAgbiA9IG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbih0Lm1lc3NhZ2UsIHQuY29kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJJbnZhbGlkUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICAgICAgbiA9IG5ldyBfdXRpbC5JbnZhbGlkUERGRXhjZXB0aW9uKHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICAgICAgbiA9IG5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIjpcbiAgICAgICAgICAgICAgICBuID0gbmV3IF91dGlsLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbih0Lm1lc3NhZ2UsIHQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcIlVua25vd25FcnJvckV4Y2VwdGlvblwiOlxuICAgICAgICAgICAgICAgIG4gPSBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKHQubWVzc2FnZSwgdC5kZXRhaWxzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiRG9jRXhjZXB0aW9uIC0gZXhwZWN0ZWQgYSB2YWxpZCBFcnJvci5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLl9jYXBhYmlsaXR5LnJlamVjdChuKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0Lm9uKFwiUGFzc3dvcmRSZXF1ZXN0XCIsIHQgPT4ge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF91MiwgbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCkpO1xuICAgICAgICAgICAgaWYgKGUub25QYXNzd29yZCkge1xuICAgICAgICAgICAgICBjb25zdCB1cGRhdGVQYXNzd29yZCA9IHQgPT4ge1xuICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBFcnJvciA/IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdTIpLnJlamVjdCh0KSA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdTIpLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlLm9uUGFzc3dvcmQodXBkYXRlUGFzc3dvcmQsIHQuY29kZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3UyKS5yZWplY3QodCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3UyKS5yZWplY3QobmV3IF91dGlsLlBhc3N3b3JkRXhjZXB0aW9uKHQubWVzc2FnZSwgdC5jb2RlKSk7XG4gICAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF91MikucHJvbWlzZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0Lm9uKFwiRGF0YUxvYWRlZFwiLCB0ID0+IHtcbiAgICAgICAgICAgIHZhciBfZSRvblByb2dyZXNzMztcbiAgICAgICAgICAgIChfZSRvblByb2dyZXNzMyA9IGUub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX2Ukb25Qcm9ncmVzczMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lJG9uUHJvZ3Jlc3MzLmNhbGwoZSwge1xuICAgICAgICAgICAgICBsb2FkZWQ6IHQubGVuZ3RoLFxuICAgICAgICAgICAgICB0b3RhbDogdC5sZW5ndGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnJlc29sdmUodCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIlN0YXJ0UmVuZGVyUGFnZVwiLCB0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9oKS5nZXQodC5wYWdlSW5kZXgpLl9zdGFydFJlbmRlclBhZ2UodC50cmFuc3BhcmVuY3ksIHQuY2FjaGVLZXkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHQub24oXCJjb21tb25vYmpcIiwgZSA9PiB7XG4gICAgICAgICAgICB2YXIgX2dsb2JhbFRoaXMkRm9udEluc3BlO1xuICAgICAgICAgICAgbGV0IFtuLCBpLCByXSA9IGU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVzdHJveWVkICYmICF0aGlzLmNvbW1vbk9ianMuaGFzKG4pKSBzd2l0Y2ggKGkpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5fcGFyYW1zO1xuICAgICAgICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gcikge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHIuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoXCJFcnJvciBkdXJpbmcgZm9udCBsb2FkaW5nOiBcIi5jb25jYXQodCkpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUobiwgdCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUucGRmQnVnICYmIChfZ2xvYmFsVGhpcyRGb250SW5zcGUgPSBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IpICE9PSBudWxsICYmIF9nbG9iYWxUaGlzJEZvbnRJbnNwZSAhPT0gdm9pZCAwICYmIF9nbG9iYWxUaGlzJEZvbnRJbnNwZS5lbmFibGVkID8gKHQsIGUpID0+IGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5mb250QWRkZWQodCwgZSkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgYSA9IG5ldyBfZm9udF9sb2FkZXIuRm9udEZhY2VPYmplY3Qociwge1xuICAgICAgICAgICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IGUuaXNFdmFsU3VwcG9ydGVkLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlRm9udEZhY2U6IGUuZGlzYWJsZUZvbnRGYWNlLFxuICAgICAgICAgICAgICAgICAgICBpZ25vcmVFcnJvcnM6IGUuaWdub3JlRXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICBpbnNwZWN0Rm9udDogc1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb250TG9hZGVyLmJpbmQoYSkuY2F0Y2goZSA9PiB0LnNlbmRXaXRoUHJvbWlzZShcIkZvbnRGYWxsYmFja1wiLCB7XG4gICAgICAgICAgICAgICAgICBpZDogblxuICAgICAgICAgICAgICAgIH0pKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICFlLmZvbnRFeHRyYVByb3BlcnRpZXMgJiYgYS5kYXRhICYmIChhLmRhdGEgPSBudWxsKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKG4sIGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiRm9udFBhdGhcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkltYWdlXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJQYXR0ZXJuXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUobiwgcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHVua25vd24gY29tbW9uIG9iamVjdCB0eXBlIFwiLmNvbmNhdChpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIm9ialwiLCB0ID0+IHtcbiAgICAgICAgICAgIGxldCBbZSwgbiwgaSwgcl0gPSB0O1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBzID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9oKS5nZXQobik7XG4gICAgICAgICAgICBpZiAoIXMub2Jqcy5oYXMoZSkpIHN3aXRjaCAoaSkge1xuICAgICAgICAgICAgICBjYXNlIFwiSW1hZ2VcIjpcbiAgICAgICAgICAgICAgICBzLm9ianMucmVzb2x2ZShlLCByKTtcbiAgICAgICAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgICAgICAgdmFyIF9yJGRhdGE7XG4gICAgICAgICAgICAgICAgICBsZXQgdDtcbiAgICAgICAgICAgICAgICAgIGlmIChyLmJpdG1hcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICAgICAgICAgIH0gPSByO1xuICAgICAgICAgICAgICAgICAgICB0ID0gZSAqIG4gKiA0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHQgPSAoKF9yJGRhdGEgPSByLmRhdGEpID09PSBudWxsIHx8IF9yJGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yJGRhdGEubGVuZ3RoKSB8fCAwO1xuICAgICAgICAgICAgICAgICAgdCA+IF91dGlsLk1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFICYmIChzLl9tYXliZUNsZWFudXBBZnRlclJlbmRlciA9ICEwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJQYXR0ZXJuXCI6XG4gICAgICAgICAgICAgICAgcy5vYmpzLnJlc29sdmUoZSwgcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHVua25vd24gb2JqZWN0IHR5cGUgXCIuY29uY2F0KGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0Lm9uKFwiRG9jUHJvZ3Jlc3NcIiwgdCA9PiB7XG4gICAgICAgICAgICB2YXIgX2Ukb25Qcm9ncmVzczQ7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3llZCB8fCAoKF9lJG9uUHJvZ3Jlc3M0ID0gZS5vblByb2dyZXNzKSA9PT0gbnVsbCB8fCBfZSRvblByb2dyZXNzNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Ukb25Qcm9ncmVzczQuY2FsbChlLCB7XG4gICAgICAgICAgICAgIGxvYWRlZDogdC5sb2FkZWQsXG4gICAgICAgICAgICAgIHRvdGFsOiB0LnRvdGFsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIkZldGNoQnVpbHRJbkNNYXBcIiwgdCA9PiB0aGlzLmRlc3Ryb3llZCA/IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkLlwiKSkgOiB0aGlzLmNNYXBSZWFkZXJGYWN0b3J5ID8gdGhpcy5jTWFwUmVhZGVyRmFjdG9yeS5mZXRjaCh0KSA6IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNNYXBSZWFkZXJGYWN0b3J5IG5vdCBpbml0aWFsaXplZCwgc2VlIHRoZSBgdXNlV29ya2VyRmV0Y2hgIHBhcmFtZXRlci5cIikpKTtcbiAgICAgICAgICB0Lm9uKFwiRmV0Y2hTdGFuZGFyZEZvbnREYXRhXCIsIHQgPT4gdGhpcy5kZXN0cm95ZWQgPyBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZC5cIikpIDogdGhpcy5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA/IHRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkuZmV0Y2godCkgOiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQsIHNlZSB0aGUgYHVzZVdvcmtlckZldGNoYCBwYXJhbWV0ZXIuXCIpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RGF0YSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREYXRhXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHNhdmVEb2N1bWVudCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZWFkZXIkZmlsLCBfdGhpcyRfZnVsbFJlYWRlcjtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNpemUgPD0gMCAmJiAoMCwgX3V0aWwud2FybikoXCJzYXZlRG9jdW1lbnQgY2FsbGVkIHdoaWxlIGBhbm5vdGF0aW9uU3RvcmFnZWAgaXMgZW1wdHksIHBsZWFzZSB1c2UgdGhlIGdldERhdGEtbWV0aG9kIGluc3RlYWQuXCIpO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG1hcDogdCxcbiAgICAgICAgICAgIHRyYW5zZmVyczogZVxuICAgICAgICAgIH0gPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNlcmlhbGl6YWJsZTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJTYXZlRG9jdW1lbnRcIiwge1xuICAgICAgICAgICAgaXNQdXJlWGZhOiAhIXRoaXMuX2h0bWxGb3JYZmEsXG4gICAgICAgICAgICBudW1QYWdlczogdGhpcy5fbnVtUGFnZXMsXG4gICAgICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogdCxcbiAgICAgICAgICAgIGZpbGVuYW1lOiAoX3RoaXMkX2Z1bGxSZWFkZXIkZmlsID0gKF90aGlzJF9mdWxsUmVhZGVyID0gdGhpcy5fZnVsbFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZWFkZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVhZGVyLmZpbGVuYW1lKSAhPT0gbnVsbCAmJiBfdGhpcyRfZnVsbFJlYWRlciRmaWwgIT09IHZvaWQgMCA/IF90aGlzJF9mdWxsUmVhZGVyJGZpbCA6IG51bGxcbiAgICAgICAgICB9LCBlKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhZ2UodCkge1xuICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih0KSB8fCB0IDw9IDAgfHwgdCA+IHRoaXMuX251bVBhZ2VzKSByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBwYWdlIHJlcXVlc3QuXCIpKTtcbiAgICAgICAgICBjb25zdCBlID0gdCAtIDEsXG4gICAgICAgICAgICBuID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9kKS5nZXQoZSk7XG4gICAgICAgICAgaWYgKG4pIHJldHVybiBuO1xuICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VcIiwge1xuICAgICAgICAgICAgcGFnZUluZGV4OiBlXG4gICAgICAgICAgfSkudGhlbih0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgdGhyb3cgbmV3IEVycm9yKFwiVHJhbnNwb3J0IGRlc3Ryb3llZFwiKTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUERGUGFnZVByb3h5KGUsIHQsIHRoaXMsIHRoaXMuX3BhcmFtcy5wZGZCdWcpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9oKS5zZXQoZSwgbik7XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2QpLnNldChlLCBpKTtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBnZXRQYWdlSW5kZXgodCkge1xuICAgICAgICAgIHJldHVybiBcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8IG51bGwgPT09IHQgfHwgIU51bWJlci5pc0ludGVnZXIodC5udW0pIHx8IHQubnVtIDwgMCB8fCAhTnVtYmVyLmlzSW50ZWdlcih0LmdlbikgfHwgdC5nZW4gPCAwID8gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBwYWdlSW5kZXggcmVxdWVzdC5cIikpIDogdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlSW5kZXhcIiwge1xuICAgICAgICAgICAgbnVtOiB0Lm51bSxcbiAgICAgICAgICAgIGdlbjogdC5nZW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRBbm5vdGF0aW9ucyh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0QW5ub3RhdGlvbnNcIiwge1xuICAgICAgICAgICAgcGFnZUluZGV4OiB0LFxuICAgICAgICAgICAgaW50ZW50OiBlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RmllbGRPYmplY3RzKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9wLCBfcDIpLmNhbGwodGhpcywgXCJHZXRGaWVsZE9iamVjdHNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaGFzSlNBY3Rpb25zKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9wLCBfcDIpLmNhbGwodGhpcywgXCJIYXNKU0FjdGlvbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q2FsY3VsYXRpb25PcmRlcklkcygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRDYWxjdWxhdGlvbk9yZGVySWRzXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGdldERlc3RpbmF0aW9ucygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREZXN0aW5hdGlvbnNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RGVzdGluYXRpb24odCkge1xuICAgICAgICAgIHJldHVybiBcInN0cmluZ1wiICE9IHR5cGVvZiB0ID8gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBkZXN0aW5hdGlvbiByZXF1ZXN0LlwiKSkgOiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERlc3RpbmF0aW9uXCIsIHtcbiAgICAgICAgICAgIGlkOiB0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGFnZUxhYmVscygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTGFiZWxzXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhZ2VMYXlvdXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUxheW91dFwiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRQYWdlTW9kZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTW9kZVwiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRWaWV3ZXJQcmVmZXJlbmNlc1wiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRPcGVuQWN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldE9wZW5BY3Rpb25cIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0QXR0YWNobWVudHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0QXR0YWNobWVudHNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SmF2YVNjcmlwdCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRKYXZhU2NyaXB0XCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGdldERvY0pTQWN0aW9ucygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREb2NKU0FjdGlvbnNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGFnZUpTQWN0aW9ucyh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUpTQWN0aW9uc1wiLCB7XG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRTdHJ1Y3RUcmVlKHQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRTdHJ1Y3RUcmVlXCIsIHtcbiAgICAgICAgICAgIHBhZ2VJbmRleDogdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldE91dGxpbmUoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3V0bGluZVwiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3B0aW9uYWxDb250ZW50Q29uZmlnXCIsIG51bGwpLnRoZW4odCA9PiBuZXcgX29wdGlvbmFsX2NvbnRlbnRfY29uZmlnLk9wdGlvbmFsQ29udGVudENvbmZpZyh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGVybWlzc2lvbnMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGVybWlzc2lvbnNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IFwiR2V0TWV0YWRhdGFcIixcbiAgICAgICAgICAgIGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2MpLmdldCh0KTtcbiAgICAgICAgICBpZiAoZSkgcmV0dXJuIGU7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKHQsIG51bGwpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZWFkZXIkZmlsMiwgX3RoaXMkX2Z1bGxSZWFkZXIyLCBfdGhpcyRfZnVsbFJlYWRlciRjb24sIF90aGlzJF9mdWxsUmVhZGVyMztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGluZm86IHRbMF0sXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB0WzFdID8gbmV3IF9tZXRhZGF0YS5NZXRhZGF0YSh0WzFdKSA6IG51bGwsXG4gICAgICAgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lOiAoX3RoaXMkX2Z1bGxSZWFkZXIkZmlsMiA9IChfdGhpcyRfZnVsbFJlYWRlcjIgPSB0aGlzLl9mdWxsUmVhZGVyKSA9PT0gbnVsbCB8fCBfdGhpcyRfZnVsbFJlYWRlcjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVhZGVyMi5maWxlbmFtZSkgIT09IG51bGwgJiYgX3RoaXMkX2Z1bGxSZWFkZXIkZmlsMiAhPT0gdm9pZCAwID8gX3RoaXMkX2Z1bGxSZWFkZXIkZmlsMiA6IG51bGwsXG4gICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IChfdGhpcyRfZnVsbFJlYWRlciRjb24gPSAoX3RoaXMkX2Z1bGxSZWFkZXIzID0gdGhpcy5fZnVsbFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZWFkZXIzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfZnVsbFJlYWRlcjMuY29udGVudExlbmd0aCkgIT09IG51bGwgJiYgX3RoaXMkX2Z1bGxSZWFkZXIkY29uICE9PSB2b2lkIDAgPyBfdGhpcyRfZnVsbFJlYWRlciRjb24gOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYykuc2V0KHQsIG4pO1xuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgICAgIGdldE1hcmtJbmZvKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldE1hcmtJbmZvXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHN0YXJ0Q2xlYW51cCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdICYmIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICBpZiAoIXRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkNsZWFudXBcIiwgbnVsbCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9oKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgICBpZiAoIXQuY2xlYW51cCgpKSB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydENsZWFudXA6IFBhZ2UgXCIuY29uY2F0KHQucGFnZU51bWJlciwgXCIgaXMgY3VycmVudGx5IHJlbmRlcmluZy5cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLmNsZWFyKCk7XG4gICAgICAgICAgICB0IHx8IHRoaXMuZm9udExvYWRlci5jbGVhcigpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jKS5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJGYWN0b3J5LmRlc3Ryb3koITApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgbG9hZGluZ1BhcmFtcygpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBkaXNhYmxlQXV0b0ZldGNoOiB0LFxuICAgICAgICAgICAgZW5hYmxlWGZhOiBlXG4gICAgICAgICAgfSA9IHRoaXMuX3BhcmFtcztcbiAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJsb2FkaW5nUGFyYW1zXCIsIHtcbiAgICAgICAgICAgIGRpc2FibGVBdXRvRmV0Y2g6IHQsXG4gICAgICAgICAgICBlbmFibGVYZmE6IGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3AyKHQpIHtcbiAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgIGNvbnN0IG4gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2MpLmdldCh0KTtcbiAgICAgICAgaWYgKG4pIHJldHVybiBuO1xuICAgICAgICBjb25zdCBpID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UodCwgZSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYykuc2V0KHQsIGkpO1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICAgIHZhciBfZiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9nID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBQREZPYmplY3RzIHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9nKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9nLCBfZzIpLmNhbGwodGhpcywgdCk7XG4gICAgICAgICAgICBuLmNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IGUobi5kYXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZilbdF07XG4gICAgICAgICAgaWYgKCEobiAhPT0gbnVsbCAmJiBuICE9PSB2b2lkIDAgJiYgbi5jYXBhYmlsaXR5LnNldHRsZWQpKSB0aHJvdyBuZXcgRXJyb3IoXCJSZXF1ZXN0aW5nIG9iamVjdCB0aGF0IGlzbid0IHJlc29sdmVkIHlldCBcIi5jb25jYXQodCwgXCIuXCIpKTtcbiAgICAgICAgICByZXR1cm4gbi5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIGhhcyh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZilbdF07XG4gICAgICAgICAgcmV0dXJuIChlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUuY2FwYWJpbGl0eS5zZXR0bGVkKSB8fCAhMTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBuID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfZywgX2cyKS5jYWxsKHRoaXMsIHQpO1xuICAgICAgICAgIG4uZGF0YSA9IGU7XG4gICAgICAgICAgbi5jYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgaW4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mKSkge1xuICAgICAgICAgICAgdmFyIF9lJGJpdG1hcDtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgZGF0YTogZVxuICAgICAgICAgICAgfSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZilbdF07XG4gICAgICAgICAgICBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCB8fCAoX2UkYml0bWFwID0gZS5iaXRtYXApID09PSBudWxsIHx8IF9lJGJpdG1hcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UkYml0bWFwLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfZiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9nMih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2YpW3RdO1xuICAgICAgICByZXR1cm4gZSB8fCAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mKVt0XSA9IHtcbiAgICAgICAgICBjYXBhYmlsaXR5OiBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKSxcbiAgICAgICAgICBkYXRhOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIF9tID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICBjbGFzcyBSZW5kZXJUYXNrIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9tLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9tLCB0KTtcbiAgICAgICAgICB0aGlzLm9uQ29udGludWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX20pLmNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwoKSB7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IDA7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tKS5jYW5jZWwobnVsbCwgdCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHNlcGFyYXRlQW5ub3RzKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHNlcGFyYXRlQW5ub3RzOiB0XG4gICAgICAgICAgfSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbSkub3BlcmF0b3JMaXN0O1xuICAgICAgICAgIGlmICghdCkgcmV0dXJuICExO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGFubm90YXRpb25DYW52YXNNYXA6IGVcbiAgICAgICAgICB9ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tKTtcbiAgICAgICAgICByZXR1cm4gdC5mb3JtIHx8IHQuY2FudmFzICYmIChlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUuc2l6ZSkgPiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBleHBvcnRzLlJlbmRlclRhc2sgPSBSZW5kZXJUYXNrO1xuICAgICAgY2xhc3MgSW50ZXJuYWxSZW5kZXJUYXNrIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBjYWxsYmFjazogZSxcbiAgICAgICAgICAgIHBhcmFtczogbixcbiAgICAgICAgICAgIG9ianM6IGksXG4gICAgICAgICAgICBjb21tb25PYmpzOiByLFxuICAgICAgICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcDogcyxcbiAgICAgICAgICAgIG9wZXJhdG9yTGlzdDogYSxcbiAgICAgICAgICAgIHBhZ2VJbmRleDogbyxcbiAgICAgICAgICAgIGNhbnZhc0ZhY3Rvcnk6IGwsXG4gICAgICAgICAgICBmaWx0ZXJGYWN0b3J5OiBjLFxuICAgICAgICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOiBoID0gITEsXG4gICAgICAgICAgICBwZGZCdWc6IGQgPSAhMSxcbiAgICAgICAgICAgIHBhZ2VDb2xvcnM6IHUgPSBudWxsXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGU7XG4gICAgICAgICAgdGhpcy5wYXJhbXMgPSBuO1xuICAgICAgICAgIHRoaXMub2JqcyA9IGk7XG4gICAgICAgICAgdGhpcy5jb21tb25PYmpzID0gcjtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAgPSBzO1xuICAgICAgICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IGE7XG4gICAgICAgICAgdGhpcy5fcGFnZUluZGV4ID0gbztcbiAgICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBsO1xuICAgICAgICAgIHRoaXMuZmlsdGVyRmFjdG9yeSA9IGM7XG4gICAgICAgICAgdGhpcy5fcGRmQnVnID0gZDtcbiAgICAgICAgICB0aGlzLnBhZ2VDb2xvcnMgPSB1O1xuICAgICAgICAgIHRoaXMucnVubmluZyA9ICExO1xuICAgICAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmdyYXBoaWNzUmVhZHkgPSAhMTtcbiAgICAgICAgICB0aGlzLl91c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSAhMCA9PT0gaCAmJiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiB3aW5kb3c7XG4gICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSAhMTtcbiAgICAgICAgICB0aGlzLmNhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLnRhc2sgPSBuZXcgUmVuZGVyVGFzayh0aGlzKTtcbiAgICAgICAgICB0aGlzLl9jYW5jZWxCb3VuZCA9IHRoaXMuY2FuY2VsLmJpbmQodGhpcyk7XG4gICAgICAgICAgdGhpcy5fY29udGludWVCb3VuZCA9IHRoaXMuX2NvbnRpbnVlLmJpbmQodGhpcyk7XG4gICAgICAgICAgdGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQgPSB0aGlzLl9zY2hlZHVsZU5leHQuYmluZCh0aGlzKTtcbiAgICAgICAgICB0aGlzLl9uZXh0Qm91bmQgPSB0aGlzLl9uZXh0LmJpbmQodGhpcyk7XG4gICAgICAgICAgdGhpcy5fY2FudmFzID0gbi5jYW52YXNDb250ZXh0LmNhbnZhcztcbiAgICAgICAgfVxuICAgICAgICBnZXQgY29tcGxldGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNhcGFiaWxpdHkucHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5pdGlhbGl6ZUdyYXBoaWNzKHQpIHtcbiAgICAgICAgICB2YXIgX2dsb2JhbFRoaXMkU3RlcHBlck1hLCBfdGhpcyRncmFwaGljc1JlYWR5Q2E7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIHRyYW5zcGFyZW5jeTogZSA9ICExLFxuICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnOiBuXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgaWYgKHRoaXMuY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICAgICAgaWYgKHRoaXMuX2NhbnZhcykge1xuICAgICAgICAgICAgaWYgKF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoSW50ZXJuYWxSZW5kZXJUYXNrLCBJbnRlcm5hbFJlbmRlclRhc2ssIF9iKS5oYXModGhpcy5fY2FudmFzKSkgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVzZSB0aGUgc2FtZSBjYW52YXMgZHVyaW5nIG11bHRpcGxlIHJlbmRlcigpIG9wZXJhdGlvbnMuIFVzZSBkaWZmZXJlbnQgY2FudmFzIG9yIGVuc3VyZSBwcmV2aW91cyBvcGVyYXRpb25zIHdlcmUgY2FuY2VsbGVkIG9yIGNvbXBsZXRlZC5cIik7XG4gICAgICAgICAgICBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjR2V0KEludGVybmFsUmVuZGVyVGFzaywgSW50ZXJuYWxSZW5kZXJUYXNrLCBfYikuYWRkKHRoaXMuX2NhbnZhcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9wZGZCdWcgJiYgKF9nbG9iYWxUaGlzJFN0ZXBwZXJNYSA9IGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXIpICE9PSBudWxsICYmIF9nbG9iYWxUaGlzJFN0ZXBwZXJNYSAhPT0gdm9pZCAwICYmIF9nbG9iYWxUaGlzJFN0ZXBwZXJNYS5lbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0ZXBwZXIgPSBnbG9iYWxUaGlzLlN0ZXBwZXJNYW5hZ2VyLmNyZWF0ZSh0aGlzLl9wYWdlSW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5zdGVwcGVyLmluaXQodGhpcy5vcGVyYXRvckxpc3QpO1xuICAgICAgICAgICAgdGhpcy5zdGVwcGVyLm5leHRCcmVha1BvaW50ID0gdGhpcy5zdGVwcGVyLmdldE5leHRCcmVha1BvaW50KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNhbnZhc0NvbnRleHQ6IGksXG4gICAgICAgICAgICB2aWV3cG9ydDogcixcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcyxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IGFcbiAgICAgICAgICB9ID0gdGhpcy5wYXJhbXM7XG4gICAgICAgICAgdGhpcy5nZnggPSBuZXcgX2NhbnZhcy5DYW52YXNHcmFwaGljcyhpLCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLmZpbHRlckZhY3RvcnksIHtcbiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogblxuICAgICAgICAgIH0sIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCwgdGhpcy5wYWdlQ29sb3JzKTtcbiAgICAgICAgICB0aGlzLmdmeC5iZWdpbkRyYXdpbmcoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzLFxuICAgICAgICAgICAgdmlld3BvcnQ6IHIsXG4gICAgICAgICAgICB0cmFuc3BhcmVuY3k6IGUsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBhXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSAwO1xuICAgICAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeSA9ICEwO1xuICAgICAgICAgIChfdGhpcyRncmFwaGljc1JlYWR5Q2EgPSB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjaykgPT09IG51bGwgfHwgX3RoaXMkZ3JhcGhpY3NSZWFkeUNhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRncmFwaGljc1JlYWR5Q2EuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJGdmeDtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogbnVsbCxcbiAgICAgICAgICAgIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gICAgICAgICAgdGhpcy5ydW5uaW5nID0gITE7XG4gICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSAhMDtcbiAgICAgICAgICAoX3RoaXMkZ2Z4ID0gdGhpcy5nZngpID09PSBudWxsIHx8IF90aGlzJGdmeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZ2Z4LmVuZERyYXdpbmcoKTtcbiAgICAgICAgICB0aGlzLl9jYW52YXMgJiYgX2NsYXNzU3RhdGljUHJpdmF0ZUZpZWxkU3BlY0dldChJbnRlcm5hbFJlbmRlclRhc2ssIEludGVybmFsUmVuZGVyVGFzaywgX2IpLmRlbGV0ZSh0aGlzLl9jYW52YXMpO1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2sodCB8fCBuZXcgX2Rpc3BsYXlfdXRpbHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKFwiUmVuZGVyaW5nIGNhbmNlbGxlZCwgcGFnZSBcIi5jb25jYXQodGhpcy5fcGFnZUluZGV4ICsgMSksIGUpKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVyYXRvckxpc3RDaGFuZ2VkKCkge1xuICAgICAgICAgIGlmICh0aGlzLmdyYXBoaWNzUmVhZHkpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyRzdGVwcGVyO1xuICAgICAgICAgICAgKF90aGlzJHN0ZXBwZXIgPSB0aGlzLnN0ZXBwZXIpID09PSBudWxsIHx8IF90aGlzJHN0ZXBwZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHN0ZXBwZXIudXBkYXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0KTtcbiAgICAgICAgICAgIHRoaXMucnVubmluZyB8fCB0aGlzLl9jb250aW51ZSgpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjayB8fCAodGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2sgPSB0aGlzLl9jb250aW51ZUJvdW5kKTtcbiAgICAgICAgfVxuICAgICAgICBfY29udGludWUoKSB7XG4gICAgICAgICAgdGhpcy5ydW5uaW5nID0gITA7XG4gICAgICAgICAgdGhpcy5jYW5jZWxsZWQgfHwgKHRoaXMudGFzay5vbkNvbnRpbnVlID8gdGhpcy50YXNrLm9uQ29udGludWUodGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQpIDogdGhpcy5fc2NoZWR1bGVOZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIF9zY2hlZHVsZU5leHQoKSB7XG4gICAgICAgICAgdGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9uZXh0Qm91bmQoKS5jYXRjaCh0aGlzLl9jYW5jZWxCb3VuZCk7XG4gICAgICAgICAgfSkgOiBQcm9taXNlLnJlc29sdmUoKS50aGVuKHRoaXMuX25leHRCb3VuZCkuY2F0Y2godGhpcy5fY2FuY2VsQm91bmQpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIF9uZXh0KCkge1xuICAgICAgICAgIGlmICghdGhpcy5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gdGhpcy5nZnguZXhlY3V0ZU9wZXJhdG9yTGlzdCh0aGlzLm9wZXJhdG9yTGlzdCwgdGhpcy5vcGVyYXRvckxpc3RJZHgsIHRoaXMuX2NvbnRpbnVlQm91bmQsIHRoaXMuc3RlcHBlcik7XG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvckxpc3RJZHggPT09IHRoaXMub3BlcmF0b3JMaXN0LmFyZ3NBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gITE7XG4gICAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdmeC5lbmREcmF3aW5nKHRoaXMucGFnZUNvbG9ycyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FudmFzICYmIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoSW50ZXJuYWxSZW5kZXJUYXNrLCBJbnRlcm5hbFJlbmRlclRhc2ssIF9iKS5kZWxldGUodGhpcy5fY2FudmFzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfYiA9IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBuZXcgV2Vha1NldCgpXG4gICAgICB9O1xuICAgICAgY29uc3QgdmVyc2lvbiA9IFwiMy45LjE3OVwiO1xuICAgICAgZXhwb3J0cy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgIGNvbnN0IGJ1aWxkID0gXCIxZWY2ZmJjNTJcIjtcbiAgICAgIGV4cG9ydHMuYnVpbGQgPSBidWlsZDtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbigxMjYpO1xuICAgICAgaSh7XG4gICAgICAgIHRhcmdldDogXCJTZXRcIixcbiAgICAgICAgcHJvdG86ICEwLFxuICAgICAgICByZWFsOiAhMCxcbiAgICAgICAgZm9yY2VkOiAhbigxMzQpKFwiZGlmZmVyZW5jZVwiKVxuICAgICAgfSwge1xuICAgICAgICBkaWZmZXJlbmNlOiByXG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigxMjcpLFxuICAgICAgICByID0gbigxMjgpLFxuICAgICAgICBzID0gbigxMjkpLFxuICAgICAgICBhID0gbigxMzIpLFxuICAgICAgICBvID0gbigxMzMpLFxuICAgICAgICBsID0gbigxMzApLFxuICAgICAgICBjID0gbigxMzEpLFxuICAgICAgICBoID0gci5oYXMsXG4gICAgICAgIGQgPSByLnJlbW92ZTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uIGRpZmZlcmVuY2UodCkge1xuICAgICAgICB2YXIgZSA9IGkodGhpcyksXG4gICAgICAgICAgbiA9IG8odCksXG4gICAgICAgICAgciA9IHMoZSk7XG4gICAgICAgIGEoZSkgPD0gbi5zaXplID8gbChlLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIG4uaW5jbHVkZXModCkgJiYgZChyLCB0KTtcbiAgICAgICAgfSkgOiBjKG4uZ2V0SXRlcmF0b3IoKSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBoKGUsIHQpICYmIGQociwgdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxMjgpLmhhcztcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGkodCk7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE0KSxcbiAgICAgICAgciA9IFNldC5wcm90b3R5cGU7XG4gICAgICB0LmV4cG9ydHMgPSB7XG4gICAgICAgIFNldDogU2V0LFxuICAgICAgICBhZGQ6IGkoci5hZGQpLFxuICAgICAgICBoYXM6IGkoci5oYXMpLFxuICAgICAgICByZW1vdmU6IGkoci5kZWxldGUpLFxuICAgICAgICBwcm90bzogclxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDEyOCksXG4gICAgICAgIHIgPSBuKDEzMCksXG4gICAgICAgIHMgPSBpLlNldCxcbiAgICAgICAgYSA9IGkuYWRkO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSBuZXcgcygpO1xuICAgICAgICByKHQsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgYShlLCB0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE0KSxcbiAgICAgICAgciA9IG4oMTMxKSxcbiAgICAgICAgcyA9IG4oMTI4KSxcbiAgICAgICAgYSA9IHMuU2V0LFxuICAgICAgICBvID0gcy5wcm90byxcbiAgICAgICAgbCA9IGkoby5mb3JFYWNoKSxcbiAgICAgICAgYyA9IGkoby5rZXlzKSxcbiAgICAgICAgaCA9IGMobmV3IGEoKSkubmV4dDtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBuID8gcihjKHQpLCBlLCBoKSA6IGwodCwgZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICBmb3IgKHZhciByLCBzLCBhID0gbiB8fCB0Lm5leHQ7ICEociA9IGkoYSwgdCkpLmRvbmU7KSBpZiAodm9pZCAwICE9PSAocyA9IGUoci52YWx1ZSkpKSByZXR1cm4gcztcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig3MiksXG4gICAgICAgIHIgPSBuKDEyOCk7XG4gICAgICB0LmV4cG9ydHMgPSBpKHIucHJvdG8sIFwic2l6ZVwiLCBcImdldFwiKSB8fCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5zaXplO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMxKSxcbiAgICAgICAgciA9IG4oNDcpLFxuICAgICAgICBzID0gbig4KSxcbiAgICAgICAgYSA9IG4oNjIpLFxuICAgICAgICBvID0gVHlwZUVycm9yLFxuICAgICAgICBsID0gTWF0aC5tYXgsXG4gICAgICAgIFNldFJlY29yZCA9IGZ1bmN0aW9uIFNldFJlY29yZCh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgdGhpcy5zZXQgPSB0O1xuICAgICAgICAgIHRoaXMuc2l6ZSA9IGU7XG4gICAgICAgICAgdGhpcy5oYXMgPSBuO1xuICAgICAgICAgIHRoaXMua2V5cyA9IGk7XG4gICAgICAgIH07XG4gICAgICBTZXRSZWNvcmQucHJvdG90eXBlID0ge1xuICAgICAgICBnZXRJdGVyYXRvcjogZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKSB7XG4gICAgICAgICAgcmV0dXJuIHIocyh0aGlzLmtleXMsIHRoaXMuc2V0KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyh0KSB7XG4gICAgICAgICAgcmV0dXJuIHModGhpcy5oYXMsIHRoaXMuc2V0LCB0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHIodCk7XG4gICAgICAgIHZhciBlID0gK3Quc2l6ZTtcbiAgICAgICAgaWYgKGUgIT0gZSkgdGhyb3cgbyhcIkludmFsaWQgc2l6ZVwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXRSZWNvcmQodCwgbChhKGUpLCAwKSwgaSh0LmhhcyksIGkodC5rZXlzKSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjQpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBuZXcgKGkoXCJTZXRcIikpKClbdF0oe1xuICAgICAgICAgICAgc2l6ZTogMCxcbiAgICAgICAgICAgIGhhczogZnVuY3Rpb24gaGFzKCkge1xuICAgICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAga2V5czogZnVuY3Rpb24ga2V5cygpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbig3KSxcbiAgICAgICAgcyA9IG4oMTM2KTtcbiAgICAgIGkoe1xuICAgICAgICB0YXJnZXQ6IFwiU2V0XCIsXG4gICAgICAgIHByb3RvOiAhMCxcbiAgICAgICAgcmVhbDogITAsXG4gICAgICAgIGZvcmNlZDogIW4oMTM0KShcImludGVyc2VjdGlvblwiKSB8fCByKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gXCIzLDJcIiAhPSBBcnJheS5mcm9tKG5ldyBTZXQoWzEsIDIsIDNdKS5pbnRlcnNlY3Rpb24obmV3IFNldChbMywgMl0pKSk7XG4gICAgICAgIH0pXG4gICAgICB9LCB7XG4gICAgICAgIGludGVyc2VjdGlvbjogc1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMTI3KSxcbiAgICAgICAgciA9IG4oMTI4KSxcbiAgICAgICAgcyA9IG4oMTMyKSxcbiAgICAgICAgYSA9IG4oMTMzKSxcbiAgICAgICAgbyA9IG4oMTMwKSxcbiAgICAgICAgbCA9IG4oMTMxKSxcbiAgICAgICAgYyA9IHIuU2V0LFxuICAgICAgICBoID0gci5hZGQsXG4gICAgICAgIGQgPSByLmhhcztcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uIGludGVyc2VjdGlvbih0KSB7XG4gICAgICAgIHZhciBlID0gaSh0aGlzKSxcbiAgICAgICAgICBuID0gYSh0KSxcbiAgICAgICAgICByID0gbmV3IGMoKTtcbiAgICAgICAgcyhlKSA+IG4uc2l6ZSA/IGwobi5nZXRJdGVyYXRvcigpLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIGQoZSwgdCkgJiYgaChyLCB0KTtcbiAgICAgICAgfSkgOiBvKGUsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgbi5pbmNsdWRlcyh0KSAmJiBoKHIsIHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMyksXG4gICAgICAgIHIgPSBuKDEzOCk7XG4gICAgICBpKHtcbiAgICAgICAgdGFyZ2V0OiBcIlNldFwiLFxuICAgICAgICBwcm90bzogITAsXG4gICAgICAgIHJlYWw6ICEwLFxuICAgICAgICBmb3JjZWQ6ICFuKDEzNCkoXCJpc0Rpc2pvaW50RnJvbVwiKVxuICAgICAgfSwge1xuICAgICAgICBpc0Rpc2pvaW50RnJvbTogclxuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMTI3KSxcbiAgICAgICAgciA9IG4oMTI4KS5oYXMsXG4gICAgICAgIHMgPSBuKDEzMiksXG4gICAgICAgIGEgPSBuKDEzMyksXG4gICAgICAgIG8gPSBuKDEzMCksXG4gICAgICAgIGwgPSBuKDEzMSksXG4gICAgICAgIGMgPSBuKDEzOSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Rpc2pvaW50RnJvbSh0KSB7XG4gICAgICAgIHZhciBlID0gaSh0aGlzKSxcbiAgICAgICAgICBuID0gYSh0KTtcbiAgICAgICAgaWYgKHMoZSkgPD0gbi5zaXplKSByZXR1cm4gITEgIT09IG8oZSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAobi5pbmNsdWRlcyh0KSkgcmV0dXJuICExO1xuICAgICAgICB9LCAhMCk7XG4gICAgICAgIHZhciBoID0gbi5nZXRJdGVyYXRvcigpO1xuICAgICAgICByZXR1cm4gITEgIT09IGwoaCwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAocihlLCB0KSkgcmV0dXJuIGMoaCwgXCJub3JtYWxcIiwgITEpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig4KSxcbiAgICAgICAgciA9IG4oNDcpLFxuICAgICAgICBzID0gbigzMCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICB2YXIgYSwgbztcbiAgICAgICAgcih0KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIShhID0gcyh0LCBcInJldHVyblwiKSkpIHtcbiAgICAgICAgICAgIGlmIChcInRocm93XCIgPT09IGUpIHRocm93IG47XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYSA9IGkoYSwgdCk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICBvID0gITA7XG4gICAgICAgICAgYSA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwidGhyb3dcIiA9PT0gZSkgdGhyb3cgbjtcbiAgICAgICAgaWYgKG8pIHRocm93IGE7XG4gICAgICAgIHIoYSk7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbigxNDEpO1xuICAgICAgaSh7XG4gICAgICAgIHRhcmdldDogXCJTZXRcIixcbiAgICAgICAgcHJvdG86ICEwLFxuICAgICAgICByZWFsOiAhMCxcbiAgICAgICAgZm9yY2VkOiAhbigxMzQpKFwiaXNTdWJzZXRPZlwiKVxuICAgICAgfSwge1xuICAgICAgICBpc1N1YnNldE9mOiByXG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigxMjcpLFxuICAgICAgICByID0gbigxMzIpLFxuICAgICAgICBzID0gbigxMzApLFxuICAgICAgICBhID0gbigxMzMpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gaXNTdWJzZXRPZih0KSB7XG4gICAgICAgIHZhciBlID0gaSh0aGlzKSxcbiAgICAgICAgICBuID0gYSh0KTtcbiAgICAgICAgcmV0dXJuICEocihlKSA+IG4uc2l6ZSkgJiYgITEgIT09IHMoZSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAoIW4uaW5jbHVkZXModCkpIHJldHVybiAhMTtcbiAgICAgICAgfSwgITApO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbigxNDMpO1xuICAgICAgaSh7XG4gICAgICAgIHRhcmdldDogXCJTZXRcIixcbiAgICAgICAgcHJvdG86ICEwLFxuICAgICAgICByZWFsOiAhMCxcbiAgICAgICAgZm9yY2VkOiAhbigxMzQpKFwiaXNTdXBlcnNldE9mXCIpXG4gICAgICB9LCB7XG4gICAgICAgIGlzU3VwZXJzZXRPZjogclxuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMTI3KSxcbiAgICAgICAgciA9IG4oMTI4KS5oYXMsXG4gICAgICAgIHMgPSBuKDEzMiksXG4gICAgICAgIGEgPSBuKDEzMyksXG4gICAgICAgIG8gPSBuKDEzMSksXG4gICAgICAgIGwgPSBuKDEzOSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N1cGVyc2V0T2YodCkge1xuICAgICAgICB2YXIgZSA9IGkodGhpcyksXG4gICAgICAgICAgbiA9IGEodCk7XG4gICAgICAgIGlmIChzKGUpIDwgbi5zaXplKSByZXR1cm4gITE7XG4gICAgICAgIHZhciBjID0gbi5nZXRJdGVyYXRvcigpO1xuICAgICAgICByZXR1cm4gITEgIT09IG8oYywgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAoIXIoZSwgdCkpIHJldHVybiBsKGMsIFwibm9ybWFsXCIsICExKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMyksXG4gICAgICAgIHIgPSBuKDE0NSk7XG4gICAgICBpKHtcbiAgICAgICAgdGFyZ2V0OiBcIlNldFwiLFxuICAgICAgICBwcm90bzogITAsXG4gICAgICAgIHJlYWw6ICEwLFxuICAgICAgICBmb3JjZWQ6ICFuKDEzNCkoXCJzeW1tZXRyaWNEaWZmZXJlbmNlXCIpXG4gICAgICB9LCB7XG4gICAgICAgIHN5bW1ldHJpY0RpZmZlcmVuY2U6IHJcbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDEyNyksXG4gICAgICAgIHIgPSBuKDEyOCksXG4gICAgICAgIHMgPSBuKDEyOSksXG4gICAgICAgIGEgPSBuKDEzMyksXG4gICAgICAgIG8gPSBuKDEzMSksXG4gICAgICAgIGwgPSByLmFkZCxcbiAgICAgICAgYyA9IHIuaGFzLFxuICAgICAgICBoID0gci5yZW1vdmU7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiBzeW1tZXRyaWNEaWZmZXJlbmNlKHQpIHtcbiAgICAgICAgdmFyIGUgPSBpKHRoaXMpLFxuICAgICAgICAgIG4gPSBhKHQpLmdldEl0ZXJhdG9yKCksXG4gICAgICAgICAgciA9IHMoZSk7XG4gICAgICAgIG8obiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBjKGUsIHQpID8gaChyLCB0KSA6IGwociwgdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzKSxcbiAgICAgICAgciA9IG4oMTQ3KTtcbiAgICAgIGkoe1xuICAgICAgICB0YXJnZXQ6IFwiU2V0XCIsXG4gICAgICAgIHByb3RvOiAhMCxcbiAgICAgICAgcmVhbDogITAsXG4gICAgICAgIGZvcmNlZDogIW4oMTM0KShcInVuaW9uXCIpXG4gICAgICB9LCB7XG4gICAgICAgIHVuaW9uOiByXG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigxMjcpLFxuICAgICAgICByID0gbigxMjgpLmFkZCxcbiAgICAgICAgcyA9IG4oMTI5KSxcbiAgICAgICAgYSA9IG4oMTMzKSxcbiAgICAgICAgbyA9IG4oMTMxKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uIHVuaW9uKHQpIHtcbiAgICAgICAgdmFyIGUgPSBpKHRoaXMpLFxuICAgICAgICAgIG4gPSBhKHQpLmdldEl0ZXJhdG9yKCksXG4gICAgICAgICAgbCA9IHMoZSk7XG4gICAgICAgIG8obiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByKGwsIHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGw7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbig0KSxcbiAgICAgICAgcyA9IG4oMjQpLFxuICAgICAgICBhID0gbigxMSksXG4gICAgICAgIG8gPSBuKDQ1KS5mLFxuICAgICAgICBsID0gbigzOSksXG4gICAgICAgIGMgPSBuKDE0OSksXG4gICAgICAgIGggPSBuKDc1KSxcbiAgICAgICAgZCA9IG4oNzYpLFxuICAgICAgICB1ID0gbigxNTApLFxuICAgICAgICBwID0gbig4MiksXG4gICAgICAgIGYgPSBuKDYpLFxuICAgICAgICBnID0gbigzNiksXG4gICAgICAgIG0gPSBcIkRPTUV4Y2VwdGlvblwiLFxuICAgICAgICBiID0gcyhcIkVycm9yXCIpLFxuICAgICAgICB2ID0gcyhtKSxcbiAgICAgICAgeSA9IGZ1bmN0aW9uIERPTUV4Y2VwdGlvbigpIHtcbiAgICAgICAgICBjKHRoaXMsIEEpO1xuICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGUgPSBkKHQgPCAxID8gdm9pZCAwIDogYXJndW1lbnRzWzBdKSxcbiAgICAgICAgICAgIG4gPSBkKHQgPCAyID8gdm9pZCAwIDogYXJndW1lbnRzWzFdLCBcIkVycm9yXCIpLFxuICAgICAgICAgICAgaSA9IG5ldyB2KGUsIG4pLFxuICAgICAgICAgICAgciA9IGIoZSk7XG4gICAgICAgICAgci5uYW1lID0gbTtcbiAgICAgICAgICBvKGksIFwic3RhY2tcIiwgYSgxLCBwKHIuc3RhY2ssIDEpKSk7XG4gICAgICAgICAgaChpLCB0aGlzLCB5KTtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfSxcbiAgICAgICAgQSA9IHkucHJvdG90eXBlID0gdi5wcm90b3R5cGUsXG4gICAgICAgIF8gPSAoXCJzdGFja1wiIGluIGIobSkpLFxuICAgICAgICBTID0gKFwic3RhY2tcIiBpbiBuZXcgdigxLCAyKSksXG4gICAgICAgIEUgPSB2ICYmIGYgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCBtKSxcbiAgICAgICAgeCA9ICEoIUUgfHwgRS53cml0YWJsZSAmJiBFLmNvbmZpZ3VyYWJsZSksXG4gICAgICAgIHcgPSBfICYmICF4ICYmICFTO1xuICAgICAgaSh7XG4gICAgICAgIGdsb2JhbDogITAsXG4gICAgICAgIGNvbnN0cnVjdG9yOiAhMCxcbiAgICAgICAgZm9yY2VkOiBnIHx8IHdcbiAgICAgIH0sIHtcbiAgICAgICAgRE9NRXhjZXB0aW9uOiB3ID8geSA6IHZcbiAgICAgIH0pO1xuICAgICAgdmFyIEMgPSBzKG0pLFxuICAgICAgICBUID0gQy5wcm90b3R5cGU7XG4gICAgICBpZiAoVC5jb25zdHJ1Y3RvciAhPT0gQykge1xuICAgICAgICBnIHx8IG8oVCwgXCJjb25zdHJ1Y3RvclwiLCBhKDEsIEMpKTtcbiAgICAgICAgZm9yICh2YXIgUCBpbiB1KSBpZiAobCh1LCBQKSkge1xuICAgICAgICAgIHZhciBrID0gdVtQXSxcbiAgICAgICAgICAgIE0gPSBrLnM7XG4gICAgICAgICAgbChDLCBNKSB8fCBvKEMsIE0sIGEoNiwgay5jKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDI1KSxcbiAgICAgICAgciA9IFR5cGVFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGlmIChpKGUsIHQpKSByZXR1cm4gdDtcbiAgICAgICAgdGhyb3cgcihcIkluY29ycmVjdCBpbnZvY2F0aW9uXCIpO1xuICAgICAgfTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IHtcbiAgICAgICAgSW5kZXhTaXplRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIklOREVYX1NJWkVfRVJSXCIsXG4gICAgICAgICAgYzogMSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIERPTVN0cmluZ1NpemVFcnJvcjoge1xuICAgICAgICAgIHM6IFwiRE9NU1RSSU5HX1NJWkVfRVJSXCIsXG4gICAgICAgICAgYzogMixcbiAgICAgICAgICBtOiAwXG4gICAgICAgIH0sXG4gICAgICAgIEhpZXJhcmNoeVJlcXVlc3RFcnJvcjoge1xuICAgICAgICAgIHM6IFwiSElFUkFSQ0hZX1JFUVVFU1RfRVJSXCIsXG4gICAgICAgICAgYzogMyxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFdyb25nRG9jdW1lbnRFcnJvcjoge1xuICAgICAgICAgIHM6IFwiV1JPTkdfRE9DVU1FTlRfRVJSXCIsXG4gICAgICAgICAgYzogNCxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIEludmFsaWRDaGFyYWN0ZXJFcnJvcjoge1xuICAgICAgICAgIHM6IFwiSU5WQUxJRF9DSEFSQUNURVJfRVJSXCIsXG4gICAgICAgICAgYzogNSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIE5vRGF0YUFsbG93ZWRFcnJvcjoge1xuICAgICAgICAgIHM6IFwiTk9fREFUQV9BTExPV0VEX0VSUlwiLFxuICAgICAgICAgIGM6IDYsXG4gICAgICAgICAgbTogMFxuICAgICAgICB9LFxuICAgICAgICBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvcjoge1xuICAgICAgICAgIHM6IFwiTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSXCIsXG4gICAgICAgICAgYzogNyxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIE5vdEZvdW5kRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIk5PVF9GT1VORF9FUlJcIixcbiAgICAgICAgICBjOiA4LFxuICAgICAgICAgIG06IDFcbiAgICAgICAgfSxcbiAgICAgICAgTm90U3VwcG9ydGVkRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIk5PVF9TVVBQT1JURURfRVJSXCIsXG4gICAgICAgICAgYzogOSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIEluVXNlQXR0cmlidXRlRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIklOVVNFX0FUVFJJQlVURV9FUlJcIixcbiAgICAgICAgICBjOiAxMCxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIEludmFsaWRTdGF0ZUVycm9yOiB7XG4gICAgICAgICAgczogXCJJTlZBTElEX1NUQVRFX0VSUlwiLFxuICAgICAgICAgIGM6IDExLFxuICAgICAgICAgIG06IDFcbiAgICAgICAgfSxcbiAgICAgICAgU3ludGF4RXJyb3I6IHtcbiAgICAgICAgICBzOiBcIlNZTlRBWF9FUlJcIixcbiAgICAgICAgICBjOiAxMixcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIEludmFsaWRNb2RpZmljYXRpb25FcnJvcjoge1xuICAgICAgICAgIHM6IFwiSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSXCIsXG4gICAgICAgICAgYzogMTMsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBOYW1lc3BhY2VFcnJvcjoge1xuICAgICAgICAgIHM6IFwiTkFNRVNQQUNFX0VSUlwiLFxuICAgICAgICAgIGM6IDE0LFxuICAgICAgICAgIG06IDFcbiAgICAgICAgfSxcbiAgICAgICAgSW52YWxpZEFjY2Vzc0Vycm9yOiB7XG4gICAgICAgICAgczogXCJJTlZBTElEX0FDQ0VTU19FUlJcIixcbiAgICAgICAgICBjOiAxNSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFZhbGlkYXRpb25FcnJvcjoge1xuICAgICAgICAgIHM6IFwiVkFMSURBVElPTl9FUlJcIixcbiAgICAgICAgICBjOiAxNixcbiAgICAgICAgICBtOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFR5cGVNaXNtYXRjaEVycm9yOiB7XG4gICAgICAgICAgczogXCJUWVBFX01JU01BVENIX0VSUlwiLFxuICAgICAgICAgIGM6IDE3LFxuICAgICAgICAgIG06IDFcbiAgICAgICAgfSxcbiAgICAgICAgU2VjdXJpdHlFcnJvcjoge1xuICAgICAgICAgIHM6IFwiU0VDVVJJVFlfRVJSXCIsXG4gICAgICAgICAgYzogMTgsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBOZXR3b3JrRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIk5FVFdPUktfRVJSXCIsXG4gICAgICAgICAgYzogMTksXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBBYm9ydEVycm9yOiB7XG4gICAgICAgICAgczogXCJBQk9SVF9FUlJcIixcbiAgICAgICAgICBjOiAyMCxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFVSTE1pc21hdGNoRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIlVSTF9NSVNNQVRDSF9FUlJcIixcbiAgICAgICAgICBjOiAyMSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFF1b3RhRXhjZWVkZWRFcnJvcjoge1xuICAgICAgICAgIHM6IFwiUVVPVEFfRVhDRUVERURfRVJSXCIsXG4gICAgICAgICAgYzogMjIsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBUaW1lb3V0RXJyb3I6IHtcbiAgICAgICAgICBzOiBcIlRJTUVPVVRfRVJSXCIsXG4gICAgICAgICAgYzogMjMsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBJbnZhbGlkTm9kZVR5cGVFcnJvcjoge1xuICAgICAgICAgIHM6IFwiSU5WQUxJRF9OT0RFX1RZUEVfRVJSXCIsXG4gICAgICAgICAgYzogMjQsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBEYXRhQ2xvbmVFcnJvcjoge1xuICAgICAgICAgIHM6IFwiREFUQV9DTE9ORV9FUlJcIixcbiAgICAgICAgICBjOiAyNSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpLFxuICAgICAgICByID0gbigzNiksXG4gICAgICAgIHMgPSBuKDMpLFxuICAgICAgICBhID0gbig0KSxcbiAgICAgICAgbyA9IG4oMjQpLFxuICAgICAgICBsID0gbigxNCksXG4gICAgICAgIGMgPSBuKDcpLFxuICAgICAgICBoID0gbig0MSksXG4gICAgICAgIGQgPSBuKDIxKSxcbiAgICAgICAgdSA9IG4oMTUyKSxcbiAgICAgICAgcCA9IG4oMTcpLFxuICAgICAgICBmID0gbigyMCksXG4gICAgICAgIGcgPSBuKDIzKSxcbiAgICAgICAgbSA9IG4oMTUzKSxcbiAgICAgICAgYiA9IG4oNDcpLFxuICAgICAgICB2ID0gbig3OCksXG4gICAgICAgIHkgPSBuKDM5KSxcbiAgICAgICAgQSA9IG4oMTU4KSxcbiAgICAgICAgXyA9IG4oNDQpLFxuICAgICAgICBTID0gbig2NCksXG4gICAgICAgIEUgPSBuKDg1KSxcbiAgICAgICAgeCA9IG4oMTU5KSxcbiAgICAgICAgdyA9IG4oMTYxKSxcbiAgICAgICAgQyA9IG4oMTI4KSxcbiAgICAgICAgVCA9IG4oODMpLFxuICAgICAgICBQID0gbigxMTkpLFxuICAgICAgICBrID0gYS5PYmplY3QsXG4gICAgICAgIE0gPSBhLkFycmF5LFxuICAgICAgICBSID0gYS5EYXRlLFxuICAgICAgICBJID0gYS5FcnJvcixcbiAgICAgICAgRCA9IGEuRXZhbEVycm9yLFxuICAgICAgICBPID0gYS5SYW5nZUVycm9yLFxuICAgICAgICBMID0gYS5SZWZlcmVuY2VFcnJvcixcbiAgICAgICAgTiA9IGEuU3ludGF4RXJyb3IsXG4gICAgICAgIEIgPSBhLlR5cGVFcnJvcixcbiAgICAgICAgaiA9IGEuVVJJRXJyb3IsXG4gICAgICAgIFUgPSBhLlBlcmZvcm1hbmNlTWFyayxcbiAgICAgICAgeiA9IGEuV2ViQXNzZW1ibHksXG4gICAgICAgIEggPSB6ICYmIHouQ29tcGlsZUVycm9yIHx8IEksXG4gICAgICAgIHEgPSB6ICYmIHouTGlua0Vycm9yIHx8IEksXG4gICAgICAgIFcgPSB6ICYmIHouUnVudGltZUVycm9yIHx8IEksXG4gICAgICAgIEcgPSBvKFwiRE9NRXhjZXB0aW9uXCIpLFxuICAgICAgICBWID0gdy5NYXAsXG4gICAgICAgICQgPSB3LmhhcyxcbiAgICAgICAgWCA9IHcuZ2V0LFxuICAgICAgICBLID0gdy5zZXQsXG4gICAgICAgIFkgPSBDLlNldCxcbiAgICAgICAgSiA9IEMuYWRkLFxuICAgICAgICBRID0gbyhcIk9iamVjdFwiLCBcImtleXNcIiksXG4gICAgICAgIFogPSBsKFtdLnB1c2gpLFxuICAgICAgICB0dCA9IGwoKCEwKS52YWx1ZU9mKSxcbiAgICAgICAgZXQgPSBsKDEuLnZhbHVlT2YpLFxuICAgICAgICBudCA9IGwoXCJcIi52YWx1ZU9mKSxcbiAgICAgICAgaXQgPSBsKFIucHJvdG90eXBlLmdldFRpbWUpLFxuICAgICAgICBydCA9IGgoXCJzdHJ1Y3R1cmVkQ2xvbmVcIiksXG4gICAgICAgIHN0ID0gXCJEYXRhQ2xvbmVFcnJvclwiLFxuICAgICAgICBhdCA9IFwiVHJhbnNmZXJyaW5nXCIsXG4gICAgICAgIGNoZWNrQmFzaWNTZW1hbnRpYyA9IGZ1bmN0aW9uIGNoZWNrQmFzaWNTZW1hbnRpYyh0KSB7XG4gICAgICAgICAgcmV0dXJuICFjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlID0gbmV3IGEuU2V0KFs3XSksXG4gICAgICAgICAgICAgIG4gPSB0KGUpLFxuICAgICAgICAgICAgICBpID0gdChrKDcpKTtcbiAgICAgICAgICAgIHJldHVybiBuID09IGUgfHwgIW4uaGFzKDcpIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGkgfHwgNyAhPSBpO1xuICAgICAgICAgIH0pICYmIHQ7XG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrRXJyb3JzQ2xvbmluZyA9IGZ1bmN0aW9uIGNoZWNrRXJyb3JzQ2xvbmluZyh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuICFjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuID0gbmV3IGUoKSxcbiAgICAgICAgICAgICAgaSA9IHQoe1xuICAgICAgICAgICAgICAgIGE6IG4sXG4gICAgICAgICAgICAgICAgYjogblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiAhKGkgJiYgaS5hID09PSBpLmIgJiYgaS5hIGluc3RhbmNlb2YgZSAmJiBpLmEuc3RhY2sgPT09IG4uc3RhY2spO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvdCA9IGEuc3RydWN0dXJlZENsb25lLFxuICAgICAgICBsdCA9IHIgfHwgIWNoZWNrRXJyb3JzQ2xvbmluZyhvdCwgSSkgfHwgIWNoZWNrRXJyb3JzQ2xvbmluZyhvdCwgRykgfHwgIShpID0gb3QsICFjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdCA9IGkobmV3IGEuQWdncmVnYXRlRXJyb3IoWzFdLCBydCwge1xuICAgICAgICAgICAgY2F1c2U6IDNcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgcmV0dXJuIFwiQWdncmVnYXRlRXJyb3JcIiAhPSB0Lm5hbWUgfHwgMSAhPSB0LmVycm9yc1swXSB8fCB0Lm1lc3NhZ2UgIT0gcnQgfHwgMyAhPSB0LmNhdXNlO1xuICAgICAgICB9KSksXG4gICAgICAgIGN0ID0gIW90ICYmIGNoZWNrQmFzaWNTZW1hbnRpYyhmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBuZXcgVShydCwge1xuICAgICAgICAgICAgZGV0YWlsOiB0XG4gICAgICAgICAgfSkuZGV0YWlsO1xuICAgICAgICB9KSxcbiAgICAgICAgaHQgPSBjaGVja0Jhc2ljU2VtYW50aWMob3QpIHx8IGN0LFxuICAgICAgICB0aHJvd1VuY2xvbmVhYmxlID0gZnVuY3Rpb24gdGhyb3dVbmNsb25lYWJsZSh0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEcoXCJVbmNsb25lYWJsZSB0eXBlOiBcIiArIHQsIHN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgdGhyb3dVbnBvbHlmaWxsYWJsZSA9IGZ1bmN0aW9uIHRocm93VW5wb2x5ZmlsbGFibGUodCwgZSkge1xuICAgICAgICAgIHRocm93IG5ldyBHKChlIHx8IFwiQ2xvbmluZ1wiKSArIFwiIG9mIFwiICsgdCArIFwiIGNhbm5vdCBiZSBwcm9wZXJseSBwb2x5ZmlsbGVkIGluIHRoaXMgZW5naW5lXCIsIHN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ5TmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSA9IGZ1bmN0aW9uIHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUodCwgZSkge1xuICAgICAgICAgIGh0IHx8IHRocm93VW5wb2x5ZmlsbGFibGUoZSk7XG4gICAgICAgICAgcmV0dXJuIGh0KHQpO1xuICAgICAgICB9LFxuICAgICAgICBjbG9uZUJ1ZmZlciA9IGZ1bmN0aW9uIGNsb25lQnVmZmVyKHQsIGUsIG4pIHtcbiAgICAgICAgICBpZiAoJChlLCB0KSkgcmV0dXJuIFgoZSwgdCk7XG4gICAgICAgICAgdmFyIGksIHIsIHMsIG8sIGwsIGM7XG4gICAgICAgICAgaWYgKFwiU2hhcmVkQXJyYXlCdWZmZXJcIiA9PT0gKG4gfHwgdih0KSkpIGkgPSBodCA/IGh0KHQpIDogdDtlbHNlIHtcbiAgICAgICAgICAgIHZhciBoID0gYS5EYXRhVmlldztcbiAgICAgICAgICAgIGggfHwgXCJmdW5jdGlvblwiID09IHR5cGVvZiB0LnNsaWNlIHx8IHRocm93VW5wb2x5ZmlsbGFibGUoXCJBcnJheUJ1ZmZlclwiKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIHQuc2xpY2UgfHwgdC5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICByID0gdC5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIHMgPSBcIm1heEJ5dGVMZW5ndGhcIiBpbiB0ID8ge1xuICAgICAgICAgICAgICAgICAgbWF4Qnl0ZUxlbmd0aDogdC5tYXhCeXRlTGVuZ3RoXG4gICAgICAgICAgICAgICAgfSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBpID0gbmV3IEFycmF5QnVmZmVyKHIsIHMpO1xuICAgICAgICAgICAgICAgIG8gPSBuZXcgaCh0KTtcbiAgICAgICAgICAgICAgICBsID0gbmV3IGgoaSk7XG4gICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IHI7IGMrKykgbC5zZXRVaW50OChjLCBvLmdldFVpbnQ4KGMpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGkgPSB0LnNsaWNlKDApO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRyhcIkFycmF5QnVmZmVyIGlzIGRldGFjaGVkXCIsIHN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgSyhlLCB0LCBpKTtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvbmVWaWV3ID0gZnVuY3Rpb24gY2xvbmVWaWV3KHQsIGUsIG4sIGksIHIpIHtcbiAgICAgICAgICB2YXIgcyA9IGFbZV07XG4gICAgICAgICAgZihzKSB8fCB0aHJvd1VucG9seWZpbGxhYmxlKGUpO1xuICAgICAgICAgIHJldHVybiBuZXcgcyhjbG9uZUJ1ZmZlcih0LmJ1ZmZlciwgciksIG4sIGkpO1xuICAgICAgICB9LFxuICAgICAgICBQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIFBsYWNlaG9sZGVyKHQsIGUsIG4pIHtcbiAgICAgICAgICB0aGlzLm9iamVjdCA9IHQ7XG4gICAgICAgICAgdGhpcy50eXBlID0gZTtcbiAgICAgICAgICB0aGlzLm1ldGFkYXRhID0gbjtcbiAgICAgICAgfSxcbiAgICAgICAgc3RydWN0dXJlZENsb25lSW50ZXJuYWwgPSBmdW5jdGlvbiBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LCBlLCBuKSB7XG4gICAgICAgICAgZyh0KSAmJiB0aHJvd1VuY2xvbmVhYmxlKFwiU3ltYm9sXCIpO1xuICAgICAgICAgIGlmICghZih0KSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGlmICgkKGUsIHQpKSByZXR1cm4gWChlLCB0KTtcbiAgICAgICAgICB9IGVsc2UgZSA9IG5ldyBWKCk7XG4gICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICByLFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBjLFxuICAgICAgICAgICAgaCxcbiAgICAgICAgICAgIHUsXG4gICAgICAgICAgICBwLFxuICAgICAgICAgICAgbSA9IHYodCk7XG4gICAgICAgICAgc3dpdGNoIChtKSB7XG4gICAgICAgICAgICBjYXNlIFwiQXJyYXlcIjpcbiAgICAgICAgICAgICAgcyA9IE0oUyh0KSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIk9iamVjdFwiOlxuICAgICAgICAgICAgICBzID0ge307XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIk1hcFwiOlxuICAgICAgICAgICAgICBzID0gbmV3IFYoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICAgIHMgPSBuZXcgWSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJSZWdFeHBcIjpcbiAgICAgICAgICAgICAgcyA9IG5ldyBSZWdFeHAodC5zb3VyY2UsIHgodCkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgICAgICAgICBzd2l0Y2ggKHIgPSB0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiQWdncmVnYXRlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgIHMgPSBvKFwiQWdncmVnYXRlRXJyb3JcIikoW10pO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkV2YWxFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IEQoKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJSYW5nZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgICBzID0gTygpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlJlZmVyZW5jZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgICBzID0gTCgpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlN5bnRheEVycm9yXCI6XG4gICAgICAgICAgICAgICAgICBzID0gTigpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlR5cGVFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IEIoKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJVUklFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IGooKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDb21waWxlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgIHMgPSBIKCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiTGlua0Vycm9yXCI6XG4gICAgICAgICAgICAgICAgICBzID0gcSgpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlJ1bnRpbWVFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IFcoKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBzID0gSSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkRPTUV4Y2VwdGlvblwiOlxuICAgICAgICAgICAgICBzID0gbmV3IEcodC5tZXNzYWdlLCB0Lm5hbWUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJBcnJheUJ1ZmZlclwiOlxuICAgICAgICAgICAgY2FzZSBcIlNoYXJlZEFycmF5QnVmZmVyXCI6XG4gICAgICAgICAgICAgIHMgPSBuID8gbmV3IFBsYWNlaG9sZGVyKHQsIG0pIDogY2xvbmVCdWZmZXIodCwgZSwgbSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkRhdGFWaWV3XCI6XG4gICAgICAgICAgICBjYXNlIFwiSW50OEFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiVWludDhBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIlVpbnQ4Q2xhbXBlZEFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiSW50MTZBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiSW50MzJBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIlVpbnQzMkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiRmxvYXQxNkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiRmxvYXQzMkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiRmxvYXQ2NEFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiQmlnSW50NjRBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIkJpZ1VpbnQ2NEFycmF5XCI6XG4gICAgICAgICAgICAgIGggPSBcIkRhdGFWaWV3XCIgPT09IG0gPyB0LmJ5dGVMZW5ndGggOiB0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgcyA9IG4gPyBuZXcgUGxhY2Vob2xkZXIodCwgbSwge1xuICAgICAgICAgICAgICAgIG9mZnNldDogdC5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgICAgIGxlbmd0aDogaFxuICAgICAgICAgICAgICB9KSA6IGNsb25lVmlldyh0LCBtLCB0LmJ5dGVPZmZzZXQsIGgsIGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJET01RdWFkXCI6XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcyA9IG5ldyBET01RdWFkKHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQucDEsIGUsIG4pLCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LnAyLCBlLCBuKSwgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5wMywgZSwgbiksIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQucDQsIGUsIG4pKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHMgPSB0cnlOYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKHQsIG0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZpbGVcIjpcbiAgICAgICAgICAgICAgaWYgKGh0KSB0cnkge1xuICAgICAgICAgICAgICAgIHMgPSBodCh0KTtcbiAgICAgICAgICAgICAgICB2KHMpICE9PSBtICYmIChzID0gdm9pZCAwKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgICAgICAgaWYgKCFzKSB0cnkge1xuICAgICAgICAgICAgICAgIHMgPSBuZXcgRmlsZShbdF0sIHQubmFtZSwgdCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICAgIHMgfHwgdGhyb3dVbnBvbHlmaWxsYWJsZShtKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiRmlsZUxpc3RcIjpcbiAgICAgICAgICAgICAgaWYgKGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHQgPSBuZXcgYS5EYXRhVHJhbnNmZXIoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IGEuQ2xpcGJvYXJkRXZlbnQoXCJcIikuY2xpcGJvYXJkRGF0YTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQuaXRlbXMgJiYgdC5maWxlcyA/IHQgOiBudWxsO1xuICAgICAgICAgICAgICB9KCkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGMgPSAwLCBoID0gUyh0KTsgYyA8IGg7IGMrKykgbC5pdGVtcy5hZGQoc3RydWN0dXJlZENsb25lSW50ZXJuYWwodFtjXSwgZSwgbikpO1xuICAgICAgICAgICAgICAgIHMgPSBsLmZpbGVzO1xuICAgICAgICAgICAgICB9IGVsc2UgcyA9IHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUodCwgbSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkltYWdlRGF0YVwiOlxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHMgPSBuZXcgSW1hZ2VEYXRhKHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQuZGF0YSwgZSwgbiksIHQud2lkdGgsIHQuaGVpZ2h0LCB7XG4gICAgICAgICAgICAgICAgICBjb2xvclNwYWNlOiB0LmNvbG9yU3BhY2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHMgPSB0cnlOYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKHQsIG0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgaWYgKGh0KSBzID0gaHQodCk7ZWxzZSBzd2l0Y2ggKG0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiQmlnSW50XCI6XG4gICAgICAgICAgICAgICAgICBzID0gayh0LnZhbHVlT2YoKSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiQm9vbGVhblwiOlxuICAgICAgICAgICAgICAgICAgcyA9IGsodHQodCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IGsoZXQodCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgcyA9IGsobnQodCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRhdGVcIjpcbiAgICAgICAgICAgICAgICAgIHMgPSBuZXcgUihpdCh0KSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiQmxvYlwiOlxuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcyA9IHQuc2xpY2UoMCwgdC5zaXplLCB0LnR5cGUpO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKG0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRPTVBvaW50XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRPTVBvaW50UmVhZE9ubHlcIjpcbiAgICAgICAgICAgICAgICAgIGkgPSBhW21dO1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcyA9IGkuZnJvbVBvaW50ID8gaS5mcm9tUG9pbnQodCkgOiBuZXcgaSh0LngsIHQueSwgdC56LCB0LncpO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKG0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRPTVJlY3RcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiRE9NUmVjdFJlYWRPbmx5XCI6XG4gICAgICAgICAgICAgICAgICBpID0gYVttXTtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHMgPSBpLmZyb21SZWN0ID8gaS5mcm9tUmVjdCh0KSA6IG5ldyBpKHQueCwgdC55LCB0LndpZHRoLCB0LmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93VW5wb2x5ZmlsbGFibGUobSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiRE9NTWF0cml4XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRPTU1hdHJpeFJlYWRPbmx5XCI6XG4gICAgICAgICAgICAgICAgICBpID0gYVttXTtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHMgPSBpLmZyb21NYXRyaXggPyBpLmZyb21NYXRyaXgodCkgOiBuZXcgaSh0KTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dVbnBvbHlmaWxsYWJsZShtKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJBdWRpb0RhdGFcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiVmlkZW9GcmFtZVwiOlxuICAgICAgICAgICAgICAgICAgZCh0LmNsb25lKSB8fCB0aHJvd1VucG9seWZpbGxhYmxlKG0pO1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcyA9IHQuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dVbmNsb25lYWJsZShtKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDcm9wVGFyZ2V0XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkNyeXB0b0tleVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkZpbGVTeXN0ZW1GaWxlSGFuZGxlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkZpbGVTeXN0ZW1IYW5kbGVcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiR1BVQ29tcGlsYXRpb25JbmZvXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkdQVUNvbXBpbGF0aW9uTWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJJbWFnZUJpdG1hcFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJSVENDZXJ0aWZpY2F0ZVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJXZWJBc3NlbWJseS5Nb2R1bGVcIjpcbiAgICAgICAgICAgICAgICAgIHRocm93VW5wb2x5ZmlsbGFibGUobSk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHRocm93VW5jbG9uZWFibGUobSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgSyhlLCB0LCBzKTtcbiAgICAgICAgICBzd2l0Y2ggKG0pIHtcbiAgICAgICAgICAgIGNhc2UgXCJBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIk9iamVjdFwiOlxuICAgICAgICAgICAgICB1ID0gUSh0KTtcbiAgICAgICAgICAgICAgZm9yIChjID0gMCwgaCA9IFModSk7IGMgPCBoOyBjKyspIHtcbiAgICAgICAgICAgICAgICBwID0gdVtjXTtcbiAgICAgICAgICAgICAgICBBKHMsIHAsIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHRbcF0sIGUsIG4pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJNYXBcIjpcbiAgICAgICAgICAgICAgdC5mb3JFYWNoKGZ1bmN0aW9uICh0LCBpKSB7XG4gICAgICAgICAgICAgICAgSyhzLCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbChpLCBlLCBuKSwgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodCwgZSwgbikpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICAgIHQuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIEoocywgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodCwgZSwgbikpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiRXJyb3JcIjpcbiAgICAgICAgICAgICAgXyhzLCBcIm1lc3NhZ2VcIiwgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5tZXNzYWdlLCBlLCBuKSk7XG4gICAgICAgICAgICAgIHkodCwgXCJjYXVzZVwiKSAmJiBfKHMsIFwiY2F1c2VcIiwgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5jYXVzZSwgZSwgbikpO1xuICAgICAgICAgICAgICBcIkFnZ3JlZ2F0ZUVycm9yXCIgPT0gciAmJiAocy5lcnJvcnMgPSBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LmVycm9ycywgZSwgbikpO1xuICAgICAgICAgICAgY2FzZSBcIkRPTUV4Y2VwdGlvblwiOlxuICAgICAgICAgICAgICBUICYmIF8ocywgXCJzdGFja1wiLCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LnN0YWNrLCBlLCBuKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9LFxuICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzID0gZnVuY3Rpb24gcmVwbGFjZVBsYWNlaG9sZGVycyh0LCBlKSB7XG4gICAgICAgICAgaWYgKCFmKHQpKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoJChlLCB0KSkgcmV0dXJuIFgoZSwgdCk7XG4gICAgICAgICAgdmFyIG4sIGksIHIsIHMsIGEsIG8sIGwsIGM7XG4gICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBQbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgbiA9IHQudHlwZTtcbiAgICAgICAgICAgIGkgPSB0Lm9iamVjdDtcbiAgICAgICAgICAgIHN3aXRjaCAobikge1xuICAgICAgICAgICAgICBjYXNlIFwiQXJyYXlCdWZmZXJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlNoYXJlZEFycmF5QnVmZmVyXCI6XG4gICAgICAgICAgICAgICAgYyA9IGNsb25lQnVmZmVyKGksIGUsIG4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiRGF0YVZpZXdcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkludDhBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiVWludDhBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiVWludDhDbGFtcGVkQXJyYXlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkludDE2QXJyYXlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJJbnQzMkFycmF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJVaW50MzJBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiRmxvYXQxNkFycmF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJGbG9hdDMyQXJyYXlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkZsb2F0NjRBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiQmlnSW50NjRBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiQmlnVWludDY0QXJyYXlcIjpcbiAgICAgICAgICAgICAgICByID0gdC5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgICBjID0gY2xvbmVWaWV3KGksIG4sIHIub2Zmc2V0LCByLmxlbmd0aCwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHN3aXRjaCAodih0KSkge1xuICAgICAgICAgICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgICAgICAgICAgIG8gPSBRKHQpO1xuICAgICAgICAgICAgICBmb3IgKHMgPSAwLCBhID0gUyhvKTsgcyA8IGE7IHMrKykgdFtsID0gb1tzXV0gPSByZXBsYWNlUGxhY2Vob2xkZXJzKHRbbF0sIGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJNYXBcIjpcbiAgICAgICAgICAgICAgYyA9IG5ldyBWKCk7XG4gICAgICAgICAgICAgIHQuZm9yRWFjaChmdW5jdGlvbiAodCwgbikge1xuICAgICAgICAgICAgICAgIEsoYywgcmVwbGFjZVBsYWNlaG9sZGVycyhuLCBlKSwgcmVwbGFjZVBsYWNlaG9sZGVycyh0LCBlKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgICAgICAgICAgYyA9IG5ldyBZKCk7XG4gICAgICAgICAgICAgIHQuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIEooYywgcmVwbGFjZVBsYWNlaG9sZGVycyh0LCBlKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgICAgICAgICB0Lm1lc3NhZ2UgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHQubWVzc2FnZSwgZSk7XG4gICAgICAgICAgICAgIHkodCwgXCJjYXVzZVwiKSAmJiAodC5jYXVzZSA9IHJlcGxhY2VQbGFjZWhvbGRlcnModC5jYXVzZSwgZSkpO1xuICAgICAgICAgICAgICBcIkFnZ3JlZ2F0ZUVycm9yXCIgPT0gdC5uYW1lICYmICh0LmVycm9ycyA9IHJlcGxhY2VQbGFjZWhvbGRlcnModC5lcnJvcnMsIGUpKTtcbiAgICAgICAgICAgIGNhc2UgXCJET01FeGNlcHRpb25cIjpcbiAgICAgICAgICAgICAgVCAmJiAodC5zdGFjayA9IHJlcGxhY2VQbGFjZWhvbGRlcnModC5zdGFjaywgZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBLKGUsIHQsIGMgfHwgdCk7XG4gICAgICAgICAgcmV0dXJuIGMgfHwgdDtcbiAgICAgICAgfTtcbiAgICAgIHMoe1xuICAgICAgICBnbG9iYWw6ICEwLFxuICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgc2hhbTogIVAsXG4gICAgICAgIGZvcmNlZDogbHRcbiAgICAgIH0sIHtcbiAgICAgICAgc3RydWN0dXJlZENsb25lOiBmdW5jdGlvbiBzdHJ1Y3R1cmVkQ2xvbmUodCkge1xuICAgICAgICAgIHZhciBlLFxuICAgICAgICAgICAgbixcbiAgICAgICAgICAgIGkgPSBFKGFyZ3VtZW50cy5sZW5ndGgsIDEpID4gMSAmJiAhcChhcmd1bWVudHNbMV0pID8gYihhcmd1bWVudHNbMV0pIDogdm9pZCAwLFxuICAgICAgICAgICAgciA9IGkgPyBpLnRyYW5zZmVyIDogdm9pZCAwLFxuICAgICAgICAgICAgcyA9ICExO1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHIpIHtcbiAgICAgICAgICAgIG4gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICBpZiAoIWYodCkpIHRocm93IEIoXCJUcmFuc2ZlciBvcHRpb24gY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIHNlcXVlbmNlXCIpO1xuICAgICAgICAgICAgICB2YXIgbiA9IFtdO1xuICAgICAgICAgICAgICBtKHQsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgWihuLCBiKHQpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGZvciAodmFyIGksIHIsIHMsIG8sIGwsIGMgPSAwLCBoID0gUyhuKSwgcCA9IFtdOyBjIDwgaDspIHtcbiAgICAgICAgICAgICAgICBpID0gbltjKytdO1xuICAgICAgICAgICAgICAgIGlmIChcIkFycmF5QnVmZmVyXCIgIT09IChyID0gdihpKSkpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgkKGUsIGkpKSB0aHJvdyBuZXcgRyhcIkR1cGxpY2F0ZSB0cmFuc2ZlcmFibGVcIiwgc3QpO1xuICAgICAgICAgICAgICAgICAgaWYgKFApIG8gPSBvdChpLCB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyOiBbaV1cbiAgICAgICAgICAgICAgICAgIH0pO2Vsc2Ugc3dpdGNoIChyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJJbWFnZUJpdG1hcFwiOlxuICAgICAgICAgICAgICAgICAgICAgIHMgPSBhLk9mZnNjcmVlbkNhbnZhcztcbiAgICAgICAgICAgICAgICAgICAgICB1KHMpIHx8IHRocm93VW5wb2x5ZmlsbGFibGUociwgYXQpO1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAobCA9IG5ldyBzKGkud2lkdGgsIGkuaGVpZ2h0KSkuZ2V0Q29udGV4dChcImJpdG1hcHJlbmRlcmVyXCIpLnRyYW5zZmVyRnJvbUltYWdlQml0bWFwKGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGwudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkF1ZGlvRGF0YVwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVmlkZW9GcmFtZVwiOlxuICAgICAgICAgICAgICAgICAgICAgIGQoaS5jbG9uZSkgJiYgZChpLmNsb3NlKSB8fCB0aHJvd1VucG9seWZpbGxhYmxlKHIsIGF0KTtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGkuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7fVxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTWVkaWFTb3VyY2VIYW5kbGVcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1lc3NhZ2VQb3J0XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJPZmZzY3JlZW5DYW52YXNcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJlYWRhYmxlU3RyZWFtXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJUcmFuc2Zvcm1TdHJlYW1cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIldyaXRhYmxlU3RyZWFtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3dVbnBvbHlmaWxsYWJsZShyLCBhdCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBvKSB0aHJvdyBuZXcgRyhcIlRoaXMgb2JqZWN0IGNhbm5vdCBiZSB0cmFuc2ZlcnJlZDogXCIgKyByLCBzdCk7XG4gICAgICAgICAgICAgICAgICBLKGUsIGksIG8pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBaKHAsIGkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICAgICAgfShyLCBlID0gbmV3IFYoKSk7XG4gICAgICAgICAgICBzID0gISFTKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgbyA9IHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQsIGUsIHMpO1xuICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAhZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbiwgaSwgciA9IDAsIHMgPSBTKHQpOyByIDwgczspIHtcbiAgICAgICAgICAgICAgICBuID0gdFtyKytdO1xuICAgICAgICAgICAgICAgIGlmICgkKGUsIG4pKSB0aHJvdyBuZXcgRyhcIkR1cGxpY2F0ZSB0cmFuc2ZlcmFibGVcIiwgc3QpO1xuICAgICAgICAgICAgICAgIGlmIChQKSBpID0gb3Qobiwge1xuICAgICAgICAgICAgICAgICAgdHJhbnNmZXI6IFtuXVxuICAgICAgICAgICAgICAgIH0pO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgZChuLnRyYW5zZmVyKSB8fCB0aHJvd1VucG9seWZpbGxhYmxlKFwiQXJyYXlCdWZmZXJcIiwgYXQpO1xuICAgICAgICAgICAgICAgICAgaSA9IG4udHJhbnNmZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgSyhlLCBuLCBpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfShyLCBlID0gbmV3IFYoKSk7XG4gICAgICAgICAgICBvID0gcmVwbGFjZVBsYWNlaG9sZGVycyhvLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG87XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbig3KSxcbiAgICAgICAgcyA9IG4oMjEpLFxuICAgICAgICBhID0gbig3OCksXG4gICAgICAgIG8gPSBuKDI0KSxcbiAgICAgICAgbCA9IG4oNTEpLFxuICAgICAgICBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9LFxuICAgICAgICBjID0gW10sXG4gICAgICAgIGggPSBvKFwiUmVmbGVjdFwiLCBcImNvbnN0cnVjdFwiKSxcbiAgICAgICAgZCA9IC9eXFxzKig/OmNsYXNzfGZ1bmN0aW9uKVxcYi8sXG4gICAgICAgIHUgPSBpKGQuZXhlYyksXG4gICAgICAgIHAgPSAhZC5leGVjKG5vb3ApLFxuICAgICAgICBmID0gZnVuY3Rpb24gaXNDb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgaWYgKCFzKHQpKSByZXR1cm4gITE7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGgobm9vcCwgYywgdCk7XG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZyA9IGZ1bmN0aW9uIGlzQ29uc3RydWN0b3IodCkge1xuICAgICAgICAgIGlmICghcyh0KSkgcmV0dXJuICExO1xuICAgICAgICAgIHN3aXRjaCAoYSh0KSkge1xuICAgICAgICAgICAgY2FzZSBcIkFzeW5jRnVuY3Rpb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJHZW5lcmF0b3JGdW5jdGlvblwiOlxuICAgICAgICAgICAgY2FzZSBcIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHAgfHwgISF1KGQsIGwodCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICBnLnNoYW0gPSAhMDtcbiAgICAgIHQuZXhwb3J0cyA9ICFoIHx8IHIoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdDtcbiAgICAgICAgcmV0dXJuIGYoZi5jYWxsKSB8fCAhZihPYmplY3QpIHx8ICFmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0ID0gITA7XG4gICAgICAgIH0pIHx8IHQ7XG4gICAgICB9KSA/IGcgOiBmO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOTkpLFxuICAgICAgICByID0gbig4KSxcbiAgICAgICAgcyA9IG4oNDcpLFxuICAgICAgICBhID0gbigzMiksXG4gICAgICAgIG8gPSBuKDE1NCksXG4gICAgICAgIGwgPSBuKDY0KSxcbiAgICAgICAgYyA9IG4oMjUpLFxuICAgICAgICBoID0gbigxNTYpLFxuICAgICAgICBkID0gbigxNTcpLFxuICAgICAgICB1ID0gbigxMzkpLFxuICAgICAgICBwID0gVHlwZUVycm9yLFxuICAgICAgICBSZXN1bHQgPSBmdW5jdGlvbiBSZXN1bHQodCwgZSkge1xuICAgICAgICAgIHRoaXMuc3RvcHBlZCA9IHQ7XG4gICAgICAgICAgdGhpcy5yZXN1bHQgPSBlO1xuICAgICAgICB9LFxuICAgICAgICBmID0gUmVzdWx0LnByb3RvdHlwZTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuKSB7XG4gICAgICAgIHZhciBnLFxuICAgICAgICAgIG0sXG4gICAgICAgICAgYixcbiAgICAgICAgICB2LFxuICAgICAgICAgIHksXG4gICAgICAgICAgQSxcbiAgICAgICAgICBfLFxuICAgICAgICAgIFMgPSBuICYmIG4udGhhdCxcbiAgICAgICAgICBFID0gISghbiB8fCAhbi5BU19FTlRSSUVTKSxcbiAgICAgICAgICB4ID0gISghbiB8fCAhbi5JU19SRUNPUkQpLFxuICAgICAgICAgIHcgPSAhKCFuIHx8ICFuLklTX0lURVJBVE9SKSxcbiAgICAgICAgICBDID0gISghbiB8fCAhbi5JTlRFUlJVUFRFRCksXG4gICAgICAgICAgVCA9IGkoZSwgUyksXG4gICAgICAgICAgc3RvcCA9IGZ1bmN0aW9uIHN0b3AodCkge1xuICAgICAgICAgICAgZyAmJiB1KGcsIFwibm9ybWFsXCIsIHQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoITAsIHQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FsbEZuID0gZnVuY3Rpb24gY2FsbEZuKHQpIHtcbiAgICAgICAgICAgIGlmIChFKSB7XG4gICAgICAgICAgICAgIHModCk7XG4gICAgICAgICAgICAgIHJldHVybiBDID8gVCh0WzBdLCB0WzFdLCBzdG9wKSA6IFQodFswXSwgdFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQyA/IFQodCwgc3RvcCkgOiBUKHQpO1xuICAgICAgICAgIH07XG4gICAgICAgIGlmICh4KSBnID0gdC5pdGVyYXRvcjtlbHNlIGlmICh3KSBnID0gdDtlbHNlIHtcbiAgICAgICAgICBpZiAoIShtID0gZCh0KSkpIHRocm93IHAoYSh0KSArIFwiIGlzIG5vdCBpdGVyYWJsZVwiKTtcbiAgICAgICAgICBpZiAobyhtKSkge1xuICAgICAgICAgICAgZm9yIChiID0gMCwgdiA9IGwodCk7IHYgPiBiOyBiKyspIGlmICgoeSA9IGNhbGxGbih0W2JdKSkgJiYgYyhmLCB5KSkgcmV0dXJuIHk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdCghMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGcgPSBoKHQsIG0pO1xuICAgICAgICB9XG4gICAgICAgIEEgPSB4ID8gdC5uZXh0IDogZy5uZXh0O1xuICAgICAgICBmb3IgKDsgIShfID0gcihBLCBnKSkuZG9uZTspIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgeSA9IGNhbGxGbihfLnZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICB1KGcsIFwidGhyb3dcIiwgdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcIm9iamVjdFwiID09IHR5cGVvZiB5ICYmIHkgJiYgYyhmLCB5KSkgcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoITEpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDM0KSxcbiAgICAgICAgciA9IG4oMTU1KSxcbiAgICAgICAgcyA9IGkoXCJpdGVyYXRvclwiKSxcbiAgICAgICAgYSA9IEFycmF5LnByb3RvdHlwZTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQgJiYgKHIuQXJyYXkgPT09IHQgfHwgYVtzXSA9PT0gdCk7XG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0ge307XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig4KSxcbiAgICAgICAgciA9IG4oMzEpLFxuICAgICAgICBzID0gbig0NyksXG4gICAgICAgIGEgPSBuKDMyKSxcbiAgICAgICAgbyA9IG4oMTU3KSxcbiAgICAgICAgbCA9IFR5cGVFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBvKHQpIDogZTtcbiAgICAgICAgaWYgKHIobikpIHJldHVybiBzKGkobiwgdCkpO1xuICAgICAgICB0aHJvdyBsKGEodCkgKyBcIiBpcyBub3QgaXRlcmFibGVcIik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNzgpLFxuICAgICAgICByID0gbigzMCksXG4gICAgICAgIHMgPSBuKDE3KSxcbiAgICAgICAgYSA9IG4oMTU1KSxcbiAgICAgICAgbyA9IG4oMzQpKFwiaXRlcmF0b3JcIik7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoIXModCkpIHJldHVybiByKHQsIG8pIHx8IHIodCwgXCJAQGl0ZXJhdG9yXCIpIHx8IGFbaSh0KV07XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDE4KSxcbiAgICAgICAgciA9IG4oNDUpLFxuICAgICAgICBzID0gbigxMSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICB2YXIgYSA9IGkoZSk7XG4gICAgICAgIGEgaW4gdCA/IHIuZih0LCBhLCBzKDAsIG4pKSA6IHRbYV0gPSBuO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDgpLFxuICAgICAgICByID0gbigzOSksXG4gICAgICAgIHMgPSBuKDI1KSxcbiAgICAgICAgYSA9IG4oMTYwKSxcbiAgICAgICAgbyA9IFJlZ0V4cC5wcm90b3R5cGU7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHQuZmxhZ3M7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IGUgfHwgXCJmbGFnc1wiIGluIG8gfHwgcih0LCBcImZsYWdzXCIpIHx8ICFzKG8sIHQpID8gZSA6IGkoYSwgdCk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDQ3KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSBpKHRoaXMpLFxuICAgICAgICAgIGUgPSBcIlwiO1xuICAgICAgICB0Lmhhc0luZGljZXMgJiYgKGUgKz0gXCJkXCIpO1xuICAgICAgICB0Lmdsb2JhbCAmJiAoZSArPSBcImdcIik7XG4gICAgICAgIHQuaWdub3JlQ2FzZSAmJiAoZSArPSBcImlcIik7XG4gICAgICAgIHQubXVsdGlsaW5lICYmIChlICs9IFwibVwiKTtcbiAgICAgICAgdC5kb3RBbGwgJiYgKGUgKz0gXCJzXCIpO1xuICAgICAgICB0LnVuaWNvZGUgJiYgKGUgKz0gXCJ1XCIpO1xuICAgICAgICB0LnVuaWNvZGVTZXRzICYmIChlICs9IFwidlwiKTtcbiAgICAgICAgdC5zdGlja3kgJiYgKGUgKz0gXCJ5XCIpO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxNCksXG4gICAgICAgIHIgPSBNYXAucHJvdG90eXBlO1xuICAgICAgdC5leHBvcnRzID0ge1xuICAgICAgICBNYXA6IE1hcCxcbiAgICAgICAgc2V0OiBpKHIuc2V0KSxcbiAgICAgICAgZ2V0OiBpKHIuZ2V0KSxcbiAgICAgICAgaGFzOiBpKHIuaGFzKSxcbiAgICAgICAgcmVtb3ZlOiBpKHIuZGVsZXRlKSxcbiAgICAgICAgcHJvdG86IHJcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuU2VyaWFsaXphYmxlRW1wdHkgPSBlLlByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBlLkFubm90YXRpb25TdG9yYWdlID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICBuKDE0OCk7XG4gICAgICBuKDE1MSk7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2MyksXG4gICAgICAgIHMgPSBuKDE2OSk7XG4gICAgICBjb25zdCBhID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIG1hcDogbnVsbCxcbiAgICAgICAgaGFzaDogXCJcIixcbiAgICAgICAgdHJhbnNmZXJzOiB2b2lkIDBcbiAgICAgIH0pO1xuICAgICAgZS5TZXJpYWxpemFibGVFbXB0eSA9IGE7XG4gICAgICB2YXIgX3YgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9BID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBBbm5vdGF0aW9uU3RvcmFnZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfQSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3YsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3ksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMub25TZXRNb2RpZmllZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblJlc2V0TW9kaWZpZWQgPSBudWxsO1xuICAgICAgICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXRWYWx1ZSh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuZ2V0KHQpO1xuICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IG4gPyBlIDogT2JqZWN0LmFzc2lnbihlLCBuKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRSYXdWYWx1ZSh0KSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuZ2V0KHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZSh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KS5kZWxldGUodCk7XG4gICAgICAgICAgMCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KS5zaXplICYmIHRoaXMucmVzZXRNb2RpZmllZCgpO1xuICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KS52YWx1ZXMoKSkgaWYgKHQgaW5zdGFuY2VvZiByLkFubm90YXRpb25FZGl0b3IpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRWYWx1ZSh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuZ2V0KHQpO1xuICAgICAgICAgIGxldCBpID0gITE7XG4gICAgICAgICAgaWYgKHZvaWQgMCAhPT0gbikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbdCwgcl0gb2YgT2JqZWN0LmVudHJpZXMoZSkpIGlmIChuW3RdICE9PSByKSB7XG4gICAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICAgICAgblt0XSA9IHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuc2V0KHQsIGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpICYmIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0EsIF9BMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBlIGluc3RhbmNlb2Ygci5Bbm5vdGF0aW9uRWRpdG9yICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdGhpcy5vbkFubm90YXRpb25FZGl0b3IgJiYgdGhpcy5vbkFubm90YXRpb25FZGl0b3IoZS5jb25zdHJ1Y3Rvci5fdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaGFzKHQpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KS5oYXModCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0QWxsKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3kpLnNpemUgPiAwID8gKDAsIGkub2JqZWN0RnJvbU1hcCkoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KSkgOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHNldEFsbCh0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbZSwgbl0gb2YgT2JqZWN0LmVudHJpZXModCkpIHRoaXMuc2V0VmFsdWUoZSwgbik7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHNpemUoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXNldE1vZGlmaWVkKCkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3YpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3YsICExKTtcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdGhpcy5vblJlc2V0TW9kaWZpZWQgJiYgdGhpcy5vblJlc2V0TW9kaWZpZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHByaW50KCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgc2VyaWFsaXphYmxlKCkge1xuICAgICAgICAgIGlmICgwID09PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3kpLnNpemUpIHJldHVybiBhO1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgTWFwKCksXG4gICAgICAgICAgICBlID0gbmV3IHMuTXVybXVySGFzaDNfNjQoKSxcbiAgICAgICAgICAgIG4gPSBbXSxcbiAgICAgICAgICAgIGkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGxldCBvID0gITE7XG4gICAgICAgICAgZm9yIChjb25zdCBbbiwgc10gb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KSkge1xuICAgICAgICAgICAgY29uc3QgYSA9IHMgaW5zdGFuY2VvZiByLkFubm90YXRpb25FZGl0b3IgPyBzLnNlcmlhbGl6ZSghMSwgaSkgOiBzO1xuICAgICAgICAgICAgaWYgKGEpIHtcbiAgICAgICAgICAgICAgdC5zZXQobiwgYSk7XG4gICAgICAgICAgICAgIGUudXBkYXRlKFwiXCIuY29uY2F0KG4sIFwiOlwiKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkoYSkpKTtcbiAgICAgICAgICAgICAgbyB8fCAobyA9ICEhYS5iaXRtYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobykgZm9yIChjb25zdCBlIG9mIHQudmFsdWVzKCkpIGUuYml0bWFwICYmIG4ucHVzaChlLmJpdG1hcCk7XG4gICAgICAgICAgcmV0dXJuIHQuc2l6ZSA+IDAgPyB7XG4gICAgICAgICAgICBtYXA6IHQsXG4gICAgICAgICAgICBoYXNoOiBlLmhleGRpZ2VzdCgpLFxuICAgICAgICAgICAgdHJhbnNmZXJzOiBuXG4gICAgICAgICAgfSA6IGE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9BMigpIHtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3YpKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF92LCAhMCk7XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09IHR5cGVvZiB0aGlzLm9uU2V0TW9kaWZpZWQgJiYgdGhpcy5vblNldE1vZGlmaWVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuQW5ub3RhdGlvblN0b3JhZ2UgPSBBbm5vdGF0aW9uU3RvcmFnZTtcbiAgICAgIHZhciBfMiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSBleHRlbmRzIEFubm90YXRpb25TdG9yYWdlIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgXzIsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgbWFwOiBlLFxuICAgICAgICAgICAgICBoYXNoOiBuLFxuICAgICAgICAgICAgICB0cmFuc2ZlcnM6IGlcbiAgICAgICAgICAgIH0gPSB0LnNlcmlhbGl6YWJsZSxcbiAgICAgICAgICAgIHIgPSBzdHJ1Y3R1cmVkQ2xvbmUoZSwgbnVsbCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF8yLCB7XG4gICAgICAgICAgICBtYXA6IHIsXG4gICAgICAgICAgICBoYXNoOiBuLFxuICAgICAgICAgICAgdHJhbnNmZXJzOiBpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHByaW50KCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBQcmludEFubm90YXRpb25TdG9yYWdlLnByaW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBzZXJpYWxpemFibGUoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IFByaW50QW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgX2NsYXNzMTI7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuQW5ub3RhdGlvbkVkaXRvciA9IHZvaWQgMDtcbiAgICAgIG4oODkpO1xuICAgICAgbigyKTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY0KTtcbiAgICAgIHZhciBfUyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9FID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3ggPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9DID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfUCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9rID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX00gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfUiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9GID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0kgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfRCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgY2xhc3MgQW5ub3RhdGlvbkVkaXRvciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF90NCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfRCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9JKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX0YpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfUik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1MsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfeCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF93LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmZvY3VzaW4uYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9DLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmZvY3Vzb3V0LmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfVCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfUCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaywge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfdWlNYW5hZ2VyXCIsIG51bGwpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9NLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBBbm5vdGF0aW9uRWRpdG9yLl96SW5kZXgrK1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPT09IEFubm90YXRpb25FZGl0b3IgJiYgKDAsIGkudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQW5ub3RhdGlvbkVkaXRvci5cIik7XG4gICAgICAgICAgdGhpcy5wYXJlbnQgPSBfdDQucGFyZW50O1xuICAgICAgICAgIHRoaXMuaWQgPSBfdDQuaWQ7XG4gICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnBhZ2VJbmRleCA9IF90NC5wYXJlbnQucGFnZUluZGV4O1xuICAgICAgICAgIHRoaXMubmFtZSA9IF90NC5uYW1lO1xuICAgICAgICAgIHRoaXMuZGl2ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl91aU1hbmFnZXIgPSBfdDQudWlNYW5hZ2VyO1xuICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fd2lsbEtlZXBBc3BlY3RSYXRpbyA9ICExO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHJvdGF0aW9uOiBfZTQsXG4gICAgICAgICAgICByYXdEaW1zOiB7XG4gICAgICAgICAgICAgIHBhZ2VXaWR0aDogX24zLFxuICAgICAgICAgICAgICBwYWdlSGVpZ2h0OiBfcjMsXG4gICAgICAgICAgICAgIHBhZ2VYOiBfczQsXG4gICAgICAgICAgICAgIHBhZ2VZOiBfYTJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9ID0gdGhpcy5wYXJlbnQudmlld3BvcnQ7XG4gICAgICAgICAgdGhpcy5yb3RhdGlvbiA9IF9lNDtcbiAgICAgICAgICB0aGlzLnBhZ2VSb3RhdGlvbiA9ICgzNjAgKyBfZTQgLSB0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucm90YXRpb24pICUgMzYwO1xuICAgICAgICAgIHRoaXMucGFnZURpbWVuc2lvbnMgPSBbX24zLCBfcjNdO1xuICAgICAgICAgIHRoaXMucGFnZVRyYW5zbGF0aW9uID0gW19zNCwgX2EyXTtcbiAgICAgICAgICBjb25zdCBbX28yLCBfbDJdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgIHRoaXMueCA9IF90NC54IC8gX28yO1xuICAgICAgICAgIHRoaXMueSA9IF90NC55IC8gX2wyO1xuICAgICAgICAgIHRoaXMuaXNBdHRhY2hlZFRvRE9NID0gITE7XG4gICAgICAgICAgdGhpcy5kZWxldGVkID0gITE7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBfZGVmYXVsdExpbmVDb2xvcigpIHtcbiAgICAgICAgICByZXR1cm4gKDAsIGkuc2hhZG93KSh0aGlzLCBcIl9kZWZhdWx0TGluZUNvbG9yXCIsIHRoaXMuX2NvbG9yTWFuYWdlci5nZXRIZXhDb2RlKFwiQ2FudmFzVGV4dFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGRlbGV0ZUFubm90YXRpb25FbGVtZW50KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gbmV3IEZha2VFZGl0b3Ioe1xuICAgICAgICAgICAgaWQ6IHQucGFyZW50LmdldE5leHRJZCgpLFxuICAgICAgICAgICAgcGFyZW50OiB0LnBhcmVudCxcbiAgICAgICAgICAgIHVpTWFuYWdlcjogdC5fdWlNYW5hZ2VyXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZS5hbm5vdGF0aW9uRWxlbWVudElkID0gdC5hbm5vdGF0aW9uRWxlbWVudElkO1xuICAgICAgICAgIGUuZGVsZXRlZCA9ICEwO1xuICAgICAgICAgIGUuX3VpTWFuYWdlci5hZGRUb0Fubm90YXRpb25TdG9yYWdlKGUpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBpbml0aWFsaXplKHQpIHt9XG4gICAgICAgIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHQsIGUpIHt9XG4gICAgICAgIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgYWRkQ29tbWFuZHModCkge1xuICAgICAgICAgIHRoaXMuX3VpTWFuYWdlci5hZGRDb21tYW5kcyh0KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY3VycmVudExheWVyKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl91aU1hbmFnZXIuY3VycmVudExheWVyO1xuICAgICAgICB9XG4gICAgICAgIHNldEluQmFja2dyb3VuZCgpIHtcbiAgICAgICAgICB0aGlzLmRpdi5zdHlsZS56SW5kZXggPSAwO1xuICAgICAgICB9XG4gICAgICAgIHNldEluRm9yZWdyb3VuZCgpIHtcbiAgICAgICAgICB0aGlzLmRpdi5zdHlsZS56SW5kZXggPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX00pO1xuICAgICAgICB9XG4gICAgICAgIHNldFBhcmVudCh0KSB7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHQpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gdC5wYWdlSW5kZXg7XG4gICAgICAgICAgICB0aGlzLnBhZ2VEaW1lbnNpb25zID0gdC5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wYXJlbnQgPSB0O1xuICAgICAgICB9XG4gICAgICAgIGZvY3VzaW4odCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVCkgPyBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1QsICExKSA6IHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGZvY3Vzb3V0KHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IHQucmVsYXRlZFRhcmdldDtcbiAgICAgICAgICBpZiAoIShlICE9PSBudWxsICYmIGUgIT09IHZvaWQgMCAmJiBlLmNsb3Nlc3QoXCIjXCIuY29uY2F0KHRoaXMuaWQpKSkpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyRwYXJlbnQ7XG4gICAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAoKF90aGlzJHBhcmVudCA9IHRoaXMucGFyZW50KSA9PT0gbnVsbCB8fCBfdGhpcyRwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHBhcmVudC5pc011bHRpcGxlU2VsZWN0aW9uKSB8fCB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbW1pdE9yUmVtb3ZlKCkge1xuICAgICAgICAgIHRoaXMuaXNFbXB0eSgpID8gdGhpcy5yZW1vdmUoKSA6IHRoaXMuY29tbWl0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29tbWl0KCkge1xuICAgICAgICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoKSB7XG4gICAgICAgICAgdGhpcy5fdWlNYW5hZ2VyLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZHJhZ3N0YXJ0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5wYXJlbnQuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIHRoaXMuc3RhcnRYID0gdC5jbGllbnRYIC0gZS54O1xuICAgICAgICAgIHRoaXMuc3RhcnRZID0gdC5jbGllbnRZIC0gZS55O1xuICAgICAgICAgIHQuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRoaXMuaWQpO1xuICAgICAgICAgIHQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBcIm1vdmVcIjtcbiAgICAgICAgfVxuICAgICAgICBzZXRBdCh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgY29uc3QgW3IsIHNdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgIFtuLCBpXSA9IHRoaXMuc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24obiwgaSk7XG4gICAgICAgICAgdGhpcy54ID0gKHQgKyBuKSAvIHI7XG4gICAgICAgICAgdGhpcy55ID0gKGUgKyBpKSAvIHM7XG4gICAgICAgICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIHRyYW5zbGF0ZSh0LCBlKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfUiwgX1IyKS5jYWxsKHRoaXMsIHRoaXMucGFyZW50RGltZW5zaW9ucywgdCwgZSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNsYXRlSW5QYWdlKHQsIGUpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SLCBfUjIpLmNhbGwodGhpcywgdGhpcy5wYWdlRGltZW5zaW9ucywgdCwgZSk7XG4gICAgICAgICAgdGhpcy5kaXYuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICAgICAgYmxvY2s6IFwibmVhcmVzdFwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZml4QW5kU2V0UG9zaXRpb24oKSB7XG4gICAgICAgICAgY29uc3QgW3QsIGVdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgeDogbixcbiAgICAgICAgICAgIHk6IGksXG4gICAgICAgICAgICB3aWR0aDogcixcbiAgICAgICAgICAgIGhlaWdodDogc1xuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIHIgKj0gdDtcbiAgICAgICAgICBzICo9IGU7XG4gICAgICAgICAgbiAqPSB0O1xuICAgICAgICAgIGkgKj0gZTtcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMucm90YXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKHQgLSByLCBuKSk7XG4gICAgICAgICAgICAgIGkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihlIC0gcywgaSkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgOTA6XG4gICAgICAgICAgICAgIG4gPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0IC0gcywgbikpO1xuICAgICAgICAgICAgICBpID0gTWF0aC5taW4oZSwgTWF0aC5tYXgociwgaSkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTgwOlxuICAgICAgICAgICAgICBuID0gTWF0aC5taW4odCwgTWF0aC5tYXgociwgbikpO1xuICAgICAgICAgICAgICBpID0gTWF0aC5taW4oZSwgTWF0aC5tYXgocywgaSkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgICAgICBuID0gTWF0aC5taW4odCwgTWF0aC5tYXgocywgbikpO1xuICAgICAgICAgICAgICBpID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZSAtIHIsIGkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy54ID0gbiAvIHQ7XG4gICAgICAgICAgdGhpcy55ID0gaSAvIGU7XG4gICAgICAgICAgdGhpcy5kaXYuc3R5bGUubGVmdCA9IFwiXCIuY29uY2F0KCgxMDAgKiB0aGlzLngpLnRvRml4ZWQoMiksIFwiJVwiKTtcbiAgICAgICAgICB0aGlzLmRpdi5zdHlsZS50b3AgPSBcIlwiLmNvbmNhdCgoMTAwICogdGhpcy55KS50b0ZpeGVkKDIpLCBcIiVcIik7XG4gICAgICAgIH1cbiAgICAgICAgc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24odCwgZSkge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5wYXJlbnRSb3RhdGlvbikge1xuICAgICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtlLCAtdF07XG4gICAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFstdCwgLWVdO1xuICAgICAgICAgICAgY2FzZSAyNzA6XG4gICAgICAgICAgICAgIHJldHVybiBbLWUsIHRdO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIFt0LCBlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGFnZVRyYW5zbGF0aW9uVG9TY3JlZW4odCwgZSkge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5wYXJlbnRSb3RhdGlvbikge1xuICAgICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFstZSwgdF07XG4gICAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFstdCwgLWVdO1xuICAgICAgICAgICAgY2FzZSAyNzA6XG4gICAgICAgICAgICAgIHJldHVybiBbZSwgLXRdO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIFt0LCBlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBhcmVudFNjYWxlKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucmVhbFNjYWxlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBwYXJlbnRSb3RhdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gKHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycy5yb3RhdGlvbiArIHRoaXMucGFnZVJvdGF0aW9uKSAlIDM2MDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcGFyZW50RGltZW5zaW9ucygpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHJlYWxTY2FsZTogdFxuICAgICAgICAgICAgfSA9IHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycyxcbiAgICAgICAgICAgIFtlLCBuXSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgICAgICAgcmV0dXJuIFtlICogdCwgbiAqIHRdO1xuICAgICAgICB9XG4gICAgICAgIHNldERpbXModCwgZSkge1xuICAgICAgICAgIGNvbnN0IFtuLCBpXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgICB0aGlzLmRpdi5zdHlsZS53aWR0aCA9IFwiXCIuY29uY2F0KCgxMDAgKiB0IC8gbikudG9GaXhlZCgyKSwgXCIlXCIpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUykgfHwgKHRoaXMuZGl2LnN0eWxlLmhlaWdodCA9IFwiXCIuY29uY2F0KCgxMDAgKiBlIC8gaSkudG9GaXhlZCgyKSwgXCIlXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBmaXhEaW1zKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgc3R5bGU6IHRcbiAgICAgICAgICAgIH0gPSB0aGlzLmRpdixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGVpZ2h0OiBlLFxuICAgICAgICAgICAgICB3aWR0aDogblxuICAgICAgICAgICAgfSA9IHQsXG4gICAgICAgICAgICBpID0gbi5lbmRzV2l0aChcIiVcIiksXG4gICAgICAgICAgICByID0gIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUykgJiYgZS5lbmRzV2l0aChcIiVcIik7XG4gICAgICAgICAgaWYgKGkgJiYgcikgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IFtzLCBhXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgICBpIHx8ICh0LndpZHRoID0gXCJcIi5jb25jYXQoKDEwMCAqIHBhcnNlRmxvYXQobikgLyBzKS50b0ZpeGVkKDIpLCBcIiVcIikpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUykgfHwgciB8fCAodC5oZWlnaHQgPSBcIlwiLmNvbmNhdCgoMTAwICogcGFyc2VGbG9hdChlKSAvIGEpLnRvRml4ZWQoMiksIFwiJVwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBbMCwgMF07XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVkaXRvci1yb3RhdGlvblwiLCAoMzYwIC0gdGhpcy5yb3RhdGlvbikgJSAzNjApO1xuICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB0aGlzLmlkKTtcbiAgICAgICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJ0YWJJbmRleFwiLCAwKTtcbiAgICAgICAgICB0aGlzLnNldEluRm9yZWdyb3VuZCgpO1xuICAgICAgICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdykpO1xuICAgICAgICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0MpKTtcbiAgICAgICAgICBjb25zdCBbdCwgZV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgICAgaWYgKHRoaXMucGFyZW50Um90YXRpb24gJSAxODAgIT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXYuc3R5bGUubWF4V2lkdGggPSBcIlwiLmNvbmNhdCgoMTAwICogZSAvIHQpLnRvRml4ZWQoMiksIFwiJVwiKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LnN0eWxlLm1heEhlaWdodCA9IFwiXCIuY29uY2F0KCgxMDAgKiB0IC8gZSkudG9GaXhlZCgyKSwgXCIlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBbbiwgaV0gPSB0aGlzLmdldEluaXRpYWxUcmFuc2xhdGlvbigpO1xuICAgICAgICAgIHRoaXMudHJhbnNsYXRlKG4sIGkpO1xuICAgICAgICAgICgwLCByLmJpbmRFdmVudHMpKHRoaXMsIHRoaXMuZGl2LCBbXCJkcmFnc3RhcnRcIiwgXCJwb2ludGVyZG93blwiXSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgICAgICB9XG4gICAgICAgIHBvaW50ZXJkb3duKHQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpc01hYzogZVxuICAgICAgICAgIH0gPSBpLkZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgICAgICAgIGlmICgwICE9PSB0LmJ1dHRvbiB8fCB0LmN0cmxLZXkgJiYgZSkgdC5wcmV2ZW50RGVmYXVsdCgpO2Vsc2Uge1xuICAgICAgICAgICAgdC5jdHJsS2V5ICYmICFlIHx8IHQuc2hpZnRLZXkgfHwgdC5tZXRhS2V5ICYmIGUgPyB0aGlzLnBhcmVudC50b2dnbGVTZWxlY3RlZCh0aGlzKSA6IHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ULCAhMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldFJlY3QodCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnBhcmVudFNjYWxlLFxuICAgICAgICAgICAgW2ksIHJdID0gdGhpcy5wYWdlRGltZW5zaW9ucyxcbiAgICAgICAgICAgIFtzLCBhXSA9IHRoaXMucGFnZVRyYW5zbGF0aW9uLFxuICAgICAgICAgICAgbyA9IHQgLyBuLFxuICAgICAgICAgICAgbCA9IGUgLyBuLFxuICAgICAgICAgICAgYyA9IHRoaXMueCAqIGksXG4gICAgICAgICAgICBoID0gdGhpcy55ICogcixcbiAgICAgICAgICAgIGQgPSB0aGlzLndpZHRoICogaSxcbiAgICAgICAgICAgIHUgPSB0aGlzLmhlaWdodCAqIHI7XG4gICAgICAgICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiBbYyArIG8gKyBzLCByIC0gaCAtIGwgLSB1ICsgYSwgYyArIG8gKyBkICsgcywgciAtIGggLSBsICsgYV07XG4gICAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgICByZXR1cm4gW2MgKyBsICsgcywgciAtIGggKyBvICsgYSwgYyArIGwgKyB1ICsgcywgciAtIGggKyBvICsgZCArIGFdO1xuICAgICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICAgIHJldHVybiBbYyAtIG8gLSBkICsgcywgciAtIGggKyBsICsgYSwgYyAtIG8gKyBzLCByIC0gaCArIGwgKyB1ICsgYV07XG4gICAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtjIC0gbCAtIHUgKyBzLCByIC0gaCAtIG8gLSBkICsgYSwgYyAtIGwgKyBzLCByIC0gaCAtIG8gKyBhXTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcm90YXRpb25cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldFJlY3RJbkN1cnJlbnRDb29yZHModCwgZSkge1xuICAgICAgICAgIGNvbnN0IFtuLCBpLCByLCBzXSA9IHQsXG4gICAgICAgICAgICBhID0gciAtIG4sXG4gICAgICAgICAgICBvID0gcyAtIGk7XG4gICAgICAgICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiBbbiwgZSAtIHMsIGEsIG9dO1xuICAgICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtuLCBlIC0gaSwgbywgYV07XG4gICAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtyLCBlIC0gaSwgYSwgb107XG4gICAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtyLCBlIC0gcywgbywgYV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvbmNlQWRkZWQoKSB7fVxuICAgICAgICBpc0VtcHR5KCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVFZGl0TW9kZSgpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2ssICEwKTtcbiAgICAgICAgfVxuICAgICAgICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9rLCAhMSk7XG4gICAgICAgIH1cbiAgICAgICAgaXNJbkVkaXRNb2RlKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2spO1xuICAgICAgICB9XG4gICAgICAgIHNob3VsZEdldEtleWJvYXJkRXZlbnRzKCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgICBuZWVkc1RvQmVSZWJ1aWx0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmRpdiAmJiAhdGhpcy5pc0F0dGFjaGVkVG9ET007XG4gICAgICAgIH1cbiAgICAgICAgcmVidWlsZCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkZGl2LCBfdGhpcyRkaXYyO1xuICAgICAgICAgIChfdGhpcyRkaXYgPSB0aGlzLmRpdikgPT09IG51bGwgfHwgX3RoaXMkZGl2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93KSk7XG4gICAgICAgICAgKF90aGlzJGRpdjIgPSB0aGlzLmRpdikgPT09IG51bGwgfHwgX3RoaXMkZGl2MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZGl2Mi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9DKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFuIGVkaXRvciBtdXN0IGJlIHNlcmlhbGl6YWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZGVzZXJpYWxpemUodCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IGkgPSBuZXcgdGhpcy5wcm90b3R5cGUuY29uc3RydWN0b3Ioe1xuICAgICAgICAgICAgcGFyZW50OiBlLFxuICAgICAgICAgICAgaWQ6IGUuZ2V0TmV4dElkKCksXG4gICAgICAgICAgICB1aU1hbmFnZXI6IG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpLnJvdGF0aW9uID0gdC5yb3RhdGlvbjtcbiAgICAgICAgICBjb25zdCBbciwgc10gPSBpLnBhZ2VEaW1lbnNpb25zLFxuICAgICAgICAgICAgW2EsIG8sIGwsIGNdID0gaS5nZXRSZWN0SW5DdXJyZW50Q29vcmRzKHQucmVjdCwgcyk7XG4gICAgICAgICAgaS54ID0gYSAvIHI7XG4gICAgICAgICAgaS55ID0gbyAvIHM7XG4gICAgICAgICAgaS53aWR0aCA9IGwgLyByO1xuICAgICAgICAgIGkuaGVpZ2h0ID0gYyAvIHM7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlKCkge1xuICAgICAgICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdykpO1xuICAgICAgICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0MpKTtcbiAgICAgICAgICB0aGlzLmlzRW1wdHkoKSB8fCB0aGlzLmNvbW1pdCgpO1xuICAgICAgICAgIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpIDogdGhpcy5fdWlNYW5hZ2VyLnJlbW92ZUVkaXRvcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNSZXNpemFibGUoKSB7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9XG4gICAgICAgIG1ha2VSZXNpemFibGUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNSZXNpemFibGUpIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0YsIF9GMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRSkuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0KCkge1xuICAgICAgICAgIHZhciBfdGhpcyRkaXYzO1xuICAgICAgICAgIHRoaXMubWFrZVJlc2l6YWJsZSgpO1xuICAgICAgICAgIChfdGhpcyRkaXYzID0gdGhpcy5kaXYpID09PSBudWxsIHx8IF90aGlzJGRpdjMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRpdjMuY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkRWRpdG9yXCIpO1xuICAgICAgICB9XG4gICAgICAgIHVuc2VsZWN0KCkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQzLCBfdGhpcyRkaXY0LCBfdGhpcyRkaXY1O1xuICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQzID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9FKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0My5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgICAgICAgIChfdGhpcyRkaXY0ID0gdGhpcy5kaXYpID09PSBudWxsIHx8IF90aGlzJGRpdjQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRpdjQuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkRWRpdG9yXCIpO1xuICAgICAgICAgICgoX3RoaXMkZGl2NSA9IHRoaXMuZGl2KSA9PT0gbnVsbCB8fCBfdGhpcyRkaXY1ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkaXY1LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSAmJiB0aGlzLl91aU1hbmFnZXIuY3VycmVudExheWVyLmRpdi5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVBhcmFtcyh0LCBlKSB7fVxuICAgICAgICBkaXNhYmxlRWRpdGluZygpIHt9XG4gICAgICAgIGVuYWJsZUVkaXRpbmcoKSB7fVxuICAgICAgICBlbnRlckluRWRpdE1vZGUoKSB7fVxuICAgICAgICBnZXQgY29udGVudERpdigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kaXY7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzRWRpdGluZygpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9QKTtcbiAgICAgICAgfVxuICAgICAgICBzZXQgaXNFZGl0aW5nKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1AsIHQpO1xuICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkgaWYgKHQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2V0QWN0aXZlRWRpdG9yKHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLnBhcmVudC5zZXRBY3RpdmVFZGl0b3IobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0QXNwZWN0UmF0aW8odCwgZSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfUywgITApO1xuICAgICAgICAgIGNvbnN0IG4gPSB0IC8gZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3R5bGU6IGlcbiAgICAgICAgICAgIH0gPSB0aGlzLmRpdjtcbiAgICAgICAgICBpLmFzcGVjdFJhdGlvID0gbjtcbiAgICAgICAgICBpLmhlaWdodCA9IFwiYXV0b1wiO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgTUlOX1NJWkUoKSB7XG4gICAgICAgICAgcmV0dXJuIDE2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfY2xhc3MxMiA9IEFubm90YXRpb25FZGl0b3I7XG4gICAgICBmdW5jdGlvbiBfUjIodCwgZSwgbikge1xuICAgICAgICBsZXQgW2ksIHJdID0gdDtcbiAgICAgICAgW2UsIG5dID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbihlLCBuKTtcbiAgICAgICAgdGhpcy54ICs9IGUgLyBpO1xuICAgICAgICB0aGlzLnkgKz0gbiAvIHI7XG4gICAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9GMigpIHtcbiAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRSkpIHJldHVybjtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9FLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9FKS5jbGFzc0xpc3QuYWRkKFwicmVzaXplcnNcIik7XG4gICAgICAgIGNvbnN0IHQgPSBbXCJ0b3BMZWZ0XCIsIFwidG9wUmlnaHRcIiwgXCJib3R0b21SaWdodFwiLCBcImJvdHRvbUxlZnRcIl07XG4gICAgICAgIHRoaXMuX3dpbGxLZWVwQXNwZWN0UmF0aW8gfHwgdC5wdXNoKFwidG9wTWlkZGxlXCIsIFwibWlkZGxlUmlnaHRcIiwgXCJib3R0b21NaWRkbGVcIiwgXCJtaWRkbGVMZWZ0XCIpO1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRSkuYXBwZW5kKHQpO1xuICAgICAgICAgIHQuY2xhc3NMaXN0LmFkZChcInJlc2l6ZXJcIiwgZSk7XG4gICAgICAgICAgdC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfSSwgX0kyKS5iaW5kKHRoaXMsIGUpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpdi5wcmVwZW5kKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRSkpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0kyKHQsIGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3gsIFtlLmNsaWVudFgsIGUuY2xpZW50WV0pO1xuICAgICAgICBjb25zdCBuID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRCwgX0QyKS5iaW5kKHRoaXMsIHQpLFxuICAgICAgICAgIGkgPSB0aGlzLmRpdi5kcmFnZ2FibGU7XG4gICAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICExO1xuICAgICAgICBjb25zdCByID0gXCJyZXNpemluZ1wiLmNvbmNhdCh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpKS5jb25jYXQodC5zbGljZSgxKSk7XG4gICAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKHIpO1xuICAgICAgICBjb25zdCBzID0ge1xuICAgICAgICAgIHBhc3NpdmU6ICEwLFxuICAgICAgICAgIGNhcHR1cmU6ICEwXG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgbiwgcyk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLl91aU1hbmFnZXIuc3RvcFVuZG9BY2N1bXVsYXRpb24oKTtcbiAgICAgICAgICB0aGlzLmRpdi5kcmFnZ2FibGUgPSBpO1xuICAgICAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QucmVtb3ZlKHIpO1xuICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgbiwgcyk7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBvbmNlOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9EMih0LCBlKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNsaWVudFg6IG4sXG4gICAgICAgICAgICBjbGllbnRZOiByXG4gICAgICAgICAgfSA9IGUsXG4gICAgICAgICAgcyA9IG4gLSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3gpWzBdLFxuICAgICAgICAgIGEgPSByIC0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF94KVsxXTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF94KVswXSA9IG47XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeClbMV0gPSByO1xuICAgICAgICBjb25zdCBbbywgbF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnMsXG4gICAgICAgICAgYyA9IHRoaXMueCxcbiAgICAgICAgICBoID0gdGhpcy55LFxuICAgICAgICAgIGQgPSB0aGlzLndpZHRoLFxuICAgICAgICAgIHUgPSB0aGlzLmhlaWdodCxcbiAgICAgICAgICBwID0gX2NsYXNzMTIuTUlOX1NJWkUgLyBvLFxuICAgICAgICAgIGYgPSBfY2xhc3MxMi5NSU5fU0laRSAvIGw7XG4gICAgICAgIGxldCBnO1xuICAgICAgICBjb25zdCByb3VuZCA9IHQgPT4gTWF0aC5yb3VuZCgxZTQgKiB0KSAvIDFlNCxcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbiA9ICh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbbiwgaV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgICAgICB0aGlzLnNldERpbXMobiAqIHQsIGkgKiBlKTtcbiAgICAgICAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICAgICAgICB9O1xuICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICBjYXNlIFwidG9wTGVmdFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoTWF0aC5zaWduKHMpICogTWF0aC5zaWduKGEpIDwgMCkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5oeXBvdChzLCBhKSxcbiAgICAgICAgICAgICAgICBlID0gTWF0aC5oeXBvdChkICogbywgdSAqIGwpLFxuICAgICAgICAgICAgICAgIG4gPSByb3VuZChjICsgZCksXG4gICAgICAgICAgICAgICAgaSA9IHJvdW5kKGggKyB1KSxcbiAgICAgICAgICAgICAgICByID0gTWF0aC5tYXgoTWF0aC5taW4oMSAtIE1hdGguc2lnbihzKSAqICh0IC8gZSksIDEgLyBkLCAxIC8gdSksIHAgLyBkLCBmIC8gdSksXG4gICAgICAgICAgICAgICAgbSA9IHJvdW5kKGQgKiByKSxcbiAgICAgICAgICAgICAgICBiID0gcm91bmQodSAqIHIpLFxuICAgICAgICAgICAgICAgIHYgPSBuIC0gbSxcbiAgICAgICAgICAgICAgICB5ID0gaSAtIGI7XG4gICAgICAgICAgICAgIGcgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IG07XG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBiO1xuICAgICAgICAgICAgICAgIHRoaXMueCA9IHY7XG4gICAgICAgICAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihtLCBiKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcInRvcE1pZGRsZVwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gcm91bmQodGhpcy55ICsgdSksXG4gICAgICAgICAgICAgICAgZSA9IHJvdW5kKE1hdGgubWF4KGYsIE1hdGgubWluKDEsIHUgLSBhIC8gbCkpKSxcbiAgICAgICAgICAgICAgICBuID0gdCAtIGU7XG4gICAgICAgICAgICAgIGcgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBlO1xuICAgICAgICAgICAgICAgIHRoaXMueSA9IG47XG4gICAgICAgICAgICAgICAgdXBkYXRlUG9zaXRpb24oZCwgZSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJ0b3BSaWdodFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoTWF0aC5zaWduKHMpICogTWF0aC5zaWduKGEpID4gMCkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5oeXBvdChzLCBhKSxcbiAgICAgICAgICAgICAgICBlID0gTWF0aC5oeXBvdCh0aGlzLndpZHRoICogbywgdGhpcy5oZWlnaHQgKiBsKSxcbiAgICAgICAgICAgICAgICBuID0gcm91bmQoaCArIHRoaXMuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICBpID0gTWF0aC5tYXgoTWF0aC5taW4oMSArIE1hdGguc2lnbihzKSAqICh0IC8gZSksIDEgLyBkLCAxIC8gdSksIHAgLyBkLCBmIC8gdSksXG4gICAgICAgICAgICAgICAgciA9IHJvdW5kKGQgKiBpKSxcbiAgICAgICAgICAgICAgICBjID0gcm91bmQodSAqIGkpLFxuICAgICAgICAgICAgICAgIG0gPSBuIC0gYztcbiAgICAgICAgICAgICAgZyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gcjtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IGM7XG4gICAgICAgICAgICAgICAgdGhpcy55ID0gbTtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihyLCBjKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm1pZGRsZVJpZ2h0XCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IHQgPSByb3VuZChNYXRoLm1heChwLCBNYXRoLm1pbigxLCBkICsgcyAvIG8pKSk7XG4gICAgICAgICAgICAgIGcgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IHQ7XG4gICAgICAgICAgICAgICAgdXBkYXRlUG9zaXRpb24odCwgdSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJib3R0b21SaWdodFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoTWF0aC5zaWduKHMpICogTWF0aC5zaWduKGEpIDwgMCkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5oeXBvdChzLCBhKSxcbiAgICAgICAgICAgICAgICBlID0gTWF0aC5oeXBvdCh0aGlzLndpZHRoICogbywgdGhpcy5oZWlnaHQgKiBsKSxcbiAgICAgICAgICAgICAgICBuID0gTWF0aC5tYXgoTWF0aC5taW4oMSArIE1hdGguc2lnbihzKSAqICh0IC8gZSksIDEgLyBkLCAxIC8gdSksIHAgLyBkLCBmIC8gdSksXG4gICAgICAgICAgICAgICAgaSA9IHJvdW5kKGQgKiBuKSxcbiAgICAgICAgICAgICAgICByID0gcm91bmQodSAqIG4pO1xuICAgICAgICAgICAgICBnID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSBpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gcjtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihpLCByKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImJvdHRvbU1pZGRsZVwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gcm91bmQoTWF0aC5tYXgoZiwgTWF0aC5taW4oMSwgdSArIGEgLyBsKSkpO1xuICAgICAgICAgICAgICBnID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdDtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihkLCB0KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImJvdHRvbUxlZnRcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKE1hdGguc2lnbihzKSAqIE1hdGguc2lnbihhKSA+IDApIHJldHVybjtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IE1hdGguaHlwb3QocywgYSksXG4gICAgICAgICAgICAgICAgZSA9IE1hdGguaHlwb3QodGhpcy53aWR0aCAqIG8sIHRoaXMuaGVpZ2h0ICogbCksXG4gICAgICAgICAgICAgICAgbiA9IHJvdW5kKGMgKyB0aGlzLndpZHRoKSxcbiAgICAgICAgICAgICAgICBpID0gTWF0aC5tYXgoTWF0aC5taW4oMSAtIE1hdGguc2lnbihzKSAqICh0IC8gZSksIDEgLyBkLCAxIC8gdSksIHAgLyBkLCBmIC8gdSksXG4gICAgICAgICAgICAgICAgciA9IHJvdW5kKGQgKiBpKSxcbiAgICAgICAgICAgICAgICBoID0gcm91bmQodSAqIGkpLFxuICAgICAgICAgICAgICAgIG0gPSBuIC0gcjtcbiAgICAgICAgICAgICAgZyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gcjtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IGg7XG4gICAgICAgICAgICAgICAgdGhpcy54ID0gbTtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihyLCBoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm1pZGRsZUxlZnRcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IHJvdW5kKGMgKyBkKSxcbiAgICAgICAgICAgICAgICBlID0gcm91bmQoTWF0aC5tYXgocCwgTWF0aC5taW4oMSwgZCAtIHMgLyBvKSkpLFxuICAgICAgICAgICAgICAgIG4gPSB0IC0gZTtcbiAgICAgICAgICAgICAgZyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gZTtcbiAgICAgICAgICAgICAgICB0aGlzLnggPSBuO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVBvc2l0aW9uKGUsIHUpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgICAgICBjbWQ6IGcsXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IGQ7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHU7XG4gICAgICAgICAgICB0aGlzLnggPSBjO1xuICAgICAgICAgICAgdGhpcy55ID0gaDtcbiAgICAgICAgICAgIHVwZGF0ZVBvc2l0aW9uKGQsIHUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbXVzdEV4ZWM6ICEwLFxuICAgICAgICAgIHR5cGU6IGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuUkVTSVpFLFxuICAgICAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6ICEwLFxuICAgICAgICAgIGtlZXBVbmRvOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShBbm5vdGF0aW9uRWRpdG9yLCBcIl9jb2xvck1hbmFnZXJcIiwgbmV3IHIuQ29sb3JNYW5hZ2VyKCkpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KEFubm90YXRpb25FZGl0b3IsIFwiX3pJbmRleFwiLCAxKTtcbiAgICAgIGUuQW5ub3RhdGlvbkVkaXRvciA9IEFubm90YXRpb25FZGl0b3I7XG4gICAgICBjbGFzcyBGYWtlRWRpdG9yIGV4dGVuZHMgQW5ub3RhdGlvbkVkaXRvciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcih0KTtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25FbGVtZW50SWQgPSB0LmFubm90YXRpb25FbGVtZW50SWQ7XG4gICAgICAgICAgdGhpcy5kZWxldGVkID0gITA7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplKCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkLFxuICAgICAgICAgICAgZGVsZXRlZDogITAsXG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLktleWJvYXJkTWFuYWdlciA9IGUuQ29tbWFuZE1hbmFnZXIgPSBlLkNvbG9yTWFuYWdlciA9IGUuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciA9IHZvaWQgMDtcbiAgICAgIGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uIGJpbmRFdmVudHModCwgZSwgbikge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgbikgZS5hZGRFdmVudExpc3RlbmVyKGksIHRbaV0uYmluZCh0KSk7XG4gICAgICB9O1xuICAgICAgZS5vcGFjaXR5VG9IZXggPSBmdW5jdGlvbiBvcGFjaXR5VG9IZXgodCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1pbigyNTUsIE1hdGgubWF4KDEsIDI1NSAqIHQpKSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgICAgIH07XG4gICAgICBuKDIpO1xuICAgICAgbig4OSk7XG4gICAgICBuKDEyNSk7XG4gICAgICBuKDEzNSk7XG4gICAgICBuKDEzNyk7XG4gICAgICBuKDE0MCk7XG4gICAgICBuKDE0Mik7XG4gICAgICBuKDE0NCk7XG4gICAgICBuKDE0Nik7XG4gICAgICBuKDE2NSk7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2Nyk7XG4gICAgICB2YXIgX08gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNsYXNzIElkTWFuYWdlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9PLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SWQoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJE8sIF90aGlzJE8yO1xuICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChpLkFubm90YXRpb25FZGl0b3JQcmVmaXgpLmNvbmNhdCgoX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9PLCAoX3RoaXMkTyA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTyksIF90aGlzJE8yID0gX3RoaXMkTysrLCBfdGhpcyRPKSksIF90aGlzJE8yKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfTCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9PMiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9OID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0IgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIEltYWdlTWFuYWdlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfQik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0wsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICgwLCBpLmdldFV1aWQpKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfTzIsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfTiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGdldEZyb21GaWxlKHQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IGUsXG4gICAgICAgICAgICBuYW1lOiBuLFxuICAgICAgICAgICAgc2l6ZTogaSxcbiAgICAgICAgICAgIHR5cGU6IHJcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfQiwgX0IyKS5jYWxsKHRoaXMsIFwiXCIuY29uY2F0KGUsIFwiX1wiKS5jb25jYXQobiwgXCJfXCIpLmNvbmNhdChpLCBcIl9cIikuY29uY2F0KHIpLCB0KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBnZXRGcm9tVXJsKHQpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfQiwgX0IyKS5jYWxsKHRoaXMsIHQsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGdldEZyb21JZCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OKSB8fCBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX04sIG5ldyBNYXAoKSk7XG4gICAgICAgICAgY29uc3QgZSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuZ2V0KHQpO1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgaWYgKGUuYml0bWFwKSB7XG4gICAgICAgICAgICBlLnJlZkNvdW50ZXIgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZS5maWxlID8gdGhpcy5nZXRGcm9tRmlsZShlLmZpbGUpIDogdGhpcy5nZXRGcm9tVXJsKGUudXJsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRTdmdVcmwodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX04pLmdldCh0KTtcbiAgICAgICAgICByZXR1cm4gZSAhPT0gbnVsbCAmJiBlICE9PSB2b2lkIDAgJiYgZS5pc1N2ZyA/IGUuc3ZnVXJsIDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGVJZCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OKSB8fCBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX04sIG5ldyBNYXAoKSk7XG4gICAgICAgICAgY29uc3QgZSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuZ2V0KHQpO1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBlLnJlZkNvdW50ZXIgLT0gMTtcbiAgICAgICAgICAgIDAgPT09IGUucmVmQ291bnRlciAmJiAoZS5iaXRtYXAgPSBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaXNWYWxpZElkKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC5zdGFydHNXaXRoKFwiaW1hZ2VfXCIuY29uY2F0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTCksIFwiX1wiKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIF9CMih0LCBlKSB7XG4gICAgICAgIHZhciBfbjU7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9OLCBuZXcgTWFwKCkpO1xuICAgICAgICBsZXQgbiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuZ2V0KHQpO1xuICAgICAgICBpZiAobnVsbCA9PT0gbikgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICgoX241ID0gbikgIT09IG51bGwgJiYgX241ICE9PSB2b2lkIDAgJiYgX241LmJpdG1hcCkge1xuICAgICAgICAgIG4ucmVmQ291bnRlciArPSAxO1xuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIF90aGlzJE8zLCBfdGhpcyRPNDtcbiAgICAgICAgICBuIHx8IChuID0ge1xuICAgICAgICAgICAgYml0bWFwOiBudWxsLFxuICAgICAgICAgICAgaWQ6IFwiaW1hZ2VfXCIuY29uY2F0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTCksIFwiX1wiKS5jb25jYXQoKF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfTzIsIChfdGhpcyRPMyA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTzIpLCBfdGhpcyRPNCA9IF90aGlzJE8zKyssIF90aGlzJE8zKSksIF90aGlzJE80KSksXG4gICAgICAgICAgICByZWZDb3VudGVyOiAwLFxuICAgICAgICAgICAgaXNTdmc6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHQ7XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIGUpIHtcbiAgICAgICAgICAgIG4udXJsID0gZTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBhd2FpdCBmZXRjaChlKTtcbiAgICAgICAgICAgIGlmICghaS5vaykgdGhyb3cgbmV3IEVycm9yKGkuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICB0ID0gYXdhaXQgaS5ibG9iKCk7XG4gICAgICAgICAgfSBlbHNlIHQgPSBuLmZpbGUgPSBlO1xuICAgICAgICAgIGlmIChcImltYWdlL3N2Zyt4bWxcIiA9PT0gdC50eXBlKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IEZpbGVSZWFkZXIoKSxcbiAgICAgICAgICAgICAgaSA9IG5ldyBJbWFnZSgpLFxuICAgICAgICAgICAgICByID0gbmV3IFByb21pc2UoKHQsIHIpID0+IHtcbiAgICAgICAgICAgICAgICBpLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIG4uYml0bWFwID0gaTtcbiAgICAgICAgICAgICAgICAgIG4uaXNTdmcgPSAhMDtcbiAgICAgICAgICAgICAgICAgIHQoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGUub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaS5zcmMgPSBuLnN2Z1VybCA9IGUucmVzdWx0O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaS5vbmVycm9yID0gZS5vbmVycm9yID0gcjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlLnJlYWRBc0RhdGFVUkwodCk7XG4gICAgICAgICAgICBhd2FpdCByO1xuICAgICAgICAgIH0gZWxzZSBuLmJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKHQpO1xuICAgICAgICAgIG4ucmVmQ291bnRlciA9IDE7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHQpO1xuICAgICAgICAgIG4gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuc2V0KHQsIG4pO1xuICAgICAgICBuICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuc2V0KG4uaWQsIG4pO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIHZhciBfaiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9VID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3ogPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfSCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgQ29tbWFuZE1hbmFnZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogW11cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfVSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfeiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0gsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IC0xXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IDEyODtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3osIHQpO1xuICAgICAgICB9XG4gICAgICAgIGFkZCh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGNtZDogZSxcbiAgICAgICAgICAgIHVuZG86IG4sXG4gICAgICAgICAgICBtdXN0RXhlYzogaSxcbiAgICAgICAgICAgIHR5cGU6IHIgPSBOYU4sXG4gICAgICAgICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiBzID0gITEsXG4gICAgICAgICAgICBrZWVwVW5kbzogYSA9ICExXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgaSAmJiBlKCk7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVSkpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBvID0ge1xuICAgICAgICAgICAgY21kOiBlLFxuICAgICAgICAgICAgdW5kbzogbixcbiAgICAgICAgICAgIHR5cGU6IHJcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICgtMSA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9IKSkge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKS5sZW5ndGggPiAwICYmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2opLmxlbmd0aCA9IDApO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ILCAwKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaikucHVzaChvKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKVtfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpXS50eXBlID09PSByKSB7XG4gICAgICAgICAgICBhICYmIChvLnVuZG8gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2opW19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSCldLnVuZG8pO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKVtfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpXSA9IG87XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGwgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpICsgMTtcbiAgICAgICAgICBpZiAobCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF96KSkgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKS5zcGxpY2UoMCwgMSk7ZWxzZSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0gsIGwpO1xuICAgICAgICAgICAgbCA8IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaikubGVuZ3RoICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaikuc3BsaWNlKGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2opLnB1c2gobyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcFVuZG9BY2N1bXVsYXRpb24oKSB7XG4gICAgICAgICAgLTEgIT09IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSCkgJiYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfailbX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9IKV0udHlwZSA9IE5hTik7XG4gICAgICAgIH1cbiAgICAgICAgdW5kbygpIHtcbiAgICAgICAgICBpZiAoLTEgIT09IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSCkpIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfVSwgITApO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKVtfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpXS51bmRvKCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1UsICExKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfSCwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9IKSAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZWRvKCkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpIDwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0gsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSCkgKyAxKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfVSwgITApO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKVtfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpXS5jbWQoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfVSwgITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG8oKSB7XG4gICAgICAgICAgcmV0dXJuIC0xICE9PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpO1xuICAgICAgICB9XG4gICAgICAgIGhhc1NvbWV0aGluZ1RvUmVkbygpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9IKSA8IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaikubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuQ29tbWFuZE1hbmFnZXIgPSBDb21tYW5kTWFuYWdlcjtcbiAgICAgIHZhciBfcSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgY2xhc3MgS2V5Ym9hcmRNYW5hZ2VyIHtcbiAgICAgICAgY29uc3RydWN0b3IoX3Q1KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9xKTtcbiAgICAgICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuYWxsS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpc01hYzogX2U1XG4gICAgICAgICAgfSA9IGkuRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgICAgICAgZm9yIChjb25zdCBbbiwgaSwgciA9IHt9XSBvZiBfdDUpIGZvciAoY29uc3QgdCBvZiBuKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5zdGFydHNXaXRoKFwibWFjK1wiKTtcbiAgICAgICAgICAgIGlmIChfZTUgJiYgbikge1xuICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5zZXQodC5zbGljZSg0KSwge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHJcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuYWxsS2V5cy5hZGQodC5zcGxpdChcIitcIikuYXQoLTEpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIV9lNSAmJiAhbikge1xuICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5zZXQodCwge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHJcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuYWxsS2V5cy5hZGQodC5zcGxpdChcIitcIikuYXQoLTEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXhlYyh0LCBlKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmFsbEtleXMuaGFzKGUua2V5KSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmNhbGxiYWNrcy5nZXQoX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcSwgX3EyKS5jYWxsKHRoaXMsIGUpKTtcbiAgICAgICAgICBpZiAoIW4pIHJldHVybjtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjYWxsYmFjazogaSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgYnViYmxlczogciA9ICExLFxuICAgICAgICAgICAgICBhcmdzOiBzID0gW10sXG4gICAgICAgICAgICAgIGNoZWNrZXI6IGEgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSA9IG47XG4gICAgICAgICAgaWYgKCFhIHx8IGEodCwgZSkpIHtcbiAgICAgICAgICAgIGkuYmluZCh0LCAuLi5zKSgpO1xuICAgICAgICAgICAgaWYgKCFyKSB7XG4gICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9xMih0KSB7XG4gICAgICAgIHQuYWx0S2V5ICYmIHRoaXMuYnVmZmVyLnB1c2goXCJhbHRcIik7XG4gICAgICAgIHQuY3RybEtleSAmJiB0aGlzLmJ1ZmZlci5wdXNoKFwiY3RybFwiKTtcbiAgICAgICAgdC5tZXRhS2V5ICYmIHRoaXMuYnVmZmVyLnB1c2goXCJtZXRhXCIpO1xuICAgICAgICB0LnNoaWZ0S2V5ICYmIHRoaXMuYnVmZmVyLnB1c2goXCJzaGlmdFwiKTtcbiAgICAgICAgdGhpcy5idWZmZXIucHVzaCh0LmtleSk7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmJ1ZmZlci5qb2luKFwiK1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGVuZ3RoID0gMDtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICBlLktleWJvYXJkTWFuYWdlciA9IEtleWJvYXJkTWFuYWdlcjtcbiAgICAgIGNsYXNzIENvbG9yTWFuYWdlciB7XG4gICAgICAgIGdldCBfY29sb3JzKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgTWFwKFtbXCJDYW52YXNUZXh0XCIsIG51bGxdLCBbXCJDYW52YXNcIiwgbnVsbF1dKTtcbiAgICAgICAgICAoMCwgci5nZXRDb2xvclZhbHVlcykodCk7XG4gICAgICAgICAgcmV0dXJuICgwLCBpLnNoYWRvdykodGhpcywgXCJfY29sb3JzXCIsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnZlcnQodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSAoMCwgci5nZXRSR0IpKHQpO1xuICAgICAgICAgIGlmICghd2luZG93Lm1hdGNoTWVkaWEoXCIoZm9yY2VkLWNvbG9yczogYWN0aXZlKVwiKS5tYXRjaGVzKSByZXR1cm4gZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFt0LCBuXSBvZiB0aGlzLl9jb2xvcnMpIGlmIChuLmV2ZXJ5KCh0LCBuKSA9PiB0ID09PSBlW25dKSkgcmV0dXJuIENvbG9yTWFuYWdlci5fY29sb3JzTWFwcGluZy5nZXQodCk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SGV4Q29kZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuX2NvbG9ycy5nZXQodCk7XG4gICAgICAgICAgcmV0dXJuIGUgPyBpLlV0aWwubWFrZUhleENvbG9yKC4uLmUpIDogdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX2RlZmluZVByb3BlcnR5KENvbG9yTWFuYWdlciwgXCJfY29sb3JzTWFwcGluZ1wiLCBuZXcgTWFwKFtbXCJDYW52YXNUZXh0XCIsIFswLCAwLCAwXV0sIFtcIkNhbnZhc1wiLCBbMjU1LCAyNTUsIDI1NV1dXSkpO1xuICAgICAgZS5Db2xvck1hbmFnZXIgPSBDb2xvck1hbmFnZXI7XG4gICAgICB2YXIgX1cgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfRyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9WID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgXyQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9LID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1kgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfSiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9RID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1ogPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfaXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfcnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfc3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfYXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfb3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfY3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfaHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfcHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZ3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfYnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfdnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfQXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfdDYgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfeHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfd3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfVHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfUHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfU3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfQ3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfRXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIge1xuICAgICAgICBzdGF0aWMgZ2V0IF9rZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIucHJvdG90eXBlLFxuICAgICAgICAgICAgYXJyb3dDaGVja2VyID0gdCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50OiBlXG4gICAgICAgICAgICAgIH0gPSBkb2N1bWVudDtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHQsIF9idCkuY29udGFpbnMoZSkgJiYgdC5oYXNTb21ldGhpbmdUb0NvbnRyb2woKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlID0gdGhpcy5UUkFOU0xBVEVfU01BTEwsXG4gICAgICAgICAgICBuID0gdGhpcy5UUkFOU0xBVEVfQklHO1xuICAgICAgICAgIHJldHVybiAoMCwgaS5zaGFkb3cpKHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiY3RybCthXCIsIFwibWFjK21ldGErYVwiXSwgdC5zZWxlY3RBbGxdLCBbW1wiY3RybCt6XCIsIFwibWFjK21ldGErelwiXSwgdC51bmRvXSwgW1tcImN0cmwreVwiLCBcImN0cmwrc2hpZnQrelwiLCBcIm1hYyttZXRhK3NoaWZ0K3pcIiwgXCJjdHJsK3NoaWZ0K1pcIiwgXCJtYWMrbWV0YStzaGlmdCtaXCJdLCB0LnJlZG9dLCBbW1wiQmFja3NwYWNlXCIsIFwiYWx0K0JhY2tzcGFjZVwiLCBcImN0cmwrQmFja3NwYWNlXCIsIFwic2hpZnQrQmFja3NwYWNlXCIsIFwibWFjK0JhY2tzcGFjZVwiLCBcIm1hYythbHQrQmFja3NwYWNlXCIsIFwibWFjK2N0cmwrQmFja3NwYWNlXCIsIFwiRGVsZXRlXCIsIFwiY3RybCtEZWxldGVcIiwgXCJzaGlmdCtEZWxldGVcIiwgXCJtYWMrRGVsZXRlXCJdLCB0LmRlbGV0ZV0sIFtbXCJFc2NhcGVcIiwgXCJtYWMrRXNjYXBlXCJdLCB0LnVuc2VsZWN0QWxsXSwgW1tcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd0xlZnRcIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbLWUsIDBdLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV0sIFtbXCJjdHJsK0Fycm93TGVmdFwiLCBcIm1hYytzaGlmdCtBcnJvd0xlZnRcIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbLW4sIDBdLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV0sIFtbXCJBcnJvd1JpZ2h0XCIsIFwibWFjK0Fycm93UmlnaHRcIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbZSwgMF0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcImN0cmwrQXJyb3dSaWdodFwiLCBcIm1hYytzaGlmdCtBcnJvd1JpZ2h0XCJdLCB0LnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgICAgICAgYXJnczogW24sIDBdLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV0sIFtbXCJBcnJvd1VwXCIsIFwibWFjK0Fycm93VXBcIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbMCwgLWVdLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV0sIFtbXCJjdHJsK0Fycm93VXBcIiwgXCJtYWMrc2hpZnQrQXJyb3dVcFwiXSwgdC50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgICAgICAgIGFyZ3M6IFswLCAtbl0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcIkFycm93RG93blwiLCBcIm1hYytBcnJvd0Rvd25cIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbMCwgZV0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcImN0cmwrQXJyb3dEb3duXCIsIFwibWFjK3NoaWZ0K0Fycm93RG93blwiXSwgdC50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgICAgICAgIGFyZ3M6IFswLCBuXSxcbiAgICAgICAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgICAgICAgIH1dXSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0cnVjdG9yKF90OCwgX2U2LCBfbjQsIF9pMykge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfRXQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfQ3QpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfU3QpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfUHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfVHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfd3QpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfeHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfdDYpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfQXQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfdnQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfeXQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9XLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0csIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9WLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgTWFwKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfJCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9YLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgQ29tbWFuZE1hbmFnZXIoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9LLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1ksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBTZXQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9KLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1EsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBTZXQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9aLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3R0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2V0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgSWRNYW5hZ2VyKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbnQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2l0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBpLkFubm90YXRpb25FZGl0b3JUeXBlLk5PTkVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfcnQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBTZXQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9zdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9hdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5jb3B5LmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfb3QsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY3V0LmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbHQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFzdGUuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9jdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5rZXlkb3duLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaHQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMub25FZGl0aW5nQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZHQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMub25QYWdlQ2hhbmdpbmcuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF91dCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5vblNjYWxlQ2hhbmdpbmcuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9wdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5vblJvdGF0aW9uQ2hhbmdpbmcuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9mdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBpc0VkaXRpbmc6ICExLFxuICAgICAgICAgICAgICBpc0VtcHR5OiAhMCxcbiAgICAgICAgICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiAhMSxcbiAgICAgICAgICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiAhMSxcbiAgICAgICAgICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6ICExXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2d0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBbMCwgMF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbXQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfYnQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2J0LCBfdDgpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWiwgX2U2KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1opLl9vbihcImVkaXRpbmdhY3Rpb25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9odCkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWikuX29uKFwicGFnZWNoYW5naW5nXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZHQpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1opLl9vbihcInNjYWxlY2hhbmdpbmdcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF91dCkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWikuX29uKFwicm90YXRpb25jaGFuZ2luZ1wiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3B0KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF8kLCBfbjQuYW5ub3RhdGlvblN0b3JhZ2UpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfdHQsIF9uNC5maWx0ZXJGYWN0b3J5KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3N0LCBfaTMpO1xuICAgICAgICAgIHRoaXMudmlld1BhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICByZWFsU2NhbGU6IHIuUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTLFxuICAgICAgICAgICAgcm90YXRpb246IDBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfdnQsIF92dDIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9aKS5fb2ZmKFwiZWRpdGluZ2FjdGlvblwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2h0KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9aKS5fb2ZmKFwicGFnZWNoYW5naW5nXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZHQpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1opLl9vZmYoXCJzY2FsZWNoYW5naW5nXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdXQpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1opLl9vZmYoXCJyb3RhdGlvbmNoYW5naW5nXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcHQpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS52YWx1ZXMoKSkgdC5kZXN0cm95KCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS5jbGVhcigpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRykuY2xlYXIoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1EpLmNsZWFyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9XLCBudWxsKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5jbGVhcigpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBoY21GaWx0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBpLnNoYWRvdykodGhpcywgXCJoY21GaWx0ZXJcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9zdCkgPyBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3R0KS5hZGRIQ01GaWx0ZXIoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9zdCkuZm9yZWdyb3VuZCwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9zdCkuYmFja2dyb3VuZCkgOiBcIm5vbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgb25QYWdlQ2hhbmdpbmcodCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBwYWdlTnVtYmVyOiBlXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9LLCBlIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9jdXNNYWluQ29udGFpbmVyKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYnQpLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkU2hvdWxkUmVzY2FsZSh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9RKS5hZGQodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlU2hvdWxkUmVzY2FsZSh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9RKS5kZWxldGUodCk7XG4gICAgICAgIH1cbiAgICAgICAgb25TY2FsZUNoYW5naW5nKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgc2NhbGU6IGVcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICAgICAgdGhpcy52aWV3UGFyYW1ldGVycy5yZWFsU2NhbGUgPSBlICogci5QaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFM7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUSkpIHQub25TY2FsZUNoYW5naW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgb25Sb3RhdGlvbkNoYW5naW5nKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgcGFnZXNSb3RhdGlvbjogZVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICAgICAgICB0aGlzLnZpZXdQYXJhbWV0ZXJzLnJvdGF0aW9uID0gZTtcbiAgICAgICAgfVxuICAgICAgICBhZGRUb0Fubm90YXRpb25TdG9yYWdlKHQpIHtcbiAgICAgICAgICB0LmlzRW1wdHkoKSB8fCAhX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF8kKSB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgXyQpLmhhcyh0LmlkKSB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgXyQpLnNldFZhbHVlKHQuaWQsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvcHkodCkge1xuICAgICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVykuY29tbWl0T3JSZW1vdmUoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQuc2VyaWFsaXplKCEwKTtcbiAgICAgICAgICAgIG4gJiYgZS5wdXNoKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAwICE9PSBlLmxlbmd0aCAmJiB0LmNsaXBib2FyZERhdGEuc2V0RGF0YShcImFwcGxpY2F0aW9uL3BkZmpzXCIsIEpTT04uc3RyaW5naWZ5KGUpKTtcbiAgICAgICAgfVxuICAgICAgICBjdXQodCkge1xuICAgICAgICAgIHRoaXMuY29weSh0KTtcbiAgICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHBhc3RlKHQpIHtcbiAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgbGV0IGUgPSB0LmNsaXBib2FyZERhdGEuZ2V0RGF0YShcImFwcGxpY2F0aW9uL3BkZmpzXCIpO1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlID0gSlNPTi5wYXJzZShlKTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKShcInBhc3RlOiBcXFwiXCIuY29uY2F0KHQubWVzc2FnZSwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlKSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jdXJyZW50TGF5ZXI7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBuLmRlc2VyaWFsaXplKGkpO1xuICAgICAgICAgICAgICBpZiAoIWUpIHJldHVybjtcbiAgICAgICAgICAgICAgdC5wdXNoKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY21kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0KSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9TdCwgX1N0MikuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9FdCwgX0V0MikuY2FsbCh0aGlzLCB0KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdW5kbyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkgZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICAgICAgICBjbWQ6IGNtZCxcbiAgICAgICAgICAgICAgdW5kbzogdW5kbyxcbiAgICAgICAgICAgICAgbXVzdEV4ZWM6ICEwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKShcInBhc3RlOiBcXFwiXCIuY29uY2F0KHQubWVzc2FnZSwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleWRvd24odCkge1xuICAgICAgICAgIHZhciBfdGhpcyRnZXRBY3RpdmU7XG4gICAgICAgICAgKChfdGhpcyRnZXRBY3RpdmUgPSB0aGlzLmdldEFjdGl2ZSgpKSA9PT0gbnVsbCB8fCBfdGhpcyRnZXRBY3RpdmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGdldEFjdGl2ZS5zaG91bGRHZXRLZXlib2FyZEV2ZW50cygpKSB8fCBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLCB0KTtcbiAgICAgICAgfVxuICAgICAgICBvbkVkaXRpbmdBY3Rpb24odCkge1xuICAgICAgICAgIFtcInVuZG9cIiwgXCJyZWRvXCIsIFwiZGVsZXRlXCIsIFwic2VsZWN0QWxsXCJdLmluY2x1ZGVzKHQubmFtZSkgJiYgdGhpc1t0Lm5hbWVdKCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0RWRpdGluZ1N0YXRlKHQpIHtcbiAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfeXQsIF95dDIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9BdCwgX0F0MikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3h0LCBfeHQyKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgaXNFZGl0aW5nOiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2l0KSAhPT0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FLFxuICAgICAgICAgICAgICBpc0VtcHR5OiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9DdCwgX0N0MikuY2FsbCh0aGlzKSxcbiAgICAgICAgICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1gpLmhhc1NvbWV0aGluZ1RvVW5kbygpLFxuICAgICAgICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkuaGFzU29tZXRoaW5nVG9SZWRvKCksXG4gICAgICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3Z0LCBfdnQyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfdDYsIF90NykuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3h0LCBfeHQyKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgaXNFZGl0aW5nOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlZ2lzdGVyRWRpdG9yVHlwZXModCkge1xuICAgICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9KKSkge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9KLCB0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0opKSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF93dCwgX3d0MikuY2FsbCh0aGlzLCB0LmRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXRJZCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ldCkuZ2V0SWQoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY3VycmVudExheWVyKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1YpLmdldChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0spKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY3VycmVudFBhZ2VJbmRleCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9LKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRMYXllcih0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS5zZXQodC5wYWdlSW5kZXgsIHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbnQpID8gdC5lbmFibGUoKSA6IHQuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZUxheWVyKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1YpLmRlbGV0ZSh0LnBhZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlTW9kZSh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9pdCwgdCk7XG4gICAgICAgICAgaWYgKHQgIT09IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgICAgICAgdGhpcy5zZXRFZGl0aW5nU3RhdGUoITApO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVHQsIF9UdDIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS52YWx1ZXMoKSkgZS51cGRhdGVNb2RlKHQpO1xuICAgICAgICAgICAgaWYgKGUpIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLnZhbHVlcygpKSBpZiAodC5hbm5vdGF0aW9uRWxlbWVudElkID09PSBlKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQodCk7XG4gICAgICAgICAgICAgIHQuZW50ZXJJbkVkaXRNb2RlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldEVkaXRpbmdTdGF0ZSghMSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9QdCwgX1B0MikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlVG9vbGJhcih0KSB7XG4gICAgICAgICAgdCAhPT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9pdCkgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9aKS5kaXNwYXRjaChcInN3aXRjaGFubm90YXRpb25lZGl0b3Jtb2RlXCIsIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgIG1vZGU6IHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVQYXJhbXModCwgZSkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0opKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG4gb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkpIG4udXBkYXRlUGFyYW1zKHQsIGUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSikpIG4udXBkYXRlRGVmYXVsdFBhcmFtcyh0LCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdG9ycyh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLnZhbHVlcygpKSBuLnBhZ2VJbmRleCA9PT0gdCAmJiBlLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdG9yKHQpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9HKS5nZXQodCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkRWRpdG9yKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLnNldCh0LmlkLCB0KTtcbiAgICAgICAgfVxuICAgICAgICByZW1vdmVFZGl0b3IodCkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQ0O1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRykuZGVsZXRlKHQuaWQpO1xuICAgICAgICAgIHRoaXMudW5zZWxlY3QodCk7XG4gICAgICAgICAgdC5hbm5vdGF0aW9uRWxlbWVudElkICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWSkuaGFzKHQuYW5ub3RhdGlvbkVsZW1lbnRJZCkgfHwgKChfY2xhc3NQcml2YXRlRmllbGRHZXQ0ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF8kKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NC5yZW1vdmUodC5pZCkpO1xuICAgICAgICB9XG4gICAgICAgIGFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZKS5hZGQodC5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgICAgICB0LmRlbGV0ZWQgPSAhMDtcbiAgICAgICAgfVxuICAgICAgICBpc0RlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0KSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWSkuaGFzKHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZURlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZKS5kZWxldGUodC5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgICAgICB0LmRlbGV0ZWQgPSAhMTtcbiAgICAgICAgfVxuICAgICAgICBzZXRBY3RpdmVFZGl0b3IodCkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpICE9PSB0KSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1csIHQpO1xuICAgICAgICAgICAgdCAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF93dCwgX3d0MikuY2FsbCh0aGlzLCB0LnByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVNlbGVjdGVkKHQpIHtcbiAgICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkuaGFzKHQpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5kZWxldGUodCk7XG4gICAgICAgICAgICB0LnVuc2VsZWN0KCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF94dCwgX3h0MikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0aGlzLmhhc1NlbGVjdGlvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcnQpLmFkZCh0KTtcbiAgICAgICAgICAgIHQuc2VsZWN0KCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF93dCwgX3d0MikuY2FsbCh0aGlzLCB0LnByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF94dCwgX3h0MikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiAhMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldFNlbGVjdGVkKHQpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkpIGUgIT09IHQgJiYgZS51bnNlbGVjdCgpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcnQpLmNsZWFyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkuYWRkKHQpO1xuICAgICAgICAgIHQuc2VsZWN0KCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfd3QsIF93dDIpLmNhbGwodGhpcywgdC5wcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3h0LCBfeHQyKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlzU2VsZWN0ZWQodCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5oYXModCk7XG4gICAgICAgIH1cbiAgICAgICAgdW5zZWxlY3QodCkge1xuICAgICAgICAgIHQudW5zZWxlY3QoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5kZWxldGUodCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfeHQsIF94dDIpLmNhbGwodGhpcywge1xuICAgICAgICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRoaXMuaGFzU2VsZWN0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGhhc1NlbGVjdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gMCAhPT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBzdG9wVW5kb0FjY3VtdWxhdGlvbigpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1gpLnN0b3BVbmRvQWNjdW11bGF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdW5kbygpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1gpLnVuZG8oKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF94dCwgX3h0MikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG86IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkuaGFzU29tZXRoaW5nVG9VbmRvKCksXG4gICAgICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86ICEwLFxuICAgICAgICAgICAgaXNFbXB0eTogX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfQ3QsIF9DdDIpLmNhbGwodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZWRvKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkucmVkbygpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3h0LCBfeHQyKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogITAsXG4gICAgICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkuaGFzU29tZXRoaW5nVG9SZWRvKCksXG4gICAgICAgICAgICBpc0VtcHR5OiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9DdCwgX0N0MikuY2FsbCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFkZENvbW1hbmRzKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1gpLmFkZCh0KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF94dCwgX3h0MikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG86ICEwLFxuICAgICAgICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiAhMSxcbiAgICAgICAgICAgIGlzRW1wdHk6IF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0N0LCBfQ3QyKS5jYWxsKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlKCkge1xuICAgICAgICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgdCA9IFsuLi5fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KV07XG4gICAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQpIGUucmVtb3ZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfU3QsIF9TdDIpLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbXVzdEV4ZWM6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29tbWl0T3JSZW1vdmUoKSB7XG4gICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDU7XG4gICAgICAgICAgKF9jbGFzc1ByaXZhdGVGaWVsZEdldDUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpKSA9PT0gbnVsbCB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQ1ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2xhc3NQcml2YXRlRmllbGRHZXQ1LmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaGFzU29tZXRoaW5nVG9Db250cm9sKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpIHx8IHRoaXMuaGFzU2VsZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdEFsbCgpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkpIHQuY29tbWl0KCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRXQsIF9FdDIpLmNhbGwodGhpcywgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9HKS52YWx1ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5zZWxlY3RBbGwoKSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVykpIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVykuY29tbWl0T3JSZW1vdmUoKTtlbHNlIGlmICh0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcnQpKSB0LnVuc2VsZWN0KCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5jbGVhcigpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfeHQsIF94dDIpLmNhbGwodGhpcywge1xuICAgICAgICAgICAgICBoYXNTZWxlY3RlZEVkaXRvcjogITFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnModCwgZSkge1xuICAgICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdICYmIGFyZ3VtZW50c1syXSB8fCB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikgcmV0dXJuO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZ3QpWzBdICs9IHQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ndClbMV0gKz0gZTtcbiAgICAgICAgICBjb25zdCBbbiwgaV0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2d0KSxcbiAgICAgICAgICAgIHIgPSBbLi4uX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCldO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbXQpICYmIGNsZWFyVGltZW91dChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX210KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9tdCwgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX210LCBudWxsKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZ3QpWzBdID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ndClbMV0gPSAwO1xuICAgICAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiByKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLmhhcyh0LmlkKSAmJiB0LnRyYW5zbGF0ZUluUGFnZShuLCBpKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiByKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLmhhcyh0LmlkKSAmJiB0LnRyYW5zbGF0ZUluUGFnZSgtbiwgLWkpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtdXN0RXhlYzogITFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIDFlMykpO1xuICAgICAgICAgIGZvciAoY29uc3QgbiBvZiByKSBuLnRyYW5zbGF0ZUluUGFnZSh0LCBlKTtcbiAgICAgICAgfVxuICAgICAgICBpc0FjdGl2ZSh0KSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVykgPT09IHQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0QWN0aXZlKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpO1xuICAgICAgICB9XG4gICAgICAgIGdldE1vZGUoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaXQpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpbWFnZU1hbmFnZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBpLnNoYWRvdykodGhpcywgXCJpbWFnZU1hbmFnZXJcIiwgbmV3IEltYWdlTWFuYWdlcigpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3l0MigpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfY3QpLCB7XG4gICAgICAgICAgY2FwdHVyZTogITBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfdnQyKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jdCksIHtcbiAgICAgICAgICBjYXB0dXJlOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9BdDIoKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb3B5XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYXQpKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImN1dFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX290KSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2x0KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfdDcoKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb3B5XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYXQpKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImN1dFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX290KSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2x0KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfeHQyKHQpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXModCkuc29tZSh0ID0+IHtcbiAgICAgICAgICBsZXQgW2UsIG5dID0gdDtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mdClbZV0gIT09IG47XG4gICAgICAgIH0pICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWikuZGlzcGF0Y2goXCJhbm5vdGF0aW9uZWRpdG9yc3RhdGVzY2hhbmdlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbHM6IE9iamVjdC5hc3NpZ24oX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mdCksIHQpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3d0Mih0KSB7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWikuZGlzcGF0Y2goXCJhbm5vdGF0aW9uZWRpdG9ycGFyYW1zY2hhbmdlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbHM6IHRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfVHQyKCkge1xuICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbnQpKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9udCwgITApO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1YpLnZhbHVlcygpKSB0LmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfUHQyKCkge1xuICAgICAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XG4gICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX250KSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbnQsICExKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS52YWx1ZXMoKSkgdC5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9TdDIodCkge1xuICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS5nZXQodC5wYWdlSW5kZXgpO1xuICAgICAgICBlID8gZS5hZGRPclJlYnVpbGQodCkgOiB0aGlzLmFkZEVkaXRvcih0KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9DdDIoKSB7XG4gICAgICAgIGlmICgwID09PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLnNpemUpIHJldHVybiAhMDtcbiAgICAgICAgaWYgKDEgPT09IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRykuc2l6ZSkgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRykudmFsdWVzKCkpIHJldHVybiB0LmlzRW1wdHkoKTtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0V0Mih0KSB7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcnQpLmNsZWFyKCk7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0KSBpZiAoIWUuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkuYWRkKGUpO1xuICAgICAgICAgIGUuc2VsZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfeHQsIF94dDIpLmNhbGwodGhpcywge1xuICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLCBcIlRSQU5TTEFURV9TTUFMTFwiLCAxKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLCBcIlRSQU5TTEFURV9CSUdcIiwgMTApO1xuICAgICAgZS5Bbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyID0gQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigzKSxcbiAgICAgICAgciA9IG4oNiksXG4gICAgICAgIHMgPSBuKDQpLFxuICAgICAgICBhID0gbigyNCksXG4gICAgICAgIG8gPSBuKDE0KSxcbiAgICAgICAgbCA9IG4oOCksXG4gICAgICAgIGMgPSBuKDIxKSxcbiAgICAgICAgaCA9IG4oMjApLFxuICAgICAgICBkID0gbig5MSksXG4gICAgICAgIHUgPSBuKDM5KSxcbiAgICAgICAgcCA9IG4oNzcpLFxuICAgICAgICBmID0gbig2NCksXG4gICAgICAgIGcgPSBuKDE1OCksXG4gICAgICAgIG0gPSBuKDcpLFxuICAgICAgICBiID0gbigxNjYpLFxuICAgICAgICB2ID0gbigyNyksXG4gICAgICAgIHkgPSBzLkpTT04sXG4gICAgICAgIEEgPSBzLk51bWJlcixcbiAgICAgICAgXyA9IHMuU3ludGF4RXJyb3IsXG4gICAgICAgIFMgPSB5ICYmIHkucGFyc2UsXG4gICAgICAgIEUgPSBhKFwiT2JqZWN0XCIsIFwia2V5c1wiKSxcbiAgICAgICAgeCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gICAgICAgIHcgPSBvKFwiXCIuY2hhckF0KSxcbiAgICAgICAgQyA9IG8oXCJcIi5zbGljZSksXG4gICAgICAgIFQgPSBvKC8uLy5leGVjKSxcbiAgICAgICAgUCA9IG8oW10ucHVzaCksXG4gICAgICAgIGsgPSAvXlxcZCQvLFxuICAgICAgICBNID0gL15bMS05XSQvLFxuICAgICAgICBSID0gL14oLXxcXGQpJC8sXG4gICAgICAgIEkgPSAvXltcXHRcXG5cXHIgXSQvLFxuICAgICAgICBpbnRlcm5hbGl6ZSA9IGZ1bmN0aW9uIGludGVybmFsaXplKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgICB2YXIgcixcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICBhLFxuICAgICAgICAgICAgbyxcbiAgICAgICAgICAgIGMsXG4gICAgICAgICAgICBwID0gdFtlXSxcbiAgICAgICAgICAgIGcgPSBpICYmIHAgPT09IGkudmFsdWUsXG4gICAgICAgICAgICBtID0gZyAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBpLnNvdXJjZSA/IHtcbiAgICAgICAgICAgICAgc291cmNlOiBpLnNvdXJjZVxuICAgICAgICAgICAgfSA6IHt9O1xuICAgICAgICAgIGlmIChoKHApKSB7XG4gICAgICAgICAgICB2YXIgYiA9IGQocCksXG4gICAgICAgICAgICAgIHYgPSBnID8gaS5ub2RlcyA6IGIgPyBbXSA6IHt9O1xuICAgICAgICAgICAgaWYgKGIpIHtcbiAgICAgICAgICAgICAgciA9IHYubGVuZ3RoO1xuICAgICAgICAgICAgICBhID0gZihwKTtcbiAgICAgICAgICAgICAgZm9yIChvID0gMDsgbyA8IGE7IG8rKykgaW50ZXJuYWxpemVQcm9wZXJ0eShwLCBvLCBpbnRlcm5hbGl6ZShwLCBcIlwiICsgbywgbiwgbyA8IHIgPyB2W29dIDogdm9pZCAwKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzID0gRShwKTtcbiAgICAgICAgICAgICAgYSA9IGYocyk7XG4gICAgICAgICAgICAgIGZvciAobyA9IDA7IG8gPCBhOyBvKyspIHtcbiAgICAgICAgICAgICAgICBjID0gc1tvXTtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbGl6ZVByb3BlcnR5KHAsIGMsIGludGVybmFsaXplKHAsIGMsIG4sIHUodiwgYykgPyB2W2NdIDogdm9pZCAwKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGwobiwgdCwgZSwgcCwgbSk7XG4gICAgICAgIH0sXG4gICAgICAgIGludGVybmFsaXplUHJvcGVydHkgPSBmdW5jdGlvbiBpbnRlcm5hbGl6ZVByb3BlcnR5KHQsIGUsIG4pIHtcbiAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgdmFyIGkgPSB4KHQsIGUpO1xuICAgICAgICAgICAgaWYgKGkgJiYgIWkuY29uZmlndXJhYmxlKSByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZvaWQgMCA9PT0gbiA/IGRlbGV0ZSB0W2VdIDogZyh0LCBlLCBuKTtcbiAgICAgICAgfSxcbiAgICAgICAgTm9kZSA9IGZ1bmN0aW9uIE5vZGUodCwgZSwgbiwgaSkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0O1xuICAgICAgICAgIHRoaXMuZW5kID0gZTtcbiAgICAgICAgICB0aGlzLnNvdXJjZSA9IG47XG4gICAgICAgICAgdGhpcy5ub2RlcyA9IGk7XG4gICAgICAgIH0sXG4gICAgICAgIENvbnRleHQgPSBmdW5jdGlvbiBDb250ZXh0KHQsIGUpIHtcbiAgICAgICAgICB0aGlzLnNvdXJjZSA9IHQ7XG4gICAgICAgICAgdGhpcy5pbmRleCA9IGU7XG4gICAgICAgIH07XG4gICAgICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICAgICAgZm9yazogZnVuY3Rpb24gZm9yayh0KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb250ZXh0KHRoaXMuc291cmNlLCB0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKCkge1xuICAgICAgICAgIHZhciB0ID0gdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBlID0gdGhpcy5za2lwKEksIHRoaXMuaW5kZXgpLFxuICAgICAgICAgICAgbiA9IHRoaXMuZm9yayhlKSxcbiAgICAgICAgICAgIGkgPSB3KHQsIGUpO1xuICAgICAgICAgIGlmIChUKFIsIGkpKSByZXR1cm4gbi5udW1iZXIoKTtcbiAgICAgICAgICBzd2l0Y2ggKGkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ7XCI6XG4gICAgICAgICAgICAgIHJldHVybiBuLm9iamVjdCgpO1xuICAgICAgICAgICAgY2FzZSBcIltcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIG4uYXJyYXkoKTtcbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgICAgcmV0dXJuIG4uc3RyaW5nKCk7XG4gICAgICAgICAgICBjYXNlIFwidFwiOlxuICAgICAgICAgICAgICByZXR1cm4gbi5rZXl3b3JkKCEwKTtcbiAgICAgICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgICAgIHJldHVybiBuLmtleXdvcmQoITEpO1xuICAgICAgICAgICAgY2FzZSBcIm5cIjpcbiAgICAgICAgICAgICAgcmV0dXJuIG4ua2V5d29yZChudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgXygnVW5leHBlY3RlZCBjaGFyYWN0ZXI6IFwiJyArIGkgKyAnXCIgYXQ6ICcgKyBlKTtcbiAgICAgICAgfSxcbiAgICAgICAgbm9kZTogZnVuY3Rpb24gbm9kZSh0LCBlLCBuLCBpLCByKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBOb2RlKGUsIGksIHQgPyBudWxsIDogQyh0aGlzLnNvdXJjZSwgbiwgaSksIHIpO1xuICAgICAgICB9LFxuICAgICAgICBvYmplY3Q6IGZ1bmN0aW9uIG9iamVjdCgpIHtcbiAgICAgICAgICBmb3IgKHZhciB0ID0gdGhpcy5zb3VyY2UsIGUgPSB0aGlzLmluZGV4ICsgMSwgbiA9ICExLCBpID0ge30sIHIgPSB7fTsgZSA8IHQubGVuZ3RoOykge1xuICAgICAgICAgICAgZSA9IHRoaXMudW50aWwoWydcIicsIFwifVwiXSwgZSk7XG4gICAgICAgICAgICBpZiAoXCJ9XCIgPT0gdyh0LCBlKSAmJiAhbikge1xuICAgICAgICAgICAgICBlKys7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHMgPSB0aGlzLmZvcmsoZSkuc3RyaW5nKCksXG4gICAgICAgICAgICAgIGEgPSBzLnZhbHVlO1xuICAgICAgICAgICAgZSA9IHMuZW5kO1xuICAgICAgICAgICAgZSA9IHRoaXMudW50aWwoW1wiOlwiXSwgZSkgKyAxO1xuICAgICAgICAgICAgZSA9IHRoaXMuc2tpcChJLCBlKTtcbiAgICAgICAgICAgIHMgPSB0aGlzLmZvcmsoZSkucGFyc2UoKTtcbiAgICAgICAgICAgIGcociwgYSwgcyk7XG4gICAgICAgICAgICBnKGksIGEsIHMudmFsdWUpO1xuICAgICAgICAgICAgZSA9IHRoaXMudW50aWwoW1wiLFwiLCBcIn1cIl0sIHMuZW5kKTtcbiAgICAgICAgICAgIHZhciBvID0gdyh0LCBlKTtcbiAgICAgICAgICAgIGlmIChcIixcIiA9PSBvKSB7XG4gICAgICAgICAgICAgIG4gPSAhMDtcbiAgICAgICAgICAgICAgZSsrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcIn1cIiA9PSBvKSB7XG4gICAgICAgICAgICAgIGUrKztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUoMSwgaSwgdGhpcy5pbmRleCwgZSwgcik7XG4gICAgICAgIH0sXG4gICAgICAgIGFycmF5OiBmdW5jdGlvbiBhcnJheSgpIHtcbiAgICAgICAgICBmb3IgKHZhciB0ID0gdGhpcy5zb3VyY2UsIGUgPSB0aGlzLmluZGV4ICsgMSwgbiA9ICExLCBpID0gW10sIHIgPSBbXTsgZSA8IHQubGVuZ3RoOykge1xuICAgICAgICAgICAgZSA9IHRoaXMuc2tpcChJLCBlKTtcbiAgICAgICAgICAgIGlmIChcIl1cIiA9PSB3KHQsIGUpICYmICFuKSB7XG4gICAgICAgICAgICAgIGUrKztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcyA9IHRoaXMuZm9yayhlKS5wYXJzZSgpO1xuICAgICAgICAgICAgUChyLCBzKTtcbiAgICAgICAgICAgIFAoaSwgcy52YWx1ZSk7XG4gICAgICAgICAgICBlID0gdGhpcy51bnRpbChbXCIsXCIsIFwiXVwiXSwgcy5lbmQpO1xuICAgICAgICAgICAgaWYgKFwiLFwiID09IHcodCwgZSkpIHtcbiAgICAgICAgICAgICAgbiA9ICEwO1xuICAgICAgICAgICAgICBlKys7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwiXVwiID09IHcodCwgZSkpIHtcbiAgICAgICAgICAgICAgZSsrO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZSgxLCBpLCB0aGlzLmluZGV4LCBlLCByKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RyaW5nOiBmdW5jdGlvbiBzdHJpbmcoKSB7XG4gICAgICAgICAgdmFyIHQgPSB0aGlzLmluZGV4LFxuICAgICAgICAgICAgZSA9IGIodGhpcy5zb3VyY2UsIHRoaXMuaW5kZXggKyAxKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlKDAsIGUudmFsdWUsIHQsIGUuZW5kKTtcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIoKSB7XG4gICAgICAgICAgdmFyIHQgPSB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgIGUgPSB0aGlzLmluZGV4LFxuICAgICAgICAgICAgbiA9IGU7XG4gICAgICAgICAgXCItXCIgPT0gdyh0LCBuKSAmJiBuKys7XG4gICAgICAgICAgaWYgKFwiMFwiID09IHcodCwgbikpIG4rKztlbHNlIHtcbiAgICAgICAgICAgIGlmICghVChNLCB3KHQsIG4pKSkgdGhyb3cgXyhcIkZhaWxlZCB0byBwYXJzZSBudW1iZXIgYXQ6IFwiICsgbik7XG4gICAgICAgICAgICBuID0gdGhpcy5za2lwKGssICsrbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIFwiLlwiID09IHcodCwgbikgJiYgKG4gPSB0aGlzLnNraXAoaywgKytuKSk7XG4gICAgICAgICAgaWYgKFwiZVwiID09IHcodCwgbikgfHwgXCJFXCIgPT0gdyh0LCBuKSkge1xuICAgICAgICAgICAgbisrO1xuICAgICAgICAgICAgXCIrXCIgIT0gdyh0LCBuKSAmJiBcIi1cIiAhPSB3KHQsIG4pIHx8IG4rKztcbiAgICAgICAgICAgIGlmIChuID09IChuID0gdGhpcy5za2lwKGssIG4pKSkgdGhyb3cgXyhcIkZhaWxlZCB0byBwYXJzZSBudW1iZXIncyBleHBvbmVudCB2YWx1ZSBhdDogXCIgKyBuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZSgwLCBBKEModCwgZSwgbikpLCBlLCBuKTtcbiAgICAgICAgfSxcbiAgICAgICAga2V5d29yZDogZnVuY3Rpb24ga2V5d29yZCh0KSB7XG4gICAgICAgICAgdmFyIGUgPSBcIlwiICsgdCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmluZGV4LFxuICAgICAgICAgICAgaSA9IG4gKyBlLmxlbmd0aDtcbiAgICAgICAgICBpZiAoQyh0aGlzLnNvdXJjZSwgbiwgaSkgIT0gZSkgdGhyb3cgXyhcIkZhaWxlZCB0byBwYXJzZSB2YWx1ZSBhdDogXCIgKyBuKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlKDAsIHQsIG4sIGkpO1xuICAgICAgICB9LFxuICAgICAgICBza2lwOiBmdW5jdGlvbiBza2lwKHQsIGUpIHtcbiAgICAgICAgICBmb3IgKHZhciBuID0gdGhpcy5zb3VyY2U7IGUgPCBuLmxlbmd0aCAmJiBUKHQsIHcobiwgZSkpOyBlKyspO1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9LFxuICAgICAgICB1bnRpbDogZnVuY3Rpb24gdW50aWwodCwgZSkge1xuICAgICAgICAgIGUgPSB0aGlzLnNraXAoSSwgZSk7XG4gICAgICAgICAgZm9yICh2YXIgbiA9IHcodGhpcy5zb3VyY2UsIGUpLCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIGlmICh0W2ldID09IG4pIHJldHVybiBlO1xuICAgICAgICAgIHRocm93IF8oJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyOiBcIicgKyBuICsgJ1wiIGF0OiAnICsgZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgRCA9IG0oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciB0LFxuICAgICAgICAgICAgZSA9IFwiOTAwNzE5OTI1NDc0MDk5M1wiO1xuICAgICAgICAgIFMoZSwgZnVuY3Rpb24gKGUsIG4sIGkpIHtcbiAgICAgICAgICAgIHQgPSBpLnNvdXJjZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdCAhPT0gZTtcbiAgICAgICAgfSksXG4gICAgICAgIE8gPSB2ICYmICFtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gMSAvIFMoXCItMCBcXHRcIikgIT0gLTEgLyAwO1xuICAgICAgICB9KTtcbiAgICAgIGkoe1xuICAgICAgICB0YXJnZXQ6IFwiSlNPTlwiLFxuICAgICAgICBzdGF0OiAhMCxcbiAgICAgICAgZm9yY2VkOiBEXG4gICAgICB9LCB7XG4gICAgICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZSh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIE8gJiYgIWMoZSkgPyBTKHQpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgIHQgPSBwKHQpO1xuICAgICAgICAgICAgdmFyIG4gPSBuZXcgQ29udGV4dCh0LCAwLCBcIlwiKSxcbiAgICAgICAgICAgICAgaSA9IG4ucGFyc2UoKSxcbiAgICAgICAgICAgICAgciA9IGkudmFsdWUsXG4gICAgICAgICAgICAgIHMgPSBuLnNraXAoSSwgaS5lbmQpO1xuICAgICAgICAgICAgaWYgKHMgPCB0Lmxlbmd0aCkgdGhyb3cgXygnVW5leHBlY3RlZCBleHRyYSBjaGFyYWN0ZXI6IFwiJyArIHcodCwgcykgKyAnXCIgYWZ0ZXIgdGhlIHBhcnNlZCBkYXRhIGF0OiAnICsgcyk7XG4gICAgICAgICAgICByZXR1cm4gYyhlKSA/IGludGVybmFsaXplKHtcbiAgICAgICAgICAgICAgXCJcIjogclxuICAgICAgICAgICAgfSwgXCJcIiwgZSwgaSkgOiByO1xuICAgICAgICAgIH0odCwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigzOSksXG4gICAgICAgIHMgPSBTeW50YXhFcnJvcixcbiAgICAgICAgYSA9IHBhcnNlSW50LFxuICAgICAgICBvID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcbiAgICAgICAgbCA9IGkoXCJcIi5jaGFyQXQpLFxuICAgICAgICBjID0gaShcIlwiLnNsaWNlKSxcbiAgICAgICAgaCA9IGkoLy4vLmV4ZWMpLFxuICAgICAgICBkID0ge1xuICAgICAgICAgICdcXFxcXCInOiAnXCInLFxuICAgICAgICAgIFwiXFxcXFxcXFxcIjogXCJcXFxcXCIsXG4gICAgICAgICAgXCJcXFxcL1wiOiBcIi9cIixcbiAgICAgICAgICBcIlxcXFxiXCI6IFwiXFxiXCIsXG4gICAgICAgICAgXCJcXFxcZlwiOiBcIlxcZlwiLFxuICAgICAgICAgIFwiXFxcXG5cIjogXCJcXG5cIixcbiAgICAgICAgICBcIlxcXFxyXCI6IFwiXFxyXCIsXG4gICAgICAgICAgXCJcXFxcdFwiOiBcIlxcdFwiXG4gICAgICAgIH0sXG4gICAgICAgIHUgPSAvXltcXGRhLWZdezR9JC9pLFxuICAgICAgICBwID0gL15bXFx1MDAwMC1cXHUwMDFGXSQvO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgZm9yICh2YXIgbiA9ICEwLCBpID0gXCJcIjsgZSA8IHQubGVuZ3RoOykge1xuICAgICAgICAgIHZhciBmID0gbCh0LCBlKTtcbiAgICAgICAgICBpZiAoXCJcXFxcXCIgPT0gZikge1xuICAgICAgICAgICAgdmFyIGcgPSBjKHQsIGUsIGUgKyAyKTtcbiAgICAgICAgICAgIGlmIChyKGQsIGcpKSB7XG4gICAgICAgICAgICAgIGkgKz0gZFtnXTtcbiAgICAgICAgICAgICAgZSArPSAyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKFwiXFxcXHVcIiAhPSBnKSB0aHJvdyBzKCdVbmtub3duIGVzY2FwZSBzZXF1ZW5jZTogXCInICsgZyArICdcIicpO1xuICAgICAgICAgICAgICB2YXIgbSA9IGModCwgZSArPSAyLCBlICsgNCk7XG4gICAgICAgICAgICAgIGlmICghaCh1LCBtKSkgdGhyb3cgcyhcIkJhZCBVbmljb2RlIGVzY2FwZSBhdDogXCIgKyBlKTtcbiAgICAgICAgICAgICAgaSArPSBvKGEobSwgMTYpKTtcbiAgICAgICAgICAgICAgZSArPSA0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoJ1wiJyA9PSBmKSB7XG4gICAgICAgICAgICAgIG4gPSAhMTtcbiAgICAgICAgICAgICAgZSsrO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoKHAsIGYpKSB0aHJvdyBzKFwiQmFkIGNvbnRyb2wgY2hhcmFjdGVyIGluIHN0cmluZyBsaXRlcmFsIGF0OiBcIiArIGUpO1xuICAgICAgICAgICAgaSArPSBmO1xuICAgICAgICAgICAgZSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobikgdGhyb3cgcyhcIlVudGVybWluYXRlZCBzdHJpbmcgYXQ6IFwiICsgZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IGksXG4gICAgICAgICAgZW5kOiBlXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9jbGFzczE5O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLlN0YXRUaW1lciA9IGUuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uID0gZS5QaXhlbHNQZXJJbmNoID0gZS5QYWdlVmlld3BvcnQgPSBlLlBERkRhdGVTdHJpbmcgPSBlLkRPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gZS5ET01TVkdGYWN0b3J5ID0gZS5ET01GaWx0ZXJGYWN0b3J5ID0gZS5ET01DYW52YXNGYWN0b3J5ID0gZS5ET01DTWFwUmVhZGVyRmFjdG9yeSA9IGUuQW5ub3RhdGlvblByZWZpeCA9IHZvaWQgMDtcbiAgICAgIGUuZGVwcmVjYXRlZCA9IGZ1bmN0aW9uIGRlcHJlY2F0ZWQodCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkRlcHJlY2F0ZWQgQVBJIHVzYWdlOiBcIiArIHQpO1xuICAgICAgfTtcbiAgICAgIGUuZ2V0Q29sb3JWYWx1ZXMgPSBmdW5jdGlvbiBnZXRDb2xvclZhbHVlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoZSk7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiB0LmtleXMoKSkge1xuICAgICAgICAgIGUuc3R5bGUuY29sb3IgPSBuO1xuICAgICAgICAgIGNvbnN0IGkgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5jb2xvcjtcbiAgICAgICAgICB0LnNldChuLCBnZXRSR0IoaSkpO1xuICAgICAgICB9XG4gICAgICAgIGUucmVtb3ZlKCk7XG4gICAgICB9O1xuICAgICAgZS5nZXRDdXJyZW50VHJhbnNmb3JtID0gZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybSh0KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBhOiBlLFxuICAgICAgICAgIGI6IG4sXG4gICAgICAgICAgYzogaSxcbiAgICAgICAgICBkOiByLFxuICAgICAgICAgIGU6IHMsXG4gICAgICAgICAgZjogYVxuICAgICAgICB9ID0gdC5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgcmV0dXJuIFtlLCBuLCBpLCByLCBzLCBhXTtcbiAgICAgIH07XG4gICAgICBlLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlID0gZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UodCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgYTogZSxcbiAgICAgICAgICBiOiBuLFxuICAgICAgICAgIGM6IGksXG4gICAgICAgICAgZDogcixcbiAgICAgICAgICBlOiBzLFxuICAgICAgICAgIGY6IGFcbiAgICAgICAgfSA9IHQuZ2V0VHJhbnNmb3JtKCkuaW52ZXJ0U2VsZigpO1xuICAgICAgICByZXR1cm4gW2UsIG4sIGksIHIsIHMsIGFdO1xuICAgICAgfTtcbiAgICAgIGUuZ2V0RmlsZW5hbWVGcm9tVXJsID0gZnVuY3Rpb24gZ2V0RmlsZW5hbWVGcm9tVXJsKHQpIHtcbiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdIHx8IChbdF0gPSB0LnNwbGl0KC9bIz9dLywgMSkpO1xuICAgICAgICByZXR1cm4gdC5zdWJzdHJpbmcodC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcbiAgICAgIH07XG4gICAgICBlLmdldFBkZkZpbGVuYW1lRnJvbVVybCA9IGZ1bmN0aW9uIGdldFBkZkZpbGVuYW1lRnJvbVVybCh0KSB7XG4gICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBcImRvY3VtZW50LnBkZlwiO1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPSB0eXBlb2YgdCkgcmV0dXJuIGU7XG4gICAgICAgIGlmIChpc0RhdGFTY2hlbWUodCkpIHtcbiAgICAgICAgICAoMCwgci53YXJuKSgnZ2V0UGRmRmlsZW5hbWVGcm9tVXJsOiBpZ25vcmUgXCJkYXRhOlwiLVVSTCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4nKTtcbiAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuID0gL1teLz8jPV0rXFwucGRmXFxiKD8hLipcXC5wZGZcXGIpL2ksXG4gICAgICAgICAgaSA9IC9eKD86KD86W146XSs6KT9cXC9cXC9bXi9dKyk/KFtePyNdKikoXFw/W14jXSopPygjLiopPyQvLmV4ZWModCk7XG4gICAgICAgIGxldCBzID0gbi5leGVjKGlbMV0pIHx8IG4uZXhlYyhpWzJdKSB8fCBuLmV4ZWMoaVszXSk7XG4gICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgcyA9IHNbMF07XG4gICAgICAgICAgaWYgKHMuaW5jbHVkZXMoXCIlXCIpKSB0cnkge1xuICAgICAgICAgICAgcyA9IG4uZXhlYyhkZWNvZGVVUklDb21wb25lbnQocykpWzBdO1xuICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQ5KSB7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzIHx8IGU7XG4gICAgICB9O1xuICAgICAgZS5nZXRSR0IgPSBnZXRSR0I7XG4gICAgICBlLmdldFhmYVBhZ2VWaWV3cG9ydCA9IGZ1bmN0aW9uIGdldFhmYVBhZ2VWaWV3cG9ydCh0LCBlKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgc2NhbGU6IG4gPSAxLFxuICAgICAgICAgIHJvdGF0aW9uOiBpID0gMFxuICAgICAgICB9ID0gZTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgd2lkdGg6IHIsXG4gICAgICAgICAgICBoZWlnaHQ6IHNcbiAgICAgICAgICB9ID0gdC5hdHRyaWJ1dGVzLnN0eWxlLFxuICAgICAgICAgIGEgPSBbMCwgMCwgcGFyc2VJbnQociksIHBhcnNlSW50KHMpXTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlVmlld3BvcnQoe1xuICAgICAgICAgIHZpZXdCb3g6IGEsXG4gICAgICAgICAgc2NhbGU6IG4sXG4gICAgICAgICAgcm90YXRpb246IGlcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgZS5pc0RhdGFTY2hlbWUgPSBpc0RhdGFTY2hlbWU7XG4gICAgICBlLmlzUGRmRmlsZSA9IGZ1bmN0aW9uIGlzUGRmRmlsZSh0KSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmIC9cXC5wZGYkL2kudGVzdCh0KTtcbiAgICAgIH07XG4gICAgICBlLmlzVmFsaWRGZXRjaFVybCA9IGlzVmFsaWRGZXRjaFVybDtcbiAgICAgIGUubG9hZFNjcmlwdCA9IGZ1bmN0aW9uIGxvYWRTY3JpcHQodCkge1xuICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdICYmIGFyZ3VtZW50c1sxXTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChuLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgci5zcmMgPSB0O1xuICAgICAgICAgIHIub25sb2FkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGUgJiYgci5yZW1vdmUoKTtcbiAgICAgICAgICAgIG4odCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpKG5ldyBFcnJvcihcIkNhbm5vdCBsb2FkIHNjcmlwdCBhdDogXCIuY29uY2F0KHIuc3JjKSkpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmQocik7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGUuc2V0TGF5ZXJEaW1lbnNpb25zID0gZnVuY3Rpb24gc2V0TGF5ZXJEaW1lbnNpb25zKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSAmJiBhcmd1bWVudHNbMl0sXG4gICAgICAgICAgaSA9ICEoYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10pIHx8IGFyZ3VtZW50c1szXTtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBQYWdlVmlld3BvcnQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHBhZ2VXaWR0aDogaSxcbiAgICAgICAgICAgICAgcGFnZUhlaWdodDogclxuICAgICAgICAgICAgfSA9IGUucmF3RGltcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3R5bGU6IHNcbiAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgYSA9IFwiY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpICogXCIuY29uY2F0KGksIFwicHgpXCIpLFxuICAgICAgICAgICAgbyA9IFwiY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpICogXCIuY29uY2F0KHIsIFwicHgpXCIpO1xuICAgICAgICAgIGlmIChuICYmIGUucm90YXRpb24gJSAxODAgIT0gMCkge1xuICAgICAgICAgICAgcy53aWR0aCA9IG87XG4gICAgICAgICAgICBzLmhlaWdodCA9IGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMud2lkdGggPSBhO1xuICAgICAgICAgICAgcy5oZWlnaHQgPSBvO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpICYmIHQuc2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIsIGUucm90YXRpb24pO1xuICAgICAgfTtcbiAgICAgIG4oMik7XG4gICAgICBuKDkzKTtcbiAgICAgIG4oMTAxKTtcbiAgICAgIG4oMTAyKTtcbiAgICAgIG4oMTA1KTtcbiAgICAgIG4oMTA3KTtcbiAgICAgIG4oMTA5KTtcbiAgICAgIG4oMTEzKTtcbiAgICAgIG4oMTE2KTtcbiAgICAgIG4oMTIzKTtcbiAgICAgIG4oODkpO1xuICAgICAgbig4NCk7XG4gICAgICBuKDg2KTtcbiAgICAgIG4oODcpO1xuICAgICAgdmFyIGkgPSBuKDE2OCksXG4gICAgICAgIHIgPSBuKDEpO1xuICAgICAgY29uc3QgcyA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtcbiAgICAgIGUuQW5ub3RhdGlvblByZWZpeCA9IFwicGRmanNfaW50ZXJuYWxfaWRfXCI7XG4gICAgICBjbGFzcyBQaXhlbHNQZXJJbmNoIHt9XG4gICAgICBfY2xhc3MxOSA9IFBpeGVsc1BlckluY2g7XG4gICAgICBfZGVmaW5lUHJvcGVydHkoUGl4ZWxzUGVySW5jaCwgXCJDU1NcIiwgOTYpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KFBpeGVsc1BlckluY2gsIFwiUERGXCIsIDcyKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShQaXhlbHNQZXJJbmNoLCBcIlBERl9UT19DU1NfVU5JVFNcIiwgX2NsYXNzMTkuQ1NTIC8gX2NsYXNzMTkuUERGKTtcbiAgICAgIGUuUGl4ZWxzUGVySW5jaCA9IFBpeGVsc1BlckluY2g7XG4gICAgICB2YXIgX2t0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX010ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2U3ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1J0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0Z0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0l0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0R0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX090ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0x0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX050ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX08zID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX04yID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0J0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0h0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2p0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3F0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1V0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3p0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBET01GaWx0ZXJGYWN0b3J5IGV4dGVuZHMgaS5CYXNlRmlsdGVyRmFjdG9yeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBkb2NJZDogX3Q5LFxuICAgICAgICAgICAgb3duZXJEb2N1bWVudDogX2U4ID0gZ2xvYmFsVGhpcy5kb2N1bWVudFxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF96dCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9VdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9xdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9qdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9IdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0J0LCB7XG4gICAgICAgICAgICBnZXQ6IF9nZXRfQnQsXG4gICAgICAgICAgICBzZXQ6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9OMiwge1xuICAgICAgICAgICAgZ2V0OiBfZ2V0X04sXG4gICAgICAgICAgICBzZXQ6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9rdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX010LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZTcsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9SdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0Z0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfSXQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9EdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX090LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfTHQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9OdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX08zLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9lNywgX3Q5KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1J0LCBfZTgpO1xuICAgICAgICB9XG4gICAgICAgIGFkZEZpbHRlcih0KSB7XG4gICAgICAgICAgdmFyIF90aGlzJE81LCBfdGhpcyRPNjtcbiAgICAgICAgICBpZiAoIXQpIHJldHVybiBcIm5vbmVcIjtcbiAgICAgICAgICBsZXQgZSxcbiAgICAgICAgICAgIG4sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgcixcbiAgICAgICAgICAgIHMgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX04yKS5nZXQodCk7XG4gICAgICAgICAgaWYgKHMpIHJldHVybiBzO1xuICAgICAgICAgIGlmICgxID09PSB0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHRbMF0sXG4gICAgICAgICAgICAgIGEgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgMjU2OyB0KyspIGFbdF0gPSBzW3RdIC8gMjU1O1xuICAgICAgICAgICAgciA9IGUgPSBuID0gaSA9IGEuam9pbihcIixcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IFtzLCBhLCBvXSA9IHQsXG4gICAgICAgICAgICAgIGwgPSBuZXcgQXJyYXkoMjU2KSxcbiAgICAgICAgICAgICAgYyA9IG5ldyBBcnJheSgyNTYpLFxuICAgICAgICAgICAgICBoID0gbmV3IEFycmF5KDI1Nik7XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IDI1NjsgdCsrKSB7XG4gICAgICAgICAgICAgIGxbdF0gPSBzW3RdIC8gMjU1O1xuICAgICAgICAgICAgICBjW3RdID0gYVt0XSAvIDI1NTtcbiAgICAgICAgICAgICAgaFt0XSA9IG9bdF0gLyAyNTU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlID0gbC5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgIG4gPSBjLmpvaW4oXCIsXCIpO1xuICAgICAgICAgICAgaSA9IGguam9pbihcIixcIik7XG4gICAgICAgICAgICByID0gXCJcIi5jb25jYXQoZSkuY29uY2F0KG4pLmNvbmNhdChpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcyA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTjIpLmdldChyKTtcbiAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OMikuc2V0KHQsIHMpO1xuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGEgPSBcImdfXCIuY29uY2F0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZTcpLCBcIl90cmFuc2Zlcl9tYXBfXCIpLmNvbmNhdCgoX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9PMywgKF90aGlzJE81ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9PMyksIF90aGlzJE82ID0gX3RoaXMkTzUrKywgX3RoaXMkTzUpKSwgX3RoaXMkTzYpKSxcbiAgICAgICAgICAgIG8gPSBcInVybCgjXCIuY29uY2F0KGEsIFwiKVwiKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX04yKS5zZXQodCwgbyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OMikuc2V0KHIsIG8pO1xuICAgICAgICAgIGNvbnN0IGwgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qdCwgX2p0MikuY2FsbCh0aGlzLCBhKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9VdCwgX1V0MikuY2FsbCh0aGlzLCBlLCBuLCBpLCBsKTtcbiAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgfVxuICAgICAgICBhZGRIQ01GaWx0ZXIodCwgZSkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQ2O1xuICAgICAgICAgIGNvbnN0IG4gPSBcIlwiLmNvbmNhdCh0LCBcIi1cIikuY29uY2F0KGUpO1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0l0KSA9PT0gbikgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfSXQsIG4pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfRHQsIFwibm9uZVwiKTtcbiAgICAgICAgICAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRnQpKSA9PT0gbnVsbCB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQ2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2xhc3NQcml2YXRlRmllbGRHZXQ2LnJlbW92ZSgpO1xuICAgICAgICAgIGlmICghdCB8fCAhZSkgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRHQpO1xuICAgICAgICAgIGNvbnN0IGkgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96dCwgX3p0MikuY2FsbCh0aGlzLCB0KTtcbiAgICAgICAgICB0ID0gci5VdGlsLm1ha2VIZXhDb2xvciguLi5pKTtcbiAgICAgICAgICBjb25zdCBzID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfenQsIF96dDIpLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgZSA9IHIuVXRpbC5tYWtlSGV4Q29sb3IoLi4ucyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9CdCkuc3R5bGUuY29sb3IgPSBcIlwiO1xuICAgICAgICAgIGlmIChcIiMwMDAwMDBcIiA9PT0gdCAmJiBcIiNmZmZmZmZcIiA9PT0gZSB8fCB0ID09PSBlKSByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9EdCk7XG4gICAgICAgICAgY29uc3QgYSA9IG5ldyBBcnJheSgyNTYpO1xuICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDw9IDI1NTsgdCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdCAvIDI1NTtcbiAgICAgICAgICAgIGFbdF0gPSBlIDw9IC4wMzkyOCA/IGUgLyAxMi45MiA6ICgoZSArIC4wNTUpIC8gMS4wNTUpICoqIDIuNDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbyA9IGEuam9pbihcIixcIiksXG4gICAgICAgICAgICBsID0gXCJnX1wiLmNvbmNhdChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2U3KSwgXCJfaGNtX2ZpbHRlclwiKSxcbiAgICAgICAgICAgIGMgPSBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX090LCBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qdCwgX2p0MikuY2FsbCh0aGlzLCBsKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVXQsIF9VdDIpLmNhbGwodGhpcywgbywgbywgbywgYyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfSHQsIF9IdDIpLmNhbGwodGhpcywgYyk7XG4gICAgICAgICAgY29uc3QgZ2V0U3RlcHMgPSAodCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IGlbdF0gLyAyNTUsXG4gICAgICAgICAgICAgIHIgPSBzW3RdIC8gMjU1LFxuICAgICAgICAgICAgICBhID0gbmV3IEFycmF5KGUgKyAxKTtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDw9IGU7IHQrKykgYVt0XSA9IG4gKyB0IC8gZSAqIChyIC0gbik7XG4gICAgICAgICAgICByZXR1cm4gYS5qb2luKFwiLFwiKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1V0LCBfVXQyKS5jYWxsKHRoaXMsIGdldFN0ZXBzKDAsIDUpLCBnZXRTdGVwcygxLCA1KSwgZ2V0U3RlcHMoMiwgNSksIGMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfRHQsIFwidXJsKCNcIi5jb25jYXQobCwgXCIpXCIpKTtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9EdCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSGlnaGxpZ2h0SENNRmlsdGVyKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgICB2YXIgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NztcbiAgICAgICAgICBjb25zdCByID0gXCJcIi5jb25jYXQodCwgXCItXCIpLmNvbmNhdChlLCBcIi1cIikuY29uY2F0KG4sIFwiLVwiKS5jb25jYXQoaSk7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTHQpID09PSByKSByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9MdCwgcik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9OdCwgXCJub25lXCIpO1xuICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQ3ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9PdCkpID09PSBudWxsIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldDcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDcucmVtb3ZlKCk7XG4gICAgICAgICAgaWYgKCF0IHx8ICFlKSByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OdCk7XG4gICAgICAgICAgY29uc3QgW3MsIGFdID0gW3QsIGVdLm1hcChfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96dCwgX3p0MikuYmluZCh0aGlzKSk7XG4gICAgICAgICAgbGV0IG8gPSBNYXRoLnJvdW5kKC4yMTI2ICogc1swXSArIC43MTUyICogc1sxXSArIC4wNzIyICogc1syXSksXG4gICAgICAgICAgICBsID0gTWF0aC5yb3VuZCguMjEyNiAqIGFbMF0gKyAuNzE1MiAqIGFbMV0gKyAuMDcyMiAqIGFbMl0pLFxuICAgICAgICAgICAgW2MsIGhdID0gW24sIGldLm1hcChfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96dCwgX3p0MikuYmluZCh0aGlzKSk7XG4gICAgICAgICAgbCA8IG8gJiYgKFtvLCBsLCBjLCBoXSA9IFtsLCBvLCBoLCBjXSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9CdCkuc3R5bGUuY29sb3IgPSBcIlwiO1xuICAgICAgICAgIGNvbnN0IGdldFN0ZXBzID0gKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IG5ldyBBcnJheSgyNTYpLFxuICAgICAgICAgICAgICAgIHIgPSAobCAtIG8pIC8gbixcbiAgICAgICAgICAgICAgICBzID0gdCAvIDI1NSxcbiAgICAgICAgICAgICAgICBhID0gKGUgLSB0KSAvICgyNTUgKiBuKTtcbiAgICAgICAgICAgICAgbGV0IGMgPSAwO1xuICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8PSBuOyB0KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gTWF0aC5yb3VuZChvICsgdCAqIHIpLFxuICAgICAgICAgICAgICAgICAgbiA9IHMgKyB0ICogYTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gYzsgdCA8PSBlOyB0KyspIGlbdF0gPSBuO1xuICAgICAgICAgICAgICAgIGMgPSBlICsgMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gYzsgdCA8IDI1NjsgdCsrKSBpW3RdID0gaVtjIC0gMV07XG4gICAgICAgICAgICAgIHJldHVybiBpLmpvaW4oXCIsXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGQgPSBcImdfXCIuY29uY2F0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZTcpLCBcIl9oY21faGlnaGxpZ2h0X2ZpbHRlclwiKSxcbiAgICAgICAgICAgIHUgPSBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX090LCBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qdCwgX2p0MikuY2FsbCh0aGlzLCBkKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfSHQsIF9IdDIpLmNhbGwodGhpcywgdSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVXQsIF9VdDIpLmNhbGwodGhpcywgZ2V0U3RlcHMoY1swXSwgaFswXSwgNSksIGdldFN0ZXBzKGNbMV0sIGhbMV0sIDUpLCBnZXRTdGVwcyhjWzJdLCBoWzJdLCA1KSwgdSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9OdCwgXCJ1cmwoI1wiLmNvbmNhdChkLCBcIilcIikpO1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX050KTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgIGlmICghKGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdICYmIGFyZ3VtZW50c1swXSkgfHwgIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRHQpICYmICFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX050KSkge1xuICAgICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTXQpKSB7XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTXQpLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9NdCwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9rdCkpIHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9rdCkuY2xlYXIoKTtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9rdCwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX08zLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9nZXRfTigpIHtcbiAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfa3QpIHx8IF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfa3QsIG5ldyBNYXAoKSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfZ2V0X0J0KCkge1xuICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTXQpKSB7XG4gICAgICAgICAgY29uc3QgdCA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUnQpLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0eWxlOiBlXG4gICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgICAgIGUuY29udGFpbiA9IFwic3RyaWN0XCI7XG4gICAgICAgICAgZS53aWR0aCA9IGUuaGVpZ2h0ID0gMDtcbiAgICAgICAgICBlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICAgIGUudG9wID0gZS5sZWZ0ID0gMDtcbiAgICAgICAgICBlLnpJbmRleCA9IC0xO1xuICAgICAgICAgIGNvbnN0IG4gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1J0KS5jcmVhdGVFbGVtZW50TlMocywgXCJzdmdcIik7XG4gICAgICAgICAgbi5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCAwKTtcbiAgICAgICAgICBuLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCAwKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX010LCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1J0KS5jcmVhdGVFbGVtZW50TlMocywgXCJkZWZzXCIpKTtcbiAgICAgICAgICB0LmFwcGVuZChuKTtcbiAgICAgICAgICBuLmFwcGVuZChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX010KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SdCkuYm9keS5hcHBlbmQodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTXQpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0h0Mih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1J0KS5jcmVhdGVFbGVtZW50TlMocywgXCJmZUNvbG9yTWF0cml4XCIpO1xuICAgICAgICBlLnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJtYXRyaXhcIik7XG4gICAgICAgIGUuc2V0QXR0cmlidXRlKFwidmFsdWVzXCIsIFwiMC4yMTI2IDAuNzE1MiAwLjA3MjIgMCAwIDAuMjEyNiAwLjcxNTIgMC4wNzIyIDAgMCAwLjIxMjYgMC43MTUyIDAuMDcyMiAwIDAgMCAwIDAgMSAwXCIpO1xuICAgICAgICB0LmFwcGVuZChlKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9qdDIodCkge1xuICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SdCkuY3JlYXRlRWxlbWVudE5TKHMsIFwiZmlsdGVyXCIpO1xuICAgICAgICBlLnNldEF0dHJpYnV0ZShcImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVyc1wiLCBcInNSR0JcIik7XG4gICAgICAgIGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgdCk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQnQpLmFwcGVuZChlKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfcXQyKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgaSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUnQpLmNyZWF0ZUVsZW1lbnROUyhzLCBlKTtcbiAgICAgICAgaS5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiZGlzY3JldGVcIik7XG4gICAgICAgIGkuc2V0QXR0cmlidXRlKFwidGFibGVWYWx1ZXNcIiwgbik7XG4gICAgICAgIHQuYXBwZW5kKGkpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX1V0Mih0LCBlLCBuLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1J0KS5jcmVhdGVFbGVtZW50TlMocywgXCJmZUNvbXBvbmVudFRyYW5zZmVyXCIpO1xuICAgICAgICBpLmFwcGVuZChyKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcXQsIF9xdDIpLmNhbGwodGhpcywgciwgXCJmZUZ1bmNSXCIsIHQpO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9xdCwgX3F0MikuY2FsbCh0aGlzLCByLCBcImZlRnVuY0dcIiwgZSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3F0LCBfcXQyKS5jYWxsKHRoaXMsIHIsIFwiZmVGdW5jQlwiLCBuKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF96dDIodCkge1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0J0KS5zdHlsZS5jb2xvciA9IHQ7XG4gICAgICAgIHJldHVybiBnZXRSR0IoZ2V0Q29tcHV0ZWRTdHlsZShfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0J0KSkuZ2V0UHJvcGVydHlWYWx1ZShcImNvbG9yXCIpKTtcbiAgICAgIH1cbiAgICAgIGUuRE9NRmlsdGVyRmFjdG9yeSA9IERPTUZpbHRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBET01DYW52YXNGYWN0b3J5IGV4dGVuZHMgaS5CYXNlQ2FudmFzRmFjdG9yeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBvd25lckRvY3VtZW50OiB0ID0gZ2xvYmFsVGhpcy5kb2N1bWVudFxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSB0O1xuICAgICAgICB9XG4gICAgICAgIF9jcmVhdGVDYW52YXModCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICAgIG4ud2lkdGggPSB0O1xuICAgICAgICAgIG4uaGVpZ2h0ID0gZTtcbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5ET01DYW52YXNGYWN0b3J5ID0gRE9NQ2FudmFzRmFjdG9yeTtcbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSh0KSB7XG4gICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdO1xuICAgICAgICBpZiAoaXNWYWxpZEZldGNoVXJsKHQsIGRvY3VtZW50LmJhc2VVUkkpKSB7XG4gICAgICAgICAgY29uc3QgbiA9IGF3YWl0IGZldGNoKHQpO1xuICAgICAgICAgIGlmICghbi5vaykgdGhyb3cgbmV3IEVycm9yKG4uc3RhdHVzVGV4dCk7XG4gICAgICAgICAgcmV0dXJuIGUgPyBuZXcgVWludDhBcnJheShhd2FpdCBuLmFycmF5QnVmZmVyKCkpIDogKDAsIHIuc3RyaW5nVG9CeXRlcykoYXdhaXQgbi50ZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgobiwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICBzLm9wZW4oXCJHRVRcIiwgdCwgITApO1xuICAgICAgICAgIGUgJiYgKHMucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiKTtcbiAgICAgICAgICBzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzLnJlYWR5U3RhdGUgPT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgICAgICAgICAgaWYgKDIwMCA9PT0gcy5zdGF0dXMgfHwgMCA9PT0gcy5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdDtcbiAgICAgICAgICAgICAgICBlICYmIHMucmVzcG9uc2UgPyB0ID0gbmV3IFVpbnQ4QXJyYXkocy5yZXNwb25zZSkgOiAhZSAmJiBzLnJlc3BvbnNlVGV4dCAmJiAodCA9ICgwLCByLnN0cmluZ1RvQnl0ZXMpKHMucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgICAgIG4odCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGkobmV3IEVycm9yKHMuc3RhdHVzVGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgcy5zZW5kKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNsYXNzIERPTUNNYXBSZWFkZXJGYWN0b3J5IGV4dGVuZHMgaS5CYXNlQ01hcFJlYWRlckZhY3Rvcnkge1xuICAgICAgICBfZmV0Y2hEYXRhKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gZmV0Y2hEYXRhKHQsIHRoaXMuaXNDb21wcmVzc2VkKS50aGVuKHQgPT4gKHtcbiAgICAgICAgICAgIGNNYXBEYXRhOiB0LFxuICAgICAgICAgICAgY29tcHJlc3Npb25UeXBlOiBlXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLkRPTUNNYXBSZWFkZXJGYWN0b3J5ID0gRE9NQ01hcFJlYWRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBleHRlbmRzIGkuQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IHtcbiAgICAgICAgX2ZldGNoRGF0YSh0KSB7XG4gICAgICAgICAgcmV0dXJuIGZldGNoRGF0YSh0LCAhMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuRE9NU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcbiAgICAgIGNsYXNzIERPTVNWR0ZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VTVkdGYWN0b3J5IHtcbiAgICAgICAgX2NyZWF0ZVNWRyh0KSB7XG4gICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzLCB0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5ET01TVkdGYWN0b3J5ID0gRE9NU1ZHRmFjdG9yeTtcbiAgICAgIGNsYXNzIFBhZ2VWaWV3cG9ydCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdmlld0JveDogZSxcbiAgICAgICAgICAgIHNjYWxlOiBuLFxuICAgICAgICAgICAgcm90YXRpb246IGksXG4gICAgICAgICAgICBvZmZzZXRYOiByID0gMCxcbiAgICAgICAgICAgIG9mZnNldFk6IHMgPSAwLFxuICAgICAgICAgICAgZG9udEZsaXA6IGEgPSAhMVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIHRoaXMudmlld0JveCA9IGU7XG4gICAgICAgICAgdGhpcy5zY2FsZSA9IG47XG4gICAgICAgICAgdGhpcy5yb3RhdGlvbiA9IGk7XG4gICAgICAgICAgdGhpcy5vZmZzZXRYID0gcjtcbiAgICAgICAgICB0aGlzLm9mZnNldFkgPSBzO1xuICAgICAgICAgIGNvbnN0IG8gPSAoZVsyXSArIGVbMF0pIC8gMixcbiAgICAgICAgICAgIGwgPSAoZVszXSArIGVbMV0pIC8gMjtcbiAgICAgICAgICBsZXQgYywgaCwgZCwgdSwgcCwgZiwgZywgbTtcbiAgICAgICAgICBpICU9IDM2MDtcbiAgICAgICAgICBpIDwgMCAmJiAoaSArPSAzNjApO1xuICAgICAgICAgIHN3aXRjaCAoaSkge1xuICAgICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICAgIGMgPSAtMTtcbiAgICAgICAgICAgICAgaCA9IDA7XG4gICAgICAgICAgICAgIGQgPSAwO1xuICAgICAgICAgICAgICB1ID0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgICAgaCA9IDE7XG4gICAgICAgICAgICAgIGQgPSAxO1xuICAgICAgICAgICAgICB1ID0gMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgICAgYyA9IDA7XG4gICAgICAgICAgICAgIGggPSAtMTtcbiAgICAgICAgICAgICAgZCA9IC0xO1xuICAgICAgICAgICAgICB1ID0gMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIGMgPSAxO1xuICAgICAgICAgICAgICBoID0gMDtcbiAgICAgICAgICAgICAgZCA9IDA7XG4gICAgICAgICAgICAgIHUgPSAtMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYWdlVmlld3BvcnQ6IEludmFsaWQgcm90YXRpb24sIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA5MCBkZWdyZWVzLlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGEpIHtcbiAgICAgICAgICAgIGQgPSAtZDtcbiAgICAgICAgICAgIHUgPSAtdTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKDAgPT09IGMpIHtcbiAgICAgICAgICAgIHAgPSBNYXRoLmFicyhsIC0gZVsxXSkgKiBuICsgcjtcbiAgICAgICAgICAgIGYgPSBNYXRoLmFicyhvIC0gZVswXSkgKiBuICsgcztcbiAgICAgICAgICAgIGcgPSAoZVszXSAtIGVbMV0pICogbjtcbiAgICAgICAgICAgIG0gPSAoZVsyXSAtIGVbMF0pICogbjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcCA9IE1hdGguYWJzKG8gLSBlWzBdKSAqIG4gKyByO1xuICAgICAgICAgICAgZiA9IE1hdGguYWJzKGwgLSBlWzFdKSAqIG4gKyBzO1xuICAgICAgICAgICAgZyA9IChlWzJdIC0gZVswXSkgKiBuO1xuICAgICAgICAgICAgbSA9IChlWzNdIC0gZVsxXSkgKiBuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IFtjICogbiwgaCAqIG4sIGQgKiBuLCB1ICogbiwgcCAtIGMgKiBuICogbyAtIGQgKiBuICogbCwgZiAtIGggKiBuICogbyAtIHUgKiBuICogbF07XG4gICAgICAgICAgdGhpcy53aWR0aCA9IGc7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgPSBtO1xuICAgICAgICB9XG4gICAgICAgIGdldCByYXdEaW1zKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHZpZXdCb3g6IHRcbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gKDAsIHIuc2hhZG93KSh0aGlzLCBcInJhd0RpbXNcIiwge1xuICAgICAgICAgICAgcGFnZVdpZHRoOiB0WzJdIC0gdFswXSxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IHRbM10gLSB0WzFdLFxuICAgICAgICAgICAgcGFnZVg6IHRbMF0sXG4gICAgICAgICAgICBwYWdlWTogdFsxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNsb25lKCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBzY2FsZTogdCA9IHRoaXMuc2NhbGUsXG4gICAgICAgICAgICByb3RhdGlvbjogZSA9IHRoaXMucm90YXRpb24sXG4gICAgICAgICAgICBvZmZzZXRYOiBuID0gdGhpcy5vZmZzZXRYLFxuICAgICAgICAgICAgb2Zmc2V0WTogaSA9IHRoaXMub2Zmc2V0WSxcbiAgICAgICAgICAgIGRvbnRGbGlwOiByID0gITFcbiAgICAgICAgICB9ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG4gICAgICAgICAgICB2aWV3Qm94OiB0aGlzLnZpZXdCb3guc2xpY2UoKSxcbiAgICAgICAgICAgIHNjYWxlOiB0LFxuICAgICAgICAgICAgcm90YXRpb246IGUsXG4gICAgICAgICAgICBvZmZzZXRYOiBuLFxuICAgICAgICAgICAgb2Zmc2V0WTogaSxcbiAgICAgICAgICAgIGRvbnRGbGlwOiByXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udmVydFRvVmlld3BvcnRQb2ludCh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIHIuVXRpbC5hcHBseVRyYW5zZm9ybShbdCwgZV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgICAgICBjb252ZXJ0VG9WaWV3cG9ydFJlY3RhbmdsZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHIuVXRpbC5hcHBseVRyYW5zZm9ybShbdFswXSwgdFsxXV0sIHRoaXMudHJhbnNmb3JtKSxcbiAgICAgICAgICAgIG4gPSByLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3RbMl0sIHRbM11dLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgICAgcmV0dXJuIFtlWzBdLCBlWzFdLCBuWzBdLCBuWzFdXTtcbiAgICAgICAgfVxuICAgICAgICBjb252ZXJ0VG9QZGZQb2ludCh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIHIuVXRpbC5hcHBseUludmVyc2VUcmFuc2Zvcm0oW3QsIGVdLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuUGFnZVZpZXdwb3J0ID0gUGFnZVZpZXdwb3J0O1xuICAgICAgY2xhc3MgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgci5CYXNlRXhjZXB0aW9uIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiAwO1xuICAgICAgICAgIHN1cGVyKHQsIFwiUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uXCIpO1xuICAgICAgICAgIHRoaXMuZXh0cmFEZWxheSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uID0gUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uO1xuICAgICAgZnVuY3Rpb24gaXNEYXRhU2NoZW1lKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubGVuZ3RoO1xuICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgIGZvciAoOyBuIDwgZSAmJiBcIlwiID09PSB0W25dLnRyaW0oKTspIG4rKztcbiAgICAgICAgcmV0dXJuIFwiZGF0YTpcIiA9PT0gdC5zdWJzdHJpbmcobiwgbiArIDUpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG4gICAgICBlLlN0YXRUaW1lciA9IGNsYXNzIFN0YXRUaW1lciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInN0YXJ0ZWRcIiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwidGltZXNcIiwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHRpbWUodCkge1xuICAgICAgICAgIHQgaW4gdGhpcy5zdGFydGVkICYmICgwLCByLndhcm4pKFwiVGltZXIgaXMgYWxyZWFkeSBydW5uaW5nIGZvciBcIi5jb25jYXQodCkpO1xuICAgICAgICAgIHRoaXMuc3RhcnRlZFt0XSA9IERhdGUubm93KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGltZUVuZCh0KSB7XG4gICAgICAgICAgdCBpbiB0aGlzLnN0YXJ0ZWQgfHwgKDAsIHIud2FybikoXCJUaW1lciBoYXMgbm90IGJlZW4gc3RhcnRlZCBmb3IgXCIuY29uY2F0KHQpKTtcbiAgICAgICAgICB0aGlzLnRpbWVzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogdCxcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0ZWRbdF0sXG4gICAgICAgICAgICBlbmQ6IERhdGUubm93KClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5zdGFydGVkW3RdO1xuICAgICAgICB9XG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgICBsZXQgZSA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgICAgICBuYW1lOiB0XG4gICAgICAgICAgfSBvZiB0aGlzLnRpbWVzKSBlID0gTWF0aC5tYXgodC5sZW5ndGgsIGUpO1xuICAgICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgICAgbmFtZTogbixcbiAgICAgICAgICAgIHN0YXJ0OiBpLFxuICAgICAgICAgICAgZW5kOiByXG4gICAgICAgICAgfSBvZiB0aGlzLnRpbWVzKSB0LnB1c2goXCJcIi5jb25jYXQobi5wYWRFbmQoZSksIFwiIFwiKS5jb25jYXQociAtIGksIFwibXNcXG5cIikpO1xuICAgICAgICAgIHJldHVybiB0LmpvaW4oXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBpc1ZhbGlkRmV0Y2hVcmwodCwgZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHByb3RvY29sOiBuXG4gICAgICAgICAgfSA9IGUgPyBuZXcgVVJMKHQsIGUpIDogbmV3IFVSTCh0KTtcbiAgICAgICAgICByZXR1cm4gXCJodHRwOlwiID09PSBuIHx8IFwiaHR0cHM6XCIgPT09IG47XG4gICAgICAgIH0gY2F0Y2ggKF91bnVzZWQxMCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGE7XG4gICAgICBlLlBERkRhdGVTdHJpbmcgPSBjbGFzcyBQREZEYXRlU3RyaW5nIHtcbiAgICAgICAgc3RhdGljIHRvRGF0ZU9iamVjdCh0KSB7XG4gICAgICAgICAgaWYgKCF0IHx8IFwic3RyaW5nXCIgIT0gdHlwZW9mIHQpIHJldHVybiBudWxsO1xuICAgICAgICAgIGEgfHwgKGEgPSBuZXcgUmVnRXhwKFwiXkQ6KFxcXFxkezR9KShcXFxcZHsyfSk/KFxcXFxkezJ9KT8oXFxcXGR7Mn0pPyhcXFxcZHsyfSk/KFxcXFxkezJ9KT8oW1p8K3wtXSk/KFxcXFxkezJ9KT8nPyhcXFxcZHsyfSk/Jz9cIikpO1xuICAgICAgICAgIGNvbnN0IGUgPSBhLmV4ZWModCk7XG4gICAgICAgICAgaWYgKCFlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQoZVsxXSwgMTApO1xuICAgICAgICAgIGxldCBpID0gcGFyc2VJbnQoZVsyXSwgMTApO1xuICAgICAgICAgIGkgPSBpID49IDEgJiYgaSA8PSAxMiA/IGkgLSAxIDogMDtcbiAgICAgICAgICBsZXQgciA9IHBhcnNlSW50KGVbM10sIDEwKTtcbiAgICAgICAgICByID0gciA+PSAxICYmIHIgPD0gMzEgPyByIDogMTtcbiAgICAgICAgICBsZXQgcyA9IHBhcnNlSW50KGVbNF0sIDEwKTtcbiAgICAgICAgICBzID0gcyA+PSAwICYmIHMgPD0gMjMgPyBzIDogMDtcbiAgICAgICAgICBsZXQgbyA9IHBhcnNlSW50KGVbNV0sIDEwKTtcbiAgICAgICAgICBvID0gbyA+PSAwICYmIG8gPD0gNTkgPyBvIDogMDtcbiAgICAgICAgICBsZXQgbCA9IHBhcnNlSW50KGVbNl0sIDEwKTtcbiAgICAgICAgICBsID0gbCA+PSAwICYmIGwgPD0gNTkgPyBsIDogMDtcbiAgICAgICAgICBjb25zdCBjID0gZVs3XSB8fCBcIlpcIjtcbiAgICAgICAgICBsZXQgaCA9IHBhcnNlSW50KGVbOF0sIDEwKTtcbiAgICAgICAgICBoID0gaCA+PSAwICYmIGggPD0gMjMgPyBoIDogMDtcbiAgICAgICAgICBsZXQgZCA9IHBhcnNlSW50KGVbOV0sIDEwKSB8fCAwO1xuICAgICAgICAgIGQgPSBkID49IDAgJiYgZCA8PSA1OSA/IGQgOiAwO1xuICAgICAgICAgIGlmIChcIi1cIiA9PT0gYykge1xuICAgICAgICAgICAgcyArPSBoO1xuICAgICAgICAgICAgbyArPSBkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXCIrXCIgPT09IGMpIHtcbiAgICAgICAgICAgIHMgLT0gaDtcbiAgICAgICAgICAgIG8gLT0gZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKG4sIGksIHIsIHMsIG8sIGwpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIGdldFJHQih0KSB7XG4gICAgICAgIGlmICh0LnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICAgICAgY29uc3QgZSA9IHBhcnNlSW50KHQuc2xpY2UoMSksIDE2KTtcbiAgICAgICAgICByZXR1cm4gWygxNjcxMTY4MCAmIGUpID4+IDE2LCAoNjUyODAgJiBlKSA+PiA4LCAyNTUgJiBlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodC5zdGFydHNXaXRoKFwicmdiKFwiKSkgcmV0dXJuIHQuc2xpY2UoNCwgLTEpLnNwbGl0KFwiLFwiKS5tYXAodCA9PiBwYXJzZUludCh0KSk7XG4gICAgICAgIGlmICh0LnN0YXJ0c1dpdGgoXCJyZ2JhKFwiKSkgcmV0dXJuIHQuc2xpY2UoNSwgLTEpLnNwbGl0KFwiLFwiKS5tYXAodCA9PiBwYXJzZUludCh0KSkuc2xpY2UoMCwgMyk7XG4gICAgICAgICgwLCByLndhcm4pKFwiTm90IGEgdmFsaWQgY29sb3IgZm9ybWF0OiBcXFwiXCIuY29uY2F0KHQsIFwiXFxcIlwiKSk7XG4gICAgICAgIHJldHVybiBbMCwgMCwgMF07XG4gICAgICB9XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gZS5CYXNlU1ZHRmFjdG9yeSA9IGUuQmFzZUZpbHRlckZhY3RvcnkgPSBlLkJhc2VDYW52YXNGYWN0b3J5ID0gZS5CYXNlQ01hcFJlYWRlckZhY3RvcnkgPSB2b2lkIDA7XG4gICAgICBuKDIpO1xuICAgICAgdmFyIGkgPSBuKDEpO1xuICAgICAgY2xhc3MgQmFzZUZpbHRlckZhY3Rvcnkge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRmlsdGVyRmFjdG9yeSAmJiAoMCwgaS51bnJlYWNoYWJsZSkoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRmlsdGVyRmFjdG9yeS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgYWRkRmlsdGVyKHQpIHtcbiAgICAgICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSENNRmlsdGVyKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSGlnaGxpZ2h0SENNRmlsdGVyKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgZGVzdHJveSgpIHt9XG4gICAgICB9XG4gICAgICBlLkJhc2VGaWx0ZXJGYWN0b3J5ID0gQmFzZUZpbHRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VDYW52YXNGYWN0b3J5ICYmICgwLCBpLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDYW52YXNGYWN0b3J5LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjcmVhdGUodCwgZSkge1xuICAgICAgICAgIGlmICh0IDw9IDAgfHwgZSA8PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNhbnZhcyBzaXplXCIpO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9jcmVhdGVDYW52YXModCwgZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhbnZhczogbixcbiAgICAgICAgICAgIGNvbnRleHQ6IG4uZ2V0Q29udGV4dChcIjJkXCIpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXNldCh0LCBlLCBuKSB7XG4gICAgICAgICAgaWYgKCF0LmNhbnZhcykgdGhyb3cgbmV3IEVycm9yKFwiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWRcIik7XG4gICAgICAgICAgaWYgKGUgPD0gMCB8fCBuIDw9IDApIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2FudmFzIHNpemVcIik7XG4gICAgICAgICAgdC5jYW52YXMud2lkdGggPSBlO1xuICAgICAgICAgIHQuY2FudmFzLmhlaWdodCA9IG47XG4gICAgICAgIH1cbiAgICAgICAgZGVzdHJveSh0KSB7XG4gICAgICAgICAgaWYgKCF0LmNhbnZhcykgdGhyb3cgbmV3IEVycm9yKFwiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWRcIik7XG4gICAgICAgICAgdC5jYW52YXMud2lkdGggPSAwO1xuICAgICAgICAgIHQuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgICAgdC5jYW52YXMgPSBudWxsO1xuICAgICAgICAgIHQuY29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZUNhbnZhcyh0LCBlKSB7XG4gICAgICAgICAgKDAsIGkudW5yZWFjaGFibGUpKFwiQWJzdHJhY3QgbWV0aG9kIGBfY3JlYXRlQ2FudmFzYCBjYWxsZWQuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLkJhc2VDYW52YXNGYWN0b3J5ID0gQmFzZUNhbnZhc0ZhY3Rvcnk7XG4gICAgICBjbGFzcyBCYXNlQ01hcFJlYWRlckZhY3Rvcnkge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGJhc2VVcmw6IGUgPSBudWxsLFxuICAgICAgICAgICAgaXNDb21wcmVzc2VkOiBuID0gITBcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ01hcFJlYWRlckZhY3RvcnkgJiYgKDAsIGkudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUNNYXBSZWFkZXJGYWN0b3J5LlwiKTtcbiAgICAgICAgICB0aGlzLmJhc2VVcmwgPSBlO1xuICAgICAgICAgIHRoaXMuaXNDb21wcmVzc2VkID0gbjtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBmZXRjaCh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIG5hbWU6IGVcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBpZiAoIXRoaXMuYmFzZVVybCkgdGhyb3cgbmV3IEVycm9yKCdUaGUgQ01hcCBcImJhc2VVcmxcIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0IHRoZSBcImNNYXBVcmxcIiBhbmQgXCJjTWFwUGFja2VkXCIgQVBJIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLicpO1xuICAgICAgICAgIGlmICghZSkgdGhyb3cgbmV3IEVycm9yKFwiQ01hcCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5iYXNlVXJsICsgZSArICh0aGlzLmlzQ29tcHJlc3NlZCA/IFwiLmJjbWFwXCIgOiBcIlwiKSxcbiAgICAgICAgICAgIHIgPSB0aGlzLmlzQ29tcHJlc3NlZCA/IGkuQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUlkgOiBpLkNNYXBDb21wcmVzc2lvblR5cGUuTk9ORTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hEYXRhKG4sIHIpLmNhdGNoKHQgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGxvYWQgXCIuY29uY2F0KHRoaXMuaXNDb21wcmVzc2VkID8gXCJiaW5hcnkgXCIgOiBcIlwiLCBcIkNNYXAgYXQ6IFwiKS5jb25jYXQobikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIF9mZXRjaERhdGEodCwgZSkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgX2ZldGNoRGF0YWAgY2FsbGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5CYXNlQ01hcFJlYWRlckZhY3RvcnkgPSBCYXNlQ01hcFJlYWRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGJhc2VVcmw6IGUgPSBudWxsXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ICYmICgwLCBpLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeS5cIik7XG4gICAgICAgICAgdGhpcy5iYXNlVXJsID0gZTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBmZXRjaCh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGZpbGVuYW1lOiBlXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgaWYgKCF0aGlzLmJhc2VVcmwpIHRocm93IG5ldyBFcnJvcignVGhlIHN0YW5kYXJkIGZvbnQgXCJiYXNlVXJsXCIgcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkLCBlbnN1cmUgdGhhdCB0aGUgXCJzdGFuZGFyZEZvbnREYXRhVXJsXCIgQVBJIHBhcmFtZXRlciBpcyBwcm92aWRlZC4nKTtcbiAgICAgICAgICBpZiAoIWUpIHRocm93IG5ldyBFcnJvcihcIkZvbnQgZmlsZW5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuXCIpO1xuICAgICAgICAgIGNvbnN0IG4gPSBcIlwiLmNvbmNhdCh0aGlzLmJhc2VVcmwpLmNvbmNhdChlKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hEYXRhKG4pLmNhdGNoKHQgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGxvYWQgZm9udCBkYXRhIGF0OiBcIi5jb25jYXQobikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIF9mZXRjaERhdGEodCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgX2ZldGNoRGF0YWAgY2FsbGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5CYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG4gICAgICBjbGFzcyBCYXNlU1ZHRmFjdG9yeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VTVkdGYWN0b3J5ICYmICgwLCBpLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VTVkdGYWN0b3J5LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjcmVhdGUodCwgZSkge1xuICAgICAgICAgIGxldCBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdO1xuICAgICAgICAgIGlmICh0IDw9IDAgfHwgZSA8PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNWRyBkaW1lbnNpb25zXCIpO1xuICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLl9jcmVhdGVTVkcoXCJzdmc6c3ZnXCIpO1xuICAgICAgICAgIGkuc2V0QXR0cmlidXRlKFwidmVyc2lvblwiLCBcIjEuMVwiKTtcbiAgICAgICAgICBpZiAoIW4pIHtcbiAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCJcIi5jb25jYXQodCwgXCJweFwiKSk7XG4gICAgICAgICAgICBpLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIlwiLmNvbmNhdChlLCBcInB4XCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaS5zZXRBdHRyaWJ1dGUoXCJwcmVzZXJ2ZUFzcGVjdFJhdGlvXCIsIFwibm9uZVwiKTtcbiAgICAgICAgICBpLnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIiwgXCIwIDAgXCIuY29uY2F0KHQsIFwiIFwiKS5jb25jYXQoZSkpO1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIGNyZWF0ZUVsZW1lbnQodCkge1xuICAgICAgICAgIGlmIChcInN0cmluZ1wiICE9IHR5cGVvZiB0KSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGVcIik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVNWRyh0KTtcbiAgICAgICAgfVxuICAgICAgICBfY3JlYXRlU1ZHKHQpIHtcbiAgICAgICAgICAoMCwgaS51bnJlYWNoYWJsZSkoXCJBYnN0cmFjdCBtZXRob2QgYF9jcmVhdGVTVkdgIGNhbGxlZC5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuQmFzZVNWR0ZhY3RvcnkgPSBCYXNlU1ZHRmFjdG9yeTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5NdXJtdXJIYXNoM182NCA9IHZvaWQgMDtcbiAgICAgIG4oOTMpO1xuICAgICAgbigxMDEpO1xuICAgICAgbigxMDIpO1xuICAgICAgbigxMDUpO1xuICAgICAgbigxMDcpO1xuICAgICAgbigxMDkpO1xuICAgICAgbigxMTMpO1xuICAgICAgbigxMTYpO1xuICAgICAgbigxMjMpO1xuICAgICAgbigyKTtcbiAgICAgIHZhciBpID0gbigxKTtcbiAgICAgIGNvbnN0IHIgPSAzMjg1Mzc3NTIwLFxuICAgICAgICBzID0gNDI5NDkwMTc2MCxcbiAgICAgICAgYSA9IDY1NTM1O1xuICAgICAgZS5NdXJtdXJIYXNoM182NCA9IGNsYXNzIE11cm11ckhhc2gzXzY0IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHRoaXMuaDEgPSB0ID8gNDI5NDk2NzI5NSAmIHQgOiByO1xuICAgICAgICAgIHRoaXMuaDIgPSB0ID8gNDI5NDk2NzI5NSAmIHQgOiByO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZSh0KSB7XG4gICAgICAgICAgbGV0IGUsIG47XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHtcbiAgICAgICAgICAgIGUgPSBuZXcgVWludDhBcnJheSgyICogdC5sZW5ndGgpO1xuICAgICAgICAgICAgbiA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgciA9IHQubGVuZ3RoOyBpIDwgcjsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHIgPSB0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICAgIGlmIChyIDw9IDI1NSkgZVtuKytdID0gcjtlbHNlIHtcbiAgICAgICAgICAgICAgICBlW24rK10gPSByID4+PiA4O1xuICAgICAgICAgICAgICAgIGVbbisrXSA9IDI1NSAmIHI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCEoMCwgaS5pc0FycmF5QnVmZmVyKSh0KSkgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgZGF0YSBmb3JtYXQgaW4gTXVybXVySGFzaDNfNjRfdXBkYXRlLiBJbnB1dCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5LlwiKTtcbiAgICAgICAgICAgIGUgPSB0LnNsaWNlKCk7XG4gICAgICAgICAgICBuID0gZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByID0gbiA+PiAyLFxuICAgICAgICAgICAgbyA9IG4gLSA0ICogcixcbiAgICAgICAgICAgIGwgPSBuZXcgVWludDMyQXJyYXkoZS5idWZmZXIsIDAsIHIpO1xuICAgICAgICAgIGxldCBjID0gMCxcbiAgICAgICAgICAgIGggPSAwLFxuICAgICAgICAgICAgZCA9IHRoaXMuaDEsXG4gICAgICAgICAgICB1ID0gdGhpcy5oMjtcbiAgICAgICAgICBjb25zdCBwID0gMzQzMjkxODM1MyxcbiAgICAgICAgICAgIGYgPSA0NjE4NDU5MDcsXG4gICAgICAgICAgICBnID0gMTE2MDEsXG4gICAgICAgICAgICBtID0gMTM3MTU7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCByOyB0KyspIGlmICgxICYgdCkge1xuICAgICAgICAgICAgYyA9IGxbdF07XG4gICAgICAgICAgICBjID0gYyAqIHAgJiBzIHwgYyAqIGcgJiBhO1xuICAgICAgICAgICAgYyA9IGMgPDwgMTUgfCBjID4+PiAxNztcbiAgICAgICAgICAgIGMgPSBjICogZiAmIHMgfCBjICogbSAmIGE7XG4gICAgICAgICAgICBkIF49IGM7XG4gICAgICAgICAgICBkID0gZCA8PCAxMyB8IGQgPj4+IDE5O1xuICAgICAgICAgICAgZCA9IDUgKiBkICsgMzg2NDI5MjE5NjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaCA9IGxbdF07XG4gICAgICAgICAgICBoID0gaCAqIHAgJiBzIHwgaCAqIGcgJiBhO1xuICAgICAgICAgICAgaCA9IGggPDwgMTUgfCBoID4+PiAxNztcbiAgICAgICAgICAgIGggPSBoICogZiAmIHMgfCBoICogbSAmIGE7XG4gICAgICAgICAgICB1IF49IGg7XG4gICAgICAgICAgICB1ID0gdSA8PCAxMyB8IHUgPj4+IDE5O1xuICAgICAgICAgICAgdSA9IDUgKiB1ICsgMzg2NDI5MjE5NjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYyA9IDA7XG4gICAgICAgICAgc3dpdGNoIChvKSB7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIGMgXj0gZVs0ICogciArIDJdIDw8IDE2O1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBjIF49IGVbNCAqIHIgKyAxXSA8PCA4O1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBjIF49IGVbNCAqIHJdO1xuICAgICAgICAgICAgICBjID0gYyAqIHAgJiBzIHwgYyAqIGcgJiBhO1xuICAgICAgICAgICAgICBjID0gYyA8PCAxNSB8IGMgPj4+IDE3O1xuICAgICAgICAgICAgICBjID0gYyAqIGYgJiBzIHwgYyAqIG0gJiBhO1xuICAgICAgICAgICAgICAxICYgciA/IGQgXj0gYyA6IHUgXj0gYztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5oMSA9IGQ7XG4gICAgICAgICAgdGhpcy5oMiA9IHU7XG4gICAgICAgIH1cbiAgICAgICAgaGV4ZGlnZXN0KCkge1xuICAgICAgICAgIGxldCB0ID0gdGhpcy5oMSxcbiAgICAgICAgICAgIGUgPSB0aGlzLmgyO1xuICAgICAgICAgIHQgXj0gZSA+Pj4gMTtcbiAgICAgICAgICB0ID0gMzk4MTgwNjc5NyAqIHQgJiBzIHwgMzYwNDUgKiB0ICYgYTtcbiAgICAgICAgICBlID0gNDI4MzU0MzUxMSAqIGUgJiBzIHwgKDI5NTAxNjM3OTcgKiAoZSA8PCAxNiB8IHQgPj4+IDE2KSAmIHMpID4+PiAxNjtcbiAgICAgICAgICB0IF49IGUgPj4+IDE7XG4gICAgICAgICAgdCA9IDQ0NDk4NDQwMyAqIHQgJiBzIHwgNjA0OTkgKiB0ICYgYTtcbiAgICAgICAgICBlID0gMzMwMTg4MjM2NiAqIGUgJiBzIHwgKDMxMjA0Mzc4OTMgKiAoZSA8PCAxNiB8IHQgPj4+IDE2KSAmIHMpID4+PiAxNjtcbiAgICAgICAgICB0IF49IGUgPj4+IDE7XG4gICAgICAgICAgcmV0dXJuICh0ID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgXCIwXCIpICsgKGUgPj4+IDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCBcIjBcIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgX1d0O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLkZvbnRMb2FkZXIgPSBlLkZvbnRGYWNlT2JqZWN0ID0gdm9pZCAwO1xuICAgICAgbigxMjUpO1xuICAgICAgbigxMzUpO1xuICAgICAgbigxMzcpO1xuICAgICAgbigxNDApO1xuICAgICAgbigxNDIpO1xuICAgICAgbigxNDQpO1xuICAgICAgbigxNDYpO1xuICAgICAgbig4OSk7XG4gICAgICBuKDE0OCk7XG4gICAgICB2YXIgaSA9IG4oMSk7XG4gICAgICBlLkZvbnRMb2FkZXIgPSAoX1d0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIGNsYXNzIEZvbnRMb2FkZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1d0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgU2V0KClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgb3duZXJEb2N1bWVudDogZSA9IGdsb2JhbFRoaXMuZG9jdW1lbnQsXG4gICAgICAgICAgICBzdHlsZUVsZW1lbnQ6IG4gPSBudWxsXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBlO1xuICAgICAgICAgIHRoaXMubmF0aXZlRm9udEZhY2VzID0gbmV3IFNldCgpO1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdSZXF1ZXN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMubG9hZFRlc3RGb250SWQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGFkZE5hdGl2ZUZvbnRGYWNlKHQpIHtcbiAgICAgICAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5hZGQodCk7XG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuYWRkKHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZU5hdGl2ZUZvbnRGYWNlKHQpIHtcbiAgICAgICAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5kZWxldGUodCk7XG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuZGVsZXRlKHQpO1xuICAgICAgICB9XG4gICAgICAgIGluc2VydFJ1bGUodCkge1xuICAgICAgICAgIGlmICghdGhpcy5zdHlsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXS5hcHBlbmQodGhpcy5zdHlsZUVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5zdHlsZUVsZW1lbnQuc2hlZXQ7XG4gICAgICAgICAgZS5pbnNlcnRSdWxlKHQsIGUuY3NzUnVsZXMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5uYXRpdmVGb250RmFjZXMpIHRoaXMuX2RvY3VtZW50LmZvbnRzLmRlbGV0ZSh0KTtcbiAgICAgICAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5jbGVhcigpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfV3QpLmNsZWFyKCk7XG4gICAgICAgICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgbG9hZFN5c3RlbUZvbnQodCkge1xuICAgICAgICAgIGlmICh0ICYmICFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1d0KS5oYXModC5sb2FkZWROYW1lKSkge1xuICAgICAgICAgICAgKDAsIGkuYXNzZXJ0KSghdGhpcy5kaXNhYmxlRm9udEZhY2UsIFwibG9hZFN5c3RlbUZvbnQgc2hvdWxkbid0IGJlIGNhbGxlZCB3aGVuIGBkaXNhYmxlRm9udEZhY2VgIGlzIHNldC5cIik7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIGxvYWRlZE5hbWU6IGUsXG4gICAgICAgICAgICAgICAgICBzcmM6IG4sXG4gICAgICAgICAgICAgICAgICBzdHlsZTogclxuICAgICAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgICAgIHMgPSBuZXcgRm9udEZhY2UoZSwgbiwgcik7XG4gICAgICAgICAgICAgIHRoaXMuYWRkTmF0aXZlRm9udEZhY2Uocyk7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcy5sb2FkKCk7XG4gICAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9XdCkuYWRkKGUpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChfdW51c2VkMTEpIHtcbiAgICAgICAgICAgICAgICAoMCwgaS53YXJuKShcIkNhbm5vdCBsb2FkIHN5c3RlbSBmb250OiBcIi5jb25jYXQodC5iYXNlRm9udE5hbWUsIFwiLCBpbnN0YWxsaW5nIGl0IGNvdWxkIGhlbHAgdG8gaW1wcm92ZSBQREYgcmVuZGVyaW5nLlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVOYXRpdmVGb250RmFjZShzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlICgwLCBpLnVucmVhY2hhYmxlKShcIk5vdCBpbXBsZW1lbnRlZDogbG9hZFN5c3RlbUZvbnQgd2l0aG91dCB0aGUgRm9udCBMb2FkaW5nIEFQSS5cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGJpbmQodCkge1xuICAgICAgICAgIGlmICh0LmF0dGFjaGVkIHx8IHQubWlzc2luZ0ZpbGUgJiYgIXQuc3lzdGVtRm9udEluZm8pIHJldHVybjtcbiAgICAgICAgICB0LmF0dGFjaGVkID0gITA7XG4gICAgICAgICAgaWYgKHQuc3lzdGVtRm9udEluZm8pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFN5c3RlbUZvbnQodC5zeXN0ZW1Gb250SW5mbyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LmNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCk7XG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICB0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKGUpO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGUubG9hZGVkO1xuICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7XG4gICAgICAgICAgICAgICAgKDAsIGkud2FybikoXCJGYWlsZWQgdG8gbG9hZCBmb250ICdcIi5jb25jYXQoZS5mYW1pbHksIFwiJzogJ1wiKS5jb25jYXQobiwgXCInLlwiKSk7XG4gICAgICAgICAgICAgICAgdC5kaXNhYmxlRm9udEZhY2UgPSAhMDtcbiAgICAgICAgICAgICAgICB0aHJvdyBuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGUgPSB0LmNyZWF0ZUZvbnRGYWNlUnVsZSgpO1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICB0aGlzLmluc2VydFJ1bGUoZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoZSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9xdWV1ZUxvYWRpbmdDYWxsYmFjayhlKTtcbiAgICAgICAgICAgICAgdGhpcy5fcHJlcGFyZUZvbnRMb2FkRXZlbnQodCwgbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF9kb2N1bWVudDtcbiAgICAgICAgICBjb25zdCB0ID0gISEoKF90aGlzJF9kb2N1bWVudCA9IHRoaXMuX2RvY3VtZW50KSAhPT0gbnVsbCAmJiBfdGhpcyRfZG9jdW1lbnQgIT09IHZvaWQgMCAmJiBfdGhpcyRfZG9jdW1lbnQuZm9udHMpO1xuICAgICAgICAgIHJldHVybiAoMCwgaS5zaGFkb3cpKHRoaXMsIFwiaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZFwiLCB0KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgbGV0IHQgPSAhMTtcbiAgICAgICAgICAoaS5pc05vZGVKUyB8fCBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBuYXZpZ2F0b3IgJiYgL01vemlsbGFcXC81LjAuKj9ydjpcXGQrLio/IEdlY2tvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSAmJiAodCA9ICEwKTtcbiAgICAgICAgICByZXR1cm4gKDAsIGkuc2hhZG93KSh0aGlzLCBcImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkXCIsIHQpO1xuICAgICAgICB9XG4gICAgICAgIF9xdWV1ZUxvYWRpbmdDYWxsYmFjayh0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBsb2FkaW5nUmVxdWVzdHM6IGVcbiAgICAgICAgICAgIH0gPSB0aGlzLFxuICAgICAgICAgICAgbiA9IHtcbiAgICAgICAgICAgICAgZG9uZTogITEsXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoKSB7XG4gICAgICAgICAgICAgICAgKDAsIGkuYXNzZXJ0KSghbi5kb25lLCBcImNvbXBsZXRlUmVxdWVzdCgpIGNhbm5vdCBiZSBjYWxsZWQgdHdpY2UuXCIpO1xuICAgICAgICAgICAgICAgIG4uZG9uZSA9ICEwO1xuICAgICAgICAgICAgICAgIGZvciAoOyBlLmxlbmd0aCA+IDAgJiYgZVswXS5kb25lOykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQodC5jYWxsYmFjaywgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjYWxsYmFjazogdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICBlLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IF9sb2FkVGVzdEZvbnQoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IGF0b2IoXCJUMVJVVHdBTEFJQUFBd0F3UTBaR0lESHRaZzRBQUFPWUFBQUFnVVpHVkUxbGt6WndBQUFFSEFBQUFCeEhSRVZHQUJRQUZRQUFCRGdBQUFBZVQxTXZNbFlOWXdrQUFBRWdBQUFBWUdOdFlYQUJEUUxVQUFBQ05BQUFBVUpvWldGay94VkZEUUFBQUx3QUFBQTJhR2hsWVFka0Erb0FBQUQwQUFBQUpHaHRkSGdENkFBQUFBQUVXQUFBQUFadFlYaHdBQUpRQUFBQUFSZ0FBQUFHYm1GdFpWam1kSDRBQUFHQUFBQUFzWEJ2YzNUL2hnQXpBQUFEZUFBQUFDQUFBUUFBQUFFQUFMWlJGc1JmRHp6MUFBc0Q2QUFBQUFET0JPVExBQUFBQU00S0hEd0FBQUFBQStnRElRQUFBQWdBQWdBQUFBQUFBQUFCQUFBRElRQUFBRm9ENkFBQUFBQUQ2QUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBVUFBQUFnQUFBQVFENkFIMEFBVUFBQUtLQXJ3QUFBQ01Bb29DdkFBQUFlQUFNUUVDQUFBQ0FBWUpBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUZCbVJXUUF3QUF1QUM0RElQODRBRm9ESVFBQUFBQUFBUUFBQUFBQUFBQUFBQ0FBSUFBQkFBQUFEZ0N1QUFFQUFBQUFBQUFBQVFBQUFBRUFBQUFBQUFFQUFRQUFBQUVBQUFBQUFBSUFBUUFBQUFFQUFBQUFBQU1BQVFBQUFBRUFBQUFBQUFRQUFRQUFBQUVBQUFBQUFBVUFBUUFBQUFFQUFBQUFBQVlBQVFBQUFBTUFBUVFKQUFBQUFnQUJBQU1BQVFRSkFBRUFBZ0FCQUFNQUFRUUpBQUlBQWdBQkFBTUFBUVFKQUFNQUFnQUJBQU1BQVFRSkFBUUFBZ0FCQUFNQUFRUUpBQVVBQWdBQkFBTUFBUVFKQUFZQUFnQUJXQUJZQUFBQUFBQUFBd0FBQUFNQUFBQWNBQUVBQUFBQUFEd0FBd0FCQUFBQUhBQUVBQ0FBQUFBRUFBUUFBUUFBQUM3Ly93QUFBQzcvLy8vVEFBRUFBQUFBQUFBQkJnQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUFBQUFBQUFEL2d3QXlBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFRRUFBRUJBUUpZQUFFQkFTSDREd0Q0R3dIRUF2Z2NBL2dYQkl3TUFZdUwrbno1dFFYa0Q1ajNDQkxuRVFBQ0FRRUJJVmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWUFBQUJBUUFBRHdBQ0FRRUVFL3QzRG92NmZBSDZmQVQrZlBwOCtud0hEb3NNQ3ZtMUN2bTFEQXo2ZkJRQUFBQUFBQUFCQUFBQUFNbUpiekVBQUFBQXpnVGpGUUFBQUFET0JPUXBBQUVBQUFBQUFBQUFEQUFVQUFRQUFBQUJBQUFBQWdBQkFBQUFBQUFBQUFBRDZBQUFBQUFBQUE9PVwiKTtcbiAgICAgICAgICByZXR1cm4gKDAsIGkuc2hhZG93KSh0aGlzLCBcIl9sb2FkVGVzdEZvbnRcIiwgdCk7XG4gICAgICAgIH1cbiAgICAgICAgX3ByZXBhcmVGb250TG9hZEV2ZW50KHQsIGUpIHtcbiAgICAgICAgICBmdW5jdGlvbiBpbnQzMih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gdC5jaGFyQ29kZUF0KGUpIDw8IDI0IHwgdC5jaGFyQ29kZUF0KGUgKyAxKSA8PCAxNiB8IHQuY2hhckNvZGVBdChlICsgMikgPDwgOCB8IDI1NSAmIHQuY2hhckNvZGVBdChlICsgMyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZ1bmN0aW9uIHNwbGljZVN0cmluZyh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgICByZXR1cm4gdC5zdWJzdHJpbmcoMCwgZSkgKyBpICsgdC5zdWJzdHJpbmcoZSArIG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgbiwgcjtcbiAgICAgICAgICBjb25zdCBzID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgICBzLndpZHRoID0gMTtcbiAgICAgICAgICBzLmhlaWdodCA9IDE7XG4gICAgICAgICAgY29uc3QgYSA9IHMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICAgIGxldCBvID0gMDtcbiAgICAgICAgICBjb25zdCBsID0gXCJsdFwiLmNvbmNhdChEYXRlLm5vdygpKS5jb25jYXQodGhpcy5sb2FkVGVzdEZvbnRJZCsrKTtcbiAgICAgICAgICBsZXQgYyA9IHRoaXMuX2xvYWRUZXN0Rm9udDtcbiAgICAgICAgICBjID0gc3BsaWNlU3RyaW5nKGMsIDk3NiwgbC5sZW5ndGgsIGwpO1xuICAgICAgICAgIGNvbnN0IGggPSAxNDgyMTg0NzkyO1xuICAgICAgICAgIGxldCBkID0gaW50MzIoYywgMTYpO1xuICAgICAgICAgIGZvciAobiA9IDAsIHIgPSBsLmxlbmd0aCAtIDM7IG4gPCByOyBuICs9IDQpIGQgPSBkIC0gaCArIGludDMyKGwsIG4pIHwgMDtcbiAgICAgICAgICBuIDwgbC5sZW5ndGggJiYgKGQgPSBkIC0gaCArIGludDMyKGwgKyBcIlhYWFwiLCBuKSB8IDApO1xuICAgICAgICAgIGMgPSBzcGxpY2VTdHJpbmcoYywgMTYsIDQsICgwLCBpLnN0cmluZzMyKShkKSk7XG4gICAgICAgICAgY29uc3QgdSA9IFwiQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XFxcIlwiLmNvbmNhdChsLCBcIlxcXCI7c3JjOlwiLCBcInVybChkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LFwiLmNvbmNhdChidG9hKGMpLCBcIik7XCIpLCBcIn1cIik7XG4gICAgICAgICAgdGhpcy5pbnNlcnRSdWxlKHUpO1xuICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgIHAuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgcC5zdHlsZS53aWR0aCA9IHAuc3R5bGUuaGVpZ2h0ID0gXCIxMHB4XCI7XG4gICAgICAgICAgcC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgICBwLnN0eWxlLnRvcCA9IHAuc3R5bGUubGVmdCA9IFwiMHB4XCI7XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIFt0LmxvYWRlZE5hbWUsIGxdKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgICB0LnRleHRDb250ZW50ID0gXCJIaVwiO1xuICAgICAgICAgICAgdC5zdHlsZS5mb250RmFtaWx5ID0gZTtcbiAgICAgICAgICAgIHAuYXBwZW5kKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmFwcGVuZChwKTtcbiAgICAgICAgICAhZnVuY3Rpb24gaXNGb250UmVhZHkodCwgZSkge1xuICAgICAgICAgICAgaWYgKCsrbyA+IDMwKSB7XG4gICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiTG9hZCB0ZXN0IGZvbnQgbmV2ZXIgbG9hZGVkLlwiKTtcbiAgICAgICAgICAgICAgZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhLmZvbnQgPSBcIjMwcHggXCIgKyB0O1xuICAgICAgICAgICAgYS5maWxsVGV4dChcIi5cIiwgMCwgMjApO1xuICAgICAgICAgICAgYS5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSkuZGF0YVszXSA+IDAgPyBlKCkgOiBzZXRUaW1lb3V0KGlzRm9udFJlYWR5LmJpbmQobnVsbCwgdCwgZSkpO1xuICAgICAgICAgIH0obCwgKCkgPT4ge1xuICAgICAgICAgICAgcC5yZW1vdmUoKTtcbiAgICAgICAgICAgIGUuY29tcGxldGUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBlLkZvbnRGYWNlT2JqZWN0ID0gY2xhc3MgRm9udEZhY2VPYmplY3Qge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZDogbiA9ICEwLFxuICAgICAgICAgICAgZGlzYWJsZUZvbnRGYWNlOiBpID0gITEsXG4gICAgICAgICAgICBpZ25vcmVFcnJvcnM6IHIgPSAhMSxcbiAgICAgICAgICAgIGluc3BlY3RGb250OiBzID0gbnVsbFxuICAgICAgICAgIH0gPSBlO1xuICAgICAgICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBpbiB0KSB0aGlzW2VdID0gdFtlXTtcbiAgICAgICAgICB0aGlzLmlzRXZhbFN1cHBvcnRlZCA9ICExICE9PSBuO1xuICAgICAgICAgIHRoaXMuZGlzYWJsZUZvbnRGYWNlID0gITAgPT09IGk7XG4gICAgICAgICAgdGhpcy5pZ25vcmVFcnJvcnMgPSAhMCA9PT0gcjtcbiAgICAgICAgICB0aGlzLl9pbnNwZWN0Rm9udCA9IHM7XG4gICAgICAgIH1cbiAgICAgICAgY3JlYXRlTmF0aXZlRm9udEZhY2UoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF9pbnNwZWN0Rm9udDtcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRpc2FibGVGb250RmFjZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgbGV0IHQ7XG4gICAgICAgICAgaWYgKHRoaXMuY3NzRm9udEluZm8pIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB7XG4gICAgICAgICAgICAgIHdlaWdodDogdGhpcy5jc3NGb250SW5mby5mb250V2VpZ2h0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZSAmJiAoZS5zdHlsZSA9IFwib2JsaXF1ZSBcIi5jb25jYXQodGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZSwgXCJkZWdcIikpO1xuICAgICAgICAgICAgdCA9IG5ldyBGb250RmFjZSh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHksIHRoaXMuZGF0YSwgZSk7XG4gICAgICAgICAgfSBlbHNlIHQgPSBuZXcgRm9udEZhY2UodGhpcy5sb2FkZWROYW1lLCB0aGlzLmRhdGEsIHt9KTtcbiAgICAgICAgICAoX3RoaXMkX2luc3BlY3RGb250ID0gdGhpcy5faW5zcGVjdEZvbnQpID09PSBudWxsIHx8IF90aGlzJF9pbnNwZWN0Rm9udCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX2luc3BlY3RGb250LmNhbGwodGhpcywgdGhpcyk7XG4gICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgY3JlYXRlRm9udEZhY2VSdWxlKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfaW5zcGVjdEZvbnQyO1xuICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGlzYWJsZUZvbnRGYWNlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjb25zdCB0ID0gKDAsIGkuYnl0ZXNUb1N0cmluZykodGhpcy5kYXRhKSxcbiAgICAgICAgICAgIGUgPSBcInVybChkYXRhOlwiLmNvbmNhdCh0aGlzLm1pbWV0eXBlLCBcIjtiYXNlNjQsXCIpLmNvbmNhdChidG9hKHQpLCBcIik7XCIpO1xuICAgICAgICAgIGxldCBuO1xuICAgICAgICAgIGlmICh0aGlzLmNzc0ZvbnRJbmZvKSB7XG4gICAgICAgICAgICBsZXQgdCA9IFwiZm9udC13ZWlnaHQ6IFwiLmNvbmNhdCh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRXZWlnaHQsIFwiO1wiKTtcbiAgICAgICAgICAgIHRoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGUgJiYgKHQgKz0gXCJmb250LXN0eWxlOiBvYmxpcXVlIFwiLmNvbmNhdCh0aGlzLmNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlLCBcImRlZztcIikpO1xuICAgICAgICAgICAgbiA9IFwiQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XFxcIlwiLmNvbmNhdCh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHksIFwiXFxcIjtcIikuY29uY2F0KHQsIFwic3JjOlwiKS5jb25jYXQoZSwgXCJ9XCIpO1xuICAgICAgICAgIH0gZWxzZSBuID0gXCJAZm9udC1mYWNlIHtmb250LWZhbWlseTpcXFwiXCIuY29uY2F0KHRoaXMubG9hZGVkTmFtZSwgXCJcXFwiO3NyYzpcIikuY29uY2F0KGUsIFwifVwiKTtcbiAgICAgICAgICAoX3RoaXMkX2luc3BlY3RGb250MiA9IHRoaXMuX2luc3BlY3RGb250KSA9PT0gbnVsbCB8fCBfdGhpcyRfaW5zcGVjdEZvbnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfaW5zcGVjdEZvbnQyLmNhbGwodGhpcywgdGhpcywgZSk7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGF0aEdlbmVyYXRvcih0LCBlKSB7XG4gICAgICAgICAgaWYgKHZvaWQgMCAhPT0gdGhpcy5jb21waWxlZEdseXBoc1tlXSkgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbZV07XG4gICAgICAgICAgbGV0IG47XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG4gPSB0LmdldCh0aGlzLmxvYWRlZE5hbWUgKyBcIl9wYXRoX1wiICsgZSk7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlnbm9yZUVycm9ycykgdGhyb3cgdDtcbiAgICAgICAgICAgICgwLCBpLndhcm4pKFwiZ2V0UGF0aEdlbmVyYXRvciAtIGlnbm9yaW5nIGNoYXJhY3RlcjogXFxcIlwiLmNvbmNhdCh0LCBcIlxcXCIuXCIpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2VdID0gZnVuY3Rpb24gKHQsIGUpIHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5pc0V2YWxTdXBwb3J0ZWQgJiYgaS5GZWF0dXJlVGVzdC5pc0V2YWxTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBuKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG4gPSB2b2lkIDAgIT09IGUuYXJncyA/IGUuYXJncy5qb2luKFwiLFwiKSA6IFwiXCI7XG4gICAgICAgICAgICAgIHQucHVzaChcImMuXCIsIGUuY21kLCBcIihcIiwgbiwgXCIpO1xcblwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2VdID0gbmV3IEZ1bmN0aW9uKFwiY1wiLCBcInNpemVcIiwgdC5qb2luKFwiXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbZV0gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIG4pIHtcbiAgICAgICAgICAgICAgXCJzY2FsZVwiID09PSBpLmNtZCAmJiAoaS5hcmdzID0gW2UsIC1lXSk7XG4gICAgICAgICAgICAgIHRbaS5jbWRdLmFwcGx5KHQsIGkuYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5Ob2RlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBlLk5vZGVGaWx0ZXJGYWN0b3J5ID0gZS5Ob2RlQ2FudmFzRmFjdG9yeSA9IGUuTm9kZUNNYXBSZWFkZXJGYWN0b3J5ID0gdm9pZCAwO1xuICAgICAgbigyKTtcbiAgICAgIG4oOTMpO1xuICAgICAgbigxMDEpO1xuICAgICAgbigxMDIpO1xuICAgICAgbigxMDUpO1xuICAgICAgbigxMDcpO1xuICAgICAgbigxMDkpO1xuICAgICAgbigxMTMpO1xuICAgICAgbigxMTYpO1xuICAgICAgbigxMjMpO1xuICAgICAgdmFyIGkgPSBuKDE2OCksXG4gICAgICAgIHIgPSBuKDEpO1xuICAgICAgIWZ1bmN0aW9uIGNoZWNrRE9NTWF0cml4KCkge1xuICAgICAgICBpZiAoIWdsb2JhbFRoaXMuRE9NTWF0cml4ICYmIHIuaXNOb2RlSlMpIHRyeSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5ET01NYXRyaXggPSBPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdjYW52YXMnXCIpOyBlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7IHRocm93IGU7IH0oKSk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAoMCwgci53YXJuKShcIkNhbm5vdCBwb2x5ZmlsbCBgRE9NTWF0cml4YCwgcmVuZGVyaW5nIG1heSBiZSBicm9rZW46IFxcXCJcIi5jb25jYXQodCwgXCJcXFwiLlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0oKTtcbiAgICAgICFmdW5jdGlvbiBjaGVja1BhdGgyRCgpIHtcbiAgICAgICAgaWYgKCFnbG9iYWxUaGlzLlBhdGgyRCAmJiByLmlzTm9kZUpTKSB0cnkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOiB0XG4gICAgICAgICAgICB9ID0gX193ZWJwYWNrX3JlcXVpcmVfXyhPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdjYW52YXMnXCIpOyBlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7IHRocm93IGU7IH0oKSkpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwb2x5ZmlsbFBhdGgyRDogZVxuICAgICAgICAgICAgfSA9IF9fd2VicGFja19yZXF1aXJlX18oT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAncGF0aDJkLXBvbHlmaWxsJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKTtcbiAgICAgICAgICBnbG9iYWxUaGlzLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IHQ7XG4gICAgICAgICAgZShnbG9iYWxUaGlzKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICgwLCByLndhcm4pKFwiQ2Fubm90IHBvbHlmaWxsIGBQYXRoMkRgLCByZW5kZXJpbmcgbWF5IGJlIGJyb2tlbjogXFxcIlwiLmNvbmNhdCh0LCBcIlxcXCIuXCIpKTtcbiAgICAgICAgfVxuICAgICAgfSgpO1xuICAgICAgY29uc3QgZmV0Y2hEYXRhID0gZnVuY3Rpb24gZmV0Y2hEYXRhKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChlLCBuKSA9PiB7XG4gICAgICAgICAgT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnZnMnXCIpOyBlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7IHRocm93IGU7IH0oKSkodCwgKHQsIGkpID0+IHtcbiAgICAgICAgICAgICF0ICYmIGkgPyBlKG5ldyBVaW50OEFycmF5KGkpKSA6IG4obmV3IEVycm9yKHQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgY2xhc3MgTm9kZUZpbHRlckZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VGaWx0ZXJGYWN0b3J5IHt9XG4gICAgICBlLk5vZGVGaWx0ZXJGYWN0b3J5ID0gTm9kZUZpbHRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBOb2RlQ2FudmFzRmFjdG9yeSBleHRlbmRzIGkuQmFzZUNhbnZhc0ZhY3Rvcnkge1xuICAgICAgICBfY3JlYXRlQ2FudmFzKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnY2FudmFzJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKHQsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLk5vZGVDYW52YXNGYWN0b3J5ID0gTm9kZUNhbnZhc0ZhY3Rvcnk7XG4gICAgICBjbGFzcyBOb2RlQ01hcFJlYWRlckZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG4gICAgICAgIF9mZXRjaERhdGEodCwgZSkge1xuICAgICAgICAgIHJldHVybiBmZXRjaERhdGEodCkudGhlbih0ID0+ICh7XG4gICAgICAgICAgICBjTWFwRGF0YTogdCxcbiAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZTogZVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5Ob2RlQ01hcFJlYWRlckZhY3RvcnkgPSBOb2RlQ01hcFJlYWRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBOb2RlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB7XG4gICAgICAgIF9mZXRjaERhdGEodCkge1xuICAgICAgICAgIHJldHVybiBmZXRjaERhdGEodCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLkNhbnZhc0dyYXBoaWNzID0gdm9pZCAwO1xuICAgICAgbigyKTtcbiAgICAgIG4oOTMpO1xuICAgICAgbigxMDEpO1xuICAgICAgbigxMDIpO1xuICAgICAgbigxMDUpO1xuICAgICAgbigxMDcpO1xuICAgICAgbigxMDkpO1xuICAgICAgbigxMTMpO1xuICAgICAgbigxMTYpO1xuICAgICAgbigxMjMpO1xuICAgICAgbig4OSk7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2NyksXG4gICAgICAgIHMgPSBuKDE3MyksXG4gICAgICAgIGEgPSBuKDE3NCk7XG4gICAgICBjb25zdCBvID0gNDA5NixcbiAgICAgICAgbCA9IDE2O1xuICAgICAgY2xhc3MgQ2FjaGVkQ2FudmFzZXMge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gdDtcbiAgICAgICAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRDYW52YXModCwgZSwgbikge1xuICAgICAgICAgIGxldCBpO1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHRoaXMuY2FjaGVbdF0pIHtcbiAgICAgICAgICAgIGkgPSB0aGlzLmNhY2hlW3RdO1xuICAgICAgICAgICAgdGhpcy5jYW52YXNGYWN0b3J5LnJlc2V0KGksIGUsIG4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZShlLCBuKTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdF0gPSBpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUodCkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW3RdO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFyKCkge1xuICAgICAgICAgIGZvciAoY29uc3QgdCBpbiB0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy5jYWNoZVt0XTtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzRmFjdG9yeS5kZXN0cm95KGUpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FjaGVbdF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHModCwgZSwgbiwgaSwgcywgYSwgbywgbCwgYywgaCkge1xuICAgICAgICBjb25zdCBbZCwgdSwgcCwgZiwgZywgbV0gPSAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0KTtcbiAgICAgICAgaWYgKDAgPT09IHUgJiYgMCA9PT0gcCkge1xuICAgICAgICAgIGNvbnN0IHIgPSBvICogZCArIGcsXG4gICAgICAgICAgICBiID0gTWF0aC5yb3VuZChyKSxcbiAgICAgICAgICAgIHYgPSBsICogZiArIG0sXG4gICAgICAgICAgICB5ID0gTWF0aC5yb3VuZCh2KSxcbiAgICAgICAgICAgIEEgPSAobyArIGMpICogZCArIGcsXG4gICAgICAgICAgICBfID0gTWF0aC5hYnMoTWF0aC5yb3VuZChBKSAtIGIpIHx8IDEsXG4gICAgICAgICAgICBTID0gKGwgKyBoKSAqIGYgKyBtLFxuICAgICAgICAgICAgRSA9IE1hdGguYWJzKE1hdGgucm91bmQoUykgLSB5KSB8fCAxO1xuICAgICAgICAgIHQuc2V0VHJhbnNmb3JtKE1hdGguc2lnbihkKSwgMCwgMCwgTWF0aC5zaWduKGYpLCBiLCB5KTtcbiAgICAgICAgICB0LmRyYXdJbWFnZShlLCBuLCBpLCBzLCBhLCAwLCAwLCBfLCBFKTtcbiAgICAgICAgICB0LnNldFRyYW5zZm9ybShkLCB1LCBwLCBmLCBnLCBtKTtcbiAgICAgICAgICByZXR1cm4gW18sIEVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICgwID09PSBkICYmIDAgPT09IGYpIHtcbiAgICAgICAgICBjb25zdCByID0gbCAqIHAgKyBnLFxuICAgICAgICAgICAgYiA9IE1hdGgucm91bmQociksXG4gICAgICAgICAgICB2ID0gbyAqIHUgKyBtLFxuICAgICAgICAgICAgeSA9IE1hdGgucm91bmQodiksXG4gICAgICAgICAgICBBID0gKGwgKyBoKSAqIHAgKyBnLFxuICAgICAgICAgICAgXyA9IE1hdGguYWJzKE1hdGgucm91bmQoQSkgLSBiKSB8fCAxLFxuICAgICAgICAgICAgUyA9IChvICsgYykgKiB1ICsgbSxcbiAgICAgICAgICAgIEUgPSBNYXRoLmFicyhNYXRoLnJvdW5kKFMpIC0geSkgfHwgMTtcbiAgICAgICAgICB0LnNldFRyYW5zZm9ybSgwLCBNYXRoLnNpZ24odSksIE1hdGguc2lnbihwKSwgMCwgYiwgeSk7XG4gICAgICAgICAgdC5kcmF3SW1hZ2UoZSwgbiwgaSwgcywgYSwgMCwgMCwgRSwgXyk7XG4gICAgICAgICAgdC5zZXRUcmFuc2Zvcm0oZCwgdSwgcCwgZiwgZywgbSk7XG4gICAgICAgICAgcmV0dXJuIFtFLCBfXTtcbiAgICAgICAgfVxuICAgICAgICB0LmRyYXdJbWFnZShlLCBuLCBpLCBzLCBhLCBvLCBsLCBjLCBoKTtcbiAgICAgICAgcmV0dXJuIFtNYXRoLmh5cG90KGQsIHUpICogYywgTWF0aC5oeXBvdChwLCBmKSAqIGhdO1xuICAgICAgfVxuICAgICAgY2xhc3MgQ2FudmFzRXh0cmFTdGF0ZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICB0aGlzLmFscGhhSXNTaGFwZSA9ICExO1xuICAgICAgICAgIHRoaXMuZm9udFNpemUgPSAwO1xuICAgICAgICAgIHRoaXMuZm9udFNpemVTY2FsZSA9IDE7XG4gICAgICAgICAgdGhpcy50ZXh0TWF0cml4ID0gaS5JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMuZm9udE1hdHJpeCA9IGkuRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgdGhpcy5sZWFkaW5nID0gMDtcbiAgICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgICAgdGhpcy5saW5lWCA9IDA7XG4gICAgICAgICAgdGhpcy5saW5lWSA9IDA7XG4gICAgICAgICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7XG4gICAgICAgICAgdGhpcy53b3JkU3BhY2luZyA9IDA7XG4gICAgICAgICAgdGhpcy50ZXh0SFNjYWxlID0gMTtcbiAgICAgICAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gaS5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMO1xuICAgICAgICAgIHRoaXMudGV4dFJpc2UgPSAwO1xuICAgICAgICAgIHRoaXMuZmlsbENvbG9yID0gXCIjMDAwMDAwXCI7XG4gICAgICAgICAgdGhpcy5zdHJva2VDb2xvciA9IFwiIzAwMDAwMFwiO1xuICAgICAgICAgIHRoaXMucGF0dGVybkZpbGwgPSAhMTtcbiAgICAgICAgICB0aGlzLmZpbGxBbHBoYSA9IDE7XG4gICAgICAgICAgdGhpcy5zdHJva2VBbHBoYSA9IDE7XG4gICAgICAgICAgdGhpcy5saW5lV2lkdGggPSAxO1xuICAgICAgICAgIHRoaXMuYWN0aXZlU01hc2sgPSBudWxsO1xuICAgICAgICAgIHRoaXMudHJhbnNmZXJNYXBzID0gXCJub25lXCI7XG4gICAgICAgICAgdGhpcy5zdGFydE5ld1BhdGhBbmRDbGlwQm94KFswLCAwLCB0LCBlXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2xvbmUoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICAgICAgdC5jbGlwQm94ID0gdGhpcy5jbGlwQm94LnNsaWNlKCk7XG4gICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q3VycmVudFBvaW50KHQsIGUpIHtcbiAgICAgICAgICB0aGlzLnggPSB0O1xuICAgICAgICAgIHRoaXMueSA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlUGF0aE1pbk1heCh0LCBlLCBuKSB7XG4gICAgICAgICAgW2UsIG5dID0gaS5VdGlsLmFwcGx5VHJhbnNmb3JtKFtlLCBuXSwgdCk7XG4gICAgICAgICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCBlKTtcbiAgICAgICAgICB0aGlzLm1pblkgPSBNYXRoLm1pbih0aGlzLm1pblksIG4pO1xuICAgICAgICAgIHRoaXMubWF4WCA9IE1hdGgubWF4KHRoaXMubWF4WCwgZSk7XG4gICAgICAgICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCBuKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVSZWN0TWluTWF4KHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gaS5VdGlsLmFwcGx5VHJhbnNmb3JtKGUsIHQpLFxuICAgICAgICAgICAgciA9IGkuVXRpbC5hcHBseVRyYW5zZm9ybShlLnNsaWNlKDIpLCB0KTtcbiAgICAgICAgICB0aGlzLm1pblggPSBNYXRoLm1pbih0aGlzLm1pblgsIG5bMF0sIHJbMF0pO1xuICAgICAgICAgIHRoaXMubWluWSA9IE1hdGgubWluKHRoaXMubWluWSwgblsxXSwgclsxXSk7XG4gICAgICAgICAgdGhpcy5tYXhYID0gTWF0aC5tYXgodGhpcy5tYXhYLCBuWzBdLCByWzBdKTtcbiAgICAgICAgICB0aGlzLm1heFkgPSBNYXRoLm1heCh0aGlzLm1heFksIG5bMV0sIHJbMV0pO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVNjYWxpbmdQYXRoTWluTWF4KHQsIGUpIHtcbiAgICAgICAgICBpLlV0aWwuc2NhbGVNaW5NYXgodCwgZSk7XG4gICAgICAgICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCBlWzBdKTtcbiAgICAgICAgICB0aGlzLm1heFggPSBNYXRoLm1heCh0aGlzLm1heFgsIGVbMV0pO1xuICAgICAgICAgIHRoaXMubWluWSA9IE1hdGgubWluKHRoaXMubWluWSwgZVsyXSk7XG4gICAgICAgICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCBlWzNdKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDdXJ2ZVBhdGhNaW5NYXgodCwgZSwgbiwgciwgcywgYSwgbywgbCwgYywgaCkge1xuICAgICAgICAgIGNvbnN0IGQgPSBpLlV0aWwuYmV6aWVyQm91bmRpbmdCb3goZSwgbiwgciwgcywgYSwgbywgbCwgYyk7XG4gICAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICAgIGhbMF0gPSBNYXRoLm1pbihoWzBdLCBkWzBdLCBkWzJdKTtcbiAgICAgICAgICAgIGhbMV0gPSBNYXRoLm1heChoWzFdLCBkWzBdLCBkWzJdKTtcbiAgICAgICAgICAgIGhbMl0gPSBNYXRoLm1pbihoWzJdLCBkWzFdLCBkWzNdKTtcbiAgICAgICAgICAgIGhbM10gPSBNYXRoLm1heChoWzNdLCBkWzFdLCBkWzNdKTtcbiAgICAgICAgICB9IGVsc2UgdGhpcy51cGRhdGVSZWN0TWluTWF4KHQsIGQpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhdGhCb3VuZGluZ0JveCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogcy5QYXRoVHlwZS5GSUxMLFxuICAgICAgICAgICAgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBuID0gW3RoaXMubWluWCwgdGhpcy5taW5ZLCB0aGlzLm1heFgsIHRoaXMubWF4WV07XG4gICAgICAgICAgaWYgKHQgPT09IHMuUGF0aFR5cGUuU1RST0tFKSB7XG4gICAgICAgICAgICBlIHx8ICgwLCBpLnVucmVhY2hhYmxlKShcIlN0cm9rZSBib3VuZGluZyBib3ggbXVzdCBpbmNsdWRlIHRyYW5zZm9ybS5cIik7XG4gICAgICAgICAgICBjb25zdCB0ID0gaS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGUpLFxuICAgICAgICAgICAgICByID0gdFswXSAqIHRoaXMubGluZVdpZHRoIC8gMixcbiAgICAgICAgICAgICAgcyA9IHRbMV0gKiB0aGlzLmxpbmVXaWR0aCAvIDI7XG4gICAgICAgICAgICBuWzBdIC09IHI7XG4gICAgICAgICAgICBuWzFdIC09IHM7XG4gICAgICAgICAgICBuWzJdICs9IHI7XG4gICAgICAgICAgICBuWzNdICs9IHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUNsaXBGcm9tUGF0aCgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gaS5VdGlsLmludGVyc2VjdCh0aGlzLmNsaXBCb3gsIHRoaXMuZ2V0UGF0aEJvdW5kaW5nQm94KCkpO1xuICAgICAgICAgIHRoaXMuc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0IHx8IFswLCAwLCAwLCAwXSk7XG4gICAgICAgIH1cbiAgICAgICAgaXNFbXB0eUNsaXAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWluWCA9PT0gMSAvIDA7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0KSB7XG4gICAgICAgICAgdGhpcy5jbGlwQm94ID0gdDtcbiAgICAgICAgICB0aGlzLm1pblggPSAxIC8gMDtcbiAgICAgICAgICB0aGlzLm1pblkgPSAxIC8gMDtcbiAgICAgICAgICB0aGlzLm1heFggPSAwO1xuICAgICAgICAgIHRoaXMubWF4WSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogcy5QYXRoVHlwZS5GSUxMLFxuICAgICAgICAgICAgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICByZXR1cm4gaS5VdGlsLmludGVyc2VjdCh0aGlzLmNsaXBCb3gsIHRoaXMuZ2V0UGF0aEJvdW5kaW5nQm94KHQsIGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VEYXRhKHQsIGUpIHtcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIEltYWdlRGF0YSAmJiBlIGluc3RhbmNlb2YgSW1hZ2VEYXRhKSB7XG4gICAgICAgICAgdC5wdXRJbWFnZURhdGEoZSwgMCwgMCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG4gPSBlLmhlaWdodCxcbiAgICAgICAgICByID0gZS53aWR0aCxcbiAgICAgICAgICBzID0gbiAlIGwsXG4gICAgICAgICAgYSA9IChuIC0gcykgLyBsLFxuICAgICAgICAgIG8gPSAwID09PSBzID8gYSA6IGEgKyAxLFxuICAgICAgICAgIGMgPSB0LmNyZWF0ZUltYWdlRGF0YShyLCBsKTtcbiAgICAgICAgbGV0IGgsXG4gICAgICAgICAgZCA9IDA7XG4gICAgICAgIGNvbnN0IHUgPSBlLmRhdGEsXG4gICAgICAgICAgcCA9IGMuZGF0YTtcbiAgICAgICAgbGV0IGYsIGcsIG0sIGI7XG4gICAgICAgIGlmIChlLmtpbmQgPT09IGkuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQKSB7XG4gICAgICAgICAgY29uc3QgZSA9IHUuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgIG4gPSBuZXcgVWludDMyQXJyYXkocC5idWZmZXIsIDAsIHAuYnl0ZUxlbmd0aCA+PiAyKSxcbiAgICAgICAgICAgIGIgPSBuLmxlbmd0aCxcbiAgICAgICAgICAgIHYgPSByICsgNyA+PiAzLFxuICAgICAgICAgICAgeSA9IDQyOTQ5NjcyOTUsXG4gICAgICAgICAgICBBID0gaS5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDQyNzgxOTAwODAgOiAyNTU7XG4gICAgICAgICAgZm9yIChmID0gMDsgZiA8IG87IGYrKykge1xuICAgICAgICAgICAgbSA9IGYgPCBhID8gbCA6IHM7XG4gICAgICAgICAgICBoID0gMDtcbiAgICAgICAgICAgIGZvciAoZyA9IDA7IGcgPCBtOyBnKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IGUgLSBkO1xuICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgIGNvbnN0IHMgPSB0ID4gdiA/IHIgOiA4ICogdCAtIDcsXG4gICAgICAgICAgICAgICAgYSA9IC04ICYgcztcbiAgICAgICAgICAgICAgbGV0IG8gPSAwLFxuICAgICAgICAgICAgICAgIGwgPSAwO1xuICAgICAgICAgICAgICBmb3IgKDsgaSA8IGE7IGkgKz0gOCkge1xuICAgICAgICAgICAgICAgIGwgPSB1W2QrK107XG4gICAgICAgICAgICAgICAgbltoKytdID0gMTI4ICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDY0ICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDMyICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDE2ICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDggJiBsID8geSA6IEE7XG4gICAgICAgICAgICAgICAgbltoKytdID0gNCAmIGwgPyB5IDogQTtcbiAgICAgICAgICAgICAgICBuW2grK10gPSAyICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDEgJiBsID8geSA6IEE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICg7IGkgPCBzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gbykge1xuICAgICAgICAgICAgICAgICAgbCA9IHVbZCsrXTtcbiAgICAgICAgICAgICAgICAgIG8gPSAxMjg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5baCsrXSA9IGwgJiBvID8geSA6IEE7XG4gICAgICAgICAgICAgICAgbyA+Pj0gMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7IGggPCBiOykgbltoKytdID0gMDtcbiAgICAgICAgICAgIHQucHV0SW1hZ2VEYXRhKGMsIDAsIGYgKiBsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZS5raW5kID09PSBpLkltYWdlS2luZC5SR0JBXzMyQlBQKSB7XG4gICAgICAgICAgZyA9IDA7XG4gICAgICAgICAgYiA9IHIgKiBsICogNDtcbiAgICAgICAgICBmb3IgKGYgPSAwOyBmIDwgYTsgZisrKSB7XG4gICAgICAgICAgICBwLnNldCh1LnN1YmFycmF5KGQsIGQgKyBiKSk7XG4gICAgICAgICAgICBkICs9IGI7XG4gICAgICAgICAgICB0LnB1dEltYWdlRGF0YShjLCAwLCBnKTtcbiAgICAgICAgICAgIGcgKz0gbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGYgPCBvKSB7XG4gICAgICAgICAgICBiID0gciAqIHMgKiA0O1xuICAgICAgICAgICAgcC5zZXQodS5zdWJhcnJheShkLCBkICsgYikpO1xuICAgICAgICAgICAgdC5wdXRJbWFnZURhdGEoYywgMCwgZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlLmtpbmQgIT09IGkuSW1hZ2VLaW5kLlJHQl8yNEJQUCkgdGhyb3cgbmV3IEVycm9yKFwiYmFkIGltYWdlIGtpbmQ6IFwiLmNvbmNhdChlLmtpbmQpKTtcbiAgICAgICAgICBtID0gbDtcbiAgICAgICAgICBiID0gciAqIG07XG4gICAgICAgICAgZm9yIChmID0gMDsgZiA8IG87IGYrKykge1xuICAgICAgICAgICAgaWYgKGYgPj0gYSkge1xuICAgICAgICAgICAgICBtID0gcztcbiAgICAgICAgICAgICAgYiA9IHIgKiBtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaCA9IDA7XG4gICAgICAgICAgICBmb3IgKGcgPSBiOyBnLS07KSB7XG4gICAgICAgICAgICAgIHBbaCsrXSA9IHVbZCsrXTtcbiAgICAgICAgICAgICAgcFtoKytdID0gdVtkKytdO1xuICAgICAgICAgICAgICBwW2grK10gPSB1W2QrK107XG4gICAgICAgICAgICAgIHBbaCsrXSA9IDI1NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHQucHV0SW1hZ2VEYXRhKGMsIDAsIGYgKiBsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHB1dEJpbmFyeUltYWdlTWFzayh0LCBlKSB7XG4gICAgICAgIGlmIChlLmJpdG1hcCkge1xuICAgICAgICAgIHQuZHJhd0ltYWdlKGUuYml0bWFwLCAwLCAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbiA9IGUuaGVpZ2h0LFxuICAgICAgICAgIGkgPSBlLndpZHRoLFxuICAgICAgICAgIHIgPSBuICUgbCxcbiAgICAgICAgICBzID0gKG4gLSByKSAvIGwsXG4gICAgICAgICAgbyA9IDAgPT09IHIgPyBzIDogcyArIDEsXG4gICAgICAgICAgYyA9IHQuY3JlYXRlSW1hZ2VEYXRhKGksIGwpO1xuICAgICAgICBsZXQgaCA9IDA7XG4gICAgICAgIGNvbnN0IGQgPSBlLmRhdGEsXG4gICAgICAgICAgdSA9IGMuZGF0YTtcbiAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCBvOyBlKyspIHtcbiAgICAgICAgICBjb25zdCBuID0gZSA8IHMgPyBsIDogcjtcbiAgICAgICAgICAoe1xuICAgICAgICAgICAgc3JjUG9zOiBoXG4gICAgICAgICAgfSA9ICgwLCBhLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKSh7XG4gICAgICAgICAgICBzcmM6IGQsXG4gICAgICAgICAgICBzcmNQb3M6IGgsXG4gICAgICAgICAgICBkZXN0OiB1LFxuICAgICAgICAgICAgd2lkdGg6IGksXG4gICAgICAgICAgICBoZWlnaHQ6IG4sXG4gICAgICAgICAgICBub25CbGFja0NvbG9yOiAwXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHQucHV0SW1hZ2VEYXRhKGMsIDAsIGUgKiBsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gY29weUN0eFN0YXRlKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IFtcInN0cm9rZVN0eWxlXCIsIFwiZmlsbFN0eWxlXCIsIFwiZmlsbFJ1bGVcIiwgXCJnbG9iYWxBbHBoYVwiLCBcImxpbmVXaWR0aFwiLCBcImxpbmVDYXBcIiwgXCJsaW5lSm9pblwiLCBcIm1pdGVyTGltaXRcIiwgXCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb25cIiwgXCJmb250XCIsIFwiZmlsdGVyXCJdO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2Ygbikgdm9pZCAwICE9PSB0W2ldICYmIChlW2ldID0gdFtpXSk7XG4gICAgICAgIGlmICh2b2lkIDAgIT09IHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgICBlLnNldExpbmVEYXNoKHQuZ2V0TGluZURhc2goKSk7XG4gICAgICAgICAgZS5saW5lRGFzaE9mZnNldCA9IHQubGluZURhc2hPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHJlc2V0Q3R4VG9EZWZhdWx0KHQpIHtcbiAgICAgICAgdC5zdHJva2VTdHlsZSA9IHQuZmlsbFN0eWxlID0gXCIjMDAwMDAwXCI7XG4gICAgICAgIHQuZmlsbFJ1bGUgPSBcIm5vbnplcm9cIjtcbiAgICAgICAgdC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgICAgIHQubGluZVdpZHRoID0gMTtcbiAgICAgICAgdC5saW5lQ2FwID0gXCJidXR0XCI7XG4gICAgICAgIHQubGluZUpvaW4gPSBcIm1pdGVyXCI7XG4gICAgICAgIHQubWl0ZXJMaW1pdCA9IDEwO1xuICAgICAgICB0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLW92ZXJcIjtcbiAgICAgICAgdC5mb250ID0gXCIxMHB4IHNhbnMtc2VyaWZcIjtcbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gdC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAgIHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICAgIHQubGluZURhc2hPZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaS5pc05vZGVKUykge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGZpbHRlcjogZVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIFwibm9uZVwiICE9PSBlICYmIFwiXCIgIT09IGUgJiYgKHQuZmlsdGVyID0gXCJub25lXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjb21wb3NlU01hc2tCYWNrZHJvcCh0LCBlLCBuLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSB0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcyA9IDM7IHMgPCByOyBzICs9IDQpIHtcbiAgICAgICAgICBjb25zdCByID0gdFtzXTtcbiAgICAgICAgICBpZiAoMCA9PT0gcikge1xuICAgICAgICAgICAgdFtzIC0gM10gPSBlO1xuICAgICAgICAgICAgdFtzIC0gMl0gPSBuO1xuICAgICAgICAgICAgdFtzIC0gMV0gPSBpO1xuICAgICAgICAgIH0gZWxzZSBpZiAociA8IDI1NSkge1xuICAgICAgICAgICAgY29uc3QgYSA9IDI1NSAtIHI7XG4gICAgICAgICAgICB0W3MgLSAzXSA9IHRbcyAtIDNdICogciArIGUgKiBhID4+IDg7XG4gICAgICAgICAgICB0W3MgLSAyXSA9IHRbcyAtIDJdICogciArIG4gKiBhID4+IDg7XG4gICAgICAgICAgICB0W3MgLSAxXSA9IHRbcyAtIDFdICogciArIGkgKiBhID4+IDg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjb21wb3NlU01hc2tBbHBoYSh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgciA9IDM7IHIgPCBpOyByICs9IDQpIHtcbiAgICAgICAgICBjb25zdCBpID0gbiA/IG5bdFtyXV0gOiB0W3JdO1xuICAgICAgICAgIGVbcl0gPSBlW3JdICogaSAqIC4wMDM5MjE1Njg2Mjc0NTA5OCB8IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNvbXBvc2VTTWFza0x1bWlub3NpdHkodCwgZSwgbikge1xuICAgICAgICBjb25zdCBpID0gdC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IHIgPSAzOyByIDwgaTsgciArPSA0KSB7XG4gICAgICAgICAgY29uc3QgaSA9IDc3ICogdFtyIC0gM10gKyAxNTIgKiB0W3IgLSAyXSArIDI4ICogdFtyIC0gMV07XG4gICAgICAgICAgZVtyXSA9IG4gPyBlW3JdICogbltpID4+IDhdID4+IDggOiBlW3JdICogaSA+PiAxNjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gY29tcG9zZVNNYXNrKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgY29uc3QgciA9IGlbMF0sXG4gICAgICAgICAgcyA9IGlbMV0sXG4gICAgICAgICAgYSA9IGlbMl0gLSByLFxuICAgICAgICAgIG8gPSBpWzNdIC0gcztcbiAgICAgICAgaWYgKDAgIT09IGEgJiYgMCAhPT0gbykge1xuICAgICAgICAgICFmdW5jdGlvbiBnZW5lcmljQ29tcG9zZVNNYXNrKHQsIGUsIG4sIGksIHIsIHMsIGEsIG8sIGwsIGMsIGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSAhIXMsXG4gICAgICAgICAgICAgIHUgPSBkID8gc1swXSA6IDAsXG4gICAgICAgICAgICAgIHAgPSBkID8gc1sxXSA6IDAsXG4gICAgICAgICAgICAgIGYgPSBkID8gc1syXSA6IDAsXG4gICAgICAgICAgICAgIGcgPSBcIkx1bWlub3NpdHlcIiA9PT0gciA/IGNvbXBvc2VTTWFza0x1bWlub3NpdHkgOiBjb21wb3NlU01hc2tBbHBoYSxcbiAgICAgICAgICAgICAgbSA9IE1hdGgubWluKGksIE1hdGguY2VpbCgxMDQ4NTc2IC8gbikpO1xuICAgICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBpOyByICs9IG0pIHtcbiAgICAgICAgICAgICAgY29uc3QgcyA9IE1hdGgubWluKG0sIGkgLSByKSxcbiAgICAgICAgICAgICAgICBiID0gdC5nZXRJbWFnZURhdGEobyAtIGMsIHIgKyAobCAtIGgpLCBuLCBzKSxcbiAgICAgICAgICAgICAgICB2ID0gZS5nZXRJbWFnZURhdGEobywgciArIGwsIG4sIHMpO1xuICAgICAgICAgICAgICBkICYmIGNvbXBvc2VTTWFza0JhY2tkcm9wKGIuZGF0YSwgdSwgcCwgZik7XG4gICAgICAgICAgICAgIGcoYi5kYXRhLCB2LmRhdGEsIGEpO1xuICAgICAgICAgICAgICBlLnB1dEltYWdlRGF0YSh2LCBvLCByICsgbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfShlLmNvbnRleHQsIG4sIGEsIG8sIGUuc3VidHlwZSwgZS5iYWNrZHJvcCwgZS50cmFuc2Zlck1hcCwgciwgcywgZS5vZmZzZXRYLCBlLm9mZnNldFkpO1xuICAgICAgICAgIHQuc2F2ZSgpO1xuICAgICAgICAgIHQuZ2xvYmFsQWxwaGEgPSAxO1xuICAgICAgICAgIHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2Utb3ZlclwiO1xuICAgICAgICAgIHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICAgIHQuZHJhd0ltYWdlKG4uY2FudmFzLCAwLCAwKTtcbiAgICAgICAgICB0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gZ2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0KTtcbiAgICAgICAgblswXSA9IE1hdGguZnJvdW5kKG5bMF0pO1xuICAgICAgICBuWzFdID0gTWF0aC5mcm91bmQoblsxXSk7XG4gICAgICAgIGNvbnN0IHMgPSBNYXRoLmZyb3VuZCgoZ2xvYmFsVGhpcy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpICogci5QaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFMpO1xuICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBlID8gZSA6IG5bMF0gPD0gcyB8fCBuWzFdIDw9IHM7XG4gICAgICB9XG4gICAgICBjb25zdCBjID0gW1wiYnV0dFwiLCBcInJvdW5kXCIsIFwic3F1YXJlXCJdLFxuICAgICAgICBoID0gW1wibWl0ZXJcIiwgXCJyb3VuZFwiLCBcImJldmVsXCJdLFxuICAgICAgICBkID0ge30sXG4gICAgICAgIHUgPSB7fTtcbiAgICAgIHZhciBfR3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfVnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIENhbnZhc0dyYXBoaWNzIHtcbiAgICAgICAgY29uc3RydWN0b3IoX3QxMCwgX2U5LCBuLCBpLCByLCBzLCBhLCBvKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9WdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9HdCk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogbCxcbiAgICAgICAgICAgIG1hcmtlZENvbnRlbnRTdGFjazogYyA9IG51bGxcbiAgICAgICAgICB9ID0gcztcbiAgICAgICAgICB0aGlzLmN0eCA9IF90MTA7XG4gICAgICAgICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUodGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICB0aGlzLnN0YXRlU3RhY2sgPSBbXTtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMTtcbiAgICAgICAgICB0aGlzLnJlcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy54b2JqcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5jb21tb25PYmpzID0gX2U5O1xuICAgICAgICAgIHRoaXMub2JqcyA9IG47XG4gICAgICAgICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gaTtcbiAgICAgICAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSByO1xuICAgICAgICAgIHRoaXMuZ3JvdXBTdGFjayA9IFtdO1xuICAgICAgICAgIHRoaXMucHJvY2Vzc2luZ1R5cGUzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSBudWxsO1xuICAgICAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrID0gW107XG4gICAgICAgICAgdGhpcy5ncm91cExldmVsID0gMDtcbiAgICAgICAgICB0aGlzLnNtYXNrU3RhY2sgPSBbXTtcbiAgICAgICAgICB0aGlzLnNtYXNrQ291bnRlciA9IDA7XG4gICAgICAgICAgdGhpcy50ZW1wU01hc2sgPSBudWxsO1xuICAgICAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gITA7XG4gICAgICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sgPSBjIHx8IFtdO1xuICAgICAgICAgIHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnID0gbDtcbiAgICAgICAgICB0aGlzLmNhY2hlZENhbnZhc2VzID0gbmV3IENhY2hlZENhbnZhc2VzKHRoaXMuY2FudmFzRmFjdG9yeSk7XG4gICAgICAgICAgdGhpcy5jYWNoZWRQYXR0ZXJucyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAgPSBhO1xuICAgICAgICAgIHRoaXMudmlld3BvcnRTY2FsZSA9IDE7XG4gICAgICAgICAgdGhpcy5vdXRwdXRTY2FsZVggPSAxO1xuICAgICAgICAgIHRoaXMub3V0cHV0U2NhbGVZID0gMTtcbiAgICAgICAgICB0aGlzLnBhZ2VDb2xvcnMgPSBvO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmcgPSBbLTEsIDBdO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0T2JqZWN0KHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICByZXR1cm4gXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCA/IHQuc3RhcnRzV2l0aChcImdfXCIpID8gdGhpcy5jb21tb25PYmpzLmdldCh0KSA6IHRoaXMub2Jqcy5nZXQodCkgOiBlO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luRHJhd2luZyh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogZSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiBuLFxuICAgICAgICAgICAgdHJhbnNwYXJlbmN5OiBpID0gITEsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBzID0gbnVsbFxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLmN0eC5jYW52YXMud2lkdGgsXG4gICAgICAgICAgICBvID0gdGhpcy5jdHguY2FudmFzLmhlaWdodCxcbiAgICAgICAgICAgIGwgPSB0aGlzLmN0eC5maWxsU3R5bGU7XG4gICAgICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gcyB8fCBcIiNmZmZmZmZcIjtcbiAgICAgICAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCBhLCBvKTtcbiAgICAgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBsO1xuICAgICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJ0cmFuc3BhcmVudFwiLCBhLCBvKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zaXRlQ3R4ID0gdGhpcy5jdHg7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gdC5jYW52YXM7XG4gICAgICAgICAgICB0aGlzLmN0eCA9IHQuY29udGV4dDtcbiAgICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybSguLi4oMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmNvbXBvc2l0ZUN0eCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oLi4uZSk7XG4gICAgICAgICAgICB0aGlzLm91dHB1dFNjYWxlWCA9IGVbMF07XG4gICAgICAgICAgICB0aGlzLm91dHB1dFNjYWxlWSA9IGVbMF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybSguLi5uLnRyYW5zZm9ybSk7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydFNjYWxlID0gbi5zY2FsZTtcbiAgICAgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgZXhlY3V0ZU9wZXJhdG9yTGlzdCh0LCBlLCBuLCByKSB7XG4gICAgICAgICAgY29uc3QgcyA9IHQuYXJnc0FycmF5LFxuICAgICAgICAgICAgYSA9IHQuZm5BcnJheTtcbiAgICAgICAgICBsZXQgbyA9IGUgfHwgMDtcbiAgICAgICAgICBjb25zdCBsID0gcy5sZW5ndGg7XG4gICAgICAgICAgaWYgKGwgPT09IG8pIHJldHVybiBvO1xuICAgICAgICAgIGNvbnN0IGMgPSBsIC0gbyA+IDEwICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgbixcbiAgICAgICAgICAgIGggPSBjID8gRGF0ZS5ub3coKSArIDE1IDogMDtcbiAgICAgICAgICBsZXQgZCA9IDA7XG4gICAgICAgICAgY29uc3QgdSA9IHRoaXMuY29tbW9uT2JqcyxcbiAgICAgICAgICAgIHAgPSB0aGlzLm9ianM7XG4gICAgICAgICAgbGV0IGY7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gciAmJiBvID09PSByLm5leHRCcmVha1BvaW50KSB7XG4gICAgICAgICAgICAgIHIuYnJlYWtJdChvLCBuKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmID0gYVtvXTtcbiAgICAgICAgICAgIGlmIChmICE9PSBpLk9QUy5kZXBlbmRlbmN5KSB0aGlzW2ZdLmFwcGx5KHRoaXMsIHNbb10pO2Vsc2UgZm9yIChjb25zdCB0IG9mIHNbb10pIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IHQuc3RhcnRzV2l0aChcImdfXCIpID8gdSA6IHA7XG4gICAgICAgICAgICAgIGlmICghZS5oYXModCkpIHtcbiAgICAgICAgICAgICAgICBlLmdldCh0LCBuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbysrO1xuICAgICAgICAgICAgaWYgKG8gPT09IGwpIHJldHVybiBvO1xuICAgICAgICAgICAgaWYgKGMgJiYgKytkID4gMTApIHtcbiAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPiBoKSB7XG4gICAgICAgICAgICAgICAgbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbmREcmF3aW5nKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0d0LCBfR3QyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLmNhY2hlZFBhdHRlcm5zLmNsZWFyKCk7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0LnZhbHVlcygpKSBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCAmJiBlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgJiYgKGUud2lkdGggPSBlLmhlaWdodCA9IDApO1xuICAgICAgICAgICAgdC5jbGVhcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLmNsZWFyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVnQsIF9WdDIpLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgX3NjYWxlSW1hZ2UodCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0LndpZHRoLFxuICAgICAgICAgICAgaSA9IHQuaGVpZ2h0O1xuICAgICAgICAgIGxldCByLFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIGEgPSBNYXRoLm1heChNYXRoLmh5cG90KGVbMF0sIGVbMV0pLCAxKSxcbiAgICAgICAgICAgIG8gPSBNYXRoLm1heChNYXRoLmh5cG90KGVbMl0sIGVbM10pLCAxKSxcbiAgICAgICAgICAgIGwgPSBuLFxuICAgICAgICAgICAgYyA9IGksXG4gICAgICAgICAgICBoID0gXCJwcmVzY2FsZTFcIjtcbiAgICAgICAgICBmb3IgKDsgYSA+IDIgJiYgbCA+IDEgfHwgbyA+IDIgJiYgYyA+IDE7KSB7XG4gICAgICAgICAgICBsZXQgZSA9IGwsXG4gICAgICAgICAgICAgIG4gPSBjO1xuICAgICAgICAgICAgaWYgKGEgPiAyICYmIGwgPiAxKSB7XG4gICAgICAgICAgICAgIGUgPSBsID49IDE2Mzg0ID8gTWF0aC5mbG9vcihsIC8gMikgLSAxIHx8IDEgOiBNYXRoLmNlaWwobCAvIDIpO1xuICAgICAgICAgICAgICBhIC89IGwgLyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG8gPiAyICYmIGMgPiAxKSB7XG4gICAgICAgICAgICAgIG4gPSBjID49IDE2Mzg0ID8gTWF0aC5mbG9vcihjIC8gMikgLSAxIHx8IDEgOiBNYXRoLmNlaWwoYykgLyAyO1xuICAgICAgICAgICAgICBvIC89IGMgLyBuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgciA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKGgsIGUsIG4pO1xuICAgICAgICAgICAgcyA9IHIuY29udGV4dDtcbiAgICAgICAgICAgIHMuY2xlYXJSZWN0KDAsIDAsIGUsIG4pO1xuICAgICAgICAgICAgcy5kcmF3SW1hZ2UodCwgMCwgMCwgbCwgYywgMCwgMCwgZSwgbik7XG4gICAgICAgICAgICB0ID0gci5jYW52YXM7XG4gICAgICAgICAgICBsID0gZTtcbiAgICAgICAgICAgIGMgPSBuO1xuICAgICAgICAgICAgaCA9IFwicHJlc2NhbGUxXCIgPT09IGggPyBcInByZXNjYWxlMlwiIDogXCJwcmVzY2FsZTFcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGltZzogdCxcbiAgICAgICAgICAgIHBhaW50V2lkdGg6IGwsXG4gICAgICAgICAgICBwYWludEhlaWdodDogY1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZU1hc2tDYW52YXModCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd2lkdGg6IG4sXG4gICAgICAgICAgICAgIGhlaWdodDogYVxuICAgICAgICAgICAgfSA9IHQsXG4gICAgICAgICAgICBvID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcixcbiAgICAgICAgICAgIGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGwsXG4gICAgICAgICAgICBjID0gKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkoZSk7XG4gICAgICAgICAgbGV0IGgsIGQsIHUsIHA7XG4gICAgICAgICAgaWYgKCh0LmJpdG1hcCB8fCB0LmRhdGEpICYmIHQuY291bnQgPiAxKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5iaXRtYXAgfHwgdC5kYXRhLmJ1ZmZlcjtcbiAgICAgICAgICAgIGQgPSBKU09OLnN0cmluZ2lmeShsID8gYyA6IFtjLnNsaWNlKDAsIDQpLCBvXSk7XG4gICAgICAgICAgICBoID0gdGhpcy5fY2FjaGVkQml0bWFwc01hcC5nZXQoZSk7XG4gICAgICAgICAgICBpZiAoIWgpIHtcbiAgICAgICAgICAgICAgaCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkQml0bWFwc01hcC5zZXQoZSwgaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuID0gaC5nZXQoZCk7XG4gICAgICAgICAgICBpZiAobiAmJiAhbCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNhbnZhczogbixcbiAgICAgICAgICAgICAgICBvZmZzZXRYOiBNYXRoLnJvdW5kKE1hdGgubWluKGNbMF0sIGNbMl0pICsgY1s0XSksXG4gICAgICAgICAgICAgICAgb2Zmc2V0WTogTWF0aC5yb3VuZChNYXRoLm1pbihjWzFdLCBjWzNdKSArIGNbNV0pXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1ID0gbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF1KSB7XG4gICAgICAgICAgICBwID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJtYXNrQ2FudmFzXCIsIG4sIGEpO1xuICAgICAgICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKHAuY29udGV4dCwgdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBmID0gaS5VdGlsLnRyYW5zZm9ybShjLCBbMSAvIG4sIDAsIDAsIC0xIC8gYSwgMCwgMF0pO1xuICAgICAgICAgIGYgPSBpLlV0aWwudHJhbnNmb3JtKGYsIFsxLCAwLCAwLCAxLCAwLCAtYV0pO1xuICAgICAgICAgIGNvbnN0IGcgPSBpLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIDBdLCBmKSxcbiAgICAgICAgICAgIG0gPSBpLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW24sIGFdLCBmKSxcbiAgICAgICAgICAgIGIgPSBpLlV0aWwubm9ybWFsaXplUmVjdChbZ1swXSwgZ1sxXSwgbVswXSwgbVsxXV0pLFxuICAgICAgICAgICAgdiA9IE1hdGgucm91bmQoYlsyXSAtIGJbMF0pIHx8IDEsXG4gICAgICAgICAgICB5ID0gTWF0aC5yb3VuZChiWzNdIC0gYlsxXSkgfHwgMSxcbiAgICAgICAgICAgIEEgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImZpbGxDYW52YXNcIiwgdiwgeSksXG4gICAgICAgICAgICBfID0gQS5jb250ZXh0LFxuICAgICAgICAgICAgUyA9IE1hdGgubWluKGdbMF0sIG1bMF0pLFxuICAgICAgICAgICAgRSA9IE1hdGgubWluKGdbMV0sIG1bMV0pO1xuICAgICAgICAgIF8udHJhbnNsYXRlKC1TLCAtRSk7XG4gICAgICAgICAgXy50cmFuc2Zvcm0oLi4uZik7XG4gICAgICAgICAgaWYgKCF1KSB7XG4gICAgICAgICAgICB1ID0gdGhpcy5fc2NhbGVJbWFnZShwLmNhbnZhcywgKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKF8pKTtcbiAgICAgICAgICAgIHUgPSB1LmltZztcbiAgICAgICAgICAgIGggJiYgbCAmJiBoLnNldChkLCB1KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXy5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBnZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkoXyksIHQuaW50ZXJwb2xhdGUpO1xuICAgICAgICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhfLCB1LCAwLCAwLCB1LndpZHRoLCB1LmhlaWdodCwgMCwgMCwgbiwgYSk7XG4gICAgICAgICAgXy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1pblwiO1xuICAgICAgICAgIGNvbnN0IHggPSBpLlV0aWwudHJhbnNmb3JtKCgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShfKSwgWzEsIDAsIDAsIDEsIC1TLCAtRV0pO1xuICAgICAgICAgIF8uZmlsbFN0eWxlID0gbCA/IG8uZ2V0UGF0dGVybihlLCB0aGlzLCB4LCBzLlBhdGhUeXBlLkZJTEwpIDogbztcbiAgICAgICAgICBfLmZpbGxSZWN0KDAsIDAsIG4sIGEpO1xuICAgICAgICAgIGlmIChoICYmICFsKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlZENhbnZhc2VzLmRlbGV0ZShcImZpbGxDYW52YXNcIik7XG4gICAgICAgICAgICBoLnNldChkLCBBLmNhbnZhcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW52YXM6IEEuY2FudmFzLFxuICAgICAgICAgICAgb2Zmc2V0WDogTWF0aC5yb3VuZChTKSxcbiAgICAgICAgICAgIG9mZnNldFk6IE1hdGgucm91bmQoRSlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHNldExpbmVXaWR0aCh0KSB7XG4gICAgICAgICAgdCAhPT0gdGhpcy5jdXJyZW50LmxpbmVXaWR0aCAmJiAodGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoID0gdDtcbiAgICAgICAgICB0aGlzLmN0eC5saW5lV2lkdGggPSB0O1xuICAgICAgICB9XG4gICAgICAgIHNldExpbmVDYXAodCkge1xuICAgICAgICAgIHRoaXMuY3R4LmxpbmVDYXAgPSBjW3RdO1xuICAgICAgICB9XG4gICAgICAgIHNldExpbmVKb2luKHQpIHtcbiAgICAgICAgICB0aGlzLmN0eC5saW5lSm9pbiA9IGhbdF07XG4gICAgICAgIH1cbiAgICAgICAgc2V0TWl0ZXJMaW1pdCh0KSB7XG4gICAgICAgICAgdGhpcy5jdHgubWl0ZXJMaW1pdCA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0RGFzaCh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuY3R4O1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IG4uc2V0TGluZURhc2gpIHtcbiAgICAgICAgICAgIG4uc2V0TGluZURhc2godCk7XG4gICAgICAgICAgICBuLmxpbmVEYXNoT2Zmc2V0ID0gZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmVuZGVyaW5nSW50ZW50KHQpIHt9XG4gICAgICAgIHNldEZsYXRuZXNzKHQpIHt9XG4gICAgICAgIHNldEdTdGF0ZSh0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbZSwgbl0gb2YgdCkgc3dpdGNoIChlKSB7XG4gICAgICAgICAgICBjYXNlIFwiTFdcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkxDXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcChuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbihuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiTUxcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KG4pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0RGFzaChuWzBdLCBuWzFdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiUklcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZMXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3Mobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRGb250KG5bMF0sIG5bMV0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJDQVwiOlxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGEgPSBuO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbEFscGhhID0gbjtcbiAgICAgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSBuO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJCTVwiOlxuICAgICAgICAgICAgICB0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBuO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJTTWFza1wiOlxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgPSBuID8gdGhpcy50ZW1wU01hc2sgOiBudWxsO1xuICAgICAgICAgICAgICB0aGlzLnRlbXBTTWFzayA9IG51bGw7XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tTTWFza1N0YXRlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIlRSXCI6XG4gICAgICAgICAgICAgIHRoaXMuY3R4LmZpbHRlciA9IHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPSB0aGlzLmZpbHRlckZhY3RvcnkuYWRkRmlsdGVyKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgaW5TTWFza01vZGUoKSB7XG4gICAgICAgICAgcmV0dXJuICEhdGhpcy5zdXNwZW5kZWRDdHg7XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tTTWFza1N0YXRlKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmluU01hc2tNb2RlO1xuICAgICAgICAgIHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayAmJiAhdCA/IHRoaXMuYmVnaW5TTWFza01vZGUoKSA6ICF0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgJiYgdCAmJiB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luU01hc2tNb2RlKCkge1xuICAgICAgICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB0aHJvdyBuZXcgRXJyb3IoXCJiZWdpblNNYXNrTW9kZSBjYWxsZWQgd2hpbGUgYWxyZWFkeSBpbiBzbWFzayBtb2RlXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmN0eC5jYW52YXMud2lkdGgsXG4gICAgICAgICAgICBlID0gdGhpcy5jdHguY2FudmFzLmhlaWdodCxcbiAgICAgICAgICAgIG4gPSBcInNtYXNrR3JvdXBBdFwiICsgdGhpcy5ncm91cExldmVsLFxuICAgICAgICAgICAgaSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKG4sIHQsIGUpO1xuICAgICAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gdGhpcy5jdHg7XG4gICAgICAgICAgdGhpcy5jdHggPSBpLmNvbnRleHQ7XG4gICAgICAgICAgY29uc3QgcyA9IHRoaXMuY3R4O1xuICAgICAgICAgIHMuc2V0VHJhbnNmb3JtKC4uLigwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuc3VzcGVuZGVkQ3R4KSk7XG4gICAgICAgICAgY29weUN0eFN0YXRlKHRoaXMuc3VzcGVuZGVkQ3R4LCBzKTtcbiAgICAgICAgICAhZnVuY3Rpb24gbWlycm9yQ29udGV4dE9wZXJhdGlvbnModCwgZSkge1xuICAgICAgICAgICAgaWYgKHQuX3JlbW92ZU1pcnJvcmluZykgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBpcyBhbHJlYWR5IGZvcndhcmRpbmcgb3BlcmF0aW9ucy5cIik7XG4gICAgICAgICAgICB0Ll9fb3JpZ2luYWxTYXZlID0gdC5zYXZlO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsUmVzdG9yZSA9IHQucmVzdG9yZTtcbiAgICAgICAgICAgIHQuX19vcmlnaW5hbFJvdGF0ZSA9IHQucm90YXRlO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsU2NhbGUgPSB0LnNjYWxlO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsVHJhbnNsYXRlID0gdC50cmFuc2xhdGU7XG4gICAgICAgICAgICB0Ll9fb3JpZ2luYWxUcmFuc2Zvcm0gPSB0LnRyYW5zZm9ybTtcbiAgICAgICAgICAgIHQuX19vcmlnaW5hbFNldFRyYW5zZm9ybSA9IHQuc2V0VHJhbnNmb3JtO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsUmVzZXRUcmFuc2Zvcm0gPSB0LnJlc2V0VHJhbnNmb3JtO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsQ2xpcCA9IHQuY2xpcDtcbiAgICAgICAgICAgIHQuX19vcmlnaW5hbE1vdmVUbyA9IHQubW92ZVRvO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsTGluZVRvID0gdC5saW5lVG87XG4gICAgICAgICAgICB0Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvID0gdC5iZXppZXJDdXJ2ZVRvO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsUmVjdCA9IHQucmVjdDtcbiAgICAgICAgICAgIHQuX19vcmlnaW5hbENsb3NlUGF0aCA9IHQuY2xvc2VQYXRoO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsQmVnaW5QYXRoID0gdC5iZWdpblBhdGg7XG4gICAgICAgICAgICB0Ll9yZW1vdmVNaXJyb3JpbmcgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIHQuc2F2ZSA9IHQuX19vcmlnaW5hbFNhdmU7XG4gICAgICAgICAgICAgIHQucmVzdG9yZSA9IHQuX19vcmlnaW5hbFJlc3RvcmU7XG4gICAgICAgICAgICAgIHQucm90YXRlID0gdC5fX29yaWdpbmFsUm90YXRlO1xuICAgICAgICAgICAgICB0LnNjYWxlID0gdC5fX29yaWdpbmFsU2NhbGU7XG4gICAgICAgICAgICAgIHQudHJhbnNsYXRlID0gdC5fX29yaWdpbmFsVHJhbnNsYXRlO1xuICAgICAgICAgICAgICB0LnRyYW5zZm9ybSA9IHQuX19vcmlnaW5hbFRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgdC5zZXRUcmFuc2Zvcm0gPSB0Ll9fb3JpZ2luYWxTZXRUcmFuc2Zvcm07XG4gICAgICAgICAgICAgIHQucmVzZXRUcmFuc2Zvcm0gPSB0Ll9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgdC5jbGlwID0gdC5fX29yaWdpbmFsQ2xpcDtcbiAgICAgICAgICAgICAgdC5tb3ZlVG8gPSB0Ll9fb3JpZ2luYWxNb3ZlVG87XG4gICAgICAgICAgICAgIHQubGluZVRvID0gdC5fX29yaWdpbmFsTGluZVRvO1xuICAgICAgICAgICAgICB0LmJlemllckN1cnZlVG8gPSB0Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvO1xuICAgICAgICAgICAgICB0LnJlY3QgPSB0Ll9fb3JpZ2luYWxSZWN0O1xuICAgICAgICAgICAgICB0LmNsb3NlUGF0aCA9IHQuX19vcmlnaW5hbENsb3NlUGF0aDtcbiAgICAgICAgICAgICAgdC5iZWdpblBhdGggPSB0Ll9fb3JpZ2luYWxCZWdpblBhdGg7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0Ll9yZW1vdmVNaXJyb3Jpbmc7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdC5zYXZlID0gZnVuY3Rpb24gY3R4U2F2ZSgpIHtcbiAgICAgICAgICAgICAgZS5zYXZlKCk7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbFNhdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LnJlc3RvcmUgPSBmdW5jdGlvbiBjdHhSZXN0b3JlKCkge1xuICAgICAgICAgICAgICBlLnJlc3RvcmUoKTtcbiAgICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsUmVzdG9yZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQudHJhbnNsYXRlID0gZnVuY3Rpb24gY3R4VHJhbnNsYXRlKHQsIG4pIHtcbiAgICAgICAgICAgICAgZS50cmFuc2xhdGUodCwgbik7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbFRyYW5zbGF0ZSh0LCBuKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LnNjYWxlID0gZnVuY3Rpb24gY3R4U2NhbGUodCwgbikge1xuICAgICAgICAgICAgICBlLnNjYWxlKHQsIG4pO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxTY2FsZSh0LCBuKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIGN0eFRyYW5zZm9ybSh0LCBuLCBpLCByLCBzLCBhKSB7XG4gICAgICAgICAgICAgIGUudHJhbnNmb3JtKHQsIG4sIGksIHIsIHMsIGEpO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxUcmFuc2Zvcm0odCwgbiwgaSwgciwgcywgYSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdC5zZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhTZXRUcmFuc2Zvcm0odCwgbiwgaSwgciwgcywgYSkge1xuICAgICAgICAgICAgICBlLnNldFRyYW5zZm9ybSh0LCBuLCBpLCByLCBzLCBhKTtcbiAgICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsU2V0VHJhbnNmb3JtKHQsIG4sIGksIHIsIHMsIGEpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQucmVzZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhSZXNldFRyYW5zZm9ybSgpIHtcbiAgICAgICAgICAgICAgZS5yZXNldFRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQucm90YXRlID0gZnVuY3Rpb24gY3R4Um90YXRlKHQpIHtcbiAgICAgICAgICAgICAgZS5yb3RhdGUodCk7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbFJvdGF0ZSh0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LmNsaXAgPSBmdW5jdGlvbiBjdHhSb3RhdGUodCkge1xuICAgICAgICAgICAgICBlLmNsaXAodCk7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbENsaXAodCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdC5tb3ZlVG8gPSBmdW5jdGlvbiAodCwgbikge1xuICAgICAgICAgICAgICBlLm1vdmVUbyh0LCBuKTtcbiAgICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsTW92ZVRvKHQsIG4pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQubGluZVRvID0gZnVuY3Rpb24gKHQsIG4pIHtcbiAgICAgICAgICAgICAgZS5saW5lVG8odCwgbik7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbExpbmVUbyh0LCBuKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LmJlemllckN1cnZlVG8gPSBmdW5jdGlvbiAodCwgbiwgaSwgciwgcywgYSkge1xuICAgICAgICAgICAgICBlLmJlemllckN1cnZlVG8odCwgbiwgaSwgciwgcywgYSk7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbEJlemllckN1cnZlVG8odCwgbiwgaSwgciwgcywgYSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdC5yZWN0ID0gZnVuY3Rpb24gKHQsIG4sIGksIHIpIHtcbiAgICAgICAgICAgICAgZS5yZWN0KHQsIG4sIGksIHIpO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxSZWN0KHQsIG4sIGksIHIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQuY2xvc2VQYXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBlLmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxDbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LmJlZ2luUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgZS5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsQmVnaW5QYXRoKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0ocywgdGhpcy5zdXNwZW5kZWRDdHgpO1xuICAgICAgICAgIHRoaXMuc2V0R1N0YXRlKFtbXCJCTVwiLCBcInNvdXJjZS1vdmVyXCJdLCBbXCJjYVwiLCAxXSwgW1wiQ0FcIiwgMV1dKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRTTWFza01vZGUoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmluU01hc2tNb2RlKSB0aHJvdyBuZXcgRXJyb3IoXCJlbmRTTWFza01vZGUgY2FsbGVkIHdoaWxlIG5vdCBpbiBzbWFzayBtb2RlXCIpO1xuICAgICAgICAgIHRoaXMuY3R4Ll9yZW1vdmVNaXJyb3JpbmcoKTtcbiAgICAgICAgICBjb3B5Q3R4U3RhdGUodGhpcy5jdHgsIHRoaXMuc3VzcGVuZGVkQ3R4KTtcbiAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuc3VzcGVuZGVkQ3R4O1xuICAgICAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb21wb3NlKHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudC5hY3RpdmVTTWFzaykgcmV0dXJuO1xuICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICB0WzBdID0gTWF0aC5mbG9vcih0WzBdKTtcbiAgICAgICAgICAgIHRbMV0gPSBNYXRoLmZsb29yKHRbMV0pO1xuICAgICAgICAgICAgdFsyXSA9IE1hdGguY2VpbCh0WzJdKTtcbiAgICAgICAgICAgIHRbM10gPSBNYXRoLmNlaWwodFszXSk7XG4gICAgICAgICAgfSBlbHNlIHQgPSBbMCwgMCwgdGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0XTtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrO1xuICAgICAgICAgIGNvbXBvc2VTTWFzayh0aGlzLnN1c3BlbmRlZEN0eCwgZSwgdGhpcy5jdHgsIHQpO1xuICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICAgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgICAgIHNhdmUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgICAgICAgIGNvcHlDdHhTdGF0ZSh0aGlzLmN0eCwgdGhpcy5zdXNwZW5kZWRDdHgpO1xuICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWRDdHguc2F2ZSgpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICB0aGlzLnN0YXRlU3RhY2sucHVzaCh0KTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0LmNsb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdG9yZSgpIHtcbiAgICAgICAgICAwID09PSB0aGlzLnN0YXRlU3RhY2subGVuZ3RoICYmIHRoaXMuaW5TTWFza01vZGUgJiYgdGhpcy5lbmRTTWFza01vZGUoKTtcbiAgICAgICAgICBpZiAoMCAhPT0gdGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5zdGF0ZVN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWRDdHgucmVzdG9yZSgpO1xuICAgICAgICAgICAgICBjb3B5Q3R4U3RhdGUodGhpcy5zdXNwZW5kZWRDdHgsIHRoaXMuY3R4KTtcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrU01hc2tTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdID0gLTE7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNmb3JtKHQsIGUsIG4sIGksIHIsIHMpIHtcbiAgICAgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0odCwgZSwgbiwgaSwgciwgcyk7XG4gICAgICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0cnVjdFBhdGgodCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIGEgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgbGV0IG8sXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgYyA9IGEueCxcbiAgICAgICAgICAgIGggPSBhLnk7XG4gICAgICAgICAgY29uc3QgZCA9ICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHMpLFxuICAgICAgICAgICAgdSA9IDAgPT09IGRbMF0gJiYgMCA9PT0gZFszXSB8fCAwID09PSBkWzFdICYmIDAgPT09IGRbMl0sXG4gICAgICAgICAgICBwID0gdSA/IG4uc2xpY2UoMCkgOiBudWxsO1xuICAgICAgICAgIGZvciAobGV0IG4gPSAwLCByID0gMCwgZiA9IHQubGVuZ3RoOyBuIDwgZjsgbisrKSBzd2l0Y2ggKDAgfCB0W25dKSB7XG4gICAgICAgICAgICBjYXNlIGkuT1BTLnJlY3RhbmdsZTpcbiAgICAgICAgICAgICAgYyA9IGVbcisrXTtcbiAgICAgICAgICAgICAgaCA9IGVbcisrXTtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IGVbcisrXSxcbiAgICAgICAgICAgICAgICBuID0gZVtyKytdLFxuICAgICAgICAgICAgICAgIGYgPSBjICsgdCxcbiAgICAgICAgICAgICAgICBnID0gaCArIG47XG4gICAgICAgICAgICAgIHMubW92ZVRvKGMsIGgpO1xuICAgICAgICAgICAgICBpZiAoMCA9PT0gdCB8fCAwID09PSBuKSBzLmxpbmVUbyhmLCBnKTtlbHNlIHtcbiAgICAgICAgICAgICAgICBzLmxpbmVUbyhmLCBoKTtcbiAgICAgICAgICAgICAgICBzLmxpbmVUbyhmLCBnKTtcbiAgICAgICAgICAgICAgICBzLmxpbmVUbyhjLCBnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB1IHx8IGEudXBkYXRlUmVjdE1pbk1heChkLCBbYywgaCwgZiwgZ10pO1xuICAgICAgICAgICAgICBzLmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaS5PUFMubW92ZVRvOlxuICAgICAgICAgICAgICBjID0gZVtyKytdO1xuICAgICAgICAgICAgICBoID0gZVtyKytdO1xuICAgICAgICAgICAgICBzLm1vdmVUbyhjLCBoKTtcbiAgICAgICAgICAgICAgdSB8fCBhLnVwZGF0ZVBhdGhNaW5NYXgoZCwgYywgaCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBpLk9QUy5saW5lVG86XG4gICAgICAgICAgICAgIGMgPSBlW3IrK107XG4gICAgICAgICAgICAgIGggPSBlW3IrK107XG4gICAgICAgICAgICAgIHMubGluZVRvKGMsIGgpO1xuICAgICAgICAgICAgICB1IHx8IGEudXBkYXRlUGF0aE1pbk1heChkLCBjLCBoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuT1BTLmN1cnZlVG86XG4gICAgICAgICAgICAgIG8gPSBjO1xuICAgICAgICAgICAgICBsID0gaDtcbiAgICAgICAgICAgICAgYyA9IGVbciArIDRdO1xuICAgICAgICAgICAgICBoID0gZVtyICsgNV07XG4gICAgICAgICAgICAgIHMuYmV6aWVyQ3VydmVUbyhlW3JdLCBlW3IgKyAxXSwgZVtyICsgMl0sIGVbciArIDNdLCBjLCBoKTtcbiAgICAgICAgICAgICAgYS51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoZCwgbywgbCwgZVtyXSwgZVtyICsgMV0sIGVbciArIDJdLCBlW3IgKyAzXSwgYywgaCwgcCk7XG4gICAgICAgICAgICAgIHIgKz0gNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuT1BTLmN1cnZlVG8yOlxuICAgICAgICAgICAgICBvID0gYztcbiAgICAgICAgICAgICAgbCA9IGg7XG4gICAgICAgICAgICAgIHMuYmV6aWVyQ3VydmVUbyhjLCBoLCBlW3JdLCBlW3IgKyAxXSwgZVtyICsgMl0sIGVbciArIDNdKTtcbiAgICAgICAgICAgICAgYS51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoZCwgbywgbCwgYywgaCwgZVtyXSwgZVtyICsgMV0sIGVbciArIDJdLCBlW3IgKyAzXSwgcCk7XG4gICAgICAgICAgICAgIGMgPSBlW3IgKyAyXTtcbiAgICAgICAgICAgICAgaCA9IGVbciArIDNdO1xuICAgICAgICAgICAgICByICs9IDQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBpLk9QUy5jdXJ2ZVRvMzpcbiAgICAgICAgICAgICAgbyA9IGM7XG4gICAgICAgICAgICAgIGwgPSBoO1xuICAgICAgICAgICAgICBjID0gZVtyICsgMl07XG4gICAgICAgICAgICAgIGggPSBlW3IgKyAzXTtcbiAgICAgICAgICAgICAgcy5iZXppZXJDdXJ2ZVRvKGVbcl0sIGVbciArIDFdLCBjLCBoLCBjLCBoKTtcbiAgICAgICAgICAgICAgYS51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoZCwgbywgbCwgZVtyXSwgZVtyICsgMV0sIGMsIGgsIGMsIGgsIHApO1xuICAgICAgICAgICAgICByICs9IDQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBpLk9QUy5jbG9zZVBhdGg6XG4gICAgICAgICAgICAgIHMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHUgJiYgYS51cGRhdGVTY2FsaW5nUGF0aE1pbk1heChkLCBwKTtcbiAgICAgICAgICBhLnNldEN1cnJlbnRQb2ludChjLCBoKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9zZVBhdGgoKSB7XG4gICAgICAgICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3Ryb2tlKCkge1xuICAgICAgICAgIGxldCB0ID0gIShhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSkgfHwgYXJndW1lbnRzWzBdO1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7XG4gICAgICAgICAgZS5nbG9iYWxBbHBoYSA9IHRoaXMuY3VycmVudC5zdHJva2VBbHBoYTtcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkgaWYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIG4gJiYgbiAhPT0gbnVsbCAmJiBuICE9PSB2b2lkIDAgJiYgbi5nZXRQYXR0ZXJuKSB7XG4gICAgICAgICAgICBlLnNhdmUoKTtcbiAgICAgICAgICAgIGUuc3Ryb2tlU3R5bGUgPSBuLmdldFBhdHRlcm4oZSwgdGhpcywgKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGUpLCBzLlBhdGhUeXBlLlNUUk9LRSk7XG4gICAgICAgICAgICB0aGlzLnJlc2NhbGVBbmRTdHJva2UoITEpO1xuICAgICAgICAgICAgZS5yZXN0b3JlKCk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMucmVzY2FsZUFuZFN0cm9rZSghMCk7XG4gICAgICAgICAgdCAmJiB0aGlzLmNvbnN1bWVQYXRoKHRoaXMuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KCkpO1xuICAgICAgICAgIGUuZ2xvYmFsQWxwaGEgPSB0aGlzLmN1cnJlbnQuZmlsbEFscGhhO1xuICAgICAgICB9XG4gICAgICAgIGNsb3NlU3Ryb2tlKCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgdGhpcy5zdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBmaWxsKCkge1xuICAgICAgICAgIGxldCB0ID0gIShhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSkgfHwgYXJndW1lbnRzWzBdO1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuICAgICAgICAgIGxldCBpID0gITE7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCkge1xuICAgICAgICAgICAgZS5zYXZlKCk7XG4gICAgICAgICAgICBlLmZpbGxTdHlsZSA9IG4uZ2V0UGF0dGVybihlLCB0aGlzLCAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoZSksIHMuUGF0aFR5cGUuRklMTCk7XG4gICAgICAgICAgICBpID0gITA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpO1xuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlICYmIG51bGwgIT09IGEpIGlmICh0aGlzLnBlbmRpbmdFT0ZpbGwpIHtcbiAgICAgICAgICAgIGUuZmlsbChcImV2ZW5vZGRcIik7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMTtcbiAgICAgICAgICB9IGVsc2UgZS5maWxsKCk7XG4gICAgICAgICAgaSAmJiBlLnJlc3RvcmUoKTtcbiAgICAgICAgICB0ICYmIHRoaXMuY29uc3VtZVBhdGgoYSk7XG4gICAgICAgIH1cbiAgICAgICAgZW9GaWxsKCkge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9ICEwO1xuICAgICAgICAgIHRoaXMuZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGZpbGxTdHJva2UoKSB7XG4gICAgICAgICAgdGhpcy5maWxsKCExKTtcbiAgICAgICAgICB0aGlzLnN0cm9rZSghMSk7XG4gICAgICAgICAgdGhpcy5jb25zdW1lUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIGVvRmlsbFN0cm9rZSgpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMDtcbiAgICAgICAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9zZUZpbGxTdHJva2UoKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICAgICAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9zZUVPRmlsbFN0cm9rZSgpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMDtcbiAgICAgICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgICAgICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVuZFBhdGgoKSB7XG4gICAgICAgICAgdGhpcy5jb25zdW1lUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIGNsaXAoKSB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IGQ7XG4gICAgICAgIH1cbiAgICAgICAgZW9DbGlwKCkge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSB1O1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luVGV4dCgpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeCA9IGkuSURFTlRJVFlfTUFUUklYO1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZW5kVGV4dCgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5wZW5kaW5nVGV4dFBhdGhzLFxuICAgICAgICAgICAgZSA9IHRoaXMuY3R4O1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHQpIHtcbiAgICAgICAgICAgIGUuc2F2ZSgpO1xuICAgICAgICAgICAgZS5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSB7XG4gICAgICAgICAgICAgIGUuc2V0VHJhbnNmb3JtKC4uLm4udHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgZS50cmFuc2xhdGUobi54LCBuLnkpO1xuICAgICAgICAgICAgICBuLmFkZFRvUGF0aChlLCBuLmZvbnRTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGUucmVzdG9yZSgpO1xuICAgICAgICAgICAgZS5jbGlwKCk7XG4gICAgICAgICAgICBlLmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1RleHRQYXRocztcbiAgICAgICAgICB9IGVsc2UgZS5iZWdpblBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRDaGFyU3BhY2luZyh0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nID0gdDtcbiAgICAgICAgfVxuICAgICAgICBzZXRXb3JkU3BhY2luZyh0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LndvcmRTcGFjaW5nID0gdDtcbiAgICAgICAgfVxuICAgICAgICBzZXRIU2NhbGUodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0SFNjYWxlID0gdCAvIDEwMDtcbiAgICAgICAgfVxuICAgICAgICBzZXRMZWFkaW5nKHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQubGVhZGluZyA9IC10O1xuICAgICAgICB9XG4gICAgICAgIHNldEZvbnQodCwgZSkge1xuICAgICAgICAgIHZhciBfbiRzeXN0ZW1Gb250SW5mbztcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jb21tb25PYmpzLmdldCh0KSxcbiAgICAgICAgICAgIHIgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgaWYgKCFuKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBmaW5kIGZvbnQgZm9yIFwiLmNvbmNhdCh0KSk7XG4gICAgICAgICAgci5mb250TWF0cml4ID0gbi5mb250TWF0cml4IHx8IGkuRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgMCAhPT0gci5mb250TWF0cml4WzBdICYmIDAgIT09IHIuZm9udE1hdHJpeFszXSB8fCAoMCwgaS53YXJuKShcIkludmFsaWQgZm9udCBtYXRyaXggZm9yIGZvbnQgXCIgKyB0KTtcbiAgICAgICAgICBpZiAoZSA8IDApIHtcbiAgICAgICAgICAgIGUgPSAtZTtcbiAgICAgICAgICAgIHIuZm9udERpcmVjdGlvbiA9IC0xO1xuICAgICAgICAgIH0gZWxzZSByLmZvbnREaXJlY3Rpb24gPSAxO1xuICAgICAgICAgIHRoaXMuY3VycmVudC5mb250ID0gbjtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZm9udFNpemUgPSBlO1xuICAgICAgICAgIGlmIChuLmlzVHlwZTNGb250KSByZXR1cm47XG4gICAgICAgICAgY29uc3QgcyA9IG4ubG9hZGVkTmFtZSB8fCBcInNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgIGEgPSAoKF9uJHN5c3RlbUZvbnRJbmZvID0gbi5zeXN0ZW1Gb250SW5mbykgPT09IG51bGwgfHwgX24kc3lzdGVtRm9udEluZm8gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uJHN5c3RlbUZvbnRJbmZvLmNzcykgfHwgXCJcXFwiXCIuY29uY2F0KHMsIFwiXFxcIiwgXCIpLmNvbmNhdChuLmZhbGxiYWNrTmFtZSk7XG4gICAgICAgICAgbGV0IG8gPSBcIm5vcm1hbFwiO1xuICAgICAgICAgIG4uYmxhY2sgPyBvID0gXCI5MDBcIiA6IG4uYm9sZCAmJiAobyA9IFwiYm9sZFwiKTtcbiAgICAgICAgICBjb25zdCBsID0gbi5pdGFsaWMgPyBcIml0YWxpY1wiIDogXCJub3JtYWxcIjtcbiAgICAgICAgICBsZXQgYyA9IGU7XG4gICAgICAgICAgZSA8IDE2ID8gYyA9IDE2IDogZSA+IDEwMCAmJiAoYyA9IDEwMCk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmZvbnRTaXplU2NhbGUgPSBlIC8gYztcbiAgICAgICAgICB0aGlzLmN0eC5mb250ID0gXCJcIi5jb25jYXQobCwgXCIgXCIpLmNvbmNhdChvLCBcIiBcIikuY29uY2F0KGMsIFwicHggXCIpLmNvbmNhdChhKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUZXh0UmVuZGVyaW5nTW9kZSh0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID0gdDtcbiAgICAgICAgfVxuICAgICAgICBzZXRUZXh0UmlzZSh0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnRleHRSaXNlID0gdDtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlVGV4dCh0LCBlKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggKz0gdDtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSArPSBlO1xuICAgICAgICB9XG4gICAgICAgIHNldExlYWRpbmdNb3ZlVGV4dCh0LCBlKSB7XG4gICAgICAgICAgdGhpcy5zZXRMZWFkaW5nKC1lKTtcbiAgICAgICAgICB0aGlzLm1vdmVUZXh0KHQsIGUpO1xuICAgICAgICB9XG4gICAgICAgIHNldFRleHRNYXRyaXgodCwgZSwgbiwgaSwgciwgcykge1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4ID0gW3QsIGUsIG4sIGksIHIsIHNdO1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLmh5cG90KHQsIGUpO1xuICAgICAgICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dExpbmUoKSB7XG4gICAgICAgICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcGFpbnRDaGFyKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgICBjb25zdCBhID0gdGhpcy5jdHgsXG4gICAgICAgICAgICBvID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgbCA9IG8uZm9udCxcbiAgICAgICAgICAgIGMgPSBvLnRleHRSZW5kZXJpbmdNb2RlLFxuICAgICAgICAgICAgaCA9IG8uZm9udFNpemUgLyBvLmZvbnRTaXplU2NhbGUsXG4gICAgICAgICAgICBkID0gYyAmIGkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSyxcbiAgICAgICAgICAgIHUgPSAhIShjICYgaS5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKSxcbiAgICAgICAgICAgIHAgPSBvLnBhdHRlcm5GaWxsICYmICFsLm1pc3NpbmdGaWxlO1xuICAgICAgICAgIGxldCBmO1xuICAgICAgICAgIChsLmRpc2FibGVGb250RmFjZSB8fCB1IHx8IHApICYmIChmID0gbC5nZXRQYXRoR2VuZXJhdG9yKHRoaXMuY29tbW9uT2JqcywgdCkpO1xuICAgICAgICAgIGlmIChsLmRpc2FibGVGb250RmFjZSB8fCBwKSB7XG4gICAgICAgICAgICBhLnNhdmUoKTtcbiAgICAgICAgICAgIGEudHJhbnNsYXRlKGUsIG4pO1xuICAgICAgICAgICAgYS5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGYoYSwgaCk7XG4gICAgICAgICAgICBzICYmIGEuc2V0VHJhbnNmb3JtKC4uLnMpO1xuICAgICAgICAgICAgZCAhPT0gaS5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMICYmIGQgIT09IGkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UgfHwgYS5maWxsKCk7XG4gICAgICAgICAgICBkICE9PSBpLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSAmJiBkICE9PSBpLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFIHx8IGEuc3Ryb2tlKCk7XG4gICAgICAgICAgICBhLnJlc3RvcmUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZCAhPT0gaS5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMICYmIGQgIT09IGkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UgfHwgYS5maWxsVGV4dCh0LCBlLCBuKTtcbiAgICAgICAgICAgIGQgIT09IGkuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFICYmIGQgIT09IGkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UgfHwgYS5zdHJva2VUZXh0KHQsIGUsIG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodSkge1xuICAgICAgICAgICAgKHRoaXMucGVuZGluZ1RleHRQYXRocyB8fCAodGhpcy5wZW5kaW5nVGV4dFBhdGhzID0gW10pKS5wdXNoKHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKShhKSxcbiAgICAgICAgICAgICAgeDogZSxcbiAgICAgICAgICAgICAgeTogbixcbiAgICAgICAgICAgICAgZm9udFNpemU6IGgsXG4gICAgICAgICAgICAgIGFkZFRvUGF0aDogZlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCgpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb250ZXh0OiB0XG4gICAgICAgICAgfSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaXNGb250U3VicGl4ZWxBQUVuYWJsZWRcIiwgMTAsIDEwKTtcbiAgICAgICAgICB0LnNjYWxlKDEuNSwgMSk7XG4gICAgICAgICAgdC5maWxsVGV4dChcIklcIiwgMCwgMTApO1xuICAgICAgICAgIGNvbnN0IGUgPSB0LmdldEltYWdlRGF0YSgwLCAwLCAxMCwgMTApLmRhdGE7XG4gICAgICAgICAgbGV0IG4gPSAhMTtcbiAgICAgICAgICBmb3IgKGxldCB0ID0gMzsgdCA8IGUubGVuZ3RoOyB0ICs9IDQpIGlmIChlW3RdID4gMCAmJiBlW3RdIDwgMjU1KSB7XG4gICAgICAgICAgICBuID0gITA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICgwLCBpLnNoYWRvdykodGhpcywgXCJpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZFwiLCBuKTtcbiAgICAgICAgfVxuICAgICAgICBzaG93VGV4dCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuY3VycmVudCxcbiAgICAgICAgICAgIG4gPSBlLmZvbnQ7XG4gICAgICAgICAgaWYgKG4uaXNUeXBlM0ZvbnQpIHJldHVybiB0aGlzLnNob3dUeXBlM1RleHQodCk7XG4gICAgICAgICAgY29uc3QgYSA9IGUuZm9udFNpemU7XG4gICAgICAgICAgaWYgKDAgPT09IGEpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBvID0gdGhpcy5jdHgsXG4gICAgICAgICAgICBsID0gZS5mb250U2l6ZVNjYWxlLFxuICAgICAgICAgICAgYyA9IGUuY2hhclNwYWNpbmcsXG4gICAgICAgICAgICBoID0gZS53b3JkU3BhY2luZyxcbiAgICAgICAgICAgIGQgPSBlLmZvbnREaXJlY3Rpb24sXG4gICAgICAgICAgICB1ID0gZS50ZXh0SFNjYWxlICogZCxcbiAgICAgICAgICAgIHAgPSB0Lmxlbmd0aCxcbiAgICAgICAgICAgIGYgPSBuLnZlcnRpY2FsLFxuICAgICAgICAgICAgZyA9IGYgPyAxIDogLTEsXG4gICAgICAgICAgICBtID0gbi5kZWZhdWx0Vk1ldHJpY3MsXG4gICAgICAgICAgICBiID0gYSAqIGUuZm9udE1hdHJpeFswXSxcbiAgICAgICAgICAgIHYgPSBlLnRleHRSZW5kZXJpbmdNb2RlID09PSBpLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgJiYgIW4uZGlzYWJsZUZvbnRGYWNlICYmICFlLnBhdHRlcm5GaWxsO1xuICAgICAgICAgIG8uc2F2ZSgpO1xuICAgICAgICAgIG8udHJhbnNmb3JtKC4uLmUudGV4dE1hdHJpeCk7XG4gICAgICAgICAgby50cmFuc2xhdGUoZS54LCBlLnkgKyBlLnRleHRSaXNlKTtcbiAgICAgICAgICBkID4gMCA/IG8uc2NhbGUodSwgLTEpIDogby5zY2FsZSh1LCAxKTtcbiAgICAgICAgICBsZXQgeTtcbiAgICAgICAgICBpZiAoZS5wYXR0ZXJuRmlsbCkge1xuICAgICAgICAgICAgby5zYXZlKCk7XG4gICAgICAgICAgICBjb25zdCB0ID0gZS5maWxsQ29sb3IuZ2V0UGF0dGVybihvLCB0aGlzLCAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkobyksIHMuUGF0aFR5cGUuRklMTCk7XG4gICAgICAgICAgICB5ID0gKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkobyk7XG4gICAgICAgICAgICBvLnJlc3RvcmUoKTtcbiAgICAgICAgICAgIG8uZmlsbFN0eWxlID0gdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IEEgPSBlLmxpbmVXaWR0aDtcbiAgICAgICAgICBjb25zdCBfID0gZS50ZXh0TWF0cml4U2NhbGU7XG4gICAgICAgICAgaWYgKDAgPT09IF8gfHwgMCA9PT0gQSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUudGV4dFJlbmRlcmluZ01vZGUgJiBpLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7XG4gICAgICAgICAgICB0ICE9PSBpLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSAmJiB0ICE9PSBpLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFIHx8IChBID0gdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkpO1xuICAgICAgICAgIH0gZWxzZSBBIC89IF87XG4gICAgICAgICAgaWYgKDEgIT09IGwpIHtcbiAgICAgICAgICAgIG8uc2NhbGUobCwgbCk7XG4gICAgICAgICAgICBBIC89IGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIG8ubGluZVdpZHRoID0gQTtcbiAgICAgICAgICBpZiAobi5pc0ludmFsaWRQREZqc0ZvbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0KSB7XG4gICAgICAgICAgICAgIG4ucHVzaChlLnVuaWNvZGUpO1xuICAgICAgICAgICAgICBpICs9IGUud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvLmZpbGxUZXh0KG4uam9pbihcIlwiKSwgMCwgMCk7XG4gICAgICAgICAgICBlLnggKz0gaSAqIGIgKiB1O1xuICAgICAgICAgICAgby5yZXN0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IFMsXG4gICAgICAgICAgICBFID0gMDtcbiAgICAgICAgICBmb3IgKFMgPSAwOyBTIDwgcDsgKytTKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdFtTXTtcbiAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiBlKSB7XG4gICAgICAgICAgICAgIEUgKz0gZyAqIGUgKiBhIC8gMWUzO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpID0gITE7XG4gICAgICAgICAgICBjb25zdCByID0gKGUuaXNTcGFjZSA/IGggOiAwKSArIGMsXG4gICAgICAgICAgICAgIHMgPSBlLmZvbnRDaGFyLFxuICAgICAgICAgICAgICB1ID0gZS5hY2NlbnQ7XG4gICAgICAgICAgICBsZXQgcCxcbiAgICAgICAgICAgICAgQSxcbiAgICAgICAgICAgICAgXyA9IGUud2lkdGg7XG4gICAgICAgICAgICBpZiAoZikge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZS52bWV0cmljIHx8IG0sXG4gICAgICAgICAgICAgICAgbiA9IC0oZS52bWV0cmljID8gdFsxXSA6IC41ICogXykgKiBiLFxuICAgICAgICAgICAgICAgIGkgPSB0WzJdICogYjtcbiAgICAgICAgICAgICAgXyA9IHQgPyAtdFswXSA6IF87XG4gICAgICAgICAgICAgIHAgPSBuIC8gbDtcbiAgICAgICAgICAgICAgQSA9IChFICsgaSkgLyBsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcCA9IEUgLyBsO1xuICAgICAgICAgICAgICBBID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLnJlbWVhc3VyZSAmJiBfID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gMWUzICogby5tZWFzdXJlVGV4dChzKS53aWR0aCAvIGEgKiBsO1xuICAgICAgICAgICAgICBpZiAoXyA8IHQgJiYgdGhpcy5pc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBfIC8gdDtcbiAgICAgICAgICAgICAgICBpID0gITA7XG4gICAgICAgICAgICAgICAgby5zYXZlKCk7XG4gICAgICAgICAgICAgICAgby5zY2FsZShlLCAxKTtcbiAgICAgICAgICAgICAgICBwIC89IGU7XG4gICAgICAgICAgICAgIH0gZWxzZSBfICE9PSB0ICYmIChwICs9IChfIC0gdCkgLyAyZTMgKiBhIC8gbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSAmJiAoZS5pc0luRm9udCB8fCBuLm1pc3NpbmdGaWxlKSkgaWYgKHYgJiYgIXUpIG8uZmlsbFRleHQocywgcCwgQSk7ZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMucGFpbnRDaGFyKHMsIHAsIEEsIHkpO1xuICAgICAgICAgICAgICBpZiAodSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBwICsgYSAqIHUub2Zmc2V0LnggLyBsLFxuICAgICAgICAgICAgICAgICAgZSA9IEEgLSBhICogdS5vZmZzZXQueSAvIGw7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludENoYXIodS5mb250Q2hhciwgdCwgZSwgeSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEUgKz0gZiA/IF8gKiBiIC0gciAqIGQgOiBfICogYiArIHIgKiBkO1xuICAgICAgICAgICAgaSAmJiBvLnJlc3RvcmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZiA/IGUueSAtPSBFIDogZS54ICs9IEUgKiB1O1xuICAgICAgICAgIG8ucmVzdG9yZSgpO1xuICAgICAgICAgIHRoaXMuY29tcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHNob3dUeXBlM1RleHQodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmN1cnJlbnQsXG4gICAgICAgICAgICByID0gbi5mb250LFxuICAgICAgICAgICAgcyA9IG4uZm9udFNpemUsXG4gICAgICAgICAgICBhID0gbi5mb250RGlyZWN0aW9uLFxuICAgICAgICAgICAgbyA9IHIudmVydGljYWwgPyAxIDogLTEsXG4gICAgICAgICAgICBsID0gbi5jaGFyU3BhY2luZyxcbiAgICAgICAgICAgIGMgPSBuLndvcmRTcGFjaW5nLFxuICAgICAgICAgICAgaCA9IG4udGV4dEhTY2FsZSAqIGEsXG4gICAgICAgICAgICBkID0gbi5mb250TWF0cml4IHx8IGkuRk9OVF9JREVOVElUWV9NQVRSSVgsXG4gICAgICAgICAgICB1ID0gdC5sZW5ndGg7XG4gICAgICAgICAgbGV0IHAsIGYsIGcsIG07XG4gICAgICAgICAgaWYgKCEobi50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gaS5UZXh0UmVuZGVyaW5nTW9kZS5JTlZJU0lCTEUpICYmIDAgIT09IHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPSAtMTtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgICAgICAgICAgZS5zYXZlKCk7XG4gICAgICAgICAgICBlLnRyYW5zZm9ybSguLi5uLnRleHRNYXRyaXgpO1xuICAgICAgICAgICAgZS50cmFuc2xhdGUobi54LCBuLnkpO1xuICAgICAgICAgICAgZS5zY2FsZShoLCBhKTtcbiAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCB1OyArK3ApIHtcbiAgICAgICAgICAgICAgZiA9IHRbcF07XG4gICAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiBmKSB7XG4gICAgICAgICAgICAgICAgbSA9IG8gKiBmICogcyAvIDFlMztcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC50cmFuc2xhdGUobSwgMCk7XG4gICAgICAgICAgICAgICAgbi54ICs9IG0gKiBoO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGEgPSAoZi5pc1NwYWNlID8gYyA6IDApICsgbCxcbiAgICAgICAgICAgICAgICB1ID0gci5jaGFyUHJvY09wZXJhdG9yTGlzdFtmLm9wZXJhdG9yTGlzdElkXTtcbiAgICAgICAgICAgICAgaWYgKCF1KSB7XG4gICAgICAgICAgICAgICAgKDAsIGkud2FybikoXCJUeXBlMyBjaGFyYWN0ZXIgXFxcIlwiLmNvbmNhdChmLm9wZXJhdG9yTGlzdElkLCBcIlxcXCIgaXMgbm90IGF2YWlsYWJsZS5cIikpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBmO1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgICAgICAgIGUuc2NhbGUocywgcyk7XG4gICAgICAgICAgICAgICAgZS50cmFuc2Zvcm0oLi4uZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlT3BlcmF0b3JMaXN0KHUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGcgPSBpLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW2Yud2lkdGgsIDBdLCBkKVswXSAqIHMgKyBhO1xuICAgICAgICAgICAgICBlLnRyYW5zbGF0ZShnLCAwKTtcbiAgICAgICAgICAgICAgbi54ICs9IGcgKiBoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZS5yZXN0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldENoYXJXaWR0aCh0LCBlKSB7fVxuICAgICAgICBzZXRDaGFyV2lkdGhBbmRCb3VuZHModCwgZSwgbiwgaSwgciwgcykge1xuICAgICAgICAgIHRoaXMuY3R4LnJlY3QobiwgaSwgciAtIG4sIHMgLSBpKTtcbiAgICAgICAgICB0aGlzLmN0eC5jbGlwKCk7XG4gICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q29sb3JOX1BhdHRlcm4odCkge1xuICAgICAgICAgIGxldCBlO1xuICAgICAgICAgIGlmIChcIlRpbGluZ1BhdHRlcm5cIiA9PT0gdFswXSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHRbMV0sXG4gICAgICAgICAgICAgIGkgPSB0aGlzLmJhc2VUcmFuc2Zvcm0gfHwgKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jdHgpLFxuICAgICAgICAgICAgICBhID0ge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUNhbnZhc0dyYXBoaWNzOiB0ID0+IG5ldyBDYW52YXNHcmFwaGljcyh0LCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLmZpbHRlckZhY3RvcnksIHtcbiAgICAgICAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICBtYXJrZWRDb250ZW50U3RhY2s6IHRoaXMubWFya2VkQ29udGVudFN0YWNrXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGUgPSBuZXcgcy5UaWxpbmdQYXR0ZXJuKHQsIG4sIHRoaXMuY3R4LCBhLCBpKTtcbiAgICAgICAgICB9IGVsc2UgZSA9IHRoaXMuX2dldFBhdHRlcm4odFsxXSwgdFsyXSk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3Ryb2tlQ29sb3JOKCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRGaWxsQ29sb3JOKCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSB0aGlzLmdldENvbG9yTl9QYXR0ZXJuKGFyZ3VtZW50cyk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsID0gITA7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3Ryb2tlUkdCQ29sb3IodCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IHIgPSBpLlV0aWwubWFrZUhleENvbG9yKHQsIGUsIG4pO1xuICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gcjtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSByO1xuICAgICAgICB9XG4gICAgICAgIHNldEZpbGxSR0JDb2xvcih0LCBlLCBuKSB7XG4gICAgICAgICAgY29uc3QgciA9IGkuVXRpbC5tYWtlSGV4Q29sb3IodCwgZSwgbik7XG4gICAgICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gcjtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gcjtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGwgPSAhMTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0UGF0dGVybih0KSB7XG4gICAgICAgICAgbGV0IGUsXG4gICAgICAgICAgICBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLmNhY2hlZFBhdHRlcm5zLmhhcyh0KSkgZSA9IHRoaXMuY2FjaGVkUGF0dGVybnMuZ2V0KHQpO2Vsc2Uge1xuICAgICAgICAgICAgZSA9ICgwLCBzLmdldFNoYWRpbmdQYXR0ZXJuKSh0aGlzLmdldE9iamVjdCh0KSk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlZFBhdHRlcm5zLnNldCh0LCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbiAmJiAoZS5tYXRyaXggPSBuKTtcbiAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfVxuICAgICAgICBzaGFkaW5nRmlsbCh0KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuY3R4O1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9nZXRQYXR0ZXJuKHQpO1xuICAgICAgICAgIGUuZmlsbFN0eWxlID0gbi5nZXRQYXR0ZXJuKGUsIHRoaXMsICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShlKSwgcy5QYXRoVHlwZS5TSEFESU5HKTtcbiAgICAgICAgICBjb25zdCBhID0gKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGUpO1xuICAgICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICAgIH0gPSBlLmNhbnZhcyxcbiAgICAgICAgICAgICAgW3IsIHMsIG8sIGxdID0gaS5VdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLCAwLCB0LCBuXSwgYSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsUmVjdChyLCBzLCBvIC0gciwgbCAtIHMpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLmN0eC5maWxsUmVjdCgtMWUxMCwgLTFlMTAsIDJlMTAsIDJlMTApO1xuICAgICAgICAgIHRoaXMuY29tcG9zZSh0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpKTtcbiAgICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgICAgICBiZWdpbklubGluZUltYWdlKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBiZWdpbklubGluZUltYWdlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luSW1hZ2VEYXRhKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBiZWdpbkltYWdlRGF0YVwiKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEZvcm1YT2JqZWN0QmVnaW4odCwgZSkge1xuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgICAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy5iYXNlVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodCkgJiYgNiA9PT0gdC5sZW5ndGggJiYgdGhpcy50cmFuc2Zvcm0oLi4udCk7XG4gICAgICAgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZVsyXSAtIGVbMF0sXG4gICAgICAgICAgICAgICAgbiA9IGVbM10gLSBlWzFdO1xuICAgICAgICAgICAgICB0aGlzLmN0eC5yZWN0KGVbMF0sIGVbMV0sIHQsIG4pO1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQudXBkYXRlUmVjdE1pbk1heCgoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCksIGUpO1xuICAgICAgICAgICAgICB0aGlzLmNsaXAoKTtcbiAgICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhaW50Rm9ybVhPYmplY3RFbmQoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgICAgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJlZ2luR3JvdXAodCkge1xuICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuY3R4O1xuICAgICAgICAgIHQuaXNvbGF0ZWQgfHwgKDAsIGkuaW5mbykoXCJUT0RPOiBTdXBwb3J0IG5vbi1pc29sYXRlZCBncm91cHMuXCIpO1xuICAgICAgICAgIHQua25vY2tvdXQgJiYgKDAsIGkud2FybikoXCJLbm9ja291dCBncm91cHMgbm90IHN1cHBvcnRlZC5cIik7XG4gICAgICAgICAgY29uc3QgbiA9ICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGUpO1xuICAgICAgICAgIHQubWF0cml4ICYmIGUudHJhbnNmb3JtKC4uLnQubWF0cml4KTtcbiAgICAgICAgICBpZiAoIXQuYmJveCkgdGhyb3cgbmV3IEVycm9yKFwiQm91bmRpbmcgYm94IGlzIHJlcXVpcmVkLlwiKTtcbiAgICAgICAgICBsZXQgcyA9IGkuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveCh0LmJib3gsICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGUpKTtcbiAgICAgICAgICBjb25zdCBhID0gWzAsIDAsIGUuY2FudmFzLndpZHRoLCBlLmNhbnZhcy5oZWlnaHRdO1xuICAgICAgICAgIHMgPSBpLlV0aWwuaW50ZXJzZWN0KHMsIGEpIHx8IFswLCAwLCAwLCAwXTtcbiAgICAgICAgICBjb25zdCBsID0gTWF0aC5mbG9vcihzWzBdKSxcbiAgICAgICAgICAgIGMgPSBNYXRoLmZsb29yKHNbMV0pO1xuICAgICAgICAgIGxldCBoID0gTWF0aC5tYXgoTWF0aC5jZWlsKHNbMl0pIC0gbCwgMSksXG4gICAgICAgICAgICBkID0gTWF0aC5tYXgoTWF0aC5jZWlsKHNbM10pIC0gYywgMSksXG4gICAgICAgICAgICB1ID0gMSxcbiAgICAgICAgICAgIHAgPSAxO1xuICAgICAgICAgIGlmIChoID4gbykge1xuICAgICAgICAgICAgdSA9IGggLyBvO1xuICAgICAgICAgICAgaCA9IG87XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkID4gbykge1xuICAgICAgICAgICAgcCA9IGQgLyBvO1xuICAgICAgICAgICAgZCA9IG87XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY3VycmVudC5zdGFydE5ld1BhdGhBbmRDbGlwQm94KFswLCAwLCBoLCBkXSk7XG4gICAgICAgICAgbGV0IGYgPSBcImdyb3VwQXRcIiArIHRoaXMuZ3JvdXBMZXZlbDtcbiAgICAgICAgICB0LnNtYXNrICYmIChmICs9IFwiX3NtYXNrX1wiICsgdGhpcy5zbWFza0NvdW50ZXIrKyAlIDIpO1xuICAgICAgICAgIGNvbnN0IGcgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhmLCBoLCBkKSxcbiAgICAgICAgICAgIG0gPSBnLmNvbnRleHQ7XG4gICAgICAgICAgbS5zY2FsZSgxIC8gdSwgMSAvIHApO1xuICAgICAgICAgIG0udHJhbnNsYXRlKC1sLCAtYyk7XG4gICAgICAgICAgbS50cmFuc2Zvcm0oLi4ubik7XG4gICAgICAgICAgaWYgKHQuc21hc2spIHRoaXMuc21hc2tTdGFjay5wdXNoKHtcbiAgICAgICAgICAgIGNhbnZhczogZy5jYW52YXMsXG4gICAgICAgICAgICBjb250ZXh0OiBtLFxuICAgICAgICAgICAgb2Zmc2V0WDogbCxcbiAgICAgICAgICAgIG9mZnNldFk6IGMsXG4gICAgICAgICAgICBzY2FsZVg6IHUsXG4gICAgICAgICAgICBzY2FsZVk6IHAsXG4gICAgICAgICAgICBzdWJ0eXBlOiB0LnNtYXNrLnN1YnR5cGUsXG4gICAgICAgICAgICBiYWNrZHJvcDogdC5zbWFzay5iYWNrZHJvcCxcbiAgICAgICAgICAgIHRyYW5zZmVyTWFwOiB0LnNtYXNrLnRyYW5zZmVyTWFwIHx8IG51bGwsXG4gICAgICAgICAgICBzdGFydFRyYW5zZm9ybUludmVyc2U6IG51bGxcbiAgICAgICAgICB9KTtlbHNlIHtcbiAgICAgICAgICAgIGUuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICAgICAgZS50cmFuc2xhdGUobCwgYyk7XG4gICAgICAgICAgICBlLnNjYWxlKHUsIHApO1xuICAgICAgICAgICAgZS5zYXZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvcHlDdHhTdGF0ZShlLCBtKTtcbiAgICAgICAgICB0aGlzLmN0eCA9IG07XG4gICAgICAgICAgdGhpcy5zZXRHU3RhdGUoW1tcIkJNXCIsIFwic291cmNlLW92ZXJcIl0sIFtcImNhXCIsIDFdLCBbXCJDQVwiLCAxXV0pO1xuICAgICAgICAgIHRoaXMuZ3JvdXBTdGFjay5wdXNoKGUpO1xuICAgICAgICAgIHRoaXMuZ3JvdXBMZXZlbCsrO1xuICAgICAgICB9XG4gICAgICAgIGVuZEdyb3VwKHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHJldHVybjtcbiAgICAgICAgICB0aGlzLmdyb3VwTGV2ZWwtLTtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdHgsXG4gICAgICAgICAgICBuID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpO1xuICAgICAgICAgIHRoaXMuY3R4ID0gbjtcbiAgICAgICAgICB0aGlzLmN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSAhMTtcbiAgICAgICAgICBpZiAodC5zbWFzaykge1xuICAgICAgICAgICAgdGhpcy50ZW1wU01hc2sgPSB0aGlzLnNtYXNrU3RhY2sucG9wKCk7XG4gICAgICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICAgICAgY29uc3QgdCA9ICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KTtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKC4uLnQpO1xuICAgICAgICAgICAgY29uc3QgbiA9IGkuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwgMCwgZS5jYW52YXMud2lkdGgsIGUuY2FudmFzLmhlaWdodF0sIHQpO1xuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKGUuY2FudmFzLCAwLCAwKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zZShuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYmVnaW5Bbm5vdGF0aW9uKHQsIGUsIG4sIHMsIGEpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9HdCwgX0d0MikuY2FsbCh0aGlzKTtcbiAgICAgICAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG4gICAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybSAmJiB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oLi4udGhpcy5iYXNlVHJhbnNmb3JtKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSAmJiA0ID09PSBlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcyA9IGVbMl0gLSBlWzBdLFxuICAgICAgICAgICAgICBvID0gZVszXSAtIGVbMV07XG4gICAgICAgICAgICBpZiAoYSAmJiB0aGlzLmFubm90YXRpb25DYW52YXNNYXApIHtcbiAgICAgICAgICAgICAgKG4gPSBuLnNsaWNlKCkpWzRdIC09IGVbMF07XG4gICAgICAgICAgICAgIG5bNV0gLT0gZVsxXTtcbiAgICAgICAgICAgICAgKGUgPSBlLnNsaWNlKCkpWzBdID0gZVsxXSA9IDA7XG4gICAgICAgICAgICAgIGVbMl0gPSBzO1xuICAgICAgICAgICAgICBlWzNdID0gbztcbiAgICAgICAgICAgICAgY29uc3QgW2EsIGxdID0gaS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKCgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KSksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdmlld3BvcnRTY2FsZTogY1xuICAgICAgICAgICAgICAgIH0gPSB0aGlzLFxuICAgICAgICAgICAgICAgIGggPSBNYXRoLmNlaWwocyAqIHRoaXMub3V0cHV0U2NhbGVYICogYyksXG4gICAgICAgICAgICAgICAgZCA9IE1hdGguY2VpbChvICogdGhpcy5vdXRwdXRTY2FsZVkgKiBjKTtcbiAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZShoLCBkKTtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGNhbnZhczogdSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBwXG4gICAgICAgICAgICAgIH0gPSB0aGlzLmFubm90YXRpb25DYW52YXM7XG4gICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcC5zZXQodCwgdSk7XG4gICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eCA9IHRoaXMuY3R4O1xuICAgICAgICAgICAgICB0aGlzLmN0eCA9IHA7XG4gICAgICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKGEsIDAsIDAsIC1sLCAwLCBvICogbCk7XG4gICAgICAgICAgICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICAgICAgICAgICAgdGhpcy5jdHgucmVjdChlWzBdLCBlWzFdLCBzLCBvKTtcbiAgICAgICAgICAgICAgdGhpcy5jdHguY2xpcCgpO1xuICAgICAgICAgICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUodGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybSguLi5uKTtcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybSguLi5zKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRBbm5vdGF0aW9uKCkge1xuICAgICAgICAgIGlmICh0aGlzLmFubm90YXRpb25DYW52YXMpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1Z0LCBfVnQyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5jdHggPSB0aGlzLmFubm90YXRpb25DYW52YXMuc2F2ZWRDdHg7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5hbm5vdGF0aW9uQ2FudmFzLnNhdmVkQ3R4O1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYW5ub3RhdGlvbkNhbnZhcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0KHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBlID0gdC5jb3VudDtcbiAgICAgICAgICAodCA9IHRoaXMuZ2V0T2JqZWN0KHQuZGF0YSwgdCkpLmNvdW50ID0gZTtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jdHgsXG4gICAgICAgICAgICBpID0gdGhpcy5wcm9jZXNzaW5nVHlwZTM7XG4gICAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgIHZvaWQgMCA9PT0gaS5jb21waWxlZCAmJiAoaS5jb21waWxlZCA9IGZ1bmN0aW9uIGNvbXBpbGVUeXBlM0dseXBoKHQpIHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgICAgICAgIGhlaWdodDogblxuICAgICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICAgICAgaWYgKGUgPiAxZTMgfHwgbiA+IDFlMykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgVWludDhBcnJheShbMCwgMiwgNCwgMCwgMSwgMCwgNSwgNCwgOCwgMTAsIDAsIDgsIDAsIDIsIDEsIDBdKSxcbiAgICAgICAgICAgICAgICByID0gZSArIDE7XG4gICAgICAgICAgICAgIGxldCBzLFxuICAgICAgICAgICAgICAgIGEsXG4gICAgICAgICAgICAgICAgbyxcbiAgICAgICAgICAgICAgICBsID0gbmV3IFVpbnQ4QXJyYXkociAqIChuICsgMSkpO1xuICAgICAgICAgICAgICBjb25zdCBjID0gZSArIDcgJiAtODtcbiAgICAgICAgICAgICAgbGV0IGggPSBuZXcgVWludDhBcnJheShjICogbiksXG4gICAgICAgICAgICAgICAgZCA9IDA7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0LmRhdGEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IDEyODtcbiAgICAgICAgICAgICAgICBmb3IgKDsgdCA+IDA7KSB7XG4gICAgICAgICAgICAgICAgICBoW2QrK10gPSBlICYgdCA/IDAgOiAyNTU7XG4gICAgICAgICAgICAgICAgICB0ID4+PSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsZXQgdSA9IDA7XG4gICAgICAgICAgICAgIGQgPSAwO1xuICAgICAgICAgICAgICBpZiAoMCAhPT0gaFtkXSkge1xuICAgICAgICAgICAgICAgIGxbMF0gPSAxO1xuICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGEgPSAxOyBhIDwgZTsgYSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhbZF0gIT09IGhbZCArIDFdKSB7XG4gICAgICAgICAgICAgICAgICBsW2FdID0gaFtkXSA/IDIgOiAxO1xuICAgICAgICAgICAgICAgICAgKyt1O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKDAgIT09IGhbZF0pIHtcbiAgICAgICAgICAgICAgICBsW2FdID0gMjtcbiAgICAgICAgICAgICAgICArK3U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yIChzID0gMTsgcyA8IG47IHMrKykge1xuICAgICAgICAgICAgICAgIGQgPSBzICogYztcbiAgICAgICAgICAgICAgICBvID0gcyAqIHI7XG4gICAgICAgICAgICAgICAgaWYgKGhbZCAtIGNdICE9PSBoW2RdKSB7XG4gICAgICAgICAgICAgICAgICBsW29dID0gaFtkXSA/IDEgOiA4O1xuICAgICAgICAgICAgICAgICAgKyt1O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgdCA9IChoW2RdID8gNCA6IDApICsgKGhbZCAtIGNdID8gOCA6IDApO1xuICAgICAgICAgICAgICAgIGZvciAoYSA9IDE7IGEgPCBlOyBhKyspIHtcbiAgICAgICAgICAgICAgICAgIHQgPSAodCA+PiAyKSArIChoW2QgKyAxXSA/IDQgOiAwKSArIChoW2QgLSBjICsgMV0gPyA4IDogMCk7XG4gICAgICAgICAgICAgICAgICBpZiAoaVt0XSkge1xuICAgICAgICAgICAgICAgICAgICBsW28gKyBhXSA9IGlbdF07XG4gICAgICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhbZCAtIGNdICE9PSBoW2RdKSB7XG4gICAgICAgICAgICAgICAgICBsW28gKyBhXSA9IGhbZF0gPyAyIDogNDtcbiAgICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHUgPiAxZTMpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGQgPSBjICogKG4gLSAxKTtcbiAgICAgICAgICAgICAgbyA9IHMgKiByO1xuICAgICAgICAgICAgICBpZiAoMCAhPT0gaFtkXSkge1xuICAgICAgICAgICAgICAgIGxbb10gPSA4O1xuICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGEgPSAxOyBhIDwgZTsgYSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhbZF0gIT09IGhbZCArIDFdKSB7XG4gICAgICAgICAgICAgICAgICBsW28gKyBhXSA9IGhbZF0gPyA0IDogODtcbiAgICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICgwICE9PSBoW2RdKSB7XG4gICAgICAgICAgICAgICAgbFtvICsgYV0gPSA0O1xuICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodSA+IDFlMykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIGNvbnN0IHAgPSBuZXcgSW50MzJBcnJheShbMCwgciwgLTEsIDAsIC1yLCAwLCAwLCAwLCAxXSksXG4gICAgICAgICAgICAgICAgZiA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgICAgICAgZm9yIChzID0gMDsgdSAmJiBzIDw9IG47IHMrKykge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gcyAqIHI7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHQgKyBlO1xuICAgICAgICAgICAgICAgIGZvciAoOyB0IDwgbiAmJiAhbFt0XTspIHQrKztcbiAgICAgICAgICAgICAgICBpZiAodCA9PT0gbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgZi5tb3ZlVG8odCAlIHIsIHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0O1xuICAgICAgICAgICAgICAgIGxldCBhID0gbFt0XTtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlID0gcFthXTtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgdCArPSBlO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIWxbdF0pO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IGxbdF07XG4gICAgICAgICAgICAgICAgICBpZiAoNSAhPT0gbiAmJiAxMCAhPT0gbikge1xuICAgICAgICAgICAgICAgICAgICBhID0gbjtcbiAgICAgICAgICAgICAgICAgICAgbFt0XSA9IDA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhID0gbiAmIDUxICogYSA+PiA0O1xuICAgICAgICAgICAgICAgICAgICBsW3RdICY9IGEgPj4gMiB8IGEgPDwgMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGYubGluZVRvKHQgJSByLCB0IC8gciB8IDApO1xuICAgICAgICAgICAgICAgICAgbFt0XSB8fCAtLXU7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoaSAhPT0gdCk7XG4gICAgICAgICAgICAgICAgLS1zO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGggPSBudWxsO1xuICAgICAgICAgICAgICBsID0gbnVsbDtcbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdC5zYXZlKCk7XG4gICAgICAgICAgICAgICAgdC5zY2FsZSgxIC8gZSwgLTEgLyBuKTtcbiAgICAgICAgICAgICAgICB0LnRyYW5zbGF0ZSgwLCAtbik7XG4gICAgICAgICAgICAgICAgdC5maWxsKGYpO1xuICAgICAgICAgICAgICAgIHQuYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgdC5yZXN0b3JlKCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KHQpKTtcbiAgICAgICAgICAgIGlmIChpLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICAgIGkuY29tcGlsZWQobik7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgciA9IHRoaXMuX2NyZWF0ZU1hc2tDYW52YXModCksXG4gICAgICAgICAgICBzID0gci5jYW52YXM7XG4gICAgICAgICAgbi5zYXZlKCk7XG4gICAgICAgICAgbi5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICAgICAgbi5kcmF3SW1hZ2Uocywgci5vZmZzZXRYLCByLm9mZnNldFkpO1xuICAgICAgICAgIG4ucmVzdG9yZSgpO1xuICAgICAgICAgIHRoaXMuY29tcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdCh0LCBlKSB7XG4gICAgICAgICAgbGV0IG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IDAsXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10gPyBhcmd1bWVudHNbM10gOiAwLFxuICAgICAgICAgICAgYSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ID8gYXJndW1lbnRzWzRdIDogdm9pZCAwLFxuICAgICAgICAgICAgbyA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ID8gYXJndW1lbnRzWzVdIDogdm9pZCAwO1xuICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICAgIHQgPSB0aGlzLmdldE9iamVjdCh0LmRhdGEsIHQpO1xuICAgICAgICAgIGNvbnN0IGwgPSB0aGlzLmN0eDtcbiAgICAgICAgICBsLnNhdmUoKTtcbiAgICAgICAgICBjb25zdCBjID0gKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkobCk7XG4gICAgICAgICAgbC50cmFuc2Zvcm0oZSwgbiwgcywgYSwgMCwgMCk7XG4gICAgICAgICAgY29uc3QgaCA9IHRoaXMuX2NyZWF0ZU1hc2tDYW52YXModCk7XG4gICAgICAgICAgbC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgaC5vZmZzZXRYIC0gY1s0XSwgaC5vZmZzZXRZIC0gY1s1XSk7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IDAsIHIgPSBvLmxlbmd0aDsgdCA8IHI7IHQgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgciA9IGkuVXRpbC50cmFuc2Zvcm0oYywgW2UsIG4sIHMsIGEsIG9bdF0sIG9bdCArIDFdXSksXG4gICAgICAgICAgICAgIFtkLCB1XSA9IGkuVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgMF0sIHIpO1xuICAgICAgICAgICAgbC5kcmF3SW1hZ2UoaC5jYW52YXMsIGQsIHUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsLnJlc3RvcmUoKTtcbiAgICAgICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cCh0KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuY3R4LFxuICAgICAgICAgICAgbiA9IHRoaXMuY3VycmVudC5maWxsQ29sb3IsXG4gICAgICAgICAgICBpID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsO1xuICAgICAgICAgIGZvciAoY29uc3QgYSBvZiB0KSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZGF0YTogdCxcbiAgICAgICAgICAgICAgICB3aWR0aDogbyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGwsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBjXG4gICAgICAgICAgICAgIH0gPSBhLFxuICAgICAgICAgICAgICBoID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJtYXNrQ2FudmFzXCIsIG8sIGwpLFxuICAgICAgICAgICAgICBkID0gaC5jb250ZXh0O1xuICAgICAgICAgICAgZC5zYXZlKCk7XG4gICAgICAgICAgICBwdXRCaW5hcnlJbWFnZU1hc2soZCwgdGhpcy5nZXRPYmplY3QodCwgYSkpO1xuICAgICAgICAgICAgZC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1pblwiO1xuICAgICAgICAgICAgZC5maWxsU3R5bGUgPSBpID8gbi5nZXRQYXR0ZXJuKGQsIHRoaXMsICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShlKSwgcy5QYXRoVHlwZS5GSUxMKSA6IG47XG4gICAgICAgICAgICBkLmZpbGxSZWN0KDAsIDAsIG8sIGwpO1xuICAgICAgICAgICAgZC5yZXN0b3JlKCk7XG4gICAgICAgICAgICBlLnNhdmUoKTtcbiAgICAgICAgICAgIGUudHJhbnNmb3JtKC4uLmMpO1xuICAgICAgICAgICAgZS5zY2FsZSgxLCAtMSk7XG4gICAgICAgICAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoZSwgaC5jYW52YXMsIDAsIDAsIG8sIGwsIDAsIC0xLCAxLCAxKTtcbiAgICAgICAgICAgIGUucmVzdG9yZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEltYWdlWE9iamVjdCh0KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0T2JqZWN0KHQpO1xuICAgICAgICAgIGUgPyB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGUpIDogKDAsIGkud2FybikoXCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KHQsIGUsIG4sIHIpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBzID0gdGhpcy5nZXRPYmplY3QodCk7XG4gICAgICAgICAgaWYgKCFzKSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKShcIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGEgPSBzLndpZHRoLFxuICAgICAgICAgICAgbyA9IHMuaGVpZ2h0LFxuICAgICAgICAgICAgbCA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHQgPSAwLCBpID0gci5sZW5ndGg7IHQgPCBpOyB0ICs9IDIpIGwucHVzaCh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IFtlLCAwLCAwLCBuLCByW3RdLCByW3QgKyAxXV0sXG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgIHc6IGEsXG4gICAgICAgICAgICBoOiBvXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKHMsIGwpO1xuICAgICAgICB9XG4gICAgICAgIGFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXModCkge1xuICAgICAgICAgIGlmIChcIm5vbmVcIiAhPT0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcykge1xuICAgICAgICAgICAgdC5maWx0ZXIgPSB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzO1xuICAgICAgICAgICAgdC5kcmF3SW1hZ2UodC5jYW52YXMsIDAsIDApO1xuICAgICAgICAgICAgdC5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHQuY2FudmFzO1xuICAgICAgICB9XG4gICAgICAgIGFwcGx5VHJhbnNmZXJNYXBzVG9CaXRtYXAodCkge1xuICAgICAgICAgIGlmIChcIm5vbmVcIiA9PT0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcykgcmV0dXJuIHQuYml0bWFwO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgYml0bWFwOiBlLFxuICAgICAgICAgICAgICB3aWR0aDogbixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBpXG4gICAgICAgICAgICB9ID0gdCxcbiAgICAgICAgICAgIHIgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlubGluZUltYWdlXCIsIG4sIGkpLFxuICAgICAgICAgICAgcyA9IHIuY29udGV4dDtcbiAgICAgICAgICBzLmZpbHRlciA9IHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHM7XG4gICAgICAgICAgcy5kcmF3SW1hZ2UoZSwgMCwgMCk7XG4gICAgICAgICAgcy5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICAgICAgICByZXR1cm4gci5jYW52YXM7XG4gICAgICAgIH1cbiAgICAgICAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3QodCkge1xuICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IGUgPSB0LndpZHRoLFxuICAgICAgICAgICAgbiA9IHQuaGVpZ2h0LFxuICAgICAgICAgICAgcyA9IHRoaXMuY3R4O1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIGlmICghaS5pc05vZGVKUykge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBmaWx0ZXI6IHRcbiAgICAgICAgICAgIH0gPSBzO1xuICAgICAgICAgICAgXCJub25lXCIgIT09IHQgJiYgXCJcIiAhPT0gdCAmJiAocy5maWx0ZXIgPSBcIm5vbmVcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHMuc2NhbGUoMSAvIGUsIC0xIC8gbik7XG4gICAgICAgICAgbGV0IGE7XG4gICAgICAgICAgaWYgKHQuYml0bWFwKSBhID0gdGhpcy5hcHBseVRyYW5zZmVyTWFwc1RvQml0bWFwKHQpO2Vsc2UgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgSFRNTEVsZW1lbnQgJiYgdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8ICF0LmRhdGEpIGEgPSB0O2Vsc2Uge1xuICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgZSwgbikuY29udGV4dDtcbiAgICAgICAgICAgIHB1dEJpbmFyeUltYWdlRGF0YShpLCB0KTtcbiAgICAgICAgICAgIGEgPSB0aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXMoaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG8gPSB0aGlzLl9zY2FsZUltYWdlKGEsICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShzKSk7XG4gICAgICAgICAgcy5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBnZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkocyksIHQuaW50ZXJwb2xhdGUpO1xuICAgICAgICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhzLCBvLmltZywgMCwgMCwgby5wYWludFdpZHRoLCBvLnBhaW50SGVpZ2h0LCAwLCAtbiwgZSwgbik7XG4gICAgICAgICAgdGhpcy5jb21wb3NlKCk7XG4gICAgICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cCh0LCBlKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuY3R4O1xuICAgICAgICAgIGxldCBpO1xuICAgICAgICAgIGlmICh0LmJpdG1hcCkgaSA9IHQuYml0bWFwO2Vsc2Uge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQud2lkdGgsXG4gICAgICAgICAgICAgIG4gPSB0LmhlaWdodCxcbiAgICAgICAgICAgICAgciA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgZSwgbikuY29udGV4dDtcbiAgICAgICAgICAgIHB1dEJpbmFyeUltYWdlRGF0YShyLCB0KTtcbiAgICAgICAgICAgIGkgPSB0aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXMocik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBlKSB7XG4gICAgICAgICAgICBuLnNhdmUoKTtcbiAgICAgICAgICAgIG4udHJhbnNmb3JtKC4uLnQudHJhbnNmb3JtKTtcbiAgICAgICAgICAgIG4uc2NhbGUoMSwgLTEpO1xuICAgICAgICAgICAgZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKG4sIGksIHQueCwgdC55LCB0LncsIHQuaCwgMCwgLTEsIDEsIDEpO1xuICAgICAgICAgICAgbi5yZXN0b3JlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29tcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50U29saWRDb2xvckltYWdlTWFzaygpIHtcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya1BvaW50KHQpIHt9XG4gICAgICAgIG1hcmtQb2ludFByb3BzKHQsIGUpIHt9XG4gICAgICAgIGJlZ2luTWFya2VkQ29udGVudCh0KSB7XG4gICAgICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICAgICAgICB2aXNpYmxlOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luTWFya2VkQ29udGVudFByb3BzKHQsIGUpIHtcbiAgICAgICAgICBcIk9DXCIgPT09IHQgPyB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHtcbiAgICAgICAgICAgIHZpc2libGU6IHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLmlzVmlzaWJsZShlKVxuICAgICAgICAgIH0pIDogdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICAgICAgICB2aXNpYmxlOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRNYXJrZWRDb250ZW50KCkge1xuICAgICAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnBvcCgpO1xuICAgICAgICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTtcbiAgICAgICAgfVxuICAgICAgICBiZWdpbkNvbXBhdCgpIHt9XG4gICAgICAgIGVuZENvbXBhdCgpIHt9XG4gICAgICAgIGNvbnN1bWVQYXRoKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdXJyZW50LmlzRW1wdHlDbGlwKCk7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCAmJiB0aGlzLmN1cnJlbnQudXBkYXRlQ2xpcEZyb21QYXRoKCk7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCB8fCB0aGlzLmNvbXBvc2UodCk7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuY3R4O1xuICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICAgICAgICBlIHx8ICh0aGlzLnBlbmRpbmdDbGlwID09PSB1ID8gbi5jbGlwKFwiZXZlbm9kZFwiKSA6IG4uY2xpcCgpKTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmN1cnJlbnQuc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0aGlzLmN1cnJlbnQuY2xpcEJveCk7XG4gICAgICAgICAgbi5iZWdpblBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRTaW5nbGVQaXhlbFdpZHRoKCkge1xuICAgICAgICAgIGlmICghdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCkge1xuICAgICAgICAgICAgY29uc3QgdCA9ICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KTtcbiAgICAgICAgICAgIGlmICgwID09PSB0WzFdICYmIDAgPT09IHRbMl0pIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSAxIC8gTWF0aC5taW4oTWF0aC5hYnModFswXSksIE1hdGguYWJzKHRbM10pKTtlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IE1hdGguYWJzKHRbMF0gKiB0WzNdIC0gdFsyXSAqIHRbMV0pLFxuICAgICAgICAgICAgICAgIG4gPSBNYXRoLmh5cG90KHRbMF0sIHRbMl0pLFxuICAgICAgICAgICAgICAgIGkgPSBNYXRoLmh5cG90KHRbMV0sIHRbM10pO1xuICAgICAgICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gTWF0aC5tYXgobiwgaSkgLyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBnZXRTY2FsZUZvclN0cm9raW5nKCkge1xuICAgICAgICAgIGlmICgtMSA9PT0gdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGxpbmVXaWR0aDogdFxuICAgICAgICAgICAgICB9ID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogZSxcbiAgICAgICAgICAgICAgICBiOiBuLFxuICAgICAgICAgICAgICAgIGM6IGksXG4gICAgICAgICAgICAgICAgZDogclxuICAgICAgICAgICAgICB9ID0gdGhpcy5jdHguZ2V0VHJhbnNmb3JtKCk7XG4gICAgICAgICAgICBsZXQgcywgYTtcbiAgICAgICAgICAgIGlmICgwID09PSBuICYmIDAgPT09IGkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IE1hdGguYWJzKGUpLFxuICAgICAgICAgICAgICAgIGkgPSBNYXRoLmFicyhyKTtcbiAgICAgICAgICAgICAgaWYgKG4gPT09IGkpIHtcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdCkgcyA9IGEgPSAxIC8gbjtlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBuICogdDtcbiAgICAgICAgICAgICAgICAgIHMgPSBhID0gZSA8IDEgPyAxIC8gZSA6IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKDAgPT09IHQpIHtcbiAgICAgICAgICAgICAgICBzID0gMSAvIG47XG4gICAgICAgICAgICAgICAgYSA9IDEgLyBpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBuICogdCxcbiAgICAgICAgICAgICAgICAgIHIgPSBpICogdDtcbiAgICAgICAgICAgICAgICBzID0gZSA8IDEgPyAxIC8gZSA6IDE7XG4gICAgICAgICAgICAgICAgYSA9IHIgPCAxID8gMSAvIHIgOiAxO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBvID0gTWF0aC5hYnMoZSAqIHIgLSBuICogaSksXG4gICAgICAgICAgICAgICAgbCA9IE1hdGguaHlwb3QoZSwgbiksXG4gICAgICAgICAgICAgICAgYyA9IE1hdGguaHlwb3QoaSwgcik7XG4gICAgICAgICAgICAgIGlmICgwID09PSB0KSB7XG4gICAgICAgICAgICAgICAgcyA9IGMgLyBvO1xuICAgICAgICAgICAgICAgIGEgPSBsIC8gbztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdCAqIG87XG4gICAgICAgICAgICAgICAgcyA9IGMgPiBlID8gYyAvIGUgOiAxO1xuICAgICAgICAgICAgICAgIGEgPSBsID4gZSA/IGwgLyBlIDogMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IHM7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzFdID0gYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmVzY2FsZUFuZFN0cm9rZSh0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBjdHg6IGVcbiAgICAgICAgICAgIH0gPSB0aGlzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsaW5lV2lkdGg6IG5cbiAgICAgICAgICAgIH0gPSB0aGlzLmN1cnJlbnQsXG4gICAgICAgICAgICBbaSwgcl0gPSB0aGlzLmdldFNjYWxlRm9yU3Ryb2tpbmcoKTtcbiAgICAgICAgICBlLmxpbmVXaWR0aCA9IG4gfHwgMTtcbiAgICAgICAgICBpZiAoMSA9PT0gaSAmJiAxID09PSByKSB7XG4gICAgICAgICAgICBlLnN0cm9rZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzID0gZS5nZXRMaW5lRGFzaCgpO1xuICAgICAgICAgIHQgJiYgZS5zYXZlKCk7XG4gICAgICAgICAgZS5zY2FsZShpLCByKTtcbiAgICAgICAgICBpZiAocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5tYXgoaSwgcik7XG4gICAgICAgICAgICBlLnNldExpbmVEYXNoKHMubWFwKGUgPT4gZSAvIHQpKTtcbiAgICAgICAgICAgIGUubGluZURhc2hPZmZzZXQgLz0gdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZS5zdHJva2UoKTtcbiAgICAgICAgICB0ICYmIGUucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlzQ29udGVudFZpc2libGUoKSB7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IHRoaXMubWFya2VkQ29udGVudFN0YWNrLmxlbmd0aCAtIDE7IHQgPj0gMDsgdC0tKSBpZiAoIXRoaXMubWFya2VkQ29udGVudFN0YWNrW3RdLnZpc2libGUpIHJldHVybiAhMTtcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9HdDIoKSB7XG4gICAgICAgIGZvciAoOyB0aGlzLnN0YXRlU3RhY2subGVuZ3RoIHx8IHRoaXMuaW5TTWFza01vZGU7KSB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICBpZiAodGhpcy50cmFuc3BhcmVudENhbnZhcykge1xuICAgICAgICAgIHRoaXMuY3R4ID0gdGhpcy5jb21wb3NpdGVDdHg7XG4gICAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy50cmFuc3BhcmVudENhbnZhcywgMCwgMCk7XG4gICAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICAgIHRoaXMudHJhbnNwYXJlbnRDYW52YXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfVnQyKCkge1xuICAgICAgICBpZiAodGhpcy5wYWdlQ29sb3JzKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRIQ01GaWx0ZXIodGhpcy5wYWdlQ29sb3JzLmZvcmVncm91bmQsIHRoaXMucGFnZUNvbG9ycy5iYWNrZ3JvdW5kKTtcbiAgICAgICAgICBpZiAoXCJub25lXCIgIT09IHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eC5maWx0ZXI7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSB0O1xuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuY3R4LmNhbnZhcywgMCwgMCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5DYW52YXNHcmFwaGljcyA9IENhbnZhc0dyYXBoaWNzO1xuICAgICAgZm9yIChjb25zdCB0IGluIGkuT1BTKSB2b2lkIDAgIT09IENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVt0XSAmJiAoQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW2kuT1BTW3RdXSA9IENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVt0XSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuVGlsaW5nUGF0dGVybiA9IGUuUGF0aFR5cGUgPSB2b2lkIDA7XG4gICAgICBlLmdldFNoYWRpbmdQYXR0ZXJuID0gZnVuY3Rpb24gZ2V0U2hhZGluZ1BhdHRlcm4odCkge1xuICAgICAgICBzd2l0Y2ggKHRbMF0pIHtcbiAgICAgICAgICBjYXNlIFwiUmFkaWFsQXhpYWxcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybih0KTtcbiAgICAgICAgICBjYXNlIFwiTWVzaFwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNoU2hhZGluZ1BhdHRlcm4odCk7XG4gICAgICAgICAgY2FzZSBcIkR1bW15XCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IER1bW15U2hhZGluZ1BhdHRlcm4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIElSIHR5cGU6IFwiLmNvbmNhdCh0WzBdKSk7XG4gICAgICB9O1xuICAgICAgbigyKTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY3KTtcbiAgICAgIGNvbnN0IHMgPSB7XG4gICAgICAgIEZJTEw6IFwiRmlsbFwiLFxuICAgICAgICBTVFJPS0U6IFwiU3Ryb2tlXCIsXG4gICAgICAgIFNIQURJTkc6IFwiU2hhZGluZ1wiXG4gICAgICB9O1xuICAgICAgZS5QYXRoVHlwZSA9IHM7XG4gICAgICBmdW5jdGlvbiBhcHBseUJvdW5kaW5nQm94KHQsIGUpIHtcbiAgICAgICAgaWYgKCFlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG4gPSBlWzJdIC0gZVswXSxcbiAgICAgICAgICBpID0gZVszXSAtIGVbMV0sXG4gICAgICAgICAgciA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgci5yZWN0KGVbMF0sIGVbMV0sIG4sIGkpO1xuICAgICAgICB0LmNsaXAocik7XG4gICAgICB9XG4gICAgICBjbGFzcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlU2hhZGluZ1BhdHRlcm4gJiYgKDAsIGkudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZVNoYWRpbmdQYXR0ZXJuLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRQYXR0ZXJuKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgZ2V0UGF0dGVybmAgY2FsbGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybiBleHRlbmRzIEJhc2VTaGFkaW5nUGF0dGVybiB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgIHRoaXMuX3R5cGUgPSB0WzFdO1xuICAgICAgICAgIHRoaXMuX2Jib3ggPSB0WzJdO1xuICAgICAgICAgIHRoaXMuX2NvbG9yU3RvcHMgPSB0WzNdO1xuICAgICAgICAgIHRoaXMuX3AwID0gdFs0XTtcbiAgICAgICAgICB0aGlzLl9wMSA9IHRbNV07XG4gICAgICAgICAgdGhpcy5fcjAgPSB0WzZdO1xuICAgICAgICAgIHRoaXMuX3IxID0gdFs3XTtcbiAgICAgICAgICB0aGlzLm1hdHJpeCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZUdyYWRpZW50KHQpIHtcbiAgICAgICAgICBsZXQgZTtcbiAgICAgICAgICBcImF4aWFsXCIgPT09IHRoaXMuX3R5cGUgPyBlID0gdC5jcmVhdGVMaW5lYXJHcmFkaWVudCh0aGlzLl9wMFswXSwgdGhpcy5fcDBbMV0sIHRoaXMuX3AxWzBdLCB0aGlzLl9wMVsxXSkgOiBcInJhZGlhbFwiID09PSB0aGlzLl90eXBlICYmIChlID0gdC5jcmVhdGVSYWRpYWxHcmFkaWVudCh0aGlzLl9wMFswXSwgdGhpcy5fcDBbMV0sIHRoaXMuX3IwLCB0aGlzLl9wMVswXSwgdGhpcy5fcDFbMV0sIHRoaXMuX3IxKSk7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2NvbG9yU3RvcHMpIGUuYWRkQ29sb3JTdG9wKHRbMF0sIHRbMV0pO1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhdHRlcm4odCwgZSwgbiwgYSkge1xuICAgICAgICAgIGxldCBvO1xuICAgICAgICAgIGlmIChhID09PSBzLlNUUk9LRSB8fCBhID09PSBzLkZJTEwpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBlLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveChhLCAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0KSkgfHwgWzAsIDAsIDAsIDBdLFxuICAgICAgICAgICAgICBsID0gTWF0aC5jZWlsKHNbMl0gLSBzWzBdKSB8fCAxLFxuICAgICAgICAgICAgICBjID0gTWF0aC5jZWlsKHNbM10gLSBzWzFdKSB8fCAxLFxuICAgICAgICAgICAgICBoID0gZS5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJwYXR0ZXJuXCIsIGwsIGMsICEwKSxcbiAgICAgICAgICAgICAgZCA9IGguY29udGV4dDtcbiAgICAgICAgICAgIGQuY2xlYXJSZWN0KDAsIDAsIGQuY2FudmFzLndpZHRoLCBkLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgICAgZC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGQucmVjdCgwLCAwLCBkLmNhbnZhcy53aWR0aCwgZC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICAgIGQudHJhbnNsYXRlKC1zWzBdLCAtc1sxXSk7XG4gICAgICAgICAgICBuID0gaS5VdGlsLnRyYW5zZm9ybShuLCBbMSwgMCwgMCwgMSwgc1swXSwgc1sxXV0pO1xuICAgICAgICAgICAgZC50cmFuc2Zvcm0oLi4uZS5iYXNlVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIHRoaXMubWF0cml4ICYmIGQudHJhbnNmb3JtKC4uLnRoaXMubWF0cml4KTtcbiAgICAgICAgICAgIGFwcGx5Qm91bmRpbmdCb3goZCwgdGhpcy5fYmJveCk7XG4gICAgICAgICAgICBkLmZpbGxTdHlsZSA9IHRoaXMuX2NyZWF0ZUdyYWRpZW50KGQpO1xuICAgICAgICAgICAgZC5maWxsKCk7XG4gICAgICAgICAgICBvID0gdC5jcmVhdGVQYXR0ZXJuKGguY2FudmFzLCBcIm5vLXJlcGVhdFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHUgPSBuZXcgRE9NTWF0cml4KG4pO1xuICAgICAgICAgICAgby5zZXRUcmFuc2Zvcm0odSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFwcGx5Qm91bmRpbmdCb3godCwgdGhpcy5fYmJveCk7XG4gICAgICAgICAgICBvID0gdGhpcy5fY3JlYXRlR3JhZGllbnQodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkcmF3VHJpYW5nbGUodCwgZSwgbiwgaSwgciwgcywgYSwgbykge1xuICAgICAgICBjb25zdCBsID0gZS5jb29yZHMsXG4gICAgICAgICAgYyA9IGUuY29sb3JzLFxuICAgICAgICAgIGggPSB0LmRhdGEsXG4gICAgICAgICAgZCA9IDQgKiB0LndpZHRoO1xuICAgICAgICBsZXQgdTtcbiAgICAgICAgaWYgKGxbbiArIDFdID4gbFtpICsgMV0pIHtcbiAgICAgICAgICB1ID0gbjtcbiAgICAgICAgICBuID0gaTtcbiAgICAgICAgICBpID0gdTtcbiAgICAgICAgICB1ID0gcztcbiAgICAgICAgICBzID0gYTtcbiAgICAgICAgICBhID0gdTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobFtpICsgMV0gPiBsW3IgKyAxXSkge1xuICAgICAgICAgIHUgPSBpO1xuICAgICAgICAgIGkgPSByO1xuICAgICAgICAgIHIgPSB1O1xuICAgICAgICAgIHUgPSBhO1xuICAgICAgICAgIGEgPSBvO1xuICAgICAgICAgIG8gPSB1O1xuICAgICAgICB9XG4gICAgICAgIGlmIChsW24gKyAxXSA+IGxbaSArIDFdKSB7XG4gICAgICAgICAgdSA9IG47XG4gICAgICAgICAgbiA9IGk7XG4gICAgICAgICAgaSA9IHU7XG4gICAgICAgICAgdSA9IHM7XG4gICAgICAgICAgcyA9IGE7XG4gICAgICAgICAgYSA9IHU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcCA9IChsW25dICsgZS5vZmZzZXRYKSAqIGUuc2NhbGVYLFxuICAgICAgICAgIGYgPSAobFtuICsgMV0gKyBlLm9mZnNldFkpICogZS5zY2FsZVksXG4gICAgICAgICAgZyA9IChsW2ldICsgZS5vZmZzZXRYKSAqIGUuc2NhbGVYLFxuICAgICAgICAgIG0gPSAobFtpICsgMV0gKyBlLm9mZnNldFkpICogZS5zY2FsZVksXG4gICAgICAgICAgYiA9IChsW3JdICsgZS5vZmZzZXRYKSAqIGUuc2NhbGVYLFxuICAgICAgICAgIHYgPSAobFtyICsgMV0gKyBlLm9mZnNldFkpICogZS5zY2FsZVk7XG4gICAgICAgIGlmIChmID49IHYpIHJldHVybjtcbiAgICAgICAgY29uc3QgeSA9IGNbc10sXG4gICAgICAgICAgQSA9IGNbcyArIDFdLFxuICAgICAgICAgIF8gPSBjW3MgKyAyXSxcbiAgICAgICAgICBTID0gY1thXSxcbiAgICAgICAgICBFID0gY1thICsgMV0sXG4gICAgICAgICAgeCA9IGNbYSArIDJdLFxuICAgICAgICAgIHcgPSBjW29dLFxuICAgICAgICAgIEMgPSBjW28gKyAxXSxcbiAgICAgICAgICBUID0gY1tvICsgMl0sXG4gICAgICAgICAgUCA9IE1hdGgucm91bmQoZiksXG4gICAgICAgICAgayA9IE1hdGgucm91bmQodik7XG4gICAgICAgIGxldCBNLCBSLCBJLCBELCBPLCBMLCBOLCBCO1xuICAgICAgICBmb3IgKGxldCB0ID0gUDsgdCA8PSBrOyB0KyspIHtcbiAgICAgICAgICBpZiAodCA8IG0pIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0IDwgZiA/IDAgOiAoZiAtIHQpIC8gKGYgLSBtKTtcbiAgICAgICAgICAgIE0gPSBwIC0gKHAgLSBnKSAqIGU7XG4gICAgICAgICAgICBSID0geSAtICh5IC0gUykgKiBlO1xuICAgICAgICAgICAgSSA9IEEgLSAoQSAtIEUpICogZTtcbiAgICAgICAgICAgIEQgPSBfIC0gKF8gLSB4KSAqIGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlO1xuICAgICAgICAgICAgZSA9IHQgPiB2ID8gMSA6IG0gPT09IHYgPyAwIDogKG0gLSB0KSAvIChtIC0gdik7XG4gICAgICAgICAgICBNID0gZyAtIChnIC0gYikgKiBlO1xuICAgICAgICAgICAgUiA9IFMgLSAoUyAtIHcpICogZTtcbiAgICAgICAgICAgIEkgPSBFIC0gKEUgLSBDKSAqIGU7XG4gICAgICAgICAgICBEID0geCAtICh4IC0gVCkgKiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgZTtcbiAgICAgICAgICBlID0gdCA8IGYgPyAwIDogdCA+IHYgPyAxIDogKGYgLSB0KSAvIChmIC0gdik7XG4gICAgICAgICAgTyA9IHAgLSAocCAtIGIpICogZTtcbiAgICAgICAgICBMID0geSAtICh5IC0gdykgKiBlO1xuICAgICAgICAgIE4gPSBBIC0gKEEgLSBDKSAqIGU7XG4gICAgICAgICAgQiA9IF8gLSAoXyAtIFQpICogZTtcbiAgICAgICAgICBjb25zdCBuID0gTWF0aC5yb3VuZChNYXRoLm1pbihNLCBPKSksXG4gICAgICAgICAgICBpID0gTWF0aC5yb3VuZChNYXRoLm1heChNLCBPKSk7XG4gICAgICAgICAgbGV0IHIgPSBkICogdCArIDQgKiBuO1xuICAgICAgICAgIGZvciAobGV0IHQgPSBuOyB0IDw9IGk7IHQrKykge1xuICAgICAgICAgICAgZSA9IChNIC0gdCkgLyAoTSAtIE8pO1xuICAgICAgICAgICAgZSA8IDAgPyBlID0gMCA6IGUgPiAxICYmIChlID0gMSk7XG4gICAgICAgICAgICBoW3IrK10gPSBSIC0gKFIgLSBMKSAqIGUgfCAwO1xuICAgICAgICAgICAgaFtyKytdID0gSSAtIChJIC0gTikgKiBlIHwgMDtcbiAgICAgICAgICAgIGhbcisrXSA9IEQgLSAoRCAtIEIpICogZSB8IDA7XG4gICAgICAgICAgICBoW3IrK10gPSAyNTU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkcmF3RmlndXJlKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgaSA9IGUuY29vcmRzLFxuICAgICAgICAgIHIgPSBlLmNvbG9ycztcbiAgICAgICAgbGV0IHMsIGE7XG4gICAgICAgIHN3aXRjaCAoZS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImxhdHRpY2VcIjpcbiAgICAgICAgICAgIGNvbnN0IG8gPSBlLnZlcnRpY2VzUGVyUm93LFxuICAgICAgICAgICAgICBsID0gTWF0aC5mbG9vcihpLmxlbmd0aCAvIG8pIC0gMSxcbiAgICAgICAgICAgICAgYyA9IG8gLSAxO1xuICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IGw7IHMrKykge1xuICAgICAgICAgICAgICBsZXQgZSA9IHMgKiBvO1xuICAgICAgICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IGM7IHMrKywgZSsrKSB7XG4gICAgICAgICAgICAgICAgZHJhd1RyaWFuZ2xlKHQsIG4sIGlbZV0sIGlbZSArIDFdLCBpW2UgKyBvXSwgcltlXSwgcltlICsgMV0sIHJbZSArIG9dKTtcbiAgICAgICAgICAgICAgICBkcmF3VHJpYW5nbGUodCwgbiwgaVtlICsgbyArIDFdLCBpW2UgKyAxXSwgaVtlICsgb10sIHJbZSArIG8gKyAxXSwgcltlICsgMV0sIHJbZSArIG9dKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInRyaWFuZ2xlc1wiOlxuICAgICAgICAgICAgZm9yIChzID0gMCwgYSA9IGkubGVuZ3RoOyBzIDwgYTsgcyArPSAzKSBkcmF3VHJpYW5nbGUodCwgbiwgaVtzXSwgaVtzICsgMV0sIGlbcyArIDJdLCByW3NdLCByW3MgKyAxXSwgcltzICsgMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgZmlndXJlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGFzcyBNZXNoU2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICB0aGlzLl9jb29yZHMgPSB0WzJdO1xuICAgICAgICAgIHRoaXMuX2NvbG9ycyA9IHRbM107XG4gICAgICAgICAgdGhpcy5fZmlndXJlcyA9IHRbNF07XG4gICAgICAgICAgdGhpcy5fYm91bmRzID0gdFs1XTtcbiAgICAgICAgICB0aGlzLl9iYm94ID0gdFs3XTtcbiAgICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kID0gdFs4XTtcbiAgICAgICAgICB0aGlzLm1hdHJpeCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZU1lc2hDYW52YXModCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKHRoaXMuX2JvdW5kc1swXSksXG4gICAgICAgICAgICByID0gTWF0aC5mbG9vcih0aGlzLl9ib3VuZHNbMV0pLFxuICAgICAgICAgICAgcyA9IE1hdGguY2VpbCh0aGlzLl9ib3VuZHNbMl0pIC0gaSxcbiAgICAgICAgICAgIGEgPSBNYXRoLmNlaWwodGhpcy5fYm91bmRzWzNdKSAtIHIsXG4gICAgICAgICAgICBvID0gTWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKHMgKiB0WzBdICogMS4xKSksIDNlMyksXG4gICAgICAgICAgICBsID0gTWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKGEgKiB0WzFdICogMS4xKSksIDNlMyksXG4gICAgICAgICAgICBjID0gcyAvIG8sXG4gICAgICAgICAgICBoID0gYSAvIGwsXG4gICAgICAgICAgICBkID0ge1xuICAgICAgICAgICAgICBjb29yZHM6IHRoaXMuX2Nvb3JkcyxcbiAgICAgICAgICAgICAgY29sb3JzOiB0aGlzLl9jb2xvcnMsXG4gICAgICAgICAgICAgIG9mZnNldFg6IC1pLFxuICAgICAgICAgICAgICBvZmZzZXRZOiAtcixcbiAgICAgICAgICAgICAgc2NhbGVYOiAxIC8gYyxcbiAgICAgICAgICAgICAgc2NhbGVZOiAxIC8gaFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHUgPSBvICsgNCxcbiAgICAgICAgICAgIHAgPSBsICsgNCxcbiAgICAgICAgICAgIGYgPSBuLmdldENhbnZhcyhcIm1lc2hcIiwgdSwgcCwgITEpLFxuICAgICAgICAgICAgZyA9IGYuY29udGV4dCxcbiAgICAgICAgICAgIG0gPSBnLmNyZWF0ZUltYWdlRGF0YShvLCBsKTtcbiAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IG0uZGF0YTtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuICs9IDQpIHtcbiAgICAgICAgICAgICAgdFtuXSA9IGVbMF07XG4gICAgICAgICAgICAgIHRbbiArIDFdID0gZVsxXTtcbiAgICAgICAgICAgICAgdFtuICsgMl0gPSBlWzJdO1xuICAgICAgICAgICAgICB0W24gKyAzXSA9IDI1NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2ZpZ3VyZXMpIGRyYXdGaWd1cmUobSwgdCwgZCk7XG4gICAgICAgICAgZy5wdXRJbWFnZURhdGEobSwgMiwgMik7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhbnZhczogZi5jYW52YXMsXG4gICAgICAgICAgICBvZmZzZXRYOiBpIC0gMiAqIGMsXG4gICAgICAgICAgICBvZmZzZXRZOiByIC0gMiAqIGgsXG4gICAgICAgICAgICBzY2FsZVg6IGMsXG4gICAgICAgICAgICBzY2FsZVk6IGhcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGdldFBhdHRlcm4odCwgZSwgbiwgYSkge1xuICAgICAgICAgIGFwcGx5Qm91bmRpbmdCb3godCwgdGhpcy5fYmJveCk7XG4gICAgICAgICAgbGV0IG87XG4gICAgICAgICAgaWYgKGEgPT09IHMuU0hBRElORykgbyA9IGkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSgoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0KSk7ZWxzZSB7XG4gICAgICAgICAgICBvID0gaS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGUuYmFzZVRyYW5zZm9ybSk7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXRyaXgpIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IGkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7XG4gICAgICAgICAgICAgIG8gPSBbb1swXSAqIHRbMF0sIG9bMV0gKiB0WzFdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbCA9IHRoaXMuX2NyZWF0ZU1lc2hDYW52YXMobywgYSA9PT0gcy5TSEFESU5HID8gbnVsbCA6IHRoaXMuX2JhY2tncm91bmQsIGUuY2FjaGVkQ2FudmFzZXMpO1xuICAgICAgICAgIGlmIChhICE9PSBzLlNIQURJTkcpIHtcbiAgICAgICAgICAgIHQuc2V0VHJhbnNmb3JtKC4uLmUuYmFzZVRyYW5zZm9ybSk7XG4gICAgICAgICAgICB0aGlzLm1hdHJpeCAmJiB0LnRyYW5zZm9ybSguLi50aGlzLm1hdHJpeCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHQudHJhbnNsYXRlKGwub2Zmc2V0WCwgbC5vZmZzZXRZKTtcbiAgICAgICAgICB0LnNjYWxlKGwuc2NhbGVYLCBsLnNjYWxlWSk7XG4gICAgICAgICAgcmV0dXJuIHQuY3JlYXRlUGF0dGVybihsLmNhbnZhcywgXCJuby1yZXBlYXRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIER1bW15U2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICAgICAgICBnZXRQYXR0ZXJuKCkge1xuICAgICAgICAgIHJldHVybiBcImhvdHBpbmtcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgYSA9IDEsXG4gICAgICAgIG8gPSAyO1xuICAgICAgY2xhc3MgVGlsaW5nUGF0dGVybiB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIGksIHIpIHtcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IHRbMl07XG4gICAgICAgICAgdGhpcy5tYXRyaXggPSB0WzNdIHx8IFsxLCAwLCAwLCAxLCAwLCAwXTtcbiAgICAgICAgICB0aGlzLmJib3ggPSB0WzRdO1xuICAgICAgICAgIHRoaXMueHN0ZXAgPSB0WzVdO1xuICAgICAgICAgIHRoaXMueXN0ZXAgPSB0WzZdO1xuICAgICAgICAgIHRoaXMucGFpbnRUeXBlID0gdFs3XTtcbiAgICAgICAgICB0aGlzLnRpbGluZ1R5cGUgPSB0WzhdO1xuICAgICAgICAgIHRoaXMuY29sb3IgPSBlO1xuICAgICAgICAgIHRoaXMuY3R4ID0gbjtcbiAgICAgICAgICB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeSA9IGk7XG4gICAgICAgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gcjtcbiAgICAgICAgfVxuICAgICAgICBjcmVhdGVQYXR0ZXJuQ2FudmFzKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5vcGVyYXRvckxpc3QsXG4gICAgICAgICAgICBuID0gdGhpcy5iYm94LFxuICAgICAgICAgICAgcyA9IHRoaXMueHN0ZXAsXG4gICAgICAgICAgICBhID0gdGhpcy55c3RlcCxcbiAgICAgICAgICAgIG8gPSB0aGlzLnBhaW50VHlwZSxcbiAgICAgICAgICAgIGwgPSB0aGlzLnRpbGluZ1R5cGUsXG4gICAgICAgICAgICBjID0gdGhpcy5jb2xvcixcbiAgICAgICAgICAgIGggPSB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeTtcbiAgICAgICAgICAoMCwgaS5pbmZvKShcIlRpbGluZ1R5cGU6IFwiICsgbCk7XG4gICAgICAgICAgY29uc3QgZCA9IG5bMF0sXG4gICAgICAgICAgICB1ID0gblsxXSxcbiAgICAgICAgICAgIHAgPSBuWzJdLFxuICAgICAgICAgICAgZiA9IG5bM10sXG4gICAgICAgICAgICBnID0gaS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMubWF0cml4KSxcbiAgICAgICAgICAgIG0gPSBpLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5iYXNlVHJhbnNmb3JtKSxcbiAgICAgICAgICAgIGIgPSBbZ1swXSAqIG1bMF0sIGdbMV0gKiBtWzFdXSxcbiAgICAgICAgICAgIHYgPSB0aGlzLmdldFNpemVBbmRTY2FsZShzLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIGJbMF0pLFxuICAgICAgICAgICAgeSA9IHRoaXMuZ2V0U2l6ZUFuZFNjYWxlKGEsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQsIGJbMV0pLFxuICAgICAgICAgICAgQSA9IHQuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwicGF0dGVyblwiLCB2LnNpemUsIHkuc2l6ZSwgITApLFxuICAgICAgICAgICAgXyA9IEEuY29udGV4dCxcbiAgICAgICAgICAgIFMgPSBoLmNyZWF0ZUNhbnZhc0dyYXBoaWNzKF8pO1xuICAgICAgICAgIFMuZ3JvdXBMZXZlbCA9IHQuZ3JvdXBMZXZlbDtcbiAgICAgICAgICB0aGlzLnNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChTLCBvLCBjKTtcbiAgICAgICAgICBsZXQgRSA9IGQsXG4gICAgICAgICAgICB4ID0gdSxcbiAgICAgICAgICAgIHcgPSBwLFxuICAgICAgICAgICAgQyA9IGY7XG4gICAgICAgICAgaWYgKGQgPCAwKSB7XG4gICAgICAgICAgICBFID0gMDtcbiAgICAgICAgICAgIHcgKz0gTWF0aC5hYnMoZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1IDwgMCkge1xuICAgICAgICAgICAgeCA9IDA7XG4gICAgICAgICAgICBDICs9IE1hdGguYWJzKHUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfLnRyYW5zbGF0ZSgtdi5zY2FsZSAqIEUsIC15LnNjYWxlICogeCk7XG4gICAgICAgICAgUy50cmFuc2Zvcm0odi5zY2FsZSwgMCwgMCwgeS5zY2FsZSwgMCwgMCk7XG4gICAgICAgICAgXy5zYXZlKCk7XG4gICAgICAgICAgdGhpcy5jbGlwQmJveChTLCBFLCB4LCB3LCBDKTtcbiAgICAgICAgICBTLmJhc2VUcmFuc2Zvcm0gPSAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKShTLmN0eCk7XG4gICAgICAgICAgUy5leGVjdXRlT3BlcmF0b3JMaXN0KGUpO1xuICAgICAgICAgIFMuZW5kRHJhd2luZygpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW52YXM6IEEuY2FudmFzLFxuICAgICAgICAgICAgc2NhbGVYOiB2LnNjYWxlLFxuICAgICAgICAgICAgc2NhbGVZOiB5LnNjYWxlLFxuICAgICAgICAgICAgb2Zmc2V0WDogRSxcbiAgICAgICAgICAgIG9mZnNldFk6IHhcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGdldFNpemVBbmRTY2FsZSh0LCBlLCBuKSB7XG4gICAgICAgICAgdCA9IE1hdGguYWJzKHQpO1xuICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLm1heChUaWxpbmdQYXR0ZXJuLk1BWF9QQVRURVJOX1NJWkUsIGUpO1xuICAgICAgICAgIGxldCByID0gTWF0aC5jZWlsKHQgKiBuKTtcbiAgICAgICAgICByID49IGkgPyByID0gaSA6IG4gPSByIC8gdDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2NhbGU6IG4sXG4gICAgICAgICAgICBzaXplOiByXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjbGlwQmJveCh0LCBlLCBuLCBpLCBzKSB7XG4gICAgICAgICAgY29uc3QgYSA9IGkgLSBlLFxuICAgICAgICAgICAgbyA9IHMgLSBuO1xuICAgICAgICAgIHQuY3R4LnJlY3QoZSwgbiwgYSwgbyk7XG4gICAgICAgICAgdC5jdXJyZW50LnVwZGF0ZVJlY3RNaW5NYXgoKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkodC5jdHgpLCBbZSwgbiwgaSwgc10pO1xuICAgICAgICAgIHQuY2xpcCgpO1xuICAgICAgICAgIHQuZW5kUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIHNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dCh0LCBlLCBuKSB7XG4gICAgICAgICAgY29uc3QgciA9IHQuY3R4LFxuICAgICAgICAgICAgcyA9IHQuY3VycmVudDtcbiAgICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNhc2UgYTpcbiAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuY3R4O1xuICAgICAgICAgICAgICByLmZpbGxTdHlsZSA9IHQuZmlsbFN0eWxlO1xuICAgICAgICAgICAgICByLnN0cm9rZVN0eWxlID0gdC5zdHJva2VTdHlsZTtcbiAgICAgICAgICAgICAgcy5maWxsQ29sb3IgPSB0LmZpbGxTdHlsZTtcbiAgICAgICAgICAgICAgcy5zdHJva2VDb2xvciA9IHQuc3Ryb2tlU3R5bGU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBvOlxuICAgICAgICAgICAgICBjb25zdCBsID0gaS5VdGlsLm1ha2VIZXhDb2xvcihuWzBdLCBuWzFdLCBuWzJdKTtcbiAgICAgICAgICAgICAgci5maWxsU3R5bGUgPSBsO1xuICAgICAgICAgICAgICByLnN0cm9rZVN0eWxlID0gbDtcbiAgICAgICAgICAgICAgcy5maWxsQ29sb3IgPSBsO1xuICAgICAgICAgICAgICBzLnN0cm9rZUNvbG9yID0gbDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcihcIlVuc3VwcG9ydGVkIHBhaW50IHR5cGU6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldFBhdHRlcm4odCwgZSwgbiwgcikge1xuICAgICAgICAgIGxldCBhID0gbjtcbiAgICAgICAgICBpZiAociAhPT0gcy5TSEFESU5HKSB7XG4gICAgICAgICAgICBhID0gaS5VdGlsLnRyYW5zZm9ybShhLCBlLmJhc2VUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgdGhpcy5tYXRyaXggJiYgKGEgPSBpLlV0aWwudHJhbnNmb3JtKGEsIHRoaXMubWF0cml4KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG8gPSB0aGlzLmNyZWF0ZVBhdHRlcm5DYW52YXMoZSk7XG4gICAgICAgICAgbGV0IGwgPSBuZXcgRE9NTWF0cml4KGEpO1xuICAgICAgICAgIGwgPSBsLnRyYW5zbGF0ZShvLm9mZnNldFgsIG8ub2Zmc2V0WSk7XG4gICAgICAgICAgbCA9IGwuc2NhbGUoMSAvIG8uc2NhbGVYLCAxIC8gby5zY2FsZVkpO1xuICAgICAgICAgIGNvbnN0IGMgPSB0LmNyZWF0ZVBhdHRlcm4oby5jYW52YXMsIFwicmVwZWF0XCIpO1xuICAgICAgICAgIGMuc2V0VHJhbnNmb3JtKGwpO1xuICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfZGVmaW5lUHJvcGVydHkoVGlsaW5nUGF0dGVybiwgXCJNQVhfUEFUVEVSTl9TSVpFXCIsIDNlMyk7XG4gICAgICBlLlRpbGluZ1BhdHRlcm4gPSBUaWxpbmdQYXR0ZXJuO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBID0gY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkE7XG4gICAgICBlLmNvbnZlcnRUb1JHQkEgPSBmdW5jdGlvbiBjb252ZXJ0VG9SR0JBKHQpIHtcbiAgICAgICAgc3dpdGNoICh0LmtpbmQpIHtcbiAgICAgICAgICBjYXNlIGkuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOlxuICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHQpO1xuICAgICAgICAgIGNhc2UgaS5JbWFnZUtpbmQuUkdCXzI0QlBQOlxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnZlcnRSR0JUb1JHQkEodCkge1xuICAgICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICAgICAgc3JjOiBlLFxuICAgICAgICAgICAgICAgICAgc3JjUG9zOiBuID0gMCxcbiAgICAgICAgICAgICAgICAgIGRlc3Q6IHIsXG4gICAgICAgICAgICAgICAgICBkZXN0UG9zOiBzID0gMCxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBhLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBvXG4gICAgICAgICAgICAgICAgfSA9IHQsXG4gICAgICAgICAgICAgICAgbCA9IDA7XG4gICAgICAgICAgICAgIGNvbnN0IGMgPSBlLmxlbmd0aCA+PiAyLFxuICAgICAgICAgICAgICAgIGggPSBuZXcgVWludDMyQXJyYXkoZS5idWZmZXIsIG4sIGMpO1xuICAgICAgICAgICAgICBpZiAoaS5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikge1xuICAgICAgICAgICAgICAgIGZvciAoOyBsIDwgYyAtIDI7IGwgKz0gMywgcyArPSA0KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0ID0gaFtsXSxcbiAgICAgICAgICAgICAgICAgICAgZSA9IGhbbCArIDFdLFxuICAgICAgICAgICAgICAgICAgICBuID0gaFtsICsgMl07XG4gICAgICAgICAgICAgICAgICByW3NdID0gNDI3ODE5MDA4MCB8IHQ7XG4gICAgICAgICAgICAgICAgICByW3MgKyAxXSA9IHQgPj4+IDI0IHwgZSA8PCA4IHwgNDI3ODE5MDA4MDtcbiAgICAgICAgICAgICAgICAgIHJbcyArIDJdID0gZSA+Pj4gMTYgfCBuIDw8IDE2IHwgNDI3ODE5MDA4MDtcbiAgICAgICAgICAgICAgICAgIHJbcyArIDNdID0gbiA+Pj4gOCB8IDQyNzgxOTAwODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgPSA0ICogbCwgbiA9IGUubGVuZ3RoOyB0IDwgbjsgdCArPSAzKSByW3MrK10gPSBlW3RdIHwgZVt0ICsgMV0gPDwgOCB8IGVbdCArIDJdIDw8IDE2IHwgNDI3ODE5MDA4MDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKDsgbCA8IGMgLSAyOyBsICs9IDMsIHMgKz0gNCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGhbbF0sXG4gICAgICAgICAgICAgICAgICAgIGUgPSBoW2wgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgbiA9IGhbbCArIDJdO1xuICAgICAgICAgICAgICAgICAgcltzXSA9IDI1NSB8IHQ7XG4gICAgICAgICAgICAgICAgICByW3MgKyAxXSA9IHQgPDwgMjQgfCBlID4+PiA4IHwgMjU1O1xuICAgICAgICAgICAgICAgICAgcltzICsgMl0gPSBlIDw8IDE2IHwgbiA+Pj4gMTYgfCAyNTU7XG4gICAgICAgICAgICAgICAgICByW3MgKyAzXSA9IG4gPDwgOCB8IDI1NTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdCA9IDQgKiBsLCBuID0gZS5sZW5ndGg7IHQgPCBuOyB0ICs9IDMpIHJbcysrXSA9IGVbdF0gPDwgMjQgfCBlW3QgKyAxXSA8PCAxNiB8IGVbdCArIDJdIDw8IDggfCAyNTU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzcmNQb3M6IG4sXG4gICAgICAgICAgICAgICAgZGVzdFBvczogc1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICBlLmdyYXlUb1JHQkEgPSBmdW5jdGlvbiBncmF5VG9SR0JBKHQsIGUpIHtcbiAgICAgICAgaWYgKGkuRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuKyspIGVbbl0gPSA2NTc5MyAqIHRbbl0gfCA0Mjc4MTkwMDgwO2Vsc2UgZm9yIChsZXQgbiA9IDAsIGkgPSB0Lmxlbmd0aDsgbiA8IGk7IG4rKykgZVtuXSA9IDE2ODQzMDA4ICogdFtuXSB8IDI1NTtcbiAgICAgIH07XG4gICAgICBuKDkzKTtcbiAgICAgIG4oMTAxKTtcbiAgICAgIG4oMTAyKTtcbiAgICAgIG4oMTA1KTtcbiAgICAgIG4oMTA3KTtcbiAgICAgIG4oMTA5KTtcbiAgICAgIG4oMTEzKTtcbiAgICAgIG4oMTE2KTtcbiAgICAgIG4oMTIzKTtcbiAgICAgIHZhciBpID0gbigxKTtcbiAgICAgIGZ1bmN0aW9uIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHQpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBzcmM6IGUsXG4gICAgICAgICAgc3JjUG9zOiBuID0gMCxcbiAgICAgICAgICBkZXN0OiByLFxuICAgICAgICAgIHdpZHRoOiBzLFxuICAgICAgICAgIGhlaWdodDogYSxcbiAgICAgICAgICBub25CbGFja0NvbG9yOiBvID0gNDI5NDk2NzI5NSxcbiAgICAgICAgICBpbnZlcnNlRGVjb2RlOiBsID0gITFcbiAgICAgICAgfSA9IHQ7XG4gICAgICAgIGNvbnN0IGMgPSBpLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8gNDI3ODE5MDA4MCA6IDI1NSxcbiAgICAgICAgICBbaCwgZF0gPSBsID8gW28sIGNdIDogW2MsIG9dLFxuICAgICAgICAgIHUgPSBzID4+IDMsXG4gICAgICAgICAgcCA9IDcgJiBzLFxuICAgICAgICAgIGYgPSBlLmxlbmd0aDtcbiAgICAgICAgciA9IG5ldyBVaW50MzJBcnJheShyLmJ1ZmZlcik7XG4gICAgICAgIGxldCBnID0gMDtcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCBhOyB0KyspIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgPSBuICsgdTsgbiA8IHQ7IG4rKykge1xuICAgICAgICAgICAgY29uc3QgdCA9IG4gPCBmID8gZVtuXSA6IDI1NTtcbiAgICAgICAgICAgIHJbZysrXSA9IDEyOCAmIHQgPyBkIDogaDtcbiAgICAgICAgICAgIHJbZysrXSA9IDY0ICYgdCA/IGQgOiBoO1xuICAgICAgICAgICAgcltnKytdID0gMzIgJiB0ID8gZCA6IGg7XG4gICAgICAgICAgICByW2crK10gPSAxNiAmIHQgPyBkIDogaDtcbiAgICAgICAgICAgIHJbZysrXSA9IDggJiB0ID8gZCA6IGg7XG4gICAgICAgICAgICByW2crK10gPSA0ICYgdCA/IGQgOiBoO1xuICAgICAgICAgICAgcltnKytdID0gMiAmIHQgPyBkIDogaDtcbiAgICAgICAgICAgIHJbZysrXSA9IDEgJiB0ID8gZCA6IGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgwID09PSBwKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCB0ID0gbiA8IGYgPyBlW24rK10gOiAyNTU7XG4gICAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCBwOyBlKyspIHJbZysrXSA9IHQgJiAxIDw8IDcgLSBlID8gZCA6IGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcmNQb3M6IG4sXG4gICAgICAgICAgZGVzdFBvczogZ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sICh0LCBlKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLkdsb2JhbFdvcmtlck9wdGlvbnMgPSB2b2lkIDA7XG4gICAgICBjb25zdCBuID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGUuR2xvYmFsV29ya2VyT3B0aW9ucyA9IG47XG4gICAgICBuLndvcmtlclBvcnQgPSBudWxsO1xuICAgICAgbi53b3JrZXJTcmMgPSBcIlwiO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9YdCwgXyR0LCBfS3Q7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuTWVzc2FnZUhhbmRsZXIgPSB2b2lkIDA7XG4gICAgICBuKDIpO1xuICAgICAgdmFyIGkgPSBuKDEpO1xuICAgICAgY29uc3QgciA9IDEsXG4gICAgICAgIHMgPSAyLFxuICAgICAgICBhID0gMSxcbiAgICAgICAgbyA9IDIsXG4gICAgICAgIGwgPSAzLFxuICAgICAgICBjID0gNCxcbiAgICAgICAgaCA9IDUsXG4gICAgICAgIGQgPSA2LFxuICAgICAgICB1ID0gNyxcbiAgICAgICAgcCA9IDg7XG4gICAgICBmdW5jdGlvbiB3cmFwUmVhc29uKHQpIHtcbiAgICAgICAgdCBpbnN0YW5jZW9mIEVycm9yIHx8IFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgbnVsbCAhPT0gdCB8fCAoMCwgaS51bnJlYWNoYWJsZSkoJ3dyYXBSZWFzb246IEV4cGVjdGVkIFwicmVhc29uXCIgdG8gYmUgYSAocG9zc2libHkgY2xvbmVkKSBFcnJvci4nKTtcbiAgICAgICAgc3dpdGNoICh0Lm5hbWUpIHtcbiAgICAgICAgICBjYXNlIFwiQWJvcnRFeGNlcHRpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgaS5BYm9ydEV4Y2VwdGlvbih0Lm1lc3NhZ2UpO1xuICAgICAgICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGkuTWlzc2luZ1BERkV4Y2VwdGlvbih0Lm1lc3NhZ2UpO1xuICAgICAgICAgIGNhc2UgXCJQYXNzd29yZEV4Y2VwdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBpLlBhc3N3b3JkRXhjZXB0aW9uKHQubWVzc2FnZSwgdC5jb2RlKTtcbiAgICAgICAgICBjYXNlIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGkuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHQubWVzc2FnZSwgdC5zdGF0dXMpO1xuICAgICAgICAgIGNhc2UgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgaS5Vbmtub3duRXJyb3JFeGNlcHRpb24odC5tZXNzYWdlLCB0LmRldGFpbHMpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGkuVW5rbm93bkVycm9yRXhjZXB0aW9uKHQubWVzc2FnZSwgdC50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5NZXNzYWdlSGFuZGxlciA9IChfWHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKSwgXyR0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCksIF9LdCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpLCBjbGFzcyBNZXNzYWdlSGFuZGxlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF90MTEsIF9lMTAsIF9uNikge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfS3QpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfJHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfWHQpO1xuICAgICAgICAgIHRoaXMuc291cmNlTmFtZSA9IF90MTE7XG4gICAgICAgICAgdGhpcy50YXJnZXROYW1lID0gX2UxMDtcbiAgICAgICAgICB0aGlzLmNvbU9iaiA9IF9uNjtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrSWQgPSAxO1xuICAgICAgICAgIHRoaXMuc3RyZWFtSWQgPSAxO1xuICAgICAgICAgIHRoaXMuc3RyZWFtU2lua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuYWN0aW9uSGFuZGxlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UgPSB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LmRhdGE7XG4gICAgICAgICAgICBpZiAoZS50YXJnZXROYW1lICE9PSB0aGlzLnNvdXJjZU5hbWUpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChlLnN0cmVhbSkge1xuICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF8kdCwgXyR0MikuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGUuY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IGUuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgICAgICBuID0gdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1t0XTtcbiAgICAgICAgICAgICAgaWYgKCFuKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVzb2x2ZSBjYWxsYmFjayBcIi5jb25jYXQodCkpO1xuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1t0XTtcbiAgICAgICAgICAgICAgaWYgKGUuY2FsbGJhY2sgPT09IHIpIG4ucmVzb2x2ZShlLmRhdGEpO2Vsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChlLmNhbGxiYWNrICE9PSBzKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2VcIik7XG4gICAgICAgICAgICAgICAgbi5yZWplY3Qod3JhcFJlYXNvbihlLnJlYXNvbikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmFjdGlvbkhhbmRsZXJbZS5hY3Rpb25dO1xuICAgICAgICAgICAgaWYgKCFpKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogXCIuY29uY2F0KGUuYWN0aW9uKSk7XG4gICAgICAgICAgICBpZiAoZS5jYWxsYmFja0lkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgICAgYSA9IGUuc291cmNlTmFtZTtcbiAgICAgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB0KGkoZS5kYXRhKSk7XG4gICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICBfbjYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgc291cmNlTmFtZTogdCxcbiAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IGEsXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogcixcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGUuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICBfbjYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgc291cmNlTmFtZTogdCxcbiAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IGEsXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogcyxcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGUuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBlLnN0cmVhbUlkID8gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfWHQsIF9YdDIpLmNhbGwodGhpcywgZSkgOiBpKGUuZGF0YSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBfbjYuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIG9uKHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5hY3Rpb25IYW5kbGVyO1xuICAgICAgICAgIGlmIChuW3RdKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBhbHJlYWR5IGFuIGFjdGlvbk5hbWUgY2FsbGVkIFxcXCJcIi5jb25jYXQodCwgXCJcXFwiXCIpKTtcbiAgICAgICAgICBuW3RdID0gZTtcbiAgICAgICAgfVxuICAgICAgICBzZW5kKHQsIGUsIG4pIHtcbiAgICAgICAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsXG4gICAgICAgICAgICBhY3Rpb246IHQsXG4gICAgICAgICAgICBkYXRhOiBlXG4gICAgICAgICAgfSwgbik7XG4gICAgICAgIH1cbiAgICAgICAgc2VuZFdpdGhQcm9taXNlKHQsIGUsIG4pIHtcbiAgICAgICAgICBjb25zdCByID0gdGhpcy5jYWxsYmFja0lkKyssXG4gICAgICAgICAgICBzID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW3JdID0gcztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgYWN0aW9uOiB0LFxuICAgICAgICAgICAgICBjYWxsYmFja0lkOiByLFxuICAgICAgICAgICAgICBkYXRhOiBlXG4gICAgICAgICAgICB9LCBuKTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBzLnJlamVjdCh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHMucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBzZW5kV2l0aFN0cmVhbSh0LCBlLCBuLCByKSB7XG4gICAgICAgICAgY29uc3QgcyA9IHRoaXMuc3RyZWFtSWQrKyxcbiAgICAgICAgICAgIG8gPSB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgICBsID0gdGhpcy50YXJnZXROYW1lLFxuICAgICAgICAgICAgYyA9IHRoaXMuY29tT2JqO1xuICAgICAgICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgICAgICAgc3RhcnQ6IG4gPT4ge1xuICAgICAgICAgICAgICBjb25zdCBhID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzXSA9IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBuLFxuICAgICAgICAgICAgICAgIHN0YXJ0Q2FsbDogYSxcbiAgICAgICAgICAgICAgICBwdWxsQ2FsbDogbnVsbCxcbiAgICAgICAgICAgICAgICBjYW5jZWxDYWxsOiBudWxsLFxuICAgICAgICAgICAgICAgIGlzQ2xvc2VkOiAhMVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBjLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBvLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IGwsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB0LFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBzLFxuICAgICAgICAgICAgICAgIGRhdGE6IGUsXG4gICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG4uZGVzaXJlZFNpemVcbiAgICAgICAgICAgICAgfSwgcik7XG4gICAgICAgICAgICAgIHJldHVybiBhLnByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHVsbDogdCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3NdLnB1bGxDYWxsID0gZTtcbiAgICAgICAgICAgICAgYy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgc291cmNlTmFtZTogbyxcbiAgICAgICAgICAgICAgICB0YXJnZXROYW1lOiBsLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogZCxcbiAgICAgICAgICAgICAgICBzdHJlYW1JZDogcyxcbiAgICAgICAgICAgICAgICBkZXNpcmVkU2l6ZTogdC5kZXNpcmVkU2l6ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGUucHJvbWlzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYW5jZWw6IHQgPT4ge1xuICAgICAgICAgICAgICAoMCwgaS5hc3NlcnQpKHQgaW5zdGFuY2VvZiBFcnJvciwgXCJjYW5jZWwgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uXCIpO1xuICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzXS5jYW5jZWxDYWxsID0gZTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzXS5pc0Nsb3NlZCA9ICEwO1xuICAgICAgICAgICAgICBjLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBvLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IGwsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiBhLFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBzLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbih0KVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGUucHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBuKTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgIHRoaXMuY29tT2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmdW5jdGlvbiBfWHQyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuc3RyZWFtSWQsXG4gICAgICAgICAgbiA9IHRoaXMuc291cmNlTmFtZSxcbiAgICAgICAgICByID0gdC5zb3VyY2VOYW1lLFxuICAgICAgICAgIHMgPSB0aGlzLmNvbU9iaixcbiAgICAgICAgICBhID0gdGhpcyxcbiAgICAgICAgICBvID0gdGhpcy5hY3Rpb25IYW5kbGVyW3QuYWN0aW9uXSxcbiAgICAgICAgICBkID0ge1xuICAgICAgICAgICAgZW5xdWV1ZSh0KSB7XG4gICAgICAgICAgICAgIGxldCBhID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiAxLFxuICAgICAgICAgICAgICAgIG8gPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgY29uc3QgbCA9IHRoaXMuZGVzaXJlZFNpemU7XG4gICAgICAgICAgICAgIHRoaXMuZGVzaXJlZFNpemUgLT0gYTtcbiAgICAgICAgICAgICAgaWYgKGwgPiAwICYmIHRoaXMuZGVzaXJlZFNpemUgPD0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2lua0NhcGFiaWxpdHkgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZHkgPSB0aGlzLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgc291cmNlTmFtZTogbixcbiAgICAgICAgICAgICAgICB0YXJnZXROYW1lOiByLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogYyxcbiAgICAgICAgICAgICAgICBzdHJlYW1JZDogZSxcbiAgICAgICAgICAgICAgICBjaHVuazogdFxuICAgICAgICAgICAgICB9LCBvKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZSgpIHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9ICEwO1xuICAgICAgICAgICAgICAgIHMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgc291cmNlTmFtZTogbixcbiAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHIsXG4gICAgICAgICAgICAgICAgICBzdHJlYW06IGwsXG4gICAgICAgICAgICAgICAgICBzdHJlYW1JZDogZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBhLnN0cmVhbVNpbmtzW2VdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3IodCkge1xuICAgICAgICAgICAgICAoMCwgaS5hc3NlcnQpKHQgaW5zdGFuY2VvZiBFcnJvciwgXCJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb25cIik7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSAhMDtcbiAgICAgICAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZU5hbWU6IG4sXG4gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lOiByLFxuICAgICAgICAgICAgICAgICAgc3RyZWFtOiBoLFxuICAgICAgICAgICAgICAgICAgc3RyZWFtSWQ6IGUsXG4gICAgICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24odClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpbmtDYXBhYmlsaXR5OiBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpLFxuICAgICAgICAgICAgb25QdWxsOiBudWxsLFxuICAgICAgICAgICAgb25DYW5jZWw6IG51bGwsXG4gICAgICAgICAgICBpc0NhbmNlbGxlZDogITEsXG4gICAgICAgICAgICBkZXNpcmVkU2l6ZTogdC5kZXNpcmVkU2l6ZSxcbiAgICAgICAgICAgIHJlYWR5OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgZC5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgIGQucmVhZHkgPSBkLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIHRoaXMuc3RyZWFtU2lua3NbZV0gPSBkO1xuICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGUobyh0LmRhdGEsIGQpKTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lOiBuLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZTogcixcbiAgICAgICAgICAgIHN0cmVhbTogcCxcbiAgICAgICAgICAgIHN0cmVhbUlkOiBlLFxuICAgICAgICAgICAgc3VjY2VzczogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWU6IG4sXG4gICAgICAgICAgICB0YXJnZXROYW1lOiByLFxuICAgICAgICAgICAgc3RyZWFtOiBwLFxuICAgICAgICAgICAgc3RyZWFtSWQ6IGUsXG4gICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24odClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfJHQyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuc3RyZWFtSWQsXG4gICAgICAgICAgbiA9IHRoaXMuc291cmNlTmFtZSxcbiAgICAgICAgICByID0gdC5zb3VyY2VOYW1lLFxuICAgICAgICAgIHMgPSB0aGlzLmNvbU9iaixcbiAgICAgICAgICBmID0gdGhpcy5zdHJlYW1Db250cm9sbGVyc1tlXSxcbiAgICAgICAgICBnID0gdGhpcy5zdHJlYW1TaW5rc1tlXTtcbiAgICAgICAgc3dpdGNoICh0LnN0cmVhbSkge1xuICAgICAgICAgIGNhc2UgcDpcbiAgICAgICAgICAgIHQuc3VjY2VzcyA/IGYuc3RhcnRDYWxsLnJlc29sdmUoKSA6IGYuc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKHQucmVhc29uKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIHU6XG4gICAgICAgICAgICB0LnN1Y2Nlc3MgPyBmLnB1bGxDYWxsLnJlc29sdmUoKSA6IGYucHVsbENhbGwucmVqZWN0KHdyYXBSZWFzb24odC5yZWFzb24pKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgZDpcbiAgICAgICAgICAgIGlmICghZykge1xuICAgICAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBuLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHIsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiB1LFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBlLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ICEwXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGcuZGVzaXJlZFNpemUgPD0gMCAmJiB0LmRlc2lyZWRTaXplID4gMCAmJiBnLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICAgIGcuZGVzaXJlZFNpemUgPSB0LmRlc2lyZWRTaXplO1xuICAgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgdmFyIF9nJG9uUHVsbDtcbiAgICAgICAgICAgICAgdCgoX2ckb25QdWxsID0gZy5vblB1bGwpID09PSBudWxsIHx8IF9nJG9uUHVsbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ckb25QdWxsLmNhbGwoZykpO1xuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHNvdXJjZU5hbWU6IG4sXG4gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZTogcixcbiAgICAgICAgICAgICAgICBzdHJlYW06IHUsXG4gICAgICAgICAgICAgICAgc3RyZWFtSWQ6IGUsXG4gICAgICAgICAgICAgICAgc3VjY2VzczogITBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBuLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHIsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiB1LFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBlLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbih0KVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBjOlxuICAgICAgICAgICAgKDAsIGkuYXNzZXJ0KShmLCBcImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICBpZiAoZi5pc0Nsb3NlZCkgYnJlYWs7XG4gICAgICAgICAgICBmLmNvbnRyb2xsZXIuZW5xdWV1ZSh0LmNodW5rKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgbDpcbiAgICAgICAgICAgICgwLCBpLmFzc2VydCkoZiwgXCJjbG9zZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIGlmIChmLmlzQ2xvc2VkKSBicmVhaztcbiAgICAgICAgICAgIGYuaXNDbG9zZWQgPSAhMDtcbiAgICAgICAgICAgIGYuY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfS3QsIF9LdDIpLmNhbGwodGhpcywgZiwgZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIGg6XG4gICAgICAgICAgICAoMCwgaS5hc3NlcnQpKGYsIFwiZXJyb3Igc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICBmLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbih0LnJlYXNvbikpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfS3QsIF9LdDIpLmNhbGwodGhpcywgZiwgZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIG86XG4gICAgICAgICAgICB0LnN1Y2Nlc3MgPyBmLmNhbmNlbENhbGwucmVzb2x2ZSgpIDogZi5jYW5jZWxDYWxsLnJlamVjdCh3cmFwUmVhc29uKHQucmVhc29uKSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9LdCwgX0t0MikuY2FsbCh0aGlzLCBmLCBlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgYTpcbiAgICAgICAgICAgIGlmICghZykgYnJlYWs7XG4gICAgICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICB2YXIgX2ckb25DYW5jZWw7XG4gICAgICAgICAgICAgIGUoKF9nJG9uQ2FuY2VsID0gZy5vbkNhbmNlbCkgPT09IG51bGwgfHwgX2ckb25DYW5jZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nJG9uQ2FuY2VsLmNhbGwoZywgd3JhcFJlYXNvbih0LnJlYXNvbikpKTtcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBuLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHIsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiBvLFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBlLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ICEwXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgcy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgc291cmNlTmFtZTogbixcbiAgICAgICAgICAgICAgICB0YXJnZXROYW1lOiByLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogbyxcbiAgICAgICAgICAgICAgICBzdHJlYW1JZDogZSxcbiAgICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24odClcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGcuc2lua0NhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24odC5yZWFzb24pKTtcbiAgICAgICAgICAgIGcuaXNDYW5jZWxsZWQgPSAhMDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW2VdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2VcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIF9LdDIodCwgZSkge1xuICAgICAgICB2YXIgX3Qkc3RhcnRDYWxsLCBfdCRwdWxsQ2FsbCwgX3QkY2FuY2VsQ2FsbDtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsoX3Qkc3RhcnRDYWxsID0gdC5zdGFydENhbGwpID09PSBudWxsIHx8IF90JHN0YXJ0Q2FsbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Qkc3RhcnRDYWxsLnByb21pc2UsIChfdCRwdWxsQ2FsbCA9IHQucHVsbENhbGwpID09PSBudWxsIHx8IF90JHB1bGxDYWxsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdCRwdWxsQ2FsbC5wcm9taXNlLCAoX3QkY2FuY2VsQ2FsbCA9IHQuY2FuY2VsQ2FsbCkgPT09IG51bGwgfHwgX3QkY2FuY2VsQ2FsbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3QkY2FuY2VsQ2FsbC5wcm9taXNlXSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW2VdO1xuICAgICAgfVxuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9ZdCwgX0p0O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLk1ldGFkYXRhID0gdm9pZCAwO1xuICAgICAgdmFyIGkgPSBuKDEpO1xuICAgICAgZS5NZXRhZGF0YSA9IChfWXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKSwgX0p0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIGNsYXNzIE1ldGFkYXRhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9ZdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0p0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgcGFyc2VkRGF0YTogZSxcbiAgICAgICAgICAgIHJhd0RhdGE6IG5cbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1l0LCBlKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0p0LCBuKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRSYXcoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSnQpO1xuICAgICAgICB9XG4gICAgICAgIGdldCh0KSB7XG4gICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDg7XG4gICAgICAgICAgcmV0dXJuIChfY2xhc3NQcml2YXRlRmllbGRHZXQ4ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZdCkuZ2V0KHQpKSAhPT0gbnVsbCAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQ4ICE9PSB2b2lkIDAgPyBfY2xhc3NQcml2YXRlRmllbGRHZXQ4IDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXRBbGwoKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBpLm9iamVjdEZyb21NYXApKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWXQpKTtcbiAgICAgICAgfVxuICAgICAgICBoYXModCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1l0KS5oYXModCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9adCwgX3RlLCBfZWUsIF9uZSwgX2llO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLk9wdGlvbmFsQ29udGVudENvbmZpZyA9IHZvaWQgMDtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY5KTtcbiAgICAgIGNvbnN0IHMgPSBTeW1ib2woXCJJTlRFUk5BTFwiKTtcbiAgICAgIHZhciBfUXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNsYXNzIE9wdGlvbmFsQ29udGVudEdyb3VwIHtcbiAgICAgICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9RdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0O1xuICAgICAgICAgIHRoaXMuaW50ZW50ID0gZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgdmlzaWJsZSgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9RdCk7XG4gICAgICAgIH1cbiAgICAgICAgX3NldFZpc2libGUodCwgZSkge1xuICAgICAgICAgIHQgIT09IHMgJiYgKDAsIGkudW5yZWFjaGFibGUpKFwiSW50ZXJuYWwgbWV0aG9kIGBfc2V0VmlzaWJsZWAgY2FsbGVkLlwiKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1F0LCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5PcHRpb25hbENvbnRlbnRDb25maWcgPSAoX1p0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIF90ZSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpLCBfZWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKSwgX25lID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIF9pZSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpLCBjbGFzcyBPcHRpb25hbENvbnRlbnRDb25maWcge1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDEyKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9pZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1p0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3RlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgTWFwKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZWUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY3JlYXRvciA9IG51bGw7XG4gICAgICAgICAgaWYgKG51bGwgIT09IF90MTIpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IF90MTIubmFtZTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRvciA9IF90MTIuY3JlYXRvcjtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbmUsIF90MTIub3JkZXIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIF90MTIuZ3JvdXBzKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5zZXQoZS5pZCwgbmV3IE9wdGlvbmFsQ29udGVudEdyb3VwKGUubmFtZSwgZS5pbnRlbnQpKTtcbiAgICAgICAgICAgIGlmIChcIk9GRlwiID09PSBfdDEyLmJhc2VTdGF0ZSkgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLnZhbHVlcygpKSB0Ll9zZXRWaXNpYmxlKHMsICExKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBfdDEyLm9uKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQoZSkuX3NldFZpc2libGUocywgITApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIF90MTIub2ZmKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQoZSkuX3NldFZpc2libGUocywgITEpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9lZSwgdGhpcy5nZXRIYXNoKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpc1Zpc2libGUodCkge1xuICAgICAgICAgIGlmICgwID09PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5zaXplKSByZXR1cm4gITA7XG4gICAgICAgICAgaWYgKCF0KSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKShcIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXCJPQ0dcIiA9PT0gdC50eXBlKSB7XG4gICAgICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLmhhcyh0LmlkKSkge1xuICAgICAgICAgICAgICAoMCwgaS53YXJuKShcIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiBcIi5jb25jYXQodC5pZCkpO1xuICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkuZ2V0KHQuaWQpLnZpc2libGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcIk9DTURcIiA9PT0gdC50eXBlKSB7XG4gICAgICAgICAgICBpZiAodC5leHByZXNzaW9uKSByZXR1cm4gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfaWUsIF9pZTIpLmNhbGwodGhpcywgdC5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIGlmICghdC5wb2xpY3kgfHwgXCJBbnlPblwiID09PSB0LnBvbGljeSkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdC5pZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLmhhcyhlKSkge1xuICAgICAgICAgICAgICAgICAgKDAsIGkud2FybikoXCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogXCIuY29uY2F0KGUpKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLmdldChlKS52aXNpYmxlKSByZXR1cm4gITA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFwiQWxsT25cIiA9PT0gdC5wb2xpY3kpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQuaWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5oYXMoZSkpIHtcbiAgICAgICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkuZ2V0KGUpLnZpc2libGUpIHJldHVybiAhMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJBbnlPZmZcIiA9PT0gdC5wb2xpY3kpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQuaWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5oYXMoZSkpIHtcbiAgICAgICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkuZ2V0KGUpLnZpc2libGUpIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJBbGxPZmZcIiA9PT0gdC5wb2xpY3kpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQuaWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5oYXMoZSkpIHtcbiAgICAgICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQoZSkudmlzaWJsZSkgcmV0dXJuICExO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICgwLCBpLndhcm4pKFwiVW5rbm93biBvcHRpb25hbCBjb250ZW50IHBvbGljeSBcIi5jb25jYXQodC5wb2xpY3ksIFwiLlwiKSk7XG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgfVxuICAgICAgICAgICgwLCBpLndhcm4pKFwiVW5rbm93biBncm91cCB0eXBlIFwiLmNvbmNhdCh0LnR5cGUsIFwiLlwiKSk7XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICB9XG4gICAgICAgIHNldFZpc2liaWxpdHkodCkge1xuICAgICAgICAgIGxldCBlID0gIShhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSkgfHwgYXJndW1lbnRzWzFdO1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5oYXModCkpIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLmdldCh0KS5fc2V0VmlzaWJsZShzLCAhIWUpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9adCwgbnVsbCk7XG4gICAgICAgICAgfSBlbHNlICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdCh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGhhc0luaXRpYWxWaXNpYmlsaXR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldEhhc2goKSA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9lZSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0T3JkZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLnNpemUgPyBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX25lKSA/IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbmUpLnNsaWNlKCkgOiBbLi4uX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkua2V5cygpXSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0R3JvdXBzKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5zaXplID4gMCA/ICgwLCBpLm9iamVjdEZyb21NYXApKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpKSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0R3JvdXAodCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQodCkgfHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXRIYXNoKCkge1xuICAgICAgICAgIGlmIChudWxsICE9PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1p0KSkgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWnQpO1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgci5NdXJtdXJIYXNoM182NCgpO1xuICAgICAgICAgIGZvciAoY29uc3QgW2UsIG5dIG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpKSB0LnVwZGF0ZShcIlwiLmNvbmNhdChlLCBcIjpcIikuY29uY2F0KG4udmlzaWJsZSkpO1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1p0LCB0LmhleGRpZ2VzdCgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmdW5jdGlvbiBfaWUyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubGVuZ3RoO1xuICAgICAgICBpZiAoZSA8IDIpIHJldHVybiAhMDtcbiAgICAgICAgY29uc3QgbiA9IHRbMF07XG4gICAgICAgIGZvciAobGV0IHIgPSAxOyByIDwgZTsgcisrKSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRbcl07XG4gICAgICAgICAgbGV0IHM7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHMgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9pZSwgX2llMikuY2FsbCh0aGlzLCBlKTtlbHNlIHtcbiAgICAgICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkuaGFzKGUpKSB7XG4gICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHMgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQoZSkudmlzaWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgICBjYXNlIFwiQW5kXCI6XG4gICAgICAgICAgICAgIGlmICghcykgcmV0dXJuICExO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJPclwiOlxuICAgICAgICAgICAgICBpZiAocykgcmV0dXJuICEwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJOb3RcIjpcbiAgICAgICAgICAgICAgcmV0dXJuICFzO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJBbmRcIiA9PT0gbjtcbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5QREZEYXRhVHJhbnNwb3J0U3RyZWFtID0gdm9pZCAwO1xuICAgICAgbig5Myk7XG4gICAgICBuKDEwMSk7XG4gICAgICBuKDEwMik7XG4gICAgICBuKDEwNSk7XG4gICAgICBuKDEwNyk7XG4gICAgICBuKDEwOSk7XG4gICAgICBuKDExMyk7XG4gICAgICBuKDExNik7XG4gICAgICBuKDEyMyk7XG4gICAgICBuKDg5KTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY3KTtcbiAgICAgIGUuUERGRGF0YVRyYW5zcG9ydFN0cmVhbSA9IGNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGxlbmd0aDogbixcbiAgICAgICAgICAgIGluaXRpYWxEYXRhOiByLFxuICAgICAgICAgICAgcHJvZ3Jlc3NpdmVEb25lOiBzID0gITEsXG4gICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTogYSA9IG51bGwsXG4gICAgICAgICAgICBkaXNhYmxlUmFuZ2U6IG8gPSAhMSxcbiAgICAgICAgICAgIGRpc2FibGVTdHJlYW06IGwgPSAhMVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICgwLCBpLmFzc2VydCkoZSwgJ1BERkRhdGFUcmFuc3BvcnRTdHJlYW0gLSBtaXNzaW5nIHJlcXVpcmVkIFwicGRmRGF0YVJhbmdlVHJhbnNwb3J0XCIgYXJndW1lbnQuJyk7XG4gICAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gW107XG4gICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gcztcbiAgICAgICAgICB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IGE7XG4gICAgICAgICAgaWYgKChyID09PSBudWxsIHx8IHIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHIubGVuZ3RoKSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSByIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiByLmJ5dGVMZW5ndGggPT09IHIuYnVmZmVyLmJ5dGVMZW5ndGggPyByLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KHIpLmJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQgPSBlO1xuICAgICAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIWw7XG4gICAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFvO1xuICAgICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBuO1xuICAgICAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9yYW5nZVJlYWRlcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUmFuZ2VMaXN0ZW5lcigodCwgZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25SZWNlaXZlRGF0YSh7XG4gICAgICAgICAgICAgIGJlZ2luOiB0LFxuICAgICAgICAgICAgICBjaHVuazogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzTGlzdGVuZXIoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgICBsb2FkZWQ6IHQsXG4gICAgICAgICAgICAgIHRvdGFsOiBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIodCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vblJlY2VpdmVEYXRhKHtcbiAgICAgICAgICAgICAgY2h1bms6IHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vblByb2dyZXNzaXZlRG9uZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC50cmFuc3BvcnRSZWFkeSgpO1xuICAgICAgICB9XG4gICAgICAgIF9vblJlY2VpdmVEYXRhKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgYmVnaW46IGUsXG4gICAgICAgICAgICBjaHVuazogblxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIGNvbnN0IHIgPSBuIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBuLmJ5dGVMZW5ndGggPT09IG4uYnVmZmVyLmJ5dGVMZW5ndGggPyBuLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KG4pLmJ1ZmZlcjtcbiAgICAgICAgICBpZiAodm9pZCAwID09PSBlKSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA/IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9lbnF1ZXVlKHIpIDogdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2gocik7ZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fcmFuZ2VSZWFkZXJzLnNvbWUoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgaWYgKHQuX2JlZ2luICE9PSBlKSByZXR1cm4gITE7XG4gICAgICAgICAgICAgIHQuX2VucXVldWUocik7XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgKDAsIGkuYXNzZXJ0KSh0LCBcIl9vblJlY2VpdmVEYXRhIC0gbm8gYFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcmAgaW5zdGFuY2UgZm91bmQuXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhLCBfdGhpcyRfZnVsbFJlcXVlc3RSZWEyO1xuICAgICAgICAgIHJldHVybiAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhID0gKF90aGlzJF9mdWxsUmVxdWVzdFJlYTIgPSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMi5fbG9hZGVkKSAhPT0gbnVsbCAmJiBfdGhpcyRfZnVsbFJlcXVlc3RSZWEgIT09IHZvaWQgMCA/IF90aGlzJF9mdWxsUmVxdWVzdFJlYSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgX29uUHJvZ3Jlc3ModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfcmFuZ2VSZWFkZXJzJCwgX3RoaXMkX3JhbmdlUmVhZGVycyQkLCBfdGhpcyRfZnVsbFJlcXVlc3RSZWEzLCBfdGhpcyRfZnVsbFJlcXVlc3RSZWE0O1xuICAgICAgICAgIHZvaWQgMCA9PT0gdC50b3RhbCA/IChfdGhpcyRfcmFuZ2VSZWFkZXJzJCA9IHRoaXMuX3JhbmdlUmVhZGVyc1swXSkgPT09IG51bGwgfHwgX3RoaXMkX3JhbmdlUmVhZGVycyQgPT09IHZvaWQgMCB8fCAoX3RoaXMkX3JhbmdlUmVhZGVycyQkID0gX3RoaXMkX3JhbmdlUmVhZGVycyQub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX3RoaXMkX3JhbmdlUmVhZGVycyQkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfcmFuZ2VSZWFkZXJzJCQuY2FsbChfdGhpcyRfcmFuZ2VSZWFkZXJzJCwge1xuICAgICAgICAgICAgbG9hZGVkOiB0LmxvYWRlZFxuICAgICAgICAgIH0pIDogKF90aGlzJF9mdWxsUmVxdWVzdFJlYTMgPSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMyA9PT0gdm9pZCAwIHx8IChfdGhpcyRfZnVsbFJlcXVlc3RSZWE0ID0gX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMy5vblByb2dyZXNzKSA9PT0gbnVsbCB8fCBfdGhpcyRfZnVsbFJlcXVlc3RSZWE0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfZnVsbFJlcXVlc3RSZWE0LmNhbGwoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMywge1xuICAgICAgICAgICAgbG9hZGVkOiB0LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiB0LnRvdGFsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgX29uUHJvZ3Jlc3NpdmVEb25lKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfZnVsbFJlcXVlc3RSZWE1O1xuICAgICAgICAgIChfdGhpcyRfZnVsbFJlcXVlc3RSZWE1ID0gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpID09PSBudWxsIHx8IF90aGlzJF9mdWxsUmVxdWVzdFJlYTUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTUucHJvZ3Jlc3NpdmVEb25lKCk7XG4gICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gITA7XG4gICAgICAgIH1cbiAgICAgICAgX3JlbW92ZVJhbmdlUmVhZGVyKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5fcmFuZ2VSZWFkZXJzLmluZGV4T2YodCk7XG4gICAgICAgICAgZSA+PSAwICYmIHRoaXMuX3JhbmdlUmVhZGVycy5zcGxpY2UoZSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICAgICAgICAoMCwgaS5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZEYXRhVHJhbnNwb3J0U3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9xdWV1ZWRDaHVua3M7XG4gICAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIodGhpcywgdCwgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lLCB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UmFuZ2VSZWFkZXIodCwgZSkge1xuICAgICAgICAgIGlmIChlIDw9IHRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgY29uc3QgbiA9IG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIodGhpcywgdCwgZSk7XG4gICAgICAgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LnJlcXVlc3REYXRhUmFuZ2UodCwgZSk7XG4gICAgICAgICAgdGhpcy5fcmFuZ2VSZWFkZXJzLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsQWxsUmVxdWVzdHModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfZnVsbFJlcXVlc3RSZWE2O1xuICAgICAgICAgIChfdGhpcyRfZnVsbFJlcXVlc3RSZWE2ID0gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpID09PSBudWxsIHx8IF90aGlzJF9mdWxsUmVxdWVzdFJlYTYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTYuY2FuY2VsKHQpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9yYW5nZVJlYWRlcnMuc2xpY2UoMCkpIGUuY2FuY2VsKHQpO1xuICAgICAgICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICBsZXQgbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdICYmIGFyZ3VtZW50c1syXSxcbiAgICAgICAgICAgIGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1szXSA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICAgICAgdGhpcy5fc3RyZWFtID0gdDtcbiAgICAgICAgICB0aGlzLl9kb25lID0gbiB8fCAhMTtcbiAgICAgICAgICB0aGlzLl9maWxlbmFtZSA9ICgwLCByLmlzUGRmRmlsZSkoaSkgPyBpIDogbnVsbDtcbiAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBlIHx8IFtdO1xuICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3F1ZXVlZENodW5rcykgdGhpcy5fbG9hZGVkICs9IHQuYnl0ZUxlbmd0aDtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2hlYWRlcnNSZWFkeSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgIHQuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcztcbiAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIF9lbnF1ZXVlKHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuX2RvbmUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2godCk7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgKz0gdC5ieXRlTGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVhZHk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZpbGVuYW1lKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1JhbmdlU3VwcG9ydGVkO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9jb250ZW50TGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHJlYWQoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5fcXVldWVkQ2h1bmtzLnNoaWZ0KCksXG4gICAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5fZG9uZSkgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgICBkb25lOiAhMFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgdCA9IG5ldyBpLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMucHVzaCh0KTtcbiAgICAgICAgICByZXR1cm4gdC5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbCh0KSB7XG4gICAgICAgICAgdGhpcy5fZG9uZSA9ICEwO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLl9yZXF1ZXN0cykgdC5yZXNvbHZlKHtcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgICBkb25lOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHJvZ3Jlc3NpdmVEb25lKCkge1xuICAgICAgICAgIHRoaXMuX2RvbmUgfHwgKHRoaXMuX2RvbmUgPSAhMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgICB0aGlzLl9zdHJlYW0gPSB0O1xuICAgICAgICAgIHRoaXMuX2JlZ2luID0gZTtcbiAgICAgICAgICB0aGlzLl9lbmQgPSBuO1xuICAgICAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMTtcbiAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIF9lbnF1ZXVlKHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuX2RvbmUpIHtcbiAgICAgICAgICAgIGlmICgwID09PSB0aGlzLl9yZXF1ZXN0cy5sZW5ndGgpIHRoaXMuX3F1ZXVlZENodW5rID0gdDtlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdHMuc2hpZnQoKS5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlc29sdmUoe1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHJlYWQoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHQpO1xuICAgICAgICAgIHJldHVybiB0LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsKHQpIHtcbiAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuUERGRmV0Y2hTdHJlYW0gPSB2b2lkIDA7XG4gICAgICBuKDkzKTtcbiAgICAgIG4oMTAxKTtcbiAgICAgIG4oMTAyKTtcbiAgICAgIG4oMTA1KTtcbiAgICAgIG4oMTA3KTtcbiAgICAgIG4oMTA5KTtcbiAgICAgIG4oMTEzKTtcbiAgICAgIG4oMTE2KTtcbiAgICAgIG4oMTIzKTtcbiAgICAgIG4oODkpO1xuICAgICAgdmFyIGkgPSBuKDEpLFxuICAgICAgICByID0gbigxODEpO1xuICAgICAgZnVuY3Rpb24gY3JlYXRlRmV0Y2hPcHRpb25zKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgaGVhZGVyczogdCxcbiAgICAgICAgICBzaWduYWw6IG4uc2lnbmFsLFxuICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiBlID8gXCJpbmNsdWRlXCIgOiBcInNhbWUtb3JpZ2luXCIsXG4gICAgICAgICAgcmVkaXJlY3Q6IFwiZm9sbG93XCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUhlYWRlcnModCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IEhlYWRlcnMoKTtcbiAgICAgICAgZm9yIChjb25zdCBuIGluIHQpIHtcbiAgICAgICAgICBjb25zdCBpID0gdFtuXTtcbiAgICAgICAgICB2b2lkIDAgIT09IGkgJiYgZS5hcHBlbmQobiwgaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcih0KSB7XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIHQuYnVmZmVyO1xuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gdDtcbiAgICAgICAgKDAsIGkud2FybikoXCJnZXRBcnJheUJ1ZmZlciAtIHVuZXhwZWN0ZWQgZGF0YSBmb3JtYXQ6IFwiLmNvbmNhdCh0KSk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0KS5idWZmZXI7XG4gICAgICB9XG4gICAgICBlLlBERkZldGNoU3RyZWFtID0gY2xhc3MgUERGRmV0Y2hTdHJlYW0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdGhpcy5zb3VyY2UgPSB0O1xuICAgICAgICAgIHRoaXMuaXNIdHRwID0gL15odHRwcz86L2kudGVzdCh0LnVybCk7XG4gICAgICAgICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHQuaHR0cEhlYWRlcnMgfHwge307XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhNywgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhODtcbiAgICAgICAgICByZXR1cm4gKF90aGlzJF9mdWxsUmVxdWVzdFJlYTcgPSAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhOCA9IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSA9PT0gbnVsbCB8fCBfdGhpcyRfZnVsbFJlcXVlc3RSZWE4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfZnVsbFJlcXVlc3RSZWE4Ll9sb2FkZWQpICE9PSBudWxsICYmIF90aGlzJF9mdWxsUmVxdWVzdFJlYTcgIT09IHZvaWQgMCA/IF90aGlzJF9mdWxsUmVxdWVzdFJlYTcgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgICAgICAgKDAsIGkuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGRmV0Y2hTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SZWFkZXIodGhpcyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICAgICAgICB9XG4gICAgICAgIGdldFJhbmdlUmVhZGVyKHQsIGUpIHtcbiAgICAgICAgICBpZiAoZSA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCB0LCBlKTtcbiAgICAgICAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsQWxsUmVxdWVzdHModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfZnVsbFJlcXVlc3RSZWE5O1xuICAgICAgICAgIChfdGhpcyRfZnVsbFJlcXVlc3RSZWE5ID0gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpID09PSBudWxsIHx8IF90aGlzJF9mdWxsUmVxdWVzdFJlYTkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTkuY2FuY2VsKHQpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSBlLmNhbmNlbCh0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNsYXNzIFBERkZldGNoU3RyZWFtUmVhZGVyIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHRoaXMuX3N0cmVhbSA9IHQ7XG4gICAgICAgICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgICAgICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBlID0gdC5zb3VyY2U7XG4gICAgICAgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gZS53aXRoQ3JlZGVudGlhbHMgfHwgITE7XG4gICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGUubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBlLmRpc2FibGVSYW5nZSB8fCAhMTtcbiAgICAgICAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IGUucmFuZ2VDaHVua1NpemU7XG4gICAgICAgICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgfHwgdGhpcy5fZGlzYWJsZVJhbmdlIHx8ICh0aGlzLl9kaXNhYmxlUmFuZ2UgPSAhMCk7XG4gICAgICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIWUuZGlzYWJsZVN0cmVhbTtcbiAgICAgICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIWUuZGlzYWJsZVJhbmdlO1xuICAgICAgICAgIHRoaXMuX2hlYWRlcnMgPSBjcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7XG4gICAgICAgICAgY29uc3QgbiA9IGUudXJsO1xuICAgICAgICAgIGZldGNoKG4sIGNyZWF0ZUZldGNoT3B0aW9ucyh0aGlzLl9oZWFkZXJzLCB0aGlzLl93aXRoQ3JlZGVudGlhbHMsIHRoaXMuX2Fib3J0Q29udHJvbGxlcikpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICBpZiAoISgwLCByLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHQuc3RhdHVzKSkgdGhyb3cgKDAsIHIuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikodC5zdGF0dXMsIG4pO1xuICAgICAgICAgICAgdGhpcy5fcmVhZGVyID0gdC5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBlID0+IHQuaGVhZGVycy5nZXQoZSksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IGUsXG4gICAgICAgICAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoOiBzXG4gICAgICAgICAgICAgIH0gPSAoMCwgci52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoe1xuICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyOiBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgICAgICAgICAgICBpc0h0dHA6IHRoaXMuX3N0cmVhbS5pc0h0dHAsXG4gICAgICAgICAgICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLFxuICAgICAgICAgICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGU7XG4gICAgICAgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gcyB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgci5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7XG4gICAgICAgICAgICAhdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCAmJiB0aGlzLmNhbmNlbChuZXcgaS5BYm9ydEV4Y2VwdGlvbihcIlN0cmVhbWluZyBpcyBkaXNhYmxlZC5cIikpO1xuICAgICAgICAgIH0pLmNhdGNoKHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBmaWxlbmFtZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRvblByb2dyZXNzO1xuICAgICAgICAgIGF3YWl0IHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgICBkb25lOiBlXG4gICAgICAgICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgICAgICAgaWYgKGUpIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgIGRvbmU6IGVcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX2xvYWRlZCArPSB0LmJ5dGVMZW5ndGg7XG4gICAgICAgICAgKF90aGlzJG9uUHJvZ3Jlc3MgPSB0aGlzLm9uUHJvZ3Jlc3MpID09PSBudWxsIHx8IF90aGlzJG9uUHJvZ3Jlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uUHJvZ3Jlc3MuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiB0aGlzLl9jb250ZW50TGVuZ3RoXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBnZXRBcnJheUJ1ZmZlcih0KSxcbiAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwodCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfcmVhZGVyO1xuICAgICAgICAgIChfdGhpcyRfcmVhZGVyID0gdGhpcy5fcmVhZGVyKSA9PT0gbnVsbCB8fCBfdGhpcyRfcmVhZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfcmVhZGVyLmNhbmNlbCh0KTtcbiAgICAgICAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgICB0aGlzLl9zdHJlYW0gPSB0O1xuICAgICAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICAgICAgICBjb25zdCBzID0gdC5zb3VyY2U7XG4gICAgICAgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gcy53aXRoQ3JlZGVudGlhbHMgfHwgITE7XG4gICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXMuZGlzYWJsZVN0cmVhbTtcbiAgICAgICAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgdGhpcy5faGVhZGVycyA9IGNyZWF0ZUhlYWRlcnModGhpcy5fc3RyZWFtLmh0dHBIZWFkZXJzKTtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJzLmFwcGVuZChcIlJhbmdlXCIsIFwiYnl0ZXM9XCIuY29uY2F0KGUsIFwiLVwiKS5jb25jYXQobiAtIDEpKTtcbiAgICAgICAgICBjb25zdCBhID0gcy51cmw7XG4gICAgICAgICAgZmV0Y2goYSwgY3JlYXRlRmV0Y2hPcHRpb25zKHRoaXMuX2hlYWRlcnMsIHRoaXMuX3dpdGhDcmVkZW50aWFscywgdGhpcy5fYWJvcnRDb250cm9sbGVyKSkudGhlbih0ID0+IHtcbiAgICAgICAgICAgIGlmICghKDAsIHIudmFsaWRhdGVSZXNwb25zZVN0YXR1cykodC5zdGF0dXMpKSB0aHJvdyAoMCwgci5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKSh0LnN0YXR1cywgYSk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkZXIgPSB0LmJvZHkuZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgfSkuY2F0Y2godGhpcy5fcmVhZENhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgcmVhZCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkb25Qcm9ncmVzczI7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgIGRvbmU6IGVcbiAgICAgICAgICB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICBpZiAoZSkgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB0LFxuICAgICAgICAgICAgZG9uZTogZVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fbG9hZGVkICs9IHQuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAoX3RoaXMkb25Qcm9ncmVzczIgPSB0aGlzLm9uUHJvZ3Jlc3MpID09PSBudWxsIHx8IF90aGlzJG9uUHJvZ3Jlc3MyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRvblByb2dyZXNzMi5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBnZXRBcnJheUJ1ZmZlcih0KSxcbiAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwodCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfcmVhZGVyMjtcbiAgICAgICAgICAoX3RoaXMkX3JlYWRlcjIgPSB0aGlzLl9yZWFkZXIpID09PSBudWxsIHx8IF90aGlzJF9yZWFkZXIyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfcmVhZGVyMi5jYW5jZWwodCk7XG4gICAgICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yID0gZnVuY3Rpb24gY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcih0LCBlKSB7XG4gICAgICAgIGlmICg0MDQgPT09IHQgfHwgMCA9PT0gdCAmJiBlLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkgcmV0dXJuIG5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24oJ01pc3NpbmcgUERGIFwiJyArIGUgKyAnXCIuJyk7XG4gICAgICAgIHJldHVybiBuZXcgaS5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oXCJVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZSAoXCIuY29uY2F0KHQsIFwiKSB3aGlsZSByZXRyaWV2aW5nIFBERiBcXFwiXCIpLmNvbmNhdChlLCBcIlxcXCIuXCIpLCB0KTtcbiAgICAgIH07XG4gICAgICBlLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIgPSBmdW5jdGlvbiBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIpO1xuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgIGxldCB0ID0gKDAsIHIuZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyKShlKTtcbiAgICAgICAgICBpZiAodC5pbmNsdWRlcyhcIiVcIikpIHRyeSB7XG4gICAgICAgICAgICB0ID0gZGVjb2RlVVJJQ29tcG9uZW50KHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQxMikge31cbiAgICAgICAgICBpZiAoKDAsIHMuaXNQZGZGaWxlKSh0KSkgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgZS52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHQpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBnZXRSZXNwb25zZUhlYWRlcjogZSxcbiAgICAgICAgICBpc0h0dHA6IG4sXG4gICAgICAgICAgcmFuZ2VDaHVua1NpemU6IGksXG4gICAgICAgICAgZGlzYWJsZVJhbmdlOiByXG4gICAgICAgIH0gPSB0O1xuICAgICAgICBjb25zdCBzID0ge1xuICAgICAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzOiAhMSxcbiAgICAgICAgICAgIHN1Z2dlc3RlZExlbmd0aDogdm9pZCAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhID0gcGFyc2VJbnQoZShcIkNvbnRlbnQtTGVuZ3RoXCIpLCAxMCk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhKSkgcmV0dXJuIHM7XG4gICAgICAgIHMuc3VnZ2VzdGVkTGVuZ3RoID0gYTtcbiAgICAgICAgaWYgKGEgPD0gMiAqIGkpIHJldHVybiBzO1xuICAgICAgICBpZiAociB8fCAhbikgcmV0dXJuIHM7XG4gICAgICAgIGlmIChcImJ5dGVzXCIgIT09IGUoXCJBY2NlcHQtUmFuZ2VzXCIpKSByZXR1cm4gcztcbiAgICAgICAgaWYgKFwiaWRlbnRpdHlcIiAhPT0gKGUoXCJDb250ZW50LUVuY29kaW5nXCIpIHx8IFwiaWRlbnRpdHlcIikpIHJldHVybiBzO1xuICAgICAgICBzLmFsbG93UmFuZ2VSZXF1ZXN0cyA9ICEwO1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH07XG4gICAgICBlLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMgPSBmdW5jdGlvbiB2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKHQpIHtcbiAgICAgICAgcmV0dXJuIDIwMCA9PT0gdCB8fCAyMDYgPT09IHQ7XG4gICAgICB9O1xuICAgICAgdmFyIGkgPSBuKDEpLFxuICAgICAgICByID0gbigxODIpLFxuICAgICAgICBzID0gbigxNjcpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLmdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlciA9IGZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcih0KSB7XG4gICAgICAgIGxldCBlID0gITAsXG4gICAgICAgICAgbiA9IHRvUGFyYW1SZWdFeHAoXCJmaWxlbmFtZVxcXFwqXCIsIFwiaVwiKS5leGVjKHQpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIG4gPSBuWzFdO1xuICAgICAgICAgIGxldCB0ID0gcmZjMjYxNnVucXVvdGUobik7XG4gICAgICAgICAgdCA9IHVuZXNjYXBlKHQpO1xuICAgICAgICAgIHQgPSByZmM1OTg3ZGVjb2RlKHQpO1xuICAgICAgICAgIHQgPSByZmMyMDQ3ZGVjb2RlKHQpO1xuICAgICAgICAgIHJldHVybiBmaXh1cEVuY29kaW5nKHQpO1xuICAgICAgICB9XG4gICAgICAgIG4gPSBmdW5jdGlvbiByZmMyMjMxZ2V0cGFyYW0odCkge1xuICAgICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgICBsZXQgbjtcbiAgICAgICAgICBjb25zdCBpID0gdG9QYXJhbVJlZ0V4cChcImZpbGVuYW1lXFxcXCooKD8hMFxcXFxkKVxcXFxkKykoXFxcXCo/KVwiLCBcImlnXCIpO1xuICAgICAgICAgIGZvciAoOyBudWxsICE9PSAobiA9IGkuZXhlYyh0KSk7KSB7XG4gICAgICAgICAgICBsZXQgWywgdCwgaSwgcl0gPSBuO1xuICAgICAgICAgICAgdCA9IHBhcnNlSW50KHQsIDEwKTtcbiAgICAgICAgICAgIGlmICh0IGluIGUpIHtcbiAgICAgICAgICAgICAgaWYgKDAgPT09IHQpIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGVbdF0gPSBbaSwgcl07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHIgPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGUubGVuZ3RoICYmIHQgaW4gZTsgKyt0KSB7XG4gICAgICAgICAgICBsZXQgW24sIGldID0gZVt0XTtcbiAgICAgICAgICAgIGkgPSByZmMyNjE2dW5xdW90ZShpKTtcbiAgICAgICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgICAgIGkgPSB1bmVzY2FwZShpKTtcbiAgICAgICAgICAgICAgMCA9PT0gdCAmJiAoaSA9IHJmYzU5ODdkZWNvZGUoaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgci5wdXNoKGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gci5qb2luKFwiXCIpO1xuICAgICAgICB9KHQpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIHJldHVybiBmaXh1cEVuY29kaW5nKHJmYzIwNDdkZWNvZGUobikpO1xuICAgICAgICB9XG4gICAgICAgIG4gPSB0b1BhcmFtUmVnRXhwKFwiZmlsZW5hbWVcIiwgXCJpXCIpLmV4ZWModCk7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgbiA9IG5bMV07XG4gICAgICAgICAgbGV0IHQgPSByZmMyNjE2dW5xdW90ZShuKTtcbiAgICAgICAgICB0ID0gcmZjMjA0N2RlY29kZSh0KTtcbiAgICAgICAgICByZXR1cm4gZml4dXBFbmNvZGluZyh0KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiB0b1BhcmFtUmVnRXhwKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIig/Ol58OylcXFxccypcIiArIHQgKyAnXFxcXHMqPVxcXFxzKihbXlwiO1xcXFxzXVteO1xcXFxzXSp8XCIoPzpbXlwiXFxcXFxcXFxdfFxcXFxcXFxcXCI/KStcIj8pJywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gdGV4dGRlY29kZSh0LCBuKSB7XG4gICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgIGlmICghL15bXFx4MDAtXFx4RkZdKyQvLnRlc3QobikpIHJldHVybiBuO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgciA9IG5ldyBUZXh0RGVjb2Rlcih0LCB7XG4gICAgICAgICAgICAgICAgICBmYXRhbDogITBcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzID0gKDAsIGkuc3RyaW5nVG9CeXRlcykobik7XG4gICAgICAgICAgICAgIG4gPSByLmRlY29kZShzKTtcbiAgICAgICAgICAgICAgZSA9ICExO1xuICAgICAgICAgICAgfSBjYXRjaCAoX3VudXNlZDEzKSB7fVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmaXh1cEVuY29kaW5nKHQpIHtcbiAgICAgICAgICBpZiAoZSAmJiAvW1xceDgwLVxceGZmXS8udGVzdCh0KSkge1xuICAgICAgICAgICAgdCA9IHRleHRkZWNvZGUoXCJ1dGYtOFwiLCB0KTtcbiAgICAgICAgICAgIGUgJiYgKHQgPSB0ZXh0ZGVjb2RlKFwiaXNvLTg4NTktMVwiLCB0KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJmYzI2MTZ1bnF1b3RlKHQpIHtcbiAgICAgICAgICBpZiAodC5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5zbGljZSgxKS5zcGxpdCgnXFxcXFwiJyk7XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGUubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IGVbdF0uaW5kZXhPZignXCInKTtcbiAgICAgICAgICAgICAgaWYgKC0xICE9PSBuKSB7XG4gICAgICAgICAgICAgICAgZVt0XSA9IGVbdF0uc2xpY2UoMCwgbik7XG4gICAgICAgICAgICAgICAgZS5sZW5ndGggPSB0ICsgMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlW3RdID0gZVt0XS5yZXBsYWNlQWxsKC9cXFxcKC4pL2csIFwiJDFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ID0gZS5qb2luKCdcIicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiByZmM1OTg3ZGVjb2RlKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdC5pbmRleE9mKFwiJ1wiKTtcbiAgICAgICAgICBpZiAoLTEgPT09IGUpIHJldHVybiB0O1xuICAgICAgICAgIHJldHVybiB0ZXh0ZGVjb2RlKHQuc2xpY2UoMCwgZSksIHQuc2xpY2UoZSArIDEpLnJlcGxhY2UoL15bXiddKicvLCBcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmZjMjA0N2RlY29kZSh0KSB7XG4gICAgICAgICAgcmV0dXJuICF0LnN0YXJ0c1dpdGgoXCI9P1wiKSB8fCAvW1xceDAwLVxceDE5XFx4ODAtXFx4ZmZdLy50ZXN0KHQpID8gdCA6IHQucmVwbGFjZUFsbCgvPVxcPyhbXFx3LV0qKVxcPyhbUXFCYl0pXFw/KCg/OlteP118XFw/KD8hPSkpKilcXD89L2csIGZ1bmN0aW9uICh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgICBpZiAoXCJxXCIgPT09IG4gfHwgXCJRXCIgPT09IG4pIHJldHVybiB0ZXh0ZGVjb2RlKGUsIGkgPSAoaSA9IGkucmVwbGFjZUFsbChcIl9cIiwgXCIgXCIpKS5yZXBsYWNlQWxsKC89KFswLTlhLWZBLUZdezJ9KS9nLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChlLCAxNikpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaSA9IGF0b2IoaSk7XG4gICAgICAgICAgICB9IGNhdGNoIChfdW51c2VkMTQpIHt9XG4gICAgICAgICAgICByZXR1cm4gdGV4dGRlY29kZShlLCBpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH07XG4gICAgICBuKDg5KTtcbiAgICAgIG4oMTQ4KTtcbiAgICAgIHZhciBpID0gbigxKTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5QREZOZXR3b3JrU3RyZWFtID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE4MSk7XG4gICAgICBjbGFzcyBOZXR3b3JrTWFuYWdlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICAgICAgdGhpcy51cmwgPSB0O1xuICAgICAgICAgIHRoaXMuaXNIdHRwID0gL15odHRwcz86L2kudGVzdCh0KTtcbiAgICAgICAgICB0aGlzLmh0dHBIZWFkZXJzID0gdGhpcy5pc0h0dHAgJiYgZS5odHRwSGVhZGVycyB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gZS53aXRoQ3JlZGVudGlhbHMgfHwgITE7XG4gICAgICAgICAgdGhpcy5jdXJyWGhySWQgPSAwO1xuICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0UmFuZ2UodCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IGkgPSB7XG4gICAgICAgICAgICBiZWdpbjogdCxcbiAgICAgICAgICAgIGVuZDogZVxuICAgICAgICAgIH07XG4gICAgICAgICAgZm9yIChjb25zdCB0IGluIG4pIGlbdF0gPSBuW3RdO1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdEZ1bGwodCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpLFxuICAgICAgICAgICAgbiA9IHRoaXMuY3VyclhocklkKyssXG4gICAgICAgICAgICBpID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbbl0gPSB7XG4gICAgICAgICAgICAgIHhocjogZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICBlLm9wZW4oXCJHRVRcIiwgdGhpcy51cmwpO1xuICAgICAgICAgIGUud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgICAgZm9yIChjb25zdCB0IGluIHRoaXMuaHR0cEhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmh0dHBIZWFkZXJzW3RdO1xuICAgICAgICAgICAgdm9pZCAwICE9PSBuICYmIGUuc2V0UmVxdWVzdEhlYWRlcih0LCBuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuaXNIdHRwICYmIFwiYmVnaW5cIiBpbiB0ICYmIFwiZW5kXCIgaW4gdCkge1xuICAgICAgICAgICAgZS5zZXRSZXF1ZXN0SGVhZGVyKFwiUmFuZ2VcIiwgXCJieXRlcz1cIi5jb25jYXQodC5iZWdpbiwgXCItXCIpLmNvbmNhdCh0LmVuZCAtIDEpKTtcbiAgICAgICAgICAgIGkuZXhwZWN0ZWRTdGF0dXMgPSAyMDY7XG4gICAgICAgICAgfSBlbHNlIGkuZXhwZWN0ZWRTdGF0dXMgPSAyMDA7XG4gICAgICAgICAgZS5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XG4gICAgICAgICAgdC5vbkVycm9yICYmIChlLm9uZXJyb3IgPSBmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgdC5vbkVycm9yKGUuc3RhdHVzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBlLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMsIG4pO1xuICAgICAgICAgIGUub25wcm9ncmVzcyA9IHRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMsIG4pO1xuICAgICAgICAgIGkub25IZWFkZXJzUmVjZWl2ZWQgPSB0Lm9uSGVhZGVyc1JlY2VpdmVkO1xuICAgICAgICAgIGkub25Eb25lID0gdC5vbkRvbmU7XG4gICAgICAgICAgaS5vbkVycm9yID0gdC5vbkVycm9yO1xuICAgICAgICAgIGkub25Qcm9ncmVzcyA9IHQub25Qcm9ncmVzcztcbiAgICAgICAgICBlLnNlbmQobnVsbCk7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgb25Qcm9ncmVzcyh0LCBlKSB7XG4gICAgICAgICAgdmFyIF9uJG9uUHJvZ3Jlc3M7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3RdO1xuICAgICAgICAgIG4gJiYgKChfbiRvblByb2dyZXNzID0gbi5vblByb2dyZXNzKSA9PT0gbnVsbCB8fCBfbiRvblByb2dyZXNzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbiRvblByb2dyZXNzLmNhbGwobiwgZSkpO1xuICAgICAgICB9XG4gICAgICAgIG9uU3RhdGVDaGFuZ2UodCwgZSkge1xuICAgICAgICAgIHZhciBfbiRvbkVycm9yMztcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbdF07XG4gICAgICAgICAgaWYgKCFuKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgciA9IG4ueGhyO1xuICAgICAgICAgIGlmIChyLnJlYWR5U3RhdGUgPj0gMiAmJiBuLm9uSGVhZGVyc1JlY2VpdmVkKSB7XG4gICAgICAgICAgICBuLm9uSGVhZGVyc1JlY2VpdmVkKCk7XG4gICAgICAgICAgICBkZWxldGUgbi5vbkhlYWRlcnNSZWNlaXZlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKDQgIT09IHIucmVhZHlTdGF0ZSkgcmV0dXJuO1xuICAgICAgICAgIGlmICghKHQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHMpKSByZXR1cm47XG4gICAgICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3RdO1xuICAgICAgICAgIGlmICgwID09PSByLnN0YXR1cyAmJiB0aGlzLmlzSHR0cCkge1xuICAgICAgICAgICAgdmFyIF9uJG9uRXJyb3I7XG4gICAgICAgICAgICAoX24kb25FcnJvciA9IG4ub25FcnJvcikgPT09IG51bGwgfHwgX24kb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogX24kb25FcnJvci5jYWxsKG4sIHIuc3RhdHVzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcyA9IHIuc3RhdHVzIHx8IDIwMDtcbiAgICAgICAgICBpZiAoISgyMDAgPT09IHMgJiYgMjA2ID09PSBuLmV4cGVjdGVkU3RhdHVzKSAmJiBzICE9PSBuLmV4cGVjdGVkU3RhdHVzKSB7XG4gICAgICAgICAgICB2YXIgX24kb25FcnJvcjI7XG4gICAgICAgICAgICAoX24kb25FcnJvcjIgPSBuLm9uRXJyb3IpID09PSBudWxsIHx8IF9uJG9uRXJyb3IyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbiRvbkVycm9yMi5jYWxsKG4sIHIuc3RhdHVzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYSA9IGZ1bmN0aW9uIGdldEFycmF5QnVmZmVyKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LnJlc3BvbnNlO1xuICAgICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCIgIT0gdHlwZW9mIGUgPyBlIDogKDAsIGkuc3RyaW5nVG9CeXRlcykoZSkuYnVmZmVyO1xuICAgICAgICAgIH0ocik7XG4gICAgICAgICAgaWYgKDIwNiA9PT0gcykge1xuICAgICAgICAgICAgY29uc3QgdCA9IHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LVJhbmdlXCIpLFxuICAgICAgICAgICAgICBlID0gL2J5dGVzIChcXGQrKS0oXFxkKylcXC8oXFxkKykvLmV4ZWModCk7XG4gICAgICAgICAgICBuLm9uRG9uZSh7XG4gICAgICAgICAgICAgIGJlZ2luOiBwYXJzZUludChlWzFdLCAxMCksXG4gICAgICAgICAgICAgIGNodW5rOiBhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgYSA/IG4ub25Eb25lKHtcbiAgICAgICAgICAgIGJlZ2luOiAwLFxuICAgICAgICAgICAgY2h1bms6IGFcbiAgICAgICAgICB9KSA6IChfbiRvbkVycm9yMyA9IG4ub25FcnJvcikgPT09IG51bGwgfHwgX24kb25FcnJvcjMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uJG9uRXJyb3IzLmNhbGwobiwgci5zdGF0dXMpO1xuICAgICAgICB9XG4gICAgICAgIGdldFJlcXVlc3RYaHIodCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t0XS54aHI7XG4gICAgICAgIH1cbiAgICAgICAgaXNQZW5kaW5nUmVxdWVzdCh0KSB7XG4gICAgICAgICAgcmV0dXJuIHQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHM7XG4gICAgICAgIH1cbiAgICAgICAgYWJvcnRSZXF1ZXN0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbdF0ueGhyO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t0XTtcbiAgICAgICAgICBlLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuUERGTmV0d29ya1N0cmVhbSA9IGNsYXNzIFBERk5ldHdvcmtTdHJlYW0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdGhpcy5fc291cmNlID0gdDtcbiAgICAgICAgICB0aGlzLl9tYW5hZ2VyID0gbmV3IE5ldHdvcmtNYW5hZ2VyKHQudXJsLCB7XG4gICAgICAgICAgICBodHRwSGVhZGVyczogdC5odHRwSGVhZGVycyxcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdC53aXRoQ3JlZGVudGlhbHNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHQucmFuZ2VDaHVua1NpemU7XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBfb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLmluZGV4T2YodCk7XG4gICAgICAgICAgZSA+PSAwICYmIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc3BsaWNlKGUsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgICAgICAgKDAsIGkuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGTmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcbiAgICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG5ldyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIodGhpcy5fbWFuYWdlciwgdGhpcy5fc291cmNlKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UmFuZ2VSZWFkZXIodCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUERGTmV0d29ya1N0cmVhbVJhbmdlUmVxdWVzdFJlYWRlcih0aGlzLl9tYW5hZ2VyLCB0LCBlKTtcbiAgICAgICAgICBuLm9uQ2xvc2VkID0gdGhpcy5fb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQuYmluZCh0aGlzKTtcbiAgICAgICAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsQWxsUmVxdWVzdHModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfZnVsbFJlcXVlc3RSZWExMDtcbiAgICAgICAgICAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTAgPSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTEwLmNhbmNlbCh0KTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkgZS5jYW5jZWwodCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjbGFzcyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgdGhpcy5fbWFuYWdlciA9IHQ7XG4gICAgICAgICAgY29uc3QgbiA9IHtcbiAgICAgICAgICAgIG9uSGVhZGVyc1JlY2VpdmVkOiB0aGlzLl9vbkhlYWRlcnNSZWNlaXZlZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgb25Eb25lOiB0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9uRXJyb3I6IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IHRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fdXJsID0gZS51cmw7XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RJZCA9IHQucmVxdWVzdEZ1bGwobik7XG4gICAgICAgICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eSA9IG5ldyBpLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gZS5kaXNhYmxlUmFuZ2UgfHwgITE7XG4gICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGUubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gZS5yYW5nZUNodW5rU2l6ZTtcbiAgICAgICAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSB8fCB0aGlzLl9kaXNhYmxlUmFuZ2UgfHwgKHRoaXMuX2Rpc2FibGVSYW5nZSA9ICEwKTtcbiAgICAgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICExO1xuICAgICAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhMTtcbiAgICAgICAgICB0aGlzLl9jYWNoZWRDaHVua3MgPSBbXTtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMTtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHZvaWQgMDtcbiAgICAgICAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBfb25IZWFkZXJzUmVjZWl2ZWQoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuX2Z1bGxSZXF1ZXN0SWQsXG4gICAgICAgICAgICBlID0gdGhpcy5fbWFuYWdlci5nZXRSZXF1ZXN0WGhyKHQpLFxuICAgICAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIgPSB0ID0+IGUuZ2V0UmVzcG9uc2VIZWFkZXIodCksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0czogbixcbiAgICAgICAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoOiBpXG4gICAgICAgICAgICB9ID0gKDAsIHIudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHtcbiAgICAgICAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGdldFJlc3BvbnNlSGVhZGVyLFxuICAgICAgICAgICAgICBpc0h0dHA6IHRoaXMuX21hbmFnZXIuaXNIdHRwLFxuICAgICAgICAgICAgICByYW5nZUNodW5rU2l6ZTogdGhpcy5fcmFuZ2VDaHVua1NpemUsXG4gICAgICAgICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBuICYmICh0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gITApO1xuICAgICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBpIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICAgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgci5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7XG4gICAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCAmJiB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0KTtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBfb25Eb25lKHQpIHtcbiAgICAgICAgICBpZiAodCkgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHZhbHVlOiB0LmNodW5rLFxuICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuX2NhY2hlZENodW5rcy5wdXNoKHQuY2h1bmspO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMDtcbiAgICAgICAgICBpZiAoISh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLl9yZXF1ZXN0cykgdC5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX29uRXJyb3IodCkge1xuICAgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gKDAsIHIuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikodCwgdGhpcy5fdXJsKTtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBfb25Qcm9ncmVzcyh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzJG9uUHJvZ3Jlc3MzO1xuICAgICAgICAgIChfdGhpcyRvblByb2dyZXNzMyA9IHRoaXMub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX3RoaXMkb25Qcm9ncmVzczMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uUHJvZ3Jlc3MzLmNhbGwodGhpcywge1xuICAgICAgICAgICAgbG9hZGVkOiB0LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiB0Lmxlbmd0aENvbXB1dGFibGUgPyB0LnRvdGFsIDogdGhpcy5fY29udGVudExlbmd0aFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCBmaWxlbmFtZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgcmVhZCgpIHtcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgICAgICAgIGlmICh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2NhY2hlZENodW5rcy5zaGlmdCgpLFxuICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX2RvbmUpIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLnB1c2godCk7XG4gICAgICAgICAgcmV0dXJuIHQucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwodCkge1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMDtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlamVjdCh0KTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fcmVxdWVzdHMpIHQucmVzb2x2ZSh7XG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgICAgICAgIHRoaXMuX21hbmFnZXIuaXNQZW5kaW5nUmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKSAmJiB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKTtcbiAgICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgICAgdGhpcy5fbWFuYWdlciA9IHQ7XG4gICAgICAgICAgY29uc3QgaSA9IHtcbiAgICAgICAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksXG4gICAgICAgICAgICBvbkVycm9yOiB0aGlzLl9vbkVycm9yLmJpbmQodGhpcyksXG4gICAgICAgICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcylcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX3VybCA9IHQudXJsO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RJZCA9IHQucmVxdWVzdFJhbmdlKGUsIG4sIGkpO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMTtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHZvaWQgMDtcbiAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgIHRoaXMub25DbG9zZWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIF9jbG9zZSgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkb25DbG9zZWQ7XG4gICAgICAgICAgKF90aGlzJG9uQ2xvc2VkID0gdGhpcy5vbkNsb3NlZCkgPT09IG51bGwgfHwgX3RoaXMkb25DbG9zZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uQ2xvc2VkLmNhbGwodGhpcywgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgX29uRG9uZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHQuY2h1bms7XG4gICAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHZhbHVlOiBlLFxuICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuX3F1ZXVlZENodW5rID0gZTtcbiAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIF9vbkVycm9yKHQpIHtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9ICgwLCByLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHQsIHRoaXMuX3VybCk7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgX29uUHJvZ3Jlc3ModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRvblByb2dyZXNzNDtcbiAgICAgICAgICB0aGlzLmlzU3RyZWFtaW5nU3VwcG9ydGVkIHx8ICgoX3RoaXMkb25Qcm9ncmVzczQgPSB0aGlzLm9uUHJvZ3Jlc3MpID09PSBudWxsIHx8IF90aGlzJG9uUHJvZ3Jlc3M0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRvblByb2dyZXNzNC5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGxvYWRlZDogdC5sb2FkZWRcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHRoaXMuX3F1ZXVlZENodW5rKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHQpO1xuICAgICAgICAgIHJldHVybiB0LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsKHQpIHtcbiAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fcmVxdWVzdElkKSAmJiB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9yZXF1ZXN0SWQpO1xuICAgICAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5QREZOb2RlU3RyZWFtID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICBuKDkzKTtcbiAgICAgIG4oMTAxKTtcbiAgICAgIG4oMTAyKTtcbiAgICAgIG4oMTA1KTtcbiAgICAgIG4oMTA3KTtcbiAgICAgIG4oMTA5KTtcbiAgICAgIG4oMTEzKTtcbiAgICAgIG4oMTE2KTtcbiAgICAgIG4oMTIzKTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTgxKTtcbiAgICAgIGNvbnN0IHMgPSAvXmZpbGU6XFwvXFwvXFwvW2EtekEtWl06XFwvLztcbiAgICAgIGUuUERGTm9kZVN0cmVhbSA9IGNsYXNzIFBERk5vZGVTdHJlYW0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdGhpcy5zb3VyY2UgPSB0O1xuICAgICAgICAgIHRoaXMudXJsID0gZnVuY3Rpb24gcGFyc2VVcmwodCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IF9fd2VicGFja19yZXF1aXJlX18oT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAndXJsJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKSxcbiAgICAgICAgICAgICAgbiA9IGUucGFyc2UodCk7XG4gICAgICAgICAgICBpZiAoXCJmaWxlOlwiID09PSBuLnByb3RvY29sIHx8IG4uaG9zdCkgcmV0dXJuIG47XG4gICAgICAgICAgICBpZiAoL15bYS16XTpbL1xcXFxdL2kudGVzdCh0KSkgcmV0dXJuIGUucGFyc2UoXCJmaWxlOi8vL1wiLmNvbmNhdCh0KSk7XG4gICAgICAgICAgICBuLmhvc3QgfHwgKG4ucHJvdG9jb2wgPSBcImZpbGU6XCIpO1xuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgICAgfSh0LnVybCk7XG4gICAgICAgICAgdGhpcy5pc0h0dHAgPSBcImh0dHA6XCIgPT09IHRoaXMudXJsLnByb3RvY29sIHx8IFwiaHR0cHM6XCIgPT09IHRoaXMudXJsLnByb3RvY29sO1xuICAgICAgICAgIHRoaXMuaXNGc1VybCA9IFwiZmlsZTpcIiA9PT0gdGhpcy51cmwucHJvdG9jb2w7XG4gICAgICAgICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHQuaHR0cEhlYWRlcnMgfHwge307XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTEsIF90aGlzJF9mdWxsUmVxdWVzdFJlYTEyO1xuICAgICAgICAgIHJldHVybiAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTEgPSAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTIgPSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTEyLl9sb2FkZWQpICE9PSBudWxsICYmIF90aGlzJF9mdWxsUmVxdWVzdFJlYTExICE9PSB2b2lkIDAgPyBfdGhpcyRfZnVsbFJlcXVlc3RSZWExMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICAgICAgICAoMCwgaS5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZOb2RlU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuICAgICAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcy5pc0ZzVXJsID8gbmV3IFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIodGhpcykgOiBuZXcgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIodGhpcyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICAgICAgICB9XG4gICAgICAgIGdldFJhbmdlUmVhZGVyKHQsIGUpIHtcbiAgICAgICAgICBpZiAoZSA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmlzRnNVcmwgPyBuZXcgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIodGhpcywgdCwgZSkgOiBuZXcgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIHQsIGUpO1xuICAgICAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChuKTtcbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWxBbGxSZXF1ZXN0cyh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzJF9mdWxsUmVxdWVzdFJlYTEzO1xuICAgICAgICAgIChfdGhpcyRfZnVsbFJlcXVlc3RSZWExMyA9IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSA9PT0gbnVsbCB8fCBfdGhpcyRfZnVsbFJlcXVlc3RSZWExMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTMuY2FuY2VsKHQpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSBlLmNhbmNlbCh0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNsYXNzIEJhc2VGdWxsUmVhZGVyIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHRoaXMuX3VybCA9IHQudXJsO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMTtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBlID0gdC5zb3VyY2U7XG4gICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGUubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgICAgICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IGUuZGlzYWJsZVJhbmdlIHx8ICExO1xuICAgICAgICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gZS5yYW5nZUNodW5rU2l6ZTtcbiAgICAgICAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSB8fCB0aGlzLl9kaXNhYmxlUmFuZ2UgfHwgKHRoaXMuX2Rpc2FibGVSYW5nZSA9ICEwKTtcbiAgICAgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFlLmRpc2FibGVTdHJlYW07XG4gICAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFlLmRpc2FibGVSYW5nZTtcbiAgICAgICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBmaWxlbmFtZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRvblByb2dyZXNzNTtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG4gICAgICAgICAgaWYgKG51bGwgPT09IHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fbG9hZGVkICs9IHQubGVuZ3RoO1xuICAgICAgICAgIChfdGhpcyRvblByb2dyZXNzNSA9IHRoaXMub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX3RoaXMkb25Qcm9ncmVzczUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uUHJvZ3Jlc3M1LmNhbGwodGhpcywge1xuICAgICAgICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogdGhpcy5fY29udGVudExlbmd0aFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogbmV3IFVpbnQ4QXJyYXkodCkuYnVmZmVyLFxuICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbCh0KSB7XG4gICAgICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPyB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHQpIDogdGhpcy5fZXJyb3IodCk7XG4gICAgICAgIH1cbiAgICAgICAgX2Vycm9yKHQpIHtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHQ7XG4gICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIF9zZXRSZWFkYWJsZVN0cmVhbSh0KSB7XG4gICAgICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSB0O1xuICAgICAgICAgIHQub24oXCJyZWFkYWJsZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMDtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0Lm9uKFwiZXJyb3JcIiwgdCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcih0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAhdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCAmJiB0aGlzLl9lcnJvcihuZXcgaS5BYm9ydEV4Y2VwdGlvbihcInN0cmVhbWluZyBpcyBkaXNhYmxlZFwiKSk7XG4gICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgJiYgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIEJhc2VSYW5nZVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB0aGlzLl91cmwgPSB0LnVybDtcbiAgICAgICAgICB0aGlzLl9kb25lID0gITE7XG4gICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsO1xuICAgICAgICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICAgICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIGNvbnN0IGUgPSB0LnNvdXJjZTtcbiAgICAgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFlLmRpc2FibGVTdHJlYW07XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRvblByb2dyZXNzNjtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG4gICAgICAgICAgaWYgKG51bGwgPT09IHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fbG9hZGVkICs9IHQubGVuZ3RoO1xuICAgICAgICAgIChfdGhpcyRvblByb2dyZXNzNiA9IHRoaXMub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX3RoaXMkb25Qcm9ncmVzczYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uUHJvZ3Jlc3M2LmNhbGwodGhpcywge1xuICAgICAgICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IG5ldyBVaW50OEFycmF5KHQpLmJ1ZmZlcixcbiAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwodCkge1xuICAgICAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID8gdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0KSA6IHRoaXMuX2Vycm9yKHQpO1xuICAgICAgICB9XG4gICAgICAgIF9lcnJvcih0KSB7XG4gICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB0O1xuICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0UmVhZGFibGVTdHJlYW0odCkge1xuICAgICAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gdDtcbiAgICAgICAgICB0Lm9uKFwicmVhZGFibGVcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHQub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcImVycm9yXCIsIHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IodCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgJiYgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RPcHRpb25zKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm90b2NvbDogdC5wcm90b2NvbCxcbiAgICAgICAgICBhdXRoOiB0LmF1dGgsXG4gICAgICAgICAgaG9zdDogdC5ob3N0bmFtZSxcbiAgICAgICAgICBwb3J0OiB0LnBvcnQsXG4gICAgICAgICAgcGF0aDogdC5wYXRoLFxuICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICBoZWFkZXJzOiBlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjbGFzcyBQREZOb2RlU3RyZWFtRnVsbFJlYWRlciBleHRlbmRzIEJhc2VGdWxsUmVhZGVyIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQpO1xuICAgICAgICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gZSA9PiB7XG4gICAgICAgICAgICBpZiAoNDA0ID09PSBlLnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24oXCJNaXNzaW5nIFBERiBcXFwiXCIuY29uY2F0KHRoaXMuX3VybCwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gdDtcbiAgICAgICAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KHQpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShlKTtcbiAgICAgICAgICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gdCA9PiB0aGlzLl9yZWFkYWJsZVN0cmVhbS5oZWFkZXJzW3QudG9Mb3dlckNhc2UoKV0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IG4sXG4gICAgICAgICAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoOiBzXG4gICAgICAgICAgICAgIH0gPSAoMCwgci52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoe1xuICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyOiBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgICAgICAgICAgICBpc0h0dHA6IHQuaXNIdHRwLFxuICAgICAgICAgICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBuO1xuICAgICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHMgfHwgdGhpcy5fY29udGVudExlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuX2ZpbGVuYW1lID0gKDAsIHIuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoZ2V0UmVzcG9uc2VIZWFkZXIpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgaWYgKFwiaHR0cDpcIiA9PT0gdGhpcy5fdXJsLnByb3RvY29sKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gX193ZWJwYWNrX3JlcXVpcmVfXyhPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdodHRwJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSBlLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0Lmh0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlID0gX193ZWJwYWNrX3JlcXVpcmVfXyhPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdodHRwcydcIik7IGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJzsgdGhyb3cgZTsgfSgpKSk7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gZS5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgdC5odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdC5vbihcImVycm9yXCIsIHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB0O1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3QuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlciBleHRlbmRzIEJhc2VSYW5nZVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgICBzdXBlcih0KTtcbiAgICAgICAgICB0aGlzLl9odHRwSGVhZGVycyA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgZSBpbiB0Lmh0dHBIZWFkZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5odHRwSGVhZGVyc1tlXTtcbiAgICAgICAgICAgIHZvaWQgMCAhPT0gbiAmJiAodGhpcy5faHR0cEhlYWRlcnNbZV0gPSBuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5faHR0cEhlYWRlcnMuUmFuZ2UgPSBcImJ5dGVzPVwiLmNvbmNhdChlLCBcIi1cIikuY29uY2F0KG4gLSAxKTtcbiAgICAgICAgICBjb25zdCBoYW5kbGVSZXNwb25zZSA9IHQgPT4ge1xuICAgICAgICAgICAgaWYgKDQwNCAhPT0gdC5zdGF0dXNDb2RlKSB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbSh0KTtlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24oXCJNaXNzaW5nIFBERiBcXFwiXCIuY29uY2F0KHRoaXMuX3VybCwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgICAgICAgIGlmIChcImh0dHA6XCIgPT09IHRoaXMuX3VybC5wcm90b2NvbCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IF9fd2VicGFja19yZXF1aXJlX18oT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnaHR0cCdcIik7IGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJzsgdGhyb3cgZTsgfSgpKSk7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gdC5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgdGhpcy5faHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKE9iamVjdChmdW5jdGlvbiB3ZWJwYWNrTWlzc2luZ01vZHVsZSgpIHsgdmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ2h0dHBzJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSB0LnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0aGlzLl9odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdC5vbihcImVycm9yXCIsIHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB0O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3QuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcih0KTtcbiAgICAgICAgICBsZXQgZSA9IGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLl91cmwucGF0aCk7XG4gICAgICAgICAgcy50ZXN0KHRoaXMuX3VybC5ocmVmKSAmJiAoZSA9IGUucmVwbGFjZSgvXlxcLy8sIFwiXCIpKTtcbiAgICAgICAgICBjb25zdCBuID0gX193ZWJwYWNrX3JlcXVpcmVfXyhPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdmcydcIik7IGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJzsgdGhyb3cgZTsgfSgpKSk7XG4gICAgICAgICAgbi5sc3RhdChlLCAodCwgcikgPT4ge1xuICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgXCJFTk9FTlRcIiA9PT0gdC5jb2RlICYmICh0ID0gbmV3IGkuTWlzc2luZ1BERkV4Y2VwdGlvbihcIk1pc3NpbmcgUERGIFxcXCJcIi5jb25jYXQoZSwgXCJcXFwiLlwiKSkpO1xuICAgICAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHQ7XG4gICAgICAgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSByLnNpemU7XG4gICAgICAgICAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKG4uY3JlYXRlUmVhZFN0cmVhbShlKSk7XG4gICAgICAgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgICAgc3VwZXIodCk7XG4gICAgICAgICAgbGV0IGkgPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO1xuICAgICAgICAgIHMudGVzdCh0aGlzLl91cmwuaHJlZikgJiYgKGkgPSBpLnJlcGxhY2UoL15cXC8vLCBcIlwiKSk7XG4gICAgICAgICAgY29uc3QgciA9IF9fd2VicGFja19yZXF1aXJlX18oT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnZnMnXCIpOyBlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7IHRocm93IGU7IH0oKSkpO1xuICAgICAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKHIuY3JlYXRlUmVhZFN0cmVhbShpLCB7XG4gICAgICAgICAgICBzdGFydDogZSxcbiAgICAgICAgICAgIGVuZDogbiAtIDFcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5TVkdHcmFwaGljcyA9IHZvaWQgMDtcbiAgICAgIG4oODQpO1xuICAgICAgbig4Nik7XG4gICAgICBuKDg3KTtcbiAgICAgIG4oOTMpO1xuICAgICAgbigxMDEpO1xuICAgICAgbigxMDIpO1xuICAgICAgbigxMDUpO1xuICAgICAgbigxMDcpO1xuICAgICAgbigxMDkpO1xuICAgICAgbigxMTMpO1xuICAgICAgbigxMTYpO1xuICAgICAgbigxMjMpO1xuICAgICAgbigyKTtcbiAgICAgIG4oODkpO1xuICAgICAgbigxODYpO1xuICAgICAgdmFyIGkgPSBuKDE2NyksXG4gICAgICAgIHIgPSBuKDEpO1xuICAgICAgY29uc3QgcyA9IFwibm9ybWFsXCIsXG4gICAgICAgIGEgPSBcIm5vcm1hbFwiLFxuICAgICAgICBvID0gXCIjMDAwMDAwXCIsXG4gICAgICAgIGwgPSBbXCJidXR0XCIsIFwicm91bmRcIiwgXCJzcXVhcmVcIl0sXG4gICAgICAgIGMgPSBbXCJtaXRlclwiLCBcInJvdW5kXCIsIFwiYmV2ZWxcIl0sXG4gICAgICAgIGNyZWF0ZU9iamVjdFVSTCA9IGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTCh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IFwiXCIsXG4gICAgICAgICAgICBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdO1xuICAgICAgICAgIGlmIChVUkwuY3JlYXRlT2JqZWN0VVJMICYmIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIEJsb2IgJiYgIW4pIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0XSwge1xuICAgICAgICAgICAgdHlwZTogZVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjb25zdCBpID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuICAgICAgICAgIGxldCByID0gXCJkYXRhOlwiLmNvbmNhdChlLCBcIjtiYXNlNjQsXCIpO1xuICAgICAgICAgIGZvciAobGV0IGUgPSAwLCBuID0gdC5sZW5ndGg7IGUgPCBuOyBlICs9IDMpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSAyNTUgJiB0W2VdLFxuICAgICAgICAgICAgICBhID0gMjU1ICYgdFtlICsgMV0sXG4gICAgICAgICAgICAgIG8gPSAyNTUgJiB0W2UgKyAyXTtcbiAgICAgICAgICAgIHIgKz0gaVtzID4+IDJdICsgaVsoMyAmIHMpIDw8IDQgfCBhID4+IDRdICsgaVtlICsgMSA8IG4gPyAoMTUgJiBhKSA8PCAyIHwgbyA+PiA2IDogNjRdICsgaVtlICsgMiA8IG4gPyA2MyAmIG8gOiA2NF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9LFxuICAgICAgICBoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgVWludDhBcnJheShbMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMF0pLFxuICAgICAgICAgICAgZSA9IG5ldyBJbnQzMkFycmF5KDI1Nik7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCAyNTY7IHQrKykge1xuICAgICAgICAgICAgbGV0IG4gPSB0O1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCA4OyB0KyspIG4gPSAxICYgbiA/IDM5ODgyOTIzODQgXiBuID4+IDEgJiAyMTQ3NDgzNjQ3IDogbiA+PiAxICYgMjE0NzQ4MzY0NztcbiAgICAgICAgICAgIGVbdF0gPSBuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmdW5jdGlvbiB3cml0ZVBuZ0NodW5rKHQsIG4sIGksIHIpIHtcbiAgICAgICAgICAgIGxldCBzID0gcjtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBuLmxlbmd0aDtcbiAgICAgICAgICAgIGlbc10gPSBhID4+IDI0ICYgMjU1O1xuICAgICAgICAgICAgaVtzICsgMV0gPSBhID4+IDE2ICYgMjU1O1xuICAgICAgICAgICAgaVtzICsgMl0gPSBhID4+IDggJiAyNTU7XG4gICAgICAgICAgICBpW3MgKyAzXSA9IDI1NSAmIGE7XG4gICAgICAgICAgICBzICs9IDQ7XG4gICAgICAgICAgICBpW3NdID0gMjU1ICYgdC5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgaVtzICsgMV0gPSAyNTUgJiB0LmNoYXJDb2RlQXQoMSk7XG4gICAgICAgICAgICBpW3MgKyAyXSA9IDI1NSAmIHQuY2hhckNvZGVBdCgyKTtcbiAgICAgICAgICAgIGlbcyArIDNdID0gMjU1ICYgdC5jaGFyQ29kZUF0KDMpO1xuICAgICAgICAgICAgcyArPSA0O1xuICAgICAgICAgICAgaS5zZXQobiwgcyk7XG4gICAgICAgICAgICBzICs9IG4ubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbyA9IGZ1bmN0aW9uIGNyYzMyKHQsIG4sIGkpIHtcbiAgICAgICAgICAgICAgbGV0IHIgPSAtMTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcyA9IG47IHMgPCBpOyBzKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gMjU1ICYgKHIgXiB0W3NdKTtcbiAgICAgICAgICAgICAgICByID0gciA+Pj4gOCBeIGVbbl07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIC0xIF4gcjtcbiAgICAgICAgICAgIH0oaSwgciArIDQsIHMpO1xuICAgICAgICAgICAgaVtzXSA9IG8gPj4gMjQgJiAyNTU7XG4gICAgICAgICAgICBpW3MgKyAxXSA9IG8gPj4gMTYgJiAyNTU7XG4gICAgICAgICAgICBpW3MgKyAyXSA9IG8gPj4gOCAmIDI1NTtcbiAgICAgICAgICAgIGlbcyArIDNdID0gMjU1ICYgbztcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVuY3Rpb24gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQodCkge1xuICAgICAgICAgICAgbGV0IGUgPSB0Lmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG4gPSA2NTUzNSxcbiAgICAgICAgICAgICAgaSA9IE1hdGguY2VpbChlIC8gbiksXG4gICAgICAgICAgICAgIHIgPSBuZXcgVWludDhBcnJheSgyICsgZSArIDUgKiBpICsgNCk7XG4gICAgICAgICAgICBsZXQgcyA9IDA7XG4gICAgICAgICAgICByW3MrK10gPSAxMjA7XG4gICAgICAgICAgICByW3MrK10gPSAxNTY7XG4gICAgICAgICAgICBsZXQgYSA9IDA7XG4gICAgICAgICAgICBmb3IgKDsgZSA+IG47KSB7XG4gICAgICAgICAgICAgIHJbcysrXSA9IDA7XG4gICAgICAgICAgICAgIHJbcysrXSA9IDI1NTtcbiAgICAgICAgICAgICAgcltzKytdID0gMjU1O1xuICAgICAgICAgICAgICByW3MrK10gPSAwO1xuICAgICAgICAgICAgICByW3MrK10gPSAwO1xuICAgICAgICAgICAgICByLnNldCh0LnN1YmFycmF5KGEsIGEgKyBuKSwgcyk7XG4gICAgICAgICAgICAgIHMgKz0gbjtcbiAgICAgICAgICAgICAgYSArPSBuO1xuICAgICAgICAgICAgICBlIC09IG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByW3MrK10gPSAxO1xuICAgICAgICAgICAgcltzKytdID0gMjU1ICYgZTtcbiAgICAgICAgICAgIHJbcysrXSA9IGUgPj4gOCAmIDI1NTtcbiAgICAgICAgICAgIHJbcysrXSA9IDI1NSAmIH5lO1xuICAgICAgICAgICAgcltzKytdID0gKDY1NTM1ICYgfmUpID4+IDggJiAyNTU7XG4gICAgICAgICAgICByLnNldCh0LnN1YmFycmF5KGEpLCBzKTtcbiAgICAgICAgICAgIHMgKz0gdC5sZW5ndGggLSBhO1xuICAgICAgICAgICAgY29uc3QgbyA9IGZ1bmN0aW9uIGFkbGVyMzIodCwgZSwgbikge1xuICAgICAgICAgICAgICBsZXQgaSA9IDEsXG4gICAgICAgICAgICAgICAgciA9IDA7XG4gICAgICAgICAgICAgIGZvciAobGV0IHMgPSBlOyBzIDwgbjsgKytzKSB7XG4gICAgICAgICAgICAgICAgaSA9IChpICsgKDI1NSAmIHRbc10pKSAlIDY1NTIxO1xuICAgICAgICAgICAgICAgIHIgPSAociArIGkpICUgNjU1MjE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHIgPDwgMTYgfCBpO1xuICAgICAgICAgICAgfSh0LCAwLCB0Lmxlbmd0aCk7XG4gICAgICAgICAgICByW3MrK10gPSBvID4+IDI0ICYgMjU1O1xuICAgICAgICAgICAgcltzKytdID0gbyA+PiAxNiAmIDI1NTtcbiAgICAgICAgICAgIHJbcysrXSA9IG8gPj4gOCAmIDI1NTtcbiAgICAgICAgICAgIHJbcysrXSA9IDI1NSAmIG87XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVuY3Rpb24gZW5jb2RlKGUsIG4sIGksIHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBlLndpZHRoLFxuICAgICAgICAgICAgICBvID0gZS5oZWlnaHQ7XG4gICAgICAgICAgICBsZXQgbCwgYywgaDtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBlLmRhdGE7XG4gICAgICAgICAgICBzd2l0Y2ggKG4pIHtcbiAgICAgICAgICAgICAgY2FzZSByLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDpcbiAgICAgICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgICAgICBsID0gMTtcbiAgICAgICAgICAgICAgICBoID0gYSArIDcgPj4gMztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLkltYWdlS2luZC5SR0JfMjRCUFA6XG4gICAgICAgICAgICAgICAgYyA9IDI7XG4gICAgICAgICAgICAgICAgbCA9IDg7XG4gICAgICAgICAgICAgICAgaCA9IDMgKiBhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuSW1hZ2VLaW5kLlJHQkFfMzJCUFA6XG4gICAgICAgICAgICAgICAgYyA9IDY7XG4gICAgICAgICAgICAgICAgbCA9IDg7XG4gICAgICAgICAgICAgICAgaCA9IDQgKiBhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZm9ybWF0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdSA9IG5ldyBVaW50OEFycmF5KCgxICsgaCkgKiBvKTtcbiAgICAgICAgICAgIGxldCBwID0gMCxcbiAgICAgICAgICAgICAgZiA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IG87ICsrdCkge1xuICAgICAgICAgICAgICB1W3ArK10gPSAwO1xuICAgICAgICAgICAgICB1LnNldChkLnN1YmFycmF5KGYsIGYgKyBoKSwgcCk7XG4gICAgICAgICAgICAgIGYgKz0gaDtcbiAgICAgICAgICAgICAgcCArPSBoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG4gPT09IHIuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQICYmIHMpIHtcbiAgICAgICAgICAgICAgcCA9IDA7XG4gICAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgbzsgdCsrKSB7XG4gICAgICAgICAgICAgICAgcCsrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgaDsgdCsrKSB1W3ArK10gXj0gMjU1O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBnID0gbmV3IFVpbnQ4QXJyYXkoW2EgPj4gMjQgJiAyNTUsIGEgPj4gMTYgJiAyNTUsIGEgPj4gOCAmIDI1NSwgMjU1ICYgYSwgbyA+PiAyNCAmIDI1NSwgbyA+PiAxNiAmIDI1NSwgbyA+PiA4ICYgMjU1LCAyNTUgJiBvLCBsLCBjLCAwLCAwLCAwXSksXG4gICAgICAgICAgICAgIG0gPSBmdW5jdGlvbiBkZWZsYXRlU3luYyh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyLmlzTm9kZUpTKSByZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQodCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBwYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUpID49IDggPyB0IDogQnVmZmVyLmZyb20odCksXG4gICAgICAgICAgICAgICAgICAgIG4gPSBPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICd6bGliJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogOVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuIGluc3RhbmNlb2YgVWludDhBcnJheSA/IG4gOiBuZXcgVWludDhBcnJheShuKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICAoMCwgci53YXJuKShcIk5vdCBjb21wcmVzc2luZyBQTkcgYmVjYXVzZSB6bGliLmRlZmxhdGVTeW5jIGlzIHVuYXZhaWxhYmxlOiBcIiArIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQodCk7XG4gICAgICAgICAgICAgIH0odSksXG4gICAgICAgICAgICAgIGIgPSB0Lmxlbmd0aCArIDM2ICsgZy5sZW5ndGggKyBtLmxlbmd0aCxcbiAgICAgICAgICAgICAgdiA9IG5ldyBVaW50OEFycmF5KGIpO1xuICAgICAgICAgICAgbGV0IHkgPSAwO1xuICAgICAgICAgICAgdi5zZXQodCwgeSk7XG4gICAgICAgICAgICB5ICs9IHQubGVuZ3RoO1xuICAgICAgICAgICAgd3JpdGVQbmdDaHVuayhcIklIRFJcIiwgZywgdiwgeSk7XG4gICAgICAgICAgICB5ICs9IDEyICsgZy5sZW5ndGg7XG4gICAgICAgICAgICB3cml0ZVBuZ0NodW5rKFwiSURBVEFcIiwgbSwgdiwgeSk7XG4gICAgICAgICAgICB5ICs9IDEyICsgbS5sZW5ndGg7XG4gICAgICAgICAgICB3cml0ZVBuZ0NodW5rKFwiSUVORFwiLCBuZXcgVWludDhBcnJheSgwKSwgdiwgeSk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlT2JqZWN0VVJMKHYsIFwiaW1hZ2UvcG5nXCIsIGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gY29udmVydEltZ0RhdGFUb1BuZyh0LCBlLCBuKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlKHQsIHZvaWQgMCA9PT0gdC5raW5kID8gci5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAgOiB0LmtpbmQsIGUsIG4pO1xuICAgICAgICAgIH07XG4gICAgICAgIH0oKTtcbiAgICAgIGNsYXNzIFNWR0V4dHJhU3RhdGUge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMuZm9udFdlaWdodCA9IGE7XG4gICAgICAgICAgdGhpcy5mb250U2l6ZSA9IDA7XG4gICAgICAgICAgdGhpcy50ZXh0TWF0cml4ID0gci5JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgdGhpcy5mb250TWF0cml4ID0gci5GT05UX0lERU5USVRZX01BVFJJWDtcbiAgICAgICAgICB0aGlzLmxlYWRpbmcgPSAwO1xuICAgICAgICAgIHRoaXMudGV4dFJlbmRlcmluZ01vZGUgPSByLlRleHRSZW5kZXJpbmdNb2RlLkZJTEw7XG4gICAgICAgICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMueCA9IDA7XG4gICAgICAgICAgdGhpcy55ID0gMDtcbiAgICAgICAgICB0aGlzLmxpbmVYID0gMDtcbiAgICAgICAgICB0aGlzLmxpbmVZID0gMDtcbiAgICAgICAgICB0aGlzLmNoYXJTcGFjaW5nID0gMDtcbiAgICAgICAgICB0aGlzLndvcmRTcGFjaW5nID0gMDtcbiAgICAgICAgICB0aGlzLnRleHRIU2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMudGV4dFJpc2UgPSAwO1xuICAgICAgICAgIHRoaXMuZmlsbENvbG9yID0gbztcbiAgICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gXCIjMDAwMDAwXCI7XG4gICAgICAgICAgdGhpcy5maWxsQWxwaGEgPSAxO1xuICAgICAgICAgIHRoaXMuc3Ryb2tlQWxwaGEgPSAxO1xuICAgICAgICAgIHRoaXMubGluZVdpZHRoID0gMTtcbiAgICAgICAgICB0aGlzLmxpbmVKb2luID0gXCJcIjtcbiAgICAgICAgICB0aGlzLmxpbmVDYXAgPSBcIlwiO1xuICAgICAgICAgIHRoaXMubWl0ZXJMaW1pdCA9IDA7XG4gICAgICAgICAgdGhpcy5kYXNoQXJyYXkgPSBbXTtcbiAgICAgICAgICB0aGlzLmRhc2hQaGFzZSA9IDA7XG4gICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNsaXBVcmwgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY2xpcEdyb3VwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLm1hc2tJZCA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgY2xvbmUoKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q3VycmVudFBvaW50KHQsIGUpIHtcbiAgICAgICAgICB0aGlzLnggPSB0O1xuICAgICAgICAgIHRoaXMueSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHBmKHQpIHtcbiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodCkpIHJldHVybiB0LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGUgPSB0LnRvRml4ZWQoMTApO1xuICAgICAgICBsZXQgbiA9IGUubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKFwiMFwiICE9PSBlW25dKSByZXR1cm4gZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIG4tLTtcbiAgICAgICAgfSB3aGlsZSAoXCIwXCIgPT09IGVbbl0pO1xuICAgICAgICByZXR1cm4gZS5zdWJzdHJpbmcoMCwgXCIuXCIgPT09IGVbbl0gPyBuIDogbiArIDEpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcG0odCkge1xuICAgICAgICBpZiAoMCA9PT0gdFs0XSAmJiAwID09PSB0WzVdKSB7XG4gICAgICAgICAgaWYgKDAgPT09IHRbMV0gJiYgMCA9PT0gdFsyXSkgcmV0dXJuIDEgPT09IHRbMF0gJiYgMSA9PT0gdFszXSA/IFwiXCIgOiBcInNjYWxlKFwiLmNvbmNhdChwZih0WzBdKSwgXCIgXCIpLmNvbmNhdChwZih0WzNdKSwgXCIpXCIpO1xuICAgICAgICAgIGlmICh0WzBdID09PSB0WzNdICYmIHRbMV0gPT09IC10WzJdKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJyb3RhdGUoXCIuY29uY2F0KHBmKDE4MCAqIE1hdGguYWNvcyh0WzBdKSAvIE1hdGguUEkpLCBcIilcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKDEgPT09IHRbMF0gJiYgMCA9PT0gdFsxXSAmJiAwID09PSB0WzJdICYmIDEgPT09IHRbM10pIHJldHVybiBcInRyYW5zbGF0ZShcIi5jb25jYXQocGYodFs0XSksIFwiIFwiKS5jb25jYXQocGYodFs1XSksIFwiKVwiKTtcbiAgICAgICAgcmV0dXJuIFwibWF0cml4KFwiLmNvbmNhdChwZih0WzBdKSwgXCIgXCIpLmNvbmNhdChwZih0WzFdKSwgXCIgXCIpLmNvbmNhdChwZih0WzJdKSwgXCIgXCIpLmNvbmNhdChwZih0WzNdKSwgXCIgXCIpLmNvbmNhdChwZih0WzRdKSwgXCIgXCIpLmNvbmNhdChwZih0WzVdKSwgXCIpXCIpO1xuICAgICAgfVxuICAgICAgbGV0IGQgPSAwLFxuICAgICAgICB1ID0gMCxcbiAgICAgICAgcCA9IDA7XG4gICAgICBlLlNWR0dyYXBoaWNzID0gY2xhc3MgU1ZHR3JhcGhpY3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgbGV0IG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSAmJiBhcmd1bWVudHNbMl07XG4gICAgICAgICAgKDAsIGkuZGVwcmVjYXRlZCkoXCJUaGUgU1ZHIGJhY2stZW5kIGlzIG5vIGxvbmdlciBtYWludGFpbmVkIGFuZCAqbWF5KiBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXCIpO1xuICAgICAgICAgIHRoaXMuc3ZnRmFjdG9yeSA9IG5ldyBpLkRPTVNWR0ZhY3RvcnkoKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBuZXcgU1ZHRXh0cmFTdGF0ZSgpO1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gci5JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgdGhpcy50cmFuc2Zvcm1TdGFjayA9IFtdO1xuICAgICAgICAgIHRoaXMuZXh0cmFTdGFjayA9IFtdO1xuICAgICAgICAgIHRoaXMuY29tbW9uT2JqcyA9IHQ7XG4gICAgICAgICAgdGhpcy5vYmpzID0gZTtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMTtcbiAgICAgICAgICB0aGlzLmVtYmVkRm9udHMgPSAhMTtcbiAgICAgICAgICB0aGlzLmVtYmVkZGVkRm9udHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuY3NzU3R5bGUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZm9yY2VEYXRhU2NoZW1hID0gISFuO1xuICAgICAgICAgIHRoaXMuX29wZXJhdG9ySWRNYXBwaW5nID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCB0IGluIHIuT1BTKSB0aGlzLl9vcGVyYXRvcklkTWFwcGluZ1tyLk9QU1t0XV0gPSB0O1xuICAgICAgICB9XG4gICAgICAgIGdldE9iamVjdCh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgPyB0LnN0YXJ0c1dpdGgoXCJnX1wiKSA/IHRoaXMuY29tbW9uT2Jqcy5nZXQodCkgOiB0aGlzLm9ianMuZ2V0KHQpIDogZTtcbiAgICAgICAgfVxuICAgICAgICBzYXZlKCkge1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLnRyYW5zZm9ybU1hdHJpeCk7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICB0aGlzLmV4dHJhU3RhY2sucHVzaCh0KTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0LmNsb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdG9yZSgpIHtcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHRoaXMudHJhbnNmb3JtU3RhY2sucG9wKCk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5leHRyYVN0YWNrLnBvcCgpO1xuICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgICAgICAgIHRoaXMudGdycCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAodCkge1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZSh0KTtcbiAgICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2FkRGVwZW5kZW5jaWVzKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdC5mbkFycmF5LFxuICAgICAgICAgICAgbiA9IHQuYXJnc0FycmF5O1xuICAgICAgICAgIGZvciAobGV0IHQgPSAwLCBpID0gZS5sZW5ndGg7IHQgPCBpOyB0KyspIGlmIChlW3RdID09PSByLk9QUy5kZXBlbmRlbmN5KSBmb3IgKGNvbnN0IGUgb2Ygblt0XSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuc3RhcnRzV2l0aChcImdfXCIpID8gdGhpcy5jb21tb25PYmpzIDogdGhpcy5vYmpzLFxuICAgICAgICAgICAgICBuID0gbmV3IFByb21pc2UobiA9PiB7XG4gICAgICAgICAgICAgICAgdC5nZXQoZSwgbik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcy5wdXNoKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcyk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNmb3JtKHQsIGUsIG4sIGksIHMsIGEpIHtcbiAgICAgICAgICBjb25zdCBvID0gW3QsIGUsIG4sIGksIHMsIGFdO1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gci5VdGlsLnRyYW5zZm9ybSh0aGlzLnRyYW5zZm9ybU1hdHJpeCwgbyk7XG4gICAgICAgICAgdGhpcy50Z3JwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXRTVkcodCwgZSkge1xuICAgICAgICAgIHRoaXMudmlld3BvcnQgPSBlO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9pbml0aWFsaXplKGUpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmxvYWREZXBlbmRlbmNpZXModCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHIuSURFTlRJVFlfTUFUUklYO1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlT3BUcmVlKHRoaXMuY29udmVydE9wTGlzdCh0KSk7XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb252ZXJ0T3BMaXN0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmcsXG4gICAgICAgICAgICBuID0gdC5hcmdzQXJyYXksXG4gICAgICAgICAgICBpID0gdC5mbkFycmF5LFxuICAgICAgICAgICAgciA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHQgPSAwLCBzID0gaS5sZW5ndGg7IHQgPCBzOyB0KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBpW3RdO1xuICAgICAgICAgICAgci5wdXNoKHtcbiAgICAgICAgICAgICAgZm5JZDogcyxcbiAgICAgICAgICAgICAgZm46IGVbc10sXG4gICAgICAgICAgICAgIGFyZ3M6IG5bdF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gb3BMaXN0VG9UcmVlKHQpIHtcbiAgICAgICAgICAgIGxldCBlID0gW107XG4gICAgICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdCkgaWYgKFwic2F2ZVwiICE9PSBpLmZuKSBcInJlc3RvcmVcIiA9PT0gaS5mbiA/IGUgPSBuLnBvcCgpIDogZS5wdXNoKGkpO2Vsc2Uge1xuICAgICAgICAgICAgICBlLnB1c2goe1xuICAgICAgICAgICAgICAgIGZuSWQ6IDkyLFxuICAgICAgICAgICAgICAgIGZuOiBcImdyb3VwXCIsXG4gICAgICAgICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuLnB1c2goZSk7XG4gICAgICAgICAgICAgIGUgPSBlLmF0KC0xKS5pdGVtcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH0ocik7XG4gICAgICAgIH1cbiAgICAgICAgZXhlY3V0ZU9wVHJlZSh0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmZuLFxuICAgICAgICAgICAgICBuID0gZS5mbklkLFxuICAgICAgICAgICAgICBpID0gZS5hcmdzO1xuICAgICAgICAgICAgc3dpdGNoICgwIHwgbikge1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmJlZ2luVGV4dDpcbiAgICAgICAgICAgICAgICB0aGlzLmJlZ2luVGV4dCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmRlcGVuZGVuY3k6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0TGVhZGluZzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExlYWRpbmcoaSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0TGVhZGluZ01vdmVUZXh0OlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGVhZGluZ01vdmVUZXh0KGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldEZvbnQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb250KGkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNob3dUZXh0OlxuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNob3dTcGFjZWRUZXh0OlxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1RleHQoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuZW5kVGV4dDpcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFRleHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5tb3ZlVGV4dDpcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVUZXh0KGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldENoYXJTcGFjaW5nOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hhclNwYWNpbmcoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0V29yZFNwYWNpbmc6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRXb3JkU3BhY2luZyhpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRIU2NhbGU6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIU2NhbGUoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0VGV4dE1hdHJpeDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHRNYXRyaXgoaVswXSwgaVsxXSwgaVsyXSwgaVszXSwgaVs0XSwgaVs1XSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0VGV4dFJpc2U6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUZXh0UmlzZShpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRUZXh0UmVuZGVyaW5nTW9kZTpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHRSZW5kZXJpbmdNb2RlKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldExpbmVXaWR0aDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aChpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRMaW5lSm9pbjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExpbmVKb2luKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldExpbmVDYXA6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lQ2FwKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldE1pdGVyTGltaXQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldEZpbGxSR0JDb2xvcjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZpbGxSR0JDb2xvcihpWzBdLCBpWzFdLCBpWzJdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRTdHJva2VSR0JDb2xvcjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0cm9rZVJHQkNvbG9yKGlbMF0sIGlbMV0sIGlbMl0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldFN0cm9rZUNvbG9yTjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0cm9rZUNvbG9yTihpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRGaWxsQ29sb3JOOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RmlsbENvbG9yTihpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zaGFkaW5nRmlsbDpcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRpbmdGaWxsKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldERhc2g6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXNoKGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldFJlbmRlcmluZ0ludGVudDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJlbmRlcmluZ0ludGVudChpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRGbGF0bmVzczpcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZsYXRuZXNzKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldEdTdGF0ZTpcbiAgICAgICAgICAgICAgICB0aGlzLnNldEdTdGF0ZShpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5maWxsOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsbCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmVvRmlsbDpcbiAgICAgICAgICAgICAgICB0aGlzLmVvRmlsbCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnN0cm9rZTpcbiAgICAgICAgICAgICAgICB0aGlzLnN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmZpbGxTdHJva2U6XG4gICAgICAgICAgICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuZW9GaWxsU3Ryb2tlOlxuICAgICAgICAgICAgICAgIHRoaXMuZW9GaWxsU3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuY2xpcDpcbiAgICAgICAgICAgICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmVvQ2xpcDpcbiAgICAgICAgICAgICAgICB0aGlzLmNsaXAoXCJldmVub2RkXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzazpcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50U29saWRDb2xvckltYWdlTWFzaygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnBhaW50SW1hZ2VYT2JqZWN0OlxuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRJbWFnZVhPYmplY3QoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5wYWludEltYWdlTWFza1hPYmplY3Q6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludEltYWdlTWFza1hPYmplY3QoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMucGFpbnRGb3JtWE9iamVjdEJlZ2luOlxuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRGb3JtWE9iamVjdEJlZ2luKGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnBhaW50Rm9ybVhPYmplY3RFbmQ6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludEZvcm1YT2JqZWN0RW5kKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuY2xvc2VQYXRoOlxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuY2xvc2VTdHJva2U6XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmNsb3NlRmlsbFN0cm9rZTpcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlRmlsbFN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmNsb3NlRU9GaWxsU3Ryb2tlOlxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VFT0ZpbGxTdHJva2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5uZXh0TGluZTpcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRMaW5lKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMudHJhbnNmb3JtOlxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKGlbMF0sIGlbMV0sIGlbMl0sIGlbM10sIGlbNF0sIGlbNV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmNvbnN0cnVjdFBhdGg6XG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RQYXRoKGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmVuZFBhdGg6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgOTI6XG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cChlLml0ZW1zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAoMCwgci53YXJuKShcIlVuaW1wbGVtZW50ZWQgb3BlcmF0b3IgXCIuY29uY2F0KHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0V29yZFNwYWNpbmcodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC53b3JkU3BhY2luZyA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q2hhclNwYWNpbmcodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5jaGFyU3BhY2luZyA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dExpbmUoKSB7XG4gICAgICAgICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGV4dE1hdHJpeCh0LCBlLCBuLCBpLCByLCBzKSB7XG4gICAgICAgICAgY29uc3QgYSA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICBhLnRleHRNYXRyaXggPSBhLmxpbmVNYXRyaXggPSBbdCwgZSwgbiwgaSwgciwgc107XG4gICAgICAgICAgYS50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLmh5cG90KHQsIGUpO1xuICAgICAgICAgIGEueCA9IGEubGluZVggPSAwO1xuICAgICAgICAgIGEueSA9IGEubGluZVkgPSAwO1xuICAgICAgICAgIGEueGNvb3JkcyA9IFtdO1xuICAgICAgICAgIGEueWNvb3JkcyA9IFtdO1xuICAgICAgICAgIGEudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0c3BhblwiKTtcbiAgICAgICAgICBhLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1mYW1pbHlcIiwgYS5mb250RmFtaWx5KTtcbiAgICAgICAgICBhLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1zaXplXCIsIFwiXCIuY29uY2F0KHBmKGEuZm9udFNpemUpLCBcInB4XCIpKTtcbiAgICAgICAgICBhLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtYS55KSk7XG4gICAgICAgICAgYS50eHRFbGVtZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dGV4dFwiKTtcbiAgICAgICAgICBhLnR4dEVsZW1lbnQuYXBwZW5kKGEudHNwYW4pO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luVGV4dCgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAgIHQueCA9IHQubGluZVggPSAwO1xuICAgICAgICAgIHQueSA9IHQubGluZVkgPSAwO1xuICAgICAgICAgIHQudGV4dE1hdHJpeCA9IHIuSURFTlRJVFlfTUFUUklYO1xuICAgICAgICAgIHQubGluZU1hdHJpeCA9IHIuSURFTlRJVFlfTUFUUklYO1xuICAgICAgICAgIHQudGV4dE1hdHJpeFNjYWxlID0gMTtcbiAgICAgICAgICB0LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG4gICAgICAgICAgdC50eHRFbGVtZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dGV4dFwiKTtcbiAgICAgICAgICB0LnR4dGdycCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmdcIik7XG4gICAgICAgICAgdC54Y29vcmRzID0gW107XG4gICAgICAgICAgdC55Y29vcmRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgbW92ZVRleHQodCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgbi54ID0gbi5saW5lWCArPSB0O1xuICAgICAgICAgIG4ueSA9IG4ubGluZVkgKz0gZTtcbiAgICAgICAgICBuLnhjb29yZHMgPSBbXTtcbiAgICAgICAgICBuLnljb29yZHMgPSBbXTtcbiAgICAgICAgICBuLnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG4gICAgICAgICAgbi50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtZmFtaWx5XCIsIG4uZm9udEZhbWlseSk7XG4gICAgICAgICAgbi50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc2l6ZVwiLCBcIlwiLmNvbmNhdChwZihuLmZvbnRTaXplKSwgXCJweFwiKSk7XG4gICAgICAgICAgbi50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgcGYoLW4ueSkpO1xuICAgICAgICB9XG4gICAgICAgIHNob3dUZXh0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgbiA9IGUuZm9udCxcbiAgICAgICAgICAgIGkgPSBlLmZvbnRTaXplO1xuICAgICAgICAgIGlmICgwID09PSBpKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgbCA9IGUuZm9udFNpemVTY2FsZSxcbiAgICAgICAgICAgIGMgPSBlLmNoYXJTcGFjaW5nLFxuICAgICAgICAgICAgaCA9IGUud29yZFNwYWNpbmcsXG4gICAgICAgICAgICBkID0gZS5mb250RGlyZWN0aW9uLFxuICAgICAgICAgICAgdSA9IGUudGV4dEhTY2FsZSAqIGQsXG4gICAgICAgICAgICBwID0gbi52ZXJ0aWNhbCxcbiAgICAgICAgICAgIGYgPSBwID8gMSA6IC0xLFxuICAgICAgICAgICAgZyA9IG4uZGVmYXVsdFZNZXRyaWNzLFxuICAgICAgICAgICAgbSA9IGkgKiBlLmZvbnRNYXRyaXhbMF07XG4gICAgICAgICAgbGV0IGIgPSAwO1xuICAgICAgICAgIGZvciAoY29uc3QgciBvZiB0KSB7XG4gICAgICAgICAgICBpZiAobnVsbCA9PT0gcikge1xuICAgICAgICAgICAgICBiICs9IGQgKiBoO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiByKSB7XG4gICAgICAgICAgICAgIGIgKz0gZiAqIHIgKiBpIC8gMWUzO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHQgPSAoci5pc1NwYWNlID8gaCA6IDApICsgYyxcbiAgICAgICAgICAgICAgcyA9IHIuZm9udENoYXI7XG4gICAgICAgICAgICBsZXQgYSxcbiAgICAgICAgICAgICAgbyxcbiAgICAgICAgICAgICAgdSA9IHIud2lkdGg7XG4gICAgICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgICBsZXQgdDtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IHIudm1ldHJpYyB8fCBnO1xuICAgICAgICAgICAgICB0ID0gci52bWV0cmljID8gZVsxXSA6IC41ICogdTtcbiAgICAgICAgICAgICAgdCA9IC10ICogbTtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IGVbMl0gKiBtO1xuICAgICAgICAgICAgICB1ID0gZSA/IC1lWzBdIDogdTtcbiAgICAgICAgICAgICAgYSA9IHQgLyBsO1xuICAgICAgICAgICAgICBvID0gKGIgKyBuKSAvIGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhID0gYiAvIGw7XG4gICAgICAgICAgICAgIG8gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHIuaXNJbkZvbnQgfHwgbi5taXNzaW5nRmlsZSkge1xuICAgICAgICAgICAgICBlLnhjb29yZHMucHVzaChlLnggKyBhKTtcbiAgICAgICAgICAgICAgcCAmJiBlLnljb29yZHMucHVzaCgtZS55ICsgbyk7XG4gICAgICAgICAgICAgIGUudHNwYW4udGV4dENvbnRlbnQgKz0gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGIgKz0gcCA/IHUgKiBtIC0gdCAqIGQgOiB1ICogbSArIHQgKiBkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBlLnhjb29yZHMubWFwKHBmKS5qb2luKFwiIFwiKSk7XG4gICAgICAgICAgcCA/IGUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIGUueWNvb3Jkcy5tYXAocGYpLmpvaW4oXCIgXCIpKSA6IGUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1lLnkpKTtcbiAgICAgICAgICBwID8gZS55IC09IGIgOiBlLnggKz0gYiAqIHU7XG4gICAgICAgICAgZS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtZmFtaWx5XCIsIGUuZm9udEZhbWlseSk7XG4gICAgICAgICAgZS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc2l6ZVwiLCBcIlwiLmNvbmNhdChwZihlLmZvbnRTaXplKSwgXCJweFwiKSk7XG4gICAgICAgICAgZS5mb250U3R5bGUgIT09IHMgJiYgZS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc3R5bGVcIiwgZS5mb250U3R5bGUpO1xuICAgICAgICAgIGUuZm9udFdlaWdodCAhPT0gYSAmJiBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC13ZWlnaHRcIiwgZS5mb250V2VpZ2h0KTtcbiAgICAgICAgICBjb25zdCB2ID0gZS50ZXh0UmVuZGVyaW5nTW9kZSAmIHIuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztcbiAgICAgICAgICBpZiAodiA9PT0gci5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMIHx8IHYgPT09IHIuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgICAgIGUuZmlsbENvbG9yICE9PSBvICYmIGUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIGUuZmlsbENvbG9yKTtcbiAgICAgICAgICAgIGUuZmlsbEFscGhhIDwgMSAmJiBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbC1vcGFjaXR5XCIsIGUuZmlsbEFscGhhKTtcbiAgICAgICAgICB9IGVsc2UgZS50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gci5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSCA/IGUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIikgOiBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIm5vbmVcIik7XG4gICAgICAgICAgaWYgKHYgPT09IHIuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IHYgPT09IHIuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSAxIC8gKGUudGV4dE1hdHJpeFNjYWxlIHx8IDEpO1xuICAgICAgICAgICAgdGhpcy5fc2V0U3Ryb2tlQXR0cmlidXRlcyhlLnRzcGFuLCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHkgPSBlLnRleHRNYXRyaXg7XG4gICAgICAgICAgaWYgKDAgIT09IGUudGV4dFJpc2UpIHtcbiAgICAgICAgICAgIHkgPSB5LnNsaWNlKCk7XG4gICAgICAgICAgICB5WzVdICs9IGUudGV4dFJpc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGUudHh0RWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBcIlwiLmNvbmNhdChwbSh5KSwgXCIgc2NhbGUoXCIpLmNvbmNhdChwZih1KSwgXCIsIC0xKVwiKSk7XG4gICAgICAgICAgZS50eHRFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsIFwieG1sOnNwYWNlXCIsIFwicHJlc2VydmVcIik7XG4gICAgICAgICAgZS50eHRFbGVtZW50LmFwcGVuZChlLnRzcGFuKTtcbiAgICAgICAgICBlLnR4dGdycC5hcHBlbmQoZS50eHRFbGVtZW50KTtcbiAgICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZChlLnR4dEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHNldExlYWRpbmdNb3ZlVGV4dCh0LCBlKSB7XG4gICAgICAgICAgdGhpcy5zZXRMZWFkaW5nKC1lKTtcbiAgICAgICAgICB0aGlzLm1vdmVUZXh0KHQsIGUpO1xuICAgICAgICB9XG4gICAgICAgIGFkZEZvbnRTdHlsZSh0KSB7XG4gICAgICAgICAgaWYgKCF0LmRhdGEpIHRocm93IG5ldyBFcnJvcignYWRkRm9udFN0eWxlOiBObyBmb250IGRhdGEgYXZhaWxhYmxlLCBlbnN1cmUgdGhhdCB0aGUgXCJmb250RXh0cmFQcm9wZXJ0aWVzXCIgQVBJIHBhcmFtZXRlciBpcyBzZXQuJyk7XG4gICAgICAgICAgaWYgKCF0aGlzLmNzc1N0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLmNzc1N0eWxlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6c3R5bGVcIik7XG4gICAgICAgICAgICB0aGlzLmNzc1N0eWxlLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHlwZVwiLCBcInRleHQvY3NzXCIpO1xuICAgICAgICAgICAgdGhpcy5kZWZzLmFwcGVuZCh0aGlzLmNzc1N0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZSA9IGNyZWF0ZU9iamVjdFVSTCh0LmRhdGEsIHQubWltZXR5cGUsIHRoaXMuZm9yY2VEYXRhU2NoZW1hKTtcbiAgICAgICAgICB0aGlzLmNzc1N0eWxlLnRleHRDb250ZW50ICs9IFwiQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiBcXFwiXCIuY29uY2F0KHQubG9hZGVkTmFtZSwgXCJcXFwiOyBzcmM6IHVybChcIikuY29uY2F0KGUsIFwiKTsgfVxcblwiKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRGb250KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgbiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQodFswXSk7XG4gICAgICAgICAgbGV0IGkgPSB0WzFdO1xuICAgICAgICAgIGUuZm9udCA9IG47XG4gICAgICAgICAgaWYgKHRoaXMuZW1iZWRGb250cyAmJiAhbi5taXNzaW5nRmlsZSAmJiAhdGhpcy5lbWJlZGRlZEZvbnRzW24ubG9hZGVkTmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRm9udFN0eWxlKG4pO1xuICAgICAgICAgICAgdGhpcy5lbWJlZGRlZEZvbnRzW24ubG9hZGVkTmFtZV0gPSBuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlLmZvbnRNYXRyaXggPSBuLmZvbnRNYXRyaXggfHwgci5GT05UX0lERU5USVRZX01BVFJJWDtcbiAgICAgICAgICBsZXQgcyA9IFwibm9ybWFsXCI7XG4gICAgICAgICAgbi5ibGFjayA/IHMgPSBcIjkwMFwiIDogbi5ib2xkICYmIChzID0gXCJib2xkXCIpO1xuICAgICAgICAgIGNvbnN0IGEgPSBuLml0YWxpYyA/IFwiaXRhbGljXCIgOiBcIm5vcm1hbFwiO1xuICAgICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgaSA9IC1pO1xuICAgICAgICAgICAgZS5mb250RGlyZWN0aW9uID0gLTE7XG4gICAgICAgICAgfSBlbHNlIGUuZm9udERpcmVjdGlvbiA9IDE7XG4gICAgICAgICAgZS5mb250U2l6ZSA9IGk7XG4gICAgICAgICAgZS5mb250RmFtaWx5ID0gbi5sb2FkZWROYW1lO1xuICAgICAgICAgIGUuZm9udFdlaWdodCA9IHM7XG4gICAgICAgICAgZS5mb250U3R5bGUgPSBhO1xuICAgICAgICAgIGUudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0c3BhblwiKTtcbiAgICAgICAgICBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtZS55KSk7XG4gICAgICAgICAgZS54Y29vcmRzID0gW107XG4gICAgICAgICAgZS55Y29vcmRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZW5kVGV4dCgpIHtcbiAgICAgICAgICB2YXIgX3QkdHh0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAgIGlmICh0LnRleHRSZW5kZXJpbmdNb2RlICYgci5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHICYmIChfdCR0eHRFbGVtZW50ID0gdC50eHRFbGVtZW50KSAhPT0gbnVsbCAmJiBfdCR0eHRFbGVtZW50ICE9PSB2b2lkIDAgJiYgX3QkdHh0RWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgIHQuZWxlbWVudCA9IHQudHh0RWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuY2xpcChcIm5vbnplcm9cIik7XG4gICAgICAgICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0TGluZVdpZHRoKHQpIHtcbiAgICAgICAgICB0ID4gMCAmJiAodGhpcy5jdXJyZW50LmxpbmVXaWR0aCA9IHQpO1xuICAgICAgICB9XG4gICAgICAgIHNldExpbmVDYXAodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5saW5lQ2FwID0gbFt0XTtcbiAgICAgICAgfVxuICAgICAgICBzZXRMaW5lSm9pbih0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmxpbmVKb2luID0gY1t0XTtcbiAgICAgICAgfVxuICAgICAgICBzZXRNaXRlckxpbWl0KHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQubWl0ZXJMaW1pdCA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3Ryb2tlQWxwaGEodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VBbHBoYSA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3Ryb2tlUkdCQ29sb3IodCwgZSwgbikge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHIuVXRpbC5tYWtlSGV4Q29sb3IodCwgZSwgbik7XG4gICAgICAgIH1cbiAgICAgICAgc2V0RmlsbEFscGhhKHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbEFscGhhID0gdDtcbiAgICAgICAgfVxuICAgICAgICBzZXRGaWxsUkdCQ29sb3IodCwgZSwgbikge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSByLlV0aWwubWFrZUhleENvbG9yKHQsIGUsIG4pO1xuICAgICAgICAgIHRoaXMuY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRzcGFuXCIpO1xuICAgICAgICAgIHRoaXMuY3VycmVudC54Y29vcmRzID0gW107XG4gICAgICAgICAgdGhpcy5jdXJyZW50Lnljb29yZHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBzZXRTdHJva2VDb2xvck4odCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHRoaXMuX21ha2VDb2xvck5fUGF0dGVybih0KTtcbiAgICAgICAgfVxuICAgICAgICBzZXRGaWxsQ29sb3JOKHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdGhpcy5fbWFrZUNvbG9yTl9QYXR0ZXJuKHQpO1xuICAgICAgICB9XG4gICAgICAgIHNoYWRpbmdGaWxsKHQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgICAgICBoZWlnaHQ6IG5cbiAgICAgICAgICAgIH0gPSB0aGlzLnZpZXdwb3J0LFxuICAgICAgICAgICAgaSA9IHIuVXRpbC5pbnZlcnNlVHJhbnNmb3JtKHRoaXMudHJhbnNmb3JtTWF0cml4KSxcbiAgICAgICAgICAgIFtzLCBhLCBvLCBsXSA9IHIuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwgMCwgZSwgbl0sIGkpLFxuICAgICAgICAgICAgYyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgICAgICAgYy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgcyk7XG4gICAgICAgICAgYy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgYSk7XG4gICAgICAgICAgYy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIG8gLSBzKTtcbiAgICAgICAgICBjLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIGwgLSBhKTtcbiAgICAgICAgICBjLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCB0aGlzLl9tYWtlU2hhZGluZ1BhdHRlcm4odCkpO1xuICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQWxwaGEgPCAxICYmIGMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLW9wYWNpdHlcIiwgdGhpcy5jdXJyZW50LmZpbGxBbHBoYSk7XG4gICAgICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmQoYyk7XG4gICAgICAgIH1cbiAgICAgICAgX21ha2VDb2xvck5fUGF0dGVybih0KSB7XG4gICAgICAgICAgcmV0dXJuIFwiVGlsaW5nUGF0dGVyblwiID09PSB0WzBdID8gdGhpcy5fbWFrZVRpbGluZ1BhdHRlcm4odCkgOiB0aGlzLl9tYWtlU2hhZGluZ1BhdHRlcm4odCk7XG4gICAgICAgIH1cbiAgICAgICAgX21ha2VUaWxpbmdQYXR0ZXJuKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdFsxXSxcbiAgICAgICAgICAgIG4gPSB0WzJdLFxuICAgICAgICAgICAgaSA9IHRbM10gfHwgci5JREVOVElUWV9NQVRSSVgsXG4gICAgICAgICAgICBbcywgYSwgbywgbF0gPSB0WzRdLFxuICAgICAgICAgICAgYyA9IHRbNV0sXG4gICAgICAgICAgICBoID0gdFs2XSxcbiAgICAgICAgICAgIGQgPSB0WzddLFxuICAgICAgICAgICAgdSA9IFwic2hhZGluZ1wiICsgcCsrLFxuICAgICAgICAgICAgW2YsIGcsIG0sIGJdID0gci5VdGlsLm5vcm1hbGl6ZVJlY3QoWy4uLnIuVXRpbC5hcHBseVRyYW5zZm9ybShbcywgYV0sIGkpLCAuLi5yLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW28sIGxdLCBpKV0pLFxuICAgICAgICAgICAgW3YsIHldID0gci5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGkpLFxuICAgICAgICAgICAgQSA9IGMgKiB2LFxuICAgICAgICAgICAgXyA9IGggKiB5LFxuICAgICAgICAgICAgUyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnBhdHRlcm5cIik7XG4gICAgICAgICAgUy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIHUpO1xuICAgICAgICAgIFMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJwYXR0ZXJuVW5pdHNcIiwgXCJ1c2VyU3BhY2VPblVzZVwiKTtcbiAgICAgICAgICBTLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgQSk7XG4gICAgICAgICAgUy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBfKTtcbiAgICAgICAgICBTLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIlwiLmNvbmNhdChmKSk7XG4gICAgICAgICAgUy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCJcIi5jb25jYXQoZykpO1xuICAgICAgICAgIGNvbnN0IEUgPSB0aGlzLnN2ZyxcbiAgICAgICAgICAgIHggPSB0aGlzLnRyYW5zZm9ybU1hdHJpeCxcbiAgICAgICAgICAgIHcgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yLFxuICAgICAgICAgICAgQyA9IHRoaXMuY3VycmVudC5zdHJva2VDb2xvcixcbiAgICAgICAgICAgIFQgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKG0gLSBmLCBiIC0gZyk7XG4gICAgICAgICAgdGhpcy5zdmcgPSBUO1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gaTtcbiAgICAgICAgICBpZiAoMiA9PT0gZCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHIuVXRpbC5tYWtlSGV4Q29sb3IoLi4uZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZSh0aGlzLmNvbnZlcnRPcExpc3QobikpO1xuICAgICAgICAgIHRoaXMuc3ZnID0gRTtcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHg7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IHc7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gQztcbiAgICAgICAgICBTLmFwcGVuZChULmNoaWxkTm9kZXNbMF0pO1xuICAgICAgICAgIHRoaXMuZGVmcy5hcHBlbmQoUyk7XG4gICAgICAgICAgcmV0dXJuIFwidXJsKCNcIi5jb25jYXQodSwgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9tYWtlU2hhZGluZ1BhdHRlcm4odCkge1xuICAgICAgICAgIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgJiYgKHQgPSB0aGlzLm9ianMuZ2V0KHQpKTtcbiAgICAgICAgICBzd2l0Y2ggKHRbMF0pIHtcbiAgICAgICAgICAgIGNhc2UgXCJSYWRpYWxBeGlhbFwiOlxuICAgICAgICAgICAgICBjb25zdCBlID0gXCJzaGFkaW5nXCIgKyBwKyssXG4gICAgICAgICAgICAgICAgbiA9IHRbM107XG4gICAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgICBzd2l0Y2ggKHRbMV0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYXhpYWxcIjpcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0WzRdLFxuICAgICAgICAgICAgICAgICAgICByID0gdFs1XTtcbiAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpsaW5lYXJHcmFkaWVudFwiKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBlKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJncmFkaWVudFVuaXRzXCIsIFwidXNlclNwYWNlT25Vc2VcIik7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieDFcIiwgblswXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieTFcIiwgblsxXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieDJcIiwgclswXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieTJcIiwgclsxXSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicmFkaWFsXCI6XG4gICAgICAgICAgICAgICAgICBjb25zdCBzID0gdFs0XSxcbiAgICAgICAgICAgICAgICAgICAgYSA9IHRbNV0sXG4gICAgICAgICAgICAgICAgICAgIG8gPSB0WzZdLFxuICAgICAgICAgICAgICAgICAgICBsID0gdFs3XTtcbiAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyYWRpYWxHcmFkaWVudFwiKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBlKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJncmFkaWVudFVuaXRzXCIsIFwidXNlclNwYWNlT25Vc2VcIik7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3hcIiwgYVswXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3lcIiwgYVsxXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiclwiLCBsKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmeFwiLCBzWzBdKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmeVwiLCBzWzFdKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmclwiLCBvKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIFJhZGlhbEF4aWFsIHR5cGU6IFwiLmNvbmNhdCh0WzFdKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIG4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6c3RvcFwiKTtcbiAgICAgICAgICAgICAgICBlLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwib2Zmc2V0XCIsIHRbMF0pO1xuICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdG9wLWNvbG9yXCIsIHRbMV0pO1xuICAgICAgICAgICAgICAgIGkuYXBwZW5kKGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuZGVmcy5hcHBlbmQoaSk7XG4gICAgICAgICAgICAgIHJldHVybiBcInVybCgjXCIuY29uY2F0KGUsIFwiKVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJNZXNoXCI6XG4gICAgICAgICAgICAgICgwLCByLndhcm4pKFwiVW5pbXBsZW1lbnRlZCBwYXR0ZXJuIE1lc2hcIik7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY2FzZSBcIkR1bW15XCI6XG4gICAgICAgICAgICAgIHJldHVybiBcImhvdHBpbmtcIjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gSVIgdHlwZTogXCIuY29uY2F0KHRbMF0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0RGFzaCh0LCBlKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmRhc2hBcnJheSA9IHQ7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmRhc2hQaGFzZSA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RydWN0UGF0aCh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICBsZXQgaSA9IG4ueCxcbiAgICAgICAgICAgIHMgPSBuLnksXG4gICAgICAgICAgICBhID0gW10sXG4gICAgICAgICAgICBvID0gMDtcbiAgICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdCkgc3dpdGNoICgwIHwgbikge1xuICAgICAgICAgICAgY2FzZSByLk9QUy5yZWN0YW5nbGU6XG4gICAgICAgICAgICAgIGkgPSBlW28rK107XG4gICAgICAgICAgICAgIHMgPSBlW28rK107XG4gICAgICAgICAgICAgIGNvbnN0IHQgPSBpICsgZVtvKytdLFxuICAgICAgICAgICAgICAgIG4gPSBzICsgZVtvKytdO1xuICAgICAgICAgICAgICBhLnB1c2goXCJNXCIsIHBmKGkpLCBwZihzKSwgXCJMXCIsIHBmKHQpLCBwZihzKSwgXCJMXCIsIHBmKHQpLCBwZihuKSwgXCJMXCIsIHBmKGkpLCBwZihuKSwgXCJaXCIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugci5PUFMubW92ZVRvOlxuICAgICAgICAgICAgICBpID0gZVtvKytdO1xuICAgICAgICAgICAgICBzID0gZVtvKytdO1xuICAgICAgICAgICAgICBhLnB1c2goXCJNXCIsIHBmKGkpLCBwZihzKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSByLk9QUy5saW5lVG86XG4gICAgICAgICAgICAgIGkgPSBlW28rK107XG4gICAgICAgICAgICAgIHMgPSBlW28rK107XG4gICAgICAgICAgICAgIGEucHVzaChcIkxcIiwgcGYoaSksIHBmKHMpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHIuT1BTLmN1cnZlVG86XG4gICAgICAgICAgICAgIGkgPSBlW28gKyA0XTtcbiAgICAgICAgICAgICAgcyA9IGVbbyArIDVdO1xuICAgICAgICAgICAgICBhLnB1c2goXCJDXCIsIHBmKGVbb10pLCBwZihlW28gKyAxXSksIHBmKGVbbyArIDJdKSwgcGYoZVtvICsgM10pLCBwZihpKSwgcGYocykpO1xuICAgICAgICAgICAgICBvICs9IDY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSByLk9QUy5jdXJ2ZVRvMjpcbiAgICAgICAgICAgICAgYS5wdXNoKFwiQ1wiLCBwZihpKSwgcGYocyksIHBmKGVbb10pLCBwZihlW28gKyAxXSksIHBmKGVbbyArIDJdKSwgcGYoZVtvICsgM10pKTtcbiAgICAgICAgICAgICAgaSA9IGVbbyArIDJdO1xuICAgICAgICAgICAgICBzID0gZVtvICsgM107XG4gICAgICAgICAgICAgIG8gKz0gNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHIuT1BTLmN1cnZlVG8zOlxuICAgICAgICAgICAgICBpID0gZVtvICsgMl07XG4gICAgICAgICAgICAgIHMgPSBlW28gKyAzXTtcbiAgICAgICAgICAgICAgYS5wdXNoKFwiQ1wiLCBwZihlW29dKSwgcGYoZVtvICsgMV0pLCBwZihpKSwgcGYocyksIHBmKGkpLCBwZihzKSk7XG4gICAgICAgICAgICAgIG8gKz0gNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHIuT1BTLmNsb3NlUGF0aDpcbiAgICAgICAgICAgICAgYS5wdXNoKFwiWlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYSA9IGEuam9pbihcIiBcIik7XG4gICAgICAgICAgaWYgKG4ucGF0aCAmJiB0Lmxlbmd0aCA+IDAgJiYgdFswXSAhPT0gci5PUFMucmVjdGFuZ2xlICYmIHRbMF0gIT09IHIuT1BTLm1vdmVUbykgYSA9IG4ucGF0aC5nZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIikgKyBhO2Vsc2Uge1xuICAgICAgICAgICAgbi5wYXRoID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cGF0aFwiKTtcbiAgICAgICAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kKG4ucGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG4ucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgYSk7XG4gICAgICAgICAgbi5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIm5vbmVcIik7XG4gICAgICAgICAgbi5lbGVtZW50ID0gbi5wYXRoO1xuICAgICAgICAgIG4uc2V0Q3VycmVudFBvaW50KGksIHMpO1xuICAgICAgICB9XG4gICAgICAgIGVuZFBhdGgoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICB0LnBhdGggPSBudWxsO1xuICAgICAgICAgIGlmICghdGhpcy5wZW5kaW5nQ2xpcCkgcmV0dXJuO1xuICAgICAgICAgIGlmICghdC5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZSA9IFwiY2xpcHBhdGhcIiArIGQrKyxcbiAgICAgICAgICAgIG4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpjbGlwUGF0aFwiKTtcbiAgICAgICAgICBuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgZSk7XG4gICAgICAgICAgbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBwbSh0aGlzLnRyYW5zZm9ybU1hdHJpeCkpO1xuICAgICAgICAgIGNvbnN0IGkgPSB0LmVsZW1lbnQuY2xvbmVOb2RlKCEwKTtcbiAgICAgICAgICBcImV2ZW5vZGRcIiA9PT0gdGhpcy5wZW5kaW5nQ2xpcCA/IGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXJ1bGVcIiwgXCJldmVub2RkXCIpIDogaS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsaXAtcnVsZVwiLCBcIm5vbnplcm9cIik7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG4gICAgICAgICAgbi5hcHBlbmQoaSk7XG4gICAgICAgICAgdGhpcy5kZWZzLmFwcGVuZChuKTtcbiAgICAgICAgICBpZiAodC5hY3RpdmVDbGlwVXJsKSB7XG4gICAgICAgICAgICB0LmNsaXBHcm91cCA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5leHRyYVN0YWNrKSB0LmNsaXBHcm91cCA9IG51bGw7XG4gICAgICAgICAgICBuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY2xpcC1wYXRoXCIsIHQuYWN0aXZlQ2xpcFVybCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHQuYWN0aXZlQ2xpcFVybCA9IFwidXJsKCNcIi5jb25jYXQoZSwgXCIpXCIpO1xuICAgICAgICAgIHRoaXMudGdycCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY2xpcCh0KSB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2xvc2VQYXRoKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgaWYgKHQucGF0aCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IFwiXCIuY29uY2F0KHQucGF0aC5nZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiksIFwiWlwiKTtcbiAgICAgICAgICAgIHQucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldExlYWRpbmcodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5sZWFkaW5nID0gLXQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGV4dFJpc2UodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0UmlzZSA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGV4dFJlbmRlcmluZ01vZGUodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0SFNjYWxlKHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQudGV4dEhTY2FsZSA9IHQgLyAxMDA7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmVuZGVyaW5nSW50ZW50KHQpIHt9XG4gICAgICAgIHNldEZsYXRuZXNzKHQpIHt9XG4gICAgICAgIHNldEdTdGF0ZSh0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbZSwgbl0gb2YgdCkgc3dpdGNoIChlKSB7XG4gICAgICAgICAgICBjYXNlIFwiTFdcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkxDXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcChuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbihuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiTUxcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KG4pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0RGFzaChuWzBdLCBuWzFdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiUklcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZMXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3Mobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRGb250KG4pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJDQVwiOlxuICAgICAgICAgICAgICB0aGlzLnNldFN0cm9rZUFscGhhKG4pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgICAgICB0aGlzLnNldEZpbGxBbHBoYShuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAoMCwgci53YXJuKShcIlVuaW1wbGVtZW50ZWQgZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciBcIi5jb25jYXQoZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaWxsKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgaWYgKHQuZWxlbWVudCkge1xuICAgICAgICAgICAgdC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCB0LmZpbGxDb2xvcik7XG4gICAgICAgICAgICB0LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLW9wYWNpdHlcIiwgdC5maWxsQWxwaGEpO1xuICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0cm9rZSgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAgIGlmICh0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFN0cm9rZUF0dHJpYnV0ZXModC5lbGVtZW50KTtcbiAgICAgICAgICAgIHQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgXCJub25lXCIpO1xuICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9zZXRTdHJva2VBdHRyaWJ1dGVzKHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAgIGxldCBpID0gbi5kYXNoQXJyYXk7XG4gICAgICAgICAgMSAhPT0gZSAmJiBpLmxlbmd0aCA+IDAgJiYgKGkgPSBpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIGUgKiB0O1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlXCIsIG4uc3Ryb2tlQ29sb3IpO1xuICAgICAgICAgIHQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2Utb3BhY2l0eVwiLCBuLnN0cm9rZUFscGhhKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLW1pdGVybGltaXRcIiwgcGYobi5taXRlckxpbWl0KSk7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1saW5lY2FwXCIsIG4ubGluZUNhcCk7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1saW5lam9pblwiLCBuLmxpbmVKb2luKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLXdpZHRoXCIsIHBmKGUgKiBuLmxpbmVXaWR0aCkgKyBcInB4XCIpO1xuICAgICAgICAgIHQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2UtZGFzaGFycmF5XCIsIGkubWFwKHBmKS5qb2luKFwiIFwiKSk7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1kYXNob2Zmc2V0XCIsIHBmKGUgKiBuLmRhc2hQaGFzZSkgKyBcInB4XCIpO1xuICAgICAgICB9XG4gICAgICAgIGVvRmlsbCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkY3VycmVudCRlbGVtZW50O1xuICAgICAgICAgIChfdGhpcyRjdXJyZW50JGVsZW1lbnQgPSB0aGlzLmN1cnJlbnQuZWxlbWVudCkgPT09IG51bGwgfHwgX3RoaXMkY3VycmVudCRlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRjdXJyZW50JGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuICAgICAgICAgIHRoaXMuZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGZpbGxTdHJva2UoKSB7XG4gICAgICAgICAgdGhpcy5zdHJva2UoKTtcbiAgICAgICAgICB0aGlzLmZpbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBlb0ZpbGxTdHJva2UoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJGN1cnJlbnQkZWxlbWVudDI7XG4gICAgICAgICAgKF90aGlzJGN1cnJlbnQkZWxlbWVudDIgPSB0aGlzLmN1cnJlbnQuZWxlbWVudCkgPT09IG51bGwgfHwgX3RoaXMkY3VycmVudCRlbGVtZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkY3VycmVudCRlbGVtZW50Mi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGwtcnVsZVwiLCBcImV2ZW5vZGRcIik7XG4gICAgICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2xvc2VTdHJva2UoKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICAgICAgICB0aGlzLnN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNsb3NlRmlsbFN0cm9rZSgpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgICAgICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNsb3NlRU9GaWxsU3Ryb2tlKCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgdGhpcy5lb0ZpbGxTdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIwXCIpO1xuICAgICAgICAgIHQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMFwiKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgXCIxcHhcIik7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBcIjFweFwiKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCB0aGlzLmN1cnJlbnQuZmlsbENvbG9yKTtcbiAgICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZCh0KTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEltYWdlWE9iamVjdCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0T2JqZWN0KHQpO1xuICAgICAgICAgIGUgPyB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGUpIDogKDAsIHIud2FybikoXCJEZXBlbmRlbnQgaW1hZ2Ugd2l0aCBvYmplY3QgSUQgXCIuY29uY2F0KHQsIFwiIGlzIG5vdCByZWFkeSB5ZXRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gdC53aWR0aCxcbiAgICAgICAgICAgIGkgPSB0LmhlaWdodCxcbiAgICAgICAgICAgIHIgPSBoKHQsIHRoaXMuZm9yY2VEYXRhU2NoZW1hLCAhIWUpLFxuICAgICAgICAgICAgcyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIwXCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMFwiKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgcGYobikpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgcGYoaSkpO1xuICAgICAgICAgIHRoaXMuY3VycmVudC5lbGVtZW50ID0gcztcbiAgICAgICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzppbWFnZVwiKTtcbiAgICAgICAgICBhLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcInhsaW5rOmhyZWZcIiwgcik7XG4gICAgICAgICAgYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIwXCIpO1xuICAgICAgICAgIGEuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1pKSk7XG4gICAgICAgICAgYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHBmKG4pICsgXCJweFwiKTtcbiAgICAgICAgICBhLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIHBmKGkpICsgXCJweFwiKTtcbiAgICAgICAgICBhLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHJhbnNmb3JtXCIsIFwic2NhbGUoXCIuY29uY2F0KHBmKDEgLyBuKSwgXCIgXCIpLmNvbmNhdChwZigtMSAvIGkpLCBcIilcIikpO1xuICAgICAgICAgIGUgPyBlLmFwcGVuZChhKSA6IHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kKGEpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0T2JqZWN0KHQuZGF0YSwgdCk7XG4gICAgICAgICAgaWYgKGUuYml0bWFwKSB7XG4gICAgICAgICAgICAoMCwgci53YXJuKShcInBhaW50SW1hZ2VNYXNrWE9iamVjdDogSW1hZ2VCaXRtYXAgc3VwcG9ydCBpcyBub3QgaW1wbGVtZW50ZWQsIGVuc3VyZSB0aGF0IHRoZSBgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWRgIEFQSSBwYXJhbWV0ZXIgaXMgZGlzYWJsZWQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgaSA9IGUud2lkdGgsXG4gICAgICAgICAgICBzID0gZS5oZWlnaHQsXG4gICAgICAgICAgICBhID0gbi5maWxsQ29sb3I7XG4gICAgICAgICAgbi5tYXNrSWQgPSBcIm1hc2tcIiArIHUrKztcbiAgICAgICAgICBjb25zdCBvID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6bWFza1wiKTtcbiAgICAgICAgICBvLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgbi5tYXNrSWQpO1xuICAgICAgICAgIGNvbnN0IGwgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyZWN0XCIpO1xuICAgICAgICAgIGwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMFwiKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjBcIik7XG4gICAgICAgICAgbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHBmKGkpKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIHBmKHMpKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBhKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwibWFza1wiLCBcInVybCgjXCIuY29uY2F0KG4ubWFza0lkLCBcIilcIikpO1xuICAgICAgICAgIHRoaXMuZGVmcy5hcHBlbmQobyk7XG4gICAgICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmQobCk7XG4gICAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChlLCBvKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEZvcm1YT2JqZWN0QmVnaW4odCwgZSkge1xuICAgICAgICAgIEFycmF5LmlzQXJyYXkodCkgJiYgNiA9PT0gdC5sZW5ndGggJiYgdGhpcy50cmFuc2Zvcm0odFswXSwgdFsxXSwgdFsyXSwgdFszXSwgdFs0XSwgdFs1XSk7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlWzJdIC0gZVswXSxcbiAgICAgICAgICAgICAgbiA9IGVbM10gLSBlWzFdLFxuICAgICAgICAgICAgICBpID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcbiAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIGVbMF0pO1xuICAgICAgICAgICAgaS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgZVsxXSk7XG4gICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgcGYodCkpO1xuICAgICAgICAgICAgaS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBwZihuKSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudCA9IGk7XG4gICAgICAgICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhaW50Rm9ybVhPYmplY3RFbmQoKSB7fVxuICAgICAgICBfaW5pdGlhbGl6ZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUodC53aWR0aCwgdC5oZWlnaHQpLFxuICAgICAgICAgICAgbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmRlZnNcIik7XG4gICAgICAgICAgZS5hcHBlbmQobik7XG4gICAgICAgICAgdGhpcy5kZWZzID0gbjtcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcbiAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHJhbnNmb3JtXCIsIHBtKHQudHJhbnNmb3JtKSk7XG4gICAgICAgICAgZS5hcHBlbmQoaSk7XG4gICAgICAgICAgdGhpcy5zdmcgPSBpO1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIF9lbnN1cmVDbGlwR3JvdXAoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQuY2xpcEdyb3VwKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXBhdGhcIiwgdGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwpO1xuICAgICAgICAgICAgdGhpcy5zdmcuYXBwZW5kKHQpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmNsaXBHcm91cCA9IHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQuY2xpcEdyb3VwO1xuICAgICAgICB9XG4gICAgICAgIF9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpIHtcbiAgICAgICAgICBpZiAoIXRoaXMudGdycCkge1xuICAgICAgICAgICAgdGhpcy50Z3JwID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcbiAgICAgICAgICAgIHRoaXMudGdycC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBwbSh0aGlzLnRyYW5zZm9ybU1hdHJpeCkpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwgPyB0aGlzLl9lbnN1cmVDbGlwR3JvdXAoKS5hcHBlbmQodGhpcy50Z3JwKSA6IHRoaXMuc3ZnLmFwcGVuZCh0aGlzLnRncnApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy50Z3JwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbigxODcpLFxuICAgICAgICBzID0gbigxOTIpO1xuICAgICAgaSh7XG4gICAgICAgIHRhcmdldDogXCJBcnJheVwiLFxuICAgICAgICBwcm90bzogITBcbiAgICAgIH0sIHtcbiAgICAgICAgZ3JvdXA6IGZ1bmN0aW9uIGdyb3VwKHQpIHtcbiAgICAgICAgICByZXR1cm4gcih0aGlzLCB0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcyhcImdyb3VwXCIpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOTkpLFxuICAgICAgICByID0gbigxNCksXG4gICAgICAgIHMgPSBuKDEzKSxcbiAgICAgICAgYSA9IG4oNDApLFxuICAgICAgICBvID0gbigxOCksXG4gICAgICAgIGwgPSBuKDY0KSxcbiAgICAgICAgYyA9IG4oMTg4KSxcbiAgICAgICAgaCA9IG4oMTA4KSxcbiAgICAgICAgZCA9IEFycmF5LFxuICAgICAgICB1ID0gcihbXS5wdXNoKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuLCByKSB7XG4gICAgICAgIGZvciAodmFyIHAsIGYsIGcsIG0gPSBhKHQpLCBiID0gcyhtKSwgdiA9IGkoZSwgbiksIHkgPSBjKG51bGwpLCBBID0gbChiKSwgXyA9IDA7IEEgPiBfOyBfKyspIHtcbiAgICAgICAgICBnID0gYltfXTtcbiAgICAgICAgICAoZiA9IG8odihnLCBfLCBtKSkpIGluIHkgPyB1KHlbZl0sIGcpIDogeVtmXSA9IFtnXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAociAmJiAocCA9IHIobSkpICE9PSBkKSBmb3IgKGYgaW4geSkgeVtmXSA9IGgocCwgeVtmXSk7XG4gICAgICAgIHJldHVybiB5O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGksXG4gICAgICAgIHIgPSBuKDQ3KSxcbiAgICAgICAgcyA9IG4oMTg5KSxcbiAgICAgICAgYSA9IG4oNjYpLFxuICAgICAgICBvID0gbig1NSksXG4gICAgICAgIGwgPSBuKDE5MSksXG4gICAgICAgIGMgPSBuKDQzKSxcbiAgICAgICAgaCA9IG4oNTQpLFxuICAgICAgICBkID0gXCJwcm90b3R5cGVcIixcbiAgICAgICAgdSA9IFwic2NyaXB0XCIsXG4gICAgICAgIHAgPSBoKFwiSUVfUFJPVE9cIiksXG4gICAgICAgIEVtcHR5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiBFbXB0eUNvbnN0cnVjdG9yKCkge30sXG4gICAgICAgIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIHNjcmlwdFRhZyh0KSB7XG4gICAgICAgICAgcmV0dXJuIFwiPFwiICsgdSArIFwiPlwiICsgdCArIFwiPC9cIiArIHUgKyBcIj5cIjtcbiAgICAgICAgfSxcbiAgICAgICAgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgodCkge1xuICAgICAgICAgIHQud3JpdGUoc2NyaXB0VGFnKFwiXCIpKTtcbiAgICAgICAgICB0LmNsb3NlKCk7XG4gICAgICAgICAgdmFyIGUgPSB0LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gICAgICAgICAgdCA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0sXG4gICAgICAgIF9OdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiBOdWxsUHJvdG9PYmplY3QoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGkgPSBuZXcgQWN0aXZlWE9iamVjdChcImh0bWxmaWxlXCIpO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgX051bGxQcm90b09iamVjdCA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGRvY3VtZW50ID8gZG9jdW1lbnQuZG9tYWluICYmIGkgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGkpIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHQsXG4gICAgICAgICAgICAgIGUgPSBjKFwiaWZyYW1lXCIpLFxuICAgICAgICAgICAgICBuID0gXCJqYXZhXCIgKyB1ICsgXCI6XCI7XG4gICAgICAgICAgICBlLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIGwuYXBwZW5kQ2hpbGQoZSk7XG4gICAgICAgICAgICBlLnNyYyA9IFN0cmluZyhuKTtcbiAgICAgICAgICAgICh0ID0gZS5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCk7XG4gICAgICAgICAgICB0LndyaXRlKHNjcmlwdFRhZyhcImRvY3VtZW50LkY9T2JqZWN0XCIpKTtcbiAgICAgICAgICAgIHQuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0LkY7XG4gICAgICAgICAgfSgpIDogTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChpKTtcbiAgICAgICAgICBmb3IgKHZhciB0ID0gYS5sZW5ndGg7IHQtLTspIGRlbGV0ZSBfTnVsbFByb3RvT2JqZWN0W2RdW2FbdF1dO1xuICAgICAgICAgIHJldHVybiBfTnVsbFByb3RvT2JqZWN0KCk7XG4gICAgICAgIH07XG4gICAgICBvW3BdID0gITA7XG4gICAgICB0LmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZSh0LCBlKSB7XG4gICAgICAgIHZhciBuO1xuICAgICAgICBpZiAobnVsbCAhPT0gdCkge1xuICAgICAgICAgIEVtcHR5Q29uc3RydWN0b3JbZF0gPSByKHQpO1xuICAgICAgICAgIG4gPSBuZXcgRW1wdHlDb25zdHJ1Y3RvcigpO1xuICAgICAgICAgIEVtcHR5Q29uc3RydWN0b3JbZF0gPSBudWxsO1xuICAgICAgICAgIG5bcF0gPSB0O1xuICAgICAgICB9IGVsc2UgbiA9IF9OdWxsUHJvdG9PYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZSA/IG4gOiBzLmYobiwgZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNiksXG4gICAgICAgIHIgPSBuKDQ2KSxcbiAgICAgICAgcyA9IG4oNDUpLFxuICAgICAgICBhID0gbig0NyksXG4gICAgICAgIG8gPSBuKDEyKSxcbiAgICAgICAgbCA9IG4oMTkwKTtcbiAgICAgIGUuZiA9IGkgJiYgIXIgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModCwgZSkge1xuICAgICAgICBhKHQpO1xuICAgICAgICBmb3IgKHZhciBuLCBpID0gbyhlKSwgciA9IGwoZSksIGMgPSByLmxlbmd0aCwgaCA9IDA7IGMgPiBoOykgcy5mKHQsIG4gPSByW2grK10sIGlbbl0pO1xuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig1OSksXG4gICAgICAgIHIgPSBuKDY2KTtcbiAgICAgIHQuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXModCkge1xuICAgICAgICByZXR1cm4gaSh0LCByKTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyNCk7XG4gICAgICB0LmV4cG9ydHMgPSBpKFwiZG9jdW1lbnRcIiwgXCJkb2N1bWVudEVsZW1lbnRcIik7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzNCksXG4gICAgICAgIHIgPSBuKDE4OCksXG4gICAgICAgIHMgPSBuKDQ1KS5mLFxuICAgICAgICBhID0gaShcInVuc2NvcGFibGVzXCIpLFxuICAgICAgICBvID0gQXJyYXkucHJvdG90eXBlO1xuICAgICAgbnVsbCA9PSBvW2FdICYmIHMobywgYSwge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICB2YWx1ZTogcihudWxsKVxuICAgICAgfSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBvW2FdW3RdID0gITA7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLlhmYVRleHQgPSB2b2lkIDA7XG4gICAgICBuKDg5KTtcbiAgICAgIGNsYXNzIFhmYVRleHQge1xuICAgICAgICBzdGF0aWMgdGV4dENvbnRlbnQodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSBbXSxcbiAgICAgICAgICAgIG4gPSB7XG4gICAgICAgICAgICAgIGl0ZW1zOiBlLFxuICAgICAgICAgICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgIWZ1bmN0aW9uIHdhbGsodCkge1xuICAgICAgICAgICAgaWYgKCF0KSByZXR1cm47XG4gICAgICAgICAgICBsZXQgbiA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBpID0gdC5uYW1lO1xuICAgICAgICAgICAgaWYgKFwiI3RleHRcIiA9PT0gaSkgbiA9IHQudmFsdWU7ZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfdCRhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgICBpZiAoIVhmYVRleHQuc2hvdWxkQnVpbGRUZXh0KGkpKSByZXR1cm47XG4gICAgICAgICAgICAgIHQgIT09IG51bGwgJiYgdCAhPT0gdm9pZCAwICYmIChfdCRhdHRyaWJ1dGVzID0gdC5hdHRyaWJ1dGVzKSAhPT0gbnVsbCAmJiBfdCRhdHRyaWJ1dGVzICE9PSB2b2lkIDAgJiYgX3QkYXR0cmlidXRlcy50ZXh0Q29udGVudCA/IG4gPSB0LmF0dHJpYnV0ZXMudGV4dENvbnRlbnQgOiB0LnZhbHVlICYmIChuID0gdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudWxsICE9PSBuICYmIGUucHVzaCh7XG4gICAgICAgICAgICAgIHN0cjogblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodC5jaGlsZHJlbikgZm9yIChjb25zdCBlIG9mIHQuY2hpbGRyZW4pIHdhbGsoZSk7XG4gICAgICAgICAgfSh0KTtcbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgc2hvdWxkQnVpbGRUZXh0KHQpIHtcbiAgICAgICAgICByZXR1cm4gIShcInRleHRhcmVhXCIgPT09IHQgfHwgXCJpbnB1dFwiID09PSB0IHx8IFwib3B0aW9uXCIgPT09IHQgfHwgXCJzZWxlY3RcIiA9PT0gdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuWGZhVGV4dCA9IFhmYVRleHQ7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuVGV4dExheWVyUmVuZGVyVGFzayA9IHZvaWQgMDtcbiAgICAgIGUucmVuZGVyVGV4dExheWVyID0gZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyKHQpIHtcbiAgICAgICAgaWYgKCF0LnRleHRDb250ZW50U291cmNlICYmICh0LnRleHRDb250ZW50IHx8IHQudGV4dENvbnRlbnRTdHJlYW0pKSB7XG4gICAgICAgICAgKDAsIHIuZGVwcmVjYXRlZCkoXCJUaGUgVGV4dExheWVyUmVuZGVyIGB0ZXh0Q29udGVudGAvYHRleHRDb250ZW50U3RyZWFtYCBwYXJhbWV0ZXJzIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBwbGVhc2UgdXNlIGB0ZXh0Q29udGVudFNvdXJjZWAgaW5zdGVhZC5cIik7XG4gICAgICAgICAgdC50ZXh0Q29udGVudFNvdXJjZSA9IHQudGV4dENvbnRlbnQgfHwgdC50ZXh0Q29udGVudFN0cmVhbTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb250YWluZXI6IGUsXG4gICAgICAgICAgICB2aWV3cG9ydDogblxuICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgIGkgPSBnZXRDb21wdXRlZFN0eWxlKGUpLFxuICAgICAgICAgIHMgPSBpLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmlsaXR5XCIpLFxuICAgICAgICAgIGEgPSBwYXJzZUZsb2F0KGkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tc2NhbGUtZmFjdG9yXCIpKTtcbiAgICAgICAgXCJ2aXNpYmxlXCIgPT09IHMgJiYgKCFhIHx8IE1hdGguYWJzKGEgLSBuLnNjYWxlKSA+IDFlLTUpICYmIGNvbnNvbGUuZXJyb3IoXCJUaGUgYC0tc2NhbGUtZmFjdG9yYCBDU1MtdmFyaWFibGUgbXVzdCBiZSBzZXQsIHRvIHRoZSBzYW1lIHZhbHVlIGFzIGB2aWV3cG9ydC5zY2FsZWAsIGVpdGhlciBvbiB0aGUgYGNvbnRhaW5lcmAtZWxlbWVudCBpdHNlbGYgb3IgaGlnaGVyIHVwIGluIHRoZSBET00uXCIpO1xuICAgICAgICBjb25zdCBvID0gbmV3IFRleHRMYXllclJlbmRlclRhc2sodCk7XG4gICAgICAgIG8uX3JlbmRlcigpO1xuICAgICAgICByZXR1cm4gbztcbiAgICAgIH07XG4gICAgICBlLnVwZGF0ZVRleHRMYXllciA9IGZ1bmN0aW9uIHVwZGF0ZVRleHRMYXllcih0KSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgY29udGFpbmVyOiBlLFxuICAgICAgICAgIHZpZXdwb3J0OiBuLFxuICAgICAgICAgIHRleHREaXZzOiBpLFxuICAgICAgICAgIHRleHREaXZQcm9wZXJ0aWVzOiBzLFxuICAgICAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOiBhLFxuICAgICAgICAgIG11c3RSb3RhdGU6IG8gPSAhMCxcbiAgICAgICAgICBtdXN0UmVzY2FsZTogbCA9ICEwXG4gICAgICAgIH0gPSB0O1xuICAgICAgICBvICYmICgwLCByLnNldExheWVyRGltZW5zaW9ucykoZSwge1xuICAgICAgICAgIHJvdGF0aW9uOiBuLnJvdGF0aW9uXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBnZXRDdHgoMCwgYSksXG4gICAgICAgICAgICBlID0ge1xuICAgICAgICAgICAgICBwcmV2Rm9udFNpemU6IG51bGwsXG4gICAgICAgICAgICAgIHByZXZGb250RmFtaWx5OiBudWxsLFxuICAgICAgICAgICAgICBkaXY6IG51bGwsXG4gICAgICAgICAgICAgIHNjYWxlOiBuLnNjYWxlICogKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSxcbiAgICAgICAgICAgICAgcHJvcGVydGllczogbnVsbCxcbiAgICAgICAgICAgICAgY3R4OiB0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBpKSB7XG4gICAgICAgICAgICBlLnByb3BlcnRpZXMgPSBzLmdldCh0KTtcbiAgICAgICAgICAgIGUuZGl2ID0gdDtcbiAgICAgICAgICAgIGxheW91dChlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuKDg5KTtcbiAgICAgIG4oMik7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2Nyk7XG4gICAgICBjb25zdCBzID0gMzAsXG4gICAgICAgIGEgPSAuOCxcbiAgICAgICAgbyA9IG5ldyBNYXAoKTtcbiAgICAgIGZ1bmN0aW9uIGdldEN0eCh0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBpZiAoZSAmJiBpLkZlYXR1cmVUZXN0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSBuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh0LCB0KS5nZXRDb250ZXh0KFwiMmRcIiwge1xuICAgICAgICAgIGFscGhhOiAhMVxuICAgICAgICB9KTtlbHNlIHtcbiAgICAgICAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgICBlLndpZHRoID0gZS5oZWlnaHQgPSB0O1xuICAgICAgICAgIG4gPSBlLmdldENvbnRleHQoXCIyZFwiLCB7XG4gICAgICAgICAgICBhbHBoYTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGFwcGVuZFRleHQodCwgZSwgbikge1xuICAgICAgICBjb25zdCByID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIiksXG4gICAgICAgICAgbCA9IHtcbiAgICAgICAgICAgIGFuZ2xlOiAwLFxuICAgICAgICAgICAgY2FudmFzV2lkdGg6IDAsXG4gICAgICAgICAgICBoYXNUZXh0OiBcIlwiICE9PSBlLnN0cixcbiAgICAgICAgICAgIGhhc0VPTDogZS5oYXNFT0wsXG4gICAgICAgICAgICBmb250U2l6ZTogMFxuICAgICAgICAgIH07XG4gICAgICAgIHQuX3RleHREaXZzLnB1c2gocik7XG4gICAgICAgIGNvbnN0IGMgPSBpLlV0aWwudHJhbnNmb3JtKHQuX3RyYW5zZm9ybSwgZS50cmFuc2Zvcm0pO1xuICAgICAgICBsZXQgaCA9IE1hdGguYXRhbjIoY1sxXSwgY1swXSk7XG4gICAgICAgIGNvbnN0IGQgPSBuW2UuZm9udE5hbWVdO1xuICAgICAgICBkLnZlcnRpY2FsICYmIChoICs9IE1hdGguUEkgLyAyKTtcbiAgICAgICAgY29uc3QgdSA9IE1hdGguaHlwb3QoY1syXSwgY1szXSksXG4gICAgICAgICAgcCA9IHUgKiBmdW5jdGlvbiBnZXRBc2NlbnQodCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IG8uZ2V0KHQpO1xuICAgICAgICAgICAgaWYgKG4pIHJldHVybiBuO1xuICAgICAgICAgICAgY29uc3QgaSA9IGdldEN0eChzLCBlKTtcbiAgICAgICAgICAgIGkuZm9udCA9IFwiXCIuY29uY2F0KHMsIFwicHggXCIpLmNvbmNhdCh0KTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBpLm1lYXN1cmVUZXh0KFwiXCIpO1xuICAgICAgICAgICAgbGV0IGwgPSByLmZvbnRCb3VuZGluZ0JveEFzY2VudCxcbiAgICAgICAgICAgICAgYyA9IE1hdGguYWJzKHIuZm9udEJvdW5kaW5nQm94RGVzY2VudCk7XG4gICAgICAgICAgICBpZiAobCkge1xuICAgICAgICAgICAgICBjb25zdCBlID0gbCAvIChsICsgYyk7XG4gICAgICAgICAgICAgIG8uc2V0KHQsIGUpO1xuICAgICAgICAgICAgICBpLmNhbnZhcy53aWR0aCA9IGkuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaS5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG4gICAgICAgICAgICBpLmNsZWFyUmVjdCgwLCAwLCBzLCBzKTtcbiAgICAgICAgICAgIGkuc3Ryb2tlVGV4dChcImdcIiwgMCwgMCk7XG4gICAgICAgICAgICBsZXQgaCA9IGkuZ2V0SW1hZ2VEYXRhKDAsIDAsIHMsIHMpLmRhdGE7XG4gICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSBoLmxlbmd0aCAtIDEgLSAzOyB0ID49IDA7IHQgLT0gNCkgaWYgKGhbdF0gPiAwKSB7XG4gICAgICAgICAgICAgIGMgPSBNYXRoLmNlaWwodCAvIDQgLyBzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpLmNsZWFyUmVjdCgwLCAwLCBzLCBzKTtcbiAgICAgICAgICAgIGkuc3Ryb2tlVGV4dChcIkFcIiwgMCwgcyk7XG4gICAgICAgICAgICBoID0gaS5nZXRJbWFnZURhdGEoMCwgMCwgcywgcykuZGF0YTtcbiAgICAgICAgICAgIGwgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDAsIGUgPSBoLmxlbmd0aDsgdCA8IGU7IHQgKz0gNCkgaWYgKGhbdF0gPiAwKSB7XG4gICAgICAgICAgICAgIGwgPSBzIC0gTWF0aC5mbG9vcih0IC8gNCAvIHMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkuY2FudmFzLndpZHRoID0gaS5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBsIC8gKGwgKyBjKTtcbiAgICAgICAgICAgICAgby5zZXQodCwgZSk7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgby5zZXQodCwgYSk7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgICB9KGQuZm9udEZhbWlseSwgdC5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpO1xuICAgICAgICBsZXQgZiwgZztcbiAgICAgICAgaWYgKDAgPT09IGgpIHtcbiAgICAgICAgICBmID0gY1s0XTtcbiAgICAgICAgICBnID0gY1s1XSAtIHA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZiA9IGNbNF0gKyBwICogTWF0aC5zaW4oaCk7XG4gICAgICAgICAgZyA9IGNbNV0gLSBwICogTWF0aC5jb3MoaCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbSA9IFwiY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpKlwiLFxuICAgICAgICAgIGIgPSByLnN0eWxlO1xuICAgICAgICBpZiAodC5fY29udGFpbmVyID09PSB0Ll9yb290Q29udGFpbmVyKSB7XG4gICAgICAgICAgYi5sZWZ0ID0gXCJcIi5jb25jYXQoKDEwMCAqIGYgLyB0Ll9wYWdlV2lkdGgpLnRvRml4ZWQoMiksIFwiJVwiKTtcbiAgICAgICAgICBiLnRvcCA9IFwiXCIuY29uY2F0KCgxMDAgKiBnIC8gdC5fcGFnZUhlaWdodCkudG9GaXhlZCgyKSwgXCIlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGIubGVmdCA9IFwiXCIuY29uY2F0KG0pLmNvbmNhdChmLnRvRml4ZWQoMiksIFwicHgpXCIpO1xuICAgICAgICAgIGIudG9wID0gXCJcIi5jb25jYXQobSkuY29uY2F0KGcudG9GaXhlZCgyKSwgXCJweClcIik7XG4gICAgICAgIH1cbiAgICAgICAgYi5mb250U2l6ZSA9IFwiXCIuY29uY2F0KG0pLmNvbmNhdCh1LnRvRml4ZWQoMiksIFwicHgpXCIpO1xuICAgICAgICBiLmZvbnRGYW1pbHkgPSBkLmZvbnRGYW1pbHk7XG4gICAgICAgIGwuZm9udFNpemUgPSB1O1xuICAgICAgICByLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJwcmVzZW50YXRpb25cIik7XG4gICAgICAgIHIudGV4dENvbnRlbnQgPSBlLnN0cjtcbiAgICAgICAgci5kaXIgPSBlLmRpcjtcbiAgICAgICAgdC5fZm9udEluc3BlY3RvckVuYWJsZWQgJiYgKHIuZGF0YXNldC5mb250TmFtZSA9IGUuZm9udE5hbWUpO1xuICAgICAgICAwICE9PSBoICYmIChsLmFuZ2xlID0gaCAqICgxODAgLyBNYXRoLlBJKSk7XG4gICAgICAgIGxldCB2ID0gITE7XG4gICAgICAgIGlmIChlLnN0ci5sZW5ndGggPiAxKSB2ID0gITA7ZWxzZSBpZiAoXCIgXCIgIT09IGUuc3RyICYmIGUudHJhbnNmb3JtWzBdICE9PSBlLnRyYW5zZm9ybVszXSkge1xuICAgICAgICAgIGNvbnN0IHQgPSBNYXRoLmFicyhlLnRyYW5zZm9ybVswXSksXG4gICAgICAgICAgICBuID0gTWF0aC5hYnMoZS50cmFuc2Zvcm1bM10pO1xuICAgICAgICAgIHQgIT09IG4gJiYgTWF0aC5tYXgodCwgbikgLyBNYXRoLm1pbih0LCBuKSA+IDEuNSAmJiAodiA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgICB2ICYmIChsLmNhbnZhc1dpZHRoID0gZC52ZXJ0aWNhbCA/IGUuaGVpZ2h0IDogZS53aWR0aCk7XG4gICAgICAgIHQuX3RleHREaXZQcm9wZXJ0aWVzLnNldChyLCBsKTtcbiAgICAgICAgdC5faXNSZWFkYWJsZVN0cmVhbSAmJiB0Ll9sYXlvdXRUZXh0KHIpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gbGF5b3V0KHQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZGl2OiBlLFxuICAgICAgICAgICAgc2NhbGU6IG4sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBpLFxuICAgICAgICAgICAgY3R4OiByLFxuICAgICAgICAgICAgcHJldkZvbnRTaXplOiBzLFxuICAgICAgICAgICAgcHJldkZvbnRGYW1pbHk6IGFcbiAgICAgICAgICB9ID0gdCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdHlsZTogb1xuICAgICAgICAgIH0gPSBlO1xuICAgICAgICBsZXQgbCA9IFwiXCI7XG4gICAgICAgIGlmICgwICE9PSBpLmNhbnZhc1dpZHRoICYmIGkuaGFzVGV4dCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogY1xuICAgICAgICAgICAgfSA9IG8sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNhbnZhc1dpZHRoOiBoLFxuICAgICAgICAgICAgICBmb250U2l6ZTogZFxuICAgICAgICAgICAgfSA9IGk7XG4gICAgICAgICAgaWYgKHMgIT09IGQgfHwgYSAhPT0gYykge1xuICAgICAgICAgICAgci5mb250ID0gXCJcIi5jb25jYXQoZCAqIG4sIFwicHggXCIpLmNvbmNhdChjKTtcbiAgICAgICAgICAgIHQucHJldkZvbnRTaXplID0gZDtcbiAgICAgICAgICAgIHQucHJldkZvbnRGYW1pbHkgPSBjO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB3aWR0aDogdVxuICAgICAgICAgIH0gPSByLm1lYXN1cmVUZXh0KGUudGV4dENvbnRlbnQpO1xuICAgICAgICAgIHUgPiAwICYmIChsID0gXCJzY2FsZVgoXCIuY29uY2F0KGggKiBuIC8gdSwgXCIpXCIpKTtcbiAgICAgICAgfVxuICAgICAgICAwICE9PSBpLmFuZ2xlICYmIChsID0gXCJyb3RhdGUoXCIuY29uY2F0KGkuYW5nbGUsIFwiZGVnKSBcIikuY29uY2F0KGwpKTtcbiAgICAgICAgbC5sZW5ndGggPiAwICYmIChvLnRyYW5zZm9ybSA9IGwpO1xuICAgICAgfVxuICAgICAgY2xhc3MgVGV4dExheWVyUmVuZGVyVGFzayB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX2dsb2JhbFRoaXMkRm9udEluc3BlMjtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdGV4dENvbnRlbnRTb3VyY2U6IGUsXG4gICAgICAgICAgICBjb250YWluZXI6IG4sXG4gICAgICAgICAgICB2aWV3cG9ydDogcyxcbiAgICAgICAgICAgIHRleHREaXZzOiBhLFxuICAgICAgICAgICAgdGV4dERpdlByb3BlcnRpZXM6IG8sXG4gICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyOiBsLFxuICAgICAgICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IGNcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICB0aGlzLl90ZXh0Q29udGVudFNvdXJjZSA9IGU7XG4gICAgICAgICAgdGhpcy5faXNSZWFkYWJsZVN0cmVhbSA9IGUgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSB0aGlzLl9yb290Q29udGFpbmVyID0gbjtcbiAgICAgICAgICB0aGlzLl90ZXh0RGl2cyA9IGEgfHwgW107XG4gICAgICAgICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ciA9IGwgfHwgW107XG4gICAgICAgICAgdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSBjO1xuICAgICAgICAgIHRoaXMuX2ZvbnRJbnNwZWN0b3JFbmFibGVkID0gISEoKF9nbG9iYWxUaGlzJEZvbnRJbnNwZTIgPSBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IpICE9PSBudWxsICYmIF9nbG9iYWxUaGlzJEZvbnRJbnNwZTIgIT09IHZvaWQgMCAmJiBfZ2xvYmFsVGhpcyRGb250SW5zcGUyLmVuYWJsZWQpO1xuICAgICAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fdGV4dERpdlByb3BlcnRpZXMgPSBvIHx8IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgdGhpcy5fY2FuY2VsZWQgPSAhMTtcbiAgICAgICAgICB0aGlzLl9jYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLl9sYXlvdXRUZXh0UGFyYW1zID0ge1xuICAgICAgICAgICAgcHJldkZvbnRTaXplOiBudWxsLFxuICAgICAgICAgICAgcHJldkZvbnRGYW1pbHk6IG51bGwsXG4gICAgICAgICAgICBkaXY6IG51bGwsXG4gICAgICAgICAgICBzY2FsZTogcy5zY2FsZSAqIChnbG9iYWxUaGlzLmRldmljZVBpeGVsUmF0aW8gfHwgMSksXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgICAgICAgY3R4OiBnZXRDdHgoMCwgYylcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHBhZ2VXaWR0aDogaCxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IGQsXG4gICAgICAgICAgICBwYWdlWDogdSxcbiAgICAgICAgICAgIHBhZ2VZOiBwXG4gICAgICAgICAgfSA9IHMucmF3RGltcztcbiAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSBbMSwgMCwgMCwgLTEsIC11LCBwICsgZF07XG4gICAgICAgICAgdGhpcy5fcGFnZVdpZHRoID0gaDtcbiAgICAgICAgICB0aGlzLl9wYWdlSGVpZ2h0ID0gZDtcbiAgICAgICAgICAoMCwgci5zZXRMYXllckRpbWVuc2lvbnMpKG4sIHMpO1xuICAgICAgICAgIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2xheW91dFRleHRQYXJhbXMgPSBudWxsO1xuICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbCgpIHtcbiAgICAgICAgICB0aGlzLl9jYW5jZWxlZCA9ICEwO1xuICAgICAgICAgIGlmICh0aGlzLl9yZWFkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRlci5jYW5jZWwobmV3IGkuQWJvcnRFeGNlcHRpb24oXCJUZXh0TGF5ZXIgdGFzayBjYW5jZWxsZWQuXCIpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9jYXBhYmlsaXR5LnJlamVjdChuZXcgaS5BYm9ydEV4Y2VwdGlvbihcIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIF9wcm9jZXNzSXRlbXModCwgZSkge1xuICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSBpZiAodm9pZCAwICE9PSBuLnN0cikge1xuICAgICAgICAgICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ci5wdXNoKG4uc3RyKTtcbiAgICAgICAgICAgIGFwcGVuZFRleHQodGhpcywgbiwgZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChcImJlZ2luTWFya2VkQ29udGVudFByb3BzXCIgPT09IG4udHlwZSB8fCBcImJlZ2luTWFya2VkQ29udGVudFwiID09PSBuLnR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9jb250YWluZXI7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFya2VkQ29udGVudFwiKTtcbiAgICAgICAgICAgIG51bGwgIT09IG4uaWQgJiYgdGhpcy5fY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImlkXCIsIFwiXCIuY29uY2F0KG4uaWQpKTtcbiAgICAgICAgICAgIHQuYXBwZW5kKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgfSBlbHNlIFwiZW5kTWFya2VkQ29udGVudFwiID09PSBuLnR5cGUgJiYgKHRoaXMuX2NvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBfbGF5b3V0VGV4dCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuX2xheW91dFRleHRQYXJhbXMucHJvcGVydGllcyA9IHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLmdldCh0KTtcbiAgICAgICAgICB0aGlzLl9sYXlvdXRUZXh0UGFyYW1zLmRpdiA9IHQ7XG4gICAgICAgICAgbGF5b3V0KHRoaXMuX2xheW91dFRleHRQYXJhbXMpO1xuICAgICAgICAgIGUuaGFzVGV4dCAmJiB0aGlzLl9jb250YWluZXIuYXBwZW5kKHQpO1xuICAgICAgICAgIGlmIChlLmhhc0VPTCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInByZXNlbnRhdGlvblwiKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmQodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9yZW5kZXIoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IG5ldyBpLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgbGV0IGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGlmICh0aGlzLl9pc1JlYWRhYmxlU3RyZWFtKSB7XG4gICAgICAgICAgICBjb25zdCBwdW1wID0gKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLl9yZWFkZXIucmVhZCgpLnRoZW4obiA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBpLFxuICAgICAgICAgICAgICAgICAgZG9uZTogclxuICAgICAgICAgICAgICAgIH0gPSBuO1xuICAgICAgICAgICAgICAgIGlmIChyKSB0LnJlc29sdmUoKTtlbHNlIHtcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZSwgaS5zdHlsZXMpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0l0ZW1zKGkuaXRlbXMsIGUpO1xuICAgICAgICAgICAgICAgICAgcHVtcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSwgdC5yZWplY3QpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRlciA9IHRoaXMuX3RleHRDb250ZW50U291cmNlLmdldFJlYWRlcigpO1xuICAgICAgICAgICAgcHVtcCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RleHRDb250ZW50U291cmNlKSB0aHJvdyBuZXcgRXJyb3IoJ05vIFwidGV4dENvbnRlbnRTb3VyY2VcIiBwYXJhbWV0ZXIgc3BlY2lmaWVkLicpO1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgaXRlbXM6IGUsXG4gICAgICAgICAgICAgICAgc3R5bGVzOiBuXG4gICAgICAgICAgICAgIH0gPSB0aGlzLl90ZXh0Q29udGVudFNvdXJjZTtcbiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0l0ZW1zKGUsIG4pO1xuICAgICAgICAgICAgICB0LnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdC5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZSA9IG51bGw7XG4gICAgICAgICAgICAhZnVuY3Rpb24gcmVuZGVyKHQpIHtcbiAgICAgICAgICAgICAgaWYgKHQuX2NhbmNlbGVkKSByZXR1cm47XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSB0Ll90ZXh0RGl2cyxcbiAgICAgICAgICAgICAgICBuID0gdC5fY2FwYWJpbGl0eTtcbiAgICAgICAgICAgICAgaWYgKGUubGVuZ3RoID4gMWU1KSBuLnJlc29sdmUoKTtlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXQuX2lzUmVhZGFibGVTdHJlYW0pIGZvciAoY29uc3QgbiBvZiBlKSB0Ll9sYXlvdXRUZXh0KG4pO1xuICAgICAgICAgICAgICAgIG4ucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KHRoaXMpO1xuICAgICAgICAgIH0sIHRoaXMuX2NhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5UZXh0TGF5ZXJSZW5kZXJUYXNrID0gVGV4dExheWVyUmVuZGVyVGFzaztcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5Bbm5vdGF0aW9uRWRpdG9yTGF5ZXIgPSB2b2lkIDA7XG4gICAgICBuKDEyNSk7XG4gICAgICBuKDEzNSk7XG4gICAgICBuKDEzNyk7XG4gICAgICBuKDE0MCk7XG4gICAgICBuKDE0Mik7XG4gICAgICBuKDE0NCk7XG4gICAgICBuKDE0Nik7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2MyksXG4gICAgICAgIHMgPSBuKDE2NCksXG4gICAgICAgIGEgPSBuKDE5NiksXG4gICAgICAgIG8gPSBuKDIwMSksXG4gICAgICAgIGwgPSBuKDE2NyksXG4gICAgICAgIGMgPSBuKDIwMik7XG4gICAgICB2YXIgX3JlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3NlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2FlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX29lID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2xlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2NlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2hlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2RlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3VlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3BlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX21lID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2JlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2dlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2ZlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDEzKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9mZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9nZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9iZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9tZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3JlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfc2UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2FlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX29lLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBvaW50ZXJ1cC5iaW5kKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2xlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBvaW50ZXJkb3duLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfY2UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9oZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZGUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3VlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9wZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIHVpTWFuYWdlcjogX2UxMSxcbiAgICAgICAgICAgIHBhZ2VJbmRleDogX243LFxuICAgICAgICAgICAgZGl2OiBfaTQsXG4gICAgICAgICAgICBhY2Nlc3NpYmlsaXR5TWFuYWdlcjogX3I0LFxuICAgICAgICAgICAgYW5ub3RhdGlvbkxheWVyOiBzLFxuICAgICAgICAgICAgdmlld3BvcnQ6IGwsXG4gICAgICAgICAgICBsMTBuOiBoXG4gICAgICAgICAgfSA9IF90MTM7XG4gICAgICAgICAgY29uc3QgZCA9IFthLkZyZWVUZXh0RWRpdG9yLCBvLklua0VkaXRvciwgYy5TdGFtcEVkaXRvcl07XG4gICAgICAgICAgaWYgKCFBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuX2luaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuX2luaXRpYWxpemVkID0gITA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgZCkgdC5pbml0aWFsaXplKGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfZTExLnJlZ2lzdGVyRWRpdG9yVHlwZXMoZCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9wZSwgX2UxMSk7XG4gICAgICAgICAgdGhpcy5wYWdlSW5kZXggPSBfbjc7XG4gICAgICAgICAgdGhpcy5kaXYgPSBfaTQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9yZSwgX3I0KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2FlLCBzKTtcbiAgICAgICAgICB0aGlzLnZpZXdwb3J0ID0gbDtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5hZGRMYXllcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNFbXB0eSgpIHtcbiAgICAgICAgICByZXR1cm4gMCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jZSkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVUb29sYmFyKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS51cGRhdGVUb29sYmFyKHQpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZU1vZGUoKSB7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmdldE1vZGUoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9mZSwgX2ZlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBpZiAodCA9PT0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkspIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSW5rRWRpdG9ySWZOZWVkZWQoITEpO1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ2xpY2soKTtcbiAgICAgICAgICB9IGVsc2UgdGhpcy5lbmFibGVDbGljaygpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLnVuc2VsZWN0QWxsKCk7XG4gICAgICAgICAgaWYgKHQgIT09IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImZyZWVUZXh0RWRpdGluZ1wiLCB0ID09PSBpLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJpbmtFZGl0aW5nXCIsIHQgPT09IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJzdGFtcEVkaXRpbmdcIiwgdCA9PT0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUCk7XG4gICAgICAgICAgICB0aGlzLmRpdi5oaWRkZW4gPSAhMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWRkSW5rRWRpdG9ySWZOZWVkZWQodCkge1xuICAgICAgICAgIGlmICghdCAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRNb2RlKCkgIT09IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LKSByZXR1cm47XG4gICAgICAgICAgaWYgKCF0KSBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jZSkudmFsdWVzKCkpIGlmICh0LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgdC5zZXRJbkJhY2tncm91bmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfZ2UsIF9nZTIpLmNhbGwodGhpcywge1xuICAgICAgICAgICAgb2Zmc2V0WDogMCxcbiAgICAgICAgICAgIG9mZnNldFk6IDBcbiAgICAgICAgICB9KS5zZXRJbkJhY2tncm91bmQoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRFZGl0aW5nU3RhdGUodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLnNldEVkaXRpbmdTdGF0ZSh0KTtcbiAgICAgICAgfVxuICAgICAgICBhZGRDb21tYW5kcyh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuYWRkQ29tbWFuZHModCk7XG4gICAgICAgIH1cbiAgICAgICAgZW5hYmxlKCkge1xuICAgICAgICAgIHRoaXMuZGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImF1dG9cIjtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IFNldCgpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgZS5lbmFibGVFZGl0aW5nKCk7XG4gICAgICAgICAgICBlLmFubm90YXRpb25FbGVtZW50SWQgJiYgdC5hZGQoZS5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2FlKSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2FlKS5nZXRFZGl0YWJsZUFubm90YXRpb25zKCk7XG4gICAgICAgICAgZm9yIChjb25zdCBuIG9mIGUpIHtcbiAgICAgICAgICAgIG4uaGlkZSgpO1xuICAgICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KG4uZGF0YS5pZCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHQuaGFzKG4uZGF0YS5pZCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZGVzZXJpYWxpemUobik7XG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICB0aGlzLmFkZE9yUmVidWlsZChlKTtcbiAgICAgICAgICAgICAgZS5lbmFibGVFZGl0aW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRpc2FibGUoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF91ZSwgITApO1xuICAgICAgICAgIHRoaXMuZGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IFNldCgpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgZS5kaXNhYmxlRWRpdGluZygpO1xuICAgICAgICAgICAgaWYgKGUuYW5ub3RhdGlvbkVsZW1lbnRJZCAmJiBudWxsID09PSBlLnNlcmlhbGl6ZSgpKSB7XG4gICAgICAgICAgICAgIHZhciBfdGhpcyRnZXRFZGl0YWJsZUFubm87XG4gICAgICAgICAgICAgIChfdGhpcyRnZXRFZGl0YWJsZUFubm8gPSB0aGlzLmdldEVkaXRhYmxlQW5ub3RhdGlvbihlLmFubm90YXRpb25FbGVtZW50SWQpKSA9PT0gbnVsbCB8fCBfdGhpcyRnZXRFZGl0YWJsZUFubm8gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGdldEVkaXRhYmxlQW5uby5zaG93KCk7XG4gICAgICAgICAgICAgIGUucmVtb3ZlKCk7XG4gICAgICAgICAgICB9IGVsc2UgdC5hZGQoZS5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYWUpKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9hZSkuZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIGUpIHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGlkOiBlXG4gICAgICAgICAgICAgIH0gPSBuLmRhdGE7XG4gICAgICAgICAgICAgIHQuaGFzKGUpIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGUpIHx8IG4uc2hvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9mZSwgX2ZlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmlzRW1wdHkgJiYgKHRoaXMuZGl2LmhpZGRlbiA9ICEwKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3VlLCAhMSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdGFibGVBbm5vdGF0aW9uKHQpIHtcbiAgICAgICAgICB2YXIgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0OTtcbiAgICAgICAgICByZXR1cm4gKChfY2xhc3NQcml2YXRlRmllbGRHZXQ5ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9hZSkpID09PSBudWxsIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldDkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDkuZ2V0RWRpdGFibGVBbm5vdGF0aW9uKHQpKSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHNldEFjdGl2ZUVkaXRvcih0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuZ2V0QWN0aXZlKCkgIT09IHQgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuc2V0QWN0aXZlRWRpdG9yKHQpO1xuICAgICAgICB9XG4gICAgICAgIGVuYWJsZUNsaWNrKCkge1xuICAgICAgICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xlKSk7XG4gICAgICAgICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX29lKSk7XG4gICAgICAgIH1cbiAgICAgICAgZGlzYWJsZUNsaWNrKCkge1xuICAgICAgICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xlKSk7XG4gICAgICAgICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX29lKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0YWNoKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS5zZXQodC5pZCwgdCk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgYW5ub3RhdGlvbkVsZW1lbnRJZDogZVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIGUgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuaXNEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZSkgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkucmVtb3ZlRGVsZXRlZEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICB9XG4gICAgICAgIGRldGFjaCh0KSB7XG4gICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDEwO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfY2UpLmRlbGV0ZSh0LmlkKTtcbiAgICAgICAgICAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTAgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3JlKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDEwLnJlbW92ZVBvaW50ZXJJblRleHRMYXllcih0LmNvbnRlbnREaXYpO1xuICAgICAgICAgICFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3VlKSAmJiB0LmFubm90YXRpb25FbGVtZW50SWQgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuYWRkRGVsZXRlZEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZSh0KSB7XG4gICAgICAgICAgdGhpcy5kZXRhY2godCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkucmVtb3ZlRWRpdG9yKHQpO1xuICAgICAgICAgIHQuZGl2LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHQuZGl2LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgICAgICAgICAgdC5kaXYucmVtb3ZlKCk7XG4gICAgICAgICAgICB0LmlzQXR0YWNoZWRUb0RPTSA9ICExO1xuICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5mb2N1c01haW5Db250YWluZXIoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2RlKSB8fCB0aGlzLmFkZElua0VkaXRvcklmTmVlZGVkKCExKTtcbiAgICAgICAgfVxuICAgICAgICBhZGQodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX21lLCBfbWUyKS5jYWxsKHRoaXMsIHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmFkZEVkaXRvcih0KTtcbiAgICAgICAgICB0aGlzLmF0dGFjaCh0KTtcbiAgICAgICAgICBpZiAoIXQuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5yZW5kZXIoKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmFwcGVuZChlKTtcbiAgICAgICAgICAgIHQuaXNBdHRhY2hlZFRvRE9NID0gITA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubW92ZUVkaXRvckluRE9NKHQpO1xuICAgICAgICAgIHQub25jZUFkZGVkKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSh0KTtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlRWRpdG9ySW5ET00odCkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQxMTtcbiAgICAgICAgICAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTEgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3JlKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDExLm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsIHQuZGl2LCB0LmNvbnRlbnREaXYsICEwKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRPclJlYnVpbGQodCkge1xuICAgICAgICAgIHQubmVlZHNUb0JlUmVidWlsdCgpID8gdC5yZWJ1aWxkKCkgOiB0aGlzLmFkZCh0KTtcbiAgICAgICAgfVxuICAgICAgICBhZGRVbmRvYWJsZUVkaXRvcih0KSB7XG4gICAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRPclJlYnVpbGQodCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgICB0LnJlbW92ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG11c3RFeGVjOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldE5leHRJZCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuZ2V0SWQoKTtcbiAgICAgICAgfVxuICAgICAgICBkZXNlcmlhbGl6ZSh0KSB7XG4gICAgICAgICAgdmFyIF90JGFubm90YXRpb25UeXBlO1xuICAgICAgICAgIHN3aXRjaCAoKF90JGFubm90YXRpb25UeXBlID0gdC5hbm5vdGF0aW9uVHlwZSkgIT09IG51bGwgJiYgX3QkYW5ub3RhdGlvblR5cGUgIT09IHZvaWQgMCA/IF90JGFubm90YXRpb25UeXBlIDogdC5hbm5vdGF0aW9uRWRpdG9yVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUOlxuICAgICAgICAgICAgICByZXR1cm4gYS5GcmVlVGV4dEVkaXRvci5kZXNlcmlhbGl6ZSh0LCB0aGlzLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKSk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LOlxuICAgICAgICAgICAgICByZXR1cm4gby5JbmtFZGl0b3IuZGVzZXJpYWxpemUodCwgdGhpcywgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QOlxuICAgICAgICAgICAgICByZXR1cm4gYy5TdGFtcEVkaXRvci5kZXNlcmlhbGl6ZSh0LCB0aGlzLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHNldFNlbGVjdGVkKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5zZXRTZWxlY3RlZCh0KTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVTZWxlY3RlZCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkudG9nZ2xlU2VsZWN0ZWQodCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNTZWxlY3RlZCh0KSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmlzU2VsZWN0ZWQodCk7XG4gICAgICAgIH1cbiAgICAgICAgdW5zZWxlY3QodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLnVuc2VsZWN0KHQpO1xuICAgICAgICB9XG4gICAgICAgIHBvaW50ZXJ1cCh0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgaXNNYWM6IGVcbiAgICAgICAgICB9ID0gaS5GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICAgICAgICBpZiAoISgwICE9PSB0LmJ1dHRvbiB8fCB0LmN0cmxLZXkgJiYgZSkgJiYgdC50YXJnZXQgPT09IHRoaXMuZGl2ICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaGUpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2hlLCAhMSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3NlKSA/IF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2dlLCBfZ2UyKS5jYWxsKHRoaXMsIHQpIDogX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9zZSwgITApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwb2ludGVyZG93bih0KSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaGUpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2hlLCAhMSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGlzTWFjOiBlXG4gICAgICAgICAgfSA9IGkuRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgICAgICAgaWYgKDAgIT09IHQuYnV0dG9uIHx8IHQuY3RybEtleSAmJiBlKSByZXR1cm47XG4gICAgICAgICAgaWYgKHQudGFyZ2V0ICE9PSB0aGlzLmRpdikgcmV0dXJuO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaGUsICEwKTtcbiAgICAgICAgICBjb25zdCBuID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuZ2V0QWN0aXZlKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9zZSwgIW4gfHwgbi5pc0VtcHR5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGRyb3AodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9wbGFpblwiKSxcbiAgICAgICAgICAgIG4gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRFZGl0b3IoZSk7XG4gICAgICAgICAgaWYgKCFuKSByZXR1cm47XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcIm1vdmVcIjtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9tZSwgX21lMikuY2FsbCh0aGlzLCBuKTtcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICByID0gdC5jbGllbnRYIC0gaS54LFxuICAgICAgICAgICAgcyA9IHQuY2xpZW50WSAtIGkueTtcbiAgICAgICAgICBuLnRyYW5zbGF0ZShyIC0gbi5zdGFydFgsIHMgLSBuLnN0YXJ0WSk7XG4gICAgICAgICAgdGhpcy5tb3ZlRWRpdG9ySW5ET00obik7XG4gICAgICAgICAgbi5kaXYuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBkcmFnb3Zlcih0KSB7XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDEyO1xuICAgICAgICAgICgoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTIgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRBY3RpdmUoKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDEyLnBhcmVudCkgPT09IHRoaXMgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuc2V0QWN0aXZlRWRpdG9yKG51bGwpO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDEzO1xuICAgICAgICAgICAgKF9jbGFzc1ByaXZhdGVGaWVsZEdldDEzID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9yZSkpID09PSBudWxsIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldDEzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2xhc3NQcml2YXRlRmllbGRHZXQxMy5yZW1vdmVQb2ludGVySW5UZXh0TGF5ZXIodC5jb250ZW50RGl2KTtcbiAgICAgICAgICAgIHQuc2V0UGFyZW50KG51bGwpO1xuICAgICAgICAgICAgdC5pc0F0dGFjaGVkVG9ET00gPSAhMTtcbiAgICAgICAgICAgIHQuZGl2LnJlbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRpdiA9IG51bGw7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jZSkuY2xlYXIoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5yZW1vdmVMYXllcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIodCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICB2aWV3cG9ydDogZVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIHRoaXMudmlld3BvcnQgPSBlO1xuICAgICAgICAgICgwLCBsLnNldExheWVyRGltZW5zaW9ucykodGhpcy5kaXYsIGUpO1xuICAgICAgICAgICgwLCBzLmJpbmRFdmVudHMpKHRoaXMsIHRoaXMuZGl2LCBbXCJkcmFnb3ZlclwiLCBcImRyb3BcIl0pO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRFZGl0b3JzKHRoaXMucGFnZUluZGV4KSkgdGhpcy5hZGQodCk7XG4gICAgICAgICAgdGhpcy51cGRhdGVNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdmlld3BvcnQ6IGVcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5jb21taXRPclJlbW92ZSgpO1xuICAgICAgICAgIHRoaXMudmlld3BvcnQgPSBlO1xuICAgICAgICAgICgwLCBsLnNldExheWVyRGltZW5zaW9ucykodGhpcy5kaXYsIHtcbiAgICAgICAgICAgIHJvdGF0aW9uOiBlLnJvdGF0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBhZ2VEaW1lbnNpb25zKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHBhZ2VXaWR0aDogdCxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IGVcbiAgICAgICAgICB9ID0gdGhpcy52aWV3cG9ydC5yYXdEaW1zO1xuICAgICAgICAgIHJldHVybiBbdCwgZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9tZTIodCkge1xuICAgICAgICBpZiAodC5wYXJlbnQgIT09IHRoaXMpIHtcbiAgICAgICAgICB2YXIgX3QkcGFyZW50O1xuICAgICAgICAgIGlmICh0LmFubm90YXRpb25FbGVtZW50SWQpIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0LmFubm90YXRpb25FbGVtZW50SWQpO1xuICAgICAgICAgICAgci5Bbm5vdGF0aW9uRWRpdG9yLmRlbGV0ZUFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgdC5hbm5vdGF0aW9uRWxlbWVudElkID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hdHRhY2godCk7XG4gICAgICAgICAgKF90JHBhcmVudCA9IHQucGFyZW50KSA9PT0gbnVsbCB8fCBfdCRwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90JHBhcmVudC5kZXRhY2godCk7XG4gICAgICAgICAgdC5zZXRQYXJlbnQodGhpcyk7XG4gICAgICAgICAgaWYgKHQuZGl2ICYmIHQuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICAgICAgICB0LmRpdi5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmFwcGVuZCh0LmRpdik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfYmUyKHQpIHtcbiAgICAgICAgc3dpdGNoIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRNb2RlKCkpIHtcbiAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGEuRnJlZVRleHRFZGl0b3IodCk7XG4gICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JUeXBlLklOSzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgby5JbmtFZGl0b3IodCk7XG4gICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBjLlN0YW1wRWRpdG9yKHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2dlMih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmdldE5leHRJZCgpLFxuICAgICAgICAgIG4gPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9iZSwgX2JlMikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICAgICAgICBpZDogZSxcbiAgICAgICAgICAgIHg6IHQub2Zmc2V0WCxcbiAgICAgICAgICAgIHk6IHQub2Zmc2V0WSxcbiAgICAgICAgICAgIHVpTWFuYWdlcjogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgbiAmJiB0aGlzLmFkZChuKTtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfZmUyKCkge1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2RlLCAhMCk7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS52YWx1ZXMoKSkgdC5pc0VtcHR5KCkgJiYgdC5yZW1vdmUoKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9kZSwgITEpO1xuICAgICAgfVxuICAgICAgX2RlZmluZVByb3BlcnR5KEFubm90YXRpb25FZGl0b3JMYXllciwgXCJfaW5pdGlhbGl6ZWRcIiwgITEpO1xuICAgICAgZS5Bbm5vdGF0aW9uRWRpdG9yTGF5ZXIgPSBBbm5vdGF0aW9uRWRpdG9yTGF5ZXI7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgX2NsYXNzMzA7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuRnJlZVRleHRFZGl0b3IgPSB2b2lkIDA7XG4gICAgICBuKDg5KTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY0KSxcbiAgICAgICAgcyA9IG4oMTYzKSxcbiAgICAgICAgYSA9IG4oMTk3KTtcbiAgICAgIHZhciBfdmUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfQWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZTEyID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1NlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0VlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3hlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3dlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0NlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1RlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1BlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1JlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2tlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0ZlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0llID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX01lID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBGcmVlVGV4dEVkaXRvciBleHRlbmRzIHMuQW5ub3RhdGlvbkVkaXRvciB7XG4gICAgICAgIHN0YXRpYyBnZXQgX2tleWJvYXJkTWFuYWdlcigpIHtcbiAgICAgICAgICBjb25zdCB0ID0gRnJlZVRleHRFZGl0b3IucHJvdG90eXBlLFxuICAgICAgICAgICAgYXJyb3dDaGVja2VyID0gdCA9PiB0LmlzRW1wdHkoKSxcbiAgICAgICAgICAgIGUgPSByLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuVFJBTlNMQVRFX1NNQUxMLFxuICAgICAgICAgICAgbiA9IHIuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5UUkFOU0xBVEVfQklHO1xuICAgICAgICAgIHJldHVybiAoMCwgaS5zaGFkb3cpKHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgci5LZXlib2FyZE1hbmFnZXIoW1tbXCJjdHJsK3NcIiwgXCJtYWMrbWV0YStzXCIsIFwiY3RybCtwXCIsIFwibWFjK21ldGErcFwiXSwgdC5jb21taXRPclJlbW92ZSwge1xuICAgICAgICAgICAgYnViYmxlczogITBcbiAgICAgICAgICB9XSwgW1tcImN0cmwrRW50ZXJcIiwgXCJtYWMrbWV0YStFbnRlclwiLCBcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIHQuY29tbWl0T3JSZW1vdmVdLCBbW1wiQXJyb3dMZWZ0XCIsIFwibWFjK0Fycm93TGVmdFwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFstZSwgMF0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcImN0cmwrQXJyb3dMZWZ0XCIsIFwibWFjK3NoaWZ0K0Fycm93TGVmdFwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFstbiwgMF0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dSaWdodFwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFtlLCAwXSxcbiAgICAgICAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgICAgICAgIH1dLCBbW1wiY3RybCtBcnJvd1JpZ2h0XCIsIFwibWFjK3NoaWZ0K0Fycm93UmlnaHRcIl0sIHQuX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICAgICAgICBhcmdzOiBbbiwgMF0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcIkFycm93VXBcIiwgXCJtYWMrQXJyb3dVcFwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFswLCAtZV0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcImN0cmwrQXJyb3dVcFwiLCBcIm1hYytzaGlmdCtBcnJvd1VwXCJdLCB0Ll90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgICAgICAgYXJnczogWzAsIC1uXSxcbiAgICAgICAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgICAgICAgIH1dLCBbW1wiQXJyb3dEb3duXCIsIFwibWFjK0Fycm93RG93blwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFswLCBlXSxcbiAgICAgICAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgICAgICAgIH1dLCBbW1wiY3RybCtBcnJvd0Rvd25cIiwgXCJtYWMrc2hpZnQrQXJyb3dEb3duXCJdLCB0Ll90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgICAgICAgYXJnczogWzAsIG5dLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV1dKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RydWN0b3IoX3QxNCkge1xuICAgICAgICAgIHN1cGVyKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3QxNCksIHt9LCB7XG4gICAgICAgICAgICBuYW1lOiBcImZyZWVUZXh0RWRpdG9yXCJcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9NZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9JZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9GZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9rZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9SZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9QZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9UZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3ZlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVkaXRvckRpdkJsdXIuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF95ZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5lZGl0b3JEaXZGb2N1cy5iaW5kKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0FlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVkaXRvckRpdklucHV0LmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZTEyLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVkaXRvckRpdktleWRvd24uYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9TZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0VlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBcIlwiXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3hlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBcIlwiLmNvbmNhdCh0aGlzLmlkLCBcIi1lZGl0b3JcIilcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfd2UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9DZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfU2UsIF90MTQuY29sb3IgfHwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBzLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3IpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfd2UsIF90MTQuZm9udFNpemUgfHwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRGb250U2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGluaXRpYWxpemUodCkge1xuICAgICAgICAgIHRoaXMuX2wxMG5Qcm9taXNlID0gbmV3IE1hcChbXCJmcmVlX3RleHQyX2RlZmF1bHRfY29udGVudFwiLCBcImVkaXRvcl9mcmVlX3RleHQyX2FyaWFfbGFiZWxcIl0ubWFwKGUgPT4gW2UsIHQuZ2V0KGUpXSkpO1xuICAgICAgICAgIGNvbnN0IGUgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgdGhpcy5faW50ZXJuYWxQYWRkaW5nID0gcGFyc2VGbG9hdChlLmdldFByb3BlcnR5VmFsdWUoXCItLWZyZWV0ZXh0LXBhZGRpbmdcIikpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHQsIGUpIHtcbiAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFOlxuICAgICAgICAgICAgICBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplID0gZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1I6XG4gICAgICAgICAgICAgIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3IgPSBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVQYXJhbXModCwgZSkge1xuICAgICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkU6XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1RlLCBfVGUyKS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUjpcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfUGUsIF9QZTIpLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICAgICAgICByZXR1cm4gW1tpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkUsIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Rm9udFNpemVdLCBbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUiwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBzLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdXTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgICAgICAgIHJldHVybiBbW2kuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRSwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93ZSldLCBbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9TZSldXTtcbiAgICAgICAgfVxuICAgICAgICBfdHJhbnNsYXRlRW1wdHkodCwgZSkge1xuICAgICAgICAgIHRoaXMuX3VpTWFuYWdlci50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnModCwgZSwgITApO1xuICAgICAgICB9XG4gICAgICAgIGdldEluaXRpYWxUcmFuc2xhdGlvbigpIHtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5wYXJlbnRTY2FsZTtcbiAgICAgICAgICByZXR1cm4gWy1GcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogdCwgLShGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICsgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93ZSkpICogdF07XG4gICAgICAgIH1cbiAgICAgICAgcmVidWlsZCgpIHtcbiAgICAgICAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgICAgICAgbnVsbCAhPT0gdGhpcy5kaXYgJiYgKHRoaXMuaXNBdHRhY2hlZFRvRE9NIHx8IHRoaXMucGFyZW50LmFkZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZW5hYmxlRWRpdE1vZGUoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudC5zZXRFZGl0aW5nU3RhdGUoITEpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQudXBkYXRlVG9vbGJhcihpLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUKTtcbiAgICAgICAgICAgIHN1cGVyLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlEaXYuY2xhc3NMaXN0LnJlbW92ZShcImVuYWJsZWRcIik7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSAhMDtcbiAgICAgICAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICExO1xuICAgICAgICAgICAgdGhpcy5kaXYucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JEaXYuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9lMTIpKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3llKSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZlKSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbkVkaXRNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnNldEVkaXRpbmdTdGF0ZSghMCk7XG4gICAgICAgICAgICBzdXBlci5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QuYWRkKFwiZW5hYmxlZFwiKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9ICExO1xuICAgICAgICAgICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeGUpKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICEwO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9lMTIpKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3llKSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZlKSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BZSkpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZm9jdXMoe1xuICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiAhMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmlzRWRpdGluZyA9ICExO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuZGl2LmNsYXNzTGlzdC5hZGQoXCJmcmVlVGV4dEVkaXRpbmdcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvY3VzaW4odCkge1xuICAgICAgICAgIHN1cGVyLmZvY3VzaW4odCk7XG4gICAgICAgICAgdC50YXJnZXQgIT09IHRoaXMuZWRpdG9yRGl2ICYmIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgb25jZUFkZGVkKCkge1xuICAgICAgICAgIGlmICh0aGlzLndpZHRoKSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9NZSwgX01lMikuY2FsbCh0aGlzKTtlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlzRW1wdHkoKSB7XG4gICAgICAgICAgcmV0dXJuICF0aGlzLmVkaXRvckRpdiB8fCBcIlwiID09PSB0aGlzLmVkaXRvckRpdi5pbm5lclRleHQudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZSgpIHtcbiAgICAgICAgICB0aGlzLmlzRWRpdGluZyA9ICExO1xuICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2V0RWRpdGluZ1N0YXRlKCEwKTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKFwiZnJlZVRleHRFZGl0aW5nXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdXBlci5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjb21taXQoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpKSByZXR1cm47XG4gICAgICAgICAgc3VwZXIuY29tbWl0KCk7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICBjb25zdCB0ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9FZSksXG4gICAgICAgICAgICBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9FZSwgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfUmUsIF9SZTIpLmNhbGwodGhpcykudHJpbUVuZCgpKTtcbiAgICAgICAgICBpZiAodCA9PT0gZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHNldFRleHQgPSB0ID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfRWUsIHQpO1xuICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRmUsIF9GZTIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgIHRoaXMucmVidWlsZCgpO1xuICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9rZSwgX2tlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLnJlbW92ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgc2V0VGV4dChlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1bmRvOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHNldFRleHQodCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbXVzdEV4ZWM6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa2UsIF9rZTIpLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNJbkVkaXRNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZW50ZXJJbkVkaXRNb2RlKCkge1xuICAgICAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGRibGNsaWNrKHQpIHtcbiAgICAgICAgICB0aGlzLmVudGVySW5FZGl0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGtleWRvd24odCkge1xuICAgICAgICAgIHQudGFyZ2V0ID09PSB0aGlzLmRpdiAmJiBcIkVudGVyXCIgPT09IHQua2V5ICYmIHRoaXMuZW50ZXJJbkVkaXRNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWRpdG9yRGl2S2V5ZG93bih0KSB7XG4gICAgICAgICAgRnJlZVRleHRFZGl0b3IuX2tleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvckRpdkZvY3VzKHQpIHtcbiAgICAgICAgICB0aGlzLmlzRWRpdGluZyA9ICEwO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvckRpdkJsdXIodCkge1xuICAgICAgICAgIHRoaXMuaXNFZGl0aW5nID0gITE7XG4gICAgICAgIH1cbiAgICAgICAgZWRpdG9yRGl2SW5wdXQodCkge1xuICAgICAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiZnJlZVRleHRFZGl0aW5nXCIsIHRoaXMuaXNFbXB0eSgpKTtcbiAgICAgICAgfVxuICAgICAgICBkaXNhYmxlRWRpdGluZygpIHtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwiY29tbWVudFwiKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLW11bHRpbGluZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVFZGl0aW5nKCkge1xuICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJ0ZXh0Ym94XCIpO1xuICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImFyaWEtbXVsdGlsaW5lXCIsICEwKTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGl2KSByZXR1cm4gdGhpcy5kaXY7XG4gICAgICAgICAgbGV0IHQsIGU7XG4gICAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHQgPSB0aGlzLng7XG4gICAgICAgICAgICBlID0gdGhpcy55O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdXBlci5yZW5kZXIoKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgdGhpcy5lZGl0b3JEaXYuY2xhc3NOYW1lID0gXCJpbnRlcm5hbFwiO1xuICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImlkXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeGUpKTtcbiAgICAgICAgICB0aGlzLmVuYWJsZUVkaXRpbmcoKTtcbiAgICAgICAgICBGcmVlVGV4dEVkaXRvci5fbDEwblByb21pc2UuZ2V0KFwiZWRpdG9yX2ZyZWVfdGV4dDJfYXJpYV9sYWJlbFwiKS50aGVuKHQgPT4ge1xuICAgICAgICAgICAgdmFyIF90aGlzJGVkaXRvckRpdjtcbiAgICAgICAgICAgIHJldHVybiAoX3RoaXMkZWRpdG9yRGl2ID0gdGhpcy5lZGl0b3JEaXYpID09PSBudWxsIHx8IF90aGlzJGVkaXRvckRpdiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgRnJlZVRleHRFZGl0b3IuX2wxMG5Qcm9taXNlLmdldChcImZyZWVfdGV4dDJfZGVmYXVsdF9jb250ZW50XCIpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkZWRpdG9yRGl2MjtcbiAgICAgICAgICAgIHJldHVybiAoX3RoaXMkZWRpdG9yRGl2MiA9IHRoaXMuZWRpdG9yRGl2KSA9PT0gbnVsbCB8fCBfdGhpcyRlZGl0b3JEaXYyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRlZGl0b3JEaXYyLnNldEF0dHJpYnV0ZShcImRlZmF1bHQtY29udGVudFwiLCB0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSAhMDtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBzdHlsZTogblxuICAgICAgICAgIH0gPSB0aGlzLmVkaXRvckRpdjtcbiAgICAgICAgICBuLmZvbnRTaXplID0gXCJjYWxjKFwiLmNvbmNhdChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3dlKSwgXCJweCAqIHZhcigtLXNjYWxlLWZhY3RvcikpXCIpO1xuICAgICAgICAgIG4uY29sb3IgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1NlKTtcbiAgICAgICAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5lZGl0b3JEaXYpO1xuICAgICAgICAgIHRoaXMub3ZlcmxheURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgdGhpcy5vdmVybGF5RGl2LmNsYXNzTGlzdC5hZGQoXCJvdmVybGF5XCIsIFwiZW5hYmxlZFwiKTtcbiAgICAgICAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5vdmVybGF5RGl2KTtcbiAgICAgICAgICAoMCwgci5iaW5kRXZlbnRzKSh0aGlzLCB0aGlzLmRpdiwgW1wiZGJsY2xpY2tcIiwgXCJrZXlkb3duXCJdKTtcbiAgICAgICAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgICAgICAgY29uc3QgW24sIGldID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCkge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHJcbiAgICAgICAgICAgICAgfSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQ2UpO1xuICAgICAgICAgICAgICBsZXQgW3MsIGFdID0gdGhpcy5nZXRJbml0aWFsVHJhbnNsYXRpb24oKTtcbiAgICAgICAgICAgICAgW3MsIGFdID0gdGhpcy5wYWdlVHJhbnNsYXRpb25Ub1NjcmVlbihzLCBhKTtcbiAgICAgICAgICAgICAgY29uc3QgW28sIGxdID0gdGhpcy5wYWdlRGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICBbYywgaF0gPSB0aGlzLnBhZ2VUcmFuc2xhdGlvbjtcbiAgICAgICAgICAgICAgbGV0IGQsIHU7XG4gICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5yb3RhdGlvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIGQgPSB0ICsgKHJbMF0gLSBjKSAvIG87XG4gICAgICAgICAgICAgICAgICB1ID0gZSArIHRoaXMuaGVpZ2h0IC0gKHJbMV0gLSBoKSAvIGw7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgICAgICAgZCA9IHQgKyAoclswXSAtIGMpIC8gbztcbiAgICAgICAgICAgICAgICAgIHUgPSBlIC0gKHJbMV0gLSBoKSAvIGw7XG4gICAgICAgICAgICAgICAgICBbcywgYV0gPSBbYSwgLXNdO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICAgICAgICBkID0gdCAtIHRoaXMud2lkdGggKyAoclswXSAtIGMpIC8gbztcbiAgICAgICAgICAgICAgICAgIHUgPSBlIC0gKHJbMV0gLSBoKSAvIGw7XG4gICAgICAgICAgICAgICAgICBbcywgYV0gPSBbLXMsIC1hXTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgICAgICAgICAgZCA9IHQgKyAoclswXSAtIGMgLSB0aGlzLmhlaWdodCAqIGwpIC8gbztcbiAgICAgICAgICAgICAgICAgIHUgPSBlICsgKHJbMV0gLSBoIC0gdGhpcy53aWR0aCAqIG8pIC8gbDtcbiAgICAgICAgICAgICAgICAgIFtzLCBhXSA9IFstYSwgc107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zZXRBdChkICogbiwgdSAqIGksIHMsIGEpO1xuICAgICAgICAgICAgfSBlbHNlIHRoaXMuc2V0QXQodCAqIG4sIGUgKiBpLCB0aGlzLndpZHRoICogbiwgdGhpcy5oZWlnaHQgKiBpKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0ZlLCBfRmUyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gITA7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSAhMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gITE7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSAhMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgICAgICB9XG4gICAgICAgIGdldCBjb250ZW50RGl2KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVkaXRvckRpdjtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZGVzZXJpYWxpemUodCwgZSwgbikge1xuICAgICAgICAgIGxldCByID0gbnVsbDtcbiAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGEuRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdEFwcGVhcmFuY2VEYXRhOiB7XG4gICAgICAgICAgICAgICAgICBmb250U2l6ZTogZSxcbiAgICAgICAgICAgICAgICAgIGZvbnRDb2xvcjogblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVjdDogcyxcbiAgICAgICAgICAgICAgICByb3RhdGlvbjogYSxcbiAgICAgICAgICAgICAgICBpZDogb1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0ZXh0Q29udGVudDogbCxcbiAgICAgICAgICAgICAgdGV4dFBvc2l0aW9uOiBjLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyOiBoXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICAgIGlmICghbCB8fCAwID09PSBsLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByID0gdCA9IHtcbiAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU6IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQsXG4gICAgICAgICAgICAgIGNvbG9yOiBBcnJheS5mcm9tKG4pLFxuICAgICAgICAgICAgICBmb250U2l6ZTogZSxcbiAgICAgICAgICAgICAgdmFsdWU6IGwuam9pbihcIlxcblwiKSxcbiAgICAgICAgICAgICAgcG9zaXRpb246IGMsXG4gICAgICAgICAgICAgIHBhZ2VJbmRleDogaCAtIDEsXG4gICAgICAgICAgICAgIHJlY3Q6IHMsXG4gICAgICAgICAgICAgIHJvdGF0aW9uOiBhLFxuICAgICAgICAgICAgICBpZDogbyxcbiAgICAgICAgICAgICAgZGVsZXRlZDogITFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHMgPSBzdXBlci5kZXNlcmlhbGl6ZSh0LCBlLCBuKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQocywgX3dlLCB0LmZvbnRTaXplKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQocywgX1NlLCBpLlV0aWwubWFrZUhleENvbG9yKC4uLnQuY29sb3IpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQocywgX0VlLCB0LnZhbHVlKTtcbiAgICAgICAgICBzLmFubm90YXRpb25FbGVtZW50SWQgPSB0LmlkIHx8IG51bGw7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHMsIF9DZSwgcik7XG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplKCkge1xuICAgICAgICAgIGxldCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdO1xuICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICAgICAgICBpZDogdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkLFxuICAgICAgICAgICAgZGVsZXRlZDogITBcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGUgPSBGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogdGhpcy5wYXJlbnRTY2FsZSxcbiAgICAgICAgICAgIG4gPSB0aGlzLmdldFJlY3QoZSwgZSksXG4gICAgICAgICAgICByID0gcy5Bbm5vdGF0aW9uRWRpdG9yLl9jb2xvck1hbmFnZXIuY29udmVydCh0aGlzLmlzQXR0YWNoZWRUb0RPTSA/IGdldENvbXB1dGVkU3R5bGUodGhpcy5lZGl0b3JEaXYpLmNvbG9yIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9TZSkpLFxuICAgICAgICAgICAgYSA9IHtcbiAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU6IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQsXG4gICAgICAgICAgICAgIGNvbG9yOiByLFxuICAgICAgICAgICAgICBmb250U2l6ZTogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0VlKSxcbiAgICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgcmVjdDogbixcbiAgICAgICAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb25cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHQpIHJldHVybiBhO1xuICAgICAgICAgIGlmICh0aGlzLmFubm90YXRpb25FbGVtZW50SWQgJiYgIV9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0llLCBfSWUyKS5jYWxsKHRoaXMsIGEpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBhLmlkID0gdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkO1xuICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfY2xhc3MzMCA9IEZyZWVUZXh0RWRpdG9yO1xuICAgICAgZnVuY3Rpb24gX1RlMih0KSB7XG4gICAgICAgIGNvbnN0IHNldEZvbnRzaXplID0gdCA9PiB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5zdHlsZS5mb250U2l6ZSA9IFwiY2FsYyhcIi5jb25jYXQodCwgXCJweCAqIHZhcigtLXNjYWxlLWZhY3RvcikpXCIpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUoMCwgLSh0IC0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93ZSkpICogdGhpcy5wYXJlbnRTY2FsZSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3dlLCB0KTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2tlLCBfa2UyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfd2UpO1xuICAgICAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgIHNldEZvbnRzaXplKHQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgc2V0Rm9udHNpemUoZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdXN0RXhlYzogITAsXG4gICAgICAgICAgdHlwZTogaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFLFxuICAgICAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6ICEwLFxuICAgICAgICAgIGtlZXBVbmRvOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9QZTIodCkge1xuICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9TZSk7XG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9TZSwgdGhpcy5lZGl0b3JEaXYuc3R5bGUuY29sb3IgPSB0KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfU2UsIHRoaXMuZWRpdG9yRGl2LnN0eWxlLmNvbG9yID0gZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdXN0RXhlYzogITAsXG4gICAgICAgICAgdHlwZTogaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUixcbiAgICAgICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiAhMCxcbiAgICAgICAgICBrZWVwVW5kbzogITBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfUmUyKCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5lZGl0b3JEaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJkaXZcIik7XG4gICAgICAgIGlmICgwID09PSB0Lmxlbmd0aCkgcmV0dXJuIHRoaXMuZWRpdG9yRGl2LmlubmVyVGV4dDtcbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdCkgZS5wdXNoKG4uaW5uZXJUZXh0LnJlcGxhY2UoL1xcclxcbj98XFxuLywgXCJcIikpO1xuICAgICAgICByZXR1cm4gZS5qb2luKFwiXFxuXCIpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2tlMigpIHtcbiAgICAgICAgY29uc3QgW3QsIGVdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICBsZXQgbjtcbiAgICAgICAgaWYgKHRoaXMuaXNBdHRhY2hlZFRvRE9NKSBuID0gdGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBjdXJyZW50TGF5ZXI6IHQsXG4gICAgICAgICAgICAgIGRpdjogZVxuICAgICAgICAgICAgfSA9IHRoaXMsXG4gICAgICAgICAgICBpID0gZS5zdHlsZS5kaXNwbGF5O1xuICAgICAgICAgIGUuc3R5bGUuZGlzcGxheSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgdC5kaXYuYXBwZW5kKHRoaXMuZGl2KTtcbiAgICAgICAgICBuID0gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICBlLnJlbW92ZSgpO1xuICAgICAgICAgIGUuc3R5bGUuZGlzcGxheSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm90YXRpb24gJSAxODAgPT0gdGhpcy5wYXJlbnRSb3RhdGlvbiAlIDE4MCkge1xuICAgICAgICAgIHRoaXMud2lkdGggPSBuLndpZHRoIC8gdDtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IG4uaGVpZ2h0IC8gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLndpZHRoID0gbi5oZWlnaHQgLyB0O1xuICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gbi53aWR0aCAvIGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0ZlMigpIHtcbiAgICAgICAgdGhpcy5lZGl0b3JEaXYucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0VlKSkgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRWUpLnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgZS5hcHBlbmQodCA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5hcHBlbmQoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9JZTIodCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdmFsdWU6IGUsXG4gICAgICAgICAgZm9udFNpemU6IG4sXG4gICAgICAgICAgY29sb3I6IGksXG4gICAgICAgICAgcmVjdDogcixcbiAgICAgICAgICBwYWdlSW5kZXg6IHNcbiAgICAgICAgfSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQ2UpO1xuICAgICAgICByZXR1cm4gdC52YWx1ZSAhPT0gZSB8fCB0LmZvbnRTaXplICE9PSBuIHx8IHQucmVjdC5zb21lKCh0LCBlKSA9PiBNYXRoLmFicyh0IC0gcltlXSkgPj0gMSkgfHwgdC5jb2xvci5zb21lKCh0LCBlKSA9PiB0ICE9PSBpW2VdKSB8fCB0LnBhZ2VJbmRleCAhPT0gcztcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9NZTIoKSB7XG4gICAgICAgIGxldCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAoIXRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCkgcmV0dXJuO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9rZSwgX2tlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKCF0ICYmICgwID09PSB0aGlzLndpZHRoIHx8IDAgPT09IHRoaXMuaGVpZ2h0KSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTWUsIF9NZTIpLmNhbGwodGhpcywgITApLCAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZSA9IF9jbGFzczMwLl9pbnRlcm5hbFBhZGRpbmcgKiB0aGlzLnBhcmVudFNjYWxlO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0NlKS5yZWN0ID0gdGhpcy5nZXRSZWN0KGUsIGUpO1xuICAgICAgfVxuICAgICAgX2RlZmluZVByb3BlcnR5KEZyZWVUZXh0RWRpdG9yLCBcIl9mcmVlVGV4dERlZmF1bHRDb250ZW50XCIsIFwiXCIpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KEZyZWVUZXh0RWRpdG9yLCBcIl9sMTBuUHJvbWlzZVwiLCB2b2lkIDApO1xuICAgICAgX2RlZmluZVByb3BlcnR5KEZyZWVUZXh0RWRpdG9yLCBcIl9pbnRlcm5hbFBhZGRpbmdcIiwgMCk7XG4gICAgICBfZGVmaW5lUHJvcGVydHkoRnJlZVRleHRFZGl0b3IsIFwiX2RlZmF1bHRDb2xvclwiLCBudWxsKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShGcmVlVGV4dEVkaXRvciwgXCJfZGVmYXVsdEZvbnRTaXplXCIsIDEwKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShGcmVlVGV4dEVkaXRvciwgXCJfdHlwZVwiLCBcImZyZWV0ZXh0XCIpO1xuICAgICAgZS5GcmVlVGV4dEVkaXRvciA9IEZyZWVUZXh0RWRpdG9yO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9yZTIsIF9hbiwgX29uLCBfbG4sIF9jbjtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5TdGFtcEFubm90YXRpb25FbGVtZW50ID0gZS5JbmtBbm5vdGF0aW9uRWxlbWVudCA9IGUuRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCA9IGUuQW5ub3RhdGlvbkxheWVyID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICBuKDEyNSk7XG4gICAgICBuKDEzNSk7XG4gICAgICBuKDEzNyk7XG4gICAgICBuKDE0MCk7XG4gICAgICBuKDE0Mik7XG4gICAgICBuKDE0NCk7XG4gICAgICBuKDE0Nik7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2NyksXG4gICAgICAgIHMgPSBuKDE2MiksXG4gICAgICAgIGEgPSBuKDE5OCksXG4gICAgICAgIG8gPSBuKDE5OSksXG4gICAgICAgIGwgPSBuKDIwMCk7XG4gICAgICBjb25zdCBjID0gMWUzLFxuICAgICAgICBoID0gbmV3IFdlYWtTZXQoKTtcbiAgICAgIGZ1bmN0aW9uIGdldFJlY3REaW1zKHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3aWR0aDogdFsyXSAtIHRbMF0sXG4gICAgICAgICAgaGVpZ2h0OiB0WzNdIC0gdFsxXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2xhc3MgQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5IHtcbiAgICAgICAgc3RhdGljIGNyZWF0ZSh0KSB7XG4gICAgICAgICAgc3dpdGNoICh0LmRhdGEuYW5ub3RhdGlvblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5MSU5LOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IExpbmtBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5URVhUOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFRleHRBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5XSURHRVQ6XG4gICAgICAgICAgICAgIHN3aXRjaCAodC5kYXRhLmZpZWxkVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJUeFwiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkJ0blwiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZGF0YS5yYWRpb0J1dHRvbiA/IG5ldyBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHQpIDogdC5kYXRhLmNoZWNrQm94ID8gbmV3IENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCkgOiBuZXcgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDaFwiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiU2lnXCI6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZVdpZGdldEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuUE9QVVA6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5GUkVFVEVYVDpcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLkxJTkU6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgTGluZUFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLlNRVUFSRTpcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTcXVhcmVBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5DSVJDTEU6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuUE9MWUxJTkU6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5DQVJFVDpcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXJldEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLklOSzpcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmtBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5QT0xZR09OOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5ISUdITElHSFQ6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuZGVybGluZUFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLlNRVUlHR0xZOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLlNUQU1QOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX0RlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICBjbGFzcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfRGUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogZSA9ICExLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiBuID0gITEsXG4gICAgICAgICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogaSA9ICExXG4gICAgICAgICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICAgICAgdGhpcy5pc1JlbmRlcmFibGUgPSBlO1xuICAgICAgICAgIHRoaXMuZGF0YSA9IHQuZGF0YTtcbiAgICAgICAgICB0aGlzLmxheWVyID0gdC5sYXllcjtcbiAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlID0gdC5saW5rU2VydmljZTtcbiAgICAgICAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IHQuZG93bmxvYWRNYW5hZ2VyO1xuICAgICAgICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gdC5pbWFnZVJlc291cmNlc1BhdGg7XG4gICAgICAgICAgdGhpcy5yZW5kZXJGb3JtcyA9IHQucmVuZGVyRm9ybXM7XG4gICAgICAgICAgdGhpcy5zdmdGYWN0b3J5ID0gdC5zdmdGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UgPSB0LmFubm90YXRpb25TdG9yYWdlO1xuICAgICAgICAgIHRoaXMuZW5hYmxlU2NyaXB0aW5nID0gdC5lbmFibGVTY3JpcHRpbmc7XG4gICAgICAgICAgdGhpcy5oYXNKU0FjdGlvbnMgPSB0Lmhhc0pTQWN0aW9ucztcbiAgICAgICAgICB0aGlzLl9maWVsZE9iamVjdHMgPSB0LmZpZWxkT2JqZWN0cztcbiAgICAgICAgICB0aGlzLnBhcmVudCA9IHQucGFyZW50O1xuICAgICAgICAgIGUgJiYgKHRoaXMuY29udGFpbmVyID0gdGhpcy5fY3JlYXRlQ29udGFpbmVyKG4pKTtcbiAgICAgICAgICBpICYmIHRoaXMuX2NyZWF0ZVF1YWRyaWxhdGVyYWxzKCk7XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZUNvbnRhaW5lcih0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBkYXRhOiBlLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgICAgICBwYWdlOiBuLFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0OiByXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gPSB0aGlzLFxuICAgICAgICAgICAgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiZGF0YS1hbm5vdGF0aW9uLWlkXCIsIGUuaWQpO1xuICAgICAgICAgIHMuc3R5bGUuekluZGV4ID0gdGhpcy5wYXJlbnQuekluZGV4Kys7XG4gICAgICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmICYmIHMuc2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiLCBcImRpYWxvZ1wiKTtcbiAgICAgICAgICBlLm5vUm90YXRlICYmIHMuY2xhc3NMaXN0LmFkZChcIm5vcm90YXRlXCIpO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHBhZ2VXaWR0aDogYSxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IG8sXG4gICAgICAgICAgICBwYWdlWDogbCxcbiAgICAgICAgICAgIHBhZ2VZOiBjXG4gICAgICAgICAgfSA9IHIucmF3RGltcztcbiAgICAgICAgICBpZiAoIWUucmVjdCB8fCB0aGlzIGluc3RhbmNlb2YgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICByb3RhdGlvbjogdFxuICAgICAgICAgICAgfSA9IGU7XG4gICAgICAgICAgICBlLmhhc093bkNhbnZhcyB8fCAwID09PSB0IHx8IHRoaXMuc2V0Um90YXRpb24odCwgcyk7XG4gICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICB3aWR0aDogaCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBkXG4gICAgICAgICAgICB9ID0gZ2V0UmVjdERpbXMoZS5yZWN0KSxcbiAgICAgICAgICAgIHUgPSBpLlV0aWwubm9ybWFsaXplUmVjdChbZS5yZWN0WzBdLCBuLnZpZXdbM10gLSBlLnJlY3RbMV0gKyBuLnZpZXdbMV0sIGUucmVjdFsyXSwgbi52aWV3WzNdIC0gZS5yZWN0WzNdICsgbi52aWV3WzFdXSk7XG4gICAgICAgICAgaWYgKCF0ICYmIGUuYm9yZGVyU3R5bGUud2lkdGggPiAwKSB7XG4gICAgICAgICAgICBzLnN0eWxlLmJvcmRlcldpZHRoID0gXCJcIi5jb25jYXQoZS5ib3JkZXJTdHlsZS53aWR0aCwgXCJweFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmJvcmRlclN0eWxlLmhvcml6b250YWxDb3JuZXJSYWRpdXMsXG4gICAgICAgICAgICAgIG4gPSBlLmJvcmRlclN0eWxlLnZlcnRpY2FsQ29ybmVyUmFkaXVzO1xuICAgICAgICAgICAgaWYgKHQgPiAwIHx8IG4gPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBcImNhbGMoXCIuY29uY2F0KHQsIFwicHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKSAvIGNhbGMoXCIpLmNvbmNhdChuLCBcInB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlcIik7XG4gICAgICAgICAgICAgIHMuc3R5bGUuYm9yZGVyUmFkaXVzID0gZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IFwiY2FsYyhcIi5jb25jYXQoaCwgXCJweCAqIHZhcigtLXNjYWxlLWZhY3RvcikpIC8gY2FsYyhcIikuY29uY2F0KGQsIFwicHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKVwiKTtcbiAgICAgICAgICAgICAgcy5zdHlsZS5ib3JkZXJSYWRpdXMgPSB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChlLmJvcmRlclN0eWxlLnN0eWxlKSB7XG4gICAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOlxuICAgICAgICAgICAgICAgIHMuc3R5bGUuYm9yZGVyU3R5bGUgPSBcInNvbGlkXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkRBU0hFRDpcbiAgICAgICAgICAgICAgICBzLnN0eWxlLmJvcmRlclN0eWxlID0gXCJkYXNoZWRcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuQkVWRUxFRDpcbiAgICAgICAgICAgICAgICAoMCwgaS53YXJuKShcIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBiZXZlbGVkXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5JTlNFVDpcbiAgICAgICAgICAgICAgICAoMCwgaS53YXJuKShcIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBpbnNldFwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FOlxuICAgICAgICAgICAgICAgIHMuc3R5bGUuYm9yZGVyQm90dG9tU3R5bGUgPSBcInNvbGlkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByID0gZS5ib3JkZXJDb2xvciB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9EZSwgITApO1xuICAgICAgICAgICAgICBzLnN0eWxlLmJvcmRlckNvbG9yID0gaS5VdGlsLm1ha2VIZXhDb2xvcigwIHwgclswXSwgMCB8IHJbMV0sIDAgfCByWzJdKTtcbiAgICAgICAgICAgIH0gZWxzZSBzLnN0eWxlLmJvcmRlcldpZHRoID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcy5zdHlsZS5sZWZ0ID0gMTAwICogKHVbMF0gLSBsKSAvIGEgKyBcIiVcIjtcbiAgICAgICAgICBzLnN0eWxlLnRvcCA9IDEwMCAqICh1WzFdIC0gYykgLyBvICsgXCIlXCI7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgcm90YXRpb246IHBcbiAgICAgICAgICB9ID0gZTtcbiAgICAgICAgICBpZiAoZS5oYXNPd25DYW52YXMgfHwgMCA9PT0gcCkge1xuICAgICAgICAgICAgcy5zdHlsZS53aWR0aCA9IDEwMCAqIGggLyBhICsgXCIlXCI7XG4gICAgICAgICAgICBzLnN0eWxlLmhlaWdodCA9IDEwMCAqIGQgLyBvICsgXCIlXCI7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuc2V0Um90YXRpb24ocCwgcyk7XG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Um90YXRpb24odCkge1xuICAgICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5yZWN0KSByZXR1cm47XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBwYWdlV2lkdGg6IG4sXG4gICAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IGlcbiAgICAgICAgICAgIH0gPSB0aGlzLnBhcmVudC52aWV3cG9ydC5yYXdEaW1zLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3aWR0aDogcixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBzXG4gICAgICAgICAgICB9ID0gZ2V0UmVjdERpbXModGhpcy5kYXRhLnJlY3QpO1xuICAgICAgICAgIGxldCBhLCBvO1xuICAgICAgICAgIGlmICh0ICUgMTgwID09IDApIHtcbiAgICAgICAgICAgIGEgPSAxMDAgKiByIC8gbjtcbiAgICAgICAgICAgIG8gPSAxMDAgKiBzIC8gaTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYSA9IDEwMCAqIHMgLyBuO1xuICAgICAgICAgICAgbyA9IDEwMCAqIHIgLyBpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlLnN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQoYSwgXCIlXCIpO1xuICAgICAgICAgIGUuc3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQobywgXCIlXCIpO1xuICAgICAgICAgIGUuc2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIsICgzNjAgLSB0KSAlIDM2MCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IF9jb21tb25BY3Rpb25zKCkge1xuICAgICAgICAgIGNvbnN0IHNldENvbG9yID0gKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuLmRldGFpbFt0XTtcbiAgICAgICAgICAgIG4udGFyZ2V0LnN0eWxlW2VdID0gYS5Db2xvckNvbnZlcnRlcnNbXCJcIi5jb25jYXQoaVswXSwgXCJfSFRNTFwiKV0oaS5zbGljZSgxKSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gKDAsIGkuc2hhZG93KSh0aGlzLCBcIl9jb21tb25BY3Rpb25zXCIsIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IHQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBlID0gdC5kZXRhaWwuZGlzcGxheSAlIDIgPT0gMTtcbiAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9IGUgPyBcImhpZGRlblwiIDogXCJ2aXNpYmxlXCI7XG4gICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgICAgICAgICAgaGlkZGVuOiBlLFxuICAgICAgICAgICAgICAgIHByaW50OiAwID09PSB0LmRldGFpbC5kaXNwbGF5IHx8IDMgPT09IHQuZGV0YWlsLmRpc3BsYXlcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJpbnQ6IHQgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICAgICAgICAgIHByaW50OiB0LmRldGFpbC5wcmludFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoaWRkZW46IHQgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gdC5kZXRhaWwuaGlkZGVuID8gXCJoaWRkZW5cIiA6IFwidmlzaWJsZVwiO1xuICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICAgICAgICAgIGhpZGRlbjogdC5kZXRhaWwuaGlkZGVuXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvY3VzOiB0ID0+IHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0LnRhcmdldC5mb2N1cyh7XG4gICAgICAgICAgICAgICAgcHJldmVudFNjcm9sbDogITFcbiAgICAgICAgICAgICAgfSksIDApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVzZXJOYW1lOiB0ID0+IHtcbiAgICAgICAgICAgICAgdC50YXJnZXQudGl0bGUgPSB0LmRldGFpbC51c2VyTmFtZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkb25seTogdCA9PiB7XG4gICAgICAgICAgICAgIHQuZGV0YWlsLnJlYWRvbmx5ID8gdC50YXJnZXQuc2V0QXR0cmlidXRlKFwicmVhZG9ubHlcIiwgXCJcIikgOiB0LnRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJyZWFkb25seVwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogdCA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX3NldFJlcXVpcmVkKHQudGFyZ2V0LCB0LmRldGFpbC5yZXF1aXJlZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmdDb2xvcjogdCA9PiB7XG4gICAgICAgICAgICAgIHNldENvbG9yKFwiYmdDb2xvclwiLCBcImJhY2tncm91bmRDb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaWxsQ29sb3I6IHQgPT4ge1xuICAgICAgICAgICAgICBzZXRDb2xvcihcImZpbGxDb2xvclwiLCBcImJhY2tncm91bmRDb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmZ0NvbG9yOiB0ID0+IHtcbiAgICAgICAgICAgICAgc2V0Q29sb3IoXCJmZ0NvbG9yXCIsIFwiY29sb3JcIiwgdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGV4dENvbG9yOiB0ID0+IHtcbiAgICAgICAgICAgICAgc2V0Q29sb3IoXCJ0ZXh0Q29sb3JcIiwgXCJjb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdCA9PiB7XG4gICAgICAgICAgICAgIHNldENvbG9yKFwiYm9yZGVyQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHJva2VDb2xvcjogdCA9PiB7XG4gICAgICAgICAgICAgIHNldENvbG9yKFwic3Ryb2tlQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByb3RhdGlvbjogdCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSB0LmRldGFpbC5yb3RhdGlvbjtcbiAgICAgICAgICAgICAgdGhpcy5zZXRSb3RhdGlvbihlKTtcbiAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcbiAgICAgICAgICAgICAgICByb3RhdGlvbjogZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBfZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5fY29tbW9uQWN0aW9ucztcbiAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoZS5kZXRhaWwpKSB7XG4gICAgICAgICAgICBjb25zdCByID0gdFtpXSB8fCBuW2ldO1xuICAgICAgICAgICAgciA9PT0gbnVsbCB8fCByID09PSB2b2lkIDAgPyB2b2lkIDAgOiByKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlModCkge1xuICAgICAgICAgIGlmICghdGhpcy5lbmFibGVTY3JpcHRpbmcpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5nZXRSYXdWYWx1ZSh0aGlzLmRhdGEuaWQpO1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9jb21tb25BY3Rpb25zO1xuICAgICAgICAgIGZvciAoY29uc3QgW2ksIHJdIG9mIE9iamVjdC5lbnRyaWVzKGUpKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gbltpXTtcbiAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgIHMoe1xuICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgW2ldOiByXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfY3JlYXRlUXVhZHJpbGF0ZXJhbHMoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHF1YWRQb2ludHM6IHRcbiAgICAgICAgICB9ID0gdGhpcy5kYXRhO1xuICAgICAgICAgIGlmICghdCkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IFtlLCBuLCBpLCByXSA9IHRoaXMuZGF0YS5yZWN0O1xuICAgICAgICAgIGlmICgxID09PSB0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgWywge1xuICAgICAgICAgICAgICB4OiBzLFxuICAgICAgICAgICAgICB5OiBhXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHg6IG8sXG4gICAgICAgICAgICAgIHk6IGxcbiAgICAgICAgICAgIH1dID0gdFswXTtcbiAgICAgICAgICAgIGlmIChpID09PSBzICYmIHIgPT09IGEgJiYgZSA9PT0gbyAmJiBuID09PSBsKSByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHN0eWxlOiBzXG4gICAgICAgICAgfSA9IHRoaXMuY29udGFpbmVyO1xuICAgICAgICAgIGxldCBhO1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0RlKSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBib3JkZXJDb2xvcjogdCxcbiAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IGVcbiAgICAgICAgICAgIH0gPSBzO1xuICAgICAgICAgICAgcy5ib3JkZXJXaWR0aCA9IDA7XG4gICAgICAgICAgICBhID0gW1widXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCxcIiwgJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiJywgJyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMSAxXCI+JywgXCI8ZyBmaWxsPVxcXCJ0cmFuc3BhcmVudFxcXCIgc3Ryb2tlPVxcXCJcIi5jb25jYXQodCwgXCJcXFwiIHN0cm9rZS13aWR0aD1cXFwiXCIpLmNvbmNhdChlLCBcIlxcXCI+XCIpXTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoYXNCb3JkZXJcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG8gPSBpIC0gZSxcbiAgICAgICAgICAgIGwgPSByIC0gbixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3ZnRmFjdG9yeTogY1xuICAgICAgICAgICAgfSA9IHRoaXMsXG4gICAgICAgICAgICBoID0gYy5jcmVhdGVFbGVtZW50KFwic3ZnXCIpO1xuICAgICAgICAgIGguY2xhc3NMaXN0LmFkZChcInF1YWRyaWxhdGVyYWxzQ29udGFpbmVyXCIpO1xuICAgICAgICAgIGguc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgMCk7XG4gICAgICAgICAgaC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgMCk7XG4gICAgICAgICAgY29uc3QgZCA9IGMuY3JlYXRlRWxlbWVudChcImRlZnNcIik7XG4gICAgICAgICAgaC5hcHBlbmQoZCk7XG4gICAgICAgICAgY29uc3QgdSA9IGMuY3JlYXRlRWxlbWVudChcImNsaXBQYXRoXCIpLFxuICAgICAgICAgICAgcCA9IFwiY2xpcHBhdGhfXCIuY29uY2F0KHRoaXMuZGF0YS5pZCk7XG4gICAgICAgICAgdS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBwKTtcbiAgICAgICAgICB1LnNldEF0dHJpYnV0ZShcImNsaXBQYXRoVW5pdHNcIiwgXCJvYmplY3RCb3VuZGluZ0JveFwiKTtcbiAgICAgICAgICBkLmFwcGVuZCh1KTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFssIHtcbiAgICAgICAgICAgIHg6IG4sXG4gICAgICAgICAgICB5OiBpXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgeDogcyxcbiAgICAgICAgICAgIHk6IGhcbiAgICAgICAgICB9XSBvZiB0KSB7XG4gICAgICAgICAgICB2YXIgX2EzO1xuICAgICAgICAgICAgY29uc3QgdCA9IGMuY3JlYXRlRWxlbWVudChcInJlY3RcIiksXG4gICAgICAgICAgICAgIGQgPSAocyAtIGUpIC8gbyxcbiAgICAgICAgICAgICAgcCA9IChyIC0gaSkgLyBsLFxuICAgICAgICAgICAgICBmID0gKG4gLSBzKSAvIG8sXG4gICAgICAgICAgICAgIGcgPSAoaSAtIGgpIC8gbDtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwieFwiLCBkKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwieVwiLCBwKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgZik7XG4gICAgICAgICAgICB0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBnKTtcbiAgICAgICAgICAgIHUuYXBwZW5kKHQpO1xuICAgICAgICAgICAgKF9hMyA9IGEpID09PSBudWxsIHx8IF9hMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EzLnB1c2goXCI8cmVjdCB2ZWN0b3ItZWZmZWN0PVxcXCJub24tc2NhbGluZy1zdHJva2VcXFwiIHg9XFxcIlwiLmNvbmNhdChkLCBcIlxcXCIgeT1cXFwiXCIpLmNvbmNhdChwLCBcIlxcXCIgd2lkdGg9XFxcIlwiKS5jb25jYXQoZiwgXCJcXFwiIGhlaWdodD1cXFwiXCIpLmNvbmNhdChnLCBcIlxcXCIvPlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0RlKSkge1xuICAgICAgICAgICAgYS5wdXNoKFwiPC9nPjwvc3ZnPicpXCIpO1xuICAgICAgICAgICAgcy5iYWNrZ3JvdW5kSW1hZ2UgPSBhLmpvaW4oXCJcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChoKTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5jbGlwUGF0aCA9IFwidXJsKCNcIi5jb25jYXQocCwgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9jcmVhdGVQb3B1cCgpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb250YWluZXI6IHQsXG4gICAgICAgICAgICBkYXRhOiBlXG4gICAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIsIFwiZGlhbG9nXCIpO1xuICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCh7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGNvbG9yOiBlLmNvbG9yLFxuICAgICAgICAgICAgICB0aXRsZU9iajogZS50aXRsZU9iaixcbiAgICAgICAgICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogZS5tb2RpZmljYXRpb25EYXRlLFxuICAgICAgICAgICAgICBjb250ZW50c09iajogZS5jb250ZW50c09iaixcbiAgICAgICAgICAgICAgcmljaFRleHQ6IGUucmljaFRleHQsXG4gICAgICAgICAgICAgIHBhcmVudFJlY3Q6IGUucmVjdCxcbiAgICAgICAgICAgICAgYm9yZGVyU3R5bGU6IDAsXG4gICAgICAgICAgICAgIGlkOiBcInBvcHVwX1wiLmNvbmNhdChlLmlkKSxcbiAgICAgICAgICAgICAgcm90YXRpb246IGUucm90YXRpb25cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgICAgICAgZWxlbWVudHM6IFt0aGlzXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucGFyZW50LmRpdi5hcHBlbmQobi5yZW5kZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgQW5ub3RhdGlvbkVsZW1lbnQucmVuZGVyYCBjYWxsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgX2dldEVsZW1lbnRzQnlOYW1lKHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkT2JqZWN0cykge1xuICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuX2ZpZWxkT2JqZWN0c1t0XTtcbiAgICAgICAgICAgIGlmIChyKSBmb3IgKGNvbnN0IHtcbiAgICAgICAgICAgICAgcGFnZTogdCxcbiAgICAgICAgICAgICAgaWQ6IHMsXG4gICAgICAgICAgICAgIGV4cG9ydFZhbHVlczogYVxuICAgICAgICAgICAgfSBvZiByKSB7XG4gICAgICAgICAgICAgIGlmICgtMSA9PT0gdCkgY29udGludWU7XG4gICAgICAgICAgICAgIGlmIChzID09PSBlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgciA9IFwic3RyaW5nXCIgPT0gdHlwZW9mIGEgPyBhIDogbnVsbCxcbiAgICAgICAgICAgICAgICBvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltkYXRhLWVsZW1lbnQtaWQ9XFxcIlwiLmNvbmNhdChzLCBcIlxcXCJdXCIpKTtcbiAgICAgICAgICAgICAgIW8gfHwgaC5oYXMobykgPyBuLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBzLFxuICAgICAgICAgICAgICAgIGV4cG9ydFZhbHVlOiByLFxuICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQ6IG9cbiAgICAgICAgICAgICAgfSkgOiAoMCwgaS53YXJuKShcIl9nZXRFbGVtZW50c0J5TmFtZSAtIGVsZW1lbnQgbm90IGFsbG93ZWQ6IFwiLmNvbmNhdChzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBpIG9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKHQpKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZXhwb3J0VmFsdWU6IHRcbiAgICAgICAgICAgICAgfSA9IGksXG4gICAgICAgICAgICAgIHIgPSBpLmdldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiKTtcbiAgICAgICAgICAgIHIgIT09IGUgJiYgaC5oYXMoaSkgJiYgbi5wdXNoKHtcbiAgICAgICAgICAgICAgaWQ6IHIsXG4gICAgICAgICAgICAgIGV4cG9ydFZhbHVlOiB0LFxuICAgICAgICAgICAgICBkb21FbGVtZW50OiBpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgc2hvdygpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkcG9wdXA7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIgJiYgKHRoaXMuY29udGFpbmVyLmhpZGRlbiA9ICExKTtcbiAgICAgICAgICAoX3RoaXMkcG9wdXAgPSB0aGlzLnBvcHVwKSA9PT0gbnVsbCB8fCBfdGhpcyRwb3B1cCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcG9wdXAubWF5YmVTaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgaGlkZSgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkcG9wdXAyO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyICYmICh0aGlzLmNvbnRhaW5lci5oaWRkZW4gPSAhMCk7XG4gICAgICAgICAgKF90aGlzJHBvcHVwMiA9IHRoaXMucG9wdXApID09PSBudWxsIHx8IF90aGlzJHBvcHVwMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcG9wdXAyLmZvcmNlSGlkZSgpO1xuICAgICAgICB9XG4gICAgICAgIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHQpKSBmb3IgKGNvbnN0IGUgb2YgdCkgZS5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtlbHNlIHQuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICAgIH1cbiAgICAgICAgX2VkaXRPbkRvdWJsZUNsaWNrKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGFubm90YXRpb25FZGl0b3JUeXBlOiB0LFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBpZDogZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlO1xuICAgICAgICAgICAgKF90aGlzJGxpbmtTZXJ2aWNlJGV2ZSA9IHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpID09PSBudWxsIHx8IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlLmRpc3BhdGNoKFwic3dpdGNoYW5ub3RhdGlvbmVkaXRvcm1vZGVcIiwge1xuICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgIG1vZGU6IHQsXG4gICAgICAgICAgICAgIGVkaXRJZDogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfTGUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfT2UgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIExpbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IoX3QxNSkge1xuICAgICAgICAgIGxldCBfZTEzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgICAgICAgIHN1cGVyKF90MTUsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogITAsXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEhKF9lMTMgIT09IG51bGwgJiYgX2UxMyAhPT0gdm9pZCAwICYmIF9lMTMuaWdub3JlQm9yZGVyKSxcbiAgICAgICAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfT2UpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfTGUpO1xuICAgICAgICAgIHRoaXMuaXNUb29sdGlwT25seSA9IF90MTUuZGF0YS5pc1Rvb2x0aXBPbmx5O1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGRhdGE6IHQsXG4gICAgICAgICAgICAgIGxpbmtTZXJ2aWNlOiBlXG4gICAgICAgICAgICB9ID0gdGhpcyxcbiAgICAgICAgICAgIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgICBuLnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCB0LmlkKTtcbiAgICAgICAgICBsZXQgaSA9ICExO1xuICAgICAgICAgIGlmICh0LnVybCkge1xuICAgICAgICAgICAgZS5hZGRMaW5rQXR0cmlidXRlcyhuLCB0LnVybCwgdC5uZXdXaW5kb3cpO1xuICAgICAgICAgICAgaSA9ICEwO1xuICAgICAgICAgIH0gZWxzZSBpZiAodC5hY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2JpbmROYW1lZEFjdGlvbihuLCB0LmFjdGlvbik7XG4gICAgICAgICAgICBpID0gITA7XG4gICAgICAgICAgfSBlbHNlIGlmICh0LmF0dGFjaG1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2JpbmRBdHRhY2htZW50KG4sIHQuYXR0YWNobWVudCk7XG4gICAgICAgICAgICBpID0gITA7XG4gICAgICAgICAgfSBlbHNlIGlmICh0LnNldE9DR1N0YXRlKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9PZSwgX09lMikuY2FsbCh0aGlzLCBuLCB0LnNldE9DR1N0YXRlKTtcbiAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHQuZGVzdCkge1xuICAgICAgICAgICAgdGhpcy5fYmluZExpbmsobiwgdC5kZXN0KTtcbiAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHQuYWN0aW9ucyAmJiAodC5hY3Rpb25zLkFjdGlvbiB8fCB0LmFjdGlvbnNbXCJNb3VzZSBVcFwiXSB8fCB0LmFjdGlvbnNbXCJNb3VzZSBEb3duXCJdKSAmJiB0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgICAgICAgICB0aGlzLl9iaW5kSlNBY3Rpb24obiwgdCk7XG4gICAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0LnJlc2V0Rm9ybSkge1xuICAgICAgICAgICAgICB0aGlzLl9iaW5kUmVzZXRGb3JtQWN0aW9uKG4sIHQucmVzZXRGb3JtKTtcbiAgICAgICAgICAgICAgaSA9ICEwO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVG9vbHRpcE9ubHkgJiYgIWkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYmluZExpbmsobiwgXCJcIik7XG4gICAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImxpbmtBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIGkgJiYgdGhpcy5jb250YWluZXIuYXBwZW5kKG4pO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgICBfYmluZExpbmsodCwgZSkge1xuICAgICAgICAgIHQuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0RGVzdGluYXRpb25IYXNoKGUpO1xuICAgICAgICAgIHQub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIGUgJiYgdGhpcy5saW5rU2VydmljZS5nb1RvRGVzdGluYXRpb24oZSk7XG4gICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgfTtcbiAgICAgICAgICAoZSB8fCBcIlwiID09PSBlKSAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9MZSwgX0xlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBfYmluZE5hbWVkQWN0aW9uKHQsIGUpIHtcbiAgICAgICAgICB0LmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcbiAgICAgICAgICB0Lm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV4ZWN1dGVOYW1lZEFjdGlvbihlKTtcbiAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0xlLCBfTGUyKS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIF9iaW5kQXR0YWNobWVudCh0LCBlKSB7XG4gICAgICAgICAgdC5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgICAgICAgdC5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF90aGlzJGRvd25sb2FkTWFuYWdlcjtcbiAgICAgICAgICAgIChfdGhpcyRkb3dubG9hZE1hbmFnZXIgPSB0aGlzLmRvd25sb2FkTWFuYWdlcikgPT09IG51bGwgfHwgX3RoaXMkZG93bmxvYWRNYW5hZ2VyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkb3dubG9hZE1hbmFnZXIub3Blbk9yRG93bmxvYWREYXRhKHRoaXMuY29udGFpbmVyLCBlLmNvbnRlbnQsIGUuZmlsZW5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgIH07XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTGUsIF9MZTIpLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgX2JpbmRKU0FjdGlvbih0LCBlKSB7XG4gICAgICAgICAgdC5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgICAgICAgY29uc3QgbiA9IG5ldyBNYXAoW1tcIkFjdGlvblwiLCBcIm9uY2xpY2tcIl0sIFtcIk1vdXNlIFVwXCIsIFwib25tb3VzZXVwXCJdLCBbXCJNb3VzZSBEb3duXCIsIFwib25tb3VzZWRvd25cIl1dKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoZS5hY3Rpb25zKSkge1xuICAgICAgICAgICAgY29uc3QgciA9IG4uZ2V0KGkpO1xuICAgICAgICAgICAgciAmJiAodFtyXSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTI7XG4gICAgICAgICAgICAgIChfdGhpcyRsaW5rU2VydmljZSRldmUyID0gdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cykgPT09IG51bGwgfHwgX3RoaXMkbGlua1NlcnZpY2UkZXZlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlMi5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgIGlkOiBlLmlkLFxuICAgICAgICAgICAgICAgICAgbmFtZTogaVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0Lm9uY2xpY2sgfHwgKHQub25jbGljayA9ICgpID0+ICExKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9MZSwgX0xlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBfYmluZFJlc2V0Rm9ybUFjdGlvbih0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHQub25jbGljaztcbiAgICAgICAgICBuIHx8ICh0LmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTGUsIF9MZTIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkT2JqZWN0cykgdC5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTM7XG4gICAgICAgICAgICBuID09PSBudWxsIHx8IG4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG4oKTtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHQsXG4gICAgICAgICAgICAgICAgcmVmczogcixcbiAgICAgICAgICAgICAgICBpbmNsdWRlOiBzXG4gICAgICAgICAgICAgIH0gPSBlLFxuICAgICAgICAgICAgICBhID0gW107XG4gICAgICAgICAgICBpZiAoMCAhPT0gdC5sZW5ndGggfHwgMCAhPT0gci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBTZXQocik7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuX2ZpZWxkT2JqZWN0c1tuXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIGlkOiBuXG4gICAgICAgICAgICAgICAgfSBvZiB0KSBlLmFkZChuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9maWVsZE9iamVjdHMpKSBmb3IgKGNvbnN0IG4gb2YgdCkgZS5oYXMobi5pZCkgPT09IHMgJiYgYS5wdXNoKG4pO1xuICAgICAgICAgICAgfSBlbHNlIGZvciAoY29uc3QgdCBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2ZpZWxkT2JqZWN0cykpIGEucHVzaCguLi50KTtcbiAgICAgICAgICAgIGNvbnN0IG8gPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgICBsID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgYSkge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgaWQ6IGVcbiAgICAgICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgICAgIGwucHVzaChlKTtcbiAgICAgICAgICAgICAgc3dpdGNoICh0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdC5kZWZhdWx0VmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgby5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJyYWRpb2J1dHRvblwiOlxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdC5kZWZhdWx0VmFsdWUgPT09IHQuZXhwb3J0VmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICBvLnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogblxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbWJvYm94XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImxpc3Rib3hcIjpcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHQuZGVmYXVsdFZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIG8uc2V0VmFsdWUoZSwge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJbZGF0YS1lbGVtZW50LWlkPVxcXCJcIi5jb25jYXQoZSwgXCJcXFwiXVwiKSk7XG4gICAgICAgICAgICAgIG4gJiYgKGguaGFzKG4pID8gbi5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInJlc2V0Zm9ybVwiKSkgOiAoMCwgaS53YXJuKShcIl9iaW5kUmVzZXRGb3JtQWN0aW9uIC0gZWxlbWVudCBub3QgYWxsb3dlZDogXCIuY29uY2F0KGUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiAoKF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTMgPSB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSA9PT0gbnVsbCB8fCBfdGhpcyRsaW5rU2VydmljZSRldmUzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRsaW5rU2VydmljZSRldmUzLmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgaWQ6IFwiYXBwXCIsXG4gICAgICAgICAgICAgICAgaWRzOiBsLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiUmVzZXRGb3JtXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgIH07ZWxzZSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKSgnX2JpbmRSZXNldEZvcm1BY3Rpb24gLSBcInJlc2V0Rm9ybVwiIGFjdGlvbiBub3Qgc3VwcG9ydGVkLCBlbnN1cmUgdGhhdCB0aGUgYGZpZWxkT2JqZWN0c2AgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLicpO1xuICAgICAgICAgICAgbiB8fCAodC5vbmNsaWNrID0gKCkgPT4gITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0xlMigpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS1pbnRlcm5hbC1saW5rXCIsIFwiXCIpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX09lMih0LCBlKSB7XG4gICAgICAgIHQuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgICAgICB0Lm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5saW5rU2VydmljZS5leGVjdXRlU2V0T0NHU3RhdGUoZSk7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9O1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9MZSwgX0xlMikuY2FsbCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIGNsYXNzIFRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqLCBfdCRkYXRhJGNvbnRlbnRzT2JqLCBfdCRkYXRhJHJpY2hUZXh0O1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqICE9PSB2b2lkIDAgJiYgX3QkZGF0YSR0aXRsZU9iai5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmogPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmogIT09IHZvaWQgMCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqLnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dCA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dCAhPT0gdm9pZCAwICYmIF90JGRhdGEkcmljaFRleHQuc3RyKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGV4dEFubm90YXRpb25cIik7XG4gICAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICAgdC5zcmMgPSB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCArIFwiYW5ub3RhdGlvbi1cIiArIHRoaXMuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgKyBcIi5zdmdcIjtcbiAgICAgICAgICB0LmFsdCA9IFwiW3t7dHlwZX19IEFubm90YXRpb25dXCI7XG4gICAgICAgICAgdC5kYXRhc2V0LmwxMG5JZCA9IFwidGV4dF9hbm5vdGF0aW9uX3R5cGVcIjtcbiAgICAgICAgICB0LmRhdGFzZXQubDEwbkFyZ3MgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLmRhdGEubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiB8fCB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZCh0KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmFsdGVybmF0aXZlVGV4dCAmJiAodGhpcy5jb250YWluZXIudGl0bGUgPSB0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgc2hvd0VsZW1lbnRBbmRIaWRlQ2FudmFzKHQpIHtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhLmhhc093bkNhbnZhcykge1xuICAgICAgICAgICAgdmFyIF90JHByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIFwiQ0FOVkFTXCIgPT09ICgoX3QkcHJldmlvdXNTaWJsaW5nID0gdC5wcmV2aW91c1NpYmxpbmcpID09PSBudWxsIHx8IF90JHByZXZpb3VzU2libGluZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3QkcHJldmlvdXNTaWJsaW5nLm5vZGVOYW1lKSAmJiAodC5wcmV2aW91c1NpYmxpbmcuaGlkZGVuID0gITApO1xuICAgICAgICAgICAgdC5oaWRkZW4gPSAhMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2dldEtleU1vZGlmaWVyKHQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpc1dpbjogZSxcbiAgICAgICAgICAgIGlzTWFjOiBuXG4gICAgICAgICAgfSA9IGkuRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgICAgICAgcmV0dXJuIGUgJiYgdC5jdHJsS2V5IHx8IG4gJiYgdC5tZXRhS2V5O1xuICAgICAgICB9XG4gICAgICAgIF9zZXRFdmVudExpc3RlbmVyKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgICBlLmluY2x1ZGVzKFwibW91c2VcIikgPyB0LmFkZEV2ZW50TGlzdGVuZXIoZSwgdCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlNDtcbiAgICAgICAgICAgIChfdGhpcyRsaW5rU2VydmljZSRldmU0ID0gdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cykgPT09IG51bGwgfHwgX3RoaXMkbGlua1NlcnZpY2UkZXZlNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlNC5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogbixcbiAgICAgICAgICAgICAgICB2YWx1ZTogaSh0KSxcbiAgICAgICAgICAgICAgICBzaGlmdDogdC5zaGlmdEtleSxcbiAgICAgICAgICAgICAgICBtb2RpZmllcjogdGhpcy5fZ2V0S2V5TW9kaWZpZXIodClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkgOiB0LmFkZEV2ZW50TGlzdGVuZXIoZSwgdCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlNTtcbiAgICAgICAgICAgIChfdGhpcyRsaW5rU2VydmljZSRldmU1ID0gdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cykgPT09IG51bGwgfHwgX3RoaXMkbGlua1NlcnZpY2UkZXZlNSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlNS5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogbixcbiAgICAgICAgICAgICAgICB2YWx1ZTogaSh0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0RXZlbnRMaXN0ZW5lcnModCwgZSwgbikge1xuICAgICAgICAgIGZvciAoY29uc3QgW2ksIHJdIG9mIGUpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyRkYXRhJGFjdGlvbnM7XG4gICAgICAgICAgICAoXCJBY3Rpb25cIiA9PT0gciB8fCAoKF90aGlzJGRhdGEkYWN0aW9ucyA9IHRoaXMuZGF0YS5hY3Rpb25zKSA9PT0gbnVsbCB8fCBfdGhpcyRkYXRhJGFjdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRhdGEkYWN0aW9uc1tyXSkpICYmIHRoaXMuX3NldEV2ZW50TGlzdGVuZXIodCwgaSwgciwgbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9zZXRCYWNrZ3JvdW5kQ29sb3IodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yIHx8IG51bGw7XG4gICAgICAgICAgdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBudWxsID09PSBlID8gXCJ0cmFuc3BhcmVudFwiIDogaS5VdGlsLm1ha2VIZXhDb2xvcihlWzBdLCBlWzFdLCBlWzJdKTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0VGV4dFN0eWxlKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gW1wibGVmdFwiLCBcImNlbnRlclwiLCBcInJpZ2h0XCJdLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmb250Q29sb3I6IG5cbiAgICAgICAgICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLFxuICAgICAgICAgICAgciA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemUgfHwgOSxcbiAgICAgICAgICAgIHMgPSB0LnN0eWxlO1xuICAgICAgICAgIGxldCBhO1xuICAgICAgICAgIGNvbnN0IHJvdW5kVG9PbmVEZWNpbWFsID0gdCA9PiBNYXRoLnJvdW5kKDEwICogdCkgLyAxMDtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IE1hdGguYWJzKHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0gLSAyKSxcbiAgICAgICAgICAgICAgZSA9IHQgLyAoTWF0aC5yb3VuZCh0IC8gKGkuTElORV9GQUNUT1IgKiByKSkgfHwgMSk7XG4gICAgICAgICAgICBhID0gTWF0aC5taW4ociwgcm91bmRUb09uZURlY2ltYWwoZSAvIGkuTElORV9GQUNUT1IpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdCA9IE1hdGguYWJzKHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0gLSAyKTtcbiAgICAgICAgICAgIGEgPSBNYXRoLm1pbihyLCByb3VuZFRvT25lRGVjaW1hbCh0IC8gaS5MSU5FX0ZBQ1RPUikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzLmZvbnRTaXplID0gXCJjYWxjKFwiLmNvbmNhdChhLCBcInB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlcIik7XG4gICAgICAgICAgcy5jb2xvciA9IGkuVXRpbC5tYWtlSGV4Q29sb3IoblswXSwgblsxXSwgblsyXSk7XG4gICAgICAgICAgbnVsbCAhPT0gdGhpcy5kYXRhLnRleHRBbGlnbm1lbnQgJiYgKHMudGV4dEFsaWduID0gZVt0aGlzLmRhdGEudGV4dEFsaWdubWVudF0pO1xuICAgICAgICB9XG4gICAgICAgIF9zZXRSZXF1aXJlZCh0LCBlKSB7XG4gICAgICAgICAgZSA/IHQuc2V0QXR0cmlidXRlKFwicmVxdWlyZWRcIiwgITApIDogdC5yZW1vdmVBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZShcImFyaWEtcmVxdWlyZWRcIiwgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogdC5yZW5kZXJGb3JtcyB8fCAhdC5kYXRhLmhhc0FwcGVhcmFuY2UgJiYgISF0LmRhdGEuZmllbGRWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldFByb3BlcnR5T25TaWJsaW5ncyh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgY29uc3QgciA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgICAgICAgZm9yIChjb25zdCBzIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKHQubmFtZSwgdC5pZCkpIHtcbiAgICAgICAgICAgIHMuZG9tRWxlbWVudCAmJiAocy5kb21FbGVtZW50W2VdID0gbik7XG4gICAgICAgICAgICByLnNldFZhbHVlKHMuaWQsIHtcbiAgICAgICAgICAgICAgW2ldOiBuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgZSA9IHRoaXMuZGF0YS5pZDtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGV4dFdpZGdldEFubm90YXRpb25cIik7XG4gICAgICAgICAgbGV0IG4gPSBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLnJlbmRlckZvcm1zKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkZGF0YSR0ZXh0Q29udGVuO1xuICAgICAgICAgICAgY29uc3QgaSA9IHQuZ2V0VmFsdWUoZSwge1xuICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5kYXRhLmZpZWxkVmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHIgPSBpLnZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICBjb25zdCBzID0gdC5nZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgIGNoYXJMaW1pdDogdGhpcy5kYXRhLm1heExlblxuICAgICAgICAgICAgfSkuY2hhckxpbWl0O1xuICAgICAgICAgICAgcyAmJiByLmxlbmd0aCA+IHMgJiYgKHIgPSByLnNsaWNlKDAsIHMpKTtcbiAgICAgICAgICAgIGxldCBhID0gaS5mb3JtYXR0ZWRWYWx1ZSB8fCAoKF90aGlzJGRhdGEkdGV4dENvbnRlbiA9IHRoaXMuZGF0YS50ZXh0Q29udGVudCkgPT09IG51bGwgfHwgX3RoaXMkZGF0YSR0ZXh0Q29udGVuID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkYXRhJHRleHRDb250ZW4uam9pbihcIlxcblwiKSkgfHwgbnVsbDtcbiAgICAgICAgICAgIGEgJiYgdGhpcy5kYXRhLmNvbWIgJiYgKGEgPSBhLnJlcGxhY2VBbGwoL1xccysvZywgXCJcIikpO1xuICAgICAgICAgICAgY29uc3QgbyA9IHtcbiAgICAgICAgICAgICAgdXNlclZhbHVlOiByLFxuICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogYSxcbiAgICAgICAgICAgICAgbGFzdENvbW1pdHRlZFZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICBjb21taXRLZXk6IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkge1xuICAgICAgICAgICAgICB2YXIgX2E0O1xuICAgICAgICAgICAgICBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gKF9hNCA9IGEpICE9PSBudWxsICYmIF9hNCAhPT0gdm9pZCAwID8gX2E0IDogcjtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhLmRvTm90U2Nyb2xsICYmIChuLnN0eWxlLm92ZXJmbG93WSA9IFwiaGlkZGVuXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIF9hNTtcbiAgICAgICAgICAgICAgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgICAgICAgbi50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICAgIG4uc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgKF9hNSA9IGEpICE9PSBudWxsICYmIF9hNSAhPT0gdm9pZCAwID8gX2E1IDogcik7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YS5kb05vdFNjcm9sbCAmJiAobi5zdHlsZS5vdmVyZmxvd1ggPSBcImhpZGRlblwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgJiYgKG4uaGlkZGVuID0gITApO1xuICAgICAgICAgICAgaC5hZGQobik7XG4gICAgICAgICAgICBuLnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCBlKTtcbiAgICAgICAgICAgIG4uZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgICAgICAgICBuLm5hbWUgPSB0aGlzLmRhdGEuYmFzZUZpZWxkTmFtZSB8fCB0aGlzLmRhdGEuZmllbGROYW1lO1xuICAgICAgICAgICAgbi50YWJJbmRleCA9IGM7XG4gICAgICAgICAgICB0aGlzLl9zZXRSZXF1aXJlZChuLCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuICAgICAgICAgICAgcyAmJiAobi5tYXhMZW5ndGggPSBzKTtcbiAgICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGkgPT4ge1xuICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuc2V0UHJvcGVydHlPblNpYmxpbmdzKG4sIFwidmFsdWVcIiwgaS50YXJnZXQudmFsdWUsIFwidmFsdWVcIik7XG4gICAgICAgICAgICAgIG8uZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuLmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgdCA9PiB7XG4gICAgICAgICAgICAgIHZhciBfdGhpcyRkYXRhJGRlZmF1bHRGaWU7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSAoX3RoaXMkZGF0YSRkZWZhdWx0RmllID0gdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlKSAhPT0gbnVsbCAmJiBfdGhpcyRkYXRhJGRlZmF1bHRGaWUgIT09IHZvaWQgMCA/IF90aGlzJGRhdGEkZGVmYXVsdEZpZSA6IFwiXCI7XG4gICAgICAgICAgICAgIG4udmFsdWUgPSBvLnVzZXJWYWx1ZSA9IGU7XG4gICAgICAgICAgICAgIG8uZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgYmx1ckxpc3RlbmVyID0gdCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogZVxuICAgICAgICAgICAgICB9ID0gbztcbiAgICAgICAgICAgICAgbnVsbCAhPSBlICYmICh0LnRhcmdldC52YWx1ZSA9IGUpO1xuICAgICAgICAgICAgICB0LnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgICAgICAgICAgdmFyIF90aGlzJGRhdGEkYWN0aW9uczI7XG4gICAgICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIHRhcmdldDogZVxuICAgICAgICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICAgICAgIG8udXNlclZhbHVlICYmIChlLnZhbHVlID0gby51c2VyVmFsdWUpO1xuICAgICAgICAgICAgICAgIG8ubGFzdENvbW1pdHRlZFZhbHVlID0gZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBvLmNvbW1pdEtleSA9IDE7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBuID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFbGVtZW50QW5kSGlkZUNhbnZhcyhuLnRhcmdldCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlKG4pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9uJGRldGFpbCR2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgby51c2VyVmFsdWUgPSAoX24kZGV0YWlsJHZhbHVlID0gbi5kZXRhaWwudmFsdWUpICE9PSBudWxsICYmIF9uJGRldGFpbCR2YWx1ZSAhPT0gdm9pZCAwID8gX24kZGV0YWlsJHZhbHVlIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG8udXNlclZhbHVlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG4udGFyZ2V0LnZhbHVlID0gby51c2VyVmFsdWU7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUobikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWU6IGlcbiAgICAgICAgICAgICAgICAgICAgfSA9IG4uZGV0YWlsO1xuICAgICAgICAgICAgICAgICAgICBvLmZvcm1hdHRlZFZhbHVlID0gaTtcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSBpICYmIG4udGFyZ2V0ICE9PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmIChuLnRhcmdldC52YWx1ZSA9IGkpO1xuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogaVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzZWxSYW5nZSh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHQudGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKC4uLnQuZGV0YWlsLnNlbFJhbmdlKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjaGFyTGltaXQ6IG4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFyTGltaXQ6IGlcbiAgICAgICAgICAgICAgICAgICAgICB9ID0gbi5kZXRhaWwsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiByXG4gICAgICAgICAgICAgICAgICAgICAgfSA9IG47XG4gICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgci5yZW1vdmVBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIik7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHIuc2V0QXR0cmlidXRlKFwibWF4TGVuZ3RoXCIsIGkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcyA9IG8udXNlclZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocyAmJiAhKHMubGVuZ3RoIDw9IGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTY7XG4gICAgICAgICAgICAgICAgICAgICAgcyA9IHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgci52YWx1ZSA9IG8udXNlclZhbHVlID0gcztcbiAgICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgKF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTYgPSB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSA9PT0gbnVsbCB8fCBfdGhpcyRsaW5rU2VydmljZSRldmU2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRsaW5rU2VydmljZSRldmU2LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiAhMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0S2V5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxTdGFydDogci5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsRW5kOiByLnNlbGVjdGlvbkVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goaSwgbik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgIG8uY29tbWl0S2V5ID0gMTtcbiAgICAgICAgICAgICAgICBsZXQgbiA9IC0xO1xuICAgICAgICAgICAgICAgIFwiRXNjYXBlXCIgPT09IHQua2V5ID8gbiA9IDAgOiBcIkVudGVyXCIgIT09IHQua2V5IHx8IHRoaXMuZGF0YS5tdWx0aUxpbmUgPyBcIlRhYlwiID09PSB0LmtleSAmJiAoby5jb21taXRLZXkgPSAzKSA6IG4gPSAyO1xuICAgICAgICAgICAgICAgIGlmICgtMSA9PT0gbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBpXG4gICAgICAgICAgICAgICAgfSA9IHQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIGlmIChvLmxhc3RDb21taXR0ZWRWYWx1ZSAhPT0gaSkge1xuICAgICAgICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTc7XG4gICAgICAgICAgICAgICAgICBvLmxhc3RDb21taXR0ZWRWYWx1ZSA9IGk7XG4gICAgICAgICAgICAgICAgICBvLnVzZXJWYWx1ZSA9IGk7XG4gICAgICAgICAgICAgICAgICAoX3RoaXMkbGlua1NlcnZpY2UkZXZlNyA9IHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpID09PSBudWxsIHx8IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTcuZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZDogZSxcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIktleXN0cm9rZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpLFxuICAgICAgICAgICAgICAgICAgICAgIHdpbGxDb21taXQ6ICEwLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdEtleTogbixcbiAgICAgICAgICAgICAgICAgICAgICBzZWxTdGFydDogdC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgc2VsRW5kOiB0LnRhcmdldC5zZWxlY3Rpb25FbmRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IGJsdXJMaXN0ZW5lcjtcbiAgICAgICAgICAgICAgYmx1ckxpc3RlbmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgbi5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0ID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlODtcbiAgICAgICAgICAgICAgICBpZiAoIXQucmVsYXRlZFRhcmdldCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBuXG4gICAgICAgICAgICAgICAgfSA9IHQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIG8udXNlclZhbHVlID0gbjtcbiAgICAgICAgICAgICAgICBvLmxhc3RDb21taXR0ZWRWYWx1ZSAhPT0gbiAmJiAoKF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTggPSB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSA9PT0gbnVsbCB8fCBfdGhpcyRsaW5rU2VydmljZSRldmU4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRsaW5rU2VydmljZSRldmU4LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGUsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiAhMCxcbiAgICAgICAgICAgICAgICAgICAgY29tbWl0S2V5OiBvLmNvbW1pdEtleSxcbiAgICAgICAgICAgICAgICAgICAgc2VsU3RhcnQ6IHQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBzZWxFbmQ6IHQudGFyZ2V0LnNlbGVjdGlvbkVuZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBpKHQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgKChfdGhpcyRkYXRhJGFjdGlvbnMyID0gdGhpcy5kYXRhLmFjdGlvbnMpID09PSBudWxsIHx8IF90aGlzJGRhdGEkYWN0aW9uczIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRhdGEkYWN0aW9uczIuS2V5c3Ryb2tlKSAmJiBuLmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCB0ID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlOTtcbiAgICAgICAgICAgICAgICBvLmxhc3RDb21taXR0ZWRWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBuLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGlcbiAgICAgICAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcixcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQ6IHMsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZDogYVxuICAgICAgICAgICAgICAgICAgfSA9IGk7XG4gICAgICAgICAgICAgICAgbGV0IGwgPSBzLFxuICAgICAgICAgICAgICAgICAgYyA9IGE7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0LmlucHV0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVdvcmRCYWNrd2FyZFwiOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHIuc3Vic3RyaW5nKDAsIHMpLm1hdGNoKC9cXHcqW15cXHddKiQvKTtcbiAgICAgICAgICAgICAgICAgICAgICB0ICYmIChsIC09IHRbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVdvcmRGb3J3YXJkXCI6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gci5zdWJzdHJpbmcocykubWF0Y2goL15bXlxcd10qXFx3Ki8pO1xuICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKGMgKz0gdFswXS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCI6XG4gICAgICAgICAgICAgICAgICAgIHMgPT09IGEgJiYgKGwgLT0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCI6XG4gICAgICAgICAgICAgICAgICAgIHMgPT09IGEgJiYgKGMgKz0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAoX3RoaXMkbGlua1NlcnZpY2UkZXZlOSA9IHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpID09PSBudWxsIHx8IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTkuZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICBpZDogZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZTogbiB8fCBcIlwiLFxuICAgICAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiAhMSxcbiAgICAgICAgICAgICAgICAgICAgc2VsU3RhcnQ6IGwsXG4gICAgICAgICAgICAgICAgICAgIHNlbEVuZDogY1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMobiwgW1tcImZvY3VzXCIsIFwiRm9jdXNcIl0sIFtcImJsdXJcIiwgXCJCbHVyXCJdLCBbXCJtb3VzZWRvd25cIiwgXCJNb3VzZSBEb3duXCJdLCBbXCJtb3VzZWVudGVyXCIsIFwiTW91c2UgRW50ZXJcIl0sIFtcIm1vdXNlbGVhdmVcIiwgXCJNb3VzZSBFeGl0XCJdLCBbXCJtb3VzZXVwXCIsIFwiTW91c2UgVXBcIl1dLCB0ID0+IHQudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsdXJMaXN0ZW5lciAmJiBuLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGJsdXJMaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9ICh0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdKSAvIHM7XG4gICAgICAgICAgICAgIG4uY2xhc3NMaXN0LmFkZChcImNvbWJcIik7XG4gICAgICAgICAgICAgIG4uc3R5bGUubGV0dGVyU3BhY2luZyA9IFwiY2FsYyhcIi5jb25jYXQodCwgXCJweCAqIHZhcigtLXNjYWxlLWZhY3RvcikgLSAxY2gpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIG4udGV4dENvbnRlbnQgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZTtcbiAgICAgICAgICAgIG4uc3R5bGUudmVydGljYWxBbGlnbiA9IFwibWlkZGxlXCI7XG4gICAgICAgICAgICBuLnN0eWxlLmRpc3BsYXkgPSBcInRhYmxlLWNlbGxcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc2V0VGV4dFN0eWxlKG4pO1xuICAgICAgICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvcihuKTtcbiAgICAgICAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhuKTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQobik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGFzcyBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISF0LmRhdGEuaGFzT3duQ2FudmFzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6IHQucmVuZGVyRm9ybXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UsXG4gICAgICAgICAgICBlID0gdGhpcy5kYXRhLFxuICAgICAgICAgICAgbiA9IGUuaWQ7XG4gICAgICAgICAgbGV0IGkgPSB0LmdldFZhbHVlKG4sIHtcbiAgICAgICAgICAgIHZhbHVlOiBlLmV4cG9ydFZhbHVlID09PSBlLmZpZWxkVmFsdWVcbiAgICAgICAgICB9KS52YWx1ZTtcbiAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgaSkge1xuICAgICAgICAgICAgaSA9IFwiT2ZmXCIgIT09IGk7XG4gICAgICAgICAgICB0LnNldFZhbHVlKG4sIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvblwiLCBcImNoZWNrQm94XCIpO1xuICAgICAgICAgIGNvbnN0IHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgaC5hZGQocik7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgbik7XG4gICAgICAgICAgci5kaXNhYmxlZCA9IGUucmVhZE9ubHk7XG4gICAgICAgICAgdGhpcy5fc2V0UmVxdWlyZWQociwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICAgICAgICByLnR5cGUgPSBcImNoZWNrYm94XCI7XG4gICAgICAgICAgci5uYW1lID0gZS5iYXNlRmllbGROYW1lIHx8IGUuZmllbGROYW1lO1xuICAgICAgICAgIGkgJiYgci5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsICEwKTtcbiAgICAgICAgICByLnNldEF0dHJpYnV0ZShcImV4cG9ydFZhbHVlXCIsIGUuZXhwb3J0VmFsdWUpO1xuICAgICAgICAgIHIudGFiSW5kZXggPSBjO1xuICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgbmFtZTogcixcbiAgICAgICAgICAgICAgY2hlY2tlZDogc1xuICAgICAgICAgICAgfSA9IGkudGFyZ2V0O1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKHIsIG4pKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG4gPSBzICYmIGkuZXhwb3J0VmFsdWUgPT09IGUuZXhwb3J0VmFsdWU7XG4gICAgICAgICAgICAgIGkuZG9tRWxlbWVudCAmJiAoaS5kb21FbGVtZW50LmNoZWNrZWQgPSBuKTtcbiAgICAgICAgICAgICAgdC5zZXRWYWx1ZShpLmlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IG5cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0LnNldFZhbHVlKG4sIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBlLmRlZmF1bHRGaWVsZFZhbHVlIHx8IFwiT2ZmXCI7XG4gICAgICAgICAgICB0LnRhcmdldC5jaGVja2VkID0gbiA9PT0gZS5leHBvcnRWYWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWZyb21zYW5kYm94XCIsIGUgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlKGUpIHtcbiAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LmNoZWNrZWQgPSBcIk9mZlwiICE9PSBlLmRldGFpbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUobiwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZS50YXJnZXQuY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goaSwgZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKHIsIFtbXCJjaGFuZ2VcIiwgXCJWYWxpZGF0ZVwiXSwgW1wiY2hhbmdlXCIsIFwiQWN0aW9uXCJdLCBbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgdCA9PiB0LnRhcmdldC5jaGVja2VkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKHIpO1xuICAgICAgICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKHIpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6IHQucmVuZGVyRm9ybXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImJ1dHRvbldpZGdldEFubm90YXRpb25cIiwgXCJyYWRpb0J1dHRvblwiKTtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZSxcbiAgICAgICAgICAgIGUgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgICBuID0gZS5pZDtcbiAgICAgICAgICBsZXQgaSA9IHQuZ2V0VmFsdWUobiwge1xuICAgICAgICAgICAgdmFsdWU6IGUuZmllbGRWYWx1ZSA9PT0gZS5idXR0b25WYWx1ZVxuICAgICAgICAgIH0pLnZhbHVlO1xuICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiBpKSB7XG4gICAgICAgICAgICBpID0gaSAhPT0gZS5idXR0b25WYWx1ZTtcbiAgICAgICAgICAgIHQuc2V0VmFsdWUobiwge1xuICAgICAgICAgICAgICB2YWx1ZTogaVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgaC5hZGQocik7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgbik7XG4gICAgICAgICAgci5kaXNhYmxlZCA9IGUucmVhZE9ubHk7XG4gICAgICAgICAgdGhpcy5fc2V0UmVxdWlyZWQociwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICAgICAgICByLnR5cGUgPSBcInJhZGlvXCI7XG4gICAgICAgICAgci5uYW1lID0gZS5iYXNlRmllbGROYW1lIHx8IGUuZmllbGROYW1lO1xuICAgICAgICAgIGkgJiYgci5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsICEwKTtcbiAgICAgICAgICByLnRhYkluZGV4ID0gYztcbiAgICAgICAgICByLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIG5hbWU6IGksXG4gICAgICAgICAgICAgIGNoZWNrZWQ6IHJcbiAgICAgICAgICAgIH0gPSBlLnRhcmdldDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShpLCBuKSkgdC5zZXRWYWx1ZShlLmlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0LnNldFZhbHVlKG4sIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBlLmRlZmF1bHRGaWVsZFZhbHVlO1xuICAgICAgICAgICAgdC50YXJnZXQuY2hlY2tlZCA9IG51bGwgIT0gbiAmJiBuID09PSBlLmJ1dHRvblZhbHVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgaSA9IGUuYnV0dG9uVmFsdWU7XG4gICAgICAgICAgICByLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBlID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgciA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByID0gaSA9PT0gZS5kZXRhaWwudmFsdWU7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUoZS50YXJnZXQubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHIgJiYgaS5pZCA9PT0gbjtcbiAgICAgICAgICAgICAgICAgICAgaS5kb21FbGVtZW50ICYmIChpLmRvbUVsZW1lbnQuY2hlY2tlZCA9IGUpO1xuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGkuaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChyLCBlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMociwgW1tcImNoYW5nZVwiLCBcIlZhbGlkYXRlXCJdLCBbXCJjaGFuZ2VcIiwgXCJBY3Rpb25cIl0sIFtcImZvY3VzXCIsIFwiRm9jdXNcIl0sIFtcImJsdXJcIiwgXCJCbHVyXCJdLCBbXCJtb3VzZWRvd25cIiwgXCJNb3VzZSBEb3duXCJdLCBbXCJtb3VzZWVudGVyXCIsIFwiTW91c2UgRW50ZXJcIl0sIFtcIm1vdXNlbGVhdmVcIiwgXCJNb3VzZSBFeGl0XCJdLCBbXCJtb3VzZXVwXCIsIFwiTW91c2UgVXBcIl1dLCB0ID0+IHQudGFyZ2V0LmNoZWNrZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3Iocik7XG4gICAgICAgICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMocik7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgTGlua0Fubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogdC5kYXRhLmhhc0FwcGVhcmFuY2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHN1cGVyLnJlbmRlcigpO1xuICAgICAgICAgIHQuY2xhc3NMaXN0LmFkZChcImJ1dHRvbldpZGdldEFubm90YXRpb25cIiwgXCJwdXNoQnV0dG9uXCIpO1xuICAgICAgICAgIHRoaXMuZGF0YS5hbHRlcm5hdGl2ZVRleHQgJiYgKHQudGl0bGUgPSB0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0KTtcbiAgICAgICAgICBjb25zdCBlID0gdC5sYXN0Q2hpbGQ7XG4gICAgICAgICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zICYmIGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGUpO1xuICAgICAgICAgICAgZS5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwgdCA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveCh7fSwgdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiB0LnJlbmRlckZvcm1zXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjaG9pY2VXaWRnZXRBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgZSA9IHRoaXMuZGF0YS5pZCxcbiAgICAgICAgICAgIG4gPSB0LmdldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZGF0YS5maWVsZFZhbHVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO1xuICAgICAgICAgIGguYWRkKGkpO1xuICAgICAgICAgIGkuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGUpO1xuICAgICAgICAgIGkuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgICAgICAgdGhpcy5fc2V0UmVxdWlyZWQoaSwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICAgICAgICBpLm5hbWUgPSB0aGlzLmRhdGEuYmFzZUZpZWxkTmFtZSB8fCB0aGlzLmRhdGEuZmllbGROYW1lO1xuICAgICAgICAgIGkudGFiSW5kZXggPSBjO1xuICAgICAgICAgIGxldCByID0gdGhpcy5kYXRhLmNvbWJvICYmIHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aCA+IDA7XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuY29tYm8pIHtcbiAgICAgICAgICAgIGkuc2l6ZSA9IHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5tdWx0aVNlbGVjdCAmJiAoaS5tdWx0aXBsZSA9ICEwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaS5hZGRFdmVudExpc3RlbmVyKFwicmVzZXRmb3JtXCIsIHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBpLm9wdGlvbnMpIHQuc2VsZWN0ZWQgPSB0LnZhbHVlID09PSBlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmRhdGEub3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgICAgICBlLnRleHRDb250ZW50ID0gdC5kaXNwbGF5VmFsdWU7XG4gICAgICAgICAgICBlLnZhbHVlID0gdC5leHBvcnRWYWx1ZTtcbiAgICAgICAgICAgIGlmIChuLnZhbHVlLmluY2x1ZGVzKHQuZXhwb3J0VmFsdWUpKSB7XG4gICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgITApO1xuICAgICAgICAgICAgICByID0gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpLmFwcGVuZChlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHMgPSBudWxsO1xuICAgICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgICAgICAgIHQudmFsdWUgPSBcIiBcIjtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsICEwKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgITApO1xuICAgICAgICAgICAgaS5wcmVwZW5kKHQpO1xuICAgICAgICAgICAgcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgdC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgaS5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgcyk7XG4gICAgICAgICAgICAgIHMgPSBudWxsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGkuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBnZXRWYWx1ZSA9IHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQgPyBcInZhbHVlXCIgOiBcInRleHRDb250ZW50XCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBuLFxuICAgICAgICAgICAgICAgIG11bHRpcGxlOiByXG4gICAgICAgICAgICAgIH0gPSBpO1xuICAgICAgICAgICAgcmV0dXJuIHIgPyBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwgdCA9PiB0LnNlbGVjdGVkKS5tYXAodCA9PiB0W2VdKSA6IC0xID09PSBuLnNlbGVjdGVkSW5kZXggPyBudWxsIDogbltuLnNlbGVjdGVkSW5kZXhdW2VdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbGV0IGEgPSBnZXRWYWx1ZSghMSk7XG4gICAgICAgICAgY29uc3QgZ2V0SXRlbXMgPSB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldC5vcHRpb25zO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChlLCB0ID0+ICh7XG4gICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogdC50ZXh0Q29udGVudCxcbiAgICAgICAgICAgICAgZXhwb3J0VmFsdWU6IHQudmFsdWVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgICAgICAgaS5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwgbiA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHIgPSB7XG4gICAgICAgICAgICAgICAgdmFsdWUobikge1xuICAgICAgICAgICAgICAgICAgdmFyIF9zNTtcbiAgICAgICAgICAgICAgICAgIChfczUgPSBzKSA9PT0gbnVsbCB8fCBfczUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zNSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgciA9IG4uZGV0YWlsLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvID0gbmV3IFNldChBcnJheS5pc0FycmF5KHIpID8gciA6IFtyXSk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgaS5vcHRpb25zKSB0LnNlbGVjdGVkID0gby5oYXModC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKCEwKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBhID0gZ2V0VmFsdWUoITEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVTZWxlY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgaS5tdWx0aXBsZSA9ICEwO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVtb3ZlKG4pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBpLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIHMgPSBuLmRldGFpbC5yZW1vdmU7XG4gICAgICAgICAgICAgICAgICByW3NdLnNlbGVjdGVkID0gITE7XG4gICAgICAgICAgICAgICAgICBpLnJlbW92ZShzKTtcbiAgICAgICAgICAgICAgICAgIGlmIChyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLTEgPT09IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXguY2FsbChyLCB0ID0+IHQuc2VsZWN0ZWQpICYmIChyWzBdLnNlbGVjdGVkID0gITApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSghMCksXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhuKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBhID0gZ2V0VmFsdWUoITEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xlYXIobikge1xuICAgICAgICAgICAgICAgICAgZm9yICg7IDAgIT09IGkubGVuZ3RoOykgaS5yZW1vdmUoMCk7XG4gICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBhID0gZ2V0VmFsdWUoITEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5zZXJ0KG4pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbmRleDogcixcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWU6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgZXhwb3J0VmFsdWU6IG9cbiAgICAgICAgICAgICAgICAgICAgfSA9IG4uZGV0YWlsLmluc2VydCxcbiAgICAgICAgICAgICAgICAgICAgbCA9IGkuY2hpbGRyZW5bcl0sXG4gICAgICAgICAgICAgICAgICAgIGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgYy50ZXh0Q29udGVudCA9IHM7XG4gICAgICAgICAgICAgICAgICBjLnZhbHVlID0gbztcbiAgICAgICAgICAgICAgICAgIGwgPyBsLmJlZm9yZShjKSA6IGkuYXBwZW5kKGMpO1xuICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSghMCksXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhuKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBhID0gZ2V0VmFsdWUoITEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaXRlbXMobikge1xuICAgICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICBpdGVtczogclxuICAgICAgICAgICAgICAgICAgfSA9IG4uZGV0YWlsO1xuICAgICAgICAgICAgICAgICAgZm9yICg7IDAgIT09IGkubGVuZ3RoOykgaS5yZW1vdmUoMCk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWU6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRWYWx1ZTogblxuICAgICAgICAgICAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgICAgICAgICAgIHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICByLnRleHRDb250ZW50ID0gZTtcbiAgICAgICAgICAgICAgICAgICAgci52YWx1ZSA9IG47XG4gICAgICAgICAgICAgICAgICAgIGkuYXBwZW5kKHIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaS5vcHRpb25zLmxlbmd0aCA+IDAgJiYgKGkub3B0aW9uc1swXS5zZWxlY3RlZCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoZSwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUoITApLFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogZ2V0SXRlbXMobilcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgYSA9IGdldFZhbHVlKCExKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluZGljZXMobikge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IG5ldyBTZXQobi5kZXRhaWwuaW5kaWNlcyk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbi50YXJnZXQub3B0aW9ucykgdC5zZWxlY3RlZCA9IGkuaGFzKHQuaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSghMClcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgYSA9IGdldFZhbHVlKCExKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVkaXRhYmxlKHQpIHtcbiAgICAgICAgICAgICAgICAgIHQudGFyZ2V0LmRpc2FibGVkID0gIXQuZGV0YWlsLmVkaXRhYmxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KHIsIG4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBuID0+IHtcbiAgICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTEwO1xuICAgICAgICAgICAgICBjb25zdCBpID0gZ2V0VmFsdWUoITApO1xuICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAoX3RoaXMkbGlua1NlcnZpY2UkZXZlMTAgPSB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSA9PT0gbnVsbCB8fCBfdGhpcyRsaW5rU2VydmljZSRldmUxMCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlMTAuZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgICBpZDogZSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogYSxcbiAgICAgICAgICAgICAgICAgIGNoYW5nZUV4OiBpLFxuICAgICAgICAgICAgICAgICAgd2lsbENvbW1pdDogITEsXG4gICAgICAgICAgICAgICAgICBjb21taXRLZXk6IDEsXG4gICAgICAgICAgICAgICAgICBrZXlEb3duOiAhMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKGksIFtbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdLCBbXCJpbnB1dFwiLCBcIkFjdGlvblwiXSwgW1wiaW5wdXRcIiwgXCJWYWxpZGF0ZVwiXV0sIHQgPT4gdC50YXJnZXQudmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSghMClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGF0YS5jb21ibyAmJiB0aGlzLl9zZXRUZXh0U3R5bGUoaSk7XG4gICAgICAgICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKGkpO1xuICAgICAgICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGkpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX2UkdGl0bGVPYmosIF9lJGNvbnRlbnRzT2JqLCBfZSRyaWNoVGV4dDtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBkYXRhOiBlLFxuICAgICAgICAgICAgZWxlbWVudHM6IG5cbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKChfZSR0aXRsZU9iaiA9IGUudGl0bGVPYmopICE9PSBudWxsICYmIF9lJHRpdGxlT2JqICE9PSB2b2lkIDAgJiYgX2UkdGl0bGVPYmouc3RyIHx8IChfZSRjb250ZW50c09iaiA9IGUuY29udGVudHNPYmopICE9PSBudWxsICYmIF9lJGNvbnRlbnRzT2JqICE9PSB2b2lkIDAgJiYgX2UkY29udGVudHNPYmouc3RyIHx8IChfZSRyaWNoVGV4dCA9IGUucmljaFRleHQpICE9PSBudWxsICYmIF9lJHJpY2hUZXh0ICE9PSB2b2lkIDAgJiYgX2UkcmljaFRleHQuc3RyKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZWxlbWVudHMgPSBuO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwicG9wdXBBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgUG9wdXBFbGVtZW50KHtcbiAgICAgICAgICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgICAgICAgY29sb3I6IHRoaXMuZGF0YS5jb2xvcixcbiAgICAgICAgICAgICAgdGl0bGVPYmo6IHRoaXMuZGF0YS50aXRsZU9iaixcbiAgICAgICAgICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUsXG4gICAgICAgICAgICAgIGNvbnRlbnRzT2JqOiB0aGlzLmRhdGEuY29udGVudHNPYmosXG4gICAgICAgICAgICAgIHJpY2hUZXh0OiB0aGlzLmRhdGEucmljaFRleHQsXG4gICAgICAgICAgICAgIHJlY3Q6IHRoaXMuZGF0YS5yZWN0LFxuICAgICAgICAgICAgICBwYXJlbnRSZWN0OiB0aGlzLmRhdGEucGFyZW50UmVjdCB8fCBudWxsLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgICAgICAgICBlbGVtZW50czogdGhpcy5lbGVtZW50cyxcbiAgICAgICAgICAgICAgb3BlbjogdGhpcy5kYXRhLm9wZW5cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICBuLnBvcHVwID0gdDtcbiAgICAgICAgICAgIGUucHVzaChuLmRhdGEuaWQpO1xuICAgICAgICAgICAgbi5hZGRIaWdobGlnaHRBcmVhKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIiwgZS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX05lID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0JlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1VlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0hlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1NlMiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9idDIgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfV2UgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfR2UgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfVmUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfJGUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWGUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfS2UgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfSmUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfUWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWmUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfcWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfemUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfamUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIFBvcHVwRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX2plKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3plKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3FlKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfTmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfQmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2plLCBfamUyKS5iaW5kKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1VlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96ZSwgX3plMikuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9IZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcWUsIF9xZTIpLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfU2UyLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2J0Miwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9XZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9HZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9WZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF8kZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9YZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfS2UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfWWUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfSmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfUWUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfWmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogZSxcbiAgICAgICAgICAgIGNvbG9yOiBuLFxuICAgICAgICAgICAgZWxlbWVudHM6IGksXG4gICAgICAgICAgICB0aXRsZU9iajogcyxcbiAgICAgICAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IGEsXG4gICAgICAgICAgICBjb250ZW50c09iajogbyxcbiAgICAgICAgICAgIHJpY2hUZXh0OiBsLFxuICAgICAgICAgICAgcGFyZW50OiBjLFxuICAgICAgICAgICAgcmVjdDogaCxcbiAgICAgICAgICAgIHBhcmVudFJlY3Q6IGQsXG4gICAgICAgICAgICBvcGVuOiB1XG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9idDIsIGUpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfUWUsIHMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfV2UsIG8pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfSmUsIGwpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfVmUsIGMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfU2UyLCBuKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1llLCBoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgXyRlLCBkKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0dlLCBpKTtcbiAgICAgICAgICBjb25zdCBwID0gci5QREZEYXRlU3RyaW5nLnRvRGF0ZU9iamVjdChhKTtcbiAgICAgICAgICBwICYmIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfTmUsIGMubDEwbi5nZXQoXCJhbm5vdGF0aW9uX2RhdGVfc3RyaW5nXCIsIHtcbiAgICAgICAgICAgIGRhdGU6IHAudG9Mb2NhbGVEYXRlU3RyaW5nKCksXG4gICAgICAgICAgICB0aW1lOiBwLnRvTG9jYWxlVGltZVN0cmluZygpXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHRoaXMudHJpZ2dlciA9IGkuZmxhdE1hcCh0ID0+IHQuZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy50cmlnZ2VyKSB7XG4gICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0hlKSk7XG4gICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVWUpKTtcbiAgICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9CZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuaGlkZGVuID0gITA7XG4gICAgICAgICAgdSAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9xZSwgX3FlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfS2UpKSByZXR1cm47XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgICAgICAgdmlldzogdFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgICAgIHJhd0RpbXM6IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VXaWR0aDogZSxcbiAgICAgICAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IG4sXG4gICAgICAgICAgICAgICAgICBwYWdlWDogcixcbiAgICAgICAgICAgICAgICAgIHBhZ2VZOiBzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WZSksXG4gICAgICAgICAgICBhID0gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9LZSwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgYS5jbGFzc05hbWUgPSBcInBvcHVwXCI7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfU2UyKSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGEuc3R5bGUub3V0bGluZUNvbG9yID0gaS5VdGlsLm1ha2VIZXhDb2xvciguLi5fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1NlMikpO1xuICAgICAgICAgICAgaWYgKENTUy5zdXBwb3J0cyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJjb2xvci1taXgoaW4gc3JnYiwgcmVkIDMwJSwgd2hpdGUpXCIpKSBhLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiY29sb3ItbWl4KGluIHNyZ2IsIFwiLmNvbmNhdCh0LCBcIiAzMCUsIHdoaXRlKVwiKTtlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IC43O1xuICAgICAgICAgICAgICBhLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGkuVXRpbC5tYWtlSGV4Q29sb3IoLi4uX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9TZTIpLm1hcChlID0+IE1hdGguZmxvb3IodCAqICgyNTUgLSBlKSArIGUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgICBvLmNsYXNzTmFtZSA9IFwiaGVhZGVyXCI7XG4gICAgICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoMVwiKTtcbiAgICAgICAgICBvLmFwcGVuZChjKTtcbiAgICAgICAgICAoe1xuICAgICAgICAgICAgZGlyOiBjLmRpcixcbiAgICAgICAgICAgIHN0cjogYy50ZXh0Q29udGVudFxuICAgICAgICAgIH0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1FlKSk7XG4gICAgICAgICAgYS5hcHBlbmQobyk7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTmUpKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgICB0LmNsYXNzTGlzdC5hZGQoXCJwb3B1cERhdGVcIik7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX05lKS50aGVuKGUgPT4ge1xuICAgICAgICAgICAgICB0LnRleHRDb250ZW50ID0gZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgby5hcHBlbmQodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGggPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1dlKSxcbiAgICAgICAgICAgIGQgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0plKTtcbiAgICAgICAgICBpZiAoIShkICE9PSBudWxsICYmIGQgIT09IHZvaWQgMCAmJiBkLnN0cikgfHwgaCAhPT0gbnVsbCAmJiBoICE9PSB2b2lkIDAgJiYgaC5zdHIgJiYgaC5zdHIgIT09IGQuc3RyKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fZm9ybWF0Q29udGVudHMoaCk7XG4gICAgICAgICAgICBhLmFwcGVuZCh0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbC5YZmFMYXllci5yZW5kZXIoe1xuICAgICAgICAgICAgICB4ZmFIdG1sOiBkLmh0bWwsXG4gICAgICAgICAgICAgIGludGVudDogXCJyaWNoVGV4dFwiLFxuICAgICAgICAgICAgICBkaXY6IGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYS5sYXN0Q2hpbGQuY2xhc3NMaXN0LmFkZChcInJpY2hUZXh0XCIsIFwicG9wdXBDb250ZW50XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgdSA9ICEhX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF8kZSksXG4gICAgICAgICAgICBwID0gdSA/IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfJGUpIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZZSk7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfR2UpKSBpZiAoIXAgfHwgbnVsbCAhPT0gaS5VdGlsLmludGVyc2VjdCh0LmRhdGEucmVjdCwgcCkpIHtcbiAgICAgICAgICAgIHAgPSB0LmRhdGEucmVjdDtcbiAgICAgICAgICAgIHUgPSAhMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmID0gaS5VdGlsLm5vcm1hbGl6ZVJlY3QoW3BbMF0sIHRbM10gLSBwWzFdICsgdFsxXSwgcFsyXSwgdFszXSAtIHBbM10gKyB0WzFdXSksXG4gICAgICAgICAgICBnID0gdSA/IHBbMl0gLSBwWzBdICsgNSA6IDAsXG4gICAgICAgICAgICBtID0gZlswXSArIGcsXG4gICAgICAgICAgICBiID0gZlsxXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3R5bGU6IHZcbiAgICAgICAgICAgIH0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0Mik7XG4gICAgICAgICAgdi5sZWZ0ID0gMTAwICogKG0gLSByKSAvIGUgKyBcIiVcIjtcbiAgICAgICAgICB2LnRvcCA9IDEwMCAqIChiIC0gcykgLyBuICsgXCIlXCI7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmFwcGVuZChhKTtcbiAgICAgICAgfVxuICAgICAgICBfZm9ybWF0Q29udGVudHModCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBzdHI6IGUsXG4gICAgICAgICAgICBkaXI6IG5cbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBjb25zdCBpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgICAgaS5jbGFzc0xpc3QuYWRkKFwicG9wdXBDb250ZW50XCIpO1xuICAgICAgICAgIGkuZGlyID0gbjtcbiAgICAgICAgICBjb25zdCByID0gZS5zcGxpdCgvKD86XFxyXFxuP3xcXG4pLyk7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IDAsIGUgPSByLmxlbmd0aDsgdCA8IGU7ICsrdCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHJbdF07XG4gICAgICAgICAgICBpLmFwcGVuZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuKSk7XG4gICAgICAgICAgICB0IDwgZSAtIDEgJiYgaS5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yY2VIaWRlKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWmUsIHRoaXMuaXNWaXNpYmxlKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1plKSAmJiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmhpZGRlbiA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgICBtYXliZVNob3coKSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWmUpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1plLCAhMSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuaGlkZGVuID0gITE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBpc1Zpc2libGUoKSB7XG4gICAgICAgICAgcmV0dXJuICExID09PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuaGlkZGVuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfcWUyKCkge1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1hlLCAhX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9YZSkpO1xuICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9YZSkpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96ZSwgX3plMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qZSwgX2plMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3plMigpIHtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9LZSkgfHwgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1hlKSAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuY2xhc3NMaXN0LmFkZChcImZvY3VzZWRcIik7ZWxzZSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmhpZGRlbiA9ICExO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYnQyKS5zdHlsZS56SW5kZXggPSBwYXJzZUludChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0Mikuc3R5bGUuekluZGV4KSArIDFlMztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2plMigpIHtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmNsYXNzTGlzdC5yZW1vdmUoXCJmb2N1c2VkXCIpO1xuICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWGUpICYmIHRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmhpZGRlbiA9ICEwO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYnQyKS5zdHlsZS56SW5kZXggPSBwYXJzZUludChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0Mikuc3R5bGUuekluZGV4KSAtIDFlMztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqMiwgX3QkZGF0YSRjb250ZW50c09iajIsIF90JGRhdGEkcmljaFRleHQyO1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqMiA9IHQuZGF0YS50aXRsZU9iaikgIT09IG51bGwgJiYgX3QkZGF0YSR0aXRsZU9iajIgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqMi5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmoyID0gdC5kYXRhLmNvbnRlbnRzT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqMiAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmoyLnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dDIgPSB0LmRhdGEucmljaFRleHQpICE9PSBudWxsICYmIF90JGRhdGEkcmljaFRleHQyICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDIuc3RyKSxcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdC5kYXRhLnRleHRDb250ZW50O1xuICAgICAgICAgIHRoaXMudGV4dFBvc2l0aW9uID0gdC5kYXRhLnRleHRQb3NpdGlvbjtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25FZGl0b3JUeXBlID0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVDtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImZyZWVUZXh0QW5ub3RhdGlvblwiKTtcbiAgICAgICAgICBpZiAodGhpcy50ZXh0Q29udGVudCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0LmNsYXNzTGlzdC5hZGQoXCJhbm5vdGF0aW9uVGV4dENvbnRlbnRcIik7XG4gICAgICAgICAgICB0LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJjb21tZW50XCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMudGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gZTtcbiAgICAgICAgICAgICAgdC5hcHBlbmQobik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiB8fCB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgICAgIHRoaXMuX2VkaXRPbkRvdWJsZUNsaWNrKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLkZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQgPSBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50O1xuICAgICAgdmFyIF90biA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgTGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIF90JGRhdGEkdGl0bGVPYmozLCBfdCRkYXRhJGNvbnRlbnRzT2JqMywgX3QkZGF0YSRyaWNoVGV4dDM7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiAhISh0LmRhdGEucG9wdXBSZWYgfHwgKF90JGRhdGEkdGl0bGVPYmozID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqMyAhPT0gdm9pZCAwICYmIF90JGRhdGEkdGl0bGVPYmozLnN0ciB8fCAoX3QkZGF0YSRjb250ZW50c09iajMgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmozICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRjb250ZW50c09iajMuc3RyIHx8IChfdCRkYXRhJHJpY2hUZXh0MyA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDMgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHJpY2hUZXh0My5zdHIpLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF90biwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibGluZUFubm90YXRpb25cIik7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuZGF0YSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd2lkdGg6IGUsXG4gICAgICAgICAgICAgIGhlaWdodDogblxuICAgICAgICAgICAgfSA9IGdldFJlY3REaW1zKHQucmVjdCksXG4gICAgICAgICAgICBpID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZShlLCBuLCAhMCksXG4gICAgICAgICAgICByID0gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF90biwgdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6bGluZVwiKSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJ4MVwiLCB0LnJlY3RbMl0gLSB0LmxpbmVDb29yZGluYXRlc1swXSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJ5MVwiLCB0LnJlY3RbM10gLSB0LmxpbmVDb29yZGluYXRlc1sxXSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJ4MlwiLCB0LnJlY3RbMl0gLSB0LmxpbmVDb29yZGluYXRlc1syXSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJ5MlwiLCB0LnJlY3RbM10gLSB0LmxpbmVDb29yZGluYXRlc1szXSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgdC5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICAgICAgICByLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIHIuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIGkuYXBwZW5kKHIpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICB0LnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdG4pO1xuICAgICAgICB9XG4gICAgICAgIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfZW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNsYXNzIFNxdWFyZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIF90JGRhdGEkdGl0bGVPYmo0LCBfdCRkYXRhJGNvbnRlbnRzT2JqNCwgX3QkZGF0YSRyaWNoVGV4dDQ7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiAhISh0LmRhdGEucG9wdXBSZWYgfHwgKF90JGRhdGEkdGl0bGVPYmo0ID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqNCAhPT0gdm9pZCAwICYmIF90JGRhdGEkdGl0bGVPYmo0LnN0ciB8fCAoX3QkZGF0YSRjb250ZW50c09iajQgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmo0ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRjb250ZW50c09iajQuc3RyIHx8IChfdCRkYXRhJHJpY2hUZXh0NCA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDQgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHJpY2hUZXh0NC5zdHIpLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9lbiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3F1YXJlQW5ub3RhdGlvblwiKTtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5kYXRhLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3aWR0aDogZSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICB9ID0gZ2V0UmVjdERpbXModC5yZWN0KSxcbiAgICAgICAgICAgIGkgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKGUsIG4sICEwKSxcbiAgICAgICAgICAgIHIgPSB0LmJvcmRlclN0eWxlLndpZHRoLFxuICAgICAgICAgICAgcyA9IF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfZW4sIHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIikpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwieFwiLCByIC8gMik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJ5XCIsIHIgLyAyKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGUgLSByKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBuIC0gcik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgciB8fCAxKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIGkuYXBwZW5kKHMpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICB0LnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZW4pO1xuICAgICAgICB9XG4gICAgICAgIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfbm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNsYXNzIENpcmNsZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIF90JGRhdGEkdGl0bGVPYmo1LCBfdCRkYXRhJGNvbnRlbnRzT2JqNSwgX3QkZGF0YSRyaWNoVGV4dDU7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiAhISh0LmRhdGEucG9wdXBSZWYgfHwgKF90JGRhdGEkdGl0bGVPYmo1ID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqNSAhPT0gdm9pZCAwICYmIF90JGRhdGEkdGl0bGVPYmo1LnN0ciB8fCAoX3QkZGF0YSRjb250ZW50c09iajUgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmo1ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRjb250ZW50c09iajUuc3RyIHx8IChfdCRkYXRhJHJpY2hUZXh0NSA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDUgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHJpY2hUZXh0NS5zdHIpLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9ubiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY2lyY2xlQW5ub3RhdGlvblwiKTtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5kYXRhLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3aWR0aDogZSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICB9ID0gZ2V0UmVjdERpbXModC5yZWN0KSxcbiAgICAgICAgICAgIGkgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKGUsIG4sICEwKSxcbiAgICAgICAgICAgIHIgPSB0LmJvcmRlclN0eWxlLndpZHRoLFxuICAgICAgICAgICAgcyA9IF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbm4sIHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmVsbGlwc2VcIikpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiY3hcIiwgZSAvIDIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiY3lcIiwgbiAvIDIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwicnhcIiwgZSAvIDIgLSByIC8gMik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJyeVwiLCBuIC8gMiAtIHIgLyAyKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCByIHx8IDEpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICAgICAgaS5hcHBlbmQocyk7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGkpO1xuICAgICAgICAgIHQucG9wdXBSZWYgfHwgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ubik7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIF9pbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqNiwgX3QkZGF0YSRjb250ZW50c09iajYsIF90JGRhdGEkcmljaFRleHQ2O1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqNiA9IHQuZGF0YS50aXRsZU9iaikgIT09IG51bGwgJiYgX3QkZGF0YSR0aXRsZU9iajYgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqNi5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmo2ID0gdC5kYXRhLmNvbnRlbnRzT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqNiAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmo2LnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dDYgPSB0LmRhdGEucmljaFRleHQpICE9PSBudWxsICYmIF90JGRhdGEkcmljaFRleHQ2ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDYuc3RyKSxcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwicG9seWxpbmVBbm5vdGF0aW9uXCI7XG4gICAgICAgICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9IFwic3ZnOnBvbHlsaW5lXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5jb250YWluZXJDbGFzc05hbWUpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgICAgICBoZWlnaHQ6IG5cbiAgICAgICAgICAgIH0gPSBnZXRSZWN0RGltcyh0LnJlY3QpLFxuICAgICAgICAgICAgaSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUoZSwgbiwgITApO1xuICAgICAgICAgIGxldCByID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQudmVydGljZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBlLnggLSB0LnJlY3RbMF0sXG4gICAgICAgICAgICAgIGkgPSB0LnJlY3RbM10gLSBlLnk7XG4gICAgICAgICAgICByLnB1c2gobiArIFwiLFwiICsgaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHIgPSByLmpvaW4oXCIgXCIpO1xuICAgICAgICAgIGNvbnN0IHMgPSBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2luLCB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKSk7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJwb2ludHNcIiwgcik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgdC5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIGkuYXBwZW5kKHMpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICB0LnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKHMsIHQpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgICBnZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2luKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGFzcyBQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gXCJwb2x5Z29uQW5ub3RhdGlvblwiO1xuICAgICAgICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5Z29uXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIENhcmV0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX3QkZGF0YSR0aXRsZU9iajcsIF90JGRhdGEkY29udGVudHNPYmo3LCBfdCRkYXRhJHJpY2hUZXh0NztcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKHQuZGF0YS5wb3B1cFJlZiB8fCAoX3QkZGF0YSR0aXRsZU9iajcgPSB0LmRhdGEudGl0bGVPYmopICE9PSBudWxsICYmIF90JGRhdGEkdGl0bGVPYmo3ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSR0aXRsZU9iajcuc3RyIHx8IChfdCRkYXRhJGNvbnRlbnRzT2JqNyA9IHQuZGF0YS5jb250ZW50c09iaikgIT09IG51bGwgJiYgX3QkZGF0YSRjb250ZW50c09iajcgIT09IHZvaWQgMCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqNy5zdHIgfHwgKF90JGRhdGEkcmljaFRleHQ3ID0gdC5kYXRhLnJpY2hUZXh0KSAhPT0gbnVsbCAmJiBfdCRkYXRhJHJpY2hUZXh0NyAhPT0gdm9pZCAwICYmIF90JGRhdGEkcmljaFRleHQ3LnN0ciksXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjYXJldEFubm90YXRpb25cIik7XG4gICAgICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX3JuID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICBjbGFzcyBJbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqOCwgX3QkZGF0YSRjb250ZW50c09iajgsIF90JGRhdGEkcmljaFRleHQ4O1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqOCA9IHQuZGF0YS50aXRsZU9iaikgIT09IG51bGwgJiYgX3QkZGF0YSR0aXRsZU9iajggIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqOC5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmo4ID0gdC5kYXRhLmNvbnRlbnRzT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqOCAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmo4LnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dDggPSB0LmRhdGEucmljaFRleHQpICE9PSBudWxsICYmIF90JGRhdGEkcmljaFRleHQ4ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDguc3RyKSxcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfcm4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IFtdXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcImlua0Fubm90YXRpb25cIjtcbiAgICAgICAgICB0aGlzLnN2Z0VsZW1lbnROYW1lID0gXCJzdmc6cG9seWxpbmVcIjtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25FZGl0b3JUeXBlID0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5jb250YWluZXJDbGFzc05hbWUpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgICAgICBoZWlnaHQ6IG5cbiAgICAgICAgICAgIH0gPSBnZXRSZWN0RGltcyh0LnJlY3QpLFxuICAgICAgICAgICAgaSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUoZSwgbiwgITApO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0Lmlua0xpc3RzKSB7XG4gICAgICAgICAgICBsZXQgbiA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IGkueCAtIHQucmVjdFswXSxcbiAgICAgICAgICAgICAgICByID0gdC5yZWN0WzNdIC0gaS55O1xuICAgICAgICAgICAgICBuLnB1c2goXCJcIi5jb25jYXQoZSwgXCIsXCIpLmNvbmNhdChyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuID0gbi5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcm4pLnB1c2gocik7XG4gICAgICAgICAgICByLnNldEF0dHJpYnV0ZShcInBvaW50c1wiLCBuKTtcbiAgICAgICAgICAgIHIuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIHQuYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7XG4gICAgICAgICAgICByLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICAgICAgICB0LnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKHIsIHQpO1xuICAgICAgICAgICAgaS5hcHBlbmQocik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ybik7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5JbmtBbm5vdGF0aW9uRWxlbWVudCA9IElua0Fubm90YXRpb25FbGVtZW50O1xuICAgICAgY2xhc3MgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX3QkZGF0YSR0aXRsZU9iajksIF90JGRhdGEkY29udGVudHNPYmo5LCBfdCRkYXRhJHJpY2hUZXh0OTtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKHQuZGF0YS5wb3B1cFJlZiB8fCAoX3QkZGF0YSR0aXRsZU9iajkgPSB0LmRhdGEudGl0bGVPYmopICE9PSBudWxsICYmIF90JGRhdGEkdGl0bGVPYmo5ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSR0aXRsZU9iajkuc3RyIHx8IChfdCRkYXRhJGNvbnRlbnRzT2JqOSA9IHQuZGF0YS5jb250ZW50c09iaikgIT09IG51bGwgJiYgX3QkZGF0YSRjb250ZW50c09iajkgIT09IHZvaWQgMCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqOS5zdHIgfHwgKF90JGRhdGEkcmljaFRleHQ5ID0gdC5kYXRhLnJpY2hUZXh0KSAhPT0gbnVsbCAmJiBfdCRkYXRhJHJpY2hUZXh0OSAhPT0gdm9pZCAwICYmIF90JGRhdGEkcmljaFRleHQ5LnN0ciksXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEwLFxuICAgICAgICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiB8fCB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX3QkZGF0YSR0aXRsZU9iajEwLCBfdCRkYXRhJGNvbnRlbnRzT2JqMTAsIF90JGRhdGEkcmljaFRleHQxMDtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKHQuZGF0YS5wb3B1cFJlZiB8fCAoX3QkZGF0YSR0aXRsZU9iajEwID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqMTAgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqMTAuc3RyIHx8IChfdCRkYXRhJGNvbnRlbnRzT2JqMTAgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmoxMCAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmoxMC5zdHIgfHwgKF90JGRhdGEkcmljaFRleHQxMCA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDEwICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDEwLnN0ciksXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEwLFxuICAgICAgICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiB8fCB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ1bmRlcmxpbmVBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqMTEsIF90JGRhdGEkY29udGVudHNPYmoxMSwgX3QkZGF0YSRyaWNoVGV4dDExO1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqMTEgPSB0LmRhdGEudGl0bGVPYmopICE9PSBudWxsICYmIF90JGRhdGEkdGl0bGVPYmoxMSAhPT0gdm9pZCAwICYmIF90JGRhdGEkdGl0bGVPYmoxMS5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmoxMSA9IHQuZGF0YS5jb250ZW50c09iaikgIT09IG51bGwgJiYgX3QkZGF0YSRjb250ZW50c09iajExICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRjb250ZW50c09iajExLnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dDExID0gdC5kYXRhLnJpY2hUZXh0KSAhPT0gbnVsbCAmJiBfdCRkYXRhJHJpY2hUZXh0MTEgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHJpY2hUZXh0MTEuc3RyKSxcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogITAsXG4gICAgICAgICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInNxdWlnZ2x5QW5ub3RhdGlvblwiKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIF90JGRhdGEkdGl0bGVPYmoxMiwgX3QkZGF0YSRjb250ZW50c09iajEyLCBfdCRkYXRhJHJpY2hUZXh0MTI7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiAhISh0LmRhdGEucG9wdXBSZWYgfHwgKF90JGRhdGEkdGl0bGVPYmoxMiA9IHQuZGF0YS50aXRsZU9iaikgIT09IG51bGwgJiYgX3QkZGF0YSR0aXRsZU9iajEyICE9PSB2b2lkIDAgJiYgX3QkZGF0YSR0aXRsZU9iajEyLnN0ciB8fCAoX3QkZGF0YSRjb250ZW50c09iajEyID0gdC5kYXRhLmNvbnRlbnRzT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqMTIgIT09IHZvaWQgMCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqMTIuc3RyIHx8IChfdCRkYXRhJHJpY2hUZXh0MTIgPSB0LmRhdGEucmljaFRleHQpICE9PSBudWxsICYmIF90JGRhdGEkcmljaFRleHQxMiAhPT0gdm9pZCAwICYmIF90JGRhdGEkcmljaFRleHQxMi5zdHIpLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiAhMCxcbiAgICAgICAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmRhdGEucG9wdXBSZWYgfHwgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3RyaWtlb3V0QW5ub3RhdGlvblwiKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX3QkZGF0YSR0aXRsZU9iajEzLCBfdCRkYXRhJGNvbnRlbnRzT2JqMTMsIF90JGRhdGEkcmljaFRleHQxMztcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKHQuZGF0YS5wb3B1cFJlZiB8fCAoX3QkZGF0YSR0aXRsZU9iajEzID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqMTMgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqMTMuc3RyIHx8IChfdCRkYXRhJGNvbnRlbnRzT2JqMTMgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmoxMyAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmoxMy5zdHIgfHwgKF90JGRhdGEkcmljaFRleHQxMyA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDEzICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDEzLnN0ciksXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzdGFtcEFubm90YXRpb25cIik7XG4gICAgICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLlN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgPSBTdGFtcEFubm90YXRpb25FbGVtZW50O1xuICAgICAgdmFyIF9zbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdGhpcyRsaW5rU2VydmljZSRldmUxMTtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3NuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZmlsZW5hbWU6IGUsXG4gICAgICAgICAgICBjb250ZW50OiBuXG4gICAgICAgICAgfSA9IHRoaXMuZGF0YS5maWxlO1xuICAgICAgICAgIHRoaXMuZmlsZW5hbWUgPSAoMCwgci5nZXRGaWxlbmFtZUZyb21VcmwpKGUsICEwKTtcbiAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBuO1xuICAgICAgICAgIChfdGhpcyRsaW5rU2VydmljZSRldmUxMSA9IHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpID09PSBudWxsIHx8IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTExID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRsaW5rU2VydmljZSRldmUxMS5kaXNwYXRjaChcImZpbGVhdHRhY2htZW50YW5ub3RhdGlvblwiLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICBmaWxlbmFtZTogZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJGRhdGEkdGl0bGVPYmosIF90aGlzJGRhdGEkY29udGVudHNPYjtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIGxldCB0O1xuICAgICAgICAgIGlmICh0aGlzLmRhdGEuaGFzQXBwZWFyYW5jZSkgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZWxzZSB7XG4gICAgICAgICAgICB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgICAgICAgIHQuc3JjID0gXCJcIi5jb25jYXQodGhpcy5pbWFnZVJlc291cmNlc1BhdGgsIFwiYW5ub3RhdGlvbi1cIikuY29uY2F0KC9wYXBlcmNsaXAvaS50ZXN0KHRoaXMuZGF0YS5uYW1lKSA/IFwicGFwZXJjbGlwXCIgOiBcInB1c2hwaW5cIiwgXCIuc3ZnXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0LmNsYXNzTGlzdC5hZGQoXCJwb3B1cFRyaWdnZXJBcmVhXCIpO1xuICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihcImRibGNsaWNrXCIsIHRoaXMuX2Rvd25sb2FkLmJpbmQodGhpcykpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfc24sIHQpO1xuICAgICAgICAgICF0aGlzLmRhdGEucG9wdXBSZWYgJiYgKCgoX3RoaXMkZGF0YSR0aXRsZU9iaiA9IHRoaXMuZGF0YS50aXRsZU9iaikgPT09IG51bGwgfHwgX3RoaXMkZGF0YSR0aXRsZU9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZGF0YSR0aXRsZU9iai5zdHIpIHx8ICgoX3RoaXMkZGF0YSRjb250ZW50c09iID0gdGhpcy5kYXRhLmNvbnRlbnRzT2JqKSA9PT0gbnVsbCB8fCBfdGhpcyRkYXRhJGNvbnRlbnRzT2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRhdGEkY29udGVudHNPYi5zdHIpIHx8IHRoaXMuZGF0YS5yaWNoVGV4dCkgJiYgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQodCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfc24pO1xuICAgICAgICB9XG4gICAgICAgIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICAgIH1cbiAgICAgICAgX2Rvd25sb2FkKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRkb3dubG9hZE1hbmFnZXIyO1xuICAgICAgICAgIChfdGhpcyRkb3dubG9hZE1hbmFnZXIyID0gdGhpcy5kb3dubG9hZE1hbmFnZXIpID09PSBudWxsIHx8IF90aGlzJGRvd25sb2FkTWFuYWdlcjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRvd25sb2FkTWFuYWdlcjIub3Blbk9yRG93bmxvYWREYXRhKHRoaXMuY29udGFpbmVyLCB0aGlzLmNvbnRlbnQsIHRoaXMuZmlsZW5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLkFubm90YXRpb25MYXllciA9IChfcmUyID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIF9hbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpLCBfb24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKSwgX2xuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCksIF9jbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpLCBjbGFzcyBBbm5vdGF0aW9uTGF5ZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDE2KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9jbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9sbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3JlMiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9hbiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9vbiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3IE1hcCgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGRpdjogX2UxNCxcbiAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlNYW5hZ2VyOiBfbjgsXG4gICAgICAgICAgICBhbm5vdGF0aW9uQ2FudmFzTWFwOiBfaTUsXG4gICAgICAgICAgICBsMTBuOiBfcjUsXG4gICAgICAgICAgICBwYWdlOiBzLFxuICAgICAgICAgICAgdmlld3BvcnQ6IGFcbiAgICAgICAgICB9ID0gX3QxNjtcbiAgICAgICAgICB0aGlzLmRpdiA9IF9lMTQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9yZTIsIF9uOCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9hbiwgX2k1KTtcbiAgICAgICAgICB0aGlzLmwxMG4gPSBfcjU7XG4gICAgICAgICAgdGhpcy5wYWdlID0gcztcbiAgICAgICAgICB0aGlzLnZpZXdwb3J0ID0gYTtcbiAgICAgICAgICB0aGlzLnpJbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5sMTBuIHx8ICh0aGlzLmwxMG4gPSBvLk51bGxMMTBuKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZW5kZXIodCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IGVcbiAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgbiA9IHRoaXMuZGl2O1xuICAgICAgICAgICgwLCByLnNldExheWVyRGltZW5zaW9ucykobiwgdGhpcy52aWV3cG9ydCk7XG4gICAgICAgICAgY29uc3QgYSA9IG5ldyBNYXAoKSxcbiAgICAgICAgICAgIG8gPSB7XG4gICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgIGxheWVyOiBuLFxuICAgICAgICAgICAgICBsaW5rU2VydmljZTogdC5saW5rU2VydmljZSxcbiAgICAgICAgICAgICAgZG93bmxvYWRNYW5hZ2VyOiB0LmRvd25sb2FkTWFuYWdlcixcbiAgICAgICAgICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoOiB0LmltYWdlUmVzb3VyY2VzUGF0aCB8fCBcIlwiLFxuICAgICAgICAgICAgICByZW5kZXJGb3JtczogITEgIT09IHQucmVuZGVyRm9ybXMsXG4gICAgICAgICAgICAgIHN2Z0ZhY3Rvcnk6IG5ldyByLkRPTVNWR0ZhY3RvcnkoKSxcbiAgICAgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IHQuYW5ub3RhdGlvblN0b3JhZ2UgfHwgbmV3IHMuQW5ub3RhdGlvblN0b3JhZ2UoKSxcbiAgICAgICAgICAgICAgZW5hYmxlU2NyaXB0aW5nOiAhMCA9PT0gdC5lbmFibGVTY3JpcHRpbmcsXG4gICAgICAgICAgICAgIGhhc0pTQWN0aW9uczogdC5oYXNKU0FjdGlvbnMsXG4gICAgICAgICAgICAgIGZpZWxkT2JqZWN0czogdC5maWVsZE9iamVjdHMsXG4gICAgICAgICAgICAgIHBhcmVudDogdGhpcyxcbiAgICAgICAgICAgICAgZWxlbWVudHM6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHtcbiAgICAgICAgICAgIGlmICh0Lm5vSFRNTCkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5hbm5vdGF0aW9uVHlwZSA9PT0gaS5Bbm5vdGF0aW9uVHlwZS5QT1BVUDtcbiAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBhLmdldCh0LmlkKTtcbiAgICAgICAgICAgICAgaWYgKCFlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgby5lbGVtZW50cyA9IGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGUsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICAgIH0gPSBnZXRSZWN0RGltcyh0LnJlY3QpO1xuICAgICAgICAgICAgICBpZiAoZSA8PSAwIHx8IG4gPD0gMCkgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvLmRhdGEgPSB0O1xuICAgICAgICAgICAgY29uc3QgbiA9IEFubm90YXRpb25FbGVtZW50RmFjdG9yeS5jcmVhdGUobyk7XG4gICAgICAgICAgICBpZiAoIW4uaXNSZW5kZXJhYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZSAmJiB0LnBvcHVwUmVmKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBhLmdldCh0LnBvcHVwUmVmKTtcbiAgICAgICAgICAgICAgZSA/IGUucHVzaChuKSA6IGEuc2V0KHQucG9wdXBSZWYsIFtuXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuLmFubm90YXRpb25FZGl0b3JUeXBlID4gMCAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX29uKS5zZXQobi5kYXRhLmlkLCBuKTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBuLnJlbmRlcigpO1xuICAgICAgICAgICAgdC5oaWRkZW4gJiYgKHIuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCIpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfbG4sIF9sbjIpLmNhbGwodGhpcywgciwgdC5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2NuLCBfY24yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIGF3YWl0IHRoaXMubDEwbi50cmFuc2xhdGUobik7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdmlld3BvcnQ6IGVcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5kaXY7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydCA9IGU7XG4gICAgICAgICAgKDAsIHIuc2V0TGF5ZXJEaW1lbnNpb25zKShuLCB7XG4gICAgICAgICAgICByb3RhdGlvbjogZS5yb3RhdGlvblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2NuLCBfY24yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIG4uaGlkZGVuID0gITE7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpIHtcbiAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX29uKS52YWx1ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdGFibGVBbm5vdGF0aW9uKHQpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9vbikuZ2V0KHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZ1bmN0aW9uIF9sbjIodCwgZSkge1xuICAgICAgICB2YXIgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTQ7XG4gICAgICAgIGNvbnN0IG4gPSB0LmZpcnN0Q2hpbGQgfHwgdDtcbiAgICAgICAgbi5pZCA9IFwiXCIuY29uY2F0KHIuQW5ub3RhdGlvblByZWZpeCkuY29uY2F0KGUpO1xuICAgICAgICB0aGlzLmRpdi5hcHBlbmQodCk7XG4gICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQxNCA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcmUyKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDE0Lm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsIHQsIG4sICExKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9jbjIoKSB7XG4gICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9hbikpIHJldHVybjtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuZGl2O1xuICAgICAgICBmb3IgKGNvbnN0IFtlLCBuXSBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2FuKSkge1xuICAgICAgICAgIGNvbnN0IGkgPSB0LnF1ZXJ5U2VsZWN0b3IoXCJbZGF0YS1hbm5vdGF0aW9uLWlkPVxcXCJcIi5jb25jYXQoZSwgXCJcXFwiXVwiKSk7XG4gICAgICAgICAgaWYgKCFpKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmaXJzdENoaWxkOiByXG4gICAgICAgICAgfSA9IGk7XG4gICAgICAgICAgciA/IFwiQ0FOVkFTXCIgPT09IHIubm9kZU5hbWUgPyByLnJlcGxhY2VXaXRoKG4pIDogci5iZWZvcmUobikgOiBpLmFwcGVuZChuKTtcbiAgICAgICAgfVxuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2FuKS5jbGVhcigpO1xuICAgICAgfVxuICAgIH0sICh0LCBlKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLkNvbG9yQ29udmVydGVycyA9IHZvaWQgMDtcbiAgICAgIGZ1bmN0aW9uIG1ha2VDb2xvckNvbXAodCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigyNTUgKiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0KSkpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIik7XG4gICAgICB9XG4gICAgICBlLkNvbG9yQ29udmVydGVycyA9IGNsYXNzIENvbG9yQ29udmVydGVycyB7XG4gICAgICAgIHN0YXRpYyBDTVlLX0codCkge1xuICAgICAgICAgIGxldCBbZSwgbiwgaSwgcl0gPSB0O1xuICAgICAgICAgIHJldHVybiBbXCJHXCIsIDEgLSBNYXRoLm1pbigxLCAuMyAqIGUgKyAuNTkgKiBpICsgLjExICogbiArIHIpXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgR19DTVlLKHQpIHtcbiAgICAgICAgICBsZXQgW2VdID0gdDtcbiAgICAgICAgICByZXR1cm4gW1wiQ01ZS1wiLCAwLCAwLCAwLCAxIC0gZV07XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIEdfUkdCKHQpIHtcbiAgICAgICAgICBsZXQgW2VdID0gdDtcbiAgICAgICAgICByZXR1cm4gW1wiUkdCXCIsIGUsIGUsIGVdO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBHX0hUTUwodCkge1xuICAgICAgICAgIGxldCBbZV0gPSB0O1xuICAgICAgICAgIGNvbnN0IG4gPSBtYWtlQ29sb3JDb21wKGUpO1xuICAgICAgICAgIHJldHVybiBcIiNcIi5jb25jYXQobikuY29uY2F0KG4pLmNvbmNhdChuKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgUkdCX0codCkge1xuICAgICAgICAgIGxldCBbZSwgbiwgaV0gPSB0O1xuICAgICAgICAgIHJldHVybiBbXCJHXCIsIC4zICogZSArIC41OSAqIG4gKyAuMTEgKiBpXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgUkdCX0hUTUwodCkge1xuICAgICAgICAgIGxldCBbZSwgbiwgaV0gPSB0O1xuICAgICAgICAgIHJldHVybiBcIiNcIi5jb25jYXQobWFrZUNvbG9yQ29tcChlKSkuY29uY2F0KG1ha2VDb2xvckNvbXAobikpLmNvbmNhdChtYWtlQ29sb3JDb21wKGkpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgVF9IVE1MKCkge1xuICAgICAgICAgIHJldHVybiBcIiMwMDAwMDAwMFwiO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBDTVlLX1JHQih0KSB7XG4gICAgICAgICAgbGV0IFtlLCBuLCBpLCByXSA9IHQ7XG4gICAgICAgICAgcmV0dXJuIFtcIlJHQlwiLCAxIC0gTWF0aC5taW4oMSwgZSArIHIpLCAxIC0gTWF0aC5taW4oMSwgaSArIHIpLCAxIC0gTWF0aC5taW4oMSwgbiArIHIpXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgQ01ZS19IVE1MKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5DTVlLX1JHQih0KS5zbGljZSgxKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5SR0JfSFRNTChlKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgUkdCX0NNWUsodCkge1xuICAgICAgICAgIGxldCBbZSwgbiwgaV0gPSB0O1xuICAgICAgICAgIGNvbnN0IHIgPSAxIC0gZSxcbiAgICAgICAgICAgIHMgPSAxIC0gbixcbiAgICAgICAgICAgIGEgPSAxIC0gaTtcbiAgICAgICAgICByZXR1cm4gW1wiQ01ZS1wiLCByLCBzLCBhLCBNYXRoLm1pbihyLCBzLCBhKV07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUpID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuTnVsbEwxMG4gPSB2b2lkIDA7XG4gICAgICBlLmdldEwxMG5GYWxsYmFjayA9IGdldEwxMG5GYWxsYmFjaztcbiAgICAgIGNvbnN0IG4gPSB7XG4gICAgICAgIG9mX3BhZ2VzOiBcIm9mIHt7cGFnZXNDb3VudH19XCIsXG4gICAgICAgIHBhZ2Vfb2ZfcGFnZXM6IFwiKHt7cGFnZU51bWJlcn19IG9mIHt7cGFnZXNDb3VudH19KVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX2tiOiBcInt7c2l6ZV9rYn19IEtCICh7e3NpemVfYn19IGJ5dGVzKVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX21iOiBcInt7c2l6ZV9tYn19IE1CICh7e3NpemVfYn19IGJ5dGVzKVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX2RhdGVfc3RyaW5nOiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV91bml0X2luY2hlczogXCJpblwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV91bml0X21pbGxpbWV0ZXJzOiBcIm1tXCIsXG4gICAgICAgIGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX29yaWVudGF0aW9uX3BvcnRyYWl0OiBcInBvcnRyYWl0XCIsXG4gICAgICAgIGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX29yaWVudGF0aW9uX2xhbmRzY2FwZTogXCJsYW5kc2NhcGVcIixcbiAgICAgICAgZG9jdW1lbnRfcHJvcGVydGllc19wYWdlX3NpemVfbmFtZV9hMzogXCJBM1wiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV9uYW1lX2E0OiBcIkE0XCIsXG4gICAgICAgIGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX25hbWVfbGV0dGVyOiBcIkxldHRlclwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV9uYW1lX2xlZ2FsOiBcIkxlZ2FsXCIsXG4gICAgICAgIGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX2RpbWVuc2lvbl9zdHJpbmc6IFwie3t3aWR0aH19IMOXIHt7aGVpZ2h0fX0ge3t1bml0fX0gKHt7b3JpZW50YXRpb259fSlcIixcbiAgICAgICAgZG9jdW1lbnRfcHJvcGVydGllc19wYWdlX3NpemVfZGltZW5zaW9uX25hbWVfc3RyaW5nOiBcInt7d2lkdGh9fSDDlyB7e2hlaWdodH19IHt7dW5pdH19ICh7e25hbWV9fSwge3tvcmllbnRhdGlvbn19KVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX2xpbmVhcml6ZWRfeWVzOiBcIlllc1wiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX2xpbmVhcml6ZWRfbm86IFwiTm9cIixcbiAgICAgICAgYWRkaXRpb25hbF9sYXllcnM6IFwiQWRkaXRpb25hbCBMYXllcnNcIixcbiAgICAgICAgcGFnZV9sYW5kbWFyazogXCJQYWdlIHt7cGFnZX19XCIsXG4gICAgICAgIHRodW1iX3BhZ2VfdGl0bGU6IFwiUGFnZSB7e3BhZ2V9fVwiLFxuICAgICAgICB0aHVtYl9wYWdlX2NhbnZhczogXCJUaHVtYm5haWwgb2YgUGFnZSB7e3BhZ2V9fVwiLFxuICAgICAgICBmaW5kX3JlYWNoZWRfdG9wOiBcIlJlYWNoZWQgdG9wIG9mIGRvY3VtZW50LCBjb250aW51ZWQgZnJvbSBib3R0b21cIixcbiAgICAgICAgZmluZF9yZWFjaGVkX2JvdHRvbTogXCJSZWFjaGVkIGVuZCBvZiBkb2N1bWVudCwgY29udGludWVkIGZyb20gdG9wXCIsXG4gICAgICAgIFwiZmluZF9tYXRjaF9jb3VudFtvbmVdXCI6IFwie3tjdXJyZW50fX0gb2Yge3t0b3RhbH19IG1hdGNoXCIsXG4gICAgICAgIFwiZmluZF9tYXRjaF9jb3VudFtvdGhlcl1cIjogXCJ7e2N1cnJlbnR9fSBvZiB7e3RvdGFsfX0gbWF0Y2hlc1wiLFxuICAgICAgICBcImZpbmRfbWF0Y2hfY291bnRfbGltaXRbb25lXVwiOiBcIk1vcmUgdGhhbiB7e2xpbWl0fX0gbWF0Y2hcIixcbiAgICAgICAgXCJmaW5kX21hdGNoX2NvdW50X2xpbWl0W290aGVyXVwiOiBcIk1vcmUgdGhhbiB7e2xpbWl0fX0gbWF0Y2hlc1wiLFxuICAgICAgICBmaW5kX25vdF9mb3VuZDogXCJQaHJhc2Ugbm90IGZvdW5kXCIsXG4gICAgICAgIHBhZ2Vfc2NhbGVfd2lkdGg6IFwiUGFnZSBXaWR0aFwiLFxuICAgICAgICBwYWdlX3NjYWxlX2ZpdDogXCJQYWdlIEZpdFwiLFxuICAgICAgICBwYWdlX3NjYWxlX2F1dG86IFwiQXV0b21hdGljIFpvb21cIixcbiAgICAgICAgcGFnZV9zY2FsZV9hY3R1YWw6IFwiQWN0dWFsIFNpemVcIixcbiAgICAgICAgcGFnZV9zY2FsZV9wZXJjZW50OiBcInt7c2NhbGV9fSVcIixcbiAgICAgICAgbG9hZGluZ19lcnJvcjogXCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZSBQREYuXCIsXG4gICAgICAgIGludmFsaWRfZmlsZV9lcnJvcjogXCJJbnZhbGlkIG9yIGNvcnJ1cHRlZCBQREYgZmlsZS5cIixcbiAgICAgICAgbWlzc2luZ19maWxlX2Vycm9yOiBcIk1pc3NpbmcgUERGIGZpbGUuXCIsXG4gICAgICAgIHVuZXhwZWN0ZWRfcmVzcG9uc2VfZXJyb3I6IFwiVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UuXCIsXG4gICAgICAgIHJlbmRlcmluZ19lcnJvcjogXCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZW5kZXJpbmcgdGhlIHBhZ2UuXCIsXG4gICAgICAgIGFubm90YXRpb25fZGF0ZV9zdHJpbmc6IFwie3tkYXRlfX0sIHt7dGltZX19XCIsXG4gICAgICAgIHByaW50aW5nX25vdF9zdXBwb3J0ZWQ6IFwiV2FybmluZzogUHJpbnRpbmcgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXCIsXG4gICAgICAgIHByaW50aW5nX25vdF9yZWFkeTogXCJXYXJuaW5nOiBUaGUgUERGIGlzIG5vdCBmdWxseSBsb2FkZWQgZm9yIHByaW50aW5nLlwiLFxuICAgICAgICB3ZWJfZm9udHNfZGlzYWJsZWQ6IFwiV2ViIGZvbnRzIGFyZSBkaXNhYmxlZDogdW5hYmxlIHRvIHVzZSBlbWJlZGRlZCBQREYgZm9udHMuXCIsXG4gICAgICAgIGZyZWVfdGV4dDJfZGVmYXVsdF9jb250ZW50OiBcIlN0YXJ0IHR5cGluZ+KAplwiLFxuICAgICAgICBlZGl0b3JfZnJlZV90ZXh0Ml9hcmlhX2xhYmVsOiBcIlRleHQgRWRpdG9yXCIsXG4gICAgICAgIGVkaXRvcl9pbmsyX2FyaWFfbGFiZWw6IFwiRHJhdyBFZGl0b3JcIixcbiAgICAgICAgZWRpdG9yX2lua19jYW52YXNfYXJpYV9sYWJlbDogXCJVc2VyLWNyZWF0ZWQgaW1hZ2VcIixcbiAgICAgICAgcHJpbnRfcHJvZ3Jlc3NfcGVyY2VudDogXCJ7e3Byb2dyZXNzfX0lXCJcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBnZXRMMTBuRmFsbGJhY2sodCwgZSkge1xuICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICBjYXNlIFwiZmluZF9tYXRjaF9jb3VudFwiOlxuICAgICAgICAgICAgdCA9IFwiZmluZF9tYXRjaF9jb3VudFtcIi5jb25jYXQoMSA9PT0gZS50b3RhbCA/IFwib25lXCIgOiBcIm90aGVyXCIsIFwiXVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJmaW5kX21hdGNoX2NvdW50X2xpbWl0XCI6XG4gICAgICAgICAgICB0ID0gXCJmaW5kX21hdGNoX2NvdW50X2xpbWl0W1wiLmNvbmNhdCgxID09PSBlLmxpbWl0ID8gXCJvbmVcIiA6IFwib3RoZXJcIiwgXCJdXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuW3RdIHx8IFwiXCI7XG4gICAgICB9XG4gICAgICBjb25zdCBpID0ge1xuICAgICAgICBnZXRMYW5ndWFnZTogYXN5bmMgKCkgPT4gXCJlbi11c1wiLFxuICAgICAgICBnZXREaXJlY3Rpb246IGFzeW5jICgpID0+IFwibHRyXCIsXG4gICAgICAgIGFzeW5jIGdldCh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZvcm1hdEwxMG5WYWx1ZSh0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZSA/IHQucmVwbGFjZUFsbCgvXFx7XFx7XFxzKihcXHcrKVxccypcXH1cXH0vZywgKHQsIG4pID0+IG4gaW4gZSA/IGVbbl0gOiBcInt7XCIgKyBuICsgXCJ9fVwiKSA6IHQ7XG4gICAgICAgICAgfShhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IGdldEwxMG5GYWxsYmFjayh0LCBlKSwgZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHRyYW5zbGF0ZSh0KSB7fVxuICAgICAgfTtcbiAgICAgIGUuTnVsbEwxMG4gPSBpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLlhmYUxheWVyID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICB2YXIgaSA9IG4oMTkzKTtcbiAgICAgIGUuWGZhTGF5ZXIgPSBjbGFzcyBYZmFMYXllciB7XG4gICAgICAgIHN0YXRpYyBzZXR1cFN0b3JhZ2UodCwgZSwgbiwgaSwgcikge1xuICAgICAgICAgIGNvbnN0IHMgPSBpLmdldFZhbHVlKGUsIHtcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3dpdGNoIChuLm5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgICAgICBudWxsICE9PSBzLnZhbHVlICYmICh0LnRleHRDb250ZW50ID0gcy52YWx1ZSk7XG4gICAgICAgICAgICAgIGlmIChcInByaW50XCIgPT09IHIpIGJyZWFrO1xuICAgICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB0ID0+IHtcbiAgICAgICAgICAgICAgICBpLnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgICAgICAgICAgaWYgKFwicmFkaW9cIiA9PT0gbi5hdHRyaWJ1dGVzLnR5cGUgfHwgXCJjaGVja2JveFwiID09PSBuLmF0dHJpYnV0ZXMudHlwZSkge1xuICAgICAgICAgICAgICAgIHMudmFsdWUgPT09IG4uYXR0cmlidXRlcy54ZmFPbiA/IHQuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCAhMCkgOiBzLnZhbHVlID09PSBuLmF0dHJpYnV0ZXMueGZhT2ZmICYmIHQucmVtb3ZlQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoXCJwcmludFwiID09PSByKSBicmVhaztcbiAgICAgICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdCA9PiB7XG4gICAgICAgICAgICAgICAgICBpLnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQudGFyZ2V0LmNoZWNrZWQgPyB0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ4ZmFPblwiKSA6IHQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInhmYU9mZlwiKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcy52YWx1ZSAmJiB0LnNldEF0dHJpYnV0ZShcInZhbHVlXCIsIHMudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChcInByaW50XCIgPT09IHIpIGJyZWFrO1xuICAgICAgICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgICAgaS5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgICAgICAgIGlmIChudWxsICE9PSBzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBzLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbi5jaGlsZHJlbikgdC5hdHRyaWJ1dGVzLnZhbHVlID09PSBzLnZhbHVlID8gdC5hdHRyaWJ1dGVzLnNlbGVjdGVkID0gITAgOiB0LmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoXCJzZWxlY3RlZFwiKSAmJiBkZWxldGUgdC5hdHRyaWJ1dGVzLnNlbGVjdGVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0LnRhcmdldC5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgciA9IC0xID09PSBuLnNlbGVjdGVkSW5kZXggPyBcIlwiIDogbltuLnNlbGVjdGVkSW5kZXhdLnZhbHVlO1xuICAgICAgICAgICAgICAgIGkuc2V0VmFsdWUoZSwge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IHJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBzZXRBdHRyaWJ1dGVzKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgaHRtbDogZSxcbiAgICAgICAgICAgIGVsZW1lbnQ6IG4sXG4gICAgICAgICAgICBzdG9yYWdlOiBpID0gbnVsbCxcbiAgICAgICAgICAgIGludGVudDogcixcbiAgICAgICAgICAgIGxpbmtTZXJ2aWNlOiBzXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBhXG4gICAgICAgICAgICB9ID0gbixcbiAgICAgICAgICAgIG8gPSBlIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQ7XG4gICAgICAgICAgXCJyYWRpb1wiID09PSBhLnR5cGUgJiYgKGEubmFtZSA9IFwiXCIuY29uY2F0KGEubmFtZSwgXCItXCIpLmNvbmNhdChyKSk7XG4gICAgICAgICAgZm9yIChjb25zdCBbdCwgbl0gb2YgT2JqZWN0LmVudHJpZXMoYSkpIGlmIChudWxsICE9IG4pIHN3aXRjaCAodCkge1xuICAgICAgICAgICAgY2FzZSBcImNsYXNzXCI6XG4gICAgICAgICAgICAgIG4ubGVuZ3RoICYmIGUuc2V0QXR0cmlidXRlKHQsIG4uam9pbihcIiBcIikpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkYXRhSWRcIjpcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiaWRcIjpcbiAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZS5zdHlsZSwgbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInRleHRDb250ZW50XCI6XG4gICAgICAgICAgICAgIGUudGV4dENvbnRlbnQgPSBuO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICghbyB8fCBcImhyZWZcIiAhPT0gdCAmJiBcIm5ld1dpbmRvd1wiICE9PSB0KSAmJiBlLnNldEF0dHJpYnV0ZSh0LCBuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbyAmJiBzLmFkZExpbmtBdHRyaWJ1dGVzKGUsIGEuaHJlZiwgYS5uZXdXaW5kb3cpO1xuICAgICAgICAgIGkgJiYgYS5kYXRhSWQgJiYgdGhpcy5zZXR1cFN0b3JhZ2UoZSwgYS5kYXRhSWQsIG4sIGkpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyByZW5kZXIodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0LmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgbiA9IHQubGlua1NlcnZpY2UsXG4gICAgICAgICAgICByID0gdC54ZmFIdG1sLFxuICAgICAgICAgICAgcyA9IHQuaW50ZW50IHx8IFwiZGlzcGxheVwiLFxuICAgICAgICAgICAgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoci5uYW1lKTtcbiAgICAgICAgICByLmF0dHJpYnV0ZXMgJiYgdGhpcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgIGh0bWw6IGEsXG4gICAgICAgICAgICBlbGVtZW50OiByLFxuICAgICAgICAgICAgaW50ZW50OiBzLFxuICAgICAgICAgICAgbGlua1NlcnZpY2U6IG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBvID0gW1tyLCAtMSwgYV1dLFxuICAgICAgICAgICAgbCA9IHQuZGl2O1xuICAgICAgICAgIGwuYXBwZW5kKGEpO1xuICAgICAgICAgIGlmICh0LnZpZXdwb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gXCJtYXRyaXgoXCIuY29uY2F0KHQudmlld3BvcnQudHJhbnNmb3JtLmpvaW4oXCIsXCIpLCBcIilcIik7XG4gICAgICAgICAgICBsLnN0eWxlLnRyYW5zZm9ybSA9IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIFwicmljaFRleHRcIiAhPT0gcyAmJiBsLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwieGZhTGF5ZXIgeGZhRm9udFwiKTtcbiAgICAgICAgICBjb25zdCBjID0gW107XG4gICAgICAgICAgZm9yICg7IG8ubGVuZ3RoID4gMDspIHtcbiAgICAgICAgICAgIHZhciBfbCRhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgY29uc3QgW3QsIHIsIGFdID0gby5hdCgtMSk7XG4gICAgICAgICAgICBpZiAociArIDEgPT09IHQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIG8ucG9wKCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbCA9IHQuY2hpbGRyZW5bKytvLmF0KC0xKVsxXV07XG4gICAgICAgICAgICBpZiAobnVsbCA9PT0gbCkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIG5hbWU6IGhcbiAgICAgICAgICAgIH0gPSBsO1xuICAgICAgICAgICAgaWYgKFwiI3RleHRcIiA9PT0gaCkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobC52YWx1ZSk7XG4gICAgICAgICAgICAgIGMucHVzaCh0KTtcbiAgICAgICAgICAgICAgYS5hcHBlbmQodCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZCA9IGwgIT09IG51bGwgJiYgbCAhPT0gdm9pZCAwICYmIChfbCRhdHRyaWJ1dGVzID0gbC5hdHRyaWJ1dGVzKSAhPT0gbnVsbCAmJiBfbCRhdHRyaWJ1dGVzICE9PSB2b2lkIDAgJiYgX2wkYXR0cmlidXRlcy54bWxucyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhsLmF0dHJpYnV0ZXMueG1sbnMsIGgpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChoKTtcbiAgICAgICAgICAgIGEuYXBwZW5kKGQpO1xuICAgICAgICAgICAgbC5hdHRyaWJ1dGVzICYmIHRoaXMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIGh0bWw6IGQsXG4gICAgICAgICAgICAgIGVsZW1lbnQ6IGwsXG4gICAgICAgICAgICAgIHN0b3JhZ2U6IGUsXG4gICAgICAgICAgICAgIGludGVudDogcyxcbiAgICAgICAgICAgICAgbGlua1NlcnZpY2U6IG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGwuY2hpbGRyZW4gJiYgbC5jaGlsZHJlbi5sZW5ndGggPiAwKSBvLnB1c2goW2wsIC0xLCBkXSk7ZWxzZSBpZiAobC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobC52YWx1ZSk7XG4gICAgICAgICAgICAgIGkuWGZhVGV4dC5zaG91bGRCdWlsZFRleHQoaCkgJiYgYy5wdXNoKHQpO1xuICAgICAgICAgICAgICBkLmFwcGVuZCh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIGwucXVlcnlTZWxlY3RvckFsbChcIi54ZmFOb25JbnRlcmFjdGl2ZSBpbnB1dCwgLnhmYU5vbkludGVyYWN0aXZlIHRleHRhcmVhXCIpKSB0LnNldEF0dHJpYnV0ZShcInJlYWRPbmx5XCIsICEwKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dERpdnM6IGNcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyB1cGRhdGUodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSBcIm1hdHJpeChcIi5jb25jYXQodC52aWV3cG9ydC50cmFuc2Zvcm0uam9pbihcIixcIiksIFwiKVwiKTtcbiAgICAgICAgICB0LmRpdi5zdHlsZS50cmFuc2Zvcm0gPSBlO1xuICAgICAgICAgIHQuZGl2LmhpZGRlbiA9ICExO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9jbGFzczQxO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLklua0VkaXRvciA9IHZvaWQgMDtcbiAgICAgIG4oODkpO1xuICAgICAgbigyKTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTYzKSxcbiAgICAgICAgcyA9IG4oMTk3KSxcbiAgICAgICAgYSA9IG4oMTY0KTtcbiAgICAgIHZhciBfaG4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZG4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfcG4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZ24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfYm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfQW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbjkgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfU24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfRW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeG4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfd24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfUGUzID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0NuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0ZuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0luID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0RuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0xuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0JuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2puID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX09uID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX05uID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1VuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1BuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0huID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2tuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX01uID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1JuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3FuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3puID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1huID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0tuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1duID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1RuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBJbmtFZGl0b3IgZXh0ZW5kcyByLkFubm90YXRpb25FZGl0b3Ige1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDE3KSB7XG4gICAgICAgICAgc3VwZXIoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdDE3KSwge30sIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaW5rRWRpdG9yXCJcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Ubik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Xbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Lbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Ybik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF96bik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9xbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Sbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Nbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9rbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Ibik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Qbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Vbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Obik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Pbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9qbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Cbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Mbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Ebik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Jbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Gbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Dbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9QZTMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfd24pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9obiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9kbiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF91biwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5jYW52YXNDb250ZXh0TWVudS5iaW5kKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3BuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNhbnZhc1BvaW50ZXJtb3ZlLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZm4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY2FudmFzUG9pbnRlcmxlYXZlLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZ24sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY2FudmFzUG9pbnRlcnVwLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY2FudmFzUG9pbnRlcmRvd24uYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9ibiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3IFBhdGgyRCgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3ZuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF95biwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfQW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX245LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1NuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0VuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3huLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jb2xvciA9IF90MTcuY29sb3IgfHwgbnVsbDtcbiAgICAgICAgICB0aGlzLnRoaWNrbmVzcyA9IF90MTcudGhpY2tuZXNzIHx8IG51bGw7XG4gICAgICAgICAgdGhpcy5vcGFjaXR5ID0gX3QxNy5vcGFjaXR5IHx8IG51bGw7XG4gICAgICAgICAgdGhpcy5wYXRocyA9IFtdO1xuICAgICAgICAgIHRoaXMuYmV6aWVyUGF0aDJEID0gW107XG4gICAgICAgICAgdGhpcy5hbGxSYXdQYXRocyA9IFtdO1xuICAgICAgICAgIHRoaXMuY3VycmVudFBhdGggPSBbXTtcbiAgICAgICAgICB0aGlzLnNjYWxlRmFjdG9yID0gMTtcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uWCA9IHRoaXMudHJhbnNsYXRpb25ZID0gMDtcbiAgICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgICAgdGhpcy5fd2lsbEtlZXBBc3BlY3RSYXRpbyA9ICEwO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBpbml0aWFsaXplKHQpIHtcbiAgICAgICAgICB0aGlzLl9sMTBuUHJvbWlzZSA9IG5ldyBNYXAoW1wiZWRpdG9yX2lua19jYW52YXNfYXJpYV9sYWJlbFwiLCBcImVkaXRvcl9pbmsyX2FyaWFfbGFiZWxcIl0ubWFwKGUgPT4gW2UsIHQuZ2V0KGUpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHQsIGUpIHtcbiAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTOlxuICAgICAgICAgICAgICBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3MgPSBlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG4gICAgICAgICAgICAgIElua0VkaXRvci5fZGVmYXVsdENvbG9yID0gZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFk6XG4gICAgICAgICAgICAgIElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkgPSBlIC8gMTAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVQYXJhbXModCwgZSkge1xuICAgICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1M6XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3duLCBfd24yKS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BlMywgX1BlNCkuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFk6XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0NuLCBfQ24yKS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgICAgICAgcmV0dXJuIFtbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLCBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdLCBbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1IsIElua0VkaXRvci5fZGVmYXVsdENvbG9yIHx8IHIuQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcl0sIFtpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZLCBNYXRoLnJvdW5kKDEwMCAqIElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkpXV07XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkb3BhY2l0eTtcbiAgICAgICAgICByZXR1cm4gW1tpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1MsIHRoaXMudGhpY2tuZXNzIHx8IElua0VkaXRvci5fZGVmYXVsdFRoaWNrbmVzc10sIFtpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUiwgdGhpcy5jb2xvciB8fCBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCByLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdLCBbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWSwgTWF0aC5yb3VuZCgxMDAgKiAoKF90aGlzJG9wYWNpdHkgPSB0aGlzLm9wYWNpdHkpICE9PSBudWxsICYmIF90aGlzJG9wYWNpdHkgIT09IHZvaWQgMCA/IF90aGlzJG9wYWNpdHkgOiBJbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5KSldXTtcbiAgICAgICAgfVxuICAgICAgICByZWJ1aWxkKCkge1xuICAgICAgICAgIHN1cGVyLnJlYnVpbGQoKTtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gdGhpcy5kaXYpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa24sIF9rbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX01uLCBfTW4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgICAgICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1JuLCBfUm4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVG4sIF9UbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbW92ZSgpIHtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIHRoaXMuaXNFbXB0eSgpIHx8IHRoaXMuY29tbWl0KCk7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbjkpLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbjksIG51bGwpO1xuICAgICAgICAgICAgc3VwZXIucmVtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldFBhcmVudCh0KSB7XG4gICAgICAgICAgIXRoaXMucGFyZW50ICYmIHQgPyB0aGlzLl91aU1hbmFnZXIucmVtb3ZlU2hvdWxkUmVzY2FsZSh0aGlzKSA6IHRoaXMucGFyZW50ICYmIG51bGwgPT09IHQgJiYgdGhpcy5fdWlNYW5hZ2VyLmFkZFNob3VsZFJlc2NhbGUodGhpcyk7XG4gICAgICAgICAgc3VwZXIuc2V0UGFyZW50KHQpO1xuICAgICAgICB9XG4gICAgICAgIG9uU2NhbGVDaGFuZ2luZygpIHtcbiAgICAgICAgICBjb25zdCBbdCwgZV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnMsXG4gICAgICAgICAgICBuID0gdGhpcy53aWR0aCAqIHQsXG4gICAgICAgICAgICBpID0gdGhpcy5oZWlnaHQgKiBlO1xuICAgICAgICAgIHRoaXMuc2V0RGltZW5zaW9ucyhuLCBpKTtcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVFZGl0TW9kZSgpIHtcbiAgICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdm4pICYmIG51bGwgIT09IHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICBzdXBlci5lbmFibGVFZGl0TW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gITE7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbkVkaXRNb2RlKCkgJiYgbnVsbCAhPT0gdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIHN1cGVyLmRpc2FibGVFZGl0TW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gIXRoaXMuaXNFbXB0eSgpO1xuICAgICAgICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LnJlbW92ZShcImVkaXRpbmdcIik7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvbmNlQWRkZWQoKSB7XG4gICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gIXRoaXMuaXNFbXB0eSgpO1xuICAgICAgICB9XG4gICAgICAgIGlzRW1wdHkoKSB7XG4gICAgICAgICAgcmV0dXJuIDAgPT09IHRoaXMucGF0aHMubGVuZ3RoIHx8IDEgPT09IHRoaXMucGF0aHMubGVuZ3RoICYmIDAgPT09IHRoaXMucGF0aHNbMF0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGNvbW1pdCgpIHtcbiAgICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdm4pKSB7XG4gICAgICAgICAgICBzdXBlci5jb21taXQoKTtcbiAgICAgICAgICAgIHRoaXMuaXNFZGl0aW5nID0gITE7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVFZGl0TW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRJbkZvcmVncm91bmQoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfdm4sICEwKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1RuLCBfVG4yKS5jYWxsKHRoaXMsICEwKTtcbiAgICAgICAgICAgIHRoaXMubWFrZVJlc2l6YWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkSW5rRWRpdG9ySWZOZWVkZWQoITApO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQubW92ZUVkaXRvckluRE9NKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZm9jdXMoe1xuICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiAhMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvY3VzaW4odCkge1xuICAgICAgICAgIHN1cGVyLmZvY3VzaW4odCk7XG4gICAgICAgICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhc1BvaW50ZXJkb3duKHQpIHtcbiAgICAgICAgICBpZiAoMCA9PT0gdC5idXR0b24gJiYgdGhpcy5pc0luRWRpdE1vZGUoKSAmJiAhX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF92bikpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5Gb3JlZ3JvdW5kKCk7XG4gICAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBcIm1vdXNlXCIgIT09IHQudHlwZSAmJiB0aGlzLmRpdi5mb2N1cygpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRG4sIF9EbjIpLmNhbGwodGhpcywgdC5vZmZzZXRYLCB0Lm9mZnNldFkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYW52YXNDb250ZXh0TWVudSh0KSB7XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhc1BvaW50ZXJtb3ZlKHQpIHtcbiAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTG4sIF9MbjIpLmNhbGwodGhpcywgdC5vZmZzZXRYLCB0Lm9mZnNldFkpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhc1BvaW50ZXJ1cCh0KSB7XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0huLCBfSG4yKS5jYWxsKHRoaXMsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhc1BvaW50ZXJsZWF2ZSh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfSG4sIF9IbjIpLmNhbGwodGhpcywgdCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmVzaXphYmxlKCkge1xuICAgICAgICAgIHJldHVybiAhdGhpcy5pc0VtcHR5KCkgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF92bik7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIGlmICh0aGlzLmRpdikgcmV0dXJuIHRoaXMuZGl2O1xuICAgICAgICAgIGxldCB0LCBlO1xuICAgICAgICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICAgICAgICB0ID0gdGhpcy54O1xuICAgICAgICAgICAgZSA9IHRoaXMueTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3VwZXIucmVuZGVyKCk7XG4gICAgICAgICAgSW5rRWRpdG9yLl9sMTBuUHJvbWlzZS5nZXQoXCJlZGl0b3JfaW5rMl9hcmlhX2xhYmVsXCIpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkZGl2NjtcbiAgICAgICAgICAgIHJldHVybiAoX3RoaXMkZGl2NiA9IHRoaXMuZGl2KSA9PT0gbnVsbCB8fCBfdGhpcyRkaXY2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkaXY2LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgW24sIGksIHIsIHNdID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRm4sIF9GbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgdGhpcy5zZXRBdChuLCBpLCAwLCAwKTtcbiAgICAgICAgICB0aGlzLnNldERpbXMociwgcyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa24sIF9rbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IFtuLCBpXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgICAgIHRoaXMuc2V0QXNwZWN0UmF0aW8odGhpcy53aWR0aCAqIG4sIHRoaXMuaGVpZ2h0ICogaSk7XG4gICAgICAgICAgICB0aGlzLnNldEF0KHQgKiBuLCBlICogaSwgdGhpcy53aWR0aCAqIG4sIHRoaXMuaGVpZ2h0ICogaSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0FuLCAhMCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SbiwgX1JuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGltcyh0aGlzLndpZHRoICogbiwgdGhpcy5oZWlnaHQgKiBpKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcImRpc2FibGVkXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiZWRpdGluZ1wiKTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTW4sIF9NbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgICAgICB9XG4gICAgICAgIHNldERpbWVuc2lvbnModCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSBNYXRoLnJvdW5kKHQpLFxuICAgICAgICAgICAgaSA9IE1hdGgucm91bmQoZSk7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfU24pID09PSBuICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRW4pID09PSBpKSByZXR1cm47XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9Tbiwgbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9FbiwgaSk7XG4gICAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgY29uc3QgW3IsIHNdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgIHRoaXMud2lkdGggPSB0IC8gcjtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IGUgLyBzO1xuICAgICAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZuKSAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9xbiwgX3FuMikuY2FsbCh0aGlzLCB0LCBlKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SbiwgX1JuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9QbiwgX1BuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG4gICAgICAgICAgdGhpcy5maXhEaW1zKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGRlc2VyaWFsaXplKHQsIGUsIG4pIHtcbiAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHMuSW5rQW5ub3RhdGlvbkVsZW1lbnQpIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IGEgPSBzdXBlci5kZXNlcmlhbGl6ZSh0LCBlLCBuKTtcbiAgICAgICAgICBhLnRoaWNrbmVzcyA9IHQudGhpY2tuZXNzO1xuICAgICAgICAgIGEuY29sb3IgPSBpLlV0aWwubWFrZUhleENvbG9yKC4uLnQuY29sb3IpO1xuICAgICAgICAgIGEub3BhY2l0eSA9IHQub3BhY2l0eTtcbiAgICAgICAgICBjb25zdCBbbywgbF0gPSBhLnBhZ2VEaW1lbnNpb25zLFxuICAgICAgICAgICAgYyA9IGEud2lkdGggKiBvLFxuICAgICAgICAgICAgaCA9IGEuaGVpZ2h0ICogbCxcbiAgICAgICAgICAgIGQgPSBhLnBhcmVudFNjYWxlLFxuICAgICAgICAgICAgdSA9IHQudGhpY2tuZXNzIC8gMjtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQoYSwgX3ZuLCAhMCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGEsIF9TbiwgTWF0aC5yb3VuZChjKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGEsIF9FbiwgTWF0aC5yb3VuZChoKSk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgcGF0aHM6IHAsXG4gICAgICAgICAgICByZWN0OiBmLFxuICAgICAgICAgICAgcm90YXRpb246IGdcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBmb3IgKGxldCB7XG4gICAgICAgICAgICBiZXppZXI6IHRcbiAgICAgICAgICB9IG9mIHApIHtcbiAgICAgICAgICAgIHQgPSBfY2xhc3NTdGF0aWNQcml2YXRlTWV0aG9kR2V0KElua0VkaXRvciwgSW5rRWRpdG9yLCBfJG4pLmNhbGwoSW5rRWRpdG9yLCB0LCBmLCBnKTtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgICAgIGEucGF0aHMucHVzaChlKTtcbiAgICAgICAgICAgIGxldCBuID0gZCAqICh0WzBdIC0gdSksXG4gICAgICAgICAgICAgIGkgPSBkICogKHRbMV0gLSB1KTtcbiAgICAgICAgICAgIGZvciAobGV0IHIgPSAyLCBzID0gdC5sZW5ndGg7IHIgPCBzOyByICs9IDYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcyA9IGQgKiAodFtyXSAtIHUpLFxuICAgICAgICAgICAgICAgIGEgPSBkICogKHRbciArIDFdIC0gdSksXG4gICAgICAgICAgICAgICAgbyA9IGQgKiAodFtyICsgMl0gLSB1KSxcbiAgICAgICAgICAgICAgICBsID0gZCAqICh0W3IgKyAzXSAtIHUpLFxuICAgICAgICAgICAgICAgIGMgPSBkICogKHRbciArIDRdIC0gdSksXG4gICAgICAgICAgICAgICAgaCA9IGQgKiAodFtyICsgNV0gLSB1KTtcbiAgICAgICAgICAgICAgZS5wdXNoKFtbbiwgaV0sIFtzLCBhXSwgW28sIGxdLCBbYywgaF1dKTtcbiAgICAgICAgICAgICAgbiA9IGM7XG4gICAgICAgICAgICAgIGkgPSBoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgciA9IF9jbGFzc1N0YXRpY1ByaXZhdGVNZXRob2RHZXQodGhpcywgSW5rRWRpdG9yLCBfR24pLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgICBhLmJlemllclBhdGgyRC5wdXNoKHIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldChhLCBfS24sIF9LbjIpLmNhbGwoYSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGEsIF9kbiwgTWF0aC5tYXgoci5Bbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFLCBtWzJdIC0gbVswXSkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldChhLCBfaG4sIE1hdGgubWF4KHIuQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgbVszXSAtIG1bMV0pKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KGEsIF9xbiwgX3FuMikuY2FsbChhLCBjLCBoKTtcbiAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5nZXRSZWN0KDAsIDApLFxuICAgICAgICAgICAgZSA9IHIuQW5ub3RhdGlvbkVkaXRvci5fY29sb3JNYW5hZ2VyLmNvbnZlcnQodGhpcy5jdHguc3Ryb2tlU3R5bGUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZTogaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkssXG4gICAgICAgICAgICBjb2xvcjogZSxcbiAgICAgICAgICAgIHRoaWNrbmVzczogdGhpcy50aGlja25lc3MsXG4gICAgICAgICAgICBvcGFjaXR5OiB0aGlzLm9wYWNpdHksXG4gICAgICAgICAgICBwYXRoczogX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfWG4sIF9YbjIpLmNhbGwodGhpcywgdGhpcy5zY2FsZUZhY3RvciAvIHRoaXMucGFyZW50U2NhbGUsIHRoaXMudHJhbnNsYXRpb25YLCB0aGlzLnRyYW5zbGF0aW9uWSwgdCksXG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgICAgICAgcmVjdDogdCxcbiAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX2NsYXNzNDEgPSBJbmtFZGl0b3I7XG4gICAgICBmdW5jdGlvbiBfd24yKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMudGhpY2tuZXNzO1xuICAgICAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudGhpY2tuZXNzID0gdDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1RuLCBfVG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50aGlja25lc3MgPSBlO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVG4sIF9UbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdXN0RXhlYzogITAsXG4gICAgICAgICAgdHlwZTogaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLFxuICAgICAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6ICEwLFxuICAgICAgICAgIGtlZXBVbmRvOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9QZTQodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5jb2xvcjtcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgY21kOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gdDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb2xvciA9IGU7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9QbiwgX1BuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG11c3RFeGVjOiAhMCxcbiAgICAgICAgICB0eXBlOiBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUixcbiAgICAgICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiAhMCxcbiAgICAgICAgICBrZWVwVW5kbzogITBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfQ24yKHQpIHtcbiAgICAgICAgdCAvPSAxMDA7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLm9wYWNpdHk7XG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gdDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gZTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbXVzdEV4ZWM6ICEwLFxuICAgICAgICAgIHR5cGU6IGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFksXG4gICAgICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogITAsXG4gICAgICAgICAga2VlcFVuZG86ICEwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0ZuMigpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHBhcmVudFJvdGF0aW9uOiB0LFxuICAgICAgICAgIHBhcmVudERpbWVuc2lvbnM6IFtlLCBuXVxuICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgIHJldHVybiBbMCwgbiwgbiwgZV07XG4gICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICByZXR1cm4gW2UsIG4sIGUsIG5dO1xuICAgICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgICAgcmV0dXJuIFtlLCAwLCBuLCBlXTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFswLCAwLCBlLCBuXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0luMigpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGN0eDogdCxcbiAgICAgICAgICBjb2xvcjogZSxcbiAgICAgICAgICBvcGFjaXR5OiBuLFxuICAgICAgICAgIHRoaWNrbmVzczogaSxcbiAgICAgICAgICBwYXJlbnRTY2FsZTogcixcbiAgICAgICAgICBzY2FsZUZhY3Rvcjogc1xuICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgdC5saW5lV2lkdGggPSBpICogciAvIHM7XG4gICAgICAgIHQubGluZUNhcCA9IFwicm91bmRcIjtcbiAgICAgICAgdC5saW5lSm9pbiA9IFwicm91bmRcIjtcbiAgICAgICAgdC5taXRlckxpbWl0ID0gMTA7XG4gICAgICAgIHQuc3Ryb2tlU3R5bGUgPSBcIlwiLmNvbmNhdChlKS5jb25jYXQoKDAsIGEub3BhY2l0eVRvSGV4KShuKSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfRG4yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdW4pKTtcbiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJsZWF2ZVwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2ZuKSk7XG4gICAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BuKSk7XG4gICAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9nbikpO1xuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tbikpO1xuICAgICAgICB0aGlzLmlzRWRpdGluZyA9ICEwO1xuICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQW4pKSB7XG4gICAgICAgICAgdmFyIF90aGlzJG9wYWNpdHkyO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfQW4sICEwKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SbiwgX1JuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLnRoaWNrbmVzcyB8fCAodGhpcy50aGlja25lc3MgPSBfY2xhc3M0MS5fZGVmYXVsdFRoaWNrbmVzcyk7XG4gICAgICAgICAgdGhpcy5jb2xvciB8fCAodGhpcy5jb2xvciA9IF9jbGFzczQxLl9kZWZhdWx0Q29sb3IgfHwgci5Bbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yKTtcbiAgICAgICAgICAoX3RoaXMkb3BhY2l0eTIgPSB0aGlzLm9wYWNpdHkpICE9PSBudWxsICYmIF90aGlzJG9wYWNpdHkyICE9PSB2b2lkIDAgPyBfdGhpcyRvcGFjaXR5MiA6IHRoaXMub3BhY2l0eSA9IF9jbGFzczQxLl9kZWZhdWx0T3BhY2l0eTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRQYXRoLnB1c2goW3QsIGVdKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF95biwgITEpO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9JbiwgX0luMikuY2FsbCh0aGlzKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF94biwgKCkgPT4ge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX09uLCBfT24yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeG4pICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF94bikpO1xuICAgICAgICB9KTtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3huKSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfTG4yKHQsIGUpIHtcbiAgICAgICAgY29uc3QgW24sIGldID0gdGhpcy5jdXJyZW50UGF0aC5hdCgtMSk7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCA+IDEgJiYgdCA9PT0gbiAmJiBlID09PSBpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgICAgICBsZXQgcyA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYm4pO1xuICAgICAgICByLnB1c2goW3QsIGVdKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF95biwgITApO1xuICAgICAgICBpZiAoci5sZW5ndGggPD0gMikge1xuICAgICAgICAgIHMubW92ZVRvKC4uLnJbMF0pO1xuICAgICAgICAgIHMubGluZVRvKHQsIGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICgzID09PSByLmxlbmd0aCkge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ibiwgcyA9IG5ldyBQYXRoMkQoKSk7XG4gICAgICAgICAgICBzLm1vdmVUbyguLi5yWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTm4sIF9ObjIpLmNhbGwodGhpcywgcywgLi4uci5hdCgtMyksIC4uLnIuYXQoLTIpLCB0LCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0JuMigpIHtcbiAgICAgICAgaWYgKDAgPT09IHRoaXMuY3VycmVudFBhdGgubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRQYXRoLmF0KC0xKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ibikubGluZVRvKC4uLnQpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2puMih0LCBlKSB7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfeG4sIG51bGwpO1xuICAgICAgICB0ID0gTWF0aC5taW4oTWF0aC5tYXgodCwgMCksIHRoaXMuY2FudmFzLndpZHRoKTtcbiAgICAgICAgZSA9IE1hdGgubWluKE1hdGgubWF4KGUsIDApLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9MbiwgX0xuMikuY2FsbCh0aGlzLCB0LCBlKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfQm4sIF9CbjIpLmNhbGwodGhpcyk7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBpZiAoMSAhPT0gdGhpcy5jdXJyZW50UGF0aC5sZW5ndGgpIG4gPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9VbiwgX1VuMikuY2FsbCh0aGlzKTtlbHNlIHtcbiAgICAgICAgICBjb25zdCBpID0gW3QsIGVdO1xuICAgICAgICAgIG4gPSBbW2ksIGkuc2xpY2UoKSwgaS5zbGljZSgpLCBpXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYm4pLFxuICAgICAgICAgIHIgPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYXRoID0gW107XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfYm4sIG5ldyBQYXRoMkQoKSk7XG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGxSYXdQYXRocy5wdXNoKHIpO1xuICAgICAgICAgICAgdGhpcy5wYXRocy5wdXNoKG4pO1xuICAgICAgICAgICAgdGhpcy5iZXppZXJQYXRoMkQucHVzaChpKTtcbiAgICAgICAgICAgIHRoaXMucmVidWlsZCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGxSYXdQYXRocy5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMucGF0aHMucG9wKCk7XG4gICAgICAgICAgICB0aGlzLmJlemllclBhdGgyRC5wb3AoKTtcbiAgICAgICAgICAgIGlmICgwID09PSB0aGlzLnBhdGhzLmxlbmd0aCkgdGhpcy5yZW1vdmUoKTtlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2tuLCBfa24yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX01uLCBfTW4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1RuLCBfVG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbXVzdEV4ZWM6ICEwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX09uMigpIHtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3luKSkgcmV0dXJuO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3luLCAhMSk7XG4gICAgICAgIGNvbnN0IHQgPSBNYXRoLmNlaWwodGhpcy50aGlja25lc3MgKiB0aGlzLnBhcmVudFNjYWxlKSxcbiAgICAgICAgICBlID0gdGhpcy5jdXJyZW50UGF0aC5zbGljZSgtMyksXG4gICAgICAgICAgbiA9IGUubWFwKHQgPT4gdFswXSksXG4gICAgICAgICAgaSA9IGUubWFwKHQgPT4gdFsxXSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgY3R4OiByXG4gICAgICAgICAgfSA9IChNYXRoLm1pbiguLi5uKSwgTWF0aC5tYXgoLi4ubiksIE1hdGgubWluKC4uLmkpLCBNYXRoLm1heCguLi5pKSwgdGhpcyk7XG4gICAgICAgIHIuc2F2ZSgpO1xuICAgICAgICByLmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuYmV6aWVyUGF0aDJEKSByLnN0cm9rZSh0KTtcbiAgICAgICAgci5zdHJva2UoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ibikpO1xuICAgICAgICByLnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9ObjIodCwgZSwgbiwgaSwgciwgcywgYSkge1xuICAgICAgICBjb25zdCBvID0gKGUgKyBpKSAvIDIsXG4gICAgICAgICAgbCA9IChuICsgcikgLyAyLFxuICAgICAgICAgIGMgPSAoaSArIHMpIC8gMixcbiAgICAgICAgICBoID0gKHIgKyBhKSAvIDI7XG4gICAgICAgIHQuYmV6aWVyQ3VydmVUbyhvICsgMiAqIChpIC0gbykgLyAzLCBsICsgMiAqIChyIC0gbCkgLyAzLCBjICsgMiAqIChpIC0gYykgLyAzLCBoICsgMiAqIChyIC0gaCkgLyAzLCBjLCBoKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9VbjIoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgICAgICBpZiAodC5sZW5ndGggPD0gMikgcmV0dXJuIFtbdFswXSwgdFswXSwgdC5hdCgtMSksIHQuYXQoLTEpXV07XG4gICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgbGV0IG4sXG4gICAgICAgICAgW2ksIHJdID0gdFswXTtcbiAgICAgICAgZm9yIChuID0gMTsgbiA8IHQubGVuZ3RoIC0gMjsgbisrKSB7XG4gICAgICAgICAgY29uc3QgW3MsIGFdID0gdFtuXSxcbiAgICAgICAgICAgIFtvLCBsXSA9IHRbbiArIDFdLFxuICAgICAgICAgICAgYyA9IChzICsgbykgLyAyLFxuICAgICAgICAgICAgaCA9IChhICsgbCkgLyAyLFxuICAgICAgICAgICAgZCA9IFtpICsgMiAqIChzIC0gaSkgLyAzLCByICsgMiAqIChhIC0gcikgLyAzXSxcbiAgICAgICAgICAgIHUgPSBbYyArIDIgKiAocyAtIGMpIC8gMywgaCArIDIgKiAoYSAtIGgpIC8gM107XG4gICAgICAgICAgZS5wdXNoKFtbaSwgcl0sIGQsIHUsIFtjLCBoXV0pO1xuICAgICAgICAgIFtpLCByXSA9IFtjLCBoXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbcywgYV0gPSB0W25dLFxuICAgICAgICAgIFtvLCBsXSA9IHRbbiArIDFdLFxuICAgICAgICAgIGMgPSBbaSArIDIgKiAocyAtIGkpIC8gMywgciArIDIgKiAoYSAtIHIpIC8gM10sXG4gICAgICAgICAgaCA9IFtvICsgMiAqIChzIC0gbykgLyAzLCBsICsgMiAqIChhIC0gbCkgLyAzXTtcbiAgICAgICAgZS5wdXNoKFtbaSwgcl0sIGMsIGgsIFtvLCBsXV0pO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9QbjIoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3puLCBfem4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9JbiwgX0luMikuY2FsbCh0aGlzKTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGNhbnZhczogdCxcbiAgICAgICAgICBjdHg6IGVcbiAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgIGUuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICBlLmNsZWFyUmVjdCgwLCAwLCB0LndpZHRoLCB0LmhlaWdodCk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3puLCBfem4yKS5jYWxsKHRoaXMpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5iZXppZXJQYXRoMkQpIGUuc3Ryb2tlKHQpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0huMih0KSB7XG4gICAgICAgIHRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybGVhdmVcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mbikpO1xuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wbikpO1xuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZ24pKTtcbiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbW4pKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdW4pKTtcbiAgICAgICAgfSwgMTApO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qbiwgX2puMikuY2FsbCh0aGlzLCB0Lm9mZnNldFgsIHQub2Zmc2V0WSk7XG4gICAgICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpO1xuICAgICAgICB0aGlzLnNldEluQmFja2dyb3VuZCgpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2tuMigpIHtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuY2FudmFzLmNsYXNzTmFtZSA9IFwiaW5rRWRpdG9yQ2FudmFzXCI7XG4gICAgICAgIF9jbGFzczQxLl9sMTBuUHJvbWlzZS5nZXQoXCJlZGl0b3JfaW5rX2NhbnZhc19hcmlhX2xhYmVsXCIpLnRoZW4odCA9PiB7XG4gICAgICAgICAgdmFyIF90aGlzJGNhbnZhcztcbiAgICAgICAgICByZXR1cm4gKF90aGlzJGNhbnZhcyA9IHRoaXMuY2FudmFzKSA9PT0gbnVsbCB8fCBfdGhpcyRjYW52YXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXYuYXBwZW5kKHRoaXMuY2FudmFzKTtcbiAgICAgICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfTW4yKCkge1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX245LCBuZXcgUmVzaXplT2JzZXJ2ZXIodCA9PiB7XG4gICAgICAgICAgY29uc3QgZSA9IHRbMF0uY29udGVudFJlY3Q7XG4gICAgICAgICAgZS53aWR0aCAmJiBlLmhlaWdodCAmJiB0aGlzLnNldERpbWVuc2lvbnMoZS53aWR0aCwgZS5oZWlnaHQpO1xuICAgICAgICB9KSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbjkpLm9ic2VydmUodGhpcy5kaXYpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX1JuMigpIHtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0FuKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBbdCwgZV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gTWF0aC5jZWlsKHRoaXMud2lkdGggKiB0KTtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gTWF0aC5jZWlsKHRoaXMuaGVpZ2h0ICogZSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3puLCBfem4yKS5jYWxsKHRoaXMpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3FuMih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9XbiwgX1duMikuY2FsbCh0aGlzKSxcbiAgICAgICAgICBpID0gKHQgLSBuKSAvIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZG4pLFxuICAgICAgICAgIHIgPSAoZSAtIG4pIC8gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9obik7XG4gICAgICAgIHRoaXMuc2NhbGVGYWN0b3IgPSBNYXRoLm1pbihpLCByKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF96bjIoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9XbiwgX1duMikuY2FsbCh0aGlzKSAvIDI7XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSh0aGlzLnNjYWxlRmFjdG9yLCAwLCAwLCB0aGlzLnNjYWxlRmFjdG9yLCB0aGlzLnRyYW5zbGF0aW9uWCAqIHRoaXMuc2NhbGVGYWN0b3IgKyB0LCB0aGlzLnRyYW5zbGF0aW9uWSAqIHRoaXMuc2NhbGVGYWN0b3IgKyB0KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9Hbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgUGF0aDJEKCk7XG4gICAgICAgIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuKyspIHtcbiAgICAgICAgICBjb25zdCBbaSwgciwgcywgYV0gPSB0W25dO1xuICAgICAgICAgIDAgPT09IG4gJiYgZS5tb3ZlVG8oLi4uaSk7XG4gICAgICAgICAgZS5iZXppZXJDdXJ2ZVRvKHJbMF0sIHJbMV0sIHNbMF0sIHNbMV0sIGFbMF0sIGFbMV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX1ZuKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgW2ksIHIsIHMsIGFdID0gZTtcbiAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgZm9yIChsZXQgZSA9IDAsIG4gPSB0Lmxlbmd0aDsgZSA8IG47IGUgKz0gMikge1xuICAgICAgICAgICAgICB0W2VdICs9IGk7XG4gICAgICAgICAgICAgIHRbZSArIDFdID0gYSAtIHRbZSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgIGZvciAobGV0IGUgPSAwLCBuID0gdC5sZW5ndGg7IGUgPCBuOyBlICs9IDIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IHRbZV07XG4gICAgICAgICAgICAgIHRbZV0gPSB0W2UgKyAxXSArIGk7XG4gICAgICAgICAgICAgIHRbZSArIDFdID0gbiArIHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgIGZvciAobGV0IGUgPSAwLCBuID0gdC5sZW5ndGg7IGUgPCBuOyBlICs9IDIpIHtcbiAgICAgICAgICAgICAgdFtlXSA9IHMgLSB0W2VdO1xuICAgICAgICAgICAgICB0W2UgKyAxXSArPSByO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyNzA6XG4gICAgICAgICAgICBmb3IgKGxldCBlID0gMCwgbiA9IHQubGVuZ3RoOyBlIDwgbjsgZSArPSAyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG4gPSB0W2VdO1xuICAgICAgICAgICAgICB0W2VdID0gcyAtIHRbZSArIDFdO1xuICAgICAgICAgICAgICB0W2UgKyAxXSA9IGEgLSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcm90YXRpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfJG4odCwgZSwgbikge1xuICAgICAgICBjb25zdCBbaSwgciwgcywgYV0gPSBlO1xuICAgICAgICBzd2l0Y2ggKG4pIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBmb3IgKGxldCBlID0gMCwgbiA9IHQubGVuZ3RoOyBlIDwgbjsgZSArPSAyKSB7XG4gICAgICAgICAgICAgIHRbZV0gLT0gaTtcbiAgICAgICAgICAgICAgdFtlICsgMV0gPSBhIC0gdFtlICsgMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgZm9yIChsZXQgZSA9IDAsIG4gPSB0Lmxlbmd0aDsgZSA8IG47IGUgKz0gMikge1xuICAgICAgICAgICAgICBjb25zdCBuID0gdFtlXTtcbiAgICAgICAgICAgICAgdFtlXSA9IHRbZSArIDFdIC0gcjtcbiAgICAgICAgICAgICAgdFtlICsgMV0gPSBuIC0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTgwOlxuICAgICAgICAgICAgZm9yIChsZXQgZSA9IDAsIG4gPSB0Lmxlbmd0aDsgZSA8IG47IGUgKz0gMikge1xuICAgICAgICAgICAgICB0W2VdID0gcyAtIHRbZV07XG4gICAgICAgICAgICAgIHRbZSArIDFdIC09IHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgIGZvciAobGV0IGUgPSAwLCBuID0gdC5sZW5ndGg7IGUgPCBuOyBlICs9IDIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IHRbZV07XG4gICAgICAgICAgICAgIHRbZV0gPSBhIC0gdFtlICsgMV07XG4gICAgICAgICAgICAgIHRbZSArIDFdID0gcyAtIG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9YbjIodCwgZSwgbiwgaSkge1xuICAgICAgICBjb25zdCByID0gW10sXG4gICAgICAgICAgcyA9IHRoaXMudGhpY2tuZXNzIC8gMixcbiAgICAgICAgICBhID0gdCAqIGUgKyBzLFxuICAgICAgICAgIG8gPSB0ICogbiArIHM7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLnBhdGhzKSB7XG4gICAgICAgICAgY29uc3QgbiA9IFtdLFxuICAgICAgICAgICAgcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwLCByID0gZS5sZW5ndGg7IGkgPCByOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IFtsLCBjLCBoLCBkXSA9IGVbaV0sXG4gICAgICAgICAgICAgIHUgPSB0ICogbFswXSArIGEsXG4gICAgICAgICAgICAgIHAgPSB0ICogbFsxXSArIG8sXG4gICAgICAgICAgICAgIGYgPSB0ICogY1swXSArIGEsXG4gICAgICAgICAgICAgIGcgPSB0ICogY1sxXSArIG8sXG4gICAgICAgICAgICAgIG0gPSB0ICogaFswXSArIGEsXG4gICAgICAgICAgICAgIGIgPSB0ICogaFsxXSArIG8sXG4gICAgICAgICAgICAgIHYgPSB0ICogZFswXSArIGEsXG4gICAgICAgICAgICAgIHkgPSB0ICogZFsxXSArIG87XG4gICAgICAgICAgICBpZiAoMCA9PT0gaSkge1xuICAgICAgICAgICAgICBuLnB1c2godSwgcCk7XG4gICAgICAgICAgICAgIHMucHVzaCh1LCBwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG4ucHVzaChmLCBnLCBtLCBiLCB2LCB5KTtcbiAgICAgICAgICAgIHMucHVzaChmLCBnKTtcbiAgICAgICAgICAgIGkgPT09IHIgLSAxICYmIHMucHVzaCh2LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgci5wdXNoKHtcbiAgICAgICAgICAgIGJlemllcjogX2NsYXNzU3RhdGljUHJpdmF0ZU1ldGhvZEdldChfY2xhc3M0MSwgX2NsYXNzNDEsIF9WbikuY2FsbChfY2xhc3M0MSwgbiwgaSwgdGhpcy5yb3RhdGlvbiksXG4gICAgICAgICAgICBwb2ludHM6IF9jbGFzc1N0YXRpY1ByaXZhdGVNZXRob2RHZXQoX2NsYXNzNDEsIF9jbGFzczQxLCBfVm4pLmNhbGwoX2NsYXNzNDEsIHMsIGksIHRoaXMucm90YXRpb24pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfS24yKCkge1xuICAgICAgICBsZXQgdCA9IDEgLyAwLFxuICAgICAgICAgIGUgPSAtMSAvIDAsXG4gICAgICAgICAgbiA9IDEgLyAwLFxuICAgICAgICAgIHIgPSAtMSAvIDA7XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnBhdGhzKSBmb3IgKGNvbnN0IFthLCBvLCBsLCBjXSBvZiBzKSB7XG4gICAgICAgICAgY29uc3QgcyA9IGkuVXRpbC5iZXppZXJCb3VuZGluZ0JveCguLi5hLCAuLi5vLCAuLi5sLCAuLi5jKTtcbiAgICAgICAgICB0ID0gTWF0aC5taW4odCwgc1swXSk7XG4gICAgICAgICAgbiA9IE1hdGgubWluKG4sIHNbMV0pO1xuICAgICAgICAgIGUgPSBNYXRoLm1heChlLCBzWzJdKTtcbiAgICAgICAgICByID0gTWF0aC5tYXgociwgc1szXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0LCBuLCBlLCByXTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9XbjIoKSB7XG4gICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZuKSA/IE1hdGguY2VpbCh0aGlzLnRoaWNrbmVzcyAqIHRoaXMucGFyZW50U2NhbGUpIDogMDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9UbjIoKSB7XG4gICAgICAgIGxldCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybjtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZuKSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfS24sIF9LbjIpLmNhbGwodGhpcyksXG4gICAgICAgICAgbiA9IF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1duLCBfV24yKS5jYWxsKHRoaXMpO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2RuLCBNYXRoLm1heChyLkFubm90YXRpb25FZGl0b3IuTUlOX1NJWkUsIGVbMl0gLSBlWzBdKSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaG4sIE1hdGgubWF4KHIuQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgZVszXSAtIGVbMV0pKTtcbiAgICAgICAgY29uc3QgaSA9IE1hdGguY2VpbChuICsgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9kbikgKiB0aGlzLnNjYWxlRmFjdG9yKSxcbiAgICAgICAgICBzID0gTWF0aC5jZWlsKG4gKyBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2huKSAqIHRoaXMuc2NhbGVGYWN0b3IpLFxuICAgICAgICAgIFthLCBvXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgdGhpcy53aWR0aCA9IGkgLyBhO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHMgLyBvO1xuICAgICAgICB0aGlzLnNldEFzcGVjdFJhdGlvKGksIHMpO1xuICAgICAgICBjb25zdCBsID0gdGhpcy50cmFuc2xhdGlvblgsXG4gICAgICAgICAgYyA9IHRoaXMudHJhbnNsYXRpb25ZO1xuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uWCA9IC1lWzBdO1xuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uWSA9IC1lWzFdO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SbiwgX1JuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfUG4sIF9QbjIpLmNhbGwodGhpcyk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfU24sIGkpO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0VuLCBzKTtcbiAgICAgICAgdGhpcy5zZXREaW1zKGksIHMpO1xuICAgICAgICBjb25zdCBoID0gdCA/IG4gLyB0aGlzLnNjYWxlRmFjdG9yIC8gMiA6IDA7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlKGwgLSB0aGlzLnRyYW5zbGF0aW9uWCAtIGgsIGMgLSB0aGlzLnRyYW5zbGF0aW9uWSAtIGgpO1xuICAgICAgfVxuICAgICAgX2RlZmluZVByb3BlcnR5KElua0VkaXRvciwgXCJfZGVmYXVsdENvbG9yXCIsIG51bGwpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KElua0VkaXRvciwgXCJfZGVmYXVsdE9wYWNpdHlcIiwgMSk7XG4gICAgICBfZGVmaW5lUHJvcGVydHkoSW5rRWRpdG9yLCBcIl9kZWZhdWx0VGhpY2tuZXNzXCIsIDEpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KElua0VkaXRvciwgXCJfbDEwblByb21pc2VcIiwgdm9pZCAwKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShJbmtFZGl0b3IsIFwiX3R5cGVcIiwgXCJpbmtcIik7XG4gICAgICBlLklua0VkaXRvciA9IElua0VkaXRvcjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5TdGFtcEVkaXRvciA9IHZvaWQgMDtcbiAgICAgIG4oMTQ4KTtcbiAgICAgIG4oMTUxKTtcbiAgICAgIHZhciBpID0gbigxNjMpLFxuICAgICAgICByID0gbigxKSxcbiAgICAgICAgcyA9IG4oMTY3KSxcbiAgICAgICAgYSA9IG4oMTk3KTtcbiAgICAgIHZhciBfWW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfSm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfUW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdGkgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbjEwID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2VpID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX25pID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2lpID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2tuMyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9zaSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9haSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9yaSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9vaSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9NbjMgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIFN0YW1wRWRpdG9yIGV4dGVuZHMgaS5Bbm5vdGF0aW9uRWRpdG9yIHtcbiAgICAgICAgY29uc3RydWN0b3IoX3QxOCkge1xuICAgICAgICAgIHN1cGVyKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3QxOCksIHt9LCB7XG4gICAgICAgICAgICBuYW1lOiBcInN0YW1wRWRpdG9yXCJcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9NbjMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfb2kpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfcmkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfYWkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfc2kpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfa24zKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX2lpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfWW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfSm4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfUW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfWm4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfdGksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbjEwLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2VpLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX25pLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWm4sIF90MTguYml0bWFwVXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZW1vdmUoKSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKSB7XG4gICAgICAgICAgICB2YXIgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTUsIF9jbGFzc1ByaXZhdGVGaWVsZEdldDE2O1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZbiwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmRlbGV0ZUlkKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKTtcbiAgICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQxNSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGkpKSA9PT0gbnVsbCB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQxNSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTUucmVtb3ZlKCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3RpLCBudWxsKTtcbiAgICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQxNiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbjEwKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDE2LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbjEwLCBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3VwZXIucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVidWlsZCgpIHtcbiAgICAgICAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHRoaXMuZGl2KSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0puKSAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9paSwgX2lpMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuaXNBdHRhY2hlZFRvRE9NIHx8IHRoaXMucGFyZW50LmFkZCh0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb25jZUFkZGVkKCkge1xuICAgICAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICEwO1xuICAgICAgICAgIHRoaXMucGFyZW50LmFkZFVuZG9hYmxlRWRpdG9yKHRoaXMpO1xuICAgICAgICAgIHRoaXMuZGl2LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNFbXB0eSgpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9RbikgJiYgbnVsbCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZbikgJiYgbnVsbCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9abik7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmVzaXphYmxlKCkge1xuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGl2KSByZXR1cm4gdGhpcy5kaXY7XG4gICAgICAgICAgbGV0IHQsIGU7XG4gICAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHQgPSB0aGlzLng7XG4gICAgICAgICAgICBlID0gdGhpcy55O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdXBlci5yZW5kZXIoKTtcbiAgICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZbikpIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2tuMywgX2tuNCkuY2FsbCh0aGlzKTtlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJsb2FkaW5nXCIpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfaWksIF9paTIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICAgICAgICBjb25zdCBbbiwgaV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgICAgICB0aGlzLnNldEF0KHQgKiBuLCBlICogaSwgdGhpcy53aWR0aCAqIG4sIHRoaXMuaGVpZ2h0ICogaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmRpdjtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZGVzZXJpYWxpemUodCwgZSwgbikge1xuICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgYS5TdGFtcEFubm90YXRpb25FbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjb25zdCBpID0gc3VwZXIuZGVzZXJpYWxpemUodCwgZSwgbiksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJlY3Q6IHIsXG4gICAgICAgICAgICAgIGJpdG1hcFVybDogcyxcbiAgICAgICAgICAgICAgYml0bWFwSWQ6IG8sXG4gICAgICAgICAgICAgIGlzU3ZnOiBsXG4gICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBvICYmIG4uaW1hZ2VNYW5hZ2VyLmlzVmFsaWRJZChvKSA/IF9jbGFzc1ByaXZhdGVGaWVsZFNldChpLCBfSm4sIG8pIDogX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGksIF9abiwgcyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGksIF9uaSwgbCk7XG4gICAgICAgICAgY29uc3QgW2MsIGhdID0gaS5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgICBpLndpZHRoID0gKHJbMl0gLSByWzBdKSAvIGM7XG4gICAgICAgICAgaS5oZWlnaHQgPSAoclszXSAtIHJbMV0pIC8gaDtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSAmJiBhcmd1bWVudHNbMF0sXG4gICAgICAgICAgICBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgY29uc3QgbiA9IHtcbiAgICAgICAgICAgIGFubm90YXRpb25UeXBlOiByLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QLFxuICAgICAgICAgICAgYml0bWFwSWQ6IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pLFxuICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgICAgICAgIHJlY3Q6IHRoaXMuZ2V0UmVjdCgwLCAwKSxcbiAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuICAgICAgICAgICAgaXNTdmc6IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbmkpXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgbi5iaXRtYXBVcmwgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9vaSwgX29pMikuY2FsbCh0aGlzLCAhMCk7XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG51bGwgPT09IGUpIHJldHVybiBuO1xuICAgICAgICAgIGUuc3RhbXBzIHx8IChlLnN0YW1wcyA9IG5ldyBNYXAoKSk7XG4gICAgICAgICAgY29uc3QgaSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbmkpID8gKG4ucmVjdFsyXSAtIG4ucmVjdFswXSkgKiAobi5yZWN0WzNdIC0gbi5yZWN0WzFdKSA6IG51bGw7XG4gICAgICAgICAgaWYgKGUuc3RhbXBzLmhhcyhfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0puKSkpIHtcbiAgICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX25pKSkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZS5zdGFtcHMuZ2V0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKTtcbiAgICAgICAgICAgICAgaWYgKGkgPiB0LmFyZWEpIHtcbiAgICAgICAgICAgICAgICB0LmFyZWEgPSBpO1xuICAgICAgICAgICAgICAgIHQuc2VyaWFsaXplZC5iaXRtYXAuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0LnNlcmlhbGl6ZWQuYml0bWFwID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfb2ksIF9vaTIpLmNhbGwodGhpcywgITEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGUuc3RhbXBzLnNldChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0puKSwge1xuICAgICAgICAgICAgICBhcmVhOiBpLFxuICAgICAgICAgICAgICBzZXJpYWxpemVkOiBuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG4uYml0bWFwID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfb2ksIF9vaTIpLmNhbGwodGhpcywgITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2lpMigpIHtcbiAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKSB7XG4gICAgICAgICAgdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tSWQoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9KbikpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1luLCB0LmJpdG1hcCk7XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2tuMywgX2tuNCkuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLnJlbW92ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9abikpIHtcbiAgICAgICAgICBjb25zdCB0ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9abik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9abiwgbnVsbCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9RbiwgdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tVXJsKHQpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1FuLCBudWxsKTtcbiAgICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgYml0bWFwOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfWW4pLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlkOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfSm4pLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzU3ZnOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfbmkpLnZhbHVlXG4gICAgICAgICAgICAgIH0gPSB0KTtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa24zLCBfa240KS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfSBlbHNlIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICB0LnR5cGUgPSBcImZpbGVcIjtcbiAgICAgICAgdC5hY2NlcHQgPSBcImltYWdlLypcIjtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9RbiwgbmV3IFByb21pc2UoZSA9PiB7XG4gICAgICAgICAgdC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfUW4sIG51bGwpO1xuICAgICAgICAgICAgaWYgKHQuZmlsZXMgJiYgMCAhPT0gdC5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IGF3YWl0IHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0RnJvbUZpbGUodC5maWxlc1swXSk7XG4gICAgICAgICAgICAgIGlmICghZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgYml0bWFwOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfWW4pLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlkOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfSm4pLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzU3ZnOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfbmkpLnZhbHVlXG4gICAgICAgICAgICAgIH0gPSBlKTtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa24zLCBfa240KS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfSBlbHNlIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgICAgICBlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5hZGRFdmVudExpc3RlbmVyKFwiY2FuY2VsXCIsICgpID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfUW4sIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgICAgIGUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0LmNsaWNrKCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfa240KCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZGl2OiB0XG4gICAgICAgIH0gPSB0aGlzO1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgIGhlaWdodDogblxuICAgICAgICB9ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9Zbik7XG4gICAgICAgIGNvbnN0IFtpLCByXSA9IHRoaXMucGFnZURpbWVuc2lvbnMsXG4gICAgICAgICAgcyA9IC43NTtcbiAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICBlID0gdGhpcy53aWR0aCAqIGk7XG4gICAgICAgICAgbiA9IHRoaXMuaGVpZ2h0ICogcjtcbiAgICAgICAgfSBlbHNlIGlmIChlID4gcyAqIGkgfHwgbiA+IHMgKiByKSB7XG4gICAgICAgICAgY29uc3QgdCA9IE1hdGgubWluKHMgKiBpIC8gZSwgcyAqIHIgLyBuKTtcbiAgICAgICAgICBlICo9IHQ7XG4gICAgICAgICAgbiAqPSB0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFthLCBvXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgdGhpcy5zZXREaW1zKGUgKiBhIC8gaSwgbiAqIG8gLyByKTtcbiAgICAgICAgY29uc3QgbCA9IF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfdGksIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpO1xuICAgICAgICB0LmFwcGVuZChsKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcmksIF9yaTIpLmNhbGwodGhpcywgZSwgbik7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX01uMywgX01uNCkuY2FsbCh0aGlzKTtcbiAgICAgICAgdC5jbGFzc0xpc3QucmVtb3ZlKFwibG9hZGluZ1wiKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9zaTIodCwgZSkge1xuICAgICAgICBjb25zdCBbbiwgaV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgIHRoaXMud2lkdGggPSB0IC8gbjtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBlIC8gaTtcbiAgICAgICAgdGhpcy5zZXREaW1zKHQsIGUpO1xuICAgICAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgICAgIG51bGwgIT09IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZWkpICYmIGNsZWFyVGltZW91dChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2VpKSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfZWksIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfZWksIG51bGwpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3JpLCBfcmkyKS5jYWxsKHRoaXMsIHQsIGUpO1xuICAgICAgICB9LCAyMDApKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9haTIodCwgZSkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgd2lkdGg6IG4sXG4gICAgICAgICAgaGVpZ2h0OiBpXG4gICAgICAgIH0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1luKTtcbiAgICAgICAgbGV0IHIgPSBuLFxuICAgICAgICAgIHMgPSBpLFxuICAgICAgICAgIGEgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1luKTtcbiAgICAgICAgZm9yICg7IHIgPiAyICogdCB8fCBzID4gMiAqIGU7KSB7XG4gICAgICAgICAgY29uc3QgbiA9IHIsXG4gICAgICAgICAgICBpID0gcztcbiAgICAgICAgICByID4gMiAqIHQgJiYgKHIgPSByID49IDE2Mzg0ID8gTWF0aC5mbG9vcihyIC8gMikgLSAxIDogTWF0aC5jZWlsKHIgLyAyKSk7XG4gICAgICAgICAgcyA+IDIgKiBlICYmIChzID0gcyA+PSAxNjM4NCA/IE1hdGguZmxvb3IocyAvIDIpIC0gMSA6IE1hdGguY2VpbChzIC8gMikpO1xuICAgICAgICAgIGNvbnN0IG8gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHIsIHMpO1xuICAgICAgICAgIG8uZ2V0Q29udGV4dChcIjJkXCIpLmRyYXdJbWFnZShhLCAwLCAwLCBuLCBpLCAwLCAwLCByLCBzKTtcbiAgICAgICAgICBhID0gby50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9yaTIodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90aSk7XG4gICAgICAgIGlmICghbiB8fCBuLndpZHRoID09PSB0ICYmIG4uaGVpZ2h0ID09PSBlKSByZXR1cm47XG4gICAgICAgIG4ud2lkdGggPSB0O1xuICAgICAgICBuLmhlaWdodCA9IGU7XG4gICAgICAgIGNvbnN0IGkgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX25pKSA/IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWW4pIDogX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfYWksIF9haTIpLmNhbGwodGhpcywgdCwgZSksXG4gICAgICAgICAgciA9IG4uZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICByLmZpbHRlciA9IHRoaXMuX3VpTWFuYWdlci5oY21GaWx0ZXI7XG4gICAgICAgIHIuZHJhd0ltYWdlKGksIDAsIDAsIGkud2lkdGgsIGkuaGVpZ2h0LCAwLCAwLCB0LCBlKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9vaTIodCkge1xuICAgICAgICBpZiAodCkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX25pKSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0U3ZnVXJsKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKTtcbiAgICAgICAgICAgIGlmICh0KSByZXR1cm4gdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIHdpZHRoOiB0LndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB0LmhlaWdodFxuICAgICAgICAgIH0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1luKSk7XG4gICAgICAgICAgdC5nZXRDb250ZXh0KFwiMmRcIikuZHJhd0ltYWdlKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWW4pLCAwLCAwKTtcbiAgICAgICAgICByZXR1cm4gdC50b0RhdGFVUkwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9uaSkpIHtcbiAgICAgICAgICBjb25zdCBbdCwgZV0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zLFxuICAgICAgICAgICAgbiA9IE1hdGgucm91bmQodGhpcy53aWR0aCAqIHQgKiBzLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyksXG4gICAgICAgICAgICBpID0gTWF0aC5yb3VuZCh0aGlzLmhlaWdodCAqIGUgKiBzLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyksXG4gICAgICAgICAgICByID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhuLCBpKTtcbiAgICAgICAgICByLmdldENvbnRleHQoXCIyZFwiKS5kcmF3SW1hZ2UoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZbiksIDAsIDAsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWW4pLndpZHRoLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1luKS5oZWlnaHQsIDAsIDAsIG4sIGkpO1xuICAgICAgICAgIHJldHVybiByLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZbikpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX01uNCgpIHtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9uMTAsIG5ldyBSZXNpemVPYnNlcnZlcih0ID0+IHtcbiAgICAgICAgICBjb25zdCBlID0gdFswXS5jb250ZW50UmVjdDtcbiAgICAgICAgICBlLndpZHRoICYmIGUuaGVpZ2h0ICYmIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3NpLCBfc2kyKS5jYWxsKHRoaXMsIGUud2lkdGgsIGUuaGVpZ2h0KTtcbiAgICAgICAgfSkpO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX24xMCkub2JzZXJ2ZSh0aGlzLmRpdik7XG4gICAgICB9XG4gICAgICBfZGVmaW5lUHJvcGVydHkoU3RhbXBFZGl0b3IsIFwiX3R5cGVcIiwgXCJzdGFtcFwiKTtcbiAgICAgIGUuU3RhbXBFZGl0b3IgPSBTdGFtcEVkaXRvcjtcbiAgICB9XSxcbiAgICBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbiAgZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyh0KSB7XG4gICAgdmFyIGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bdF07XG4gICAgaWYgKHZvaWQgMCAhPT0gZSkgcmV0dXJuIGUuZXhwb3J0cztcbiAgICB2YXIgbiA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1t0XSA9IHtcbiAgICAgIGV4cG9ydHM6IHt9XG4gICAgfTtcbiAgICBfX3dlYnBhY2tfbW9kdWxlc19fW3RdLmNhbGwobi5leHBvcnRzLCBuLCBuLmV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pO1xuICAgIHJldHVybiBuLmV4cG9ydHM7XG4gIH1cbiAgdmFyIF9fbmVzdGVkX3dlYnBhY2tfZXhwb3J0c19fID0ge307XG4gICgoKSA9PiB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICB2YXIgdCA9IF9fbmVzdGVkX3dlYnBhY2tfZXhwb3J0c19fO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQWJvcnRFeGNlcHRpb25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuQWJvcnRFeGNlcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQW5ub3RhdGlvbkVkaXRvckxheWVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBzLkFubm90YXRpb25FZGl0b3JMYXllcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbm5vdGF0aW9uRWRpdG9yVHlwZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5Bbm5vdGF0aW9uRWRpdG9yVHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBhLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQW5ub3RhdGlvbkxheWVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBvLkFubm90YXRpb25MYXllcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbm5vdGF0aW9uTW9kZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5Bbm5vdGF0aW9uTW9kZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDTWFwQ29tcHJlc3Npb25UeXBlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlLkNNYXBDb21wcmVzc2lvblR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRmVhdHVyZVRlc3RcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuRmVhdHVyZVRlc3Q7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiR2xvYmFsV29ya2VyT3B0aW9uc1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbC5HbG9iYWxXb3JrZXJPcHRpb25zO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkltYWdlS2luZFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5JbWFnZUtpbmQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSW52YWxpZFBERkV4Y2VwdGlvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5JbnZhbGlkUERGRXhjZXB0aW9uO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIk1pc3NpbmdQREZFeGNlcHRpb25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuTWlzc2luZ1BERkV4Y2VwdGlvbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJPUFNcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuT1BTO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlBERkRhdGFSYW5nZVRyYW5zcG9ydFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbi5QREZEYXRhUmFuZ2VUcmFuc3BvcnQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUERGRGF0ZVN0cmluZ1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5QREZEYXRlU3RyaW5nO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlBERldvcmtlclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbi5QREZXb3JrZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUGFzc3dvcmRSZXNwb25zZXNcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuUGFzc3dvcmRSZXNwb25zZXM7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUGVybWlzc2lvbkZsYWdcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuUGVybWlzc2lvbkZsYWc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUGl4ZWxzUGVySW5jaFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5QaXhlbHNQZXJJbmNoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlByb21pc2VDYXBhYmlsaXR5XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlLlByb21pc2VDYXBhYmlsaXR5O1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU1ZHR3JhcGhpY3NcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG4uU1ZHR3JhcGhpY3M7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJVdGlsXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlLlV0aWw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVmVyYm9zaXR5TGV2ZWxcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuVmVyYm9zaXR5TGV2ZWw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiWGZhTGF5ZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGMuWGZhTGF5ZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiYnVpbGRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG4uYnVpbGQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiY3JlYXRlVmFsaWRBYnNvbHV0ZVVybFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5jcmVhdGVWYWxpZEFic29sdXRlVXJsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcImdldERvY3VtZW50XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBuLmdldERvY3VtZW50O1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcImdldEZpbGVuYW1lRnJvbVVybFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5nZXRGaWxlbmFtZUZyb21Vcmw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiZ2V0UGRmRmlsZW5hbWVGcm9tVXJsXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLmdldFBkZkZpbGVuYW1lRnJvbVVybDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJnZXRYZmFQYWdlVmlld3BvcnRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGkuZ2V0WGZhUGFnZVZpZXdwb3J0O1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcImlzRGF0YVNjaGVtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5pc0RhdGFTY2hlbWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiaXNQZGZGaWxlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLmlzUGRmRmlsZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJsb2FkU2NyaXB0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLmxvYWRTY3JpcHQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwibm9ybWFsaXplVW5pY29kZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5ub3JtYWxpemVVbmljb2RlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcInJlbmRlclRleHRMYXllclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gci5yZW5kZXJUZXh0TGF5ZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwic2V0TGF5ZXJEaW1lbnNpb25zXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLnNldExheWVyRGltZW5zaW9ucztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJzaGFkb3dcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuc2hhZG93O1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcInVwZGF0ZVRleHRMYXllclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gci51cGRhdGVUZXh0TGF5ZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwidmVyc2lvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbi52ZXJzaW9uO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBlID0gX193X3BkZmpzX3JlcXVpcmVfXygxKSxcbiAgICAgIG4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyNCksXG4gICAgICBpID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjcpLFxuICAgICAgciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTk0KSxcbiAgICAgIHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5NSksXG4gICAgICBhID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjQpLFxuICAgICAgbyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTk3KSxcbiAgICAgIGwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3NSksXG4gICAgICBjID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDApO1xuICB9KSgpO1xuICByZXR1cm4gX19uZXN0ZWRfd2VicGFja19leHBvcnRzX187XG59KSgpKTtcblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9wZGYuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIHRyeVRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90cnktdG8tc3RyaW5nLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogSXNDYWxsYWJsZShhcmd1bWVudCkgaXMgdHJ1ZWBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc0NhbGxhYmxlKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgdHJ5VG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RyeS10by1zdHJpbmcuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSBpcyB0cnVlYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzQ29uc3RydWN0b3IoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmICh0eXBlb2YgYXJndW1lbnQgPT0gJ29iamVjdCcgfHwgaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgJFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArICRTdHJpbmcoYXJndW1lbnQpICsgJyBhcyBhIHByb3RvdHlwZScpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLXBvc3NpYmxlLXByb3RvdHlwZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanNcIikuZik7XG5cbnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5pZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkge1xuICBkZWZpbmVQcm9wZXJ0eShBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IGNyZWF0ZShudWxsKVxuICB9KTtcbn1cblxuLy8gYWRkIGEga2V5IHRvIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjaGFyQXQgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzXCIpLmNoYXJBdCk7XG5cbi8vIGBBZHZhbmNlU3RyaW5nSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFMsIGluZGV4LCB1bmljb2RlKSB7XG4gIHJldHVybiBpbmRleCArICh1bmljb2RlID8gY2hhckF0KFMsIGluZGV4KS5sZW5ndGggOiAxKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGlzUHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUHJvdG90eXBlKSB7XG4gIGlmIChpc1Byb3RvdHlwZU9mKFByb3RvdHlwZSwgaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93ICRUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xuXG52YXIgJFN0cmluZyA9IFN0cmluZztcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBUeXBlKGFyZ3VtZW50KSBpcyBPYmplY3RgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNPYmplY3QoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93ICRUeXBlRXJyb3IoJFN0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1iYXNpYy1kZXRlY3Rpb24uanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXR5cGVkLWFycmF5cyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgRGF0YVZpZXcgIT0gJ3VuZGVmaW5lZCc7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLWJhc2ljLWRldGVjdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItbm9uLWV4dGVuc2libGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gRkYyNi0gYnVnOiBBcnJheUJ1ZmZlcnMgYXJlIG5vbi1leHRlbnNpYmxlLCBidXQgT2JqZWN0LmlzRXh0ZW5zaWJsZSBkb2VzIG5vdCByZXBvcnQgaXRcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig4KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSwgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBpZiAoT2JqZWN0LmlzRXh0ZW5zaWJsZShidWZmZXIpKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVmZmVyLCAnYScsIHsgdmFsdWU6IDggfSk7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1ub24tZXh0ZW5zaWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1iYXNpYy1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItYmFzaWMtZGV0ZWN0aW9uLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzXCIpO1xudmFyIHRyeVRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90cnktdG8tc3RyaW5nLmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcbnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdWlkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzXCIpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qc1wiKTtcblxudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5O1xudmFyIEludDhBcnJheVByb3RvdHlwZSA9IEludDhBcnJheSAmJiBJbnQ4QXJyYXkucHJvdG90eXBlO1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5ID0gZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5O1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlID0gVWludDhDbGFtcGVkQXJyYXkgJiYgVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlO1xudmFyIFR5cGVkQXJyYXkgPSBJbnQ4QXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5KTtcbnZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gSW50OEFycmF5UHJvdG90eXBlICYmIGdldFByb3RvdHlwZU9mKEludDhBcnJheVByb3RvdHlwZSk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciBUWVBFRF9BUlJBWV9UQUcgPSB1aWQoJ1RZUEVEX0FSUkFZX1RBRycpO1xudmFyIFRZUEVEX0FSUkFZX0NPTlNUUlVDVE9SID0gJ1R5cGVkQXJyYXlDb25zdHJ1Y3Rvcic7XG4vLyBGaXhpbmcgbmF0aXZlIHR5cGVkIGFycmF5cyBpbiBPcGVyYSBQcmVzdG8gY3Jhc2hlcyB0aGUgYnJvd3Nlciwgc2VlICM1OTVcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gTkFUSVZFX0FSUkFZX0JVRkZFUiAmJiAhIXNldFByb3RvdHlwZU9mICYmIGNsYXNzb2YoZ2xvYmFsLm9wZXJhKSAhPT0gJ09wZXJhJztcbnZhciBUWVBFRF9BUlJBWV9UQUdfUkVRVUlSRUQgPSBmYWxzZTtcbnZhciBOQU1FLCBDb25zdHJ1Y3RvciwgUHJvdG90eXBlO1xuXG52YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QgPSB7XG4gIEludDhBcnJheTogMSxcbiAgVWludDhBcnJheTogMSxcbiAgVWludDhDbGFtcGVkQXJyYXk6IDEsXG4gIEludDE2QXJyYXk6IDIsXG4gIFVpbnQxNkFycmF5OiAyLFxuICBJbnQzMkFycmF5OiA0LFxuICBVaW50MzJBcnJheTogNCxcbiAgRmxvYXQzMkFycmF5OiA0LFxuICBGbG9hdDY0QXJyYXk6IDhcbn07XG5cbnZhciBCaWdJbnRBcnJheUNvbnN0cnVjdG9yc0xpc3QgPSB7XG4gIEJpZ0ludDY0QXJyYXk6IDgsXG4gIEJpZ1VpbnQ2NEFycmF5OiA4XG59O1xuXG52YXIgaXNWaWV3ID0gZnVuY3Rpb24gaXNWaWV3KGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gZmFsc2U7XG4gIHZhciBrbGFzcyA9IGNsYXNzb2YoaXQpO1xuICByZXR1cm4ga2xhc3MgPT09ICdEYXRhVmlldydcbiAgICB8fCBoYXNPd24oVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIGtsYXNzKVxuICAgIHx8IGhhc093bihCaWdJbnRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIGtsYXNzKTtcbn07XG5cbnZhciBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlT2YoaXQpO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSkgcmV0dXJuO1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb3RvKTtcbiAgcmV0dXJuIChzdGF0ZSAmJiBoYXNPd24oc3RhdGUsIFRZUEVEX0FSUkFZX0NPTlNUUlVDVE9SKSkgPyBzdGF0ZVtUWVBFRF9BUlJBWV9DT05TVFJVQ1RPUl0gOiBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IocHJvdG8pO1xufTtcblxudmFyIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGZhbHNlO1xuICB2YXIga2xhc3MgPSBjbGFzc29mKGl0KTtcbiAgcmV0dXJuIGhhc093bihUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpXG4gICAgfHwgaGFzT3duKEJpZ0ludEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpO1xufTtcblxudmFyIGFUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc1R5cGVkQXJyYXkoaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5Jyk7XG59O1xuXG52YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChDKSB7XG4gIGlmIChpc0NhbGxhYmxlKEMpICYmICghc2V0UHJvdG90eXBlT2YgfHwgaXNQcm90b3R5cGVPZihUeXBlZEFycmF5LCBDKSkpIHJldHVybiBDO1xuICB0aHJvdyBUeXBlRXJyb3IodHJ5VG9TdHJpbmcoQykgKyAnIGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yJyk7XG59O1xuXG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IGZ1bmN0aW9uIChLRVksIHByb3BlcnR5LCBmb3JjZWQsIG9wdGlvbnMpIHtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuO1xuICBpZiAoZm9yY2VkKSBmb3IgKHZhciBBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgaGFzT3duKFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIEtFWSkpIHRyeSB7XG4gICAgICBkZWxldGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZVtLRVldO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBvbGQgV2ViS2l0IGJ1ZyAtIHNvbWUgbWV0aG9kcyBhcmUgbm9uLWNvbmZpZ3VyYWJsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZVtLRVldID0gcHJvcGVydHk7XG4gICAgICB9IGNhdGNoIChlcnJvcjIpIHsgLyogZW1wdHkgKi8gfVxuICAgIH1cbiAgfVxuICBpZiAoIVR5cGVkQXJyYXlQcm90b3R5cGVbS0VZXSB8fCBmb3JjZWQpIHtcbiAgICBkZWZpbmVCdWlsdEluKFR5cGVkQXJyYXlQcm90b3R5cGUsIEtFWSwgZm9yY2VkID8gcHJvcGVydHlcbiAgICAgIDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlQcm90b3R5cGVbS0VZXSB8fCBwcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG5cbnZhciBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kID0gZnVuY3Rpb24gKEtFWSwgcHJvcGVydHksIGZvcmNlZCkge1xuICB2YXIgQVJSQVksIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuO1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICBpZiAoZm9yY2VkKSBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXNPd24oVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBLRVkpKSB0cnkge1xuICAgICAgICBkZWxldGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV07XG4gICAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gICAgfVxuICAgIGlmICghVHlwZWRBcnJheVtLRVldIHx8IGZvcmNlZCkge1xuICAgICAgLy8gVjggfiBDaHJvbWUgNDktNTAgYCVUeXBlZEFycmF5JWAgbWV0aG9kcyBhcmUgbm9uLXdyaXRhYmxlIG5vbi1jb25maWd1cmFibGVcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVCdWlsdEluKFR5cGVkQXJyYXksIEtFWSwgZm9yY2VkID8gcHJvcGVydHkgOiBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIFR5cGVkQXJyYXlbS0VZXSB8fCBwcm9wZXJ0eSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gICAgfSBlbHNlIHJldHVybjtcbiAgfVxuICBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTtcbiAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmICghVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV0gfHwgZm9yY2VkKSkge1xuICAgICAgZGVmaW5lQnVpbHRJbihUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSwgcHJvcGVydHkpO1xuICAgIH1cbiAgfVxufTtcblxuZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gIENvbnN0cnVjdG9yID0gZ2xvYmFsW05BTUVdO1xuICBQcm90b3R5cGUgPSBDb25zdHJ1Y3RvciAmJiBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIGlmIChQcm90b3R5cGUpIGVuZm9yY2VJbnRlcm5hbFN0YXRlKFByb3RvdHlwZSlbVFlQRURfQVJSQVlfQ09OU1RSVUNUT1JdID0gQ29uc3RydWN0b3I7XG4gIGVsc2UgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IGZhbHNlO1xufVxuXG5mb3IgKE5BTUUgaW4gQmlnSW50QXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gIENvbnN0cnVjdG9yID0gZ2xvYmFsW05BTUVdO1xuICBQcm90b3R5cGUgPSBDb25zdHJ1Y3RvciAmJiBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIGlmIChQcm90b3R5cGUpIGVuZm9yY2VJbnRlcm5hbFN0YXRlKFByb3RvdHlwZSlbVFlQRURfQVJSQVlfQ09OU1RSVUNUT1JdID0gQ29uc3RydWN0b3I7XG59XG5cbi8vIFdlYktpdCBidWcgLSB0eXBlZCBhcnJheXMgY29uc3RydWN0b3JzIHByb3RvdHlwZSBpcyBPYmplY3QucHJvdG90eXBlXG5pZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgIWlzQ2FsbGFibGUoVHlwZWRBcnJheSkgfHwgVHlwZWRBcnJheSA9PT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gc2FmZVxuICBUeXBlZEFycmF5ID0gZnVuY3Rpb24gVHlwZWRBcnJheSgpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG4gIH07XG4gIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICBpZiAoZ2xvYmFsW05BTUVdKSBzZXRQcm90b3R5cGVPZihnbG9iYWxbTkFNRV0sIFR5cGVkQXJyYXkpO1xuICB9XG59XG5cbmlmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCAhVHlwZWRBcnJheVByb3RvdHlwZSB8fCBUeXBlZEFycmF5UHJvdG90eXBlID09PSBPYmplY3RQcm90b3R5cGUpIHtcbiAgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXkucHJvdG90eXBlO1xuICBpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUykgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgaWYgKGdsb2JhbFtOQU1FXSkgc2V0UHJvdG90eXBlT2YoZ2xvYmFsW05BTUVdLnByb3RvdHlwZSwgVHlwZWRBcnJheVByb3RvdHlwZSk7XG4gIH1cbn1cblxuLy8gV2ViS2l0IGJ1ZyAtIG9uZSBtb3JlIG9iamVjdCBpbiBVaW50OENsYW1wZWRBcnJheSBwcm90b3R5cGUgY2hhaW5cbmlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIGdldFByb3RvdHlwZU9mKFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlKSAhPT0gVHlwZWRBcnJheVByb3RvdHlwZSkge1xuICBzZXRQcm90b3R5cGVPZihVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSwgVHlwZWRBcnJheVByb3RvdHlwZSk7XG59XG5cbmlmIChERVNDUklQVE9SUyAmJiAhaGFzT3duKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gIFRZUEVEX0FSUkFZX1RBR19SRVFVSVJFRCA9IHRydWU7XG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KHRoaXMpID8gdGhpc1tUWVBFRF9BUlJBWV9UQUddIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfSk7XG4gIGZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgaWYgKGdsb2JhbFtOQU1FXSkge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShnbG9iYWxbTkFNRV0sIFRZUEVEX0FSUkFZX1RBRywgTkFNRSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MsXG4gIFRZUEVEX0FSUkFZX1RBRzogVFlQRURfQVJSQVlfVEFHX1JFUVVJUkVEICYmIFRZUEVEX0FSUkFZX1RBRyxcbiAgYVR5cGVkQXJyYXk6IGFUeXBlZEFycmF5LFxuICBhVHlwZWRBcnJheUNvbnN0cnVjdG9yOiBhVHlwZWRBcnJheUNvbnN0cnVjdG9yLFxuICBleHBvcnRUeXBlZEFycmF5TWV0aG9kOiBleHBvcnRUeXBlZEFycmF5TWV0aG9kLFxuICBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kOiBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kLFxuICBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3I6IGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgaXNWaWV3OiBpc1ZpZXcsXG4gIGlzVHlwZWRBcnJheTogaXNUeXBlZEFycmF5LFxuICBUeXBlZEFycmF5OiBUeXBlZEFycmF5LFxuICBUeXBlZEFycmF5UHJvdG90eXBlOiBUeXBlZEFycmF5UHJvdG90eXBlXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIE5BVElWRV9BUlJBWV9CVUZGRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLWJhc2ljLWRldGVjdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1iYXNpYy1kZXRlY3Rpb24uanNcIik7XG52YXIgRnVuY3Rpb25OYW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdElucyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW5zICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qc1wiKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciB0b0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXguanNcIik7XG52YXIgSUVFRTc1NCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pZWVlNzU0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWVlZTc1NC5qc1wiKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qc1wiKS5mKTtcbnZhciBhcnJheUZpbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktZmlsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZpbGwuanNcIik7XG52YXIgYXJyYXlTbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUuanNcIik7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG5cbnZhciBQUk9QRVJfRlVOQ1RJT05fTkFNRSA9IEZ1bmN0aW9uTmFtZS5QUk9QRVI7XG52YXIgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuQ09ORklHVVJBQkxFO1xudmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG52YXIgREFUQV9WSUVXID0gJ0RhdGFWaWV3JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoJztcbnZhciBXUk9OR19JTkRFWCA9ICdXcm9uZyBpbmRleCc7XG52YXIgZ2V0SW50ZXJuYWxBcnJheUJ1ZmZlclN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoQVJSQVlfQlVGRkVSKTtcbnZhciBnZXRJbnRlcm5hbERhdGFWaWV3U3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihEQVRBX1ZJRVcpO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBOYXRpdmVBcnJheUJ1ZmZlciA9IGdsb2JhbFtBUlJBWV9CVUZGRVJdO1xudmFyICRBcnJheUJ1ZmZlciA9IE5hdGl2ZUFycmF5QnVmZmVyO1xudmFyIEFycmF5QnVmZmVyUHJvdG90eXBlID0gJEFycmF5QnVmZmVyICYmICRBcnJheUJ1ZmZlcltQUk9UT1RZUEVdO1xudmFyICREYXRhVmlldyA9IGdsb2JhbFtEQVRBX1ZJRVddO1xudmFyIERhdGFWaWV3UHJvdG90eXBlID0gJERhdGFWaWV3ICYmICREYXRhVmlld1tQUk9UT1RZUEVdO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG52YXIgQXJyYXkgPSBnbG9iYWwuQXJyYXk7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xudmFyIGZpbGwgPSB1bmN1cnJ5VGhpcyhhcnJheUZpbGwpO1xudmFyIHJldmVyc2UgPSB1bmN1cnJ5VGhpcyhbXS5yZXZlcnNlKTtcblxudmFyIHBhY2tJRUVFNzU0ID0gSUVFRTc1NC5wYWNrO1xudmFyIHVucGFja0lFRUU3NTQgPSBJRUVFNzU0LnVucGFjaztcblxudmFyIHBhY2tJbnQ4ID0gZnVuY3Rpb24gKG51bWJlcikge1xuICByZXR1cm4gW251bWJlciAmIDB4RkZdO1xufTtcblxudmFyIHBhY2tJbnQxNiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIFtudW1iZXIgJiAweEZGLCBudW1iZXIgPj4gOCAmIDB4RkZdO1xufTtcblxudmFyIHBhY2tJbnQzMiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIFtudW1iZXIgJiAweEZGLCBudW1iZXIgPj4gOCAmIDB4RkYsIG51bWJlciA+PiAxNiAmIDB4RkYsIG51bWJlciA+PiAyNCAmIDB4RkZdO1xufTtcblxudmFyIHVucGFja0ludDMyID0gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICByZXR1cm4gYnVmZmVyWzNdIDw8IDI0IHwgYnVmZmVyWzJdIDw8IDE2IHwgYnVmZmVyWzFdIDw8IDggfCBidWZmZXJbMF07XG59O1xuXG52YXIgcGFja0Zsb2F0MzIgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gIHJldHVybiBwYWNrSUVFRTc1NChudW1iZXIsIDIzLCA0KTtcbn07XG5cbnZhciBwYWNrRmxvYXQ2NCA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KG51bWJlciwgNTIsIDgpO1xufTtcblxudmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChDb25zdHJ1Y3Rvciwga2V5LCBnZXRJbnRlcm5hbFN0YXRlKSB7XG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihDb25zdHJ1Y3RvcltQUk9UT1RZUEVdLCBrZXksIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKVtrZXldO1xuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgZ2V0ID0gZnVuY3Rpb24gKHZpZXcsIGNvdW50LCBpbmRleCwgaXNMaXR0bGVFbmRpYW4pIHtcbiAgdmFyIHN0b3JlID0gZ2V0SW50ZXJuYWxEYXRhVmlld1N0YXRlKHZpZXcpO1xuICB2YXIgaW50SW5kZXggPSB0b0luZGV4KGluZGV4KTtcbiAgdmFyIGJvb2xJc0xpdHRsZUVuZGlhbiA9ICEhaXNMaXR0bGVFbmRpYW47XG4gIGlmIChpbnRJbmRleCArIGNvdW50ID4gc3RvcmUuYnl0ZUxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBieXRlcyA9IHN0b3JlLmJ5dGVzO1xuICB2YXIgc3RhcnQgPSBpbnRJbmRleCArIHN0b3JlLmJ5dGVPZmZzZXQ7XG4gIHZhciBwYWNrID0gYXJyYXlTbGljZShieXRlcywgc3RhcnQsIHN0YXJ0ICsgY291bnQpO1xuICByZXR1cm4gYm9vbElzTGl0dGxlRW5kaWFuID8gcGFjayA6IHJldmVyc2UocGFjayk7XG59O1xuXG52YXIgc2V0ID0gZnVuY3Rpb24gKHZpZXcsIGNvdW50LCBpbmRleCwgY29udmVyc2lvbiwgdmFsdWUsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHZhciBzdG9yZSA9IGdldEludGVybmFsRGF0YVZpZXdTdGF0ZSh2aWV3KTtcbiAgdmFyIGludEluZGV4ID0gdG9JbmRleChpbmRleCk7XG4gIHZhciBwYWNrID0gY29udmVyc2lvbigrdmFsdWUpO1xuICB2YXIgYm9vbElzTGl0dGxlRW5kaWFuID0gISFpc0xpdHRsZUVuZGlhbjtcbiAgaWYgKGludEluZGV4ICsgY291bnQgPiBzdG9yZS5ieXRlTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIGJ5dGVzID0gc3RvcmUuYnl0ZXM7XG4gIHZhciBzdGFydCA9IGludEluZGV4ICsgc3RvcmUuYnl0ZU9mZnNldDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSBieXRlc1tzdGFydCArIGldID0gcGFja1tib29sSXNMaXR0bGVFbmRpYW4gPyBpIDogY291bnQgLSBpIC0gMV07XG59O1xuXG5pZiAoIU5BVElWRV9BUlJBWV9CVUZGRVIpIHtcbiAgJEFycmF5QnVmZmVyID0gZnVuY3Rpb24gQXJyYXlCdWZmZXIobGVuZ3RoKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBBcnJheUJ1ZmZlclByb3RvdHlwZSk7XG4gICAgdmFyIGJ5dGVMZW5ndGggPSB0b0luZGV4KGxlbmd0aCk7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBBUlJBWV9CVUZGRVIsXG4gICAgICBieXRlczogZmlsbChBcnJheShieXRlTGVuZ3RoKSwgMCksXG4gICAgICBieXRlTGVuZ3RoOiBieXRlTGVuZ3RoXG4gICAgfSk7XG4gICAgaWYgKCFERVNDUklQVE9SUykge1xuICAgICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDtcbiAgICAgIHRoaXMuZGV0YWNoZWQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgQXJyYXlCdWZmZXJQcm90b3R5cGUgPSAkQXJyYXlCdWZmZXJbUFJPVE9UWVBFXTtcblxuICAkRGF0YVZpZXcgPSBmdW5jdGlvbiBEYXRhVmlldyhidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsIERhdGFWaWV3UHJvdG90eXBlKTtcbiAgICBhbkluc3RhbmNlKGJ1ZmZlciwgQXJyYXlCdWZmZXJQcm90b3R5cGUpO1xuICAgIHZhciBidWZmZXJTdGF0ZSA9IGdldEludGVybmFsQXJyYXlCdWZmZXJTdGF0ZShidWZmZXIpO1xuICAgIHZhciBidWZmZXJMZW5ndGggPSBidWZmZXJTdGF0ZS5ieXRlTGVuZ3RoO1xuICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXJPckluZmluaXR5KGJ5dGVPZmZzZXQpO1xuICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlckxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0Jyk7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPT09IHVuZGVmaW5lZCA/IGJ1ZmZlckxlbmd0aCAtIG9mZnNldCA6IHRvTGVuZ3RoKGJ5dGVMZW5ndGgpO1xuICAgIGlmIChvZmZzZXQgKyBieXRlTGVuZ3RoID4gYnVmZmVyTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBEQVRBX1ZJRVcsXG4gICAgICBidWZmZXI6IGJ1ZmZlcixcbiAgICAgIGJ5dGVMZW5ndGg6IGJ5dGVMZW5ndGgsXG4gICAgICBieXRlT2Zmc2V0OiBvZmZzZXQsXG4gICAgICBieXRlczogYnVmZmVyU3RhdGUuYnl0ZXNcbiAgICB9KTtcbiAgICBpZiAoIURFU0NSSVBUT1JTKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgIHRoaXMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7XG4gICAgICB0aGlzLmJ5dGVPZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxuICB9O1xuXG4gIERhdGFWaWV3UHJvdG90eXBlID0gJERhdGFWaWV3W1BST1RPVFlQRV07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgYWRkR2V0dGVyKCRBcnJheUJ1ZmZlciwgJ2J5dGVMZW5ndGgnLCBnZXRJbnRlcm5hbEFycmF5QnVmZmVyU3RhdGUpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsICdidWZmZXInLCBnZXRJbnRlcm5hbERhdGFWaWV3U3RhdGUpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsICdieXRlTGVuZ3RoJywgZ2V0SW50ZXJuYWxEYXRhVmlld1N0YXRlKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCAnYnl0ZU9mZnNldCcsIGdldEludGVybmFsRGF0YVZpZXdTdGF0ZSk7XG4gIH1cblxuICBkZWZpbmVCdWlsdElucyhEYXRhVmlld1Byb3RvdHlwZSwge1xuICAgIGdldEludDg6IGZ1bmN0aW9uIGdldEludDgoYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXSA8PCAyNCA+PiAyNDtcbiAgICB9LFxuICAgIGdldFVpbnQ4OiBmdW5jdGlvbiBnZXRVaW50OChieXRlT2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdO1xuICAgIH0sXG4gICAgZ2V0SW50MTY6IGZ1bmN0aW9uIGdldEludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlKTtcbiAgICAgIHJldHVybiAoYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdKSA8PCAxNiA+PiAxNjtcbiAgICB9LFxuICAgIGdldFVpbnQxNjogZnVuY3Rpb24gZ2V0VWludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlKTtcbiAgICAgIHJldHVybiBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG4gICAgfSxcbiAgICBnZXRJbnQzMjogZnVuY3Rpb24gZ2V0SW50MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0ludDMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlKSk7XG4gICAgfSxcbiAgICBnZXRVaW50MzI6IGZ1bmN0aW9uIGdldFVpbnQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSW50MzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogZmFsc2UpKSA+Pj4gMDtcbiAgICB9LFxuICAgIGdldEZsb2F0MzI6IGZ1bmN0aW9uIGdldEZsb2F0MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogZmFsc2UpLCAyMyk7XG4gICAgfSxcbiAgICBnZXRGbG9hdDY0OiBmdW5jdGlvbiBnZXRGbG9hdDY0KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlKSwgNTIpO1xuICAgIH0sXG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJbnQ4LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXRVaW50ODogZnVuY3Rpb24gc2V0VWludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSW50OCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0SW50MTY6IGZ1bmN0aW9uIHNldEludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0ludDE2LCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiBmYWxzZSk7XG4gICAgfSxcbiAgICBzZXRVaW50MTY6IGZ1bmN0aW9uIHNldFVpbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJbnQxNiwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogZmFsc2UpO1xuICAgIH0sXG4gICAgc2V0SW50MzI6IGZ1bmN0aW9uIHNldEludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0ludDMyLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiBmYWxzZSk7XG4gICAgfSxcbiAgICBzZXRVaW50MzI6IGZ1bmN0aW9uIHNldFVpbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJbnQzMiwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogZmFsc2UpO1xuICAgIH0sXG4gICAgc2V0RmxvYXQzMjogZnVuY3Rpb24gc2V0RmxvYXQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tGbG9hdDMyLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiBmYWxzZSk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDY0OiBmdW5jdGlvbiBzZXRGbG9hdDY0KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgcGFja0Zsb2F0NjQsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IGZhbHNlKTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgdmFyIElOQ09SUkVDVF9BUlJBWV9CVUZGRVJfTkFNRSA9IFBST1BFUl9GVU5DVElPTl9OQU1FICYmIE5hdGl2ZUFycmF5QnVmZmVyLm5hbWUgIT09IEFSUkFZX0JVRkZFUjtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG4gIGlmICghZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIE5hdGl2ZUFycmF5QnVmZmVyKDEpO1xuICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBOYXRpdmVBcnJheUJ1ZmZlcigtMSk7XG4gIH0pIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgTmF0aXZlQXJyYXlCdWZmZXIoKTtcbiAgICBuZXcgTmF0aXZlQXJyYXlCdWZmZXIoMS41KTtcbiAgICBuZXcgTmF0aXZlQXJyYXlCdWZmZXIoTmFOKTtcbiAgICByZXR1cm4gTmF0aXZlQXJyYXlCdWZmZXIubGVuZ3RoICE9IDEgfHwgSU5DT1JSRUNUX0FSUkFZX0JVRkZFUl9OQU1FICYmICFDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRTtcbiAgfSkpIHtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xuICAgICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkge1xuICAgICAgYW5JbnN0YW5jZSh0aGlzLCBBcnJheUJ1ZmZlclByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gbmV3IE5hdGl2ZUFycmF5QnVmZmVyKHRvSW5kZXgobGVuZ3RoKSk7XG4gICAgfTtcblxuICAgICRBcnJheUJ1ZmZlcltQUk9UT1RZUEVdID0gQXJyYXlCdWZmZXJQcm90b3R5cGU7XG5cbiAgICBmb3IgKHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVBcnJheUJ1ZmZlciksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajspIHtcbiAgICAgIGlmICghKChrZXkgPSBrZXlzW2orK10pIGluICRBcnJheUJ1ZmZlcikpIHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KCRBcnJheUJ1ZmZlciwga2V5LCBOYXRpdmVBcnJheUJ1ZmZlcltrZXldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBBcnJheUJ1ZmZlclByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICRBcnJheUJ1ZmZlcjtcbiAgfSBlbHNlIGlmIChJTkNPUlJFQ1RfQVJSQVlfQlVGRkVSX05BTUUgJiYgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTmF0aXZlQXJyYXlCdWZmZXIsICduYW1lJywgQVJSQVlfQlVGRkVSKTtcbiAgfVxuXG4gIC8vIFdlYktpdCBidWcgLSB0aGUgc2FtZSBwYXJlbnQgcHJvdG90eXBlIGZvciB0eXBlZCBhcnJheXMgYW5kIGRhdGEgdmlld1xuICBpZiAoc2V0UHJvdG90eXBlT2YgJiYgZ2V0UHJvdG90eXBlT2YoRGF0YVZpZXdQcm90b3R5cGUpICE9PSBPYmplY3RQcm90b3R5cGUpIHtcbiAgICBzZXRQcm90b3R5cGVPZihEYXRhVmlld1Byb3RvdHlwZSwgT2JqZWN0UHJvdG90eXBlKTtcbiAgfVxuXG4gIC8vIGlPUyBTYWZhcmkgNy54IGJ1Z1xuICB2YXIgdGVzdFZpZXcgPSBuZXcgJERhdGFWaWV3KG5ldyAkQXJyYXlCdWZmZXIoMikpO1xuICB2YXIgJHNldEludDggPSB1bmN1cnJ5VGhpcyhEYXRhVmlld1Byb3RvdHlwZS5zZXRJbnQ4KTtcbiAgdGVzdFZpZXcuc2V0SW50OCgwLCAyMTQ3NDgzNjQ4KTtcbiAgdGVzdFZpZXcuc2V0SW50OCgxLCAyMTQ3NDgzNjQ5KTtcbiAgaWYgKHRlc3RWaWV3LmdldEludDgoMCkgfHwgIXRlc3RWaWV3LmdldEludDgoMSkpIGRlZmluZUJ1aWx0SW5zKERhdGFWaWV3UHJvdG90eXBlLCB7XG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgJHNldEludDgodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICAkc2V0SW50OCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7XG4gICAgfVxuICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cblxuc2V0VG9TdHJpbmdUYWcoJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpO1xuc2V0VG9TdHJpbmdUYWcoJERhdGFWaWV3LCBEQVRBX1ZJRVcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlcixcbiAgRGF0YVZpZXc6ICREYXRhVmlld1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXIuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZmlsbC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzXCIpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWxsXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuICB2YXIgZW5kUG9zID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW5ndGgpO1xuICB3aGlsZSAoZW5kUG9zID4gaW5kZXgpIE9baW5kZXgrK10gPSB2YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZpbGwuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS1jb25zdHJ1Y3Rvci1hbmQtbGlzdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIGxpc3QpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKGxpc3QpO1xuICB2YXIgcmVzdWx0ID0gbmV3IENvbnN0cnVjdG9yKGxlbmd0aCk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgcmVzdWx0W2luZGV4XSA9IGxpc3RbaW5kZXgrK107XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZyb20tY29uc3RydWN0b3ItYW5kLWxpc3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzXCIpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanNcIik7XG52YXIgaXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzXCIpO1xudmFyIGdldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qc1wiKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qc1wiKTtcblxudmFyICRBcnJheSA9IEFycmF5O1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gIHZhciBJU19DT05TVFJVQ1RPUiA9IGlzQ29uc3RydWN0b3IodGhpcyk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvciwgbmV4dCwgdmFsdWU7XG4gIC8vIGlmIHRoZSB0YXJnZXQgaXMgbm90IGl0ZXJhYmxlIG9yIGl0J3MgYW4gYXJyYXkgd2l0aCB0aGUgZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBhIHNpbXBsZSBjYXNlXG4gIGlmIChpdGVyYXRvck1ldGhvZCAmJiAhKHRoaXMgPT09ICRBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkge1xuICAgIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoTywgaXRlcmF0b3JNZXRob2QpO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIHJlc3VsdCA9IElTX0NPTlNUUlVDVE9SID8gbmV3IHRoaXMoKSA6IFtdO1xuICAgIGZvciAoOyEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICByZXN1bHQgPSBJU19DT05TVFJVQ1RPUiA/IG5ldyB0aGlzKGxlbmd0aCkgOiAkQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZyb20uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzXCIpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzXCIpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgZmluZExhc3QsIGZpbmRMYXN0SW5kZXggfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHZhciBJU19GSU5EX0xBU1RfSU5ERVggPSBUWVBFID09IDE7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIHRoYXQpO1xuICAgIHZhciBpbmRleCA9IGxlbmd0aE9mQXJyYXlMaWtlKHNlbGYpO1xuICAgIHZhciB2YWx1ZSwgcmVzdWx0O1xuICAgIHdoaWxlIChpbmRleC0tID4gMCkge1xuICAgICAgdmFsdWUgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlc3VsdCA9IGJvdW5kRnVuY3Rpb24odmFsdWUsIGluZGV4LCBPKTtcbiAgICAgIGlmIChyZXN1bHQpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICBjYXNlIDA6IHJldHVybiB2YWx1ZTsgLy8gZmluZExhc3RcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gaW5kZXg7IC8vIGZpbmRMYXN0SW5kZXhcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfTEFTVF9JTkRFWCA/IC0xIDogdW5kZWZpbmVkO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maW5kLWZyb20tbGFzdFxuICBmaW5kTGFzdDogY3JlYXRlTWV0aG9kKDApLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0SW5kZXhgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maW5kLWZyb20tbGFzdFxuICBmaW5kTGFzdEluZGV4OiBjcmVhdGVNZXRob2QoMSlcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanNcIik7XG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanNcIik7XG5cbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBmb3JFYWNoLCBtYXAsIGZpbHRlciwgc29tZSwgZXZlcnksIGZpbmQsIGZpbmRJbmRleCwgZmlsdGVyUmVqZWN0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkge1xuICB2YXIgSVNfTUFQID0gVFlQRSA9PSAxO1xuICB2YXIgSVNfRklMVEVSID0gVFlQRSA9PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMztcbiAgdmFyIElTX0VWRVJZID0gVFlQRSA9PSA0O1xuICB2YXIgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNjtcbiAgdmFyIElTX0ZJTFRFUl9SRUpFQ1QgPSBUWVBFID09IDc7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0LCBzcGVjaWZpY0NyZWF0ZSkge1xuICAgIHZhciBPID0gdG9PYmplY3QoJHRoaXMpO1xuICAgIHZhciBzZWxmID0gSW5kZXhlZE9iamVjdChPKTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgdGhhdCk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKHNlbGYpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTtcbiAgICB2YXIgdGFyZ2V0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSIHx8IElTX0ZJTFRFUl9SRUpFQ1QgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWx1ZSwgcmVzdWx0O1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikge1xuICAgICAgdmFsdWUgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlc3VsdCA9IGJvdW5kRnVuY3Rpb24odmFsdWUsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHRhcmdldFtpbmRleF0gPSByZXN1bHQ7IC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAvLyBzb21lXG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gdmFsdWU7ICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiBwdXNoKHRhcmdldCwgdmFsdWUpOyAgICAgIC8vIGZpbHRlclxuICAgICAgICB9IGVsc2Ugc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgIC8vIGV2ZXJ5XG4gICAgICAgICAgY2FzZSA3OiBwdXNoKHRhcmdldCwgdmFsdWUpOyAgICAgIC8vIGZpbHRlclJlamVjdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiB0YXJnZXQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxuICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUubWFwXG4gIG1hcDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuICBmaWx0ZXI6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuICBzb21lOiBjcmVhdGVNZXRob2QoMyksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5ldmVyeVxuICBldmVyeTogY3JlYXRlTWV0aG9kKDQpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4gIGZpbmQ6IGNyZWF0ZU1ldGhvZCg1KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhcbiAgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNiksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyUmVqZWN0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYXJyYXktZmlsdGVyaW5nXG4gIGZpbHRlclJlamVjdDogY3JlYXRlTWV0aG9kKDcpXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgYXJndW1lbnQpIHtcbiAgdmFyIG1ldGhvZCA9IFtdW01FVEhPRF9OQU1FXTtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgbWV0aG9kLmNhbGwobnVsbCwgYXJndW1lbnQgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfSwgMSk7XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGguanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgaXNBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBTYWZhcmkgPCAxMyBkb2VzIG5vdCB0aHJvdyBhbiBlcnJvciBpbiB0aGlzIGNhc2VcbnZhciBTSUxFTlRfT05fTk9OX1dSSVRBQkxFX0xFTkdUSF9TRVQgPSBERVNDUklQVE9SUyAmJiAhZnVuY3Rpb24gKCkge1xuICAvLyBtYWtlcyBubyBzZW5zZSB3aXRob3V0IHByb3BlciBzdHJpY3QgbW9kZSBzdXBwb3J0XG4gIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwgJ2xlbmd0aCcsIHsgd3JpdGFibGU6IGZhbHNlIH0pLmxlbmd0aCA9IDE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICB9XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gU0lMRU5UX09OX05PTl9XUklUQUJMRV9MRU5HVEhfU0VUID8gZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICBpZiAoaXNBcnJheShPKSAmJiAhZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sICdsZW5ndGgnKS53cml0YWJsZSkge1xuICAgIHRocm93ICRUeXBlRXJyb3IoJ0Nhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGgnKTtcbiAgfSByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59IDogZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGguanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2Utc2ltcGxlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS5qc1wiKTtcblxudmFyICRBcnJheSA9IEFycmF5O1xudmFyIG1heCA9IE1hdGgubWF4O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgdmFyIGsgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbmd0aCk7XG4gIHZhciBmaW4gPSB0b0Fic29sdXRlSW5kZXgoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQsIGxlbmd0aCk7XG4gIHZhciByZXN1bHQgPSAkQXJyYXkobWF4KGZpbiAtIGssIDApKTtcbiAgZm9yICh2YXIgbiA9IDA7IGsgPCBmaW47IGsrKywgbisrKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIG4sIE9ba10pO1xuICByZXN1bHQubGVuZ3RoID0gbjtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2Utc2ltcGxlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoW10uc2xpY2UpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNvcnQuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGFycmF5U2xpY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2Utc2ltcGxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2Utc2ltcGxlLmpzXCIpO1xuXG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG52YXIgbWVyZ2VTb3J0ID0gZnVuY3Rpb24gKGFycmF5LCBjb21wYXJlZm4pIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgdmFyIG1pZGRsZSA9IGZsb29yKGxlbmd0aCAvIDIpO1xuICByZXR1cm4gbGVuZ3RoIDwgOCA/IGluc2VydGlvblNvcnQoYXJyYXksIGNvbXBhcmVmbikgOiBtZXJnZShcbiAgICBhcnJheSxcbiAgICBtZXJnZVNvcnQoYXJyYXlTbGljZShhcnJheSwgMCwgbWlkZGxlKSwgY29tcGFyZWZuKSxcbiAgICBtZXJnZVNvcnQoYXJyYXlTbGljZShhcnJheSwgbWlkZGxlKSwgY29tcGFyZWZuKSxcbiAgICBjb21wYXJlZm5cbiAgKTtcbn07XG5cbnZhciBpbnNlcnRpb25Tb3J0ID0gZnVuY3Rpb24gKGFycmF5LCBjb21wYXJlZm4pIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgdmFyIGkgPSAxO1xuICB2YXIgZWxlbWVudCwgajtcblxuICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgIGogPSBpO1xuICAgIGVsZW1lbnQgPSBhcnJheVtpXTtcbiAgICB3aGlsZSAoaiAmJiBjb21wYXJlZm4oYXJyYXlbaiAtIDFdLCBlbGVtZW50KSA+IDApIHtcbiAgICAgIGFycmF5W2pdID0gYXJyYXlbLS1qXTtcbiAgICB9XG4gICAgaWYgKGogIT09IGkrKykgYXJyYXlbal0gPSBlbGVtZW50O1xuICB9IHJldHVybiBhcnJheTtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIChhcnJheSwgbGVmdCwgcmlnaHQsIGNvbXBhcmVmbikge1xuICB2YXIgbGxlbmd0aCA9IGxlZnQubGVuZ3RoO1xuICB2YXIgcmxlbmd0aCA9IHJpZ2h0Lmxlbmd0aDtcbiAgdmFyIGxpbmRleCA9IDA7XG4gIHZhciByaW5kZXggPSAwO1xuXG4gIHdoaWxlIChsaW5kZXggPCBsbGVuZ3RoIHx8IHJpbmRleCA8IHJsZW5ndGgpIHtcbiAgICBhcnJheVtsaW5kZXggKyByaW5kZXhdID0gKGxpbmRleCA8IGxsZW5ndGggJiYgcmluZGV4IDwgcmxlbmd0aClcbiAgICAgID8gY29tcGFyZWZuKGxlZnRbbGluZGV4XSwgcmlnaHRbcmluZGV4XSkgPD0gMCA/IGxlZnRbbGluZGV4KytdIDogcmlnaHRbcmluZGV4KytdXG4gICAgICA6IGxpbmRleCA8IGxsZW5ndGggPyBsZWZ0W2xpbmRleCsrXSA6IHJpZ2h0W3JpbmRleCsrXTtcbiAgfSByZXR1cm4gYXJyYXk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1lcmdlU29ydDtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zb3J0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGlzQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtYXJyYXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qc1wiKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyICRBcnJheSA9IEFycmF5O1xuXG4vLyBhIHBhcnQgb2YgYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHtcbiAgICBDID0gb3JpZ2luYWxBcnJheS5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmIChpc0NvbnN0cnVjdG9yKEMpICYmIChDID09PSAkQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGVsc2UgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gQyA9PT0gdW5kZWZpbmVkID8gJEFycmF5IDogQztcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYXJyYXlTcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG5cbi8vIGBBcnJheVNwZWNpZXNDcmVhdGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsQXJyYXksIGxlbmd0aCkge1xuICByZXR1cm4gbmV3IChhcnJheVNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbEFycmF5KSkobGVuZ3RoID09PSAwID8gMCA6IGxlbmd0aCk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXRvLXJldmVyc2VkLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xuXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtY2hhbmdlLWFycmF5LWJ5LWNvcHkvI3NlYy1hcnJheS5wcm90b3R5cGUudG9SZXZlcnNlZFxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWNoYW5nZS1hcnJheS1ieS1jb3B5LyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b1JldmVyc2VkXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBDKSB7XG4gIHZhciBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgdmFyIEEgPSBuZXcgQyhsZW4pO1xuICB2YXIgayA9IDA7XG4gIGZvciAoOyBrIDwgbGVuOyBrKyspIEFba10gPSBPW2xlbiAtIGsgLSAxXTtcbiAgcmV0dXJuIEE7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXRvLXJldmVyc2VkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXdpdGguanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWNoYW5nZS1hcnJheS1ieS1jb3B5LyNzZWMtYXJyYXkucHJvdG90eXBlLndpdGhcbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1jaGFuZ2UtYXJyYXktYnktY29weS8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUud2l0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgQywgaW5kZXgsIHZhbHVlKSB7XG4gIHZhciBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgdmFyIHJlbGF0aXZlSW5kZXggPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgdmFyIGFjdHVhbEluZGV4ID0gcmVsYXRpdmVJbmRleCA8IDAgPyBsZW4gKyByZWxhdGl2ZUluZGV4IDogcmVsYXRpdmVJbmRleDtcbiAgaWYgKGFjdHVhbEluZGV4ID49IGxlbiB8fCBhY3R1YWxJbmRleCA8IDApIHRocm93ICRSYW5nZUVycm9yKCdJbmNvcnJlY3QgaW5kZXgnKTtcbiAgdmFyIEEgPSBuZXcgQyhsZW4pO1xuICB2YXIgayA9IDA7XG4gIGZvciAoOyBrIDwgbGVuOyBrKyspIEFba10gPSBrID09PSBhY3R1YWxJbmRleCA/IHZhbHVlIDogT1trXTtcbiAgcmV0dXJuIEE7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXdpdGguanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBpdGVyYXRvckNsb3NlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UuanNcIik7XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWZyb20sIG5vLXRocm93LWxpdGVyYWwgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG5cbnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKHt9LnRvU3RyaW5nKTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHN0cmluZ1NsaWNlKHRvU3RyaW5nKGl0KSwgOCwgLTEpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBjbGFzc29mUmF3ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IGNsYXNzb2ZSYXcgOiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIHRhZywgcmVzdWx0O1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSAkT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgaXNDYWxsYWJsZShPLmNhbGxlZSkgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdElucyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW5zICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucy5qc1wiKTtcbnZhciBnZXRXZWFrRGF0YSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qc1wiKS5nZXRXZWFrRGF0YSk7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzXCIpO1xudmFyIEFycmF5SXRlcmF0aW9uTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzXCIpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcbnZhciBmaW5kID0gQXJyYXlJdGVyYXRpb25Nb2R1bGUuZmluZDtcbnZhciBmaW5kSW5kZXggPSBBcnJheUl0ZXJhdGlvbk1vZHVsZS5maW5kSW5kZXg7XG52YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbnZhciBpZCA9IDA7XG5cbi8vIGZhbGxiYWNrIGZvciB1bmNhdWdodCBmcm96ZW4ga2V5c1xudmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmZyb3plbiB8fCAoc3RhdGUuZnJvemVuID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7XG59O1xuXG52YXIgVW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbnRyaWVzID0gW107XG59O1xuXG52YXIgZmluZFVuY2F1Z2h0RnJvemVuID0gZnVuY3Rpb24gKHN0b3JlLCBrZXkpIHtcbiAgcmV0dXJuIGZpbmQoc3RvcmUuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gIH0pO1xufTtcblxuVW5jYXVnaHRGcm96ZW5TdG9yZS5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgcmV0dXJuIGVudHJ5WzFdO1xuICB9LFxuICBoYXM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gISFmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgZW50cnlbMV0gPSB2YWx1ZTtcbiAgICBlbHNlIHRoaXMuZW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0sXG4gICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGluZGV4ID0gZmluZEluZGV4KHRoaXMuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7XG4gICAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgICB9KTtcbiAgICBpZiAofmluZGV4KSBzcGxpY2UodGhpcy5lbnRyaWVzLCBpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIENvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgUHJvdG90eXBlKTtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICAgICBpZDogaWQrKyxcbiAgICAgICAgZnJvemVuOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpdGVyYWJsZSkpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB7IHRoYXQ6IHRoYXQsIEFTX0VOVFJJRVM6IElTX01BUCB9KTtcbiAgICB9KTtcblxuICAgIHZhciBQcm90b3R5cGUgPSBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGFuT2JqZWN0KGtleSksIHRydWUpO1xuICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLnNldChrZXksIHZhbHVlKTtcbiAgICAgIGVsc2UgZGF0YVtzdGF0ZS5pZF0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGF0O1xuICAgIH07XG5cbiAgICBkZWZpbmVCdWlsdElucyhQcm90b3R5cGUsIHtcbiAgICAgIC8vIGB7IFdlYWtNYXAsIFdlYWtTZXQgfS5wcm90b3R5cGUuZGVsZXRlKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha21hcC5wcm90b3R5cGUuZGVsZXRlXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWtzZXQucHJvdG90eXBlLmRlbGV0ZVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgaGFzT3duKGRhdGEsIHN0YXRlLmlkKSAmJiBkZWxldGUgZGF0YVtzdGF0ZS5pZF07XG4gICAgICB9LFxuICAgICAgLy8gYHsgV2Vha01hcCwgV2Vha1NldCB9LnByb3RvdHlwZS5oYXMoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLnByb3RvdHlwZS5oYXNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha3NldC5wcm90b3R5cGUuaGFzXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgaGFzT3duKGRhdGEsIHN0YXRlLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRlZmluZUJ1aWx0SW5zKFByb3RvdHlwZSwgSVNfTUFQID8ge1xuICAgICAgLy8gYFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha21hcC5wcm90b3R5cGUuZ2V0XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5nZXQoa2V5KTtcbiAgICAgICAgICByZXR1cm4gZGF0YSA/IGRhdGFbc3RhdGUuaWRdIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gYFdlYWtNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWttYXAucHJvdG90eXBlLnNldFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyBgV2Vha1NldC5wcm90b3R5cGUuYWRkKHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWtzZXQucHJvdG90eXBlLmFkZFxuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGlzRm9yY2VkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanNcIik7XG52YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qc1wiKTtcbnZhciBhbkluc3RhbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FLCB3cmFwcGVyLCBjb21tb24pIHtcbiAgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xO1xuICB2YXIgSVNfV0VBSyA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignV2VhaycpICE9PSAtMTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdO1xuICB2YXIgTmF0aXZlUHJvdG90eXBlID0gTmF0aXZlQ29uc3RydWN0b3IgJiYgTmF0aXZlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICB2YXIgQ29uc3RydWN0b3IgPSBOYXRpdmVDb25zdHJ1Y3RvcjtcbiAgdmFyIGV4cG9ydGVkID0ge307XG5cbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgdW5jdXJyaWVkTmF0aXZlTWV0aG9kID0gdW5jdXJyeVRoaXMoTmF0aXZlUHJvdG90eXBlW0tFWV0pO1xuICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvdG90eXBlLCBLRVksXG4gICAgICBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIHZhbHVlID09PSAwID8gMCA6IHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyB1bmRlZmluZWQgOiB1bmN1cnJpZWROYXRpdmVNZXRob2QodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHVuY3VycmllZE5hdGl2ZU1ldGhvZCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgdmFyIFJFUExBQ0UgPSBpc0ZvcmNlZChcbiAgICBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICFpc0NhbGxhYmxlKE5hdGl2ZUNvbnN0cnVjdG9yKSB8fCAhKElTX1dFQUsgfHwgTmF0aXZlUHJvdG90eXBlLmZvckVhY2ggJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLmVudHJpZXMoKS5uZXh0KCk7XG4gICAgfSkpXG4gICk7XG5cbiAgaWYgKFJFUExBQ0UpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIENvbnN0cnVjdG9yID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpO1xuICAgIEludGVybmFsTWV0YWRhdGFNb2R1bGUuZW5hYmxlKCk7XG4gIH0gZWxzZSBpZiAoaXNGb3JjZWQoQ09OU1RSVUNUT1JfTkFNRSwgdHJ1ZSkpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTtcbiAgICAvLyBWOCB+IENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgIHZhciBUSFJPV1NfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgaW5zdGFuY2UuaGFzKDEpOyB9KTtcbiAgICAvLyBtb3N0IGVhcmx5IGltcGxlbWVudGF0aW9ucyBkb2Vzbid0IHN1cHBvcnRzIGl0ZXJhYmxlcywgbW9zdCBtb2Rlcm4gLSBub3QgY2xvc2UgaXQgY29ycmVjdGx5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAgIHZhciBBQ0NFUFRfSVRFUkFCTEVTID0gY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkgeyBuZXcgTmF0aXZlQ29uc3RydWN0b3IoaXRlcmFibGUpOyB9KTtcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpO1xuICAgICAgdmFyIGluZGV4ID0gNTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSAkaW5zdGFuY2VbQURERVJdKGluZGV4LCBpbmRleCk7XG4gICAgICByZXR1cm4gISRpbnN0YW5jZS5oYXMoLTApO1xuICAgIH0pO1xuXG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKGR1bW15LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKGR1bW15LCBOYXRpdmVQcm90b3R5cGUpO1xuICAgICAgICB2YXIgdGhhdCA9IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLCBkdW1teSwgQ29uc3RydWN0b3IpO1xuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0ZXJhYmxlKSkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlO1xuICAgICAgTmF0aXZlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgfVxuXG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuXG4gICAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpIGZpeE1ldGhvZChBRERFUik7XG5cbiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZFxuICAgIGlmIChJU19XRUFLICYmIE5hdGl2ZVByb3RvdHlwZS5jbGVhcikgZGVsZXRlIE5hdGl2ZVByb3RvdHlwZS5jbGVhcjtcbiAgfVxuXG4gIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gQ29uc3RydWN0b3I7XG4gICQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBmb3JjZWQ6IENvbnN0cnVjdG9yICE9IE5hdGl2ZUNvbnN0cnVjdG9yIH0sIGV4cG9ydGVkKTtcblxuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgaWYgKCFJU19XRUFLKSBjb21tb24uc2V0U3Ryb25nKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBvd25LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL293bi1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanNcIik7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSwgZXhjZXB0aW9ucykge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkgJiYgIShleGNlcHRpb25zICYmIGhhc093bihleGNlcHRpb25zLCBrZXkpKSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgIH1cbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xuXG52YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIHZhciByZWdleHAgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7XG4gIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgIHRyeSB7XG4gICAgICByZWdleHBbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7XG4gICAgfSBjYXRjaCAoZXJyb3IyKSB7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gZmFsc2U7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlci1yZXN1bHQtb2JqZWN0LmpzIjooKG1vZHVsZSk9PntldmFsKCJcbi8vIGBDcmVhdGVJdGVyUmVzdWx0T2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlaXRlcnJlc3VsdG9iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUsIGRvbmUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiBkb25lIH07XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHRvUHJvcGVydHlLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIHByb3BlcnR5S2V5ID0gdG9Qcm9wZXJ0eUtleShrZXkpO1xuICBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtwcm9wZXJ0eUtleV0gPSB2YWx1ZTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgbWFrZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWFrZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4uanNcIik7XG52YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgbmFtZSwgZGVzY3JpcHRvcikge1xuICBpZiAoZGVzY3JpcHRvci5nZXQpIG1ha2VCdWlsdEluKGRlc2NyaXB0b3IuZ2V0LCBuYW1lLCB7IGdldHRlcjogdHJ1ZSB9KTtcbiAgaWYgKGRlc2NyaXB0b3Iuc2V0KSBtYWtlQnVpbHRJbihkZXNjcmlwdG9yLnNldCwgbmFtZSwgeyBzZXR0ZXI6IHRydWUgfSk7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eS5mKHRhcmdldCwgbmFtZSwgZGVzY3JpcHRvcik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBtYWtlQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9tYWtlLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWFrZS1idWlsdC1pbi5qc1wiKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMuZW51bWVyYWJsZTtcbiAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubmFtZSA6IGtleTtcbiAgaWYgKGlzQ2FsbGFibGUodmFsdWUpKSBtYWtlQnVpbHRJbih2YWx1ZSwgbmFtZSwgb3B0aW9ucyk7XG4gIGlmIChvcHRpb25zLmdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2UgZGVmaW5lR2xvYmFsUHJvcGVydHkoa2V5LCB2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghb3B0aW9ucy51bnNhZmUpIGRlbGV0ZSBPW2tleV07XG4gICAgICBlbHNlIGlmIChPW2tleV0pIHNpbXBsZSA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2UgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiAhb3B0aW9ucy5ub25Db25maWd1cmFibGUsXG4gICAgICB3cml0YWJsZTogIW9wdGlvbnMubm9uV3JpdGFibGVcbiAgICB9KTtcbiAgfSByZXR1cm4gTztcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSBkZWZpbmVCdWlsdEluKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWwsIGtleSwgeyB2YWx1ZTogdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0cnlUb1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90cnktdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qc1wiKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIFApIHtcbiAgaWYgKCFkZWxldGUgT1tQXSkgdGhyb3cgJFR5cGVFcnJvcignQ2Fubm90IGRlbGV0ZSBwcm9wZXJ0eSAnICsgdHJ5VG9TdHJpbmcoUCkgKyAnIG9mICcgKyB0cnlUb1N0cmluZyhPKSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlbGV0ZS1wcm9wZXJ0eS1vci10aHJvdy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxuLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb25cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPSA3O1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtYWxsLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbnZhciBkb2N1bWVudEFsbCA9IHR5cGVvZiBkb2N1bWVudCA9PSAnb2JqZWN0JyAmJiBkb2N1bWVudC5hbGw7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtSXNIVE1MRERBLWludGVybmFsLXNsb3Rcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXR5cGVvZi11bmRlZmluZWQgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbnZhciBJU19IVE1MRERBID0gdHlwZW9mIGRvY3VtZW50QWxsID09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50QWxsICE9PSB1bmRlZmluZWQ7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhbGw6IGRvY3VtZW50QWxsLFxuICBJU19IVE1MRERBOiBJU19IVE1MRERBXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWFsbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanNcIik7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXIuanMiOigobW9kdWxlKT0+e2V2YWwoIlxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDB4MUZGRkZGRkZGRkZGRkY7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID4gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgJFR5cGVFcnJvcignTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20tZXhjZXB0aW9uLWNvbnN0YW50cy5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSW5kZXhTaXplRXJyb3I6IHsgczogJ0lOREVYX1NJWkVfRVJSJywgYzogMSwgbTogMSB9LFxuICBET01TdHJpbmdTaXplRXJyb3I6IHsgczogJ0RPTVNUUklOR19TSVpFX0VSUicsIGM6IDIsIG06IDAgfSxcbiAgSGllcmFyY2h5UmVxdWVzdEVycm9yOiB7IHM6ICdISUVSQVJDSFlfUkVRVUVTVF9FUlInLCBjOiAzLCBtOiAxIH0sXG4gIFdyb25nRG9jdW1lbnRFcnJvcjogeyBzOiAnV1JPTkdfRE9DVU1FTlRfRVJSJywgYzogNCwgbTogMSB9LFxuICBJbnZhbGlkQ2hhcmFjdGVyRXJyb3I6IHsgczogJ0lOVkFMSURfQ0hBUkFDVEVSX0VSUicsIGM6IDUsIG06IDEgfSxcbiAgTm9EYXRhQWxsb3dlZEVycm9yOiB7IHM6ICdOT19EQVRBX0FMTE9XRURfRVJSJywgYzogNiwgbTogMCB9LFxuICBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvcjogeyBzOiAnTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSJywgYzogNywgbTogMSB9LFxuICBOb3RGb3VuZEVycm9yOiB7IHM6ICdOT1RfRk9VTkRfRVJSJywgYzogOCwgbTogMSB9LFxuICBOb3RTdXBwb3J0ZWRFcnJvcjogeyBzOiAnTk9UX1NVUFBPUlRFRF9FUlInLCBjOiA5LCBtOiAxIH0sXG4gIEluVXNlQXR0cmlidXRlRXJyb3I6IHsgczogJ0lOVVNFX0FUVFJJQlVURV9FUlInLCBjOiAxMCwgbTogMSB9LFxuICBJbnZhbGlkU3RhdGVFcnJvcjogeyBzOiAnSU5WQUxJRF9TVEFURV9FUlInLCBjOiAxMSwgbTogMSB9LFxuICBTeW50YXhFcnJvcjogeyBzOiAnU1lOVEFYX0VSUicsIGM6IDEyLCBtOiAxIH0sXG4gIEludmFsaWRNb2RpZmljYXRpb25FcnJvcjogeyBzOiAnSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSJywgYzogMTMsIG06IDEgfSxcbiAgTmFtZXNwYWNlRXJyb3I6IHsgczogJ05BTUVTUEFDRV9FUlInLCBjOiAxNCwgbTogMSB9LFxuICBJbnZhbGlkQWNjZXNzRXJyb3I6IHsgczogJ0lOVkFMSURfQUNDRVNTX0VSUicsIGM6IDE1LCBtOiAxIH0sXG4gIFZhbGlkYXRpb25FcnJvcjogeyBzOiAnVkFMSURBVElPTl9FUlInLCBjOiAxNiwgbTogMCB9LFxuICBUeXBlTWlzbWF0Y2hFcnJvcjogeyBzOiAnVFlQRV9NSVNNQVRDSF9FUlInLCBjOiAxNywgbTogMSB9LFxuICBTZWN1cml0eUVycm9yOiB7IHM6ICdTRUNVUklUWV9FUlInLCBjOiAxOCwgbTogMSB9LFxuICBOZXR3b3JrRXJyb3I6IHsgczogJ05FVFdPUktfRVJSJywgYzogMTksIG06IDEgfSxcbiAgQWJvcnRFcnJvcjogeyBzOiAnQUJPUlRfRVJSJywgYzogMjAsIG06IDEgfSxcbiAgVVJMTWlzbWF0Y2hFcnJvcjogeyBzOiAnVVJMX01JU01BVENIX0VSUicsIGM6IDIxLCBtOiAxIH0sXG4gIFF1b3RhRXhjZWVkZWRFcnJvcjogeyBzOiAnUVVPVEFfRVhDRUVERURfRVJSJywgYzogMjIsIG06IDEgfSxcbiAgVGltZW91dEVycm9yOiB7IHM6ICdUSU1FT1VUX0VSUicsIGM6IDIzLCBtOiAxIH0sXG4gIEludmFsaWROb2RlVHlwZUVycm9yOiB7IHM6ICdJTlZBTElEX05PREVfVFlQRV9FUlInLCBjOiAyNCwgbTogMSB9LFxuICBEYXRhQ2xvbmVFcnJvcjogeyBzOiAnREFUQV9DTE9ORV9FUlInLCBjOiAyNSwgbTogMSB9XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1leGNlcHRpb24tY29uc3RhbnRzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLy8gaXRlcmFibGUgRE9NIGNvbGxlY3Rpb25zXG4vLyBmbGFnIC0gYGl0ZXJhYmxlYCBpbnRlcmZhY2UgLSAnZW50cmllcycsICdrZXlzJywgJ3ZhbHVlcycsICdmb3JFYWNoJyBtZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IDAsXG4gIENTU1N0eWxlRGVjbGFyYXRpb246IDAsXG4gIENTU1ZhbHVlTGlzdDogMCxcbiAgQ2xpZW50UmVjdExpc3Q6IDAsXG4gIERPTVJlY3RMaXN0OiAwLFxuICBET01TdHJpbmdMaXN0OiAwLFxuICBET01Ub2tlbkxpc3Q6IDEsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiAwLFxuICBGaWxlTGlzdDogMCxcbiAgSFRNTEFsbENvbGxlY3Rpb246IDAsXG4gIEhUTUxDb2xsZWN0aW9uOiAwLFxuICBIVE1MRm9ybUVsZW1lbnQ6IDAsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiAwLFxuICBNZWRpYUxpc3Q6IDAsXG4gIE1pbWVUeXBlQXJyYXk6IDAsXG4gIE5hbWVkTm9kZU1hcDogMCxcbiAgTm9kZUxpc3Q6IDEsXG4gIFBhaW50UmVxdWVzdExpc3Q6IDAsXG4gIFBsdWdpbjogMCxcbiAgUGx1Z2luQXJyYXk6IDAsXG4gIFNWR0xlbmd0aExpc3Q6IDAsXG4gIFNWR051bWJlckxpc3Q6IDAsXG4gIFNWR1BhdGhTZWdMaXN0OiAwLFxuICBTVkdQb2ludExpc3Q6IDAsXG4gIFNWR1N0cmluZ0xpc3Q6IDAsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IDAsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IDAsXG4gIFN0eWxlU2hlZXRMaXN0OiAwLFxuICBUZXh0VHJhY2tDdWVMaXN0OiAwLFxuICBUZXh0VHJhY2tMaXN0OiAwLFxuICBUb3VjaExpc3Q6IDBcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20tdG9rZW4tbGlzdC1wcm90b3R5cGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gaW4gb2xkIFdlYktpdCB2ZXJzaW9ucywgYGVsZW1lbnQuY2xhc3NMaXN0YCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgZ2xvYmFsIGBET01Ub2tlbkxpc3RgXG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanNcIik7XG5cbnZhciBjbGFzc0xpc3QgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ3NwYW4nKS5jbGFzc0xpc3Q7XG52YXIgRE9NVG9rZW5MaXN0UHJvdG90eXBlID0gY2xhc3NMaXN0ICYmIGNsYXNzTGlzdC5jb25zdHJ1Y3RvciAmJiBjbGFzc0xpc3QuY29uc3RydWN0b3IucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERPTVRva2VuTGlzdFByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSA/IHVuZGVmaW5lZCA6IERPTVRva2VuTGlzdFByb3RvdHlwZTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20tdG9rZW4tbGlzdC1wcm90b3R5cGUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzXCIpO1xuXG52YXIgZmlyZWZveCA9IHVzZXJBZ2VudC5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS9pKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIWZpcmVmb3ggJiYgK2ZpcmVmb3hbMV07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIElTX0RFTk8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtZGVuby5qc1wiKTtcbnZhciBJU19OT0RFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gIUlTX0RFTk8gJiYgIUlTX05PREVcbiAgJiYgdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0J1xuICAmJiB0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCc7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8uanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLyogZ2xvYmFsIERlbm8gLS0gRGVubyBjYXNlICovXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBEZW5vID09ICdvYmplY3QnICYmIERlbm8gJiYgdHlwZW9mIERlbm8udmVyc2lvbiA9PSAnb2JqZWN0JztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtZGVuby5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgVUEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvTVNJRXxUcmlkZW50Ly50ZXN0KFVBKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLXBlYmJsZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdXNlckFnZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gL2lwYWR8aXBob25lfGlwb2QvaS50ZXN0KHVzZXJBZ2VudCkgJiYgdHlwZW9mIFBlYmJsZSAhPSAndW5kZWZpbmVkJztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLXBlYmJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1c2VyQWdlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qc1wiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZG9zL25vLXZ1bG5lcmFibGUgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSAvKD86aXBhZHxpcGhvbmV8aXBvZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgcHJvY2VzcyAhPSAndW5kZWZpbmVkJyAmJiBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtd2Vib3Mtd2Via2l0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1c2VyQWdlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvd2ViMHMoPyEuKmNocm9tZSkvaS50ZXN0KHVzZXJBZ2VudCk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gJ3VuZGVmaW5lZCcgJiYgU3RyaW5nKG5hdmlnYXRvci51c2VyQWdlbnQpIHx8ICcnO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzXCIpO1xuXG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIERlbm8gPSBnbG9iYWwuRGVubztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucyB8fCBEZW5vICYmIERlbm8udmVyc2lvbjtcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuXG5pZiAodjgpIHtcbiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuICAvLyBpbiBvbGQgQ2hyb21lLCB2ZXJzaW9ucyBvZiBWOCBpc24ndCBWOCA9IENocm9tZSAvIDEwXG4gIC8vIGJ1dCB0aGVpciBjb3JyZWN0IHZlcnNpb25zIGFyZSBub3QgaW50ZXJlc3RpbmcgZm9yIHVzXG4gIHZlcnNpb24gPSBtYXRjaFswXSA+IDAgJiYgbWF0Y2hbMF0gPCA0ID8gMSA6ICsobWF0Y2hbMF0gKyBtYXRjaFsxXSk7XG59XG5cbi8vIEJyb3dzZXJGUyBOb2RlSlMgYHByb2Nlc3NgIHBvbHlmaWxsIGluY29ycmVjdGx5IHNldCBgLnY4YCB0byBgMC4wYFxuLy8gc28gY2hlY2sgYHVzZXJBZ2VudGAgZXZlbiBpZiBgLnY4YCBleGlzdHMsIGJ1dCAwXG5pZiAoIXZlcnNpb24gJiYgdXNlckFnZW50KSB7XG4gIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLyk7XG4gIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHtcbiAgICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gK21hdGNoWzFdO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmVyc2lvbjtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtd2Via2l0LXZlcnNpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzXCIpO1xuXG52YXIgd2Via2l0ID0gdXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFxcLyhcXGQrKVxcLi8pO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICEhd2Via2l0ICYmICt3ZWJraXRbMV07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXdlYmtpdC12ZXJzaW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG52YXIgJEVycm9yID0gRXJyb3I7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xuXG52YXIgVEVTVCA9IChmdW5jdGlvbiAoYXJnKSB7IHJldHVybiBTdHJpbmcoJEVycm9yKGFyZykuc3RhY2spOyB9KSgnenhjYXNkJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVkb3Mvbm8tdnVsbmVyYWJsZSAtLSBzYWZlXG52YXIgVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZID0gL1xcblxccyphdCBbXjpdKjpbXlxcbl0qLztcbnZhciBJU19WOF9PUl9DSEFLUkFfU1RBQ0sgPSBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlkudGVzdChURVNUKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RhY2ssIGRyb3BFbnRyaWVzKSB7XG4gIGlmIChJU19WOF9PUl9DSEFLUkFfU1RBQ0sgJiYgdHlwZW9mIHN0YWNrID09ICdzdHJpbmcnICYmICEkRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UpIHtcbiAgICB3aGlsZSAoZHJvcEVudHJpZXMtLSkgc3RhY2sgPSByZXBsYWNlKHN0YWNrLCBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlksICcnKTtcbiAgfSByZXR1cm4gc3RhY2s7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWNsZWFyLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGwuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG52YXIgY2xlYXJFcnJvclN0YWNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWNsZWFyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXJyb3Itc3RhY2stY2xlYXIuanNcIik7XG52YXIgRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qc1wiKTtcblxuLy8gbm9uLXN0YW5kYXJkIFY4XG52YXIgY2FwdHVyZVN0YWNrVHJhY2UgPSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXJyb3IsIEMsIHN0YWNrLCBkcm9wRW50cmllcykge1xuICBpZiAoRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUpIHtcbiAgICBpZiAoY2FwdHVyZVN0YWNrVHJhY2UpIGNhcHR1cmVTdGFja1RyYWNlKGVycm9yLCBDKTtcbiAgICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywgY2xlYXJFcnJvclN0YWNrKHN0YWNrLCBkcm9wRW50cmllcykpO1xuICB9XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGwuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVycm9yID0gRXJyb3IoJ2EnKTtcbiAgaWYgKCEoJ3N0YWNrJyBpbiBlcnJvcikpIHJldHVybiB0cnVlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnc3RhY2snLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgNykpO1xuICByZXR1cm4gZXJyb3Iuc3RhY2sgIT09IDc7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci10by1zdHJpbmcuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzXCIpO1xuXG52YXIgbmF0aXZlRXJyb3JUb1N0cmluZyA9IEVycm9yLnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIC8vIENocm9tZSAzMi0gaW5jb3JyZWN0bHkgY2FsbCBhY2Nlc3NvclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIHZhciBvYmplY3QgPSBjcmVhdGUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnbmFtZScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcyA9PT0gb2JqZWN0O1xuICAgIH0gfSkpO1xuICAgIGlmIChuYXRpdmVFcnJvclRvU3RyaW5nLmNhbGwob2JqZWN0KSAhPT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBGRjEwLSBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgbm9uLXN0cmluZ3NcbiAgcmV0dXJuIG5hdGl2ZUVycm9yVG9TdHJpbmcuY2FsbCh7IG1lc3NhZ2U6IDEsIG5hbWU6IDIgfSkgIT09ICcyOiAxJ1xuICAgIC8vIElFOCBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgZGVmYXVsdHNcbiAgICB8fCBuYXRpdmVFcnJvclRvU3RyaW5nLmNhbGwoe30pICE9PSAnRXJyb3InO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gSU5DT1JSRUNUX1RPX1NUUklORyA/IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICB2YXIgTyA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgbmFtZSA9IG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KE8ubmFtZSwgJ0Vycm9yJyk7XG4gIHZhciBtZXNzYWdlID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoTy5tZXNzYWdlKTtcbiAgcmV0dXJuICFuYW1lID8gbWVzc2FnZSA6ICFtZXNzYWdlID8gbmFtZSA6IG5hbWUgKyAnOiAnICsgbWVzc2FnZTtcbn0gOiBuYXRpdmVFcnJvclRvU3RyaW5nO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXRvLXN0cmluZy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qc1wiKS5mKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xudmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5LmpzXCIpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzXCIpO1xudmFyIGlzRm9yY2VkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qc1wiKTtcblxuLypcbiAgb3B0aW9ucy50YXJnZXQgICAgICAgICAtIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3RcbiAgb3B0aW9ucy5nbG9iYWwgICAgICAgICAtIHRhcmdldCBpcyB0aGUgZ2xvYmFsIG9iamVjdFxuICBvcHRpb25zLnN0YXQgICAgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnByb3RvICAgICAgICAgIC0gZXhwb3J0IGFzIHByb3RvdHlwZSBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnJlYWwgICAgICAgICAgIC0gcmVhbCBwcm90b3R5cGUgbWV0aG9kIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy5mb3JjZWQgICAgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGVcbiAgb3B0aW9ucy5iaW5kICAgICAgICAgICAtIGJpbmQgbWV0aG9kcyB0byB0aGUgdGFyZ2V0LCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMud3JhcCAgICAgICAgICAgLSB3cmFwIGNvbnN0cnVjdG9ycyB0byBwcmV2ZW50aW5nIGdsb2JhbCBwb2xsdXRpb24sIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy51bnNhZmUgICAgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eVxuICBvcHRpb25zLnNoYW0gICAgICAgICAgIC0gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICBvcHRpb25zLmVudW1lcmFibGUgICAgIC0gZXhwb3J0IGFzIGVudW1lcmFibGUgcHJvcGVydHlcbiAgb3B0aW9ucy5kb250Q2FsbEdldFNldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXRcbiAgb3B0aW9ucy5uYW1lICAgICAgICAgICAtIHRoZSAubmFtZSBvZiB0aGUgZnVuY3Rpb24gaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGtleVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbDtcbiAgfSBlbHNlIGlmIChTVEFUSUMpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBkZWZpbmVHbG9iYWxQcm9wZXJ0eShUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLmRvbnRDYWxsR2V0U2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KSBjb250aW51ZTtcbiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTtcbiAgICB9XG4gICAgLy8gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIGRlZmluZUJ1aWx0SW4odGFyZ2V0LCBrZXksIHNvdXJjZVByb3BlcnR5LCBvcHRpb25zKTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgbW92ZWQgdG8gZW50cnkgcG9pbnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xudmFyIHJlZ2V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBleGVjLCBGT1JDRUQsIFNIQU0pIHtcbiAgdmFyIFNZTUJPTCA9IHdlbGxLbm93blN5bWJvbChLRVkpO1xuXG4gIHZhciBERUxFR0FURVNfVE9fU1lNQk9MID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTdHJpbmcgbWV0aG9kcyBjYWxsIHN5bWJvbC1uYW1lZCBSZWdFcCBtZXRob2RzXG4gICAgdmFyIE8gPSB7fTtcbiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9O1xuICAgIHJldHVybiAnJ1tLRVldKE8pICE9IDc7XG4gIH0pO1xuXG4gIHZhciBERUxFR0FURVNfVE9fRVhFQyA9IERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTeW1ib2wtbmFtZWQgUmVnRXhwIG1ldGhvZHMgY2FsbCAuZXhlY1xuICAgIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7XG4gICAgdmFyIHJlID0gL2EvO1xuXG4gICAgaWYgKEtFWSA9PT0gJ3NwbGl0Jykge1xuICAgICAgLy8gV2UgY2FuJ3QgdXNlIHJlYWwgcmVnZXggaGVyZSBzaW5jZSBpdCBjYXVzZXMgZGVvcHRpbWl6YXRpb25cbiAgICAgIC8vIGFuZCBzZXJpb3VzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGluIFY4XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzA2XG4gICAgICByZSA9IHt9O1xuICAgICAgLy8gUmVnRXhwW0BAc3BsaXRdIGRvZXNuJ3QgY2FsbCB0aGUgcmVnZXgncyBleGVjIG1ldGhvZCwgYnV0IGZpcnN0IGNyZWF0ZXNcbiAgICAgIC8vIGEgbmV3IG9uZS4gV2UgbmVlZCB0byByZXR1cm4gdGhlIHBhdGNoZWQgcmVnZXggd2hlbiBjcmVhdGluZyB0aGUgbmV3IG9uZS5cbiAgICAgIHJlLmNvbnN0cnVjdG9yID0ge307XG4gICAgICByZS5jb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlOyB9O1xuICAgICAgcmUuZmxhZ3MgPSAnJztcbiAgICAgIHJlW1NZTUJPTF0gPSAvLi9bU1lNQk9MXTtcbiAgICB9XG5cbiAgICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyBleGVjQ2FsbGVkID0gdHJ1ZTsgcmV0dXJuIG51bGw7IH07XG5cbiAgICByZVtTWU1CT0xdKCcnKTtcbiAgICByZXR1cm4gIWV4ZWNDYWxsZWQ7XG4gIH0pO1xuXG4gIGlmIChcbiAgICAhREVMRUdBVEVTX1RPX1NZTUJPTCB8fFxuICAgICFERUxFR0FURVNfVE9fRVhFQyB8fFxuICAgIEZPUkNFRFxuICApIHtcbiAgICB2YXIgdW5jdXJyaWVkTmF0aXZlUmVnRXhwTWV0aG9kID0gdW5jdXJyeVRoaXMoLy4vW1NZTUJPTF0pO1xuICAgIHZhciBtZXRob2RzID0gZXhlYyhTWU1CT0wsICcnW0tFWV0sIGZ1bmN0aW9uIChuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgdmFyIHVuY3VycmllZE5hdGl2ZU1ldGhvZCA9IHVuY3VycnlUaGlzKG5hdGl2ZU1ldGhvZCk7XG4gICAgICB2YXIgJGV4ZWMgPSByZWdleHAuZXhlYztcbiAgICAgIGlmICgkZXhlYyA9PT0gcmVnZXhwRXhlYyB8fCAkZXhlYyA9PT0gUmVnRXhwUHJvdG90eXBlLmV4ZWMpIHtcbiAgICAgICAgaWYgKERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICAgICAgLy8gVGhlIG5hdGl2ZSBTdHJpbmcgbWV0aG9kIGFscmVhZHkgZGVsZWdhdGVzIHRvIEBAbWV0aG9kICh0aGlzXG4gICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICAgIC8vIFdlIGF2b2lkIGl0IGJ5IGRpcmVjdGx5IGNhbGxpbmcgdGhlIG5hdGl2ZSBAQG1ldGhvZCBtZXRob2QuXG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuY3VycmllZE5hdGl2ZVJlZ0V4cE1ldGhvZChyZWdleHAsIHN0ciwgYXJnMikgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHN0ciwgcmVnZXhwLCBhcmcyKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UgfTtcbiAgICB9KTtcblxuICAgIGRlZmluZUJ1aWx0SW4oU3RyaW5nLnByb3RvdHlwZSwgS0VZLCBtZXRob2RzWzBdKTtcbiAgICBkZWZpbmVCdWlsdEluKFJlZ0V4cFByb3RvdHlwZSwgU1lNQk9MLCBtZXRob2RzWzFdKTtcbiAgfVxuXG4gIGlmIChTSEFNKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoUmVnRXhwUHJvdG90eXBlW1NZTUJPTF0sICdzaGFtJywgdHJ1ZSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanNcIik7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qc1wiKTtcbnZhciBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXIuanNcIik7XG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG5cbi8vIGBGbGF0dGVuSW50b0FycmF5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtZmxhdE1hcC8jc2VjLUZsYXR0ZW5JbnRvQXJyYXlcbnZhciBmbGF0dGVuSW50b0FycmF5ID0gZnVuY3Rpb24gKHRhcmdldCwgb3JpZ2luYWwsIHNvdXJjZSwgc291cmNlTGVuLCBzdGFydCwgZGVwdGgsIG1hcHBlciwgdGhpc0FyZykge1xuICB2YXIgdGFyZ2V0SW5kZXggPSBzdGFydDtcbiAgdmFyIHNvdXJjZUluZGV4ID0gMDtcbiAgdmFyIG1hcEZuID0gbWFwcGVyID8gYmluZChtYXBwZXIsIHRoaXNBcmcpIDogZmFsc2U7XG4gIHZhciBlbGVtZW50LCBlbGVtZW50TGVuO1xuXG4gIHdoaWxlIChzb3VyY2VJbmRleCA8IHNvdXJjZUxlbikge1xuICAgIGlmIChzb3VyY2VJbmRleCBpbiBzb3VyY2UpIHtcbiAgICAgIGVsZW1lbnQgPSBtYXBGbiA/IG1hcEZuKHNvdXJjZVtzb3VyY2VJbmRleF0sIHNvdXJjZUluZGV4LCBvcmlnaW5hbCkgOiBzb3VyY2Vbc291cmNlSW5kZXhdO1xuXG4gICAgICBpZiAoZGVwdGggPiAwICYmIGlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICAgICAgZWxlbWVudExlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKGVsZW1lbnQpO1xuICAgICAgICB0YXJnZXRJbmRleCA9IGZsYXR0ZW5JbnRvQXJyYXkodGFyZ2V0LCBvcmlnaW5hbCwgZWxlbWVudCwgZWxlbWVudExlbiwgdGFyZ2V0SW5kZXgsIGRlcHRoIC0gMSkgLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyKHRhcmdldEluZGV4ICsgMSk7XG4gICAgICAgIHRhcmdldFt0YXJnZXRJbmRleF0gPSBlbGVtZW50O1xuICAgICAgfVxuXG4gICAgICB0YXJnZXRJbmRleCsrO1xuICAgIH1cbiAgICBzb3VyY2VJbmRleCsrO1xuICB9XG4gIHJldHVybiB0YXJnZXRJbmRleDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbkludG9BcnJheTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mbGF0dGVuLWludG8tYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUsIGVzL25vLW9iamVjdC1wcmV2ZW50ZXh0ZW5zaW9ucyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzXCIpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgYXBwbHkgPSBGdW5jdGlvblByb3RvdHlwZS5hcHBseTtcbnZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXJlZmxlY3QgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgUmVmbGVjdCA9PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmFwcGx5IHx8IChOQVRJVkVfQklORCA/IGNhbGwuYmluZChhcHBseSkgOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYWxsLmFwcGx5KGFwcGx5LCBhcmd1bWVudHMpO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZS5qc1wiKTtcbnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtY2FsbGFibGUuanNcIik7XG52YXIgTkFUSVZFX0JJTkQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZS5qc1wiKTtcblxudmFyIGJpbmQgPSB1bmN1cnJ5VGhpcyh1bmN1cnJ5VGhpcy5iaW5kKTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCkge1xuICBhQ2FsbGFibGUoZm4pO1xuICByZXR1cm4gdGhhdCA9PT0gdW5kZWZpbmVkID8gZm4gOiBOQVRJVkVfQklORCA/IGJpbmQoZm4sIHRoYXQpIDogZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1mdW5jdGlvbi1wcm90b3R5cGUtYmluZCAtLSBzYWZlXG4gIHZhciB0ZXN0ID0gKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkuYmluZCgpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuIHR5cGVvZiB0ZXN0ICE9ICdmdW5jdGlvbicgfHwgdGVzdC5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJyk7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzXCIpO1xuXG52YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9CSU5EID8gY2FsbC5iaW5kKGNhbGwpIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FsbC5hcHBseShjYWxsLCBhcmd1bWVudHMpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0RGVzY3JpcHRvciA9IERFU0NSSVBUT1JTICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciBFWElTVFMgPSBoYXNPd24oRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJyk7XG4vLyBhZGRpdGlvbmFsIHByb3RlY3Rpb24gZnJvbSBtaW5pZmllZCAvIG1hbmdsZWQgLyBkcm9wcGVkIGZ1bmN0aW9uIG5hbWVzXG52YXIgUFJPUEVSID0gRVhJU1RTICYmIChmdW5jdGlvbiBzb21ldGhpbmcoKSB7IC8qIGVtcHR5ICovIH0pLm5hbWUgPT09ICdzb21ldGhpbmcnO1xudmFyIENPTkZJR1VSQUJMRSA9IEVYSVNUUyAmJiAoIURFU0NSSVBUT1JTIHx8IChERVNDUklQVE9SUyAmJiBnZXREZXNjcmlwdG9yKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpLmNvbmZpZ3VyYWJsZSkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRVhJU1RTOiBFWElTVFMsXG4gIFBST1BFUjogUFJPUEVSLFxuICBDT05GSUdVUkFCTEU6IENPTkZJR1VSQUJMRVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1hY2Nlc3Nvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIG1ldGhvZCkge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbiAgICByZXR1cm4gdW5jdXJyeVRoaXMoYUNhbGxhYmxlKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBrZXkpW21ldGhvZF0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtYWNjZXNzb3IuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY2xhc3NvZlJhdyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mLXJhdyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4pIHtcbiAgLy8gTmFzaG9ybiBidWc6XG4gIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzExMjhcbiAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTEzMFxuICBpZiAoY2xhc3NvZlJhdyhmbikgPT09ICdGdW5jdGlvbicpIHJldHVybiB1bmN1cnJ5VGhpcyhmbik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzXCIpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgY2FsbCA9IEZ1bmN0aW9uUHJvdG90eXBlLmNhbGw7XG52YXIgdW5jdXJyeVRoaXNXaXRoQmluZCA9IE5BVElWRV9CSU5EICYmIEZ1bmN0aW9uUHJvdG90eXBlLmJpbmQuYmluZChjYWxsLCBjYWxsKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfQklORCA/IHVuY3VycnlUaGlzV2l0aEJpbmQgOiBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2FsbC5hcHBseShmbiwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzQ2FsbGFibGUoYXJndW1lbnQpID8gYXJndW1lbnQgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pIDogZ2xvYmFsW25hbWVzcGFjZV0gJiYgZ2xvYmFsW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanNcIik7XG52YXIgZ2V0TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzXCIpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0KSkgcmV0dXJuIGdldE1ldGhvZChpdCwgSVRFUkFUT1IpXG4gICAgfHwgZ2V0TWV0aG9kKGl0LCAnQEBpdGVyYXRvcicpXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciB0cnlUb1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90cnktdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qc1wiKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qc1wiKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50LCB1c2luZ0l0ZXJhdG9yKSB7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gZ2V0SXRlcmF0b3JNZXRob2QoYXJndW1lbnQpIDogdXNpbmdJdGVyYXRvcjtcbiAgaWYgKGFDYWxsYWJsZShpdGVyYXRvck1ldGhvZCkpIHJldHVybiBhbk9iamVjdChjYWxsKGl0ZXJhdG9yTWV0aG9kLCBhcmd1bWVudCkpO1xuICB0aHJvdyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGl0ZXJhYmxlJyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtanNvbi1yZXBsYWNlci1mdW5jdGlvbi5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGlzQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtYXJyYXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mLXJhdyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocmVwbGFjZXIpIHtcbiAgaWYgKGlzQ2FsbGFibGUocmVwbGFjZXIpKSByZXR1cm4gcmVwbGFjZXI7XG4gIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJldHVybjtcbiAgdmFyIHJhd0xlbmd0aCA9IHJlcGxhY2VyLmxlbmd0aDtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXdMZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGVtZW50ID0gcmVwbGFjZXJbaV07XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09ICdzdHJpbmcnKSBwdXNoKGtleXMsIGVsZW1lbnQpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09ICdudW1iZXInIHx8IGNsYXNzb2YoZWxlbWVudCkgPT0gJ051bWJlcicgfHwgY2xhc3NvZihlbGVtZW50KSA9PSAnU3RyaW5nJykgcHVzaChrZXlzLCB0b1N0cmluZyhlbGVtZW50KSk7XG4gIH1cbiAgdmFyIGtleXNMZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIHJvb3QgPSB0cnVlO1xuICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBpZiAocm9vdCkge1xuICAgICAgcm9vdCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheSh0aGlzKSkgcmV0dXJuIHZhbHVlO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5c0xlbmd0aDsgaisrKSBpZiAoa2V5c1tqXSA9PT0ga2V5KSByZXR1cm4gdmFsdWU7XG4gIH07XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1qc29uLXJlcGxhY2VyLWZ1bmN0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tZXRob2QuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzXCIpO1xuXG4vLyBgR2V0TWV0aG9kYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChWLCBQKSB7XG4gIHZhciBmdW5jID0gVltQXTtcbiAgcmV0dXJuIGlzTnVsbE9yVW5kZWZpbmVkKGZ1bmMpID8gdW5kZWZpbmVkIDogYUNhbGxhYmxlKGZ1bmMpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zdWJzdGl0dXRpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVkb3Mvbm8tdnVsbmVyYWJsZSAtLSBzYWZlXG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFMgPSAvXFwkKFskJidgXXxcXGR7MSwyfXw8W14+XSo+KS9nO1xudmFyIFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEID0gL1xcJChbJCYnYF18XFxkezEsMn0pL2c7XG5cbi8vIGBHZXRTdWJzdGl0dXRpb25gIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXRzdWJzdGl0dXRpb25cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1hdGNoZWQsIHN0ciwgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlbWVudCkge1xuICB2YXIgdGFpbFBvcyA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gIHZhciBtID0gY2FwdHVyZXMubGVuZ3RoO1xuICB2YXIgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEO1xuICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbmFtZWRDYXB0dXJlcyA9IHRvT2JqZWN0KG5hbWVkQ2FwdHVyZXMpO1xuICAgIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MUztcbiAgfVxuICByZXR1cm4gcmVwbGFjZShyZXBsYWNlbWVudCwgc3ltYm9scywgZnVuY3Rpb24gKG1hdGNoLCBjaCkge1xuICAgIHZhciBjYXB0dXJlO1xuICAgIHN3aXRjaCAoY2hhckF0KGNoLCAwKSkge1xuICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7XG4gICAgICBjYXNlICcmJzogcmV0dXJuIG1hdGNoZWQ7XG4gICAgICBjYXNlICdgJzogcmV0dXJuIHN0cmluZ1NsaWNlKHN0ciwgMCwgcG9zaXRpb24pO1xuICAgICAgY2FzZSBcIidcIjogcmV0dXJuIHN0cmluZ1NsaWNlKHN0ciwgdGFpbFBvcyk7XG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgY2FwdHVyZSA9IG5hbWVkQ2FwdHVyZXNbc3RyaW5nU2xpY2UoY2gsIDEsIC0xKV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDogLy8gXFxkXFxkP1xuICAgICAgICB2YXIgbiA9ICtjaDtcbiAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgaWYgKG4gPiBtKSB7XG4gICAgICAgICAgdmFyIGYgPSBmbG9vcihuIC8gMTApO1xuICAgICAgICAgIGlmIChmID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgaWYgKGYgPD0gbSkgcmV0dXJuIGNhcHR1cmVzW2YgLSAxXSA9PT0gdW5kZWZpbmVkID8gY2hhckF0KGNoLCAxKSA6IGNhcHR1cmVzW2YgLSAxXSArIGNoYXJBdChjaCwgMSk7XG4gICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9XG4gICAgICAgIGNhcHR1cmUgPSBjYXB0dXJlc1tuIC0gMV07XG4gICAgfVxuICAgIHJldHVybiBjYXB0dXJlID09PSB1bmRlZmluZWQgPyAnJyA6IGNhcHR1cmU7XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc3Vic3RpdHV0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyI6KGZ1bmN0aW9uKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7ZXZhbCgiXG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1nbG9iYWwtdGhpcyAtLSBzYWZlXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIF9fd2VicGFja19yZXF1aXJlX18uZyA9PSAnb2JqZWN0JyAmJiBfX3dlYnBhY2tfcmVxdWlyZV9fLmcpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBmYWxsYmFja1xuICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCB0aGlzIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKHt9Lmhhc093blByb3BlcnR5KTtcblxuLy8gYEhhc093blByb3BlcnR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaGFzb3ducHJvcGVydHlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaGFzb3duIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0Lmhhc093biB8fCBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkodG9PYmplY3QoaXQpLCBrZXkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGRlbi1rZXlzLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbm1vZHVsZS5leHBvcnRzID0ge307XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAtLSBzYWZlXG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanNcIik7XG5cbi8vIFRoYW5rcyB0byBJRTggZm9yIGl0cyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWVlZTc1NC5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG4vLyBJRUVFNzU0IGNvbnZlcnNpb25zIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvaWVlZTc1NFxudmFyICRBcnJheSA9IEFycmF5O1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIHBvdyA9IE1hdGgucG93O1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcblxudmFyIHBhY2sgPSBmdW5jdGlvbiAobnVtYmVyLCBtYW50aXNzYUxlbmd0aCwgYnl0ZXMpIHtcbiAgdmFyIGJ1ZmZlciA9ICRBcnJheShieXRlcyk7XG4gIHZhciBleHBvbmVudExlbmd0aCA9IGJ5dGVzICogOCAtIG1hbnRpc3NhTGVuZ3RoIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBleHBvbmVudExlbmd0aCkgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBydCA9IG1hbnRpc3NhTGVuZ3RoID09PSAyMyA/IHBvdygyLCAtMjQpIC0gcG93KDIsIC03NykgOiAwO1xuICB2YXIgc2lnbiA9IG51bWJlciA8IDAgfHwgbnVtYmVyID09PSAwICYmIDEgLyBudW1iZXIgPCAwID8gMSA6IDA7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBleHBvbmVudCwgbWFudGlzc2EsIGM7XG4gIG51bWJlciA9IGFicyhudW1iZXIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICBpZiAobnVtYmVyICE9IG51bWJlciB8fCBudW1iZXIgPT09IEluZmluaXR5KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICBtYW50aXNzYSA9IG51bWJlciAhPSBudW1iZXIgPyAxIDogMDtcbiAgICBleHBvbmVudCA9IGVNYXg7XG4gIH0gZWxzZSB7XG4gICAgZXhwb25lbnQgPSBmbG9vcihsb2cobnVtYmVyKSAvIExOMik7XG4gICAgYyA9IHBvdygyLCAtZXhwb25lbnQpO1xuICAgIGlmIChudW1iZXIgKiBjIDwgMSkge1xuICAgICAgZXhwb25lbnQtLTtcbiAgICAgIGMgKj0gMjtcbiAgICB9XG4gICAgaWYgKGV4cG9uZW50ICsgZUJpYXMgPj0gMSkge1xuICAgICAgbnVtYmVyICs9IHJ0IC8gYztcbiAgICB9IGVsc2Uge1xuICAgICAgbnVtYmVyICs9IHJ0ICogcG93KDIsIDEgLSBlQmlhcyk7XG4gICAgfVxuICAgIGlmIChudW1iZXIgKiBjID49IDIpIHtcbiAgICAgIGV4cG9uZW50Kys7XG4gICAgICBjIC89IDI7XG4gICAgfVxuICAgIGlmIChleHBvbmVudCArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG1hbnRpc3NhID0gMDtcbiAgICAgIGV4cG9uZW50ID0gZU1heDtcbiAgICB9IGVsc2UgaWYgKGV4cG9uZW50ICsgZUJpYXMgPj0gMSkge1xuICAgICAgbWFudGlzc2EgPSAobnVtYmVyICogYyAtIDEpICogcG93KDIsIG1hbnRpc3NhTGVuZ3RoKTtcbiAgICAgIGV4cG9uZW50ID0gZXhwb25lbnQgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbWFudGlzc2EgPSBudW1iZXIgKiBwb3coMiwgZUJpYXMgLSAxKSAqIHBvdygyLCBtYW50aXNzYUxlbmd0aCk7XG4gICAgICBleHBvbmVudCA9IDA7XG4gICAgfVxuICB9XG4gIHdoaWxlIChtYW50aXNzYUxlbmd0aCA+PSA4KSB7XG4gICAgYnVmZmVyW2luZGV4KytdID0gbWFudGlzc2EgJiAyNTU7XG4gICAgbWFudGlzc2EgLz0gMjU2O1xuICAgIG1hbnRpc3NhTGVuZ3RoIC09IDg7XG4gIH1cbiAgZXhwb25lbnQgPSBleHBvbmVudCA8PCBtYW50aXNzYUxlbmd0aCB8IG1hbnRpc3NhO1xuICBleHBvbmVudExlbmd0aCArPSBtYW50aXNzYUxlbmd0aDtcbiAgd2hpbGUgKGV4cG9uZW50TGVuZ3RoID4gMCkge1xuICAgIGJ1ZmZlcltpbmRleCsrXSA9IGV4cG9uZW50ICYgMjU1O1xuICAgIGV4cG9uZW50IC89IDI1NjtcbiAgICBleHBvbmVudExlbmd0aCAtPSA4O1xuICB9XG4gIGJ1ZmZlclstLWluZGV4XSB8PSBzaWduICogMTI4O1xuICByZXR1cm4gYnVmZmVyO1xufTtcblxudmFyIHVucGFjayA9IGZ1bmN0aW9uIChidWZmZXIsIG1hbnRpc3NhTGVuZ3RoKSB7XG4gIHZhciBieXRlcyA9IGJ1ZmZlci5sZW5ndGg7XG4gIHZhciBleHBvbmVudExlbmd0aCA9IGJ5dGVzICogOCAtIG1hbnRpc3NhTGVuZ3RoIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBleHBvbmVudExlbmd0aCkgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBuQml0cyA9IGV4cG9uZW50TGVuZ3RoIC0gNztcbiAgdmFyIGluZGV4ID0gYnl0ZXMgLSAxO1xuICB2YXIgc2lnbiA9IGJ1ZmZlcltpbmRleC0tXTtcbiAgdmFyIGV4cG9uZW50ID0gc2lnbiAmIDEyNztcbiAgdmFyIG1hbnRpc3NhO1xuICBzaWduID4+PSA3O1xuICB3aGlsZSAobkJpdHMgPiAwKSB7XG4gICAgZXhwb25lbnQgPSBleHBvbmVudCAqIDI1NiArIGJ1ZmZlcltpbmRleC0tXTtcbiAgICBuQml0cyAtPSA4O1xuICB9XG4gIG1hbnRpc3NhID0gZXhwb25lbnQgJiAoMSA8PCAtbkJpdHMpIC0gMTtcbiAgZXhwb25lbnQgPj49IC1uQml0cztcbiAgbkJpdHMgKz0gbWFudGlzc2FMZW5ndGg7XG4gIHdoaWxlIChuQml0cyA+IDApIHtcbiAgICBtYW50aXNzYSA9IG1hbnRpc3NhICogMjU2ICsgYnVmZmVyW2luZGV4LS1dO1xuICAgIG5CaXRzIC09IDg7XG4gIH1cbiAgaWYgKGV4cG9uZW50ID09PSAwKSB7XG4gICAgZXhwb25lbnQgPSAxIC0gZUJpYXM7XG4gIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbWFudGlzc2EgPyBOYU4gOiBzaWduID8gLUluZmluaXR5IDogSW5maW5pdHk7XG4gIH0gZWxzZSB7XG4gICAgbWFudGlzc2EgPSBtYW50aXNzYSArIHBvdygyLCBtYW50aXNzYUxlbmd0aCk7XG4gICAgZXhwb25lbnQgPSBleHBvbmVudCAtIGVCaWFzO1xuICB9IHJldHVybiAoc2lnbiA/IC0xIDogMSkgKiBtYW50aXNzYSAqIHBvdygyLCBleHBvbmVudCAtIG1hbnRpc3NhTGVuZ3RoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwYWNrOiBwYWNrLFxuICB1bnBhY2s6IHVucGFja1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZWVlNzU0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpO1xuXG4vLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAtLSBzYWZlXG4gIHJldHVybiAhJE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQoaXQsICcnKSA6ICRPYmplY3QoaXQpO1xufSA6ICRPYmplY3Q7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzXCIpO1xuXG4vLyBtYWtlcyBzdWJjbGFzc2luZyB3b3JrIGNvcnJlY3QgZm9yIHdyYXBwZWQgYnVpbHQtaW5zXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHtcbiAgdmFyIE5ld1RhcmdldCwgTmV3VGFyZ2V0UHJvdG90eXBlO1xuICBpZiAoXG4gICAgLy8gaXQgY2FuIHdvcmsgb25seSB3aXRoIG5hdGl2ZSBgc2V0UHJvdG90eXBlT2ZgXG4gICAgc2V0UHJvdG90eXBlT2YgJiZcbiAgICAvLyB3ZSBoYXZlbid0IGNvbXBsZXRlbHkgY29ycmVjdCBwcmUtRVM2IHdheSBmb3IgZ2V0dGluZyBgbmV3LnRhcmdldGAsIHNvIHVzZSB0aGlzXG4gICAgaXNDYWxsYWJsZShOZXdUYXJnZXQgPSBkdW1teS5jb25zdHJ1Y3RvcikgJiZcbiAgICBOZXdUYXJnZXQgIT09IFdyYXBwZXIgJiZcbiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJlxuICAgIE5ld1RhcmdldFByb3RvdHlwZSAhPT0gV3JhcHBlci5wcm90b3R5cGVcbiAgKSBzZXRQcm90b3R5cGVPZigkdGhpcywgTmV3VGFyZ2V0UHJvdG90eXBlKTtcbiAgcmV0dXJuICR0aGlzO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIHN0b3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qc1wiKTtcblxudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyhGdW5jdGlvbi50b1N0cmluZyk7XG5cbi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgY29yZS1qc0AzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICghaXNDYWxsYWJsZShzdG9yZS5pbnNwZWN0U291cmNlKSkge1xuICBzdG9yZS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcoaXQpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlLmluc3BlY3RTb3VyY2U7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zdGFsbC1lcnJvci1jYXVzZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG5cbi8vIGBJbnN0YWxsRXJyb3JDYXVzZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtZXJyb3ItY2F1c2UvI3NlYy1lcnJvcm9iamVjdHMtaW5zdGFsbC1lcnJvci1jYXVzZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgb3B0aW9ucykge1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NhdXNlJyBpbiBvcHRpb25zKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE8sICdjYXVzZScsIG9wdGlvbnMuY2F1c2UpO1xuICB9XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3RhbGwtZXJyb3ItY2F1c2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanNcIikuZik7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzXCIpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbE1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzXCIpO1xudmFyIGlzRXh0ZW5zaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtaXMtZXh0ZW5zaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1leHRlbnNpYmxlLmpzXCIpO1xudmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91aWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanNcIik7XG52YXIgRlJFRVpJTkcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnJlZXppbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qc1wiKTtcblxudmFyIFJFUVVJUkVEID0gZmFsc2U7XG52YXIgTUVUQURBVEEgPSB1aWQoJ21ldGEnKTtcbnZhciBpZCA9IDA7XG5cbnZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBkZWZpbmVQcm9wZXJ0eShpdCwgTUVUQURBVEEsIHsgdmFsdWU6IHtcbiAgICBvYmplY3RJRDogJ08nICsgaWQrKywgLy8gb2JqZWN0IElEXG4gICAgd2Vha0RhdGE6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBhIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXNPd24oaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEO1xufTtcblxudmFyIGdldFdlYWtEYXRhID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXNPd24oaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiB0aGUgc3RvcmUgb2Ygd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLndlYWtEYXRhO1xufTtcblxuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaSU5HICYmIFJFUVVJUkVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhc093bihpdCwgTUVUQURBVEEpKSBzZXRNZXRhZGF0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cbnZhciBlbmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gIG1ldGEuZW5hYmxlID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuICBSRVFVSVJFRCA9IHRydWU7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mO1xuICB2YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdGVzdFtNRVRBREFUQV0gPSAxO1xuXG4gIC8vIHByZXZlbnQgZXhwb3Npbmcgb2YgbWV0YWRhdGEga2V5XG4gIGlmIChnZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QpLmxlbmd0aCkge1xuICAgIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZiA9IGZ1bmN0aW9uIChpdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocmVzdWx0W2ldID09PSBNRVRBREFUQSkge1xuICAgICAgICAgIHNwbGljZShyZXN1bHQsIGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgICQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgICAgZ2V0T3duUHJvcGVydHlOYW1lczogZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsTW9kdWxlLmZcbiAgICB9KTtcbiAgfVxufTtcblxudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZW5hYmxlOiBlbmFibGUsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWtEYXRhOiBnZXRXZWFrRGF0YSxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuXG5oaWRkZW5LZXlzW01FVEFEQVRBXSA9IHRydWU7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIE5BVElWRV9XRUFLX01BUCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qc1wiKTtcbnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2hhcmVkLWtleSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanNcIik7XG52YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oaWRkZW4ta2V5cyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGRlbi1rZXlzLmpzXCIpO1xuXG52YXIgT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQgPSAnT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCB8fCBzaGFyZWQuc3RhdGUpIHtcbiAgdmFyIHN0b3JlID0gc2hhcmVkLnN0YXRlIHx8IChzaGFyZWQuc3RhdGUgPSBuZXcgV2Vha01hcCgpKTtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1hc3NpZ24gLS0gcHJvdG90eXBlIG1ldGhvZHMgcHJvdGVjdGlvbiAqL1xuICBzdG9yZS5nZXQgPSBzdG9yZS5nZXQ7XG4gIHN0b3JlLmhhcyA9IHN0b3JlLmhhcztcbiAgc3RvcmUuc2V0ID0gc3RvcmUuc2V0O1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtYXNzaWduIC0tIHByb3RvdHlwZSBtZXRob2RzIHByb3RlY3Rpb24gKi9cbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChzdG9yZS5oYXMoaXQpKSB0aHJvdyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIHN0b3JlLnNldChpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHN0b3JlLmdldChpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBzdG9yZS5oYXMoaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAoaGFzT3duKGl0LCBTVEFURSkpIHRocm93IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG5cbi8vIGBJc0FycmF5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNhcnJheVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWlzYXJyYXkgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoYXJndW1lbnQpID09ICdBcnJheSc7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWJpZy1pbnQtYXJyYXkuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBrbGFzcyA9IGNsYXNzb2YoaXQpO1xuICByZXR1cm4ga2xhc3MgPT0gJ0JpZ0ludDY0QXJyYXknIHx8IGtsYXNzID09ICdCaWdVaW50NjRBcnJheSc7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWJpZy1pbnQtYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICRkb2N1bWVudEFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb2N1bWVudC1hbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1hbGwuanNcIik7XG5cbnZhciBkb2N1bWVudEFsbCA9ICRkb2N1bWVudEFsbC5hbGw7XG5cbi8vIGBJc0NhbGxhYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNjYWxsYWJsZVxubW9kdWxlLmV4cG9ydHMgPSAkZG9jdW1lbnRBbGwuSVNfSFRNTEREQSA/IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbicgfHwgYXJndW1lbnQgPT09IGRvY3VtZW50QWxsO1xufSA6IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbic7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qc1wiKTtcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBpbnNwZWN0U291cmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanNcIik7XG5cbnZhciBub29wID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIGVtcHR5ID0gW107XG52YXIgY29uc3RydWN0ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdjb25zdHJ1Y3QnKTtcbnZhciBjb25zdHJ1Y3RvclJlZ0V4cCA9IC9eXFxzKig/OmNsYXNzfGZ1bmN0aW9uKVxcYi87XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKGNvbnN0cnVjdG9yUmVnRXhwLmV4ZWMpO1xudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSAhY29uc3RydWN0b3JSZWdFeHAuZXhlYyhub29wKTtcblxudmFyIGlzQ29uc3RydWN0b3JNb2Rlcm4gPSBmdW5jdGlvbiBpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG4gIGlmICghaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdHJ1Y3Qobm9vcCwgZW1wdHksIGFyZ3VtZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBpc0NvbnN0cnVjdG9yTGVnYWN5ID0gZnVuY3Rpb24gaXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHN3aXRjaCAoY2xhc3NvZihhcmd1bWVudCkpIHtcbiAgICBjYXNlICdBc3luY0Z1bmN0aW9uJzpcbiAgICBjYXNlICdHZW5lcmF0b3JGdW5jdGlvbic6XG4gICAgY2FzZSAnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbic6IHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIC8vIHdlIGNhbid0IGNoZWNrIC5wcm90b3R5cGUgc2luY2UgY29uc3RydWN0b3JzIHByb2R1Y2VkIGJ5IC5iaW5kIGhhdmVuJ3QgaXRcbiAgICAvLyBgRnVuY3Rpb24jdG9TdHJpbmdgIHRocm93cyBvbiBzb21lIGJ1aWx0LWl0IGZ1bmN0aW9uIGluIHNvbWUgbGVnYWN5IGVuZ2luZXNcbiAgICAvLyAoZm9yIGV4YW1wbGUsIGBET01RdWFkYCBhbmQgc2ltaWxhciBpbiBGRjQxLSlcbiAgICByZXR1cm4gSU5DT1JSRUNUX1RPX1NUUklORyB8fCAhIWV4ZWMoY29uc3RydWN0b3JSZWdFeHAsIGluc3BlY3RTb3VyY2UoYXJndW1lbnQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuaXNDb25zdHJ1Y3RvckxlZ2FjeS5zaGFtID0gdHJ1ZTtcblxuLy8gYElzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9ICFjb25zdHJ1Y3QgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgY2FsbGVkO1xuICByZXR1cm4gaXNDb25zdHJ1Y3Rvck1vZGVybihpc0NvbnN0cnVjdG9yTW9kZXJuLmNhbGwpXG4gICAgfHwgIWlzQ29uc3RydWN0b3JNb2Rlcm4oT2JqZWN0KVxuICAgIHx8ICFpc0NvbnN0cnVjdG9yTW9kZXJuKGZ1bmN0aW9uICgpIHsgY2FsbGVkID0gdHJ1ZTsgfSlcbiAgICB8fCBjYWxsZWQ7XG59KSA/IGlzQ29uc3RydWN0b3JMZWdhY3kgOiBpc0NvbnN0cnVjdG9yTW9kZXJuO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogaXNDYWxsYWJsZShkZXRlY3Rpb24pID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xuXG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgSXNJbnRlZ3JhbE51bWJlcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzaW50ZWdyYWxudW1iZXJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1udW1iZXItaXNpbnRlZ2VyIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG4vLyB3ZSBjYW4ndCB1c2UganVzdCBgaXQgPT0gbnVsbGAgc2luY2Ugb2YgYGRvY3VtZW50LmFsbGAgc3BlY2lhbCBjYXNlXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLUlzSFRNTEREQS1pbnRlcm5hbC1zbG90LWFlY1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSBudWxsIHx8IGl0ID09PSB1bmRlZmluZWQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyICRkb2N1bWVudEFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb2N1bWVudC1hbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1hbGwuanNcIik7XG5cbnZhciBkb2N1bWVudEFsbCA9ICRkb2N1bWVudEFsbC5hbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gJGRvY3VtZW50QWxsLklTX0hUTUxEREEgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogaXNDYWxsYWJsZShpdCkgfHwgaXQgPT09IGRvY3VtZW50QWxsO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiBpc0NhbGxhYmxlKGl0KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG4vLyBgSXNSZWdFeHBgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc3JlZ2V4cFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY2xhc3NvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtc3ltYm9sLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzXCIpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgJFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xuICByZXR1cm4gaXNDYWxsYWJsZSgkU3ltYm9sKSAmJiBpc1Byb3RvdHlwZU9mKCRTeW1ib2wucHJvdG90eXBlLCAkT2JqZWN0KGl0KSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciB0cnlUb1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90cnktdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qc1wiKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgaXNQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBnZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanNcIik7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanNcIik7XG52YXIgaXRlcmF0b3JDbG9zZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxudmFyIFJlc3VsdCA9IGZ1bmN0aW9uIChzdG9wcGVkLCByZXN1bHQpIHtcbiAgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDtcbiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG59O1xuXG52YXIgUmVzdWx0UHJvdG90eXBlID0gUmVzdWx0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIHVuYm91bmRGdW5jdGlvbiwgb3B0aW9ucykge1xuICB2YXIgdGhhdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGF0O1xuICB2YXIgQVNfRU5UUklFUyA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5BU19FTlRSSUVTKTtcbiAgdmFyIElTX1JFQ09SRCA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JU19SRUNPUkQpO1xuICB2YXIgSVNfSVRFUkFUT1IgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfSVRFUkFUT1IpO1xuICB2YXIgSU5URVJSVVBURUQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSU5URVJSVVBURUQpO1xuICB2YXIgZm4gPSBiaW5kKHVuYm91bmRGdW5jdGlvbiwgdGhhdCk7XG4gIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIG5leHQsIHN0ZXA7XG5cbiAgdmFyIHN0b3AgPSBmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG4gICAgaWYgKGl0ZXJhdG9yKSBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgY29uZGl0aW9uKTtcbiAgICByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCBjb25kaXRpb24pO1xuICB9O1xuXG4gIHZhciBjYWxsRm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoQVNfRU5UUklFUykge1xuICAgICAgYW5PYmplY3QodmFsdWUpO1xuICAgICAgcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWVbMF0sIHZhbHVlWzFdLCBzdG9wKSA6IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgfSByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZSwgc3RvcCkgOiBmbih2YWx1ZSk7XG4gIH07XG5cbiAgaWYgKElTX1JFQ09SRCkge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGUuaXRlcmF0b3I7XG4gIH0gZWxzZSBpZiAoSVNfSVRFUkFUT1IpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICB9IGVsc2Uge1xuICAgIGl0ZXJGbiA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0ZXJhYmxlKTtcbiAgICBpZiAoIWl0ZXJGbikgdGhyb3cgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhpdGVyYWJsZSkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoaXRlcmFibGUpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBjYWxsRm4oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKGl0ZXJhYmxlLCBpdGVyRm4pO1xuICB9XG5cbiAgbmV4dCA9IElTX1JFQ09SRCA/IGl0ZXJhYmxlLm5leHQgOiBpdGVyYXRvci5uZXh0O1xuICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gY2FsbEZuKHN0ZXAudmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdvYmplY3QnICYmIHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xudmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGtpbmQsIHZhbHVlKSB7XG4gIHZhciBpbm5lclJlc3VsdCwgaW5uZXJFcnJvcjtcbiAgYW5PYmplY3QoaXRlcmF0b3IpO1xuICB0cnkge1xuICAgIGlubmVyUmVzdWx0ID0gZ2V0TWV0aG9kKGl0ZXJhdG9yLCAncmV0dXJuJyk7XG4gICAgaWYgKCFpbm5lclJlc3VsdCkge1xuICAgICAgaWYgKGtpbmQgPT09ICd0aHJvdycpIHRocm93IHZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpbm5lclJlc3VsdCA9IGNhbGwoaW5uZXJSZXN1bHQsIGl0ZXJhdG9yKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbm5lckVycm9yID0gdHJ1ZTtcbiAgICBpbm5lclJlc3VsdCA9IGVycm9yO1xuICB9XG4gIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTtcbiAgaWYgKGlubmVyRXJyb3IpIHRocm93IGlubmVyUmVzdWx0O1xuICBhbk9iamVjdChpbm5lclJlc3VsdCk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLWNvbnN0cnVjdG9yLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qc1wiKS5JdGVyYXRvclByb3RvdHlwZSk7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0LCBFTlVNRVJBQkxFX05FWFQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigrIUVOVU1FUkFCTEVfTkVYVCwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBGdW5jdGlvbk5hbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanNcIik7XG5cbnZhciBQUk9QRVJfRlVOQ1RJT05fTkFNRSA9IEZ1bmN0aW9uTmFtZS5QUk9QRVI7XG52YXIgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuQ09ORklHVVJBQkxFO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gSXRlcmF0b3JzQ29yZS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG52YXIgRU5UUklFUyA9ICdlbnRyaWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYWJsZSwgTkFNRSwgSXRlcmF0b3JDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblxuICB2YXIgZ2V0SXRlcmF0aW9uTWV0aG9kID0gZnVuY3Rpb24gKEtJTkQpIHtcbiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7XG4gICAgaWYgKCFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIEtJTkQgaW4gSXRlcmFibGVQcm90b3R5cGUpIHJldHVybiBJdGVyYWJsZVByb3RvdHlwZVtLSU5EXTtcbiAgICBzd2l0Y2ggKEtJTkQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIEVOVFJJRVM6IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07XG4gIH07XG5cbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSBmYWxzZTtcbiAgdmFyIEl0ZXJhYmxlUHJvdG90eXBlID0gSXRlcmFibGUucHJvdG90eXBlO1xuICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl1cbiAgICB8fCBJdGVyYWJsZVByb3RvdHlwZVsnQEBpdGVyYXRvciddXG4gICAgfHwgREVGQVVMVCAmJiBJdGVyYWJsZVByb3RvdHlwZVtERUZBVUxUXTtcbiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTtcbiAgdmFyIGFueU5hdGl2ZUl0ZXJhdG9yID0gTkFNRSA9PSAnQXJyYXknID8gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcyB8fCBuYXRpdmVJdGVyYXRvciA6IG5hdGl2ZUl0ZXJhdG9yO1xuICB2YXIgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBtZXRob2RzLCBLRVk7XG5cbiAgLy8gZml4IG5hdGl2ZVxuICBpZiAoYW55TmF0aXZlSXRlcmF0b3IpIHtcbiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7XG4gICAgaWYgKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0NhbGxhYmxlKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0pKSB7XG4gICAgICAgICAgZGVmaW5lQnVpbHRJbihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheS5wcm90b3R5cGUueyB2YWx1ZXMsIEBAaXRlcmF0b3IgfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKFBST1BFUl9GVU5DVElPTl9OQU1FICYmIERFRkFVTFQgPT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykge1xuICAgIGlmICghSVNfUFVSRSAmJiBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCAnbmFtZScsIFZBTFVFUyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IHRydWU7XG4gICAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBjYWxsKG5hdGl2ZUl0ZXJhdG9yLCB0aGlzKTsgfTtcbiAgICB9XG4gIH1cblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgZGVmaW5lQnVpbHRJbihJdGVyYWJsZVByb3RvdHlwZSwgS0VZLCBtZXRob2RzW0tFWV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSAkKHsgdGFyZ2V0OiBOQU1FLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB9LCBtZXRob2RzKTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICBkZWZpbmVCdWlsdEluKEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yLCB7IG5hbWU6IERFRkFVTFQgfSk7XG4gIH1cbiAgSXRlcmF0b3JzW05BTUVdID0gZGVmYXVsdEl0ZXJhdG9yO1xuXG4gIHJldHVybiBtZXRob2RzO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanNcIik7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlO1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWtleXMgLS0gc2FmZSAqL1xuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG52YXIgTkVXX0lURVJBVE9SX1BST1RPVFlQRSA9ICFpc09iamVjdChJdGVyYXRvclByb3RvdHlwZSkgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgdGVzdCA9IHt9O1xuICAvLyBGRjQ0LSBsZWdhY3kgaXRlcmF0b3JzIGNhc2VcbiAgcmV0dXJuIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXS5jYWxsKHRlc3QpICE9PSB0ZXN0O1xufSk7XG5cbmlmIChORVdfSVRFUkFUT1JfUFJPVE9UWVBFKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuZWxzZSBpZiAoSVNfUFVSRSkgSXRlcmF0b3JQcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1AQGl0ZXJhdG9yXG5pZiAoIWlzQ2FsbGFibGUoSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdKSkge1xuICBkZWZpbmVCdWlsdEluKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcblxuLy8gYExlbmd0aE9mQXJyYXlMaWtlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbGVuZ3Rob2ZhcnJheWxpa2Vcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdG9MZW5ndGgob2JqLmxlbmd0aCk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUuanNcIikuQ09ORklHVVJBQkxFKTtcbnZhciBpbnNwZWN0U291cmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanNcIik7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzXCIpO1xuXG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmVuZm9yY2U7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyICRTdHJpbmcgPSBTdHJpbmc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgam9pbiA9IHVuY3VycnlUaGlzKFtdLmpvaW4pO1xuXG52YXIgQ09ORklHVVJBQkxFX0xFTkdUSCA9IERFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sICdsZW5ndGgnLCB7IHZhbHVlOiA4IH0pLmxlbmd0aCAhPT0gODtcbn0pO1xuXG52YXIgVEVNUExBVEUgPSBTdHJpbmcoU3RyaW5nKS5zcGxpdCgnU3RyaW5nJyk7XG5cbnZhciBtYWtlQnVpbHRJbiA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlLCBuYW1lLCBvcHRpb25zKSB7XG4gIGlmIChzdHJpbmdTbGljZSgkU3RyaW5nKG5hbWUpLCAwLCA3KSA9PT0gJ1N5bWJvbCgnKSB7XG4gICAgbmFtZSA9ICdbJyArIHJlcGxhY2UoJFN0cmluZyhuYW1lKSwgL15TeW1ib2xcXCgoW14pXSopXFwpLywgJyQxJykgKyAnXSc7XG4gIH1cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5nZXR0ZXIpIG5hbWUgPSAnZ2V0ICcgKyBuYW1lO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnNldHRlcikgbmFtZSA9ICdzZXQgJyArIG5hbWU7XG4gIGlmICghaGFzT3duKHZhbHVlLCAnbmFtZScpIHx8IChDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSAmJiB2YWx1ZS5uYW1lICE9PSBuYW1lKSkge1xuICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkodmFsdWUsICduYW1lJywgeyB2YWx1ZTogbmFtZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAgIGVsc2UgdmFsdWUubmFtZSA9IG5hbWU7XG4gIH1cbiAgaWYgKENPTkZJR1VSQUJMRV9MRU5HVEggJiYgb3B0aW9ucyAmJiBoYXNPd24ob3B0aW9ucywgJ2FyaXR5JykgJiYgdmFsdWUubGVuZ3RoICE9PSBvcHRpb25zLmFyaXR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkodmFsdWUsICdsZW5ndGgnLCB7IHZhbHVlOiBvcHRpb25zLmFyaXR5IH0pO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsICdjb25zdHJ1Y3RvcicpICYmIG9wdGlvbnMuY29uc3RydWN0b3IpIHtcbiAgICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkodmFsdWUsICdwcm90b3R5cGUnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICAvLyBpbiBWOCB+IENocm9tZSA1MywgcHJvdG90eXBlcyBvZiBzb21lIG1ldGhvZHMsIGxpa2UgYEFycmF5LnByb3RvdHlwZS52YWx1ZXNgLCBhcmUgbm9uLXdyaXRhYmxlXG4gICAgfSBlbHNlIGlmICh2YWx1ZS5wcm90b3R5cGUpIHZhbHVlLnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh2YWx1ZSk7XG4gIGlmICghaGFzT3duKHN0YXRlLCAnc291cmNlJykpIHtcbiAgICBzdGF0ZS5zb3VyY2UgPSBqb2luKFRFTVBMQVRFLCB0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJyA/IG5hbWUgOiAnJyk7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcblxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0ZW5kLW5hdGl2ZSAtLSByZXF1aXJlZFxuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gbWFrZUJ1aWx0SW4oZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiBpc0NhbGxhYmxlKHRoaXMpICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7XG59LCAndG9TdHJpbmcnKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYWtlLWJ1aWx0LWluLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hcC1oZWxwZXJzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1tYXAgLS0gc2FmZVxudmFyIE1hcFByb3RvdHlwZSA9IE1hcC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbWFwIC0tIHNhZmVcbiAgTWFwOiBNYXAsXG4gIHNldDogdW5jdXJyeVRoaXMoTWFwUHJvdG90eXBlLnNldCksXG4gIGdldDogdW5jdXJyeVRoaXMoTWFwUHJvdG90eXBlLmdldCksXG4gIGhhczogdW5jdXJyeVRoaXMoTWFwUHJvdG90eXBlLmhhcyksXG4gIHJlbW92ZTogdW5jdXJyeVRoaXMoTWFwUHJvdG90eXBlWydkZWxldGUnXSksXG4gIHByb3RvOiBNYXBQcm90b3R5cGVcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWFwLWhlbHBlcnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC10cnVuYy5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBNYXRoLnRydW5jYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWF0aC50cnVuY1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW1hdGgtdHJ1bmMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnRydW5jIHx8IGZ1bmN0aW9uIHRydW5jKHgpIHtcbiAgdmFyIG4gPSAreDtcbiAgcmV0dXJuIChuID4gMCA/IGZsb29yIDogY2VpbCkobik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtdHJ1bmMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzXCIpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcIikuZik7XG52YXIgbWFjcm90YXNrID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90YXNrICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qc1wiKS5zZXQpO1xudmFyIFF1ZXVlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3F1ZXVlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcXVldWUuanNcIik7XG52YXIgSVNfSU9TID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLmpzXCIpO1xudmFyIElTX0lPU19QRUJCTEUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcy1wZWJibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLXBlYmJsZS5qc1wiKTtcbnZhciBJU19XRUJPU19XRUJLSVQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy13ZWJvcy13ZWJraXQuanNcIik7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xuXG52YXIgTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG4vLyBOb2RlLmpzIDExIHNob3dzIEV4cGVyaW1lbnRhbFdhcm5pbmcgb24gZ2V0dGluZyBgcXVldWVNaWNyb3Rhc2tgXG52YXIgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgbWljcm90YXNrID0gcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yICYmIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvci52YWx1ZTtcbnZhciBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZSwgdGhlbjtcblxuLy8gbW9kZXJuIGVuZ2luZXMgaGF2ZSBxdWV1ZU1pY3JvdGFzayBtZXRob2RcbmlmICghbWljcm90YXNrKSB7XG4gIHZhciBxdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChmbiA9IHF1ZXVlLmdldCgpKSB0cnkge1xuICAgICAgZm4oKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHF1ZXVlLmhlYWQpIG5vdGlmeSgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgLy8gYWxzbyBleGNlcHQgV2ViT1MgV2Via2l0IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84OThcbiAgaWYgKCFJU19JT1MgJiYgIUlTX05PREUgJiYgIUlTX1dFQk9TX1dFQktJVCAmJiBNdXRhdGlvbk9ic2VydmVyICYmIGRvY3VtZW50KSB7XG4gICAgdG9nZ2xlID0gdHJ1ZTtcbiAgICBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoIUlTX0lPU19QRUJCTEUgJiYgUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAvLyB3b3JrYXJvdW5kIG9mIFdlYktpdCB+IGlPUyBTYWZhcmkgMTAuMSBidWdcbiAgICBwcm9taXNlLmNvbnN0cnVjdG9yID0gUHJvbWlzZTtcbiAgICB0aGVuID0gYmluZChwcm9taXNlLnRoZW4sIHByb21pc2UpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIE5vZGUuanMgd2l0aG91dCBwcm9taXNlc1xuICB9IGVsc2UgaWYgKElTX05PREUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdlXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIC8vIGB3ZWJwYWNrYCBkZXYgc2VydmVyIGJ1ZyBvbiBJRSBnbG9iYWwgbWV0aG9kcyAtIHVzZSBiaW5kKGZuLCBnbG9iYWwpXG4gICAgbWFjcm90YXNrID0gYmluZChtYWNyb3Rhc2ssIGdsb2JhbCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbWFjcm90YXNrKGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgbWljcm90YXNrID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgaWYgKCFxdWV1ZS5oZWFkKSBub3RpZnkoKTtcbiAgICBxdWV1ZS5hZGQoZm4pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pY3JvdGFzaztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyAkVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhQ2FsbGFibGUocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUNhbGxhYmxlKHJlamVjdCk7XG59O1xuXG4vLyBgTmV3UHJvbWlzZUNhcGFiaWxpdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1uZXdwcm9taXNlY2FwYWJpbGl0eVxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm9ybWFsaXplLXN0cmluZy1hcmd1bWVudC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCwgJGRlZmF1bHQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID09PSB1bmRlZmluZWQgPyBhcmd1bWVudHMubGVuZ3RoIDwgMiA/ICcnIDogJGRlZmF1bHQgOiB0b1N0cmluZyhhcmd1bWVudCk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXNSZWdFeHAoaXQpKSB7XG4gICAgdGhyb3cgJFR5cGVFcnJvcihcIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9uc1wiKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vdC1hLXJlZ2V4cC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIHRyaW0gPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy10cmltICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanNcIikudHJpbSk7XG52YXIgd2hpdGVzcGFjZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qc1wiKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgJHBhcnNlRmxvYXQgPSBnbG9iYWwucGFyc2VGbG9hdDtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIElURVJBVE9SID0gU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGT1JDRUQgPSAxIC8gJHBhcnNlRmxvYXQod2hpdGVzcGFjZXMgKyAnLTAnKSAhPT0gLUluZmluaXR5XG4gIC8vIE1TIEVkZ2UgMTgtIGJyb2tlbiB3aXRoIGJveGVkIHN5bWJvbHNcbiAgfHwgKElURVJBVE9SICYmICFmYWlscyhmdW5jdGlvbiAoKSB7ICRwYXJzZUZsb2F0KE9iamVjdChJVEVSQVRPUikpOyB9KSk7XG5cbi8vIGBwYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VmbG9hdC1zdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHJpbmcpIHtcbiAgdmFyIHRyaW1tZWRTdHJpbmcgPSB0cmltKHRvU3RyaW5nKHN0cmluZykpO1xuICB2YXIgcmVzdWx0ID0gJHBhcnNlRmxvYXQodHJpbW1lZFN0cmluZyk7XG4gIHJldHVybiByZXN1bHQgPT09IDAgJiYgY2hhckF0KHRyaW1tZWRTdHJpbmcsIDApID09ICctJyA/IC0wIDogcmVzdWx0O1xufSA6ICRwYXJzZUZsb2F0O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1wYXJzZS1mbG9hdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciB0cmltID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctdHJpbSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy10cmltLmpzXCIpLnRyaW0pO1xudmFyIHdoaXRlc3BhY2VzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanNcIik7XG5cbnZhciAkcGFyc2VJbnQgPSBnbG9iYWwucGFyc2VJbnQ7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBJVEVSQVRPUiA9IFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgaGV4ID0gL15bKy1dPzB4L2k7XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKGhleC5leGVjKTtcbnZhciBGT1JDRUQgPSAkcGFyc2VJbnQod2hpdGVzcGFjZXMgKyAnMDgnKSAhPT0gOCB8fCAkcGFyc2VJbnQod2hpdGVzcGFjZXMgKyAnMHgxNicpICE9PSAyMlxuICAvLyBNUyBFZGdlIDE4LSBicm9rZW4gd2l0aCBib3hlZCBzeW1ib2xzXG4gIHx8IChJVEVSQVRPUiAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgeyAkcGFyc2VJbnQoT2JqZWN0KElURVJBVE9SKSk7IH0pKTtcblxuLy8gYHBhcnNlSW50YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4XG5tb2R1bGUuZXhwb3J0cyA9IEZPUkNFRCA/IGZ1bmN0aW9uIHBhcnNlSW50KHN0cmluZywgcmFkaXgpIHtcbiAgdmFyIFMgPSB0cmltKHRvU3RyaW5nKHN0cmluZykpO1xuICByZXR1cm4gJHBhcnNlSW50KFMsIChyYWRpeCA+Pj4gMCkgfHwgKGV4ZWMoaGV4LCBTKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgb2JqZWN0S2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qta2V5cyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzXCIpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qc1wiKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzXCIpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qc1wiKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanNcIik7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtYXNzaWduIC0tIHNhZmVcbnZhciAkYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBjb25jYXQgPSB1bmN1cnJ5VGhpcyhbXS5jb25jYXQpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBzaG91bGQgaGF2ZSBjb3JyZWN0IG9yZGVyIG9mIG9wZXJhdGlvbnMgKEVkZ2UgYnVnKVxuICBpZiAoREVTQ1JJUFRPUlMgJiYgJGFzc2lnbih7IGI6IDEgfSwgJGFzc2lnbihkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICdiJywge1xuICAgICAgICB2YWx1ZTogMyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIHsgYjogMiB9KSkuYiAhPT0gMSkgcmV0dXJuIHRydWU7XG4gIC8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3ltYm9sIC0tIHNhZmVcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICB2YXIgYWxwaGFiZXQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW3N5bWJvbF0gPSA3O1xuICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtzeW1ib2xdICE9IDcgfHwgb2JqZWN0S2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IEluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChvYmplY3RLZXlzKFMpLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIHtcbiAgICAgIGtleSA9IGtleXNbaisrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgY2FsbChwcm9wZXJ0eUlzRW51bWVyYWJsZSwgUywga2V5KSkgVFtrZXldID0gU1trZXldO1xuICAgIH1cbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAtLSBvbGQgSUUsIFdTSCAqL1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qc1wiKTtcbnZhciBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qc1wiKTtcbnZhciBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanNcIik7XG52YXIgaHRtbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9odG1sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qc1wiKTtcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qc1wiKTtcbnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2hhcmVkLWtleSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanNcIik7XG5cbnZhciBHVCA9ICc+JztcbnZhciBMVCA9ICc8JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBTQ1JJUFQgPSAnc2NyaXB0JztcbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcblxudmFyIEVtcHR5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG5cbnZhciBzY3JpcHRUYWcgPSBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4gTFQgKyBTQ1JJUFQgKyBHVCArIGNvbnRlbnQgKyBMVCArICcvJyArIFNDUklQVCArIEdUO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIEFjdGl2ZVggT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYID0gZnVuY3Rpb24gKGFjdGl2ZVhEb2N1bWVudCkge1xuICBhY3RpdmVYRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCcnKSk7XG4gIGFjdGl2ZVhEb2N1bWVudC5jbG9zZSgpO1xuICB2YXIgdGVtcCA9IGFjdGl2ZVhEb2N1bWVudC5wYXJlbnRXaW5kb3cuT2JqZWN0O1xuICBhY3RpdmVYRG9jdW1lbnQgPSBudWxsOyAvLyBhdm9pZCBtZW1vcnkgbGVha1xuICByZXR1cm4gdGVtcDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgSlMgPSAnamF2YScgKyBTQ1JJUFQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzQ3NVxuICBpZnJhbWUuc3JjID0gU3RyaW5nKEpTKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJ2RvY3VtZW50LkY9T2JqZWN0JykpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICByZXR1cm4gaWZyYW1lRG9jdW1lbnQuRjtcbn07XG5cbi8vIENoZWNrIGZvciBkb2N1bWVudC5kb21haW4gYW5kIGFjdGl2ZSB4IHN1cHBvcnRcbi8vIE5vIG5lZWQgdG8gdXNlIGFjdGl2ZSB4IGFwcHJvYWNoIHdoZW4gZG9jdW1lbnQuZG9tYWluIGlzIG5vdCBzZXRcbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vaXNzdWVzLzE1MFxuLy8gdmFyaWF0aW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9raXRjYW1icmlkZ2UvZXM1LXNoaW0vY29tbWl0LzRmNzM4YWMwNjYzNDZcbi8vIGF2b2lkIElFIEdDIGJ1Z1xudmFyIGFjdGl2ZVhEb2N1bWVudDtcbnZhciBOdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgYWN0aXZlWERvY3VtZW50ID0gbmV3IEFjdGl2ZVhPYmplY3QoJ2h0bWxmaWxlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGlnbm9yZSAqLyB9XG4gIE51bGxQcm90b09iamVjdCA9IHR5cGVvZiBkb2N1bWVudCAhPSAndW5kZWZpbmVkJ1xuICAgID8gZG9jdW1lbnQuZG9tYWluICYmIGFjdGl2ZVhEb2N1bWVudFxuICAgICAgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCkgLy8gb2xkIElFXG4gICAgICA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpXG4gICAgOiBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCk7IC8vIFdTSFxuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBOdWxsUHJvdG9PYmplY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIE51bGxQcm90b09iamVjdCgpO1xufTtcblxuaGlkZGVuS2V5c1tJRV9QUk9UT10gPSB0cnVlO1xuXG4vLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtY3JlYXRlIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eUNvbnN0cnVjdG9yKCk7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBOdWxsUHJvdG9PYmplY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXNNb2R1bGUuZihyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBWOF9QUk9UT1RZUEVfREVGSU5FX0JVRyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1ZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnLmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qc1wiKTtcbnZhciBvYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanNcIik7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnRpZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgJiYgIVY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBwcm9wcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBwcm9wc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanNcIik7XG52YXIgVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdjgtcHJvdG90eXBlLWRlZmluZS1idWcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1Zy5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgJGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIEVOVU1FUkFCTEUgPSAnZW51bWVyYWJsZSc7XG52YXIgQ09ORklHVVJBQkxFID0gJ2NvbmZpZ3VyYWJsZSc7XG52YXIgV1JJVEFCTEUgPSAnd3JpdGFibGUnO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID8gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAodHlwZW9mIE8gPT09ICdmdW5jdGlvbicgJiYgUCA9PT0gJ3Byb3RvdHlwZScgJiYgJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzICYmIFdSSVRBQkxFIGluIEF0dHJpYnV0ZXMgJiYgIUF0dHJpYnV0ZXNbV1JJVEFCTEVdKSB7XG4gICAgdmFyIGN1cnJlbnQgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnRbV1JJVEFCTEVdKSB7XG4gICAgICBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgICAgIEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogQ09ORklHVVJBQkxFIGluIEF0dHJpYnV0ZXMgPyBBdHRyaWJ1dGVzW0NPTkZJR1VSQUJMRV0gOiBjdXJyZW50W0NPTkZJR1VSQUJMRV0sXG4gICAgICAgIGVudW1lcmFibGU6IEVOVU1FUkFCTEUgaW4gQXR0cmlidXRlcyA/IEF0dHJpYnV0ZXNbRU5VTUVSQUJMRV0gOiBjdXJyZW50W0VOVU1FUkFCTEVdLFxuICAgICAgICB3cml0YWJsZTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICB9IHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG59IDogJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyAkVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanNcIik7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcIik7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanNcIik7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkuanNcIik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xudmFyIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanNcIik7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXNPd24oTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIWNhbGwocHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZiwgTywgUCksIE9bUF0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eW5hbWVzIC0tIHNhZmUgKi9cbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanNcIik7XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanNcIikuZik7XG52YXIgYXJyYXlTbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUuanNcIik7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBhcnJheVNsaWNlKHdpbmRvd05hbWVzKTtcbiAgfVxufTtcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIGNsYXNzb2YoaXQpID09ICdXaW5kb3cnXG4gICAgPyBnZXRXaW5kb3dOYW1lcyhpdClcbiAgICA6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChpdCkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanNcIik7XG52YXIgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanNcIik7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyk9PntldmFsKCJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG52YXIgc2hhcmVkS2V5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzXCIpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanNcIik7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyIE9iamVjdFByb3RvdHlwZSA9ICRPYmplY3QucHJvdG90eXBlO1xuXG4vLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldHByb3RvdHlwZW9mIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID8gJE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIHZhciBvYmplY3QgPSB0b09iamVjdChPKTtcbiAgaWYgKGhhc093bihvYmplY3QsIElFX1BST1RPKSkgcmV0dXJuIG9iamVjdFtJRV9QUk9UT107XG4gIHZhciBjb25zdHJ1Y3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgaWYgKGlzQ2FsbGFibGUoY29uc3RydWN0b3IpICYmIG9iamVjdCBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgJE9iamVjdCA/IE9iamVjdFByb3RvdHlwZSA6IG51bGw7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1leHRlbnNpYmxlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG52YXIgQVJSQVlfQlVGRkVSX05PTl9FWFRFTlNJQkxFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1ub24tZXh0ZW5zaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1ub24tZXh0ZW5zaWJsZS5qc1wiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyICRpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlO1xudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7ICRpc0V4dGVuc2libGUoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmlzRXh0ZW5zaWJsZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5pc2V4dGVuc2libGVcbm1vZHVsZS5leHBvcnRzID0gKEZBSUxTX09OX1BSSU1JVElWRVMgfHwgQVJSQVlfQlVGRkVSX05PTl9FWFRFTlNJQkxFKSA/IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoQVJSQVlfQlVGRkVSX05PTl9FWFRFTlNJQkxFICYmIGNsYXNzb2YoaXQpID09ICdBcnJheUJ1ZmZlcicpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKGl0KSA6IHRydWU7XG59IDogJGlzRXh0ZW5zaWJsZTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtZXh0ZW5zaWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoe30uaXNQcm90b3R5cGVPZik7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qc1wiKTtcbnZhciBpbmRleE9mID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzXCIpLmluZGV4T2YpO1xudmFyIGhpZGRlbktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qc1wiKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhc093bihoaWRkZW5LZXlzLCBrZXkpICYmIGhhc093bihPLCBrZXkpICYmIHB1c2gocmVzdWx0LCBrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzT3duKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHB1c2gocmVzdWx0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qc1wiKTtcbnZhciBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qc1wiKTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qta2V5cyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyk9PntldmFsKCJcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBOYXNob3JuIH4gSkRLOCBidWdcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhJHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUucHJvcGVydHlpc2VudW1lcmFibGVcbmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTtcbiAgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvIC0tIHNhZmUgKi9cbnZhciB1bmN1cnJ5VGhpc0FjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1hY2Nlc3Nvci5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgYVBvc3NpYmxlUHJvdG90eXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanNcIik7XG5cbi8vIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2Zcbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1zZXRwcm90b3R5cGVvZiAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlO1xuICB2YXIgdGVzdCA9IHt9O1xuICB2YXIgc2V0dGVyO1xuICB0cnkge1xuICAgIHNldHRlciA9IHVuY3VycnlUaGlzQWNjZXNzb3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycsICdzZXQnKTtcbiAgICBzZXR0ZXIodGVzdCwgW10pO1xuICAgIENPUlJFQ1RfU0VUVEVSID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIGFuT2JqZWN0KE8pO1xuICAgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7XG4gICAgaWYgKENPUlJFQ1RfU0VUVEVSKSBzZXR0ZXIoTywgcHJvdG8pO1xuICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICByZXR1cm4gTztcbiAgfTtcbn0oKSA6IHVuZGVmaW5lZCk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgT3JkaW5hcnlUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0LCBwcmVmKSB7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAocHJlZiA9PT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKGlzQ2FsbGFibGUoZm4gPSBpbnB1dC52YWx1ZU9mKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHByZWYgIT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vd24ta2V5cy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xuXG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChrZXlzLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgdmFsdWU6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCB2YWx1ZTogZXJyb3IgfTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1mb3JjZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanNcIik7XG52YXIgaW5zcGVjdFNvdXJjZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIElTX0JST1dTRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3Nlci5qc1wiKTtcbnZhciBJU19ERU5PID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1kZW5vICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8uanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBWOF9WRVJTSU9OID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24uanNcIik7XG5cbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIFNVQkNMQVNTSU5HID0gZmFsc2U7XG52YXIgTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UID0gaXNDYWxsYWJsZShnbG9iYWwuUHJvbWlzZVJlamVjdGlvbkV2ZW50KTtcblxudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gaXNGb3JjZWQoJ1Byb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSA9IGluc3BlY3RTb3VyY2UoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKTtcbiAgdmFyIEdMT0JBTF9DT1JFX0pTX1BST01JU0UgPSBQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSAhPT0gU3RyaW5nKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIC8vIFY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gIC8vIFdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gIGlmICghR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiBWOF9WRVJTSU9OID09PSA2NikgcmV0dXJuIHRydWU7XG4gIC8vIFdlIG5lZWQgUHJvbWlzZSN7IGNhdGNoLCBmaW5hbGx5IH0gaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uXG4gIGlmIChJU19QVVJFICYmICEoTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnY2F0Y2gnXSAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10pKSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgY2FuJ3QgdXNlIEBAc3BlY2llcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbiAgaWYgKCFWOF9WRVJTSU9OIHx8IFY4X1ZFUlNJT04gPCA1MSB8fCAhL25hdGl2ZSBjb2RlLy50ZXN0KFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFKSkge1xuICAgIC8vIERldGVjdCBjb3JyZWN0bmVzcyBvZiBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgPSBuZXcgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUoMSk7IH0pO1xuICAgIHZhciBGYWtlUHJvbWlzZSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgICB9O1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb21pc2UuY29uc3RydWN0b3IgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlO1xuICAgIFNVQkNMQVNTSU5HID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgICBpZiAoIVNVQkNMQVNTSU5HKSByZXR1cm4gdHJ1ZTtcbiAgLy8gVW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICB9IHJldHVybiAhR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiAoSVNfQlJPV1NFUiB8fCBJU19ERU5PKSAmJiAhTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDT05TVFJVQ1RPUjogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IsXG4gIFJFSkVDVElPTl9FVkVOVDogTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5ULFxuICBTVUJDTEFTU0lORzogU1VCQ0xBU1NJTkdcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLlByb21pc2U7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbi5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanNcIik7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qc1wiKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKS5DT05TVFJVQ1RPUik7XG5cbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSkudGhlbih1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm94eS1hY2Nlc3Nvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpLmYpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUYXJnZXQsIFNvdXJjZSwga2V5KSB7XG4gIGtleSBpbiBUYXJnZXQgfHwgZGVmaW5lUHJvcGVydHkoVGFyZ2V0LCBrZXksIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBTb3VyY2Vba2V5XTsgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIChpdCkgeyBTb3VyY2Vba2V5XSA9IGl0OyB9XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm94eS1hY2Nlc3Nvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9xdWV1ZS5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG52YXIgUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaGVhZCA9IG51bGw7XG4gIHRoaXMudGFpbCA9IG51bGw7XG59O1xuXG5RdWV1ZS5wcm90b3R5cGUgPSB7XG4gIGFkZDogZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgZW50cnkgPSB7IGl0ZW06IGl0ZW0sIG5leHQ6IG51bGwgfTtcbiAgICB2YXIgdGFpbCA9IHRoaXMudGFpbDtcbiAgICBpZiAodGFpbCkgdGFpbC5uZXh0ID0gZW50cnk7XG4gICAgZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgfSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5oZWFkO1xuICAgIGlmIChlbnRyeSkge1xuICAgICAgdmFyIG5leHQgPSB0aGlzLmhlYWQgPSBlbnRyeS5uZXh0O1xuICAgICAgaWYgKG5leHQgPT09IG51bGwpIHRoaXMudGFpbCA9IG51bGw7XG4gICAgICByZXR1cm4gZW50cnkuaXRlbTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUXVldWU7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcXVldWUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG52YXIgcmVnZXhwRXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZXhlYyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYFJlZ0V4cEV4ZWNgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHBleGVjXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChSLCBTKSB7XG4gIHZhciBleGVjID0gUi5leGVjO1xuICBpZiAoaXNDYWxsYWJsZShleGVjKSkge1xuICAgIHZhciByZXN1bHQgPSBjYWxsKGV4ZWMsIFIsIFMpO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpIGFuT2JqZWN0KHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBpZiAoY2xhc3NvZihSKSA9PT0gJ1JlZ0V4cCcpIHJldHVybiBjYWxsKHJlZ2V4cEV4ZWMsIFIsIFMpO1xuICB0aHJvdyAkVHlwZUVycm9yKCdSZWdFeHAjZXhlYyBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyJyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8qIGVzbGludC1kaXNhYmxlIHJlZ2V4cC9uby1lbXB0eS1jYXB0dXJpbmctZ3JvdXAsIHJlZ2V4cC9uby1lbXB0eS1ncm91cCwgcmVnZXhwL25vLWxhenktZW5kcyAtLSB0ZXN0aW5nICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWdleHAvbm8tdXNlbGVzcy1xdWFudGlmaWVyIC0tIHRlc3RpbmcgKi9cbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgcmVnZXhwRmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzXCIpO1xudmFyIHN0aWNreUhlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLXN0aWNreS1oZWxwZXJzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLXN0aWNreS1oZWxwZXJzLmpzXCIpO1xudmFyIHNoYXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zaGFyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanNcIik7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIGdldEludGVybmFsU3RhdGUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIikuZ2V0KTtcbnZhciBVTlNVUFBPUlRFRF9ET1RfQUxMID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1kb3QtYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLXVuc3VwcG9ydGVkLWRvdC1hbGwuanNcIik7XG52YXIgVU5TVVBQT1JURURfTkNHID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1uY2cgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtbmNnLmpzXCIpO1xuXG52YXIgbmF0aXZlUmVwbGFjZSA9IHNoYXJlZCgnbmF0aXZlLXN0cmluZy1yZXBsYWNlJywgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbnZhciBuYXRpdmVFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xudmFyIHBhdGNoZWRFeGVjID0gbmF0aXZlRXhlYztcbnZhciBjaGFyQXQgPSB1bmN1cnJ5VGhpcygnJy5jaGFyQXQpO1xudmFyIGluZGV4T2YgPSB1bmN1cnJ5VGhpcygnJy5pbmRleE9mKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbnZhciBVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUxID0gL2EvO1xuICB2YXIgcmUyID0gL2IqL2c7XG4gIGNhbGwobmF0aXZlRXhlYywgcmUxLCAnYScpO1xuICBjYWxsKG5hdGl2ZUV4ZWMsIHJlMiwgJ2EnKTtcbiAgcmV0dXJuIHJlMS5sYXN0SW5kZXggIT09IDAgfHwgcmUyLmxhc3RJbmRleCAhPT0gMDtcbn0pKCk7XG5cbnZhciBVTlNVUFBPUlRFRF9ZID0gc3RpY2t5SGVscGVycy5CUk9LRU5fQ0FSRVQ7XG5cbi8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwLCBjb3BpZWQgZnJvbSBlczUtc2hpbSdzIFN0cmluZyNzcGxpdCBwYXRjaC5cbnZhciBOUENHX0lOQ0xVREVEID0gLygpPz8vLmV4ZWMoJycpWzFdICE9PSB1bmRlZmluZWQ7XG5cbnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEIHx8IFVOU1VQUE9SVEVEX1kgfHwgVU5TVVBQT1JURURfRE9UX0FMTCB8fCBVTlNVUFBPUlRFRF9OQ0c7XG5cbmlmIChQQVRDSCkge1xuICBwYXRjaGVkRXhlYyA9IGZ1bmN0aW9uIGV4ZWMoc3RyaW5nKSB7XG4gICAgdmFyIHJlID0gdGhpcztcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHJlKTtcbiAgICB2YXIgc3RyID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICB2YXIgcmF3ID0gc3RhdGUucmF3O1xuICAgIHZhciByZXN1bHQsIHJlQ29weSwgbGFzdEluZGV4LCBtYXRjaCwgaSwgb2JqZWN0LCBncm91cDtcblxuICAgIGlmIChyYXcpIHtcbiAgICAgIHJhdy5sYXN0SW5kZXggPSByZS5sYXN0SW5kZXg7XG4gICAgICByZXN1bHQgPSBjYWxsKHBhdGNoZWRFeGVjLCByYXcsIHN0cik7XG4gICAgICByZS5sYXN0SW5kZXggPSByYXcubGFzdEluZGV4O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgZ3JvdXBzID0gc3RhdGUuZ3JvdXBzO1xuICAgIHZhciBzdGlja3kgPSBVTlNVUFBPUlRFRF9ZICYmIHJlLnN0aWNreTtcbiAgICB2YXIgZmxhZ3MgPSBjYWxsKHJlZ2V4cEZsYWdzLCByZSk7XG4gICAgdmFyIHNvdXJjZSA9IHJlLnNvdXJjZTtcbiAgICB2YXIgY2hhcnNBZGRlZCA9IDA7XG4gICAgdmFyIHN0ckNvcHkgPSBzdHI7XG5cbiAgICBpZiAoc3RpY2t5KSB7XG4gICAgICBmbGFncyA9IHJlcGxhY2UoZmxhZ3MsICd5JywgJycpO1xuICAgICAgaWYgKGluZGV4T2YoZmxhZ3MsICdnJykgPT09IC0xKSB7XG4gICAgICAgIGZsYWdzICs9ICdnJztcbiAgICAgIH1cblxuICAgICAgc3RyQ29weSA9IHN0cmluZ1NsaWNlKHN0ciwgcmUubGFzdEluZGV4KTtcbiAgICAgIC8vIFN1cHBvcnQgYW5jaG9yZWQgc3RpY2t5IGJlaGF2aW9yLlxuICAgICAgaWYgKHJlLmxhc3RJbmRleCA+IDAgJiYgKCFyZS5tdWx0aWxpbmUgfHwgcmUubXVsdGlsaW5lICYmIGNoYXJBdChzdHIsIHJlLmxhc3RJbmRleCAtIDEpICE9PSAnXFxuJykpIHtcbiAgICAgICAgc291cmNlID0gJyg/OiAnICsgc291cmNlICsgJyknO1xuICAgICAgICBzdHJDb3B5ID0gJyAnICsgc3RyQ29weTtcbiAgICAgICAgY2hhcnNBZGRlZCsrO1xuICAgICAgfVxuICAgICAgLy8gXig/ICsgcnggKyApIGlzIG5lZWRlZCwgaW4gY29tYmluYXRpb24gd2l0aCBzb21lIHN0ciBzbGljaW5nLCB0b1xuICAgICAgLy8gc2ltdWxhdGUgdGhlICd5JyBmbGFnLlxuICAgICAgcmVDb3B5ID0gbmV3IFJlZ0V4cCgnXig/OicgKyBzb3VyY2UgKyAnKScsIGZsYWdzKTtcbiAgICB9XG5cbiAgICBpZiAoTlBDR19JTkNMVURFRCkge1xuICAgICAgcmVDb3B5ID0gbmV3IFJlZ0V4cCgnXicgKyBzb3VyY2UgKyAnJCg/IVxcXFxzKScsIGZsYWdzKTtcbiAgICB9XG4gICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORykgbGFzdEluZGV4ID0gcmUubGFzdEluZGV4O1xuXG4gICAgbWF0Y2ggPSBjYWxsKG5hdGl2ZUV4ZWMsIHN0aWNreSA/IHJlQ29weSA6IHJlLCBzdHJDb3B5KTtcblxuICAgIGlmIChzdGlja3kpIHtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBtYXRjaC5pbnB1dCA9IHN0cmluZ1NsaWNlKG1hdGNoLmlucHV0LCBjaGFyc0FkZGVkKTtcbiAgICAgICAgbWF0Y2hbMF0gPSBzdHJpbmdTbGljZShtYXRjaFswXSwgY2hhcnNBZGRlZCk7XG4gICAgICAgIG1hdGNoLmluZGV4ID0gcmUubGFzdEluZGV4O1xuICAgICAgICByZS5sYXN0SW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgfSBlbHNlIHJlLmxhc3RJbmRleCA9IDA7XG4gICAgfSBlbHNlIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgJiYgbWF0Y2gpIHtcbiAgICAgIHJlLmxhc3RJbmRleCA9IHJlLmdsb2JhbCA/IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIDogbGFzdEluZGV4O1xuICAgIH1cbiAgICBpZiAoTlBDR19JTkNMVURFRCAmJiBtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYFxuICAgICAgLy8gZm9yIE5QQ0csIGxpa2UgSUU4LiBOT1RFOiBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgLyguPyk/L1xuICAgICAgY2FsbChuYXRpdmVSZXBsYWNlLCBtYXRjaFswXSwgcmVDb3B5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtYXRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoICYmIGdyb3Vwcykge1xuICAgICAgbWF0Y2guZ3JvdXBzID0gb2JqZWN0ID0gY3JlYXRlKG51bGwpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBncm91cCA9IGdyb3Vwc1tpXTtcbiAgICAgICAgb2JqZWN0W2dyb3VwWzBdXSA9IG1hdGNoW2dyb3VwWzFdXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hlZEV4ZWM7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLmZsYWdzYCBnZXR0ZXIgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC5wcm90b3R5cGUuZmxhZ3Ncbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICh0aGF0Lmhhc0luZGljZXMpIHJlc3VsdCArPSAnZCc7XG4gIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAodGhhdC5kb3RBbGwpIHJlc3VsdCArPSAncyc7XG4gIGlmICh0aGF0LnVuaWNvZGUpIHJlc3VsdCArPSAndSc7XG4gIGlmICh0aGF0LnVuaWNvZGVTZXRzKSByZXN1bHQgKz0gJ3YnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1mbGFncy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHJlZ0V4cEZsYWdzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1mbGFncyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1mbGFncy5qc1wiKTtcblxudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFIpIHtcbiAgdmFyIGZsYWdzID0gUi5mbGFncztcbiAgcmV0dXJuIGZsYWdzID09PSB1bmRlZmluZWQgJiYgISgnZmxhZ3MnIGluIFJlZ0V4cFByb3RvdHlwZSkgJiYgIWhhc093bihSLCAnZmxhZ3MnKSAmJiBpc1Byb3RvdHlwZU9mKFJlZ0V4cFByb3RvdHlwZSwgUilcbiAgICA/IGNhbGwocmVnRXhwRmxhZ3MsIFIpIDogZmxhZ3M7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1nZXQtZmxhZ3MuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLXN0aWNreS1oZWxwZXJzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG5cbi8vIGJhYmVsLW1pbmlmeSBhbmQgQ2xvc3VyZSBDb21waWxlciB0cmFuc3BpbGVzIFJlZ0V4cCgnYScsICd5JykgLT4gL2EveSBhbmQgaXQgY2F1c2VzIFN5bnRheEVycm9yXG52YXIgJFJlZ0V4cCA9IGdsb2JhbC5SZWdFeHA7XG5cbnZhciBVTlNVUFBPUlRFRF9ZID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUgPSAkUmVnRXhwKCdhJywgJ3knKTtcbiAgcmUubGFzdEluZGV4ID0gMjtcbiAgcmV0dXJuIHJlLmV4ZWMoJ2FiY2QnKSAhPSBudWxsO1xufSk7XG5cbi8vIFVDIEJyb3dzZXIgYnVnXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTAwOFxudmFyIE1JU1NFRF9TVElDS1kgPSBVTlNVUFBPUlRFRF9ZIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICEkUmVnRXhwKCdhJywgJ3knKS5zdGlja3k7XG59KTtcblxudmFyIEJST0tFTl9DQVJFVCA9IFVOU1VQUE9SVEVEX1kgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD03NzM2ODdcbiAgdmFyIHJlID0gJFJlZ0V4cCgnXnInLCAnZ3knKTtcbiAgcmUubGFzdEluZGV4ID0gMjtcbiAgcmV0dXJuIHJlLmV4ZWMoJ3N0cicpICE9IG51bGw7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEJST0tFTl9DQVJFVDogQlJPS0VOX0NBUkVULFxuICBNSVNTRURfU1RJQ0tZOiBNSVNTRURfU1RJQ0tZLFxuICBVTlNVUFBPUlRFRF9ZOiBVTlNVUFBPUlRFRF9ZXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtZG90LWFsbC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xuXG4vLyBiYWJlbC1taW5pZnkgYW5kIENsb3N1cmUgQ29tcGlsZXIgdHJhbnNwaWxlcyBSZWdFeHAoJy4nLCAncycpIC0+IC8uL3MgYW5kIGl0IGNhdXNlcyBTeW50YXhFcnJvclxudmFyICRSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlID0gJFJlZ0V4cCgnLicsICdzJyk7XG4gIHJldHVybiAhKHJlLmRvdEFsbCAmJiByZS5leGVjKCdcXG4nKSAmJiByZS5mbGFncyA9PT0gJ3MnKTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1kb3QtYWxsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1uY2cuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcblxuLy8gYmFiZWwtbWluaWZ5IGFuZCBDbG9zdXJlIENvbXBpbGVyIHRyYW5zcGlsZXMgUmVnRXhwKCcoPzxhPmIpJywgJ2cnKSAtPiAvKD88YT5iKS9nIGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciAkUmVnRXhwID0gZ2xvYmFsLlJlZ0V4cDtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciByZSA9ICRSZWdFeHAoJyg/PGE+YiknLCAnZycpO1xuICByZXR1cm4gcmUuZXhlYygnYicpLmdyb3Vwcy5hICE9PSAnYicgfHxcbiAgICAnYicucmVwbGFjZShyZSwgJyQ8YT5jJykgIT09ICdiYyc7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtbmNnLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qc1wiKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGl0KSkgdGhyb3cgJFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtaGVscGVycy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc2V0IC0tIHNhZmVcbnZhciBTZXRQcm90b3R5cGUgPSBTZXQucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXNldCAtLSBzYWZlXG4gIFNldDogU2V0LFxuICBhZGQ6IHVuY3VycnlUaGlzKFNldFByb3RvdHlwZS5hZGQpLFxuICBoYXM6IHVuY3VycnlUaGlzKFNldFByb3RvdHlwZS5oYXMpLFxuICByZW1vdmU6IHVuY3VycnlUaGlzKFNldFByb3RvdHlwZVsnZGVsZXRlJ10pLFxuICBwcm90bzogU2V0UHJvdG90eXBlXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1oZWxwZXJzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKENvbnN0cnVjdG9yLCBTUEVDSUVTLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICB9KTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpLmYpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKHRhcmdldCAmJiAhU1RBVElDKSB0YXJnZXQgPSB0YXJnZXQucHJvdG90eXBlO1xuICBpZiAodGFyZ2V0ICYmICFoYXNPd24odGFyZ2V0LCBUT19TVFJJTkdfVEFHKSkge1xuICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qc1wiKTtcbnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdWlkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzXCIpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eS5qc1wiKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgZGVmaW5lR2xvYmFsUHJvcGVydHkoU0hBUkVELCB7fSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmU7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBzdG9yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQtc3RvcmUuanNcIik7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4zMi4wJyxcbiAgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDE0LTIwMjMgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknLFxuICBsaWNlbnNlOiAnaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvYmxvYi92My4zMi4wL0xJQ0VOU0UnLFxuICBzb3VyY2U6ICdodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcydcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgYUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zcGVjaWVzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCBpc051bGxPclVuZGVmaW5lZChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUNvbnN0cnVjdG9yKFMpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgY2hhckNvZGVBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJDb2RlQXQpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIHBvcykge1xuICAgIHZhciBTID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIHZhciBwb3NpdGlvbiA9IHRvSW50ZWdlck9ySW5maW5pdHkocG9zKTtcbiAgICB2YXIgc2l6ZSA9IFMubGVuZ3RoO1xuICAgIHZhciBmaXJzdCwgc2Vjb25kO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgZmlyc3QgPSBjaGFyQ29kZUF0KFMsIHBvc2l0aW9uKTtcbiAgICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplXG4gICAgICB8fCAoc2Vjb25kID0gY2hhckNvZGVBdChTLCBwb3NpdGlvbiArIDEpKSA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkZcbiAgICAgICAgPyBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gY2hhckF0KFMsIHBvc2l0aW9uKVxuICAgICAgICAgIDogZmlyc3RcbiAgICAgICAgOiBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gc3RyaW5nU2xpY2UoUywgcG9zaXRpb24sIHBvc2l0aW9uICsgMilcbiAgICAgICAgICA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL3B1bnljb2RlLmpzL2Jsb2IvbWFzdGVyL3B1bnljb2RlLmpzXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG52YXIgbWF4SW50ID0gMjE0NzQ4MzY0NzsgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxudmFyIGJhc2UgPSAzNjtcbnZhciB0TWluID0gMTtcbnZhciB0TWF4ID0gMjY7XG52YXIgc2tldyA9IDM4O1xudmFyIGRhbXAgPSA3MDA7XG52YXIgaW5pdGlhbEJpYXMgPSA3MjtcbnZhciBpbml0aWFsTiA9IDEyODsgLy8gMHg4MFxudmFyIGRlbGltaXRlciA9ICctJzsgLy8gJ1xceDJEJ1xudmFyIHJlZ2V4Tm9uQVNDSUkgPSAvW15cXDAtXFx1MDA3RV0vOyAvLyBub24tQVNDSUkgY2hhcnNcbnZhciByZWdleFNlcGFyYXRvcnMgPSAvWy5cXHUzMDAyXFx1RkYwRVxcdUZGNjFdL2c7IC8vIFJGQyAzNDkwIHNlcGFyYXRvcnNcbnZhciBPVkVSRkxPV19FUlJPUiA9ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2Vzcyc7XG52YXIgYmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluO1xuXG52YXIgJFJhbmdlRXJyb3IgPSBSYW5nZUVycm9yO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcyhyZWdleFNlcGFyYXRvcnMuZXhlYyk7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG52YXIgY2hhckNvZGVBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJDb2RlQXQpO1xudmFyIGpvaW4gPSB1bmN1cnJ5VGhpcyhbXS5qb2luKTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpO1xudmFyIHRvTG93ZXJDYXNlID0gdW5jdXJyeVRoaXMoJycudG9Mb3dlckNhc2UpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcbiAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSxcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG4gKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcbiAqIG1hdGNoaW5nIFVURi0xNi5cbiAqL1xudmFyIHVjczJkZWNvZGUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgdmFyIGNvdW50ZXIgPSAwO1xuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBjaGFyQ29kZUF0KHN0cmluZywgY291bnRlcisrKTtcbiAgICBpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG4gICAgICAvLyBJdCdzIGEgaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyLlxuICAgICAgdmFyIGV4dHJhID0gY2hhckNvZGVBdChzdHJpbmcsIGNvdW50ZXIrKyk7XG4gICAgICBpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHsgLy8gTG93IHN1cnJvZ2F0ZS5cbiAgICAgICAgcHVzaChvdXRwdXQsICgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJdCdzIGFuIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZVxuICAgICAgICAvLyBuZXh0IGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpci5cbiAgICAgICAgcHVzaChvdXRwdXQsIHZhbHVlKTtcbiAgICAgICAgY291bnRlci0tO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoKG91dHB1dCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG4gKi9cbnZhciBkaWdpdFRvQmFzaWMgPSBmdW5jdGlvbiAoZGlnaXQpIHtcbiAgLy8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcbiAgLy8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45XG4gIHJldHVybiBkaWdpdCArIDIyICsgNzUgKiAoZGlnaXQgPCAyNik7XG59O1xuXG4vKipcbiAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ5MiNzZWN0aW9uLTMuNFxuICovXG52YXIgYWRhcHQgPSBmdW5jdGlvbiAoZGVsdGEsIG51bVBvaW50cywgZmlyc3RUaW1lKSB7XG4gIHZhciBrID0gMDtcbiAgZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcbiAgZGVsdGEgKz0gZmxvb3IoZGVsdGEgLyBudW1Qb2ludHMpO1xuICB3aGlsZSAoZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxKSB7XG4gICAgZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuICAgIGsgKz0gYmFzZTtcbiAgfVxuICByZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGFcbiAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKi9cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuXG4gIC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIGFuIGFycmF5IG9mIFVuaWNvZGUgY29kZSBwb2ludHMuXG4gIGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cbiAgLy8gQ2FjaGUgdGhlIGxlbmd0aC5cbiAgdmFyIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHN0YXRlLlxuICB2YXIgbiA9IGluaXRpYWxOO1xuICB2YXIgZGVsdGEgPSAwO1xuICB2YXIgYmlhcyA9IGluaXRpYWxCaWFzO1xuICB2YXIgaSwgY3VycmVudFZhbHVlO1xuXG4gIC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHMuXG4gIGZvciAoaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldO1xuICAgIGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG4gICAgICBwdXNoKG91dHB1dCwgZnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7IC8vIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cbiAgdmFyIGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGg7IC8vIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXG4gIC8vIEZpbmlzaCB0aGUgYmFzaWMgc3RyaW5nIHdpdGggYSBkZWxpbWl0ZXIgdW5sZXNzIGl0J3MgZW1wdHkuXG4gIGlmIChiYXNpY0xlbmd0aCkge1xuICAgIHB1c2gob3V0cHV0LCBkZWxpbWl0ZXIpO1xuICB9XG5cbiAgLy8gTWFpbiBlbmNvZGluZyBsb29wOlxuICB3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkge1xuICAgIC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHQgbGFyZ2VyIG9uZTpcbiAgICB2YXIgbSA9IG1heEludDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldO1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcbiAgICAgICAgbSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbmNyZWFzZSBgZGVsdGFgIGVub3VnaCB0byBhZHZhbmNlIHRoZSBkZWNvZGVyJ3MgPG4saT4gc3RhdGUgdG8gPG0sMD4sIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93LlxuICAgIHZhciBoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG4gICAgaWYgKG0gLSBuID4gZmxvb3IoKG1heEludCAtIGRlbHRhKSAvIGhhbmRsZWRDUENvdW50UGx1c09uZSkpIHtcbiAgICAgIHRocm93ICRSYW5nZUVycm9yKE9WRVJGTE9XX0VSUk9SKTtcbiAgICB9XG5cbiAgICBkZWx0YSArPSAobSAtIG4pICogaGFuZGxlZENQQ291bnRQbHVzT25lO1xuICAgIG4gPSBtO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHtcbiAgICAgICAgdGhyb3cgJFJhbmdlRXJyb3IoT1ZFUkZMT1dfRVJST1IpO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PSBuKSB7XG4gICAgICAgIC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLlxuICAgICAgICB2YXIgcSA9IGRlbHRhO1xuICAgICAgICB2YXIgayA9IGJhc2U7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgdmFyIHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuICAgICAgICAgIGlmIChxIDwgdCkgYnJlYWs7XG4gICAgICAgICAgdmFyIHFNaW51c1QgPSBxIC0gdDtcbiAgICAgICAgICB2YXIgYmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuICAgICAgICAgIHB1c2gob3V0cHV0LCBmcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCkpKTtcbiAgICAgICAgICBxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuICAgICAgICAgIGsgKz0gYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2gob3V0cHV0LCBmcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEpKSk7XG4gICAgICAgIGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7XG4gICAgICAgIGRlbHRhID0gMDtcbiAgICAgICAgaGFuZGxlZENQQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWx0YSsrO1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gam9pbihvdXRwdXQsICcnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gIHZhciBlbmNvZGVkID0gW107XG4gIHZhciBsYWJlbHMgPSBzcGxpdChyZXBsYWNlKHRvTG93ZXJDYXNlKGlucHV0KSwgcmVnZXhTZXBhcmF0b3JzLCAnXFx1MDAyRScpLCAnLicpO1xuICB2YXIgaSwgbGFiZWw7XG4gIGZvciAoaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICBsYWJlbCA9IGxhYmVsc1tpXTtcbiAgICBwdXNoKGVuY29kZWQsIGV4ZWMocmVnZXhOb25BU0NJSSwgbGFiZWwpID8gJ3huLS0nICsgZW5jb2RlKGxhYmVsKSA6IGxhYmVsKTtcbiAgfVxuICByZXR1cm4gam9pbihlbmNvZGVkLCAnLicpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG5cbnZhciAkUmFuZ2VFcnJvciA9IFJhbmdlRXJyb3I7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGVhdGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwZWF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgdmFyIG4gPSB0b0ludGVnZXJPckluZmluaXR5KGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93ICRSYW5nZUVycm9yKCdXcm9uZyBudW1iZXIgb2YgcmVwZXRpdGlvbnMnKTtcbiAgZm9yICg7biA+IDA7IChuID4+Pj0gMSkgJiYgKHN0ciArPSBzdHIpKSBpZiAobiAmIDEpIHJlc3VsdCArPSBzdHI7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZW5kLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkdHJpbUVuZCA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qc1wiKS5lbmQpO1xudmFyIGZvcmNlZFN0cmluZ1RyaW1NZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZm9yY2VkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZm9yY2VkLmpzXCIpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1FbmQsIHRyaW1SaWdodCB9YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jU3RyaW5nLnByb3RvdHlwZS50cmltcmlnaHRcbm1vZHVsZS5leHBvcnRzID0gZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCgndHJpbUVuZCcpID8gZnVuY3Rpb24gdHJpbUVuZCgpIHtcbiAgcmV0dXJuICR0cmltRW5kKHRoaXMpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXN0cmluZy1wcm90b3R5cGUtdHJpbXN0YXJ0LXRyaW1lbmQgLS0gc2FmZVxufSA6ICcnLnRyaW1FbmQ7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZW5kLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy10cmltLWZvcmNlZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzXCIpLlBST1BFUik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciB3aGl0ZXNwYWNlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93aGl0ZXNwYWNlcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3doaXRlc3BhY2VzLmpzXCIpO1xuXG52YXIgbm9uID0gJ1xcdTIwMEJcXHUwMDg1XFx1MTgwRSc7XG5cbi8vIGNoZWNrIHRoYXQgYSBtZXRob2Qgd29ya3Mgd2l0aCB0aGUgY29ycmVjdCBsaXN0XG4vLyBvZiB3aGl0ZXNwYWNlcyBhbmQgaGFzIGEgY29ycmVjdCBuYW1lXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICByZXR1cm4gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXSgpXG4gICAgICB8fCBub25bTUVUSE9EX05BTUVdKCkgIT09IG5vblxuICAgICAgfHwgKFBST1BFUl9GVU5DVElPTl9OQU1FICYmIHdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXS5uYW1lICE9PSBNRVRIT0RfTkFNRSk7XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS1mb3JjZWQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgd2hpdGVzcGFjZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qc1wiKTtcblxudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXlsnICsgd2hpdGVzcGFjZXMgKyAnXSsnKTtcbnZhciBydHJpbSA9IFJlZ0V4cCgnKF58W14nICsgd2hpdGVzcGFjZXMgKyAnXSlbJyArIHdoaXRlc3BhY2VzICsgJ10rJCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcykge1xuICAgIHZhciBzdHJpbmcgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSByZXBsYWNlKHN0cmluZywgbHRyaW0sICcnKTtcbiAgICBpZiAoVFlQRSAmIDIpIHN0cmluZyA9IHJlcGxhY2Uoc3RyaW5nLCBydHJpbSwgJyQxJyk7XG4gICAgcmV0dXJuIHN0cmluZztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1MZWZ0LCB0cmltU3RhcnQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbXN0YXJ0XG4gIHN0YXJ0OiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbVJpZ2h0LCB0cmltRW5kIH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1lbmRcbiAgZW5kOiBjcmVhdGVNZXRob2QoMiksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbVxuICB0cmltOiBjcmVhdGVNZXRob2QoMylcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RydWN0dXJlZC1jbG9uZS1wcm9wZXItdHJhbnNmZXIuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBWOCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzXCIpO1xudmFyIElTX0JST1dTRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3Nlci5qc1wiKTtcbnZhciBJU19ERU5PID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1kZW5vICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8uanNcIik7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xuXG52YXIgc3RydWN0dXJlZENsb25lID0gZ2xvYmFsLnN0cnVjdHVyZWRDbG9uZTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIXN0cnVjdHVyZWRDbG9uZSAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBwcmV2ZW50IFY4IEFycmF5QnVmZmVyRGV0YWNoaW5nIHByb3RlY3RvciBjZWxsIGludmFsaWRhdGlvbiBhbmQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxuICBpZiAoKElTX0RFTk8gJiYgVjggPiA5MikgfHwgKElTX05PREUgJiYgVjggPiA5NCkgfHwgKElTX0JST1dTRVIgJiYgVjggPiA5NykpIHJldHVybiBmYWxzZTtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig4KTtcbiAgdmFyIGNsb25lID0gc3RydWN0dXJlZENsb25lKGJ1ZmZlciwgeyB0cmFuc2ZlcjogW2J1ZmZlcl0gfSk7XG4gIHJldHVybiBidWZmZXIuYnl0ZUxlbmd0aCAhPSAwIHx8IGNsb25lLmJ5dGVMZW5ndGggIT0gODtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cnVjdHVyZWQtY2xvbmUtcHJvcGVyLXRyYW5zZmVyLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgVjhfVkVSU0lPTiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcblxudmFyICRTdHJpbmcgPSBnbG9iYWwuU3RyaW5nO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5c3ltYm9scyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICAvLyBDaHJvbWUgMzggU3ltYm9sIGhhcyBpbmNvcnJlY3QgdG9TdHJpbmcgY29udmVyc2lvblxuICAvLyBgZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzYCBwb2x5ZmlsbCBzeW1ib2xzIGNvbnZlcnRlZCB0byBvYmplY3QgYXJlIG5vdCBTeW1ib2wgaW5zdGFuY2VzXG4gIC8vIG5iOiBEbyBub3QgY2FsbCBgU3RyaW5nYCBkaXJlY3RseSB0byBhdm9pZCB0aGlzIGJlaW5nIG9wdGltaXplZCBvdXQgdG8gYHN5bWJvbCsnJ2Agd2hpY2ggd2lsbCxcbiAgLy8gb2YgY291cnNlLCBmYWlsLlxuICByZXR1cm4gISRTdHJpbmcoc3ltYm9sKSB8fCAhKE9iamVjdChzeW1ib2wpIGluc3RhbmNlb2YgU3ltYm9sKSB8fFxuICAgIC8vIENocm9tZSAzOC00MCBzeW1ib2xzIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gRE9NIGNvbGxlY3Rpb25zIHByb3RvdHlwZXMgdG8gaW5zdGFuY2VzXG4gICAgIVN5bWJvbC5zaGFtICYmIFY4X1ZFUlNJT04gJiYgVjhfVkVSU0lPTiA8IDQxO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90YXNrLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGFwcGx5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkuanNcIik7XG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGh0bWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaHRtbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanNcIik7XG52YXIgYXJyYXlTbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zbGljZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLmpzXCIpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qc1wiKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aC5qc1wiKTtcbnZhciBJU19JT1MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanNcIik7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xuXG52YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgRnVuY3Rpb24gPSBnbG9iYWwuRnVuY3Rpb247XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyICRsb2NhdGlvbiwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG5cbmZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVubyB0aHJvd3MgYSBSZWZlcmVuY2VFcnJvciBvbiBgbG9jYXRpb25gIGFjY2VzcyB3aXRob3V0IGAtLWxvY2F0aW9uYCBmbGFnXG4gICRsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbjtcbn0pO1xuXG52YXIgcnVuID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlmIChoYXNPd24ocXVldWUsIGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG5cbnZhciBydW5uZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBydW4oaWQpO1xuICB9O1xufTtcblxudmFyIGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuKGV2ZW50LmRhdGEpO1xufTtcblxudmFyIGdsb2JhbFBvc3RNZXNzYWdlRGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gb2xkIGVuZ2luZXMgaGF2ZSBub3QgbG9jYXRpb24ub3JpZ2luXG4gIGdsb2JhbC5wb3N0TWVzc2FnZShTdHJpbmcoaWQpLCAkbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgJGxvY2F0aW9uLmhvc3QpO1xufTtcblxuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXQgfHwgIWNsZWFyKSB7XG4gIHNldCA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShoYW5kbGVyKSB7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7XG4gICAgdmFyIGZuID0gaXNDYWxsYWJsZShoYW5kbGVyKSA/IGhhbmRsZXIgOiBGdW5jdGlvbihoYW5kbGVyKTtcbiAgICB2YXIgYXJncyA9IGFycmF5U2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgYXBwbHkoZm4sIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoSVNfTk9ERSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICAvLyBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzYyNFxuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFJU19JT1MpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBldmVudExpc3RlbmVyO1xuICAgIGRlZmVyID0gYmluZChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0KTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoXG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiZcbiAgICBpc0NhbGxhYmxlKGdsb2JhbC5wb3N0TWVzc2FnZSkgJiZcbiAgICAhZ2xvYmFsLmltcG9ydFNjcmlwdHMgJiZcbiAgICAkbG9jYXRpb24gJiYgJGxvY2F0aW9uLnByb3RvY29sICE9PSAnZmlsZTonICYmXG4gICAgIWZhaWxzKGdsb2JhbFBvc3RNZXNzYWdlRGVmZXIpXG4gICkge1xuICAgIGRlZmVyID0gZ2xvYmFsUG9zdE1lc3NhZ2VEZWZlcjtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50TGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG4vLyBgdGhpc051bWJlclZhbHVlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdGhpc251bWJlcnZhbHVlXG5tb2R1bGUuZXhwb3J0cyA9IHVuY3VycnlUaGlzKDEuMC52YWx1ZU9mKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzpcbi8vIExldCBpbnRlZ2VyIGJlID8gVG9JbnRlZ2VyKGluZGV4KS5cbi8vIElmIGludGVnZXIgPCAwLCBsZXQgcmVzdWx0IGJlIG1heCgobGVuZ3RoICsgaW50ZWdlciksIDApOyBlbHNlIGxldCByZXN1bHQgYmUgbWluKGludGVnZXIsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpbmRleCk7XG4gIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1iaWctaW50LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgVG9CaWdJbnRgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2JpZ2ludFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIHByaW0gPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ251bWJlcicpO1xuICBpZiAodHlwZW9mIHByaW0gPT0gJ251bWJlcicpIHRocm93ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG51bWJlciB0byBiaWdpbnRcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1iaWdpbnQgLS0gc2FmZVxuICByZXR1cm4gQmlnSW50KHByaW0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1iaWctaW50LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxuLy8gYFRvSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2luZGV4XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHZhciBudW1iZXIgPSB0b0ludGVnZXJPckluZmluaXR5KGl0KTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKG51bWJlcik7XG4gIGlmIChudW1iZXIgIT09IGxlbmd0aCkgdGhyb3cgJFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCBvciBpbmRleCcpO1xuICByZXR1cm4gbGVuZ3RoO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0cnVuYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9tYXRoLXRydW5jICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC10cnVuYy5qc1wiKTtcblxuLy8gYFRvSW50ZWdlck9ySW5maW5pdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJvcmluZmluaXR5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIgbnVtYmVyID0gK2FyZ3VtZW50O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICByZXR1cm4gbnVtYmVyICE9PSBudW1iZXIgfHwgbnVtYmVyID09PSAwID8gMCA6IHRydW5jKG51bWJlcik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvbGVuZ3RoXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gYXJndW1lbnQgPiAwID8gbWluKHRvSW50ZWdlck9ySW5maW5pdHkoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG4vLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuICRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2Zmc2V0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b1Bvc2l0aXZlSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wb3NpdGl2ZS1pbnRlZ2VyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIEJZVEVTKSB7XG4gIHZhciBvZmZzZXQgPSB0b1Bvc2l0aXZlSW50ZWdlcihpdCk7XG4gIGlmIChvZmZzZXQgJSBCWVRFUykgdGhyb3cgJFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCcpO1xuICByZXR1cm4gb2Zmc2V0O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vZmZzZXQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IHRvSW50ZWdlck9ySW5maW5pdHkoaXQpO1xuICBpZiAocmVzdWx0IDwgMCkgdGhyb3cgJFJhbmdlRXJyb3IoXCJUaGUgYXJndW1lbnQgY2FuJ3QgYmUgbGVzcyB0aGFuIDBcIik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXBvc2l0aXZlLWludGVnZXIuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBpc1N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1zeW1ib2wuanNcIik7XG52YXIgZ2V0TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzXCIpO1xudmFyIG9yZGluYXJ5VG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGV4b3RpY1RvUHJpbSA9IGdldE1ldGhvZChpbnB1dCwgVE9fUFJJTUlUSVZFKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGV4b3RpY1RvUHJpbSkge1xuICAgIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnZGVmYXVsdCc7XG4gICAgcmVzdWx0ID0gY2FsbChleG90aWNUb1ByaW0sIGlucHV0LCBwcmVmKTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlc3VsdCkgfHwgaXNTeW1ib2wocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICB0aHJvdyAkVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuICB9XG4gIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnbnVtYmVyJztcbiAgcmV0dXJuIG9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIHByZWYpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanNcIik7XG52YXIgaXNTeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtc3ltYm9sLmpzXCIpO1xuXG4vLyBgVG9Qcm9wZXJ0eUtleWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ3N0cmluZycpO1xuICByZXR1cm4gaXNTeW1ib2woa2V5KSA/IGtleSA6IGtleSArICcnO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanNcIik7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoY2xhc3NvZihhcmd1bWVudCkgPT09ICdTeW1ib2wnKSB0aHJvdyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG4gIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXVpbnQ4LWNsYW1wZWQuanMiOigobW9kdWxlKT0+e2V2YWwoIlxudmFyIHJvdW5kID0gTWF0aC5yb3VuZDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHZhbHVlID0gcm91bmQoaXQpO1xuICByZXR1cm4gdmFsdWUgPCAwID8gMCA6IHZhbHVlID4gMHhGRiA/IDB4RkYgOiB2YWx1ZSAmIDB4RkY7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXVpbnQ4LWNsYW1wZWQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LW5vZGUtcmVxdWlyZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIHNhZmVcbiAgICBpZiAoSVNfTk9ERSkgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gcmVxdWlyZShcIicgKyBuYW1lICsgJ1wiKScpKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LW5vZGUtcmVxdWlyZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90cnktdG8tc3RyaW5nLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB0cnkge1xuICAgIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gJ09iamVjdCc7XG4gIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgVFlQRURfQVJSQVlTX0NPTlNUUlVDVE9SU19SRVFVSVJFU19XUkFQUEVSUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvcnMtcmVxdWlyZS13cmFwcGVycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9ycy1yZXF1aXJlLXdyYXBwZXJzLmpzXCIpO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanNcIik7XG52YXIgQXJyYXlCdWZmZXJNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLmpzXCIpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qc1wiKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qc1wiKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzXCIpO1xudmFyIGlzSW50ZWdyYWxOdW1iZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyLmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciB0b0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXguanNcIik7XG52YXIgdG9PZmZzZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2Zmc2V0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2Zmc2V0LmpzXCIpO1xudmFyIHRvVWludDhDbGFtcGVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXVpbnQ4LWNsYW1wZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by11aW50OC1jbGFtcGVkLmpzXCIpO1xudmFyIHRvUHJvcGVydHlLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBpc1N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1zeW1ib2wuanNcIik7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIGlzUHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzXCIpLmYpO1xudmFyIHR5cGVkQXJyYXlGcm9tID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWZyb20gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1mcm9tLmpzXCIpO1xudmFyIGZvckVhY2ggPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qc1wiKS5mb3JFYWNoKTtcbnZhciBzZXRTcGVjaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcIik7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzXCIpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzXCIpO1xuXG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xudmFyIEFycmF5QnVmZmVyID0gQXJyYXlCdWZmZXJNb2R1bGUuQXJyYXlCdWZmZXI7XG52YXIgQXJyYXlCdWZmZXJQcm90b3R5cGUgPSBBcnJheUJ1ZmZlci5wcm90b3R5cGU7XG52YXIgRGF0YVZpZXcgPSBBcnJheUJ1ZmZlck1vZHVsZS5EYXRhVmlldztcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5OQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTO1xudmFyIFRZUEVEX0FSUkFZX1RBRyA9IEFycmF5QnVmZmVyVmlld0NvcmUuVFlQRURfQVJSQVlfVEFHO1xudmFyIFR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLlR5cGVkQXJyYXk7XG52YXIgVHlwZWRBcnJheVByb3RvdHlwZSA9IEFycmF5QnVmZmVyVmlld0NvcmUuVHlwZWRBcnJheVByb3RvdHlwZTtcbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xudmFyIGlzVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuaXNUeXBlZEFycmF5O1xudmFyIEJZVEVTX1BFUl9FTEVNRU5UID0gJ0JZVEVTX1BFUl9FTEVNRU5UJztcbnZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoJztcblxudmFyIGZyb21MaXN0ID0gZnVuY3Rpb24gKEMsIGxpc3QpIHtcbiAgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihDKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gbmV3IEMobGVuZ3RoKTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBhZGRHZXR0ZXIgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoaXQsIGtleSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpW2tleV07XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBrbGFzcztcbiAgcmV0dXJuIGlzUHJvdG90eXBlT2YoQXJyYXlCdWZmZXJQcm90b3R5cGUsIGl0KSB8fCAoa2xhc3MgPSBjbGFzc29mKGl0KSkgPT0gJ0FycmF5QnVmZmVyJyB8fCBrbGFzcyA9PSAnU2hhcmVkQXJyYXlCdWZmZXInO1xufTtcblxudmFyIGlzVHlwZWRBcnJheUluZGV4ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gIHJldHVybiBpc1R5cGVkQXJyYXkodGFyZ2V0KVxuICAgICYmICFpc1N5bWJvbChrZXkpXG4gICAgJiYga2V5IGluIHRhcmdldFxuICAgICYmIGlzSW50ZWdyYWxOdW1iZXIoK2tleSlcbiAgICAmJiBrZXkgPj0gMDtcbn07XG5cbnZhciB3cmFwcGVkR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSB7XG4gIGtleSA9IHRvUHJvcGVydHlLZXkoa2V5KTtcbiAgcmV0dXJuIGlzVHlwZWRBcnJheUluZGV4KHRhcmdldCwga2V5KVxuICAgID8gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDIsIHRhcmdldFtrZXldKVxuICAgIDogbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbn07XG5cbnZhciB3cmFwcGVkRGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikge1xuICBrZXkgPSB0b1Byb3BlcnR5S2V5KGtleSk7XG4gIGlmIChpc1R5cGVkQXJyYXlJbmRleCh0YXJnZXQsIGtleSlcbiAgICAmJiBpc09iamVjdChkZXNjcmlwdG9yKVxuICAgICYmIGhhc093bihkZXNjcmlwdG9yLCAndmFsdWUnKVxuICAgICYmICFoYXNPd24oZGVzY3JpcHRvciwgJ2dldCcpXG4gICAgJiYgIWhhc093bihkZXNjcmlwdG9yLCAnc2V0JylcbiAgICAvLyBUT0RPOiBhZGQgdmFsaWRhdGlvbiBkZXNjcmlwdG9yIHcvbyBjYWxsaW5nIGFjY2Vzc29yc1xuICAgICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZVxuICAgICYmICghaGFzT3duKGRlc2NyaXB0b3IsICd3cml0YWJsZScpIHx8IGRlc2NyaXB0b3Iud3JpdGFibGUpXG4gICAgJiYgKCFoYXNPd24oZGVzY3JpcHRvciwgJ2VudW1lcmFibGUnKSB8fCBkZXNjcmlwdG9yLmVudW1lcmFibGUpXG4gICkge1xuICAgIHRhcmdldFtrZXldID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG59O1xuXG5pZiAoREVTQ1JJUFRPUlMpIHtcbiAgaWYgKCFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSB7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmYgPSB3cmFwcGVkR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgIGRlZmluZVByb3BlcnR5TW9kdWxlLmYgPSB3cmFwcGVkRGVmaW5lUHJvcGVydHk7XG4gICAgYWRkR2V0dGVyKFR5cGVkQXJyYXlQcm90b3R5cGUsICdidWZmZXInKTtcbiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2J5dGVPZmZzZXQnKTtcbiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2J5dGVMZW5ndGgnKTtcbiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2xlbmd0aCcpO1xuICB9XG5cbiAgJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfSwge1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogd3JhcHBlZEdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgICBkZWZpbmVQcm9wZXJ0eTogd3JhcHBlZERlZmluZVByb3BlcnR5XG4gIH0pO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsIHdyYXBwZXIsIENMQU1QRUQpIHtcbiAgICB2YXIgQllURVMgPSBUWVBFLm1hdGNoKC9cXGQrLylbMF0gLyA4O1xuICAgIHZhciBDT05TVFJVQ1RPUl9OQU1FID0gVFlQRSArIChDTEFNUEVEID8gJ0NsYW1wZWQnIDogJycpICsgJ0FycmF5JztcbiAgICB2YXIgR0VUVEVSID0gJ2dldCcgKyBUWVBFO1xuICAgIHZhciBTRVRURVIgPSAnc2V0JyArIFRZUEU7XG4gICAgdmFyIE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtDT05TVFJVQ1RPUl9OQU1FXTtcbiAgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgICB2YXIgZXhwb3J0ZWQgPSB7fTtcblxuICAgIHZhciBnZXR0ZXIgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHJldHVybiBkYXRhLnZpZXdbR0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5ieXRlT2Zmc2V0LCB0cnVlKTtcbiAgICB9O1xuXG4gICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIGRhdGEudmlld1tTRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLmJ5dGVPZmZzZXQsIENMQU1QRUQgPyB0b1VpbnQ4Q2xhbXBlZCh2YWx1ZSkgOiB2YWx1ZSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIHZhciBhZGRFbGVtZW50ID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7XG4gICAgICBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0aGF0LCBpbmRleCwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0dGVyKHRoaXMsIGluZGV4KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gc2V0dGVyKHRoaXMsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIHtcbiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGRhdGEsIG9mZnNldCwgJGxlbmd0aCkge1xuICAgICAgICBhbkluc3RhbmNlKHRoYXQsIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSk7XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIHZhciBieXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIGJ1ZmZlciwgYnl0ZUxlbmd0aCwgbGVuZ3RoO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgbGVuZ3RoID0gdG9JbmRleChkYXRhKTtcbiAgICAgICAgICBieXRlTGVuZ3RoID0gbGVuZ3RoICogQllURVM7XG4gICAgICAgICAgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVMZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXlCdWZmZXIoZGF0YSkpIHtcbiAgICAgICAgICBidWZmZXIgPSBkYXRhO1xuICAgICAgICAgIGJ5dGVPZmZzZXQgPSB0b09mZnNldChvZmZzZXQsIEJZVEVTKTtcbiAgICAgICAgICB2YXIgJGxlbiA9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICBpZiAoJGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoJGxlbiAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gJGxlbiAtIGJ5dGVPZmZzZXQ7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCA8IDApIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9IHRvTGVuZ3RoKCRsZW5ndGgpICogQllURVM7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCArIGJ5dGVPZmZzZXQgPiAkbGVuKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbmd0aCA9IGJ5dGVMZW5ndGggLyBCWVRFUztcbiAgICAgICAgfSBlbHNlIGlmIChpc1R5cGVkQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY2FsbCh0eXBlZEFycmF5RnJvbSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgICBidWZmZXI6IGJ1ZmZlcixcbiAgICAgICAgICBieXRlT2Zmc2V0OiBieXRlT2Zmc2V0LFxuICAgICAgICAgIGJ5dGVMZW5ndGg6IGJ5dGVMZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoOiBsZW5ndGgsXG4gICAgICAgICAgdmlldzogbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICAgICAgfSk7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgYWRkRWxlbWVudCh0aGF0LCBpbmRleCsrKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgVHlwZWRBcnJheSk7XG4gICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKFR5cGVkQXJyYXlQcm90b3R5cGUpO1xuICAgIH0gZWxzZSBpZiAoVFlQRURfQVJSQVlTX0NPTlNUUlVDVE9SU19SRVFVSVJFU19XUkFQUEVSUykge1xuICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAoZHVtbXksIGRhdGEsIHR5cGVkQXJyYXlPZmZzZXQsICRsZW5ndGgpIHtcbiAgICAgICAgYW5JbnN0YW5jZShkdW1teSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlKTtcbiAgICAgICAgcmV0dXJuIGluaGVyaXRJZlJlcXVpcmVkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSByZXR1cm4gbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0b0luZGV4KGRhdGEpKTtcbiAgICAgICAgICBpZiAoaXNBcnJheUJ1ZmZlcihkYXRhKSkgcmV0dXJuICRsZW5ndGggIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBuZXcgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yKGRhdGEsIHRvT2Zmc2V0KHR5cGVkQXJyYXlPZmZzZXQsIEJZVEVTKSwgJGxlbmd0aClcbiAgICAgICAgICAgIDogdHlwZWRBcnJheU9mZnNldCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihkYXRhLCB0b09mZnNldCh0eXBlZEFycmF5T2Zmc2V0LCBCWVRFUykpXG4gICAgICAgICAgICAgIDogbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihkYXRhKTtcbiAgICAgICAgICBpZiAoaXNUeXBlZEFycmF5KGRhdGEpKSByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgICByZXR1cm4gY2FsbCh0eXBlZEFycmF5RnJvbSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgfSgpLCBkdW1teSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgVHlwZWRBcnJheSk7XG4gICAgICBmb3JFYWNoKGdldE93blByb3BlcnR5TmFtZXMoTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yKSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yKSkge1xuICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3IsIGtleSwgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGU7XG4gICAgfVxuXG4gICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZS5jb25zdHJ1Y3RvciAhPT0gVHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlLCAnY29uc3RydWN0b3InLCBUeXBlZEFycmF5Q29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIGVuZm9yY2VJbnRlcm5hbFN0YXRlKFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSkuVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuXG4gICAgaWYgKFRZUEVEX0FSUkFZX1RBRykge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSwgVFlQRURfQVJSQVlfVEFHLCBDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICB9XG5cbiAgICB2YXIgRk9SQ0VEID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yICE9IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcblxuICAgIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuXG4gICAgJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIGZvcmNlZDogRk9SQ0VELCBzaGFtOiAhTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB9LCBleHBvcnRlZCk7XG5cbiAgICBpZiAoIShCWVRFU19QRVJfRUxFTUVOVCBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3IpKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBCWVRFU19QRVJfRUxFTUVOVCwgQllURVMpO1xuICAgIH1cblxuICAgIGlmICghKEJZVEVTX1BFUl9FTEVNRU5UIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUsIEJZVEVTX1BFUl9FTEVNRU5ULCBCWVRFUyk7XG4gICAgfVxuXG4gICAgc2V0U3BlY2llcyhDT05TVFJVQ1RPUl9OQU1FKTtcbiAgfTtcbn0gZWxzZSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvcnMtcmVxdWlyZS13cmFwcGVycy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qc1wiKTtcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKS5OQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKTtcblxudmFyIEFycmF5QnVmZmVyID0gZ2xvYmFsLkFycmF5QnVmZmVyO1xudmFyIEludDhBcnJheSA9IGdsb2JhbC5JbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgSW50OEFycmF5KDEpO1xufSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgbmV3IEludDhBcnJheSgtMSk7XG59KSB8fCAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBuZXcgSW50OEFycmF5KCk7XG4gIG5ldyBJbnQ4QXJyYXkobnVsbCk7XG4gIG5ldyBJbnQ4QXJyYXkoMS41KTtcbiAgbmV3IEludDhBcnJheShpdGVyYWJsZSk7XG59LCB0cnVlKSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIFNhZmFyaSAoMTErKSBidWcgLSBhIHJlYXNvbiB3aHkgZXZlbiBTYWZhcmkgMTMgc2hvdWxkIGxvYWQgYSB0eXBlZCBhcnJheSBwb2x5ZmlsbFxuICByZXR1cm4gbmV3IEludDhBcnJheShuZXcgQXJyYXlCdWZmZXIoMiksIDEsIHVuZGVmaW5lZCkubGVuZ3RoICE9PSAxO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3JzLXJlcXVpcmUtd3JhcHBlcnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktZnJvbS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciBhQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtY29uc3RydWN0b3IuanNcIik7XG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgZ2V0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzXCIpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kLmpzXCIpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanNcIik7XG52YXIgaXNCaWdJbnRBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1iaWctaW50LWFycmF5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYmlnLWludC1hcnJheS5qc1wiKTtcbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yKTtcbnZhciB0b0JpZ0ludCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1iaWctaW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYmlnLWludC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcGZuLCB0aGlzQXJnICovKSB7XG4gIHZhciBDID0gYUNvbnN0cnVjdG9yKHRoaXMpO1xuICB2YXIgTyA9IHRvT2JqZWN0KHNvdXJjZSk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgaSwgbGVuZ3RoLCByZXN1bHQsIHRoaXNJc0JpZ0ludEFycmF5LCB2YWx1ZSwgc3RlcCwgaXRlcmF0b3IsIG5leHQ7XG4gIGlmIChpdGVyYXRvck1ldGhvZCAmJiAhaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkge1xuICAgIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoTywgaXRlcmF0b3JNZXRob2QpO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIE8gPSBbXTtcbiAgICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgICAgIE8ucHVzaChzdGVwLnZhbHVlKTtcbiAgICB9XG4gIH1cbiAgaWYgKG1hcHBpbmcgJiYgYXJndW1lbnRzTGVuZ3RoID4gMikge1xuICAgIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzWzJdKTtcbiAgfVxuICBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgcmVzdWx0ID0gbmV3IChhVHlwZWRBcnJheUNvbnN0cnVjdG9yKEMpKShsZW5ndGgpO1xuICB0aGlzSXNCaWdJbnRBcnJheSA9IGlzQmlnSW50QXJyYXkocmVzdWx0KTtcbiAgZm9yIChpID0gMDsgbGVuZ3RoID4gaTsgaSsrKSB7XG4gICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpXSwgaSkgOiBPW2ldO1xuICAgIC8vIEZGMzAtIHR5cGVkIGFycmF5cyBkb2Vzbid0IHByb3Blcmx5IGNvbnZlcnQgb2JqZWN0cyB0byB0eXBlZCBhcnJheSB2YWx1ZXNcbiAgICByZXN1bHRbaV0gPSB0aGlzSXNCaWdJbnRBcnJheSA/IHRvQmlnSW50KHZhbHVlKSA6ICt2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1mcm9tLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG52YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcgKyAoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgdG9TdHJpbmcoKytpZCArIHBvc3RmaXgsIDM2KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VybC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcmVsYXRpdmUtdXJsLXN0eWxlIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHZhciB1cmwgPSBuZXcgVVJMKCdiP2E9MSZiPTImYz0zJywgJ2h0dHA6Ly9hJyk7XG4gIHZhciBwYXJhbXMgPSB1cmwuc2VhcmNoUGFyYW1zO1xuICB2YXIgcGFyYW1zMiA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoJ2E9MSZhPTImYj0zJyk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgdXJsLnBhdGhuYW1lID0gJ2MlMjBkJztcbiAgcGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICBwYXJhbXNbJ2RlbGV0ZSddKCdiJyk7XG4gICAgcmVzdWx0ICs9IGtleSArIHZhbHVlO1xuICB9KTtcbiAgcGFyYW1zMlsnZGVsZXRlJ10oJ2EnLCAyKTtcbiAgLy8gYHVuZGVmaW5lZGAgY2FzZSBpcyBhIENocm9taXVtIDExNyBidWdcbiAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTQyMjJcbiAgcGFyYW1zMlsnZGVsZXRlJ10oJ2InLCB1bmRlZmluZWQpO1xuICByZXR1cm4gKElTX1BVUkUgJiYgKCF1cmwudG9KU09OIHx8ICFwYXJhbXMyLmhhcygnYScsIDEpIHx8IHBhcmFtczIuaGFzKCdhJywgMikgfHwgIXBhcmFtczIuaGFzKCdhJywgdW5kZWZpbmVkKSB8fCBwYXJhbXMyLmhhcygnYicpKSlcbiAgICB8fCAoIXBhcmFtcy5zaXplICYmIChJU19QVVJFIHx8ICFERVNDUklQVE9SUykpXG4gICAgfHwgIXBhcmFtcy5zb3J0XG4gICAgfHwgdXJsLmhyZWYgIT09ICdodHRwOi8vYS9jJTIwZD9hPTEmYz0zJ1xuICAgIHx8IHBhcmFtcy5nZXQoJ2MnKSAhPT0gJzMnXG4gICAgfHwgU3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoJz9hPTEnKSkgIT09ICdhPTEnXG4gICAgfHwgIXBhcmFtc1tJVEVSQVRPUl1cbiAgICAvLyB0aHJvd3MgaW4gRWRnZVxuICAgIHx8IG5ldyBVUkwoJ2h0dHBzOi8vYUBiJykudXNlcm5hbWUgIT09ICdhJ1xuICAgIHx8IG5ldyBVUkxTZWFyY2hQYXJhbXMobmV3IFVSTFNlYXJjaFBhcmFtcygnYT1iJykpLmdldCgnYScpICE9PSAnYidcbiAgICAvLyBub3QgcHVueWNvZGVkIGluIEVkZ2VcbiAgICB8fCBuZXcgVVJMKCdodHRwOi8v0YLQtdGB0YInKS5ob3N0ICE9PSAneG4tLWUxYXliYydcbiAgICAvLyBub3QgZXNjYXBlZCBpbiBDaHJvbWUgNjItXG4gICAgfHwgbmV3IFVSTCgnaHR0cDovL2Ej0LEnKS5oYXNoICE9PSAnIyVEMCVCMSdcbiAgICAvLyBmYWlscyBpbiBDaHJvbWUgNjYtXG4gICAgfHwgcmVzdWx0ICE9PSAnYTFjMydcbiAgICAvLyB0aHJvd3MgaW4gU2FmYXJpXG4gICAgfHwgbmV3IFVSTCgnaHR0cDovL3gnLCB1bmRlZmluZWQpLmhvc3QgIT09ICd4Jztcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VybC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gICYmICFTeW1ib2wuc2hhbVxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG5cbi8vIFY4IH4gQ2hyb21lIDM2LVxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzMzNFxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sICdwcm90b3R5cGUnLCB7XG4gICAgdmFsdWU6IDQyLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KS5wcm90b3R5cGUgIT0gNDI7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1Zy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXNzZWQsIHJlcXVpcmVkKSB7XG4gIGlmIChwYXNzZWQgPCByZXF1aXJlZCkgdGhyb3cgJFR5cGVFcnJvcignTm90IGVub3VnaCBhcmd1bWVudHMnKTtcbiAgcmV0dXJuIHBhc3NlZDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQ2FsbGFibGUoV2Vha01hcCkgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFN0cmluZyhXZWFrTWFwKSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2Vhay1tYXAtYmFzaWMtZGV0ZWN0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHNoYXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zaGFyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanNcIik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xudmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91aWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanNcIik7XG52YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzXCIpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sWydmb3InXSB8fCBTeW1ib2wgOiBTeW1ib2wgJiYgU3ltYm9sLndpdGhvdXRTZXR0ZXIgfHwgdWlkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghaGFzT3duKFdlbGxLbm93blN5bWJvbHNTdG9yZSwgbmFtZSkpIHtcbiAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBOQVRJVkVfU1lNQk9MICYmIGhhc093bihTeW1ib2wsIG5hbWUpXG4gICAgICA/IFN5bWJvbFtuYW1lXVxuICAgICAgOiBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLy8gYSBzdHJpbmcgb2YgYWxsIHZhbGlkIHVuaWNvZGUgd2hpdGVzcGFjZXNcbm1vZHVsZS5leHBvcnRzID0gJ1xcdTAwMDlcXHUwMDBBXFx1MDAwQlxcdTAwMENcXHUwMDBEXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyJyArXG4gICdcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd3JhcC1lcnJvci1jb25zdHJ1Y3Rvci13aXRoLWNhdXNlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanNcIik7XG52YXIgcHJveHlBY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm94eS1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb3h5LWFjY2Vzc29yLmpzXCIpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzXCIpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzXCIpO1xudmFyIGluc3RhbGxFcnJvckNhdXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3RhbGwtZXJyb3ItY2F1c2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnN0YWxsLWVycm9yLWNhdXNlLmpzXCIpO1xudmFyIGluc3RhbGxFcnJvclN0YWNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoRlVMTF9OQU1FLCB3cmFwcGVyLCBGT1JDRUQsIElTX0FHR1JFR0FURV9FUlJPUikge1xuICB2YXIgU1RBQ0tfVFJBQ0VfTElNSVQgPSAnc3RhY2tUcmFjZUxpbWl0JztcbiAgdmFyIE9QVElPTlNfUE9TSVRJT04gPSBJU19BR0dSRUdBVEVfRVJST1IgPyAyIDogMTtcbiAgdmFyIHBhdGggPSBGVUxMX05BTUUuc3BsaXQoJy4nKTtcbiAgdmFyIEVSUk9SX05BTUUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gIHZhciBPcmlnaW5hbEVycm9yID0gZ2V0QnVpbHRJbi5hcHBseShudWxsLCBwYXRoKTtcblxuICBpZiAoIU9yaWdpbmFsRXJyb3IpIHJldHVybjtcblxuICB2YXIgT3JpZ2luYWxFcnJvclByb3RvdHlwZSA9IE9yaWdpbmFsRXJyb3IucHJvdG90eXBlO1xuXG4gIC8vIFY4IDkuMy0gYnVnIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTEyMDA2XG4gIGlmICghSVNfUFVSRSAmJiBoYXNPd24oT3JpZ2luYWxFcnJvclByb3RvdHlwZSwgJ2NhdXNlJykpIGRlbGV0ZSBPcmlnaW5hbEVycm9yUHJvdG90eXBlLmNhdXNlO1xuXG4gIGlmICghRk9SQ0VEKSByZXR1cm4gT3JpZ2luYWxFcnJvcjtcblxuICB2YXIgQmFzZUVycm9yID0gZ2V0QnVpbHRJbignRXJyb3InKTtcblxuICB2YXIgV3JhcHBlZEVycm9yID0gd3JhcHBlcihmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBtZXNzYWdlID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoSVNfQUdHUkVHQVRFX0VSUk9SID8gYiA6IGEsIHVuZGVmaW5lZCk7XG4gICAgdmFyIHJlc3VsdCA9IElTX0FHR1JFR0FURV9FUlJPUiA/IG5ldyBPcmlnaW5hbEVycm9yKGEpIDogbmV3IE9yaWdpbmFsRXJyb3IoKTtcbiAgICBpZiAobWVzc2FnZSAhPT0gdW5kZWZpbmVkKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkocmVzdWx0LCAnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgIGluc3RhbGxFcnJvclN0YWNrKHJlc3VsdCwgV3JhcHBlZEVycm9yLCByZXN1bHQuc3RhY2ssIDIpO1xuICAgIGlmICh0aGlzICYmIGlzUHJvdG90eXBlT2YoT3JpZ2luYWxFcnJvclByb3RvdHlwZSwgdGhpcykpIGluaGVyaXRJZlJlcXVpcmVkKHJlc3VsdCwgdGhpcywgV3JhcHBlZEVycm9yKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IE9QVElPTlNfUE9TSVRJT04pIGluc3RhbGxFcnJvckNhdXNlKHJlc3VsdCwgYXJndW1lbnRzW09QVElPTlNfUE9TSVRJT05dKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcblxuICBXcmFwcGVkRXJyb3IucHJvdG90eXBlID0gT3JpZ2luYWxFcnJvclByb3RvdHlwZTtcblxuICBpZiAoRVJST1JfTkFNRSAhPT0gJ0Vycm9yJykge1xuICAgIGlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoV3JhcHBlZEVycm9yLCBCYXNlRXJyb3IpO1xuICAgIGVsc2UgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhXcmFwcGVkRXJyb3IsIEJhc2VFcnJvciwgeyBuYW1lOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKERFU0NSSVBUT1JTICYmIFNUQUNLX1RSQUNFX0xJTUlUIGluIE9yaWdpbmFsRXJyb3IpIHtcbiAgICBwcm94eUFjY2Vzc29yKFdyYXBwZWRFcnJvciwgT3JpZ2luYWxFcnJvciwgU1RBQ0tfVFJBQ0VfTElNSVQpO1xuICAgIHByb3h5QWNjZXNzb3IoV3JhcHBlZEVycm9yLCBPcmlnaW5hbEVycm9yLCAncHJlcGFyZVN0YWNrVHJhY2UnKTtcbiAgfVxuXG4gIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoV3JhcHBlZEVycm9yLCBPcmlnaW5hbEVycm9yKTtcblxuICBpZiAoIUlTX1BVUkUpIHRyeSB7XG4gICAgLy8gU2FmYXJpIDEzLSBidWc6IFdlYkFzc2VtYmx5IGVycm9ycyBkb2VzIG5vdCBoYXZlIGEgcHJvcGVyIGAubmFtZWBcbiAgICBpZiAoT3JpZ2luYWxFcnJvclByb3RvdHlwZS5uYW1lICE9PSBFUlJPUl9OQU1FKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoT3JpZ2luYWxFcnJvclByb3RvdHlwZSwgJ25hbWUnLCBFUlJPUl9OQU1FKTtcbiAgICB9XG4gICAgT3JpZ2luYWxFcnJvclByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdyYXBwZWRFcnJvcjtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG4gIHJldHVybiBXcmFwcGVkRXJyb3I7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dyYXAtZXJyb3ItY29uc3RydWN0b3Itd2l0aC1jYXVzZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLmNvbnN0cnVjdG9yLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgYXJyYXlCdWZmZXJNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLmpzXCIpO1xudmFyIHNldFNwZWNpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qc1wiKTtcblxudmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG52YXIgQXJyYXlCdWZmZXIgPSBhcnJheUJ1ZmZlck1vZHVsZVtBUlJBWV9CVUZGRVJdO1xudmFyIE5hdGl2ZUFycmF5QnVmZmVyID0gZ2xvYmFsW0FSUkFZX0JVRkZFUl07XG5cbi8vIGBBcnJheUJ1ZmZlcmAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlidWZmZXItY29uc3RydWN0b3JcbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBmb3JjZWQ6IE5hdGl2ZUFycmF5QnVmZmVyICE9PSBBcnJheUJ1ZmZlciB9LCB7XG4gIEFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlclxufSk7XG5cbnNldFNwZWNpZXMoQVJSQVlfQlVGRkVSKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLmNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuc2xpY2UuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBBcnJheUJ1ZmZlck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXIuanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG5cbnZhciBBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyTW9kdWxlLkFycmF5QnVmZmVyO1xudmFyIERhdGFWaWV3ID0gQXJyYXlCdWZmZXJNb2R1bGUuRGF0YVZpZXc7XG52YXIgRGF0YVZpZXdQcm90b3R5cGUgPSBEYXRhVmlldy5wcm90b3R5cGU7XG52YXIgbmF0aXZlQXJyYXlCdWZmZXJTbGljZSA9IHVuY3VycnlUaGlzKEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSk7XG52YXIgZ2V0VWludDggPSB1bmN1cnJ5VGhpcyhEYXRhVmlld1Byb3RvdHlwZS5nZXRVaW50OCk7XG52YXIgc2V0VWludDggPSB1bmN1cnJ5VGhpcyhEYXRhVmlld1Byb3RvdHlwZS5zZXRVaW50OCk7XG5cbnZhciBJTkNPUlJFQ1RfU0xJQ0UgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhbmV3IEFycmF5QnVmZmVyKDIpLnNsaWNlKDEsIHVuZGVmaW5lZCkuYnl0ZUxlbmd0aDtcbn0pO1xuXG4vLyBgQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlidWZmZXIucHJvdG90eXBlLnNsaWNlXG4kKHsgdGFyZ2V0OiAnQXJyYXlCdWZmZXInLCBwcm90bzogdHJ1ZSwgdW5zYWZlOiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9TTElDRSB9LCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgaWYgKG5hdGl2ZUFycmF5QnVmZmVyU2xpY2UgJiYgZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBuYXRpdmVBcnJheUJ1ZmZlclNsaWNlKGFuT2JqZWN0KHRoaXMpLCBzdGFydCk7IC8vIEZGIGZpeFxuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gYW5PYmplY3QodGhpcykuYnl0ZUxlbmd0aDtcbiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbmd0aCk7XG4gICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IGVuZCwgbGVuZ3RoKTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgQXJyYXlCdWZmZXIpKSh0b0xlbmd0aChmaW4gLSBmaXJzdCkpO1xuICAgIHZhciB2aWV3U291cmNlID0gbmV3IERhdGFWaWV3KHRoaXMpO1xuICAgIHZhciB2aWV3VGFyZ2V0ID0gbmV3IERhdGFWaWV3KHJlc3VsdCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoZmlyc3QgPCBmaW4pIHtcbiAgICAgIHNldFVpbnQ4KHZpZXdUYXJnZXQsIGluZGV4KyssIGdldFVpbnQ4KHZpZXdTb3VyY2UsIGZpcnN0KyspKTtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuc2xpY2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmF0LmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanNcIik7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuYXRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHtcbiAgYXQ6IGZ1bmN0aW9uIGF0KGluZGV4KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIHJlbGF0aXZlSW5kZXggPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgICB2YXIgayA9IHJlbGF0aXZlSW5kZXggPj0gMCA/IHJlbGF0aXZlSW5kZXggOiBsZW4gKyByZWxhdGl2ZUluZGV4O1xuICAgIHJldHVybiAoayA8IDAgfHwgayA+PSBsZW4pID8gdW5kZWZpbmVkIDogT1trXTtcbiAgfVxufSk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2F0Jyk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmF0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QtaW5kZXguanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgJGZpbmRMYXN0SW5kZXggPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi1mcm9tLWxhc3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24tZnJvbS1sYXN0LmpzXCIpLmZpbmRMYXN0SW5kZXgpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzXCIpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0SW5kZXhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZGxhc3RpbmRleFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUgfSwge1xuICBmaW5kTGFzdEluZGV4OiBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kTGFzdEluZGV4KHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2ZpbmRMYXN0SW5kZXgnKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC1sYXN0LWluZGV4LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgJGZpbmRMYXN0ID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24tZnJvbS1sYXN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdC5qc1wiKS5maW5kTGFzdCk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZGxhc3RcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHtcbiAgZmluZExhc3Q6IGZ1bmN0aW9uIGZpbmRMYXN0KGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kTGFzdCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdmaW5kTGFzdCcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGZsYXR0ZW5JbnRvQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5LmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qc1wiKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qc1wiKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5mbGF0TWFwYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZsYXRtYXBcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHtcbiAgZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHNvdXJjZUxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBBO1xuICAgIGFDYWxsYWJsZShjYWxsYmFja2ZuKTtcbiAgICBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApO1xuICAgIEEubGVuZ3RoID0gZmxhdHRlbkludG9BcnJheShBLCBPLCBPLCBzb3VyY2VMZW4sIDAsIDEsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciAkaW5jbHVkZXMgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanNcIikuaW5jbHVkZXMpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG5cbi8vIEZGOTkrIGJ1Z1xudmFyIEJST0tFTl9PTl9TUEFSU0UgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1wcm90b3R5cGUtaW5jbHVkZXMgLS0gZGV0ZWN0aW9uXG4gIHJldHVybiAhQXJyYXkoMSkuaW5jbHVkZXMoKTtcbn0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCUk9LRU5fT05fU1BBUlNFIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2luY2x1ZGVzJyk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanNcIik7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgZGVmaW5lUHJvcGVydHkgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpLmYpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWRlZmluZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWRlZmluZS5qc1wiKTtcbnZhciBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlci1yZXN1bHQtb2JqZWN0LmpzXCIpO1xudmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmVudHJpZXNcbi8vIGBBcnJheS5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5rZXlzXG4vLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEBpdGVyYXRvclxuLy8gYENyZWF0ZUFycmF5SXRlcmF0b3JgIGludGVybmFsIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVhcnJheWl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogQVJSQVlfSVRFUkFUT1IsXG4gICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXRcbiAgICBpbmRleDogMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgICBraW5kOiBraW5kICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgfSk7XG4vLyBgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KGluZGV4LCBmYWxzZSk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdCh0YXJnZXRbaW5kZXhdLCBmYWxzZSk7XG4gIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KFtpbmRleCwgdGFyZ2V0W2luZGV4XV0sIGZhbHNlKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZW1hcHBlZGFyZ3VtZW50c29iamVjdFxudmFyIHZhbHVlcyA9IEl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG4vLyBWOCB+IENocm9tZSA0NS0gYnVnXG5pZiAoIUlTX1BVUkUgJiYgREVTQ1JJUFRPUlMgJiYgdmFsdWVzLm5hbWUgIT09ICd2YWx1ZXMnKSB0cnkge1xuICBkZWZpbmVQcm9wZXJ0eSh2YWx1ZXMsICduYW1lJywgeyB2YWx1ZTogJ3ZhbHVlcycgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIHNldEFycmF5TGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoLmpzXCIpO1xudmFyIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb2VzLW5vdC1leGNlZWQtc2FmZS1pbnRlZ2VyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlci5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xuXG52YXIgSU5DT1JSRUNUX1RPX0xFTkdUSCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFtdLnB1c2guY2FsbCh7IGxlbmd0aDogMHgxMDAwMDAwMDAgfSwgMSkgIT09IDQyOTQ5NjcyOTc7XG59KTtcblxuLy8gVjggYW5kIFNhZmFyaSA8PSAxNS40LCBGRiA8IDIzIHRocm93cyBJbnRlcm5hbEVycm9yXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjY4MVxudmFyIHByb3BlckVycm9yT25Ob25Xcml0YWJsZUxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KS5wdXNoKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICB9XG59O1xuXG52YXIgRk9SQ0VEID0gSU5DT1JSRUNUX1RPX0xFTkdUSCB8fCAhcHJvcGVyRXJyb3JPbk5vbldyaXRhYmxlTGVuZ3RoKCk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUucHVzaGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5wdXNoXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgYXJpdHk6IDEsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgcHVzaDogZnVuY3Rpb24gcHVzaChpdGVtKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIGFyZ0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIobGVuICsgYXJnQ291bnQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykge1xuICAgICAgT1tsZW5dID0gYXJndW1lbnRzW2ldO1xuICAgICAgbGVuKys7XG4gICAgfVxuICAgIHNldEFycmF5TGVuZ3RoKE8sIGxlbik7XG4gICAgcmV0dXJuIGxlbjtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qc1wiKTtcbnZhciBkZWxldGVQcm9wZXJ0eU9yVGhyb3cgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93LmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGludGVybmFsU29ydCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc29ydC5qc1wiKTtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0LmpzXCIpO1xudmFyIEZGID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1mZi12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanNcIik7XG52YXIgSUVfT1JfRURHRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pZS1vci1lZGdlLmpzXCIpO1xudmFyIFY4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24uanNcIik7XG52YXIgV0VCS0lUID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbi5qc1wiKTtcblxudmFyIHRlc3QgPSBbXTtcbnZhciBuYXRpdmVTb3J0ID0gdW5jdXJyeVRoaXModGVzdC5zb3J0KTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXModGVzdC5wdXNoKTtcblxuLy8gSUU4LVxudmFyIEZBSUxTX09OX1VOREVGSU5FRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdGVzdC5zb3J0KHVuZGVmaW5lZCk7XG59KTtcbi8vIFY4IGJ1Z1xudmFyIEZBSUxTX09OX05VTEwgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHRlc3Quc29ydChudWxsKTtcbn0pO1xuLy8gT2xkIFdlYktpdFxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdzb3J0Jyk7XG5cbnZhciBTVEFCTEVfU09SVCA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGZlYXR1cmUgZGV0ZWN0aW9uIGNhbiBiZSB0b28gc2xvdywgc28gY2hlY2sgZW5naW5lcyB2ZXJzaW9uc1xuICBpZiAoVjgpIHJldHVybiBWOCA8IDcwO1xuICBpZiAoRkYgJiYgRkYgPiAzKSByZXR1cm47XG4gIGlmIChJRV9PUl9FREdFKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKFdFQktJVCkgcmV0dXJuIFdFQktJVCA8IDYwMztcblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBjb2RlLCBjaHIsIHZhbHVlLCBpbmRleDtcblxuICAvLyBnZW5lcmF0ZSBhbiBhcnJheSB3aXRoIG1vcmUgNTEyIGVsZW1lbnRzIChDaGFrcmEgYW5kIG9sZCBWOCBmYWlscyBvbmx5IGluIHRoaXMgY2FzZSlcbiAgZm9yIChjb2RlID0gNjU7IGNvZGUgPCA3NjsgY29kZSsrKSB7XG4gICAgY2hyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcblxuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSA2NjogY2FzZSA2OTogY2FzZSA3MDogY2FzZSA3MjogdmFsdWUgPSAzOyBicmVhaztcbiAgICAgIGNhc2UgNjg6IGNhc2UgNzE6IHZhbHVlID0gNDsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB2YWx1ZSA9IDI7XG4gICAgfVxuXG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDc7IGluZGV4KyspIHtcbiAgICAgIHRlc3QucHVzaCh7IGs6IGNociArIGluZGV4LCB2OiB2YWx1ZSB9KTtcbiAgICB9XG4gIH1cblxuICB0ZXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIudiAtIGEudjsgfSk7XG5cbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdGVzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjaHIgPSB0ZXN0W2luZGV4XS5rLmNoYXJBdCgwKTtcbiAgICBpZiAocmVzdWx0LmNoYXJBdChyZXN1bHQubGVuZ3RoIC0gMSkgIT09IGNocikgcmVzdWx0ICs9IGNocjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQgIT09ICdER0JFRkhBQ0lKSyc7XG59KTtcblxudmFyIEZPUkNFRCA9IEZBSUxTX09OX1VOREVGSU5FRCB8fCAhRkFJTFNfT05fTlVMTCB8fCAhU1RSSUNUX01FVEhPRCB8fCAhU1RBQkxFX1NPUlQ7XG5cbnZhciBnZXRTb3J0Q29tcGFyZSA9IGZ1bmN0aW9uIChjb21wYXJlZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIC0xO1xuICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHJldHVybiAxO1xuICAgIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgcmV0dXJuICtjb21wYXJlZm4oeCwgeSkgfHwgMDtcbiAgICByZXR1cm4gdG9TdHJpbmcoeCkgPiB0b1N0cmluZyh5KSA/IDEgOiAtMTtcbiAgfTtcbn07XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuc29ydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb3J0XG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbikge1xuICAgIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgYUNhbGxhYmxlKGNvbXBhcmVmbik7XG5cbiAgICB2YXIgYXJyYXkgPSB0b09iamVjdCh0aGlzKTtcblxuICAgIGlmIChTVEFCTEVfU09SVCkgcmV0dXJuIGNvbXBhcmVmbiA9PT0gdW5kZWZpbmVkID8gbmF0aXZlU29ydChhcnJheSkgOiBuYXRpdmVTb3J0KGFycmF5LCBjb21wYXJlZm4pO1xuXG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdmFyIGFycmF5TGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoYXJyYXkpO1xuICAgIHZhciBpdGVtc0xlbmd0aCwgaW5kZXg7XG5cbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBhcnJheUxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKGluZGV4IGluIGFycmF5KSBwdXNoKGl0ZW1zLCBhcnJheVtpbmRleF0pO1xuICAgIH1cblxuICAgIGludGVybmFsU29ydChpdGVtcywgZ2V0U29ydENvbXBhcmUoY29tcGFyZWZuKSk7XG5cbiAgICBpdGVtc0xlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKGl0ZW1zKTtcbiAgICBpbmRleCA9IDA7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBpdGVtc0xlbmd0aCkgYXJyYXlbaW5kZXhdID0gaXRlbXNbaW5kZXgrK107XG4gICAgd2hpbGUgKGluZGV4IDwgYXJyYXlMZW5ndGgpIGRlbGV0ZVByb3BlcnR5T3JUaHJvdyhhcnJheSwgaW5kZXgrKyk7XG5cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb3J0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIHRoaXMgbWV0aG9kIHdhcyBhZGRlZCB0byB1bnNjb3BhYmxlcyBhZnRlciBpbXBsZW1lbnRhdGlvblxuLy8gaW4gcG9wdWxhciBlbmdpbmVzLCBzbyBpdCdzIG1vdmVkIHRvIGEgc2VwYXJhdGUgbW9kdWxlXG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2ZsYXRNYXAnKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkudW5zY29wYWJsZXMuZmxhdC1tYXAuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LndpdGguanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgYXJyYXlXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXdpdGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS13aXRoLmpzXCIpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzXCIpO1xuXG52YXIgJEFycmF5ID0gQXJyYXk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUud2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS53aXRoXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSB9LCB7XG4gICd3aXRoJzogZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkge1xuICAgIHJldHVybiBhcnJheVdpdGgodG9JbmRleGVkT2JqZWN0KHRoaXMpLCAkQXJyYXksIGluZGV4LCB2YWx1ZSk7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS53aXRoLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBmdW5jdGlvbnMgYC5sZW5ndGhgICovXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBhcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzXCIpO1xudmFyIHdyYXBFcnJvckNvbnN0cnVjdG9yV2l0aENhdXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dyYXAtZXJyb3ItY29uc3RydWN0b3Itd2l0aC1jYXVzZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dyYXAtZXJyb3ItY29uc3RydWN0b3Itd2l0aC1jYXVzZS5qc1wiKTtcblxudmFyIFdFQl9BU1NFTUJMWSA9ICdXZWJBc3NlbWJseSc7XG52YXIgV2ViQXNzZW1ibHkgPSBnbG9iYWxbV0VCX0FTU0VNQkxZXTtcblxudmFyIEZPUkNFRCA9IEVycm9yKCdlJywgeyBjYXVzZTogNyB9KS5jYXVzZSAhPT0gNztcblxudmFyIGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyID0gZnVuY3Rpb24gKEVSUk9SX05BTUUsIHdyYXBwZXIpIHtcbiAgdmFyIE8gPSB7fTtcbiAgT1tFUlJPUl9OQU1FXSA9IHdyYXBFcnJvckNvbnN0cnVjdG9yV2l0aENhdXNlKEVSUk9SX05BTUUsIHdyYXBwZXIsIEZPUkNFRCk7XG4gICQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBhcml0eTogMSwgZm9yY2VkOiBGT1JDRUQgfSwgTyk7XG59O1xuXG52YXIgZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlciA9IGZ1bmN0aW9uIChFUlJPUl9OQU1FLCB3cmFwcGVyKSB7XG4gIGlmIChXZWJBc3NlbWJseSAmJiBXZWJBc3NlbWJseVtFUlJPUl9OQU1FXSkge1xuICAgIHZhciBPID0ge307XG4gICAgT1tFUlJPUl9OQU1FXSA9IHdyYXBFcnJvckNvbnN0cnVjdG9yV2l0aENhdXNlKFdFQl9BU1NFTUJMWSArICcuJyArIEVSUk9SX05BTUUsIHdyYXBwZXIsIEZPUkNFRCk7XG4gICAgJCh7IHRhcmdldDogV0VCX0FTU0VNQkxZLCBzdGF0OiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgYXJpdHk6IDEsIGZvcmNlZDogRk9SQ0VEIH0sIE8pO1xuICB9XG59O1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW5hdGl2ZWVycm9yXG5leHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcignRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gRXJyb3IobWVzc2FnZSkgeyByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTsgfTtcbn0pO1xuZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoJ0V2YWxFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBFdmFsRXJyb3IobWVzc2FnZSkgeyByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTsgfTtcbn0pO1xuZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoJ1JhbmdlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gUmFuZ2VFcnJvcihtZXNzYWdlKSB7IHJldHVybiBhcHBseShpbml0LCB0aGlzLCBhcmd1bWVudHMpOyB9O1xufSk7XG5leHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcignUmVmZXJlbmNlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gUmVmZXJlbmNlRXJyb3IobWVzc2FnZSkgeyByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTsgfTtcbn0pO1xuZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoJ1N5bnRheEVycm9yJywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFN5bnRheEVycm9yKG1lc3NhZ2UpIHsgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7IH07XG59KTtcbmV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCdUeXBlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVHlwZUVycm9yKG1lc3NhZ2UpIHsgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7IH07XG59KTtcbmV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCdVUklFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVUklFcnJvcihtZXNzYWdlKSB7IHJldHVybiBhcHBseShpbml0LCB0aGlzLCBhcmd1bWVudHMpOyB9O1xufSk7XG5leHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyKCdDb21waWxlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gQ29tcGlsZUVycm9yKG1lc3NhZ2UpIHsgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7IH07XG59KTtcbmV4cG9ydFdlYkFzc2VtYmx5RXJyb3JDYXVzZVdyYXBwZXIoJ0xpbmtFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBMaW5rRXJyb3IobWVzc2FnZSkgeyByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTsgfTtcbn0pO1xuZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlcignUnVudGltZUVycm9yJywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFJ1bnRpbWVFcnJvcihtZXNzYWdlKSB7IHJldHVybiBhcHBseShpbml0LCB0aGlzLCBhcmd1bWVudHMpOyB9O1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmVycm9yLmNhdXNlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5nbG9iYWwtdGhpcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xuXG4vLyBgZ2xvYmFsVGhpc2Agb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdsb2JhbHRoaXNcbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogZ2xvYmFsLmdsb2JhbFRoaXMgIT09IGdsb2JhbCB9LCB7XG4gIGdsb2JhbFRoaXM6IGdsb2JhbFxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBhcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGlzU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qc1wiKTtcbnZhciBhcnJheVNsaWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2UuanNcIik7XG52YXIgZ2V0UmVwbGFjZXJGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtanNvbi1yZXBsYWNlci1mdW5jdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1qc29uLXJlcGxhY2VyLWZ1bmN0aW9uLmpzXCIpO1xudmFyIE5BVElWRV9TWU1CT0wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanNcIik7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcygvLi8uZXhlYyk7XG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBjaGFyQ29kZUF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckNvZGVBdCk7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIG51bWJlclRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxudmFyIHRlc3RlciA9IC9bXFx1RDgwMC1cXHVERkZGXS9nO1xudmFyIGxvdyA9IC9eW1xcdUQ4MDAtXFx1REJGRl0kLztcbnZhciBoaSA9IC9eW1xcdURDMDAtXFx1REZGRl0kLztcblxudmFyIFdST05HX1NZTUJPTFNfQ09OVkVSU0lPTiA9ICFOQVRJVkVfU1lNQk9MIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIHJldHVybiAkc3RyaW5naWZ5KFtzeW1ib2xdKSAhPSAnW251bGxdJ1xuICAgIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAgIHx8ICRzdHJpbmdpZnkoeyBhOiBzeW1ib2wgfSkgIT0gJ3t9J1xuICAgIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gICAgfHwgJHN0cmluZ2lmeShPYmplY3Qoc3ltYm9sKSkgIT0gJ3t9Jztcbn0pO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC13ZWxsLWZvcm1lZC1zdHJpbmdpZnlcbnZhciBJTExfRk9STUVEX1VOSUNPREUgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAkc3RyaW5naWZ5KCdcXHVERjA2XFx1RDgzNCcpICE9PSAnXCJcXFxcdWRmMDZcXFxcdWQ4MzRcIidcbiAgICB8fCAkc3RyaW5naWZ5KCdcXHVERUFEJykgIT09ICdcIlxcXFx1ZGVhZFwiJztcbn0pO1xuXG52YXIgc3RyaW5naWZ5V2l0aFN5bWJvbHNGaXggPSBmdW5jdGlvbiAoaXQsIHJlcGxhY2VyKSB7XG4gIHZhciBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMpO1xuICB2YXIgJHJlcGxhY2VyID0gZ2V0UmVwbGFjZXJGdW5jdGlvbihyZXBsYWNlcik7XG4gIGlmICghaXNDYWxsYWJsZSgkcmVwbGFjZXIpICYmIChpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICBhcmdzWzFdID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAvLyBzb21lIG9sZCBpbXBsZW1lbnRhdGlvbnMgKGxpa2UgV2ViS2l0KSBjb3VsZCBwYXNzIG51bWJlcnMgYXMga2V5c1xuICAgIGlmIChpc0NhbGxhYmxlKCRyZXBsYWNlcikpIHZhbHVlID0gY2FsbCgkcmVwbGFjZXIsIHRoaXMsICRTdHJpbmcoa2V5KSwgdmFsdWUpO1xuICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIH07XG4gIHJldHVybiBhcHBseSgkc3RyaW5naWZ5LCBudWxsLCBhcmdzKTtcbn07XG5cbnZhciBmaXhJbGxGb3JtZWQgPSBmdW5jdGlvbiAobWF0Y2gsIG9mZnNldCwgc3RyaW5nKSB7XG4gIHZhciBwcmV2ID0gY2hhckF0KHN0cmluZywgb2Zmc2V0IC0gMSk7XG4gIHZhciBuZXh0ID0gY2hhckF0KHN0cmluZywgb2Zmc2V0ICsgMSk7XG4gIGlmICgoZXhlYyhsb3csIG1hdGNoKSAmJiAhZXhlYyhoaSwgbmV4dCkpIHx8IChleGVjKGhpLCBtYXRjaCkgJiYgIWV4ZWMobG93LCBwcmV2KSkpIHtcbiAgICByZXR1cm4gJ1xcXFx1JyArIG51bWJlclRvU3RyaW5nKGNoYXJDb2RlQXQobWF0Y2gsIDApLCAxNik7XG4gIH0gcmV0dXJuIG1hdGNoO1xufTtcblxuaWYgKCRzdHJpbmdpZnkpIHtcbiAgLy8gYEpTT04uc3RyaW5naWZ5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLnN0cmluZ2lmeVxuICAkKHsgdGFyZ2V0OiAnSlNPTicsIHN0YXQ6IHRydWUsIGFyaXR5OiAzLCBmb3JjZWQ6IFdST05HX1NZTUJPTFNfQ09OVkVSU0lPTiB8fCBJTExfRk9STUVEX1VOSUNPREUgfSwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gICAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkge1xuICAgICAgdmFyIGFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cyk7XG4gICAgICB2YXIgcmVzdWx0ID0gYXBwbHkoV1JPTkdfU1lNQk9MU19DT05WRVJTSU9OID8gc3RyaW5naWZ5V2l0aFN5bWJvbHNGaXggOiAkc3RyaW5naWZ5LCBudWxsLCBhcmdzKTtcbiAgICAgIHJldHVybiBJTExfRk9STUVEX1VOSUNPREUgJiYgdHlwZW9mIHJlc3VsdCA9PSAnc3RyaW5nJyA/IHJlcGxhY2UocmVzdWx0LCB0ZXN0ZXIsIGZpeElsbEZvcm1lZCkgOiByZXN1bHQ7XG4gICAgfVxuICB9KTtcbn1cblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1tYXRoLWh5cG90IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG52YXIgJGh5cG90ID0gTWF0aC5oeXBvdDtcbnZhciBhYnMgPSBNYXRoLmFicztcbnZhciBzcXJ0ID0gTWF0aC5zcXJ0O1xuXG4vLyBDaHJvbWUgNzcgYnVnXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05NTQ2XG52YXIgRk9SQ0VEID0gISEkaHlwb3QgJiYgJGh5cG90KEluZmluaXR5LCBOYU4pICE9PSBJbmZpbml0eTtcblxuLy8gYE1hdGguaHlwb3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXRoLmh5cG90XG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGFyaXR5OiAyLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIGh5cG90OiBmdW5jdGlvbiBoeXBvdCh2YWx1ZTEsIHZhbHVlMikge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGxhcmcgPSAwO1xuICAgIHZhciBhcmcsIGRpdjtcbiAgICB3aGlsZSAoaSA8IGFMZW4pIHtcbiAgICAgIGFyZyA9IGFicyhhcmd1bWVudHNbaSsrXSk7XG4gICAgICBpZiAobGFyZyA8IGFyZykge1xuICAgICAgICBkaXYgPSBsYXJnIC8gYXJnO1xuICAgICAgICBzdW0gPSBzdW0gKiBkaXYgKiBkaXYgKyAxO1xuICAgICAgICBsYXJnID0gYXJnO1xuICAgICAgfSBlbHNlIGlmIChhcmcgPiAwKSB7XG4gICAgICAgIGRpdiA9IGFyZyAvIGxhcmc7XG4gICAgICAgIHN1bSArPSBkaXYgKiBkaXY7XG4gICAgICB9IGVsc2Ugc3VtICs9IGFyZztcbiAgICB9XG4gICAgcmV0dXJuIGxhcmcgPT09IEluZmluaXR5ID8gSW5maW5pdHkgOiBsYXJnICogc3FydChzdW0pO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnRvLWZpeGVkLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRoaXNOdW1iZXJWYWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RoaXMtbnVtYmVyLXZhbHVlLmpzXCIpO1xudmFyICRyZXBlYXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciByZXBlYXQgPSB1bmN1cnJ5VGhpcygkcmVwZWF0KTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciBuYXRpdmVUb0ZpeGVkID0gdW5jdXJyeVRoaXMoMS4wLnRvRml4ZWQpO1xuXG52YXIgcG93ID0gZnVuY3Rpb24gKHgsIG4sIGFjYykge1xuICByZXR1cm4gbiA9PT0gMCA/IGFjYyA6IG4gJSAyID09PSAxID8gcG93KHgsIG4gLSAxLCBhY2MgKiB4KSA6IHBvdyh4ICogeCwgbiAvIDIsIGFjYyk7XG59O1xuXG52YXIgbG9nID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIG4gPSAwO1xuICB2YXIgeDIgPSB4O1xuICB3aGlsZSAoeDIgPj0gNDA5Nikge1xuICAgIG4gKz0gMTI7XG4gICAgeDIgLz0gNDA5NjtcbiAgfVxuICB3aGlsZSAoeDIgPj0gMikge1xuICAgIG4gKz0gMTtcbiAgICB4MiAvPSAyO1xuICB9IHJldHVybiBuO1xufTtcblxudmFyIG11bHRpcGx5ID0gZnVuY3Rpb24gKGRhdGEsIG4sIGMpIHtcbiAgdmFyIGluZGV4ID0gLTE7XG4gIHZhciBjMiA9IGM7XG4gIHdoaWxlICgrK2luZGV4IDwgNikge1xuICAgIGMyICs9IG4gKiBkYXRhW2luZGV4XTtcbiAgICBkYXRhW2luZGV4XSA9IGMyICUgMWU3O1xuICAgIGMyID0gZmxvb3IoYzIgLyAxZTcpO1xuICB9XG59O1xuXG52YXIgZGl2aWRlID0gZnVuY3Rpb24gKGRhdGEsIG4pIHtcbiAgdmFyIGluZGV4ID0gNjtcbiAgdmFyIGMgPSAwO1xuICB3aGlsZSAoLS1pbmRleCA+PSAwKSB7XG4gICAgYyArPSBkYXRhW2luZGV4XTtcbiAgICBkYXRhW2luZGV4XSA9IGZsb29yKGMgLyBuKTtcbiAgICBjID0gKGMgJSBuKSAqIDFlNztcbiAgfVxufTtcblxudmFyIGRhdGFUb1N0cmluZyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHZhciBpbmRleCA9IDY7XG4gIHZhciBzID0gJyc7XG4gIHdoaWxlICgtLWluZGV4ID49IDApIHtcbiAgICBpZiAocyAhPT0gJycgfHwgaW5kZXggPT09IDAgfHwgZGF0YVtpbmRleF0gIT09IDApIHtcbiAgICAgIHZhciB0ID0gJFN0cmluZyhkYXRhW2luZGV4XSk7XG4gICAgICBzID0gcyA9PT0gJycgPyB0IDogcyArIHJlcGVhdCgnMCcsIDcgLSB0Lmxlbmd0aCkgKyB0O1xuICAgIH1cbiAgfSByZXR1cm4gcztcbn07XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuYXRpdmVUb0ZpeGVkKDAuMDAwMDgsIDMpICE9PSAnMC4wMDAnIHx8XG4gICAgbmF0aXZlVG9GaXhlZCgwLjksIDApICE9PSAnMScgfHxcbiAgICBuYXRpdmVUb0ZpeGVkKDEuMjU1LCAyKSAhPT0gJzEuMjUnIHx8XG4gICAgbmF0aXZlVG9GaXhlZCgxMDAwMDAwMDAwMDAwMDAwMTI4LjAsIDApICE9PSAnMTAwMDAwMDAwMDAwMDAwMDEyOCc7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxuICBuYXRpdmVUb0ZpeGVkKHt9KTtcbn0pO1xuXG4vLyBgTnVtYmVyLnByb3RvdHlwZS50b0ZpeGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLnByb3RvdHlwZS50b2ZpeGVkXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgdG9GaXhlZDogZnVuY3Rpb24gdG9GaXhlZChmcmFjdGlvbkRpZ2l0cykge1xuICAgIHZhciBudW1iZXIgPSB0aGlzTnVtYmVyVmFsdWUodGhpcyk7XG4gICAgdmFyIGZyYWN0RGlnaXRzID0gdG9JbnRlZ2VyT3JJbmZpbml0eShmcmFjdGlvbkRpZ2l0cyk7XG4gICAgdmFyIGRhdGEgPSBbMCwgMCwgMCwgMCwgMCwgMF07XG4gICAgdmFyIHNpZ24gPSAnJztcbiAgICB2YXIgcmVzdWx0ID0gJzAnO1xuICAgIHZhciBlLCB6LCBqLCBrO1xuXG4gICAgLy8gVE9ETzogRVMyMDE4IGluY3JlYXNlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzIHRvIDEwMCwgbmVlZCB0byBpbXByb3ZlIHRoZSBpbXBsZW1lbnRhdGlvblxuICAgIGlmIChmcmFjdERpZ2l0cyA8IDAgfHwgZnJhY3REaWdpdHMgPiAyMCkgdGhyb3cgJFJhbmdlRXJyb3IoJ0luY29ycmVjdCBmcmFjdGlvbiBkaWdpdHMnKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChudW1iZXIgIT0gbnVtYmVyKSByZXR1cm4gJ05hTic7XG4gICAgaWYgKG51bWJlciA8PSAtMWUyMSB8fCBudW1iZXIgPj0gMWUyMSkgcmV0dXJuICRTdHJpbmcobnVtYmVyKTtcbiAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgc2lnbiA9ICctJztcbiAgICAgIG51bWJlciA9IC1udW1iZXI7XG4gICAgfVxuICAgIGlmIChudW1iZXIgPiAxZS0yMSkge1xuICAgICAgZSA9IGxvZyhudW1iZXIgKiBwb3coMiwgNjksIDEpKSAtIDY5O1xuICAgICAgeiA9IGUgPCAwID8gbnVtYmVyICogcG93KDIsIC1lLCAxKSA6IG51bWJlciAvIHBvdygyLCBlLCAxKTtcbiAgICAgIHogKj0gMHgxMDAwMDAwMDAwMDAwMDtcbiAgICAgIGUgPSA1MiAtIGU7XG4gICAgICBpZiAoZSA+IDApIHtcbiAgICAgICAgbXVsdGlwbHkoZGF0YSwgMCwgeik7XG4gICAgICAgIGogPSBmcmFjdERpZ2l0cztcbiAgICAgICAgd2hpbGUgKGogPj0gNykge1xuICAgICAgICAgIG11bHRpcGx5KGRhdGEsIDFlNywgMCk7XG4gICAgICAgICAgaiAtPSA3O1xuICAgICAgICB9XG4gICAgICAgIG11bHRpcGx5KGRhdGEsIHBvdygxMCwgaiwgMSksIDApO1xuICAgICAgICBqID0gZSAtIDE7XG4gICAgICAgIHdoaWxlIChqID49IDIzKSB7XG4gICAgICAgICAgZGl2aWRlKGRhdGEsIDEgPDwgMjMpO1xuICAgICAgICAgIGogLT0gMjM7XG4gICAgICAgIH1cbiAgICAgICAgZGl2aWRlKGRhdGEsIDEgPDwgaik7XG4gICAgICAgIG11bHRpcGx5KGRhdGEsIDEsIDEpO1xuICAgICAgICBkaXZpZGUoZGF0YSwgMik7XG4gICAgICAgIHJlc3VsdCA9IGRhdGFUb1N0cmluZyhkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11bHRpcGx5KGRhdGEsIDAsIHopO1xuICAgICAgICBtdWx0aXBseShkYXRhLCAxIDw8IC1lLCAwKTtcbiAgICAgICAgcmVzdWx0ID0gZGF0YVRvU3RyaW5nKGRhdGEpICsgcmVwZWF0KCcwJywgZnJhY3REaWdpdHMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhY3REaWdpdHMgPiAwKSB7XG4gICAgICBrID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgIHJlc3VsdCA9IHNpZ24gKyAoayA8PSBmcmFjdERpZ2l0c1xuICAgICAgICA/ICcwLicgKyByZXBlYXQoJzAnLCBmcmFjdERpZ2l0cyAtIGspICsgcmVzdWx0XG4gICAgICAgIDogc3RyaW5nU2xpY2UocmVzdWx0LCAwLCBrIC0gZnJhY3REaWdpdHMpICsgJy4nICsgc3RyaW5nU2xpY2UocmVzdWx0LCBrIC0gZnJhY3REaWdpdHMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc2lnbiArIHJlc3VsdDtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgYXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzXCIpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtYXNzaWduIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgYXJpdHk6IDIsIGZvcmNlZDogT2JqZWN0LmFzc2lnbiAhPT0gYXNzaWduIH0sIHtcbiAgYXNzaWduOiBhc3NpZ25cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaGFzLW93bi5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG5cbi8vIGBPYmplY3QuaGFzT3duYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0Lmhhc293blxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBoYXNPd246IGhhc093blxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5oYXMtb3duLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciAkcGFyc2VGbG9hdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQuanNcIik7XG5cbi8vIGBwYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VmbG9hdC1zdHJpbmdcbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogcGFyc2VGbG9hdCAhPSAkcGFyc2VGbG9hdCB9LCB7XG4gIHBhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucGFyc2UtZmxvYXQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnBhcnNlLWludC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciAkcGFyc2VJbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQuanNcIik7XG5cbi8vIGBwYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXBhcnNlaW50LXN0cmluZy1yYWRpeFxuJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBwYXJzZUludCAhPSAkcGFyc2VJbnQgfSwge1xuICBwYXJzZUludDogJHBhcnNlSW50XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucGFyc2UtaW50LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzXCIpO1xudmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanNcIik7XG52YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qc1wiKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uLmpzXCIpO1xuXG4vLyBgUHJvbWlzZS5hbGxTZXR0bGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxzZXR0bGVkXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICBhbGxTZXR0bGVkOiBmdW5jdGlvbiBhbGxTZXR0bGVkKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwocHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVycm9yIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qc1wiKTtcbnZhciBwZXJmb3JtID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BlcmZvcm0gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzXCIpO1xudmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanNcIik7XG52YXIgUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1zdGF0aWNzLWluY29ycmVjdC1pdGVyYXRpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbi5qc1wiKTtcblxuLy8gYFByb21pc2UuYWxsYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKCRwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5hbGwuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuY2F0Y2guanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKS5DT05TVFJVQ1RPUik7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanNcIik7XG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xuXG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiwgcmVhbDogdHJ1ZSB9LCB7XG4gICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICB9XG59KTtcblxuLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjY2F0Y2hgIHByb3Blcmx5IHdvcmtzIHdpdGggcGF0Y2hlZCBgUHJvbWlzZSN0aGVuYFxuaWYgKCFJU19QVVJFICYmIGlzQ2FsbGFibGUoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKSkge1xuICB2YXIgbWV0aG9kID0gZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnY2F0Y2gnXTtcbiAgaWYgKE5hdGl2ZVByb21pc2VQcm90b3R5cGVbJ2NhdGNoJ10gIT09IG1ldGhvZCkge1xuICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ2NhdGNoJywgbWV0aG9kLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNhdGNoLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNvbnN0cnVjdG9yLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanNcIik7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanNcIik7XG52YXIgc2V0U3BlY2llcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtc3BlY2llcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qc1wiKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgdGFzayA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdGFzayAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanNcIikuc2V0KTtcbnZhciBtaWNyb3Rhc2sgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWljcm90YXNrICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzXCIpO1xudmFyIGhvc3RSZXBvcnRFcnJvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzXCIpO1xudmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanNcIik7XG52YXIgUXVldWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcXVldWUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9xdWV1ZS5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanNcIik7XG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanNcIik7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanNcIik7XG5cbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uLkNPTlNUUlVDVE9SO1xudmFyIE5BVElWRV9QUk9NSVNFX1JFSkVDVElPTl9FVkVOVCA9IFByb21pc2VDb25zdHJ1Y3RvckRldGVjdGlvbi5SRUpFQ1RJT05fRVZFTlQ7XG52YXIgTkFUSVZFX1BST01JU0VfU1VCQ0xBU1NJTkcgPSBQcm9taXNlQ29uc3RydWN0b3JEZXRlY3Rpb24uU1VCQ0xBU1NJTkc7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xudmFyIFByb21pc2VDb25zdHJ1Y3RvciA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvcjtcbnZhciBQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZVByb3RvdHlwZTtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7XG5cbnZhciBESVNQQVRDSF9FVkVOVCA9ICEhKGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUV2ZW50ICYmIGdsb2JhbC5kaXNwYXRjaEV2ZW50KTtcbnZhciBVTkhBTkRMRURfUkVKRUNUSU9OID0gJ3VuaGFuZGxlZHJlamVjdGlvbic7XG52YXIgUkVKRUNUSU9OX0hBTkRMRUQgPSAncmVqZWN0aW9uaGFuZGxlZCc7XG52YXIgUEVORElORyA9IDA7XG52YXIgRlVMRklMTEVEID0gMTtcbnZhciBSRUpFQ1RFRCA9IDI7XG52YXIgSEFORExFRCA9IDE7XG52YXIgVU5IQU5ETEVEID0gMjtcblxudmFyIEludGVybmFsLCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgUHJvbWlzZVdyYXBwZXIsIG5hdGl2ZVRoZW47XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIGlzQ2FsbGFibGUodGhlbiA9IGl0LnRoZW4pID8gdGhlbiA6IGZhbHNlO1xufTtcblxudmFyIGNhbGxSZWFjdGlvbiA9IGZ1bmN0aW9uIChyZWFjdGlvbiwgc3RhdGUpIHtcbiAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gIHZhciBvayA9IHN0YXRlLnN0YXRlID09IEZVTEZJTExFRDtcbiAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gIHRyeSB7XG4gICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgaWYgKHN0YXRlLnJlamVjdGlvbiA9PT0gVU5IQU5ETEVEKSBvbkhhbmRsZVVuaGFuZGxlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICB9XG4gICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBjYW4gdGhyb3dcbiAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgIGNhbGwodGhlbiwgcmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgfVxufTtcblxudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChzdGF0ZSwgaXNSZWplY3QpIHtcbiAgaWYgKHN0YXRlLm5vdGlmaWVkKSByZXR1cm47XG4gIHN0YXRlLm5vdGlmaWVkID0gdHJ1ZTtcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVhY3Rpb25zID0gc3RhdGUucmVhY3Rpb25zO1xuICAgIHZhciByZWFjdGlvbjtcbiAgICB3aGlsZSAocmVhY3Rpb24gPSByZWFjdGlvbnMuZ2V0KCkpIHtcbiAgICAgIGNhbGxSZWFjdGlvbihyZWFjdGlvbiwgc3RhdGUpO1xuICAgIH1cbiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChzdGF0ZSk7XG4gIH0pO1xufTtcblxudmFyIGRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgcHJvbWlzZSwgcmVhc29uKSB7XG4gIHZhciBldmVudCwgaGFuZGxlcjtcbiAgaWYgKERJU1BBVENIX0VWRU5UKSB7XG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5wcm9taXNlID0gcHJvbWlzZTtcbiAgICBldmVudC5yZWFzb24gPSByZWFzb247XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTtcbiAgaWYgKCFOQVRJVkVfUFJPTUlTRV9SRUpFQ1RJT05fRVZFTlQgJiYgKGhhbmRsZXIgPSBnbG9iYWxbJ29uJyArIG5hbWVdKSkgaGFuZGxlcihldmVudCk7XG4gIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7XG59O1xuXG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY2FsbCh0YXNrLCBnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHN0YXRlLmZhY2FkZTtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgSVNfVU5IQU5ETEVEID0gaXNVbmhhbmRsZWQoc3RhdGUpO1xuICAgIHZhciByZXN1bHQ7XG4gICAgaWYgKElTX1VOSEFORExFRCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChJU19OT0RFKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFVOSEFORExFRF9SRUpFQ1RJT04sIHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHN0YXRlLnJlamVjdGlvbiA9IElTX05PREUgfHwgaXNVbmhhbmRsZWQoc3RhdGUpID8gVU5IQU5ETEVEIDogSEFORExFRDtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5yZWplY3Rpb24gIT09IEhBTkRMRUQgJiYgIXN0YXRlLnBhcmVudDtcbn07XG5cbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjYWxsKHRhc2ssIGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkoc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlLmZhY2FkZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGwodGhlbiwgdmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdCh3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUikge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICBhQ2FsbGFibGUoZXhlY3V0b3IpO1xuICAgIGNhbGwoSW50ZXJuYWwsIHRoaXMpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICBQcm9taXNlUHJvdG90eXBlID0gUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIHR5cGU6IFBST01JU0UsXG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIG5vdGlmaWVkOiBmYWxzZSxcbiAgICAgIHBhcmVudDogZmFsc2UsXG4gICAgICByZWFjdGlvbnM6IG5ldyBRdWV1ZSgpLFxuICAgICAgcmVqZWN0aW9uOiBmYWxzZSxcbiAgICAgIHN0YXRlOiBQRU5ESU5HLFxuICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIGBQcm9taXNlLnByb3RvdHlwZS50aGVuYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuXG4gIEludGVybmFsLnByb3RvdHlwZSA9IGRlZmluZUJ1aWx0SW4oUHJvbWlzZVByb3RvdHlwZSwgJ3RoZW4nLCBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUodGhpcyk7XG4gICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvcikpO1xuICAgIHN0YXRlLnBhcmVudCA9IHRydWU7XG4gICAgcmVhY3Rpb24ub2sgPSBpc0NhbGxhYmxlKG9uRnVsZmlsbGVkKSA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICByZWFjdGlvbi5mYWlsID0gaXNDYWxsYWJsZShvblJlamVjdGVkKSAmJiBvblJlamVjdGVkO1xuICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdGUuc3RhdGUgPT0gUEVORElORykgc3RhdGUucmVhY3Rpb25zLmFkZChyZWFjdGlvbik7XG4gICAgZWxzZSBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbFJlYWN0aW9uKHJlYWN0aW9uLCBzdGF0ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gIH0pO1xuXG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUocHJvbWlzZSk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpO1xuICAgIHRoaXMucmVqZWN0ID0gYmluZChpbnRlcm5hbFJlamVjdCwgc3RhdGUpO1xuICB9O1xuXG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09IFByb21pc2VDb25zdHJ1Y3RvciB8fCBDID09PSBQcm9taXNlV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xuXG4gIGlmICghSVNfUFVSRSAmJiBpc0NhbGxhYmxlKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvcikgJiYgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIG5hdGl2ZVRoZW4gPSBOYXRpdmVQcm9taXNlUHJvdG90eXBlLnRoZW47XG5cbiAgICBpZiAoIU5BVElWRV9QUk9NSVNFX1NVQkNMQVNTSU5HKSB7XG4gICAgICAvLyBtYWtlIGBQcm9taXNlI3RoZW5gIHJldHVybiBhIHBvbHlmaWxsZWQgYFByb21pc2VgIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgICBkZWZpbmVCdWlsdEluKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBjYWxsKG5hdGl2ZVRoZW4sIHRoYXQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY0MFxuICAgICAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBgLmNvbnN0cnVjdG9yID09PSBQcm9taXNlYCB3b3JrIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgdHJ5IHtcbiAgICAgIGRlbGV0ZSBOYXRpdmVQcm9taXNlUHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxuICAgIC8vIG1ha2UgYGluc3RhbmNlb2YgUHJvbWlzZWAgd29yayBmb3IgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJc1xuICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgc2V0UHJvdG90eXBlT2YoTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgUHJvbWlzZVByb3RvdHlwZSk7XG4gICAgfVxuICB9XG59XG5cbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SIH0sIHtcbiAgUHJvbWlzZTogUHJvbWlzZUNvbnN0cnVjdG9yXG59KTtcblxuc2V0VG9TdHJpbmdUYWcoUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFLCBmYWxzZSwgdHJ1ZSk7XG5zZXRTcGVjaWVzKFBST01JU0UpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHkuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3Rvci5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgcHJvbWlzZVJlc29sdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xuXG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4vLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjlcbnZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tdGhlbmFibGUgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnZmluYWxseSddLmNhbGwoeyB0aGVuOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogTk9OX0dFTkVSSUMgfSwge1xuICAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBnZXRCdWlsdEluKCdQcm9taXNlJykpO1xuICAgIHZhciBpc0Z1bmN0aW9uID0gaXNDYWxsYWJsZShvbkZpbmFsbHkpO1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseSxcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHlcbiAgICApO1xuICB9XG59KTtcblxuLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjZmluYWxseWAgcHJvcGVybHkgd29ya3Mgd2l0aCBwYXRjaGVkIGBQcm9taXNlI3RoZW5gXG5pZiAoIUlTX1BVUkUgJiYgaXNDYWxsYWJsZShOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IpKSB7XG4gIHZhciBtZXRob2QgPSBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J107XG4gIGlmIChOYXRpdmVQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10gIT09IG1ldGhvZCkge1xuICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ2ZpbmFsbHknLCBtZXRob2QsIHsgdW5zYWZlOiB0cnVlIH0pO1xuICB9XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3Mgc3BsaXQgdG8gbW9kdWxlcyBsaXN0ZWQgYmVsb3dcbl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucHJvbWlzZS5jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNvbnN0cnVjdG9yLmpzXCIpO1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC5qc1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucHJvbWlzZS5jYXRjaCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNhdGNoLmpzXCIpO1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5wcm9taXNlLnJhY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yYWNlLmpzXCIpO1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5wcm9taXNlLnJlamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLnJlamVjdC5qc1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucHJvbWlzZS5yZXNvbHZlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UucmVzb2x2ZS5qc1wiKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yYWNlLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzXCIpO1xudmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanNcIik7XG52YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qc1wiKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uLmpzXCIpO1xuXG4vLyBgUHJvbWlzZS5yYWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yYWNlXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgY2FsbCgkcHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UucmFjZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yZWplY3QuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qc1wiKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKS5DT05TVFJVQ1RPUik7XG5cbi8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfSwge1xuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKHRoaXMpO1xuICAgIGNhbGwoY2FwYWJpbGl0eS5yZWplY3QsIHVuZGVmaW5lZCwgcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UucmVqZWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLnJlc29sdmUuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3Rvci5qc1wiKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKS5DT05TVFJVQ1RPUik7XG52YXIgcHJvbWlzZVJlc29sdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzXCIpO1xuXG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yV3JhcHBlciA9IGdldEJ1aWx0SW4oJ1Byb21pc2UnKTtcbnZhciBDSEVDS19XUkFQUEVSID0gSVNfUFVSRSAmJiAhRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1I7XG5cbi8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlc29sdmVcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SIH0sIHtcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKENIRUNLX1dSQVBQRVIgJiYgdGhpcyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yV3JhcHBlciA/IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA6IHRoaXMsIHgpO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yZXNvbHZlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LnRvLXN0cmluZy10YWcuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xuXG4kKHsgZ2xvYmFsOiB0cnVlIH0sIHsgUmVmbGVjdDoge30gfSk7XG5cbi8vIFJlZmxlY3RbQEB0b1N0cmluZ1RhZ10gcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVmbGVjdC1AQHRvc3RyaW5ndGFnXG5zZXRUb1N0cmluZ1RhZyhnbG9iYWwuUmVmbGVjdCwgJ1JlZmxlY3QnLCB0cnVlKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC50by1zdHJpbmctdGFnLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1mb3JjZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanNcIik7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzXCIpLmYpO1xudmFyIGlzUHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgaXNSZWdFeHAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcmVnZXhwICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBnZXRSZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWdldC1mbGFncy5qc1wiKTtcbnZhciBzdGlja3lIZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycy5qc1wiKTtcbnZhciBwcm94eUFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb3h5LWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJveHktYWNjZXNzb3IuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIikuZW5mb3JjZSk7XG52YXIgc2V0U3BlY2llcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtc3BlY2llcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIFVOU1VQUE9SVEVEX0RPVF9BTEwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLXVuc3VwcG9ydGVkLWRvdC1hbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtZG90LWFsbC5qc1wiKTtcbnZhciBVTlNVUFBPUlRFRF9OQ0cgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLXVuc3VwcG9ydGVkLW5jZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1uY2cuanNcIik7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcbnZhciBOYXRpdmVSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIFJlZ0V4cFByb3RvdHlwZSA9IE5hdGl2ZVJlZ0V4cC5wcm90b3R5cGU7XG52YXIgU3ludGF4RXJyb3IgPSBnbG9iYWwuU3ludGF4RXJyb3I7XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKFJlZ0V4cFByb3RvdHlwZS5leGVjKTtcbnZhciBjaGFyQXQgPSB1bmN1cnJ5VGhpcygnJy5jaGFyQXQpO1xudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBzdHJpbmdJbmRleE9mID0gdW5jdXJyeVRoaXMoJycuaW5kZXhPZik7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG4vLyBUT0RPOiBVc2Ugb25seSBwcm9wZXIgUmVnRXhwSWRlbnRpZmllck5hbWVcbnZhciBJU19OQ0cgPSAvXlxcPzxbXlxcc1xcZCEjJSYqKzw9PkBeXVteXFxzISMlJiorPD0+QF5dKj4vO1xudmFyIHJlMSA9IC9hL2c7XG52YXIgcmUyID0gL2EvZztcblxuLy8gXCJuZXdcIiBzaG91bGQgY3JlYXRlIGEgbmV3IG9iamVjdCwgb2xkIHdlYmtpdCBidWdcbnZhciBDT1JSRUNUX05FVyA9IG5ldyBOYXRpdmVSZWdFeHAocmUxKSAhPT0gcmUxO1xuXG52YXIgTUlTU0VEX1NUSUNLWSA9IHN0aWNreUhlbHBlcnMuTUlTU0VEX1NUSUNLWTtcbnZhciBVTlNVUFBPUlRFRF9ZID0gc3RpY2t5SGVscGVycy5VTlNVUFBPUlRFRF9ZO1xuXG52YXIgQkFTRV9GT1JDRUQgPSBERVNDUklQVE9SUyAmJlxuICAoIUNPUlJFQ1RfTkVXIHx8IE1JU1NFRF9TVElDS1kgfHwgVU5TVVBQT1JURURfRE9UX0FMTCB8fCBVTlNVUFBPUlRFRF9OQ0cgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJlMltNQVRDSF0gPSBmYWxzZTtcbiAgICAvLyBSZWdFeHAgY29uc3RydWN0b3IgY2FuIGFsdGVyIGZsYWdzIGFuZCBJc1JlZ0V4cCB3b3JrcyBjb3JyZWN0IHdpdGggQEBtYXRjaFxuICAgIHJldHVybiBOYXRpdmVSZWdFeHAocmUxKSAhPSByZTEgfHwgTmF0aXZlUmVnRXhwKHJlMikgPT0gcmUyIHx8IE5hdGl2ZVJlZ0V4cChyZTEsICdpJykgIT0gJy9hL2knO1xuICB9KSk7XG5cbnZhciBoYW5kbGVEb3RBbGwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBicmFja2V0cyA9IGZhbHNlO1xuICB2YXIgY2hyO1xuICBmb3IgKDsgaW5kZXggPD0gbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY2hyID0gY2hhckF0KHN0cmluZywgaW5kZXgpO1xuICAgIGlmIChjaHIgPT09ICdcXFxcJykge1xuICAgICAgcmVzdWx0ICs9IGNociArIGNoYXJBdChzdHJpbmcsICsraW5kZXgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghYnJhY2tldHMgJiYgY2hyID09PSAnLicpIHtcbiAgICAgIHJlc3VsdCArPSAnW1xcXFxzXFxcXFNdJztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNociA9PT0gJ1snKSB7XG4gICAgICAgIGJyYWNrZXRzID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoY2hyID09PSAnXScpIHtcbiAgICAgICAgYnJhY2tldHMgPSBmYWxzZTtcbiAgICAgIH0gcmVzdWx0ICs9IGNocjtcbiAgICB9XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBoYW5kbGVOQ0cgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBuYW1lZCA9IFtdO1xuICB2YXIgbmFtZXMgPSB7fTtcbiAgdmFyIGJyYWNrZXRzID0gZmFsc2U7XG4gIHZhciBuY2cgPSBmYWxzZTtcbiAgdmFyIGdyb3VwaWQgPSAwO1xuICB2YXIgZ3JvdXBuYW1lID0gJyc7XG4gIHZhciBjaHI7XG4gIGZvciAoOyBpbmRleCA8PSBsZW5ndGg7IGluZGV4KyspIHtcbiAgICBjaHIgPSBjaGFyQXQoc3RyaW5nLCBpbmRleCk7XG4gICAgaWYgKGNociA9PT0gJ1xcXFwnKSB7XG4gICAgICBjaHIgPSBjaHIgKyBjaGFyQXQoc3RyaW5nLCArK2luZGV4KTtcbiAgICB9IGVsc2UgaWYgKGNociA9PT0gJ10nKSB7XG4gICAgICBicmFja2V0cyA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIWJyYWNrZXRzKSBzd2l0Y2ggKHRydWUpIHtcbiAgICAgIGNhc2UgY2hyID09PSAnWyc6XG4gICAgICAgIGJyYWNrZXRzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGNociA9PT0gJygnOlxuICAgICAgICBpZiAoZXhlYyhJU19OQ0csIHN0cmluZ1NsaWNlKHN0cmluZywgaW5kZXggKyAxKSkpIHtcbiAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgIG5jZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ICs9IGNocjtcbiAgICAgICAgZ3JvdXBpZCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIGNhc2UgY2hyID09PSAnPicgJiYgbmNnOlxuICAgICAgICBpZiAoZ3JvdXBuYW1lID09PSAnJyB8fCBoYXNPd24obmFtZXMsIGdyb3VwbmFtZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0ludmFsaWQgY2FwdHVyZSBncm91cCBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgbmFtZXNbZ3JvdXBuYW1lXSA9IHRydWU7XG4gICAgICAgIG5hbWVkW25hbWVkLmxlbmd0aF0gPSBbZ3JvdXBuYW1lLCBncm91cGlkXTtcbiAgICAgICAgbmNnID0gZmFsc2U7XG4gICAgICAgIGdyb3VwbmFtZSA9ICcnO1xuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKG5jZykgZ3JvdXBuYW1lICs9IGNocjtcbiAgICBlbHNlIHJlc3VsdCArPSBjaHI7XG4gIH0gcmV0dXJuIFtyZXN1bHQsIG5hbWVkXTtcbn07XG5cbi8vIGBSZWdFeHBgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZ2V4cC1jb25zdHJ1Y3RvclxuaWYgKGlzRm9yY2VkKCdSZWdFeHAnLCBCQVNFX0ZPUkNFRCkpIHtcbiAgdmFyIFJlZ0V4cFdyYXBwZXIgPSBmdW5jdGlvbiBSZWdFeHAocGF0dGVybiwgZmxhZ3MpIHtcbiAgICB2YXIgdGhpc0lzUmVnRXhwID0gaXNQcm90b3R5cGVPZihSZWdFeHBQcm90b3R5cGUsIHRoaXMpO1xuICAgIHZhciBwYXR0ZXJuSXNSZWdFeHAgPSBpc1JlZ0V4cChwYXR0ZXJuKTtcbiAgICB2YXIgZmxhZ3NBcmVVbmRlZmluZWQgPSBmbGFncyA9PT0gdW5kZWZpbmVkO1xuICAgIHZhciBncm91cHMgPSBbXTtcbiAgICB2YXIgcmF3UGF0dGVybiA9IHBhdHRlcm47XG4gICAgdmFyIHJhd0ZsYWdzLCBkb3RBbGwsIHN0aWNreSwgaGFuZGxlZCwgcmVzdWx0LCBzdGF0ZTtcblxuICAgIGlmICghdGhpc0lzUmVnRXhwICYmIHBhdHRlcm5Jc1JlZ0V4cCAmJiBmbGFnc0FyZVVuZGVmaW5lZCAmJiBwYXR0ZXJuLmNvbnN0cnVjdG9yID09PSBSZWdFeHBXcmFwcGVyKSB7XG4gICAgICByZXR1cm4gcGF0dGVybjtcbiAgICB9XG5cbiAgICBpZiAocGF0dGVybklzUmVnRXhwIHx8IGlzUHJvdG90eXBlT2YoUmVnRXhwUHJvdG90eXBlLCBwYXR0ZXJuKSkge1xuICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc291cmNlO1xuICAgICAgaWYgKGZsYWdzQXJlVW5kZWZpbmVkKSBmbGFncyA9IGdldFJlZ0V4cEZsYWdzKHJhd1BhdHRlcm4pO1xuICAgIH1cblxuICAgIHBhdHRlcm4gPSBwYXR0ZXJuID09PSB1bmRlZmluZWQgPyAnJyA6IHRvU3RyaW5nKHBhdHRlcm4pO1xuICAgIGZsYWdzID0gZmxhZ3MgPT09IHVuZGVmaW5lZCA/ICcnIDogdG9TdHJpbmcoZmxhZ3MpO1xuICAgIHJhd1BhdHRlcm4gPSBwYXR0ZXJuO1xuXG4gICAgaWYgKFVOU1VQUE9SVEVEX0RPVF9BTEwgJiYgJ2RvdEFsbCcgaW4gcmUxKSB7XG4gICAgICBkb3RBbGwgPSAhIWZsYWdzICYmIHN0cmluZ0luZGV4T2YoZmxhZ3MsICdzJykgPiAtMTtcbiAgICAgIGlmIChkb3RBbGwpIGZsYWdzID0gcmVwbGFjZShmbGFncywgL3MvZywgJycpO1xuICAgIH1cblxuICAgIHJhd0ZsYWdzID0gZmxhZ3M7XG5cbiAgICBpZiAoTUlTU0VEX1NUSUNLWSAmJiAnc3RpY2t5JyBpbiByZTEpIHtcbiAgICAgIHN0aWNreSA9ICEhZmxhZ3MgJiYgc3RyaW5nSW5kZXhPZihmbGFncywgJ3knKSA+IC0xO1xuICAgICAgaWYgKHN0aWNreSAmJiBVTlNVUFBPUlRFRF9ZKSBmbGFncyA9IHJlcGxhY2UoZmxhZ3MsIC95L2csICcnKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TVVBQT1JURURfTkNHKSB7XG4gICAgICBoYW5kbGVkID0gaGFuZGxlTkNHKHBhdHRlcm4pO1xuICAgICAgcGF0dGVybiA9IGhhbmRsZWRbMF07XG4gICAgICBncm91cHMgPSBoYW5kbGVkWzFdO1xuICAgIH1cblxuICAgIHJlc3VsdCA9IGluaGVyaXRJZlJlcXVpcmVkKE5hdGl2ZVJlZ0V4cChwYXR0ZXJuLCBmbGFncyksIHRoaXNJc1JlZ0V4cCA/IHRoaXMgOiBSZWdFeHBQcm90b3R5cGUsIFJlZ0V4cFdyYXBwZXIpO1xuXG4gICAgaWYgKGRvdEFsbCB8fCBzdGlja3kgfHwgZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZShyZXN1bHQpO1xuICAgICAgaWYgKGRvdEFsbCkge1xuICAgICAgICBzdGF0ZS5kb3RBbGwgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5yYXcgPSBSZWdFeHBXcmFwcGVyKGhhbmRsZURvdEFsbChwYXR0ZXJuKSwgcmF3RmxhZ3MpO1xuICAgICAgfVxuICAgICAgaWYgKHN0aWNreSkgc3RhdGUuc3RpY2t5ID0gdHJ1ZTtcbiAgICAgIGlmIChncm91cHMubGVuZ3RoKSBzdGF0ZS5ncm91cHMgPSBncm91cHM7XG4gICAgfVxuXG4gICAgaWYgKHBhdHRlcm4gIT09IHJhd1BhdHRlcm4pIHRyeSB7XG4gICAgICAvLyBmYWlscyBpbiBvbGQgZW5naW5lcywgYnV0IHdlIGhhdmUgbm8gYWx0ZXJuYXRpdmVzIGZvciB1bnN1cHBvcnRlZCByZWdleCBzeW50YXhcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShyZXN1bHQsICdzb3VyY2UnLCByYXdQYXR0ZXJuID09PSAnJyA/ICcoPzopJyA6IHJhd1BhdHRlcm4pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgZm9yICh2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoTmF0aXZlUmVnRXhwKSwgaW5kZXggPSAwOyBrZXlzLmxlbmd0aCA+IGluZGV4Oykge1xuICAgIHByb3h5QWNjZXNzb3IoUmVnRXhwV3JhcHBlciwgTmF0aXZlUmVnRXhwLCBrZXlzW2luZGV4KytdKTtcbiAgfVxuXG4gIFJlZ0V4cFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlZ0V4cFdyYXBwZXI7XG4gIFJlZ0V4cFdyYXBwZXIucHJvdG90eXBlID0gUmVnRXhwUHJvdG90eXBlO1xuICBkZWZpbmVCdWlsdEluKGdsb2JhbCwgJ1JlZ0V4cCcsIFJlZ0V4cFdyYXBwZXIsIHsgY29uc3RydWN0b3I6IHRydWUgfSk7XG59XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC1AQHNwZWNpZXNcbnNldFNwZWNpZXMoJ1JlZ0V4cCcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgVU5TVVBQT1JURURfRE9UX0FMTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtZG90LWFsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1kb3QtYWxsLmpzXCIpO1xudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzXCIpO1xudmFyIGdldEludGVybmFsU3RhdGUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIikuZ2V0KTtcblxudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYFJlZ0V4cC5wcm90b3R5cGUuZG90QWxsYCBnZXR0ZXJcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC5wcm90b3R5cGUuZG90YWxsXG5pZiAoREVTQ1JJUFRPUlMgJiYgVU5TVVBQT1JURURfRE9UX0FMTCkge1xuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoUmVnRXhwUHJvdG90eXBlLCAnZG90QWxsJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGRvdEFsbCgpIHtcbiAgICAgIGlmICh0aGlzID09PSBSZWdFeHBQcm90b3R5cGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAvLyBXZSBjYW4ndCB1c2UgSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IgYmVjYXVzZVxuICAgICAgLy8gd2UgZG9uJ3QgYWRkIG1ldGFkYXRhIGZvciByZWdleHBzIGNyZWF0ZWQgYnkgYSBsaXRlcmFsLlxuICAgICAgaWYgKGNsYXNzb2YodGhpcykgPT09ICdSZWdFeHAnKSB7XG4gICAgICAgIHJldHVybiAhIWdldEludGVybmFsU3RhdGUodGhpcykuZG90QWxsO1xuICAgICAgfVxuICAgICAgdGhyb3cgJFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCBSZWdFeHAgcmVxdWlyZWQnKTtcbiAgICB9XG4gIH0pO1xufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZG90LWFsbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZXhlYyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLmpzXCIpO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS5leGVjYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS5leGVjXG4kKHsgdGFyZ2V0OiAnUmVnRXhwJywgcHJvdG86IHRydWUsIGZvcmNlZDogLy4vLmV4ZWMgIT09IGV4ZWMgfSwge1xuICBleGVjOiBleGVjXG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciByZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZmxhZ3MgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxuLy8gYmFiZWwtbWluaWZ5IGFuZCBDbG9zdXJlIENvbXBpbGVyIHRyYW5zcGlsZXMgUmVnRXhwKCcuJywgJ2QnKSAtPiAvLi9kIGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciBSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG5cbnZhciBGT1JDRUQgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBJTkRJQ0VTX1NVUFBPUlQgPSB0cnVlO1xuICB0cnkge1xuICAgIFJlZ0V4cCgnLicsICdkJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgSU5ESUNFU19TVVBQT1JUID0gZmFsc2U7XG4gIH1cblxuICB2YXIgTyA9IHt9O1xuICAvLyBtb2Rlcm4gVjggYnVnXG4gIHZhciBjYWxscyA9ICcnO1xuICB2YXIgZXhwZWN0ZWQgPSBJTkRJQ0VTX1NVUFBPUlQgPyAnZGdpbXN5JyA6ICdnaW1zeSc7XG5cbiAgdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChrZXksIGNocikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxscyArPSBjaHI7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IH0pO1xuICB9O1xuXG4gIHZhciBwYWlycyA9IHtcbiAgICBkb3RBbGw6ICdzJyxcbiAgICBnbG9iYWw6ICdnJyxcbiAgICBpZ25vcmVDYXNlOiAnaScsXG4gICAgbXVsdGlsaW5lOiAnbScsXG4gICAgc3RpY2t5OiAneSdcbiAgfTtcblxuICBpZiAoSU5ESUNFU19TVVBQT1JUKSBwYWlycy5oYXNJbmRpY2VzID0gJ2QnO1xuXG4gIGZvciAodmFyIGtleSBpbiBwYWlycykgYWRkR2V0dGVyKGtleSwgcGFpcnNba2V5XSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihSZWdFeHBQcm90b3R5cGUsICdmbGFncycpLmdldC5jYWxsKE8pO1xuXG4gIHJldHVybiByZXN1bHQgIT09IGV4cGVjdGVkIHx8IGNhbGxzICE9PSBleHBlY3RlZDtcbn0pO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS5mbGFnc2AgZ2V0dGVyXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAucHJvdG90eXBlLmZsYWdzXG5pZiAoRk9SQ0VEKSBkZWZpbmVCdWlsdEluQWNjZXNzb3IoUmVnRXhwUHJvdG90eXBlLCAnZmxhZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiByZWdFeHBGbGFnc1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIG1vdmVkIHRvIGVudHJ5IHBvaW50c1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5yZWdleHAuZXhlYyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qc1wiKTtcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xuXG52YXIgREVMRUdBVEVTX1RPX0VYRUMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7XG4gIHZhciByZSA9IC9bYWNdLztcbiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBleGVjQ2FsbGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gLy4vLmV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbiAgcmV0dXJuIHJlLnRlc3QoJ2FiYycpID09PSB0cnVlICYmIGV4ZWNDYWxsZWQ7XG59KCk7XG5cbnZhciBuYXRpdmVUZXN0ID0gLy4vLnRlc3Q7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLnRlc3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLnRlc3RcbiQoeyB0YXJnZXQ6ICdSZWdFeHAnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhREVMRUdBVEVTX1RPX0VYRUMgfSwge1xuICB0ZXN0OiBmdW5jdGlvbiAoUykge1xuICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIHN0cmluZyA9IHRvU3RyaW5nKFMpO1xuICAgIHZhciBleGVjID0gUi5leGVjO1xuICAgIGlmICghaXNDYWxsYWJsZShleGVjKSkgcmV0dXJuIGNhbGwobmF0aXZlVGVzdCwgUiwgc3RyaW5nKTtcbiAgICB2YXIgcmVzdWx0ID0gY2FsbChleGVjLCBSLCBzdHJpbmcpO1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICBhbk9iamVjdChyZXN1bHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzXCIpLlBST1BFUik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xudmFyICR0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBnZXRSZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWdldC1mbGFncy5qc1wiKTtcblxudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTtcbnZhciBuYXRpdmVUb1N0cmluZyA9IFJlZ0V4cFByb3RvdHlwZVtUT19TVFJJTkddO1xuXG52YXIgTk9UX0dFTkVSSUMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IHJldHVybiBuYXRpdmVUb1N0cmluZy5jYWxsKHsgc291cmNlOiAnYScsIGZsYWdzOiAnYicgfSkgIT0gJy9hL2InOyB9KTtcbi8vIEZGNDQtIFJlZ0V4cCN0b1N0cmluZyBoYXMgYSB3cm9uZyBuYW1lXG52YXIgSU5DT1JSRUNUX05BTUUgPSBQUk9QRVJfRlVOQ1RJT05fTkFNRSAmJiBuYXRpdmVUb1N0cmluZy5uYW1lICE9IFRPX1NUUklORztcblxuLy8gYFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG5pZiAoTk9UX0dFTkVSSUMgfHwgSU5DT1JSRUNUX05BTUUpIHtcbiAgZGVmaW5lQnVpbHRJbihSZWdFeHAucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIHBhdHRlcm4gPSAkdG9TdHJpbmcoUi5zb3VyY2UpO1xuICAgIHZhciBmbGFncyA9ICR0b1N0cmluZyhnZXRSZWdFeHBGbGFncyhSKSk7XG4gICAgcmV0dXJuICcvJyArIHBhdHRlcm4gKyAnLycgKyBmbGFncztcbiAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hdC1hbHRlcm5hdGl2ZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1zdHJpbmctcHJvdG90eXBlLWF0IC0tIHNhZmVcbiAgcmV0dXJuICftoYLtvrcnLmF0KC0yKSAhPT0gJ1xcdUQ4NDInO1xufSk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5hdFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIGF0OiBmdW5jdGlvbiBhdChpbmRleCkge1xuICAgIHZhciBTID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgdmFyIGxlbiA9IFMubGVuZ3RoO1xuICAgIHZhciByZWxhdGl2ZUluZGV4ID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpbmRleCk7XG4gICAgdmFyIGsgPSByZWxhdGl2ZUluZGV4ID49IDAgPyByZWxhdGl2ZUluZGV4IDogbGVuICsgcmVsYXRpdmVJbmRleDtcbiAgICByZXR1cm4gKGsgPCAwIHx8IGsgPj0gbGVuKSA/IHVuZGVmaW5lZCA6IGNoYXJBdChTLCBrKTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hdC1hbHRlcm5hdGl2ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZS5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpLmYpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgbm90QVJlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9ub3QtYS1yZWdleHAgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3QtYS1yZWdleHAuanNcIik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qc1wiKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3RyaW5nLXByb3RvdHlwZS1lbmRzd2l0aCAtLSBzYWZlXG52YXIgbmF0aXZlRW5kc1dpdGggPSB1bmN1cnJ5VGhpcygnJy5lbmRzV2l0aCk7XG52YXIgc2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG52YXIgbWluID0gTWF0aC5taW47XG5cbnZhciBDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyA9IGNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdlbmRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnZW5kc1dpdGgnKTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGU7XG59KCk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5lbmRzd2l0aFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFNRE5fUE9MWUZJTExfQlVHICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyB9LCB7XG4gIGVuZHNXaXRoOiBmdW5jdGlvbiBlbmRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBlbmRQb3NpdGlvbiA9IEBsZW5ndGggKi8pIHtcbiAgICB2YXIgdGhhdCA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTtcbiAgICB2YXIgZW5kUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbGVuID0gdGhhdC5sZW5ndGg7XG4gICAgdmFyIGVuZCA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBtaW4odG9MZW5ndGgoZW5kUG9zaXRpb24pLCBsZW4pO1xuICAgIHZhciBzZWFyY2ggPSB0b1N0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVFbmRzV2l0aFxuICAgICAgPyBuYXRpdmVFbmRzV2l0aCh0aGF0LCBzZWFyY2gsIGVuZClcbiAgICAgIDogc2xpY2UodGhhdCwgZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBub3RBUmVnRXhwID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vdC1hLXJlZ2V4cC5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qc1wiKTtcblxudmFyIHN0cmluZ0luZGV4T2YgPSB1bmN1cnJ5VGhpcygnJy5pbmRleE9mKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIWNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdpbmNsdWRlcycpIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHJldHVybiAhIX5zdHJpbmdJbmRleE9mKFxuICAgICAgdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSksXG4gICAgICB0b1N0cmluZyhub3RBUmVnRXhwKHNlYXJjaFN0cmluZykpLFxuICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY2hhckF0ID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qc1wiKS5jaGFyQXQpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3ItZGVmaW5lICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItZGVmaW5lLmpzXCIpO1xudmFyIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXItcmVzdWx0LW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QuanNcIik7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG5kZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogU1RSSU5HX0lURVJBVE9SLFxuICAgIHN0cmluZzogdG9TdHJpbmcoaXRlcmF0ZWQpLFxuICAgIGluZGV4OiAwXG4gIH0pO1xuLy8gYCVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZztcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpO1xuICBzdGF0ZS5pbmRleCArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHBvaW50LCBmYWxzZSk7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciBmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qc1wiKTtcbnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzXCIpO1xudmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qc1wiKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleC5qc1wiKTtcbnZhciByZWdFeHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanNcIik7XG5cbi8vIEBAbWF0Y2ggbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdtYXRjaCcsIGZ1bmN0aW9uIChNQVRDSCwgbmF0aXZlTWF0Y2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLm1hdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubWF0Y2hcbiAgICBmdW5jdGlvbiBtYXRjaChyZWdleHApIHtcbiAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgIHZhciBtYXRjaGVyID0gaXNOdWxsT3JVbmRlZmluZWQocmVnZXhwKSA/IHVuZGVmaW5lZCA6IGdldE1ldGhvZChyZWdleHAsIE1BVENIKTtcbiAgICAgIHJldHVybiBtYXRjaGVyID8gY2FsbChtYXRjaGVyLCByZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW01BVENIXSh0b1N0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAbWF0Y2hcbiAgICBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICB2YXIgcnggPSBhbk9iamVjdCh0aGlzKTtcbiAgICAgIHZhciBTID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUobmF0aXZlTWF0Y2gsIHJ4LCBTKTtcblxuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICBpZiAoIXJ4Lmdsb2JhbCkgcmV0dXJuIHJlZ0V4cEV4ZWMocngsIFMpO1xuXG4gICAgICB2YXIgZnVsbFVuaWNvZGUgPSByeC51bmljb2RlO1xuICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBBID0gW107XG4gICAgICB2YXIgbiA9IDA7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgd2hpbGUgKChyZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKSkgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIG1hdGNoU3RyID0gdG9TdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgQVtuXSA9IG1hdGNoU3RyO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgICBuKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gbiA9PT0gMCA/IG51bGwgOiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLWFsbC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qc1wiKTtcbnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qc1wiKTtcbnZhciBnZXRSZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWdldC1mbGFncy5qc1wiKTtcbnZhciBnZXRTdWJzdGl0dXRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LXN1YnN0aXR1dGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zdWJzdGl0dXRpb24uanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcblxudmFyIFJFUExBQ0UgPSB3ZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xudmFyIGluZGV4T2YgPSB1bmN1cnJ5VGhpcygnJy5pbmRleE9mKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG5cbnZhciBzdHJpbmdJbmRleE9mID0gZnVuY3Rpb24gKHN0cmluZywgc2VhcmNoVmFsdWUsIGZyb21JbmRleCkge1xuICBpZiAoZnJvbUluZGV4ID4gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIC0xO1xuICBpZiAoc2VhcmNoVmFsdWUgPT09ICcnKSByZXR1cm4gZnJvbUluZGV4O1xuICByZXR1cm4gaW5kZXhPZihzdHJpbmcsIHNlYXJjaFZhbHVlLCBmcm9tSW5kZXgpO1xufTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwbGFjZWFsbFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHtcbiAgcmVwbGFjZUFsbDogZnVuY3Rpb24gcmVwbGFjZUFsbChzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgIHZhciBJU19SRUdfRVhQLCBmbGFncywgcmVwbGFjZXIsIHN0cmluZywgc2VhcmNoU3RyaW5nLCBmdW5jdGlvbmFsUmVwbGFjZSwgc2VhcmNoTGVuZ3RoLCBhZHZhbmNlQnksIHJlcGxhY2VtZW50O1xuICAgIHZhciBwb3NpdGlvbiA9IDA7XG4gICAgdmFyIGVuZE9mTGFzdE1hdGNoID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChzZWFyY2hWYWx1ZSkpIHtcbiAgICAgIElTX1JFR19FWFAgPSBpc1JlZ0V4cChzZWFyY2hWYWx1ZSk7XG4gICAgICBpZiAoSVNfUkVHX0VYUCkge1xuICAgICAgICBmbGFncyA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoZ2V0UmVnRXhwRmxhZ3Moc2VhcmNoVmFsdWUpKSk7XG4gICAgICAgIGlmICghfmluZGV4T2YoZmxhZ3MsICdnJykpIHRocm93ICRUeXBlRXJyb3IoJ2AucmVwbGFjZUFsbGAgZG9lcyBub3QgYWxsb3cgbm9uLWdsb2JhbCByZWdleGVzJyk7XG4gICAgICB9XG4gICAgICByZXBsYWNlciA9IGdldE1ldGhvZChzZWFyY2hWYWx1ZSwgUkVQTEFDRSk7XG4gICAgICBpZiAocmVwbGFjZXIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGwocmVwbGFjZXIsIHNlYXJjaFZhbHVlLCBPLCByZXBsYWNlVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChJU19QVVJFICYmIElTX1JFR19FWFApIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2UodG9TdHJpbmcoTyksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmcgPSB0b1N0cmluZyhPKTtcbiAgICBzZWFyY2hTdHJpbmcgPSB0b1N0cmluZyhzZWFyY2hWYWx1ZSk7XG4gICAgZnVuY3Rpb25hbFJlcGxhY2UgPSBpc0NhbGxhYmxlKHJlcGxhY2VWYWx1ZSk7XG4gICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gdG9TdHJpbmcocmVwbGFjZVZhbHVlKTtcbiAgICBzZWFyY2hMZW5ndGggPSBzZWFyY2hTdHJpbmcubGVuZ3RoO1xuICAgIGFkdmFuY2VCeSA9IG1heCgxLCBzZWFyY2hMZW5ndGgpO1xuICAgIHBvc2l0aW9uID0gc3RyaW5nSW5kZXhPZihzdHJpbmcsIHNlYXJjaFN0cmluZywgMCk7XG4gICAgd2hpbGUgKHBvc2l0aW9uICE9PSAtMSkge1xuICAgICAgcmVwbGFjZW1lbnQgPSBmdW5jdGlvbmFsUmVwbGFjZVxuICAgICAgICA/IHRvU3RyaW5nKHJlcGxhY2VWYWx1ZShzZWFyY2hTdHJpbmcsIHBvc2l0aW9uLCBzdHJpbmcpKVxuICAgICAgICA6IGdldFN1YnN0aXR1dGlvbihzZWFyY2hTdHJpbmcsIHN0cmluZywgcG9zaXRpb24sIFtdLCB1bmRlZmluZWQsIHJlcGxhY2VWYWx1ZSk7XG4gICAgICByZXN1bHQgKz0gc3RyaW5nU2xpY2Uoc3RyaW5nLCBlbmRPZkxhc3RNYXRjaCwgcG9zaXRpb24pICsgcmVwbGFjZW1lbnQ7XG4gICAgICBlbmRPZkxhc3RNYXRjaCA9IHBvc2l0aW9uICsgc2VhcmNoTGVuZ3RoO1xuICAgICAgcG9zaXRpb24gPSBzdHJpbmdJbmRleE9mKHN0cmluZywgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbiArIGFkdmFuY2VCeSk7XG4gICAgfVxuICAgIGlmIChlbmRPZkxhc3RNYXRjaCA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCArPSBzdHJpbmdTbGljZShzdHJpbmcsIGVuZE9mTGFzdE1hdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLWFsbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYXBwbHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1hcHBseS5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qc1wiKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanNcIik7XG52YXIgZ2V0TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzXCIpO1xudmFyIGdldFN1YnN0aXR1dGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtc3Vic3RpdHV0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LXN1YnN0aXR1dGlvbi5qc1wiKTtcbnZhciByZWdFeHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG5cbnZhciBSRVBMQUNFID0gd2VsbEtub3duU3ltYm9sKCdyZXBsYWNlJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgc3RyaW5nSW5kZXhPZiA9IHVuY3VycnlUaGlzKCcnLmluZGV4T2YpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG52YXIgbWF5YmVUb1N0cmluZyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/IGl0IDogU3RyaW5nKGl0KTtcbn07XG5cbi8vIElFIDw9IDExIHJlcGxhY2VzICQwIHdpdGggdGhlIHdob2xlIG1hdGNoLCBhcyBpZiBpdCB3YXMgJCZcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYwMjQ2NjYvZ2V0dGluZy1pZS10by1yZXBsYWNlLWEtcmVnZXgtd2l0aC10aGUtbGl0ZXJhbC1zdHJpbmctMFxudmFyIFJFUExBQ0VfS0VFUFNfJDAgPSAoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3ByZWZlci1lc2NhcGUtcmVwbGFjZW1lbnQtZG9sbGFyLWNoYXIgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuICdhJy5yZXBsYWNlKC8uLywgJyQwJykgPT09ICckMCc7XG59KSgpO1xuXG4vLyBTYWZhcmkgPD0gMTMuMC4zKD8pIHN1YnN0aXR1dGVzIG50aCBjYXB0dXJlIHdoZXJlIG4+bSB3aXRoIGFuIGVtcHR5IHN0cmluZ1xudmFyIFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFID0gKGZ1bmN0aW9uICgpIHtcbiAgaWYgKC8uL1tSRVBMQUNFXSkge1xuICAgIHJldHVybiAvLi9bUkVQTEFDRV0oJ2EnLCAnJDAnKSA9PT0gJyc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSkoKTtcblxudmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlID0gLy4vO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICByZXN1bHQuZ3JvdXBzID0geyBhOiAnNycgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXVzZWxlc3MtZG9sbGFyLXJlcGxhY2VtZW50cyAtLSBmYWxzZSBwb3NpdGl2ZVxuICByZXR1cm4gJycucmVwbGFjZShyZSwgJyQ8YT4nKSAhPT0gJzcnO1xufSk7XG5cbi8vIEBAcmVwbGFjZSBsb2dpY1xuZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMoJ3JlcGxhY2UnLCBmdW5jdGlvbiAoXywgbmF0aXZlUmVwbGFjZSwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHZhciBVTlNBRkVfU1VCU1RJVFVURSA9IFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFID8gJyQnIDogJyQwJztcblxuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlXG4gICAgZnVuY3Rpb24gcmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICB2YXIgcmVwbGFjZXIgPSBpc051bGxPclVuZGVmaW5lZChzZWFyY2hWYWx1ZSkgPyB1bmRlZmluZWQgOiBnZXRNZXRob2Qoc2VhcmNoVmFsdWUsIFJFUExBQ0UpO1xuICAgICAgcmV0dXJuIHJlcGxhY2VyXG4gICAgICAgID8gY2FsbChyZXBsYWNlciwgc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgICAgOiBjYWxsKG5hdGl2ZVJlcGxhY2UsIHRvU3RyaW5nKE8pLCBzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHJlcGxhY2VcbiAgICBmdW5jdGlvbiAoc3RyaW5nLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHRoaXMpO1xuICAgICAgdmFyIFMgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiByZXBsYWNlVmFsdWUgPT0gJ3N0cmluZycgJiZcbiAgICAgICAgc3RyaW5nSW5kZXhPZihyZXBsYWNlVmFsdWUsIFVOU0FGRV9TVUJTVElUVVRFKSA9PT0gLTEgJiZcbiAgICAgICAgc3RyaW5nSW5kZXhPZihyZXBsYWNlVmFsdWUsICckPCcpID09PSAtMVxuICAgICAgKSB7XG4gICAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUobmF0aXZlUmVwbGFjZSwgcngsIFMsIHJlcGxhY2VWYWx1ZSk7XG4gICAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZ1bmN0aW9uYWxSZXBsYWNlID0gaXNDYWxsYWJsZShyZXBsYWNlVmFsdWUpO1xuICAgICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gdG9TdHJpbmcocmVwbGFjZVZhbHVlKTtcblxuICAgICAgdmFyIGdsb2JhbCA9IHJ4Lmdsb2JhbDtcbiAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgdmFyIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTtcbiAgICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIGJyZWFrO1xuXG4gICAgICAgIHB1c2gocmVzdWx0cywgcmVzdWx0KTtcbiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrO1xuXG4gICAgICAgIHZhciBtYXRjaFN0ciA9IHRvU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgIGlmIChtYXRjaFN0ciA9PT0gJycpIHJ4Lmxhc3RJbmRleCA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCB0b0xlbmd0aChyeC5sYXN0SW5kZXgpLCBmdWxsVW5pY29kZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhY2N1bXVsYXRlZFJlc3VsdCA9ICcnO1xuICAgICAgdmFyIG5leHRTb3VyY2VQb3NpdGlvbiA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0c1tpXTtcblxuICAgICAgICB2YXIgbWF0Y2hlZCA9IHRvU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IG1heChtaW4odG9JbnRlZ2VyT3JJbmZpbml0eShyZXN1bHQuaW5kZXgpLCBTLmxlbmd0aCksIDApO1xuICAgICAgICB2YXIgY2FwdHVyZXMgPSBbXTtcbiAgICAgICAgLy8gTk9URTogVGhpcyBpcyBlcXVpdmFsZW50IHRvXG4gICAgICAgIC8vICAgY2FwdHVyZXMgPSByZXN1bHQuc2xpY2UoMSkubWFwKG1heWJlVG9TdHJpbmcpXG4gICAgICAgIC8vIGJ1dCBmb3Igc29tZSByZWFzb24gYG5hdGl2ZVNsaWNlLmNhbGwocmVzdWx0LCAxLCByZXN1bHQubGVuZ3RoKWAgKGNhbGxlZCBpblxuICAgICAgICAvLyB0aGUgc2xpY2UgcG9seWZpbGwgd2hlbiBzbGljaW5nIG5hdGl2ZSBhcnJheXMpIFwiZG9lc24ndCB3b3JrXCIgaW4gc2FmYXJpIDkgYW5kXG4gICAgICAgIC8vIGNhdXNlcyBhIGNyYXNoIChodHRwczovL3Bhc3RlYmluLmNvbS9OMjFRemVRQSkgd2hlbiB0cnlpbmcgdG8gZGVidWcgaXQuXG4gICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgcmVzdWx0Lmxlbmd0aDsgaisrKSBwdXNoKGNhcHR1cmVzLCBtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpO1xuICAgICAgICB2YXIgbmFtZWRDYXB0dXJlcyA9IHJlc3VsdC5ncm91cHM7XG4gICAgICAgIGlmIChmdW5jdGlvbmFsUmVwbGFjZSkge1xuICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBjb25jYXQoW21hdGNoZWRdLCBjYXB0dXJlcywgcG9zaXRpb24sIFMpO1xuICAgICAgICAgIGlmIChuYW1lZENhcHR1cmVzICE9PSB1bmRlZmluZWQpIHB1c2gocmVwbGFjZXJBcmdzLCBuYW1lZENhcHR1cmVzKTtcbiAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSB0b1N0cmluZyhhcHBseShyZXBsYWNlVmFsdWUsIHVuZGVmaW5lZCwgcmVwbGFjZXJBcmdzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVwbGFjZW1lbnQgPSBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgUywgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA+PSBuZXh0U291cmNlUG9zaXRpb24pIHtcbiAgICAgICAgICBhY2N1bXVsYXRlZFJlc3VsdCArPSBzdHJpbmdTbGljZShTLCBuZXh0U291cmNlUG9zaXRpb24sIHBvc2l0aW9uKSArIHJlcGxhY2VtZW50O1xuICAgICAgICAgIG5leHRTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRlZFJlc3VsdCArIHN0cmluZ1NsaWNlKFMsIG5leHRTb3VyY2VQb3NpdGlvbik7XG4gICAgfVxuICBdO1xufSwgIVJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTIHx8ICFSRVBMQUNFX0tFRVBTXyQwIHx8IFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzXCIpO1xudmFyIGlzUmVnRXhwID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXJlZ2V4cCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanNcIik7XG52YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBnZXRNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1ldGhvZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tZXRob2QuanNcIik7XG52YXIgYXJyYXlTbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUuanNcIik7XG52YXIgY2FsbFJlZ0V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdC5qc1wiKTtcbnZhciByZWdleHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanNcIik7XG52YXIgc3RpY2t5SGVscGVycyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtc3RpY2t5LWhlbHBlcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtc3RpY2t5LWhlbHBlcnMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxudmFyIFVOU1VQUE9SVEVEX1kgPSBzdGlja3lIZWxwZXJzLlVOU1VQUE9SVEVEX1k7XG52YXIgTUFYX1VJTlQzMiA9IDB4RkZGRkZGRkY7XG52YXIgbWluID0gTWF0aC5taW47XG52YXIgJHB1c2ggPSBbXS5wdXNoO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcygvLi8uZXhlYyk7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKCRwdXNoKTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxuLy8gQ2hyb21lIDUxIGhhcyBhIGJ1Z2d5IFwic3BsaXRcIiBpbXBsZW1lbnRhdGlvbiB3aGVuIFJlZ0V4cCNleGVjICE9PSBuYXRpdmVFeGVjXG4vLyBXZWV4IEpTIGhhcyBmcm96ZW4gYnVpbHQtaW4gcHJvdG90eXBlcywgc28gdXNlIHRyeSAvIGNhdGNoIHdyYXBwZXJcbnZhciBTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLWVtcHR5LWdyb3VwIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHZhciByZSA9IC8oPzopLztcbiAgdmFyIG9yaWdpbmFsRXhlYyA9IHJlLmV4ZWM7XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvcmlnaW5hbEV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTtcbiAgdmFyIHJlc3VsdCA9ICdhYicuc3BsaXQocmUpO1xuICByZXR1cm4gcmVzdWx0Lmxlbmd0aCAhPT0gMiB8fCByZXN1bHRbMF0gIT09ICdhJyB8fCByZXN1bHRbMV0gIT09ICdiJztcbn0pO1xuXG4vLyBAQHNwbGl0IGxvZ2ljXG5maXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYygnc3BsaXQnLCBmdW5jdGlvbiAoU1BMSVQsIG5hdGl2ZVNwbGl0LCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgdmFyIGludGVybmFsU3BsaXQ7XG4gIGlmIChcbiAgICAnYWJiYycuc3BsaXQoLyhiKSovKVsxXSA9PSAnYycgfHxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLWVtcHR5LWdyb3VwIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgJ3Rlc3QnLnNwbGl0KC8oPzopLywgLTEpLmxlbmd0aCAhPSA0IHx8XG4gICAgJ2FiJy5zcGxpdCgvKD86YWIpKi8pLmxlbmd0aCAhPSAyIHx8XG4gICAgJy4nLnNwbGl0KC8oLj8pKC4/KS8pLmxlbmd0aCAhPSA0IHx8XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1lbXB0eS1jYXB0dXJpbmctZ3JvdXAsIHJlZ2V4cC9uby1lbXB0eS1ncm91cCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAgICcuJy5zcGxpdCgvKCkoKS8pLmxlbmd0aCA+IDEgfHxcbiAgICAnJy5zcGxpdCgvLj8vKS5sZW5ndGhcbiAgKSB7XG4gICAgLy8gYmFzZWQgb24gZXM1LXNoaW0gaW1wbGVtZW50YXRpb24sIG5lZWQgdG8gcmV3b3JrIGl0XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgc3RyaW5nID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgICB2YXIgbGltID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9VSU5UMzIgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmIChsaW0gPT09IDApIHJldHVybiBbXTtcbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtzdHJpbmddO1xuICAgICAgLy8gSWYgYHNlcGFyYXRvcmAgaXMgbm90IGEgcmVnZXgsIHVzZSBuYXRpdmUgc3BsaXRcbiAgICAgIGlmICghaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgICAgICByZXR1cm4gY2FsbChuYXRpdmVTcGxpdCwgc3RyaW5nLCBzZXBhcmF0b3IsIGxpbSk7XG4gICAgICB9XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IGNhbGwocmVnZXhwRXhlYywgc2VwYXJhdG9yQ29weSwgc3RyaW5nKSkge1xuICAgICAgICBsYXN0SW5kZXggPSBzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleDtcbiAgICAgICAgaWYgKGxhc3RJbmRleCA+IGxhc3RMYXN0SW5kZXgpIHtcbiAgICAgICAgICBwdXNoKG91dHB1dCwgc3RyaW5nU2xpY2Uoc3RyaW5nLCBsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAgIGlmIChtYXRjaC5sZW5ndGggPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nLmxlbmd0aCkgYXBwbHkoJHB1c2gsIG91dHB1dCwgYXJyYXlTbGljZShtYXRjaCwgMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZiAob3V0cHV0Lmxlbmd0aCA+PSBsaW0pIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleCA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHkubGFzdEluZGV4Kys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFleGVjKHNlcGFyYXRvckNvcHksICcnKSkgcHVzaChvdXRwdXQsICcnKTtcbiAgICAgIH0gZWxzZSBwdXNoKG91dHB1dCwgc3RyaW5nU2xpY2Uoc3RyaW5nLCBsYXN0TGFzdEluZGV4KSk7XG4gICAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IGxpbSA/IGFycmF5U2xpY2Uob3V0cHV0LCAwLCBsaW0pIDogb3V0cHV0O1xuICAgIH07XG4gIC8vIENoYWtyYSwgVjhcbiAgfSBlbHNlIGlmICgnMCcuc3BsaXQodW5kZWZpbmVkLCAwKS5sZW5ndGgpIHtcbiAgICBpbnRlcm5hbFNwbGl0ID0gZnVuY3Rpb24gKHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHJldHVybiBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCA/IFtdIDogY2FsbChuYXRpdmVTcGxpdCwgdGhpcywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfTtcbiAgfSBlbHNlIGludGVybmFsU3BsaXQgPSBuYXRpdmVTcGxpdDtcblxuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNwbGl0YCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3BsaXRcbiAgICBmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICB2YXIgc3BsaXR0ZXIgPSBpc051bGxPclVuZGVmaW5lZChzZXBhcmF0b3IpID8gdW5kZWZpbmVkIDogZ2V0TWV0aG9kKHNlcGFyYXRvciwgU1BMSVQpO1xuICAgICAgcmV0dXJuIHNwbGl0dGVyXG4gICAgICAgID8gY2FsbChzcGxpdHRlciwgc2VwYXJhdG9yLCBPLCBsaW1pdClcbiAgICAgICAgOiBjYWxsKGludGVybmFsU3BsaXQsIHRvU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzcGxpdFxuICAgIC8vXG4gICAgLy8gTk9URTogVGhpcyBjYW5ub3QgYmUgcHJvcGVybHkgcG9seWZpbGxlZCBpbiBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydFxuICAgIC8vIHRoZSAneScgZmxhZy5cbiAgICBmdW5jdGlvbiAoc3RyaW5nLCBsaW1pdCkge1xuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QodGhpcyk7XG4gICAgICB2YXIgUyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKGludGVybmFsU3BsaXQsIHJ4LCBTLCBsaW1pdCwgaW50ZXJuYWxTcGxpdCAhPT0gbmF0aXZlU3BsaXQpO1xuXG4gICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG5cbiAgICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHJ4LCBSZWdFeHApO1xuXG4gICAgICB2YXIgdW5pY29kZU1hdGNoaW5nID0gcngudW5pY29kZTtcbiAgICAgIHZhciBmbGFncyA9IChyeC5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyeC5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4LnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKFVOU1VQUE9SVEVEX1kgPyAnZycgOiAneScpO1xuXG4gICAgICAvLyBeKD8gKyByeCArICkgaXMgbmVlZGVkLCBpbiBjb21iaW5hdGlvbiB3aXRoIHNvbWUgUyBzbGljaW5nLCB0b1xuICAgICAgLy8gc2ltdWxhdGUgdGhlICd5JyBmbGFnLlxuICAgICAgdmFyIHNwbGl0dGVyID0gbmV3IEMoVU5TVVBQT1JURURfWSA/ICdeKD86JyArIHJ4LnNvdXJjZSArICcpJyA6IHJ4LCBmbGFncyk7XG4gICAgICB2YXIgbGltID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9VSU5UMzIgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmIChsaW0gPT09IDApIHJldHVybiBbXTtcbiAgICAgIGlmIChTLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBTKSA9PT0gbnVsbCA/IFtTXSA6IFtdO1xuICAgICAgdmFyIHAgPSAwO1xuICAgICAgdmFyIHEgPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHdoaWxlIChxIDwgUy5sZW5ndGgpIHtcbiAgICAgICAgc3BsaXR0ZXIubGFzdEluZGV4ID0gVU5TVVBQT1JURURfWSA/IDAgOiBxO1xuICAgICAgICB2YXIgeiA9IGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBVTlNVUFBPUlRFRF9ZID8gc3RyaW5nU2xpY2UoUywgcSkgOiBTKTtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB6ID09PSBudWxsIHx8XG4gICAgICAgICAgKGUgPSBtaW4odG9MZW5ndGgoc3BsaXR0ZXIubGFzdEluZGV4ICsgKFVOU1VQUE9SVEVEX1kgPyBxIDogMCkpLCBTLmxlbmd0aCkpID09PSBwXG4gICAgICAgICkge1xuICAgICAgICAgIHEgPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgcSwgdW5pY29kZU1hdGNoaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwdXNoKEEsIHN0cmluZ1NsaWNlKFMsIHAsIHEpKTtcbiAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gei5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHB1c2goQSwgeltpXSk7XG4gICAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHEgPSBwID0gZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHVzaChBLCBzdHJpbmdTbGljZShTLCBwKSk7XG4gICAgICByZXR1cm4gQTtcbiAgICB9XG4gIF07XG59LCAhU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDLCBVTlNVUFBPUlRFRF9ZKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNwbGl0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGguanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UuanNcIik7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qc1wiKS5mKTtcbnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIG5vdEFSZWdFeHAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbm90LWEtcmVnZXhwICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzXCIpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzXCIpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXN0cmluZy1wcm90b3R5cGUtc3RhcnRzd2l0aCAtLSBzYWZlXG52YXIgbmF0aXZlU3RhcnRzV2l0aCA9IHVuY3VycnlUaGlzKCcnLnN0YXJ0c1dpdGgpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG52YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnc3RhcnRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnc3RhcnRzV2l0aCcpO1xuICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTtcbn0oKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3RhcnRzd2l0aFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFNRE5fUE9MWUZJTExfQlVHICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyB9LCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgdmFyIHRoYXQgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgICBub3RBUmVnRXhwKHNlYXJjaFN0cmluZyk7XG4gICAgdmFyIGluZGV4ID0gdG9MZW5ndGgobWluKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpO1xuICAgIHZhciBzZWFyY2ggPSB0b1N0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVTdGFydHNXaXRoXG4gICAgICA/IG5hdGl2ZVN0YXJ0c1dpdGgodGhhdCwgc2VhcmNoLCBpbmRleClcbiAgICAgIDogc3RyaW5nU2xpY2UodGhhdCwgaW5kZXgsIGluZGV4ICsgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbGluZSBmcm9tIGBjb3JlLWpzQDRgXG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy50cmltLXJpZ2h0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLXJpZ2h0LmpzXCIpO1xudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHRyaW1FbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZW5kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZW5kLmpzXCIpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS50cmltRW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3RyaW5nLXByb3RvdHlwZS10cmltc3RhcnQtdHJpbWVuZCAtLSBzYWZlXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIG5hbWU6ICd0cmltRW5kJywgZm9yY2VkOiAnJy50cmltRW5kICE9PSB0cmltRW5kIH0sIHtcbiAgdHJpbUVuZDogdHJpbUVuZFxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLWVuZC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tcmlnaHQuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgdHJpbUVuZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctdHJpbS1lbmQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS1lbmQuanNcIik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1SaWdodGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbWVuZFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXN0cmluZy1wcm90b3R5cGUtdHJpbWxlZnQtdHJpbXJpZ2h0IC0tIHNhZmVcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgbmFtZTogJ3RyaW1FbmQnLCBmb3JjZWQ6ICcnLnRyaW1SaWdodCAhPT0gdHJpbUVuZCB9LCB7XG4gIHRyaW1SaWdodDogdHJpbUVuZFxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLXJpZ2h0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciAkdHJpbSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qc1wiKS50cmltKTtcbnZhciBmb3JjZWRTdHJpbmdUcmltTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy10cmltLWZvcmNlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy10cmltLWZvcmNlZC5qc1wiKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUudHJpbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbVxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ1RyaW1NZXRob2QoJ3RyaW0nKSB9LCB7XG4gIHRyaW06IGZ1bmN0aW9uIHRyaW0oKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMpO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCIvLyBgU3ltYm9sLnByb3RvdHlwZS5kZXNjcmlwdGlvbmAgZ2V0dGVyXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUuZGVzY3JpcHRpb25cblxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzXCIpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzXCIpO1xuXG52YXIgTmF0aXZlU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBTeW1ib2xQcm90b3R5cGUgPSBOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLnByb3RvdHlwZTtcblxuaWYgKERFU0NSSVBUT1JTICYmIGlzQ2FsbGFibGUoTmF0aXZlU3ltYm9sKSAmJiAoISgnZGVzY3JpcHRpb24nIGluIFN5bWJvbFByb3RvdHlwZSkgfHxcbiAgLy8gU2FmYXJpIDEyIGJ1Z1xuICBOYXRpdmVTeW1ib2woKS5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkXG4pKSB7XG4gIHZhciBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUgPSB7fTtcbiAgLy8gd3JhcCBTeW1ib2wgY29uc3RydWN0b3IgZm9yIGNvcnJlY3Qgd29yayB3aXRoIHVuZGVmaW5lZCBkZXNjcmlwdGlvblxuICB2YXIgU3ltYm9sV3JhcHBlciA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICB2YXIgZGVzY3JpcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoIDwgMSB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRvU3RyaW5nKGFyZ3VtZW50c1swXSk7XG4gICAgdmFyIHJlc3VsdCA9IGlzUHJvdG90eXBlT2YoU3ltYm9sUHJvdG90eXBlLCB0aGlzKVxuICAgICAgPyBuZXcgTmF0aXZlU3ltYm9sKGRlc2NyaXB0aW9uKVxuICAgICAgLy8gaW4gRWRnZSAxMywgU3RyaW5nKFN5bWJvbCh1bmRlZmluZWQpKSA9PT0gJ1N5bWJvbCh1bmRlZmluZWQpJ1xuICAgICAgOiBkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkID8gTmF0aXZlU3ltYm9sKCkgOiBOYXRpdmVTeW1ib2woZGVzY3JpcHRpb24pO1xuICAgIGlmIChkZXNjcmlwdGlvbiA9PT0gJycpIEVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZVtyZXN1bHRdID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoU3ltYm9sV3JhcHBlciwgTmF0aXZlU3ltYm9sKTtcbiAgU3ltYm9sV3JhcHBlci5wcm90b3R5cGUgPSBTeW1ib2xQcm90b3R5cGU7XG4gIFN5bWJvbFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFN5bWJvbFdyYXBwZXI7XG5cbiAgdmFyIE5BVElWRV9TWU1CT0wgPSBTdHJpbmcoTmF0aXZlU3ltYm9sKCd0ZXN0JykpID09ICdTeW1ib2wodGVzdCknO1xuICB2YXIgdGhpc1N5bWJvbFZhbHVlID0gdW5jdXJyeVRoaXMoU3ltYm9sUHJvdG90eXBlLnZhbHVlT2YpO1xuICB2YXIgc3ltYm9sRGVzY3JpcHRpdmVTdHJpbmcgPSB1bmN1cnJ5VGhpcyhTeW1ib2xQcm90b3R5cGUudG9TdHJpbmcpO1xuICB2YXIgcmVnZXhwID0gL15TeW1ib2xcXCgoLiopXFwpW14pXSskLztcbiAgdmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbiAgdmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihTeW1ib2xQcm90b3R5cGUsICdkZXNjcmlwdGlvbicsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICAgIHZhciBzeW1ib2wgPSB0aGlzU3ltYm9sVmFsdWUodGhpcyk7XG4gICAgICBpZiAoaGFzT3duKEVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZSwgc3ltYm9sKSkgcmV0dXJuICcnO1xuICAgICAgdmFyIHN0cmluZyA9IHN5bWJvbERlc2NyaXB0aXZlU3RyaW5nKHN5bWJvbCk7XG4gICAgICB2YXIgZGVzYyA9IE5BVElWRV9TWU1CT0wgPyBzdHJpbmdTbGljZShzdHJpbmcsIDcsIC0xKSA6IHJlcGxhY2Uoc3RyaW5nLCByZWdleHAsICckMScpO1xuICAgICAgcmV0dXJuIGRlc2MgPT09ICcnID8gdW5kZWZpbmVkIDogZGVzYztcbiAgICB9XG4gIH0pO1xuXG4gICQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgIFN5bWJvbDogU3ltYm9sV3JhcHBlclxuICB9KTtcbn1cblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5hdC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuYXRcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2F0JywgZnVuY3Rpb24gYXQoaW5kZXgpIHtcbiAgdmFyIE8gPSBhVHlwZWRBcnJheSh0aGlzKTtcbiAgdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICB2YXIgcmVsYXRpdmVJbmRleCA9IHRvSW50ZWdlck9ySW5maW5pdHkoaW5kZXgpO1xuICB2YXIgayA9IHJlbGF0aXZlSW5kZXggPj0gMCA/IHJlbGF0aXZlSW5kZXggOiBsZW4gKyByZWxhdGl2ZUluZGV4O1xuICByZXR1cm4gKGsgPCAwIHx8IGsgPj0gbGVuKSA/IHVuZGVmaW5lZCA6IE9ba107XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuYXQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciAkZmlsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1maWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZmlsbC5qc1wiKTtcbnZhciB0b0JpZ0ludCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1iaWctaW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYmlnLWludC5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcbnZhciBzbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxuLy8gVjggfiBDaHJvbWUgPCA1OSwgU2FmYXJpIDwgMTQuMSwgRkYgPCA1NSwgRWRnZSA8PTE4XG52YXIgQ09OVkVSU0lPTl9CVUcgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBjb3VudCA9IDA7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby10eXBlZC1hcnJheXMgLS0gc2FmZVxuICBuZXcgSW50OEFycmF5KDIpLmZpbGwoeyB2YWx1ZU9mOiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb3VudCsrOyB9IH0pO1xuICByZXR1cm4gY291bnQgIT09IDE7XG59KTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuZmlsbFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmlsbCcsIGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCwgZW5kICovKSB7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICBhVHlwZWRBcnJheSh0aGlzKTtcbiAgdmFyIGFjdHVhbFZhbHVlID0gc2xpY2UoY2xhc3NvZih0aGlzKSwgMCwgMykgPT09ICdCaWcnID8gdG9CaWdJbnQodmFsdWUpIDogK3ZhbHVlO1xuICByZXR1cm4gY2FsbCgkZmlsbCwgdGhpcywgYWN0dWFsVmFsdWUsIGxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xufSwgQ09OVkVSU0lPTl9CVUcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maWxsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWxhc3QtaW5kZXguanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciAkZmluZExhc3RJbmRleCA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi1mcm9tLWxhc3QuanNcIikuZmluZExhc3RJbmRleCk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmluZExhc3RJbmRleGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuZmluZGxhc3RpbmRleFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmluZExhc3RJbmRleCcsIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgocHJlZGljYXRlIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJGZpbmRMYXN0SW5kZXgoYVR5cGVkQXJyYXkodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbmQtbGFzdC1pbmRleC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanNcIik7XG52YXIgJGZpbmRMYXN0ID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24tZnJvbS1sYXN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdC5qc1wiKS5maW5kTGFzdCk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmluZExhc3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmZpbmRsYXN0XG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdmaW5kTGFzdCcsIGZ1bmN0aW9uIGZpbmRMYXN0KHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgcmV0dXJuICRmaW5kTGFzdChhVHlwZWRBcnJheSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQzMi1hcnJheS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qc1wiKTtcblxuLy8gYEludDMyQXJyYXlgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0c1xuY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdJbnQzMicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50MzItYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDgtYXJyYXkuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IuanNcIik7XG5cbi8vIGBJbnQ4QXJyYXlgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0c1xuY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdJbnQ4JywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEludDhBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDgtYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNldC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIHRvT2Zmc2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9mZnNldCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9mZnNldC5qc1wiKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG5cbnZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7XG52YXIgSW50OEFycmF5ID0gZ2xvYmFsLkludDhBcnJheTtcbnZhciBJbnQ4QXJyYXlQcm90b3R5cGUgPSBJbnQ4QXJyYXkgJiYgSW50OEFycmF5LnByb3RvdHlwZTtcbnZhciAkc2V0ID0gSW50OEFycmF5UHJvdG90eXBlICYmIEludDhBcnJheVByb3RvdHlwZS5zZXQ7XG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG5cbnZhciBXT1JLU19XSVRIX09CSkVDVFNfQU5EX0dFTkVSSUNfT05fVFlQRURfQVJSQVlTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXR5cGVkLWFycmF5cyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICB2YXIgYXJyYXkgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMik7XG4gIGNhbGwoJHNldCwgYXJyYXksIHsgbGVuZ3RoOiAxLCAwOiAzIH0sIDEpO1xuICByZXR1cm4gYXJyYXlbMV0gIT09IDM7XG59KTtcblxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTEyOTQgYW5kIG90aGVyXG52YXIgVE9fT0JKRUNUX0JVRyA9IFdPUktTX1dJVEhfT0JKRUNUU19BTkRfR0VORVJJQ19PTl9UWVBFRF9BUlJBWVMgJiYgQXJyYXlCdWZmZXJWaWV3Q29yZS5OQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFycmF5ID0gbmV3IEludDhBcnJheSgyKTtcbiAgYXJyYXkuc2V0KDEpO1xuICBhcnJheS5zZXQoJzInLCAxKTtcbiAgcmV0dXJuIGFycmF5WzBdICE9PSAwIHx8IGFycmF5WzFdICE9PSAyO1xufSk7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnNldGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc2V0XG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdzZXQnLCBmdW5jdGlvbiBzZXQoYXJyYXlMaWtlIC8qICwgb2Zmc2V0ICovKSB7XG4gIGFUeXBlZEFycmF5KHRoaXMpO1xuICB2YXIgb2Zmc2V0ID0gdG9PZmZzZXQoYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDEpO1xuICB2YXIgc3JjID0gdG9JbmRleGVkT2JqZWN0KGFycmF5TGlrZSk7XG4gIGlmIChXT1JLU19XSVRIX09CSkVDVFNfQU5EX0dFTkVSSUNfT05fVFlQRURfQVJSQVlTKSByZXR1cm4gY2FsbCgkc2V0LCB0aGlzLCBzcmMsIG9mZnNldCk7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKHNyYyk7XG4gIHZhciBpbmRleCA9IDA7XG4gIGlmIChsZW4gKyBvZmZzZXQgPiBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCcpO1xuICB3aGlsZSAoaW5kZXggPCBsZW4pIHRoaXNbb2Zmc2V0ICsgaW5kZXhdID0gc3JjW2luZGV4KytdO1xufSwgIVdPUktTX1dJVEhfT0JKRUNUU19BTkRfR0VORVJJQ19PTl9UWVBFRF9BUlJBWVMgfHwgVE9fT0JKRUNUX0JVRyk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNldC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29ydC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIGludGVybmFsU29ydCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc29ydC5qc1wiKTtcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzXCIpO1xudmFyIEZGID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1mZi12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanNcIik7XG52YXIgSUVfT1JfRURHRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pZS1vci1lZGdlLmpzXCIpO1xudmFyIFY4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24uanNcIik7XG52YXIgV0VCS0lUID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbi5qc1wiKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyIFVpbnQxNkFycmF5ID0gZ2xvYmFsLlVpbnQxNkFycmF5O1xudmFyIG5hdGl2ZVNvcnQgPSBVaW50MTZBcnJheSAmJiB1bmN1cnJ5VGhpcyhVaW50MTZBcnJheS5wcm90b3R5cGUuc29ydCk7XG5cbi8vIFdlYktpdFxudmFyIEFDQ0VQVF9JTkNPUlJFQ1RfQVJHVU1FTlRTID0gISFuYXRpdmVTb3J0ICYmICEoZmFpbHMoZnVuY3Rpb24gKCkge1xuICBuYXRpdmVTb3J0KG5ldyBVaW50MTZBcnJheSgyKSwgbnVsbCk7XG59KSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIG5hdGl2ZVNvcnQobmV3IFVpbnQxNkFycmF5KDIpLCB7fSk7XG59KSk7XG5cbnZhciBTVEFCTEVfU09SVCA9ICEhbmF0aXZlU29ydCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBmZWF0dXJlIGRldGVjdGlvbiBjYW4gYmUgdG9vIHNsb3csIHNvIGNoZWNrIGVuZ2luZXMgdmVyc2lvbnNcbiAgaWYgKFY4KSByZXR1cm4gVjggPCA3NDtcbiAgaWYgKEZGKSByZXR1cm4gRkYgPCA2NztcbiAgaWYgKElFX09SX0VER0UpIHJldHVybiB0cnVlO1xuICBpZiAoV0VCS0lUKSByZXR1cm4gV0VCS0lUIDwgNjAyO1xuXG4gIHZhciBhcnJheSA9IG5ldyBVaW50MTZBcnJheSg1MTYpO1xuICB2YXIgZXhwZWN0ZWQgPSBBcnJheSg1MTYpO1xuICB2YXIgaW5kZXgsIG1vZDtcblxuICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA1MTY7IGluZGV4KyspIHtcbiAgICBtb2QgPSBpbmRleCAlIDQ7XG4gICAgYXJyYXlbaW5kZXhdID0gNTE1IC0gaW5kZXg7XG4gICAgZXhwZWN0ZWRbaW5kZXhdID0gaW5kZXggLSAyICogbW9kICsgMztcbiAgfVxuXG4gIG5hdGl2ZVNvcnQoYXJyYXksIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIChhIC8gNCB8IDApIC0gKGIgLyA0IHwgMCk7XG4gIH0pO1xuXG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDUxNjsgaW5kZXgrKykge1xuICAgIGlmIChhcnJheVtpbmRleF0gIT09IGV4cGVjdGVkW2luZGV4XSkgcmV0dXJuIHRydWU7XG4gIH1cbn0pO1xuXG52YXIgZ2V0U29ydENvbXBhcmUgPSBmdW5jdGlvbiAoY29tcGFyZWZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeCwgeSkge1xuICAgIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgcmV0dXJuICtjb21wYXJlZm4oeCwgeSkgfHwgMDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmICh5ICE9PSB5KSByZXR1cm4gLTE7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICBpZiAoeCAhPT0geCkgcmV0dXJuIDE7XG4gICAgaWYgKHggPT09IDAgJiYgeSA9PT0gMCkgcmV0dXJuIDEgLyB4ID4gMCAmJiAxIC8geSA8IDAgPyAxIDogLTE7XG4gICAgcmV0dXJuIHggPiB5O1xuICB9O1xufTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuc29ydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc29ydFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc29ydCcsIGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7XG4gIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgYUNhbGxhYmxlKGNvbXBhcmVmbik7XG4gIGlmIChTVEFCTEVfU09SVCkgcmV0dXJuIG5hdGl2ZVNvcnQodGhpcywgY29tcGFyZWZuKTtcblxuICByZXR1cm4gaW50ZXJuYWxTb3J0KGFUeXBlZEFycmF5KHRoaXMpLCBnZXRTb3J0Q29tcGFyZShjb21wYXJlZm4pKTtcbn0sICFTVEFCTEVfU09SVCB8fCBBQ0NFUFRfSU5DT1JSRUNUX0FSR1VNRU5UUyk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNvcnQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLWxvY2FsZS1zdHJpbmcuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBhcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzXCIpO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBhcnJheVNsaWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2UuanNcIik7XG5cbnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5O1xudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyICR0b0xvY2FsZVN0cmluZyA9IFtdLnRvTG9jYWxlU3RyaW5nO1xuXG4vLyBpT1MgU2FmYXJpIDYueCBmYWlscyBoZXJlXG52YXIgVE9fTE9DQUxFX1NUUklOR19CVUcgPSAhIUludDhBcnJheSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICR0b0xvY2FsZVN0cmluZy5jYWxsKG5ldyBJbnQ4QXJyYXkoMSkpO1xufSk7XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBbMSwgMl0udG9Mb2NhbGVTdHJpbmcoKSAhPSBuZXcgSW50OEFycmF5KFsxLCAyXSkudG9Mb2NhbGVTdHJpbmcoKTtcbn0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIEludDhBcnJheS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcuY2FsbChbMSwgMl0pO1xufSk7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b2xvY2FsZXN0cmluZ1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndG9Mb2NhbGVTdHJpbmcnLCBmdW5jdGlvbiB0b0xvY2FsZVN0cmluZygpIHtcbiAgcmV0dXJuIGFwcGx5KFxuICAgICR0b0xvY2FsZVN0cmluZyxcbiAgICBUT19MT0NBTEVfU1RSSU5HX0JVRyA/IGFycmF5U2xpY2UoYVR5cGVkQXJyYXkodGhpcykpIDogYVR5cGVkQXJyYXkodGhpcyksXG4gICAgYXJyYXlTbGljZShhcmd1bWVudHMpXG4gICk7XG59LCBGT1JDRUQpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1sb2NhbGUtc3RyaW5nLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1yZXZlcnNlZC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhcnJheVRvUmV2ZXJzZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktdG8tcmV2ZXJzZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS10by1yZXZlcnNlZC5qc1wiKTtcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzXCIpO1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG52YXIgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3I7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnRvUmV2ZXJzZWRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnRvcmV2ZXJzZWRcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3RvUmV2ZXJzZWQnLCBmdW5jdGlvbiB0b1JldmVyc2VkKCkge1xuICByZXR1cm4gYXJyYXlUb1JldmVyc2VkKGFUeXBlZEFycmF5KHRoaXMpLCBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IodGhpcykpO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLXJldmVyc2VkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zb3J0ZWQuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIGFycmF5RnJvbUNvbnN0cnVjdG9yQW5kTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1mcm9tLWNvbnN0cnVjdG9yLWFuZC1saXN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS1jb25zdHJ1Y3Rvci1hbmQtbGlzdC5qc1wiKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyIHNvcnQgPSB1bmN1cnJ5VGhpcyhBcnJheUJ1ZmZlclZpZXdDb3JlLlR5cGVkQXJyYXlQcm90b3R5cGUuc29ydCk7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnRvU29ydGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b3NvcnRlZFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndG9Tb3J0ZWQnLCBmdW5jdGlvbiB0b1NvcnRlZChjb21wYXJlRm4pIHtcbiAgaWYgKGNvbXBhcmVGbiAhPT0gdW5kZWZpbmVkKSBhQ2FsbGFibGUoY29tcGFyZUZuKTtcbiAgdmFyIE8gPSBhVHlwZWRBcnJheSh0aGlzKTtcbiAgdmFyIEEgPSBhcnJheUZyb21Db25zdHJ1Y3RvckFuZExpc3QoZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yKE8pLCBPKTtcbiAgcmV0dXJuIHNvcnQoQSwgY29tcGFyZUZuKTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zb3J0ZWQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQzMi1hcnJheS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qc1wiKTtcblxuLy8gYFVpbnQzMkFycmF5YCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10eXBlZGFycmF5LW9iamVjdHNcbmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignVWludDMyJywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDMyLWFycmF5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1hcnJheS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qc1wiKTtcblxuLy8gYFVpbnQ4QXJyYXlgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0c1xuY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdVaW50OCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQ4LWNsYW1wZWQtYXJyYXkuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IuanNcIik7XG5cbi8vIGBVaW50OENsYW1wZWRBcnJheWAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzXG5jcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ1VpbnQ4JywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59LCB0cnVlKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtY2xhbXBlZC1hcnJheS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkud2l0aC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhcnJheVdpdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktd2l0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXdpdGguanNcIik7XG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciBpc0JpZ0ludEFycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWJpZy1pbnQtYXJyYXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1iaWctaW50LWFycmF5LmpzXCIpO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanNcIik7XG52YXIgdG9CaWdJbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYmlnLWludCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWJpZy1pbnQuanNcIik7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3I7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxudmFyIFBST1BFUl9PUkRFUiA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsLCBlcy9uby10eXBlZC1hcnJheXMsIGVzL25vLWFycmF5LXByb3RvdHlwZS13aXRoIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgbmV3IEludDhBcnJheSgxKVsnd2l0aCddKDIsIHsgdmFsdWVPZjogZnVuY3Rpb24gKCkgeyB0aHJvdyA4OyB9IH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIHNvbWUgZWFybHkgaW1wbGVtZW50YXRpb25zLCBsaWtlIFdlYktpdCwgZG9lcyBub3QgZm9sbG93IHRoZSBmaW5hbCBzZW1hbnRpY1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNoYW5nZS1hcnJheS1ieS1jb3B5L3B1bGwvODZcbiAgICByZXR1cm4gZXJyb3IgPT09IDg7XG4gIH1cbn0oKTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUud2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUud2l0aFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnd2l0aCcsIHsgJ3dpdGgnOiBmdW5jdGlvbiAoaW5kZXgsIHZhbHVlKSB7XG4gIHZhciBPID0gYVR5cGVkQXJyYXkodGhpcyk7XG4gIHZhciByZWxhdGl2ZUluZGV4ID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpbmRleCk7XG4gIHZhciBhY3R1YWxWYWx1ZSA9IGlzQmlnSW50QXJyYXkoTykgPyB0b0JpZ0ludCh2YWx1ZSkgOiArdmFsdWU7XG4gIHJldHVybiBhcnJheVdpdGgoTywgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yKE8pLCByZWxhdGl2ZUluZGV4LCBhY3R1YWxWYWx1ZSk7XG59IH1bJ3dpdGgnXSwgIVBST1BFUl9PUkRFUik7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LndpdGguanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLndlYWstbWFwLmNvbnN0cnVjdG9yLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIEZSRUVaSU5HID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZyZWV6aW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanNcIik7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzXCIpO1xudmFyIGNvbGxlY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24uanNcIik7XG52YXIgY29sbGVjdGlvbldlYWsgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qc1wiKS5lbmZvcmNlKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIE5BVElWRV9XRUFLX01BUCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanNcIik7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWlzYXJyYXkgLS0gc2FmZVxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyIGlzRXh0ZW5zaWJsZSA9ICRPYmplY3QuaXNFeHRlbnNpYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2Zyb3plbiAtLSBzYWZlXG52YXIgaXNGcm96ZW4gPSAkT2JqZWN0LmlzRnJvemVuO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc3NlYWxlZCAtLSBzYWZlXG52YXIgaXNTZWFsZWQgPSAkT2JqZWN0LmlzU2VhbGVkO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1mcmVlemUgLS0gc2FmZVxudmFyIGZyZWV6ZSA9ICRPYmplY3QuZnJlZXplO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1zZWFsIC0tIHNhZmVcbnZhciBzZWFsID0gJE9iamVjdC5zZWFsO1xuXG52YXIgRlJPWkVOID0ge307XG52YXIgU0VBTEVEID0ge307XG52YXIgSVNfSUUxMSA9ICFnbG9iYWwuQWN0aXZlWE9iamVjdCAmJiAnQWN0aXZlWE9iamVjdCcgaW4gZ2xvYmFsO1xudmFyIEludGVybmFsV2Vha01hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgfTtcbn07XG5cbi8vIGBXZWFrTWFwYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLWNvbnN0cnVjdG9yXG52YXIgJFdlYWtNYXAgPSBjb2xsZWN0aW9uKCdXZWFrTWFwJywgd3JhcHBlciwgY29sbGVjdGlvbldlYWspO1xudmFyIFdlYWtNYXBQcm90b3R5cGUgPSAkV2Vha01hcC5wcm90b3R5cGU7XG52YXIgbmF0aXZlU2V0ID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZS5zZXQpO1xuXG4vLyBDaGFrcmEgRWRnZSBidWc6IGFkZGluZyBmcm96ZW4gYXJyYXlzIHRvIFdlYWtNYXAgdW5mcmVlemUgdGhlbVxudmFyIGhhc01TRWRnZUZyZWV6aW5nQnVnID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRlJFRVpJTkcgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBmcm96ZW5BcnJheSA9IGZyZWV6ZShbXSk7XG4gICAgbmF0aXZlU2V0KG5ldyAkV2Vha01hcCgpLCBmcm96ZW5BcnJheSwgMSk7XG4gICAgcmV0dXJuICFpc0Zyb3plbihmcm96ZW5BcnJheSk7XG4gIH0pO1xufTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuLy8gV2UgY2FuJ3QgdXNlIGZlYXR1cmUgZGV0ZWN0aW9uIGJlY2F1c2UgaXQgY3Jhc2ggc29tZSBvbGQgSUUgYnVpbGRzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDg1XG5pZiAoTkFUSVZFX1dFQUtfTUFQKSBpZiAoSVNfSUUxMSkge1xuICBJbnRlcm5hbFdlYWtNYXAgPSBjb2xsZWN0aW9uV2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCAnV2Vha01hcCcsIHRydWUpO1xuICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLmVuYWJsZSgpO1xuICB2YXIgbmF0aXZlRGVsZXRlID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZVsnZGVsZXRlJ10pO1xuICB2YXIgbmF0aXZlSGFzID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZS5oYXMpO1xuICB2YXIgbmF0aXZlR2V0ID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZS5nZXQpO1xuICBkZWZpbmVCdWlsdElucyhXZWFrTWFwUHJvdG90eXBlLCB7XG4gICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZURlbGV0ZSh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plblsnZGVsZXRlJ10oa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZURlbGV0ZSh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVIYXModGhpcywga2V5KSB8fCBzdGF0ZS5mcm96ZW4uaGFzKGtleSk7XG4gICAgICB9IHJldHVybiBuYXRpdmVIYXModGhpcywga2V5KTtcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlSGFzKHRoaXMsIGtleSkgPyBuYXRpdmVHZXQodGhpcywga2V5KSA6IHN0YXRlLmZyb3plbi5nZXQoa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZUdldCh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICBuYXRpdmVIYXModGhpcywga2V5KSA/IG5hdGl2ZVNldCh0aGlzLCBrZXksIHZhbHVlKSA6IHN0YXRlLmZyb3plbi5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgbmF0aXZlU2V0KHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9KTtcbi8vIENoYWtyYSBFZGdlIGZyb3plbiBrZXlzIGZpeFxufSBlbHNlIGlmIChoYXNNU0VkZ2VGcmVlemluZ0J1ZygpKSB7XG4gIGRlZmluZUJ1aWx0SW5zKFdlYWtNYXBQcm90b3R5cGUsIHtcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgYXJyYXlJbnRlZ3JpdHlMZXZlbDtcbiAgICAgIGlmIChpc0FycmF5KGtleSkpIHtcbiAgICAgICAgaWYgKGlzRnJvemVuKGtleSkpIGFycmF5SW50ZWdyaXR5TGV2ZWwgPSBGUk9aRU47XG4gICAgICAgIGVsc2UgaWYgKGlzU2VhbGVkKGtleSkpIGFycmF5SW50ZWdyaXR5TGV2ZWwgPSBTRUFMRUQ7XG4gICAgICB9XG4gICAgICBuYXRpdmVTZXQodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoYXJyYXlJbnRlZ3JpdHlMZXZlbCA9PSBGUk9aRU4pIGZyZWV6ZShrZXkpO1xuICAgICAgaWYgKGFycmF5SW50ZWdyaXR5TGV2ZWwgPT0gU0VBTEVEKSBzZWFsKGtleSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0pO1xufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1tYXAuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBtb2R1bGUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIHJlcGxhY2VkIHRvIG1vZHVsZSBiZWxvd1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy53ZWFrLW1hcC5jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5jb25zdHJ1Y3Rvci5qc1wiKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1tYXAuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBET01JdGVyYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanNcIik7XG52YXIgRE9NVG9rZW5MaXN0UHJvdG90eXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvbS10b2tlbi1saXN0LXByb3RvdHlwZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS10b2tlbi1saXN0LXByb3RvdHlwZS5qc1wiKTtcbnZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7XG5cbnZhciBoYW5kbGVQcm90b3R5cGUgPSBmdW5jdGlvbiAoQ29sbGVjdGlvblByb3RvdHlwZSwgQ09MTEVDVElPTl9OQU1FKSB7XG4gIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlKSB7XG4gICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdICE9PSBBcnJheVZhbHVlcykgdHJ5IHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSA9IEFycmF5VmFsdWVzO1xuICAgIH1cbiAgICBpZiAoIUNvbGxlY3Rpb25Qcm90b3R5cGVbVE9fU1RSSU5HX1RBR10pIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCBDT0xMRUNUSU9OX05BTUUpO1xuICAgIH1cbiAgICBpZiAoRE9NSXRlcmFibGVzW0NPTExFQ1RJT05fTkFNRV0pIGZvciAodmFyIE1FVEhPRF9OQU1FIGluIEFycmF5SXRlcmF0b3JNZXRob2RzKSB7XG4gICAgICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3RcbiAgICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSAhPT0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKSB0cnkge1xuICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgTUVUSE9EX05BTUUsIEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSA9IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgaGFuZGxlUHJvdG90eXBlKGdsb2JhbFtDT0xMRUNUSU9OX05BTUVdICYmIGdsb2JhbFtDT0xMRUNUSU9OX05BTUVdLnByb3RvdHlwZSwgQ09MTEVDVElPTl9OQU1FKTtcbn1cblxuaGFuZGxlUHJvdG90eXBlKERPTVRva2VuTGlzdFByb3RvdHlwZSwgJ0RPTVRva2VuTGlzdCcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5jb25zdHJ1Y3Rvci5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciB0cnlOb2RlUmVxdWlyZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90cnktbm9kZS1yZXF1aXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LW5vZGUtcmVxdWlyZS5qc1wiKTtcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qc1wiKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanNcIikuZik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBlcnJvclRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Vycm9yLXRvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXRvLXN0cmluZy5qc1wiKTtcbnZhciBub3JtYWxpemVTdHJpbmdBcmd1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm9ybWFsaXplLXN0cmluZy1hcmd1bWVudC5qc1wiKTtcbnZhciBET01FeGNlcHRpb25Db25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9tLWV4Y2VwdGlvbi1jb25zdGFudHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20tZXhjZXB0aW9uLWNvbnN0YW50cy5qc1wiKTtcbnZhciBjbGVhckVycm9yU3RhY2sgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2stY2xlYXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhci5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xuXG52YXIgRE9NX0VYQ0VQVElPTiA9ICdET01FeGNlcHRpb24nO1xudmFyIERBVEFfQ0xPTkVfRVJSID0gJ0RBVEFfQ0xPTkVfRVJSJztcbnZhciBFcnJvciA9IGdldEJ1aWx0SW4oJ0Vycm9yJyk7XG4vLyBOb2RlSlMgPCAxNy4wIGRvZXMgbm90IGV4cG9zZSBgRE9NRXhjZXB0aW9uYCB0byBnbG9iYWxcbnZhciBOYXRpdmVET01FeGNlcHRpb24gPSBnZXRCdWlsdEluKERPTV9FWENFUFRJT04pIHx8IChmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gTm9kZUpTIDwgMTUuMCBkb2VzIG5vdCBleHBvc2UgYE1lc3NhZ2VDaGFubmVsYCB0byBnbG9iYWxcbiAgICB2YXIgTWVzc2FnZUNoYW5uZWwgPSBnZXRCdWlsdEluKCdNZXNzYWdlQ2hhbm5lbCcpIHx8IHRyeU5vZGVSZXF1aXJlKCd3b3JrZXJfdGhyZWFkcycpLk1lc3NhZ2VDaGFubmVsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby13ZWFrLW1hcCwgdW5pY29ybi9yZXF1aXJlLXBvc3QtbWVzc2FnZS10YXJnZXQtb3JpZ2luIC0tIHNhZmVcbiAgICBuZXcgTWVzc2FnZUNoYW5uZWwoKS5wb3J0MS5wb3N0TWVzc2FnZShuZXcgV2Vha01hcCgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IubmFtZSA9PSBEQVRBX0NMT05FX0VSUiAmJiBlcnJvci5jb2RlID09IDI1KSByZXR1cm4gZXJyb3IuY29uc3RydWN0b3I7XG4gIH1cbn0pKCk7XG52YXIgTmF0aXZlRE9NRXhjZXB0aW9uUHJvdG90eXBlID0gTmF0aXZlRE9NRXhjZXB0aW9uICYmIE5hdGl2ZURPTUV4Y2VwdGlvbi5wcm90b3R5cGU7XG52YXIgRXJyb3JQcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihET01fRVhDRVBUSU9OKTtcbnZhciBIQVNfU1RBQ0sgPSAnc3RhY2snIGluIEVycm9yKERPTV9FWENFUFRJT04pO1xuXG52YXIgY29kZUZvciA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBoYXNPd24oRE9NRXhjZXB0aW9uQ29uc3RhbnRzLCBuYW1lKSAmJiBET01FeGNlcHRpb25Db25zdGFudHNbbmFtZV0ubSA/IERPTUV4Y2VwdGlvbkNvbnN0YW50c1tuYW1lXS5jIDogMDtcbn07XG5cbnZhciAkRE9NRXhjZXB0aW9uID0gZnVuY3Rpb24gRE9NRXhjZXB0aW9uKCkge1xuICBhbkluc3RhbmNlKHRoaXMsIERPTUV4Y2VwdGlvblByb3RvdHlwZSk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWVzc2FnZSA9IG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KGFyZ3VtZW50c0xlbmd0aCA8IDEgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMF0pO1xuICB2YXIgbmFtZSA9IG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KGFyZ3VtZW50c0xlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV0sICdFcnJvcicpO1xuICB2YXIgY29kZSA9IGNvZGVGb3IobmFtZSk7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IERPTV9FWENFUFRJT04sXG4gICAgbmFtZTogbmFtZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGNvZGU6IGNvZGVcbiAgfSk7XG4gIGlmICghREVTQ1JJUFRPUlMpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxuICBpZiAoSEFTX1NUQUNLKSB7XG4gICAgdmFyIGVycm9yID0gRXJyb3IobWVzc2FnZSk7XG4gICAgZXJyb3IubmFtZSA9IERPTV9FWENFUFRJT047XG4gICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0YWNrJywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIGNsZWFyRXJyb3JTdGFjayhlcnJvci5zdGFjaywgMSkpKTtcbiAgfVxufTtcblxudmFyIERPTUV4Y2VwdGlvblByb3RvdHlwZSA9ICRET01FeGNlcHRpb24ucHJvdG90eXBlID0gY3JlYXRlKEVycm9yUHJvdG90eXBlKTtcblxudmFyIGNyZWF0ZUdldHRlckRlc2NyaXB0b3IgPSBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZ2V0OiBnZXQgfTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBjcmVhdGVHZXR0ZXJEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKVtrZXldO1xuICB9KTtcbn07XG5cbmlmIChERVNDUklQVE9SUykge1xuICAvLyBgRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb2RlYCBnZXR0ZXJcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKERPTUV4Y2VwdGlvblByb3RvdHlwZSwgJ2NvZGUnLCBnZXR0ZXJGb3IoJ2NvZGUnKSk7XG4gIC8vIGBET01FeGNlcHRpb24ucHJvdG90eXBlLm1lc3NhZ2VgIGdldHRlclxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoRE9NRXhjZXB0aW9uUHJvdG90eXBlLCAnbWVzc2FnZScsIGdldHRlckZvcignbWVzc2FnZScpKTtcbiAgLy8gYERPTUV4Y2VwdGlvbi5wcm90b3R5cGUubmFtZWAgZ2V0dGVyXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihET01FeGNlcHRpb25Qcm90b3R5cGUsICduYW1lJywgZ2V0dGVyRm9yKCduYW1lJykpO1xufVxuXG5kZWZpbmVQcm9wZXJ0eShET01FeGNlcHRpb25Qcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCAkRE9NRXhjZXB0aW9uKSk7XG5cbi8vIEZGMzYtIERPTUV4Y2VwdGlvbiBpcyBhIGZ1bmN0aW9uLCBidXQgY2FuJ3QgYmUgY29uc3RydWN0ZWRcbnZhciBJTkNPUlJFQ1RfQ09OU1RSVUNUT1IgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhKG5ldyBOYXRpdmVET01FeGNlcHRpb24oKSBpbnN0YW5jZW9mIEVycm9yKTtcbn0pO1xuXG4vLyBTYWZhcmkgMTAuMSAvIENocm9tZSAzMi0gLyBJRTgtIERPTUV4Y2VwdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgYnVnc1xudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSBJTkNPUlJFQ1RfQ09OU1RSVUNUT1IgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXJyb3JQcm90b3R5cGUudG9TdHJpbmcgIT09IGVycm9yVG9TdHJpbmcgfHwgU3RyaW5nKG5ldyBOYXRpdmVET01FeGNlcHRpb24oMSwgMikpICE9PSAnMjogMSc7XG59KTtcblxuLy8gRGVubyAxLjYuMy0gRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb2RlIGp1c3QgbWlzc2VkXG52YXIgSU5DT1JSRUNUX0NPREUgPSBJTkNPUlJFQ1RfQ09OU1RSVUNUT1IgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IE5hdGl2ZURPTUV4Y2VwdGlvbigxLCAnRGF0YUNsb25lRXJyb3InKS5jb2RlICE9PSAyNTtcbn0pO1xuXG4vLyBEZW5vIDEuNi4zLSBET01FeGNlcHRpb24gY29uc3RhbnRzIGp1c3QgbWlzc2VkXG52YXIgTUlTU0VEX0NPTlNUQU5UUyA9IElOQ09SUkVDVF9DT05TVFJVQ1RPUlxuICB8fCBOYXRpdmVET01FeGNlcHRpb25bREFUQV9DTE9ORV9FUlJdICE9PSAyNVxuICB8fCBOYXRpdmVET01FeGNlcHRpb25Qcm90b3R5cGVbREFUQV9DTE9ORV9FUlJdICE9PSAyNTtcblxudmFyIEZPUkNFRF9DT05TVFJVQ1RPUiA9IElTX1BVUkUgPyBJTkNPUlJFQ1RfVE9fU1RSSU5HIHx8IElOQ09SUkVDVF9DT0RFIHx8IE1JU1NFRF9DT05TVEFOVFMgOiBJTkNPUlJFQ1RfQ09OU1RSVUNUT1I7XG5cbi8vIGBET01FeGNlcHRpb25gIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2lkbC1ET01FeGNlcHRpb25cbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9DT05TVFJVQ1RPUiB9LCB7XG4gIERPTUV4Y2VwdGlvbjogRk9SQ0VEX0NPTlNUUlVDVE9SID8gJERPTUV4Y2VwdGlvbiA6IE5hdGl2ZURPTUV4Y2VwdGlvblxufSk7XG5cbnZhciBQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uID0gZ2V0QnVpbHRJbihET01fRVhDRVBUSU9OKTtcbnZhciBQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uUHJvdG90eXBlID0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbi5wcm90b3R5cGU7XG5cbmlmIChJTkNPUlJFQ1RfVE9fU1RSSU5HICYmIChJU19QVVJFIHx8IE5hdGl2ZURPTUV4Y2VwdGlvbiA9PT0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbikpIHtcbiAgZGVmaW5lQnVpbHRJbihQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uUHJvdG90eXBlLCAndG9TdHJpbmcnLCBlcnJvclRvU3RyaW5nKTtcbn1cblxuaWYgKElOQ09SUkVDVF9DT0RFICYmIERFU0NSSVBUT1JTICYmIE5hdGl2ZURPTUV4Y2VwdGlvbiA9PT0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbikge1xuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoUG9seWZpbGxlZERPTUV4Y2VwdGlvblByb3RvdHlwZSwgJ2NvZGUnLCBjcmVhdGVHZXR0ZXJEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29kZUZvcihhbk9iamVjdCh0aGlzKS5uYW1lKTtcbiAgfSkpO1xufVxuXG4vLyBgRE9NRXhjZXB0aW9uYCBjb25zdGFudHNcbmZvciAodmFyIGtleSBpbiBET01FeGNlcHRpb25Db25zdGFudHMpIGlmIChoYXNPd24oRE9NRXhjZXB0aW9uQ29uc3RhbnRzLCBrZXkpKSB7XG4gIHZhciBjb25zdGFudCA9IERPTUV4Y2VwdGlvbkNvbnN0YW50c1trZXldO1xuICB2YXIgY29uc3RhbnROYW1lID0gY29uc3RhbnQucztcbiAgdmFyIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoNiwgY29uc3RhbnQuYyk7XG4gIGlmICghaGFzT3duKFBvbHlmaWxsZWRET01FeGNlcHRpb24sIGNvbnN0YW50TmFtZSkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uLCBjb25zdGFudE5hbWUsIGRlc2NyaXB0b3IpO1xuICB9XG4gIGlmICghaGFzT3duKFBvbHlmaWxsZWRET01FeGNlcHRpb25Qcm90b3R5cGUsIGNvbnN0YW50TmFtZSkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uUHJvdG90eXBlLCBjb25zdGFudE5hbWUsIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tZXhjZXB0aW9uLmNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5zdGFjay5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qc1wiKS5mKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzXCIpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzXCIpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzXCIpO1xudmFyIERPTUV4Y2VwdGlvbkNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb20tZXhjZXB0aW9uLWNvbnN0YW50cyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1leGNlcHRpb24tY29uc3RhbnRzLmpzXCIpO1xudmFyIGNsZWFyRXJyb3JTdGFjayA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWNsZWFyLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcblxudmFyIERPTV9FWENFUFRJT04gPSAnRE9NRXhjZXB0aW9uJztcbnZhciBFcnJvciA9IGdldEJ1aWx0SW4oJ0Vycm9yJyk7XG52YXIgTmF0aXZlRE9NRXhjZXB0aW9uID0gZ2V0QnVpbHRJbihET01fRVhDRVBUSU9OKTtcblxudmFyICRET01FeGNlcHRpb24gPSBmdW5jdGlvbiBET01FeGNlcHRpb24oKSB7XG4gIGFuSW5zdGFuY2UodGhpcywgRE9NRXhjZXB0aW9uUHJvdG90eXBlKTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtZXNzYWdlID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoYXJndW1lbnRzTGVuZ3RoIDwgMSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1swXSk7XG4gIHZhciBuYW1lID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoYXJndW1lbnRzTGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXSwgJ0Vycm9yJyk7XG4gIHZhciB0aGF0ID0gbmV3IE5hdGl2ZURPTUV4Y2VwdGlvbihtZXNzYWdlLCBuYW1lKTtcbiAgdmFyIGVycm9yID0gRXJyb3IobWVzc2FnZSk7XG4gIGVycm9yLm5hbWUgPSBET01fRVhDRVBUSU9OO1xuICBkZWZpbmVQcm9wZXJ0eSh0aGF0LCAnc3RhY2snLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgY2xlYXJFcnJvclN0YWNrKGVycm9yLnN0YWNrLCAxKSkpO1xuICBpbmhlcml0SWZSZXF1aXJlZCh0aGF0LCB0aGlzLCAkRE9NRXhjZXB0aW9uKTtcbiAgcmV0dXJuIHRoYXQ7XG59O1xuXG52YXIgRE9NRXhjZXB0aW9uUHJvdG90eXBlID0gJERPTUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBOYXRpdmVET01FeGNlcHRpb24ucHJvdG90eXBlO1xuXG52YXIgRVJST1JfSEFTX1NUQUNLID0gJ3N0YWNrJyBpbiBFcnJvcihET01fRVhDRVBUSU9OKTtcbnZhciBET01fRVhDRVBUSU9OX0hBU19TVEFDSyA9ICdzdGFjaycgaW4gbmV3IE5hdGl2ZURPTUV4Y2VwdGlvbigxLCAyKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGRlc2NyaXB0b3IgPSBOYXRpdmVET01FeGNlcHRpb24gJiYgREVTQ1JJUFRPUlMgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsIERPTV9FWENFUFRJT04pO1xuXG4vLyBCdW4gfiAwLjEuMSBET01FeGNlcHRpb24gaGF2ZSBpbmNvcnJlY3QgZGVzY3JpcHRvciBhbmQgd2UgY2FuJ3QgcmVkZWZpbmUgaXRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9KYXJyZWQtU3VtbmVyL2J1bi9pc3N1ZXMvMzk5XG52YXIgQlVHR1lfREVTQ1JJUFRPUiA9ICEhZGVzY3JpcHRvciAmJiAhKGRlc2NyaXB0b3Iud3JpdGFibGUgJiYgZGVzY3JpcHRvci5jb25maWd1cmFibGUpO1xuXG52YXIgRk9SQ0VEX0NPTlNUUlVDVE9SID0gRVJST1JfSEFTX1NUQUNLICYmICFCVUdHWV9ERVNDUklQVE9SICYmICFET01fRVhDRVBUSU9OX0hBU19TVEFDSztcblxuLy8gYERPTUV4Y2VwdGlvbmAgY29uc3RydWN0b3IgcGF0Y2ggZm9yIGAuc3RhY2tgIHdoZXJlIGl0J3MgcmVxdWlyZWRcbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtRE9NRXhjZXB0aW9uLXNwZWNpYWxuZXNzXG4kKHsgZ2xvYmFsOiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRF9DT05TVFJVQ1RPUiB9LCB7IC8vIFRPRE86IGZpeCBleHBvcnQgbG9naWNcbiAgRE9NRXhjZXB0aW9uOiBGT1JDRURfQ09OU1RSVUNUT1IgPyAkRE9NRXhjZXB0aW9uIDogTmF0aXZlRE9NRXhjZXB0aW9uXG59KTtcblxudmFyIFBvbHlmaWxsZWRET01FeGNlcHRpb24gPSBnZXRCdWlsdEluKERPTV9FWENFUFRJT04pO1xudmFyIFBvbHlmaWxsZWRET01FeGNlcHRpb25Qcm90b3R5cGUgPSBQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uLnByb3RvdHlwZTtcblxuaWYgKFBvbHlmaWxsZWRET01FeGNlcHRpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgIT09IFBvbHlmaWxsZWRET01FeGNlcHRpb24pIHtcbiAgaWYgKCFJU19QVVJFKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoUG9seWZpbGxlZERPTUV4Y2VwdGlvblByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIFBvbHlmaWxsZWRET01FeGNlcHRpb24pKTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBET01FeGNlcHRpb25Db25zdGFudHMpIGlmIChoYXNPd24oRE9NRXhjZXB0aW9uQ29uc3RhbnRzLCBrZXkpKSB7XG4gICAgdmFyIGNvbnN0YW50ID0gRE9NRXhjZXB0aW9uQ29uc3RhbnRzW2tleV07XG4gICAgdmFyIGNvbnN0YW50TmFtZSA9IGNvbnN0YW50LnM7XG4gICAgaWYgKCFoYXNPd24oUG9seWZpbGxlZERPTUV4Y2VwdGlvbiwgY29uc3RhbnROYW1lKSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkoUG9seWZpbGxlZERPTUV4Y2VwdGlvbiwgY29uc3RhbnROYW1lLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoNiwgY29uc3RhbnQuYykpO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5zdGFjay5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24udG8tc3RyaW5nLXRhZy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xuXG52YXIgRE9NX0VYQ0VQVElPTiA9ICdET01FeGNlcHRpb24nO1xuXG4vLyBgRE9NRXhjZXB0aW9uLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXWAgcHJvcGVydHlcbnNldFRvU3RyaW5nVGFnKGdldEJ1aWx0SW4oRE9NX0VYQ0VQVElPTiksIERPTV9FWENFUFRJT04pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi50by1zdHJpbmctdGFnLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuc2VsZi5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBJTkNPUlJFQ1RfVkFMVUUgPSBnbG9iYWwuc2VsZiAhPT0gZ2xvYmFsO1xuXG4vLyBgc2VsZmAgZ2V0dGVyXG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93aW5kb3ctb2JqZWN0Lmh0bWwjZG9tLXNlbGZcbnRyeSB7XG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbiAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsLCAnc2VsZicpO1xuICAgIC8vIHNvbWUgZW5naW5lcyBoYXZlIGBzZWxmYCwgYnV0IHdpdGggaW5jb3JyZWN0IGRlc2NyaXB0b3JcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGVub2xhbmQvZGVuby9pc3N1ZXMvMTU3NjVcbiAgICBpZiAoSU5DT1JSRUNUX1ZBTFVFIHx8ICFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLmdldCB8fCAhZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG4gICAgICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoZ2xvYmFsLCAnc2VsZicsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBzZWxmKCkge1xuICAgICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gc2VsZih2YWx1ZSkge1xuICAgICAgICAgIGlmICh0aGlzICE9PSBnbG9iYWwpIHRocm93ICRUeXBlRXJyb3IoJ0lsbGVnYWwgaW52b2NhdGlvbicpO1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbCwgJ3NlbGYnLCB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSAkKHsgZ2xvYmFsOiB0cnVlLCBzaW1wbGU6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX1ZBTFVFIH0sIHtcbiAgICBzZWxmOiBnbG9iYWxcbiAgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5zZWxmLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuc3RydWN0dXJlZC1jbG9uZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgZ2V0QnVpbHRpbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgdWlkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3VpZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGlzU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qc1wiKTtcbnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzXCIpO1xudmFyIGdldFJlZ0V4cEZsYWdzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1nZXQtZmxhZ3MgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzLmpzXCIpO1xudmFyIE1hcEhlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWFwLWhlbHBlcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXAtaGVscGVycy5qc1wiKTtcbnZhciBTZXRIZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC1oZWxwZXJzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LWhlbHBlcnMuanNcIik7XG52YXIgRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qc1wiKTtcbnZhciBQUk9QRVJfVFJBTlNGRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RydWN0dXJlZC1jbG9uZS1wcm9wZXItdHJhbnNmZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJ1Y3R1cmVkLWNsb25lLXByb3Blci10cmFuc2Zlci5qc1wiKTtcblxudmFyIE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG52YXIgQXJyYXkgPSBnbG9iYWwuQXJyYXk7XG52YXIgRGF0ZSA9IGdsb2JhbC5EYXRlO1xudmFyIEVycm9yID0gZ2xvYmFsLkVycm9yO1xudmFyIEV2YWxFcnJvciA9IGdsb2JhbC5FdmFsRXJyb3I7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xudmFyIFJlZmVyZW5jZUVycm9yID0gZ2xvYmFsLlJlZmVyZW5jZUVycm9yO1xudmFyIFN5bnRheEVycm9yID0gZ2xvYmFsLlN5bnRheEVycm9yO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgVVJJRXJyb3IgPSBnbG9iYWwuVVJJRXJyb3I7XG52YXIgUGVyZm9ybWFuY2VNYXJrID0gZ2xvYmFsLlBlcmZvcm1hbmNlTWFyaztcbnZhciBXZWJBc3NlbWJseSA9IGdsb2JhbC5XZWJBc3NlbWJseTtcbnZhciBDb21waWxlRXJyb3IgPSBXZWJBc3NlbWJseSAmJiBXZWJBc3NlbWJseS5Db21waWxlRXJyb3IgfHwgRXJyb3I7XG52YXIgTGlua0Vycm9yID0gV2ViQXNzZW1ibHkgJiYgV2ViQXNzZW1ibHkuTGlua0Vycm9yIHx8IEVycm9yO1xudmFyIFJ1bnRpbWVFcnJvciA9IFdlYkFzc2VtYmx5ICYmIFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvciB8fCBFcnJvcjtcbnZhciBET01FeGNlcHRpb24gPSBnZXRCdWlsdGluKCdET01FeGNlcHRpb24nKTtcbnZhciBNYXAgPSBNYXBIZWxwZXJzLk1hcDtcbnZhciBtYXBIYXMgPSBNYXBIZWxwZXJzLmhhcztcbnZhciBtYXBHZXQgPSBNYXBIZWxwZXJzLmdldDtcbnZhciBtYXBTZXQgPSBNYXBIZWxwZXJzLnNldDtcbnZhciBTZXQgPSBTZXRIZWxwZXJzLlNldDtcbnZhciBzZXRBZGQgPSBTZXRIZWxwZXJzLmFkZDtcbnZhciBvYmplY3RLZXlzID0gZ2V0QnVpbHRpbignT2JqZWN0JywgJ2tleXMnKTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgdGhpc0Jvb2xlYW5WYWx1ZSA9IHVuY3VycnlUaGlzKHRydWUudmFsdWVPZik7XG52YXIgdGhpc051bWJlclZhbHVlID0gdW5jdXJyeVRoaXMoMS4wLnZhbHVlT2YpO1xudmFyIHRoaXNTdHJpbmdWYWx1ZSA9IHVuY3VycnlUaGlzKCcnLnZhbHVlT2YpO1xudmFyIHRoaXNUaW1lVmFsdWUgPSB1bmN1cnJ5VGhpcyhEYXRlLnByb3RvdHlwZS5nZXRUaW1lKTtcbnZhciBQRVJGT1JNQU5DRV9NQVJLID0gdWlkKCdzdHJ1Y3R1cmVkQ2xvbmUnKTtcbnZhciBEQVRBX0NMT05FX0VSUk9SID0gJ0RhdGFDbG9uZUVycm9yJztcbnZhciBUUkFOU0ZFUlJJTkcgPSAnVHJhbnNmZXJyaW5nJztcblxudmFyIGNoZWNrQmFzaWNTZW1hbnRpYyA9IGZ1bmN0aW9uIChzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbikge1xuICByZXR1cm4gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2V0MSA9IG5ldyBnbG9iYWwuU2V0KFs3XSk7XG4gICAgdmFyIHNldDIgPSBzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbihzZXQxKTtcbiAgICB2YXIgbnVtYmVyID0gc3RydWN0dXJlZENsb25lSW1wbGVtZW50YXRpb24oT2JqZWN0KDcpKTtcbiAgICByZXR1cm4gc2V0MiA9PSBzZXQxIHx8ICFzZXQyLmhhcyg3KSB8fCB0eXBlb2YgbnVtYmVyICE9ICdvYmplY3QnIHx8IG51bWJlciAhPSA3O1xuICB9KSAmJiBzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbjtcbn07XG5cbnZhciBjaGVja0Vycm9yc0Nsb25pbmcgPSBmdW5jdGlvbiAoc3RydWN0dXJlZENsb25lSW1wbGVtZW50YXRpb24sICRFcnJvcikge1xuICByZXR1cm4gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgJEVycm9yKCk7XG4gICAgdmFyIHRlc3QgPSBzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbih7IGE6IGVycm9yLCBiOiBlcnJvciB9KTtcbiAgICByZXR1cm4gISh0ZXN0ICYmIHRlc3QuYSA9PT0gdGVzdC5iICYmIHRlc3QuYSBpbnN0YW5jZW9mICRFcnJvciAmJiB0ZXN0LmEuc3RhY2sgPT09IGVycm9yLnN0YWNrKTtcbiAgfSk7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2h0bWwvcHVsbC81NzQ5XG52YXIgY2hlY2tOZXdFcnJvcnNDbG9uaW5nU2VtYW50aWMgPSBmdW5jdGlvbiAoc3RydWN0dXJlZENsb25lSW1wbGVtZW50YXRpb24pIHtcbiAgcmV0dXJuICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRlc3QgPSBzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbihuZXcgZ2xvYmFsLkFnZ3JlZ2F0ZUVycm9yKFsxXSwgUEVSRk9STUFOQ0VfTUFSSywgeyBjYXVzZTogMyB9KSk7XG4gICAgcmV0dXJuIHRlc3QubmFtZSAhPSAnQWdncmVnYXRlRXJyb3InIHx8IHRlc3QuZXJyb3JzWzBdICE9IDEgfHwgdGVzdC5tZXNzYWdlICE9IFBFUkZPUk1BTkNFX01BUksgfHwgdGVzdC5jYXVzZSAhPSAzO1xuICB9KTtcbn07XG5cbi8vIEZGOTQrLCBTYWZhcmkgMTUuNCssIENocm9tZSA5OCssIE5vZGVKUyAxNy4wKywgRGVubyAxLjEzK1xuLy8gRkY8MTAzIGFuZCBTYWZhcmkgaW1wbGVtZW50YXRpb25zIGNhbid0IGNsb25lIGVycm9yc1xuLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU1NjYwNFxuLy8gRkYxMDMgY2FuIGNsb25lIGVycm9ycywgYnV0IGAuc3RhY2tgIG9mIGNsb25lIGlzIGFuIGVtcHR5IHN0cmluZ1xuLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc3ODc2MlxuLy8gRkYxMDQrIGZpeGVkIGl0IG9uIHVzdWFsIGVycm9ycywgYnV0IG5vdCBvbiBET01FeGNlcHRpb25zXG4vLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzc3MzIxXG4vLyBDaHJvbWUgPDEwMiByZXR1cm5zIGBudWxsYCBpZiBjbG9uZWQgb2JqZWN0IGNvbnRhaW5zIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gb25lIGVycm9yXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjU0MlxuLy8gTm9kZUpTIGltcGxlbWVudGF0aW9uIGNhbid0IGNsb25lIERPTUV4Y2VwdGlvbnNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDEwMzhcbi8vIG9ubHkgRkYxMDMrIHN1cHBvcnRzIG5ldyAoaHRtbC81NzQ5KSBlcnJvciBjbG9uaW5nIHNlbWFudGljXG52YXIgbmF0aXZlU3RydWN0dXJlZENsb25lID0gZ2xvYmFsLnN0cnVjdHVyZWRDbG9uZTtcblxudmFyIEZPUkNFRF9SRVBMQUNFTUVOVCA9IElTX1BVUkVcbiAgfHwgIWNoZWNrRXJyb3JzQ2xvbmluZyhuYXRpdmVTdHJ1Y3R1cmVkQ2xvbmUsIEVycm9yKVxuICB8fCAhY2hlY2tFcnJvcnNDbG9uaW5nKG5hdGl2ZVN0cnVjdHVyZWRDbG9uZSwgRE9NRXhjZXB0aW9uKVxuICB8fCAhY2hlY2tOZXdFcnJvcnNDbG9uaW5nU2VtYW50aWMobmF0aXZlU3RydWN0dXJlZENsb25lKTtcblxuLy8gQ2hyb21lIDgyKywgU2FmYXJpIDE0LjErLCBEZW5vIDEuMTErXG4vLyBDaHJvbWUgNzgtODEgaW1wbGVtZW50YXRpb24gc3dhcHMgYC5uYW1lYCBhbmQgYC5tZXNzYWdlYCBvZiBjbG9uZWQgYERPTUV4Y2VwdGlvbmBcbi8vIENocm9tZSByZXR1cm5zIGBudWxsYCBpZiBjbG9uZWQgb2JqZWN0IGNvbnRhaW5zIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gb25lIGVycm9yXG4vLyBTYWZhcmkgMTQuMSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGNsb25lIHNvbWUgYFJlZ0V4cGAgZmxhZ3MsIHNvIHJlcXVpcmVzIGEgd29ya2Fyb3VuZFxuLy8gU2FmYXJpIGltcGxlbWVudGF0aW9uIGNhbid0IGNsb25lIGVycm9yc1xuLy8gRGVubyAxLjItMS4xMCBpbXBsZW1lbnRhdGlvbnMgdG9vIG5haXZlXG4vLyBOb2RlSlMgMTYuMCsgZG9lcyBub3QgaGF2ZSBgUGVyZm9ybWFuY2VNYXJrYCBjb25zdHJ1Y3RvclxuLy8gTm9kZUpTIDwxNy4yIHN0cnVjdHVyZWQgY2xvbmluZyBpbXBsZW1lbnRhdGlvbiBmcm9tIGBwZXJmb3JtYW5jZS5tYXJrYCBpcyB0b28gbmFpdmVcbi8vIGFuZCBjYW4ndCBjbG9uZSwgZm9yIGV4YW1wbGUsIGBSZWdFeHBgIG9yIHNvbWUgYm94ZWQgcHJpbWl0aXZlc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy80MDg0MFxuLy8gbm8gb25lIG9mIHRob3NlIGltcGxlbWVudGF0aW9ucyBzdXBwb3J0cyBuZXcgKGh0bWwvNTc0OSkgZXJyb3IgY2xvbmluZyBzZW1hbnRpY1xudmFyIHN0cnVjdHVyZWRDbG9uZUZyb21NYXJrID0gIW5hdGl2ZVN0cnVjdHVyZWRDbG9uZSAmJiBjaGVja0Jhc2ljU2VtYW50aWMoZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiBuZXcgUGVyZm9ybWFuY2VNYXJrKFBFUkZPUk1BTkNFX01BUkssIHsgZGV0YWlsOiB2YWx1ZSB9KS5kZXRhaWw7XG59KTtcblxudmFyIG5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUgPSBjaGVja0Jhc2ljU2VtYW50aWMobmF0aXZlU3RydWN0dXJlZENsb25lKSB8fCBzdHJ1Y3R1cmVkQ2xvbmVGcm9tTWFyaztcblxudmFyIHRocm93VW5jbG9uZWFibGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdVbmNsb25lYWJsZSB0eXBlOiAnICsgdHlwZSwgREFUQV9DTE9ORV9FUlJPUik7XG59O1xuXG52YXIgdGhyb3dVbnBvbHlmaWxsYWJsZSA9IGZ1bmN0aW9uICh0eXBlLCBhY3Rpb24pIHtcbiAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbigoYWN0aW9uIHx8ICdDbG9uaW5nJykgKyAnIG9mICcgKyB0eXBlICsgJyBjYW5ub3QgYmUgcHJvcGVybHkgcG9seWZpbGxlZCBpbiB0aGlzIGVuZ2luZScsIERBVEFfQ0xPTkVfRVJST1IpO1xufTtcblxudmFyIHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUgPSBmdW5jdGlvbiAodmFsdWUsIHR5cGUpIHtcbiAgaWYgKCFuYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKSB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICByZXR1cm4gbmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG59O1xuXG52YXIgY3JlYXRlRGF0YVRyYW5zZmVyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZGF0YVRyYW5zZmVyO1xuICB0cnkge1xuICAgIGRhdGFUcmFuc2ZlciA9IG5ldyBnbG9iYWwuRGF0YVRyYW5zZmVyKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGFUcmFuc2ZlciA9IG5ldyBnbG9iYWwuQ2xpcGJvYXJkRXZlbnQoJycpLmNsaXBib2FyZERhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IyKSB7IC8qIGVtcHR5ICovIH1cbiAgfVxuICByZXR1cm4gZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5pdGVtcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMgPyBkYXRhVHJhbnNmZXIgOiBudWxsO1xufTtcblxudmFyIGNsb25lQnVmZmVyID0gZnVuY3Rpb24gKHZhbHVlLCBtYXAsICR0eXBlKSB7XG4gIGlmIChtYXBIYXMobWFwLCB2YWx1ZSkpIHJldHVybiBtYXBHZXQobWFwLCB2YWx1ZSk7XG5cbiAgdmFyIHR5cGUgPSAkdHlwZSB8fCBjbGFzc29mKHZhbHVlKTtcbiAgdmFyIGNsb25lLCBsZW5ndGgsIG9wdGlvbnMsIHNvdXJjZSwgdGFyZ2V0LCBpO1xuXG4gIGlmICh0eXBlID09PSAnU2hhcmVkQXJyYXlCdWZmZXInKSB7XG4gICAgaWYgKG5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUpIGNsb25lID0gbmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgLy8gU2hhcmVkQXJyYXlCdWZmZXIgc2hvdWxkIHVzZSBzaGFyZWQgbWVtb3J5LCB3ZSBjYW4ndCBwb2x5ZmlsbCBpdCwgc28gcmV0dXJuIHRoZSBvcmlnaW5hbFxuICAgIGVsc2UgY2xvbmUgPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgRGF0YVZpZXcgPSBnbG9iYWwuRGF0YVZpZXc7XG5cbiAgICAvLyBgQXJyYXlCdWZmZXIjc2xpY2VgIGlzIG5vdCBhdmFpbGFibGUgaW4gSUUxMFxuICAgIC8vIGBBcnJheUJ1ZmZlciNzbGljZWAgYW5kIGBEYXRhVmlld2AgYXJlIG5vdCBhdmFpbGFibGUgaW4gb2xkIEZGXG4gICAgaWYgKCFEYXRhVmlldyAmJiB0eXBlb2YgdmFsdWUuc2xpY2UgIT0gJ2Z1bmN0aW9uJykgdGhyb3dVbnBvbHlmaWxsYWJsZSgnQXJyYXlCdWZmZXInKTtcbiAgICAvLyBkZXRhY2hlZCBidWZmZXJzIHRocm93cyBpbiBgRGF0YVZpZXdgIGFuZCBgLnNsaWNlYFxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLnNsaWNlID09ICdmdW5jdGlvbicgJiYgIXZhbHVlLnJlc2l6YWJsZSkge1xuICAgICAgICBjbG9uZSA9IHZhbHVlLnNsaWNlKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVuZ3RoID0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICAgICAgb3B0aW9ucyA9ICdtYXhCeXRlTGVuZ3RoJyBpbiB2YWx1ZSA/IHsgbWF4Qnl0ZUxlbmd0aDogdmFsdWUubWF4Qnl0ZUxlbmd0aCB9IDogdW5kZWZpbmVkO1xuICAgICAgICBjbG9uZSA9IG5ldyBBcnJheUJ1ZmZlcihsZW5ndGgsIG9wdGlvbnMpO1xuICAgICAgICBzb3VyY2UgPSBuZXcgRGF0YVZpZXcodmFsdWUpO1xuICAgICAgICB0YXJnZXQgPSBuZXcgRGF0YVZpZXcoY2xvbmUpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0YXJnZXQuc2V0VWludDgoaSwgc291cmNlLmdldFVpbnQ4KGkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdBcnJheUJ1ZmZlciBpcyBkZXRhY2hlZCcsIERBVEFfQ0xPTkVfRVJST1IpO1xuICAgIH1cbiAgfVxuXG4gIG1hcFNldChtYXAsIHZhbHVlLCBjbG9uZSk7XG5cbiAgcmV0dXJuIGNsb25lO1xufTtcblxudmFyIGNsb25lVmlldyA9IGZ1bmN0aW9uICh2YWx1ZSwgdHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG1hcCkge1xuICB2YXIgQyA9IGdsb2JhbFt0eXBlXTtcbiAgLy8gaW4gc29tZSBvbGQgZW5naW5lcyBsaWtlIFNhZmFyaSA5LCB0eXBlb2YgQyBpcyAnb2JqZWN0J1xuICAvLyBvbiBVaW50OENsYW1wZWRBcnJheSBvciBzb21lIG90aGVyIGNvbnN0cnVjdG9yc1xuICBpZiAoIWlzT2JqZWN0KEMpKSB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICByZXR1cm4gbmV3IEMoY2xvbmVCdWZmZXIodmFsdWUuYnVmZmVyLCBtYXApLCBvZmZzZXQsIGxlbmd0aCk7XG59O1xuXG52YXIgUGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAob2JqZWN0LCB0eXBlLCBtZXRhZGF0YSkge1xuICB0aGlzLm9iamVjdCA9IG9iamVjdDtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xufTtcblxudmFyIHN0cnVjdHVyZWRDbG9uZUludGVybmFsID0gZnVuY3Rpb24gKHZhbHVlLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycykge1xuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB0aHJvd1VuY2xvbmVhYmxlKCdTeW1ib2wnKTtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgLy8gZWZmZWN0aXZlbHkgcHJlc2VydmVzIGNpcmN1bGFyIHJlZmVyZW5jZXNcbiAgaWYgKG1hcCkge1xuICAgIGlmIChtYXBIYXMobWFwLCB2YWx1ZSkpIHJldHVybiBtYXBHZXQobWFwLCB2YWx1ZSk7XG4gIH0gZWxzZSBtYXAgPSBuZXcgTWFwKCk7XG5cbiAgdmFyIHR5cGUgPSBjbGFzc29mKHZhbHVlKTtcbiAgdmFyIEMsIG5hbWUsIGNsb25lZCwgZGF0YVRyYW5zZmVyLCBpLCBsZW5ndGgsIGtleXMsIGtleTtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICBjbG9uZWQgPSBBcnJheShsZW5ndGhPZkFycmF5TGlrZSh2YWx1ZSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIGNsb25lZCA9IHt9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnTWFwJzpcbiAgICAgIGNsb25lZCA9IG5ldyBNYXAoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NldCc6XG4gICAgICBjbG9uZWQgPSBuZXcgU2V0KCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgLy8gaW4gdGhpcyBibG9jayBiZWNhdXNlIG9mIGEgU2FmYXJpIDE0LjEgYnVnXG4gICAgICAvLyBvbGQgRkYgZG9lcyBub3QgY2xvbmUgcmVnZXhlcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBzbyBnZXQgdGhlIHNvdXJjZSBhbmQgZmxhZ3MgZGlyZWN0bHlcbiAgICAgIGNsb25lZCA9IG5ldyBSZWdFeHAodmFsdWUuc291cmNlLCBnZXRSZWdFeHBGbGFncyh2YWx1ZSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRXJyb3InOlxuICAgICAgbmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSAnQWdncmVnYXRlRXJyb3InOlxuICAgICAgICAgIGNsb25lZCA9IGdldEJ1aWx0aW4oJ0FnZ3JlZ2F0ZUVycm9yJykoW10pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdFdmFsRXJyb3InOlxuICAgICAgICAgIGNsb25lZCA9IEV2YWxFcnJvcigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdSYW5nZUVycm9yJzpcbiAgICAgICAgICBjbG9uZWQgPSBSYW5nZUVycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1JlZmVyZW5jZUVycm9yJzpcbiAgICAgICAgICBjbG9uZWQgPSBSZWZlcmVuY2VFcnJvcigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTeW50YXhFcnJvcic6XG4gICAgICAgICAgY2xvbmVkID0gU3ludGF4RXJyb3IoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnVHlwZUVycm9yJzpcbiAgICAgICAgICBjbG9uZWQgPSBUeXBlRXJyb3IoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnVVJJRXJyb3InOlxuICAgICAgICAgIGNsb25lZCA9IFVSSUVycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0NvbXBpbGVFcnJvcic6XG4gICAgICAgICAgY2xvbmVkID0gQ29tcGlsZUVycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0xpbmtFcnJvcic6XG4gICAgICAgICAgY2xvbmVkID0gTGlua0Vycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1J1bnRpbWVFcnJvcic6XG4gICAgICAgICAgY2xvbmVkID0gUnVudGltZUVycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2xvbmVkID0gRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RPTUV4Y2VwdGlvbic6XG4gICAgICBjbG9uZWQgPSBuZXcgRE9NRXhjZXB0aW9uKHZhbHVlLm1lc3NhZ2UsIHZhbHVlLm5hbWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnQXJyYXlCdWZmZXInOlxuICAgIGNhc2UgJ1NoYXJlZEFycmF5QnVmZmVyJzpcbiAgICAgIGNsb25lZCA9IHRyYW5zZmVycmVkQnVmZmVyc1xuICAgICAgICA/IG5ldyBQbGFjZWhvbGRlcih2YWx1ZSwgdHlwZSlcbiAgICAgICAgOiBjbG9uZUJ1ZmZlcih2YWx1ZSwgbWFwLCB0eXBlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RhdGFWaWV3JzpcbiAgICBjYXNlICdJbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4Q2xhbXBlZEFycmF5JzpcbiAgICBjYXNlICdJbnQxNkFycmF5JzpcbiAgICBjYXNlICdVaW50MTZBcnJheSc6XG4gICAgY2FzZSAnSW50MzJBcnJheSc6XG4gICAgY2FzZSAnVWludDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0MTZBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDY0QXJyYXknOlxuICAgIGNhc2UgJ0JpZ0ludDY0QXJyYXknOlxuICAgIGNhc2UgJ0JpZ1VpbnQ2NEFycmF5JzpcbiAgICAgIGxlbmd0aCA9IHR5cGUgPT09ICdEYXRhVmlldycgPyB2YWx1ZS5ieXRlTGVuZ3RoIDogdmFsdWUubGVuZ3RoO1xuICAgICAgY2xvbmVkID0gdHJhbnNmZXJyZWRCdWZmZXJzXG4gICAgICAgID8gbmV3IFBsYWNlaG9sZGVyKHZhbHVlLCB0eXBlLCB7IG9mZnNldDogdmFsdWUuYnl0ZU9mZnNldCwgbGVuZ3RoOiBsZW5ndGggfSlcbiAgICAgICAgOiBjbG9uZVZpZXcodmFsdWUsIHR5cGUsIHZhbHVlLmJ5dGVPZmZzZXQsIGxlbmd0aCwgbWFwKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RPTVF1YWQnOlxuICAgICAgdHJ5IHtcbiAgICAgICAgY2xvbmVkID0gbmV3IERPTVF1YWQoXG4gICAgICAgICAgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodmFsdWUucDEsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKSxcbiAgICAgICAgICBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh2YWx1ZS5wMiwgbWFwLCB0cmFuc2ZlcnJlZEJ1ZmZlcnMpLFxuICAgICAgICAgIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLnAzLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycyksXG4gICAgICAgICAgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodmFsdWUucDQsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2xvbmVkID0gdHJ5TmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSwgdHlwZSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdGaWxlJzpcbiAgICAgIGlmIChuYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKSB0cnkge1xuICAgICAgICBjbG9uZWQgPSBuYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgICAgICAgLy8gTm9kZUpTIDIwLjAuMCBidWcsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDc2MTJcbiAgICAgICAgaWYgKGNsYXNzb2YoY2xvbmVkKSAhPT0gdHlwZSkgY2xvbmVkID0gdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgICAgaWYgKCFjbG9uZWQpIHRyeSB7XG4gICAgICAgIGNsb25lZCA9IG5ldyBGaWxlKFt2YWx1ZV0sIHZhbHVlLm5hbWUsIHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgICAgIGlmICghY2xvbmVkKSB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRmlsZUxpc3QnOlxuICAgICAgZGF0YVRyYW5zZmVyID0gY3JlYXRlRGF0YVRyYW5zZmVyKCk7XG4gICAgICBpZiAoZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKHZhbHVlKTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZGF0YVRyYW5zZmVyLml0ZW1zLmFkZChzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh2YWx1ZVtpXSwgbWFwLCB0cmFuc2ZlcnJlZEJ1ZmZlcnMpKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9uZWQgPSBkYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgICB9IGVsc2UgY2xvbmVkID0gdHJ5TmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSwgdHlwZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdJbWFnZURhdGEnOlxuICAgICAgLy8gU2FmYXJpIDkgSW1hZ2VEYXRhIGlzIGEgY29uc3RydWN0b3IsIGJ1dCB0eXBlb2YgSW1hZ2VEYXRhIGlzICdvYmplY3QnXG4gICAgICB0cnkge1xuICAgICAgICBjbG9uZWQgPSBuZXcgSW1hZ2VEYXRhKFxuICAgICAgICAgIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLmRhdGEsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKSxcbiAgICAgICAgICB2YWx1ZS53aWR0aCxcbiAgICAgICAgICB2YWx1ZS5oZWlnaHQsXG4gICAgICAgICAgeyBjb2xvclNwYWNlOiB2YWx1ZS5jb2xvclNwYWNlIH1cbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNsb25lZCA9IHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUodmFsdWUsIHR5cGUpO1xuICAgICAgfSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKG5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUpIHtcbiAgICAgICAgY2xvbmVkID0gbmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgICB9IGVsc2Ugc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ0JpZ0ludCc6XG4gICAgICAgICAgLy8gY2FuIGJlIGEgM3JkIHBhcnR5IHBvbHlmaWxsXG4gICAgICAgICAgY2xvbmVkID0gT2JqZWN0KHZhbHVlLnZhbHVlT2YoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgICAgIGNsb25lZCA9IE9iamVjdCh0aGlzQm9vbGVhblZhbHVlKHZhbHVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ051bWJlcic6XG4gICAgICAgICAgY2xvbmVkID0gT2JqZWN0KHRoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICAgIGNsb25lZCA9IE9iamVjdCh0aGlzU3RyaW5nVmFsdWUodmFsdWUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgICAgY2xvbmVkID0gbmV3IERhdGUodGhpc1RpbWVWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdCbG9iJzpcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2xvbmVkID0gdmFsdWUuc2xpY2UoMCwgdmFsdWUuc2l6ZSwgdmFsdWUudHlwZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93VW5wb2x5ZmlsbGFibGUodHlwZSk7XG4gICAgICAgICAgfSBicmVhaztcbiAgICAgICAgY2FzZSAnRE9NUG9pbnQnOlxuICAgICAgICBjYXNlICdET01Qb2ludFJlYWRPbmx5JzpcbiAgICAgICAgICBDID0gZ2xvYmFsW3R5cGVdO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjbG9uZWQgPSBDLmZyb21Qb2ludFxuICAgICAgICAgICAgICA/IEMuZnJvbVBvaW50KHZhbHVlKVxuICAgICAgICAgICAgICA6IG5ldyBDKHZhbHVlLngsIHZhbHVlLnksIHZhbHVlLnosIHZhbHVlLncpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgIGNhc2UgJ0RPTVJlY3QnOlxuICAgICAgICBjYXNlICdET01SZWN0UmVhZE9ubHknOlxuICAgICAgICAgIEMgPSBnbG9iYWxbdHlwZV07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNsb25lZCA9IEMuZnJvbVJlY3RcbiAgICAgICAgICAgICAgPyBDLmZyb21SZWN0KHZhbHVlKVxuICAgICAgICAgICAgICA6IG5ldyBDKHZhbHVlLngsIHZhbHVlLnksIHZhbHVlLndpZHRoLCB2YWx1ZS5oZWlnaHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgIGNhc2UgJ0RPTU1hdHJpeCc6XG4gICAgICAgIGNhc2UgJ0RPTU1hdHJpeFJlYWRPbmx5JzpcbiAgICAgICAgICBDID0gZ2xvYmFsW3R5cGVdO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjbG9uZWQgPSBDLmZyb21NYXRyaXhcbiAgICAgICAgICAgICAgPyBDLmZyb21NYXRyaXgodmFsdWUpXG4gICAgICAgICAgICAgIDogbmV3IEModmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgIGNhc2UgJ0F1ZGlvRGF0YSc6XG4gICAgICAgIGNhc2UgJ1ZpZGVvRnJhbWUnOlxuICAgICAgICAgIGlmICghaXNDYWxsYWJsZSh2YWx1ZS5jbG9uZSkpIHRocm93VW5wb2x5ZmlsbGFibGUodHlwZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNsb25lZCA9IHZhbHVlLmNsb25lKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93VW5jbG9uZWFibGUodHlwZSk7XG4gICAgICAgICAgfSBicmVhaztcbiAgICAgICAgY2FzZSAnQ3JvcFRhcmdldCc6XG4gICAgICAgIGNhc2UgJ0NyeXB0b0tleSc6XG4gICAgICAgIGNhc2UgJ0ZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUnOlxuICAgICAgICBjYXNlICdGaWxlU3lzdGVtRmlsZUhhbmRsZSc6XG4gICAgICAgIGNhc2UgJ0ZpbGVTeXN0ZW1IYW5kbGUnOlxuICAgICAgICBjYXNlICdHUFVDb21waWxhdGlvbkluZm8nOlxuICAgICAgICBjYXNlICdHUFVDb21waWxhdGlvbk1lc3NhZ2UnOlxuICAgICAgICBjYXNlICdJbWFnZUJpdG1hcCc6XG4gICAgICAgIGNhc2UgJ1JUQ0NlcnRpZmljYXRlJzpcbiAgICAgICAgY2FzZSAnV2ViQXNzZW1ibHkuTW9kdWxlJzpcbiAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgICAgIC8vIGJyZWFrIG9taXR0ZWRcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvd1VuY2xvbmVhYmxlKHR5cGUpO1xuICAgICAgfVxuICB9XG5cbiAgbWFwU2V0KG1hcCwgdmFsdWUsIGNsb25lZCk7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICBrZXlzID0gb2JqZWN0S2V5cyh2YWx1ZSk7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShrZXlzKTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KGNsb25lZCwga2V5LCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh2YWx1ZVtrZXldLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycykpO1xuICAgICAgfSBicmVhaztcbiAgICBjYXNlICdNYXAnOlxuICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAodiwgaykge1xuICAgICAgICBtYXBTZXQoY2xvbmVkLCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbChrLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycyksIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHYsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NldCc6XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHNldEFkZChjbG9uZWQsIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHYsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShjbG9uZWQsICdtZXNzYWdlJywgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodmFsdWUubWVzc2FnZSwgbWFwLCB0cmFuc2ZlcnJlZEJ1ZmZlcnMpKTtcbiAgICAgIGlmIChoYXNPd24odmFsdWUsICdjYXVzZScpKSB7XG4gICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShjbG9uZWQsICdjYXVzZScsIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLmNhdXNlLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycykpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT0gJ0FnZ3JlZ2F0ZUVycm9yJykge1xuICAgICAgICBjbG9uZWQuZXJyb3JzID0gc3RydWN0dXJlZENsb25lSW50ZXJuYWwodmFsdWUuZXJyb3JzLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycyk7XG4gICAgICB9IC8vIGJyZWFrIG9taXR0ZWRcbiAgICBjYXNlICdET01FeGNlcHRpb24nOlxuICAgICAgaWYgKEVSUk9SX1NUQUNLX0lOU1RBTExBQkxFKSB7XG4gICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShjbG9uZWQsICdzdGFjaycsIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLnN0YWNrLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycykpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGNsb25lZDtcbn07XG5cbnZhciByZXBsYWNlUGxhY2Vob2xkZXJzID0gZnVuY3Rpb24gKHZhbHVlLCBtYXApIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKG1hcEhhcyhtYXAsIHZhbHVlKSkgcmV0dXJuIG1hcEdldChtYXAsIHZhbHVlKTtcblxuICB2YXIgdHlwZSwgb2JqZWN0LCBtZXRhZGF0YSwgaSwgbGVuZ3RoLCBrZXlzLCBrZXksIHJlcGxhY2VtZW50O1xuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBsYWNlaG9sZGVyKSB7XG4gICAgdHlwZSA9IHZhbHVlLnR5cGU7XG4gICAgb2JqZWN0ID0gdmFsdWUub2JqZWN0O1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdBcnJheUJ1ZmZlcic6XG4gICAgICBjYXNlICdTaGFyZWRBcnJheUJ1ZmZlcic6XG4gICAgICAgIHJlcGxhY2VtZW50ID0gY2xvbmVCdWZmZXIob2JqZWN0LCBtYXAsIHR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RhdGFWaWV3JzpcbiAgICAgIGNhc2UgJ0ludDhBcnJheSc6XG4gICAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICAgIGNhc2UgJ1VpbnQ4Q2xhbXBlZEFycmF5JzpcbiAgICAgIGNhc2UgJ0ludDE2QXJyYXknOlxuICAgICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgICAgY2FzZSAnSW50MzJBcnJheSc6XG4gICAgICBjYXNlICdVaW50MzJBcnJheSc6XG4gICAgICBjYXNlICdGbG9hdDE2QXJyYXknOlxuICAgICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgICBjYXNlICdCaWdJbnQ2NEFycmF5JzpcbiAgICAgIGNhc2UgJ0JpZ1VpbnQ2NEFycmF5JzpcbiAgICAgICAgbWV0YWRhdGEgPSB2YWx1ZS5tZXRhZGF0YTtcbiAgICAgICAgcmVwbGFjZW1lbnQgPSBjbG9uZVZpZXcob2JqZWN0LCB0eXBlLCBtZXRhZGF0YS5vZmZzZXQsIG1ldGFkYXRhLmxlbmd0aCwgbWFwKTtcbiAgICB9XG4gIH0gZWxzZSBzd2l0Y2ggKGNsYXNzb2YodmFsdWUpKSB7XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICBrZXlzID0gb2JqZWN0S2V5cyh2YWx1ZSk7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShrZXlzKTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhbHVlW2tleV0gPSByZXBsYWNlUGxhY2Vob2xkZXJzKHZhbHVlW2tleV0sIG1hcCk7XG4gICAgICB9IGJyZWFrO1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXBsYWNlbWVudCA9IG5ldyBNYXAoKTtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgbWFwU2V0KHJlcGxhY2VtZW50LCByZXBsYWNlUGxhY2Vob2xkZXJzKGssIG1hcCksIHJlcGxhY2VQbGFjZWhvbGRlcnModiwgbWFwKSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NldCc6XG4gICAgICByZXBsYWNlbWVudCA9IG5ldyBTZXQoKTtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgc2V0QWRkKHJlcGxhY2VtZW50LCByZXBsYWNlUGxhY2Vob2xkZXJzKHYsIG1hcCkpO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdFcnJvcic6XG4gICAgICB2YWx1ZS5tZXNzYWdlID0gcmVwbGFjZVBsYWNlaG9sZGVycyh2YWx1ZS5tZXNzYWdlLCBtYXApO1xuICAgICAgaWYgKGhhc093bih2YWx1ZSwgJ2NhdXNlJykpIHtcbiAgICAgICAgdmFsdWUuY2F1c2UgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHZhbHVlLmNhdXNlLCBtYXApO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLm5hbWUgPT0gJ0FnZ3JlZ2F0ZUVycm9yJykge1xuICAgICAgICB2YWx1ZS5lcnJvcnMgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHZhbHVlLmVycm9ycywgbWFwKTtcbiAgICAgIH0gLy8gYnJlYWsgb21pdHRlZFxuICAgIGNhc2UgJ0RPTUV4Y2VwdGlvbic6XG4gICAgICBpZiAoRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUpIHtcbiAgICAgICAgdmFsdWUuc3RhY2sgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHZhbHVlLnN0YWNrLCBtYXApO1xuICAgICAgfVxuICB9XG5cbiAgbWFwU2V0KG1hcCwgdmFsdWUsIHJlcGxhY2VtZW50IHx8IHZhbHVlKTtcblxuICByZXR1cm4gcmVwbGFjZW1lbnQgfHwgdmFsdWU7XG59O1xuXG52YXIgdHJ5VG9UcmFuc2ZlciA9IGZ1bmN0aW9uIChyYXdUcmFuc2ZlciwgbWFwKSB7XG4gIGlmICghaXNPYmplY3QocmF3VHJhbnNmZXIpKSB0aHJvdyBUeXBlRXJyb3IoJ1RyYW5zZmVyIG9wdGlvbiBjYW5ub3QgYmUgY29udmVydGVkIHRvIGEgc2VxdWVuY2UnKTtcblxuICB2YXIgdHJhbnNmZXIgPSBbXTtcblxuICBpdGVyYXRlKHJhd1RyYW5zZmVyLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBwdXNoKHRyYW5zZmVyLCBhbk9iamVjdCh2YWx1ZSkpO1xuICB9KTtcblxuICB2YXIgaSA9IDA7XG4gIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZSh0cmFuc2Zlcik7XG4gIHZhciBidWZmZXJzID0gW107XG4gIHZhciB2YWx1ZSwgdHlwZSwgQywgdHJhbnNmZXJyZWQsIGNhbnZhcywgY29udGV4dDtcblxuICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgIHZhbHVlID0gdHJhbnNmZXJbaSsrXTtcblxuICAgIHR5cGUgPSBjbGFzc29mKHZhbHVlKTtcblxuICAgIGlmICh0eXBlID09PSAnQXJyYXlCdWZmZXInKSB7XG4gICAgICBwdXNoKGJ1ZmZlcnMsIHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChtYXBIYXMobWFwLCB2YWx1ZSkpIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0R1cGxpY2F0ZSB0cmFuc2ZlcmFibGUnLCBEQVRBX0NMT05FX0VSUk9SKTtcblxuICAgIGlmIChQUk9QRVJfVFJBTlNGRVIpIHtcbiAgICAgIHRyYW5zZmVycmVkID0gbmF0aXZlU3RydWN0dXJlZENsb25lKHZhbHVlLCB7IHRyYW5zZmVyOiBbdmFsdWVdIH0pO1xuICAgIH0gZWxzZSBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ0ltYWdlQml0bWFwJzpcbiAgICAgICAgQyA9IGdsb2JhbC5PZmZzY3JlZW5DYW52YXM7XG4gICAgICAgIGlmICghaXNDb25zdHJ1Y3RvcihDKSkgdGhyb3dVbnBvbHlmaWxsYWJsZSh0eXBlLCBUUkFOU0ZFUlJJTkcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbnZhcyA9IG5ldyBDKHZhbHVlLndpZHRoLCB2YWx1ZS5oZWlnaHQpO1xuICAgICAgICAgIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnYml0bWFwcmVuZGVyZXInKTtcbiAgICAgICAgICBjb250ZXh0LnRyYW5zZmVyRnJvbUltYWdlQml0bWFwKHZhbHVlKTtcbiAgICAgICAgICB0cmFuc2ZlcnJlZCA9IGNhbnZhcy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0F1ZGlvRGF0YSc6XG4gICAgICBjYXNlICdWaWRlb0ZyYW1lJzpcbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKHZhbHVlLmNsb25lKSB8fCAhaXNDYWxsYWJsZSh2YWx1ZS5jbG9zZSkpIHRocm93VW5wb2x5ZmlsbGFibGUodHlwZSwgVFJBTlNGRVJSSU5HKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmFuc2ZlcnJlZCA9IHZhbHVlLmNsb25lKCk7XG4gICAgICAgICAgdmFsdWUuY2xvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ01lZGlhU291cmNlSGFuZGxlJzpcbiAgICAgIGNhc2UgJ01lc3NhZ2VQb3J0JzpcbiAgICAgIGNhc2UgJ09mZnNjcmVlbkNhbnZhcyc6XG4gICAgICBjYXNlICdSZWFkYWJsZVN0cmVhbSc6XG4gICAgICBjYXNlICdUcmFuc2Zvcm1TdHJlYW0nOlxuICAgICAgY2FzZSAnV3JpdGFibGVTdHJlYW0nOlxuICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUsIFRSQU5TRkVSUklORyk7XG4gICAgfVxuXG4gICAgaWYgKHRyYW5zZmVycmVkID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBET01FeGNlcHRpb24oJ1RoaXMgb2JqZWN0IGNhbm5vdCBiZSB0cmFuc2ZlcnJlZDogJyArIHR5cGUsIERBVEFfQ0xPTkVfRVJST1IpO1xuXG4gICAgbWFwU2V0KG1hcCwgdmFsdWUsIHRyYW5zZmVycmVkKTtcbiAgfVxuXG4gIHJldHVybiBidWZmZXJzO1xufTtcblxudmFyIHRyeVRvVHJhbnNmZXJCdWZmZXJzID0gZnVuY3Rpb24gKHRyYW5zZmVyLCBtYXApIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UodHJhbnNmZXIpO1xuICB2YXIgdmFsdWUsIHRyYW5zZmVycmVkO1xuXG4gIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgdmFsdWUgPSB0cmFuc2ZlcltpKytdO1xuXG4gICAgaWYgKG1hcEhhcyhtYXAsIHZhbHVlKSkgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRHVwbGljYXRlIHRyYW5zZmVyYWJsZScsIERBVEFfQ0xPTkVfRVJST1IpO1xuXG4gICAgaWYgKFBST1BFUl9UUkFOU0ZFUikge1xuICAgICAgdHJhbnNmZXJyZWQgPSBuYXRpdmVTdHJ1Y3R1cmVkQ2xvbmUodmFsdWUsIHsgdHJhbnNmZXI6IFt2YWx1ZV0gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaXNDYWxsYWJsZSh2YWx1ZS50cmFuc2ZlcikpIHRocm93VW5wb2x5ZmlsbGFibGUoJ0FycmF5QnVmZmVyJywgVFJBTlNGRVJSSU5HKTtcbiAgICAgIHRyYW5zZmVycmVkID0gdmFsdWUudHJhbnNmZXIoKTtcbiAgICB9XG5cbiAgICBtYXBTZXQobWFwLCB2YWx1ZSwgdHJhbnNmZXJyZWQpO1xuICB9XG59O1xuXG4vLyBgc3RydWN0dXJlZENsb25lYCBtZXRob2Rcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N0cnVjdHVyZWQtZGF0YS5odG1sI2RvbS1zdHJ1Y3R1cmVkY2xvbmVcbiQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHNoYW06ICFQUk9QRVJfVFJBTlNGRVIsIGZvcmNlZDogRk9SQ0VEX1JFUExBQ0VNRU5UIH0sIHtcbiAgc3RydWN0dXJlZENsb25lOiBmdW5jdGlvbiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUgLyogLCB7IHRyYW5zZmVyIH0gKi8pIHtcbiAgICB2YXIgb3B0aW9ucyA9IHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpID4gMSAmJiAhaXNOdWxsT3JVbmRlZmluZWQoYXJndW1lbnRzWzFdKSA/IGFuT2JqZWN0KGFyZ3VtZW50c1sxXSkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHRyYW5zZmVyID0gb3B0aW9ucyA/IG9wdGlvbnMudHJhbnNmZXIgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHRyYW5zZmVycmVkQnVmZmVycyA9IGZhbHNlO1xuICAgIHZhciBtYXAsIGJ1ZmZlcnM7XG5cbiAgICBpZiAodHJhbnNmZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgYnVmZmVycyA9IHRyeVRvVHJhbnNmZXIodHJhbnNmZXIsIG1hcCk7XG4gICAgICB0cmFuc2ZlcnJlZEJ1ZmZlcnMgPSAhIWxlbmd0aE9mQXJyYXlMaWtlKGJ1ZmZlcnMpO1xuICAgIH1cblxuICAgIHZhciBjbG9uZSA9IHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycyk7XG5cbiAgICAvLyBzaW5jZSBvZiBhbiBpc3N1ZSB3aXRoIGNsb25pbmcgdmlld3Mgb2YgdHJhbnNmZXJyZWQgYnVmZmVycywgd2UgYSBmb3JjZWQgdG8gdHJhbnNmZXIgLyBjbG9uZSB0aGVtIGluIDIgc3RlcHNcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTI2NVxuICAgIGlmICh0cmFuc2ZlcnJlZEJ1ZmZlcnMpIHtcbiAgICAgIG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgIHRyeVRvVHJhbnNmZXJCdWZmZXJzKHRyYW5zZmVyLCBtYXApO1xuICAgICAgY2xvbmUgPSByZXBsYWNlUGxhY2Vob2xkZXJzKGNsb25lLCBtYXApO1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5zdHJ1Y3R1cmVkLWNsb25lLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuY29uc3RydWN0b3IuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gVE9ETzogaW4gY29yZS1qc0A0LCBtb3ZlIC9tb2R1bGVzLyBkZXBlbmRlbmNpZXMgdG8gcHVibGljIGVudHJpZXMgZm9yIGJldHRlciBvcHRpbWl6YXRpb24gYnkgdG9vbHMgbGlrZSBgcHJlc2V0LWVudmBcbl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanNcIik7XG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIFVTRV9OQVRJVkVfVVJMID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3VybC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91cmwtY29uc3RydWN0b3ItZGV0ZWN0aW9uLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanNcIik7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qc1wiKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3Rvci5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyICR0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xudmFyIGdldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qc1wiKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qc1wiKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aC5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcbnZhciBhcnJheVNvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc29ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNvcnQuanNcIik7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBVUkxfU0VBUkNIX1BBUkFNUyA9ICdVUkxTZWFyY2hQYXJhbXMnO1xudmFyIFVSTF9TRUFSQ0hfUEFSQU1TX0lURVJBVE9SID0gVVJMX1NFQVJDSF9QQVJBTVMgKyAnSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoVVJMX1NFQVJDSF9QQVJBTVMpO1xudmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFVSTF9TRUFSQ0hfUEFSQU1TX0lURVJBVE9SKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBBdm9pZCBOb2RlSlMgZXhwZXJpbWVudGFsIHdhcm5pbmdcbnZhciBzYWZlR2V0QnVpbHRJbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghREVTQ1JJUFRPUlMpIHJldHVybiBnbG9iYWxbbmFtZV07XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgbmFtZSk7XG4gIHJldHVybiBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7XG59O1xuXG52YXIgbmF0aXZlRmV0Y2ggPSBzYWZlR2V0QnVpbHRJbignZmV0Y2gnKTtcbnZhciBOYXRpdmVSZXF1ZXN0ID0gc2FmZUdldEJ1aWx0SW4oJ1JlcXVlc3QnKTtcbnZhciBIZWFkZXJzID0gc2FmZUdldEJ1aWx0SW4oJ0hlYWRlcnMnKTtcbnZhciBSZXF1ZXN0UHJvdG90eXBlID0gTmF0aXZlUmVxdWVzdCAmJiBOYXRpdmVSZXF1ZXN0LnByb3RvdHlwZTtcbnZhciBIZWFkZXJzUHJvdG90eXBlID0gSGVhZGVycyAmJiBIZWFkZXJzLnByb3RvdHlwZTtcbnZhciBSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgZGVjb2RlVVJJQ29tcG9uZW50ID0gZ2xvYmFsLmRlY29kZVVSSUNvbXBvbmVudDtcbnZhciBlbmNvZGVVUklDb21wb25lbnQgPSBnbG9iYWwuZW5jb2RlVVJJQ29tcG9uZW50O1xudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgam9pbiA9IHVuY3VycnlUaGlzKFtdLmpvaW4pO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc2hpZnQgPSB1bmN1cnJ5VGhpcyhbXS5zaGlmdCk7XG52YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxudmFyIHBsdXMgPSAvXFwrL2c7XG52YXIgc2VxdWVuY2VzID0gQXJyYXkoNCk7XG5cbnZhciBwZXJjZW50U2VxdWVuY2UgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgcmV0dXJuIHNlcXVlbmNlc1tieXRlcyAtIDFdIHx8IChzZXF1ZW5jZXNbYnl0ZXMgLSAxXSA9IFJlZ0V4cCgnKCg/OiVbXFxcXGRhLWZdezJ9KXsnICsgYnl0ZXMgKyAnfSknLCAnZ2knKSk7XG59O1xuXG52YXIgcGVyY2VudERlY29kZSA9IGZ1bmN0aW9uIChzZXF1ZW5jZSkge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc2VxdWVuY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBzZXF1ZW5jZTtcbiAgfVxufTtcblxudmFyIGRlc2VyaWFsaXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciByZXN1bHQgPSByZXBsYWNlKGl0LCBwbHVzLCAnICcpO1xuICB2YXIgYnl0ZXMgPSA0O1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB3aGlsZSAoYnl0ZXMpIHtcbiAgICAgIHJlc3VsdCA9IHJlcGxhY2UocmVzdWx0LCBwZXJjZW50U2VxdWVuY2UoYnl0ZXMtLSksIHBlcmNlbnREZWNvZGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuXG52YXIgZmluZCA9IC9bIScoKX5dfCUyMC9nO1xuXG52YXIgcmVwbGFjZW1lbnRzID0ge1xuICAnISc6ICclMjEnLFxuICBcIidcIjogJyUyNycsXG4gICcoJzogJyUyOCcsXG4gICcpJzogJyUyOScsXG4gICd+JzogJyU3RScsXG4gICclMjAnOiAnKydcbn07XG5cbnZhciByZXBsYWNlciA9IGZ1bmN0aW9uIChtYXRjaCkge1xuICByZXR1cm4gcmVwbGFjZW1lbnRzW21hdGNoXTtcbn07XG5cbnZhciBzZXJpYWxpemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHJlcGxhY2UoZW5jb2RlVVJJQ29tcG9uZW50KGl0KSwgZmluZCwgcmVwbGFjZXIpO1xufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBJdGVyYXRvcihwYXJhbXMsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IsXG4gICAgaXRlcmF0b3I6IGdldEl0ZXJhdG9yKGdldEludGVybmFsUGFyYW1zU3RhdGUocGFyYW1zKS5lbnRyaWVzKSxcbiAgICBraW5kOiBraW5kXG4gIH0pO1xufSwgJ0l0ZXJhdG9yJywgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlKHRoaXMpO1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBzdGVwID0gc3RhdGUuaXRlcmF0b3IubmV4dCgpO1xuICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICBpZiAoIXN0ZXAuZG9uZSkge1xuICAgIHN0ZXAudmFsdWUgPSBraW5kID09PSAna2V5cycgPyBlbnRyeS5rZXkgOiBraW5kID09PSAndmFsdWVzJyA/IGVudHJ5LnZhbHVlIDogW2VudHJ5LmtleSwgZW50cnkudmFsdWVdO1xuICB9IHJldHVybiBzdGVwO1xufSwgdHJ1ZSk7XG5cbnZhciBVUkxTZWFyY2hQYXJhbXNTdGF0ZSA9IGZ1bmN0aW9uIChpbml0KSB7XG4gIHRoaXMuZW50cmllcyA9IFtdO1xuICB0aGlzLnVybCA9IG51bGw7XG5cbiAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChpc09iamVjdChpbml0KSkgdGhpcy5wYXJzZU9iamVjdChpbml0KTtcbiAgICBlbHNlIHRoaXMucGFyc2VRdWVyeSh0eXBlb2YgaW5pdCA9PSAnc3RyaW5nJyA/IGNoYXJBdChpbml0LCAwKSA9PT0gJz8nID8gc3RyaW5nU2xpY2UoaW5pdCwgMSkgOiBpbml0IDogJHRvU3RyaW5nKGluaXQpKTtcbiAgfVxufTtcblxuVVJMU2VhcmNoUGFyYW1zU3RhdGUucHJvdG90eXBlID0ge1xuICB0eXBlOiBVUkxfU0VBUkNIX1BBUkFNUyxcbiAgYmluZFVSTDogZnVuY3Rpb24gKHVybCkge1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH0sXG4gIHBhcnNlT2JqZWN0OiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2Qob2JqZWN0KTtcbiAgICB2YXIgaXRlcmF0b3IsIG5leHQsIHN0ZXAsIGVudHJ5SXRlcmF0b3IsIGVudHJ5TmV4dCwgZmlyc3QsIHNlY29uZDtcblxuICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihvYmplY3QsIGl0ZXJhdG9yTWV0aG9kKTtcbiAgICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgICAgd2hpbGUgKCEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lKSB7XG4gICAgICAgIGVudHJ5SXRlcmF0b3IgPSBnZXRJdGVyYXRvcihhbk9iamVjdChzdGVwLnZhbHVlKSk7XG4gICAgICAgIGVudHJ5TmV4dCA9IGVudHJ5SXRlcmF0b3IubmV4dDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChmaXJzdCA9IGNhbGwoZW50cnlOZXh0LCBlbnRyeUl0ZXJhdG9yKSkuZG9uZSB8fFxuICAgICAgICAgIChzZWNvbmQgPSBjYWxsKGVudHJ5TmV4dCwgZW50cnlJdGVyYXRvcikpLmRvbmUgfHxcbiAgICAgICAgICAhY2FsbChlbnRyeU5leHQsIGVudHJ5SXRlcmF0b3IpLmRvbmVcbiAgICAgICAgKSB0aHJvdyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHNlcXVlbmNlIHdpdGggbGVuZ3RoIDInKTtcbiAgICAgICAgcHVzaCh0aGlzLmVudHJpZXMsIHsga2V5OiAkdG9TdHJpbmcoZmlyc3QudmFsdWUpLCB2YWx1ZTogJHRvU3RyaW5nKHNlY29uZC52YWx1ZSkgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGZvciAodmFyIGtleSBpbiBvYmplY3QpIGlmIChoYXNPd24ob2JqZWN0LCBrZXkpKSB7XG4gICAgICBwdXNoKHRoaXMuZW50cmllcywgeyBrZXk6IGtleSwgdmFsdWU6ICR0b1N0cmluZyhvYmplY3Rba2V5XSkgfSk7XG4gICAgfVxuICB9LFxuICBwYXJzZVF1ZXJ5OiBmdW5jdGlvbiAocXVlcnkpIHtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3BsaXQocXVlcnksICcmJyk7XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIGF0dHJpYnV0ZSwgZW50cnk7XG4gICAgICB3aGlsZSAoaW5kZXggPCBhdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2luZGV4KytdO1xuICAgICAgICBpZiAoYXR0cmlidXRlLmxlbmd0aCkge1xuICAgICAgICAgIGVudHJ5ID0gc3BsaXQoYXR0cmlidXRlLCAnPScpO1xuICAgICAgICAgIHB1c2godGhpcy5lbnRyaWVzLCB7XG4gICAgICAgICAgICBrZXk6IGRlc2VyaWFsaXplKHNoaWZ0KGVudHJ5KSksXG4gICAgICAgICAgICB2YWx1ZTogZGVzZXJpYWxpemUoam9pbihlbnRyeSwgJz0nKSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgc2VyaWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXgrK107XG4gICAgICBwdXNoKHJlc3VsdCwgc2VyaWFsaXplKGVudHJ5LmtleSkgKyAnPScgKyBzZXJpYWxpemUoZW50cnkudmFsdWUpKTtcbiAgICB9IHJldHVybiBqb2luKHJlc3VsdCwgJyYnKTtcbiAgfSxcbiAgdXBkYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wYXJzZVF1ZXJ5KHRoaXMudXJsLnF1ZXJ5KTtcbiAgfSxcbiAgdXBkYXRlVVJMOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMudXJsKSB0aGlzLnVybC51cGRhdGUoKTtcbiAgfVxufTtcblxuLy8gYFVSTFNlYXJjaFBhcmFtc2AgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jaW50ZXJmYWNlLXVybHNlYXJjaHBhcmFtc1xudmFyIFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yID0gZnVuY3Rpb24gVVJMU2VhcmNoUGFyYW1zKC8qIGluaXQgKi8pIHtcbiAgYW5JbnN0YW5jZSh0aGlzLCBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUpO1xuICB2YXIgaW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgc3RhdGUgPSBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIG5ldyBVUkxTZWFyY2hQYXJhbXNTdGF0ZShpbml0KSk7XG4gIGlmICghREVTQ1JJUFRPUlMpIHRoaXMuc2l6ZSA9IHN0YXRlLmVudHJpZXMubGVuZ3RoO1xufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSA9IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuZGVmaW5lQnVpbHRJbnMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCB7XG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmFwcGVuZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1hcHBlbmRcbiAgYXBwZW5kOiBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDIpO1xuICAgIHB1c2goc3RhdGUuZW50cmllcywgeyBrZXk6ICR0b1N0cmluZyhuYW1lKSwgdmFsdWU6ICR0b1N0cmluZyh2YWx1ZSkgfSk7XG4gICAgaWYgKCFERVNDUklQVE9SUykgdGhpcy5sZW5ndGgrKztcbiAgICBzdGF0ZS51cGRhdGVVUkwoKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZGVsZXRlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWRlbGV0ZVxuICAnZGVsZXRlJzogZnVuY3Rpb24gKG5hbWUgLyogLCB2YWx1ZSAqLykge1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBlbnRyaWVzID0gc3RhdGUuZW50cmllcztcbiAgICB2YXIga2V5ID0gJHRvU3RyaW5nKG5hbWUpO1xuICAgIHZhciAkdmFsdWUgPSBsZW5ndGggPCAyID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICAgIHZhciB2YWx1ZSA9ICR2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJHZhbHVlIDogJHRvU3RyaW5nKCR2YWx1ZSk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICBpZiAoZW50cnkua2V5ID09PSBrZXkgJiYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgZW50cnkudmFsdWUgPT09IHZhbHVlKSkge1xuICAgICAgICBzcGxpY2UoZW50cmllcywgaW5kZXgsIDEpO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICB9IGVsc2UgaW5kZXgrKztcbiAgICB9XG4gICAgaWYgKCFERVNDUklQVE9SUykgdGhpcy5zaXplID0gZW50cmllcy5sZW5ndGg7XG4gICAgc3RhdGUudXBkYXRlVVJMKCk7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmdldGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1nZXRcbiAgZ2V0OiBmdW5jdGlvbiBnZXQobmFtZSkge1xuICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBrZXkgPSAkdG9TdHJpbmcobmFtZSk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBmb3IgKDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKGVudHJpZXNbaW5kZXhdLmtleSA9PT0ga2V5KSByZXR1cm4gZW50cmllc1tpbmRleF0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5nZXRBbGxgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtZ2V0YWxsXG4gIGdldEFsbDogZnVuY3Rpb24gZ2V0QWxsKG5hbWUpIHtcbiAgICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllcztcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIga2V5ID0gJHRvU3RyaW5nKG5hbWUpO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoZW50cmllc1tpbmRleF0ua2V5ID09PSBrZXkpIHB1c2gocmVzdWx0LCBlbnRyaWVzW2luZGV4XS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmhhc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1oYXNcbiAgaGFzOiBmdW5jdGlvbiBoYXMobmFtZSAvKiAsIHZhbHVlICovKSB7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7XG4gICAgdmFyIGxlbmd0aCA9IHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBrZXkgPSAkdG9TdHJpbmcobmFtZSk7XG4gICAgdmFyICR2YWx1ZSA9IGxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07XG4gICAgdmFyIHZhbHVlID0gJHZhbHVlID09PSB1bmRlZmluZWQgPyAkdmFsdWUgOiAkdG9TdHJpbmcoJHZhbHVlKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4KytdO1xuICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5ICYmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LnZhbHVlID09PSB2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnNldGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1zZXRcbiAgc2V0OiBmdW5jdGlvbiBzZXQobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBlbnRyaWVzID0gc3RhdGUuZW50cmllcztcbiAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICB2YXIga2V5ID0gJHRvU3RyaW5nKG5hbWUpO1xuICAgIHZhciB2YWwgPSAkdG9TdHJpbmcodmFsdWUpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5KSB7XG4gICAgICAgIGlmIChmb3VuZCkgc3BsaWNlKGVudHJpZXMsIGluZGV4LS0sIDEpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgZW50cnkudmFsdWUgPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmb3VuZCkgcHVzaChlbnRyaWVzLCB7IGtleToga2V5LCB2YWx1ZTogdmFsIH0pO1xuICAgIGlmICghREVTQ1JJUFRPUlMpIHRoaXMuc2l6ZSA9IGVudHJpZXMubGVuZ3RoO1xuICAgIHN0YXRlLnVwZGF0ZVVSTCgpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5zb3J0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLXNvcnRcbiAgc29ydDogZnVuY3Rpb24gc29ydCgpIHtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIGFycmF5U29ydChzdGF0ZS5lbnRyaWVzLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEua2V5ID4gYi5rZXkgPyAxIDogLTE7XG4gICAgfSk7XG4gICAgc3RhdGUudXBkYXRlVVJMKCk7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFjaywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXgrK107XG4gICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgIH1cbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4gIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAna2V5cycpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZFxuICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcbiAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICd2YWx1ZXMnKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kXG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAnZW50cmllcycpO1xuICB9XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2RcbmRlZmluZUJ1aWx0SW4oVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCBJVEVSQVRPUiwgVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLmVudHJpZXMsIHsgbmFtZTogJ2VudHJpZXMnIH0pO1xuXG4vLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHNlYXJjaHBhcmFtcy1zdHJpbmdpZmljYXRpb24tYmVoYXZpb3JcbmRlZmluZUJ1aWx0SW4oVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuc2VyaWFsaXplKCk7XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnNpemVgIGdldHRlclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy91cmwvcHVsbC83MzRcbmlmIChERVNDUklQVE9SUykgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSwgJ3NpemUnLCB7XG4gIGdldDogZnVuY3Rpb24gc2l6ZSgpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzLmxlbmd0aDtcbiAgfSxcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlXG59KTtcblxuc2V0VG9TdHJpbmdUYWcoVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IsIFVSTF9TRUFSQ0hfUEFSQU1TKTtcblxuJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIGZvcmNlZDogIVVTRV9OQVRJVkVfVVJMIH0sIHtcbiAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvclxufSk7XG5cbi8vIFdyYXAgYGZldGNoYCBhbmQgYFJlcXVlc3RgIGZvciBjb3JyZWN0IHdvcmsgd2l0aCBwb2x5ZmlsbGVkIGBVUkxTZWFyY2hQYXJhbXNgXG5pZiAoIVVTRV9OQVRJVkVfVVJMICYmIGlzQ2FsbGFibGUoSGVhZGVycykpIHtcbiAgdmFyIGhlYWRlcnNIYXMgPSB1bmN1cnJ5VGhpcyhIZWFkZXJzUHJvdG90eXBlLmhhcyk7XG4gIHZhciBoZWFkZXJzU2V0ID0gdW5jdXJyeVRoaXMoSGVhZGVyc1Byb3RvdHlwZS5zZXQpO1xuXG4gIHZhciB3cmFwUmVxdWVzdE9wdGlvbnMgPSBmdW5jdGlvbiAoaW5pdCkge1xuICAgIGlmIChpc09iamVjdChpbml0KSkge1xuICAgICAgdmFyIGJvZHkgPSBpbml0LmJvZHk7XG4gICAgICB2YXIgaGVhZGVycztcbiAgICAgIGlmIChjbGFzc29mKGJvZHkpID09PSBVUkxfU0VBUkNIX1BBUkFNUykge1xuICAgICAgICBoZWFkZXJzID0gaW5pdC5oZWFkZXJzID8gbmV3IEhlYWRlcnMoaW5pdC5oZWFkZXJzKSA6IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgIGlmICghaGVhZGVyc0hhcyhoZWFkZXJzLCAnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgICBoZWFkZXJzU2V0KGhlYWRlcnMsICdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlKGluaXQsIHtcbiAgICAgICAgICBib2R5OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgJHRvU3RyaW5nKGJvZHkpKSxcbiAgICAgICAgICBoZWFkZXJzOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgaGVhZGVycylcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSByZXR1cm4gaW5pdDtcbiAgfTtcblxuICBpZiAoaXNDYWxsYWJsZShuYXRpdmVGZXRjaCkpIHtcbiAgICAkKHsgZ2xvYmFsOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBkb250Q2FsbEdldFNldDogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHtcbiAgICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUZldGNoKGlucHV0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHdyYXBSZXF1ZXN0T3B0aW9ucyhhcmd1bWVudHNbMV0pIDoge30pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzQ2FsbGFibGUoTmF0aXZlUmVxdWVzdCkpIHtcbiAgICB2YXIgUmVxdWVzdENvbnN0cnVjdG9yID0gZnVuY3Rpb24gUmVxdWVzdChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgIGFuSW5zdGFuY2UodGhpcywgUmVxdWVzdFByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gbmV3IE5hdGl2ZVJlcXVlc3QoaW5wdXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gd3JhcFJlcXVlc3RPcHRpb25zKGFyZ3VtZW50c1sxXSkgOiB7fSk7XG4gICAgfTtcblxuICAgIFJlcXVlc3RQcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZXF1ZXN0Q29uc3RydWN0b3I7XG4gICAgUmVxdWVzdENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IFJlcXVlc3RQcm90b3R5cGU7XG5cbiAgICAkKHsgZ2xvYmFsOiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgZG9udENhbGxHZXRTZXQ6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgICBSZXF1ZXN0OiBSZXF1ZXN0Q29uc3RydWN0b3JcbiAgICB9KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvcixcbiAgZ2V0U3RhdGU6IGdldEludGVybmFsUGFyYW1zU3RhdGVcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmRlbGV0ZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzXCIpO1xuXG52YXIgJFVSTFNlYXJjaFBhcmFtcyA9IFVSTFNlYXJjaFBhcmFtcztcbnZhciBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUgPSAkVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTtcbnZhciBhcHBlbmQgPSB1bmN1cnJ5VGhpcyhVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuYXBwZW5kKTtcbnZhciAkZGVsZXRlID0gdW5jdXJyeVRoaXMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlWydkZWxldGUnXSk7XG52YXIgZm9yRWFjaCA9IHVuY3VycnlUaGlzKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZS5mb3JFYWNoKTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgcGFyYW1zID0gbmV3ICRVUkxTZWFyY2hQYXJhbXMoJ2E9MSZhPTImYj0zJyk7XG5cbnBhcmFtc1snZGVsZXRlJ10oJ2EnLCAxKTtcbi8vIGB1bmRlZmluZWRgIGNhc2UgaXMgYSBDaHJvbWl1bSAxMTcgYnVnXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xNDIyMlxucGFyYW1zWydkZWxldGUnXSgnYicsIHVuZGVmaW5lZCk7XG5cbmlmIChwYXJhbXMgKyAnJyAhPT0gJ2E9MicpIHtcbiAgZGVmaW5lQnVpbHRJbihVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsICdkZWxldGUnLCBmdW5jdGlvbiAobmFtZSAvKiAsIHZhbHVlICovKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyICR2YWx1ZSA9IGxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07XG4gICAgaWYgKGxlbmd0aCAmJiAkdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuICRkZWxldGUodGhpcywgbmFtZSk7XG4gICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICBmb3JFYWNoKHRoaXMsIGZ1bmN0aW9uICh2LCBrKSB7IC8vIGFsc28gdmFsaWRhdGVzIGB0aGlzYFxuICAgICAgcHVzaChlbnRyaWVzLCB7IGtleTogaywgdmFsdWU6IHYgfSk7XG4gICAgfSk7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgobGVuZ3RoLCAxKTtcbiAgICB2YXIga2V5ID0gdG9TdHJpbmcobmFtZSk7XG4gICAgdmFyIHZhbHVlID0gdG9TdHJpbmcoJHZhbHVlKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBkaW5kZXggPSAwO1xuICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuICAgIHZhciBlbnRyaWVzTGVuZ3RoID0gZW50cmllcy5sZW5ndGg7XG4gICAgdmFyIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXNMZW5ndGgpIHtcbiAgICAgIGVudHJ5ID0gZW50cmllc1tpbmRleCsrXTtcbiAgICAgIGlmIChmb3VuZCB8fCBlbnRyeS5rZXkgPT09IGtleSkge1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICRkZWxldGUodGhpcywgZW50cnkua2V5KTtcbiAgICAgIH0gZWxzZSBkaW5kZXgrKztcbiAgICB9XG4gICAgd2hpbGUgKGRpbmRleCA8IGVudHJpZXNMZW5ndGgpIHtcbiAgICAgIGVudHJ5ID0gZW50cmllc1tkaW5kZXgrK107XG4gICAgICBpZiAoIShlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSA9PT0gdmFsdWUpKSBhcHBlbmQodGhpcywgZW50cnkua2V5LCBlbnRyeS52YWx1ZSk7XG4gICAgfVxuICB9LCB7IGVudW1lcmFibGU6IHRydWUsIHVuc2FmZTogdHJ1ZSB9KTtcbn1cblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmRlbGV0ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmhhcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzXCIpO1xuXG52YXIgJFVSTFNlYXJjaFBhcmFtcyA9IFVSTFNlYXJjaFBhcmFtcztcbnZhciBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUgPSAkVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTtcbnZhciBnZXRBbGwgPSB1bmN1cnJ5VGhpcyhVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuZ2V0QWxsKTtcbnZhciAkaGFzID0gdW5jdXJyeVRoaXMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLmhhcyk7XG52YXIgcGFyYW1zID0gbmV3ICRVUkxTZWFyY2hQYXJhbXMoJ2E9MScpO1xuXG4vLyBgdW5kZWZpbmVkYCBjYXNlIGlzIGEgQ2hyb21pdW0gMTE3IGJ1Z1xuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTQyMjJcbmlmIChwYXJhbXMuaGFzKCdhJywgMikgfHwgIXBhcmFtcy5oYXMoJ2EnLCB1bmRlZmluZWQpKSB7XG4gIGRlZmluZUJ1aWx0SW4oVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCAnaGFzJywgZnVuY3Rpb24gaGFzKG5hbWUgLyogLCB2YWx1ZSAqLykge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciAkdmFsdWUgPSBsZW5ndGggPCAyID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICAgIGlmIChsZW5ndGggJiYgJHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAkaGFzKHRoaXMsIG5hbWUpO1xuICAgIHZhciB2YWx1ZXMgPSBnZXRBbGwodGhpcywgbmFtZSk7IC8vIGFsc28gdmFsaWRhdGVzIGB0aGlzYFxuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGxlbmd0aCwgMSk7XG4gICAgdmFyIHZhbHVlID0gdG9TdHJpbmcoJHZhbHVlKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIGlmICh2YWx1ZXNbaW5kZXgrK10gPT09IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICB9IHJldHVybiBmYWxzZTtcbiAgfSwgeyBlbnVtZXJhYmxlOiB0cnVlLCB1bnNhZmU6IHRydWUgfSk7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5oYXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuY29uc3RydWN0b3IuanNcIik7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLnNpemUuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSA9IFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGU7XG52YXIgZm9yRWFjaCA9IHVuY3VycnlUaGlzKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZS5mb3JFYWNoKTtcblxuLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuc2l6ZWAgZ2V0dGVyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL3VybC9wdWxsLzczNFxuaWYgKERFU0NSSVBUT1JTICYmICEoJ3NpemUnIGluIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSkpIHtcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBzaXplKCkge1xuICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgIGZvckVhY2godGhpcywgZnVuY3Rpb24gKCkgeyBjb3VudCsrOyB9KTtcbiAgICAgIHJldHVybiBjb3VudDtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuc2l6ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5jb25zdHJ1Y3Rvci5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IGluIGNvcmUtanNANCwgbW92ZSAvbW9kdWxlcy8gZGVwZW5kZW5jaWVzIHRvIHB1YmxpYyBlbnRyaWVzIGZvciBiZXR0ZXIgb3B0aW1pemF0aW9uIGJ5IHRvb2xzIGxpa2UgYHByZXNldC1lbnZgXG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanNcIik7XG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBVU0VfTkFUSVZFX1VSTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91cmwtY29uc3RydWN0b3ItZGV0ZWN0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXJsLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzXCIpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgYXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzXCIpO1xudmFyIGFycmF5RnJvbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1mcm9tICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qc1wiKTtcbnZhciBhcnJheVNsaWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlLXNpbXBsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLXNpbXBsZS5qc1wiKTtcbnZhciBjb2RlQXQgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzXCIpLmNvZGVBdCk7XG52YXIgdG9BU0NJSSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkuanNcIik7XG52YXIgJHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzXCIpO1xudmFyIFVSTFNlYXJjaFBhcmFtc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5jb25zdHJ1Y3Rvci5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxVUkxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKCdVUkwnKTtcbnZhciBVUkxTZWFyY2hQYXJhbXMgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuVVJMU2VhcmNoUGFyYW1zO1xudmFyIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuZ2V0U3RhdGU7XG5cbnZhciBOYXRpdmVVUkwgPSBnbG9iYWwuVVJMO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcGFyc2VJbnQgPSBnbG9iYWwucGFyc2VJbnQ7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIHBvdyA9IE1hdGgucG93O1xudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKC8uLy5leGVjKTtcbnZhciBqb2luID0gdW5jdXJyeVRoaXMoW10uam9pbik7XG52YXIgbnVtYmVyVG9TdHJpbmcgPSB1bmN1cnJ5VGhpcygxLjAudG9TdHJpbmcpO1xudmFyIHBvcCA9IHVuY3VycnlUaGlzKFtdLnBvcCk7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBzaGlmdCA9IHVuY3VycnlUaGlzKFtdLnNoaWZ0KTtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciB0b0xvd2VyQ2FzZSA9IHVuY3VycnlUaGlzKCcnLnRvTG93ZXJDYXNlKTtcbnZhciB1bnNoaWZ0ID0gdW5jdXJyeVRoaXMoW10udW5zaGlmdCk7XG5cbnZhciBJTlZBTElEX0FVVEhPUklUWSA9ICdJbnZhbGlkIGF1dGhvcml0eSc7XG52YXIgSU5WQUxJRF9TQ0hFTUUgPSAnSW52YWxpZCBzY2hlbWUnO1xudmFyIElOVkFMSURfSE9TVCA9ICdJbnZhbGlkIGhvc3QnO1xudmFyIElOVkFMSURfUE9SVCA9ICdJbnZhbGlkIHBvcnQnO1xuXG52YXIgQUxQSEEgPSAvW2Etel0vaTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tb2JzY3VyZS1yYW5nZSAtLSBzYWZlXG52YXIgQUxQSEFOVU1FUklDID0gL1tcXGQrLS5hLXpdL2k7XG52YXIgRElHSVQgPSAvXFxkLztcbnZhciBIRVhfU1RBUlQgPSAvXjB4L2k7XG52YXIgT0NUID0gL15bMC03XSskLztcbnZhciBERUMgPSAvXlxcZCskLztcbnZhciBIRVggPSAvXltcXGRhLWZdKyQvaTtcbi8qIGVzbGludC1kaXNhYmxlIHJlZ2V4cC9uby1jb250cm9sLWNoYXJhY3RlciAtLSBzYWZlICovXG52YXIgRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVCA9IC9bXFwwXFx0XFxuXFxyICMlLzo8Pj9AW1xcXFxcXF1efF0vO1xudmFyIEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlRfRVhDTFVESU5HX1BFUkNFTlQgPSAvW1xcMFxcdFxcblxcciAjLzo8Pj9AW1xcXFxcXF1efF0vO1xudmFyIExFQURJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSA9IC9eW1xcdTAwMDAtXFx1MDAyMF0rLztcbnZhciBUUkFJTElOR19DMF9DT05UUk9MX09SX1NQQUNFID0gLyhefFteXFx1MDAwMC1cXHUwMDIwXSlbXFx1MDAwMC1cXHUwMDIwXSskLztcbnZhciBUQUJfQU5EX05FV19MSU5FID0gL1tcXHRcXG5cXHJdL2c7XG4vKiBlc2xpbnQtZW5hYmxlIHJlZ2V4cC9uby1jb250cm9sLWNoYXJhY3RlciAtLSBzYWZlICovXG52YXIgRU9GO1xuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2lwdjQtbnVtYmVyLXBhcnNlclxudmFyIHBhcnNlSVB2NCA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICB2YXIgcGFydHMgPSBzcGxpdChpbnB1dCwgJy4nKTtcbiAgdmFyIHBhcnRzTGVuZ3RoLCBudW1iZXJzLCBpbmRleCwgcGFydCwgcmFkaXgsIG51bWJlciwgaXB2NDtcbiAgaWYgKHBhcnRzLmxlbmd0aCAmJiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9PSAnJykge1xuICAgIHBhcnRzLmxlbmd0aC0tO1xuICB9XG4gIHBhcnRzTGVuZ3RoID0gcGFydHMubGVuZ3RoO1xuICBpZiAocGFydHNMZW5ndGggPiA0KSByZXR1cm4gaW5wdXQ7XG4gIG51bWJlcnMgPSBbXTtcbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGFydHNMZW5ndGg7IGluZGV4KyspIHtcbiAgICBwYXJ0ID0gcGFydHNbaW5kZXhdO1xuICAgIGlmIChwYXJ0ID09ICcnKSByZXR1cm4gaW5wdXQ7XG4gICAgcmFkaXggPSAxMDtcbiAgICBpZiAocGFydC5sZW5ndGggPiAxICYmIGNoYXJBdChwYXJ0LCAwKSA9PSAnMCcpIHtcbiAgICAgIHJhZGl4ID0gZXhlYyhIRVhfU1RBUlQsIHBhcnQpID8gMTYgOiA4O1xuICAgICAgcGFydCA9IHN0cmluZ1NsaWNlKHBhcnQsIHJhZGl4ID09IDggPyAxIDogMik7XG4gICAgfVxuICAgIGlmIChwYXJ0ID09PSAnJykge1xuICAgICAgbnVtYmVyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFleGVjKHJhZGl4ID09IDEwID8gREVDIDogcmFkaXggPT0gOCA/IE9DVCA6IEhFWCwgcGFydCkpIHJldHVybiBpbnB1dDtcbiAgICAgIG51bWJlciA9IHBhcnNlSW50KHBhcnQsIHJhZGl4KTtcbiAgICB9XG4gICAgcHVzaChudW1iZXJzLCBudW1iZXIpO1xuICB9XG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBhcnRzTGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgbnVtYmVyID0gbnVtYmVyc1tpbmRleF07XG4gICAgaWYgKGluZGV4ID09IHBhcnRzTGVuZ3RoIC0gMSkge1xuICAgICAgaWYgKG51bWJlciA+PSBwb3coMjU2LCA1IC0gcGFydHNMZW5ndGgpKSByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKG51bWJlciA+IDI1NSkgcmV0dXJuIG51bGw7XG4gIH1cbiAgaXB2NCA9IHBvcChudW1iZXJzKTtcbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYmVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBpcHY0ICs9IG51bWJlcnNbaW5kZXhdICogcG93KDI1NiwgMyAtIGluZGV4KTtcbiAgfVxuICByZXR1cm4gaXB2NDtcbn07XG5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1pcHY2LXBhcnNlclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzIC0tIFRPRE9cbnZhciBwYXJzZUlQdjYgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIGFkZHJlc3MgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG4gIHZhciBwaWVjZUluZGV4ID0gMDtcbiAgdmFyIGNvbXByZXNzID0gbnVsbDtcbiAgdmFyIHBvaW50ZXIgPSAwO1xuICB2YXIgdmFsdWUsIGxlbmd0aCwgbnVtYmVyc1NlZW4sIGlwdjRQaWVjZSwgbnVtYmVyLCBzd2Fwcywgc3dhcDtcblxuICB2YXIgY2hyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjaGFyQXQoaW5wdXQsIHBvaW50ZXIpO1xuICB9O1xuXG4gIGlmIChjaHIoKSA9PSAnOicpIHtcbiAgICBpZiAoY2hhckF0KGlucHV0LCAxKSAhPSAnOicpIHJldHVybjtcbiAgICBwb2ludGVyICs9IDI7XG4gICAgcGllY2VJbmRleCsrO1xuICAgIGNvbXByZXNzID0gcGllY2VJbmRleDtcbiAgfVxuICB3aGlsZSAoY2hyKCkpIHtcbiAgICBpZiAocGllY2VJbmRleCA9PSA4KSByZXR1cm47XG4gICAgaWYgKGNocigpID09ICc6Jykge1xuICAgICAgaWYgKGNvbXByZXNzICE9PSBudWxsKSByZXR1cm47XG4gICAgICBwb2ludGVyKys7XG4gICAgICBwaWVjZUluZGV4Kys7XG4gICAgICBjb21wcmVzcyA9IHBpZWNlSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFsdWUgPSBsZW5ndGggPSAwO1xuICAgIHdoaWxlIChsZW5ndGggPCA0ICYmIGV4ZWMoSEVYLCBjaHIoKSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUgKiAxNiArIHBhcnNlSW50KGNocigpLCAxNik7XG4gICAgICBwb2ludGVyKys7XG4gICAgICBsZW5ndGgrKztcbiAgICB9XG4gICAgaWYgKGNocigpID09ICcuJykge1xuICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICBwb2ludGVyIC09IGxlbmd0aDtcbiAgICAgIGlmIChwaWVjZUluZGV4ID4gNikgcmV0dXJuO1xuICAgICAgbnVtYmVyc1NlZW4gPSAwO1xuICAgICAgd2hpbGUgKGNocigpKSB7XG4gICAgICAgIGlwdjRQaWVjZSA9IG51bGw7XG4gICAgICAgIGlmIChudW1iZXJzU2VlbiA+IDApIHtcbiAgICAgICAgICBpZiAoY2hyKCkgPT0gJy4nICYmIG51bWJlcnNTZWVuIDwgNCkgcG9pbnRlcisrO1xuICAgICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXhlYyhESUdJVCwgY2hyKCkpKSByZXR1cm47XG4gICAgICAgIHdoaWxlIChleGVjKERJR0lULCBjaHIoKSkpIHtcbiAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChjaHIoKSwgMTApO1xuICAgICAgICAgIGlmIChpcHY0UGllY2UgPT09IG51bGwpIGlwdjRQaWVjZSA9IG51bWJlcjtcbiAgICAgICAgICBlbHNlIGlmIChpcHY0UGllY2UgPT0gMCkgcmV0dXJuO1xuICAgICAgICAgIGVsc2UgaXB2NFBpZWNlID0gaXB2NFBpZWNlICogMTAgKyBudW1iZXI7XG4gICAgICAgICAgaWYgKGlwdjRQaWVjZSA+IDI1NSkgcmV0dXJuO1xuICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgfVxuICAgICAgICBhZGRyZXNzW3BpZWNlSW5kZXhdID0gYWRkcmVzc1twaWVjZUluZGV4XSAqIDI1NiArIGlwdjRQaWVjZTtcbiAgICAgICAgbnVtYmVyc1NlZW4rKztcbiAgICAgICAgaWYgKG51bWJlcnNTZWVuID09IDIgfHwgbnVtYmVyc1NlZW4gPT0gNCkgcGllY2VJbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKG51bWJlcnNTZWVuICE9IDQpIHJldHVybjtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAoY2hyKCkgPT0gJzonKSB7XG4gICAgICBwb2ludGVyKys7XG4gICAgICBpZiAoIWNocigpKSByZXR1cm47XG4gICAgfSBlbHNlIGlmIChjaHIoKSkgcmV0dXJuO1xuICAgIGFkZHJlc3NbcGllY2VJbmRleCsrXSA9IHZhbHVlO1xuICB9XG4gIGlmIChjb21wcmVzcyAhPT0gbnVsbCkge1xuICAgIHN3YXBzID0gcGllY2VJbmRleCAtIGNvbXByZXNzO1xuICAgIHBpZWNlSW5kZXggPSA3O1xuICAgIHdoaWxlIChwaWVjZUluZGV4ICE9IDAgJiYgc3dhcHMgPiAwKSB7XG4gICAgICBzd2FwID0gYWRkcmVzc1twaWVjZUluZGV4XTtcbiAgICAgIGFkZHJlc3NbcGllY2VJbmRleC0tXSA9IGFkZHJlc3NbY29tcHJlc3MgKyBzd2FwcyAtIDFdO1xuICAgICAgYWRkcmVzc1tjb21wcmVzcyArIC0tc3dhcHNdID0gc3dhcDtcbiAgICB9XG4gIH0gZWxzZSBpZiAocGllY2VJbmRleCAhPSA4KSByZXR1cm47XG4gIHJldHVybiBhZGRyZXNzO1xufTtcblxudmFyIGZpbmRMb25nZXN0WmVyb1NlcXVlbmNlID0gZnVuY3Rpb24gKGlwdjYpIHtcbiAgdmFyIG1heEluZGV4ID0gbnVsbDtcbiAgdmFyIG1heExlbmd0aCA9IDE7XG4gIHZhciBjdXJyU3RhcnQgPSBudWxsO1xuICB2YXIgY3Vyckxlbmd0aCA9IDA7XG4gIHZhciBpbmRleCA9IDA7XG4gIGZvciAoOyBpbmRleCA8IDg7IGluZGV4KyspIHtcbiAgICBpZiAoaXB2NltpbmRleF0gIT09IDApIHtcbiAgICAgIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgIG1heEluZGV4ID0gY3VyclN0YXJ0O1xuICAgICAgICBtYXhMZW5ndGggPSBjdXJyTGVuZ3RoO1xuICAgICAgfVxuICAgICAgY3VyclN0YXJ0ID0gbnVsbDtcbiAgICAgIGN1cnJMZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY3VyclN0YXJ0ID09PSBudWxsKSBjdXJyU3RhcnQgPSBpbmRleDtcbiAgICAgICsrY3Vyckxlbmd0aDtcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJMZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICBtYXhJbmRleCA9IGN1cnJTdGFydDtcbiAgICBtYXhMZW5ndGggPSBjdXJyTGVuZ3RoO1xuICB9XG4gIHJldHVybiBtYXhJbmRleDtcbn07XG5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jaG9zdC1zZXJpYWxpemluZ1xudmFyIHNlcmlhbGl6ZUhvc3QgPSBmdW5jdGlvbiAoaG9zdCkge1xuICB2YXIgcmVzdWx0LCBpbmRleCwgY29tcHJlc3MsIGlnbm9yZTA7XG4gIC8vIGlwdjRcbiAgaWYgKHR5cGVvZiBob3N0ID09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0ID0gW107XG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykge1xuICAgICAgdW5zaGlmdChyZXN1bHQsIGhvc3QgJSAyNTYpO1xuICAgICAgaG9zdCA9IGZsb29yKGhvc3QgLyAyNTYpO1xuICAgIH0gcmV0dXJuIGpvaW4ocmVzdWx0LCAnLicpO1xuICAvLyBpcHY2XG4gIH0gZWxzZSBpZiAodHlwZW9mIGhvc3QgPT0gJ29iamVjdCcpIHtcbiAgICByZXN1bHQgPSAnJztcbiAgICBjb21wcmVzcyA9IGZpbmRMb25nZXN0WmVyb1NlcXVlbmNlKGhvc3QpO1xuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspIHtcbiAgICAgIGlmIChpZ25vcmUwICYmIGhvc3RbaW5kZXhdID09PSAwKSBjb250aW51ZTtcbiAgICAgIGlmIChpZ25vcmUwKSBpZ25vcmUwID0gZmFsc2U7XG4gICAgICBpZiAoY29tcHJlc3MgPT09IGluZGV4KSB7XG4gICAgICAgIHJlc3VsdCArPSBpbmRleCA/ICc6JyA6ICc6Oic7XG4gICAgICAgIGlnbm9yZTAgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IG51bWJlclRvU3RyaW5nKGhvc3RbaW5kZXhdLCAxNik7XG4gICAgICAgIGlmIChpbmRleCA8IDcpIHJlc3VsdCArPSAnOic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnWycgKyByZXN1bHQgKyAnXSc7XG4gIH0gcmV0dXJuIGhvc3Q7XG59O1xuXG52YXIgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCA9IHt9O1xudmFyIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCwge1xuICAnICc6IDEsICdcIic6IDEsICc8JzogMSwgJz4nOiAxLCAnYCc6IDFcbn0pO1xudmFyIHBhdGhQZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBmcmFnbWVudFBlcmNlbnRFbmNvZGVTZXQsIHtcbiAgJyMnOiAxLCAnPyc6IDEsICd7JzogMSwgJ30nOiAxXG59KTtcbnZhciB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQgPSBhc3NpZ24oe30sIHBhdGhQZXJjZW50RW5jb2RlU2V0LCB7XG4gICcvJzogMSwgJzonOiAxLCAnOyc6IDEsICc9JzogMSwgJ0AnOiAxLCAnWyc6IDEsICdcXFxcJzogMSwgJ10nOiAxLCAnXic6IDEsICd8JzogMVxufSk7XG5cbnZhciBwZXJjZW50RW5jb2RlID0gZnVuY3Rpb24gKGNociwgc2V0KSB7XG4gIHZhciBjb2RlID0gY29kZUF0KGNociwgMCk7XG4gIHJldHVybiBjb2RlID4gMHgyMCAmJiBjb2RlIDwgMHg3RiAmJiAhaGFzT3duKHNldCwgY2hyKSA/IGNociA6IGVuY29kZVVSSUNvbXBvbmVudChjaHIpO1xufTtcblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzcGVjaWFsLXNjaGVtZVxudmFyIHNwZWNpYWxTY2hlbWVzID0ge1xuICBmdHA6IDIxLFxuICBmaWxlOiBudWxsLFxuICBodHRwOiA4MCxcbiAgaHR0cHM6IDQ0MyxcbiAgd3M6IDgwLFxuICB3c3M6IDQ0M1xufTtcblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN3aW5kb3dzLWRyaXZlLWxldHRlclxudmFyIGlzV2luZG93c0RyaXZlTGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZywgbm9ybWFsaXplZCkge1xuICB2YXIgc2Vjb25kO1xuICByZXR1cm4gc3RyaW5nLmxlbmd0aCA9PSAyICYmIGV4ZWMoQUxQSEEsIGNoYXJBdChzdHJpbmcsIDApKVxuICAgICYmICgoc2Vjb25kID0gY2hhckF0KHN0cmluZywgMSkpID09ICc6JyB8fCAoIW5vcm1hbGl6ZWQgJiYgc2Vjb25kID09ICd8JykpO1xufTtcblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzdGFydC13aXRoLWEtd2luZG93cy1kcml2ZS1sZXR0ZXJcbnZhciBzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgdGhpcmQ7XG4gIHJldHVybiBzdHJpbmcubGVuZ3RoID4gMSAmJiBpc1dpbmRvd3NEcml2ZUxldHRlcihzdHJpbmdTbGljZShzdHJpbmcsIDAsIDIpKSAmJiAoXG4gICAgc3RyaW5nLmxlbmd0aCA9PSAyIHx8XG4gICAgKCh0aGlyZCA9IGNoYXJBdChzdHJpbmcsIDIpKSA9PT0gJy8nIHx8IHRoaXJkID09PSAnXFxcXCcgfHwgdGhpcmQgPT09ICc/JyB8fCB0aGlyZCA9PT0gJyMnKVxuICApO1xufTtcblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzaW5nbGUtZG90LXBhdGgtc2VnbWVudFxudmFyIGlzU2luZ2xlRG90ID0gZnVuY3Rpb24gKHNlZ21lbnQpIHtcbiAgcmV0dXJuIHNlZ21lbnQgPT09ICcuJyB8fCB0b0xvd2VyQ2FzZShzZWdtZW50KSA9PT0gJyUyZSc7XG59O1xuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvdWJsZS1kb3QtcGF0aC1zZWdtZW50XG52YXIgaXNEb3VibGVEb3QgPSBmdW5jdGlvbiAoc2VnbWVudCkge1xuICBzZWdtZW50ID0gdG9Mb3dlckNhc2Uoc2VnbWVudCk7XG4gIHJldHVybiBzZWdtZW50ID09PSAnLi4nIHx8IHNlZ21lbnQgPT09ICclMmUuJyB8fCBzZWdtZW50ID09PSAnLiUyZScgfHwgc2VnbWVudCA9PT0gJyUyZSUyZSc7XG59O1xuXG4vLyBTdGF0ZXM6XG52YXIgU0NIRU1FX1NUQVJUID0ge307XG52YXIgU0NIRU1FID0ge307XG52YXIgTk9fU0NIRU1FID0ge307XG52YXIgU1BFQ0lBTF9SRUxBVElWRV9PUl9BVVRIT1JJVFkgPSB7fTtcbnZhciBQQVRIX09SX0FVVEhPUklUWSA9IHt9O1xudmFyIFJFTEFUSVZFID0ge307XG52YXIgUkVMQVRJVkVfU0xBU0ggPSB7fTtcbnZhciBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTID0ge307XG52YXIgU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVMgPSB7fTtcbnZhciBBVVRIT1JJVFkgPSB7fTtcbnZhciBIT1NUID0ge307XG52YXIgSE9TVE5BTUUgPSB7fTtcbnZhciBQT1JUID0ge307XG52YXIgRklMRSA9IHt9O1xudmFyIEZJTEVfU0xBU0ggPSB7fTtcbnZhciBGSUxFX0hPU1QgPSB7fTtcbnZhciBQQVRIX1NUQVJUID0ge307XG52YXIgUEFUSCA9IHt9O1xudmFyIENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEggPSB7fTtcbnZhciBRVUVSWSA9IHt9O1xudmFyIEZSQUdNRU5UID0ge307XG5cbnZhciBVUkxTdGF0ZSA9IGZ1bmN0aW9uICh1cmwsIGlzQmFzZSwgYmFzZSkge1xuICB2YXIgdXJsU3RyaW5nID0gJHRvU3RyaW5nKHVybCk7XG4gIHZhciBiYXNlU3RhdGUsIGZhaWx1cmUsIHNlYXJjaFBhcmFtcztcbiAgaWYgKGlzQmFzZSkge1xuICAgIGZhaWx1cmUgPSB0aGlzLnBhcnNlKHVybFN0cmluZyk7XG4gICAgaWYgKGZhaWx1cmUpIHRocm93IFR5cGVFcnJvcihmYWlsdXJlKTtcbiAgICB0aGlzLnNlYXJjaFBhcmFtcyA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJhc2UgIT09IHVuZGVmaW5lZCkgYmFzZVN0YXRlID0gbmV3IFVSTFN0YXRlKGJhc2UsIHRydWUpO1xuICAgIGZhaWx1cmUgPSB0aGlzLnBhcnNlKHVybFN0cmluZywgbnVsbCwgYmFzZVN0YXRlKTtcbiAgICBpZiAoZmFpbHVyZSkgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpO1xuICAgIHNlYXJjaFBhcmFtcyA9IGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUobmV3IFVSTFNlYXJjaFBhcmFtcygpKTtcbiAgICBzZWFyY2hQYXJhbXMuYmluZFVSTCh0aGlzKTtcbiAgICB0aGlzLnNlYXJjaFBhcmFtcyA9IHNlYXJjaFBhcmFtcztcbiAgfVxufTtcblxuVVJMU3RhdGUucHJvdG90eXBlID0ge1xuICB0eXBlOiAnVVJMJyxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmwtcGFyc2luZ1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHMgLS0gVE9ET1xuICBwYXJzZTogZnVuY3Rpb24gKGlucHV0LCBzdGF0ZU92ZXJyaWRlLCBiYXNlKSB7XG4gICAgdmFyIHVybCA9IHRoaXM7XG4gICAgdmFyIHN0YXRlID0gc3RhdGVPdmVycmlkZSB8fCBTQ0hFTUVfU1RBUlQ7XG4gICAgdmFyIHBvaW50ZXIgPSAwO1xuICAgIHZhciBidWZmZXIgPSAnJztcbiAgICB2YXIgc2VlbkF0ID0gZmFsc2U7XG4gICAgdmFyIHNlZW5CcmFja2V0ID0gZmFsc2U7XG4gICAgdmFyIHNlZW5QYXNzd29yZFRva2VuID0gZmFsc2U7XG4gICAgdmFyIGNvZGVQb2ludHMsIGNociwgYnVmZmVyQ29kZVBvaW50cywgZmFpbHVyZTtcblxuICAgIGlucHV0ID0gJHRvU3RyaW5nKGlucHV0KTtcblxuICAgIGlmICghc3RhdGVPdmVycmlkZSkge1xuICAgICAgdXJsLnNjaGVtZSA9ICcnO1xuICAgICAgdXJsLnVzZXJuYW1lID0gJyc7XG4gICAgICB1cmwucGFzc3dvcmQgPSAnJztcbiAgICAgIHVybC5ob3N0ID0gbnVsbDtcbiAgICAgIHVybC5wb3J0ID0gbnVsbDtcbiAgICAgIHVybC5wYXRoID0gW107XG4gICAgICB1cmwucXVlcnkgPSBudWxsO1xuICAgICAgdXJsLmZyYWdtZW50ID0gbnVsbDtcbiAgICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gZmFsc2U7XG4gICAgICBpbnB1dCA9IHJlcGxhY2UoaW5wdXQsIExFQURJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSwgJycpO1xuICAgICAgaW5wdXQgPSByZXBsYWNlKGlucHV0LCBUUkFJTElOR19DMF9DT05UUk9MX09SX1NQQUNFLCAnJDEnKTtcbiAgICB9XG5cbiAgICBpbnB1dCA9IHJlcGxhY2UoaW5wdXQsIFRBQl9BTkRfTkVXX0xJTkUsICcnKTtcblxuICAgIGNvZGVQb2ludHMgPSBhcnJheUZyb20oaW5wdXQpO1xuXG4gICAgd2hpbGUgKHBvaW50ZXIgPD0gY29kZVBvaW50cy5sZW5ndGgpIHtcbiAgICAgIGNociA9IGNvZGVQb2ludHNbcG9pbnRlcl07XG4gICAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICAgIGNhc2UgU0NIRU1FX1NUQVJUOlxuICAgICAgICAgIGlmIChjaHIgJiYgZXhlYyhBTFBIQSwgY2hyKSkge1xuICAgICAgICAgICAgYnVmZmVyICs9IHRvTG93ZXJDYXNlKGNocik7XG4gICAgICAgICAgICBzdGF0ZSA9IFNDSEVNRTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IE5PX1NDSEVNRTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBTQ0hFTUU6XG4gICAgICAgICAgaWYgKGNociAmJiAoZXhlYyhBTFBIQU5VTUVSSUMsIGNocikgfHwgY2hyID09ICcrJyB8fCBjaHIgPT0gJy0nIHx8IGNociA9PSAnLicpKSB7XG4gICAgICAgICAgICBidWZmZXIgKz0gdG9Mb3dlckNhc2UoY2hyKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PSAnOicpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIChcbiAgICAgICAgICAgICAgKHVybC5pc1NwZWNpYWwoKSAhPSBoYXNPd24oc3BlY2lhbFNjaGVtZXMsIGJ1ZmZlcikpIHx8XG4gICAgICAgICAgICAgIChidWZmZXIgPT0gJ2ZpbGUnICYmICh1cmwuaW5jbHVkZXNDcmVkZW50aWFscygpIHx8IHVybC5wb3J0ICE9PSBudWxsKSkgfHxcbiAgICAgICAgICAgICAgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmICF1cmwuaG9zdClcbiAgICAgICAgICAgICkpIHJldHVybjtcbiAgICAgICAgICAgIHVybC5zY2hlbWUgPSBidWZmZXI7XG4gICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgICAgICBpZiAodXJsLmlzU3BlY2lhbCgpICYmIHNwZWNpYWxTY2hlbWVzW3VybC5zY2hlbWVdID09IHVybC5wb3J0KSB1cmwucG9ydCA9IG51bGw7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICAgIHN0YXRlID0gRklMRTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsLmlzU3BlY2lhbCgpICYmIGJhc2UgJiYgYmFzZS5zY2hlbWUgPT0gdXJsLnNjaGVtZSkge1xuICAgICAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfUkVMQVRJVkVfT1JfQVVUSE9SSVRZO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwuaXNTcGVjaWFsKCkpIHtcbiAgICAgICAgICAgICAgc3RhdGUgPSBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnRzW3BvaW50ZXIgKyAxXSA9PSAnLycpIHtcbiAgICAgICAgICAgICAgc3RhdGUgPSBQQVRIX09SX0FVVEhPUklUWTtcbiAgICAgICAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSB0cnVlO1xuICAgICAgICAgICAgICBwdXNoKHVybC5wYXRoLCAnJyk7XG4gICAgICAgICAgICAgIHN0YXRlID0gQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gTk9fU0NIRU1FO1xuICAgICAgICAgICAgcG9pbnRlciA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2UgcmV0dXJuIElOVkFMSURfU0NIRU1FO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgTk9fU0NIRU1FOlxuICAgICAgICAgIGlmICghYmFzZSB8fCAoYmFzZS5jYW5ub3RCZUFCYXNlVVJMICYmIGNociAhPSAnIycpKSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgICAgaWYgKGJhc2UuY2Fubm90QmVBQmFzZVVSTCAmJiBjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuc2NoZW1lID0gYmFzZS5zY2hlbWU7XG4gICAgICAgICAgICB1cmwucGF0aCA9IGFycmF5U2xpY2UoYmFzZS5wYXRoKTtcbiAgICAgICAgICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUgPSBiYXNlLnNjaGVtZSA9PSAnZmlsZScgPyBGSUxFIDogUkVMQVRJVkU7XG4gICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgY2FzZSBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWTpcbiAgICAgICAgICBpZiAoY2hyID09ICcvJyAmJiBjb2RlUG9pbnRzW3BvaW50ZXIgKyAxXSA9PSAnLycpIHtcbiAgICAgICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVM7XG4gICAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gUkVMQVRJVkU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUEFUSF9PUl9BVVRIT1JJVFk6XG4gICAgICAgICAgaWYgKGNociA9PSAnLycpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFTEFUSVZFOlxuICAgICAgICAgIHVybC5zY2hlbWUgPSBiYXNlLnNjaGVtZTtcbiAgICAgICAgICBpZiAoY2hyID09IEVPRikge1xuICAgICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7XG4gICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgICAgdXJsLnBhdGggPSBhcnJheVNsaWNlKGJhc2UucGF0aCk7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hyID09ICcvJyB8fCAoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFJFTEFUSVZFX1NMQVNIO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hyID09ICc/Jykge1xuICAgICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7XG4gICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgICAgdXJsLnBhdGggPSBhcnJheVNsaWNlKGJhc2UucGF0aCk7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lO1xuICAgICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgICAgICB1cmwucGF0aCA9IGFycmF5U2xpY2UoYmFzZS5wYXRoKTtcbiAgICAgICAgICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7XG4gICAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkO1xuICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICB1cmwucG9ydCA9IGJhc2UucG9ydDtcbiAgICAgICAgICAgIHVybC5wYXRoID0gYXJyYXlTbGljZShiYXNlLnBhdGgpO1xuICAgICAgICAgICAgdXJsLnBhdGgubGVuZ3RoLS07XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUkVMQVRJVkVfU0xBU0g6XG4gICAgICAgICAgaWYgKHVybC5pc1NwZWNpYWwoKSAmJiAoY2hyID09ICcvJyB8fCBjaHIgPT0gJ1xcXFwnKSkge1xuICAgICAgICAgICAgc3RhdGUgPSBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PSAnLycpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lO1xuICAgICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgU1BFQ0lBTF9BVVRIT1JJVFlfU0xBU0hFUzpcbiAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTO1xuICAgICAgICAgIGlmIChjaHIgIT0gJy8nIHx8IGNoYXJBdChidWZmZXIsIHBvaW50ZXIgKyAxKSAhPSAnLycpIGNvbnRpbnVlO1xuICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOlxuICAgICAgICAgIGlmIChjaHIgIT0gJy8nICYmIGNociAhPSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIEFVVEhPUklUWTpcbiAgICAgICAgICBpZiAoY2hyID09ICdAJykge1xuICAgICAgICAgICAgaWYgKHNlZW5BdCkgYnVmZmVyID0gJyU0MCcgKyBidWZmZXI7XG4gICAgICAgICAgICBzZWVuQXQgPSB0cnVlO1xuICAgICAgICAgICAgYnVmZmVyQ29kZVBvaW50cyA9IGFycmF5RnJvbShidWZmZXIpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXJDb2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBidWZmZXJDb2RlUG9pbnRzW2ldO1xuICAgICAgICAgICAgICBpZiAoY29kZVBvaW50ID09ICc6JyAmJiAhc2VlblBhc3N3b3JkVG9rZW4pIHtcbiAgICAgICAgICAgICAgICBzZWVuUGFzc3dvcmRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIGVuY29kZWRDb2RlUG9pbnRzID0gcGVyY2VudEVuY29kZShjb2RlUG9pbnQsIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7XG4gICAgICAgICAgICAgIGlmIChzZWVuUGFzc3dvcmRUb2tlbikgdXJsLnBhc3N3b3JkICs9IGVuY29kZWRDb2RlUG9pbnRzO1xuICAgICAgICAgICAgICBlbHNlIHVybC51c2VybmFtZSArPSBlbmNvZGVkQ29kZVBvaW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBjaHIgPT0gRU9GIHx8IGNociA9PSAnLycgfHwgY2hyID09ICc/JyB8fCBjaHIgPT0gJyMnIHx8XG4gICAgICAgICAgICAoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoc2VlbkF0ICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfQVVUSE9SSVRZO1xuICAgICAgICAgICAgcG9pbnRlciAtPSBhcnJheUZyb20oYnVmZmVyKS5sZW5ndGggKyAxO1xuICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IEhPU1Q7XG4gICAgICAgICAgfSBlbHNlIGJ1ZmZlciArPSBjaHI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBIT1NUOlxuICAgICAgICBjYXNlIEhPU1ROQU1FOlxuICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEZJTEVfSE9TVDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hyID09ICc6JyAmJiAhc2VlbkJyYWNrZXQpIHtcbiAgICAgICAgICAgIGlmIChidWZmZXIgPT0gJycpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICAgICAgICBmYWlsdXJlID0gdXJsLnBhcnNlSG9zdChidWZmZXIpO1xuICAgICAgICAgICAgaWYgKGZhaWx1cmUpIHJldHVybiBmYWlsdXJlO1xuICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IFBPUlQ7XG4gICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSA9PSBIT1NUTkFNRSkgcmV0dXJuO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBjaHIgPT0gRU9GIHx8IGNociA9PSAnLycgfHwgY2hyID09ICc/JyB8fCBjaHIgPT0gJyMnIHx8XG4gICAgICAgICAgICAoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodXJsLmlzU3BlY2lhbCgpICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfSE9TVDtcbiAgICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIGJ1ZmZlciA9PSAnJyAmJiAodXJsLmluY2x1ZGVzQ3JlZGVudGlhbHMoKSB8fCB1cmwucG9ydCAhPT0gbnVsbCkpIHJldHVybjtcbiAgICAgICAgICAgIGZhaWx1cmUgPSB1cmwucGFyc2VIb3N0KGJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSByZXR1cm47XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNociA9PSAnWycpIHNlZW5CcmFja2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNociA9PSAnXScpIHNlZW5CcmFja2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBidWZmZXIgKz0gY2hyO1xuICAgICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQT1JUOlxuICAgICAgICAgIGlmIChleGVjKERJR0lULCBjaHIpKSB7XG4gICAgICAgICAgICBidWZmZXIgKz0gY2hyO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBjaHIgPT0gRU9GIHx8IGNociA9PSAnLycgfHwgY2hyID09ICc/JyB8fCBjaHIgPT0gJyMnIHx8XG4gICAgICAgICAgICAoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpIHx8XG4gICAgICAgICAgICBzdGF0ZU92ZXJyaWRlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyICE9ICcnKSB7XG4gICAgICAgICAgICAgIHZhciBwb3J0ID0gcGFyc2VJbnQoYnVmZmVyLCAxMCk7XG4gICAgICAgICAgICAgIGlmIChwb3J0ID4gMHhGRkZGKSByZXR1cm4gSU5WQUxJRF9QT1JUO1xuICAgICAgICAgICAgICB1cmwucG9ydCA9ICh1cmwuaXNTcGVjaWFsKCkgJiYgcG9ydCA9PT0gc3BlY2lhbFNjaGVtZXNbdXJsLnNjaGVtZV0pID8gbnVsbCA6IHBvcnQ7XG4gICAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUpIHJldHVybjtcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSByZXR1cm4gSU5WQUxJRF9QT1JUO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRklMRTpcbiAgICAgICAgICB1cmwuc2NoZW1lID0gJ2ZpbGUnO1xuICAgICAgICAgIGlmIChjaHIgPT0gJy8nIHx8IGNociA9PSAnXFxcXCcpIHN0YXRlID0gRklMRV9TTEFTSDtcbiAgICAgICAgICBlbHNlIGlmIChiYXNlICYmIGJhc2Uuc2NoZW1lID09ICdmaWxlJykge1xuICAgICAgICAgICAgaWYgKGNociA9PSBFT0YpIHtcbiAgICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICAgIHVybC5wYXRoID0gYXJyYXlTbGljZShiYXNlLnBhdGgpO1xuICAgICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaHIgPT0gJz8nKSB7XG4gICAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgICB1cmwucGF0aCA9IGFycmF5U2xpY2UoYmFzZS5wYXRoKTtcbiAgICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PSAnIycpIHtcbiAgICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICAgIHVybC5wYXRoID0gYXJyYXlTbGljZShiYXNlLnBhdGgpO1xuICAgICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICghc3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlcihqb2luKGFycmF5U2xpY2UoY29kZVBvaW50cywgcG9pbnRlciksICcnKSkpIHtcbiAgICAgICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgICAgICB1cmwucGF0aCA9IGFycmF5U2xpY2UoYmFzZS5wYXRoKTtcbiAgICAgICAgICAgICAgICB1cmwuc2hvcnRlblBhdGgoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRklMRV9TTEFTSDpcbiAgICAgICAgICBpZiAoY2hyID09ICcvJyB8fCBjaHIgPT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEZJTEVfSE9TVDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSAnZmlsZScgJiYgIXN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXIoam9pbihhcnJheVNsaWNlKGNvZGVQb2ludHMsIHBvaW50ZXIpLCAnJykpKSB7XG4gICAgICAgICAgICBpZiAoaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYmFzZS5wYXRoWzBdLCB0cnVlKSkgcHVzaCh1cmwucGF0aCwgYmFzZS5wYXRoWzBdKTtcbiAgICAgICAgICAgIGVsc2UgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBjYXNlIEZJTEVfSE9TVDpcbiAgICAgICAgICBpZiAoY2hyID09IEVPRiB8fCBjaHIgPT0gJy8nIHx8IGNociA9PSAnXFxcXCcgfHwgY2hyID09ICc/JyB8fCBjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYnVmZmVyKSkge1xuICAgICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlciA9PSAnJykge1xuICAgICAgICAgICAgICB1cmwuaG9zdCA9ICcnO1xuICAgICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmYWlsdXJlID0gdXJsLnBhcnNlSG9zdChidWZmZXIpO1xuICAgICAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgICAgIGlmICh1cmwuaG9zdCA9PSAnbG9jYWxob3N0JykgdXJsLmhvc3QgPSAnJztcbiAgICAgICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUpIHJldHVybjtcbiAgICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICAgIH0gY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGJ1ZmZlciArPSBjaHI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQQVRIX1NUQVJUOlxuICAgICAgICAgIGlmICh1cmwuaXNTcGVjaWFsKCkpIHtcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICAgIGlmIChjaHIgIT0gJy8nICYmIGNociAhPSAnXFxcXCcpIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hyID09ICc/Jykge1xuICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IFFVRVJZO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hyID09ICcjJykge1xuICAgICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hyICE9IEVPRikge1xuICAgICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgICAgaWYgKGNociAhPSAnLycpIGNvbnRpbnVlO1xuICAgICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQQVRIOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNociA9PSBFT0YgfHwgY2hyID09ICcvJyB8fFxuICAgICAgICAgICAgKGNociA9PSAnXFxcXCcgJiYgdXJsLmlzU3BlY2lhbCgpKSB8fFxuICAgICAgICAgICAgKCFzdGF0ZU92ZXJyaWRlICYmIChjaHIgPT0gJz8nIHx8IGNociA9PSAnIycpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGlzRG91YmxlRG90KGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgdXJsLnNob3J0ZW5QYXRoKCk7XG4gICAgICAgICAgICAgIGlmIChjaHIgIT0gJy8nICYmICEoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpKSB7XG4gICAgICAgICAgICAgICAgcHVzaCh1cmwucGF0aCwgJycpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU2luZ2xlRG90KGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgaWYgKGNociAhPSAnLycgJiYgIShjaHIgPT0gJ1xcXFwnICYmIHVybC5pc1NwZWNpYWwoKSkpIHtcbiAgICAgICAgICAgICAgICBwdXNoKHVybC5wYXRoLCAnJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJyAmJiAhdXJsLnBhdGgubGVuZ3RoICYmIGlzV2luZG93c0RyaXZlTGV0dGVyKGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgICBpZiAodXJsLmhvc3QpIHVybC5ob3N0ID0gJyc7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gY2hhckF0KGJ1ZmZlciwgMCkgKyAnOic7IC8vIG5vcm1hbGl6ZSB3aW5kb3dzIGRyaXZlIGxldHRlclxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHB1c2godXJsLnBhdGgsIGJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJyAmJiAoY2hyID09IEVPRiB8fCBjaHIgPT0gJz8nIHx8IGNociA9PSAnIycpKSB7XG4gICAgICAgICAgICAgIHdoaWxlICh1cmwucGF0aC5sZW5ndGggPiAxICYmIHVybC5wYXRoWzBdID09PSAnJykge1xuICAgICAgICAgICAgICAgIHNoaWZ0KHVybC5wYXRoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNociA9PSAnPycpIHtcbiAgICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PSAnIycpIHtcbiAgICAgICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmZlciArPSBwZXJjZW50RW5jb2RlKGNociwgcGF0aFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBDQU5OT1RfQkVfQV9CQVNFX1VSTF9QQVRIOlxuICAgICAgICAgIGlmIChjaHIgPT0gJz8nKSB7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHIgIT0gRU9GKSB7XG4gICAgICAgICAgICB1cmwucGF0aFswXSArPSBwZXJjZW50RW5jb2RlKGNociwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCk7XG4gICAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIFFVRVJZOlxuICAgICAgICAgIGlmICghc3RhdGVPdmVycmlkZSAmJiBjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHIgIT0gRU9GKSB7XG4gICAgICAgICAgICBpZiAoY2hyID09IFwiJ1wiICYmIHVybC5pc1NwZWNpYWwoKSkgdXJsLnF1ZXJ5ICs9ICclMjcnO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hyID09ICcjJykgdXJsLnF1ZXJ5ICs9ICclMjMnO1xuICAgICAgICAgICAgZWxzZSB1cmwucXVlcnkgKz0gcGVyY2VudEVuY29kZShjaHIsIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBGUkFHTUVOVDpcbiAgICAgICAgICBpZiAoY2hyICE9IEVPRikgdXJsLmZyYWdtZW50ICs9IHBlcmNlbnRFbmNvZGUoY2hyLCBmcmFnbWVudFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBwb2ludGVyKys7XG4gICAgfVxuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2hvc3QtcGFyc2luZ1xuICBwYXJzZUhvc3Q6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHZhciByZXN1bHQsIGNvZGVQb2ludHMsIGluZGV4O1xuICAgIGlmIChjaGFyQXQoaW5wdXQsIDApID09ICdbJykge1xuICAgICAgaWYgKGNoYXJBdChpbnB1dCwgaW5wdXQubGVuZ3RoIC0gMSkgIT0gJ10nKSByZXR1cm4gSU5WQUxJRF9IT1NUO1xuICAgICAgcmVzdWx0ID0gcGFyc2VJUHY2KHN0cmluZ1NsaWNlKGlucHV0LCAxLCAtMSkpO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICB0aGlzLmhvc3QgPSByZXN1bHQ7XG4gICAgLy8gb3BhcXVlIGhvc3RcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU3BlY2lhbCgpKSB7XG4gICAgICBpZiAoZXhlYyhGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UX0VYQ0xVRElOR19QRVJDRU5ULCBpbnB1dCkpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICByZXN1bHQgPSAnJztcbiAgICAgIGNvZGVQb2ludHMgPSBhcnJheUZyb20oaW5wdXQpO1xuICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29kZVBvaW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdWx0ICs9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50c1tpbmRleF0sIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgfVxuICAgICAgdGhpcy5ob3N0ID0gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dCA9IHRvQVNDSUkoaW5wdXQpO1xuICAgICAgaWYgKGV4ZWMoRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVCwgaW5wdXQpKSByZXR1cm4gSU5WQUxJRF9IT1NUO1xuICAgICAgcmVzdWx0ID0gcGFyc2VJUHY0KGlucHV0KTtcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICB0aGlzLmhvc3QgPSByZXN1bHQ7XG4gICAgfVxuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2Nhbm5vdC1oYXZlLWEtdXNlcm5hbWUtcGFzc3dvcmQtcG9ydFxuICBjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gIXRoaXMuaG9zdCB8fCB0aGlzLmNhbm5vdEJlQUJhc2VVUkwgfHwgdGhpcy5zY2hlbWUgPT0gJ2ZpbGUnO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2luY2x1ZGUtY3JlZGVudGlhbHNcbiAgaW5jbHVkZXNDcmVkZW50aWFsczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnVzZXJuYW1lICE9ICcnIHx8IHRoaXMucGFzc3dvcmQgIT0gJyc7XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jaXMtc3BlY2lhbFxuICBpc1NwZWNpYWw6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaGFzT3duKHNwZWNpYWxTY2hlbWVzLCB0aGlzLnNjaGVtZSk7XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jc2hvcnRlbi1hLXVybHMtcGF0aFxuICBzaG9ydGVuUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXRoID0gdGhpcy5wYXRoO1xuICAgIHZhciBwYXRoU2l6ZSA9IHBhdGgubGVuZ3RoO1xuICAgIGlmIChwYXRoU2l6ZSAmJiAodGhpcy5zY2hlbWUgIT0gJ2ZpbGUnIHx8IHBhdGhTaXplICE9IDEgfHwgIWlzV2luZG93c0RyaXZlTGV0dGVyKHBhdGhbMF0sIHRydWUpKSkge1xuICAgICAgcGF0aC5sZW5ndGgtLTtcbiAgICB9XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC11cmwtc2VyaWFsaXplclxuICBzZXJpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdXJsID0gdGhpcztcbiAgICB2YXIgc2NoZW1lID0gdXJsLnNjaGVtZTtcbiAgICB2YXIgdXNlcm5hbWUgPSB1cmwudXNlcm5hbWU7XG4gICAgdmFyIHBhc3N3b3JkID0gdXJsLnBhc3N3b3JkO1xuICAgIHZhciBob3N0ID0gdXJsLmhvc3Q7XG4gICAgdmFyIHBvcnQgPSB1cmwucG9ydDtcbiAgICB2YXIgcGF0aCA9IHVybC5wYXRoO1xuICAgIHZhciBxdWVyeSA9IHVybC5xdWVyeTtcbiAgICB2YXIgZnJhZ21lbnQgPSB1cmwuZnJhZ21lbnQ7XG4gICAgdmFyIG91dHB1dCA9IHNjaGVtZSArICc6JztcbiAgICBpZiAoaG9zdCAhPT0gbnVsbCkge1xuICAgICAgb3V0cHV0ICs9ICcvLyc7XG4gICAgICBpZiAodXJsLmluY2x1ZGVzQ3JlZGVudGlhbHMoKSkge1xuICAgICAgICBvdXRwdXQgKz0gdXNlcm5hbWUgKyAocGFzc3dvcmQgPyAnOicgKyBwYXNzd29yZCA6ICcnKSArICdAJztcbiAgICAgIH1cbiAgICAgIG91dHB1dCArPSBzZXJpYWxpemVIb3N0KGhvc3QpO1xuICAgICAgaWYgKHBvcnQgIT09IG51bGwpIG91dHB1dCArPSAnOicgKyBwb3J0O1xuICAgIH0gZWxzZSBpZiAoc2NoZW1lID09ICdmaWxlJykgb3V0cHV0ICs9ICcvLyc7XG4gICAgb3V0cHV0ICs9IHVybC5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgam9pbihwYXRoLCAnLycpIDogJyc7XG4gICAgaWYgKHF1ZXJ5ICE9PSBudWxsKSBvdXRwdXQgKz0gJz8nICsgcXVlcnk7XG4gICAgaWYgKGZyYWdtZW50ICE9PSBudWxsKSBvdXRwdXQgKz0gJyMnICsgZnJhZ21lbnQ7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfSxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhyZWZcbiAgc2V0SHJlZjogZnVuY3Rpb24gKGhyZWYpIHtcbiAgICB2YXIgZmFpbHVyZSA9IHRoaXMucGFyc2UoaHJlZik7XG4gICAgaWYgKGZhaWx1cmUpIHRocm93IFR5cGVFcnJvcihmYWlsdXJlKTtcbiAgICB0aGlzLnNlYXJjaFBhcmFtcy51cGRhdGUoKTtcbiAgfSxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLW9yaWdpblxuICBnZXRPcmlnaW46IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2NoZW1lID0gdGhpcy5zY2hlbWU7XG4gICAgdmFyIHBvcnQgPSB0aGlzLnBvcnQ7XG4gICAgaWYgKHNjaGVtZSA9PSAnYmxvYicpIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IFVSTENvbnN0cnVjdG9yKHNjaGVtZS5wYXRoWzBdKS5vcmlnaW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmIChzY2hlbWUgPT0gJ2ZpbGUnIHx8ICF0aGlzLmlzU3BlY2lhbCgpKSByZXR1cm4gJ251bGwnO1xuICAgIHJldHVybiBzY2hlbWUgKyAnOi8vJyArIHNlcmlhbGl6ZUhvc3QodGhpcy5ob3N0KSArIChwb3J0ICE9PSBudWxsID8gJzonICsgcG9ydCA6ICcnKTtcbiAgfSxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXByb3RvY29sXG4gIGdldFByb3RvY29sOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1lICsgJzonO1xuICB9LFxuICBzZXRQcm90b2NvbDogZnVuY3Rpb24gKHByb3RvY29sKSB7XG4gICAgdGhpcy5wYXJzZSgkdG9TdHJpbmcocHJvdG9jb2wpICsgJzonLCBTQ0hFTUVfU1RBUlQpO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtdXNlcm5hbWVcbiAgZ2V0VXNlcm5hbWU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy51c2VybmFtZTtcbiAgfSxcbiAgc2V0VXNlcm5hbWU6IGZ1bmN0aW9uICh1c2VybmFtZSkge1xuICAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKCR0b1N0cmluZyh1c2VybmFtZSkpO1xuICAgIGlmICh0aGlzLmNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCgpKSByZXR1cm47XG4gICAgdGhpcy51c2VybmFtZSA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy51c2VybmFtZSArPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludHNbaV0sIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7XG4gICAgfVxuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcGFzc3dvcmRcbiAgZ2V0UGFzc3dvcmQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXNzd29yZDtcbiAgfSxcbiAgc2V0UGFzc3dvcmQ6IGZ1bmN0aW9uIChwYXNzd29yZCkge1xuICAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKCR0b1N0cmluZyhwYXNzd29yZCkpO1xuICAgIGlmICh0aGlzLmNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCgpKSByZXR1cm47XG4gICAgdGhpcy5wYXNzd29yZCA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYXNzd29yZCArPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludHNbaV0sIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7XG4gICAgfVxuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaG9zdFxuICBnZXRIb3N0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gICAgdmFyIHBvcnQgPSB0aGlzLnBvcnQ7XG4gICAgcmV0dXJuIGhvc3QgPT09IG51bGwgPyAnJ1xuICAgICAgOiBwb3J0ID09PSBudWxsID8gc2VyaWFsaXplSG9zdChob3N0KVxuICAgICAgOiBzZXJpYWxpemVIb3N0KGhvc3QpICsgJzonICsgcG9ydDtcbiAgfSxcbiAgc2V0SG9zdDogZnVuY3Rpb24gKGhvc3QpIHtcbiAgICBpZiAodGhpcy5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgdGhpcy5wYXJzZShob3N0LCBIT1NUKTtcbiAgfSxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhvc3RuYW1lXG4gIGdldEhvc3RuYW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gICAgcmV0dXJuIGhvc3QgPT09IG51bGwgPyAnJyA6IHNlcmlhbGl6ZUhvc3QoaG9zdCk7XG4gIH0sXG4gIHNldEhvc3RuYW1lOiBmdW5jdGlvbiAoaG9zdG5hbWUpIHtcbiAgICBpZiAodGhpcy5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgdGhpcy5wYXJzZShob3N0bmFtZSwgSE9TVE5BTUUpO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcG9ydFxuICBnZXRQb3J0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBvcnQgPSB0aGlzLnBvcnQ7XG4gICAgcmV0dXJuIHBvcnQgPT09IG51bGwgPyAnJyA6ICR0b1N0cmluZyhwb3J0KTtcbiAgfSxcbiAgc2V0UG9ydDogZnVuY3Rpb24gKHBvcnQpIHtcbiAgICBpZiAodGhpcy5jYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQoKSkgcmV0dXJuO1xuICAgIHBvcnQgPSAkdG9TdHJpbmcocG9ydCk7XG4gICAgaWYgKHBvcnQgPT0gJycpIHRoaXMucG9ydCA9IG51bGw7XG4gICAgZWxzZSB0aGlzLnBhcnNlKHBvcnQsIFBPUlQpO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcGF0aG5hbWVcbiAgZ2V0UGF0aG5hbWU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGF0aCA9IHRoaXMucGF0aDtcbiAgICByZXR1cm4gdGhpcy5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgam9pbihwYXRoLCAnLycpIDogJyc7XG4gIH0sXG4gIHNldFBhdGhuYW1lOiBmdW5jdGlvbiAocGF0aG5hbWUpIHtcbiAgICBpZiAodGhpcy5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgdGhpcy5wYXRoID0gW107XG4gICAgdGhpcy5wYXJzZShwYXRobmFtZSwgUEFUSF9TVEFSVCk7XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1zZWFyY2hcbiAgZ2V0U2VhcmNoOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5xdWVyeTtcbiAgICByZXR1cm4gcXVlcnkgPyAnPycgKyBxdWVyeSA6ICcnO1xuICB9LFxuICBzZXRTZWFyY2g6IGZ1bmN0aW9uIChzZWFyY2gpIHtcbiAgICBzZWFyY2ggPSAkdG9TdHJpbmcoc2VhcmNoKTtcbiAgICBpZiAoc2VhcmNoID09ICcnKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCc/JyA9PSBjaGFyQXQoc2VhcmNoLCAwKSkgc2VhcmNoID0gc3RyaW5nU2xpY2Uoc2VhcmNoLCAxKTtcbiAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgIHRoaXMucGFyc2Uoc2VhcmNoLCBRVUVSWSk7XG4gICAgfVxuICAgIHRoaXMuc2VhcmNoUGFyYW1zLnVwZGF0ZSgpO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNocGFyYW1zXG4gIGdldFNlYXJjaFBhcmFtczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaFBhcmFtcy5mYWNhZGU7XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1oYXNoXG4gIGdldEhhc2g6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZnJhZ21lbnQgPSB0aGlzLmZyYWdtZW50O1xuICAgIHJldHVybiBmcmFnbWVudCA/ICcjJyArIGZyYWdtZW50IDogJyc7XG4gIH0sXG4gIHNldEhhc2g6IGZ1bmN0aW9uIChoYXNoKSB7XG4gICAgaGFzaCA9ICR0b1N0cmluZyhoYXNoKTtcbiAgICBpZiAoaGFzaCA9PSAnJykge1xuICAgICAgdGhpcy5mcmFnbWVudCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgnIycgPT0gY2hhckF0KGhhc2gsIDApKSBoYXNoID0gc3RyaW5nU2xpY2UoaGFzaCwgMSk7XG4gICAgdGhpcy5mcmFnbWVudCA9ICcnO1xuICAgIHRoaXMucGFyc2UoaGFzaCwgRlJBR01FTlQpO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWFyY2hQYXJhbXMuc2VyaWFsaXplKCkgfHwgbnVsbDtcbiAgfVxufTtcblxuLy8gYFVSTGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLWNsYXNzXG52YXIgVVJMQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBVUkwodXJsIC8qICwgYmFzZSAqLykge1xuICB2YXIgdGhhdCA9IGFuSW5zdGFuY2UodGhpcywgVVJMUHJvdG90eXBlKTtcbiAgdmFyIGJhc2UgPSB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKSA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBzdGF0ZSA9IHNldEludGVybmFsU3RhdGUodGhhdCwgbmV3IFVSTFN0YXRlKHVybCwgZmFsc2UsIGJhc2UpKTtcbiAgaWYgKCFERVNDUklQVE9SUykge1xuICAgIHRoYXQuaHJlZiA9IHN0YXRlLnNlcmlhbGl6ZSgpO1xuICAgIHRoYXQub3JpZ2luID0gc3RhdGUuZ2V0T3JpZ2luKCk7XG4gICAgdGhhdC5wcm90b2NvbCA9IHN0YXRlLmdldFByb3RvY29sKCk7XG4gICAgdGhhdC51c2VybmFtZSA9IHN0YXRlLmdldFVzZXJuYW1lKCk7XG4gICAgdGhhdC5wYXNzd29yZCA9IHN0YXRlLmdldFBhc3N3b3JkKCk7XG4gICAgdGhhdC5ob3N0ID0gc3RhdGUuZ2V0SG9zdCgpO1xuICAgIHRoYXQuaG9zdG5hbWUgPSBzdGF0ZS5nZXRIb3N0bmFtZSgpO1xuICAgIHRoYXQucG9ydCA9IHN0YXRlLmdldFBvcnQoKTtcbiAgICB0aGF0LnBhdGhuYW1lID0gc3RhdGUuZ2V0UGF0aG5hbWUoKTtcbiAgICB0aGF0LnNlYXJjaCA9IHN0YXRlLmdldFNlYXJjaCgpO1xuICAgIHRoYXQuc2VhcmNoUGFyYW1zID0gc3RhdGUuZ2V0U2VhcmNoUGFyYW1zKCk7XG4gICAgdGhhdC5oYXNoID0gc3RhdGUuZ2V0SGFzaCgpO1xuICB9XG59O1xuXG52YXIgVVJMUHJvdG90eXBlID0gVVJMQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG52YXIgYWNjZXNzb3JEZXNjcmlwdG9yID0gZnVuY3Rpb24gKGdldHRlciwgc2V0dGVyKSB7XG4gIHJldHVybiB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKVtnZXR0ZXJdKCk7XG4gICAgfSxcbiAgICBzZXQ6IHNldHRlciAmJiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpW3NldHRlcl0odmFsdWUpO1xuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWVcbiAgfTtcbn07XG5cbmlmIChERVNDUklQVE9SUykge1xuICAvLyBgVVJMLnByb3RvdHlwZS5ocmVmYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaHJlZlxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMUHJvdG90eXBlLCAnaHJlZicsIGFjY2Vzc29yRGVzY3JpcHRvcignc2VyaWFsaXplJywgJ3NldEhyZWYnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLm9yaWdpbmAgZ2V0dGVyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1vcmlnaW5cbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFByb3RvdHlwZSwgJ29yaWdpbicsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0T3JpZ2luJykpO1xuICAvLyBgVVJMLnByb3RvdHlwZS5wcm90b2NvbGAgYWNjZXNzb3JzIHBhaXJcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXByb3RvY29sXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxQcm90b3R5cGUsICdwcm90b2NvbCcsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0UHJvdG9jb2wnLCAnc2V0UHJvdG9jb2wnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLnVzZXJuYW1lYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtdXNlcm5hbWVcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFByb3RvdHlwZSwgJ3VzZXJuYW1lJywgYWNjZXNzb3JEZXNjcmlwdG9yKCdnZXRVc2VybmFtZScsICdzZXRVc2VybmFtZScpKTtcbiAgLy8gYFVSTC5wcm90b3R5cGUucGFzc3dvcmRgIGFjY2Vzc29ycyBwYWlyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wYXNzd29yZFxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMUHJvdG90eXBlLCAncGFzc3dvcmQnLCBhY2Nlc3NvckRlc2NyaXB0b3IoJ2dldFBhc3N3b3JkJywgJ3NldFBhc3N3b3JkJykpO1xuICAvLyBgVVJMLnByb3RvdHlwZS5ob3N0YCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaG9zdFxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMUHJvdG90eXBlLCAnaG9zdCcsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0SG9zdCcsICdzZXRIb3N0JykpO1xuICAvLyBgVVJMLnByb3RvdHlwZS5ob3N0bmFtZWAgYWNjZXNzb3JzIHBhaXJcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhvc3RuYW1lXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxQcm90b3R5cGUsICdob3N0bmFtZScsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0SG9zdG5hbWUnLCAnc2V0SG9zdG5hbWUnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLnBvcnRgIGFjY2Vzc29ycyBwYWlyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wb3J0XG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxQcm90b3R5cGUsICdwb3J0JywgYWNjZXNzb3JEZXNjcmlwdG9yKCdnZXRQb3J0JywgJ3NldFBvcnQnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLnBhdGhuYW1lYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcGF0aG5hbWVcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFByb3RvdHlwZSwgJ3BhdGhuYW1lJywgYWNjZXNzb3JEZXNjcmlwdG9yKCdnZXRQYXRobmFtZScsICdzZXRQYXRobmFtZScpKTtcbiAgLy8gYFVSTC5wcm90b3R5cGUuc2VhcmNoYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNoXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxQcm90b3R5cGUsICdzZWFyY2gnLCBhY2Nlc3NvckRlc2NyaXB0b3IoJ2dldFNlYXJjaCcsICdzZXRTZWFyY2gnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLnNlYXJjaFBhcmFtc2AgZ2V0dGVyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1zZWFyY2hwYXJhbXNcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFByb3RvdHlwZSwgJ3NlYXJjaFBhcmFtcycsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0U2VhcmNoUGFyYW1zJykpO1xuICAvLyBgVVJMLnByb3RvdHlwZS5oYXNoYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaGFzaFxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMUHJvdG90eXBlLCAnaGFzaCcsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0SGFzaCcsICdzZXRIYXNoJykpO1xufVxuXG4vLyBgVVJMLnByb3RvdHlwZS50b0pTT05gIG1ldGhvZFxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXRvanNvblxuZGVmaW5lQnVpbHRJbihVUkxQcm90b3R5cGUsICd0b0pTT04nLCBmdW5jdGlvbiB0b0pTT04oKSB7XG4gIHJldHVybiBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnNlcmlhbGl6ZSgpO1xufSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vLyBgVVJMLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI1VSTC1zdHJpbmdpZmljYXRpb24tYmVoYXZpb3JcbmRlZmluZUJ1aWx0SW4oVVJMUHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykuc2VyaWFsaXplKCk7XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbmlmIChOYXRpdmVVUkwpIHtcbiAgdmFyIG5hdGl2ZUNyZWF0ZU9iamVjdFVSTCA9IE5hdGl2ZVVSTC5jcmVhdGVPYmplY3RVUkw7XG4gIHZhciBuYXRpdmVSZXZva2VPYmplY3RVUkwgPSBOYXRpdmVVUkwucmV2b2tlT2JqZWN0VVJMO1xuICAvLyBgVVJMLmNyZWF0ZU9iamVjdFVSTGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvY3JlYXRlT2JqZWN0VVJMXG4gIGlmIChuYXRpdmVDcmVhdGVPYmplY3RVUkwpIGRlZmluZUJ1aWx0SW4oVVJMQ29uc3RydWN0b3IsICdjcmVhdGVPYmplY3RVUkwnLCBiaW5kKG5hdGl2ZUNyZWF0ZU9iamVjdFVSTCwgTmF0aXZlVVJMKSk7XG4gIC8vIGBVUkwucmV2b2tlT2JqZWN0VVJMYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTC9yZXZva2VPYmplY3RVUkxcbiAgaWYgKG5hdGl2ZVJldm9rZU9iamVjdFVSTCkgZGVmaW5lQnVpbHRJbihVUkxDb25zdHJ1Y3RvciwgJ3Jldm9rZU9iamVjdFVSTCcsIGJpbmQobmF0aXZlUmV2b2tlT2JqZWN0VVJMLCBOYXRpdmVVUkwpKTtcbn1cblxuc2V0VG9TdHJpbmdUYWcoVVJMQ29uc3RydWN0b3IsICdVUkwnKTtcblxuJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIGZvcmNlZDogIVVTRV9OQVRJVkVfVVJMLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBVUkw6IFVSTENvbnN0cnVjdG9yXG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi51cmwuY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5jb25zdHJ1Y3Rvci5qc1wiKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qcz8iKX0pfSk7dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXz17fTtmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKXt2YXIgY2FjaGVkTW9kdWxlPV9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07aWYoY2FjaGVkTW9kdWxlIT09dW5kZWZpbmVkKXtyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHN9dmFyIG1vZHVsZT1fX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdPXtpZDptb2R1bGVJZCxsb2FkZWQ6ZmFsc2UsZXhwb3J0czp7fX07X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cyxtb2R1bGUsbW9kdWxlLmV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk7bW9kdWxlLmxvYWRlZD10cnVlO3JldHVybiBtb2R1bGUuZXhwb3J0c30oKCk9PntfX3dlYnBhY2tfcmVxdWlyZV9fLmFtZE89e319KSgpOygoKT0+e19fd2VicGFja19yZXF1aXJlX18ubj0obW9kdWxlKT0+e3ZhciBnZXR0ZXI9bW9kdWxlJiZtb2R1bGUuX19lc01vZHVsZT8oKT0+KG1vZHVsZVsnZGVmYXVsdCddKTooKT0+KG1vZHVsZSk7X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlcix7YTpnZXR0ZXJ9KTtyZXR1cm4gZ2V0dGVyfX0pKCk7KCgpPT57X193ZWJwYWNrX3JlcXVpcmVfXy5kPShleHBvcnRzLGRlZmluaXRpb24pPT57Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbil7aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sa2V5KSYmIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLGtleSkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLGtleSx7ZW51bWVyYWJsZTp0cnVlLGdldDpkZWZpbml0aW9uW2tleV19KX19fX0pKCk7KCgpPT57X193ZWJwYWNrX3JlcXVpcmVfXy5nPShmdW5jdGlvbigpe2lmKHR5cGVvZiBnbG9iYWxUaGlzPT09J29iamVjdCcpcmV0dXJuIGdsb2JhbFRoaXM7dHJ5e3JldHVybiB0aGlzfHxuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKX1jYXRjaChlKXtpZih0eXBlb2Ygd2luZG93PT09J29iamVjdCcpcmV0dXJuIHdpbmRvd319KSgpfSkoKTsoKCk9PntfX3dlYnBhY2tfcmVxdWlyZV9fLmhtZD0obW9kdWxlKT0+e21vZHVsZT1PYmplY3QuY3JlYXRlKG1vZHVsZSk7aWYoIW1vZHVsZS5jaGlsZHJlbiltb2R1bGUuY2hpbGRyZW49W107T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwnZXhwb3J0cycse2VudW1lcmFibGU6dHJ1ZSxzZXQ6KCk9Pnt0aHJvdyBuZXcgRXJyb3IoJ0VTIE1vZHVsZXMgbWF5IG5vdCBhc3NpZ24gbW9kdWxlLmV4cG9ydHMgb3IgZXhwb3J0cy4qLCBVc2UgRVNNIGV4cG9ydCBzeW50YXgsIGluc3RlYWQ6ICcrbW9kdWxlLmlkKTt9fSk7cmV0dXJuIG1vZHVsZX19KSgpOygoKT0+e19fd2VicGFja19yZXF1aXJlX18ubz0ob2JqLHByb3ApPT4oT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixwcm9wKSl9KSgpOygoKT0+e19fd2VicGFja19yZXF1aXJlX18ucj0oZXhwb3J0cyk9PntpZih0eXBlb2YgU3ltYm9sIT09J3VuZGVmaW5lZCcmJlN5bWJvbC50b1N0cmluZ1RhZyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTonTW9kdWxlJ30pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCdfX2VzTW9kdWxlJyx7dmFsdWU6dHJ1ZX0pfX0pKCk7dmFyIF9fd2VicGFja19leHBvcnRzX189X193ZWJwYWNrX3JlcXVpcmVfXygiLi9wZGYuanMiKX0pKCk7",S=`data:text/javascript;base64,${s}`,p=`data:text/javascript;base64,${x}`;class M{constructor(I,g={},C={}){c(this,"container",null);c(this,"wrapper",null);c(this,"wrapperMain",null);c(this,"options",{});c(this,"requestOptions",{});c(this,"pdfDocument",null);this.container=I,this.options={staticFileUrl:"https://unpkg.com/pdfjs-dist@3.1.81/",...g},this.requestOptions=C,this.createWrapper()}createWrapper(){this.wrapper=document.createElement("div"),this.wrapper.className="vue-office-pdf",this.wrapper.setAttribute("style","text-align: center;overflow-y: auto;"),this.container.appendChild(this.wrapper)}createWrapperMain(){this.wrapperMain=document.createElement("div"),this.wrapperMain.className="vue-office-pdf-wrapper",this.wrapperMain.setAttribute("style","background: gray; padding: 30px 0;position: relative;"),this.wrapper.appendChild(this.wrapperMain)}createCanvas(){const I=document.createElement("canvas");return I.setAttribute("style","width:100%"),this.wrapperMain.appendChild(I),[I,I.getContext("2d")]}installPdfScript(){return y(S).then(()=>{window.pdfjsLib.GlobalWorkerOptions.workerSrc=p})}checkPdfLib(){return window.pdfjsLib?Promise.resolve():this.installPdfScript()}getDocument(I){return window.pdfjsLib.getDocument({url:Y(I),cMapUrl:`${this.options.staticFileUrl.endsWith("/")?this.options.staticFileUrl:this.options.staticFileUrl+"/"}cmaps/`,cMapPacked:!0,enableXfa:!0,...i(this.options,["width","staticFileUrl"])}).promise}renderSinglePage(I){return this.pdfDocument.getPage(I).then(g=>{const C=g.getViewport({scale:2}),l=window.devicePixelRatio||1;let[b,A]=this.createCanvas();b.width=Math.floor(C.width*l),b.height=Math.floor(C.height*l);let G=Math.floor(C.width),X=Math.floor(C.height);if(this.options.width){let d=this.options.width/G;G=Math.floor(this.options.width),X=Math.floor(X*d)}if(G>document.documentElement.clientWidth){let d=document.documentElement.clientWidth/G;G=Math.floor(document.documentElement.clientWidth),X=Math.floor(X*d)}b.style.width=G+"px",b.style.height=X+"px";const m=l!==1?[l,0,0,l,0,0]:null;return g.render({canvasContext:A,transform:m,viewport:C}).promise.then(()=>{this.pdfDocument.numPages>I&&this.renderSinglePage(I+1)})})}renderPage(){return this.wrapperMain||this.createWrapperMain(),this.renderSinglePage(1)}clearAllCanvas(){this.wrapperMain&&(this.wrapper.removeChild(this.wrapperMain),this.wrapperMain=null)}setOptions(I){this.options=I}setRequestOptions(I){this.requestOptions=I}preview(I){return new Promise((g,C)=>{if(!I){this.clearAllCanvas(),C(new Error("预览地址不能为空"));return}this.checkPdfLib().then(l=>{this.getDocument(I).then(b=>{this.pdfDocument=b,this.renderPage().then(A=>{g()}).catch(A=>{this.clearAllCanvas(),C(A)})}).catch(b=>{this.clearAllCanvas(),C(b)})}).catch(l=>{this.clearAllCanvas(),C(l)})})}save(I){this.pdfDocument&&this.pdfDocument._transport&&this.pdfDocument._transport.getData().then(g=>{u(I||`js-preview-pdf-${new Date().getTime()}.pdf`,g.buffer)})}destroy(){this.container.removeChild(this.wrapper),this.container=null,this.wrapper=null,this.wrapperMain=null,this.options={},this.requestOptions={},this.pdfDocument=null}}function J(Z,I,g){return new M(Z,I,g)}const F={init:J},w={__name:"JsPdfDemo",setup(Z){const I=L(null);return N(()=>{window.myPdfPreview=F.init(I.value),window.myPdfPreview.preview("/vue-office/examples/dist/static/test-files/test.pdf").then(g=>{console.log("excel preview done",window.myPdfPreview)}).catch(g=>{console.log("err",g)})}),(g,C)=>(h(),R("div",{ref_key:"dom",ref:I,style:{height:"calc(100vh - 50px)"}},null,512))}};export{w as default};
|