uni-jsframework.js 705.9 KB
Newer Older
DCloud_iOS_WZT's avatar
DCloud_iOS_WZT 已提交
1 2
//{"version":"4.08","encode":"base64"}
dmFyIF9fVW5pU2VydmljZVN0YXJ0VGltZV9fPURhdGUubm93KCksZ2xvYmFsPXRoaXMscHJvY2Vzcz17ZW52Ont9fSxzZXRUaW1lb3V0PWdsb2JhbC5zZXRUaW1lb3V0OyFmdW5jdGlvbihlLHQpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/dCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOnQoKX0oMCxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgc3VidmVyc2lvbj17ZnJhbWV3b3JrOiIwLjI5LjYiLHRyYW5zZm9ybWVyOiI+PTAuMS41IDwwLjUifTtmdW5jdGlvbiBnZXRIb29rS2V5KGUsdCxuKXtyZXR1cm4gdCsiQCIrbisiIyIrZX12YXIgQ2FsbGJhY2tNYW5hZ2VyPWZ1bmN0aW9uKGUpe3RoaXMuaW5zdGFuY2VJZD1TdHJpbmcoZSksdGhpcy5sYXN0Q2FsbGJhY2tJZD0wLHRoaXMuY2FsbGJhY2tzPXt9LHRoaXMuaG9va3M9e319O0NhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxhc3RDYWxsYmFja0lkKyssdGhpcy5jYWxsYmFja3NbdGhpcy5sYXN0Q2FsbGJhY2tJZF09ZSx0aGlzLmxhc3RDYWxsYmFja0lkfSxDYWxsYmFja01hbmFnZXIucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNhbGxiYWNrc1tlXTtyZXR1cm4gZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2VdLHR9LENhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUucmVnaXN0ZXJIb29rPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWdldEhvb2tLZXkoZSx0LG4pO3RoaXMuaG9va3NbaV0mJmNvbnNvbGUud2FybignW0pTIEZyYW1ld29ya10gT3ZlcnJpZGUgYW4gZXhpc3RpbmcgY29tcG9uZW50IGhvb2sgIicraSsnIi4nKSx0aGlzLmhvb2tzW2ldPXJ9LENhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUudHJpZ2dlckhvb2s9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9Z2V0SG9va0tleShlLHQsbiksbz10aGlzLmhvb2tzW2ldO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvKXJldHVybiBjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBJbnZhbGlkIGhvb2sgZnVuY3Rpb24gdHlwZSAoIit0eXBlb2YgbysnKSBvbiAiJytpKyciLicpLG51bGw7dmFyIGE9bnVsbDt0cnl7YT1vLmFwcGx5KG51bGwscnx8W10pfWNhdGNoKGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBleGVjdXRlIHRoZSBob29rIGZ1bmN0aW9uIG9uICInK2krJyIuJyksZX1yZXR1cm4gYX0sQ2FsbGJhY2tNYW5hZ2VyLnByb3RvdHlwZS5jb25zdW1lPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmNhbGxiYWNrc1tlXTtpZih2b2lkIDAhPT1uJiYhMSE9PW58fGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tlXSwiZnVuY3Rpb24iPT10eXBlb2Ygcil0cnl7cmV0dXJuIHIuY2FsbChudWxsLHQsbil9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uOlxuICIrZS50b1N0cmluZygpKSxlfXJldHVybiBuZXcgRXJyb3IoJ2ludmFsaWQgY2FsbGJhY2sgaWQgIicrZSsnIicpfSxDYWxsYmFja01hbmFnZXIucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5jYWxsYmFja3M9e30sdGhpcy5ob29rcz17fX07dmFyIG5leHROb2RlUmVmPTE7ZnVuY3Rpb24gdW5pcXVlSWQoKXtyZXR1cm4obmV4dE5vZGVSZWYrKykudG9TdHJpbmcoKX1mdW5jdGlvbiB0eXBvZihlKXt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc3Vic3RyaW5nKDgsdC5sZW5ndGgtMSl9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdChlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBoYXNPd24oZSx0KXtyZXR1cm4gaXNQbGFpbk9iamVjdChlKSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9ZnVuY3Rpb24gYnVmZmVyVG9CYXNlNjQoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGJ0b2EpcmV0dXJuIiI7dmFyIHQ9QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG5ldyBVaW50OEFycmF5KGUpLGZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpfSkuam9pbigiIik7cmV0dXJuIGJ0b2EodCl9ZnVuY3Rpb24gaXNFbXB0eShlKXtpZighZXx8Im9iamVjdCIhPXR5cGVvZiBlKXJldHVybiEwO2Zvcih2YXIgdCBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKXJldHVybiExO3JldHVybiEwfXZhciBMRVZFTFM9WyJvZmYiLCJlcnJvciIsIndhcm4iLCJpbmZvIiwibG9nIiwiZGVidWciXSxsZXZlbE1hcD17fTtmdW5jdGlvbiBnZW5lcmF0ZUxldmVsTWFwKCl7TEVWRUxTLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49TEVWRUxTLmluZGV4T2YodCk7bGV2ZWxNYXBbdF09e30sTEVWRUxTLmZvckVhY2goZnVuY3Rpb24oZSl7TEVWRUxTLmluZGV4T2YoZSk8PW4mJihsZXZlbE1hcFt0XVtlXT0hMCl9KX0pfWZ1bmN0aW9uIGNoZWNrTGV2ZWwoZSl7dmFyIHQ9Z2xvYmFsLldYRW52aXJvbm1lbnQmJmdsb2JhbC5XWEVudmlyb25tZW50LmxvZ0xldmVsfHwibG9nIjtyZXR1cm4gbGV2ZWxNYXBbdF0mJmxldmVsTWFwW3RdW2VdfWZ1bmN0aW9uIGRlYnVnTG9nKGUpe2dsb2JhbC5uYXRpdmVMb2coInd4SW50ZXJhY3Rpb25BbmFseXplcjogW2pzZm1dIitlLCJfX0RFQlVHIil9dmFyIGRvY01hcD17fTtmdW5jdGlvbiBhZGREb2MoZSx0KXtlJiYoZG9jTWFwW2VdPXQpfWZ1bmN0aW9uIGdldERvYyhlKXtyZXR1cm4gZG9jTWFwW2VdfWZ1bmN0aW9uIHJlbW92ZURvYyhlKXtkZWxldGUgZG9jTWFwW2VdfWZ1bmN0aW9uIGdldFRhc2tDZW50ZXIoZSl7dmFyIHQ9ZG9jTWFwW2VdO3JldHVybiB0JiZ0LnRhc2tDZW50ZXI/dC50YXNrQ2VudGVyOm51bGx9ZnVuY3Rpb24gYXBwZW5kQm9keShlLHQsbil7dmFyIHI9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoISgwPHIucHVyZUNoaWxkcmVuLmxlbmd0aHx8dC5wYXJlbnROb2RlKSl7dmFyIGk9ci5jaGlsZHJlbixvPWkuaW5kZXhPZihuKTtvPDA/aS5wdXNoKHQpOmkuc3BsaWNlKG8sMCx0KSwxPT09dC5ub2RlVHlwZT8oImJvZHkiPT09dC5yb2xlPyh0LmRvY0lkPWUuaWQsdC5vd25lckRvY3VtZW50PWUsdC5wYXJlbnROb2RlPXIsbGlua1BhcmVudCh0LHIpKToodC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZT10fSksc2V0Qm9keShlLHQpLHQuZG9jSWQ9ZS5pZCx0Lm93bmVyRG9jdW1lbnQ9ZSxsaW5rUGFyZW50KHQsciksZGVsZXRlIGUubm9kZU1hcFt0Lm5vZGVJZF0pLHIucHVyZUNoaWxkcmVuLnB1c2godCksc2VuZEJvZHkoZSx0KSk6KHQucGFyZW50Tm9kZT1yLGUubm9kZU1hcFt0LnJlZl09dCksdC5yZWFkeT0hMCx0LmNvbXB1dGVDbGFzc0xpc3QmJnQuY29tcHV0ZUNsYXNzTGlzdCgpfX1mdW5jdGlvbiBzZW5kQm9keShlLHQpe3ZhciBuPXQudG9KU09OKCk7ZSYmZS50YXNrQ2VudGVyJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50YXNrQ2VudGVyLnNlbmQmJmUudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUJvZHkifSxbbl0pfWZ1bmN0aW9uIHNldEJvZHkoZSx0KXt0LnJvbGU9ImJvZHkiLHQuZGVwdGg9MSxkZWxldGUgZS5ub2RlTWFwW3Qubm9kZUlkXSx0LnJlZj0iX3Jvb3QiLGUubm9kZU1hcC5fcm9vdD10LGUuYm9keT10fWZ1bmN0aW9uIGxpbmtQYXJlbnQodCxlKXsodC5wYXJlbnROb2RlPWUpLmRvY0lkJiYodC5kb2NJZD1lLmRvY0lkLHQub3duZXJEb2N1bWVudD1lLm93bmVyRG9jdW1lbnQsKHQub3duZXJEb2N1bWVudC5ub2RlTWFwW3Qubm9kZUlkXT10KS5kZXB0aD1lLmRlcHRoKzEpLHQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtsaW5rUGFyZW50KGUsdCl9KX1mdW5jdGlvbiBuZXh0RWxlbWVudChlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIHByZXZpb3VzRWxlbWVudChlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUucHJldmlvdXNTaWJsaW5nfX1mdW5jdGlvbiBpbnNlcnRJbmRleChlLHQsbixyKXtuPDAmJihuPTApO3ZhciBpPXRbbi0xXSxvPXRbbl07cmV0dXJuIHQuc3BsaWNlKG4sMCxlKSxyJiYoaSYmKGkubmV4dFNpYmxpbmc9ZSksZS5wcmV2aW91c1NpYmxpbmc9aSwoZS5uZXh0U2libGluZz1vKSYmKG8ucHJldmlvdXNTaWJsaW5nPWUpKSxufWZ1bmN0aW9uIG1vdmVJbmRleChlLHQsbixyKXt2YXIgaT10LmluZGV4T2YoZSk7aWYoaTwwKXJldHVybi0xO2lmKHIpe3ZhciBvPXRbaS0xXSxhPXRbaSsxXTtvJiYoby5uZXh0U2libGluZz1hKSxhJiYoYS5wcmV2aW91c1NpYmxpbmc9byl9dC5zcGxpY2UoaSwxKTt2YXIgcz1uO2k8PW4mJihzPW4tMSk7dmFyIGM9dFtzLTFdLHU9dFtzXTtyZXR1cm4gdC5zcGxpY2UocywwLGUpLHImJihjJiYoYy5uZXh0U2libGluZz1lKSxlLnByZXZpb3VzU2libGluZz1jLChlLm5leHRTaWJsaW5nPXUpJiYodS5wcmV2aW91c1NpYmxpbmc9ZSkpLGk9PT1zPy0xOm59ZnVuY3Rpb24gcmVtb3ZlSW5kZXgoZSx0LG4pe3ZhciByPXQuaW5kZXhPZihlKTtpZighKHI8MCkpe2lmKG4pe3ZhciBpPXRbci0xXSxvPXRbcisxXTtpJiYoaS5uZXh0U2libGluZz1vKSxvJiYoby5wcmV2aW91c1NpYmxpbmc9aSl9dC5zcGxpY2UociwxKX19dmFyIE5vZGU9ZnVuY3Rpb24oKXt0aGlzLm5vZGVJZD11bmlxdWVJZCgpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W10sdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5uZXh0U2libGluZz1udWxsLHRoaXMucHJldmlvdXNTaWJsaW5nPW51bGx9LEVsZW1lbnQkMjtmdW5jdGlvbiBzZXRFbGVtZW50KGUpe0VsZW1lbnQkMj1lfU5vZGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT1nZXREb2ModGhpcy5kb2NJZCk7ZSYmKGRlbGV0ZSB0aGlzLmRvY0lkLGRlbGV0ZSBlLm5vZGVNYXBbdGhpcy5ub2RlSWRdKSx0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5kZXN0cm95KCl9KX07dmFyIHJlZ2lzdGVyZWRFbGVtZW50cz17fTtmdW5jdGlvbiByZWdpc3RlckVsZW1lbnQoaSxlKXtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aCl7dmFyIHQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBlJiYodC5fX3Byb3RvX189ZSksKHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj10fShFbGVtZW50JDIpO2UuZm9yRWFjaChmdW5jdGlvbihyKXt0LnByb3RvdHlwZVtyXT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO2lmKG4pcmV0dXJuIG4uc2VuZCgiY29tcG9uZW50Iix7cmVmOnRoaXMucmVmLGNvbXBvbmVudDppLG1ldGhvZDpyfSxlKX19KSxyZWdpc3RlcmVkRWxlbWVudHNbaV09dH19ZnVuY3Rpb24gZ2V0V2VleEVsZW1lbnQoZSl7cmV0dXJuIHJlZ2lzdGVyZWRFbGVtZW50c1tlXX1mdW5jdGlvbiBjYWNoZWQodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgcGFyc2VTdHlsZVRleHQ9Y2FjaGVkKGZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZS5zcGxpdChyKTsxPHQubGVuZ3RoJiYoblt0WzBdLnRyaW0oKV09dFsxXS50cmltKCkpfX0pLG59KSxmaXJzdExldHRlclRvTG93ZXJDYXNlPWNhY2hlZChmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKStlLnNsaWNlKDEpfSk7ZnVuY3Rpb24gaXNEZWYoZSl7cmV0dXJuIHZvaWQgMCE9PWV9ZnVuY3Rpb24gaXNGbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX12YXIgX3RvU3RyaW5nPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gdG9SYXdUeXBlKGUpe3JldHVybiBfdG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKX1mdW5jdGlvbiBoYXNMaWZlY3ljbGVIb29rKGUsdCl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxBcnJheS5pc0FycmF5KGVbdF0pJiZlW3RdLmxlbmd0aH12YXIgcHJvY2Vzc29ycz17c2xpZGVyOntjaGFuZ2U6ZnVuY3Rpb24oZSl7cmV0dXJue2luZGV4OmUuaW5kZXgsc291cmNlOmUuc291cmNlfX0sc2Nyb2xsOmZ1bmN0aW9uKGUpe3JldHVybntvZmZzZXRYUmF0aW86ZS5vZmZzZXRYUmF0aW8sb2Zmc2V0WVJhdGlvOmUub2Zmc2V0WVJhdGlvLGRyYWc6ZS5kcmFnfX19LCJzY3JvbGwtdmlldyI6e3Njcm9sbGVuZDpmdW5jdGlvbihlKXtyZXR1cm57Y29udGVudE9mZnNldDplLmNvbnRlbnRPZmZzZXR9fX19O2Z1bmN0aW9uIHByb2Nlc3NUYXJnZXQoZSl7dmFyIHQ9ZS5hdHRyLG49ZS5vZmZzZXRMZWZ0LHI9ZS5vZmZzZXRUb3AsaT17fTtyZXR1cm4gT2JqZWN0LmtleXModHx8e30pLmZvckVhY2goZnVuY3Rpb24oZSl7MD09PWUuaW5kZXhPZigiZGF0YSIpJiYoaVtmaXJzdExldHRlclRvTG93ZXJDYXNlKGUucmVwbGFjZSgiZGF0YSIsIiIpKV09dFtlXSl9KSx7aWQ6dCYmdC5pZHx8IiIsZGF0YXNldDppLG9mZnNldExlZnQ6bnx8MCxvZmZzZXRUb3A6cnx8MH19ZnVuY3Rpb24gcHJvY2Vzc0N1c3RvbUV2ZW50KGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLHZvaWQgMD09PW4mJihuPXt9KSxuPXByb2Nlc3NUYXJnZXQobikse3R5cGU6ZSx0aW1lU3RhbXA6RGF0ZS5ub3coKSx0YXJnZXQ6bixjdXJyZW50VGFyZ2V0Om4sZGV0YWlsOnR9fXZhciBXRUVYX1RBR1M9WyJhIiwiZGl2IiwibGlzdCIsImNlbGwiLCJsb2FkaW5nIiwicmVmcmVzaCIsInJlY3ljbGUtbGlzdCIsInNjcm9sbGVyIiwiaW5kaWNhdG9yIiwid2F0ZXJmYWxsIiwid2ViIiwicmljaHRleHQiXSxJR05PUkVfRVZFTlRTPVsidmlld2FwcGVhciIsInZpZXdkaXNhcHBlYXIiLCJpdGVtY2xpY2siXSxFVkVOVF9FWFRSQVM9e21hcmtlcnRhcDpbIm1hcmtlcklkIl0sY29udHJvbHRhcDpbImNvbnRyb2xJZCJdLHJlZ2lvbmNoYW5nZTpbImNhdXNlZEJ5Il0sZW5kOlsiY2F1c2VkQnkiXSxhcHBlYXI6WyJkaXJlY3Rpb24iXSxkaXNhcHBlYXI6WyJkaXJlY3Rpb24iXX07ZnVuY3Rpb24gcHJvY2Vzc0V2ZW50KHQsZSl7dmFyIG49dC50eXBlO2lmKC0xIT09SUdOT1JFX0VWRU5UUy5pbmRleE9mKG4pKXJldHVybiB0O3ZhciByPXQuY3VycmVudFRhcmdldCxpPXIudHlwZS5yZXBsYWNlKCJ1LSIsIiIpO2lmKC0xIT09V0VFWF9UQUdTLmluZGV4T2YoaSkpcmV0dXJuIHQ7dmFyIG89dC50aW1lc3RhbXAsYT10LnRhcmdldDtpZighaXNEZWYoZSkpe3ZhciBzPXByb2Nlc3NvcnNbaV07ZT1zJiZpc0ZuKHNbbl0pP3Nbbl0odCk6dC5kZXRhaWx8fHt9fXZhciBjPXt0eXBlOm4sdGltZVN0YW1wOm8sdGFyZ2V0OnByb2Nlc3NUYXJnZXQoYSksY3VycmVudFRhcmdldDpwcm9jZXNzVGFyZ2V0KHIpLGRldGFpbDplLHRvdWNoZXM6InRvdWNoZW5kIj09PW58fCJwYW5lbmQiPT09bj9bXTp0LmNoYW5nZWRUb3VjaGVzLGNoYW5nZWRUb3VjaGVzOnQuY2hhbmdlZFRvdWNoZXN9O3QuY29tcG9uZW50SWQmJihjLmNvbXBvbmVudElkPXQuY29tcG9uZW50SWQpO3ZhciB1PUVWRU5UX0VYVFJBU1tuXTtyZXR1cm4gdSYmdS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuaGFzT3duUHJvcGVydHkoZSkmJihjW2VdPXRbZV0pfSksY312YXIgQkFTRV9ERVZJQ0VfV0lEVEg9NzUwLGRldmljZURQUj0xLGRldmljZVdpZHRoPTA7ZnVuY3Rpb24gdXB4MnB4KGUsdCl7aWYoMD09PWRldmljZVdpZHRoJiYoZGV2aWNlRFBSPWdsb2JhbC5XWEVudmlyb25tZW50LnNjYWxlLGRldmljZVdpZHRoPU1hdGguY2VpbChnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aC9kZXZpY2VEUFIpKSwwPT09KGU9TnVtYmVyKGUpKSlyZXR1cm4gMDt2YXIgbj1lL0JBU0VfREVWSUNFX1dJRFRIKih0fHxkZXZpY2VXaWR0aCkscj1uLnRvU3RyaW5nKCkuc3BsaXQoIi4iKTtyZXR1cm4gMj09PXIubGVuZ3RoPyhyWzFdPXJbMV0uc3Vic3RyaW5nKDAsMiksTnVtYmVyKHIuam9pbigiLiIpKSk6bn12YXIgVU5JVF9SRT0vKFsrLV0/XGQrKFwuXGQrKT8pW3J8dV1weC9nO2Z1bmN0aW9uIG5vcm1hbGl6ZVVuaXQobil7cmV0dXJuIGdsb2JhbC5XWEVudmlyb25tZW50LmR5bmFtaWNScHh8fCJPYmplY3QiIT09dHlwb2Yobil8fE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTsic3RyaW5nIj09dHlwZW9mIHQmJihuW2VdPXQucmVwbGFjZShVTklUX1JFLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVweDJweCh0KX0pKX0pLG59ZnVuY3Rpb24gZGVlcENsb25lKGUsaSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uIGUodCl7dmFyIG49dC5jaGlsZHJlbiYmdC5jaGlsZHJlbi5tYXAoZSkscj1pKHQudGFnLHQuZGF0YSxuKTtyZXR1cm4gci50ZXh0PXQudGV4dCxyLmlzQ29tbWVudD10LmlzQ29tbWVudCxyLmNvbXBvbmVudE9wdGlvbnM9dC5jb21wb25lbnRPcHRpb25zLHIuZWxtPXQuZWxtLHIuY29udGV4dD10LmNvbnRleHQsci5ucz10Lm5zLHIuaXNTdGF0aWM9dC5pc1N0YXRpYyxyLmtleT10LmtleSxyfSl9ZnVuY3Rpb24gZ2VuZXJhdGVEZWNsYXJhdGlvbihlLHQsbil7cmV0dXJue3R5cGU6ImRlY2xhcmF0aW9uIixwcm9wZXJ0eTplLHZhbHVlOnR9fWZ1bmN0aW9uIGNsZWFySW1wb3J0YW50KGUpe3ZhciB0PVN0cmluZyhlKS5yZXBsYWNlKC9ccyohaW1wb3J0YW50L2csIiIpO3JldHVybnt2YWx1ZTp0LGltcG9ydGFudDplIT09dH19ZnVuY3Rpb24gY3JlYXRlUGFyc2VyKHMpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPWUucG9zaXRpb24sbz1uLnNwbGl0KC9ccysvKSxhPVtdO3N3aXRjaChvLmxlbmd0aCl7Y2FzZSAxOm8ucHVzaChvWzBdLG9bMF0sb1swXSk7YnJlYWs7Y2FzZSAyOm8ucHVzaChvWzBdLG9bMV0pO2JyZWFrO2Nhc2UgMzpvLnB1c2gob1sxXSl9cmV0dXJuIGEucHVzaChnZW5lcmF0ZURlY2xhcmF0aW9uKHMrIlRvcCIsb1swXSxyLGkpLGdlbmVyYXRlRGVjbGFyYXRpb24ocysiUmlnaHQiLG9bMV0scixpKSxnZW5lcmF0ZURlY2xhcmF0aW9uKHMrIkJvdHRvbSIsb1syXSxyLGkpLGdlbmVyYXRlRGVjbGFyYXRpb24ocysiTGVmdCIsb1szXSxyLGkpKSxhfX12YXIgbWFyZ2luPWNyZWF0ZVBhcnNlcigibWFyZ2luIikscGFkZGluZz1jcmVhdGVQYXJzZXIoInBhZGRpbmciKTtmdW5jdGlvbiBib3JkZXIoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1lLnByb3BlcnR5LG89bi5yZXBsYWNlKC9ccyosXHMqL2csIiwiKS5zcGxpdCgvXHMrLyksYT1bL15bXGQuXStcUyokLywvXihzb2xpZHxkYXNoZWR8ZG90dGVkKSQvLC9cUysvXS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9by5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlKX0pO3JldHVybiBlPDA/bnVsbDpvLnNwbGljZShlLDEpWzBdfSk7cmV0dXJuIG8ubGVuZ3RoP2U6W2dlbmVyYXRlRGVjbGFyYXRpb24oaSsiV2lkdGgiLChhWzBdfHwiMCIpLnRyaW0oKSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKGkrIlN0eWxlIiwoYVsxXXx8InNvbGlkIikudHJpbSgpLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oaSsiQ29sb3IiLChhWzJdfHwiIzAwMDAwMCIpLnRyaW0oKSxyKV19ZnVuY3Rpb24gYm9yZGVyUHJvcGVydHkoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1lLnByb3BlcnR5LnN1YnN0cmluZyg2KSxvPW4ucmVwbGFjZSgvXHMqLFxzKi9nLCIsIikuc3BsaXQoL1xzKy8pLGE9W107c3dpdGNoKG8ubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIGU7Y2FzZSAyOm8ucHVzaChvWzBdLG9bMV0pO2JyZWFrO2Nhc2UgMzpvLnB1c2gob1sxXSl9cmV0dXJuIGEucHVzaChnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJUb3AiK2ksb1swXSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJSaWdodCIraSxvWzFdLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlckJvdHRvbSIraSxvWzJdLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlckxlZnQiK2ksb1szXSxyKSksYX1mdW5jdGlvbiBib3JkZXJSYWRpdXMoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1uLnNwbGl0KC9ccysvKSxvPVtdO2lmKG4uaW5jbHVkZXMoIi8iKSlyZXR1cm4gZTtzd2l0Y2goaS5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6aS5wdXNoKGlbMF0saVsxXSk7YnJlYWs7Y2FzZSAzOmkucHVzaChpWzFdKX1yZXR1cm4gby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlclRvcExlZnRSYWRpdXMiLGlbMF0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyVG9wUmlnaHRSYWRpdXMiLGlbMV0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLGlbMl0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyIsaVszXSxyKSksb31mdW5jdGlvbiBmbGV4RmxvdyhlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPW4uc3BsaXQoL1xzKy8pLG89Wy9eKGNvbHVtbnxjb2x1bW4tcmV2ZXJzZXxyb3d8cm93LXJldmVyc2UpJC8sL14obm93cmFwfHdyYXB8d3JhcC1yZXZlcnNlKSQvXS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9aS5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlKX0pO3JldHVybiBlPDA/bnVsbDppLnNwbGljZShlLDEpWzBdfSk7cmV0dXJuIGkubGVuZ3RoP2U6W2dlbmVyYXRlRGVjbGFyYXRpb24oImZsZXhEaXJlY3Rpb24iLG9bMF18fCJjb2x1bW4iLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImZsZXhXcmFwIixvWzFdfHwibm93cmFwIixyKV19ZnVuY3Rpb24gZm9udChlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPW4ucmVwbGFjZSgvLFxzKi9nLCIsIikucmVwbGFjZSgvXHMqXC9ccyovLCIvIikucmVwbGFjZSgvWyciXS4rP1snIl0vZyxmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9ccysvZywiIyIpfSkuc3BsaXQoL1xzKy8pLG89W10sYT1bIm5vcm1hbCIsIml0YWxpYyIsIm9ibGlxdWUiXTtvLnB1c2goZ2VuZXJhdGVEZWNsYXJhdGlvbigiZm9udFN0eWxlIixhW01hdGgubWF4KDAsYS5pbmRleE9mKGlbMF0pKV0scikpO3ZhciBzPWkuc2xpY2UoMCwtMikuZmluZChmdW5jdGlvbihlKXtyZXR1cm4vbm9ybWFsfGJvbGR8bGlnaHRlcnxib2xkZXJ8XGQrLy50ZXN0KGUpfSk7aWYocyYmby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRXZWlnaHQiLHMscikpLGk9aS5zbGljZSgtMiksL1tcZC5dK1xTKihcL1tcZC5dK1xTKik/Ly50ZXN0KGlbMF0pKXt2YXIgYz1pWzBdLnNwbGl0KCIvIiksdT1jWzBdLGw9Y1sxXTtyZXR1cm4gby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRTaXplIix1LHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImxpbmVIZWlnaHQiLGx8fCJub3JtYWwiLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRGYW1pbHkiLGlbMV0ucmVwbGFjZSgvIy9nLCIgIikscikpLG99cmV0dXJuW119ZnVuY3Rpb24gYmFja2dyb3VuZChlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudDtyZXR1cm4vXiM/XFMrJC8udGVzdChuKXx8L15yZ2JhPyguKykkLy50ZXN0KG4pP2dlbmVyYXRlRGVjbGFyYXRpb24oImJhY2tncm91bmRDb2xvciIsbixyKTovXmxpbmVhci1ncmFkaWVudCguKykkLy50ZXN0KG4pP2dlbmVyYXRlRGVjbGFyYXRpb24oImJhY2tncm91bmRJbWFnZSIsbixyKTplfXZhciBwYXJzZXJDb2xsZWN0aW9uPXttYXJnaW46bWFyZ2luLHBhZGRpbmc6cGFkZGluZyxib3JkZXI6Ym9yZGVyLGJvcmRlclRvcDpib3JkZXIsYm9yZGVyUmlnaHQ6Ym9yZGVyLGJvcmRlckJvdHRvbTpib3JkZXIsYm9yZGVyTGVmdDpib3JkZXIsYm9yZGVyU3R5bGU6Ym9yZGVyUHJvcGVydHksYm9yZGVyV2lkdGg6Ym9yZGVyUHJvcGVydHksYm9yZGVyQ29sb3I6Ym9yZGVyUHJvcGVydHksYm9yZGVyUmFkaXVzOmJvcmRlclJhZGl1cyxmbGV4RmxvdzpmbGV4Rmxvdyxmb250OmZvbnQsYmFja2dyb3VuZDpiYWNrZ3JvdW5kfTtmdW5jdGlvbiBleHBhbmRTaG9ydGhhbmRQcm9wZXJ0eShlKXt2YXIgdD1wYXJzZXJDb2xsZWN0aW9uW2UucHJvcGVydHldO3JldHVybiB0JiYoZT10KGUpKSxbXS5jb25jYXQoZSl9dmFyIERFRkFVTFRfVEFHX05BTUU9ImRpdiIsQlVCQkxFX0VWRU5UUz1bImNsaWNrIiwibG9uZ3ByZXNzIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwicGFuc3RhcnQiLCJwYW5tb3ZlIiwicGFuZW5kIiwiaG9yaXpvbnRhbHBhbiIsInZlcnRpY2FscGFuIiwic3dpcGUiXTtmdW5jdGlvbiByZWdpc3Rlck5vZGUoZSx0KXtnZXREb2MoZSkubm9kZU1hcFt0Lm5vZGVJZF09dH12YXIgRWxlbWVudD1mdW5jdGlvbihpKXtmdW5jdGlvbiBlKGUsdCxuKXt2b2lkIDA9PT1lJiYoZT1ERUZBVUxUX1RBR19OQU1FKSxpLmNhbGwodGhpcyk7dmFyIHI9Z2V0V2VleEVsZW1lbnQoZSk7aWYociYmIW4pcmV0dXJuIG5ldyByKGUsdCwhMCk7dD10fHx7fSx0aGlzLm5vZGVUeXBlPTEsdGhpcy5ub2RlSWQ9dW5pcXVlSWQoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ZSx0aGlzLmF0dHI9dC5hdHRyfHx7fSx0aGlzLnN0eWxlPXQuc3R5bGV8fHt9LHRoaXMuY2xhc3NTdHlsZT10LmNsYXNzU3R5bGV8fHt9LHRoaXMuZXZlbnQ9e30sdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXSx0aGlzLmNsYXNzTGlzdD10LmNsYXNzTGlzdHx8W10sdGhpcy5zdHlsZXNoZWV0PXQuc3R5bGVzaGVldHx8W10sdGhpcy5yZWFkeT0hMX1yZXR1cm4gaSYmKGUuX19wcm90b19fPWkpLCgoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShpJiZpLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWUpLnByb3RvdHlwZS5hcHBlbmRDaGlsZD1mdW5jdGlvbihlKXtpZighZS5wYXJlbnROb2RlfHxlLnBhcmVudE5vZGU9PT10aGlzKWlmKGUucGFyZW50Tm9kZSl7aWYoY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlthcHBlbmRDaGlsZF0oIit0aGlzLmRvY0lkKyIsIitlLnR5cGUrIiwiK2UucmVmKyIpIE1vdmUgPCIrZS50eXBlKyI+IHRvICIrdGhpcy5jaGlsZHJlbi5sZW5ndGgrIiBvZiA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksbW92ZUluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksMT09PWUubm9kZVR5cGUpe3ZhciB0PW1vdmVJbmRleChlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksbj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO24mJjA8PXQmJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxuLnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbZS5yZWYsdGhpcy5yZWYsdF0pKX19ZWxzZSBpZihjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2FwcGVuZENoaWxkXSgiK3RoaXMuZG9jSWQrIiwiK2UudHlwZSsiLCIrZS5yZWYrIikgQXBwZW5kIDwiK2UudHlwZSsiPiB0byA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksbGlua1BhcmVudChlLHRoaXMpLGluc2VydEluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe2luc2VydEluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKTt2YXIgcj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO3ImJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxyLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixlLnRvSlNPTigpLC0xXSkpLGUucmVhZHk9ITB9fSxlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oZSx0KXtpZighKGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUubmV4dFNpYmxpbmcmJmUubmV4dFNpYmxpbmc9PT10KSlpZihlLnBhcmVudE5vZGUpe2lmKG1vdmVJbmRleChlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpLCEwKSwxPT09ZS5ub2RlVHlwZSl7dmFyIG49bmV4dEVsZW1lbnQodCkscj1tb3ZlSW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbixuP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobik6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxpPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7aSYmMDw9ciYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLGkuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtlLnJlZix0aGlzLnJlZixyXSkpfX1lbHNlIGlmKGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbaW5zZXJ0QmVmb3JlXSgiK3RoaXMuZG9jSWQrIiwiK2UudHlwZSsiLCIrZS5yZWYrIikgSW5zZXJ0IDwiK2UudHlwZSsiPiB0byA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIiksIGJlZm9yZSAoIit0LnJlZisiKS4iKSxsaW5rUGFyZW50KGUsdGhpcyksaW5zZXJ0SW5kZXgoZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KSwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe3ZhciBvPW5leHRFbGVtZW50KHQpLGE9aW5zZXJ0SW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbixvP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobyk6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxzPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7cyYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLHMuc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFbGVtZW50In0sW3RoaXMucmVmLGUudG9KU09OKCksYV0pKSxlLnJlYWR5PSEwfX0sZS5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24oZSx0KXtpZighKGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUucHJldmlvdXNTaWJsaW5nJiZlLnByZXZpb3VzU2libGluZz09PXQpKWlmKGUucGFyZW50Tm9kZSl7aWYobW92ZUluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksMT09PWUubm9kZVR5cGUpe3ZhciBuPW1vdmVJbmRleChlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHJldmlvdXNFbGVtZW50KHQpKSsxKSxyPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7ciYmMDw9biYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLHIuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtlLnJlZix0aGlzLnJlZixuXSkpfX1lbHNlIGlmKGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbaW5zZXJ0QWZ0ZXJdKCIrdGhpcy5kb2NJZCsiLCIrZS50eXBlKyIsIitlLnJlZisiKSBJbnNlcnQgPCIrZS50eXBlKyI+IHRvIDwiK3RoaXMudHlwZSsiPiAoIit0aGlzLnJlZisiKSwgYWZ0ZXIgKCIrdC5yZWYrIikuIiksbGlua1BhcmVudChlLHRoaXMpLGluc2VydEluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe3ZhciBpPWluc2VydEluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihwcmV2aW91c0VsZW1lbnQodCkpKzEpLG89Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtvJiYodGhpcy5jb21wdXRlQ2hpbGRyZW5DbGFzc0xpc3QoZSksby5zZW5kKCJkb20iLHthY3Rpb246ImFkZEVsZW1lbnQifSxbdGhpcy5yZWYsZS50b0pTT04oKSxpXSkpLGUucmVhZHk9ITB9fSxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbihlLHQpe2lmKGUucGFyZW50Tm9kZSl7aWYocmVtb3ZlSW5kZXgoZSx0aGlzLmNoaWxkcmVuLCEwKSwxPT09ZS5ub2RlVHlwZSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIltyZW1vdmVDaGlsZF0oIit0aGlzLmRvY0lkKyIsIitlLnR5cGUrIiwiK2UucmVmKyIpIFJlbW92ZSA8IitlLnR5cGUrIj4gZnJvbSA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIikscmVtb3ZlSW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbik7dmFyIG49Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtuJiZuLnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRWxlbWVudCJ9LFtlLnJlZl0pLGUucmVhZHk9ITF9dGhpcy5jb21wdXRlQ2hpbGRyZW5DbGFzc0xpc3QoZSxlLm5leHRTaWJsaW5nfHx7fSl9dHx8ZS5kZXN0cm95KCl9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dmFyIHQ9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTt0aGlzLnB1cmVDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QmJnQuc2VuZCgiZG9tIix7YWN0aW9uOiJyZW1vdmVFbGVtZW50In0sW2UucmVmXSksZS5yZWFkeT0hMX0pLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLmRlc3Ryb3koKX0pLHRoaXMuY2hpbGRyZW4ubGVuZ3RoPTAsdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoPTB9LGUucHJvdG90eXBlLnNldEF0dHI9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuYXR0cltlXSE9PXR8fCExPT09bil7dGhpcy5hdHRyW2VdPXQ7dmFyIHI9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtpZighbiYmcil7dmFyIGk9e307aVtlXT10LHIuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZixpXSl9fX0sZS5wcm90b3R5cGUuc2V0QXR0cnM9ZnVuY3Rpb24oZSx0KXtpZighaXNFbXB0eShlKSl7dmFyIG49e307Zm9yKHZhciByIGluIGUpdGhpcy5hdHRyW3JdIT09ZVtyXSYmKHRoaXMuYXR0cltyXT1lW3JdLG5bcl09ZVtyXSk7aWYoIWlzRW1wdHkobikpe3ZhciBpPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7IXQmJmkmJmkuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZixuXSl9fX0sZS5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0LG8pe3ZhciBhPXRoaXM7ZXhwYW5kU2hvcnRoYW5kUHJvcGVydHkoe3Byb3BlcnR5OmUsdmFsdWU6dH0pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wcm9wZXJ0eSxuPWUudmFsdWU7aWYoYS5zdHlsZVt0XSE9PW58fCExPT09byl7YS5zdHlsZVt0XT1uO3ZhciByPWdldFRhc2tDZW50ZXIoYS5kb2NJZCk7aWYoIW8mJnIpe3ZhciBpPXt9O2lbdF09IiI9PT1uJiZ0IGluIGEuY2xhc3NTdHlsZT9hLmNsYXNzU3R5bGVbdF06bixyLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbYS5yZWYsaV0pfX19KX0sZS5wcm90b3R5cGUuc2V0U3R5bGVzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztpZighaXNFbXB0eShlKSl7dmFyIGk9e307Zm9yKHZhciBuIGluIGUpe2V4cGFuZFNob3J0aGFuZFByb3BlcnR5KHtwcm9wZXJ0eTpuLHZhbHVlOmVbbl19KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucHJvcGVydHksbj1lLnZhbHVlO3Iuc3R5bGVbdF0hPT1uJiYoci5zdHlsZVt0XT1uLGlbdF09IiI9PT1uJiZ0IGluIHIuY2xhc3NTdHlsZT9yLmNsYXNzU3R5bGVbdF06bil9KX1pZighaXNFbXB0eShpKSl7dmFyIG89Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTshdCYmbyYmby5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW3RoaXMucmVmLGldKX19fSxlLnByb3RvdHlwZS5zZXRDbGFzc1N0eWxlPWZ1bmN0aW9uKGUpe3ZhciB0PSExO2Zvcih2YXIgbiBpbiB0aGlzLmNsYXNzU3R5bGUpbiBpbiBlfHwodD0hMCx0aGlzLmNsYXNzU3R5bGVbbl09IiIpO2Zvcih2YXIgciBpbiBlKWVbcl0hPT10aGlzLmNsYXNzU3R5bGVbcl0mJih0PSEwLHRoaXMuY2xhc3NTdHlsZVtyXT1lW3JdKTtpZih0KXt2YXIgaT1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO2kmJnRoaXMucmVhZHkmJmkuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVTdHlsZSJ9LFt0aGlzLnJlZix0aGlzLnRvU3R5bGUoKV0pfX0sZS5wcm90b3R5cGUuYWRkRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuZXZlbnR8fCh0aGlzLmV2ZW50PXt9KSwhdGhpcy5ldmVudFtlXSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlthZGRFdmVudF0oIit0aGlzLmRvY0lkKyIsIit0aGlzLnR5cGUrIiwiK3RoaXMucmVmKycpIEFkZCAiJytlKyciIGV2ZW50IG9uIDwnK3RoaXMudHlwZSsiPiAoIit0aGlzLnJlZisiKS4iKSx0aGlzLmV2ZW50W2VdPXtoYW5kbGVyOnQscGFyYW1zOm59O3ZhciByPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7ciYmci5zZW5kKCJkb20iLHthY3Rpb246ImFkZEV2ZW50In0sW3RoaXMucmVmLGVdKX19LGUucHJvdG90eXBlLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUpe2lmKHRoaXMuZXZlbnQmJnRoaXMuZXZlbnRbZV0pe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbcmVtb3ZlRXZlbnRdKCIrdGhpcy5kb2NJZCsiLCIrdGhpcy50eXBlKyIsIit0aGlzLnJlZisnKSBSZW1vdmUgIicrZSsnIiBldmVudCBvbiA8Jyt0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksZGVsZXRlIHRoaXMuZXZlbnRbZV07dmFyIHQ9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTt0JiZ0LnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRXZlbnQifSxbdGhpcy5yZWYsZV0pfX0sZS5wcm90b3R5cGUuZmlyZUV2ZW50PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW51bGwsbz0hMSxhPXRoaXMuZXZlbnRbdF07aWYoYSYmZSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIltmaXJlRXZlbnRdKCIrdGhpcy5kb2NJZCsiLCIrdGhpcy50eXBlKyIsIit0aGlzLnJlZisnKSBGaXJlICInK3QrJyIgZXZlbnQgb24gPCcrdGhpcy50eXBlKyI+ICgiK3RoaXMucmVmKyIpLiIpO3ZhciBzPWEuaGFuZGxlcjtlLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe289ITB9O3RyeXtpPXImJnIucGFyYW1zP3MuY2FsbC5hcHBseShzLFt0aGlzXS5jb25jYXQoci5wYXJhbXMsW2VdKSk6cy5jYWxsKHRoaXMsZSl9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcignW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGludm9rZSB0aGUgZXZlbnQgaGFuZGxlciBvZiAiJyt0KyciIG9uICcrdGhpcy50eXBlKyIgKCIrdGhpcy5yZWYrIik6XG4gIitlLnRvU3RyaW5nKCkpLGV9fXJldHVybiFvJiZuJiYtMSE9PUJVQkJMRV9FVkVOVFMuaW5kZXhPZih0KSYmdGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50JiYoZS5jdXJyZW50VGFyZ2V0PXRoaXMucGFyZW50Tm9kZSx0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50KHQsZSxuKSksaX0sZS5wcm90b3R5cGUudG9TdHlsZT1mdW5jdGlvbigpe3ZhciBlPU9iamVjdC5hc3NpZ24oe30sdGhpcy5jbGFzc1N0eWxlKSx0PXRoaXMuc3R5bGU7Zm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07ZVtuXT0iIj09PXImJm4gaW4gdGhpcy5jbGFzc1N0eWxlP3RoaXMuY2xhc3NTdHlsZVtuXTpyfXJldHVybiBlfSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciB0PXtyZWY6dGhpcy5yZWYudG9TdHJpbmcoKSx0eXBlOnRoaXMudHlwZSxhdHRyOnRoaXMuYXR0cixzdHlsZTpub3JtYWxpemVVbml0KHRoaXMudG9TdHlsZSgpKX07dGhpcy5jbGFzc0xpc3QmJnRoaXMuY2xhc3NMaXN0Lmxlbmd0aCYmKHQuY2xhc3M9dGhpcy5jbGFzc0xpc3Quam9pbigiICIpKTt2YXIgbj1bXTtmb3IodmFyIHIgaW4gdGhpcy5ldmVudCl7dmFyIGk9dGhpcy5ldmVudFtyXS5wYXJhbXM7aT9uLnB1c2goe3R5cGU6cixwYXJhbXM6aX0pOm4ucHVzaChyKX1yZXR1cm4gbi5sZW5ndGgmJih0LmV2ZW50PW4pLCFlJiZ0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgmJih0LmNoaWxkcmVuPXRoaXMucHVyZUNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0pTT04oKX0pKSx0fSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiI8Iit0aGlzLnR5cGUrIiBhdHRyPSIrSlNPTi5zdHJpbmdpZnkodGhpcy5hdHRyKSsiIHN0eWxlPSIrSlNPTi5zdHJpbmdpZnkodGhpcy50b1N0eWxlKCkpKyI+Iit0aGlzLnB1cmVDaGlsZHJlbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcoKX0pLmpvaW4oIiIpKyI8LyIrdGhpcy50eXBlKyI+In0sZS5wcm90b3R5cGUuc2V0Q2xhc3NMaXN0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5sZW5ndGg9PT10aGlzLmNsYXNzTGlzdC5sZW5ndGgmJjA9PT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hdC5jbGFzc0xpc3QuaW5jbHVkZXMoZSl9KS5sZW5ndGh8fCh0aGlzLmNsYXNzTGlzdD1lLHRoaXMucGFyZW50Tm9kZSYmdGhpcy5jb21wdXRlQ2xhc3NMaXN0KCkpfSxlLnByb3RvdHlwZS5zZXRTdHlsZXNoZWV0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5sZW5ndGg9PT10aGlzLnN0eWxlc2hlZXQubGVuZ3RoJiYwPT09ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIXQuc3R5bGVzaGVldC5pbmNsdWRlcyhlKX0pLmxlbmd0aHx8KHRoaXMuc3R5bGVzaGVldD1lLHRoaXMuY2xhc3NMaXN0Lmxlbmd0aCYmdGhpcy5wYXJlbnROb2RlJiZ0aGlzLmNvbXB1dGVDbGFzc0xpc3QoKSl9LGUucHJvdG90eXBlLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY2hpbGRyZW4scj10fHxlLGk9cj9uLmluZGV4T2Yocik6MCxvPW4ubGVuZ3RoLTE7Zm9yKCFlfHxlLmNsYXNzTGlzdCYmZS5jbGFzc0xpc3QubGVuZ3RofHwobz10P2ktMTppKTswPD1pJiZpPD1vO2krKyl7dmFyIGE9bltpXTthLmNvbXB1dGVDbGFzc0xpc3QmJmEuY29tcHV0ZUNsYXNzTGlzdCgpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUNsYXNzTGlzdD1mdW5jdGlvbigpe3ZhciB1PXRoaXMsZT10aGlzLmNsYXNzTGlzdCx0PXRoaXMuc3R5bGVzaGVldCxwPXt9LGg9e307ZnVuY3Rpb24gbChlLHQpe3ZhciBuPXQmJnQuY2xhc3NMaXN0O3JldHVybiBuJiZuLmluY2x1ZGVzKGUpfXQuZm9yRWFjaChmdW5jdGlvbihuLGYpe2UuZm9yRWFjaChmdW5jdGlvbihlKXtpZigoblsiQFZFUlNJT04iXXx8MSk8Mil7dmFyIHQ9bltlXTt0JiZPYmplY3QuYXNzaWduKHAsdCl9ZWxzZXt2YXIgYz1uWyIuIitlXTtjJiZPYmplY3Qua2V5cyhjKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXU7aWYoZSlmb3IodmFyIG49ZS5zcGxpdCgiLiIpLHI9bi5sZW5ndGgtMTswPHI7ci0tKXt2YXIgaT1uW3JdLG89aVtpLmxlbmd0aC0xXSxhPWkucmVwbGFjZSgvWyt+PiBdJC8sIiIpO2lmKCJ+Ij09PW98fCIgIj09PW8pe2Zvcih2YXIgcz0ifiI9PT1vPyJwcmV2aW91c1NpYmxpbmciOiJwYXJlbnROb2RlIjt0JiYhbChhLHQ9dFtzXSk7KTtpZighdClyZXR1cm59ZWxzZSBpZigiPiI9PT1vP3Q9dCYmdC5wYXJlbnROb2RlOiIrIj09PW8mJih0PXQmJnQucHJldmlvdXNTaWJsaW5nKSwhbChhLHQpKXJldHVybn12YXIgZD1jW2VdO09iamVjdC5rZXlzKGQpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZFtlXSxuPXRbMF0scj10WzFdLGk9dFsyXSxvPXRbM10sYT1bcixpLGYsb10scz1oW2VdLGM9ITA7aWYocylmb3IodmFyIHU9MDt1PHMubGVuZ3RoO3UrKyl7dmFyIGw9YVt1XS1zW3VdO2lmKDAhPT1sKXtjPTA8bDticmVha319YyYmKHBbZV09bixoW2VdPWEpfSl9KX19KX0pLHRoaXMuc2V0Q2xhc3NTdHlsZShwKSx0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdCgpfSxlfShOb2RlKTtmdW5jdGlvbiBub3JtYWxpemVQcmltaXRpdmUoZSl7dmFyIHQ9dHlwb2YoZSk7c3dpdGNoKHQpe2Nhc2UiVW5kZWZpbmVkIjpjYXNlIk51bGwiOnJldHVybiIiO2Nhc2UiUmVnRXhwIjpyZXR1cm4gZS50b1N0cmluZygpO2Nhc2UiRGF0ZSI6cmV0dXJuIGUudG9JU09TdHJpbmcoKTtjYXNlIk51bWJlciI6Y2FzZSJTdHJpbmciOmNhc2UiQm9vbGVhbiI6Y2FzZSJBcnJheSI6Y2FzZSJPYmplY3QiOnJldHVybiBlO2Nhc2UiQXJyYXlCdWZmZXIiOnJldHVybnsiQHR5cGUiOiJiaW5hcnkiLGRhdGFUeXBlOnQsYmFzZTY0OmJ1ZmZlclRvQmFzZTY0KGUpfTtjYXNlIkludDhBcnJheSI6Y2FzZSJVaW50OEFycmF5IjpjYXNlIlVpbnQ4Q2xhbXBlZEFycmF5IjpjYXNlIkludDE2QXJyYXkiOmNhc2UiVWludDE2QXJyYXkiOmNhc2UiSW50MzJBcnJheSI6Y2FzZSJVaW50MzJBcnJheSI6Y2FzZSJGbG9hdDMyQXJyYXkiOmNhc2UiRmxvYXQ2NEFycmF5IjpyZXR1cm57IkB0eXBlIjoiYmluYXJ5IixkYXRhVHlwZTp0LGJhc2U2NDpidWZmZXJUb0Jhc2U2NChlLmJ1ZmZlcil9O2RlZmF1bHQ6cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpfX1zZXRFbGVtZW50KEVsZW1lbnQpO3ZhciBmYWxsYmFjaz1mdW5jdGlvbigpe30sVGFza0NlbnRlcj1mdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbnN0YW5jZUlkIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpTdHJpbmcoZSl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FsbGJhY2tNYW5hZ2VyIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpuZXcgQ2FsbGJhY2tNYW5hZ2VyKGUpfSksZmFsbGJhY2s9dHx8ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBpbml0JDEoKXt2YXIgZT17Y3JlYXRlRmluaXNoOmdsb2JhbC5jYWxsQ3JlYXRlRmluaXNoLHVwZGF0ZUZpbmlzaDpnbG9iYWwuY2FsbFVwZGF0ZUZpbmlzaCxyZWZyZXNoRmluaXNoOmdsb2JhbC5jYWxsUmVmcmVzaEZpbmlzaCxjcmVhdGVCb2R5Omdsb2JhbC5jYWxsQ3JlYXRlQm9keSxhZGRFbGVtZW50Omdsb2JhbC5jYWxsQWRkRWxlbWVudCxyZW1vdmVFbGVtZW50Omdsb2JhbC5jYWxsUmVtb3ZlRWxlbWVudCxtb3ZlRWxlbWVudDpnbG9iYWwuY2FsbE1vdmVFbGVtZW50LHVwZGF0ZUF0dHJzOmdsb2JhbC5jYWxsVXBkYXRlQXR0cnMsdXBkYXRlU3R5bGU6Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZSxhZGRFdmVudDpnbG9iYWwuY2FsbEFkZEV2ZW50LHJlbW92ZUV2ZW50Omdsb2JhbC5jYWxsUmVtb3ZlRXZlbnQsX191cGRhdGVDb21wb25lbnREYXRhOmdsb2JhbC5fX3VwZGF0ZUNvbXBvbmVudERhdGF9LHQ9VGFza0NlbnRlci5wcm90b3R5cGUsbj1mdW5jdGlvbihuKXt2YXIgcj1lW25dO3Rbbl09cj9mdW5jdGlvbihlLHQpe3JldHVybiByLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KHQpKX06ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZmFsbGJhY2soZSxbe21vZHVsZToiZG9tIixtZXRob2Q6bixhcmdzOnR9XSwiLTEiKX19O2Zvcih2YXIgciBpbiBlKW4ocik7dC5jb21wb25lbnRIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlQ29tcG9uZW50fHxmdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBmYWxsYmFjayhlLFt7Y29tcG9uZW50OmkuY29tcG9uZW50LHJlZjp0LG1ldGhvZDpuLGFyZ3M6cn1dKX0sdC5tb2R1bGVIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlTW9kdWxlfHxmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZmFsbGJhY2soZSxbe21vZHVsZTp0LG1ldGhvZDpuLGFyZ3M6cn1dKX19ZnVuY3Rpb24gZmlyZUV2ZW50KGUsdCxuLHIsaSxvKXt2YXIgYT1lLmdldFJlZih0KTtyZXR1cm4gYT9lLmZpcmVFdmVudChhLG4scixpLG8pOnI/KHIuX25vZGVJZD10LGUuZmlyZUV2ZW50KGUuZ2V0UmVmKCJfZG9jdW1lbnRFbGVtZW50IiksbixyLGksbykpOnZvaWQgMH1mdW5jdGlvbiBjYWxsYmFjayhlLHQsbixyKXtyZXR1cm4gZS50YXNrQ2VudGVyLmNhbGxiYWNrKHQsbixyKX1mdW5jdGlvbiBjb21wb25lbnRIb29rKGUsdCxuLHIsaSl7aWYoIWV8fCFlLnRhc2tDZW50ZXIpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIENhblwndCBmaW5kICJkb2N1bWVudCIgb3IgInRhc2tDZW50ZXIiLicpLG51bGw7dmFyIG89bnVsbDt0cnl7bz1lLnRhc2tDZW50ZXIudHJpZ2dlckhvb2sodCxuLHIsaSl9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcignW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHRyaWdnZXIgdGhlICInK24rIkAiK3IrJyIgaG9vayBvbiAnK3QrIi4iKSxlfXJldHVybiBvfWZ1bmN0aW9uIHJlY2VpdmVUYXNrcyhlLHQpe3ZhciBuPWdldERvYyhlKTtyZXR1cm4gbj9BcnJheS5pc0FycmF5KHQpP3QubWFwKGZ1bmN0aW9uKGUpe3N3aXRjaChlLm1ldGhvZCl7Y2FzZSJjYWxsYmFjayI6cmV0dXJuIGNhbGxiYWNrLmFwcGx5KHZvaWQgMCxbbl0uY29uY2F0KGUuYXJncykpO2Nhc2UiZmlyZUV2ZW50U3luYyI6Y2FzZSJmaXJlRXZlbnQiOnJldHVybiBmaXJlRXZlbnQuYXBwbHkodm9pZCAwLFtuXS5jb25jYXQoZS5hcmdzKSk7Y2FzZSJjb21wb25lbnRIb29rIjpyZXR1cm4gY29tcG9uZW50SG9vay5hcHBseSh2b2lkIDAsW25dLmNvbmNhdChlLmFyZ3MpKX19KTp2b2lkIDA6bmV3IEVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gcmVjZWl2ZVRhc2tzLCBpbnN0YW5jZSAoIitlKyIpIGlzIG5vdCBhdmFpbGFibGUuIil9VGFza0NlbnRlci5wcm90b3R5cGUuY2FsbGJhY2s9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5jb25zdW1lKGUsdCxuKX0sVGFza0NlbnRlci5wcm90b3R5cGUucmVnaXN0ZXJIb29rPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuKGU9dGhpcy5jYWxsYmFja01hbmFnZXIpLnJlZ2lzdGVySG9vay5hcHBseShlLHQpfSxUYXNrQ2VudGVyLnByb3RvdHlwZS50cmlnZ2VySG9vaz1mdW5jdGlvbigpe2Zvcih2YXIgZSx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09YXJndW1lbnRzW25dO3JldHVybihlPXRoaXMuY2FsbGJhY2tNYW5hZ2VyKS50cmlnZ2VySG9vay5hcHBseShlLHQpfSxUYXNrQ2VudGVyLnByb3RvdHlwZS51cGRhdGVEYXRhPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnNlbmQoIm1vZHVsZSIse21vZHVsZToiZG9tIixtZXRob2Q6InVwZGF0ZUNvbXBvbmVudERhdGEifSxbZSx0LG5dKX0sVGFza0NlbnRlci5wcm90b3R5cGUuZGVzdHJveUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmNsb3NlKCl9LFRhc2tDZW50ZXIucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciByPXR5cG9mKGUpO2lmKGUmJmUgaW5zdGFuY2VvZiBFbGVtZW50KXJldHVybiBlLnJlZjtpZihlJiZlLl9pc1Z1ZSYmZS4kZWwgaW5zdGFuY2VvZiBFbGVtZW50KXJldHVybiBlLiRlbC5yZWY7aWYoIkZ1bmN0aW9uIj09PXIpcmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmFkZChlKS50b1N0cmluZygpO2lmKHQpe2lmKCJPYmplY3QiPT09cil7dmFyIGk9e307Zm9yKHZhciBvIGluIGUpaVtvXT1uLm5vcm1hbGl6ZShlW29dLCEwKTtyZXR1cm4gaX1pZigiQXJyYXkiPT09cilyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG4ubm9ybWFsaXplKGUsITApfSl9cmV0dXJuIGUmJmUucmVmJiZlWyJbW1ZpcnR1YWxFbGVtZW50XV0iXT9lLnJlZjpub3JtYWxpemVQcmltaXRpdmUoZSl9LFRhc2tDZW50ZXIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcyxvPXQuYWN0aW9uLGE9dC5jb21wb25lbnQscz10LnJlZixjPXQubW9kdWxlLHU9dC5tZXRob2Q7c3dpdGNoKG49bi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGkubm9ybWFsaXplKGUpfSksIk9iamVjdCI9PT10eXBvZihyKSYmKHI9dGhpcy5ub3JtYWxpemUociwhMCkpLGUpe2Nhc2UiZG9tIjpyZXR1cm4gY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlt0YXNrXSgiK3RoaXMuaW5zdGFuY2VJZCsiLCIrdGhpcy50eXBlKyIsIitvKyIpICIrSlNPTi5zdHJpbmdpZnkobikpLHRoaXNbb10odGhpcy5pbnN0YW5jZUlkLG4pO2Nhc2UiY29tcG9uZW50IjpyZXR1cm4gdGhpcy5jb21wb25lbnRIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxzLHUsbixPYmplY3QuYXNzaWduKHtjb21wb25lbnQ6YX0scikpO2RlZmF1bHQ6cmV0dXJuIGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbdGFza10oIit0aGlzLmluc3RhbmNlSWQrIiwiK2MrIiwiK3UrIikgIitKU09OLnN0cmluZ2lmeShuKSksdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxjLHUsbixyKX19LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxET009ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpc1tlXSh0aGlzLmluc3RhbmNlSWQsdCl9LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxDb21wb25lbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcih0aGlzLmluc3RhbmNlSWQsZSx0LG4scil9LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxNb2R1bGU9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMubW9kdWxlSGFuZGxlcih0aGlzLmluc3RhbmNlSWQsZSx0LG4scil9O3ZhciB3ZWV4TW9kdWxlcz17fTtmdW5jdGlvbiByZWdpc3Rlck1vZHVsZXMoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWZ1bmN0aW9uKHQpe2hhc093bih3ZWV4TW9kdWxlcyx0KXx8KHdlZXhNb2R1bGVzW3RdPXt9KSxBcnJheS5pc0FycmF5KGVbdF0pJiZlW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlP3dlZXhNb2R1bGVzW3RdW2VdPSEwOmlzUGxhaW5PYmplY3QoZSkmJiJzdHJpbmciPT10eXBlb2YgZS5uYW1lJiYod2VleE1vZHVsZXNbdF1bZS5uYW1lXT1lLmFyZ3N8fFtdKX0pfTtmb3IodmFyIG4gaW4gZSl0KG4pfWZ1bmN0aW9uIGlzUmVnaXN0ZXJlZE1vZHVsZShlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8hKCF3ZWV4TW9kdWxlc1tlXXx8IXdlZXhNb2R1bGVzW2VdW3RdKTohIXdlZXhNb2R1bGVzW2VdfWZ1bmN0aW9uIGdldE1vZHVsZURlc2NyaXB0aW9uKGUpe3JldHVybiB3ZWV4TW9kdWxlc1tlXX12YXIgd2VleENvbXBvbmVudHM9e307ZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnRzKGUpe0FycmF5LmlzQXJyYXkoZSkmJmUuZm9yRWFjaChmdW5jdGlvbihlKXtlJiYoInN0cmluZyI9PXR5cGVvZiBlP3dlZXhDb21wb25lbnRzW2VdPSEwOmlzUGxhaW5PYmplY3QoZSkmJiJzdHJpbmciPT10eXBlb2YgZS50eXBlJiZyZWdpc3RlckVsZW1lbnQoKHdlZXhDb21wb25lbnRzW2UudHlwZV09ZSkudHlwZSxlLm1ldGhvZHMpKX0pfWZ1bmN0aW9uIGlzUmVnaXN0ZXJlZENvbXBvbmVudChlKXtyZXR1cm4hIXdlZXhDb21wb25lbnRzW2VdfXZhciBzZXJ2aWNlcz1bXTtmdW5jdGlvbiByZWdpc3RlcihlLHQpe2hhcyhlKT9jb25zb2xlLndhcm4oJ1NlcnZpY2UgIicrZSsnIiBoYXMgYmVlbiByZWdpc3RlcmVkIGFscmVhZHkhJyk6KHQ9T2JqZWN0LmFzc2lnbih7fSx0KSxzZXJ2aWNlcy5wdXNoKHtuYW1lOmUsb3B0aW9uczp0fSkpfWZ1bmN0aW9uIHVucmVnaXN0ZXIobil7c2VydmljZXMuc29tZShmdW5jdGlvbihlLHQpe2lmKGUubmFtZT09PW4pcmV0dXJuIHNlcnZpY2VzLnNwbGljZSh0LDEpLCEwfSl9ZnVuY3Rpb24gaGFzKGUpe3JldHVybiAwPD1pbmRleE9mKGUpfWZ1bmN0aW9uIGluZGV4T2YoZSl7cmV0dXJuIHNlcnZpY2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lfSkuaW5kZXhPZihlKX12YXIgQ29tbWVudD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLm5vZGVUeXBlPTgsdGhpcy5ub2RlSWQ9dW5pcXVlSWQoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ImNvbW1lbnQiLHRoaXMudmFsdWU9ZSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksKChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZSkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlx4M2MhLS0gIit0aGlzLnZhbHVlKyIgLS1ceDNlIn0sZX0oTm9kZSk7ZnVuY3Rpb24gY3JlYXRlQWN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PVtdKSx7bW9kdWxlOiJkb20iLG1ldGhvZDplLGFyZ3M6dH19dmFyIExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuYmF0Y2hlZD0hMSx0aGlzLnVwZGF0ZXM9W10sImZ1bmN0aW9uIj09dHlwZW9mIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImhhbmRsZXIiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSk6Y29uc29sZS5lcnJvcigiW0pTIFJ1bnRpbWVdIGludmFsaWQgcGFyYW1ldGVyLCBoYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbiIpfTtMaXN0ZW5lci5wcm90b3R5cGUuY3JlYXRlRmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybigwLHRoaXMuaGFuZGxlcikoW2NyZWF0ZUFjdGlvbigiY3JlYXRlRmluaXNoIildLGUpfSxMaXN0ZW5lci5wcm90b3R5cGUudXBkYXRlRmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybigwLHRoaXMuaGFuZGxlcikoW2NyZWF0ZUFjdGlvbigidXBkYXRlRmluaXNoIildLGUpfSxMaXN0ZW5lci5wcm90b3R5cGUucmVmcmVzaEZpbmlzaD1mdW5jdGlvbihlKXtyZXR1cm4oMCx0aGlzLmhhbmRsZXIpKFtjcmVhdGVBY3Rpb24oInJlZnJlc2hGaW5pc2giKV0sZSl9LExpc3RlbmVyLnByb3RvdHlwZS5jcmVhdGVCb2R5PWZ1bmN0aW9uKGUpe3ZhciB0PWUudG9KU09OKCksbj10LmNoaWxkcmVuO2RlbGV0ZSB0LmNoaWxkcmVuO3ZhciByPVtjcmVhdGVBY3Rpb24oImNyZWF0ZUJvZHkiLFt0XSldO3JldHVybiBuJiZyLnB1c2guYXBwbHkocixuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gY3JlYXRlQWN0aW9uKCJhZGRFbGVtZW50IixbdC5yZWYsZSwtMV0pfSkpLHRoaXMuYWRkQWN0aW9ucyhyKX0sTGlzdGVuZXIucHJvdG90eXBlLmFkZEVsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAwPD1ufHwobj0tMSksdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigiYWRkRWxlbWVudCIsW3QsZS50b0pTT04oKSxuXSkpfSxMaXN0ZW5lci5wcm90b3R5cGUucmVtb3ZlRWxlbWVudD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgdD1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gY3JlYXRlQWN0aW9uKCJyZW1vdmVFbGVtZW50IixbZV0pfSk7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyh0KX1yZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigicmVtb3ZlRWxlbWVudCIsW2VdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5tb3ZlRWxlbWVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oIm1vdmVFbGVtZW50IixbZSx0LG5dKSl9LExpc3RlbmVyLnByb3RvdHlwZS5zZXRBdHRyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtyZXR1cm4gclt0XT1uLHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oInVwZGF0ZUF0dHJzIixbZSxyXSkpfSxMaXN0ZW5lci5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O3JldHVybiByW3RdPW4sdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigidXBkYXRlU3R5bGUiLFtlLHJdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5zZXRTdHlsZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigidXBkYXRlU3R5bGUiLFtlLHRdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5hZGRFdmVudD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCJhZGRFdmVudCIsW2UsdF0pKX0sTGlzdGVuZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oInJlbW92ZUV2ZW50IixbZSx0XSkpfSxMaXN0ZW5lci5wcm90b3R5cGUuaGFuZGxlcj1mdW5jdGlvbihlLHQpe3JldHVybiB0JiZ0KCl9LExpc3RlbmVyLnByb3RvdHlwZS5hZGRBY3Rpb25zPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMudXBkYXRlcyxuPXRoaXMuaGFuZGxlcjtpZihBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pLCF0aGlzLmJhdGNoZWQpcmV0dXJuIG4oZSk7dC5wdXNoLmFwcGx5KHQsZSl9O3ZhciBoYW5kbGVyTWFwPXtjcmVhdGVCb2R5OiJjYWxsQ3JlYXRlQm9keSIsYWRkRWxlbWVudDoiY2FsbEFkZEVsZW1lbnQiLHJlbW92ZUVsZW1lbnQ6ImNhbGxSZW1vdmVFbGVtZW50Iixtb3ZlRWxlbWVudDoiY2FsbE1vdmVFbGVtZW50Iix1cGRhdGVBdHRyczoiY2FsbFVwZGF0ZUF0dHJzIix1cGRhdGVTdHlsZToiY2FsbFVwZGF0ZVN0eWxlIixhZGRFdmVudDoiY2FsbEFkZEV2ZW50IixyZW1vdmVFdmVudDoiY2FsbFJlbW92ZUV2ZW50In07ZnVuY3Rpb24gY3JlYXRlSGFuZGxlcihyLGUpe3ZhciBpPWV8fGdsb2JhbC5jYWxsTmF0aXZlO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBpJiZjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gbm8gZGVmYXVsdCBoYW5kbGVyIiksZnVuY3Rpb24oZSl7QXJyYXkuaXNBcnJheShlKXx8KGU9W2VdKTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZGlzcGF0Y2hUYXNrKHIsZVt0XSxpKTtpZigtMT09PW4pcmV0dXJuIG59fX1mdW5jdGlvbiBoYXNBdmFpbGFibGVIYW5kbGVyKGUsdCl7cmV0dXJuImRvbSI9PT1lJiZoYW5kbGVyTWFwW3RdJiYiZnVuY3Rpb24iPT10eXBlb2YgZ2xvYmFsW2hhbmRsZXJNYXBbdF1dfWZ1bmN0aW9uIGRpc3BhdGNoVGFzayhlLHQsbil7dmFyIHI9dC5tb2R1bGUsaT10Lm1ldGhvZCxvPXQuYXJncztyZXR1cm4gaGFzQXZhaWxhYmxlSGFuZGxlcihyLGkpP2dsb2JhbFtoYW5kbGVyTWFwW2ldXS5hcHBseShnbG9iYWwsW2VdLmNvbmNhdChvLFsiLTEiXSkpOm4oZSxbdF0sIi0xIil9ZnVuY3Rpb24gdXBkYXRlRWxlbWVudChlLHQpe3ZhciBuPXQuYXR0cnN8fHt9O2Zvcih2YXIgciBpbiBuKWUuc2V0QXR0cihyLG5bcl0sITApO3ZhciBpPXQuc3R5bGV8fHt9O2Zvcih2YXIgbyBpbiBpKWUuc2V0U3R5bGUobyxpW29dLCEwKX12YXIgRG9jdW1lbnQ9ZnVuY3Rpb24gZSh0LG4scil7dD10P3QudG9TdHJpbmcoKToiIix0aGlzLmlkPXQsdGhpcy5VUkw9bixhZGREb2ModCx0aGlzKSx0aGlzLm5vZGVNYXA9e307dmFyIGk9ZS5MaXN0ZW5lcnx8TGlzdGVuZXI7dGhpcy5saXN0ZW5lcj1uZXcgaSh0LHJ8fGNyZWF0ZUhhbmRsZXIodCxlLmhhbmRsZXIpKSx0aGlzLnRhc2tDZW50ZXI9bmV3IFRhc2tDZW50ZXIodCxyP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTtyZXR1cm4gci5hcHBseSh2b2lkIDAsdCl9OmUuaGFuZGxlciksdGhpcy5jcmVhdGVEb2N1bWVudEVsZW1lbnQoKX07RG9jdW1lbnQucHJvdG90eXBlLmdldFJlZj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ub2RlTWFwW2VdfSxEb2N1bWVudC5wcm90b3R5cGUub3Blbj1mdW5jdGlvbigpe3RoaXMubGlzdGVuZXIuYmF0Y2hlZD0hMX0sRG9jdW1lbnQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5saXN0ZW5lci5iYXRjaGVkPSEwfSxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztpZighdGhpcy5kb2N1bWVudEVsZW1lbnQpe3ZhciBlPW5ldyBFbGVtZW50KCJkb2N1bWVudCIpO2UuZG9jSWQ9dGhpcy5pZCxlLm93bmVyRG9jdW1lbnQ9dGhpcyxlLnJvbGU9ImRvY3VtZW50RWxlbWVudCIsZS5kZXB0aD0wLGUucmVmPSJfZG9jdW1lbnRFbGVtZW50Iix0aGlzLm5vZGVNYXAuX2RvY3VtZW50RWxlbWVudD1lLHRoaXMuZG9jdW1lbnRFbGVtZW50PWUsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImFwcGVuZENoaWxkIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSl7YXBwZW5kQm9keShuLGUpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJpbnNlcnRCZWZvcmUiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihlLHQpe2FwcGVuZEJvZHkobixlLHQpfX0pLGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCdDcmVhdGUgZG9jdW1lbnQgZWxlbWVudCAoaWQ6ICInK2UuZG9jSWQrJyIsIHJlZjogIicrZS5yZWYrJyIpJyl9cmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50fSxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlQm9keT1mdW5jdGlvbihlLHQpe2lmKCF0aGlzLmJvZHkpe3ZhciBuPW5ldyBFbGVtZW50KGUsdCk7c2V0Qm9keSh0aGlzLG4pLGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbY3JlYXRlQm9keV0oIit0aGlzLmlkKyIsIituLnR5cGUrIiwiK24ucmVmKyIpICgiK0pTT04uc3RyaW5naWZ5KG4udG9KU09OKCEwKSkrIikuIil9cmV0dXJuIHRoaXMuYm9keX0sRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgRWxlbWVudChlLHQpO3JldHVybiBjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2NyZWF0ZUVsZW1lbnRdKCIrdGhpcy5pZCsiLCIrbi50eXBlKyIsIituLnJlZisiKSAoIitKU09OLnN0cmluZ2lmeShuLnRvSlNPTighMCkpKyIpLiIpLG59LERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVDb21tZW50PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgQ29tbWVudChlKX0sRG9jdW1lbnQucHJvdG90eXBlLmZpcmVFdmVudD1mdW5jdGlvbihlLHQsbixyLGkpe2lmKGUpeyhuPW58fHt9KS50eXBlPW4udHlwZXx8dCxuLnRhcmdldD1lLG4uY3VycmVudFRhcmdldD1lLG4udGltZXN0YW1wPURhdGUubm93KCksciYmdXBkYXRlRWxlbWVudChlLHIpO3ZhciBvPSJ3ZWV4IiE9PXRoaXMuX18kY29tcGlsZXJfXyxhPXRoaXMuZ2V0UmVmKCJfcm9vdCIpO2lmKGEmJmEuYXR0cil7dmFyIHM9YS5hdHRyLmJ1YmJsZTtvPSJ0cnVlIj09PXN8fCEwPT09c3x8byYmdm9pZCAwPT09c31yZXR1cm4id2VleCIhPT10aGlzLl9fJGNvbXBpbGVyX18mJihuPXByb2Nlc3NFdmVudChuKSksZS5maXJlRXZlbnQodCxuLG8saSl9fSxEb2N1bWVudC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbZGVzdHJveV0oIit0aGlzLmlkKyIsZG9jdW1lbnQsIit0aGlzLnJlZisnKSBEZXN0cm95IGRvY3VtZW50IChpZDogIicrdGhpcy5pZCsnIiwgVVJMOiAiJyt0aGlzLlVSTCsnIiknKSx0aGlzLnRhc2tDZW50ZXIuZGVzdHJveUNhbGxiYWNrKCksZGVsZXRlIHRoaXMubGlzdGVuZXIsZGVsZXRlIHRoaXMubm9kZU1hcCxkZWxldGUgdGhpcy50YXNrQ2VudGVyLHJlbW92ZURvYyh0aGlzLmlkKX0sRG9jdW1lbnQuaGFuZGxlcj1udWxsO3ZhciBsZXg9e0lucHV0RWxlbWVudERpdjoiPFdoaXRlU3BhY2U+fDxMaW5lVGVybWluYXRvcj58PFJlc2VydmVkV29yZD58PElkZW50aWZpZXI+fDxOdW1lcmljTGl0ZXJhbD58PFB1bmN0dWF0b3I+fDxTdHJpbmdMaXRlcmFsPiIsSW5wdXRFbGVtZW50UmVnRXhwOiI8V2hpdGVTcGFjZT58PExpbmVUZXJtaW5hdG9yPnw8UmVzZXJ2ZWRXb3JkPnw8SWRlbnRpZmllcj58PE51bWVyaWNMaXRlcmFsPnw8UHVuY3R1YXRvcj58PFN0cmluZ0xpdGVyYWw+IixSZXNlcnZlZFdvcmQ6IjxLZXl3b3JkPnw8TnVsbExpdGVyYWw+fDxCb29sZWFuTGl0ZXJhbD4iLFdoaXRlU3BhY2U6L1tcdFx2XGZcdTAwMjBcdTAwQTBcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMDVmXHUzMDAwXHVGRUZGXS8sTGluZVRlcm1pbmF0b3I6L1tcblxyXHUyMDI4XHUyMDI5XS8sS2V5d29yZDovbmV3KD8hW18kYS16QS1aMC05XSl8dm9pZCg/IVtfJGEtekEtWjAtOV0pfGRlbGV0ZSg/IVtfJGEtekEtWjAtOV0pfGluKD8hW18kYS16QS1aMC05XSl8aW5zdGFuY2VvZig/IVtfJGEtekEtWjAtOV0pfHR5cGVvZig/IVtfJGEtekEtWjAtOV0pLyxOdWxsTGl0ZXJhbDovbnVsbCg/IVtfJGEtekEtWjAtOV0pLyxCb29sZWFuTGl0ZXJhbDovKD86dHJ1ZXxmYWxzZSkoPyFbXyRhLXpBLVowLTldKS8sSWRlbnRpZmllcjovW18kYS16QS1aXVtfJGEtekEtWjAtOV0qLyxQdW5jdHVhdG9yOi9cL3w9PnxcKlwqfD4+Pj18Pj49fDw8PXw9PT18IT09fD4+Pnw8PHwlPXxcKj18LT18XCs9fDw9fD49fD09fCE9fFxePXxcfD18XHxcfHwmJnwmPXw+PnxcK1wrfC0tfFw6fH18XCp8JnxcfHxcXnwhfH58LXxcK3xcP3wlfD18Pnw8fCx8O3xcLig/IVswLTldKXxcXXxcW3xcKXxcKHx7LyxEaXZQdW5jdHVhdG9yOi9cLz18XC8vLE51bWVyaWNMaXRlcmFsOi8oPzowW3hYXVswLTlhLWZBLUZdKnxcLlswLTldK3woPzpbMS05XStbMC05XSp8MCkoPzpcLlswLTldKnxcLik/KSg/OltlRV1bKy1dezAsMX1bMC05XSspPyg/IVtfJGEtekEtWjAtOV0pLyxTdHJpbmdMaXRlcmFsOi8iKD86W14iXG5cXFxyXHUyMDI4XHUyMDI5XXxcXCg/OlsnIlxcYmZucnR2XG5cclx1MjAyOFx1MjAyOV18XHJcbil8XFx4WzAtOWEtZkEtRl17Mn18XFx1WzAtOWEtZkEtRl17NH18XFxbXjAtOXV4JyJcXGJmbnJ0dlxuXFxcclx1MjAyOFx1MjAyOV0pKiJ8Jyg/OlteJ1xuXFxcclx1MjAyOFx1MjAyOV18XFwoPzpbJyJcXGJmbnJ0dlxuXHJcdTIwMjhcdTIwMjldfFxyXG4pfFxceFswLTlhLWZBLUZdezJ9fFxcdVswLTlhLWZBLUZdezR9fFxcW14wLTl1eCciXFxiZm5ydHZcblxcXHJcdTIwMjhcdTIwMjldKSonLyxSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWw6L1wvKD86XFsoPzpcXFtcc1xTXXxbXlxdXSkqXF18W14qXC9cXFxuXHJcdTIwMjhcdTIwMjldfFxcW15cblxyXHUyMDI4XHUyMDI5XSkoPzpcWyg/OlxcW1xzXFNdfFteXF1dKSpcXXxbXlwvXFxcblxyXHUyMDI4XHUyMDI5XXxcXFteXG5cclx1MjAyOFx1MjAyOV0pKlwvWzAtOWEtekEtWl0qL307ZnVuY3Rpb24gWFJlZ0V4cChyLGUsaSl7dmFyIG89W2VdO3ZhciBhPWZ1bmN0aW9uIG4oZSl7dmFyIHQ9bmV3IFJlZ0V4cDtyZXR1cm4gdC5jb21waWxlKGUucmVwbGFjZSgvPChbXj5dKyk+L2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gclt0XT8oby5wdXNoKHQpLHJbdF1pbnN0YW5jZW9mIFJlZ0V4cD8iKCIrclt0XS5zb3VyY2UrIikiOiIoIituKHJbdF0pLnNvdXJjZSsiKSIpOiIifSksaSksdH0ocltlXSk7dGhpcy5leGVjPWZ1bmN0aW9uKGUpe3ZhciB0PWEuZXhlYyhlKTtpZihudWxsPT10KXJldHVybiBudWxsO2Zvcih2YXIgbj1uZXcgU3RyaW5nKHRbMF0pLHI9MDtyPG8ubGVuZ3RoO3IrKyl0W3JdJiYobltvW3JdXT10W3JdKTtyZXR1cm4gbn0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxhc3RJbmRleCIse2dldDpmdW5jdGlvbigpe3JldHVybiBhLmxhc3RJbmRleH0sc2V0OmZ1bmN0aW9uKGUpe2EubGFzdEluZGV4PWV9fSl9ZnVuY3Rpb24gTGV4aWNhbFBhcnNlcigpe3ZhciBpLG89bmV3IFhSZWdFeHAobGV4LCJJbnB1dEVsZW1lbnREaXYiLCJnIiksYT1uZXcgWFJlZ0V4cChsZXgsIklucHV0RWxlbWVudFJlZ0V4cCIsImciKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic291cmNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9LHNldDpmdW5jdGlvbihlKXtpPWUsby5sYXN0SW5kZXg9MCxhLmxhc3RJbmRleD0wfX0pLHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXtvLmxhc3RJbmRleD0wLGEubGFzdEluZGV4PTB9LHRoaXMuZ2V0TmV4dFRva2VuPWZ1bmN0aW9uKGUpe3ZhciB0LG49by5sYXN0SW5kZXgscj0odD1lP286YSkuZXhlYyhpKTtpZihyJiZ0Lmxhc3RJbmRleC1uPnIubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiBJTExFR0FMIik7cmV0dXJuIG8ubGFzdEluZGV4PXQubGFzdEluZGV4LGEubGFzdEluZGV4PXQubGFzdEluZGV4LHJ9fXZhciBydWxlcz17SWRlbnRpZmllck5hbWU6W1siSWRlbnRpZmllciJdXSxMaXRlcmFsOltbIk51bGxMaXRlcmFsIl0sWyJCb29sZWFuTGl0ZXJhbCJdLFsiTnVtZXJpY0xpdGVyYWwiXSxbIlN0cmluZ0xpdGVyYWwiXSxbIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCJdXSxQcmltYXJ5RXhwcmVzc2lvbjpbWyJJZGVudGlmaWVyIl0sWyJMaXRlcmFsIl0sWyIoIiwiRXhwcmVzc2lvbiIsIikiXV0sQ2FsbEV4cHJlc3Npb246W1siUHJpbWFyeUV4cHJlc3Npb24iLCJBcmd1bWVudHMiXSxbIkNhbGxFeHByZXNzaW9uIiwiQXJndW1lbnRzIl1dLEFyZ3VtZW50czpbWyIoIiwiKSJdLFsiKCIsIkFyZ3VtZW50TGlzdCIsIikiXV0sQXJndW1lbnRMaXN0OltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiQXJndW1lbnRMaXN0IiwiLCIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdXSxMZWZ0SGFuZFNpZGVFeHByZXNzaW9uOltbIlByaW1hcnlFeHByZXNzaW9uIl0sWyJDYWxsRXhwcmVzc2lvbiJdXSxVbmFyeUV4cHJlc3Npb246W1siTGVmdEhhbmRTaWRlRXhwcmVzc2lvbiJdLFsidm9pZCIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiKyIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiLSIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsifiIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiISIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxFeHBvbmVudGlhdGlvbkV4cHJlc3Npb246W1siVW5hcnlFeHByZXNzaW9uIl0sWyJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iLCIqKiIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246W1siTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwiLyIsIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdLFsiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIqIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIlIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl1dLEFkZGl0aXZlRXhwcmVzc2lvbjpbWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIisiLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIi0iLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXV0sU2hpZnRFeHByZXNzaW9uOltbIkFkZGl0aXZlRXhwcmVzc2lvbiJdLFsiU2hpZnRFeHByZXNzaW9uIiwiPDwiLCJBZGRpdGl2ZUV4cHJlc3Npb24iXSxbIlNoaWZ0RXhwcmVzc2lvbiIsIj4+IiwiQWRkaXRpdmVFeHByZXNzaW9uIl0sWyJTaGlmdEV4cHJlc3Npb24iLCI+Pj4iLCJBZGRpdGl2ZUV4cHJlc3Npb24iXV0sUmVsYXRpb25hbEV4cHJlc3Npb246W1siU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIjwiLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPiIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI8PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI+PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCJpbnN0YW5jZW9mIiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsImluIiwiU2hpZnRFeHByZXNzaW9uIl1dLEVxdWFsaXR5RXhwcmVzc2lvbjpbWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiIT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT09IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIiE9PSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl1dLEJpdHdpc2VBTkRFeHByZXNzaW9uOltbIkVxdWFsaXR5RXhwcmVzc2lvbiJdLFsiQml0d2lzZUFOREV4cHJlc3Npb24iLCImIiwiRXF1YWxpdHlFeHByZXNzaW9uIl1dLEJpdHdpc2VYT1JFeHByZXNzaW9uOltbIkJpdHdpc2VBTkRFeHByZXNzaW9uIl0sWyJCaXR3aXNlWE9SRXhwcmVzc2lvbiIsIl4iLCJCaXR3aXNlQU5ERXhwcmVzc2lvbiJdXSxCaXR3aXNlT1JFeHByZXNzaW9uOltbIkJpdHdpc2VYT1JFeHByZXNzaW9uIl0sWyJCaXR3aXNlT1JFeHByZXNzaW9uIiwifCIsIkJpdHdpc2VYT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxBTkRFeHByZXNzaW9uOltbIkJpdHdpc2VPUkV4cHJlc3Npb24iXSxbIkxvZ2ljYWxBTkRFeHByZXNzaW9uIiwiJiYiLCJCaXR3aXNlT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxPUkV4cHJlc3Npb246W1siTG9naWNhbEFOREV4cHJlc3Npb24iXSxbIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCJ8fCIsIkxvZ2ljYWxBTkRFeHByZXNzaW9uIl1dLENvbmRpdGlvbmFsRXhwcmVzc2lvbjpbWyJMb2dpY2FsT1JFeHByZXNzaW9uIl0sWyJMb2dpY2FsT1JFeHByZXNzaW9uIiwiPyIsIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCI6IiwiTG9naWNhbE9SRXhwcmVzc2lvbiJdXSxFeHByZXNzaW9uOltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXhwcmVzc2lvbiIsIiwiLCJDb25kaXRpb25hbEV4cHJlc3Npb24iXV0sUHJvZ3JhbTpbWyJFeHByZXNzaW9uIl1dfTtmdW5jdGlvbiBTeW1ib2wkMShlLHQpe3RoaXMubmFtZT1lLHRoaXMudG9rZW49dCx0aGlzLmNoaWxkTm9kZXM9W10sdGhpcy50b1N0cmluZz1mdW5jdGlvbihlKXtpZihlfHwoZT0iIiksMT09dGhpcy5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm4gdGhpcy5jaGlsZE5vZGVzWzBdLnRvU3RyaW5nKGUpO2Zvcih2YXIgdD1lK3RoaXMubmFtZSsobnVsbCE9dGhpcy50b2tlbiYmdGhpcy5uYW1lIT10aGlzLnRva2VuPyI6Iit0aGlzLnRva2VuOiIiKSsiXG4iLG49MDtuPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7bisrKXQrPXRoaXMuY2hpbGROb2Rlc1tuXS50b1N0cmluZyhlKyIgICAgIik7cmV0dXJuIHR9fWZ1bmN0aW9uIFN5bnRhY3RpY2FsUGFyc2VyKCl7dmFyIGU9e1Byb2dyYW06IiQifSxvPXt9OyFmdW5jdGlvbiBlKG4pe29bSlNPTi5zdHJpbmdpZnkobildPW47Zm9yKHZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG4pO3IubGVuZ3RoOyl7dmFyIGk9ci5zaGlmdCgpO3J1bGVzW2ldJiZydWxlc1tpXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZVswXV18fHIucHVzaChlWzBdKTt2YXIgdD1uO2UuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdfHwodFtlXT17fSksdD10W2VdfSksbltpXS4kZGl2JiYodC4kZGl2PSEwKSx0LiRyZWR1Y2U9aSx0LiRjb3VudD1lLmxlbmd0aH0pfWZvcih2YXIgdCBpbiBuKSJvYmplY3QiIT10eXBlb2Ygblt0XXx8IiQiPT10LmNoYXJBdCgwKXx8blt0XS4kY2xvc3VyZXx8KG9bSlNPTi5zdHJpbmdpZnkoblt0XSldP25bdF09b1tKU09OLnN0cmluZ2lmeShuW3RdKV06ZShuW3RdKSk7bi4kY2xvc3VyZT0hMH0oZSk7dmFyIGk9W10sYT1bZV0scz1lO3RoaXMuaW5zZXJ0U3ltYm9sPWZ1bmN0aW9uKGUsdCl7Zm9yKDshc1tlLm5hbWVdJiZzLiRyZWR1Y2U7KXtmb3IodmFyIG49cy4kY291bnQscj1uZXcgU3ltYm9sJDEocy4kcmVkdWNlKTtuLS07KXIuY2hpbGROb2Rlcy5wdXNoKGkucG9wKCkpLGEucG9wKCk7cz1hW2EubGVuZ3RoLTFdLHRoaXMuaW5zZXJ0U3ltYm9sKHIpfWlmKHM9c1tlLm5hbWVdLGkucHVzaChlKSxhLnB1c2gocyksIXMpdGhyb3cgbmV3IEVycm9yO3JldHVybiBzLiRkaXZ9LHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXtpPVtdLGE9W3M9ZV19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJncmFtbWFyVHJlZSIse2dldDpmdW5jdGlvbigpe3RyeXtmb3IoO3MuJHJlZHVjZTspe2Zvcih2YXIgZT1zLiRjb3VudCx0PW5ldyBTeW1ib2wkMShzLiRyZWR1Y2UpO2UtLTspdC5jaGlsZE5vZGVzLnB1c2goaS5wb3AoKSksYS5wb3AoKTtzPWFbYS5sZW5ndGgtMV0sdGhpcy5pbnNlcnRTeW1ib2wodCl9aWYoMDxpLmxlbmd0aCYmc1siOyJdKXJldHVybiB0aGlzLmluc2VydFN5bWJvbChuZXcgU3ltYm9sJDEoIjsiLCI7IikpLHRoaXMuZ3JhbW1hclRyZWU7aWYoMSE9aS5sZW5ndGh8fCJQcm9ncmFtIiE9aVswXS5uYW1lKXRocm93IG5ldyBFcnJvcn1jYXRjaChlKXt0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iil9cmV0dXJuIGlbMF19fSl9ZnVuY3Rpb24gUGFyc2VyKCl7dGhpcy5sZXhpY2FsUGFyc2VyPW5ldyBMZXhpY2FsUGFyc2VyLHRoaXMuc3ludGFjdGljYWxQYXJzZXI9bmV3IFN5bnRhY3RpY2FsUGFyc2VyO3ZhciBhPXt9O1siTnVsbExpdGVyYWwiLCJCb29sZWFuTGl0ZXJhbCIsIk51bWVyaWNMaXRlcmFsIiwiU3RyaW5nTGl0ZXJhbCIsIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCIsIklkZW50aWZpZXIiLCIqKiIsIj0+IiwieyIsIn0iLCIoIiwiKSIsIlsiLCJdIiwiLiIsIjsiLCIsIiwiPCIsIj4iLCI8PSIsIj49IiwiPT0iLCIhPSIsIj09PSIsIiE9PSIsIisiLCItIiwiKiIsIiUiLCIrKyIsIi0tIiwiPDwiLCI+PiIsIj4+PiIsIiYiLCJ8IiwiXiIsIiEiLCJ+IiwiJiYiLCJ8fCIsIj8iLCI6IiwiPSIsIis9IiwiLT0iLCIqPSIsIiU9IiwiPDw9IiwiPj49IiwiPj4+PSIsIiY9IiwifD0iLCJePSIsIi8iLCIvPSIsImluc3RhbmNlb2YiLCJ0eXBlb2YiLCJuZXciLCJ2b2lkIiwiZGVidWdnZXIiLCJ0aGlzIiwiZGVsZXRlIiwiaW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGUse30pfSksdGhpcy5yZXNldD1mdW5jdGlvbigpe3RoaXMubGV4aWNhbFBhcnNlci5yZXNldCgpLHRoaXMuc3ludGFjdGljYWxQYXJzZXIucmVzZXQoKX0sdGhpcy5wYXJzZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcyxpPSExO3RoaXMubGV4aWNhbFBhcnNlci5zb3VyY2U9ZTtmb3IodmFyIG89ITE7bj10aGlzLmxleGljYWxQYXJzZXIuZ2V0TmV4dFRva2VuKG8pOyl7dCYmdChuKTt0cnl7aWYoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobikuc29tZShmdW5jdGlvbihlKXtyZXR1cm4hIWEuaGFzT3duUHJvcGVydHkoZSkmJihvPXIuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyBTeW1ib2wkMShlLG4pLGkpLCEoaT0hMSkpfSkpY29udGludWU7KG4uS2V5d29yZHx8bi5QdW5jdHVhdG9yfHxuLkRpdlB1bmN0dWF0b3IpJiZhLmhhc093blByb3BlcnR5KG4udG9TdHJpbmcoKSkmJihvPXIuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyBTeW1ib2wkMShuLnRvU3RyaW5nKCksbiksaSkpfWNhdGNoKGUpe3Rocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiAiK24pfX1yZXR1cm4gdGhpcy5zeW50YWN0aWNhbFBhcnNlci5ncmFtbWFyVHJlZX19dmFyIHBhcnNlcj1uZXcgUGFyc2VyO2Z1bmN0aW9uIEphdmFTY3JpcHRFeHByZXNzaW9uKHRleHQpe3BhcnNlci5yZXNldCgpLHRoaXMudHJlZT1wYXJzZXIucGFyc2UodGV4dCksdGhpcy5wYXRocz1bXTt2YXIgY29udGV4dD1PYmplY3QuY3JlYXRlKG51bGwpLG1lPXRoaXMscGF0aEluZGV4PU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gY2hlY2tTaW1wbGUoZSl7Zm9yKHZhciB0PWU7dC5jaGlsZE5vZGVzLmxlbmd0aDw9MSYmIk1lbWJlckV4cHJlc3Npb24iIT09dC5uYW1lOyl0PXQuY2hpbGROb2Rlc1swXTsiTWVtYmVyRXhwcmVzc2lvbiI9PT10Lm5hbWU/bWUuaXNTaW1wbGU9ITA6bWUuaXNTaW1wbGU9ITF9ZnVuY3Rpb24gd2FsayhlKXtpZigiQ2FsbEV4cHJlc3Npb24iPT09ZS5uYW1lJiYiQ2FsbEV4cHJlc3Npb24iIT09ZS5jaGlsZE5vZGVzW2UuY2hpbGROb2Rlcy5sZW5ndGgtMV0ubmFtZSl7Z2V0UGF0aChlLmNoaWxkTm9kZXNbMV0pO3dhbGsoZS5jaGlsZE5vZGVzWzBdKX1lbHNlIGlmKCJOZXdFeHByZXNzaW9uIj09PWUubmFtZSYmMT09PWUuY2hpbGROb2Rlcy5sZW5ndGgpZ2V0UGF0aChlLmNoaWxkTm9kZXNbMF0pO2Vsc2UgaWYoIk1lbWJlckV4cHJlc3Npb24iPT09ZS5uYW1lJiYxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aClnZXRQYXRoKGUpO2Vsc2UgZm9yKHZhciB0PTA7dDxlLmNoaWxkTm9kZXMubGVuZ3RoO3QrKyl3YWxrKGUuY2hpbGROb2Rlc1t0XSl9ZnVuY3Rpb24gZ2V0UGF0aChlKXt2YXIgdDtpZigiSWRlbnRpZmllck5hbWUiPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuKHQ9Z2V0UGF0aChlLmNoaWxkTm9kZXNbMl0pKSYmKHQ9dC5jb25jYXQoZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udG9rZW4udG9TdHJpbmcoKSkpLGNyZWF0ZVBhdGgodCksdDtpZigiUHJpbWFyeUV4cHJlc3Npb24iPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuIklkZW50aWZpZXIiPT09ZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0ubmFtZT8oY3JlYXRlUGF0aCh0PVtlLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS50b2tlbi50b1N0cmluZygpXSksdCk6bnVsbDtpZigiXSI9PT1lLmNoaWxkTm9kZXNbMF0ubmFtZSlyZXR1cm4gZ2V0UGF0aChlLmNoaWxkTm9kZXNbM10pLHdhbGsoZS5jaGlsZE5vZGVzWzFdKSxudWxsO2lmKCJBcmd1bWVudHMiPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuIHdhbGsoZS5jaGlsZE5vZGVzWzBdKSx3YWxrKGUuY2hpbGROb2Rlc1sxXSksbnVsbDtmb3IodmFyIG49MDtuPGUuY2hpbGROb2Rlcy5sZW5ndGg7bisrKXdhbGsoZS5jaGlsZE5vZGVzW25dKX1mdW5jdGlvbiBjcmVhdGVQYXRoKGUpe2Zvcih2YXIgdD1jb250ZXh0LG49MDtuPGUubGVuZ3RoLTE7bisrKXRbZVtuXV18fCh0W2Vbbl1dPU9iamVjdC5jcmVhdGUobnVsbCkpLHQ9dFtlW25dXTttZS5wYXRocy5wdXNoKGUpLHBhdGhJbmRleFtlLmpvaW4oIi4iKV09ITF9dGhpcy5pc1NpbXBsZSx0aGlzLmlzQ29uc3Qsd2Fsayh0aGlzLnRyZWUpLGNoZWNrU2ltcGxlKHRoaXMudHJlZSksMD09PXRoaXMucGF0aHMubGVuZ3RoJiYodGhpcy5pc0NvbnN0PSEwKSx0aGlzLnNldHRlcj1mdW5jdGlvbih0KXtmb3IodmFyIG49Y29udGV4dCxyPTA7cjx0Lmxlbmd0aC0xO3IrKyluW3Rbcl1dfHwoblt0W3JdXT1PYmplY3QuY3JlYXRlKG51bGwpKSxuPW5bdFtyXV07cmV0dXJue2lzQ29tcGxldGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHBhdGhJbmRleClpZighcGF0aEluZGV4W2VdKXJldHVybiExO3JldHVybiEwfSxzZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHBhdGhJbmRleFt0LmpvaW4oIi4iKV18fChwYXRoSW5kZXhbdC5qb2luKCIuIildPSEwKSxuW3Rbcl1dPWUsdGhpcy5pc0NvbXBsZXRlZCgpP21lLmV4ZWMoKTp2b2lkIDB9fX0sdGhpcy52YWx1ZU9mPXRoaXMuZXhlYz1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZXZhbCh0ZXh0KX0uY2FsbChjb250ZXh0KX1jYXRjaChlKXt9fX1mdW5jdGlvbiB2aXNpdCh0KXt2YXIgZSxuPXQuY2hpbGROb2Rlcy5zbGljZSgpLnJldmVyc2UoKSxyPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnRva2VufHwhZS50b2tlbi5QdW5jdHVhdG9yfSk7aWYoIlVuYXJ5RXhwcmVzc2lvbiI9PT10Lm5hbWUmJigyPT09bi5sZW5ndGgmJiItIj09PW5bMF0ubmFtZSYmMT09PXIubGVuZ3RoKSlyZXR1cm4oZT12aXNpdChyWzBdKSkudmFsdWU9LWUudmFsdWUsZTtpZigiQXJndW1lbnRzIj09PXQubmFtZSl7Zm9yKHZhciBpPVtdLG89clswXTtvOykzPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKGkudW5zaGlmdChvLmNoaWxkTm9kZXNbMF0pLG89by5jaGlsZE5vZGVzWzJdKSwxPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKGkudW5zaGlmdChvLmNoaWxkTm9kZXNbMF0pLG89bnVsbCk7cmV0dXJue3R5cGU6IkFyZ3VtZW50cyIsY2hpbGRyZW46aS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHZpc2l0KGUpfSl9fWlmKHImJjE9PT1yLmxlbmd0aClyZXR1cm4gZT12aXNpdChyWzBdKTtpZih0LnRva2VuJiZbIk51bGxMaXRlcmFsIiwiQm9vbGVhbkxpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiLCJJZGVudGlmaWVyIl0uc29tZShmdW5jdGlvbihlKXtyZXR1cm4gdC50b2tlbltlXX0pKXt2YXIgYT1PYmplY3Qua2V5cyh0LnRva2VuKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goL0xpdGVyYWwvKXx8ZS5tYXRjaCgvSWRlbnRpZmllci8pfSlbMF07cmV0dXJue3R5cGU6YSx2YWx1ZTp7TnVsbExpdGVyYWw6bnVsbCxCb29sZWFuTGl0ZXJhbDpCb29sZWFuKHQudG9rZW4pLE51bWVyaWNMaXRlcmFsOk51bWJlcih0LnRva2VuKSxTdHJpbmdMaXRlcmFsOnQudG9rZW4sSWRlbnRpZmllcjp0LnRva2VufVthXX19cmV0dXJuIkNhbGxFeHByZXNzaW9uIj09PXQubmFtZT97dHlwZToiQ2FsbEV4cHJlc3Npb24iLGNoaWxkcmVuOlt2aXNpdChuWzBdKSx2aXNpdChuWzFdKV19Ont0eXBlOm4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRva2VuJiZlLnRva2VuLlB1bmN0dWF0b3J9KVswXS5uYW1lLGNoaWxkcmVuOm4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnRva2VufHwhZS50b2tlbi5QdW5jdHVhdG9yfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB2aXNpdChlKX0pfX1mdW5jdGlvbiBwYXJzZShlKXt2YXIgdD1uZXcgSmF2YVNjcmlwdEV4cHJlc3Npb24oZSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHZpc2l0KHQudHJlZSksbnVsbCl9dmFyIG9sZENhbGxVcGRhdGVTdHlsZT1nbG9iYWwuY2FsbFVwZGF0ZVN0eWxlO2Z1bmN0aW9uIGlzQmluZE1ldGhvZChlLHQpe3JldHVybigiYmluZGluZ3giPT09ZXx8ImJpbmRpbmciPT09ZSkmJiJiaW5kIj09PXR9ZnVuY3Rpb24gZm9ybWF0RXhwcmVzc2lvbihlKXtpZih2b2lkIDAhPT1lKXt0cnl7ZT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe312YXIgdD17fTtpZigic3RyaW5nIj09dHlwZW9mIGU/dC5vcmlnaW49ZTplJiYodC5vcmlnaW49ZS5vcmlnaW4sdC50cmFuc2Zvcm1lZD1lLnRyYW5zZm9ybWVkKSx0LnRyYW5zZm9ybWVkfHx0Lm9yaWdpbilyZXR1cm4gdC50cmFuc2Zvcm1lZD10LnRyYW5zZm9ybWVkfHxwYXJzZSh0Lm9yaWdpbiksdH19ZnVuY3Rpb24gZm9ybWF0RXhwcmVzc2lvbnMoZSl7cmV0dXJuIGUmJihlLmV4aXRFeHByZXNzaW9uPWZvcm1hdEV4cHJlc3Npb24oZS5leGl0RXhwcmVzc2lvbiksZS5wcm9wcyYmZS5wcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZXhwcmVzc2lvbj1mb3JtYXRFeHByZXNzaW9uKGUuZXhwcmVzc2lvbil9KSksZX1mdW5jdGlvbiBmaXhDYWxsYmFjayh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSYmKGU9e30pLCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiB0KHtzdGF0ZToiZW5kIj09PWUuc3RhdGU/ImV4aXQiOmUuc3RhdGUsdDp2b2lkIDAhPT1lLnQ/ZS50OmUuZGVsdGFUfSl9fWZ1bmN0aW9uIGhhbmRsZU1vZHVsZUdldHRlcihlLHQsbil7cmV0dXJuIGlzQmluZE1ldGhvZChlLHQpP2Z1bmN0aW9uKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9ZnVuY3Rpb24oKXt9KSwhZSl0aHJvdyBuZXcgRXJyb3IoInNob3VsZCBwYXNzIG9wdGlvbnMgZm9yIGJpbmRpbmciKTtyZXR1cm4gZm9ybWF0RXhwcmVzc2lvbnMoZSksbihlLGUmJiJ0aW1pbmciPT09ZS5ldmVudFR5cGU/Zml4Q2FsbGJhY2sodCk6dCl9Om59ZnVuY3Rpb24gc2V0SWQoZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiW1tDdXJyZW50SW5zdGFuY2VJZF1dIix7dmFsdWU6dH0pfWZ1bmN0aW9uIGdldElkKGUpe3JldHVybiBlWyJbW0N1cnJlbnRJbnN0YW5jZUlkXV0iXX1mdW5jdGlvbiBtb2R1bGVHZXR0ZXIoZSxuLHIpe3ZhciBpPWdldFRhc2tDZW50ZXIoZSk7cmV0dXJuIGkmJiJmdW5jdGlvbiI9PXR5cGVvZiBpLnNlbmQ/ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIGkuc2VuZCgibW9kdWxlIix7bW9kdWxlOm4sbWV0aG9kOnJ9LGUpfTooY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGZpbmQgdGFza0NlbnRlciAoIitlKyIpLiIpLG51bGwpfWZ1bmN0aW9uIG1vZHVsZVNldHRlcihlLHQsbixyKXt2YXIgaT1nZXRUYXNrQ2VudGVyKGUpO3JldHVybiBpJiYiZnVuY3Rpb24iPT10eXBlb2YgaS5zZW5kPyJmdW5jdGlvbiIhPXR5cGVvZiByPyhjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSAiK3QrIi4iK24rIiBtdXN0IGJlIGFzc2lnbmVkIGFzIGEgZnVuY3Rpb24uIiksbnVsbCk6ZnVuY3Rpb24oZSl7cmV0dXJuIGkuc2VuZCgibW9kdWxlIix7bW9kdWxlOnQsbWV0aG9kOm59LFtlXSl9Oihjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZmluZCB0YXNrQ2VudGVyICgiK2UrIikuIiksbnVsbCl9Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoLTE7MDxuLS07KXRbbl09YXJndW1lbnRzW24rMV07cmV0dXJuIHRbMV0mJih0WzFdPW5vcm1hbGl6ZVVuaXQodFsxXSkpLG9sZENhbGxVcGRhdGVTdHlsZS5hcHBseSh2b2lkIDAsW2VdLmNvbmNhdCh0KSl9O3ZhciBXZWV4SW5zdGFuY2U9ZnVuY3Rpb24oZSx0LG4pe3NldElkKHRoaXMsU3RyaW5nKGUpKSx0aGlzLmNvbmZpZz10fHx7fSx0aGlzLl9uYXRpdmVEYXRhPW58fHt9LHRoaXMuZG9jdW1lbnQ9bmV3IERvY3VtZW50KGUsdGhpcy5jb25maWcuYnVuZGxlVXJsKSx0aGlzLnJlcXVpcmVNb2R1bGU9dGhpcy5yZXF1aXJlTW9kdWxlLmJpbmQodGhpcyksdGhpcy5pbXBvcnRTY3JpcHQ9dGhpcy5pbXBvcnRTY3JpcHQuYmluZCh0aGlzKSx0aGlzLmlzUmVnaXN0ZXJlZE1vZHVsZT1pc1JlZ2lzdGVyZWRNb2R1bGUsdGhpcy5pc1JlZ2lzdGVyZWRDb21wb25lbnQ9aXNSZWdpc3RlcmVkQ29tcG9uZW50fSxfX3Z1ZVBsdWdpbixfX2RlZmluZVBhZ2UsX19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZSx1bmksZ2V0QXBwLGdldEN1cnJlbnRQYWdlcyxVbmlTZXJ2aWNlSlNCcmlkZ2U7ZnVuY3Rpb24gY3JlYXRlU2VydmljZUNvbnRleHQocmcsaWcsb2csYWcsZSl7dmFyIHNnPWUuc2V0VGltZW91dCxjZz1lLmNsZWFyVGltZW91dCx1Zz1lLnNldEludGVydmFsLGxnPWUuY2xlYXJJbnRlcnZhbCxkZz1lLl9fdW5pQ29uZmlnLGZnPWUuX191bmlSb3V0ZXMsdD1mdW5jdGlvbigpe3ZhciBlLGksdD1bImJhc2U2NFRvQXJyYXlCdWZmZXIiLCJhcnJheUJ1ZmZlclRvQmFzZTY0IiwiYWRkSW50ZXJjZXB0b3IiLCJyZW1vdmVJbnRlcmNlcHRvciIsImludGVyY2VwdG9ycyJdLmNvbmNhdChbInJlcXVlc3QiLCJ1cGxvYWRGaWxlIiwiZG93bmxvYWRGaWxlIiwiY29ubmVjdFNvY2tldCIsIm9uU29ja2V0T3BlbiIsIm9uU29ja2V0RXJyb3IiLCJzZW5kU29ja2V0TWVzc2FnZSIsIm9uU29ja2V0TWVzc2FnZSIsImNsb3NlU29ja2V0Iiwib25Tb2NrZXRDbG9zZSIsImdldFVwZGF0ZU1hbmFnZXIiLCJjb25maWdNVExTIl0sWyJuYXZpZ2F0ZVRvIiwicmVkaXJlY3RUbyIsInJlTGF1bmNoIiwic3dpdGNoVGFiIiwibmF2aWdhdGVCYWNrIl0sWyJzZXRTdG9yYWdlIiwic2V0U3RvcmFnZVN5bmMiLCJnZXRTdG9yYWdlIiwiZ2V0U3RvcmFnZVN5bmMiLCJnZXRTdG9yYWdlSW5mbyIsImdldFN0b3JhZ2VJbmZvU3luYyIsInJlbW92ZVN0b3JhZ2UiLCJyZW1vdmVTdG9yYWdlU3luYyIsImNsZWFyU3RvcmFnZSIsImNsZWFyU3RvcmFnZVN5bmMiXSxbImdldExvY2F0aW9uIiwiY2hvb3NlTG9jYXRpb24iLCJvcGVuTG9jYXRpb24iLCJjcmVhdGVNYXBDb250ZXh0Iiwib25Mb2NhdGlvbkNoYW5nZSIsIm9uTG9jYXRpb25DaGFuZ2VFcnJvciIsInN0YXJ0TG9jYXRpb25VcGRhdGUiLCJzdG9wTG9jYXRpb25VcGRhdGUiLCJvZmZMb2NhdGlvbkNoYW5nZSIsIm9mZkxvY2F0aW9uQ2hhbmdlRXJyb3IiXSxbImNob29zZUltYWdlIiwiY2hvb3NlRmlsZSIsInByZXZpZXdJbWFnZSIsImNsb3NlUHJldmlld0ltYWdlIiwiZ2V0SW1hZ2VJbmZvIiwiZ2V0VmlkZW9JbmZvIiwic2F2ZUltYWdlVG9QaG90b3NBbGJ1bSIsImNvbXByZXNzSW1hZ2UiLCJjb21wcmVzc1ZpZGVvIiwiZ2V0UmVjb3JkZXJNYW5hZ2VyIiwiZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlciIsImNyZWF0ZUF1ZGlvQ29udGV4dCIsImNyZWF0ZUlubmVyQXVkaW9Db250ZXh0IiwiY2hvb3NlVmlkZW8iLCJzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtIiwiY3JlYXRlVmlkZW9Db250ZXh0IiwiY3JlYXRlQ2FtZXJhQ29udGV4dCIsImNyZWF0ZUxpdmVQbGF5ZXJDb250ZXh0IiwiY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQiXSxbImdldFN5c3RlbUluZm8iLCJnZXRTeXN0ZW1JbmZvU3luYyIsImdldFdpbmRvd0luZm8iLCJnZXREZXZpY2VJbmZvIiwiZ2V0QXBwQmFzZUluZm8iLCJjYW5JVXNlIiwib25NZW1vcnlXYXJuaW5nIiwiZ2V0TmV0d29ya1R5cGUiLCJvbk5ldHdvcmtTdGF0dXNDaGFuZ2UiLCJvZmZOZXR3b3JrU3RhdHVzQ2hhbmdlIiwib25BY2NlbGVyb21ldGVyQ2hhbmdlIiwib2ZmQWNjZWxlcm9tZXRlckNoYW5nZSIsInN0YXJ0QWNjZWxlcm9tZXRlciIsInN0b3BBY2NlbGVyb21ldGVyIiwib25Db21wYXNzQ2hhbmdlIiwib2ZmQ29tcGFzc0NoYW5nZSIsInN0YXJ0Q29tcGFzcyIsInN0b3BDb21wYXNzIiwib25HeXJvc2NvcGVDaGFuZ2UiLCJzdGFydEd5cm9zY29wZSIsInN0b3BHeXJvc2NvcGUiLCJtYWtlUGhvbmVDYWxsIiwic2NhbkNvZGUiLCJzZXRDbGlwYm9hcmREYXRhIiwiZ2V0Q2xpcGJvYXJkRGF0YSIsInNldFNjcmVlbkJyaWdodG5lc3MiLCJnZXRTY3JlZW5CcmlnaHRuZXNzIiwic2V0S2VlcFNjcmVlbk9uIiwib25Vc2VyQ2FwdHVyZVNjcmVlbiIsInZpYnJhdGVMb25nIiwidmlicmF0ZVNob3J0IiwiYWRkUGhvbmVDb250YWN0Iiwib3BlbkJsdWV0b290aEFkYXB0ZXIiLCJzdGFydEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLCJvbkJsdWV0b290aERldmljZUZvdW5kIiwic3RvcEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLCJvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZSIsImdldENvbm5lY3RlZEJsdWV0b290aERldmljZXMiLCJnZXRCbHVldG9vdGhEZXZpY2VzIiwiZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlIiwiY2xvc2VCbHVldG9vdGhBZGFwdGVyIiwid3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlIiwicmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLCJvbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSIsIm9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsIm5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UiLCJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsImdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyIsImNyZWF0ZUJMRUNvbm5lY3Rpb24iLCJjbG9zZUJMRUNvbm5lY3Rpb24iLCJzZXRCTEVNVFUiLCJnZXRCTEVEZXZpY2VSU1NJIiwib25CZWFjb25TZXJ2aWNlQ2hhbmdlIiwib25CZWFjb25VcGRhdGUiLCJnZXRCZWFjb25zIiwic3RhcnRCZWFjb25EaXNjb3ZlcnkiLCJzdG9wQmVhY29uRGlzY292ZXJ5IiwiY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uIiwiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZSIsInN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbiIsIm9uVGhlbWVDaGFuZ2UiLCJvZmZUaGVtZUNoYW5nZSIsIm9uVUlTdHlsZUNoYW5nZSIsImdldFN5c3RlbVNldHRpbmciLCJnZXRBcHBBdXRob3JpemVTZXR0aW5nIiwib3BlbkFwcEF1dGhvcml6ZVNldHRpbmciXSxbImhpZGVLZXlib2FyZCIsIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLCJvZmZLZXlib2FyZEhlaWdodENoYW5nZSIsImdldFNlbGVjdGVkVGV4dFJhbmdlIl0sWyJzaG93VG9hc3QiLCJoaWRlVG9hc3QiLCJzaG93TG9hZGluZyIsImhpZGVMb2FkaW5nIiwic2hvd01vZGFsIiwic2hvd0FjdGlvblNoZWV0Iiwic2V0TmF2aWdhdGlvbkJhclRpdGxlIiwic2V0TmF2aWdhdGlvbkJhckNvbG9yIiwic2hvd05hdmlnYXRpb25CYXJMb2FkaW5nIiwiaGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nIiwic2V0VGFiQmFySXRlbSIsInNldFRhYkJhclN0eWxlIiwiaGlkZVRhYkJhciIsInNob3dUYWJCYXIiLCJzZXRUYWJCYXJCYWRnZSIsInJlbW92ZVRhYkJhckJhZGdlIiwic2hvd1RhYkJhclJlZERvdCIsImhpZGVUYWJCYXJSZWREb3QiLCJvblRhYkJhck1pZEJ1dHRvblRhcCIsInNldEJhY2tncm91bmRDb2xvciIsInNldEJhY2tncm91bmRUZXh0U3R5bGUiLCJjcmVhdGVBbmltYXRpb24iLCJwYWdlU2Nyb2xsVG8iLCJvbldpbmRvd1Jlc2l6ZSIsIm9mZldpbmRvd1Jlc2l6ZSIsImxvYWRGb250RmFjZSIsInN0YXJ0UHVsbERvd25SZWZyZXNoIiwic3RvcFB1bGxEb3duUmVmcmVzaCIsImNyZWF0ZVNlbGVjdG9yUXVlcnkiLCJjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciIsImNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlciIsImdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3QiLCJzaG93VG9wV2luZG93Iiwic2hvd0xlZnRXaW5kb3ciLCJzaG93UmlnaHRXaW5kb3ciLCJoaWRlVG9wV2luZG93IiwiaGlkZUxlZnRXaW5kb3ciLCJoaWRlUmlnaHRXaW5kb3ciLCJnZXRUb3BXaW5kb3dTdHlsZSIsImdldExlZnRXaW5kb3dTdHlsZSIsImdldFJpZ2h0V2luZG93U3R5bGUiLCJzZXRUb3BXaW5kb3dTdHlsZSIsInNldExlZnRXaW5kb3dTdHlsZSIsInNldFJpZ2h0V2luZG93U3R5bGUiLCJnZXRMb2NhbGUiLCJzZXRMb2NhbGUiLCJvbkxvY2FsZUNoYW5nZSJdLFsiJGVtaXQiLCIkb24iLCIkb25jZSIsIiRvZmYiXSxbInNhdmVGaWxlIiwiZ2V0U2F2ZWRGaWxlTGlzdCIsImdldFNhdmVkRmlsZUluZm8iLCJyZW1vdmVTYXZlZEZpbGUiLCJnZXRGaWxlSW5mbyIsIm9wZW5Eb2N1bWVudCIsImdldEZpbGVTeXN0ZW1NYW5hZ2VyIl0sWyJjcmVhdGVPZmZzY3JlZW5DYW52YXMiLCJjcmVhdGVDYW52YXNDb250ZXh0IiwiY2FudmFzVG9UZW1wRmlsZVBhdGgiLCJjYW52YXNQdXRJbWFnZURhdGEiLCJjYW52YXNHZXRJbWFnZURhdGEiXSxbImdldFByb3ZpZGVyIiwibG9naW4iLCJjaGVja1Nlc3Npb24iLCJnZXRVc2VySW5mbyIsImdldFVzZXJQcm9maWxlIiwicHJlTG9naW4iLCJjbG9zZUF1dGhWaWV3IiwiZ2V0Q2hlY2tCb3hTdGF0ZSIsImdldFVuaXZlcmlmeU1hbmFnZXIiLCJzaGFyZSIsInNoYXJlV2l0aFN5c3RlbSIsInNob3dTaGFyZU1lbnUiLCJoaWRlU2hhcmVNZW51IiwicmVxdWVzdFBheW1lbnQiLCJzdWJzY3JpYmVQdXNoIiwidW5zdWJzY3JpYmVQdXNoIiwib25QdXNoIiwib2ZmUHVzaCIsInJlcXVpcmVOYXRpdmVQbHVnaW4iLCJ1cHgycHgiLCJyZXN0b3JlR2xvYmFsIiwicmVxdWlyZUdsb2JhbCIsImdldFN1Yk5WdWVCeUlkIiwiZ2V0Q3VycmVudFN1Yk5WdWUiLCJzZXRQYWdlTWV0YSIsIm9uSG9zdEV2ZW50UmVjZWl2ZSIsIm9uTmF0aXZlRXZlbnRSZWNlaXZlIiwic2VuZE5hdGl2ZUV2ZW50IiwicHJlbG9hZFBhZ2UiLCJ1blByZWxvYWRQYWdlIiwibG9hZFN1YlBhY2thZ2UiLCJzZW5kSG9zdEV2ZW50IiwibmF2aWdhdGVUb01pbmlQcm9ncmFtIiwiZ2V0TGF1bmNoT3B0aW9uc1N5bmMiLCJnZXRFbnRlck9wdGlvbnNTeW5jIiwiaW5pdFVUU1Byb3h5Q2xhc3MiLCJpbml0VVRTUHJveHlGdW5jdGlvbiIsImluaXRVVFNJbmRleENsYXNzTmFtZSIsImluaXRVVFNDbGFzc05hbWUiLCJpbml0VVRTUGFja2FnZU5hbWUiLCJyZXF1aXJlVVRTUGx1Z2luIiwicmVnaXN0ZXJVVFNQbHVnaW4iLCJyZWdpc3RlclVUU0ludGVyZmFjZSJdLFsiY3JlYXRlUmV3YXJkZWRWaWRlb0FkIiwiY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQiLCJjcmVhdGVJbnRlcnN0aXRpYWxBZCIsImNyZWF0ZUludGVyYWN0aXZlQWQiXSxbImludm9rZVB1c2hDYWxsYmFjayIsImdldFB1c2hDbGllbnRJZCIsIm9uUHVzaE1lc3NhZ2UiLCJvZmZQdXNoTWVzc2FnZSIsImNyZWF0ZVB1c2hNZXNzYWdlIiwiZ2V0Q2hhbm5lbE1hbmFnZXIiXSk7dHJ5e3ZhciBuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7fX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0LXBhc3NpdmUiLG51bGwsbil9Y2F0Y2goZSl7fXZhciBhPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIscz0vXig/OltBLVphLXpcZCsvXXs0fSkqPyg/OltBLVphLXpcZCsvXXsyfSg/Oj09KT98W0EtWmEtelxkKy9dezN9PT8pPyQvO2Z1bmN0aW9uIGMoKXt2YXIgZSx0LG49cGcuZ2V0U3RvcmFnZVN5bmMoInVuaV9pZF90b2tlbiIpfHwiIixyPW4uc3BsaXQoIi4iKTtpZighbnx8MyE9PXIubGVuZ3RoKXJldHVybnt1aWQ6bnVsbCxyb2xlOltdLHBlcm1pc3Npb246W10sdG9rZW5FeHBpcmVkOjB9O3RyeXtlPUpTT04ucGFyc2UoKHQ9clsxXSxkZWNvZGVVUklDb21wb25lbnQoaSh0KS5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiIlIisoIjAwIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKCIiKSkpKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIuiOt+WPluW9k+WJjeeUqOaIt+S/oeaBr+WHuumUme+8jOivpue7humUmeivr+S/oeaBr+S4uu+8miIrZS5tZXNzYWdlKX1yZXR1cm4gZS50b2tlbkV4cGlyZWQ9MWUzKmUuZXhwLGRlbGV0ZSBlLmV4cCxkZWxldGUgZS5pYXQsZX1pPSJmdW5jdGlvbiIhPXR5cGVvZiBhdG9iP2Z1bmN0aW9uKGUpe2lmKGU9U3RyaW5nKGUpLnJlcGxhY2UoL1tcdFxuXGZcciBdKy9nLCIiKSwhcy50ZXN0KGUpKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2F0b2InIG9uICdXaW5kb3cnOiBUaGUgc3RyaW5nIHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLiIpO3ZhciB0O2UrPSI9PSIuc2xpY2UoMi0oMyZlLmxlbmd0aCkpO2Zvcih2YXIgbixyLGk9IiIsbz0wO288ZS5sZW5ndGg7KXQ9YS5pbmRleE9mKGUuY2hhckF0KG8rKykpPDwxOHxhLmluZGV4T2YoZS5jaGFyQXQobysrKSk8PDEyfChuPWEuaW5kZXhPZihlLmNoYXJBdChvKyspKSk8PDZ8KHI9YS5pbmRleE9mKGUuY2hhckF0KG8rKykpKSxpKz02ND09PW4/U3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4xNiYyNTUpOjY0PT09cj9TdHJpbmcuZnJvbUNoYXJDb2RlKHQ+PjE2JjI1NSx0Pj44JjI1NSk6U3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQpO3JldHVybiBpfTphdG9iO3ZhciByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHk9T2JqZWN0LmFzc2lnbjtmdW5jdGlvbiBDKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIHUoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfXZhciBsPXU7ZnVuY3Rpb24gZChlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX1mdW5jdGlvbiBUKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09ci5jYWxsKGUpfWZ1bmN0aW9uIGsoZSx0KXtyZXR1cm4gby5jYWxsKGUsdCl9ZnVuY3Rpb24gZigpe31mdW5jdGlvbiBwKGUpe3JldHVybiByLmNhbGwoZSkuc2xpY2UoOCwtMSl9ZnVuY3Rpb24gaCh0KXt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbltlXXx8KG5bZV09dChlKSl9fXZhciB2PS8tKFx3KS9nLGc9aChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHYsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD90LnRvVXBwZXJDYXNlKCk6IiJ9KX0pLG09aChmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpfSk7ZnVuY3Rpb24gXyh0LG4pe2lmKHQ9PT1uKXJldHVybiEwO3ZhciBlPWQodCkscj1kKG4pO2lmKCFlfHwhcilyZXR1cm4hZSYmIXImJlN0cmluZyh0KT09PVN0cmluZyhuKTt0cnl7dmFyIGk9QXJyYXkuaXNBcnJheSh0KSxvPUFycmF5LmlzQXJyYXkobik7aWYoaSYmbylyZXR1cm4gdC5sZW5ndGg9PT1uLmxlbmd0aCYmdC5ldmVyeShmdW5jdGlvbihlLHQpe3JldHVybiBfKGUsblt0XSl9KTtpZih0IGluc3RhbmNlb2YgRGF0ZSYmbiBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIHQuZ2V0VGltZSgpPT09bi5nZXRUaW1lKCk7aWYoaXx8bylyZXR1cm4hMTt2YXIgYT1PYmplY3Qua2V5cyh0KSxzPU9iamVjdC5rZXlzKG4pO3JldHVybiBhLmxlbmd0aD09PXMubGVuZ3RoJiZhLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiBfKHRbZV0sbltlXSl9KX1jYXRjaChlKXtyZXR1cm4hMX19dmFyIGI9L1shJygpKl0vZyx3PWZ1bmN0aW9uKGUpe3JldHVybiIlIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpfSxTPS8lMkMvZyx4PWZ1bmN0aW9uKGUpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZShiLHcpLnJlcGxhY2UoUywiLCIpfSxPPWRlY29kZVVSSUNvbXBvbmVudDtmdW5jdGlvbiBFKGUpe3ZhciBpPXt9O3JldHVybihlPWUudHJpbSgpLnJlcGxhY2UoL14oXD98I3wmKS8sIiIpKSYmZS5zcGxpdCgiJiIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKC9cKy9nLCIgIikuc3BsaXQoIj0iKSxuPU8odC5zaGlmdCgpKSxyPTA8dC5sZW5ndGg/Tyh0LmpvaW4oIj0iKSk6bnVsbDt2b2lkIDA9PT1pW25dP2lbbl09cjpBcnJheS5pc0FycmF5KGlbbl0pP2lbbl0ucHVzaChyKTppW25dPVtpW25dLHJdfSksaX1mdW5jdGlvbiBJKHIsaSl7dm9pZCAwPT09aSYmKGk9eCk7dmFyIGU9cj9PYmplY3Qua2V5cyhyKS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9clt0XTtpZih2b2lkIDA9PT1lKXJldHVybiIiO2lmKG51bGw9PT1lKXJldHVybiBpKHQpO2lmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciBuPVtdO3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSl7dm9pZCAwIT09ZSYmKG51bGw9PT1lP24ucHVzaChpKHQpKTpuLnB1c2goaSh0KSsiPSIraShlKSkpfSksbi5qb2luKCImIil9cmV0dXJuIGkodCkrIj0iK2koZSl9KS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIDA8ZS5sZW5ndGh9KS5qb2luKCImIik6bnVsbDtyZXR1cm4gZT8iPyIrZToiIn12YXIgQT0wLCQ9e307ZnVuY3Rpb24gUChlLHQpe3ZhciBuPSRbZV18fHt9O2RlbGV0ZSAkW2VdO3ZhciByPXQuZXJyTXNnfHwiIjtuZXcgUmVnRXhwKCJcXDpcXHMqZmFpbCIpLnRlc3Qocik/bi5mYWlsJiZuLmZhaWwodCk6bi5zdWNjZXNzJiZuLnN1Y2Nlc3ModCksbi5jb21wbGV0ZSYmbi5jb21wbGV0ZSh0KX12YXIgTT17d2FycDpmdW5jdGlvbihpKXtyZXR1cm4gZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PVN0cmluZyhBKyspOyRbdF09e3N1Y2Nlc3M6ZS5zdWNjZXNzLGZhaWw6ZS5mYWlsLGNvbXBsZXRlOmUuY29tcGxldGV9O3ZhciBuPU9iamVjdC5hc3NpZ24oe30sZSkscj1pLmJpbmQodGhpcykobix0KTtyJiZQKHQscil9fSxpbnZva2U6UH0saj17YmxhY2s6InJnYmEoMCwwLDAsMC40KSIsd2hpdGU6InJnYmEoMjU1LDI1NSwyNTUsMC40KSJ9O2Z1bmN0aW9uIEwoZSxvLGEpe3ZvaWQgMD09PW8mJihvPXt9KSx2b2lkIDA9PT1hJiYoYT0ibGlnaHQiKTt2YXIgcz1vW2FdLHQ9e307cmV0dXJuIHM/KE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24ocil7dmFyIGk9ZVtyXTt0W3JdPWZ1bmN0aW9uKCl7aWYoVChpKSlyZXR1cm4gTChpLG8sYSk7aWYoQXJyYXkuaXNBcnJheShpKSlyZXR1cm4gaS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIFQoZSk/TChlLG8sYSk6ZX0pO2lmKHUoaSkmJmkuc3RhcnRzV2l0aCgiQCIpKXt2YXIgZT1pLnJlcGxhY2UoIkAiLCIiKSx0PXNbZV18fGk7c3dpdGNoKHIpe2Nhc2UiYm9yZGVyU3R5bGUiOnQ9KG49dCkmJm4gaW4gaj9qW25dOm59cmV0dXJuIHR9dmFyIG47cmV0dXJuIGl9KCl9KSx0KTplfWZ1bmN0aW9uIEIoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLmFwcGx5KGUsYXJndW1lbnRzKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX19ZnVuY3Rpb24gTihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGUuYXBwbHkoZSxhcmd1bWVudHMpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9fX12YXIgRD1bImludm9rZSIsInN1Y2Nlc3MiLCJmYWlsIiwiY29tcGxldGUiLCJyZXR1cm5WYWx1ZSJdLFI9e30sRj17fTtmdW5jdGlvbiBVKGksbyl7T2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdCxuLHI7LTEhPT1ELmluZGV4T2YoZSkmJkMob1tlXSkmJihpW2VdPSh0PWlbZV0sbj1vW2VdLChyPW4/dD90LmNvbmNhdChuKTpBcnJheS5pc0FycmF5KG4pP246W25dOnQpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspLTE9PT10LmluZGV4T2YoZVtuXSkmJnQucHVzaChlW25dKTtyZXR1cm4gdH0ocik6cikpfSl9ZnVuY3Rpb24geihpLG8pe2kmJm8mJk9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQsbixyOy0xIT09RC5pbmRleE9mKGUpJiZDKG9bZV0pJiYodD1pW2VdLG49b1tlXSwtMSE9PShyPXQuaW5kZXhPZihuKSkmJnQuc3BsaWNlKHIsMSkpfSl9ZnVuY3Rpb24gVih0LG4pe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlLG4pfHxlfX1mdW5jdGlvbiBxKGUpe3JldHVybiEhZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50aGVufWZ1bmN0aW9uIFcoZSx0LG4pe2Zvcih2YXIgcj0hMSxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07aWYocilyPVByb21pc2UucmVzb2x2ZShWKG8sbikpO2Vsc2V7dmFyIGE9byh0LG4pO2lmKHEoYSkmJihyPVByb21pc2UucmVzb2x2ZShhKSksITE9PT1hKXJldHVybnt0aGVuOmZ1bmN0aW9uKCl7fX19fXJldHVybiByfHx7dGhlbjpmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX19fWZ1bmN0aW9uIEgocixpKXtyZXR1cm4gdm9pZCAwPT09aSYmKGk9e30pLFsic3VjY2VzcyIsImZhaWwiLCJjb21wbGV0ZSJdLmZvckVhY2goZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheShyW3RdKSl7dmFyIG49aVt0XTtpW3RdPWZ1bmN0aW9uKGUpe1coclt0XSxlLGkpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIEMobikmJm4oZSl8fGV9KX19fSksaX1mdW5jdGlvbiBHKGUsdCl7dmFyIG49W107QXJyYXkuaXNBcnJheShSLnJldHVyblZhbHVlKSYmbi5wdXNoLmFwcGx5KG4sUi5yZXR1cm5WYWx1ZSk7dmFyIHI9RltlXTtyZXR1cm4gciYmQXJyYXkuaXNBcnJheShyLnJldHVyblZhbHVlKSYmbi5wdXNoLmFwcGx5KG4sci5yZXR1cm5WYWx1ZSksbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Q9ZSh0KXx8dH0pLHR9ZnVuY3Rpb24gWChlKXt2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpO09iamVjdC5rZXlzKFIpLmZvckVhY2goZnVuY3Rpb24oZSl7InJldHVyblZhbHVlIiE9PWUmJih0W2VdPVJbZV0uc2xpY2UoKSl9KTt2YXIgbj1GW2VdO3JldHVybiBuJiZPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJyZXR1cm5WYWx1ZSIhPT1lJiYodFtlXT0odFtlXXx8W10pLmNvbmNhdChuW2VdKSl9KSx0fWZ1bmN0aW9uIEoodCxuLGUpe2Zvcih2YXIgcj1bXSxpPWFyZ3VtZW50cy5sZW5ndGgtMzswPGktLTspcltpXT1hcmd1bWVudHNbaSszXTt2YXIgbz1YKHQpO3JldHVybiBvJiZPYmplY3Qua2V5cyhvKS5sZW5ndGg/QXJyYXkuaXNBcnJheShvLmludm9rZSk/VyhvLmludm9rZSxlKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBuLmFwcGx5KHZvaWQgMCxbSChYKHQpLGUpXS5jb25jYXQocikpfSk6bi5hcHBseSh2b2lkIDAsW0gobyxlKV0uY29uY2F0KHIpKTpuLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KHIpKX12YXIgWT17cmV0dXJuVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHEoZSk/bmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtlLnRoZW4oZnVuY3Rpb24oZSl7ZVswXT9uKGVbMF0pOnQoZVsxXSl9KX0pOmV9fSxLPS9eXCR8V2luZG93JHxXaW5kb3dTdHlsZSR8c2VuZEhvc3RFdmVudHxzZW5kTmF0aXZlRXZlbnR8cmVzdG9yZUdsb2JhbHxyZXF1aXJlR2xvYmFsfGdldEN1cnJlbnRTdWJOVnVlfGdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3R8XnJlcG9ydHxpbnRlcmNlcHRvcnN8SW50ZXJjZXB0b3IkfGdldFN1Yk5WdWVCeUlkfHJlcXVpcmVOYXRpdmVQbHVnaW58dXB4MnB4fGhpZGVLZXlib2FyZHxjYW5JVXNlfF5jcmVhdGV8U3luYyR8TWFuYWdlciR8YmFzZTY0VG9BcnJheUJ1ZmZlcnxhcnJheUJ1ZmZlclRvQmFzZTY0fGdldExvY2FsZXxzZXRMb2NhbGV8aW52b2tlUHVzaENhbGxiYWNrfGdldFdpbmRvd0luZm98Z2V0RGV2aWNlSW5mb3xnZXRBcHBCYXNlSW5mb3xnZXRTeXN0ZW1TZXR0aW5nfGdldEFwcEF1dGhvcml6ZVNldHRpbmd8aW5pdFVUU3xyZXF1aXJlVVRTfHJlZ2lzdGVyVVRTLyxaPS9eY3JlYXRlfE1hbmFnZXIkLyxRPVsiY3JlYXRlQkxFQ29ubmVjdGlvbiJdLGVlPVsicmVxdWVzdCIsImRvd25sb2FkRmlsZSIsInVwbG9hZEZpbGUiLCJjb25uZWN0U29ja2V0Il0sdGU9WyJjcmVhdGVCTEVDb25uZWN0aW9uIiwiY3JlYXRlUHVzaE1lc3NhZ2UiXSxuZT0vXm9ufF5vZmYvO2Z1bmN0aW9uIHJlKGUpe3JldHVybiBLLnRlc3QoZSkmJi0xPT09dGUuaW5kZXhPZihlKX1mdW5jdGlvbiBpZShlKXtyZXR1cm4gbmUudGVzdChlKSYmIm9uUHVzaCIhPT1lfWZ1bmN0aW9uIG9lKGUpe3JldHVybiB0PWUsIShaLnRlc3QodCkmJi0xPT09US5pbmRleE9mKHQpfHxyZShlKXx8aWUoZSkpO3ZhciB0fWZ1bmN0aW9uIGFlKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKXt2YXIgcj1lW25dO0MocikmJih0W25dPU4ociksZGVsZXRlIGVbbl0pfXJldHVybiB0fVByb21pc2UucHJvdG90eXBlLmZpbmFsbHl8fChQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5PWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gbi5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBlfSl9LGZ1bmN0aW9uKGUpe3JldHVybiBuLnJlc29sdmUodCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgZX0pfSl9KTt2YXIgc2U9W3tuYW1lOiJiYXNlNjQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sY2U9W3tuYW1lOiJhcnJheUJ1ZmZlciIsdHlwZTpbQXJyYXlCdWZmZXIsVWludDhBcnJheV0scmVxdWlyZWQ6ITB9XSx1ZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxiYXNlNjRUb0FycmF5QnVmZmVyOnNlLGFycmF5QnVmZmVyVG9CYXNlNjQ6Y2V9KSxsZT1be25hbWU6InNjaGVtYSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxkZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjYW5JVXNlOmxlfSksZmU9W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XSxyZXF1aXJlZDohMH0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiEwfV0scGU9ZmUsaGU9W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XX0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9ufV0sdmU9W3tuYW1lOiJldmVudCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxnZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCwkb246ZmUsJG9uY2U6cGUsJG9mZjpoZSwkZW1pdDp2ZX0pLG1lPVt7bmFtZToibWV0aG9kIix0eXBlOltTdHJpbmcsT2JqZWN0XSxyZXF1aXJlZDohMH1dLHllPW1lLF9lPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGFkZEludGVyY2VwdG9yOm1lLHJlbW92ZUludGVyY2VwdG9yOnllfSksYmU9W3tuYW1lOiJ1cHgiLHR5cGU6W051bWJlcixTdHJpbmddLHJlcXVpcmVkOiEwfV0sd2U9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXB4MnB4OmJlfSk7ZnVuY3Rpb24ga2Uobil7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7ZSYmKHRbbl09TWF0aC5yb3VuZChlKSl9fXZhciBTZT17Y2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx4Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6a2UoIngiKX0seTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmtlKCJ5Iil9LHdpZHRoOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6a2UoIndpZHRoIil9LGhlaWdodDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmtlKCJoZWlnaHQiKX19LHhlPXtjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGRhdGE6e3R5cGU6VWludDhDbGFtcGVkQXJyYXkscmVxdWlyZWQ6ITB9LHg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjprZSgieCIpfSx5Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6a2UoInkiKX0sd2lkdGg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjprZSgid2lkdGgiKX0saGVpZ2h0Ont0eXBlOk51bWJlcix2YWxpZGF0b3I6a2UoImhlaWdodCIpfX0sQ2U9e1BORzoicG5nIixKUEc6ImpwZyIsSlBFRzoianBnIn0sVGU9e3g6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MCx2YWxpZGF0b3I6a2UoIngiKX0seTp7dHlwZTpOdW1iZXIsZGVmYXVsdDowLHZhbGlkYXRvcjprZSgieSIpfSx3aWR0aDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOmtlKCJ3aWR0aCIpfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjprZSgiaGVpZ2h0Iil9LGRlc3RXaWR0aDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOmtlKCJkZXN0V2lkdGgiKX0sZGVzdEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOmtlKCJkZXN0SGVpZ2h0Iil9LGNhbnZhc0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZVR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGV8fCIiKS50b1VwcGVyQ2FzZSgpLHQuZmlsZVR5cGU9ZSBpbiBDZT9DZVtlXTpDZS5QTkd9fSxxdWFsaXR5Ont0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LnF1YWxpdHk9MDxlJiZlPDE/ZToxfX19LE9lPXtjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGFjdGlvbnM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LHJlc2VydmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX0sRWU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2FudmFzR2V0SW1hZ2VEYXRhOlNlLGNhbnZhc1B1dEltYWdlRGF0YTp4ZSxjYW52YXNUb1RlbXBGaWxlUGF0aDpUZSxkcmF3Q2FudmFzOk9lfSksSWU9W3tuYW1lOiJpZCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxBZT1JZSwkZT1JZSxQZT1JZSxNZT1be25hbWU6ImNhbnZhc0lkIix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImNvbXBvbmVudEluc3RhbmNlIix0eXBlOk9iamVjdH1dLGplPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUF1ZGlvQ29udGV4dDpBZSxjcmVhdGVWaWRlb0NvbnRleHQ6JGUsY3JlYXRlTWFwQ29udGV4dDpQZSxjcmVhdGVDYW52YXNDb250ZXh0Ok1lfSksTGU9e2ZpcnN0TmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiJhZGRQaG9uZUNvbnRhY3Q6ZmFpbCBwYXJhbWV0ZXIgZXJyb3I6IHBhcmFtZXRlci5maXJzdE5hbWUgc2hvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmc7In19fSxCZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxhZGRQaG9uZUNvbnRhY3Q6TGV9KSxOZT17cGhvbmVOdW1iZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtpZighZSlyZXR1cm4ibWFrZVBob25lQ2FsbDpmYWlsIHBhcmFtZXRlciBlcnJvcjogcGFyYW1ldGVyLnBob25lTnVtYmVyIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nOyJ9fX0sRGU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbWFrZVBob25lQ2FsbDpOZX0pLFJlPXtvbmx5RnJvbUNhbWVyYTp7dHlwZTpCb29sZWFufSxzY2FuVHlwZTp7dHlwZTpBcnJheX0sYXV0b0RlY29kZUNoYXJTZXQ6e3R5cGU6Qm9vbGVhbn0sc291bmQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5vbmUifSxhdXRvWm9vbTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9fSxGZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzY2FuQ29kZTpSZX0pLFVlPVsieyIsIn0iXSx6ZT1mdW5jdGlvbigpe3RoaXMuX2NhY2hlcz1PYmplY3QuY3JlYXRlKG51bGwpfTt6ZS5wcm90b3R5cGUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24oZSx0LG4pe2lmKHZvaWQgMD09PW4mJihuPVVlKSwhdClyZXR1cm5bZV07dmFyIHI9dGhpcy5fY2FjaGVzW2VdO3JldHVybiByfHwocj1mdW5jdGlvbihlLHQpe3ZhciBuPXRbMF0scj10WzFdLGk9W10sbz0wLGE9IiI7Zm9yKDtvPGUubGVuZ3RoOyl7dmFyIHM9ZVtvKytdO2lmKHM9PT1uKXthJiZpLnB1c2goe3R5cGU6InRleHQiLHZhbHVlOmF9KTt2YXIgYz1hPSIiO2ZvcihzPWVbbysrXTt2b2lkIDAhPT1zJiZzIT09cjspYys9cyxzPWVbbysrXTt2YXIgdT1zPT09cixsPVZlLnRlc3QoYyk/Imxpc3QiOnUmJnFlLnRlc3QoYyk/Im5hbWVkIjoidW5rbm93biI7aS5wdXNoKHt2YWx1ZTpjLHR5cGU6bH0pfWVsc2UgYSs9c31yZXR1cm4gYSYmaS5wdXNoKHt0eXBlOiJ0ZXh0Iix2YWx1ZTphfSksaX0oZSxuKSx0aGlzLl9jYWNoZXNbZV09ciksZnVuY3Rpb24oZSx0KXt2YXIgbj1bXSxyPTAsaT1BcnJheS5pc0FycmF5KHQpPyJsaXN0Ijoobz10LG51bGwhPT1vJiYib2JqZWN0Ij09dHlwZW9mIG8/Im5hbWVkIjoidW5rbm93biIpO3ZhciBvO2lmKCJ1bmtub3duIj09PWkpcmV0dXJuIG47Zm9yKDtyPGUubGVuZ3RoOyl7dmFyIGE9ZVtyXTtzd2l0Y2goYS50eXBlKXtjYXNlInRleHQiOm4ucHVzaChhLnZhbHVlKTticmVhaztjYXNlImxpc3QiOm4ucHVzaCh0W3BhcnNlSW50KGEudmFsdWUsMTApXSk7YnJlYWs7Y2FzZSJuYW1lZCI6Im5hbWVkIj09PWkmJm4ucHVzaCh0W2EudmFsdWVdKX1yKyt9cmV0dXJuIG59KHIsdCl9O3ZhciBWZT0vXig/OlxkKSsvLHFlPS9eKD86XHcpKy87dmFyIFdlPSJ6aC1IYW5zIixIZT0iemgtSGFudCIsR2U9ImVuIixYZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEplPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFhlLmNhbGwoZSx0KX0sWWU9bmV3IHplO2Z1bmN0aW9uIEtlKGUsdCl7aWYoZSl7aWYoZT1lLnRyaW0oKS5yZXBsYWNlKC9fL2csIi0iKSx0JiZ0W2VdKXJldHVybiBlO2lmKCJjaGluZXNlIj09PShlPWUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIFdlO2lmKDA9PT1lLmluZGV4T2YoInpoIikpcmV0dXJuLTE8ZS5pbmRleE9mKCItaGFucyIpP1dlOi0xPGUuaW5kZXhPZigiLWhhbnQiKT9IZToobj1lLFsiLXR3IiwiLWhrIiwiLW1vIiwiLWNodCJdLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1uLmluZGV4T2YoZSl9KT9IZTpXZSk7dmFyIG4scj1bR2UsImZyIiwiZXMiXTt0JiYwPE9iamVjdC5rZXlzKHQpLmxlbmd0aCYmKHI9T2JqZWN0LmtleXModCkpO3ZhciBpLG89KGk9ZSxyLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1pLmluZGV4T2YoZSl9KSk7cmV0dXJuIG98fHZvaWQgMH19dmFyIFplPWZ1bmN0aW9uKGUpe3ZhciB0PWUubG9jYWxlLG49ZS5mYWxsYmFja0xvY2FsZSxyPWUubWVzc2FnZXMsaT1lLndhdGNoZXIsbz1lLmZvcm1hdGVyO3RoaXMubG9jYWxlPUdlLHRoaXMuZmFsbGJhY2tMb2NhbGU9R2UsdGhpcy5tZXNzYWdlPXt9LHRoaXMubWVzc2FnZXM9e30sdGhpcy53YXRjaGVycz1bXSxuJiYodGhpcy5mYWxsYmFja0xvY2FsZT1uKSx0aGlzLmZvcm1hdGVyPW98fFllLHRoaXMubWVzc2FnZXM9cnx8e30sdGhpcy5zZXRMb2NhbGUodHx8R2UpLGkmJnRoaXMud2F0Y2hMb2NhbGUoaSl9O2Z1bmN0aW9uIFFlKGUsdCl7cmV0dXJuLTE8ZS5pbmRleE9mKHRbMF0pfVplLnByb3RvdHlwZS5zZXRMb2NhbGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMubG9jYWxlO3RoaXMubG9jYWxlPUtlKGUsdGhpcy5tZXNzYWdlcyl8fHRoaXMuZmFsbGJhY2tMb2NhbGUsdGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV18fCh0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXT17fSksdGhpcy5tZXNzYWdlPXRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdLG4hPT10aGlzLmxvY2FsZSYmdGhpcy53YXRjaGVycy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UodC5sb2NhbGUsbil9KX0sWmUucHJvdG90eXBlLmdldExvY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2FsZX0sWmUucHJvdG90eXBlLndhdGNoTG9jYWxlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLndhdGNoZXJzLnB1c2goZSktMTtyZXR1cm4gZnVuY3Rpb24oKXt0LndhdGNoZXJzLnNwbGljZShuLDEpfX0sWmUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLHQsbil7dm9pZCAwPT09biYmKG49ITApO3ZhciByPXRoaXMubWVzc2FnZXNbZV07cj9uP09iamVjdC5hc3NpZ24ocix0KTpPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0plKHIsZSl8fChyW2VdPXRbZV0pfSk6dGhpcy5tZXNzYWdlc1tlXT10fSxaZS5wcm90b3R5cGUuZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuZm9ybWF0ZXIuaW50ZXJwb2xhdGUoZSx0LG4pLmpvaW4oIiIpfSxaZS5wcm90b3R5cGUudD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5tZXNzYWdlO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8odD1LZSh0LHRoaXMubWVzc2FnZXMpKSYmKHI9dGhpcy5tZXNzYWdlc1t0XSk6bj10LEplKHIsZSk/dGhpcy5mb3JtYXRlci5pbnRlcnBvbGF0ZShyW2VdLG4pLmpvaW4oIiIpOihjb25zb2xlLndhcm4oIkNhbm5vdCB0cmFuc2xhdGUgdGhlIHZhbHVlIG9mIGtleXBhdGggIitlKyIuIFVzZSB0aGUgdmFsdWUgb2Yga2V5cGF0aCBhcyBkZWZhdWx0LiIpLGUpfTt2YXIgZXQsdHQ9NDQsbnQ9Im9uVGhlbWVDaGFuZ2UiLHJ0PSJlbiIsaXQ9e307T2JqZWN0LmFzc2lnbihpdCwoKGU9e30pW3J0XT17InVuaS5hcHAucXVpdCI6IlByZXNzIGJhY2sgYnV0dG9uIGFnYWluIHRvIGV4aXQiLCJ1bmkuYXN5bmMuZXJyb3IiOiJUaGUgY29ubmVjdGlvbiB0aW1lZCBvdXQsIGNsaWNrIHRoZSBzY3JlZW4gdG8gdHJ5IGFnYWluLiIsInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIjoiQ2FuY2VsIiwidW5pLnNob3dUb2FzdC51bnBhaXJlZCI6IlBsZWFzZSBub3RlIHNob3dUb2FzdCBtdXN0IGJlIHBhaXJlZCB3aXRoIGhpZGVUb2FzdCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6IlBsZWFzZSBub3RlIHNob3dMb2FkaW5nIG11c3QgYmUgcGFpcmVkIHdpdGggaGlkZUxvYWRpbmciLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IkNhbmNlbCIsInVuaS5zaG93TW9kYWwuY29uZmlybSI6Ik9LIiwidW5pLmNob29zZUltYWdlLmNhbmNlbCI6IkNhbmNlbCIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIjoiQWxidW0iLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiOiJDYW1lcmEiLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoiQ2FuY2VsIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iOiJBbGJ1bSIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSI6IkNhbWVyYSIsInVuaS5jaG9vc2VGaWxlLm5vdFVzZXJBY3RpdmF0aW9uIjoiRmlsZSBjaG9vc2VyIGRpYWxvZyBjYW4gb25seSBiZSBzaG93biB3aXRoIGEgdXNlciBhY3RpdmF0aW9uIiwidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiOiJDYW5jZWwiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoiU2F2ZSBJbWFnZSIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIjoiU2F2ZWQgc3VjY2Vzc2Z1bGx5IiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiOiJTYXZlIGZhaWxlZCIsInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiOiJDb250ZW50IGNvcGllZCIsInVuaS5zY2FuQ29kZS50aXRsZSI6IlNjYW4gY29kZSIsInVuaS5zY2FuQ29kZS5hbGJ1bSI6IkFsYnVtIiwidW5pLnNjYW5Db2RlLmZhaWwiOiJSZWNvZ25pdGlvbiBmYWlsdXJlIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9uIjoiVGFwIHRvIHR1cm4gbGlnaHQgb24iLCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIjoiVGFwIHRvIHR1cm4gbGlnaHQgb2ZmIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IkZpbmdlcnByaW50IHJlY29nbml0aW9uIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi53YWl0aW5nQ29udGVudCI6IlVucmVjb2duaXphYmxlIiwidW5pLnBpY2tlci5kb25lIjoiRG9uZSIsInVuaS5waWNrZXIuY2FuY2VsIjoiQ2FuY2VsIiwidW5pLnZpZGVvLmRhbm11IjoiRGFubXUiLCJ1bmkudmlkZW8udm9sdW1lIjoiVm9sdW1lIiwidW5pLmJ1dHRvbi5mZWVkYmFjay50aXRsZSI6ImZlZWRiYWNrIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoic2VuZCIsInVuaS5jaG9vc2VMb2NhdGlvbi5zZWFyY2giOiJGaW5kIFBsYWNlIiwidW5pLmNob29zZUxvY2F0aW9uLmNhbmNlbCI6IkNhbmNlbCJ9LGUuZXM9eyJ1bmkuYXBwLnF1aXQiOiJQdWxzZSBvdHJhIHZleiBwYXJhIHNhbGlyIiwidW5pLmFzeW5jLmVycm9yIjoiU2UgYWdvdMOzIGVsIHRpZW1wbyBkZSBjb25leGnDs24sIGhhZ2EgY2xpYyBlbiBsYSBwYW50YWxsYSBwYXJhIHZvbHZlciBhIGludGVudGFybG8uIiwidW5pLnNob3dBY3Rpb25TaGVldC5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiJUZW5nYSBlbiBjdWVudGEgcXVlIHNob3dUb2FzdCBkZWJlIGVzdGFyIGVtcGFyZWphZG8gY29uIGhpZGVUb2FzdCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6IlRlbmdhIGVuIGN1ZW50YSBxdWUgc2hvd0xvYWRpbmcgZGViZSBlc3RhciBlbXBhcmVqYWRvIGNvbiBoaWRlTG9hZGluZyIsInVuaS5zaG93TW9kYWwuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiJPSyIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIjoiw4FsYnVtIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIjoiQ8OhbWFyYSIsInVuaS5jaG9vc2VWaWRlby5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIjoiw4FsYnVtIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIjoiQ8OhbWFyYSIsInVuaS5jaG9vc2VGaWxlLm5vdFVzZXJBY3RpdmF0aW9uIjoiRWwgY3VhZHJvIGRlIGRpw6Fsb2dvIGRlbCBzZWxlY3RvciBkZSBhcmNoaXZvcyBzb2xvIHNlIHB1ZWRlIG1vc3RyYXIgY29uIGxhIGFjdGl2YWNpw7NuIGRlbCB1c3VhcmlvIiwidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS5wcmV2aWV3SW1hZ2UuYnV0dG9uLnNhdmUiOiJHdWFyZGFyIGltYWdlbiIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIjoiR3VhcmRhZG8gZXhpdG9zYW1lbnRlIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiOiJFcnJvciBhbCBndWFyZGFyIiwidW5pLnNldENsaXBib2FyZERhdGEuc3VjY2VzcyI6IkNvbnRlbmlkbyBjb3BpYWRvIiwidW5pLnNjYW5Db2RlLnRpdGxlIjoiQ8OzZGlnbyBkZSBlc2NhbmVvIiwidW5pLnNjYW5Db2RlLmFsYnVtIjoiw4FsYnVtIiwidW5pLnNjYW5Db2RlLmZhaWwiOiLDiWNoZWMgZGUgbGEgcmVjb25uYWlzc2FuY2UiLCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iOiJUb3F1ZSBwYXJhIGVuY2VuZGVyIGxhIGx1eiIsInVuaS5zY2FuQ29kZS5mbGFzaC5vZmYiOiJUb3F1ZSBwYXJhIGFwYWdhciBsYSBsdXoiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50IjoiUmVjb25vY2ltaWVudG8gZGUgaHVlbGxhcyBkYWN0aWxhcmVzIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi53YWl0aW5nQ29udGVudCI6IklycmVjb25vY2libGUiLCJ1bmkucGlja2VyLmRvbmUiOiJPSyIsInVuaS5waWNrZXIuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkudmlkZW8uZGFubXUiOiJEYW5tdSIsInVuaS52aWRlby52b2x1bWUiOiJWb2x1bWVuIiwidW5pLmJ1dHRvbi5mZWVkYmFjay50aXRsZSI6InJlYWxpbWVudGFjacOzbiIsInVuaS5idXR0b24uZmVlZGJhY2suc2VuZCI6ImVudmlhciIsInVuaS5jaG9vc2VMb2NhdGlvbi5zZWFyY2giOiJFbmNvbnRyYXIiLCJ1bmkuY2hvb3NlTG9jYXRpb24uY2FuY2VsIjoiQ2FuY2VsYXIifSxlLmZyPXsidW5pLmFwcC5xdWl0IjoiQXBwdXlleiDDoCBub3V2ZWF1IHBvdXIgcXVpdHRlciBsJ2FwcGxpY2F0aW9uIiwidW5pLmFzeW5jLmVycm9yIjoiTGEgY29ubmV4aW9uIGEgZXhwaXLDqSwgY2xpcXVleiBzdXIgbCfDqWNyYW4gcG91ciByw6llc3NheWVyLiIsInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIjoiQW5udWxlciIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiJWZXVpbGxleiBub3RlciBxdWUgc2hvd1RvYXN0IGRvaXQgw6p0cmUgYXNzb2Npw6kgw6AgaGlkZVRvYXN0IiwidW5pLnNob3dMb2FkaW5nLnVucGFpcmVkIjoiVmV1aWxsZXogbm90ZXIgcXVlIHNob3dMb2FkaW5nIGRvaXQgw6p0cmUgYXNzb2Npw6kgw6AgaGlkZUxvYWRpbmciLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiJPSyIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiJBbm51bGVyIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuYWxidW0iOiJBbGJ1bSIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSI6IkNhbcOpcmEiLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoiQW5udWxlciIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIjoiQWxidW0iLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiOiJDYW3DqXJhIiwidW5pLmNob29zZUZpbGUubm90VXNlckFjdGl2YXRpb24iOiJMYSBib8OudGUgZGUgZGlhbG9ndWUgZHUgc8OpbGVjdGV1ciBkZSBmaWNoaWVyIG5lIHBldXQgw6p0cmUgYWZmaWNow6llIHF1J2F2ZWMgdW5lIGFjdGl2YXRpb24gcGFyIGwndXRpbGlzYXRldXIiLCJ1bmkucHJldmlld0ltYWdlLmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoiR3VhcmRhciBpbWFnZW4iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyI6IkVucmVnaXN0csOpIGF2ZWMgc3VjY8OocyIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIjoiw4ljaGVjIGRlIGxhIHNhdXZlZ2FyZGUiLCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIjoiQ29udGVudSBjb3Bpw6kiLCJ1bmkuc2NhbkNvZGUudGl0bGUiOiJDb2RlIGTigJlhbmFseXNlIiwidW5pLnNjYW5Db2RlLmFsYnVtIjoiQWxidW0iLCJ1bmkuc2NhbkNvZGUuZmFpbCI6IkZhbGxvIGRlIHJlY29ub2NpbWllbnRvIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9uIjoiQXBwdXlleiBwb3VyIGFjdGl2ZXIgbCfDqWNsYWlyYWdlIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiI6IkFwcHV5ZXogcG91ciBkw6lzYWN0aXZlciBsJ8OpY2xhaXJhZ2UiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50IjoiUmVjb25uYWlzc2FuY2UgZGUgbCdlbXByZWludGUgZGlnaXRhbGUiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLndhaXRpbmdDb250ZW50IjoiTcOpY29ubmFpc3NhYmxlIiwidW5pLnBpY2tlci5kb25lIjoiT0siLCJ1bmkucGlja2VyLmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkudmlkZW8uZGFubXUiOiJEYW5tdSIsInVuaS52aWRlby52b2x1bWUiOiJMZSBWb2x1bWUiLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnRpdGxlIjoicmV0b3VyIGQnaW5mb3JtYXRpb24iLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnNlbmQiOiJlbnZveWVyIiwidW5pLmNob29zZUxvY2F0aW9uLnNlYXJjaCI6IlRyb3V2ZSIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiJBbm51bGVyIn0sZVsiemgtSGFucyJdPXsidW5pLmFwcC5xdWl0Ijoi5YaN5oyJ5LiA5qyh6YCA5Ye65bqU55SoIiwidW5pLmFzeW5jLmVycm9yIjoi6L+e5o6l5pyN5Yqh5Zmo6LaF5pe277yM54K55Ye75bGP5bmV6YeN6K+VIiwidW5pLnNob3dBY3Rpb25TaGVldC5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuc2hvd1RvYXN0LnVucGFpcmVkIjoi6K+35rOo5oSPIHNob3dUb2FzdCDkuI4gaGlkZVRvYXN0IOW/hemhu+mFjeWvueS9v+eUqCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6Iuivt+azqOaEjyBzaG93TG9hZGluZyDkuI4gaGlkZUxvYWRpbmcg5b+F6aG76YWN5a+55L2/55SoIiwidW5pLnNob3dNb2RhbC5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiLnoa7lrpoiLCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIjoi5Y+W5raIIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuYWxidW0iOiLku47nm7jlhozpgInmi6kiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiOiLmi43mkYQiLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoi5Y+W5raIIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iOiLku47nm7jlhozpgInmi6kiLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiOiLmi43mkYQiLCJ1bmkuY2hvb3NlRmlsZS5ub3RVc2VyQWN0aXZhdGlvbiI6IuaWh+S7tumAieaLqeWZqOWvueivneahhuWPquiDveWcqOeUseeUqOaIt+a/gOa0u+aXtuaYvuekuiIsInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSI6IuS/neWtmOWbvuWDjyIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIjoi5L+d5a2Y5Zu+5YOP5Yiw55u45YaM5oiQ5YqfIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiOiLkv53lrZjlm77lg4/liLDnm7jlhozlpLHotKUiLCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIjoi5YaF5a655bey5aSN5Yi2IiwidW5pLnNjYW5Db2RlLnRpdGxlIjoi5omr56CBIiwidW5pLnNjYW5Db2RlLmFsYnVtIjoi55u45YaMIiwidW5pLnNjYW5Db2RlLmZhaWwiOiLor4bliKvlpLHotKUiLCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iOiLovbvop6bnhafkuq4iLCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIjoi6L276Kem5YWz6ZetIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IuaMh+e6ueivhuWIq+S4rS4uLiIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiOiLml6Dms5Xor4bliKsiLCJ1bmkucGlja2VyLmRvbmUiOiLlrozmiJAiLCJ1bmkucGlja2VyLmNhbmNlbCI6IuWPlua2iCIsInVuaS52aWRlby5kYW5tdSI6IuW8ueW5lSIsInVuaS52aWRlby52b2x1bWUiOiLpn7Pph48iLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnRpdGxlIjoi6Zeu6aKY5Y+N6aaIIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoi5Y+R6YCBIiwidW5pLmNob29zZUxvY2F0aW9uLnNlYXJjaCI6IuaQnOe0ouWcsOeCuSIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiLlj5bmtogifSxlWyJ6aC1IYW50Il09eyJ1bmkuYXBwLnF1aXQiOiLlho3mjInkuIDmrKHpgIDlh7rmh4nnlKgiLCJ1bmkuYXN5bmMuZXJyb3IiOiLpgKPmjqXmnI3li5nlmajotoXmmYLvvIzpu57mk4rlsY/luZXph43oqaYiLCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCI6IuWPlua2iCIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiLoq4vms6jmhI8gc2hvd1RvYXN0IOiIhyBoaWRlVG9hc3Qg5b+F6aCI6YWN5bCN5L2/55SoIiwidW5pLnNob3dMb2FkaW5nLnVucGFpcmVkIjoi6KuL5rOo5oSPIHNob3dMb2FkaW5nIOiIhyBoaWRlTG9hZGluZyDlv4XpoIjphY3lsI3kvb/nlKgiLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IuWPlua2iCIsInVuaS5zaG93TW9kYWwuY29uZmlybSI6IueiuuWumiIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSI6IuW+nuebuOWGiumBuOaThyIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSI6IuaLjeaUnSIsInVuaS5jaG9vc2VWaWRlby5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSI6IuW+nuebuOWGiumBuOaThyIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSI6IuaLjeaUnSIsInVuaS5jaG9vc2VGaWxlLm5vdFVzZXJBY3RpdmF0aW9uIjoi5paH5Lu26YG45pOH5Zmo5bCN6Kmx5qGG5Y+q6IO95Zyo55Sx55So5oi25r+A5rS75pmC6aGv56S6IiwidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiOiLlj5bmtogiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoi5L+d5a2Y5ZyW5YOPIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLnN1Y2Nlc3MiOiLkv53lrZjlnJblg4/liLDnm7jlhormiJDlip8iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuZmFpbCI6IuS/neWtmOWcluWDj+WIsOebuOWGiuWkseaVlyIsInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiOiLlhaflrrnlt7LlvqnliLYiLCJ1bmkuc2NhbkNvZGUudGl0bGUiOiLmjoPnorwiLCJ1bmkuc2NhbkNvZGUuYWxidW0iOiLnm7jlhooiLCJ1bmkuc2NhbkNvZGUuZmFpbCI6IuitmOWIpeWkseaVlyIsInVuaS5zY2FuQ29kZS5mbGFzaC5vbiI6Iui8leinuOeFp+S6riIsInVuaS5zY2FuQ29kZS5mbGFzaC5vZmYiOiLovJXop7jpl5zplokiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50Ijoi5oyH57SL6K2Y5Yil5LitLi4uIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi53YWl0aW5nQ29udGVudCI6IueEoeazleitmOWIpSIsInVuaS5waWNrZXIuZG9uZSI6IuWujOaIkCIsInVuaS5waWNrZXIuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnZpZGVvLmRhbm11Ijoi5b2I5bmVIiwidW5pLnZpZGVvLnZvbHVtZSI6Iumfs+mHjyIsInVuaS5idXR0b24uZmVlZGJhY2sudGl0bGUiOiLllY/poYzlj43ppYsiLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnNlbmQiOiLnmbzpgIEiLCJ1bmkuY2hvb3NlTG9jYXRpb24uc2VhcmNoIjoi5pCc57Si5Zyw6bueIiwidW5pLmNob29zZUxvY2F0aW9uLmNhbmNlbCI6IuWPlua2iCJ9LGUpKSxldD0ib2JqZWN0Ij09dHlwZW9mIGlnP2lnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRMYW5ndWFnZSgpOiIiLGZ1bmN0aW9uKCl7aWYoZHQoKSl7dmFyIGU9T2JqZWN0LmtleXMoZGcubG9jYWxlcyk7ZS5sZW5ndGgmJmUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1pdFtlXSxuPWRnLmxvY2FsZXNbZV07dD9PYmplY3QuYXNzaWduKHQsbik6aXRbZV09bn0pfX0oKTt2YXIgb3Q9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk7dm9pZCAwPT09dCYmKHQ9e30pLCJzdHJpbmciIT10eXBlb2YgZSYmKGU9KGk9W3QsZV0pWzBdLHQ9aVsxXSksInN0cmluZyIhPXR5cGVvZiBlJiYoZT12b2lkIDAhPT1wZyYmcGcuZ2V0TG9jYWxlP3BnLmdldExvY2FsZSgpOnZvaWQgMCE9PWdsb2JhbCYmZ2xvYmFsLmdldExvY2FsZT9nbG9iYWwuZ2V0TG9jYWxlKCk6R2UpLCJzdHJpbmciIT10eXBlb2YgbiYmKG49dm9pZCAwIT09ZGcmJmRnLmZhbGxiYWNrTG9jYWxlfHxHZSk7dmFyIGE9bmV3IFplKHtsb2NhbGU6ZSxmYWxsYmFja0xvY2FsZTpuLG1lc3NhZ2VzOnQsd2F0Y2hlcjpyfSkscz1mdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBoZylzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEudChlLHQpfTtlbHNle3ZhciBvPSExO3M9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9aGcoKS4kdm07cmV0dXJuIGkmJihpLiRsb2NhbGUsb3x8KG89ITAscj1hLChuPWkpLiR3YXRjaExvY2FsZT9uLiR3YXRjaExvY2FsZShmdW5jdGlvbihlKXtyLnNldExvY2FsZShlKX0pOm4uJHdhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIG4uJGxvY2FsZX0sZnVuY3Rpb24oZSl7ci5zZXRMb2NhbGUoZSl9KSkpLGEudChlLHQpfX1yZXR1cm4gcyhlLHQpfTtyZXR1cm57aTE4bjphLGY6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBhLmYoZSx0LG4pfSx0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHMoZSx0KX0sYWRkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49ITApLGEuYWRkKGUsdCxuKX0sd2F0Y2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGEud2F0Y2hMb2NhbGUoZSl9LGdldExvY2FsZTpmdW5jdGlvbigpe3JldHVybiBhLmdldExvY2FsZSgpfSxzZXRMb2NhbGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGEuc2V0TG9jYWxlKGUpfX19KGV0LGl0KSxhdD1vdC50LHN0PShvdC5taXhpbj17YmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PW90LmkxOG4ud2F0Y2hMb2NhbGUoZnVuY3Rpb24oKXtlLiRmb3JjZVVwZGF0ZSgpfSk7dGhpcy4kb25jZSgiaG9vazpiZWZvcmVEZXN0cm95IixmdW5jdGlvbigpe3QoKX0pfSxtZXRob2RzOnskJHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXQoZSx0KX19fSxvdC5nZXRMb2NhbGUpO3ZhciBjdD1bIiUiLCIlIl07ZnVuY3Rpb24gdXQoZSl7cmV0dXJuIFFlKGUsY3QpP290LmYoZSwodD1wZy5nZXRMb2NhbGUoKSwobj1kZy5sb2NhbGVzKVt0XXx8bltkZy5mYWxsYmFja0xvY2FsZV18fG5bcnRdfHx7fSksY3QpOmU7dmFyIHQsbn1mdW5jdGlvbiBsdCh0LGUpe3JldHVybiBlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gdChlLG4pe3ZhciByPWZ1bmN0aW9uIGUodCxuKXtpZigxIT09bi5sZW5ndGgpe3ZhciByPW4uc2hpZnQoKTtyZXR1cm4gZSh0JiZ0W3JdLG4pfWlmKHQpe3ZhciBpPWZ1bmN0aW9uKGUpe3JldHVybiB1KGUpJiZRZShlLGN0KX0sbz1uWzBdLGE9W107aWYoQXJyYXkuaXNBcnJheSh0KSYmKGE9dC5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGkoZVtvXSl9KSkubGVuZ3RoKXJldHVybiBhO3ZhciBzPXRbb107aWYoaShzKSlyZXR1cm4gdH19KGUsbik7aWYoIXIpcmV0dXJuITE7dmFyIGk9bltuLmxlbmd0aC0xXTtpZihBcnJheS5pc0FycmF5KHIpKXIuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gdChlLFtpXSl9KTtlbHNle3ZhciBvPXJbaV07T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsaSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHV0KG8pfSxzZXQ6ZnVuY3Rpb24oZSl7bz1lfX0pfXJldHVybiEwfSh0LGUpfSl9ZnVuY3Rpb24gZHQoKXtyZXR1cm4gdm9pZCAwIT09ZGcmJmRnLmxvY2FsZXMmJiEhT2JqZWN0LmtleXMoZGcubG9jYWxlcykubGVuZ3RofXZhciBmdD17ZGF0YTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHNob3dUb2FzdDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LGJlZm9yZVN1Y2Nlc3M6ZnVuY3Rpb24oZSx0KXtpZih0LnNob3dUb2FzdCl7dmFyIG49YXQoInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiKTtuJiZwZy5zaG93VG9hc3Qoe3RpdGxlOm4saWNvbjoic3VjY2VzcyIsbWFzazohMSxzdHlsZTp7d2lkdGg6dm9pZCAwfX0pfX19LHB0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldENsaXBib2FyZERhdGE6ZnR9KTtmdW5jdGlvbiBodChlLHQpe2lmKHQpe2lmKDA9PT10LmluZGV4T2YoIi8iKSlyZXR1cm4gdH1lbHNle2lmKDA9PT0odD1lKS5pbmRleE9mKCIvIikpcmV0dXJuIHQ7dmFyIG49dmcoKTtlPW4ubGVuZ3RoP25bbi5sZW5ndGgtMV0uJHBhZ2Uucm91dGU6IiJ9aWYoMD09PXQuaW5kZXhPZigiLi8iKSlyZXR1cm4gaHQoZSx0LnN1YnN0cigyKSk7Zm9yKHZhciByPXQuc3BsaXQoIi8iKSxpPXIubGVuZ3RoLG89MDtvPGkmJiIuLiI9PT1yW29dO28rKyk7ci5zcGxpY2UoMCxvKSx0PXIuam9pbigiLyIpO3ZhciBhPTA8ZS5sZW5ndGg/ZS5zcGxpdCgiLyIpOltdO3JldHVybiBhLnNwbGljZShhLmxlbmd0aC1vLTEsbysxKSwiLyIrYS5jb25jYXQocikuam9pbigiLyIpfXZhciB2dCxndD0vXihbYS16LV0rOik/XC9cLy9pLG10PS9eZGF0YTouKiwuKi87ZnVuY3Rpb24geXQoZSl7cmV0dXJuIG9nLmlvLmNvbnZlcnRMb2NhbEZpbGVTeXN0ZW1VUkwoZSkucmVwbGFjZSgvXlwvP2FwcHNcLy8sIi9hbmRyb2lkX2Fzc2V0L2FwcHMvIikucmVwbGFjZSgvXC8kLywiIil9ZnVuY3Rpb24gX3QoZSl7cmV0dXJuIHZ0fHwodnQ9ImZpbGU6Ly8iK3l0KCJfd3d3IikrIi8iKSx2dCtlfWZ1bmN0aW9uIGJ0KGUpe2lmKDA9PT1lLmluZGV4T2YoIi8iKSlyZXR1cm4gMD09PWUuaW5kZXhPZigiLy8iKT8iaHR0cHM6IitlOmUuc3RhcnRzV2l0aCgiL3N0b3JhZ2UvIil8fGUuc3RhcnRzV2l0aCgiL3NkY2FyZC8iKXx8ZS5pbmNsdWRlcygiL0NvbnRhaW5lcnMvRGF0YS9BcHBsaWNhdGlvbi8iKT8iZmlsZTovLyIrZTpfdChlLnN1YnN0cigxKSk7aWYoZ3QudGVzdChlKXx8bXQudGVzdChlKXx8MD09PWUuaW5kZXhPZigiYmxvYjoiKSlyZXR1cm4gZTtpZigwPT09ZS5pbmRleE9mKCJfd3d3Iil8fDA9PT1lLmluZGV4T2YoIl9kbyIpKXJldHVybiJmaWxlOi8vIit5dChlKTt2YXIgdD12ZygpO3JldHVybiB0Lmxlbmd0aD9fdChodCh0W3QubGVuZ3RoLTFdLiRwYWdlLnJvdXRlLGUpLnN1YnN0cigxKSk6ZX12YXIgd3Q9e3RlbXBGaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC50ZW1wRmlsZVBhdGg9YnQoZSl9fX0sa3Q9WyJtZDUiLCJzaGExIl0sU3Q9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmZpbGVQYXRoPWJ0KGUpfX0sZGlnZXN0QWxnb3JpdGhtOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmRpZ2VzdEFsZ29yaXRobT1rdC5pbmNsdWRlcyhlKT9lOmt0WzBdfSxkZWZhdWx0Omt0WzBdfX0seHQ9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmZpbGVQYXRoPWJ0KGUpfX19LEN0PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1idChlKX19fSxUdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzYXZlRmlsZTp3dCxnZXRGaWxlSW5mbzpTdCxnZXRTYXZlZEZpbGVJbmZvOnh0LHJlbW92ZVNhdmVkRmlsZTpDdH0pLE90PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGZpbGVUeXBlOnt0eXBlOlN0cmluZ319LEV0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9wZW5Eb2N1bWVudDpPdH0pLEl0PXtrZXl3b3JkOnt0eXBlOlN0cmluZ319LEF0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNob29zZUxvY2F0aW9uOkl0fSksJHQ9WyJ3Z3M4NCIsImdjajAyIl0sUHQ9e3R5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLHQudHlwZT0kdC5pbmRleE9mKGUpPDA/JHRbMF06ZX19LGFsdGl0dWRlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LE10PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldExvY2F0aW9uOlB0fSksanQ9e2xhdGl0dWRlOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMH0sbG9uZ2l0dWRlOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMH0sc2NhbGU6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9TWF0aC5mbG9vcihlKSx0LnNjYWxlPTU8PWUmJmU8PTE4P2U6MTh9LGRlZmF1bHQ6MTh9LG5hbWU6e3R5cGU6U3RyaW5nfSxhZGRyZXNzOnt0eXBlOlN0cmluZ319LEx0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9wZW5Mb2NhdGlvbjpqdH0pLEJ0PVsiYWxsIiwiaW1hZ2UiLCJ2aWRlbyJdLE50PVsiYWxidW0iLCJjYW1lcmEiXSxEdD17Y291bnQ6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiExLGRlZmF1bHQ6MTAwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U8PTAmJih0LmNvdW50PTEwMCl9fSxzb3VyY2VUeXBlOnt0eXBlOkFycmF5LHJlcXVpcmVkOiExLGRlZmF1bHQ6TnQsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gTnQuaW5jbHVkZXMoZSl9KSx0LnNvdXJjZVR5cGU9ZS5sZW5ndGg/ZTpOdH19LHR5cGU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiExLGRlZmF1bHQ6ImFsbCIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7QnQuaW5jbHVkZXMoZSl8fCh0LnR5cGU9QnRbMF0pLHQudHlwZT0iYWxsIj09PXQudHlwZT90LnR5cGU9IioiOnQudHlwZX19LGV4dGVuc2lvbjp7dHlwZTpBcnJheSxkZWZhdWx0OlsiIl0sdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoMD09PWUubGVuZ3RoKXJldHVybiJwYXJhbSBleHRlbnNpb24gc2hvdWxkIG5vdCBiZSBlbXB0eS4ifX19LFJ0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNob29zZUZpbGU6RHR9KSxGdD1bIm9yaWdpbmFsIiwiY29tcHJlc3NlZCJdLFV0PVsiYWxidW0iLCJjYW1lcmEiXSx6dD17Y291bnQ6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiExLGRlZmF1bHQ6OSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPD0wJiYodC5jb3VudD05KX19LHNpemVUeXBlOnt0eXBlOltBcnJheSxTdHJpbmddLHJlcXVpcmVkOiExLGRlZmF1bHQ6RnQsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT0oZT0ic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gRnQuaW5jbHVkZXMoZSl9KSx0LnNpemVUeXBlPWUubGVuZ3RoP2U6RnR9fSxzb3VyY2VUeXBlOnt0eXBlOkFycmF5LHJlcXVpcmVkOiExLGRlZmF1bHQ6VXQsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gVXQuaW5jbHVkZXMoZSl9KSx0LnNvdXJjZVR5cGU9ZS5sZW5ndGg/ZTpVdH19LGV4dGVuc2lvbjp7dHlwZTpBcnJheSxkZWZhdWx0OlsiKiJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4icGFyYW0gZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZW1wdHkuIn19fSxWdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VJbWFnZTp6dH0pLHF0PVsiYWxidW0iLCJjYW1lcmEiXSxXdD17c291cmNlVHlwZTp7dHlwZTpBcnJheSxyZXF1aXJlZDohMSxkZWZhdWx0OnF0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHF0LmluY2x1ZGVzKGUpfSksdC5zb3VyY2VUeXBlPWUubGVuZ3RoP2U6cXR9fSxjb21wcmVzc2VkOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH0sbWF4RHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NjB9LGNhbWVyYTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiYmFjayJ9LGV4dGVuc2lvbjp7dHlwZTpBcnJheSxkZWZhdWx0OlsiKiJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4icGFyYW0gZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZW1wdHkuIn19fSxIdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VWaWRlbzpXdH0pLEd0PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3Quc3JjPWJ0KGUpfX19LFh0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNvbXByZXNzSW1hZ2U6R3R9KSxKdD17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LnNyYz1idChlKX19LHF1YWxpdHk6e3R5cGU6U3RyaW5nfSxiaXRyYXRlOnt0eXBlOk51bWJlcn0sZnBzOnt0eXBlOk51bWJlcn0scmVzb2x1dGlvbjp7dHlwZTpOdW1iZXJ9fSxZdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjb21wcmVzc1ZpZGVvOkp0fSksS3Q9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5zcmM9YnQoZSl9fX0sWnQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0SW1hZ2VJbmZvOkt0fSksUXQ9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5zcmM9YnQoZSl9fX0sZW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0VmlkZW9JbmZvOlF0fSksdG49e3VybHM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dmFyIG47aWYodC51cmxzPWUubWFwKGZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gYnQoZSk7bj0hMH0pLG4pcmV0dXJuInVybCBpcyBub3Qgc3RyaW5nIn19LGN1cnJlbnQ6e3R5cGU6W1N0cmluZyxOdW1iZXJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpeyJudW1iZXIiPT10eXBlb2YgZT90LmN1cnJlbnQ9MDxlJiZlPHQudXJscy5sZW5ndGg/ZTowOiJzdHJpbmciPT10eXBlb2YgZSYmZSYmKHQuY3VycmVudD1idChlKSl9LGRlZmF1bHQ6MH19LG5uPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHByZXZpZXdJbWFnZTp0bn0pLHJuPXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1idChlKX19fSxvbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtOnJufSksYW49e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGhlYWRlcjp7dHlwZTpPYmplY3QsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5oZWFkZXI9ZXx8e319fX0sc249T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZG93bmxvYWRGaWxlOmFufSksY249e09QVElPTlM6Ik9QVElPTlMiLEdFVDoiR0VUIixIRUFEOiJIRUFEIixQT1NUOiJQT1NUIixQVVQ6IlBVVCIsREVMRVRFOiJERUxFVEUiLFRSQUNFOiJUUkFDRSIsQ09OTkVDVDoiQ09OTkVDVCIsUEFUQ0g6IlBBVENIIn0sdW49Impzb24iLGxuPXtURVhUOiJ0ZXh0IixBUlJBWUJVRkZFUjoiYXJyYXlidWZmZXIifSxkbj1lbmNvZGVVUklDb21wb25lbnQ7dmFyIGZuLHBuPXttZXRob2Q6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGV8fCIiKS50b1VwcGVyQ2FzZSgpLHQubWV0aG9kPU9iamVjdC52YWx1ZXMoY24pLmluZGV4T2YoZSk8MD9jbi5HRVQ6ZX19LGRhdGE6e3R5cGU6W09iamVjdCxTdHJpbmcsQXJyYXksQXJyYXlCdWZmZXJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZGF0YT1lfHwiIn19LHVybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5tZXRob2Q9PT1jbi5HRVQmJlQodC5kYXRhKSYmT2JqZWN0LmtleXModC5kYXRhKS5sZW5ndGgmJih0LnVybD1mdW5jdGlvbihlLHQpe3ZhciBuPWUuc3BsaXQoIiMiKSxyPW5bMV18fCIiLGk9KG49blswXS5zcGxpdCgiPyIpKVsxXXx8IiI7ZT1uWzBdO3ZhciBvPWkuc3BsaXQoIiYiKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KTtmb3IodmFyIGEgaW4gaT17fSxvLmZvckVhY2goZnVuY3Rpb24oZSl7ZT1lLnNwbGl0KCI9IiksaVtlWzBdXT1lWzFdfSksdClpZihrKHQsYSkpe3ZhciBzPXRbYV07bnVsbD09cz9zPSIiOlQocykmJihzPUpTT04uc3RyaW5naWZ5KHMpKSxpW2RuKGEpXT1kbihzKX1yZXR1cm4gZSsoKGk9T2JqZWN0LmtleXMoaSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlKyI9IitpW2VdfSkuam9pbigiJiIpKT8iPyIraToiIikrKHI/IiMiK3I6IiIpfShlLHQuZGF0YSkpfX0saGVhZGVyOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmhlYWRlcj1lfHx7fTt0Lm1ldGhvZCE9PWNuLkdFVCYmKE9iamVjdC5rZXlzKG4pLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuImNvbnRlbnQtdHlwZSI9PT1lLnRvTG93ZXJDYXNlKCl9KXx8KG5bIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9qc29uIikpfX0sZGF0YVR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZGF0YVR5cGU9KGV8fHVuKS50b0xvd2VyQ2FzZSgpfX0scmVzcG9uc2VUeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9Mb3dlckNhc2UoKSx0LnJlc3BvbnNlVHlwZT1PYmplY3QudmFsdWVzKGxuKS5pbmRleE9mKGUpPDA/bG4uVEVYVDplfX0sd2l0aENyZWRlbnRpYWxzOnt0eXBlOkJvb2xlYW59LHRpbWVvdXQ6e3R5cGU6TnVtYmVyfX0saG49e2NlcnRpZmljYXRlczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7aWYoZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiJTdHJpbmciIT09cChlLmhvc3QpfSkpcmV0dXJuIuWPguaVsOmFjee9rumUmeivr++8jOivt+ehruiupOWQjumHjeivlSJ9fX0sdm49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscmVxdWVzdDpwbixjb25maWdNVExTOmhufSksZ249e09QVElPTlM6Ik9QVElPTlMiLEdFVDoiR0VUIixIRUFEOiJIRUFEIixQT1NUOiJQT1NUIixQVVQ6IlBVVCIsREVMRVRFOiJERUxFVEUiLFRSQUNFOiJUUkFDRSIsQ09OTkVDVDoiQ09OTkVDVCJ9LG1uPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuaGVhZGVyPWV8fHt9fX0sbWV0aG9kOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9VcHBlckNhc2UoKSx0Lm1ldGhvZD1PYmplY3QudmFsdWVzKGduKS5pbmRleE9mKGUpPDA/Z24uR0VUOmV9fSxwcm90b2NvbHM6e3R5cGU6W0FycmF5LFN0cmluZ10sdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7InN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pLHQucHJvdG9jb2xzPShlfHxbXSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0pfX19LHluPXtkYXRhOnt0eXBlOltTdHJpbmcsQXJyYXlCdWZmZXJdfX0sX249e2NvZGU6e3R5cGU6TnVtYmVyfSxyZWFzb246e3R5cGU6U3RyaW5nfX0sYm49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY29ubmVjdFNvY2tldDptbixzZW5kU29ja2V0TWVzc2FnZTp5bixjbG9zZVNvY2tldDpfbn0pLHduPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlczp7dHlwZTpBcnJheX0sZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2UmJih0LmZpbGVQYXRoPWJ0KGUpKX19LG5hbWU6e3R5cGU6U3RyaW5nfSxoZWFkZXI6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuaGVhZGVyPWV8fHt9fX0sZm9ybURhdGE6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZm9ybURhdGE9ZXx8e319fX0sa249T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXBsb2FkRmlsZTp3bn0pLFNuPXtPQVVUSDoiT0FVVEgiLFNIQVJFOiJTSEFSRSIsUEFZTUVOVDoiUEFZTUVOVCIsUFVTSDoiUFVTSCJ9LHhuPXtzZXJ2aWNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigoZT0oZXx8IiIpLnRvVXBwZXJDYXNlKCkpJiZPYmplY3QudmFsdWVzKFNuKS5pbmRleE9mKGUpPDApcmV0dXJuInNlcnZpY2UgZXJyb3IifX19LENuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFByb3ZpZGVyOnhufSksVG49e3Jvb3Q6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbih0LGUpe3ZhciBuPWRnLnN1YlBhY2thZ2VzO3JldHVybiBBcnJheS5pc0FycmF5KG4pJiYwIT09bi5sZW5ndGg/bi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJvb3Q9PT10fSk/dm9pZCAwOiJyb290IGAiK3QrImAgaXMgbm90IGZvdW5kIjoibm8gc3ViUGFja2FnZXMifX19LE9uPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGxvYWRTdWJQYWNrYWdlOlRufSksRW49e1VOSVZFUklGWToidW5pdmVyaWZ5In0sSW49e3Byb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCxkZWZhdWx0OkVuLlVOSVZFUklGWSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZihPYmplY3QudmFsdWVzKEVuKS5pbmRleE9mKGUpPDApcmV0dXJuInByb3ZpZGVyIGVycm9yIn19fSxBbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwcmVMb2dpbjpJbn0pO2Z1bmN0aW9uICRuKGEpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciByPShlPWh0KGUpKS5zcGxpdCgiPyIpWzBdLG49ZmcuZmluZChmdW5jdGlvbihlKXt2YXIgdD1lLnBhdGgsbj1lLmFsaWFzO3JldHVybiB0PT09cnx8bj09PXJ9KTtpZighbilyZXR1cm4icGFnZSBgIitlKyJgIGlzIG5vdCBmb3VuZCI7aWYoIm5hdmlnYXRlVG8iPT09YXx8InJlZGlyZWN0VG8iPT09YSl7aWYobi5tZXRhLmlzVGFiQmFyKXJldHVybiJjYW4gbm90ICIrYSsiIGEgdGFiYmFyIHBhZ2UifWVsc2UgaWYoInN3aXRjaFRhYiI9PT1hJiYhbi5tZXRhLmlzVGFiQmFyKXJldHVybiJjYW4gbm90IHN3aXRjaCB0byBuby10YWJCYXIgcGFnZSI7aWYoInN3aXRjaFRhYiIhPT1hJiYicHJlbG9hZFBhZ2UiIT09YXx8IW4ubWV0YS5pc1RhYkJhcnx8ImFwcExhdW5jaCI9PT10Lm9wZW5UeXBlfHwoZT1yKSxuLm1ldGEuaXNFbnRyeSYmKGU9ZS5yZXBsYWNlKG4uYWxpYXMsIi8iKSksdC51cmw9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlO3ZhciB0PWUuaW5kZXhPZigiPyIpO2lmKC0xPT09dClyZXR1cm4gZTt2YXIgbj1lLnN1YnN0cih0KzEpLnRyaW0oKS5yZXBsYWNlKC9eKFw/fCN8JikvLCIiKTtpZighbilyZXR1cm4gZTtlPWUuc3Vic3RyKDAsdCk7dmFyIGk9W107cmV0dXJuIG4uc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvXCsvZywiICIpLnNwbGl0KCI9Iiksbj10LnNoaWZ0KCkscj0wPHQubGVuZ3RoP3Quam9pbigiPSIpOiIiO2kucHVzaChuKyI9IitlbmNvZGVVUklDb21wb25lbnQocikpfSksaS5sZW5ndGg/ZSsiPyIraS5qb2luKCImIik6ZX0oZSksInVuUHJlbG9hZFBhZ2UiIT09YSlpZigicHJlbG9hZFBhZ2UiIT09YSl7aWYoZm49PT1lJiYiYXBwTGF1bmNoIiE9PXQub3BlblR5cGUpcmV0dXJuIGZuKyIgbG9ja2VkIjtkZy5yZWFkeSYmITEhPT1kZy5lbmFibGVOYXZpZ2F0b3JMb2NrJiYoZm49ZSl9ZWxzZXtpZighbi5tZXRhLmlzTlZ1ZSlyZXR1cm4iY2FuIG5vdCBwcmVsb2FkIHZ1ZSBwYWdlIjtpZihuLm1ldGEuaXNUYWJCYXIpe3ZhciBpPXZnKCEwKSxvPShuLmFsaWFzfHxuLnBhdGgpLnN1YnN0cigxKTtpZihpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucm91dGU9PT1vfSkpcmV0dXJuInRhYkJhciBwYWdlIGAiK28rImAgYWxyZWFkeSBleGlzdHMifX19fWZ1bmN0aW9uIFBuKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxPYmplY3QuYXNzaWduKHt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjokbihlKX0sYmVmb3JlQWxsOmZ1bmN0aW9uKCl7Zm49IiJ9fSx0KX1mdW5jdGlvbiBNbih0KXtyZXR1cm57YW5pbWF0aW9uVHlwZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe2lmKGUmJi0xPT09dC5pbmRleE9mKGUpKXJldHVybiJgIitlKyJgIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGBhbmltYXRpb25UeXBlYCAoc3VwcG9ydGVkIHZhbHVlcyBhcmU6IGAiK3Quam9pbigiYHxgIikrImApIn19LGFuaW1hdGlvbkR1cmF0aW9uOnt0eXBlOk51bWJlcn19fXZhciBqbixMbixCbj1QbigicmVkaXJlY3RUbyIpLE5uPVBuKCJyZUxhdW5jaCIpLERuPVBuKCJuYXZpZ2F0ZVRvIixNbihbInNsaWRlLWluLXJpZ2h0Iiwic2xpZGUtaW4tbGVmdCIsInNsaWRlLWluLXRvcCIsInNsaWRlLWluLWJvdHRvbSIsImZhZGUtaW4iLCJ6b29tLW91dCIsInpvb20tZmFkZS1vdXQiLCJwb3AtaW4iLCJub25lIl0pKSxSbj1Qbigic3dpdGNoVGFiIiksRm49T2JqZWN0LmFzc2lnbih7ZGVsdGE6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9cGFyc2VJbnQoZSl8fDEsdC5kZWx0YT1NYXRoLm1pbih2ZygpLmxlbmd0aC0xLGUpfX19LE1uKFsic2xpZGUtb3V0LXJpZ2h0Iiwic2xpZGUtb3V0LWxlZnQiLCJzbGlkZS1vdXQtdG9wIiwic2xpZGUtb3V0LWJvdHRvbSIsImZhZGUtb3V0Iiwiem9vbS1pbiIsInpvb20tZmFkZS1pbiIsInBvcC1vdXQiLCJub25lIl0pKSxVbj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6JG4oInByZWxvYWRQYWdlIil9fSx6bj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6JG4oInVuUHJlbG9hZFBhZ2UiKX19LFZuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHJlZGlyZWN0VG86Qm4scmVMYXVuY2g6Tm4sbmF2aWdhdGVUbzpEbixzd2l0Y2hUYWI6Um4sbmF2aWdhdGVCYWNrOkZuLHByZWxvYWRQYWdlOlVuLHVuUHJlbG9hZFBhZ2U6em59KSxxbj17a2V5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFduPVt7bmFtZToia2V5Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLEhuPXtrZXk6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxkYXRhOntyZXF1aXJlZDohMH19LEduPVt7bmFtZToia2V5Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImRhdGEiLHJlcXVpcmVkOiEwfV0sWG49cW4sSm49V24sWW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0U3RvcmFnZTpxbixnZXRTdG9yYWdlU3luYzpXbixzZXRTdG9yYWdlOkhuLHNldFN0b3JhZ2VTeW5jOkduLHJlbW92ZVN0b3JhZ2U6WG4scmVtb3ZlU3RvcmFnZVN5bmM6Sm59KSxLbj17ZmFtaWx5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc291cmNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzYzp7dHlwZTpPYmplY3QscmVxdWlyZWQ6ITF9LHN1Y2Nlc3M6e3R5cGU6RnVuY3Rpb24scmVxdWlyZWQ6ITF9LGZhaWw6e3R5cGU6RnVuY3Rpb24scmVxdWlyZWQ6ITF9LGNvbXBsZXRlOnt0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiExfX0sWm49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbG9hZEZvbnRGYWNlOktufSksUW49WyIjZmZmZmZmIiwiIzAwMDAwMCJdLGVyPXtmcm9udENvbG9yOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigtMT09PVFuLmluZGV4T2YoZSkpcmV0dXJuJ2ludmFsaWQgZnJvbnRDb2xvciAiJytlKyciJ319LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGFuaW1hdGlvbjp7dHlwZTpPYmplY3QsZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybntkdXJhdGlvbjowLHRpbWluZ0Z1bmM6ImxpbmVhciJ9fSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSksdC5hbmltYXRpb249e2R1cmF0aW9uOmUuZHVyYXRpb258fDAsdGltaW5nRnVuYzplLnRpbWluZ0Z1bmN8fCJsaW5lYXIifX19fSx0cj17dGl0bGU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sbnI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2V0TmF2aWdhdGlvbkJhckNvbG9yOmVyLHNldE5hdmlnYXRpb25CYXJUaXRsZTp0cn0pLHJyPXtzY3JvbGxUb3A6e3R5cGU6TnVtYmVyfSxkdXJhdGlvbjp7dHlwZTpOdW1iZXIsZGVmYXVsdDozMDAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5kdXJhdGlvbj1NYXRoLm1heCgwLGUpfX19LGlyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHBhZ2VTY3JvbGxUbzpycn0pLG9yPXt0aXRsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sY29udGVudDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sc2hvd0NhbmNlbDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LGNhbmNlbFRleHQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm4gYXQoInVuaS5zaG93TW9kYWwuY2FuY2VsIil9fSxjYW5jZWxDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwMCJ9LGNvbmZpcm1UZXh0Ont0eXBlOlN0cmluZyxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuIGF0KCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iKX19LGNvbmZpcm1Db2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LHZpc2libGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfX0sYXI9e3RpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxpY29uOntkZWZhdWx0OiJzdWNjZXNzIix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXstMT09PVsic3VjY2VzcyIsImxvYWRpbmciLCJlcnJvciIsIm5vbmUiXS5pbmRleE9mKGUpJiYodC5pY29uPSJzdWNjZXNzIil9fSxpbWFnZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlJiYodC5pbWFnZT1idChlKSl9fSxkdXJhdGlvbjp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxNTAwfSxtYXNrOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sdmlzaWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9fSxzcj17dGl0bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGljb246e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImxvYWRpbmcifSxkdXJhdGlvbjp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxZTh9LG1hc2s6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSx2aXNpYmxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH19LGNyPXtpdGVtTGlzdDp7dHlwZTpBcnJheSxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZighZS5sZW5ndGgpcmV0dXJuInBhcmFtZXRlci5pdGVtTGlzdCBzaG91bGQgaGF2ZSBhdCBsZWFzdCAxIGl0ZW0ifX0saXRlbUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDAwIn0sdmlzaWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LHBvcG92ZXI6e3R5cGU6T2JqZWN0fX0sdXI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2hvd01vZGFsOm9yLHNob3dUb2FzdDphcixzaG93TG9hZGluZzpzcixzaG93QWN0aW9uU2hlZXQ6Y3J9KSxscj17dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LGRyPXtpbmRleDpscix0ZXh0Ont0eXBlOlN0cmluZ30saWNvblBhdGg6e3R5cGU6U3RyaW5nfSxzZWxlY3RlZEljb25QYXRoOnt0eXBlOlN0cmluZ30scGFnZVBhdGg6e3R5cGU6U3RyaW5nfX0sZnI9e2NvbG9yOnt0eXBlOlN0cmluZ30sc2VsZWN0ZWRDb2xvcjp7dHlwZTpTdHJpbmd9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmd9LGJhY2tncm91bmRJbWFnZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZSYmIS9eKGxpbmVhcnxyYWRpYWwpLWdyYWRpZW50XCguKz9cKTs/JC8udGVzdChlKSYmKHQuYmFja2dyb3VuZEltYWdlPWJ0KGUpKX19LGJhY2tncm91bmRSZXBlYXQ6e3R5cGU6U3RyaW5nfSxib3JkZXJTdHlsZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZSYmKHQuYm9yZGVyU3R5bGU9ImJsYWNrIj09PWU/ImJsYWNrIjoid2hpdGUiKX19fSxwcj17YW5pbWF0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LGhyPXthbmltYXRpb246e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX0sdnI9e2luZGV4OmxyfSxncj17aW5kZXg6bHJ9LG1yPXtpbmRleDpscn0seXI9e2luZGV4OmxyLHRleHQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3ZhciBuO3ZvaWQgMD09PShuPWUpJiYobj0iIiksNDw9KCIiK24pLnJlcGxhY2UoL1teXHgwMC1ceGZmXS9nLCIqKiIpLmxlbmd0aCYmKHQudGV4dD0iLi4uIil9fX0sX3I9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2V0VGFiQmFySXRlbTpkcixzZXRUYWJCYXJTdHlsZTpmcixoaWRlVGFiQmFyOnByLHNob3dUYWJCYXI6aHIsaGlkZVRhYkJhclJlZERvdDp2cixzaG93VGFiQmFyUmVkRG90OmdyLHJlbW92ZVRhYkJhckJhZGdlOm1yLHNldFRhYkJhckJhZGdlOnlyfSksYnI9T2JqZWN0LmNyZWF0ZShudWxsKSx3cj0oam49eyIuL2Jhc2UvYmFzZTY0LmpzIjp1ZSwiLi9iYXNlL2Nhbi1pLXVzZS5qcyI6ZGUsIi4vYmFzZS9ldmVudC1idXMuanMiOmdlLCIuL2Jhc2UvaW50ZXJjZXB0b3IuanMiOl9lLCIuL2Jhc2UvdXB4MnB4LmpzIjp3ZSwiLi9jb250ZXh0L2NhbnZhcy5qcyI6RWUsIi4vY29udGV4dC9jb250ZXh0LmpzIjpqZSwiLi9kZXZpY2UvYWRkLXBob25lLWNvbnRhY3QuanMiOkJlLCIuL2RldmljZS9tYWtlLXBob25lLWNhbGwuanMiOkRlLCIuL2RldmljZS9zY2FuLWNvZGUuanMiOkZlLCIuL2RldmljZS9zZXQtY2xpcGJvYXJkLWRhdGEuanMiOnB0LCIuL2ZpbGUvZmlsZS5qcyI6VHQsIi4vZmlsZS9vcGVuLWRvY3VtZW50LmpzIjpFdCwiLi9sb2NhdGlvbi9jaG9vc2UtbG9jYXRpb24uanMiOkF0LCIuL2xvY2F0aW9uL2dldC1sb2NhdGlvbi5qcyI6TXQsIi4vbG9jYXRpb24vb3Blbi1sb2NhdGlvbi5qcyI6THQsIi4vbWVkaWEvY2hvb3NlLWZpbGUuanMiOlJ0LCIuL21lZGlhL2Nob29zZS1pbWFnZS5qcyI6VnQsIi4vbWVkaWEvY2hvb3NlLXZpZGVvLmpzIjpIdCwiLi9tZWRpYS9jb21wcmVzcy1pbWFnZS5qcyI6WHQsIi4vbWVkaWEvY29tcHJlc3MtdmlkZW8uanMiOll0LCIuL21lZGlhL2dldC1pbWFnZS1pbmZvLmpzIjpadCwiLi9tZWRpYS9nZXQtdmlkZW8taW5mby5qcyI6ZW4sIi4vbWVkaWEvcHJldmlldy1pbWFnZS5qcyI6bm4sIi4vbWVkaWEvc2F2ZS1pbWFnZS10by1waG90b3MtYWxidW0uanMiOm9uLCIuL25ldHdvcmsvZG93bmxvYWQtZmlsZS5qcyI6c24sIi4vbmV0d29yay9yZXF1ZXN0LmpzIjp2biwiLi9uZXR3b3JrL3NvY2tldC5qcyI6Ym4sIi4vbmV0d29yay91cGxvYWQtZmlsZS5qcyI6a24sIi4vcGx1Z2luL2dldC1wcm92aWRlci5qcyI6Q24sIi4vcGx1Z2luL2xvYWQtc3ViLXBhY2thZ2UuanMiOk9uLCIuL3BsdWdpbi9wcmUtbG9naW4uanMiOkFuLCIuL3JvdXRlL3JvdXRlLmpzIjpWbiwiLi9zdG9yYWdlL3N0b3JhZ2UuanMiOlluLCIuL3VpL2xvYWQtZm9udC1mYWNlLmpzIjpabiwiLi91aS9uYXZpZ2F0aW9uLWJhci5qcyI6bnIsIi4vdWkvcGFnZS1zY3JvbGwtdG8uanMiOmlyLCIuL3VpL3BvcHVwLmpzIjp1ciwiLi91aS90YWItYmFyLmpzIjpfcn0sKExuPWZ1bmN0aW9uKGUpe3JldHVybiBqbltlXXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitlKyInLiIpfSgpfSkua2V5cz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyhqbil9LExuKTtmdW5jdGlvbiBrcihlLHQsbil7dmFyIHI9dFtlXSxpPSFrKG4sZSksbz1uW2VdO2lmKC0xPGZ1bmN0aW9uKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIFRyKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoVHIodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX0oQm9vbGVhbixyLnR5cGUpJiZpJiYhayhyLCJkZWZhdWx0IikmJihvPSExKSx2b2lkIDA9PT1vJiZrKHIsImRlZmF1bHQiKSl7dmFyIGE9ci5kZWZhdWx0O289QyhhKT9hKCk6YSxuW2VdPW99cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoZS5yZXF1aXJlZCYmcilyZXR1cm4iTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgYCIrdCsiYCI7aWYobnVsbD09biYmIWUucmVxdWlyZWQpe3ZhciBvPWUudmFsaWRhdG9yO3JldHVybiBvP28obixpKTp2b2lkIDB9dmFyIGE9ZS50eXBlLHM9IWF8fCEwPT09YSxjPVtdO2lmKGEpe0FycmF5LmlzQXJyYXkoYSl8fChhPVthXSk7Zm9yKHZhciB1PTA7dTxhLmxlbmd0aCYmIXM7dSsrKXt2YXIgbD14cihuLGFbdV0pO2MucHVzaChsLmV4cGVjdGVkVHlwZXx8IiIpLHM9bC52YWxpZH19aWYoIXMpcmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0icGFyYW1ldGVyIGAiK2UrImAuIEV4cGVjdGVkICIrbi5qb2luKCIsICIpLGk9blswXSxvPXAodCksYT1Pcih0LGkpLHM9T3IodCxvKTsxPT09bi5sZW5ndGgmJklyKGkpJiYhZnVuY3Rpb24oKXt2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7Zm9yKDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiBlLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT09ZS50b0xvd2VyQ2FzZSgpfSl9KGksbykmJihyKz0iIHdpdGggdmFsdWUgIithKTtyKz0iLCBnb3QgIitvKyIgIixJcihvKSYmKHIrPSJ3aXRoIHZhbHVlICIrcysiLiIpO3JldHVybiByfSh0LG4sYyk7dmFyIGQ9ZS52YWxpZGF0b3I7aWYoZClyZXR1cm4gZChuLGkpfShyLGUsbyxpLG4pfXdyLmtleXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09iamVjdC5hc3NpZ24oYnIsd3IoZSkpfSk7dmFyIFNyPS9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87ZnVuY3Rpb24geHIoZSx0KXt2YXIgbixyPUNyKHQpO2lmKFNyLnRlc3Qocikpe3ZhciBpPXR5cGVvZiBlOyhuPWk9PT1yLnRvTG93ZXJDYXNlKCkpfHwib2JqZWN0IiE9PWl8fChuPWUgaW5zdGFuY2VvZiB0KX1lbHNlIG49MDw9ZS5ieXRlTGVuZ3RofHwoIk9iamVjdCI9PT1yP1QoZSk6IkFycmF5Ij09PXI/QXJyYXkuaXNBcnJheShlKTplIGluc3RhbmNlb2YgdHx8cChlKT09PUNyKHQpKTtyZXR1cm57dmFsaWQ6bixleHBlY3RlZFR5cGU6cn19ZnVuY3Rpb24gQ3IoZSl7dmFyIHQ9ZSYmZS50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb24gKFx3KykvKTtyZXR1cm4gdD90WzFdOiIifWZ1bmN0aW9uIFRyKGUsdCl7cmV0dXJuIENyKGUpPT09Q3IodCl9ZnVuY3Rpb24gT3IoZSx0KXtyZXR1cm4iU3RyaW5nIj09PXQ/JyInK2UrJyInOiJOdW1iZXIiPT09dD8iIitOdW1iZXIoZSk6IiIrZX12YXIgRXI9WyJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIl07ZnVuY3Rpb24gSXIodCl7cmV0dXJuIEVyLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKT09PWV9KX1mdW5jdGlvbiBBcihlLHQsbil7dmFyIHI9dCsiOmZhaWwgIitlO2lmKC0xPT09bil0aHJvdyBuZXcgRXJyb3Iocik7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBuJiZOcihuLHtlcnJNc2c6cn0pLCExfXZhciAkcj1be25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiEwfV0sUHI9WyJiZWZvcmVWYWxpZGF0ZSIsImJlZm9yZUFsbCIsImJlZm9yZVN1Y2Nlc3MiXTtmdW5jdGlvbiBNcihlLG4sdCl7dmFyIHI9YnJbZV07aWYoIXImJmllKGUpJiYocj0kcikscil7aWYoQXJyYXkuaXNBcnJheShyKSYmQXJyYXkuaXNBcnJheShuKSl7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKSxvPU9iamVjdC5jcmVhdGUobnVsbCksYT1uLmxlbmd0aDtyLmZvckVhY2goZnVuY3Rpb24oZSx0KXtpW2UubmFtZV09ZSx0PGEmJihvW2UubmFtZV09blt0XSl9KSxyPWksbj1vfWlmKEMoci5iZWZvcmVWYWxpZGF0ZSkpe3ZhciBzPXIuYmVmb3JlVmFsaWRhdGUobik7aWYocylyZXR1cm4gQXIocyxlLHQpfWZvcih2YXIgYz1PYmplY3Qua2V5cyhyKSx1PTA7dTxjLmxlbmd0aDt1KyspaWYoLTE9PT1Qci5pbmRleE9mKGNbdV0pKXt2YXIgbD1rcihjW3VdLHIsbik7aWYobClyZXR1cm4gQXIobCxlLHQpfX1yZXR1cm4hMH12YXIganI9MSxMcj17fTtmdW5jdGlvbiBCcihlLHQsbil7dm9pZCAwPT09dCYmKHQ9e30pLHZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1mdW5jdGlvbihpLG8sZSl7aWYodm9pZCAwPT09byYmKG89e30pLHZvaWQgMD09PWUmJihlPXt9KSwhVChvKSlyZXR1cm57cGFyYW1zOm99O3ZhciB0PWFlKG89T2JqZWN0LmFzc2lnbih7fSxvKSksYT10LnN1Y2Nlc3Mscz10LmZhaWwsYz10LmNhbmNlbCx1PXQuY29tcGxldGUsbD1DKGEpLGQ9QyhzKSxmPUMoYykscD1DKHUpO2lmKCEobHx8ZHx8Znx8cCkpcmV0dXJue3BhcmFtczpvfTt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSl7dmFyIGg9ZVtyXTtDKGgpJiYobltyXT1CKGgpKX12YXIgdj1uLmJlZm9yZVN1Y2Nlc3MsZz1uLmFmdGVyU3VjY2VzcyxtPW4uYmVmb3JlRmFpbCx5PW4uYWZ0ZXJGYWlsLF89bi5iZWZvcmVDYW5jZWwsYj1uLmFmdGVyQ2FuY2VsLHc9bi5iZWZvcmVBbGwsaz1uLmFmdGVyQWxsLFM9anIrKyx4PSJhcGkuIitpKyIuIitTO3JldHVybiBMcltTXT17bmFtZTp4LGNhbGxiYWNrOmZ1bmN0aW9uKGUpe2lmKGUuZXJyTXNnPWUuZXJyTXNnfHxpKyI6b2siLC0xIT09ZS5lcnJNc2cuaW5kZXhPZigiOm9rIikpZS5lcnJNc2c9aSsiOm9rIjtlbHNlIGlmKC0xIT09ZS5lcnJNc2cuaW5kZXhPZigiOmNhbmNlbCIpKWUuZXJyTXNnPWkrIjpjYW5jZWwiO2Vsc2UgaWYoLTEhPT1lLmVyck1zZy5pbmRleE9mKCI6ZmFpbCIpKXt2YXIgdD0iIixuPWUuZXJyTXNnLmluZGV4T2YoIiAiKTstMTxuJiYodD1lLmVyck1zZy5zdWJzdHIobikpLGUuZXJyTXNnPWkrIjpmYWlsIit0fUModykmJncoZSk7dmFyIHI9ZS5lcnJNc2c7MD09PXIuaW5kZXhPZihpKyI6b2siKT8oQyh2KSYmdihlLG8pLGwmJmEoZSksQyhnKSYmZyhlKSk6MD09PXIuaW5kZXhPZihpKyI6Y2FuY2VsIik/KGUuZXJyTXNnPWUuZXJyTXNnLnJlcGxhY2UoaSsiOmNhbmNlbCIsaSsiOmZhaWwgY2FuY2VsIiksZCYmcyhlKSxDKF8pJiZfKGUpLGYmJmMoZSksQyhiKSYmYihlKSk6MD09PXIuaW5kZXhPZihpKyI6ZmFpbCIpJiYoQyhtKSYmbShlKSxkJiZzKGUpLEMoeSkmJnkoZSkpLHAmJnUoZSksQyhrKSYmayhlKX19LHtwYXJhbXM6byxjYWxsYmFja0lkOlN9fShlLHQsbiksaT1yLnBhcmFtcyxvPXIuY2FsbGJhY2tJZDtyZXR1cm4gVChpKSYmIU1yKGUsaSxvKT97cGFyYW1zOmksY2FsbGJhY2tJZDohMX06e3BhcmFtczppLGNhbGxiYWNrSWQ6b319ZnVuY3Rpb24gTnIoZSx0LG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl7dmFyIHI9THJbZV07aWYocilyZXR1cm4gci5rZWVwQWxpdmV8fGRlbGV0ZSBMcltlXSxyLmNhbGxiYWNrKHQsbil9cmV0dXJuIHR9ZnVuY3Rpb24gRHIodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoIkFQSSBgIit0KyJgIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKX19dmFyIFJyPVsiZ2V0UHVzaENsaWVudElkIiwib25QdXNoTWVzc2FnZSIsIm9mZlB1c2hNZXNzYWdlIl07ZnVuY3Rpb24gRnIoYyx1LGwpe3JldHVybiB2b2lkIDA9PT1sJiYobD17fSksLTE8UnIuaW5kZXhPZihjKXx8IUModSk/dTooZT1sLCh0PWJyW2NdKSYmKEModC5iZWZvcmVBbGwpJiYoZS5iZWZvcmVBbGw9dC5iZWZvcmVBbGwpLEModC5iZWZvcmVTdWNjZXNzKSYmKGUuYmVmb3JlU3VjY2Vzcz10LmJlZm9yZVN1Y2Nlc3MpKSxmdW5jdGlvbigpe2Zvcih2YXIgZSx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09YXJndW1lbnRzW25dO2lmKHJlKGMpKXtpZihNcihjLHQsLTEpKXJldHVybiB1LmFwcGx5KG51bGwsdCl9ZWxzZSBpZihpZShjKSl7aWYoTXIoYyx0LC0xKSlyZXR1cm4gdSgoYy5zdGFydHNXaXRoKCJvZmYiKT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBMcil7dmFyIHI9THJbbl07aWYoci5uYW1lLnN0YXJ0c1dpdGgoImFwaS4iK2UucmVwbGFjZSgvXm9mZi8sIm9uIikpJiZyLmNhbGxiYWNrPT09dClyZXR1cm4gZGVsZXRlIExyW25dLE51bWJlcihuKX1yZXR1cm4iZmFpbCJ9OmZ1bmN0aW9uKGUsdCl7dmFyIG49anIrKyxyPSJhcGkuIitlKyIuIituO3JldHVybiBMcltuXT17bmFtZTpyLGtlZXBBbGl2ZTohMCxjYWxsYmFjazp0fSxufSkoYyx0WzBdKSl9ZWxzZXt2YXIgcj17fTt0Lmxlbmd0aCYmKHI9dFswXSk7dmFyIGksbz1CcihjLHIsbCksYT1vLnBhcmFtcyxzPW8uY2FsbGJhY2tJZDtpZighMSE9PXMpcmV0dXJuKGk9QyhhKT91KHMpOnUoYSxzKSkmJihlPWMsLTE9PT1lZS5pbmRleE9mKGUpKSYmVChpPU5yKHMsaSkpJiYoaS5lcnJNc2c9aS5lcnJNc2d8fGMrIjpvayIpLGl9fSk7dmFyIGUsdH1mdW5jdGlvbiBVcihlLHQpe3JldHVybiBlKHQ9e2V4cG9ydHM6e319LHQuZXhwb3J0cyksdC5leHBvcnRzfXZhciB6cj1VcihmdW5jdGlvbihlLHQpeyFmdW5jdGlvbigpe2Zvcih2YXIgbz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsZD1uZXcgVWludDhBcnJheSgyNTYpLGU9MDtlPG8ubGVuZ3RoO2UrKylkW28uY2hhckNvZGVBdChlKV09ZTt0LmVuY29kZT1mdW5jdGlvbihlKXt2YXIgdCxuPW5ldyBVaW50OEFycmF5KGUpLHI9bi5sZW5ndGgsaT0iIjtmb3IodD0wO3Q8cjt0Kz0zKWkrPW9bblt0XT4+Ml0saSs9b1soMyZuW3RdKTw8NHxuW3QrMV0+PjRdLGkrPW9bKDE1Jm5bdCsxXSk8PDJ8blt0KzJdPj42XSxpKz1vWzYzJm5bdCsyXV07cmV0dXJuIHIlMz09Mj9pPWkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSkrIj0iOnIlMz09MSYmKGk9aS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0yKSsiPT0iKSxpfSx0LmRlY29kZT1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGE9Ljc1KmUubGVuZ3RoLHM9ZS5sZW5ndGgsYz0wOyI9Ij09PWVbZS5sZW5ndGgtMV0mJihhLS0sIj0iPT09ZVtlLmxlbmd0aC0yXSYmYS0tKTt2YXIgdT1uZXcgQXJyYXlCdWZmZXIoYSksbD1uZXcgVWludDhBcnJheSh1KTtmb3IodD0wO3Q8czt0Kz00KW49ZFtlLmNoYXJDb2RlQXQodCldLHI9ZFtlLmNoYXJDb2RlQXQodCsxKV0saT1kW2UuY2hhckNvZGVBdCh0KzIpXSxvPWRbZS5jaGFyQ29kZUF0KHQrMyldLGxbYysrXT1uPDwyfHI+PjQsbFtjKytdPSgxNSZyKTw8NHxpPj4yLGxbYysrXT0oMyZpKTw8Nnw2MyZvO3JldHVybiB1fX0oKX0pLFZyPXpyLmVuY29kZSxxcj16ci5kZWNvZGU7dmFyIFdyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGJhc2U2NFRvQXJyYXlCdWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHFyKGUpfSxhcnJheUJ1ZmZlclRvQmFzZTY0OmZ1bmN0aW9uKGUpe3JldHVybiBWcihlKX19KSxIcj17fTt2YXIgR3I9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2FuSVVzZTpmdW5jdGlvbihlKXtyZXR1cm4gayhIcixlKT9IcltlXTohIWsoY3YsZSl9fSksWHI9e3Byb21pc2VJbnRlcmNlcHRvcjpZfSxKcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxpbnRlcmNlcHRvcnM6WHIsYWRkSW50ZXJjZXB0b3I6ZnVuY3Rpb24oZSx0KXsic3RyaW5nIj09dHlwZW9mIGUmJlQodCk/VShGW2VdfHwoRltlXT17fSksdCk6VChlKSYmVShSLGUpfSxyZW1vdmVJbnRlcmNlcHRvcjpmdW5jdGlvbihlLHQpeyJzdHJpbmciPT10eXBlb2YgZT9UKHQpP3ooRltlXSx0KTpkZWxldGUgRltlXTpUKGUpJiZ6KFIsZSl9fSksWXI9ITEsS3I9MCxacj0wO2Z1bmN0aW9uIFFyKGUsdCl7cmV0dXJuIGU9TnVtYmVyKGUpLGlzTmFOKGUpP3Q6ZX12YXIgZWk9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXB4MnB4OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG87aWYoMD09PUtyJiYobj1wZy5nZXRTeXN0ZW1JbmZvU3luYygpLHI9bi5wbGF0Zm9ybSxpPW4ucGl4ZWxSYXRpbyxvPW4ud2luZG93V2lkdGgsS3I9byxacj1pLFlyPSJpb3MiPT09ciksMD09PShlPU51bWJlcihlKSkpcmV0dXJuIDA7dmFyIGE9ZGcuZ2xvYmFsU3R5bGV8fGRnLndpbmRvd3x8e30scz1RcihhLnJweENhbGNNYXhEZXZpY2VXaWR0aCw5NjApLGM9UXIoYS5ycHhDYWxjQmFzZURldmljZVdpZHRoLDM3NSksdT1RcihhLnJweENhbGNJbmNsdWRlV2lkdGgsNzUwKSxsPXR8fEtyLGQ9ZS83NTAqKGw9ZT09PXV8fGw8PXM/bDpjKTtyZXR1cm4gZDwwJiYoZD0tZCksMD09PShkPU1hdGguZmxvb3IoZCsxZS00KSkmJihkPTEhPT1aciYmWXI/LjU6MSksZTwwPy1kOmR9fSk7ZnVuY3Rpb24gdGkoZSx0LG4scil7YWcucHVibGlzaEhhbmRsZXIodCsiLWF1ZGlvLSIrZSx7YXVkaW9JZDplLHR5cGU6bixkYXRhOnJ9LHQpfXZhciBuaT1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VJZD10fTtuaS5wcm90b3R5cGUuc2V0U3JjPWZ1bmN0aW9uKGUpe3RpKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNldFNyYyIse3NyYzplfSl9LG5pLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicGxheSIpfSxuaS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aSh0aGlzLmlkLHRoaXMucGFnZUlkLCJwYXVzZSIpfSxuaS5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbihlKXt0aSh0aGlzLmlkLHRoaXMucGFnZUlkLCJzZWVrIix7cG9zaXRpb246ZX0pfTt2YXIgcmk9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlQXVkaW9Db250ZXh0OmZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gbmV3IG5pKGUsdC4kcGFnZS5pZCk7dmFyIG49aGcoKTtpZihuLiRyb3V0ZSYmbi4kcm91dGUucGFyYW1zLl9faWRfXylyZXR1cm4gbmV3IG5pKGUsbi4kcm91dGUucGFyYW1zLl9faWRfXyk7YWcuZW1pdCgib25FcnJvciIsImNyZWF0ZUF1ZGlvQ29udGV4dDpmYWlsIil9fSksaWk9bmV3IHJnO2Z1bmN0aW9uIG9pKGUsdCxuKXtyZXR1cm4gZVt0XS5hcHBseShlLG4pfWZ1bmN0aW9uIGFpKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKTtlLS07KXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBvaShpaSwiJG9uIixbXS5jb25jYXQodCkpfWZ1bmN0aW9uIHNpKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKTtlLS07KXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBvaShpaSwiJG9mZiIsW10uY29uY2F0KHQpKX1mdW5jdGlvbiBjaSgpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSk7ZS0tOyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gb2koaWksIiRvbmNlIixbXS5jb25jYXQodCkpfWZ1bmN0aW9uIHVpKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKTtlLS07KXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBvaShpaSwiJGVtaXQiLFtdLmNvbmNhdCh0KSl9dmFyIGxpLGRpPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLCRvbjphaSwkb2ZmOnNpLCRvbmNlOmNpLCRlbWl0OnVpfSk7ZnVuY3Rpb24gZmkoKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIGFnLmludm9rZUNhbGxiYWNrSGFuZGxlci5hcHBseShhZyxlKX1mdW5jdGlvbiBwaShlKXtyZXR1cm4gcGcucmVxdWlyZU5hdGl2ZVBsdWdpbihlKX1mdW5jdGlvbiBoaShlKXtmb3IodmFyIHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoLTE7MDxuLS07KXRbbl09YXJndW1lbnRzW24rMV07cmV0dXJuIGFnLmVtaXQuYXBwbHkoYWcsWyJhcGkuIitlXS5jb25jYXQodCkpfXZhciB2aT1vZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGU7ZnVuY3Rpb24gZ2koZSl7dmkobGk9ZSl9ZnVuY3Rpb24gbWkoZSl7aWYoIWUpe3ZhciB0PXZnKCk7aWYoIXQubGVuZ3RoKXJldHVybjtpZighKGU9dFt0Lmxlbmd0aC0xXS4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlKXx8ZT09PWxpKXJldHVybn1lIT09bGkmJihsaT1lLG9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShlKSl9ZnVuY3Rpb24geWkodCl7aWYodm9pZCAwPT09dCYmKHQ9IiIpLCFkZy50YWJCYXJ8fCFBcnJheS5pc0FycmF5KGRnLnRhYkJhci5saXN0KSlyZXR1cm4hMTt0cnl7aWYoIXQpe3ZhciBlPXZnKCk7aWYoIWUubGVuZ3RoKXJldHVybiExO3ZhciBuPWVbZS5sZW5ndGgtMV07cmV0dXJuISFuJiZuLiRwYWdlLm1ldGEuaXNUYWJCYXJ9L15cLy8udGVzdCh0KXx8KHQ9Ii8iK3QpO3ZhciByPWZnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PXR9KTtyZXR1cm4gciYmci5tZXRhLmlzVGFiQmFyfWNhdGNoKGUpe31yZXR1cm4hMX1mdW5jdGlvbiBfaShlKXtyZXR1cm4gcXIoZSl9ZnVuY3Rpb24gYmkoZSl7cmV0dXJuIFZyKGUpfWZ1bmN0aW9uIHdpKGUsdCxuLHIpe3ZhciBpPWUodCk7cmV0dXJuIGkmJmkuZXJyTXNnJiYoaS5lcnJNc2c9aS5lcnJNc2cucmVwbGFjZShuLHIpKSxpfWZ1bmN0aW9uIGtpKGUpe3JldHVybiBlP2UuJGdldEFwcFdlYnZpZXcoKTpTaSgpfWZ1bmN0aW9uIFNpKCl7dHJ5e3ZhciBlPXZnKCk7aWYoZS5sZW5ndGgpcmV0dXJuIGVbZS5sZW5ndGgtMV0uJGdldEFwcFdlYnZpZXcoKX1jYXRjaChlKXt9fW9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT1naTt2YXIgeGk9ZnVuY3Rpb24oZSx0KXtpZigwPT09dC5pbmRleE9mKCIuLyIpKXJldHVybiB4aShlLHQuc3Vic3RyKDIpKTt2YXIgbixyLGk9dC5zcGxpdCgiLyIpO2ZvcihuPTAscj1pLmxlbmd0aDtuPHImJiIuLiI9PT1pW25dO24rKyk7aS5zcGxpY2UoMCxuKSx0PWkuam9pbigiLyIpO3ZhciBvPTA8ZS5sZW5ndGg/ZS5zcGxpdCgiLyIpOltdO3JldHVybiBvLnNwbGljZShvLmxlbmd0aC1uLTEsbisxKSxvLmNvbmNhdChpKS5qb2luKCIvIil9LENpPWZ1bmN0aW9uKGUpe3JldHVybiBvZy5pby5jb252ZXJ0TG9jYWxGaWxlU3lzdGVtVVJMKGUpLnJlcGxhY2UoL15cLz9hcHBzXC8vLCIvYW5kcm9pZF9hc3NldC9hcHBzLyIpLnJlcGxhY2UoL1wvJC8sIiIpfTtmdW5jdGlvbiBUaShlKXtpZigwPT09ZS5pbmRleE9mKCIvLyIpKXJldHVybiJodHRwczoiK2U7aWYoL14oW2Etei1dKzopP1wvXC8vaS50ZXN0KGUpfHwvXmRhdGE6LiosLiovLnRlc3QoZSkpcmV0dXJuIGU7aWYoMD09PWUuaW5kZXhPZigiX3d3dyIpfHwwPT09ZS5pbmRleE9mKCJfZG9jIil8fDA9PT1lLmluZGV4T2YoIl9kb2N1bWVudHMiKXx8MD09PWUuaW5kZXhPZigiX2Rvd25sb2FkcyIpKXJldHVybiJmaWxlOi8vIitDaShlKTt2YXIgdD0iZmlsZTovLyIrQ2koIl93d3ciKTtpZigwPT09ZS5pbmRleE9mKCIvIikpcmV0dXJuIGUuc3RhcnRzV2l0aCgiL3N0b3JhZ2UvIil8fGUuc3RhcnRzV2l0aCgiL3NkY2FyZC8iKXx8ZS5pbmNsdWRlcygiL0NvbnRhaW5lcnMvRGF0YS9BcHBsaWNhdGlvbi8iKT8iZmlsZTovLyIrZTp0K2U7aWYoMD09PWUuaW5kZXhPZigiLi4vIil8fDA9PT1lLmluZGV4T2YoIi4vIikpe2lmKCJzdHJpbmciPT10eXBlb2YgX19pZF9fKXJldHVybiB0K3hpKCIvIitfX2lkX18sZSk7dmFyIG49dmcoKTtpZihuLmxlbmd0aClyZXR1cm4gdCt4aSgiLyIrbltuLmxlbmd0aC0xXS5yb3V0ZSxlKX1yZXR1cm4gZX12YXIgT2k9My4xNDE1OTI2NTM1ODk3OTMsRWk9NjM3ODI0NSxJaT0uMDA2NjkzNDIxNjIyOTY1OTQzO3ZhciBBaT1mdW5jdGlvbihlLHQpe3ZhciBuPTIqZS0xMDArMyp0Ky4yKnQqdCsuMSplKnQrLjIqTWF0aC5zcXJ0KE1hdGguYWJzKGUpKTtyZXR1cm4gbis9MiooMjAqTWF0aC5zaW4oNiplKk9pKSsyMCpNYXRoLnNpbigyKmUqT2kpKS8zLG4rPTIqKDIwKk1hdGguc2luKHQqT2kpKzQwKk1hdGguc2luKHQvMypPaSkpLzMsbis9MiooMTYwKk1hdGguc2luKHQvMTIqT2kpKzMyMCpNYXRoLnNpbih0Kk9pLzMwKSkvM30sJGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj0zMDArZSsyKnQrLjEqZSplKy4xKmUqdCsuMSpNYXRoLnNxcnQoTWF0aC5hYnMoZSkpO3JldHVybiBuKz0yKigyMCpNYXRoLnNpbig2KmUqT2kpKzIwKk1hdGguc2luKDIqZSpPaSkpLzMsbis9MiooMjAqTWF0aC5zaW4oZSpPaSkrNDAqTWF0aC5zaW4oZS8zKk9pKSkvMyxuKz0yKigxNTAqTWF0aC5zaW4oZS8xMipPaSkrMzAwKk1hdGguc2luKGUvMzAqT2kpKS8zfSxQaT1mdW5jdGlvbihlLHQpe3JldHVybiBlPDcyLjAwNHx8MTM3LjgzNDc8ZXx8dDwuODI5M3x8NTUuODI3MTx0fHwhMX07ZnVuY3Rpb24gTWkoZSxuKXtyZXR1cm4gZnVuY3Rpb24odCl7b2dbZV1bbl0oZnVuY3Rpb24oZSl7ZSYmKGRlbGV0ZSBlLmNvZGUsZGVsZXRlIGUubWVzc2FnZSksZmkodCxlKX0pfX1mdW5jdGlvbiBqaSh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtlPWV8fHt9LGZpKHQsT2JqZWN0LmFzc2lnbih7fSxlLHtlcnJNc2c6bisiOm9rIn0pKX19ZnVuY3Rpb24gTGkoYSxzLGMpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD0oZT1lfHx7fSkuY29kZTt2b2lkIDA9PT10JiYodD0wKTt2YXIgbj1lLm1lc3NhZ2Uscj17fTtmb3IodmFyIGkgaW4gZSktMT09PVsiY29kZSIsIm1lc3NhZ2UiXS5pbmRleE9mKGkpJiYocltpXT1lW2ldKTt2YXIgbz1yO2ZpKGEsT2JqZWN0LmFzc2lnbih7fSx7ZXJyTXNnOnMrIjpmYWlsICIrKG58fGN8fCIiKSxlcnJDb2RlOnQsY29kZTp0fSxvKSl9fWZ1bmN0aW9uIEJpKG4scixpLG8pe3JldHVybiBmdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoZT1pKGUpKSxvZ1tuXVtyXShPYmplY3QuYXNzaWduKGUse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pLGRlbGV0ZSBlLmNvZGUsZGVsZXRlIGUubWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmKGU9byhlKSksZmkodCxPYmplY3QuYXNzaWduKHt9LGUse2Vyck1zZzpyKyI6b2sifSkpfSxmYWlsOkxpKHQscil9KSl9fWZ1bmN0aW9uIE5pKGUpe3ZhciB0PWUuc3BsaXQoIi8iKTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX12YXIgRGksUmk9InBsYXliYWNrIixGaT17fSxVaT1bInBsYXkiLCJjYW5wbGF5IiwiZW5kZWQiLCJzdG9wIiwid2FpdGluZyIsInNlZWtpbmciLCJzZWVrZWQiLCJwYXVzZSJdLHppPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxoaSgib25BdWRpb1N0YXRlQ2hhbmdlIixPYmplY3QuYXNzaWduKHtzdGF0ZTplfSx0KSl9O3ZhciBWaT1udWxsLHFpPTI1MCxXaT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksaGkoIm9uQmFja2dyb3VuZEF1ZGlvU3RhdGVDaGFuZ2UiLE9iamVjdC5hc3NpZ24oe3N0YXRlOmV9LHQpKX0sSGk9WyJwbGF5IiwicGF1c2UiLCJlbmRlZCIsInN0b3AiLCJjYW5wbGF5Il07ZnVuY3Rpb24gR2koKXtEaXx8KChEaT1vZy5hdWRpby5jcmVhdGVQbGF5ZXIoe2F1dG9wbGF5OiEwLGJhY2tncm91bmRDb250cm9sOiEwfSkpLnNyYz1EaS50aXRsZT1EaS5lcG5hbWU9RGkuc2luZ2VyPURpLmNvdmVySW1nVXJsPURpLndlYlVybD0iIixEaS5zdGFydFRpbWU9MCxIaS5mb3JFYWNoKGZ1bmN0aW9uKHQpe0RpLmFkZEV2ZW50TGlzdGVuZXIodCxmdW5jdGlvbigpeyJwbGF5Ij09PXQ/KERpLmlzU3RvcHBlZD0hMSxYaSgpLFdpKCJ0aW1lVXBkYXRlIix7fSksVmk9dWcoZnVuY3Rpb24oKXtXaSgidGltZVVwZGF0ZSIse30pfSxxaSkpOiJzdG9wIj09PXQmJihEaS5pc1N0b3BwZWQ9ITApLCJwYXVzZSIhPT10JiYiZW5kZWQiIT09dCYmInN0b3AiIT09dHx8WGkoKTt2YXIgZT0ib25NdXNpYyIrKHRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKSk7aGkoZSx7ZGF0YVVybDpEaS5zcmMsZXJyTXNnOmUrIjpvayJ9KSxXaSh0LHtkYXRhVXJsOkRpLnNyY30pfSl9KSxEaS5hZGRFdmVudExpc3RlbmVyKCJ3YWl0aW5nIixmdW5jdGlvbigpe1hpKCksV2koIndhaXRpbmciLHtkYXRhVXJsOkRpLnNyY30pfSksRGkuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGUpe1hpKCksaGkoIm9uTXVzaWNFcnJvciIse2RhdGFVcmw6RGkuc3JjLGVyck1zZzoiRXJyb3I6IitlLm1lc3NhZ2V9KSxXaSgiZXJyb3IiLHtkYXRhVXJsOkRpLnNyYyxlcnJNc2c6ZS5tZXNzYWdlLGVyckNvZGU6ZS5jb2RlfSl9KSxEaS5hZGRFdmVudExpc3RlbmVyKCJwcmV2IixmdW5jdGlvbigpe3JldHVybiBoaSgib25CYWNrZ3JvdW5kQXVkaW9QcmV2Iil9KSxEaS5hZGRFdmVudExpc3RlbmVyKCJuZXh0IixmdW5jdGlvbigpe3JldHVybiBoaSgib25CYWNrZ3JvdW5kQXVkaW9OZXh0Iil9KSl9ZnVuY3Rpb24gWGkoKXtudWxsIT09VmkmJmxnKFZpKX1mdW5jdGlvbiBKaShuLGUpe0dpKCk7dmFyIHI9WyJzcmMiLCJzdGFydFRpbWUiLCJjb3ZlckltZ1VybCIsIndlYlVybCIsInNpbmdlciIsImVwbmFtZSIsInRpdGxlIl07aWYoZSYmInBsYXliYWNrUmF0ZSI9PT1lKXt2YXIgdD1uW2VdO0RpLnBsYXliYWNrUmF0ZSYmRGkucGxheWJhY2tSYXRlKHBhcnNlRmxvYXQodCkpfWVsc2V7dmFyIGk9e307T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXtpZigwPD1yLmluZGV4T2YoZSkpe3ZhciB0PW5bZV07ZT09PXJbMF0mJnQmJih0PVRpKHQpKSxEaVtlXT1pW2VdPXR9fSksRGkuc2V0U3R5bGVzKGkpfX1mdW5jdGlvbiBZaSgpe3JldHVybiBEaX1mdW5jdGlvbiBLaShlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLmRhdGFVcmwscj1lLnBvc2l0aW9uLGk9ZS5hcGk7dm9pZCAwPT09aSYmKGk9Im9wZXJhdGVNdXNpY1BsYXllciIpO3ZhciBvPWUudGl0bGUsYT1lLmNvdmVySW1nVXJsLHM9WWkoKTtyZXR1cm4gMDxbInJlc3VtZSIsInBhdXNlIiwic3RvcCJdLmluZGV4T2YodCk/cyYmc1t0XSgpOiJwbGF5Ij09PXQ/KEppKHtzcmM6bixzdGFydFRpbWU6cix0aXRsZTpvLGNvdmVySW1nVXJsOmF9KSxzLnBsYXkoKSk6InNlZWsiPT09dCYmcyYmcy5zZWVrVG8ocikse2Vyck1zZzppKyI6b2sifX12YXIgWmk9InN1Y2Nlc3MiLFFpPSJmYWlsIixlbz1bWmksUWksImNvbXBsZXRlIl07ZnVuY3Rpb24gdG8oZSx0LG4scil7aWYoZSl7aWYodm9pZCAwPT09bilyZXR1cm4gZVt0XSgpO3ZhciBpPWlvKG4scilbMV07cmV0dXJuIE9iamVjdC5rZXlzKGkpLmxlbmd0aD9lW3RdKG9vKHQsaSkpOmVbdF0oKX19ZnVuY3Rpb24gbm8oZSx0LG4scil7aWYoZSl7dmFyIGk9aW8obixyKSxvPWlbMF0sYT1pWzFdO3JldHVybiBPYmplY3Qua2V5cyhhKS5sZW5ndGg/ZVt0XShvLG9vKHQsYSkpOmVbdF0obyl9fWZ1bmN0aW9uIHJvKGUsdCl7dmFyIG49ZnVuY3Rpb24gZSh0LG4pe2lmKCF0fHwhbilyZXR1cm47aWYobi5hdHRyJiZuLmF0dHIuaWQ9PT10KXJldHVybiBuO3ZhciByPW4uY2hpbGRyZW47aWYoIXIpcmV0dXJuO2Zvcih2YXIgaT0wLG89ci5sZW5ndGg7aTxvO2krKyl7dmFyIGE9ZSh0LHJbaV0pO2lmKGEpcmV0dXJuIGF9fShlLHQuJGVsKTtyZXR1cm4gbnx8Y29uc29sZS5lcnJvcigiQ2FuIG5vdCBmaW5kIGAiK2UrImAiKX1mdW5jdGlvbiBpbyhuLGUpe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpLHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTtDKHQpJiYocltlXT10LGRlbGV0ZSBuW2VdKX07cmV0dXJuIGVvLmZvckVhY2godCksZSYmZS5mb3JFYWNoKHQpLFtuLHJdfWZ1bmN0aW9uIG9vKGksbyl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZTtkZWxldGUgZS50eXBlO3ZhciBuPW9bdF07aWYodD09PVppP2UuZXJyTXNnPWkrIjpvayI6dD09PVFpJiYoZS5lcnJNc2c9aSsiOmZhaWwiKyhlLm1zZz8iICIrZS5tc2c6IiIpKSxkZWxldGUgZS5jb2RlLGRlbGV0ZSBlLm1zZyxDKG4pJiZuKGUpLHQ9PT1aaXx8dD09PVFpKXt2YXIgcj1vLmNvbXBsZXRlO0MocikmJnIoZSl9fX12YXIgYW89e2dldENlbnRlckxvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRvKGUsImdldENlbnRlckxvY2F0aW9uIix0KX0sbW92ZVRvTG9jYXRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwibW92ZVRvTG9jYXRpb24iLHQpfSx0cmFuc2xhdGVNYXJrZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwidHJhbnNsYXRlTWFya2VyIix0LFsiYW5pbWF0aW9uRW5kIl0pfSxpbmNsdWRlUG9pbnRzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsImluY2x1ZGVQb2ludHMiLHQpfSxnZXRSZWdpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdG8oZSwiZ2V0UmVnaW9uIix0KX0sZ2V0U2NhbGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdG8oZSwiZ2V0U2NhbGUiLHQpfSxhZGRDdXN0b21MYXllcjpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJhZGRDdXN0b21MYXllciIsdCl9LHJlbW92ZUN1c3RvbUxheWVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsInJlbW92ZUN1c3RvbUxheWVyIix0KX0sYWRkR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJhZGRHcm91bmRPdmVybGF5Iix0KX0scmVtb3ZlR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJyZW1vdmVHcm91bmRPdmVybGF5Iix0KX0sdXBkYXRlR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJ1cGRhdGVHcm91bmRPdmVybGF5Iix0KX0saW5pdE1hcmtlckNsdXN0ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwiaW5pdE1hcmtlckNsdXN0ZXIiLHQpfSxhZGRNYXJrZXJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsImFkZE1hcmtlcnMiLHQpfSxyZW1vdmVNYXJrZXJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsInJlbW92ZU1hcmtlcnMiLHQpfSxtb3ZlQWxvbmc6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwibW92ZUFsb25nIix0KX0sc2V0TG9jTWFya2VySWNvbjpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJzZXRMb2NNYXJrZXJJY29uIix0KX0sb3Blbk1hcEFwcDpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJvcGVuTWFwQXBwIix0KX0sb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5vbih0Lm5hbWUsdC5jYWxsYmFjayl9fTt2YXIgc289e3BsYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKGUsInBsYXkiKX0scGF1c2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKGUsInBhdXNlIil9LHNlZWs6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwic2VlayIsdC5wb3NpdGlvbil9LHN0b3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKGUsInN0b3AiKX0sc2VuZERhbm11OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsInNlbmREYW5tdSIsdCl9LHBsYXliYWNrUmF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJwbGF5YmFja1JhdGUiLHQucmF0ZSl9LHJlcXVlc3RGdWxsU2NyZWVuOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsInJlcXVlc3RGdWxsU2NyZWVuIix0KX0sZXhpdEZ1bGxTY3JlZW46ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKGUsImV4aXRGdWxsU2NyZWVuIil9LHNob3dTdGF0dXNCYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKGUsInNob3dTdGF0dXNCYXIiKX0saGlkZVN0YXR1c0JhcjpmdW5jdGlvbihlKXtyZXR1cm4gdG8oZSwiaGlkZVN0YXR1c0JhciIpfX07dmFyIGNvPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuY3R4PXR9O2Z1bmN0aW9uIHVvKGUsdCxuLHIpe3ZhciBpPXQuJHBhZ2UuaWQ7YWcucHVibGlzaEhhbmRsZXIoaSsiLWxpdmVwdXNoZXItIitlLHtsaXZlUHVzaGVySWQ6ZSx0eXBlOm4sZGF0YTpyfSxpKX1jby5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJzdGFydCIsZSl9LGNvLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic3RvcCIsZSl9LGNvLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbihlKXtyZXR1cm4gdG8odGhpcy5jdHgsInBhdXNlIixlKX0sY28ucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbihlKXtyZXR1cm4gdG8odGhpcy5jdHgsInJlc3VtZSIsZSl9LGNvLnByb3RvdHlwZS5zd2l0Y2hDYW1lcmE9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJzd2l0Y2hDYW1lcmEiLGUpfSxjby5wcm90b3R5cGUuc25hcHNob3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJzbmFwc2hvdCIsZSl9LGNvLnByb3RvdHlwZS50b2dnbGVUb3JjaD1mdW5jdGlvbihlKXtyZXR1cm4gdG8odGhpcy5jdHgsInRvZ2dsZVRvcmNoIixlKX0sY28ucHJvdG90eXBlLnBsYXlCR009ZnVuY3Rpb24oZSl7cmV0dXJuIG5vKHRoaXMuY3R4LCJwbGF5QkdNIixlKX0sY28ucHJvdG90eXBlLnN0b3BCR009ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJzdG9wQkdNIixlKX0sY28ucHJvdG90eXBlLnBhdXNlQkdNPWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwicGF1c2VCR00iLGUpfSxjby5wcm90b3R5cGUucmVzdW1lQkdNPWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwicmVzdW1lQkdNIixlKX0sY28ucHJvdG90eXBlLnNldEJHTVZvbHVtZT1mdW5jdGlvbihlKXtyZXR1cm4gbm8odGhpcy5jdHgsInNldEJHTVZvbHVtZSIsZSl9LGNvLnByb3RvdHlwZS5zdGFydFByZXZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJzdGFydFByZXZpZXciLGUpfSxjby5wcm90b3R5cGUuc3RvcFByZXZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJzdG9wUHJldmlldyIsZSl9LGFnLnN1YnNjcmliZSgib25MaXZlUHVzaGVyTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YTtNLmludm9rZSh0LG4pfSk7dmFyIGxvPXtzdGFydFByZXZpZXc6InByZXZpZXciLHN0b3BQcmV2aWV3OiJzdG9wIn0sZm89ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlVm09dH07Zm8ucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCl7dW8odGhpcy5pZCx0aGlzLnBhZ2VWbSwib24iLHtuYW1lOmUsY2FsbGJhY2s6dH0pfSxbInN0YXJ0Iiwic3RvcCIsInBhdXNlIiwicmVzdW1lIiwic3dpdGNoQ2FtZXJhIiwic3RhcnRQcmV2aWV3Iiwic3RvcFByZXZpZXciLCJzbmFwc2hvdCJdLmZvckVhY2goZnVuY3Rpb24ocil7Zm8ucHJvdG90eXBlW3JdPU0ud2FycChmdW5jdGlvbihlLHQpe2UuY2FsbGJhY2tJZD10O3ZhciBuPWxvW3JdP2xvW3JdOnI7dW8odGhpcy5pZCx0aGlzLnBhZ2VWbSxuLGUpfSl9KTt2YXIgcG8saG89MjAwLHZvPVsidW5rbm93biIsIm5vbmUiLCJldGhlcm5ldCIsIndpZmkiLCIyZyIsIjNnIiwiNGciLCI1ZyJdLGdvPSJfX1VOSUFQUF9NQVAiLG1vPSJfZG9jL3VuaWFwcF90ZW1wIix5bz1tbysiXyIrRGF0ZS5ub3coKSxfbz1bXTtmdW5jdGlvbiBibyhlLHQpe3BvPXBvfHxvZy5hY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uKGZ1bmN0aW9uKHQpe19vLmZvckVhY2goZnVuY3Rpb24oZSl7ZmkoZSx7eDp0LnhBeGlzLHk6dC55QXhpcyx6OnQuekF4aXN9KX0pfSxmdW5jdGlvbihlKXtwbz1udWxsLGZpKHQse2Vyck1zZzoic3RhcnRBY2NlbGVyb21ldGVyOmZhaWwgIitlLm1lc3NhZ2V9KX0se2ZyZXF1ZW5jeTpob30pLHNnKGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJzdGFydEFjY2VsZXJvbWV0ZXI6b2sifSl9LGhvKX1mdW5jdGlvbiB3bygpe3JldHVybiBwbyYmKG9nLmFjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaChwbykscG89bnVsbCkse319dmFyIGtvPXtuYW1lOntnaXZlbk5hbWU6ImZpcnN0TmFtZSIsbWlkZGxlTmFtZToibWlkZGxlTmFtZSIsZmFtaWx5TmFtZToibGFzdE5hbWUifSxuaWNrbmFtZToibmlja05hbWUiLHBob3Rvczp7dHlwZToidXJsIix2YWx1ZToicGhvdG9GaWxlUGF0aCJ9LG5vdGU6InJlbWFyayIscGhvbmVOdW1iZXJzOlt7dHlwZToibW9iaWxlIix2YWx1ZToibW9iaWxlUGhvbmVOdW1iZXIifSx7dHlwZToid29yayIsdmFsdWU6IndvcmtQaG9uZU51bWJlciJ9LHt0eXBlOiJjb21wYW55Iix2YWx1ZToiaG9zdE51bWJlciJ9LHt0eXBlOiJob21lIGZheCIsdmFsdWU6ImhvbWVGYXhOdW1iZXIifSx7dHlwZToid29yayBmYXgiLHZhbHVlOiJ3b3JrRmF4TnVtYmVyIn1dLGVtYWlsczpbe3R5cGU6ImhvbWUiLHZhbHVlOiJlbWFpbCJ9XSx1cmxzOlt7dHlwZToib3RoZXIiLHZhbHVlOiJ1cmwifV0sb3JnYW5pemF0aW9uczpbe3R5cGU6ImNvbXBhbnkiLG5hbWU6Im9yZ2FuaXphdGlvbiIsdGl0bGU6InRpdGxlIn1dLGltczpbe3R5cGU6Im90aGVyIix2YWx1ZToid2VDaGF0TnVtYmVyIn1dLGFkZHJlc3Nlczpbe3R5cGU6Im90aGVyIixwcmVmZXJyZWQ6ITAsY291bnRyeToiYWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoiYWRkcmVzc1N0YXRlIixsb2NhbGl0eToiYWRkcmVzc0NpdHkiLHN0cmVldEFkZHJlc3M6ImFkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6ImFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImhvbWUiLGNvdW50cnk6ImhvbWVBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJob21lQWRkcmVzc1N0YXRlIixsb2NhbGl0eToiaG9tZUFkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJob21lQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToiaG9tZUFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImNvbXBhbnkiLGNvdW50cnk6IndvcmtBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJ3b3JrQWRkcmVzc1N0YXRlIixsb2NhbGl0eToid29ya0FkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJ3b3JrQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToid29ya0FkZHJlc3NQb3N0YWxDb2RlIn1dfSxTbz1bInR5cGUiLCJwcmVmZXJyZWQiXTt2YXIgeG89TWkoImJsdWV0b290aCIsIm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQiKSxDbz1NaSgiYmx1ZXRvb3RoIiwib25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UiKSxUbz1NaSgiYmx1ZXRvb3RoIiwib25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UiKSxPbz1NaSgiYmx1ZXRvb3RoIiwib25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIik7ZnVuY3Rpb24gRW8oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuZGV2aWNlSWQ7dCYmKGUuZGV2aWNlSWQ9dC50b1VwcGVyQ2FzZSgpKTt2YXIgbj1lLnNlcnZpY2VJZDtyZXR1cm4gbiYmKGUuc2VydmljZUlkPW4udG9VcHBlckNhc2UoKSksZX12YXIgSW8sQW89QmkoImJsdWV0b290aCIsIm9wZW5CbHVldG9vdGhBZGFwdGVyIiksJG89QmkoImJsdWV0b290aCIsImNsb3NlQmx1ZXRvb3RoQWRhcHRlciIpLFBvPUJpKCJibHVldG9vdGgiLCJnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGUiKSxNbz1CaSgiYmx1ZXRvb3RoIiwic3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IixFbyksam89QmkoImJsdWV0b290aCIsInN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IiksTG89QmkoImJsdWV0b290aCIsImdldEJsdWV0b290aERldmljZXMiKSxCbz1CaSgiYmx1ZXRvb3RoIiwiZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcyIsRW8pLE5vPUJpKCJibHVldG9vdGgiLCJjcmVhdGVCTEVDb25uZWN0aW9uIixFbyksRG89QmkoImJsdWV0b290aCIsImNsb3NlQkxFQ29ubmVjdGlvbiIsRW8pLFJvPUJpKCJibHVldG9vdGgiLCJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsRW8pLEZvPUJpKCJibHVldG9vdGgiLCJnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3MiLEVvKSxVbz1CaSgiYmx1ZXRvb3RoIiwibm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsRW8pLHpvPUJpKCJibHVldG9vdGgiLCJyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIsRW8pLFZvPUJpKCJibHVldG9vdGgiLCJ3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLEVvKSxxbz1CaSgiYmx1ZXRvb3RoIiwic2V0QkxFTVRVIixFbyksV289QmkoImJsdWV0b290aCIsImdldEJMRURldmljZVJTU0kiLEVvKTt2YXIgSG89W107ZnVuY3Rpb24gR28oZSx0KXtJbz1Jb3x8b2cub3JpZW50YXRpb24ud2F0Y2hPcmllbnRhdGlvbihmdW5jdGlvbih0KXtIby5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUse2RpcmVjdGlvbjp0Lm1hZ25ldGljSGVhZGluZ30pfSl9LGZ1bmN0aW9uKGUpe0lvPW51bGwsZmkodCx7ZXJyTXNnOiJzdGFydENvbXBhc3M6ZmFpbCAiK2UubWVzc2FnZX0pfSx7ZnJlcXVlbmN5OmhvfSksc2coZnVuY3Rpb24oKXtmaSh0LHtlcnJNc2c6InN0YXJ0Q29tcGFzczpvayJ9KX0saG8pfWZ1bmN0aW9uIFhvKCl7cmV0dXJuIElvJiYob2cub3JpZW50YXRpb24uY2xlYXJXYXRjaChJbyksSW89bnVsbCkse319dmFyIEpvPU1pKCJpYmVhY29uIiwib25CZWFjb25VcGRhdGUiKSxZbz1NaSgiaWJlYWNvbiIsIm9uQmVhY29uU2VydmljZUNoYW5nZSIpLEtvPUJpKCJpYmVhY29uIiwiZ2V0QmVhY29ucyIpLFpvPUJpKCJpYmVhY29uIiwic3RhcnRCZWFjb25EaXNjb3ZlcnkiKSxRbz1CaSgiaWJlYWNvbiIsInN0b3BCZWFjb25EaXNjb3ZlcnkiKTt2YXIgZWE9IkFuZHJvaWQiPT09b2cub3MubmFtZSYmcGFyc2VJbnQob2cub3MudmVyc2lvbik8Nix0YT1lYT8ic2xpZGUtaW4tcmlnaHQiOiJwb3AtaW4iLG5hPTMwMCxyYT1lYT8ic2xpZGUtb3V0LXJpZ2h0IjoicG9wLW91dCIsaWE9NTAsb2E9Il93d3cvX191bmlhcHB2aWV3Lmh0bWwiLGFhPSJmIixzYT0iaSIsY2E9ImUiLHVhPSJ2LXNob3ciLGxhPSJjIixkYT0icyIsZmE9InNjIixwYT17fSxoYT0iV0VCX0lOVk9LRV9BUFBTRVJWSUNFIjtmdW5jdGlvbiB2YShlLHQpe2lmKGU9PT1oYSlyZXR1cm4gaGkoaGEsdC5kYXRhLHQud2Vidmlld0lkcyksITA7dmFyIG49cGFbZV07cmV0dXJuISFuJiYobih0KSxuLmtlZXBBbGl2ZXx8ZGVsZXRlIHBhW2VdLCEwKX1mdW5jdGlvbiBnYShlLHQsbil7aWYodm9pZCAwPT09biYmKG49ITApLHBhW2VdKXJldHVybiBjb25zb2xlLndhcm4oIiciK2UrIicgcmVnaXN0ZXJlZDogIitwYVtlXS50b1N0cmluZygpKTt0LmtlZXBBbGl2ZT0hIW4scGFbZV09dH12YXIgbWE9Il9fVU5JQVBQX1NDQU4iLHlhPSJfd3d3L19fdW5pYXBwc2Nhbi5odG1sIixfYT0ic2NhbkNvZGUiO3ZhciBiYSx3YSxrYSxTYSx4YSxDYT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxTQ0FOX0lEOm1hLFNDQU5fUEFUSDp5YSxzY2FuQ29kZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUub25seUZyb21DYW1lcmE7dm9pZCAwPT09biYmKG49ITEpO3ZhciByPWUuc2NhblR5cGUsaT1lLmF1dG9EZWNvZGVDaGFyU2V0LG89b2cuYmFyY29kZSxhPXtxckNvZGU6W28uUVIsby5BWlRFQyxvLk1BWElDT0RFXSxiYXJDb2RlOltvLkVBTjEzLG8uRUFOOCxvLlVQQ0Esby5VUENFLG8uQ09EQUJBUixvLkNPREUxMjgsby5DT0RFMzksby5DT0RFOTMsby5JVEYsby5SU1MxNCxvLlJTU0VYUEFOREVEXSxkYXRhbWF0cml4OltvLkRBVEFNQVRSSVhdLHBkZjQxNzpbby5QREY0MTddfSxzPXt9O3Nbby5RUl09IlFSX0NPREUiLHNbby5FQU4xM109IkVBTl8xMyIsc1tvLkVBTjhdPSJFQU5fOCIsc1tvLkRBVEFNQVRSSVhdPSJEQVRBX01BVFJJWCIsc1tvLlVQQ0FdPSJVUENfQSIsc1tvLlVQQ0VdPSJVUENfRSIsc1tvLkNPREFCQVJdPSJDT0RBQkFSIixzW28uQ09ERTM5XT0iQ09ERV8zOSIsc1tvLkNPREU5M109IkNPREVfOTMiLHNbby5DT0RFMTI4XT0iQ09ERV8xMjgiLHNbby5JVEZdPSJDT0RFXzI1IixzW28uUERGNDE3XT0iUERGXzQxNyIsc1tvLkFaVEVDXT0iQVpURUMiLHNbby5SU1MxNF09IlJTU18xNCIsc1tvLlJTU0VYUEFOREVEXT0iUlNTRVhQQU5ERUQiO3ZhciBjLHUsbD0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0oYz1vZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09Y3x8Im51bGwiPT09Yz9jPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PWMmJihjPSJkYXJrIiksYyksZD1bXTtBcnJheS5pc0FycmF5KHIpJiZyLmxlbmd0aCYmci5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWFbZV07dCYmKGQ9ZC5jb25jYXQodCkpfSksZC5sZW5ndGh8fChkPWQuY29uY2F0KGEucXJDb2RlKS5jb25jYXQoYS5iYXJDb2RlKS5jb25jYXQoYS5kYXRhbWF0cml4KS5jb25jYXQoYS5wZGY0MTcpKTt2YXIgZj1bXTtufHxmLnB1c2goe2Zsb2F0OiJyaWdodCIsdGV4dDphdCgidW5pLnNjYW5Db2RlLmFsYnVtIiksZm9udFNpemU6IjE3cHgiLHdpZHRoOiI2MHB4IixvbmNsaWNrOmZ1bmN0aW9uKCl7b2cuZ2FsbGVyeS5waWNrKGZ1bmN0aW9uKGUpe28uc2NhbihlLGZ1bmN0aW9uKGUsdCxuLHIpe2wmJm9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpLHU9e3R5cGU6ZSxjb2RlOnQsY2hhclNldDpyfSxwLmNsb3NlKCJhdXRvIil9LGZ1bmN0aW9uKCl7b2cubmF0aXZlVUkudG9hc3QoYXQoInVuaS5zY2FuQ29kZS5mYWlsIikpfSxkLGkpfSxmdW5jdGlvbihlKXtlLmNvZGUhPT0oIkFuZHJvaWQiPT09b2cub3MubmFtZT8xMjotMikmJm9nLm5hdGl2ZVVJLnRvYXN0KGF0KCJ1bmkuc2NhbkNvZGUuZmFpbCIpKX0se211bHRpcGxlOiExLHN5c3RlbTohMSxmaWxlbmFtZTp5bysiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITB9KX19KTt2YXIgcD1vZy53ZWJ2aWV3LmNyZWF0ZSh5YSxtYSx7dGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdHlwZToiZmxvYXQiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSIsdGl0bGVDb2xvcjoiI2ZmZmZmZiIsdGl0bGVUZXh0OmF0KCJ1bmkuc2NhbkNvZGUudGl0bGUiKSx0aXRsZVNpemU6IjE3cHgiLGJ1dHRvbnM6Zn0scG9wR2VzdHVyZToiY2xvc2UiLGJhY2tCdXR0b25BdXRvQ29udHJvbDoiY2xvc2UifSx7X191bmlhcHBfdHlwZToic2NhbiIsX191bmlhcHBfZGFyazpsLF9fdW5pYXBwX3NjYW5fdHlwZTpkLF9fdW5pYXBwX2F1dG9fZGVjb2RlX2NoYXJfc2V0OmksX191bmlhcHBfbG9jYWxlOnN0KCksInVuaS1hcHAiOiJub25lIn0pLGg9b2cubmF0aXZlVUkuc2hvd1dhaXRpbmcoKTtwLmFkZEV2ZW50TGlzdGVuZXIoInRpdGxlVXBkYXRlIixmdW5jdGlvbigpe3Auc2hvdyh0YSxuYSxmdW5jdGlvbigpe2guY2xvc2UoKX0pfSkscC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtmaSh0LHU/e3Jlc3VsdDp1LmNvZGUsc2NhblR5cGU6c1t1LnR5cGVdfHwiIixjaGFyU2V0OnUuY2hhclNldHx8InV0ZjgiLHBhdGg6IiIsZXJyTXNnOiJzY2FuQ29kZTpvayJ9OntlcnJNc2c6InNjYW5Db2RlOmZhaWwgY2FuY2VsIn0pLHZhKF9hKX0pLGwmJihvZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0IikscC5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9vZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKToiZW5kIiE9PXR8fG58fG9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKX0pKSxnYShfYSxmdW5jdGlvbihlKXtlJiYiY29kZSJpbiBlJiYodT1lKX0sITEpfX0pO2Z1bmN0aW9uIFRhKCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJiJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiYib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50PyJ3ZWJ2aWV3IjoidjgifWZ1bmN0aW9uIE9hKCl7cmV0dXJuIGJhLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5pZH12YXIgRWE9e307ZnVuY3Rpb24gSWEoZSl7dmFyIHQ9ZS5kYXRhJiZlLmRhdGEuX19tZXNzYWdlO2lmKHQmJnQuX19wYWdlKXt2YXIgbj10Ll9fcGFnZSxyPUVhW25dO3ImJnIodCksdC5rZWVwfHxkZWxldGUgRWFbbl19fXZhciBBYT1mdW5jdGlvbihlKXt0aGlzLndlYnZpZXc9ZX07ZnVuY3Rpb24gJGEoZSl7dmFyIHQ9ZS5jb250ZXh0O3ZvaWQgMD09PXQmJih0PXt9KTt2YXIgbj1lLnVybCxyPWUuZGF0YTt2b2lkIDA9PT1yJiYocj17fSk7dmFyIGk9ZS5zdHlsZTt2b2lkIDA9PT1pJiYoaT17fSk7dmFyIG89ZS5vbk1lc3NhZ2UsYT1lLm9uQ2xvc2U7YmE9dC5wbHVzfHxvZyx3YT10LndlZXh8fCgib2JqZWN0Ij09dHlwZW9mIGlnP2lnOm51bGwpLGthPXQuQnJvYWRjYXN0Q2hhbm5lbHx8KCJvYmplY3QiPT10eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbD9Ccm9hZGNhc3RDaGFubmVsOm51bGwpO3ZhciBzPSJwYWdlIitEYXRlLm5vdygpOyExIT09KGk9T2JqZWN0LmFzc2lnbih7fSxpKSkudGl0bGVOVmlldyYmIm5vbmUiIT09aS50aXRsZU5WaWV3JiYoaS50aXRsZU5WaWV3PU9iamVjdC5hc3NpZ24oe2F1dG9CYWNrQnV0dG9uOiEwLHRpdGxlU2l6ZToiMTdweCJ9LGkudGl0bGVOVmlldykpO3ZhciBjPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6KCJzdHJpbmciPT10eXBlb2YgVlVFX0FQUF9URU1QTEFURV9QQVRIP1ZVRV9BUFBfVEVNUExBVEVfUEFUSDoiIikrIi8iK24rIi5qcyIsZGVmYXVsdEZvbnRTaXplOjE2LHZpZXdwb3J0OmJhLnNjcmVlbi5yZXNvbHV0aW9uV2lkdGh9fTtpPU9iamVjdC5hc3NpZ24oYyxpKTt2YXIgdSxsLGQ9YmEud2Vidmlldy5jcmVhdGUoIiIscyxpLHtleHRyYXM6e2Zyb206T2EoKSxydW50aW1lOlRhKCksZGF0YTpPYmplY3QuYXNzaWduKHt9LHIse2Rhcmttb2RlOmRnLmRhcmttb2RlfSksdXNlR2xvYmFsRXZlbnQ6IWthfX0pO3JldHVybiBkLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixhKSx1PXMsbD1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgbyYmbyhlLmRhdGEpLGUua2VlcHx8ZC5jbG9zZSgiYXV0byIpfSwidjgiPT09VGEoKT9rYT8oU2EmJlNhLmNsb3NlKCksKFNhPW5ldyBrYShPYSgpKSkub25tZXNzYWdlPUlhKTp4YXx8KHhhPXdhLnJlcXVpcmVNb2R1bGUoImdsb2JhbEV2ZW50IikpLmFkZEV2ZW50TGlzdGVuZXIoInBsdXNNZXNzYWdlIixJYSk6d2luZG93Ll9fcGx1c01lc3NhZ2U9SWEsRWFbdV09bCxkLnNob3coaS5hbmltYXRpb25UeXBlLGkuYW5pbWF0aW9uRHVyYXRpb24pLG5ldyBBYShkKX1BYS5wcm90b3R5cGUuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7X19tZXNzYWdlOntkYXRhOmV9fSkpLG49dGhpcy53ZWJ2aWV3LmlkO2thP25ldyBrYShuKS5wb3N0TWVzc2FnZSh0KTpiYS53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyh0LG4pfSxBYS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLndlYnZpZXcuY2xvc2UoKX07dmFyIFBhPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNjYW5Db2RlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPSJsaWdodCIhPT0oIlVJU3RhdHVzQmFyU3R5bGVCbGFja1RyYW5zbHVjZW50Ij09PShuPW9nLm5hdmlnYXRvci5nZXRTdGF0dXNCYXJTdHlsZSgpKXx8IlVJU3RhdHVzQmFyU3R5bGVCbGFja09wYXF1ZSI9PT1ufHwibnVsbCI9PT1uP249ImxpZ2h0IjoiVUlTdGF0dXNCYXJTdHlsZURlZmF1bHQiPT09biYmKG49ImRhcmsiKSxuKSxvPSRhKHt1cmw6Il9fdW5pYXBwc2NhbiIsZGF0YTpPYmplY3QuYXNzaWduKHt9LGUse21lc3NhZ2VzOntmYWlsOmF0KCJ1bmkuc2NhbkNvZGUuZmFpbCIpLCJmbGFzaC5vbiI6YXQoInVuaS5zY2FuQ29kZS5mbGFzaC5vbiIpLCJmbGFzaC5vZmYiOmF0KCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIil9fSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwicG9wLWluIix0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCx0eXBlOiJmbG9hdCIsdGl0bGVUZXh0OmUudGl0bGVUZXh0fHxhdCgidW5pLnNjYW5Db2RlLnRpdGxlIiksdGl0bGVDb2xvcjoiI2ZmZmZmZiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixidXR0b25zOmUub25seUZyb21DYW1lcmE/W106W3t0ZXh0OmUuYWxidW1UZXh0fHxhdCgidW5pLnNjYW5Db2RlLmFsYnVtIiksZm9udFNpemU6IjE3cHgiLHdpZHRoOiI2MHB4IixvbmNsaWNrOmZ1bmN0aW9uKCl7by5zZW5kTWVzc2FnZSh7dHlwZToiZ2FsbGVyeSJ9KX19XX0scG9wR2VzdHVyZToiY2xvc2UiLGJhY2tncm91bmQ6IiMwMDAwMDAiLGJhY2tCdXR0b25BdXRvQ29udHJvbDoiY2xvc2UifSxvbk1lc3NhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ldmVudCxuPWUuZGV0YWlsOyhyPW4pLmVyck1zZz0ibWFya2VkIj09PXQ/InNjYW5Db2RlOm9rIjoic2NhbkNvZGU6ZmFpbCAiK24ubWVzc2FnZX0sb25DbG9zZTpmdW5jdGlvbigpe2kmJm9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpLGZpKHQscnx8e2Vyck1zZzoic2NhbkNvZGU6ZmFpbCBjYW5jZWwifSl9fSk7aSYmKG9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKSxvLndlYnZpZXcuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50eXBlLG49ZS5yZXN1bHQ7InN0YXJ0Ij09PXQ/b2cubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIik6ImVuZCIhPT10fHxufHxvZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iil9KSl9fSk7ZnVuY3Rpb24gTWEoKXtpZigiaW9zIiE9PW9nLm9zLm5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4hMTt2YXIgZT1waSgiZmFjZUlEIik7cmV0dXJuISghZXx8IWUuaXNTdXBwb3J0KCkpfWZ1bmN0aW9uIGphKCl7cmV0dXJuISghb2cuZmluZ2VycHJpbnR8fCFvZy5maW5nZXJwcmludC5pc1N1cHBvcnQoKSl9ZnVuY3Rpb24gTGEoKXt2YXIgZT1bXTtyZXR1cm4gamEoKSYmZS5wdXNoKCJmaW5nZXJQcmludCIpLE1hKCkmJmUucHVzaCgiZmFjaWFsIikse3N1cHBvcnRNb2RlOmUsZXJyTXNnOiJjaGVja0lzU3VwcG9ydFNvdGVyQXV0aGVudGljYXRpb246b2sifX1mdW5jdGlvbiBCYShlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5jaGVja0F1dGhNb2RlO2lmKCJmaW5nZXJQcmludCI9PT10KXJldHVybiBqYSgpP3tpc0Vucm9sbGVkOm9nLmZpbmdlcnByaW50LmlzS2V5Z3VhcmRTZWN1cmUoKSYmb2cuZmluZ2VycHJpbnQuaXNFbnJvbGxlZEZpbmdlcnByaW50cygpLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpvayJ9Ontpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In07aWYoImZhY2lhbCI9PT10KXtpZihNYSgpKXt2YXIgbj1waSgiZmFjZUlEIik7cmV0dXJue2lzRW5yb2xsZWQ6biYmbi5pc0tleWd1YXJkU2VjdXJlKCkmJm4uaXNFbnJvbGxlZEZhY2VJRCgpLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpvayJ9fXJldHVybntpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In19cmV0dXJue2lzRW5yb2xsZWQ6ITEsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOmZhaWwgbm90IHN1cHBvcnQifX1mdW5jdGlvbiBOYShlKXt2YXIgdD1lLmJ1dHRvbnM7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJnQuZm9yRWFjaChmdW5jdGlvbihlLHQpe3ZhciByO2Uub25jbGljaz0ocj10LGZ1bmN0aW9uKGUpe3ZhciB0PXZnKCk7aWYodC5sZW5ndGgpe2UuaW5kZXg9cjt2YXIgbj10W3QubGVuZ3RoLTFdO24uJHZtJiZuLiR2bS5fX2NhbGxfaG9vayYmbi4kdm0uX19jYWxsX2hvb2soIm9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcCIsZSl9fSl9KSxlfWZ1bmN0aW9uIERhKG4scil7dmFyIGU9ZnVuY3Rpb24oZSl7aWYoZHQoKSlyZXR1cm4gbHQoZSxbWyJ0aXRsZVRleHQiXSxbInNlYXJjaElucHV0IiwicGxhY2Vob2xkZXIiXSxbImJ1dHRvbnMiLCJ0ZXh0Il1dKX0ocik7aWYoIWUpcmV0dXJuIHI7dmFyIGk9ZVswXSxvPWVbMV07cmV0dXJuKGl8fG8pJiZwZy5vbkxvY2FsZUNoYW5nZShmdW5jdGlvbigpe3ZhciBlPW9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQobisiIik7aWYoZSl7dmFyIHQ9e307aSYmKHQudGl0bGVUZXh0PXIudGl0bGVUZXh0KSxvJiYodC5zZWFyY2hJbnB1dD17cGxhY2Vob2xkZXI6ci5zZWFyY2hJbnB1dC5wbGFjZWhvbGRlcn0pLGUuc2V0U3R5bGUoe3RpdGxlTlZpZXc6dH0pfX0pLHJ9dmFyIFJhPS8oXGQrKFwuXGQrKT8pW3J8dV1weC9nO2Z1bmN0aW9uIEZhKHQpe3ZhciBuPXt9LGU9SlNPTi5zdHJpbmdpZnkodCk7aWYofmUuaW5kZXhPZigidXB4Iil8fH5lLmluZGV4T2YoInJweCIpKXRyeXtuPUpTT04ucGFyc2UoZS5yZXBsYWNlKFJhLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHBnLnVweDJweChwYXJzZUludCh0KXx8MCkrInB4In0pKX1jYXRjaChlKXtuPXQsY29uc29sZS5lcnJvcihlKX1lbHNlIG49SlNPTi5wYXJzZShlKTtyZXR1cm4gbn12YXIgVWE9WyJuYXZpZ2F0aW9uQmFyQmFja2dyb3VuZENvbG9yIiwibmF2aWdhdGlvbkJhclRleHRTdHlsZSIsIm5hdmlnYXRpb25CYXJUaXRsZVRleHQiLCJuYXZpZ2F0aW9uQmFyU2hhZG93IiwibmF2aWdhdGlvblN0eWxlIiwiZGlzYWJsZVNjcm9sbCIsImJhY2tncm91bmRDb2xvciIsImJhY2tncm91bmRUZXh0U3R5bGUiLCJlbmFibGVQdWxsRG93blJlZnJlc2giLCJvblJlYWNoQm90dG9tRGlzdGFuY2UiLCJ1c2luZ0NvbXBvbmVudHMiLCJ0aXRsZU5WaWV3IiwicHVsbFRvUmVmcmVzaCJdO2Z1bmN0aW9uIHphKGUsdCxuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9e2JvdW5jZToidmVydGljYWwifTtuLndpbmRvdz1GYShPYmplY3QuYXNzaWduKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGcud2luZG93fHx7fSkpLG4ud2luZG93fHx7fSkpO3ZhciBpPURzKG4pO09iamVjdC5rZXlzKGkud2luZG93KS5mb3JFYWNoKGZ1bmN0aW9uKGUpey0xPT09VWEuaW5kZXhPZihlKSYmKHJbZV09aS53aW5kb3dbZV0pfSk7dmFyIG89aS53aW5kb3cuYmFja2dyb3VuZENvbG9yOygvXiNbYS16MC05XXs2fSQvaS50ZXN0KG8pfHwidHJhbnNwYXJlbnQiPT09bykmJihyLmJhY2tncm91bmQ/bz1yLmJhY2tncm91bmQ6ci5iYWNrZ3JvdW5kPW8sci5iYWNrZ3JvdW5kQ29sb3JUb3B8fChyLmJhY2tncm91bmRDb2xvclRvcD1vKSxyLmJhY2tncm91bmRDb2xvckJvdHRvbXx8KHIuYmFja2dyb3VuZENvbG9yQm90dG9tPW8pLHIuYW5pbWF0aW9uQWxwaGFCR0NvbG9yfHwoci5hbmltYXRpb25BbHBoYUJHQ29sb3I9byksdm9pZCAwPT09ci53ZWJ2aWV3QkdUcmFuc3BhcmVudCYmKHIud2Vidmlld0JHVHJhbnNwYXJlbnQ9ITApKTt2YXIgYT1mdW5jdGlvbihlLHQpe3ZhciBuPXQud2luZG93LHI9bi50aXRsZU5WaWV3O2lmKHQubWV0YS5zdGF0dXNCYXJTdHlsZT0id2hpdGUiPT09bi5uYXZpZ2F0aW9uQmFyVGV4dFN0eWxlPyJsaWdodCI6ImRhcmsiLCExPT09cnx8ImZhbHNlIj09PXJ8fCJjdXN0b20iPT09bi5uYXZpZ2F0aW9uU3R5bGUmJiFUKHIpfHwiYWx3YXlzIj09PW4udHJhbnNwYXJlbnRUaXRsZSYmIVQocikpcmV0dXJuITE7dmFyIGk9bi50aXRsZUltYWdlfHwiIixvPW4udHJhbnNwYXJlbnRUaXRsZXx8Im5vbmUiLGE9bi5uYXZpZ2F0aW9uQmFyQmFja2dyb3VuZENvbG9yLHM9e2F1dG9CYWNrQnV0dG9uOiF0Lm1ldGEuaXNRdWl0LHRpdGxlVGV4dDoiIj09PWkmJm4ubmF2aWdhdGlvbkJhclRpdGxlVGV4dHx8IiIsdGl0bGVDb2xvcjoid2hpdGUiPT09bi5uYXZpZ2F0aW9uQmFyVGV4dFN0eWxlPyIjZmZmZmZmIjoiIzAwMDAwMCIsdHlwZTp7bm9uZToiZGVmYXVsdCIsYXV0bzoidHJhbnNwYXJlbnQiLGFsd2F5czoiZmxvYXQifVtvXSxiYWNrZ3JvdW5kQ29sb3I6L14jW2EtejAtOV17Nn0kL2kudGVzdChhKXx8InRyYW5zcGFyZW50Ij09PWE/YToiI2Y4ZjhmOCIsdGFnczoiIj09PWk/W106W3t0YWc6ImltZyIsc3JjOmkscG9zaXRpb246e2xlZnQ6ImF1dG8iLHRvcDoiYXV0byIsd2lkdGg6ImF1dG8iLGhlaWdodDoiMjZweCJ9fV19O3JldHVybiBUKHIpP0RhKGUsT2JqZWN0LmFzc2lnbihzLE5hKHIpKSk6RGEoZSxzKX0oZSxpKTthJiYoMT09PWUmJmRnLnJlYWxFbnRyeVBhZ2VQYXRoJiYhaS5tZXRhLmlzUXVpdCYmKGEuYXV0b0JhY2tCdXR0b249ITApLHIudGl0bGVOVmlldz1hKTt2YXIgcz1mdW5jdGlvbihlKXt2YXIgdD1lLndpbmRvdztpZih0LmVuYWJsZVB1bGxEb3duUmVmcmVzaHx8dC5wdWxsVG9SZWZyZXNoJiZ0LnB1bGxUb1JlZnJlc2guc3VwcG9ydCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4iQW5kcm9pZCI9PT1vZy5vcy5uYW1lP09iamVjdC5hc3NpZ24obix7c3VwcG9ydDohMCxzdHlsZToiY2lyY2xlIn0pOk9iamVjdC5hc3NpZ24obix7c3VwcG9ydDohMCxzdHlsZToiZGVmYXVsdCIsaGVpZ2h0OiI1MHB4IixyYW5nZToiMjAwcHgiLGNvbnRlbnRkb3duOntjYXB0aW9uOiIifSxjb250ZW50b3Zlcjp7Y2FwdGlvbjoiIn0sY29udGVudHJlZnJlc2g6e2NhcHRpb246IiJ9fSksdC5iYWNrZ3JvdW5kVGV4dFN0eWxlJiYobi5jb2xvcj10LmJhY2tncm91bmRUZXh0U3R5bGUsbi5zbm93Q29sb3I9dC5iYWNrZ3JvdW5kVGV4dFN0eWxlKSxPYmplY3QuYXNzaWduKG4sdC5wdWxsVG9SZWZyZXNofHx7fSksbn19KGkpO3JldHVybiBzJiYoImNpcmNsZSI9PT1zLnN0eWxlJiYoci5ib3VuY2U9Im5vbmUiKSxyLnB1bGxUb1JlZnJlc2g9cyksImhpZGUiPT09ci5wb3BHZXN0dXJlJiZkZWxldGUgci5wb3BHZXN0dXJlLGkubWV0YS5pc1F1aXQmJihyLnBvcEdlc3R1cmU9ImlPUyI9PT1vZy5vcy5uYW1lPyJhcHBiYWNrIjoibm9uZSIpLHQmJmkubWV0YS5pc05WdWUmJihyLnVuaU5WaWV3PXtwYXRoOnQsZGVmYXVsdEZvbnRTaXplOmRnLmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDpkZy52aWV3cG9ydH0pLG4ubWV0YT1pLm1ldGEscn1mdW5jdGlvbiBWYSgpe3BnLm5hdmlnYXRlQmFjayh7ZnJvbToiYmFja2J1dHRvbiJ9KX1mdW5jdGlvbiBxYSgpe3JldHVybiBvZy5uYXZpZ2F0b3IuaXNJbW1lcnNlZFN0YXR1c2JhcigpP01hdGgucm91bmQoImlPUyI9PT1vZy5vcy5uYW1lP29nLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpLnRvcDpvZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzYmFySGVpZ2h0KCkpOjB9ZnVuY3Rpb24gV2EoZSx0LG4pe2lmKGUucGF0aCl7dmFyIHI9ZS5zdHlsZXx8e30saT0ibmF2aWdhdGlvbkJhciI9PT1lLnR5cGUsbz0icG9wdXAiPT09ZS50eXBlO2RlbGV0ZSByLnR5cGUsbyYmIWUuaWQmJmNvbnNvbGUud2Fybigic3ViTlZ1ZVsiK2UucGF0aCsiXSBpcyBtaXNzaW5nIGlkIiksci51bmlOVmlldz17cGF0aDplLnBhdGgucmVwbGFjZSgiLm52dWUiLCIuanMiKSxkZWZhdWx0Rm9udFNpemU6ZGcuZGVmYXVsdEZvbnRTaXplLHZpZXdwb3J0OmRnLnZpZXdwb3J0fTt2YXIgYSxzPXtfX3VuaWFwcF9ob3N0OnQucGF0aCxfX3VuaWFwcF9vcmlnaW46ci51bmlOVmlldy5wYXRoLnNwbGl0KCI/IilbMF0ucmVwbGFjZSgiLmpzIiwiIiksX191bmlhcHBfb3JpZ2luX2lkOm4uaWQsX191bmlhcHBfb3JpZ2luX3R5cGU6bi5fX3VuaWFwcF90eXBlfTtpPyhyLnBvc2l0aW9uPSJkb2NrIixyLmRvY2s9InRvcCIsci50b3A9MCxyLndpZHRoPSIxMDAlIixyLmhlaWdodD10dCtxYSgpLGRlbGV0ZSByLmxlZnQsZGVsZXRlIHIucmlnaHQsZGVsZXRlIHIuYm90dG9tLGRlbGV0ZSByLm1hcmdpbik6byYmKHIucG9zaXRpb249ImFic29sdXRlIixhPXlpKHQucGF0aCk/cXM6bixzLl9fdW5pYXBwX21hc2s9ci5tYXNrfHwicmdiYSgwLDAsMCwwLjUpIixzLl9fdW5pYXBwX21hc2tfaWQ9YS5pZCksZGVsZXRlIHIubWFzazt2YXIgYyx1PW9nLndlYnZpZXcuY3JlYXRlKCIiLGUuaWQscixzKTtvP2Z1bmN0aW9uKGUsdCxuKXtuLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzfHwobi5wb3B1cFN1Yk5WdWVXZWJ2aWV3cz17fSksbi5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tlLmlkXT1lO3ZhciByPWZ1bmN0aW9uKCl7bi5zZXRTdHlsZSh7bWFzazoibm9uZSJ9KSxlLmhpZGUoImF1dG8iKX07bi5hZGRFdmVudExpc3RlbmVyKCJtYXNrQ2xpY2siLHIpO3ZhciBpPSExO2UuYWRkRXZlbnRMaXN0ZW5lcigic2hvdyIsZnVuY3Rpb24oKXtpfHwob2cua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLFZhKSxvZy5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsciksaT0hMCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLGZ1bmN0aW9uKCl7aSYmKG9nLmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixyKSxvZy5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsVmEpLGk9ITEpfSksZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtkZWxldGUgbi5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tlLmlkXSxpJiYob2cua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLHIpLG9nLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixWYSksaT0hMSl9KX0odSwwLGEpOihjPXUsbi5hcHBlbmQoYykpfX1mdW5jdGlvbiBIYShpKXt2YXIgbixyLG8sZTtpLmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsKG49ZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aWR0aCxuPWUuaGVpZ2h0LHI9e2RldmljZU9yaWVudGF0aW9uOjkwPT09TWF0aC5hYnMob2cubmF2aWdhdG9yLmdldE9yaWVudGF0aW9uKCkpPyJsYW5kc2NhcGUiOiJwb3J0cmFpdCIsc2l6ZTp7d2luZG93V2lkdGg6TWF0aC5jZWlsKHQpLHdpbmRvd0hlaWdodDpNYXRoLmNlaWwobil9fTtoaSgib25WaWV3RGlkUmVzaXplIixyKSxhZy5lbWl0KCJvblJlc2l6ZSIscixwYXJzZUludChpLmlkKSl9LHI9NTAsKGU9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMsdD10aGlzO2NnKG8pLG89c2coZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseSh0LGUpfSxyKX0pLmNhbmNlbD1mdW5jdGlvbigpe2NnKG8pfSxlKSl9dmFyIEdhLFhhPTIsSmE9InZkU3luYyIsWWE9IndlYnZpZXdSZWFkeSIsS2E9InZkU3luY0NhbGxiYWNrIixaYT0iaW52b2tlQXBpIixRYT0iV0VCX0lOVk9LRV9BUFBTRVJWSUNFIixlcz0id2Vidmlld0luc2VydGVkIix0cz0id2Vidmlld1JlbW92ZWQiLG5zPSJ3ZWJ2aWV3SWQiO2Z1bmN0aW9uIHJzKGUpe3ZhciBsO2UuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsZnVuY3Rpb24oZSl7aWYoInN0YXJ0Ij09PWUudHlwZSl7dmFyIHQ9dmcoKSxuPXRbdC5sZW5ndGgtMl07bD1saTt2YXIgcj1uJiZuLiRwYWdlLm1ldGEuc3RhdHVzQmFyU3R5bGU7ciYmbWkocil9ZWxzZSBpZigiZW5kIiE9PWUudHlwZXx8ZS5yZXN1bHQpe2lmKCJlbmQiPT09ZS50eXBlJiZlLnJlc3VsdCl7dmFyIGk9dmcoKSxvPWkubGVuZ3RoLGE9aVtpLmxlbmd0aC0xXTthJiZhLiRyZW1vdmUoKSxtaSgpLGEmJjE9PT1vJiYodT1hLGRnLnJlYWxFbnRyeVBhZ2VQYXRoJiZ1LiRwYWdlLnJvdXRlPT09ZGcuZW50cnlQYWdlUGF0aCk/KGRnLmVudHJ5UGFnZVBhdGg9ZGcucmVhbEVudHJ5UGFnZVBhdGgsZGVsZXRlIGRnLnJlYWxFbnRyeVBhZ2VQYXRoLHBnLnJlTGF1bmNoKHt1cmw6KHM9ZGcuZW50cnlQYWdlUGF0aCxjPXMsMD09PWMuaW5kZXhPZigiLyIpP3M6Ii8iK3MpfSkpOmFnLmVtaXQoIm9uQXBwUm91dGUiLHt0eXBlOiJuYXZpZ2F0ZUJhY2sifSl9fWVsc2UgbWkobCk7dmFyIHMsYyx1fSl9dmFyIGlzPTIsb3M9e3B1bGxUb1JlZnJlc2g6Im9uUHVsbERvd25SZWZyZXNoIix0aXRsZU5WaWV3U2VhcmNoSW5wdXRDaGFuZ2VkOiJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLHRpdGxlTlZpZXdTZWFyY2hJbnB1dENvbmZpcm1lZDoib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiLHRpdGxlTlZpZXdTZWFyY2hJbnB1dENsaWNrZWQ6Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsdGl0bGVOVmlld1NlYXJjaElucHV0Rm9jdXNDaGFuZ2VkOiJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZCJ9O2Z1bmN0aW9uIGFzKGUpe0dhPWV9ZnVuY3Rpb24gc3MoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gY3MoZSx0KXt2YXIgbj10P0kodCxzcyk6IiI7cmV0dXJue3BhdGg6ZS5zdWJzdHIoMSkscXVlcnk6bj9uLnN1YnN0cigxKTpufX1mdW5jdGlvbiB1cyhlLHQsbixyKXtpZih2b2lkIDA9PT1yJiYocj17fSksdC5tZXRhLmlzTlZ1ZSl7dmFyIGk9ZnVuY3Rpb24oKXtyZXR1cm4gemEobyxlLHQpfSxvPWlzKyssYT1pKCk7YS51bmlQYWdlVXJsPWNzKGUsbiksYS5pc1RhYj0hIXQubWV0YS5pc1RhYkJhcjt2YXIgcz1vZy53ZWJ2aWV3LmNyZWF0ZSgiIixTdHJpbmcobyksYSxPYmplY3QuYXNzaWduKHtudnVlOiEwfSxyKSk7cmV0dXJuIFJzKHMsaSksc31yZXR1cm4gMj09PWlzP29nLndlYnZpZXcuZ2V0TGF1bmNoV2VidmlldygpOkdhfWZ1bmN0aW9uIGxzKG4sZSx0LHIpe2lmKCIxIj09PW4uaWR8fCFlLm1ldGEuaXNOVnVlKXt2YXIgaT1mdW5jdGlvbigpe3JldHVybiB6YShwYXJzZUludChuLmlkKSwiIixlKX0sbz1pKCk7by51bmlQYWdlVXJsPWNzKHQsciksZS5tZXRhLmlzTlZ1ZT9vLmlzVGFiPSEhZS5tZXRhLmlzVGFiQmFyOm8uZGVidWdSZWZyZXNoPShhPXQsYz1lLHU9KHM9cik/SShzLHNzKToiIix7aXNUYWI6Yy5tZXRhLmlzVGFiQmFyLGFyZ3VtZW50czpKU09OLnN0cmluZ2lmeSh7cGF0aDphLnN1YnN0cigxKSxxdWVyeTp1P3Uuc3Vic3RyKDEpOnV9KX0pLFJzKG4saSksbi5zZXRTdHlsZShvKX12YXIgYSxzLGMsdSxsLGQsZixwLGgsdixnLG0seSxfPWFnLm9uLGI9YWcuZW1pdDtyZXR1cm4gZD1uLChmPShsPWUpLndpbmRvdy5zdWJOVnVlcykmJmYubGVuZ3RoJiZmLmZvckVhY2goZnVuY3Rpb24oZSl7V2EoZSxsLGQpfSksT2JqZWN0LmtleXMob3MpLmZvckVhY2goZnVuY3Rpb24odCl7bi5hZGRFdmVudExpc3RlbmVyKHQsZnVuY3Rpb24oZSl7Yihvc1t0XSxlLHBhcnNlSW50KG4uaWQpKX0pfSksKHA9bikucG9wdXBTdWJOVnVlV2Vidmlld3MmJnAuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGZ1bmN0aW9uKCl7T2JqZWN0LmtleXMocC5wb3B1cFN1Yk5WdWVXZWJ2aWV3cykuZm9yRWFjaChmdW5jdGlvbihlKXtwLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzW2VdLmNsb3NlKCJub25lIil9KX0pLEhhKG4pLCJpT1MiPT09b2cub3MubmFtZSYmKCFuLm52dWUmJihoPW4sdj1hZy5zdWJzY3JpYmUsZz1hZy51bnN1YnNjcmliZSxtPWguaWQseT1mdW5jdGlvbihlLHQpe2lmKG09PT10KXtnKFlhLHkpLHQ9cGFyc2VJbnQodCk7dmFyIG49dmcoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7aWYoIW4pcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpO24uJHZtLl8kdmQucmVzdG9yZSgpfX0saC5hZGRFdmVudExpc3RlbmVyKCJyZWNvdmVyeSIsZnVuY3Rpb24oZSl7dihZYSx5KX0pKSxycyhuKSksXyhuLmlkKyIuc3RhcnRQdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKCl7bi5iZWdpblB1bGxUb1JlZnJlc2goKX0pLF8obi5pZCsiLnN0b3BQdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKCl7bi5lbmRQdWxsVG9SZWZyZXNoKCl9KSxufXZhciBkcz17fTtmdW5jdGlvbiBmcyhlLHQpeyhkc1tlXXx8KGRzW2VdPVtdKSkucHVzaCh0KX12YXIgcHM9ITE7ZnVuY3Rpb24gaHModCxlLG4pe3BzPXtwYXRoOnQsbnZ1ZTpmZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT10fSkubWV0YS5pc05WdWUsbmF2aWdhdGU6ZX19ZnVuY3Rpb24gdnMoZSx0LG4pe2lmKG4mJmRnLnNwbGFzaHNjcmVlbiYmZGcuc3BsYXNoc2NyZWVuLmF1dG9jbG9zZSYmIWRnLnNwbGFzaHNjcmVlbi5hbHdheXNTaG93QmVmb3JlUmVuZGVyJiZvZy5uYXZpZ2F0b3IuY2xvc2VTcGxhc2hzY3JlZW4oKSwhbiYmcHMpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIldhaXRpbmcgdG8gbmF2aWdhdGUgdG86ICIrcHMucGF0aCsiLCBkbyBub3Qgb3BlcmF0ZSBjb250aW51b3VzbHk6ICIrZSsiLiIpO2lmKCJuYXRpdmUiPT09ZGcucmVuZGVyZXIpcmV0dXJuIDA9PT12ZygpLmxlbmd0aD9ocyhlLHQpOnQoKTt2YXIgcj0hR2F8fEdhJiZHYS5fX3VuaWFwcF9yb3V0ZSxpPUdhJiYhR2EubG9hZGVkO3J8fGk/aHMoZSx0KTp0KCksaSYmZnMoR2EuaWQsZ3MpfWZ1bmN0aW9uIGdzKCl7aWYocHMpe3ZhciBlPXBzLm5hdmlnYXRlO3JldHVybiBwcz0hMSxlKCl9fWZ1bmN0aW9uIG1zKCl7aWYoIm5hdGl2ZSI9PT1kZy5yZW5kZXJlcil7aWYoIXBzKXJldHVybjtyZXR1cm4gcHMubnZ1ZT9ncygpOnZvaWQgMH12YXIgZT0oR2EmJiFHYS5fX3VuaWFwcF9yb3V0ZXx8KEdhPW9nLndlYnZpZXcuY3JlYXRlKG9hLFN0cmluZyhpcysrKSx7Y29udGVudEFkanVzdDohMX0pKSxHYSk7aWYocHMpcmV0dXJuIHBzLm52dWU/Z3MoKTp2b2lkKGUubG9hZGVkP3BzLm5hdmlnYXRlKCk6ZnMoZS5pZCxncykpfXZhciB5cz1PYmplY3QuY3JlYXRlKG51bGwpO3ZhciBfcz1oKGZ1bmN0aW9uKGUpe3JldHVybiB5c1tlXSgpfSk7dmFyIGJzPVtdO2Z1bmN0aW9uIHdzKHQsZSl7dmFyIG49ITEscj1kZy5zdWJQYWNrYWdlcztpZihBcnJheS5pc0FycmF5KHIpKXt2YXIgaT1yLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT10LmluZGV4T2YoZS5yb290KX0pO2kmJihuPSEwLGZ1bmN0aW9uKGUsdCl7aWYoLTEhPT1icy5pbmRleE9mKGUpKXJldHVybiB0KCk7U3MoW2VdLGZ1bmN0aW9uKCl7dCgpfSl9KGkucm9vdCxlKSl9bnx8ZSgpfXZhciBrcz0iYXBwLXN1Yi1zZXJ2aWNlLmpzIjtmdW5jdGlvbiBTcyhlLHQpe3ZhciBuLHI7bj1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gYnMucHVzaChlKSxlKyIvIitrc30pLHI9ZnVuY3Rpb24oZSl7dCYmdCghMCl9LGRnLm9uU2VydmljZVJlYWR5KGZ1bmN0aW9uKCl7aWcucmVxdWlyZU1vZHVsZSgicGx1cyIpLmV2YWxKU0ZpbGVzKG4scil9KX12YXIgeHM9T2JqZWN0LmFzc2lnbjt2YXIgQ3M9e3BhdGg6IiIscXVlcnk6e30sc2NlbmU6MTAwMSxyZWZlcnJlckluZm86e2FwcElkOiIiLGV4dHJhRGF0YTp7fX19LFRzPXtwYXRoOiIiLHF1ZXJ5Ont9LHNjZW5lOjEwMDEscmVmZXJyZXJJbmZvOnthcHBJZDoiIixleHRyYURhdGE6e319fTtmdW5jdGlvbiBPcygpe3JldHVybiBDc31mdW5jdGlvbiBFcygpe3ZhciBlPWlnLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtpZihlLmdldFJlZGlyZWN0SW5mbyl7dmFyIHQ9ZS5nZXRSZWRpcmVjdEluZm8oKXx8e30sbj10LnBhdGgscj10LnF1ZXJ5LGk9dC5leHRyYURhdGEsbz10LnVzZXJBY3Rpb24sYT17YXBwSWQ6dC5mcm9tQXBwaWQsZXh0cmFEYXRhOnt9fTtyZXR1cm4gaSYmKGEuZXh0cmFEYXRhPWkpLHtwYXRoOm58fCIiLHF1ZXJ5OnI/Ij8iK3I6IiIscmVmZXJyZXJJbmZvOmEsdXNlckFjdGlvbjpvfX19dmFyIElzPSExO2Z1bmN0aW9uIEFzKCl7aWYoIUlzKXt2YXIgZSx0O2lmKElzPSEwLGlnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRSZWRpcmVjdEluZm8pe3ZhciBuPUVzKCkscj1uLnBhdGgsaT1uLnF1ZXJ5LG89bi5yZWZlcnJlckluZm87ciYmKGU9cix0PWkpLGRnLnJlZmVycmVySW5mbz1vfWVsc2V7dmFyIGE9b2cucnVudGltZS5hcmd1bWVudHM7aWYoIWEpcmV0dXJuO3RyeXt2YXIgcz1KU09OLnBhcnNlKGEpO2U9cy5wYXRofHxzLnBhdGhOYW1lLHQ9cy5xdWVyeT8iPyIrcy5xdWVyeToiIn1jYXRjaChlKXt9fWlmKGUmJmUhPT1kZy5lbnRyeVBhZ2VQYXRoKXt2YXIgYz0iLyIrZSx1PWZnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PWN9KTt1Pyh1Lm1ldGEuaXNUYWJCYXJ8fChkZy5yZWFsRW50cnlQYWdlUGF0aD1kZy5yZWFsRW50cnlQYWdlUGF0aHx8ZGcuZW50cnlQYWdlUGF0aCksZGcuZW50cnlQYWdlUGF0aD1lLGRnLmVudHJ5UGFnZVF1ZXJ5PXQpOmNvbnNvbGUuZXJyb3IoIlt1bmktYXBwXSAiK2UrIiBub3QgZm91bmQuLi4iKX1lbHNlIHQmJihkZy5lbnRyeVBhZ2VRdWVyeT10KX19dmFyICRzPVtdO2Z1bmN0aW9uIFBzKGUpe3JldHVybiBlPyRzLnNsaWNlKDApOiRzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS4kcGFnZS5tZXRhLmlzVGFiQmFyfHxlLiRwYWdlLm1ldGEudmlzaWJsZX0pfXZhciBNcz17fTtmdW5jdGlvbiBqcyhlKXt2YXIgdD1lLnVybCxuPWUucGF0aCxpPWUucXVlcnkscj1lLm9wZW5UeXBlLG89ZS53ZWJ2aWV3LGE9ZS5ldmVudENoYW5uZWw7aWYobyYmQXMoKSxNc1t0XSYmKG89TXNbdF0pLl9fcGFnZV9fKXtpZighUHMoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1vLl9fcGFnZV9ffSkpcmV0dXJuIGEmJihvLl9fcGFnZV9fLmV2ZW50Q2hhbm5lbD1hKSwkcy5wdXNoKG8uX19wYWdlX18pLG87bz1udWxsfXZhciBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZmcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09bn0pKSk7InJlTGF1bmNoIj09PXJ8fCFkZy5yZWFsRW50cnlQYWdlUGF0aCYmMD09PVBzKCkubGVuZ3RoP3MubWV0YS5pc1F1aXQ9ITA6cy5tZXRhLmlzVGFiQmFyfHwocy5tZXRhLmlzUXVpdD0hMSksbz8obz1vZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKG8uaWQpKS5udnVlPXMubWV0YS5pc05WdWU6bz11cyhuLHMsaSkscy5tZXRhLmlzVGFiQmFyJiYocy5tZXRhLnZpc2libGU9ITApLHMubWV0YS5pc1RhYkJhciYmcXMuYXBwZW5kKG8pO3ZhciBjPSIxIj09PW8uaWQmJm8ubnZ1ZTtscyhvLHMsbixpKTt2YXIgdT1uLnNsaWNlKDEpLGw9e3JvdXRlOm8uX191bmlhcHBfcm91dGU9dSxvcHRpb25zOk9iamVjdC5hc3NpZ24oe30saXx8e30pLCRnZXRBcHBXZWJ2aWV3OmZ1bmN0aW9uKCl7cmV0dXJuIG9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoby5pZCl9LGV2ZW50Q2hhbm5lbDphLCRwYWdlOntpZDpwYXJzZUludChvLmlkKSxtZXRhOnMubWV0YSxwYXRoOm4scm91dGU6dSxmdWxsUGF0aDp0LG9wZW5UeXBlOnJ9LCRyZW1vdmU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9JHMuZmluZEluZGV4KGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0pOy0xIT09ZSYmKG8ubnZ1ZXx8dGhpcy4kdm0uJGRlc3Ryb3koKSwkcy5zcGxpY2UoZSwxKSl9LHNlbGVjdENvbXBvbmVudDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kdm0uc2VsZWN0Q29tcG9uZW50KGUpfSxzZWxlY3RBbGxDb21wb25lbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiR2bS5zZWxlY3RBbGxDb21wb25lbnRzKGUpfX07aWYoJHMucHVzaChsKSxvLl9fcHJlbG9hZF9fJiYoby5fX3BhZ2VfXz1sKSxjJiYoZGcuc3BsYXNoc2NyZWVuJiZkZy5zcGxhc2hzY3JlZW4uYXV0b2Nsb3NlJiYhZGcuc3BsYXNoc2NyZWVuLmFsd2F5c1Nob3dCZWZvcmVSZW5kZXImJm9nLm5hdmlnYXRvci5jbG9zZVNwbGFzaHNjcmVlbigpLGRnLm9uUmVhZHkoZnVuY3Rpb24oKXttcygpfSkpLCFvLm52dWUpe3ZhciBkPW8uaWQ7dHJ5e3dzKHUsZnVuY3Rpb24oKXt2YXIgZSx0LG4scjsoZT11LHQ9ZCxuPWkscj1sLHlzW2VdfHxjb25zb2xlLmVycm9yKGUrIiBub3QgZm91bmQiKSxuZXcoX3MoZSkpKHttcFR5cGU6InBhZ2UiLHBhZ2VJZDp0LHBhZ2VQYXRoOmUscGFnZVF1ZXJ5Om4scGFnZUluc3RhbmNlOnJ9KSkuJG1vdW50KCl9KX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX1yZXR1cm4gb312YXIgTHM9ImFwaS5vblRoZW1lQ2hhbmdlIjtmdW5jdGlvbiBCcyhlKXt2b2lkIDA9PT1lJiYoZT1mdW5jdGlvbigpe30pLGFnLm9uKExzLGUpfWZ1bmN0aW9uIE5zKCl7aWYoZGcuZGFya21vZGUpe3ZhciB0PSJkYXJrIj09PW9nLm5hdmlnYXRvci5nZXRVSVN0eWxlKCk/ImxpZ2h0IjoiZGFyayI7bWkodCksUHMoITApLmZvckVhY2goZnVuY3Rpb24oZSl7ZS4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlPXR9KX19ZnVuY3Rpb24gRHMoZSl7aWYoZGcuZGFya21vZGUpe3ZhciB0PW9nLm5hdmlnYXRvci5nZXRVSVN0eWxlKCksbj1YcygpO3JldHVybiBuJiZuLmhvc3RUaGVtZSYmKHQ9bi5ob3N0VGhlbWUpLEwoZSxkZy50aGVtZUNvbmZpZyx0KX1yZXR1cm4gZX1mdW5jdGlvbiBScyhyLGkpe2lmKGRnLmRhcmttb2RlKXt2YXIgdD1mdW5jdGlvbigpe3ZhciBlPWkoKSx0PXthbmltYXRpb25BbHBoYUJHQ29sb3I6ZS5hbmltYXRpb25BbHBoYUJHQ29sb3IsYmFja2dyb3VuZDplLmJhY2tncm91bmQsYmFja2dyb3VuZENvbG9yQm90dG9tOmUuYmFja2dyb3VuZENvbG9yQm90dG9tLGJhY2tncm91bmRDb2xvclRvcDplLmJhY2tncm91bmRDb2xvclRvcH0sbj1lLnRpdGxlTlZpZXc7dm9pZCAwIT09biYmKHQudGl0bGVOVmlldz0ib2JqZWN0Ij09dHlwZW9mIG4/e2JhY2tncm91bmRDb2xvcjpuLmJhY2tncm91bmRDb2xvcix0aXRsZUNvbG9yOm4udGl0bGVDb2xvcn06biksciYmci5zZXRTdHlsZShlKX07QnModCksci5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09KGU9dCkmJihlPWZ1bmN0aW9uKCl7fSksdm9pZCBhZy5vZmYoTHMsZSk7dmFyIGV9KX19dmFyIEZzLFVzLHpzPSEwO3ZhciBWcz1bXSxxcz17aWQ6IjAiLGluaXQ6ZnVuY3Rpb24oZSxuKXtlJiZlLmxpc3QubGVuZ3RoJiYoRnM9ZSk7dHJ5e1VzPXBpKCJ1bmktdGFidmlldyIpfWNhdGNoKGUpe2NvbnNvbGUubG9nKCd1bmkucmVxdWlyZU5hdGl2ZVBsdWdpbigidW5pLXRhYnZpZXciKSBlcnJvciAnK2UpfVVzLm9uTWFza0NsaWNrKGZ1bmN0aW9uKCl7VnMuZm9yRWFjaChmdW5jdGlvbihlKXtlKCl9KX0pLFVzJiZVcy5vbkNsaWNrKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXg7bihGcy5saXN0W3RdLHQpfSksVXMmJlVzLm9uTWlkQnV0dG9uQ2xpY2soZnVuY3Rpb24oKXtoaSgib25UYWJCYXJNaWRCdXR0b25UYXAiLHt9KX0pLGZ1bmN0aW9uKHIsaSl7aWYoZGcuZGFya21vZGUpe3ZhciBlPWZ1bmN0aW9uKCl7dmFyIGU9RHMoaSksdD1lLmxpc3Q7dm9pZCAwPT09dCYmKHQ9W10pO3ZhciBuPXtjb2xvcjplLmNvbG9yLHNlbGVjdGVkQ29sb3I6ZS5zZWxlY3RlZENvbG9yLGJhY2tncm91bmRDb2xvcjplLmJhY2tncm91bmRDb2xvcixib3JkZXJTdHlsZTplLmJvcmRlclN0eWxlfTtyJiZyLnNldFRhYkJhclN0eWxlKG4pLHImJnIuc2V0VGFiQmFySXRlbXMoe2xpc3Q6dC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue2ljb25QYXRoOmUuaWNvblBhdGgsc2VsZWN0ZWRJY29uUGF0aDplLnNlbGVjdGVkSWNvblBhdGgsdmlzaWJsZTplLnZpc2libGV9fSl9KX07ZSgpLEJzKGUpfX0oVXMsZSl9LGluZGV4T2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jb25maWcsbj10JiZ0Lmxpc3QmJnQubGlzdC5sZW5ndGg7aWYobilmb3IodmFyIHI9MDtyPG47cisrKWlmKHQubGlzdFtyXS5wYWdlUGF0aD09PWV8fHQubGlzdFtyXS5wYWdlUGF0aD09PWUrIi5odG1sIilyZXR1cm4gcjtyZXR1cm4tMX0sc3dpdGNoVGFiOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuaW5kZXhPZihlKTtyZXR1cm4gMDw9dCYmKFVzJiZVcy5zd2l0Y2hTZWxlY3Qoe2luZGV4OnR9KSwhMCl9LHNldFRhYkJhckJhZGdlOmZ1bmN0aW9uKGUsdCxuKXtVcyYmKCJub25lIj09PWU/KFVzLmhpZGVUYWJCYXJSZWREb3Qoe2luZGV4OnR9KSxVcy5yZW1vdmVUYWJCYXJCYWRnZSh7aW5kZXg6dH0pKToidGV4dCI9PT1lP1VzLnNldFRhYkJhckJhZGdlKHtpbmRleDp0LHRleHQ6bn0pOiJyZWREb3QiPT09ZSYmVXMuc2hvd1RhYkJhclJlZERvdCh7aW5kZXg6dH0pKX0sc2V0VGFiQmFySXRlbTpmdW5jdGlvbihlLHQsbixyLGksbyl7dmFyIGEscz17aW5kZXg6ZX07aWYodm9pZCAwIT09dCYmKHMudGV4dD10KSxuJiYocy5pY29uUGF0aD1UaShuKSksciYmKHMuc2VsZWN0ZWRJY29uUGF0aD1UaShyKSksdm9pZCAwIT09byYmKHMuaWNvbmZvbnQ9byksdm9pZCAwIT09aSl7cy52aXNpYmxlPUZzLmxpc3RbZV0udmlzaWJsZT1pLGRlbGV0ZSBzLmluZGV4O3ZhciBjPUZzLmxpc3QubWFwKGZ1bmN0aW9uKGUpe3JldHVybnt2aXNpYmxlOmUudmlzaWJsZX19KTtjW2VdPXMsYT17bGlzdDpjfSxVcyYmVXMuc2V0VGFiQmFySXRlbXMoYSl9ZWxzZSBVcyYmVXMuc2V0VGFiQmFySXRlbShzKX0sc2V0VGFiQmFyU3R5bGU6ZnVuY3Rpb24oZSl7VXMmJlVzLnNldFRhYkJhclN0eWxlKGUpfSxoaWRlVGFiQmFyOmZ1bmN0aW9uKGUpe3pzPSExLFVzJiZVcy5oaWRlVGFiQmFyKHthbmltYXRpb246ZX0pfSxzaG93VGFiQmFyOmZ1bmN0aW9uKGUpe3pzPSEwLFVzJiZVcy5zaG93VGFiQmFyKHthbmltYXRpb246ZX0pfSxhcHBlbmQ6ZnVuY3Rpb24odCl7dmFyIG49dGhpcztVcyYmVXMuYXBwZW5kKHtpZDp0LmlkfSxmdW5jdGlvbihlKXswIT09ZS5jb2RlJiZzZyhmdW5jdGlvbigpe24uYXBwZW5kKHQpfSwyMCl9KX0sZ2V0IGNvbmZpZygpe3JldHVybiBGc3x8ZGcudGFiQmFyfSxnZXQgdmlzaWJsZSgpe3JldHVybiB6c30sZ2V0IGhlaWdodCgpe3ZhciBlPXRoaXMuY29uZmlnO3JldHVybihlJiZlLmhlaWdodD9wYXJzZUZsb2F0KGUuaGVpZ2h0KTo1MCkrb2cubmF2aWdhdG9yLmdldFNhZmVBcmVhSW5zZXRzKCkuZGV2aWNlQm90dG9tfSxnZXQgY292ZXIoKXt2YXIgZT10aGlzLmNvbmZpZztyZXR1cm4gZSYmMDw9WyJleHRyYWxpZ2h0IiwibGlnaHQiLCJkYXJrIl0uaW5kZXhPZihlLmJsdXJFZmZlY3QpfSxzZXRTdHlsZTpmdW5jdGlvbihlKXt2YXIgdD1lLm1hc2s7VXMuc2V0TWFzayh7Y29sb3I6dH0pfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7VnMucHVzaCh0KX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe3ZhciBuPVZzLmluZGV4T2YodCk7VnMuc3BsaWNlKG4sMSl9fTtmdW5jdGlvbiBXcygpe3ZhciBlLHQsbixyLGk9ImlvcyI9PT1vZy5vcy5uYW1lLnRvTG93ZXJDYXNlKCksbz0oZT1vZy5zY3JlZW4uZ2V0Q3VycmVudFNpemUoKSx0PWUucmVzb2x1dGlvbldpZHRoLG49ZS5yZXNvbHV0aW9uSGVpZ2h0LHtzY3JlZW5XaWR0aDpNYXRoLnJvdW5kKHQpLHNjcmVlbkhlaWdodDpNYXRoLnJvdW5kKG4pfSksYT1vLnNjcmVlbldpZHRoLHM9by5zY3JlZW5IZWlnaHQsYz1xYSgpLHU9e2hlaWdodDowLGNvdmVyOiExfSxsPVNpKCk7aWYobCl7dmFyIGQ9bC5nZXRTdHlsZSgpOyhkPWQmJmQudGl0bGVOVmlldykmJmQudHlwZSYmIm5vbmUiIT09ZC50eXBlJiYodS5oZWlnaHQ9InRyYW5zcGFyZW50Ij09PWQudHlwZT8wOmMrdHQsdS5jb3Zlcj0idHJhbnNwYXJlbnQiPT09ZC50eXBlfHwiZmxvYXQiPT09ZC50eXBlKSxyPWwuZ2V0U2FmZUFyZWFJbnNldHMoKX1lbHNlIHI9b2cubmF2aWdhdG9yLmdldFNhZmVBcmVhSW5zZXRzKCk7dmFyIGY9e2hlaWdodDowLGNvdmVyOiExfTt5aSgpJiYoZi5oZWlnaHQ9cXMudmlzaWJsZT9xcy5oZWlnaHQ6MCxmLmNvdmVyPXFzLmNvdmVyKTt2YXIgcD11LmNvdmVyP3UuaGVpZ2h0OjAsaD1mLmNvdmVyP2YuaGVpZ2h0OjAsdj1zLXUuaGVpZ2h0LWYuaGVpZ2h0LGc9cy0odS5jb3Zlcj8wOnUuaGVpZ2h0KS0oZi5jb3Zlcj8wOmYuaGVpZ2h0KSxtPWE7Zi5oZWlnaHQmJiFmLmNvdmVyfHxyLmJvdHRvbXx8IXIuZGV2aWNlQm90dG9tfHwodi09ci5kZXZpY2VCb3R0b20sZy09ci5kZXZpY2VCb3R0b20pO3ZhciB5PXtsZWZ0OihyPWk/cjp7bGVmdDowLHJpZ2h0OjAsdG9wOnUuaGVpZ2h0JiYhdS5jb3Zlcj8wOmMsYm90dG9tOjB9KS5sZWZ0LHJpZ2h0Om0tci5yaWdodCx0b3A6ci50b3AsYm90dG9tOmctci5ib3R0b20sd2lkdGg6bS1yLmxlZnQtci5yaWdodCxoZWlnaHQ6Zy1yLnRvcC1yLmJvdHRvbX07cmV0dXJue3BpeGVsUmF0aW86b2cuc2NyZWVuLnNjYWxlLHNjcmVlbldpZHRoOmEsc2NyZWVuSGVpZ2h0OnMsd2luZG93V2lkdGg6bSx3aW5kb3dIZWlnaHQ6dixzdGF0dXNCYXJIZWlnaHQ6YyxzYWZlQXJlYTp5LHNhZmVBcmVhSW5zZXRzOnt0b3A6ci50b3AscmlnaHQ6ci5yaWdodCxib3R0b206ci5ib3R0b20sbGVmdDpyLmxlZnR9LHdpbmRvd1RvcDpwLHdpbmRvd0JvdHRvbTpoLHNjcmVlblRvcDpzLXZ9fXZhciBIcz17fSxHcz0hMDtmdW5jdGlvbiBYcygpe2lmKEdzKXt2YXIgZT1pZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0U3lzdGVtSW5mb1N5bmM7aWYoInN0cmluZyI9PXR5cGVvZihIcz1lKCkpKXRyeXtIcz1KU09OLnBhcnNlKEhzKX1jYXRjaChlKXt9cmV0dXJuIEhzfX1mdW5jdGlvbiBKcygpe1hzKCk7dmFyIGU9SHMuZGV2aWNlQnJhbmQ7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PUhzLmRldmljZU1vZGVsLG49SHMub3NOYW1lLHI9SHMub3NWZXJzaW9uLGk9SHMuZGV2aWNlT3JpZW50YXRpb24sbz1Icy5kZXZpY2VUeXBlLGE9SHMuZGV2aWNlSWQscz1lLnRvTG93ZXJDYXNlKCksYz1uLnRvTG93ZXJDYXNlKCk7cmV0dXJue2JyYW5kOnMsZGV2aWNlQnJhbmQ6cyxkZXZpY2VNb2RlbDp0LGRldmljZVBpeGVsUmF0aW86b2cuc2NyZWVuLnNjYWxlLGRldmljZUlkOmEsZGV2aWNlT3JpZW50YXRpb246aSxkZXZpY2VUeXBlOm8sbW9kZWw6dCxwbGF0Zm9ybTpjLHN5c3RlbTooImlvcyI9PT1jPyJpT1MiOiJBbmRyb2lkIikrIiAiK3J9fWZ1bmN0aW9uIFlzKCl7WHMoKTt2YXIgZT1Icy5ob3N0UGFja2FnZU5hbWUsdD1Icy5ob3N0TmFtZSxuPUhzLm9zTGFuZ3VhZ2Uscj1Icy5ob3N0VmVyc2lvbixpPUhzLmhvc3RMYW5ndWFnZSxvPUhzLmhvc3RUaGVtZTtyZXR1cm57YXBwSWQ6SHMuYXBwSWQsYXBwTmFtZTpIcy5hcHBOYW1lLGFwcFZlcnNpb246SHMuYXBwVmVyc2lvbixhcHBWZXJzaW9uQ29kZTpIcy5hcHBWZXJzaW9uQ29kZSxhcHBXZ3RWZXJzaW9uOkhzLmFwcFdndFZlcnNpb24sYXBwTGFuZ3VhZ2U6cGcmJnBnLmdldExvY2FsZT9wZy5nZXRMb2NhbGUoKTppLGVuYWJsZURlYnVnOiExLGhvc3RTREtWZXJzaW9uOnZvaWQgMCxob3N0UGFja2FnZU5hbWU6ZSxob3N0TmFtZTp0LGhvc3RWZXJzaW9uOnIsaG9zdExhbmd1YWdlOmksaG9zdFRoZW1lOm8saG9zdEZvbnRTaXplU2V0dGluZzp2b2lkIDAsbGFuZ3VhZ2U6bixTREtWZXJzaW9uOiIiLHRoZW1lOm9nLm5hdmlnYXRvci5nZXRVSVN0eWxlKCksdmVyc2lvbjpvZy5ydW50aW1lLmlubmVyVmVyc2lvbn19ZnVuY3Rpb24gS3MoKXtHcz0hMCxYcygpLEdzPSExO3ZhciBlPVdzKCksdD1KcygpLG49WXMoKTtHcz0hMDt2YXIgcj17ZXJyTXNnOiJnZXRTeXN0ZW1JbmZvOm9rIixmb250U2l6ZVNldHRpbmc6bi5ob3N0Rm9udFNpemVTZXR0aW5nLG9zTmFtZTpIcy5vc05hbWUudG9Mb3dlckNhc2UoKX07SHMuaG9zdE5hbWUmJihyLmhvc3RTREtWZXJzaW9uPUhzLnVuaVJ1bnRpbWVWZXJzaW9uKTt2YXIgaSxvLGE9T2JqZWN0LmFzc2lnbih7fSxIcyxlLHQsbixyKTtyZXR1cm4gZGVsZXRlIGEuc2NyZWVuVG9wLGRlbGV0ZSBhLmVuYWJsZURlYnVnLGRnLmRhcmttb2RlfHxkZWxldGUgYS50aGVtZSxvPXt9LFQoaT1hKSYmT2JqZWN0LmtleXMoaSkuc29ydCgpLmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT1pW2VdfSksT2JqZWN0LmtleXMobyk/bzppfWZ1bmN0aW9uIFpzKCl7dmFyIGU9KDAsaWcucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldEFwcEF1dGhvcml6ZVNldHRpbmcpKCk7dHJ5eyJzdHJpbmciPT10eXBlb2YgZSYmKGU9SlNPTi5wYXJzZShlKSl9Y2F0Y2goZSl7fWZvcih2YXIgdCBpbiBlKXtpZihPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKSJ1bmRlZmluZWQiPT09ZVt0XSYmKGVbdF09dm9pZCAwKX1yZXR1cm4gZX12YXIgUXM9InVuaWFwcF9zYXZlIixlYz0iX2RvYy8iK1FzO2Z1bmN0aW9uIHRjKHQsbil7bj1ufHxmdW5jdGlvbigpe30sb2cuaW8ucmVxdWVzdEZpbGVTeXN0ZW0ob2cuaW8uUFJJVkFURV9ET0MsZnVuY3Rpb24oZSl7ZS5yb290LmdldERpcmVjdG9yeShRcyx7Y3JlYXRlOiEwfSx0LG4pfSxuKX12YXIgbmM9MDt2YXIgcmM9QmkoImlvIiwiZ2V0RmlsZUluZm8iKTt2YXIgaWM9ImNob29zZUxvY2F0aW9uIjt2YXIgb2M9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlTG9jYXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1vZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSxyPW9nLndlYnZpZXcuY3JlYXRlKCJfd3d3L19fdW5pYXBwY2hvb3NlbG9jYXRpb24uaHRtbCIsZ28se3RpdGxlTlZpZXc6e2F1dG9CYWNrQnV0dG9uOiEwLGJhY2tncm91bmRDb2xvcjoiIzAwMDAwMCIsdGl0bGVDb2xvcjoiI2ZmZmZmZiIsdGl0bGVUZXh0OiLpgInmi6nkvY3nva4iLHRpdGxlU2l6ZToiMTdweCIsYnV0dG9uczpbe2Zsb2F0OiJyaWdodCIsdGV4dDoi5a6M5oiQIixmb250U2l6ZToiMTdweCIsd2lkdGg6IjYwcHgiLG9uY2xpY2s6ZnVuY3Rpb24oKXtyLmV2YWxKUygiX19jaG9vc2VMb2NhdGlvbkNvbmZpcm1fXygpIil9fV19LHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSx7X191bmlhcHBfdHlwZToibWFwIixfX3VuaWFwcF9zdGF0dXNiYXJfc3R5bGU6biwidW5pLWFwcCI6Im5vbmUifSk7ImRhcmsiPT09biYmKG9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKSxyLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P29nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOiJlbmQiIT09dHx8bnx8b2cubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpO3ZhciBpLG89MCxhPWZ1bmN0aW9uKCl7Mj09KytvJiZyLmV2YWxKUygiX19jaG9vc2VMb2NhdGlvbl9fKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiKX07ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWQiLGEpLHIuc2hvdygic2xpZGUtaW4tYm90dG9tIixuYSxhKSxyLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixmdW5jdGlvbigpe2k/ZmkodCx7bmFtZTppLnBvaW5hbWUsYWRkcmVzczppLnBvaWFkZHJlc3MsbGF0aXR1ZGU6aS5sYXRsbmcubGF0LGxvbmdpdHVkZTppLmxhdGxuZy5sbmcsZXJyTXNnOiJjaG9vc2VMb2NhdGlvbjpvayJ9KToodmEoaWMpLGZpKHQse2Vyck1zZzoiY2hvb3NlTG9jYXRpb246ZmFpbCBjYW5jZWwifSkpfSksZ2EoaWMsZnVuY3Rpb24oZSl7ZSYmImxhdGxuZyJpbiBlJiYoaT1lKX0sITEpfX0pO3ZhciBhYz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VMb2NhdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0obj1vZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09bnx8Im51bGwiPT09bj9uPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PW4mJihuPSJkYXJrIiksbiksbz0kYSh7dXJsOiJfX3VuaWFwcGNob29zZWxvY2F0aW9uIixkYXRhOk9iamVjdC5hc3NpZ24oe30sZSx7bG9jYWxlOnN0KCl9KSxzdHlsZTp7YW5pbWF0aW9uVHlwZTplLmFuaW1hdGlvblR5cGV8fCJzbGlkZS1pbi1ib3R0b20iLHRpdGxlTlZpZXc6ITEscG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSJ9LG9uTWVzc2FnZTpmdW5jdGlvbihlKXt2YXIgdD1lLmV2ZW50LG49ZS5kZXRhaWw7InNlbGVjdGVkIj09PXQmJigocj1uKS5lcnJNc2c9ImNob29zZUxvY2F0aW9uOm9rIil9LG9uQ2xvc2U6ZnVuY3Rpb24oKXtpJiZvZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxmaSh0LHJ8fHtlcnJNc2c6ImNob29zZUxvY2F0aW9uOmZhaWwgY2FuY2VsIn0pfX0pO2kmJihvZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iiksby53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P29nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOiJlbmQiIT09dHx8bnx8b2cubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfX0pO2Z1bmN0aW9uIHNjKGUsdCxuKXt2YXIgcixpPXQuY29vcmRzO2UhPT10LmNvb3Jkc1R5cGUmJigid2dzODQiPT09ZT9yPWZ1bmN0aW9uKGUsdCl7aWYoUGkoZT0rZSx0PSt0KSlyZXR1cm5bZSx0XTt2YXIgbj1BaShlLTEwNSx0LTM1KSxyPSRpKGUtMTA1LHQtMzUpLGk9dC8xODAqT2ksbz1NYXRoLnNpbihpKTtvPTEtSWkqbypvO3ZhciBhPU1hdGguc3FydChvKTtyZXR1cm4gbj0xODAqbi8oRWkqKDEtSWkpLyhvKmEpKk9pKSxbMiplLShlKyhyPTE4MCpyLyhFaS9hKk1hdGguY29zKGkpKk9pKSkpLDIqdC0odCtuKV19KGkubG9uZ2l0dWRlLGkubGF0aXR1ZGUpOiJnY2owMiI9PT1lJiYocj1mdW5jdGlvbihlLHQpe2lmKFBpKGU9K2UsdD0rdCkpcmV0dXJuW2UsdF07dmFyIG49QWkoZS0xMDUsdC0zNSkscj0kaShlLTEwNSx0LTM1KSxpPXQvMTgwKk9pLG89TWF0aC5zaW4oaSk7bz0xLUlpKm8qbzt2YXIgYT1NYXRoLnNxcnQobyk7cmV0dXJuIG49MTgwKm4vKEVpKigxLUlpKS8obyphKSpPaSksW2UrKHI9MTgwKnIvKEVpL2EqTWF0aC5jb3MoaSkqT2kpKSx0K25dfShpLmxvbmdpdHVkZSxpLmxhdGl0dWRlKSksciYmKGkubG9uZ2l0dWRlPXJbMF0saS5sYXRpdHVkZT1yWzFdKSk7Zmkobix7dHlwZTplLGFsdGl0dWRlOmkuYWx0aXR1ZGV8fDAsbGF0aXR1ZGU6aS5sYXRpdHVkZSxsb25naXR1ZGU6aS5sb25naXR1ZGUsc3BlZWQ6aS5zcGVlZCxhY2N1cmFjeTppLmFjY3VyYWN5LGFkZHJlc3M6dC5hZGRyZXNzLGVyck1zZzoiZ2V0TG9jYXRpb246b2sifSl9dmFyIGNjPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9wZW5Mb2NhdGlvbjpmdW5jdGlvbihlKXt2YXIgdD1vZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSxuPW9nLndlYnZpZXcuY3JlYXRlKCJfd3d3L19fdW5pYXBwb3BlbmxvY2F0aW9uLmh0bWwiLGdvLHt0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCx0aXRsZUNvbG9yOiIjZmZmZmZmIix0aXRsZVRleHQ6IiIsdGl0bGVTaXplOiIxN3B4Iix0eXBlOiJ0cmFuc3BhcmVudCJ9LHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSx7X191bmlhcHBfdHlwZToibWFwIixfX3VuaWFwcF9zdGF0dXNiYXJfc3R5bGU6dCwidW5pLWFwcCI6Im5vbmUifSk7cmV0dXJuImxpZ2h0Ij09PXQmJihvZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxuLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P29nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKToiZW5kIiE9PXR8fG58fG9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpfSkpLG4uc2hvdyh0YSxuYSxmdW5jdGlvbigpe24uZXZhbEpTKCJfX29wZW5Mb2NhdGlvbl9fKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiKX0pLHtlcnJNc2c6Im9wZW5Mb2NhdGlvbjpvayJ9fX0pO3ZhciB1Yz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuTG9jYXRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJGEoe3VybDoiX191bmlhcHBvcGVubG9jYXRpb24iLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxlLHtsb2NhbGU6c3QoKX0pLHN0eWxlOnt0aXRsZU5WaWV3Ont0eXBlOiJ0cmFuc3BhcmVudCJ9LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25DbG9zZTpmdW5jdGlvbigpe2ZpKHQse2Vyck1zZzoib3BlbkxvY2F0aW9uOmZhaWwgY2FuY2VsIn0pfX0pLHtlcnJNc2c6Im9wZW5Mb2NhdGlvbjpvayJ9fX0pO3ZhciBsYz1bXSxkYz1bXSxmYz0hMSxwYz0wO3ZhciBoYyx2YyxnYyxtYyx5Yzt2YXIgX2MsYmMsd2M9QmkoImlvIiwiZ2V0SW1hZ2VJbmZvIixmdW5jdGlvbihlKXtyZXR1cm4gZS5zYXZlUGF0aD1lLmZpbGVuYW1lPXlvKyIvZG93bmxvYWQvIixlfSksa2M9QmkoImlvIiwiZ2V0VmlkZW9JbmZvIixmdW5jdGlvbihlKXtyZXR1cm4gZS5maWxlUGF0aD1lLnNyYyxlfSxmdW5jdGlvbihlKXtyZXR1cm57b3JpZW50YXRpb246ZS5vcmllbnRhdGlvbix0eXBlOmUudHlwZSxkdXJhdGlvbjplLmR1cmF0aW9uLHNpemU6ZS5zaXplLzEwMjQsaGVpZ2h0OmUuaGVpZ2h0LHdpZHRoOmUud2lkdGgsZnBzOmUuZnBzfHwzMCxiaXRyYXRlOmUuYml0cmF0ZX19KTt2YXIgU2M9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD17fSksaGkoIm9uUmVjb3JkZXJTdGF0ZUNoYW5nZSIsT2JqZWN0LmFzc2lnbih7c3RhdGU6ZX0sdCkpfSx4Yz17c3RhcnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmR1cmF0aW9uO3ZvaWQgMD09PW4mJihuPTZlNCk7dmFyIHI9ZS5zYW1wbGVSYXRlLGk9KGUubnVtYmVyT2ZDaGFubmVscyxlLmVuY29kZUJpdFJhdGUsZS5mb3JtYXQpO3ZvaWQgMD09PWkmJihpPSJtcDMiKTtlLmZyYW1lU2l6ZTt2YXIgbz1lLmF1ZGlvU291cmNlO2lmKHZvaWQgMD09PW8mJihvPSJhdXRvIiksX2MpcmV0dXJuIFNjKCJzdGFydCIpOyhfYz1vZy5hdWRpby5nZXRSZWNvcmRlcigpKS5yZWNvcmQoe2Zvcm1hdDppLHNhbXBsZXJhdGU6cixmaWxlbmFtZTp5bysiL3JlY29yZGVyLyJ9LGZ1bmN0aW9uKGUpe3JldHVybiBTYygic3RvcCIse3RlbXBGaWxlUGF0aDplfSl9LGZ1bmN0aW9uKGUpe3JldHVybiBTYygiZXJyb3IiLHtlcnJNc2c6ZS5tZXNzYWdlfSl9KSxiYz1zZyhmdW5jdGlvbigpe3hjLnN0b3AoKX0sbiksU2MoInN0YXJ0Iil9LHN0b3A6ZnVuY3Rpb24oKXtfYyYmKF9jLnN0b3AoKSxfYz0hMSxiYyYmY2coYmMpKX0scGF1c2U6ZnVuY3Rpb24oKXtfYyYmU2MoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHBhdXNlIn0pfSxyZXN1bWU6ZnVuY3Rpb24oKXtfYyYmU2MoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHJlc3VtZSJ9KX19O3ZhciBDYz0wLFRjPXt9LE9jPWZ1bmN0aW9uKGUpe2hpKCJvbkRvd25sb2FkVGFza1N0YXRlQ2hhbmdlIixlKX07dmFyIEVjPTAsSWM9e30sQWM9ZnVuY3Rpb24oZSl7aGkoIm9uUmVxdWVzdFRhc2tTdGF0ZUNoYW5nZSIsZSksZGVsZXRlIEljW0VjXX0sJGM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZVsiU2V0LUNvb2tpZSJdfHxlWyJzZXQtY29va2llIl0sbj1bXTtpZighdClyZXR1cm5bXTsiWyI9PT10WzBdJiYiXSI9PT10W3QubGVuZ3RoLTFdJiYodD10LnNsaWNlKDEsLTEpKTtmb3IodmFyIHI9dC5zcGxpdCgiOyIpLGk9MDtpPHIubGVuZ3RoO2krKyktMSE9PXJbaV0uaW5kZXhPZigiRXhwaXJlcz0iKXx8LTEhPT1yW2ldLmluZGV4T2YoImV4cGlyZXM9Iik/bi5wdXNoKHJbaV0ucmVwbGFjZSgiLCIsIiIpKTpuLnB1c2gocltpXSk7cmV0dXJuIG49bi5qb2luKCI7Iikuc3BsaXQoIiwiKX07ZnVuY3Rpb24gUGMoYyxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS51cmwsbj1lLmRhdGEscj1lLmhlYWRlcixpPWUubWV0aG9kO3ZvaWQgMD09PWkmJihpPSJHRVQiKTt2YXIgdT1lLnJlc3BvbnNlVHlwZSxvPWUuc3NsVmVyaWZ5O3ZvaWQgMD09PW8mJihvPSEwKTt2YXIgYT1lLmZpcnN0SXB2NDt2b2lkIDA9PT1hJiYoYT0hMSk7dmFyIHM9ZS50bHMsbD1lLnRpbWVvdXQ7dm9pZCAwPT09bCYmKGw9ZGcubmV0d29ya1RpbWVvdXQmJmRnLm5ldHdvcmtUaW1lb3V0LnJlcXVlc3R8fDZlNCk7dmFyIGQsZixwPXBpKCJzdHJlYW0iKSxoPXt9LHY9ITE7Zm9yKHZhciBnIGluIHIpaWYodnx8ImNvbnRlbnQtdHlwZSIhPT1nLnRvTG93ZXJDYXNlKCkpaFtnXT1yW2ddO2Vsc2UgaWYodj0hMCxoWyJDb250ZW50LVR5cGUiXT1yW2ddLCJHRVQiIT09aSYmMD09PXJbZ10uaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJiJzdHJpbmciIT10eXBlb2YgbiYmIShuIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXt2YXIgbT1bXTtmb3IodmFyIHkgaW4gbilrKG4seSkmJm0ucHVzaChlbmNvZGVVUklDb21wb25lbnQoeSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChuW3ldKSk7bj1tLmpvaW4oIiYiKX12fHwiUE9TVCIhPT1pfHwoaFsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIpLGwmJihkPXNnKGZ1bmN0aW9uKCl7Zj0hMCxBYyh7cmVxdWVzdFRhc2tJZDpjLHN0YXRlOiJmYWlsIixzdGF0dXNDb2RlOjAsZXJyTXNnOiJ0aW1lb3V0In0pfSxsKzIwMCkpO3ZhciBfLGI9e21ldGhvZDppLHVybDp0LnRyaW0oKSxoZWFkZXJzOmgsdHlwZToiYXJyYXlidWZmZXIiPT09dT8iYmFzZTY0IjoidGV4dCIsdGltZW91dDpsfHw2ZTUsc3NsVmVyaWZ5OiFvLGZpcnN0SXB2NDphLHRsczpzfTsiR0VUIiE9PWkmJigiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09dG9TdHJpbmcuY2FsbChuKT9fPSEwOmIuYm9keT0ic3RyaW5nIj09dHlwZW9mIG4/bjpKU09OLnN0cmluZ2lmeShuKSk7dmFyIHc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vayxuPWUuc3RhdHVzLHI9ZS5kYXRhLGk9ZS5oZWFkZXJzLG89ZS5lcnJvck1zZztpZighZil7ZCYmY2coZCk7dmFyIGE9bjtpZigwPGEpQWMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToic3VjY2VzcyIsZGF0YTp0JiYiYXJyYXlidWZmZXIiPT09dT9faShyKTpyLHN0YXR1c0NvZGU6YSxoZWFkZXI6aSxjb29raWVzOiRjKGkpfSk7ZWxzZXt2YXIgcz0iYWJvcnQgc3RhdHVzQ29kZToiK2E7byYmKHM9cysiICIrbyksQWMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTphLGVyck1zZzpzfSl9fX07dHJ5e18/cC5mZXRjaFdpdGhBcnJheUJ1ZmZlcih7IkB0eXBlIjoiYmluYXJ5IixiYXNlNjQ6Ymkobil9LGIsdyk6cC5mZXRjaChiLHcpLEljW2NdPXthYm9ydDpmdW5jdGlvbigpe2Y9ITAsZCYmY2coZCksQWMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTowLGVyck1zZzoiYWJvcnQifSl9fX1jYXRjaChlKXtyZXR1cm57cmVxdWVzdFRhc2tJZDpjLGVyck1zZzoiY3JlYXRlUmVxdWVzdFRhc2s6ZmFpbCJ9fXJldHVybntyZXF1ZXN0VGFza0lkOmMsZXJyTXNnOiJjcmVhdGVSZXF1ZXN0VGFzazpvayJ9fXZhciBNYyxqYz17fSxMYz1mdW5jdGlvbihlKXtoaSgib25Tb2NrZXRUYXNrU3RhdGVDaGFuZ2UiLGUpfTt2YXIgQmM9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD17fSk7dmFyIG49dC51cmwscj0odC5kYXRhLHQuaGVhZGVyKSxpPSh0Lm1ldGhvZCx0LnByb3RvY29scyksbz1NY3x8KChNYz1waSgidW5pLXdlYlNvY2tldCIpKS5vbm9wZW4oZnVuY3Rpb24oZSl7TGMoe3NvY2tldFRhc2tJZDplLmlkLHN0YXRlOiJvcGVuIn0pfSksTWMub25tZXNzYWdlKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTtMYyh7c29ja2V0VGFza0lkOmUuaWQsc3RhdGU6Im1lc3NhZ2UiLGRhdGE6Im9iamVjdCI9PXR5cGVvZiB0P19pKHQuYmFzZTY0KTp0fSl9KSxNYy5vbmVycm9yKGZ1bmN0aW9uKGUpe0xjKHtzb2NrZXRUYXNrSWQ6ZS5pZCxzdGF0ZToiZXJyb3IiLGVyck1zZzplLmRhdGF9KX0pLE1jLm9uY2xvc2UoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZCxuPWUuY29kZSxyPWUucmVhc29uO2RlbGV0ZSBqY1t0XSxMYyh7c29ja2V0VGFza0lkOnQsc3RhdGU6ImNsb3NlIixjb2RlOm4scmVhc29uOnJ9KX0pLE1jKTtyZXR1cm4gby5XZWJTb2NrZXQoe2lkOmUsdXJsOm4scHJvdG9jb2w6QXJyYXkuaXNBcnJheShpKT9pLmpvaW4oIiwiKTppLGhlYWRlcjpyfSksamNbZV09byx7c29ja2V0VGFza0lkOmUsZXJyTXNnOiJjcmVhdGVTb2NrZXRUYXNrOm9rIn19O3ZhciBOYz0wLERjPXt9LFJjPWZ1bmN0aW9uKGUpe2hpKCJvblVwbG9hZFRhc2tTdGF0ZUNoYW5nZSIsZSl9O3ZhciBGYyxVYz17b2F1dGg6ZnVuY3Rpb24odCl7b2cub2F1dGguZ2V0U2VydmljZXMoZnVuY3Rpb24oZSl7dmFyIG49W107ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7bi5wdXNoKHQpfSksdChudWxsLG4sZSl9LGZ1bmN0aW9uKGUpe3QoZSl9KX0sc2hhcmU6ZnVuY3Rpb24odCl7b2cuc2hhcmUuZ2V0U2VydmljZXMoZnVuY3Rpb24oZSl7dmFyIG49W107ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7bi5wdXNoKHQpfSksdChudWxsLG4sZSl9LGZ1bmN0aW9uKGUpe3QoZSl9KX0scGF5bWVudDpmdW5jdGlvbih0KXtvZy5wYXltZW50LmdldENoYW5uZWxzKGZ1bmN0aW9uKGUpe3ZhciBuPVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmlkO24ucHVzaCh0KX0pLHQobnVsbCxuLGUpfSxmdW5jdGlvbihlKXt0KGUpfSl9LHB1c2g6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09aWd8fHZvaWQgMCE9PW9nKXt2YXIgdD1vZy5wdXNoLmdldENsaWVudEluZm8oKTtlKG51bGwsW3QuaWRdLFt0XSl9ZWxzZSBlKG51bGwsW10pfX07ZnVuY3Rpb24gemMoaSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7b2cub2F1dGguZ2V0U2VydmljZXMoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkPT09aX0pO3Q/bih0KTpyKG5ldyBFcnJvcigicHJvdmlkZXIgbm90IGZpbmQiKSl9LHIpfSl9ZnVuY3Rpb24gVmMobixyLGUpe3ZvaWQgMD09PWUmJihlPSEwKTt2YXIgaT1uLnByb3ZpZGVyfHwid2VpeGluIixvPUtjKHIsImxvZ2luIixlKSxhPSJhcHBsZSI9PT1pLHM9YT97c2NvcGU6ImVtYWlsIn06bi51bml2ZXJpZnlTdHlsZT97dW5pdmVyaWZ5U3R5bGU6ZnVuY3Rpb24oZSxyKXtUKGUpJiZUKGUuYnV0dG9ucykmJiJBcnJheSI9PT1wKGUuYnV0dG9ucy5saXN0KSYmZS5idXR0b25zLmxpc3QuZm9yRWFjaChmdW5jdGlvbih0LG4pe2UuYnV0dG9ucy5saXN0W25dLm9uY2xpY2s9ZnVuY3Rpb24oKXt2YXIgZT17Y29kZToiMzAwMDgiLG1lc3NhZ2U6IueUqOaIt+eCueWHu+S6huiHquWumuS5ieaMiemSriIsaW5kZXg6bixwcm92aWRlcjp0LnByb3ZpZGVyfTtUKEZjKT9GYy5fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljayhlKTpIYygpLnRoZW4oZnVuY3Rpb24oKXtyKGUpfSl9fSk7cmV0dXJuIGV9KG4udW5pdmVyaWZ5U3R5bGUsbyl9Ont9LGM9ZT9maTpNLmludm9rZTt6YyhpKS50aGVuKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtuLm9ubHlBdXRob3JpemUmJiJ3ZWl4aW4iPT09aT9lLmF1dGhvcml6ZShmdW5jdGlvbihlKXt2YXIgdD1lLmNvZGU7YyhyLHtjb2RlOnQsYXV0aFJlc3VsdDoiIixlcnJNc2c6ImxvZ2luOm9rIn0pfSxvKTplLmxvZ2luKGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LmF1dGhSZXN1bHQsbj1lLnRhcmdldC5hcHBsZUluZm87YyhyLHtjb2RlOnQuY29kZSxhdXRoUmVzdWx0OnQsYXBwbGVJbmZvOm4sZXJyTXNnOiJsb2dpbjpvayJ9KX0sbyxzKX1hfHwidW5pdmVyaWZ5Ij09PWk/dCgpOmUubG9nb3V0KHQsdCl9KS5jYXRjaChvKX1mdW5jdGlvbiBxYyhhLHMpe3ZhciBjPWEucHJvdmlkZXJ8fCJ3ZWl4aW4iLGU9TGkocywib3BlcmF0ZVdYRGF0YSIpO3pjKGMpLnRoZW4oZnVuY3Rpb24obyl7by5nZXRVc2VySW5mbyhmdW5jdGlvbihlKXt2YXIgdDtpZigid2VpeGluIj09PWMpe3ZhciBuPW8udXNlckluZm87dD17b3BlbklkOm4ub3BlbmlkLG5pY2tOYW1lOm4ubmlja25hbWUsZ2VuZGVyOm4uc2V4LGNpdHk6bi5jaXR5LHByb3ZpbmNlOm4ucHJvdmluY2UsY291bnRyeTpuLmNvdW50cnksYXZhdGFyVXJsOm4uaGVhZGltZ3VybCx1bmlvbklkOm4udW5pb25pZH19ZWxzZSBpZigiYXBwbGUiPT09Yyl7dmFyIHI9by5hcHBsZUluZm87dD17b3BlbklkOnIudXNlcixmdWxsTmFtZTpyLmZ1bGxOYW1lLGVtYWlsOnIuZW1haWwsYXV0aG9yaXphdGlvbkNvZGU6ci5hdXRob3JpemF0aW9uQ29kZSxpZGVudGl0eVRva2VuOnIuaWRlbnRpdHlUb2tlbixyZWFsVXNlclN0YXR1czpyLnJlYWxVc2VyU3RhdHVzfX1lbHNlKHQ9by51c2VySW5mbykub3BlbklkPXQub3BlbklkfHx0Lm9wZW5pZHx8by5hdXRoUmVzdWx0Lm9wZW5pZCx0Lm5pY2tOYW1lPXQubmlja05hbWV8fHQubmlja25hbWUsdC5hdmF0YXJVcmw9dC5hdmF0YXJVcmx8fHQuaGVhZGltZ3VybDt2YXIgaT17ZXJyTXNnOiJvcGVyYXRlV1hEYXRhOm9rIn07YS5kYXRhJiYid2ViYXBpX2dldHVzZXJpbmZvIj09PWEuZGF0YS5hcGlfbmFtZT9pLmRhdGE9e2RhdGE6SlNPTi5zdHJpbmdpZnkodCkscmF3RGF0YToiIixzaWduYXR1cmU6IiIsZW5jcnlwdGVkRGF0YToiIixpdjoiIn06aS51c2VySW5mbz10LGZpKHMsaSl9LGUpfSkuY2F0Y2goZnVuY3Rpb24oKXtmaShzLHtlcnJNc2c6Im9wZXJhdGVXWERhdGE6ZmFpbCDor7flhYjosIPnlKggdW5pLmxvZ2luIn0pfSl9ZnVuY3Rpb24gV2MoZSx0LG4pe3ZhciByPVljKHQsInByZUxvZ2luIixuKSxpPUtjKHQsInByZUxvZ2luIixuKTt6YyhlLnByb3ZpZGVyKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlLnByZUxvZ2luKHIsaSl9KS5jYXRjaChpKX1mdW5jdGlvbiBIYygpe3JldHVybiB6YygidW5pdmVyaWZ5IikudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5jbG9zZUF1dGhWaWV3KCl9KX1mdW5jdGlvbiBHYyhlLHQsbil7dmFyIHI9WWModCwiZ2V0Q2hlY2tCb3hTdGF0ZSIsbiksaT1LYyh0LCJnZXRDaGVja0JveFN0YXRlIixuKTt0cnl7emMoInVuaXZlcmlmeSIpLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRDaGVja0JveFN0YXRlKCk7cih7c3RhdGU6dH0pfSl9Y2F0Y2goZSl7aShlKX19dmFyIFhjLEpjPWZ1bmN0aW9uKCl7dGhpcy5wcm92aWRlcj0idW5pdmVyaWZ5Iix0aGlzLmV2ZW50TmFtZT0iYXBpLnVuaXZlcmlmeUJ1dHRvbnNDbGljayJ9O2Z1bmN0aW9uIFljKHQsbixlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITApLGU/amkodCxuKTpmdW5jdGlvbihlKXtNLmludm9rZSh0LE9iamVjdC5hc3NpZ24oe30sZSx7ZXJyTXNnOm4rIjpvayJ9KSl9fWZ1bmN0aW9uIEtjKHIsaSxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITApLGU/TGkocixpKTpmdW5jdGlvbihlKXt2YXIgdD1lLmNvZGU7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIG49ZS5tZXNzYWdlO00uaW52b2tlKHIse2Vyck1zZzppKyI6ZmFpbCAiKyhufHwiIiksZXJyQ29kZTp0LGNvZGU6dH0pfX1KYy5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtIYygpfSxKYy5wcm90b3R5cGUubG9naW49ZnVuY3Rpb24oZSl7dGhpcy5fd2FycChmdW5jdGlvbihlLHQpe3JldHVybiBWYyhlLHQsITEpfSxlKX0sSmMucHJvdG90eXBlLmdldENoZWNrQm94U3RhdGU9ZnVuY3Rpb24oZSl7dGhpcy5fd2FycChmdW5jdGlvbihlLHQpe3JldHVybiBHYygwLHQsITEpfSxlKX0sSmMucHJvdG90eXBlLnByZUxvZ2luPWZ1bmN0aW9uKGUpe3RoaXMuX3dhcnAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gV2MoZSx0LCExKX0sZSl9LEpjLnByb3RvdHlwZS5vbkJ1dHRvbnNDbGljaz1mdW5jdGlvbihlKXthZy5vbih0aGlzLmV2ZW50TmFtZSxlKX0sSmMucHJvdG90eXBlLm9mZkJ1dHRvbnNDbGljaz1mdW5jdGlvbihlKXthZy5vZmYodGhpcy5ldmVudE5hbWUsZSl9LEpjLnByb3RvdHlwZS5fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljaz1mdW5jdGlvbihlKXthZy5lbWl0KHRoaXMuZXZlbnROYW1lLGUpfSxKYy5wcm90b3R5cGUuX3dhcnA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTS53YXJwKGUpKHRoaXMuX2dldE9wdGlvbnModCkpfTt2YXIgWmMsUWM9IShKYy5wcm90b3R5cGUuX2dldE9wdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxPYmplY3QuYXNzaWduKHt9LGUse3Byb3ZpZGVyOnRoaXMucHJvdmlkZXJ9KX0pLGV1PSExO2Z1bmN0aW9uIHR1KGUpe3JldHVybiBpZy5yZXF1aXJlTW9kdWxlKGUpfXZhciBudT17MDp7bmFtZToid2ViIix0aXRsZToi5Zu+5paHIn0sMTp7bmFtZToidGV4dCIsdGl0bGU6Iue6r+aWh+WtlyJ9LDI6e25hbWU6ImltYWdlIix0aXRsZToi57qv5Zu+54mHIn0sMzp7bmFtZToibXVzaWMiLHRpdGxlOiLpn7PkuZAifSw0OntuYW1lOiJ2aWRlbyIsdGl0bGU6IuinhumikSJ9LDU6e25hbWU6Im1pbmlQcm9ncmFtIix0aXRsZToi5bCP56iL5bqPIn19LHJ1PWZ1bmN0aW9uKGUsdCxuKXtlLnR5cGU9ZS50eXBlfHwwO3ZhciByPWUucHJvdmlkZXIsaT1lLnR5cGUsbz1lLnRpdGxlLGE9ZS5zdW1tYXJ5LHM9ZS5ocmVmLGM9ZS5pbWFnZVVybCx1PWUubWVkaWFVcmwsbD1lLnNjZW5lLGQ9ZS5taW5pUHJvZ3JhbSxmPWUub3BlbkN1c3RvbWVyU2VydmljZUNoYXQscD1lLmNvcnBpZCxoPWUuY3VzdG9tZXJVcmw7InN0cmluZyI9PXR5cGVvZiBjJiZjJiYoYz1UaShjKSk7dmFyIHY9bnVbaSsiIl07aWYodil7dmFyIGc9e3Byb3ZpZGVyOnIsdHlwZTp2Lm5hbWUsdGl0bGU6byxjb250ZW50OmEsaHJlZjpzLHBpY3R1cmVzOltjXSx0aHVtYnM6W2NdLG1lZGlhOnUsbWluaVByb2dyYW06ZCxleHRyYTp7c2NlbmU6bH0sb3BlbkN1c3RvbWVyU2VydmljZUNoYXQ6Zixjb3JwaWQ6cCx1cmw6aH07cmV0dXJuIndlaXhpbiIhPT1yfHwxIT09aSYmMiE9PWl8fGRlbGV0ZSBnLnRodW1icyxnfXJldHVybiLliIbkuqvlj4LmlbAgdHlwZSDkuI3mraPnoa4ifSxpdT1mdW5jdGlvbihlLHQsbixyKXt2b2lkIDA9PT1yJiYocj0ic2hhcmUiKTt2YXIgaT1MaShuLHIpLG89dC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdD8ib3BlbkN1c3RvbWVyU2VydmljZUNoYXQiOiJzZW5kIjt0cnl7ZVtvXSh0LGZ1bmN0aW9uKCl7Zmkobix7ZXJyTXNnOnIrIjpvayJ9KX0saSl9Y2F0Y2goZSl7aSh7bWVzc2FnZTp0LnByb3ZpZGVyKyIgIitvKyIg5pa55rOV6LCD55So5aSx6LSlIn0pfX07ZnVuY3Rpb24gb3UobixyLGkpe3ZvaWQgMD09PWkmJihpPSJzaGFyZSIpLG49cnUobik7dmFyIG89TGkocixpKTtpZigic3RyaW5nIj09dHlwZW9mIG4pcmV0dXJuIGZpKHIse2Vyck1zZzppKyI6ZmFpbCAiK259KTt2YXIgYT1uLnByb3ZpZGVyO29nLnNoYXJlLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PWF9KTt0P3QuYXV0aGVudGljYXRlZD9pdSh0LG4scik6dC5hdXRob3JpemUoZnVuY3Rpb24oKXtyZXR1cm4gaXUodCxuLHIpfSxvKTpmaShyLHtlcnJNc2c6aSsiOmZhaWwgc2VydmljZSBub3QgZm91bmQifSl9LG8pfWZ1bmN0aW9uIGF1KG4pe24uJHByb2Nlc3NlZD0hMCxuLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKGUpe29nLndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3KHt0eXBlOiJVbmlBcHBTdWJOVnVlIixkYXRhOmV9LG4uaWQpfTt2YXIgcj1bXTtpZihuLm9uTWVzc2FnZT1mdW5jdGlvbihlKXtyLnB1c2goZSl9LG4uJGNvbnN1bWVNZXNzYWdlPWZ1bmN0aW9uKHQpe3IuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX0pfSxuLl9fdW5pYXBwX21hc2tfaWQpe3ZhciBpPW4uX191bmlhcHBfbWFzayxvPSIwIj09PW4uX191bmlhcHBfbWFza19pZD97c2V0U3R5bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXNrO3R1KCJ1bmktdGFidmlldyIpLnNldE1hc2soe2NvbG9yOnR9KX19Om9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQobi5fX3VuaWFwcF9tYXNrX2lkKSxhPW4uc2hvdyxzPW4uaGlkZSxjPW4uY2xvc2UsdT1mdW5jdGlvbigpe28uc2V0U3R5bGUoe21hc2s6Im5vbmUifSl9O24uc2hvdz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4gby5zZXRTdHlsZSh7bWFzazppfSksYS5hcHBseShuLGUpfSxuLmhpZGU9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIHUoKSxzLmFwcGx5KG4sZSl9LG4uY2xvc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIHUoKSxyPVtdLGMuYXBwbHkobixlKX19fWZ1bmN0aW9uIHN1KGUpe3ZhciB0PW9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoZSk7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBmaW5kIFN1Yk5WdWUsIGlkPSIrZSk7dCYmIXQuJHByb2Nlc3NlZCYmYXUodCk7dmFyIG49dC5zZXRTdHlsZSxyPW9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodC5fX3VuaWFwcF9tYXNrX2lkKTtyZXR1cm4gdC5zZXRTdHlsZT1mdW5jdGlvbihlKXtlJiZlLm1hc2smJihyJiZyLnNldFN0eWxlKHttYXNrOmUubWFza30pLGRlbGV0ZSBlLm1hc2spLG4uY2FsbCh0aGlzLGUpfSx0fXZhciBjdT1bXTtmdW5jdGlvbiB1dShlLHQsbil7cmV0dXJuIGlnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5zZW5kTmF0aXZlRXZlbnQoZSx0LG4pfWFnLm9uKCJhcGkudW5pTVBOYXRpdmVFdmVudCIsZnVuY3Rpb24odCl7Y3UuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHQuZXZlbnQsdC5kYXRhKX0pfSk7dmFyIGx1PXV1O3ZhciBkdSxmdT0xLHB1PXt9O2Z1bmN0aW9uIGh1KCl7cmV0dXJuIGR1fHwoZHU9cGcucmVxdWlyZU5hdGl2ZVBsdWdpbigiVVRTLVByb3h5IikpLGR1fWZ1bmN0aW9uIHZ1KGUsdCxuLHIsaSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCLov5Tlm57lgLzkuLrvvJoiK0pTT04uc3RyaW5naWZ5KHQpKyLvvJvor7fmsYLlj4LmlbDkuLrvvJoiK0pTT04uc3RyaW5naWZ5KGUpKTtpZihsKHQpKXRyeXt0PUpTT04ucGFyc2UodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKCJKU09OLnBhcnNlKCIrdCsiKTogIitlKX1pZih0LmVyck1zZyl0aHJvdyBuZXcgRXJyb3IodC5lcnJNc2cpO2lmKG4mJiJpbnRlcmZhY2UiPT09bi50eXBlJiYibnVtYmVyIj09dHlwZW9mIHQucGFyYW1zKXtpZighdC5wYXJhbXMpcmV0dXJuIG51bGw7aWYodC5wYXJhbXM9PT1yJiZpKXJldHVybiBpO2lmKEN1W24ub3B0aW9uc10pcmV0dXJuIG5ldyh3dSh5KHtpbnN0YW5jZUlkOnQucGFyYW1zfSxDdVtuLm9wdGlvbnNdKSkpfXJldHVybiB0LnBhcmFtc31mdW5jdGlvbiBndShlKXtpZihlLmVyck1zZyl0aHJvdyBuZXcgRXJyb3IoZS5lcnJNc2cpO3JldHVybiBkZWxldGUgZS5lcnJNc2csdnUoZSxodSgpLmludm9rZVN5bmMoZSxmdW5jdGlvbigpe30pKX1mdW5jdGlvbiBtdShuLGUsaSxvKXt2YXIgdD1lLm1vZHVsZU5hbWUscj1lLm1vZHVsZVR5cGUsYT1lLnBhY2thZ2Uscz1lLmNsYXNzLGM9ZS5uYW1lLHU9ZS5tZXRob2QsbD1lLmNvbXBhbmlvbixkPWUucGFyYW1zLGY9ZS5yZXR1cm4scD1lLmVyck1zZyxoPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQsbj1lLm5hbWUscj1lLnBhcmFtcyxpPWUua2VlcEFsaXZlLG89cHVbdF07bz8oby5hcHBseSh2b2lkIDAsciksaXx8ZGVsZXRlIHB1W3RdKTpjb25zb2xlLmVycm9yKCIiK2ErcysiLiIrYysiICIrbisiIGlzIG5vdCBmb3VuZCIpfSx2PWk/e21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOnIsaWQ6aSxuYW1lOmMsbWV0aG9kOmR9Onttb2R1bGVOYW1lOnQsbW9kdWxlVHlwZTpyLHBhY2thZ2U6YSxjbGFzczpzLG5hbWU6dXx8Yyxjb21wYW5pb246bCxtZXRob2Q6ZH07cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2lmKHApdGhyb3cgbmV3IEVycm9yKHApO3ZhciByPXkoe30sdix7cGFyYW1zOmUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiB0KG4pe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXt2YXIgZT1PYmplY3Qua2V5cyhwdSkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gcHVbZV09PT1ufSkscj1lP3BhcnNlSW50KGUpOmZ1Kys7cmV0dXJuIHB1W3JdPW4scn1yZXR1cm4gVChuKSYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPXQobltlXSl9KSxufShlKX0pfSk7cmV0dXJuIG4/bmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtodSgpLmludm9rZUFzeW5jKHIsZnVuY3Rpb24oZSl7InJldHVybiIhPT1lLnR5cGU/aChlKTplLmVyck1zZz9uKGUuZXJyTXNnKTp0KGUucGFyYW1zKX0pfSk6dnUocixodSgpLmludm9rZVN5bmMocixoKSxmLGksbyl9fWZ1bmN0aW9uIHl1KGUsdCl7cmV0dXJuIHQubWFpbiYmIXQubWV0aG9kJiZTdSgpJiYodC5tZXRob2Q9InNfIit0Lm5hbWUpLG11KGUsdCwwKX12YXIgX3U9eXU7ZnVuY3Rpb24gYnUoZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJmsodCxlKyJCeUpzIik/ZSsiQnlKcyI6ZX1mdW5jdGlvbiB3dShlKXt2YXIgbixmPWUubW9kdWxlTmFtZSxwPWUubW9kdWxlVHlwZSx0PWUucGFja2FnZSxyPWUuY2xhc3MsaD1lLm1ldGhvZHMsdj1lLnByb3BzLGc9ZS5lcnJNc2csbT17bW9kdWxlTmFtZTpmLG1vZHVsZVR5cGU6cCxwYWNrYWdlOnQsY2xhc3M6cixlcnJNc2c6Z30saT1bXSxzPXt9LGM9W10sbz0hMTt2b2lkIDAhPT1lLmluc3RhbmNlSWQ/KG89ITAsbj1lLmluc3RhbmNlSWQpOihpPWUuY29uc3RydWN0b3IucGFyYW1zLHM9ZS5zdGF0aWNNZXRob2RzLGM9ZS5zdGF0aWNQcm9wcyksU3UoKSYmaS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiJVVFNDYWxsYmFjayI9PT1lLnR5cGV8fDA8ZS50eXBlLmluZGV4T2YoIkpTT05PYmplY3QiKX0pJiZpLnB1c2goe25hbWU6Il9ieUpzIix0eXBlOiJib29sZWFuIn0pO3ZhciB1PXt9O3JldHVybiBuZXcgUHJveHkoZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07aWYodGhpcy5fX2luc3RhbmNlSWQ9MCxnKXRocm93IG5ldyBFcnJvcihnKTt2YXIgdT17fTtpZihvPyJudW1iZXIiPT10eXBlb2YgbiYmKHRoaXMuX19pbnN0YW5jZUlkPW4pOnRoaXMuX19pbnN0YW5jZUlkPW11KCExLHkoe25hbWU6ImNvbnN0cnVjdG9yIixwYXJhbXM6aX0sbSksMCkuYXBwbHkobnVsbCxlKSwhdGhpcy5fX2luc3RhbmNlSWQpdGhyb3cgbmV3IEVycm9yKCJuZXcgIityKyIgaXMgZmFpbGVkIik7dmFyIGw9dGhpcyxkPW5ldyBQcm94eShsLHtnZXQ6ZnVuY3Rpb24oZSx0KXtpZigiX192X3NraXAiPT09dClyZXR1cm4hMDtpZighdVt0XSlpZih0PWJ1KHQsaCksayhoLHQpKXt2YXIgbj1oW3RdLHI9bi5hc3luYyxpPW4ucGFyYW1zLG89bi5yZXR1cm47dVt0XT0oYT0hIXIscz15KHtuYW1lOnQscGFyYW1zOmkscmV0dXJuOm99LG0pLGM9bC5fX2luc3RhbmNlSWQsbXUoYSxzLGMsZCkpfWVsc2UgaWYodi5pbmNsdWRlcyh0KSlyZXR1cm4gZ3Uoe21vZHVsZU5hbWU6Zixtb2R1bGVUeXBlOnAsaWQ6bC5fX2luc3RhbmNlSWQsbmFtZTp0LGVyck1zZzpnfSk7dmFyIGEscyxjO3JldHVybiB1W3RdfX0pO3JldHVybiBkfSx7Z2V0OmZ1bmN0aW9uKGUsdCxuKXtpZih0PWJ1KHQscyksayhzLHQpKXtpZighdVt0XSl7dmFyIHI9c1t0XSxpPXIuYXN5bmMsbz1yLnBhcmFtcyxhPXIucmV0dXJuO3VbdF09eXUoISFpLHkoe25hbWU6dCxjb21wYW5pb246ITAscGFyYW1zOm8scmV0dXJuOmF9LG0pKX1yZXR1cm4gdVt0XX1yZXR1cm4gYy5pbmNsdWRlcyh0KT9ndSh5KHtuYW1lOnQsY29tcGFuaW9uOiEwfSxtKSk6UmVmbGVjdC5nZXQoZSx0LG4pfX0pfWZ1bmN0aW9uIGt1KCl7cmV0dXJuIHZvaWQgMCE9PW9nJiYiQW5kcm9pZCI9PT1vZy5vcy5uYW1lfWZ1bmN0aW9uIFN1KCl7cmV0dXJuIWt1KCl9ZnVuY3Rpb24geHUoZSx0LG4pe3JldHVybiBrdSgpP3Q6IlVUU1NESyIrKG4/Ik1vZHVsZXMiOiIiKSttKGUpK20odCl9dmFyIEN1PXt9O3ZhciBUdT17fTtmdW5jdGlvbiBPdShlLHQsbil7ZVtlLl9fcHJlbG9hZF9fPyJoaWRlIjoiY2xvc2UiXSh0LG4pfWZ1bmN0aW9uIEV1KG4scixlLGksdCl7dm9pZCAwPT09dCYmKHQ9bi5udnVlPzA6MTAwKTt2YXIgbz0oZT12b2lkIDA9PT1lP25hOnBhcnNlSW50KGUpKXx8bmE7c2coZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe2UuX2NhbGxlZHx8KGUuX2NhbGxlZD0hMCxpJiZpKCksbXMoKSl9LHQ9c2coZnVuY3Rpb24oKXtlKCl9LG8rMTUwKTtuLnNob3cocnx8dGEsbyxmdW5jdGlvbigpe2UuX2NhbGxlZHx8Y2codCksZSgpfSl9LHQpfXZhciBJdT0wO2Z1bmN0aW9uIEF1KHQsbixyKXt2YXIgaT12ZygpLG89aS5sZW5ndGgsYT1pW28tMV07MTx0JiZpLnNsaWNlKG8tdCxvLTEpLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe091KGUuJGdldEFwcFdlYnZpZXcoKSwibm9uZSIpfSk7dmFyIGU9ZnVuY3Rpb24oZSl7bj9PdShlLG4scnx8bmEpOiJyZWRpcmVjdCI9PT1hLiRwYWdlLm9wZW5UeXBlP091KGUscmEsbmEpOk91KGUsImF1dG8iKSxpLnNsaWNlKG8tdCxvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRyZW1vdmUoKX0pLG1pKCksYWcuZW1pdCgib25BcHBSb3V0ZSIse3R5cGU6Im5hdmlnYXRlQmFjayJ9KX0scz1hLiRnZXRBcHBXZWJ2aWV3KCk7aWYoIWEuX191bmlhcHBfd2VidmlldylyZXR1cm4gZShzKTshZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNoaWxkcmVuKCk7aWYoIW58fCFuLmxlbmd0aClyZXR1cm4gdCgpO3ZhciByPW4uZmluZChmdW5jdGlvbihlKXtyZXR1cm4gMD09PWUuaWQuaW5kZXhPZihucyl9KXx8blswXTtyLmNhbkJhY2soZnVuY3Rpb24oZSl7ZS5jYW5CYWNrP3IuYmFjaygpOnQoKX0pfShzLGZ1bmN0aW9uKCl7ZShzKX0pfWZ1bmN0aW9uICR1KGUpe3ZhciB0PWUuZnJvbTt2b2lkIDA9PT10JiYodD0ibmF2aWdhdGVCYWNrIik7dmFyIG49ZS5kZWx0YSxyPWUuYW5pbWF0aW9uVHlwZSxpPWUuYW5pbWF0aW9uRHVyYXRpb24sbz12ZygpLGE9b1tvLmxlbmd0aC0xXTtpZighKGEuJHZtJiZhLiR2bS4kb3B0aW9ucy5vbkJhY2tQcmVzcyYmYS4kdm0uX19jYWxsX2hvb2smJmEuJHZtLl9fY2FsbF9ob29rKCJvbkJhY2tQcmVzcyIse2Zyb206dH0pKSlyZXR1cm4gcGcuaGlkZVRvYXN0KCkscGcuaGlkZUxvYWRpbmcoKSxhLiRwYWdlLm1ldGEuaXNRdWl0P0l1P0RhdGUubm93KCktSXU8MmUzJiZvZy5ydW50aW1lLnF1aXQoKTooSXU9RGF0ZS5ub3coKSxvZy5uYXRpdmVVSS50b2FzdChhdCgidW5pLmFwcC5xdWl0IikpLHNnKGZ1bmN0aW9uKCl7SXU9bnVsbH0sMmUzKSk6MT09PWEuJHBhZ2UuaWQmJmRnLnJlYWxFbnRyeVBhZ2VQYXRoPyhkZy5lbnRyeVBhZ2VQYXRoPWRnLnJlYWxFbnRyeVBhZ2VQYXRoLGRlbGV0ZSBkZy5yZWFsRW50cnlQYWdlUGF0aCxwZy5yZUxhdW5jaCh7dXJsOiIvIitkZy5lbnRyeVBhZ2VQYXRofSkpOkF1KG4scixpKSx7ZXJyTXNnOiJuYXZpZ2F0ZUJhY2s6b2sifX12YXIgUHU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMuaWQ9ZSx0aGlzLmxpc3RlbmVyPXt9LHRoaXMuZW1pdENhY2hlPXt9LHQmJk9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24oZSl7bi5vbihlLHRbZV0pfSl9O1B1LnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTt2YXIgcj10aGlzLmxpc3RlbmVyW2VdO2lmKCFyKXJldHVybih0aGlzLmVtaXRDYWNoZVtlXXx8KHRoaXMuZW1pdENhY2hlW2VdPVtdKSkucHVzaCh0KTtyLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5mbi5hcHBseShlLmZuLHQpfSksdGhpcy5saXN0ZW5lcltlXT1yLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4ib25jZSIhPT1lLnR5cGV9KX0sUHUucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCl7dGhpcy5fYWRkTGlzdGVuZXIoZSwib24iLHQpLHRoaXMuX2NsZWFyQ2FjaGUoZSl9LFB1LnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7dGhpcy5fYWRkTGlzdGVuZXIoZSwib25jZSIsdCksdGhpcy5fY2xlYXJDYWNoZShlKX0sUHUucHJvdG90eXBlLm9mZj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMubGlzdGVuZXJbZV07aWYobilpZih0KWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7KW5bcl0uZm49PT10JiYobi5zcGxpY2UociwxKSxyLS0pLHIrKztlbHNlIGRlbGV0ZSB0aGlzLmxpc3RlbmVyW2VdfSxQdS5wcm90b3R5cGUuX2NsZWFyQ2FjaGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lbWl0Q2FjaGVbZV07aWYodClmb3IoOzA8dC5sZW5ndGg7KXRoaXMuZW1pdC5hcHBseSh0aGlzLFtlXS5jb25jYXQodC5zaGlmdCgpKSl9LFB1LnByb3RvdHlwZS5fYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmxpc3RlbmVyW2VdfHwodGhpcy5saXN0ZW5lcltlXT1bXSkpLnB1c2goe2ZuOm4sdHlwZTp0fSl9O3ZhciBNdT0wO2Z1bmN0aW9uIGp1KGUsdCl7dmFyIG49ZS51cmwscj1lLnBhdGgsaT1lLnF1ZXJ5LG89ZS5ldmVudHMsYT1lLmFuaW1hdGlvblR5cGUscz1lLmFuaW1hdGlvbkR1cmF0aW9uO2FnLmVtaXQoIm9uQXBwUm91dGUiLHt0eXBlOiJuYXZpZ2F0ZVRvIixwYXRoOnJ9KTt2YXIgYz0odm9pZCAwPT09ITEmJiEwLG5ldyBQdSgrK011LG8pKTtFdShqcyh7dXJsOm4scGF0aDpyLHF1ZXJ5Omksb3BlblR5cGU6Im5hdmlnYXRlIixldmVudENoYW5uZWw6Y30pLGEscyxmdW5jdGlvbigpe2ZpKHQse2Vyck1zZzoibmF2aWdhdGVUbzpvayIsZXZlbnRDaGFubmVsOmN9KX0pLG1pKCl9ZnVuY3Rpb24gTHUoZSx0KXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLEFycmF5LmlzQXJyYXkoZVt0XSkmJmVbdF0ubGVuZ3RofWZ1bmN0aW9uIEJ1KGUscil7dmFyIHQ9ZS51cmwsbj1lLnBhdGgsaT1lLnF1ZXJ5LG89ZS5leGlzdHMsYT12ZygpLHM9YS5sZW5ndGgtMTtpZigiYmFjayI9PT1vKXt2YXIgYz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dmcoKSxuPXQubGVuZ3RoO24tLTspe3ZhciByPXRbbl07aWYoci4kcGFnZSYmci4kcGFnZS5mdWxsUGF0aD09PWUpcmV0dXJuIG59cmV0dXJuLTF9KHQpO2lmKC0xIT09Yyl7dmFyIHU9cy1jO2lmKDA8dSlyZXR1cm4gJHUoe2RlbHRhOnV9KSx2b2lkIGZpKHIse2Vyck1zZzoicmVkaXJlY3RUbzpvayJ9KX19dmFyIGw9YVtzXTtsJiZsLiRyZW1vdmUoKSxFdShqcyh7dXJsOnQscGF0aDpuLHF1ZXJ5Omksb3BlblR5cGU6InJlZGlyZWN0In0pLCJub25lIiwwLGZ1bmN0aW9uKCl7aWYobCl7dmFyIGU9bC4kZ2V0QXBwV2VidmlldygpO2UuX19wcmVsb2FkX18mJih0PWUsKG49T2JqZWN0LmtleXMoTXMpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIE1zW2VdLmlkPT09dC5pZH0pKSYmZGVsZXRlIE1zW25dKSxlLmNsb3NlKCJub25lIil9dmFyIHQsbjtmaShyLHtlcnJNc2c6InJlZGlyZWN0VG86b2sifSl9KSxtaSgpfXZhciBOdSxEdSxSdSxGdT0iX19UWVBFIixVdT0idW5pLXN0b3JhZ2Uta2V5cyI7ZnVuY3Rpb24genUoZSl7dHJ5e3ZhciB0PSJzdHJpbmciPT10eXBlb2YgZT9KU09OLnBhcnNlKGUpOmUsbj10LnR5cGU7aWYoMDw9WyJvYmplY3QiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwidW5kZWZpbmVkIl0uaW5kZXhPZihuKSl7dmFyIHI9T2JqZWN0LmtleXModCk7aWYoMj09PXIubGVuZ3RoJiYiZGF0YSJpbiB0KXtpZih0eXBlb2YgdC5kYXRhPT09bilyZXR1cm4gdC5kYXRhO2lmKCJvYmplY3QiPT09biYmL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfVw6XGR7Mn1cOlxkezJ9XC5cZHszfVokLy50ZXN0KHQuZGF0YSkpcmV0dXJuIG5ldyBEYXRlKHQuZGF0YSl9ZWxzZSBpZigxPT09ci5sZW5ndGgpcmV0dXJuIiJ9fWNhdGNoKGUpe319ZnVuY3Rpb24gVnUoZSx0KXt2YXIgbj10O2lmKCJzdHJpbmciIT09ZXx8InN0cmluZyI9PT1lJiYneyJ0eXBlIjoidW5kZWZpbmVkIn0nPT09dCl0cnl7dmFyIHI9SlNPTi5wYXJzZSh0KSxpPXp1KHIpO2lmKHZvaWQgMCE9PWkpbj1pO2Vsc2UgaWYoZSYmInN0cmluZyI9PXR5cGVvZihuPXIpKXt2YXIgbz10eXBlb2Yocj1KU09OLnBhcnNlKHIpKTsibnVtYmVyIj09PW8mJiJkYXRlIj09PWU/bj1uZXcgRGF0ZShyKTpvPT09KFsibnVsbCIsImFycmF5Il0uaW5kZXhPZihlKTwwP2U6Im9iamVjdCIpJiYobj1yKX19Y2F0Y2goZSl7fXJldHVybiBufWZ1bmN0aW9uIHF1KCl7Zm9yKHZhciBlPW9nLnN0b3JhZ2UubGVuZ3RofHxvZy5zdG9yYWdlLmdldExlbmd0aCgpfHwwLHQ9W10sbj0wLHI9MDtyPGU7cisrKXt2YXIgaT1vZy5zdG9yYWdlLmtleShyKTtpZihpIT09VXUmJihpLmluZGV4T2YoRnUpPDB8fGkuaW5kZXhPZihGdSkrRnUubGVuZ3RoIT09aS5sZW5ndGgpKXt2YXIgbz1vZy5zdG9yYWdlLmdldEl0ZW0oaSk7bis9aS5sZW5ndGgrby5sZW5ndGgsdC5wdXNoKGkpfX1yZXR1cm57a2V5czp0LGN1cnJlbnRTaXplOk1hdGguY2VpbCgyKm4vMTAyNCksbGltaXRTaXplOk51bWJlci5NQVhfVkFMVUUsZXJyTXNnOiJnZXRTdG9yYWdlSW5mbzpvayJ9fWZ1bmN0aW9uIFd1KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnRpdGxlO3ZvaWQgMD09PXQmJih0PSIiKTt2YXIgbj1lLmljb247dm9pZCAwPT09biYmKG49InN1Y2Nlc3MiKTt2YXIgcj1lLmltYWdlO3ZvaWQgMD09PXImJihyPSIiKTt2YXIgaT1lLmR1cmF0aW9uO3ZvaWQgMD09PWkmJihpPTE1MDApO3ZhciBvPWUubWFzazt2b2lkIDA9PT1vJiYobz0hMSk7dmFyIGE9ZS5wb3NpdGlvbjt2b2lkIDA9PT1hJiYoYT0iIik7dmFyIHM9ZS50eXBlO3ZvaWQgMD09PXMmJihzPSJ0b2FzdCIpO3ZhciBjPWUuc3R5bGU7aWYoSHUobnVsbCksRHU9cyxbInRvcCIsImNlbnRlciIsImJvdHRvbSJdLmluY2x1ZGVzKGEpKW9nLm5hdGl2ZVVJLnRvYXN0KHQse3ZlcnRpY2FsQWxpZ246YX0pLE51PSEwO2Vsc2V7biYmIX5bInN1Y2Nlc3MiLCJsb2FkaW5nIiwiZXJyb3IiLCJub25lIl0uaW5kZXhPZihuKSYmKG49InN1Y2Nlc3MiKTt2YXIgdT17bW9kYWw6byxiYWNrOiJ0cmFuc21pdCIscGFkZGluZzoiMTBweCIsc2l6ZToiMTZweCJ9O3J8fG4mJiJub25lIiE9PW4/KHUud2lkdGg9IjE0MHB4Iix1LmhlaWdodD0iMTEycHgiKTp1LmxvYWRpbmc9e2Rpc3BsYXk6Im5vbmUifSxyP3UubG9hZGluZz17ZGlzcGxheToiYmxvY2siLGhlaWdodDoiNTVweCIsaWNvbjpyLGludGVydmFsOml9Oi0xIT09WyJzdWNjZXNzIiwiZXJyb3IiXS5pbmRleE9mKG4pJiYodS5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOiJzdWNjZXNzIj09PW4/Il9fdW5pYXBwc3VjY2Vzcy5wbmciOiJfX3VuaWFwcGVycm9yLnBuZyIsaW50ZXJ2YWw6aX0pLE51PW9nLm5hdGl2ZVVJLnNob3dXYWl0aW5nKHQsT2JqZWN0LmFzc2lnbih1LGMpKX1yZXR1cm4gUnU9c2coZnVuY3Rpb24oKXtIdShudWxsKX0saSkse2Vyck1zZzoic2hvd1RvYXN0Om9rIn19ZnVuY3Rpb24gSHUoZSl7aWYodm9pZCAwPT09ZSYmKGU9InRvYXN0IiksIWV8fGU9PT1EdSlyZXR1cm4gUnUmJihjZyhSdSksUnU9bnVsbCksITA9PT1OdT9vZy5uYXRpdmVVSS5jbG9zZVRvYXN0KCk6TnUmJk51LmNsb3NlJiZOdS5jbG9zZSgpLER1PU51PW51bGwse2Vyck1zZzoiaGlkZTpvayJ9fXZhciBHdSxYdT17bGlnaHQ6e2l0ZW1Db2xvcjoiIzAwMDAwMCJ9LGRhcms6e2l0ZW1Db2xvcjoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpIn19O3ZhciBKdT17fTtmdW5jdGlvbiBZdShlKXt2YXIgbj1KdVtlXTtyZXR1cm4gbnx8KG49e2lkOjEsY2FsbGJhY2tzOk9iamVjdC5jcmVhdGUobnVsbCl9LEp1W2VdPW4pLHtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbGJhY2tzW2VdfSxwb3A6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5jYWxsYmFja3NbZV07cmV0dXJuIHQmJmRlbGV0ZSBuLmNhbGxiYWNrc1tlXSx0fSxwdXNoOmZ1bmN0aW9uKGUpe3ZhciB0PW4uaWQrKztyZXR1cm4gbi5jYWxsYmFja3NbdF09ZSx0fX19dmFyIEt1PVl1KCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIpO2Z1bmN0aW9uIFp1KG4pe3ZhciByPXt9O3JldHVybiBPYmplY3Qua2V5cyhufHx7fSkuZm9yRWFjaChmdW5jdGlvbihlKXtpZigwPT09ZS5pbmRleE9mKCJkYXRhIikpe3ZhciB0PWUucmVwbGFjZSgiZGF0YSIsIiIpO3Q9dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSt0LnNsaWNlKDEpLHJbdF09bltlXX19KSxyfWZ1bmN0aW9uIFF1KGUsdCxuKXt2YXIgcj1lLl8kd2VleC5yZXF1aXJlTW9kdWxlKCJkb20iKSxpPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl0uc2VsZWN0b3I7MD09PXIuaW5kZXhPZigiIyIpJiZ0LnB1c2goci5zdWJzdHJpbmcoMSkpfXJldHVybiB0fSh0KSxvPW5ldyBBcnJheShpLmxlbmd0aCk7IWZ1bmN0aW9uIGUodCxuLHIpe3ZhciBpPW4uY2hpbGRyZW47aWYoIUFycmF5LmlzQXJyYXkoaSkpcmV0dXJuITE7Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBhPWlbb107aWYoYS5hdHRyKXt2YXIgcz10LmluZGV4T2YoYS5hdHRyLmlkKTtpZigwPD1zJiYocltzXT17aWQ6dFtzXSxyZWY6YS5yZWYsZGF0YXNldDpadShhLmF0dHIpfSwxPT09dC5sZW5ndGgpKWJyZWFrfWEuY2hpbGRyZW4mJmUodCxhLHIpfX0oaSxlLiRlbCxvKSxmdW5jdGlvbiB0KG4scixpLG8sYSl7dmFyIHM9cltpXTtuLmdldENvbXBvbmVudFJlY3Qocy5yZWYsZnVuY3Rpb24oZSl7ZS5zaXplLmlkPXMuaWQsZS5zaXplLmRhdGFzZXQ9cy5kYXRhc2V0LG8ucHVzaChlLnNpemUpLChpKz0xKTxyLmxlbmd0aD90KG4scixpLG8sYSk6YShvKX0pfShyLG8sMCxbXSxmdW5jdGlvbihlKXtuKGUpfSl9ZnVuY3Rpb24gZWwoZSx0LG4scil7YWcucHVibGlzaEhhbmRsZXIodCx7dHlwZTpuLGRhdGE6cn0sZSl9YWcuc3Vic2NyaWJlKCJvbkFkTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jYWxsYmFja0lkOyFmdW5jdGlvbihlLG4sdCl7dmFyIHI9ZS5hZHBpZCxpPWUud2lkdGgsbz1yKyItIitpLGE9dGxbb107aWYoYSYmMDxhLmxlbmd0aClyZXR1cm4gbihhLnNwbGljZSgwLDEpWzBdKTtvZy5hZC5nZXRBZHMoZSxmdW5jdGlvbihlKXt2YXIgdD1lLmFkcztuKHQuc3BsaWNlKDAsMSlbMF0pLHRsW29dPWE/YS5jb25jYXQodCk6dH0sZnVuY3Rpb24oZSl7dCh7ZXJyQ29kZTplLmNvZGUsZXJyTXNnOmUubWVzc2FnZX0pfSl9KGUuZGF0YSxmdW5jdGlvbihlKXtlbCh0LG4sInN1Y2Nlc3MiLGUpfSxmdW5jdGlvbihlKXtlbCh0LG4sImZhaWwiLGUpfSl9KTt2YXIgdGw9e307dmFyIG5sPVsibG9hZCIsImNsb3NlIiwidmVyaWZ5IiwiZXJyb3IiLCJhZENsaWNrZWQiXSxybD1bLTUwMDEsLTUwMDIsLTUwMDMsLTUwMDQsLTUwMDUsLTUwMDZdLGlsPXtjb2RlOi01MDA4LGVyck1zZzoi5bm/5ZGK5pWw5o2u5bey6L+H5pyf77yM6K+36YeN5paw5Yqg6L29In0sb2w9ImNzaiIsYWw9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpczt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49dGhpcy5fY2FsbGJhY2tzPXt9O25sLmZvckVhY2goZnVuY3Rpb24odCl7blt0XT1bXTt2YXIgZT10WzBdLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSk7aVsib24iK2VdPWZ1bmN0aW9uKGUpe25bdF0ucHVzaChlKX19KSx0aGlzLl9wcmVsb2FkPXZvaWQgMD09PWUucHJlbG9hZHx8ZS5wcmVsb2FkLHRoaXMuX2lzTG9hZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsLHRoaXMuX2xhc3RMb2FkVGltZT0wO3ZhciB0PXRoaXMuX3Jld2FyZEFkPW9nLmFkLmNyZWF0ZVJld2FyZGVkVmlkZW9BZChlKTt0Lm9uTG9hZChmdW5jdGlvbihlKXtpLl9pc0xvYWQ9ITAsaS5faXNMb2FkaW5nPSExLGkuX2xhc3RMb2FkVGltZT1EYXRlLm5vdygpLGkuX2Rpc3BhdGNoRXZlbnQoImxvYWQiLHt9KSxudWxsIT1pLl9sb2FkUHJvbWlzZVJlc29sdmUmJihpLl9sb2FkUHJvbWlzZVJlc29sdmUoKSxpLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCl9KSx0Lm9uQ2xvc2UoZnVuY3Rpb24oZSl7aS5faXNMb2FkPSExLGkuX2lzTG9hZGluZz0hMSxpLl9wcmVsb2FkJiZpLl9sb2FkQWQoKSxpLl9kaXNwYXRjaEV2ZW50KCJjbG9zZSIse2lzRW5kZWQ6ZS5pc0VuZGVkfSl9KSx0Lm9uVmVyaWZ5JiZ0Lm9uVmVyaWZ5KGZ1bmN0aW9uKGUpe2kuX2Rpc3BhdGNoRXZlbnQoInZlcmlmeSIse2lzVmFsaWQ6ZS5pc1ZhbGlkfSl9KSx0Lm9uRXJyb3IoZnVuY3Rpb24oZSl7aS5faXNMb2FkaW5nPSExO3ZhciB0PWUuY29kZSxuPWUubWVzc2FnZSxyPXtjb2RlOnQsZXJyTXNnOm59O2kuX2FkRXJyb3I9biwtNTAwOD09PXQmJihpLl9pc0xvYWQ9ITEpLGkuX2Rpc3BhdGNoRXZlbnQoImVycm9yIixyKSwtNTAwNSE9PXQmJi0xIT09cmwuaW5kZXgodCl8fG51bGw9PWkuX2xvYWRQcm9taXNlUmVqZWN0fHwoaS5fbG9hZFByb21pc2VSZWplY3QociksaS5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCl9KSx0Lm9uQWRDbGlja2VkKGZ1bmN0aW9uKGUpe2kuX2Rpc3BhdGNoRXZlbnQoImFkQ2xpY2tlZCIse30pfSksdGhpcy5fbG9hZEFkKCl9LHNsPXtpc0V4cGlyZWQ6e2NvbmZpZ3VyYWJsZTohMH19O3NsLmlzRXhwaXJlZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMuX2xhc3RMb2FkVGltZSYmMThlNTxNYXRoLmFicyhEYXRlLm5vdygpLXRoaXMuX2xhc3RMb2FkVGltZSl9LGFsLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtuLl9sb2FkUHJvbWlzZVJlc29sdmU9ZSxuLl9sb2FkUHJvbWlzZVJlamVjdD10LG4uX2lzTG9hZGluZ3x8KG4uX2lzTG9hZD9lKCk6bi5fbG9hZEFkKCkpfSl9LGFsLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtpZighbi5faXNMb2FkaW5nKXtpZihuLmdldFByb3ZpZGVyKCk9PT1vbCYmbi5pc0V4cGlyZWQpcmV0dXJuIG4uX2lzTG9hZD0hMSxuLl9kaXNwYXRjaEV2ZW50KCJlcnJvciIsaWwpLHZvaWQgdChuZXcgRXJyb3IoaWwuZXJyTXNnKSk7bi5faXNMb2FkPyhuLl9yZXdhcmRBZC5zaG93KCksZSgpKTp0KG5ldyBFcnJvcihuLl9hZEVycm9yKSl9fSl9LGFsLnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXdhcmRBZC5nZXRQcm92aWRlcigpfSxhbC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX3Jld2FyZEFkLmRlc3Ryb3koKX0sYWwucHJvdG90eXBlLl9sb2FkQWQ9ZnVuY3Rpb24oKXt0aGlzLl9pc0xvYWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX3Jld2FyZEFkLmxvYWQoKX0sYWwucHJvdG90eXBlLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FsbGJhY2tzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUodHx8e30pfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGFsLnByb3RvdHlwZSxzbCk7dmFyIGNsPSJsb2FkIix1bD0iY2xvc2UiLGxsPSJlcnJvciIsZGw9ImFkQ2xpY2tlZCIsZmw9W2NsLHVsLGxsLGRsXSxwbD1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXMsbj10aGlzLl9jYWxsYmFja3M9e307ZmwuZm9yRWFjaChmdW5jdGlvbih0KXtuW3RdPVtdO3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtyWyJvbiIrZV09ZnVuY3Rpb24oZSl7blt0XS5wdXNoKGUpfX0pLHRoaXMuX3ByZWxvYWQ9dm9pZCAwIT09dC5wcmVsb2FkJiZ0LnByZWxvYWQsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2FkRXJyb3I9IiIsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsO3ZhciBpPXRoaXMuX2FkPWU7aS5vbkxvYWQoZnVuY3Rpb24oZSl7ci5faXNMb2FkZWQ9ITAsci5faXNMb2FkaW5nPSExLG51bGwhPXIuX2xvYWRQcm9taXNlUmVzb2x2ZSYmKHIuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHIuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSxudWxsIT1yLl9zaG93UHJvbWlzZVJlc29sdmUmJihyLl9zaG93UHJvbWlzZVJlc29sdmUoKSxyLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCxyLl9zaG93QWQoKSksci5fZGlzcGF0Y2hFdmVudChjbCx7fSl9KSxpLm9uQ2xvc2UoZnVuY3Rpb24oZSl7ci5faXNMb2FkZWQ9ITEsci5faXNMb2FkaW5nPSExLHIuX2Rpc3BhdGNoRXZlbnQodWwse2lzRW5kZWQ6ZS5pc0VuZGVkfSksITA9PT1yLl9wcmVsb2FkJiZyLl9sb2FkQWQoKX0pLGkub25FcnJvcihmdW5jdGlvbihlKXtyLl9pc0xvYWRpbmc9ITE7dmFyIHQ9e2NvZGU6ZS5jb2RlLGVyckNvZGU6ZS5jb2RlLGVyck1zZzplLm1lc3NhZ2UsZGV0YWlsOmUuZGV0YWlsfTtyLl9hZEVycm9yPXQsci5fZGlzcGF0Y2hFdmVudChsbCx0KTt2YXIgbj1uZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoci5fYWRFcnJvcikpO24uY29kZT1lLmNvZGUsbi5lcnJNc2c9ZS5tZXNzYWdlLG4uZGV0YWlsPWUuZGV0YWlsLG51bGwhPXIuX2xvYWRQcm9taXNlUmVqZWN0JiYoci5fbG9hZFByb21pc2VSZWplY3Qobiksci5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCksbnVsbCE9ci5fc2hvd1Byb21pc2VSZWplY3QmJihyLl9zaG93UHJvbWlzZVJlamVjdChuKSxyLl9zaG93UHJvbWlzZVJlamVjdD1udWxsKX0pLGkub25BZENsaWNrZWQmJmkub25BZENsaWNrZWQoZnVuY3Rpb24oZSl7ci5fZGlzcGF0Y2hFdmVudChkbCx7fSl9KX07cGwucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe24uX2xvYWRQcm9taXNlUmVzb2x2ZT1lLG4uX2xvYWRQcm9taXNlUmVqZWN0PXQsbi5faXNMb2FkaW5nfHwobi5faXNMb2FkZWQ/ZSgpOm4uX2xvYWRBZCgpKX0pfSxwbC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fc2hvd1Byb21pc2VSZXNvbHZlPWUsbi5fc2hvd1Byb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9pc0xvYWRlZD8obi5fc2hvd0FkKCksZSgpKTpuLl9sb2FkQWQoKSl9KX0scGwucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9hZC5kZXN0cm95KCl9LHBsLnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hZC5nZXRQcm92aWRlcigpfSxwbC5wcm90b3R5cGUuX2xvYWRBZD1mdW5jdGlvbigpe3RoaXMuX2FkRXJyb3I9IiIsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkLmxvYWQoKX0scGwucHJvdG90eXBlLl9zaG93QWQ9ZnVuY3Rpb24oKXt0aGlzLl9hZC5zaG93KCl9LHBsLnByb3RvdHlwZS5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuX2NhbGxiYWNrc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKHR8fHt9KX0pfTt2YXIgaGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSksdC5jYWxsKHRoaXMsb2cuYWQuY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQoZSksZSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSwoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWV9KHBsKTt2YXIgdmw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSksdC5jYWxsKHRoaXMsb2cuYWQuY3JlYXRlSW50ZXJzdGl0aWFsQWQoZSksZSksdGhpcy5fbG9hZEFkKCl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSwoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWV9KHBsKTt2YXIgZ2w9e30sbWw9e307dmFyIHlsPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMscj10aGlzLl9jYWxsYmFja3M9e307ZmwuZm9yRWFjaChmdW5jdGlvbih0KXtyW3RdPVtdO3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtuWyJvbiIrZV09ZnVuY3Rpb24oZSl7clt0XS5wdXNoKGUpfX0pLHRoaXMuX2FkPW51bGwsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9hZHBpZD1lLmFkcGlkLHRoaXMuX3Byb3ZpZGVyPWUucHJvdmlkZXIsdGhpcy5fdXNlckRhdGE9ZS51c2VyRGF0YXx8e30sdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCxzZyhmdW5jdGlvbigpe24uX2luaXQoKX0pfTt5bC5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2FkRXJyb3I9IiIsZnVuY3Rpb24oZSl7dmFyIHI9ZS5wcm92aWRlcjtpZihnbFtyXXx8KGdsW3JdPXt9KSwib2JqZWN0IiE9dHlwZW9mIGdsW3JdLmluc3RhbmNlKWlmKG1sW3JdfHwobWxbcl09W10pLG1sW3JdLnB1c2goZSksITAhPT1nbFtyXS5sb2FkaW5nKXtnbFtyXS5sb2FkaW5nPSEwO3ZhciBpPXBpKHIpfHx7fSx0PWkuaW5pdHx8aS5pbml0U0RLO2lmKCF0KXJldHVybiBtbFtyXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZmFpbCh7Y29kZTotMSxtZXNzYWdlOiJwcm92aWRlciBbIityKyJdIGludmFsaWQifSl9KSxtbFtyXS5sZW5ndGg9MCxnbFtyXS5sb2FkaW5nPSExO2dsW3JdLnBsdWdpbj1pLGUuX19wbHVnaW49aSx0KGZ1bmN0aW9uKHQpe3ZhciBlPXQuY29kZSxuPSJCWE0tQUQiPT09cj8wPT09ZXx8MT09PWU6MD09PWU7bj9nbFtyXS5pbnN0YW5jZT1pOmdsW3JdLmxvYWRpbmc9ITEsbWxbcl0uZm9yRWFjaChmdW5jdGlvbihlKXtuP2Uuc3VjY2VzcyhlLl9fcGx1Z2luKTplLmZhaWwodCl9KSxtbFtyXS5sZW5ndGg9MH0pfWVsc2UgZS5fX3BsdWdpbj1nbFtyXS5wbHVnaW47ZWxzZSBlLnN1Y2Nlc3MoZ2xbcl0uaW5zdGFuY2UpfSh7cHJvdmlkZXI6dGhpcy5fcHJvdmlkZXIsc3VjY2VzczpmdW5jdGlvbihlKXt0Ll9hZD1lLHQuX3VzZXJEYXRhJiZ0LmJpbmRVc2VyRGF0YSh0Ll91c2VyRGF0YSksdC5fbG9hZEFkKCl9LGZhaWw6ZnVuY3Rpb24oZSl7dC5fYWRFcnJvcj1lLHQuX2Rpc3BhdGNoRXZlbnQobGwsZSl9fSl9LHlsLnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm92aWRlcn0seWwucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe24uX2xvYWRQcm9taXNlUmVzb2x2ZT1lLG4uX2xvYWRQcm9taXNlUmVqZWN0PXQsbi5faXNMb2FkaW5nfHwobi5fYWRFcnJvcj9uLl9pbml0KCk6bi5faXNMb2FkZWQ/ZSgpOm4uX2xvYWRBZCgpKX0pfSx5bC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fc2hvd1Byb21pc2VSZXNvbHZlPWUsbi5fc2hvd1Byb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9hZEVycm9yP24uX2luaXQoKTpuLl9pc0xvYWRlZD8obi5fc2hvd0FkKCksZSgpKTpuLl9sb2FkQWQoKSl9KX0seWwucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fYWQmJnRoaXMuX2FkLmRlc3Ryb3kmJnRoaXMuX2FkLmRlc3Ryb3koe2FkcGlkOnRoaXMuX2FkcGlkfSl9LHlsLnByb3RvdHlwZS5iaW5kVXNlckRhdGE9ZnVuY3Rpb24oZSl7bnVsbCE9PXRoaXMuX2FkJiZ0aGlzLl9hZC5iaW5kVXNlckRhdGEmJnRoaXMuX2FkLmJpbmRVc2VyRGF0YShlKX0seWwucHJvdG90eXBlLl9sb2FkQWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKG51bGwhPT10aGlzLl9hZCl7aWYoITA9PT10aGlzLl9pc0xvYWRpbmcpcmV0dXJuO3RoaXMuX2lzTG9hZGluZz0hMCx0aGlzLl9hZC5sb2FkRGF0YShPYmplY3QuYXNzaWduKHt9LHthZHBpZDp0aGlzLl9hZHBpZH0sdGhpcy5fdXNlckRhdGEpLGZ1bmN0aW9uKGUpe3QuX2lzTG9hZGVkPSEwLHQuX2lzTG9hZGluZz0hMSxudWxsIT10Ll9sb2FkUHJvbWlzZVJlc29sdmUmJih0Ll9sb2FkUHJvbWlzZVJlc29sdmUoKSx0Ll9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCksbnVsbCE9dC5fc2hvd1Byb21pc2VSZXNvbHZlJiYodC5fc2hvd1Byb21pc2VSZXNvbHZlKCksdC5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdC5fc2hvd0FkKCkpLHQuX2Rpc3BhdGNoRXZlbnQoY2wsZSl9LGZ1bmN0aW9uKGUpe3QuX2lzTG9hZGluZz0hMSxudWxsIT10Ll9zaG93UHJvbWlzZVJlamVjdCYmKHQuX3Nob3dQcm9taXNlUmVqZWN0KHQuX2NyZWF0ZUVycm9yKGUpKSx0Ll9zaG93UHJvbWlzZVJlamVjdD1udWxsKSx0Ll9kaXNwYXRjaEV2ZW50KGxsLGUpfSl9fSx5bC5wcm90b3R5cGUuX3Nob3dBZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7bnVsbCE9PXRoaXMuX2FkJiYhMD09PXRoaXMuX2lzTG9hZGVkJiZ0aGlzLl9hZC5zaG93KHthZHBpZDp0aGlzLl9hZHBpZH0sZnVuY3Rpb24oZSl7dC5faXNMb2FkZWQ9ITF9LGZ1bmN0aW9uKGUpe3QuX2lzTG9hZGVkPSExLG51bGwhPXQuX3Nob3dQcm9taXNlUmVqZWN0JiYodC5fc2hvd1Byb21pc2VSZWplY3QodC5fY3JlYXRlRXJyb3IoZSkpLHQuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpLHQuX2Rpc3BhdGNoRXZlbnQobGwsZSl9KX0seWwucHJvdG90eXBlLl9jcmVhdGVFcnJvcj1mdW5jdGlvbihlKXt2YXIgdD1uZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoZSkpO3JldHVybiB0LmNvZGU9ZS5jb2RlLHQuZXJyTXNnPWUubWVzc2FnZSx0fSx5bC5wcm90b3R5cGUuX2Rpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLl9jYWxsYmFja3NbZV0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSh0fHx7fSl9KX07dmFyIF9sPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGluaXRVVFNQcm94eUNsYXNzOnd1LGluaXRVVFNQcm94eUZ1bmN0aW9uOl91LGluaXRVVFNJbmRleENsYXNzTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiB4dShlLGt1KCk/IkluZGV4S3QiOiJJbmRleFN3aWZ0Iix0KX0saW5pdFVUU0NsYXNzTmFtZTp4dSxpbml0VVRTUGFja2FnZU5hbWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4ga3UoKT8idXRzLnNkay4iKyh0PyJtb2R1bGVzLiI6IiIpK2U6IiJ9LHJlcXVpcmVVVFNQbHVnaW46ZnVuY3Rpb24oZSl7dmFyIHQ9VHVbZV07cmV0dXJuIHR8fGNvbnNvbGUuZXJyb3IoZSsiIGlzIG5vdCBmb3VuZCIpLHR9LHJlZ2lzdGVyVVRTUGx1Z2luOmZ1bmN0aW9uKGUsdCl7VHVbZV09dH0scmVnaXN0ZXJVVFNJbnRlcmZhY2U6ZnVuY3Rpb24oZSx0KXtDdVtlXT10fSxzdGFydFB1bGxEb3duUmVmcmVzaDpmdW5jdGlvbigpe3JldHVybiBHdSYmR3UuZW5kUHVsbFRvUmVmcmVzaCgpLChHdT1TaSgpKT8oR3UuYmVnaW5QdWxsVG9SZWZyZXNoKCkse2Vyck1zZzoic3RhcnRQdWxsRG93blJlZnJlc2g6b2sifSk6e2Vyck1zZzoic3RhcnRQdWxsRG93blJlZnJlc2g6ZmFpbCJ9fSxzdG9wUHVsbERvd25SZWZyZXNoOmZ1bmN0aW9uKCl7cmV0dXJuIEd1fHwoR3U9U2koKSksR3U/KEd1LmVuZFB1bGxUb1JlZnJlc2goKSxHdT1udWxsLHtlcnJNc2c6InN0b3BQdWxsRG93blJlZnJlc2g6b2sifSk6e2Vyck1zZzoic3RvcFB1bGxEb3duUmVmcmVzaDpmYWlsIn19LCRvbjphaSwkb2ZmOnNpLCRvbmNlOmNpLCRlbWl0OnVpLGNyZWF0ZUF1ZGlvSW5zdGFuY2U6ZnVuY3Rpb24oKXt2YXIgZT0iIitEYXRlLm5vdygpK01hdGgucmFuZG9tKCksdD1GaVtlXT1vZy5hdWRpby5jcmVhdGVQbGF5ZXIoIiIpO3JldHVybiB0LnNyYz0iIix0LnZvbHVtZT0xLHQuc3RhcnRUaW1lPTAsdC5zZXRTZXNzaW9uQ2F0ZWdvcnkoUmkpLHtlcnJNc2c6ImNyZWF0ZUF1ZGlvSW5zdGFuY2U6b2siLGF1ZGlvSWQ6ZX19LGRlc3Ryb3lBdWRpb0luc3RhbmNlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXVkaW9JZDtyZXR1cm4gRmlbdF0mJihGaVt0XS5jbG9zZSgpLGRlbGV0ZSBGaVt0XSkse2Vyck1zZzoiZGVzdHJveUF1ZGlvSW5zdGFuY2U6b2siLGF1ZGlvSWQ6dH19LHNldEF1ZGlvU3RhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdWRpb0lkLG49ZS5zcmMscj1lLnN0YXJ0VGltZSxpPWUuYXV0b3BsYXk7dm9pZCAwPT09aSYmKGk9ITEpO3ZhciBvPWUubG9vcDt2b2lkIDA9PT1vJiYobz0hMSksZS5vYmV5TXV0ZVN3aXRjaDt2YXIgYT1lLnZvbHVtZSxzPWUuc2Vzc2lvbkNhdGVnb3J5O3ZvaWQgMD09PXMmJihzPVJpKTt2YXIgYyx1LGw9ZS5wbGF5YmFja1JhdGUsZD1GaVt0XTtpZihkKXt2YXIgZj17bG9vcDpvLGF1dG9wbGF5Oml9O2lmKG4pe3ZhciBwPVRpKG4pO2Quc3JjIT09cCYmKGQuc3JjPWYuc3JjPXApfXImJihkLnN0YXJ0VGltZT1mLnN0YXJ0VGltZT1yKSwibnVtYmVyIj09dHlwZW9mIGEmJihkLnZvbHVtZT1mLnZvbHVtZT1hKSxkLnNldFN0eWxlcyhmKSxzJiZkLnNldFNlc3Npb25DYXRlZ29yeShzKSxsJiZkLnBsYXliYWNrUmF0ZSYmZC5wbGF5YmFja1JhdGUobCksKHU9RmlbYz10XSkmJih1LmluaXRTdGF0ZUNoYWdlfHwodS5pbml0U3RhdGVDaGFnZT0hMCx1LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihlKXt6aSgiZXJyb3IiLHthdWRpb0lkOmMsZXJyTXNnOiJNZWRpYUVycm9yIixlcnJDb2RlOmUuY29kZX0pfSksVWkuZm9yRWFjaChmdW5jdGlvbihlKXt1LmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpeyJwbGF5Ij09PWU/dS5pc1N0b3BwZWQ9ITE6InN0b3AiPT09ZSYmKHUuaXNTdG9wcGVkPSEwKSx6aShlLHthdWRpb0lkOmN9KX0pfSkpKX1yZXR1cm57ZXJyTXNnOiJzZXRBdWRpb1N0YXRlOm9rIn19LGdldEF1ZGlvU3RhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdWRpb0lkLG49RmlbdF07aWYoIW4pcmV0dXJue2Vyck1zZzoiZ2V0QXVkaW9TdGF0ZTpmYWlsIn07dmFyIHI9bi5zcmMsaT1uLnN0YXJ0VGltZSxvPW4udm9sdW1lO3JldHVybntlcnJNc2c6ImdldEF1ZGlvU3RhdGU6b2siLGR1cmF0aW9uOjFlMyoobi5nZXREdXJhdGlvbigpfHwwKSxjdXJyZW50VGltZTpuLmlzU3RvcHBlZD8wOjFlMypuLmdldFBvc2l0aW9uKCkscGF1c2VkOm4uaXNQYXVzZWQoKSxzcmM6cix2b2x1bWU6byxzdGFydFRpbWU6MWUzKmksYnVmZmVyZWQ6MWUzKm4uZ2V0QnVmZmVyZWQoKX19LG9wZXJhdGVBdWRpbzpmdW5jdGlvbihlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLmF1ZGlvSWQscj1lLmN1cnJlbnRUaW1lLGk9Rmlbbl0sbz1bInBsYXkiLCJwYXVzZSIsInN0b3AiXTtyZXR1cm4gMDw9by5pbmRleE9mKHQpP2lbdD09PW9bMF0mJmkuaXNQYXVzZWQoKT8icmVzdW1lIjp0XSgpOiJzZWVrIj09PXQmJmkuc2Vla1RvKHIvMWUzKSx7ZXJyTXNnOiJvcGVyYXRlQXVkaW86b2sifX0sZ2V0TXVzaWNQbGF5ZXJTdGF0ZTpmdW5jdGlvbigpe3ZhciBlPVlpKCk7cmV0dXJuIGU/e2RhdGFVcmw6ZS5zcmMsZHVyYXRpb246ZS5nZXREdXJhdGlvbigpfHwwLGN1cnJlbnRQb3NpdGlvbjplLmdldFBvc2l0aW9uKCksc3RhdHVzOmUuaXNQYXVzZWQoKT8wOjEsZG93bmxvYWRQZXJjZW50Ok1hdGgucm91bmQoMTAwKmUuZ2V0QnVmZmVyZWQoKS9lLmdldER1cmF0aW9uKCkpLGVyck1zZzoiZ2V0TXVzaWNQbGF5ZXJTdGF0ZTpvayJ9OntzdGF0dXM6MixlcnJNc2c6ImdldE11c2ljUGxheWVyU3RhdGU6b2sifX0sb3BlcmF0ZU11c2ljUGxheWVyOktpLHNldEJhY2tncm91bmRBdWRpb1N0YXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEppKGUsdCkse2Vyck1zZzoic2V0QmFja2dyb3VuZEF1ZGlvU3RhdGU6b2sifX0sb3BlcmF0ZUJhY2tncm91bmRBdWRpbzpmdW5jdGlvbihlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLnNyYyxyPWUuc3RhcnRUaW1lLGk9ZS5jdXJyZW50VGltZTtyZXR1cm4gS2koe29wZXJhdGlvblR5cGU6dCxkYXRhVXJsOm4scG9zaXRpb246cnx8aXx8MCxhcGk6Im9wZXJhdGVCYWNrZ3JvdW5kQXVkaW8ifSl9LGdldEJhY2tncm91bmRBdWRpb1N0YXRlOmZ1bmN0aW9uKCl7dmFyIGU9e2R1cmF0aW9uOjAsY3VycmVudFRpbWU6MCxwYXVzZWQ6ITEsc3JjOiIiLGJ1ZmZlcmVkOjAsdGl0bGU6IiIsZXBuYW1lOiIiLHNpbmdlcjoiIixjb3ZlckltZ1VybDoiIix3ZWJVcmw6IiIsc3RhcnRUaW1lOjAsZXJyTXNnOiJnZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZTpvayJ9LHQ9WWkoKTtpZih0KXt2YXIgbj17ZHVyYXRpb246dC5nZXREdXJhdGlvbigpfHwwLGN1cnJlbnRUaW1lOnQuaXNTdG9wcGVkPzA6dC5nZXRQb3NpdGlvbigpLHBhdXNlZDp0LmlzUGF1c2VkKCksc3JjOnQuc3JjLGJ1ZmZlcmVkOnQuZ2V0QnVmZmVyZWQoKSx0aXRsZTp0LnRpdGxlLGVwbmFtZTp0LmVwbmFtZSxzaW5nZXI6dC5zaW5nZXIsY292ZXJJbWdVcmw6dC5jb3ZlckltZ1VybCx3ZWJVcmw6dC53ZWJVcmwsc3RhcnRUaW1lOnQuc3RhcnRUaW1lfTtlPU9iamVjdC5hc3NpZ24oZSxuKX1yZXR1cm4gZX0sb3BlcmF0ZU1hcFBsYXllcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyxjLHUsbDt0LiRwYWdlLm1ldGEuaXNOVnVlPyhjPWUsdT10LGw9cixhb1tuXShybyhjLHUpLGwpKTooaT1lLG89bixhPXIscz10LiRwYWdlLmlkLGFnLnB1Ymxpc2hIYW5kbGVyKHMrIi1tYXAtIitpLHttYXBJZDppLHR5cGU6byxkYXRhOmF9LHMpKX0sb3BlcmF0ZVZpZGVvUGxheWVyOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLGMsdSxsO3QuJHBhZ2UubWV0YS5pc05WdWU/KGM9ZSx1PXQsbD1yLHNvW25dKHJvKGMsdSksbCkpOihpPWUsbz1uLGE9cixzPXQuJHBhZ2UuaWQsYWcucHVibGlzaEhhbmRsZXIocysiLXZpZGVvLSIraSx7dmlkZW9JZDppLHR5cGU6byxkYXRhOmF9LHMpKX0sTGl2ZVB1c2hlckNvbnRleHQ6Zm8sY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC4kcGFnZS5tZXRhLmlzTlZ1ZT9mdW5jdGlvbihlLHQpe2lmKCF0KXJldHVybiBjb25zb2xlLndhcm4oInVuaS5jcmVhdGVMaXZlUHVzaGVyQ29udGV4dDogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudCIpO3ZhciBuPXJvKGUsdCk7cmV0dXJuIG4/bmV3IGNvKGUsbik6Y29uc29sZS53YXJuKCJDYW4gbm90IGZpbmQgYCIrZSsiYCIpfShlLHQpOm5ldyBmbyhlLHQpfSxzdGFydEFjY2VsZXJvbWV0ZXI6Ym8sc3RvcEFjY2VsZXJvbWV0ZXI6d28sb25BY2NlbGVyb21ldGVyQ2hhbmdlOmZ1bmN0aW9uKGUpe19vLmxlbmd0aHx8Ym8oKSxfby5wdXNoKGUpfSxvZmZBY2NlbGVyb21ldGVyQ2hhbmdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PV9vLmluZGV4T2YoZSk7MDw9dCYmX28uc3BsaWNlKHQsMSl9X28ubGVuZ3RofHx3bygpfSxhZGRQaG9uZUNvbnRhY3Q6ZnVuY3Rpb24obixyKXtvZy5jb250YWN0cy5nZXRBZGRyZXNzQm9vayhvZy5jb250YWN0cy5BRERSRVNTQk9PS19QSE9ORSxmdW5jdGlvbihlKXshbi5waG90b0ZpbGVQYXRoJiYobi5waG90b0ZpbGVQYXRoPSIiKTt2YXIgdD1lLmNyZWF0ZSgpOyFmdW5jdGlvbiByKGksbyx0KXt2YXIgYT0wO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciBlPXRbbl07Im9iamVjdCIhPXR5cGVvZiBlPy0xIT09U28uaW5kZXhPZihuKT9pW25dPXRbbl06dm9pZCAwIT09b1tlXT8oYSsrLGlbbl09b1tlXSk6ZGVsZXRlIGlbbl06ZSBpbnN0YW5jZW9mIEFycmF5PyhpW25dPVtdLGUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD17fTtyKHQsbyxlKSYmaVtuXS5wdXNoKHQpfSksaVtuXS5sZW5ndGg/YSsrOmRlbGV0ZSBpW25dKTooaVtuXT17fSxyKGlbbl0sbyxlKT9hKys6ZGVsZXRlIGlbbl0pfSksYX0odCxuLGtvKSx0LnNhdmUoZnVuY3Rpb24oKXtmaShyLHtlcnJNc2c6ImFkZFBob25lQ29udGFjdDpvayJ9KX0sZnVuY3Rpb24oZSl7Zmkocix7ZXJyTXNnOiJhZGRQaG9uZUNvbnRhY3Q6ZmFpbCJ9KX0pfSxmdW5jdGlvbihlKXtmaShyLHtlcnJNc2c6ImFkZFBob25lQ29udGFjdDpmYWlsIn0pfSl9LG9uQmx1ZXRvb3RoRGV2aWNlRm91bmQ6eG8sb25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2U6Q28sb25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2U6VG8sb25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlOk9vLG9wZW5CbHVldG9vdGhBZGFwdGVyOkFvLGNsb3NlQmx1ZXRvb3RoQWRhcHRlcjokbyxnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGU6UG8sc3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5Ok1vLHN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5OmpvLGdldEJsdWV0b290aERldmljZXM6TG8sZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlczpCbyxjcmVhdGVCTEVDb25uZWN0aW9uOk5vLGNsb3NlQkxFQ29ubmVjdGlvbjpEbyxnZXRCTEVEZXZpY2VTZXJ2aWNlczpSbyxnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3M6Rm8sbm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZTpVbyxyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZTp6byx3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWU6Vm8sc2V0QkxFTVRVOnFvLGdldEJMRURldmljZVJTU0k6V28sZ2V0U2NyZWVuQnJpZ2h0bmVzczpmdW5jdGlvbigpe3JldHVybntlcnJNc2c6ImdldFNjcmVlbkJyaWdodG5lc3M6b2siLHZhbHVlOm9nLnNjcmVlbi5nZXRCcmlnaHRuZXNzKCExKX19LHNldFNjcmVlbkJyaWdodG5lc3M6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudmFsdWU7cmV0dXJuIG9nLnNjcmVlbi5zZXRCcmlnaHRuZXNzKHQsITEpLHtlcnJNc2c6InNldFNjcmVlbkJyaWdodG5lc3M6b2sifX0sc2V0S2VlcFNjcmVlbk9uOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmtlZXBTY3JlZW5PbjtyZXR1cm4gb2cuZGV2aWNlLnNldFdha2Vsb2NrKCEhdCkse2Vyck1zZzoic2V0S2VlcFNjcmVlbk9uOm9rIn19LGdldENsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSx0KXtwaSgiY2xpcGJvYXJkIikuZ2V0U3RyaW5nKGZ1bmN0aW9uKGUpeyJzdWNjZXNzIj09PWUucmVzdWx0P2ZpKHQse2RhdGE6ZS5kYXRhLGVyck1zZzoiZ2V0Q2xpcGJvYXJkRGF0YTpvayJ9KTpmaSh0LHtkYXRhOmUucmVzdWx0LGVyck1zZzoiZ2V0Q2xpcGJvYXJkRGF0YTpmYWlsIn0pfSl9LHNldENsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3JldHVybiBwaSgiY2xpcGJvYXJkIikuc2V0U3RyaW5nKHQpLHtlcnJNc2c6InNldENsaXBib2FyZERhdGE6b2sifX0sc3RhcnRDb21wYXNzOkdvLHN0b3BDb21wYXNzOlhvLG9uQ29tcGFzc0NoYW5nZTpmdW5jdGlvbihlKXtIby5sZW5ndGh8fEdvKCksSG8ucHVzaChlKX0sb2ZmQ29tcGFzc0NoYW5nZTpmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1Iby5pbmRleE9mKGUpOzA8PXQmJkhvLnNwbGljZSh0LDEpfUhvLmxlbmd0aHx8WG8oKX0sZ2V0TmV0d29ya1R5cGU6ZnVuY3Rpb24oKXtyZXR1cm57ZXJyTXNnOiJnZXROZXR3b3JrVHlwZTpvayIsbmV0d29ya1R5cGU6dm9bb2cubmV0d29ya2luZm8uZ2V0Q3VycmVudFR5cGUoKV18fCJ1bmtub3duIn19LG9uQmVhY29uVXBkYXRlOkpvLG9uQmVhY29uU2VydmljZUNoYW5nZTpZbyxnZXRCZWFjb25zOktvLHN0YXJ0QmVhY29uRGlzY292ZXJ5OlpvLHN0b3BCZWFjb25EaXNjb3Zlcnk6UW8sbWFrZVBob25lQ2FsbDpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5waG9uZU51bWJlcjtyZXR1cm4gb2cuZGV2aWNlLmRpYWwodCkse2Vyck1zZzoibWFrZVBob25lQ2FsbDpvayJ9fSxzY2FuQ29kZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj0id2VleCIhPT1kZy5udnVlQ29tcGlsZXI/UGE6Q2E7cmV0dXJuIG4uc2NhbkNvZGUuYXBwbHkobixlKX0sY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOkxhLGNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6QmEsc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUucmVxdWVzdEF1dGhNb2RlcyxyPWUuY2hhbGxlbmdlO3ZvaWQgMD09PXImJihyPSExKTt2YXIgaT1lLmF1dGhDb250ZW50LG89TGEoKS5zdXBwb3J0TW9kZTtpZigwPT09by5sZW5ndGgpcmV0dXJue2F1dGhNb2RlOm9bMF18fCJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMSxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vdCBzdXBwb3J0In07dmFyIGE9W107aWYobi5tYXAoZnVuY3Rpb24oZSx0KXstMTxvLmluZGV4T2YoZSkmJmEucHVzaChlKX0pLDA9PT1hLmxlbmd0aClyZXR1cm57YXV0aE1vZGU6YVswXXx8ImZpbmdlclByaW50IixlcnJDb2RlOjkwMDAzLGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgbm8gY29ycmVzcG9uZGluZyBtb2RlIn07dmFyIHM9W107aWYoYS5tYXAoZnVuY3Rpb24oZSx0KXtCYSh7Y2hlY2tBdXRoTW9kZTplfSkuaXNFbnJvbGxlZCYmcy5wdXNoKGUpfSksMD09PXMubGVuZ3RoKXJldHVybnthdXRoTW9kZTphWzBdLGVyckNvZGU6OTAwMTEsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBubyAiK2FbMF0rIiBlbnJvbGxlZCJ9O3ZhciBjPXNbMF07aWYoImZpbmdlclByaW50Ij09PWMpe3ZhciB1LGw9bnVsbCxkPWl8fGF0KCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50Iik7ImFuZHJvaWQiPT09b2cub3MubmFtZS50b0xvd2VyQ2FzZSgpJiYoKGw9b2cubmF0aXZlVUkuc2hvd1dhaXRpbmcoZCkpLm9uY2xvc2U9ZnVuY3Rpb24oKXtvZy5maW5nZXJwcmludC5jYW5jZWwoKX0pLG9nLmZpbmdlcnByaW50LmF1dGhlbnRpY2F0ZShmdW5jdGlvbigpe29nLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLGZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTowLGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOm9rIn0pfSxmdW5jdGlvbihlKXtzd2l0Y2goZS5jb2RlKXtjYXNlIGUuQVVUSEVOVElDQVRFX01JU01BVENIOmwmJihjZyh1KSxsLnNldFRpdGxlKGF0KCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLndhaXRpbmdDb250ZW50IikpLHU9c2coZnVuY3Rpb24oKXtsJiZsLnNldFRpdGxlKGQpfSwxZTMpKTticmVhaztjYXNlIGUuQVVUSEVOVElDQVRFX09WRVJMSU1JVDpvZy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxmaSh0LHthdXRoTW9kZTpjLGVyckNvZGU6OTAwMTAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBhdXRoZW50aWNhdGUgZnJlZXplLiBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIn0pO2JyZWFrO2Nhc2UgZS5DQU5DRUw6b2cubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA4LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgY2FuY2VsIn0pO2JyZWFrO2RlZmF1bHQ6b2cubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA3LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSl9fSx7bWVzc2FnZTppfSl9ZWxzZSJmYWNpYWwiPT09YyYmcGkoImZhY2VJRCIpLmF1dGhlbnRpY2F0ZSh7bWVzc2FnZTppfSxmdW5jdGlvbihlKXtpZigic3VjY2VzcyI9PT1lLnR5cGUmJjA9PT1lLmNvZGUpZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246b2sifSk7ZWxzZSBzd2l0Y2goZS5jb2RlKXtjYXNlIDQ6ZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA5LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSk7YnJlYWs7Y2FzZSA1OmZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAxMCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGF1dGhlbnRpY2F0ZSBmcmVlemUuIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIifSk7YnJlYWs7Y2FzZSA2OmZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAwOCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGNhbmNlbCJ9KTticmVhaztkZWZhdWx0OmZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAwNyxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIn0pfX0pfSx3ZWV4R2V0U3lzdGVtSW5mb1N5bmM6WHMsZ2V0RGV2aWNlSW5mbzpKcyxnZXRBcHBCYXNlSW5mbzpZcyxnZXRTeXN0ZW1JbmZvU3luYzpmdW5jdGlvbigpe3JldHVybiB3aShLcyxPYmplY3QuY3JlYXRlKG51bGwpLCJnZXRTeXN0ZW1JbmZvIiwiZ2V0U3lzdGVtSW5mb1N5bmMiKX0sZ2V0U3lzdGVtSW5mbzpLcyx2aWJyYXRlTG9uZzpmdW5jdGlvbigpe3JldHVybiBvZy5kZXZpY2UudmlicmF0ZSg0MDApLHtlcnJNc2c6InZpYnJhdGVMb25nOm9rIn19LHZpYnJhdGVTaG9ydDpmdW5jdGlvbigpe3JldHVybiBvZy5kZXZpY2UudmlicmF0ZSgxNSkse2Vyck1zZzoidmlicmF0ZVNob3J0Om9rIn19LGdldFdpbmRvd0luZm86V3MsZ2V0U3lzdGVtU2V0dGluZzpmdW5jdGlvbigpe3ZhciBlPSgwLGlnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRTeXN0ZW1TZXR0aW5nKSgpO3RyeXsic3RyaW5nIj09dHlwZW9mIGUmJihlPUpTT04ucGFyc2UoZSkpfWNhdGNoKGUpe31yZXR1cm4gZX0sZ2V0QXBwQXV0aG9yaXplU2V0dGluZzpacyxvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpmdW5jdGlvbihlLHQpeygwLGlnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5vcGVuQXBwQXV0aG9yaXplU2V0dGluZykoZnVuY3Rpb24oZSl7InN1Y2Nlc3MiPT09ZS50eXBlP2ZpKHQse2Vyck1zZzoib3BlbkFwcEF1dGhvcml6ZVNldHRpbmc6b2sifSk6ZmkodCx7ZXJyTXNnOiJvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpmYWlsIn0pfSl9LHNhdmVGaWxlOmZ1bmN0aW9uKGUsbil7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0LHI9ZS50ZW1wRmlsZVBhdGgsaT1MaShuLCJzYXZlRmlsZSIpLG89IiIrRGF0ZS5ub3coKStuYysrKygxPCh0PXIuc3BsaXQoIi4iKSkubGVuZ3RoPyIuIit0W3QubGVuZ3RoLTFdOiIiKTtvZy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKHIsZnVuY3Rpb24odCl7dGMoZnVuY3Rpb24oZSl7dC5jb3B5VG8oZSxvLGZ1bmN0aW9uKCl7Zmkobix7ZXJyTXNnOiJzYXZlRmlsZTpvayIsc2F2ZWRGaWxlUGF0aDplYysiLyIrb30pfSxpKX0saSl9LGkpfSxnZXRTYXZlZEZpbGVMaXN0OmZ1bmN0aW9uKGUsaSl7dmFyIG89TGkoaSwiZ2V0U2F2ZWRGaWxlTGlzdCIpO3RjKGZ1bmN0aW9uKGUpe3ZhciB0PWUuY3JlYXRlUmVhZGVyKCkscj1bXTt0LnJlYWRFbnRyaWVzKGZ1bmN0aW9uKG4pe24mJm4ubGVuZ3RoP24uZm9yRWFjaChmdW5jdGlvbih0KXt0LmdldE1ldGFkYXRhKGZ1bmN0aW9uKGUpe3IucHVzaCh7ZmlsZVBhdGg6b2cuaW8uY29udmVydEFic29sdXRlRmlsZVN5c3RlbSh0LmZ1bGxQYXRoKSxjcmVhdGVUaW1lOmUubW9kaWZpY2F0aW9uVGltZS5nZXRUaW1lKCksc2l6ZTplLnNpemV9KSxyLmxlbmd0aD09PW4ubGVuZ3RoJiZmaShpLHtlcnJNc2c6ImdldFNhdmVkRmlsZUxpc3Q6b2siLGZpbGVMaXN0OnJ9KX0sbywhMSl9KTpmaShpLHtlcnJNc2c6ImdldFNhdmVkRmlsZUxpc3Q6b2siLGZpbGVMaXN0OnJ9KX0sbyl9LG8pfSxnZXRGaWxlSW5mbzpyYyxnZXRTYXZlZEZpbGVJbmZvOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGgscj1MaSh0LCJnZXRTYXZlZEZpbGVJbmZvIik7b2cuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChuLGZ1bmN0aW9uKGUpe2UuZ2V0TWV0YWRhdGEoZnVuY3Rpb24oZSl7ZmkodCx7Y3JlYXRlVGltZTplLm1vZGlmaWNhdGlvblRpbWUuZ2V0VGltZSgpLHNpemU6ZS5zaXplLGVyck1zZzoiZ2V0U2F2ZWRGaWxlSW5mbzpvayJ9KX0sciwhMSl9LHIpfSxyZW1vdmVTYXZlZEZpbGU6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5maWxlUGF0aCxyPUxpKHQsInJlbW92ZVNhdmVkRmlsZSIpO29nLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwobixmdW5jdGlvbihlKXtlLnJlbW92ZShmdW5jdGlvbigpe2ZpKHQse2Vyck1zZzoicmVtb3ZlU2F2ZWRGaWxlOm9rIn0pfSxyKX0scil9LG9wZW5Eb2N1bWVudDpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoLHI9KGUuZmlsZVR5cGUsamkodCwic2F2ZUZpbGUiKSksaT1MaSh0LCJzYXZlRmlsZSIpO29nLnJ1bnRpbWUub3BlbkRvY3VtZW50KFRpKG4pLHZvaWQgMCxyLGkpfSxjaG9vc2VMb2NhdGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj0id2VleCIhPT1kZy5udnVlQ29tcGlsZXI/YWM6b2M7cmV0dXJuIG4uY2hvb3NlTG9jYXRpb24uYXBwbHkobixlKX0sZ2V0TG9jYXRpb246ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS50eXBlO3ZvaWQgMD09PW4mJihuPSJ3Z3M4NCIpO3ZhciByPWUuZ2VvY29kZTt2b2lkIDA9PT1yJiYocj0hMSk7dmFyIGk9ZS5hbHRpdHVkZTt2b2lkIDA9PT1pJiYoaT0hMSk7dmFyIG89ZS5pc0hpZ2hBY2N1cmFjeTt2b2lkIDA9PT1vJiYobz0hMSk7dmFyIGE9ZS5oaWdoQWNjdXJhY3lFeHBpcmVUaW1lLHM9TGkodCwiZ2V0TG9jYXRpb24iKTtvZy5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oZnVuY3Rpb24oZSl7c2MobixlLHQpfSxmdW5jdGlvbihlKXsxNTAxIT09ZS5jb2RlP3MoZSk6c2MobixlLHQpfSx7Z2VvY29kZTpyLGVuYWJsZUhpZ2hBY2N1cmFjeTpvfHxpLHRpbWVvdXQ6YSxjb29yZHNUeXBlOm59KX0sb3BlbkxvY2F0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPSJ3ZWV4IiE9PWRnLm52dWVDb21waWxlcj91YzpjYztyZXR1cm4gbi5vcGVuTG9jYXRpb24uYXBwbHkobixlKX0sc3RhcnRMb2NhdGlvblVwZGF0ZTpmdW5jdGlvbihlLG4pe3ZhciB0PWUudHlwZTt2b2lkIDA9PT10JiYodD0iZ2NqMDIiKSxwYz1wY3x8b2cuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihmdW5jdGlvbih0KXtmYz0hMCxsYy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUsdC5jb29yZHMpfSl9LGZ1bmN0aW9uKHQpe2ZjfHwoZmkobix7ZXJyTXNnOiJzdGFydExvY2F0aW9uVXBkYXRlOmZhaWwgIit0Lm1lc3NhZ2V9KSxmYz0hMCksZGMuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHtlcnJNc2c6Im9uTG9jYXRpb25DaGFuZ2U6ZmFpbCAiK3QubWVzc2FnZX0pfSl9LHtjb29yZHNUeXBlOnR9KSxzZyhmdW5jdGlvbigpe2ZpKG4se2Vyck1zZzoic3RhcnRMb2NhdGlvblVwZGF0ZTpvayJ9KX0sMTAwKX0sc3RvcExvY2F0aW9uVXBkYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIDAhPT1wYyYmKG9nLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2gocGMpLGZjPSExLHBjPTApLHt9fSxvbkxvY2F0aW9uQ2hhbmdlOmZ1bmN0aW9uKGUpe2xjLnB1c2goZSl9LG9mZkxvY2F0aW9uQ2hhbmdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWxjLmluZGV4T2YoZSk7MDw9dCYmbGMuc3BsaWNlKHQsMSl9ZWxzZSBsYz1bXX0sb25Mb2NhdGlvbkNoYW5nZUVycm9yOmZ1bmN0aW9uKGUpe2RjLnB1c2goZSl9LG9mZkxvY2F0aW9uQ2hhbmdlRXJyb3I6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZGMuaW5kZXhPZihlKTswPD10JiZkYy5zcGxpY2UodCwxKX1lbHNlIGRjPVtdfSxzdGFydFJlY29yZDpmdW5jdGlvbihlLHQpe2hjJiZoYy5zdG9wKCksKGhjPW9nLmF1ZGlvLmdldFJlY29yZGVyKCkpLnJlY29yZCh7ZmlsZW5hbWU6Il9kb2MvYXVkaW8vIixmb3JtYXQ6ImFhYyJ9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoic3RhcnRSZWNvcmQ6b2siLHRlbXBGaWxlUGF0aDplfSl9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoic3RhcnRSZWNvcmQ6ZmFpbCJ9KX0pLHZjPXNnKGZ1bmN0aW9uKCl7aGMuc3RvcCgpLGhjPSExfSwzNmU1KX0sc3RvcFJlY29yZDpmdW5jdGlvbigpe3JldHVybiBoYz8odmMmJmNnKHZjKSxoYy5zdG9wKCkse2Vyck1zZzoic3RvcFJlY29yZDpvayJ9KTp7ZXJyTXNnOiJzdG9wUmVjb3JkOmZhaWwifX0scGxheVZvaWNlOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGg7aWYoZ2MmJm1jPT09biYmInBhdXNlIj09PXljKXJldHVybiB5Yz0icGxheSIsZ2MucGxheShmdW5jdGlvbihlKXt5Yz1tYz1nYz0hMSxmaSh0LHtlcnJNc2c6InBsYXlWb2ljZTpvayJ9KX0pLHtlcnJNc2c6InBsYXlWb2ljZTpvayJ9O2djJiZnYy5zdG9wKCksbWM9bix5Yz0icGxheSIsKGdjPW9nLmF1ZGlvLmNyZWF0ZVBsYXllcihUaShuKSkpLnBsYXkoZnVuY3Rpb24oZSl7eWM9bWM9Z2M9ITEsZmkodCx7ZXJyTXNnOiJwbGF5Vm9pY2U6b2sifSl9KX0scGF1c2VWb2ljZTpmdW5jdGlvbigpe3JldHVybiBnYyYmInBsYXkiPT09eWMmJihnYy5wYXVzZSgpLHljPSJwYXVzZSIpLHtlcnJNc2c6InBhdXNlVm9pY2U6b2sifX0sc3RvcFZvaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIGdjJiYoZ2Muc3RvcCgpLHljPW1jPWdjPSExKSx7ZXJyTXNnOiJzdG9wVm9pY2U6b2sifX0sY2hvb3NlSW1hZ2U6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5jb3VudCxyPWUuc2l6ZVR5cGUsaT1lLnNvdXJjZVR5cGUsbz1lLmNyb3AsYT1MaSh0LCJjaG9vc2VJbWFnZSIsImNhbmNlbCIpO2Z1bmN0aW9uIHMocil7dmFyIGk9W10sbz1bXTtQcm9taXNlLmFsbChyLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gcj1lLG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7b2cuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChyLGZ1bmN0aW9uKGUpe2UuZ2V0TWV0YWRhdGEodCxuLCExKX0sbil9KTt2YXIgcn0pKS50aGVuKGZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlLHQpe3ZhciBuPXJbdF07by5wdXNoKG4pLGkucHVzaCh7cGF0aDpuLHNpemU6ZS5zaXplfSl9KSxmaSh0LHtlcnJNc2c6ImNob29zZUltYWdlOm9rIix0ZW1wRmlsZVBhdGhzOm8sdGVtcEZpbGVzOml9KX0pLmNhdGNoKGEpfWZ1bmN0aW9uIGMoKXtvZy5jYW1lcmEuZ2V0Q2FtZXJhKCkuY2FwdHVyZUltYWdlKGZ1bmN0aW9uKGUpe3JldHVybiBzKFtlXSl9LGEse2ZpbGVuYW1lOnlvKyIvY2FtZXJhLyIscmVzb2x1dGlvbjoiaGlnaCIsY3JvcDpvLHNpemVUeXBlOnJ9KX1mdW5jdGlvbiB1KCl7b2cuZ2FsbGVyeS5waWNrKGZ1bmN0aW9uKGUpe3JldHVybiBzKGUuZmlsZXMpfSxhLHttYXhpbXVtOm4sbXVsdGlwbGU6ITAsc3lzdGVtOiExLGZpbGVuYW1lOnlvKyIvZ2FsbGVyeS8iLHBlcm1pc3Npb25BbGVydDohMCxjcm9wOm8sc2l6ZVR5cGU6cn0pfWlmKDE9PT1pLmxlbmd0aCl7aWYoaS5pbmNsdWRlcygiYWxidW0iKSlyZXR1cm4gdm9pZCB1KCk7aWYoaS5pbmNsdWRlcygiY2FtZXJhIikpcmV0dXJuIHZvaWQgYygpfW9nLm5hdGl2ZVVJLmFjdGlvblNoZWV0KHtjYW5jZWw6YXQoInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiKSxidXR0b25zOlt7dGl0bGU6YXQoInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSIpfSx7dGl0bGU6YXQoInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIil9XX0sZnVuY3Rpb24oZSl7c3dpdGNoKGUuaW5kZXgpe2Nhc2UgMTpjKCk7YnJlYWs7Y2FzZSAyOnUoKTticmVhaztkZWZhdWx0OmEoKX19KX0sY2hvb3NlVmlkZW86ZnVuY3Rpb24oZSxyKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5zb3VyY2VUeXBlLG49ZS5jb21wcmVzc2VkLGk9ZS5tYXhEdXJhdGlvbixvPWUuY2FtZXJhLGE9TGkociwiY2hvb3NlVmlkZW8iLCJjYW5jZWwiKTtmdW5jdGlvbiBzKG4pe3ZvaWQgMD09PW4mJihuPSIiKSxvZy5pby5nZXRWaWRlb0luZm8oe2ZpbGVQYXRoOm4sc3VjY2VzczpmdW5jdGlvbihlKXt2YXIgdD17ZXJyTXNnOiJjaG9vc2VWaWRlbzpvayIsdGVtcEZpbGVQYXRoOm59O3Quc2l6ZT1lLnNpemUsdC5kdXJhdGlvbj1lLmR1cmF0aW9uLHQud2lkdGg9ZS53aWR0aCx0LmhlaWdodD1lLmhlaWdodCxmaShyLHQpfSxmYWlsOmF9KX1mdW5jdGlvbiBjKCl7b2cuZ2FsbGVyeS5waWNrKGZ1bmN0aW9uKGUpe3JldHVybiBzKGUuZmlsZXNbMF0pfSxhLHtmaWx0ZXI6InZpZGVvIixzeXN0ZW06ITEsbXVsdGlwbGU6ITAsbWF4aW11bToxLGZpbGVuYW1lOnlvKyIvZ2FsbGVyeS8iLHBlcm1pc3Npb25BbGVydDohMCx2aWRlb0NvbXByZXNzOm59KX1mdW5jdGlvbiB1KCl7b2cuY2FtZXJhLmdldENhbWVyYSgpLnN0YXJ0VmlkZW9DYXB0dXJlKHMsYSx7aW5kZXg6ImZyb250Ij09PW8/MjoxLHZpZGVvTWF4aW11bUR1cmF0aW9uOmksZmlsZW5hbWU6eW8rIi9jYW1lcmEvIix2aWRlb0NvbXByZXNzOm59KX1pZigxPT09dC5sZW5ndGgpe2lmKHQuaW5jbHVkZXMoImFsYnVtIikpcmV0dXJuIHZvaWQgYygpO2lmKHQuaW5jbHVkZXMoImNhbWVyYSIpKXJldHVybiB2b2lkIHUoKX1vZy5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOmF0KCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIiksYnV0dG9uczpbe3RpdGxlOmF0KCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiKX0se3RpdGxlOmF0KCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSIpfV19LGZ1bmN0aW9uKGUpe3N3aXRjaChlLmluZGV4KXtjYXNlIDE6dSgpO2JyZWFrO2Nhc2UgMjpjKCk7YnJlYWs7ZGVmYXVsdDphKCl9fSl9LGNvbXByZXNzSW1hZ2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj15bysiL2NvbXByZXNzZWQvIitEYXRlLm5vdygpKyJfIitOaShlLnNyYykscj1MaSh0LCJjb21wcmVzc0ltYWdlIiksaT1lLmNvbXByZXNzZWRXaWR0aCxvPWUuY29tcHJlc3NlZEhlaWdodDsibnVtYmVyIj09dHlwZW9mIGkmJihlLndpZHRoPWkrInB4IiksIm51bWJlciI9PXR5cGVvZiBvJiYoZS5oZWlnaHQ9bysicHgiKSxvZy56aXAuY29tcHJlc3NJbWFnZShPYmplY3QuYXNzaWduKHt9LGUse2RzdDpufSksZnVuY3Rpb24oKXtmaSh0LHtlcnJNc2c6ImNvbXByZXNzSW1hZ2U6b2siLHRlbXBGaWxlUGF0aDpufSl9LHIpfSxjb21wcmVzc1ZpZGVvOmZ1bmN0aW9uKGUsdCl7dmFyIG49eW8rIi9jb21wcmVzc2VkLyIrRGF0ZS5ub3coKSsiXyIrTmkoZS5zcmMpLHI9amkodCwiY29tcHJlc3NWaWRlbyIpLGk9TGkodCwiY29tcHJlc3NWaWRlbyIpO29nLnppcC5jb21wcmVzc1ZpZGVvKE9iamVjdC5hc3NpZ24oe30sZSx7ZmlsZW5hbWU6bn0pLHIsaSl9LGdldEltYWdlSW5mbzp3YyxnZXRWaWRlb0luZm86a2MscHJldmlld0ltYWdlUGx1czpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5jdXJyZW50O3ZvaWQgMD09PXQmJih0PTApO3ZhciBuPWUuYmFja2dyb3VuZDt2b2lkIDA9PT1uJiYobj0iIzAwMDAwMCIpO3ZhciByPWUuaW5kaWNhdG9yO3ZvaWQgMD09PXImJihyPSJudW1iZXIiKTt2YXIgaT1lLmxvb3A7dm9pZCAwPT09aSYmKGk9ITEpO3ZhciBvPWUudXJscyxhPWUubG9uZ1ByZXNzQWN0aW9ucztvPW8ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBUaShlKX0pO3ZhciBzPU51bWJlcih0KTtyZXR1cm4gdD1pc05hTihzKT8odD1vLmluZGV4T2YoVGkodCkpKTwwPzA6dDpzLG9nLm5hdGl2ZVVJLnByZXZpZXdJbWFnZShvLHtjdXJyZW50OnQsYmFja2dyb3VuZDpuLGluZGljYXRvcjpyLGxvb3A6aSxvbkxvbmdQcmVzczpmdW5jdGlvbih0KXt2YXIgZT1bXSxuPSIiLHI9IiIsaT1hJiZhLmNhbGxiYWNrSWQ7aT8oZT1hLml0ZW1MaXN0P2EuaXRlbUxpc3Q6W10sbj1hLml0ZW1Db2xvcj9hLml0ZW1Db2xvcjoiIzAwMDAwMCIscj1hLnRpdGxlP2EudGl0bGU6IiIpOihlPVthdCgidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSIpXSxuPSIjMDAwMDAwIixyPSIiKTt2YXIgbz17YnV0dG9uczplLm1hcChmdW5jdGlvbihlKXtyZXR1cm57dGl0bGU6ZSxjb2xvcjpufX0pLGNhbmNlbDphdCgidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiKX07ciYmKG8udGl0bGU9ciksb2cubmF0aXZlVUkuYWN0aW9uU2hlZXQobyxmdW5jdGlvbihlKXtpZigwPGUuaW5kZXgpe2lmKGkpcmV0dXJuIHZvaWQgaGkoYS5jYWxsYmFja0lkLHtlcnJNc2c6InNob3dBY3Rpb25TaGVldDpvayIsdGFwSW5kZXg6ZS5pbmRleC0xLGluZGV4OnQuaW5kZXh9KTtvZy5nYWxsZXJ5LnNhdmUodC51cmwsZnVuY3Rpb24oZSl7b2cubmF0aXZlVUkudG9hc3QoYXQoInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIikpfSxmdW5jdGlvbigpe29nLm5hdGl2ZVVJLnRvYXN0KGF0KCJ1bmkucHJldmlld0ltYWdlLnNhdmUuZmFpbCIpKX0pfWVsc2UgaSYmaGkoYS5jYWxsYmFja0lkLHtlcnJNc2c6InNob3dBY3Rpb25TaGVldDpmYWlsIGNhbmNlbCJ9KX0pfX0pLHtlcnJNc2c6InByZXZpZXdJbWFnZTpvayJ9fSxjbG9zZVByZXZpZXdJbWFnZVBsdXM6ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG9nLm5hdGl2ZVVJLmNsb3NlUHJldmlld0ltYWdlKCkse2Vyck1zZzoiY2xvc2VQcmV2aWV3SW1hZ2VQbHVzOm9rIn19Y2F0Y2goZSl7cmV0dXJue2Vyck1zZzoiY2xvc2VQcmV2aWV3SW1hZ2VQbHVzOmZhaWwifX19LG9wZXJhdGVSZWNvcmRlcjpmdW5jdGlvbihlLHQpe3ZhciBuPWUub3BlcmF0aW9uVHlwZSxyPXt9O2Zvcih2YXIgaSBpbiBlKS0xPT09WyJvcGVyYXRpb25UeXBlIl0uaW5kZXhPZihpKSYmKHJbaV09ZVtpXSk7dmFyIG89cjtyZXR1cm4geGNbbl0obykse2Vyck1zZzoib3BlcmF0ZVJlY29yZGVyOm9rIn19LHNhdmVJbWFnZVRvUGhvdG9zQWxidW06ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5maWxlUGF0aCxyPWppKHQsInNhdmVJbWFnZVRvUGhvdG9zQWxidW0iKSxpPUxpKHQsInNhdmVJbWFnZVRvUGhvdG9zQWxidW0iKTtvZy5nYWxsZXJ5LnNhdmUoVGkobikscixpKX0sc2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoO29nLmdhbGxlcnkuc2F2ZShUaShuKSxmdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6InNhdmVWaWRlb1RvUGhvdG9zQWxidW06b2sifSl9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoic2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpmYWlsIn0pfSl9LG9wZXJhdGVEb3dubG9hZFRhc2s6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuZG93bmxvYWRUYXNrSWQsbj1lLm9wZXJhdGlvblR5cGUscj1UY1t0XTtyZXR1cm4gciYmImFib3J0Ij09PW4/KGRlbGV0ZSBUY1t0XSxyLmFib3J0KCksT2Moe2Rvd25sb2FkVGFza0lkOnQsc3RhdGU6ImZhaWwiLGVyck1zZzoiYWJvcnQifSkse2Vyck1zZzoib3BlcmF0ZURvd25sb2FkVGFzazpvayJ9KTp7ZXJyTXNnOiJvcGVyYXRlRG93bmxvYWRUYXNrOmZhaWwifX0sY3JlYXRlRG93bmxvYWRUYXNrOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnVybCxyPWUuaGVhZGVyLGk9ZS50aW1lb3V0O2k9KGl8fGRnLm5ldHdvcmtUaW1lb3V0JiZkZy5uZXR3b3JrVGltZW91dC5yZXF1ZXN0fHw2ZTQpLzFlMzt2YXIgbz1vZy5kb3dubG9hZGVyLmNyZWF0ZURvd25sb2FkKHQse3RpbWVvdXQ6aSxmaWxlbmFtZTp5bysiL2Rvd25sb2FkLyIscmV0cnk6MCxyZXRyeUludGVydmFsOjB9LGZ1bmN0aW9uKGUsdCl7T2ModD97ZG93bmxvYWRUYXNrSWQ6bixzdGF0ZToic3VjY2VzcyIsdGVtcEZpbGVQYXRoOmUuZmlsZW5hbWUsc3RhdHVzQ29kZTp0fTp7ZG93bmxvYWRUYXNrSWQ6bixzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTp0fSl9KTtmb3IodmFyIGEgaW4gcilrKHIsYSkmJm8uc2V0UmVxdWVzdEhlYWRlcihhLHJbYV0pO3JldHVybiBvLmFkZEV2ZW50TGlzdGVuZXIoInN0YXRlY2hhbmdlZCIsZnVuY3Rpb24oZSx0KXtlLmRvd25sb2FkZWRTaXplJiZlLnRvdGFsU2l6ZSYmT2Moe2Rvd25sb2FkVGFza0lkOm4sc3RhdGU6InByb2dyZXNzVXBkYXRlIixwcm9ncmVzczpwYXJzZUludChlLmRvd25sb2FkZWRTaXplL2UudG90YWxTaXplKjEwMCksdG90YWxCeXRlc1dyaXR0ZW46ZS5kb3dubG9hZGVkU2l6ZSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1dyaXRlOmUudG90YWxTaXplfSl9KSwoVGNbbl09bykuc3RhcnQoKSx7ZG93bmxvYWRUYXNrSWQ6bixlcnJNc2c6ImNyZWF0ZURvd25sb2FkVGFzazpvayJ9fSgrK0NjLGUpfSxjcmVhdGVSZXF1ZXN0VGFza0J5SWQ6UGMsY3JlYXRlUmVxdWVzdFRhc2s6ZnVuY3Rpb24oZSl7cmV0dXJuIFBjKCsrRWMsZSl9LG9wZXJhdGVSZXF1ZXN0VGFzazpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5yZXF1ZXN0VGFza0lkLG49ZS5vcGVyYXRpb25UeXBlLHI9SWNbdF07cmV0dXJuIHImJiJhYm9ydCI9PT1uPyhyLmFib3J0KCkse2Vyck1zZzoib3BlcmF0ZVJlcXVlc3RUYXNrOm9rIn0pOntlcnJNc2c6Im9wZXJhdGVSZXF1ZXN0VGFzazpmYWlsIn19LGNvbmZpZ01UTFM6ZnVuY3Rpb24oZSxpKXt2YXIgdD1lLmNlcnRpZmljYXRlcztwaSgic3RyZWFtIikuY29uZmlnTVRMUyh0LGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUuY29kZSxyPWUubWVzc2FnZTtzd2l0Y2godCl7Y2FzZSJzdWNjZXNzIjpmaShpLHtlcnJNc2c6ImNvbmZpZ01UTFM6b2siLGNvZGU6bn0pO2JyZWFrO2Nhc2UiZmFpbCI6ZmkoaSx7ZXJyTXNnOiJjb25maWdNVExTOmZhaWwgIityLGNvZGU6bn0pfX0pfSxjcmVhdGVTb2NrZXRUYXNrOmZ1bmN0aW9uKGUpe3JldHVybiBCYyhTdHJpbmcoRGF0ZS5ub3coKSksZSl9LG9wZXJhdGVTb2NrZXRUYXNrOmZ1bmN0aW9uKGUpe3ZhciB0PWUsbj10Lm9wZXJhdGlvblR5cGUscj10LmNvZGUsaT10LnJlYXNvbixvPXQuZGF0YSxhPXQuc29ja2V0VGFza0lkLHM9amNbYV07aWYoIXMpcmV0dXJue2Vyck1zZzoib3BlcmF0ZVNvY2tldFRhc2s6ZmFpbCJ9O3N3aXRjaChuKXtjYXNlInNlbmQiOnJldHVybiBvJiZzLnNlbmQoe2lkOmEsZGF0YToib2JqZWN0Ij09dHlwZW9mIG8/eyJAdHlwZSI6ImJpbmFyeSIsYmFzZTY0OmJpKG8pfTpvfSkse2Vyck1zZzoib3BlcmF0ZVNvY2tldFRhc2s6b2sifTtjYXNlImNsb3NlIjpyZXR1cm4gcy5jbG9zZSh7aWQ6YSxjb2RlOnIscmVhc29uOml9KSxkZWxldGUgamNbYV0se2Vyck1zZzoib3BlcmF0ZVNvY2tldFRhc2s6b2sifX1yZXR1cm57ZXJyTXNnOiJvcGVyYXRlU29ja2V0VGFzazpmYWlsIn19LG9wZXJhdGVVcGxvYWRUYXNrOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnVwbG9hZFRhc2tJZCxuPWUub3BlcmF0aW9uVHlwZSxyPURjW3RdO3JldHVybiByJiYiYWJvcnQiPT09bj8oZGVsZXRlIERjW3RdLHIuYWJvcnQoKSxSYyh7dXBsb2FkVGFza0lkOnQsc3RhdGU6ImZhaWwiLGVyck1zZzoiYWJvcnQifSkse2Vyck1zZzoib3BlcmF0ZVVwbG9hZFRhc2s6b2sifSk6e2Vyck1zZzoib3BlcmF0ZVVwbG9hZFRhc2s6ZmFpbCJ9fSxjcmVhdGVVcGxvYWRUYXNrOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnVybCxyPWUuZmlsZVBhdGgsaT1lLm5hbWUsbz1lLmZpbGVzLGE9ZS5oZWFkZXIscz1lLmZvcm1EYXRhLGM9ZS50aW1lb3V0O2M9KGN8fGRnLm5ldHdvcmtUaW1lb3V0JiZkZy5uZXR3b3JrVGltZW91dC51cGxvYWRGaWxlfHw2ZTQpLzFlMzt2YXIgdT1vZy51cGxvYWRlci5jcmVhdGVVcGxvYWQodCx7dGltZW91dDpjLHJldHJ5OjAscmV0cnlJbnRlcnZhbDowfSxmdW5jdGlvbihlLHQpe1JjKHQ/e3VwbG9hZFRhc2tJZDpuLHN0YXRlOiJzdWNjZXNzIixkYXRhOmUucmVzcG9uc2VUZXh0LHN0YXR1c0NvZGU6dH06e3VwbG9hZFRhc2tJZDpuLHN0YXRlOiJmYWlsIixkYXRhOiIiLHN0YXR1c0NvZGU6dH0pLGRlbGV0ZSBEY1tuXX0pO2Zvcih2YXIgbCBpbiBhKWsoYSxsKSYmdS5zZXRSZXF1ZXN0SGVhZGVyKGwsU3RyaW5nKGFbbF0pKTtmb3IodmFyIGQgaW4gcylrKHMsZCkmJnUuYWRkRGF0YShkLFN0cmluZyhzW2RdKSk7cmV0dXJuIG8mJm8ubGVuZ3RoP28uZm9yRWFjaChmdW5jdGlvbihlKXt1LmFkZEZpbGUoVGkoZS51cml8fGUuZmlsZVBhdGgpLHtrZXk6ZS5uYW1lfHwiZmlsZSJ9KX0pOnUuYWRkRmlsZShUaShyKSx7a2V5Oml9KSx1LmFkZEV2ZW50TGlzdGVuZXIoInN0YXRlY2hhbmdlZCIsZnVuY3Rpb24oZSx0KXtlLnVwbG9hZGVkU2l6ZSYmZS50b3RhbFNpemUmJlJjKHt1cGxvYWRUYXNrSWQ6bixzdGF0ZToicHJvZ3Jlc3NVcGRhdGUiLHByb2dyZXNzOnBhcnNlSW50KGUudXBsb2FkZWRTaXplL2UudG90YWxTaXplKjEwMCksdG90YWxCeXRlc1NlbnQ6ZS51cGxvYWRlZFNpemUsdG90YWxCeXRlc0V4cGVjdGVkVG9TZW5kOmUudG90YWxTaXplfSl9KSwoRGNbbl09dSkuc3RhcnQoKSx7dXBsb2FkVGFza0lkOm4sZXJyTXNnOiJjcmVhdGVVcGxvYWRUYXNrOm9rIn19KCsrTmMsZSl9LGdldFByb3ZpZGVyOmZ1bmN0aW9uKGUscil7dmFyIGk9ZS5zZXJ2aWNlO1VjW2ldP1VjW2ldKGZ1bmN0aW9uKGUsdCxuKXtmaShyLGU/e2Vyck1zZzoiZ2V0UHJvdmlkZXI6ZmFpbCAiK2UubWVzc2FnZX06e2Vyck1zZzoiZ2V0UHJvdmlkZXI6b2siLHNlcnZpY2U6aSxwcm92aWRlcjp0LHByb3ZpZGVyczpuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlLnNlcnZpY2VSZWFkeSYmKGUuaXNBcHBFeGlzdD1lLnNlcnZpY2VSZWFkeSksImJvb2xlYW4iPT10eXBlb2YgZS5uYXRpdmVDbGllbnQmJihlLmlzQXBwRXhpc3Q9ZS5uYXRpdmVDbGllbnQpLGV9KX0pfSk6Zmkocix7ZXJyTXNnOiJnZXRQcm92aWRlcjpmYWlsIHNlcnZpY2Ugbm90IGZvdW5kIn0pfSxsb2dpbjpWYyxnZXRVc2VySW5mbzpxYyxnZXRVc2VyUHJvZmlsZTpmdW5jdGlvbihlLHQpe3JldHVybiBxYyhlLHQpfSxvcGVyYXRlV1hEYXRhOmZ1bmN0aW9uKGUsdCl7c3dpdGNoKGUuZGF0YS5hcGlfbmFtZSl7Y2FzZSJ3ZWJhcGlfZ2V0dXNlcmluZm8iOnFjKGUsdCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm57ZXJyTXNnOiJvcGVyYXRlV1hEYXRhOmZhaWwifX19LHByZUxvZ2luOldjLGNsb3NlQXV0aFZpZXc6SGMsZ2V0Q2hlY2tCb3hTdGF0ZTpHYyxnZXRVbml2ZXJpZnlNYW5hZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIEZjfHwoRmM9bmV3IEpjKX0scmVxdWVzdFBheW1lbnQ6ZnVuY3Rpb24obixyKXt2YXIgaT1uLnByb3ZpZGVyLG89TGkociwicmVxdWVzdFBheW1lbnQiKTtvZy5wYXltZW50LmdldENoYW5uZWxzKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PWl9KTt0P29nLnBheW1lbnQucmVxdWVzdCh0LG4ub3JkZXJJbmZvLGZ1bmN0aW9uKGUpe2UuZXJyTXNnPSJyZXF1ZXN0UGF5bWVudDpvayIsZmkocixlKX0sbyk6Zmkocix7ZXJyTXNnOiJyZXF1ZXN0UGF5bWVudDpmYWlsIHNlcnZpY2Ugbm90IGZvdW5kIn0pfSxvKX0sc3Vic2NyaWJlUHVzaDpmdW5jdGlvbihlLHQpe3ZhciBuPW9nLnB1c2guZ2V0Q2xpZW50SW5mbygpO3JldHVybiBuPyhRY3x8KFFjPSEwLG9nLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigicmVjZWl2ZSIsZnVuY3Rpb24oZSl7WGMmJiFldSYmaGkoIm9uUHVzaE1lc3NhZ2UiLHttZXNzYWdlSWQ6ZS5fX1VVSURfXyxkYXRhOmUucGF5bG9hZCxlcnJNc2c6Im9uUHVzaDpvayJ9KX0pKSxldT0hMSxuLmVyck1zZz0ic3Vic2NyaWJlUHVzaDpvayIsbik6e2Vyck1zZzoic3Vic2NyaWJlUHVzaDpmYWlsIOivt+ehruS/neW9k+WJjei/kOihjOeOr+Wig+W3suWMheWQqyBwdXNoIOaooeWdlyJ9fSx1bnN1YnNjcmliZVB1c2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGV1PSEwLHtlcnJNc2c6InVuc3Vic2NyaWJlUHVzaDpvayJ9fSxvblB1c2g6ZnVuY3Rpb24oKXtyZXR1cm4gUWM/b2cucHVzaC5nZXRDbGllbnRJbmZvKCk/KFhjPSEwLHtlcnJNc2c6Im9uUHVzaDpvayJ9KTp7ZXJyTXNnOiJvblB1c2g6ZmFpbCDor7fnoa7kv53lvZPliY3ov5DooYznjq/looPlt7LljIXlkKsgcHVzaCDmqKHlnZcifTp7ZXJyTXNnOiJvblB1c2g6ZmFpbCDor7flhYjosIPnlKggdW5pLnN1YnNjcmliZVB1c2gifX0sb2ZmUHVzaDpmdW5jdGlvbihlKXtyZXR1cm4gWGM9ITEse2Vyck1zZzoib2ZmUHVzaDpvayJ9fSxjcmVhdGVQdXNoTWVzc2FnZTpmdW5jdGlvbihlLHQpe3ZhciBuPVpzKCk7aWYoImF1dGhvcml6ZWQiIT09bi5ub3RpZmljYXRpb25BdXRob3JpemVkKXJldHVybiBmaSh0LHtlcnJNc2c6ImNyZWF0ZVB1c2hNZXNzYWdlOmZhaWwgbm90aWZpY2F0aW9uQXV0aG9yaXplZDogIituLm5vdGlmaWNhdGlvbkF1dGhvcml6ZWR9KTt2YXIgcj1PYmplY3QuYXNzaWduKHt9LGUpO2RlbGV0ZSByLmNvbnRlbnQsZGVsZXRlIHIucGF5bG9hZCxvZy5wdXNoLmNyZWF0ZU1lc3NhZ2UoZS5jb250ZW50LGUucGF5bG9hZCxyKSxmaSh0LHtlcnJNc2c6ImNyZWF0ZVB1c2hNZXNzYWdlOm9rIn0pfSxnZXRDaGFubmVsTWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBaY3x8KFpjPW9nLnB1c2guZ2V0Q2hhbm5lbE1hbmFnZXIoKSl9LHJlcXVpcmVOYXRpdmVQbHVnaW46dHUsc2hhcmVBcHBNZXNzYWdlRGlyZWN0bHk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRpdGxlLHI9ZS5wYXRoLGk9ZS5pbWFnZVVybCxvPWUudXNlRGVmYXVsdFNuYXBzaG90O249bnx8ZGcuYXBwbmFtZTt2YXIgYT1mdW5jdGlvbigpe291KHtwcm92aWRlcjoid2VpeGluIix0eXBlOjAsdGl0bGU6bixpbWFnZVVybDppLGhyZWY6cixzY2VuZToiV1hTY2VuZVNlc3Npb24ifSx0LCJzaGFyZUFwcE1lc3NhZ2VEaXJlY3RseSIpfSxzPUxpKHQsInNoYXJlQXBwTWVzc2FnZURpcmVjdGx5Iik7aWYobyl7dmFyIGM9dmcoKSx1PW9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoY1tjLmxlbmd0aC0xXS5fX3d4V2Vidmlld0lkX18rIiIpO2lmKHUpe3ZhciBsPW5ldyBvZy5uYXRpdmVPYmouQml0bWFwO3UuZHJhdyhsLGZ1bmN0aW9uKCl7dmFyIGU9eW8rIi9zaGFyZS9zbmFwc2hvdC5qcGciO2wuc2F2ZShlLHtvdmVyd3JpdGU6ITAsZm9ybWF0OiJqcGcifSxmdW5jdGlvbigpe2k9ZSxhKCl9LHMpfSxzKX1lbHNlIGEoKX1lbHNlIGEoKX0sc2hhcmU6b3Usc2hhcmVXaXRoU3lzdGVtOmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1uJiYobj0ic2hhcmVXaXRoU3lzdGVtIik7dmFyIHI9ZS50eXBlLGk9ZS5pbWFnZVVybCxvPWUuc3VtbWFyeSxhPWUuaHJlZjtyPXJ8fCJ0ZXh0Ijt2YXIgcz1MaSh0LG4pO1sidGV4dCIsImltYWdlIl0uaW5kZXhPZihyKTwwJiZmaSh0LHtlcnJNc2c6bisiOmZhaWwg5YiG5Lqr5Y+C5pWwIHR5cGUg5LiN5q2j56GuIn0pLCJzdHJpbmciPT10eXBlb2YgaSYmaSYmKGk9VGkoaSkpLG9nLnNoYXJlLnNlbmRXaXRoU3lzdGVtKHt0eXBlOnIscGljdHVyZXM6aSYmW2ldLGNvbnRlbnQ6byxocmVmOmF9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzpuKyI6b2sifSl9LHMpfSxyZXN0b3JlR2xvYmFsOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2YXIgYTtvZyE9PXQmJihpZz1lLGE9KG9nPXQpLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSx2aT1hLG9nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT1naSxzZz1uLGNnPXIsdWc9aSxsZz1vKSxkZy5zZXJ2aWNlUmVhZHk9ITB9LHJlcXVpcmVHbG9iYWw6ZnVuY3Rpb24oKXtmb3IodmFyIGU9WyJBcnJheUJ1ZmZlciIsIkludDhBcnJheSIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJVaW50MzJBcnJheSIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkJpZ0ludDY0QXJyYXkiLCJCaWdVaW50NjRBcnJheSJdLHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3Rbcl09Z2xvYmFsW3JdfXJldHVybiB0fSxnZXRTdWJOVnVlQnlJZDpzdSxnZXRDdXJyZW50U3ViTlZ1ZTpmdW5jdGlvbigpe3JldHVybiBzdShvZy53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWQpfSxvbkhvc3RFdmVudFJlY2VpdmU6ZnVuY3Rpb24oZSl7Y3UucHVzaChlKX0sb25OYXRpdmVFdmVudFJlY2VpdmU6ZnVuY3Rpb24oZSl7Y3UucHVzaChlKX0sc2VuZE5hdGl2ZUV2ZW50OnV1LGxvYWRTdWJQYWNrYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUucm9vdDtpZigtMSE9PWJzLmluZGV4T2YoaSkpcmV0dXJue2Vyck1zZzoibG9hZFN1YlBhY2thZ2U6b2sifTticy5wdXNoKGkpLG49aSsiL2FwcC1zdWItc2VydmljZS5qcyIscj1mdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6ImxvYWRTdWJQYWNrYWdlOm9rIn0pfSxkZy5vblNlcnZpY2VSZWFkeShmdW5jdGlvbigpe2lnLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5ldmFsSlNGaWxlcyhbbl0scil9KX0sc2VuZEhvc3RFdmVudDpsdSxuYXZpZ2F0ZVRvTWluaVByb2dyYW06ZnVuY3Rpb24oZSx0KXtsdSgibmF2aWdhdGVUb1VuaU1QIixlLGZ1bmN0aW9uKGUpe2lmKGUuZXJyTXNnJiYtMT09PWUuZXJyTXNnLmluZGV4T2YoIjpvayIpKXJldHVybiBmaSh0LHtlcnJNc2c6ZS5lcnJNc2d9KTtmaSh0LHtlcnJNc2c6Im5hdmlnYXRlVG9NaW5pUHJvZ3JhbTpvayJ9KX0pfSxnZXRMYXVuY2hPcHRpb25zU3luYzpmdW5jdGlvbigpe3JldHVybiBUc30sZ2V0RW50ZXJPcHRpb25zU3luYzpmdW5jdGlvbigpe3JldHVybiBPcygpfSxuYXZpZ2F0ZUJhY2s6JHUsbmF2aWdhdGVUbzpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5ldmVudHMsaT1lLm9wZW5UeXBlLG89ZS5hbmltYXRpb25UeXBlLGE9ZS5hbmltYXRpb25EdXJhdGlvbixzPW4uc3BsaXQoIj8iKSxjPXNbMF0sdT1mZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1jfSkud2luZG93LGw9ZGcud2luZG93fHx7fTtvfHwobz11LmFuaW1hdGlvblR5cGV8fGwuYW5pbWF0aW9uVHlwZXx8dGEpLGF8fChhPXUuYW5pbWF0aW9uRHVyYXRpb258fGwuYW5pbWF0aW9uRHVyYXRpb258fG5hKTt2YXIgZD1FKHNbMV18fCIiKTt2cyhjLGZ1bmN0aW9uKCl7anUoe3VybDpuLHBhdGg6YyxxdWVyeTpkLGV2ZW50czpyLGFuaW1hdGlvblR5cGU6byxhbmltYXRpb25EdXJhdGlvbjphfSx0KX0sImFwcExhdW5jaCI9PT1pKX0scmVMYXVuY2g6ZnVuY3Rpb24oZSxhKXt2YXIgcz1lLnVybCx0PXMuc3BsaXQoIj8iKSxjPXRbMF0sdT1FKHRbMV18fCIiKTt2cyhjLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvO3Q9YSxuPShlPXt1cmw6cyxwYXRoOmMscXVlcnk6dX0pLnVybCxyPWUucGF0aCxpPWUucXVlcnksbz12ZyghMCkuc2xpY2UoMCksZmcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09cn0pLm1ldGEuaXNUYWJCYXImJnFzLnN3aXRjaFRhYihyLnNsaWNlKDEpKSxFdShqcyh7dXJsOm4scGF0aDpyLHF1ZXJ5Omksb3BlblR5cGU6InJlTGF1bmNoIn0pLCJub25lIiwwLGZ1bmN0aW9uKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuJHJlbW92ZSgpLE91KGUuJGdldEFwcFdlYnZpZXcoKSwibm9uZSIpfSksZmkodCx7ZXJyTXNnOiJyZUxhdW5jaDpvayJ9KX0pLG1pKCl9KX0scmVkaXJlY3RUbzpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5leGlzdHMsaT1uLnNwbGl0KCI/Iiksbz1pWzBdLGE9RShpWzFdfHwiIik7dnMobyxmdW5jdGlvbigpe0J1KHt1cmw6bixwYXRoOm8scXVlcnk6YSxleGlzdHM6cn0sdCl9KX0sc3dpdGNoVGFiOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS51cmwscj1lLmZyb20saT1lLm9wZW5UeXBlLG89bi5zcGxpdCgiPyIpLGE9b1swXSxzPUUob1sxXXx8IiIpO3ZzKGEsZnVuY3Rpb24oKXshZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnVybCxyPWUucGF0aCxpPWUucXVlcnk7ZS5mcm9tLHFzLnN3aXRjaFRhYihyLnNsaWNlKDEpKTt2YXIgbyxhLHM9dmcoKSxjPXMubGVuZ3RoLHU9ITEsbD0hMTtpZigxPD1jJiYoKG89c1tjLTFdKS4kcGFnZS5tZXRhLmlzVGFiQmFyP3U9ITA6KGw9ITAscy5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihlKXtlLiRwYWdlLm1ldGEuaXNUYWJCYXJ8fGU9PT1vfHwoZS4kcmVtb3ZlKCksT3UoZS4kZ2V0QXBwV2VidmlldygpLCJub25lIikpfSksby4kcmVtb3ZlKCksc2coZnVuY3Rpb24oKXsicmVkaXJlY3QiPT09by4kcGFnZS5vcGVuVHlwZT9PdShvLiRnZXRBcHBXZWJ2aWV3KCkscmEsbmEpOk91KG8uJGdldEFwcFdlYnZpZXcoKSwiYXV0byIpfSwxMDApKSksdmcoITApLmZvckVhY2goZnVuY3Rpb24oZSl7Ii8iK2Uucm91dGU9PT1yPyhlLiRwYWdlLm1ldGEudmlzaWJsZXx8KGw9ITApLGUuJHBhZ2UubWV0YS52aXNpYmxlPSEwLGE9ZSk6ZS4kcGFnZS5tZXRhLmlzVGFiQmFyJiYoZS4kcGFnZS5tZXRhLnZpc2libGU9ITEpfSksbz09PWEmJih1PSExKSxvJiZ1JiZvLiR2bS5fX2NhbGxfaG9vaygib25IaWRlIiksIWEpcmV0dXJuIEV1KGpzKHt1cmw6bixwYXRoOnIscXVlcnk6aSxvcGVuVHlwZToic3dpdGNoVGFiIn0pLCJub25lIiwwLGZ1bmN0aW9uKCl7bWkoKSxmaSh0LHtlcnJNc2c6InN3aXRjaFRhYjpvayJ9KX0sNzApO3ZhciBkPWEuJGdldEFwcFdlYnZpZXcoKTtkLnNob3coIm5vbmUiKSxsJiYhZC5fX3ByZWxvYWRfXyYmYS4kdm0uX19jYWxsX2hvb2soIm9uU2hvdyIpLG1pKCksZmkodCx7ZXJyTXNnOiJzd2l0Y2hUYWI6b2sifSl9KHt1cmw6bixwYXRoOmEscXVlcnk6cyxmcm9tOnJ9LHQpfSwiYXBwTGF1bmNoIj09PWkpfSx1blByZWxvYWRQYWdlOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLnVybCxpPSgobj1Nc1t0PXJdKSYmKG4uX19wYWdlX18mJlBzKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bi5fX3BhZ2VfX30pP24uX19wcmVsb2FkX189ITE6bi5jbG9zZSgibm9uZSIpLGRlbGV0ZSBNc1t0XSksbik7cmV0dXJuIGk/e2lkOmkuaWQsdXJsOnIsZXJyTXNnOiJ1blByZWxvYWRQYWdlOm9rIn06e3VybDpyLGVyck1zZzoidW5QcmVsb2FkUGFnZTpmYWlsIG5vdCBmb3VuZCJ9fSxwcmVsb2FkUGFnZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9bi5zcGxpdCgiPyIpO2ZpKHQse2lkOmZ1bmN0aW9uKGUpe3ZhciB0PWUudXJsLG49ZS5wYXRoLHI9ZS5xdWVyeTtpZighTXNbdF0pe3ZhciBpPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZmcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09bn0pKSk7TXNbdF09dXMobixpLHIse19fcHJlbG9hZF9fOiEwLF9fcXVlcnlfXzpKU09OLnN0cmluZ2lmeShyKX0pfXJldHVybiBNc1t0XX0oe3VybDpuLHBhdGg6clswXSxxdWVyeTpFKHJbMV18fCIiKX0pLmlkLHVybDpuLGVyck1zZzoicHJlbG9hZFBhZ2U6b2sifSl9LHNldFN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5rZXkscj1lLmRhdGEsaT0oZS5pc1N5bmMsdHlwZW9mIHIpLG89InN0cmluZyI9PT1pP3I6SlNPTi5zdHJpbmdpZnkoe3R5cGU6aSxkYXRhOnJ9KTt0cnl7InN0cmluZyI9PT1pJiZ2b2lkIDAhPT16dShvKT9vZy5zdG9yYWdlLnNldEl0ZW1Bc3luYyhuK0Z1LGksZnVuY3Rpb24oKXt9KTpvZy5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhuK0Z1LGZ1bmN0aW9uKCl7fSksb2cuc3RvcmFnZS5zZXRJdGVtQXN5bmMobixvLGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJzZXRTdG9yYWdlOm9rIn0pfSxmdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6InNldFN0b3JhZ2U6ZmFpbCAiK2UubWVzc2FnZX0pfSl9Y2F0Y2goZSl7ZmkodCx7ZXJyTXNnOiJzZXRTdG9yYWdlOmZhaWwgIitlfSl9fSxzZXRTdG9yYWdlU3luYzpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiB0LHI9InN0cmluZyI9PT1uP3Q6SlNPTi5zdHJpbmdpZnkoe3R5cGU6bixkYXRhOnR9KTt0cnl7InN0cmluZyI9PT1uJiZ2b2lkIDAhPT16dShyKT9vZy5zdG9yYWdlLnNldEl0ZW0oZStGdSxuKTpvZy5zdG9yYWdlLnJlbW92ZUl0ZW0oZStGdSksb2cuc3RvcmFnZS5zZXRJdGVtKGUscil9Y2F0Y2goZSl7fX0sZ2V0U3RvcmFnZTpmdW5jdGlvbihlLHIpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmtleTtvZy5zdG9yYWdlLmdldEl0ZW1Bc3luYyh0LGZ1bmN0aW9uKG4pe29nLnN0b3JhZ2UuZ2V0SXRlbUFzeW5jKHQrRnUsZnVuY3Rpb24oZSl7dmFyIHQ9KGUuZGF0YXx8IiIpLnRvTG93ZXJDYXNlKCk7Zmkocix7ZGF0YTpWdSh0LG4uZGF0YSksZXJyTXNnOiJnZXRTdG9yYWdlOm9rIn0pfSxmdW5jdGlvbigpe2ZpKHIse2RhdGE6VnUoIiIsbi5kYXRhKSxlcnJNc2c6ImdldFN0b3JhZ2U6b2sifSl9KX0sZnVuY3Rpb24oZSl7Zmkocix7ZGF0YToiIixlcnJNc2c6ImdldFN0b3JhZ2U6ZmFpbCAiK2UubWVzc2FnZX0pfSl9LGdldFN0b3JhZ2VTeW5jOmZ1bmN0aW9uKGUpe3ZhciB0PW9nLnN0b3JhZ2UuZ2V0SXRlbShlKSxuPShvZy5zdG9yYWdlLmdldEl0ZW0oZStGdSl8fCIiKS50b0xvd2VyQ2FzZSgpO3JldHVybiJzdHJpbmciIT10eXBlb2YgdD8iIjpWdShuLHQpfSxyZW1vdmVTdG9yYWdlOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUua2V5O29nLnN0b3JhZ2UucmVtb3ZlSXRlbUFzeW5jKG4rRnUsZnVuY3Rpb24oKXt9KSxvZy5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhuLGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoicmVtb3ZlU3RvcmFnZTpvayJ9KX0sZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOiJyZW1vdmVTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxyZW1vdmVTdG9yYWdlU3luYzpmdW5jdGlvbihlKXtvZy5zdG9yYWdlLnJlbW92ZUl0ZW0oZStGdSksb2cuc3RvcmFnZS5yZW1vdmVJdGVtKGUpfSxjbGVhclN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXtvZy5zdG9yYWdlLmNsZWFyQXN5bmMoZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOiJjbGVhclN0b3JhZ2U6b2sifSl9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoiY2xlYXJTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxjbGVhclN0b3JhZ2VTeW5jOmZ1bmN0aW9uKCl7b2cuc3RvcmFnZS5jbGVhcigpfSxnZXRTdG9yYWdlSW5mbzpxdSxnZXRTdG9yYWdlSW5mb1N5bmM6ZnVuY3Rpb24oKXt2YXIgZT1xdSgpO3JldHVybiBkZWxldGUgZS5lcnJNc2csZX0sc2hvd0tleWJvYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIG9nLmtleS5zaG93U29mdEtleWJvcmQoKSx7ZXJyTXNnOiJzaG93S2V5Ym9hcmQ6b2sifX0saGlkZUtleWJvYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIG9nLmtleS5oaWRlU29mdEtleWJvcmQoKSx7ZXJyTXNnOiJoaWRlS2V5Ym9hcmQ6b2sifX0sc2V0TmF2aWdhdGlvbkJhclRpdGxlOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLl9fcGFnZV9fLG49ZS50aXRsZTt2b2lkIDA9PT1uJiYobj0iIik7dmFyIHI9a2kodCk7aWYocil7dmFyIGk9ci5nZXRTdHlsZSgpO3JldHVybiBpJiZpLnRpdGxlTlZpZXcmJnIuc2V0U3R5bGUoe3RpdGxlTlZpZXc6e3RpdGxlVGV4dDpufX0pLHtlcnJNc2c6InNldE5hdmlnYXRpb25CYXJUaXRsZTpvayJ9fXJldHVybntlcnJNc2c6InNldE5hdmlnYXRpb25CYXJUaXRsZTpmYWlsIn19LHNob3dOYXZpZ2F0aW9uQmFyTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiBvZy5uYXRpdmVVSS5zaG93V2FpdGluZygiIix7bW9kYWw6ITF9KSx7ZXJyTXNnOiJzaG93TmF2aWdhdGlvbkJhckxvYWRpbmc6b2sifX0saGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIG9nLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLHtlcnJNc2c6ImhpZGVOYXZpZ2F0aW9uQmFyTG9hZGluZzpvayJ9fSxzZXROYXZpZ2F0aW9uQmFyQ29sb3I6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0LG4scj1lLl9fcGFnZV9fLGk9ZS5mcm9udENvbG9yLG89ZS5iYWNrZ3JvdW5kQ29sb3IsYT1raShyKTtpZihhKXt2YXIgcz17fTtpJiYocy50aXRsZUNvbG9yPWkpLG8mJihzLmJhY2tncm91bmRDb2xvcj1vKTt2YXIgYz0iIzAwMDAwMCI9PT1pPyJkYXJrIjoibGlnaHQiO29nLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShjKSx0PWMsKG49dmcoKSkubGVuZ3RoJiYobltuLmxlbmd0aC0xXS4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlPXQpO3ZhciB1PWEuZ2V0U3R5bGUoKTtyZXR1cm4gdSYmdS50aXRsZU5WaWV3JiYodS50aXRsZU5WaWV3LmF1dG9CYWNrQnV0dG9uJiYocy5iYWNrQnV0dG9uPXMuYmFja0J1dHRvbnx8e30scy5iYWNrQnV0dG9uLmNvbG9yPWkpLGEuc2V0U3R5bGUoe3RpdGxlTlZpZXc6c30pKSx7ZXJyTXNnOiJzZXROYXZpZ2F0aW9uQmFyQ29sb3I6b2sifX1yZXR1cm57ZXJyTXNnOiJzZXROYXZpZ2F0aW9uQmFyQ29sb3I6ZmFpbCJ9fSxzaG93TG9hZGluZzpmdW5jdGlvbihlKXtyZXR1cm4gd2koV3UsT2JqZWN0LmFzc2lnbih7fSxlLHt0eXBlOiJsb2FkaW5nIn0pLCJzaG93VG9hc3QiLCJzaG93TG9hZGluZyIpfSxoaWRlTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiB3aShIdSwibG9hZGluZyIsImhpZGUiLCJoaWRlTG9hZGluZyIpfSxzaG93VG9hc3Q6V3UsaGlkZVRvYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHdpKEh1LCJ0b2FzdCIsImhpZGUiLCJoaWRlVG9hc3QiKX0saGlkZTpIdSxzaG93TW9kYWw6ZnVuY3Rpb24oZSxpKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS50aXRsZTt2b2lkIDA9PT10JiYodD0iIik7dmFyIG49ZS5jb250ZW50O3ZvaWQgMD09PW4mJihuPSIiKTt2YXIgbz1lLnNob3dDYW5jZWw7dm9pZCAwPT09byYmKG89ITApO3ZhciByPWUuY2FuY2VsVGV4dCxhPShlLmNhbmNlbENvbG9yLGUuY29uZmlybVRleHQpLHM9KGUuY29uZmlybUNvbG9yLGUuZWRpdGFibGUpO3ZvaWQgMD09PXMmJihzPSExKTt2YXIgYz1lLnBsYWNlaG9sZGVyVGV4dDt2b2lkIDA9PT1jJiYoYz0iIik7dmFyIHU9bz9bcixhXTpbYV0sbD1zP2M6dTtuPW58fCIgIixvZy5uYXRpdmVVSVtzPyJwcm9tcHQiOiJjb25maXJtIl0obixmdW5jdGlvbihlKXtpZihvKXt2YXIgdD0xPT09ZS5pbmRleCxuPXtlcnJNc2c6InNob3dNb2RhbDpvayIsY29uZmlybTp0LGNhbmNlbDowPT09ZS5pbmRleHx8LTE9PT1lLmluZGV4fTt0JiZzJiYobi5jb250ZW50PWUudmFsdWUpLGZpKGksbil9ZWxzZXt2YXIgcj17ZXJyTXNnOiJzaG93TW9kYWw6b2siLGNvbmZpcm06MD09PWUuaW5kZXgsY2FuY2VsOiExfTtzJiYoci5jb250ZW50PWUudmFsdWUpLGZpKGkscil9fSx0LGwsdSl9LHNob3dBY3Rpb25TaGVldDpmdW5jdGlvbihlLHQpe3ZhciBuPWUuaXRlbUxpc3Q7dm9pZCAwPT09biYmKG49W10pO3ZhciByPWUuaXRlbUNvbG9yLGk9ZS50aXRsZTt2b2lkIDA9PT1pJiYoaT0iIik7dmFyIG89ZS5wb3BvdmVyOyIjMDAwIj09PXImJmRnLmRhcmttb2RlJiYocj1YdVtvZy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpXS5pdGVtQ29sb3IpO3ZhciBhPXtidXR0b25zOm4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybnt0aXRsZTplLGNvbG9yOnJ9fSl9O2kmJihhLnRpdGxlPWkpLGEuY2FuY2VsPWF0KCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCIpLG9nLm5hdGl2ZVVJLmFjdGlvblNoZWV0KE9iamVjdC5hc3NpZ24oYSx7cG9wb3ZlcjpvfSksZnVuY3Rpb24oZSl7MDxlLmluZGV4P2ZpKHQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0Om9rIix0YXBJbmRleDplLmluZGV4LTF9KTpmaSh0LHtlcnJNc2c6InNob3dBY3Rpb25TaGVldDpmYWlsIGNhbmNlbCJ9KX0pfSxzZXRUYWJCYXJCYWRnZTpmdW5jdGlvbihlKXt2YXIgdD1lLmluZGV4LG49ZS50ZXh0LHI9ZS50eXBlO3JldHVybiB2b2lkIDA9PT1yJiYocj0idGV4dCIpLHFzLnNldFRhYkJhckJhZGdlKHIsdCxuKSx7ZXJyTXNnOiJzZXRUYWJCYXJCYWRnZTpvayJ9fSxzZXRUYWJCYXJJdGVtOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXgsbj1lLnRleHQscj1lLmljb25QYXRoLGk9ZS5zZWxlY3RlZEljb25QYXRoLG89ZS5wYWdlUGF0aCxhPWUudmlzaWJsZSxzPWUuaWNvbmZvbnQ7cXMuc2V0VGFiQmFySXRlbSh0LG4scixpLGEscyk7dmFyIGM9byYmZmcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09b30pO2lmKGMpe3ZhciB1PWMubWV0YTt1LmlzVGFiQmFyPSEwLHUudGFiQmFySW5kZXg9dCx1LmlzUXVpdD0hMDt2YXIgbD1kZy50YWJCYXI7bCYmbC5saXN0JiZsLmxpc3RbdF0mJihsLmxpc3RbdF0ucGFnZVBhdGg9by5zdGFydHNXaXRoKCIvIik/by5zdWJzdHJpbmcoMSk6byl9cmV0dXJue2Vyck1zZzoic2V0VGFiQmFySXRlbTpvayJ9fSxzZXRUYWJCYXJTdHlsZTpmdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lJiYoZT17fSksIXlpKCkpcmV0dXJue2Vyck1zZzoic2V0VGFiQmFyU3R5bGU6ZmFpbCBub3QgVGFiQmFyIHBhZ2UifTt2YXIgdD17YmxhY2s6InJnYmEoMCwwLDAsMC40KSIsd2hpdGU6InJnYmEoMjU1LDI1NSwyNTUsMC40KSJ9LG49ZS5ib3JkZXJTdHlsZTtyZXR1cm4gbiBpbiB0JiYoZS5ib3JkZXJTdHlsZT10W25dKSxxcy5zZXRUYWJCYXJTdHlsZShlKSx7ZXJyTXNnOiJzZXRUYWJCYXJTdHlsZTpvayJ9fSxoaWRlVGFiQmFyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYW5pbWF0aW9uO3JldHVybiB5aSgpPyhxcy5oaWRlVGFiQmFyKHQpLHtlcnJNc2c6ImhpZGVUYWJCYXI6b2sifSk6e2Vyck1zZzoiaGlkZVRhYkJhcjpmYWlsIG5vdCBUYWJCYXIgcGFnZSJ9fSxzaG93VGFiQmFyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYW5pbWF0aW9uO3JldHVybiB5aSgpPyhxcy5zaG93VGFiQmFyKHQpLHtlcnJNc2c6InNob3dUYWJCYXI6b2sifSk6e2Vyck1zZzoic2hvd1RhYkJhcjpmYWlsIG5vdCBUYWJCYXIgcGFnZSJ9fSxyZXF1ZXN0Q29tcG9uZW50SW5mbzpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvO2UuJHBhZ2UubWV0YS5pc05WdWU/UXUoZSx0LG4pOihyPWUsaT10LG89bixhZy5wdWJsaXNoSGFuZGxlcigicmVxdWVzdENvbXBvbmVudEluZm8iLHtyZXFJZDpLdS5wdXNoKG8pLHJlcXM6aX0sci4kcGFnZS5pZCkpfSxjcmVhdGVSZXdhcmRlZFZpZGVvQWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBhbChlKX0sY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBobChlKX0sY3JlYXRlSW50ZXJzdGl0aWFsQWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB2bChlKX0sY3JlYXRlSW50ZXJhY3RpdmVBZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wcm92aWRlcj9lLmFkcGlkP25ldyB5bChlKTpuZXcgRXJyb3IoImFkcGlkIGludmFsaWQiKTpuZXcgRXJyb3IoInByb3ZpZGVyIGludmFsaWQiKX19KSxibD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksX2wsZGkpO2Z1bmN0aW9uIHdsKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTtyZXR1cm4gYmxbZV0uYXBwbHkobnVsbCx0KX1mdW5jdGlvbiBrbChlLHQpe3JldHVybiBhZy5vbigiYXBpLiIrZSx0KX1mdW5jdGlvbiBTbChlKXt2YXIgdD12ZygpLG49dC5sZW5ndGg7cmV0dXJuIG58fGFnLmVtaXQoIm9uRXJyb3IiLGUrIjpmYWlsIiksdFtuLTFdLiR2bX1mdW5jdGlvbiB4bCgpe3ZhciBlPXZnKCksdD1lW2UubGVuZ3RoLTFdO3JldHVybiB0JiZ0LiRwYWdlLmlkfXZhciBDbD1bImNhbnBsYXkiLCJwbGF5IiwicGF1c2UiLCJzdG9wIiwiZW5kZWQiLCJ0aW1lVXBkYXRlIiwicHJldiIsIm5leHQiLCJlcnJvciIsIndhaXRpbmciXSxUbD17fTtDbC5mb3JFYWNoKGZ1bmN0aW9uKGUpe1RsW2VdPVtdfSk7dmFyIE9sLEVsPVt7bmFtZToiZHVyYXRpb24iLHJlYWRvbmx5OiEwfSx7bmFtZToiY3VycmVudFRpbWUiLHJlYWRvbmx5OiEwfSx7bmFtZToicGF1c2VkIixyZWFkb25seTohMH0se25hbWU6InNyYyIsY2FjaGU6ITB9LHtuYW1lOiJzdGFydFRpbWUiLGRlZmF1bHQ6MCxjYWNoZTohMH0se25hbWU6ImJ1ZmZlcmVkIixyZWFkb25seTohMH0se25hbWU6InRpdGxlIixjYWNoZTohMH0se25hbWU6ImVwbmFtZSIsY2FjaGU6ITB9LHtuYW1lOiJzaW5nZXIiLGNhY2hlOiEwfSx7bmFtZToiY292ZXJJbWdVcmwiLGNhY2hlOiEwfSx7bmFtZToid2ViVXJsIixjYWNoZTohMH0se25hbWU6InByb3RvY29sIixyZWFkb25seTohMCxkZWZhdWx0OiJodHRwIn0se25hbWU6InBsYXliYWNrUmF0ZSIsZGVmYXVsdDoxLGNhY2hlOiEwfV0sSWw9WyJwcmV2IiwibmV4dCJdLEFsPWZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0aGlzLl9vcHRpb25zPXt9LGtsKCJvbkJhY2tncm91bmRBdWRpb1N0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXRlLG49ZS5lcnJNc2cscj1lLmVyckNvZGU7VGxbdF0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSgiZXJyb3IiPT09dD97ZXJyTXNnOm4sZXJyQ29kZTpyfTp7fSl9KX0pLElsLmZvckVhY2goZnVuY3Rpb24oZSl7a2woIm9uQmFja2dyb3VuZEF1ZGlvIisoZVswXS50b1VwcGVyQ2FzZSgpK2Uuc3Vic3RyKDEpKSxmdW5jdGlvbigpe1RsW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUoe30pfSl9KX0pLEVsLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dC5uYW1lLGU9e2dldDpmdW5jdGlvbigpe3ZhciBlPXQuY2FjaGU/dGhpcy5fb3B0aW9uczp3bCgiZ2V0QmFja2dyb3VuZEF1ZGlvU3RhdGUiKTtyZXR1cm4gbiBpbiBlP2Vbbl06dC5kZWZhdWx0fX07dC5yZWFkb25seXx8KGUuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuX29wdGlvbnNbbl09ZSx3bCgic2V0QmFja2dyb3VuZEF1ZGlvU3RhdGUiLE9iamVjdC5hc3NpZ24oe30sdGhpcy5fb3B0aW9ucyx7YXVkaW9JZDp0aGlzLmlkfSksbil9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixuLGUpfSl9O0FsLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgicGxheSIpfSxBbC5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJwYXVzZSIpfSxBbC5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInN0b3AiKX0sQWwucHJvdG90eXBlLnNlZWs9ZnVuY3Rpb24oZSl7dGhpcy5fb3BlcmF0ZSgic2VlayIse2N1cnJlbnRUaW1lOmV9KX0sQWwucHJvdG90eXBlLl9vcGVyYXRlPWZ1bmN0aW9uKGUsdCl7d2woIm9wZXJhdGVCYWNrZ3JvdW5kQXVkaW8iLE9iamVjdC5hc3NpZ24oe30sdCx7b3BlcmF0aW9uVHlwZTplfSkpfSxDbC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtBbC5wcm90b3R5cGVbIm9uIitlXT1mdW5jdGlvbihlKXtUbFt0XS5wdXNoKGUpfX0pO3ZhciAkbD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRCYWNrZ3JvdW5kQXVkaW9NYW5hZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIE9sfHwoT2w9bmV3IEFsKX19KSxQbD1VcihmdW5jdGlvbihlLHQpe3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBVaW50MTZBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBJbnQzMkFycmF5O3QuYXNzaWduPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3IubGVuZ3RoOyl7dmFyIGk9ci5zaGlmdCgpO2lmKGkpe2lmKCJvYmplY3QiIT10eXBlb2YgaSl0aHJvdyBuZXcgVHlwZUVycm9yKGkrIm11c3QgYmUgbm9uLW9iamVjdCIpO2Zvcih2YXIgbyBpbiBpKXQ9aSxuPW8sT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW29dPWlbb10pfX1yZXR1cm4gZX0sdC5zaHJpbmtCdWY9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5sZW5ndGg9PT10P2U6ZS5zdWJhcnJheT9lLnN1YmFycmF5KDAsdCk6KGUubGVuZ3RoPXQsZSl9O3ZhciByPXthcnJheVNldDpmdW5jdGlvbihlLHQsbixyLGkpe2lmKHQuc3ViYXJyYXkmJmUuc3ViYXJyYXkpZS5zZXQodC5zdWJhcnJheShuLG4rciksaSk7ZWxzZSBmb3IodmFyIG89MDtvPHI7bysrKWVbaStvXT10W24rb119LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhO2Zvcih0PXI9MCxuPWUubGVuZ3RoO3Q8bjt0Kyspcis9ZVt0XS5sZW5ndGg7Zm9yKGE9bmV3IFVpbnQ4QXJyYXkociksdD1pPTAsbj1lLmxlbmd0aDt0PG47dCsrKW89ZVt0XSxhLnNldChvLGkpLGkrPW8ubGVuZ3RoO3JldHVybiBhfX0saT17YXJyYXlTZXQ6ZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIG89MDtvPHI7bysrKWVbaStvXT10W24rb119LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oZSl7cmV0dXJuW10uY29uY2F0LmFwcGx5KFtdLGUpfX07dC5zZXRUeXBlZD1mdW5jdGlvbihlKXtlPyh0LkJ1Zjg9VWludDhBcnJheSx0LkJ1ZjE2PVVpbnQxNkFycmF5LHQuQnVmMzI9SW50MzJBcnJheSx0LmFzc2lnbih0LHIpKToodC5CdWY4PUFycmF5LHQuQnVmMTY9QXJyYXksdC5CdWYzMj1BcnJheSx0LmFzc2lnbih0LGkpKX0sdC5zZXRUeXBlZChuKX0pLE1sPShQbC5hc3NpZ24sUGwuc2hyaW5rQnVmLFBsLnNldFR5cGVkLFBsLkJ1ZjgsUGwuQnVmMTYsUGwuQnVmMzIsMCksamw9MTtmdW5jdGlvbiBMbChlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7MDw9LS10OyllW3RdPTB9dmFyIEJsPTAsTmw9MjksRGw9MjU2LFJsPURsKzErTmwsRmw9MzAsVWw9MTksemw9MipSbCsxLFZsPTE1LHFsPTE2LFdsPTcsSGw9MjU2LEdsPTE2LFhsPTE3LEpsPTE4LFlsPVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdLEtsPVswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXSxabD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10sUWw9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLGVkPW5ldyBBcnJheSgyKihSbCsyKSk7TGwoZWQpO3ZhciB0ZD1uZXcgQXJyYXkoMipGbCk7TGwodGQpO3ZhciBuZD1uZXcgQXJyYXkoNTEyKTtMbChuZCk7dmFyIHJkPW5ldyBBcnJheSgyNTYpO0xsKHJkKTt2YXIgaWQ9bmV3IEFycmF5KE5sKTtMbChpZCk7dmFyIG9kLGFkLHNkLGNkPW5ldyBBcnJheShGbCk7ZnVuY3Rpb24gdWQoZSx0LG4scixpKXt0aGlzLnN0YXRpY190cmVlPWUsdGhpcy5leHRyYV9iaXRzPXQsdGhpcy5leHRyYV9iYXNlPW4sdGhpcy5lbGVtcz1yLHRoaXMubWF4X2xlbmd0aD1pLHRoaXMuaGFzX3N0cmVlPWUmJmUubGVuZ3RofWZ1bmN0aW9uIGxkKGUsdCl7dGhpcy5keW5fdHJlZT1lLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz10fWZ1bmN0aW9uIGRkKGUpe3JldHVybiBlPDI1Nj9uZFtlXTpuZFsyNTYrKGU+Pj43KV19ZnVuY3Rpb24gZmQoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT0yNTUmdCxlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTV9ZnVuY3Rpb24gcGQoZSx0LG4pe2UuYmlfdmFsaWQ+cWwtbj8oZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsZmQoZSxlLmJpX2J1ZiksZS5iaV9idWY9dD4+cWwtZS5iaV92YWxpZCxlLmJpX3ZhbGlkKz1uLXFsKTooZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsZS5iaV92YWxpZCs9bil9ZnVuY3Rpb24gaGQoZSx0LG4pe3BkKGUsblsyKnRdLG5bMip0KzFdKX1mdW5jdGlvbiB2ZChlLHQpe2Zvcih2YXIgbj0wO258PTEmZSxlPj4+PTEsbjw8PTEsMDwtLXQ7KTtyZXR1cm4gbj4+PjF9ZnVuY3Rpb24gZ2QoZSx0LG4pe3ZhciByLGksbz1uZXcgQXJyYXkoVmwrMSksYT0wO2ZvcihyPTE7cjw9Vmw7cisrKW9bcl09YT1hK25bci0xXTw8MTtmb3IoaT0wO2k8PXQ7aSsrKXt2YXIgcz1lWzIqaSsxXTswIT09cyYmKGVbMippXT12ZChvW3NdKysscykpfX1mdW5jdGlvbiBtZChlKXt2YXIgdDtmb3IodD0wO3Q8Umw7dCsrKWUuZHluX2x0cmVlWzIqdF09MDtmb3IodD0wO3Q8Rmw7dCsrKWUuZHluX2R0cmVlWzIqdF09MDtmb3IodD0wO3Q8VWw7dCsrKWUuYmxfdHJlZVsyKnRdPTA7ZS5keW5fbHRyZWVbMipIbF09MSxlLm9wdF9sZW49ZS5zdGF0aWNfbGVuPTAsZS5sYXN0X2xpdD1lLm1hdGNoZXM9MH1mdW5jdGlvbiB5ZChlKXs4PGUuYmlfdmFsaWQ/ZmQoZSxlLmJpX2J1Zik6MDxlLmJpX3ZhbGlkJiYoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109ZS5iaV9idWYpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wfWZ1bmN0aW9uIF9kKGUsdCxuLHIpe3ZhciBpPTIqdCxvPTIqbjtyZXR1cm4gZVtpXTxlW29dfHxlW2ldPT09ZVtvXSYmclt0XTw9cltuXX1mdW5jdGlvbiBiZChlLHQsbil7Zm9yKHZhciByPWUuaGVhcFtuXSxpPW48PDE7aTw9ZS5oZWFwX2xlbiYmKGk8ZS5oZWFwX2xlbiYmX2QodCxlLmhlYXBbaSsxXSxlLmhlYXBbaV0sZS5kZXB0aCkmJmkrKywhX2QodCxyLGUuaGVhcFtpXSxlLmRlcHRoKSk7KWUuaGVhcFtuXT1lLmhlYXBbaV0sbj1pLGk8PD0xO2UuaGVhcFtuXT1yfWZ1bmN0aW9uIHdkKGUsdCxuKXt2YXIgcixpLG8sYSxzPTA7aWYoMCE9PWUubGFzdF9saXQpZm9yKDtyPWUucGVuZGluZ19idWZbZS5kX2J1ZisyKnNdPDw4fGUucGVuZGluZ19idWZbZS5kX2J1ZisyKnMrMV0saT1lLnBlbmRpbmdfYnVmW2UubF9idWYrc10scysrLDA9PT1yP2hkKGUsaSx0KTooaGQoZSwobz1yZFtpXSkrRGwrMSx0KSwwIT09KGE9WWxbb10pJiZwZChlLGktPWlkW29dLGEpLGhkKGUsbz1kZCgtLXIpLG4pLDAhPT0oYT1LbFtvXSkmJnBkKGUsci09Y2Rbb10sYSkpLHM8ZS5sYXN0X2xpdDspO2hkKGUsSGwsdCl9ZnVuY3Rpb24ga2QoZSx0KXt2YXIgbixyLGksbz10LmR5bl90cmVlLGE9dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUscz10LnN0YXRfZGVzYy5oYXNfc3RyZWUsYz10LnN0YXRfZGVzYy5lbGVtcyx1PS0xO2ZvcihlLmhlYXBfbGVuPTAsZS5oZWFwX21heD16bCxuPTA7bjxjO24rKykwIT09b1syKm5dPyhlLmhlYXBbKytlLmhlYXBfbGVuXT11PW4sZS5kZXB0aFtuXT0wKTpvWzIqbisxXT0wO2Zvcig7ZS5oZWFwX2xlbjwyOylvWzIqKGk9ZS5oZWFwWysrZS5oZWFwX2xlbl09dTwyPysrdTowKV09MSxlLmRlcHRoW2ldPTAsZS5vcHRfbGVuLS0scyYmKGUuc3RhdGljX2xlbi09YVsyKmkrMV0pO2Zvcih0Lm1heF9jb2RlPXUsbj1lLmhlYXBfbGVuPj4xOzE8PW47bi0tKWJkKGUsbyxuKTtmb3IoaT1jO249ZS5oZWFwWzFdLGUuaGVhcFsxXT1lLmhlYXBbZS5oZWFwX2xlbi0tXSxiZChlLG8sMSkscj1lLmhlYXBbMV0sZS5oZWFwWy0tZS5oZWFwX21heF09bixlLmhlYXBbLS1lLmhlYXBfbWF4XT1yLG9bMippXT1vWzIqbl0rb1syKnJdLGUuZGVwdGhbaV09KGUuZGVwdGhbbl0+PWUuZGVwdGhbcl0/ZS5kZXB0aFtuXTplLmRlcHRoW3JdKSsxLG9bMipuKzFdPW9bMipyKzFdPWksZS5oZWFwWzFdPWkrKyxiZChlLG8sMSksMjw9ZS5oZWFwX2xlbjspO2UuaGVhcFstLWUuaGVhcF9tYXhdPWUuaGVhcFsxXSxmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyxjPXQuZHluX3RyZWUsdT10Lm1heF9jb2RlLGw9dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUsZD10LnN0YXRfZGVzYy5oYXNfc3RyZWUsZj10LnN0YXRfZGVzYy5leHRyYV9iaXRzLHA9dC5zdGF0X2Rlc2MuZXh0cmFfYmFzZSxoPXQuc3RhdF9kZXNjLm1heF9sZW5ndGgsdj0wO2ZvcihvPTA7bzw9Vmw7bysrKWUuYmxfY291bnRbb109MDtmb3IoY1syKmUuaGVhcFtlLmhlYXBfbWF4XSsxXT0wLG49ZS5oZWFwX21heCsxO248emw7bisrKWg8KG89Y1syKmNbMioocj1lLmhlYXBbbl0pKzFdKzFdKzEpJiYobz1oLHYrKyksY1syKnIrMV09byx1PHJ8fChlLmJsX2NvdW50W29dKyssYT0wLHA8PXImJihhPWZbci1wXSkscz1jWzIqcl0sZS5vcHRfbGVuKz1zKihvK2EpLGQmJihlLnN0YXRpY19sZW4rPXMqKGxbMipyKzFdK2EpKSk7aWYoMCE9PXYpe2Rve2ZvcihvPWgtMTswPT09ZS5ibF9jb3VudFtvXTspby0tO2UuYmxfY291bnRbb10tLSxlLmJsX2NvdW50W28rMV0rPTIsZS5ibF9jb3VudFtoXS0tLHYtPTJ9d2hpbGUoMDx2KTtmb3Iobz1oOzAhPT1vO28tLSlmb3Iocj1lLmJsX2NvdW50W29dOzAhPT1yOyl1PChpPWUuaGVhcFstLW5dKXx8KGNbMippKzFdIT09byYmKGUub3B0X2xlbis9KG8tY1syKmkrMV0pKmNbMippXSxjWzIqaSsxXT1vKSxyLS0pfX0oZSx0KSxnZChvLHUsZS5ibF9jb3VudCl9ZnVuY3Rpb24gU2QoZSx0LG4pe3ZhciByLGksbz0tMSxhPXRbMV0scz0wLGM9Nyx1PTQ7Zm9yKDA9PT1hJiYoYz0xMzgsdT0zKSx0WzIqKG4rMSkrMV09NjU1MzUscj0wO3I8PW47cisrKWk9YSxhPXRbMioocisxKSsxXSwrK3M8YyYmaT09PWF8fChzPHU/ZS5ibF90cmVlWzIqaV0rPXM6MCE9PWk/KGkhPT1vJiZlLmJsX3RyZWVbMippXSsrLGUuYmxfdHJlZVsyKkdsXSsrKTpzPD0xMD9lLmJsX3RyZWVbMipYbF0rKzplLmJsX3RyZWVbMipKbF0rKyxvPWksKHM9MCk9PT1hPyhjPTEzOCx1PTMpOmk9PT1hPyhjPTYsdT0zKTooYz03LHU9NCkpfWZ1bmN0aW9uIHhkKGUsdCxuKXt2YXIgcixpLG89LTEsYT10WzFdLHM9MCxjPTcsdT00O2ZvcigwPT09YSYmKGM9MTM4LHU9Mykscj0wO3I8PW47cisrKWlmKGk9YSxhPXRbMioocisxKSsxXSwhKCsrczxjJiZpPT09YSkpe2lmKHM8dSlmb3IoO2hkKGUsaSxlLmJsX3RyZWUpLDAhPS0tczspO2Vsc2UgMCE9PWk/KGkhPT1vJiYoaGQoZSxpLGUuYmxfdHJlZSkscy0tKSxoZChlLEdsLGUuYmxfdHJlZSkscGQoZSxzLTMsMikpOnM8PTEwPyhoZChlLFhsLGUuYmxfdHJlZSkscGQoZSxzLTMsMykpOihoZChlLEpsLGUuYmxfdHJlZSkscGQoZSxzLTExLDcpKTtvPWksKHM9MCk9PT1hPyhjPTEzOCx1PTMpOmk9PT1hPyhjPTYsdT0zKTooYz03LHU9NCl9fUxsKGNkKTt2YXIgQ2Q9ITE7ZnVuY3Rpb24gVGQoZSx0LG4scil7dmFyIGksbyxhLHM7cGQoZSwoQmw8PDEpKyhyPzE6MCksMyksbz10LGE9bixzPSEwLHlkKGk9ZSkscyYmKGZkKGksYSksZmQoaSx+YSkpLFBsLmFycmF5U2V0KGkucGVuZGluZ19idWYsaS53aW5kb3csbyxhLGkucGVuZGluZyksaS5wZW5kaW5nKz1hfXZhciBPZD17X3RyX2luaXQ6ZnVuY3Rpb24oZSl7Q2R8fChmdW5jdGlvbigpe3ZhciBlLHQsbixyLGksbz1uZXcgQXJyYXkoVmwrMSk7Zm9yKHI9bj0wO3I8TmwtMTtyKyspZm9yKGlkW3JdPW4sZT0wO2U8MTw8WWxbcl07ZSsrKXJkW24rK109cjtmb3IocmRbbi0xXT1yLHI9aT0wO3I8MTY7cisrKWZvcihjZFtyXT1pLGU9MDtlPDE8PEtsW3JdO2UrKyluZFtpKytdPXI7Zm9yKGk+Pj03O3I8Rmw7cisrKWZvcihjZFtyXT1pPDw3LGU9MDtlPDE8PEtsW3JdLTc7ZSsrKW5kWzI1NitpKytdPXI7Zm9yKHQ9MDt0PD1WbDt0Kyspb1t0XT0wO2ZvcihlPTA7ZTw9MTQzOyllZFsyKmUrMV09OCxlKyssb1s4XSsrO2Zvcig7ZTw9MjU1OyllZFsyKmUrMV09OSxlKyssb1s5XSsrO2Zvcig7ZTw9Mjc5OyllZFsyKmUrMV09NyxlKyssb1s3XSsrO2Zvcig7ZTw9Mjg3OyllZFsyKmUrMV09OCxlKyssb1s4XSsrO2ZvcihnZChlZCxSbCsxLG8pLGU9MDtlPEZsO2UrKyl0ZFsyKmUrMV09NSx0ZFsyKmVdPXZkKGUsNSk7b2Q9bmV3IHVkKGVkLFlsLERsKzEsUmwsVmwpLGFkPW5ldyB1ZCh0ZCxLbCwwLEZsLFZsKSxzZD1uZXcgdWQobmV3IEFycmF5KDApLFpsLDAsVWwsV2wpfSgpLENkPSEwKSxlLmxfZGVzYz1uZXcgbGQoZS5keW5fbHRyZWUsb2QpLGUuZF9kZXNjPW5ldyBsZChlLmR5bl9kdHJlZSxhZCksZS5ibF9kZXNjPW5ldyBsZChlLmJsX3RyZWUsc2QpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wLG1kKGUpfSxfdHJfc3RvcmVkX2Jsb2NrOlRkLF90cl9mbHVzaF9ibG9jazpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9MDswPGUubGV2ZWw/KDI9PT1lLnN0cm0uZGF0YV90eXBlJiYoZS5zdHJtLmRhdGFfdHlwZT1mdW5jdGlvbihlKXt2YXIgdCxuPTQwOTM2MjQ0NDc7Zm9yKHQ9MDt0PD0zMTt0Kyssbj4+Pj0xKWlmKDEmbiYmMCE9PWUuZHluX2x0cmVlWzIqdF0pcmV0dXJuIE1sO2lmKDAhPT1lLmR5bl9sdHJlZVsxOF18fDAhPT1lLmR5bl9sdHJlZVsyMF18fDAhPT1lLmR5bl9sdHJlZVsyNl0pcmV0dXJuIGpsO2Zvcih0PTMyO3Q8RGw7dCsrKWlmKDAhPT1lLmR5bl9sdHJlZVsyKnRdKXJldHVybiBqbDtyZXR1cm4gTWx9KGUpKSxrZChlLGUubF9kZXNjKSxrZChlLGUuZF9kZXNjKSxhPWZ1bmN0aW9uKGUpe3ZhciB0O2ZvcihTZChlLGUuZHluX2x0cmVlLGUubF9kZXNjLm1heF9jb2RlKSxTZChlLGUuZHluX2R0cmVlLGUuZF9kZXNjLm1heF9jb2RlKSxrZChlLGUuYmxfZGVzYyksdD1VbC0xOzM8PXQmJjA9PT1lLmJsX3RyZWVbMipRbFt0XSsxXTt0LS0pO3JldHVybiBlLm9wdF9sZW4rPTMqKHQrMSkrNSs1KzQsdH0oZSksaT1lLm9wdF9sZW4rMys3Pj4+Mywobz1lLnN0YXRpY19sZW4rMys3Pj4+Myk8PWkmJihpPW8pKTppPW89bis1LG4rNDw9aSYmLTEhPT10P1RkKGUsdCxuLHIpOjQ9PT1lLnN0cmF0ZWd5fHxvPT09aT8ocGQoZSwyKyhyPzE6MCksMyksd2QoZSxlZCx0ZCkpOihwZChlLDQrKHI/MTowKSwzKSxmdW5jdGlvbihlLHQsbixyKXt2YXIgaTtmb3IocGQoZSx0LTI1Nyw1KSxwZChlLG4tMSw1KSxwZChlLHItNCw0KSxpPTA7aTxyO2krKylwZChlLGUuYmxfdHJlZVsyKlFsW2ldKzFdLDMpO3hkKGUsZS5keW5fbHRyZWUsdC0xKSx4ZChlLGUuZHluX2R0cmVlLG4tMSl9KGUsZS5sX2Rlc2MubWF4X2NvZGUrMSxlLmRfZGVzYy5tYXhfY29kZSsxLGErMSksd2QoZSxlLmR5bl9sdHJlZSxlLmR5bl9kdHJlZSkpLG1kKGUpLHImJnlkKGUpfSxfdHJfdGFsbHk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnBlbmRpbmdfYnVmW2UuZF9idWYrMiplLmxhc3RfbGl0XT10Pj4+OCYyNTUsZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqZS5sYXN0X2xpdCsxXT0yNTUmdCxlLnBlbmRpbmdfYnVmW2UubF9idWYrZS5sYXN0X2xpdF09MjU1Jm4sZS5sYXN0X2xpdCsrLDA9PT10P2UuZHluX2x0cmVlWzIqbl0rKzooZS5tYXRjaGVzKyssdC0tLGUuZHluX2x0cmVlWzIqKHJkW25dK0RsKzEpXSsrLGUuZHluX2R0cmVlWzIqZGQodCldKyspLGUubGFzdF9saXQ9PT1lLmxpdF9idWZzaXplLTF9LF90cl9hbGlnbjpmdW5jdGlvbihlKXt2YXIgdDtwZChlLDIsMyksaGQoZSxIbCxlZCksMTY9PT0odD1lKS5iaV92YWxpZD8oZmQodCx0LmJpX2J1ZiksdC5iaV9idWY9MCx0LmJpX3ZhbGlkPTApOjg8PXQuYmlfdmFsaWQmJih0LnBlbmRpbmdfYnVmW3QucGVuZGluZysrXT0yNTUmdC5iaV9idWYsdC5iaV9idWY+Pj04LHQuYmlfdmFsaWQtPTgpfX07dmFyIEVkPWZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaT02NTUzNSZlfDAsbz1lPj4+MTYmNjU1MzV8MCxhPTA7MCE9PW47KXtmb3Iobi09YT0yZTM8bj8yZTM6bjtvPW8rKGk9aSt0W3IrK118MCl8MCwtLWE7KTtpJT02NTUyMSxvJT02NTUyMX1yZXR1cm4gaXxvPDwxNnwwfTt2YXIgSWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1bXSxuPTA7bjwyNTY7bisrKXtlPW47Zm9yKHZhciByPTA7cjw4O3IrKyllPTEmZT8zOTg4MjkyMzg0XmU+Pj4xOmU+Pj4xO3Rbbl09ZX1yZXR1cm4gdH0oKTt2YXIgQWQsJGQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9SWQsbz1yK247ZV49LTE7Zm9yKHZhciBhPXI7YTxvO2ErKyllPWU+Pj44XmlbMjU1JihlXnRbYV0pXTtyZXR1cm4tMV5lfSxQZD17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9LE1kPTAsamQ9NCxMZD0wLEJkPS0yLE5kPS0xLERkPTQsUmQ9MixGZD04LFVkPTksemQ9Mjg2LFZkPTMwLHFkPTE5LFdkPTIqemQrMSxIZD0xNSxHZD0zLFhkPTI1OCxKZD1YZCtHZCsxLFlkPTQyLEtkPTExMyxaZD0xLFFkPTIsZWY9Myx0Zj00O2Z1bmN0aW9uIG5mKGUsdCl7cmV0dXJuIGUubXNnPVBkW3RdLHR9ZnVuY3Rpb24gcmYoZSl7cmV0dXJuKGU8PDEpLSg0PGU/OTowKX1mdW5jdGlvbiBvZihlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7MDw9LS10OyllW3RdPTB9ZnVuY3Rpb24gYWYoZSl7dmFyIHQ9ZS5zdGF0ZSxuPXQucGVuZGluZztuPmUuYXZhaWxfb3V0JiYobj1lLmF2YWlsX291dCksMCE9PW4mJihQbC5hcnJheVNldChlLm91dHB1dCx0LnBlbmRpbmdfYnVmLHQucGVuZGluZ19vdXQsbixlLm5leHRfb3V0KSxlLm5leHRfb3V0Kz1uLHQucGVuZGluZ19vdXQrPW4sZS50b3RhbF9vdXQrPW4sZS5hdmFpbF9vdXQtPW4sdC5wZW5kaW5nLT1uLDA9PT10LnBlbmRpbmcmJih0LnBlbmRpbmdfb3V0PTApKX1mdW5jdGlvbiBzZihlLHQpe09kLl90cl9mbHVzaF9ibG9jayhlLDA8PWUuYmxvY2tfc3RhcnQ/ZS5ibG9ja19zdGFydDotMSxlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQsdCksZS5ibG9ja19zdGFydD1lLnN0cnN0YXJ0LGFmKGUuc3RybSl9ZnVuY3Rpb24gY2YoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10fWZ1bmN0aW9uIHVmKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZ0fWZ1bmN0aW9uIGxmKGUsdCl7dmFyIG4scixpPWUubWF4X2NoYWluX2xlbmd0aCxvPWUuc3Ryc3RhcnQsYT1lLnByZXZfbGVuZ3RoLHM9ZS5uaWNlX21hdGNoLGM9ZS5zdHJzdGFydD5lLndfc2l6ZS1KZD9lLnN0cnN0YXJ0LShlLndfc2l6ZS1KZCk6MCx1PWUud2luZG93LGw9ZS53X21hc2ssZD1lLnByZXYsZj1lLnN0cnN0YXJ0K1hkLHA9dVtvK2EtMV0saD11W28rYV07ZS5wcmV2X2xlbmd0aD49ZS5nb29kX21hdGNoJiYoaT4+PTIpLHM+ZS5sb29rYWhlYWQmJihzPWUubG9va2FoZWFkKTtkb3tpZih1WyhuPXQpK2FdPT09aCYmdVtuK2EtMV09PT1wJiZ1W25dPT09dVtvXSYmdVsrK25dPT09dVtvKzFdKXtvKz0yLG4rKztkb3t9d2hpbGUodVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJm88Zik7aWYocj1YZC0oZi1vKSxvPWYtWGQsYTxyKXtpZihlLm1hdGNoX3N0YXJ0PXQsczw9KGE9cikpYnJlYWs7cD11W28rYS0xXSxoPXVbbythXX19fXdoaWxlKCh0PWRbdCZsXSk+YyYmMCE9LS1pKTtyZXR1cm4gYTw9ZS5sb29rYWhlYWQ/YTplLmxvb2thaGVhZH1mdW5jdGlvbiBkZihlKXt2YXIgdCxuLHIsaSxvLGEscyxjLHUsbCxkPWUud19zaXplO2Rve2lmKGk9ZS53aW5kb3dfc2l6ZS1lLmxvb2thaGVhZC1lLnN0cnN0YXJ0LGUuc3Ryc3RhcnQ+PWQrKGQtSmQpKXtmb3IoUGwuYXJyYXlTZXQoZS53aW5kb3csZS53aW5kb3csZCxkLDApLGUubWF0Y2hfc3RhcnQtPWQsZS5zdHJzdGFydC09ZCxlLmJsb2NrX3N0YXJ0LT1kLHQ9bj1lLmhhc2hfc2l6ZTtyPWUuaGVhZFstLXRdLGUuaGVhZFt0XT1kPD1yP3ItZDowLC0tbjspO2Zvcih0PW49ZDtyPWUucHJldlstLXRdLGUucHJldlt0XT1kPD1yP3ItZDowLC0tbjspO2krPWR9aWYoMD09PWUuc3RybS5hdmFpbF9pbilicmVhaztpZihhPWUuc3RybSxzPWUud2luZG93LGM9ZS5zdHJzdGFydCtlLmxvb2thaGVhZCx1PWksbD12b2lkIDAsbD1hLmF2YWlsX2luLHU8bCYmKGw9dSksbj0wPT09bD8wOihhLmF2YWlsX2luLT1sLFBsLmFycmF5U2V0KHMsYS5pbnB1dCxhLm5leHRfaW4sbCxjKSwxPT09YS5zdGF0ZS53cmFwP2EuYWRsZXI9RWQoYS5hZGxlcixzLGwsYyk6Mj09PWEuc3RhdGUud3JhcCYmKGEuYWRsZXI9JGQoYS5hZGxlcixzLGwsYykpLGEubmV4dF9pbis9bCxhLnRvdGFsX2luKz1sLGwpLGUubG9va2FoZWFkKz1uLGUubG9va2FoZWFkK2UuaW5zZXJ0Pj1HZClmb3Iobz1lLnN0cnN0YXJ0LWUuaW5zZXJ0LGUuaW5zX2g9ZS53aW5kb3dbb10sZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W28rMV0pJmUuaGFzaF9tYXNrO2UuaW5zZXJ0JiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W28rR2QtMV0pJmUuaGFzaF9tYXNrLGUucHJldltvJmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPW8sbysrLGUuaW5zZXJ0LS0sIShlLmxvb2thaGVhZCtlLmluc2VydDxHZCkpOyk7fXdoaWxlKGUubG9va2FoZWFkPEpkJiYwIT09ZS5zdHJtLmF2YWlsX2luKX1mdW5jdGlvbiBmZihlLHQpe2Zvcih2YXIgbixyOzspe2lmKGUubG9va2FoZWFkPEpkKXtpZihkZihlKSxlLmxvb2thaGVhZDxKZCYmdD09PU1kKXJldHVybiBaZDtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1HZCYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K0dkLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLDAhPT1uJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLUpkJiYoZS5tYXRjaF9sZW5ndGg9bGYoZSxuKSksZS5tYXRjaF9sZW5ndGg+PUdkKWlmKHI9T2QuX3RyX3RhbGx5KGUsZS5zdHJzdGFydC1lLm1hdGNoX3N0YXJ0LGUubWF0Y2hfbGVuZ3RoLUdkKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg8PWUubWF4X2xhenlfbWF0Y2gmJmUubG9va2FoZWFkPj1HZCl7Zm9yKGUubWF0Y2hfbGVuZ3RoLS07ZS5zdHJzdGFydCsrLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K0dkLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQsMCE9LS1lLm1hdGNoX2xlbmd0aDspO2Uuc3Ryc3RhcnQrK31lbHNlIGUuc3Ryc3RhcnQrPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPTAsZS5pbnNfaD1lLndpbmRvd1tlLnN0cnN0YXJ0XSxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCsxXSkmZS5oYXNoX21hc2s7ZWxzZSByPU9kLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrO2lmKHImJihzZihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIFpkfXJldHVybiBlLmluc2VydD1lLnN0cnN0YXJ0PEdkLTE/ZS5zdHJzdGFydDpHZC0xLHQ9PT1qZD8oc2YoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/ZWY6dGYpOmUubGFzdF9saXQmJihzZihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/WmQ6UWR9ZnVuY3Rpb24gcGYoZSx0KXtmb3IodmFyIG4scixpOzspe2lmKGUubG9va2FoZWFkPEpkKXtpZihkZihlKSxlLmxvb2thaGVhZDxKZCYmdD09PU1kKXJldHVybiBaZDtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1HZCYmKGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0K0dkLTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLGUucHJldl9sZW5ndGg9ZS5tYXRjaF9sZW5ndGgsZS5wcmV2X21hdGNoPWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGg9R2QtMSwwIT09biYmZS5wcmV2X2xlbmd0aDxlLm1heF9sYXp5X21hdGNoJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLUpkJiYoZS5tYXRjaF9sZW5ndGg9bGYoZSxuKSxlLm1hdGNoX2xlbmd0aDw9NSYmKDE9PT1lLnN0cmF0ZWd5fHxlLm1hdGNoX2xlbmd0aD09PUdkJiY0MDk2PGUuc3Ryc3RhcnQtZS5tYXRjaF9zdGFydCkmJihlLm1hdGNoX2xlbmd0aD1HZC0xKSksZS5wcmV2X2xlbmd0aD49R2QmJmUubWF0Y2hfbGVuZ3RoPD1lLnByZXZfbGVuZ3RoKXtmb3IoaT1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLUdkLHI9T2QuX3RyX3RhbGx5KGUsZS5zdHJzdGFydC0xLWUucHJldl9tYXRjaCxlLnByZXZfbGVuZ3RoLUdkKSxlLmxvb2thaGVhZC09ZS5wcmV2X2xlbmd0aC0xLGUucHJldl9sZW5ndGgtPTI7KytlLnN0cnN0YXJ0PD1pJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrR2QtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksMCE9LS1lLnByZXZfbGVuZ3RoOyk7aWYoZS5tYXRjaF9hdmFpbGFibGU9MCxlLm1hdGNoX2xlbmd0aD1HZC0xLGUuc3Ryc3RhcnQrKyxyJiYoc2YoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBaZH1lbHNlIGlmKGUubWF0Y2hfYXZhaWxhYmxlKXtpZigocj1PZC5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnQtMV0pKSYmc2YoZSwhMSksZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS0sMD09PWUuc3RybS5hdmFpbF9vdXQpcmV0dXJuIFpkfWVsc2UgZS5tYXRjaF9hdmFpbGFibGU9MSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLX1yZXR1cm4gZS5tYXRjaF9hdmFpbGFibGUmJihyPU9kLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSksZS5tYXRjaF9hdmFpbGFibGU9MCksZS5pbnNlcnQ9ZS5zdHJzdGFydDxHZC0xP2Uuc3Ryc3RhcnQ6R2QtMSx0PT09amQ/KHNmKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P2VmOnRmKTplLmxhc3RfbGl0JiYoc2YoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP1pkOlFkfWZ1bmN0aW9uIGhmKGUsdCxuLHIsaSl7dGhpcy5nb29kX2xlbmd0aD1lLHRoaXMubWF4X2xhenk9dCx0aGlzLm5pY2VfbGVuZ3RoPW4sdGhpcy5tYXhfY2hhaW49cix0aGlzLmZ1bmM9aX1mdW5jdGlvbiB2Zigpe3RoaXMuc3RybT1udWxsLHRoaXMuc3RhdHVzPTAsdGhpcy5wZW5kaW5nX2J1Zj1udWxsLHRoaXMucGVuZGluZ19idWZfc2l6ZT0wLHRoaXMucGVuZGluZ19vdXQ9MCx0aGlzLnBlbmRpbmc9MCx0aGlzLndyYXA9MCx0aGlzLmd6aGVhZD1udWxsLHRoaXMuZ3ppbmRleD0wLHRoaXMubWV0aG9kPUZkLHRoaXMubGFzdF9mbHVzaD0tMSx0aGlzLndfc2l6ZT0wLHRoaXMud19iaXRzPTAsdGhpcy53X21hc2s9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMud2luZG93X3NpemU9MCx0aGlzLnByZXY9bnVsbCx0aGlzLmhlYWQ9bnVsbCx0aGlzLmluc19oPTAsdGhpcy5oYXNoX3NpemU9MCx0aGlzLmhhc2hfYml0cz0wLHRoaXMuaGFzaF9tYXNrPTAsdGhpcy5oYXNoX3NoaWZ0PTAsdGhpcy5ibG9ja19zdGFydD0wLHRoaXMubWF0Y2hfbGVuZ3RoPTAsdGhpcy5wcmV2X21hdGNoPTAsdGhpcy5tYXRjaF9hdmFpbGFibGU9MCx0aGlzLnN0cnN0YXJ0PTAsdGhpcy5tYXRjaF9zdGFydD0wLHRoaXMubG9va2FoZWFkPTAsdGhpcy5wcmV2X2xlbmd0aD0wLHRoaXMubWF4X2NoYWluX2xlbmd0aD0wLHRoaXMubWF4X2xhenlfbWF0Y2g9MCx0aGlzLmxldmVsPTAsdGhpcy5zdHJhdGVneT0wLHRoaXMuZ29vZF9tYXRjaD0wLHRoaXMubmljZV9tYXRjaD0wLHRoaXMuZHluX2x0cmVlPW5ldyBQbC5CdWYxNigyKldkKSx0aGlzLmR5bl9kdHJlZT1uZXcgUGwuQnVmMTYoMiooMipWZCsxKSksdGhpcy5ibF90cmVlPW5ldyBQbC5CdWYxNigyKigyKnFkKzEpKSxvZih0aGlzLmR5bl9sdHJlZSksb2YodGhpcy5keW5fZHRyZWUpLG9mKHRoaXMuYmxfdHJlZSksdGhpcy5sX2Rlc2M9bnVsbCx0aGlzLmRfZGVzYz1udWxsLHRoaXMuYmxfZGVzYz1udWxsLHRoaXMuYmxfY291bnQ9bmV3IFBsLkJ1ZjE2KEhkKzEpLHRoaXMuaGVhcD1uZXcgUGwuQnVmMTYoMip6ZCsxKSxvZih0aGlzLmhlYXApLHRoaXMuaGVhcF9sZW49MCx0aGlzLmhlYXBfbWF4PTAsdGhpcy5kZXB0aD1uZXcgUGwuQnVmMTYoMip6ZCsxKSxvZih0aGlzLmRlcHRoKSx0aGlzLmxfYnVmPTAsdGhpcy5saXRfYnVmc2l6ZT0wLHRoaXMubGFzdF9saXQ9MCx0aGlzLmRfYnVmPTAsdGhpcy5vcHRfbGVuPTAsdGhpcy5zdGF0aWNfbGVuPTAsdGhpcy5tYXRjaGVzPTAsdGhpcy5pbnNlcnQ9MCx0aGlzLmJpX2J1Zj0wLHRoaXMuYmlfdmFsaWQ9MH1mdW5jdGlvbiBnZihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8oZS50b3RhbF9pbj1lLnRvdGFsX291dD0wLGUuZGF0YV90eXBlPVJkLCh0PWUuc3RhdGUpLnBlbmRpbmc9MCx0LnBlbmRpbmdfb3V0PTAsdC53cmFwPDAmJih0LndyYXA9LXQud3JhcCksdC5zdGF0dXM9dC53cmFwP1lkOktkLGUuYWRsZXI9Mj09PXQud3JhcD8wOjEsdC5sYXN0X2ZsdXNoPU1kLE9kLl90cl9pbml0KHQpLExkKTpuZihlLEJkKX1mdW5jdGlvbiBtZihlKXt2YXIgdCxuPWdmKGUpO3JldHVybiBuPT09TGQmJigodD1lLnN0YXRlKS53aW5kb3dfc2l6ZT0yKnQud19zaXplLG9mKHQuaGVhZCksdC5tYXhfbGF6eV9tYXRjaD1BZFt0LmxldmVsXS5tYXhfbGF6eSx0Lmdvb2RfbWF0Y2g9QWRbdC5sZXZlbF0uZ29vZF9sZW5ndGgsdC5uaWNlX21hdGNoPUFkW3QubGV2ZWxdLm5pY2VfbGVuZ3RoLHQubWF4X2NoYWluX2xlbmd0aD1BZFt0LmxldmVsXS5tYXhfY2hhaW4sdC5zdHJzdGFydD0wLHQuYmxvY2tfc3RhcnQ9MCx0Lmxvb2thaGVhZD0wLHQuaW5zZXJ0PTAsdC5tYXRjaF9sZW5ndGg9dC5wcmV2X2xlbmd0aD1HZC0xLHQubWF0Y2hfYXZhaWxhYmxlPTAsdC5pbnNfaD0wKSxufWZ1bmN0aW9uIHlmKGUsdCxuLHIsaSxvKXtpZighZSlyZXR1cm4gQmQ7dmFyIGE9MTtpZih0PT09TmQmJih0PTYpLHI8MD8oYT0wLHI9LXIpOjE1PHImJihhPTIsci09MTYpLGk8MXx8VWQ8aXx8biE9PUZkfHxyPDh8fDE1PHJ8fHQ8MHx8OTx0fHxvPDB8fERkPG8pcmV0dXJuIG5mKGUsQmQpOzg9PT1yJiYocj05KTt2YXIgcz1uZXcgdmY7cmV0dXJuKGUuc3RhdGU9cykuc3RybT1lLHMud3JhcD1hLHMuZ3poZWFkPW51bGwscy53X2JpdHM9cixzLndfc2l6ZT0xPDxzLndfYml0cyxzLndfbWFzaz1zLndfc2l6ZS0xLHMuaGFzaF9iaXRzPWkrNyxzLmhhc2hfc2l6ZT0xPDxzLmhhc2hfYml0cyxzLmhhc2hfbWFzaz1zLmhhc2hfc2l6ZS0xLHMuaGFzaF9zaGlmdD1+figocy5oYXNoX2JpdHMrR2QtMSkvR2QpLHMud2luZG93PW5ldyBQbC5CdWY4KDIqcy53X3NpemUpLHMuaGVhZD1uZXcgUGwuQnVmMTYocy5oYXNoX3NpemUpLHMucHJldj1uZXcgUGwuQnVmMTYocy53X3NpemUpLHMubGl0X2J1ZnNpemU9MTw8aSs2LHMucGVuZGluZ19idWZfc2l6ZT00KnMubGl0X2J1ZnNpemUscy5wZW5kaW5nX2J1Zj1uZXcgUGwuQnVmOChzLnBlbmRpbmdfYnVmX3NpemUpLHMuZF9idWY9MSpzLmxpdF9idWZzaXplLHMubF9idWY9MypzLmxpdF9idWZzaXplLHMubGV2ZWw9dCxzLnN0cmF0ZWd5PW8scy5tZXRob2Q9bixtZihlKX1BZD1bbmV3IGhmKDAsMCwwLDAsZnVuY3Rpb24oZSx0KXt2YXIgbj02NTUzNTtmb3Iobj5lLnBlbmRpbmdfYnVmX3NpemUtNSYmKG49ZS5wZW5kaW5nX2J1Zl9zaXplLTUpOzspe2lmKGUubG9va2FoZWFkPD0xKXtpZihkZihlKSwwPT09ZS5sb29rYWhlYWQmJnQ9PT1NZClyZXR1cm4gWmQ7aWYoMD09PWUubG9va2FoZWFkKWJyZWFrfWUuc3Ryc3RhcnQrPWUubG9va2FoZWFkLGUubG9va2FoZWFkPTA7dmFyIHI9ZS5ibG9ja19zdGFydCtuO2lmKCgwPT09ZS5zdHJzdGFydHx8ZS5zdHJzdGFydD49cikmJihlLmxvb2thaGVhZD1lLnN0cnN0YXJ0LXIsZS5zdHJzdGFydD1yLHNmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gWmQ7aWYoZS5zdHJzdGFydC1lLmJsb2NrX3N0YXJ0Pj1lLndfc2l6ZS1KZCYmKHNmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gWmR9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PWpkPyhzZihlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD9lZjp0Zik6KGUuc3Ryc3RhcnQ+ZS5ibG9ja19zdGFydCYmKHNmKGUsITEpLGUuc3RybS5hdmFpbF9vdXQpLFpkKX0pLG5ldyBoZig0LDQsOCw0LGZmKSxuZXcgaGYoNCw1LDE2LDgsZmYpLG5ldyBoZig0LDYsMzIsMzIsZmYpLG5ldyBoZig0LDQsMTYsMTYscGYpLG5ldyBoZig4LDE2LDMyLDMyLHBmKSxuZXcgaGYoOCwxNiwxMjgsMTI4LHBmKSxuZXcgaGYoOCwzMiwxMjgsMjU2LHBmKSxuZXcgaGYoMzIsMTI4LDI1OCwxMDI0LHBmKSxuZXcgaGYoMzIsMjU4LDI1OCw0MDk2LHBmKV07dmFyIF9mPXtkZWZsYXRlSW5pdDpmdW5jdGlvbihlLHQpe3JldHVybiB5ZihlLHQsRmQsMTUsOCwwKX0sZGVmbGF0ZUluaXQyOnlmLGRlZmxhdGVSZXNldDptZixkZWZsYXRlUmVzZXRLZWVwOmdmLGRlZmxhdGVTZXRIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZS5zdGF0ZT8yIT09ZS5zdGF0ZS53cmFwP0JkOihlLnN0YXRlLmd6aGVhZD10LExkKTpCZH0sZGVmbGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvO2lmKCFlfHwhZS5zdGF0ZXx8NTx0fHx0PDApcmV0dXJuIGU/bmYoZSxCZCk6QmQ7aWYocj1lLnN0YXRlLCFlLm91dHB1dHx8IWUuaW5wdXQmJjAhPT1lLmF2YWlsX2lufHw2NjY9PT1yLnN0YXR1cyYmdCE9PWpkKXJldHVybiBuZihlLDA9PT1lLmF2YWlsX291dD8tNTpCZCk7aWYoci5zdHJtPWUsbj1yLmxhc3RfZmx1c2gsci5sYXN0X2ZsdXNoPXQsci5zdGF0dXM9PT1ZZClpZigyPT09ci53cmFwKWUuYWRsZXI9MCxjZihyLDMxKSxjZihyLDEzOSksY2Yociw4KSxyLmd6aGVhZD8oY2Yociwoci5nemhlYWQudGV4dD8xOjApKyhyLmd6aGVhZC5oY3JjPzI6MCkrKHIuZ3poZWFkLmV4dHJhPzQ6MCkrKHIuZ3poZWFkLm5hbWU/ODowKSsoci5nemhlYWQuY29tbWVudD8xNjowKSksY2YociwyNTUmci5nemhlYWQudGltZSksY2YocixyLmd6aGVhZC50aW1lPj44JjI1NSksY2YocixyLmd6aGVhZC50aW1lPj4xNiYyNTUpLGNmKHIsci5nemhlYWQudGltZT4+MjQmMjU1KSxjZihyLDk9PT1yLmxldmVsPzI6Mjw9ci5zdHJhdGVneXx8ci5sZXZlbDwyPzQ6MCksY2YociwyNTUmci5nemhlYWQub3MpLHIuZ3poZWFkLmV4dHJhJiZyLmd6aGVhZC5leHRyYS5sZW5ndGgmJihjZihyLDI1NSZyLmd6aGVhZC5leHRyYS5sZW5ndGgpLGNmKHIsci5nemhlYWQuZXh0cmEubGVuZ3RoPj44JjI1NSkpLHIuZ3poZWFkLmhjcmMmJihlLmFkbGVyPSRkKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmcsMCkpLHIuZ3ppbmRleD0wLHIuc3RhdHVzPTY5KTooY2YociwwKSxjZihyLDApLGNmKHIsMCksY2YociwwKSxjZihyLDApLGNmKHIsOT09PXIubGV2ZWw/MjoyPD1yLnN0cmF0ZWd5fHxyLmxldmVsPDI/NDowKSxjZihyLDMpLHIuc3RhdHVzPUtkKTtlbHNle3ZhciBhPUZkKyhyLndfYml0cy04PDw0KTw8ODthfD0oMjw9ci5zdHJhdGVneXx8ci5sZXZlbDwyPzA6ci5sZXZlbDw2PzE6Nj09PXIubGV2ZWw/MjozKTw8NiwwIT09ci5zdHJzdGFydCYmKGF8PTMyKSxhKz0zMS1hJTMxLHIuc3RhdHVzPUtkLHVmKHIsYSksMCE9PXIuc3Ryc3RhcnQmJih1ZihyLGUuYWRsZXI+Pj4xNiksdWYociw2NTUzNSZlLmFkbGVyKSksZS5hZGxlcj0xfWlmKDY5PT09ci5zdGF0dXMpaWYoci5nemhlYWQuZXh0cmEpe2ZvcihpPXIucGVuZGluZztyLmd6aW5kZXg8KDY1NTM1JnIuZ3poZWFkLmV4dHJhLmxlbmd0aCkmJihyLnBlbmRpbmchPT1yLnBlbmRpbmdfYnVmX3NpemV8fChyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9JGQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSxhZihlKSxpPXIucGVuZGluZyxyLnBlbmRpbmchPT1yLnBlbmRpbmdfYnVmX3NpemUpKTspY2YociwyNTUmci5nemhlYWQuZXh0cmFbci5nemluZGV4XSksci5nemluZGV4Kys7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmkmJihlLmFkbGVyPSRkKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctaSxpKSksci5nemluZGV4PT09ci5nemhlYWQuZXh0cmEubGVuZ3RoJiYoci5nemluZGV4PTAsci5zdGF0dXM9NzMpfWVsc2Ugci5zdGF0dXM9NzM7aWYoNzM9PT1yLnN0YXR1cylpZihyLmd6aGVhZC5uYW1lKXtpPXIucGVuZGluZztkb3tpZihyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUmJihyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9JGQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSxhZihlKSxpPXIucGVuZGluZyxyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUpKXtvPTE7YnJlYWt9Y2YocixvPXIuZ3ppbmRleDxyLmd6aGVhZC5uYW1lLmxlbmd0aD8yNTUmci5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHIuZ3ppbmRleCsrKTowKX13aGlsZSgwIT09byk7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmkmJihlLmFkbGVyPSRkKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctaSxpKSksMD09PW8mJihyLmd6aW5kZXg9MCxyLnN0YXR1cz05MSl9ZWxzZSByLnN0YXR1cz05MTtpZig5MT09PXIuc3RhdHVzKWlmKHIuZ3poZWFkLmNvbW1lbnQpe2k9ci5wZW5kaW5nO2Rve2lmKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj0kZChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLGFmKGUpLGk9ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpe289MTticmVha31jZihyLG89ci5nemluZGV4PHIuZ3poZWFkLmNvbW1lbnQubGVuZ3RoPzI1NSZyLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQoci5nemluZGV4KyspOjApfXdoaWxlKDAhPT1vKTtyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9JGQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSwwPT09byYmKHIuc3RhdHVzPTEwMyl9ZWxzZSByLnN0YXR1cz0xMDM7aWYoMTAzPT09ci5zdGF0dXMmJihyLmd6aGVhZC5oY3JjPyhyLnBlbmRpbmcrMj5yLnBlbmRpbmdfYnVmX3NpemUmJmFmKGUpLHIucGVuZGluZysyPD1yLnBlbmRpbmdfYnVmX3NpemUmJihjZihyLDI1NSZlLmFkbGVyKSxjZihyLGUuYWRsZXI+PjgmMjU1KSxlLmFkbGVyPTAsci5zdGF0dXM9S2QpKTpyLnN0YXR1cz1LZCksMCE9PXIucGVuZGluZyl7aWYoYWYoZSksMD09PWUuYXZhaWxfb3V0KXJldHVybiByLmxhc3RfZmx1c2g9LTEsTGR9ZWxzZSBpZigwPT09ZS5hdmFpbF9pbiYmcmYodCk8PXJmKG4pJiZ0IT09amQpcmV0dXJuIG5mKGUsLTUpO2lmKDY2Nj09PXIuc3RhdHVzJiYwIT09ZS5hdmFpbF9pbilyZXR1cm4gbmYoZSwtNSk7aWYoMCE9PWUuYXZhaWxfaW58fDAhPT1yLmxvb2thaGVhZHx8dCE9PU1kJiY2NjYhPT1yLnN0YXR1cyl7dmFyIHM9Mj09PXIuc3RyYXRlZ3k/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG47Oyl7aWYoMD09PWUubG9va2FoZWFkJiYoZGYoZSksMD09PWUubG9va2FoZWFkKSl7aWYodD09PU1kKXJldHVybiBaZDticmVha31pZihlLm1hdGNoX2xlbmd0aD0wLG49T2QuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0KyssbiYmKHNmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gWmR9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PWpkPyhzZihlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD9lZjp0Zik6ZS5sYXN0X2xpdCYmKHNmKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT9aZDpRZH0ocix0KTozPT09ci5zdHJhdGVneT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLGksbyxhPWUud2luZG93Ozspe2lmKGUubG9va2FoZWFkPD1YZCl7aWYoZGYoZSksZS5sb29rYWhlYWQ8PVhkJiZ0PT09TWQpcmV0dXJuIFpkO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihlLm1hdGNoX2xlbmd0aD0wLGUubG9va2FoZWFkPj1HZCYmMDxlLnN0cnN0YXJ0JiYocj1hW2k9ZS5zdHJzdGFydC0xXSk9PT1hWysraV0mJnI9PT1hWysraV0mJnI9PT1hWysraV0pe289ZS5zdHJzdGFydCtYZDtkb3t9d2hpbGUocj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSYmaTxvKTtlLm1hdGNoX2xlbmd0aD1YZC0oby1pKSxlLm1hdGNoX2xlbmd0aD5lLmxvb2thaGVhZCYmKGUubWF0Y2hfbGVuZ3RoPWUubG9va2FoZWFkKX1pZihlLm1hdGNoX2xlbmd0aD49R2Q/KG49T2QuX3RyX3RhbGx5KGUsMSxlLm1hdGNoX2xlbmd0aC1HZCksZS5sb29rYWhlYWQtPWUubWF0Y2hfbGVuZ3RoLGUuc3Ryc3RhcnQrPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPTApOihuPU9kLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrKSxuJiYoc2YoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBaZH1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09amQ/KHNmKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P2VmOnRmKTplLmxhc3RfbGl0JiYoc2YoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP1pkOlFkfShyLHQpOkFkW3IubGV2ZWxdLmZ1bmMocix0KTtpZihzIT09ZWYmJnMhPT10Znx8KHIuc3RhdHVzPTY2Nikscz09PVpkfHxzPT09ZWYpcmV0dXJuIDA9PT1lLmF2YWlsX291dCYmKHIubGFzdF9mbHVzaD0tMSksTGQ7aWYocz09PVFkJiYoMT09PXQ/T2QuX3RyX2FsaWduKHIpOjUhPT10JiYoT2QuX3RyX3N0b3JlZF9ibG9jayhyLDAsMCwhMSksMz09PXQmJihvZihyLmhlYWQpLDA9PT1yLmxvb2thaGVhZCYmKHIuc3Ryc3RhcnQ9MCxyLmJsb2NrX3N0YXJ0PTAsci5pbnNlcnQ9MCkpKSxhZihlKSwwPT09ZS5hdmFpbF9vdXQpKXJldHVybiByLmxhc3RfZmx1c2g9LTEsTGR9cmV0dXJuIHQhPT1qZD9MZDpyLndyYXA8PTA/MTooMj09PXIud3JhcD8oY2YociwyNTUmZS5hZGxlciksY2YocixlLmFkbGVyPj44JjI1NSksY2YocixlLmFkbGVyPj4xNiYyNTUpLGNmKHIsZS5hZGxlcj4+MjQmMjU1KSxjZihyLDI1NSZlLnRvdGFsX2luKSxjZihyLGUudG90YWxfaW4+PjgmMjU1KSxjZihyLGUudG90YWxfaW4+PjE2JjI1NSksY2YocixlLnRvdGFsX2luPj4yNCYyNTUpKToodWYocixlLmFkbGVyPj4+MTYpLHVmKHIsNjU1MzUmZS5hZGxlcikpLGFmKGUpLDA8ci53cmFwJiYoci53cmFwPS1yLndyYXApLDAhPT1yLnBlbmRpbmc/TGQ6MSl9LGRlZmxhdGVFbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGUmJmUuc3RhdGU/KHQ9ZS5zdGF0ZS5zdGF0dXMpIT09WWQmJjY5IT09dCYmNzMhPT10JiY5MSE9PXQmJjEwMyE9PXQmJnQhPT1LZCYmNjY2IT09dD9uZihlLEJkKTooZS5zdGF0ZT1udWxsLHQ9PT1LZD9uZihlLC0zKTpMZCk6QmR9LGRlZmxhdGVTZXREaWN0aW9uYXJ5OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLGMsdSxsPXQubGVuZ3RoO2lmKCFlfHwhZS5zdGF0ZSlyZXR1cm4gQmQ7aWYoMj09PShvPShuPWUuc3RhdGUpLndyYXApfHwxPT09byYmbi5zdGF0dXMhPT1ZZHx8bi5sb29rYWhlYWQpcmV0dXJuIEJkO2ZvcigxPT09byYmKGUuYWRsZXI9RWQoZS5hZGxlcix0LGwsMCkpLG4ud3JhcD0wLGw+PW4ud19zaXplJiYoMD09PW8mJihvZihuLmhlYWQpLG4uc3Ryc3RhcnQ9MCxuLmJsb2NrX3N0YXJ0PTAsbi5pbnNlcnQ9MCksdT1uZXcgUGwuQnVmOChuLndfc2l6ZSksUGwuYXJyYXlTZXQodSx0LGwtbi53X3NpemUsbi53X3NpemUsMCksdD11LGw9bi53X3NpemUpLGE9ZS5hdmFpbF9pbixzPWUubmV4dF9pbixjPWUuaW5wdXQsZS5hdmFpbF9pbj1sLGUubmV4dF9pbj0wLGUuaW5wdXQ9dCxkZihuKTtuLmxvb2thaGVhZD49R2Q7KXtmb3Iocj1uLnN0cnN0YXJ0LGk9bi5sb29rYWhlYWQtKEdkLTEpO24uaW5zX2g9KG4uaW5zX2g8PG4uaGFzaF9zaGlmdF5uLndpbmRvd1tyK0dkLTFdKSZuLmhhc2hfbWFzayxuLnByZXZbciZuLndfbWFza109bi5oZWFkW24uaW5zX2hdLG4uaGVhZFtuLmluc19oXT1yLHIrKywtLWk7KTtuLnN0cnN0YXJ0PXIsbi5sb29rYWhlYWQ9R2QtMSxkZihuKX1yZXR1cm4gbi5zdHJzdGFydCs9bi5sb29rYWhlYWQsbi5ibG9ja19zdGFydD1uLnN0cnN0YXJ0LG4uaW5zZXJ0PW4ubG9va2FoZWFkLG4ubG9va2FoZWFkPTAsbi5tYXRjaF9sZW5ndGg9bi5wcmV2X2xlbmd0aD1HZC0xLG4ubWF0Y2hfYXZhaWxhYmxlPTAsZS5uZXh0X2luPXMsZS5pbnB1dD1jLGUuYXZhaWxfaW49YSxuLndyYXA9byxMZH0sZGVmbGF0ZUluZm86InBha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSxiZj0hMCx3Zj0hMDt0cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFswXSl9Y2F0Y2goZSl7YmY9ITF9dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSl9Y2F0Y2goZSl7d2Y9ITF9Zm9yKHZhciBrZj1uZXcgUGwuQnVmOCgyNTYpLFNmPTA7U2Y8MjU2O1NmKyspa2ZbU2ZdPTI1Mjw9U2Y/NjoyNDg8PVNmPzU6MjQwPD1TZj80OjIyNDw9U2Y/MzoxOTI8PVNmPzI6MTtrZlsyNTRdPWtmWzI1NF09MTtmdW5jdGlvbiB4ZihlLHQpe2lmKHQ8NjU1MzQmJihlLnN1YmFycmF5JiZ3Znx8IWUuc3ViYXJyYXkmJmJmKSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFBsLnNocmlua0J1ZihlLHQpKTtmb3IodmFyIG49IiIscj0wO3I8dDtyKyspbis9U3RyaW5nLmZyb21DaGFyQ29kZShlW3JdKTtyZXR1cm4gbn12YXIgQ2Y9e3N0cmluZzJidWY6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhPWUubGVuZ3RoLHM9MDtmb3IoaT0wO2k8YTtpKyspNTUyOTY9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQoaSkpKSYmaSsxPGEmJjU2MzIwPT0oNjQ1MTImKHI9ZS5jaGFyQ29kZUF0KGkrMSkpKSYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCksaSsrKSxzKz1uPDEyOD8xOm48MjA0OD8yOm48NjU1MzY/Mzo0O2Zvcih0PW5ldyBQbC5CdWY4KHMpLGk9bz0wO288cztpKyspNTUyOTY9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQoaSkpKSYmaSsxPGEmJjU2MzIwPT0oNjQ1MTImKHI9ZS5jaGFyQ29kZUF0KGkrMSkpKSYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoci01NjMyMCksaSsrKSxuPDEyOD90W28rK109bjoobjwyMDQ4P3RbbysrXT0xOTJ8bj4+PjY6KG48NjU1MzY/dFtvKytdPTIyNHxuPj4+MTI6KHRbbysrXT0yNDB8bj4+PjE4LHRbbysrXT0xMjh8bj4+PjEyJjYzKSx0W28rK109MTI4fG4+Pj42JjYzKSx0W28rK109MTI4fDYzJm4pO3JldHVybiB0fSxidWYyYmluc3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB4ZihlLGUubGVuZ3RoKX0sYmluc3RyaW5nMmJ1ZjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9bmV3IFBsLkJ1ZjgoZS5sZW5ndGgpLG49MCxyPXQubGVuZ3RoO248cjtuKyspdFtuXT1lLmNoYXJDb2RlQXQobik7cmV0dXJuIHR9LGJ1ZjJzdHJpbmc6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhPXR8fGUubGVuZ3RoLHM9bmV3IEFycmF5KDIqYSk7Zm9yKG49cj0wO248YTspaWYoKGk9ZVtuKytdKTwxMjgpc1tyKytdPWk7ZWxzZSBpZig0PChvPWtmW2ldKSlzW3IrK109NjU1MzMsbis9by0xO2Vsc2V7Zm9yKGkmPTI9PT1vPzMxOjM9PT1vPzE1Ojc7MTxvJiZuPGE7KWk9aTw8Nnw2MyZlW24rK10sby0tOzE8bz9zW3IrK109NjU1MzM6aTw2NTUzNj9zW3IrK109aTooaS09NjU1MzYsc1tyKytdPTU1Mjk2fGk+PjEwJjEwMjMsc1tyKytdPTU2MzIwfDEwMjMmaSl9cmV0dXJuIHhmKHMscil9LHV0Zjhib3JkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbjtmb3IoKHQ9dHx8ZS5sZW5ndGgpPmUubGVuZ3RoJiYodD1lLmxlbmd0aCksbj10LTE7MDw9biYmMTI4PT0oMTkyJmVbbl0pOyluLS07cmV0dXJuIG48MD90OjA9PT1uP3Q6bitrZltlW25dXT50P246dH19O3ZhciBUZj1mdW5jdGlvbigpe3RoaXMuaW5wdXQ9bnVsbCx0aGlzLm5leHRfaW49MCx0aGlzLmF2YWlsX2luPTAsdGhpcy50b3RhbF9pbj0wLHRoaXMub3V0cHV0PW51bGwsdGhpcy5uZXh0X291dD0wLHRoaXMuYXZhaWxfb3V0PTAsdGhpcy50b3RhbF9vdXQ9MCx0aGlzLm1zZz0iIix0aGlzLnN0YXRlPW51bGwsdGhpcy5kYXRhX3R5cGU9Mix0aGlzLmFkbGVyPTB9LE9mPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRWY9MCxJZj0tMSxBZj0wLCRmPTg7ZnVuY3Rpb24gUGYoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgUGYpKXJldHVybiBuZXcgUGYoZSk7dGhpcy5vcHRpb25zPVBsLmFzc2lnbih7bGV2ZWw6SWYsbWV0aG9kOiRmLGNodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjE1LG1lbUxldmVsOjgsc3RyYXRlZ3k6QWYsdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJjA8dC53aW5kb3dCaXRzP3Qud2luZG93Qml0cz0tdC53aW5kb3dCaXRzOnQuZ3ppcCYmMDx0LndpbmRvd0JpdHMmJnQud2luZG93Qml0czwxNiYmKHQud2luZG93Qml0cys9MTYpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IFRmLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgbj1fZi5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLHQubGV2ZWwsdC5tZXRob2QsdC53aW5kb3dCaXRzLHQubWVtTGV2ZWwsdC5zdHJhdGVneSk7aWYobiE9PUVmKXRocm93IG5ldyBFcnJvcihQZFtuXSk7aWYodC5oZWFkZXImJl9mLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLHQuaGVhZGVyKSx0LmRpY3Rpb25hcnkpe3ZhciByO2lmKHI9InN0cmluZyI9PXR5cGVvZiB0LmRpY3Rpb25hcnk/Q2Yuc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1PZi5jYWxsKHQuZGljdGlvbmFyeSk/bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KTp0LmRpY3Rpb25hcnksKG49X2YuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLHIpKSE9PUVmKXRocm93IG5ldyBFcnJvcihQZFtuXSk7dGhpcy5fZGljdF9zZXQ9ITB9fWZ1bmN0aW9uIE1mKGUsdCl7dmFyIG49bmV3IFBmKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8UGRbbi5lcnJdO3JldHVybiBuLnJlc3VsdH1QZi5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaT10aGlzLnN0cm0sbz10aGlzLm9wdGlvbnMuY2h1bmtTaXplO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7cj10PT09fn50P3Q6ITA9PT10PzQ6MCwic3RyaW5nIj09dHlwZW9mIGU/aS5pbnB1dD1DZi5zdHJpbmcyYnVmKGUpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1PZi5jYWxsKGUpP2kuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoZSk6aS5pbnB1dD1lLGkubmV4dF9pbj0wLGkuYXZhaWxfaW49aS5pbnB1dC5sZW5ndGg7ZG97aWYoMD09PWkuYXZhaWxfb3V0JiYoaS5vdXRwdXQ9bmV3IFBsLkJ1ZjgobyksaS5uZXh0X291dD0wLGkuYXZhaWxfb3V0PW8pLDEhPT0obj1fZi5kZWZsYXRlKGkscikpJiZuIT09RWYpcmV0dXJuIHRoaXMub25FbmQobiksISh0aGlzLmVuZGVkPSEwKTswIT09aS5hdmFpbF9vdXQmJigwIT09aS5hdmFpbF9pbnx8NCE9PXImJjIhPT1yKXx8KCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvP3RoaXMub25EYXRhKENmLmJ1ZjJiaW5zdHJpbmcoUGwuc2hyaW5rQnVmKGkub3V0cHV0LGkubmV4dF9vdXQpKSk6dGhpcy5vbkRhdGEoUGwuc2hyaW5rQnVmKGkub3V0cHV0LGkubmV4dF9vdXQpKSl9d2hpbGUoKDA8aS5hdmFpbF9pbnx8MD09PWkuYXZhaWxfb3V0KSYmMSE9PW4pO3JldHVybiA0PT09cj8obj1fZi5kZWZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChuKSx0aGlzLmVuZGVkPSEwLG49PT1FZik6MiE9PXJ8fCh0aGlzLm9uRW5kKEVmKSwhKGkuYXZhaWxfb3V0PTApKX0sUGYucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSxQZi5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PUVmJiYoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9UGwuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307dmFyIGpmPXtEZWZsYXRlOlBmLGRlZmxhdGU6TWYsZGVmbGF0ZVJhdzpmdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5yYXc9ITAsTWYoZSx0KX0sZ3ppcDpmdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5nemlwPSEwLE1mKGUsdCl9fSxMZj1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyxjLHUsbCxkLGYscCxoLHYsZyxtLHksXyxiLHcsayxTLHgsQyxUO249ZS5zdGF0ZSxyPWUubmV4dF9pbixDPWUuaW5wdXQsaT1yKyhlLmF2YWlsX2luLTUpLG89ZS5uZXh0X291dCxUPWUub3V0cHV0LGE9by0odC1lLmF2YWlsX291dCkscz1vKyhlLmF2YWlsX291dC0yNTcpLGM9bi5kbWF4LHU9bi53c2l6ZSxsPW4ud2hhdmUsZD1uLnduZXh0LGY9bi53aW5kb3cscD1uLmhvbGQsaD1uLmJpdHMsdj1uLmxlbmNvZGUsZz1uLmRpc3Rjb2RlLG09KDE8PG4ubGVuYml0cyktMSx5PSgxPDxuLmRpc3RiaXRzKS0xO2U6ZG97aDwxNSYmKHArPUNbcisrXTw8aCxoKz04LHArPUNbcisrXTw8aCxoKz04KSxfPXZbcCZtXTt0OmZvcig7Oyl7aWYocD4+Pj1iPV8+Pj4yNCxoLT1iLDA9PT0oYj1fPj4+MTYmMjU1KSlUW28rK109NjU1MzUmXztlbHNle2lmKCEoMTYmYikpe2lmKDA9PSg2NCZiKSl7Xz12Wyg2NTUzNSZfKSsocCYoMTw8YiktMSldO2NvbnRpbnVlIHR9aWYoMzImYil7bi5tb2RlPTEyO2JyZWFrIGV9ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsbi5tb2RlPTMwO2JyZWFrIGV9dz02NTUzNSZfLChiJj0xNSkmJihoPGImJihwKz1DW3IrK108PGgsaCs9OCksdys9cCYoMTw8YiktMSxwPj4+PWIsaC09YiksaDwxNSYmKHArPUNbcisrXTw8aCxoKz04LHArPUNbcisrXTw8aCxoKz04KSxfPWdbcCZ5XTtuOmZvcig7Oyl7aWYocD4+Pj1iPV8+Pj4yNCxoLT1iLCEoMTYmKGI9Xz4+PjE2JjI1NSkpKXtpZigwPT0oNjQmYikpe189Z1soNjU1MzUmXykrKHAmKDE8PGIpLTEpXTtjb250aW51ZSBufWUubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLG4ubW9kZT0zMDticmVhayBlfWlmKGs9NjU1MzUmXyxoPChiJj0xNSkmJihwKz1DW3IrK108PGgsKGgrPTgpPGImJihwKz1DW3IrK108PGgsaCs9OCkpLGM8KGsrPXAmKDE8PGIpLTEpKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT0zMDticmVhayBlfWlmKHA+Pj49YixoLT1iLChiPW8tYSk8ayl7aWYobDwoYj1rLWIpJiZuLnNhbmUpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPTMwO2JyZWFrIGV9aWYoeD1mLChTPTApPT09ZCl7aWYoUys9dS1iLGI8dyl7Zm9yKHctPWI7VFtvKytdPWZbUysrXSwtLWI7KTtTPW8tayx4PVR9fWVsc2UgaWYoZDxiKXtpZihTKz11K2QtYiwoYi09ZCk8dyl7Zm9yKHctPWI7VFtvKytdPWZbUysrXSwtLWI7KTtpZihTPTAsZDx3KXtmb3Iody09Yj1kO1RbbysrXT1mW1MrK10sLS1iOyk7Uz1vLWsseD1UfX19ZWxzZSBpZihTKz1kLWIsYjx3KXtmb3Iody09YjtUW28rK109ZltTKytdLC0tYjspO1M9by1rLHg9VH1mb3IoOzI8dzspVFtvKytdPXhbUysrXSxUW28rK109eFtTKytdLFRbbysrXT14W1MrK10sdy09Mzt3JiYoVFtvKytdPXhbUysrXSwxPHcmJihUW28rK109eFtTKytdKSl9ZWxzZXtmb3IoUz1vLWs7VFtvKytdPVRbUysrXSxUW28rK109VFtTKytdLFRbbysrXT1UW1MrK10sMjwody09Myk7KTt3JiYoVFtvKytdPVRbUysrXSwxPHcmJihUW28rK109VFtTKytdKSl9YnJlYWt9fWJyZWFrfX13aGlsZShyPGkmJm88cyk7ci09dz1oPj4zLHAmPSgxPDwoaC09dzw8MykpLTEsZS5uZXh0X2luPXIsZS5uZXh0X291dD1vLGUuYXZhaWxfaW49cjxpP2ktcis1OjUtKHItaSksZS5hdmFpbF9vdXQ9bzxzP3MtbysyNTc6MjU3LShvLXMpLG4uaG9sZD1wLG4uYml0cz1ofSxCZj1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLE5mPVsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0sRGY9WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3NywwLDBdLFJmPVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF0sRmY9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSxzKXt2YXIgYyx1LGwsZCxmLHAsaCx2LGcsbT1zLmJpdHMseT0wLF89MCxiPTAsdz0wLGs9MCxTPTAseD0wLEM9MCxUPTAsTz0wLEU9bnVsbCxJPTAsQT1uZXcgUGwuQnVmMTYoMTYpLCQ9bmV3IFBsLkJ1ZjE2KDE2KSxQPW51bGwsTT0wO2Zvcih5PTA7eTw9MTU7eSsrKUFbeV09MDtmb3IoXz0wO188cjtfKyspQVt0W24rX11dKys7Zm9yKGs9bSx3PTE1OzE8PXcmJjA9PT1BW3ddO3ctLSk7aWYodzxrJiYoaz13KSwwPT09dylyZXR1cm4gaVtvKytdPTIwOTcxNTIwLGlbbysrXT0yMDk3MTUyMCxzLmJpdHM9MSwwO2ZvcihiPTE7Yjx3JiYwPT09QVtiXTtiKyspO2ZvcihrPGImJihrPWIpLHk9Qz0xO3k8PTE1O3krKylpZihDPDw9MSwoQy09QVt5XSk8MClyZXR1cm4tMTtpZigwPEMmJigwPT09ZXx8MSE9PXcpKXJldHVybi0xO2ZvcigkWzFdPTAseT0xO3k8MTU7eSsrKSRbeSsxXT0kW3ldK0FbeV07Zm9yKF89MDtfPHI7XysrKTAhPT10W24rX10mJihhWyRbdFtuK19dXSsrXT1fKTtpZigwPT09ZT8oRT1QPWEscD0xOSk6MT09PWU/KEU9QmYsSS09MjU3LFA9TmYsTS09MjU3LHA9MjU2KTooRT1EZixQPVJmLHA9LTEpLHk9YixmPW8seD1fPU89MCxsPS0xLGQ9KFQ9MTw8KFM9aykpLTEsMT09PWUmJjg1MjxUfHwyPT09ZSYmNTkyPFQpcmV0dXJuIDE7Zm9yKDs7KXtmb3IoaD15LXgsYVtfXTxwPyh2PTAsZz1hW19dKTphW19dPnA/KHY9UFtNK2FbX11dLGc9RVtJK2FbX11dKToodj05NixnPTApLGM9MTw8eS14LGI9dT0xPDxTO2lbZisoTz4+eCkrKHUtPWMpXT1oPDwyNHx2PDwxNnxnfDAsMCE9PXU7KTtmb3IoYz0xPDx5LTE7TyZjOyljPj49MTtpZigwIT09Yz8oTyY9Yy0xLE8rPWMpOk89MCxfKyssMD09LS1BW3ldKXtpZih5PT09dylicmVhazt5PXRbbithW19dXX1pZihrPHkmJihPJmQpIT09bCl7Zm9yKDA9PT14JiYoeD1rKSxmKz1iLEM9MTw8KFM9eS14KTtTK3g8dyYmISgoQy09QVtTK3hdKTw9MCk7KVMrKyxDPDw9MTtpZihUKz0xPDxTLDE9PT1lJiY4NTI8VHx8Mj09PWUmJjU5MjxUKXJldHVybiAxO2lbbD1PJmRdPWs8PDI0fFM8PDE2fGYtb3wwfX1yZXR1cm4gMCE9PU8mJihpW2YrT109eS14PDwyNHw2NDw8MTZ8MCkscy5iaXRzPWssMH0sVWY9MSx6Zj0yLFZmPTAscWY9LTIsV2Y9MSxIZj04NTIsR2Y9NTkyO2Z1bmN0aW9uIFhmKGUpe3JldHVybihlPj4+MjQmMjU1KSsoZT4+PjgmNjUyODApKygoNjUyODAmZSk8PDgpKygoMjU1JmUpPDwyNCl9ZnVuY3Rpb24gSmYoKXt0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IFBsLkJ1ZjE2KDMyMCksdGhpcy53b3JrPW5ldyBQbC5CdWYxNigyODgpLHRoaXMubGVuZHluPW51bGwsdGhpcy5kaXN0ZHluPW51bGwsdGhpcy5zYW5lPTAsdGhpcy5iYWNrPTAsdGhpcy53YXM9MH1mdW5jdGlvbiBZZihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8odD1lLnN0YXRlLGUudG90YWxfaW49ZS50b3RhbF9vdXQ9dC50b3RhbD0wLGUubXNnPSIiLHQud3JhcCYmKGUuYWRsZXI9MSZ0LndyYXApLHQubW9kZT1XZix0Lmxhc3Q9MCx0LmhhdmVkaWN0PTAsdC5kbWF4PTMyNzY4LHQuaGVhZD1udWxsLHQuaG9sZD0wLHQuYml0cz0wLHQubGVuY29kZT10LmxlbmR5bj1uZXcgUGwuQnVmMzIoSGYpLHQuZGlzdGNvZGU9dC5kaXN0ZHluPW5ldyBQbC5CdWYzMihHZiksdC5zYW5lPTEsdC5iYWNrPS0xLFZmKTpxZn1mdW5jdGlvbiBLZihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8oKHQ9ZS5zdGF0ZSkud3NpemU9MCx0LndoYXZlPTAsdC53bmV4dD0wLFlmKGUpKTpxZn1mdW5jdGlvbiBaZihlLHQpe3ZhciBuLHI7cmV0dXJuIGUmJmUuc3RhdGU/KHI9ZS5zdGF0ZSx0PDA/KG49MCx0PS10KToobj0xKyh0Pj40KSx0PDQ4JiYodCY9MTUpKSx0JiYodDw4fHwxNTx0KT9xZjoobnVsbCE9PXIud2luZG93JiZyLndiaXRzIT09dCYmKHIud2luZG93PW51bGwpLHIud3JhcD1uLHIud2JpdHM9dCxLZihlKSkpOnFmfWZ1bmN0aW9uIFFmKGUsdCl7dmFyIG4scjtyZXR1cm4gZT8ocj1uZXcgSmYsKGUuc3RhdGU9cikud2luZG93PW51bGwsKG49WmYoZSx0KSkhPT1WZiYmKGUuc3RhdGU9bnVsbCksbik6cWZ9dmFyIGVwLHRwLG5wPSEwO2Z1bmN0aW9uIHJwKGUpe2lmKG5wKXt2YXIgdDtmb3IoZXA9bmV3IFBsLkJ1ZjMyKDUxMiksdHA9bmV3IFBsLkJ1ZjMyKDMyKSx0PTA7dDwxNDQ7KWUubGVuc1t0KytdPTg7Zm9yKDt0PDI1NjspZS5sZW5zW3QrK109OTtmb3IoO3Q8MjgwOyllLmxlbnNbdCsrXT03O2Zvcig7dDwyODg7KWUubGVuc1t0KytdPTg7Zm9yKEZmKFVmLGUubGVucywwLDI4OCxlcCwwLGUud29yayx7Yml0czo5fSksdD0wO3Q8MzI7KWUubGVuc1t0KytdPTU7RmYoemYsZS5sZW5zLDAsMzIsdHAsMCxlLndvcmsse2JpdHM6NX0pLG5wPSExfWUubGVuY29kZT1lcCxlLmxlbmJpdHM9OSxlLmRpc3Rjb2RlPXRwLGUuZGlzdGJpdHM9NX1mdW5jdGlvbiBpcChlLHQsbixyKXt2YXIgaSxvPWUuc3RhdGU7cmV0dXJuIG51bGw9PT1vLndpbmRvdyYmKG8ud3NpemU9MTw8by53Yml0cyxvLnduZXh0PTAsby53aGF2ZT0wLG8ud2luZG93PW5ldyBQbC5CdWY4KG8ud3NpemUpKSxyPj1vLndzaXplPyhQbC5hcnJheVNldChvLndpbmRvdyx0LG4tby53c2l6ZSxvLndzaXplLDApLG8ud25leHQ9MCxvLndoYXZlPW8ud3NpemUpOihyPChpPW8ud3NpemUtby53bmV4dCkmJihpPXIpLFBsLmFycmF5U2V0KG8ud2luZG93LHQsbi1yLGksby53bmV4dCksKHItPWkpPyhQbC5hcnJheVNldChvLndpbmRvdyx0LG4tcixyLDApLG8ud25leHQ9cixvLndoYXZlPW8ud3NpemUpOihvLnduZXh0Kz1pLG8ud25leHQ9PT1vLndzaXplJiYoby53bmV4dD0wKSxvLndoYXZlPG8ud3NpemUmJihvLndoYXZlKz1pKSkpLDB9dmFyIG9wPXtpbmZsYXRlUmVzZXQ6S2YsaW5mbGF0ZVJlc2V0MjpaZixpbmZsYXRlUmVzZXRLZWVwOllmLGluZmxhdGVJbml0OmZ1bmN0aW9uKGUpe3JldHVybiBRZihlLDE1KX0saW5mbGF0ZUluaXQyOlFmLGluZmxhdGU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsYyx1LGwsZCxmLHAsaCx2LGcsbSx5LF8sYix3LGssUyx4LEMsVD0wLE89bmV3IFBsLkJ1ZjgoNCksRT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIWV8fCFlLnN0YXRlfHwhZS5vdXRwdXR8fCFlLmlucHV0JiYwIT09ZS5hdmFpbF9pbilyZXR1cm4gcWY7MTI9PT0obj1lLnN0YXRlKS5tb2RlJiYobi5tb2RlPTEzKSxhPWUubmV4dF9vdXQsaT1lLm91dHB1dCxjPWUuYXZhaWxfb3V0LG89ZS5uZXh0X2luLHI9ZS5pbnB1dCxzPWUuYXZhaWxfaW4sdT1uLmhvbGQsbD1uLmJpdHMsZD1zLGY9YyxTPVZmO2U6Zm9yKDs7KXN3aXRjaChuLm1vZGUpe2Nhc2UgV2Y6aWYoMD09PW4ud3JhcCl7bi5tb2RlPTEzO2JyZWFrfWZvcig7bDwxNjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKDImbi53cmFwJiYzNTYxNT09PXUpe09bbi5jaGVjaz0wXT0yNTUmdSxPWzFdPXU+Pj44JjI1NSxuLmNoZWNrPSRkKG4uY2hlY2ssTywyLDApLGw9dT0wLG4ubW9kZT0yO2JyZWFrfWlmKG4uZmxhZ3M9MCxuLmhlYWQmJihuLmhlYWQuZG9uZT0hMSksISgxJm4ud3JhcCl8fCgoKDI1NSZ1KTw8OCkrKHU+PjgpKSUzMSl7ZS5tc2c9ImluY29ycmVjdCBoZWFkZXIgY2hlY2siLG4ubW9kZT0zMDticmVha31pZig4IT0oMTUmdSkpe2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPTMwO2JyZWFrfWlmKGwtPTQsaz04KygxNSYodT4+Pj00KSksMD09PW4ud2JpdHMpbi53Yml0cz1rO2Vsc2UgaWYoaz5uLndiaXRzKXtlLm1zZz0iaW52YWxpZCB3aW5kb3cgc2l6ZSIsbi5tb2RlPTMwO2JyZWFrfW4uZG1heD0xPDxrLGUuYWRsZXI9bi5jaGVjaz0xLG4ubW9kZT01MTImdT8xMDoxMixsPXU9MDticmVhaztjYXNlIDI6Zm9yKDtsPDE2Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYobi5mbGFncz11LDghPSgyNTUmbi5mbGFncykpe2UubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsbi5tb2RlPTMwO2JyZWFrfWlmKDU3MzQ0Jm4uZmxhZ3Mpe2UubXNnPSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLG4ubW9kZT0zMDticmVha31uLmhlYWQmJihuLmhlYWQudGV4dD11Pj44JjEpLDUxMiZuLmZsYWdzJiYoT1swXT0yNTUmdSxPWzFdPXU+Pj44JjI1NSxuLmNoZWNrPSRkKG4uY2hlY2ssTywyLDApKSxsPXU9MCxuLm1vZGU9MztjYXNlIDM6Zm9yKDtsPDMyOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9bi5oZWFkJiYobi5oZWFkLnRpbWU9dSksNTEyJm4uZmxhZ3MmJihPWzBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LE9bMl09dT4+PjE2JjI1NSxPWzNdPXU+Pj4yNCYyNTUsbi5jaGVjaz0kZChuLmNoZWNrLE8sNCwwKSksbD11PTAsbi5tb2RlPTQ7Y2FzZSA0OmZvcig7bDwxNjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4uaGVhZCYmKG4uaGVhZC54ZmxhZ3M9MjU1JnUsbi5oZWFkLm9zPXU+PjgpLDUxMiZuLmZsYWdzJiYoT1swXT0yNTUmdSxPWzFdPXU+Pj44JjI1NSxuLmNoZWNrPSRkKG4uY2hlY2ssTywyLDApKSxsPXU9MCxuLm1vZGU9NTtjYXNlIDU6aWYoMTAyNCZuLmZsYWdzKXtmb3IoO2w8MTY7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLmxlbmd0aD11LG4uaGVhZCYmKG4uaGVhZC5leHRyYV9sZW49dSksNTEyJm4uZmxhZ3MmJihPWzBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LG4uY2hlY2s9JGQobi5jaGVjayxPLDIsMCkpLGw9dT0wfWVsc2Ugbi5oZWFkJiYobi5oZWFkLmV4dHJhPW51bGwpO24ubW9kZT02O2Nhc2UgNjppZigxMDI0Jm4uZmxhZ3MmJihzPChwPW4ubGVuZ3RoKSYmKHA9cykscCYmKG4uaGVhZCYmKGs9bi5oZWFkLmV4dHJhX2xlbi1uLmxlbmd0aCxuLmhlYWQuZXh0cmF8fChuLmhlYWQuZXh0cmE9bmV3IEFycmF5KG4uaGVhZC5leHRyYV9sZW4pKSxQbC5hcnJheVNldChuLmhlYWQuZXh0cmEscixvLHAsaykpLDUxMiZuLmZsYWdzJiYobi5jaGVjaz0kZChuLmNoZWNrLHIscCxvKSkscy09cCxvKz1wLG4ubGVuZ3RoLT1wKSxuLmxlbmd0aCkpYnJlYWsgZTtuLmxlbmd0aD0wLG4ubW9kZT03O2Nhc2UgNzppZigyMDQ4Jm4uZmxhZ3Mpe2lmKDA9PT1zKWJyZWFrIGU7Zm9yKHA9MDtrPXJbbytwKytdLG4uaGVhZCYmayYmbi5sZW5ndGg8NjU1MzYmJihuLmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShrKSksayYmcDxzOyk7aWYoNTEyJm4uZmxhZ3MmJihuLmNoZWNrPSRkKG4uY2hlY2sscixwLG8pKSxzLT1wLG8rPXAsaylicmVhayBlfWVsc2Ugbi5oZWFkJiYobi5oZWFkLm5hbWU9bnVsbCk7bi5sZW5ndGg9MCxuLm1vZGU9ODtjYXNlIDg6aWYoNDA5NiZuLmZsYWdzKXtpZigwPT09cylicmVhayBlO2ZvcihwPTA7az1yW28rcCsrXSxuLmhlYWQmJmsmJm4ubGVuZ3RoPDY1NTM2JiYobi5oZWFkLmNvbW1lbnQrPVN0cmluZy5mcm9tQ2hhckNvZGUoaykpLGsmJnA8czspO2lmKDUxMiZuLmZsYWdzJiYobi5jaGVjaz0kZChuLmNoZWNrLHIscCxvKSkscy09cCxvKz1wLGspYnJlYWsgZX1lbHNlIG4uaGVhZCYmKG4uaGVhZC5jb21tZW50PW51bGwpO24ubW9kZT05O2Nhc2UgOTppZig1MTImbi5mbGFncyl7Zm9yKDtsPDE2Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYodSE9PSg2NTUzNSZuLmNoZWNrKSl7ZS5tc2c9ImhlYWRlciBjcmMgbWlzbWF0Y2giLG4ubW9kZT0zMDticmVha31sPXU9MH1uLmhlYWQmJihuLmhlYWQuaGNyYz1uLmZsYWdzPj45JjEsbi5oZWFkLmRvbmU9ITApLGUuYWRsZXI9bi5jaGVjaz0wLG4ubW9kZT0xMjticmVhaztjYXNlIDEwOmZvcig7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWUuYWRsZXI9bi5jaGVjaz1YZih1KSxsPXU9MCxuLm1vZGU9MTE7Y2FzZSAxMTppZigwPT09bi5oYXZlZGljdClyZXR1cm4gZS5uZXh0X291dD1hLGUuYXZhaWxfb3V0PWMsZS5uZXh0X2luPW8sZS5hdmFpbF9pbj1zLG4uaG9sZD11LG4uYml0cz1sLDI7ZS5hZGxlcj1uLmNoZWNrPTEsbi5tb2RlPTEyO2Nhc2UgMTI6aWYoNT09PXR8fDY9PT10KWJyZWFrIGU7Y2FzZSAxMzppZihuLmxhc3Qpe3U+Pj49NyZsLGwtPTcmbCxuLm1vZGU9Mjc7YnJlYWt9Zm9yKDtsPDM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1zd2l0Y2gobi5sYXN0PTEmdSxsLT0xLDMmKHU+Pj49MSkpe2Nhc2UgMDpuLm1vZGU9MTQ7YnJlYWs7Y2FzZSAxOmlmKHJwKG4pLG4ubW9kZT0yMCw2PT09dCl7dT4+Pj0yLGwtPTI7YnJlYWsgZX1icmVhaztjYXNlIDI6bi5tb2RlPTE3O2JyZWFrO2Nhc2UgMzplLm1zZz0iaW52YWxpZCBibG9jayB0eXBlIixuLm1vZGU9MzB9dT4+Pj0yLGwtPTI7YnJlYWs7Y2FzZSAxNDpmb3IodT4+Pj03JmwsbC09NyZsO2w8MzI7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZigoNjU1MzUmdSkhPSh1Pj4+MTZeNjU1MzUpKXtlLm1zZz0iaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsbi5tb2RlPTMwO2JyZWFrfWlmKG4ubGVuZ3RoPTY1NTM1JnUsbD11PTAsbi5tb2RlPTE1LDY9PT10KWJyZWFrIGU7Y2FzZSAxNTpuLm1vZGU9MTY7Y2FzZSAxNjppZihwPW4ubGVuZ3RoKXtpZihzPHAmJihwPXMpLGM8cCYmKHA9YyksMD09PXApYnJlYWsgZTtQbC5hcnJheVNldChpLHIsbyxwLGEpLHMtPXAsbys9cCxjLT1wLGErPXAsbi5sZW5ndGgtPXA7YnJlYWt9bi5tb2RlPTEyO2JyZWFrO2Nhc2UgMTc6Zm9yKDtsPDE0Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYobi5ubGVuPTI1NysoMzEmdSksdT4+Pj01LGwtPTUsbi5uZGlzdD0xKygzMSZ1KSx1Pj4+PTUsbC09NSxuLm5jb2RlPTQrKDE1JnUpLHU+Pj49NCxsLT00LDI4NjxuLm5sZW58fDMwPG4ubmRpc3Qpe2UubXNnPSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyIsbi5tb2RlPTMwO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT0xODtjYXNlIDE4OmZvcig7bi5oYXZlPG4ubmNvZGU7KXtmb3IoO2w8Mzspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4ubGVuc1tFW24uaGF2ZSsrXV09NyZ1LHU+Pj49MyxsLT0zfWZvcig7bi5oYXZlPDE5OyluLmxlbnNbRVtuLmhhdmUrK11dPTA7aWYobi5sZW5jb2RlPW4ubGVuZHluLG4ubGVuYml0cz03LHg9e2JpdHM6bi5sZW5iaXRzfSxTPUZmKDAsbi5sZW5zLDAsMTksbi5sZW5jb2RlLDAsbi53b3JrLHgpLG4ubGVuYml0cz14LmJpdHMsUyl7ZS5tc2c9ImludmFsaWQgY29kZSBsZW5ndGhzIHNldCIsbi5tb2RlPTMwO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT0xOTtjYXNlIDE5OmZvcig7bi5oYXZlPG4ubmxlbituLm5kaXN0Oyl7Zm9yKDttPShUPW4ubGVuY29kZVt1JigxPDxuLmxlbmJpdHMpLTFdKT4+PjE2JjI1NSx5PTY1NTM1JlQsISgoZz1UPj4+MjQpPD1sKTspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKHk8MTYpdT4+Pj1nLGwtPWcsbi5sZW5zW24uaGF2ZSsrXT15O2Vsc2V7aWYoMTY9PT15KXtmb3IoQz1nKzI7bDxDOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYodT4+Pj1nLGwtPWcsMD09PW4uaGF2ZSl7ZS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLG4ubW9kZT0zMDticmVha31rPW4ubGVuc1tuLmhhdmUtMV0scD0zKygzJnUpLHU+Pj49MixsLT0yfWVsc2UgaWYoMTc9PT15KXtmb3IoQz1nKzM7bDxDOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9bC09ZyxrPTAscD0zKyg3Jih1Pj4+PWcpKSx1Pj4+PTMsbC09M31lbHNle2ZvcihDPWcrNztsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1sLT1nLGs9MCxwPTExKygxMjcmKHU+Pj49ZykpLHU+Pj49NyxsLT03fWlmKG4uaGF2ZStwPm4ubmxlbituLm5kaXN0KXtlLm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsbi5tb2RlPTMwO2JyZWFrfWZvcig7cC0tOyluLmxlbnNbbi5oYXZlKytdPWt9fWlmKDMwPT09bi5tb2RlKWJyZWFrO2lmKDA9PT1uLmxlbnNbMjU2XSl7ZS5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsbi5tb2RlPTMwO2JyZWFrfWlmKG4ubGVuYml0cz05LHg9e2JpdHM6bi5sZW5iaXRzfSxTPUZmKFVmLG4ubGVucywwLG4ubmxlbixuLmxlbmNvZGUsMCxuLndvcmsseCksbi5sZW5iaXRzPXguYml0cyxTKXtlLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IixuLm1vZGU9MzA7YnJlYWt9aWYobi5kaXN0Yml0cz02LG4uZGlzdGNvZGU9bi5kaXN0ZHluLHg9e2JpdHM6bi5kaXN0Yml0c30sUz1GZih6ZixuLmxlbnMsbi5ubGVuLG4ubmRpc3Qsbi5kaXN0Y29kZSwwLG4ud29yayx4KSxuLmRpc3RiaXRzPXguYml0cyxTKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0IixuLm1vZGU9MzA7YnJlYWt9aWYobi5tb2RlPTIwLDY9PT10KWJyZWFrIGU7Y2FzZSAyMDpuLm1vZGU9MjE7Y2FzZSAyMTppZig2PD1zJiYyNTg8PWMpe2UubmV4dF9vdXQ9YSxlLmF2YWlsX291dD1jLGUubmV4dF9pbj1vLGUuYXZhaWxfaW49cyxuLmhvbGQ9dSxuLmJpdHM9bCxMZihlLGYpLGE9ZS5uZXh0X291dCxpPWUub3V0cHV0LGM9ZS5hdmFpbF9vdXQsbz1lLm5leHRfaW4scj1lLmlucHV0LHM9ZS5hdmFpbF9pbix1PW4uaG9sZCxsPW4uYml0cywxMj09PW4ubW9kZSYmKG4uYmFjaz0tMSk7YnJlYWt9Zm9yKG4uYmFjaz0wO209KFQ9bi5sZW5jb2RlW3UmKDE8PG4ubGVuYml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKChnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYobSYmMD09KDI0MCZtKSl7Zm9yKF89ZyxiPW0sdz15O209KFQ9bi5sZW5jb2RlW3crKCh1JigxPDxfK2IpLTEpPj5fKV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKF8rKGc9VD4+PjI0KTw9bCk7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH11Pj4+PV8sbC09XyxuLmJhY2srPV99aWYodT4+Pj1nLGwtPWcsbi5iYWNrKz1nLG4ubGVuZ3RoPXksMD09PW0pe24ubW9kZT0yNjticmVha31pZigzMiZtKXtuLmJhY2s9LTEsbi5tb2RlPTEyO2JyZWFrfWlmKDY0Jm0pe2UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLG4ubW9kZT0zMDticmVha31uLmV4dHJhPTE1Jm0sbi5tb2RlPTIyO2Nhc2UgMjI6aWYobi5leHRyYSl7Zm9yKEM9bi5leHRyYTtsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLmxlbmd0aCs9dSYoMTw8bi5leHRyYSktMSx1Pj4+PW4uZXh0cmEsbC09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9bi53YXM9bi5sZW5ndGgsbi5tb2RlPTIzO2Nhc2UgMjM6Zm9yKDttPShUPW4uZGlzdGNvZGVbdSYoMTw8bi5kaXN0Yml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKChnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYoMD09KDI0MCZtKSl7Zm9yKF89ZyxiPW0sdz15O209KFQ9bi5kaXN0Y29kZVt3KygodSYoMTw8XytiKS0xKT4+XyldKT4+PjE2JjI1NSx5PTY1NTM1JlQsIShfKyhnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9dT4+Pj1fLGwtPV8sbi5iYWNrKz1ffWlmKHU+Pj49ZyxsLT1nLG4uYmFjays9Zyw2NCZtKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixuLm1vZGU9MzA7YnJlYWt9bi5vZmZzZXQ9eSxuLmV4dHJhPTE1Jm0sbi5tb2RlPTI0O2Nhc2UgMjQ6aWYobi5leHRyYSl7Zm9yKEM9bi5leHRyYTtsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLm9mZnNldCs9dSYoMTw8bi5leHRyYSktMSx1Pj4+PW4uZXh0cmEsbC09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9aWYobi5vZmZzZXQ+bi5kbWF4KXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT0zMDticmVha31uLm1vZGU9MjU7Y2FzZSAyNTppZigwPT09YylicmVhayBlO2lmKHA9Zi1jLG4ub2Zmc2V0PnApe2lmKChwPW4ub2Zmc2V0LXApPm4ud2hhdmUmJm4uc2FuZSl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixuLm1vZGU9MzA7YnJlYWt9cD5uLnduZXh0PyhwLT1uLnduZXh0LGg9bi53c2l6ZS1wKTpoPW4ud25leHQtcCxwPm4ubGVuZ3RoJiYocD1uLmxlbmd0aCksdj1uLndpbmRvd31lbHNlIHY9aSxoPWEtbi5vZmZzZXQscD1uLmxlbmd0aDtmb3IoYzxwJiYocD1jKSxjLT1wLG4ubGVuZ3RoLT1wO2lbYSsrXT12W2grK10sLS1wOyk7MD09PW4ubGVuZ3RoJiYobi5tb2RlPTIxKTticmVhaztjYXNlIDI2OmlmKDA9PT1jKWJyZWFrIGU7aVthKytdPW4ubGVuZ3RoLGMtLSxuLm1vZGU9MjE7YnJlYWs7Y2FzZSAyNzppZihuLndyYXApe2Zvcig7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHV8PXJbbysrXTw8bCxsKz04fWlmKGYtPWMsZS50b3RhbF9vdXQrPWYsbi50b3RhbCs9ZixmJiYoZS5hZGxlcj1uLmNoZWNrPW4uZmxhZ3M/JGQobi5jaGVjayxpLGYsYS1mKTpFZChuLmNoZWNrLGksZixhLWYpKSxmPWMsKG4uZmxhZ3M/dTpYZih1KSkhPT1uLmNoZWNrKXtlLm1zZz0iaW5jb3JyZWN0IGRhdGEgY2hlY2siLG4ubW9kZT0zMDticmVha31sPXU9MH1uLm1vZGU9Mjg7Y2FzZSAyODppZihuLndyYXAmJm4uZmxhZ3Mpe2Zvcig7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKHUhPT0oNDI5NDk2NzI5NSZuLnRvdGFsKSl7ZS5tc2c9ImluY29ycmVjdCBsZW5ndGggY2hlY2siLG4ubW9kZT0zMDticmVha31sPXU9MH1uLm1vZGU9Mjk7Y2FzZSAyOTpTPTE7YnJlYWsgZTtjYXNlIDMwOlM9LTM7YnJlYWsgZTtjYXNlIDMxOnJldHVybi00O2Nhc2UgMzI6ZGVmYXVsdDpyZXR1cm4gcWZ9cmV0dXJuIGUubmV4dF9vdXQ9YSxlLmF2YWlsX291dD1jLGUubmV4dF9pbj1vLGUuYXZhaWxfaW49cyxuLmhvbGQ9dSxuLmJpdHM9bCwobi53c2l6ZXx8ZiE9PWUuYXZhaWxfb3V0JiZuLm1vZGU8MzAmJihuLm1vZGU8Mjd8fDQhPT10KSkmJmlwKGUsZS5vdXRwdXQsZS5uZXh0X291dCxmLWUuYXZhaWxfb3V0KSxkLT1lLmF2YWlsX2luLGYtPWUuYXZhaWxfb3V0LGUudG90YWxfaW4rPWQsZS50b3RhbF9vdXQrPWYsbi50b3RhbCs9ZixuLndyYXAmJmYmJihlLmFkbGVyPW4uY2hlY2s9bi5mbGFncz8kZChuLmNoZWNrLGksZixlLm5leHRfb3V0LWYpOkVkKG4uY2hlY2ssaSxmLGUubmV4dF9vdXQtZikpLGUuZGF0YV90eXBlPW4uYml0cysobi5sYXN0PzY0OjApKygxMj09PW4ubW9kZT8xMjg6MCkrKDIwPT09bi5tb2RlfHwxNT09PW4ubW9kZT8yNTY6MCksKDA9PT1kJiYwPT09Znx8ND09PXQpJiZTPT09VmYmJihTPS01KSxTfSxpbmZsYXRlRW5kOmZ1bmN0aW9uKGUpe2lmKCFlfHwhZS5zdGF0ZSlyZXR1cm4gcWY7dmFyIHQ9ZS5zdGF0ZTtyZXR1cm4gdC53aW5kb3cmJih0LndpbmRvdz1udWxsKSxlLnN0YXRlPW51bGwsVmZ9LGluZmxhdGVHZXRIZWFkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gZSYmZS5zdGF0ZT8wPT0oMiYobj1lLnN0YXRlKS53cmFwKT9xZjooKG4uaGVhZD10KS5kb25lPSExLFZmKTpxZn0saW5mbGF0ZVNldERpY3Rpb25hcnk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXQubGVuZ3RoO3JldHVybiBlJiZlLnN0YXRlPzAhPT0obj1lLnN0YXRlKS53cmFwJiYxMSE9PW4ubW9kZT9xZjoxMT09PW4ubW9kZSYmRWQoMSx0LHIsMCkhPT1uLmNoZWNrPy0zOmlwKGUsdCxyLHIpPyhuLm1vZGU9MzEsLTQpOihuLmhhdmVkaWN0PTEsVmYpOnFmfSxpbmZsYXRlSW5mbzoicGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LGFwPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9O3ZhciBzcD1mdW5jdGlvbigpe3RoaXMudGV4dD0wLHRoaXMudGltZT0wLHRoaXMueGZsYWdzPTAsdGhpcy5vcz0wLHRoaXMuZXh0cmE9bnVsbCx0aGlzLmV4dHJhX2xlbj0wLHRoaXMubmFtZT0iIix0aGlzLmNvbW1lbnQ9IiIsdGhpcy5oY3JjPTAsdGhpcy5kb25lPSExfSxjcD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIHVwKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHVwKSlyZXR1cm4gbmV3IHVwKGUpO3RoaXMub3B0aW9ucz1QbC5hc3NpZ24oe2NodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjAsdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJjA8PXQud2luZG93Qml0cyYmdC53aW5kb3dCaXRzPDE2JiYodC53aW5kb3dCaXRzPS10LndpbmRvd0JpdHMsMD09PXQud2luZG93Qml0cyYmKHQud2luZG93Qml0cz0tMTUpKSwhKDA8PXQud2luZG93Qml0cyYmdC53aW5kb3dCaXRzPDE2KXx8ZSYmZS53aW5kb3dCaXRzfHwodC53aW5kb3dCaXRzKz0zMiksMTU8dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8NDgmJjA9PSgxNSZ0LndpbmRvd0JpdHMpJiYodC53aW5kb3dCaXRzfD0xNSksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgVGYsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPW9wLmluZmxhdGVJbml0Mih0aGlzLnN0cm0sdC53aW5kb3dCaXRzKTtpZihuIT09YXAuWl9PSyl0aHJvdyBuZXcgRXJyb3IoUGRbbl0pO2lmKHRoaXMuaGVhZGVyPW5ldyBzcCxvcC5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSx0aGlzLmhlYWRlciksdC5kaWN0aW9uYXJ5JiYoInN0cmluZyI9PXR5cGVvZiB0LmRpY3Rpb25hcnk/dC5kaWN0aW9uYXJ5PUNmLnN0cmluZzJidWYodC5kaWN0aW9uYXJ5KToiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09Y3AuY2FsbCh0LmRpY3Rpb25hcnkpJiYodC5kaWN0aW9uYXJ5PW5ldyBVaW50OEFycmF5KHQuZGljdGlvbmFyeSkpLHQucmF3JiYobj1vcC5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sdC5kaWN0aW9uYXJ5KSkhPT1hcC5aX09LKSl0aHJvdyBuZXcgRXJyb3IoUGRbbl0pfWZ1bmN0aW9uIGxwKGUsdCl7dmFyIG49bmV3IHVwKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8UGRbbi5lcnJdO3JldHVybiBuLnJlc3VsdH11cC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz10aGlzLnN0cm0sYz10aGlzLm9wdGlvbnMuY2h1bmtTaXplLHU9dGhpcy5vcHRpb25zLmRpY3Rpb25hcnksbD0hMTtpZih0aGlzLmVuZGVkKXJldHVybiExO3I9dD09PX5+dD90OiEwPT09dD9hcC5aX0ZJTklTSDphcC5aX05PX0ZMVVNILCJzdHJpbmciPT10eXBlb2YgZT9zLmlucHV0PUNmLmJpbnN0cmluZzJidWYoZSk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PWNwLmNhbGwoZSk/cy5pbnB1dD1uZXcgVWludDhBcnJheShlKTpzLmlucHV0PWUscy5uZXh0X2luPTAscy5hdmFpbF9pbj1zLmlucHV0Lmxlbmd0aDtkb3tpZigwPT09cy5hdmFpbF9vdXQmJihzLm91dHB1dD1uZXcgUGwuQnVmOChjKSxzLm5leHRfb3V0PTAscy5hdmFpbF9vdXQ9YyksKG49b3AuaW5mbGF0ZShzLGFwLlpfTk9fRkxVU0gpKT09PWFwLlpfTkVFRF9ESUNUJiZ1JiYobj1vcC5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sdSkpLG49PT1hcC5aX0JVRl9FUlJPUiYmITA9PT1sJiYobj1hcC5aX09LLGw9ITEpLG4hPT1hcC5aX1NUUkVBTV9FTkQmJm4hPT1hcC5aX09LKXJldHVybiB0aGlzLm9uRW5kKG4pLCEodGhpcy5lbmRlZD0hMCk7cy5uZXh0X291dCYmKDAhPT1zLmF2YWlsX291dCYmbiE9PWFwLlpfU1RSRUFNX0VORCYmKDAhPT1zLmF2YWlsX2lufHxyIT09YXAuWl9GSU5JU0gmJnIhPT1hcC5aX1NZTkNfRkxVU0gpfHwoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/KGk9Q2YudXRmOGJvcmRlcihzLm91dHB1dCxzLm5leHRfb3V0KSxvPXMubmV4dF9vdXQtaSxhPUNmLmJ1ZjJzdHJpbmcocy5vdXRwdXQsaSkscy5uZXh0X291dD1vLHMuYXZhaWxfb3V0PWMtbyxvJiZQbC5hcnJheVNldChzLm91dHB1dCxzLm91dHB1dCxpLG8sMCksdGhpcy5vbkRhdGEoYSkpOnRoaXMub25EYXRhKFBsLnNocmlua0J1ZihzLm91dHB1dCxzLm5leHRfb3V0KSkpKSwwPT09cy5hdmFpbF9pbiYmMD09PXMuYXZhaWxfb3V0JiYobD0hMCl9d2hpbGUoKDA8cy5hdmFpbF9pbnx8MD09PXMuYXZhaWxfb3V0KSYmbiE9PWFwLlpfU1RSRUFNX0VORCk7cmV0dXJuIG49PT1hcC5aX1NUUkVBTV9FTkQmJihyPWFwLlpfRklOSVNIKSxyPT09YXAuWl9GSU5JU0g/KG49b3AuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQobiksdGhpcy5lbmRlZD0hMCxuPT09YXAuWl9PSyk6ciE9PWFwLlpfU1lOQ19GTFVTSHx8KHRoaXMub25FbmQoYXAuWl9PSyksIShzLmF2YWlsX291dD0wKSl9LHVwLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaHVua3MucHVzaChlKX0sdXAucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKGUpe2U9PT1hcC5aX09LJiYoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9UGwuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307dmFyIGRwPXtJbmZsYXRlOnVwLGluZmxhdGU6bHAsaW5mbGF0ZVJhdzpmdW5jdGlvbihlLHQpe3JldHVybih0PXR8fHt9KS5yYXc9ITAsbHAoZSx0KX0sdW5nemlwOmxwfSxmcD17fTsoMCxQbC5hc3NpZ24pKGZwLGpmLGRwLGFwKTt2YXIgcHA9ZnAsaHA9WXUoImNhbnZhc0V2ZW50Iik7ZnVuY3Rpb24gdnAoZSx0LG4scil7YWcucHVibGlzaEhhbmRsZXIodCsiLWNhbnZhcy0iK2Use2NhbnZhc0lkOmUsdHlwZTpuLGRhdGE6cn0sdCl9YWcuc3Vic2NyaWJlKCJvbkNhbnZhc01ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGEscj1ocC5wb3AodCk7ciYmcihuKX0pO3ZhciBncD17YWxpY2VibHVlOiIjZjBmOGZmIixhbnRpcXVld2hpdGU6IiNmYWViZDciLGFxdWE6IiMwMGZmZmYiLGFxdWFtYXJpbmU6IiM3ZmZmZDQiLGF6dXJlOiIjZjBmZmZmIixiZWlnZToiI2Y1ZjVkYyIsYmlzcXVlOiIjZmZlNGM0IixibGFjazoiIzAwMDAwMCIsYmxhbmNoZWRhbG1vbmQ6IiNmZmViY2QiLGJsdWU6IiMwMDAwZmYiLGJsdWV2aW9sZXQ6IiM4YTJiZTIiLGJyb3duOiIjYTUyYTJhIixidXJseXdvb2Q6IiNkZWI4ODciLGNhZGV0Ymx1ZToiIzVmOWVhMCIsY2hhcnRyZXVzZToiIzdmZmYwMCIsY2hvY29sYXRlOiIjZDI2OTFlIixjb3JhbDoiI2ZmN2Y1MCIsY29ybmZsb3dlcmJsdWU6IiM2NDk1ZWQiLGNvcm5zaWxrOiIjZmZmOGRjIixjcmltc29uOiIjZGMxNDNjIixjeWFuOiIjMDBmZmZmIixkYXJrYmx1ZToiIzAwMDA4YiIsZGFya2N5YW46IiMwMDhiOGIiLGRhcmtnb2xkZW5yb2Q6IiNiODg2MGIiLGRhcmtncmF5OiIjYTlhOWE5IixkYXJrZ3JleToiI2E5YTlhOSIsZGFya2dyZWVuOiIjMDA2NDAwIixkYXJra2hha2k6IiNiZGI3NmIiLGRhcmttYWdlbnRhOiIjOGIwMDhiIixkYXJrb2xpdmVncmVlbjoiIzU1NmIyZiIsZGFya29yYW5nZToiI2ZmOGMwMCIsZGFya29yY2hpZDoiIzk5MzJjYyIsZGFya3JlZDoiIzhiMDAwMCIsZGFya3NhbG1vbjoiI2U5OTY3YSIsZGFya3NlYWdyZWVuOiIjOGZiYzhmIixkYXJrc2xhdGVibHVlOiIjNDgzZDhiIixkYXJrc2xhdGVncmF5OiIjMmY0ZjRmIixkYXJrc2xhdGVncmV5OiIjMmY0ZjRmIixkYXJrdHVycXVvaXNlOiIjMDBjZWQxIixkYXJrdmlvbGV0OiIjOTQwMGQzIixkZWVwcGluazoiI2ZmMTQ5MyIsZGVlcHNreWJsdWU6IiMwMGJmZmYiLGRpbWdyYXk6IiM2OTY5NjkiLGRpbWdyZXk6IiM2OTY5NjkiLGRvZGdlcmJsdWU6IiMxZTkwZmYiLGZpcmVicmljazoiI2IyMjIyMiIsZmxvcmFsd2hpdGU6IiNmZmZhZjAiLGZvcmVzdGdyZWVuOiIjMjI4YjIyIixmdWNoc2lhOiIjZmYwMGZmIixnYWluc2Jvcm86IiNkY2RjZGMiLGdob3N0d2hpdGU6IiNmOGY4ZmYiLGdvbGQ6IiNmZmQ3MDAiLGdvbGRlbnJvZDoiI2RhYTUyMCIsZ3JheToiIzgwODA4MCIsZ3JleToiIzgwODA4MCIsZ3JlZW46IiMwMDgwMDAiLGdyZWVueWVsbG93OiIjYWRmZjJmIixob25leWRldzoiI2YwZmZmMCIsaG90cGluazoiI2ZmNjliNCIsaW5kaWFucmVkOiIjY2Q1YzVjIixpbmRpZ286IiM0YjAwODIiLGl2b3J5OiIjZmZmZmYwIixraGFraToiI2YwZTY4YyIsbGF2ZW5kZXI6IiNlNmU2ZmEiLGxhdmVuZGVyYmx1c2g6IiNmZmYwZjUiLGxhd25ncmVlbjoiIzdjZmMwMCIsbGVtb25jaGlmZm9uOiIjZmZmYWNkIixsaWdodGJsdWU6IiNhZGQ4ZTYiLGxpZ2h0Y29yYWw6IiNmMDgwODAiLGxpZ2h0Y3lhbjoiI2UwZmZmZiIsbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IiNmYWZhZDIiLGxpZ2h0Z3JheToiI2QzZDNkMyIsbGlnaHRncmV5OiIjZDNkM2QzIixsaWdodGdyZWVuOiIjOTBlZTkwIixsaWdodHBpbms6IiNmZmI2YzEiLGxpZ2h0c2FsbW9uOiIjZmZhMDdhIixsaWdodHNlYWdyZWVuOiIjMjBiMmFhIixsaWdodHNreWJsdWU6IiM4N2NlZmEiLGxpZ2h0c2xhdGVncmF5OiIjNzc4ODk5IixsaWdodHNsYXRlZ3JleToiIzc3ODg5OSIsbGlnaHRzdGVlbGJsdWU6IiNiMGM0ZGUiLGxpZ2h0eWVsbG93OiIjZmZmZmUwIixsaW1lOiIjMDBmZjAwIixsaW1lZ3JlZW46IiMzMmNkMzIiLGxpbmVuOiIjZmFmMGU2IixtYWdlbnRhOiIjZmYwMGZmIixtYXJvb246IiM4MDAwMDAiLG1lZGl1bWFxdWFtYXJpbmU6IiM2NmNkYWEiLG1lZGl1bWJsdWU6IiMwMDAwY2QiLG1lZGl1bW9yY2hpZDoiI2JhNTVkMyIsbWVkaXVtcHVycGxlOiIjOTM3MGRiIixtZWRpdW1zZWFncmVlbjoiIzNjYjM3MSIsbWVkaXVtc2xhdGVibHVlOiIjN2I2OGVlIixtZWRpdW1zcHJpbmdncmVlbjoiIzAwZmE5YSIsbWVkaXVtdHVycXVvaXNlOiIjNDhkMWNjIixtZWRpdW12aW9sZXRyZWQ6IiNjNzE1ODUiLG1pZG5pZ2h0Ymx1ZToiIzE5MTk3MCIsbWludGNyZWFtOiIjZjVmZmZhIixtaXN0eXJvc2U6IiNmZmU0ZTEiLG1vY2Nhc2luOiIjZmZlNGI1IixuYXZham93aGl0ZToiI2ZmZGVhZCIsbmF2eToiIzAwMDA4MCIsb2xkbGFjZToiI2ZkZjVlNiIsb2xpdmU6IiM4MDgwMDAiLG9saXZlZHJhYjoiIzZiOGUyMyIsb3JhbmdlOiIjZmZhNTAwIixvcmFuZ2VyZWQ6IiNmZjQ1MDAiLG9yY2hpZDoiI2RhNzBkNiIscGFsZWdvbGRlbnJvZDoiI2VlZThhYSIscGFsZWdyZWVuOiIjOThmYjk4IixwYWxldHVycXVvaXNlOiIjYWZlZWVlIixwYWxldmlvbGV0cmVkOiIjZGI3MDkzIixwYXBheWF3aGlwOiIjZmZlZmQ1IixwZWFjaHB1ZmY6IiNmZmRhYjkiLHBlcnU6IiNjZDg1M2YiLHBpbms6IiNmZmMwY2IiLHBsdW06IiNkZGEwZGQiLHBvd2RlcmJsdWU6IiNiMGUwZTYiLHB1cnBsZToiIzgwMDA4MCIscmViZWNjYXB1cnBsZToiIzY2MzM5OSIscmVkOiIjZmYwMDAwIixyb3N5YnJvd246IiNiYzhmOGYiLHJveWFsYmx1ZToiIzQxNjllMSIsc2FkZGxlYnJvd246IiM4YjQ1MTMiLHNhbG1vbjoiI2ZhODA3MiIsc2FuZHlicm93bjoiI2Y0YTQ2MCIsc2VhZ3JlZW46IiMyZThiNTciLHNlYXNoZWxsOiIjZmZmNWVlIixzaWVubmE6IiNhMDUyMmQiLHNpbHZlcjoiI2MwYzBjMCIsc2t5Ymx1ZToiIzg3Y2VlYiIsc2xhdGVibHVlOiIjNmE1YWNkIixzbGF0ZWdyYXk6IiM3MDgwOTAiLHNsYXRlZ3JleToiIzcwODA5MCIsc25vdzoiI2ZmZmFmYSIsc3ByaW5nZ3JlZW46IiMwMGZmN2YiLHN0ZWVsYmx1ZToiIzQ2ODJiNCIsdGFuOiIjZDJiNDhjIix0ZWFsOiIjMDA4MDgwIix0aGlzdGxlOiIjZDhiZmQ4Iix0b21hdG86IiNmZjYzNDciLHR1cnF1b2lzZToiIzQwZTBkMCIsdmlvbGV0OiIjZWU4MmVlIix3aGVhdDoiI2Y1ZGViMyIsd2hpdGU6IiNmZmZmZmYiLHdoaXRlc21va2U6IiNmNWY1ZjUiLHllbGxvdzoiI2ZmZmYwMCIseWVsbG93Z3JlZW46IiM5YWNkMzIiLHRyYW5zcGFyZW50OiIjMDAwMDAwMDAifTtmdW5jdGlvbiBtcChlKXt2YXIgdD1udWxsO2lmKG51bGwhPSh0PS9eIyhbMC05fEEtRnxhLWZdezZ9KSQvLmV4ZWMoZT1lfHwiIzAwMDAwMCIpKSlyZXR1cm5bcGFyc2VJbnQodFsxXS5zbGljZSgwLDIpLDE2KSxwYXJzZUludCh0WzFdLnNsaWNlKDIsNCksMTYpLHBhcnNlSW50KHRbMV0uc2xpY2UoNCksMTYpLDI1NV07aWYobnVsbCE9KHQ9L14jKFswLTl8QS1GfGEtZl17M30pJC8uZXhlYyhlKSkpe3ZhciBuPXRbMV0uc2xpY2UoMCwxKSxyPXRbMV0uc2xpY2UoMSwyKSxpPXRbMV0uc2xpY2UoMiwzKTtyZXR1cm5bbj1wYXJzZUludChuK24sMTYpLHI9cGFyc2VJbnQocityLDE2KSxpPXBhcnNlSW50KGkraSwxNiksMjU1XX1pZihudWxsIT0odD0vXnJnYlwoKC4rKVwpJC8uZXhlYyhlKSkpcmV0dXJuIHRbMV0uc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWluKDI1NSxwYXJzZUludChlLnRyaW0oKSkpfSkuY29uY2F0KDI1NSk7aWYobnVsbCE9KHQ9L15yZ2JhXCgoLispXCkkLy5leGVjKGUpKSlyZXR1cm4gdFsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiAzPT09dD9NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGUudHJpbSgpKSk6TWF0aC5taW4oMjU1LHBhcnNlSW50KGUudHJpbSgpKSl9KTt2YXIgbz1lLnRvTG93ZXJDYXNlKCk7aWYoayhncCxvKSl7dD0vXiMoWzAtOXxBLUZ8YS1mXXs2LDh9KSQvLmV4ZWMoZ3Bbb10pO3ZhciBhPXBhcnNlSW50KHRbMV0uc2xpY2UoMCwyKSwxNikscz1wYXJzZUludCh0WzFdLnNsaWNlKDIsNCksMTYpLGM9cGFyc2VJbnQodFsxXS5zbGljZSg0LDYpLDE2KSx1PXBhcnNlSW50KHRbMV0uc2xpY2UoNiw4KSwxNik7cmV0dXJuW2EscyxjLHU9MDw9dT91OjI1NV19cmV0dXJuIGNvbnNvbGUuZXJyb3IoInVuc3VwcG9ydGVkIGNvbG9yOiIrZSksWzAsMCwwLDI1NV19ZnVuY3Rpb24geXAoZSx0KXt0aGlzLnR5cGU9InBhdHRlcm4iLHRoaXMuZGF0YT1lLHRoaXMuY29sb3JTdG9wPXR9dmFyIF9wPWZ1bmN0aW9uKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXQsdGhpcy5jb2xvclN0b3A9W119O19wLnByb3RvdHlwZS5hZGRDb2xvclN0b3A9ZnVuY3Rpb24oZSx0KXt0aGlzLmNvbG9yU3RvcC5wdXNoKFtlLG1wKHQpXSl9O2Z1bmN0aW9uIGJwKGUpe3RoaXMud2lkdGg9ZX12YXIgd3A9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlSWQ9dCx0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09W10sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMuZHJhd2luZ1N0YXRlPVtdLHRoaXMuc3RhdGU9e2xpbmVEYXNoOlswLDBdLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOlswLDAsMCwwXSxmb250OiIxMHB4IHNhbnMtc2VyaWYiLGZvbnRTaXplOjEwLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYifX0sa3A9e2xpbmVEYXNoT2Zmc2V0Ontjb25maWd1cmFibGU6ITB9LGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbjp7Y29uZmlndXJhYmxlOiEwfSxzaGFkb3dCbHVyOntjb25maWd1cmFibGU6ITB9LHNoYWRvd0NvbG9yOntjb25maWd1cmFibGU6ITB9LHNoYWRvd09mZnNldFg6e2NvbmZpZ3VyYWJsZTohMH0sc2hhZG93T2Zmc2V0WTp7Y29uZmlndXJhYmxlOiEwfSxmb250Ontjb25maWd1cmFibGU6ITB9LGZpbGxTdHlsZTp7Y29uZmlndXJhYmxlOiEwfSxzdHJva2VTdHlsZTp7Y29uZmlndXJhYmxlOiEwfSxnbG9iYWxBbHBoYTp7Y29uZmlndXJhYmxlOiEwfSx0ZXh0QWxpZ246e2NvbmZpZ3VyYWJsZTohMH0sbGluZUNhcDp7Y29uZmlndXJhYmxlOiEwfSxsaW5lSm9pbjp7Y29uZmlndXJhYmxlOiEwfSxsaW5lV2lkdGg6e2NvbmZpZ3VyYWJsZTohMH0sbWl0ZXJMaW1pdDp7Y29uZmlndXJhYmxlOiEwfSx0ZXh0QmFzZWxpbmU6e2NvbmZpZ3VyYWJsZTohMH19O3dwLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciBuLHI9W10uY29uY2F0KHRoaXMuYWN0aW9ucyk7dGhpcy5hY3Rpb25zPVtdLHRoaXMucGF0aD1bXSwiZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49aHAucHVzaCh0KSksdnAodGhpcy5pZCx0aGlzLnBhZ2VJZCwiYWN0aW9uc0NoYW5nZWQiLHthY3Rpb25zOnIscmVzZXJ2ZTplLGNhbGxiYWNrSWQ6bn0pfSx3cC5wcm90b3R5cGUuY3JlYXRlTGluZWFyR3JhZGllbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG5ldyBfcCgibGluZWFyIixbZSx0LG4scl0pfSx3cC5wcm90b3R5cGUuY3JlYXRlQ2lyY3VsYXJHcmFkaWVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyBfcCgicmFkaWFsIixbZSx0LG5dKX0sd3AucHJvdG90eXBlLmNyZWF0ZVBhdHRlcm49ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10KWNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdjcmVhdGVQYXR0ZXJuJyBvbiAnQ2FudmFzQ29udGV4dCc6IDIgYXJndW1lbnRzIHJlcXVpcmVkLCBidXQgb25seSAxIHByZXNlbnQuIik7ZWxzZXtpZighKFsicmVwZWF0IiwicmVwZWF0LXgiLCJyZXBlYXQteSIsIm5vLXJlcGVhdCJdLmluZGV4T2YodCk8MCkpcmV0dXJuIG5ldyB5cChlLHQpO2NvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdjcmVhdGVQYXR0ZXJuJyBvbiAnQ2FudmFzQ29udGV4dCc6IFRoZSBwcm92aWRlZCB0eXBlICgnIit0KyInKSBpcyBub3Qgb25lIG9mICdyZXBlYXQnLCAnbm8tcmVwZWF0JywgJ3JlcGVhdC14Jywgb3IgJ3JlcGVhdC15Jy4iKX19LHdwLnByb3RvdHlwZS5tZWFzdXJlVGV4dD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnN0YXRlLmZvbnQsbj0wLHI9b2cud2Vidmlldy5hbGwoKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFVSTCgpLmVuZHNXaXRoKCJ3d3cvX191bmlhcHB2aWV3Lmh0bWwiKX0pO3JldHVybiByJiYobj1OdW1iZXIoci5ldmFsSlNTeW5jKCIoIitmdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik7cmV0dXJuIG4uZm9udD10LG4ubWVhc3VyZVRleHQoZSkud2lkdGh8fDB9LnRvU3RyaW5nKCkrIikoIitKU09OLnN0cmluZ2lmeShlKSsiLCIrSlNPTi5zdHJpbmdpZnkodCkrIikiKSkpLG5ldyBicChuKX0sd3AucHJvdG90eXBlLnNhdmU9ZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzYXZlIixkYXRhOltdfSksdGhpcy5kcmF3aW5nU3RhdGUucHVzaCh0aGlzLnN0YXRlKX0sd3AucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJyZXN0b3JlIixkYXRhOltdfSksdGhpcy5zdGF0ZT10aGlzLmRyYXdpbmdTdGF0ZS5wb3AoKXx8e2xpbmVEYXNoOlswLDBdLHNoYWRvd09mZnNldFg6MCxzaGFkb3dPZmZzZXRZOjAsc2hhZG93Qmx1cjowLHNoYWRvd0NvbG9yOlswLDAsMCwwXSxmb250OiIxMHB4IHNhbnMtc2VyaWYiLGZvbnRTaXplOjEwLGZvbnRXZWlnaHQ6Im5vcm1hbCIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRGYW1pbHk6InNhbnMtc2VyaWYifX0sd3AucHJvdG90eXBlLmJlZ2luUGF0aD1mdW5jdGlvbigpe3RoaXMucGF0aD1bXSx0aGlzLnN1YnBhdGg9W10sdGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYmVnaW5QYXRoIixkYXRhOltdfSl9LHdwLnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24oZSx0KXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJtb3ZlVG8iLGRhdGE6W2UsdF19KSx0aGlzLnN1YnBhdGg9W1tlLHRdXX0sd3AucHJvdG90eXBlLmxpbmVUbz1mdW5jdGlvbihlLHQpezA9PT10aGlzLnBhdGgubGVuZ3RoJiYwPT09dGhpcy5zdWJwYXRoLmxlbmd0aD90aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJtb3ZlVG8iLGRhdGE6W2UsdF19KTp0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJsaW5lVG8iLGRhdGE6W2UsdF19KSx0aGlzLnN1YnBhdGgucHVzaChbZSx0XSl9LHdwLnByb3RvdHlwZS5xdWFkcmF0aWNDdXJ2ZVRvPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InF1YWRyYXRpY0N1cnZlVG8iLGRhdGE6W2UsdCxuLHJdfSksdGhpcy5zdWJwYXRoLnB1c2goW24scl0pfSx3cC5wcm90b3R5cGUuYmV6aWVyQ3VydmVUbz1mdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYmV6aWVyQ3VydmVUbyIsZGF0YTpbZSx0LG4scixpLG9dfSksdGhpcy5zdWJwYXRoLnB1c2goW2ksb10pfSx3cC5wcm90b3R5cGUuYXJjPWZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2b2lkIDA9PT1vJiYobz0hMSksdGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYXJjIixkYXRhOltlLHQsbixyLGksb119KSx0aGlzLnN1YnBhdGgucHVzaChbZSx0XSl9LHdwLnByb3RvdHlwZS5yZWN0PWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InJlY3QiLGRhdGE6W2UsdCxuLHJdfSksdGhpcy5zdWJwYXRoPVtbZSx0XV19LHdwLnByb3RvdHlwZS5hcmNUbz1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImFyY1RvIixkYXRhOltlLHQsbixyLGldfSksdGhpcy5zdWJwYXRoLnB1c2goW24scl0pfSx3cC5wcm90b3R5cGUuY2xpcD1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ImNsaXAiLGRhdGE6W10uY29uY2F0KHRoaXMucGF0aCl9KX0sd3AucHJvdG90eXBlLmNsb3NlUGF0aD1mdW5jdGlvbigpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImNsb3NlUGF0aCIsZGF0YTpbXX0pLHRoaXMuc3VicGF0aC5sZW5ndGgmJih0aGlzLnN1YnBhdGg9W3RoaXMuc3VicGF0aC5zaGlmdCgpXSl9LHdwLnByb3RvdHlwZS5jbGVhckFjdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXX0sd3AucHJvdG90eXBlLmdldEFjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgZT1bXS5jb25jYXQodGhpcy5hY3Rpb25zKTtyZXR1cm4gdGhpcy5jbGVhckFjdGlvbnMoKSxlfSxrcC5saW5lRGFzaE9mZnNldC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZURhc2hPZmZzZXQiLGRhdGE6W2VdfSl9LGtwLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbi5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIixkYXRhOltlXX0pfSxrcC5zaGFkb3dCbHVyLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dCbHVyIixkYXRhOltlXX0pfSxrcC5zaGFkb3dDb2xvci5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93Q29sb3IiLGRhdGE6W2VdfSl9LGtwLnNoYWRvd09mZnNldFguc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd09mZnNldFgiLGRhdGE6W2VdfSl9LGtwLnNoYWRvd09mZnNldFkuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd09mZnNldFkiLGRhdGE6W2VdfSl9LGtwLmZvbnQuc2V0PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMsdD0odGhpcy5zdGF0ZS5mb250PWUpLm1hdGNoKC9eKChbXHdcLV0rXHMpKikoXGQrcj9weCkoXC8oXGQrXC4/XGQqKHI/cHgpPykpP1xzKyguKikvKTtpZih0KXt2YXIgcj10WzFdLnRyaW0oKS5zcGxpdCgvXHMvKSxpPXBhcnNlRmxvYXQodFszXSksbz10WzddLGE9W107ci5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7LTE8WyJpdGFsaWMiLCJvYmxpcXVlIiwibm9ybWFsIl0uaW5kZXhPZihlKT8oYS5wdXNoKHttZXRob2Q6InNldEZvbnRTdHlsZSIsZGF0YTpbZV19KSxuLnN0YXRlLmZvbnRTdHlsZT1lKTotMTxbImJvbGQiLCJub3JtYWwiXS5pbmRleE9mKGUpPyhhLnB1c2goe21ldGhvZDoic2V0Rm9udFdlaWdodCIsZGF0YTpbZV19KSxuLnN0YXRlLmZvbnRXZWlnaHQ9ZSk6MD09PXQ/KGEucHVzaCh7bWV0aG9kOiJzZXRGb250U3R5bGUiLGRhdGE6WyJub3JtYWwiXX0pLG4uc3RhdGUuZm9udFN0eWxlPSJub3JtYWwiKToxPT09dCYmcygpfSksMT09PXIubGVuZ3RoJiZzKCkscj1hLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5kYXRhWzBdfSkuam9pbigiICIpLHRoaXMuc3RhdGUuZm9udFNpemU9aSx0aGlzLnN0YXRlLmZvbnRGYW1pbHk9byx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRGb250IixkYXRhOltyKyIgIitpKyJweCAiK29dfSl9ZWxzZSBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBzZXQgJ2ZvbnQnIG9uICdDYW52YXNDb250ZXh0JzogaW52YWxpZCBmb3JtYXQuIik7ZnVuY3Rpb24gcygpe2EucHVzaCh7bWV0aG9kOiJzZXRGb250V2VpZ2h0IixkYXRhOlsibm9ybWFsIl19KSxuLnN0YXRlLmZvbnRXZWlnaHQ9Im5vcm1hbCJ9fSxrcC5mb250LmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlLmZvbnR9LGtwLmZpbGxTdHlsZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRGaWxsU3R5bGUoZSl9LGtwLnN0cm9rZVN0eWxlLnNldD1mdW5jdGlvbihlKXt0aGlzLnNldFN0cm9rZVN0eWxlKGUpfSxrcC5nbG9iYWxBbHBoYS5zZXQ9ZnVuY3Rpb24oZSl7ZT1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGUpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxBbHBoYSIsZGF0YTpbZV19KX0sa3AudGV4dEFsaWduLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRUZXh0QWxpZ24iLGRhdGE6W2VdfSl9LGtwLmxpbmVDYXAuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVDYXAiLGRhdGE6W2VdfSl9LGtwLmxpbmVKb2luLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lSm9pbiIsZGF0YTpbZV19KX0sa3AubGluZVdpZHRoLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lV2lkdGgiLGRhdGE6W2VdfSl9LGtwLm1pdGVyTGltaXQuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldE1pdGVyTGltaXQiLGRhdGE6W2VdfSl9LGtwLnRleHRCYXNlbGluZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0VGV4dEJhc2VsaW5lIixkYXRhOltlXX0pfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3cC5wcm90b3R5cGUsa3ApLFsic2NhbGUiLCJyb3RhdGUiLCJ0cmFuc2xhdGUiLCJzZXRUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iXS5jb25jYXQoWyJkcmF3SW1hZ2UiLCJmaWxsVGV4dCIsImZpbGwiLCJzdHJva2UiLCJmaWxsUmVjdCIsInN0cm9rZVJlY3QiLCJjbGVhclJlY3QiLCJzdHJva2VUZXh0Il0pLmZvckVhY2goZnVuY3Rpb24oZSl7d3AucHJvdG90eXBlW2VdPWZ1bmN0aW9uKGQpe3N3aXRjaChkKXtjYXNlImZpbGwiOmNhc2Uic3Ryb2tlIjpyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmQrIlBhdGgiLGRhdGE6W10uY29uY2F0KHRoaXMucGF0aCl9KX07Y2FzZSJmaWxsUmVjdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ImZpbGxQYXRoIixkYXRhOlt7bWV0aG9kOiJyZWN0IixkYXRhOltlLHQsbixyXX1dfSl9O2Nhc2Uic3Ryb2tlUmVjdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InN0cm9rZVBhdGgiLGRhdGE6W3ttZXRob2Q6InJlY3QiLGRhdGE6W2UsdCxuLHJdfV19KX07Y2FzZSJmaWxsVGV4dCI6Y2FzZSJzdHJva2VUZXh0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9W2UudG9TdHJpbmcoKSx0LG5dOyJudW1iZXIiPT10eXBlb2YgciYmaS5wdXNoKHIpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ZCxkYXRhOml9KX07Y2FzZSJkcmF3SW1hZ2UiOnJldHVybiBmdW5jdGlvbihlLHQsbixyLGksbyxhLHMsYyl7dmFyIHU7ZnVuY3Rpb24gbChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9dm9pZCAwPT09YyYmKG89dCxhPW4scz1yLGM9aSxpPXI9bj10PXZvaWQgMCksdT1sKHQpJiZsKG4pJiZsKHIpJiZsKGkpP1tlLG8sYSxzLGMsdCxuLHIsaV06bChzKSYmbChjKT9bZSxvLGEscyxjXTpbZSxvLGFdLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ZCxkYXRhOnV9KX07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpkLGRhdGE6ZX0pfX19KGUpfSksWyJzZXRGaWxsU3R5bGUiLCJzZXRUZXh0QWxpZ24iLCJzZXRTdHJva2VTdHlsZSIsInNldEdsb2JhbEFscGhhIiwic2V0U2hhZG93Iiwic2V0Rm9udFNpemUiLCJzZXRMaW5lQ2FwIiwic2V0TGluZUpvaW4iLCJzZXRMaW5lV2lkdGgiLCJzZXRNaXRlckxpbWl0Iiwic2V0VGV4dEJhc2VsaW5lIiwic2V0TGluZURhc2giXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3dwLnByb3RvdHlwZVtlXT1mdW5jdGlvbihpKXtzd2l0Y2goaSl7Y2FzZSJzZXRGaWxsU3R5bGUiOmNhc2Uic2V0U3Ryb2tlU3R5bGUiOnJldHVybiBmdW5jdGlvbihlKXsib2JqZWN0IiE9dHlwZW9mIGU/dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6WyJub3JtYWwiLG1wKGUpXX0pOnRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlLnR5cGUsZS5kYXRhLGUuY29sb3JTdG9wXX0pfTtjYXNlInNldEdsb2JhbEFscGhhIjpyZXR1cm4gZnVuY3Rpb24oZSl7ZT1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KGUpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbZV19KX07Y2FzZSJzZXRTaGFkb3ciOnJldHVybiBmdW5jdGlvbihlLHQsbixyKXtyPW1wKHIpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlLHQsbixyXX0pLHRoaXMuc3RhdGUuc2hhZG93Qmx1cj1uLHRoaXMuc3RhdGUuc2hhZG93Q29sb3I9cix0aGlzLnN0YXRlLnNoYWRvd09mZnNldFg9ZSx0aGlzLnN0YXRlLnNoYWRvd09mZnNldFk9dH07Y2FzZSJzZXRMaW5lRGFzaCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7ZT1lfHxbMCwwXSx0PXR8fDAsdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6W2UsdF19KSx0aGlzLnN0YXRlLmxpbmVEYXNoPWV9O2Nhc2Uic2V0Rm9udFNpemUiOnJldHVybiBmdW5jdGlvbihlKXt0aGlzLnN0YXRlLmZvbnQ9dGhpcy5zdGF0ZS5mb250LnJlcGxhY2UoL1xkK1wuP1xkKnB4LyxlKyJweCIpLHRoaXMuc3RhdGUuZm9udFNpemU9ZSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbZV19KX07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6ZX0pfX19KGUpfSk7dmFyIFNwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLENhbnZhc0NvbnRleHQ6d3AsY3JlYXRlQ2FudmFzQ29udGV4dDpmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIG5ldyB3cChlLHQuJHBhZ2UuaWQpO3ZhciBuPXhsKCk7aWYobilyZXR1cm4gbmV3IHdwKGUsbik7YWcuZW1pdCgib25FcnJvciIsImNyZWF0ZUNhbnZhc0NvbnRleHQ6ZmFpbCIpfSxjYW52YXNHZXRJbWFnZURhdGE6ZnVuY3Rpb24oZSxuKXt2YXIgdD1lLmNhbnZhc0lkLHI9ZS54LGk9ZS55LG89ZS53aWR0aCxhPWUuaGVpZ2h0LHM9eGwoKTtzP3ZwKHQscywiZ2V0SW1hZ2VEYXRhIix7eDpyLHk6aSx3aWR0aDpvLGhlaWdodDphLGNhbGxiYWNrSWQ6aHAucHVzaChmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dCYmdC5sZW5ndGgmJihlLmNvbXByZXNzZWQmJih0PXBwLmluZmxhdGVSYXcodCksZGVsZXRlIGUuY29tcHJlc3NlZCksZS5kYXRhPW5ldyBVaW50OENsYW1wZWRBcnJheSh0KSksZmkobixlKX0pfSk6Zmkobix7ZXJyTXNnOiJjYW52YXNHZXRJbWFnZURhdGE6ZmFpbCJ9KX0sY2FudmFzUHV0SW1hZ2VEYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jYW52YXNJZCxyPWUuZGF0YSxpPWUueCxvPWUueSxhPWUud2lkdGgscz1lLmhlaWdodCxjPXhsKCk7aWYoYyl7dmFyIHUsbD1ocC5wdXNoKGZ1bmN0aW9uKGUpe2ZpKHQsZSl9KTsiaU9TIiE9PW9nLm9zLm5hbWV8fCJib29sZWFuIj09dHlwZW9mIF9fV0VFWF9ERVZUT09MX18/KHI9cHAuZGVmbGF0ZVJhdyhyLHt0bzoic3RyaW5nIn0pLHU9ITApOnI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwociksdnAobixjLCJwdXRJbWFnZURhdGEiLHtkYXRhOnIseDppLHk6byx3aWR0aDphLGhlaWdodDpzLGNvbXByZXNzZWQ6dSxjYWxsYmFja0lkOmx9KX1lbHNlIGZpKHQse2Vyck1zZzoiY2FudmFzUHV0SW1hZ2VEYXRhOmZhaWwifSl9LGNhbnZhc1RvVGVtcEZpbGVQYXRoOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS54O3ZvaWQgMD09PW4mJihuPTApO3ZhciByPWUueTt2b2lkIDA9PT1yJiYocj0wKTt2YXIgaT1lLndpZHRoLG89ZS5oZWlnaHQsYT1lLmRlc3RXaWR0aCxzPWUuZGVzdEhlaWdodCxjPWUuY2FudmFzSWQsdT1lLmZpbGVUeXBlLGw9ZS5xdWFsaXR5LGQ9eGwoKTtpZihkKXt2YXIgZj1ocC5wdXNoKGZ1bmN0aW9uKGUpe2ZpKHQsZSl9KTt2cChjLGQsInRvVGVtcEZpbGVQYXRoIix7eDpuLHk6cix3aWR0aDppLGhlaWdodDpvLGRlc3RXaWR0aDphLGRlc3RIZWlnaHQ6cyxmaWxlVHlwZTp1LHF1YWxpdHk6bCxkaXJuYW1lOnlvKyIvY2FudmFzIixjYWxsYmFja0lkOmZ9KX1lbHNlIGZpKHQse2Vyck1zZzoiY2FudmFzVG9UZW1wRmlsZVBhdGg6ZmFpbCJ9KX19KTtmdW5jdGlvbiB4cChlLHQsbixyKXt3bCgib3BlcmF0ZU1hcFBsYXllciIsZSx0LG4scil9YWcuc3Vic2NyaWJlKCJvbk1hcE1ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7TS5pbnZva2UodCxuKX0pO3ZhciBDcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VWbT10fTtDcC5wcm90b3R5cGUub249ZnVuY3Rpb24oZSx0KXt4cCh0aGlzLmlkLHRoaXMucGFnZVZtLCJvbiIse25hbWU6ZSxjYWxsYmFjazp0fSl9LENwLnByb3RvdHlwZS4kZ2V0QXBwTWFwPWZ1bmN0aW9uKCl7cmV0dXJuIG9nLm1hcHMuZ2V0TWFwQnlJZCh0aGlzLnBhZ2VWbS4kcGFnZS5pZCsiLW1hcC0iK3RoaXMuaWQpfSxbImdldENlbnRlckxvY2F0aW9uIiwibW92ZVRvTG9jYXRpb24iLCJnZXRTY2FsZSIsImdldFJlZ2lvbiIsImluY2x1ZGVQb2ludHMiLCJ0cmFuc2xhdGVNYXJrZXIiLCJhZGRDdXN0b21MYXllciIsInJlbW92ZUN1c3RvbUxheWVyIiwiYWRkR3JvdW5kT3ZlcmxheSIsInJlbW92ZUdyb3VuZE92ZXJsYXkiLCJ1cGRhdGVHcm91bmRPdmVybGF5IiwiaW5pdE1hcmtlckNsdXN0ZXIiLCJhZGRNYXJrZXJzIiwicmVtb3ZlTWFya2VycyIsIm1vdmVBbG9uZyIsInNldExvY01hcmtlckljb24iLCJvcGVuTWFwQXBwIl0uZm9yRWFjaChmdW5jdGlvbihuKXtDcC5wcm90b3R5cGVbbl09TS53YXJwKGZ1bmN0aW9uKGUsdCl7ZS5jYWxsYmFja0lkPXQseHAodGhpcy5pZCx0aGlzLnBhZ2VWbSxuLGUpfSl9KTt2YXIgVHA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsTWFwQ29udGV4dDpDcCxjcmVhdGVNYXBDb250ZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBDcChlLHR8fFNsKCJjcmVhdGVNYXBDb250ZXh0IikpfX0pLE9wPVsuNSwuOCwxLDEuMjUsMS41LDJdO2Z1bmN0aW9uIEVwKGUsdCxuLHIpe3dsKCJvcGVyYXRlVmlkZW9QbGF5ZXIiLGUsdCxuLHIpfXZhciBJcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VWbT10fTtJcC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe0VwKHRoaXMuaWQsdGhpcy5wYWdlVm0sInBsYXkiKX0sSXAucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7RXAodGhpcy5pZCx0aGlzLnBhZ2VWbSwicGF1c2UiKX0sSXAucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXtFcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJzdG9wIil9LElwLnByb3RvdHlwZS5zZWVrPWZ1bmN0aW9uKGUpe0VwKHRoaXMuaWQsdGhpcy5wYWdlVm0sInNlZWsiLHtwb3NpdGlvbjplfSl9LElwLnByb3RvdHlwZS5zZW5kRGFubXU9ZnVuY3Rpb24oZSl7RXAodGhpcy5pZCx0aGlzLnBhZ2VWbSwic2VuZERhbm11IixlKX0sSXAucHJvdG90eXBlLnBsYXliYWNrUmF0ZT1mdW5jdGlvbihlKXt+T3AuaW5kZXhPZihlKXx8KGU9MSksRXAodGhpcy5pZCx0aGlzLnBhZ2VWbSwicGxheWJhY2tSYXRlIix7cmF0ZTplfSl9LElwLnByb3RvdHlwZS5yZXF1ZXN0RnVsbFNjcmVlbj1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSksRXAodGhpcy5pZCx0aGlzLnBhZ2VWbSwicmVxdWVzdEZ1bGxTY3JlZW4iLGUpfSxJcC5wcm90b3R5cGUuZXhpdEZ1bGxTY3JlZW49ZnVuY3Rpb24oKXtFcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJleGl0RnVsbFNjcmVlbiIpfSxJcC5wcm90b3R5cGUuc2hvd1N0YXR1c0Jhcj1mdW5jdGlvbigpe0VwKHRoaXMuaWQsdGhpcy5wYWdlVm0sInNob3dTdGF0dXNCYXIiKX0sSXAucHJvdG90eXBlLmhpZGVTdGF0dXNCYXI9ZnVuY3Rpb24oKXtFcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJoaWRlU3RhdHVzQmFyIil9O3ZhciBBcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxWaWRlb0NvbnRleHQ6SXAsY3JlYXRlVmlkZW9Db250ZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBJcChlLHR8fFNsKCJjcmVhdGVWaWRlb0NvbnRleHQiKSl9fSk7ZnVuY3Rpb24gJHAoZSx0LG4scil7YWcucHVibGlzaEhhbmRsZXIodCsiLWVkaXRvci0iK2Use2NvbXBvbmVudElkOmUsdHlwZTpuLGRhdGE6cn0sdCl9YWcuc3Vic2NyaWJlKCJvbkVkaXRvck1ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7TS5pbnZva2UodCxuKX0pO3ZhciBQcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VJZD10fTtQcC5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKGUsdCl7JHAodGhpcy5pZCx0aGlzLnBhZ2VJZCwiZm9ybWF0Iix7b3B0aW9uczp7bmFtZTplLHZhbHVlOnR9fSl9LFsiaW5zZXJ0RGl2aWRlciIsImluc2VydEltYWdlIiwiaW5zZXJ0VGV4dCIsInNldENvbnRlbnRzIiwiZ2V0Q29udGVudHMiLCJjbGVhciIsInJlbW92ZUZvcm1hdCIsInVuZG8iLCJyZWRvIiwiYmx1ciIsImdldFNlbGVjdGlvblRleHQiLCJzY3JvbGxJbnRvVmlldyJdLmZvckVhY2goZnVuY3Rpb24obil7UHAucHJvdG90eXBlW25dPU0ud2FycChmdW5jdGlvbihlLHQpeyRwKHRoaXMuaWQsdGhpcy5wYWdlSWQsbix7b3B0aW9uczplLGNhbGxiYWNrSWQ6dH0pfSl9KTt2YXIgTXA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsRWRpdG9yQ29udGV4dDpQcH0pLGpwPVsiY2FucGxheSIsInBsYXkiLCJwYXVzZSIsInN0b3AiLCJlbmRlZCIsInRpbWVVcGRhdGUiLCJlcnJvciIsIndhaXRpbmciLCJzZWVraW5nIiwic2Vla2VkIl0sTHA9W3tuYW1lOiJzcmMiLGNhY2hlOiEwfSx7bmFtZToic3RhcnRUaW1lIixkZWZhdWx0OjAsY2FjaGU6ITB9LHtuYW1lOiJhdXRvcGxheSIsZGVmYXVsdDohMSxjYWNoZTohMH0se25hbWU6Imxvb3AiLGRlZmF1bHQ6ITEsY2FjaGU6ITB9LHtuYW1lOiJvYmV5TXV0ZVN3aXRjaCIsZGVmYXVsdDohMCxyZWFkb25seTohMCxjYWNoZTohMH0se25hbWU6ImR1cmF0aW9uIixyZWFkb25seTohMH0se25hbWU6ImN1cnJlbnRUaW1lIixyZWFkb25seTohMH0se25hbWU6InBhdXNlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJidWZmZXJlZCIscmVhZG9ubHk6ITB9LHtuYW1lOiJ2b2x1bWUifSx7bmFtZToic2Vzc2lvbkNhdGVnb3J5In0se25hbWU6InBsYXliYWNrUmF0ZSIsY2FjaGU6ITB9XSxCcD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuaWQ9ZSx0aGlzLl9jYWxsYmFja3M9e30sdGhpcy5fb3B0aW9ucz17fSxqcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuX2NhbGxiYWNrc1tlLnRvTG93ZXJDYXNlKCldPVtdfSksTHAuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgcj1uLm5hbWUsZT17Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9bi5jYWNoZT90aGlzLl9vcHRpb25zOndsKCJnZXRBdWRpb1N0YXRlIix7YXVkaW9JZDp0aGlzLmlkfSksdD1yIGluIGU/ZVtyXTpuLmRlZmF1bHQ7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiYidm9sdW1lIiE9PXI/dC8xZTM6dH19O24ucmVhZG9ubHl8fChlLnNldD1mdW5jdGlvbihlKXt0aGlzLl9vcHRpb25zW3JdPWUsd2woInNldEF1ZGlvU3RhdGUiLE9iamVjdC5hc3NpZ24oe30sdGhpcy5fb3B0aW9ucyx7YXVkaW9JZDp0aGlzLmlkfSkpfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQscixlKX0pfTtmdW5jdGlvbiBOcChlLHQsbixyKXtlLl9jYWxsYmFja3NbdF0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSgiZXJyb3IiPT09dD97ZXJyTXNnOm4sZXJyQ29kZTpyfTp7fSl9KX1CcC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInBsYXkiKX0sQnAucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgicGF1c2UiKX0sQnAucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJzdG9wIil9LEJwLnByb3RvdHlwZS5zZWVrPWZ1bmN0aW9uKGUpe3RoaXMuX29wZXJhdGUoInNlZWsiLHtjdXJyZW50VGltZToxZTMqZX0pfSxCcC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2xnKHRoaXMuX190aW1pbmcpLHdsKCJkZXN0cm95QXVkaW9JbnN0YW5jZSIse2F1ZGlvSWQ6dGhpcy5pZH0pLGRlbGV0ZSBEcFt0aGlzLmlkXX0sQnAucHJvdG90eXBlLl9vcGVyYXRlPWZ1bmN0aW9uKGUsdCl7d2woIm9wZXJhdGVBdWRpbyIsT2JqZWN0LmFzc2lnbih7fSx0LHthdWRpb0lkOnRoaXMuaWQsb3BlcmF0aW9uVHlwZTplfSkpfSxqcC5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBlPXJbMF0udG9VcHBlckNhc2UoKStyLnN1YnN0cigxKTtyPXIudG9Mb3dlckNhc2UoKSxCcC5wcm90b3R5cGVbIm9uIitlXT1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3Nbcl0ucHVzaChlKX0sQnAucHJvdG90eXBlWyJvZmYiK2VdPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrc1tyXSxuPXQuaW5kZXhPZihlKTswPD1uJiZ0LnNwbGljZShuLDEpfX0pLGtsKCJvbkF1ZGlvU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhdGUsbj1lLmF1ZGlvSWQscj1lLmVyck1zZyxpPWUuZXJyQ29kZSxvPURwW25dO2lmKG8paWYoTnAobyx0LHIsaSksInBsYXkiPT09dCl7dmFyIGE9by5jdXJyZW50VGltZTtOcChvLCJ0aW1ldXBkYXRlIiksby5fX3RpbWluZz11ZyhmdW5jdGlvbigpe28uY3VycmVudFRpbWUhPT1hJiZOcChvLCJ0aW1ldXBkYXRlIil9LDIwMCl9ZWxzZSJwYXVzZSIhPT10JiYic3RvcCIhPT10JiYiZXJyb3IiIT09dHx8bGcoby5fX3RpbWluZyl9KTt2YXIgRHA9T2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgUnA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQ6ZnVuY3Rpb24oKXt2YXIgZT13bCgiY3JlYXRlQXVkaW9JbnN0YW5jZSIpLmF1ZGlvSWQsdD1uZXcgQnAoZSk7cmV0dXJuIERwW2VdPXR9fSksRnA9W107a2woIm9uTmV0d29ya1N0YXR1c0NoYW5nZSIsZnVuY3Rpb24odCl7RnAuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHQpfSl9KTt2YXIgVXA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb25OZXR3b3JrU3RhdHVzQ2hhbmdlOmZ1bmN0aW9uKGUpe0ZwLnB1c2goZSl9LG9mZk5ldHdvcmtTdGF0dXNDaGFuZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9RnAuaW5kZXhPZihlKTswPD10JiZGcC5zcGxpY2UodCwxKX19fSksenA9W10sVnA9W107a2wobnQsZnVuY3Rpb24odCl7enAuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHQpfSl9KSxrbCgib25VSVN0eWxlQ2hhbmdlIixmdW5jdGlvbih0KXtWcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUsdCl9KX0pO3ZhciBxcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvblRoZW1lQ2hhbmdlOmZ1bmN0aW9uKGUpe3pwLnB1c2goZSl9LG9mZlRoZW1lQ2hhbmdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PXpwLmluZGV4T2YoZSk7MDw9dCYmenAuc3BsaWNlKHQsMSl9fSxvblVJU3R5bGVDaGFuZ2U6ZnVuY3Rpb24oZSl7VnAucHVzaChlKSxjb25zb2xlLndhcm4oJ1RoZSAidW5pLm9uVUlTdHlsZUNoYW5nZSIgQVBJIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgInVuaS5vblRoZW1lQ2hhbmdlIi4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLm5ldC5jbi9hcGkvc3lzdGVtL3RoZW1lLicpfX0pLFdwPVl1KCJnZXRTZWxlY3RlZFRleHRSYW5nZUV2ZW50Iik7YWcuc3Vic2NyaWJlKCJvbkdldFNlbGVjdGVkVGV4dFJhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7Y29uc29sZS5sb2coIm9uR2V0U2VsZWN0ZWRUZXh0UmFuZ2UiKTt2YXIgcj1XcC5wb3AodCk7ciYmcihuKX0pO3ZhciBIcCxHcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRTZWxlY3RlZFRleHRSYW5nZTpmdW5jdGlvbihlLHQpe3ZhciBuPXhsKCk7YWcucHVibGlzaEhhbmRsZXIoImdldFNlbGVjdGVkVGV4dFJhbmdlIix7cGFnZUlkOm4sY2FsbGJhY2tJZDpXcC5wdXNoKGZ1bmN0aW9uKGUpe2ZpKHQsZSl9KX0sbil9fSk7a2woIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe0hwJiZmaShIcCxlKX0pO3ZhciBYcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvbktleWJvYXJkSGVpZ2h0Q2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0O3Q9SHAsYWcucmVtb3ZlQ2FsbGJhY2tIYW5kbGVyKHQpLEhwPWV9LG9mZktleWJvYXJkSGVpZ2h0Q2hhbmdlOmZ1bmN0aW9uKCl7SHA9bnVsbH19KSxKcD0ibG9uZ1ByZXNzQWN0aW9uc0NhbGxiYWNrIixZcD17fTtrbChKcCxmdW5jdGlvbihlKXt2YXIgdD1lLmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KHQpP1lwLmZhaWwmJllwLmZhaWwoZSk6WXAuc3VjY2VzcyYmWXAuc3VjY2VzcyhlKSxZcC5jb21wbGV0ZSYmWXAuY29tcGxldGUoZSl9KTt2YXIgS3AsWnA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscHJldmlld0ltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksKChZcD1lLmxvbmdQcmVzc0FjdGlvbnN8fHt9KS5zdWNjZXNzfHxZcC5mYWlsfHxZcC5jb21wbGV0ZSkmJihZcC5jYWxsYmFja0lkPUpwKSx3bCgicHJldmlld0ltYWdlUGx1cyIsZSl9LGNsb3NlUHJldmlld0ltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksd2woImNsb3NlUHJldmlld0ltYWdlUGx1cyIsZSl9fSksUXA9e3BhdXNlOm51bGwscmVzdW1lOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsZXJyb3I6bnVsbH0sZWg9ZnVuY3Rpb24oKXtrbCgib25SZWNvcmRlclN0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXRlO2RlbGV0ZSBlLnN0YXRlLGRlbGV0ZSBlLmVyck1zZywiZnVuY3Rpb24iPT10eXBlb2YgUXBbdF0mJlFwW3RdKGUpfSl9O2VoLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKGUpe1FwLmVycm9yPWV9LGVoLnByb3RvdHlwZS5vbkZyYW1lUmVjb3JkZWQ9ZnVuY3Rpb24oZSl7fSxlaC5wcm90b3R5cGUub25JbnRlcnJ1cHRpb25CZWdpbj1mdW5jdGlvbihlKXt9LGVoLnByb3RvdHlwZS5vbkludGVycnVwdGlvbkVuZD1mdW5jdGlvbihlKXt9LGVoLnByb3RvdHlwZS5vblBhdXNlPWZ1bmN0aW9uKGUpe1FwLnBhdXNlPWV9LGVoLnByb3RvdHlwZS5vblJlc3VtZT1mdW5jdGlvbihlKXtRcC5yZXN1bWU9ZX0sZWgucHJvdG90eXBlLm9uU3RhcnQ9ZnVuY3Rpb24oZSl7UXAuc3RhcnQ9ZX0sZWgucHJvdG90eXBlLm9uU3RvcD1mdW5jdGlvbihlKXtRcC5zdG9wPWV9LGVoLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3dsKCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJwYXVzZSJ9KX0sZWgucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3dsKCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJyZXN1bWUifSl9LGVoLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlKXt3bCgib3BlcmF0ZVJlY29yZGVyIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6InN0YXJ0In0pKX0sZWgucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXt3bCgib3BlcmF0ZVJlY29yZGVyIix7b3BlcmF0aW9uVHlwZToic3RvcCJ9KX07dmFyIHRoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFJlY29yZGVyTWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBLcHx8KEtwPW5ldyBlaCl9fSksbmg9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tJZD10LHRoaXMuX2NhbGxiYWNrcz1bXX07bmgucHJvdG90eXBlLmFib3J0PWZ1bmN0aW9uKCl7d2woIm9wZXJhdGVEb3dubG9hZFRhc2siLHtkb3dubG9hZFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxuaC5wcm90b3R5cGUub25Qcm9ncmVzc1VwZGF0ZT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmdGhpcy5fY2FsbGJhY2tzLnB1c2goZSl9LG5oLnByb3RvdHlwZS5vbkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe30sbmgucHJvdG90eXBlLm9mZlByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKGUpOzA8PXQmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UodCwxKX0sbmgucHJvdG90eXBlLm9mZkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe307dmFyIHJoPU9iamVjdC5jcmVhdGUobnVsbCk7a2woIm9uRG93bmxvYWRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuZG93bmxvYWRUYXNrSWQsbj1lLnN0YXRlLHI9ZS50ZW1wRmlsZVBhdGgsaT1lLnN0YXR1c0NvZGUsbz1lLnByb2dyZXNzLGE9ZS50b3RhbEJ5dGVzV3JpdHRlbixzPWUudG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZSxjPWUuZXJyTXNnLHU9cmhbdF0sbD11Ll9jYWxsYmFja0lkO3N3aXRjaChuKXtjYXNlInByb2dyZXNzVXBkYXRlIjp1Ll9jYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihlKXtlKHtwcm9ncmVzczpvLHRvdGFsQnl0ZXNXcml0dGVuOmEsdG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZTpzfSl9KTticmVhaztjYXNlInN1Y2Nlc3MiOmZpKGwse3RlbXBGaWxlUGF0aDpyLHN0YXR1c0NvZGU6aSxlcnJNc2c6InJlcXVlc3Q6b2sifSk7Y2FzZSJmYWlsIjpmaShsLHtlcnJNc2c6InJlcXVlc3Q6ZmFpbCAiK2N9KTtkZWZhdWx0OnNnKGZ1bmN0aW9uKCl7ZGVsZXRlIHJoW3RdfSwxMDApfX0pO3ZhciBpaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkb3dubG9hZEZpbGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj13bCgiY3JlYXRlRG93bmxvYWRUYXNrIixlKS5kb3dubG9hZFRhc2tJZCxyPW5ldyBuaChuLHQpO3JldHVybiByaFtuXT1yfX0pLG9oPU9iamVjdC5jcmVhdGUobnVsbCk7a2woIm9uUmVxdWVzdFRhc2tTdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0VGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuc3RhdHVzQ29kZSxvPWUuaGVhZGVyLGE9ZS5lcnJNc2cscz1lLmNvb2tpZXMsYz1vaFt0XXx8e30sdT1jLmFyZ3MsbD1jLmNhbGxiYWNrSWQ7aWYobClzd2l0Y2goZGVsZXRlIG9oW3RdLG4pe2Nhc2Uic3VjY2VzcyI6ZmkobCxmdW5jdGlvbihyLGUpe2lmKCJzdHJpbmciPT10eXBlb2Ygci5kYXRhJiY2NTI3OT09PXIuZGF0YS5jaGFyQ29kZUF0KDApJiYoci5kYXRhPXIuZGF0YS5zdWJzdHIoMSkpLHIuc3RhdHVzQ29kZT1wYXJzZUludChyLnN0YXR1c0NvZGUsMTApLFQoci5oZWFkZXIpJiYoci5oZWFkZXI9T2JqZWN0LmtleXMoci5oZWFkZXIpLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXIuaGVhZGVyW3RdO3JldHVybiBBcnJheS5pc0FycmF5KG4pP2VbdF09bi5qb2luKCIsIik6InN0cmluZyI9PXR5cGVvZiBuJiYoZVt0XT1uKSxlfSx7fSkpLGUuZGF0YVR5cGUmJiJqc29uIj09PWUuZGF0YVR5cGUudG9Mb3dlckNhc2UoKSl0cnl7ci5kYXRhPUpTT04ucGFyc2Uoci5kYXRhKX1jYXRjaChlKXt9cmV0dXJuIHJ9KHtkYXRhOnIsc3RhdHVzQ29kZTppLGhlYWRlcjpvLGVyck1zZzoicmVxdWVzdDpvayIsY29va2llczpzfSx1KSk7YnJlYWs7Y2FzZSJmYWlsIjpmaShsLHtlcnJNc2c6InJlcXVlc3Q6ZmFpbCAiK2F9KX19KTt2YXIgYWg9ZnVuY3Rpb24oZSl7dGhpcy5pZD1lfTthaC5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24oKXt3bCgib3BlcmF0ZVJlcXVlc3RUYXNrIix7cmVxdWVzdFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxhaC5wcm90b3R5cGUub2ZmSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fSxhaC5wcm90b3R5cGUub25IZWFkZXJzUmVjZWl2ZWQ9ZnVuY3Rpb24oKXt9O3ZhciBzaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyZXF1ZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKHZhciByIGluIGUuaGVhZGVyKWlmKCJjb250ZW50LXR5cGUiPT09ci50b0xvd2VyQ2FzZSgpKXtuPWUuaGVhZGVyW3JdO2JyZWFrfSJHRVQiIT09ZS5tZXRob2QmJjA9PT1uLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKSYmVChlLmRhdGEpJiYoZS5kYXRhPUpTT04uc3RyaW5naWZ5KGUuZGF0YSkpO3ZhciBpPXdsKCJjcmVhdGVSZXF1ZXN0VGFzayIsZSkucmVxdWVzdFRhc2tJZDtyZXR1cm4gb2hbaV09e2FyZ3M6ZSxjYWxsYmFja0lkOnR9LG5ldyBhaChpKX19KSxjaD1mdW5jdGlvbihlKXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tzPXtvcGVuOltdLGNsb3NlOltdLGVycm9yOltdLG1lc3NhZ2U6W119LHRoaXMuQ0xPU0VEPTMsdGhpcy5DTE9TSU5HPTIsdGhpcy5DT05ORUNUSU5HPTAsdGhpcy5PUEVOPTEsdGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0VEfTtjaC5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLnJlYWR5U3RhdGUhPT10aGlzLk9QRU4mJnRoaXMuX2NhbGxiYWNrKGUsInNlbmRTb2NrZXRNZXNzYWdlOmZhaWwgV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTt2YXIgdD13bCgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToic2VuZCIsc29ja2V0VGFza0lkOnRoaXMuaWR9KSkuZXJyTXNnO3RoaXMuX2NhbGxiYWNrKGUsdC5yZXBsYWNlKCJvcGVyYXRlU29ja2V0VGFzayIsInNlbmRTb2NrZXRNZXNzYWdlIikpfSxjaC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oZSl7dGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0lORzt2YXIgdD13bCgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToiY2xvc2UiLHNvY2tldFRhc2tJZDp0aGlzLmlkfSkpLmVyck1zZzt0aGlzLl9jYWxsYmFjayhlLHQucmVwbGFjZSgib3BlcmF0ZVNvY2tldFRhc2siLCJjbG9zZVNvY2tldCIpKX0sY2gucHJvdG90eXBlLm9uT3Blbj1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3Mub3Blbi5wdXNoKGUpfSxjaC5wcm90b3R5cGUub25DbG9zZT1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3MuY2xvc2UucHVzaChlKX0sY2gucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzLmVycm9yLnB1c2goZSl9LGNoLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzLm1lc3NhZ2UucHVzaChlKX0sY2gucHJvdG90eXBlLl9jYWxsYmFjaz1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLnN1Y2Nlc3Mscj1lLmZhaWwsaT1lLmNvbXBsZXRlLG89e2Vyck1zZzp0fTsvOm9rJC8udGVzdCh0KT8iZnVuY3Rpb24iPT10eXBlb2YgbiYmbihvKToiZnVuY3Rpb24iPT10eXBlb2YgciYmcihvKSwiZnVuY3Rpb24iPT10eXBlb2YgaSYmaShvKX07dmFyIHVoPU9iamVjdC5jcmVhdGUobnVsbCksbGg9W10sZGg9T2JqZWN0LmNyZWF0ZShudWxsKTtrbCgib25Tb2NrZXRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc29ja2V0VGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuY29kZSxvPWUucmVhc29uLGE9KGUuZXJyTXNnLHVoW3RdKTtpZihhKXt2YXIgcz0ibWVzc2FnZSI9PT1uP3tkYXRhOnJ9OiJjbG9zZSI9PT1uP3tjb2RlOmkscmVhc29uOm99Ont9O2lmKCJvcGVuIj09PW4mJihhLnJlYWR5U3RhdGU9YS5PUEVOKSxhPT09bGhbMF0mJmRoW25dJiZmaShkaFtuXSxzKSwiZXJyb3IiPT09bnx8ImNsb3NlIj09PW4pe2EucmVhZHlTdGF0ZT1hLkNMT1NFRCxkZWxldGUgdWhbdF07dmFyIGM9bGguaW5kZXhPZihhKTswPD1jJiZsaC5zcGxpY2UoYywxKX1hLl9jYWxsYmFja3Nbbl0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZShzKX0pfX0pO3ZhciBmaCxwaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjb25uZWN0U29ja2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49d2woImNyZWF0ZVNvY2tldFRhc2siLGUpLnNvY2tldFRhc2tJZCxyPW5ldyBjaChuKTtyZXR1cm4gdWhbbl09cixsaC5wdXNoKHIpLHNnKGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJjb25uZWN0U29ja2V0Om9rIn0pfSwwKSxyfSxzZW5kU29ja2V0TWVzc2FnZTpmdW5jdGlvbihlLHQpe3ZhciBuPWxoWzBdO2lmKG4mJm4ucmVhZHlTdGF0ZT09PW4uT1BFTilyZXR1cm4gd2woIm9wZXJhdGVTb2NrZXRUYXNrIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6InNlbmQiLHNvY2tldFRhc2tJZDpuLmlkfSkpO2ZpKHQse2Vyck1zZzoic2VuZFNvY2tldE1lc3NhZ2U6ZmFpbCBXZWJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCJ9KX0sY2xvc2VTb2NrZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1saFswXTtpZihuKXJldHVybiBuLnJlYWR5U3RhdGU9bi5DTE9TSU5HLHdsKCJvcGVyYXRlU29ja2V0VGFzayIsT2JqZWN0LmFzc2lnbih7fSxlLHtvcGVyYXRpb25UeXBlOiJjbG9zZSIsc29ja2V0VGFza0lkOm4uaWR9KSk7ZmkodCx7ZXJyTXNnOiJjbG9zZVNvY2tldDpmYWlsIFdlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIn0pfSxvblNvY2tldE9wZW46ZnVuY3Rpb24oZSl7ZGgub3Blbj1lfSxvblNvY2tldEVycm9yOmZ1bmN0aW9uKGUpe2RoLmVycm9yPWV9LG9uU29ja2V0TWVzc2FnZTpmdW5jdGlvbihlKXtkaC5tZXNzYWdlPWV9LG9uU29ja2V0Q2xvc2U6ZnVuY3Rpb24oZSl7ZGguY2xvc2U9ZX19KSxoaD1mdW5jdGlvbigpe307aGgucHJvdG90eXBlLm9uQ2hlY2tGb3JVcGRhdGU9ZnVuY3Rpb24oKXt9LGhoLnByb3RvdHlwZS5vblVwZGF0ZVJlYWR5PWZ1bmN0aW9uKCl7fSxoaC5wcm90b3R5cGUub25VcGRhdGVGYWlsZWQ9ZnVuY3Rpb24oKXt9LGhoLnByb3RvdHlwZS5hcHBseVVwZGF0ZT1mdW5jdGlvbigpe307dmFyIHZoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFVwZGF0ZU1hbmFnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gZmh8fChmaD1uZXcgaGgpfX0pLGdoPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuX2NhbGxiYWNrSWQ9dCx0aGlzLl9jYWxsYmFja3M9W119O2doLnByb3RvdHlwZS5hYm9ydD1mdW5jdGlvbigpe3dsKCJvcGVyYXRlVXBsb2FkVGFzayIse3VwbG9hZFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxnaC5wcm90b3R5cGUub25Qcm9ncmVzc1VwZGF0ZT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmdGhpcy5fY2FsbGJhY2tzLnB1c2goZSl9LGdoLnByb3RvdHlwZS5vbkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe30sZ2gucHJvdG90eXBlLm9mZlByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKGUpOzA8PXQmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UodCwxKX0sZ2gucHJvdG90eXBlLm9mZkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe307dmFyIG1oPU9iamVjdC5jcmVhdGUobnVsbCk7a2woIm9uVXBsb2FkVGFza1N0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnVwbG9hZFRhc2tJZCxuPWUuc3RhdGUscj1lLmRhdGEsaT1lLnN0YXR1c0NvZGUsbz1lLnByb2dyZXNzLGE9ZS50b3RhbEJ5dGVzU2VudCxzPWUudG90YWxCeXRlc0V4cGVjdGVkVG9TZW5kLGM9ZS5lcnJNc2csdT1taFt0XSxsPXUuX2NhbGxiYWNrSWQ7c3dpdGNoKG4pe2Nhc2UicHJvZ3Jlc3NVcGRhdGUiOnUuX2NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uoe3Byb2dyZXNzOm8sdG90YWxCeXRlc1NlbnQ6YSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1NlbmQ6c30pfSk7YnJlYWs7Y2FzZSJzdWNjZXNzIjpmaShsLHtkYXRhOnIsc3RhdHVzQ29kZTppLGVyck1zZzoicmVxdWVzdDpvayJ9KTtjYXNlImZhaWwiOmZpKGwse2Vyck1zZzoicmVxdWVzdDpmYWlsICIrY30pO2RlZmF1bHQ6c2coZnVuY3Rpb24oKXtkZWxldGUgbWhbdF19LDEwMCl9fSk7dmFyIHloLF9oLGJoLHdoLGtoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVwbG9hZEZpbGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj13bCgiY3JlYXRlVXBsb2FkVGFzayIsZSkudXBsb2FkVGFza0lkLHI9bmV3IGdoKG4sdCk7cmV0dXJuIG1oW25dPXJ9fSk7ZnVuY3Rpb24gU2goZSl7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKGUpe31yZXR1cm4gZX1mdW5jdGlvbiB4aCh0KXtpZigiZW5hYmxlZCI9PT10LnR5cGUpYmg9ITAsd2g9dC5vZmZsaW5lO2Vsc2UgaWYoImNsaWVudElkIj09PXQudHlwZSl5aD10LmNpZCxfaD10LmVyck1zZyxUaCh5aCx0LmVyck1zZyk7ZWxzZSBpZigicHVzaE1zZyI9PT10LnR5cGUpZm9yKHZhciBlPXt0eXBlOiJyZWNlaXZlIixkYXRhOlNoKHQubWVzc2FnZSl9LG49MDtuPE9oLmxlbmd0aDtuKyspe2lmKCgwLE9oW25dKShlKSxlLnN0b3BwZWQpYnJlYWt9ZWxzZSJjbGljayI9PT10LnR5cGUmJk9oLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh7dHlwZToiY2xpY2siLGRhdGE6U2godC5tZXNzYWdlKX0pfSl9dmFyIENoPVtdO2Z1bmN0aW9uIFRoKHQsbil7Q2guZm9yRWFjaChmdW5jdGlvbihlKXtlKHQsbil9KSxDaC5sZW5ndGg9MH12YXIgT2g9W10sRWg9ITEsSWg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsaW52b2tlUHVzaENhbGxiYWNrOnhoLGdldFB1c2hDbGllbnRJZDpmdW5jdGlvbihlKXtUKGUpfHwoZT17fSk7dmFyIHQ9YWUoZSkscj10LnN1Y2Nlc3MsaT10LmZhaWwsbz10LmNvbXBsZXRlLGE9QyhyKSxzPUMoaSksYz1DKG8pO3doP29nLnB1c2guZ2V0Q2xpZW50SW5mb0FzeW5jKGZ1bmN0aW9uKGUpe3ZhciB0PXtlcnJNc2c6ImdldFB1c2hDbGllbnRJZDpvayIsY2lkOmUuY2xpZW50aWR9O2EmJnIodCksYyYmbyh0KX0sZnVuY3Rpb24oZSl7ZT17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6ZmFpbCAiK2UuY29kZSsiOiAiK2UubWVzc2FnZX0scyYmaShlKSxjJiZvKGUpfSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3ZvaWQgMD09PWJoJiYoYmg9ITEseWg9IiIsX2g9InVuaVB1c2ggaXMgbm90IGVuYWJsZWQiKSxDaC5wdXNoKGZ1bmN0aW9uKGUsdCl7dmFyIG47ZT8obj17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6b2siLGNpZDplfSxhJiZyKG4pKToobj17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6ZmFpbCIrKHQ/IiAiK3Q6IiIpfSxzJiZpKG4pKSxjJiZvKG4pfSksdm9pZCAwIT09eWgmJlRoKHloLF9oKX0pfSxvblB1c2hNZXNzYWdlOmZ1bmN0aW9uKGUpey0xPT09T2guaW5kZXhPZihlKSYmT2gucHVzaChlKSxFaHx8KEVoPSEwLG9nLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGUpe3hoKHt0eXBlOiJjbGljayIsbWVzc2FnZTplfSl9KSxvZy5wdXNoLmFkZEV2ZW50TGlzdGVuZXIoInJlY2VpdmUiLGZ1bmN0aW9uKGUpe3hoKHt0eXBlOiJwdXNoTXNnIixtZXNzYWdlOmV9KX0pKX0sb2ZmUHVzaE1lc3NhZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9T2guaW5kZXhPZihlKTstMTx0JiZPaC5zcGxpY2UodCwxKX1lbHNlIE9oLmxlbmd0aD0wfX0pLEFoPXtkdXJhdGlvbjo0MDAsdGltaW5nRnVuY3Rpb246ImxpbmVhciIsZGVsYXk6MCx0cmFuc2Zvcm1PcmlnaW46IjUwJSA1MCUgMCJ9LCRoPWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09e30sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMub3B0aW9uPU9iamVjdC5hc3NpZ24oe30sQWgsZSl9OyRoLnByb3RvdHlwZS5fZ2V0T3B0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXt0cmFuc2l0aW9uOk9iamVjdC5hc3NpZ24oe30sdGhpcy5vcHRpb24sZSl9O3JldHVybiB0LnRyYW5zZm9ybU9yaWdpbj10LnRyYW5zaXRpb24udHJhbnNmb3JtT3JpZ2luLGRlbGV0ZSB0LnRyYW5zaXRpb24udHJhbnNmb3JtT3JpZ2luLHR9LCRoLnByb3RvdHlwZS5fcHVzaEFuaW1hdGVzPWZ1bmN0aW9uKGUsdCl7dGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzLnB1c2goe3R5cGU6ZSxhcmdzOnR9KX0sJGgucHJvdG90eXBlLl9jb252ZXJUeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1tBLVpdL2csZnVuY3Rpb24oZSl7cmV0dXJuIi0iK2UudG9Mb3dlckNhc2UoKX0pfSwkaC5wcm90b3R5cGUuX2dldFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9lKyJweCI6ZX0sJGgucHJvdG90eXBlLmV4cG9ydD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYWN0aW9ucztyZXR1cm4gdGhpcy5hY3Rpb25zPVtdLHthY3Rpb25zOmV9fSwkaC5wcm90b3R5cGUuc3RlcD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXMuZm9yRWFjaChmdW5jdGlvbihlKXsic3R5bGUiIT09ZS50eXBlP3QuY3VycmVudFRyYW5zZm9ybVtlLnR5cGVdPWU6dC5jdXJyZW50VHJhbnNmb3JtW2UudHlwZSsiLiIrZS5hcmdzWzBdXT1lfSksdGhpcy5hY3Rpb25zLnB1c2goe2FuaW1hdGVzOk9iamVjdC52YWx1ZXModGhpcy5jdXJyZW50VHJhbnNmb3JtKSxvcHRpb246dGhpcy5fZ2V0T3B0aW9uKGUpfSksdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXN9O3ZhciBQaD1bIm9wYWNpdHkiLCJiYWNrZ3JvdW5kQ29sb3IiXSxNaD1bIndpZHRoIiwiaGVpZ2h0IiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIl07WyJtYXRyaXgiLCJtYXRyaXgzZCIsInJvdGF0ZSIsInJvdGF0ZTNkIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwic2NhbGUiLCJzY2FsZTNkIiwic2NhbGVYIiwic2NhbGVZIiwic2NhbGVaIiwic2tldyIsInNrZXdYIiwic2tld1kiLCJ0cmFuc2xhdGUiLCJ0cmFuc2xhdGUzZCIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwidHJhbnNsYXRlWiJdLmNvbmNhdChQaCxNaCkuZm9yRWFjaChmdW5jdGlvbihuKXskaC5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIFBoLmNvbmNhdChNaCkuaW5jbHVkZXMobik/dGhpcy5fcHVzaEFuaW1hdGVzKCJzdHlsZSIsW3RoaXMuX2NvbnZlclR5cGUobiksTWguaW5jbHVkZXMobik/dGhpcy5fZ2V0VmFsdWUoZVswXSk6ZVswXV0pOnRoaXMuX3B1c2hBbmltYXRlcyhuLGUpLHRoaXN9fSk7dmFyIGpoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUFuaW1hdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4gbmV3ICRoKGUpfX0pLExoPVl1KCJyZXF1ZXN0Q29tcG9uZW50T2JzZXJ2ZXIiKSxCaD17dGhyZXNob2xkczpbMF0saW5pdGlhbFJhdGlvOjAsb2JzZXJ2ZUFsbDohMX0sTmg9ZnVuY3Rpb24oZSx0KXt0aGlzLnBhZ2VJZD1lLiRwYWdlJiZlLiRwYWdlLmlkLHRoaXMuY29tcG9uZW50PWUuXyRpZHx8ZSx0aGlzLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSxCaCx0KX07TmgucHJvdG90eXBlLl9tYWtlUm9vdE1hcmdpbj1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD17fSksdGhpcy5vcHRpb25zLnJvb3RNYXJnaW49WyJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuKE51bWJlcih0W2VdKXx8MCkrInB4In0pLmpvaW4oIiAiKX0sTmgucHJvdG90eXBlLnJlbGF0aXZlVG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnJlbGF0aXZlVG9TZWxlY3Rvcj1lLHRoaXMuX21ha2VSb290TWFyZ2luKHQpLHRoaXN9LE5oLnByb3RvdHlwZS5yZWxhdGl2ZVRvVmlld3BvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucy5yZWxhdGl2ZVRvU2VsZWN0b3I9bnVsbCx0aGlzLl9tYWtlUm9vdE1hcmdpbihlKSx0aGlzfSxOaC5wcm90b3R5cGUub2JzZXJ2ZT1mdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodGhpcy5vcHRpb25zLnNlbGVjdG9yPWUsdGhpcy5yZXFJZD1MaC5wdXNoKHQpLGFnLnB1Ymxpc2hIYW5kbGVyKCJyZXF1ZXN0Q29tcG9uZW50T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkLGNvbXBvbmVudDp0aGlzLmNvbXBvbmVudCxvcHRpb25zOnRoaXMub3B0aW9uc30sKHRoaXMuY29tcG9uZW50LHRoaXMucGFnZUlkKSkpfSxOaC5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbigpe2FnLnB1Ymxpc2hIYW5kbGVyKCJkZXN0cm95Q29tcG9uZW50T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKX07dmFyIERoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX2lzVnVlfHwodD1lLGU9bnVsbCksbmV3IE5oKGV8fFNsKCJjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciIpLHQpfX0pLFJoPVl1KCJyZXF1ZXN0TWVkaWFRdWVyeU9ic2VydmVyIiksRmg9ZnVuY3Rpb24oZSx0KXt0aGlzLnBhZ2VJZD1lLiRwYWdlJiZlLiRwYWdlLmlkLHRoaXMuY29tcG9uZW50PWUuXyRpZHx8ZSx0aGlzLm9wdGlvbnM9dH07RmgucHJvdG90eXBlLm9ic2VydmU9ZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHRoaXMub3B0aW9ucz1lLHRoaXMucmVxSWQ9UmgucHVzaCh0KSxhZy5wdWJsaXNoSGFuZGxlcigicmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIse3JlcUlkOnRoaXMucmVxSWQsY29tcG9uZW50OnRoaXMuY29tcG9uZW50LG9wdGlvbnM6dGhpcy5vcHRpb25zfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKSl9LEZoLnByb3RvdHlwZS5kaXNjb25uZWN0PWZ1bmN0aW9uKCl7YWcucHVibGlzaEhhbmRsZXIoImRlc3Ryb3lNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKX07dmFyIFVoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlLl9pc1Z1ZXx8KHQ9ZSxlPW51bGwpLG5ldyBGaChlfHxTbCgiY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyIiksdCl9fSksemg9e2NhbnZhczp3cCxtYXA6Q3AsdmlkZW86SXAsZWRpdG9yOlBwfTtmdW5jdGlvbiBWaChlKXtpZihlJiZlLmNvbnRleHQpe3ZhciB0PWUuY29udGV4dCxuPXQuaWQscj10Lm5hbWUsaT10LnBhZ2Usbz16aFtyXTtlLmNvbnRleHQ9byYmbmV3IG8obixpKX19dmFyIHFoPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuX3NlbGVjdG9yUXVlcnk9ZSx0aGlzLl9jb21wb25lbnQ9dCx0aGlzLl9zZWxlY3Rvcj1uLHRoaXMuX3NpbmdsZT1yfTtxaC5wcm90b3R5cGUuYm91bmRpbmdDbGllbnRSZWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2lkOiEwLGRhdGFzZXQ6ITAscmVjdDohMCxzaXplOiEwfSxlKSx0aGlzLl9zZWxlY3RvclF1ZXJ5fSxxaC5wcm90b3R5cGUuZmllbGRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSxlLHQpLHRoaXMuX3NlbGVjdG9yUXVlcnl9LHFoLnByb3RvdHlwZS5zY3JvbGxPZmZzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx7aWQ6ITAsZGF0YXNldDohMCxzY3JvbGxPZmZzZXQ6ITB9LGUpLHRoaXMuX3NlbGVjdG9yUXVlcnl9LHFoLnByb3RvdHlwZS5jb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2NvbnRleHQ6ITB9LGUpLHRoaXMuX3NlbGVjdG9yUXVlcnl9O3ZhciBXaD1mdW5jdGlvbihlKXt0aGlzLl9wYWdlPWUsdGhpcy5fcXVldWU9W10sdGhpcy5fcXVldWVDYj1bXSx0aGlzLl9ub2Rlc1JlZj1udWxsfTtXaC5wcm90b3R5cGUuZXhlYz1mdW5jdGlvbih0KXt2YXIgaT10aGlzO3JldHVybiB3bCgicmVxdWVzdENvbXBvbmVudEluZm8iLHRoaXMuX3BhZ2UsdGhpcy5fcXVldWUsZnVuY3Rpb24oZSl7dmFyIHI9aS5fcXVldWVDYjtlLmZvckVhY2goZnVuY3Rpb24oZSx0KXtBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaChWaCk6VmgoZSk7dmFyIG49clt0XTtDKG4pJiZuLmNhbGwoaSxlKX0pLEModCkmJnQuY2FsbChpLGUpfSksdGhpcy5fbm9kZXNSZWZ9LFdoLnByb3RvdHlwZS5pbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50PWUuXyRpZHx8ZSx0aGlzfSxXaC5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9ub2Rlc1JlZj1uZXcgcWgodGhpcyx0aGlzLl9jb21wb25lbnQsZSwhMCl9LFdoLnByb3RvdHlwZS5zZWxlY3RBbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBxaCh0aGlzLHRoaXMuX2NvbXBvbmVudCxlLCExKX0sV2gucHJvdG90eXBlLnNlbGVjdFZpZXdwb3J0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBxaCh0aGlzLDAsIiIsITApfSxXaC5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24oZSx0LG4scixpKXt0aGlzLl9xdWV1ZS5wdXNoKHtjb21wb25lbnQ6dCxzZWxlY3RvcjplLHNpbmdsZTpuLGZpZWxkczpyfSksdGhpcy5fcXVldWVDYi5wdXNoKGkpfTt2YXIgSGg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlU2VsZWN0b3JRdWVyeTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFdoKGV8fFNsKCJjcmVhdGVTZWxlY3RvclF1ZXJ5IikpfX0pO2FnLnN1YnNjcmliZSgib25Mb2FkRm9udEZhY2VDYWxsYmFjayIsZnVuY3Rpb24oZSl7ZmkoZS5jYWxsYmFja0lkLGUuZGF0YSl9KTt2YXIgR2g9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbG9hZEZvbnRGYWNlOmZ1bmN0aW9uKGUsdCl7dmFyIG49eGwoKTtpZighbilyZXR1cm57ZXJyTXNnOiJsb2FkRm9udEZhY2U6ZmFpbCBub3QgZm9udCBwYWdlIn07YWcucHVibGlzaEhhbmRsZXIoImxvYWRGb250RmFjZSIse29wdGlvbnM6ZSxjYWxsYmFja0lkOnR9LG4pfX0pO3ZhciBYaD1bXTt2YXIgSmg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0TG9jYWxlOmZ1bmN0aW9uKCl7dmFyIGU9aGcoe2FsbG93RGVmYXVsdDohMH0pO3JldHVybiBlJiZlLiR2bT9lLiR2bS4kbG9jYWxlOm90LmdldExvY2FsZSgpfSxzZXRMb2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIGhnKCkuJHZtLiRsb2NhbGUhPT10JiYoaGcoKS4kdm0uJGxvY2FsZT10LHZnKCkuZm9yRWFjaChmdW5jdGlvbihlKXthZy5wdWJsaXNoSGFuZGxlcigic2V0TG9jYWxlIix0LGUuJHBhZ2UuaWQpfSksaWcucmVxdWlyZU1vZHVsZSgicGx1cyIpLnNldExhbmd1YWdlKHQpLFhoLmZvckVhY2goZnVuY3Rpb24oZSl7ZmkoZSx7bG9jYWxlOnR9KX0pLCEwKX0sb25Mb2NhbGVDaGFuZ2U6ZnVuY3Rpb24oZSl7WGgucHVzaChlKX19KTt2YXIgWWg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscGFnZVNjcm9sbFRvOmZ1bmN0aW9uKGUpe3ZhciB0PXZnKCk7cmV0dXJuIHQubGVuZ3RoJiZhZy5wdWJsaXNoSGFuZGxlcigicGFnZVNjcm9sbFRvIixlLHRbdC5sZW5ndGgtMV0uJHBhZ2UuaWQpLHt9fX0pO3ZhciBLaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzZXRQYWdlTWV0YTpmdW5jdGlvbihlKXt2YXIgdD12ZygpO3JldHVybiB0Lmxlbmd0aCYmYWcucHVibGlzaEhhbmRsZXIoInNldFBhZ2VNZXRhIixlLHRbdC5sZW5ndGgtMV0uJHBhZ2UuaWQpLHt9fX0pO2Z1bmN0aW9uIFpoKGUpe3JldHVybiB3bCgic2V0VGFiQmFyQmFkZ2UiLHtpbmRleDplLmluZGV4LHR5cGU6Im5vbmUifSl9dmFyIFFoPVpoLGV2PVtdO2tsKCJvblRhYkJhck1pZEJ1dHRvblRhcCIsZnVuY3Rpb24odCl7ZXYuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHQpfSl9KTt2YXIgdHY9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscmVtb3ZlVGFiQmFyQmFkZ2U6Wmgsc2hvd1RhYkJhclJlZERvdDpmdW5jdGlvbihlKXtyZXR1cm4gd2woInNldFRhYkJhckJhZGdlIix7aW5kZXg6ZS5pbmRleCx0eXBlOiJyZWREb3QifSl9LGhpZGVUYWJCYXJSZWREb3Q6UWgsb25UYWJCYXJNaWRCdXR0b25UYXA6ZnVuY3Rpb24oZSl7ZXYucHVzaChlKX19KSxudj1bXTtrbCgib25WaWV3RGlkUmVzaXplIixmdW5jdGlvbih0KXtudi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUsdCl9KX0pO3ZhciBydixpdixvdj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvbldpbmRvd1Jlc2l6ZTpmdW5jdGlvbihlKXtudi5wdXNoKGUpfSxvZmZXaW5kb3dSZXNpemU6ZnVuY3Rpb24oZSl7bnYuc3BsaWNlKG52LmluZGV4T2YoZSksMSl9fSksYXY9T2JqZWN0LmNyZWF0ZShudWxsKSxzdj0ocnY9eyIuL2Jhc2UvYmFzZTY0LmpzIjpXciwiLi9iYXNlL2Nhbi1pLXVzZS5qcyI6R3IsIi4vYmFzZS9pbnRlcmNlcHRvci5qcyI6SnIsIi4vYmFzZS91cHgycHguanMiOmVpLCIuL2NvbnRleHQvYXVkaW8uanMiOnJpLCIuL2NvbnRleHQvYmFja2dyb3VuZC1hdWRpby5qcyI6JGwsIi4vY29udGV4dC9jYW52YXMuanMiOlNwLCIuL2NvbnRleHQvY3JlYXRlLW1hcC1jb250ZXh0LmpzIjpUcCwiLi9jb250ZXh0L2NyZWF0ZS12aWRlby1jb250ZXh0LmpzIjpBcCwiLi9jb250ZXh0L2VkaXRvci5qcyI6TXAsIi4vY29udGV4dC9pbm5lci1hdWRpby5qcyI6UnAsIi4vZGV2aWNlL25ldHdvcmsuanMiOlVwLCIuL2RldmljZS90aGVtZS5qcyI6cXAsIi4va2V5Ym9hcmQvZ2V0LXNlbGVjdGVkLXRleHQtcmFuZ2UuanMiOkdwLCIuL2tleWJvYXJkL2tleWJvYXJkLmpzIjpYcCwiLi9tZWRpYS9wcmV2aWV3LWltYWdlLmpzIjpacCwiLi9tZWRpYS9yZWNvcmRlci5qcyI6dGgsIi4vbmV0d29yay9kb3dubG9hZC1maWxlLmpzIjppaCwiLi9uZXR3b3JrL3JlcXVlc3QuanMiOnNoLCIuL25ldHdvcmsvc29ja2V0LmpzIjpwaCwiLi9uZXR3b3JrL3VwZGF0ZS5qcyI6dmgsIi4vbmV0d29yay91cGxvYWQtZmlsZS5qcyI6a2gsIi4vcGx1Z2luL3B1c2guanMiOkloLCIuL3VpL2NyZWF0ZS1hbmltYXRpb24uanMiOmpoLCIuL3VpL2NyZWF0ZS1pbnRlcnNlY3Rpb24tb2JzZXJ2ZXIuanMiOkRoLCIuL3VpL2NyZWF0ZS1tZWRpYS1xdWVyeS1vYnNlcnZlci5qcyI6VWgsIi4vdWkvY3JlYXRlLXNlbGVjdG9yLXF1ZXJ5LmpzIjpIaCwiLi91aS9sb2FkLWZvbnQtZmFjZS5qcyI6R2gsIi4vdWkvbG9jYWxlLmpzIjpKaCwiLi91aS9wYWdlLXNjcm9sbC10by5qcyI6WWgsIi4vdWkvc2V0LXBhZ2UtbWV0YS5qcyI6S2gsIi4vdWkvdGFiLWJhci5qcyI6dHYsIi4vdWkvd2luZG93LmpzIjpvdn0sKGl2PWZ1bmN0aW9uKGUpe3JldHVybiBydltlXXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitlKyInLiIpfSgpfSkua2V5cz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyhydil9LGl2KTtzdi5rZXlzKCkuZm9yRWFjaChmdW5jdGlvbihlKXtPYmplY3QuYXNzaWduKGF2LHN2KGUpKX0pO3ZhciBjdj1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksYXYsYmwpLHV2PU9iamVjdC5jcmVhdGUobnVsbCk7dC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBpLG87Y3ZbZV0/dXZbZV09KG89RnIoaT1lLGN2W2VdKSxvZShpKSYmQyhvKT9mdW5jdGlvbihuKXt2b2lkIDA9PT1uJiYobj17fSk7Zm9yKHZhciByPVtdLGU9YXJndW1lbnRzLmxlbmd0aC0xOzA8ZS0tOylyW2VdPWFyZ3VtZW50c1tlKzFdO3JldHVybiBDKG4uc3VjY2Vzcyl8fEMobi5mYWlsKXx8QyhuLmNvbXBsZXRlKT9HKGksSi5hcHBseSh2b2lkIDAsW2ksbyxuXS5jb25jYXQocikpKTpHKGksbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtKLmFwcGx5KHZvaWQgMCxbaSxvLE9iamVjdC5hc3NpZ24oe30sbix7c3VjY2VzczplLGZhaWw6dH0pXS5jb25jYXQocikpfSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm5bbnVsbCxlXX0pLmNhdGNoKGZ1bmN0aW9uKGUpe3JldHVybltlXX0pKX06byk6dXZbZV09RHIoZSl9KTt2YXIgbHY9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBkdihlLHQsbil7cmV0dXJuIm9uRXJyb3IiIT09dCYmY29uc29sZS5kZWJ1ZygiQXBw77yaIit0KyIgaGF2ZSBiZWVuIGludm9rZWQiKyhuPyIgIitKU09OLnN0cmluZ2lmeShuKToiIikpLChlPWUuJHZtfHxlKS5fX2NhbGxfaG9vayYmZS5fX2NhbGxfaG9vayh0LG4pfWZ1bmN0aW9uIGZ2KGUsdCxuKXtyZXR1cm4ib25QYWdlU2Nyb2xsIiE9PXQmJmNvbnNvbGUuZGVidWcoZS4kcGFnZS5yb3V0ZSsiWyIrZS4kcGFnZS5pZCsiXe+8miIrdCsiIGhhdmUgYmVlbiBpbnZva2VkIiksaT10LG89biwocj0ocj1lKS4kdm18fHIpLl9fY2FsbF9ob29rJiZyLl9fY2FsbF9ob29rKGksbyk7dmFyIHIsaSxvfWZ1bmN0aW9uIHB2KGUsdCl7dmFyIG49ZS5uYW1lLHI9ZS5hcmc7InBvc3RNZXNzYWdlIj09PW4/ZnVuY3Rpb24odCxlKXt0PXBhcnNlSW50KHQpO3ZhciBuPXZnKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO2lmKG4mJiFuLiRwYWdlLm1ldGEuaXNOVnVlKXt2YXIgcj1uLiR2bS5fJHZkLmVsZW1lbnRzLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIndlYi12aWV3Ij09PWUudHlwZSYmZS5ldmVudHMubWVzc2FnZX0pO2lmKCFyKXJldHVybjtyLmRpc3BhdGNoRXZlbnQoIm1lc3NhZ2UiLHt0eXBlOiJtZXNzYWdlIix0YXJnZXQ6T2JqZWN0LmNyZWF0ZShudWxsKSxjdXJyZW50VGFyZ2V0Ok9iamVjdC5jcmVhdGUobnVsbCksdGltZVN0YW1wOkRhdGUubm93KCksZGV0YWlsOntkYXRhOltlXX19KX19KHRbMF0scik6cGdbbl0ocil9ZnVuY3Rpb24gaHYoZSx0KXt2YXIgbj10LmdldEFwcCxpPXQuZ2V0Q3VycmVudFBhZ2VzO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj1pKCk7bi5sZW5ndGgmJmZ2KG5bbi5sZW5ndGgtMV0sZSx0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBmdW5jdGlvbihlKXtyKHQsZSl9fXZhciBhPXtuYXZpZ2F0ZVRvOmZ1bmN0aW9uKCl7cigib25IaWRlIil9LG5hdmlnYXRlQmFjazpmdW5jdGlvbigpe3IoIm9uU2hvdyIpfX07ZSgib25FcnJvciIsZnVuY3Rpb24oZSl7ZHYobigpLCJvbkVycm9yIixlKX0pLGUoIm9uUGFnZU5vdEZvdW5kIixmdW5jdGlvbihlKXtkdihuKCksIm9uUGFnZU5vdEZvdW5kIixlKX0pLGUoIm9uQXBwUm91dGUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWFbdF07biYmbigpfSksZSgib25BcHBFbnRlckJhY2tncm91bmQiLGZ1bmN0aW9uKCl7ZHYobigpLCJvbkhpZGUiKSxyKCJvbkhpZGUiKX0pLGUoIm9uQXBwRW50ZXJGb3JlZ3JvdW5kIixmdW5jdGlvbihlKXtkdihuKCksIm9uU2hvdyIsZSksMCE9PWkoKS5sZW5ndGgmJnIoIm9uU2hvdyIpfSksZSgib25SZXNpemUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49aSgpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7biYmZnYobiwib25SZXNpemUiLGUpfSksZSgib25QdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1pKCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS4kcGFnZS5pZD09PXR9KTtyJiYoR3U9Im51bWJlciI9PXR5cGVvZihuPXQpP29nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoU3RyaW5nKG4pKTpuLGZ2KHIsIm9uUHVsbERvd25SZWZyZXNoIikpfSksZSgib25UYWJJdGVtVGFwIixvKCJvblRhYkl0ZW1UYXAiKSksZSgib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIixvKCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDaGFuZ2VkIixvKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiLG8oIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIikpLGUoIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsbygib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIikpLGUoIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIixvKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZCIpKSxlKCJvbldlYkludm9rZUFwcFNlcnZpY2UiLHB2KX10LmZvckVhY2goZnVuY3Rpb24oZSl7Y3ZbZV0/bHZbZV09RnIoZSxjdltlXSk6bHZbZV09RHIoZSl9KTt2YXIgdnY9ITE7ZnVuY3Rpb24gZ3YoZSx0KXt2YXIgbj0iMSI9PT10O2lmKCFufHwhdnYpe2lmKG4/KHZ2PSEwLGFzKG9nLndlYnZpZXcuZ2V0TGF1bmNoV2VidmlldygpKSk6R2F8fGFzKG9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodCkpLEdhLmlkIT09dClyZXR1cm4gY29uc29sZS5lcnJvcigid2Vidmlld1JlYWR5WyIrR2EuaWQrIl1bIit0KyJdIG5vdCBtYXRjaCIpO3ZhciByLGk7aWYoR2EubG9hZGVkPSEwLGk9ZHNbcj10XSxBcnJheS5pc0FycmF5KGkpJiZpLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0pLGRlbGV0ZSBkc1tyXSxuKXt2YXIgbz0iLyIrZGcuZW50cnlQYWdlUGF0aCxhPWZnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PW99KTtpZighYS5tZXRhLmlzTlZ1ZSl7dmFyIHM9YS5tZXRhLmlzVGFiQmFyPyJzd2l0Y2hUYWIiOiJuYXZpZ2F0ZVRvIjtyZXR1cm4gcGdbc10oe3VybDpvKyhkZy5lbnRyeVBhZ2VRdWVyeXx8IiIpLG9wZW5UeXBlOiJhcHBMYXVuY2gifSl9fX19dmFyIG12PU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24geXYoZSx0KXt2YXIgbj1lLmRhdGEscj0oZS5vcHRpb25zLG12W3RdKTtBcnJheS5pc0FycmF5KHIpJiZyLmZvckVhY2goZnVuY3Rpb24oZSl7ZShuKX0pfXZhciBfdixidj1bXTtmdW5jdGlvbiB3digpe2Zvcih2YXIgZT1idi5zbGljZSgwKSx0PWJ2Lmxlbmd0aD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX1mdW5jdGlvbiBrdihlKXt2YXIgdD1lLmRhdGEsbj10Lm1ldGhvZCxyPXQuYXJncztwZ1tuXSYmcGdbbl0ocil9ZnVuY3Rpb24gU3YoZSx0KXt2YXIgbj1lLmNpZCxyPWUubWV0aG9kLGk9ZS5hcmdzO3Q9cGFyc2VJbnQodCk7dmFyIG89dmcoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7aWYoIW8pcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpO3ZhciBhPW8uJHZtLl8kdmQuZ2V0Vm0obik7aWYoIWEpcmV0dXJuIGNvbnNvbGUuZXJyb3IoInZtWyIrbisiXSBub3QgZm91bmQiKTthW3JdJiZhW3JdKGkpfWZ1bmN0aW9uIHh2KHQpe3Q9cGFyc2VJbnQodCk7dmFyIGU9dmcoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7cmV0dXJuIGV8fGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpfWZ1bmN0aW9uIEN2KGUsdCl7dmFyIG49eHYodCk7biYmKG4uX191bmlhcHBfd2Vidmlldz0hMCl9ZnVuY3Rpb24gVHYoZSx0KXt2YXIgbj14dih0KTtuJiZkZWxldGUgbi5fX3VuaWFwcF93ZWJ2aWV3fWZ1bmN0aW9uIE92KCl7dmFyIGU9YWcub24sbj1hZy5lbWl0LHQ9YWcuc3Vic2NyaWJlLHI9YWcucHVibGlzaEhhbmRsZXIsaT1hZy5zdWJzY3JpYmVIYW5kbGVyO2lmKGZ1bmN0aW9uKGUsdCl7dC5nZXRBcHA7dmFyIGk9dC5nZXRDdXJyZW50UGFnZXM7ZnVuY3Rpb24gbihyKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt0PXBhcnNlSW50KHQpO3ZhciBuPWkoKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO24mJmZ2KG4scixlKX19dmFyIG89WXUoInJlcXVlc3RDb21wb25lbnRJbmZvIiksYT1ZdSgicmVxdWVzdENvbXBvbmVudE9ic2VydmVyIikscz1ZdSgicmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIpO2UoIm9uUGFnZVNjcm9sbCIsbigib25QYWdlU2Nyb2xsIikpLGUoIm9uUmVhY2hCb3R0b20iLG4oIm9uUmVhY2hCb3R0b20iKSksZSgib25SZXF1ZXN0Q29tcG9uZW50SW5mbyIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXFJZCxuPWUucmVzLHI9by5wb3AodCk7ciYmcihuKX0pLGUoIm9uUmVxdWVzdENvbXBvbmVudE9ic2VydmVyIixmdW5jdGlvbihlKXt2YXIgdD1lLnJlcUlkLG49ZS5yZXFFbmQscj1lLnJlcyxpPWEuZ2V0KHQpO2lmKGkpe2lmKG4pcmV0dXJuIHZvaWQgYS5wb3AodCk7aShyKX19KSxlKCJvblJlcXVlc3RNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxSWQsbj1lLnJlcUVuZCxyPWUucmVzLGk9cy5nZXQodCk7aWYoaSl7aWYobilyZXR1cm4gdm9pZCBzLnBvcCh0KTtpKHIpfX0pfSh0LHtnZXRBcHA6aGcsZ2V0Q3VycmVudFBhZ2VzOnZnfSksZ2EoInN1YnNjcmliZUhhbmRsZXIiLGZ1bmN0aW9uKGUpe2koZS50eXBlLGUuZGF0YSxlLnBhZ2VJZCl9KSwibmF0aXZlIiE9PWRnLnJlbmRlcmVyKXt0KFlhLGd2KSx0KEphLHl2KSx0KEthLHd2KTt2YXIgbz0iLyIrZGcuZW50cnlQYWdlUGF0aDtmZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1vfSkubWV0YS5pc05WdWV8fHIoWWEsT2JqZWN0LmNyZWF0ZShudWxsKSxbMV0pfWUoImFwaS4iK1FhLGZ1bmN0aW9uKGUsdCl7bigib25XZWJJbnZva2VBcHBTZXJ2aWNlIixlLHQpfSksdCgib25XeHNJbnZva2VDYWxsTWV0aG9kIixTdiksdChaYSxrdiksdChlcyxDdiksdCh0cyxUdil9dmFyIEV2PXtnbG9iYWxEYXRhOnt9fTtmdW5jdGlvbiBJdihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5hbGxvd0RlZmF1bHQ7cmV0dXJuIHZvaWQgMD09PXQmJih0PSExKSxfdnx8KHQ/RXY6dm9pZCBjb25zb2xlLmVycm9yKCJbd2Fybl06IGdldEFwcCgpIGZhaWxlZC4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLmlvL2NvbGxvY2F0aW9uL2ZyYW1lL3dpbmRvdz9pZD1nZXRhcHAuIikpfWZ1bmN0aW9uIEF2KCl7dmFyIGU9cGkoImdsb2JhbEV2ZW50Iiksbz1hZy5lbWl0O2lnLmNvbmZpZy5wcmVsb2FkP29nLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixWYSk6b2cuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigic3BsYXNoY2xvc2VkIixmdW5jdGlvbigpe29nLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixWYSl9KSxvZy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsZnVuY3Rpb24oKXtvKCJvbkFwcEVudGVyQmFja2dyb3VuZCIpfSksb2cuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVzdW1lIixmdW5jdGlvbigpe3ZhciBlLHQsbixyLGk9RXMoKTtpJiZpLnVzZXJBY3Rpb24mJih0PShlPWkpLnBhdGgsbj1lLnF1ZXJ5LHI9ZS5yZWZlcnJlckluZm8seHMoQ3Mse3BhdGg6dCxxdWVyeTpuP0Uobik6e30scmVmZXJyZXJJbmZvOnJ8fHt9fSkpLG8oIm9uQXBwRW50ZXJGb3JlZ3JvdW5kIixPcygpKX0pLG9nLmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoIm5ldGNoYW5nZSIsZnVuY3Rpb24oKXt2YXIgZT12b1tvZy5uZXR3b3JraW5mby5nZXRDdXJyZW50VHlwZSgpXXx8InVua25vd24iO2hpKCJvbk5ldHdvcmtTdGF0dXNDaGFuZ2UiLHtpc0Nvbm5lY3RlZDoibm9uZSIhPT1lLG5ldHdvcmtUeXBlOmV9KX0pO3ZhciB0PTA7b2cuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigiS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe3QhPT1lLmhlaWdodCYmaGkoIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLHtoZWlnaHQ6dD1lLmhlaWdodH0pfSksZS5hZGRFdmVudExpc3RlbmVyKCJ1aXN0eWxlY2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdCxuPXt0aGVtZTplLnVpc3R5bGV9O2R2KF92LG50LG4pLGhpKG50LG4pLGFnLnB1Ymxpc2hIYW5kbGVyKG50LG4sKHQ9UHMoKSlbdC5sZW5ndGgtMV0uJHBhZ2UuaWQpLGhpKCJvblVJU3R5bGVDaGFuZ2UiLHtzdHlsZTplLnVpc3R5bGV9KSxOcygpfSksZS5hZGRFdmVudExpc3RlbmVyKCJ1bmlNUE5hdGl2ZUV2ZW50IixmdW5jdGlvbihlKXtoaSgidW5pTVBOYXRpdmVFdmVudCIsZSl9KSxvZy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsJHYpLG9nLmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoIldlYnZpZXdQb3N0TWVzc2FnZSIsJHYpfWZ1bmN0aW9uICR2KGUpe2UuZGF0YSYmZS5kYXRhLnR5cGUmJnZhKGUuZGF0YS50eXBlLGUuZGF0YS5hcmdzfHx7fSl9ZnVuY3Rpb24gUHYoZSl7dmFyIHQsbixyLGksbz0odD17cGF0aDpkZy5lbnRyeVBhZ2VQYXRoLHF1ZXJ5OmRnLmVudHJ5UGFnZVF1ZXJ5LHJlZmVycmVySW5mbzpkZy5yZWZlcnJlckluZm99LG49dC5wYXRoLHI9dC5xdWVyeSxpPXQucmVmZXJyZXJJbmZvLHhzKFRzLHtwYXRoOm4scXVlcnk6cj9FKHIpOnt9LHJlZmVycmVySW5mbzppfHx7fSxjaGFubmVsOm9nLnJ1bnRpbWUuY2hhbm5lbCxsYXVuY2hlcjpvZy5ydW50aW1lLmxhdW5jaGVyfSkseHMoQ3MsVHMpLFRzKTtkdihlLCJvbkxhdW5jaCIsbyksZHYoZSwib25TaG93IixvKTt2YXIgYT1pZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0QXBwU3RhdGU7Mj09PShhJiZOdW1iZXIoYSgpKSkmJmR2KGUsIm9uSGlkZSIsbyl9ZnVuY3Rpb24gTXYoKXtmdW5jdGlvbiBlKGUpe3JldHVybiAwPT09KGU9ZS5yZXBsYWNlKC9cLyQvLCIiKSkuaW5kZXhPZigiXyIpP29nLmlvLmNvbnZlcnRMb2NhbEZpbGVTeXN0ZW1VUkwoZSk6ZX12YXIgdD1lKG1vKSxuPWUoeW8pLHI9bi5zcGxpdCgiLyIpO3IucG9wKCkscj1yLmpvaW4oIi8iKSxvZy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKG9nLmlvLmNvbnZlcnRBYnNvbHV0ZUZpbGVTeXN0ZW0ociksZnVuY3Rpb24oZSl7ZS5jcmVhdGVSZWFkZXIoKS5yZWFkRW50cmllcyhmdW5jdGlvbihlKXtlJiZlLmxlbmd0aCYmZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuaXNEaXJlY3RvcnkmJjA9PT1lLmZ1bGxQYXRoLmluZGV4T2YodCkmJjAhPT1lLmZ1bGxQYXRoLmluZGV4T2YobikmJmUucmVtb3ZlUmVjdXJzaXZlbHkoKX0pfSl9KX1mdW5jdGlvbiBqdihlLHQpe3ZhciBuLHIsaSxvOyhfdj1lKS4kdm09ZSxuPWUsaT10Lm9ic2VydmFibGUoe2xvY2FsZTpyfHxvdC5nZXRMb2NhbGUoKX0pLG89W10sbi4kd2F0Y2hMb2NhbGU9ZnVuY3Rpb24oZSl7by5wdXNoKGUpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiJGxvY2FsZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBpLmxvY2FsZX0sc2V0OmZ1bmN0aW9uKHQpe2kubG9jYWxlPXQsby5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlKHQpfSl9fSksT2JqZWN0LmFzc2lnbihfdixFdik7dmFyIGE9ZS4kb3B0aW9ucy5nbG9iYWxEYXRhfHx7fTtfdi5nbG9iYWxEYXRhPU9iamVjdC5hc3NpZ24oYSxfdi5nbG9iYWxEYXRhKSxodihhZy5vbix7Z2V0QXBwOkl2LGdldEN1cnJlbnRQYWdlczpQc30pLEFzKCksZnVuY3Rpb24oKXtpZihkZy50YWJCYXImJmRnLnRhYkJhci5saXN0JiZkZy50YWJCYXIubGlzdC5sZW5ndGgpe2RnLnRhYkJhci5zZWxlY3RlZD0wO3ZhciBlPWRnLnRhYkJhci5saXN0LmZpbmRJbmRleChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYWdlUGF0aD09PWRnLmVudHJ5UGFnZVBhdGh9KTtxcy5pbml0KGRnLnRhYkJhcixmdW5jdGlvbihlLHQpe3BnLnN3aXRjaFRhYih7dXJsOiIvIitlLnBhZ2VQYXRoLG9wZW5UeXBlOiJzd2l0Y2hUYWIiLGZyb206InRhYkJhciIsc3VjY2VzczpmdW5jdGlvbigpe2FnLmVtaXQoIm9uVGFiSXRlbVRhcCIse2luZGV4OnQsdGV4dDplLnRleHQscGFnZVBhdGg6ZS5wYWdlUGF0aH0pfX0pfSksLTEhPT1lJiYwIT09KGRnLnRhYkJhci5zZWxlY3RlZD1lKSYmcXMuc3dpdGNoVGFiKGRnLmVudHJ5UGFnZVBhdGgpfX0oKSxBdigpLE92KCksUHYoZSksc2coTXYsMWU0KSxkZy5yZWFkeT0hMH12YXIgTHY9WyJ1bmktYXBwIiwidW5pLWxheW91dCIsInVuaS1jb250ZW50IiwidW5pLW1haW4iLCJ1bmktdG9wLXdpbmRvdyIsInVuaS1sZWZ0LXdpbmRvdyIsInVuaS1yaWdodC13aW5kb3ciLCJ1bmktdGFiYmFyIiwidW5pLXBhZ2UiLCJ1bmktcGFnZS1oZWFkIiwidW5pLXBhZ2Utd3JhcHBlciIsInVuaS1wYWdlLWJvZHkiLCJ1bmktcGFnZS1yZWZyZXNoIiwidW5pLWFjdGlvbnNoZWV0IiwidW5pLW1vZGFsIiwidW5pLXRvYXN0IiwidW5pLXJlc2l6ZS1zZW5zb3IiLCJ1bmktc2hhZG93LXJvb3QiLCJ1bmktYWQiLCJ1bmktYXVkaW8iLCJ1bmktYnV0dG9uIiwidW5pLWNhbWVyYSIsInVuaS1jYW52YXMiLCJ1bmktY2hlY2tib3giLCJ1bmktY2hlY2tib3gtZ3JvdXAiLCJ1bmktY292ZXItaW1hZ2UiLCJ1bmktY292ZXItdmlldyIsInVuaS1lZGl0b3IiLCJ1bmktZm9ybSIsInVuaS1mdW5jdGlvbmFsLXBhZ2UtbmF2aWdhdG9yIiwidW5pLWljb24iLCJ1bmktaW1hZ2UiLCJ1bmktaW5wdXQiLCJ1bmktbGFiZWwiLCJ1bmktbGl2ZS1wbGF5ZXIiLCJ1bmktbGl2ZS1wdXNoZXIiLCJ1bmktbWFwIiwidW5pLW1vdmFibGUtYXJlYSIsInVuaS1tb3ZhYmxlLXZpZXciLCJ1bmktbmF2aWdhdG9yIiwidW5pLW9mZmljaWFsLWFjY291bnQiLCJ1bmktb3Blbi1kYXRhIiwidW5pLXBpY2tlciIsInVuaS1waWNrZXItdmlldyIsInVuaS1waWNrZXItdmlldy1jb2x1bW4iLCJ1bmktcHJvZ3Jlc3MiLCJ1bmktcmFkaW8iLCJ1bmktcmFkaW8tZ3JvdXAiLCJ1bmktcmljaC10ZXh0IiwidW5pLXNjcm9sbC12aWV3IiwidW5pLXNsaWRlciIsInVuaS1zd2lwZXIiLCJ1bmktc3dpcGVyLWl0ZW0iLCJ1bmktc3dpdGNoIiwidW5pLXRleHQiLCJ1bmktdGV4dGFyZWEiLCJ1bmktdmlkZW8iLCJ1bmktdmlldyIsInVuaS13ZWItdmlldyJdO2Z1bmN0aW9uIEJ2KGUpe2lmKDA9PT1lLmluZGV4T2YoIiMiKSl7dmFyIHQ9ZS5zdWJzdHIoMSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiEoIWUuY29tcG9uZW50SW5zdGFuY2V8fGUuY29tcG9uZW50SW5zdGFuY2UuaWQhPT10KXx8ISghZS5kYXRhfHwhZS5kYXRhLmF0dHJzfHxlLmRhdGEuYXR0cnMuaWQhPT10KX19aWYoMD09PWUuaW5kZXhPZigiLiIpKXt2YXIgbj1lLnN1YnN0cigxKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGF0YSYmZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PXQmJih0PSIiKTt2b2lkIDA9PT1uJiYobj0iIik7aWYodClyZXR1cm4tMSE9PXQuc3BsaXQoTnYpLmluZGV4T2YoZSk7aWYobiYmInN0cmluZyI9PXR5cGVvZiBuKXJldHVybi0xIT09bi5zcGxpdChOdikuaW5kZXhPZihlKX0obixlLmRhdGEuc3RhdGljQ2xhc3MsZS5kYXRhLmNsYXNzKX19fXZhciBOdj0vXHMrLztmdW5jdGlvbiBEdihlKXtlLnByb3RvdHlwZS5jcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcj1mdW5jdGlvbihlKXtyZXR1cm4gcGcuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodGhpcyxlKX0sZS5wcm90b3R5cGUuY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyPWZ1bmN0aW9uKGUpe3JldHVybiBwZy5jcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXIodGhpcyxlKX0sZS5wcm90b3R5cGUuc2VsZWN0Q29tcG9uZW50PWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiBlKHQsbil7aWYobih0LiR2bm9kZXx8dC5fdm5vZGUpKXJldHVybiB0O2Zvcih2YXIgcj10LiRjaGlsZHJlbixpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPWUocltpXSxuKTtpZihvKXJldHVybiBvfX0odGhpcyxCdihlKSl9LGUucHJvdG90eXBlLnNlbGVjdEFsbENvbXBvbmVudHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe24odC4kdm5vZGV8fHQuX3Zub2RlKSYmci5wdXNoKHQpO2Zvcih2YXIgaT10LiRjaGlsZHJlbixvPTA7bzxpLmxlbmd0aDtvKyspZShpW29dLG4scik7cmV0dXJuIHJ9KHRoaXMsQnYoZSksW10pfX1mdW5jdGlvbiBSdihlLHQsbil7aWYoIWUuJHBhcmVudClyZXR1cm4iLTEiO3ZhciByPWUuJHZub2RlLGk9ci5jb250ZXh0LG89ci5kYXRhLmF0dHJzLl9pO3JldHVybiBuJiZrKHIuZGF0YSwia2V5IikmJihvPW8rIjsiK3IuZGF0YS5rZXkpLGkmJmkhPT10JiZpLl8kaWQ/aS5fJGlkKyI7Iit0Ll8kaWQrIiwiK286dC5fJGlkKyIsIitvfXZhciBGdixVdix6dj0iYW5kcm9pZCI9PT1vZy5vcy5uYW1lLnRvTG93ZXJDYXNlKCk/MzAwOjcwMCxWdj0wO2Z1bmN0aW9uIHF2KGUpe3JldHVybiBlLnByZXZlbnREZWZhdWx0PWYsZS5zdG9wUHJvcGFnYXRpb249ZiwodD1lKS5tcD1PYmplY3QuYXNzaWduKHsiQHdhcm5pbmciOiJtcCBpcyBkZXByZWNhdGVkIn0sdCksdC5fcHJvY2Vzc2VkPSEwLHQ7dmFyIHR9a2woIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe2lmKDA8KFZ2PWUuaGVpZ2h0KSl7dmFyIHQ9RnY7RnY9bnVsbCx0JiZ0KCl9fSk7dmFyIFd2PXt9O1d2WzIwXT1mdW5jdGlvbihlLHMpe2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lWzBdLG49ZVsxXSxyPWVbMl07bj1TdHJpbmcobik7dmFyIGk9cy5lbGVtZW50cy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNpZD09PXQmJmUubmlkPT09bn0pO2lmKGkpe3ZhciBvPXIudHlwZSxhPXF2KHIpOyJmb2N1cyI9PT1vfHwiYmx1ciI9PT1vP2Z1bmN0aW9uKGUsdCl7aWYoRnY9bnVsbCxVdiYmY2coVXYpLCJmb2N1cyI9PT1lLnR5cGUpe2lmKCEoMDxWdikpcmV0dXJuIFV2PXNnKGZ1bmN0aW9uKCl7ZS5kZXRhaWwuaGVpZ2h0PVZ2LHQoZSl9LHp2KSxGdj1mdW5jdGlvbigpe2NnKFV2KSxlLmRldGFpbC5oZWlnaHQ9VnYsdChlKX07ZS5kZXRhaWwuaGVpZ2h0PVZ2fXQoZSl9KGEsZnVuY3Rpb24oZSl7aS5kaXNwYXRjaEV2ZW50KG8sZSl9KTppLmRpc3BhdGNoRXZlbnQobyxhKX19KX07dmFyIEh2PWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucGFnZUlkPWUsdGhpcy5wYWdlUGF0aD10LHRoaXMucGFnZVF1ZXJ5PW4sdGhpcy5wYWdlVm09cix0aGlzLmJhdGNoRGF0YT1bXSx0aGlzLnZtcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5wYWdlQ3JlYXRlRGF0YT0hMSx0aGlzLmVsZW1lbnRzPVtdLHRoaXMuX2luaXQoKX07ZnVuY3Rpb24gR3YoZSx0LG4pe2VbdF09bn1mdW5jdGlvbiBYdihlLHQpe3ZhciBuLHIsaTtmb3IociBpbiBlKWk9ZVtyXSxfKHRbcl0saSl8fEd2KG58fChuPU9iamVjdC5jcmVhdGUobnVsbCkpLHIsaSk7cmV0dXJuIG59ZnVuY3Rpb24gSnYoZSx0LG4pe3ZhciByLGksbztmb3IociBpbiBlKWlmKGk9ZVtyXSxvPXRbcl0pe3ZhciBhPVh2KGksbyk7YSYmR3YobixyLGEpfWVsc2UgR3YobixyLGkpO3JldHVybiBufWZ1bmN0aW9uIFl2KG4scil7dmFyIGU9ci4kb3B0aW9ucy5tcE9wdGlvbnM7cmV0dXJuIGUmJkFycmF5LmlzQXJyYXkoZS5leHRlcm5hbENsYXNzZXMpJiZlLmV4dGVybmFsQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXJbZyhlKV07dCYmKG49bi5yZXBsYWNlKGUsdCkpfSksbn1mdW5jdGlvbiBLdihlLHQsbil7c3dpdGNoKHQpe2Nhc2UgbGE6bj1Zdih0aGlzLl8kc3RyaW5naWZ5Q2xhc3MobiksdGhpcyk7YnJlYWs7Y2FzZSBmYTpuPVl2KG4sdGhpcyk7YnJlYWs7Y2FzZSBkYTpuPXRoaXMuXyRub3JtYWxpemVTdHlsZUJpbmRpbmcobik7YnJlYWs7Y2FzZSBzYTpjYXNlIHVhOmNhc2UgY2E6bj1uPzE6MDticmVhaztjYXNlIGFhOnJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuXyRuZXdEYXRhW2VdfHwodGhpcy5fJG5ld0RhdGFbZV09e30pLHI9blthYV18fChuW2FhXT1bXSk7aWYodC5mb3JJdGVtcylyZXR1cm4gdC5maWxsJiZmdW5jdGlvbihlLHQpe3ZhciBuLHI7aWYoQXJyYXkuaXNBcnJheShlKXx8InN0cmluZyI9PXR5cGVvZiBlKWZvcihuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRbbl09bjtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobj0wO248ZTtuKyspdFtuXT1uO2Vsc2UgaWYoZChlKSlmb3Iobj0wLHI9T2JqZWN0LmtleXMoZSkubGVuZ3RoO248cjtuKyspdFtuXT1ufSh0LmZvckl0ZW1zLHIpLHQuZm9ySXRlbXM7dmFyIGk9dC5mb3JJbmRleCxvPXQua2V5O2sodCwia2V5SW5kZXgiKT8oIm9iamVjdCIhPXR5cGVvZiByW2ldJiYocltpXT17fSkscltpXVsiayIrdC5rZXlJbmRleF09byk6cltpXT1vO3JldHVybiBvfS5jYWxsKHRoaXMsZSxuKTtjYXNlImlzIjoiZnVuY3Rpb24iPT10eXBlb2YgbiYmKG49bi5vcHRpb25zKX1yZXR1cm4odGhpcy5fJG5ld0RhdGFbZV18fCh0aGlzLl8kbmV3RGF0YVtlXT17fSkpW3RdPW59SHYucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKCl7dmFyIGUsdCxuPXRoaXM7ZT10aGlzLnBhZ2VJZCx0PWZ1bmN0aW9uKGUpe3ZhciByO3I9bixlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXSxuPWVbMV07V3ZbdF0obixyKX0pfSwobXZbZV18fChtdltlXT1bXSkpLnB1c2godCl9LEh2LnByb3RvdHlwZS5hZGRNb3VudGVkVm09ZnVuY3Rpb24oZSl7ZS5fJG1vdW50ZWQoKSx0aGlzLmFkZFZkU3luY0NhbGxiYWNrKGZ1bmN0aW9uKCl7ZS5fX2NhbGxfaG9vaygibW91bnRlZCIpfSl9LEh2LnByb3RvdHlwZS5hZGRVcGRhdGVkVm09ZnVuY3Rpb24oZSl7ZS5fJHVwZGF0ZWQoKSx0aGlzLmFkZFZkU3luY0NhbGxiYWNrKGZ1bmN0aW9uKCl7ZS5fX2NhbGxfaG9vaygidXBkYXRlZCIpfSl9LEh2LnByb3RvdHlwZS5hZGRWZFN5bmNDYWxsYmFjaz1mdW5jdGlvbihlKXtDKGUpJiZidi5wdXNoKGUpfSxIdi5wcm90b3R5cGUuZ2V0Vm09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudm1zW2VdfSxIdi5wcm90b3R5cGUuYWRkVm09ZnVuY3Rpb24oZSl7dmFyIG49ZS5fJGlkLHQ9dGhpcy52bXNbbl07aWYodCl7dmFyIHI9UnYodCx0LiRwYXJlbnQsWGEpO3QuXyRpZD1yLHRoaXMudm1zW3JdPXQsdGhpcy5lbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2lkO2UuY2lkPXQ9PT1uP3I6dH0pfXRoaXMudm1zW25dPWV9LEh2LnByb3RvdHlwZS5yZW1vdmVWbT1mdW5jdGlvbihlKXt2YXIgdD1lLl8kaWQ7ZT09PXRoaXMudm1zW3RdJiYodGhpcy5iYXRjaERhdGE9dGhpcy5iYXRjaERhdGEuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlWzFdWzBdIT09dH0pLGRlbGV0ZSB0aGlzLnZtc1t0XSl9LEh2LnByb3RvdHlwZS5hZGRFbGVtZW50PWZ1bmN0aW9uKGUpey0xPT09dGhpcy5lbGVtZW50cy5pbmRleE9mKGUpJiZ0aGlzLmVsZW1lbnRzLnB1c2goZSl9LEh2LnByb3RvdHlwZS5yZW1vdmVFbGVtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZWxlbWVudHMuaW5kZXhPZihlKTstMSE9PXQmJnRoaXMuZWxlbWVudHMuc3BsaWNlKHQsMSl9LEh2LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPVt0LG5dO3ImJmkucHVzaChyKSx0aGlzLmJhdGNoRGF0YS5wdXNoKFtlLGldKX0sSHYucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5iYXRjaERhdGEuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZVswXT09PXQmJmVbMV1bMF09PT1ufSl9LEh2LnByb3RvdHlwZS5zZW5kUGFnZUNyZWF0ZT1mdW5jdGlvbihlKXt0aGlzLnBhZ2VDcmVhdGVEYXRhPWUsYWcucHVibGlzaEhhbmRsZXIoSmEse2RhdGE6W1syLGVdXSxvcHRpb25zOnt0aW1lc3RhbXA6RGF0ZS5ub3coKX19LFt0aGlzLnBhZ2VJZF0pfSxIdi5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXt0aGlzLmluaXRpYWxpemVkfHwodGhpcy5pbml0aWFsaXplZD0hMCx0aGlzLmJhdGNoRGF0YS5wdXNoKFsxMCxbdGhpcy5wYWdlSWQsdGhpcy5wYWdlUGF0aCx0aGlzLnBhZ2VRdWVyeV1dKSk7dmFyIGU9dGhpcy5iYXRjaERhdGEuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiEoNj09PWVbMF0mJiFPYmplY3Qua2V5cyhlWzFdWzFdKS5sZW5ndGgpfSk7dGhpcy5iYXRjaERhdGEubGVuZ3RoPTAsZS5sZW5ndGgmJmFnLnB1Ymxpc2hIYW5kbGVyKEphLHtkYXRhOmUsb3B0aW9uczp7dGltZXN0YW1wOkRhdGUubm93KCl9fSxbdGhpcy5wYWdlSWRdKX0sSHYucHJvdG90eXBlLnJlc3RvcmVQYWdlQ3JlYXRlPWZ1bmN0aW9uKCl7dGhpcy5iYXRjaERhdGEucHVzaChbMix0aGlzLnBhZ2VDcmVhdGVEYXRhXSl9LEh2LnByb3RvdHlwZS5yZXN0b3JlTW91bnRlZERhdGE9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZnVuY3Rpb24oZSl7ZS5fJGlkJiZ0LnB1c2goNCxlLl8kaWQsZS5fJGRhdGEsdm9pZCAwKSxlLiRjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBuKGUpfSl9O24odGhpcy5wYWdlVm0pfSxIdi5wcm90b3R5cGUucmVzdG9yZVBhZ2VDcmVhdGVkPWZ1bmN0aW9uKCl7dGhpcy5iYXRjaERhdGEucHVzaChbMTAsW3RoaXMucGFnZUlkLHRoaXMucGFnZVBhdGgsdGhpcy5wYWdlUXVlcnldXSl9LEh2LnByb3RvdHlwZS5yZXN0b3JlPWZ1bmN0aW9uKCl7dGhpcy5pbml0aWFsaXplZD0hMCx0aGlzLmJhdGNoRGF0YS5sZW5ndGg9MCx0aGlzLnJlc3RvcmVQYWdlQ3JlYXRlKCksdGhpcy5yZXN0b3JlTW91bnRlZERhdGEoKSx0aGlzLnJlc3RvcmVQYWdlQ3JlYXRlZCgpLHRoaXMuZmx1c2goKX0sSHYucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZTt0aGlzLmJhdGNoRGF0YS5sZW5ndGg9MCx0aGlzLnZtcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5lbGVtZW50cy5sZW5ndGg9MCxlPXRoaXMucGFnZUlkLGRlbGV0ZSBtdltlXX07dmFyIFp2PVsib25MYXVuY2giLCJvblNob3ciLCJvbkhpZGUiLCJvblVuaU5WaWV3TWVzc2FnZSIsIm9uUGFnZU5vdEZvdW5kIiwib25UaGVtZUNoYW5nZSIsIm9uRXJyb3IiLCJvblVuaGFuZGxlZFJlamVjdGlvbiIsIm9uSW5pdCIsIm9uTG9hZCIsIm9uUmVhZHkiLCJvblVubG9hZCIsIm9uUHVsbERvd25SZWZyZXNoIiwib25SZWFjaEJvdHRvbSIsIm9uVGFiSXRlbVRhcCIsIm9uQWRkVG9GYXZvcml0ZXMiLCJvblNoYXJlVGltZWxpbmUiLCJvblNoYXJlQXBwTWVzc2FnZSIsIm9uUmVzaXplIiwib25QYWdlU2Nyb2xsIiwib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIiwib25CYWNrUHJlc3MiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIiwib25QYWdlU2hvdyIsIm9uUGFnZUhpZGUiLCJvblBhZ2VSZXNpemUiLCJvblNlcnZpY2VDcmVhdGVkIiwib25TZXJ2aWNlQXR0YWNoZWQiXSxRdj1bImRhdGEiLCJwcm9wZXJ0aWVzIiwib3B0aW9ucyIsInJlbGF0aW9ucyJdO2Z1bmN0aW9uIGVnKGksbyl7dmFyIGUsdDtRdi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0LG4scjt0PWksKG49bylbcj1lXSYmT2JqZWN0LmFzc2lnbih0W3JdfHwodFtyXT17fSksbltyXSl9KSxvLmV4dGVybmFsQ2xhc3NlcyYmKGU9aS5leHRlcm5hbENsYXNzZXN8fChpLmV4dGVybmFsQ2xhc3Nlcz1bXSksdD1vLmV4dGVybmFsQ2xhc3NlcyxlLnB1c2guYXBwbHkoZSx0KSksby5wYXRoJiYoaS5wYXRoPW8ucGF0aCl9ZnVuY3Rpb24gdGcoZyl7IWZ1bmN0aW9uKGUpe3ZhciBpPWUuZXh0ZW5kO2UuZXh0ZW5kPWZ1bmN0aW9uKHQpe3ZhciBuPSh0PXR8fHt9KS5tZXRob2RzO24mJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7LTEhPT1adi5pbmRleE9mKGUpJiYodFtlXT1uW2VdLGRlbGV0ZSBuW2VdKX0pO3ZhciBlPXQuc2V0dXA7aWYoZSl7dmFyIHI9IiI7dHJ5e3I9ZS50b1N0cmluZygpfWNhdGNoKGUpe31bIm9uUGFnZVNjcm9sbCIsIm9uUmVhY2hCb3R0b20iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuaW5kZXhPZigidW5pQXBwLiIrZSkmJiF0W2VdJiYodFtlXT1bZnVuY3Rpb24oKXt9XSl9KX1yZXR1cm4gaS5jYWxsKHRoaXMsdCl9O3ZhciB0PWUuY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcyxuPXQuY3JlYXRlZDtadi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09bn0pLHQubXBPcHRpb25zPWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuIHQ7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZWcobixlKSx0JiZlZyhuLHQpLG59fShnKSxnLm1peGluKHtiZWZvcmVDcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy4kb3B0aW9ucztlLnN0b3JlJiYhZy5wcm90b3R5cGUuJHN0b3JlJiYoZy5wcm90b3R5cGUuJHN0b3JlPWUuc3RvcmUpO3ZhciBuLHIsaSxvLGEscyxjLHUsbCxkLGY9ZS53eHM7aWYoZiYmT2JqZWN0LmtleXMoZikuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZbZV19KSwicGFnZSI9PT10aGlzLm1wVHlwZSl7dmFyIHA9aGcoKTtwLiR2bSYmcC4kdm0uJGkxOG4mJih0aGlzLl9pMThuPXAuJHZtLiRpMThuKSx0aGlzLiRzY29wZT10aGlzLiRvcHRpb25zLnBhZ2VJbnN0YW5jZSxkZWxldGUodGhpcy4kc2NvcGUuJHZtPXRoaXMpLiRvcHRpb25zLnBhZ2VJbnN0YW5jZTt2YXIgaD10aGlzLiRzY29wZS5yb3V0ZSx2PXRoaXMuJHNjb3BlLiRwYWdlLmlkO3RoaXMuXyR2ZC5zZW5kUGFnZUNyZWF0ZShbdixoLChuPXRoaXMscj1oLGk9Ii8iK3Isbz1mZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1pfSksYT1PYmplY3QuYXNzaWduKHt9LGRnLndpbmRvdyxvLndpbmRvdykscz0hMD09PWEuZGlzYWJsZVNjcm9sbD8xOjAsYz1rKGEsIm9uUmVhY2hCb3R0b21EaXN0YW5jZSIpP3BhcnNlSW50KGEub25SZWFjaEJvdHRvbURpc3RhbmNlKTppYSx1PUx1KG4uJG9wdGlvbnMsIm9uUGFnZVNjcm9sbCIpPzE6MCxsPUx1KG4uJG9wdGlvbnMsIm9uUmVhY2hCb3R0b20iKT8xOjAsZD1xYSgpLHt2ZXJzaW9uOlhhLGxvY2FsZTppZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0TGFuZ3VhZ2UoKSxkaXNhYmxlU2Nyb2xsOnMsb25QYWdlU2Nyb2xsOnUsb25QYWdlUmVhY2hCb3R0b206bCxvblJlYWNoQm90dG9tRGlzdGFuY2U6YyxzdGF0dXNiYXJIZWlnaHQ6ZCx3aW5kb3dUb3A6YS50aXRsZU5WaWV3JiYiZmxvYXQiPT09YS50aXRsZU5WaWV3LnR5cGU/ZCt0dDowLHdpbmRvd0JvdHRvbTowPD1xcy5pbmRleE9mKHIpJiZxcy5jb3Zlcj9xcy5oZWlnaHQ6MH0pXSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJihmdih0aGlzLiRzY29wZSwib25Mb2FkIixmdW5jdGlvbihuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9e307cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24odCl7dHJ5e3JbdF09TyhuW3RdKX1jYXRjaChlKXtyW3RdPW5bdF19fSkscn0odGhpcy4kb3B0aW9ucy5wYWdlUXVlcnkpKSxmdih0aGlzLiRzY29wZSwib25TaG93IikpfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJmZ2KHRoaXMuJHNjb3BlLCJvblVubG9hZCIpfSxtb3VudGVkOmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJihmdih0aGlzLiRzY29wZSwib25SZWFkeSIpLGZ1bmN0aW9uKGUpe2lmKGRnLnByZWxvYWRSdWxlKXt2YXIgdD1kZy5wcmVsb2FkUnVsZVtlXTt0JiZBcnJheS5pc0FycmF5KHQucGFja2FnZXMpJiZ0LnBhY2thZ2VzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4tMT09PWJzLmluZGV4T2YoZSl9KS5sZW5ndGgmJlNzKHQucGFja2FnZXMpfX0odGhpcy4kc2NvcGUucm91dGUpKX19KX12YXIgbmc9e2luc3RhbGw6ZnVuY3Rpb24obyxlKXt2YXIgdCxuOyFmdW5jdGlvbihvKXtvLmNvbmZpZy5lcnJvckhhbmRsZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXAoZSk7by51dGlsLndhcm4oIkVycm9yIGluICIrbisnOiAiJysoIkVycm9yIj09PXI/ZS50b1N0cmluZygpOmUpKyciJyx0KTt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgaGcmJmhnKCk7aSYmTHUoaS4kb3B0aW9ucywib25FcnJvciIpP2kuX19jYWxsX2hvb2soIm9uRXJyb3IiLGUpOmNvbnNvbGUuZXJyb3IoZSl9O3ZhciB0PW8uY29uZmlnLmlzUmVzZXJ2ZWRUYWc7by5jb25maWcuaXNSZXNlcnZlZFRhZz1mdW5jdGlvbihlKXtyZXR1cm4tMSE9PUx2LmluZGV4T2YoZSl8fHQoZSl9LG8uY29uZmlnLmlnbm9yZWRFbGVtZW50cz1Mdjt2YXIgbj1vLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2Uscj1bInN3aXRjaCIsImltYWdlIiwidGV4dCIsInZpZXciXTtvLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIX5yLmluZGV4T2YoZSkmJm4oZSl9fShvKSwodD1vKS5wcm90b3R5cGUuXyRzPUt2LHQucHJvdG90eXBlLl8kc2V0RGF0YT1mdW5jdGlvbihlLHQpe3RoaXMuXyR2ZC5wdXNoKGUsdGhpcy5fJGlkLHQsND09PWUmJnZvaWQgMCl9LHQucHJvdG90eXBlLl8kbW91bnRlZD1mdW5jdGlvbigpe3RoaXMuXyR2ZCYmKEp2KHRoaXMuXyRuZXdEYXRhLHRoaXMuXyRkYXRhLHRoaXMuXyR2ZE1vdW50ZWREYXRhKSx0aGlzLl8kZGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuXyRuZXdEYXRhKSksInBhZ2UiPT09dGhpcy5tcFR5cGUmJnRoaXMuXyR2ZC5mbHVzaCgpKX0sdC5wcm90b3R5cGUuXyR1cGRhdGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl8kdmQmJihKdih0aGlzLl8kbmV3RGF0YSx0aGlzLl8kZGF0YSx0aGlzLl8kdmRVcGRhdGVkRGF0YSksdGhpcy5fJGRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLl8kbmV3RGF0YSkpLHRoaXMuXyR2ZC5pbml0aWFsaXplZCYmc2coZnVuY3Rpb24oKXtlLiRuZXh0VGljayhlLl8kdmQuZmx1c2guYmluZChlLl8kdmQpKX0sMCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIl8kdmQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC5fJHZkb21TeW5jfX0pLHQubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3RoaXMuJG9wdGlvbnMubXBUeXBlJiYodGhpcy5tcFR5cGU9dGhpcy4kb3B0aW9ucy5tcFR5cGUpLCJhcHAiIT09dGhpcy5tcFR5cGUmJigicGFnZSI9PT10aGlzLm1wVHlwZSYmKHRoaXMuXyR2ZG9tU3luYz1uZXcgSHYodGhpcy4kb3B0aW9ucy5wYWdlSWQsdGhpcy4kb3B0aW9ucy5wYWdlUGF0aCx0aGlzLiRvcHRpb25zLnBhZ2VRdWVyeSx0aGlzKSksdGhpcy5fJHZkJiYodGhpcy5fJGlkPVJ2KHRoaXMsdGhpcy4kcGFyZW50LFhhKSx0aGlzLl8kdmQuYWRkVm0odGhpcyksdGhpcy5fJHZkTW91bnRlZERhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl8kc2V0RGF0YSg0LHRoaXMuXyR2ZE1vdW50ZWREYXRhKSx0aGlzLl8kZGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRuZXdEYXRhPU9iamVjdC5jcmVhdGUobnVsbCkpKX0sYmVmb3JlVXBkYXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5fJHZkKXt2YXIgZT10aGlzLl8kdmQuZmluZCg0LHRoaXMuXyRpZCk7ZT8odGhpcy5fJGRhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl8kdmRVcGRhdGVkRGF0YT1lWzFdWzFdPU9iamVjdC5jcmVhdGUobnVsbCkpOih0aGlzLl8kdmRVcGRhdGVkRGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRzZXREYXRhKDYsdGhpcy5fJHZkVXBkYXRlZERhdGEpKSx0aGlzLl8kbmV3RGF0YT1PYmplY3QuY3JlYXRlKG51bGwpfX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuXyR2ZCYmKHRoaXMuXyR2ZC5yZW1vdmVWbSh0aGlzKSx0aGlzLl8kdmRvbVN5bmMmJnRoaXMuXyR2ZG9tU3luYy5kZXN0cm95KCkpfX0pLHRnKG8pLER2KG8pLChuPW8pLnByb3RvdHlwZS51bmlJREhhc1JvbGU9ZnVuY3Rpb24oZSl7cmV0dXJuLTE8YygpLnJvbGUuaW5kZXhPZihlKX0sbi5wcm90b3R5cGUudW5pSURIYXNQZXJtaXNzaW9uPWZ1bmN0aW9uKGUpe3ZhciB0PWMoKS5wZXJtaXNzaW9uO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8LTE8dC5pbmRleE9mKGUpfSxuLnByb3RvdHlwZS51bmlJRFRva2VuVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLnRva2VuRXhwaXJlZD5EYXRlLm5vdygpfSxvLnByb3RvdHlwZS5nZXRPcGVuZXJFdmVudENoYW5uZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsfHwodGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsPW5ldyBQdSksdGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoby5wcm90b3R5cGUsIiRwYWdlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvb3QuJHNjb3BlLiRwYWdlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwiJG1wIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue3BhZ2U6dGhpcy4kcm9vdC4kc2NvcGV9fX0pO3ZhciByPW8ucHJvdG90eXBlLiRtb3VudDtvLnByb3RvdHlwZS4kbW91bnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCJhcHAiPT09dGhpcy5tcFR5cGUpe2lmKHRoaXMuJG9wdGlvbnMucmVuZGVyPWZ1bmN0aW9uKCl7fSxpZy5jb25maWcucHJlbG9hZClyZXR1cm4gdm9pZCBpZy5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLmFkZEV2ZW50TGlzdGVuZXIoImxhdW5jaEFwcCIsZnVuY3Rpb24oKXtvZy51cGRhdGVDb25maWdJbmZvJiZvZy51cGRhdGVDb25maWdJbmZvKCksanYobixvKSxyLmNhbGwobixlLHQpfSk7anYodGhpcyxvKX1yZXR1cm4gci5jYWxsKHRoaXMsZSx0KX0sby5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMscj10aGlzLl93YXRjaGVyLGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQsZT1uZXcgUHJvbWlzZShmdW5jdGlvbihlKXtyJiZuLl8kcXVldWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gcj09PWV9KT9idi5wdXNoKGk/dC5iaW5kKG4pOmUpOm8ubmV4dFRpY2soaT9mdW5jdGlvbigpe3JldHVybiB0LmNhbGwobil9OmUpLGkmJmUoKX0pO3JldHVybiBpP3ZvaWQgMDplfX19O3JldHVybiB1di5fXyR3eF9fPWx2LGFnLnB1Ymxpc2hIYW5kbGVyPWZ1bmN0aW9uKGUsdCxuKXt0PUpTT04uc3RyaW5naWZ5KHQpLEFycmF5LmlzQXJyYXkobil8fChuPVtuXSk7dmFyIHI9InR5cGVvZiBVbmlWaWV3SlNCcmlkZ2UgIT09ICd1bmRlZmluZWQnICYmIFVuaVZpZXdKU0JyaWRnZS5zdWJzY3JpYmVIYW5kbGVyKFwiIitlKyciLCcrdCsiLF9fUEFHRV9JRF9fKSI7bi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW9nLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoU3RyaW5nKGUpKTt0JiZ0LmV2YWxKUyhyLnJlcGxhY2UoIl9fUEFHRV9JRF9fIixlKSl9KX0sYWcuaW52b2tlQ2FsbGJhY2tIYW5kbGVyPU5yLGFnLnJlbW92ZUNhbGxiYWNrSGFuZGxlcj1mdW5jdGlvbihlKXtkZWxldGUgTHJbZV19LHtfX3Z1ZVBsdWdpbjpuZyxfX2RlZmluZVBhZ2U6ZnVuY3Rpb24oZSx0KXt5c1tlXT10fSxfX3JlZ2lzdGVyQXBwOmp2LF9fcmVnaXN0ZXJQYWdlOmpzLHVuaTp1dixnZXRBcHA6SXYsZ2V0Q3VycmVudFBhZ2VzOlBzLEV2ZW50Q2hhbm5lbDpQdX19KCkscGc9dC51bmksaGc9dC5nZXRBcHAsdmc9dC5nZXRDdXJyZW50UGFnZXM7cmV0dXJuIHR9ZnVuY3Rpb24gY3JlYXRlUmVxdWVzdFBlcm1pc3Npb25MaXN0ZW5lcihlKXt2YXIgdD1lLnJlZ2lzdGVyVVRTSW50ZXJmYWNlLG49KGUuaW5pdFVUU1Byb3h5Q2xhc3MsZS5pbml0VVRTUHJveHlGdW5jdGlvbikscj1lLmluaXRVVFNQYWNrYWdlTmFtZSxpPWUuaW5pdFVUU0luZGV4Q2xhc3NOYW1lLG89ZS5pbml0VVRTQ2xhc3NOYW1lLGE9IkRDbG91ZFVuaUNyZWF0ZVJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXIiLHM9InVuaS1jcmVhdGVSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyIixjPXIoYSwhMCksdT1pKGEsITApO3QoIlJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXJPcHRpb25zIixPYmplY3QuYXNzaWduKHttb2R1bGVOYW1lOnMsbW9kdWxlVHlwZToiYnVpbHQtaW4iLGVyck1zZzoiIixwYWNrYWdlOmMsY2xhc3M6byhhLCJSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyQnlKc1Byb3h5IiwhMCl9LHttZXRob2RzOntvblJlcXVlc3RCeUpzOnthc3luYzohMSxwYXJhbXM6W3tuYW1lOiJjYWxsYmFjayIsdHlwZToiVVRTQ2FsbGJhY2sifV0scmV0dXJuOnt9fSxvbkNvbmZpcm1CeUpzOnthc3luYzohMSxwYXJhbXM6W3tuYW1lOiJjYWxsYmFjayIsdHlwZToiVVRTQ2FsbGJhY2sifV0scmV0dXJuOnt9fSxvbkNvbXBsZXRlQnlKczp7YXN5bmM6ITEscGFyYW1zOlt7bmFtZToiY2FsbGJhY2siLHR5cGU6IlVUU0NhbGxiYWNrIn1dLHJldHVybjp7fX0sc3RvcEJ5SnM6e2FzeW5jOiExLHBhcmFtczpbXSxyZXR1cm46e319fSxwcm9wczpbXX0pKSxlLmNyZWF0ZVJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXI9bighMSx7bW9kdWxlTmFtZTpzLG1vZHVsZVR5cGU6ImJ1aWx0LWluIixlcnJNc2c6IiIsbWFpbjohMCxwYWNrYWdlOmMsY2xhc3M6dSxuYW1lOiJjcmVhdGVSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyQnlKcyIscGFyYW1zOltdLHJldHVybjp7dHlwZToiaW50ZXJmYWNlIixvcHRpb25zOiJSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyT3B0aW9ucyJ9fSl9ZnVuY3Rpb24gZXhpdChlKXtlLnJlZ2lzdGVyVVRTSW50ZXJmYWNlLGUuaW5pdFVUU1Byb3h5Q2xhc3M7dmFyIHQ9ZS5pbml0VVRTUHJveHlGdW5jdGlvbixuPWUuaW5pdFVUU1BhY2thZ2VOYW1lLHI9ZS5pbml0VVRTSW5kZXhDbGFzc05hbWUsaT0oZS5pbml0VVRTQ2xhc3NOYW1lLCJEQ2xvdWRVbmlFeGl0Iiksbz1uKGksITApLGE9cihpLCEwKTtlLmV4aXQ9dCghMSx7bW9kdWxlTmFtZToidW5pLWV4aXQiLG1vZHVsZVR5cGU6ImJ1aWx0LWluIixlcnJNc2c6IiIsbWFpbjohMCxwYWNrYWdlOm8sY2xhc3M6YSxuYW1lOiJleGl0QnlKcyIscGFyYW1zOlt7bmFtZToib3B0aW9ucyIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUV4aXRFeGl0T3B0aW9uc0pTT05PYmplY3QiLGRlZmF1bHQ6IlVUU051bGwifV0scmV0dXJuOiIifSl9ZnVuY3Rpb24gZmFjaWFsUmVjb2duaXRpb25WZXJpZnkoZSl7ZS5yZWdpc3RlclVUU0ludGVyZmFjZSxlLmluaXRVVFNQcm94eUNsYXNzO3ZhciB0PWUuaW5pdFVUU1Byb3h5RnVuY3Rpb24sbj1lLmluaXRVVFNQYWNrYWdlTmFtZSxyPWUuaW5pdFVUU0luZGV4Q2xhc3NOYW1lLGk9KGUuaW5pdFVUU0NsYXNzTmFtZSwiRENsb3VkVW5pRmFjaWFsUmVjb2duaXRpb25WZXJpZnkiKSxvPSJGYWNpYWxSZWNvZ25pdGlvblZlcmlmeSjlrp7kurrorqTor4EpIixhPW4oaSwhMCkscz1yKGksITApO2Uuc3RhcnRGYWNpYWxSZWNvZ25pdGlvblZlcmlmeT10KCExLHttb2R1bGVOYW1lOm8sbW9kdWxlVHlwZToiYnVpbHQtaW4iLGVyck1zZzoiIixtYWluOiEwLHBhY2thZ2U6YSxjbGFzczpzLG5hbWU6InN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlCeUpzIixwYXJhbXM6W3tuYW1lOiJmYWNlU3R5bGUiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGYWNpYWxSZWNvZ25pdGlvblZlcmlmeVN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46IiJ9KSxlLmdldEZhY2lhbFJlY29nbml0aW9uTWV0YUluZm89dCghMSx7bW9kdWxlTmFtZTpvLG1vZHVsZVR5cGU6ImJ1aWx0LWluIixlcnJNc2c6IiIsbWFpbjohMCxwYWNrYWdlOmEsY2xhc3M6cyxuYW1lOiJnZXRGYWNpYWxSZWNvZ25pdGlvbk1ldGFJbmZvQnlKcyIscGFyYW1zOltdLHJldHVybjoiIn0pfWZ1bmN0aW9uIGluc3RhbGxBcGsoZSl7ZS5yZWdpc3RlclVUU0ludGVyZmFjZSxlLmluaXRVVFNQcm94eUNsYXNzO3ZhciB0PWUuaW5pdFVUU1Byb3h5RnVuY3Rpb24sbj1lLmluaXRVVFNQYWNrYWdlTmFtZSxyPWUuaW5pdFVUU0luZGV4Q2xhc3NOYW1lLGk9KGUuaW5pdFVUU0NsYXNzTmFtZSwiRENsb3VkVW5pSW5zdGFsbEFwayIpLG89bihpLCEwKSxhPXIoaSwhMCk7ZS5pbnN0YWxsQXBrPXQoITEse21vZHVsZU5hbWU6InVuaS1pbnN0YWxsQXBrIixtb2R1bGVUeXBlOiJidWlsdC1pbiIsZXJyTXNnOiIiLG1haW46ITAscGFja2FnZTpvLGNsYXNzOmEsbmFtZToiaW5zdGFsbEFwa0J5SnMiLHBhcmFtczpbe25hbWU6Im9wdGlvbnMiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlJbnN0YWxsQXBrSW5zdGFsbEFwa09wdGlvbnNKU09OT2JqZWN0In1dLHJldHVybjoiIn0pfWZ1bmN0aW9uIGluaXRVbmlFeHRBcGlzKGUpe2NyZWF0ZVJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXIoZSksZXhpdChlKSxmYWNpYWxSZWNvZ25pdGlvblZlcmlmeShlKSxpbnN0YWxsQXBrKGUpfWZ1bmN0aW9uIGluaXRTZXJ2aWNlSlNCcmlkZ2UoZSl7dmFyIHI9bmV3IGU7VW5pU2VydmljZUpTQnJpZGdlPXtvbjpyLiRvbi5iaW5kKHIpLG9mZjpyLiRvZmYuYmluZChyKSxvbmNlOnIuJG9uY2UuYmluZChyKSxlbWl0OnIuJGVtaXQuYmluZChyKSxzdWJzY3JpYmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci4kb24oInZpZXcuIitlLHQpfSx1bnN1YnNjcmliZTpmdW5jdGlvbihlLHQpe3JldHVybiByLiRvZmYoInZpZXcuIitlLHQpfSxzdWJzY3JpYmVIYW5kbGVyOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gci4kZW1pdCgidmlldy4iK2UsdCxuKX19fWZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlQ29udGV4dCQxKGUpe3ZhciB0LG49ZS53ZWV4LHI9ZS5WdWUsaT1uZXcgZS5XZWV4UGx1cyhuKTsoVW5pU2VydmljZUpTQnJpZGdlfHxpbml0U2VydmljZUpTQnJpZGdlKHIpLHVuaSl8fCh0PWNyZWF0ZVNlcnZpY2VDb250ZXh0KHIsbixpLFVuaVNlcnZpY2VKU0JyaWRnZSxlKSxfX3Z1ZVBsdWdpbj10Ll9fdnVlUGx1Z2luLF9fZGVmaW5lUGFnZT10Ll9fZGVmaW5lUGFnZSxfX3JlZ2lzdGVyQXBwPXQuX19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZT10Ll9fcmVnaXN0ZXJQYWdlLHVuaT10LnVuaSxnZXRBcHA9dC5nZXRBcHAsZ2V0Q3VycmVudFBhZ2VzPXQuZ2V0Q3VycmVudFBhZ2VzLGluaXRVbmlFeHRBcGlzKHVuaSkpO3JldHVybntfX3Z1ZVBsdWdpbjpfX3Z1ZVBsdWdpbixfX2RlZmluZVBhZ2U6X19kZWZpbmVQYWdlLF9fcmVnaXN0ZXJBcHA6X19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZTpfX3JlZ2lzdGVyUGFnZSxwbHVzOmksdW5pOnVuaSx3eDp1bmkuX18kd3hfX3x8dW5pLGdldEFwcDpnZXRBcHAsZ2V0Q3VycmVudFBhZ2VzOmdldEN1cnJlbnRQYWdlcyxVbmlTZXJ2aWNlSlNCcmlkZ2U6VW5pU2VydmljZUpTQnJpZGdlfX1mdW5jdGlvbiBzdHlsZU1peGluKGUpe2UucHJvdG90eXBlLl9fbWVyZ2Vfc3R5bGU9ZnVuY3Rpb24ocixlKXtpZih2b2lkIDA9PT1yJiYocj17fSkscil7dmFyIGk9ZXx8dGhpcy4kb3B0aW9ucy5zdHlsZTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWlbZV07aWYodCl7dmFyIG49cltlXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBhPW5bZV0scz10W2VdOyJvYmplY3QiPT10eXBlb2YgYT8oIm9iamVjdCIhPXR5cGVvZiBzJiYocz10W2VdPXt9KSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PSEwO2lmKHNbZV0pZm9yKHZhciBuPWFbZV0uc2xpY2UoMSwzKSxyPXNbZV0uc2xpY2UoMSwzKSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPW5baV0tcltpXTtpZigwIT09byl7dD0wPG87YnJlYWt9fXQmJihzW2VdPWFbZV0pfSkpOnRbZV09YX0pfWVsc2UgaVtlXT1PYmplY3QuYXNzaWduKHt9LHJbZV0pfSksZXx8KHRoaXMuJG9wdGlvbnMuc3R5bGU9aSl9fX1mdW5jdGlvbiBiNjREZWNvZGVVbmljb2RlKGUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYXRvYihlKS5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiIlIisoIjAwIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKCIiKSl9ZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJJbmZvKCl7dmFyIGUsdD10aGlzLnVuaS5nZXRTdG9yYWdlU3luYygidW5pX2lkX3Rva2VuIil8fCIiLG49dC5zcGxpdCgiLiIpO2lmKCF0fHwzIT09bi5sZW5ndGgpcmV0dXJue3VpZDpudWxsLHJvbGU6W10scGVybWlzc2lvbjpbXSx0b2tlbkV4cGlyZWQ6MH07dHJ5e2U9SlNPTi5wYXJzZShiNjREZWNvZGVVbmljb2RlKG5bMV0pKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIuiOt+WPluW9k+WJjeeUqOaIt+S/oeaBr+WHuumUme+8jOivpue7humUmeivr+S/oeaBr+S4uu+8miIrZS5tZXNzYWdlKX1yZXR1cm4gZS50b2tlbkV4cGlyZWQ9MWUzKmUuZXhwLGRlbGV0ZSBlLmV4cCxkZWxldGUgZS5pYXQsZX1mdW5jdGlvbiB1bmlJZE1peGluKGUsbil7ZS5wcm90b3R5cGUudW5pSURIYXNSb2xlPWZ1bmN0aW9uKGUpe3JldHVybi0xPGdldEN1cnJlbnRVc2VySW5mby5iaW5kKG4pKCkucm9sZS5pbmRleE9mKGUpfSxlLnByb3RvdHlwZS51bmlJREhhc1Blcm1pc3Npb249ZnVuY3Rpb24oZSl7dmFyIHQ9Z2V0Q3VycmVudFVzZXJJbmZvLmJpbmQobikoKS5wZXJtaXNzaW9uO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8LTE8dC5pbmRleE9mKGUpfSxlLnByb3RvdHlwZS51bmlJRFRva2VuVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0Q3VycmVudFVzZXJJbmZvLmJpbmQobikoKS50b2tlbkV4cGlyZWQ+RGF0ZS5ub3coKX19V2VleEluc3RhbmNlLnByb3RvdHlwZS5yZXF1aXJlTW9kdWxlPWZ1bmN0aW9uKG4pe3ZhciByPWdldElkKHRoaXMpO2lmKHImJnRoaXMuZG9jdW1lbnQmJnRoaXMuZG9jdW1lbnQudGFza0NlbnRlcil7aWYoaXNSZWdpc3RlcmVkTW9kdWxlKG4pKXt2YXIgZT17fSx0PWdldE1vZHVsZURlc2NyaXB0aW9uKG4pLGk9ZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZU1vZHVsZUdldHRlcihuLHQsbW9kdWxlR2V0dGVyKHIsbix0KSl9LHNldDpmdW5jdGlvbihlKXtyZXR1cm4gbW9kdWxlU2V0dGVyKHIsbix0LGUpfX0pfTtmb3IodmFyIG8gaW4gdClpKG8pO3JldHVybiBlfWNvbnNvbGUud2FybigiW0pTIEZyYW1ld29ya10g5b2T5YmN6L+Q6KGM55qE5Z+65bqn5LiN5YyF5ZCr5Y6f55Sf5o+S5Lu2WyIrbisiXe+8jOivt+WcqG1hbmlmZXN05Lit6YWN572u6K+l5o+S5Lu277yM6YeN5paw5Yi25L2c5YyF5ous6K+l5Y6f55Sf5o+S5Lu255qE6Ieq5a6a5LmJ6L+Q6KGM5Z+65bqnIil9ZWxzZSBjb25zb2xlLmVycm9yKCdbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gcmVxdWlyZU1vZHVsZSgiJytuKyciKSwgaW5zdGFuY2UgKCcrcisiKSBkb2Vzbid0IGV4aXN0IGFueW1vcmUuIil9LFdlZXhJbnN0YW5jZS5wcm90b3R5cGUuc3VwcG9ydHM9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBudWxsO3ZhciB0PWUubWF0Y2goL15AKFx3KylcLyhbXHctXSspKFwuKFx3KykpPyQvaSk7aWYodCl7dmFyIG49dFsxXSxyPXRbMl0saT10WzRdO3N3aXRjaChuKXtjYXNlIm1vZHVsZSI6cmV0dXJuIGlzUmVnaXN0ZXJlZE1vZHVsZShyLGkpO2Nhc2UiY29tcG9uZW50IjpyZXR1cm4gaXNSZWdpc3RlcmVkQ29tcG9uZW50KHIpfX1yZXR1cm4gbnVsbH0sV2VleEluc3RhbmNlLnByb3RvdHlwZS5pbXBvcnRTY3JpcHQ9ZnVuY3Rpb24oZSxyKXt2b2lkIDA9PT1yJiYocj17fSk7dmFyIGk9Z2V0SWQodGhpcyksbz1nZXRUYXNrQ2VudGVyKGkpO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe28mJiJmdW5jdGlvbiI9PXR5cGVvZiBvLnNlbmR8fG4obmV3IEVycm9yKCdbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gaW1wb3J0IHNjcmlwdCAiJytlKyciLCBubyB0YXNrQ2VudGVyICgnK2krIikgbWF0Y2hlZC4iKSk7dHJ5e28uc2VuZCgibW9kdWxlIix7bW9kdWxlOiJzY3JpcHQiLG1ldGhvZDoiaW1wb3J0U2NyaXB0In0sW2Uscl0se2NhbGxiYWNrOltmdW5jdGlvbihlKXtyZXR1cm4gdChlKX0sZnVuY3Rpb24oZSl7cmV0dXJuIG4oZSl9XX0pfWNhdGNoKGUpe24oZSl9fSl9O3ZhciBkZWNvZGU9ZGVjb2RlVVJJQ29tcG9uZW50O2Z1bmN0aW9uIHBhcnNlUXVlcnkoZSl7dmFyIGk9e307cmV0dXJuKGU9ZS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIikpJiZlLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLG49ZGVjb2RlKHQuc2hpZnQoKSkscj0wPHQubGVuZ3RoP2RlY29kZSh0LmpvaW4oIj0iKSk6bnVsbDt2b2lkIDA9PT1pW25dP2lbbl09cjpBcnJheS5pc0FycmF5KGlbbl0pP2lbbl0ucHVzaChyKTppW25dPVtpW25dLHJdfSksaX12YXIgTElGRUNZQ0xFX0hPT0tTPVsib25MYXVuY2giLCJvblNob3ciLCJvbkhpZGUiLCJvblVuaU5WaWV3TWVzc2FnZSIsIm9uUGFnZU5vdEZvdW5kIiwib25UaGVtZUNoYW5nZSIsIm9uRXJyb3IiLCJvblVuaGFuZGxlZFJlamVjdGlvbiIsIm9uTG9hZCIsIm9uUmVhZHkiLCJvblVubG9hZCIsIm9uUHVsbERvd25SZWZyZXNoIiwib25SZWFjaEJvdHRvbSIsIm9uVGFiSXRlbVRhcCIsIm9uQWRkVG9GYXZvcml0ZXMiLCJvblNoYXJlVGltZWxpbmUiLCJvblNoYXJlQXBwTWVzc2FnZSIsIm9uUmVzaXplIiwib25QYWdlU2Nyb2xsIiwib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIiwib25CYWNrUHJlc3MiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsIm9uUGFnZVNob3ciLCJvblBhZ2VIaWRlIiwib25QYWdlUmVzaXplIl07ZnVuY3Rpb24gcGFyc2VRdWVyeUJ5QnVuZGxlVXJsKGUpe3ZhciB0PXt9O2lmKGUmJiJzdHJpbmciPT10eXBlb2YgZSl7dmFyIG49ZS5pbmRleE9mKCI/Iik7aWYoLTEhPT1uKXt2YXIgcj1lLnN1YnN0cihuKzEpOyIuanMiPT09ci5zdWJzdHIoLTMpJiYocj1yLnN1YnN0cigwLHIubGVuZ3RoLTMpKSx0PXBhcnNlUXVlcnkocil9fXJldHVybiB0fXZhciBJTlNUQU5DRV9JRD0iW1tDdXJyZW50SW5zdGFuY2VJZF1dIjtmdW5jdGlvbiBnZXRJZCQxKGUpe3JldHVybiBlW0lOU1RBTkNFX0lEXX1mdW5jdGlvbiBpbml0U2NvcGUodCxlKXt2YXIgbj1lLmdldEN1cnJlbnRQYWdlcygpLHI9bltuLmxlbmd0aC0xXTtpZih0aGlzLiRvcHRpb25zLnJvdXRlPT09ci5yb3V0ZSlyLiR2bT10aGlzLHJbSU5TVEFOQ0VfSURdPWdldElkJDEodCk7ZWxzZSBpZih0LmNvbmZpZy5vbGRJbnN0YW5jZUlkKXt2YXIgaT1lLmdldEN1cnJlbnRQYWdlcyghMCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZ2V0SWQkMShlKT09PXQuY29uZmlnLm9sZEluc3RhbmNlSWR9KTtpJiYoaS4kdm09dGhpcyl9dGhpcy4kc2NvcGU9cn1mdW5jdGlvbiBsaWZlY3ljbGVNaXhpbihyLGksbyl7dmFyIHQ9ci5jb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzLG49dC5jcmVhdGVkO0xJRkVDWUNMRV9IT09LUy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09bn0pO3ZhciBhPXBhcnNlUXVlcnlCeUJ1bmRsZVVybChpLmNvbmZpZy5idW5kbGVVcmwpO3IubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fJHdlZXg9aTt0cnl7dmFyIHQ9by5nZXRBcHAoe2FsbG93RGVmYXVsdDohMH0pO3QmJiF0aGlzLiRzdG9yZSYmKHQuJHN0b3JlfHx0LiR2bSYmdC4kdm0uJHN0b3JlKSYmKHRoaXMuJHN0b3JlPXQuJHN0b3JlfHx0LiR2bS4kc3RvcmUpfWNhdGNoKGUpe31zd2l0Y2godGhpcy4kb3B0aW9ucy5tcFR5cGUpe2Nhc2UiYXBwIjppZih0aGlzLm1wVHlwZT0iYXBwIix0aGlzLiRvcHRpb25zLnJlbmRlcj1mdW5jdGlvbigpe30sby53ZWV4LmNvbmZpZy5wcmVsb2FkKW8ud2VleC5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLmFkZEV2ZW50TGlzdGVuZXIoImxhdW5jaEFwcCIsZnVuY3Rpb24oKXtvLnBsdXMudXBkYXRlQ29uZmlnSW5mbyYmby5wbHVzLnVwZGF0ZUNvbmZpZ0luZm8oKSxvLl9fcmVnaXN0ZXJBcHAoZSxyKX0pO2Vsc2Ugby5fX3JlZ2lzdGVyQXBwKHRoaXMscik7YnJlYWs7Y2FzZSJwYWdlIjp0aGlzLm1wVHlwZT0icGFnZSI7dmFyIG49by5wbHVzLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKTtuLl9fcHJlbG9hZF9fPyhuLmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLGZ1bmN0aW9uKCl7IWUuJHNjb3BlJiZpbml0U2NvcGUuY2FsbChlLGksbyksZS5fX2NhbGxfaG9vaygib25TaG93Iil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLGZ1bmN0aW9uKCl7ZS5fX2NhbGxfaG9vaygib25IaWRlIil9KSk6KDA9PT1vLmdldEN1cnJlbnRQYWdlcygpLmxlbmd0aCYmby5fX3JlZ2lzdGVyUGFnZSh7dXJsOiIvIit0aGlzLiRvcHRpb25zLnJvdXRlLHBhdGg6Ii8iK3RoaXMuJG9wdGlvbnMucm91dGUsd2VidmlldzpufSksaW5pdFNjb3BlLmNhbGwodGhpcyxpLG8pKX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXtpZigicGFnZSI9PT10aGlzLiRvcHRpb25zLm1wVHlwZSl7dmFyIGU9by5wbHVzLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKTtpZihlLl9fcHJlbG9hZF9fKXt2YXIgdD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksYSk7aWYoZS5fX3F1ZXJ5X18pdHJ5e09iamVjdC5hc3NpZ24odCxKU09OLnBhcnNlKGUuX19xdWVyeV9fKSl9Y2F0Y2goZSl7fXRoaXMuX19jYWxsX2hvb2soIm9uTG9hZCIsdCl9ZWxzZXt2YXIgbj1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksYSkscj1vLmdldEN1cnJlbnRQYWdlcygpO09iamVjdC5hc3NpZ24obixyW3IubGVuZ3RoLTFdLm9wdGlvbnMpLHRoaXMuX19jYWxsX2hvb2soIm9uTG9hZCIsbiksdGhpcy5fX2NhbGxfaG9vaygib25TaG93Iil9fX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7InBhZ2UiPT09dGhpcy4kb3B0aW9ucy5tcFR5cGUmJih0aGlzLl9fY2FsbF9ob29rKCJvblJlYWR5IiksdGhpcy4kb3B0aW9ucy5vblBhZ2VTY3JvbGwmJnRoaXMuJGVsLmFkZEV2ZW50KCJzY3JvbGwiLGZ1bmN0aW9uKGUpe2Uuc2Nyb2xsVG9wPWUuZGV0YWlsLnNjcm9sbFRvcCx0Ll9fY2FsbF9ob29rKCJvblBhZ2VTY3JvbGwiLGUpfSksdGhpcy4kb3B0aW9ucy5vblJlYWNoQm90dG9tJiZ0aGlzLiRlbC5hZGRFdmVudCgic2Nyb2xsdG9sb3dlciIsZnVuY3Rpb24oZSl7dC5fX2NhbGxfaG9vaygib25SZWFjaEJvdHRvbSIsZSl9KSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXsicGFnZSI9PT10aGlzLiRvcHRpb25zLm1wVHlwZSYmdGhpcy5fX2NhbGxfaG9vaygib25VbmxvYWQiKX19KX1mdW5jdGlvbiBicm9hZGNhc3QoZSx0KXtmb3IodmFyIG49W10scj1hcmd1bWVudHMubGVuZ3RoLTI7MDxyLS07KW5bcl09YXJndW1lbnRzW3IrMl07Zm9yKHZhciBpPXRoaXMuJGNoaWxkcmVuLG89aS5sZW5ndGgsYT0wO2E8bzthKyspe3ZhciBzPWlbYV0sYz1zLiRvcHRpb25zLm5hbWU7aWYofmUuaW5kZXhPZihjKSlyZXR1cm4gcy4kZW1pdC5hcHBseShzLFt0XS5jb25jYXQobikpLCExO2lmKCExPT09YnJvYWRjYXN0LmFwcGx5KHMsW2UsdF0uY29uY2F0KFtuXSkpKXJldHVybiExfX12YXIgZW1pdHRlcj17bWV0aG9kczp7JHRyaWdnZXI6ZnVuY3Rpb24oZSx0KXt0aGlzLiRlbWl0KGUscHJvY2Vzc0N1c3RvbUV2ZW50LmNhbGwodGhpcyxlLHQsdGhpcy4kZWwpKX0sJGRpc3BhdGNoOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aC0yOzA8ci0tOyluW3JdPWFyZ3VtZW50c1tyKzJdOyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKTtmb3IodmFyIGk9dGhpcy4kcGFyZW50fHx0aGlzLiRyb290LG89aS4kb3B0aW9ucy5uYW1lO2kmJighb3x8IX5lLmluZGV4T2YobykpOykoaT1pLiRwYXJlbnQpJiYobz1pLiRvcHRpb25zLm5hbWUpO2kmJmkuJGVtaXQuYXBwbHkoaSxbdF0uY29uY2F0KG4pKX0sJGJyb2FkY2FzdDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGgtMjswPHItLTspbltyXT1hcmd1bWVudHNbcisyXTsic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSksYnJvYWRjYXN0LmFwcGx5KHRoaXMsW2UsdF0uY29uY2F0KG4pKX19fSxsaXN0ZW5lcnM9e3Byb3BzOntpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMuX2FkZExpc3RlbmVycyh0aGlzLmlkKSx0aGlzLiR3YXRjaCgiaWQiLGZ1bmN0aW9uKGUsdCl7bi5fcmVtb3ZlTGlzdGVuZXJzKHQsITApLG4uX2FkZExpc3RlbmVycyhlLCEwKX0pfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKHRoaXMuaWQpfSxtZXRob2RzOntfYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztpZighbnx8dCl7dmFyIGk9dGhpcy4kb3B0aW9ucy5saXN0ZW5lcnM7Ik9iamVjdCI9PT10eXBvZihpKSYmT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihlKXtuPzAhPT1lLmluZGV4T2YoIkAiKSYmMCE9PWUuaW5kZXhPZigidW5pLSIpJiZyLl8kYnVzLiRvbigidW5pLSIrZSsiLSIrdCxyW2lbZV1dKTowPT09ZS5pbmRleE9mKCJAIik/ci4kb24oInVuaS0iK2Uuc3Vic3RyKDEpLHJbaVtlXV0pOjA9PT1lLmluZGV4T2YoInVuaS0iKT9yLl8kYnVzLiRvbihlLHJbaVtlXV0pOnQmJnIuXyRidXMuJG9uKCJ1bmktIitlKyItIityLiRwYWdlLmlkKyItIit0LHJbaVtlXV0pfSl9fSxfcmVtb3ZlTGlzdGVuZXJzOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztpZighbnx8dCl7dmFyIGk9dGhpcy4kb3B0aW9ucy5saXN0ZW5lcnM7Ik9iamVjdCI9PT10eXBvZihpKSYmT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihlKXtuPzAhPT1lLmluZGV4T2YoIkAiKSYmMCE9PWUuaW5kZXhPZigidW5pLSIpJiZyLl8kYnVzLiRvZmYoInVuaS0iK2UrIi0iK3QscltpW2VdXSk6MD09PWUuaW5kZXhPZigiQCIpP3IuJG9mZigidW5pLSIrZS5zdWJzdHIoMSkscltpW2VdXSk6MD09PWUuaW5kZXhPZigidW5pLSIpP3IuXyRidXMuJG9mZihlLHJbaVtlXV0pOnQmJnIuXyRidXMuJG9mZigidW5pLSIrZSsiLSIrci4kcGFnZS5pZCsiLSIrdCxyW2lbZV1dKX0pfX19fSxfYWREYXRhQ2FjaGU9e307ZnVuY3Rpb24gZ2V0QWREYXRhKGUsdCxuLHIsaSxvKXt2YXIgYT10KyItIituLHM9X2FkRGF0YUNhY2hlW2FdO3MmJjA8cy5sZW5ndGg/aShzLnNwbGljZSgwLDEpWzBdKTplLmFkLmdldEFkcyh7YWRwaWQ6dCxjb3VudDo1LHdpZHRoOm4sZXh0OntjaGFubmVsOnJ9fSxmdW5jdGlvbihlKXt2YXIgdD1lLmFkcztpKHQuc3BsaWNlKDAsMSlbMF0pLF9hZERhdGFDYWNoZVthXT1zP3MuY29uY2F0KHQpOnR9LGZ1bmN0aW9uKGUpe28oe2VyckNvZGU6ZS5jb2RlLGVyck1zZzplLm1lc3NhZ2V9KX0pfWZ1bmN0aW9uIGdldEFkKG4scil7cmV0dXJue25hbWU6IkFkIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOnthZHBpZDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoiIn0sZGF0YTp7dHlwZTpPYmplY3R9LHdpZHRoOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxjaGFubmVsOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnthZFdpZHRoOjAsYWREYXRhOnt9fX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5kYXRhKXRoaXMuX2ZpbGxEYXRhKHRoaXMuZGF0YSk7ZWxzZSBpZih0aGlzLmFkcGlkKXtpZih0aGlzLndpZHRoJiYwPHRoaXMud2lkdGgubGVuZ3RoKXt2YXIgZT1wYXJzZUZsb2F0KHRoaXMud2lkdGgpO3JldHVybi9cZCtbdXJdcHgkL2kudGVzdCh0aGlzLndpZHRoKT90aGlzLmFkV2lkdGg9dXB4MnB4KGUpOnRoaXMuYWRXaWR0aD1lLHZvaWQgdGhpcy5fbG9hZERhdGEoKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5yZXF1aXJlTW9kdWxlKCJkb20iKS5nZXRDb21wb25lbnRSZWN0KHQuJHJlZnMuYWQsZnVuY3Rpb24oZSl7dC5hZFdpZHRoPTA9PT1lLnNpemUud2lkdGg/LTE6ZS5zaXplLndpZHRoLHQuX2xvYWREYXRhKCl9KX0sNTApfX0sd2F0Y2g6e2FkcGlkOmZ1bmN0aW9uKGUpe2UmJnRoaXMuX2xvYWREYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUpe2UmJnRoaXMuX2ZpbGxEYXRhKGUpfX0sbWV0aG9kczp7X29uZG93bmxvYWRjaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy4kdHJpZ2dlcigiZG93bmxvYWRjaGFuZ2UiLGUuZGV0YWlsKX0sX29uZGlzbGlrZTpmdW5jdGlvbihlKXt0aGlzLiR0cmlnZ2VyKCJjbG9zZSIsZS5kZXRhaWwpfSxfbG9hZERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztnZXRBZERhdGEoci5wbHVzfHxuZXcgci5XZWV4UGx1cyhyLndlZXgpLGV8fHRoaXMuYWRwaWQsdGhpcy5hZFdpZHRoLHRoaXMuY2hhbm5lbCxmdW5jdGlvbihlKXt0Ll9maWxsRGF0YShlKX0sZnVuY3Rpb24oZSl7dC4kdHJpZ2dlcigiZXJyb3IiLGUpfSl9LF9maWxsRGF0YTpmdW5jdGlvbihlKXt0aGlzLmFkRGF0YT1lLHRoaXMuJHRyaWdnZXIoImxvYWQiLHt9KX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD17fSxuPXRoaXMuJGxpc3RlbmVycztyZXR1cm4gbi5kb3dubG9hZGNoYW5nZSYmKHQuZG93bmxvYWRjaGFuZ2U9dGhpcy5fb25kb3dubG9hZGNoYW5nZSksbi5jbG9zZSYmKHQuZGlzbGlrZT10aGlzLl9vbmRpc2xpa2UpLGUoInUtYWQiLHRoaXMuX2coe3JlZjoiYWQiLGF0dHJzOntkYXRhOnRoaXMuYWREYXRhLHJlbmRlcmluZzohMH0sb246dH0sbiksW10sMSl9fX1mdW5jdGlvbiBpbml0JDMoZSx0LG4pe2UuY29tcG9uZW50KCJhZCIsZ2V0QWQodCxuKSl9dmFyIF9hZERhdGFDYWNoZSQxPXt9O2Z1bmN0aW9uIGdldEFkRGF0YSQxKGUsdCxuLHIsaSxvKXt2YXIgYT10KyItIituLHM9X2FkRGF0YUNhY2hlJDFbYV07cyYmMDxzLmxlbmd0aD9pKHMuc3BsaWNlKDAsMSlbMF0pOmUuYWQuZ2V0RHJhd0Fkcyh7YWRwaWQ6dCxjb3VudDozLHdpZHRoOm4saGVpZ2h0OnJ9LGZ1bmN0aW9uKGUpe3ZhciB0PWUuYWRzO2kodC5zcGxpY2UoMCwxKVswXSksX2FkRGF0YUNhY2hlJDFbYV09cz9zLmNvbmNhdCh0KTp0fSxmdW5jdGlvbihlKXtvKHtlcnJDb2RlOmUuY29kZSxlcnJNc2c6ZS5tZXNzYWdlfSl9KX1mdW5jdGlvbiBnZXRBZCQxKGUsbil7cmV0dXJue25hbWU6IkFkRHJhdyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7YWRwaWQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6IiJ9LGRhdGE6e3R5cGU6T2JqZWN0fSx3aWR0aDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57YWRXaWR0aDowLGFkSGVpZ2h0OjAsYWREYXRhOnt9fX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5kYXRhP3RoaXMuX2ZpbGxEYXRhKHRoaXMuZGF0YSk6dGhpcy5hZHBpZCYmc2V0VGltZW91dChmdW5jdGlvbigpe2UucmVxdWlyZU1vZHVsZSgiZG9tIikuZ2V0Q29tcG9uZW50UmVjdCh0LiRyZWZzLmFkLGZ1bmN0aW9uKGUpe3QuYWRXaWR0aD0wPT09ZS5zaXplLndpZHRoPy0xOmUuc2l6ZS53aWR0aCx0LmFkSGVpZ2h0PTA9PT1lLnNpemUuaGVpZ2h0Py0xOmUuc2l6ZS5oZWlnaHQsdC5fbG9hZERhdGEoKX0pfSwxMDApfSx3YXRjaDp7YWRwaWQ6ZnVuY3Rpb24oZSl7ZSYmdGhpcy5fbG9hZERhdGEoZSl9LGRhdGE6ZnVuY3Rpb24oZSl7ZSYmdGhpcy5fZmlsbERhdGEoZSl9fSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7KG4ucGx1c3x8bmV3IG4uV2VleFBsdXMobi53ZWV4KSkuYWQucmVsZWFzZUFkRGF0YSh0aGlzLmFkRGF0YSl9LG1ldGhvZHM6e19vbmRpc2xpa2U6ZnVuY3Rpb24oZSl7dGhpcy4kdHJpZ2dlcigiY2xvc2UiLGUuZGV0YWlsKX0sX2xvYWREYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7Z2V0QWREYXRhJDEobi5wbHVzfHxuZXcgbi5XZWV4UGx1cyhuLndlZXgpLGV8fHRoaXMuYWRwaWQsdGhpcy5hZFdpZHRoLHRoaXMuYWRIZWlnaHQsZnVuY3Rpb24oZSl7dC5fZmlsbERhdGEoZSl9LGZ1bmN0aW9uKGUpe3QuJHRyaWdnZXIoImVycm9yIixlKX0pfSxfZmlsbERhdGE6ZnVuY3Rpb24oZSl7dGhpcy5hZERhdGE9ZSx0aGlzLiR0cmlnZ2VyKCJsb2FkIix7fSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj10aGlzLiRsaXN0ZW5lcnM7cmV0dXJuIG4uY2xvc2UmJih0LmRpc2xpa2U9dGhpcy5fb25kaXNsaWtlKSxlKCJ1LWFkLWRyYXciLHRoaXMuX2coe3JlZjoiYWQiLGF0dHJzOntkYXRhOnRoaXMuYWREYXRhLHJlbmRlcmluZzohMH0sb246dH0sbiksW10sMSl9fX1mdW5jdGlvbiBpbml0JDQoZSx0LG4pe2UuY29tcG9uZW50KCJhZC1kcmF3IixnZXRBZCQxKHQsbikpfXZhciBPUEVOX1RZUEVTPVsiYWdyZWVQcml2YWN5IiwiZGlzYWdyZWVQcml2YWN5Il07ZnVuY3Rpb24gZ2V0QnV0dG9uKGUscil7cmV0dXJue25hbWU6IkJ1dHRvbiIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7aG92ZXJDbGFzczp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiYnV0dG9uLWhvdmVyIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiZGVmYXVsdCJ9LHNpemU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImRlZmF1bHQifSxwbGFpbjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGxvYWRpbmc6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxob3ZlclN0b3BQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGhvdmVyU3RhcnRUaW1lOnt0eXBlOk51bWJlcixkZWZhdWx0OjIwfSxob3ZlclN0YXlUaW1lOnt0eXBlOk51bWJlcixkZWZhdWx0OjcwfSxvcGVuVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZm9ybVR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybn5bIiIsInN1Ym1pdCIsInJlc2V0Il0uaW5kZXhPZihlKX19fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue1RZUEVTOntkZWZhdWx0OiJkIixwcmltYXJ5OiJwIix3YXJuOiJ3In0sY2xpY2tGdW5jdGlvbjpudWxsfX0sbWV0aG9kczp7X29uQ2xpY2s6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5kaXNhYmxlZCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNsaWNrRnVuY3Rpb24mJnRoaXMuY2xpY2tGdW5jdGlvbihlKSx0aGlzLmZvcm1UeXBlJiZ0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInN1Ym1pdCI9PT10aGlzLmZvcm1UeXBlPyJ1bmktZm9ybS1zdWJtaXQiOiJ1bmktZm9ybS1yZXNldCIse3R5cGU6dGhpcy5mb3JtVHlwZX0sdGhpcyksMDx0aGlzLm9wZW5UeXBlLmxlbmd0aCYmMDw9T1BFTl9UWVBFUy5pbmRleE9mKHRoaXMub3BlblR5cGUpKSl7dmFyIG49ci5wbHVzfHxuZXcgci5XZWV4UGx1cyhyLndlZXgpO3RoaXNbIl8iK3RoaXMub3BlblR5cGVdKG4pLHRoaXMuJHRyaWdnZXIodGhpcy5vcGVuVHlwZS50b0xvd2VyQ2FzZSgpLHt9KX19LF9hZ3JlZVByaXZhY3k6ZnVuY3Rpb24oZSl7ZS5ydW50aW1lLmFncmVlUHJpdmFjeSgpfSxfZGlzYWdyZWVQcml2YWN5OmZ1bmN0aW9uKGUpe2UucnVudGltZS5kaXNhZ3JlZVByaXZhY3koKX0sX2dldENsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PSJ1Yi0iK3RoaXMuVFlQRVNbdGhpcy50eXBlXStlO3JldHVybiB0aGlzLmRpc2FibGVkJiYodCs9Ii1kIiksdGhpcy5wbGFpbiYmKHQrPSItcGxhaW4iKSwiLXQiPT09ZSYmIm1pbmkiPT09dGhpcy5zaXplJiYodCs9IiB1Yi1taW5pIiksdH0sX2dldEhvdmVyQ2xhc3M6ZnVuY3Rpb24oZSl7aWYodGhpcy5kaXNhYmxlZClyZXR1cm4iIjt2YXIgdD0idWItIit0aGlzLlRZUEVTW3RoaXMudHlwZV0rZSsiLWhvdmVyIjtyZXR1cm4gdGhpcy5wbGFpbiYmKHQrPSItcGxhaW4iKSx0fX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1BcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP3RoaXMuJHNsb3RzLmRlZmF1bHQ6W107cmV0dXJuIDE9PT1uLmxlbmd0aCYmblswXS50ZXh0JiYobj1lKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInViLXQiXSxjbGFzczp0Ll9nZXRDbGFzcygiLXQiKX0sW3QuX3QoImRlZmF1bHQiKV0sMikpLHRoaXMuY2xpY2tGdW5jdGlvbj10LiRsaXN0ZW5lcnMuY2xpY2ssZGVsZXRlIHQuJGxpc3RlbmVycy5jbGljayxlKCJ2aWV3Iix0Ll9nKHtzdGF0aWNDbGFzczpbInViIl0sY2xhc3M6dC5fZ2V0Q2xhc3MoIiIpLGF0dHJzOntkYXRhVW5jVHlwZToidW5pLWJ1dHRvbiIsaG92ZXJDbGFzczp0Ll9nZXRIb3ZlckNsYXNzKCIiKSxob3ZlclN0YXJ0VGltZTp0LmhvdmVyU3RhcnRUaW1lLGhvdmVyU3RheVRpbWU6dC5ob3ZlclN0YXlUaW1lfSxvbjp7Y2xpY2s6dC5fb25DbGlja319LHQuJGxpc3RlbmVycyksW3QubG9hZGluZz9lKCJsb2FkaW5nLWluZGljYXRvciIse3N0YXRpY0NsYXNzOlsidWItbG9hZGluZyJdLGNsYXNzOlsidWItIit0LlRZUEVTW3QudHlwZV0rIi1sb2FkaW5nIl0sYXR0cnM6e2Fycm93OiJmYWxzZSIsYW5pbWF0aW5nOiJ0cnVlIn19KTp0Ll9lKCldLmNvbmNhdChuKSwxKX0sc3R5bGU6e3ViOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIscG9zaXRpb246InJlbGF0aXZlIixwYWRkaW5nTGVmdDoiNSIscGFkZGluZ1JpZ2h0OiI1IixvdmVyZmxvdzoiaGlkZGVuIixjb2xvcjoiIzAwMDAwMCIsYmFja2dyb3VuZENvbG9yOiIjZjhmOGY4Iixib3JkZXJSYWRpdXM6IjUiLGJvcmRlclN0eWxlOiJzb2xpZCIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZGJkYmRiIn0sInViLXQiOntjb2xvcjoiIzAwMDAwMCIsZm9udFNpemU6IjE4Iix0ZXh0RGVjb3JhdGlvbjoibm9uZSIsbGluZUhlaWdodDoiNDYifSwidWItZCI6e2JhY2tncm91bmRDb2xvcjoiI2Y4ZjhmOCJ9LCJ1Yi1wIjp7YmFja2dyb3VuZENvbG9yOiIjMDA3YWZmIixib3JkZXJDb2xvcjoiIzAwNjJjYyJ9LCJ1Yi13Ijp7YmFja2dyb3VuZENvbG9yOiIjZTY0MzQwIixib3JkZXJDb2xvcjoiI2I4MzYzMyJ9LCJ1Yi1kLXQiOntjb2xvcjoiIzAwMDAwMCJ9LCJ1Yi1wLXQiOntjb2xvcjoiI2ZmZmZmZiJ9LCJ1Yi13LXQiOntjb2xvcjoiI2ZmZmZmZiJ9LCJ1Yi1kLWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNmN2Y3ZjcifSwidWItcC1kIjp7YmFja2dyb3VuZENvbG9yOiIjNjNhY2ZjIixib3JkZXJDb2xvcjoiIzRmOGFjYSJ9LCJ1Yi13LWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNlYzhiODkiLGJvcmRlckNvbG9yOiIjYmQ2ZjZlIn0sInViLWQtdC1kIjp7Y29sb3I6IiNjY2NjY2MifSwidWItcC10LWQiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn0sInViLXctdC1kIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9LCJ1Yi1kLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiMzNTM1MzUiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1wLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiMwMDdhZmYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi13LXBsYWluIjp7Ym9yZGVyQ29sb3I6IiNlNjQzNDAiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLXQtcGxhaW4iOntjb2xvcjoiIzM1MzUzNSJ9LCJ1Yi1wLXQtcGxhaW4iOntjb2xvcjoiIzAwN2FmZiJ9LCJ1Yi13LXQtcGxhaW4iOntjb2xvcjoiI2U2NDM0MCJ9LCJ1Yi1kLWQtcGxhaW4iOntib3JkZXJDb2xvcjoiI2M2YzZjNiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXAtZC1wbGFpbiI6e2JvcmRlckNvbG9yOiIjYzZjNmM2IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItdy1kLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiNjNmM2YzYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLXQtZC1wbGFpbiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifSwidWItcC10LWQtcGxhaW4iOntjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn0sInViLXctdC1kLXBsYWluIjp7Y29sb3I6InJnYmEoMCwwLDAsMC4yKSJ9LCJ1Yi1taW5pIjp7bGluZUhlaWdodDoiMzAiLGZvbnRTaXplOiIxMyIscGFkZGluZ1RvcDowLHBhZGRpbmdSaWdodDoiMTcuNSIscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OiIxNy41In0sInViLWxvYWRpbmciOnt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLG1hcmdpblJpZ2h0OiIxMCJ9LCJ1Yi1kLWxvYWRpbmciOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItcC1sb2FkaW5nIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXctbG9hZGluZyI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLWxvYWRpbmctcGxhaW4iOntjb2xvcjoiIzM1MzUzNSJ9LCJ1Yi1wLWxvYWRpbmctcGxhaW4iOntjb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiIjMDA2MmNjIn0sInViLXctbG9hZGluZy1wbGFpbiI6e2NvbG9yOiIjZTY0MzQwIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItZC1ob3ZlciI6e29wYWNpdHk6LjgsYmFja2dyb3VuZENvbG9yOiIjZGVkZWRlIn0sInViLXAtaG92ZXIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiIzAwNjJjYyJ9LCJ1Yi13LWhvdmVyIjp7b3BhY2l0eTouOCxiYWNrZ3JvdW5kQ29sb3I6IiNjZTNjMzkifSwidWItZC10LWhvdmVyIjp7Y29sb3I6InJnYmEoMCwwLDAsMC42KSJ9LCJ1Yi1wLXQtaG92ZXIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn0sInViLXctdC1ob3ZlciI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifSwidWItZC1ob3Zlci1wbGFpbiI6e2NvbG9yOiJyZ2JhKDUzLDUzLDUzLDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDUzLDUzLDUzLDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1wLWhvdmVyLXBsYWluIjp7Y29sb3I6InJnYmEoMjYsMTczLDI1LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDAsMTIyLDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItdy1ob3Zlci1wbGFpbiI6e2NvbG9yOiJyZ2JhKDIzMCw2Nyw2NCwwLjYpIixib3JkZXJDb2xvcjoicmdiYSgyMzAsNjcsNjQsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LGxpc3RlbmVyczp7ImxhYmVsLWNsaWNrIjoiX29uQ2xpY2siLCJAbGFiZWwtY2xpY2siOiJfb25DbGljayJ9fX1mdW5jdGlvbiBpbml0JDUoZSx0LG4pe2UuY29tcG9uZW50KCJidXR0b24iLGdldEJ1dHRvbih0LG4pKX1mdW5jdGlvbiBnZXRDaGVja2JveEdyb3VwKGUpe3JldHVybntuYW1lOiJDaGVja2JveEdyb3VwIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntjaGVja2JveExpc3Q6W119fSxsaXN0ZW5lcnM6eyJAY2hlY2tib3gtY2hhbmdlIjoiX2NoYW5nZUhhbmRsZXIiLCJAY2hlY2tib3gtZ3JvdXAtdXBkYXRlIjoiX2NoZWNrYm94R3JvdXBVcGRhdGVIYW5kbGVyIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfY2hhbmdlSGFuZGxlcjpmdW5jdGlvbihlKXt2YXIgdD1bXTt0aGlzLmNoZWNrYm94TGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tib3hDaGVja2VkJiZ0LnB1c2goZS52YWx1ZSl9KSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0fSl9LF9jaGVja2JveEdyb3VwVXBkYXRlSGFuZGxlcjpmdW5jdGlvbihlKXtpZigiYWRkIj09PWUudHlwZSl0aGlzLmNoZWNrYm94TGlzdC5wdXNoKGUudm0pO2Vsc2V7dmFyIHQ9dGhpcy5jaGVja2JveExpc3QuaW5kZXhPZihlLnZtKTt0aGlzLmNoZWNrYm94TGlzdC5zcGxpY2UodCwxKX19LF9nZXRGb3JtRGF0YTpmdW5jdGlvbigpe3ZhciBlPXt9O2lmKCIiIT09dGhpcy5uYW1lKXt2YXIgdD1bXTt0aGlzLmNoZWNrYm94TGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tib3hDaGVja2VkJiZ0LnB1c2goZS52YWx1ZSl9KSxlLnZhbHVlPXQsZS5rZXk9dGhpcy5uYW1lfXJldHVybiBlfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLWNoZWNrYm94LWdyb3VwIl19LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9LHN0eWxlOnt9fX1mdW5jdGlvbiBpbml0JDYoZSx0KXtlLmNvbXBvbmVudCgiY2hlY2tib3gtZ3JvdXAiLGdldENoZWNrYm94R3JvdXAodCkpfWZ1bmN0aW9uIGdldENoZWNrYm94KGUpe3JldHVybntuYW1lOiJDaGVja2JveCIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7Y2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2NoZWNrYm94Q2hlY2tlZDp0aGlzLmNoZWNrZWQsY2hlY2tib3hWYWx1ZTp0aGlzLnZhbHVlfX0sd2F0Y2g6e2NoZWNrZWQ6ZnVuY3Rpb24oZSl7dGhpcy5jaGVja2JveENoZWNrZWQ9ZX0sdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5jaGVja2JveFZhbHVlPWV9fSxsaXN0ZW5lcnM6eyJsYWJlbC1jbGljayI6Il9vbkNsaWNrIiwiQGxhYmVsLWNsaWNrIjoiX29uQ2xpY2sifSxjb21wdXRlZDp7Y2hlY2tib3hDb2xvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkPyIjYWRhZGFkIjp0aGlzLmNvbG9yfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJDaGVja2JveEdyb3VwIiwidW5pLWNoZWNrYm94LWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pLHRoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiQ2hlY2tib3hHcm91cCIsInVuaS1jaGVja2JveC1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KSx0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlKXt0aGlzLmRpc2FibGVkfHwodGhpcy5jaGVja2JveENoZWNrZWQ9IXRoaXMuY2hlY2tib3hDaGVja2VkLHRoaXMuJGRpc3BhdGNoKCJDaGVja2JveEdyb3VwIiwidW5pLWNoZWNrYm94LWNoYW5nZSIsZSkpfSxfcmVzZXRGb3JtRGF0YTpmdW5jdGlvbigpe3RoaXMuY2hlY2tib3hDaGVja2VkPSExfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoImRpdiIsdC5fZyh7YXR0cnM6e2RhdGFVbmNUeXBlOiJ1bmktY2hlY2tib3gifSxvbjp7Y2xpY2s6dC5fb25DbGlja319LHQuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLWNoZWNrYm94Il19LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1jaGVja2JveC1pbnB1dCJdLGNsYXNzOlt0LmRpc2FibGVkPyJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQiOiIiXX0sW3QuY2hlY2tib3hDaGVja2VkP2UoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidW5pLWljb24iXSxzdHlsZTp7Y29sb3I6dC5jaGVja2JveENvbG9yfX0sW3QuX3YodC5fcygi7qiIIikpXSk6dC5fZSgpXSksZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktc2xvdCJdfSxbdC5fdCgiZGVmYXVsdCIpXSwyKV0pXSl9LHN0eWxlOnsidW5pLWNoZWNrYm94Ijp7ZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIifSwidW5pLWNoZWNrYm94LWlucHV0Ijp7anVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYWxpZ25JdGVtczoiY2VudGVyIixwb3NpdGlvbjoicmVsYXRpdmUiLGJvcmRlcldpZHRoOiIxIixib3JkZXJDb2xvcjoiI2QxZDFkMSIsYm9yZGVyU3R5bGU6InNvbGlkIixiYWNrZ3JvdW5kQ29sb3I6IiNmZmZmZmYiLGJvcmRlclJhZGl1czoiMyIsd2lkdGg6IjIyIixoZWlnaHQ6IjIyIn0sInVuaS1pY29uIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMiLGZvbnRTaXplOiIxNiIsbWFyZ2luTGVmdDoiMiIsbWFyZ2luVG9wOiIyIixjb2xvcjoiIzAwN2FmZiJ9LCJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNlMWUxZTEifSwidW5pLWNoZWNrYm94LWlucHV0LWRpc2FibGVkLWJlZm9yZSI6e2NvbG9yOiIjYWRhZGFkIn0sInVuaS1zbG90Ijp7Zm9udFNpemU6IjE2IixtYXJnaW5MZWZ0OiI1In0sInVuaS1jaGVja2JveC1ncm91cCI6e2Rpc3BsYXk6ImJsb2NrIn19fX1mdW5jdGlvbiBpbml0JDcoZSx0KXtlLmNvbXBvbmVudCgiY2hlY2tib3giLGdldENoZWNrYm94KHQpKX12YXIgTkFUSVZFX0NPTVBPTkVOVF9UWVBFUz1bInUtaW5wdXQiLCJ1LXRleHRhcmVhIl07ZnVuY3Rpb24gZ2V0Rm9ybShlKXt2YXIgaT1lLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtyZXR1cm57bmFtZToiRm9ybSIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2NoaWxkcmVuTGlzdDpbXX19LGxpc3RlbmVyczp7IkBmb3JtLXN1Ym1pdCI6Il9vblN1Ym1pdCIsIkBmb3JtLXJlc2V0IjoiX29uUmVzZXQiLCJAZm9ybS1ncm91cC11cGRhdGUiOiJfZm9ybUdyb3VwVXBkYXRlSGFuZGxlciJ9LG1ldGhvZHM6e19vblN1Ym1pdDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXROYXRpdmVGb3JtRGF0YSgpfHx7fTt0aGlzLmNoaWxkcmVuTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuX2dldEZvcm1EYXRhJiZlLl9nZXRGb3JtRGF0YSgpLmtleSYmKHRbZS5fZ2V0Rm9ybURhdGEoKS5rZXldPWUuX2dldEZvcm1EYXRhKCkudmFsdWUpfSksdGhpcy4kdHJpZ2dlcigic3VibWl0Iix7dmFsdWU6dH0pfSxfb25SZXNldDpmdW5jdGlvbihlKXt0aGlzLiR0cmlnZ2VyKCJyZXNldCIse30pLHRoaXMuX2dldE5hdGl2ZUZvcm1EYXRhKCEwKSx0aGlzLmNoaWxkcmVuTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuX3Jlc2V0Rm9ybURhdGEmJmUuX3Jlc2V0Rm9ybURhdGEoKX0pfSxfZm9ybUdyb3VwVXBkYXRlSGFuZGxlcjpmdW5jdGlvbihlKXtpZigiYWRkIj09PWUudHlwZSl0aGlzLmNoaWxkcmVuTGlzdC5wdXNoKGUudm0pO2Vsc2V7dmFyIHQ9dGhpcy5jaGlsZHJlbkxpc3QuaW5kZXhPZihlLnZtKTt0aGlzLmNoaWxkcmVuTGlzdC5zcGxpY2UodCwxKX19LF9nZXROYXRpdmVGb3JtRGF0YTpmdW5jdGlvbihuKXt2YXIgcj17fTtyZXR1cm4gZnVuY3Rpb24gdChlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7MDw9TkFUSVZFX0NPTVBPTkVOVF9UWVBFUy5pbmRleE9mKGUudGFnKSYmZS5kYXRhLmF0dHJzJiZlLmRhdGEuYXR0cnMubmFtZSYmKG4/ZS5lbG0uc2V0VmFsdWUoIiIpOnJbZS5kYXRhLmF0dHJzLm5hbWVdPWkuZ2V0VmFsdWUoZS5lbG0ubm9kZUlkKSksZS5jaGlsZHJlbiYmdChlLmNoaWxkcmVuKX0pfSh0aGlzLiR2bm9kZS5jb21wb25lbnRPcHRpb25zLmNoaWxkcmVuKSxyfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJ2aWV3Iix0aGlzLl9nKHt9LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9fX1mdW5jdGlvbiBpbml0JDgoZSx0KXtlLmNvbXBvbmVudCgiZm9ybSIsZ2V0Rm9ybSh0KSl9dmFyIGljb25DaGFycz17c3VjY2Vzczoi7qiGIixpbmZvOiLuqIMiLHdhcm46Iu6oiyIsd2FpdGluZzoi7qiJIixzYWZlX3N1Y2Nlc3M6Iu6ohCIsc2FmZV93YXJuOiLuqIUiLHN1Y2Nlc3NfY2lyY2xlOiLuqIciLHN1Y2Nlc3Nfbm9fY2lyY2xlOiLuqIgiLHdhaXRpbmdfY2lyY2xlOiLuqIoiLGNpcmNsZToi7qiBIixkb3dubG9hZDoi7qiCIixpbmZvX2NpcmNsZToi7qiMIixjYW5jZWw6Iu6ojSIsc2VhcmNoOiLuqI4iLGNsZWFyOiLuqI8ifSxpY29uQ29sb3JzPXtzdWNjZXNzOiIjMDliYjA3IixpbmZvOiIjMTBhZWZmIix3YXJuOiIjZjc2MjYwIix3YWl0aW5nOiIjMTBhZWZmIixzYWZlX3N1Y2Nlc3M6IiMwOWJiMDciLHNhZmVfd2FybjoiI2ZmYmUwMCIsc3VjY2Vzc19jaXJjbGU6IiMwOWJiMDciLHN1Y2Nlc3Nfbm9fY2lyY2xlOiIjMDliYjA3Iix3YWl0aW5nX2NpcmNsZToiIzEwYWVmZiIsY2lyY2xlOiIjYzljOWM5Iixkb3dubG9hZDoiIzA5YmIwNyIsaW5mb19jaXJjbGU6IiMwOWJiMDciLGNhbmNlbDoiI2Y0MzUzMCIsc2VhcmNoOiIjYjJiMmIyIixjbGVhcjoiI2IyYjJiMiJ9O2Z1bmN0aW9uIGdldEljb24oZSl7cmV0dXJue25hbWU6Ikljb24iLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e3R5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNpemU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6MjN9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntpY29uQ2hhcnM6aWNvbkNoYXJzfX0sYmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7fSxjb21wdXRlZDp7c3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJue2NvbG9yOnRoaXMuY29sb3J8fGljb25Db2xvcnNbdGhpcy50eXBlXSxmb250U2l6ZTp0aGlzLnNpemV9fX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJ1LXRleHQiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLWljb24iXSxzdHlsZTp0aGlzLnN0eWxlc30sdGhpcy4kbGlzdGVuZXJzKSxbdGhpcy5pY29uQ2hhcnNbdGhpcy50eXBlXV0pfSxzdHlsZTp7InVuaS1pY29uIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMifX19fWZ1bmN0aW9uIGluaXQkOShlLHQpe2UuY29tcG9uZW50KCJpY29uIixnZXRJY29uKHQpKX1mdW5jdGlvbiBnZXRMYWJlbChlKXtyZXR1cm57bmFtZToiTGFiZWwiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e2Zvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LG1ldGhvZHM6e19vbkNsaWNrOmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LmF0dHIuZGF0YVVuY1R5cGV8fCIiLG49L151bmktKGNoZWNrYm94fHJhZGlvfHN3aXRjaCktLy50ZXN0KHQpO258fChuPS9edW5pLShjaGVja2JveHxyYWRpb3xzd2l0Y2h8YnV0dG9uKSQvaS50ZXN0KHQpKSxufHwodGhpcy5mb3I/dGhpcy5fJGJ1cy4kZW1pdCgidW5pLWxhYmVsLWNsaWNrLSIrdGhpcy4kcGFnZS5pZCsiLSIrdGhpcy5mb3IsZSwhMCk6dGhpcy4kYnJvYWRjYXN0KFsiQ2hlY2tib3giLCJSYWRpbyIsIlN3aXRjaCIsIkJ1dHRvbiJdLCJ1bmktbGFiZWwtY2xpY2siLGUsITApKX19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZGl2Iix0aGlzLl9nKHtvbjp7Y2xpY2s6dGhpcy5fb25DbGlja319LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9fX1mdW5jdGlvbiBpbml0JDEwKGUsdCl7ZS5jb21wb25lbnQoImxhYmVsIixnZXRMYWJlbCh0KSl9ZnVuY3Rpb24gZ2V0TW92YWJsZUFyZWEoZSl7dmFyIHQ9ZS5yZXF1aXJlTW9kdWxlKCJkb20iKTtyZXR1cm57bmFtZToiTW92YWJsZUFyZWEiLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e3NjYWxlQXJlYTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOjAsaGVpZ2h0OjAsaXRlbXM6W119fSxtZXRob2RzOntfcmVzaXplOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9nZXRXSCgpLnRoZW4oZnVuY3Rpb24oKXtlLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jb21wb25lbnRJbnN0YW5jZS5zZXRQYXJlbnQoKX0pfSl9LF9wYW5zdGFydDpmdW5jdGlvbihlKXt0aGlzLnRvdWNoSXRlbSYmdGhpcy50b3VjaEl0ZW0udG91Y2hzdGFydChlKX0sX3Bhbm1vdmU6ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnRvdWNoSXRlbSYmdGhpcy50b3VjaEl0ZW0udG91Y2htb3ZlKGUpfSxfcGFuZW5kOmZ1bmN0aW9uKGUpe3RoaXMudG91Y2hJdGVtJiYodGhpcy50b3VjaEl0ZW0udG91Y2hlbmQoZSksdGhpcy50b3VjaEl0ZW09bnVsbCl9LF9nZXRXSDpmdW5jdGlvbigpe3ZhciBvPXRoaXM7cmV0dXJuIHRoaXMuX2dldENvbXBvbmVudFNpemUodGhpcy4kcmVmcy5lbCkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLndpZHRoLG49ZS5oZWlnaHQscj1lLnRvcCxpPWUubGVmdDtvLndpZHRoPXQsby5oZWlnaHQ9bixvLnRvcD1yLG8ubGVmdD1pfSl9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXt0LmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5pdGVtcz1bXSx0aGlzLmdhcFY9e3g6bnVsbCx5Om51bGx9LHRoaXMucGluY2hTdGFydExlbj1udWxsfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5fX2lzTW91bnRlZD0hMCxlLl9yZXNpemUoKX0sMjAwKX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1bXTsoQXJyYXkuaXNBcnJheSh0aGlzLiRzbG90cy5kZWZhdWx0KT9kZWVwQ2xvbmUodGhpcy4kc2xvdHMuZGVmYXVsdCxlKTpbXSkuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNvbXBvbmVudE9wdGlvbnMmJiJtb3ZhYmxlLXZpZXciPT09ZS5jb21wb25lbnRPcHRpb25zLnRhZyYmbi5wdXNoKGUpfSksdGhpcy5pdGVtcz1uO3ZhciByPXt9O3JldHVyblsicGFuc3RhcnQiLCJwYW5tb3ZlIiwicGFuZW5kIl0uZm9yRWFjaChmdW5jdGlvbihlKXtyW2VdPXRbIl8iK2VdfSksZSgiZGl2Iix0aGlzLl9nKHtyZWY6ImVsIixvbjpyLHN0YXRpY0NsYXNzOlsidW5pLW1vdmFibGUtYXJlYSJdfSx0aGlzLiRsaXN0ZW5lcnMpLG4sMil9LHN0eWxlOnsidW5pLW1vdmFibGUtYXJlYSI6e292ZXJmbG93OiJoaWRkZW4iLHdpZHRoOiIxMHB4IixoZWlnaHQ6IjEwcHgifX19fWZ1bmN0aW9uIGluaXQkMTEoZSx0KXtlLmNvbXBvbmVudCgibW92YWJsZS1hcmVhIixnZXRNb3ZhYmxlQXJlYSh0KSl9dmFyIHRvdWNodHJhY2s9e21ldGhvZHM6e3RvdWNodHJhY2s6ZnVuY3Rpb24oaSl7dmFyIG89dGhpcyxhPTAscz0wLGM9MCx1PTAsbj1mdW5jdGlvbihlLHQsbixyKXtpZighMT09PW9baV0oe3RhcmdldDplLnRhcmdldCxjdXJyZW50VGFyZ2V0OmUuY3VycmVudFRhcmdldCxzdG9wUHJvcGFnYXRpb246ZS5zdG9wUHJvcGFnYXRpb24uYmluZChlKSx0b3VjaGVzOmUudG91Y2hlcyxjaGFuZ2VkVG91Y2hlczplLmNoYW5nZWRUb3VjaGVzLGRldGFpbDp7c3RhdGU6dCx4MDpuLHkwOnIsZHg6bi1hLGR5OnItcyxkZHg6bi1jLGRkeTpyLXUsdGltZVN0YW1wOmUudGltZVN0YW1wfHxEYXRlLm5vdygpfX0pKXJldHVybiExfSxyPW51bGw7dGhpcy5hZGRMaXN0ZW5lcigidG91Y2hzdGFydCIsZnVuY3Rpb24oZSl7aWYoIXIpcmV0dXJuIGE9Yz0ocj1lKS50b3VjaGVzWzBdLnBhZ2VYLHM9dT1lLnRvdWNoZXNbMF0ucGFnZVksbihlLCJzdGFydCIsYSxzKX0pLHRoaXMuYWRkTGlzdGVuZXIoInRvdWNobW92ZSIsZnVuY3Rpb24oZSl7aWYocil7dmFyIHQ9bihlLCJtb3ZlIixlLnRvdWNoZXNbMF0ucGFnZVgsZS50b3VjaGVzWzBdLnBhZ2VZKTtyZXR1cm4gYz1lLnRvdWNoZXNbMF0ucGFnZVgsdT1lLnRvdWNoZXNbMF0ucGFnZVksdH19KSx0aGlzLmFkZExpc3RlbmVyKCJ0b3VjaGVuZCIsZnVuY3Rpb24oZSl7aWYocilyZXR1cm4gcj1udWxsLG4oZSwiZW5kIixlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYLGUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVkpfSl9LHRvdWNoc3RhcnQ6ZnVuY3Rpb24oZSl7dGhpcy5jYWxsYmFjaygidG91Y2hzdGFydCIsZSl9LHRvdWNobW92ZTpmdW5jdGlvbihlKXt0aGlzLmNhbGxiYWNrKCJ0b3VjaG1vdmUiLGUpfSx0b3VjaGVuZDpmdW5jdGlvbihlKXt0aGlzLmNhbGxiYWNrKCJ0b3VjaGVuZCIsZSl9LGFkZExpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7dGhpcy5fX2V2ZW50W2VdPWZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZS50b3VjaGVzPWUuY2hhbmdlZFRvdWNoZXMsITE9PT10KGUpJiZlLnN0b3BQcm9wYWdhdGlvbigpKX19LGNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7dGhpcy5fX2V2ZW50W2VdJiZ0aGlzLl9fZXZlbnRbZV0odCl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fX2V2ZW50PXt9fX07ZnVuY3Rpb24gZShlLHQsbil7cmV0dXJuIHQtbjxlJiZlPHQrbn1mdW5jdGlvbiB0KHQsbil7cmV0dXJuIGUodCwwLG4pfWZ1bmN0aW9uIERlY2xpbmUoKXt9ZnVuY3Rpb24gRnJpY3Rpb24oZSx0KXt0aGlzLl9tPWUsdGhpcy5fZj0xZTMqdCx0aGlzLl9zdGFydFRpbWU9MCx0aGlzLl92PTB9ZnVuY3Rpb24gU3ByaW5nKGUsdCxuKXt0aGlzLl9tPWUsdGhpcy5faz10LHRoaXMuX2M9bix0aGlzLl9zb2x1dGlvbj1udWxsLHRoaXMuX2VuZFBvc2l0aW9uPTAsdGhpcy5fc3RhcnRUaW1lPTB9ZnVuY3Rpb24gU1REKGUsdCxuKXt0aGlzLl9zcHJpbmdYPW5ldyBTcHJpbmcoZSx0LG4pLHRoaXMuX3NwcmluZ1k9bmV3IFNwcmluZyhlLHQsbiksdGhpcy5fc3ByaW5nU2NhbGU9bmV3IFNwcmluZyhlLHQsbiksdGhpcy5fc3RhcnRUaW1lPTB9RGVjbGluZS5wcm90b3R5cGUueD1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5zcXJ0KGUpfSxGcmljdGlvbi5wcm90b3R5cGUuc2V0Vj1mdW5jdGlvbihlLHQpe3ZhciBuPU1hdGgucG93KE1hdGgucG93KGUsMikrTWF0aC5wb3codCwyKSwuNSk7dGhpcy5feF92PWUsdGhpcy5feV92PXQsdGhpcy5feF9hPS10aGlzLl9mKnRoaXMuX3hfdi9uLHRoaXMuX3lfYT0tdGhpcy5fZip0aGlzLl95X3Yvbix0aGlzLl90PU1hdGguYWJzKGUvdGhpcy5feF9hKXx8TWF0aC5hYnModC90aGlzLl95X2EpLHRoaXMuX2xhc3REdD1udWxsLHRoaXMuX3N0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKX0sRnJpY3Rpb24ucHJvdG90eXBlLnNldFM9ZnVuY3Rpb24oZSx0KXt0aGlzLl94X3M9ZSx0aGlzLl95X3M9dH0sRnJpY3Rpb24ucHJvdG90eXBlLnM9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9KChuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSxlPnRoaXMuX3QmJihlPXRoaXMuX3QsdGhpcy5fbGFzdER0PWUpO3ZhciB0PXRoaXMuX3hfdiplKy41KnRoaXMuX3hfYSpNYXRoLnBvdyhlLDIpK3RoaXMuX3hfcyxuPXRoaXMuX3lfdiplKy41KnRoaXMuX3lfYSpNYXRoLnBvdyhlLDIpK3RoaXMuX3lfcztyZXR1cm4oMDx0aGlzLl94X2EmJnQ8dGhpcy5fZW5kUG9zaXRpb25YfHx0aGlzLl94X2E8MCYmdD50aGlzLl9lbmRQb3NpdGlvblgpJiYodD10aGlzLl9lbmRQb3NpdGlvblgpLCgwPHRoaXMuX3lfYSYmbjx0aGlzLl9lbmRQb3NpdGlvbll8fHRoaXMuX3lfYTwwJiZuPnRoaXMuX2VuZFBvc2l0aW9uWSkmJihuPXRoaXMuX2VuZFBvc2l0aW9uWSkse3g6dCx5Om59fSxGcmljdGlvbi5wcm90b3R5cGUuZHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSgobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksZT50aGlzLl90JiYoZT10aGlzLl90KSx7ZHg6dGhpcy5feF92K3RoaXMuX3hfYSplLGR5OnRoaXMuX3lfdit0aGlzLl95X2EqZX19LEZyaWN0aW9uLnByb3RvdHlwZS5kZWx0YT1mdW5jdGlvbigpe3JldHVybnt4Oi0xLjUqTWF0aC5wb3codGhpcy5feF92LDIpL3RoaXMuX3hfYXx8MCx5Oi0xLjUqTWF0aC5wb3codGhpcy5feV92LDIpL3RoaXMuX3lfYXx8MH19LEZyaWN0aW9uLnByb3RvdHlwZS5kdD1mdW5jdGlvbigpe3JldHVybi10aGlzLl94X3YvdGhpcy5feF9hfSxGcmljdGlvbi5wcm90b3R5cGUuZG9uZT1mdW5jdGlvbigpe3ZhciB0PWUodGhpcy5zKCkueCx0aGlzLl9lbmRQb3NpdGlvblgpfHxlKHRoaXMucygpLnksdGhpcy5fZW5kUG9zaXRpb25ZKXx8dGhpcy5fbGFzdER0PT09dGhpcy5fdDtyZXR1cm4gdGhpcy5fbGFzdER0PW51bGwsdH0sRnJpY3Rpb24ucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihlLHQpe3RoaXMuX2VuZFBvc2l0aW9uWD1lLHRoaXMuX2VuZFBvc2l0aW9uWT10fSxGcmljdGlvbi5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24oZSx0KXt0aGlzLl9tPWUsdGhpcy5fZj0xZTMqdH0sU3ByaW5nLnByb3RvdHlwZS5fc29sdmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9jLHI9dGhpcy5fbSxpPXRoaXMuX2ssbz1uKm4tNCpyKmk7aWYoMD09PW8pe3ZhciBhPS1uLygyKnIpLHM9ZSxjPXQvKGEqZSk7cmV0dXJue3g6ZnVuY3Rpb24oZSl7cmV0dXJuKHMrYyplKSpNYXRoLnBvdyhNYXRoLkUsYSplKX0sZHg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5wb3coTWF0aC5FLGEqZSk7cmV0dXJuIGEqKHMrYyplKSp0K2MqdH19fWlmKDA8byl7dmFyIHU9KC1uLU1hdGguc3FydChvKSkvKDIqciksbD0oLW4rTWF0aC5zcXJ0KG8pKS8oMipyKSxkPSh0LXUqZSkvKGwtdSksZj1lLWQ7cmV0dXJue3g6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4gZT09PXRoaXMuX3QmJih0PXRoaXMuX3Bvd0VSMVQsbj10aGlzLl9wb3dFUjJUKSx0aGlzLl90PWUsdHx8KHQ9dGhpcy5fcG93RVIxVD1NYXRoLnBvdyhNYXRoLkUsdSplKSksbnx8KG49dGhpcy5fcG93RVIyVD1NYXRoLnBvdyhNYXRoLkUsbCplKSksZip0K2Qqbn0sZHg6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4gZT09PXRoaXMuX3QmJih0PXRoaXMuX3Bvd0VSMVQsbj10aGlzLl9wb3dFUjJUKSx0aGlzLl90PWUsdHx8KHQ9dGhpcy5fcG93RVIxVD1NYXRoLnBvdyhNYXRoLkUsdSplKSksbnx8KG49dGhpcy5fcG93RVIyVD1NYXRoLnBvdyhNYXRoLkUsbCplKSksZip1KnQrZCpsKm59fX12YXIgcD1NYXRoLnNxcnQoNCpyKmktbipuKS8oMipyKSxoPS1uLzIqcix2PWUsZz0odC1oKmUpL3A7cmV0dXJue3g6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucG93KE1hdGguRSxoKmUpKih2Kk1hdGguY29zKHAqZSkrZypNYXRoLnNpbihwKmUpKX0sZHg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5wb3coTWF0aC5FLGgqZSksbj1NYXRoLmNvcyhwKmUpLHI9TWF0aC5zaW4ocCplKTtyZXR1cm4gdCooZypwKm4tdipwKnIpK2gqdCooZypyK3Yqbil9fX0sU3ByaW5nLnByb3RvdHlwZS54PWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0oKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHRoaXMuX3NvbHV0aW9uP3RoaXMuX2VuZFBvc2l0aW9uK3RoaXMuX3NvbHV0aW9uLngoZSk6MH0sU3ByaW5nLnByb3RvdHlwZS5keD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9KChuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0aGlzLl9zb2x1dGlvbj90aGlzLl9zb2x1dGlvbi5keChlKTowfSxTcHJpbmcucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihlLG4scil7aWYocnx8KHI9KG5ldyBEYXRlKS5nZXRUaW1lKCkpLGUhPT10aGlzLl9lbmRQb3NpdGlvbnx8IXQobiwuMSkpe249bnx8MDt2YXIgaT10aGlzLl9lbmRQb3NpdGlvbjt0aGlzLl9zb2x1dGlvbiYmKHQobiwuMSkmJihuPXRoaXMuX3NvbHV0aW9uLmR4KChyLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSksaT10aGlzLl9zb2x1dGlvbi54KChyLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0KG4sLjEpJiYobj0wKSx0KGksLjEpJiYoaT0wKSxpKz10aGlzLl9lbmRQb3NpdGlvbiksdGhpcy5fc29sdXRpb24mJnQoaS1lLC4xKSYmdChuLC4xKXx8KHRoaXMuX2VuZFBvc2l0aW9uPWUsdGhpcy5fc29sdXRpb249dGhpcy5fc29sdmUoaS10aGlzLl9lbmRQb3NpdGlvbixuKSx0aGlzLl9zdGFydFRpbWU9cil9fSxTcHJpbmcucHJvdG90eXBlLnNuYXA9ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX2VuZFBvc2l0aW9uPWUsdGhpcy5fc29sdXRpb249e3g6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gMH19fSxTcHJpbmcucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24obil7cmV0dXJuIG58fChuPShuZXcgRGF0ZSkuZ2V0VGltZSgpKSxlKHRoaXMueCgpLHRoaXMuX2VuZFBvc2l0aW9uLC4xKSYmdCh0aGlzLmR4KCksLjEpfSxTcHJpbmcucHJvdG90eXBlLnJlY29uZmlndXJlPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLl9tPWUsdGhpcy5faz10LHRoaXMuX2M9bix0aGlzLmRvbmUoKXx8KHRoaXMuX3NvbHV0aW9uPXRoaXMuX3NvbHZlKHRoaXMueCgpLXRoaXMuX2VuZFBvc2l0aW9uLHRoaXMuZHgoKSksdGhpcy5fc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKX0sU3ByaW5nLnByb3RvdHlwZS5zcHJpbmdDb25zdGFudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9rfSxTcHJpbmcucHJvdG90eXBlLmRhbXBpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY30sU3ByaW5nLnByb3RvdHlwZS5jb25maWd1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuW3tsYWJlbDoiU3ByaW5nIENvbnN0YW50IixyZWFkOnRoaXMuc3ByaW5nQ29uc3RhbnQuYmluZCh0aGlzKSx3cml0ZTpmdW5jdGlvbihlLHQpe2UucmVjb25maWd1cmUoMSx0LGUuZGFtcGluZygpKX0uYmluZCh0aGlzLHRoaXMpLG1pbjoxMDAsbWF4OjFlM30se2xhYmVsOiJEYW1waW5nIixyZWFkOnRoaXMuZGFtcGluZy5iaW5kKHRoaXMpLHdyaXRlOmZ1bmN0aW9uKGUsdCl7ZS5yZWNvbmZpZ3VyZSgxLGUuc3ByaW5nQ29uc3RhbnQoKSx0KX0uYmluZCh0aGlzLHRoaXMpLG1pbjoxLG1heDo1MDB9XX0sU1RELnByb3RvdHlwZS5zZXRFbmQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dGhpcy5fc3ByaW5nWC5zZXRFbmQoZSxyLGkpLHRoaXMuX3NwcmluZ1kuc2V0RW5kKHQscixpKSx0aGlzLl9zcHJpbmdTY2FsZS5zZXRFbmQobixyLGkpLHRoaXMuX3N0YXJ0VGltZT1pfSxTVEQucHJvdG90eXBlLng9ZnVuY3Rpb24oKXt2YXIgZT0oKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTM7cmV0dXJue3g6dGhpcy5fc3ByaW5nWC54KGUpLHk6dGhpcy5fc3ByaW5nWS54KGUpLHNjYWxlOnRoaXMuX3NwcmluZ1NjYWxlLngoZSl9fSxTVEQucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oKXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdGhpcy5fc3ByaW5nWC5kb25lKGUpJiZ0aGlzLl9zcHJpbmdZLmRvbmUoZSkmJnRoaXMuX3NwcmluZ1NjYWxlLmRvbmUoZSl9LFNURC5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX3NwcmluZ1gucmVjb25maWd1cmUoZSx0LG4pLHRoaXMuX3NwcmluZ1kucmVjb25maWd1cmUoZSx0LG4pLHRoaXMuX3NwcmluZ1NjYWxlLnJlY29uZmlndXJlKGUsdCxuKX07dmFyIHJlcXVlc3Rpbmc9ITE7ZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpe3JldHVybiBzZXRUaW1lb3V0KGUsMTYpfWZ1bmN0aW9uIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGUpe2NsZWFyVGltZW91dChlKX1mdW5jdGlvbiBfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpe3JlcXVlc3Rpbmd8fChyZXF1ZXN0aW5nPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2UoKSxyZXF1ZXN0aW5nPSExfSkpfWZ1bmN0aW9uIHYoZSx0KXtyZXR1cm4rKCgxZTMqZS0xZTMqdCkvMWUzKS50b0ZpeGVkKDEpfWZ1bmN0aW9uIGcoYSxlLHQpe3ZhciBuPXtpZDowLGNhbmNlbGxlZDohMX07cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIsaSl7aWYoIXR8fCF0LmNhbmNlbGxlZCl7cihuKTt2YXIgbz1hLmRvbmUoKTtvfHx0LmNhbmNlbGxlZHx8KHQuaWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUuYmluZChudWxsLHQsbixyLGkpKSksbyYmaSYmaShuKX19KG4sYSxlLHQpLHtjYW5jZWw6ZnVuY3Rpb24oZSl7ZSYmZS5pZCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoZS5pZCksZSYmKGUuY2FuY2VsbGVkPSEwKX0uYmluZChudWxsLG4pLG1vZGVsOmF9fWZ1bmN0aW9uIGdldE1vdmFibGVWaWV3KGUpe3ZhciB0PWUucmVxdWlyZU1vZHVsZSgiZG9tIikscz1lLnJlcXVpcmVNb2R1bGUoImFuaW1hdGlvbiIpO3JldHVybntuYW1lOiJNb3ZhYmxlVmlldyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W3RvdWNodHJhY2ssZW1pdHRlcl0scHJvcHM6e2RpcmVjdGlvbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibm9uZSJ9LGluZXJ0aWE6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxvdXRPZkJvdW5kczp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0seTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxkYW1waW5nOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjIwfSxmcmljdGlvbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoyfSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHNjYWxlOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sc2NhbGVNaW46e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6LjV9LHNjYWxlTWF4Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjEwfSxzY2FsZVZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGFuaW1hdGlvbjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITB9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3hTeW5jOnRoaXMuX2dldFB4KHRoaXMueCkseVN5bmM6dGhpcy5fZ2V0UHgodGhpcy55KSxzY2FsZVZhbHVlU3luYzp0aGlzLl9nZXRTY2FsZU51bWJlcih0aGlzLnNjYWxlVmFsdWUpLHdpZHRoOjAsaGVpZ2h0OjAsbWluWDowLG1pblk6MCxtYXhYOjAsbWF4WTowfX0sY29tcHV0ZWQ6e2RhbXBpbmdOdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5kYW1waW5nKTtyZXR1cm4gaXNOYU4oZSk/MjA6ZX0sZnJpY3Rpb25OdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5mcmljdGlvbik7cmV0dXJuIGlzTmFOKGUpfHxlPD0wPzI6ZX0sc2NhbGVNaW5OdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5zY2FsZU1pbik7cmV0dXJuIGlzTmFOKGUpPy41OmV9LHNjYWxlTWF4TnVtYmVyOmZ1bmN0aW9uKCl7dmFyIGU9TnVtYmVyKHRoaXMuc2NhbGVNYXgpO3JldHVybiBpc05hTihlKT8xMDplfSx4TW92ZTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5kaXJlY3Rpb258fCJob3Jpem9udGFsIj09PXRoaXMuZGlyZWN0aW9ufSx5TW92ZTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5kaXJlY3Rpb258fCJ2ZXJ0aWNhbCI9PT10aGlzLmRpcmVjdGlvbn19LHdhdGNoOnt4OmZ1bmN0aW9uKGUpe3RoaXMueFN5bmM9dGhpcy5fZ2V0UHgoZSl9LHhTeW5jOmZ1bmN0aW9uKGUpe3RoaXMuX3NldFgoZSl9LHk6ZnVuY3Rpb24oZSl7dGhpcy55U3luYz10aGlzLl9nZXRQeChlKX0seVN5bmM6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0WShlKX0sc2NhbGVWYWx1ZTpmdW5jdGlvbihlKXt0aGlzLl9zZXRTY2FsZVZhbHVlKHRoaXMuX2dldFNjYWxlTnVtYmVyKGUpKX0sc2NhbGVWYWx1ZVN5bmM6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0U2NhbGVWYWx1ZShlKX0sc2NhbGVNaW5OdW1iZXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTY2FsZU1pbk9yTWF4KCl9LHNjYWxlTWF4TnVtYmVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2NhbGVNaW5Pck1heCgpfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX29mZnNldD17eDowLHk6MH0sdGhpcy5fc2NhbGVPZmZzZXQ9e3g6MCx5OjB9LHRoaXMuX3RyYW5zbGF0ZVg9MCx0aGlzLl90cmFuc2xhdGVZPTAsdGhpcy5fc2NhbGU9MSx0aGlzLl9vbGRTY2FsZT0xLHRoaXMuX1NURD1uZXcgU1REKDEsOSpNYXRoLnBvdyh0aGlzLmRhbXBpbmdOdW1iZXIsMikvNDAsdGhpcy5kYW1waW5nTnVtYmVyKSx0aGlzLl9mcmljdGlvbj1uZXcgRnJpY3Rpb24oMSx0aGlzLmZyaWN0aW9uTnVtYmVyKSx0aGlzLl9kZWNsaW5lWD1uZXcgRGVjbGluZSx0aGlzLl9kZWNsaW5lWT1uZXcgRGVjbGluZSx0aGlzLl9fdG91Y2hJbmZvPXtoaXN0b3J5WDpbMCwwXSxoaXN0b3J5WTpbMCwwXSxoaXN0b3J5VDpbMCwwXX0sdGhpcy5fcmVjdD17dG9wOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjB9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnRvdWNodHJhY2soIl9vblRyYWNrIiksc2V0VGltZW91dChmdW5jdGlvbigpe2UuX3VwZGF0ZVJlY3QoKS50aGVuKGZ1bmN0aW9uKCl7ZS5zZXRQYXJlbnQoKX0pfSwxMDApLHRoaXMuX2ZyaWN0aW9uLnJlY29uZmlndXJlKDEsdGhpcy5mcmljdGlvbk51bWJlciksdGhpcy5fU1RELnJlY29uZmlndXJlKDEsOSpNYXRoLnBvdyh0aGlzLmRhbXBpbmdOdW1iZXIsMikvNDAsdGhpcy5kYW1waW5nTnVtYmVyKX0sbWV0aG9kczp7X2dldFB4OmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoZSl8fDB9LF9nZXRTY2FsZU51bWJlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1OdW1iZXIoZSksaXNOYU4oZSk/MTplfSxfc2V0WDpmdW5jdGlvbihlKXtpZih0aGlzLnhNb3ZlKXtpZihlK3RoaXMuX3NjYWxlT2Zmc2V0Lng9PT10aGlzLl90cmFuc2xhdGVYKXJldHVybiB0aGlzLl90cmFuc2xhdGVYO3RoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpLHRoaXMuX2FuaW1hdGlvblRvKGUrdGhpcy5fc2NhbGVPZmZzZXQueCx0aGlzLnlTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0LnksdGhpcy5fc2NhbGUpfXJldHVybiBlfSxfc2V0WTpmdW5jdGlvbihlKXtpZih0aGlzLnlNb3ZlKXtpZihlK3RoaXMuX3NjYWxlT2Zmc2V0Lnk9PT10aGlzLl90cmFuc2xhdGVZKXJldHVybiB0aGlzLl90cmFuc2xhdGVZO3RoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpLHRoaXMuX2FuaW1hdGlvblRvKHRoaXMueFN5bmMrdGhpcy5fc2NhbGVPZmZzZXQueCxlK3RoaXMuX3NjYWxlT2Zmc2V0LnksdGhpcy5fc2NhbGUpfXJldHVybiBlfSxfc2V0U2NhbGVNaW5Pck1heDpmdW5jdGlvbigpe2lmKCF0aGlzLnNjYWxlKXJldHVybiExO3RoaXMuX3VwZGF0ZVNjYWxlKHRoaXMuX3NjYWxlLCEwKSx0aGlzLl91cGRhdGVPbGRTY2FsZSh0aGlzLl9zY2FsZSl9LF9zZXRTY2FsZVZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiEhdGhpcy5zY2FsZSYmKGU9dGhpcy5fYWRqdXN0U2NhbGUoZSksdGhpcy5fdXBkYXRlU2NhbGUoZSwhMCksdGhpcy5fdXBkYXRlT2xkU2NhbGUoZSksZSl9LF9faGFuZGxlVG91Y2hTdGFydDpmdW5jdGlvbigpe3RoaXMuX2lzU2NhbGluZ3x8dGhpcy5kaXNhYmxlZHx8KHRoaXMuX0ZBJiZ0aGlzLl9GQS5jYW5jZWwoKSx0aGlzLl9TRkEmJnRoaXMuX1NGQS5jYW5jZWwoKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlYPVswLDBdLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVk9WzAsMF0sdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VD1bMCwwXSx0aGlzLnhNb3ZlJiYodGhpcy5fX2Jhc2VYPXRoaXMuX3RyYW5zbGF0ZVgpLHRoaXMueU1vdmUmJih0aGlzLl9fYmFzZVk9dGhpcy5fdHJhbnNsYXRlWSksdGhpcy5fY2hlY2tDYW5Nb3ZlPW51bGwsdGhpcy5fZmlyc3RNb3ZlRGlyZWN0aW9uPW51bGwsdGhpcy5faXNUb3VjaGluZz0hMCl9LF9faGFuZGxlVG91Y2hNb3ZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoIXRoaXMuX2lzU2NhbGluZyYmIXRoaXMuZGlzYWJsZWQmJnRoaXMuX2lzVG91Y2hpbmcpe3ZhciBuPXRoaXMuX3RyYW5zbGF0ZVgscj10aGlzLl90cmFuc2xhdGVZO2lmKG51bGw9PT10aGlzLl9maXJzdE1vdmVEaXJlY3Rpb24mJih0aGlzLl9maXJzdE1vdmVEaXJlY3Rpb249MTxNYXRoLmFicyhlLmRldGFpbC5keC9lLmRldGFpbC5keSk/Imh0b3VjaG1vdmUiOiJ2dG91Y2htb3ZlIiksdGhpcy54TW92ZSYmKG49ZS5kZXRhaWwuZHgrdGhpcy5fX2Jhc2VYLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVguc2hpZnQoKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlYLnB1c2gobiksdGhpcy55TW92ZXx8bnVsbCE9PXRoaXMuX2NoZWNrQ2FuTW92ZXx8KHRoaXMuX2NoZWNrQ2FuTW92ZT1NYXRoLmFicyhlLmRldGFpbC5keC9lLmRldGFpbC5keSk8MSkpLHRoaXMueU1vdmUmJihyPWUuZGV0YWlsLmR5K3RoaXMuX19iYXNlWSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlZLnNoaWZ0KCksdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WS5wdXNoKHIpLHRoaXMueE1vdmV8fG51bGwhPT10aGlzLl9jaGVja0Nhbk1vdmV8fCh0aGlzLl9jaGVja0Nhbk1vdmU9TWF0aC5hYnMoZS5kZXRhaWwuZHkvZS5kZXRhaWwuZHgpPDEpKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlULnNoaWZ0KCksdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VC5wdXNoKGUuZGV0YWlsLnRpbWVTdGFtcCksIXRoaXMuX2NoZWNrQ2FuTW92ZSl7dmFyIGk9InRvdWNoIjtuPHRoaXMubWluWD90aGlzLm91dE9mQm91bmRzPyhpPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixuPXRoaXMubWluWC10aGlzLl9kZWNsaW5lWC54KHRoaXMubWluWC1uKSk6bj10aGlzLm1pblg6bj50aGlzLm1heFgmJih0aGlzLm91dE9mQm91bmRzPyhpPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixuPXRoaXMubWF4WCt0aGlzLl9kZWNsaW5lWC54KG4tdGhpcy5tYXhYKSk6bj10aGlzLm1heFgpLHI8dGhpcy5taW5ZP3RoaXMub3V0T2ZCb3VuZHM/KGk9InRvdWNoLW91dC1vZi1ib3VuZHMiLHI9dGhpcy5taW5ZLXRoaXMuX2RlY2xpbmVZLngodGhpcy5taW5ZLXIpKTpyPXRoaXMubWluWTpyPnRoaXMubWF4WSYmKHRoaXMub3V0T2ZCb3VuZHM/KGk9InRvdWNoLW91dC1vZi1ib3VuZHMiLHI9dGhpcy5tYXhZK3RoaXMuX2RlY2xpbmVZLngoci10aGlzLm1heFkpKTpyPXRoaXMubWF4WSksX3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuX3NldFRyYW5zZm9ybShuLHIsdC5fc2NhbGUsaSl9KX19fSxfX2hhbmRsZVRvdWNoRW5kOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcztpZighdGhpcy5faXNTY2FsaW5nJiYhdGhpcy5kaXNhYmxlZCYmdGhpcy5faXNUb3VjaGluZyYmKHRoaXMuX2lzVG91Y2hpbmc9ITEsIXRoaXMuX2NoZWNrQ2FuTW92ZSYmIXRoaXMuX3JldmlzZSgib3V0LW9mLWJvdW5kcyIpJiZ0aGlzLmluZXJ0aWEpKXt2YXIgZT0xZTMqKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVhbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WFswXSkvKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVRbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VFswXSksdD0xZTMqKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVlbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WVswXSkvKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVRbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VFswXSk7dGhpcy5fZnJpY3Rpb24uc2V0VihlLHQpLHRoaXMuX2ZyaWN0aW9uLnNldFModGhpcy5fdHJhbnNsYXRlWCx0aGlzLl90cmFuc2xhdGVZKTt2YXIgbj10aGlzLl9mcmljdGlvbi5kZWx0YSgpLngsaT10aGlzLl9mcmljdGlvbi5kZWx0YSgpLnksbz1uK3RoaXMuX3RyYW5zbGF0ZVgsYT1pK3RoaXMuX3RyYW5zbGF0ZVk7bzx0aGlzLm1pblg/KG89dGhpcy5taW5YLGE9dGhpcy5fdHJhbnNsYXRlWSsodGhpcy5taW5YLXRoaXMuX3RyYW5zbGF0ZVgpKmkvbik6bz50aGlzLm1heFgmJihvPXRoaXMubWF4WCxhPXRoaXMuX3RyYW5zbGF0ZVkrKHRoaXMubWF4WC10aGlzLl90cmFuc2xhdGVYKSppL24pLGE8dGhpcy5taW5ZPyhhPXRoaXMubWluWSxvPXRoaXMuX3RyYW5zbGF0ZVgrKHRoaXMubWluWS10aGlzLl90cmFuc2xhdGVZKSpuL2kpOmE+dGhpcy5tYXhZJiYoYT10aGlzLm1heFksbz10aGlzLl90cmFuc2xhdGVYKyh0aGlzLm1heFktdGhpcy5fdHJhbnNsYXRlWSkqbi9pKSx0aGlzLl9mcmljdGlvbi5zZXRFbmQobyxhKSx0aGlzLl9GQT1nKHRoaXMuX2ZyaWN0aW9uLGZ1bmN0aW9uKCl7dmFyIGU9ci5fZnJpY3Rpb24ucygpLHQ9ZS54LG49ZS55O3IuX3NldFRyYW5zZm9ybSh0LG4sci5fc2NhbGUsImZyaWN0aW9uIil9LGZ1bmN0aW9uKCl7ci5fRkEuY2FuY2VsKCl9KX19LF9vblRyYWNrOmZ1bmN0aW9uKGUpe3N3aXRjaChlLmRldGFpbC5zdGF0ZSl7Y2FzZSJzdGFydCI6dGhpcy5fX2hhbmRsZVRvdWNoU3RhcnQoKTticmVhaztjYXNlIm1vdmUiOnRoaXMuX19oYW5kbGVUb3VjaE1vdmUoZSk7YnJlYWs7Y2FzZSJlbmQiOnRoaXMuX19oYW5kbGVUb3VjaEVuZCgpfX0sX2dldExpbWl0WFk6ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMTtyZXR1cm4gZT50aGlzLm1heFg/KGU9dGhpcy5tYXhYLG49ITApOmU8dGhpcy5taW5YJiYoZT10aGlzLm1pblgsbj0hMCksdD50aGlzLm1heFk/KHQ9dGhpcy5tYXhZLG49ITApOnQ8dGhpcy5taW5ZJiYodD10aGlzLm1pblksbj0hMCkse3g6ZSx5OnQsb3V0T2ZCb3VuZHM6bn19LHNldFBhcmVudDpmdW5jdGlvbigpe2lmKHRoaXMuJHBhcmVudC5fX2lzTW91bnRlZCl7dGhpcy5fRkEmJnRoaXMuX0ZBLmNhbmNlbCgpLHRoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpO3ZhciBlPXRoaXMuc2NhbGU/dGhpcy5zY2FsZVZhbHVlU3luYzoxO3RoaXMuX3VwZGF0ZU9mZnNldCgpLHRoaXMuX3VwZGF0ZVdIKGUpLHRoaXMuX3VwZGF0ZUJvdW5kYXJ5KCksdGhpcy5fdHJhbnNsYXRlWD10aGlzLnhTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0LngsdGhpcy5fdHJhbnNsYXRlWT10aGlzLnlTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0Lnk7dmFyIHQ9dGhpcy5fZ2V0TGltaXRYWSh0aGlzLl90cmFuc2xhdGVYLHRoaXMuX3RyYW5zbGF0ZVkpLG49dC54LHI9dC55O3RoaXMuX3NldFRyYW5zZm9ybShuLHIsZSwiIiwhMCksdGhpcy5fdXBkYXRlT2xkU2NhbGUoZSl9fSxfdXBkYXRlT2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5fb2Zmc2V0Lng9dGhpcy5fcmVjdC5sZWZ0LXRoaXMuJHBhcmVudC5sZWZ0LHRoaXMuX29mZnNldC55PXRoaXMuX3JlY3QudG9wLXRoaXMuJHBhcmVudC50b3B9LF91cGRhdGVXSDpmdW5jdGlvbihlKXtlPWV8fHRoaXMuX3NjYWxlLGU9dGhpcy5fYWRqdXN0U2NhbGUoZSk7dmFyIHQ9dGhpcy5fcmVjdDt0aGlzLmhlaWdodD10LmhlaWdodC90aGlzLl9zY2FsZSx0aGlzLndpZHRoPXQud2lkdGgvdGhpcy5fc2NhbGU7dmFyIG49dGhpcy5oZWlnaHQqZSxyPXRoaXMud2lkdGgqZTt0aGlzLl9zY2FsZU9mZnNldC54PShyLXRoaXMud2lkdGgpLzIsdGhpcy5fc2NhbGVPZmZzZXQueT0obi10aGlzLmhlaWdodCkvMn0sX3VwZGF0ZUJvdW5kYXJ5OmZ1bmN0aW9uKCl7dmFyIGU9MC10aGlzLl9vZmZzZXQueCt0aGlzLl9zY2FsZU9mZnNldC54LHQ9dGhpcy4kcGFyZW50LndpZHRoLXRoaXMud2lkdGgtdGhpcy5fb2Zmc2V0LngtdGhpcy5fc2NhbGVPZmZzZXQueDt0aGlzLm1pblg9TWF0aC5taW4oZSx0KSx0aGlzLm1heFg9TWF0aC5tYXgoZSx0KTt2YXIgbj0wLXRoaXMuX29mZnNldC55K3RoaXMuX3NjYWxlT2Zmc2V0Lnkscj10aGlzLiRwYXJlbnQuaGVpZ2h0LXRoaXMuaGVpZ2h0LXRoaXMuX29mZnNldC55LXRoaXMuX3NjYWxlT2Zmc2V0Lnk7dGhpcy5taW5ZPU1hdGgubWluKG4sciksdGhpcy5tYXhZPU1hdGgubWF4KG4scil9LF9iZWdpblNjYWxlOmZ1bmN0aW9uKCl7dGhpcy5faXNTY2FsaW5nPSEwfSxfZW5kU2NhbGU6ZnVuY3Rpb24oKXt0aGlzLl9pc1NjYWxpbmc9ITEsdGhpcy5fdXBkYXRlT2xkU2NhbGUodGhpcy5fc2NhbGUpfSxfc2V0U2NhbGU6ZnVuY3Rpb24oZSl7dGhpcy5zY2FsZSYmKGU9dGhpcy5fYWRqdXN0U2NhbGUoZSksZT10aGlzLl9vbGRTY2FsZSplLHRoaXMuX2JlZ2luU2NhbGUoKSx0aGlzLl91cGRhdGVTY2FsZShlKSl9LF91cGRhdGVTY2FsZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYodGhpcy5zY2FsZSl7ZT10aGlzLl9hZGp1c3RTY2FsZShlKSx0aGlzLl91cGRhdGVXSChlKSx0aGlzLl91cGRhdGVCb3VuZGFyeSgpO3ZhciByPXRoaXMuX2dldExpbWl0WFkodGhpcy5fdHJhbnNsYXRlWCx0aGlzLl90cmFuc2xhdGVZKSxpPXIueCxvPXIueTt0P3RoaXMuX2FuaW1hdGlvblRvKGksbyxlLCIiLCEwLCEwKTpfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7bi5fc2V0VHJhbnNmb3JtKGksbyxlLCIiLCEwLCEwKX0pfX0sX3VwZGF0ZU9sZFNjYWxlOmZ1bmN0aW9uKGUpe3RoaXMuX29sZFNjYWxlPWV9LF9hZGp1c3RTY2FsZTpmdW5jdGlvbihlKXtyZXR1cm4gZT1NYXRoLm1heCguNSx0aGlzLnNjYWxlTWluTnVtYmVyLGUpLGU9TWF0aC5taW4oMTAsdGhpcy5zY2FsZU1heE51bWJlcixlKX0sX2FuaW1hdGlvblRvOmZ1bmN0aW9uKGUsdCxuLGksbyxhKXt2YXIgcz10aGlzO3RoaXMuX0ZBJiZ0aGlzLl9GQS5jYW5jZWwoKSx0aGlzLl9TRkEmJnRoaXMuX1NGQS5jYW5jZWwoKSx0aGlzLnhNb3ZlfHwoZT10aGlzLl90cmFuc2xhdGVYKSx0aGlzLnlNb3ZlfHwodD10aGlzLl90cmFuc2xhdGVZKSx0aGlzLnNjYWxlfHwobj10aGlzLl9zY2FsZSk7dmFyIHI9dGhpcy5fZ2V0TGltaXRYWShlLHQpO2U9ci54LHQ9ci55LHRoaXMuYW5pbWF0aW9uPyh0aGlzLl9TVEQuX3NwcmluZ1guX3NvbHV0aW9uPW51bGwsdGhpcy5fU1RELl9zcHJpbmdZLl9zb2x1dGlvbj1udWxsLHRoaXMuX1NURC5fc3ByaW5nU2NhbGUuX3NvbHV0aW9uPW51bGwsdGhpcy5fU1RELl9zcHJpbmdYLl9lbmRQb3NpdGlvbj10aGlzLl90cmFuc2xhdGVYLHRoaXMuX1NURC5fc3ByaW5nWS5fZW5kUG9zaXRpb249dGhpcy5fdHJhbnNsYXRlWSx0aGlzLl9TVEQuX3NwcmluZ1NjYWxlLl9lbmRQb3NpdGlvbj10aGlzLl9zY2FsZSx0aGlzLl9TVEQuc2V0RW5kKGUsdCxuLDEpLHRoaXMuX1NGQT1nKHRoaXMuX1NURCxmdW5jdGlvbigpe3ZhciBlPXMuX1NURC54KCksdD1lLngsbj1lLnkscj1lLnNjYWxlO3MuX3NldFRyYW5zZm9ybSh0LG4scixpLG8sYSl9LGZ1bmN0aW9uKCl7cy5fU0ZBLmNhbmNlbCgpfSkpOnRoaXMuX3NldFRyYW5zZm9ybShlLHQsbixpLG8sYSl9LF9yZXZpc2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0TGltaXRYWSh0aGlzLl90cmFuc2xhdGVYLHRoaXMuX3RyYW5zbGF0ZVkpLG49dC54LHI9dC55LGk9dC5vdXRPZkJvdW5kcztyZXR1cm4gaSYmdGhpcy5fYW5pbWF0aW9uVG8obixyLHRoaXMuX3NjYWxlLGUpLGl9LF9zZXRUcmFuc2Zvcm06ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZvaWQgMD09PXImJihyPSIiKSxudWxsIT09ZSYmIk5hTiIhPT1lLnRvU3RyaW5nKCkmJiJudW1iZXIiPT10eXBlb2YgZXx8KGU9dGhpcy5fdHJhbnNsYXRlWHx8MCksbnVsbCE9PXQmJiJOYU4iIT09dC50b1N0cmluZygpJiYibnVtYmVyIj09dHlwZW9mIHR8fCh0PXRoaXMuX3RyYW5zbGF0ZVl8fDApLGU9TnVtYmVyKGUudG9GaXhlZCgxKSksdD1OdW1iZXIodC50b0ZpeGVkKDEpKSxuPU51bWJlcihuLnRvRml4ZWQoMSkpLHRoaXMuX3RyYW5zbGF0ZVg9PT1lJiZ0aGlzLl90cmFuc2xhdGVZPT09dHx8aXx8dGhpcy4kdHJpZ2dlcigiY2hhbmdlIix7eDp2KGUsdGhpcy5fc2NhbGVPZmZzZXQueCkseTp2KHQsdGhpcy5fc2NhbGVPZmZzZXQueSksc291cmNlOnJ9KSx0aGlzLnNjYWxlfHwobj10aGlzLl9zY2FsZSksbj0rKG49dGhpcy5fYWRqdXN0U2NhbGUobikpLnRvRml4ZWQoMyksbyYmbiE9PXRoaXMuX3NjYWxlJiZ0aGlzLiR0cmlnZ2VyKCJzY2FsZSIse3g6ZSx5OnQsc2NhbGU6bn0pO3ZhciBhPSJ0cmFuc2xhdGUoIitlKyJweCwgIit0KyJweCkgc2NhbGUoIituKyIpIjtzLnRyYW5zaXRpb24odGhpcy4kcmVmcy5lbCx7c3R5bGVzOnt0cmFuc2Zvcm06YX0sZHVyYXRpb246MCxkZWxheTowfSksdGhpcy5fdHJhbnNsYXRlWD1lLHRoaXMuX3RyYW5zbGF0ZVk9dCx0aGlzLl9zY2FsZT1ufSxfdG91Y2hzdGFydDpmdW5jdGlvbigpe3RoaXMuJHBhcmVudC50b3VjaEl0ZW09dGhpc30sX2dldENvbXBvbmVudFNpemU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe3QuZ2V0Q29tcG9uZW50UmVjdChlLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2l6ZTtuKHQpfSl9KX0sX3VwZGF0ZVJlY3Q6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl9nZXRDb21wb25lbnRTaXplKHRoaXMuJHJlZnMuZWwpLnRoZW4oZnVuY3Rpb24oZSl7dC5fcmVjdD1lfSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e3RvdWNoc3RhcnQ6dGhpcy5fdG91Y2hzdGFydH07cmV0dXJuIGUoImRpdiIsdGhpcy5fZyh7cmVmOiJlbCIsb246dCxzdGF0aWNDbGFzczpbInVuaS1tb3ZhYmxlLXZpZXciXSxzdGF0aWNTdHlsZTp7dHJhbnNmb3JtT3JpZ2luOiJjZW50ZXIifSxhdHRyczp7cHJldmVudEdlc3R1cmU6ITB9fSx0aGlzLiRsaXN0ZW5lcnMpLHRoaXMuJHNsb3RzLmRlZmF1bHQsMil9LHN0eWxlOnsidW5pLW1vdmFibGUtdmlldyI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiIwcHgiLGxlZnQ6IjBweCIsd2lkdGg6IjEwcHgiLGhlaWdodDoiMTBweCJ9fX19ZnVuY3Rpb24gaW5pdCQxMihlLHQpe2UuY29tcG9uZW50KCJtb3ZhYmxlLXZpZXciLGdldE1vdmFibGVWaWV3KHQpKX12YXIgT1BFTl9UWVBFUyQxPXtuYXZpZ2F0ZToibmF2aWdhdGVUbyIscmVkaXJlY3Q6InJlZGlyZWN0VG8iLHN3aXRjaFRhYjoic3dpdGNoVGFiIixyZUxhdW5jaDoicmVMYXVuY2giLG5hdmlnYXRlQmFjazoibmF2aWdhdGVCYWNrIn0sQU5JTUFUSU9OX1RZUEVfSU49WyJzbGlkZS1pbi1yaWdodCIsInNsaWRlLWluLWxlZnQiLCJzbGlkZS1pbi10b3AiLCJzbGlkZS1pbi1ib3R0b20iLCJmYWRlLWluIiwiem9vbS1vdXQiLCJ6b29tLWZhZGUtb3V0IiwicG9wLWluIiwibm9uZSJdLEFOSU1BVElPTl9UWVBFX09VVD1bInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdLHBsdXNfLEJyb2FkY2FzdENoYW5uZWxfLGNoYW5uZWw7ZnVuY3Rpb24gZ2V0TmF2aWdhdG9yKGUsdCl7cmV0dXJue25hbWU6Ik5hdmlnYXRvciIsaXNSZXNlcnZlZDohMCxwcm9wczp7dXJsOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxvcGVuVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibmF2aWdhdGUiLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4hIU9QRU5fVFlQRVMkMVtlXX19LGRlbHRhOnt0eXBlOk51bWJlcixkZWZhdWx0OjF9LGFuaW1hdGlvblR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4hZXx8fkFOSU1BVElPTl9UWVBFX0lOLmNvbmNhdChBTklNQVRJT05fVFlQRV9PVVQpLmluZGV4T2YoZSl9fSxhbmltYXRpb25EdXJhdGlvbjp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDozMDB9LGhvdmVyQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5hdmlnYXRvci1ob3ZlciJ9LGhvdmVyU3RvcFByb3BhZ2F0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0saG92ZXJTdGFydFRpbWU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NTB9LGhvdmVyU3RheVRpbWU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NjAwfX0sbWV0aG9kczp7X2NsaWNrOmZ1bmN0aW9uKCl7aWYoIm5hdmlnYXRlQmFjayI9PT10aGlzLm9wZW5UeXBlfHx0aGlzLnVybCl7dmFyIGU9cGFyc2VJbnQodGhpcy5hbmltYXRpb25EdXJhdGlvbik7c3dpdGNoKHRoaXMub3BlblR5cGUpe2Nhc2UibmF2aWdhdGUiOnQubmF2aWdhdGVUbyh7dXJsOnRoaXMudXJsLGFuaW1hdGlvblR5cGU6dGhpcy5hbmltYXRpb25UeXBlfHwicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjplfSk7YnJlYWs7Y2FzZSJyZWRpcmVjdCI6dC5yZWRpcmVjdFRvKHt1cmw6dGhpcy51cmx9KTticmVhaztjYXNlInN3aXRjaFRhYiI6dC5zd2l0Y2hUYWIoe3VybDp0aGlzLnVybH0pO2JyZWFrO2Nhc2UicmVMYXVuY2giOnQucmVMYXVuY2goe3VybDp0aGlzLnVybH0pO2JyZWFrO2Nhc2UibmF2aWdhdGVCYWNrIjp0Lm5hdmlnYXRlQmFjayh7ZGVsdGE6dGhpcy5kZWx0YSxhbmltYXRpb25UeXBlOnRoaXMuYW5pbWF0aW9uVHlwZXx8InBvcC1vdXQiLGFuaW1hdGlvbkR1cmF0aW9uOmV9KX19ZWxzZSBjb25zb2xlLmVycm9yKCI8bmF2aWdhdG9yLz4gc2hvdWxkIGhhdmUgdXJsIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIG5hdmlnYXRlVG8sIHJlZGlyZWN0VG8sIHJlTGF1bmNoIG9yIHN3aXRjaFRhYiIpfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJ2aWV3Iix0aGlzLl9nKHthdHRyczp7aG92ZXJDbGFzczp0aGlzLmhvdmVyQ2xhc3MsaG92ZXJTdG9wUHJvcGFnYXRpb246dGhpcy5ob3ZlclN0b3BQcm9wYWdhdGlvbixob3ZlclN0YXJ0VGltZTp0aGlzLmhvdmVyU3RhcnRUaW1lLGhvdmVyU3RheVRpbWU6dGhpcy5ob3ZlclN0YXlUaW1lfSxvbjp7Y2xpY2s6dGhpcy5fY2xpY2t9fSx0aGlzLiRsaXN0ZW5lcnMpLFt0aGlzLl90KCJkZWZhdWx0IildLDIpfSxzdHlsZTp7Im5hdmlnYXRvci1ob3ZlciI6e2JhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwLjEpIixvcGFjaXR5Oi43fX19fWZ1bmN0aW9uIGluaXQkMTMoZSx0LG4pe2UuY29tcG9uZW50KCJuYXZpZ2F0b3IiLGdldE5hdmlnYXRvcih0LG4udW5pKSl9ZnVuY3Rpb24gZ2V0UnVudGltZSgpe3JldHVybiJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvciYmIm9iamVjdCI9PXR5cGVvZiBkb2N1bWVudD8id2VidmlldyI6InY4In1mdW5jdGlvbiBnZXRQYWdlSWQoKXtyZXR1cm4gcGx1c18ud2Vidmlldy5jdXJyZW50V2VidmlldygpLmlkfXZhciBjYWxsYmFja3M9e307ZnVuY3Rpb24gb25QbHVzTWVzc2FnZShlKXt2YXIgdD1lLmRhdGEmJmUuZGF0YS5fX21lc3NhZ2U7aWYodCYmdC5fX3BhZ2Upe3ZhciBuPXQuX19wYWdlLHI9Y2FsbGJhY2tzW25dO3ImJnIodCksdC5rZWVwfHxkZWxldGUgY2FsbGJhY2tzW25dfX1mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGUsdCl7InY4Ij09PWdldFJ1bnRpbWUoKT8oY2hhbm5lbCYmY2hhbm5lbC5jbG9zZSgpLChjaGFubmVsPW5ldyBCcm9hZGNhc3RDaGFubmVsXyhnZXRQYWdlSWQoKSkpLm9ubWVzc2FnZT1vblBsdXNNZXNzYWdlKTp3aW5kb3cuX19wbHVzTWVzc2FnZT1vblBsdXNNZXNzYWdlLGNhbGxiYWNrc1tlXT10fXZhciBQYWdlPWZ1bmN0aW9uKGUpe3RoaXMud2Vidmlldz1lfTtmdW5jdGlvbiBzaG93UGFnZShlKXt2YXIgdD1lLmNvbnRleHQ7dm9pZCAwPT09dCYmKHQ9e30pO3ZhciBuPWUudXJsLHI9ZS5kYXRhO3ZvaWQgMD09PXImJihyPXt9KTt2YXIgaT1lLnN0eWxlO3ZvaWQgMD09PWkmJihpPXt9KTt2YXIgbz1lLm9uTWVzc2FnZSxhPWUub25DbG9zZTtwbHVzXz10LnBsdXN8fHBsdXMsQnJvYWRjYXN0Q2hhbm5lbF89dC5Ccm9hZGNhc3RDaGFubmVsfHxCcm9hZGNhc3RDaGFubmVsO3ZhciBzPSJwYWdlIitEYXRlLm5vdygpOyExIT09KGk9T2JqZWN0LmFzc2lnbih7fSxpKSkudGl0bGVOVmlldyYmIm5vbmUiIT09aS50aXRsZU5WaWV3JiYoaS50aXRsZU5WaWV3PU9iamVjdC5hc3NpZ24oe2F1dG9CYWNrQnV0dG9uOiEwLHRpdGxlU2l6ZToiMTdweCJ9LGkudGl0bGVOVmlldykpO3ZhciBjPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6KCJvYmplY3QiPT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy5lbnYmJnByb2Nlc3MuZW52LlZVRV9BUFBfVEVNUExBVEVfUEFUSHx8IiIpKyIvIituKyIuanMiLGRlZmF1bHRGb250U2l6ZToxNix2aWV3cG9ydDpwbHVzXy5zY3JlZW4ucmVzb2x1dGlvbldpZHRofX07aT1PYmplY3QuYXNzaWduKGMsaSk7dmFyIHU9cGx1c18ud2Vidmlldy5jcmVhdGUoIiIscyxpLHtleHRyYXM6e2Zyb206Z2V0UGFnZUlkKCkscnVudGltZTpnZXRSdW50aW1lKCksZGF0YTpyfX0pO3JldHVybiB1LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixhKSxhZGRFdmVudExpc3RlbmVyKHMsZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oZS5kYXRhKSxlLmtlZXB8fHUuY2xvc2UoImF1dG8iKX0pLHUuc2hvdyhpLmFuaW1hdGlvblR5cGUsaS5hbmltYXRpb25EdXJhdGlvbiksbmV3IFBhZ2UodSl9ZnVuY3Rpb24gZ2V0UGlja2VyKGUsdCl7dmFyIG89e1NFTEVDVE9SOiJzZWxlY3RvciIsTVVMVElTRUxFQ1RPUjoibXVsdGlTZWxlY3RvciIsVElNRToidGltZSIsREFURToiZGF0ZSJ9LGE9e1lFQVI6InllYXIiLE1PTlRIOiJtb250aCIsREFZOiJkYXkifSxyPVsicmFuZ2UiLCJyYW5nZUtleSIsInZhbHVlIiwibW9kZSIsImZpZWxkcyIsInN0YXJ0IiwiZW5kIiwiZGlzYWJsZWQiXTtmdW5jdGlvbiBzKGUpe3JldHVybiA5PGU/ZToiMCIrZX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49bmV3IERhdGU7cmV0dXJuIGU9U3RyaW5nKGV8fCIiKSx0PT09by5USU1FPzI9PT0oZT1lLnNwbGl0KCI6IikpLmxlbmd0aCYmbi5zZXRIb3VycyhwYXJzZUludChlWzBdKSxwYXJzZUludChlWzFdKSk6Mz09PShlPWUuc3BsaXQoIi0iKSkubGVuZ3RoJiZuLnNldEZ1bGxZZWFyKHBhcnNlSW50KGVbMF0pLHBhcnNlSW50KGVbMV0tMSkscGFyc2VJbnQoZVsyXSkpLG59cmV0dXJue25hbWU6IlBpY2tlciIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOntyYW5nZTp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119fSxyYW5nZUtleTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdmFsdWU6e3R5cGU6W051bWJlcixTdHJpbmcsQXJyYXldLGRlZmF1bHQ6MH0sbW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDpvLlNFTEVDVE9SLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gMDw9T2JqZWN0LnZhbHVlcyhvKS5pbmRleE9mKGUpfX0sZmllbGRzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxzdGFydDp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpmdW5jdGlvbigpe2lmKHRoaXMubW9kZT09PW8uVElNRSlyZXR1cm4iMDA6MDAiO2lmKHRoaXMubW9kZT09PW8uREFURSl7dmFyIGU9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLTEwMDtzd2l0Y2godGhpcy5maWVsZHMpe2Nhc2UgYS5ZRUFSOnJldHVybiBlO2Nhc2UgYS5NT05USDpyZXR1cm4gZSsiLTAxIjtkZWZhdWx0OnJldHVybiBlKyItMDEtMDEifX1yZXR1cm4iIn19LGVuZDp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpmdW5jdGlvbigpe2lmKHRoaXMubW9kZT09PW8uVElNRSlyZXR1cm4iMjM6NTkiO2lmKHRoaXMubW9kZT09PW8uREFURSl7dmFyIGU9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpKzEwMDtzd2l0Y2godGhpcy5maWVsZHMpe2Nhc2UgYS5ZRUFSOnJldHVybiBlO2Nhc2UgYS5NT05USDpyZXR1cm4gZSsiLTEyIjtkZWZhdWx0OnJldHVybiBlKyItMTItMzEifX1yZXR1cm4iIn19LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LGNvbXB1dGVkOnthdHRyczpmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj17fTtyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZV09dC4kcHJvcHNbZV19KSxufX0sbWV0aG9kczp7X3Nob3c6ZnVuY3Rpb24oKXt0aGlzLl9zaG93UGlja2VyKE9iamVjdC5hc3NpZ24oe30sdGhpcy5hdHRycykpfSxfc2hvd1BpY2tlcjpmdW5jdGlvbihuKXt2YXIgcj10aGlzLGU9dC5wbHVzfHxuZXcgdC5XZWV4UGx1cyh0LndlZXgpO2lmKGUua2V5LmhpZGVTb2Z0S2V5Ym9yZCgpLHRoaXMubW9kZSE9PW8uVElNRSYmdGhpcy5tb2RlIT09by5EQVRFfHxuLmZpZWxkcyl7bi5maWVsZHM9T2JqZWN0LnZhbHVlcyhhKS5pbmNsdWRlcyhuLmZpZWxkcyk/bi5maWVsZHM6YS5EQVk7dmFyIGk9e2V2ZW50OiJjYW5jZWwifTt0aGlzLnBhZ2U9c2hvd1BhZ2Uoe2NvbnRleHQ6T2JqZWN0LmFzc2lnbih7fSx0LHtwbHVzOmV9KSx1cmw6Il9fdW5pYXBwcGlja2VyIixkYXRhOm4sc3R5bGU6e3RpdGxlTlZpZXc6ITEsYW5pbWF0aW9uVHlwZToibm9uZSIsYW5pbWF0aW9uRHVyYXRpb246MCxiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDApIixwb3BHZXN0dXJlOiJub25lIn0sb25NZXNzYWdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZXZlbnQ7aWYoImNyZWF0ZWQiIT09dClyZXR1cm4iY29sdW1uY2hhbmdlIj09PXQ/KGRlbGV0ZSBlLmV2ZW50LHZvaWQgci4kdHJpZ2dlcih0LGUpKTp2b2lkKGk9ZSk7ci5fdXBkYXRlUGlja2VyKG4pfSxvbkNsb3NlOmZ1bmN0aW9uKCl7ci5wYWdlPW51bGw7dmFyIGU9aS5ldmVudDtkZWxldGUgaS5ldmVudCxyLiR0cmlnZ2VyKGUsaSl9fSl9ZWxzZSBlLm5hdGl2ZVVJW3RoaXMubW9kZT09PW8uVElNRT8icGlja1RpbWUiOiJwaWNrRGF0ZSJdKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0ZTtyLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTpyLm1vZGU9PT1vLlRJTUU/cyh0LmdldEhvdXJzKCkpKyI6IitzKHQuZ2V0TWludXRlcygpKTp0LmdldEZ1bGxZZWFyKCkrIi0iK3ModC5nZXRNb250aCgpKzEpKyItIitzKHQuZ2V0RGF0ZSgpKX0pfSxmdW5jdGlvbigpe3IuJHRyaWdnZXIoImNhbmNlbCIse30pfSx0aGlzLm1vZGU9PT1vLlRJTUU/e3RpbWU6Yyh0aGlzLnZhbHVlLG8uVElNRSl9OntkYXRlOmModGhpcy52YWx1ZSxvLkRBVEUpLG1pbkRhdGU6Yyh0aGlzLnN0YXJ0LG8uREFURSksbWF4RGF0ZTpjKHRoaXMuZW5kLG8uREFURSl9KX0sX3VwZGF0ZVBpY2tlcjpmdW5jdGlvbihlKXt0aGlzLnBhZ2UmJnRoaXMucGFnZS5zZW5kTWVzc2FnZShlKX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuJHdhdGNoKCJhdHRycyIsZnVuY3Rpb24oZSl7dC5fdXBkYXRlUGlja2VyKGUpfSx7ZGVlcDohMH0pfSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCh0LmNsaWNrPXRoaXMuX3Nob3cpLGUoImRpdiIsdGhpcy5fZyh7b246dH0sdGhpcy4kbGlzdGVuZXIpLHRoaXMuJHNsb3RzLmRlZmF1bHQsMil9fX1mdW5jdGlvbiBpbml0JDE0KGUsdCxuKXtlLmNvbXBvbmVudCgicGlja2VyIixnZXRQaWNrZXIodCxuKSl9UGFnZS5wcm90b3R5cGUuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7X19tZXNzYWdlOntkYXRhOmV9fSkpO25ldyBCcm9hZGNhc3RDaGFubmVsXyh0aGlzLndlYnZpZXcuaWQpLnBvc3RNZXNzYWdlKHQpfSxQYWdlLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3RoaXMud2Vidmlldy5jbG9zZSgpfTt2YXIgUFJJTUFSWV9DT0xPUj0iIzAwN0FGRiIsQkFDS0dST1VORF9DT0xPUj0iI0VCRUJFQiIsQU5JTUFURV9JTlRFUlZBTF9ERUZBVUxUPTMwLEZPTlRfU0laRT0xNixTVFJPS0VfV0lEVEg9NjtmdW5jdGlvbiBnZXRQcm9ncmVzcyhlLG4pe3JldHVybntuYW1lOiJQcm9ncmVzcyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOntwZXJjZW50Ont0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjB9LHNob3dJbmZvOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYm9yZGVyUmFkaXVzOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjB9LGZvbnRTaXplOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OkZPTlRfU0laRX0sc3Ryb2tlV2lkdGg6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6U1RST0tFX1dJRFRIfSxhY3RpdmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxhY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpQUklNQVJZX0NPTE9SfSxhY3RpdmVNb2RlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJiYWNrd2FyZHMifSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6QkFDS0dST1VORF9DT0xPUn0sZHVyYXRpb246e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6QU5JTUFURV9JTlRFUlZBTF9ERUZBVUxUfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnt3aWR0aDowLGN1clBlcmNlbnQ6MH19LGNvbXB1dGVkOntiYXJTdHlsZTpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6dGhpcy5zdHJva2VXaWR0aCxib3JkZXJSYWRpdXM6dGhpcy5ib3JkZXJSYWRpdXMsYmFja2dyb3VuZENvbG9yOnRoaXMuYmFja2dyb3VuZENvbG9yfX0saW5uZXJCYXJTdHlsZTpmdW5jdGlvbigpe3JldHVybnt3aWR0aDp0aGlzLmFjdGl2ZVdpZHRoLGhlaWdodDp0aGlzLnN0cm9rZVdpZHRoLGJhY2tncm91bmRDb2xvcjp0aGlzLmFjdGl2ZUNvbG9yfX0sYWN0aXZlV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJQZXJjZW50KnRoaXMud2lkdGgvMTAwfSxmaW5hbFBlcmNlbnQ6ZnVuY3Rpb24oKXt2YXIgZT1wYXJzZUZsb2F0KHRoaXMucGVyY2VudCwxMCk7cmV0dXJuIDEwMDxlJiYoZT0xMDApLGU8MCYmKGU9MCksZX19LHdhdGNoOntmaW5hbFBlcmNlbnQ6ZnVuY3Rpb24oZSx0KXt0aGlzLl90aW1lcklkJiZuLmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXJJZCksdGhpcy5fbGFzdFBlcmNlbnQ9dHx8MCx0aGlzLl9hbmltYXRlKCl9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5yZXF1aXJlTW9kdWxlKCJkb20iKS5nZXRDb21wb25lbnRSZWN0KHQuJHJlZnMucHJvZ3Jlc3MsZnVuY3Rpb24oZSl7dC53aWR0aD1lLnNpemUud2lkdGgsdC5fYW5pbWF0ZSgpfSl9LDUwKX0sbWV0aG9kczp7X2FuaW1hdGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5maW5hbFBlcmNlbnQ7aWYoIXRoaXMuYWN0aXZlKXJldHVybiB0aGlzLmN1clBlcmNlbnQ9dDt0aGlzLmN1clBlcmNlbnQ9ImZvcndhcmRzIj09PXRoaXMuYWN0aXZlTW9kZT90aGlzLl9sYXN0UGVyY2VudDowLHRoaXMuX3RpbWVySWQ9bi5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3Q8PWUuY3VyUGVyY2VudCsxPyhlLmN1clBlcmNlbnQ9dCxuLmNsZWFySW50ZXJ2YWwoZS5fdGltZXJJZCksZS4kdHJpZ2dlcigiYWN0aXZlZW5kIix7Y3VyUGVyY2VudDplLmN1clBlcmNlbnR9KSk6KytlLmN1clBlcmNlbnR9LHRoaXMuZHVyYXRpb24pfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3JlZjoicHJvZ3Jlc3MiLHN0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzIl19LHRoaXMuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzLWJhciJdLHN0eWxlOnRoaXMuYmFyU3R5bGV9LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1wcm9ncmVzcy1pbm5lci1iYXIiXSxzdHlsZTp0aGlzLmlubmVyQmFyU3R5bGV9KV0pLHRoaXMuc2hvd0luZm8/W2UoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzLWluZm8iXSxzdHlsZTp7Zm9udFNpemU6dGhpcy5mb250U2l6ZX19LFt0aGlzLmN1clBlcmNlbnQrIiUiXSldOnRoaXMuX2UoKV0sMil9LHN0eWxlOnsidW5pLXByb2dyZXNzIjp7ZmxleDoxLGZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIn0sInVuaS1wcm9ncmVzcy1iYXIiOntmbGV4OjF9LCJ1bmktcHJvZ3Jlc3MtaW5uZXItYmFyIjp7cG9zaXRpb246ImFic29sdXRlIn0sInVuaS1wcm9ncmVzcy1pbmZvIjp7bWFyZ2luTGVmdDoiMTVweCJ9fX19ZnVuY3Rpb24gaW5pdCQxNShlLHQsbil7ZS5jb21wb25lbnQoInByb2dyZXNzIixnZXRQcm9ncmVzcyh0LG4pKX1mdW5jdGlvbiBnZXRSYWRpb0dyb3VwKGUpe3JldHVybntuYW1lOiJSYWRpb0dyb3VwIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntyYWRpb0xpc3Q6W119fSxsaXN0ZW5lcnM6eyJAcmFkaW8tY2hhbmdlIjoiX2NoYW5nZUhhbmRsZXIiLCJAcmFkaW8tZ3JvdXAtdXBkYXRlIjoiX3JhZGlvR3JvdXBVcGRhdGVIYW5kbGVyIn0sbW91bnRlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0UmFkaW9Hcm91cFZhbHVlKHRoaXMucmFkaW9MaXN0Lmxlbmd0aC0xKX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfY2hhbmdlSGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMucmFkaW9MaXN0LmluZGV4T2YodCk7dGhpcy5fcmVzZXRSYWRpb0dyb3VwVmFsdWUobiwhMCksdGhpcy4kdHJpZ2dlcigiY2hhbmdlIix7dmFsdWU6dC5yYWRpb1ZhbHVlfSl9LF9yYWRpb0dyb3VwVXBkYXRlSGFuZGxlcjpmdW5jdGlvbihlKXtpZigiYWRkIj09PWUudHlwZSl0aGlzLnJhZGlvTGlzdC5wdXNoKGUudm0pO2Vsc2V7dmFyIHQ9dGhpcy5yYWRpb0xpc3QuaW5kZXhPZihlLnZtKTt0aGlzLnJhZGlvTGlzdC5zcGxpY2UodCwxKX19LF9yZXNldFJhZGlvR3JvdXBWYWx1ZTpmdW5jdGlvbih0LHIpe3ZhciBpPXRoaXM7dGhpcy5yYWRpb0xpc3QuZm9yRWFjaChmdW5jdGlvbihlLG4pe24hPT10JiYocj9pLnJhZGlvTGlzdFtuXS5yYWRpb0NoZWNrZWQ9ITE6aS5yYWRpb0xpc3QuZm9yRWFjaChmdW5jdGlvbihlLHQpe3Q8PW58fGkucmFkaW9MaXN0W3RdLnJhZGlvQ2hlY2tlZCYmKGkucmFkaW9MaXN0W25dLnJhZGlvQ2hlY2tlZD0hMSl9KSl9KX0sX2dldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dmFyIGU9e307aWYoIiIhPT10aGlzLm5hbWUpe3ZhciB0PSIiO3RoaXMucmFkaW9MaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7ZS5yYWRpb0NoZWNrZWQmJih0PWUudmFsdWUpfSksZS52YWx1ZT10LGUua2V5PXRoaXMubmFtZX1yZXR1cm4gZX19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZGl2Iix0aGlzLl9nKHt9LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9fX1mdW5jdGlvbiBpbml0JDE2KGUsdCl7ZS5jb21wb25lbnQoInJhZGlvLWdyb3VwIixnZXRSYWRpb0dyb3VwKHQpKX1mdW5jdGlvbiBnZXRSYWRpbyhlKXtyZXR1cm57bmFtZToiUmFkaW8iLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e2NoZWNrZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN0FGRiJ9LHZhbHVlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntyYWRpb0NoZWNrZWQ6dGhpcy5jaGVja2VkLHJhZGlvVmFsdWU6dGhpcy52YWx1ZX19LGxpc3RlbmVyczp7ImxhYmVsLWNsaWNrIjoiX29uQ2xpY2siLCJAbGFiZWwtY2xpY2siOiJfb25DbGljayJ9LGNvbXB1dGVkOntjaGVja2VkU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57YmFja2dyb3VuZENvbG9yOnRoaXMuY29sb3IsYm9yZGVyQ29sb3I6dGhpcy5jb2xvcn19LHVuY2hlY2tlZFN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJue2JvcmRlckNvbG9yOiIjZDFkMWQxIn19fSx3YXRjaDp7Y2hlY2tlZDpmdW5jdGlvbihlKXt0aGlzLnJhZGlvQ2hlY2tlZD1lfSx2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnJhZGlvVmFsdWU9ZX19LGJlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe30sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJSYWRpb0dyb3VwIiwidW5pLXJhZGlvLWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pLHRoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiUmFkaW9Hcm91cCIsInVuaS1yYWRpby1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KSx0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlKXt0aGlzLmRpc2FibGVkfHx0aGlzLnJhZGlvQ2hlY2tlZHx8KHRoaXMucmFkaW9DaGVja2VkPSEwLHRoaXMuJGRpc3BhdGNoKCJSYWRpb0dyb3VwIiwidW5pLXJhZGlvLWNoYW5nZSIsZSx0aGlzKSl9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5yYWRpb0NoZWNrZWQ9ITF9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZSgiZGl2Iix0Ll9nKHtzdGF0aWNDbGFzczpbInVuaS1yYWRpbyJdLGF0dHJzOntkYXRhVW5jVHlwZToidW5pLXJhZGlvIn0sb246e2NsaWNrOnQuX29uQ2xpY2t9fSx0LiRsaXN0ZW5lcnMpLFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1yYWRpby1pbnB1dCJdLHN0eWxlOnQucmFkaW9DaGVja2VkP3QuY2hlY2tlZFN0eWxlOnQudW5jaGVja2VkU3R5bGV9LFt0LnJhZGlvQ2hlY2tlZD9lKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInVuaS1yYWRpby1pbnB1dC1pY29uIl19LFt0Ll92KHQuX3MoIu6oiCIpKV0pOnQuX2UoKV0sMSksZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktdGV4dCJdfSxbdC5fdCgiZGVmYXVsdCIpXSwyKV0sMSl9LHN0eWxlOnsidW5pLXJhZGlvIjp7YWxpZ25JdGVtczoiY2VudGVyIixmbGV4RGlyZWN0aW9uOiJyb3cifSwidW5pLXJhZGlvLWlucHV0Ijp7cG9zaXRpb246InJlbGF0aXZlIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLG1hcmdpblJpZ2h0OiI1IixiYWNrZ3JvdW5kQ29sb3I6IiNmZmZmZmYiLGJvcmRlclN0eWxlOiJzb2xpZCIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZDFkMWQxIixib3JkZXJSYWRpdXM6NTAsd2lkdGg6IjIyIixoZWlnaHQ6IjIyIixvdXRsaW5lOjB9LCJ1bmktcmFkaW8taW5wdXQtaWNvbiI6e2ZvbnRGYW1pbHk6InVuaW5jb21wb25lbnRzIixmb250U2l6ZToiMTQiLGNvbG9yOiIjZmZmZmZmIn0sInVuaS1yYWRpby1pbnB1dC1kaXNhYmxlZCI6e2JhY2tncm91bmRDb2xvcjoiI2UxZTFlMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGNvbG9yOiIjYWRhZGFkIn19fX1mdW5jdGlvbiBpbml0JDE3KGUsdCl7ZS5jb21wb25lbnQoInJhZGlvIixnZXRSYWRpbyh0KSl9ZnVuY3Rpb24gbm9ybWFsaXplTm9kZXMoZSx0LG4pe3ZhciBjPVsic3BhbiIsImEiLCJpbWFnZSIsImltZyJdO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUuX19ibG9jaz0hMCxlfWZ1bmN0aW9uIHIobyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHI9byxpPXQsIShuPWUpLnN0eWxlLmZvbnRTaXplJiYobi5zdHlsZS5mb250U2l6ZT1pLmRlZmF1bHRGb250U2l6ZSpyKSxhKHMobikpO3ZhciBuLHIsaX19ZnVuY3Rpb24gcyhlKXtyZXR1cm4hZS5zdHlsZS5mb250V2VpZ2h0JiYoZS5zdHlsZS5mb250V2VpZ2h0PSJib2xkIiksZX12YXIgdT17YmxvY2txdW90ZTphLGJyOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9fdmFsdWU9IiAiLGEoZSl9LGRpdjphLGRsOmEsaDE6cigyKSxoMjpyKDEuNSksaDM6cigxLjE3KSxoNDpyKDEpLGg1OnIoLjgzKSxoNjpyKC42NyksaHI6YSxvbDphLHA6YSxzdHJvbmc6cyx0YWJsZTphLHRib2R5OmEsdGZvb3Q6YSx0aGVhZDphLHVsOmF9LGw9LyYoYW1wfGd0fGx0fG5ic3B8cXVvdHxhcG9zKTsvZyxkPXthbXA6IiYiLGd0OiI+IixsdDoiPCIsbmJzcDoiICIscXVvdDonIicsYXBvczoiJyJ9O3ZhciBmLHA9e19fYmxvY2s6ITAsX19icmVhazohMCxjaGlsZHJlbjpbXX07ZnVuY3Rpb24gaSh0LGUsbil7dmFyIHI9KHQubmFtZXx8IiIpLnRvTG93ZXJDYXNlKCksaT1yLG89dVtyXTstMT09PWMuaW5kZXhPZihyKSYmKHI9InNwYW4iKSwiaW1nIj09PXImJihyPSJpbWFnZSIpO3ZhciBhPXt0eXBlOnIsX190eXBlOmksYXR0cjpPYmplY3QuY3JlYXRlKG51bGwpfTtpZigoInRleHQiPT09dC50eXBlfHx0LnRleHQpJiYoYS5fX3ZhbHVlPWEuYXR0ci52YWx1ZT0odC50ZXh0fHwiIikudHJpbSgpLnJlcGxhY2UobCxmdW5jdGlvbihlLHQpe3JldHVybiBkW3RdfSkpLHQuYXR0cnMmJk9iamVjdC5rZXlzKHQuYXR0cnMpLmZvckVhY2goZnVuY3Rpb24oZSl7ImNsYXNzIiE9PWUmJiJzdHlsZSIhPT1lJiYoYS5hdHRyW2VdPXQuYXR0cnNbZV0pfSksYS5zdHlsZT1ub3JtYWxpemVVbml0KGZ1bmN0aW9uKGUsdCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtpZihlLmF0dHJzKXt2YXIgcj0oZS5hdHRycy5jbGFzc3x8IiIpLnNwbGl0KCIgIiksaT10LiRvcHRpb25zLnN0eWxlfHx7fTtyLmZvckVhY2goZnVuY3Rpb24oZSl7ZSYmaVtlXSYmT2JqZWN0LmFzc2lnbihuLGlbZV0pfSksT2JqZWN0LmFzc2lnbihuLHBhcnNlU3R5bGVUZXh0KGUuYXR0cnMuc3R5bGV8fCIiKSl9aWYoImltZyI9PT1lLm5hbWV8fCJpbWFnZSI9PT1lLm5hbWUpe3ZhciBvPWUuYXR0cnM7bi53aWR0aD1uLndpZHRofHxvLndpZHRoLG4uaGVpZ2h0PW4uaGVpZ2h0fHxvLmhlaWdodH1yZXR1cm4gbn0odCxlKSksbyYmbyhhLG4pLChwLl9fYmxvY2t8fGEuX19ibG9jaykmJiFmKXt2YXIgcz17dHlwZToic3BhbiIsX190eXBlOiJicmVhayIsYXR0cjp7dmFsdWU6IlxuIn19O3AuY2hpbGRyZW4ucHVzaChzKSxmPVtwLHNdfXJldHVybigocD1hKS5fX3ZhbHVlfHwiaW1hZ2UiPT09cC50eXBlJiZwLmF0dHIuc3JjKSYmKGY9bnVsbCksYS5jaGlsZHJlbj1oKHQuY2hpbGRyZW4sZSxuKSwocD1hKS5fX2Jsb2NrJiZwLnN0eWxlLmhlaWdodCYmIS9eMChweCk/JC8udGVzdChwLnN0eWxlLmhlaWdodCkmJihmPW51bGwpLGF9ZnVuY3Rpb24gaChlLHQsbil7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSx0LG4pfSk6W119dmFyIG89aChlLHQsbik7aWYoZil7dmFyIHY9ZlswXSxnPWZbMV0sbT12LmNoaWxkcmVuLHk9bS5pbmRleE9mKGcpO20uc3BsaWNlKHksMSl9cmV0dXJuIG99ZnVuY3Rpb24gZ2V0UmljaFRleHQoZSl7cmV0dXJue25hbWU6IlJpY2hUZXh0Iixpc1Jlc2VydmVkOiEwLHByb3BzOntub2Rlczp7dHlwZTpbQXJyYXksU3RyaW5nXSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119fX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PW5vcm1hbGl6ZU5vZGVzKHRoaXMubm9kZXN8fFtdLHRoaXMuJHZub2RlLmNvbnRleHQse2RlZmF1bHRGb250U2l6ZToxNn0pO3JldHVybiBlKCJ1LXJpY2gtdGV4dCIsdGhpcy5fZyh7YXR0cnM6e3ZhbHVlOnR9fSx0aGlzLiRsaXN0ZW5lcnMpKX19fWZ1bmN0aW9uIGluaXQkMTgoZSx0KXtlLmNvbXBvbmVudCgicmljaC10ZXh0IixnZXRSaWNoVGV4dCh0KSl9ZnVuY3Rpb24gZ2V0U3dpcGVySXRlbShlKXtyZXR1cm57bmFtZToiU3dpcGVySXRlbSIsaXNSZXNlcnZlZDohMCxwcm9wczp7aXRlbUlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLXN3aXBlci1pdGVtIl0sc3RhdGljU3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjAsb3ZlcmZsb3c6ImhpZGRlbiJ9fSx0aGlzLiRsaXN0ZW5lcnMpLHRoaXMuX3QoImRlZmF1bHQiKSwyKX19fWZ1bmN0aW9uIGluaXQkMTkoZSx0KXtlLmNvbXBvbmVudCgic3dpcGVyLWl0ZW0iLGdldFN3aXBlckl0ZW0odCkpfWZ1bmN0aW9uIGdldFN3aXBlcihyKXt2YXIgdD1yLnJlcXVpcmVNb2R1bGUoImRvbSIpO3JldHVybntuYW1lOiJTd2lwZXIiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyXSxwcm9wczp7aW5kaWNhdG9yRG90czp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHZlcnRpY2FsOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sYXV0b3BsYXk6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjaXJjdWxhcjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGludGVydmFsOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjVlM30sZHVyYXRpb246e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NTAwfSxjdXJyZW50Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LGluZGljYXRvckNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJyZ2JhKDAsMCwwLC4zKSJ9LGluZGljYXRvckFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDAwMDAwIn0scHJldmlvdXNNYXJnaW46e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG5leHRNYXJnaW46e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGN1cnJlbnRJdGVtSWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNraXBIaWRkZW5JdGVtTGF5b3V0Ont0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sZGlzcGxheU11bHRpcGxlSXRlbXM6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZVRvdWNoOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudFN5bmM6dGhpcy5jdXJyZW50LGN1cnJlbnRDaGFuZ2VTb3VyY2U6ImF1dG9wbGF5In19LHdhdGNoOntjdXJyZW50OmZ1bmN0aW9uKCl7dGhpcy5fY3VycmVudENoZWNrKCl9LGN1cnJlbnRJdGVtSWQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJyZW50Q2hlY2soKX0sY3VycmVudFN5bmM6ZnVuY3Rpb24oKXt0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHRoaXMuX2dldERldGFpbCgpKX19LG1ldGhvZHM6e29uQ2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGV0YWlsOyJzdHJpbmciPT10eXBlb2YgdC5zb3VyY2UmJih0aGlzLmN1cnJlbnRDaGFuZ2VTb3VyY2U9dC5zb3VyY2UpLHRoaXMuY3VycmVudFN5bmM9dC5pbmRleCx0aGlzLl9sYXN0T2Zmc2V0UmF0aW89MH0sb25TY3JvbGw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy52ZXJ0aWNhbD9lLmRldGFpbC5vZmZzZXRZUmF0aW86ZS5kZXRhaWwub2Zmc2V0WFJhdGlvO2lmKChlLmRyYWd8fGUuZGV0YWlsLmRyYWcpJiYodGhpcy5jdXJyZW50Q2hhbmdlU291cmNlPSJ0b3VjaCIpLDA9PT10KXt2YXIgbj1NYXRoLmFicyh0aGlzLl9sYXN0T2Zmc2V0UmF0aW8pO2lmKDE9PT1uKXJldHVybjsuNTxuJiYodD0xKX10aGlzLl9sYXN0T2Zmc2V0UmF0aW89dCx0aGlzLiR0cmlnZ2VyKCJ0cmFuc2l0aW9uIix7ZHg6dGhpcy52ZXJ0aWNhbD8wOi10aGlzLl93aWR0aCp0LGR5OnRoaXMudmVydGljYWw/LXRoaXMuX2hlaWdodCp0OjB9KX0sb25TY3JvbGxFbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWZ1bmN0aW9uKCl7dC4kdHJpZ2dlcigiYW5pbWF0aW9uZmluaXNoIix0Ll9nZXREZXRhaWwoKSksdC5jdXJyZW50Q2hhbmdlU291cmNlPSJhdXRvcGxheSJ9OyJpT1MiPT09ci5jb25maWcuZW52LnBsYXRmb3JtP3NldFRpbWVvdXQobiw1MCk6bigpfSxfZ2V0RGV0YWlsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jdXJyZW50U3luYyx0PXRoaXMuaXRlbXNbZV18fHt9O3JldHVybntjdXJyZW50OmUsY3VycmVudEl0ZW1JZDp0LmNvbXBvbmVudEluc3RhbmNlJiZ0LmNvbXBvbmVudEluc3RhbmNlLml0ZW1JZHx8IiIsc291cmNlOnRoaXMuY3VycmVudENoYW5nZVNvdXJjZX19LF9jdXJyZW50Q2hlY2s6ZnVuY3Rpb24oKXt2YXIgZT0tMTtpZih0aGlzLmN1cnJlbnRJdGVtSWQpZm9yKHZhciB0PTAsbj10aGlzLml0ZW1zO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdLmNvbXBvbmVudEluc3RhbmNlO2lmKHImJnIuaXRlbUlkPT09dGhpcy5jdXJyZW50SXRlbUlkKXtlPXQ7YnJlYWt9fWU8MCYmKGU9TWF0aC5yb3VuZCh0aGlzLmN1cnJlbnQpfHwwKSxlPWU8MD8wOmUsdGhpcy5jdXJyZW50U3luYyE9PWUmJih0aGlzLmN1cnJlbnRDaGFuZ2VTb3VyY2U9IiIsdGhpcy5jdXJyZW50U3luYz1lKX0sX2dldFdIOmZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0aGlzLl9nZXRDb21wb25lbnRTaXplKHRoaXMuJHJlZnMuZWwpLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aWR0aCxuPWUuaGVpZ2h0O2UudG9wLGUubGVmdDtyLl93aWR0aD10LHIuX2hlaWdodD1ufSl9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXt0LmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5pdGVtcz1bXSx0aGlzLl93aWR0aD10aGlzLmhlaWdodD0wfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9jdXJyZW50Q2hlY2soKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5fZ2V0V0goKX0sMTAwKX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PVtdOyhBcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP2RlZXBDbG9uZSh0aGlzLiRzbG90cy5kZWZhdWx0LGUpOltdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY29tcG9uZW50T3B0aW9ucyYmInN3aXBlci1pdGVtIj09PWUuY29tcG9uZW50T3B0aW9ucy50YWcmJnQucHVzaChlKX0pLHRoaXMuaXRlbXM9dDt2YXIgbj17fSxyPXRoaXMuJGxpc3RlbmVycztyZXR1cm4oci5jaGFuZ2V8fHIuYW5pbWF0aW9uZmluaXNofHxyLnRyYW5zaXRpb24pJiYobi5zY3JvbGw9dGhpcy5vblNjcm9sbCxuLnNjcm9sbGVuZD10aGlzLm9uU2Nyb2xsRW5kKSxyLmNoYW5nZSYmKG4uY2hhbmdlPXRoaXMub25DaGFuZ2UpLGUoImRpdiIsdGhpcy5fZyh7cmVmOiJlbCIsc3RhdGljQ2xhc3M6WyJ1bmktc3dpcGVyIl19LHIpLFtlKCJzbGlkZXIiLHtzdGF0aWNDbGFzczpbInVuaS1zd2lwZXItc2xpZGVyIl0sYXR0cnM6e2F1dG9QbGF5OnRoaXMuYXV0b3BsYXksaW50ZXJ2YWw6dGhpcy5pbnRlcnZhbCxpbmRleDp0aGlzLmN1cnJlbnRTeW5jLGtlZXBJbmRleDohMCxzaG93SW5kaWNhdG9yczp0aGlzLmluZGljYXRvckRvdHMsaW5maW5pdGU6dGhpcy5jaXJjdWxhcix2ZXJ0aWNhbDp0aGlzLnZlcnRpY2FsLHNjcm9sbGFibGU6IXRoaXMuZGlzYWJsZVRvdWNofSxvbjpufSx0LmNvbmNhdChbZSgiaW5kaWNhdG9yIix7c3RhdGljQ2xhc3M6WyJ1bmktc3dpcGVyLWRvdHMiXSxzdHlsZTp7aXRlbUNvbG9yOnRoaXMuaW5kaWNhdG9yQ29sb3IsaXRlbVNlbGVjdGVkQ29sb3I6dGhpcy5pbmRpY2F0b3JBY3RpdmVDb2xvcixpdGVtU2l6ZTo4LG9wYWNpdHk6dGhpcy5pbmRpY2F0b3JEb3RzPzE6MH19KV0pLDIpXSl9LHN0eWxlOnsidW5pLXN3aXBlciI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OiIxNTBweCJ9LCJ1bmktc3dpcGVyLXNsaWRlciI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjB9LCJ1bmktc3dpcGVyLWRvdHMiOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCxyaWdodDowLGJvdHRvbToiMTAiLGhlaWdodDoiMTAifX19fWZ1bmN0aW9uIGluaXQkMjAoZSx0KXtlLmNvbXBvbmVudCgic3dpcGVyIixnZXRTd2lwZXIodCkpfWZ1bmN0aW9uIGdldFN3aXRjaChlKXtyZXR1cm57bmFtZToiU3dpdGNoIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoic3dpdGNoIn0sY2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntzd2l0Y2hDaGVja2VkOnRoaXMuY2hlY2tlZH19LHdhdGNoOntjaGVja2VkOmZ1bmN0aW9uKGUpe3RoaXMuc3dpdGNoQ2hlY2tlZD1lfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlLHQpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLnN3aXRjaENoZWNrZWQ9ZS5kZXRhaWw/ZS5kZXRhaWwudmFsdWU6IXRoaXMuc3dpdGNoQ2hlY2tlZCx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0aGlzLnN3aXRjaENoZWNrZWR9KSl9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5zd2l0Y2hDaGVja2VkPSExfSxfZ2V0Rm9ybURhdGE6ZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4iIiE9PXRoaXMubmFtZSYmKGUudmFsdWU9dGhpcy5zd2l0Y2hDaGVja2VkLGUua2V5PXRoaXMubmFtZSksZX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy4kbGlzdGVuZXJzO3JldHVybiBlKCJkaXYiLHQuX2coe3N0eWxlOntwYWRkaW5nUmlnaHQ6NX19LG4pLFsic3dpdGNoIj09PXQudHlwZT9lKCJkYy1zd2l0Y2giLHthdHRyczp7ZGF0YVVuY1R5cGU6InVuaS1zd2l0Y2giLGNvbG9yOnQuY29sb3IsY2hlY2tlZDp0LnN3aXRjaENoZWNrZWQsZGlzYWJsZWQ6dC5kaXNhYmxlZH0sc3R5bGU6e3dpZHRoOjUyLGhlaWdodDozMn0sb246e2NoYW5nZTp0Ll9vbkNsaWNrfX0pOnQuX2UoKSwiY2hlY2tib3giPT09dC50eXBlP2UoImNoZWNrYm94Iix7YXR0cnM6e2RhdGFVbmNUeXBlOiJ1bmktc3dpdGNoIixjaGVja2VkOnQuc3dpdGNoQ2hlY2tlZCxkaXNhYmxlZDp0LmRpc2FibGVkfSxzdHlsZTp7Y29sb3I6dC5jb2xvcn0sb246e2NsaWNrOnQuX29uQ2xpY2t9fSk6dC5fZSgpXSwxKX0sbGlzdGVuZXJzOnsibGFiZWwtY2xpY2siOiJfb25DbGljayIsIkBsYWJlbC1jbGljayI6Il9vbkNsaWNrIn19fWZ1bmN0aW9uIGluaXQkMjEoZSx0KXtlLmNvbXBvbmVudCgic3dpdGNoIixnZXRTd2l0Y2godCkpfWZ1bmN0aW9uIGdldFNsaWRlcihlKXtyZXR1cm57bmFtZToiVVNsaWRlciIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWluOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LG1heDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxMDB9LHZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LHN0ZXA6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sc2VsZWN0ZWRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LGJsb2NrQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNmZmZmZmYifSxibG9ja1NpemU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6Mjh9LHNob3dWYWx1ZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3NsaWRlcldpZHRoOjAsc2xpZGVyVmFsdWU6TnVtYmVyKHRoaXMudmFsdWUpfX0sY29tcHV0ZWQ6e3NsaWRlclRodW1iT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE51bWJlcih0aGlzLmJsb2NrU2l6ZSkvMn0sdHJhY2tUYXBTdHlsZTpmdW5jdGlvbigpe3JldHVybntwYWRkaW5nVG9wOnRoaXMuc2xpZGVyVGh1bWJPZmZzZXQscGFkZGluZ0JvdHRvbTp0aGlzLnNsaWRlclRodW1iT2Zmc2V0fX0sdHJhY2tTdHlsZTpmdW5jdGlvbigpe3JldHVybntiYWNrZ3JvdW5kQ29sb3I6dGhpcy5fZ2V0QmdDb2xvcigpLG1hcmdpbkxlZnQ6dGhpcy5zbGlkZXJUaHVtYk9mZnNldCxtYXJnaW5SaWdodDp0aGlzLnNsaWRlclRodW1iT2Zmc2V0fX0sdHJhY2tBY3RpdmVTdHlsZTpmdW5jdGlvbigpe3JldHVybntiYWNrZ3JvdW5kQ29sb3I6dGhpcy5fZ2V0QWN0aXZlQ29sb3IoKSx3aWR0aDp0aGlzLnRodW1iVmFsdWUrInB4In19LHRodW1iU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57d2lkdGg6dGhpcy5ibG9ja1NpemUrInB4IixoZWlnaHQ6dGhpcy5ibG9ja1NpemUrInB4IixsZWZ0OnRoaXMudGh1bWJWYWx1ZSsicHgiLGJhY2tncm91bmRDb2xvcjp0aGlzLmJsb2NrQ29sb3J9fSx0aHVtYlZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuc2xpZGVyVmFsdWUtTnVtYmVyKHRoaXMubWluKSkvKE51bWJlcih0aGlzLm1heCktTnVtYmVyKHRoaXMubWluKSkqdGhpcy5zbGlkZXJXaWR0aH19LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnNsaWRlclZhbHVlPU51bWJlcihlKX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX3gwPTAsdGhpcy5feDE9MCx0aGlzLiRldmVudE9sZD1udWxsLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnJlcXVpcmVNb2R1bGUoImRvbSIpLmdldENvbXBvbmVudFJlY3QodC4kcmVmc1sic2xpZGVyLXRyYWNrIl0sZnVuY3Rpb24oZSl7dC5zbGlkZXJXaWR0aD1lLnNpemUud2lkdGh9KX0sNTApfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJhZGQiLHZtOnRoaXN9KX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToicmVtb3ZlIix2bTp0aGlzfSl9LG1ldGhvZHM6e19oYW5kbGVTdGFydDpmdW5jdGlvbihlKXtpZigxPT09ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJiF0aGlzLl8kZXZlbnRPbGQpe3ZhciB0PSh0aGlzLl8kZXZlbnRPbGQ9ZSkuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVg7dGhpcy5feDA9dGhpcy5feDE9dCx0aGlzLl9vblRyYWNrKCJzdGFydCIsdCl9fSxfaGFuZGxlTW92ZTpmdW5jdGlvbihlKXtpZigxPT09ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJnRoaXMuXyRldmVudE9sZCl7dmFyIHQ9ZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDt0aGlzLl9vblRyYWNrKCJtb3ZlIix0KSx0aGlzLl94MT10fX0sX2hhbmRsZUVuZDpmdW5jdGlvbihlKXtpZigxPT09ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJnRoaXMuXyRldmVudE9sZCl7dmFyIHQ9ZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDt0aGlzLl8kZXZlbnRPbGQ9bnVsbCx0aGlzLl9vblRyYWNrKCJlbmQiLHQpfX0sX29uVHJhY2s6ZnVuY3Rpb24oZSx0KXt0aGlzLmRpc2FibGVkfHwoIm1vdmUiPT09ZT8odGhpcy5fb25Vc2VyQ2hhbmdlZFZhbHVlKHt4OnR9KSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2luZyIse3ZhbHVlOnRoaXMuc2xpZGVyVmFsdWV9KSk6ImVuZCI9PT1lJiYodGhpcy5fb25Vc2VyQ2hhbmdlZFZhbHVlKHt4OnR9KSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0aGlzLnNsaWRlclZhbHVlfSkpKX0sX29uVXNlckNoYW5nZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLngtdGhpcy5ibG9ja1NpemUvMjt0PDAmJih0PTApLHQ+dGhpcy5zbGlkZXJXaWR0aCYmKHQ9dGhpcy5zbGlkZXJXaWR0aCk7dmFyIG49TnVtYmVyKHRoaXMubWluKSxyPU51bWJlcih0aGlzLm1heCksaT1OdW1iZXIodGhpcy5zdGVwKSxvPXQvdGhpcy5zbGlkZXJXaWR0aCooci1uKTswPGkmJmk8byYmbyVpL2khPTAmJihvLT1vJWkpLHRoaXMuc2xpZGVyVmFsdWU9cGFyc2VJbnQobytuKX0sX2dldEJnQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4iI2U5ZTllOSIhPT10aGlzLmJhY2tncm91bmRDb2xvcj90aGlzLmJhY2tncm91bmRDb2xvcjoiIzAwN2FmZiIhPT10aGlzLmNvbG9yP3RoaXMuY29sb3I6IiMwMDdhZmYifSxfZ2V0QWN0aXZlQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4iIzAwN2FmZiIhPT10aGlzLmFjdGl2ZUNvbG9yP3RoaXMuYWN0aXZlQ29sb3I6IiNlOWU5ZTkiIT09dGhpcy5zZWxlY3RlZENvbG9yP3RoaXMuc2VsZWN0ZWRDb2xvcjoiI2U5ZTllOSJ9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5zbGlkZXJWYWx1ZT10aGlzLm1pbn0sX2dldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dmFyIGU9e307cmV0dXJuIiIhPT10aGlzLm5hbWUmJihlLnZhbHVlPXRoaXMuc2xpZGVyVmFsdWUsZS5rZXk9dGhpcy5uYW1lKSxlfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoImRpdiIsdC5fZyh7c3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyIl19LHQuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXNsaWRlci13cmFwcGVyIl19LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItdGFwLWFyZWEiXSxvbjp7dG91Y2hzdGFydDp0Ll9oYW5kbGVTdGFydCx0b3VjaG1vdmU6dC5faGFuZGxlTW92ZSx0b3VjaGVuZDp0Ll9oYW5kbGVFbmR9LHN0eWxlOnQudHJhY2tUYXBTdHlsZX0sW2UoImRpdiIse3JlZjoic2xpZGVyLXRyYWNrIixzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItaGFuZGxlLXdyYXBwZXIiXSxzdHlsZTp0LnRyYWNrU3R5bGV9LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItdHJhY2siXSxzdHlsZTp0LnRyYWNrQWN0aXZlU3R5bGV9KV0pLGUoImRpdiIse3JlZjoidW5pLXNsaWRlci1oYW5kbGUiLHN0YXRpY0NsYXNzOlsidW5pLXNsaWRlci10aHVtYiJdLHN0eWxlOnQudGh1bWJTdHlsZX0pXSksdC5zaG93VmFsdWU/ZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyLXZhbHVlIl19LFt0Ll92KHQuX3ModC5zbGlkZXJWYWx1ZSkpXSk6dC5fZSgpXSldKX0sc3R5bGU6eyJ1bmktc2xpZGVyIjp7ZmxleDoxLGZsZXhEaXJlY3Rpb246ImNvbHVtbiJ9LCJ1bmktc2xpZGVyLXdyYXBwZXIiOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciJ9LCJ1bmktc2xpZGVyLXRhcC1hcmVhIjp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIiLHBhZGRpbmdUb3A6IjE0IixwYWRkaW5nQm90dG9tOiIxNCJ9LCJ1bmktc2xpZGVyLWhhbmRsZS13cmFwcGVyIjp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsaGVpZ2h0OiIyIixtYXJnaW5SaWdodDoiMTQiLG1hcmdpbkxlZnQ6IjE0Iixib3JkZXJSYWRpdXM6IjUiLGJhY2tncm91bmRDb2xvcjoiI2U5ZTllOSJ9LCJ1bmktc2xpZGVyLXRyYWNrIjp7aGVpZ2h0OiIyIixib3JkZXJSYWRpdXM6IjYiLGJhY2tncm91bmRDb2xvcjoiIzAwN2FmZiJ9LCJ1bmktc2xpZGVyLXRodW1iIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6IjEiLHdpZHRoOiIyOCIsaGVpZ2h0OiIyOCIsYm9yZGVyUmFkaXVzOjUwLGJveFNoYWRvdzoiMCAwIDRweCAjZWJlYmViIn0sInVuaS1zbGlkZXItdmFsdWUiOntjb2xvcjoiIzg4ODg4OCIsZm9udFNpemU6IjE2Iix3aWR0aDoiMzAifX19fWZ1bmN0aW9uIGluaXQkMjIoZSx0KXtlLmNvbXBvbmVudCgidS1zbGlkZXIiLGdldFNsaWRlcih0KSl9ZnVuY3Rpb24gZ2V0UGlja2VyVmlldyhlKXtyZXR1cm57bmFtZToiUGlja2VyVmlldyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOnt2YWx1ZTp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119LHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKSYmZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfSkubGVuZ3RoPT09ZS5sZW5ndGh9fSxoZWlnaHQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0saW5kaWNhdG9yU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG1hc2tUb3BTdHlsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWFza0JvdHRvbVN0eWxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnttYXNrVG9wU3R5bGVTeW5jOnRoaXMuZ2V0U3R5bGUodGhpcy5tYXNrVG9wU3R5bGUpLG1hc2tCb3R0b21TdHlsZVN5bmM6dGhpcy5nZXRTdHlsZSh0aGlzLm1hc2tCb3R0b21TdHlsZSksaW5kaWNhdG9yU3R5bGVTeW5jOnRoaXMuZ2V0U3R5bGUodGhpcy5pbmRpY2F0b3JTdHlsZSksdmFsdWVTeW5jOltdLmNvbmNhdCh0aGlzLnZhbHVlKX19LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbihlKXt2YXIgbj10aGlzO3RoaXMudmFsdWVTeW5jLmxlbmd0aD1lLmxlbmd0aCxlLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlIT09bi52YWx1ZVN5bmNbdF0mJihuLnZhbHVlU3luY1t0XT1lLG4uaXRlbXNbdF0uY29tcG9uZW50SW5zdGFuY2Uuc2V0Q3VycmVudChlKSl9KX0sbWFza1RvcFN0eWxlOmZ1bmN0aW9uKGUpe3RoaXMubWFza1RvcFN0eWxlU3luYz10aGlzLmdldFN0eWxlKGUpfSxtYXNrQm90dG9tU3R5bGU6ZnVuY3Rpb24oZSl7dGhpcy5tYXNrQm90dG9tU3R5bGVTeW5jPXRoaXMuZ2V0U3R5bGUoZSl9LGluZGljYXRvclN0eWxlOmZ1bmN0aW9uKGUpe3RoaXMuaW5kaWNhdG9yU3R5bGVTeW5jPXRoaXMuZ2V0U3R5bGUoZSl9fSxtZXRob2RzOntnZXRTdHlsZTpmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwic3RyaW5nIj09dHlwZW9mIGU/cGFyc2VTdHlsZVRleHQoZSk6ZSl9LGdldEl0ZW1JbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pdGVtcy5pbmRleE9mKGUpfSxnZXRJdGVtVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudmFsdWVTeW5jW3RoaXMuZ2V0SXRlbUluZGV4KGUuJHZub2RlKV18fDB9LHNldEl0ZW1WYWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0SXRlbUluZGV4KGUuJHZub2RlKTt0aGlzLnZhbHVlU3luY1tuXT10O3ZhciByPVtdLmNvbmNhdCh0aGlzLnZhbHVlU3luYyk7dGhpcy4kZW1pdCgidXBkYXRlOnZhbHVlIixyKSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTpyfSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5pdGVtcz1bXX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybihBcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP2RlZXBDbG9uZSh0aGlzLiRzbG90cy5kZWZhdWx0LGUpOltdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY29tcG9uZW50T3B0aW9ucyYmInBpY2tlci12aWV3LWNvbHVtbiI9PT1lLmNvbXBvbmVudE9wdGlvbnMudGFnJiZ0LnB1c2goZSl9KSx0aGlzLml0ZW1zPXQsZSgiZGl2Iix0aGlzLl9nKHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldyJdLGF0dHJzOntwcmV2ZW50R2VzdHVyZTohMH19LHRoaXMuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LXdyYXBwZXIiXX0sdCldLDIpfSxzdHlsZTp7InVuaS1waWNrZXItdmlldyI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9LCJ1bmktcGlja2VyLXZpZXctd3JhcHBlciI6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246InJvdyIscG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxvdmVyZmxvdzoiaGlkZGVuIn19fX1mdW5jdGlvbiBpbml0JDIzKGUsdCl7ZS5jb21wb25lbnQoInBpY2tlci12aWV3IixnZXRQaWNrZXJWaWV3KHQpKX1mdW5jdGlvbiBnZXRIZWlnaHQoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PShlLmhlaWdodHx8ZS5saW5lSGVpZ2h0fHwiIikubWF0Y2goLygtP1tcZFwuXSspcHgvKSxuPTA7cmV0dXJuIHQmJihuPXBhcnNlRmxvYXQodFsxXSkpLG59ZnVuY3Rpb24gZ2V0UGlja2VyVmlld0NvbHVtbihlKXt2YXIgcj1lLnJlcXVpcmVNb2R1bGUoImRvbSIpLG89ImFuZHJvaWQiPT09ZS5jb25maWcuZW52LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7cmV0dXJue25hbWU6IlBpY2tlclZpZXdDb2x1bW4iLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e2xlbmd0aDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntpbmRpY2F0b3JIZWlnaHQ6Z2V0SGVpZ2h0KHRoaXMuJHBhcmVudC5pbmRpY2F0b3JTdHlsZVN5bmMpLGhlaWdodDpwYXJzZUZsb2F0KHRoaXMuJHBhcmVudC5oZWlnaHQpLGN1cnJlbnQ6dGhpcy4kcGFyZW50LmdldEl0ZW1WYWx1ZSh0aGlzKX19LHdhdGNoOntjdXJyZW50OmZ1bmN0aW9uKGUpe3RoaXMuX2lzTW91bnRlZCYmdGhpcy4kcGFyZW50LnNldEl0ZW1WYWx1ZSh0aGlzLGUpfSxsZW5ndGg6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnNldEN1cnJlbnQoZS5jdXJyZW50LCEwLCEwKX0sMTUwKX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNoZWNrTW91bnRlZCgpfSxtZXRob2RzOntjaGVja01vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgbixyLGk9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7UHJvbWlzZS5hbGwoW2kuX2dldENvbXBvbmVudFNpemUoaS4kcmVmcy5lbCkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLmhlaWdodDtuPWkuaGVpZ2h0PXR9KSxvJiZpLmxlbmd0aD9pLl9nZXRDb21wb25lbnRTaXplKGkuJHJlZnMuaXRlbSkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLmhlaWdodDtyPWkuaW5kaWNhdG9ySGVpZ2h0PXQvaS5sZW5ndGh9KTppLl9nZXRDb21wb25lbnRTaXplKGkuJHJlZnMuaW5kaWNhdG9yKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGVpZ2h0O3I9aS5pbmRpY2F0b3JIZWlnaHQ9dH0pXSkudGhlbihmdW5jdGlvbigpe24mJnI/c2V0VGltZW91dChmdW5jdGlvbigpe2kuc2V0Q3VycmVudChpLmN1cnJlbnQsITEsITApLGkuX2lzTW91bnRlZD0hMH0sNTApOmkuY2hlY2tNb3VudGVkKCl9KX0sNTApfSxvblNjcm9sbGVuZDpmdW5jdGlvbihlKXtpZighKERhdGUubm93KCktdGhpcy5zY3JvbGxUb0VsZW1lbnRUaW1lPDM0MCkpe3ZhciB0PWUuZGV0YWlsLmNvbnRlbnRPZmZzZXQueSxuPU1hdGgucm91bmQodC90aGlzLmluZGljYXRvckhlaWdodCk7dCV0aGlzLmluZGljYXRvckhlaWdodD90aGlzLnNldEN1cnJlbnQobiwhMCwhMCk6dGhpcy5jdXJyZW50PW59fSxzZXRDdXJyZW50OmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT10JiYodD0hMCksKHRoaXMuY3VycmVudCE9PWV8fG4pJiYoci5zY3JvbGxUb0VsZW1lbnQodGhpcy4kcmVmcy5jb250ZW50LHtvZmZzZXQ6ZSp0aGlzLmluZGljYXRvckhlaWdodCxhbmltYXRlZDp0fSksdGhpcy5jdXJyZW50PWUsdCYmKHRoaXMuc2Nyb2xsVG9FbGVtZW50VGltZT1EYXRlLm5vdygpKSl9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXtyLmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kc2xvdHMuZGVmYXVsdCxuPSh0aGlzLmhlaWdodC10aGlzLmluZGljYXRvckhlaWdodCkvMixyPXRoaXMuaGVpZ2h0LW4rInB4IjtuKz0icHgiO3ZhciBpPXtzaG93U2Nyb2xsYmFyOiExLHNjcm9sbFRvQmVnaW46ITEsZGVjZWxlcmF0aW9uUmF0ZTouMyxzY3JvbGxZOiEwfTtyZXR1cm4gb3x8KGkuc2Nyb2xsVG9wPXRoaXMuY3VycmVudCp0aGlzLmluZGljYXRvckhlaWdodCksZSgiZGl2Iix0aGlzLl9nKHtyZWY6ImVsIixzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1jb2x1bW4iXX0sdGhpcy4kbGlzdGVuZXJzKSxbZSgic2Nyb2xsLXZpZXciLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1ncm91cCJdLGF0dHJzOmksb246e3Njcm9sbGVuZDp0aGlzLm9uU2Nyb2xsZW5kfSxzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIn19LFtlKCJkaXYiLHtyZWY6ImNvbnRlbnQiLHN0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiXSxzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIixwYWRkaW5nVG9wOm4scGFkZGluZ0JvdHRvbTpufX0sbz9bZSgiZGl2Iix7cmVmOiJpdGVtIixzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIn19LHQpXTp0KV0pLGUoInUtc2NhbGFibGUiLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1tYXNrIl19LFtlKCJ1LXNjYWxhYmxlIix7c3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctbWFzayIsInVuaS1waWNrZXItdmlldy1tYXNrLXRvcCJdLHN0eWxlOk9iamVjdC5hc3NpZ24oe30sdGhpcy4kcGFyZW50Lm1hc2tUb3BTdHlsZVN5bmMse2JvdHRvbTpyfSl9KSxlKCJ1LXNjYWxhYmxlIix7c3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctbWFzayIsInVuaS1waWNrZXItdmlldy1tYXNrLWJvdHRvbSJdLHN0eWxlOk9iamVjdC5hc3NpZ24oe30sdGhpcy4kcGFyZW50Lm1hc2tCb3R0b21TdHlsZVN5bmMse3RvcDpyfSl9KV0pLGUoInUtc2NhbGFibGUiLHtyZWY6ImluZGljYXRvciIsc3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctaW5kaWNhdG9yIl0sc3R5bGU6T2JqZWN0LmFzc2lnbih7fSx0aGlzLiRwYXJlbnQuaW5kaWNhdG9yU3R5bGVTeW5jLHt0b3A6bn0pfSldLDIpfSxzdHlsZTp7InVuaS1waWNrZXItdmlldy1jb2x1bW4iOntmbGV4OjEscG9zaXRpb246InJlbGF0aXZlIixhbGlnbkl0ZW1zOiJzdHJldGNoIixvdmVyZmxvdzoiaGlkZGVuIn0sInVuaS1waWNrZXItdmlldy1tYXNrIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxwb2ludGVyRXZlbnRzOiJub25lIn0sInVuaS1waWNrZXItdmlldy1tYXNrLXRvcCI6e2JvdHRvbTowLGJhY2tncm91bmRJbWFnZToibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkifSwidW5pLXBpY2tlci12aWV3LW1hc2stYm90dG9tIjp7dG9wOjAsYmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQodG8gdG9wLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSJ9LCJ1bmktcGlja2VyLXZpZXctZ3JvdXAiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowfSwidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiOntwYWRkaW5nVG9wOjAscGFkZGluZ1JpZ2h0OjAscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OjB9LCJ1bmktcGlja2VyLXZpZXctaW5kaWNhdG9yIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAscmlnaHQ6MCx0b3A6MCxoZWlnaHQ6IjM0cHgiLHBvaW50ZXJFdmVudHM6Im5vbmUiLGJvcmRlckNvbG9yOiIjZTVlNWU1Iixib3JkZXJUb3BXaWR0aDoiMXB4Iixib3JkZXJCb3R0b21XaWR0aDoiMXB4In19fX1mdW5jdGlvbiBpbml0JDI0KGUsdCl7ZS5jb21wb25lbnQoInBpY2tlci12aWV3LWNvbHVtbiIsZ2V0UGlja2VyVmlld0NvbHVtbih0KSl9dmFyIGluaXRDb21wb25lbnRzPVtpbml0JDMsaW5pdCQ0LGluaXQkNSxpbml0JDYsaW5pdCQ3LGluaXQkOCxpbml0JDksaW5pdCQxMCxpbml0JDExLGluaXQkMTIsaW5pdCQxMyxpbml0JDE0LGluaXQkMTUsaW5pdCQxNixpbml0JDE3LGluaXQkMTgsaW5pdCQxOSxpbml0JDIwLGluaXQkMjEsaW5pdCQyMixpbml0JDIzLGluaXQkMjRdLHVuaUFwcD17aW5zdGFsbDpmdW5jdGlvbihvLGEpe28uY29uZmlnLmVycm9ySGFuZGxlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dG9SYXdUeXBlKGUpO28udXRpbC53YXJuKCJFcnJvciBpbiAiK24rJzogIicrKCJFcnJvciI9PT1yP2UudG9TdHJpbmcoKTplKSsnIicsdCk7dmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QXBwJiZhLmdldEFwcCgpO2kmJmhhc0xpZmVjeWNsZUhvb2soaS4kb3B0aW9ucywib25FcnJvciIpP2kuX19jYWxsX2hvb2soIm9uRXJyb3IiLGUpOmNvbnNvbGUuZXJyb3IoZSl9LG8ucHJvdG90eXBlLl8kYnVzPW5ldyBvLG8ucHJvdG90eXBlLmdldE9wZW5lckV2ZW50Q2hhbm5lbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWx8fCh0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWw9bmV3IGEuRXZlbnRDaGFubmVsKSx0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWx9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwiJHBhZ2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy4kc2NvcGUmJnRoaXMuJHJvb3QmJnRoaXMuJHJvb3QuJHNjb3BlJiYodGhpcy4kc2NvcGU9dGhpcy4kcm9vdC4kc2NvcGUpLHRoaXMuJHNjb3BlLiRwYWdlfX0pLHN0eWxlTWl4aW4obyksdW5pSWRNaXhpbihvLGEpLGxpZmVjeWNsZU1peGluKG8sYS53ZWV4LGEpLCJ3ZWV4IiE9PWEuX191bmlDb25maWcubnZ1ZUNvbXBpbGVyJiZpbml0Q29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UobyxhLndlZXgsYSl9KX19O2Z1bmN0aW9uIHZ1ZUZhY3RvcnkoZSx0KXt2YXIgbT1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBFKGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIEkoZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gQShlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gYyhlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIHkoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB1KGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09ci5jYWxsKGUpfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiAwPD10JiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gXyhlKXtyZXR1cm4gSShlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbihlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHx1KGUpJiZlLnRvU3RyaW5nPT09cj9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19cygic2xvdCxjb21wb25lbnQiLCEwKTt2YXIgbD1zKCJrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpcyIpO2Z1bmN0aW9uIGIoZSx0KXtpZihlLmxlbmd0aCl7dmFyIG49ZS5pbmRleE9mKHQpO2lmKC0xPG4pcmV0dXJuIGUuc3BsaWNlKG4sMSl9fXZhciBhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZChlLHQpe3JldHVybiBhLmNhbGwoZSx0KX1mdW5jdGlvbiBmKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfHwobltlXT10KGUpKX19dmFyIHA9Ly0oXHcpL2csaD1mKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UocCxmdW5jdGlvbihlLHQpe3JldHVybiB0P3QudG9VcHBlckNhc2UoKToiIn0pfSksdj1mKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9KSxnPS9cQihbQS1aXSkvZyx3PWYoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShnLCItJDEiKS50b0xvd2VyQ2FzZSgpfSk7dmFyIGs9RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5iaW5kKHQpfTpmdW5jdGlvbihuLHIpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gdD8xPHQ/bi5hcHBseShyLGFyZ3VtZW50cyk6bi5jYWxsKHIsZSk6bi5jYWxsKHIpfXJldHVybiBlLl9sZW5ndGg9bi5sZW5ndGgsZX07ZnVuY3Rpb24gUyhlLHQpe3Q9dHx8MDtmb3IodmFyIG49ZS5sZW5ndGgtdCxyPW5ldyBBcnJheShuKTtuLS07KXJbbl09ZVtuK3RdO3JldHVybiByfWZ1bmN0aW9uIHgoZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gQyhlKXtmb3IodmFyIHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKWVbbl0mJngodCxlW25dKTtyZXR1cm4gdH1mdW5jdGlvbiBUKGUsdCxuKXt9dmFyIE89ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExfSwkPWZ1bmN0aW9uKGUpe3JldHVybiBlfTtmdW5jdGlvbiBQKHQsbil7aWYodD09PW4pcmV0dXJuITA7dmFyIGU9eSh0KSxyPXkobik7aWYoIWV8fCFyKXJldHVybiFlJiYhciYmU3RyaW5nKHQpPT09U3RyaW5nKG4pO3RyeXt2YXIgaT1BcnJheS5pc0FycmF5KHQpLG89QXJyYXkuaXNBcnJheShuKTtpZihpJiZvKXJldHVybiB0Lmxlbmd0aD09PW4ubGVuZ3RoJiZ0LmV2ZXJ5KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFAoZSxuW3RdKX0pO2lmKHQgaW5zdGFuY2VvZiBEYXRlJiZuIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gdC5nZXRUaW1lKCk9PT1uLmdldFRpbWUoKTtpZihpfHxvKXJldHVybiExO3ZhciBhPU9iamVjdC5rZXlzKHQpLHM9T2JqZWN0LmtleXMobik7cmV0dXJuIGEubGVuZ3RoPT09cy5sZW5ndGgmJmEuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIFAodFtlXSxuW2VdKX0pfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBNKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoUChlW25dLHQpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIGooZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX12YXIgTD0iZGF0YS1zZXJ2ZXItcmVuZGVyZWQiLEI9WyJjb21wb25lbnQiLCJkaXJlY3RpdmUiLCJmaWx0ZXIiXSxOPVsiYmVmb3JlQ3JlYXRlIiwiY3JlYXRlZCIsImJlZm9yZU1vdW50IiwibW91bnRlZCIsImJlZm9yZVVwZGF0ZSIsInVwZGF0ZWQiLCJiZWZvcmVEZXN0cm95IiwiZGVzdHJveWVkIiwiYWN0aXZhdGVkIiwiZGVhY3RpdmF0ZWQiLCJlcnJvckNhcHR1cmVkIiwic2VydmVyUHJlZmV0Y2giXSxEPXtvcHRpb25NZXJnZVN0cmF0ZWdpZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxzaWxlbnQ6ITEscHJvZHVjdGlvblRpcDohMSxkZXZ0b29sczohMSxwZXJmb3JtYW5jZTohMSxlcnJvckhhbmRsZXI6bnVsbCx3YXJuSGFuZGxlcjpudWxsLGlnbm9yZWRFbGVtZW50czpbXSxrZXlDb2RlczpPYmplY3QuY3JlYXRlKG51bGwpLGlzUmVzZXJ2ZWRUYWc6Tyxpc1Jlc2VydmVkQXR0cjpPLGlzVW5rbm93bkVsZW1lbnQ6TyxnZXRUYWdOYW1lc3BhY2U6VCxwYXJzZVBsYXRmb3JtVGFnTmFtZTokLG11c3RVc2VQcm9wOk8sYXN5bmM6ITAsX2xpZmVjeWNsZUhvb2tzOk59O2Z1bmN0aW9uIFIoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgRj1uZXcgUmVnRXhwKCJbXiIrL2EtekEtWlx1MDBCN1x1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDNGLVx1MjA0MFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZELy5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgVSx6PSJfX3Byb3RvX18iaW57fSxWPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LHE9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sVz1xJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksSD1WJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLEc9SCYmL21zaWV8dHJpZGVudC8udGVzdChIKSxYPShIJiZILmluZGV4T2YoIm1zaWUgOS4wIiksSCYmMDxILmluZGV4T2YoImVkZ2UvIikpLEo9KEgmJkguaW5kZXhPZigiYW5kcm9pZCIpLEgmJi9pcGhvbmV8aXBhZHxpcG9kfGlvcy8udGVzdChIKSxIJiYvY2hyb21lXC9cZCsvLnRlc3QoSCksSCYmL3BoYW50b21qcy8udGVzdChIKSxIJiZILm1hdGNoKC9maXJlZm94XC8oXGQrKS8pLHt9LndhdGNoKTtpZihWKXRyeXt2YXIgWT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe319KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLFkpfWNhdGNoKGUpe312YXIgSz1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1VJiYoVT0hViYmIXEmJnZvaWQgMCE9PWdsb2JhbCYmKGdsb2JhbC5wcm9jZXNzJiYic2VydmVyIj09PWdsb2JhbC5wcm9jZXNzLmVudi5WVUVfRU5WKSksVX0sWj1WJiZ3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztmdW5jdGlvbiBRKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYvbmF0aXZlIGNvZGUvLnRlc3QoZS50b1N0cmluZygpKX12YXIgZWUsdGU9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlEoU3ltYm9sKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZRKFJlZmxlY3Qub3duS2V5cyk7ZWU9InVuZGVmaW5lZCIhPXR5cGVvZiBTZXQmJlEoU2V0KT9TZXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXR1cm4gZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiEwPT09dGhpcy5zZXRbZV19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLnNldFtlXT0hMH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfSxlfSgpO3ZhciBuZT1ULHJlPTAsaWU9ZnVuY3Rpb24oKXt0aGlzLmlkPXZvaWQgMCE9PXQ/dC51aWQrKzpyZSsrLHRoaXMuc3Vicz1bXX07ZnVuY3Rpb24gb2UoZSl7aWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLnB1c2goZSksaWUuU2hhcmVkT2JqZWN0LnRhcmdldD1lfWZ1bmN0aW9uIGFlKCl7aWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLnBvcCgpLGllLlNoYXJlZE9iamVjdC50YXJnZXQ9aWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrW2llLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5sZW5ndGgtMV19aWUucHJvdG90eXBlLmFkZFN1Yj1mdW5jdGlvbihlKXt0aGlzLnN1YnMucHVzaChlKX0saWUucHJvdG90eXBlLnJlbW92ZVN1Yj1mdW5jdGlvbihlKXtiKHRoaXMuc3VicyxlKX0saWUucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe2llLlNoYXJlZE9iamVjdC50YXJnZXQmJmllLlNoYXJlZE9iamVjdC50YXJnZXQuYWRkRGVwKHRoaXMpfSxpZS5wcm90b3R5cGUubm90aWZ5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuc3Vicy5zbGljZSgpLHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspZVt0XS51cGRhdGUoKX0saWUuU2hhcmVkT2JqZWN0PXZvaWQgMCE9PXQ/dDp7fSxpZS5TaGFyZWRPYmplY3QudGFyZ2V0PW51bGwsaWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrPVtdO3ZhciBzZT1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3RoaXMudGFnPWUsdGhpcy5kYXRhPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMudGV4dD1yLHRoaXMuZWxtPWksdGhpcy5ucz12b2lkIDAsdGhpcy5jb250ZXh0PW8sdGhpcy5mbkNvbnRleHQ9dm9pZCAwLHRoaXMuZm5PcHRpb25zPXZvaWQgMCx0aGlzLmZuU2NvcGVJZD12b2lkIDAsdGhpcy5rZXk9dCYmdC5rZXksdGhpcy5jb21wb25lbnRPcHRpb25zPWEsdGhpcy5jb21wb25lbnRJbnN0YW5jZT12b2lkIDAsdGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMucmF3PSExLHRoaXMuaXNTdGF0aWM9ITEsdGhpcy5pc1Jvb3RJbnNlcnQ9ITAsdGhpcy5pc0NvbW1lbnQ9ITEsdGhpcy5pc0Nsb25lZD0hMSx0aGlzLmlzT25jZT0hMSx0aGlzLmFzeW5jRmFjdG9yeT1zLHRoaXMuYXN5bmNNZXRhPXZvaWQgMCx0aGlzLmlzQXN5bmNQbGFjZWhvbGRlcj0hMX0sY2U9e2NoaWxkOntjb25maWd1cmFibGU6ITB9fTtjZS5jaGlsZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc2UucHJvdG90eXBlLGNlKTt2YXIgdWU9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PW5ldyBzZTtyZXR1cm4gdC50ZXh0PWUsdC5pc0NvbW1lbnQ9ITAsdH07ZnVuY3Rpb24gbGUoZSl7cmV0dXJuIG5ldyBzZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCxTdHJpbmcoZSkpfWZ1bmN0aW9uIGRlKGUpe3ZhciB0PW5ldyBzZShlLnRhZyxlLmRhdGEsZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5zbGljZSgpLGUudGV4dCxlLmVsbSxlLmNvbnRleHQsZS5jb21wb25lbnRPcHRpb25zLGUuYXN5bmNGYWN0b3J5KTtyZXR1cm4gdC5ucz1lLm5zLHQuaXNTdGF0aWM9ZS5pc1N0YXRpYyx0LmtleT1lLmtleSx0LmlzQ29tbWVudD1lLmlzQ29tbWVudCx0LmZuQ29udGV4dD1lLmZuQ29udGV4dCx0LmZuT3B0aW9ucz1lLmZuT3B0aW9ucyx0LmZuU2NvcGVJZD1lLmZuU2NvcGVJZCx0LmFzeW5jTWV0YT1lLmFzeW5jTWV0YSx0LmlzQ2xvbmVkPSEwLHR9dmFyIGZlPUFycmF5LnByb3RvdHlwZSxwZT1PYmplY3QuY3JlYXRlKGZlKTtbInB1c2giLCJwb3AiLCJzaGlmdCIsInVuc2hpZnQiLCJzcGxpY2UiLCJzb3J0IiwicmV2ZXJzZSJdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIHM9ZmVbYV07UihwZSxhLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcixpPXMuYXBwbHkodGhpcyx0KSxvPXRoaXMuX19vYl9fO3N3aXRjaChhKXtjYXNlInB1c2giOmNhc2UidW5zaGlmdCI6cj10O2JyZWFrO2Nhc2Uic3BsaWNlIjpyPXQuc2xpY2UoMil9cmV0dXJuIHImJm8ub2JzZXJ2ZUFycmF5KHIpLG8uZGVwLm5vdGlmeSgpLGl9KX0pO3ZhciBoZT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwZSksdmU9ITA7ZnVuY3Rpb24gZ2UoZSl7dmU9ZX12YXIgbWU9ZnVuY3Rpb24oZSl7dmFyIHQ7dGhpcy52YWx1ZT1lLHRoaXMuZGVwPW5ldyBpZSx0aGlzLnZtQ291bnQ9MCxSKGUsIl9fb2JfXyIsdGhpcyksQXJyYXkuaXNBcnJheShlKT8oej8odD1wZSxlLl9fcHJvdG9fXz10KTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdO1IoZSxvLHRbb10pfX0oZSxwZSxoZSksdGhpcy5vYnNlcnZlQXJyYXkoZSkpOnRoaXMud2FsayhlKX07ZnVuY3Rpb24geWUoZSx0KXt2YXIgbjtpZih5KGUpJiYhKGUgaW5zdGFuY2VvZiBzZSkpcmV0dXJuIGQoZSwiX19vYl9fIikmJmUuX19vYl9fIGluc3RhbmNlb2YgbWU/bj1lLl9fb2JfXzp2ZSYmIUsoKSYmKEFycmF5LmlzQXJyYXkoZSl8fHUoZSkpJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYhZS5faXNWdWUmJihuPW5ldyBtZShlKSksdCYmbiYmbi52bUNvdW50Kyssbn1mdW5jdGlvbiBfZShuLGUscix0LGkpe3ZhciBvPW5ldyBpZSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKTtpZighYXx8ITEhPT1hLmNvbmZpZ3VyYWJsZSl7dmFyIHM9YSYmYS5nZXQsYz1hJiZhLnNldDtzJiYhY3x8MiE9PWFyZ3VtZW50cy5sZW5ndGh8fChyPW5bZV0pO3ZhciB1PSFpJiZ5ZShyKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobixlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1zP3MuY2FsbChuKTpyO3JldHVybiBpZS5TaGFyZWRPYmplY3QudGFyZ2V0JiYoby5kZXBlbmQoKSx1JiYodS5kZXAuZGVwZW5kKCksQXJyYXkuaXNBcnJheShlKSYmZnVuY3Rpb24gZSh0KXtmb3IodmFyIG49dm9pZCAwLHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspKG49dFtyXSkmJm4uX19vYl9fJiZuLl9fb2JfXy5kZXAuZGVwZW5kKCksQXJyYXkuaXNBcnJheShuKSYmZShuKX0oZSkpKSxlfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9cz9zLmNhbGwobik6cjtlPT09dHx8ZSE9ZSYmdCE9dHx8cyYmIWN8fChjP2MuY2FsbChuLGUpOnI9ZSx1PSFpJiZ5ZShlKSxvLm5vdGlmeSgpKX19KX19ZnVuY3Rpb24gYmUoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkmJmkodCkpcmV0dXJuIGUubGVuZ3RoPU1hdGgubWF4KGUubGVuZ3RoLHQpLGUuc3BsaWNlKHQsMSxuKSxuO2lmKHQgaW4gZSYmISh0IGluIE9iamVjdC5wcm90b3R5cGUpKXJldHVybiBlW3RdPW47dmFyIHI9ZS5fX29iX187cmV0dXJuIGUuX2lzVnVlfHxyJiZyLnZtQ291bnQ/bjpyPyhfZShyLnZhbHVlLHQsbiksci5kZXAubm90aWZ5KCksbik6ZVt0XT1ufWZ1bmN0aW9uIHdlKGUsdCl7aWYoQXJyYXkuaXNBcnJheShlKSYmaSh0KSllLnNwbGljZSh0LDEpO2Vsc2V7dmFyIG49ZS5fX29iX187ZS5faXNWdWV8fG4mJm4udm1Db3VudHx8ZChlLHQpJiYoZGVsZXRlIGVbdF0sbiYmbi5kZXAubm90aWZ5KCkpfX1tZS5wcm90b3R5cGUud2Fsaz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7bisrKV9lKGUsdFtuXSl9LG1lLnByb3RvdHlwZS5vYnNlcnZlQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXllKGVbdF0pfTt2YXIga2U9RC5vcHRpb25NZXJnZVN0cmF0ZWdpZXM7ZnVuY3Rpb24gU2UoZSx0KXtpZighdClyZXR1cm4gZTtmb3IodmFyIG4scixpLG89dGU/UmVmbGVjdC5vd25LZXlzKHQpOk9iamVjdC5rZXlzKHQpLGE9MDthPG8ubGVuZ3RoO2ErKykiX19vYl9fIiE9PShuPW9bYV0pJiYocj1lW25dLGk9dFtuXSxkKGUsbik/ciE9PWkmJnUocikmJnUoaSkmJlNlKHIsaSk6YmUoZSxuLGkpKTtyZXR1cm4gZX1mdW5jdGlvbiB4ZShuLHIsaSl7cmV0dXJuIGk/ZnVuY3Rpb24oKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmNhbGwoaSxpKTpyLHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKGksaSk6bjtyZXR1cm4gZT9TZShlLHQpOnR9OnI/bj9mdW5jdGlvbigpe3JldHVybiBTZSgiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmNhbGwodGhpcyx0aGlzKTpyLCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbCh0aGlzLHRoaXMpOm4pfTpyOm59ZnVuY3Rpb24gQ2UoZSx0KXt2YXIgbj10P2U/ZS5jb25jYXQodCk6QXJyYXkuaXNBcnJheSh0KT90Olt0XTplO3JldHVybiBuP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspLTE9PT10LmluZGV4T2YoZVtuXSkmJnQucHVzaChlW25dKTtyZXR1cm4gdH0obik6bn1mdW5jdGlvbiBUZShlLHQsbixyKXt2YXIgaT1PYmplY3QuY3JlYXRlKGV8fG51bGwpO3JldHVybiB0P3goaSx0KTppfWtlLmRhdGE9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuP3hlKGUsdCxuKTp0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnhlKGUsdCl9LE4uZm9yRWFjaChmdW5jdGlvbihlKXtrZVtlXT1DZX0pLEIuZm9yRWFjaChmdW5jdGlvbihlKXtrZVtlKyJzIl09VGV9KSxrZS53YXRjaD1mdW5jdGlvbihlLHQsbixyKXtpZihlPT09SiYmKGU9dm9pZCAwKSx0PT09SiYmKHQ9dm9pZCAwKSwhdClyZXR1cm4gT2JqZWN0LmNyZWF0ZShlfHxudWxsKTtpZighZSlyZXR1cm4gdDt2YXIgaT17fTtmb3IodmFyIG8gaW4geChpLGUpLHQpe3ZhciBhPWlbb10scz10W29dO2EmJiFBcnJheS5pc0FycmF5KGEpJiYoYT1bYV0pLGlbb109YT9hLmNvbmNhdChzKTpBcnJheS5pc0FycmF5KHMpP3M6W3NdfXJldHVybiBpfSxrZS5wcm9wcz1rZS5tZXRob2RzPWtlLmluamVjdD1rZS5jb21wdXRlZD1mdW5jdGlvbihlLHQsbixyKXtpZighZSlyZXR1cm4gdDt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiB4KGksZSksdCYmeChpLHQpLGl9LGtlLnByb3ZpZGU9eGU7dmFyIE9lPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/ZTp0fTtmdW5jdGlvbiBFZShuLHIsaSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHImJihyPXIub3B0aW9ucyksZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnByb3BzO2lmKG4pe3ZhciByLGksbz17fTtpZihBcnJheS5pc0FycmF5KG4pKWZvcihyPW4ubGVuZ3RoO3ItLTspInN0cmluZyI9PXR5cGVvZihpPW5bcl0pJiYob1toKGkpXT17dHlwZTpudWxsfSk7ZWxzZSBpZih1KG4pKWZvcih2YXIgYSBpbiBuKWk9blthXSxvW2goYSldPXUoaSk/aTp7dHlwZTppfTtlLnByb3BzPW99fShyKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUuaW5qZWN0O2lmKG4pe3ZhciByPWUuaW5qZWN0PXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspcltuW2ldXT17ZnJvbTpuW2ldfTtlbHNlIGlmKHUobikpZm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107cltvXT11KGEpP3goe2Zyb206b30sYSk6e2Zyb206YX19fX0ociksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kaXJlY3RpdmVzO2lmKHQpZm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07ImZ1bmN0aW9uIj09dHlwZW9mIHImJih0W25dPXtiaW5kOnIsdXBkYXRlOnJ9KX19KHIpLCFyLl9iYXNlJiYoci5leHRlbmRzJiYobj1FZShuLHIuZXh0ZW5kcyxpKSksci5taXhpbnMpKWZvcih2YXIgZT0wLHQ9ci5taXhpbnMubGVuZ3RoO2U8dDtlKyspbj1FZShuLHIubWl4aW5zW2VdLGkpO3ZhciBvLGE9e307Zm9yKG8gaW4gbilzKG8pO2ZvcihvIGluIHIpZChuLG8pfHxzKG8pO2Z1bmN0aW9uIHMoZSl7dmFyIHQ9a2VbZV18fE9lO2FbZV09dChuW2VdLHJbZV0saSxlKX1yZXR1cm4gYX1mdW5jdGlvbiBJZShlLHQsbixyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBpPWVbdF07aWYoZChpLG4pKXJldHVybiBpW25dO3ZhciBvPWgobik7aWYoZChpLG8pKXJldHVybiBpW29dO3ZhciBhPXYobyk7cmV0dXJuIGQoaSxhKT9pW2FdOmlbbl18fGlbb118fGlbYV19fWZ1bmN0aW9uIEFlKGUsdCxuLHIpe3ZhciBpPXRbZV0sbz0hZChuLGUpLGE9bltlXSxzPU1lKEJvb2xlYW4saS50eXBlKTtpZigtMTxzKWlmKG8mJiFkKGksImRlZmF1bHQiKSlhPSExO2Vsc2UgaWYoIiI9PT1hfHxhPT09dyhlKSl7dmFyIGM9TWUoU3RyaW5nLGkudHlwZSk7KGM8MHx8czxjKSYmKGE9ITApfWlmKHZvaWQgMD09PWEpe2E9ZnVuY3Rpb24oZSx0LG4pe2lmKCFkKHQsImRlZmF1bHQiKSlyZXR1cm47dmFyIHI9dC5kZWZhdWx0O2lmKGUmJmUuJG9wdGlvbnMucHJvcHNEYXRhJiZ2b2lkIDA9PT1lLiRvcHRpb25zLnByb3BzRGF0YVtuXSYmdm9pZCAwIT09ZS5fcHJvcHNbbl0pcmV0dXJuIGUuX3Byb3BzW25dO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiByJiYiRnVuY3Rpb24iIT09JGUodC50eXBlKT9yLmNhbGwoZSk6cn0ocixpLGUpO3ZhciB1PXZlO2dlKCEwKSx5ZShhKSxnZSh1KX1yZXR1cm4gYX1mdW5jdGlvbiAkZShlKXt2YXIgdD1lJiZlLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvbiAoXHcrKS8pO3JldHVybiB0P3RbMV06IiJ9ZnVuY3Rpb24gUGUoZSx0KXtyZXR1cm4gJGUoZSk9PT0kZSh0KX1mdW5jdGlvbiBNZShlLHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBQZSh0LGUpPzA6LTE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKFBlKHRbbl0sZSkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gamUoZSx0LG4pe29lKCk7dHJ5e2lmKHQpZm9yKHZhciByPXQ7cj1yLiRwYXJlbnQ7KXt2YXIgaT1yLiRvcHRpb25zLmVycm9yQ2FwdHVyZWQ7aWYoaSlmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl0cnl7aWYoITE9PT1pW29dLmNhbGwocixlLHQsbikpcmV0dXJufWNhdGNoKGUpe0JlKGUsciwiZXJyb3JDYXB0dXJlZCBob29rIil9fUJlKGUsdCxuKX1maW5hbGx5e2FlKCl9fWZ1bmN0aW9uIExlKGUsdCxuLHIsaSl7dmFyIG87dHJ5eyhvPW4/ZS5hcHBseSh0LG4pOmUuY2FsbCh0KSkmJiFvLl9pc1Z1ZSYmXyhvKSYmIW8uX2hhbmRsZWQmJihvLmNhdGNoKGZ1bmN0aW9uKGUpe3JldHVybiBqZShlLHIsaSsiIChQcm9taXNlL2FzeW5jKSIpfSksby5faGFuZGxlZD0hMCl9Y2F0Y2goZSl7amUoZSxyLGkpfXJldHVybiBvfWZ1bmN0aW9uIEJlKHQsZSxuKXtpZihELmVycm9ySGFuZGxlcil0cnl7cmV0dXJuIEQuZXJyb3JIYW5kbGVyLmNhbGwobnVsbCx0LGUsbil9Y2F0Y2goZSl7ZSE9PXQmJk5lKGUsbnVsbCwiY29uZmlnLmVycm9ySGFuZGxlciIpfU5lKHQsZSxuKX1mdW5jdGlvbiBOZShlLHQsbil7aWYoIVYmJiFxfHwidW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGUpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpfXZhciBEZT1bXSxSZT0hMTtmdW5jdGlvbiBGZSgpe1JlPSExO2Zvcih2YXIgZT1EZS5zbGljZSgwKSx0PURlLmxlbmd0aD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX12YXIgVWU9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KEZlLDApfTtmdW5jdGlvbiB6ZShlLHQpe3ZhciBuO2lmKERlLnB1c2goZnVuY3Rpb24oKXtpZihlKXRyeXtlLmNhbGwodCl9Y2F0Y2goZSl7amUoZSx0LCJuZXh0VGljayIpfWVsc2UgbiYmbih0KX0pLFJlfHwoUmU9ITAsVWUoKSksIWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7bj1lfSl9dmFyIFZlPW5ldyBlZTtmdW5jdGlvbiBxZShlKXshZnVuY3Rpb24gZSh0LG4pe3ZhciByLGk7dmFyIG89QXJyYXkuaXNBcnJheSh0KTtpZighbyYmIXkodCl8fE9iamVjdC5pc0Zyb3plbih0KXx8dCBpbnN0YW5jZW9mIHNlKXJldHVybjtpZih0Ll9fb2JfXyl7dmFyIGE9dC5fX29iX18uZGVwLmlkO2lmKG4uaGFzKGEpKXJldHVybjtuLmFkZChhKX1pZihvKWZvcihyPXQubGVuZ3RoO3ItLTspZSh0W3JdLG4pO2Vsc2UgZm9yKGk9T2JqZWN0LmtleXModCkscj1pLmxlbmd0aDtyLS07KWUodFtpW3JdXSxuKX0oZSxWZSksVmUuY2xlYXIoKX12YXIgV2U9ZihmdW5jdGlvbihlKXt2YXIgdD0iJiI9PT1lLmNoYXJBdCgwKSxuPSJ+Ij09PShlPXQ/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCkscj0iISI9PT0oZT1uP2Uuc2xpY2UoMSk6ZSkuY2hhckF0KDApO3JldHVybntuYW1lOmU9cj9lLnNsaWNlKDEpOmUsb25jZTpuLGNhcHR1cmU6cixwYXNzaXZlOnR9fSk7ZnVuY3Rpb24gSGUoZSxpKXtmdW5jdGlvbiBvKCl7dmFyIGU9YXJndW1lbnRzLHQ9by5mbnM7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIExlKHQsbnVsbCxhcmd1bWVudHMsaSwidi1vbiBoYW5kbGVyIik7Zm9yKHZhciBuPXQuc2xpY2UoKSxyPTA7cjxuLmxlbmd0aDtyKyspTGUobltyXSxudWxsLGUsaSwidi1vbiBoYW5kbGVyIil9cmV0dXJuIG8uZm5zPWUsb31mdW5jdGlvbiBHZShlLHQsbixyLGksbyl7dmFyIGEscyxjLHU7Zm9yKGEgaW4gZSlzPWVbYV0sYz10W2FdLHU9V2UoYSksRShzKXx8KEUoYyk/KEUocy5mbnMpJiYocz1lW2FdPUhlKHMsbykpLEEodS5vbmNlKSYmKHM9ZVthXT1pKHUubmFtZSxzLHUuY2FwdHVyZSkpLG4odS5uYW1lLHMsdS5jYXB0dXJlLHUucGFzc2l2ZSx1LnBhcmFtcykpOnMhPT1jJiYoYy5mbnM9cyxlW2FdPWMpKTtmb3IoYSBpbiB0KUUoZVthXSkmJnIoKHU9V2UoYSkpLm5hbWUsdFthXSx1LmNhcHR1cmUpfWZ1bmN0aW9uIFhlKGUsdCxuKXt2YXIgcjtlIGluc3RhbmNlb2Ygc2UmJihlPWUuZGF0YS5ob29rfHwoZS5kYXRhLmhvb2s9e30pKTt2YXIgaT1lW3RdO2Z1bmN0aW9uIG8oKXtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxiKHIuZm5zLG8pfUUoaSk/cj1IZShbb10pOkkoaS5mbnMpJiZBKGkubWVyZ2VkKT8ocj1pKS5mbnMucHVzaChvKTpyPUhlKFtpLG9dKSxyLm1lcmdlZD0hMCxlW3RdPXJ9ZnVuY3Rpb24gSmUoZSx0LG4scil7dmFyIGk9dC5vcHRpb25zLm1wT3B0aW9ucyYmdC5vcHRpb25zLm1wT3B0aW9ucy5wcm9wZXJ0aWVzO2lmKEUoaSkpcmV0dXJuIG47dmFyIG89dC5vcHRpb25zLm1wT3B0aW9ucy5leHRlcm5hbENsYXNzZXN8fFtdLGE9ZS5hdHRycyxzPWUucHJvcHM7aWYoSShhKXx8SShzKSlmb3IodmFyIGMgaW4gaSl7dmFyIHU9dyhjKTsoWWUobixzLGMsdSwhMCl8fFllKG4sYSxjLHUsITEpKSYmbltjXSYmLTEhPT1vLmluZGV4T2YodSkmJnJbaChuW2NdKV0mJihuW2NdPXJbaChuW2NdKV0pfXJldHVybiBufWZ1bmN0aW9uIFllKGUsdCxuLHIsaSl7aWYoSSh0KSl7aWYoZCh0LG4pKXJldHVybiBlW25dPXRbbl0saXx8ZGVsZXRlIHRbbl0sITA7aWYoZCh0LHIpKXJldHVybiBlW25dPXRbcl0saXx8ZGVsZXRlIHRbcl0sITB9cmV0dXJuITF9ZnVuY3Rpb24gS2UoZSl7cmV0dXJuIGMoZSk/W2xlKGUpXTpBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uIGUodCxuKXt2YXIgcj1bXTt2YXIgaSxvLGEscztmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKUUobz10W2ldKXx8ImJvb2xlYW4iPT10eXBlb2Ygb3x8KGE9ci5sZW5ndGgtMSxzPXJbYV0sQXJyYXkuaXNBcnJheShvKT8wPG8ubGVuZ3RoJiYoWmUoKG89ZShvLChufHwiIikrIl8iK2kpKVswXSkmJlplKHMpJiYoclthXT1sZShzLnRleHQrb1swXS50ZXh0KSxvLnNoaWZ0KCkpLHIucHVzaC5hcHBseShyLG8pKTpjKG8pP1plKHMpP3JbYV09bGUocy50ZXh0K28pOiIiIT09byYmci5wdXNoKGxlKG8pKTpaZShvKSYmWmUocyk/clthXT1sZShzLnRleHQrby50ZXh0KTooQSh0Ll9pc1ZMaXN0KSYmSShvLnRhZykmJkUoby5rZXkpJiZJKG4pJiYoby5rZXk9Il9fdmxpc3QiK24rIl8iK2krIl9fIiksci5wdXNoKG8pKSk7cmV0dXJuIHJ9KGUpOnZvaWQgMH1mdW5jdGlvbiBaZShlKXtyZXR1cm4gSShlKSYmSShlLnRleHQpJiYhMT09PWUuaXNDb21tZW50fWZ1bmN0aW9uIFFlKGUsdCl7aWYoZSl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj10ZT9SZWZsZWN0Lm93bktleXMoZSk6T2JqZWN0LmtleXMoZSksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1yW2ldO2lmKCJfX29iX18iIT09byl7Zm9yKHZhciBhPWVbb10uZnJvbSxzPXQ7czspe2lmKHMuX3Byb3ZpZGVkJiZkKHMuX3Byb3ZpZGVkLGEpKXtuW29dPXMuX3Byb3ZpZGVkW2FdO2JyZWFrfXM9cy4kcGFyZW50fWlmKCFzJiYiZGVmYXVsdCJpbiBlW29dKXt2YXIgYz1lW29dLmRlZmF1bHQ7bltvXT0iZnVuY3Rpb24iPT10eXBlb2YgYz9jLmNhbGwodCk6Y319fXJldHVybiBufX1mdW5jdGlvbiBldChlLHQpe2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJue307Zm9yKHZhciBuPXt9LHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBvPWVbcl0sYT1vLmRhdGE7aWYoYSYmYS5hdHRycyYmYS5hdHRycy5zbG90JiZkZWxldGUgYS5hdHRycy5zbG90LG8uY29udGV4dCE9PXQmJm8uZm5Db250ZXh0IT09dHx8IWF8fG51bGw9PWEuc2xvdCkobi5kZWZhdWx0fHwobi5kZWZhdWx0PVtdKSkucHVzaChvKTtlbHNle3ZhciBzPWEuc2xvdCxjPW5bc118fChuW3NdPVtdKTsidGVtcGxhdGUiPT09by50YWc/Yy5wdXNoLmFwcGx5KGMsby5jaGlsZHJlbnx8W10pOmMucHVzaChvKX19Zm9yKHZhciB1IGluIG4pblt1XS5ldmVyeSh0dCkmJmRlbGV0ZSBuW3VdO3JldHVybiBufWZ1bmN0aW9uIHR0KGUpe3JldHVybiBlLmlzQ29tbWVudCYmIWUuYXN5bmNGYWN0b3J5fHwiICI9PT1lLnRleHR9ZnVuY3Rpb24gbnQoZSx0LG4pe3ZhciByLGk9MDxPYmplY3Qua2V5cyh0KS5sZW5ndGgsbz1lPyEhZS4kc3RhYmxlOiFpLGE9ZSYmZS4ka2V5O2lmKGUpe2lmKGUuX25vcm1hbGl6ZWQpcmV0dXJuIGUuX25vcm1hbGl6ZWQ7aWYobyYmbiYmbiE9PW0mJmE9PT1uLiRrZXkmJiFpJiYhbi4kaGFzTm9ybWFsKXJldHVybiBuO2Zvcih2YXIgcyBpbiByPXt9LGUpZVtzXSYmIiQiIT09c1swXSYmKHJbc109cnQodCxzLGVbc10pKX1lbHNlIHI9e307Zm9yKHZhciBjIGluIHQpYyBpbiByfHwocltjXT1pdCh0LGMpKTtyZXR1cm4gZSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmKGUuX25vcm1hbGl6ZWQ9ciksUihyLCIkc3RhYmxlIixvKSxSKHIsIiRrZXkiLGEpLFIociwiJGhhc05vcm1hbCIsaSkscn1mdW5jdGlvbiBydChlLHQsbil7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoP24uYXBwbHkobnVsbCxhcmd1bWVudHMpOm4oe30pO3JldHVybihlPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIUFycmF5LmlzQXJyYXkoZSk/W2VdOktlKGUpKSYmKDA9PT1lLmxlbmd0aHx8MT09PWUubGVuZ3RoJiZlWzBdLmlzQ29tbWVudCk/dm9pZCAwOmV9O3JldHVybiBuLnByb3h5JiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtnZXQ6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHJ9ZnVuY3Rpb24gaXQoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19ZnVuY3Rpb24gb3QoZSx0KXt2YXIgbixyLGksbyxhO2lmKEFycmF5LmlzQXJyYXkoZSl8fCJzdHJpbmciPT10eXBlb2YgZSlmb3Iobj1uZXcgQXJyYXkoZS5sZW5ndGgpLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbltyXT10KGVbcl0scixyLHIpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlKSxyPTA7cjxlO3IrKyluW3JdPXQocisxLHIscixyKTtlbHNlIGlmKHkoZSkpaWYodGUmJmVbU3ltYm9sLml0ZXJhdG9yXSl7bj1bXTt2YXIgcz1lW1N5bWJvbC5pdGVyYXRvcl0oKSxjPXMubmV4dCgpO2ZvcihyPTA7IWMuZG9uZTspbi5wdXNoKHQoYy52YWx1ZSxuLmxlbmd0aCxyLHIrKykpLGM9cy5uZXh0KCl9ZWxzZSBmb3Iobz1PYmplY3Qua2V5cyhlKSxuPW5ldyBBcnJheShvLmxlbmd0aCkscj0wLGk9by5sZW5ndGg7cjxpO3IrKylhPW9bcl0sbltyXT10KGVbYV0sYSxyLHIpO3JldHVybiBJKG4pfHwobj1bXSksbi5faXNWTGlzdD0hMCxufWZ1bmN0aW9uIGF0KGUsdCxuLHIpe3ZhciBpLG89dGhpcy4kc2NvcGVkU2xvdHNbZV07bz8obj1ufHx7fSxyJiYobj14KHgoe30sciksbikpLGk9byhuLHRoaXMsbi5faSl8fHQpOmk9dGhpcy4kc2xvdHNbZV18fHQ7dmFyIGE9biYmbi5zbG90O3JldHVybiBhP3RoaXMuJGNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIix7c2xvdDphfSxpKTppfWZ1bmN0aW9uIHN0KGUpe3JldHVybiBJZSh0aGlzLiRvcHRpb25zLCJmaWx0ZXJzIixlKXx8JH1mdW5jdGlvbiBjdChlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPy0xPT09ZS5pbmRleE9mKHQpOmUhPT10fWZ1bmN0aW9uIHV0KGUsdCxuLHIsaSl7dmFyIG89RC5rZXlDb2Rlc1t0XXx8bjtyZXR1cm4gaSYmciYmIUQua2V5Q29kZXNbdF0/Y3QoaSxyKTpvP2N0KG8sZSk6cj93KHIpIT09dDp2b2lkIDB9ZnVuY3Rpb24gbHQoaSxvLGEscyxjKXtpZihhKWlmKHkoYSkpe3ZhciB1O0FycmF5LmlzQXJyYXkoYSkmJihhPUMoYSkpO3ZhciBlPWZ1bmN0aW9uKHQpe2lmKCJjbGFzcyI9PT10fHwic3R5bGUiPT09dHx8bCh0KSl1PWk7ZWxzZXt2YXIgZT1pLmF0dHJzJiZpLmF0dHJzLnR5cGU7dT1zfHxELm11c3RVc2VQcm9wKG8sZSx0KT9pLmRvbVByb3BzfHwoaS5kb21Qcm9wcz17fSk6aS5hdHRyc3x8KGkuYXR0cnM9e30pfXZhciBuPWgodCkscj13KHQpO24gaW4gdXx8ciBpbiB1fHwodVt0XT1hW3RdLGMmJigoaS5vbnx8KGkub249e30pKVsidXBkYXRlOiIrdF09ZnVuY3Rpb24oZSl7YVt0XT1lfSkpfTtmb3IodmFyIHQgaW4gYSllKHQpfWVsc2U7cmV0dXJuIGl9ZnVuY3Rpb24gZHQoZSx0KXt2YXIgbj10aGlzLl9zdGF0aWNUcmVlc3x8KHRoaXMuX3N0YXRpY1RyZWVzPVtdKSxyPW5bZV07cmV0dXJuIHImJiF0fHxwdChyPW5bZV09dGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbZV0uY2FsbCh0aGlzLl9yZW5kZXJQcm94eSxudWxsLHRoaXMpLCJfX3N0YXRpY19fIitlLCExKSxyfWZ1bmN0aW9uIGZ0KGUsdCxuKXtyZXR1cm4gcHQoZSwiX19vbmNlX18iK3QrKG4/Il8iK246IiIpLCEwKSxlfWZ1bmN0aW9uIHB0KGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJiJzdHJpbmciIT10eXBlb2YgZVtyXSYmaHQoZVtyXSx0KyJfIityLG4pO2Vsc2UgaHQoZSx0LG4pfWZ1bmN0aW9uIGh0KGUsdCxuKXtlLmlzU3RhdGljPSEwLGUua2V5PXQsZS5pc09uY2U9bn1mdW5jdGlvbiB2dChlLHQpe2lmKHQpaWYodSh0KSl7dmFyIG49ZS5vbj1lLm9uP3goe30sZS5vbik6e307Zm9yKHZhciByIGluIHQpe3ZhciBpPW5bcl0sbz10W3JdO25bcl09aT9bXS5jb25jYXQoaSxvKTpvfX1lbHNlO3JldHVybiBlfWZ1bmN0aW9uIGd0KGUsdCxuLHIpe3Q9dHx8eyRzdGFibGU6IW59O2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO0FycmF5LmlzQXJyYXkobyk/Z3Qobyx0LG4pOm8mJihvLnByb3h5JiYoby5mbi5wcm94eT0hMCksdFtvLmtleV09by5mbil9cmV0dXJuIHImJih0LiRrZXk9ciksdH1mdW5jdGlvbiBtdChlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bis9Mil7dmFyIHI9dFtuXTsic3RyaW5nIj09dHlwZW9mIHImJnImJihlW3Rbbl1dPXRbbisxXSl9cmV0dXJuIGV9ZnVuY3Rpb24geXQoZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/dCtlOmV9ZnVuY3Rpb24gX3QoZSl7ZS5fbz1mdCxlLl9uPW8sZS5fcz1uLGUuX2w9b3QsZS5fdD1hdCxlLl9xPVAsZS5faT1NLGUuX209ZHQsZS5fZj1zdCxlLl9rPXV0LGUuX2I9bHQsZS5fdj1sZSxlLl9lPXVlLGUuX3U9Z3QsZS5fZz12dCxlLl9kPW10LGUuX3A9eXR9ZnVuY3Rpb24gYnQoZSx0LG4sbyxyKXt2YXIgYSxpPXRoaXMscz1yLm9wdGlvbnM7ZChvLCJfdWlkIik/KGE9T2JqZWN0LmNyZWF0ZShvKSkuX29yaWdpbmFsPW86bz0oYT1vKS5fb3JpZ2luYWw7dmFyIGM9QShzLl9jb21waWxlZCksdT0hYzt0aGlzLmRhdGE9ZSx0aGlzLnByb3BzPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMucGFyZW50PW8sdGhpcy5saXN0ZW5lcnM9ZS5vbnx8bSx0aGlzLmluamVjdGlvbnM9UWUocy5pbmplY3QsbyksdGhpcy5zbG90cz1mdW5jdGlvbigpe3JldHVybiBpLiRzbG90c3x8bnQoZS5zY29wZWRTbG90cyxpLiRzbG90cz1ldChuLG8pKSxpLiRzbG90c30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNjb3BlZFNsb3RzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnQoZS5zY29wZWRTbG90cyx0aGlzLnNsb3RzKCkpfX0pLGMmJih0aGlzLiRvcHRpb25zPXMsdGhpcy4kc2xvdHM9dGhpcy5zbG90cygpLHRoaXMuJHNjb3BlZFNsb3RzPW50KGUuc2NvcGVkU2xvdHMsdGhpcy4kc2xvdHMpKSxzLl9zY29wZUlkP3RoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9SXQoYSxlLHQsbixyLHUpO3JldHVybiBpJiYhQXJyYXkuaXNBcnJheShpKSYmKGkuZm5TY29wZUlkPXMuX3Njb3BlSWQsaS5mbkNvbnRleHQ9byksaX06dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gSXQoYSxlLHQsbixyLHUpfX1mdW5jdGlvbiB3dChlLHQsbixyLGkpe3ZhciBvPWRlKGUpO3JldHVybiBvLmZuQ29udGV4dD1uLG8uZm5PcHRpb25zPXIsdC5zbG90JiYoKG8uZGF0YXx8KG8uZGF0YT17fSkpLnNsb3Q9dC5zbG90KSxvfWZ1bmN0aW9uIGt0KGUsdCl7Zm9yKHZhciBuIGluIHQpZVtoKG4pXT10W25dfV90KGJ0LnByb3RvdHlwZSk7dmFyIFN0PXtpbml0OmZ1bmN0aW9uKGUsdCl7aWYoZS5jb21wb25lbnRJbnN0YW5jZSYmIWUuY29tcG9uZW50SW5zdGFuY2UuX2lzRGVzdHJveWVkJiZlLmRhdGEua2VlcEFsaXZlKXt2YXIgbj1lO1N0LnByZXBhdGNoKG4sbil9ZWxzZXsoZS5jb21wb25lbnRJbnN0YW5jZT1mdW5jdGlvbihlLHQpe3ZhciBuPXtfaXNDb21wb25lbnQ6ITAsX3BhcmVudFZub2RlOmUscGFyZW50OnR9LHI9ZS5kYXRhLmlubGluZVRlbXBsYXRlO0kocikmJihuLnJlbmRlcj1yLnJlbmRlcixuLnN0YXRpY1JlbmRlckZucz1yLnN0YXRpY1JlbmRlckZucyk7cmV0dXJuIG5ldyBlLmNvbXBvbmVudE9wdGlvbnMuQ3RvcihuKX0oZSxOdCkpLiRtb3VudCh0P2UuZWxtOnZvaWQgMCx0KX19LHByZXBhdGNoOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5jb21wb25lbnRPcHRpb25zOyFmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPXIuZGF0YS5zY29wZWRTbG90cyxhPWUuJHNjb3BlZFNsb3RzLHM9ISEobyYmIW8uJHN0YWJsZXx8YSE9PW0mJiFhLiRzdGFibGV8fG8mJmUuJHNjb3BlZFNsb3RzLiRrZXkhPT1vLiRrZXkpLGM9ISEoaXx8ZS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW58fHMpO2UuJG9wdGlvbnMuX3BhcmVudFZub2RlPXIsZS4kdm5vZGU9cixlLl92bm9kZSYmKGUuX3Zub2RlLnBhcmVudD1yKTtpZihlLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbj1pLGUuJGF0dHJzPXIuZGF0YS5hdHRyc3x8bSxlLiRsaXN0ZW5lcnM9bnx8bSx0JiZlLiRvcHRpb25zLnByb3BzKXtnZSghMSk7Zm9yKHZhciB1PWUuX3Byb3BzLGw9ZS4kb3B0aW9ucy5fcHJvcEtleXN8fFtdLGQ9MDtkPGwubGVuZ3RoO2QrKyl7dmFyIGY9bFtkXSxwPWUuJG9wdGlvbnMucHJvcHM7dVtmXT1BZShmLHAsdCxlKX1nZSghMCksZS4kb3B0aW9ucy5wcm9wc0RhdGE9dH1lLl8kdXBkYXRlUHJvcGVydGllcyYmZS5fJHVwZGF0ZVByb3BlcnRpZXMoZSksbj1ufHxtO3ZhciBoPWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztlLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM9bixCdChlLG4saCksYyYmKGUuJHNsb3RzPWV0KGksci5jb250ZXh0KSxlLiRmb3JjZVVwZGF0ZSgpKX0odC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlLG4ucHJvcHNEYXRhLG4ubGlzdGVuZXJzLHQsbi5jaGlsZHJlbil9LGluc2VydDpmdW5jdGlvbihlKXt2YXIgdCxuPWUuY29udGV4dCxyPWUuY29tcG9uZW50SW5zdGFuY2U7ci5faXNNb3VudGVkfHwoci5faXNNb3VudGVkPSEwLHIuXyR2ZD8oRnQociwib25TZXJ2aWNlQ3JlYXRlZCIpLEZ0KHIsIm9uU2VydmljZUF0dGFjaGVkIiksci5fJHZkLmFkZE1vdW50ZWRWbShyKSk6RnQociwibW91bnRlZCIpKSxlLmRhdGEua2VlcEFsaXZlJiYobi5faXNNb3VudGVkPygodD1yKS5faW5hY3RpdmU9ITEsenQucHVzaCh0KSk6UnQociwhMCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29tcG9uZW50SW5zdGFuY2U7dC5faXNEZXN0cm95ZWR8fChlLmRhdGEua2VlcEFsaXZlP2Z1bmN0aW9uIGUodCxuKXtpZihuJiYodC5fZGlyZWN0SW5hY3RpdmU9ITAsRHQodCkpKXJldHVybjtpZighdC5faW5hY3RpdmUpe3QuX2luYWN0aXZlPSEwO2Zvcih2YXIgcj0wO3I8dC4kY2hpbGRyZW4ubGVuZ3RoO3IrKyllKHQuJGNoaWxkcmVuW3JdKTtGdCh0LCJkZWFjdGl2YXRlZCIpfX0odCwhMCk6dC4kZGVzdHJveSgpKX19LHh0PU9iamVjdC5rZXlzKFN0KTtmdW5jdGlvbiBDdChlLHQsbixyLGkpe2lmKCFFKGUpKXt2YXIgbz1uLiRvcHRpb25zLl9iYXNlO2lmKHkoZSkmJihlPW8uZXh0ZW5kKGUpKSwiZnVuY3Rpb24iPT10eXBlb2YgZSl7dmFyIGEscyxjLHUsbCxkLGY7aWYoRShlLmNpZCkmJnZvaWQgMD09PShlPWZ1bmN0aW9uKHQsbil7aWYoQSh0LmVycm9yKSYmSSh0LmVycm9yQ29tcCkpcmV0dXJuIHQuZXJyb3JDb21wO2lmKEkodC5yZXNvbHZlZCkpcmV0dXJuIHQucmVzb2x2ZWQ7dmFyIGU9JHQ7ZSYmSSh0Lm93bmVycykmJi0xPT09dC5vd25lcnMuaW5kZXhPZihlKSYmdC5vd25lcnMucHVzaChlKTtpZihBKHQubG9hZGluZykmJkkodC5sb2FkaW5nQ29tcCkpcmV0dXJuIHQubG9hZGluZ0NvbXA7aWYoZSYmIUkodC5vd25lcnMpKXt2YXIgcj10Lm93bmVycz1bZV0saT0hMCxvPW51bGwsYT1udWxsO2UuJG9uKCJob29rOmRlc3Ryb3llZCIsZnVuY3Rpb24oKXtyZXR1cm4gYihyLGUpfSk7dmFyIHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1yLmxlbmd0aDt0PG47dCsrKXJbdF0uJGZvcmNlVXBkYXRlKCk7ZSYmKHIubGVuZ3RoPTAsbnVsbCE9PW8mJihjbGVhclRpbWVvdXQobyksbz1udWxsKSxudWxsIT09YSYmKGNsZWFyVGltZW91dChhKSxhPW51bGwpKX0sYz1qKGZ1bmN0aW9uKGUpe3QucmVzb2x2ZWQ9UHQoZSxuKSxpP3IubGVuZ3RoPTA6cyghMCl9KSx1PWooZnVuY3Rpb24oZSl7SSh0LmVycm9yQ29tcCkmJih0LmVycm9yPSEwLHMoITApKX0pLGw9dChjLHUpO3JldHVybiB5KGwpJiYoXyhsKT9FKHQucmVzb2x2ZWQpJiZsLnRoZW4oYyx1KTpfKGwuY29tcG9uZW50KSYmKGwuY29tcG9uZW50LnRoZW4oYyx1KSxJKGwuZXJyb3IpJiYodC5lcnJvckNvbXA9UHQobC5lcnJvcixuKSksSShsLmxvYWRpbmcpJiYodC5sb2FkaW5nQ29tcD1QdChsLmxvYWRpbmcsbiksMD09PWwuZGVsYXk/dC5sb2FkaW5nPSEwOm89c2V0VGltZW91dChmdW5jdGlvbigpe289bnVsbCxFKHQucmVzb2x2ZWQpJiZFKHQuZXJyb3IpJiYodC5sb2FkaW5nPSEwLHMoITEpKX0sbC5kZWxheXx8MjAwKSksSShsLnRpbWVvdXQpJiYoYT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YT1udWxsLEUodC5yZXNvbHZlZCkmJnUobnVsbCl9LGwudGltZW91dCkpKSksaT0hMSx0LmxvYWRpbmc/dC5sb2FkaW5nQ29tcDp0LnJlc29sdmVkfX0oYT1lLG8pKSlyZXR1cm4gcz1hLGM9dCx1PW4sbD1yLGQ9aSwoZj11ZSgpKS5hc3luY0ZhY3Rvcnk9cyxmLmFzeW5jTWV0YT17ZGF0YTpjLGNvbnRleHQ6dSxjaGlsZHJlbjpsLHRhZzpkfSxmO3Q9dHx8e30sdm4oZSksSSh0Lm1vZGVsKSYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm1vZGVsJiZlLm1vZGVsLnByb3B8fCJ2YWx1ZSIscj1lLm1vZGVsJiZlLm1vZGVsLmV2ZW50fHwiaW5wdXQiOyh0LmF0dHJzfHwodC5hdHRycz17fSkpW25dPXQubW9kZWwudmFsdWU7dmFyIGk9dC5vbnx8KHQub249e30pLG89aVtyXSxhPXQubW9kZWwuY2FsbGJhY2s7SShvKT8oQXJyYXkuaXNBcnJheShvKT8tMT09PW8uaW5kZXhPZihhKTpvIT09YSkmJihpW3JdPVthXS5jb25jYXQobykpOmlbcl09YX0oZS5vcHRpb25zLHQpO3ZhciBwPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXQub3B0aW9ucy5wcm9wcztpZihFKGkpKXJldHVybiBKZShlLHQse30scik7dmFyIG89e30sYT1lLmF0dHJzLHM9ZS5wcm9wcztpZihJKGEpfHxJKHMpKWZvcih2YXIgYyBpbiBpKXt2YXIgdT13KGMpO1llKG8scyxjLHUsITApfHxZZShvLGEsYyx1LCExKX1yZXR1cm4gSmUoZSx0LG8scil9KHQsZSwwLG4pO2lmKEEoZS5vcHRpb25zLmZ1bmN0aW9uYWwpKXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPWUub3B0aW9ucyxhPXt9LHM9by5wcm9wcztpZihJKHMpKWZvcih2YXIgYyBpbiBzKWFbY109QWUoYyxzLHR8fG0pO2Vsc2UgSShuLmF0dHJzKSYma3QoYSxuLmF0dHJzKSxJKG4ucHJvcHMpJiZrdChhLG4ucHJvcHMpO3ZhciB1PW5ldyBidChuLGEsaSxyLGUpLGw9by5yZW5kZXIuY2FsbChudWxsLHUuX2MsdSk7aWYobCBpbnN0YW5jZW9mIHNlKXJldHVybiB3dChsLG4sdS5wYXJlbnQsbyk7aWYoQXJyYXkuaXNBcnJheShsKSl7Zm9yKHZhciBkPUtlKGwpfHxbXSxmPW5ldyBBcnJheShkLmxlbmd0aCkscD0wO3A8ZC5sZW5ndGg7cCsrKWZbcF09d3QoZFtwXSxuLHUucGFyZW50LG8pO3JldHVybiBmfX0oZSxwLHQsbixyKTt2YXIgaD10Lm9uO2lmKHQub249dC5uYXRpdmVPbixBKGUub3B0aW9ucy5hYnN0cmFjdCkpe3ZhciB2PXQuc2xvdDt0PXt9LHYmJih0LnNsb3Q9dil9IWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmhvb2t8fChlLmhvb2s9e30pLG49MDtuPHh0Lmxlbmd0aDtuKyspe3ZhciByPXh0W25dLGk9dFtyXSxvPVN0W3JdO2k9PT1vfHxpJiZpLl9tZXJnZWR8fCh0W3JdPWk/VHQobyxpKTpvKX19KHQpO3ZhciBnPWUub3B0aW9ucy5uYW1lfHxpO3JldHVybiBuZXcgc2UoInZ1ZS1jb21wb25lbnQtIitlLmNpZCsoZz8iLSIrZzoiIiksdCx2b2lkIDAsdm9pZCAwLHZvaWQgMCxuLHtDdG9yOmUscHJvcHNEYXRhOnAsbGlzdGVuZXJzOmgsdGFnOmksY2hpbGRyZW46cn0sYSl9fX1mdW5jdGlvbiBUdChuLHIpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7bihlLHQpLHIoZSx0KX07cmV0dXJuIGUuX21lcmdlZD0hMCxlfXZhciBPdD0xLEV0PTI7ZnVuY3Rpb24gSXQoZSx0LG4scixpLG8pe3JldHVybihBcnJheS5pc0FycmF5KG4pfHxjKG4pKSYmKGk9cixyPW4sbj12b2lkIDApLEEobykmJihpPUV0KSxmdW5jdGlvbihlLHQsbixyLGkpe2lmKEkobikmJkkobi5fX29iX18pKXJldHVybiB1ZSgpO0kobikmJkkobi5pcykmJih0PW4uaXMpO2lmKCF0KXJldHVybiB1ZSgpO0FycmF5LmlzQXJyYXkocikmJiJmdW5jdGlvbiI9PXR5cGVvZiByWzBdJiYoKG49bnx8e30pLnNjb3BlZFNsb3RzPXtkZWZhdWx0OnJbMF19LHIubGVuZ3RoPTApO2k9PT1FdD9yPUtlKHIpOmk9PT1PdCYmKHI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspaWYoQXJyYXkuaXNBcnJheShlW3RdKSlyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxlKTtyZXR1cm4gZX0ocikpO3ZhciBvLGE7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgczthPWUuJHZub2RlJiZlLiR2bm9kZS5uc3x8RC5nZXRUYWdOYW1lc3BhY2UodCksbz1ELmlzUmVzZXJ2ZWRUYWcodCk/bmV3IHNlKEQucGFyc2VQbGF0Zm9ybVRhZ05hbWUodCksbixyLHZvaWQgMCx2b2lkIDAsZSk6biYmbi5wcmV8fCFJKHM9SWUoZS4kb3B0aW9ucywiY29tcG9uZW50cyIsdCkpP25ldyBzZSh0LG4scix2b2lkIDAsdm9pZCAwLGUpOkN0KHMsbixlLHIsdCl9ZWxzZSBvPUN0KHQsbixlLHIpO3JldHVybiBBcnJheS5pc0FycmF5KG8pP286SShvKT8oSShhKSYmZnVuY3Rpb24gZSh0LG4scil7dC5ucz1uOyJmb3JlaWduT2JqZWN0Ij09PXQudGFnJiYocj0hKG49dm9pZCAwKSk7aWYoSSh0LmNoaWxkcmVuKSlmb3IodmFyIGk9MCxvPXQuY2hpbGRyZW4ubGVuZ3RoO2k8bztpKyspe3ZhciBhPXQuY2hpbGRyZW5baV07SShhLnRhZykmJihFKGEubnMpfHxBKHIpJiYic3ZnIiE9PWEudGFnKSYmZShhLG4scil9fShvLGEpLEkobikmJmZ1bmN0aW9uKGUpe3koZS5zdHlsZSkmJnFlKGUuc3R5bGUpO3koZS5jbGFzcykmJnFlKGUuY2xhc3MpfShuKSxvKTp1ZSgpfShlLHQsbixyLGkpfXZhciBBdCwkdD1udWxsO2Z1bmN0aW9uIFB0KGUsdCl7cmV0dXJuKGUuX19lc01vZHVsZXx8dGUmJiJNb2R1bGUiPT09ZVtTeW1ib2wudG9TdHJpbmdUYWddKSYmKGU9ZS5kZWZhdWx0KSx5KGUpP3QuZXh0ZW5kKGUpOmV9ZnVuY3Rpb24gTXQoZSx0KXtBdC4kb24oZSx0KX1mdW5jdGlvbiBqdChlLHQpe0F0LiRvZmYoZSx0KX1mdW5jdGlvbiBMdCh0LG4pe3ZhciByPUF0O3JldHVybiBmdW5jdGlvbiBlKCl7bnVsbCE9PW4uYXBwbHkobnVsbCxhcmd1bWVudHMpJiZyLiRvZmYodCxlKX19ZnVuY3Rpb24gQnQoZSx0LG4pe0dlKHQsbnx8e30sTXQsanQsTHQsQXQ9ZSksQXQ9dm9pZCAwfXZhciBOdD1udWxsO2Z1bmN0aW9uIER0KGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gUnQoZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxEdChlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKVJ0KGUuJGNoaWxkcmVuW25dKTtGdChlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gRnQoZSx0KXtvZSgpO3ZhciBuPWUuJG9wdGlvbnNbdF0scj10KyIgaG9vayI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspTGUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxhZSgpfXZhciBVdD1bXSx6dD1bXSxWdD17fSxxdD0hMSxXdD0hMSxIdD0wO3ZhciBHdD1EYXRlLm5vdztpZihWJiYhRyl7dmFyIFh0PXdpbmRvdy5wZXJmb3JtYW5jZTtYdCYmImZ1bmN0aW9uIj09dHlwZW9mIFh0Lm5vdyYmR3QoKT5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKS50aW1lU3RhbXAmJihHdD1mdW5jdGlvbigpe3JldHVybiBYdC5ub3coKX0pfWZ1bmN0aW9uIEp0KCl7dmFyIGUsdDtmb3IoR3QoKSxXdD0hMCxVdC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaWQtdC5pZH0pLEh0PTA7SHQ8VXQubGVuZ3RoO0h0KyspKGU9VXRbSHRdKS5iZWZvcmUmJmUuYmVmb3JlKCksdD1lLmlkLFZ0W3RdPW51bGwsZS5ydW4oKTt2YXIgbj16dC5zbGljZSgpLHI9VXQuc2xpY2UoKTtIdD1VdC5sZW5ndGg9enQubGVuZ3RoPTAscXQ9V3Q9IShWdD17fSksZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5faW5hY3RpdmU9ITAsUnQoZVt0XSwhMCl9KG4pLGZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2Zvcig7dC0tOyl7dmFyIG49ZVt0XSxyPW4udm07ci5fd2F0Y2hlcj09PW4mJnIuX2lzTW91bnRlZCYmIXIuX2lzRGVzdHJveWVkJiYoci5fJHZkP3IuXyR2ZC5hZGRVcGRhdGVkVm0ocik6RnQociwidXBkYXRlZCIpKX19KHIpLFomJkQuZGV2dG9vbHMmJlouZW1pdCgiZmx1c2giKX12YXIgWXQ9MCxLdD1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMudm09ZSxpJiYoZS5fd2F0Y2hlcj10aGlzKSxlLl93YXRjaGVycy5wdXNoKHRoaXMpLHI/KHRoaXMuZGVlcD0hIXIuZGVlcCx0aGlzLnVzZXI9ISFyLnVzZXIsdGhpcy5sYXp5PSEhci5sYXp5LHRoaXMuc3luYz0hIXIuc3luYyx0aGlzLmJlZm9yZT1yLmJlZm9yZSk6dGhpcy5kZWVwPXRoaXMudXNlcj10aGlzLmxhenk9dGhpcy5zeW5jPSExLHRoaXMuY2I9bix0aGlzLmlkPSsrWXQsdGhpcy5hY3RpdmU9ITAsdGhpcy5kaXJ0eT10aGlzLmxhenksdGhpcy5kZXBzPVtdLHRoaXMubmV3RGVwcz1bXSx0aGlzLmRlcElkcz1uZXcgZWUsdGhpcy5uZXdEZXBJZHM9bmV3IGVlLHRoaXMuZXhwcmVzc2lvbj0iIiwiZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLmdldHRlcj10Oih0aGlzLmdldHRlcj1mdW5jdGlvbihlKXtpZighRi50ZXN0KGUpKXt2YXIgbj1lLnNwbGl0KCIuIik7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8bi5sZW5ndGg7dCsrKXtpZighZSlyZXR1cm47ZT1lW25bdF1dfXJldHVybiBlfX19KHQpLHRoaXMuZ2V0dGVyfHwodGhpcy5nZXR0ZXI9VCkpLHRoaXMudmFsdWU9dGhpcy5sYXp5P3ZvaWQgMDp0aGlzLmdldCgpfTtLdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7dmFyIGU7b2UodGhpcyk7dmFyIHQ9dGhpcy52bTt0cnl7ZT10aGlzLmdldHRlci5jYWxsKHQsdCl9Y2F0Y2goZSl7aWYoIXRoaXMudXNlcil0aHJvdyBlO2plKGUsdCwnZ2V0dGVyIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWZpbmFsbHl7dGhpcy5kZWVwJiZxZShlKSxhZSgpLHRoaXMuY2xlYW51cERlcHMoKX1yZXR1cm4gZX0sS3QucHJvdG90eXBlLmFkZERlcD1mdW5jdGlvbihlKXt2YXIgdD1lLmlkO3RoaXMubmV3RGVwSWRzLmhhcyh0KXx8KHRoaXMubmV3RGVwSWRzLmFkZCh0KSx0aGlzLm5ld0RlcHMucHVzaChlKSx0aGlzLmRlcElkcy5oYXModCl8fGUuYWRkU3ViKHRoaXMpKX0sS3QucHJvdG90eXBlLmNsZWFudXBEZXBzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl7dmFyIHQ9dGhpcy5kZXBzW2VdO3RoaXMubmV3RGVwSWRzLmhhcyh0LmlkKXx8dC5yZW1vdmVTdWIodGhpcyl9dmFyIG49dGhpcy5kZXBJZHM7dGhpcy5kZXBJZHM9dGhpcy5uZXdEZXBJZHMsdGhpcy5uZXdEZXBJZHM9bix0aGlzLm5ld0RlcElkcy5jbGVhcigpLG49dGhpcy5kZXBzLHRoaXMuZGVwcz10aGlzLm5ld0RlcHMsdGhpcy5uZXdEZXBzPW4sdGhpcy5uZXdEZXBzLmxlbmd0aD0wfSxLdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5sYXp5P3RoaXMuZGlydHk9ITA6dGhpcy5zeW5jP3RoaXMucnVuKCk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtpZihudWxsPT1WdFt0XSl7aWYoVnRbdF09ITAsV3Qpe2Zvcih2YXIgbj1VdC5sZW5ndGgtMTtIdDxuJiZVdFtuXS5pZD5lLmlkOyluLS07VXQuc3BsaWNlKG4rMSwwLGUpfWVsc2UgVXQucHVzaChlKTtxdHx8KHF0PSEwLHplKEp0KSl9fSh0aGlzKX0sS3QucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt2YXIgZT10aGlzLmdldCgpO2lmKGUhPT10aGlzLnZhbHVlfHx5KGUpfHx0aGlzLmRlZXApe3ZhciB0PXRoaXMudmFsdWU7aWYodGhpcy52YWx1ZT1lLHRoaXMudXNlcil0cnl7dGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX1jYXRjaChlKXtqZShlLHRoaXMudm0sJ2NhbGxiYWNrIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWVsc2UgdGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX19fSxLdC5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlPXRoaXMuZ2V0KCksdGhpcy5kaXJ0eT0hMX0sS3QucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLmRlcGVuZCgpfSxLdC5wcm90b3R5cGUudGVhcmRvd249ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSl7dGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZHx8Yih0aGlzLnZtLl93YXRjaGVycyx0aGlzKTtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXRoaXMuZGVwc1tlXS5yZW1vdmVTdWIodGhpcyk7dGhpcy5hY3RpdmU9ITF9fTt2YXIgWnQ9e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpULHNldDpUfTtmdW5jdGlvbiBRdChlLHQsbil7WnQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdF1bbl19LFp0LnNldD1mdW5jdGlvbihlKXt0aGlzW3RdW25dPWV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sWnQpfWZ1bmN0aW9uIGVuKGUpe2UuX3dhdGNoZXJzPVtdO3ZhciB0PWUuJG9wdGlvbnM7dC5wcm9wcyYmZnVuY3Rpb24obixyKXt2YXIgaT1uLiRvcHRpb25zLnByb3BzRGF0YXx8e30sbz1uLl9wcm9wcz17fSxhPW4uJG9wdGlvbnMuX3Byb3BLZXlzPVtdO24uJHBhcmVudCYmZ2UoITEpO3ZhciBlPWZ1bmN0aW9uKGUpe2EucHVzaChlKTt2YXIgdD1BZShlLHIsaSxuKTtfZShvLGUsdCksZSBpbiBufHxRdChuLCJfcHJvcHMiLGUpfTtmb3IodmFyIHQgaW4gcillKHQpO2dlKCEwKX0oZSx0LnByb3BzKSx0Lm1ldGhvZHMmJmZ1bmN0aW9uKGUsdCl7ZS4kb3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdCllW25dPSJmdW5jdGlvbiIhPXR5cGVvZiB0W25dP1Q6ayh0W25dLGUpfShlLHQubWV0aG9kcyksdC5kYXRhP2Z1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMuZGF0YTt1KHQ9ZS5fZGF0YT0iZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbihlLHQpe29lKCk7dHJ5e3JldHVybiBlLmNhbGwodCx0KX1jYXRjaChlKXtyZXR1cm4gamUoZSx0LCJkYXRhKCkiKSx7fX1maW5hbGx5e2FlKCl9fSh0LGUpOnR8fHt9KXx8KHQ9e30pO3ZhciBuPU9iamVjdC5rZXlzKHQpLHI9ZS4kb3B0aW9ucy5wcm9wcyxpPShlLiRvcHRpb25zLm1ldGhvZHMsbi5sZW5ndGgpO2Zvcig7aS0tOyl7dmFyIG89bltpXTtyJiZkKHIsbyl8fCh2b2lkIDAsMzYhPT0oYT0obysiIikuY2hhckNvZGVBdCgwKSkmJjk1IT09YSYmUXQoZSwiX2RhdGEiLG8pKX12YXIgYTt5ZSh0LCEwKX0oZSk6eWUoZS5fZGF0YT17fSwhMCksdC5jb21wdXRlZCYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLl9jb21wdXRlZFdhdGNoZXJzPU9iamVjdC5jcmVhdGUobnVsbCkscj1LKCk7Zm9yKHZhciBpIGluIHQpe3ZhciBvPXRbaV0sYT0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vOm8uZ2V0O3J8fChuW2ldPW5ldyBLdChlLGF8fFQsVCx0bikpLGkgaW4gZXx8bm4oZSxpLG8pfX0oZSx0LmNvbXB1dGVkKSx0LndhdGNoJiZ0LndhdGNoIT09SiYmZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTtpZihBcnJheS5pc0FycmF5KHIpKWZvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKWFuKGUsbixyW2ldKTtlbHNlIGFuKGUsbixyKX19KGUsdC53YXRjaCl9dmFyIHRuPXtsYXp5OiEwfTtmdW5jdGlvbiBubihlLHQsbil7dmFyIHI9IUsoKTsiZnVuY3Rpb24iPT10eXBlb2Ygbj8oWnQuZ2V0PXI/cm4odCk6b24obiksWnQuc2V0PVQpOihadC5nZXQ9bi5nZXQ/ciYmITEhPT1uLmNhY2hlP3JuKHQpOm9uKG4uZ2V0KTpULFp0LnNldD1uLnNldHx8VCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxadCl9ZnVuY3Rpb24gcm4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY29tcHV0ZWRXYXRjaGVycyYmdGhpcy5fY29tcHV0ZWRXYXRjaGVyc1t0XTtpZihlKXJldHVybiBlLmRpcnR5JiZlLmV2YWx1YXRlKCksaWUuU2hhcmVkT2JqZWN0LnRhcmdldCYmZS5kZXBlbmQoKSxlLnZhbHVlfX1mdW5jdGlvbiBvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHRoaXMsdGhpcyl9fWZ1bmN0aW9uIGFuKGUsdCxuLHIpe3JldHVybiB1KG4pJiYobj0ocj1uKS5oYW5kbGVyKSwic3RyaW5nIj09dHlwZW9mIG4mJihuPWVbbl0pLGUuJHdhdGNoKHQsbixyKX12YXIgc24sY24sdW4sbG4sZG4sZm4scG4saG49MDtmdW5jdGlvbiB2bihlKXt2YXIgdD1lLm9wdGlvbnM7aWYoZS5zdXBlcil7dmFyIG49dm4oZS5zdXBlcik7aWYobiE9PWUuc3VwZXJPcHRpb25zKXtlLnN1cGVyT3B0aW9ucz1uO3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5vcHRpb25zLHI9ZS5zZWFsZWRPcHRpb25zO2Zvcih2YXIgaSBpbiBuKW5baV0hPT1yW2ldJiYodHx8KHQ9e30pLHRbaV09bltpXSk7cmV0dXJuIHR9KGUpO3ImJngoZS5leHRlbmRPcHRpb25zLHIpLCh0PWUub3B0aW9ucz1FZShuLGUuZXh0ZW5kT3B0aW9ucykpLm5hbWUmJih0LmNvbXBvbmVudHNbdC5uYW1lXT1lKX19cmV0dXJuIHR9ZnVuY3Rpb24gZ24oZSl7dGhpcy5faW5pdChlKX1mdW5jdGlvbiBtbihlKXtlLmNpZD0wO3ZhciBhPTE7ZS5leHRlbmQ9ZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10aGlzLG49dC5jaWQscj1lLl9DdG9yfHwoZS5fQ3Rvcj17fSk7aWYocltuXSlyZXR1cm4gcltuXTt2YXIgaT1lLm5hbWV8fHQub3B0aW9ucy5uYW1lLG89ZnVuY3Rpb24oZSl7dGhpcy5faW5pdChlKX07cmV0dXJuKChvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9bykuY2lkPWErKyxvLm9wdGlvbnM9RWUodC5vcHRpb25zLGUpLG8uc3VwZXI9dCxvLm9wdGlvbnMucHJvcHMmJmZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdClRdChlLnByb3RvdHlwZSwiX3Byb3BzIixuKX0obyksby5vcHRpb25zLmNvbXB1dGVkJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMuY29tcHV0ZWQ7Zm9yKHZhciBuIGluIHQpbm4oZS5wcm90b3R5cGUsbix0W25dKX0obyksby5leHRlbmQ9dC5leHRlbmQsby5taXhpbj10Lm1peGluLG8udXNlPXQudXNlLEIuZm9yRWFjaChmdW5jdGlvbihlKXtvW2VdPXRbZV19KSxpJiYoby5vcHRpb25zLmNvbXBvbmVudHNbaV09byksby5zdXBlck9wdGlvbnM9dC5vcHRpb25zLG8uZXh0ZW5kT3B0aW9ucz1lLG8uc2VhbGVkT3B0aW9ucz14KHt9LG8ub3B0aW9ucykscltuXT1vfX1mdW5jdGlvbiB5bihlKXtyZXR1cm4gZSYmKGUuQ3Rvci5vcHRpb25zLm5hbWV8fGUudGFnKX1mdW5jdGlvbiBfbihlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPy0xPGUuaW5kZXhPZih0KToic3RyaW5nIj09dHlwZW9mIGU/LTE8ZS5zcGxpdCgiLCIpLmluZGV4T2YodCk6KG49ZSwiW29iamVjdCBSZWdFeHBdIj09PXIuY2FsbChuKSYmZS50ZXN0KHQpKTt2YXIgbn1mdW5jdGlvbiBibihlLHQpe3ZhciBuPWUuY2FjaGUscj1lLmtleXMsaT1lLl92bm9kZTtmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtpZihhKXt2YXIgcz15bihhLmNvbXBvbmVudE9wdGlvbnMpO3MmJiF0KHMpJiZ3bihuLG8scixpKX19fWZ1bmN0aW9uIHduKGUsdCxuLHIpe3ZhciBpPWVbdF07IWl8fHImJmkudGFnPT09ci50YWd8fGkuY29tcG9uZW50SW5zdGFuY2UuJGRlc3Ryb3koKSxlW3RdPW51bGwsYihuLHQpfWduLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvPXRoaXM7by5fdWlkPWhuKyssby5faXNWdWU9ITAsZSYmZS5faXNDb21wb25lbnQ/ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50O3ZhciBpPShuLl9wYXJlbnRWbm9kZT1yKS5jb21wb25lbnRPcHRpb25zO24ucHJvcHNEYXRhPWkucHJvcHNEYXRhLG4uX3BhcmVudExpc3RlbmVycz1pLmxpc3RlbmVycyxuLl9yZW5kZXJDaGlsZHJlbj1pLmNoaWxkcmVuLG4uX2NvbXBvbmVudFRhZz1pLnRhZyx0LnJlbmRlciYmKG4ucmVuZGVyPXQucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXQuc3RhdGljUmVuZGVyRm5zKX0obyxlKTpvLiRvcHRpb25zPUVlKHZuKG8uY29uc3RydWN0b3IpLGV8fHt9LG8pLGZ1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMsbj10LnBhcmVudDtpZihuJiYhdC5hYnN0cmFjdCl7Zm9yKDtuLiRvcHRpb25zLmFic3RyYWN0JiZuLiRwYXJlbnQ7KW49bi4kcGFyZW50O24uJGNoaWxkcmVuLnB1c2goZSl9ZS4kcGFyZW50PW4sZS4kcm9vdD1uP24uJHJvb3Q6ZSxlLiRjaGlsZHJlbj1bXSxlLiRyZWZzPXt9LGUuX3dhdGNoZXI9bnVsbCxlLl9pbmFjdGl2ZT1udWxsLGUuX2RpcmVjdEluYWN0aXZlPSExLGUuX2lzTW91bnRlZD0hMSxlLl9pc0Rlc3Ryb3llZD0hMSxlLl9pc0JlaW5nRGVzdHJveWVkPSExfSgoby5fcmVuZGVyUHJveHk9bykuX3NlbGY9byksZnVuY3Rpb24oZSl7ZS5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksZS5faGFzSG9va0V2ZW50PSExO3ZhciB0PWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczt0JiZCdChlLHQpfShvKSxmdW5jdGlvbihpKXtpLl92bm9kZT1udWxsLGkuX3N0YXRpY1RyZWVzPW51bGw7dmFyIGU9aS4kb3B0aW9ucyx0PWkuJHZub2RlPWUuX3BhcmVudFZub2RlLG49dCYmdC5jb250ZXh0O2kuJHNsb3RzPWV0KGUuX3JlbmRlckNoaWxkcmVuLG4pLGkuJHNjb3BlZFNsb3RzPW0saS5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gSXQoaSxlLHQsbixyLCExKX0saS4kY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gSXQoaSxlLHQsbixyLCEwKX07dmFyIHI9dCYmdC5kYXRhO19lKGksIiRhdHRycyIsciYmci5hdHRyc3x8bSxudWxsLCEwKSxfZShpLCIkbGlzdGVuZXJzIixlLl9wYXJlbnRMaXN0ZW5lcnN8fG0sbnVsbCwhMCl9KG8pLEZ0KG8sImJlZm9yZUNyZWF0ZSIpLChuPVFlKCh0PW8pLiRvcHRpb25zLmluamVjdCx0KSkmJihnZSghMSksT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXtfZSh0LGUsbltlXSl9KSxnZSghMCkpLGVuKG8pLChpPShyPW8pLiRvcHRpb25zLnByb3ZpZGUpJiYoci5fcHJvdmlkZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5jYWxsKHIpOmkpLEZ0KG8sImNyZWF0ZWQiKSxvLiRvcHRpb25zLmVsJiZvLiRtb3VudChvLiRvcHRpb25zLmVsKX0sc249Z24sY249e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfX0sdW49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wc319LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzbi5wcm90b3R5cGUsIiRkYXRhIixjbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KHNuLnByb3RvdHlwZSwiJHByb3BzIix1biksc24ucHJvdG90eXBlLiRzZXQ9YmUsc24ucHJvdG90eXBlLiRkZWxldGU9d2Usc24ucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZih1KHQpKXJldHVybiBhbihyLGUsdCxuKTsobj1ufHx7fSkudXNlcj0hMDt2YXIgaT1uZXcgS3QocixlLHQsbik7aWYobi5pbW1lZGlhdGUpdHJ5e3QuY2FsbChyLGkudmFsdWUpfWNhdGNoKGUpe2plKGUsciwnY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyICInK2kuZXhwcmVzc2lvbisnIicpfXJldHVybiBmdW5jdGlvbigpe2kudGVhcmRvd24oKX19LGRuPS9eaG9vazovLChsbj1nbikucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRoaXMuJG9uKGVbbl0sdCk7ZWxzZSh0aGlzLl9ldmVudHNbZV18fCh0aGlzLl9ldmVudHNbZV09W10pKS5wdXNoKHQpLGRuLnRlc3QoZSkmJih0aGlzLl9oYXNIb29rRXZlbnQ9ITApO3JldHVybiB0aGlzfSxsbi5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sbG4ucHJvdG90eXBlLiRvZmY9ZnVuY3Rpb24oZSx0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcztpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdGhpcy4kb2ZmKGVbbl0sdCk7cmV0dXJuIHRoaXN9dmFyIGksbz10aGlzLl9ldmVudHNbZV07aWYoIW8pcmV0dXJuIHRoaXM7aWYoIXQpcmV0dXJuIHRoaXMuX2V2ZW50c1tlXT1udWxsLHRoaXM7Zm9yKHZhciBhPW8ubGVuZ3RoO2EtLTspaWYoKGk9b1thXSk9PT10fHxpLmZuPT09dCl7by5zcGxpY2UoYSwxKTticmVha31yZXR1cm4gdGhpc30sbG4ucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZih0KXt0PTE8dC5sZW5ndGg/Uyh0KTp0O2Zvcih2YXIgbj1TKGFyZ3VtZW50cywxKSxyPSdldmVudCBoYW5kbGVyIGZvciAiJytlKyciJyxpPTAsbz10Lmxlbmd0aDtpPG87aSsrKUxlKHRbaV0sdGhpcyxuLHRoaXMscil9cmV0dXJuIHRoaXN9LChmbj1nbikucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMsaT1yLiRlbCxvPXIuX3Zub2RlLGE9KG49TnQsTnQ9cixmdW5jdGlvbigpe050PW59KTtyLl92bm9kZT1lLHIuJGVsPW8/ci5fX3BhdGNoX18obyxlKTpyLl9fcGF0Y2hfXyhyLiRlbCxlLHQsITEpLGEoKSxpJiYoaS5fX3Z1ZV9fPW51bGwpLHIuJGVsJiYoci4kZWwuX192dWVfXz1yKSxyLiR2bm9kZSYmci4kcGFyZW50JiZyLiR2bm9kZT09PXIuJHBhcmVudC5fdm5vZGUmJihyLiRwYXJlbnQuJGVsPXIuJGVsKX0sZm4ucHJvdG90eXBlLiRmb3JjZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3dhdGNoZXImJnRoaXMuX3dhdGNoZXIudXBkYXRlKCl9LGZuLnByb3RvdHlwZS4kZGVzdHJveT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIWUuX2lzQmVpbmdEZXN0cm95ZWQpe0Z0KGUsImJlZm9yZURlc3Ryb3kiKSxlLl9pc0JlaW5nRGVzdHJveWVkPSEwO3ZhciB0PWUuJHBhcmVudDshdHx8dC5faXNCZWluZ0Rlc3Ryb3llZHx8ZS4kb3B0aW9ucy5hYnN0cmFjdHx8Yih0LiRjaGlsZHJlbixlKSxlLl93YXRjaGVyJiZlLl93YXRjaGVyLnRlYXJkb3duKCk7Zm9yKHZhciBuPWUuX3dhdGNoZXJzLmxlbmd0aDtuLS07KWUuX3dhdGNoZXJzW25dLnRlYXJkb3duKCk7ZS5fZGF0YS5fX29iX18mJmUuX2RhdGEuX19vYl9fLnZtQ291bnQtLSxlLl9pc0Rlc3Ryb3llZD0hMCxlLl9fcGF0Y2hfXyhlLl92bm9kZSxudWxsKSxGdChlLCJkZXN0cm95ZWQiKSxlLiRvZmYoKSxlLiRlbCYmKGUuJGVsLl9fdnVlX189bnVsbCksZS4kdm5vZGUmJihlLiR2bm9kZS5wYXJlbnQ9bnVsbCl9fSxfdCgocG49Z24pLnByb3RvdHlwZSkscG4ucHJvdG90eXBlLiRuZXh0VGljaz1mdW5jdGlvbihlKXtyZXR1cm4gemUoZSx0aGlzKX0scG4ucHJvdG90eXBlLl9yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdCxuPXRoaXMsZT1uLiRvcHRpb25zLHI9ZS5yZW5kZXIsaT1lLl9wYXJlbnRWbm9kZTtpJiYobi4kc2NvcGVkU2xvdHM9bnQoaS5kYXRhLnNjb3BlZFNsb3RzLG4uJHNsb3RzLG4uJHNjb3BlZFNsb3RzKSksbi4kdm5vZGU9aTt0cnl7JHQ9bix0PXIuY2FsbChuLl9yZW5kZXJQcm94eSxuLiRjcmVhdGVFbGVtZW50KX1jYXRjaChlKXtqZShlLG4sInJlbmRlciIpLHQ9bi5fdm5vZGV9ZmluYWxseXskdD1udWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYxPT09dC5sZW5ndGgmJih0PXRbMF0pLHQgaW5zdGFuY2VvZiBzZXx8KHQ9dWUoKSksdC5wYXJlbnQ9aSx0fTt2YXIga24sU24seG4sQ249W1N0cmluZyxSZWdFeHAsQXJyYXldLFRuPXtLZWVwQWxpdmU6e25hbWU6ImtlZXAtYWxpdmUiLGFic3RyYWN0OiEwLHByb3BzOntpbmNsdWRlOkNuLGV4Y2x1ZGU6Q24sbWF4OltTdHJpbmcsTnVtYmVyXX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuY2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmtleXM9W119LGRlc3Ryb3llZDpmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLmNhY2hlKXduKHRoaXMuY2FjaGUsZSx0aGlzLmtleXMpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiR3YXRjaCgiaW5jbHVkZSIsZnVuY3Rpb24odCl7Ym4oZSxmdW5jdGlvbihlKXtyZXR1cm4gX24odCxlKX0pfSksdGhpcy4kd2F0Y2goImV4Y2x1ZGUiLGZ1bmN0aW9uKHQpe2JuKGUsZnVuY3Rpb24oZSl7cmV0dXJuIV9uKHQsZSl9KX0pfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRzbG90cy5kZWZhdWx0LHQ9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XTtpZihJKG4pJiYoSShuLmNvbXBvbmVudE9wdGlvbnMpfHwocj1uKS5pc0NvbW1lbnQmJnIuYXN5bmNGYWN0b3J5KSlyZXR1cm4gbn12YXIgcn0oZSksbj10JiZ0LmNvbXBvbmVudE9wdGlvbnM7aWYobil7dmFyIHI9eW4obiksaT10aGlzLmluY2x1ZGUsbz10aGlzLmV4Y2x1ZGU7aWYoaSYmKCFyfHwhX24oaSxyKSl8fG8mJnImJl9uKG8scikpcmV0dXJuIHQ7dmFyIGE9dGhpcy5jYWNoZSxzPXRoaXMua2V5cyxjPW51bGw9PXQua2V5P24uQ3Rvci5jaWQrKG4udGFnPyI6OiIrbi50YWc6IiIpOnQua2V5O2FbY10/KHQuY29tcG9uZW50SW5zdGFuY2U9YVtjXS5jb21wb25lbnRJbnN0YW5jZSxiKHMsYykscy5wdXNoKGMpKTooYVtjXT10LHMucHVzaChjKSx0aGlzLm1heCYmcy5sZW5ndGg+cGFyc2VJbnQodGhpcy5tYXgpJiZ3bihhLHNbMF0scyx0aGlzLl92bm9kZSkpLHQuZGF0YS5rZWVwQWxpdmU9ITB9cmV0dXJuIHR8fGUmJmVbMF19fX07a249Z24seG49e2dldDpmdW5jdGlvbigpe3JldHVybiBEfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGtuLCJjb25maWciLHhuKSxrbi51dGlsPXt3YXJuOm5lLGV4dGVuZDp4LG1lcmdlT3B0aW9uczpFZSxkZWZpbmVSZWFjdGl2ZTpfZX0sa24uc2V0PWJlLGtuLmRlbGV0ZT13ZSxrbi5uZXh0VGljaz16ZSxrbi5vYnNlcnZhYmxlPWZ1bmN0aW9uKGUpe3JldHVybiB5ZShlKSxlfSxrbi5vcHRpb25zPU9iamVjdC5jcmVhdGUobnVsbCksQi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2tuLm9wdGlvbnNbZSsicyJdPU9iamVjdC5jcmVhdGUobnVsbCl9KSx4KChrbi5vcHRpb25zLl9iYXNlPWtuKS5vcHRpb25zLmNvbXBvbmVudHMsVG4pLGtuLnVzZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pbnN0YWxsZWRQbHVnaW5zfHwodGhpcy5faW5zdGFsbGVkUGx1Z2lucz1bXSk7aWYoLTE8dC5pbmRleE9mKGUpKXJldHVybiB0aGlzO3ZhciBuPVMoYXJndW1lbnRzLDEpO3JldHVybiBuLnVuc2hpZnQodGhpcyksImZ1bmN0aW9uIj09dHlwZW9mIGUuaW5zdGFsbD9lLmluc3RhbGwuYXBwbHkoZSxuKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5hcHBseShudWxsLG4pLHQucHVzaChlKSx0aGlzfSxrbi5taXhpbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zPUVlKHRoaXMub3B0aW9ucyxlKSx0aGlzfSxtbihrbiksU249a24sQi5mb3JFYWNoKGZ1bmN0aW9uKG4pe1NuW25dPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/KCJjb21wb25lbnQiPT09biYmdSh0KSYmKHQubmFtZT10Lm5hbWV8fGUsdD10aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKHQpKSwiZGlyZWN0aXZlIj09PW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD17YmluZDp0LHVwZGF0ZTp0fSksdGhpcy5vcHRpb25zW24rInMiXVtlXT10KTp0aGlzLm9wdGlvbnNbbisicyJdW2VdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbi5wcm90b3R5cGUsIiRpc1NlcnZlciIse2dldDpLfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGduLnByb3RvdHlwZSwiJHNzckNvbnRleHQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdm5vZGUmJnRoaXMuJHZub2RlLnNzckNvbnRleHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGduLCJGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCIse3ZhbHVlOmJ0fSksZ24udmVyc2lvbj0iMi42LjExIjt2YXIgT249MTtmdW5jdGlvbiBFbigpe3JldHVybihPbisrKS50b1N0cmluZygpfXZhciBJbj1mdW5jdGlvbigpe3RoaXMubm9kZUlkPUVuKCksdGhpcy5yZWY9dGhpcy5ub2RlSWQsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXSx0aGlzLnBhcmVudE5vZGU9bnVsbCx0aGlzLm5leHRTaWJsaW5nPW51bGwsdGhpcy5wcmV2aW91c1NpYmxpbmc9bnVsbH07SW4ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl8kdmQmJnRoaXMuXyR2ZC5yZW1vdmVFbGVtZW50KHRoaXMpLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLmRlc3Ryb3koKX0pfTt2YXIgQW49ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyksdGhpcy5ub2RlVHlwZT04LHRoaXMubm9kZUlkPUVuKCksdGhpcy5yZWY9dGhpcy5ub2RlSWQsdGhpcy50eXBlPSJjb21tZW50Iix0aGlzLnZhbHVlPWUsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLCgoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWUpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJceDNjIS0tICIrdGhpcy52YWx1ZSsiIC0tXHgzZSJ9LGV9KEluKTtmdW5jdGlvbiAkbihlLHQsbil7dmFyIHI9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoISgwPHIucHVyZUNoaWxkcmVuLmxlbmd0aCYmMT09PXQubm9kZVR5cGV8fHQucGFyZW50Tm9kZSkpe3ZhciBpPXIuY2hpbGRyZW4sbz1pLmluZGV4T2Yobik7bzwwP2kucHVzaCh0KTppLnNwbGljZShvLDAsdCksMT09PXQubm9kZVR5cGU/KCJib2R5Ij09PXQucm9sZT8odC5kb2NJZD1lLmlkLHQub3duZXJEb2N1bWVudD1lLHQucGFyZW50Tm9kZT1yKToodC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZT10fSksUG4oZSx0KSx0LmRvY0lkPWUuaWQsdC5vd25lckRvY3VtZW50PWUpLE1uKHQsciksci5wdXJlQ2hpbGRyZW4ucHVzaCh0KSk6dC5wYXJlbnROb2RlPXJ9fWZ1bmN0aW9uIFBuKGUsdCl7dC5yb2xlPSJib2R5Iix0LmRlcHRoPTEsdC5yZWY9Il9yb290IixlLmJvZHk9dH1mdW5jdGlvbiBNbih0LGUpeyh0LnBhcmVudE5vZGU9ZSkuZG9jSWQmJih0LmRvY0lkPWUuZG9jSWQsdC5vd25lckRvY3VtZW50PWUub3duZXJEb2N1bWVudCx0LmRlcHRoPWUuZGVwdGgrMSksdC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe01uKGUsdCl9KX1mdW5jdGlvbiBqbihlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIExuKGUpe2Zvcig7ZTspe2lmKDE9PT1lLm5vZGVUeXBlKXJldHVybiBlO2U9ZS5wcmV2aW91c1NpYmxpbmd9fWZ1bmN0aW9uIEJuKGUsdCxuLHIpe248MCYmKG49MCk7dmFyIGk9dFtuLTFdLG89dFtuXTtyZXR1cm4gdC5zcGxpY2UobiwwLGUpLHImJihpJiYoaS5uZXh0U2libGluZz1lKSxlLnByZXZpb3VzU2libGluZz1pLChlLm5leHRTaWJsaW5nPW8pJiYoby5wcmV2aW91c1NpYmxpbmc9ZSkpLG59ZnVuY3Rpb24gTm4oZSx0LG4scil7dmFyIGk9dC5pbmRleE9mKGUpO2lmKGk8MClyZXR1cm4tMTtpZihyKXt2YXIgbz10W2ktMV0sYT10W2krMV07byYmKG8ubmV4dFNpYmxpbmc9YSksYSYmKGEucHJldmlvdXNTaWJsaW5nPW8pfXQuc3BsaWNlKGksMSk7dmFyIHM9bjtpPD1uJiYocz1uLTEpO3ZhciBjPXRbcy0xXSx1PXRbc107cmV0dXJuIHQuc3BsaWNlKHMsMCxlKSxyJiYoYyYmKGMubmV4dFNpYmxpbmc9ZSksZS5wcmV2aW91c1NpYmxpbmc9YywoZS5uZXh0U2libGluZz11KSYmKHUucHJldmlvdXNTaWJsaW5nPWUpKSxpPT09cz8tMTpufWZ1bmN0aW9uIERuKGUsdCxuKXt2YXIgcj10LmluZGV4T2YoZSk7aWYoIShyPDApKXtpZihuKXt2YXIgaT10W3ItMV0sbz10W3IrMV07aSYmKGkubmV4dFNpYmxpbmc9byksbyYmKG8ucHJldmlvdXNTaWJsaW5nPWkpfXQuc3BsaWNlKHIsMSl9fXZhciBSbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPSJ2aWV3IiksdC5jYWxsKHRoaXMpLHRoaXMubm9kZVR5cGU9MSx0aGlzLm5vZGVJZD1FbigpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMudHlwZT1lLHRoaXMuYXR0cj17fSx0aGlzLmV2ZW50cz17fSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksKChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZSkucHJvdG90eXBlLnNldEF0dHJpYnV0ZT1mdW5jdGlvbihlLHQpeyJjaWQiPT09ZT90aGlzLmNpZD10OiJuaWQiPT09ZSYmKHRoaXMubmlkPXQpfSxlLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5ldmVudHNbZV07biYmbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UodCl9KX0sZS5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe2lmKCIiPT09dGhpcy5jaWR8fCIiPT09dGhpcy5uaWQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoImNpZD0iK3RoaXMuY2lkKyIsbmlkPSIrdGhpcy5uaWQrIiBhZGRFdmVudExpc3RlbmVyKCIrZSsiKSBub3QgZm91bmQiKTsodGhpcy5ldmVudHNbZV18fCh0aGlzLmV2ZW50c1tlXT1bXSkpLnB1c2godCksdGhpcy5fJHZkLmFkZEVsZW1lbnQodGhpcyl9LGUucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCIiPT09dGhpcy5jaWR8fCIiPT09dGhpcy5uaWQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoImNpZD0iK3RoaXMuY2lkKyIsbmlkPSIrdGhpcy5uaWQrIiByZW1vdmVFdmVudExpc3RlbmVyKCIrZSsiKSBub3QgZm91bmQiKTt2YXIgcj0hMTtpZih0aGlzLmV2ZW50c1tlXSl7dmFyIGk9dGhpcy5ldmVudHNbZV0uaW5kZXhPZih0KTstMSE9PWkmJih0aGlzLmV2ZW50c1tlXS5zcGxpY2UoaSwxKSxyPSEwKX1yfHxjb25zb2xlLmVycm9yKCJjaWQ9Iit0aGlzLmNpZCsiLG5pZD0iK3RoaXMubmlkKyIgcmVtb3ZlRXZlbnRMaXN0ZW5lcigiK2UrIikgaGFuZGxlciBub3QgZm91bmQiKSxPYmplY3Qua2V5cyh0aGlzLmV2ZW50cykuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1uLmV2ZW50c1tlXS5sZW5ndGh9KSYmdGhpcy5fJHZkLnJlbW92ZUVsZW1lbnQodGhpcyl9LGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8KGUucGFyZW50Tm9kZT8oTm4oZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4ubGVuZ3RoLCEwKSwxPT09ZS5ub2RlVHlwZSYmTm4oZSx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpKTooTW4oZSx0aGlzKSxCbihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLDE9PT1lLm5vZGVUeXBlJiZCbihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCkpKX0sZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGUsdCl7aWYoIShlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZSE9PXRoaXN8fGU9PT10fHxlLm5leHRTaWJsaW5nJiZlLm5leHRTaWJsaW5nPT09dCkpaWYoZS5wYXJlbnROb2RlKXtpZihObihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpLCEwKSwxPT09ZS5ub2RlVHlwZSl7dmFyIG49am4odCk7Tm4oZSx0aGlzLnB1cmVDaGlsZHJlbixuP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobik6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKX19ZWxzZSBpZihNbihlLHRoaXMpLEJuKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCksITApLDE9PT1lLm5vZGVUeXBlKXt2YXIgcj1qbih0KTtCbihlLHRoaXMucHVyZUNoaWxkcmVuLHI/dGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihyKTp0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpfX0sZS5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24oZSx0KXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZSE9PXRoaXN8fGU9PT10fHxlLnByZXZpb3VzU2libGluZyYmZS5wcmV2aW91c1NpYmxpbmc9PT10fHwoZS5wYXJlbnROb2RlPyhObihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpKzEsITApLDE9PT1lLm5vZGVUeXBlJiZObihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoTG4odCkpKzEpKTooTW4oZSx0aGlzKSxCbihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpKzEsITApLDE9PT1lLm5vZGVUeXBlJiZCbihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoTG4odCkpKzEpKSl9LGUucHJvdG90eXBlLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGUsdCl7ZS5wYXJlbnROb2RlJiYoRG4oZSx0aGlzLmNoaWxkcmVuLCEwKSwxPT09ZS5ub2RlVHlwZSYmRG4oZSx0aGlzLnB1cmVDaGlsZHJlbikpLHR8fGUuZGVzdHJveSgpfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLmRlc3Ryb3koKX0pLHRoaXMuY2hpbGRyZW4ubGVuZ3RoPTAsdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoPTB9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIjwiK3RoaXMudHlwZSsiIGF0dHI9IitKU09OLnN0cmluZ2lmeSh0aGlzLmF0dHIpKyIgc3R5bGU9IitKU09OLnN0cmluZ2lmeSh0aGlzLnRvU3R5bGUoKSkrIj4iK3RoaXMucHVyZUNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSkuam9pbigiIikrIjwvIit0aGlzLnR5cGUrIj4ifSxlfShJbiksRm49ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWU/ZS50b1N0cmluZygpOiIiLHRoaXMuVVJMPXQsdGhpcy5jcmVhdGVEb2N1bWVudEVsZW1lbnQoKX07Rm4ucHJvdG90eXBlLmNyZWF0ZURvY3VtZW50RWxlbWVudD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7aWYoIXRoaXMuZG9jdW1lbnRFbGVtZW50KXt2YXIgZT1uZXcgUm4oImRvY3VtZW50Iik7ZS5kb2NJZD10aGlzLmlkLGUub3duZXJEb2N1bWVudD10aGlzLGUucm9sZT0iZG9jdW1lbnRFbGVtZW50IixlLmRlcHRoPTAsZS5yZWY9Il9kb2N1bWVudEVsZW1lbnQiLHRoaXMuZG9jdW1lbnRFbGVtZW50PWUsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImFwcGVuZENoaWxkIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSl7JG4obixlKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiaW5zZXJ0QmVmb3JlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSx0KXskbihuLGUsdCl9fSl9cmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50fSxGbi5wcm90b3R5cGUuY3JlYXRlQm9keT1mdW5jdGlvbihlKXt0aGlzLmJvZHl8fFBuKHRoaXMsbmV3IFJuKGUpKTtyZXR1cm4gdGhpcy5ib2R5fSxGbi5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFJuKGUpfSxGbi5wcm90b3R5cGUuY3JlYXRlQ29tbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IEFuKGUpfSxGbi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe307dmFyIFVuPXMoInN0eWxlLGNsYXNzIiksem49KHMoImlucHV0LHRleHRhcmVhLG9wdGlvbixzZWxlY3QscHJvZ3Jlc3MiKSxzKCJjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2siKSxzKCJldmVudHMsY2FyZXQsdHlwaW5nLHBsYWludGV4dC1vbmx5IikscygiYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSxkZWZhdWx0LGRlZmF1bHRjaGVja2VkLGRlZmF1bHRtdXRlZCxkZWZhdWx0c2VsZWN0ZWQsZGVmZXIsZGlzYWJsZWQsZW5hYmxlZCxmb3Jtbm92YWxpZGF0ZSxoaWRkZW4saW5kZXRlcm1pbmF0ZSxpbmVydCxpc21hcCxpdGVtc2NvcGUsbG9vcCxtdWx0aXBsZSxtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LHJlcXVpcmVkLHJldmVyc2VkLHNjb3BlZCxzZWFtbGVzcyxzZWxlY3RlZCxzb3J0YWJsZSx0cmFuc2xhdGUsdHJ1ZXNwZWVkLHR5cGVtdXN0bWF0Y2gsdmlzaWJsZSIpLHMoImh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhncm91cCxuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnRjLHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsbWVudWl0ZW0sc3VtbWFyeSxjb250ZW50LGVsZW1lbnQsc2hhZG93LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290IikpO3ZhciBWbj1PYmplY3QuZnJlZXplKHtjcmVhdGVFbGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUm4oZSl9LGNyZWF0ZUVsZW1lbnROUzpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgUm4oZSsiOiIrdCl9LGNyZWF0ZVRleHROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBSbigidGV4dCIpfSxjcmVhdGVDb21tZW50OmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgQW4oZSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbil7ZS5pbnNlcnRCZWZvcmUodCxuKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtlLnJlbW92ZUNoaWxkKHQpfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihlLHQpe2UuYXBwZW5kQ2hpbGQodCl9LHBhcmVudE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZX0sbmV4dFNpYmxpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9LHRhZ05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZX0sc2V0VGV4dENvbnRlbnQ6ZnVuY3Rpb24oKXt9LHNldFN0eWxlU2NvcGU6ZnVuY3Rpb24oKXt9fSkscW49e2NyZWF0ZTpmdW5jdGlvbihlLHQpe1duKHQpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXtlLmRhdGEucmVmIT09dC5kYXRhLnJlZiYmKFduKGUsITApLFduKHQpKX0sZGVzdHJveTpmdW5jdGlvbihlKXtXbihlLCEwKX19O2Z1bmN0aW9uIFduKGUsdCl7dmFyIG49ZS5kYXRhLnJlZjtpZihJKG4pKXt2YXIgcj1lLmNvbnRleHQsaT1lLmNvbXBvbmVudEluc3RhbmNlfHxlLmVsbSxvPXIuJHJlZnM7dD9BcnJheS5pc0FycmF5KG9bbl0pP2Iob1tuXSxpKTpvW25dPT09aSYmKG9bbl09dm9pZCAwKTplLmRhdGEucmVmSW5Gb3I/QXJyYXkuaXNBcnJheShvW25dKT9vW25dLmluZGV4T2YoaSk8MCYmb1tuXS5wdXNoKGkpOm9bbl09W2ldOm9bbl09aX19cygiaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LGNvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QiKSxzKCJzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsZm9yZWlnbk9iamVjdCxnLGdseXBoLGltYWdlLGxpbmUsbWFya2VyLG1hc2ssbWlzc2luZy1nbHlwaCxwYXRoLHBhdHRlcm4scG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldyIsITApO3ZhciBIbj1zKCJ0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCIpLEduPW5ldyBzZSgiIix7fSxbXSksWG49WyJjcmVhdGUiLCJhY3RpdmF0ZSIsInVwZGF0ZSIsInJlbW92ZSIsImRlc3Ryb3kiXTtmdW5jdGlvbiBKbihlLHQpe3JldHVybiBlLmtleT09PXQua2V5JiYoZS50YWc9PT10LnRhZyYmZS5pc0NvbW1lbnQ9PT10LmlzQ29tbWVudCYmSShlLmRhdGEpPT09SSh0LmRhdGEpJiZmdW5jdGlvbihlLHQpe2lmKCJpbnB1dCIhPT1lLnRhZylyZXR1cm4hMDt2YXIgbixyPUkobj1lLmRhdGEpJiZJKG49bi5hdHRycykmJm4udHlwZSxpPUkobj10LmRhdGEpJiZJKG49bi5hdHRycykmJm4udHlwZTtyZXR1cm4gcj09PWl8fEhuKHIpJiZIbihpKX0oZSx0KXx8QShlLmlzQXN5bmNQbGFjZWhvbGRlcikmJmUuYXN5bmNGYWN0b3J5PT09dC5hc3luY0ZhY3RvcnkmJkUodC5hc3luY0ZhY3RvcnkuZXJyb3IpKX1mdW5jdGlvbiBZbihlLHQsbil7dmFyIHIsaSxvPXt9O2ZvcihyPXQ7cjw9bjsrK3IpSShpPWVbcl0ua2V5KSYmKG9baV09cik7cmV0dXJuIG99dmFyIEtuPXtjcmVhdGU6Wm4sdXBkYXRlOlpuLGRlc3Ryb3k6ZnVuY3Rpb24oZSl7Wm4oZSxHbil9fTtmdW5jdGlvbiBabihlLHQpeyhlLmRhdGEuZGlyZWN0aXZlc3x8dC5kYXRhLmRpcmVjdGl2ZXMpJiZmdW5jdGlvbih0LG4pe3ZhciBlLHIsaSxvPXQ9PT1HbixhPW49PT1HbixzPWVyKHQuZGF0YS5kaXJlY3RpdmVzLHQuY29udGV4dCksYz1lcihuLmRhdGEuZGlyZWN0aXZlcyxuLmNvbnRleHQpLHU9W10sbD1bXTtmb3IoZSBpbiBjKXI9c1tlXSxpPWNbZV0scj8oaS5vbGRWYWx1ZT1yLnZhbHVlLGkub2xkQXJnPXIuYXJnLHRyKGksInVwZGF0ZSIsbix0KSxpLmRlZiYmaS5kZWYuY29tcG9uZW50VXBkYXRlZCYmbC5wdXNoKGkpKToodHIoaSwiYmluZCIsbix0KSxpLmRlZiYmaS5kZWYuaW5zZXJ0ZWQmJnUucHVzaChpKSk7aWYodS5sZW5ndGgpe3ZhciBkPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx1Lmxlbmd0aDtlKyspdHIodVtlXSwiaW5zZXJ0ZWQiLG4sdCl9O28/WGUobiwiaW5zZXJ0IixkKTpkKCl9bC5sZW5ndGgmJlhlKG4sInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPGwubGVuZ3RoO2UrKyl0cihsW2VdLCJjb21wb25lbnRVcGRhdGVkIixuLHQpfSk7aWYoIW8pZm9yKGUgaW4gcyljW2VdfHx0cihzW2VdLCJ1bmJpbmQiLHQsdCxhKX0oZSx0KX12YXIgUW49T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBlcihlLHQpe3ZhciBuLHIsaSxvPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoIWUpcmV0dXJuIG87Zm9yKG49MDtuPGUubGVuZ3RoO24rKykocj1lW25dKS5tb2RpZmllcnN8fChyLm1vZGlmaWVycz1RbiksKG9bKGk9cixpLnJhd05hbWV8fGkubmFtZSsiLiIrT2JqZWN0LmtleXMoaS5tb2RpZmllcnN8fHt9KS5qb2luKCIuIikpXT1yKS5kZWY9SWUodC4kb3B0aW9ucywiZGlyZWN0aXZlcyIsci5uYW1lKTtyZXR1cm4gb31mdW5jdGlvbiB0cih0LG4scixlLGkpe3ZhciBvPXQuZGVmJiZ0LmRlZltuXTtpZihvKXRyeXtvKHIuZWxtLHQscixlLGkpfWNhdGNoKGUpe2plKGUsci5jb250ZXh0LCJkaXJlY3RpdmUgIit0Lm5hbWUrIiAiK24rIiBob29rIil9fWZ1bmN0aW9uIG5yKGUsbil7aWYoIUUoZS5kYXRhLnd4c1Byb3BzKXx8IUUobi5kYXRhLnd4c1Byb3BzKSl7dmFyIHI9ZS4kd3hzV2F0Y2hlcyx0PU9iamVjdC5rZXlzKG4uZGF0YS53eHNQcm9wcyk7aWYocnx8dC5sZW5ndGgpe3J8fChyPXt9KTt2YXIgaT1uLmRhdGEud3hzUHJvcHM7bi4kd3hzV2F0Y2hlcz17fSxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWlbZV07bi4kd3hzV2F0Y2hlc1tlXT1yW2VdfHxuLmNvbnRleHQuJHdhdGNoKHQsZnVuY3Rpb24oKXt0aGlzLiRmb3JjZVVwZGF0ZSgpfSx7aW1tZWRpYXRlOiEwLGRlZXA6ITB9KX0pLE9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24oZSl7bi4kd3hzV2F0Y2hlc1tlXXx8KHJbZV0oKSxkZWxldGUgcltlXSl9KX19fWZ1bmN0aW9uIHJyKGUsdCl7dmFyIG49dC5kYXRhLmF0dHJzO2lmKCFFKG4pJiYhRShuLl9pKSl7dmFyIHIsaSxvPXQuZWxtO28uZGF0YXNldD1PYmplY3QuYXNzaWduKG8uZGF0YXNldHx8e30sKHI9bixpPU9iamVjdC5jcmVhdGUobnVsbCksT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbih0KXtpZigwPT09dC5pbmRleE9mKCJkYXRhLSIpKXt2YXIgbj1oKHQucmVwbGFjZSgiZGF0YS0iLCIiKSk7dHJ5e2lbbl09SlNPTi5wYXJzZShyW3RdKX1jYXRjaChlKXtpW25dPXJbdF19fX0pLGkpKX19dmFyIGlyLG9yPSJfX3IiLGFyPSJfX2MiO2Z1bmN0aW9uIHNyKHQsbixyKXt2YXIgaT1pcjtyZXR1cm4gZnVuY3Rpb24gZSgpe251bGwhPT1uLmFwcGx5KG51bGwsYXJndW1lbnRzKSYmdXIodCxlLHIsaSl9fWZ1bmN0aW9uIGNyKGUsdCl7aXIuYWRkRXZlbnRMaXN0ZW5lcihlLHQpfWZ1bmN0aW9uIHVyKGUsdCxuLHIpe3QmJihyfHxpcikucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQuX3dyYXBwZXJ8fHQpfWZ1bmN0aW9uIGxyKGUsdCl7aWYoIUUoZS5kYXRhLm9uKXx8IUUodC5kYXRhLm9uKSl7dmFyIG49dC5kYXRhLm9ufHx7fSxyPWUuZGF0YS5vbnx8e307KGlyPXQuZWxtKS5fJHZkPXQuY29udGV4dC5fJHZkO2Zvcih2YXIgaT10LmNvbnRleHQsbz0odC5kYXRhLmF0dHJzfHx7fSkuX2ksYT10LnBhcmVudDthJiZhLmNvbXBvbmVudEluc3RhbmNlOyl7dmFyIHM9YS5jb21wb25lbnRJbnN0YW5jZS4kYXR0cnMmJmEuY29tcG9uZW50SW5zdGFuY2UuJGF0dHJzLl9pO0kocykmJihvPSJyLSIrcyksYT1hLnBhcmVudH1pci5zZXRBdHRyaWJ1dGUoIm5pZCIsU3RyaW5nKG8pKSxpci5zZXRBdHRyaWJ1dGUoImNpZCIsaS5fJGlkKSxmdW5jdGlvbihlKXtJKGVbb3JdKSYmKGUuaW5wdXQ9W10uY29uY2F0KGVbb3JdLGUuaW5wdXR8fFtdKSxkZWxldGUgZVtvcl0pO0koZVthcl0pJiYoZS5jaGFuZ2U9W10uY29uY2F0KGVbYXJdLGUuY2hhbmdlfHxbXSksZGVsZXRlIGVbYXJdKX0obiksR2UobixyLGNyLHVyLHNyLHQuY29udGV4dCksaXI9dm9pZCAwfX12YXIgZHI9ZnVuY3Rpb24oZSl7dmFyIHIsdCxnPXt9LG49ZS5tb2R1bGVzLG09ZS5ub2RlT3BzO2ZvcihyPTA7cjxYbi5sZW5ndGg7KytyKWZvcihnW1huW3JdXT1bXSx0PTA7dDxuLmxlbmd0aDsrK3QpSShuW3RdW1huW3JdXSkmJmdbWG5bcl1dLnB1c2goblt0XVtYbltyXV0pO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9bS5wYXJlbnROb2RlKGUpO0kodCkmJm0ucmVtb3ZlQ2hpbGQodCxlKX1mdW5jdGlvbiB5KGUsdCxuLHIsaSxvLGEpe2lmKEkoZS5lbG0pJiZJKG8pJiYoZT1vW2FdPWRlKGUpKSxlLmlzUm9vdEluc2VydD0haSwhZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5kYXRhO2lmKEkoaSkpe3ZhciBvPUkoZS5jb21wb25lbnRJbnN0YW5jZSkmJmkua2VlcEFsaXZlO2lmKEkoaT1pLmhvb2spJiZJKGk9aS5pbml0KSYmaShlLCExKSxJKGUuY29tcG9uZW50SW5zdGFuY2UpKXJldHVybiBwKGUsdCksbChuLGUuZWxtLHIpLEEobykmJmZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaSxvPWU7by5jb21wb25lbnRJbnN0YW5jZTspaWYobz1vLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSxJKGk9by5kYXRhKSYmSShpPWkudHJhbnNpdGlvbikpe2ZvcihpPTA7aTxnLmFjdGl2YXRlLmxlbmd0aDsrK2kpZy5hY3RpdmF0ZVtpXShHbixvKTt0LnB1c2gobyk7YnJlYWt9bChuLGUuZWxtLHIpfShlLHQsbixyKSwhMH19KGUsdCxuLHIpKXt2YXIgcz1lLmRhdGEsYz1lLmNoaWxkcmVuLHU9ZS50YWc7SSh1KT8oZS5lbG09ZS5ucz9tLmNyZWF0ZUVsZW1lbnROUyhlLm5zLHUpOm0uY3JlYXRlRWxlbWVudCh1LGUpLGQoZSksaChlLGMsdCksSShzKSYmdihlLHQpKTpBKGUuaXNDb21tZW50KT9lLmVsbT1tLmNyZWF0ZUNvbW1lbnQoZS50ZXh0KTplLmVsbT1tLmNyZWF0ZVRleHROb2RlKGUudGV4dCksbChuLGUuZWxtLHIpfX1mdW5jdGlvbiBwKGUsdCl7SShlLmRhdGEucGVuZGluZ0luc2VydCkmJih0LnB1c2guYXBwbHkodCxlLmRhdGEucGVuZGluZ0luc2VydCksZS5kYXRhLnBlbmRpbmdJbnNlcnQ9bnVsbCksZS5lbG09ZS5jb21wb25lbnRJbnN0YW5jZS4kZWwsXyhlKT8odihlLHQpLGQoZSkpOihXbihlKSx0LnB1c2goZSkpfWZ1bmN0aW9uIGwoZSx0LG4pe0koZSkmJihJKG4pP20ucGFyZW50Tm9kZShuKT09PWUmJm0uaW5zZXJ0QmVmb3JlKGUsdCxuKTptLmFwcGVuZENoaWxkKGUsdCkpfWZ1bmN0aW9uIGgoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpeSh0W3JdLG4sZS5lbG0sbnVsbCwhMCx0LHIpO2Vsc2UgYyhlLnRleHQpJiZtLmFwcGVuZENoaWxkKGUuZWxtLG0uY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGUudGV4dCkpKX1mdW5jdGlvbiBfKGUpe2Zvcig7ZS5jb21wb25lbnRJbnN0YW5jZTspZT1lLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtyZXR1cm4gSShlLnRhZyl9ZnVuY3Rpb24gdihlLHQpe2Zvcih2YXIgbj0wO248Zy5jcmVhdGUubGVuZ3RoOysrbilnLmNyZWF0ZVtuXShHbixlKTtJKHI9ZS5kYXRhLmhvb2spJiYoSShyLmNyZWF0ZSkmJnIuY3JlYXRlKEduLGUpLEkoci5pbnNlcnQpJiZ0LnB1c2goZSkpfWZ1bmN0aW9uIGQoZSl7dmFyIHQ7aWYoSSh0PWUuZm5TY29wZUlkKSltLnNldFN0eWxlU2NvcGUoZS5lbG0sdCk7ZWxzZSBmb3IodmFyIG49ZTtuOylJKHQ9bi5jb250ZXh0KSYmSSh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZtLnNldFN0eWxlU2NvcGUoZS5lbG0sdCksbj1uLnBhcmVudDtJKHQ9TnQpJiZ0IT09ZS5jb250ZXh0JiZ0IT09ZS5mbkNvbnRleHQmJkkodD10LiRvcHRpb25zLl9zY29wZUlkKSYmbS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpfWZ1bmN0aW9uIGIoZSx0LG4scixpLG8pe2Zvcig7cjw9aTsrK3IpeShuW3JdLG8sZSx0LCExLG4scil9ZnVuY3Rpb24gdyhlKXt2YXIgdCxuLHI9ZS5kYXRhO2lmKEkocikpZm9yKEkodD1yLmhvb2spJiZJKHQ9dC5kZXN0cm95KSYmdChlKSx0PTA7dDxnLmRlc3Ryb3kubGVuZ3RoOysrdClnLmRlc3Ryb3lbdF0oZSk7aWYoSSh0PWUuY2hpbGRyZW4pKWZvcihuPTA7bjxlLmNoaWxkcmVuLmxlbmd0aDsrK24pdyhlLmNoaWxkcmVuW25dKX1mdW5jdGlvbiBrKGUsdCxuKXtmb3IoO3Q8PW47Kyt0KXt2YXIgcj1lW3RdO0kocikmJihJKHIudGFnKT8oYShyKSx3KHIpKTpvKHIuZWxtKSl9fWZ1bmN0aW9uIGEoZSx0KXtpZihJKHQpfHxJKGUuZGF0YSkpe3ZhciBuLHIsaT1nLnJlbW92ZS5sZW5ndGgrMTtpZihJKHQpP3QubGlzdGVuZXJzKz1pOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbyhlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxpKSxJKG49ZS5jb21wb25lbnRJbnN0YW5jZSkmJkkobj1uLl92bm9kZSkmJkkobi5kYXRhKSlhKG4sdCk7ZWxzZSBpZihJKHI9ZS5jaGlsZHJlbikpZm9yKG49MDtuPHIubGVuZ3RoO24rKylyW25dLnRhZyYmYShyW25dKTtmb3Iobj0wO248Zy5yZW1vdmUubGVuZ3RoOysrbilnLnJlbW92ZVtuXShlLHQpO0kobj1lLmRhdGEuaG9vaykmJkkobj1uLnJlbW92ZSk/bihlLHQpOnQoKX1lbHNlIG8oZS5lbG0pfWZ1bmN0aW9uIFMoZSx0LG4scil7Zm9yKHZhciBpPW47aTxyO2krKyl7dmFyIG89dFtpXTtpZihJKG8pJiZKbihlLG8pKXJldHVybiBpfX1mdW5jdGlvbiB4KGUsdCxuLHIsaSxvKXtpZihlIT09dCl7SSh0LmVsbSkmJkkocikmJih0PXJbaV09ZGUodCkpO3ZhciBhPXQuZWxtPWUuZWxtO2lmKEEoZS5pc0FzeW5jUGxhY2Vob2xkZXIpKUkodC5hc3luY0ZhY3RvcnkucmVzb2x2ZWQpP08oZS5lbG0sdCxuKTp0LmlzQXN5bmNQbGFjZWhvbGRlcj0hMDtlbHNlIGlmKEEodC5pc1N0YXRpYykmJkEoZS5pc1N0YXRpYykmJnQua2V5PT09ZS5rZXkmJihBKHQuaXNDbG9uZWQpfHxBKHQuaXNPbmNlKSkpdC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlO2Vsc2V7dmFyIHMsYz10LmRhdGE7SShjKSYmSShzPWMuaG9vaykmJkkocz1zLnByZXBhdGNoKSYmcyhlLHQpO3ZhciB1PWUuY2hpbGRyZW4sbD10LmNoaWxkcmVuO2lmKEkoYykmJl8odCkpe2ZvcihzPTA7czxnLnVwZGF0ZS5sZW5ndGg7KytzKWcudXBkYXRlW3NdKGUsdCk7SShzPWMuaG9vaykmJkkocz1zLnVwZGF0ZSkmJnMoZSx0KX1FKHQudGV4dCk/SSh1KSYmSShsKT91IT09bCYmZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLGM9MCx1PTAsbD10Lmxlbmd0aC0xLGQ9dFswXSxmPXRbbF0scD1uLmxlbmd0aC0xLGg9blswXSx2PW5bcF0sZz0haTtjPD1sJiZ1PD1wOylFKGQpP2Q9dFsrK2NdOkUoZik/Zj10Wy0tbF06Sm4oZCxoKT8oeChkLGgscixuLHUpLGQ9dFsrK2NdLGg9blsrK3VdKTpKbihmLHYpPyh4KGYsdixyLG4scCksZj10Wy0tbF0sdj1uWy0tcF0pOkpuKGQsdik/KHgoZCx2LHIsbixwKSxnJiZtLmluc2VydEJlZm9yZShlLGQuZWxtLG0ubmV4dFNpYmxpbmcoZi5lbG0pKSxkPXRbKytjXSx2PW5bLS1wXSk6KEpuKGYsaCk/KHgoZixoLHIsbix1KSxnJiZtLmluc2VydEJlZm9yZShlLGYuZWxtLGQuZWxtKSxmPXRbLS1sXSk6KEUobykmJihvPVluKHQsYyxsKSksRShhPUkoaC5rZXkpP29baC5rZXldOlMoaCx0LGMsbCkpP3koaCxyLGUsZC5lbG0sITEsbix1KTpKbihzPXRbYV0saCk/KHgocyxoLHIsbix1KSx0W2FdPXZvaWQgMCxnJiZtLmluc2VydEJlZm9yZShlLHMuZWxtLGQuZWxtKSk6eShoLHIsZSxkLmVsbSwhMSxuLHUpKSxoPW5bKyt1XSk7bDxjP2IoZSxFKG5bcCsxXSk/bnVsbDpuW3ArMV0uZWxtLG4sdSxwLHIpOnA8dSYmayh0LGMsbCl9KGEsdSxsLG4sbyk6SShsKT8oSShlLnRleHQpJiZtLnNldFRleHRDb250ZW50KGEsIiIpLGIoYSxudWxsLGwsMCxsLmxlbmd0aC0xLG4pKTpJKHUpP2sodSwwLHUubGVuZ3RoLTEpOkkoZS50ZXh0KSYmbS5zZXRUZXh0Q29udGVudChhLCIiKTplLnRleHQhPT10LnRleHQmJm0uc2V0VGV4dENvbnRlbnQoYSx0LnRleHQpLEkoYykmJkkocz1jLmhvb2spJiZJKHM9cy5wb3N0cGF0Y2gpJiZzKGUsdCl9fX1mdW5jdGlvbiBDKGUsdCxuKXtpZihBKG4pJiZJKGUucGFyZW50KSllLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQ9dDtlbHNlIGZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKXRbcl0uZGF0YS5ob29rLmluc2VydCh0W3JdKX12YXIgVD1zKCJhdHRycyxjbGFzcyxzdGF0aWNDbGFzcyxzdGF0aWNTdHlsZSxrZXkiKTtmdW5jdGlvbiBPKGUsdCxuLHIpe3ZhciBpLG89dC50YWcsYT10LmRhdGEscz10LmNoaWxkcmVuO2lmKHI9cnx8YSYmYS5wcmUsdC5lbG09ZSxBKHQuaXNDb21tZW50KSYmSSh0LmFzeW5jRmFjdG9yeSkpcmV0dXJuIHQuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2lmKEkoYSkmJihJKGk9YS5ob29rKSYmSShpPWkuaW5pdCkmJmkodCwhMCksSShpPXQuY29tcG9uZW50SW5zdGFuY2UpKSlyZXR1cm4gcCh0LG4pLCEwO2lmKEkobykpe2lmKEkocykpaWYoZS5oYXNDaGlsZE5vZGVzKCkpaWYoSShpPWEpJiZJKGk9aS5kb21Qcm9wcykmJkkoaT1pLmlubmVySFRNTCkpe2lmKGkhPT1lLmlubmVySFRNTClyZXR1cm4hMX1lbHNle2Zvcih2YXIgYz0hMCx1PWUuZmlyc3RDaGlsZCxsPTA7bDxzLmxlbmd0aDtsKyspe2lmKCF1fHwhTyh1LHNbbF0sbixyKSl7Yz0hMTticmVha311PXUubmV4dFNpYmxpbmd9aWYoIWN8fHUpcmV0dXJuITF9ZWxzZSBoKHQscyxuKTtpZihJKGEpKXt2YXIgZD0hMTtmb3IodmFyIGYgaW4gYSlpZighVChmKSl7ZD0hMCx2KHQsbik7YnJlYWt9IWQmJmEuY2xhc3MmJnFlKGEuY2xhc3MpfX1lbHNlIGUuZGF0YSE9PXQudGV4dCYmKGUuZGF0YT10LnRleHQpO3JldHVybiEwfXJldHVybiBmdW5jdGlvbihlLHQsbixyKXtpZighRSh0KSl7dmFyIGksbz0hMSxhPVtdO2lmKEUoZSkpbz0hMCx5KHQsYSk7ZWxzZXt2YXIgcz1JKGUubm9kZVR5cGUpO2lmKCFzJiZKbihlLHQpKXgoZSx0LGEsbnVsbCxudWxsLHIpO2Vsc2V7aWYocyl7aWYoMT09PWUubm9kZVR5cGUmJmUuaGFzQXR0cmlidXRlKEwpJiYoZS5yZW1vdmVBdHRyaWJ1dGUoTCksbj0hMCksQShuKSYmTyhlLHQsYSkpcmV0dXJuIEModCxhLCEwKSxlO2k9ZSxlPW5ldyBzZShtLnRhZ05hbWUoaSkudG9Mb3dlckNhc2UoKSx7fSxbXSx2b2lkIDAsaSl9dmFyIGM9ZS5lbG0sdT1tLnBhcmVudE5vZGUoYyk7aWYoeSh0LGEsYy5fbGVhdmVDYj9udWxsOnUsbS5uZXh0U2libGluZyhjKSksSSh0LnBhcmVudCkpZm9yKHZhciBsPXQucGFyZW50LGQ9Xyh0KTtsOyl7Zm9yKHZhciBmPTA7ZjxnLmRlc3Ryb3kubGVuZ3RoOysrZilnLmRlc3Ryb3lbZl0obCk7aWYobC5lbG09dC5lbG0sZCl7Zm9yKHZhciBwPTA7cDxnLmNyZWF0ZS5sZW5ndGg7KytwKWcuY3JlYXRlW3BdKEduLGwpO3ZhciBoPWwuZGF0YS5ob29rLmluc2VydDtpZihoLm1lcmdlZClmb3IodmFyIHY9MTt2PGguZm5zLmxlbmd0aDt2KyspaC5mbnNbdl0oKX1lbHNlIFduKGwpO2w9bC5wYXJlbnR9SSh1KT9rKFtlXSwwLDApOkkoZS50YWcpJiZ3KGUpfX1yZXR1cm4gQyh0LGEsbyksdC5lbG19SShlKSYmdyhlKX19KHtub2RlT3BzOlZuLG1vZHVsZXM6W3tjcmVhdGU6bnIsdXBkYXRlOm5yfSx7Y3JlYXRlOnJyLHVwZGF0ZTpycn0se2NyZWF0ZTpscix1cGRhdGU6bHJ9XS5jb25jYXQoW3FuLEtuXSl9KSxmcj17bW9kZWw6e30sc2hvdzp7fX07ZnVuY3Rpb24gcHIoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49IiIscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKylJKHQ9cHIoZVtyXSkpJiYiIiE9PXQmJihuJiYobis9IiAiKSxuKz10KTtyZXR1cm4gbn0oZSk6eShlKT9mdW5jdGlvbihlKXt2YXIgdD0iIjtmb3IodmFyIG4gaW4gZSllW25dJiYodCYmKHQrPSIgIiksdCs9bik7cmV0dXJuIHR9KGUpOiJzdHJpbmciPT10eXBlb2YgZT9lOiIifXZhciBocj1mKGZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZS5zcGxpdChyKTsxPHQubGVuZ3RoJiYoblt0WzBdLnRyaW0oKV09dFsxXS50cmltKCkpfX0pLG59KTtmdW5jdGlvbiB2cihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9DKGUpOiJzdHJpbmciPT10eXBlb2YgZT9ocihlKTplfWZ1bmN0aW9uIGdyKGUsdCl7b2UoKTt2YXIgbixyPXRoaXMuJG9wdGlvbnNbZV0saT1lKyIgaG9vayI7aWYocilmb3IodmFyIG89MCxhPXIubGVuZ3RoO288YTtvKyspbj1MZShyW29dLHRoaXMsdD9bdF06bnVsbCx0aGlzLGkpO3JldHVybiB0aGlzLl9oYXNIb29rRXZlbnQmJnRoaXMuJGVtaXQoImhvb2s6IitlLHQpLGFlKCksbn12YXIgbXI9e2luc3RhbGw6ZnVuY3Rpb24oZSl7ZS5wcm90b3R5cGUuXyRxdWV1ZT1VdCxlLnByb3RvdHlwZS5fX2NhbGxfaG9vaz1ncixlLnByb3RvdHlwZS5fJHN0cmluZ2lmeUNsYXNzPXByLGUucHJvdG90eXBlLl8kbm9ybWFsaXplU3R5bGVCaW5kaW5nPXZyfX07Z24uY29uZmlnLm11c3RVc2VQcm9wPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGduLmNvbmZpZy5pc1Jlc2VydmVkVGFnPXpuLGduLmNvbmZpZy5pc1Jlc2VydmVkQXR0cj1Vbixnbi5jb25maWcuZ2V0VGFnTmFtZXNwYWNlPWZ1bmN0aW9uKCl7fSxnbi5jb25maWcuaXNVbmtub3duRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiExfSx4KGduLm9wdGlvbnMuZGlyZWN0aXZlcyxmcikseChnbi5vcHRpb25zLmNvbXBvbmVudHMse30pLGduLnByb3RvdHlwZS5fX3BhdGNoX189ZHIsZ24ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe2lmKCJwYWdlIj09PXRoaXMuJG9wdGlvbnMubXBUeXBlKXt2YXIgbj1uZXcgRm4odGhpcy4kb3B0aW9ucy5wYWdlSWQsdGhpcy4kb3B0aW9ucy5wYWdlUGF0aCk7KGU9bi5jcmVhdGVDb21tZW50KCJyb290IikpLmhhc0F0dHJpYnV0ZT1lLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbigpe30sbi5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZSl9cmV0dXJuIGk9ZSxvPXQsKHI9dGhpcykuJGVsPWksci4kb3B0aW9ucy5yZW5kZXJ8fChyLiRvcHRpb25zLnJlbmRlcj11ZSksRnQociwiYmVmb3JlTW91bnQiKSxuZXcgS3QocixmdW5jdGlvbigpe3IuX3VwZGF0ZShyLl9yZW5kZXIoKSxvKX0sVCx7YmVmb3JlOmZ1bmN0aW9uKCl7ci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJkZ0KHIsImJlZm9yZVVwZGF0ZSIpfX0sITApLG89ITEsbnVsbD09ci4kdm5vZGUmJihyLl9pc01vdW50ZWQ9ITAsci5fJHZkPyhGdChyLCJvblNlcnZpY2VDcmVhdGVkIiksRnQociwib25TZXJ2aWNlQXR0YWNoZWQiKSxyLl8kdmQuYWRkTW91bnRlZFZtKHIpKTpGdChyLCJtb3VudGVkIikpLHI7dmFyIHIsaSxvfSxnbi51c2UobXIpLGUuVnVlPWdufXZhciBpc0ZpcnN0PSEwLGZyYW1ld29ya3MscnVudGltZUNvbmZpZztmdW5jdGlvbiBpbml0JDIoZSl7aWYoZS5fX3VuaUNvbmZpZyl7dmFyIHQ9ZS53ZWV4O2lzRmlyc3QmJihnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aD10LmNvbmZpZy5lbnYuZGV2aWNlV2lkdGgpO3ZhciBuPWUuX191bmlDb25maWcscj0id2VleCI9PT1uLm52dWVDb21waWxlcjt0LmRvY3VtZW50Ll9fJGF1dG9tYXRvcl9fPSEhbi5hdXRvbWF0b3IsdC5kb2N1bWVudC5fXyRjb21waWxlcl9fPXI/IndlZXgiOiJ1bmktYXBwIix0LmRvY3VtZW50Ll9fJHN0eWxlQ29tcGlsZXJfXz0id2VleCI9PT1uLm52dWVTdHlsZUNvbXBpbGVyPyJ3ZWV4IjoidW5pLWFwcCIsZ2xvYmFsLldYRW52aXJvbm1lbnQuZHluYW1pY1JweD0hKCFuLndpbmRvd3x8IW4ud2luZG93LmR5bmFtaWNScHgpO3ZhciBpPSJuYXRpdmUiIT09bi5yZW5kZXJlciYmLTEhPT10LmNvbmZpZy5idW5kbGVVcmwuaW5kZXhPZigiYXBwLXNlcnZpY2UuanMiKTtpZihpKXt2YXIgbz17fTt2dWVGYWN0b3J5KG8sZS5TaGFyZWRPYmplY3QpLGUuVnVlPW8uVnVlfWlmKE9iamVjdC5hc3NpZ24oZSxjcmVhdGVJbnN0YW5jZUNvbnRleHQkMShlKSksaSYmZS5WdWUudXNlKGUuX192dWVQbHVnaW4pLGRlbGV0ZSBlLl9fdnVlUGx1Z2luLCFyKXt2YXIgYT1lLnBsdXM7aWYoImlvcyI9PT1nbG9iYWwuV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpKXt2YXIgcz1hLnNjcmVlbjtnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aD1zLndpZHRoLGdsb2JhbC5XWEVudmlyb25tZW50LmRldmljZUhlaWdodD1zLmhlaWdodH12YXIgYz1nbG9iYWwuV1hFbnZpcm9ubWVudCx1PWMuc2NhbGUsbD1jLmRldmljZVdpZHRoLGQ9Yy5wbGF0Zm9ybSxmPU1hdGguY2VpbChsL3UpLHA9dC5yZXF1aXJlTW9kdWxlKCJtZXRhIik7aWYoIjEiPT09dC5jb25maWcucGx1c193ZWJfaWQpe3ZhciBoPXQucmVxdWlyZU1vZHVsZSgicGx1cyIpO2guc2V0RGVmYXVsdEZvbnRTaXplJiZoLnNldERlZmF1bHRGb250U2l6ZSgxNil9ImlvcyI9PT1kLnRvTG93ZXJDYXNlKCkmJnAuc2V0Vmlld3BvcnQoe3dpZHRoOmYscm91bmRPZmZEZXZpYXRpb246ITF9KX1pfHxlLlZ1ZS51c2UodW5pQXBwLGUpfX1mdW5jdGlvbiBnZXRKU0ZNVmVyc2lvbigpe3JldHVybiIwLjI5LjYifWZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VzKGksbyxhKXt2YXIgcz1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBzLnNlcnZpY2U9T2JqZWN0LmNyZWF0ZShudWxsKSxzZXJ2aWNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUubmFtZSxuPWUub3B0aW9ucy5jcmVhdGU7aWYobil0cnl7dmFyIHI9bihpLG8sYSk7T2JqZWN0LmFzc2lnbihzLnNlcnZpY2UsciksT2JqZWN0LmFzc2lnbihzLHIuaW5zdGFuY2UpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoIltKUyBSdW50aW1lXSBGYWlsZWQgdG8gY3JlYXRlIHNlcnZpY2UgIit0KyIuIil9fSksZGVsZXRlIHMuc2VydmljZS5pbnN0YW5jZSxPYmplY3QuZnJlZXplKHMuc2VydmljZSksc312YXIgaW5zdGFuY2VUeXBlTWFwPXt9O2Z1bmN0aW9uIGdldEZyYW1ld29ya1R5cGUoZSl7cmV0dXJuIGluc3RhbmNlVHlwZU1hcFtlXX12YXIgU2hhcmVkT2JqZWN0PXt1aWQ6MH07ZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VDb250ZXh0KGUsdCxuKXt2b2lkIDA9PT10JiYodD17fSk7dmFyIHI9bmV3IFdlZXhJbnN0YW5jZShlLHQsbik7aW5zdGFuY2VUeXBlTWFwW2VdPSJWdWUiO3ZhciBpPXJ1bnRpbWVDb25maWcuZnJhbWV3b3Jrcy5WdWU7aWYoIWkpcmV0dXJuIG5ldyBFcnJvcignW0pTIEZyYW1ld29ya10gSW52YWxpZCBidW5kbGUgdHlwZSAiVnVlIi4nKTt2YXIgbz1jcmVhdGVTZXJ2aWNlcyhlLHt3ZWV4OnIsY29uZmlnOnQsY3JlYXRlZDpEYXRlLm5vdygpLGZyYW1ld29yazoiVnVlIixidW5kbGVUeXBlOiJWdWUifSxydW50aW1lQ29uZmlnKTtPYmplY3QuZnJlZXplKG8pO3ZhciBhPU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmFzc2lnbihhLG8se1NoYXJlZE9iamVjdDpTaGFyZWRPYmplY3Qsd2VleDpyLGdldEpTRk1WZXJzaW9uOmdldEpTRk1WZXJzaW9uLHJlcXVpcmVNb2R1bGU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIHIucmVxdWlyZU1vZHVsZS5hcHBseShyLGUpfSxfX1dFRVhfQ0FMTF9KQVZBU0NSSVBUX186cmVjZWl2ZVRhc2tzLHNlcnZpY2VzOm99KSxPYmplY3QuZnJlZXplKGEpO3ZhciBzPU9iamVjdC5hc3NpZ24oe30sYSk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGkuY3JlYXRlSW5zdGFuY2VDb250ZXh0JiZPYmplY3QuYXNzaWduKHMsaS5jcmVhdGVJbnN0YW5jZUNvbnRleHQoZSxhLG4pKSxpbml0JDIocyksT2JqZWN0LmZyZWV6ZShzKSxzfWZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGUsdCxuLHIpe2lmKGluc3RhbmNlVHlwZU1hcFtlXSlyZXR1cm4gbmV3IEVycm9yKCdUaGUgaW5zdGFuY2UgaWQgIicrZSsnIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQhJyk7dmFyIGk9IlZ1ZSI7aW5zdGFuY2VUeXBlTWFwW2VdPWksKG49SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShufHx7fSkpKS5lbnY9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnbG9iYWwuV1hFbnZpcm9ubWVudHx8e30pKSxuLmJ1bmRsZVR5cGU9aTt2YXIgbz1ydW50aW1lQ29uZmlnLmZyYW1ld29ya3MuVnVlO2lmKCFvKXJldHVybiBuZXcgRXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEludmFsaWQgYnVuZGxlIHR5cGUgIlZ1ZSIuJyk7dmFyIGE9Y3JlYXRlSW5zdGFuY2VDb250ZXh0KGUsbixyKTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygby5jcmVhdGVJbnN0YW5jZSlyZXR1cm4gby5jcmVhdGVJbnN0YW5jZShlLHQsbixyLGEpO3J1bkluQ29udGV4dCh0LGEpfWZ1bmN0aW9uIHJ1bkluQ29udGV4dChlLHQpe3ZhciBuPVtdLHI9W107Zm9yKHZhciBpIGluIHQpbi5wdXNoKGkpLHIucHVzaCh0W2ldKTt2YXIgbz0iXG4gICAgKGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgICAgICIrZSsiXG4gICAgfSkoT2JqZWN0LmNyZWF0ZSh0aGlzKSlcbiAgIjtyZXR1cm4obmV3KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KEZ1bmN0aW9uLFtudWxsXS5jb25jYXQobixbb10pKSkpLmFwcGx5KHZvaWQgMCxyKX1mdW5jdGlvbiBnZXRSb290KGUpe3ZhciB0PWdldERvYyhlKTt0cnl7aWYodCYmdC5ib2R5KXJldHVybiB0LmJvZHkudG9KU09OKCl9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGdldCB0aGUgdmlydHVhbCBkb20gdHJlZS4iKX19dmFyIG1ldGhvZHM9e2NyZWF0ZUluc3RhbmNlOmNyZWF0ZUluc3RhbmNlLGNyZWF0ZUluc3RhbmNlQ29udGV4dDpjcmVhdGVJbnN0YW5jZUNvbnRleHQsZ2V0Um9vdDpnZXRSb290LGdldEpTRk1WZXJzaW9uOmdldEpTRk1WZXJzaW9uLGdldERvY3VtZW50OmdldERvYyxyZWdpc3RlclNlcnZpY2U6cmVnaXN0ZXIsdW5yZWdpc3RlclNlcnZpY2U6dW5yZWdpc3RlcixjYWxsSlM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1mcmFtZXdvcmtzW2dldEZyYW1ld29ya1R5cGUoZSldO3JldHVybiBuJiYiZnVuY3Rpb24iPT10eXBlb2Ygbi5yZWNlaXZlVGFza3M/bi5yZWNlaXZlVGFza3MoZSx0KTpyZWNlaXZlVGFza3MoZSx0KX19O2Z1bmN0aW9uIGdlbkluc3RhbmNlKHMpe21ldGhvZHNbc109ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG4scj1lWzBdLGk9Z2V0RnJhbWV3b3JrVHlwZShyKTtpZihpJiZmcmFtZXdvcmtzW2ldKXt2YXIgbz0obj1mcmFtZXdvcmtzW2ldKVtzXS5hcHBseShuLGUpLGE9e2ZyYW1ld29yazppfTtyZXR1cm4icmVmcmVzaEluc3RhbmNlIj09PXM/c2VydmljZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucmVmcmVzaDt0JiZ0KHIse2luZm86YSxydW50aW1lOnJ1bnRpbWVDb25maWd9KX0pOiJkZXN0cm95SW5zdGFuY2UiPT09cyYmKHNlcnZpY2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmRlc3Ryb3k7dCYmdChyLHtpbmZvOmEscnVudGltZTpydW50aW1lQ29uZmlnfSl9KSxkZWxldGUgaW5zdGFuY2VUeXBlTWFwW3JdKSxvfX19ZnVuY3Rpb24gYWRhcHRNZXRob2QoaSxvKXttZXRob2RzW2ldPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2Zvcih2YXIgbiBpbiJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvLmFwcGx5KHZvaWQgMCxlKSxydW50aW1lQ29uZmlnLmZyYW1ld29ya3Mpe3ZhciByPXJ1bnRpbWVDb25maWcuZnJhbWV3b3Jrc1tuXTtyJiZyW2ldJiZyW2ldLmFwcGx5KHIsZSl9fX1mdW5jdGlvbiBpbml0JCQxKGUpe2Zvcih2YXIgdCBpbiBmcmFtZXdvcmtzPShydW50aW1lQ29uZmlnPWV8fHt9KS5mcmFtZXdvcmtzfHx7fSxpbml0JDEoKSxmcmFtZXdvcmtzKXt2YXIgbj1mcmFtZXdvcmtzW3RdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuLmluaXQpdHJ5e24uaW5pdChlKX1jYXRjaChlKXt9fXJldHVybiBhZGFwdE1ldGhvZCgicmVnaXN0ZXJDb21wb25lbnRzIixyZWdpc3RlckNvbXBvbmVudHMpLGFkYXB0TWV0aG9kKCJyZWdpc3Rlck1vZHVsZXMiLHJlZ2lzdGVyTW9kdWxlcyksYWRhcHRNZXRob2QoInJlZ2lzdGVyTWV0aG9kcyIpLFsiZGVzdHJveUluc3RhbmNlIiwicmVmcmVzaEluc3RhbmNlIl0uZm9yRWFjaChnZW5JbnN0YW5jZSksbWV0aG9kc312YXIgY29uZmlnPXtEb2N1bWVudDpEb2N1bWVudCxFbGVtZW50OkVsZW1lbnQsQ29tbWVudDpDb21tZW50LExpc3RlbmVyOkxpc3RlbmVyLFRhc2tDZW50ZXI6VGFza0NlbnRlcixzZW5kVGFza3M6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGNhbGxOYXRpdmU/Y2FsbE5hdGl2ZS5hcHBseSh2b2lkIDAsZSk6KGdsb2JhbC5jYWxsTmF0aXZlfHxmdW5jdGlvbigpe30pLmFwcGx5KHZvaWQgMCxlKX19O2Z1bmN0aW9uIGZyZWV6ZVByb3RvdHlwZSgpe09iamVjdC5mcmVlemUoY29uZmlnLkNvbW1lbnQpLE9iamVjdC5mcmVlemUoY29uZmlnLkxpc3RlbmVyKSxPYmplY3QuZnJlZXplKGNvbmZpZy5Eb2N1bWVudC5wcm90b3R5cGUpLE9iamVjdC5mcmVlemUoY29uZmlnLkNvbW1lbnQucHJvdG90eXBlKSxPYmplY3QuZnJlZXplKGNvbmZpZy5MaXN0ZW5lci5wcm90b3R5cGUpfURvY3VtZW50LmhhbmRsZXI9Y29uZmlnLnNlbmRUYXNrczt2YXIgcnVudGltZT17c2VydmljZTp7cmVnaXN0ZXI6cmVnaXN0ZXIsdW5yZWdpc3Rlcjp1bnJlZ2lzdGVyLGhhczpoYXN9LGZyZWV6ZVByb3RvdHlwZTpmcmVlemVQcm90b3R5cGUsaW5pdDppbml0JCQxLGNvbmZpZzpjb25maWd9O2Z1bmN0aW9uIE1lc3NhZ2VFdmVudChlLHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLnR5cGU9ZXx8Im1lc3NhZ2UiLHRoaXMuZGF0YT10LmRhdGF8fG51bGwsdGhpcy5vcmlnaW49dC5vcmlnaW58fCIiLHRoaXMuc291cmNlPXQuc291cmNlfHxudWxsLHRoaXMucG9ydHM9dC5wb3J0c3x8W10sdGhpcy50YXJnZXQ9bnVsbCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfXZhciBjaGFubmVscz17fSxpbnN0YW5jZXM9e307ZnVuY3Rpb24gQnJvYWRjYXN0Q2hhbm5lbCQxKCl7fUJyb2FkY2FzdENoYW5uZWwkMS5wcm90b3R5cGUucG9zdE1lc3NhZ2U9ZnVuY3Rpb24oZSl7aWYodGhpcy5fY2xvc2VkKXRocm93IG5ldyBFcnJvcignQnJvYWRjYXN0Q2hhbm5lbCAiJyt0aGlzLm5hbWUrJyIgaXMgY2xvc2VkLicpO3ZhciB0PWNoYW5uZWxzW3RoaXMubmFtZV07aWYodCYmdC5sZW5ndGgpZm9yKHZhciBuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciByPXRbbl07ci5fY2xvc2VkfHxyPT09dGhpc3x8ImZ1bmN0aW9uIj09dHlwZW9mIHIub25tZXNzYWdlJiZyLm9ubWVzc2FnZShuZXcgTWVzc2FnZUV2ZW50KCJtZXNzYWdlIix7ZGF0YTplfSkpfX0sQnJvYWRjYXN0Q2hhbm5lbCQxLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoIXRoaXMuX2Nsb3NlZCYmKHRoaXMuX2Nsb3NlZD0hMCxjaGFubmVsc1t0aGlzLm5hbWVdKSl7dmFyIGU9Y2hhbm5lbHNbdGhpcy5uYW1lXS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10fSk7ZS5sZW5ndGg/Y2hhbm5lbHNbdGhpcy5uYW1lXT1lOmRlbGV0ZSBjaGFubmVsc1t0aGlzLm5hbWVdfX07dmFyIEJyb2FkY2FzdENoYW5uZWwkMj17Y3JlYXRlOmZ1bmN0aW9uKHQsZSxuKXtpZihpbnN0YW5jZXNbdF09W10sImZ1bmN0aW9uIj09dHlwZW9mIGdsb2JhbC5Ccm9hZGNhc3RDaGFubmVsKXJldHVybnt9O3ZhciByPXtCcm9hZGNhc3RDaGFubmVsOmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITEsdmFsdWU6U3RyaW5nKGUpfSksdGhpcy5fY2xvc2VkPSExLHRoaXMub25tZXNzYWdlPW51bGwsY2hhbm5lbHNbdGhpcy5uYW1lXXx8KGNoYW5uZWxzW3RoaXMubmFtZV09W10pLGNoYW5uZWxzW3RoaXMubmFtZV0ucHVzaCh0aGlzKSxpbnN0YW5jZXNbdF0ucHVzaCh0aGlzKX19O3JldHVybiByLkJyb2FkY2FzdENoYW5uZWwucHJvdG90eXBlPUJyb2FkY2FzdENoYW5uZWwkMS5wcm90b3R5cGUse2luc3RhbmNlOnJ9fSxkZXN0cm95OmZ1bmN0aW9uKGUsdCl7aW5zdGFuY2VzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvc2UoKX0pLGRlbGV0ZSBpbnN0YW5jZXNbZV19fSxzZXJ2aWNlcyQxPXtCcm9hZGNhc3RDaGFubmVsOkJyb2FkY2FzdENoYW5uZWwkMn0sQlhiLENYYixFWGIsRlhiO2Z1bmN0aW9uIHNldHVwKGUpe3ZhciB0PXJ1bnRpbWUuaW5pdCxuPXJ1bnRpbWUuY29uZmlnO24uZnJhbWV3b3Jrcz1lO3ZhciByPXN1YnZlcnNpb24ubmF0aXZlLGk9c3VidmVyc2lvbi50cmFuc2Zvcm1lcjtmb3IodmFyIG8gaW4gc2VydmljZXMkMSlydW50aW1lLnNlcnZpY2UucmVnaXN0ZXIobyxzZXJ2aWNlcyQxW29dKTtydW50aW1lLmZyZWV6ZVByb3RvdHlwZSgpLGdsb2JhbC5mcmFtZXdvcmtWZXJzaW9uPXIsZ2xvYmFsLnRyYW5zZm9ybWVyVmVyc2lvbj1pO3ZhciBhPXQobikscz1mdW5jdGlvbihyKXtnbG9iYWxbcl09ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG49YVtyXS5hcHBseShhLGUpO3JldHVybiBuIGluc3RhbmNlb2YgRXJyb3ImJmNvbnNvbGUuZXJyb3Iobi50b1N0cmluZygpKSxufX07Zm9yKHZhciBjIGluIGEpcyhjKX1mdW5jdGlvbiB1bndyYXBFeHBvcnRzKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9ZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZSx0KXtyZXR1cm4gZSh0PXtleHBvcnRzOnt9fSx0LmV4cG9ydHMpLHQuZXhwb3J0c31BcnJheS5mcm9tfHwoQXJyYXkuZnJvbT0oQlhiPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsQ1hiPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfHwiW29iamVjdCBGdW5jdGlvbl0iPT09QlhiLmNhbGwoZSl9LEVYYj1NYXRoLnBvdygyLDUzKS0xLEZYYj1mdW5jdGlvbihlKXt2YXIgdCxuPSh0PU51bWJlcihlKSxpc05hTih0KT8wOjAhPT10JiZpc0Zpbml0ZSh0KT8oMDx0PzE6LTEpKk1hdGguZmxvb3IoTWF0aC5hYnModCkpOnQpO3JldHVybiBNYXRoLm1pbihNYXRoLm1heChuLDApLEVYYil9LGZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdChlKTtpZihudWxsPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5LmZyb20gcmVxdWlyZXMgYW4gYXJyYXktbGlrZSBvYmplY3QgLSBub3QgbnVsbCBvciB1bmRlZmluZWQiKTt2YXIgbixyPTE8YXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMV06dm9pZCAwO2lmKHZvaWQgMCE9PXIpe2lmKCFDWGIocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkuZnJvbTogd2hlbiBwcm92aWRlZCwgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24iKTsyPGFyZ3VtZW50cy5sZW5ndGgmJihuPWFyZ3VtZW50c1syXSl9Zm9yKHZhciBpLG89RlhiKHQubGVuZ3RoKSxhPUNYYih0aGlzKT9PYmplY3QobmV3IHRoaXMobykpOm5ldyBBcnJheShvKSxzPTA7czxvOylpPXRbc10sYVtzXT1yP3ZvaWQgMD09PW4/cihpLHMpOnIuY2FsbChuLGkscyk6aSxzKz0xO3JldHVybiBhLmxlbmd0aD1vLGF9KSk7dmFyIF9nbG9iYWw9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpOyJudW1iZXIiPT10eXBlb2YgX19nJiYoX19nPXQpfSksX2NvcmU9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5leHBvcnRzPXt2ZXJzaW9uOiIyLjUuNyJ9OyJudW1iZXIiPT10eXBlb2YgX19lJiYoX19lPXQpfSksX2NvcmVfMT1fY29yZS52ZXJzaW9uLF9pc09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/bnVsbCE9PWU6ImZ1bmN0aW9uIj09dHlwZW9mIGV9LF9hbk9iamVjdD1mdW5jdGlvbihlKXtpZighX2lzT2JqZWN0KGUpKXRocm93IFR5cGVFcnJvcihlKyIgaXMgbm90IGFuIG9iamVjdCEiKTtyZXR1cm4gZX0sX2ZhaWxzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4hIWUoKX1jYXRjaChlKXtyZXR1cm4hMH19LF9kZXNjcmlwdG9ycz0hX2ZhaWxzKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KSxkb2N1bWVudCQxPV9nbG9iYWwuZG9jdW1lbnQsaXM9X2lzT2JqZWN0KGRvY3VtZW50JDEpJiZfaXNPYmplY3QoZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KSxfZG9tQ3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBpcz9kb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoZSk6e319LF9pZThEb21EZWZpbmU9IV9kZXNjcmlwdG9ycyYmIV9mYWlscyhmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoX2RvbUNyZWF0ZSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSksX3RvUHJpbWl0aXZlPWZ1bmN0aW9uKGUsdCl7aWYoIV9pc09iamVjdChlKSlyZXR1cm4gZTt2YXIgbixyO2lmKHQmJiJmdW5jdGlvbiI9PXR5cGVvZihuPWUudG9TdHJpbmcpJiYhX2lzT2JqZWN0KHI9bi5jYWxsKGUpKSlyZXR1cm4gcjtpZigiZnVuY3Rpb24iPT10eXBlb2Yobj1lLnZhbHVlT2YpJiYhX2lzT2JqZWN0KHI9bi5jYWxsKGUpKSlyZXR1cm4gcjtpZighdCYmImZ1bmN0aW9uIj09dHlwZW9mKG49ZS50b1N0cmluZykmJiFfaXNPYmplY3Qocj1uLmNhbGwoZSkpKXJldHVybiByO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9LGRQPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxmPV9kZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4pe2lmKF9hbk9iamVjdChlKSx0PV90b1ByaW1pdGl2ZSh0LCEwKSxfYW5PYmplY3QobiksX2llOERvbURlZmluZSl0cnl7cmV0dXJuIGRQKGUsdCxuKX1jYXRjaChlKXt9aWYoImdldCJpbiBufHwic2V0ImluIG4pdGhyb3cgVHlwZUVycm9yKCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEiKTtyZXR1cm4idmFsdWUiaW4gbiYmKGVbdF09bi52YWx1ZSksZX0sX29iamVjdERwPXtmOmZ9LF9wcm9wZXJ0eURlc2M9ZnVuY3Rpb24oZSx0KXtyZXR1cm57ZW51bWVyYWJsZTohKDEmZSksY29uZmlndXJhYmxlOiEoMiZlKSx3cml0YWJsZTohKDQmZSksdmFsdWU6dH19LF9oaWRlPV9kZXNjcmlwdG9ycz9mdW5jdGlvbihlLHQsbil7cmV0dXJuIF9vYmplY3REcC5mKGUsdCxfcHJvcGVydHlEZXNjKDEsbikpfTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbdF09bixlfSxoYXNPd25Qcm9wZXJ0eT17fS5oYXNPd25Qcm9wZXJ0eSxfaGFzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZSx0KX0saWQ9MCxweD1NYXRoLnJhbmRvbSgpLF91aWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIlN5bWJvbCgiLmNvbmNhdCh2b2lkIDA9PT1lPyIiOmUsIilfIiwoKytpZCtweCkudG9TdHJpbmcoMzYpKX0sX3JlZGVmaW5lPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciBvPV91aWQoInNyYyIpLHQ9InRvU3RyaW5nIixuPUZ1bmN0aW9uW3RdLGE9KCIiK24pLnNwbGl0KHQpO19jb3JlLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbChlKX0sKGUuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgbjtpJiYoX2hhcyhuLCJuYW1lIil8fF9oaWRlKG4sIm5hbWUiLHQpKSxlW3RdIT09biYmKGkmJihfaGFzKG4sbyl8fF9oaWRlKG4sbyxlW3RdPyIiK2VbdF06YS5qb2luKFN0cmluZyh0KSkpKSxlPT09X2dsb2JhbD9lW3RdPW46cj9lW3RdP2VbdF09bjpfaGlkZShlLHQsbik6KGRlbGV0ZSBlW3RdLF9oaWRlKGUsdCxuKSkpfSkoRnVuY3Rpb24ucHJvdG90eXBlLHQsZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcyYmdGhpc1tvXXx8bi5jYWxsKHRoaXMpfSl9KSxfYUZ1bmN0aW9uPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcihlKyIgaXMgbm90IGEgZnVuY3Rpb24hIik7cmV0dXJuIGV9LF9jdHg9ZnVuY3Rpb24ocixpLGUpe2lmKF9hRnVuY3Rpb24ociksdm9pZCAwPT09aSlyZXR1cm4gcjtzd2l0Y2goZSl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gci5jYWxsKGksZSl9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5jYWxsKGksZSx0KX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihlLHQsbil7cmV0dXJuIHIuY2FsbChpLGUsdCxuKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHIuYXBwbHkoaSxhcmd1bWVudHMpfX0sUFJPVE9UWVBFPSJwcm90b3R5cGUiLCRleHBvcnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHM9ZSYkZXhwb3J0LkYsYz1lJiRleHBvcnQuRyx1PWUmJGV4cG9ydC5TLGw9ZSYkZXhwb3J0LlAsZD1lJiRleHBvcnQuQixmPWM/X2dsb2JhbDp1P19nbG9iYWxbdF18fChfZ2xvYmFsW3RdPXt9KTooX2dsb2JhbFt0XXx8e30pW1BST1RPVFlQRV0scD1jP19jb3JlOl9jb3JlW3RdfHwoX2NvcmVbdF09e30pLGg9cFtQUk9UT1RZUEVdfHwocFtQUk9UT1RZUEVdPXt9KTtmb3IociBpbiBjJiYobj10KSxuKW89KChpPSFzJiZmJiZ2b2lkIDAhPT1mW3JdKT9mOm4pW3JdLGE9ZCYmaT9fY3R4KG8sX2dsb2JhbCk6bCYmImZ1bmN0aW9uIj09dHlwZW9mIG8/X2N0eChGdW5jdGlvbi5jYWxsLG8pOm8sZiYmX3JlZGVmaW5lKGYscixvLGUmJGV4cG9ydC5VKSxwW3JdIT1vJiZfaGlkZShwLHIsYSksbCYmaFtyXSE9byYmKGhbcl09byl9O19nbG9iYWwuY29yZT1fY29yZSwkZXhwb3J0LkY9MSwkZXhwb3J0Lkc9MiwkZXhwb3J0LlM9NCwkZXhwb3J0LlA9OCwkZXhwb3J0LkI9MTYsJGV4cG9ydC5XPTMyLCRleHBvcnQuVT02NCwkZXhwb3J0LlI9MTI4O3ZhciBfZXhwb3J0PSRleHBvcnQsdG9TdHJpbmckMT17fS50b1N0cmluZyxfY29mPWZ1bmN0aW9uKGUpe3JldHVybiB0b1N0cmluZyQxLmNhbGwoZSkuc2xpY2UoOCwtMSl9LF9pb2JqZWN0PU9iamVjdCgieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApP09iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIj09X2NvZihlKT9lLnNwbGl0KCIiKTpPYmplY3QoZSl9LF9kZWZpbmVkPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgIitlKTtyZXR1cm4gZX0sX3RvSW9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gX2lvYmplY3QoX2RlZmluZWQoZSkpfSxjZWlsPU1hdGguY2VpbCxmbG9vcj1NYXRoLmZsb29yLF90b0ludGVnZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGlzTmFOKGU9K2UpPzA6KDA8ZT9mbG9vcjpjZWlsKShlKX0sbWluPU1hdGgubWluLF90b0xlbmd0aD1mdW5jdGlvbihlKXtyZXR1cm4gMDxlP21pbihfdG9JbnRlZ2VyKGUpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9LG1heD1NYXRoLm1heCxtaW4kMT1NYXRoLm1pbixfdG9BYnNvbHV0ZUluZGV4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGU9X3RvSW50ZWdlcihlKSk8MD9tYXgoZSt0LDApOm1pbiQxKGUsdCl9LF9hcnJheUluY2x1ZGVzPWZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1fdG9Jb2JqZWN0KGUpLG89X3RvTGVuZ3RoKGkubGVuZ3RoKSxhPV90b0Fic29sdXRlSW5kZXgobixvKTtpZihzJiZ0IT10KXtmb3IoO2E8bzspaWYoKHI9aVthKytdKSE9cilyZXR1cm4hMH1lbHNlIGZvcig7YTxvO2ErKylpZigoc3x8YSBpbiBpKSYmaVthXT09PXQpcmV0dXJuIHN8fGF8fDA7cmV0dXJuIXMmJi0xfX0sX2xpYnJhcnk9ITEsX3NoYXJlZD1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXt2YXIgdD0iX19jb3JlLWpzX3NoYXJlZF9fIixuPV9nbG9iYWxbdF18fChfZ2xvYmFsW3RdPXt9KTsoZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5bZV18fChuW2VdPXZvaWQgMCE9PXQ/dDp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOl9jb3JlLnZlcnNpb24sbW9kZTpfbGlicmFyeT8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE4IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSksc2hhcmVkJDI9X3NoYXJlZCgia2V5cyIpLF9zaGFyZWRLZXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHNoYXJlZCQyW2VdfHwoc2hhcmVkJDJbZV09X3VpZChlKSl9LGFycmF5SW5kZXhPZj1fYXJyYXlJbmNsdWRlcyghMSksSUVfUFJPVE89X3NoYXJlZEtleSgiSUVfUFJPVE8iKSxfb2JqZWN0S2V5c0ludGVybmFsPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1fdG9Jb2JqZWN0KGUpLGk9MCxvPVtdO2ZvcihuIGluIHIpbiE9SUVfUFJPVE8mJl9oYXMocixuKSYmby5wdXNoKG4pO2Zvcig7dC5sZW5ndGg+aTspX2hhcyhyLG49dFtpKytdKSYmKH5hcnJheUluZGV4T2YobyxuKXx8by5wdXNoKG4pKTtyZXR1cm4gb30sX2VudW1CdWdLZXlzPSJjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YiLnNwbGl0KCIsIiksX29iamVjdEtleXM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3JldHVybiBfb2JqZWN0S2V5c0ludGVybmFsKGUsX2VudW1CdWdLZXlzKX0sZiQxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsX29iamVjdEdvcHM9e2Y6ZiQxfSxmJDI9e30ucHJvcGVydHlJc0VudW1lcmFibGUsX29iamVjdFBpZT17ZjpmJDJ9LF90b09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0KF9kZWZpbmVkKGUpKX0sJGFzc2lnbj1PYmplY3QuYXNzaWduLF9vYmplY3RBc3NpZ249ISRhc3NpZ258fF9mYWlscyhmdW5jdGlvbigpe3ZhciBlPXt9LHQ9e30sbj1TeW1ib2woKSxyPSJhYmNkZWZnaGlqa2xtbm9wcXJzdCI7cmV0dXJuIGVbbl09NyxyLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09ZX0pLDchPSRhc3NpZ24oe30sZSlbbl18fE9iamVjdC5rZXlzKCRhc3NpZ24oe30sdCkpLmpvaW4oIiIpIT1yfSk/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49YXJndW1lbnRzLHI9X3RvT2JqZWN0KGUpLGk9YXJndW1lbnRzLmxlbmd0aCxvPTEsYT1fb2JqZWN0R29wcy5mLHM9X29iamVjdFBpZS5mO288aTspZm9yKHZhciBjLHU9X2lvYmplY3QobltvKytdKSxsPWE/X29iamVjdEtleXModSkuY29uY2F0KGEodSkpOl9vYmplY3RLZXlzKHUpLGQ9bC5sZW5ndGgsZj0wO2Y8ZDspcy5jYWxsKHUsYz1sW2YrK10pJiYocltjXT11W2NdKTtyZXR1cm4gcn06JGFzc2lnbjtfZXhwb3J0KF9leHBvcnQuUytfZXhwb3J0LkYsIk9iamVjdCIse2Fzc2lnbjpfb2JqZWN0QXNzaWdufSk7dmFyIGFzc2lnbj1fY29yZS5PYmplY3QuYXNzaWduO09iamVjdC5zZXRQcm90b3R5cGVPZnx8KE9iamVjdC5zZXRQcm90b3R5cGVPZj1mdW5jdGlvbih0LG4pe3ZhciByO2Z1bmN0aW9uIGkoZSx0KXtyZXR1cm4gci5jYWxsKGUsdCksZX10cnl7KHI9dC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodC5wcm90b3R5cGUsbikuc2V0KS5jYWxsKHt9LG51bGwpfWNhdGNoKGUpe2lmKHQucHJvdG90eXBlIT09e31bbl0pcmV0dXJuO3I9ZnVuY3Rpb24oZSl7dGhpc1tuXT1lfSxpLnBvbHlmaWxsPWkoaSh7fSxudWxsKSx0LnByb3RvdHlwZSlpbnN0YW5jZW9mIHR9cmV0dXJuIGl9KE9iamVjdCwiX19wcm90b19fIikpO3ZhciBXWEVudmlyb25tZW50JDE9Z2xvYmFsLldYRW52aXJvbm1lbnQ7dm9pZCAwPT09V1hFbnZpcm9ubWVudCQxfHwiaU9TIiE9PVdYRW52aXJvbm1lbnQkMS5wbGF0Zm9ybXx8V1hFbnZpcm9ubWVudCQxLl9fZW5hYmxlX25hdGl2ZV9wcm9taXNlX198fChnbG9iYWwuUHJvbWlzZT12b2lkIDApO3ZhciBfd2tzPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PV9zaGFyZWQoIndrcyIpLG49X2dsb2JhbC5TeW1ib2wscj0iZnVuY3Rpb24iPT10eXBlb2YgbjsoZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfHwodFtlXT1yJiZuW2VdfHwocj9uOl91aWQpKCJTeW1ib2wuIitlKSl9KS5zdG9yZT10fSksVEFHPV93a3MoInRvU3RyaW5nVGFnIiksQVJHPSJBcmd1bWVudHMiPT1fY29mKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSksdHJ5R2V0PWZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiBlW3RdfWNhdGNoKGUpe319LF9jbGFzc29mPWZ1bmN0aW9uKGUpe3ZhciB0LG4scjtyZXR1cm4gdm9pZCAwPT09ZT8iVW5kZWZpbmVkIjpudWxsPT09ZT8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPXRyeUdldCh0PU9iamVjdChlKSxUQUcpKT9uOkFSRz9fY29mKHQpOiJPYmplY3QiPT0ocj1fY29mKHQpKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY2FsbGVlPyJBcmd1bWVudHMiOnJ9LHRlc3Q9e307dGVzdFtfd2tzKCJ0b1N0cmluZ1RhZyIpXT0ieiIsdGVzdCsiIiE9IltvYmplY3Qgel0iJiZfcmVkZWZpbmUoT2JqZWN0LnByb3RvdHlwZSwidG9TdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgIitfY2xhc3NvZih0aGlzKSsiXSJ9LCEwKTt2YXIgX3N0cmluZ0F0PWZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1TdHJpbmcoX2RlZmluZWQoZSkpLG89X3RvSW50ZWdlcih0KSxhPWkubGVuZ3RoO3JldHVybiBvPDB8fGE8PW8/cz8iIjp2b2lkIDA6KG49aS5jaGFyQ29kZUF0KG8pKTw1NTI5Nnx8NTYzMTk8bnx8bysxPT09YXx8KHI9aS5jaGFyQ29kZUF0KG8rMSkpPDU2MzIwfHw1NzM0MzxyP3M/aS5jaGFyQXQobyk6bjpzP2kuc2xpY2UobyxvKzIpOnItNTYzMjArKG4tNTUyOTY8PDEwKSs2NTUzNn19LF9pdGVyYXRvcnM9e30sX29iamVjdERwcz1fZGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24oZSx0KXtfYW5PYmplY3QoZSk7Zm9yKHZhciBuLHI9X29iamVjdEtleXModCksaT1yLmxlbmd0aCxvPTA7bzxpOylfb2JqZWN0RHAuZihlLG49cltvKytdLHRbbl0pO3JldHVybiBlfSxkb2N1bWVudCQyPV9nbG9iYWwuZG9jdW1lbnQsX2h0bWw9ZG9jdW1lbnQkMiYmZG9jdW1lbnQkMi5kb2N1bWVudEVsZW1lbnQsSUVfUFJPVE8kMT1fc2hhcmVkS2V5KCJJRV9QUk9UTyIpLEVtcHR5PWZ1bmN0aW9uKCl7fSxQUk9UT1RZUEUkMT0icHJvdG90eXBlIixjcmVhdGVEaWN0PWZ1bmN0aW9uKCl7dmFyIGUsdD1fZG9tQ3JlYXRlKCJpZnJhbWUiKSxuPV9lbnVtQnVnS2V5cy5sZW5ndGg7Zm9yKHQuc3R5bGUuZGlzcGxheT0ibm9uZSIsX2h0bWwuYXBwZW5kQ2hpbGQodCksdC5zcmM9ImphdmFzY3JpcHQ6IiwoZT10LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSxlLndyaXRlKCI8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PFwvc2NyaXB0PiIpLGUuY2xvc2UoKSxjcmVhdGVEaWN0PWUuRjtuLS07KWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRSQxXVtfZW51bUJ1Z0tleXNbbl1dO3JldHVybiBjcmVhdGVEaWN0KCl9LF9vYmplY3RDcmVhdGU9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gbnVsbCE9PWU/KEVtcHR5W1BST1RPVFlQRSQxXT1fYW5PYmplY3QoZSksbj1uZXcgRW1wdHksRW1wdHlbUFJPVE9UWVBFJDFdPW51bGwsbltJRV9QUk9UTyQxXT1lKTpuPWNyZWF0ZURpY3QoKSx2b2lkIDA9PT10P246X29iamVjdERwcyhuLHQpfSxkZWY9X29iamVjdERwLmYsVEFHJDE9X3drcygidG9TdHJpbmdUYWciKSxfc2V0VG9TdHJpbmdUYWc9ZnVuY3Rpb24oZSx0LG4pe2UmJiFfaGFzKGU9bj9lOmUucHJvdG90eXBlLFRBRyQxKSYmZGVmKGUsVEFHJDEse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTp0fSl9LEl0ZXJhdG9yUHJvdG90eXBlPXt9O19oaWRlKEl0ZXJhdG9yUHJvdG90eXBlLF93a3MoIml0ZXJhdG9yIiksZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3ZhciBfaXRlckNyZWF0ZT1mdW5jdGlvbihlLHQsbil7ZS5wcm90b3R5cGU9X29iamVjdENyZWF0ZShJdGVyYXRvclByb3RvdHlwZSx7bmV4dDpfcHJvcGVydHlEZXNjKDEsbil9KSxfc2V0VG9TdHJpbmdUYWcoZSx0KyIgSXRlcmF0b3IiKX0sSUVfUFJPVE8kMj1fc2hhcmVkS2V5KCJJRV9QUk9UTyIpLE9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGUsX29iamVjdEdwbz1PYmplY3QuZ2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKGUpe3JldHVybiBlPV90b09iamVjdChlKSxfaGFzKGUsSUVfUFJPVE8kMik/ZVtJRV9QUk9UTyQyXToiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3RvciYmZSBpbnN0YW5jZW9mIGUuY29uc3RydWN0b3I/ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6ZSBpbnN0YW5jZW9mIE9iamVjdD9PYmplY3RQcm90bzpudWxsfSxJVEVSQVRPUj1fd2tzKCJpdGVyYXRvciIpLEJVR0dZPSEoW10ua2V5cyYmIm5leHQiaW5bXS5rZXlzKCkpLEZGX0lURVJBVE9SPSJAQGl0ZXJhdG9yIixLRVlTPSJrZXlzIixWQUxVRVM9InZhbHVlcyIscmV0dXJuVGhpcz1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxfaXRlckRlZmluZT1mdW5jdGlvbihlLHQsbixyLGksbyxhKXtfaXRlckNyZWF0ZShuLHQscik7dmFyIHMsYyx1LGw9ZnVuY3Rpb24oZSl7aWYoIUJVR0dZJiZlIGluIGgpcmV0dXJuIGhbZV07c3dpdGNoKGUpe2Nhc2UgS0VZUzpjYXNlIFZBTFVFUzpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyxlKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMsZSl9fSxkPXQrIiBJdGVyYXRvciIsZj1pPT1WQUxVRVMscD0hMSxoPWUucHJvdG90eXBlLHY9aFtJVEVSQVRPUl18fGhbRkZfSVRFUkFUT1JdfHxpJiZoW2ldLGc9dnx8bChpKSxtPWk/Zj9sKCJlbnRyaWVzIik6Zzp2b2lkIDAseT0iQXJyYXkiPT10JiZoLmVudHJpZXN8fHY7aWYoeSYmKHU9X29iamVjdEdwbyh5LmNhbGwobmV3IGUpKSkhPT1PYmplY3QucHJvdG90eXBlJiZ1Lm5leHQmJihfc2V0VG9TdHJpbmdUYWcodSxkLCEwKSxfbGlicmFyeXx8ImZ1bmN0aW9uIj09dHlwZW9mIHVbSVRFUkFUT1JdfHxfaGlkZSh1LElURVJBVE9SLHJldHVyblRoaXMpKSxmJiZ2JiZ2Lm5hbWUhPT1WQUxVRVMmJihwPSEwLGc9ZnVuY3Rpb24oKXtyZXR1cm4gdi5jYWxsKHRoaXMpfSksX2xpYnJhcnkmJiFhfHwhQlVHR1kmJiFwJiZoW0lURVJBVE9SXXx8X2hpZGUoaCxJVEVSQVRPUixnKSxfaXRlcmF0b3JzW3RdPWcsX2l0ZXJhdG9yc1tkXT1yZXR1cm5UaGlzLGkpaWYocz17dmFsdWVzOmY/ZzpsKFZBTFVFUyksa2V5czpvP2c6bChLRVlTKSxlbnRyaWVzOm19LGEpZm9yKGMgaW4gcyljIGluIGh8fF9yZWRlZmluZShoLGMsc1tjXSk7ZWxzZSBfZXhwb3J0KF9leHBvcnQuUCtfZXhwb3J0LkYqKEJVR0dZfHxwKSx0LHMpO3JldHVybiBzfSwkYXQ9X3N0cmluZ0F0KCEwKTtfaXRlckRlZmluZShTdHJpbmcsIlN0cmluZyIsZnVuY3Rpb24oZSl7dGhpcy5fdD1TdHJpbmcoZSksdGhpcy5faT0wfSxmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5fdCxuPXRoaXMuX2k7cmV0dXJuIG4+PXQubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KGU9JGF0KHQsbiksdGhpcy5faSs9ZS5sZW5ndGgse3ZhbHVlOmUsZG9uZTohMX0pfSk7dmFyIFVOU0NPUEFCTEVTPV93a3MoInVuc2NvcGFibGVzIiksQXJyYXlQcm90bz1BcnJheS5wcm90b3R5cGU7bnVsbD09QXJyYXlQcm90b1tVTlNDT1BBQkxFU10mJl9oaWRlKEFycmF5UHJvdG8sVU5TQ09QQUJMRVMse30pO3ZhciBfYWRkVG9VbnNjb3BhYmxlcz1mdW5jdGlvbihlKXtBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtlXT0hMH0sX2l0ZXJTdGVwPWZ1bmN0aW9uKGUsdCl7cmV0dXJue3ZhbHVlOnQsZG9uZTohIWV9fSxlczZfYXJyYXlfaXRlcmF0b3I9X2l0ZXJEZWZpbmUoQXJyYXksIkFycmF5IixmdW5jdGlvbihlLHQpe3RoaXMuX3Q9X3RvSW9iamVjdChlKSx0aGlzLl9pPTAsdGhpcy5faz10fSxmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3QsdD10aGlzLl9rLG49dGhpcy5faSsrO3JldHVybiFlfHxuPj1lLmxlbmd0aD8odGhpcy5fdD12b2lkIDAsX2l0ZXJTdGVwKDEpKTpfaXRlclN0ZXAoMCwia2V5cyI9PXQ/bjoidmFsdWVzIj09dD9lW25dOltuLGVbbl1dKX0sInZhbHVlcyIpO19pdGVyYXRvcnMuQXJndW1lbnRzPV9pdGVyYXRvcnMuQXJyYXksX2FkZFRvVW5zY29wYWJsZXMoImtleXMiKSxfYWRkVG9VbnNjb3BhYmxlcygidmFsdWVzIiksX2FkZFRvVW5zY29wYWJsZXMoImVudHJpZXMiKTtmb3IodmFyIElURVJBVE9SJDE9X3drcygiaXRlcmF0b3IiKSxUT19TVFJJTkdfVEFHPV93a3MoInRvU3RyaW5nVGFnIiksQXJyYXlWYWx1ZXM9X2l0ZXJhdG9ycy5BcnJheSxET01JdGVyYWJsZXM9e0NTU1J1bGVMaXN0OiEwLENTU1N0eWxlRGVjbGFyYXRpb246ITEsQ1NTVmFsdWVMaXN0OiExLENsaWVudFJlY3RMaXN0OiExLERPTVJlY3RMaXN0OiExLERPTVN0cmluZ0xpc3Q6ITEsRE9NVG9rZW5MaXN0OiEwLERhdGFUcmFuc2Zlckl0ZW1MaXN0OiExLEZpbGVMaXN0OiExLEhUTUxBbGxDb2xsZWN0aW9uOiExLEhUTUxDb2xsZWN0aW9uOiExLEhUTUxGb3JtRWxlbWVudDohMSxIVE1MU2VsZWN0RWxlbWVudDohMSxNZWRpYUxpc3Q6ITAsTWltZVR5cGVBcnJheTohMSxOYW1lZE5vZGVNYXA6ITEsTm9kZUxpc3Q6ITAsUGFpbnRSZXF1ZXN0TGlzdDohMSxQbHVnaW46ITEsUGx1Z2luQXJyYXk6ITEsU1ZHTGVuZ3RoTGlzdDohMSxTVkdOdW1iZXJMaXN0OiExLFNWR1BhdGhTZWdMaXN0OiExLFNWR1BvaW50TGlzdDohMSxTVkdTdHJpbmdMaXN0OiExLFNWR1RyYW5zZm9ybUxpc3Q6ITEsU291cmNlQnVmZmVyTGlzdDohMSxTdHlsZVNoZWV0TGlzdDohMCxUZXh0VHJhY2tDdWVMaXN0OiExLFRleHRUcmFja0xpc3Q6ITEsVG91Y2hMaXN0OiExfSxjb2xsZWN0aW9ucz1fb2JqZWN0S2V5cyhET01JdGVyYWJsZXMpLGk9MDtpPGNvbGxlY3Rpb25zLmxlbmd0aDtpKyspe3ZhciBOQU1FPWNvbGxlY3Rpb25zW2ldLGV4cGxpY2l0PURPTUl0ZXJhYmxlc1tOQU1FXSxDb2xsZWN0aW9uPV9nbG9iYWxbTkFNRV0scHJvdG89Q29sbGVjdGlvbiYmQ29sbGVjdGlvbi5wcm90b3R5cGUsa2V5O2lmKHByb3RvJiYocHJvdG9bSVRFUkFUT1IkMV18fF9oaWRlKHByb3RvLElURVJBVE9SJDEsQXJyYXlWYWx1ZXMpLHByb3RvW1RPX1NUUklOR19UQUddfHxfaGlkZShwcm90byxUT19TVFJJTkdfVEFHLE5BTUUpLF9pdGVyYXRvcnNbTkFNRV09QXJyYXlWYWx1ZXMsZXhwbGljaXQpKWZvcihrZXkgaW4gZXM2X2FycmF5X2l0ZXJhdG9yKXByb3RvW2tleV18fF9yZWRlZmluZShwcm90byxrZXksZXM2X2FycmF5X2l0ZXJhdG9yW2tleV0sITApfXZhciBfYW5JbnN0YW5jZT1mdW5jdGlvbihlLHQsbixyKXtpZighKGUgaW5zdGFuY2VvZiB0KXx8dm9pZCAwIT09ciYmciBpbiBlKXRocm93IFR5cGVFcnJvcihuKyI6IGluY29ycmVjdCBpbnZvY2F0aW9uISIpO3JldHVybiBlfSxfaXRlckNhbGw9ZnVuY3Rpb24odCxlLG4scil7dHJ5e3JldHVybiByP2UoX2FuT2JqZWN0KG4pWzBdLG5bMV0pOmUobil9Y2F0Y2goZSl7dmFyIGk9dC5yZXR1cm47dGhyb3cgdm9pZCAwIT09aSYmX2FuT2JqZWN0KGkuY2FsbCh0KSksZX19LElURVJBVE9SJDI9X3drcygiaXRlcmF0b3IiKSxBcnJheVByb3RvJDE9QXJyYXkucHJvdG90eXBlLF9pc0FycmF5SXRlcj1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZSYmKF9pdGVyYXRvcnMuQXJyYXk9PT1lfHxBcnJheVByb3RvJDFbSVRFUkFUT1IkMl09PT1lKX0sSVRFUkFUT1IkMz1fd2tzKCJpdGVyYXRvciIpLGNvcmVfZ2V0SXRlcmF0b3JNZXRob2Q9X2NvcmUuZ2V0SXRlcmF0b3JNZXRob2Q9ZnVuY3Rpb24oZSl7aWYobnVsbCE9ZSlyZXR1cm4gZVtJVEVSQVRPUiQzXXx8ZVsiQEBpdGVyYXRvciJdfHxfaXRlcmF0b3JzW19jbGFzc29mKGUpXX0sX2Zvck9mPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciBmPXt9LHA9e30sdD1lLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsYyx1PWk/ZnVuY3Rpb24oKXtyZXR1cm4gZX06Y29yZV9nZXRJdGVyYXRvck1ldGhvZChlKSxsPV9jdHgobixyLHQ/MjoxKSxkPTA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHUpdGhyb3cgVHlwZUVycm9yKGUrIiBpcyBub3QgaXRlcmFibGUhIik7aWYoX2lzQXJyYXlJdGVyKHUpKXtmb3Iobz1fdG9MZW5ndGgoZS5sZW5ndGgpO2Q8bztkKyspaWYoKGM9dD9sKF9hbk9iamVjdChhPWVbZF0pWzBdLGFbMV0pOmwoZVtkXSkpPT09Znx8Yz09PXApcmV0dXJuIGN9ZWxzZSBmb3Iocz11LmNhbGwoZSk7IShhPXMubmV4dCgpKS5kb25lOylpZigoYz1faXRlckNhbGwocyxsLGEudmFsdWUsdCkpPT09Znx8Yz09PXApcmV0dXJuIGN9O3QuQlJFQUs9Zix0LlJFVFVSTj1wfSksU1BFQ0lFUz1fd2tzKCJzcGVjaWVzIiksX3NwZWNpZXNDb25zdHJ1Y3Rvcj1mdW5jdGlvbihlLHQpe3ZhciBuLHI9X2FuT2JqZWN0KGUpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1yfHxudWxsPT0obj1fYW5PYmplY3QocilbU1BFQ0lFU10pP3Q6X2FGdW5jdGlvbihuKX0sX2ludm9rZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dm9pZCAwPT09bjtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gcj9lKCk6ZS5jYWxsKG4pO2Nhc2UgMTpyZXR1cm4gcj9lKHRbMF0pOmUuY2FsbChuLHRbMF0pO2Nhc2UgMjpyZXR1cm4gcj9lKHRbMF0sdFsxXSk6ZS5jYWxsKG4sdFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIHI/ZSh0WzBdLHRbMV0sdFsyXSk6ZS5jYWxsKG4sdFswXSx0WzFdLHRbMl0pO2Nhc2UgNDpyZXR1cm4gcj9lKHRbMF0sdFsxXSx0WzJdLHRbM10pOmUuY2FsbChuLHRbMF0sdFsxXSx0WzJdLHRbM10pfXJldHVybiBlLmFwcGx5KG4sdCl9LHByb2Nlc3MkMj1fZ2xvYmFsLnByb2Nlc3Msc2V0VGFzaz1fZ2xvYmFsLnNldEltbWVkaWF0ZSxjbGVhclRhc2s9X2dsb2JhbC5jbGVhckltbWVkaWF0ZSxNZXNzYWdlQ2hhbm5lbD1fZ2xvYmFsLk1lc3NhZ2VDaGFubmVsLERpc3BhdGNoPV9nbG9iYWwuRGlzcGF0Y2gsY291bnRlcj0wLHF1ZXVlPXt9LE9OUkVBRFlTVEFURUNIQU5HRT0ib25yZWFkeXN0YXRlY2hhbmdlIixkZWZlcixjaGFubmVsJDEscG9ydCxydW49ZnVuY3Rpb24oKXt2YXIgZT0rdGhpcztpZihxdWV1ZS5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIHQ9cXVldWVbZV07ZGVsZXRlIHF1ZXVlW2VdLHQoKX19LGxpc3RlbmVyPWZ1bmN0aW9uKGUpe3J1bi5jYWxsKGUuZGF0YSl9O3NldFRhc2smJmNsZWFyVGFza3x8KHNldFRhc2s9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWFyZ3VtZW50cyxuPVtdLHI9MTthcmd1bWVudHMubGVuZ3RoPnI7KW4ucHVzaCh0W3IrK10pO3JldHVybiBxdWV1ZVsrK2NvdW50ZXJdPWZ1bmN0aW9uKCl7X2ludm9rZSgiZnVuY3Rpb24iPT10eXBlb2YgZT9lOkZ1bmN0aW9uKGUpLG4pfSxkZWZlcihjb3VudGVyKSxjb3VudGVyfSxjbGVhclRhc2s9ZnVuY3Rpb24oZSl7ZGVsZXRlIHF1ZXVlW2VdfSwicHJvY2VzcyI9PV9jb2YocHJvY2VzcyQyKT9kZWZlcj1mdW5jdGlvbihlKXtwcm9jZXNzJDIubmV4dFRpY2soX2N0eChydW4sZSwxKSl9OkRpc3BhdGNoJiZEaXNwYXRjaC5ub3c/ZGVmZXI9ZnVuY3Rpb24oZSl7RGlzcGF0Y2gubm93KF9jdHgocnVuLGUsMSkpfTpNZXNzYWdlQ2hhbm5lbD8oY2hhbm5lbCQxPW5ldyBNZXNzYWdlQ2hhbm5lbCxwb3J0PWNoYW5uZWwkMS5wb3J0MixjaGFubmVsJDEucG9ydDEub25tZXNzYWdlPWxpc3RlbmVyLGRlZmVyPV9jdHgocG9ydC5wb3N0TWVzc2FnZSxwb3J0LDEpKTpfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBwb3N0TWVzc2FnZSYmIV9nbG9iYWwuaW1wb3J0U2NyaXB0cz8oZGVmZXI9ZnVuY3Rpb24oZSl7X2dsb2JhbC5wb3N0TWVzc2FnZShlKyIiLCIqIil9LF9nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbGlzdGVuZXIsITEpKTpkZWZlcj1PTlJFQURZU1RBVEVDSEFOR0UgaW4gX2RvbUNyZWF0ZSgic2NyaXB0Iik/ZnVuY3Rpb24oZSl7X2h0bWwuYXBwZW5kQ2hpbGQoX2RvbUNyZWF0ZSgic2NyaXB0IikpW09OUkVBRFlTVEFURUNIQU5HRV09ZnVuY3Rpb24oKXtfaHRtbC5yZW1vdmVDaGlsZCh0aGlzKSxydW4uY2FsbChlKX19OmZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoX2N0eChydW4sZSwxKSwwKX0pO3ZhciBfdGFzaz17c2V0OnNldFRhc2ssY2xlYXI6Y2xlYXJUYXNrfSxtYWNyb3Rhc2s9X3Rhc2suc2V0LE9ic2VydmVyPV9nbG9iYWwuTXV0YXRpb25PYnNlcnZlcnx8X2dsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHByb2Nlc3MkMz1fZ2xvYmFsLnByb2Nlc3MsUHJvbWlzZSQxPV9nbG9iYWwuUHJvbWlzZSxpc05vZGUkMT0icHJvY2VzcyI9PV9jb2YocHJvY2VzcyQzKSxfbWljcm90YXNrPWZ1bmN0aW9uKCl7dmFyIG4scixpLGU9ZnVuY3Rpb24oKXt2YXIgZSx0O2Zvcihpc05vZGUkMSYmKGU9cHJvY2VzcyQzLmRvbWFpbikmJmUuZXhpdCgpO247KXt0PW4uZm4sbj1uLm5leHQ7dHJ5e3QoKX1jYXRjaChlKXt0aHJvdyBuP2koKTpyPXZvaWQgMCxlfX1yPXZvaWQgMCxlJiZlLmVudGVyKCl9O2lmKGlzTm9kZSQxKWk9ZnVuY3Rpb24oKXtwcm9jZXNzJDMubmV4dFRpY2soZSl9O2Vsc2UgaWYoIU9ic2VydmVyfHxfZ2xvYmFsLm5hdmlnYXRvciYmX2dsb2JhbC5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSlpZihQcm9taXNlJDEmJlByb21pc2UkMS5yZXNvbHZlKXt2YXIgdD1Qcm9taXNlJDEucmVzb2x2ZSh2b2lkIDApO2k9ZnVuY3Rpb24oKXt0LnRoZW4oZSl9fWVsc2UgaT1mdW5jdGlvbigpe21hY3JvdGFzay5jYWxsKF9nbG9iYWwsZSl9O2Vsc2V7dmFyIG89ITAsYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7bmV3IE9ic2VydmVyKGUpLm9ic2VydmUoYSx7Y2hhcmFjdGVyRGF0YTohMH0pLGk9ZnVuY3Rpb24oKXthLmRhdGE9bz0hb319cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXtmbjplLG5leHQ6dm9pZCAwfTtyJiYoci5uZXh0PXQpLG58fChuPXQsaSgpKSxyPXR9fTtmdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShlKXt2YXIgbixyO3RoaXMucHJvbWlzZT1uZXcgZShmdW5jdGlvbihlLHQpe2lmKHZvaWQgMCE9PW58fHZvaWQgMCE9PXIpdGhyb3cgVHlwZUVycm9yKCJCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpO249ZSxyPXR9KSx0aGlzLnJlc29sdmU9X2FGdW5jdGlvbihuKSx0aGlzLnJlamVjdD1fYUZ1bmN0aW9uKHIpfXZhciBmJDM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShlKX0sX25ld1Byb21pc2VDYXBhYmlsaXR5PXtmOmYkM30sX3BlcmZvcm09ZnVuY3Rpb24oZSl7dHJ5e3JldHVybntlOiExLHY6ZSgpfX1jYXRjaChlKXtyZXR1cm57ZTohMCx2OmV9fX0sbmF2aWdhdG9yJDE9X2dsb2JhbC5uYXZpZ2F0b3IsX3VzZXJBZ2VudD1uYXZpZ2F0b3IkMSYmbmF2aWdhdG9yJDEudXNlckFnZW50fHwiIixfcHJvbWlzZVJlc29sdmU9ZnVuY3Rpb24oZSx0KXtpZihfYW5PYmplY3QoZSksX2lzT2JqZWN0KHQpJiZ0LmNvbnN0cnVjdG9yPT09ZSlyZXR1cm4gdDt2YXIgbj1fbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihlKTtyZXR1cm4oMCxuLnJlc29sdmUpKHQpLG4ucHJvbWlzZX0sX3JlZGVmaW5lQWxsPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIgaW4gdClfcmVkZWZpbmUoZSxyLHRbcl0sbik7cmV0dXJuIGV9LFNQRUNJRVMkMT1fd2tzKCJzcGVjaWVzIiksX3NldFNwZWNpZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9X2dsb2JhbFtlXTtfZGVzY3JpcHRvcnMmJnQmJiF0W1NQRUNJRVMkMV0mJl9vYmplY3REcC5mKHQsU1BFQ0lFUyQxLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9LElURVJBVE9SJDQ9X3drcygiaXRlcmF0b3IiKSxTQUZFX0NMT1NJTkc9ITE7dHJ5e3ZhciByaXRlcj1bN11bSVRFUkFUT1IkNF0oKTtyaXRlci5yZXR1cm49ZnVuY3Rpb24oKXtTQUZFX0NMT1NJTkc9ITB9fWNhdGNoKGUpe312YXIgX2l0ZXJEZXRlY3Q9ZnVuY3Rpb24oZSx0KXtpZighdCYmIVNBRkVfQ0xPU0lORylyZXR1cm4hMTt2YXIgbj0hMTt0cnl7dmFyIHI9WzddLGk9cltJVEVSQVRPUiQ0XSgpO2kubmV4dD1mdW5jdGlvbigpe3JldHVybntkb25lOm49ITB9fSxyW0lURVJBVE9SJDRdPWZ1bmN0aW9uKCl7cmV0dXJuIGl9LGUocil9Y2F0Y2goZSl7fXJldHVybiBufSx0YXNrPV90YXNrLnNldCxtaWNyb3Rhc2s9X21pY3JvdGFzaygpLFBST01JU0U9IlByb21pc2UiLFR5cGVFcnJvciQxPV9nbG9iYWwuVHlwZUVycm9yLHByb2Nlc3MkMT1fZ2xvYmFsLnByb2Nlc3MsdmVyc2lvbnM9cHJvY2VzcyQxJiZwcm9jZXNzJDEudmVyc2lvbnMsdjg9dmVyc2lvbnMmJnZlcnNpb25zLnY4fHwiIiwkUHJvbWlzZT1fZ2xvYmFsW1BST01JU0VdLGlzTm9kZT0icHJvY2VzcyI9PV9jbGFzc29mKHByb2Nlc3MkMSksZW1wdHk9ZnVuY3Rpb24oKXt9LEludGVybmFsLG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSxPd25Qcm9taXNlQ2FwYWJpbGl0eSxXcmFwcGVyLG5ld1Byb21pc2VDYXBhYmlsaXR5PW5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eT1fbmV3UHJvbWlzZUNhcGFiaWxpdHkuZixVU0VfTkFUSVZFPSEhZnVuY3Rpb24oKXt0cnl7dmFyIGU9JFByb21pc2UucmVzb2x2ZSgxKSx0PShlLmNvbnN0cnVjdG9yPXt9KVtfd2tzKCJzcGVjaWVzIildPWZ1bmN0aW9uKGUpe2UoZW1wdHksZW1wdHkpfTtyZXR1cm4oaXNOb2RlfHwiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50KSYmZS50aGVuKGVtcHR5KWluc3RhbmNlb2YgdCYmMCE9PXY4LmluZGV4T2YoIjYuNiIpJiYtMT09PV91c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lLzY2Iil9Y2F0Y2goZSl7fX0oKSxpc1RoZW5hYmxlPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiEoIV9pc09iamVjdChlKXx8ImZ1bmN0aW9uIiE9dHlwZW9mKHQ9ZS50aGVuKSkmJnR9LG5vdGlmeT1mdW5jdGlvbihsLG4pe2lmKCFsLl9uKXtsLl9uPSEwO3ZhciByPWwuX2M7bWljcm90YXNrKGZ1bmN0aW9uKCl7Zm9yKHZhciBjPWwuX3YsdT0xPT1sLl9zLGU9MCx0PWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPXU/ZS5vazplLmZhaWwsbz1lLnJlc29sdmUsYT1lLnJlamVjdCxzPWUuZG9tYWluO3RyeXtpPyh1fHwoMj09bC5faCYmb25IYW5kbGVVbmhhbmRsZWQobCksbC5faD0xKSwhMD09PWk/dD1jOihzJiZzLmVudGVyKCksdD1pKGMpLHMmJihzLmV4aXQoKSxyPSEwKSksdD09PWUucHJvbWlzZT9hKFR5cGVFcnJvciQxKCJQcm9taXNlLWNoYWluIGN5Y2xlIikpOihuPWlzVGhlbmFibGUodCkpP24uY2FsbCh0LG8sYSk6byh0KSk6YShjKX1jYXRjaChlKXtzJiYhciYmcy5leGl0KCksYShlKX19O3IubGVuZ3RoPmU7KXQocltlKytdKTtsLl9jPVtdLGwuX249ITEsbiYmIWwuX2gmJm9uVW5oYW5kbGVkKGwpfSl9fSxvblVuaGFuZGxlZD1mdW5jdGlvbihvKXt0YXNrLmNhbGwoX2dsb2JhbCxmdW5jdGlvbigpe3ZhciBlLHQsbixyPW8uX3YsaT1pc1VuaGFuZGxlZChvKTtpZihpJiYoZT1fcGVyZm9ybShmdW5jdGlvbigpe2lzTm9kZT9wcm9jZXNzJDEuZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixyLG8pOih0PV9nbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pP3Qoe3Byb21pc2U6byxyZWFzb246cn0pOihuPV9nbG9iYWwuY29uc29sZSkmJm4uZXJyb3ImJm4uZXJyb3IoIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiIscil9KSxvLl9oPWlzTm9kZXx8aXNVbmhhbmRsZWQobyk/MjoxKSxvLl9hPXZvaWQgMCxpJiZlLmUpdGhyb3cgZS52fSl9LGlzVW5oYW5kbGVkPWZ1bmN0aW9uKGUpe3JldHVybiAxIT09ZS5faCYmMD09PShlLl9hfHxlLl9jKS5sZW5ndGh9LG9uSGFuZGxlVW5oYW5kbGVkPWZ1bmN0aW9uKHQpe3Rhc2suY2FsbChfZ2xvYmFsLGZ1bmN0aW9uKCl7dmFyIGU7aXNOb2RlP3Byb2Nlc3MkMS5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTooZT1fZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkmJmUoe3Byb21pc2U6dCxyZWFzb246dC5fdn0pfSl9LCRyZWplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0Ll9kfHwodC5fZD0hMCwodD10Ll93fHx0KS5fdj1lLHQuX3M9Mix0Ll9hfHwodC5fYT10Ll9jLnNsaWNlKCkpLG5vdGlmeSh0LCEwKSl9LCRyZXNvbHZlPWZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcztpZighci5fZCl7ci5fZD0hMCxyPXIuX3d8fHI7dHJ5e2lmKHI9PT1lKXRocm93IFR5cGVFcnJvciQxKCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZiIpOyhuPWlzVGhlbmFibGUoZSkpP21pY3JvdGFzayhmdW5jdGlvbigpe3ZhciB0PXtfdzpyLF9kOiExfTt0cnl7bi5jYWxsKGUsX2N0eCgkcmVzb2x2ZSx0LDEpLF9jdHgoJHJlamVjdCx0LDEpKX1jYXRjaChlKXskcmVqZWN0LmNhbGwodCxlKX19KTooci5fdj1lLHIuX3M9MSxub3RpZnkociwhMSkpfWNhdGNoKGUpeyRyZWplY3QuY2FsbCh7X3c6cixfZDohMX0sZSl9fX07VVNFX05BVElWRXx8KCRQcm9taXNlPWZ1bmN0aW9uKGUpe19hbkluc3RhbmNlKHRoaXMsJFByb21pc2UsUFJPTUlTRSwiX2giKSxfYUZ1bmN0aW9uKGUpLEludGVybmFsLmNhbGwodGhpcyk7dHJ5e2UoX2N0eCgkcmVzb2x2ZSx0aGlzLDEpLF9jdHgoJHJlamVjdCx0aGlzLDEpKX1jYXRjaChlKXskcmVqZWN0LmNhbGwodGhpcyxlKX19LEludGVybmFsPWZ1bmN0aW9uKGUpe3RoaXMuX2M9W10sdGhpcy5fYT12b2lkIDAsdGhpcy5fcz0wLHRoaXMuX2Q9ITEsdGhpcy5fdj12b2lkIDAsdGhpcy5faD0wLHRoaXMuX249ITF9LEludGVybmFsLnByb3RvdHlwZT1fcmVkZWZpbmVBbGwoJFByb21pc2UucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3UHJvbWlzZUNhcGFiaWxpdHkoX3NwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCRQcm9taXNlKSk7cmV0dXJuIG4ub2s9ImZ1bmN0aW9uIiE9dHlwZW9mIGV8fGUsbi5mYWlsPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LG4uZG9tYWluPWlzTm9kZT9wcm9jZXNzJDEuZG9tYWluOnZvaWQgMCx0aGlzLl9jLnB1c2gobiksdGhpcy5fYSYmdGhpcy5fYS5wdXNoKG4pLHRoaXMuX3MmJm5vdGlmeSh0aGlzLCExKSxuLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLGUpfX0pLE93blByb21pc2VDYXBhYmlsaXR5PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IEludGVybmFsO3RoaXMucHJvbWlzZT1lLHRoaXMucmVzb2x2ZT1fY3R4KCRyZXNvbHZlLGUsMSksdGhpcy5yZWplY3Q9X2N0eCgkcmVqZWN0LGUsMSl9LF9uZXdQcm9taXNlQ2FwYWJpbGl0eS5mPW5ld1Byb21pc2VDYXBhYmlsaXR5PWZ1bmN0aW9uKGUpe3JldHVybiBlPT09JFByb21pc2V8fGU9PT1XcmFwcGVyP25ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShlKTpuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoZSl9KSxfZXhwb3J0KF9leHBvcnQuRytfZXhwb3J0LlcrX2V4cG9ydC5GKiFVU0VfTkFUSVZFLHtQcm9taXNlOiRQcm9taXNlfSksX3NldFRvU3RyaW5nVGFnKCRQcm9taXNlLFBST01JU0UpLF9zZXRTcGVjaWVzKFBST01JU0UpLFdyYXBwZXI9X2NvcmVbUFJPTUlTRV0sX2V4cG9ydChfZXhwb3J0LlMrX2V4cG9ydC5GKiFVU0VfTkFUSVZFLFBST01JU0Use3JlamVjdDpmdW5jdGlvbihlKXt2YXIgdD1uZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtyZXR1cm4oMCx0LnJlamVjdCkoZSksdC5wcm9taXNlfX0pLF9leHBvcnQoX2V4cG9ydC5TK19leHBvcnQuRiooX2xpYnJhcnl8fCFVU0VfTkFUSVZFKSxQUk9NSVNFLHtyZXNvbHZlOmZ1bmN0aW9uKGUpe3JldHVybiBfcHJvbWlzZVJlc29sdmUoX2xpYnJhcnkmJnRoaXM9PT1XcmFwcGVyPyRQcm9taXNlOnRoaXMsZSl9fSksX2V4cG9ydChfZXhwb3J0LlMrX2V4cG9ydC5GKiEoVVNFX05BVElWRSYmX2l0ZXJEZXRlY3QoZnVuY3Rpb24oZSl7JFByb21pc2UuYWxsKGUpLmNhdGNoKGVtcHR5KX0pKSxQUk9NSVNFLHthbGw6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcyx0PW5ld1Byb21pc2VDYXBhYmlsaXR5KGEpLHM9dC5yZXNvbHZlLGM9dC5yZWplY3Qsbj1fcGVyZm9ybShmdW5jdGlvbigpe3ZhciByPVtdLGk9MCxvPTE7X2Zvck9mKGUsITEsZnVuY3Rpb24oZSl7dmFyIHQ9aSsrLG49ITE7ci5wdXNoKHZvaWQgMCksbysrLGEucmVzb2x2ZShlKS50aGVuKGZ1bmN0aW9uKGUpe258fChuPSEwLHJbdF09ZSwtLW98fHMocikpfSxjKX0pLC0tb3x8cyhyKX0pO3JldHVybiBuLmUmJmMobi52KSx0LnByb21pc2V9LHJhY2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPW5ld1Byb21pc2VDYXBhYmlsaXR5KHQpLHI9bi5yZWplY3QsaT1fcGVyZm9ybShmdW5jdGlvbigpe19mb3JPZihlLCExLGZ1bmN0aW9uKGUpe3QucmVzb2x2ZShlKS50aGVuKG4ucmVzb2x2ZSxyKX0pfSk7cmV0dXJuIGkuZSYmcihpLnYpLG4ucHJvbWlzZX19KTt2YXIgJGluY2x1ZGVzPV9hcnJheUluY2x1ZGVzKCEwKTtfZXhwb3J0KF9leHBvcnQuUCwiQXJyYXkiLHtpbmNsdWRlczpmdW5jdGlvbihlKXtyZXR1cm4gJGluY2x1ZGVzKHRoaXMsZSwxPGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksX2FkZFRvVW5zY29wYWJsZXMoImluY2x1ZGVzIik7dmFyIGlzRW51bT1fb2JqZWN0UGllLmYsX29iamVjdFRvQXJyYXk9ZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPV90b0lvYmplY3QoZSkscj1fb2JqZWN0S2V5cyhuKSxpPXIubGVuZ3RoLG89MCxhPVtdO288aTspaXNFbnVtLmNhbGwobix0PXJbbysrXSkmJmEucHVzaChzP1t0LG5bdF1dOm5bdF0pO3JldHVybiBhfX0sJHZhbHVlcz1fb2JqZWN0VG9BcnJheSghMSk7X2V4cG9ydChfZXhwb3J0LlMsIk9iamVjdCIse3ZhbHVlczpmdW5jdGlvbihlKXtyZXR1cm4gJHZhbHVlcyhlKX19KTt2YXIgb3JpZ2luYWxDb25zb2xlPWdsb2JhbC5jb25zb2xlO2Z1bmN0aW9uIHNldE5hdGl2ZUNvbnNvbGUoKXtpZihnZW5lcmF0ZUxldmVsTWFwKCksZ2xvYmFsLldYRW52aXJvbm1lbnQmJiJXZWIiIT09Z2xvYmFsLldYRW52aXJvbm1lbnQucGxhdGZvcm0pZ2xvYmFsLmNvbnNvbGU9e2RlYnVnOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImRlYnVnIikmJmdsb2JhbC5uYXRpdmVMb2cuYXBwbHkoZ2xvYmFsLGZvcm1hdChlKS5jb25jYXQoWyJfX0RFQlVHIl0pKX0sbG9nOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImxvZyIpJiZnbG9iYWwubmF0aXZlTG9nLmFwcGx5KGdsb2JhbCxmb3JtYXQoZSkuY29uY2F0KFsiX19MT0ciXSkpfSxpbmZvOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImluZm8iKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fSU5GTyJdKSl9LHdhcm46ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgid2FybiIpJiZnbG9iYWwubmF0aXZlTG9nLmFwcGx5KGdsb2JhbCxmb3JtYXQoZSkuY29uY2F0KFsiX19XQVJOIl0pKX0sZXJyb3I6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZXJyb3IiKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fRVJST1IiXSkpfX07ZWxzZXt2YXIgZT1jb25zb2xlLmRlYnVnLHQ9Y29uc29sZS5sb2csbj1jb25zb2xlLmluZm8scj1jb25zb2xlLndhcm4saT1jb25zb2xlLmVycm9yO2NvbnNvbGUuX19vcmlfXz17ZGVidWc6ZSxsb2c6dCxpbmZvOm4sd2FybjpyLGVycm9yOml9LGNvbnNvbGUuZGVidWc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZGVidWciKSYmY29uc29sZS5fX29yaV9fLmRlYnVnLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUubG9nPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImxvZyIpJiZjb25zb2xlLl9fb3JpX18ubG9nLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUuaW5mbz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJpbmZvIikmJmNvbnNvbGUuX19vcmlfXy5pbmZvLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUud2Fybj1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJ3YXJuIikmJmNvbnNvbGUuX19vcmlfXy53YXJuLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUuZXJyb3I9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZXJyb3IiKSYmY29uc29sZS5fX29yaV9fLmVycm9yLmFwcGx5KGNvbnNvbGUsZSl9fX1mdW5jdGlvbiBmb3JtYXQoZSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlPSJbb2JqZWN0IG9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnRvTG93ZXJDYXNlKCk/SlNPTi5zdHJpbmdpZnkoZSk6U3RyaW5nKGUpfSl9dmFyIG9yaWdpbmFsU2V0VGltZW91dD1nbG9iYWwuc2V0VGltZW91dCxzZXRUaW1lb3V0TmF0aXZlPWdsb2JhbC5zZXRUaW1lb3V0TmF0aXZlO2Z1bmN0aW9uIHNldE5hdGl2ZVRpbWVyKCl7aWYodm9pZCAwPT09c2V0VGltZW91dCYmImZ1bmN0aW9uIj09dHlwZW9mIHNldFRpbWVvdXROYXRpdmUpe3ZhciBuPXt9LHI9MDtnbG9iYWwuc2V0VGltZW91dD1mdW5jdGlvbihlLHQpe25bKytyXT1lLHNldFRpbWVvdXROYXRpdmUoci50b1N0cmluZygpLHQpfSxnbG9iYWwuc2V0VGltZW91dENhbGxiYWNrPWZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBuW2VdJiYobltlXSgpLGRlbGV0ZSBuW2VdKX19fXNldE5hdGl2ZVRpbWVyKCksInVuZGVmaW5lZCI9PXR5cGVvZiBXWEVudmlyb25tZW50fHxXWEVudmlyb25tZW50Ll9fZW5hYmxlX25hdGl2ZV9wcm9taXNlX187dmFyIGZhY3Rvcnk9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsYSx0KXt2YXIgXz1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBFKGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIEkoZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gQShlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gJChlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIGIoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBkKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09ci5jYWxsKGUpfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiAwPD10JiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gdyhlKXtyZXR1cm4gSShlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbihlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHxkKGUpJiZlLnRvU3RyaW5nPT09cj9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19cygic2xvdCxjb21wb25lbnQiLCEwKTt2YXIgbD1zKCJrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpcyIpO2Z1bmN0aW9uIGsoZSx0KXtpZihlLmxlbmd0aCl7dmFyIG49ZS5pbmRleE9mKHQpO2lmKC0xPG4pcmV0dXJuIGUuc3BsaWNlKG4sMSl9fXZhciBjPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZihlLHQpe3JldHVybiBjLmNhbGwoZSx0KX1mdW5jdGlvbiB1KHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfHwobltlXT10KGUpKX19dmFyIHA9Ly0oXHcpL2csaD11KGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UocCxmdW5jdGlvbihlLHQpe3JldHVybiB0P3QudG9VcHBlckNhc2UoKToiIn0pfSksdj11KGZ1bmN0aW9uKGUpe3JldHVybiBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9KSxnPS9cQihbQS1aXSkvZyxTPXUoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShnLCItJDEiKS50b0xvd2VyQ2FzZSgpfSk7dmFyIG09RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5iaW5kKHQpfTpmdW5jdGlvbihuLHIpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gdD8xPHQ/bi5hcHBseShyLGFyZ3VtZW50cyk6bi5jYWxsKHIsZSk6bi5jYWxsKHIpfXJldHVybiBlLl9sZW5ndGg9bi5sZW5ndGgsZX07ZnVuY3Rpb24geShlLHQpe3Q9dHx8MDtmb3IodmFyIG49ZS5sZW5ndGgtdCxyPW5ldyBBcnJheShuKTtuLS07KXJbbl09ZVtuK3RdO3JldHVybiByfWZ1bmN0aW9uIEIoZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24geChlKXtmb3IodmFyIHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKWVbbl0mJkIodCxlW25dKTtyZXR1cm4gdH1mdW5jdGlvbiBOKGUsdCxuKXt9dmFyIEM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExfSxUPWZ1bmN0aW9uKGUpe3JldHVybiBlfTtmdW5jdGlvbiBPKHQsbil7aWYodD09PW4pcmV0dXJuITA7dmFyIGU9Yih0KSxyPWIobik7aWYoIWV8fCFyKXJldHVybiFlJiYhciYmU3RyaW5nKHQpPT09U3RyaW5nKG4pO3RyeXt2YXIgaT1BcnJheS5pc0FycmF5KHQpLG89QXJyYXkuaXNBcnJheShuKTtpZihpJiZvKXJldHVybiB0Lmxlbmd0aD09PW4ubGVuZ3RoJiZ0LmV2ZXJ5KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIE8oZSxuW3RdKX0pO2lmKHQgaW5zdGFuY2VvZiBEYXRlJiZuIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gdC5nZXRUaW1lKCk9PT1uLmdldFRpbWUoKTtpZihpfHxvKXJldHVybiExO3ZhciBhPU9iamVjdC5rZXlzKHQpLHM9T2JqZWN0LmtleXMobik7cmV0dXJuIGEubGVuZ3RoPT09cy5sZW5ndGgmJmEuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIE8odFtlXSxuW2VdKX0pfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBQKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoTyhlW25dLHQpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIEQoZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX12YXIgTT0iZGF0YS1zZXJ2ZXItcmVuZGVyZWQiLGo9WyJjb21wb25lbnQiLCJkaXJlY3RpdmUiLCJmaWx0ZXIiXSxMPVsiYmVmb3JlQ3JlYXRlIiwiY3JlYXRlZCIsImJlZm9yZU1vdW50IiwibW91bnRlZCIsImJlZm9yZVVwZGF0ZSIsInVwZGF0ZWQiLCJiZWZvcmVEZXN0cm95IiwiZGVzdHJveWVkIiwiYWN0aXZhdGVkIiwiZGVhY3RpdmF0ZWQiLCJlcnJvckNhcHR1cmVkIiwic2VydmVyUHJlZmV0Y2giXSxSPXtvcHRpb25NZXJnZVN0cmF0ZWdpZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxzaWxlbnQ6ITEscHJvZHVjdGlvblRpcDohMSxkZXZ0b29sczohMSxwZXJmb3JtYW5jZTohMSxlcnJvckhhbmRsZXI6bnVsbCx3YXJuSGFuZGxlcjpudWxsLGlnbm9yZWRFbGVtZW50czpbXSxrZXlDb2RlczpPYmplY3QuY3JlYXRlKG51bGwpLGlzUmVzZXJ2ZWRUYWc6Qyxpc1Jlc2VydmVkQXR0cjpDLGlzVW5rbm93bkVsZW1lbnQ6QyxnZXRUYWdOYW1lc3BhY2U6TixwYXJzZVBsYXRmb3JtVGFnTmFtZTpULG11c3RVc2VQcm9wOkMsYXN5bmM6ITAsX2xpZmVjeWNsZUhvb2tzOkx9O2Z1bmN0aW9uIEYoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgVT1uZXcgUmVnRXhwKCJbXiIrL2EtekEtWlx1MDBCN1x1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDNGLVx1MjA0MFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZELy5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgeixWPSJfX3Byb3RvX18iaW57fSxxPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LFc9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sSD1XJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksRz1xJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLFg9RyYmL21zaWV8dHJpZGVudC8udGVzdChHKSxKPUcmJjA8Ry5pbmRleE9mKCJtc2llIDkuMCIpLFk9RyYmMDxHLmluZGV4T2YoImVkZ2UvIiksSz0oRyYmRy5pbmRleE9mKCJhbmRyb2lkIiksRyYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KEcpLEcmJi9jaHJvbWVcL1xkKy8udGVzdChHKSxHJiYvcGhhbnRvbWpzLy50ZXN0KEcpLEcmJkcubWF0Y2goL2ZpcmVmb3hcLyhcZCspLykse30ud2F0Y2gpO2lmKHEpdHJ5e3ZhciBaPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShaLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7fX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0LXBhc3NpdmUiLG51bGwsWil9Y2F0Y2goZSl7fXZhciBRPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXomJih6PSFxJiYhVyYmdm9pZCAwIT09Z2xvYmFsJiYoZ2xvYmFsLnByb2Nlc3MmJiJzZXJ2ZXIiPT09Z2xvYmFsLnByb2Nlc3MuZW52LlZVRV9FTlYpKSx6fSxlZT1xJiZ3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztmdW5jdGlvbiB0ZShlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmL25hdGl2ZSBjb2RlLy50ZXN0KGUudG9TdHJpbmcoKSl9dmFyIG5lLHJlPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZ0ZShTeW1ib2wpJiYidW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJnRlKFJlZmxlY3Qub3duS2V5cyk7bmU9InVuZGVmaW5lZCIhPXR5cGVvZiBTZXQmJnRlKFNldCk/U2V0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9cmV0dXJuIGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4hMD09PXRoaXMuc2V0W2VdfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRbZV09ITB9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX0sZX0oKTt2YXIgaWU9TixvZT0wLGFlPWZ1bmN0aW9uKCl7dGhpcy5pZD12b2lkIDAhPT10P3QudWlkKys6b2UrKyx0aGlzLnN1YnM9W119O2Z1bmN0aW9uIHNlKGUpe2FlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wdXNoKGUpLGFlLlNoYXJlZE9iamVjdC50YXJnZXQ9ZX1mdW5jdGlvbiBjZSgpe2FlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wb3AoKSxhZS5TaGFyZWRPYmplY3QudGFyZ2V0PWFlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFja1thZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2subGVuZ3RoLTFdfWFlLnByb3RvdHlwZS5hZGRTdWI9ZnVuY3Rpb24oZSl7dGhpcy5zdWJzLnB1c2goZSl9LGFlLnByb3RvdHlwZS5yZW1vdmVTdWI9ZnVuY3Rpb24oZSl7ayh0aGlzLnN1YnMsZSl9LGFlLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXthZS5TaGFyZWRPYmplY3QudGFyZ2V0JiZhZS5TaGFyZWRPYmplY3QudGFyZ2V0LmFkZERlcCh0aGlzKX0sYWUucHJvdG90eXBlLm5vdGlmeT1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLnN1YnMuc2xpY2UoKSx0PTAsbj1lLmxlbmd0aDt0PG47dCsrKWVbdF0udXBkYXRlKCl9LGFlLlNoYXJlZE9iamVjdD12b2lkIDAhPT10P3Q6e30sYWUuU2hhcmVkT2JqZWN0LnRhcmdldD1udWxsLGFlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjaz1bXTt2YXIgdWU9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSxzKXt0JiZBcnJheS5pc0FycmF5KHQuY2xhc3MpJiYodC5jbGFzcz10LmNsYXNzLnNsaWNlKDApKSx0aGlzLnRhZz1lLHRoaXMuZGF0YT10LHRoaXMuY2hpbGRyZW49bix0aGlzLnRleHQ9cix0aGlzLmVsbT1pLHRoaXMubnM9dm9pZCAwLHRoaXMuY29udGV4dD1vLHRoaXMuZm5Db250ZXh0PXZvaWQgMCx0aGlzLmZuT3B0aW9ucz12b2lkIDAsdGhpcy5mblNjb3BlSWQ9dm9pZCAwLHRoaXMua2V5PXQmJnQua2V5LHRoaXMuY29tcG9uZW50T3B0aW9ucz1hLHRoaXMuY29tcG9uZW50SW5zdGFuY2U9dm9pZCAwLHRoaXMucGFyZW50PXZvaWQgMCx0aGlzLnJhdz0hMSx0aGlzLmlzU3RhdGljPSExLHRoaXMuaXNSb290SW5zZXJ0PSEwLHRoaXMuaXNDb21tZW50PSExLHRoaXMuaXNDbG9uZWQ9ITEsdGhpcy5pc09uY2U9ITEsdGhpcy5hc3luY0ZhY3Rvcnk9cyx0aGlzLmFzeW5jTWV0YT12b2lkIDAsdGhpcy5pc0FzeW5jUGxhY2Vob2xkZXI9ITF9LGxlPXtjaGlsZDp7Y29uZmlndXJhYmxlOiEwfX07bGUuY2hpbGQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2V9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHVlLnByb3RvdHlwZSxsZSk7dmFyIGRlPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPSIiKTt2YXIgdD1uZXcgdWU7cmV0dXJuIHQudGV4dD1lLHQuaXNDb21tZW50PSEwLHR9O2Z1bmN0aW9uIGZlKGUpe3JldHVybiBuZXcgdWUodm9pZCAwLHZvaWQgMCx2b2lkIDAsU3RyaW5nKGUpKX1mdW5jdGlvbiBwZShlKXt2YXIgdD1uZXcgdWUoZS50YWcsZS5kYXRhLGUuY2hpbGRyZW4mJmUuY2hpbGRyZW4uc2xpY2UoKSxlLnRleHQsZS5lbG0sZS5jb250ZXh0LGUuY29tcG9uZW50T3B0aW9ucyxlLmFzeW5jRmFjdG9yeSk7cmV0dXJuIHQubnM9ZS5ucyx0LmlzU3RhdGljPWUuaXNTdGF0aWMsdC5rZXk9ZS5rZXksdC5pc0NvbW1lbnQ9ZS5pc0NvbW1lbnQsdC5mbkNvbnRleHQ9ZS5mbkNvbnRleHQsdC5mbk9wdGlvbnM9ZS5mbk9wdGlvbnMsdC5mblNjb3BlSWQ9ZS5mblNjb3BlSWQsdC5hc3luY01ldGE9ZS5hc3luY01ldGEsdC5pc0Nsb25lZD0hMCx0fXZhciBoZT1BcnJheS5wcm90b3R5cGUsdmU9T2JqZWN0LmNyZWF0ZShoZSk7WyJwdXNoIiwicG9wIiwic2hpZnQiLCJ1bnNoaWZ0Iiwic3BsaWNlIiwic29ydCIsInJldmVyc2UiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBzPWhlW2FdO0YodmUsYSxmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHIsaT1zLmFwcGx5KHRoaXMsdCksbz10aGlzLl9fb2JfXztzd2l0Y2goYSl7Y2FzZSJwdXNoIjpjYXNlInVuc2hpZnQiOnI9dDticmVhaztjYXNlInNwbGljZSI6cj10LnNsaWNlKDIpfXJldHVybiByJiZvLm9ic2VydmVBcnJheShyKSxvLmRlcC5ub3RpZnkoKSxpfSl9KTt2YXIgZ2U9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmUpLG1lPSEwO2Z1bmN0aW9uIHllKGUpe21lPWV9dmFyIF9lPWZ1bmN0aW9uKGUpe3ZhciB0O3RoaXMudmFsdWU9ZSx0aGlzLmRlcD1uZXcgYWUsdGhpcy52bUNvdW50PTAsRihlLCJfX29iX18iLHRoaXMpLEFycmF5LmlzQXJyYXkoZSk/KFY/KHQ9dmUsZS5fX3Byb3RvX189dCk6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7dmFyIG89bltyXTtGKGUsbyx0W29dKX19KGUsdmUsZ2UpLHRoaXMub2JzZXJ2ZUFycmF5KGUpKTp0aGlzLndhbGsoZSl9O2Z1bmN0aW9uIGJlKGUsdCl7dmFyIG47aWYoYihlKSYmIShlIGluc3RhbmNlb2YgdWUpKXJldHVybiBmKGUsIl9fb2JfXyIpJiZlLl9fb2JfXyBpbnN0YW5jZW9mIF9lP249ZS5fX29iX186bWUmJiFRKCkmJihBcnJheS5pc0FycmF5KGUpfHxkKGUpKSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmIWUuX2lzVnVlJiYobj1uZXcgX2UoZSkpLHQmJm4mJm4udm1Db3VudCsrLG59ZnVuY3Rpb24gd2UobixlLHIsdCxpKXt2YXIgbz1uZXcgYWUsYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSk7aWYoIWF8fCExIT09YS5jb25maWd1cmFibGUpe3ZhciBzPWEmJmEuZ2V0LGM9YSYmYS5zZXQ7cyYmIWN8fDIhPT1hcmd1bWVudHMubGVuZ3RofHwocj1uW2VdKTt2YXIgdT0haSYmYmUocik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9cz9zLmNhbGwobik6cjtyZXR1cm4gYWUuU2hhcmVkT2JqZWN0LnRhcmdldCYmKG8uZGVwZW5kKCksdSYmKHUuZGVwLmRlcGVuZCgpLEFycmF5LmlzQXJyYXkoZSkmJmZ1bmN0aW9uIGUodCl7Zm9yKHZhciBuPXZvaWQgMCxyPTAsaT10Lmxlbmd0aDtyPGk7cisrKShuPXRbcl0pJiZuLl9fb2JfXyYmbi5fX29iX18uZGVwLmRlcGVuZCgpLEFycmF5LmlzQXJyYXkobikmJmUobil9KGUpKSksZX0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXM/cy5jYWxsKG4pOnI7ZT09PXR8fGUhPWUmJnQhPXR8fHMmJiFjfHwoYz9jLmNhbGwobixlKTpyPWUsdT0haSYmYmUoZSksby5ub3RpZnkoKSl9fSl9fWZ1bmN0aW9uIGtlKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpJiZpKHQpKXJldHVybiBlLmxlbmd0aD1NYXRoLm1heChlLmxlbmd0aCx0KSxlLnNwbGljZSh0LDEsbiksbjtpZih0IGluIGUmJiEodCBpbiBPYmplY3QucHJvdG90eXBlKSlyZXR1cm4gZVt0XT1uO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50P246cj8od2Uoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOmVbdF09bn1mdW5jdGlvbiBTZShlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkmJmkodCkpZS5zcGxpY2UodCwxKTtlbHNle3ZhciBuPWUuX19vYl9fO2UuX2lzVnVlfHxuJiZuLnZtQ291bnR8fGYoZSx0KSYmKGRlbGV0ZSBlW3RdLG4mJm4uZGVwLm5vdGlmeSgpKX19X2UucHJvdG90eXBlLndhbGs9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoO24rKyl3ZShlLHRbbl0pfSxfZS5wcm90b3R5cGUub2JzZXJ2ZUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyliZShlW3RdKX07dmFyIHhlPVIub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO2Z1bmN0aW9uIENlKGUsdCl7aWYoIXQpcmV0dXJuIGU7Zm9yKHZhciBuLHIsaSxvPXJlP1JlZmxlY3Qub3duS2V5cyh0KTpPYmplY3Qua2V5cyh0KSxhPTA7YTxvLmxlbmd0aDthKyspIl9fb2JfXyIhPT0obj1vW2FdKSYmKHI9ZVtuXSxpPXRbbl0sZihlLG4pP3IhPT1pJiZkKHIpJiZkKGkpJiZDZShyLGkpOmtlKGUsbixpKSk7cmV0dXJuIGV9ZnVuY3Rpb24gVGUobixyLGkpe3JldHVybiBpP2Z1bmN0aW9uKCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5jYWxsKGksaSk6cix0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbChpLGkpOm47cmV0dXJuIGU/Q2UoZSx0KTp0fTpyP24/ZnVuY3Rpb24oKXtyZXR1cm4gQ2UoImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5jYWxsKHRoaXMsdGhpcyk6ciwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwodGhpcyx0aGlzKTpuKX06cjpufWZ1bmN0aW9uIE9lKGUsdCl7dmFyIG49dD9lP2UuY29uY2F0KHQpOkFycmF5LmlzQXJyYXkodCk/dDpbdF06ZTtyZXR1cm4gbj9mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKS0xPT09dC5pbmRleE9mKGVbbl0pJiZ0LnB1c2goZVtuXSk7cmV0dXJuIHR9KG4pOm59ZnVuY3Rpb24gRWUoZSx0LG4scil7dmFyIGk9T2JqZWN0LmNyZWF0ZShlfHxudWxsKTtyZXR1cm4gdD9CKGksdCk6aX14ZS5kYXRhPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj9UZShlLHQsbik6dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTpUZShlLHQpfSxMLmZvckVhY2goZnVuY3Rpb24oZSl7eGVbZV09T2V9KSxqLmZvckVhY2goZnVuY3Rpb24oZSl7eGVbZSsicyJdPUVlfSkseGUud2F0Y2g9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT09PUsmJihlPXZvaWQgMCksdD09PUsmJih0PXZvaWQgMCksIXQpcmV0dXJuIE9iamVjdC5jcmVhdGUoZXx8bnVsbCk7aWYoIWUpcmV0dXJuIHQ7dmFyIGk9e307Zm9yKHZhciBvIGluIEIoaSxlKSx0KXt2YXIgYT1pW29dLHM9dFtvXTthJiYhQXJyYXkuaXNBcnJheShhKSYmKGE9W2FdKSxpW29dPWE/YS5jb25jYXQocyk6QXJyYXkuaXNBcnJheShzKT9zOltzXX1yZXR1cm4gaX0seGUucHJvcHM9eGUubWV0aG9kcz14ZS5pbmplY3Q9eGUuY29tcHV0ZWQ9ZnVuY3Rpb24oZSx0LG4scil7aWYoIWUpcmV0dXJuIHQ7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gQihpLGUpLHQmJkIoaSx0KSxpfSx4ZS5wcm92aWRlPVRlO3ZhciBJZT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10P2U6dH07ZnVuY3Rpb24gQWUobixyLGkpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByJiYocj1yLm9wdGlvbnMpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5wcm9wcztpZihuKXt2YXIgcixpLG89e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3Iocj1uLmxlbmd0aDtyLS07KSJzdHJpbmciPT10eXBlb2YoaT1uW3JdKSYmKG9baChpKV09e3R5cGU6bnVsbH0pO2Vsc2UgaWYoZChuKSlmb3IodmFyIGEgaW4gbilpPW5bYV0sb1toKGEpXT1kKGkpP2k6e3R5cGU6aX07ZS5wcm9wcz1vfX0ociksZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmluamVjdDtpZihuKXt2YXIgcj1lLmluamVjdD17fTtpZihBcnJheS5pc0FycmF5KG4pKWZvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXJbbltpXV09e2Zyb206bltpXX07ZWxzZSBpZihkKG4pKWZvcih2YXIgbyBpbiBuKXt2YXIgYT1uW29dO3Jbb109ZChhKT9CKHtmcm9tOm99LGEpOntmcm9tOmF9fX19KHIpLGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGlyZWN0aXZlcztpZih0KWZvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dOyJmdW5jdGlvbiI9PXR5cGVvZiByJiYodFtuXT17YmluZDpyLHVwZGF0ZTpyfSl9fShyKSwhci5fYmFzZSYmKHIuZXh0ZW5kcyYmKG49QWUobixyLmV4dGVuZHMsaSkpLHIubWl4aW5zKSlmb3IodmFyIGU9MCx0PXIubWl4aW5zLmxlbmd0aDtlPHQ7ZSsrKW49QWUobixyLm1peGluc1tlXSxpKTt2YXIgbyxhPXt9O2ZvcihvIGluIG4pcyhvKTtmb3IobyBpbiByKWYobixvKXx8cyhvKTtmdW5jdGlvbiBzKGUpe3ZhciB0PXhlW2VdfHxJZTthW2VdPXQobltlXSxyW2VdLGksZSl9cmV0dXJuIGF9ZnVuY3Rpb24gJGUoZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgaT1lW3RdO2lmKGYoaSxuKSlyZXR1cm4gaVtuXTt2YXIgbz1oKG4pO2lmKGYoaSxvKSlyZXR1cm4gaVtvXTt2YXIgYT12KG8pO3JldHVybiBmKGksYSk/aVthXTppW25dfHxpW29dfHxpW2FdfX1mdW5jdGlvbiBQZShlLHQsbixyKXt2YXIgaT10W2VdLG89IWYobixlKSxhPW5bZV0scz1MZShCb29sZWFuLGkudHlwZSk7aWYoLTE8cylpZihvJiYhZihpLCJkZWZhdWx0IikpYT0hMTtlbHNlIGlmKCIiPT09YXx8YT09PVMoZSkpe3ZhciBjPUxlKFN0cmluZyxpLnR5cGUpOyhjPDB8fHM8YykmJihhPSEwKX1pZih2b2lkIDA9PT1hKXthPWZ1bmN0aW9uKGUsdCxuKXtpZighZih0LCJkZWZhdWx0IikpcmV0dXJuO3ZhciByPXQuZGVmYXVsdDtpZihlJiZlLiRvcHRpb25zLnByb3BzRGF0YSYmdm9pZCAwPT09ZS4kb3B0aW9ucy5wcm9wc0RhdGFbbl0mJnZvaWQgMCE9PWUuX3Byb3BzW25dKXJldHVybiBlLl9wcm9wc1tuXTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgciYmIkZ1bmN0aW9uIiE9PU1lKHQudHlwZSk/ci5jYWxsKGUpOnJ9KHIsaSxlKTt2YXIgdT1tZTt5ZSghMCksYmUoYSkseWUodSl9cmV0dXJuIGF9ZnVuY3Rpb24gTWUoZSl7dmFyIHQ9ZSYmZS50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb24gKFx3KykvKTtyZXR1cm4gdD90WzFdOiIifWZ1bmN0aW9uIGplKGUsdCl7cmV0dXJuIE1lKGUpPT09TWUodCl9ZnVuY3Rpb24gTGUoZSx0KXtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gamUodCxlKT8wOi0xO2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZihqZSh0W25dLGUpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIEJlKGUsdCxuKXtzZSgpO3RyeXtpZih0KWZvcih2YXIgcj10O3I9ci4kcGFyZW50Oyl7dmFyIGk9ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkO2lmKGkpZm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspdHJ5e2lmKCExPT09aVtvXS5jYWxsKHIsZSx0LG4pKXJldHVybn1jYXRjaChlKXtEZShlLHIsImVycm9yQ2FwdHVyZWQgaG9vayIpfX1EZShlLHQsbil9ZmluYWxseXtjZSgpfX1mdW5jdGlvbiBOZShlLHQsbixyLGkpe3ZhciBvO3RyeXsobz1uP2UuYXBwbHkodCxuKTplLmNhbGwodCkpJiYhby5faXNWdWUmJncobykmJiFvLl9oYW5kbGVkJiYoby5jYXRjaChmdW5jdGlvbihlKXtyZXR1cm4gQmUoZSxyLGkrIiAoUHJvbWlzZS9hc3luYykiKX0pLG8uX2hhbmRsZWQ9ITApfWNhdGNoKGUpe0JlKGUscixpKX1yZXR1cm4gb31mdW5jdGlvbiBEZSh0LGUsbil7aWYoUi5lcnJvckhhbmRsZXIpdHJ5e3JldHVybiBSLmVycm9ySGFuZGxlci5jYWxsKG51bGwsdCxlLG4pfWNhdGNoKGUpe2UhPT10JiZSZShlLG51bGwsImNvbmZpZy5lcnJvckhhbmRsZXIiKX1SZSh0LGUsbil9ZnVuY3Rpb24gUmUoZSx0LG4pe2lmKCFxJiYhV3x8InVuZGVmaW5lZCI9PXR5cGVvZiBjb25zb2xlKXRocm93IGU7Y29uc29sZS5lcnJvcihlKX12YXIgRmU9W10sVWU9ITE7ZnVuY3Rpb24gemUoKXtVZT0hMTtmb3IodmFyIGU9RmUuc2xpY2UoMCksdD1GZS5sZW5ndGg9MDt0PGUubGVuZ3RoO3QrKyllW3RdKCl9dmFyIFZlPWZ1bmN0aW9uKCl7c2V0VGltZW91dCh6ZSwwKX07ZnVuY3Rpb24gcWUoZSx0KXt2YXIgbjtpZihGZS5wdXNoKGZ1bmN0aW9uKCl7aWYoZSl0cnl7ZS5jYWxsKHQpfWNhdGNoKGUpe0JlKGUsdCwibmV4dFRpY2siKX1lbHNlIG4mJm4odCl9KSxVZXx8KFVlPSEwLFZlKCkpLCFlJiYidW5kZWZpbmVkIiE9dHlwZW9mIFByb21pc2UpcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe249ZX0pfXZhciBXZT1uZXcgbmU7ZnVuY3Rpb24gSGUoZSl7IWZ1bmN0aW9uIGUodCxuKXt2YXIgcixpO3ZhciBvPUFycmF5LmlzQXJyYXkodCk7aWYoIW8mJiFiKHQpfHxPYmplY3QuaXNGcm96ZW4odCl8fHQgaW5zdGFuY2VvZiB1ZSlyZXR1cm47aWYodC5fX29iX18pe3ZhciBhPXQuX19vYl9fLmRlcC5pZDtpZihuLmhhcyhhKSlyZXR1cm47bi5hZGQoYSl9aWYobylmb3Iocj10Lmxlbmd0aDtyLS07KWUodFtyXSxuKTtlbHNlIGZvcihpPU9iamVjdC5rZXlzKHQpLHI9aS5sZW5ndGg7ci0tOyllKHRbaVtyXV0sbil9KGUsV2UpLFdlLmNsZWFyKCl9dmFyIEdlPXUoZnVuY3Rpb24oZSl7dmFyIHQ9IiYiPT09ZS5jaGFyQXQoMCksbj0ifiI9PT0oZT10P2Uuc2xpY2UoMSk6ZSkuY2hhckF0KDApLHI9IiEiPT09KGU9bj9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKTtyZXR1cm57bmFtZTplPXI/ZS5zbGljZSgxKTplLG9uY2U6bixjYXB0dXJlOnIscGFzc2l2ZTp0fX0pO2Z1bmN0aW9uIFhlKGUsaSl7ZnVuY3Rpb24gbygpe3ZhciBlPWFyZ3VtZW50cyx0PW8uZm5zO2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBOZSh0LG51bGwsYXJndW1lbnRzLGksInYtb24gaGFuZGxlciIpO2Zvcih2YXIgbj10LnNsaWNlKCkscj0wO3I8bi5sZW5ndGg7cisrKU5lKG5bcl0sbnVsbCxlLGksInYtb24gaGFuZGxlciIpfXJldHVybiBvLmZucz1lLG99ZnVuY3Rpb24gSmUoZSx0LG4scixpLG8pe3ZhciBhLHMsYyx1LGw7Zm9yKGEgaW4gZSlzPWM9ZVthXSx1PXRbYV0sbD1HZShhKSxkKHMpJiYoYz1zLmhhbmRsZXIsbC5wYXJhbXM9cy5wYXJhbXMpLEUoYyl8fChFKHUpPyhFKGMuZm5zKSYmKGM9ZVthXT1YZShjLG8pKSxBKGwub25jZSkmJihjPWVbYV09aShsLm5hbWUsYyxsLmNhcHR1cmUpKSxuKGwubmFtZSxjLGwuY2FwdHVyZSxsLnBhc3NpdmUsbC5wYXJhbXMpKTpjIT09dSYmKHUuZm5zPWMsZVthXT11KSk7Zm9yKGEgaW4gdClFKGVbYV0pJiZyKChsPUdlKGEpKS5uYW1lLHRbYV0sbC5jYXB0dXJlKX1mdW5jdGlvbiBZZShlLHQsbil7dmFyIHI7ZSBpbnN0YW5jZW9mIHVlJiYoZT1lLmRhdGEuaG9va3x8KGUuZGF0YS5ob29rPXt9KSk7dmFyIGk9ZVt0XTtmdW5jdGlvbiBvKCl7bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksayhyLmZucyxvKX1FKGkpP3I9WGUoW29dKTpJKGkuZm5zKSYmQShpLm1lcmdlZCk/KHI9aSkuZm5zLnB1c2gobyk6cj1YZShbaSxvXSksci5tZXJnZWQ9ITAsZVt0XT1yfWZ1bmN0aW9uIEtlKGUsdCxuLHIsaSl7aWYoSSh0KSl7aWYoZih0LG4pKXJldHVybiBlW25dPXRbbl0saXx8ZGVsZXRlIHRbbl0sITA7aWYoZih0LHIpKXJldHVybiBlW25dPXRbcl0saXx8ZGVsZXRlIHRbcl0sITB9cmV0dXJuITF9ZnVuY3Rpb24gWmUoZSl7cmV0dXJuICQoZSk/W2ZlKGUpXTpBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uIGUodCxuKXt2YXIgcj1bXTt2YXIgaSxvLGEscztmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKUUobz10W2ldKXx8ImJvb2xlYW4iPT10eXBlb2Ygb3x8KGE9ci5sZW5ndGgtMSxzPXJbYV0sQXJyYXkuaXNBcnJheShvKT8wPG8ubGVuZ3RoJiYoUWUoKG89ZShvLChufHwiIikrIl8iK2kpKVswXSkmJlFlKHMpJiYoclthXT1mZShzLnRleHQrb1swXS50ZXh0KSxvLnNoaWZ0KCkpLHIucHVzaC5hcHBseShyLG8pKTokKG8pP1FlKHMpP3JbYV09ZmUocy50ZXh0K28pOiIiIT09byYmci5wdXNoKGZlKG8pKTpRZShvKSYmUWUocyk/clthXT1mZShzLnRleHQrby50ZXh0KTooQSh0Ll9pc1ZMaXN0KSYmSShvLnRhZykmJkUoby5rZXkpJiZJKG4pJiYoby5rZXk9Il9fdmxpc3QiK24rIl8iK2krIl9fIiksci5wdXNoKG8pKSk7cmV0dXJuIHJ9KGUpOnZvaWQgMH1mdW5jdGlvbiBRZShlKXtyZXR1cm4gSShlKSYmSShlLnRleHQpJiYhMT09PWUuaXNDb21tZW50fWZ1bmN0aW9uIGV0KGUpe3ZhciB0PWUuJG9wdGlvbnMucHJvdmlkZTt0JiYoZS5fcHJvdmlkZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dC5jYWxsKGUpOnQpfWZ1bmN0aW9uIHR0KHQpe3ZhciBuPW50KHQuJG9wdGlvbnMuaW5qZWN0LHQpO24mJih5ZSghMSksT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXt3ZSh0LGUsbltlXSl9KSx5ZSghMCkpfWZ1bmN0aW9uIG50KGUsdCl7aWYoZSl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj1yZT9SZWZsZWN0Lm93bktleXMoZSk6T2JqZWN0LmtleXMoZSksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1yW2ldO2lmKCJfX29iX18iIT09byl7Zm9yKHZhciBhPWVbb10uZnJvbSxzPXQ7czspe2lmKHMuX3Byb3ZpZGVkJiZmKHMuX3Byb3ZpZGVkLGEpKXtuW29dPXMuX3Byb3ZpZGVkW2FdO2JyZWFrfXM9cy4kcGFyZW50fWlmKCFzJiYiZGVmYXVsdCJpbiBlW29dKXt2YXIgYz1lW29dLmRlZmF1bHQ7bltvXT0iZnVuY3Rpb24iPT10eXBlb2YgYz9jLmNhbGwodCk6Y319fXJldHVybiBufX1mdW5jdGlvbiBydChlLHQpe2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJue307Zm9yKHZhciBuPXt9LHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBvPWVbcl0sYT1vLmRhdGE7aWYoYSYmYS5hdHRycyYmYS5hdHRycy5zbG90JiZkZWxldGUgYS5hdHRycy5zbG90LG8uY29udGV4dCE9PXQmJm8uZm5Db250ZXh0IT09dHx8IWF8fG51bGw9PWEuc2xvdClvLmFzeW5jTWV0YSYmby5hc3luY01ldGEuZGF0YSYmInBhZ2UiPT09by5hc3luY01ldGEuZGF0YS5zbG90PyhuLnBhZ2V8fChuLnBhZ2U9W10pKS5wdXNoKG8pOihuLmRlZmF1bHR8fChuLmRlZmF1bHQ9W10pKS5wdXNoKG8pO2Vsc2V7dmFyIHM9YS5zbG90LGM9bltzXXx8KG5bc109W10pOyJ0ZW1wbGF0ZSI9PT1vLnRhZz9jLnB1c2guYXBwbHkoYyxvLmNoaWxkcmVufHxbXSk6Yy5wdXNoKG8pfX1mb3IodmFyIHUgaW4gbiluW3VdLmV2ZXJ5KGl0KSYmZGVsZXRlIG5bdV07cmV0dXJuIG59ZnVuY3Rpb24gaXQoZSl7cmV0dXJuIGUuaXNDb21tZW50JiYhZS5hc3luY0ZhY3Rvcnl8fCIgIj09PWUudGV4dH1mdW5jdGlvbiBvdChlLHQsbil7dmFyIHIsaT0wPE9iamVjdC5rZXlzKHQpLmxlbmd0aCxvPWU/ISFlLiRzdGFibGU6IWksYT1lJiZlLiRrZXk7aWYoZSl7aWYoZS5fbm9ybWFsaXplZClyZXR1cm4gZS5fbm9ybWFsaXplZDtpZihvJiZuJiZuIT09XyYmYT09PW4uJGtleSYmIWkmJiFuLiRoYXNOb3JtYWwpcmV0dXJuIG47Zm9yKHZhciBzIGluIHI9e30sZSllW3NdJiYiJCIhPT1zWzBdJiYocltzXT1hdCh0LHMsZVtzXSkpfWVsc2Ugcj17fTtmb3IodmFyIGMgaW4gdCljIGluIHJ8fChyW2NdPXN0KHQsYykpO3JldHVybiBlJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYoZS5fbm9ybWFsaXplZD1yKSxGKHIsIiRzdGFibGUiLG8pLEYociwiJGtleSIsYSksRihyLCIkaGFzTm9ybWFsIixpKSxyfWZ1bmN0aW9uIGF0KGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg/bi5hcHBseShudWxsLGFyZ3VtZW50cyk6bih7fSk7cmV0dXJuKGU9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYhQXJyYXkuaXNBcnJheShlKT9bZV06WmUoZSkpJiYoMD09PWUubGVuZ3RofHwxPT09ZS5sZW5ndGgmJmVbMF0uaXNDb21tZW50KT92b2lkIDA6ZX07cmV0dXJuIG4ucHJveHkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2dldDpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSkscn1mdW5jdGlvbiBzdChlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlW3RdfX1mdW5jdGlvbiBjdChlLHQpe3ZhciBuLHIsaSxvLGE7aWYoQXJyYXkuaXNBcnJheShlKXx8InN0cmluZyI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlLmxlbmd0aCkscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluW3JdPXQoZVtyXSxyKTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobj1uZXcgQXJyYXkoZSkscj0wO3I8ZTtyKyspbltyXT10KHIrMSxyKTtlbHNlIGlmKGIoZSkpaWYocmUmJmVbU3ltYm9sLml0ZXJhdG9yXSl7bj1bXTtmb3IodmFyIHM9ZVtTeW1ib2wuaXRlcmF0b3JdKCksYz1zLm5leHQoKTshYy5kb25lOyluLnB1c2godChjLnZhbHVlLG4ubGVuZ3RoKSksYz1zLm5leHQoKX1lbHNlIGZvcihvPU9iamVjdC5rZXlzKGUpLG49bmV3IEFycmF5KG8ubGVuZ3RoKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKWE9b1tyXSxuW3JdPXQoZVthXSxhLHIpO3JldHVybiBJKG4pfHwobj1bXSksbi5faXNWTGlzdD0hMCxufWZ1bmN0aW9uIHV0KGUsdCxuLHIpe3ZhciBpLG89dGhpcy4kc2NvcGVkU2xvdHNbZV07bz8obj1ufHx7fSxyJiYobj1CKEIoe30sciksbikpLGk9byhuKXx8dCk6aT10aGlzLiRzbG90c1tlXXx8dDt2YXIgYT1uJiZuLnNsb3Q7cmV0dXJuIGE/dGhpcy4kY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiLHtzbG90OmF9LGkpOml9ZnVuY3Rpb24gbHQoZSl7cmV0dXJuICRlKHRoaXMuJG9wdGlvbnMsImZpbHRlcnMiLGUpfHxUfWZ1bmN0aW9uIGR0KGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/LTE9PT1lLmluZGV4T2YodCk6ZSE9PXR9ZnVuY3Rpb24gZnQoZSx0LG4scixpKXt2YXIgbz1SLmtleUNvZGVzW3RdfHxuO3JldHVybiBpJiZyJiYhUi5rZXlDb2Rlc1t0XT9kdChpLHIpOm8/ZHQobyxlKTpyP1MocikhPT10OnZvaWQgMH1mdW5jdGlvbiBwdChpLG8sYSxzLGMpe2lmKGEpaWYoYihhKSl7dmFyIHU7QXJyYXkuaXNBcnJheShhKSYmKGE9eChhKSk7dmFyIGU9ZnVuY3Rpb24odCl7aWYoImNsYXNzIj09PXR8fCJzdHlsZSI9PT10fHxsKHQpKXU9aTtlbHNle3ZhciBlPWkuYXR0cnMmJmkuYXR0cnMudHlwZTt1PXN8fFIubXVzdFVzZVByb3AobyxlLHQpP2kuZG9tUHJvcHN8fChpLmRvbVByb3BzPXt9KTppLmF0dHJzfHwoaS5hdHRycz17fSl9dmFyIG49aCh0KSxyPVModCk7biBpbiB1fHxyIGluIHV8fCh1W3RdPWFbdF0sYyYmKChpLm9ufHwoaS5vbj17fSkpWyJ1cGRhdGU6Iit0XT1mdW5jdGlvbihlKXthW3RdPWV9KSl9O2Zvcih2YXIgdCBpbiBhKWUodCl9ZWxzZTtyZXR1cm4gaX1mdW5jdGlvbiBodChlLHQpe3ZhciBuPXRoaXMuX3N0YXRpY1RyZWVzfHwodGhpcy5fc3RhdGljVHJlZXM9W10pLHI9bltlXTtyZXR1cm4gciYmIXR8fGd0KHI9bltlXT10aGlzLiRvcHRpb25zLnN0YXRpY1JlbmRlckZuc1tlXS5jYWxsKHRoaXMuX3JlbmRlclByb3h5LG51bGwsdGhpcyksIl9fc3RhdGljX18iK2UsITEpLHJ9ZnVuY3Rpb24gdnQoZSx0LG4pe3JldHVybiBndChlLCJfX29uY2VfXyIrdCsobj8iXyIrbjoiIiksITApLGV9ZnVuY3Rpb24gZ3QoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXSYmInN0cmluZyIhPXR5cGVvZiBlW3JdJiZtdChlW3JdLHQrIl8iK3Isbik7ZWxzZSBtdChlLHQsbil9ZnVuY3Rpb24gbXQoZSx0LG4pe2UuaXNTdGF0aWM9ITAsZS5rZXk9dCxlLmlzT25jZT1ufWZ1bmN0aW9uIHl0KGUsdCl7aWYodClpZihkKHQpKXt2YXIgbj1lLm9uPWUub24/Qih7fSxlLm9uKTp7fTtmb3IodmFyIHIgaW4gdCl7dmFyIGk9bltyXSxvPXRbcl07bltyXT1pP1tdLmNvbmNhdChpLG8pOm99fWVsc2U7cmV0dXJuIGV9ZnVuY3Rpb24gX3QoZSx0LG4scil7dD10fHx7JHN0YWJsZTohbn07Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07QXJyYXkuaXNBcnJheShvKT9fdChvLHQsbik6byYmKG8ucHJveHkmJihvLmZuLnByb3h5PSEwKSx0W28ua2V5XT1vLmZuKX1yZXR1cm4gciYmKHQuJGtleT1yKSx0fWZ1bmN0aW9uIGJ0KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKz0yKXt2YXIgcj10W25dOyJzdHJpbmciPT10eXBlb2YgciYmciYmKGVbdFtuXV09dFtuKzFdKX1yZXR1cm4gZX1mdW5jdGlvbiB3dChlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT90K2U6ZX1mdW5jdGlvbiBrdChlKXtlLl9vPXZ0LGUuX249byxlLl9zPW4sZS5fbD1jdCxlLl90PXV0LGUuX3E9TyxlLl9pPVAsZS5fbT1odCxlLl9mPWx0LGUuX2s9ZnQsZS5fYj1wdCxlLl92PWZlLGUuX2U9ZGUsZS5fdT1fdCxlLl9nPXl0LGUuX2Q9YnQsZS5fcD13dH1mdW5jdGlvbiBTdChlLHQsbixvLHIpe3ZhciBhLGk9dGhpcyxzPXIub3B0aW9ucztmKG8sIl91aWQiKT8oYT1PYmplY3QuY3JlYXRlKG8pKS5fb3JpZ2luYWw9bzpvPShhPW8pLl9vcmlnaW5hbDt2YXIgYz1BKHMuX2NvbXBpbGVkKSx1PSFjO3RoaXMuZGF0YT1lLHRoaXMucHJvcHM9dCx0aGlzLmNoaWxkcmVuPW4sdGhpcy5wYXJlbnQ9byx0aGlzLmxpc3RlbmVycz1lLm9ufHxfLHRoaXMuaW5qZWN0aW9ucz1udChzLmluamVjdCxvKSx0aGlzLnNsb3RzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuJHNsb3RzfHxvdChlLnNjb3BlZFNsb3RzLGkuJHNsb3RzPXJ0KG4sbykpLGkuJHNsb3RzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic2NvcGVkU2xvdHMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvdChlLnNjb3BlZFNsb3RzLHRoaXMuc2xvdHMoKSl9fSksYyYmKHRoaXMuJG9wdGlvbnM9cyx0aGlzLiRzbG90cz10aGlzLnNsb3RzKCksdGhpcy4kc2NvcGVkU2xvdHM9b3QoZS5zY29wZWRTbG90cyx0aGlzLiRzbG90cykpLHMuX3Njb3BlSWQ/dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1WdChhLGUsdCxuLHIsdSk7cmV0dXJuIGkmJiFBcnJheS5pc0FycmF5KGkpJiYoaS5mblNjb3BlSWQ9cy5fc2NvcGVJZCxpLmZuQ29udGV4dD1vKSxpfTp0aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBWdChhLGUsdCxuLHIsdSl9fWZ1bmN0aW9uIHh0KGUsdCxuLHIsaSl7dmFyIG89cGUoZSk7cmV0dXJuIG8uZm5Db250ZXh0PW4sby5mbk9wdGlvbnM9cix0LnNsb3QmJigoby5kYXRhfHwoby5kYXRhPXt9KSkuc2xvdD10LnNsb3QpLG99ZnVuY3Rpb24gQ3QoZSx0KXtmb3IodmFyIG4gaW4gdCllW2gobildPXRbbl19a3QoU3QucHJvdG90eXBlKTt2YXIgVHQ9IkBpblJlY3ljbGVMaXN0IjtmdW5jdGlvbiBPdChlLHQsbixyKXtpZihhJiZhLnRhc2tDZW50ZXIpcmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGEudGFza0NlbnRlci5yZWdpc3Rlckhvb2s/YS50YXNrQ2VudGVyLnJlZ2lzdGVySG9vayhlLHQsbixyKTp2b2lkIDB9ZnVuY3Rpb24gRXQoZSxuLHQpe2lmKGIobikpaWYodCllLiRyZWZzPXt9O2Vsc2V7dmFyIHI9ZS4kcmVmc3x8e307T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1uW2VdO3JbZV09MT09PXQubGVuZ3RoP3RbMF06dH0pLGUuJHJlZnM9cn19ZnVuY3Rpb24gSXQoZSxuLHIsdCl7aWYoYihyKSl7dmFyIGk9ZS4kcmVmc3x8e307dD9PYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXJbZV07aVtlXSYmKDE9PT10Lmxlbmd0aCYmQXJyYXkuaXNBcnJheShpW2VdKT9kZWxldGUgaVtlXVtuXTpkZWxldGUgaVtlXSl9KTooT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1yW2VdOzE9PT10Lmxlbmd0aD8oQXJyYXkuaXNBcnJheShpW2VdKXx8KGlbZV09W10pLGlbZV1bbl09dFswXSk6aVtlXT10fSksZS4kcmVmcz1pKX19dmFyIEF0PTA7ZnVuY3Rpb24gJHQoZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhLG49ZS4kb3B0aW9ucy5jb21wdXRlZHx8e30scj1lLl9kYXRhP09iamVjdC5hc3NpZ24oe30sZS5fZGF0YSk6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/d24odCxlKTp0fHx7fSxpPXt9O2Zvcih2YXIgbyBpbiBuKWlbb109ZVtvXTtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxyLGkpfWZ1bmN0aW9uIFB0KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgcj10aGlzLHQ9ZS5jb21wb25lbnRJZDtGKHIsIl92bVRlbXBsYXRlIixlLnZtVGVtcGxhdGUpLHIuX3VpZD10fHwidmlydHVhbC1jb21wb25lbnQtIitBdCsrLHIuX2lzVnVlPSEwLGUmJmUuX2lzQ29tcG9uZW50P0xuKHIsZSk6ci4kb3B0aW9ucz1BZShCbihyLmNvbnN0cnVjdG9yKSxlfHx7fSxyKSxubigoci5fcmVuZGVyUHJveHk9cikuX3NlbGY9ciksWXQocikscXQociksYW4ociwiYmVmb3JlQ3JlYXRlIiksdHQociksYm4ociksZXQociksYW4ociwiY3JlYXRlZCIpLE90KHQsImxpZmVjeWNsZSIsImF0dGFjaCIsZnVuY3Rpb24oZSl7RXQocixlJiZlLnJlZnMpLGFuKHIsImJlZm9yZU1vdW50IiksbmV3IG1uKHIsZnVuY3Rpb24oKXtyZXR1cm4gJHQocil9LGZ1bmN0aW9uKCl7cmV0dXJuIHIuX3VwZGF0ZShyLl92bm9kZSwhMSl9KSxyLl9pc01vdW50ZWQ9ITAsYW4ociwibW91bnRlZCIpfSksT3QodCwibGlmZWN5Y2xlIiwidXBkYXRlIixmdW5jdGlvbihlKXtFdChyLGUmJmUucmVmcyksci5fdXBkYXRlKHIuX3Zub2RlLCExKX0pLE90KHQsImxpZmVjeWNsZSIsInN5bmNTdGF0ZSIsZnVuY3Rpb24oZSx0KXtpZihkKHQpKWZvcih2YXIgbiBpbiB0KXJbbl09dFtuXTtyZXR1cm4gJHQocil9KSxPdCh0LCJsaWZlY3ljbGUiLCJkZXRhY2giLGZ1bmN0aW9uKGUpe0V0KHIsZSYmZS5yZWZzLCEwKSxyLiRkZXN0cm95KCksci5fdm1UZW1wbGF0ZSYmKHIuX3ZtVGVtcGxhdGUucmVtb3ZlVmlydHVhbENvbXBvbmVudChyLl91aWQpLGRlbGV0ZSByLl92bVRlbXBsYXRlKX0pfWZ1bmN0aW9uIE10KGUpe3ZhciB0PXRoaXMsbj10LiRvcHRpb25zLmNvbXBvbmVudElkOyh0Ll9pc01vdW50ZWQmJmFuKHQsImJlZm9yZVVwZGF0ZSIpLHQuX3Zub2RlPWUsdC5faXNNb3VudGVkJiZuKSYmZnVuY3Rpb24oZSx0LG4pe2lmKGEmJmEudGFza0NlbnRlcikiZnVuY3Rpb24iPT10eXBlb2YgYS50YXNrQ2VudGVyLnVwZGF0ZURhdGEmJmEudGFza0NlbnRlci51cGRhdGVEYXRhKGUsdCxuKX0obiwkdCh0KSxmdW5jdGlvbigpe2FuKHQsInVwZGF0ZWQiKX0pfWZ1bmN0aW9uIGp0KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD10aGlzO3QuX3VpZD0idmlydHVhbC1jb21wb25lbnQtdGVtcGxhdGUtIitBdCsrLHQuX2lzVnVlPSEwLGUmJmUuX2lzQ29tcG9uZW50P0xuKHQsZSk6dC4kb3B0aW9ucz1BZShCbih0LmNvbnN0cnVjdG9yKSxlfHx7fSx0KSxZdCh0Ll9zZWxmPXQpLHF0KHQpLGJuKHQpLHRoaXMucmVnaXN0ZXJWaXJ0dWFsQ29tcG9uZW50KCl9ZnVuY3Rpb24gTHQoZSl7dmFyIHQsbixpLG87ZGVsZXRlIGUuZGF0YS5hdHRyc1tUdF0sbj0odD1lKS5jb21wb25lbnRPcHRpb25zLkN0b3IsaT1uLmV4dGVuZCh7fSksbz1pLnByb3RvdHlwZS4kZW1pdCxpLnByb3RvdHlwZS5faW5pdD1QdCxpLnByb3RvdHlwZS5fdXBkYXRlPU10LGkucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcj10aGlzLl91aWQsaT10aGlzLl92bVRlbXBsYXRlO3JldHVybiByJiZpJiYodC5wdXNoKHIpLG8uYXBwbHkoaSx0KSksby5hcHBseSh0aGlzLHQpfSx0LmNvbXBvbmVudE9wdGlvbnMuQ3Rvcj1uLmV4dGVuZCh7bWV0aG9kczp7cmVnaXN0ZXJWaXJ0dWFsQ29tcG9uZW50OmZ1bmN0aW9uKCl7dmFyIHI9dGhpcztGKHIsIl92aXJ0dWFsQ29tcG9uZW50cyIse30pLE90KFN0cmluZyhyLl91aWQpLCJsaWZlY3ljbGUiLCJjcmVhdGUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IGkoe3ZtVGVtcGxhdGU6cixjb21wb25lbnRJZDplLHByb3BzRGF0YTp0fSk7cmV0dXJuIG4uX3VpZD1lLHIuX3ZpcnR1YWxDb21wb25lbnRzJiYoci5fdmlydHVhbENvbXBvbmVudHNbZV09biksJHQobil9KX0scmVtb3ZlVmlydHVhbENvbXBvbmVudDpmdW5jdGlvbihlKXtkZWxldGUgdGhpcy5fdmlydHVhbENvbXBvbmVudHNbZV19fSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fdmlydHVhbENvbXBvbmVudHN9fSksdC5jb21wb25lbnRPcHRpb25zLkN0b3IucHJvdG90eXBlLl9pbml0PWp0LHQuY29tcG9uZW50T3B0aW9ucy5DdG9yLnByb3RvdHlwZS5fdXBkYXRlPU47dmFyIHI9UnQoZSksYT1yLiRvcHRpb25zWyJAcmVuZGVyIl07aWYoYSl0cnl7cmV0dXJuIGEuY2FsbChyKX1jYXRjaChlKXtCZShlLHIsIkByZW5kZXIiKX19dmFyIEJ0PXtpbml0OmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUuY29tcG9uZW50SW5zdGFuY2UmJiFlLmNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCYmZS5kYXRhLmtlZXBBbGl2ZSl7dmFyIGk9ZTtCdC5wcmVwYXRjaChpLGkpfWVsc2V7KGUuY29tcG9uZW50SW5zdGFuY2U9UnQoZSx0bixuLHIpKS4kbW91bnQodD9lLmVsbTp2b2lkIDAsdCl9fSxwcmVwYXRjaDpmdW5jdGlvbihlLHQpe3ZhciBuPXQuY29tcG9uZW50T3B0aW9uczshZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz1yLmRhdGEuc2NvcGVkU2xvdHMsYT1lLiRzY29wZWRTbG90cyxzPSEhKG8mJiFvLiRzdGFibGV8fGEhPT1fJiYhYS4kc3RhYmxlfHxvJiZlLiRzY29wZWRTbG90cy4ka2V5IT09by4ka2V5KSxjPSEhKGl8fGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVufHxzKTtlLiRvcHRpb25zLl9wYXJlbnRWbm9kZT1yLGUuJHZub2RlPXIsZS5fdm5vZGUmJihlLl92bm9kZS5wYXJlbnQ9cik7aWYoZS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW49aSxlLiRhdHRycz1yLmRhdGEuYXR0cnN8fF8sZS4kbGlzdGVuZXJzPW58fF8sdCYmZS4kb3B0aW9ucy5wcm9wcyl7eWUoITEpO2Zvcih2YXIgdT1lLl9wcm9wcyxsPWUuJG9wdGlvbnMuX3Byb3BLZXlzfHxbXSxkPTA7ZDxsLmxlbmd0aDtkKyspe3ZhciBmPWxbZF0scD1lLiRvcHRpb25zLnByb3BzO3VbZl09UGUoZixwLHQsZSl9eWUoITApLGUuJG9wdGlvbnMucHJvcHNEYXRhPXR9bj1ufHxfO3ZhciBoPWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztlLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM9bixlbihlLG4saCksYyYmKGUuJHNsb3RzPXJ0KGksci5jb250ZXh0KSxlLiRmb3JjZVVwZGF0ZSgpKX0odC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlLG4ucHJvcHNEYXRhLG4ubGlzdGVuZXJzLHQsbi5jaGlsZHJlbil9LGluc2VydDpmdW5jdGlvbihlKXt2YXIgdCxuPWUuY29udGV4dCxyPWUuY29tcG9uZW50SW5zdGFuY2U7ci5faXNNb3VudGVkfHwoci5faXNNb3VudGVkPSEwLGFuKHIsIm1vdW50ZWQiKSksZS5kYXRhLmtlZXBBbGl2ZSYmKG4uX2lzTW91bnRlZD8oKHQ9cikuX2luYWN0aXZlPSExLGNuLnB1c2godCkpOm9uKHIsITApKX0sZGVzdHJveTpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbXBvbmVudEluc3RhbmNlO3QuX2lzRGVzdHJveWVkfHwoZS5kYXRhLmtlZXBBbGl2ZT9mdW5jdGlvbiBlKHQsbil7aWYobiYmKHQuX2RpcmVjdEluYWN0aXZlPSEwLHJuKHQpKSlyZXR1cm47aWYoIXQuX2luYWN0aXZlKXt0Ll9pbmFjdGl2ZT0hMDtmb3IodmFyIHI9MDtyPHQuJGNoaWxkcmVuLmxlbmd0aDtyKyspZSh0LiRjaGlsZHJlbltyXSk7YW4odCwiZGVhY3RpdmF0ZWQiKX19KHQsITApOnQuJGRlc3Ryb3koKSl9fSxOdD1PYmplY3Qua2V5cyhCdCk7ZnVuY3Rpb24gRHQoZSx0LG4scixpKXtpZighRShlKSl7dmFyIG89bi4kb3B0aW9ucy5fYmFzZTtpZihiKGUpJiYoZT1vLmV4dGVuZChlKSksImZ1bmN0aW9uIj09dHlwZW9mIGUpe3ZhciBhLHMsYyx1LGwsZCxmO2lmKEUoZS5jaWQpJiZ2b2lkIDA9PT0oZT1mdW5jdGlvbih0LG4pe2lmKEEodC5lcnJvcikmJkkodC5lcnJvckNvbXApKXJldHVybiB0LmVycm9yQ29tcDtpZihJKHQucmVzb2x2ZWQpKXJldHVybiB0LnJlc29sdmVkO3ZhciBlPUh0O2UmJkkodC5vd25lcnMpJiYtMT09PXQub3duZXJzLmluZGV4T2YoZSkmJnQub3duZXJzLnB1c2goZSk7aWYoQSh0LmxvYWRpbmcpJiZJKHQubG9hZGluZ0NvbXApKXJldHVybiB0LmxvYWRpbmdDb21wO2lmKGUmJiFJKHQub3duZXJzKSl7dmFyIHI9dC5vd25lcnM9W2VdLGk9ITAsbz1udWxsLGE9bnVsbDtlLiRvbigiaG9vazpkZXN0cm95ZWQiLGZ1bmN0aW9uKCl7cmV0dXJuIGsocixlKX0pO3ZhciBzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ci5sZW5ndGg7dDxuO3QrKylyW3RdLiRmb3JjZVVwZGF0ZSgpO2UmJihyLmxlbmd0aD0wLG51bGwhPT1vJiYoY2xlYXJUaW1lb3V0KG8pLG89bnVsbCksbnVsbCE9PWEmJihjbGVhclRpbWVvdXQoYSksYT1udWxsKSl9LGM9RChmdW5jdGlvbihlKXt0LnJlc29sdmVkPUd0KGUsbiksaT9yLmxlbmd0aD0wOnMoITApfSksdT1EKGZ1bmN0aW9uKGUpe0kodC5lcnJvckNvbXApJiYodC5lcnJvcj0hMCxzKCEwKSl9KSxsPXQoYyx1KTtyZXR1cm4gYihsKSYmKHcobCk/RSh0LnJlc29sdmVkKSYmbC50aGVuKGMsdSk6dyhsLmNvbXBvbmVudCkmJihsLmNvbXBvbmVudC50aGVuKGMsdSksSShsLmVycm9yKSYmKHQuZXJyb3JDb21wPUd0KGwuZXJyb3IsbikpLEkobC5sb2FkaW5nKSYmKHQubG9hZGluZ0NvbXA9R3QobC5sb2FkaW5nLG4pLDA9PT1sLmRlbGF5P3QubG9hZGluZz0hMDpvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtvPW51bGwsRSh0LnJlc29sdmVkKSYmRSh0LmVycm9yKSYmKHQubG9hZGluZz0hMCxzKCExKSl9LGwuZGVsYXl8fDIwMCkpLEkobC50aW1lb3V0KSYmKGE9c2V0VGltZW91dChmdW5jdGlvbigpe2E9bnVsbCxFKHQucmVzb2x2ZWQpJiZ1KG51bGwpfSxsLnRpbWVvdXQpKSkpLGk9ITEsdC5sb2FkaW5nP3QubG9hZGluZ0NvbXA6dC5yZXNvbHZlZH19KGE9ZSxvKSkpcmV0dXJuIHM9YSxjPXQsdT1uLGw9cixkPWksKGY9ZGUoKSkuYXN5bmNGYWN0b3J5PXMsZi5hc3luY01ldGE9e2RhdGE6Yyxjb250ZXh0OnUsY2hpbGRyZW46bCx0YWc6ZH0sZjt0PXR8fHt9LEJuKGUpLEkodC5tb2RlbCkmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5tb2RlbCYmZS5tb2RlbC5wcm9wfHwidmFsdWUiLHI9ZS5tb2RlbCYmZS5tb2RlbC5ldmVudHx8ImlucHV0IjsodC5hdHRyc3x8KHQuYXR0cnM9e30pKVtuXT10Lm1vZGVsLnZhbHVlO3ZhciBpPXQub258fCh0Lm9uPXt9KSxvPWlbcl0sYT10Lm1vZGVsLmNhbGxiYWNrO0kobyk/KEFycmF5LmlzQXJyYXkobyk/LTE9PT1vLmluZGV4T2YoYSk6byE9PWEpJiYoaVtyXT1bYV0uY29uY2F0KG8pKTppW3JdPWF9KGUub3B0aW9ucyx0KTt2YXIgcD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5vcHRpb25zLnByb3BzO2lmKCFFKHIpKXt2YXIgaT17fSxvPWUuYXR0cnMsYT1lLnByb3BzO2lmKEkobyl8fEkoYSkpZm9yKHZhciBzIGluIHIpe3ZhciBjPVMocyk7S2UoaSxhLHMsYywhMCl8fEtlKGksbyxzLGMsITEpfXJldHVybiBpfX0odCxlKTtpZihBKGUub3B0aW9ucy5mdW5jdGlvbmFsKSlyZXR1cm4gZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz1lLm9wdGlvbnMsYT17fSxzPW8ucHJvcHM7aWYoSShzKSlmb3IodmFyIGMgaW4gcylhW2NdPVBlKGMscyx0fHxfKTtlbHNlIEkobi5hdHRycykmJkN0KGEsbi5hdHRycyksSShuLnByb3BzKSYmQ3QoYSxuLnByb3BzKTt2YXIgdT1uZXcgU3QobixhLGkscixlKSxsPW8ucmVuZGVyLmNhbGwobnVsbCx1Ll9jLHUpO2lmKGwgaW5zdGFuY2VvZiB1ZSlyZXR1cm4geHQobCxuLHUucGFyZW50LG8pO2lmKEFycmF5LmlzQXJyYXkobCkpe2Zvcih2YXIgZD1aZShsKXx8W10sZj1uZXcgQXJyYXkoZC5sZW5ndGgpLHA9MDtwPGQubGVuZ3RoO3ArKylmW3BdPXh0KGRbcF0sbix1LnBhcmVudCxvKTtyZXR1cm4gZn19KGUscCx0LG4scik7dmFyIGg9dC5vbjtpZih0Lm9uPXQubmF0aXZlT24sQShlLm9wdGlvbnMuYWJzdHJhY3QpKXt2YXIgdj10LnNsb3Q7dD17fSx2JiYodC5zbG90PXYpfSFmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5ob29rfHwoZS5ob29rPXt9KSxuPTA7bjxOdC5sZW5ndGg7bisrKXt2YXIgcj1OdFtuXSxpPXRbcl0sbz1CdFtyXTtpPT09b3x8aSYmaS5fbWVyZ2VkfHwodFtyXT1pP0Z0KG8saSk6byl9fSh0KTt2YXIgZyxtPWUub3B0aW9ucy5uYW1lfHxpLHk9bmV3IHVlKCJ2dWUtY29tcG9uZW50LSIrZS5jaWQrKG0/Ii0iK206IiIpLHQsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbix7Q3RvcjplLHByb3BzRGF0YTpwLGxpc3RlbmVyczpoLHRhZzppLGNoaWxkcmVuOnJ9LGEpO3JldHVybihnPXkpLmRhdGEuYXR0cnMmJlR0IGluIGcuZGF0YS5hdHRycz9MdCh5KTp5fX19ZnVuY3Rpb24gUnQoZSx0LG4scil7dmFyIGk9e19pc0NvbXBvbmVudDohMCxfcGFyZW50Vm5vZGU6ZSxwYXJlbnQ6dCxfcGFyZW50RWxtOm58fG51bGwsX3JlZkVsbTpyfHxudWxsfSxvPWUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtyZXR1cm4gSShvKSYmKGkucmVuZGVyPW8ucmVuZGVyLGkuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zKSxuZXcgZS5jb21wb25lbnRPcHRpb25zLkN0b3IoaSl9ZnVuY3Rpb24gRnQobixyKXt2YXIgZT1mdW5jdGlvbihlLHQpe24oZSx0KSxyKGUsdCl9O3JldHVybiBlLl9tZXJnZWQ9ITAsZX12YXIgVXQ9MSx6dD0yO2Z1bmN0aW9uIFZ0KGUsdCxuLHIsaSxvKXtyZXR1cm4oQXJyYXkuaXNBcnJheShuKXx8JChuKSkmJihpPXIscj1uLG49dm9pZCAwKSxBKG8pJiYoaT16dCksZnVuY3Rpb24oZSx0LG4scixpKXtpZihJKG4pJiZJKG4uX19vYl9fKSlyZXR1cm4gZGUoKTtJKG4pJiZJKG4uaXMpJiYodD1uLmlzKTtpZighdClyZXR1cm4gZGUoKTtBcnJheS5pc0FycmF5KHIpJiYiZnVuY3Rpb24iPT10eXBlb2YgclswXSYmKChuPW58fHt9KS5zY29wZWRTbG90cz17ZGVmYXVsdDpyWzBdfSxyLmxlbmd0aD0wKTtpPT09enQ/cj1aZShyKTppPT09VXQmJihyPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKEFycmF5LmlzQXJyYXkoZVt0XSkpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sZSk7cmV0dXJuIGV9KHIpKTt2YXIgbyxhO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIHM7YT1lLiR2bm9kZSYmZS4kdm5vZGUubnN8fFIuZ2V0VGFnTmFtZXNwYWNlKHQpLG89Ui5pc1Jlc2VydmVkVGFnKHQpP25ldyB1ZShSLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHQpLG4scix2b2lkIDAsdm9pZCAwLGUpOm4mJm4ucHJlfHwhSShzPSRlKGUuJG9wdGlvbnMsImNvbXBvbmVudHMiLHQpKT9uZXcgdWUodCxuLHIsdm9pZCAwLHZvaWQgMCxlKTpEdChzLG4sZSxyLHQpfWVsc2Ugbz1EdCh0LG4sZSxyKTtyZXR1cm4gQXJyYXkuaXNBcnJheShvKT9vOkkobyk/KEkoYSkmJmZ1bmN0aW9uIGUodCxuLHIpe3QubnM9bjsiZm9yZWlnbk9iamVjdCI9PT10LnRhZyYmKHI9IShuPXZvaWQgMCkpO2lmKEkodC5jaGlsZHJlbikpZm9yKHZhciBpPTAsbz10LmNoaWxkcmVuLmxlbmd0aDtpPG87aSsrKXt2YXIgYT10LmNoaWxkcmVuW2ldO0koYS50YWcpJiYoRShhLm5zKXx8QShyKSYmInN2ZyIhPT1hLnRhZykmJmUoYSxuLHIpfX0obyxhKSxJKG4pJiZmdW5jdGlvbihlKXtiKGUuc3R5bGUpJiZIZShlLnN0eWxlKTtiKGUuY2xhc3MpJiZIZShlLmNsYXNzKX0obiksbyk6ZGUoKX0oZSx0LG4scixpKX1mdW5jdGlvbiBxdChpKXtpLl92bm9kZT1udWxsLGkuX3N0YXRpY1RyZWVzPW51bGw7dmFyIGU9aS4kb3B0aW9ucyx0PWkuJHZub2RlPWUuX3BhcmVudFZub2RlLG49dCYmdC5jb250ZXh0O2kuJHNsb3RzPXJ0KGUuX3JlbmRlckNoaWxkcmVuLG4pLGkuJHNjb3BlZFNsb3RzPV8saS5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gVnQoaSxlLHQsbixyLCExKX0saS4kY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gVnQoaSxlLHQsbixyLCEwKX07dmFyIHI9dCYmdC5kYXRhO3dlKGksIiRhdHRycyIsciYmci5hdHRyc3x8XyxudWxsLCEwKSx3ZShpLCIkbGlzdGVuZXJzIixlLl9wYXJlbnRMaXN0ZW5lcnN8fF8sbnVsbCwhMCl9dmFyIFd0LEh0PW51bGw7ZnVuY3Rpb24gR3QoZSx0KXtyZXR1cm4oZS5fX2VzTW9kdWxlfHxyZSYmIk1vZHVsZSI9PT1lW1N5bWJvbC50b1N0cmluZ1RhZ10pJiYoZT1lLmRlZmF1bHQpLGIoZSk/dC5leHRlbmQoZSk6ZX1mdW5jdGlvbiBYdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJmUuYXN5bmNGYWN0b3J5fWZ1bmN0aW9uIEp0KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07aWYoSShuKSYmKEkobi5jb21wb25lbnRPcHRpb25zKXx8WHQobikpKXJldHVybiBufX1mdW5jdGlvbiBZdChlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJmVuKGUsdCl9ZnVuY3Rpb24gS3QoZSx0KXtXdC4kb24oZSx0KX1mdW5jdGlvbiBadChlLHQpe1d0LiRvZmYoZSx0KX1mdW5jdGlvbiBRdCh0LG4pe3ZhciByPVd0O3JldHVybiBmdW5jdGlvbiBlKCl7bnVsbCE9PW4uYXBwbHkobnVsbCxhcmd1bWVudHMpJiZyLiRvZmYodCxlKX19ZnVuY3Rpb24gZW4oZSx0LG4pe0plKHQsbnx8e30sS3QsWnQsUXQsV3Q9ZSksV3Q9dm9pZCAwfXZhciB0bj1udWxsO2Z1bmN0aW9uIG5uKGUpe3ZhciB0PWUuJG9wdGlvbnMsbj10LnBhcmVudDtpZihuJiYhdC5hYnN0cmFjdCl7Zm9yKDtuLiRvcHRpb25zLmFic3RyYWN0JiZuLiRwYXJlbnQ7KW49bi4kcGFyZW50O24uJGNoaWxkcmVuLnB1c2goZSl9ZS4kcGFyZW50PW4sZS4kcm9vdD1uP24uJHJvb3Q6ZSxlLiRjaGlsZHJlbj1bXSxlLiRyZWZzPXt9LGUuX3dhdGNoZXI9bnVsbCxlLl9pbmFjdGl2ZT1udWxsLGUuX2RpcmVjdEluYWN0aXZlPSExLGUuX2lzTW91bnRlZD0hMSxlLl9pc0Rlc3Ryb3llZD0hMSxlLl9pc0JlaW5nRGVzdHJveWVkPSExfWZ1bmN0aW9uIHJuKGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gb24oZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxybihlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKW9uKGUuJGNoaWxkcmVuW25dKTthbihlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gYW4oZSx0KXtzZSgpO3ZhciBuPWUuJG9wdGlvbnNbdF0scj10KyIgaG9vayI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspTmUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxjZSgpfXZhciBzbj1bXSxjbj1bXSx1bj17fSxsbj0hMSxkbj0hMSxmbj0wO3ZhciBwbj1EYXRlLm5vdztpZihxJiYhWCl7dmFyIGhuPXdpbmRvdy5wZXJmb3JtYW5jZTtobiYmImZ1bmN0aW9uIj09dHlwZW9mIGhuLm5vdyYmcG4oKT5hLmNyZWF0ZUV2ZW50KCJFdmVudCIpLnRpbWVTdGFtcCYmKHBuPWZ1bmN0aW9uKCl7cmV0dXJuIGhuLm5vdygpfSl9ZnVuY3Rpb24gdm4oKXt2YXIgZSx0O2ZvcihwbigpLGRuPSEwLHNuLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksZm49MDtmbjxzbi5sZW5ndGg7Zm4rKykoZT1zbltmbl0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsdW5bdF09bnVsbCxlLnJ1bigpO3ZhciBuPWNuLnNsaWNlKCkscj1zbi5zbGljZSgpO2ZuPXNuLmxlbmd0aD1jbi5sZW5ndGg9MCxsbj1kbj0hKHVuPXt9KSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxvbihlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJmFuKHIsInVwZGF0ZWQiKX19KHIpLGVlJiZSLmRldnRvb2xzJiZlZS5lbWl0KCJmbHVzaCIpfXZhciBnbj0wLG1uPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy52bT1lLGkmJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9Kytnbix0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyBuZSx0aGlzLm5ld0RlcElkcz1uZXcgbmUsdGhpcy5leHByZXNzaW9uPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKGUpe2lmKCFVLnRlc3QoZSkpe3ZhciBuPWUuc3BsaXQoIi4iKTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0Kyspe2lmKCFlKXJldHVybjtlPWVbblt0XV19cmV0dXJuIGV9fX0odCksdGhpcy5nZXR0ZXJ8fCh0aGlzLmdldHRlcj1OKSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O21uLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt2YXIgZTtzZSh0aGlzKTt2YXIgdD10aGlzLnZtO3RyeXtlPXRoaXMuZ2V0dGVyLmNhbGwodCx0KX1jYXRjaChlKXtpZighdGhpcy51c2VyKXRocm93IGU7QmUoZSx0LCdnZXR0ZXIgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZmluYWxseXt0aGlzLmRlZXAmJkhlKGUpLGNlKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxtbi5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxtbi5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LG1uLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTpmdW5jdGlvbihlKXt2YXIgdD1lLmlkO2lmKG51bGw9PXVuW3RdKXtpZih1blt0XT0hMCxkbil7Zm9yKHZhciBuPXNuLmxlbmd0aC0xO2ZuPG4mJnNuW25dLmlkPmUuaWQ7KW4tLTtzbi5zcGxpY2UobisxLDAsZSl9ZWxzZSBzbi5wdXNoKGUpO2xufHwobG49ITAscWUodm4pKX19KHRoaXMpfSxtbi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3ZhciBlPXRoaXMuZ2V0KCk7aWYoZSE9PXRoaXMudmFsdWV8fGIoZSl8fHRoaXMuZGVlcCl7dmFyIHQ9dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlPWUsdGhpcy51c2VyKXRyeXt0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfWNhdGNoKGUpe0JlKGUsdGhpcy52bSwnY2FsbGJhY2sgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZWxzZSB0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfX19LG1uLnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5nZXQoKSx0aGlzLmRpcnR5PSExfSxtbi5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0uZGVwZW5kKCl9LG1uLnByb3RvdHlwZS50ZWFyZG93bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkfHxrKHRoaXMudm0uX3dhdGNoZXJzLHRoaXMpO2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLnJlbW92ZVN1Yih0aGlzKTt0aGlzLmFjdGl2ZT0hMX19O3ZhciB5bj17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Ok4sc2V0Ok59O2Z1bmN0aW9uIF9uKGUsdCxuKXt5bi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtuXX0seW4uc2V0PWZ1bmN0aW9uKGUpe3RoaXNbdF1bbl09ZX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix5bil9ZnVuY3Rpb24gYm4oZSl7ZS5fd2F0Y2hlcnM9W107dmFyIHQ9ZS4kb3B0aW9uczt0LnByb3BzJiZmdW5jdGlvbihuLHIpe3ZhciBpPW4uJG9wdGlvbnMucHJvcHNEYXRhfHx7fSxvPW4uX3Byb3BzPXt9LGE9bi4kb3B0aW9ucy5fcHJvcEtleXM9W107bi4kcGFyZW50JiZ5ZSghMSk7dmFyIGU9ZnVuY3Rpb24oZSl7YS5wdXNoKGUpO3ZhciB0PVBlKGUscixpLG4pO3dlKG8sZSx0KSxlIGluIG58fF9uKG4sIl9wcm9wcyIsZSl9O2Zvcih2YXIgdCBpbiByKWUodCk7eWUoITApfShlLHQucHJvcHMpLHQubWV0aG9kcyYmZnVuY3Rpb24oZSx0KXtlLiRvcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWVbbl09ImZ1bmN0aW9uIiE9dHlwZW9mIHRbbl0/TjptKHRbbl0sZSl9KGUsdC5tZXRob2RzKSx0LmRhdGE/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhO2QodD1lLl9kYXRhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3duKHQsZSk6dHx8e30pfHwodD17fSk7dmFyIG49T2JqZWN0LmtleXModCkscj1lLiRvcHRpb25zLnByb3BzLGk9KGUuJG9wdGlvbnMubWV0aG9kcyxuLmxlbmd0aCk7Zm9yKDtpLS07KXt2YXIgbz1uW2ldO3ImJmYocixvKXx8KHZvaWQgMCwzNiE9PShhPShvKyIiKS5jaGFyQ29kZUF0KDApKSYmOTUhPT1hJiZfbihlLCJfZGF0YSIsbykpfXZhciBhO2JlKHQsITApfShlKTpiZShlLl9kYXRhPXt9LCEwKSx0LmNvbXB1dGVkJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuX2NvbXB1dGVkV2F0Y2hlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSxyPVEoKTtmb3IodmFyIGkgaW4gdCl7dmFyIG89dFtpXSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBvP286by5nZXQ7cnx8KG5baV09bmV3IG1uKGUsYXx8TixOLGtuKSksaSBpbiBlfHxTbihlLGksbyl9fShlLHQuY29tcHV0ZWQpLHQud2F0Y2gmJnQud2F0Y2ghPT1LJiZmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspVG4oZSxuLHJbaV0pO2Vsc2UgVG4oZSxuLHIpfX0oZSx0LndhdGNoKX1mdW5jdGlvbiB3bihlLHQpe3NlKCk7dHJ5e3JldHVybiBlLmNhbGwodCx0KX1jYXRjaChlKXtyZXR1cm4gQmUoZSx0LCJkYXRhKCkiKSx7fX1maW5hbGx5e2NlKCl9fXZhciBrbj17bGF6eTohMH07ZnVuY3Rpb24gU24oZSx0LG4pe3ZhciByPSFRKCk7ImZ1bmN0aW9uIj09dHlwZW9mIG4/KHluLmdldD1yP3huKHQpOkNuKG4pLHluLnNldD1OKTooeW4uZ2V0PW4uZ2V0P3ImJiExIT09bi5jYWNoZT94bih0KTpDbihuLmdldCk6Tix5bi5zZXQ9bi5zZXR8fE4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQseW4pfWZ1bmN0aW9uIHhuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2NvbXB1dGVkV2F0Y2hlcnMmJnRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNbdF07aWYoZSlyZXR1cm4gZS5kaXJ0eSYmZS5ldmFsdWF0ZSgpLGFlLlNoYXJlZE9iamVjdC50YXJnZXQmJmUuZGVwZW5kKCksZS52YWx1ZX19ZnVuY3Rpb24gQ24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzLHRoaXMpfX1mdW5jdGlvbiBUbihlLHQsbixyKXtyZXR1cm4gZChuKSYmKG49KHI9bikuaGFuZGxlciksInN0cmluZyI9PXR5cGVvZiBuJiYobj1lW25dKSxlLiR3YXRjaCh0LG4scil9dmFyIE9uLEVuLEluLEFuLCRuLFBuLE1uLGpuPTA7ZnVuY3Rpb24gTG4oZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50LG4uX3BhcmVudFZub2RlPXIsbi5fcGFyZW50RWxtPXQuX3BhcmVudEVsbSxuLl9yZWZFbG09dC5fcmVmRWxtO3ZhciBpPXIuY29tcG9uZW50T3B0aW9ucztuLnByb3BzRGF0YT1pLnByb3BzRGF0YSxuLl9wYXJlbnRMaXN0ZW5lcnM9aS5saXN0ZW5lcnMsbi5fcmVuZGVyQ2hpbGRyZW49aS5jaGlsZHJlbixuLl9jb21wb25lbnRUYWc9aS50YWcsdC5yZW5kZXImJihuLnJlbmRlcj10LnJlbmRlcixuLnN0YXRpY1JlbmRlckZucz10LnN0YXRpY1JlbmRlckZucyl9ZnVuY3Rpb24gQm4oZSl7dmFyIHQ9ZS5vcHRpb25zO2lmKGUuc3VwZXIpe3ZhciBuPUJuKGUuc3VwZXIpO2lmKG4hPT1lLnN1cGVyT3B0aW9ucyl7ZS5zdXBlck9wdGlvbnM9bjt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdCxuPWUub3B0aW9ucyxyPWUuc2VhbGVkT3B0aW9ucztmb3IodmFyIGkgaW4gbiluW2ldIT09cltpXSYmKHR8fCh0PXt9KSx0W2ldPW5baV0pO3JldHVybiB0fShlKTtyJiZCKGUuZXh0ZW5kT3B0aW9ucyxyKSwodD1lLm9wdGlvbnM9QWUobixlLmV4dGVuZE9wdGlvbnMpKS5uYW1lJiYodC5jb21wb25lbnRzW3QubmFtZV09ZSl9fXJldHVybiB0fWZ1bmN0aW9uIE5uKGUpe3RoaXMuX2luaXQoZSl9ZnVuY3Rpb24gRG4oZSl7ZS5jaWQ9MDt2YXIgYT0xO2UuZXh0ZW5kPWZ1bmN0aW9uKGUpe2U9ZXx8e307dmFyIHQ9dGhpcyxuPXQuY2lkLHI9ZS5fQ3Rvcnx8KGUuX0N0b3I9e30pO2lmKHJbbl0pcmV0dXJuIHJbbl07dmFyIGk9ZS5uYW1lfHx0Lm9wdGlvbnMubmFtZSxvPWZ1bmN0aW9uKGUpe3RoaXMuX2luaXQoZSl9O3JldHVybigoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8pLmNpZD1hKyssby5vcHRpb25zPUFlKHQub3B0aW9ucyxlKSxvLnN1cGVyPXQsby5vcHRpb25zLnByb3BzJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpX24oZS5wcm90b3R5cGUsIl9wcm9wcyIsbil9KG8pLG8ub3B0aW9ucy5jb21wdXRlZCYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmNvbXB1dGVkO2Zvcih2YXIgbiBpbiB0KVNuKGUucHJvdG90eXBlLG4sdFtuXSl9KG8pLG8uZXh0ZW5kPXQuZXh0ZW5kLG8ubWl4aW49dC5taXhpbixvLnVzZT10LnVzZSxqLmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT10W2VdfSksaSYmKG8ub3B0aW9ucy5jb21wb25lbnRzW2ldPW8pLG8uc3VwZXJPcHRpb25zPXQub3B0aW9ucyxvLmV4dGVuZE9wdGlvbnM9ZSxvLnNlYWxlZE9wdGlvbnM9Qih7fSxvLm9wdGlvbnMpLHJbbl09b319ZnVuY3Rpb24gUm4oZSl7cmV0dXJuIGUmJihlLkN0b3Iub3B0aW9ucy5uYW1lfHxlLnRhZyl9ZnVuY3Rpb24gRm4oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMTxlLmluZGV4T2YodCk6InN0cmluZyI9PXR5cGVvZiBlPy0xPGUuc3BsaXQoIiwiKS5pbmRleE9mKHQpOihuPWUsIltvYmplY3QgUmVnRXhwXSI9PT1yLmNhbGwobikmJmUudGVzdCh0KSk7dmFyIG59ZnVuY3Rpb24gVW4oZSx0KXt2YXIgbj1lLmNhY2hlLHI9ZS5rZXlzLGk9ZS5fdm5vZGU7Zm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107aWYoYSl7dmFyIHM9Um4oYS5jb21wb25lbnRPcHRpb25zKTtzJiYhdChzKSYmem4obixvLHIsaSl9fX1mdW5jdGlvbiB6bihlLHQsbixyKXt2YXIgaT1lW3RdOyFpfHxyJiZpLnRhZz09PXIudGFnfHxpLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCksZVt0XT1udWxsLGsobix0KX1Obi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0Ll91aWQ9am4rKyx0Ll9pc1Z1ZT0hMCxlJiZlLl9pc0NvbXBvbmVudD9Mbih0LGUpOnQuJG9wdGlvbnM9QWUoQm4odC5jb25zdHJ1Y3RvciksZXx8e30sdCksbm4oKHQuX3JlbmRlclByb3h5PXQpLl9zZWxmPXQpLFl0KHQpLHF0KHQpLGFuKHQsImJlZm9yZUNyZWF0ZSIpLCJtcC10b3V0aWFvIiE9PXQubXBIb3N0JiZ0dCh0KSxibih0KSwibXAtdG91dGlhbyIhPT10Lm1wSG9zdCYmZXQodCksIm1wLXRvdXRpYW8iIT09dC5tcEhvc3QmJmFuKHQsImNyZWF0ZWQiKSx0LiRvcHRpb25zLmVsJiZ0LiRtb3VudCh0LiRvcHRpb25zLmVsKX0sT249Tm4sRW49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfX0sSW49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wc319LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPbi5wcm90b3R5cGUsIiRkYXRhIixFbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KE9uLnByb3RvdHlwZSwiJHByb3BzIixJbiksT24ucHJvdG90eXBlLiRzZXQ9a2UsT24ucHJvdG90eXBlLiRkZWxldGU9U2UsT24ucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZihkKHQpKXJldHVybiBUbihyLGUsdCxuKTsobj1ufHx7fSkudXNlcj0hMDt2YXIgaT1uZXcgbW4ocixlLHQsbik7aWYobi5pbW1lZGlhdGUpdHJ5e3QuY2FsbChyLGkudmFsdWUpfWNhdGNoKGUpe0JlKGUsciwnY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyICInK2kuZXhwcmVzc2lvbisnIicpfXJldHVybiBmdW5jdGlvbigpe2kudGVhcmRvd24oKX19LCRuPS9eaG9vazovLChBbj1ObikucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRoaXMuJG9uKGVbbl0sdCk7ZWxzZSh0aGlzLl9ldmVudHNbZV18fCh0aGlzLl9ldmVudHNbZV09W10pKS5wdXNoKHQpLCRuLnRlc3QoZSkmJih0aGlzLl9oYXNIb29rRXZlbnQ9ITApO3JldHVybiB0aGlzfSxBbi5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sQW4ucHJvdG90eXBlLiRvZmY9ZnVuY3Rpb24oZSx0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcztpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdGhpcy4kb2ZmKGVbbl0sdCk7cmV0dXJuIHRoaXN9dmFyIGksbz10aGlzLl9ldmVudHNbZV07aWYoIW8pcmV0dXJuIHRoaXM7aWYoIXQpcmV0dXJuIHRoaXMuX2V2ZW50c1tlXT1udWxsLHRoaXM7Zm9yKHZhciBhPW8ubGVuZ3RoO2EtLTspaWYoKGk9b1thXSk9PT10fHxpLmZuPT09dCl7by5zcGxpY2UoYSwxKTticmVha31yZXR1cm4gdGhpc30sQW4ucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZih0KXt0PTE8dC5sZW5ndGg/eSh0KTp0O2Zvcih2YXIgbj15KGFyZ3VtZW50cywxKSxyPSdldmVudCBoYW5kbGVyIGZvciAiJytlKyciJyxpPTAsbz10Lmxlbmd0aDtpPG87aSsrKU5lKHRbaV0sdGhpcyxuLHRoaXMscil9cmV0dXJuIHRoaXN9LChQbj1ObikucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMsaT1yLiRlbCxvPXIuX3Zub2RlLGE9KG49dG4sdG49cixmdW5jdGlvbigpe3RuPW59KTtyLl92bm9kZT1lLG8/ci4kZWw9ci5fX3BhdGNoX18obyxlKTooci4kZWw9ci5fX3BhdGNoX18oci4kZWwsZSx0LCExLHIuJG9wdGlvbnMuX3BhcmVudEVsbSxyLiRvcHRpb25zLl9yZWZFbG0pLHIuJG9wdGlvbnMuX3BhcmVudEVsbT1yLiRvcHRpb25zLl9yZWZFbG09bnVsbCksYSgpLGkmJihpLl9fdnVlX189bnVsbCksci4kZWwmJihyLiRlbC5fX3Z1ZV9fPXIpLHIuJHZub2RlJiZyLiRwYXJlbnQmJnIuJHZub2RlPT09ci4kcGFyZW50Ll92bm9kZSYmKHIuJHBhcmVudC4kZWw9ci4kZWwpfSxQbi5wcm90b3R5cGUuJGZvcmNlVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fd2F0Y2hlciYmdGhpcy5fd2F0Y2hlci51cGRhdGUoKX0sUG4ucHJvdG90eXBlLiRkZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighZS5faXNCZWluZ0Rlc3Ryb3llZCl7YW4oZSwiYmVmb3JlRGVzdHJveSIpLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITA7dmFyIHQ9ZS4kcGFyZW50OyF0fHx0Ll9pc0JlaW5nRGVzdHJveWVkfHxlLiRvcHRpb25zLmFic3RyYWN0fHxrKHQuJGNoaWxkcmVuLGUpLGUuX3dhdGNoZXImJmUuX3dhdGNoZXIudGVhcmRvd24oKTtmb3IodmFyIG49ZS5fd2F0Y2hlcnMubGVuZ3RoO24tLTspZS5fd2F0Y2hlcnNbbl0udGVhcmRvd24oKTtlLl9kYXRhLl9fb2JfXyYmZS5fZGF0YS5fX29iX18udm1Db3VudC0tLGUuX2lzRGVzdHJveWVkPSEwLGUuX19wYXRjaF9fKGUuX3Zub2RlLG51bGwpLGFuKGUsImRlc3Ryb3llZCIpLGUuJG9mZigpLGUuJGVsJiYoZS4kZWwuX192dWVfXz1udWxsKSxlLiR2bm9kZSYmKGUuJHZub2RlLnBhcmVudD1udWxsKX19LGt0KChNbj1ObikucHJvdG90eXBlKSxNbi5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKGUpe3JldHVybiBxZShlLHRoaXMpfSxNbi5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3ZhciB0LG49dGhpcyxlPW4uJG9wdGlvbnMscj1lLnJlbmRlcixpPWUuX3BhcmVudFZub2RlO2kmJihuLiRzY29wZWRTbG90cz1vdChpLmRhdGEuc2NvcGVkU2xvdHMsbi4kc2xvdHMsbi4kc2NvcGVkU2xvdHMpKSxuLiR2bm9kZT1pO3RyeXtIdD1uLHQ9ci5jYWxsKG4uX3JlbmRlclByb3h5LG4uJGNyZWF0ZUVsZW1lbnQpfWNhdGNoKGUpe0JlKGUsbiwicmVuZGVyIiksdD1uLl92bm9kZX1maW5hbGx5e0h0PW51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJjE9PT10Lmxlbmd0aCYmKHQ9dFswXSksdCBpbnN0YW5jZW9mIHVlfHwodD1kZSgpKSx0LnBhcmVudD1pLHR9O3ZhciBWbixxbixXbixIbj1bU3RyaW5nLFJlZ0V4cCxBcnJheV0sR249e0tlZXBBbGl2ZTp7bmFtZToia2VlcC1hbGl2ZSIsYWJzdHJhY3Q6ITAscHJvcHM6e2luY2x1ZGU6SG4sZXhjbHVkZTpIbixtYXg6W1N0cmluZyxOdW1iZXJdfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5jYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMua2V5cz1bXX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuY2FjaGUpem4odGhpcy5jYWNoZSxlLHRoaXMua2V5cyl9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuJHdhdGNoKCJpbmNsdWRlIixmdW5jdGlvbih0KXtVbihlLGZ1bmN0aW9uKGUpe3JldHVybiBGbih0LGUpfSl9KSx0aGlzLiR3YXRjaCgiZXhjbHVkZSIsZnVuY3Rpb24odCl7VW4oZSxmdW5jdGlvbihlKXtyZXR1cm4hRm4odCxlKX0pfSl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJHNsb3RzLmRlZmF1bHQsdD1KdChlKSxuPXQmJnQuY29tcG9uZW50T3B0aW9ucztpZihuKXt2YXIgcj1SbihuKSxpPXRoaXMuaW5jbHVkZSxvPXRoaXMuZXhjbHVkZTtpZihpJiYoIXJ8fCFGbihpLHIpKXx8byYmciYmRm4obyxyKSlyZXR1cm4gdDt2YXIgYT10aGlzLmNhY2hlLHM9dGhpcy5rZXlzLGM9bnVsbD09dC5rZXk/bi5DdG9yLmNpZCsobi50YWc/Ijo6IituLnRhZzoiIik6dC5rZXk7YVtjXT8odC5jb21wb25lbnRJbnN0YW5jZT1hW2NdLmNvbXBvbmVudEluc3RhbmNlLGsocyxjKSxzLnB1c2goYykpOihhW2NdPXQscy5wdXNoKGMpLHRoaXMubWF4JiZzLmxlbmd0aD5wYXJzZUludCh0aGlzLm1heCkmJnpuKGEsc1swXSxzLHRoaXMuX3Zub2RlKSksdC5kYXRhLmtlZXBBbGl2ZT0hMH1yZXR1cm4gdHx8ZSYmZVswXX19fTtWbj1ObixXbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFJ9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVm4sImNvbmZpZyIsV24pLFZuLnV0aWw9e3dhcm46aWUsZXh0ZW5kOkIsbWVyZ2VPcHRpb25zOkFlLGRlZmluZVJlYWN0aXZlOndlfSxWbi5zZXQ9a2UsVm4uZGVsZXRlPVNlLFZuLm5leHRUaWNrPXFlLFZuLm9ic2VydmFibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGJlKGUpLGV9LFZuLm9wdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSxqLmZvckVhY2goZnVuY3Rpb24oZSl7Vm4ub3B0aW9uc1tlKyJzIl09T2JqZWN0LmNyZWF0ZShudWxsKX0pLEIoKFZuLm9wdGlvbnMuX2Jhc2U9Vm4pLm9wdGlvbnMuY29tcG9uZW50cyxHbiksVm4udXNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2luc3RhbGxlZFBsdWdpbnN8fCh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zPVtdKTtpZigtMTx0LmluZGV4T2YoZSkpcmV0dXJuIHRoaXM7dmFyIG49eShhcmd1bWVudHMsMSk7cmV0dXJuIG4udW5zaGlmdCh0aGlzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5pbnN0YWxsP2UuaW5zdGFsbC5hcHBseShlLG4pOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmFwcGx5KG51bGwsbiksdC5wdXNoKGUpLHRoaXN9LFZuLm1peGluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnM9QWUodGhpcy5vcHRpb25zLGUpLHRoaXN9LERuKFZuKSxxbj1WbixqLmZvckVhY2goZnVuY3Rpb24obil7cW5bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8oImNvbXBvbmVudCI9PT1uJiZkKHQpJiYodC5uYW1lPXQubmFtZXx8ZSx0PXRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQodCkpLCJkaXJlY3RpdmUiPT09biYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXtiaW5kOnQsdXBkYXRlOnR9KSx0aGlzLm9wdGlvbnNbbisicyJdW2VdPXQpOnRoaXMub3B0aW9uc1tuKyJzIl1bZV19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE5uLnByb3RvdHlwZSwiJGlzU2VydmVyIix7Z2V0OlF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTm4ucHJvdG90eXBlLCIkc3NyQ29udGV4dCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR2bm9kZSYmdGhpcy4kdm5vZGUuc3NyQ29udGV4dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTm4sIkZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0Iix7dmFsdWU6U3R9KSxObi52ZXJzaW9uPSIyLjYuMTAiO3ZhciBYbj0xO2Z1bmN0aW9uIEpuKGUpe3RoaXMuaW5zdGFuY2VJZD0iIix0aGlzLm5vZGVJZD1YbisrLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMubm9kZVR5cGU9Myx0aGlzLnRleHQ9ZX1mdW5jdGlvbiBZbihlKXtyZXR1cm4gYS5jcmVhdGVFbGVtZW50KGUpfXZhciBLbj1PYmplY3QuZnJlZXplKHtuYW1lc3BhY2VNYXA6e30sY3JlYXRlRWxlbWVudDpZbixjcmVhdGVFbGVtZW50TlM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYS5jcmVhdGVFbGVtZW50KGUrIjoiK3QpfSxjcmVhdGVUZXh0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEpuKGUpfSxjcmVhdGVDb21tZW50OmZ1bmN0aW9uKGUpe3JldHVybiBhLmNyZWF0ZUNvbW1lbnQoZSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbil7aWYoMyE9PXQubm9kZVR5cGUpZS5pbnNlcnRCZWZvcmUodCxuKTtlbHNle3ZhciByPSJ3ZWV4Ij09PWEuX18kY29tcGlsZXJfXz8idGV4dCI6InUtdGV4dCI7aWYoZS50eXBlPT09cillLnNldEF0dHIoInZhbHVlIix0LnRleHQpLHQucGFyZW50Tm9kZT1lO2Vsc2V7dmFyIGk9WW4ocik7aS5zZXRBdHRyKCJ2YWx1ZSIsdC50ZXh0KSxlLmluc2VydEJlZm9yZShpLG4pfX19LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCl7MyE9PXQubm9kZVR5cGU/ZS5yZW1vdmVDaGlsZCh0KTplLnNldEF0dHIoInZhbHVlIiwiIil9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUsdCl7aWYoMyE9PXQubm9kZVR5cGUpZS5hcHBlbmRDaGlsZCh0KTtlbHNle3ZhciBuPSJ3ZWV4Ij09PWEuX18kY29tcGlsZXJfXz8idGV4dCI6InUtdGV4dCI7aWYoZS50eXBlPT09billLnNldEF0dHIoInZhbHVlIix0LnRleHQpLHQucGFyZW50Tm9kZT1lO2Vsc2V7dmFyIHI9WW4obik7ci5zZXRBdHRyKCJ2YWx1ZSIsdC50ZXh0KSxlLmFwcGVuZENoaWxkKHIpfX19LHBhcmVudE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZX0sbmV4dFNpYmxpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9LHRhZ05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZX0sc2V0VGV4dENvbnRlbnQ6ZnVuY3Rpb24oZSx0KXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZXRBdHRyKCJ2YWx1ZSIsdCl9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbihlLHQsbil7ZS5zZXRBdHRyKHQsbil9LHNldFN0eWxlU2NvcGU6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHIoIkBzdHlsZVNjb3BlIix0KX19KSxabj17Y3JlYXRlOmZ1bmN0aW9uKGUsdCl7UW4odCl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe2UuZGF0YS5yZWYhPT10LmRhdGEucmVmJiYoUW4oZSwhMCksUW4odCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe1FuKGUsITApfX07ZnVuY3Rpb24gUW4oZSx0KXt2YXIgbj1lLmRhdGEucmVmO2lmKEkobikpe3ZhciByPWUuY29udGV4dCxpPWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZWxtLG89ci4kcmVmczt0P0FycmF5LmlzQXJyYXkob1tuXSk/ayhvW25dLGkpOm9bbl09PT1pJiYob1tuXT12b2lkIDApOmUuZGF0YS5yZWZJbkZvcj9BcnJheS5pc0FycmF5KG9bbl0pP29bbl0uaW5kZXhPZihpKTwwJiZvW25dLnB1c2goaSk6b1tuXT1baV06b1tuXT1pfX1zKCJodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSxhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLGVtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLGNhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSxkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCIpLHMoInN2ZyxhbmltYXRlLGNpcmNsZSxjbGlwcGF0aCxjdXJzb3IsZGVmcyxkZXNjLGVsbGlwc2UsZmlsdGVyLGZvbnQtZmFjZSxmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybixwb2x5Z29uLHBvbHlsaW5lLHJlY3Qsc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRwYXRoLHRzcGFuLHVzZSx2aWV3IiwhMCk7dmFyIGVyPXMoInRleHQsbnVtYmVyLHBhc3N3b3JkLHNlYXJjaCxlbWFpbCx0ZWwsdXJsIiksdHI9bmV3IHVlKCIiLHt9LFtdKSxucj1bImNyZWF0ZSIsImFjdGl2YXRlIiwidXBkYXRlIiwicmVtb3ZlIiwiZGVzdHJveSJdO2Z1bmN0aW9uIHJyKGUsdCl7cmV0dXJuIGUua2V5PT09dC5rZXkmJihlLnRhZz09PXQudGFnJiZlLmlzQ29tbWVudD09PXQuaXNDb21tZW50JiZJKGUuZGF0YSk9PT1JKHQuZGF0YSkmJmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0IiE9PWUudGFnKXJldHVybiEwO3ZhciBuLHI9SShuPWUuZGF0YSkmJkkobj1uLmF0dHJzKSYmbi50eXBlLGk9SShuPXQuZGF0YSkmJkkobj1uLmF0dHJzKSYmbi50eXBlO3JldHVybiByPT09aXx8ZXIocikmJmVyKGkpfShlLHQpfHxBKGUuaXNBc3luY1BsYWNlaG9sZGVyKSYmZS5hc3luY0ZhY3Rvcnk9PT10LmFzeW5jRmFjdG9yeSYmRSh0LmFzeW5jRmFjdG9yeS5lcnJvcikpfWZ1bmN0aW9uIGlyKGUsdCxuKXt2YXIgcixpLG89e307Zm9yKHI9dDtyPD1uOysrcilJKGk9ZVtyXS5rZXkpJiYob1tpXT1yKTtyZXR1cm4gb312YXIgb3I9e2NyZWF0ZTphcix1cGRhdGU6YXIsZGVzdHJveTpmdW5jdGlvbihlKXthcihlLHRyKX19O2Z1bmN0aW9uIGFyKGUsdCl7KGUuZGF0YS5kaXJlY3RpdmVzfHx0LmRhdGEuZGlyZWN0aXZlcykmJmZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89dD09PXRyLGE9bj09PXRyLHM9Y3IodC5kYXRhLmRpcmVjdGl2ZXMsdC5jb250ZXh0KSxjPWNyKG4uZGF0YS5kaXJlY3RpdmVzLG4uY29udGV4dCksdT1bXSxsPVtdO2ZvcihlIGluIGMpcj1zW2VdLGk9Y1tlXSxyPyhpLm9sZFZhbHVlPXIudmFsdWUsaS5vbGRBcmc9ci5hcmcsdXIoaSwidXBkYXRlIixuLHQpLGkuZGVmJiZpLmRlZi5jb21wb25lbnRVcGRhdGVkJiZsLnB1c2goaSkpOih1cihpLCJiaW5kIixuLHQpLGkuZGVmJiZpLmRlZi5pbnNlcnRlZCYmdS5wdXNoKGkpKTtpZih1Lmxlbmd0aCl7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHUubGVuZ3RoO2UrKyl1cih1W2VdLCJpbnNlcnRlZCIsbix0KX07bz9ZZShuLCJpbnNlcnQiLGQpOmQoKX1sLmxlbmd0aCYmWWUobiwicG9zdHBhdGNoIixmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bC5sZW5ndGg7ZSsrKXVyKGxbZV0sImNvbXBvbmVudFVwZGF0ZWQiLG4sdCl9KTtpZighbylmb3IoZSBpbiBzKWNbZV18fHVyKHNbZV0sInVuYmluZCIsdCx0LGEpfShlLHQpfXZhciBzcj1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIGNyKGUsdCl7dmFyIG4scixpLG89T2JqZWN0LmNyZWF0ZShudWxsKTtpZighZSlyZXR1cm4gbztmb3Iobj0wO248ZS5sZW5ndGg7bisrKShyPWVbbl0pLm1vZGlmaWVyc3x8KHIubW9kaWZpZXJzPXNyKSwob1soaT1yLGkucmF3TmFtZXx8aS5uYW1lKyIuIitPYmplY3Qua2V5cyhpLm1vZGlmaWVyc3x8e30pLmpvaW4oIi4iKSldPXIpLmRlZj0kZSh0LiRvcHRpb25zLCJkaXJlY3RpdmVzIixyLm5hbWUpO3JldHVybiBvfWZ1bmN0aW9uIHVyKHQsbixyLGUsaSl7dmFyIG89dC5kZWYmJnQuZGVmW25dO2lmKG8pdHJ5e28oci5lbG0sdCxyLGUsaSl9Y2F0Y2goZSl7QmUoZSxyLmNvbnRleHQsImRpcmVjdGl2ZSAiK3QubmFtZSsiICIrbisiIGhvb2siKX19dmFyIGxyPVtabixvcl0sZHI9dShmdW5jdGlvbihlKXt2YXIgbj17fSxyPS86KC4rKS87cmV0dXJuIGUuc3BsaXQoLzsoPyFbXihdKlwpKS9nKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWUuc3BsaXQocik7MTx0Lmxlbmd0aCYmKG5bdFswXS50cmltKCldPXRbMV0udHJpbSgpKX19KSxufSk7ZnVuY3Rpb24gZnIoZSl7dmFyIHQ9cHIoZS5zdHlsZSk7cmV0dXJuIGUuc3RhdGljU3R5bGU/QihlLnN0YXRpY1N0eWxlLHQpOnR9ZnVuY3Rpb24gcHIoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/eChlKToic3RyaW5nIj09dHlwZW9mIGU/ZHIoZSk6ZX12YXIgaHI9e3ZpZXc6e2NsYXNzOlsiaG92ZXJDbGFzcyJdLHN0eWxlOltdfSxidXR0b246e2NsYXNzOlsiaG92ZXJDbGFzcyJdLHN0eWxlOltdfSxuYXZpZ2F0b3I6e2NsYXNzOlsiaG92ZXJDbGFzcyJdLHN0eWxlOltdfSwidS1pbnB1dCI6e2NsYXNzOlsicGxhY2Vob2xkZXJDbGFzcyJdLHN0eWxlOlsicGxhY2Vob2xkZXJTdHlsZSJdfSwidS10ZXh0YXJlYSI6e2NsYXNzOlsicGxhY2Vob2xkZXJDbGFzcyJdLHN0eWxlOlsicGxhY2Vob2xkZXJTdHlsZSJdfSwicGlja2VyLXZpZXciOntjbGFzczpbImluZGljYXRvckNsYXNzIiwibWFza0NsYXNzIl0sc3R5bGU6WyJpbmRpY2F0b3JTdHlsZSIsIm1hc2tTdHlsZSJdfX07ZnVuY3Rpb24gdnIoZSx0LG4scil7aWYoIXQpcmV0dXJuIHQ7dmFyIGk9aHJbbi50eXBlXTtpZihpKXtpZigtMSE9PWkuY2xhc3MuaW5kZXhPZihlKSlyZXR1cm4gci4kb3B0aW9ucy5zdHlsZSYmci4kb3B0aW9ucy5zdHlsZVt0XXx8e307aWYoLTEhPT1pLnN0eWxlLmluZGV4T2YoZSkpcmV0dXJuIHByKHQpfXJldHVybiB0fWZ1bmN0aW9uIGdyKGUsdCl7aWYoZS5kYXRhLmF0dHJzfHx0LmRhdGEuYXR0cnMpe3ZhciBuLHIsaT10LmVsbSxvPWUuZGF0YS5hdHRyc3x8e30sYT10LmRhdGEuYXR0cnN8fHt9O2EuX19vYl9fJiYoYT10LmRhdGEuYXR0cnM9Qih7fSxhKSk7dmFyIHM9ImZ1bmN0aW9uIj09dHlwZW9mIGkuc2V0QXR0cnMsYz17fTtmb3IobiBpbiBhKXI9YVtuXSxvW25dIT09ciYmKHM/Y1tuXT1yOmkuc2V0QXR0cihuLHZyKG4scixpLHQuY29udGV4dCkpKTtmb3IobiBpbiBvKW51bGw9PWFbbl0mJihzP2Nbbl09dm9pZCAwOmkuc2V0QXR0cihuKSk7cyYmaS5zZXRBdHRycyhmdW5jdGlvbihvLGUsdCl7dmFyIGE9aHJbZS50eXBlXTtpZighYSlyZXR1cm4gbzt2YXIgcz10LiRvcHRpb25zLnN0eWxlfHx7fSxjPXNbIkBWRVJTSU9OIl18fDE7cmV0dXJuIE9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9b1tlXTtpZigtMSE9PWEuY2xhc3MuaW5kZXhPZihlKSlpZihjPDJ8fCEoIi4iK3QgaW4gcykpb1tlXT1zW3RdfHx7fTtlbHNle3ZhciBuPShzWyIuIit0XXx8e30pWyIiXXx8e30scj17fTtmb3IodmFyIGkgaW4gbilyW2ldPW5baV1bMF07b1tlXT1yfWVsc2UtMSE9PWEuc3R5bGUuaW5kZXhPZihlKSYmKG9bZV09cHIodCkpfSksb30oYyxpLHQuY29udGV4dCkpfX12YXIgbXI9e2NyZWF0ZTpncix1cGRhdGU6Z3J9O2Z1bmN0aW9uIHlyKGUpe2Zvcih2YXIgdD1fcihlKSxuPWUscj1lO0koci5jb21wb25lbnRJbnN0YW5jZSk7KShyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmci5kYXRhJiYodD1CKF9yKHIpLHQpKTtmb3IoO0kobj1uLnBhcmVudCk7KW4mJm4uZGF0YSYmKHQ9Qih0LF9yKG4pKSk7cmV0dXJuIHR9ZnVuY3Rpb24gX3IoZSl7dmFyIHQsbixyLGksbz1lLmRhdGE7cmV0dXJuIEUoby5zdGF0aWNDbGFzcykmJkUoby5jbGFzcyk/e306KHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1lLnN0YXRpY0NsYXNzLHI9ZS5jbGFzcztuJiZ0LnB1c2guYXBwbHkodCxuKTtBcnJheS5pc0FycmF5KHIpP3QucHVzaC5hcHBseSh0LHIpOmIocik/dC5wdXNoLmFwcGx5KHQsT2JqZWN0LmtleXMocikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiByW2VdfSkpOiJzdHJpbmciPT10eXBlb2YgciYmdC5wdXNoLmFwcGx5KHQsci50cmltKCkuc3BsaXQoL1xzKy8pKTtyZXR1cm4gdH0obyksbj1lLmNvbnRleHQscj1uLiRvcHRpb25zLnN0eWxlfHx7fSxpPXt9LHQuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1yW2VdO0IoaSx0KX0pLGkpfWZ1bmN0aW9uIGJyKGUsdCxuLHIpe3ZhciBpLG8sYT17fTtmb3IobyBpbiBuKUUodFtvXSkmJihhW3IobyldPSIiKTtmb3IobyBpbiB0KShpPXRbb10pIT09bltvXSYmKGFbcihvKV09aSk7ZS5zZXRTdHlsZXMoYSl9ZnVuY3Rpb24gd3IoZSx0LG4pe3ZhciByPXQmJnQuY29udGV4dC4kb3B0aW9ucy5zdHlsZTtyJiYhZS5pbmNsdWRlcyhyKSYmKG4/ZS51bnNoaWZ0KHIpOmUucHVzaChyKSl9ZnVuY3Rpb24ga3IoZSl7Zm9yKHZhciB0PWUuZGF0YSxuPWUscj1lO0koci5jb21wb25lbnRJbnN0YW5jZSk7KShyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmci5kYXRhJiYodD1TcihyLmRhdGEsdCkpO2Zvcig7SShuPW4ucGFyZW50KTspbiYmbi5kYXRhJiYodD1Tcih0LG4uZGF0YSkpO3JldHVybiBmdW5jdGlvbihlLHQpe2lmKEkoZSl8fEkodCkpcmV0dXJuIHhyKENyKGUpLENyKHQpKTtyZXR1cm4iIn0odC5zdGF0aWNDbGFzcyx0LmNsYXNzKX1mdW5jdGlvbiBTcihlLHQpe3JldHVybntzdGF0aWNDbGFzczp4cihDcihlLnN0YXRpY0NsYXNzKSxDcih0LnN0YXRpY0NsYXNzKSksY2xhc3M6SShlLmNsYXNzKT9bZS5jbGFzcyx0LmNsYXNzXTp0LmNsYXNzfX1mdW5jdGlvbiB4cihlLHQpe3JldHVybiBlP3Q/ZSsiICIrdDplOnR8fCIifWZ1bmN0aW9uIENyKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPSIiLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspSSh0PUNyKGVbcl0pKSYmIiIhPT10JiYobiYmKG4rPSIgIiksbis9dCk7cmV0dXJuIG59KGUpOmIoZSk/ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7Zm9yKHZhciBuIGluIGUpZVtuXSYmKHQmJih0Kz0iICIpLHQrPW4pO3JldHVybiB0fShlKToic3RyaW5nIj09dHlwZW9mIGU/ZToiIn1mdW5jdGlvbiBUcihlLHQpe3ZhciBuPXQuZGF0YSxyPWUuZGF0YTtpZighKEUobi5zdGF0aWNDbGFzcykmJkUobi5jbGFzcykmJihFKHIpfHxFKHIuc3RhdGljQ2xhc3MpJiZFKHIuY2xhc3MpKSkpe3ZhciBpPSJ3ZWV4Ij09PWEuX18kc3R5bGVDb21waWxlcl9fO2lmKGEuX18kYXV0b21hdG9yX198fCFpKXtpfHx0LmVsbS5zZXRTdHlsZXNoZWV0JiZ0LmVsbS5zZXRTdHlsZXNoZWV0KGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49ZSxyPWU7Zm9yKHdyKHQsZSk7SShyLmNvbXBvbmVudEluc3RhbmNlKTspd3IodCxyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLCEwKTtmb3IoO0kobj1uLnBhcmVudCk7KXdyKHQsbik7cmV0dXJuIHR9KHQpKTt2YXIgbz1rcih0KTt0LmVsbS5zZXRDbGFzc0xpc3QmJnQuZWxtLnNldENsYXNzTGlzdChvLnNwbGl0KCIgIikpfWkmJmJyKHQuZWxtLHlyKHQpLHlyKGUpLE9yKX19ZnVuY3Rpb24gT3IoZSl7cmV0dXJuIGV9dmFyIEVyLElyLEFyPXtjcmVhdGU6VHIsdXBkYXRlOlRyfTtmdW5jdGlvbiAkcihlLHQsbixyLGkpe2lmKG4pY29uc29sZS5sb2coIldlZXggZG8gbm90IHN1cHBvcnQgZXZlbnQgaW4gYnViYmxlIHBoYXNlLiIpO2Vsc2V7aWYoSXImJklyLl92aXJ0dWFsQ29tcG9uZW50cyl7RXIuX2NvbnRleHQ9SXI7dmFyIG89dDt0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcj0odFswXXx8e30pLmNvbXBvbmVudElkLGk9dGhpcy5fY29udGV4dDtyJiZ0aGlzLl9jb250ZXh0JiYoaT0odGhpcy5fY29udGV4dC5fdmlydHVhbENvbXBvbmVudHN8fHt9KVtyXXx8aSk7dHJ5eyFmdW5jdGlvbihlLHQsbil7dm9pZCAwPT09biYmKG49bnVsbCk7dmFyIHI9ZS5mbnM7aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseShuLHQpOmUuYXBwbHkobix0KTtmb3IodmFyIGk9ci5zbGljZSgpLG89MDtvPGkubGVuZ3RoO28rKylpW29dLmFwcGx5KG4sdCl9KG8sdCxpKX1jYXRjaChlKXtCZShlLGksIkZhaWxlZCB0byBpbnZva2UgdmlydHVhbCBjb21wb25lbnQgaGFuZGxlciAoIityKyIpIil9fX1Fci5hZGRFdmVudChlLHQsaSl9fWZ1bmN0aW9uIFByKGUsdCxuLHIpeyhyfHxFcikucmVtb3ZlRXZlbnQoZSl9ZnVuY3Rpb24gTXIoZSx0KXtpZihlLmRhdGEub258fHQuZGF0YS5vbil7dmFyIG49dC5kYXRhLm9ufHx7fSxyPWUuZGF0YS5vbnx8e307RXI9dC5lbG0sSXI9dC5jb250ZXh0LEplKG4sciwkcixQcix0LmNvbnRleHQpLElyPUVyPXZvaWQgMH19dmFyIGpyPXtjcmVhdGU6TXIsdXBkYXRlOk1yfSxMcj11KGgpO2Z1bmN0aW9uIEJyKGUsdCl7dmFyIG49dC5kYXRhLHI9ZS5kYXRhO2lmKCEoRShuLnN0YXRpY1N0eWxlKSYmRShuLnN0eWxlKSYmRShyLnN0YXRpY1N0eWxlKSYmRShyLnN0eWxlKSkpe3ZhciBpPXQuZWxtLG89ci5zdGF0aWNTdHlsZSxhPXIubm9ybWFsaXplZFN0eWxlfHxyLnN0eWxlfHx7fSxzPW98fGEsYz1wcih0LmRhdGEuc3R5bGUpfHx7fTt0LmRhdGEubm9ybWFsaXplZFN0eWxlPUkoYy5fX29iX18pP0Ioe30sYyk6YyxicihpLGZ1bmN0aW9uKGUsdCl7dmFyIG4scj17fTtpZih0KWZvcih2YXIgaT1lO2kuY29tcG9uZW50SW5zdGFuY2U7KShpPWkuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmaS5kYXRhJiYobj1mcihpLmRhdGEpKSYmQihyLG4pOyhuPWZyKGUuZGF0YSkpJiZCKHIsbik7Zm9yKHZhciBvPWU7bz1vLnBhcmVudDspby5kYXRhJiYobj1mcihvLmRhdGEpKSYmQihyLG4pO3JldHVybiByfSh0LCEwKSxzLExyKX19dmFyIE5yPXtjcmVhdGU6QnIsdXBkYXRlOkJyfTtmdW5jdGlvbiBEcihlKXtpZihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciB0PXt9O3JldHVybiExIT09ZS5jc3MmJkIodCxScihlLm5hbWV8fCJ2IikpLEIodCxlKSx0fXJldHVybiJzdHJpbmciPT10eXBlb2YgZT9ScihlKTp2b2lkIDB9fXZhciBScj11KGZ1bmN0aW9uKGUpe3JldHVybntlbnRlckNsYXNzOmUrIi1lbnRlciIsZW50ZXJUb0NsYXNzOmUrIi1lbnRlci10byIsZW50ZXJBY3RpdmVDbGFzczplKyItZW50ZXItYWN0aXZlIixsZWF2ZUNsYXNzOmUrIi1sZWF2ZSIsbGVhdmVUb0NsYXNzOmUrIi1sZWF2ZS10byIsbGVhdmVBY3RpdmVDbGFzczplKyItbGVhdmUtYWN0aXZlIn19KTtxJiYhSiYmKHZvaWQgMD09PXdpbmRvdy5vbnRyYW5zaXRpb25lbmQmJndpbmRvdy5vbndlYmtpdHRyYW5zaXRpb25lbmQsdm9pZCAwPT09d2luZG93Lm9uYW5pbWF0aW9uZW5kJiZ3aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQpO3EmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpO2Z1bmN0aW9uIEZyKGUsbil7dmFyIHI9bi5lbG07ci5fbGVhdmVDYiYmKHIuX2xlYXZlQ2IuY2FuY2VsbGVkPSEwLHIuX2xlYXZlQ2IoKSk7dmFyIHQ9RHIobi5kYXRhLnRyYW5zaXRpb24pO2lmKHQmJiFyLl9lbnRlckNiKXtmb3IodmFyIGk9dC5lbnRlckNsYXNzLG89dC5lbnRlclRvQ2xhc3MsYT10LmVudGVyQWN0aXZlQ2xhc3Mscz10LmFwcGVhckNsYXNzLGM9dC5hcHBlYXJUb0NsYXNzLHU9dC5hcHBlYXJBY3RpdmVDbGFzcyxsPXQuYmVmb3JlRW50ZXIsZD10LmVudGVyLGY9dC5hZnRlckVudGVyLHA9dC5lbnRlckNhbmNlbGxlZCxoPXQuYmVmb3JlQXBwZWFyLHY9dC5hcHBlYXIsZz10LmFmdGVyQXBwZWFyLG09dC5hcHBlYXJDYW5jZWxsZWQseT10bixfPXRuLiR2bm9kZTtfJiZfLnBhcmVudDspeT0oXz1fLnBhcmVudCkuY29udGV4dDt2YXIgYj0heS5faXNNb3VudGVkfHwhbi5pc1Jvb3RJbnNlcnQ7aWYoIWJ8fHZ8fCIiPT09dil7dmFyIHc9Yj9zOmksaz1iP2M6byxTPWI/dTphLHg9YiYmaHx8bCxDPWImJiJmdW5jdGlvbiI9PXR5cGVvZiB2P3Y6ZCxUPWImJmd8fGYsTz1iJiZtfHxwLEU9QyYmMTwoQy5fbGVuZ3RofHxDLmxlbmd0aCksST1uLmNvbnRleHQuJG9wdGlvbnMuc3R5bGV8fHt9LEE9SVt3XSwkPUlbIkBUUkFOU0lUSU9OIl0mJklbIkBUUkFOU0lUSU9OIl1bU118fHt9LFA9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz17fSxhPXRbbl0scz10W3JdLGM9dFtpXTtpZihhKWZvcih2YXIgdSBpbiBhKW9bdV09ZS5zdHlsZVt1XTtpZihjKWZvcih2YXIgbCBpbiBjKTAhPT1sLmluZGV4T2YoInRyYW5zaXRpb24iKSYmKG9bbF09Y1tsXSk7cyYmQihvLHMpO3JldHVybiBvfShyLEksdyxrLFMpLE09MDxPYmplY3Qua2V5cyhQKS5sZW5ndGgsaj1yLl9lbnRlckNiPUQoZnVuY3Rpb24oKXtqLmNhbmNlbGxlZD9PJiZPKHIpOlQmJlQociksci5fZW50ZXJDYj1udWxsfSk7aWYoc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBlPXIucGFyZW50Tm9kZSx0PWUmJmUuX3BlbmRpbmcmJmUuX3BlbmRpbmdbbi5rZXldOyh0JiZ0LmNvbnRleHQ9PT1uLmNvbnRleHQmJnQudGFnPT09bi50YWcmJnQuZWxtLl9sZWF2ZUNiJiZ0LmVsbS5fbGVhdmVDYigpLEMmJkMocixqKSxNKT9uLmNvbnRleHQuJHJlcXVpcmVXZWV4TW9kdWxlKCJhbmltYXRpb24iKS50cmFuc2l0aW9uKHIucmVmLHtzdHlsZXM6UCxkdXJhdGlvbjokLmR1cmF0aW9ufHwwLGRlbGF5OiQuZGVsYXl8fDAsdGltaW5nRnVuY3Rpb246JC50aW1pbmdGdW5jdGlvbnx8ImxpbmVhciJ9LEU/TjpqKTpFfHxqKCl9LDE2KSx4JiZ4KHIpLEEpaWYoImZ1bmN0aW9uIj09dHlwZW9mIHIuc2V0U3R5bGVzKXIuc2V0U3R5bGVzKEEpO2Vsc2UgZm9yKHZhciBMIGluIEEpci5zZXRTdHlsZShMLEFbTF0pO018fEV8fGooKX19fXZhciBVcj1mdW5jdGlvbihlKXt2YXIgcix0LHk9e30sbj1lLm1vZHVsZXMsXz1lLm5vZGVPcHM7Zm9yKHI9MDtyPG5yLmxlbmd0aDsrK3IpZm9yKHlbbnJbcl1dPVtdLHQ9MDt0PG4ubGVuZ3RoOysrdClJKG5bdF1bbnJbcl1dKSYmeVtucltyXV0ucHVzaChuW3RdW25yW3JdXSk7ZnVuY3Rpb24gbyhlKXt2YXIgdD1fLnBhcmVudE5vZGUoZSk7SSh0KSYmXy5yZW1vdmVDaGlsZCh0LGUpfWZ1bmN0aW9uIGIoZSx0LG4scixpLG8sYSl7aWYoSShlLmVsbSkmJkkobykmJihlPW9bYV09cGUoZSkpLGUuaXNSb290SW5zZXJ0PSFpLCFmdW5jdGlvbihlLHQsbixyKXt2YXIgaT1lLmRhdGE7aWYoSShpKSl7dmFyIG89SShlLmNvbXBvbmVudEluc3RhbmNlKSYmaS5rZWVwQWxpdmU7aWYoSShpPWkuaG9vaykmJkkoaT1pLmluaXQpJiZpKGUsITEsbixyKSxJKGUuY29tcG9uZW50SW5zdGFuY2UpKXJldHVybiBwKGUsdCksZChuLGUuZWxtLHIpLEEobykmJmZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaSxvPWU7by5jb21wb25lbnRJbnN0YW5jZTspaWYobz1vLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSxJKGk9by5kYXRhKSYmSShpPWkudHJhbnNpdGlvbikpe2ZvcihpPTA7aTx5LmFjdGl2YXRlLmxlbmd0aDsrK2kpeS5hY3RpdmF0ZVtpXSh0cixvKTt0LnB1c2gobyk7YnJlYWt9ZChuLGUuZWxtLHIpfShlLHQsbixyKSwhMH19KGUsdCxuLHIpKXt2YXIgcz1lLmRhdGEsYz1lLmNoaWxkcmVuLHU9ZS50YWc7aWYoSSh1KSl7ZS5lbG09ZS5ucz9fLmNyZWF0ZUVsZW1lbnROUyhlLm5zLHUpOl8uY3JlYXRlRWxlbWVudCh1LGUpLGYoZSk7dmFyIGw9SShzKSYmQShzLmFwcGVuZEFzVHJlZSk7bHx8KEkocykmJnYoZSx0KSxkKG4sZS5lbG0scikpLGgoZSxjLHQpLGwmJihJKHMpJiZ2KGUsdCksZChuLGUuZWxtLHIpKX1lbHNlIEEoZS5pc0NvbW1lbnQpP2UuZWxtPV8uY3JlYXRlQ29tbWVudChlLnRleHQpOmUuZWxtPV8uY3JlYXRlVGV4dE5vZGUoZS50ZXh0KSxkKG4sZS5lbG0scil9fWZ1bmN0aW9uIHAoZSx0KXtJKGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSYmKHQucHVzaC5hcHBseSh0LGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSxlLmRhdGEucGVuZGluZ0luc2VydD1udWxsKSxlLmVsbT1lLmNvbXBvbmVudEluc3RhbmNlLiRlbCx3KGUpPyh2KGUsdCksZihlKSk6KFFuKGUpLHQucHVzaChlKSl9ZnVuY3Rpb24gZChlLHQsbil7SShlKSYmKEkobik/Xy5wYXJlbnROb2RlKG4pPT09ZSYmXy5pbnNlcnRCZWZvcmUoZSx0LG4pOl8uYXBwZW5kQ2hpbGQoZSx0KSl9ZnVuY3Rpb24gaChlLHQsbil7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrciliKHRbcl0sbixlLmVsbSxudWxsLCEwLHQscik7ZWxzZSAkKGUudGV4dCkmJl8uYXBwZW5kQ2hpbGQoZS5lbG0sXy5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoZS50ZXh0KSkpfWZ1bmN0aW9uIHcoZSl7Zm9yKDtlLmNvbXBvbmVudEluc3RhbmNlOyllPWUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO3JldHVybiBJKGUudGFnKX1mdW5jdGlvbiB2KGUsdCl7Zm9yKHZhciBuPTA7bjx5LmNyZWF0ZS5sZW5ndGg7KytuKXkuY3JlYXRlW25dKHRyLGUpO0kocj1lLmRhdGEuaG9vaykmJihJKHIuY3JlYXRlKSYmci5jcmVhdGUodHIsZSksSShyLmluc2VydCkmJnQucHVzaChlKSl9ZnVuY3Rpb24gZihlKXt2YXIgdDtpZihJKHQ9ZS5mblNjb3BlSWQpKV8uc2V0U3R5bGVTY29wZShlLmVsbSx0KTtlbHNlIGZvcih2YXIgbj1lO247KUkodD1uLmNvbnRleHQpJiZJKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJl8uc2V0U3R5bGVTY29wZShlLmVsbSx0KSxuPW4ucGFyZW50O0kodD10bikmJnQhPT1lLmNvbnRleHQmJnQhPT1lLmZuQ29udGV4dCYmSSh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZfLnNldFN0eWxlU2NvcGUoZS5lbG0sdCl9ZnVuY3Rpb24gbShlLHQsbixyLGksbyl7Zm9yKDtyPD1pOysrciliKG5bcl0sbyxlLHQsITEsbixyKX1mdW5jdGlvbiBrKGUpe3ZhciB0LG4scj1lLmRhdGE7aWYoSShyKSlmb3IoSSh0PXIuaG9vaykmJkkodD10LmRlc3Ryb3kpJiZ0KGUpLHQ9MDt0PHkuZGVzdHJveS5sZW5ndGg7Kyt0KXkuZGVzdHJveVt0XShlKTtpZihJKHQ9ZS5jaGlsZHJlbikpZm9yKG49MDtuPGUuY2hpbGRyZW4ubGVuZ3RoOysrbilrKGUuY2hpbGRyZW5bbl0pfWZ1bmN0aW9uIFMoZSx0LG4scil7Zm9yKDtuPD1yOysrbil7dmFyIGk9dFtuXTtJKGkpJiYoSShpLnRhZyk/KGEoaSksayhpKSk6byhpLmVsbSkpfX1mdW5jdGlvbiBhKGUsdCl7aWYoSSh0KXx8SShlLmRhdGEpKXt2YXIgbixyPXkucmVtb3ZlLmxlbmd0aCsxO2ZvcihJKHQpP3QubGlzdGVuZXJzKz1yOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbyhlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxyKSxJKG49ZS5jb21wb25lbnRJbnN0YW5jZSkmJkkobj1uLl92bm9kZSkmJkkobi5kYXRhKSYmYShuLHQpLG49MDtuPHkucmVtb3ZlLmxlbmd0aDsrK24peS5yZW1vdmVbbl0oZSx0KTtJKG49ZS5kYXRhLmhvb2spJiZJKG49bi5yZW1vdmUpP24oZSx0KTp0KCl9ZWxzZSBvKGUuZWxtKX1mdW5jdGlvbiB4KGUsdCxuLHIpe2Zvcih2YXIgaT1uO2k8cjtpKyspe3ZhciBvPXRbaV07aWYoSShvKSYmcnIoZSxvKSlyZXR1cm4gaX19ZnVuY3Rpb24gQyhlLHQsbixyLGksbyl7aWYoZSE9PXQpe0kodC5lbG0pJiZJKHIpJiYodD1yW2ldPXBlKHQpKTt2YXIgYT10LmVsbT1lLmVsbTtpZihBKGUuaXNBc3luY1BsYWNlaG9sZGVyKSlJKHQuYXN5bmNGYWN0b3J5LnJlc29sdmVkKT9PKGUuZWxtLHQsbik6dC5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7ZWxzZSBpZihBKHQuaXNTdGF0aWMpJiZBKGUuaXNTdGF0aWMpJiZ0LmtleT09PWUua2V5JiYoQSh0LmlzQ2xvbmVkKXx8QSh0LmlzT25jZSkpKXQuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZTtlbHNle3ZhciBzLGM9dC5kYXRhO0koYykmJkkocz1jLmhvb2spJiZJKHM9cy5wcmVwYXRjaCkmJnMoZSx0KTt2YXIgdT1lLmNoaWxkcmVuLGw9dC5jaGlsZHJlbjtpZihJKGMpJiZ3KHQpKXtmb3Iocz0wO3M8eS51cGRhdGUubGVuZ3RoOysrcyl5LnVwZGF0ZVtzXShlLHQpO0kocz1jLmhvb2spJiZJKHM9cy51cGRhdGUpJiZzKGUsdCl9RSh0LnRleHQpP0kodSkmJkkobCk/dSE9PWwmJmZ1bmN0aW9uKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGEscyxjPTAsdT0wLGw9dC5sZW5ndGgtMSxkPXRbMF0sZj10W2xdLHA9bi5sZW5ndGgtMSxoPW5bMF0sdj1uW3BdLGc9IWk7Yzw9bCYmdTw9cDspRShkKT9kPXRbKytjXTpFKGYpP2Y9dFstLWxdOnJyKGQsaCk/KEMoZCxoLHIsbix1KSxkPXRbKytjXSxoPW5bKyt1XSk6cnIoZix2KT8oQyhmLHYscixuLHApLGY9dFstLWxdLHY9blstLXBdKTpycihkLHYpPyhDKGQsdixyLG4scCksZyYmXy5pbnNlcnRCZWZvcmUoZSxkLmVsbSxfLm5leHRTaWJsaW5nKGYuZWxtKSksZD10WysrY10sdj1uWy0tcF0pOihycihmLGgpPyhDKGYsaCxyLG4sdSksZyYmXy5pbnNlcnRCZWZvcmUoZSxmLmVsbSxkLmVsbSksZj10Wy0tbF0pOihFKG8pJiYobz1pcih0LGMsbCkpLEUoYT1JKGgua2V5KT9vW2gua2V5XTp4KGgsdCxjLGwpKT9iKGgscixlLGQuZWxtLCExLG4sdSk6cnIocz10W2FdLGgpPyhDKHMsaCxyLG4sdSksdFthXT12b2lkIDAsZyYmXy5pbnNlcnRCZWZvcmUoZSxzLmVsbSxkLmVsbSkpOmIoaCxyLGUsZC5lbG0sITEsbix1KSksaD1uWysrdV0pO2w8Yz9tKGUsRShuW3ArMV0pP251bGw6bltwKzFdLmVsbSxuLHUscCxyKTpwPHUmJlMoMCx0LGMsbCl9KGEsdSxsLG4sbyk6SShsKT8oSShlLnRleHQpJiZfLnNldFRleHRDb250ZW50KGEsIiIpLG0oYSxudWxsLGwsMCxsLmxlbmd0aC0xLG4pKTpJKHUpP1MoMCx1LDAsdS5sZW5ndGgtMSk6SShlLnRleHQpJiZfLnNldFRleHRDb250ZW50KGEsIiIpOmUudGV4dCE9PXQudGV4dCYmXy5zZXRUZXh0Q29udGVudChhLHQudGV4dCksSShjKSYmSShzPWMuaG9vaykmJkkocz1zLnBvc3RwYXRjaCkmJnMoZSx0KX19fWZ1bmN0aW9uIFQoZSx0LG4pe2lmKEEobikmJkkoZS5wYXJlbnQpKWUucGFyZW50LmRhdGEucGVuZGluZ0luc2VydD10O2Vsc2UgZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpdFtyXS5kYXRhLmhvb2suaW5zZXJ0KHRbcl0pfXZhciBnPXMoImF0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleSIpO2Z1bmN0aW9uIE8oZSx0LG4scil7dmFyIGksbz10LnRhZyxhPXQuZGF0YSxzPXQuY2hpbGRyZW47aWYocj1yfHxhJiZhLnByZSx0LmVsbT1lLEEodC5pc0NvbW1lbnQpJiZJKHQuYXN5bmNGYWN0b3J5KSlyZXR1cm4gdC5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7aWYoSShhKSYmKEkoaT1hLmhvb2spJiZJKGk9aS5pbml0KSYmaSh0LCEwKSxJKGk9dC5jb21wb25lbnRJbnN0YW5jZSkpKXJldHVybiBwKHQsbiksITA7aWYoSShvKSl7aWYoSShzKSlpZihlLmhhc0NoaWxkTm9kZXMoKSlpZihJKGk9YSkmJkkoaT1pLmRvbVByb3BzKSYmSShpPWkuaW5uZXJIVE1MKSl7aWYoaSE9PWUuaW5uZXJIVE1MKXJldHVybiExfWVsc2V7Zm9yKHZhciBjPSEwLHU9ZS5maXJzdENoaWxkLGw9MDtsPHMubGVuZ3RoO2wrKyl7aWYoIXV8fCFPKHUsc1tsXSxuLHIpKXtjPSExO2JyZWFrfXU9dS5uZXh0U2libGluZ31pZighY3x8dSlyZXR1cm4hMX1lbHNlIGgodCxzLG4pO2lmKEkoYSkpe3ZhciBkPSExO2Zvcih2YXIgZiBpbiBhKWlmKCFnKGYpKXtkPSEwLHYodCxuKTticmVha30hZCYmYS5jbGFzcyYmSGUoYS5jbGFzcyl9fWVsc2UgZS5kYXRhIT09dC50ZXh0JiYoZS5kYXRhPXQudGV4dCk7cmV0dXJuITB9cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSxvKXtpZighRSh0KSl7dmFyIGEscz0hMSxjPVtdO2lmKEUoZSkpcz0hMCxiKHQsYyxpLG8pO2Vsc2V7dmFyIHU9SShlLm5vZGVUeXBlKTtpZighdSYmcnIoZSx0KSlDKGUsdCxjLG51bGwsbnVsbCxyKTtlbHNle2lmKHUpe2lmKDE9PT1lLm5vZGVUeXBlJiZlLmhhc0F0dHJpYnV0ZShNKSYmKGUucmVtb3ZlQXR0cmlidXRlKE0pLG49ITApLEEobikmJk8oZSx0LGMpKXJldHVybiBUKHQsYywhMCksZTthPWUsZT1uZXcgdWUoXy50YWdOYW1lKGEpLnRvTG93ZXJDYXNlKCkse30sW10sdm9pZCAwLGEpfXZhciBsPWUuZWxtLGQ9Xy5wYXJlbnROb2RlKGwpO2lmKGIodCxjLGwuX2xlYXZlQ2I/bnVsbDpkLF8ubmV4dFNpYmxpbmcobCkpLEkodC5wYXJlbnQpKWZvcih2YXIgZj10LnBhcmVudCxwPXcodCk7Zjspe2Zvcih2YXIgaD0wO2g8eS5kZXN0cm95Lmxlbmd0aDsrK2gpeS5kZXN0cm95W2hdKGYpO2lmKGYuZWxtPXQuZWxtLHApe2Zvcih2YXIgdj0wO3Y8eS5jcmVhdGUubGVuZ3RoOysrdil5LmNyZWF0ZVt2XSh0cixmKTt2YXIgZz1mLmRhdGEuaG9vay5pbnNlcnQ7aWYoZy5tZXJnZWQpZm9yKHZhciBtPTE7bTxnLmZucy5sZW5ndGg7bSsrKWcuZm5zW21dKCl9ZWxzZSBRbihmKTtmPWYucGFyZW50fUkoZCk/UygwLFtlXSwwLDApOkkoZS50YWcpJiZrKGUpfX1yZXR1cm4gVCh0LGMscyksdC5lbG19SShlKSYmayhlKX19KHtub2RlT3BzOktuLG1vZHVsZXM6W21yLEFyLGpyLE5yLHtjcmVhdGU6RnIsYWN0aXZhdGU6RnIscmVtb3ZlOmZ1bmN0aW9uKG4sZSl7dmFyIHI9bi5lbG07ci5fZW50ZXJDYiYmKHIuX2VudGVyQ2IuY2FuY2VsbGVkPSEwLHIuX2VudGVyQ2IoKSk7dmFyIHQ9RHIobi5kYXRhLnRyYW5zaXRpb24pO2lmKCF0KXJldHVybiBlKCk7aWYoci5fbGVhdmVDYilyZXR1cm47dmFyIGk9dC5sZWF2ZUNsYXNzLG89dC5sZWF2ZVRvQ2xhc3MsYT10LmxlYXZlQWN0aXZlQ2xhc3Mscz10LmJlZm9yZUxlYXZlLGM9dC5sZWF2ZSx1PXQuYWZ0ZXJMZWF2ZSxsPXQubGVhdmVDYW5jZWxsZWQsZD10LmRlbGF5TGVhdmUsZj1jJiYxPChjLl9sZW5ndGh8fGMubGVuZ3RoKSxwPW4uY29udGV4dC4kb3B0aW9ucy5zdHlsZXx8e30saD1wW2ldLHY9cFtvXXx8cFthXSxnPXBbIkBUUkFOU0lUSU9OIl0mJnBbIkBUUkFOU0lUSU9OIl1bYV18fHt9LG09ci5fbGVhdmVDYj1EKGZ1bmN0aW9uKCl7ci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUuX3BlbmRpbmcmJihyLnBhcmVudE5vZGUuX3BlbmRpbmdbbi5rZXldPW51bGwpLG0uY2FuY2VsbGVkP2wmJmwocik6KGUoKSx1JiZ1KHIpKSxyLl9sZWF2ZUNiPW51bGx9KTtkP2QoeSk6eSgpO2Z1bmN0aW9uIHkoKXt2YXIgZT1uLmNvbnRleHQuJHJlcXVpcmVXZWV4TW9kdWxlKCJhbmltYXRpb24iKTtmdW5jdGlvbiB0KCl7ZS50cmFuc2l0aW9uKHIucmVmLHtzdHlsZXM6dixkdXJhdGlvbjpnLmR1cmF0aW9ufHwwLGRlbGF5OmcuZGVsYXl8fDAsdGltaW5nRnVuY3Rpb246Zy50aW1pbmdGdW5jdGlvbnx8ImxpbmVhciJ9LGY/TjptKX1tLmNhbmNlbGxlZHx8KG4uZGF0YS5zaG93fHwoKHIucGFyZW50Tm9kZS5fcGVuZGluZ3x8KHIucGFyZW50Tm9kZS5fcGVuZGluZz17fSkpW24ua2V5XT1uKSxzJiZzKHIpLGg/ZS50cmFuc2l0aW9uKHIucmVmLHtzdHlsZXM6aH0sdCk6dCgpLGMmJmMocixtKSx2fHxmfHxtKCkpfX19XS5jb25jYXQobHIpLExPTkdfTElTVF9USFJFU0hPTEQ6MTB9KSx6cj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2ZSk7ZnVuY3Rpb24gVnIoZSxyKXt2YXIgaT1lLiRlbDtyZXR1cm4gaSYmImZ1bmN0aW9uIj09dHlwZW9mIGlbcl0/ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO3JldHVybiBpW3JdLmFwcGx5KGksdCl9OihpZSgiQ2FuJ3QgZmluZCBjb21wb25lbnQgbWV0aG9kIFwiIityKyciIG9uICcraS50eXBlKSxOKX1mdW5jdGlvbiBxcihlLG4pe0FycmF5LmlzQXJyYXkobikmJighZnVuY3Rpb24oZixuKXtmb3IodmFyIGU9ZnVuY3Rpb24oZSx0KXt2YXIgZD16cltlXTtGKG4sZCxmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHI9dGhpcy5sZW5ndGgsaT12ZVtkXTsiZnVuY3Rpb24iPT10eXBlb2YgaSYmaS5hcHBseSh0aGlzLHQpO3ZhciBvPVZyKGYsInJlbW92ZURhdGEiKSxhPVZyKGYsImluc2VydFJhbmdlIikscz1WcihmLCJzZXRMaXN0RGF0YSIpO3N3aXRjaChkKXtjYXNlInB1c2giOmEocix0KTticmVhaztjYXNlInBvcCI6byhyLTEsMSk7YnJlYWs7Y2FzZSJzaGlmdCI6bygwLDEpO2JyZWFrO2Nhc2UidW5zaGlmdCI6YSgwLHQpO2JyZWFrO2Nhc2Uic3BsaWNlIjp2YXIgYz10WzBdLHU9dFsxXSxsPXQuc2xpY2UoMik7MDx1JiZvKGMsdSksMDxsLmxlbmd0aCYmYShjLGwpO2JyZWFrO2Nhc2Uic29ydCI6Y2FzZSJyZXZlcnNlIjpzKHRoaXMuc2xpY2UoKSl9fSl9LHQ9MCxyPXpyLmxlbmd0aDt0PHI7dCsrKWUodCl9KGUsbiksbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2QodCkmJiFmKHQsIltbV2F0Y2hlZF1dIikmJihGKHQsIltbV2F0Y2hlZF1dIiwhMCksZS4kd2F0Y2goZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdCl0W2VdfSxmdW5jdGlvbigpe1ZyKGUsInVwZGF0ZURhdGEiKShuLmluZGV4T2YodCksdCl9LHtkZWVwOiEwfSkpfSkpfXZhciBXcj17bmFtZToicmVjeWNsZS1saXN0IixtZXRob2RzOntjbG9zZXN0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9YXJndW1lbnRzLG49W10scj1hcmd1bWVudHMubGVuZ3RoO3ItLTspbltyXT10W3JdO3JldHVybihlPXRoaXMuJGVsKS5jbG9zZXN0LmFwcGx5KGUsbil9LHF1ZXJ5RWxlbWVudDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkucXVlcnlFbGVtZW50LmFwcGx5KGUsbil9LHF1ZXJ5RWxlbWVudEFsbDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkucXVlcnlFbGVtZW50QWxsLmFwcGx5KGUsbil9LHNjcm9sbFRvRWxlbWVudDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkuc2Nyb2xsVG9FbGVtZW50LmFwcGx5KGUsbil9LHJlc2V0TG9hZG1vcmU6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1hcmd1bWVudHMsbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPXRbcl07cmV0dXJuKGU9dGhpcy4kZWwpLnJlc2V0TG9hZG1vcmUuYXBwbHkoZSxuKX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKHRoaXMuX3Zub2RlJiZ0aGlzLiRvcHRpb25zWyJbW1VzZUNhY2hlXV0iXSlyZXR1cm4gRih0aGlzLiRvcHRpb25zLCJbW1VzZUNhY2hlXV0iLCExKSx0aGlzLl92bm9kZTt2YXIgbj10aGlzLiRvcHRpb25zLnBhcmVudCxyPXRoaXMuJGF0dHJzLmJpbmRpbmdFeHByZXNzaW9uO3JldHVybiBuJiZyJiYobi4kd2F0Y2gocixmdW5jdGlvbigpe3JldHVybiBGKHQuJG9wdGlvbnMsIltbVXNlQ2FjaGVdXSIsITApfSx7ZGVlcDohMCxpbW1lZGlhdGU6ITB9KSxxcih0aGlzLHRoaXMuJGF0dHJzLmxpc3REYXRhKSxuLiR3YXRjaChyLGZ1bmN0aW9uKGUpe3FyKHQsZSl9KSksdGhpcy5fZXZlbnRzLl9hdHRhY2hfc2xvdD1mdW5jdGlvbihlKXtJdCh0LiRwYXJlbnR8fHQsZS5wb3NpdGlvbixlLnJlZnMpfSx0aGlzLl9ldmVudHMuX2RldGFjaF9zbG90PWZ1bmN0aW9uKGUpe0l0KHQuJHBhcmVudHx8dCxlLnBvc2l0aW9uLGUucmVmcywhMCl9LGUoIndlZXg6cmVjeWNsZS1saXN0Iix7b246dGhpcy5fZXZlbnRzfSx0aGlzLiRzbG90cy5kZWZhdWx0KX0scmVuZGVyRXJyb3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSgidGV4dCIse3N0eWxlOntmb250U2l6ZToiMzZweCIsY29sb3I6IiNGRjAwMDAifSx2YWx1ZTp0LnRvU3RyaW5nKCl9KX19LEhyPXtuYW1lOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixjc3M6Qm9vbGVhbixtb2RlOlN0cmluZyx0eXBlOlN0cmluZyxlbnRlckNsYXNzOlN0cmluZyxsZWF2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGxlYXZlVG9DbGFzczpTdHJpbmcsZW50ZXJBY3RpdmVDbGFzczpTdHJpbmcsbGVhdmVBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyQ2xhc3M6U3RyaW5nLGFwcGVhckFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJUb0NsYXNzOlN0cmluZyxkdXJhdGlvbjpbTnVtYmVyLFN0cmluZyxPYmplY3RdfTtmdW5jdGlvbiBHcihlKXt2YXIgdD1lJiZlLmNvbXBvbmVudE9wdGlvbnM7cmV0dXJuIHQmJnQuQ3Rvci5vcHRpb25zLmFic3RyYWN0P0dyKEp0KHQuY2hpbGRyZW4pKTplfWZ1bmN0aW9uIFhyKGUpe3ZhciB0PXt9LG49ZS4kb3B0aW9ucztmb3IodmFyIHIgaW4gbi5wcm9wc0RhdGEpdFtyXT1lW3JdO3ZhciBpPW4uX3BhcmVudExpc3RlbmVycztmb3IodmFyIG8gaW4gaSl0W2gobyldPWlbb107cmV0dXJuIHR9ZnVuY3Rpb24gSnIoZSx0KXtpZigvXGQta2VlcC1hbGl2ZSQvLnRlc3QodC50YWcpKXJldHVybiBlKCJrZWVwLWFsaXZlIix7cHJvcHM6dC5jb21wb25lbnRPcHRpb25zLnByb3BzRGF0YX0pfXZhciBZcj1mdW5jdGlvbihlKXtyZXR1cm4gZS50YWd8fFh0KGUpfSxLcj1mdW5jdGlvbihlKXtyZXR1cm4ic2hvdyI9PT1lLm5hbWV9LFpyPXtuYW1lOiJ0cmFuc2l0aW9uIixwcm9wczpIcixhYnN0cmFjdDohMCxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuJHNsb3RzLmRlZmF1bHQ7aWYobiYmKG49bi5maWx0ZXIoWXIpKS5sZW5ndGgpe3ZhciByPXRoaXMubW9kZSxpPW5bMF07aWYoZnVuY3Rpb24oZSl7Zm9yKDtlPWUucGFyZW50OylpZihlLmRhdGEudHJhbnNpdGlvbilyZXR1cm4hMH0odGhpcy4kdm5vZGUpKXJldHVybiBpO3ZhciBvPUdyKGkpO2lmKCFvKXJldHVybiBpO2lmKHRoaXMuX2xlYXZpbmcpcmV0dXJuIEpyKGUsaSk7dmFyIGE9Il9fdHJhbnNpdGlvbi0iK3RoaXMuX3VpZCsiLSI7by5rZXk9bnVsbD09by5rZXk/by5pc0NvbW1lbnQ/YSsiY29tbWVudCI6YStvLnRhZzokKG8ua2V5KT8wPT09U3RyaW5nKG8ua2V5KS5pbmRleE9mKGEpP28ua2V5OmErby5rZXk6by5rZXk7dmFyIHMsYyx1PShvLmRhdGF8fChvLmRhdGE9e30pKS50cmFuc2l0aW9uPVhyKHRoaXMpLGw9dGhpcy5fdm5vZGUsZD1HcihsKTtpZihvLmRhdGEuZGlyZWN0aXZlcyYmby5kYXRhLmRpcmVjdGl2ZXMuc29tZShLcikmJihvLmRhdGEuc2hvdz0hMCksZCYmZC5kYXRhJiYocz1vLChjPWQpLmtleSE9PXMua2V5fHxjLnRhZyE9PXMudGFnKSYmIVh0KGQpJiYoIWQuY29tcG9uZW50SW5zdGFuY2V8fCFkLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpKXt2YXIgZj1kLmRhdGEudHJhbnNpdGlvbj1CKHt9LHUpO2lmKCJvdXQtaW4iPT09cilyZXR1cm4gdGhpcy5fbGVhdmluZz0hMCxZZShmLCJhZnRlckxlYXZlIixmdW5jdGlvbigpe3QuX2xlYXZpbmc9ITEsdC4kZm9yY2VVcGRhdGUoKX0pLEpyKGUsaSk7aWYoImluLW91dCI9PT1yKXtpZihYdChvKSlyZXR1cm4gbDt2YXIgcCxoPWZ1bmN0aW9uKCl7cCgpfTtZZSh1LCJhZnRlckVudGVyIixoKSxZZSh1LCJlbnRlckNhbmNlbGxlZCIsaCksWWUoZiwiZGVsYXlMZWF2ZSIsZnVuY3Rpb24oZSl7cD1lfSl9fXJldHVybiBpfX19LFFyPUIoe3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30sSHIpO2RlbGV0ZSBRci5tb2RlO3ZhciBlaT17UmVjeWNsZUxpc3Q6V3IsVHJhbnNpdGlvbjpacixUcmFuc2l0aW9uR3JvdXA6e3Byb3BzOlFyLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRyZXF1aXJlV2VleE1vZHVsZSgiZG9tIik7dGhpcy5nZXRQb3NpdGlvbj1mdW5jdGlvbihyKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtlLmdldENvbXBvbmVudFJlY3Qoci5yZWYsZnVuY3Rpb24oZSl7ZS5yZXN1bHQ/dChlLnNpemUpOm4obmV3IEVycm9yKCJmYWlsZWQgdG8gZ2V0IHJlY3QgZm9yIGVsZW1lbnQ6ICIrci50YWcpKX0pfSl9O3ZhciByPXRoaXMuJHJlcXVpcmVXZWV4TW9kdWxlKCJhbmltYXRpb24iKTt0aGlzLmFuaW1hdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7ci50cmFuc2l0aW9uKHQucmVmLG4sZSl9KX19LHJlbmRlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50YWd8fHRoaXMuJHZub2RlLmRhdGEudGFnfHwic3BhbiIsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGhpcy5wcmV2Q2hpbGRyZW49dGhpcy5jaGlsZHJlbixpPXRoaXMuJHNsb3RzLmRlZmF1bHR8fFtdLG89dGhpcy5jaGlsZHJlbj1bXSxhPVhyKHRoaXMpLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGM9aVtzXTtjLnRhZyYmbnVsbCE9Yy5rZXkmJjAhPT1TdHJpbmcoYy5rZXkpLmluZGV4T2YoIl9fdmxpc3QiKSYmKG8ucHVzaChjKSwoKG5bYy5rZXldPWMpLmRhdGF8fChjLmRhdGE9e30pKS50cmFuc2l0aW9uPWEpfWlmKHIpe3ZhciB1PVtdLGw9W107ci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZGF0YS50cmFuc2l0aW9uPWEsbltlLmtleV0/dS5wdXNoKGUpOmwucHVzaChlKX0pLHRoaXMua2VwdD1lKHQsbnVsbCx1KSx0aGlzLnJlbW92ZWQ9bH1yZXR1cm4gZSh0LG51bGwsbyl9LGJlZm9yZVVwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX19wYXRjaF9fKHRoaXMuX3Zub2RlLHRoaXMua2VwdCwhMSwhMCksdGhpcy5fdm5vZGU9dGhpcy5rZXB0fSx1cGRhdGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcmV2Q2hpbGRyZW4sdD10aGlzLm1vdmVDbGFzc3x8KHRoaXMubmFtZXx8InYiKSsiLW1vdmUiO2UubGVuZ3RoJiZ0aGlzLmdldE1vdmVEYXRhKGVbMF0uY29udGV4dCx0KX0sbWV0aG9kczp7Z2V0TW92ZURhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLiRvcHRpb25zLnN0eWxlfHx7fTtyZXR1cm4gblsiQFRSQU5TSVRJT04iXSYmblsiQFRSQU5TSVRJT04iXVt0XX19fX0sdGk9cygidGVtcGxhdGUsc2NyaXB0LHN0eWxlLGVsZW1lbnQsY29udGVudCxzbG90LGxpbmssbWV0YSxzdmcsdmlldyxhLGRpdixpbWcsaW1hZ2UsdGV4dCx1LXRleHQsc3BhbixpbnB1dCx0ZXh0YXJlYSxzcGlubmVyLHNlbGVjdCxzbGlkZXIsc2xpZGVyLW5laWdoYm9yLGluZGljYXRvcixjYW52YXMsbGlzdCxjZWxsLGhlYWRlcixsb2FkaW5nLGxvYWRpbmctaW5kaWNhdG9yLHJlZnJlc2gsc2Nyb2xsYWJsZSxzY3JvbGxlcix2aWRlbyx3ZWIsZW1iZWQsdGFiYmFyLHRhYmhlYWRlcixkYXRlcGlja2VyLHRpbWVwaWNrZXIsbWFycXVlZSxjb3VudGRvd24iLCEwKSxuaT0ocygid2ViLHNwaW5uZXIsc3dpdGNoLHZpZGVvLHRleHRhcmVhLGNhbnZhcyxpbmRpY2F0b3IsbWFycXVlZSxjb3VudGRvd24iLCEwKSxzKCJyaWNodGV4dCx0cmFuc2l0aW9uLHRyYW5zaXRpb24tZ3JvdXAscmVjeWNsZS1saXN0IiwhMCkpO3MoImVtYmVkLGltZyxpbWFnZSxpbnB1dCxsaW5rLG1ldGEiLCEwKTtObi5jb25maWcubXVzdFVzZVByb3A9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTm4uY29uZmlnLmlzUmVzZXJ2ZWRUYWc9dGksTm4uY29uZmlnLmlzUnVudGltZUNvbXBvbmVudD1uaSxObi5jb25maWcuaXNVbmtub3duRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiExfSxObi5vcHRpb25zLmRpcmVjdGl2ZXM9e30sTm4ub3B0aW9ucy5jb21wb25lbnRzPWVpLE5uLnByb3RvdHlwZS5fX3BhdGNoX189VXIsTm4ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe3JldHVybiBuPXRoaXMscj1lJiYobz10aGlzLiRkb2N1bWVudCwoYT1vLmNyZWF0ZUNvbW1lbnQoInJvb3QiKSkuaGFzQXR0cmlidXRlPWEucmVtb3ZlQXR0cmlidXRlPU4sby5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoYSksYSksaT10LG4uJGVsPXIsbi4kb3B0aW9ucy5yZW5kZXJ8fChuLiRvcHRpb25zLnJlbmRlcj1kZSksYW4obiwiYmVmb3JlTW91bnQiKSxuZXcgbW4obixmdW5jdGlvbigpe24uX3VwZGF0ZShuLl9yZW5kZXIoKSxpKX0sTix7YmVmb3JlOmZ1bmN0aW9uKCl7bi5faXNNb3VudGVkJiYhbi5faXNEZXN0cm95ZWQmJmFuKG4sImJlZm9yZVVwZGF0ZSIpfX0sITApLGk9ITEsbnVsbD09bi4kdm5vZGUmJihuLl9pc01vdW50ZWQ9ITAsYW4obiwibW91bnRlZCIpKSxuO3ZhciBuLHIsaSxvLGF9LE5uLnByb3RvdHlwZS5fX2NhbGxfaG9vaz1mdW5jdGlvbihlLHQpe3NlKCk7dmFyIG4scj10aGlzLiRvcHRpb25zW2VdLGk9ZSsiIGhvb2siO2lmKHIpZm9yKHZhciBvPTAsYT1yLmxlbmd0aDtvPGE7bysrKW49TmUocltvXSx0aGlzLHQ/W3RdOm51bGwsdGhpcyxpKTtyZXR1cm4gdGhpcy5faGFzSG9va0V2ZW50JiZ0aGlzLiRlbWl0KCJob29rOiIrZSx0KSxjZSgpLG59LGUuVnVlPU5ufX0pO3Vud3JhcEV4cG9ydHMoZmFjdG9yeSk7dmFyIHdlZXhWdWVGcmFtZXdvcms9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGQ9e307dC5jcmVhdGVJbnN0YW5jZUNvbnRleHQ9ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcixpLG8sYSxzPXQud2VleCxjPShkW2VdPXtpbnN0YW5jZUlkOmUsY29uZmlnOnMuY29uZmlnLGRvY3VtZW50OnMuZG9jdW1lbnQsZGF0YTpufSkuVnVlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtmYWN0b3J5KHIsdC5kb2N1bWVudCxuKTt2YXIgaT1yLlZ1ZSxvPWRbZV0sYT0vXndlZXg6L2kscz1pLmNvbmZpZy5pc1Jlc2VydmVkVGFnfHxmdW5jdGlvbigpe3JldHVybiExfSxjPWkuY29uZmlnLmlzUnVudGltZUNvbXBvbmVudHx8ZnVuY3Rpb24oKXtyZXR1cm4hMX07cmV0dXJuIGkuY29uZmlnLmlzUmVzZXJ2ZWRUYWc9ZnVuY3Rpb24oZSl7cmV0dXJuIWMoZSkmJnQuc3VwcG9ydHMoIkBjb21wb25lbnQvIitlKXx8cyhlKXx8YS50ZXN0KGUpfSxpLmNvbmZpZy5wYXJzZVBsYXRmb3JtVGFnTmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGEsIiIpfSxpLnByb3RvdHlwZS4kaW5zdGFuY2VJZD1lLGkucHJvdG90eXBlLiRkb2N1bWVudD1vLmRvY3VtZW50LGkucHJvdG90eXBlLiRyZXF1aXJlV2VleE1vZHVsZT10LnJlcXVpcmVNb2R1bGUsaS5taXhpbih7YmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kb3B0aW9ucztpZihlLmVsKXt2YXIgdD1lLmRhdGEsbj0oImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOnQpfHx7fTtlLmRhdGE9T2JqZWN0LmFzc2lnbihuLG8uZGF0YSksby5hcHA9dGhpc319LG1vdW50ZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLiRvcHRpb25zLmVsJiZ0LmRvY3VtZW50JiZvLmFwcD09PXRoaXMpdHJ5e3QuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUZpbmlzaCJ9LFtdKX1jYXRjaChlKXt9fX0pLGkucHJvdG90eXBlLiRnZXRDb25maWc9ZnVuY3Rpb24oKXtpZihvLmFwcCBpbnN0YW5jZW9mIGkpcmV0dXJuIG8uY29uZmlnfSxpfShlLHMsdC5TaGFyZWRPYmplY3QpLHU9KHI9ZSxpPXMucmVxdWlyZU1vZHVsZSxvPWRbcl0sYT1pKCJ0aW1lciIpLHtzZXRUaW1lb3V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTtpZihhLnNldFRpbWVvdXQpe3ZhciByPW8uZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQ7cmV0dXJuIGEuc2V0VGltZW91dChmdW5jdGlvbigpe3RbMF0uYXBwbHkodCx0LnNsaWNlKDIpKX0sdFsxXSksKHIrMSkudG9TdHJpbmcoKX19LHNldEludGVydmFsOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTtpZihhLnNldEludGVydmFsKXt2YXIgcj1vLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkO3JldHVybiBhLnNldEludGVydmFsKGZ1bmN0aW9uKCl7dFswXS5hcHBseSh0LHQuc2xpY2UoMikpfSx0WzFdKSwocisxKS50b1N0cmluZygpfX0sY2xlYXJUaW1lb3V0OmZ1bmN0aW9uKGUpe2EuY2xlYXJUaW1lb3V0JiZhLmNsZWFyVGltZW91dChlKX0sY2xlYXJJbnRlcnZhbDpmdW5jdGlvbihlKXthLmNsZWFySW50ZXJ2YWwmJmEuY2xlYXJJbnRlcnZhbChlKX19KSxsPU9iamVjdC5hc3NpZ24oe1Z1ZTpjfSx1KTtyZXR1cm4gT2JqZWN0LmZyZWV6ZShsKSxsfSx0LmRlc3Ryb3lJbnN0YW5jZT1mdW5jdGlvbihlKXt2YXIgdD1kW2VdO2lmKHQmJnQuYXBwIGluc3RhbmNlb2YgdC5WdWUpe3RyeXt0LmFwcC4kZGVzdHJveSgpLHQuZG9jdW1lbnQuZGVzdHJveSgpfWNhdGNoKGUpe31kZWxldGUgdC5kb2N1bWVudCxkZWxldGUgdC5hcHB9ZGVsZXRlIGRbZV19LHQucmVmcmVzaEluc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZFtlXTtpZighKG4mJm4uYXBwIGluc3RhbmNlb2Ygbi5WdWUpKXJldHVybiBuZXcgRXJyb3IoInJlZnJlc2hJbnN0YW5jZTogaW5zdGFuY2UgIitlKyIgbm90IGZvdW5kISIpO2lmKG4uVnVlJiZuLlZ1ZS5zZXQpZm9yKHZhciByIGluIHQpbi5WdWUuc2V0KG4uYXBwLHIsdFtyXSk7bi5kb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoImRvbSIse2FjdGlvbjoicmVmcmVzaEZpbmlzaCJ9LFtdKX19KSxpbmRleD11bndyYXBFeHBvcnRzKHdlZXhWdWVGcmFtZXdvcmspLHdlZXhWdWVGcmFtZXdvcmtfMT13ZWV4VnVlRnJhbWV3b3JrLmNyZWF0ZUluc3RhbmNlQ29udGV4dCx3ZWV4VnVlRnJhbWV3b3JrXzI9d2VleFZ1ZUZyYW1ld29yay5kZXN0cm95SW5zdGFuY2Usd2VleFZ1ZUZyYW1ld29ya18zPXdlZXhWdWVGcmFtZXdvcmsucmVmcmVzaEluc3RhbmNlLFZ1ZT1PYmplY3QuZnJlZXplKHtkZWZhdWx0OmluZGV4LF9fbW9kdWxlRXhwb3J0czp3ZWV4VnVlRnJhbWV3b3JrLGNyZWF0ZUluc3RhbmNlQ29udGV4dDp3ZWV4VnVlRnJhbWV3b3JrXzEsZGVzdHJveUluc3RhbmNlOndlZXhWdWVGcmFtZXdvcmtfMixyZWZyZXNoSW5zdGFuY2U6d2VleFZ1ZUZyYW1ld29ya18zfSk7c2V0TmF0aXZlQ29uc29sZSgpLHNldHVwKHtWdWU6VnVlfSl9KTsK