w-cluster 1.0.37 → 1.0.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- !function(d,l){"object"==typeof exports&&"undefined"!=typeof module?module.exports=l(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],l):(d="undefined"!=typeof globalThis?globalThis:d||self)["w-cluster"]=l(d.worker_threads)}(this,(function(d){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var l={};!function(l,c){l.exports=function(d){var l={};!function(d){var l=Object.prototype.hasOwnProperty,c="~";function b(){}function Z(d,l,c){this.fn=d,this.context=l,this.once=c||!1}function X(d,l,b,X,G){if("function"!=typeof b)throw new TypeError("The listener must be a function");var y=new Z(b,X||d,G),m=c?c+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],y]:d._events[m].push(y):(d._events[m]=y,d._eventsCount++),d}function G(d,l){0==--d._eventsCount?d._events=new b:delete d._events[l]}function y(){this._events=new b,this._eventsCount=0}Object.create&&(b.prototype=Object.create(null),(new b).__proto__||(c=!1)),y.prototype.eventNames=function(){var d,b,Z=[];if(0===this._eventsCount)return Z;for(b in d=this._events)l.call(d,b)&&Z.push(c?b.slice(1):b);return Object.getOwnPropertySymbols?Z.concat(Object.getOwnPropertySymbols(d)):Z},y.prototype.listeners=function(d){var l=c?c+d:d,b=this._events[l];if(!b)return[];if(b.fn)return[b.fn];for(var Z=0,X=b.length,G=new Array(X);Z<X;Z++)G[Z]=b[Z].fn;return G},y.prototype.listenerCount=function(d){var l=c?c+d:d,b=this._events[l];return b?b.fn?1:b.length:0},y.prototype.emit=function(d,l,b,Z,X,G){var y=c?c+d:d;if(!this._events[y])return!1;var m,K,p=this._events[y],I=arguments.length;if(p.fn){switch(p.once&&this.removeListener(d,p.fn,void 0,!0),I){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,l),!0;case 3:return p.fn.call(p.context,l,b),!0;case 4:return p.fn.call(p.context,l,b,Z),!0;case 5:return p.fn.call(p.context,l,b,Z,X),!0;case 6:return p.fn.call(p.context,l,b,Z,X,G),!0}for(K=1,m=new Array(I-1);K<I;K++)m[K-1]=arguments[K];p.fn.apply(p.context,m)}else{var W,V=p.length;for(K=0;K<V;K++)switch(p[K].once&&this.removeListener(d,p[K].fn,void 0,!0),I){case 1:p[K].fn.call(p[K].context);break;case 2:p[K].fn.call(p[K].context,l);break;case 3:p[K].fn.call(p[K].context,l,b);break;case 4:p[K].fn.call(p[K].context,l,b,Z);break;default:if(!m)for(W=1,m=new Array(I-1);W<I;W++)m[W-1]=arguments[W];p[K].fn.apply(p[K].context,m)}}return!0},y.prototype.on=function(d,l,c){return X(this,d,l,c,!1)},y.prototype.once=function(d,l,c){return X(this,d,l,c,!0)},y.prototype.removeListener=function(d,l,b,Z){var X=c?c+d:d;if(!this._events[X])return this;if(!l)return G(this,X),this;var y=this._events[X];if(y.fn)y.fn!==l||Z&&!y.once||b&&y.context!==b||G(this,X);else{for(var m=0,K=[],p=y.length;m<p;m++)(y[m].fn!==l||Z&&!y[m].once||b&&y[m].context!==b)&&K.push(y[m]);K.length?this._events[X]=1===K.length?K[0]:K:G(this,X)}return this},y.prototype.removeAllListeners=function(d){var l;return d?(l=c?c+d:d,this._events[l]&&G(this,l)):(this._events=new b,this._eventsCount=0),this},y.prototype.off=y.prototype.removeListener,y.prototype.addListener=y.prototype.on,y.prefixed=c,y.EventEmitter=y,d.exports=y}({get exports(){return l},set exports(d){l=d}});var c=l;let b;!function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new c}function Z(){let d,l,c=new Promise((function(){d=arguments[0],l=arguments[1]}));return c.resolve=d,c.reject=l,c}function X(){let d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=c.length;for(let Z=0;Z<d;Z++)l[Z]=c[0|Math.random()*b];return l.join("")}let G=(y="CgogICAgICAgIC8vaW1wb3J0IHsgcGFyZW50UG9ydCB9IGZyb20gJ3dvcmtlcl90aHJlYWRzJwogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykgLy/lm6BwYWNrYWdlLmpzb27kuI3ntaZ0eXBlPW1vZHVsZeaVheeEoeazleaUr+aPtGVzNiBpbXBvcnQsIOW+l+S9v+eUqHJlcXVpcmUKICAgICAgICAvL+iLpeimgeaWvG5vZGVqcyB3b3JrZXLlhafkvb/nlKjnhKHms5XovYnora/nmoTljp/nlJ/lpZfku7bkvovlpoJmcywg6YG/5YWN5L2/55So6aCC5bGkaW1wb3J05Yqg6LyJ5L2/55SoLCDlm6DnhKHms5XovYnora/mnIPnm7TmjqXkv53nlZkKICAgICAgICAvL+S4puWboGltcG9ydOS9jeaWvHdvcmtlcuWkluWxpOmZkOWumueCunJlcXVpcmXljYAocGFja2FnZS5qc29u5LiN57WmdHlwZT1tb2R1bGUpLCDmlYXlh7rnj77pjK/oqqTnhKHms5XovYnora8KICAgICAgICAKCiJ1c2Ugc3RyaWN0Ijt2YXIgdD1BcnJheS5pc0FycmF5LGU9Im9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsLHI9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixzPWV8fHJ8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksbj1zLlN5bWJvbCxvPU9iamVjdC5wcm90b3R5cGUsaT1vLmhhc093blByb3BlcnR5LHU9by50b1N0cmluZyxhPW4/bi50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIGw9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgaD0iW29iamVjdCBOdWxsXSIsYz0iW29iamVjdCBVbmRlZmluZWRdIixmPW4/bi50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gbSh0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10P2M6aDpmJiZmIGluIE9iamVjdCh0KT9mdW5jdGlvbih0KXt2YXIgZT1pLmNhbGwodCxhKSxyPXRbYV07dHJ5e3RbYV09dm9pZCAwO3ZhciBzPSEwfWNhdGNoKHQpe312YXIgbj11LmNhbGwodCk7cmV0dXJuIHMmJihlP3RbYV09cjpkZWxldGUgdFthXSksbn0odCk6ZnVuY3Rpb24odCl7cmV0dXJuIGwuY2FsbCh0KX0odCl9ZnVuY3Rpb24gZyh0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fXZhciB3PSJbb2JqZWN0IFN5bWJvbF0iO2Z1bmN0aW9uIHAodCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxnKHQpJiZtKHQpPT13fXZhciBkPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLHk9L15cdyokLztmdW5jdGlvbiBiKGUscil7aWYodChlKSlyZXR1cm4hMTt2YXIgcz10eXBlb2YgZTtyZXR1cm4hKCJudW1iZXIiIT1zJiYic3ltYm9sIiE9cyYmImJvb2xlYW4iIT1zJiZudWxsIT1lJiYhcChlKSl8fCh5LnRlc3QoZSl8fCFkLnRlc3QoZSl8fG51bGwhPXImJmUgaW4gT2JqZWN0KHIpKX1mdW5jdGlvbiBNKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfXZhciB2PSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIix4PSJbb2JqZWN0IEZ1bmN0aW9uXSIsRT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLFM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBfKHQpe2lmKCFNKHQpKXJldHVybiExO3ZhciBlPW0odCk7cmV0dXJuIGU9PXh8fGU9PUV8fGU9PXZ8fGU9PVN9dmFyIGosQT1zWyJfX2NvcmUtanNfc2hhcmVkX18iXSxSPShqPS9bXi5dKyQvLmV4ZWMoQSYmQS5rZXlzJiZBLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIitqOiIiO3ZhciBJPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBDKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gSS5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn12YXIgTj0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxrPUZ1bmN0aW9uLnByb3RvdHlwZSxUPU9iamVjdC5wcm90b3R5cGUsRj1rLnRvU3RyaW5nLE89VC5oYXNPd25Qcm9wZXJ0eSxWPVJlZ0V4cCgiXiIrRi5jYWxsKE8pLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIHoodCl7cmV0dXJuISghTSh0KXx8KGU9dCxSJiZSIGluIGUpKSYmKF8odCk/VjpOKS50ZXN0KEModCkpO3ZhciBlfWZ1bmN0aW9uIEQodCxlKXt2YXIgcj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfSh0LGUpO3JldHVybiB6KHIpP3I6dm9pZCAwfXZhciBQPUQoT2JqZWN0LCJjcmVhdGUiKTt2YXIgcT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciAkPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gTCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIHM9dFtlXTt0aGlzLnNldChzWzBdLHNbMV0pfX1mdW5jdGlvbiBVKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfWZ1bmN0aW9uIEcodCxlKXtmb3IodmFyIHI9dC5sZW5ndGg7ci0tOylpZihVKHRbcl1bMF0sZSkpcmV0dXJuIHI7cmV0dXJuLTF9TC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVA/UChudWxsKTp7fSx0aGlzLnNpemU9MH0sTC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxMLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihQKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIHEuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxMLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gUD92b2lkIDAhPT1lW3RdOiQuY2FsbChlLHQpfSxMLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxyW3RdPVAmJnZvaWQgMD09PWU/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOmUsdGhpc307dmFyIEI9QXJyYXkucHJvdG90eXBlLnNwbGljZTtmdW5jdGlvbiBXKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgcz10W2VdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fVcucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH0sVy5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1HKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOkIuY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfSxXLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPUcoZSx0KTtyZXR1cm4gcjwwP3ZvaWQgMDplW3JdWzFdfSxXLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIEcodGhpcy5fX2RhdGFfXyx0KT4tMX0sVy5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxzPUcocix0KTtyZXR1cm4gczwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW3NdWzFdPWUsdGhpc307dmFyIEs9RChzLCJNYXAiKTtmdW5jdGlvbiBRKHQsZSl7dmFyIHIscyxuPXQuX19kYXRhX187cmV0dXJuKCJzdHJpbmciPT0ocz10eXBlb2Yocj1lKSl8fCJudW1iZXIiPT1zfHwic3ltYm9sIj09c3x8ImJvb2xlYW4iPT1zPyJfX3Byb3RvX18iIT09cjpudWxsPT09cik/blsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpuLm1hcH1mdW5jdGlvbiBYKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgcz10W2VdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fVgucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgTCxtYXA6bmV3KEt8fFcpLHN0cmluZzpuZXcgTH19LFgucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT1RKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFgucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gUSh0aGlzLHQpLmdldCh0KX0sWC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiBRKHRoaXMsdCkuaGFzKHQpfSxYLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1RKHRoaXMsdCkscz1yLnNpemU7cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplKz1yLnNpemU9PXM/MDoxLHRoaXN9O3ZhciBZPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjtmdW5jdGlvbiBKKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoWSk7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgcz1hcmd1bWVudHMsbj1lP2UuYXBwbHkodGhpcyxzKTpzWzBdLG89ci5jYWNoZTtpZihvLmhhcyhuKSlyZXR1cm4gby5nZXQobik7dmFyIGk9dC5hcHBseSh0aGlzLHMpO3JldHVybiByLmNhY2hlPW8uc2V0KG4saSl8fG8saX07cmV0dXJuIHIuY2FjaGU9bmV3KEouQ2FjaGV8fFgpLHJ9Si5DYWNoZT1YO3ZhciBILFosdHQsZXQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2cscnQ9L1xcKFxcKT8vZyxzdD0oSD1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKGV0LChmdW5jdGlvbih0LHIscyxuKXtlLnB1c2gocz9uLnJlcGxhY2UocnQsIiQxIik6cnx8dCl9KSksZX0sWj1KKEgsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT10dC5zaXplJiZ0dC5jbGVhcigpLHR9KSksdHQ9Wi5jYWNoZSxaKSxudD1zdDtmdW5jdGlvbiBvdCh0LGUpe2Zvcih2YXIgcj0tMSxzPW51bGw9PXQ/MDp0Lmxlbmd0aCxuPUFycmF5KHMpOysrcjxzOyluW3JdPWUodFtyXSxyLHQpO3JldHVybiBufXZhciBpdD0xLzAsdXQ9bj9uLnByb3RvdHlwZTp2b2lkIDAsYXQ9dXQ/dXQudG9TdHJpbmc6dm9pZCAwO2Z1bmN0aW9uIGx0KGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTtpZih0KGUpKXJldHVybiBvdChlLGx0KSsiIjtpZihwKGUpKXJldHVybiBhdD9hdC5jYWxsKGUpOiIiO3ZhciByPWUrIiI7cmV0dXJuIjAiPT1yJiYxL2U9PS1pdD8iLTAiOnJ9ZnVuY3Rpb24gaHQodCl7cmV0dXJuIG51bGw9PXQ/IiI6bHQodCl9ZnVuY3Rpb24gY3QoZSxyKXtyZXR1cm4gdChlKT9lOmIoZSxyKT9bZV06bnQoaHQoZSkpfXZhciBmdD0xLzA7ZnVuY3Rpb24gbXQodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxwKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1mdD8iLTAiOmV9ZnVuY3Rpb24gZ3QodCxlKXtmb3IodmFyIHI9MCxzPShlPWN0KGUsdCkpLmxlbmd0aDtudWxsIT10JiZyPHM7KXQ9dFttdChlW3IrK10pXTtyZXR1cm4gciYmcj09cz90OnZvaWQgMH1mdW5jdGlvbiB3dCh0LGUscil7dmFyIHM9bnVsbD09dD92b2lkIDA6Z3QodCxlKTtyZXR1cm4gdm9pZCAwPT09cz9yOnN9dmFyIHB0PU9iamVjdC5wcm90b3R5cGU7dmFyIGR0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0KGUocikpfX0oT2JqZWN0LmtleXMsT2JqZWN0KSx5dD1kdCxidD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIE10KHQpe2lmKHI9KGU9dCkmJmUuY29uc3RydWN0b3IsZSE9PSgiZnVuY3Rpb24iPT10eXBlb2YgciYmci5wcm90b3R5cGV8fHB0KSlyZXR1cm4geXQodCk7dmFyIGUscixzPVtdO2Zvcih2YXIgbiBpbiBPYmplY3QodCkpYnQuY2FsbCh0LG4pJiYiY29uc3RydWN0b3IiIT1uJiZzLnB1c2gobik7cmV0dXJuIHN9dmFyIHZ0PUQocywiRGF0YVZpZXciKSx4dD1EKHMsIlByb21pc2UiKSxFdD1EKHMsIlNldCIpLFN0PUQocywiV2Vha01hcCIpLF90PSJbb2JqZWN0IE1hcF0iLGp0PSJbb2JqZWN0IFByb21pc2VdIixBdD0iW29iamVjdCBTZXRdIixSdD0iW29iamVjdCBXZWFrTWFwXSIsSXQ9IltvYmplY3QgRGF0YVZpZXddIixDdD1DKHZ0KSxOdD1DKEspLGt0PUMoeHQpLFR0PUMoRXQpLEZ0PUMoU3QpLE90PW07KHZ0JiZPdChuZXcgdnQobmV3IEFycmF5QnVmZmVyKDEpKSkhPUl0fHxLJiZPdChuZXcgSykhPV90fHx4dCYmT3QoeHQucmVzb2x2ZSgpKSE9anR8fEV0JiZPdChuZXcgRXQpIT1BdHx8U3QmJk90KG5ldyBTdCkhPVJ0KSYmKE90PWZ1bmN0aW9uKHQpe3ZhciBlPW0odCkscj0iW29iamVjdCBPYmplY3RdIj09ZT90LmNvbnN0cnVjdG9yOnZvaWQgMCxzPXI/QyhyKToiIjtpZihzKXN3aXRjaChzKXtjYXNlIEN0OnJldHVybiBJdDtjYXNlIE50OnJldHVybiBfdDtjYXNlIGt0OnJldHVybiBqdDtjYXNlIFR0OnJldHVybiBBdDtjYXNlIEZ0OnJldHVybiBSdH1yZXR1cm4gZX0pO3ZhciBWdD1PdCx6dD05MDA3MTk5MjU0NzQwOTkxO2Z1bmN0aW9uIER0KHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD16dH1mdW5jdGlvbiBQdCh0KXtyZXR1cm4gbnVsbCE9dCYmRHQodC5sZW5ndGgpJiYhXyh0KX12YXIgcXQ9IltvYmplY3QgU3RyaW5nXSI7ZnVuY3Rpb24gJHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3ZvaWQgMDplW3RdfX12YXIgTHQ9JHQoImxlbmd0aCIpLFV0PVJlZ0V4cCgiW1xcdTIwMGRcXHVkODAwLVxcdWRmZmZcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZcXHVmZTBlXFx1ZmUwZl0iKTt2YXIgR3Q9IlxcdWQ4MDAtXFx1ZGZmZiIsQnQ9IlsiK0d0KyJdIixXdD0iW1xcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZl0iLEt0PSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLFF0PSJbXiIrR3QrIl0iLFh0PSIoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9IixZdD0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsSnQ9Iig/OiIrV3QrInwiK0t0KyIpIisiPyIsSHQ9IltcXHVmZTBlXFx1ZmUwZl0/IixadD1IdCtKdCsoIig/OlxcdTIwMGQoPzoiK1tRdCxYdCxZdF0uam9pbigifCIpKyIpIitIdCtKdCsiKSoiKSx0ZT0iKD86IitbUXQrV3QrIj8iLFd0LFh0LFl0LEJ0XS5qb2luKCJ8IikrIikiLGVlPVJlZ0V4cChLdCsiKD89IitLdCsiKXwiK3RlK1p0LCJnIik7ZnVuY3Rpb24gcmUodCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBVdC50ZXN0KHQpfSh0KT9mdW5jdGlvbih0KXtmb3IodmFyIGU9ZWUubGFzdEluZGV4PTA7ZWUudGVzdCh0KTspKytlO3JldHVybiBlfSh0KTpMdCh0KX12YXIgc2U9IltvYmplY3QgTWFwXSIsbmU9IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gb2UoZSl7aWYobnVsbD09ZSlyZXR1cm4gMDtpZihQdChlKSlyZXR1cm4ic3RyaW5nIj09dHlwZW9mKHI9ZSl8fCF0KHIpJiZnKHIpJiZtKHIpPT1xdD9yZShlKTplLmxlbmd0aDt2YXIgcixzPVZ0KGUpO3JldHVybiBzPT1zZXx8cz09bmU/ZS5zaXplOk10KGUpLmxlbmd0aH1mdW5jdGlvbiBpZSh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHVlKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGFlKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGxlKHQpe3JldHVybiB0IT10fWZ1bmN0aW9uIGhlKHQpe3JldHVybiEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZih1ZSh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hKCFhZSh0KXx8IiIhPT10KX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiEhaWUodCkmJjA9PT10Lmxlbmd0aH0odCl8fCEhbGUodCkpKSkpfWZ1bmN0aW9uIGNlKHQpe3JldHVybiEhaWUodCkmJigwIT09dC5sZW5ndGgmJigxIT09dC5sZW5ndGh8fCFoZSh0WzBdKSkpfXZhciBmZT0iW29iamVjdCBCb29sZWFuXSI7ZnVuY3Rpb24gbWUodCl7cmV0dXJuITA9PT0oZT10KXx8ITE9PT1lfHxnKGUpJiZtKGUpPT1mZTt2YXIgZX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4hKCFhZSh0KXx8IiI9PT10KX1mdW5jdGlvbiB3ZSh0KXtsZXQgZT0hMTtpZihnZSh0KSllPSFpc05hTihOdW1iZXIodCkpO2Vsc2UgaWYoZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVtYmVyXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpKXtpZihsZSh0KSlyZXR1cm4hMTtlPSEwfXJldHVybiBlfXZhciBwZT0vXHMvO3ZhciBkZT0vXlxzKy87ZnVuY3Rpb24geWUodCl7cmV0dXJuIHQ/dC5zbGljZSgwLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJnBlLnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9KHQpKzEpLnJlcGxhY2UoZGUsIiIpOnR9dmFyIGJlPU5hTixNZT0vXlstK10weFswLTlhLWZdKyQvaSx2ZT0vXjBiWzAxXSskL2kseGU9L14wb1swLTddKyQvaSxFZT1wYXJzZUludDtmdW5jdGlvbiBTZSh0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYocCh0KSlyZXR1cm4gYmU7aWYoTSh0KSl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQudmFsdWVPZj90LnZhbHVlT2YoKTp0O3Q9TShlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9eWUodCk7dmFyIHI9dmUudGVzdCh0KTtyZXR1cm4gcnx8eGUudGVzdCh0KT9FZSh0LnNsaWNlKDIpLHI/Mjo4KTpNZS50ZXN0KHQpP2JlOit0fXZhciBfZT0xLzAsamU9MTc5NzY5MzEzNDg2MjMxNTdlMjkyO2Z1bmN0aW9uIEFlKHQpe3JldHVybiB0Pyh0PVNlKHQpKT09PV9lfHx0PT09LV9lPyh0PDA/LTE6MSkqamU6dD09dD90OjA6MD09PXQ/dDowfXZhciBSZT1zLmlzRmluaXRlLEllPU1hdGgubWluO3ZhciBDZT1mdW5jdGlvbih0KXt2YXIgZT1NYXRoW3RdO3JldHVybiBmdW5jdGlvbih0LHIpe2lmKHQ9U2UodCkscj1udWxsPT1yPzA6SWUoZnVuY3Rpb24odCl7dmFyIGU9QWUodCkscj1lJTE7cmV0dXJuIGU9PWU/cj9lLXI6ZTowfShyKSwyOTIpLHImJlJlKHQpKXt2YXIgcz0oaHQodCkrImUiKS5zcGxpdCgiZSIpO3JldHVybisoKHM9KGh0KGUoc1swXSsiZSIrKCtzWzFdK3IpKSkrImUiKS5zcGxpdCgiZSIpKVswXSsiZSIrKCtzWzFdLXIpKX1yZXR1cm4gZSh0KX19KCJyb3VuZCIpLE5lPUNlO2Z1bmN0aW9uIGtlKHQsZT17fSl7bGV0IHI9d3QoZSwidXNlQ2xhbXBTYWZlIixudWxsKTttZShyKXx8KHI9ITEpO2xldCBzPXd0KGUsInVzZUxpbWl0U2FmZSIsbnVsbCk7bWUocyl8fChzPSExKTtsZXQgbj13dChlLCJyZXR1cm5XaXRoU3RhdGVBbmRNc2ciLG51bGwpO21lKG4pfHwobj0hMSk7bGV0IG89dD0+bj97c3RhdGU6InN1Y2Nlc3MiLG1zZzp0fTp0LGk9dD0+e2lmKG4pcmV0dXJue3N0YXRlOiJlcnJvciIsbXNnOnR9O3Rocm93IG5ldyBFcnJvcih0KX07aWYoIXdlKHQpKXJldHVybiBvKDApO2xldCB1PW51bGw7dHJ5e3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHdlKHQpP0FlKHQpOjB9KHQpLHU9TmUodCksciYmKHU+TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI/dT1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUjp1PE51bWJlci5NSU5fU0FGRV9JTlRFR0VSJiYodT1OdW1iZXIuTUlOX1NBRkVfSU5URUdFUikpfWNhdGNoKHQpe3JldHVybiBpKHQudG9TdHJpbmcoKSl9cmV0dXJuIHMmJiFOdW1iZXIuaXNTYWZlSW50ZWdlcihOdW1iZXIodSkpP2koYHZbJHt0fV0gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYCk6KCIwIj09PVN0cmluZyh1KSYmKHU9MCksbyh1KSl9ZnVuY3Rpb24gVGUodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImRlZmF1bHQiKT90LmRlZmF1bHQ6dH12YXIgRmU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KEZlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBPZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIFZlKHQpe2NvbnN0IGU9T2UuY2FsbCh0KTtyZXR1cm4gZS5lbmRzV2l0aCgiQXJyYXldIikmJiFlLmluY2x1ZGVzKCJCaWciKX1mdW5jdGlvbiB6ZSh0LGU9e30pe2lmKCFWZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7bGV0IHI7aWYodm9pZCAwIT09ZS5vdXRwdXQpe2lmKCFWZShlLm91dHB1dCkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZCIpO3I9ZS5vdXRwdXR9ZWxzZSByPW5ldyBBcnJheSh0Lmxlbmd0aCk7Y29uc3Qgcz1mdW5jdGlvbih0LGU9e30pe2lmKCFWZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7Y29uc3R7ZnJvbUluZGV4OnI9MCx0b0luZGV4OnM9dC5sZW5ndGh9PWU7aWYocjwwfHxyPj10Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocikpdGhyb3cgbmV3IEVycm9yKCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aCIpO2lmKHM8PXJ8fHM+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKHMpKXRocm93IG5ldyBFcnJvcigidG9JbmRleCBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGZyb21JbmRleCBhbmQgYXQgbW9zdCBlcXVhbCB0byBsZW5ndGgiKTtsZXQgbj10W3JdO2ZvcihsZXQgZT1yKzE7ZTxzO2UrKyl0W2VdPG4mJihuPXRbZV0pO3JldHVybiBufSh0KSxuPWZ1bmN0aW9uKHQsZT17fSl7aWYoIVZlKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtjb25zdHtmcm9tSW5kZXg6cj0wLHRvSW5kZXg6cz10Lmxlbmd0aH09ZTtpZihyPDB8fHI+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihyKSl0aHJvdyBuZXcgRXJyb3IoImZyb21JbmRleCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gbGVuZ3RoIik7aWYoczw9cnx8cz50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocykpdGhyb3cgbmV3IEVycm9yKCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCIpO2xldCBuPXRbcl07Zm9yKGxldCBlPXIrMTtlPHM7ZSsrKXRbZV0+biYmKG49dFtlXSk7cmV0dXJuIG59KHQpO2lmKHM9PT1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW5pbXVtIGFuZCBtYXhpbXVtIGlucHV0IHZhbHVlcyBhcmUgZXF1YWwuIENhbm5vdCByZXNjYWxlIGEgY29uc3RhbnQgYXJyYXkiKTtjb25zdHttaW46bz0oZS5hdXRvTWluTWF4P3M6MCksbWF4Omk9KGUuYXV0b01pbk1heD9uOjEpfT1lO2lmKG8+PWkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBvcHRpb24gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4IG9wdGlvbiIpO2NvbnN0IHU9KGktbykvKG4tcyk7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspcltlXT0odFtlXS1zKSp1K287cmV0dXJuIHJ9Y29uc3QgRGU9IiAiLnJlcGVhdCgyKSxQZT0iICIucmVwZWF0KDQpO2Z1bmN0aW9uIHFlKHQsZT17fSl7Y29uc3R7bWF4Um93czpyPTE1LG1heENvbHVtbnM6cz0xMCxtYXhOdW1TaXplOm49OCxwYWRNaW51czpvPSJhdXRvIn09ZTtyZXR1cm5gJHt0LmNvbnN0cnVjdG9yLm5hbWV9IHtcbiR7RGV9W1xuJHtQZX0ke2Z1bmN0aW9uKHQsZSxyLHMsbil7Y29uc3R7cm93czpvLGNvbHVtbnM6aX09dCx1PU1hdGgubWluKG8sZSksYT1NYXRoLm1pbihpLHIpLGw9W107aWYoImF1dG8iPT09bil7bj0hMTt0OmZvcihsZXQgZT0wO2U8dTtlKyspZm9yKGxldCByPTA7cjxhO3IrKylpZih0LmdldChlLHIpPDApe249ITA7YnJlYWsgdH19Zm9yKGxldCBlPTA7ZTx1O2UrKyl7bGV0IHI9W107Zm9yKGxldCBvPTA7bzxhO28rKylyLnB1c2goJGUodC5nZXQoZSxvKSxzLG4pKTtsLnB1c2goYCR7ci5qb2luKCIgIil9YCl9YSE9PWkmJihsW2wubGVuZ3RoLTFdKz1gIC4uLiAke2ktcn0gbW9yZSBjb2x1bW5zYCk7dSE9PW8mJmwucHVzaChgLi4uICR7by1lfSBtb3JlIHJvd3NgKTtyZXR1cm4gbC5qb2luKGBcbiR7UGV9YCl9KHQscixzLG4sbyl9XG4ke0RlfV1cbiR7RGV9cm93czogJHt0LnJvd3N9XG4ke0RlfWNvbHVtbnM6ICR7dC5jb2x1bW5zfVxufWB9ZnVuY3Rpb24gJGUodCxlLHIpe3JldHVybih0Pj0wJiZyP2AgJHtMZSh0LGUtMSl9YDpMZSh0LGUpKS5wYWRFbmQoZSl9ZnVuY3Rpb24gTGUodCxlKXtsZXQgcj10LnRvU3RyaW5nKCk7aWYoci5sZW5ndGg8PWUpcmV0dXJuIHI7bGV0IHM9dC50b0ZpeGVkKGUpO2lmKHMubGVuZ3RoPmUmJihzPXQudG9GaXhlZChNYXRoLm1heCgwLGUtKHMubGVuZ3RoLWUpKSkpLHMubGVuZ3RoPD1lJiYhcy5zdGFydHNXaXRoKCIwLjAwMCIpJiYhcy5zdGFydHNXaXRoKCItMC4wMDAiKSlyZXR1cm4gcztsZXQgbj10LnRvRXhwb25lbnRpYWwoZSk7cmV0dXJuIG4ubGVuZ3RoPmUmJihuPXQudG9FeHBvbmVudGlhbChNYXRoLm1heCgwLGUtKG4ubGVuZ3RoLWUpKSkpLG4uc2xpY2UoMCl9ZnVuY3Rpb24gVWUodCxlLHIpe2xldCBzPXI/dC5yb3dzOnQucm93cy0xO2lmKGU8MHx8ZT5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gR2UodCxlLHIpe2xldCBzPXI/dC5jb2x1bW5zOnQuY29sdW1ucy0xO2lmKGU8MHx8ZT5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gQmUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIik7cmV0dXJuIGV9ZnVuY3Rpb24gV2UodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzIik7cmV0dXJuIGV9ZnVuY3Rpb24gS2UodCxlKXtpZighVmUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigicm93IGluZGljZXMgbXVzdCBiZSBhbiBhcnJheSIpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl08MHx8ZVtyXT49dC5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKCJyb3cgaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUWUodCxlKXtpZighVmUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiY29sdW1uIGluZGljZXMgbXVzdCBiZSBhbiBhcnJheSIpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl08MHx8ZVtyXT49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJjb2x1bW4gaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gWGUodCxlLHIscyxuKXtpZig1IT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZXhwZWN0ZWQgNCBhcmd1bWVudHMiKTtpZihKZSgic3RhcnRSb3ciLGUpLEplKCJlbmRSb3ciLHIpLEplKCJzdGFydENvbHVtbiIscyksSmUoImVuZENvbHVtbiIsbiksZT5yfHxzPm58fGU8MHx8ZT49dC5yb3dzfHxyPDB8fHI+PXQucm93c3x8czwwfHxzPj10LmNvbHVtbnN8fG48MHx8bj49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJTdWJtYXRyaXggaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gWWUodCxlPTApe2xldCByPVtdO2ZvcihsZXQgcz0wO3M8dDtzKyspci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIEplKHQsZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7dH0gbXVzdCBiZSBhIG51bWJlcmApfWZ1bmN0aW9uIEhlKHQpe2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiRW1wdHkgbWF0cml4IGhhcyBubyBlbGVtZW50cyB0byBpbmRleCIpfWNsYXNzIFple3N0YXRpYyBmcm9tMURBcnJheSh0LGUscil7aWYodCplIT09ci5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImRhdGEgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGdpdmVuIGRpbWVuc2lvbnMiKTtsZXQgcz1uZXcgZXIodCxlKTtmb3IobGV0IG49MDtuPHQ7bisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspcy5zZXQobix0LHJbbiplK3RdKTtyZXR1cm4gc31zdGF0aWMgcm93VmVjdG9yKHQpe2xldCBlPW5ldyBlcigxLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldCgwLHIsdFtyXSk7cmV0dXJuIGV9c3RhdGljIGNvbHVtblZlY3Rvcih0KXtsZXQgZT1uZXcgZXIodC5sZW5ndGgsMSk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZS5zZXQociwwLHRbcl0pO3JldHVybiBlfXN0YXRpYyB6ZXJvcyh0LGUpe3JldHVybiBuZXcgZXIodCxlKX1zdGF0aWMgb25lcyh0LGUpe3JldHVybiBuZXcgZXIodCxlKS5maWxsKDEpfXN0YXRpYyByYW5kKHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3JhbmRvbTpzPU1hdGgucmFuZG9tfT1yO2xldCBuPW5ldyBlcih0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKyluLnNldChyLHQscygpKTtyZXR1cm4gbn1zdGF0aWMgcmFuZEludCh0LGUscj17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46cz0wLG1heDpuPTFlMyxyYW5kb206bz1NYXRoLnJhbmRvbX09cjtpZighTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYoIU51bWJlci5pc0ludGVnZXIobikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKHM+PW4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgaT1uLXMsdT1uZXcgZXIodCxlKTtmb3IobGV0IHI9MDtyPHQ7cisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPXMrTWF0aC5yb3VuZChvKCkqaSk7dS5zZXQocix0LGUpfXJldHVybiB1fXN0YXRpYyBleWUodCxlLHIpe3ZvaWQgMD09PWUmJihlPXQpLHZvaWQgMD09PXImJihyPTEpO2xldCBzPU1hdGgubWluKHQsZSksbj10aGlzLnplcm9zKHQsZSk7Zm9yKGxldCB0PTA7dDxzO3QrKyluLnNldCh0LHQscik7cmV0dXJuIG59c3RhdGljIGRpYWcodCxlLHIpe2xldCBzPXQubGVuZ3RoO3ZvaWQgMD09PWUmJihlPXMpLHZvaWQgMD09PXImJihyPWUpO2xldCBuPU1hdGgubWluKHMsZSxyKSxvPXRoaXMuemVyb3MoZSxyKTtmb3IobGV0IGU9MDtlPG47ZSsrKW8uc2V0KGUsZSx0W2VdKTtyZXR1cm4gb31zdGF0aWMgbWluKHQsZSl7dD10aGlzLmNoZWNrTWF0cml4KHQpLGU9dGhpcy5jaGVja01hdHJpeChlKTtsZXQgcj10LnJvd3Mscz10LmNvbHVtbnMsbj1uZXcgZXIocixzKTtmb3IobGV0IG89MDtvPHI7bysrKWZvcihsZXQgcj0wO3I8cztyKyspbi5zZXQobyxyLE1hdGgubWluKHQuZ2V0KG8sciksZS5nZXQobyxyKSkpO3JldHVybiBufXN0YXRpYyBtYXgodCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxzPXQuY29sdW1ucyxuPW5ldyB0aGlzKHIscyk7Zm9yKGxldCBvPTA7bzxyO28rKylmb3IobGV0IHI9MDtyPHM7cisrKW4uc2V0KG8scixNYXRoLm1heCh0LmdldChvLHIpLGUuZ2V0KG8scikpKTtyZXR1cm4gbn1zdGF0aWMgY2hlY2tNYXRyaXgodCl7cmV0dXJuIFplLmlzTWF0cml4KHQpP3Q6bmV3IGVyKHQpfXN0YXRpYyBpc01hdHJpeCh0KXtyZXR1cm4gbnVsbCE9dCYmIk1hdHJpeCI9PT10LmtsYXNzfWdldCBzaXplKCl7cmV0dXJuIHRoaXMucm93cyp0aGlzLmNvbHVtbnN9YXBwbHkodCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LmNhbGwodGhpcyxlLHIpO3JldHVybiB0aGlzfXRvMURBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5wdXNoKHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXRvMkRBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7dC5wdXNoKFtdKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdFtlXS5wdXNoKHRoaXMuZ2V0KGUscikpfXJldHVybiB0fXRvSlNPTigpe3JldHVybiB0aGlzLnRvMkRBcnJheSgpfWlzUm93VmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N9aXNDb2x1bW5WZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMuY29sdW1uc31pc1ZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5yb3dzfHwxPT09dGhpcy5jb2x1bW5zfWlzU3F1YXJlKCl7cmV0dXJuIHRoaXMucm93cz09PXRoaXMuY29sdW1uc31pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLnJvd3N8fDA9PT10aGlzLmNvbHVtbnN9aXNTeW1tZXRyaWMoKXtpZih0aGlzLmlzU3F1YXJlKCkpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPD10O2UrKylpZih0aGlzLmdldCh0LGUpIT09dGhpcy5nZXQoZSx0KSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1pc0Rpc3RhbmNlKCl7aWYoIXRoaXMuaXNTeW1tZXRyaWMoKSlyZXR1cm4hMTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspaWYoMCE9PXRoaXMuZ2V0KHQsdCkpcmV0dXJuITE7cmV0dXJuITB9aXNFY2hlbG9uRm9ybSgpe2xldCB0PTAsZT0wLHI9LTEscz0hMCxuPSExO2Zvcig7dDx0aGlzLnJvd3MmJnM7KXtmb3IoZT0wLG49ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09bjspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPnI/KG49ITAscj1lKToocz0hMSxuPSEwKTt0Kyt9cmV0dXJuIHN9aXNSZWR1Y2VkRWNoZWxvbkZvcm0oKXtsZXQgdD0wLGU9MCxyPS0xLHM9ITAsbj0hMTtmb3IoO3Q8dGhpcy5yb3dzJiZzOyl7Zm9yKGU9MCxuPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PW47KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5yPyhuPSEwLHI9ZSk6KHM9ITEsbj0hMCk7Zm9yKGxldCByPWUrMTtyPHRoaXMucm93cztyKyspMCE9PXRoaXMuZ2V0KHQscikmJihzPSExKTt0Kyt9cmV0dXJuIHN9ZWNoZWxvbkZvcm0oKXtsZXQgdD10aGlzLmNsb25lKCksZT0wLHI9MDtmb3IoO2U8dC5yb3dzJiZyPHQuY29sdW1uczspe2xldCBzPWU7Zm9yKGxldCBuPWU7bjx0LnJvd3M7bisrKXQuZ2V0KG4scik+dC5nZXQocyxyKSYmKHM9bik7aWYoMD09PXQuZ2V0KHMscikpcisrO2Vsc2V7dC5zd2FwUm93cyhlLHMpO2xldCBuPXQuZ2V0KGUscik7Zm9yKGxldCBzPXI7czx0LmNvbHVtbnM7cysrKXQuc2V0KGUscyx0LmdldChlLHMpL24pO2ZvcihsZXQgcz1lKzE7czx0LnJvd3M7cysrKXtsZXQgbj10LmdldChzLHIpL3QuZ2V0KGUscik7dC5zZXQocyxyLDApO2ZvcihsZXQgbz1yKzE7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHMsbyx0LmdldChzLG8pLXQuZ2V0KGUsbykqbil9ZSsrLHIrK319cmV0dXJuIHR9cmVkdWNlZEVjaGVsb25Gb3JtKCl7bGV0IHQ9dGhpcy5lY2hlbG9uRm9ybSgpLGU9dC5jb2x1bW5zLHI9dC5yb3dzLHM9ci0xO2Zvcig7cz49MDspaWYoMD09PXQubWF4Um93KHMpKXMtLTtlbHNle2xldCBuPTAsbz0hMTtmb3IoO248ciYmITE9PT1vOykxPT09dC5nZXQocyxuKT9vPSEwOm4rKztmb3IobGV0IHI9MDtyPHM7cisrKXtsZXQgbz10LmdldChyLG4pO2ZvcihsZXQgaT1uO2k8ZTtpKyspe2xldCBlPXQuZ2V0KHIsaSktbyp0LmdldChzLGkpO3Quc2V0KHIsaSxlKX19cy0tfXJldHVybiB0fXNldCgpe3Rocm93IG5ldyBFcnJvcigic2V0IG1ldGhvZCBpcyB1bmltcGxlbWVudGVkIil9Z2V0KCl7dGhyb3cgbmV3IEVycm9yKCJnZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQiKX1yZXBlYXQodD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtyb3dzOmU9MSxjb2x1bW5zOnI9MX09dDtpZighTnVtYmVyLmlzSW50ZWdlcihlKXx8ZTw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJyb3dzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7aWYoIU51bWJlci5pc0ludGVnZXIocil8fHI8PTApdGhyb3cgbmV3IFR5cGVFcnJvcigiY29sdW1ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2xldCBzPW5ldyBlcih0aGlzLnJvd3MqZSx0aGlzLmNvbHVtbnMqcik7Zm9yKGxldCB0PTA7dDxlO3QrKylmb3IobGV0IGU9MDtlPHI7ZSsrKXMuc2V0U3ViTWF0cml4KHRoaXMsdGhpcy5yb3dzKnQsdGhpcy5jb2x1bW5zKmUpO3JldHVybiBzfWZpbGwodCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9bmVnKCl7cmV0dXJuIHRoaXMubXVsUygtMSl9Z2V0Um93KHQpe1VlKHRoaXMsdCk7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKWUucHVzaCh0aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1nZXRSb3dWZWN0b3IodCl7cmV0dXJuIGVyLnJvd1ZlY3Rvcih0aGlzLmdldFJvdyh0KSl9c2V0Um93KHQsZSl7VWUodGhpcyx0KSxlPUJlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KHQscixlW3JdKTtyZXR1cm4gdGhpc31zd2FwUm93cyh0LGUpe1VlKHRoaXMsdCksVWUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspe2xldCBzPXRoaXMuZ2V0KHQscik7dGhpcy5zZXQodCxyLHRoaXMuZ2V0KGUscikpLHRoaXMuc2V0KGUscixzKX1yZXR1cm4gdGhpc31nZXRDb2x1bW4odCl7R2UodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZS5wdXNoKHRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfWdldENvbHVtblZlY3Rvcih0KXtyZXR1cm4gZXIuY29sdW1uVmVjdG9yKHRoaXMuZ2V0Q29sdW1uKHQpKX1zZXRDb2x1bW4odCxlKXtHZSh0aGlzLHQpLGU9V2UodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspdGhpcy5zZXQocix0LGVbcl0pO3JldHVybiB0aGlzfXN3YXBDb2x1bW5zKHQsZSl7R2UodGhpcyx0KSxHZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl7bGV0IHM9dGhpcy5nZXQocix0KTt0aGlzLnNldChyLHQsdGhpcy5nZXQocixlKSksdGhpcy5zZXQocixlLHMpfXJldHVybiB0aGlzfWFkZFJvd1ZlY3Rvcih0KXt0PUJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0W3JdKTtyZXR1cm4gdGhpc31zdWJSb3dWZWN0b3IodCl7dD1CZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdFtyXSk7cmV0dXJuIHRoaXN9bXVsUm93VmVjdG9yKHQpe3Q9QmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnRbcl0pO3JldHVybiB0aGlzfWRpdlJvd1ZlY3Rvcih0KXt0PUJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90W3JdKTtyZXR1cm4gdGhpc31hZGRDb2x1bW5WZWN0b3IodCl7dD1XZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdFtlXSk7cmV0dXJuIHRoaXN9c3ViQ29sdW1uVmVjdG9yKHQpe3Q9V2UodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXRbZV0pO3JldHVybiB0aGlzfW11bENvbHVtblZlY3Rvcih0KXt0PVdlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0W2VdKTtyZXR1cm4gdGhpc31kaXZDb2x1bW5WZWN0b3IodCl7dD1XZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdFtlXSk7cmV0dXJuIHRoaXN9bXVsUm93KHQsZSl7VWUodGhpcyx0KTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQodCxyLHRoaXMuZ2V0KHQscikqZSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uKHQsZSl7R2UodGhpcyx0KTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspdGhpcy5zZXQocix0LHRoaXMuZ2V0KHIsdCkqZSk7cmV0dXJuIHRoaXN9bWF4KHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47c3dpdGNoKHQpe2Nhc2Uicm93Ijp7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5yb3dzKS5maWxsKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnRbZV0mJih0W2VdPXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWNhc2UiY29sdW1uIjp7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5jb2x1bW5zKS5maWxsKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnRbcl0mJih0W3JdPXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWNhc2Ugdm9pZCAwOntsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKT50JiYodD10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWF4SW5kZXgoKXtIZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dGhpcy5jb2x1bW5zO3MrKyl0aGlzLmdldChyLHMpPnQmJih0PXRoaXMuZ2V0KHIscyksZVswXT1yLGVbMV09cyk7cmV0dXJuIGV9bWluKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47c3dpdGNoKHQpe2Nhc2Uicm93Ijp7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5yb3dzKS5maWxsKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPHRbZV0mJih0W2VdPXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWNhc2UiY29sdW1uIjp7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5jb2x1bW5zKS5maWxsKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPHRbcl0mJih0W3JdPXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWNhc2Ugdm9pZCAwOntsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKTx0JiYodD10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWluSW5kZXgoKXtIZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dGhpcy5jb2x1bW5zO3MrKyl0aGlzLmdldChyLHMpPHQmJih0PXRoaXMuZ2V0KHIscyksZVswXT1yLGVbMV09cyk7cmV0dXJuIGV9bWF4Um93KHQpe2lmKFVlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCh0LDApO2ZvcihsZXQgcj0xO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldCh0LHIpPmUmJihlPXRoaXMuZ2V0KHQscikpO3JldHVybiBlfW1heFJvd0luZGV4KHQpe1VlKHRoaXMsdCksSGUodGhpcyk7bGV0IGU9dGhpcy5nZXQodCwwKSxyPVt0LDBdO2ZvcihsZXQgcz0xO3M8dGhpcy5jb2x1bW5zO3MrKyl0aGlzLmdldCh0LHMpPmUmJihlPXRoaXMuZ2V0KHQscyksclsxXT1zKTtyZXR1cm4gcn1taW5Sb3codCl7aWYoVWUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik8ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWluUm93SW5kZXgodCl7VWUodGhpcyx0KSxIZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBzPTE7czx0aGlzLmNvbHVtbnM7cysrKXRoaXMuZ2V0KHQscyk8ZSYmKGU9dGhpcy5nZXQodCxzKSxyWzFdPXMpO3JldHVybiByfW1heENvbHVtbih0KXtpZihHZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQoMCx0KTtmb3IobGV0IHI9MTtyPHRoaXMucm93cztyKyspdGhpcy5nZXQocix0KT5lJiYoZT10aGlzLmdldChyLHQpKTtyZXR1cm4gZX1tYXhDb2x1bW5JbmRleCh0KXtHZSh0aGlzLHQpLEhlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KDAsdCkscj1bMCx0XTtmb3IobGV0IHM9MTtzPHRoaXMucm93cztzKyspdGhpcy5nZXQocyx0KT5lJiYoZT10aGlzLmdldChzLHQpLHJbMF09cyk7cmV0dXJuIHJ9bWluQ29sdW1uKHQpe2lmKEdlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPGUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1pbkNvbHVtbkluZGV4KHQpe0dlKHRoaXMsdCksSGUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgcz0xO3M8dGhpcy5yb3dzO3MrKyl0aGlzLmdldChzLHQpPGUmJihlPXRoaXMuZ2V0KHMsdCksclswXT1zKTtyZXR1cm4gcn1kaWFnKCl7bGV0IHQ9TWF0aC5taW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLmdldChyLHIpKTtyZXR1cm4gZX1ub3JtKHQ9ImZyb2Jlbml1cyIpe3N3aXRjaCh0KXtjYXNlIm1heCI6cmV0dXJuIHRoaXMubWF4KCk7Y2FzZSJmcm9iZW5pdXMiOnJldHVybiBNYXRoLnNxcnQodGhpcy5kb3QodGhpcykpO2RlZmF1bHQ6dGhyb3cgbmV3IFJhbmdlRXJyb3IoYHVua25vd24gbm9ybSB0eXBlOiAke3R9YCl9fWN1bXVsYXRpdmVTdW0oKXtsZXQgdD0wO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdCs9dGhpcy5nZXQoZSxyKSx0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9ZG90KHQpe1plLmlzTWF0cml4KHQpJiYodD10LnRvMURBcnJheSgpKTtsZXQgZT10aGlzLnRvMURBcnJheSgpO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvcnMgZG8gbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSIpO2xldCByPTA7Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspcis9ZVtzXSp0W3NdO3JldHVybiByfW1tdWwodCl7dD1lci5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMscz10LmNvbHVtbnMsbj1uZXcgZXIoZSxzKSxvPW5ldyBGbG9hdDY0QXJyYXkocik7Zm9yKGxldCBpPTA7aTxzO2krKyl7Zm9yKGxldCBlPTA7ZTxyO2UrKylvW2VdPXQuZ2V0KGUsaSk7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9MDtmb3IobGV0IHM9MDtzPHI7cysrKWUrPXRoaXMuZ2V0KHQscykqb1tzXTtuLnNldCh0LGksZSl9fXJldHVybiBufW1wb3codCl7aWYoIXRoaXMuaXNTcXVhcmUoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cml4IG11c3QgYmUgc3F1YXJlIik7aWYoIU51bWJlci5pc0ludGVnZXIodCl8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRXhwb25lbnQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIik7bGV0IGU9ZXIuZXllKHRoaXMucm93cykscj10aGlzO2ZvcihsZXQgcz10O3M+PTE7cy89MikwIT0oMSZzKSYmKGU9ZS5tbXVsKHIpKSxyPXIubW11bChyKTtyZXR1cm4gZX1zdHJhc3NlbjJ4Mih0KXt0PWVyLmNoZWNrTWF0cml4KHQpO2xldCBlPW5ldyBlcigyLDIpO2NvbnN0IHI9dGhpcy5nZXQoMCwwKSxzPXQuZ2V0KDAsMCksbj10aGlzLmdldCgwLDEpLG89dC5nZXQoMCwxKSxpPXRoaXMuZ2V0KDEsMCksdT10LmdldCgxLDApLGE9dGhpcy5nZXQoMSwxKSxsPXQuZ2V0KDEsMSksaD0ocithKSoocytsKSxjPShpK2EpKnMsZj1yKihvLWwpLG09YSoodS1zKSxnPShyK24pKmwsdz1oK20tZysobi1hKSoodStsKSxwPWYrZyxkPWMrbSx5PWgtYytmKyhpLXIpKihzK28pO3JldHVybiBlLnNldCgwLDAsdyksZS5zZXQoMCwxLHApLGUuc2V0KDEsMCxkKSxlLnNldCgxLDEseSksZX1zdHJhc3NlbjN4Myh0KXt0PWVyLmNoZWNrTWF0cml4KHQpO2xldCBlPW5ldyBlcigzLDMpO2NvbnN0IHI9dGhpcy5nZXQoMCwwKSxzPXRoaXMuZ2V0KDAsMSksbj10aGlzLmdldCgwLDIpLG89dGhpcy5nZXQoMSwwKSxpPXRoaXMuZ2V0KDEsMSksdT10aGlzLmdldCgxLDIpLGE9dGhpcy5nZXQoMiwwKSxsPXRoaXMuZ2V0KDIsMSksaD10aGlzLmdldCgyLDIpLGM9dC5nZXQoMCwwKSxmPXQuZ2V0KDAsMSksbT10LmdldCgwLDIpLGc9dC5nZXQoMSwwKSx3PXQuZ2V0KDEsMSkscD10LmdldCgxLDIpLGQ9dC5nZXQoMiwwKSx5PXQuZ2V0KDIsMSksYj10LmdldCgyLDIpLE09KHItbykqKC1mK3cpLHY9KC1yK28raSkqKGMtZit3KSx4PShvK2kpKigtYytmKSxFPXIqYyxTPSgtcithK2wpKihjLW0rcCksXz0oLXIrYSkqKG0tcCksaj0oYStsKSooLWMrbSksQT0oLW4rbCtoKSoodytkLXkpLFI9KG4taCkqKHcteSksST1uKmQsQz0obCtoKSooLWQreSksTj0oLW4raSt1KSoocCtkLWIpLGs9KG4tdSkqKHAtYiksVD0oaSt1KSooLWQrYiksRj1FK0krcypnLE89KHIrcytuLW8taS1sLWgpKncrdit4K0UrQStJK0MsVj1FK1MraisocitzK24taS11LWEtbCkqcCtJK04rVCx6PU0raSooLWMrZitnLXctcC1kK2IpK3YrRStJK04rayxEPU0rdit4K0UrdSp5LFA9SStOK2srVCtvKm0scT1FK1MrXytsKigtYyttK2ctdy1wLWQreSkrQStSK0ksJD1BK1IrSStDK2EqZixMPUUrUytfK2oraCpiO3JldHVybiBlLnNldCgwLDAsRiksZS5zZXQoMCwxLE8pLGUuc2V0KDAsMixWKSxlLnNldCgxLDAseiksZS5zZXQoMSwxLEQpLGUuc2V0KDEsMixQKSxlLnNldCgyLDAscSksZS5zZXQoMiwxLCQpLGUuc2V0KDIsMixMKSxlfW1tdWxTdHJhc3Nlbih0KXt0PWVyLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuY2xvbmUoKSxyPWUucm93cyxzPWUuY29sdW1ucyxuPXQucm93cyxvPXQuY29sdW1ucztmdW5jdGlvbiBpKHQsZSxyKXtsZXQgcz10LnJvd3Msbj10LmNvbHVtbnM7aWYocz09PWUmJm49PT1yKXJldHVybiB0O3tsZXQgcz1aZS56ZXJvcyhlLHIpO3JldHVybiBzPXMuc2V0U3ViTWF0cml4KHQsMCwwKSxzfX1zIT09biYmY29uc29sZS53YXJuKGBNdWx0aXBseWluZyAke3J9IHggJHtzfSBhbmQgJHtufSB4ICR7b30gbWF0cml4OiBkaW1lbnNpb25zIGRvIG5vdCBtYXRjaC5gKTtsZXQgdT1NYXRoLm1heChyLG4pLGE9TWF0aC5tYXgocyxvKTtyZXR1cm4gZT1pKGUsdSxhKSxmdW5jdGlvbiB0KGUscixzLG4pe2lmKHM8PTUxMnx8bjw9NTEyKXJldHVybiBlLm1tdWwocik7cyUyPT0xJiZuJTI9PTE/KGU9aShlLHMrMSxuKzEpLHI9aShyLHMrMSxuKzEpKTpzJTI9PTE/KGU9aShlLHMrMSxuKSxyPWkocixzKzEsbikpOm4lMj09MSYmKGU9aShlLHMsbisxKSxyPWkocixzLG4rMSkpO2xldCBvPXBhcnNlSW50KGUucm93cy8yLDEwKSx1PXBhcnNlSW50KGUuY29sdW1ucy8yLDEwKSxhPWUuc3ViTWF0cml4KDAsby0xLDAsdS0xKSxsPXIuc3ViTWF0cml4KDAsby0xLDAsdS0xKSxoPWUuc3ViTWF0cml4KDAsby0xLHUsZS5jb2x1bW5zLTEpLGM9ci5zdWJNYXRyaXgoMCxvLTEsdSxyLmNvbHVtbnMtMSksZj1lLnN1Yk1hdHJpeChvLGUucm93cy0xLDAsdS0xKSxtPXIuc3ViTWF0cml4KG8sci5yb3dzLTEsMCx1LTEpLGc9ZS5zdWJNYXRyaXgobyxlLnJvd3MtMSx1LGUuY29sdW1ucy0xKSx3PXIuc3ViTWF0cml4KG8sci5yb3dzLTEsdSxyLmNvbHVtbnMtMSkscD10KFplLmFkZChhLGcpLFplLmFkZChsLHcpLG8sdSksZD10KFplLmFkZChmLGcpLGwsbyx1KSx5PXQoYSxaZS5zdWIoYyx3KSxvLHUpLGI9dChnLFplLnN1YihtLGwpLG8sdSksTT10KFplLmFkZChhLGgpLHcsbyx1KSx2PXQoWmUuc3ViKGYsYSksWmUuYWRkKGwsYyksbyx1KSx4PXQoWmUuc3ViKGgsZyksWmUuYWRkKG0sdyksbyx1KSxFPVplLmFkZChwLGIpO0Uuc3ViKE0pLEUuYWRkKHgpO2xldCBTPVplLmFkZCh5LE0pLF89WmUuYWRkKGQsYiksaj1aZS5zdWIocCxkKTtqLmFkZCh5KSxqLmFkZCh2KTtsZXQgQT1aZS56ZXJvcygyKkUucm93cywyKkUuY29sdW1ucyk7cmV0dXJuIEE9QS5zZXRTdWJNYXRyaXgoRSwwLDApLEE9QS5zZXRTdWJNYXRyaXgoUyxFLnJvd3MsMCksQT1BLnNldFN1Yk1hdHJpeChfLDAsRS5jb2x1bW5zKSxBPUEuc2V0U3ViTWF0cml4KGosRS5yb3dzLEUuY29sdW1ucyksQS5zdWJNYXRyaXgoMCxzLTEsMCxuLTEpfShlLHQ9aSh0LHUsYSksdSxhKX1zY2FsZVJvd3ModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IHM9bmV3IGVyKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyl7Y29uc3Qgbj10aGlzLmdldFJvdyh0KTtuLmxlbmd0aD4wJiZ6ZShuLHttaW46ZSxtYXg6cixvdXRwdXQ6bn0pLHMuc2V0Um93KHQsbil9cmV0dXJuIHN9c2NhbGVDb2x1bW5zKHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOmU9MCxtYXg6cj0xfT10O2lmKCFOdW1iZXIuaXNGaW5pdGUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYSBudW1iZXIiKTtpZighTnVtYmVyLmlzRmluaXRlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGEgbnVtYmVyIik7aWYoZT49cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBzPW5ldyBlcih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMuY29sdW1uczt0Kyspe2NvbnN0IG49dGhpcy5nZXRDb2x1bW4odCk7bi5sZW5ndGgmJnplKG4se21pbjplLG1heDpyLG91dHB1dDpufSkscy5zZXRDb2x1bW4odCxuKX1yZXR1cm4gc31mbGlwUm93cygpe2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMuY29sdW1ucy8yKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5nZXQoZSxyKSxzPXRoaXMuZ2V0KGUsdGhpcy5jb2x1bW5zLTEtcik7dGhpcy5zZXQoZSxyLHMpLHRoaXMuc2V0KGUsdGhpcy5jb2x1bW5zLTEtcix0KX1yZXR1cm4gdGhpc31mbGlwQ29sdW1ucygpe2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMucm93cy8yKTtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspZm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5nZXQocixlKSxzPXRoaXMuZ2V0KHRoaXMucm93cy0xLXIsZSk7dGhpcy5zZXQocixlLHMpLHRoaXMuc2V0KHRoaXMucm93cy0xLXIsZSx0KX1yZXR1cm4gdGhpc31rcm9uZWNrZXJQcm9kdWN0KHQpe3Q9ZXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5yb3dzLHI9dGhpcy5jb2x1bW5zLHM9dC5yb3dzLG49dC5jb2x1bW5zLG89bmV3IGVyKGUqcyxyKm4pO2ZvcihsZXQgaT0wO2k8ZTtpKyspZm9yKGxldCBlPTA7ZTxyO2UrKylmb3IobGV0IHI9MDtyPHM7cisrKWZvcihsZXQgdT0wO3U8bjt1Kyspby5zZXQocyppK3IsbiplK3UsdGhpcy5nZXQoaSxlKSp0LmdldChyLHUpKTtyZXR1cm4gb31rcm9uZWNrZXJTdW0odCl7aWYodD1lci5jaGVja01hdHJpeCh0KSwhdGhpcy5pc1NxdWFyZSgpfHwhdC5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiS3JvbmVja2VyIFN1bSBuZWVkcyB0d28gU3F1YXJlIE1hdHJpY2VzIik7bGV0IGU9dGhpcy5yb3dzLHI9dC5yb3dzLHM9dGhpcy5rcm9uZWNrZXJQcm9kdWN0KGVyLmV5ZShyLHIpKSxuPWVyLmV5ZShlLGUpLmtyb25lY2tlclByb2R1Y3QodCk7cmV0dXJuIHMuYWRkKG4pfXRyYW5zcG9zZSgpe2xldCB0PW5ldyBlcih0aGlzLmNvbHVtbnMsdGhpcy5yb3dzKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuc2V0KHIsZSx0aGlzLmdldChlLHIpKTtyZXR1cm4gdH1zb3J0Um93cyh0PXRyKXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspdGhpcy5zZXRSb3coZSx0aGlzLmdldFJvdyhlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zb3J0Q29sdW1ucyh0PXRyKXtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXRDb2x1bW4oZSx0aGlzLmdldENvbHVtbihlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zdWJNYXRyaXgodCxlLHIscyl7WGUodGhpcyx0LGUscixzKTtsZXQgbj1uZXcgZXIoZS10KzEscy1yKzEpO2ZvcihsZXQgbz10O288PWU7bysrKWZvcihsZXQgZT1yO2U8PXM7ZSsrKW4uc2V0KG8tdCxlLXIsdGhpcy5nZXQobyxlKSk7cmV0dXJuIG59c3ViTWF0cml4Um93KHQsZSxyKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10aGlzLmNvbHVtbnMtMSksZT5yfHxlPDB8fGU+PXRoaXMuY29sdW1uc3x8cjwwfHxyPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBzPW5ldyBlcih0Lmxlbmd0aCxyLWUrMSk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKGxldCBvPWU7bzw9cjtvKyspe2lmKHRbbl08MHx8dFtuXT49dGhpcy5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKGBSb3cgaW5kZXggb3V0IG9mIHJhbmdlOiAke3Rbbl19YCk7cy5zZXQobixvLWUsdGhpcy5nZXQodFtuXSxvKSl9cmV0dXJuIHN9c3ViTWF0cml4Q29sdW1uKHQsZSxyKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10aGlzLnJvd3MtMSksZT5yfHxlPDB8fGU+PXRoaXMucm93c3x8cjwwfHxyPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBzPW5ldyBlcihyLWUrMSx0Lmxlbmd0aCk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKGxldCBvPWU7bzw9cjtvKyspe2lmKHRbbl08MHx8dFtuXT49dGhpcy5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKGBDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlOiAke3Rbbl19YCk7cy5zZXQoby1lLG4sdGhpcy5nZXQobyx0W25dKSl9cmV0dXJuIHN9c2V0U3ViTWF0cml4KHQsZSxyKXtpZigodD1lci5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXJldHVybiB0aGlzO1hlKHRoaXMsZSxlK3Qucm93cy0xLHIscit0LmNvbHVtbnMtMSk7Zm9yKGxldCBzPTA7czx0LnJvd3M7cysrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0aGlzLnNldChlK3MscituLHQuZ2V0KHMsbikpO3JldHVybiB0aGlzfXNlbGVjdGlvbih0LGUpe0tlKHRoaXMsdCksUWUodGhpcyxlKTtsZXQgcj1uZXcgZXIodC5sZW5ndGgsZS5sZW5ndGgpO2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtsZXQgbj10W3NdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgbz1lW3RdO3Iuc2V0KHMsdCx0aGlzLmdldChuLG8pKX19cmV0dXJuIHJ9dHJhY2UoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPTA7Zm9yKGxldCByPTA7cjx0O3IrKyllKz10aGlzLmdldChyLHIpO3JldHVybiBlfWNsb25lKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29weSh0aGlzLG5ldyBlcih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSl9c3RhdGljIGNvcHkodCxlKXtmb3IoY29uc3RbcixzLG5db2YgdC5lbnRyaWVzKCkpZS5zZXQocixzLG4pO3JldHVybiBlfXN1bSh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1ZZSh0LnJvd3MpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IHM9MDtzPHQuY29sdW1uczsrK3MpZVtyXSs9dC5nZXQocixzKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSJjb2x1bW4iOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1ZZSh0LmNvbHVtbnMpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IHM9MDtzPHQuY29sdW1uczsrK3MpZVtzXSs9dC5nZXQocixzKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTA7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zO3MrKyllKz10LmdldChyLHMpO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19cHJvZHVjdCh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1ZZSh0LnJvd3MsMSk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zOysrcyllW3JdKj10LmdldChyLHMpO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPVllKHQuY29sdW1ucywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7KytzKWVbc10qPXQuZ2V0KHIscyk7cmV0dXJuIGV9KHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT0xO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspZSo9dC5nZXQocixzKTtyZXR1cm4gZX0odGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fW1lYW4odCl7Y29uc3QgZT10aGlzLnN1bSh0KTtzd2l0Y2godCl7Y2FzZSJyb3ciOmZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyllW3RdLz10aGlzLmNvbHVtbnM7cmV0dXJuIGU7Y2FzZSJjb2x1bW4iOmZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyllW3RdLz10aGlzLnJvd3M7cmV0dXJuIGU7Y2FzZSB2b2lkIDA6cmV0dXJuIGUvdGhpcy5zaXplO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX12YXJpYW5jZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHt1bmJpYXNlZDpyPSEwLG1lYW46cz10aGlzLm1lYW4odCl9PWU7aWYoImJvb2xlYW4iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmJpYXNlZCBtdXN0IGJlIGEgYm9vbGVhbiIpO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIVZlKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgcz10LnJvd3Msbj10LmNvbHVtbnMsbz1bXTtmb3IobGV0IGk9MDtpPHM7aSsrKXtsZXQgcz0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxuO2UrKylhPXQuZ2V0KGksZSktcltpXSxzKz1hLHUrPWEqYTtlP28ucHVzaCgodS1zKnMvbikvKG4tMSkpOm8ucHVzaCgodS1zKnMvbikvbil9cmV0dXJuIG99KHRoaXMscixzKTtjYXNlImNvbHVtbiI6aWYoIVZlKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgcz10LnJvd3Msbj10LmNvbHVtbnMsbz1bXTtmb3IobGV0IGk9MDtpPG47aSsrKXtsZXQgbj0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxzO2UrKylhPXQuZ2V0KGUsaSktcltpXSxuKz1hLHUrPWEqYTtlP28ucHVzaCgodS1uKm4vcykvKHMtMSkpOm8ucHVzaCgodS1uKm4vcykvcyl9cmV0dXJuIG99KHRoaXMscixzKTtjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIHMpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBzPXQucm93cyxuPXQuY29sdW1ucyxvPXMqbjtsZXQgaT0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxzO2UrKylmb3IobGV0IHM9MDtzPG47cysrKWE9dC5nZXQoZSxzKS1yLGkrPWEsdSs9YSphO3JldHVybiBlPyh1LWkqaS9vKS8oby0xKToodS1pKmkvbykvb30odGhpcyxyLHMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zdGFuZGFyZERldmlhdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCk7Y29uc3Qgcj10aGlzLnZhcmlhbmNlKHQsZSk7aWYodm9pZCAwPT09dClyZXR1cm4gTWF0aC5zcXJ0KHIpO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXJbdF09TWF0aC5zcXJ0KHJbdF0pO3JldHVybiByfWNlbnRlcih0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtjZW50ZXI6cj10aGlzLm1lYW4odCl9PWU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighVmUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7cysrKXQuc2V0KHIscyx0LmdldChyLHMpLWVbcl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKCFWZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspdC5zZXQocixzLHQuZ2V0KHIscyktZVtzXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7cysrKXQuc2V0KHIscyx0LmdldChyLHMpLWUpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXNjYWxlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2xldCByPWUuc2NhbGU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQucm93cztyKyspe2xldCBzPTA7Zm9yKGxldCBlPTA7ZTx0LmNvbHVtbnM7ZSsrKXMrPXQuZ2V0KHIsZSkqKjIvKHQuY29sdW1ucy0xKTtlLnB1c2goTWF0aC5zcXJ0KHMpKX1yZXR1cm4gZX0odGhpcyk7ZWxzZSBpZighVmUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspdC5zZXQocixzLHQuZ2V0KHIscykvZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0LmNvbHVtbnM7cisrKXtsZXQgcz0wO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKylzKz10LmdldChlLHIpKioyLyh0LnJvd3MtMSk7ZS5wdXNoKE1hdGguc3FydChzKSl9cmV0dXJuIGV9KHRoaXMpO2Vsc2UgaWYoIVZlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7cysrKXQuc2V0KHIscyx0LmdldChyLHMpL2Vbc10pfSh0aGlzLHIpLHRoaXM7Y2FzZSB2b2lkIDA6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5zaXplLTE7bGV0IHI9MDtmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspZm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKXIrPXQuZ2V0KG4scykqKjIvZTtyZXR1cm4gTWF0aC5zcXJ0KHIpfSh0aGlzKTtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zO3MrKyl0LnNldChyLHMsdC5nZXQocixzKS9lKX0odGhpcyxyKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX10b1N0cmluZyh0KXtyZXR1cm4gcWUodGhpcyx0KX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLmVudHJpZXMoKX0qZW50cmllcygpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspeWllbGRbdCxlLHRoaXMuZ2V0KHQsZSldfSp2YWx1ZXMoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXlpZWxkIHRoaXMuZ2V0KHQsZSl9fWZ1bmN0aW9uIHRyKHQsZSl7cmV0dXJuIHQtZX1aZS5wcm90b3R5cGUua2xhc3M9Ik1hdHJpeCIsInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJihaZS5wcm90b3R5cGVbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV09ZnVuY3Rpb24oKXtyZXR1cm4gcWUodGhpcyl9KSxaZS5yYW5kb209WmUucmFuZCxaZS5yYW5kb21JbnQ9WmUucmFuZEludCxaZS5kaWFnb25hbD1aZS5kaWFnLFplLnByb3RvdHlwZS5kaWFnb25hbD1aZS5wcm90b3R5cGUuZGlhZyxaZS5pZGVudGl0eT1aZS5leWUsWmUucHJvdG90eXBlLm5lZ2F0ZT1aZS5wcm90b3R5cGUubmVnLFplLnByb3RvdHlwZS50ZW5zb3JQcm9kdWN0PVplLnByb3RvdHlwZS5rcm9uZWNrZXJQcm9kdWN0O2xldCBlcj1jbGFzcyB0IGV4dGVuZHMgWmV7ZGF0YTsjdCh0LGUpe2lmKHRoaXMuZGF0YT1bXSwhKE51bWJlci5pc0ludGVnZXIoZSkmJmU+PTApKXRocm93IG5ldyBUeXBlRXJyb3IoIm5Db2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7Zm9yKGxldCByPTA7cjx0O3IrKyl0aGlzLmRhdGEucHVzaChuZXcgRmxvYXQ2NEFycmF5KGUpKTt0aGlzLnJvd3M9dCx0aGlzLmNvbHVtbnM9ZX1jb25zdHJ1Y3RvcihlLHIpe2lmKHN1cGVyKCksdC5pc01hdHJpeChlKSl0aGlzLiN0KGUucm93cyxlLmNvbHVtbnMpLHQuY29weShlLHRoaXMpO2Vsc2UgaWYoTnVtYmVyLmlzSW50ZWdlcihlKSYmZT49MCl0aGlzLiN0KGUscik7ZWxzZXtpZighVmUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvciBhbiBhcnJheSIpO3tjb25zdCB0PWU7aWYoIm51bWJlciIhPXR5cGVvZihyPShlPXQubGVuZ3RoKT90WzBdLmxlbmd0aDowKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJEYXRhIG11c3QgYmUgYSAyRCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50Iik7dGhpcy5kYXRhPVtdO2ZvcihsZXQgcz0wO3M8ZTtzKyspe2lmKHRbc10ubGVuZ3RoIT09cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5jb25zaXN0ZW50IGFycmF5IGRpbWVuc2lvbnMiKTtpZighdFtzXS5ldmVyeSgodD0+Im51bWJlciI9PXR5cGVvZiB0KSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW5wdXQgZGF0YSBjb250YWlucyBub24tbnVtZXJpYyB2YWx1ZXMiKTt0aGlzLmRhdGEucHVzaChGbG9hdDY0QXJyYXkuZnJvbSh0W3NdKSl9dGhpcy5yb3dzPWUsdGhpcy5jb2x1bW5zPXJ9fX1zZXQodCxlLHIpe3JldHVybiB0aGlzLmRhdGFbdF1bZV09cix0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLmRhdGFbdF1bZV19cmVtb3ZlUm93KHQpe3JldHVybiBVZSh0aGlzLHQpLHRoaXMuZGF0YS5zcGxpY2UodCwxKSx0aGlzLnJvd3MtPTEsdGhpc31hZGRSb3codCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMucm93cyksVWUodGhpcyx0LCEwKSxlPUZsb2F0NjRBcnJheS5mcm9tKEJlKHRoaXMsZSkpLHRoaXMuZGF0YS5zcGxpY2UodCwwLGUpLHRoaXMucm93cys9MSx0aGlzfXJlbW92ZUNvbHVtbih0KXtHZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7Y29uc3Qgcj1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucy0xKTtmb3IobGV0IHM9MDtzPHQ7cysrKXJbc109dGhpcy5kYXRhW2VdW3NdO2ZvcihsZXQgcz10KzE7czx0aGlzLmNvbHVtbnM7cysrKXJbcy0xXT10aGlzLmRhdGFbZV1bc107dGhpcy5kYXRhW2VdPXJ9cmV0dXJuIHRoaXMuY29sdW1ucy09MSx0aGlzfWFkZENvbHVtbih0LGUpe3ZvaWQgMD09PWUmJihlPXQsdD10aGlzLmNvbHVtbnMpLEdlKHRoaXMsdCwhMCksZT1XZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl7Y29uc3Qgcz1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucysxKTtsZXQgbj0wO2Zvcig7bjx0O24rKylzW25dPXRoaXMuZGF0YVtyXVtuXTtmb3Ioc1tuKytdPWVbcl07bjx0aGlzLmNvbHVtbnMrMTtuKyspc1tuXT10aGlzLmRhdGFbcl1bbi0xXTt0aGlzLmRhdGFbcl09c31yZXR1cm4gdGhpcy5jb2x1bW5zKz0xLHRoaXN9fTshZnVuY3Rpb24odCxlKXt0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuYWRkUyh0KTp0aGlzLmFkZE0odCl9LHQucHJvdG90eXBlLmFkZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuYWRkTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuYWRkPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmFkZChyKX0sdC5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnN1YlModCk6dGhpcy5zdWJNKHQpfSx0LnByb3RvdHlwZS5zdWJTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnN1Yk09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnN1Yj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5zdWIocil9LHQucHJvdG90eXBlLnN1YnRyYWN0PXQucHJvdG90eXBlLnN1Yix0LnByb3RvdHlwZS5zdWJ0cmFjdFM9dC5wcm90b3R5cGUuc3ViUyx0LnByb3RvdHlwZS5zdWJ0cmFjdE09dC5wcm90b3R5cGUuc3ViTSx0LnN1YnRyYWN0PXQuc3ViLHQucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5tdWxTKHQpOnRoaXMubXVsTSh0KX0sdC5wcm90b3R5cGUubXVsUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5tdWxNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5tdWw9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubXVsKHIpfSx0LnByb3RvdHlwZS5tdWx0aXBseT10LnByb3RvdHlwZS5tdWwsdC5wcm90b3R5cGUubXVsdGlwbHlTPXQucHJvdG90eXBlLm11bFMsdC5wcm90b3R5cGUubXVsdGlwbHlNPXQucHJvdG90eXBlLm11bE0sdC5tdWx0aXBseT10Lm11bCx0LnByb3RvdHlwZS5kaXY9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuZGl2Uyh0KTp0aGlzLmRpdk0odCl9LHQucHJvdG90eXBlLmRpdlM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZGl2TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuZGl2PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmRpdihyKX0sdC5wcm90b3R5cGUuZGl2aWRlPXQucHJvdG90eXBlLmRpdix0LnByb3RvdHlwZS5kaXZpZGVTPXQucHJvdG90eXBlLmRpdlMsdC5wcm90b3R5cGUuZGl2aWRlTT10LnByb3RvdHlwZS5kaXZNLHQuZGl2aWRlPXQuZGl2LHQucHJvdG90eXBlLm1vZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5tb2RTKHQpOnRoaXMubW9kTSh0KX0sdC5wcm90b3R5cGUubW9kUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJXQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5tb2RNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSV0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5tb2Q9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubW9kKHIpfSx0LnByb3RvdHlwZS5tb2R1bHVzPXQucHJvdG90eXBlLm1vZCx0LnByb3RvdHlwZS5tb2R1bHVzUz10LnByb3RvdHlwZS5tb2RTLHQucHJvdG90eXBlLm1vZHVsdXNNPXQucHJvdG90eXBlLm1vZE0sdC5tb2R1bHVzPXQubW9kLHQucHJvdG90eXBlLmFuZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5hbmRTKHQpOnRoaXMuYW5kTSh0KX0sdC5wcm90b3R5cGUuYW5kUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hbmRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSZ0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5hbmQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuYW5kKHIpfSx0LnByb3RvdHlwZS5vcj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5vclModCk6dGhpcy5vck0odCl9LHQucHJvdG90eXBlLm9yUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpfHQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5vck09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpfHQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm9yPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm9yKHIpfSx0LnByb3RvdHlwZS54b3I9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMueG9yUyh0KTp0aGlzLnhvck0odCl9LHQucHJvdG90eXBlLnhvclM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKV50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUueG9yTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciledC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQueG9yPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnhvcihyKX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmxlZnRTaGlmdFModCk6dGhpcy5sZWZ0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik8PHQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKTw8dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubGVmdFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmxlZnRTaGlmdChyKX0sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uyh0KTp0aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQocil9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMucmlnaHRTaGlmdFModCk6dGhpcy5yaWdodFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUucmlnaHRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+PnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+Pj50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnJpZ2h0U2hpZnQocil9LHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdD10LnByb3RvdHlwZS5yaWdodFNoaWZ0LHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdFM9dC5wcm90b3R5cGUucmlnaHRTaGlmdFMsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0TT10LnByb3RvdHlwZS5yaWdodFNoaWZ0TSx0Lnplcm9GaWxsUmlnaHRTaGlmdD10LnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUubm90PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsfnRoaXMuZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0Lm5vdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubm90KCl9LHQucHJvdG90eXBlLmFicz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWJzKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hYnM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFicygpfSx0LnByb3RvdHlwZS5hY29zPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hY29zKCl9LHQucHJvdG90eXBlLmFjb3NoPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hY29zaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWNvc2g9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFjb3NoKCl9LHQucHJvdG90eXBlLmFzaW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFzaW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFzaW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFzaW4oKX0sdC5wcm90b3R5cGUuYXNpbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFzaW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXNpbmgoKX0sdC5wcm90b3R5cGUuYXRhbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXRhbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXRhbigpfSx0LnByb3RvdHlwZS5hdGFuaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXRhbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hdGFuaCgpfSx0LnByb3RvdHlwZS5jYnJ0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jYnJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jYnJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jYnJ0KCl9LHQucHJvdG90eXBlLmNlaWw9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNlaWwodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNlaWw9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNlaWwoKX0sdC5wcm90b3R5cGUuY2x6MzI9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNsejMyKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jbHozMj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2x6MzIoKX0sdC5wcm90b3R5cGUuY29zPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNvcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY29zKCl9LHQucHJvdG90eXBlLmNvc2g9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNvc2g9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNvc2goKX0sdC5wcm90b3R5cGUuZXhwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5leHAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmV4cD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZXhwKCl9LHQucHJvdG90eXBlLmV4cG0xPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5leHBtMSh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwbTE9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmV4cG0xKCl9LHQucHJvdG90eXBlLmZsb29yPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mbG9vcih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZmxvb3I9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmZsb29yKCl9LHQucHJvdG90eXBlLmZyb3VuZD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5mcm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmZyb3VuZCgpfSx0LnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2coKX0sdC5wcm90b3R5cGUubG9nMXA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzFwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cxcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMXAoKX0sdC5wcm90b3R5cGUubG9nMTA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzEwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cxMD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMTAoKX0sdC5wcm90b3R5cGUubG9nMj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMigpfSx0LnByb3RvdHlwZS5yb3VuZD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgucm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5yb3VuZCgpfSx0LnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaWduKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaWduPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaWduKCl9LHQucHJvdG90eXBlLnNpbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpbigpfSx0LnByb3RvdHlwZS5zaW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaW5oKCl9LHQucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNxcnQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNxcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNxcnQoKX0sdC5wcm90b3R5cGUudGFuPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRhbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudGFuKCl9LHQucHJvdG90eXBlLnRhbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRhbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRhbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRhbmgoKX0sdC5wcm90b3R5cGUudHJ1bmM9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRydW5jKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50cnVuYz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudHJ1bmMoKX0sdC5wb3c9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkucG93KHIpfSx0LnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMucG93Uyh0KTp0aGlzLnBvd00odCl9LHQucHJvdG90eXBlLnBvd1M9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSoqdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnBvd009ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKip0LmdldChlLHIpKTtyZXR1cm4gdGhpc319KFplLGVyKTtjbGFzcyByciBleHRlbmRzIFpleyNlO2dldCBzaXplKCl7cmV0dXJuIHRoaXMuI2Uuc2l6ZX1nZXQgcm93cygpe3JldHVybiB0aGlzLiNlLnJvd3N9Z2V0IGNvbHVtbnMoKXtyZXR1cm4gdGhpcy4jZS5jb2x1bW5zfWdldCBkaWFnb25hbFNpemUoKXtyZXR1cm4gdGhpcy5yb3dzfXN0YXRpYyBpc1N5bW1ldHJpY01hdHJpeCh0KXtyZXR1cm4gZXIuaXNNYXRyaXgodCkmJiJTeW1tZXRyaWNNYXRyaXgiPT09dC5rbGFzc1R5cGV9c3RhdGljIHplcm9zKHQpe3JldHVybiBuZXcgdGhpcyh0KX1zdGF0aWMgb25lcyh0KXtyZXR1cm4gbmV3IHRoaXModCkuZmlsbCgxKX1jb25zdHJ1Y3Rvcih0KXtpZihzdXBlcigpLGVyLmlzTWF0cml4KHQpKXtpZighdC5pc1N5bW1ldHJpYygpKXRocm93IG5ldyBUeXBlRXJyb3IoIm5vdCBzeW1tZXRyaWMgZGF0YSIpO3RoaXMuI2U9ZXIuY29weSh0LG5ldyBlcih0LnJvd3MsdC5yb3dzKSl9ZWxzZSBpZihOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0Pj0wKXRoaXMuI2U9bmV3IGVyKHQsdCk7ZWxzZSBpZih0aGlzLiNlPW5ldyBlcih0KSwhdGhpcy5pc1N5bW1ldHJpYygpKXRocm93IG5ldyBUeXBlRXJyb3IoIm5vdCBzeW1tZXRyaWMgZGF0YSIpfWNsb25lKCl7Y29uc3QgdD1uZXcgcnIodGhpcy5kaWFnb25hbFNpemUpO2Zvcihjb25zdFtlLHIsc11vZiB0aGlzLnVwcGVyUmlnaHRFbnRyaWVzKCkpdC5zZXQoZSxyLHMpO3JldHVybiB0fXRvTWF0cml4KCl7cmV0dXJuIG5ldyBlcih0aGlzKX1nZXQodCxlKXtyZXR1cm4gdGhpcy4jZS5nZXQodCxlKX1zZXQodCxlLHIpe3JldHVybiB0aGlzLiNlLnNldCh0LGUsciksdGhpcy4jZS5zZXQoZSx0LHIpLHRoaXN9cmVtb3ZlQ3Jvc3ModCl7cmV0dXJuIHRoaXMuI2UucmVtb3ZlUm93KHQpLHRoaXMuI2UucmVtb3ZlQ29sdW1uKHQpLHRoaXN9YWRkQ3Jvc3ModCxlKXt2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5kaWFnb25hbFNpemUpO2NvbnN0IHI9ZS5zbGljZSgpO3JldHVybiByLnNwbGljZSh0LDEpLHRoaXMuI2UuYWRkUm93KHQsciksdGhpcy4jZS5hZGRDb2x1bW4odCxlKSx0aGlzfWFwcGx5TWFzayh0KXtpZih0Lmxlbmd0aCE9PXRoaXMuZGlhZ29uYWxTaXplKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXNrIHNpemUgZG8gbm90IG1hdGNoIHdpdGggbWF0cml4IHNpemUiKTtjb25zdCBlPVtdO2Zvcihjb25zdFtyLHNdb2YgdC5lbnRyaWVzKCkpc3x8ZS5wdXNoKHIpO2UucmV2ZXJzZSgpO2Zvcihjb25zdCB0IG9mIGUpdGhpcy5yZW1vdmVDcm9zcyh0KTtyZXR1cm4gdGhpc310b0NvbXBhY3QoKXtjb25zdHtkaWFnb25hbFNpemU6dH09dGhpcyxlPW5ldyBBcnJheSh0Kih0KzEpLzIpO2ZvcihsZXQgcj0wLHM9MCxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT10aGlzLmdldChzLHIpLCsrcj49dCYmKHI9KytzKTtyZXR1cm4gZX1zdGF0aWMgZnJvbUNvbXBhY3QodCl7Y29uc3QgZT10Lmxlbmd0aCxyPShNYXRoLnNxcnQoOCplKzEpLTEpLzI7aWYoIU51bWJlci5pc0ludGVnZXIocikpdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhpcyBhcnJheSBpcyBub3QgYSBjb21wYWN0IHJlcHJlc2VudGF0aW9uIG9mIGEgU3ltbWV0cmljIE1hdHJpeCwgJHtKU09OLnN0cmluZ2lmeSh0KX1gKTtjb25zdCBzPW5ldyBycihyKTtmb3IobGV0IG49MCxvPTAsaT0wO2k8ZTtpKyspcy5zZXQobixvLHRbaV0pLCsrbj49ciYmKG49KytvKTtyZXR1cm4gc30qdXBwZXJSaWdodEVudHJpZXMoKXtmb3IobGV0IHQ9MCxlPTA7dDx0aGlzLmRpYWdvbmFsU2l6ZTt2b2lkIDApe2NvbnN0IHI9dGhpcy5nZXQodCxlKTt5aWVsZFt0LGUscl0sKytlPj10aGlzLmRpYWdvbmFsU2l6ZSYmKGU9Kyt0KX19KnVwcGVyUmlnaHRWYWx1ZXMoKXtmb3IobGV0IHQ9MCxlPTA7dDx0aGlzLmRpYWdvbmFsU2l6ZTt2b2lkIDApe2NvbnN0IHI9dGhpcy5nZXQodCxlKTt5aWVsZCByLCsrZT49dGhpcy5kaWFnb25hbFNpemUmJihlPSsrdCl9fX1yci5wcm90b3R5cGUua2xhc3NUeXBlPSJTeW1tZXRyaWNNYXRyaXgiO2NsYXNzIHNyIGV4dGVuZHMgcnJ7c3RhdGljIGlzRGlzdGFuY2VNYXRyaXgodCl7cmV0dXJuIHJyLmlzU3ltbWV0cmljTWF0cml4KHQpJiYiRGlzdGFuY2VNYXRyaXgiPT09dC5rbGFzc1N1YlR5cGV9Y29uc3RydWN0b3IodCl7aWYoc3VwZXIodCksIXRoaXMuaXNEaXN0YW5jZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb3ZpZGVkIGFyZ3VtZW50cyBkbyBubyBwcm9kdWNlIGEgZGlzdGFuY2UgbWF0cml4Iil9c2V0KHQsZSxyKXtyZXR1cm4gdD09PWUmJihyPTApLHN1cGVyLnNldCh0LGUscil9YWRkQ3Jvc3ModCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMuZGlhZ29uYWxTaXplKSwoZT1lLnNsaWNlKCkpW3RdPTAsc3VwZXIuYWRkQ3Jvc3ModCxlKX10b1N5bW1ldHJpY01hdHJpeCgpe3JldHVybiBuZXcgcnIodGhpcyl9Y2xvbmUoKXtjb25zdCB0PW5ldyBzcih0aGlzLmRpYWdvbmFsU2l6ZSk7Zm9yKGNvbnN0W2UscixzXW9mIHRoaXMudXBwZXJSaWdodEVudHJpZXMoKSllIT09ciYmdC5zZXQoZSxyLHMpO3JldHVybiB0fXRvQ29tcGFjdCgpe2NvbnN0e2RpYWdvbmFsU2l6ZTp0fT10aGlzLGU9bmV3IEFycmF5KCh0LTEpKnQvMik7Zm9yKGxldCByPTEscz0wLG49MDtuPGUubGVuZ3RoO24rKyllW25dPXRoaXMuZ2V0KHMsciksKytyPj10JiYocj0xKyArK3MpO3JldHVybiBlfXN0YXRpYyBmcm9tQ29tcGFjdCh0KXtjb25zdCBlPXQubGVuZ3RoO2lmKDA9PT1lKXJldHVybiBuZXcgdGhpcygwKTtjb25zdCByPShNYXRoLnNxcnQoOCplKzEpKzEpLzI7aWYoIU51bWJlci5pc0ludGVnZXIocikpdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhpcyBhcnJheSBpcyBub3QgYSBjb21wYWN0IHJlcHJlc2VudGF0aW9uIG9mIGEgRGlzdGFuY2VNYXRyaXgsICR7SlNPTi5zdHJpbmdpZnkodCl9YCk7Y29uc3Qgcz1uZXcgdGhpcyhyKTtmb3IobGV0IG49MSxvPTAsaT0wO2k8ZTtpKyspcy5zZXQobixvLHRbaV0pLCsrbj49ciYmKG49MSsgKytvKTtyZXR1cm4gc319c3IucHJvdG90eXBlLmtsYXNzU3ViVHlwZT0iRGlzdGFuY2VNYXRyaXgiO2NsYXNzIG5yIGV4dGVuZHMgWmV7Y29uc3RydWN0b3IodCxlLHIpe3N1cGVyKCksdGhpcy5tYXRyaXg9dCx0aGlzLnJvd3M9ZSx0aGlzLmNvbHVtbnM9cn19Y2xhc3Mgb3IgZXh0ZW5kcyBucntjb25zdHJ1Y3Rvcih0LGUscil7S2UodCxlKSxRZSh0LHIpLHN1cGVyKHQsZS5sZW5ndGgsci5sZW5ndGgpLHRoaXMucm93SW5kaWNlcz1lLHRoaXMuY29sdW1uSW5kaWNlcz1yfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldCh0aGlzLnJvd0luZGljZXNbdF0sdGhpcy5jb2x1bW5JbmRpY2VzW2VdLHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0aGlzLnJvd0luZGljZXNbdF0sdGhpcy5jb2x1bW5JbmRpY2VzW2VdKX19Y2xhc3MgaXIgZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcih0LGU9e30pe2NvbnN0e3Jvd3M6cj0xfT1lO2lmKHQubGVuZ3RoJXIhPTApdGhyb3cgbmV3IEVycm9yKCJ0aGUgZGF0YSBsZW5ndGggaXMgbm90IGRpdmlzaWJsZSBieSB0aGUgbnVtYmVyIG9mIHJvd3MiKTtzdXBlcigpLHRoaXMucm93cz1yLHRoaXMuY29sdW1ucz10Lmxlbmd0aC9yLHRoaXMuZGF0YT10fXNldCh0LGUscil7bGV0IHM9dGhpcy5fY2FsY3VsYXRlSW5kZXgodCxlKTtyZXR1cm4gdGhpcy5kYXRhW3NdPXIsdGhpc31nZXQodCxlKXtsZXQgcj10aGlzLl9jYWxjdWxhdGVJbmRleCh0LGUpO3JldHVybiB0aGlzLmRhdGFbcl19X2NhbGN1bGF0ZUluZGV4KHQsZSl7cmV0dXJuIHQqdGhpcy5jb2x1bW5zK2V9fWNsYXNzIHVyIGV4dGVuZHMgWmV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmRhdGE9dCx0aGlzLnJvd3M9dC5sZW5ndGgsdGhpcy5jb2x1bW5zPXRbMF0ubGVuZ3RofXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX19Y2xhc3MgYXJ7Y29uc3RydWN0b3IodCl7bGV0IGUscixzLG4sbyxpLHUsYSxsLGg9KHQ9dXIuY2hlY2tNYXRyaXgodCkpLmNsb25lKCksYz1oLnJvd3MsZj1oLmNvbHVtbnMsbT1uZXcgRmxvYXQ2NEFycmF5KGMpLGc9MTtmb3IoZT0wO2U8YztlKyspbVtlXT1lO2ZvcihhPW5ldyBGbG9hdDY0QXJyYXkoYykscj0wO3I8ZjtyKyspe2ZvcihlPTA7ZTxjO2UrKylhW2VdPWguZ2V0KGUscik7Zm9yKGU9MDtlPGM7ZSsrKXtmb3IobD1NYXRoLm1pbihlLHIpLG89MCxzPTA7czxsO3MrKylvKz1oLmdldChlLHMpKmFbc107YVtlXS09byxoLnNldChlLHIsYVtlXSl9Zm9yKG49cixlPXIrMTtlPGM7ZSsrKU1hdGguYWJzKGFbZV0pPk1hdGguYWJzKGFbbl0pJiYobj1lKTtpZihuIT09cil7Zm9yKHM9MDtzPGY7cysrKWk9aC5nZXQobixzKSxoLnNldChuLHMsaC5nZXQocixzKSksaC5zZXQocixzLGkpO3U9bVtuXSxtW25dPW1bcl0sbVtyXT11LGc9LWd9aWYocjxjJiYwIT09aC5nZXQocixyKSlmb3IoZT1yKzE7ZTxjO2UrKyloLnNldChlLHIsaC5nZXQoZSxyKS9oLmdldChyLHIpKX10aGlzLkxVPWgsdGhpcy5waXZvdFZlY3Rvcj1tLHRoaXMucGl2b3RTaWduPWd9aXNTaW5ndWxhcigpe2xldCB0PXRoaXMuTFUsZT10LmNvbHVtbnM7Zm9yKGxldCByPTA7cjxlO3IrKylpZigwPT09dC5nZXQocixyKSlyZXR1cm4hMDtyZXR1cm4hMX1zb2x2ZSh0KXt0PWVyLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuTFU7aWYoZS5yb3dzIT09dC5yb3dzKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtYXRyaXggZGltZW5zaW9ucyIpO2lmKHRoaXMuaXNTaW5ndWxhcigpKXRocm93IG5ldyBFcnJvcigiTFUgbWF0cml4IGlzIHNpbmd1bGFyIik7bGV0IHIscyxuLG89dC5jb2x1bW5zLGk9dC5zdWJNYXRyaXhSb3codGhpcy5waXZvdFZlY3RvciwwLG8tMSksdT1lLmNvbHVtbnM7Zm9yKG49MDtuPHU7bisrKWZvcihyPW4rMTtyPHU7cisrKWZvcihzPTA7czxvO3MrKylpLnNldChyLHMsaS5nZXQocixzKS1pLmdldChuLHMpKmUuZ2V0KHIsbikpO2ZvcihuPXUtMTtuPj0wO24tLSl7Zm9yKHM9MDtzPG87cysrKWkuc2V0KG4scyxpLmdldChuLHMpL2UuZ2V0KG4sbikpO2ZvcihyPTA7cjxuO3IrKylmb3Iocz0wO3M8bztzKyspaS5zZXQocixzLGkuZ2V0KHIscyktaS5nZXQobixzKSplLmdldChyLG4pKX1yZXR1cm4gaX1nZXQgZGV0ZXJtaW5hbnQoKXtsZXQgdD10aGlzLkxVO2lmKCF0LmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBzcXVhcmUiKTtsZXQgZT10aGlzLnBpdm90U2lnbixyPXQuY29sdW1ucztmb3IobGV0IHM9MDtzPHI7cysrKWUqPXQuZ2V0KHMscyk7cmV0dXJuIGV9Z2V0IGxvd2VyVHJpYW5ndWxhck1hdHJpeCgpe2xldCB0PXRoaXMuTFUsZT10LnJvd3Mscj10LmNvbHVtbnMscz1uZXcgZXIoZSxyKTtmb3IobGV0IG49MDtuPGU7bisrKWZvcihsZXQgZT0wO2U8cjtlKyspbj5lP3Muc2V0KG4sZSx0LmdldChuLGUpKTpuPT09ZT9zLnNldChuLGUsMSk6cy5zZXQobixlLDApO3JldHVybiBzfWdldCB1cHBlclRyaWFuZ3VsYXJNYXRyaXgoKXtsZXQgdD10aGlzLkxVLGU9dC5yb3dzLHI9dC5jb2x1bW5zLHM9bmV3IGVyKGUscik7Zm9yKGxldCBuPTA7bjxlO24rKylmb3IobGV0IGU9MDtlPHI7ZSsrKW48PWU/cy5zZXQobixlLHQuZ2V0KG4sZSkpOnMuc2V0KG4sZSwwKTtyZXR1cm4gc31nZXQgcGl2b3RQZXJtdXRhdGlvblZlY3Rvcigpe3JldHVybiBBcnJheS5mcm9tKHRoaXMucGl2b3RWZWN0b3IpfX1mdW5jdGlvbiBscih0LGUpe2xldCByPTA7cmV0dXJuIE1hdGguYWJzKHQpPk1hdGguYWJzKGUpPyhyPWUvdCxNYXRoLmFicyh0KSpNYXRoLnNxcnQoMStyKnIpKTowIT09ZT8ocj10L2UsTWF0aC5hYnMoZSkqTWF0aC5zcXJ0KDErcipyKSk6MH1jbGFzcyBocntjb25zdHJ1Y3Rvcih0KXtsZXQgZSxyLHMsbixvPSh0PXVyLmNoZWNrTWF0cml4KHQpKS5jbG9uZSgpLGk9dC5yb3dzLHU9dC5jb2x1bW5zLGE9bmV3IEZsb2F0NjRBcnJheSh1KTtmb3Iocz0wO3M8dTtzKyspe2xldCB0PTA7Zm9yKGU9cztlPGk7ZSsrKXQ9bHIodCxvLmdldChlLHMpKTtpZigwIT09dCl7Zm9yKG8uZ2V0KHMscyk8MCYmKHQ9LXQpLGU9cztlPGk7ZSsrKW8uc2V0KGUscyxvLmdldChlLHMpL3QpO2ZvcihvLnNldChzLHMsby5nZXQocyxzKSsxKSxyPXMrMTtyPHU7cisrKXtmb3Iobj0wLGU9cztlPGk7ZSsrKW4rPW8uZ2V0KGUscykqby5nZXQoZSxyKTtmb3Iobj0tbi9vLmdldChzLHMpLGU9cztlPGk7ZSsrKW8uc2V0KGUscixvLmdldChlLHIpK24qby5nZXQoZSxzKSl9fWFbc109LXR9dGhpcy5RUj1vLHRoaXMuUmRpYWc9YX1zb2x2ZSh0KXt0PWVyLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuUVIscj1lLnJvd3M7aWYodC5yb3dzIT09cil0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCByb3cgZGltZW5zaW9ucyBtdXN0IGFncmVlIik7aWYoIXRoaXMuaXNGdWxsUmFuaygpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGlzIHJhbmsgZGVmaWNpZW50Iik7bGV0IHMsbixvLGksdT10LmNvbHVtbnMsYT10LmNsb25lKCksbD1lLmNvbHVtbnM7Zm9yKG89MDtvPGw7bysrKWZvcihuPTA7bjx1O24rKyl7Zm9yKGk9MCxzPW87czxyO3MrKylpKz1lLmdldChzLG8pKmEuZ2V0KHMsbik7Zm9yKGk9LWkvZS5nZXQobyxvKSxzPW87czxyO3MrKylhLnNldChzLG4sYS5nZXQocyxuKStpKmUuZ2V0KHMsbykpfWZvcihvPWwtMTtvPj0wO28tLSl7Zm9yKG49MDtuPHU7bisrKWEuc2V0KG8sbixhLmdldChvLG4pL3RoaXMuUmRpYWdbb10pO2ZvcihzPTA7czxvO3MrKylmb3Iobj0wO248dTtuKyspYS5zZXQocyxuLGEuZ2V0KHMsbiktYS5nZXQobyxuKSplLmdldChzLG8pKX1yZXR1cm4gYS5zdWJNYXRyaXgoMCxsLTEsMCx1LTEpfWlzRnVsbFJhbmsoKXtsZXQgdD10aGlzLlFSLmNvbHVtbnM7Zm9yKGxldCBlPTA7ZTx0O2UrKylpZigwPT09dGhpcy5SZGlhZ1tlXSlyZXR1cm4hMTtyZXR1cm4hMH1nZXQgdXBwZXJUcmlhbmd1bGFyTWF0cml4KCl7bGV0IHQsZSxyPXRoaXMuUVIscz1yLmNvbHVtbnMsbj1uZXcgZXIocyxzKTtmb3IodD0wO3Q8czt0KyspZm9yKGU9MDtlPHM7ZSsrKXQ8ZT9uLnNldCh0LGUsci5nZXQodCxlKSk6dD09PWU/bi5zZXQodCxlLHRoaXMuUmRpYWdbdF0pOm4uc2V0KHQsZSwwKTtyZXR1cm4gbn1nZXQgb3J0aG9nb25hbE1hdHJpeCgpe2xldCB0LGUscixzLG49dGhpcy5RUixvPW4ucm93cyxpPW4uY29sdW1ucyx1PW5ldyBlcihvLGkpO2ZvcihyPWktMTtyPj0wO3ItLSl7Zm9yKHQ9MDt0PG87dCsrKXUuc2V0KHQsciwwKTtmb3IodS5zZXQocixyLDEpLGU9cjtlPGk7ZSsrKWlmKDAhPT1uLmdldChyLHIpKXtmb3Iocz0wLHQ9cjt0PG87dCsrKXMrPW4uZ2V0KHQscikqdS5nZXQodCxlKTtmb3Iocz0tcy9uLmdldChyLHIpLHQ9cjt0PG87dCsrKXUuc2V0KHQsZSx1LmdldCh0LGUpK3Mqbi5nZXQodCxyKSl9fXJldHVybiB1fX1jbGFzcyBjcntjb25zdHJ1Y3Rvcih0LGU9e30pe2lmKCh0PXVyLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgcj10LnJvd3Mscz10LmNvbHVtbnM7Y29uc3R7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6bj0hMCxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6bz0hMCxhdXRvVHJhbnNwb3NlOmk9ITF9PWU7bGV0IHUsYT1Cb29sZWFuKG4pLGw9Qm9vbGVhbihvKSxoPSExO2lmKHI8cylpZihpKXt1PXQudHJhbnNwb3NlKCkscj11LnJvd3Mscz11LmNvbHVtbnMsaD0hMDtsZXQgZT1hO2E9bCxsPWV9ZWxzZSB1PXQuY2xvbmUoKSxjb25zb2xlLndhcm4oIkNvbXB1dGluZyBTVkQgb24gYSBtYXRyaXggd2l0aCBtb3JlIGNvbHVtbnMgdGhhbiByb3dzLiBDb25zaWRlciBlbmFibGluZyBhdXRvVHJhbnNwb3NlIik7ZWxzZSB1PXQuY2xvbmUoKTtsZXQgYz1NYXRoLm1pbihyLHMpLGY9TWF0aC5taW4ocisxLHMpLG09bmV3IEZsb2F0NjRBcnJheShmKSxnPW5ldyBlcihyLGMpLHc9bmV3IGVyKHMscykscD1uZXcgRmxvYXQ2NEFycmF5KHMpLGQ9bmV3IEZsb2F0NjRBcnJheShyKSx5PW5ldyBGbG9hdDY0QXJyYXkoZik7Zm9yKGxldCB0PTA7dDxmO3QrKyl5W3RdPXQ7bGV0IGI9TWF0aC5taW4oci0xLHMpLE09TWF0aC5tYXgoMCxNYXRoLm1pbihzLTIscikpLHY9TWF0aC5tYXgoYixNKTtmb3IobGV0IHQ9MDt0PHY7dCsrKXtpZih0PGIpe21bdF09MDtmb3IobGV0IGU9dDtlPHI7ZSsrKW1bdF09bHIobVt0XSx1LmdldChlLHQpKTtpZigwIT09bVt0XSl7dS5nZXQodCx0KTwwJiYobVt0XT0tbVt0XSk7Zm9yKGxldCBlPXQ7ZTxyO2UrKyl1LnNldChlLHQsdS5nZXQoZSx0KS9tW3RdKTt1LnNldCh0LHQsdS5nZXQodCx0KSsxKX1tW3RdPS1tW3RdfWZvcihsZXQgZT10KzE7ZTxzO2UrKyl7aWYodDxiJiYwIT09bVt0XSl7bGV0IHM9MDtmb3IobGV0IG49dDtuPHI7bisrKXMrPXUuZ2V0KG4sdCkqdS5nZXQobixlKTtzPS1zL3UuZ2V0KHQsdCk7Zm9yKGxldCBuPXQ7bjxyO24rKyl1LnNldChuLGUsdS5nZXQobixlKStzKnUuZ2V0KG4sdCkpfXBbZV09dS5nZXQodCxlKX1pZihhJiZ0PGIpZm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsdS5nZXQoZSx0KSk7aWYodDxNKXtwW3RdPTA7Zm9yKGxldCBlPXQrMTtlPHM7ZSsrKXBbdF09bHIocFt0XSxwW2VdKTtpZigwIT09cFt0XSl7cFt0KzFdPDAmJihwW3RdPTAtcFt0XSk7Zm9yKGxldCBlPXQrMTtlPHM7ZSsrKXBbZV0vPXBbdF07cFt0KzFdKz0xfWlmKHBbdF09LXBbdF0sdCsxPHImJjAhPT1wW3RdKXtmb3IobGV0IGU9dCsxO2U8cjtlKyspZFtlXT0wO2ZvcihsZXQgZT10KzE7ZTxyO2UrKylmb3IobGV0IHI9dCsxO3I8cztyKyspZFtlXSs9cFtyXSp1LmdldChlLHIpO2ZvcihsZXQgZT10KzE7ZTxzO2UrKyl7bGV0IHM9LXBbZV0vcFt0KzFdO2ZvcihsZXQgbj10KzE7bjxyO24rKyl1LnNldChuLGUsdS5nZXQobixlKStzKmRbbl0pfX1pZihsKWZvcihsZXQgZT10KzE7ZTxzO2UrKyl3LnNldChlLHQscFtlXSl9fWxldCB4PU1hdGgubWluKHMscisxKTtpZihiPHMmJihtW2JdPXUuZ2V0KGIsYikpLHI8eCYmKG1beC0xXT0wKSxNKzE8eCYmKHBbTV09dS5nZXQoTSx4LTEpKSxwW3gtMV09MCxhKXtmb3IobGV0IHQ9Yjt0PGM7dCsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9Zm9yKGxldCB0PWItMTt0Pj0wO3QtLSlpZigwIT09bVt0XSl7Zm9yKGxldCBlPXQrMTtlPGM7ZSsrKXtsZXQgcz0wO2ZvcihsZXQgbj10O248cjtuKyspcys9Zy5nZXQobix0KSpnLmdldChuLGUpO3M9LXMvZy5nZXQodCx0KTtmb3IobGV0IG49dDtuPHI7bisrKWcuc2V0KG4sZSxnLmdldChuLGUpK3MqZy5nZXQobix0KSl9Zm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsLWcuZ2V0KGUsdCkpO2cuc2V0KHQsdCwxK2cuZ2V0KHQsdCkpO2ZvcihsZXQgZT0wO2U8dC0xO2UrKylnLnNldChlLHQsMCl9ZWxzZXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9fWlmKGwpZm9yKGxldCB0PXMtMTt0Pj0wO3QtLSl7aWYodDxNJiYwIT09cFt0XSlmb3IobGV0IGU9dCsxO2U8cztlKyspe2xldCByPTA7Zm9yKGxldCBuPXQrMTtuPHM7bisrKXIrPXcuZ2V0KG4sdCkqdy5nZXQobixlKTtyPS1yL3cuZ2V0KHQrMSx0KTtmb3IobGV0IG49dCsxO248cztuKyspdy5zZXQobixlLHcuZ2V0KG4sZSkrcip3LmdldChuLHQpKX1mb3IobGV0IGU9MDtlPHM7ZSsrKXcuc2V0KGUsdCwwKTt3LnNldCh0LHQsMSl9bGV0IEU9eC0xLFM9TnVtYmVyLkVQU0lMT047Zm9yKDt4PjA7KXtsZXQgdCxlO2Zvcih0PXgtMjt0Pj0tMSYmLTEhPT10O3QtLSl7Y29uc3QgZT1OdW1iZXIuTUlOX1ZBTFVFK1MqTWF0aC5hYnMobVt0XStNYXRoLmFicyhtW3QrMV0pKTtpZihNYXRoLmFicyhwW3RdKTw9ZXx8TnVtYmVyLmlzTmFOKHBbdF0pKXtwW3RdPTA7YnJlYWt9fWlmKHQ9PT14LTIpZT00O2Vsc2V7bGV0IHI7Zm9yKHI9eC0xO3I+PXQmJnIhPT10O3ItLSl7bGV0IGU9KHIhPT14P01hdGguYWJzKHBbcl0pOjApKyhyIT09dCsxP01hdGguYWJzKHBbci0xXSk6MCk7aWYoTWF0aC5hYnMobVtyXSk8PVMqZSl7bVtyXT0wO2JyZWFrfX1yPT09dD9lPTM6cj09PXgtMT9lPTE6KGU9Mix0PXIpfXN3aXRjaCh0KyssZSl7Y2FzZSAxOntsZXQgZT1wW3gtMl07cFt4LTJdPTA7Zm9yKGxldCByPXgtMjtyPj10O3ItLSl7bGV0IG49bHIobVtyXSxlKSxvPW1bcl0vbixpPWUvbjtpZihtW3JdPW4sciE9PXQmJihlPS1pKnBbci0xXSxwW3ItMV09bypwW3ItMV0pLGwpZm9yKGxldCB0PTA7dDxzO3QrKyluPW8qdy5nZXQodCxyKStpKncuZ2V0KHQseC0xKSx3LnNldCh0LHgtMSwtaSp3LmdldCh0LHIpK28qdy5nZXQodCx4LTEpKSx3LnNldCh0LHIsbil9YnJlYWt9Y2FzZSAyOntsZXQgZT1wW3QtMV07cFt0LTFdPTA7Zm9yKGxldCBzPXQ7czx4O3MrKyl7bGV0IG49bHIobVtzXSxlKSxvPW1bc10vbixpPWUvbjtpZihtW3NdPW4sZT0taSpwW3NdLHBbc109bypwW3NdLGEpZm9yKGxldCBlPTA7ZTxyO2UrKyluPW8qZy5nZXQoZSxzKStpKmcuZ2V0KGUsdC0xKSxnLnNldChlLHQtMSwtaSpnLmdldChlLHMpK28qZy5nZXQoZSx0LTEpKSxnLnNldChlLHMsbil9YnJlYWt9Y2FzZSAzOntjb25zdCBlPU1hdGgubWF4KE1hdGguYWJzKG1beC0xXSksTWF0aC5hYnMobVt4LTJdKSxNYXRoLmFicyhwW3gtMl0pLE1hdGguYWJzKG1bdF0pLE1hdGguYWJzKHBbdF0pKSxuPW1beC0xXS9lLG89bVt4LTJdL2UsaT1wW3gtMl0vZSx1PW1bdF0vZSxoPXBbdF0vZSxjPSgobytuKSooby1uKStpKmkpLzIsZj1uKmkqKG4qaSk7bGV0IGQ9MDswPT09YyYmMD09PWZ8fChkPWM8MD8wLU1hdGguc3FydChjKmMrZik6TWF0aC5zcXJ0KGMqYytmKSxkPWYvKGMrZCkpO2xldCB5PSh1K24pKih1LW4pK2QsYj11Kmg7Zm9yKGxldCBlPXQ7ZTx4LTE7ZSsrKXtsZXQgbj1scih5LGIpOzA9PT1uJiYobj1OdW1iZXIuTUlOX1ZBTFVFKTtsZXQgbz15L24saT1iL247aWYoZSE9PXQmJihwW2UtMV09bikseT1vKm1bZV0raSpwW2VdLHBbZV09bypwW2VdLWkqbVtlXSxiPWkqbVtlKzFdLG1bZSsxXT1vKm1bZSsxXSxsKWZvcihsZXQgdD0wO3Q8czt0Kyspbj1vKncuZ2V0KHQsZSkraSp3LmdldCh0LGUrMSksdy5zZXQodCxlKzEsLWkqdy5nZXQodCxlKStvKncuZ2V0KHQsZSsxKSksdy5zZXQodCxlLG4pO2lmKG49bHIoeSxiKSwwPT09biYmKG49TnVtYmVyLk1JTl9WQUxVRSksbz15L24saT1iL24sbVtlXT1uLHk9bypwW2VdK2kqbVtlKzFdLG1bZSsxXT0taSpwW2VdK28qbVtlKzFdLGI9aSpwW2UrMV0scFtlKzFdPW8qcFtlKzFdLGEmJmU8ci0xKWZvcihsZXQgdD0wO3Q8cjt0Kyspbj1vKmcuZ2V0KHQsZSkraSpnLmdldCh0LGUrMSksZy5zZXQodCxlKzEsLWkqZy5nZXQodCxlKStvKmcuZ2V0KHQsZSsxKSksZy5zZXQodCxlLG4pfXBbeC0yXT15O2JyZWFrfWNhc2UgNDppZihtW3RdPD0wJiYobVt0XT1tW3RdPDA/LW1bdF06MCxsKSlmb3IobGV0IGU9MDtlPD1FO2UrKyl3LnNldChlLHQsLXcuZ2V0KGUsdCkpO2Zvcig7dDxFJiYhKG1bdF0+PW1bdCsxXSk7KXtsZXQgZT1tW3RdO2lmKG1bdF09bVt0KzFdLG1bdCsxXT1lLGwmJnQ8cy0xKWZvcihsZXQgcj0wO3I8cztyKyspZT13LmdldChyLHQrMSksdy5zZXQocix0KzEsdy5nZXQocix0KSksdy5zZXQocix0LGUpO2lmKGEmJnQ8ci0xKWZvcihsZXQgcz0wO3M8cjtzKyspZT1nLmdldChzLHQrMSksZy5zZXQocyx0KzEsZy5nZXQocyx0KSksZy5zZXQocyx0LGUpO3QrK314LS19fWlmKGgpe2xldCB0PXc7dz1nLGc9dH10aGlzLm09cix0aGlzLm49cyx0aGlzLnM9bSx0aGlzLlU9Zyx0aGlzLlY9d31zb2x2ZSh0KXtsZXQgZT10LHI9dGhpcy50aHJlc2hvbGQscz10aGlzLnMubGVuZ3RoLG49ZXIuemVyb3MocyxzKTtmb3IobGV0IHQ9MDt0PHM7dCsrKU1hdGguYWJzKHRoaXMuc1t0XSk8PXI/bi5zZXQodCx0LDApOm4uc2V0KHQsdCwxL3RoaXMuc1t0XSk7bGV0IG89dGhpcy5VLGk9dGhpcy5yaWdodFNpbmd1bGFyVmVjdG9ycyx1PWkubW11bChuKSxhPWkucm93cyxsPW8ucm93cyxoPWVyLnplcm9zKGEsbCk7Zm9yKGxldCB0PTA7dDxhO3QrKylmb3IobGV0IGU9MDtlPGw7ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248cztuKyspcis9dS5nZXQodCxuKSpvLmdldChlLG4pO2guc2V0KHQsZSxyKX1yZXR1cm4gaC5tbXVsKGUpfXNvbHZlRm9yRGlhZ29uYWwodCl7cmV0dXJuIHRoaXMuc29sdmUoZXIuZGlhZyh0KSl9aW52ZXJzZSgpe2xldCB0PXRoaXMuVixlPXRoaXMudGhyZXNob2xkLHI9dC5yb3dzLHM9dC5jb2x1bW5zLG49bmV3IGVyKHIsdGhpcy5zLmxlbmd0aCk7Zm9yKGxldCBvPTA7bzxyO28rKylmb3IobGV0IHI9MDtyPHM7cisrKU1hdGguYWJzKHRoaXMuc1tyXSk+ZSYmbi5zZXQobyxyLHQuZ2V0KG8scikvdGhpcy5zW3JdKTtsZXQgbz10aGlzLlUsaT1vLnJvd3MsdT1vLmNvbHVtbnMsYT1uZXcgZXIocixpKTtmb3IobGV0IHQ9MDt0PHI7dCsrKWZvcihsZXQgZT0wO2U8aTtlKyspe2xldCByPTA7Zm9yKGxldCBzPTA7czx1O3MrKylyKz1uLmdldCh0LHMpKm8uZ2V0KGUscyk7YS5zZXQodCxlLHIpfXJldHVybiBhfWdldCBjb25kaXRpb24oKXtyZXR1cm4gdGhpcy5zWzBdL3RoaXMuc1tNYXRoLm1pbih0aGlzLm0sdGhpcy5uKS0xXX1nZXQgbm9ybTIoKXtyZXR1cm4gdGhpcy5zWzBdfWdldCByYW5rKCl7bGV0IHQ9TWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdKk51bWJlci5FUFNJTE9OLGU9MCxyPXRoaXMucztmb3IobGV0IHM9MCxuPXIubGVuZ3RoO3M8bjtzKyspcltzXT50JiZlKys7cmV0dXJuIGV9Z2V0IGRpYWdvbmFsKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5zKX1nZXQgdGhyZXNob2xkKCl7cmV0dXJuIE51bWJlci5FUFNJTE9OLzIqTWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdfWdldCBsZWZ0U2luZ3VsYXJWZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXQgcmlnaHRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe3JldHVybiBlci5kaWFnKHRoaXMucyl9fWZ1bmN0aW9uIGZyKHQsZSxyPSExKXtyZXR1cm4gdD11ci5jaGVja01hdHJpeCh0KSxlPXVyLmNoZWNrTWF0cml4KGUpLHI/bmV3IGNyKHQpLnNvbHZlKGUpOnQuaXNTcXVhcmUoKT9uZXcgYXIodCkuc29sdmUoZSk6bmV3IGhyKHQpLnNvbHZlKGUpfWZ1bmN0aW9uIG1yKHQsZSl7bGV0IHI9W107Zm9yKGxldCBzPTA7czx0O3MrKylzIT09ZSYmci5wdXNoKHMpO3JldHVybiByfWZ1bmN0aW9uIGdyKHQsZSxyLHM9MWUtOSxuPTFlLTkpe2lmKHQ+bilyZXR1cm4gbmV3IEFycmF5KGUucm93cysxKS5maWxsKDApO3tsZXQgdD1lLmFkZFJvdyhyLFswXSk7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKU1hdGguYWJzKHQuZ2V0KGUsMCkpPHMmJnQuc2V0KGUsMCwwKTtyZXR1cm4gdC50bzFEQXJyYXkoKX19Y2xhc3Mgd3J7Y29uc3RydWN0b3IodCxlPXt9KXtjb25zdHthc3N1bWVTeW1tZXRyaWM6cj0hMX09ZTtpZighKHQ9dXIuY2hlY2tNYXRyaXgodCkpLmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggaXMgbm90IGEgc3F1YXJlIG1hdHJpeCIpO2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IG11c3QgYmUgbm9uLWVtcHR5Iik7bGV0IHMsbixvPXQuY29sdW1ucyxpPW5ldyBlcihvLG8pLHU9bmV3IEZsb2F0NjRBcnJheShvKSxhPW5ldyBGbG9hdDY0QXJyYXkobyksbD10LGg9ITE7aWYoaD0hIXJ8fHQuaXNTeW1tZXRyaWMoKSxoKXtmb3Iocz0wO3M8bztzKyspZm9yKG49MDtuPG87bisrKWkuc2V0KHMsbixsLmdldChzLG4pKTshZnVuY3Rpb24odCxlLHIscyl7bGV0IG4sbyxpLHUsYSxsLGgsYztmb3IoYT0wO2E8dDthKyspclthXT1zLmdldCh0LTEsYSk7Zm9yKHU9dC0xO3U+MDt1LS0pe2ZvcihjPTAsaT0wLGw9MDtsPHU7bCsrKWMrPU1hdGguYWJzKHJbbF0pO2lmKDA9PT1jKWZvcihlW3VdPXJbdS0xXSxhPTA7YTx1O2ErKylyW2FdPXMuZ2V0KHUtMSxhKSxzLnNldCh1LGEsMCkscy5zZXQoYSx1LDApO2Vsc2V7Zm9yKGw9MDtsPHU7bCsrKXJbbF0vPWMsaSs9cltsXSpyW2xdO2ZvcihuPXJbdS0xXSxvPU1hdGguc3FydChpKSxuPjAmJihvPS1vKSxlW3VdPWMqbyxpLT1uKm8sclt1LTFdPW4tbyxhPTA7YTx1O2ErKyllW2FdPTA7Zm9yKGE9MDthPHU7YSsrKXtmb3Iobj1yW2FdLHMuc2V0KGEsdSxuKSxvPWVbYV0rcy5nZXQoYSxhKSpuLGw9YSsxO2w8PXUtMTtsKyspbys9cy5nZXQobCxhKSpyW2xdLGVbbF0rPXMuZ2V0KGwsYSkqbjtlW2FdPW99Zm9yKG49MCxhPTA7YTx1O2ErKyllW2FdLz1pLG4rPWVbYV0qclthXTtmb3IoaD1uLyhpK2kpLGE9MDthPHU7YSsrKWVbYV0tPWgqclthXTtmb3IoYT0wO2E8dTthKyspe2ZvcihuPXJbYV0sbz1lW2FdLGw9YTtsPD11LTE7bCsrKXMuc2V0KGwsYSxzLmdldChsLGEpLShuKmVbbF0rbypyW2xdKSk7clthXT1zLmdldCh1LTEsYSkscy5zZXQodSxhLDApfX1yW3VdPWl9Zm9yKHU9MDt1PHQtMTt1Kyspe2lmKHMuc2V0KHQtMSx1LHMuZ2V0KHUsdSkpLHMuc2V0KHUsdSwxKSxpPXJbdSsxXSwwIT09aSl7Zm9yKGw9MDtsPD11O2wrKylyW2xdPXMuZ2V0KGwsdSsxKS9pO2ZvcihhPTA7YTw9dTthKyspe2ZvcihvPTAsbD0wO2w8PXU7bCsrKW8rPXMuZ2V0KGwsdSsxKSpzLmdldChsLGEpO2ZvcihsPTA7bDw9dTtsKyspcy5zZXQobCxhLHMuZ2V0KGwsYSktbypyW2xdKX19Zm9yKGw9MDtsPD11O2wrKylzLnNldChsLHUrMSwwKX1mb3IoYT0wO2E8dDthKyspclthXT1zLmdldCh0LTEsYSkscy5zZXQodC0xLGEsMCk7cy5zZXQodC0xLHQtMSwxKSxlWzBdPTB9KG8sYSx1LGkpLGZ1bmN0aW9uKHQsZSxyLHMpe2xldCBuLG8saSx1LGEsbCxoLGMsZixtLGcsdyxwLGQseSxiO2ZvcihpPTE7aTx0O2krKyllW2ktMV09ZVtpXTtlW3QtMV09MDtsZXQgTT0wLHY9MCx4PU51bWJlci5FUFNJTE9OO2ZvcihsPTA7bDx0O2wrKyl7Zm9yKHY9TWF0aC5tYXgodixNYXRoLmFicyhyW2xdKStNYXRoLmFicyhlW2xdKSksaD1sO2g8dCYmIShNYXRoLmFicyhlW2hdKTw9eCp2KTspaCsrO2lmKGg+bClkb3tmb3Iobj1yW2xdLGM9KHJbbCsxXS1uKS8oMiplW2xdKSxmPWxyKGMsMSksYzwwJiYoZj0tZikscltsXT1lW2xdLyhjK2YpLHJbbCsxXT1lW2xdKihjK2YpLG09cltsKzFdLG89bi1yW2xdLGk9bCsyO2k8dDtpKyspcltpXS09bztmb3IoTSs9byxjPXJbaF0sZz0xLHc9ZyxwPWcsZD1lW2wrMV0seT0wLGI9MCxpPWgtMTtpPj1sO2ktLSlmb3IocD13LHc9ZyxiPXksbj1nKmVbaV0sbz1nKmMsZj1scihjLGVbaV0pLGVbaSsxXT15KmYseT1lW2ldL2YsZz1jL2YsYz1nKnJbaV0teSpuLHJbaSsxXT1vK3kqKGcqbit5KnJbaV0pLGE9MDthPHQ7YSsrKW89cy5nZXQoYSxpKzEpLHMuc2V0KGEsaSsxLHkqcy5nZXQoYSxpKStnKm8pLHMuc2V0KGEsaSxnKnMuZ2V0KGEsaSkteSpvKTtjPS15KmIqcCpkKmVbbF0vbSxlW2xdPXkqYyxyW2xdPWcqY313aGlsZShNYXRoLmFicyhlW2xdKT54KnYpO3JbbF09cltsXStNLGVbbF09MH1mb3IoaT0wO2k8dC0xO2krKyl7Zm9yKGE9aSxjPXJbaV0sdT1pKzE7dTx0O3UrKylyW3VdPGMmJihhPXUsYz1yW3VdKTtpZihhIT09aSlmb3IoclthXT1yW2ldLHJbaV09Yyx1PTA7dTx0O3UrKyljPXMuZ2V0KHUsaSkscy5zZXQodSxpLHMuZ2V0KHUsYSkpLHMuc2V0KHUsYSxjKX19KG8sYSx1LGkpfWVsc2V7bGV0IHQ9bmV3IGVyKG8sbyksZT1uZXcgRmxvYXQ2NEFycmF5KG8pO2ZvcihuPTA7bjxvO24rKylmb3Iocz0wO3M8bztzKyspdC5zZXQocyxuLGwuZ2V0KHMsbikpOyFmdW5jdGlvbih0LGUscixzKXtsZXQgbixvLGksdSxhLGwsaCxjPTAsZj10LTE7Zm9yKGw9YysxO2w8PWYtMTtsKyspe2ZvcihoPTAsdT1sO3U8PWY7dSsrKWgrPU1hdGguYWJzKGUuZ2V0KHUsbC0xKSk7aWYoMCE9PWgpe2ZvcihpPTAsdT1mO3U+PWw7dS0tKXJbdV09ZS5nZXQodSxsLTEpL2gsaSs9clt1XSpyW3VdO2ZvcihvPU1hdGguc3FydChpKSxyW2xdPjAmJihvPS1vKSxpLT1yW2xdKm8scltsXT1yW2xdLW8sYT1sO2E8dDthKyspe2ZvcihuPTAsdT1mO3U+PWw7dS0tKW4rPXJbdV0qZS5nZXQodSxhKTtmb3Iobi89aSx1PWw7dTw9Zjt1KyspZS5zZXQodSxhLGUuZ2V0KHUsYSktbipyW3VdKX1mb3IodT0wO3U8PWY7dSsrKXtmb3Iobj0wLGE9ZjthPj1sO2EtLSluKz1yW2FdKmUuZ2V0KHUsYSk7Zm9yKG4vPWksYT1sO2E8PWY7YSsrKWUuc2V0KHUsYSxlLmdldCh1LGEpLW4qclthXSl9cltsXT1oKnJbbF0sZS5zZXQobCxsLTEsaCpvKX19Zm9yKHU9MDt1PHQ7dSsrKWZvcihhPTA7YTx0O2ErKylzLnNldCh1LGEsdT09PWE/MTowKTtmb3IobD1mLTE7bD49YysxO2wtLSlpZigwIT09ZS5nZXQobCxsLTEpKXtmb3IodT1sKzE7dTw9Zjt1Kyspclt1XT1lLmdldCh1LGwtMSk7Zm9yKGE9bDthPD1mO2ErKyl7Zm9yKG89MCx1PWw7dTw9Zjt1Kyspbys9clt1XSpzLmdldCh1LGEpO2ZvcihvPW8vcltsXS9lLmdldChsLGwtMSksdT1sO3U8PWY7dSsrKXMuc2V0KHUsYSxzLmdldCh1LGEpK28qclt1XSl9fX0obyx0LGUsaSksZnVuY3Rpb24odCxlLHIscyxuKXtsZXQgbyxpLHUsYSxsLGgsYyxmLG0sZyx3LHAsZCx5LGIsTT10LTEsdj0wLHg9dC0xLEU9TnVtYmVyLkVQU0lMT04sUz0wLF89MCxqPTAsQT0wLFI9MCxJPTAsQz0wLE49MDtmb3Iobz0wO288dDtvKyspZm9yKChvPHZ8fG8+eCkmJihyW29dPW4uZ2V0KG8sbyksZVtvXT0wKSxpPU1hdGgubWF4KG8tMSwwKTtpPHQ7aSsrKV8rPU1hdGguYWJzKG4uZ2V0KG8saSkpO2Zvcig7TT49djspe2ZvcihhPU07YT52JiYoST1NYXRoLmFicyhuLmdldChhLTEsYS0xKSkrTWF0aC5hYnMobi5nZXQoYSxhKSksMD09PUkmJihJPV8pLCEoTWF0aC5hYnMobi5nZXQoYSxhLTEpKTxFKkkpKTspYS0tO2lmKGE9PT1NKW4uc2V0KE0sTSxuLmdldChNLE0pK1MpLHJbTV09bi5nZXQoTSxNKSxlW01dPTAsTS0tLE49MDtlbHNlIGlmKGE9PT1NLTEpe2lmKGM9bi5nZXQoTSxNLTEpKm4uZ2V0KE0tMSxNKSxqPShuLmdldChNLTEsTS0xKS1uLmdldChNLE0pKS8yLEE9aipqK2MsQz1NYXRoLnNxcnQoTWF0aC5hYnMoQSkpLG4uc2V0KE0sTSxuLmdldChNLE0pK1MpLG4uc2V0KE0tMSxNLTEsbi5nZXQoTS0xLE0tMSkrUyksZj1uLmdldChNLE0pLEE+PTApe2ZvcihDPWo+PTA/aitDOmotQyxyW00tMV09ZitDLHJbTV09cltNLTFdLDAhPT1DJiYocltNXT1mLWMvQyksZVtNLTFdPTAsZVtNXT0wLGY9bi5nZXQoTSxNLTEpLEk9TWF0aC5hYnMoZikrTWF0aC5hYnMoQyksaj1mL0ksQT1DL0ksUj1NYXRoLnNxcnQoaipqK0EqQSksai89UixBLz1SLGk9TS0xO2k8dDtpKyspQz1uLmdldChNLTEsaSksbi5zZXQoTS0xLGksQSpDK2oqbi5nZXQoTSxpKSksbi5zZXQoTSxpLEEqbi5nZXQoTSxpKS1qKkMpO2ZvcihvPTA7bzw9TTtvKyspQz1uLmdldChvLE0tMSksbi5zZXQobyxNLTEsQSpDK2oqbi5nZXQobyxNKSksbi5zZXQobyxNLEEqbi5nZXQobyxNKS1qKkMpO2ZvcihvPXY7bzw9eDtvKyspQz1zLmdldChvLE0tMSkscy5zZXQobyxNLTEsQSpDK2oqcy5nZXQobyxNKSkscy5zZXQobyxNLEEqcy5nZXQobyxNKS1qKkMpfWVsc2UgcltNLTFdPWYraixyW01dPWYraixlW00tMV09QyxlW01dPS1DO00tPTIsTj0wfWVsc2V7aWYoZj1uLmdldChNLE0pLG09MCxjPTAsYTxNJiYobT1uLmdldChNLTEsTS0xKSxjPW4uZ2V0KE0sTS0xKSpuLmdldChNLTEsTSkpLDEwPT09Til7Zm9yKFMrPWYsbz12O288PU07bysrKW4uc2V0KG8sbyxuLmdldChvLG8pLWYpO0k9TWF0aC5hYnMobi5nZXQoTSxNLTEpKStNYXRoLmFicyhuLmdldChNLTEsTS0yKSksZj1tPS43NSpJLGM9LS40Mzc1KkkqSX1pZigzMD09PU4mJihJPShtLWYpLzIsST1JKkkrYyxJPjApKXtmb3IoST1NYXRoLnNxcnQoSSksbTxmJiYoST0tSSksST1mLWMvKChtLWYpLzIrSSksbz12O288PU07bysrKW4uc2V0KG8sbyxuLmdldChvLG8pLUkpO1MrPUksZj1tPWM9Ljk2NH1mb3IoTis9MSxsPU0tMjtsPj1hJiYoQz1uLmdldChsLGwpLFI9Zi1DLEk9bS1DLGo9KFIqSS1jKS9uLmdldChsKzEsbCkrbi5nZXQobCxsKzEpLEE9bi5nZXQobCsxLGwrMSktQy1SLUksUj1uLmdldChsKzIsbCsxKSxJPU1hdGguYWJzKGopK01hdGguYWJzKEEpK01hdGguYWJzKFIpLGovPUksQS89SSxSLz1JLGwhPT1hKSYmIShNYXRoLmFicyhuLmdldChsLGwtMSkpKihNYXRoLmFicyhBKStNYXRoLmFicyhSKSk8RSooTWF0aC5hYnMoaikqKE1hdGguYWJzKG4uZ2V0KGwtMSxsLTEpKStNYXRoLmFicyhDKStNYXRoLmFicyhuLmdldChsKzEsbCsxKSkpKSk7KWwtLTtmb3Iobz1sKzI7bzw9TTtvKyspbi5zZXQobyxvLTIsMCksbz5sKzImJm4uc2V0KG8sby0zLDApO2Zvcih1PWw7dTw9TS0xJiYoeT11IT09TS0xLHUhPT1sJiYoaj1uLmdldCh1LHUtMSksQT1uLmdldCh1KzEsdS0xKSxSPXk/bi5nZXQodSsyLHUtMSk6MCxmPU1hdGguYWJzKGopK01hdGguYWJzKEEpK01hdGguYWJzKFIpLDAhPT1mJiYoai89ZixBLz1mLFIvPWYpKSwwIT09Zik7dSsrKWlmKEk9TWF0aC5zcXJ0KGoqaitBKkErUipSKSxqPDAmJihJPS1JKSwwIT09SSl7Zm9yKHUhPT1sP24uc2V0KHUsdS0xLC1JKmYpOmEhPT1sJiZuLnNldCh1LHUtMSwtbi5nZXQodSx1LTEpKSxqKz1JLGY9ai9JLG09QS9JLEM9Ui9JLEEvPWosUi89aixpPXU7aTx0O2krKylqPW4uZ2V0KHUsaSkrQSpuLmdldCh1KzEsaSkseSYmKGorPVIqbi5nZXQodSsyLGkpLG4uc2V0KHUrMixpLG4uZ2V0KHUrMixpKS1qKkMpKSxuLnNldCh1LGksbi5nZXQodSxpKS1qKmYpLG4uc2V0KHUrMSxpLG4uZ2V0KHUrMSxpKS1qKm0pO2ZvcihvPTA7bzw9TWF0aC5taW4oTSx1KzMpO28rKylqPWYqbi5nZXQobyx1KSttKm4uZ2V0KG8sdSsxKSx5JiYoais9QypuLmdldChvLHUrMiksbi5zZXQobyx1KzIsbi5nZXQobyx1KzIpLWoqUikpLG4uc2V0KG8sdSxuLmdldChvLHUpLWopLG4uc2V0KG8sdSsxLG4uZ2V0KG8sdSsxKS1qKkEpO2ZvcihvPXY7bzw9eDtvKyspaj1mKnMuZ2V0KG8sdSkrbSpzLmdldChvLHUrMSkseSYmKGorPUMqcy5nZXQobyx1KzIpLHMuc2V0KG8sdSsyLHMuZ2V0KG8sdSsyKS1qKlIpKSxzLnNldChvLHUscy5nZXQobyx1KS1qKSxzLnNldChvLHUrMSxzLmdldChvLHUrMSktaipBKX19fWlmKDA9PT1fKXJldHVybjtmb3IoTT10LTE7TT49MDtNLS0paWYoaj1yW01dLEE9ZVtNXSwwPT09QSlmb3IoYT1NLG4uc2V0KE0sTSwxKSxvPU0tMTtvPj0wO28tLSl7Zm9yKGM9bi5nZXQobyxvKS1qLFI9MCxpPWE7aTw9TTtpKyspUis9bi5nZXQobyxpKSpuLmdldChpLE0pO2lmKGVbb108MClDPWMsST1SO2Vsc2UgaWYoYT1vLDA9PT1lW29dP24uc2V0KG8sTSwwIT09Yz8tUi9jOi1SLyhFKl8pKTooZj1uLmdldChvLG8rMSksbT1uLmdldChvKzEsbyksQT0ocltvXS1qKSoocltvXS1qKStlW29dKmVbb10saD0oZipJLUMqUikvQSxuLnNldChvLE0saCksbi5zZXQobysxLE0sTWF0aC5hYnMoZik+TWF0aC5hYnMoQyk/KC1SLWMqaCkvZjooLUktbSpoKS9DKSksaD1NYXRoLmFicyhuLmdldChvLE0pKSxFKmgqaD4xKWZvcihpPW87aTw9TTtpKyspbi5zZXQoaSxNLG4uZ2V0KGksTSkvaCl9ZWxzZSBpZihBPDApZm9yKGE9TS0xLE1hdGguYWJzKG4uZ2V0KE0sTS0xKSk+TWF0aC5hYnMobi5nZXQoTS0xLE0pKT8obi5zZXQoTS0xLE0tMSxBL24uZ2V0KE0sTS0xKSksbi5zZXQoTS0xLE0sLShuLmdldChNLE0pLWopL24uZ2V0KE0sTS0xKSkpOihiPXByKDAsLW4uZ2V0KE0tMSxNKSxuLmdldChNLTEsTS0xKS1qLEEpLG4uc2V0KE0tMSxNLTEsYlswXSksbi5zZXQoTS0xLE0sYlsxXSkpLG4uc2V0KE0sTS0xLDApLG4uc2V0KE0sTSwxKSxvPU0tMjtvPj0wO28tLSl7Zm9yKGc9MCx3PTAsaT1hO2k8PU07aSsrKWcrPW4uZ2V0KG8saSkqbi5nZXQoaSxNLTEpLHcrPW4uZ2V0KG8saSkqbi5nZXQoaSxNKTtpZihjPW4uZ2V0KG8sbyktaixlW29dPDApQz1jLFI9ZyxJPXc7ZWxzZSBpZihhPW8sMD09PWVbb10/KGI9cHIoLWcsLXcsYyxBKSxuLnNldChvLE0tMSxiWzBdKSxuLnNldChvLE0sYlsxXSkpOihmPW4uZ2V0KG8sbysxKSxtPW4uZ2V0KG8rMSxvKSxwPShyW29dLWopKihyW29dLWopK2Vbb10qZVtvXS1BKkEsZD0yKihyW29dLWopKkEsMD09PXAmJjA9PT1kJiYocD1FKl8qKE1hdGguYWJzKGMpK01hdGguYWJzKEEpK01hdGguYWJzKGYpK01hdGguYWJzKG0pK01hdGguYWJzKEMpKSksYj1wcihmKlItQypnK0EqdyxmKkktQyp3LUEqZyxwLGQpLG4uc2V0KG8sTS0xLGJbMF0pLG4uc2V0KG8sTSxiWzFdKSxNYXRoLmFicyhmKT5NYXRoLmFicyhDKStNYXRoLmFicyhBKT8obi5zZXQobysxLE0tMSwoLWctYypuLmdldChvLE0tMSkrQSpuLmdldChvLE0pKS9mKSxuLnNldChvKzEsTSwoLXctYypuLmdldChvLE0pLUEqbi5nZXQobyxNLTEpKS9mKSk6KGI9cHIoLVItbSpuLmdldChvLE0tMSksLUktbSpuLmdldChvLE0pLEMsQSksbi5zZXQobysxLE0tMSxiWzBdKSxuLnNldChvKzEsTSxiWzFdKSkpLGg9TWF0aC5tYXgoTWF0aC5hYnMobi5nZXQobyxNLTEpKSxNYXRoLmFicyhuLmdldChvLE0pKSksRSpoKmg+MSlmb3IoaT1vO2k8PU07aSsrKW4uc2V0KGksTS0xLG4uZ2V0KGksTS0xKS9oKSxuLnNldChpLE0sbi5nZXQoaSxNKS9oKX1mb3Iobz0wO288dDtvKyspaWYobzx2fHxvPngpZm9yKGk9bztpPHQ7aSsrKXMuc2V0KG8saSxuLmdldChvLGkpKTtmb3IoaT10LTE7aT49djtpLS0pZm9yKG89djtvPD14O28rKyl7Zm9yKEM9MCx1PXY7dTw9TWF0aC5taW4oaSx4KTt1KyspQys9cy5nZXQobyx1KSpuLmdldCh1LGkpO3Muc2V0KG8saSxDKX19KG8sYSx1LGksdCl9dGhpcy5uPW8sdGhpcy5lPWEsdGhpcy5kPXUsdGhpcy5WPWl9Z2V0IHJlYWxFaWdlbnZhbHVlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZCl9Z2V0IGltYWdpbmFyeUVpZ2VudmFsdWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5lKX1nZXQgZWlnZW52ZWN0b3JNYXRyaXgoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe2xldCB0LGUscj10aGlzLm4scz10aGlzLmUsbj10aGlzLmQsbz1uZXcgZXIocixyKTtmb3IodD0wO3Q8cjt0Kyspe2ZvcihlPTA7ZTxyO2UrKylvLnNldCh0LGUsMCk7by5zZXQodCx0LG5bdF0pLHNbdF0+MD9vLnNldCh0LHQrMSxzW3RdKTpzW3RdPDAmJm8uc2V0KHQsdC0xLHNbdF0pfXJldHVybiBvfX1mdW5jdGlvbiBwcih0LGUscixzKXtsZXQgbixvO3JldHVybiBNYXRoLmFicyhyKT5NYXRoLmFicyhzKT8obj1zL3Isbz1yK24qcyxbKHQrbiplKS9vLChlLW4qdCkvb10pOihuPXIvcyxvPXMrbipyLFsobip0K2UpL28sKG4qZS10KS9vXSl9Y2xhc3MgZHJ7Y29uc3RydWN0b3IodCl7aWYoISh0PXVyLmNoZWNrTWF0cml4KHQpKS5pc1N5bW1ldHJpYygpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGlzIG5vdCBzeW1tZXRyaWMiKTtsZXQgZSxyLHMsbj10LG89bi5yb3dzLGk9bmV3IGVyKG8sbyksdT0hMDtmb3Iocj0wO3I8bztyKyspe2xldCB0PTA7Zm9yKHM9MDtzPHI7cysrKXtsZXQgbz0wO2ZvcihlPTA7ZTxzO2UrKylvKz1pLmdldChzLGUpKmkuZ2V0KHIsZSk7bz0obi5nZXQocixzKS1vKS9pLmdldChzLHMpLGkuc2V0KHIscyxvKSx0Kz1vKm99Zm9yKHQ9bi5nZXQocixyKS10LHUmJj10PjAsaS5zZXQocixyLE1hdGguc3FydChNYXRoLm1heCh0LDApKSkscz1yKzE7czxvO3MrKylpLnNldChyLHMsMCl9dGhpcy5MPWksdGhpcy5wb3NpdGl2ZURlZmluaXRlPXV9aXNQb3NpdGl2ZURlZmluaXRlKCl7cmV0dXJuIHRoaXMucG9zaXRpdmVEZWZpbml0ZX1zb2x2ZSh0KXt0PXVyLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuTCxyPWUucm93cztpZih0LnJvd3MhPT1yKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoIik7aWYoITE9PT10aGlzLmlzUG9zaXRpdmVEZWZpbml0ZSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGlzIG5vdCBwb3NpdGl2ZSBkZWZpbml0ZSIpO2xldCBzLG4sbyxpPXQuY29sdW1ucyx1PXQuY2xvbmUoKTtmb3Iobz0wO288cjtvKyspZm9yKG49MDtuPGk7bisrKXtmb3Iocz0wO3M8bztzKyspdS5zZXQobyxuLHUuZ2V0KG8sbiktdS5nZXQocyxuKSplLmdldChvLHMpKTt1LnNldChvLG4sdS5nZXQobyxuKS9lLmdldChvLG8pKX1mb3Iobz1yLTE7bz49MDtvLS0pZm9yKG49MDtuPGk7bisrKXtmb3Iocz1vKzE7czxyO3MrKyl1LnNldChvLG4sdS5nZXQobyxuKS11LmdldChzLG4pKmUuZ2V0KHMsbykpO3Uuc2V0KG8sbix1LmdldChvLG4pL2UuZ2V0KG8sbykpfXJldHVybiB1fWdldCBsb3dlclRyaWFuZ3VsYXJNYXRyaXgoKXtyZXR1cm4gdGhpcy5MfX1jbGFzcyB5cntjb25zdHJ1Y3Rvcih0LGU9e30pe3Q9dXIuY2hlY2tNYXRyaXgodCk7bGV0e1k6cn09ZTtjb25zdHtzY2FsZVNjb3JlczpzPSExLG1heEl0ZXJhdGlvbnM6bj0xZTMsdGVybWluYXRpb25Dcml0ZXJpYTpvPTFlLTEwfT1lO2xldCBpO2lmKHIpe2lmKHI9VmUocikmJiJudW1iZXIiPT10eXBlb2YgclswXT9lci5jb2x1bW5WZWN0b3Iocik6dXIuY2hlY2tNYXRyaXgociksci5yb3dzIT09dC5yb3dzKXRocm93IG5ldyBFcnJvcigiWSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyBYIik7aT1yLmdldENvbHVtblZlY3RvcigwKX1lbHNlIGk9dC5nZXRDb2x1bW5WZWN0b3IoMCk7bGV0IHUsYSxsLGgsYz0xO2ZvcihsZXQgZT0wO2U8biYmYz5vO2UrKylsPXQudHJhbnNwb3NlKCkubW11bChpKS5kaXYoaS50cmFuc3Bvc2UoKS5tbXVsKGkpLmdldCgwLDApKSxsPWwuZGl2KGwubm9ybSgpKSx1PXQubW11bChsKS5kaXYobC50cmFuc3Bvc2UoKS5tbXVsKGwpLmdldCgwLDApKSxlPjAmJihjPXUuY2xvbmUoKS5zdWIoaCkucG93KDIpLnN1bSgpKSxoPXUuY2xvbmUoKSxyPyhhPXIudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxhPWEuZGl2KGEubm9ybSgpKSxpPXIubW11bChhKS5kaXYoYS50cmFuc3Bvc2UoKS5tbXVsKGEpLmdldCgwLDApKSk6aT11O2lmKHIpe2xldCBlPXQudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKTtlPWUuZGl2KGUubm9ybSgpKTtsZXQgcz10LmNsb25lKCkuc3ViKHUuY2xvbmUoKS5tbXVsKGUudHJhbnNwb3NlKCkpKSxuPWkudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxvPXIuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm11bFMobi5nZXQoMCwwKSkubW11bChhLnRyYW5zcG9zZSgpKSk7dGhpcy50PXUsdGhpcy5wPWUudHJhbnNwb3NlKCksdGhpcy53PWwudHJhbnNwb3NlKCksdGhpcy5xPWEsdGhpcy51PWksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KSx0aGlzLnhSZXNpZHVhbD1zLHRoaXMueVJlc2lkdWFsPW8sdGhpcy5iZXRhcz1ufWVsc2UgdGhpcy53PWwudHJhbnNwb3NlKCksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KS5zcXJ0KCksdGhpcy50PXM/dS5jbG9uZSgpLmRpdih0aGlzLnMuZ2V0KDAsMCkpOnUsdGhpcy54UmVzaWR1YWw9dC5zdWIodS5tbXVsKGwudHJhbnNwb3NlKCkpKX19RmUuQWJzdHJhY3RNYXRyaXg9WmUsRmUuQ0hPPWRyLEZlLkNob2xlc2t5RGVjb21wb3NpdGlvbj1kcixGZS5EaXN0YW5jZU1hdHJpeD1zcjt2YXIgYnI9RmUuRVZEPXdyO0ZlLkVpZ2VudmFsdWVEZWNvbXBvc2l0aW9uPXdyLEZlLkxVPWFyLEZlLkx1RGVjb21wb3NpdGlvbj1hcjt2YXIgTXI9RmUuTWF0cml4PWVyO0ZlLk1hdHJpeENvbHVtblNlbGVjdGlvblZpZXc9Y2xhc3MgZXh0ZW5kcyBucntjb25zdHJ1Y3Rvcih0LGUpe1FlKHQsZSksc3VwZXIodCx0LnJvd3MsZS5sZW5ndGgpLHRoaXMuY29sdW1uSW5kaWNlcz1lfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldCh0LHRoaXMuY29sdW1uSW5kaWNlc1tlXSxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQodCx0aGlzLmNvbHVtbkluZGljZXNbZV0pfX0sRmUuTWF0cml4Q29sdW1uVmlldz1jbGFzcyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKHQsZSl7R2UodCxlKSxzdXBlcih0LHQucm93cywxKSx0aGlzLmNvbHVtbj1lfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldCh0LHRoaXMuY29sdW1uLHIpLHRoaXN9Z2V0KHQpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQodCx0aGlzLmNvbHVtbil9fSxGZS5NYXRyaXhGbGlwQ29sdW1uVmlldz1jbGFzcyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsdC5yb3dzLHQuY29sdW1ucyl9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHQsdGhpcy5jb2x1bW5zLWUtMSxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQodCx0aGlzLmNvbHVtbnMtZS0xKX19LEZlLk1hdHJpeEZsaXBSb3dWaWV3PWNsYXNzIGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCx0LnJvd3MsdC5jb2x1bW5zKX1zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodGhpcy5yb3dzLXQtMSxlLHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0aGlzLnJvd3MtdC0xLGUpfX0sRmUuTWF0cml4Um93U2VsZWN0aW9uVmlldz1jbGFzcyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKHQsZSl7S2UodCxlKSxzdXBlcih0LGUubGVuZ3RoLHQuY29sdW1ucyksdGhpcy5yb3dJbmRpY2VzPWV9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHRoaXMucm93SW5kaWNlc1t0XSxlLHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0aGlzLnJvd0luZGljZXNbdF0sZSl9fSxGZS5NYXRyaXhSb3dWaWV3PWNsYXNzIGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IodCxlKXtVZSh0LGUpLHN1cGVyKHQsMSx0LmNvbHVtbnMpLHRoaXMucm93PWV9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHRoaXMucm93LGUsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMucm93LGUpfX0sRmUuTWF0cml4U2VsZWN0aW9uVmlldz1vcixGZS5NYXRyaXhTdWJWaWV3PWNsYXNzIGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IodCxlLHIscyxuKXtYZSh0LGUscixzLG4pLHN1cGVyKHQsci1lKzEsbi1zKzEpLHRoaXMuc3RhcnRSb3c9ZSx0aGlzLnN0YXJ0Q29sdW1uPXN9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHRoaXMuc3RhcnRSb3crdCx0aGlzLnN0YXJ0Q29sdW1uK2UsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMuc3RhcnRSb3crdCx0aGlzLnN0YXJ0Q29sdW1uK2UpfX07dmFyIHZyPUZlLk1hdHJpeFRyYW5zcG9zZVZpZXc9Y2xhc3MgZXh0ZW5kcyBucntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHQuY29sdW1ucyx0LnJvd3MpfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldChlLHQsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KGUsdCl9fSx4cj1GZS5OSVBBTFM9eXI7RmUuTmlwYWxzPXlyLEZlLlFSPWhyLEZlLlFyRGVjb21wb3NpdGlvbj1ocjt2YXIgRXI9RmUuU1ZEPWNyO0ZlLlNpbmd1bGFyVmFsdWVEZWNvbXBvc2l0aW9uPWNyLEZlLlN5bW1ldHJpY01hdHJpeD1ycixGZS5XcmFwcGVyTWF0cml4MUQ9aXIsRmUuV3JhcHBlck1hdHJpeDJEPXVyLEZlLmNvcnJlbGF0aW9uPWZ1bmN0aW9uKHQsZT10LHI9e30pe3Q9bmV3IGVyKHQpO2xldCBzPSExO2lmKCJvYmplY3QiIT10eXBlb2YgZXx8ZXIuaXNNYXRyaXgoZSl8fFZlKGUpP2U9bmV3IGVyKGUpOihyPWUsZT10LHM9ITApLHQucm93cyE9PWUucm93cyl0aHJvdyBuZXcgVHlwZUVycm9yKCJCb3RoIG1hdHJpY2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyIpO2NvbnN0e2NlbnRlcjpuPSEwLHNjYWxlOm89ITB9PXI7biYmKHQuY2VudGVyKCJjb2x1bW4iKSxzfHxlLmNlbnRlcigiY29sdW1uIikpLG8mJih0LnNjYWxlKCJjb2x1bW4iKSxzfHxlLnNjYWxlKCJjb2x1bW4iKSk7Y29uc3QgaT10LnN0YW5kYXJkRGV2aWF0aW9uKCJjb2x1bW4iLHt1bmJpYXNlZDohMH0pLHU9cz9pOmUuc3RhbmRhcmREZXZpYXRpb24oImNvbHVtbiIse3VuYmlhc2VkOiEwfSksYT10LnRyYW5zcG9zZSgpLm1tdWwoZSk7Zm9yKGxldCBlPTA7ZTxhLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8YS5jb2x1bW5zO3IrKylhLnNldChlLHIsYS5nZXQoZSxyKSooMS8oaVtlXSp1W3JdKSkqKDEvKHQucm93cy0xKSkpO3JldHVybiBhfSxGZS5jb3ZhcmlhbmNlPWZ1bmN0aW9uKHQsZT10LHI9e30pe3Q9bmV3IGVyKHQpO2xldCBzPSExO2lmKCJvYmplY3QiIT10eXBlb2YgZXx8ZXIuaXNNYXRyaXgoZSl8fFZlKGUpP2U9bmV3IGVyKGUpOihyPWUsZT10LHM9ITApLHQucm93cyE9PWUucm93cyl0aHJvdyBuZXcgVHlwZUVycm9yKCJCb3RoIG1hdHJpY2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyIpO2NvbnN0e2NlbnRlcjpuPSEwfT1yO24mJih0PXQuY2VudGVyKCJjb2x1bW4iKSxzfHwoZT1lLmNlbnRlcigiY29sdW1uIikpKTtjb25zdCBvPXQudHJhbnNwb3NlKCkubW11bChlKTtmb3IobGV0IGU9MDtlPG8ucm93cztlKyspZm9yKGxldCByPTA7cjxvLmNvbHVtbnM7cisrKW8uc2V0KGUscixvLmdldChlLHIpKigxLyh0LnJvd3MtMSkpKTtyZXR1cm4gb307dmFyIFNyPUZlLmRlZmF1bHQ9ZXI7RmUuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24gdChlKXtpZigoZT1lci5jaGVja01hdHJpeChlKSkuaXNTcXVhcmUoKSl7aWYoMD09PWUuY29sdW1ucylyZXR1cm4gMTtsZXQgcixzLG4sbztpZigyPT09ZS5jb2x1bW5zKXJldHVybiByPWUuZ2V0KDAsMCkscz1lLmdldCgwLDEpLG49ZS5nZXQoMSwwKSxvPWUuZ2V0KDEsMSkscipvLXMqbjtpZigzPT09ZS5jb2x1bW5zKXtsZXQgbyxpLHU7cmV0dXJuIG89bmV3IG9yKGUsWzEsMl0sWzEsMl0pLGk9bmV3IG9yKGUsWzEsMl0sWzAsMl0pLHU9bmV3IG9yKGUsWzEsMl0sWzAsMV0pLHI9ZS5nZXQoMCwwKSxzPWUuZ2V0KDAsMSksbj1lLmdldCgwLDIpLHIqdChvKS1zKnQoaSkrbip0KHUpfXJldHVybiBuZXcgYXIoZSkuZGV0ZXJtaW5hbnR9dGhyb3cgRXJyb3IoImRldGVybWluYW50IGNhbiBvbmx5IGJlIGNhbGN1bGF0ZWQgZm9yIGEgc3F1YXJlIG1hdHJpeCIpfSxGZS5pbnZlcnNlPWZ1bmN0aW9uKHQsZT0hMSl7cmV0dXJuIHQ9dXIuY2hlY2tNYXRyaXgodCksZT9uZXcgY3IodCkuaW52ZXJzZSgpOmZyKHQsZXIuZXllKHQucm93cykpfSxGZS5saW5lYXJEZXBlbmRlbmNpZXM9ZnVuY3Rpb24odCxlPXt9KXtjb25zdHt0aHJlc2hvbGRWYWx1ZTpyPTFlLTksdGhyZXNob2xkRXJyb3I6cz0xZS05fT1lO2xldCBuPSh0PWVyLmNoZWNrTWF0cml4KHQpKS5yb3dzLG89bmV3IGVyKG4sbik7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7bGV0IGk9ZXIuY29sdW1uVmVjdG9yKHQuZ2V0Um93KGUpKSx1PXQuc3ViTWF0cml4Um93KG1yKG4sZSkpLnRyYW5zcG9zZSgpLGE9bmV3IGNyKHUpLnNvbHZlKGkpLGw9ZXIuc3ViKGksdS5tbXVsKGEpKS5hYnMoKS5tYXgoKTtvLnNldFJvdyhlLGdyKGwsYSxlLHIscykpfXJldHVybiBvfSxGZS5wc2V1ZG9JbnZlcnNlPWZ1bmN0aW9uKHQsZT1OdW1iZXIuRVBTSUxPTil7aWYoKHQ9ZXIuY2hlY2tNYXRyaXgodCkpLmlzRW1wdHkoKSlyZXR1cm4gdC50cmFuc3Bvc2UoKTtsZXQgcj1uZXcgY3IodCx7YXV0b1RyYW5zcG9zZTohMH0pLHM9ci5sZWZ0U2luZ3VsYXJWZWN0b3JzLG49ci5yaWdodFNpbmd1bGFyVmVjdG9ycyxvPXIuZGlhZ29uYWw7Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0KyspTWF0aC5hYnMob1t0XSk+ZT9vW3RdPTEvb1t0XTpvW3RdPTA7cmV0dXJuIG4ubW11bChlci5kaWFnKG8pLm1tdWwocy50cmFuc3Bvc2UoKSkpfSxGZS5zb2x2ZT1mcixGZS53cmFwPWZ1bmN0aW9uKHQsZSl7aWYoVmUodCkpcmV0dXJuIHRbMF0mJlZlKHRbMF0pP25ldyB1cih0KTpuZXcgaXIodCxlKTt0aHJvdyBuZXcgRXJyb3IoInRoZSBhcmd1bWVudCBpcyBub3QgYW4gYXJyYXkiKX07Y29uc3QgX3I9YnIsanI9TXIsQXI9dnIsUnI9eHIsSXI9RXI7U3IuTWF0cml4JiZTci5NYXRyaXg7bGV0IENyPWNsYXNzIHR7Y29uc3RydWN0b3IodCxlPXt9LHIpe2lmKHRoaXMuVT1udWxsLHRoaXMuUz1udWxsLHIpcmV0dXJuIHRoaXMuY2VudGVyPXIuY2VudGVyLHRoaXMuc2NhbGU9ci5zY2FsZSx0aGlzLm1lYW5zPXIubWVhbnMsdGhpcy5zdGRldnM9ci5zdGRldnMsdGhpcy5VPWpyLmNoZWNrTWF0cml4KHIuVSksdGhpcy5TPXIuUyx0aGlzLlI9ci5SLHZvaWQodGhpcy5leGNsdWRlZEZlYXR1cmVzPXIuZXhjbHVkZWRGZWF0dXJlc3x8W10pO2xldCBzO3M9KEFycmF5LmlzQXJyYXkodCksbmV3IGpyKHQpKTtjb25zdHtpc0NvdmFyaWFuY2VNYXRyaXg6bj0hMSxtZXRob2Q6bz0iU1ZEIixuQ29tcE5JUEFMUzppPTIsY2VudGVyOnU9ITAsc2NhbGU6YT0hMSxpZ25vcmVaZXJvVmFyaWFuY2U6bD0hMX09ZTtpZih0aGlzLmNlbnRlcj11LHRoaXMuc2NhbGU9YSx0aGlzLm1lYW5zPW51bGwsdGhpcy5zdGRldnM9bnVsbCx0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9W10sbil0aGlzLl9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgocyk7ZWxzZSBzd2l0Y2godGhpcy5fYWRqdXN0KHMsbCksbyl7Y2FzZSJjb3ZhcmlhbmNlTWF0cml4Ijp7Y29uc3QgdD1uZXcgQXIocykubW11bChzKS5kaXYocy5yb3dzLTEpO3RoaXMuX2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeCh0KTticmVha31jYXNlIk5JUEFMUyI6dGhpcy5fY29tcHV0ZVdpdGhOSVBBTFMocyxpKTticmVhaztjYXNlIlNWRCI6e2NvbnN0IHQ9bmV3IElyKHMse2NvbXB1dGVMZWZ0U2luZ3VsYXJWZWN0b3JzOiExLGNvbXB1dGVSaWdodFNpbmd1bGFyVmVjdG9yczohMCxhdXRvVHJhbnNwb3NlOiEwfSk7dGhpcy5VPXQucmlnaHRTaW5ndWxhclZlY3RvcnM7Y29uc3QgZT10LmRpYWdvbmFsLHI9W107Zm9yKGNvbnN0IHQgb2YgZSlyLnB1c2godCp0LyhzLnJvd3MtMSkpO3RoaXMuUz1yO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bmtub3duIG1ldGhvZDogJHtvfWApfX1zdGF0aWMgbG9hZChlKXtpZigic3RyaW5nIiE9dHlwZW9mIGUubmFtZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtb2RlbCBtdXN0IGhhdmUgYSBuYW1lIHByb3BlcnR5Iik7aWYoIlBDQSIhPT1lLm5hbWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYGludmFsaWQgbW9kZWw6ICR7ZS5uYW1lfWApO3JldHVybiBuZXcgdCh2b2lkIDAsdm9pZCAwLGUpfXByZWRpY3QodCxlPXt9KXtjb25zdHtuQ29tcG9uZW50czpyPXRoaXMuVS5jb2x1bW5zfT1lO2xldCBzO2lmKHM9KEFycmF5LmlzQXJyYXkodCksbmV3IGpyKHQpKSx0aGlzLmNlbnRlciYmKHMuc3ViUm93VmVjdG9yKHRoaXMubWVhbnMpLHRoaXMuc2NhbGUpKXtmb3IobGV0IHQgb2YgdGhpcy5leGNsdWRlZEZlYXR1cmVzKXMucmVtb3ZlQ29sdW1uKHQpO3MuZGl2Um93VmVjdG9yKHRoaXMuc3RkZXZzKX1sZXQgbj1zLm1tdWwodGhpcy5VKTtyZXR1cm4gbi5zdWJNYXRyaXgoMCxuLnJvd3MtMSwwLHItMSl9aW52ZXJ0KHQpe2xldCBlPSh0PWpyLmNoZWNrTWF0cml4KHQpKS5tbXVsKHRoaXMuVS50cmFuc3Bvc2UoKSk7cmV0dXJuIHRoaXMuY2VudGVyJiYodGhpcy5zY2FsZSYmZS5tdWxSb3dWZWN0b3IodGhpcy5zdGRldnMpLGUuYWRkUm93VmVjdG9yKHRoaXMubWVhbnMpKSxlfWdldEV4cGxhaW5lZFZhcmlhbmNlKCl7bGV0IHQ9MDtpZih0aGlzLlMpZm9yKGNvbnN0IGUgb2YgdGhpcy5TKXQrPWU7cmV0dXJuIHRoaXMuUz90aGlzLlMubWFwKChlPT5lL3QpKTpbXX1nZXRDdW11bGF0aXZlVmFyaWFuY2UoKXtsZXQgdD10aGlzLmdldEV4cGxhaW5lZFZhcmlhbmNlKCk7Zm9yKGxldCBlPTE7ZTx0Lmxlbmd0aDtlKyspdFtlXSs9dFtlLTFdO3JldHVybiB0fWdldEVpZ2VudmVjdG9ycygpe3JldHVybiB0aGlzLlV9Z2V0RWlnZW52YWx1ZXMoKXtyZXR1cm4gdGhpcy5TfWdldFN0YW5kYXJkRGV2aWF0aW9ucygpe3JldHVybiB0aGlzLlMubWFwKCh0PT5NYXRoLnNxcnQodCkpKX1nZXRMb2FkaW5ncygpe3JldHVybiB0aGlzLlUudHJhbnNwb3NlKCl9dG9KU09OKCl7cmV0dXJue25hbWU6IlBDQSIsY2VudGVyOnRoaXMuY2VudGVyLHNjYWxlOnRoaXMuc2NhbGUsbWVhbnM6dGhpcy5tZWFucyxzdGRldnM6dGhpcy5zdGRldnMsVTp0aGlzLlUsUzp0aGlzLlMsZXhjbHVkZWRGZWF0dXJlczp0aGlzLmV4Y2x1ZGVkRmVhdHVyZXN9fV9hZGp1c3QodCxlKXtpZih0aGlzLmNlbnRlcil7Y29uc3Qgcj10Lm1lYW4oImNvbHVtbiIpLHM9dGhpcy5zY2FsZT90LnN0YW5kYXJkRGV2aWF0aW9uKCJjb2x1bW4iLHttZWFuOnJ9KTpudWxsO2lmKHRoaXMubWVhbnM9cix0LnN1YlJvd1ZlY3RvcihyKSx0aGlzLnNjYWxlKXtmb3IobGV0IHI9MDtyPHMubGVuZ3RoO3IrKylpZigwPT09c1tyXSl7aWYoIWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENhbm5vdCBzY2FsZSB0aGUgZGF0YXNldCAoc3RhbmRhcmQgZGV2aWF0aW9uIGlzIHplcm8gYXQgaW5kZXggJHtyfWApO3QucmVtb3ZlQ29sdW1uKHIpLHMuc3BsaWNlKHIsMSksdGhpcy5leGNsdWRlZEZlYXR1cmVzLnB1c2gociksci0tfXRoaXMuc3RkZXZzPXMsdC5kaXZSb3dWZWN0b3Iocyl9fX1fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpe2NvbnN0IGU9bmV3IF9yKHQse2Fzc3VtZVN5bW1ldHJpYzohMH0pO3RoaXMuVT1lLmVpZ2VudmVjdG9yTWF0cml4LHRoaXMuVS5mbGlwUm93cygpLHRoaXMuUz1lLnJlYWxFaWdlbnZhbHVlcyx0aGlzLlMucmV2ZXJzZSgpfV9jb21wdXRlV2l0aE5JUEFMUyh0LGUpe3RoaXMuVT1uZXcganIoZSx0LmNvbHVtbnMpLHRoaXMuUz1bXTtsZXQgcj10O2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW5ldyBScihyKTt0aGlzLlUuc2V0Um93KHQsZS53LnRyYW5zcG9zZSgpKSx0aGlzLlMucHVzaChNYXRoLnBvdyhlLnMuZ2V0KDAsMCksMikpLHI9ZS54UmVzaWR1YWx9dGhpcy5VPXRoaXMuVS50cmFuc3Bvc2UoKX19O2Z1bmN0aW9uIE5yKHQsZT17fSl7aWYoIWNlKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3QgZWZmLiBhcnJheSIpO2xldCByPXd0KGUsInNjYWxlIik7bWUocil8fChyPSEwKTtsZXQgcz13dChlLCJuQ29tcE5JUEFMUyIpO3dlKHMpfHwocz0yKSxzPWtlKHMpO2xldCBuPW9lKHd0KHQsMCxbXSkpO2lmKDA9PT1uKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBkaW1lbnNpb24gb2YgZGF0YSIpO2lmKHM+bil0aHJvdyBuZXcgRXJyb3IoYG5Db21wTklQQUxTWyR7c31dIGlzIG1vcmUgdGhhbiB0aGUgZGltZW5zaW9uWyR7bn1dIG9mIGRhdGFgKTtyZXR1cm4gbmV3IENyKHQse21ldGhvZDoiTklQQUxTIixzY2FsZTpyLG5Db21wTklQQUxTOnN9KS5wcmVkaWN0KHQpLnRvSlNPTigpfWZ1bmN0aW9uIGtyKHQsZSl7Zm9yKHZhciByPS0xLHM9bnVsbD09dD8wOnQubGVuZ3RoOysrcjxzJiYhMSE9PWUodFtyXSxyLHQpOyk7cmV0dXJuIHR9dmFyIFRyLEZyPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIHM9LTEsbj1PYmplY3QodCksbz1yKHQpLGk9by5sZW5ndGg7aS0tOyl7dmFyIHU9b1tUcj9pOisrc107aWYoITE9PT1lKG5bdV0sdSxuKSlicmVha31yZXR1cm4gdH07ZnVuY3Rpb24gT3IodCl7cmV0dXJuIGcodCkmJiJbb2JqZWN0IEFyZ3VtZW50c10iPT1tKHQpfXZhciBWcj1PYmplY3QucHJvdG90eXBlLHpyPVZyLmhhc093blByb3BlcnR5LERyPVZyLnByb3BlcnR5SXNFbnVtZXJhYmxlLFByPU9yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/T3I6ZnVuY3Rpb24odCl7cmV0dXJuIGcodCkmJnpyLmNhbGwodCwiY2FsbGVlIikmJiFEci5jYWxsKHQsImNhbGxlZSIpfTt2YXIgcXI9Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cywkcj1xciYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLExyPSRyJiYkci5leHBvcnRzPT09cXI/cy5CdWZmZXI6dm9pZCAwLFVyPShMcj9Mci5pc0J1ZmZlcjp2b2lkIDApfHxmdW5jdGlvbigpe3JldHVybiExfSxHcj05MDA3MTk5MjU0NzQwOTkxLEJyPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBXcih0LGUpe3ZhciByPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT9HcjplKSYmKCJudW1iZXIiPT1yfHwic3ltYm9sIiE9ciYmQnIudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfXZhciBLcj17fTtLclsiW29iamVjdCBGbG9hdDMyQXJyYXldIl09S3JbIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPUtyWyJbb2JqZWN0IEludDhBcnJheV0iXT1LclsiW29iamVjdCBJbnQxNkFycmF5XSJdPUtyWyJbb2JqZWN0IEludDMyQXJyYXldIl09S3JbIltvYmplY3QgVWludDhBcnJheV0iXT1LclsiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1LclsiW29iamVjdCBVaW50MTZBcnJheV0iXT1LclsiW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxLclsiW29iamVjdCBBcmd1bWVudHNdIl09S3JbIltvYmplY3QgQXJyYXldIl09S3JbIltvYmplY3QgQXJyYXlCdWZmZXJdIl09S3JbIltvYmplY3QgQm9vbGVhbl0iXT1LclsiW29iamVjdCBEYXRhVmlld10iXT1LclsiW29iamVjdCBEYXRlXSJdPUtyWyJbb2JqZWN0IEVycm9yXSJdPUtyWyJbb2JqZWN0IEZ1bmN0aW9uXSJdPUtyWyJbb2JqZWN0IE1hcF0iXT1LclsiW29iamVjdCBOdW1iZXJdIl09S3JbIltvYmplY3QgT2JqZWN0XSJdPUtyWyJbb2JqZWN0IFJlZ0V4cF0iXT1LclsiW29iamVjdCBTZXRdIl09S3JbIltvYmplY3QgU3RyaW5nXSJdPUtyWyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIFFyPSJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsWHI9UXImJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxZcj1YciYmWHIuZXhwb3J0cz09PVFyJiZlLnByb2Nlc3MsSnI9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9WHImJlhyLnJlcXVpcmUmJlhyLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8WXImJllyLmJpbmRpbmcmJllyLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpLEhyPUpyJiZKci5pc1R5cGVkQXJyYXksWnI9SHI/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX0oSHIpOmZ1bmN0aW9uKHQpe3JldHVybiBnKHQpJiZEdCh0Lmxlbmd0aCkmJiEhS3JbbSh0KV19LHRzPVpyLGVzPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gcnMoZSxyKXt2YXIgcz10KGUpLG49IXMmJlByKGUpLG89IXMmJiFuJiZVcihlKSxpPSFzJiYhbiYmIW8mJnRzKGUpLHU9c3x8bnx8b3x8aSxhPXU/ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEscz1BcnJheSh0KTsrK3I8dDspc1tyXT1lKHIpO3JldHVybiBzfShlLmxlbmd0aCxTdHJpbmcpOltdLGw9YS5sZW5ndGg7Zm9yKHZhciBoIGluIGUpIXImJiFlcy5jYWxsKGUsaCl8fHUmJigibGVuZ3RoIj09aHx8byYmKCJvZmZzZXQiPT1ofHwicGFyZW50Ij09aCl8fGkmJigiYnVmZmVyIj09aHx8ImJ5dGVMZW5ndGgiPT1ofHwiYnl0ZU9mZnNldCI9PWgpfHxXcihoLGwpKXx8YS5wdXNoKGgpO3JldHVybiBhfWZ1bmN0aW9uIHNzKHQpe3JldHVybiBQdCh0KT9ycyh0KTpNdCh0KX12YXIgbnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocixzKXtpZihudWxsPT1yKXJldHVybiByO2lmKCFQdChyKSlyZXR1cm4gdChyLHMpO2Zvcih2YXIgbj1yLmxlbmd0aCxvPWU/bjotMSxpPU9iamVjdChyKTsoZT9vLS06KytvPG4pJiYhMSE9PXMoaVtvXSxvLGkpOyk7cmV0dXJuIHJ9fSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmRnIodCxlLHNzKX0pKSxvcz1ucztmdW5jdGlvbiBpcyh0KXtyZXR1cm4gdH1mdW5jdGlvbiB1cyhlLHIpe3ZhciBzO3JldHVybih0KGUpP2tyOm9zKShlLCJmdW5jdGlvbiI9PXR5cGVvZihzPXIpP3M6aXMpfWZ1bmN0aW9uIGFzKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IFcodCk7dGhpcy5zaXplPWUuc2l6ZX1hcy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW5ldyBXLHRoaXMuc2l6ZT0wfSxhcy5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxyfSxhcy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX0sYXMucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9LGFzLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO2lmKHIgaW5zdGFuY2VvZiBXKXt2YXIgcz1yLl9fZGF0YV9fO2lmKCFLfHxzLmxlbmd0aDwxOTkpcmV0dXJuIHMucHVzaChbdCxlXSksdGhpcy5zaXplPSsrci5zaXplLHRoaXM7cj10aGlzLl9fZGF0YV9fPW5ldyBYKHMpfXJldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZT1yLnNpemUsdGhpc307ZnVuY3Rpb24gbHModCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IFg7KytlPHI7KXRoaXMuYWRkKHRbZV0pfWZ1bmN0aW9uIGhzKHQsZSl7Zm9yKHZhciByPS0xLHM9bnVsbD09dD8wOnQubGVuZ3RoOysrcjxzOylpZihlKHRbcl0scix0KSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBjcyh0LGUpe3JldHVybiB0LmhhcyhlKX1scy5wcm90b3R5cGUuYWRkPWxzLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIiksdGhpc30sbHMucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O3ZhciBmcz0xLG1zPTI7ZnVuY3Rpb24gZ3ModCxlLHIscyxuLG8pe3ZhciBpPXImZnMsdT10Lmxlbmd0aCxhPWUubGVuZ3RoO2lmKHUhPWEmJiEoaSYmYT51KSlyZXR1cm4hMTt2YXIgbD1vLmdldCh0KSxoPW8uZ2V0KGUpO2lmKGwmJmgpcmV0dXJuIGw9PWUmJmg9PXQ7dmFyIGM9LTEsZj0hMCxtPXImbXM/bmV3IGxzOnZvaWQgMDtmb3Ioby5zZXQodCxlKSxvLnNldChlLHQpOysrYzx1Oyl7dmFyIGc9dFtjXSx3PWVbY107aWYocyl2YXIgcD1pP3ModyxnLGMsZSx0LG8pOnMoZyx3LGMsdCxlLG8pO2lmKHZvaWQgMCE9PXApe2lmKHApY29udGludWU7Zj0hMTticmVha31pZihtKXtpZighaHMoZSwoZnVuY3Rpb24odCxlKXtpZighY3MobSxlKSYmKGc9PT10fHxuKGcsdCxyLHMsbykpKXJldHVybiBtLnB1c2goZSl9KSkpe2Y9ITE7YnJlYWt9fWVsc2UgaWYoZyE9PXcmJiFuKGcsdyxyLHMsbykpe2Y9ITE7YnJlYWt9fXJldHVybiBvLmRlbGV0ZSh0KSxvLmRlbGV0ZShlKSxmfXZhciB3cz1zLlVpbnQ4QXJyYXk7ZnVuY3Rpb24gcHModCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQscyl7clsrK2VdPVtzLHRdfSkpLHJ9ZnVuY3Rpb24gZHModCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3JbKytlXT10fSkpLHJ9dmFyIHlzPTEsYnM9MixNcz0iW29iamVjdCBCb29sZWFuXSIsdnM9IltvYmplY3QgRGF0ZV0iLHhzPSJbb2JqZWN0IEVycm9yXSIsRXM9IltvYmplY3QgTWFwXSIsU3M9IltvYmplY3QgTnVtYmVyXSIsX3M9IltvYmplY3QgUmVnRXhwXSIsanM9IltvYmplY3QgU2V0XSIsQXM9IltvYmplY3QgU3RyaW5nXSIsUnM9IltvYmplY3QgU3ltYm9sXSIsSXM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixDcz0iW29iamVjdCBEYXRhVmlld10iLE5zPW4/bi5wcm90b3R5cGU6dm9pZCAwLGtzPU5zP05zLnZhbHVlT2Y6dm9pZCAwO3ZhciBUcz1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLEZzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsT3M9RnM/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLHM9bnVsbD09dD8wOnQubGVuZ3RoLG49MCxvPVtdOysrcjxzOyl7dmFyIGk9dFtyXTtlKGkscix0KSYmKG9bbisrXT1pKX1yZXR1cm4gb30oRnModCksKGZ1bmN0aW9uKGUpe3JldHVybiBUcy5jYWxsKHQsZSl9KSkpfTpmdW5jdGlvbigpe3JldHVybltdfSxWcz1PcztmdW5jdGlvbiB6cyhlKXtyZXR1cm4gZnVuY3Rpb24oZSxyLHMpe3ZhciBuPXIoZSk7cmV0dXJuIHQoZSk/bjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxzPWUubGVuZ3RoLG49dC5sZW5ndGg7KytyPHM7KXRbbityXT1lW3JdO3JldHVybiB0fShuLHMoZSkpfShlLHNzLFZzKX12YXIgRHM9MSxQcz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBxcz0xLCRzPSJbb2JqZWN0IEFyZ3VtZW50c10iLExzPSJbb2JqZWN0IEFycmF5XSIsVXM9IltvYmplY3QgT2JqZWN0XSIsR3M9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBCcyhlLHIscyxuLG8saSl7dmFyIHU9dChlKSxhPXQociksbD11P0xzOlZ0KGUpLGg9YT9MczpWdChyKSxjPShsPWw9PSRzP1VzOmwpPT1VcyxmPShoPWg9PSRzP1VzOmgpPT1VcyxtPWw9PWg7aWYobSYmVXIoZSkpe2lmKCFVcihyKSlyZXR1cm4hMTt1PSEwLGM9ITF9aWYobSYmIWMpcmV0dXJuIGl8fChpPW5ldyBhcyksdXx8dHMoZSk/Z3MoZSxyLHMsbixvLGkpOmZ1bmN0aW9uKHQsZSxyLHMsbixvLGkpe3N3aXRjaChyKXtjYXNlIENzOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSBJczpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhbyhuZXcgd3ModCksbmV3IHdzKGUpKSk7Y2FzZSBNczpjYXNlIHZzOmNhc2UgU3M6cmV0dXJuIFUoK3QsK2UpO2Nhc2UgeHM6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIF9zOmNhc2UgQXM6cmV0dXJuIHQ9PWUrIiI7Y2FzZSBFczp2YXIgdT1wcztjYXNlIGpzOnZhciBhPXMmeXM7aWYodXx8KHU9ZHMpLHQuc2l6ZSE9ZS5zaXplJiYhYSlyZXR1cm4hMTt2YXIgbD1pLmdldCh0KTtpZihsKXJldHVybiBsPT1lO3N8PWJzLGkuc2V0KHQsZSk7dmFyIGg9Z3ModSh0KSx1KGUpLHMsbixvLGkpO3JldHVybiBpLmRlbGV0ZSh0KSxoO2Nhc2UgUnM6aWYoa3MpcmV0dXJuIGtzLmNhbGwodCk9PWtzLmNhbGwoZSl9cmV0dXJuITF9KGUscixsLHMsbixvLGkpO2lmKCEocyZxcykpe3ZhciBnPWMmJkdzLmNhbGwoZSwiX193cmFwcGVkX18iKSx3PWYmJkdzLmNhbGwociwiX193cmFwcGVkX18iKTtpZihnfHx3KXt2YXIgcD1nP2UudmFsdWUoKTplLGQ9dz9yLnZhbHVlKCk6cjtyZXR1cm4gaXx8KGk9bmV3IGFzKSxvKHAsZCxzLG4saSl9fXJldHVybiEhbSYmKGl8fChpPW5ldyBhcyksZnVuY3Rpb24odCxlLHIscyxuLG8pe3ZhciBpPXImRHMsdT16cyh0KSxhPXUubGVuZ3RoO2lmKGEhPXpzKGUpLmxlbmd0aCYmIWkpcmV0dXJuITE7Zm9yKHZhciBsPWE7bC0tOyl7dmFyIGg9dVtsXTtpZighKGk/aCBpbiBlOlBzLmNhbGwoZSxoKSkpcmV0dXJuITF9dmFyIGM9by5nZXQodCksZj1vLmdldChlKTtpZihjJiZmKXJldHVybiBjPT1lJiZmPT10O3ZhciBtPSEwO28uc2V0KHQsZSksby5zZXQoZSx0KTtmb3IodmFyIGc9aTsrK2w8YTspe3ZhciB3PXRbaD11W2xdXSxwPWVbaF07aWYocyl2YXIgZD1pP3MocCx3LGgsZSx0LG8pOnModyxwLGgsdCxlLG8pO2lmKCEodm9pZCAwPT09ZD93PT09cHx8bih3LHAscixzLG8pOmQpKXttPSExO2JyZWFrfWd8fChnPSJjb25zdHJ1Y3RvciI9PWgpfWlmKG0mJiFnKXt2YXIgeT10LmNvbnN0cnVjdG9yLGI9ZS5jb25zdHJ1Y3Rvcjt5PT1ifHwhKCJjb25zdHJ1Y3RvciJpbiB0KXx8ISgiY29uc3RydWN0b3IiaW4gZSl8fCJmdW5jdGlvbiI9PXR5cGVvZiB5JiZ5IGluc3RhbmNlb2YgeSYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBifHwobT0hMSl9cmV0dXJuIG8uZGVsZXRlKHQpLG8uZGVsZXRlKGUpLG19KGUscixzLG4sbyxpKSl9ZnVuY3Rpb24gV3ModCxlLHIscyxuKXtyZXR1cm4gdD09PWV8fChudWxsPT10fHxudWxsPT1lfHwhZyh0KSYmIWcoZSk/dCE9dCYmZSE9ZTpCcyh0LGUscixzLFdzLG4pKX12YXIgS3M9MSxRcz0yO2Z1bmN0aW9uIFhzKHQpe3JldHVybiB0PT10JiYhTSh0KX1mdW5jdGlvbiBZcyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gbnVsbCE9ciYmKHJbdF09PT1lJiYodm9pZCAwIT09ZXx8dCBpbiBPYmplY3QocikpKX19ZnVuY3Rpb24gSnModCl7dmFyIGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXNzKHQpLHI9ZS5sZW5ndGg7ci0tOyl7dmFyIHM9ZVtyXSxuPXRbc107ZVtyXT1bcyxuLFhzKG4pXX1yZXR1cm4gZX0odCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP1lzKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24ocil7cmV0dXJuIHI9PT10fHxmdW5jdGlvbih0LGUscixzKXt2YXIgbj1yLmxlbmd0aCxvPW4saT0hcztpZihudWxsPT10KXJldHVybiFvO2Zvcih0PU9iamVjdCh0KTtuLS07KXt2YXIgdT1yW25dO2lmKGkmJnVbMl0/dVsxXSE9PXRbdVswXV06ISh1WzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK248bzspe3ZhciBhPSh1PXJbbl0pWzBdLGw9dFthXSxoPXVbMV07aWYoaSYmdVsyXSl7aWYodm9pZCAwPT09bCYmIShhIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGM9bmV3IGFzO2lmKHMpdmFyIGY9cyhsLGgsYSx0LGUsYyk7aWYoISh2b2lkIDA9PT1mP1dzKGgsbCxLc3xRcyxzLGMpOmYpKXJldHVybiExfX1yZXR1cm4hMH0ocix0LGUpfX1mdW5jdGlvbiBIcyh0LGUpe3JldHVybiBudWxsIT10JiZlIGluIE9iamVjdCh0KX1mdW5jdGlvbiBacyhlLHIpe3JldHVybiBudWxsIT1lJiZmdW5jdGlvbihlLHIscyl7Zm9yKHZhciBuPS0xLG89KHI9Y3QocixlKSkubGVuZ3RoLGk9ITE7KytuPG87KXt2YXIgdT1tdChyW25dKTtpZighKGk9bnVsbCE9ZSYmcyhlLHUpKSlicmVhaztlPWVbdV19cmV0dXJuIGl8fCsrbiE9bz9pOiEhKG89bnVsbD09ZT8wOmUubGVuZ3RoKSYmRHQobykmJldyKHUsbykmJih0KGUpfHxQcihlKSl9KGUscixIcyl9dmFyIHRuPTEsZW49MjtmdW5jdGlvbiBybih0KXtyZXR1cm4gYih0KT8kdChtdCh0KSk6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBndChlLHQpfX0odCl9ZnVuY3Rpb24gc24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpudWxsPT1lP2lzOiJvYmplY3QiPT10eXBlb2YgZT90KGUpPyhyPWVbMF0scz1lWzFdLGIocikmJlhzKHMpP1lzKG10KHIpLHMpOmZ1bmN0aW9uKHQpe3ZhciBlPXd0KHQscik7cmV0dXJuIHZvaWQgMD09PWUmJmU9PT1zP1pzKHQscik6V3MocyxlLHRufGVuKX0pOkpzKGUpOnJuKGUpO3ZhciByLHN9ZnVuY3Rpb24gbm4odCxlKXt2YXIgcj0tMSxzPVB0KHQpP0FycmF5KHQubGVuZ3RoKTpbXTtyZXR1cm4gb3ModCwoZnVuY3Rpb24odCxuLG8pe3NbKytyXT1lKHQsbixvKX0pKSxzfWZ1bmN0aW9uIG9uKGUscil7cmV0dXJuKHQoZSk/b3Q6bm4pKGUsc24ocikpfWZ1bmN0aW9uIHVuKHQpe3JldHVybiBudWxsPT10P1tdOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG90KGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpfSh0LHNzKHQpKX1mdW5jdGlvbiBhbih0LGUpe2lmKCF1ZSh0KSlyZXR1cm57fTtpZighY2UoZSkpcmV0dXJue307bGV0IHI9e307cmV0dXJuIHVzKGUsKGZ1bmN0aW9uKGUpeyhmdW5jdGlvbih0LGUpe3JldHVybiEhdWUodCkmJiEoIWdlKGUpJiYhd2UoZSkpJiZlIGluIHR9KSh0LGUpJiYocltlXT13dCh0LGUpKX0pKSxyfXZhciBsbj17fSxobj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NsYXNzIGNue2NvbnN0cnVjdG9yKHQpe3RoaXMuZ2V0Q29zdD0oKT0+dGhpcy5FbGVtZW50cy5tYXAoKHQ9PnQuRGlzdGFuY2VGcm9tTWVkb2lkKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmRCZXN0TWVkb2lkSWR4PXQ9PnRoaXMuRWxlbWVudHMubWFwKChlPT50aGlzLmNhbGNDb3N0Rm9yR2l2ZW5FbGVtZW50QXNNZWRvaWQoZSx0KSkpLnJlZHVjZSgoKHQsZSxyLHMpPT5lLkNvc3RJZk1hZGVNZWRvaWQ8c1t0XS5Db3N0SWZNYWRlTWVkb2lkP3I6dCksMCksdGhpcy5jYWxjQ29zdEZvckdpdmVuRWxlbWVudEFzTWVkb2lkPSh0LGUpPT4oe0Nvc3RJZk1hZGVNZWRvaWQ6bmV3IGNuKHtFbGVtZW50czp0aGlzLkVsZW1lbnRzLm1hcCgocj0+KHtEaXN0YW5jZUZyb21NZWRvaWQ6ZShyLkVsZW1lbnQsdC5FbGVtZW50KSxFbGVtZW50OnIuRWxlbWVudH0pKSksTWVkb2lkOnQuRWxlbWVudH0pLmdldENvc3QoKSxFbGVtZW50OnR9KSx0aGlzLkVsZW1lbnRzPXQuRWxlbWVudHMsdGhpcy5NZWRvaWQ9dC5NZWRvaWR9fWhuLkNsdXN0ZXI9Y247dmFyIGZuPXt9LG1uPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShtbiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbW4uZGlzdGFuY2U9KHQsZSk9PntpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGlucHV0cyBtdXN0IGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uIik7Y29uc3Qgcj1BcnJheS5mcm9tKHQua2V5cygpKS5tYXAoKHI9Pk1hdGgucG93KE1hdGguYWJzKHRbcl0tZVtyXSksMikpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApO3JldHVybiBNYXRoLnNxcnQocil9O3ZhciBnbj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZ24sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGduLmtHdEVsZW1lbnRBcnJMZW5ndGg9ImsgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3Qgd249bW4scG49Z24sZG49aG47Y2xhc3MgeW57Y29uc3RydWN0b3IodCxlLHIpe3RoaXMuRWxlbWVudHM9dCx0aGlzLks9ZSx0aGlzLkRpc3RhbmNlRm49cix0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZD0hMSx0aGlzLml0ZXJhdGU9KCk9Pnt0aGlzLkl0ZXJhdGlvbkNvdW50KyssdGhpcy5DbHVzdGVyc3x8dGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHQ9dGhpcy5NZWRvaWRzLGU9dGhpcy5DbHVzdGVycyxyPXRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTtsZXQgcz1yO2ZvcihsZXQgdD0wO3Q8dGhpcy5NZWRvaWRzLmxlbmd0aDt0Kyspe2NvbnN0IGU9dD0+MD09PXRoaXMuTWVkb2lkcy5maWx0ZXIoKGU9PjA9PT10aGlzLkRpc3RhbmNlRm4odCxlKSkpLmxlbmd0aDtmb3IoY29uc3QgciBvZiB0aGlzLkVsZW1lbnRzLmZpbHRlcihlKSl7Y29uc3QgZT10aGlzLk1lZG9pZHMuc2xpY2UoKTtlW3RdPXI7Y29uc3Qgbj1uZXcgeW4odGhpcy5FbGVtZW50cy5zbGljZSgpLHRoaXMuSyx0aGlzLkRpc3RhbmNlRm4pO24uTWVkb2lkcz1lLG4uYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHMoKTtjb25zdCBvPW4uY2FsY3VsYXRlQ3VycmVudENvc3QoKTtvPHMmJihzPW8sdGhpcy5DbHVzdGVycz1uLkNsdXN0ZXJzLHRoaXMuTWVkb2lkcz1lKX19cmV0dXJuIHRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTxyfHwodGhpcy5DbHVzdGVycz1lLHRoaXMuTWVkb2lkcz10LHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSEwLCExKX0sdGhpcy5nZXRDbHVzdGVyZWREYXRhPSgpPT4odGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWR8fHRoaXMucnVuVG9Db21wbGV0aW9uKCksdGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuRWxlbWVudHMubWFwKCh0PT50LkVsZW1lbnQpKSkpKSx0aGlzLnJ1blRvQ29tcGxldGlvbj0oKT0+e2Zvcig7dGhpcy5pdGVyYXRlKCk7KTt9LHRoaXMuYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHM9KCk9Pnt0aGlzLkNsdXN0ZXJzPW5ldyBBcnJheSx0aGlzLk1lZG9pZHMuZm9yRWFjaCgodD0+e3RoaXMuQ2x1c3RlcnMucHVzaChuZXcgZG4uQ2x1c3Rlcih7RWxlbWVudHM6W10sTWVkb2lkOnR9KSl9KSksdGhpcy5FbGVtZW50cy5mb3JFYWNoKCgodCxlKT0+e2NvbnN0IHI9dGhpcy5maW5kRGlzdGFuY2VzKHRoaXMuQ2x1c3RlcnMubWFwKCh0PT50Lk1lZG9pZCkpLHQpLHM9ci5yZWR1Y2UoKCh0LGUscixzKT0+ZTxzW3RdP3I6dCksMCk7dGhpcy5DbHVzdGVyc1tzXS5FbGVtZW50cy5wdXNoKHtEaXN0YW5jZUZyb21NZWRvaWQ6cltzXSxFbGVtZW50OnR9KX0pKX0sdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdD0oKT0+dGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuZ2V0Q29zdCgpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmREaXN0YW5jZXM9KHQsZSk9PnQubWFwKCh0PT50aGlzLkRpc3RhbmNlRm4odCxlKSkpLHRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHM9KCk9PntpZih0aGlzLks+PXRoaXMuRWxlbWVudHMubGVuZ3RoKXRocm93IHBuLmtHdEVsZW1lbnRBcnJMZW5ndGg7Y29uc3QgdD1bXSxlPSh0LGUpPT57Zm9yKGNvbnN0IHIgb2YgZSlpZigwPT09dGhpcy5EaXN0YW5jZUZuKHIsdCkpcmV0dXJuITE7cmV0dXJuITB9O2xldCByPTA7Zm9yKDtyPHRoaXMuRWxlbWVudHMubGVuZ3RoJiZ0Lmxlbmd0aDx0aGlzLks7KWUodGhpcy5FbGVtZW50c1tyXSx0KSYmdC5wdXNoKHRoaXMuRWxlbWVudHNbcl0pLHIrKztyZXR1cm4gdH0sdGhpcy5EaXN0YW5jZUZuPXRoaXMuRGlzdGFuY2VGbnx8d24uZGlzdGFuY2UsdGhpcy5NZWRvaWRzPXRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHMoKSx0aGlzLkl0ZXJhdGlvbkNvdW50PTB9Z2V0IE9wdGltaXNhdGlvblN0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5JdGVyYXRpb25Db3VudD4wfX15bi5jbHVzdGVyRWxlbWVudHM9KHQsZSxyKT0+e3luLmdldEluc3RhbmNlKHQsZSxyKTtyZXR1cm4gbmV3IEFycmF5fSx5bi5nZXRJbnN0YW5jZT0odCxlLHIpPT5uZXcgeW4odCxlLHIpLGZuLkNsdXN0ZXJlcj15bixmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgciBpbiBlKXQuaGFzT3duUHJvcGVydHkocil8fCh0W3JdPWVbcl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKGhuKSxlKGZuKX0obG4pO3ZhciBibj1UZShsbik7ZnVuY3Rpb24gTW4odCxlKXtsZXQgcj0wO2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXIrPSh0W3NdLWVbc10pKih0W3NdLWVbc10pO3JldHVybiByfWNvbnN0IHZuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24geG4odCxlPXt9KXtjb25zdHttaW5MZW5ndGg6cn09ZTtpZighZnVuY3Rpb24odCl7Y29uc3QgZT12bi5jYWxsKHQpO3JldHVybiBlLmVuZHNXaXRoKCJBcnJheV0iKSYmIWUuaW5jbHVkZXMoIkJpZyIpfSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7aWYoIm51bWJlciIhPXR5cGVvZiB0WzBdKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgY29udGFpbiBudW1iZXJzIik7aWYociYmdC5sZW5ndGg8cil0aHJvdyBuZXcgRXJyb3IoYGlucHV0IG11c3QgaGF2ZSBhIGxlbmd0aCBvZiBhdCBsZWFzdCAke3J9YCl9ZnVuY3Rpb24gRW4odCxlLHI9e30pe2NvbnN0e3NvcnRlZDpzPSEwfT1yO2lmKHMpe2xldCByPTAscz10Lmxlbmd0aC0xLG49MDtmb3IoO3Mtcj4xOylpZihuPXIrKHMtcj4+MSksdFtuXTxlKXI9bjtlbHNle2lmKCEodFtuXT5lKSlyZXR1cm4gbjtzPW59cmV0dXJuIHI8dC5sZW5ndGgtMT9NYXRoLmFicyhlLXRbcl0pPE1hdGguYWJzKHRbcisxXS1lKT9yOnIrMTpyfXtsZXQgcj0wLHM9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBvPU1hdGguYWJzKHRbbl0tZSk7bzxzJiYocz1vLHI9bil9cmV0dXJuIHJ9fWZ1bmN0aW9uIFNuKHQsZT17fSl7bGV0e2Zyb21JbmRleDpyLHRvSW5kZXg6c309ZTtjb25zdHtmcm9tOm4sdG86b309ZTtyZXR1cm4gdm9pZCAwPT09ciYmKHI9dm9pZCAwIT09bj9Fbih0LG4pOjApLHZvaWQgMD09PXMmJihzPXZvaWQgMCE9PW8/RW4odCxvKTp0Lmxlbmd0aC0xKSxyPDAmJihyPTApLHM8MCYmKHM9MCkscj49dC5sZW5ndGgmJihyPXQubGVuZ3RoLTEpLHM+PXQubGVuZ3RoJiYocz10Lmxlbmd0aC0xKSxyPnMmJihbcixzXT1bcyxyXSkse2Zyb21JbmRleDpyLHRvSW5kZXg6c319ZnVuY3Rpb24gX24odCxlPXt9KXt4bih0KTtjb25zdHtmcm9tSW5kZXg6cix0b0luZGV4OnN9PVNuKHQsZSk7bGV0IG49dFtyXTtmb3IobGV0IGU9cisxO2U8PXM7ZSsrKW4rPXRbZV07cmV0dXJuIG4vKHMtcisxKX1mdW5jdGlvbiBqbih0LGUpe2NvbnN0IHI9NjU1MzUmKHQ+Pj49MCk7cmV0dXJuKCh0LXIpKihlPj4+PTApPj4+MCkrciplPj4+MH1jbGFzcyBBbntyYW5kb207c3RhdGU7Y29uc3RydWN0b3IodD1EYXRlLm5vdygpKXt0aGlzLnN0YXRlPW5ldyBVaW50MzJBcnJheSg0KSx0aGlzLmluaXQodCksdGhpcy5yYW5kb209dGhpcy5nZXRGbG9hdC5iaW5kKHRoaXMpfWdldFVpbnQzMigpe3JldHVybiB0aGlzLm5leHRTdGF0ZSgpLHRoaXMuc3RhdGVbM10rdGhpcy5zdGF0ZVsyXT4+PjB9Z2V0RmxvYXQoKXtyZXR1cm4gNS45NjA0NjQ0Nzc1MzkwNjNlLTgqKHRoaXMuZ2V0VWludDMyKCk+Pj44KX1pbml0KHQpe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoInNlZWQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7dGhpcy5zdGF0ZVswXT10LHRoaXMuc3RhdGVbMV09MCx0aGlzLnN0YXRlWzJdPTAsdGhpcy5zdGF0ZVszXT0wO2ZvcihsZXQgdD0xO3Q8ODt0KyspdGhpcy5zdGF0ZVszJnRdXj10K2puKDE4MTI0MzMyNTMsdGhpcy5zdGF0ZVt0LTEmM11edGhpcy5zdGF0ZVt0LTEmM10+Pj4zMD4+PjApPj4+MDt0aGlzLnBlcmlvZENlcnRpZmljYXRpb24oKTtmb3IobGV0IHQ9MDt0PDg7dCsrKXRoaXMubmV4dFN0YXRlKCl9cGVyaW9kQ2VydGlmaWNhdGlvbigpezA9PT10aGlzLnN0YXRlWzBdJiYwPT09dGhpcy5zdGF0ZVsxXSYmMD09PXRoaXMuc3RhdGVbMl0mJjA9PT10aGlzLnN0YXRlWzNdJiYodGhpcy5zdGF0ZVswXT04OCx0aGlzLnN0YXRlWzFdPTgzLHRoaXMuc3RhdGVbMl09NjUsdGhpcy5zdGF0ZVszXT02OCl9bmV4dFN0YXRlKCl7bGV0IHQ9dGhpcy5zdGF0ZVswXTt0Xj10PDwxNSx0Xj10Pj4+MTgsdF49dGhpcy5zdGF0ZVszXTw8MTEsdGhpcy5zdGF0ZVswXT10aGlzLnN0YXRlWzFdLHRoaXMuc3RhdGVbMV09dGhpcy5zdGF0ZVsyXSx0aGlzLnN0YXRlWzJdPXRoaXMuc3RhdGVbM10sdGhpcy5zdGF0ZVszXT10fX1mdW5jdGlvbiBSbih0LGU9e30pe3huKHQpO2NvbnN0e2Zyb21JbmRleDpyLHRvSW5kZXg6c309U24odCxlKTtsZXQgbj10W3JdO2ZvcihsZXQgZT1yKzE7ZTw9cztlKyspbis9dFtlXTtyZXR1cm4gbn1jb25zdCBJbj17ZGlzdGFuY2VGdW5jdGlvbjpNbn07ZnVuY3Rpb24gQ24odCxlLHI9SW4pe2NvbnN0IHM9ci5kaXN0YW5jZUZ1bmN0aW9ufHxJbi5kaXN0YW5jZUZ1bmN0aW9uLG49ci5zaW1pbGFyaXR5RnVuY3Rpb258fEluLnNpbWlsYXJpdHlGdW5jdGlvbjtsZXQgbz0tMTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbil7bGV0IHI9TnVtYmVyLk1JTl9WQUxVRTtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKyl7Y29uc3QgaT1uKGUsdFtzXSk7aT5yJiYocj1pLG89cyl9fWVsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHMpdGhyb3cgbmV3IEVycm9yKCJBIHNpbWlsYXJpdHkgb3IgZGlzdGFuY2UgZnVuY3Rpb24gaXQncyByZXF1aXJlZCIpO3tsZXQgcj1OdW1iZXIuTUFYX1ZBTFVFO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPXMoZSx0W25dKTtpPHImJihyPWksbz1uKX19fXJldHVybiBvfWZ1bmN0aW9uIE5uKHQsZSxyLHMpe2NvbnN0IG49e2Rpc3RhbmNlRnVuY3Rpb246c307Zm9yKGxldCBzPTA7czx0Lmxlbmd0aDtzKyspcltzXT1DbihlLHRbc10sbik7cmV0dXJuIHJ9Y2xhc3Mga257Y2x1c3RlcnM7Y2VudHJvaWRzO2NvbnZlcmdlZDtpdGVyYXRpb25zO2Rpc3RhbmNlO2NvbnN0cnVjdG9yKHQsZSxyLHMsbil7dGhpcy5jbHVzdGVycz10LHRoaXMuY2VudHJvaWRzPWUsdGhpcy5jb252ZXJnZWQ9cix0aGlzLml0ZXJhdGlvbnM9cyx0aGlzLmRpc3RhbmNlPW59bmVhcmVzdCh0KXtjb25zdCBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7cmV0dXJuIE5uKHQsdGhpcy5jZW50cm9pZHMsZSx0aGlzLmRpc3RhbmNlKX1jb21wdXRlSW5mb3JtYXRpb24odCl7Y29uc3QgZT10aGlzLmNlbnRyb2lkcy5tYXAoKCgpPT5bXSkpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKXtjb25zdCBzPXRoaXMuY2x1c3RlcnNbcl07ZVtzXS5wdXNoKHRoaXMuZGlzdGFuY2UodFtyXSx0aGlzLmNlbnRyb2lkc1tzXSkpfXJldHVybiB0aGlzLmNlbnRyb2lkcy5tYXAoKCh0LHIpPT57Y29uc3Qgcz1lW3JdO3JldHVybntjZW50cm9pZDp0LGVycm9yOnMubGVuZ3RoPjA/X24ocyk6LTEsc2l6ZTpzLmxlbmd0aH19KSl9fWZ1bmN0aW9uIFRuKHQsZT17fSxyPU1hdGgucmFuZG9tKXtjb25zdHtzaXplOnM9MSxyZXBsYWNlOm49ITEscHJvYmFiaWxpdGllczpvfT1lO2xldCBpLHU7aWYoaT0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaChyKTtyZXR1cm4gZX0odCk6dC5zbGljZSgpLG8pe2lmKCFuKXRocm93IG5ldyBFcnJvcigiY2hvaWNlIHdpdGggcHJvYmFiaWxpdGllcyBhbmQgbm8gcmVwbGFjZW1lbnQgaXMgbm90IGltcGxlbWVudGVkIik7aWYoby5sZW5ndGghPT1pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSBsZW5ndGggb2YgcHJvYmFiaWxpdGllcyBvcHRpb24gc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgY2hvaWNlcyIpO3U9W29bMF1dO2ZvcihsZXQgdD0xO3Q8by5sZW5ndGg7dCsrKXVbdF09dVt0LTFdK29bdF07aWYoTWF0aC5hYnMoMS11LmF0KC0xKSk+MWUtOCl0aHJvdyBuZXcgRXJyb3IoYHByb2JhYmlsaXRpZXMgc2hvdWxkIHN1bSB0byAxLCBidXQgaW5zdGVhZCBzdW1zIHRvICR7dS5hdCgtMSl9YCl9aWYoIW4mJnM+aS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzaXplIG9wdGlvbiBpcyB0b28gbGFyZ2UiKTtjb25zdCBhPVtdO2ZvcihsZXQgdD0wO3Q8czt0Kyspe2NvbnN0IHQ9Rm4oaS5sZW5ndGgscix1KTthLnB1c2goaVt0XSksbnx8aS5zcGxpY2UodCwxKX1yZXR1cm4gYX1mdW5jdGlvbiBGbih0LGUscil7Y29uc3Qgcz1lKCk7aWYocil7bGV0IHQ9MDtmb3IoO3M+clt0XTspdCsrO3JldHVybiB0fXJldHVybiBNYXRoLmZsb29yKHMqdCl9Y2xhc3MgT257cmFuZG9tR2VuZXJhdG9yO2NvbnN0cnVjdG9yKHQ9TWF0aC5yYW5kb20pe2lmKCJudW1iZXIiPT10eXBlb2YgdCl7Y29uc3QgZT1uZXcgQW4odCk7dGhpcy5yYW5kb21HZW5lcmF0b3I9ZS5yYW5kb219ZWxzZSB0aGlzLnJhbmRvbUdlbmVyYXRvcj10fWNob2ljZSh0LGUpe3JldHVybiBUbih0LGUsdGhpcy5yYW5kb21HZW5lcmF0b3IpfXJhbmRvbSgpe3JldHVybiB0aGlzLnJhbmRvbUdlbmVyYXRvcigpfXJhbmRJbnQodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PTApLHQrTWF0aC5mbG9vcih0aGlzLnJhbmRvbUdlbmVyYXRvcigpKihlLXQpKX1yYW5kb21TYW1wbGUodCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLnJhbmRvbSgpKTtyZXR1cm4gZX19ZnVuY3Rpb24gVm4odCxlKXtjb25zdCByPW5ldyBqcih0LnJvd3MsZS5yb3dzKTtmb3IobGV0IHM9MDtzPHQucm93cztzKyspZm9yKGxldCBuPTA7bjxlLnJvd3M7bisrKXIuc2V0KHMsbixNbih0LmdldFJvdyhzKSxlLmdldFJvdyhuKSkpO3JldHVybiByfWNvbnN0IHpuPXttYXhJdGVyYXRpb25zOjEwMCx0b2xlcmFuY2U6MWUtNixpbml0aWFsaXphdGlvbjoia21lYW5zKysiLGRpc3RhbmNlRnVuY3Rpb246TW59O2Z1bmN0aW9uIERuKHQsZSxyLHMsbixvKXtjb25zdCBpPWZ1bmN0aW9uKHQsZSxyLHMpe2NvbnN0IG49ZVswXS5sZW5ndGgsbz1uZXcgQXJyYXkocyksaT1uZXcgQXJyYXkocyk7Zm9yKGxldCB0PTA7dDxzO3QrKyl7b1t0XT1uZXcgQXJyYXkobiksaVt0XT0wO2ZvcihsZXQgZT0wO2U8bjtlKyspb1t0XVtlXT0wfWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtpW3JbdF1dKys7Zm9yKGxldCBzPTA7czxuO3MrKylvW3JbdF1dW3NdKz1lW3RdW3NdfWZvcihsZXQgZT0wO2U8cztlKyspZm9yKGxldCByPTA7cjxuO3IrKylpW2VdP29bZV1bcl0vPWlbZV06b1tlXVtyXT10W2VdW3JdO3JldHVybiBvfSh0LGUscj1ObihlLHQscixuLmRpc3RhbmNlRnVuY3Rpb24pLHMpLHU9ZnVuY3Rpb24odCxlLHIscyl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYocih0W25dLGVbbl0pPnMpcmV0dXJuITE7cmV0dXJuITB9KGksdCxuLmRpc3RhbmNlRnVuY3Rpb24sbi50b2xlcmFuY2UpO3JldHVybiBuZXcga24ocixpLHUsbyxuLmRpc3RhbmNlRnVuY3Rpb24pfWZ1bmN0aW9uIFBuKHQsZSxyKXtjb25zdCBzPWZ1bmN0aW9uKHQpe3JldHVybnsuLi56biwuLi50fX0ocik7IWZ1bmN0aW9uKHQsZSl7aWYoZTw9MHx8ZT50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIoZSkpdGhyb3cgbmV3IEVycm9yKCJLIHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgcG9pbnRzIil9KHQsZSk7bGV0IG49ZnVuY3Rpb24odCxlLHIpe2xldCBzO2lmKEFycmF5LmlzQXJyYXkoci5pbml0aWFsaXphdGlvbikpe2lmKHIuaW5pdGlhbGl6YXRpb24ubGVuZ3RoIT09ZSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBpbml0aWFsIGNlbnRlcnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIEsiKTtzPXIuaW5pdGlhbGl6YXRpb259ZWxzZSBzd2l0Y2goci5pbml0aWFsaXphdGlvbil7Y2FzZSJrbWVhbnMrKyI6cz1mdW5jdGlvbih0LGUscj17fSl7Y29uc3Qgcz1uZXcganIodCksbj1zLnJvd3Msbz1uZXcgT24oci5zZWVkKSxpPVtdLHU9ci5sb2NhbFRyaWFsc3x8MitNYXRoLmZsb29yKE1hdGgubG9nKGUpKSxhPW8ucmFuZEludChuKTtpLnB1c2gocy5nZXRSb3coYSkpO2xldCBsPW5ldyBqcigxLHMucm93cyk7Zm9yKGxldCB0PTA7dDxzLnJvd3M7dCsrKWwuc2V0KDAsdCxNbihzLmdldFJvdyh0KSxpWzBdKSk7bGV0IGg9anIubXVsKGwsMS9SbihsLmdldFJvdygwKSkpO2ZvcihsZXQgdD0xO3Q8ZTt0Kyspe2NvbnN0IGU9by5jaG9pY2Uobix7cmVwbGFjZTohMCxzaXplOnUscHJvYmFiaWxpdGllczpoLmdldFJvdygwKX0pLHI9Vm4ocy5zdWJNYXRyaXhSb3coZSkscyk7bGV0IGE9MS8wLGM9MS8wLGY9bDtmb3IobGV0IHQ9MDt0PHU7dCsrKXtjb25zdCBzPWpyLm1pbihsLFtyLmdldFJvdyh0KV0pLG49cy5zdW0oKTtuPGMmJihhPWVbdF0sYz1uLGY9cyl9aVt0XT1zLmdldFJvdyhhKSxsPWYsaD1qci5tdWwobCwxL1JuKGwuZ2V0Um93KDApKSl9cmV0dXJuIGl9KHQsZSxyKTticmVhaztjYXNlInJhbmRvbSI6cz1mdW5jdGlvbih0LGUscil7cmV0dXJuIG5ldyBPbihyKS5jaG9pY2UodCx7c2l6ZTplfSl9KHQsZSxyLnNlZWQpO2JyZWFrO2Nhc2UibW9zdERpc3RhbnQiOnM9ZnVuY3Rpb24odCxlLHIscyl7Y29uc3Qgbj1uZXcgT24ocyksbz1uZXcgQXJyYXkoZSk7aWYob1swXT1NYXRoLmZsb29yKG4ucmFuZG9tKCkqdC5sZW5ndGgpLGU+MSl7Y29uc3Qgcz17ZGlzdDotMSxpbmRleDotMX07Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDsrK2UpcltvWzBdXVtlXT5zLmRpc3QmJihzLmRpc3Q9cltvWzBdXVtlXSxzLmluZGV4PWUpO2lmKG9bMV09cy5pbmRleCxlPjIpZm9yKGxldCBzPTI7czxlOysrcyl7bGV0IGU9e2Rpc3Q6LTEsaW5kZXg6LTF9O2ZvcihsZXQgbj0wO248dC5sZW5ndGg7KytuKXtsZXQgdD17ZGlzdDpOdW1iZXIuTUFYX1ZBTFVFLGluZGV4Oi0xfTtpZighby5pbmNsdWRlcyhuKSlmb3IobGV0IGU9MDtlPHM7KytlKXJbb1tlXV1bbl08dC5kaXN0JiYodD17ZGlzdDpyW29bZV1dW25dLGluZGV4Om59KTt0LmRpc3QhPT1OdW1iZXIuTUFYX1ZBTFVFJiZ0LmRpc3Q+ZS5kaXN0JiYoZT17Li4udH0pfW9bc109ZS5pbmRleH19cmV0dXJuIG8ubWFwKChlPT50W2VdKSl9KHQsZSxmdW5jdGlvbih0LGUpe2NvbnN0IHI9bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoOysrZSlyW2VdPW5ldyBBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCBzPTA7czx0Lmxlbmd0aDsrK3MpZm9yKGxldCBuPXM7bjx0Lmxlbmd0aDsrK24pe2NvbnN0IG89ZSh0W3NdLHRbbl0pO3Jbc11bbl09byxyW25dW3NdPW99cmV0dXJuIHJ9KHQsci5kaXN0YW5jZUZ1bmN0aW9uKSxyLnNlZWQpO2JyZWFrO2RlZmF1bHQ6IWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKGAke2V9OiAiJHtTdHJpbmcodCl9ImApfShyLmluaXRpYWxpemF0aW9uLCJVbmtub3duIGluaXRpYWxpemF0aW9uIG1ldGhvZCIpfXJldHVybiBzfSh0LGUscyk7MD09PXMubWF4SXRlcmF0aW9ucyYmKHMubWF4SXRlcmF0aW9ucz1OdW1iZXIuTUFYX1ZBTFVFKTtjb25zdCBvPW5ldyBBcnJheSh0Lmxlbmd0aCk7bGV0IGksdT0hMSxhPTA7Zm9yKDshdSYmYTxzLm1heEl0ZXJhdGlvbnM7KWk9RG4obix0LG8sZSxzLCsrYSksdT1pLmNvbnZlcmdlZCxuPWkuY2VudHJvaWRzO2lmKCFpKXRocm93IG5ldyBFcnJvcigidW5yZWFjaGFibGU6IG5vIGttZWFucyBzdGVwIGV4ZWN1dGVkIik7cmV0dXJuIGl9Y2xhc3MgcW57Y29uc3RydWN0b3IodCl7dGhpcy5yb3dzPXR9bGVuKCl7cmV0dXJuIHRoaXMucm93cy5sZW5ndGh9aXNTcXVhcmUoKXtjb25zdCB0PXRoaXMucm93cy5sZW5ndGg7Zm9yKGxldCBlPTA7ZTx0O2UrKylpZih0aGlzLnJvd3NbZV0ubGVuZ3RoIT09dClyZXR1cm4hMTtyZXR1cm4hMH1nZXQodCxlKXtyZXR1cm4gdGhpcy5yb3dzW3RdW2VdfX1jb25zdCAkbj00Mjk0OTY3Mjk1O2NsYXNzIExue2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5pPXQsdGhpcy5kPWV9Y2xvbmUoKXtyZXR1cm4gbmV3IExuKHRoaXMuaSx0aGlzLmQpfXN0YXRpYyBlbXB0eSgpe3JldHVybiBuZXcgTG4oJG4sMCl9fWNsYXNzIFVue2NvbnN0cnVjdG9yKHQsZSxyLHMpe3RoaXMubmVhcj1uZXcgTG4odCxlKSx0aGlzLnNlY289bmV3IExuKHIscyl9Y2xvbmUoKXtyZXR1cm4gbmV3IFVuKHRoaXMubmVhci5pLHRoaXMubmVhci5kLHRoaXMuc2Vjby5pLHRoaXMuc2Vjby5kKX1zdGF0aWMgZW1wdHkoKXtyZXR1cm4gbmV3IFVuKCRuLDAsJG4sMCl9fWZ1bmN0aW9uIEduKHQsZSxyKXtjb25zdCBzPSh0PWZ1bmN0aW9uKHQpe2lmKHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmdldCYmImZ1bmN0aW9uIj09dHlwZW9mIHQubGVuKXJldHVybiB0O2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIG5ldyBxbih0KTt0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIG1hdHJpeCBpbnB1dDogcHJvdmlkZSBhIDJEIGFycmF5LCBhIERlbnNlTWF0cml4LCBvciBhIExvd2VyVHJpYW5nbGUiKX0odCkpLmxlbigpLG49ZS5sZW5ndGg7aWYoMT09PW4pe2NvbnN0IHI9bmV3IEFycmF5KHMpLmZpbGwoMCksW24sb109ZnVuY3Rpb24odCxlLHIscyl7Y29uc3Qgbj1yW3NdO2xldCBvPW4saT0wO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKW4hPT1yJiZlW3JdPT09cyYmKGkrPXQuZ2V0KG4scikpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKHIhPT1uJiZlW3JdPT09cyl7bGV0IG49MDtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKylvIT09ciYmZVtvXT09PXMmJihuKz10LmdldChyLG8pKTtuPGkmJihvPXIsaT1uKX1yZXR1cm4gcltzXT1vLFtvIT09bixpXX0odCxyLGUsMCk7cmV0dXJue2xvc3M6byxhc3NpOnIsbkl0ZXI6MSxuU3dhcHM6bj8xOjB9fWxldFtvLGldPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10LmxlbigpLHM9ZS5sZW5ndGg7aWYoIXQuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIkRpc3NpbWlsYXJpdHkgbWF0cml4IGlzIG5vdCBzcXVhcmUiKTtpZighKHI8PSRuKSl0aHJvdyBuZXcgRXJyb3IoIk4gaXMgdG9vIGxhcmdlIik7aWYoIShzPjAmJnM8JG4pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBOIik7aWYoIShzPD1yKSl0aHJvdyBuZXcgRXJyb3IoImsgbXVzdCBiZSBhdCBtb3N0IE4iKTtjb25zdCBuPUFycmF5LmZyb20oe2xlbmd0aDp0LmxlbigpfSwoKCk9PlVuLmVtcHR5KCkpKSxvPWVbMF07bGV0IGk9MDtmb3IobGV0IHI9MDtyPG4ubGVuZ3RoO3IrKyl7bltyXT1uZXcgVW4oMCx0LmdldChyLG8pLCRuLDApO2NvbnN0IHM9bltyXTtmb3IobGV0IG49MTtuPGUubGVuZ3RoO24rKyl7Y29uc3Qgbz1lW25dLGk9dC5nZXQocixvKTtpPHMubmVhci5kfHxyPT09bz8ocy5zZWNvPXMubmVhci5jbG9uZSgpLHMubmVhcj1uZXcgTG4obixpKSk6KHMuc2Vjby5pPT09JG58fGk8cy5zZWNvLmQpJiYocy5zZWNvPW5ldyBMbihuLGkpKX1pKz1zLm5lYXIuZH1yZXR1cm5baSxuXX0odCxlKSx1PW5ldyBBcnJheShuKS5maWxsKDApO1duKGksdSk7bGV0IGE9cyxsPTAsaD0wO2Zvcig7aDxyOyl7aCs9MTtjb25zdCByPWwsbj1vO2ZvcihsZXQgcj0wO3I8cyYmciE9PWE7cisrKXtpZihyPT09ZVtpW3JdLm5lYXIuaV0pY29udGludWU7Y29uc3RbcyxuXT1Cbih0LHUsaSxyKTtzPj0wfHwobCs9MSxhPXIsbz1Rbih0LGUsaSxuLHIpLFduKGksdSkpfWlmKGw9PT1yfHxvPj1uKWJyZWFrfXJldHVybntsb3NzOm8sYXNzaTppLm1hcCgodD0+dC5uZWFyLmkpKSxuSXRlcjpoLG5Td2FwczpsfX1mdW5jdGlvbiBCbih0LGUscixzKXtjb25zdCBuPWUuc2xpY2UoKTtsZXQgbz0wO2ZvcihsZXQgZT0wO2U8ci5sZW5ndGg7ZSsrKXtjb25zdCBpPXJbZV0sdT10LmdldChlLHMpO3U8aS5uZWFyLmQ/KG8rPXUtaS5uZWFyLmQsbltpLm5lYXIuaV0rPWkubmVhci5kLWkuc2Vjby5kKTp1PGkuc2Vjby5kJiYobltpLm5lYXIuaV0rPXUtaS5zZWNvLmQpfWNvbnN0W2ksdV09ZnVuY3Rpb24odCl7bGV0IGU9MCxyPXRbMF07Zm9yKGxldCBzPTE7czx0Lmxlbmd0aDtzKyspdFtzXTxyJiYoZT1zLHI9dFtzXSk7cmV0dXJuW2Uscl19KG4pO3JldHVyblt1K28saV19ZnVuY3Rpb24gV24odCxlKXtlLmZpbGwoMCk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IHM9dFtyXTtlW3MubmVhci5pXSs9cy5zZWNvLmQtcy5uZWFyLmR9fWZ1bmN0aW9uIEtuKHQsZSxyLHMsbixvKXtsZXQgaT1uZXcgTG4ocyxvKTtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl7Y29uc3QgdT1lW29dO2lmKG89PT1yfHxvPT09cyljb250aW51ZTtjb25zdCBhPXQuZ2V0KG4sdSk7YTxpLmQmJihpPW5ldyBMbihvLGEpKX1yZXR1cm4gaX1mdW5jdGlvbiBRbih0LGUscixzLG4pe2NvbnN0IG89dC5sZW4oKTtpZighKHM8ZS5sZW5ndGgpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBtZWRvaWQgbnVtYmVyIik7aWYoIShuPG8pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBvYmplY3QgbnVtYmVyIik7ZVtzXT1uO2xldCBpPTA7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKyspe2NvbnN0IHU9cltvXTtpZihvPT09bil7dS5uZWFyLmkhPT1zJiYodS5zZWNvPXUubmVhci5jbG9uZSgpKSx1Lm5lYXI9bmV3IExuKHMsMCksaSs9MDtjb250aW51ZX1jb25zdCBhPXQuZ2V0KG8sbik7dS5uZWFyLmk9PT1zP2E8dS5zZWNvLmQ/dS5uZWFyPW5ldyBMbihzLGEpOih1Lm5lYXI9dS5zZWNvLmNsb25lKCksdS5zZWNvPUtuKHQsZSx1Lm5lYXIuaSxzLG8sYSkpOmE8dS5uZWFyLmQ/KHUuc2Vjbz11Lm5lYXIuY2xvbmUoKSx1Lm5lYXI9bmV3IExuKHMsYSkpOmE8dS5zZWNvLmQ/dS5zZWNvPW5ldyBMbihzLGEpOnUuc2Vjby5pPT09cyYmKHUuc2Vjbz1Lbih0LGUsdS5uZWFyLmkscyxvLGEpKSxpKz11Lm5lYXIuZH1yZXR1cm4gaX1mdW5jdGlvbiBYbih0LGUpe2xldCByPTA7Zm9yKGxldCBzPTA7czx0Lmxlbmd0aDtzKyspe2xldCBuPXRbc10tZVtzXTtyKz1uKm59cmV0dXJuIE1hdGguc3FydChyKX1mdW5jdGlvbiBZbih0LGUscil7bGV0IHM9dC5sZW5ndGgsbj1mdW5jdGlvbih0KXtsZXQgZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09PWV8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09PWV9KHIpP3I6WG4sbz1BcnJheS5mcm9tKHtsZW5ndGg6c30sKCgpPT5uZXcgRmxvYXQ2NEFycmF5KHMpKSk7Zm9yKGxldCBlPTA7ZTxzO2UrKylmb3IobGV0IHI9ZSsxO3I8cztyKyspe2xldCBzPW4odFtlXSx0W3JdKTtvW2VdW3JdPXMsb1tyXVtlXT1zfXZhciBpO2xldCB1PUduKG8sKGk9ZSxBcnJheS5mcm9tKHtsZW5ndGg6aX0sKCh0LGUpPT5lKSkpLDEwMCksYT17fTtyZXR1cm4gdXModS5hc3NpLCgodCxlKT0+e2FbdF18fChhW3RdPVtdKSxhW3RdLnB1c2goZSl9KSksdW4oYSl9YXN5bmMgZnVuY3Rpb24gSm4odCxlLHI9e30pe2xldCBzPXd0KHIsImZ1bkRpc3QiLG51bGwpO3JldHVybiJzaW1wbGUiPT09d3QociwidXNlTWV0aG9kIiwiZmFzdGVyUEFNIik/ZnVuY3Rpb24odCxlLHIpe2xldCBzPW5ldyBNYXA7dXModCwoKHQsZSk9PntzLnNldCh0LGUpfSkpO2xldCBuPWJuLkNsdXN0ZXJlci5nZXRJbnN0YW5jZSh0LGUscikuZ2V0Q2x1c3RlcmVkRGF0YSgpO3JldHVybiBuPW9uKG4sKHQ9Pm9uKHQsKHQ9PnMuZ2V0KHQpKSkpKSxufSh0LGUscyk6WW4odCxlLHMpfWFzeW5jIGZ1bmN0aW9uIEhuKHQsZT17fSl7bGV0IHI9d3QoZSwia051bWJlciIpO3I9d2Uocik/a2Uocik6MjtsZXQgcz13dChlLCJtb2RlIik7ImstbWVkb2lkcyIhPT1zJiYiay1tZWFucyIhPT1zJiYocz0iay1tZWRvaWRzIik7bGV0IG4sbz13dChlLCJzZWVkIixudWxsKSxpPXd0KGUsImZ1bkRpc3QiLG51bGwpLHU9d3QoZSwidXNlTWV0aG9kIiwiZmFzdGVyUEFNIik7aWYoImstbWVkb2lkcyI9PT1zKW49YXdhaXQgSm4odCxyLHtmdW5EaXN0OmksdXNlTWV0aG9kOnV9KTtlbHNle2lmKCJrLW1lYW5zIiE9PXMpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG1vZGVbJHtzfV1gKTtuPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQsZSxyPXt9KXtsZXQgcz13dChyLCJzZWVkIixudWxsKSxuPXt9O251bGwhPT1zJiYobj17c2VlZDpzfSk7bGV0IG89UG4odCxlLG4pLGk9e307cmV0dXJuIHVzKG8uY2x1c3RlcnMsKCh0LGUpPT57aVt0XXx8KGlbdF09W10pLGlbdF0ucHVzaChlKX0pKSx1bihpKX0odCxyLHtzZWVkOm99KX1yZXR1cm4gbn1hc3luYyBmdW5jdGlvbiBabih0LGU9e30pe2lmKCFjZSh0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IGVmZi4gYXJyYXkiKTtsZXQgcj13dChlLCJrTnVtYmVyIixudWxsKTt3ZShyKXx8KHI9Mikscj1rZShyKTtsZXQgcz13dChlLCJ1c2VQQ0EiLG51bGwpO21lKHMpfHwocz0hMCk7bGV0IG49d3QoZSwibkNvbXBOSVBBTFMiLG51bGwpO3dlKG4pfHwobj0yKSxuPWtlKG4pO2xldCBvPXd0KGUsIm1vZGUiLG51bGwpLGk9d3QoZSwic2VlZCIsbnVsbCksdT13dChlLCJmdW5EaXN0IixudWxsKSxhPXd0KGUsInVzZU1ldGhvZCIsImZhc3RlclBBTSIpLGw9IiIsaD1vZSh0KSxjPTAsZj0wO2lmKHVzKHQsKHQ9PnshZnVuY3Rpb24odCl7aWYodWUodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiEwO3JldHVybiExfXJldHVybiExfSh0KT9jZSh0KSYmKGYrPTEpOmMrPTF9KSksYz09PWgpbD0ib2JqIjtlbHNle2lmKGYhPT1oKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3Qgb2YgdGhlIHNhbWUgdHlwZSIpO2w9Im1hdCJ9bGV0IG0sZz1udWxsOyJvYmoiPT09bD8oZz1mdW5jdGlvbih0KXtsZXQgZT17fTt1cyh0LCh0PT57dXModCwoKHQscik9PntlW3JdfHwoZVtyXT0wKSwwPT09ZVtyXSYmd2UodCkmJihlW3JdPTEpLDEhPT1lW3JdfHx3ZSh0KXx8KGVbcl09LTEpfSkpfSkpO2xldCByPVtdO3JldHVybiB1cyhlLCgodCxlKT0+ezE9PT10JiZyLnB1c2goZSl9KSkscn0odCksbT1mdW5jdGlvbih0LGUpe3JldHVybiBvbih0LCh0PT51bihhbih0LGUpKSkpfSh0LGcpKTptPXQ7bGV0IHc9bTtzJiYodz1OcihtLHtuQ29tcE5JUEFMUzpufSkpO2xldCBwPWF3YWl0IEhuKHcse2tOdW1iZXI6cixtb2RlOm8sc2VlZDppLGZ1bkRpc3Q6dSx1c2VNZXRob2Q6YX0pO3JldHVybntrZXlzOmcsZ2luZHM6cCxnbWF0Om9uKHAsKHQ9Pm9uKHQsKHQ9PndbdF0pKSkpLGdsdGR0Om9uKHAsKGU9Pm9uKGUsKGU9PnRbZV0pKSkpfX1sZXQgV0NsdXN0ZXI9e1BDQTphc3luYyBmdW5jdGlvbih0LGU9e30pe3JldHVybiBOcih0LGUpfSxjbHVzdGVyOmFzeW5jIGZ1bmN0aW9uKHQsZT17fSl7dHJ5e3JldHVybiBhd2FpdCBabih0LGUpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX19fTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IFdDbHVzdGVyKC4uLmlucHV0KQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFdDbHVzdGVyCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBwYXJlbnRQb3J0Lm9uKCdtZXNzYWdlJywgcmVjdk1lc3NhZ2UpCiAgICAgICAgCgp0cnl7CgogICAgLy/lg4Xku6V1bmNhdWdodEV4Y2VwdGlvbk1vbml0b3LoqJjpjIQsIOS4jeWPr+iou+WGinVuY2F1Z2h0RXhjZXB0aW9u6IiHdW5oYW5kbGVkUmVqZWN0aW9u55uj6IG9OgogICAgLy/mlrx3b3JrZXLlhafoqLvlhormraTkuoznm6Pogb3mnIPpmLvmraJOb2Rl6aCQ6Kit55qEd29ya2Vy57WC5q2i6KGM54K6LCDkvb93b3JrZXLltKnmvbDlvozku43lrZjmtLvnqbrovYksCiAgICAvL+WkluWxpOaUtuS4jeWIsGVycm9yL2V4aXTkuovku7YsIHBlbmRpbmcgcHJvbWlzZeawuOS5heaHuOe9riwg5LiU5a2Y5rS75q6t5bGNd29ya2Vy5pyD5Luk5a6/5Li756iL5bqP54Sh5rOV6YCA5Ye6OwogICAgLy/np7vpmaTlvox3b3JrZXLkvp3poJDoqK3ooYzngrrmrbvkuqEsIGVycm9y5LqL5Lu25YKz6Iez5aSW5bGkLCDnlLHlpJblsaTmlbTmiblyZWplY3QgcGVuZGluZwogICAgLy8gcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKGVycikgPT4gewogICAgLy8gICAgIGNvbnNvbGUubG9nKCdpbm5lcjp1bmhhbmRsZWRSZWplY3Rpb24nLCBlcnIpCiAgICAvLyB9KQogICAgLy8gcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCAoZXJyKSA9PiB7CiAgICAvLyAgICAgY29uc29sZS5sb2coJ2lubmVyOnVuY2F1Z2h0RXhjZXB0aW9uJywgZXJyKQogICAgLy8gfSkKICAgIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvcicsIChlcnIpID0+IHsKICAgICAgICBjb25zb2xlLmxvZygnaW5uZXI6dW5jYXVnaHRFeGNlcHRpb25Nb25pdG9yJywgZXJyKQogICAgfSkKCn0KY2F0Y2goZXJyKXt9Cgo=",Buffer.from(y,"base64").toString("utf8"));var y;function m(){let c=l(),b={},y=!1,m=!1;function K(d){for(let l in b){let Z=b[l];delete b[l],c.removeAllListeners(l),Z.reject(d)}c.emit("error",d)}function p(d){y||(y=!0,K(d))}let I=function(l){try{return new d.Worker(l,{eval:!0})}catch(d){p(d)}}(G);return I?(I.on("message",(function(d){let l=d,b=l.mode;"emit"!==b&&"return"!==b||("emit"===b&&c.emit(l.evName,l.msg),"return"===b&&c.emit(l.id,l))})),I.on("error",p),I.on("exit",(d=>{m||p("worker exit, code["+d+"]")})),function(){let d={mode:"init",type:"object",input:[...arguments]};I.postMessage(d)}([...arguments]),c.PCA=function(){let d=Z();if(y)return d.reject("worker is dead"),d;let l=X();b[l]=d;let G={mode:"call",id:l,fun:"PCA",input:[...arguments]};return I.postMessage(G),c.once(l,(c=>{delete b[l],"success"===c.state?d.resolve(c.msg):d.reject(c.msg)})),d},c.cluster=function(){let d=Z();if(y)return d.reject("worker is dead"),d;let l=X();b[l]=d;let G={mode:"call",id:l,fun:"cluster",input:[...arguments]};return I.postMessage(G),c.once(l,(c=>{delete b[l],"success"===c.state?d.resolve(c.msg):d.reject(c.msg)})),d},c.terminate=function(){I?(m=!0,I.terminate(),I=void 0):K("worker has been terminated")},c):(p("invalid worker"),null)}let K={PCA:async function(){let d=[...arguments],l=m();return await l.PCA(...d).finally((()=>{l.terminate()}))},cluster:async function(){let d=[...arguments],l=m();return await l.cluster(...d).finally((()=>{l.terminate()}))}};b=l();for(let d in K){let l=K[d];b[d]=l}}();try{process.on("uncaughtExceptionMonitor",(d=>{console.log("outer:uncaughtExceptionMonitor",d)}))}catch(d){}return b}(d)}({get exports(){return l},set exports(d){l=d}});var c=l,b={};!function(d,l){d.exports=function(){const d="function"==typeof TextDecoder?new TextDecoder("utf-8",{ignoreBOM:!0}):void 0,l=("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=")),c=(d=>{let l={};return d.forEach(((d,c)=>l[d]=c)),l})(l),b=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,Z=String.fromCharCode.bind(String),X="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):d=>new Uint8Array(Array.prototype.slice.call(d,0)),G=d=>d.replace(/[^A-Za-z0-9\+\/]/g,""),y=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,m=d=>{switch(d.length){case 4:var l=((7&d.charCodeAt(0))<<18|(63&d.charCodeAt(1))<<12|(63&d.charCodeAt(2))<<6|63&d.charCodeAt(3))-65536;return Z(55296+(l>>>10))+Z(56320+(1023&l));case 3:return Z((15&d.charCodeAt(0))<<12|(63&d.charCodeAt(1))<<6|63&d.charCodeAt(2));default:return Z((31&d.charCodeAt(0))<<6|63&d.charCodeAt(1))}},K=d=>d.replace(y,m),p=d=>{if(d=d.replace(/\s+/g,""),!b.test(d))throw new TypeError("malformed base64.");let l,X,G;d+="==".slice(2-(3&d.length));let y=[];for(let b=0;b<d.length;)l=c[d.charAt(b++)]<<18|c[d.charAt(b++)]<<12|(X=c[d.charAt(b++)])<<6|(G=c[d.charAt(b++)]),64===X?y.push(Z(l>>16&255)):64===G?y.push(Z(l>>16&255,l>>8&255)):y.push(Z(l>>16&255,l>>8&255,255&l));return y.join("")},I="function"==typeof atob?d=>atob(G(d)):p,W="function"==typeof Uint8Array.fromBase64?d=>Uint8Array.fromBase64(d):d=>X(I(d).split("").map((d=>d.charCodeAt(0)))),V=d?l=>d.decode(W(l)):d=>K(I(d)),u=d=>G(d.replace(/[-_]/g,(d=>"-"==d?"+":"/"))),h=d=>V(u(d)),H=h;var s={};!function(d){var l=Object.prototype.hasOwnProperty,c="~";function b(){}function Z(d,l,c){this.fn=d,this.context=l,this.once=c||!1}function X(d,l,b,X,G){if("function"!=typeof b)throw new TypeError("The listener must be a function");var y=new Z(b,X||d,G),m=c?c+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],y]:d._events[m].push(y):(d._events[m]=y,d._eventsCount++),d}function G(d,l){0==--d._eventsCount?d._events=new b:delete d._events[l]}function y(){this._events=new b,this._eventsCount=0}Object.create&&(b.prototype=Object.create(null),(new b).__proto__||(c=!1)),y.prototype.eventNames=function(){var d,b,Z=[];if(0===this._eventsCount)return Z;for(b in d=this._events)l.call(d,b)&&Z.push(c?b.slice(1):b);return Object.getOwnPropertySymbols?Z.concat(Object.getOwnPropertySymbols(d)):Z},y.prototype.listeners=function(d){var l=c?c+d:d,b=this._events[l];if(!b)return[];if(b.fn)return[b.fn];for(var Z=0,X=b.length,G=new Array(X);Z<X;Z++)G[Z]=b[Z].fn;return G},y.prototype.listenerCount=function(d){var l=c?c+d:d,b=this._events[l];return b?b.fn?1:b.length:0},y.prototype.emit=function(d,l,b,Z,X,G){var y=c?c+d:d;if(!this._events[y])return!1;var m,K,p=this._events[y],I=arguments.length;if(p.fn){switch(p.once&&this.removeListener(d,p.fn,void 0,!0),I){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,l),!0;case 3:return p.fn.call(p.context,l,b),!0;case 4:return p.fn.call(p.context,l,b,Z),!0;case 5:return p.fn.call(p.context,l,b,Z,X),!0;case 6:return p.fn.call(p.context,l,b,Z,X,G),!0}for(K=1,m=new Array(I-1);K<I;K++)m[K-1]=arguments[K];p.fn.apply(p.context,m)}else{var W,V=p.length;for(K=0;K<V;K++)switch(p[K].once&&this.removeListener(d,p[K].fn,void 0,!0),I){case 1:p[K].fn.call(p[K].context);break;case 2:p[K].fn.call(p[K].context,l);break;case 3:p[K].fn.call(p[K].context,l,b);break;case 4:p[K].fn.call(p[K].context,l,b,Z);break;default:if(!m)for(W=1,m=new Array(I-1);W<I;W++)m[W-1]=arguments[W];p[K].fn.apply(p[K].context,m)}}return!0},y.prototype.on=function(d,l,c){return X(this,d,l,c,!1)},y.prototype.once=function(d,l,c){return X(this,d,l,c,!0)},y.prototype.removeListener=function(d,l,b,Z){var X=c?c+d:d;if(!this._events[X])return this;if(!l)return G(this,X),this;var y=this._events[X];if(y.fn)y.fn!==l||Z&&!y.once||b&&y.context!==b||G(this,X);else{for(var m=0,K=[],p=y.length;m<p;m++)(y[m].fn!==l||Z&&!y[m].once||b&&y[m].context!==b)&&K.push(y[m]);K.length?this._events[X]=1===K.length?K[0]:K:G(this,X)}return this},y.prototype.removeAllListeners=function(d){var l;return d?(l=c?c+d:d,this._events[l]&&G(this,l)):(this._events=new b,this._eventsCount=0),this},y.prototype.off=y.prototype.removeListener,y.prototype.addListener=y.prototype.on,y.prefixed=c,y.EventEmitter=y,d.exports=y}({get exports(){return s},set exports(d){s=d}});var i=s;let L;!function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function d(){return new i}function l(){let d,l,c=new Promise((function(){d=arguments[0],l=arguments[1]}));return c.resolve=d,c.reject=l,c}function c(){let d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=c.length;for(let Z=0;Z<d;Z++)l[Z]=c[0|Math.random()*b];return l.join("")}let b=H("CgoKInVzZSBzdHJpY3QiO3ZhciB0PUFycmF5LmlzQXJyYXksZT0ib2JqZWN0Ij09dHlwZW9mIGdsb2JhbCYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwscj0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLHM9ZXx8cnx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxuPXMuU3ltYm9sLG89T2JqZWN0LnByb3RvdHlwZSxpPW8uaGFzT3duUHJvcGVydHksdT1vLnRvU3RyaW5nLGE9bj9uLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgbD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBoPSJbb2JqZWN0IE51bGxdIixjPSJbb2JqZWN0IFVuZGVmaW5lZF0iLGY9bj9uLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBtKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/YzpoOmYmJmYgaW4gT2JqZWN0KHQpP2Z1bmN0aW9uKHQpe3ZhciBlPWkuY2FsbCh0LGEpLHI9dFthXTt0cnl7dFthXT12b2lkIDA7dmFyIHM9ITB9Y2F0Y2godCl7fXZhciBuPXUuY2FsbCh0KTtyZXR1cm4gcyYmKGU/dFthXT1yOmRlbGV0ZSB0W2FdKSxufSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gbC5jYWxsKHQpfSh0KX1mdW5jdGlvbiBnKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9dmFyIHc9IltvYmplY3QgU3ltYm9sXSI7ZnVuY3Rpb24gcCh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fGcodCkmJm0odCk9PXd9dmFyIGQ9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8seT0vXlx3KiQvO2Z1bmN0aW9uIGIoZSxyKXtpZih0KGUpKXJldHVybiExO3ZhciBzPXR5cGVvZiBlO3JldHVybiEoIm51bWJlciIhPXMmJiJzeW1ib2wiIT1zJiYiYm9vbGVhbiIhPXMmJm51bGwhPWUmJiFwKGUpKXx8KHkudGVzdChlKXx8IWQudGVzdChlKXx8bnVsbCE9ciYmZSBpbiBPYmplY3QocikpfWZ1bmN0aW9uIE0odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9dmFyIHY9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLHg9IltvYmplY3QgRnVuY3Rpb25dIixFPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsUz0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIF8odCl7aWYoIU0odCkpcmV0dXJuITE7dmFyIGU9bSh0KTtyZXR1cm4gZT09eHx8ZT09RXx8ZT09dnx8ZT09U312YXIgaixBPXNbIl9fY29yZS1qc19zaGFyZWRfXyJdLFI9KGo9L1teLl0rJC8uZXhlYyhBJiZBLmtleXMmJkEua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK2o6IiI7dmFyIEk9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIEModCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBJLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifXZhciBOPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLGs9RnVuY3Rpb24ucHJvdG90eXBlLFQ9T2JqZWN0LnByb3RvdHlwZSxGPWsudG9TdHJpbmcsTz1ULmhhc093blByb3BlcnR5LFY9UmVnRXhwKCJeIitGLmNhbGwoTykucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24geih0KXtyZXR1cm4hKCFNKHQpfHwoZT10LFImJlIgaW4gZSkpJiYoXyh0KT9WOk4pLnRlc3QoQyh0KSk7dmFyIGV9ZnVuY3Rpb24gRCh0LGUpe3ZhciByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnRbZV19KHQsZSk7cmV0dXJuIHoocik/cjp2b2lkIDB9dmFyIFA9RChPYmplY3QsImNyZWF0ZSIpO3ZhciBxPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyICQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBMKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgcz10W2VdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fWZ1bmN0aW9uIFUodCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9ZnVuY3Rpb24gRyh0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKFUodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX1MLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189UD9QKG51bGwpOnt9LHRoaXMuc2l6ZT0wfSxMLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LEwucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKFApe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gcS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LEwucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBQP3ZvaWQgMCE9PWVbdF06JC5jYWxsKGUsdCl9LEwucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09UCYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTt2YXIgQj1BcnJheS5wcm90b3R5cGUuc3BsaWNlO2Z1bmN0aW9uIFcodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBzPXRbZV07dGhpcy5zZXQoc1swXSxzWzFdKX19Vy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfSxXLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPUcoZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6Qi5jYWxsKGUsciwxKSwtLXRoaXMuc2l6ZSwhMCl9LFcucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9RyhlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19LFcucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gRyh0aGlzLl9fZGF0YV9fLHQpPi0xfSxXLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLHM9RyhyLHQpO3JldHVybiBzPDA/KCsrdGhpcy5zaXplLHIucHVzaChbdCxlXSkpOnJbc11bMV09ZSx0aGlzfTt2YXIgSz1EKHMsIk1hcCIpO2Z1bmN0aW9uIFEodCxlKXt2YXIgcixzLG49dC5fX2RhdGFfXztyZXR1cm4oInN0cmluZyI9PShzPXR5cGVvZihyPWUpKXx8Im51bWJlciI9PXN8fCJzeW1ib2wiPT1zfHwiYm9vbGVhbiI9PXM/Il9fcHJvdG9fXyIhPT1yOm51bGw9PT1yKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIFgodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBzPXRbZV07dGhpcy5zZXQoc1swXSxzWzFdKX19WC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBMLG1hcDpuZXcoS3x8Vyksc3RyaW5nOm5ldyBMfX0sWC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPVEodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sWC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBRKHRoaXMsdCkuZ2V0KHQpfSxYLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIFEodGhpcyx0KS5oYXModCl9LFgucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPVEodGhpcyx0KSxzPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09cz8wOjEsdGhpc307dmFyIFk9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIEoodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihZKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBzPWFyZ3VtZW50cyxuPWU/ZS5hcHBseSh0aGlzLHMpOnNbMF0sbz1yLmNhY2hlO2lmKG8uaGFzKG4pKXJldHVybiBvLmdldChuKTt2YXIgaT10LmFwcGx5KHRoaXMscyk7cmV0dXJuIHIuY2FjaGU9by5zZXQobixpKXx8byxpfTtyZXR1cm4gci5jYWNoZT1uZXcoSi5DYWNoZXx8WCkscn1KLkNhY2hlPVg7dmFyIEgsWix0dCxldD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxydD0vXFwoXFwpPy9nLHN0PShIPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoZXQsKGZ1bmN0aW9uKHQscixzLG4pe2UucHVzaChzP24ucmVwbGFjZShydCwiJDEiKTpyfHx0KX0pKSxlfSxaPUooSCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PXR0LnNpemUmJnR0LmNsZWFyKCksdH0pKSx0dD1aLmNhY2hlLFopLG50PXN0O2Z1bmN0aW9uIG90KHQsZSl7Zm9yKHZhciByPS0xLHM9bnVsbD09dD8wOnQubGVuZ3RoLG49QXJyYXkocyk7KytyPHM7KW5bcl09ZSh0W3JdLHIsdCk7cmV0dXJuIG59dmFyIGl0PTEvMCx1dD1uP24ucHJvdG90eXBlOnZvaWQgMCxhdD11dD91dC50b1N0cmluZzp2b2lkIDA7ZnVuY3Rpb24gbHQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO2lmKHQoZSkpcmV0dXJuIG90KGUsbHQpKyIiO2lmKHAoZSkpcmV0dXJuIGF0P2F0LmNhbGwoZSk6IiI7dmFyIHI9ZSsiIjtyZXR1cm4iMCI9PXImJjEvZT09LWl0PyItMCI6cn1mdW5jdGlvbiBodCh0KXtyZXR1cm4gbnVsbD09dD8iIjpsdCh0KX1mdW5jdGlvbiBjdChlLHIpe3JldHVybiB0KGUpP2U6YihlLHIpP1tlXTpudChodChlKSl9dmFyIGZ0PTEvMDtmdW5jdGlvbiBtdCh0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fHAodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LWZ0PyItMCI6ZX1mdW5jdGlvbiBndCh0LGUpe2Zvcih2YXIgcj0wLHM9KGU9Y3QoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8czspdD10W210KGVbcisrXSldO3JldHVybiByJiZyPT1zP3Q6dm9pZCAwfWZ1bmN0aW9uIHd0KHQsZSxyKXt2YXIgcz1udWxsPT10P3ZvaWQgMDpndCh0LGUpO3JldHVybiB2b2lkIDA9PT1zP3I6c312YXIgcHQ9T2JqZWN0LnByb3RvdHlwZTt2YXIgZHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQoZShyKSl9fShPYmplY3Qua2V5cyxPYmplY3QpLHl0PWR0LGJ0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gTXQodCl7aWYocj0oZT10KSYmZS5jb25zdHJ1Y3RvcixlIT09KCJmdW5jdGlvbiI9PXR5cGVvZiByJiZyLnByb3RvdHlwZXx8cHQpKXJldHVybiB5dCh0KTt2YXIgZSxyLHM9W107Zm9yKHZhciBuIGluIE9iamVjdCh0KSlidC5jYWxsKHQsbikmJiJjb25zdHJ1Y3RvciIhPW4mJnMucHVzaChuKTtyZXR1cm4gc312YXIgdnQ9RChzLCJEYXRhVmlldyIpLHh0PUQocywiUHJvbWlzZSIpLEV0PUQocywiU2V0IiksU3Q9RChzLCJXZWFrTWFwIiksX3Q9IltvYmplY3QgTWFwXSIsanQ9IltvYmplY3QgUHJvbWlzZV0iLEF0PSJbb2JqZWN0IFNldF0iLFJ0PSJbb2JqZWN0IFdlYWtNYXBdIixJdD0iW29iamVjdCBEYXRhVmlld10iLEN0PUModnQpLE50PUMoSyksa3Q9Qyh4dCksVHQ9QyhFdCksRnQ9QyhTdCksT3Q9bTsodnQmJk90KG5ldyB2dChuZXcgQXJyYXlCdWZmZXIoMSkpKSE9SXR8fEsmJk90KG5ldyBLKSE9X3R8fHh0JiZPdCh4dC5yZXNvbHZlKCkpIT1qdHx8RXQmJk90KG5ldyBFdCkhPUF0fHxTdCYmT3QobmV3IFN0KSE9UnQpJiYoT3Q9ZnVuY3Rpb24odCl7dmFyIGU9bSh0KSxyPSJbb2JqZWN0IE9iamVjdF0iPT1lP3QuY29uc3RydWN0b3I6dm9pZCAwLHM9cj9DKHIpOiIiO2lmKHMpc3dpdGNoKHMpe2Nhc2UgQ3Q6cmV0dXJuIEl0O2Nhc2UgTnQ6cmV0dXJuIF90O2Nhc2Uga3Q6cmV0dXJuIGp0O2Nhc2UgVHQ6cmV0dXJuIEF0O2Nhc2UgRnQ6cmV0dXJuIFJ0fXJldHVybiBlfSk7dmFyIFZ0PU90LHp0PTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gRHQodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PXp0fWZ1bmN0aW9uIFB0KHQpe3JldHVybiBudWxsIT10JiZEdCh0Lmxlbmd0aCkmJiFfKHQpfXZhciBxdD0iW29iamVjdCBTdHJpbmddIjtmdW5jdGlvbiAkdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dm9pZCAwOmVbdF19fXZhciBMdD0kdCgibGVuZ3RoIiksVXQ9UmVnRXhwKCJbXFx1MjAwZFxcdWQ4MDAtXFx1ZGZmZlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZlxcdWZlMGVcXHVmZTBmXSIpO3ZhciBHdD0iXFx1ZDgwMC1cXHVkZmZmIixCdD0iWyIrR3QrIl0iLFd0PSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsS3Q9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsUXQ9IlteIitHdCsiXSIsWHQ9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLFl0PSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixKdD0iKD86IitXdCsifCIrS3QrIikiKyI/IixIdD0iW1xcdWZlMGVcXHVmZTBmXT8iLFp0PUh0K0p0KygiKD86XFx1MjAwZCg/OiIrW1F0LFh0LFl0XS5qb2luKCJ8IikrIikiK0h0K0p0KyIpKiIpLHRlPSIoPzoiK1tRdCtXdCsiPyIsV3QsWHQsWXQsQnRdLmpvaW4oInwiKSsiKSIsZWU9UmVnRXhwKEt0KyIoPz0iK0t0KyIpfCIrdGUrWnQsImciKTtmdW5jdGlvbiByZSh0KXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIFV0LnRlc3QodCl9KHQpP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1lZS5sYXN0SW5kZXg9MDtlZS50ZXN0KHQpOykrK2U7cmV0dXJuIGV9KHQpOkx0KHQpfXZhciBzZT0iW29iamVjdCBNYXBdIixuZT0iW29iamVjdCBTZXRdIjtmdW5jdGlvbiBvZShlKXtpZihudWxsPT1lKXJldHVybiAwO2lmKFB0KGUpKXJldHVybiJzdHJpbmciPT10eXBlb2Yocj1lKXx8IXQocikmJmcocikmJm0ocik9PXF0P3JlKGUpOmUubGVuZ3RoO3ZhciByLHM9VnQoZSk7cmV0dXJuIHM9PXNlfHxzPT1uZT9lLnNpemU6TXQoZSkubGVuZ3RofWZ1bmN0aW9uIGllKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gdWUodCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gYWUodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbGUodCl7cmV0dXJuIHQhPXR9ZnVuY3Rpb24gaGUodCl7cmV0dXJuISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bGxdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe2lmKHVlKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiEoIWFlKHQpfHwiIiE9PXQpfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISFpZSh0KSYmMD09PXQubGVuZ3RofSh0KXx8ISFsZSh0KSkpKSl9ZnVuY3Rpb24gY2UodCl7cmV0dXJuISFpZSh0KSYmKDAhPT10Lmxlbmd0aCYmKDEhPT10Lmxlbmd0aHx8IWhlKHRbMF0pKSl9dmFyIGZlPSJbb2JqZWN0IEJvb2xlYW5dIjtmdW5jdGlvbiBtZSh0KXtyZXR1cm4hMD09PShlPXQpfHwhMT09PWV8fGcoZSkmJm0oZSk9PWZlO3ZhciBlfWZ1bmN0aW9uIGdlKHQpe3JldHVybiEoIWFlKHQpfHwiIj09PXQpfWZ1bmN0aW9uIHdlKHQpe2xldCBlPSExO2lmKGdlKHQpKWU9IWlzTmFOKE51bWJlcih0KSk7ZWxzZSBpZihmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCkpe2lmKGxlKHQpKXJldHVybiExO2U9ITB9cmV0dXJuIGV9dmFyIHBlPS9ccy87dmFyIGRlPS9eXHMrLztmdW5jdGlvbiB5ZSh0KXtyZXR1cm4gdD90LnNsaWNlKDAsZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmcGUudGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX0odCkrMSkucmVwbGFjZShkZSwiIik6dH12YXIgYmU9TmFOLE1lPS9eWy0rXTB4WzAtOWEtZl0rJC9pLHZlPS9eMGJbMDFdKyQvaSx4ZT0vXjBvWzAtN10rJC9pLEVlPXBhcnNlSW50O2Z1bmN0aW9uIFNlKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihwKHQpKXJldHVybiBiZTtpZihNKHQpKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdC52YWx1ZU9mP3QudmFsdWVPZigpOnQ7dD1NKGUpP2UrIiI6ZX1pZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD15ZSh0KTt2YXIgcj12ZS50ZXN0KHQpO3JldHVybiByfHx4ZS50ZXN0KHQpP0VlKHQuc2xpY2UoMikscj8yOjgpOk1lLnRlc3QodCk/YmU6K3R9dmFyIF9lPTEvMCxqZT0xNzk3NjkzMTM0ODYyMzE1N2UyOTI7ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQ/KHQ9U2UodCkpPT09X2V8fHQ9PT0tX2U/KHQ8MD8tMToxKSpqZTp0PT10P3Q6MDowPT09dD90OjB9dmFyIFJlPXMuaXNGaW5pdGUsSWU9TWF0aC5taW47dmFyIENlPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGhbdF07cmV0dXJuIGZ1bmN0aW9uKHQscil7aWYodD1TZSh0KSxyPW51bGw9PXI/MDpJZShmdW5jdGlvbih0KXt2YXIgZT1BZSh0KSxyPWUlMTtyZXR1cm4gZT09ZT9yP2UtcjplOjB9KHIpLDI5MiksciYmUmUodCkpe3ZhciBzPShodCh0KSsiZSIpLnNwbGl0KCJlIik7cmV0dXJuKygocz0oaHQoZShzWzBdKyJlIisoK3NbMV0rcikpKSsiZSIpLnNwbGl0KCJlIikpWzBdKyJlIisoK3NbMV0tcikpfXJldHVybiBlKHQpfX0oInJvdW5kIiksTmU9Q2U7ZnVuY3Rpb24ga2UodCxlPXt9KXtsZXQgcj13dChlLCJ1c2VDbGFtcFNhZmUiLG51bGwpO21lKHIpfHwocj0hMSk7bGV0IHM9d3QoZSwidXNlTGltaXRTYWZlIixudWxsKTttZShzKXx8KHM9ITEpO2xldCBuPXd0KGUsInJldHVybldpdGhTdGF0ZUFuZE1zZyIsbnVsbCk7bWUobil8fChuPSExKTtsZXQgbz10PT5uP3tzdGF0ZToic3VjY2VzcyIsbXNnOnR9OnQsaT10PT57aWYobilyZXR1cm57c3RhdGU6ImVycm9yIixtc2c6dH07dGhyb3cgbmV3IEVycm9yKHQpfTtpZighd2UodCkpcmV0dXJuIG8oMCk7bGV0IHU9bnVsbDt0cnl7dD1mdW5jdGlvbih0KXtyZXR1cm4gd2UodCk/QWUodCk6MH0odCksdT1OZSh0KSxyJiYodT5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUj91PU51bWJlci5NQVhfU0FGRV9JTlRFR0VSOnU8TnVtYmVyLk1JTl9TQUZFX0lOVEVHRVImJih1PU51bWJlci5NSU5fU0FGRV9JTlRFR0VSKSl9Y2F0Y2godCl7cmV0dXJuIGkodC50b1N0cmluZygpKX1yZXR1cm4gcyYmIU51bWJlci5pc1NhZmVJbnRlZ2VyKE51bWJlcih1KSk/aShgdlske3R9XSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTooIjAiPT09U3RyaW5nKHUpJiYodT0wKSxvKHUpKX1mdW5jdGlvbiBUZSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBGZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRmUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IE9lPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gVmUodCl7Y29uc3QgZT1PZS5jYWxsKHQpO3JldHVybiBlLmVuZHNXaXRoKCJBcnJheV0iKSYmIWUuaW5jbHVkZXMoIkJpZyIpfWZ1bmN0aW9uIHplKHQsZT17fSl7aWYoIVZlKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtsZXQgcjtpZih2b2lkIDAhPT1lLm91dHB1dCl7aWYoIVZlKGUub3V0cHV0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvdXRwdXQgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkgaWYgc3BlY2lmaWVkIik7cj1lLm91dHB1dH1lbHNlIHI9bmV3IEFycmF5KHQubGVuZ3RoKTtjb25zdCBzPWZ1bmN0aW9uKHQsZT17fSl7aWYoIVZlKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtjb25zdHtmcm9tSW5kZXg6cj0wLHRvSW5kZXg6cz10Lmxlbmd0aH09ZTtpZihyPDB8fHI+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihyKSl0aHJvdyBuZXcgRXJyb3IoImZyb21JbmRleCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gbGVuZ3RoIik7aWYoczw9cnx8cz50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocykpdGhyb3cgbmV3IEVycm9yKCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCIpO2xldCBuPXRbcl07Zm9yKGxldCBlPXIrMTtlPHM7ZSsrKXRbZV08biYmKG49dFtlXSk7cmV0dXJuIG59KHQpLG49ZnVuY3Rpb24odCxlPXt9KXtpZighVmUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO2NvbnN0e2Zyb21JbmRleDpyPTAsdG9JbmRleDpzPXQubGVuZ3RofT1lO2lmKHI8MHx8cj49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKHIpKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1yfHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7bGV0IG49dFtyXTtmb3IobGV0IGU9cisxO2U8cztlKyspdFtlXT5uJiYobj10W2VdKTtyZXR1cm4gbn0odCk7aWYocz09PW4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbmltdW0gYW5kIG1heGltdW0gaW5wdXQgdmFsdWVzIGFyZSBlcXVhbC4gQ2Fubm90IHJlc2NhbGUgYSBjb25zdGFudCBhcnJheSIpO2NvbnN0e21pbjpvPShlLmF1dG9NaW5NYXg/czowKSxtYXg6aT0oZS5hdXRvTWluTWF4P246MSl9PWU7aWYobz49aSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG9wdGlvbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXggb3B0aW9uIik7Y29uc3QgdT0oaS1vKS8obi1zKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylyW2VdPSh0W2VdLXMpKnUrbztyZXR1cm4gcn1jb25zdCBEZT0iICIucmVwZWF0KDIpLFBlPSIgIi5yZXBlYXQoNCk7ZnVuY3Rpb24gcWUodCxlPXt9KXtjb25zdHttYXhSb3dzOnI9MTUsbWF4Q29sdW1uczpzPTEwLG1heE51bVNpemU6bj04LHBhZE1pbnVzOm89ImF1dG8ifT1lO3JldHVybmAke3QuY29uc3RydWN0b3IubmFtZX0ge1xuJHtEZX1bXG4ke1BlfSR7ZnVuY3Rpb24odCxlLHIscyxuKXtjb25zdHtyb3dzOm8sY29sdW1uczppfT10LHU9TWF0aC5taW4obyxlKSxhPU1hdGgubWluKGksciksbD1bXTtpZigiYXV0byI9PT1uKXtuPSExO3Q6Zm9yKGxldCBlPTA7ZTx1O2UrKylmb3IobGV0IHI9MDtyPGE7cisrKWlmKHQuZ2V0KGUscik8MCl7bj0hMDticmVhayB0fX1mb3IobGV0IGU9MDtlPHU7ZSsrKXtsZXQgcj1bXTtmb3IobGV0IG89MDtvPGE7bysrKXIucHVzaCgkZSh0LmdldChlLG8pLHMsbikpO2wucHVzaChgJHtyLmpvaW4oIiAiKX1gKX1hIT09aSYmKGxbbC5sZW5ndGgtMV0rPWAgLi4uICR7aS1yfSBtb3JlIGNvbHVtbnNgKTt1IT09byYmbC5wdXNoKGAuLi4gJHtvLWV9IG1vcmUgcm93c2ApO3JldHVybiBsLmpvaW4oYFxuJHtQZX1gKX0odCxyLHMsbixvKX1cbiR7RGV9XVxuJHtEZX1yb3dzOiAke3Qucm93c31cbiR7RGV9Y29sdW1uczogJHt0LmNvbHVtbnN9XG59YH1mdW5jdGlvbiAkZSh0LGUscil7cmV0dXJuKHQ+PTAmJnI/YCAke0xlKHQsZS0xKX1gOkxlKHQsZSkpLnBhZEVuZChlKX1mdW5jdGlvbiBMZSh0LGUpe2xldCByPXQudG9TdHJpbmcoKTtpZihyLmxlbmd0aDw9ZSlyZXR1cm4gcjtsZXQgcz10LnRvRml4ZWQoZSk7aWYocy5sZW5ndGg+ZSYmKHM9dC50b0ZpeGVkKE1hdGgubWF4KDAsZS0ocy5sZW5ndGgtZSkpKSkscy5sZW5ndGg8PWUmJiFzLnN0YXJ0c1dpdGgoIjAuMDAwIikmJiFzLnN0YXJ0c1dpdGgoIi0wLjAwMCIpKXJldHVybiBzO2xldCBuPXQudG9FeHBvbmVudGlhbChlKTtyZXR1cm4gbi5sZW5ndGg+ZSYmKG49dC50b0V4cG9uZW50aWFsKE1hdGgubWF4KDAsZS0obi5sZW5ndGgtZSkpKSksbi5zbGljZSgwKX1mdW5jdGlvbiBVZSh0LGUscil7bGV0IHM9cj90LnJvd3M6dC5yb3dzLTE7aWYoZTwwfHxlPnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlJvdyBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBHZSh0LGUscil7bGV0IHM9cj90LmNvbHVtbnM6dC5jb2x1bW5zLTE7aWYoZTwwfHxlPnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBCZSh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMiKTtyZXR1cm4gZX1mdW5jdGlvbiBXZSh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJvd3MiKTtyZXR1cm4gZX1mdW5jdGlvbiBLZSh0LGUpe2lmKCFWZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyb3cgaW5kaWNlcyBtdXN0IGJlIGFuIGFycmF5Iik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXTwwfHxlW3JdPj10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInJvdyBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBRZSh0LGUpe2lmKCFWZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW4gaW5kaWNlcyBtdXN0IGJlIGFuIGFycmF5Iik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXTwwfHxlW3JdPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImNvbHVtbiBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBYZSh0LGUscixzLG4pe2lmKDUhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJleHBlY3RlZCA0IGFyZ3VtZW50cyIpO2lmKEplKCJzdGFydFJvdyIsZSksSmUoImVuZFJvdyIsciksSmUoInN0YXJ0Q29sdW1uIixzKSxKZSgiZW5kQ29sdW1uIixuKSxlPnJ8fHM+bnx8ZTwwfHxlPj10LnJvd3N8fHI8MHx8cj49dC5yb3dzfHxzPDB8fHM+PXQuY29sdW1uc3x8bjwwfHxuPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlN1Ym1hdHJpeCBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBZZSh0LGU9MCl7bGV0IHI9W107Zm9yKGxldCBzPTA7czx0O3MrKylyLnB1c2goZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gSmUodCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0fSBtdXN0IGJlIGEgbnVtYmVyYCl9ZnVuY3Rpb24gSGUodCl7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJFbXB0eSBtYXRyaXggaGFzIG5vIGVsZW1lbnRzIHRvIGluZGV4Iil9Y2xhc3MgWmV7c3RhdGljIGZyb20xREFycmF5KHQsZSxyKXtpZih0KmUhPT1yLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZGF0YSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggZ2l2ZW4gZGltZW5zaW9ucyIpO2xldCBzPW5ldyBlcih0LGUpO2ZvcihsZXQgbj0wO248dDtuKyspZm9yKGxldCB0PTA7dDxlO3QrKylzLnNldChuLHQscltuKmUrdF0pO3JldHVybiBzfXN0YXRpYyByb3dWZWN0b3IodCl7bGV0IGU9bmV3IGVyKDEsdC5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWUuc2V0KDAscix0W3JdKTtyZXR1cm4gZX1zdGF0aWMgY29sdW1uVmVjdG9yKHQpe2xldCBlPW5ldyBlcih0Lmxlbmd0aCwxKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldChyLDAsdFtyXSk7cmV0dXJuIGV9c3RhdGljIHplcm9zKHQsZSl7cmV0dXJuIG5ldyBlcih0LGUpfXN0YXRpYyBvbmVzKHQsZSl7cmV0dXJuIG5ldyBlcih0LGUpLmZpbGwoMSl9c3RhdGljIHJhbmQodCxlLHI9e30pe2lmKCJvYmplY3QiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cmFuZG9tOnM9TWF0aC5yYW5kb219PXI7bGV0IG49bmV3IGVyKHQsZSk7Zm9yKGxldCByPTA7cjx0O3IrKylmb3IobGV0IHQ9MDt0PGU7dCsrKW4uc2V0KHIsdCxzKCkpO3JldHVybiBufXN0YXRpYyByYW5kSW50KHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjpzPTAsbWF4Om49MWUzLHJhbmRvbTpvPU1hdGgucmFuZG9tfT1yO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGFuIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYocz49bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBpPW4tcyx1PW5ldyBlcih0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9cytNYXRoLnJvdW5kKG8oKSppKTt1LnNldChyLHQsZSl9cmV0dXJuIHV9c3RhdGljIGV5ZSh0LGUscil7dm9pZCAwPT09ZSYmKGU9dCksdm9pZCAwPT09ciYmKHI9MSk7bGV0IHM9TWF0aC5taW4odCxlKSxuPXRoaXMuemVyb3ModCxlKTtmb3IobGV0IHQ9MDt0PHM7dCsrKW4uc2V0KHQsdCxyKTtyZXR1cm4gbn1zdGF0aWMgZGlhZyh0LGUscil7bGV0IHM9dC5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9cyksdm9pZCAwPT09ciYmKHI9ZSk7bGV0IG49TWF0aC5taW4ocyxlLHIpLG89dGhpcy56ZXJvcyhlLHIpO2ZvcihsZXQgZT0wO2U8bjtlKyspby5zZXQoZSxlLHRbZV0pO3JldHVybiBvfXN0YXRpYyBtaW4odCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxzPXQuY29sdW1ucyxuPW5ldyBlcihyLHMpO2ZvcihsZXQgbz0wO288cjtvKyspZm9yKGxldCByPTA7cjxzO3IrKyluLnNldChvLHIsTWF0aC5taW4odC5nZXQobyxyKSxlLmdldChvLHIpKSk7cmV0dXJuIG59c3RhdGljIG1heCh0LGUpe3Q9dGhpcy5jaGVja01hdHJpeCh0KSxlPXRoaXMuY2hlY2tNYXRyaXgoZSk7bGV0IHI9dC5yb3dzLHM9dC5jb2x1bW5zLG49bmV3IHRoaXMocixzKTtmb3IobGV0IG89MDtvPHI7bysrKWZvcihsZXQgcj0wO3I8cztyKyspbi5zZXQobyxyLE1hdGgubWF4KHQuZ2V0KG8sciksZS5nZXQobyxyKSkpO3JldHVybiBufXN0YXRpYyBjaGVja01hdHJpeCh0KXtyZXR1cm4gWmUuaXNNYXRyaXgodCk/dDpuZXcgZXIodCl9c3RhdGljIGlzTWF0cml4KHQpe3JldHVybiBudWxsIT10JiYiTWF0cml4Ij09PXQua2xhc3N9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5yb3dzKnRoaXMuY29sdW1uc31hcHBseSh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuY2FsbCh0aGlzLGUscik7cmV0dXJuIHRoaXN9dG8xREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnB1c2godGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9dG8yREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXt0LnB1c2goW10pO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0W2VdLnB1c2godGhpcy5nZXQoZSxyKSl9cmV0dXJuIHR9dG9KU09OKCl7cmV0dXJuIHRoaXMudG8yREFycmF5KCl9aXNSb3dWZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMucm93c31pc0NvbHVtblZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5jb2x1bW5zfWlzVmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N8fDE9PT10aGlzLmNvbHVtbnN9aXNTcXVhcmUoKXtyZXR1cm4gdGhpcy5yb3dzPT09dGhpcy5jb2x1bW5zfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMucm93c3x8MD09PXRoaXMuY29sdW1uc31pc1N5bW1ldHJpYygpe2lmKHRoaXMuaXNTcXVhcmUoKSl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8PXQ7ZSsrKWlmKHRoaXMuZ2V0KHQsZSkhPT10aGlzLmdldChlLHQpKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWlzRGlzdGFuY2UoKXtpZighdGhpcy5pc1N5bW1ldHJpYygpKXJldHVybiExO2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylpZigwIT09dGhpcy5nZXQodCx0KSlyZXR1cm4hMTtyZXR1cm4hMH1pc0VjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAscj0tMSxzPSEwLG49ITE7Zm9yKDt0PHRoaXMucm93cyYmczspe2ZvcihlPTAsbj0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1uOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+cj8obj0hMCxyPWUpOihzPSExLG49ITApO3QrK31yZXR1cm4gc31pc1JlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PTAsZT0wLHI9LTEscz0hMCxuPSExO2Zvcig7dDx0aGlzLnJvd3MmJnM7KXtmb3IoZT0wLG49ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09bjspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPnI/KG49ITAscj1lKToocz0hMSxuPSEwKTtmb3IobGV0IHI9ZSsxO3I8dGhpcy5yb3dzO3IrKykwIT09dGhpcy5nZXQodCxyKSYmKHM9ITEpO3QrK31yZXR1cm4gc31lY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuY2xvbmUoKSxlPTAscj0wO2Zvcig7ZTx0LnJvd3MmJnI8dC5jb2x1bW5zOyl7bGV0IHM9ZTtmb3IobGV0IG49ZTtuPHQucm93cztuKyspdC5nZXQobixyKT50LmdldChzLHIpJiYocz1uKTtpZigwPT09dC5nZXQocyxyKSlyKys7ZWxzZXt0LnN3YXBSb3dzKGUscyk7bGV0IG49dC5nZXQoZSxyKTtmb3IobGV0IHM9cjtzPHQuY29sdW1ucztzKyspdC5zZXQoZSxzLHQuZ2V0KGUscykvbik7Zm9yKGxldCBzPWUrMTtzPHQucm93cztzKyspe2xldCBuPXQuZ2V0KHMscikvdC5nZXQoZSxyKTt0LnNldChzLHIsMCk7Zm9yKGxldCBvPXIrMTtvPHQuY29sdW1ucztvKyspdC5zZXQocyxvLHQuZ2V0KHMsbyktdC5nZXQoZSxvKSpuKX1lKysscisrfX1yZXR1cm4gdH1yZWR1Y2VkRWNoZWxvbkZvcm0oKXtsZXQgdD10aGlzLmVjaGVsb25Gb3JtKCksZT10LmNvbHVtbnMscj10LnJvd3Mscz1yLTE7Zm9yKDtzPj0wOylpZigwPT09dC5tYXhSb3cocykpcy0tO2Vsc2V7bGV0IG49MCxvPSExO2Zvcig7bjxyJiYhMT09PW87KTE9PT10LmdldChzLG4pP289ITA6bisrO2ZvcihsZXQgcj0wO3I8cztyKyspe2xldCBvPXQuZ2V0KHIsbik7Zm9yKGxldCBpPW47aTxlO2krKyl7bGV0IGU9dC5nZXQocixpKS1vKnQuZ2V0KHMsaSk7dC5zZXQocixpLGUpfX1zLS19cmV0dXJuIHR9c2V0KCl7dGhyb3cgbmV3IEVycm9yKCJzZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQiKX1nZXQoKXt0aHJvdyBuZXcgRXJyb3IoImdldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfXJlcGVhdCh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3Jvd3M6ZT0xLGNvbHVtbnM6cj0xfT10O2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGUpfHxlPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoInJvd3MgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihyKXx8cjw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7bGV0IHM9bmV3IGVyKHRoaXMucm93cyplLHRoaXMuY29sdW1ucypyKTtmb3IobGV0IHQ9MDt0PGU7dCsrKWZvcihsZXQgZT0wO2U8cjtlKyspcy5zZXRTdWJNYXRyaXgodGhpcyx0aGlzLnJvd3MqdCx0aGlzLmNvbHVtbnMqZSk7cmV0dXJuIHN9ZmlsbCh0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0KTtyZXR1cm4gdGhpc31uZWcoKXtyZXR1cm4gdGhpcy5tdWxTKC0xKX1nZXRSb3codCl7VWUodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspZS5wdXNoKHRoaXMuZ2V0KHQscikpO3JldHVybiBlfWdldFJvd1ZlY3Rvcih0KXtyZXR1cm4gZXIucm93VmVjdG9yKHRoaXMuZ2V0Um93KHQpKX1zZXRSb3codCxlKXtVZSh0aGlzLHQpLGU9QmUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQodCxyLGVbcl0pO3JldHVybiB0aGlzfXN3YXBSb3dzKHQsZSl7VWUodGhpcyx0KSxVZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl7bGV0IHM9dGhpcy5nZXQodCxyKTt0aGlzLnNldCh0LHIsdGhpcy5nZXQoZSxyKSksdGhpcy5zZXQoZSxyLHMpfXJldHVybiB0aGlzfWdldENvbHVtbih0KXtHZSh0aGlzLHQpO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyllLnB1c2godGhpcy5nZXQocix0KSk7cmV0dXJuIGV9Z2V0Q29sdW1uVmVjdG9yKHQpe3JldHVybiBlci5jb2x1bW5WZWN0b3IodGhpcy5nZXRDb2x1bW4odCkpfXNldENvbHVtbih0LGUpe0dlKHRoaXMsdCksZT1XZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsZVtyXSk7cmV0dXJuIHRoaXN9c3dhcENvbHVtbnModCxlKXtHZSh0aGlzLHQpLEdlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtsZXQgcz10aGlzLmdldChyLHQpO3RoaXMuc2V0KHIsdCx0aGlzLmdldChyLGUpKSx0aGlzLnNldChyLGUscyl9cmV0dXJuIHRoaXN9YWRkUm93VmVjdG9yKHQpe3Q9QmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3Rbcl0pO3JldHVybiB0aGlzfXN1YlJvd1ZlY3Rvcih0KXt0PUJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10W3JdKTtyZXR1cm4gdGhpc31tdWxSb3dWZWN0b3IodCl7dD1CZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdFtyXSk7cmV0dXJuIHRoaXN9ZGl2Um93VmVjdG9yKHQpe3Q9QmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3Rbcl0pO3JldHVybiB0aGlzfWFkZENvbHVtblZlY3Rvcih0KXt0PVdlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0W2VdKTtyZXR1cm4gdGhpc31zdWJDb2x1bW5WZWN0b3IodCl7dD1XZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdFtlXSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uVmVjdG9yKHQpe3Q9V2UodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnRbZV0pO3JldHVybiB0aGlzfWRpdkNvbHVtblZlY3Rvcih0KXt0PVdlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90W2VdKTtyZXR1cm4gdGhpc31tdWxSb3codCxlKXtVZSh0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldCh0LHIsdGhpcy5nZXQodCxyKSplKTtyZXR1cm4gdGhpc31tdWxDb2x1bW4odCxlKXtHZSh0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsdGhpcy5nZXQocix0KSplKTtyZXR1cm4gdGhpc31tYXgodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtzd2l0Y2godCl7Y2FzZSJyb3ciOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLnJvd3MpLmZpbGwoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dFtlXSYmKHRbZV09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSJjb2x1bW4iOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLmNvbHVtbnMpLmZpbGwoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dFtyXSYmKHRbcl09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSB2b2lkIDA6e2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1tYXhJbmRleCgpe0hlKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBzPTA7czx0aGlzLmNvbHVtbnM7cysrKXRoaXMuZ2V0KHIscyk+dCYmKHQ9dGhpcy5nZXQocixzKSxlWzBdPXIsZVsxXT1zKTtyZXR1cm4gZX1taW4odCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtzd2l0Y2godCl7Y2FzZSJyb3ciOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLnJvd3MpLmZpbGwoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik8dFtlXSYmKHRbZV09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSJjb2x1bW4iOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLmNvbHVtbnMpLmZpbGwoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik8dFtyXSYmKHRbcl09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSB2b2lkIDA6e2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPHQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1taW5JbmRleCgpe0hlKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBzPTA7czx0aGlzLmNvbHVtbnM7cysrKXRoaXMuZ2V0KHIscyk8dCYmKHQ9dGhpcy5nZXQocixzKSxlWzBdPXIsZVsxXT1zKTtyZXR1cm4gZX1tYXhSb3codCl7aWYoVWUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik+ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWF4Um93SW5kZXgodCl7VWUodGhpcyx0KSxIZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBzPTE7czx0aGlzLmNvbHVtbnM7cysrKXRoaXMuZ2V0KHQscyk+ZSYmKGU9dGhpcy5nZXQodCxzKSxyWzFdPXMpO3JldHVybiByfW1pblJvdyh0KXtpZihVZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IHI9MTtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQodCxyKTxlJiYoZT10aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1taW5Sb3dJbmRleCh0KXtVZSh0aGlzLHQpLEhlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KHQsMCkscj1bdCwwXTtmb3IobGV0IHM9MTtzPHRoaXMuY29sdW1ucztzKyspdGhpcy5nZXQodCxzKTxlJiYoZT10aGlzLmdldCh0LHMpLHJbMV09cyk7cmV0dXJuIHJ9bWF4Q29sdW1uKHQpe2lmKEdlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPmUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1heENvbHVtbkluZGV4KHQpe0dlKHRoaXMsdCksSGUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgcz0xO3M8dGhpcy5yb3dzO3MrKyl0aGlzLmdldChzLHQpPmUmJihlPXRoaXMuZ2V0KHMsdCksclswXT1zKTtyZXR1cm4gcn1taW5Db2x1bW4odCl7aWYoR2UodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCByPTE7cjx0aGlzLnJvd3M7cisrKXRoaXMuZ2V0KHIsdCk8ZSYmKGU9dGhpcy5nZXQocix0KSk7cmV0dXJuIGV9bWluQ29sdW1uSW5kZXgodCl7R2UodGhpcyx0KSxIZSh0aGlzKTtsZXQgZT10aGlzLmdldCgwLHQpLHI9WzAsdF07Zm9yKGxldCBzPTE7czx0aGlzLnJvd3M7cysrKXRoaXMuZ2V0KHMsdCk8ZSYmKGU9dGhpcy5nZXQocyx0KSxyWzBdPXMpO3JldHVybiByfWRpYWcoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMuZ2V0KHIscikpO3JldHVybiBlfW5vcm0odD0iZnJvYmVuaXVzIil7c3dpdGNoKHQpe2Nhc2UibWF4IjpyZXR1cm4gdGhpcy5tYXgoKTtjYXNlImZyb2Jlbml1cyI6cmV0dXJuIE1hdGguc3FydCh0aGlzLmRvdCh0aGlzKSk7ZGVmYXVsdDp0aHJvdyBuZXcgUmFuZ2VFcnJvcihgdW5rbm93biBub3JtIHR5cGU6ICR7dH1gKX19Y3VtdWxhdGl2ZVN1bSgpe2xldCB0PTA7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0Kz10aGlzLmdldChlLHIpLHRoaXMuc2V0KGUscix0KTtyZXR1cm4gdGhpc31kb3QodCl7WmUuaXNNYXRyaXgodCkmJih0PXQudG8xREFycmF5KCkpO2xldCBlPXRoaXMudG8xREFycmF5KCk7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9ycyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIik7bGV0IHI9MDtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrKylyKz1lW3NdKnRbc107cmV0dXJuIHJ9bW11bCh0KXt0PWVyLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMucm93cyxyPXRoaXMuY29sdW1ucyxzPXQuY29sdW1ucyxuPW5ldyBlcihlLHMpLG89bmV3IEZsb2F0NjRBcnJheShyKTtmb3IobGV0IGk9MDtpPHM7aSsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKW9bZV09dC5nZXQoZSxpKTtmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT0wO2ZvcihsZXQgcz0wO3M8cjtzKyspZSs9dGhpcy5nZXQodCxzKSpvW3NdO24uc2V0KHQsaSxlKX19cmV0dXJuIG59bXBvdyh0KXtpZighdGhpcy5pc1NxdWFyZSgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaXggbXVzdCBiZSBzcXVhcmUiKTtpZighTnVtYmVyLmlzSW50ZWdlcih0KXx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJFeHBvbmVudCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIiKTtsZXQgZT1lci5leWUodGhpcy5yb3dzKSxyPXRoaXM7Zm9yKGxldCBzPXQ7cz49MTtzLz0yKTAhPSgxJnMpJiYoZT1lLm1tdWwocikpLHI9ci5tbXVsKHIpO3JldHVybiBlfXN0cmFzc2VuMngyKHQpe3Q9ZXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IGVyKDIsMik7Y29uc3Qgcj10aGlzLmdldCgwLDApLHM9dC5nZXQoMCwwKSxuPXRoaXMuZ2V0KDAsMSksbz10LmdldCgwLDEpLGk9dGhpcy5nZXQoMSwwKSx1PXQuZ2V0KDEsMCksYT10aGlzLmdldCgxLDEpLGw9dC5nZXQoMSwxKSxoPShyK2EpKihzK2wpLGM9KGkrYSkqcyxmPXIqKG8tbCksbT1hKih1LXMpLGc9KHIrbikqbCx3PWgrbS1nKyhuLWEpKih1K2wpLHA9ZitnLGQ9YyttLHk9aC1jK2YrKGktcikqKHMrbyk7cmV0dXJuIGUuc2V0KDAsMCx3KSxlLnNldCgwLDEscCksZS5zZXQoMSwwLGQpLGUuc2V0KDEsMSx5KSxlfXN0cmFzc2VuM3gzKHQpe3Q9ZXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IGVyKDMsMyk7Y29uc3Qgcj10aGlzLmdldCgwLDApLHM9dGhpcy5nZXQoMCwxKSxuPXRoaXMuZ2V0KDAsMiksbz10aGlzLmdldCgxLDApLGk9dGhpcy5nZXQoMSwxKSx1PXRoaXMuZ2V0KDEsMiksYT10aGlzLmdldCgyLDApLGw9dGhpcy5nZXQoMiwxKSxoPXRoaXMuZ2V0KDIsMiksYz10LmdldCgwLDApLGY9dC5nZXQoMCwxKSxtPXQuZ2V0KDAsMiksZz10LmdldCgxLDApLHc9dC5nZXQoMSwxKSxwPXQuZ2V0KDEsMiksZD10LmdldCgyLDApLHk9dC5nZXQoMiwxKSxiPXQuZ2V0KDIsMiksTT0oci1vKSooLWYrdyksdj0oLXIrbytpKSooYy1mK3cpLHg9KG8raSkqKC1jK2YpLEU9cipjLFM9KC1yK2ErbCkqKGMtbStwKSxfPSgtcithKSoobS1wKSxqPShhK2wpKigtYyttKSxBPSgtbitsK2gpKih3K2QteSksUj0obi1oKSoody15KSxJPW4qZCxDPShsK2gpKigtZCt5KSxOPSgtbitpK3UpKihwK2QtYiksaz0obi11KSoocC1iKSxUPShpK3UpKigtZCtiKSxGPUUrSStzKmcsTz0ocitzK24tby1pLWwtaCkqdyt2K3grRStBK0krQyxWPUUrUytqKyhyK3Mrbi1pLXUtYS1sKSpwK0krTitULHo9TStpKigtYytmK2ctdy1wLWQrYikrditFK0krTitrLEQ9TSt2K3grRSt1KnksUD1JK04raytUK28qbSxxPUUrUytfK2wqKC1jK20rZy13LXAtZCt5KStBK1IrSSwkPUErUitJK0MrYSpmLEw9RStTK18raitoKmI7cmV0dXJuIGUuc2V0KDAsMCxGKSxlLnNldCgwLDEsTyksZS5zZXQoMCwyLFYpLGUuc2V0KDEsMCx6KSxlLnNldCgxLDEsRCksZS5zZXQoMSwyLFApLGUuc2V0KDIsMCxxKSxlLnNldCgyLDEsJCksZS5zZXQoMiwyLEwpLGV9bW11bFN0cmFzc2VuKHQpe3Q9ZXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5jbG9uZSgpLHI9ZS5yb3dzLHM9ZS5jb2x1bW5zLG49dC5yb3dzLG89dC5jb2x1bW5zO2Z1bmN0aW9uIGkodCxlLHIpe2xldCBzPXQucm93cyxuPXQuY29sdW1ucztpZihzPT09ZSYmbj09PXIpcmV0dXJuIHQ7e2xldCBzPVplLnplcm9zKGUscik7cmV0dXJuIHM9cy5zZXRTdWJNYXRyaXgodCwwLDApLHN9fXMhPT1uJiZjb25zb2xlLndhcm4oYE11bHRpcGx5aW5nICR7cn0geCAke3N9IGFuZCAke259IHggJHtvfSBtYXRyaXg6IGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoLmApO2xldCB1PU1hdGgubWF4KHIsbiksYT1NYXRoLm1heChzLG8pO3JldHVybiBlPWkoZSx1LGEpLGZ1bmN0aW9uIHQoZSxyLHMsbil7aWYoczw9NTEyfHxuPD01MTIpcmV0dXJuIGUubW11bChyKTtzJTI9PTEmJm4lMj09MT8oZT1pKGUscysxLG4rMSkscj1pKHIscysxLG4rMSkpOnMlMj09MT8oZT1pKGUscysxLG4pLHI9aShyLHMrMSxuKSk6biUyPT0xJiYoZT1pKGUscyxuKzEpLHI9aShyLHMsbisxKSk7bGV0IG89cGFyc2VJbnQoZS5yb3dzLzIsMTApLHU9cGFyc2VJbnQoZS5jb2x1bW5zLzIsMTApLGE9ZS5zdWJNYXRyaXgoMCxvLTEsMCx1LTEpLGw9ci5zdWJNYXRyaXgoMCxvLTEsMCx1LTEpLGg9ZS5zdWJNYXRyaXgoMCxvLTEsdSxlLmNvbHVtbnMtMSksYz1yLnN1Yk1hdHJpeCgwLG8tMSx1LHIuY29sdW1ucy0xKSxmPWUuc3ViTWF0cml4KG8sZS5yb3dzLTEsMCx1LTEpLG09ci5zdWJNYXRyaXgobyxyLnJvd3MtMSwwLHUtMSksZz1lLnN1Yk1hdHJpeChvLGUucm93cy0xLHUsZS5jb2x1bW5zLTEpLHc9ci5zdWJNYXRyaXgobyxyLnJvd3MtMSx1LHIuY29sdW1ucy0xKSxwPXQoWmUuYWRkKGEsZyksWmUuYWRkKGwsdyksbyx1KSxkPXQoWmUuYWRkKGYsZyksbCxvLHUpLHk9dChhLFplLnN1YihjLHcpLG8sdSksYj10KGcsWmUuc3ViKG0sbCksbyx1KSxNPXQoWmUuYWRkKGEsaCksdyxvLHUpLHY9dChaZS5zdWIoZixhKSxaZS5hZGQobCxjKSxvLHUpLHg9dChaZS5zdWIoaCxnKSxaZS5hZGQobSx3KSxvLHUpLEU9WmUuYWRkKHAsYik7RS5zdWIoTSksRS5hZGQoeCk7bGV0IFM9WmUuYWRkKHksTSksXz1aZS5hZGQoZCxiKSxqPVplLnN1YihwLGQpO2ouYWRkKHkpLGouYWRkKHYpO2xldCBBPVplLnplcm9zKDIqRS5yb3dzLDIqRS5jb2x1bW5zKTtyZXR1cm4gQT1BLnNldFN1Yk1hdHJpeChFLDAsMCksQT1BLnNldFN1Yk1hdHJpeChTLEUucm93cywwKSxBPUEuc2V0U3ViTWF0cml4KF8sMCxFLmNvbHVtbnMpLEE9QS5zZXRTdWJNYXRyaXgoaixFLnJvd3MsRS5jb2x1bW5zKSxBLnN1Yk1hdHJpeCgwLHMtMSwwLG4tMSl9KGUsdD1pKHQsdSxhKSx1LGEpfXNjYWxlUm93cyh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjplPTAsbWF4OnI9MX09dDtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIU51bWJlci5pc0Zpbml0ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhIG51bWJlciIpO2lmKGU+PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgcz1uZXcgZXIodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKXtjb25zdCBuPXRoaXMuZ2V0Um93KHQpO24ubGVuZ3RoPjAmJnplKG4se21pbjplLG1heDpyLG91dHB1dDpufSkscy5zZXRSb3codCxuKX1yZXR1cm4gc31zY2FsZUNvbHVtbnModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IHM9bmV3IGVyKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyl7Y29uc3Qgbj10aGlzLmdldENvbHVtbih0KTtuLmxlbmd0aCYmemUobix7bWluOmUsbWF4OnIsb3V0cHV0Om59KSxzLnNldENvbHVtbih0LG4pfXJldHVybiBzfWZsaXBSb3dzKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5jb2x1bW5zLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChlLHIpLHM9dGhpcy5nZXQoZSx0aGlzLmNvbHVtbnMtMS1yKTt0aGlzLnNldChlLHIscyksdGhpcy5zZXQoZSx0aGlzLmNvbHVtbnMtMS1yLHQpfXJldHVybiB0aGlzfWZsaXBDb2x1bW5zKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5yb3dzLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChyLGUpLHM9dGhpcy5nZXQodGhpcy5yb3dzLTEtcixlKTt0aGlzLnNldChyLGUscyksdGhpcy5zZXQodGhpcy5yb3dzLTEtcixlLHQpfXJldHVybiB0aGlzfWtyb25lY2tlclByb2R1Y3QodCl7dD1lci5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMscz10LnJvd3Msbj10LmNvbHVtbnMsbz1uZXcgZXIoZSpzLHIqbik7Zm9yKGxldCBpPTA7aTxlO2krKylmb3IobGV0IGU9MDtlPHI7ZSsrKWZvcihsZXQgcj0wO3I8cztyKyspZm9yKGxldCB1PTA7dTxuO3UrKylvLnNldChzKmkrcixuKmUrdSx0aGlzLmdldChpLGUpKnQuZ2V0KHIsdSkpO3JldHVybiBvfWtyb25lY2tlclN1bSh0KXtpZih0PWVyLmNoZWNrTWF0cml4KHQpLCF0aGlzLmlzU3F1YXJlKCl8fCF0LmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJLcm9uZWNrZXIgU3VtIG5lZWRzIHR3byBTcXVhcmUgTWF0cmljZXMiKTtsZXQgZT10aGlzLnJvd3Mscj10LnJvd3Mscz10aGlzLmtyb25lY2tlclByb2R1Y3QoZXIuZXllKHIscikpLG49ZXIuZXllKGUsZSkua3JvbmVja2VyUHJvZHVjdCh0KTtyZXR1cm4gcy5hZGQobil9dHJhbnNwb3NlKCl7bGV0IHQ9bmV3IGVyKHRoaXMuY29sdW1ucyx0aGlzLnJvd3MpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQocixlLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXNvcnRSb3dzKHQ9dHIpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl0aGlzLnNldFJvdyhlLHRoaXMuZ2V0Um93KGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXNvcnRDb2x1bW5zKHQ9dHIpe2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldENvbHVtbihlLHRoaXMuZ2V0Q29sdW1uKGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXN1Yk1hdHJpeCh0LGUscixzKXtYZSh0aGlzLHQsZSxyLHMpO2xldCBuPW5ldyBlcihlLXQrMSxzLXIrMSk7Zm9yKGxldCBvPXQ7bzw9ZTtvKyspZm9yKGxldCBlPXI7ZTw9cztlKyspbi5zZXQoby10LGUtcix0aGlzLmdldChvLGUpKTtyZXR1cm4gbn1zdWJNYXRyaXhSb3codCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMuY29sdW1ucy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5jb2x1bW5zfHxyPDB8fHI+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IHM9bmV3IGVyKHQubGVuZ3RoLHItZSsxKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylmb3IobGV0IG89ZTtvPD1yO28rKyl7aWYodFtuXTwwfHx0W25dPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFJvdyBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtuXX1gKTtzLnNldChuLG8tZSx0aGlzLmdldCh0W25dLG8pKX1yZXR1cm4gc31zdWJNYXRyaXhDb2x1bW4odCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMucm93cy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5yb3dzfHxyPDB8fHI+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IHM9bmV3IGVyKHItZSsxLHQubGVuZ3RoKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylmb3IobGV0IG89ZTtvPD1yO28rKyl7aWYodFtuXTwwfHx0W25dPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtuXX1gKTtzLnNldChvLWUsbix0aGlzLmdldChvLHRbbl0pKX1yZXR1cm4gc31zZXRTdWJNYXRyaXgodCxlLHIpe2lmKCh0PWVyLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7WGUodGhpcyxlLGUrdC5yb3dzLTEscixyK3QuY29sdW1ucy0xKTtmb3IobGV0IHM9MDtzPHQucm93cztzKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXRoaXMuc2V0KGUrcyxyK24sdC5nZXQocyxuKSk7cmV0dXJuIHRoaXN9c2VsZWN0aW9uKHQsZSl7S2UodGhpcyx0KSxRZSh0aGlzLGUpO2xldCByPW5ldyBlcih0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCBzPTA7czx0Lmxlbmd0aDtzKyspe2xldCBuPXRbc107Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBvPWVbdF07ci5zZXQocyx0LHRoaXMuZ2V0KG4sbykpfX1yZXR1cm4gcn10cmFjZSgpe2xldCB0PU1hdGgubWluKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpLGU9MDtmb3IobGV0IHI9MDtyPHQ7cisrKWUrPXRoaXMuZ2V0KHIscik7cmV0dXJuIGV9Y2xvbmUoKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb3B5KHRoaXMsbmV3IGVyKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpKX1zdGF0aWMgY29weSh0LGUpe2Zvcihjb25zdFtyLHMsbl1vZiB0LmVudHJpZXMoKSllLnNldChyLHMsbik7cmV0dXJuIGV9c3VtKHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPVllKHQucm93cyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zOysrcyllW3JdKz10LmdldChyLHMpO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPVllKHQuY29sdW1ucyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zOysrcyllW3NdKz10LmdldChyLHMpO3JldHVybiBlfSh0aGlzKTtjYXNlIHZvaWQgMDpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9MDtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7cysrKWUrPXQuZ2V0KHIscyk7cmV0dXJuIGV9KHRoaXMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1wcm9kdWN0KHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPVllKHQucm93cywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7KytzKWVbcl0qPXQuZ2V0KHIscyk7cmV0dXJuIGV9KHRoaXMpO2Nhc2UiY29sdW1uIjpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9WWUodC5jb2x1bW5zLDEpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IHM9MDtzPHQuY29sdW1uczsrK3MpZVtzXSo9dC5nZXQocixzKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTE7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zO3MrKyllKj10LmdldChyLHMpO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWVhbih0KXtjb25zdCBlPXRoaXMuc3VtKHQpO3N3aXRjaCh0KXtjYXNlInJvdyI6Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWVbdF0vPXRoaXMuY29sdW1ucztyZXR1cm4gZTtjYXNlImNvbHVtbiI6Zm9yKGxldCB0PTA7dDx0aGlzLmNvbHVtbnM7dCsrKWVbdF0vPXRoaXMucm93cztyZXR1cm4gZTtjYXNlIHZvaWQgMDpyZXR1cm4gZS90aGlzLnNpemU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXZhcmlhbmNlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3VuYmlhc2VkOnI9ITAsbWVhbjpzPXRoaXMubWVhbih0KX09ZTtpZigiYm9vbGVhbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInVuYmlhc2VkIG11c3QgYmUgYSBib29sZWFuIik7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighVmUocykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBzPXQucm93cyxuPXQuY29sdW1ucyxvPVtdO2ZvcihsZXQgaT0wO2k8cztpKyspe2xldCBzPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG47ZSsrKWE9dC5nZXQoaSxlKS1yW2ldLHMrPWEsdSs9YSphO2U/by5wdXNoKCh1LXMqcy9uKS8obi0xKSk6by5wdXNoKCh1LXMqcy9uKS9uKX1yZXR1cm4gb30odGhpcyxyLHMpO2Nhc2UiY29sdW1uIjppZighVmUocykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBzPXQucm93cyxuPXQuY29sdW1ucyxvPVtdO2ZvcihsZXQgaT0wO2k8bjtpKyspe2xldCBuPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPHM7ZSsrKWE9dC5nZXQoZSxpKS1yW2ldLG4rPWEsdSs9YSphO2U/by5wdXNoKCh1LW4qbi9zKS8ocy0xKSk6by5wdXNoKCh1LW4qbi9zKS9zKX1yZXR1cm4gb30odGhpcyxyLHMpO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJtZWFuIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2NvbnN0IHM9dC5yb3dzLG49dC5jb2x1bW5zLG89cypuO2xldCBpPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPHM7ZSsrKWZvcihsZXQgcz0wO3M8bjtzKyspYT10LmdldChlLHMpLXIsaSs9YSx1Kz1hKmE7cmV0dXJuIGU/KHUtaSppL28pLyhvLTEpOih1LWkqaS9vKS9vfSh0aGlzLHIscyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXN0YW5kYXJkRGV2aWF0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKTtjb25zdCByPXRoaXMudmFyaWFuY2UodCxlKTtpZih2b2lkIDA9PT10KXJldHVybiBNYXRoLnNxcnQocik7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspclt0XT1NYXRoLnNxcnQoclt0XSk7cmV0dXJuIHJ9Y2VudGVyKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e2NlbnRlcjpyPXRoaXMubWVhbih0KX09ZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKCFWZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspdC5zZXQocixzLHQuZ2V0KHIscyktZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYoIVZlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zO3MrKyl0LnNldChyLHMsdC5nZXQocixzKS1lW3NdKX0odGhpcyxyKSx0aGlzO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspdC5zZXQocixzLHQuZ2V0KHIscyktZSl9KHRoaXMsciksdGhpcztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19c2NhbGUodCxlPXt9KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7bGV0IHI9ZS5zY2FsZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKHZvaWQgMD09PXIpcj1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKyl7bGV0IHM9MDtmb3IobGV0IGU9MDtlPHQuY29sdW1ucztlKyspcys9dC5nZXQocixlKSoqMi8odC5jb2x1bW5zLTEpO2UucHVzaChNYXRoLnNxcnQocykpfXJldHVybiBlfSh0aGlzKTtlbHNlIGlmKCFWZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zO3MrKyl0LnNldChyLHMsdC5nZXQocixzKS9lW3JdKX0odGhpcyxyKSx0aGlzO2Nhc2UiY29sdW1uIjppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQuY29sdW1ucztyKyspe2xldCBzPTA7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKXMrPXQuZ2V0KGUscikqKjIvKHQucm93cy0xKTtlLnB1c2goTWF0aC5zcXJ0KHMpKX1yZXR1cm4gZX0odGhpcyk7ZWxzZSBpZighVmUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspdC5zZXQocixzLHQuZ2V0KHIscykvZVtzXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT10LnNpemUtMTtsZXQgcj0wO2ZvcihsZXQgcz0wO3M8dC5jb2x1bW5zO3MrKylmb3IobGV0IG49MDtuPHQucm93cztuKyspcis9dC5nZXQobixzKSoqMi9lO3JldHVybiBNYXRoLnNxcnQocil9KHRoaXMpO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7cysrKXQuc2V0KHIscyx0LmdldChyLHMpL2UpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXRvU3RyaW5nKHQpe3JldHVybiBxZSh0aGlzLHQpfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHRoaXMuZW50cmllcygpfSplbnRyaWVzKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl5aWVsZFt0LGUsdGhpcy5nZXQodCxlKV19KnZhbHVlcygpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspeWllbGQgdGhpcy5nZXQodCxlKX19ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4gdC1lfVplLnByb3RvdHlwZS5rbGFzcz0iTWF0cml4IiwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmKFplLnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1mdW5jdGlvbigpe3JldHVybiBxZSh0aGlzKX0pLFplLnJhbmRvbT1aZS5yYW5kLFplLnJhbmRvbUludD1aZS5yYW5kSW50LFplLmRpYWdvbmFsPVplLmRpYWcsWmUucHJvdG90eXBlLmRpYWdvbmFsPVplLnByb3RvdHlwZS5kaWFnLFplLmlkZW50aXR5PVplLmV5ZSxaZS5wcm90b3R5cGUubmVnYXRlPVplLnByb3RvdHlwZS5uZWcsWmUucHJvdG90eXBlLnRlbnNvclByb2R1Y3Q9WmUucHJvdG90eXBlLmtyb25lY2tlclByb2R1Y3Q7bGV0IGVyPWNsYXNzIHQgZXh0ZW5kcyBaZXtkYXRhOyN0KHQsZSl7aWYodGhpcy5kYXRhPVtdLCEoTnVtYmVyLmlzSW50ZWdlcihlKSYmZT49MCkpdGhyb3cgbmV3IFR5cGVFcnJvcigibkNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtmb3IobGV0IHI9MDtyPHQ7cisrKXRoaXMuZGF0YS5wdXNoKG5ldyBGbG9hdDY0QXJyYXkoZSkpO3RoaXMucm93cz10LHRoaXMuY29sdW1ucz1lfWNvbnN0cnVjdG9yKGUscil7aWYoc3VwZXIoKSx0LmlzTWF0cml4KGUpKXRoaXMuI3QoZS5yb3dzLGUuY29sdW1ucyksdC5jb3B5KGUsdGhpcyk7ZWxzZSBpZihOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj0wKXRoaXMuI3QoZSxyKTtlbHNle2lmKCFWZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIGFuIGFycmF5Iik7e2NvbnN0IHQ9ZTtpZigibnVtYmVyIiE9dHlwZW9mKHI9KGU9dC5sZW5ndGgpP3RbMF0ubGVuZ3RoOjApKXRocm93IG5ldyBUeXBlRXJyb3IoIkRhdGEgbXVzdCBiZSBhIDJEIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQiKTt0aGlzLmRhdGE9W107Zm9yKGxldCBzPTA7czxlO3MrKyl7aWYodFtzXS5sZW5ndGghPT1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmNvbnNpc3RlbnQgYXJyYXkgZGltZW5zaW9ucyIpO2lmKCF0W3NdLmV2ZXJ5KCh0PT4ibnVtYmVyIj09dHlwZW9mIHQpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnB1dCBkYXRhIGNvbnRhaW5zIG5vbi1udW1lcmljIHZhbHVlcyIpO3RoaXMuZGF0YS5wdXNoKEZsb2F0NjRBcnJheS5mcm9tKHRbc10pKX10aGlzLnJvd3M9ZSx0aGlzLmNvbHVtbnM9cn19fXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX1yZW1vdmVSb3codCl7cmV0dXJuIFVlKHRoaXMsdCksdGhpcy5kYXRhLnNwbGljZSh0LDEpLHRoaXMucm93cy09MSx0aGlzfWFkZFJvdyh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5yb3dzKSxVZSh0aGlzLHQsITApLGU9RmxvYXQ2NEFycmF5LmZyb20oQmUodGhpcyxlKSksdGhpcy5kYXRhLnNwbGljZSh0LDAsZSksdGhpcy5yb3dzKz0xLHRoaXN9cmVtb3ZlQ29sdW1uKHQpe0dlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXtjb25zdCByPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zLTEpO2ZvcihsZXQgcz0wO3M8dDtzKyspcltzXT10aGlzLmRhdGFbZV1bc107Zm9yKGxldCBzPXQrMTtzPHRoaXMuY29sdW1ucztzKyspcltzLTFdPXRoaXMuZGF0YVtlXVtzXTt0aGlzLmRhdGFbZV09cn1yZXR1cm4gdGhpcy5jb2x1bW5zLT0xLHRoaXN9YWRkQ29sdW1uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMuY29sdW1ucyksR2UodGhpcyx0LCEwKSxlPVdlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtjb25zdCBzPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zKzEpO2xldCBuPTA7Zm9yKDtuPHQ7bisrKXNbbl09dGhpcy5kYXRhW3JdW25dO2ZvcihzW24rK109ZVtyXTtuPHRoaXMuY29sdW1ucysxO24rKylzW25dPXRoaXMuZGF0YVtyXVtuLTFdO3RoaXMuZGF0YVtyXT1zfXJldHVybiB0aGlzLmNvbHVtbnMrPTEsdGhpc319OyFmdW5jdGlvbih0LGUpe3QucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5hZGRTKHQpOnRoaXMuYWRkTSh0KX0sdC5wcm90b3R5cGUuYWRkUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3QpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hZGRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5hZGQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuYWRkKHIpfSx0LnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuc3ViUyh0KTp0aGlzLnN1Yk0odCl9LHQucHJvdG90eXBlLnN1YlM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc3ViTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuc3ViPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnN1YihyKX0sdC5wcm90b3R5cGUuc3VidHJhY3Q9dC5wcm90b3R5cGUuc3ViLHQucHJvdG90eXBlLnN1YnRyYWN0Uz10LnByb3RvdHlwZS5zdWJTLHQucHJvdG90eXBlLnN1YnRyYWN0TT10LnByb3RvdHlwZS5zdWJNLHQuc3VidHJhY3Q9dC5zdWIsdC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm11bFModCk6dGhpcy5tdWxNKHQpfSx0LnByb3RvdHlwZS5tdWxTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm11bE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm11bD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5tdWwocil9LHQucHJvdG90eXBlLm11bHRpcGx5PXQucHJvdG90eXBlLm11bCx0LnByb3RvdHlwZS5tdWx0aXBseVM9dC5wcm90b3R5cGUubXVsUyx0LnByb3RvdHlwZS5tdWx0aXBseU09dC5wcm90b3R5cGUubXVsTSx0Lm11bHRpcGx5PXQubXVsLHQucHJvdG90eXBlLmRpdj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5kaXZTKHQpOnRoaXMuZGl2TSh0KX0sdC5wcm90b3R5cGUuZGl2Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3QpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaXZNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5kaXY9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuZGl2KHIpfSx0LnByb3RvdHlwZS5kaXZpZGU9dC5wcm90b3R5cGUuZGl2LHQucHJvdG90eXBlLmRpdmlkZVM9dC5wcm90b3R5cGUuZGl2Uyx0LnByb3RvdHlwZS5kaXZpZGVNPXQucHJvdG90eXBlLmRpdk0sdC5kaXZpZGU9dC5kaXYsdC5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm1vZFModCk6dGhpcy5tb2RNKHQpfSx0LnByb3RvdHlwZS5tb2RTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikldCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm1vZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJXQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm1vZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5tb2Qocil9LHQucHJvdG90eXBlLm1vZHVsdXM9dC5wcm90b3R5cGUubW9kLHQucHJvdG90eXBlLm1vZHVsdXNTPXQucHJvdG90eXBlLm1vZFMsdC5wcm90b3R5cGUubW9kdWx1c009dC5wcm90b3R5cGUubW9kTSx0Lm1vZHVsdXM9dC5tb2QsdC5wcm90b3R5cGUuYW5kPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmFuZFModCk6dGhpcy5hbmRNKHQpfSx0LnByb3RvdHlwZS5hbmRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikmdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmFuZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmFuZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5hbmQocil9LHQucHJvdG90eXBlLm9yPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm9yUyh0KTp0aGlzLm9yTSh0KX0sdC5wcm90b3R5cGUub3JTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscil8dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm9yTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscil8dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQub3I9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkub3Iocil9LHQucHJvdG90eXBlLnhvcj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy54b3JTKHQpOnRoaXMueG9yTSh0KX0sdC5wcm90b3R5cGUueG9yUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpXnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS54b3JNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKV50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC54b3I9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkueG9yKHIpfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubGVmdFNoaWZ0Uyh0KTp0aGlzLmxlZnRTaGlmdE0odCl9LHQucHJvdG90eXBlLmxlZnRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKTw8dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmxlZnRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPDx0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubGVmdFNoaWZ0KHIpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTKHQpOnRoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE0odCl9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+PnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+PnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdChyKX0sdC5wcm90b3R5cGUucmlnaHRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5yaWdodFNoaWZ0Uyh0KTp0aGlzLnJpZ2h0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj4+dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+PnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnJpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkucmlnaHRTaGlmdChyKX0sdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0PXQucHJvdG90eXBlLnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0Uz10LnByb3RvdHlwZS5yaWdodFNoaWZ0Uyx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRNPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRNLHQuemVyb0ZpbGxSaWdodFNoaWZ0PXQucmlnaHRTaGlmdCx0LnByb3RvdHlwZS5ub3Q9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx+dGhpcy5nZXQodCxlKSk7cmV0dXJuIHRoaXN9LHQubm90PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5ub3QoKX0sdC5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hYnModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFicz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWJzKCl9LHQucHJvdG90eXBlLmFjb3M9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFjb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFjb3MoKX0sdC5wcm90b3R5cGUuYWNvc2g9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFjb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWNvc2goKX0sdC5wcm90b3R5cGUuYXNpbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXNpbigpfSx0LnByb3RvdHlwZS5hc2luaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFzaW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hc2luaCgpfSx0LnByb3RvdHlwZS5hdGFuPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hdGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hdGFuKCl9LHQucHJvdG90eXBlLmF0YW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmF0YW5oKCl9LHQucHJvdG90eXBlLmNicnQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNicnQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNicnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNicnQoKX0sdC5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2VpbCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2VpbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2VpbCgpfSx0LnByb3RvdHlwZS5jbHozMj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2x6MzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNsejMyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jbHozMigpfSx0LnByb3RvdHlwZS5jb3M9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY29zPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jb3MoKX0sdC5wcm90b3R5cGUuY29zaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY29zaCgpfSx0LnByb3RvdHlwZS5leHA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5leHAoKX0sdC5wcm90b3R5cGUuZXhwbTE9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cG0xKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5leHBtMT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZXhwbTEoKX0sdC5wcm90b3R5cGUuZmxvb3I9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZsb29yKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5mbG9vcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZmxvb3IoKX0sdC5wcm90b3R5cGUuZnJvdW5kPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mcm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZyb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZnJvdW5kKCl9LHQucHJvdG90eXBlLmxvZz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2c9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZygpfSx0LnByb3RvdHlwZS5sb2cxcD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMXAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzFwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cxcCgpfSx0LnByb3RvdHlwZS5sb2cxMD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMTAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzEwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cxMCgpfSx0LnByb3RvdHlwZS5sb2cyPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cyKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cyKCl9LHQucHJvdG90eXBlLnJvdW5kPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5yb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnJvdW5kKCl9LHQucHJvdG90eXBlLnNpZ249ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpZ24odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpZ24oKX0sdC5wcm90b3R5cGUuc2luPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2luKCl9LHQucHJvdG90eXBlLnNpbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpbmgoKX0sdC5wcm90b3R5cGUuc3FydD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc3FydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc3FydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc3FydCgpfSx0LnByb3RvdHlwZS50YW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRhbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50YW4oKX0sdC5wcm90b3R5cGUudGFuaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudGFuaCgpfSx0LnByb3RvdHlwZS50cnVuYz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudHJ1bmModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRydW5jPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50cnVuYygpfSx0LnBvdz1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5wb3cocil9LHQucHJvdG90eXBlLnBvdz1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5wb3dTKHQpOnRoaXMucG93TSh0KX0sdC5wcm90b3R5cGUucG93Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKip0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucG93TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqKnQuZ2V0KGUscikpO3JldHVybiB0aGlzfX0oWmUsZXIpO2NsYXNzIHJyIGV4dGVuZHMgWmV7I2U7Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy4jZS5zaXplfWdldCByb3dzKCl7cmV0dXJuIHRoaXMuI2Uucm93c31nZXQgY29sdW1ucygpe3JldHVybiB0aGlzLiNlLmNvbHVtbnN9Z2V0IGRpYWdvbmFsU2l6ZSgpe3JldHVybiB0aGlzLnJvd3N9c3RhdGljIGlzU3ltbWV0cmljTWF0cml4KHQpe3JldHVybiBlci5pc01hdHJpeCh0KSYmIlN5bW1ldHJpY01hdHJpeCI9PT10LmtsYXNzVHlwZX1zdGF0aWMgemVyb3ModCl7cmV0dXJuIG5ldyB0aGlzKHQpfXN0YXRpYyBvbmVzKHQpe3JldHVybiBuZXcgdGhpcyh0KS5maWxsKDEpfWNvbnN0cnVjdG9yKHQpe2lmKHN1cGVyKCksZXIuaXNNYXRyaXgodCkpe2lmKCF0LmlzU3ltbWV0cmljKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigibm90IHN5bW1ldHJpYyBkYXRhIik7dGhpcy4jZT1lci5jb3B5KHQsbmV3IGVyKHQucm93cyx0LnJvd3MpKX1lbHNlIGlmKE51bWJlci5pc0ludGVnZXIodCkmJnQ+PTApdGhpcy4jZT1uZXcgZXIodCx0KTtlbHNlIGlmKHRoaXMuI2U9bmV3IGVyKHQpLCF0aGlzLmlzU3ltbWV0cmljKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigibm90IHN5bW1ldHJpYyBkYXRhIil9Y2xvbmUoKXtjb25zdCB0PW5ldyBycih0aGlzLmRpYWdvbmFsU2l6ZSk7Zm9yKGNvbnN0W2UscixzXW9mIHRoaXMudXBwZXJSaWdodEVudHJpZXMoKSl0LnNldChlLHIscyk7cmV0dXJuIHR9dG9NYXRyaXgoKXtyZXR1cm4gbmV3IGVyKHRoaXMpfWdldCh0LGUpe3JldHVybiB0aGlzLiNlLmdldCh0LGUpfXNldCh0LGUscil7cmV0dXJuIHRoaXMuI2Uuc2V0KHQsZSxyKSx0aGlzLiNlLnNldChlLHQsciksdGhpc31yZW1vdmVDcm9zcyh0KXtyZXR1cm4gdGhpcy4jZS5yZW1vdmVSb3codCksdGhpcy4jZS5yZW1vdmVDb2x1bW4odCksdGhpc31hZGRDcm9zcyh0LGUpe3ZvaWQgMD09PWUmJihlPXQsdD10aGlzLmRpYWdvbmFsU2l6ZSk7Y29uc3Qgcj1lLnNsaWNlKCk7cmV0dXJuIHIuc3BsaWNlKHQsMSksdGhpcy4jZS5hZGRSb3codCxyKSx0aGlzLiNlLmFkZENvbHVtbih0LGUpLHRoaXN9YXBwbHlNYXNrKHQpe2lmKHQubGVuZ3RoIT09dGhpcy5kaWFnb25hbFNpemUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hc2sgc2l6ZSBkbyBub3QgbWF0Y2ggd2l0aCBtYXRyaXggc2l6ZSIpO2NvbnN0IGU9W107Zm9yKGNvbnN0W3Isc11vZiB0LmVudHJpZXMoKSlzfHxlLnB1c2gocik7ZS5yZXZlcnNlKCk7Zm9yKGNvbnN0IHQgb2YgZSl0aGlzLnJlbW92ZUNyb3NzKHQpO3JldHVybiB0aGlzfXRvQ29tcGFjdCgpe2NvbnN0e2RpYWdvbmFsU2l6ZTp0fT10aGlzLGU9bmV3IEFycmF5KHQqKHQrMSkvMik7Zm9yKGxldCByPTAscz0wLG49MDtuPGUubGVuZ3RoO24rKyllW25dPXRoaXMuZ2V0KHMsciksKytyPj10JiYocj0rK3MpO3JldHVybiBlfXN0YXRpYyBmcm9tQ29tcGFjdCh0KXtjb25zdCBlPXQubGVuZ3RoLHI9KE1hdGguc3FydCg4KmUrMSktMSkvMjtpZighTnVtYmVyLmlzSW50ZWdlcihyKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGlzIGFycmF5IGlzIG5vdCBhIGNvbXBhY3QgcmVwcmVzZW50YXRpb24gb2YgYSBTeW1tZXRyaWMgTWF0cml4LCAke0pTT04uc3RyaW5naWZ5KHQpfWApO2NvbnN0IHM9bmV3IHJyKHIpO2ZvcihsZXQgbj0wLG89MCxpPTA7aTxlO2krKylzLnNldChuLG8sdFtpXSksKytuPj1yJiYobj0rK28pO3JldHVybiBzfSp1cHBlclJpZ2h0RW50cmllcygpe2ZvcihsZXQgdD0wLGU9MDt0PHRoaXMuZGlhZ29uYWxTaXplO3ZvaWQgMCl7Y29uc3Qgcj10aGlzLmdldCh0LGUpO3lpZWxkW3QsZSxyXSwrK2U+PXRoaXMuZGlhZ29uYWxTaXplJiYoZT0rK3QpfX0qdXBwZXJSaWdodFZhbHVlcygpe2ZvcihsZXQgdD0wLGU9MDt0PHRoaXMuZGlhZ29uYWxTaXplO3ZvaWQgMCl7Y29uc3Qgcj10aGlzLmdldCh0LGUpO3lpZWxkIHIsKytlPj10aGlzLmRpYWdvbmFsU2l6ZSYmKGU9Kyt0KX19fXJyLnByb3RvdHlwZS5rbGFzc1R5cGU9IlN5bW1ldHJpY01hdHJpeCI7Y2xhc3Mgc3IgZXh0ZW5kcyBycntzdGF0aWMgaXNEaXN0YW5jZU1hdHJpeCh0KXtyZXR1cm4gcnIuaXNTeW1tZXRyaWNNYXRyaXgodCkmJiJEaXN0YW5jZU1hdHJpeCI9PT10LmtsYXNzU3ViVHlwZX1jb25zdHJ1Y3Rvcih0KXtpZihzdXBlcih0KSwhdGhpcy5pc0Rpc3RhbmNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvdmlkZWQgYXJndW1lbnRzIGRvIG5vIHByb2R1Y2UgYSBkaXN0YW5jZSBtYXRyaXgiKX1zZXQodCxlLHIpe3JldHVybiB0PT09ZSYmKHI9MCksc3VwZXIuc2V0KHQsZSxyKX1hZGRDcm9zcyh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5kaWFnb25hbFNpemUpLChlPWUuc2xpY2UoKSlbdF09MCxzdXBlci5hZGRDcm9zcyh0LGUpfXRvU3ltbWV0cmljTWF0cml4KCl7cmV0dXJuIG5ldyBycih0aGlzKX1jbG9uZSgpe2NvbnN0IHQ9bmV3IHNyKHRoaXMuZGlhZ29uYWxTaXplKTtmb3IoY29uc3RbZSxyLHNdb2YgdGhpcy51cHBlclJpZ2h0RW50cmllcygpKWUhPT1yJiZ0LnNldChlLHIscyk7cmV0dXJuIHR9dG9Db21wYWN0KCl7Y29uc3R7ZGlhZ29uYWxTaXplOnR9PXRoaXMsZT1uZXcgQXJyYXkoKHQtMSkqdC8yKTtmb3IobGV0IHI9MSxzPTAsbj0wO248ZS5sZW5ndGg7bisrKWVbbl09dGhpcy5nZXQocyxyKSwrK3I+PXQmJihyPTErICsrcyk7cmV0dXJuIGV9c3RhdGljIGZyb21Db21wYWN0KHQpe2NvbnN0IGU9dC5sZW5ndGg7aWYoMD09PWUpcmV0dXJuIG5ldyB0aGlzKDApO2NvbnN0IHI9KE1hdGguc3FydCg4KmUrMSkrMSkvMjtpZighTnVtYmVyLmlzSW50ZWdlcihyKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGlzIGFycmF5IGlzIG5vdCBhIGNvbXBhY3QgcmVwcmVzZW50YXRpb24gb2YgYSBEaXN0YW5jZU1hdHJpeCwgJHtKU09OLnN0cmluZ2lmeSh0KX1gKTtjb25zdCBzPW5ldyB0aGlzKHIpO2ZvcihsZXQgbj0xLG89MCxpPTA7aTxlO2krKylzLnNldChuLG8sdFtpXSksKytuPj1yJiYobj0xKyArK28pO3JldHVybiBzfX1zci5wcm90b3R5cGUua2xhc3NTdWJUeXBlPSJEaXN0YW5jZU1hdHJpeCI7Y2xhc3MgbnIgZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcih0LGUscil7c3VwZXIoKSx0aGlzLm1hdHJpeD10LHRoaXMucm93cz1lLHRoaXMuY29sdW1ucz1yfX1jbGFzcyBvciBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKHQsZSxyKXtLZSh0LGUpLFFlKHQsciksc3VwZXIodCxlLmxlbmd0aCxyLmxlbmd0aCksdGhpcy5yb3dJbmRpY2VzPWUsdGhpcy5jb2x1bW5JbmRpY2VzPXJ9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHRoaXMucm93SW5kaWNlc1t0XSx0aGlzLmNvbHVtbkluZGljZXNbZV0sciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMucm93SW5kaWNlc1t0XSx0aGlzLmNvbHVtbkluZGljZXNbZV0pfX1jbGFzcyBpciBleHRlbmRzIFple2NvbnN0cnVjdG9yKHQsZT17fSl7Y29uc3R7cm93czpyPTF9PWU7aWYodC5sZW5ndGglciE9MCl0aHJvdyBuZXcgRXJyb3IoInRoZSBkYXRhIGxlbmd0aCBpcyBub3QgZGl2aXNpYmxlIGJ5IHRoZSBudW1iZXIgb2Ygcm93cyIpO3N1cGVyKCksdGhpcy5yb3dzPXIsdGhpcy5jb2x1bW5zPXQubGVuZ3RoL3IsdGhpcy5kYXRhPXR9c2V0KHQsZSxyKXtsZXQgcz10aGlzLl9jYWxjdWxhdGVJbmRleCh0LGUpO3JldHVybiB0aGlzLmRhdGFbc109cix0aGlzfWdldCh0LGUpe2xldCByPXRoaXMuX2NhbGN1bGF0ZUluZGV4KHQsZSk7cmV0dXJuIHRoaXMuZGF0YVtyXX1fY2FsY3VsYXRlSW5kZXgodCxlKXtyZXR1cm4gdCp0aGlzLmNvbHVtbnMrZX19Y2xhc3MgdXIgZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGF0YT10LHRoaXMucm93cz10Lmxlbmd0aCx0aGlzLmNvbHVtbnM9dFswXS5sZW5ndGh9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdPXIsdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdfX1jbGFzcyBhcntjb25zdHJ1Y3Rvcih0KXtsZXQgZSxyLHMsbixvLGksdSxhLGwsaD0odD11ci5jaGVja01hdHJpeCh0KSkuY2xvbmUoKSxjPWgucm93cyxmPWguY29sdW1ucyxtPW5ldyBGbG9hdDY0QXJyYXkoYyksZz0xO2ZvcihlPTA7ZTxjO2UrKyltW2VdPWU7Zm9yKGE9bmV3IEZsb2F0NjRBcnJheShjKSxyPTA7cjxmO3IrKyl7Zm9yKGU9MDtlPGM7ZSsrKWFbZV09aC5nZXQoZSxyKTtmb3IoZT0wO2U8YztlKyspe2ZvcihsPU1hdGgubWluKGUsciksbz0wLHM9MDtzPGw7cysrKW8rPWguZ2V0KGUscykqYVtzXTthW2VdLT1vLGguc2V0KGUscixhW2VdKX1mb3Iobj1yLGU9cisxO2U8YztlKyspTWF0aC5hYnMoYVtlXSk+TWF0aC5hYnMoYVtuXSkmJihuPWUpO2lmKG4hPT1yKXtmb3Iocz0wO3M8ZjtzKyspaT1oLmdldChuLHMpLGguc2V0KG4scyxoLmdldChyLHMpKSxoLnNldChyLHMsaSk7dT1tW25dLG1bbl09bVtyXSxtW3JdPXUsZz0tZ31pZihyPGMmJjAhPT1oLmdldChyLHIpKWZvcihlPXIrMTtlPGM7ZSsrKWguc2V0KGUscixoLmdldChlLHIpL2guZ2V0KHIscikpfXRoaXMuTFU9aCx0aGlzLnBpdm90VmVjdG9yPW0sdGhpcy5waXZvdFNpZ249Z31pc1Npbmd1bGFyKCl7bGV0IHQ9dGhpcy5MVSxlPXQuY29sdW1ucztmb3IobGV0IHI9MDtyPGU7cisrKWlmKDA9PT10LmdldChyLHIpKXJldHVybiEwO3JldHVybiExfXNvbHZlKHQpe3Q9ZXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5MVTtpZihlLnJvd3MhPT10LnJvd3MpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG1hdHJpeCBkaW1lbnNpb25zIik7aWYodGhpcy5pc1Npbmd1bGFyKCkpdGhyb3cgbmV3IEVycm9yKCJMVSBtYXRyaXggaXMgc2luZ3VsYXIiKTtsZXQgcixzLG4sbz10LmNvbHVtbnMsaT10LnN1Yk1hdHJpeFJvdyh0aGlzLnBpdm90VmVjdG9yLDAsby0xKSx1PWUuY29sdW1ucztmb3Iobj0wO248dTtuKyspZm9yKHI9bisxO3I8dTtyKyspZm9yKHM9MDtzPG87cysrKWkuc2V0KHIscyxpLmdldChyLHMpLWkuZ2V0KG4scykqZS5nZXQocixuKSk7Zm9yKG49dS0xO24+PTA7bi0tKXtmb3Iocz0wO3M8bztzKyspaS5zZXQobixzLGkuZ2V0KG4scykvZS5nZXQobixuKSk7Zm9yKHI9MDtyPG47cisrKWZvcihzPTA7czxvO3MrKylpLnNldChyLHMsaS5nZXQocixzKS1pLmdldChuLHMpKmUuZ2V0KHIsbikpfXJldHVybiBpfWdldCBkZXRlcm1pbmFudCgpe2xldCB0PXRoaXMuTFU7aWYoIXQuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIHNxdWFyZSIpO2xldCBlPXRoaXMucGl2b3RTaWduLHI9dC5jb2x1bW5zO2ZvcihsZXQgcz0wO3M8cjtzKyspZSo9dC5nZXQocyxzKTtyZXR1cm4gZX1nZXQgbG93ZXJUcmlhbmd1bGFyTWF0cml4KCl7bGV0IHQ9dGhpcy5MVSxlPXQucm93cyxyPXQuY29sdW1ucyxzPW5ldyBlcihlLHIpO2ZvcihsZXQgbj0wO248ZTtuKyspZm9yKGxldCBlPTA7ZTxyO2UrKyluPmU/cy5zZXQobixlLHQuZ2V0KG4sZSkpOm49PT1lP3Muc2V0KG4sZSwxKTpzLnNldChuLGUsMCk7cmV0dXJuIHN9Z2V0IHVwcGVyVHJpYW5ndWxhck1hdHJpeCgpe2xldCB0PXRoaXMuTFUsZT10LnJvd3Mscj10LmNvbHVtbnMscz1uZXcgZXIoZSxyKTtmb3IobGV0IG49MDtuPGU7bisrKWZvcihsZXQgZT0wO2U8cjtlKyspbjw9ZT9zLnNldChuLGUsdC5nZXQobixlKSk6cy5zZXQobixlLDApO3JldHVybiBzfWdldCBwaXZvdFBlcm11dGF0aW9uVmVjdG9yKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5waXZvdFZlY3Rvcil9fWZ1bmN0aW9uIGxyKHQsZSl7bGV0IHI9MDtyZXR1cm4gTWF0aC5hYnModCk+TWF0aC5hYnMoZSk/KHI9ZS90LE1hdGguYWJzKHQpKk1hdGguc3FydCgxK3IqcikpOjAhPT1lPyhyPXQvZSxNYXRoLmFicyhlKSpNYXRoLnNxcnQoMStyKnIpKTowfWNsYXNzIGhye2NvbnN0cnVjdG9yKHQpe2xldCBlLHIscyxuLG89KHQ9dXIuY2hlY2tNYXRyaXgodCkpLmNsb25lKCksaT10LnJvd3MsdT10LmNvbHVtbnMsYT1uZXcgRmxvYXQ2NEFycmF5KHUpO2ZvcihzPTA7czx1O3MrKyl7bGV0IHQ9MDtmb3IoZT1zO2U8aTtlKyspdD1scih0LG8uZ2V0KGUscykpO2lmKDAhPT10KXtmb3Ioby5nZXQocyxzKTwwJiYodD0tdCksZT1zO2U8aTtlKyspby5zZXQoZSxzLG8uZ2V0KGUscykvdCk7Zm9yKG8uc2V0KHMscyxvLmdldChzLHMpKzEpLHI9cysxO3I8dTtyKyspe2ZvcihuPTAsZT1zO2U8aTtlKyspbis9by5nZXQoZSxzKSpvLmdldChlLHIpO2ZvcihuPS1uL28uZ2V0KHMscyksZT1zO2U8aTtlKyspby5zZXQoZSxyLG8uZ2V0KGUscikrbipvLmdldChlLHMpKX19YVtzXT0tdH10aGlzLlFSPW8sdGhpcy5SZGlhZz1hfXNvbHZlKHQpe3Q9ZXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5RUixyPWUucm93cztpZih0LnJvd3MhPT1yKXRocm93IG5ldyBFcnJvcigiTWF0cml4IHJvdyBkaW1lbnNpb25zIG11c3QgYWdyZWUiKTtpZighdGhpcy5pc0Z1bGxSYW5rKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggaXMgcmFuayBkZWZpY2llbnQiKTtsZXQgcyxuLG8saSx1PXQuY29sdW1ucyxhPXQuY2xvbmUoKSxsPWUuY29sdW1ucztmb3Iobz0wO288bDtvKyspZm9yKG49MDtuPHU7bisrKXtmb3IoaT0wLHM9bztzPHI7cysrKWkrPWUuZ2V0KHMsbykqYS5nZXQocyxuKTtmb3IoaT0taS9lLmdldChvLG8pLHM9bztzPHI7cysrKWEuc2V0KHMsbixhLmdldChzLG4pK2kqZS5nZXQocyxvKSl9Zm9yKG89bC0xO28+PTA7by0tKXtmb3Iobj0wO248dTtuKyspYS5zZXQobyxuLGEuZ2V0KG8sbikvdGhpcy5SZGlhZ1tvXSk7Zm9yKHM9MDtzPG87cysrKWZvcihuPTA7bjx1O24rKylhLnNldChzLG4sYS5nZXQocyxuKS1hLmdldChvLG4pKmUuZ2V0KHMsbykpfXJldHVybiBhLnN1Yk1hdHJpeCgwLGwtMSwwLHUtMSl9aXNGdWxsUmFuaygpe2xldCB0PXRoaXMuUVIuY29sdW1ucztmb3IobGV0IGU9MDtlPHQ7ZSsrKWlmKDA9PT10aGlzLlJkaWFnW2VdKXJldHVybiExO3JldHVybiEwfWdldCB1cHBlclRyaWFuZ3VsYXJNYXRyaXgoKXtsZXQgdCxlLHI9dGhpcy5RUixzPXIuY29sdW1ucyxuPW5ldyBlcihzLHMpO2Zvcih0PTA7dDxzO3QrKylmb3IoZT0wO2U8cztlKyspdDxlP24uc2V0KHQsZSxyLmdldCh0LGUpKTp0PT09ZT9uLnNldCh0LGUsdGhpcy5SZGlhZ1t0XSk6bi5zZXQodCxlLDApO3JldHVybiBufWdldCBvcnRob2dvbmFsTWF0cml4KCl7bGV0IHQsZSxyLHMsbj10aGlzLlFSLG89bi5yb3dzLGk9bi5jb2x1bW5zLHU9bmV3IGVyKG8saSk7Zm9yKHI9aS0xO3I+PTA7ci0tKXtmb3IodD0wO3Q8bzt0KyspdS5zZXQodCxyLDApO2Zvcih1LnNldChyLHIsMSksZT1yO2U8aTtlKyspaWYoMCE9PW4uZ2V0KHIscikpe2ZvcihzPTAsdD1yO3Q8bzt0Kyspcys9bi5nZXQodCxyKSp1LmdldCh0LGUpO2ZvcihzPS1zL24uZ2V0KHIsciksdD1yO3Q8bzt0KyspdS5zZXQodCxlLHUuZ2V0KHQsZSkrcypuLmdldCh0LHIpKX19cmV0dXJuIHV9fWNsYXNzIGNye2NvbnN0cnVjdG9yKHQsZT17fSl7aWYoKHQ9dXIuY2hlY2tNYXRyaXgodCkpLmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIG5vbi1lbXB0eSIpO2xldCByPXQucm93cyxzPXQuY29sdW1ucztjb25zdHtjb21wdXRlTGVmdFNpbmd1bGFyVmVjdG9yczpuPSEwLGNvbXB1dGVSaWdodFNpbmd1bGFyVmVjdG9yczpvPSEwLGF1dG9UcmFuc3Bvc2U6aT0hMX09ZTtsZXQgdSxhPUJvb2xlYW4obiksbD1Cb29sZWFuKG8pLGg9ITE7aWYocjxzKWlmKGkpe3U9dC50cmFuc3Bvc2UoKSxyPXUucm93cyxzPXUuY29sdW1ucyxoPSEwO2xldCBlPWE7YT1sLGw9ZX1lbHNlIHU9dC5jbG9uZSgpLGNvbnNvbGUud2FybigiQ29tcHV0aW5nIFNWRCBvbiBhIG1hdHJpeCB3aXRoIG1vcmUgY29sdW1ucyB0aGFuIHJvd3MuIENvbnNpZGVyIGVuYWJsaW5nIGF1dG9UcmFuc3Bvc2UiKTtlbHNlIHU9dC5jbG9uZSgpO2xldCBjPU1hdGgubWluKHIscyksZj1NYXRoLm1pbihyKzEscyksbT1uZXcgRmxvYXQ2NEFycmF5KGYpLGc9bmV3IGVyKHIsYyksdz1uZXcgZXIocyxzKSxwPW5ldyBGbG9hdDY0QXJyYXkocyksZD1uZXcgRmxvYXQ2NEFycmF5KHIpLHk9bmV3IEZsb2F0NjRBcnJheShmKTtmb3IobGV0IHQ9MDt0PGY7dCsrKXlbdF09dDtsZXQgYj1NYXRoLm1pbihyLTEscyksTT1NYXRoLm1heCgwLE1hdGgubWluKHMtMixyKSksdj1NYXRoLm1heChiLE0pO2ZvcihsZXQgdD0wO3Q8djt0Kyspe2lmKHQ8Yil7bVt0XT0wO2ZvcihsZXQgZT10O2U8cjtlKyspbVt0XT1scihtW3RdLHUuZ2V0KGUsdCkpO2lmKDAhPT1tW3RdKXt1LmdldCh0LHQpPDAmJihtW3RdPS1tW3RdKTtmb3IobGV0IGU9dDtlPHI7ZSsrKXUuc2V0KGUsdCx1LmdldChlLHQpL21bdF0pO3Uuc2V0KHQsdCx1LmdldCh0LHQpKzEpfW1bdF09LW1bdF19Zm9yKGxldCBlPXQrMTtlPHM7ZSsrKXtpZih0PGImJjAhPT1tW3RdKXtsZXQgcz0wO2ZvcihsZXQgbj10O248cjtuKyspcys9dS5nZXQobix0KSp1LmdldChuLGUpO3M9LXMvdS5nZXQodCx0KTtmb3IobGV0IG49dDtuPHI7bisrKXUuc2V0KG4sZSx1LmdldChuLGUpK3MqdS5nZXQobix0KSl9cFtlXT11LmdldCh0LGUpfWlmKGEmJnQ8Yilmb3IobGV0IGU9dDtlPHI7ZSsrKWcuc2V0KGUsdCx1LmdldChlLHQpKTtpZih0PE0pe3BbdF09MDtmb3IobGV0IGU9dCsxO2U8cztlKyspcFt0XT1scihwW3RdLHBbZV0pO2lmKDAhPT1wW3RdKXtwW3QrMV08MCYmKHBbdF09MC1wW3RdKTtmb3IobGV0IGU9dCsxO2U8cztlKyspcFtlXS89cFt0XTtwW3QrMV0rPTF9aWYocFt0XT0tcFt0XSx0KzE8ciYmMCE9PXBbdF0pe2ZvcihsZXQgZT10KzE7ZTxyO2UrKylkW2VdPTA7Zm9yKGxldCBlPXQrMTtlPHI7ZSsrKWZvcihsZXQgcj10KzE7cjxzO3IrKylkW2VdKz1wW3JdKnUuZ2V0KGUscik7Zm9yKGxldCBlPXQrMTtlPHM7ZSsrKXtsZXQgcz0tcFtlXS9wW3QrMV07Zm9yKGxldCBuPXQrMTtuPHI7bisrKXUuc2V0KG4sZSx1LmdldChuLGUpK3MqZFtuXSl9fWlmKGwpZm9yKGxldCBlPXQrMTtlPHM7ZSsrKXcuc2V0KGUsdCxwW2VdKX19bGV0IHg9TWF0aC5taW4ocyxyKzEpO2lmKGI8cyYmKG1bYl09dS5nZXQoYixiKSkscjx4JiYobVt4LTFdPTApLE0rMTx4JiYocFtNXT11LmdldChNLHgtMSkpLHBbeC0xXT0wLGEpe2ZvcihsZXQgdD1iO3Q8Yzt0Kyspe2ZvcihsZXQgZT0wO2U8cjtlKyspZy5zZXQoZSx0LDApO2cuc2V0KHQsdCwxKX1mb3IobGV0IHQ9Yi0xO3Q+PTA7dC0tKWlmKDAhPT1tW3RdKXtmb3IobGV0IGU9dCsxO2U8YztlKyspe2xldCBzPTA7Zm9yKGxldCBuPXQ7bjxyO24rKylzKz1nLmdldChuLHQpKmcuZ2V0KG4sZSk7cz0tcy9nLmdldCh0LHQpO2ZvcihsZXQgbj10O248cjtuKyspZy5zZXQobixlLGcuZ2V0KG4sZSkrcypnLmdldChuLHQpKX1mb3IobGV0IGU9dDtlPHI7ZSsrKWcuc2V0KGUsdCwtZy5nZXQoZSx0KSk7Zy5zZXQodCx0LDErZy5nZXQodCx0KSk7Zm9yKGxldCBlPTA7ZTx0LTE7ZSsrKWcuc2V0KGUsdCwwKX1lbHNle2ZvcihsZXQgZT0wO2U8cjtlKyspZy5zZXQoZSx0LDApO2cuc2V0KHQsdCwxKX19aWYobClmb3IobGV0IHQ9cy0xO3Q+PTA7dC0tKXtpZih0PE0mJjAhPT1wW3RdKWZvcihsZXQgZT10KzE7ZTxzO2UrKyl7bGV0IHI9MDtmb3IobGV0IG49dCsxO248cztuKyspcis9dy5nZXQobix0KSp3LmdldChuLGUpO3I9LXIvdy5nZXQodCsxLHQpO2ZvcihsZXQgbj10KzE7bjxzO24rKyl3LnNldChuLGUsdy5nZXQobixlKStyKncuZ2V0KG4sdCkpfWZvcihsZXQgZT0wO2U8cztlKyspdy5zZXQoZSx0LDApO3cuc2V0KHQsdCwxKX1sZXQgRT14LTEsUz1OdW1iZXIuRVBTSUxPTjtmb3IoO3g+MDspe2xldCB0LGU7Zm9yKHQ9eC0yO3Q+PS0xJiYtMSE9PXQ7dC0tKXtjb25zdCBlPU51bWJlci5NSU5fVkFMVUUrUypNYXRoLmFicyhtW3RdK01hdGguYWJzKG1bdCsxXSkpO2lmKE1hdGguYWJzKHBbdF0pPD1lfHxOdW1iZXIuaXNOYU4ocFt0XSkpe3BbdF09MDticmVha319aWYodD09PXgtMillPTQ7ZWxzZXtsZXQgcjtmb3Iocj14LTE7cj49dCYmciE9PXQ7ci0tKXtsZXQgZT0ociE9PXg/TWF0aC5hYnMocFtyXSk6MCkrKHIhPT10KzE/TWF0aC5hYnMocFtyLTFdKTowKTtpZihNYXRoLmFicyhtW3JdKTw9UyplKXttW3JdPTA7YnJlYWt9fXI9PT10P2U9MzpyPT09eC0xP2U9MTooZT0yLHQ9cil9c3dpdGNoKHQrKyxlKXtjYXNlIDE6e2xldCBlPXBbeC0yXTtwW3gtMl09MDtmb3IobGV0IHI9eC0yO3I+PXQ7ci0tKXtsZXQgbj1scihtW3JdLGUpLG89bVtyXS9uLGk9ZS9uO2lmKG1bcl09bixyIT09dCYmKGU9LWkqcFtyLTFdLHBbci0xXT1vKnBbci0xXSksbClmb3IobGV0IHQ9MDt0PHM7dCsrKW49byp3LmdldCh0LHIpK2kqdy5nZXQodCx4LTEpLHcuc2V0KHQseC0xLC1pKncuZ2V0KHQscikrbyp3LmdldCh0LHgtMSkpLHcuc2V0KHQscixuKX1icmVha31jYXNlIDI6e2xldCBlPXBbdC0xXTtwW3QtMV09MDtmb3IobGV0IHM9dDtzPHg7cysrKXtsZXQgbj1scihtW3NdLGUpLG89bVtzXS9uLGk9ZS9uO2lmKG1bc109bixlPS1pKnBbc10scFtzXT1vKnBbc10sYSlmb3IobGV0IGU9MDtlPHI7ZSsrKW49bypnLmdldChlLHMpK2kqZy5nZXQoZSx0LTEpLGcuc2V0KGUsdC0xLC1pKmcuZ2V0KGUscykrbypnLmdldChlLHQtMSkpLGcuc2V0KGUscyxuKX1icmVha31jYXNlIDM6e2NvbnN0IGU9TWF0aC5tYXgoTWF0aC5hYnMobVt4LTFdKSxNYXRoLmFicyhtW3gtMl0pLE1hdGguYWJzKHBbeC0yXSksTWF0aC5hYnMobVt0XSksTWF0aC5hYnMocFt0XSkpLG49bVt4LTFdL2Usbz1tW3gtMl0vZSxpPXBbeC0yXS9lLHU9bVt0XS9lLGg9cFt0XS9lLGM9KChvK24pKihvLW4pK2kqaSkvMixmPW4qaSoobippKTtsZXQgZD0wOzA9PT1jJiYwPT09Znx8KGQ9YzwwPzAtTWF0aC5zcXJ0KGMqYytmKTpNYXRoLnNxcnQoYypjK2YpLGQ9Zi8oYytkKSk7bGV0IHk9KHUrbikqKHUtbikrZCxiPXUqaDtmb3IobGV0IGU9dDtlPHgtMTtlKyspe2xldCBuPWxyKHksYik7MD09PW4mJihuPU51bWJlci5NSU5fVkFMVUUpO2xldCBvPXkvbixpPWIvbjtpZihlIT09dCYmKHBbZS0xXT1uKSx5PW8qbVtlXStpKnBbZV0scFtlXT1vKnBbZV0taSptW2VdLGI9aSptW2UrMV0sbVtlKzFdPW8qbVtlKzFdLGwpZm9yKGxldCB0PTA7dDxzO3QrKyluPW8qdy5nZXQodCxlKStpKncuZ2V0KHQsZSsxKSx3LnNldCh0LGUrMSwtaSp3LmdldCh0LGUpK28qdy5nZXQodCxlKzEpKSx3LnNldCh0LGUsbik7aWYobj1scih5LGIpLDA9PT1uJiYobj1OdW1iZXIuTUlOX1ZBTFVFKSxvPXkvbixpPWIvbixtW2VdPW4seT1vKnBbZV0raSptW2UrMV0sbVtlKzFdPS1pKnBbZV0rbyptW2UrMV0sYj1pKnBbZSsxXSxwW2UrMV09bypwW2UrMV0sYSYmZTxyLTEpZm9yKGxldCB0PTA7dDxyO3QrKyluPW8qZy5nZXQodCxlKStpKmcuZ2V0KHQsZSsxKSxnLnNldCh0LGUrMSwtaSpnLmdldCh0LGUpK28qZy5nZXQodCxlKzEpKSxnLnNldCh0LGUsbil9cFt4LTJdPXk7YnJlYWt9Y2FzZSA0OmlmKG1bdF08PTAmJihtW3RdPW1bdF08MD8tbVt0XTowLGwpKWZvcihsZXQgZT0wO2U8PUU7ZSsrKXcuc2V0KGUsdCwtdy5nZXQoZSx0KSk7Zm9yKDt0PEUmJiEobVt0XT49bVt0KzFdKTspe2xldCBlPW1bdF07aWYobVt0XT1tW3QrMV0sbVt0KzFdPWUsbCYmdDxzLTEpZm9yKGxldCByPTA7cjxzO3IrKyllPXcuZ2V0KHIsdCsxKSx3LnNldChyLHQrMSx3LmdldChyLHQpKSx3LnNldChyLHQsZSk7aWYoYSYmdDxyLTEpZm9yKGxldCBzPTA7czxyO3MrKyllPWcuZ2V0KHMsdCsxKSxnLnNldChzLHQrMSxnLmdldChzLHQpKSxnLnNldChzLHQsZSk7dCsrfXgtLX19aWYoaCl7bGV0IHQ9dzt3PWcsZz10fXRoaXMubT1yLHRoaXMubj1zLHRoaXMucz1tLHRoaXMuVT1nLHRoaXMuVj13fXNvbHZlKHQpe2xldCBlPXQscj10aGlzLnRocmVzaG9sZCxzPXRoaXMucy5sZW5ndGgsbj1lci56ZXJvcyhzLHMpO2ZvcihsZXQgdD0wO3Q8czt0KyspTWF0aC5hYnModGhpcy5zW3RdKTw9cj9uLnNldCh0LHQsMCk6bi5zZXQodCx0LDEvdGhpcy5zW3RdKTtsZXQgbz10aGlzLlUsaT10aGlzLnJpZ2h0U2luZ3VsYXJWZWN0b3JzLHU9aS5tbXVsKG4pLGE9aS5yb3dzLGw9by5yb3dzLGg9ZXIuemVyb3MoYSxsKTtmb3IobGV0IHQ9MDt0PGE7dCsrKWZvcihsZXQgZT0wO2U8bDtlKyspe2xldCByPTA7Zm9yKGxldCBuPTA7bjxzO24rKylyKz11LmdldCh0LG4pKm8uZ2V0KGUsbik7aC5zZXQodCxlLHIpfXJldHVybiBoLm1tdWwoZSl9c29sdmVGb3JEaWFnb25hbCh0KXtyZXR1cm4gdGhpcy5zb2x2ZShlci5kaWFnKHQpKX1pbnZlcnNlKCl7bGV0IHQ9dGhpcy5WLGU9dGhpcy50aHJlc2hvbGQscj10LnJvd3Mscz10LmNvbHVtbnMsbj1uZXcgZXIocix0aGlzLnMubGVuZ3RoKTtmb3IobGV0IG89MDtvPHI7bysrKWZvcihsZXQgcj0wO3I8cztyKyspTWF0aC5hYnModGhpcy5zW3JdKT5lJiZuLnNldChvLHIsdC5nZXQobyxyKS90aGlzLnNbcl0pO2xldCBvPXRoaXMuVSxpPW8ucm93cyx1PW8uY29sdW1ucyxhPW5ldyBlcihyLGkpO2ZvcihsZXQgdD0wO3Q8cjt0KyspZm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IHI9MDtmb3IobGV0IHM9MDtzPHU7cysrKXIrPW4uZ2V0KHQscykqby5nZXQoZSxzKTthLnNldCh0LGUscil9cmV0dXJuIGF9Z2V0IGNvbmRpdGlvbigpe3JldHVybiB0aGlzLnNbMF0vdGhpcy5zW01hdGgubWluKHRoaXMubSx0aGlzLm4pLTFdfWdldCBub3JtMigpe3JldHVybiB0aGlzLnNbMF19Z2V0IHJhbmsoKXtsZXQgdD1NYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF0qTnVtYmVyLkVQU0lMT04sZT0wLHI9dGhpcy5zO2ZvcihsZXQgcz0wLG49ci5sZW5ndGg7czxuO3MrKylyW3NdPnQmJmUrKztyZXR1cm4gZX1nZXQgZGlhZ29uYWwoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnMpfWdldCB0aHJlc2hvbGQoKXtyZXR1cm4gTnVtYmVyLkVQU0lMT04vMipNYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF19Z2V0IGxlZnRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5VfWdldCByaWdodFNpbmd1bGFyVmVjdG9ycygpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7cmV0dXJuIGVyLmRpYWcodGhpcy5zKX19ZnVuY3Rpb24gZnIodCxlLHI9ITEpe3JldHVybiB0PXVyLmNoZWNrTWF0cml4KHQpLGU9dXIuY2hlY2tNYXRyaXgoZSkscj9uZXcgY3IodCkuc29sdmUoZSk6dC5pc1NxdWFyZSgpP25ldyBhcih0KS5zb2x2ZShlKTpuZXcgaHIodCkuc29sdmUoZSl9ZnVuY3Rpb24gbXIodCxlKXtsZXQgcj1bXTtmb3IobGV0IHM9MDtzPHQ7cysrKXMhPT1lJiZyLnB1c2gocyk7cmV0dXJuIHJ9ZnVuY3Rpb24gZ3IodCxlLHIscz0xZS05LG49MWUtOSl7aWYodD5uKXJldHVybiBuZXcgQXJyYXkoZS5yb3dzKzEpLmZpbGwoMCk7e2xldCB0PWUuYWRkUm93KHIsWzBdKTtmb3IobGV0IGU9MDtlPHQucm93cztlKyspTWF0aC5hYnModC5nZXQoZSwwKSk8cyYmdC5zZXQoZSwwLDApO3JldHVybiB0LnRvMURBcnJheSgpfX1jbGFzcyB3cntjb25zdHJ1Y3Rvcih0LGU9e30pe2NvbnN0e2Fzc3VtZVN5bW1ldHJpYzpyPSExfT1lO2lmKCEodD11ci5jaGVja01hdHJpeCh0KSkuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBpcyBub3QgYSBzcXVhcmUgbWF0cml4Iik7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgcyxuLG89dC5jb2x1bW5zLGk9bmV3IGVyKG8sbyksdT1uZXcgRmxvYXQ2NEFycmF5KG8pLGE9bmV3IEZsb2F0NjRBcnJheShvKSxsPXQsaD0hMTtpZihoPSEhcnx8dC5pc1N5bW1ldHJpYygpLGgpe2ZvcihzPTA7czxvO3MrKylmb3Iobj0wO248bztuKyspaS5zZXQocyxuLGwuZ2V0KHMsbikpOyFmdW5jdGlvbih0LGUscixzKXtsZXQgbixvLGksdSxhLGwsaCxjO2ZvcihhPTA7YTx0O2ErKylyW2FdPXMuZ2V0KHQtMSxhKTtmb3IodT10LTE7dT4wO3UtLSl7Zm9yKGM9MCxpPTAsbD0wO2w8dTtsKyspYys9TWF0aC5hYnMocltsXSk7aWYoMD09PWMpZm9yKGVbdV09clt1LTFdLGE9MDthPHU7YSsrKXJbYV09cy5nZXQodS0xLGEpLHMuc2V0KHUsYSwwKSxzLnNldChhLHUsMCk7ZWxzZXtmb3IobD0wO2w8dTtsKyspcltsXS89YyxpKz1yW2xdKnJbbF07Zm9yKG49clt1LTFdLG89TWF0aC5zcXJ0KGkpLG4+MCYmKG89LW8pLGVbdV09YypvLGktPW4qbyxyW3UtMV09bi1vLGE9MDthPHU7YSsrKWVbYV09MDtmb3IoYT0wO2E8dTthKyspe2ZvcihuPXJbYV0scy5zZXQoYSx1LG4pLG89ZVthXStzLmdldChhLGEpKm4sbD1hKzE7bDw9dS0xO2wrKylvKz1zLmdldChsLGEpKnJbbF0sZVtsXSs9cy5nZXQobCxhKSpuO2VbYV09b31mb3Iobj0wLGE9MDthPHU7YSsrKWVbYV0vPWksbis9ZVthXSpyW2FdO2ZvcihoPW4vKGkraSksYT0wO2E8dTthKyspZVthXS09aCpyW2FdO2ZvcihhPTA7YTx1O2ErKyl7Zm9yKG49clthXSxvPWVbYV0sbD1hO2w8PXUtMTtsKyspcy5zZXQobCxhLHMuZ2V0KGwsYSktKG4qZVtsXStvKnJbbF0pKTtyW2FdPXMuZ2V0KHUtMSxhKSxzLnNldCh1LGEsMCl9fXJbdV09aX1mb3IodT0wO3U8dC0xO3UrKyl7aWYocy5zZXQodC0xLHUscy5nZXQodSx1KSkscy5zZXQodSx1LDEpLGk9clt1KzFdLDAhPT1pKXtmb3IobD0wO2w8PXU7bCsrKXJbbF09cy5nZXQobCx1KzEpL2k7Zm9yKGE9MDthPD11O2ErKyl7Zm9yKG89MCxsPTA7bDw9dTtsKyspbys9cy5nZXQobCx1KzEpKnMuZ2V0KGwsYSk7Zm9yKGw9MDtsPD11O2wrKylzLnNldChsLGEscy5nZXQobCxhKS1vKnJbbF0pfX1mb3IobD0wO2w8PXU7bCsrKXMuc2V0KGwsdSsxLDApfWZvcihhPTA7YTx0O2ErKylyW2FdPXMuZ2V0KHQtMSxhKSxzLnNldCh0LTEsYSwwKTtzLnNldCh0LTEsdC0xLDEpLGVbMF09MH0obyxhLHUsaSksZnVuY3Rpb24odCxlLHIscyl7bGV0IG4sbyxpLHUsYSxsLGgsYyxmLG0sZyx3LHAsZCx5LGI7Zm9yKGk9MTtpPHQ7aSsrKWVbaS0xXT1lW2ldO2VbdC0xXT0wO2xldCBNPTAsdj0wLHg9TnVtYmVyLkVQU0lMT047Zm9yKGw9MDtsPHQ7bCsrKXtmb3Iodj1NYXRoLm1heCh2LE1hdGguYWJzKHJbbF0pK01hdGguYWJzKGVbbF0pKSxoPWw7aDx0JiYhKE1hdGguYWJzKGVbaF0pPD14KnYpOyloKys7aWYoaD5sKWRve2ZvcihuPXJbbF0sYz0ocltsKzFdLW4pLygyKmVbbF0pLGY9bHIoYywxKSxjPDAmJihmPS1mKSxyW2xdPWVbbF0vKGMrZikscltsKzFdPWVbbF0qKGMrZiksbT1yW2wrMV0sbz1uLXJbbF0saT1sKzI7aTx0O2krKylyW2ldLT1vO2ZvcihNKz1vLGM9cltoXSxnPTEsdz1nLHA9ZyxkPWVbbCsxXSx5PTAsYj0wLGk9aC0xO2k+PWw7aS0tKWZvcihwPXcsdz1nLGI9eSxuPWcqZVtpXSxvPWcqYyxmPWxyKGMsZVtpXSksZVtpKzFdPXkqZix5PWVbaV0vZixnPWMvZixjPWcqcltpXS15Km4scltpKzFdPW8reSooZypuK3kqcltpXSksYT0wO2E8dDthKyspbz1zLmdldChhLGkrMSkscy5zZXQoYSxpKzEseSpzLmdldChhLGkpK2cqbykscy5zZXQoYSxpLGcqcy5nZXQoYSxpKS15Km8pO2M9LXkqYipwKmQqZVtsXS9tLGVbbF09eSpjLHJbbF09ZypjfXdoaWxlKE1hdGguYWJzKGVbbF0pPngqdik7cltsXT1yW2xdK00sZVtsXT0wfWZvcihpPTA7aTx0LTE7aSsrKXtmb3IoYT1pLGM9cltpXSx1PWkrMTt1PHQ7dSsrKXJbdV08YyYmKGE9dSxjPXJbdV0pO2lmKGEhPT1pKWZvcihyW2FdPXJbaV0scltpXT1jLHU9MDt1PHQ7dSsrKWM9cy5nZXQodSxpKSxzLnNldCh1LGkscy5nZXQodSxhKSkscy5zZXQodSxhLGMpfX0obyxhLHUsaSl9ZWxzZXtsZXQgdD1uZXcgZXIobyxvKSxlPW5ldyBGbG9hdDY0QXJyYXkobyk7Zm9yKG49MDtuPG87bisrKWZvcihzPTA7czxvO3MrKyl0LnNldChzLG4sbC5nZXQocyxuKSk7IWZ1bmN0aW9uKHQsZSxyLHMpe2xldCBuLG8saSx1LGEsbCxoLGM9MCxmPXQtMTtmb3IobD1jKzE7bDw9Zi0xO2wrKyl7Zm9yKGg9MCx1PWw7dTw9Zjt1KyspaCs9TWF0aC5hYnMoZS5nZXQodSxsLTEpKTtpZigwIT09aCl7Zm9yKGk9MCx1PWY7dT49bDt1LS0pclt1XT1lLmdldCh1LGwtMSkvaCxpKz1yW3VdKnJbdV07Zm9yKG89TWF0aC5zcXJ0KGkpLHJbbF0+MCYmKG89LW8pLGktPXJbbF0qbyxyW2xdPXJbbF0tbyxhPWw7YTx0O2ErKyl7Zm9yKG49MCx1PWY7dT49bDt1LS0pbis9clt1XSplLmdldCh1LGEpO2ZvcihuLz1pLHU9bDt1PD1mO3UrKyllLnNldCh1LGEsZS5nZXQodSxhKS1uKnJbdV0pfWZvcih1PTA7dTw9Zjt1Kyspe2ZvcihuPTAsYT1mO2E+PWw7YS0tKW4rPXJbYV0qZS5nZXQodSxhKTtmb3Iobi89aSxhPWw7YTw9ZjthKyspZS5zZXQodSxhLGUuZ2V0KHUsYSktbipyW2FdKX1yW2xdPWgqcltsXSxlLnNldChsLGwtMSxoKm8pfX1mb3IodT0wO3U8dDt1KyspZm9yKGE9MDthPHQ7YSsrKXMuc2V0KHUsYSx1PT09YT8xOjApO2ZvcihsPWYtMTtsPj1jKzE7bC0tKWlmKDAhPT1lLmdldChsLGwtMSkpe2Zvcih1PWwrMTt1PD1mO3UrKylyW3VdPWUuZ2V0KHUsbC0xKTtmb3IoYT1sO2E8PWY7YSsrKXtmb3Iobz0wLHU9bDt1PD1mO3UrKylvKz1yW3VdKnMuZ2V0KHUsYSk7Zm9yKG89by9yW2xdL2UuZ2V0KGwsbC0xKSx1PWw7dTw9Zjt1Kyspcy5zZXQodSxhLHMuZ2V0KHUsYSkrbypyW3VdKX19fShvLHQsZSxpKSxmdW5jdGlvbih0LGUscixzLG4pe2xldCBvLGksdSxhLGwsaCxjLGYsbSxnLHcscCxkLHksYixNPXQtMSx2PTAseD10LTEsRT1OdW1iZXIuRVBTSUxPTixTPTAsXz0wLGo9MCxBPTAsUj0wLEk9MCxDPTAsTj0wO2ZvcihvPTA7bzx0O28rKylmb3IoKG88dnx8bz54KSYmKHJbb109bi5nZXQobyxvKSxlW29dPTApLGk9TWF0aC5tYXgoby0xLDApO2k8dDtpKyspXys9TWF0aC5hYnMobi5nZXQobyxpKSk7Zm9yKDtNPj12Oyl7Zm9yKGE9TTthPnYmJihJPU1hdGguYWJzKG4uZ2V0KGEtMSxhLTEpKStNYXRoLmFicyhuLmdldChhLGEpKSwwPT09SSYmKEk9XyksIShNYXRoLmFicyhuLmdldChhLGEtMSkpPEUqSSkpOylhLS07aWYoYT09PU0pbi5zZXQoTSxNLG4uZ2V0KE0sTSkrUykscltNXT1uLmdldChNLE0pLGVbTV09MCxNLS0sTj0wO2Vsc2UgaWYoYT09PU0tMSl7aWYoYz1uLmdldChNLE0tMSkqbi5nZXQoTS0xLE0pLGo9KG4uZ2V0KE0tMSxNLTEpLW4uZ2V0KE0sTSkpLzIsQT1qKmorYyxDPU1hdGguc3FydChNYXRoLmFicyhBKSksbi5zZXQoTSxNLG4uZ2V0KE0sTSkrUyksbi5zZXQoTS0xLE0tMSxuLmdldChNLTEsTS0xKStTKSxmPW4uZ2V0KE0sTSksQT49MCl7Zm9yKEM9aj49MD9qK0M6ai1DLHJbTS0xXT1mK0MscltNXT1yW00tMV0sMCE9PUMmJihyW01dPWYtYy9DKSxlW00tMV09MCxlW01dPTAsZj1uLmdldChNLE0tMSksST1NYXRoLmFicyhmKStNYXRoLmFicyhDKSxqPWYvSSxBPUMvSSxSPU1hdGguc3FydChqKmorQSpBKSxqLz1SLEEvPVIsaT1NLTE7aTx0O2krKylDPW4uZ2V0KE0tMSxpKSxuLnNldChNLTEsaSxBKkMraipuLmdldChNLGkpKSxuLnNldChNLGksQSpuLmdldChNLGkpLWoqQyk7Zm9yKG89MDtvPD1NO28rKylDPW4uZ2V0KG8sTS0xKSxuLnNldChvLE0tMSxBKkMraipuLmdldChvLE0pKSxuLnNldChvLE0sQSpuLmdldChvLE0pLWoqQyk7Zm9yKG89djtvPD14O28rKylDPXMuZ2V0KG8sTS0xKSxzLnNldChvLE0tMSxBKkMraipzLmdldChvLE0pKSxzLnNldChvLE0sQSpzLmdldChvLE0pLWoqQyl9ZWxzZSByW00tMV09ZitqLHJbTV09ZitqLGVbTS0xXT1DLGVbTV09LUM7TS09MixOPTB9ZWxzZXtpZihmPW4uZ2V0KE0sTSksbT0wLGM9MCxhPE0mJihtPW4uZ2V0KE0tMSxNLTEpLGM9bi5nZXQoTSxNLTEpKm4uZ2V0KE0tMSxNKSksMTA9PT1OKXtmb3IoUys9ZixvPXY7bzw9TTtvKyspbi5zZXQobyxvLG4uZ2V0KG8sbyktZik7ST1NYXRoLmFicyhuLmdldChNLE0tMSkpK01hdGguYWJzKG4uZ2V0KE0tMSxNLTIpKSxmPW09Ljc1KkksYz0tLjQzNzUqSSpJfWlmKDMwPT09TiYmKEk9KG0tZikvMixJPUkqSStjLEk+MCkpe2ZvcihJPU1hdGguc3FydChJKSxtPGYmJihJPS1JKSxJPWYtYy8oKG0tZikvMitJKSxvPXY7bzw9TTtvKyspbi5zZXQobyxvLG4uZ2V0KG8sbyktSSk7Uys9SSxmPW09Yz0uOTY0fWZvcihOKz0xLGw9TS0yO2w+PWEmJihDPW4uZ2V0KGwsbCksUj1mLUMsST1tLUMsaj0oUipJLWMpL24uZ2V0KGwrMSxsKStuLmdldChsLGwrMSksQT1uLmdldChsKzEsbCsxKS1DLVItSSxSPW4uZ2V0KGwrMixsKzEpLEk9TWF0aC5hYnMoaikrTWF0aC5hYnMoQSkrTWF0aC5hYnMoUiksai89SSxBLz1JLFIvPUksbCE9PWEpJiYhKE1hdGguYWJzKG4uZ2V0KGwsbC0xKSkqKE1hdGguYWJzKEEpK01hdGguYWJzKFIpKTxFKihNYXRoLmFicyhqKSooTWF0aC5hYnMobi5nZXQobC0xLGwtMSkpK01hdGguYWJzKEMpK01hdGguYWJzKG4uZ2V0KGwrMSxsKzEpKSkpKTspbC0tO2ZvcihvPWwrMjtvPD1NO28rKyluLnNldChvLG8tMiwwKSxvPmwrMiYmbi5zZXQobyxvLTMsMCk7Zm9yKHU9bDt1PD1NLTEmJih5PXUhPT1NLTEsdSE9PWwmJihqPW4uZ2V0KHUsdS0xKSxBPW4uZ2V0KHUrMSx1LTEpLFI9eT9uLmdldCh1KzIsdS0xKTowLGY9TWF0aC5hYnMoaikrTWF0aC5hYnMoQSkrTWF0aC5hYnMoUiksMCE9PWYmJihqLz1mLEEvPWYsUi89ZikpLDAhPT1mKTt1KyspaWYoST1NYXRoLnNxcnQoaipqK0EqQStSKlIpLGo8MCYmKEk9LUkpLDAhPT1JKXtmb3IodSE9PWw/bi5zZXQodSx1LTEsLUkqZik6YSE9PWwmJm4uc2V0KHUsdS0xLC1uLmdldCh1LHUtMSkpLGorPUksZj1qL0ksbT1BL0ksQz1SL0ksQS89aixSLz1qLGk9dTtpPHQ7aSsrKWo9bi5nZXQodSxpKStBKm4uZ2V0KHUrMSxpKSx5JiYoais9UipuLmdldCh1KzIsaSksbi5zZXQodSsyLGksbi5nZXQodSsyLGkpLWoqQykpLG4uc2V0KHUsaSxuLmdldCh1LGkpLWoqZiksbi5zZXQodSsxLGksbi5nZXQodSsxLGkpLWoqbSk7Zm9yKG89MDtvPD1NYXRoLm1pbihNLHUrMyk7bysrKWo9ZipuLmdldChvLHUpK20qbi5nZXQobyx1KzEpLHkmJihqKz1DKm4uZ2V0KG8sdSsyKSxuLnNldChvLHUrMixuLmdldChvLHUrMiktaipSKSksbi5zZXQobyx1LG4uZ2V0KG8sdSktaiksbi5zZXQobyx1KzEsbi5nZXQobyx1KzEpLWoqQSk7Zm9yKG89djtvPD14O28rKylqPWYqcy5nZXQobyx1KSttKnMuZ2V0KG8sdSsxKSx5JiYoais9QypzLmdldChvLHUrMikscy5zZXQobyx1KzIscy5nZXQobyx1KzIpLWoqUikpLHMuc2V0KG8sdSxzLmdldChvLHUpLWopLHMuc2V0KG8sdSsxLHMuZ2V0KG8sdSsxKS1qKkEpfX19aWYoMD09PV8pcmV0dXJuO2ZvcihNPXQtMTtNPj0wO00tLSlpZihqPXJbTV0sQT1lW01dLDA9PT1BKWZvcihhPU0sbi5zZXQoTSxNLDEpLG89TS0xO28+PTA7by0tKXtmb3IoYz1uLmdldChvLG8pLWosUj0wLGk9YTtpPD1NO2krKylSKz1uLmdldChvLGkpKm4uZ2V0KGksTSk7aWYoZVtvXTwwKUM9YyxJPVI7ZWxzZSBpZihhPW8sMD09PWVbb10/bi5zZXQobyxNLDAhPT1jPy1SL2M6LVIvKEUqXykpOihmPW4uZ2V0KG8sbysxKSxtPW4uZ2V0KG8rMSxvKSxBPShyW29dLWopKihyW29dLWopK2Vbb10qZVtvXSxoPShmKkktQypSKS9BLG4uc2V0KG8sTSxoKSxuLnNldChvKzEsTSxNYXRoLmFicyhmKT5NYXRoLmFicyhDKT8oLVItYypoKS9mOigtSS1tKmgpL0MpKSxoPU1hdGguYWJzKG4uZ2V0KG8sTSkpLEUqaCpoPjEpZm9yKGk9bztpPD1NO2krKyluLnNldChpLE0sbi5nZXQoaSxNKS9oKX1lbHNlIGlmKEE8MClmb3IoYT1NLTEsTWF0aC5hYnMobi5nZXQoTSxNLTEpKT5NYXRoLmFicyhuLmdldChNLTEsTSkpPyhuLnNldChNLTEsTS0xLEEvbi5nZXQoTSxNLTEpKSxuLnNldChNLTEsTSwtKG4uZ2V0KE0sTSktaikvbi5nZXQoTSxNLTEpKSk6KGI9cHIoMCwtbi5nZXQoTS0xLE0pLG4uZ2V0KE0tMSxNLTEpLWosQSksbi5zZXQoTS0xLE0tMSxiWzBdKSxuLnNldChNLTEsTSxiWzFdKSksbi5zZXQoTSxNLTEsMCksbi5zZXQoTSxNLDEpLG89TS0yO28+PTA7by0tKXtmb3IoZz0wLHc9MCxpPWE7aTw9TTtpKyspZys9bi5nZXQobyxpKSpuLmdldChpLE0tMSksdys9bi5nZXQobyxpKSpuLmdldChpLE0pO2lmKGM9bi5nZXQobyxvKS1qLGVbb108MClDPWMsUj1nLEk9dztlbHNlIGlmKGE9bywwPT09ZVtvXT8oYj1wcigtZywtdyxjLEEpLG4uc2V0KG8sTS0xLGJbMF0pLG4uc2V0KG8sTSxiWzFdKSk6KGY9bi5nZXQobyxvKzEpLG09bi5nZXQobysxLG8pLHA9KHJbb10taikqKHJbb10taikrZVtvXSplW29dLUEqQSxkPTIqKHJbb10taikqQSwwPT09cCYmMD09PWQmJihwPUUqXyooTWF0aC5hYnMoYykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoZikrTWF0aC5hYnMobSkrTWF0aC5hYnMoQykpKSxiPXByKGYqUi1DKmcrQSp3LGYqSS1DKnctQSpnLHAsZCksbi5zZXQobyxNLTEsYlswXSksbi5zZXQobyxNLGJbMV0pLE1hdGguYWJzKGYpPk1hdGguYWJzKEMpK01hdGguYWJzKEEpPyhuLnNldChvKzEsTS0xLCgtZy1jKm4uZ2V0KG8sTS0xKStBKm4uZ2V0KG8sTSkpL2YpLG4uc2V0KG8rMSxNLCgtdy1jKm4uZ2V0KG8sTSktQSpuLmdldChvLE0tMSkpL2YpKTooYj1wcigtUi1tKm4uZ2V0KG8sTS0xKSwtSS1tKm4uZ2V0KG8sTSksQyxBKSxuLnNldChvKzEsTS0xLGJbMF0pLG4uc2V0KG8rMSxNLGJbMV0pKSksaD1NYXRoLm1heChNYXRoLmFicyhuLmdldChvLE0tMSkpLE1hdGguYWJzKG4uZ2V0KG8sTSkpKSxFKmgqaD4xKWZvcihpPW87aTw9TTtpKyspbi5zZXQoaSxNLTEsbi5nZXQoaSxNLTEpL2gpLG4uc2V0KGksTSxuLmdldChpLE0pL2gpfWZvcihvPTA7bzx0O28rKylpZihvPHZ8fG8+eClmb3IoaT1vO2k8dDtpKyspcy5zZXQobyxpLG4uZ2V0KG8saSkpO2ZvcihpPXQtMTtpPj12O2ktLSlmb3Iobz12O288PXg7bysrKXtmb3IoQz0wLHU9djt1PD1NYXRoLm1pbihpLHgpO3UrKylDKz1zLmdldChvLHUpKm4uZ2V0KHUsaSk7cy5zZXQobyxpLEMpfX0obyxhLHUsaSx0KX10aGlzLm49byx0aGlzLmU9YSx0aGlzLmQ9dSx0aGlzLlY9aX1nZXQgcmVhbEVpZ2VudmFsdWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5kKX1nZXQgaW1hZ2luYXJ5RWlnZW52YWx1ZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmUpfWdldCBlaWdlbnZlY3Rvck1hdHJpeCgpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7bGV0IHQsZSxyPXRoaXMubixzPXRoaXMuZSxuPXRoaXMuZCxvPW5ldyBlcihyLHIpO2Zvcih0PTA7dDxyO3QrKyl7Zm9yKGU9MDtlPHI7ZSsrKW8uc2V0KHQsZSwwKTtvLnNldCh0LHQsblt0XSksc1t0XT4wP28uc2V0KHQsdCsxLHNbdF0pOnNbdF08MCYmby5zZXQodCx0LTEsc1t0XSl9cmV0dXJuIG99fWZ1bmN0aW9uIHByKHQsZSxyLHMpe2xldCBuLG87cmV0dXJuIE1hdGguYWJzKHIpPk1hdGguYWJzKHMpPyhuPXMvcixvPXIrbipzLFsodCtuKmUpL28sKGUtbip0KS9vXSk6KG49ci9zLG89cytuKnIsWyhuKnQrZSkvbywobiplLXQpL29dKX1jbGFzcyBkcntjb25zdHJ1Y3Rvcih0KXtpZighKHQ9dXIuY2hlY2tNYXRyaXgodCkpLmlzU3ltbWV0cmljKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggaXMgbm90IHN5bW1ldHJpYyIpO2xldCBlLHIscyxuPXQsbz1uLnJvd3MsaT1uZXcgZXIobyxvKSx1PSEwO2ZvcihyPTA7cjxvO3IrKyl7bGV0IHQ9MDtmb3Iocz0wO3M8cjtzKyspe2xldCBvPTA7Zm9yKGU9MDtlPHM7ZSsrKW8rPWkuZ2V0KHMsZSkqaS5nZXQocixlKTtvPShuLmdldChyLHMpLW8pL2kuZ2V0KHMscyksaS5zZXQocixzLG8pLHQrPW8qb31mb3IodD1uLmdldChyLHIpLXQsdSYmPXQ+MCxpLnNldChyLHIsTWF0aC5zcXJ0KE1hdGgubWF4KHQsMCkpKSxzPXIrMTtzPG87cysrKWkuc2V0KHIscywwKX10aGlzLkw9aSx0aGlzLnBvc2l0aXZlRGVmaW5pdGU9dX1pc1Bvc2l0aXZlRGVmaW5pdGUoKXtyZXR1cm4gdGhpcy5wb3NpdGl2ZURlZmluaXRlfXNvbHZlKHQpe3Q9dXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5MLHI9ZS5yb3dzO2lmKHQucm93cyE9PXIpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggZGltZW5zaW9ucyBkbyBub3QgbWF0Y2giKTtpZighMT09PXRoaXMuaXNQb3NpdGl2ZURlZmluaXRlKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggaXMgbm90IHBvc2l0aXZlIGRlZmluaXRlIik7bGV0IHMsbixvLGk9dC5jb2x1bW5zLHU9dC5jbG9uZSgpO2ZvcihvPTA7bzxyO28rKylmb3Iobj0wO248aTtuKyspe2ZvcihzPTA7czxvO3MrKyl1LnNldChvLG4sdS5nZXQobyxuKS11LmdldChzLG4pKmUuZ2V0KG8scykpO3Uuc2V0KG8sbix1LmdldChvLG4pL2UuZ2V0KG8sbykpfWZvcihvPXItMTtvPj0wO28tLSlmb3Iobj0wO248aTtuKyspe2ZvcihzPW8rMTtzPHI7cysrKXUuc2V0KG8sbix1LmdldChvLG4pLXUuZ2V0KHMsbikqZS5nZXQocyxvKSk7dS5zZXQobyxuLHUuZ2V0KG8sbikvZS5nZXQobyxvKSl9cmV0dXJuIHV9Z2V0IGxvd2VyVHJpYW5ndWxhck1hdHJpeCgpe3JldHVybiB0aGlzLkx9fWNsYXNzIHlye2NvbnN0cnVjdG9yKHQsZT17fSl7dD11ci5jaGVja01hdHJpeCh0KTtsZXR7WTpyfT1lO2NvbnN0e3NjYWxlU2NvcmVzOnM9ITEsbWF4SXRlcmF0aW9uczpuPTFlMyx0ZXJtaW5hdGlvbkNyaXRlcmlhOm89MWUtMTB9PWU7bGV0IGk7aWYocil7aWYocj1WZShyKSYmIm51bWJlciI9PXR5cGVvZiByWzBdP2VyLmNvbHVtblZlY3RvcihyKTp1ci5jaGVja01hdHJpeChyKSxyLnJvd3MhPT10LnJvd3MpdGhyb3cgbmV3IEVycm9yKCJZIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFzIFgiKTtpPXIuZ2V0Q29sdW1uVmVjdG9yKDApfWVsc2UgaT10LmdldENvbHVtblZlY3RvcigwKTtsZXQgdSxhLGwsaCxjPTE7Zm9yKGxldCBlPTA7ZTxuJiZjPm87ZSsrKWw9dC50cmFuc3Bvc2UoKS5tbXVsKGkpLmRpdihpLnRyYW5zcG9zZSgpLm1tdWwoaSkuZ2V0KDAsMCkpLGw9bC5kaXYobC5ub3JtKCkpLHU9dC5tbXVsKGwpLmRpdihsLnRyYW5zcG9zZSgpLm1tdWwobCkuZ2V0KDAsMCkpLGU+MCYmKGM9dS5jbG9uZSgpLnN1YihoKS5wb3coMikuc3VtKCkpLGg9dS5jbG9uZSgpLHI/KGE9ci50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpLGE9YS5kaXYoYS5ub3JtKCkpLGk9ci5tbXVsKGEpLmRpdihhLnRyYW5zcG9zZSgpLm1tdWwoYSkuZ2V0KDAsMCkpKTppPXU7aWYocil7bGV0IGU9dC50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpO2U9ZS5kaXYoZS5ub3JtKCkpO2xldCBzPXQuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm1tdWwoZS50cmFuc3Bvc2UoKSkpLG49aS50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpLG89ci5jbG9uZSgpLnN1Yih1LmNsb25lKCkubXVsUyhuLmdldCgwLDApKS5tbXVsKGEudHJhbnNwb3NlKCkpKTt0aGlzLnQ9dSx0aGlzLnA9ZS50cmFuc3Bvc2UoKSx0aGlzLnc9bC50cmFuc3Bvc2UoKSx0aGlzLnE9YSx0aGlzLnU9aSx0aGlzLnM9dS50cmFuc3Bvc2UoKS5tbXVsKHUpLHRoaXMueFJlc2lkdWFsPXMsdGhpcy55UmVzaWR1YWw9byx0aGlzLmJldGFzPW59ZWxzZSB0aGlzLnc9bC50cmFuc3Bvc2UoKSx0aGlzLnM9dS50cmFuc3Bvc2UoKS5tbXVsKHUpLnNxcnQoKSx0aGlzLnQ9cz91LmNsb25lKCkuZGl2KHRoaXMucy5nZXQoMCwwKSk6dSx0aGlzLnhSZXNpZHVhbD10LnN1Yih1Lm1tdWwobC50cmFuc3Bvc2UoKSkpfX1GZS5BYnN0cmFjdE1hdHJpeD1aZSxGZS5DSE89ZHIsRmUuQ2hvbGVza3lEZWNvbXBvc2l0aW9uPWRyLEZlLkRpc3RhbmNlTWF0cml4PXNyO3ZhciBicj1GZS5FVkQ9d3I7RmUuRWlnZW52YWx1ZURlY29tcG9zaXRpb249d3IsRmUuTFU9YXIsRmUuTHVEZWNvbXBvc2l0aW9uPWFyO3ZhciBNcj1GZS5NYXRyaXg9ZXI7RmUuTWF0cml4Q29sdW1uU2VsZWN0aW9uVmlldz1jbGFzcyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKHQsZSl7UWUodCxlKSxzdXBlcih0LHQucm93cyxlLmxlbmd0aCksdGhpcy5jb2x1bW5JbmRpY2VzPWV9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHQsdGhpcy5jb2x1bW5JbmRpY2VzW2VdLHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0LHRoaXMuY29sdW1uSW5kaWNlc1tlXSl9fSxGZS5NYXRyaXhDb2x1bW5WaWV3PWNsYXNzIGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IodCxlKXtHZSh0LGUpLHN1cGVyKHQsdC5yb3dzLDEpLHRoaXMuY29sdW1uPWV9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHQsdGhpcy5jb2x1bW4sciksdGhpc31nZXQodCl7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0LHRoaXMuY29sdW1uKX19LEZlLk1hdHJpeEZsaXBDb2x1bW5WaWV3PWNsYXNzIGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCx0LnJvd3MsdC5jb2x1bW5zKX1zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodCx0aGlzLmNvbHVtbnMtZS0xLHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0LHRoaXMuY29sdW1ucy1lLTEpfX0sRmUuTWF0cml4RmxpcFJvd1ZpZXc9Y2xhc3MgZXh0ZW5kcyBucntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHQucm93cyx0LmNvbHVtbnMpfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldCh0aGlzLnJvd3MtdC0xLGUsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMucm93cy10LTEsZSl9fSxGZS5NYXRyaXhSb3dTZWxlY3Rpb25WaWV3PWNsYXNzIGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IodCxlKXtLZSh0LGUpLHN1cGVyKHQsZS5sZW5ndGgsdC5jb2x1bW5zKSx0aGlzLnJvd0luZGljZXM9ZX1zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodGhpcy5yb3dJbmRpY2VzW3RdLGUsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMucm93SW5kaWNlc1t0XSxlKX19LEZlLk1hdHJpeFJvd1ZpZXc9Y2xhc3MgZXh0ZW5kcyBucntjb25zdHJ1Y3Rvcih0LGUpe1VlKHQsZSksc3VwZXIodCwxLHQuY29sdW1ucyksdGhpcy5yb3c9ZX1zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodGhpcy5yb3csZSxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQodGhpcy5yb3csZSl9fSxGZS5NYXRyaXhTZWxlY3Rpb25WaWV3PW9yLEZlLk1hdHJpeFN1YlZpZXc9Y2xhc3MgZXh0ZW5kcyBucntjb25zdHJ1Y3Rvcih0LGUscixzLG4pe1hlKHQsZSxyLHMsbiksc3VwZXIodCxyLWUrMSxuLXMrMSksdGhpcy5zdGFydFJvdz1lLHRoaXMuc3RhcnRDb2x1bW49c31zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodGhpcy5zdGFydFJvdyt0LHRoaXMuc3RhcnRDb2x1bW4rZSxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQodGhpcy5zdGFydFJvdyt0LHRoaXMuc3RhcnRDb2x1bW4rZSl9fTt2YXIgdnI9RmUuTWF0cml4VHJhbnNwb3NlVmlldz1jbGFzcyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsdC5jb2x1bW5zLHQucm93cyl9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KGUsdCxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQoZSx0KX19LHhyPUZlLk5JUEFMUz15cjtGZS5OaXBhbHM9eXIsRmUuUVI9aHIsRmUuUXJEZWNvbXBvc2l0aW9uPWhyO3ZhciBFcj1GZS5TVkQ9Y3I7RmUuU2luZ3VsYXJWYWx1ZURlY29tcG9zaXRpb249Y3IsRmUuU3ltbWV0cmljTWF0cml4PXJyLEZlLldyYXBwZXJNYXRyaXgxRD1pcixGZS5XcmFwcGVyTWF0cml4MkQ9dXIsRmUuY29ycmVsYXRpb249ZnVuY3Rpb24odCxlPXQscj17fSl7dD1uZXcgZXIodCk7bGV0IHM9ITE7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxlci5pc01hdHJpeChlKXx8VmUoZSk/ZT1uZXcgZXIoZSk6KHI9ZSxlPXQscz0hMCksdC5yb3dzIT09ZS5yb3dzKXRocm93IG5ldyBUeXBlRXJyb3IoIkJvdGggbWF0cmljZXMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIik7Y29uc3R7Y2VudGVyOm49ITAsc2NhbGU6bz0hMH09cjtuJiYodC5jZW50ZXIoImNvbHVtbiIpLHN8fGUuY2VudGVyKCJjb2x1bW4iKSksbyYmKHQuc2NhbGUoImNvbHVtbiIpLHN8fGUuc2NhbGUoImNvbHVtbiIpKTtjb25zdCBpPXQuc3RhbmRhcmREZXZpYXRpb24oImNvbHVtbiIse3VuYmlhc2VkOiEwfSksdT1zP2k6ZS5zdGFuZGFyZERldmlhdGlvbigiY29sdW1uIix7dW5iaWFzZWQ6ITB9KSxhPXQudHJhbnNwb3NlKCkubW11bChlKTtmb3IobGV0IGU9MDtlPGEucm93cztlKyspZm9yKGxldCByPTA7cjxhLmNvbHVtbnM7cisrKWEuc2V0KGUscixhLmdldChlLHIpKigxLyhpW2VdKnVbcl0pKSooMS8odC5yb3dzLTEpKSk7cmV0dXJuIGF9LEZlLmNvdmFyaWFuY2U9ZnVuY3Rpb24odCxlPXQscj17fSl7dD1uZXcgZXIodCk7bGV0IHM9ITE7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxlci5pc01hdHJpeChlKXx8VmUoZSk/ZT1uZXcgZXIoZSk6KHI9ZSxlPXQscz0hMCksdC5yb3dzIT09ZS5yb3dzKXRocm93IG5ldyBUeXBlRXJyb3IoIkJvdGggbWF0cmljZXMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIik7Y29uc3R7Y2VudGVyOm49ITB9PXI7biYmKHQ9dC5jZW50ZXIoImNvbHVtbiIpLHN8fChlPWUuY2VudGVyKCJjb2x1bW4iKSkpO2NvbnN0IG89dC50cmFuc3Bvc2UoKS5tbXVsKGUpO2ZvcihsZXQgZT0wO2U8by5yb3dzO2UrKylmb3IobGV0IHI9MDtyPG8uY29sdW1ucztyKyspby5zZXQoZSxyLG8uZ2V0KGUscikqKDEvKHQucm93cy0xKSkpO3JldHVybiBvfTt2YXIgU3I9RmUuZGVmYXVsdD1lcjtGZS5kZXRlcm1pbmFudD1mdW5jdGlvbiB0KGUpe2lmKChlPWVyLmNoZWNrTWF0cml4KGUpKS5pc1NxdWFyZSgpKXtpZigwPT09ZS5jb2x1bW5zKXJldHVybiAxO2xldCByLHMsbixvO2lmKDI9PT1lLmNvbHVtbnMpcmV0dXJuIHI9ZS5nZXQoMCwwKSxzPWUuZ2V0KDAsMSksbj1lLmdldCgxLDApLG89ZS5nZXQoMSwxKSxyKm8tcypuO2lmKDM9PT1lLmNvbHVtbnMpe2xldCBvLGksdTtyZXR1cm4gbz1uZXcgb3IoZSxbMSwyXSxbMSwyXSksaT1uZXcgb3IoZSxbMSwyXSxbMCwyXSksdT1uZXcgb3IoZSxbMSwyXSxbMCwxXSkscj1lLmdldCgwLDApLHM9ZS5nZXQoMCwxKSxuPWUuZ2V0KDAsMikscip0KG8pLXMqdChpKStuKnQodSl9cmV0dXJuIG5ldyBhcihlKS5kZXRlcm1pbmFudH10aHJvdyBFcnJvcigiZGV0ZXJtaW5hbnQgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBmb3IgYSBzcXVhcmUgbWF0cml4Iil9LEZlLmludmVyc2U9ZnVuY3Rpb24odCxlPSExKXtyZXR1cm4gdD11ci5jaGVja01hdHJpeCh0KSxlP25ldyBjcih0KS5pbnZlcnNlKCk6ZnIodCxlci5leWUodC5yb3dzKSl9LEZlLmxpbmVhckRlcGVuZGVuY2llcz1mdW5jdGlvbih0LGU9e30pe2NvbnN0e3RocmVzaG9sZFZhbHVlOnI9MWUtOSx0aHJlc2hvbGRFcnJvcjpzPTFlLTl9PWU7bGV0IG49KHQ9ZXIuY2hlY2tNYXRyaXgodCkpLnJvd3Msbz1uZXcgZXIobixuKTtmb3IobGV0IGU9MDtlPG47ZSsrKXtsZXQgaT1lci5jb2x1bW5WZWN0b3IodC5nZXRSb3coZSkpLHU9dC5zdWJNYXRyaXhSb3cobXIobixlKSkudHJhbnNwb3NlKCksYT1uZXcgY3IodSkuc29sdmUoaSksbD1lci5zdWIoaSx1Lm1tdWwoYSkpLmFicygpLm1heCgpO28uc2V0Um93KGUsZ3IobCxhLGUscixzKSl9cmV0dXJuIG99LEZlLnBzZXVkb0ludmVyc2U9ZnVuY3Rpb24odCxlPU51bWJlci5FUFNJTE9OKXtpZigodD1lci5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXJldHVybiB0LnRyYW5zcG9zZSgpO2xldCByPW5ldyBjcih0LHthdXRvVHJhbnNwb3NlOiEwfSkscz1yLmxlZnRTaW5ndWxhclZlY3RvcnMsbj1yLnJpZ2h0U2luZ3VsYXJWZWN0b3JzLG89ci5kaWFnb25hbDtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrKylNYXRoLmFicyhvW3RdKT5lP29bdF09MS9vW3RdOm9bdF09MDtyZXR1cm4gbi5tbXVsKGVyLmRpYWcobykubW11bChzLnRyYW5zcG9zZSgpKSl9LEZlLnNvbHZlPWZyLEZlLndyYXA9ZnVuY3Rpb24odCxlKXtpZihWZSh0KSlyZXR1cm4gdFswXSYmVmUodFswXSk/bmV3IHVyKHQpOm5ldyBpcih0LGUpO3Rocm93IG5ldyBFcnJvcigidGhlIGFyZ3VtZW50IGlzIG5vdCBhbiBhcnJheSIpfTtjb25zdCBfcj1icixqcj1NcixBcj12cixScj14cixJcj1FcjtTci5NYXRyaXgmJlNyLk1hdHJpeDtsZXQgQ3I9Y2xhc3MgdHtjb25zdHJ1Y3Rvcih0LGU9e30scil7aWYodGhpcy5VPW51bGwsdGhpcy5TPW51bGwscilyZXR1cm4gdGhpcy5jZW50ZXI9ci5jZW50ZXIsdGhpcy5zY2FsZT1yLnNjYWxlLHRoaXMubWVhbnM9ci5tZWFucyx0aGlzLnN0ZGV2cz1yLnN0ZGV2cyx0aGlzLlU9anIuY2hlY2tNYXRyaXgoci5VKSx0aGlzLlM9ci5TLHRoaXMuUj1yLlIsdm9pZCh0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9ci5leGNsdWRlZEZlYXR1cmVzfHxbXSk7bGV0IHM7cz0oQXJyYXkuaXNBcnJheSh0KSxuZXcganIodCkpO2NvbnN0e2lzQ292YXJpYW5jZU1hdHJpeDpuPSExLG1ldGhvZDpvPSJTVkQiLG5Db21wTklQQUxTOmk9MixjZW50ZXI6dT0hMCxzY2FsZTphPSExLGlnbm9yZVplcm9WYXJpYW5jZTpsPSExfT1lO2lmKHRoaXMuY2VudGVyPXUsdGhpcy5zY2FsZT1hLHRoaXMubWVhbnM9bnVsbCx0aGlzLnN0ZGV2cz1udWxsLHRoaXMuZXhjbHVkZWRGZWF0dXJlcz1bXSxuKXRoaXMuX2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeChzKTtlbHNlIHN3aXRjaCh0aGlzLl9hZGp1c3QocyxsKSxvKXtjYXNlImNvdmFyaWFuY2VNYXRyaXgiOntjb25zdCB0PW5ldyBBcihzKS5tbXVsKHMpLmRpdihzLnJvd3MtMSk7dGhpcy5fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpO2JyZWFrfWNhc2UiTklQQUxTIjp0aGlzLl9jb21wdXRlV2l0aE5JUEFMUyhzLGkpO2JyZWFrO2Nhc2UiU1ZEIjp7Y29uc3QgdD1uZXcgSXIocyx7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6ITEsY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzOiEwLGF1dG9UcmFuc3Bvc2U6ITB9KTt0aGlzLlU9dC5yaWdodFNpbmd1bGFyVmVjdG9ycztjb25zdCBlPXQuZGlhZ29uYWwscj1bXTtmb3IoY29uc3QgdCBvZiBlKXIucHVzaCh0KnQvKHMucm93cy0xKSk7dGhpcy5TPXI7YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gbWV0aG9kOiAke299YCl9fXN0YXRpYyBsb2FkKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZS5uYW1lKXRocm93IG5ldyBUeXBlRXJyb3IoIm1vZGVsIG11c3QgaGF2ZSBhIG5hbWUgcHJvcGVydHkiKTtpZigiUENBIiE9PWUubmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgaW52YWxpZCBtb2RlbDogJHtlLm5hbWV9YCk7cmV0dXJuIG5ldyB0KHZvaWQgMCx2b2lkIDAsZSl9cHJlZGljdCh0LGU9e30pe2NvbnN0e25Db21wb25lbnRzOnI9dGhpcy5VLmNvbHVtbnN9PWU7bGV0IHM7aWYocz0oQXJyYXkuaXNBcnJheSh0KSxuZXcganIodCkpLHRoaXMuY2VudGVyJiYocy5zdWJSb3dWZWN0b3IodGhpcy5tZWFucyksdGhpcy5zY2FsZSkpe2ZvcihsZXQgdCBvZiB0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMpcy5yZW1vdmVDb2x1bW4odCk7cy5kaXZSb3dWZWN0b3IodGhpcy5zdGRldnMpfWxldCBuPXMubW11bCh0aGlzLlUpO3JldHVybiBuLnN1Yk1hdHJpeCgwLG4ucm93cy0xLDAsci0xKX1pbnZlcnQodCl7bGV0IGU9KHQ9anIuY2hlY2tNYXRyaXgodCkpLm1tdWwodGhpcy5VLnRyYW5zcG9zZSgpKTtyZXR1cm4gdGhpcy5jZW50ZXImJih0aGlzLnNjYWxlJiZlLm11bFJvd1ZlY3Rvcih0aGlzLnN0ZGV2cyksZS5hZGRSb3dWZWN0b3IodGhpcy5tZWFucykpLGV9Z2V0RXhwbGFpbmVkVmFyaWFuY2UoKXtsZXQgdD0wO2lmKHRoaXMuUylmb3IoY29uc3QgZSBvZiB0aGlzLlMpdCs9ZTtyZXR1cm4gdGhpcy5TP3RoaXMuUy5tYXAoKGU9PmUvdCkpOltdfWdldEN1bXVsYXRpdmVWYXJpYW5jZSgpe2xldCB0PXRoaXMuZ2V0RXhwbGFpbmVkVmFyaWFuY2UoKTtmb3IobGV0IGU9MTtlPHQubGVuZ3RoO2UrKyl0W2VdKz10W2UtMV07cmV0dXJuIHR9Z2V0RWlnZW52ZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXRFaWdlbnZhbHVlcygpe3JldHVybiB0aGlzLlN9Z2V0U3RhbmRhcmREZXZpYXRpb25zKCl7cmV0dXJuIHRoaXMuUy5tYXAoKHQ9Pk1hdGguc3FydCh0KSkpfWdldExvYWRpbmdzKCl7cmV0dXJuIHRoaXMuVS50cmFuc3Bvc2UoKX10b0pTT04oKXtyZXR1cm57bmFtZToiUENBIixjZW50ZXI6dGhpcy5jZW50ZXIsc2NhbGU6dGhpcy5zY2FsZSxtZWFuczp0aGlzLm1lYW5zLHN0ZGV2czp0aGlzLnN0ZGV2cyxVOnRoaXMuVSxTOnRoaXMuUyxleGNsdWRlZEZlYXR1cmVzOnRoaXMuZXhjbHVkZWRGZWF0dXJlc319X2FkanVzdCh0LGUpe2lmKHRoaXMuY2VudGVyKXtjb25zdCByPXQubWVhbigiY29sdW1uIikscz10aGlzLnNjYWxlP3Quc3RhbmRhcmREZXZpYXRpb24oImNvbHVtbiIse21lYW46cn0pOm51bGw7aWYodGhpcy5tZWFucz1yLHQuc3ViUm93VmVjdG9yKHIpLHRoaXMuc2NhbGUpe2ZvcihsZXQgcj0wO3I8cy5sZW5ndGg7cisrKWlmKDA9PT1zW3JdKXtpZighZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ2Fubm90IHNjYWxlIHRoZSBkYXRhc2V0IChzdGFuZGFyZCBkZXZpYXRpb24gaXMgemVybyBhdCBpbmRleCAke3J9YCk7dC5yZW1vdmVDb2x1bW4ocikscy5zcGxpY2UociwxKSx0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMucHVzaChyKSxyLS19dGhpcy5zdGRldnM9cyx0LmRpdlJvd1ZlY3RvcihzKX19fV9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgodCl7Y29uc3QgZT1uZXcgX3IodCx7YXNzdW1lU3ltbWV0cmljOiEwfSk7dGhpcy5VPWUuZWlnZW52ZWN0b3JNYXRyaXgsdGhpcy5VLmZsaXBSb3dzKCksdGhpcy5TPWUucmVhbEVpZ2VudmFsdWVzLHRoaXMuUy5yZXZlcnNlKCl9X2NvbXB1dGVXaXRoTklQQUxTKHQsZSl7dGhpcy5VPW5ldyBqcihlLHQuY29sdW1ucyksdGhpcy5TPVtdO2xldCByPXQ7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bmV3IFJyKHIpO3RoaXMuVS5zZXRSb3codCxlLncudHJhbnNwb3NlKCkpLHRoaXMuUy5wdXNoKE1hdGgucG93KGUucy5nZXQoMCwwKSwyKSkscj1lLnhSZXNpZHVhbH10aGlzLlU9dGhpcy5VLnRyYW5zcG9zZSgpfX07ZnVuY3Rpb24gTnIodCxlPXt9KXtpZighY2UodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9d3QoZSwic2NhbGUiKTttZShyKXx8KHI9ITApO2xldCBzPXd0KGUsIm5Db21wTklQQUxTIik7d2Uocyl8fChzPTIpLHM9a2Uocyk7bGV0IG49b2Uod3QodCwwLFtdKSk7aWYoMD09PW4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGRpbWVuc2lvbiBvZiBkYXRhIik7aWYocz5uKXRocm93IG5ldyBFcnJvcihgbkNvbXBOSVBBTFNbJHtzfV0gaXMgbW9yZSB0aGFuIHRoZSBkaW1lbnNpb25bJHtufV0gb2YgZGF0YWApO3JldHVybiBuZXcgQ3IodCx7bWV0aG9kOiJOSVBBTFMiLHNjYWxlOnIsbkNvbXBOSVBBTFM6c30pLnByZWRpY3QodCkudG9KU09OKCl9ZnVuY3Rpb24ga3IodCxlKXtmb3IodmFyIHI9LTEscz1udWxsPT10PzA6dC5sZW5ndGg7KytyPHMmJiExIT09ZSh0W3JdLHIsdCk7KTtyZXR1cm4gdH12YXIgVHIsRnI9ZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgcz0tMSxuPU9iamVjdCh0KSxvPXIodCksaT1vLmxlbmd0aDtpLS07KXt2YXIgdT1vW1RyP2k6KytzXTtpZighMT09PWUoblt1XSx1LG4pKWJyZWFrfXJldHVybiB0fTtmdW5jdGlvbiBPcih0KXtyZXR1cm4gZyh0KSYmIltvYmplY3QgQXJndW1lbnRzXSI9PW0odCl9dmFyIFZyPU9iamVjdC5wcm90b3R5cGUsenI9VnIuaGFzT3duUHJvcGVydHksRHI9VnIucHJvcGVydHlJc0VudW1lcmFibGUsUHI9T3IoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9PcjpmdW5jdGlvbih0KXtyZXR1cm4gZyh0KSYmenIuY2FsbCh0LCJjYWxsZWUiKSYmIURyLmNhbGwodCwiY2FsbGVlIil9O3ZhciBxcj0ib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLCRyPXFyJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsTHI9JHImJiRyLmV4cG9ydHM9PT1xcj9zLkJ1ZmZlcjp2b2lkIDAsVXI9KExyP0xyLmlzQnVmZmVyOnZvaWQgMCl8fGZ1bmN0aW9uKCl7cmV0dXJuITF9LEdyPTkwMDcxOTkyNTQ3NDA5OTEsQnI9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIFdyKHQsZSl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lP0dyOmUpJiYoIm51bWJlciI9PXJ8fCJzeW1ib2wiIT1yJiZCci50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9dmFyIEtyPXt9O0tyWyJbb2JqZWN0IEZsb2F0MzJBcnJheV0iXT1LclsiW29iamVjdCBGbG9hdDY0QXJyYXldIl09S3JbIltvYmplY3QgSW50OEFycmF5XSJdPUtyWyJbb2JqZWN0IEludDE2QXJyYXldIl09S3JbIltvYmplY3QgSW50MzJBcnJheV0iXT1LclsiW29iamVjdCBVaW50OEFycmF5XSJdPUtyWyJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSJdPUtyWyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPUtyWyJbb2JqZWN0IFVpbnQzMkFycmF5XSJdPSEwLEtyWyJbb2JqZWN0IEFyZ3VtZW50c10iXT1LclsiW29iamVjdCBBcnJheV0iXT1LclsiW29iamVjdCBBcnJheUJ1ZmZlcl0iXT1LclsiW29iamVjdCBCb29sZWFuXSJdPUtyWyJbb2JqZWN0IERhdGFWaWV3XSJdPUtyWyJbb2JqZWN0IERhdGVdIl09S3JbIltvYmplY3QgRXJyb3JdIl09S3JbIltvYmplY3QgRnVuY3Rpb25dIl09S3JbIltvYmplY3QgTWFwXSJdPUtyWyJbb2JqZWN0IE51bWJlcl0iXT1LclsiW29iamVjdCBPYmplY3RdIl09S3JbIltvYmplY3QgUmVnRXhwXSJdPUtyWyJbb2JqZWN0IFNldF0iXT1LclsiW29iamVjdCBTdHJpbmddIl09S3JbIltvYmplY3QgV2Vha01hcF0iXT0hMTt2YXIgUXI9Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxYcj1RciYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLFlyPVhyJiZYci5leHBvcnRzPT09UXImJmUucHJvY2VzcyxKcj1mdW5jdGlvbigpe3RyeXt2YXIgdD1YciYmWHIucmVxdWlyZSYmWHIucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxZciYmWXIuYmluZGluZyYmWXIuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCksSHI9SnImJkpyLmlzVHlwZWRBcnJheSxacj1Icj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fShIcik6ZnVuY3Rpb24odCl7cmV0dXJuIGcodCkmJkR0KHQubGVuZ3RoKSYmISFLclttKHQpXX0sdHM9WnIsZXM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBycyhlLHIpe3ZhciBzPXQoZSksbj0hcyYmUHIoZSksbz0hcyYmIW4mJlVyKGUpLGk9IXMmJiFuJiYhbyYmdHMoZSksdT1zfHxufHxvfHxpLGE9dT9mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxzPUFycmF5KHQpOysrcjx0OylzW3JdPWUocik7cmV0dXJuIHN9KGUubGVuZ3RoLFN0cmluZyk6W10sbD1hLmxlbmd0aDtmb3IodmFyIGggaW4gZSkhciYmIWVzLmNhbGwoZSxoKXx8dSYmKCJsZW5ndGgiPT1ofHxvJiYoIm9mZnNldCI9PWh8fCJwYXJlbnQiPT1oKXx8aSYmKCJidWZmZXIiPT1ofHwiYnl0ZUxlbmd0aCI9PWh8fCJieXRlT2Zmc2V0Ij09aCl8fFdyKGgsbCkpfHxhLnB1c2goaCk7cmV0dXJuIGF9ZnVuY3Rpb24gc3ModCl7cmV0dXJuIFB0KHQpP3JzKHQpOk10KHQpfXZhciBucz1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyLHMpe2lmKG51bGw9PXIpcmV0dXJuIHI7aWYoIVB0KHIpKXJldHVybiB0KHIscyk7Zm9yKHZhciBuPXIubGVuZ3RoLG89ZT9uOi0xLGk9T2JqZWN0KHIpOyhlP28tLTorK288bikmJiExIT09cyhpW29dLG8saSk7KTtyZXR1cm4gcn19KChmdW5jdGlvbih0LGUpe3JldHVybiB0JiZGcih0LGUsc3MpfSkpLG9zPW5zO2Z1bmN0aW9uIGlzKHQpe3JldHVybiB0fWZ1bmN0aW9uIHVzKGUscil7dmFyIHM7cmV0dXJuKHQoZSk/a3I6b3MpKGUsImZ1bmN0aW9uIj09dHlwZW9mKHM9cik/czppcyl9ZnVuY3Rpb24gYXModCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgVyh0KTt0aGlzLnNpemU9ZS5zaXplfWFzLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IFcsdGhpcy5zaXplPTB9LGFzLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLHJ9LGFzLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfSxhcy5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sYXMucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187aWYociBpbnN0YW5jZW9mIFcpe3ZhciBzPXIuX19kYXRhX187aWYoIUt8fHMubGVuZ3RoPDE5OSlyZXR1cm4gcy5wdXNoKFt0LGVdKSx0aGlzLnNpemU9KytyLnNpemUsdGhpcztyPXRoaXMuX19kYXRhX189bmV3IFgocyl9cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplPXIuc2l6ZSx0aGlzfTtmdW5jdGlvbiBscyh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgWDsrK2U8cjspdGhpcy5hZGQodFtlXSl9ZnVuY3Rpb24gaHModCxlKXtmb3IodmFyIHI9LTEscz1udWxsPT10PzA6dC5sZW5ndGg7KytyPHM7KWlmKGUodFtyXSxyLHQpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGNzKHQsZSl7cmV0dXJuIHQuaGFzKGUpfWxzLnByb3RvdHlwZS5hZGQ9bHMucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iKSx0aGlzfSxscy5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07dmFyIGZzPTEsbXM9MjtmdW5jdGlvbiBncyh0LGUscixzLG4sbyl7dmFyIGk9ciZmcyx1PXQubGVuZ3RoLGE9ZS5sZW5ndGg7aWYodSE9YSYmIShpJiZhPnUpKXJldHVybiExO3ZhciBsPW8uZ2V0KHQpLGg9by5nZXQoZSk7aWYobCYmaClyZXR1cm4gbD09ZSYmaD09dDt2YXIgYz0tMSxmPSEwLG09ciZtcz9uZXcgbHM6dm9pZCAwO2ZvcihvLnNldCh0LGUpLG8uc2V0KGUsdCk7KytjPHU7KXt2YXIgZz10W2NdLHc9ZVtjXTtpZihzKXZhciBwPWk/cyh3LGcsYyxlLHQsbyk6cyhnLHcsYyx0LGUsbyk7aWYodm9pZCAwIT09cCl7aWYocCljb250aW51ZTtmPSExO2JyZWFrfWlmKG0pe2lmKCFocyhlLChmdW5jdGlvbih0LGUpe2lmKCFjcyhtLGUpJiYoZz09PXR8fG4oZyx0LHIscyxvKSkpcmV0dXJuIG0ucHVzaChlKX0pKSl7Zj0hMTticmVha319ZWxzZSBpZihnIT09dyYmIW4oZyx3LHIscyxvKSl7Zj0hMTticmVha319cmV0dXJuIG8uZGVsZXRlKHQpLG8uZGVsZXRlKGUpLGZ9dmFyIHdzPXMuVWludDhBcnJheTtmdW5jdGlvbiBwcyh0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxzKXtyWysrZV09W3MsdF19KSkscn1mdW5jdGlvbiBkcyh0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7clsrK2VdPXR9KSkscn12YXIgeXM9MSxicz0yLE1zPSJbb2JqZWN0IEJvb2xlYW5dIix2cz0iW29iamVjdCBEYXRlXSIseHM9IltvYmplY3QgRXJyb3JdIixFcz0iW29iamVjdCBNYXBdIixTcz0iW29iamVjdCBOdW1iZXJdIixfcz0iW29iamVjdCBSZWdFeHBdIixqcz0iW29iamVjdCBTZXRdIixBcz0iW29iamVjdCBTdHJpbmddIixScz0iW29iamVjdCBTeW1ib2xdIixJcz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLENzPSJbb2JqZWN0IERhdGFWaWV3XSIsTnM9bj9uLnByb3RvdHlwZTp2b2lkIDAsa3M9TnM/TnMudmFsdWVPZjp2b2lkIDA7dmFyIFRzPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsRnM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxPcz1Gcz9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1PYmplY3QodCksZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEscz1udWxsPT10PzA6dC5sZW5ndGgsbj0wLG89W107KytyPHM7KXt2YXIgaT10W3JdO2UoaSxyLHQpJiYob1tuKytdPWkpfXJldHVybiBvfShGcyh0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIFRzLmNhbGwodCxlKX0pKSl9OmZ1bmN0aW9uKCl7cmV0dXJuW119LFZzPU9zO2Z1bmN0aW9uIHpzKGUpe3JldHVybiBmdW5jdGlvbihlLHIscyl7dmFyIG49cihlKTtyZXR1cm4gdChlKT9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLHM9ZS5sZW5ndGgsbj10Lmxlbmd0aDsrK3I8czspdFtuK3JdPWVbcl07cmV0dXJuIHR9KG4scyhlKSl9KGUsc3MsVnMpfXZhciBEcz0xLFBzPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHFzPTEsJHM9IltvYmplY3QgQXJndW1lbnRzXSIsTHM9IltvYmplY3QgQXJyYXldIixVcz0iW29iamVjdCBPYmplY3RdIixHcz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEJzKGUscixzLG4sbyxpKXt2YXIgdT10KGUpLGE9dChyKSxsPXU/THM6VnQoZSksaD1hP0xzOlZ0KHIpLGM9KGw9bD09JHM/VXM6bCk9PVVzLGY9KGg9aD09JHM/VXM6aCk9PVVzLG09bD09aDtpZihtJiZVcihlKSl7aWYoIVVyKHIpKXJldHVybiExO3U9ITAsYz0hMX1pZihtJiYhYylyZXR1cm4gaXx8KGk9bmV3IGFzKSx1fHx0cyhlKT9ncyhlLHIscyxuLG8saSk6ZnVuY3Rpb24odCxlLHIscyxuLG8saSl7c3dpdGNoKHIpe2Nhc2UgQ3M6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIElzOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFvKG5ldyB3cyh0KSxuZXcgd3MoZSkpKTtjYXNlIE1zOmNhc2UgdnM6Y2FzZSBTczpyZXR1cm4gVSgrdCwrZSk7Y2FzZSB4czpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UgX3M6Y2FzZSBBczpyZXR1cm4gdD09ZSsiIjtjYXNlIEVzOnZhciB1PXBzO2Nhc2UganM6dmFyIGE9cyZ5cztpZih1fHwodT1kcyksdC5zaXplIT1lLnNpemUmJiFhKXJldHVybiExO3ZhciBsPWkuZ2V0KHQpO2lmKGwpcmV0dXJuIGw9PWU7c3w9YnMsaS5zZXQodCxlKTt2YXIgaD1ncyh1KHQpLHUoZSkscyxuLG8saSk7cmV0dXJuIGkuZGVsZXRlKHQpLGg7Y2FzZSBSczppZihrcylyZXR1cm4ga3MuY2FsbCh0KT09a3MuY2FsbChlKX1yZXR1cm4hMX0oZSxyLGwscyxuLG8saSk7aWYoIShzJnFzKSl7dmFyIGc9YyYmR3MuY2FsbChlLCJfX3dyYXBwZWRfXyIpLHc9ZiYmR3MuY2FsbChyLCJfX3dyYXBwZWRfXyIpO2lmKGd8fHcpe3ZhciBwPWc/ZS52YWx1ZSgpOmUsZD13P3IudmFsdWUoKTpyO3JldHVybiBpfHwoaT1uZXcgYXMpLG8ocCxkLHMsbixpKX19cmV0dXJuISFtJiYoaXx8KGk9bmV3IGFzKSxmdW5jdGlvbih0LGUscixzLG4sbyl7dmFyIGk9ciZEcyx1PXpzKHQpLGE9dS5sZW5ndGg7aWYoYSE9enMoZSkubGVuZ3RoJiYhaSlyZXR1cm4hMTtmb3IodmFyIGw9YTtsLS07KXt2YXIgaD11W2xdO2lmKCEoaT9oIGluIGU6UHMuY2FsbChlLGgpKSlyZXR1cm4hMX12YXIgYz1vLmdldCh0KSxmPW8uZ2V0KGUpO2lmKGMmJmYpcmV0dXJuIGM9PWUmJmY9PXQ7dmFyIG09ITA7by5zZXQodCxlKSxvLnNldChlLHQpO2Zvcih2YXIgZz1pOysrbDxhOyl7dmFyIHc9dFtoPXVbbF1dLHA9ZVtoXTtpZihzKXZhciBkPWk/cyhwLHcsaCxlLHQsbyk6cyh3LHAsaCx0LGUsbyk7aWYoISh2b2lkIDA9PT1kP3c9PT1wfHxuKHcscCxyLHMsbyk6ZCkpe209ITE7YnJlYWt9Z3x8KGc9ImNvbnN0cnVjdG9yIj09aCl9aWYobSYmIWcpe3ZhciB5PXQuY29uc3RydWN0b3IsYj1lLmNvbnN0cnVjdG9yO3k9PWJ8fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIHkmJnkgaW5zdGFuY2VvZiB5JiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYiBpbnN0YW5jZW9mIGJ8fChtPSExKX1yZXR1cm4gby5kZWxldGUodCksby5kZWxldGUoZSksbX0oZSxyLHMsbixvLGkpKX1mdW5jdGlvbiBXcyh0LGUscixzLG4pe3JldHVybiB0PT09ZXx8KG51bGw9PXR8fG51bGw9PWV8fCFnKHQpJiYhZyhlKT90IT10JiZlIT1lOkJzKHQsZSxyLHMsV3MsbikpfXZhciBLcz0xLFFzPTI7ZnVuY3Rpb24gWHModCl7cmV0dXJuIHQ9PXQmJiFNKHQpfWZ1bmN0aW9uIFlzKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBudWxsIT1yJiYoclt0XT09PWUmJih2b2lkIDAhPT1lfHx0IGluIE9iamVjdChyKSkpfX1mdW5jdGlvbiBKcyh0KXt2YXIgZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9c3ModCkscj1lLmxlbmd0aDtyLS07KXt2YXIgcz1lW3JdLG49dFtzXTtlW3JdPVtzLG4sWHMobildfXJldHVybiBlfSh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/WXMoZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihyKXtyZXR1cm4gcj09PXR8fGZ1bmN0aW9uKHQsZSxyLHMpe3ZhciBuPXIubGVuZ3RoLG89bixpPSFzO2lmKG51bGw9PXQpcmV0dXJuIW87Zm9yKHQ9T2JqZWN0KHQpO24tLTspe3ZhciB1PXJbbl07aWYoaSYmdVsyXT91WzFdIT09dFt1WzBdXTohKHVbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrbjxvOyl7dmFyIGE9KHU9cltuXSlbMF0sbD10W2FdLGg9dVsxXTtpZihpJiZ1WzJdKXtpZih2b2lkIDA9PT1sJiYhKGEgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgYz1uZXcgYXM7aWYocyl2YXIgZj1zKGwsaCxhLHQsZSxjKTtpZighKHZvaWQgMD09PWY/V3MoaCxsLEtzfFFzLHMsYyk6ZikpcmV0dXJuITF9fXJldHVybiEwfShyLHQsZSl9fWZ1bmN0aW9uIEhzKHQsZSl7cmV0dXJuIG51bGwhPXQmJmUgaW4gT2JqZWN0KHQpfWZ1bmN0aW9uIFpzKGUscil7cmV0dXJuIG51bGwhPWUmJmZ1bmN0aW9uKGUscixzKXtmb3IodmFyIG49LTEsbz0ocj1jdChyLGUpKS5sZW5ndGgsaT0hMTsrK248bzspe3ZhciB1PW10KHJbbl0pO2lmKCEoaT1udWxsIT1lJiZzKGUsdSkpKWJyZWFrO2U9ZVt1XX1yZXR1cm4gaXx8KytuIT1vP2k6ISEobz1udWxsPT1lPzA6ZS5sZW5ndGgpJiZEdChvKSYmV3IodSxvKSYmKHQoZSl8fFByKGUpKX0oZSxyLEhzKX12YXIgdG49MSxlbj0yO2Z1bmN0aW9uIHJuKHQpe3JldHVybiBiKHQpPyR0KG10KHQpKTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGd0KGUsdCl9fSh0KX1mdW5jdGlvbiBzbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGw9PWU/aXM6Im9iamVjdCI9PXR5cGVvZiBlP3QoZSk/KHI9ZVswXSxzPWVbMV0sYihyKSYmWHMocyk/WXMobXQocikscyk6ZnVuY3Rpb24odCl7dmFyIGU9d3QodCxyKTtyZXR1cm4gdm9pZCAwPT09ZSYmZT09PXM/WnModCxyKTpXcyhzLGUsdG58ZW4pfSk6SnMoZSk6cm4oZSk7dmFyIHIsc31mdW5jdGlvbiBubih0LGUpe3ZhciByPS0xLHM9UHQodCk/QXJyYXkodC5sZW5ndGgpOltdO3JldHVybiBvcyh0LChmdW5jdGlvbih0LG4sbyl7c1srK3JdPWUodCxuLG8pfSkpLHN9ZnVuY3Rpb24gb24oZSxyKXtyZXR1cm4odChlKT9vdDpubikoZSxzbihyKSl9ZnVuY3Rpb24gdW4odCl7cmV0dXJuIG51bGw9PXQ/W106ZnVuY3Rpb24odCxlKXtyZXR1cm4gb3QoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9KHQsc3ModCkpfWZ1bmN0aW9uIGFuKHQsZSl7aWYoIXVlKHQpKXJldHVybnt9O2lmKCFjZShlKSlyZXR1cm57fTtsZXQgcj17fTtyZXR1cm4gdXMoZSwoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKHQsZSl7cmV0dXJuISF1ZSh0KSYmISghZ2UoZSkmJiF3ZShlKSkmJmUgaW4gdH0pKHQsZSkmJihyW2VdPXd0KHQsZSkpfSkpLHJ9dmFyIGxuPXt9LGhuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y2xhc3MgY257Y29uc3RydWN0b3IodCl7dGhpcy5nZXRDb3N0PSgpPT50aGlzLkVsZW1lbnRzLm1hcCgodD0+dC5EaXN0YW5jZUZyb21NZWRvaWQpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApLHRoaXMuZmluZEJlc3RNZWRvaWRJZHg9dD0+dGhpcy5FbGVtZW50cy5tYXAoKGU9PnRoaXMuY2FsY0Nvc3RGb3JHaXZlbkVsZW1lbnRBc01lZG9pZChlLHQpKSkucmVkdWNlKCgodCxlLHIscyk9PmUuQ29zdElmTWFkZU1lZG9pZDxzW3RdLkNvc3RJZk1hZGVNZWRvaWQ/cjp0KSwwKSx0aGlzLmNhbGNDb3N0Rm9yR2l2ZW5FbGVtZW50QXNNZWRvaWQ9KHQsZSk9Pih7Q29zdElmTWFkZU1lZG9pZDpuZXcgY24oe0VsZW1lbnRzOnRoaXMuRWxlbWVudHMubWFwKChyPT4oe0Rpc3RhbmNlRnJvbU1lZG9pZDplKHIuRWxlbWVudCx0LkVsZW1lbnQpLEVsZW1lbnQ6ci5FbGVtZW50fSkpKSxNZWRvaWQ6dC5FbGVtZW50fSkuZ2V0Q29zdCgpLEVsZW1lbnQ6dH0pLHRoaXMuRWxlbWVudHM9dC5FbGVtZW50cyx0aGlzLk1lZG9pZD10Lk1lZG9pZH19aG4uQ2x1c3Rlcj1jbjt2YXIgZm49e30sbW49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KG1uLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxtbi5kaXN0YW5jZT0odCxlKT0+e2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgaW5wdXRzIG11c3QgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24iKTtjb25zdCByPUFycmF5LmZyb20odC5rZXlzKCkpLm1hcCgocj0+TWF0aC5wb3coTWF0aC5hYnModFtyXS1lW3JdKSwyKSkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCk7cmV0dXJuIE1hdGguc3FydChyKX07dmFyIGduPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShnbiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZ24ua0d0RWxlbWVudEFyckxlbmd0aD0iayBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheSIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCB3bj1tbixwbj1nbixkbj1objtjbGFzcyB5bntjb25zdHJ1Y3Rvcih0LGUscil7dGhpcy5FbGVtZW50cz10LHRoaXMuSz1lLHRoaXMuRGlzdGFuY2VGbj1yLHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSExLHRoaXMuaXRlcmF0ZT0oKT0+e3RoaXMuSXRlcmF0aW9uQ291bnQrKyx0aGlzLkNsdXN0ZXJzfHx0aGlzLmFsbG9jYXRlVG9DbHVzdGVyc0Fyb3VuZEN1cnJlbnRNZWRvaWRzKCk7Y29uc3QgdD10aGlzLk1lZG9pZHMsZT10aGlzLkNsdXN0ZXJzLHI9dGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO2xldCBzPXI7Zm9yKGxldCB0PTA7dDx0aGlzLk1lZG9pZHMubGVuZ3RoO3QrKyl7Y29uc3QgZT10PT4wPT09dGhpcy5NZWRvaWRzLmZpbHRlcigoZT0+MD09PXRoaXMuRGlzdGFuY2VGbih0LGUpKSkubGVuZ3RoO2Zvcihjb25zdCByIG9mIHRoaXMuRWxlbWVudHMuZmlsdGVyKGUpKXtjb25zdCBlPXRoaXMuTWVkb2lkcy5zbGljZSgpO2VbdF09cjtjb25zdCBuPW5ldyB5bih0aGlzLkVsZW1lbnRzLnNsaWNlKCksdGhpcy5LLHRoaXMuRGlzdGFuY2VGbik7bi5NZWRvaWRzPWUsbi5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IG89bi5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO288cyYmKHM9byx0aGlzLkNsdXN0ZXJzPW4uQ2x1c3RlcnMsdGhpcy5NZWRvaWRzPWUpfX1yZXR1cm4gdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpPHJ8fCh0aGlzLkNsdXN0ZXJzPWUsdGhpcy5NZWRvaWRzPXQsdGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWQ9ITAsITEpfSx0aGlzLmdldENsdXN0ZXJlZERhdGE9KCk9Pih0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZHx8dGhpcy5ydW5Ub0NvbXBsZXRpb24oKSx0aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5FbGVtZW50cy5tYXAoKHQ9PnQuRWxlbWVudCkpKSkpLHRoaXMucnVuVG9Db21wbGV0aW9uPSgpPT57Zm9yKDt0aGlzLml0ZXJhdGUoKTspO30sdGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcz0oKT0+e3RoaXMuQ2x1c3RlcnM9bmV3IEFycmF5LHRoaXMuTWVkb2lkcy5mb3JFYWNoKCh0PT57dGhpcy5DbHVzdGVycy5wdXNoKG5ldyBkbi5DbHVzdGVyKHtFbGVtZW50czpbXSxNZWRvaWQ6dH0pKX0pKSx0aGlzLkVsZW1lbnRzLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgcj10aGlzLmZpbmREaXN0YW5jZXModGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuTWVkb2lkKSksdCkscz1yLnJlZHVjZSgoKHQsZSxyLHMpPT5lPHNbdF0/cjp0KSwwKTt0aGlzLkNsdXN0ZXJzW3NdLkVsZW1lbnRzLnB1c2goe0Rpc3RhbmNlRnJvbU1lZG9pZDpyW3NdLEVsZW1lbnQ6dH0pfSkpfSx0aGlzLmNhbGN1bGF0ZUN1cnJlbnRDb3N0PSgpPT50aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5nZXRDb3N0KCkpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApLHRoaXMuZmluZERpc3RhbmNlcz0odCxlKT0+dC5tYXAoKHQ9PnRoaXMuRGlzdGFuY2VGbih0LGUpKSksdGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcz0oKT0+e2lmKHRoaXMuSz49dGhpcy5FbGVtZW50cy5sZW5ndGgpdGhyb3cgcG4ua0d0RWxlbWVudEFyckxlbmd0aDtjb25zdCB0PVtdLGU9KHQsZSk9Pntmb3IoY29uc3QgciBvZiBlKWlmKDA9PT10aGlzLkRpc3RhbmNlRm4ocix0KSlyZXR1cm4hMTtyZXR1cm4hMH07bGV0IHI9MDtmb3IoO3I8dGhpcy5FbGVtZW50cy5sZW5ndGgmJnQubGVuZ3RoPHRoaXMuSzspZSh0aGlzLkVsZW1lbnRzW3JdLHQpJiZ0LnB1c2godGhpcy5FbGVtZW50c1tyXSkscisrO3JldHVybiB0fSx0aGlzLkRpc3RhbmNlRm49dGhpcy5EaXN0YW5jZUZufHx3bi5kaXN0YW5jZSx0aGlzLk1lZG9pZHM9dGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcygpLHRoaXMuSXRlcmF0aW9uQ291bnQ9MH1nZXQgT3B0aW1pc2F0aW9uU3RhcnRlZCgpe3JldHVybiB0aGlzLkl0ZXJhdGlvbkNvdW50PjB9fXluLmNsdXN0ZXJFbGVtZW50cz0odCxlLHIpPT57eW4uZ2V0SW5zdGFuY2UodCxlLHIpO3JldHVybiBuZXcgQXJyYXl9LHluLmdldEluc3RhbmNlPSh0LGUscik9Pm5ldyB5bih0LGUsciksZm4uQ2x1c3RlcmVyPXluLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7Zm9yKHZhciByIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShyKXx8KHRbcl09ZVtyXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUoaG4pLGUoZm4pfShsbik7dmFyIGJuPVRlKGxuKTtmdW5jdGlvbiBNbih0LGUpe2xldCByPTA7Zm9yKGxldCBzPTA7czx0Lmxlbmd0aDtzKyspcis9KHRbc10tZVtzXSkqKHRbc10tZVtzXSk7cmV0dXJuIHJ9Y29uc3Qgdm49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB4bih0LGU9e30pe2NvbnN0e21pbkxlbmd0aDpyfT1lO2lmKCFmdW5jdGlvbih0KXtjb25zdCBlPXZuLmNhbGwodCk7cmV0dXJuIGUuZW5kc1dpdGgoIkFycmF5XSIpJiYhZS5pbmNsdWRlcygiQmlnIil9KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtpZigibnVtYmVyIiE9dHlwZW9mIHRbMF0pdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBjb250YWluIG51bWJlcnMiKTtpZihyJiZ0Lmxlbmd0aDxyKXRocm93IG5ldyBFcnJvcihgaW5wdXQgbXVzdCBoYXZlIGEgbGVuZ3RoIG9mIGF0IGxlYXN0ICR7cn1gKX1mdW5jdGlvbiBFbih0LGUscj17fSl7Y29uc3R7c29ydGVkOnM9ITB9PXI7aWYocyl7bGV0IHI9MCxzPXQubGVuZ3RoLTEsbj0wO2Zvcig7cy1yPjE7KWlmKG49cisocy1yPj4xKSx0W25dPGUpcj1uO2Vsc2V7aWYoISh0W25dPmUpKXJldHVybiBuO3M9bn1yZXR1cm4gcjx0Lmxlbmd0aC0xP01hdGguYWJzKGUtdFtyXSk8TWF0aC5hYnModFtyKzFdLWUpP3I6cisxOnJ9e2xldCByPTAscz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IG89TWF0aC5hYnModFtuXS1lKTtvPHMmJihzPW8scj1uKX1yZXR1cm4gcn19ZnVuY3Rpb24gU24odCxlPXt9KXtsZXR7ZnJvbUluZGV4OnIsdG9JbmRleDpzfT1lO2NvbnN0e2Zyb206bix0bzpvfT1lO3JldHVybiB2b2lkIDA9PT1yJiYocj12b2lkIDAhPT1uP0VuKHQsbik6MCksdm9pZCAwPT09cyYmKHM9dm9pZCAwIT09bz9Fbih0LG8pOnQubGVuZ3RoLTEpLHI8MCYmKHI9MCksczwwJiYocz0wKSxyPj10Lmxlbmd0aCYmKHI9dC5sZW5ndGgtMSkscz49dC5sZW5ndGgmJihzPXQubGVuZ3RoLTEpLHI+cyYmKFtyLHNdPVtzLHJdKSx7ZnJvbUluZGV4OnIsdG9JbmRleDpzfX1mdW5jdGlvbiBfbih0LGU9e30pe3huKHQpO2NvbnN0e2Zyb21JbmRleDpyLHRvSW5kZXg6c309U24odCxlKTtsZXQgbj10W3JdO2ZvcihsZXQgZT1yKzE7ZTw9cztlKyspbis9dFtlXTtyZXR1cm4gbi8ocy1yKzEpfWZ1bmN0aW9uIGpuKHQsZSl7Y29uc3Qgcj02NTUzNSYodD4+Pj0wKTtyZXR1cm4oKHQtcikqKGU+Pj49MCk+Pj4wKStyKmU+Pj4wfWNsYXNzIEFue3JhbmRvbTtzdGF0ZTtjb25zdHJ1Y3Rvcih0PURhdGUubm93KCkpe3RoaXMuc3RhdGU9bmV3IFVpbnQzMkFycmF5KDQpLHRoaXMuaW5pdCh0KSx0aGlzLnJhbmRvbT10aGlzLmdldEZsb2F0LmJpbmQodGhpcyl9Z2V0VWludDMyKCl7cmV0dXJuIHRoaXMubmV4dFN0YXRlKCksdGhpcy5zdGF0ZVszXSt0aGlzLnN0YXRlWzJdPj4+MH1nZXRGbG9hdCgpe3JldHVybiA1Ljk2MDQ2NDQ3NzUzOTA2M2UtOCoodGhpcy5nZXRVaW50MzIoKT4+PjgpfWluaXQodCl7aWYoIU51bWJlci5pc0ludGVnZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigic2VlZCBtdXN0IGJlIGFuIGludGVnZXIiKTt0aGlzLnN0YXRlWzBdPXQsdGhpcy5zdGF0ZVsxXT0wLHRoaXMuc3RhdGVbMl09MCx0aGlzLnN0YXRlWzNdPTA7Zm9yKGxldCB0PTE7dDw4O3QrKyl0aGlzLnN0YXRlWzMmdF1ePXQram4oMTgxMjQzMzI1Myx0aGlzLnN0YXRlW3QtMSYzXV50aGlzLnN0YXRlW3QtMSYzXT4+PjMwPj4+MCk+Pj4wO3RoaXMucGVyaW9kQ2VydGlmaWNhdGlvbigpO2ZvcihsZXQgdD0wO3Q8ODt0KyspdGhpcy5uZXh0U3RhdGUoKX1wZXJpb2RDZXJ0aWZpY2F0aW9uKCl7MD09PXRoaXMuc3RhdGVbMF0mJjA9PT10aGlzLnN0YXRlWzFdJiYwPT09dGhpcy5zdGF0ZVsyXSYmMD09PXRoaXMuc3RhdGVbM10mJih0aGlzLnN0YXRlWzBdPTg4LHRoaXMuc3RhdGVbMV09ODMsdGhpcy5zdGF0ZVsyXT02NSx0aGlzLnN0YXRlWzNdPTY4KX1uZXh0U3RhdGUoKXtsZXQgdD10aGlzLnN0YXRlWzBdO3RePXQ8PDE1LHRePXQ+Pj4xOCx0Xj10aGlzLnN0YXRlWzNdPDwxMSx0aGlzLnN0YXRlWzBdPXRoaXMuc3RhdGVbMV0sdGhpcy5zdGF0ZVsxXT10aGlzLnN0YXRlWzJdLHRoaXMuc3RhdGVbMl09dGhpcy5zdGF0ZVszXSx0aGlzLnN0YXRlWzNdPXR9fWZ1bmN0aW9uIFJuKHQsZT17fSl7eG4odCk7Y29uc3R7ZnJvbUluZGV4OnIsdG9JbmRleDpzfT1Tbih0LGUpO2xldCBuPXRbcl07Zm9yKGxldCBlPXIrMTtlPD1zO2UrKyluKz10W2VdO3JldHVybiBufWNvbnN0IEluPXtkaXN0YW5jZUZ1bmN0aW9uOk1ufTtmdW5jdGlvbiBDbih0LGUscj1Jbil7Y29uc3Qgcz1yLmRpc3RhbmNlRnVuY3Rpb258fEluLmRpc3RhbmNlRnVuY3Rpb24sbj1yLnNpbWlsYXJpdHlGdW5jdGlvbnx8SW4uc2ltaWxhcml0eUZ1bmN0aW9uO2xldCBvPS0xO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXtsZXQgcj1OdW1iZXIuTUlOX1ZBTFVFO2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtjb25zdCBpPW4oZSx0W3NdKTtpPnImJihyPWksbz1zKX19ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcyl0aHJvdyBuZXcgRXJyb3IoIkEgc2ltaWxhcml0eSBvciBkaXN0YW5jZSBmdW5jdGlvbiBpdCdzIHJlcXVpcmVkIik7e2xldCByPU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9cyhlLHRbbl0pO2k8ciYmKHI9aSxvPW4pfX19cmV0dXJuIG99ZnVuY3Rpb24gTm4odCxlLHIscyl7Y29uc3Qgbj17ZGlzdGFuY2VGdW5jdGlvbjpzfTtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKylyW3NdPUNuKGUsdFtzXSxuKTtyZXR1cm4gcn1jbGFzcyBrbntjbHVzdGVycztjZW50cm9pZHM7Y29udmVyZ2VkO2l0ZXJhdGlvbnM7ZGlzdGFuY2U7Y29uc3RydWN0b3IodCxlLHIscyxuKXt0aGlzLmNsdXN0ZXJzPXQsdGhpcy5jZW50cm9pZHM9ZSx0aGlzLmNvbnZlcmdlZD1yLHRoaXMuaXRlcmF0aW9ucz1zLHRoaXMuZGlzdGFuY2U9bn1uZWFyZXN0KHQpe2NvbnN0IGU9bmV3IEFycmF5KHQubGVuZ3RoKTtyZXR1cm4gTm4odCx0aGlzLmNlbnRyb2lkcyxlLHRoaXMuZGlzdGFuY2UpfWNvbXB1dGVJbmZvcm1hdGlvbih0KXtjb25zdCBlPXRoaXMuY2VudHJvaWRzLm1hcCgoKCk9PltdKSk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IHM9dGhpcy5jbHVzdGVyc1tyXTtlW3NdLnB1c2godGhpcy5kaXN0YW5jZSh0W3JdLHRoaXMuY2VudHJvaWRzW3NdKSl9cmV0dXJuIHRoaXMuY2VudHJvaWRzLm1hcCgoKHQscik9Pntjb25zdCBzPWVbcl07cmV0dXJue2NlbnRyb2lkOnQsZXJyb3I6cy5sZW5ndGg+MD9fbihzKTotMSxzaXplOnMubGVuZ3RofX0pKX19ZnVuY3Rpb24gVG4odCxlPXt9LHI9TWF0aC5yYW5kb20pe2NvbnN0e3NpemU6cz0xLHJlcGxhY2U6bj0hMSxwcm9iYWJpbGl0aWVzOm99PWU7bGV0IGksdTtpZihpPSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfSh0KTp0LnNsaWNlKCksbyl7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJjaG9pY2Ugd2l0aCBwcm9iYWJpbGl0aWVzIGFuZCBubyByZXBsYWNlbWVudCBpcyBub3QgaW1wbGVtZW50ZWQiKTtpZihvLmxlbmd0aCE9PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBwcm9iYWJpbGl0aWVzIG9wdGlvbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaG9pY2VzIik7dT1bb1swXV07Zm9yKGxldCB0PTE7dDxvLmxlbmd0aDt0KyspdVt0XT11W3QtMV0rb1t0XTtpZihNYXRoLmFicygxLXUuYXQoLTEpKT4xZS04KXRocm93IG5ldyBFcnJvcihgcHJvYmFiaWxpdGllcyBzaG91bGQgc3VtIHRvIDEsIGJ1dCBpbnN0ZWFkIHN1bXMgdG8gJHt1LmF0KC0xKX1gKX1pZighbiYmcz5pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNpemUgb3B0aW9uIGlzIHRvbyBsYXJnZSIpO2NvbnN0IGE9W107Zm9yKGxldCB0PTA7dDxzO3QrKyl7Y29uc3QgdD1GbihpLmxlbmd0aCxyLHUpO2EucHVzaChpW3RdKSxufHxpLnNwbGljZSh0LDEpfXJldHVybiBhfWZ1bmN0aW9uIEZuKHQsZSxyKXtjb25zdCBzPWUoKTtpZihyKXtsZXQgdD0wO2Zvcig7cz5yW3RdOyl0Kys7cmV0dXJuIHR9cmV0dXJuIE1hdGguZmxvb3Iocyp0KX1jbGFzcyBPbntyYW5kb21HZW5lcmF0b3I7Y29uc3RydWN0b3IodD1NYXRoLnJhbmRvbSl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtjb25zdCBlPW5ldyBBbih0KTt0aGlzLnJhbmRvbUdlbmVyYXRvcj1lLnJhbmRvbX1lbHNlIHRoaXMucmFuZG9tR2VuZXJhdG9yPXR9Y2hvaWNlKHQsZSl7cmV0dXJuIFRuKHQsZSx0aGlzLnJhbmRvbUdlbmVyYXRvcil9cmFuZG9tKCl7cmV0dXJuIHRoaXMucmFuZG9tR2VuZXJhdG9yKCl9cmFuZEludCh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9MCksdCtNYXRoLmZsb29yKHRoaXMucmFuZG9tR2VuZXJhdG9yKCkqKGUtdCkpfXJhbmRvbVNhbXBsZSh0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMucmFuZG9tKCkpO3JldHVybiBlfX1mdW5jdGlvbiBWbih0LGUpe2NvbnN0IHI9bmV3IGpyKHQucm93cyxlLnJvd3MpO2ZvcihsZXQgcz0wO3M8dC5yb3dzO3MrKylmb3IobGV0IG49MDtuPGUucm93cztuKyspci5zZXQocyxuLE1uKHQuZ2V0Um93KHMpLGUuZ2V0Um93KG4pKSk7cmV0dXJuIHJ9Y29uc3Qgem49e21heEl0ZXJhdGlvbnM6MTAwLHRvbGVyYW5jZToxZS02LGluaXRpYWxpemF0aW9uOiJrbWVhbnMrKyIsZGlzdGFuY2VGdW5jdGlvbjpNbn07ZnVuY3Rpb24gRG4odCxlLHIscyxuLG8pe2NvbnN0IGk9ZnVuY3Rpb24odCxlLHIscyl7Y29uc3Qgbj1lWzBdLmxlbmd0aCxvPW5ldyBBcnJheShzKSxpPW5ldyBBcnJheShzKTtmb3IobGV0IHQ9MDt0PHM7dCsrKXtvW3RdPW5ldyBBcnJheShuKSxpW3RdPTA7Zm9yKGxldCBlPTA7ZTxuO2UrKylvW3RdW2VdPTB9Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2lbclt0XV0rKztmb3IobGV0IHM9MDtzPG47cysrKW9bclt0XV1bc10rPWVbdF1bc119Zm9yKGxldCBlPTA7ZTxzO2UrKylmb3IobGV0IHI9MDtyPG47cisrKWlbZV0/b1tlXVtyXS89aVtlXTpvW2VdW3JdPXRbZV1bcl07cmV0dXJuIG99KHQsZSxyPU5uKGUsdCxyLG4uZGlzdGFuY2VGdW5jdGlvbikscyksdT1mdW5jdGlvbih0LGUscixzKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZihyKHRbbl0sZVtuXSk+cylyZXR1cm4hMTtyZXR1cm4hMH0oaSx0LG4uZGlzdGFuY2VGdW5jdGlvbixuLnRvbGVyYW5jZSk7cmV0dXJuIG5ldyBrbihyLGksdSxvLG4uZGlzdGFuY2VGdW5jdGlvbil9ZnVuY3Rpb24gUG4odCxlLHIpe2NvbnN0IHM9ZnVuY3Rpb24odCl7cmV0dXJuey4uLnpuLC4uLnR9fShyKTshZnVuY3Rpb24odCxlKXtpZihlPD0wfHxlPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgRXJyb3IoIksgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBwb2ludHMiKX0odCxlKTtsZXQgbj1mdW5jdGlvbih0LGUscil7bGV0IHM7aWYoQXJyYXkuaXNBcnJheShyLmluaXRpYWxpemF0aW9uKSl7aWYoci5pbml0aWFsaXphdGlvbi5sZW5ndGghPT1lKXRocm93IG5ldyBFcnJvcigiVGhlIGluaXRpYWwgY2VudGVycyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgSyIpO3M9ci5pbml0aWFsaXphdGlvbn1lbHNlIHN3aXRjaChyLmluaXRpYWxpemF0aW9uKXtjYXNlImttZWFucysrIjpzPWZ1bmN0aW9uKHQsZSxyPXt9KXtjb25zdCBzPW5ldyBqcih0KSxuPXMucm93cyxvPW5ldyBPbihyLnNlZWQpLGk9W10sdT1yLmxvY2FsVHJpYWxzfHwyK01hdGguZmxvb3IoTWF0aC5sb2coZSkpLGE9by5yYW5kSW50KG4pO2kucHVzaChzLmdldFJvdyhhKSk7bGV0IGw9bmV3IGpyKDEscy5yb3dzKTtmb3IobGV0IHQ9MDt0PHMucm93czt0KyspbC5zZXQoMCx0LE1uKHMuZ2V0Um93KHQpLGlbMF0pKTtsZXQgaD1qci5tdWwobCwxL1JuKGwuZ2V0Um93KDApKSk7Zm9yKGxldCB0PTE7dDxlO3QrKyl7Y29uc3QgZT1vLmNob2ljZShuLHtyZXBsYWNlOiEwLHNpemU6dSxwcm9iYWJpbGl0aWVzOmguZ2V0Um93KDApfSkscj1WbihzLnN1Yk1hdHJpeFJvdyhlKSxzKTtsZXQgYT0xLzAsYz0xLzAsZj1sO2ZvcihsZXQgdD0wO3Q8dTt0Kyspe2NvbnN0IHM9anIubWluKGwsW3IuZ2V0Um93KHQpXSksbj1zLnN1bSgpO248YyYmKGE9ZVt0XSxjPW4sZj1zKX1pW3RdPXMuZ2V0Um93KGEpLGw9ZixoPWpyLm11bChsLDEvUm4obC5nZXRSb3coMCkpKX1yZXR1cm4gaX0odCxlLHIpO2JyZWFrO2Nhc2UicmFuZG9tIjpzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbmV3IE9uKHIpLmNob2ljZSh0LHtzaXplOmV9KX0odCxlLHIuc2VlZCk7YnJlYWs7Y2FzZSJtb3N0RGlzdGFudCI6cz1mdW5jdGlvbih0LGUscixzKXtjb25zdCBuPW5ldyBPbihzKSxvPW5ldyBBcnJheShlKTtpZihvWzBdPU1hdGguZmxvb3Iobi5yYW5kb20oKSp0Lmxlbmd0aCksZT4xKXtjb25zdCBzPXtkaXN0Oi0xLGluZGV4Oi0xfTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoOysrZSlyW29bMF1dW2VdPnMuZGlzdCYmKHMuZGlzdD1yW29bMF1dW2VdLHMuaW5kZXg9ZSk7aWYob1sxXT1zLmluZGV4LGU+Milmb3IobGV0IHM9MjtzPGU7KytzKXtsZXQgZT17ZGlzdDotMSxpbmRleDotMX07Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDsrK24pe2xldCB0PXtkaXN0Ok51bWJlci5NQVhfVkFMVUUsaW5kZXg6LTF9O2lmKCFvLmluY2x1ZGVzKG4pKWZvcihsZXQgZT0wO2U8czsrK2UpcltvW2VdXVtuXTx0LmRpc3QmJih0PXtkaXN0OnJbb1tlXV1bbl0saW5kZXg6bn0pO3QuZGlzdCE9PU51bWJlci5NQVhfVkFMVUUmJnQuZGlzdD5lLmRpc3QmJihlPXsuLi50fSl9b1tzXT1lLmluZGV4fX1yZXR1cm4gby5tYXAoKGU9PnRbZV0pKX0odCxlLGZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj1uZXcgQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXJbZV09bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IHM9MDtzPHQubGVuZ3RoOysrcylmb3IobGV0IG49cztuPHQubGVuZ3RoOysrbil7Y29uc3Qgbz1lKHRbc10sdFtuXSk7cltzXVtuXT1vLHJbbl1bc109b31yZXR1cm4gcn0odCxyLmRpc3RhbmNlRnVuY3Rpb24pLHIuc2VlZCk7YnJlYWs7ZGVmYXVsdDohZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgRXJyb3IoYCR7ZX06ICIke1N0cmluZyh0KX0iYCl9KHIuaW5pdGlhbGl6YXRpb24sIlVua25vd24gaW5pdGlhbGl6YXRpb24gbWV0aG9kIil9cmV0dXJuIHN9KHQsZSxzKTswPT09cy5tYXhJdGVyYXRpb25zJiYocy5tYXhJdGVyYXRpb25zPU51bWJlci5NQVhfVkFMVUUpO2NvbnN0IG89bmV3IEFycmF5KHQubGVuZ3RoKTtsZXQgaSx1PSExLGE9MDtmb3IoOyF1JiZhPHMubWF4SXRlcmF0aW9uczspaT1EbihuLHQsbyxlLHMsKythKSx1PWkuY29udmVyZ2VkLG49aS5jZW50cm9pZHM7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJ1bnJlYWNoYWJsZTogbm8ga21lYW5zIHN0ZXAgZXhlY3V0ZWQiKTtyZXR1cm4gaX1jbGFzcyBxbntjb25zdHJ1Y3Rvcih0KXt0aGlzLnJvd3M9dH1sZW4oKXtyZXR1cm4gdGhpcy5yb3dzLmxlbmd0aH1pc1NxdWFyZSgpe2NvbnN0IHQ9dGhpcy5yb3dzLmxlbmd0aDtmb3IobGV0IGU9MDtlPHQ7ZSsrKWlmKHRoaXMucm93c1tlXS5sZW5ndGghPT10KXJldHVybiExO3JldHVybiEwfWdldCh0LGUpe3JldHVybiB0aGlzLnJvd3NbdF1bZV19fWNvbnN0ICRuPTQyOTQ5NjcyOTU7Y2xhc3MgTG57Y29uc3RydWN0b3IodCxlKXt0aGlzLmk9dCx0aGlzLmQ9ZX1jbG9uZSgpe3JldHVybiBuZXcgTG4odGhpcy5pLHRoaXMuZCl9c3RhdGljIGVtcHR5KCl7cmV0dXJuIG5ldyBMbigkbiwwKX19Y2xhc3MgVW57Y29uc3RydWN0b3IodCxlLHIscyl7dGhpcy5uZWFyPW5ldyBMbih0LGUpLHRoaXMuc2Vjbz1uZXcgTG4ocixzKX1jbG9uZSgpe3JldHVybiBuZXcgVW4odGhpcy5uZWFyLmksdGhpcy5uZWFyLmQsdGhpcy5zZWNvLmksdGhpcy5zZWNvLmQpfXN0YXRpYyBlbXB0eSgpe3JldHVybiBuZXcgVW4oJG4sMCwkbiwwKX19ZnVuY3Rpb24gR24odCxlLHIpe2NvbnN0IHM9KHQ9ZnVuY3Rpb24odCl7aWYodCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5sZW4pcmV0dXJuIHQ7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gbmV3IHFuKHQpO3Rocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgbWF0cml4IGlucHV0OiBwcm92aWRlIGEgMkQgYXJyYXksIGEgRGVuc2VNYXRyaXgsIG9yIGEgTG93ZXJUcmlhbmdsZSIpfSh0KSkubGVuKCksbj1lLmxlbmd0aDtpZigxPT09bil7Y29uc3Qgcj1uZXcgQXJyYXkocykuZmlsbCgwKSxbbixvXT1mdW5jdGlvbih0LGUscixzKXtjb25zdCBuPXJbc107bGV0IG89bixpPTA7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspbiE9PXImJmVbcl09PT1zJiYoaSs9dC5nZXQobixyKSk7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYociE9PW4mJmVbcl09PT1zKXtsZXQgbj0wO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKW8hPT1yJiZlW29dPT09cyYmKG4rPXQuZ2V0KHIsbykpO248aSYmKG89cixpPW4pfXJldHVybiByW3NdPW8sW28hPT1uLGldfSh0LHIsZSwwKTtyZXR1cm57bG9zczpvLGFzc2k6cixuSXRlcjoxLG5Td2FwczpuPzE6MH19bGV0W28saV09ZnVuY3Rpb24odCxlKXtjb25zdCByPXQubGVuKCkscz1lLmxlbmd0aDtpZighdC5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiRGlzc2ltaWxhcml0eSBtYXRyaXggaXMgbm90IHNxdWFyZSIpO2lmKCEocjw9JG4pKXRocm93IG5ldyBFcnJvcigiTiBpcyB0b28gbGFyZ2UiKTtpZighKHM+MCYmczwkbikpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIE4iKTtpZighKHM8PXIpKXRocm93IG5ldyBFcnJvcigiayBtdXN0IGJlIGF0IG1vc3QgTiIpO2NvbnN0IG49QXJyYXkuZnJvbSh7bGVuZ3RoOnQubGVuKCl9LCgoKT0+VW4uZW1wdHkoKSkpLG89ZVswXTtsZXQgaT0wO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtuW3JdPW5ldyBVbigwLHQuZ2V0KHIsbyksJG4sMCk7Y29uc3Qgcz1uW3JdO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXtjb25zdCBvPWVbbl0saT10LmdldChyLG8pO2k8cy5uZWFyLmR8fHI9PT1vPyhzLnNlY289cy5uZWFyLmNsb25lKCkscy5uZWFyPW5ldyBMbihuLGkpKToocy5zZWNvLmk9PT0kbnx8aTxzLnNlY28uZCkmJihzLnNlY289bmV3IExuKG4saSkpfWkrPXMubmVhci5kfXJldHVybltpLG5dfSh0LGUpLHU9bmV3IEFycmF5KG4pLmZpbGwoMCk7V24oaSx1KTtsZXQgYT1zLGw9MCxoPTA7Zm9yKDtoPHI7KXtoKz0xO2NvbnN0IHI9bCxuPW87Zm9yKGxldCByPTA7cjxzJiZyIT09YTtyKyspe2lmKHI9PT1lW2lbcl0ubmVhci5pXSljb250aW51ZTtjb25zdFtzLG5dPUJuKHQsdSxpLHIpO3M+PTB8fChsKz0xLGE9cixvPVFuKHQsZSxpLG4sciksV24oaSx1KSl9aWYobD09PXJ8fG8+PW4pYnJlYWt9cmV0dXJue2xvc3M6byxhc3NpOmkubWFwKCh0PT50Lm5lYXIuaSkpLG5JdGVyOmgsblN3YXBzOmx9fWZ1bmN0aW9uIEJuKHQsZSxyLHMpe2NvbnN0IG49ZS5zbGljZSgpO2xldCBvPTA7Zm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspe2NvbnN0IGk9cltlXSx1PXQuZ2V0KGUscyk7dTxpLm5lYXIuZD8obys9dS1pLm5lYXIuZCxuW2kubmVhci5pXSs9aS5uZWFyLmQtaS5zZWNvLmQpOnU8aS5zZWNvLmQmJihuW2kubmVhci5pXSs9dS1pLnNlY28uZCl9Y29uc3RbaSx1XT1mdW5jdGlvbih0KXtsZXQgZT0wLHI9dFswXTtmb3IobGV0IHM9MTtzPHQubGVuZ3RoO3MrKyl0W3NdPHImJihlPXMscj10W3NdKTtyZXR1cm5bZSxyXX0obik7cmV0dXJuW3UrbyxpXX1mdW5jdGlvbiBXbih0LGUpe2UuZmlsbCgwKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7Y29uc3Qgcz10W3JdO2Vbcy5uZWFyLmldKz1zLnNlY28uZC1zLm5lYXIuZH19ZnVuY3Rpb24gS24odCxlLHIscyxuLG8pe2xldCBpPW5ldyBMbihzLG8pO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKXtjb25zdCB1PWVbb107aWYobz09PXJ8fG89PT1zKWNvbnRpbnVlO2NvbnN0IGE9dC5nZXQobix1KTthPGkuZCYmKGk9bmV3IExuKG8sYSkpfXJldHVybiBpfWZ1bmN0aW9uIFFuKHQsZSxyLHMsbil7Y29uc3Qgbz10LmxlbigpO2lmKCEoczxlLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG1lZG9pZCBudW1iZXIiKTtpZighKG48bykpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG9iamVjdCBudW1iZXIiKTtlW3NdPW47bGV0IGk9MDtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKyl7Y29uc3QgdT1yW29dO2lmKG89PT1uKXt1Lm5lYXIuaSE9PXMmJih1LnNlY289dS5uZWFyLmNsb25lKCkpLHUubmVhcj1uZXcgTG4ocywwKSxpKz0wO2NvbnRpbnVlfWNvbnN0IGE9dC5nZXQobyxuKTt1Lm5lYXIuaT09PXM/YTx1LnNlY28uZD91Lm5lYXI9bmV3IExuKHMsYSk6KHUubmVhcj11LnNlY28uY2xvbmUoKSx1LnNlY289S24odCxlLHUubmVhci5pLHMsbyxhKSk6YTx1Lm5lYXIuZD8odS5zZWNvPXUubmVhci5jbG9uZSgpLHUubmVhcj1uZXcgTG4ocyxhKSk6YTx1LnNlY28uZD91LnNlY289bmV3IExuKHMsYSk6dS5zZWNvLmk9PT1zJiYodS5zZWNvPUtuKHQsZSx1Lm5lYXIuaSxzLG8sYSkpLGkrPXUubmVhci5kfXJldHVybiBpfWZ1bmN0aW9uIFhuKHQsZSl7bGV0IHI9MDtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKyl7bGV0IG49dFtzXS1lW3NdO3IrPW4qbn1yZXR1cm4gTWF0aC5zcXJ0KHIpfWZ1bmN0aW9uIFluKHQsZSxyKXtsZXQgcz10Lmxlbmd0aCxuPWZ1bmN0aW9uKHQpe2xldCBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT09ZX0ocik/cjpYbixvPUFycmF5LmZyb20oe2xlbmd0aDpzfSwoKCk9Pm5ldyBGbG9hdDY0QXJyYXkocykpKTtmb3IobGV0IGU9MDtlPHM7ZSsrKWZvcihsZXQgcj1lKzE7cjxzO3IrKyl7bGV0IHM9bih0W2VdLHRbcl0pO29bZV1bcl09cyxvW3JdW2VdPXN9dmFyIGk7bGV0IHU9R24obywoaT1lLEFycmF5LmZyb20oe2xlbmd0aDppfSwoKHQsZSk9PmUpKSksMTAwKSxhPXt9O3JldHVybiB1cyh1LmFzc2ksKCh0LGUpPT57YVt0XXx8KGFbdF09W10pLGFbdF0ucHVzaChlKX0pKSx1bihhKX1hc3luYyBmdW5jdGlvbiBKbih0LGUscj17fSl7bGV0IHM9d3QociwiZnVuRGlzdCIsbnVsbCk7cmV0dXJuInNpbXBsZSI9PT13dChyLCJ1c2VNZXRob2QiLCJmYXN0ZXJQQU0iKT9mdW5jdGlvbih0LGUscil7bGV0IHM9bmV3IE1hcDt1cyh0LCgodCxlKT0+e3Muc2V0KHQsZSl9KSk7bGV0IG49Ym4uQ2x1c3RlcmVyLmdldEluc3RhbmNlKHQsZSxyKS5nZXRDbHVzdGVyZWREYXRhKCk7cmV0dXJuIG49b24obiwodD0+b24odCwodD0+cy5nZXQodCkpKSkpLG59KHQsZSxzKTpZbih0LGUscyl9YXN5bmMgZnVuY3Rpb24gSG4odCxlPXt9KXtsZXQgcj13dChlLCJrTnVtYmVyIik7cj13ZShyKT9rZShyKToyO2xldCBzPXd0KGUsIm1vZGUiKTsiay1tZWRvaWRzIiE9PXMmJiJrLW1lYW5zIiE9PXMmJihzPSJrLW1lZG9pZHMiKTtsZXQgbixvPXd0KGUsInNlZWQiLG51bGwpLGk9d3QoZSwiZnVuRGlzdCIsbnVsbCksdT13dChlLCJ1c2VNZXRob2QiLCJmYXN0ZXJQQU0iKTtpZigiay1tZWRvaWRzIj09PXMpbj1hd2FpdCBKbih0LHIse2Z1bkRpc3Q6aSx1c2VNZXRob2Q6dX0pO2Vsc2V7aWYoImstbWVhbnMiIT09cyl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbW9kZVske3N9XWApO249YXdhaXQgYXN5bmMgZnVuY3Rpb24odCxlLHI9e30pe2xldCBzPXd0KHIsInNlZWQiLG51bGwpLG49e307bnVsbCE9PXMmJihuPXtzZWVkOnN9KTtsZXQgbz1Qbih0LGUsbiksaT17fTtyZXR1cm4gdXMoby5jbHVzdGVycywoKHQsZSk9PntpW3RdfHwoaVt0XT1bXSksaVt0XS5wdXNoKGUpfSkpLHVuKGkpfSh0LHIse3NlZWQ6b30pfXJldHVybiBufWFzeW5jIGZ1bmN0aW9uIFpuKHQsZT17fSl7aWYoIWNlKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3QgZWZmLiBhcnJheSIpO2xldCByPXd0KGUsImtOdW1iZXIiLG51bGwpO3dlKHIpfHwocj0yKSxyPWtlKHIpO2xldCBzPXd0KGUsInVzZVBDQSIsbnVsbCk7bWUocyl8fChzPSEwKTtsZXQgbj13dChlLCJuQ29tcE5JUEFMUyIsbnVsbCk7d2Uobil8fChuPTIpLG49a2Uobik7bGV0IG89d3QoZSwibW9kZSIsbnVsbCksaT13dChlLCJzZWVkIixudWxsKSx1PXd0KGUsImZ1bkRpc3QiLG51bGwpLGE9d3QoZSwidXNlTWV0aG9kIiwiZmFzdGVyUEFNIiksbD0iIixoPW9lKHQpLGM9MCxmPTA7aWYodXModCwodD0+eyFmdW5jdGlvbih0KXtpZih1ZSh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITA7cmV0dXJuITF9cmV0dXJuITF9KHQpP2NlKHQpJiYoZis9MSk6Yys9MX0pKSxjPT09aClsPSJvYmoiO2Vsc2V7aWYoZiE9PWgpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvZiB0aGUgc2FtZSB0eXBlIik7bD0ibWF0In1sZXQgbSxnPW51bGw7Im9iaiI9PT1sPyhnPWZ1bmN0aW9uKHQpe2xldCBlPXt9O3VzKHQsKHQ9Pnt1cyh0LCgodCxyKT0+e2Vbcl18fChlW3JdPTApLDA9PT1lW3JdJiZ3ZSh0KSYmKGVbcl09MSksMSE9PWVbcl18fHdlKHQpfHwoZVtyXT0tMSl9KSl9KSk7bGV0IHI9W107cmV0dXJuIHVzKGUsKCh0LGUpPT57MT09PXQmJnIucHVzaChlKX0pKSxyfSh0KSxtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG9uKHQsKHQ9PnVuKGFuKHQsZSkpKSl9KHQsZykpOm09dDtsZXQgdz1tO3MmJih3PU5yKG0se25Db21wTklQQUxTOm59KSk7bGV0IHA9YXdhaXQgSG4odyx7a051bWJlcjpyLG1vZGU6byxzZWVkOmksZnVuRGlzdDp1LHVzZU1ldGhvZDphfSk7cmV0dXJue2tleXM6ZyxnaW5kczpwLGdtYXQ6b24ocCwodD0+b24odCwodD0+d1t0XSkpKSksZ2x0ZHQ6b24ocCwoZT0+b24oZSwoZT0+dFtlXSkpKSl9fWxldCBXQ2x1c3Rlcj17UENBOmFzeW5jIGZ1bmN0aW9uKHQsZT17fSl7cmV0dXJuIE5yKHQsZSl9LGNsdXN0ZXI6YXN5bmMgZnVuY3Rpb24odCxlPXt9KXt0cnl7cmV0dXJuIGF3YWl0IFpuKHQsZSl9Y2F0Y2godCl7cmV0dXJuIFByb21pc2UucmVqZWN0KHQpfX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0NsdXN0ZXIoLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0NsdXN0ZXIKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmVjdk1lc3NhZ2UoZS5kYXRhKQogICAgICAgIH0KICAgICAgICAKCnRyeXsKCiAgICAvL+WDheS7pXVuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvcuiomOmMhCwg5LiN5Y+v6Ki75YaKdW5jYXVnaHRFeGNlcHRpb27oiId1bmhhbmRsZWRSZWplY3Rpb27nm6Pogb06CiAgICAvL+aWvHdvcmtlcuWFp+iou+WGiuatpOS6jOebo+iBveacg+mYu+atok5vZGXpoJDoqK3nmoR3b3JrZXLntYLmraLooYzngrosIOS9v3dvcmtlcuW0qea9sOW+jOS7jeWtmOa0u+epuui9iSwKICAgIC8v5aSW5bGk5pS25LiN5YiwZXJyb3IvZXhpdOS6i+S7tiwgcGVuZGluZyBwcm9taXNl5rC45LmF5oe4572uLCDkuJTlrZjmtLvmrq3lsY13b3JrZXLmnIPku6Tlrr/kuLvnqIvluo/nhKHms5XpgIDlh7o7CiAgICAvL+enu+mZpOW+jHdvcmtlcuS+nemgkOioreihjOeCuuatu+S6oSwgZXJyb3Lkuovku7blgrPoh7PlpJblsaQsIOeUseWkluWxpOaVtOaJuXJlamVjdCBwZW5kaW5nCiAgICAvLyBwcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAoZXJyKSA9PiB7CiAgICAvLyAgICAgY29uc29sZS5sb2coJ2lubmVyOnVuaGFuZGxlZFJlamVjdGlvbicsIGVycikKICAgIC8vIH0pCiAgICAvLyBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnIpID0+IHsKICAgIC8vICAgICBjb25zb2xlLmxvZygnaW5uZXI6dW5jYXVnaHRFeGNlcHRpb24nLCBlcnIpCiAgICAvLyB9KQogICAgcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb25Nb25pdG9yJywgKGVycikgPT4gewogICAgICAgIGNvbnNvbGUubG9nKCdpbm5lcjp1bmNhdWdodEV4Y2VwdGlvbk1vbml0b3InLCBlcnIpCiAgICB9KQoKfQpjYXRjaChlcnIpe30KCg==");function Z(){let Z=d(),X={},G=!1;function y(d){for(let l in X){let c=X[l];delete X[l],Z.removeAllListeners(l),c.reject(d)}Z.emit("error",d)}function m(d){G||(G=!0,y(d))}let K=function(d){try{let l=new Blob([d]),c=window.URL||window.webkitURL;return new Worker(c.createObjectURL(l))}catch(d){m(d)}}(b);return K?(K.onmessage=function(d){!function(d){let l=d,c=l.mode;"emit"!==c&&"return"!==c||("emit"===c&&Z.emit(l.evName,l.msg),"return"===c&&Z.emit(l.id,l))}(d.data)},K.onerror=m,K.onmessageerror=function(d){y(d.data)},function(){let d={mode:"init",type:"object",input:[...arguments]};K.postMessage(d)}([...arguments]),Z.PCA=function(){let d=l();if(G)return d.reject("worker is dead"),d;let b=c();X[b]=d;let y={mode:"call",id:b,fun:"PCA",input:[...arguments]};return K.postMessage(y),Z.once(b,(l=>{delete X[b],"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d},Z.cluster=function(){let d=l();if(G)return d.reject("worker is dead"),d;let b=c();X[b]=d;let y={mode:"call",id:b,fun:"cluster",input:[...arguments]};return K.postMessage(y),Z.once(b,(l=>{delete X[b],"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d},Z.terminate=function(){K?(K.terminate(),K=void 0):y("worker has been terminated")},Z):(m("invalid worker"),null)}let X={PCA:async function(){let d=[...arguments],l=Z();return await l.PCA(...d).finally((()=>{l.terminate()}))},cluster:async function(){let d=[...arguments],l=Z();return await l.cluster(...d).finally((()=>{l.terminate()}))}};L=d();for(let d in X){let l=X[d];L[d]=l}}();try{process.on("uncaughtExceptionMonitor",(d=>{console.log("outer:uncaughtExceptionMonitor",d)}))}catch(d){}return L}()}({get exports(){return b},set exports(d){b=d}});var Z=b;let X;return X="undefined"!=typeof window&&void 0!==window.document?Z:c,X}));
1
+ !function(d,l){"object"==typeof exports&&"undefined"!=typeof module?module.exports=l(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],l):(d="undefined"!=typeof globalThis?globalThis:d||self)["w-cluster"]=l(d.worker_threads)}(this,(function(d){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var l={};!function(l,c){l.exports=function(d){var l={};!function(d){var l=Object.prototype.hasOwnProperty,c="~";function Z(){}function b(d,l,c){this.fn=d,this.context=l,this.once=c||!1}function X(d,l,Z,X,G){if("function"!=typeof Z)throw new TypeError("The listener must be a function");var y=new b(Z,X||d,G),m=c?c+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],y]:d._events[m].push(y):(d._events[m]=y,d._eventsCount++),d}function G(d,l){0==--d._eventsCount?d._events=new Z:delete d._events[l]}function y(){this._events=new Z,this._eventsCount=0}Object.create&&(Z.prototype=Object.create(null),(new Z).__proto__||(c=!1)),y.prototype.eventNames=function(){var d,Z,b=[];if(0===this._eventsCount)return b;for(Z in d=this._events)l.call(d,Z)&&b.push(c?Z.slice(1):Z);return Object.getOwnPropertySymbols?b.concat(Object.getOwnPropertySymbols(d)):b},y.prototype.listeners=function(d){var l=c?c+d:d,Z=this._events[l];if(!Z)return[];if(Z.fn)return[Z.fn];for(var b=0,X=Z.length,G=new Array(X);b<X;b++)G[b]=Z[b].fn;return G},y.prototype.listenerCount=function(d){var l=c?c+d:d,Z=this._events[l];return Z?Z.fn?1:Z.length:0},y.prototype.emit=function(d,l,Z,b,X,G){var y=c?c+d:d;if(!this._events[y])return!1;var m,K,p=this._events[y],I=arguments.length;if(p.fn){switch(p.once&&this.removeListener(d,p.fn,void 0,!0),I){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,l),!0;case 3:return p.fn.call(p.context,l,Z),!0;case 4:return p.fn.call(p.context,l,Z,b),!0;case 5:return p.fn.call(p.context,l,Z,b,X),!0;case 6:return p.fn.call(p.context,l,Z,b,X,G),!0}for(K=1,m=new Array(I-1);K<I;K++)m[K-1]=arguments[K];p.fn.apply(p.context,m)}else{var W,V=p.length;for(K=0;K<V;K++)switch(p[K].once&&this.removeListener(d,p[K].fn,void 0,!0),I){case 1:p[K].fn.call(p[K].context);break;case 2:p[K].fn.call(p[K].context,l);break;case 3:p[K].fn.call(p[K].context,l,Z);break;case 4:p[K].fn.call(p[K].context,l,Z,b);break;default:if(!m)for(W=1,m=new Array(I-1);W<I;W++)m[W-1]=arguments[W];p[K].fn.apply(p[K].context,m)}}return!0},y.prototype.on=function(d,l,c){return X(this,d,l,c,!1)},y.prototype.once=function(d,l,c){return X(this,d,l,c,!0)},y.prototype.removeListener=function(d,l,Z,b){var X=c?c+d:d;if(!this._events[X])return this;if(!l)return G(this,X),this;var y=this._events[X];if(y.fn)y.fn!==l||b&&!y.once||Z&&y.context!==Z||G(this,X);else{for(var m=0,K=[],p=y.length;m<p;m++)(y[m].fn!==l||b&&!y[m].once||Z&&y[m].context!==Z)&&K.push(y[m]);K.length?this._events[X]=1===K.length?K[0]:K:G(this,X)}return this},y.prototype.removeAllListeners=function(d){var l;return d?(l=c?c+d:d,this._events[l]&&G(this,l)):(this._events=new Z,this._eventsCount=0),this},y.prototype.off=y.prototype.removeListener,y.prototype.addListener=y.prototype.on,y.prefixed=c,y.EventEmitter=y,d.exports=y}({get exports(){return l},set exports(d){l=d}});var c=l;let Z;!function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new c}function b(){let d,l,c=new Promise((function(){d=arguments[0],l=arguments[1]}));return c.resolve=d,c.reject=l,c}function X(){let d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Z=c.length;for(let b=0;b<d;b++)l[b]=c[0|Math.random()*Z];return l.join("")}let G=(y="CgogICAgICAgIC8vaW1wb3J0IHsgcGFyZW50UG9ydCB9IGZyb20gJ3dvcmtlcl90aHJlYWRzJwogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykgLy/lm6BwYWNrYWdlLmpzb27kuI3ntaZ0eXBlPW1vZHVsZeaVheeEoeazleaUr+aPtGVzNiBpbXBvcnQsIOW+l+S9v+eUqHJlcXVpcmUKICAgICAgICAvL+iLpeimgeaWvG5vZGVqcyB3b3JrZXLlhafkvb/nlKjnhKHms5XovYnora/nmoTljp/nlJ/lpZfku7bkvovlpoJmcywg6YG/5YWN5L2/55So6aCC5bGkaW1wb3J05Yqg6LyJ5L2/55SoLCDlm6DnhKHms5XovYnora/mnIPnm7TmjqXkv53nlZkKICAgICAgICAvL+S4puWboGltcG9ydOS9jeaWvHdvcmtlcuWkluWxpOmZkOWumueCunJlcXVpcmXljYAocGFja2FnZS5qc29u5LiN57WmdHlwZT1tb2R1bGUpLCDmlYXlh7rnj77pjK/oqqTnhKHms5XovYnora8KICAgICAgICAKCiJ1c2Ugc3RyaWN0Ijt2YXIgdD1BcnJheS5pc0FycmF5LGU9Im9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsLHI9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixzPWV8fHJ8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksbj1zLlN5bWJvbCxvPU9iamVjdC5wcm90b3R5cGUsaT1vLmhhc093blByb3BlcnR5LHU9by50b1N0cmluZyxhPW4/bi50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIGw9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgaD0iW29iamVjdCBOdWxsXSIsYz0iW29iamVjdCBVbmRlZmluZWRdIixmPW4/bi50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gbSh0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10P2M6aDpmJiZmIGluIE9iamVjdCh0KT9mdW5jdGlvbih0KXt2YXIgZT1pLmNhbGwodCxhKSxyPXRbYV07dHJ5e3RbYV09dm9pZCAwO3ZhciBzPSEwfWNhdGNoKHQpe312YXIgbj11LmNhbGwodCk7cmV0dXJuIHMmJihlP3RbYV09cjpkZWxldGUgdFthXSksbn0odCk6ZnVuY3Rpb24odCl7cmV0dXJuIGwuY2FsbCh0KX0odCl9ZnVuY3Rpb24gZyh0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fXZhciB3PSJbb2JqZWN0IFN5bWJvbF0iO2Z1bmN0aW9uIHAodCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxnKHQpJiZtKHQpPT13fXZhciBkPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLHk9L15cdyokLztmdW5jdGlvbiBiKGUscil7aWYodChlKSlyZXR1cm4hMTt2YXIgcz10eXBlb2YgZTtyZXR1cm4hKCJudW1iZXIiIT1zJiYic3ltYm9sIiE9cyYmImJvb2xlYW4iIT1zJiZudWxsIT1lJiYhcChlKSl8fCh5LnRlc3QoZSl8fCFkLnRlc3QoZSl8fG51bGwhPXImJmUgaW4gT2JqZWN0KHIpKX1mdW5jdGlvbiBNKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfXZhciB2PSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIix4PSJbb2JqZWN0IEZ1bmN0aW9uXSIsRT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLFM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBfKHQpe2lmKCFNKHQpKXJldHVybiExO3ZhciBlPW0odCk7cmV0dXJuIGU9PXh8fGU9PUV8fGU9PXZ8fGU9PVN9dmFyIGosQT1zWyJfX2NvcmUtanNfc2hhcmVkX18iXSxSPShqPS9bXi5dKyQvLmV4ZWMoQSYmQS5rZXlzJiZBLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIitqOiIiO3ZhciBJPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBDKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gSS5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn12YXIgTj0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxrPUZ1bmN0aW9uLnByb3RvdHlwZSxUPU9iamVjdC5wcm90b3R5cGUsRj1rLnRvU3RyaW5nLE89VC5oYXNPd25Qcm9wZXJ0eSxWPVJlZ0V4cCgiXiIrRi5jYWxsKE8pLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIHoodCl7cmV0dXJuISghTSh0KXx8KGU9dCxSJiZSIGluIGUpKSYmKF8odCk/VjpOKS50ZXN0KEModCkpO3ZhciBlfWZ1bmN0aW9uIEQodCxlKXt2YXIgcj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfSh0LGUpO3JldHVybiB6KHIpP3I6dm9pZCAwfXZhciBQPUQoT2JqZWN0LCJjcmVhdGUiKTt2YXIgcT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciAkPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gTCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIHM9dFtlXTt0aGlzLnNldChzWzBdLHNbMV0pfX1mdW5jdGlvbiBVKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfWZ1bmN0aW9uIEcodCxlKXtmb3IodmFyIHI9dC5sZW5ndGg7ci0tOylpZihVKHRbcl1bMF0sZSkpcmV0dXJuIHI7cmV0dXJuLTF9TC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVA/UChudWxsKTp7fSx0aGlzLnNpemU9MH0sTC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxMLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihQKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIHEuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxMLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gUD92b2lkIDAhPT1lW3RdOiQuY2FsbChlLHQpfSxMLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxyW3RdPVAmJnZvaWQgMD09PWU/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOmUsdGhpc307dmFyIEI9QXJyYXkucHJvdG90eXBlLnNwbGljZTtmdW5jdGlvbiBXKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgcz10W2VdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fVcucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH0sVy5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1HKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOkIuY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfSxXLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPUcoZSx0KTtyZXR1cm4gcjwwP3ZvaWQgMDplW3JdWzFdfSxXLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIEcodGhpcy5fX2RhdGFfXyx0KT4tMX0sVy5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxzPUcocix0KTtyZXR1cm4gczwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW3NdWzFdPWUsdGhpc307dmFyIEs9RChzLCJNYXAiKTtmdW5jdGlvbiBRKHQsZSl7dmFyIHIscyxuPXQuX19kYXRhX187cmV0dXJuKCJzdHJpbmciPT0ocz10eXBlb2Yocj1lKSl8fCJudW1iZXIiPT1zfHwic3ltYm9sIj09c3x8ImJvb2xlYW4iPT1zPyJfX3Byb3RvX18iIT09cjpudWxsPT09cik/blsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpuLm1hcH1mdW5jdGlvbiBYKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgcz10W2VdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fVgucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgTCxtYXA6bmV3KEt8fFcpLHN0cmluZzpuZXcgTH19LFgucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT1RKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFgucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gUSh0aGlzLHQpLmdldCh0KX0sWC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiBRKHRoaXMsdCkuaGFzKHQpfSxYLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1RKHRoaXMsdCkscz1yLnNpemU7cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplKz1yLnNpemU9PXM/MDoxLHRoaXN9O3ZhciBZPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjtmdW5jdGlvbiBKKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoWSk7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgcz1hcmd1bWVudHMsbj1lP2UuYXBwbHkodGhpcyxzKTpzWzBdLG89ci5jYWNoZTtpZihvLmhhcyhuKSlyZXR1cm4gby5nZXQobik7dmFyIGk9dC5hcHBseSh0aGlzLHMpO3JldHVybiByLmNhY2hlPW8uc2V0KG4saSl8fG8saX07cmV0dXJuIHIuY2FjaGU9bmV3KEouQ2FjaGV8fFgpLHJ9Si5DYWNoZT1YO3ZhciBILFosdHQsZXQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2cscnQ9L1xcKFxcKT8vZyxzdD0oSD1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKGV0LChmdW5jdGlvbih0LHIscyxuKXtlLnB1c2gocz9uLnJlcGxhY2UocnQsIiQxIik6cnx8dCl9KSksZX0sWj1KKEgsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT10dC5zaXplJiZ0dC5jbGVhcigpLHR9KSksdHQ9Wi5jYWNoZSxaKSxudD1zdDtmdW5jdGlvbiBvdCh0LGUpe2Zvcih2YXIgcj0tMSxzPW51bGw9PXQ/MDp0Lmxlbmd0aCxuPUFycmF5KHMpOysrcjxzOyluW3JdPWUodFtyXSxyLHQpO3JldHVybiBufXZhciBpdD0xLzAsdXQ9bj9uLnByb3RvdHlwZTp2b2lkIDAsYXQ9dXQ/dXQudG9TdHJpbmc6dm9pZCAwO2Z1bmN0aW9uIGx0KGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTtpZih0KGUpKXJldHVybiBvdChlLGx0KSsiIjtpZihwKGUpKXJldHVybiBhdD9hdC5jYWxsKGUpOiIiO3ZhciByPWUrIiI7cmV0dXJuIjAiPT1yJiYxL2U9PS1pdD8iLTAiOnJ9ZnVuY3Rpb24gaHQodCl7cmV0dXJuIG51bGw9PXQ/IiI6bHQodCl9ZnVuY3Rpb24gY3QoZSxyKXtyZXR1cm4gdChlKT9lOmIoZSxyKT9bZV06bnQoaHQoZSkpfXZhciBmdD0xLzA7ZnVuY3Rpb24gbXQodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxwKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1mdD8iLTAiOmV9ZnVuY3Rpb24gZ3QodCxlKXtmb3IodmFyIHI9MCxzPShlPWN0KGUsdCkpLmxlbmd0aDtudWxsIT10JiZyPHM7KXQ9dFttdChlW3IrK10pXTtyZXR1cm4gciYmcj09cz90OnZvaWQgMH1mdW5jdGlvbiB3dCh0LGUscil7dmFyIHM9bnVsbD09dD92b2lkIDA6Z3QodCxlKTtyZXR1cm4gdm9pZCAwPT09cz9yOnN9dmFyIHB0PU9iamVjdC5wcm90b3R5cGU7dmFyIGR0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0KGUocikpfX0oT2JqZWN0LmtleXMsT2JqZWN0KSx5dD1kdCxidD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIE10KHQpe2lmKHI9KGU9dCkmJmUuY29uc3RydWN0b3IsZSE9PSgiZnVuY3Rpb24iPT10eXBlb2YgciYmci5wcm90b3R5cGV8fHB0KSlyZXR1cm4geXQodCk7dmFyIGUscixzPVtdO2Zvcih2YXIgbiBpbiBPYmplY3QodCkpYnQuY2FsbCh0LG4pJiYiY29uc3RydWN0b3IiIT1uJiZzLnB1c2gobik7cmV0dXJuIHN9dmFyIHZ0PUQocywiRGF0YVZpZXciKSx4dD1EKHMsIlByb21pc2UiKSxFdD1EKHMsIlNldCIpLFN0PUQocywiV2Vha01hcCIpLF90PSJbb2JqZWN0IE1hcF0iLGp0PSJbb2JqZWN0IFByb21pc2VdIixBdD0iW29iamVjdCBTZXRdIixSdD0iW29iamVjdCBXZWFrTWFwXSIsSXQ9IltvYmplY3QgRGF0YVZpZXddIixDdD1DKHZ0KSxOdD1DKEspLGt0PUMoeHQpLFR0PUMoRXQpLEZ0PUMoU3QpLE90PW07KHZ0JiZPdChuZXcgdnQobmV3IEFycmF5QnVmZmVyKDEpKSkhPUl0fHxLJiZPdChuZXcgSykhPV90fHx4dCYmT3QoeHQucmVzb2x2ZSgpKSE9anR8fEV0JiZPdChuZXcgRXQpIT1BdHx8U3QmJk90KG5ldyBTdCkhPVJ0KSYmKE90PWZ1bmN0aW9uKHQpe3ZhciBlPW0odCkscj0iW29iamVjdCBPYmplY3RdIj09ZT90LmNvbnN0cnVjdG9yOnZvaWQgMCxzPXI/QyhyKToiIjtpZihzKXN3aXRjaChzKXtjYXNlIEN0OnJldHVybiBJdDtjYXNlIE50OnJldHVybiBfdDtjYXNlIGt0OnJldHVybiBqdDtjYXNlIFR0OnJldHVybiBBdDtjYXNlIEZ0OnJldHVybiBSdH1yZXR1cm4gZX0pO3ZhciBWdD1PdCx6dD05MDA3MTk5MjU0NzQwOTkxO2Z1bmN0aW9uIER0KHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD16dH1mdW5jdGlvbiBQdCh0KXtyZXR1cm4gbnVsbCE9dCYmRHQodC5sZW5ndGgpJiYhXyh0KX12YXIgcXQ9IltvYmplY3QgU3RyaW5nXSI7ZnVuY3Rpb24gJHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3ZvaWQgMDplW3RdfX12YXIgTHQ9JHQoImxlbmd0aCIpLFV0PVJlZ0V4cCgiW1xcdTIwMGRcXHVkODAwLVxcdWRmZmZcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZcXHVmZTBlXFx1ZmUwZl0iKTt2YXIgR3Q9IlxcdWQ4MDAtXFx1ZGZmZiIsQnQ9IlsiK0d0KyJdIixXdD0iW1xcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZl0iLEt0PSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLFF0PSJbXiIrR3QrIl0iLFh0PSIoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9IixZdD0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsSnQ9Iig/OiIrV3QrInwiK0t0KyIpIisiPyIsSHQ9IltcXHVmZTBlXFx1ZmUwZl0/IixadD1IdCtKdCsoIig/OlxcdTIwMGQoPzoiK1tRdCxYdCxZdF0uam9pbigifCIpKyIpIitIdCtKdCsiKSoiKSx0ZT0iKD86IitbUXQrV3QrIj8iLFd0LFh0LFl0LEJ0XS5qb2luKCJ8IikrIikiLGVlPVJlZ0V4cChLdCsiKD89IitLdCsiKXwiK3RlK1p0LCJnIik7ZnVuY3Rpb24gcmUodCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBVdC50ZXN0KHQpfSh0KT9mdW5jdGlvbih0KXtmb3IodmFyIGU9ZWUubGFzdEluZGV4PTA7ZWUudGVzdCh0KTspKytlO3JldHVybiBlfSh0KTpMdCh0KX12YXIgc2U9IltvYmplY3QgTWFwXSIsbmU9IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gb2UoZSl7aWYobnVsbD09ZSlyZXR1cm4gMDtpZihQdChlKSlyZXR1cm4ic3RyaW5nIj09dHlwZW9mKHI9ZSl8fCF0KHIpJiZnKHIpJiZtKHIpPT1xdD9yZShlKTplLmxlbmd0aDt2YXIgcixzPVZ0KGUpO3JldHVybiBzPT1zZXx8cz09bmU/ZS5zaXplOk10KGUpLmxlbmd0aH1mdW5jdGlvbiBpZSh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHVlKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGFlKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGxlKHQpe3JldHVybiB0IT10fWZ1bmN0aW9uIGhlKHQpe3JldHVybiEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZih1ZSh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hKCFhZSh0KXx8IiIhPT10KX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiEhaWUodCkmJjA9PT10Lmxlbmd0aH0odCl8fCEhbGUodCkpKSkpfWZ1bmN0aW9uIGNlKHQpe3JldHVybiEhaWUodCkmJigwIT09dC5sZW5ndGgmJigxIT09dC5sZW5ndGh8fCFoZSh0WzBdKSkpfXZhciBmZT0iW29iamVjdCBCb29sZWFuXSI7ZnVuY3Rpb24gbWUodCl7cmV0dXJuITA9PT0oZT10KXx8ITE9PT1lfHxnKGUpJiZtKGUpPT1mZTt2YXIgZX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4hKCFhZSh0KXx8IiI9PT10KX1mdW5jdGlvbiB3ZSh0KXtsZXQgZT0hMTtpZihnZSh0KSllPSFpc05hTihOdW1iZXIodCkpO2Vsc2UgaWYoZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVtYmVyXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpKXtpZihsZSh0KSlyZXR1cm4hMTtlPSEwfXJldHVybiBlfXZhciBwZT0vXHMvO3ZhciBkZT0vXlxzKy87ZnVuY3Rpb24geWUodCl7cmV0dXJuIHQ/dC5zbGljZSgwLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJnBlLnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9KHQpKzEpLnJlcGxhY2UoZGUsIiIpOnR9dmFyIGJlPU5hTixNZT0vXlstK10weFswLTlhLWZdKyQvaSx2ZT0vXjBiWzAxXSskL2kseGU9L14wb1swLTddKyQvaSxFZT1wYXJzZUludDtmdW5jdGlvbiBTZSh0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYocCh0KSlyZXR1cm4gYmU7aWYoTSh0KSl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQudmFsdWVPZj90LnZhbHVlT2YoKTp0O3Q9TShlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9eWUodCk7dmFyIHI9dmUudGVzdCh0KTtyZXR1cm4gcnx8eGUudGVzdCh0KT9FZSh0LnNsaWNlKDIpLHI/Mjo4KTpNZS50ZXN0KHQpP2JlOit0fXZhciBfZT0xLzAsamU9MTc5NzY5MzEzNDg2MjMxNTdlMjkyO2Z1bmN0aW9uIEFlKHQpe3JldHVybiB0Pyh0PVNlKHQpKT09PV9lfHx0PT09LV9lPyh0PDA/LTE6MSkqamU6dD09dD90OjA6MD09PXQ/dDowfXZhciBSZT1zLmlzRmluaXRlLEllPU1hdGgubWluO3ZhciBDZT1mdW5jdGlvbih0KXt2YXIgZT1NYXRoW3RdO3JldHVybiBmdW5jdGlvbih0LHIpe2lmKHQ9U2UodCkscj1udWxsPT1yPzA6SWUoZnVuY3Rpb24odCl7dmFyIGU9QWUodCkscj1lJTE7cmV0dXJuIGU9PWU/cj9lLXI6ZTowfShyKSwyOTIpLHImJlJlKHQpKXt2YXIgcz0oaHQodCkrImUiKS5zcGxpdCgiZSIpO3JldHVybisoKHM9KGh0KGUoc1swXSsiZSIrKCtzWzFdK3IpKSkrImUiKS5zcGxpdCgiZSIpKVswXSsiZSIrKCtzWzFdLXIpKX1yZXR1cm4gZSh0KX19KCJyb3VuZCIpLE5lPUNlO2Z1bmN0aW9uIGtlKHQsZT17fSl7bGV0IHI9d3QoZSwidXNlQ2xhbXBTYWZlIixudWxsKTttZShyKXx8KHI9ITEpO2xldCBzPXd0KGUsInVzZUxpbWl0U2FmZSIsbnVsbCk7bWUocyl8fChzPSExKTtsZXQgbj13dChlLCJyZXR1cm5XaXRoU3RhdGVBbmRNc2ciLG51bGwpO21lKG4pfHwobj0hMSk7bGV0IG89dD0+bj97c3RhdGU6InN1Y2Nlc3MiLG1zZzp0fTp0LGk9dD0+e2lmKG4pcmV0dXJue3N0YXRlOiJlcnJvciIsbXNnOnR9O3Rocm93IG5ldyBFcnJvcih0KX07aWYoIXdlKHQpKXJldHVybiBvKDApO2xldCB1PW51bGw7dHJ5e3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHdlKHQpP0FlKHQpOjB9KHQpLHU9TmUodCksciYmKHU+TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI/dT1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUjp1PE51bWJlci5NSU5fU0FGRV9JTlRFR0VSJiYodT1OdW1iZXIuTUlOX1NBRkVfSU5URUdFUikpfWNhdGNoKHQpe3JldHVybiBpKHQudG9TdHJpbmcoKSl9cmV0dXJuIHMmJiFOdW1iZXIuaXNTYWZlSW50ZWdlcihOdW1iZXIodSkpP2koYHZbJHt0fV0gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYCk6KCIwIj09PVN0cmluZyh1KSYmKHU9MCksbyh1KSl9ZnVuY3Rpb24gVGUodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImRlZmF1bHQiKT90LmRlZmF1bHQ6dH12YXIgRmU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KEZlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBPZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIFZlKHQpe2NvbnN0IGU9T2UuY2FsbCh0KTtyZXR1cm4gZS5lbmRzV2l0aCgiQXJyYXldIikmJiFlLmluY2x1ZGVzKCJCaWciKX1mdW5jdGlvbiB6ZSh0LGU9e30pe2lmKCFWZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7bGV0IHI7aWYodm9pZCAwIT09ZS5vdXRwdXQpe2lmKCFWZShlLm91dHB1dCkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZCIpO3I9ZS5vdXRwdXR9ZWxzZSByPW5ldyBBcnJheSh0Lmxlbmd0aCk7Y29uc3Qgcz1mdW5jdGlvbih0LGU9e30pe2lmKCFWZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7Y29uc3R7ZnJvbUluZGV4OnI9MCx0b0luZGV4OnM9dC5sZW5ndGh9PWU7aWYocjwwfHxyPj10Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocikpdGhyb3cgbmV3IEVycm9yKCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aCIpO2lmKHM8PXJ8fHM+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKHMpKXRocm93IG5ldyBFcnJvcigidG9JbmRleCBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGZyb21JbmRleCBhbmQgYXQgbW9zdCBlcXVhbCB0byBsZW5ndGgiKTtsZXQgbj10W3JdO2ZvcihsZXQgZT1yKzE7ZTxzO2UrKyl0W2VdPG4mJihuPXRbZV0pO3JldHVybiBufSh0KSxuPWZ1bmN0aW9uKHQsZT17fSl7aWYoIVZlKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtjb25zdHtmcm9tSW5kZXg6cj0wLHRvSW5kZXg6cz10Lmxlbmd0aH09ZTtpZihyPDB8fHI+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihyKSl0aHJvdyBuZXcgRXJyb3IoImZyb21JbmRleCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gbGVuZ3RoIik7aWYoczw9cnx8cz50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocykpdGhyb3cgbmV3IEVycm9yKCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCIpO2xldCBuPXRbcl07Zm9yKGxldCBlPXIrMTtlPHM7ZSsrKXRbZV0+biYmKG49dFtlXSk7cmV0dXJuIG59KHQpO2lmKHM9PT1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW5pbXVtIGFuZCBtYXhpbXVtIGlucHV0IHZhbHVlcyBhcmUgZXF1YWwuIENhbm5vdCByZXNjYWxlIGEgY29uc3RhbnQgYXJyYXkiKTtjb25zdHttaW46bz0oZS5hdXRvTWluTWF4P3M6MCksbWF4Omk9KGUuYXV0b01pbk1heD9uOjEpfT1lO2lmKG8+PWkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBvcHRpb24gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4IG9wdGlvbiIpO2NvbnN0IHU9KGktbykvKG4tcyk7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspcltlXT0odFtlXS1zKSp1K287cmV0dXJuIHJ9Y29uc3QgRGU9IiAiLnJlcGVhdCgyKSxQZT0iICIucmVwZWF0KDQpO2Z1bmN0aW9uIHFlKHQsZT17fSl7Y29uc3R7bWF4Um93czpyPTE1LG1heENvbHVtbnM6cz0xMCxtYXhOdW1TaXplOm49OCxwYWRNaW51czpvPSJhdXRvIn09ZTtyZXR1cm5gJHt0LmNvbnN0cnVjdG9yLm5hbWV9IHtcbiR7RGV9W1xuJHtQZX0ke2Z1bmN0aW9uKHQsZSxyLHMsbil7Y29uc3R7cm93czpvLGNvbHVtbnM6aX09dCx1PU1hdGgubWluKG8sZSksYT1NYXRoLm1pbihpLHIpLGw9W107aWYoImF1dG8iPT09bil7bj0hMTt0OmZvcihsZXQgZT0wO2U8dTtlKyspZm9yKGxldCByPTA7cjxhO3IrKylpZih0LmdldChlLHIpPDApe249ITA7YnJlYWsgdH19Zm9yKGxldCBlPTA7ZTx1O2UrKyl7bGV0IHI9W107Zm9yKGxldCBvPTA7bzxhO28rKylyLnB1c2goJGUodC5nZXQoZSxvKSxzLG4pKTtsLnB1c2goYCR7ci5qb2luKCIgIil9YCl9YSE9PWkmJihsW2wubGVuZ3RoLTFdKz1gIC4uLiAke2ktcn0gbW9yZSBjb2x1bW5zYCk7dSE9PW8mJmwucHVzaChgLi4uICR7by1lfSBtb3JlIHJvd3NgKTtyZXR1cm4gbC5qb2luKGBcbiR7UGV9YCl9KHQscixzLG4sbyl9XG4ke0RlfV1cbiR7RGV9cm93czogJHt0LnJvd3N9XG4ke0RlfWNvbHVtbnM6ICR7dC5jb2x1bW5zfVxufWB9ZnVuY3Rpb24gJGUodCxlLHIpe3JldHVybih0Pj0wJiZyP2AgJHtMZSh0LGUtMSl9YDpMZSh0LGUpKS5wYWRFbmQoZSl9ZnVuY3Rpb24gTGUodCxlKXtsZXQgcj10LnRvU3RyaW5nKCk7aWYoci5sZW5ndGg8PWUpcmV0dXJuIHI7bGV0IHM9dC50b0ZpeGVkKGUpO2lmKHMubGVuZ3RoPmUmJihzPXQudG9GaXhlZChNYXRoLm1heCgwLGUtKHMubGVuZ3RoLWUpKSkpLHMubGVuZ3RoPD1lJiYhcy5zdGFydHNXaXRoKCIwLjAwMCIpJiYhcy5zdGFydHNXaXRoKCItMC4wMDAiKSlyZXR1cm4gcztsZXQgbj10LnRvRXhwb25lbnRpYWwoZSk7cmV0dXJuIG4ubGVuZ3RoPmUmJihuPXQudG9FeHBvbmVudGlhbChNYXRoLm1heCgwLGUtKG4ubGVuZ3RoLWUpKSkpLG4uc2xpY2UoMCl9ZnVuY3Rpb24gVWUodCxlLHIpe2xldCBzPXI/dC5yb3dzOnQucm93cy0xO2lmKGU8MHx8ZT5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gR2UodCxlLHIpe2xldCBzPXI/dC5jb2x1bW5zOnQuY29sdW1ucy0xO2lmKGU8MHx8ZT5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gQmUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIik7cmV0dXJuIGV9ZnVuY3Rpb24gV2UodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzIik7cmV0dXJuIGV9ZnVuY3Rpb24gS2UodCxlKXtpZighVmUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigicm93IGluZGljZXMgbXVzdCBiZSBhbiBhcnJheSIpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl08MHx8ZVtyXT49dC5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKCJyb3cgaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUWUodCxlKXtpZighVmUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiY29sdW1uIGluZGljZXMgbXVzdCBiZSBhbiBhcnJheSIpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl08MHx8ZVtyXT49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJjb2x1bW4gaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gWGUodCxlLHIscyxuKXtpZig1IT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZXhwZWN0ZWQgNCBhcmd1bWVudHMiKTtpZihKZSgic3RhcnRSb3ciLGUpLEplKCJlbmRSb3ciLHIpLEplKCJzdGFydENvbHVtbiIscyksSmUoImVuZENvbHVtbiIsbiksZT5yfHxzPm58fGU8MHx8ZT49dC5yb3dzfHxyPDB8fHI+PXQucm93c3x8czwwfHxzPj10LmNvbHVtbnN8fG48MHx8bj49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJTdWJtYXRyaXggaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gWWUodCxlPTApe2xldCByPVtdO2ZvcihsZXQgcz0wO3M8dDtzKyspci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIEplKHQsZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7dH0gbXVzdCBiZSBhIG51bWJlcmApfWZ1bmN0aW9uIEhlKHQpe2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiRW1wdHkgbWF0cml4IGhhcyBubyBlbGVtZW50cyB0byBpbmRleCIpfWNsYXNzIFple3N0YXRpYyBmcm9tMURBcnJheSh0LGUscil7aWYodCplIT09ci5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImRhdGEgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGdpdmVuIGRpbWVuc2lvbnMiKTtsZXQgcz1uZXcgZXIodCxlKTtmb3IobGV0IG49MDtuPHQ7bisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspcy5zZXQobix0LHJbbiplK3RdKTtyZXR1cm4gc31zdGF0aWMgcm93VmVjdG9yKHQpe2xldCBlPW5ldyBlcigxLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldCgwLHIsdFtyXSk7cmV0dXJuIGV9c3RhdGljIGNvbHVtblZlY3Rvcih0KXtsZXQgZT1uZXcgZXIodC5sZW5ndGgsMSk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZS5zZXQociwwLHRbcl0pO3JldHVybiBlfXN0YXRpYyB6ZXJvcyh0LGUpe3JldHVybiBuZXcgZXIodCxlKX1zdGF0aWMgb25lcyh0LGUpe3JldHVybiBuZXcgZXIodCxlKS5maWxsKDEpfXN0YXRpYyByYW5kKHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3JhbmRvbTpzPU1hdGgucmFuZG9tfT1yO2xldCBuPW5ldyBlcih0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKyluLnNldChyLHQscygpKTtyZXR1cm4gbn1zdGF0aWMgcmFuZEludCh0LGUscj17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46cz0wLG1heDpuPTFlMyxyYW5kb206bz1NYXRoLnJhbmRvbX09cjtpZighTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYoIU51bWJlci5pc0ludGVnZXIobikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKHM+PW4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgaT1uLXMsdT1uZXcgZXIodCxlKTtmb3IobGV0IHI9MDtyPHQ7cisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPXMrTWF0aC5yb3VuZChvKCkqaSk7dS5zZXQocix0LGUpfXJldHVybiB1fXN0YXRpYyBleWUodCxlLHIpe3ZvaWQgMD09PWUmJihlPXQpLHZvaWQgMD09PXImJihyPTEpO2xldCBzPU1hdGgubWluKHQsZSksbj10aGlzLnplcm9zKHQsZSk7Zm9yKGxldCB0PTA7dDxzO3QrKyluLnNldCh0LHQscik7cmV0dXJuIG59c3RhdGljIGRpYWcodCxlLHIpe2xldCBzPXQubGVuZ3RoO3ZvaWQgMD09PWUmJihlPXMpLHZvaWQgMD09PXImJihyPWUpO2xldCBuPU1hdGgubWluKHMsZSxyKSxvPXRoaXMuemVyb3MoZSxyKTtmb3IobGV0IGU9MDtlPG47ZSsrKW8uc2V0KGUsZSx0W2VdKTtyZXR1cm4gb31zdGF0aWMgbWluKHQsZSl7dD10aGlzLmNoZWNrTWF0cml4KHQpLGU9dGhpcy5jaGVja01hdHJpeChlKTtsZXQgcj10LnJvd3Mscz10LmNvbHVtbnMsbj1uZXcgZXIocixzKTtmb3IobGV0IG89MDtvPHI7bysrKWZvcihsZXQgcj0wO3I8cztyKyspbi5zZXQobyxyLE1hdGgubWluKHQuZ2V0KG8sciksZS5nZXQobyxyKSkpO3JldHVybiBufXN0YXRpYyBtYXgodCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxzPXQuY29sdW1ucyxuPW5ldyB0aGlzKHIscyk7Zm9yKGxldCBvPTA7bzxyO28rKylmb3IobGV0IHI9MDtyPHM7cisrKW4uc2V0KG8scixNYXRoLm1heCh0LmdldChvLHIpLGUuZ2V0KG8scikpKTtyZXR1cm4gbn1zdGF0aWMgY2hlY2tNYXRyaXgodCl7cmV0dXJuIFplLmlzTWF0cml4KHQpP3Q6bmV3IGVyKHQpfXN0YXRpYyBpc01hdHJpeCh0KXtyZXR1cm4gbnVsbCE9dCYmIk1hdHJpeCI9PT10LmtsYXNzfWdldCBzaXplKCl7cmV0dXJuIHRoaXMucm93cyp0aGlzLmNvbHVtbnN9YXBwbHkodCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LmNhbGwodGhpcyxlLHIpO3JldHVybiB0aGlzfXRvMURBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5wdXNoKHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXRvMkRBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7dC5wdXNoKFtdKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdFtlXS5wdXNoKHRoaXMuZ2V0KGUscikpfXJldHVybiB0fXRvSlNPTigpe3JldHVybiB0aGlzLnRvMkRBcnJheSgpfWlzUm93VmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N9aXNDb2x1bW5WZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMuY29sdW1uc31pc1ZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5yb3dzfHwxPT09dGhpcy5jb2x1bW5zfWlzU3F1YXJlKCl7cmV0dXJuIHRoaXMucm93cz09PXRoaXMuY29sdW1uc31pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLnJvd3N8fDA9PT10aGlzLmNvbHVtbnN9aXNTeW1tZXRyaWMoKXtpZih0aGlzLmlzU3F1YXJlKCkpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPD10O2UrKylpZih0aGlzLmdldCh0LGUpIT09dGhpcy5nZXQoZSx0KSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1pc0Rpc3RhbmNlKCl7aWYoIXRoaXMuaXNTeW1tZXRyaWMoKSlyZXR1cm4hMTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspaWYoMCE9PXRoaXMuZ2V0KHQsdCkpcmV0dXJuITE7cmV0dXJuITB9aXNFY2hlbG9uRm9ybSgpe2xldCB0PTAsZT0wLHI9LTEscz0hMCxuPSExO2Zvcig7dDx0aGlzLnJvd3MmJnM7KXtmb3IoZT0wLG49ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09bjspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPnI/KG49ITAscj1lKToocz0hMSxuPSEwKTt0Kyt9cmV0dXJuIHN9aXNSZWR1Y2VkRWNoZWxvbkZvcm0oKXtsZXQgdD0wLGU9MCxyPS0xLHM9ITAsbj0hMTtmb3IoO3Q8dGhpcy5yb3dzJiZzOyl7Zm9yKGU9MCxuPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PW47KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5yPyhuPSEwLHI9ZSk6KHM9ITEsbj0hMCk7Zm9yKGxldCByPWUrMTtyPHRoaXMucm93cztyKyspMCE9PXRoaXMuZ2V0KHQscikmJihzPSExKTt0Kyt9cmV0dXJuIHN9ZWNoZWxvbkZvcm0oKXtsZXQgdD10aGlzLmNsb25lKCksZT0wLHI9MDtmb3IoO2U8dC5yb3dzJiZyPHQuY29sdW1uczspe2xldCBzPWU7Zm9yKGxldCBuPWU7bjx0LnJvd3M7bisrKXQuZ2V0KG4scik+dC5nZXQocyxyKSYmKHM9bik7aWYoMD09PXQuZ2V0KHMscikpcisrO2Vsc2V7dC5zd2FwUm93cyhlLHMpO2xldCBuPXQuZ2V0KGUscik7Zm9yKGxldCBzPXI7czx0LmNvbHVtbnM7cysrKXQuc2V0KGUscyx0LmdldChlLHMpL24pO2ZvcihsZXQgcz1lKzE7czx0LnJvd3M7cysrKXtsZXQgbj10LmdldChzLHIpL3QuZ2V0KGUscik7dC5zZXQocyxyLDApO2ZvcihsZXQgbz1yKzE7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHMsbyx0LmdldChzLG8pLXQuZ2V0KGUsbykqbil9ZSsrLHIrK319cmV0dXJuIHR9cmVkdWNlZEVjaGVsb25Gb3JtKCl7bGV0IHQ9dGhpcy5lY2hlbG9uRm9ybSgpLGU9dC5jb2x1bW5zLHI9dC5yb3dzLHM9ci0xO2Zvcig7cz49MDspaWYoMD09PXQubWF4Um93KHMpKXMtLTtlbHNle2xldCBuPTAsbz0hMTtmb3IoO248ciYmITE9PT1vOykxPT09dC5nZXQocyxuKT9vPSEwOm4rKztmb3IobGV0IHI9MDtyPHM7cisrKXtsZXQgbz10LmdldChyLG4pO2ZvcihsZXQgaT1uO2k8ZTtpKyspe2xldCBlPXQuZ2V0KHIsaSktbyp0LmdldChzLGkpO3Quc2V0KHIsaSxlKX19cy0tfXJldHVybiB0fXNldCgpe3Rocm93IG5ldyBFcnJvcigic2V0IG1ldGhvZCBpcyB1bmltcGxlbWVudGVkIil9Z2V0KCl7dGhyb3cgbmV3IEVycm9yKCJnZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQiKX1yZXBlYXQodD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtyb3dzOmU9MSxjb2x1bW5zOnI9MX09dDtpZighTnVtYmVyLmlzSW50ZWdlcihlKXx8ZTw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJyb3dzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7aWYoIU51bWJlci5pc0ludGVnZXIocil8fHI8PTApdGhyb3cgbmV3IFR5cGVFcnJvcigiY29sdW1ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2xldCBzPW5ldyBlcih0aGlzLnJvd3MqZSx0aGlzLmNvbHVtbnMqcik7Zm9yKGxldCB0PTA7dDxlO3QrKylmb3IobGV0IGU9MDtlPHI7ZSsrKXMuc2V0U3ViTWF0cml4KHRoaXMsdGhpcy5yb3dzKnQsdGhpcy5jb2x1bW5zKmUpO3JldHVybiBzfWZpbGwodCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9bmVnKCl7cmV0dXJuIHRoaXMubXVsUygtMSl9Z2V0Um93KHQpe1VlKHRoaXMsdCk7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKWUucHVzaCh0aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1nZXRSb3dWZWN0b3IodCl7cmV0dXJuIGVyLnJvd1ZlY3Rvcih0aGlzLmdldFJvdyh0KSl9c2V0Um93KHQsZSl7VWUodGhpcyx0KSxlPUJlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KHQscixlW3JdKTtyZXR1cm4gdGhpc31zd2FwUm93cyh0LGUpe1VlKHRoaXMsdCksVWUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspe2xldCBzPXRoaXMuZ2V0KHQscik7dGhpcy5zZXQodCxyLHRoaXMuZ2V0KGUscikpLHRoaXMuc2V0KGUscixzKX1yZXR1cm4gdGhpc31nZXRDb2x1bW4odCl7R2UodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZS5wdXNoKHRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfWdldENvbHVtblZlY3Rvcih0KXtyZXR1cm4gZXIuY29sdW1uVmVjdG9yKHRoaXMuZ2V0Q29sdW1uKHQpKX1zZXRDb2x1bW4odCxlKXtHZSh0aGlzLHQpLGU9V2UodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspdGhpcy5zZXQocix0LGVbcl0pO3JldHVybiB0aGlzfXN3YXBDb2x1bW5zKHQsZSl7R2UodGhpcyx0KSxHZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl7bGV0IHM9dGhpcy5nZXQocix0KTt0aGlzLnNldChyLHQsdGhpcy5nZXQocixlKSksdGhpcy5zZXQocixlLHMpfXJldHVybiB0aGlzfWFkZFJvd1ZlY3Rvcih0KXt0PUJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0W3JdKTtyZXR1cm4gdGhpc31zdWJSb3dWZWN0b3IodCl7dD1CZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdFtyXSk7cmV0dXJuIHRoaXN9bXVsUm93VmVjdG9yKHQpe3Q9QmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnRbcl0pO3JldHVybiB0aGlzfWRpdlJvd1ZlY3Rvcih0KXt0PUJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90W3JdKTtyZXR1cm4gdGhpc31hZGRDb2x1bW5WZWN0b3IodCl7dD1XZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdFtlXSk7cmV0dXJuIHRoaXN9c3ViQ29sdW1uVmVjdG9yKHQpe3Q9V2UodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXRbZV0pO3JldHVybiB0aGlzfW11bENvbHVtblZlY3Rvcih0KXt0PVdlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0W2VdKTtyZXR1cm4gdGhpc31kaXZDb2x1bW5WZWN0b3IodCl7dD1XZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdFtlXSk7cmV0dXJuIHRoaXN9bXVsUm93KHQsZSl7VWUodGhpcyx0KTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQodCxyLHRoaXMuZ2V0KHQscikqZSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uKHQsZSl7R2UodGhpcyx0KTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspdGhpcy5zZXQocix0LHRoaXMuZ2V0KHIsdCkqZSk7cmV0dXJuIHRoaXN9bWF4KHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47c3dpdGNoKHQpe2Nhc2Uicm93Ijp7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5yb3dzKS5maWxsKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnRbZV0mJih0W2VdPXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWNhc2UiY29sdW1uIjp7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5jb2x1bW5zKS5maWxsKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnRbcl0mJih0W3JdPXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWNhc2Ugdm9pZCAwOntsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKT50JiYodD10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWF4SW5kZXgoKXtIZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dGhpcy5jb2x1bW5zO3MrKyl0aGlzLmdldChyLHMpPnQmJih0PXRoaXMuZ2V0KHIscyksZVswXT1yLGVbMV09cyk7cmV0dXJuIGV9bWluKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47c3dpdGNoKHQpe2Nhc2Uicm93Ijp7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5yb3dzKS5maWxsKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPHRbZV0mJih0W2VdPXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWNhc2UiY29sdW1uIjp7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5jb2x1bW5zKS5maWxsKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPHRbcl0mJih0W3JdPXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWNhc2Ugdm9pZCAwOntsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKTx0JiYodD10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWluSW5kZXgoKXtIZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dGhpcy5jb2x1bW5zO3MrKyl0aGlzLmdldChyLHMpPHQmJih0PXRoaXMuZ2V0KHIscyksZVswXT1yLGVbMV09cyk7cmV0dXJuIGV9bWF4Um93KHQpe2lmKFVlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCh0LDApO2ZvcihsZXQgcj0xO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldCh0LHIpPmUmJihlPXRoaXMuZ2V0KHQscikpO3JldHVybiBlfW1heFJvd0luZGV4KHQpe1VlKHRoaXMsdCksSGUodGhpcyk7bGV0IGU9dGhpcy5nZXQodCwwKSxyPVt0LDBdO2ZvcihsZXQgcz0xO3M8dGhpcy5jb2x1bW5zO3MrKyl0aGlzLmdldCh0LHMpPmUmJihlPXRoaXMuZ2V0KHQscyksclsxXT1zKTtyZXR1cm4gcn1taW5Sb3codCl7aWYoVWUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik8ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWluUm93SW5kZXgodCl7VWUodGhpcyx0KSxIZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBzPTE7czx0aGlzLmNvbHVtbnM7cysrKXRoaXMuZ2V0KHQscyk8ZSYmKGU9dGhpcy5nZXQodCxzKSxyWzFdPXMpO3JldHVybiByfW1heENvbHVtbih0KXtpZihHZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQoMCx0KTtmb3IobGV0IHI9MTtyPHRoaXMucm93cztyKyspdGhpcy5nZXQocix0KT5lJiYoZT10aGlzLmdldChyLHQpKTtyZXR1cm4gZX1tYXhDb2x1bW5JbmRleCh0KXtHZSh0aGlzLHQpLEhlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KDAsdCkscj1bMCx0XTtmb3IobGV0IHM9MTtzPHRoaXMucm93cztzKyspdGhpcy5nZXQocyx0KT5lJiYoZT10aGlzLmdldChzLHQpLHJbMF09cyk7cmV0dXJuIHJ9bWluQ29sdW1uKHQpe2lmKEdlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPGUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1pbkNvbHVtbkluZGV4KHQpe0dlKHRoaXMsdCksSGUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgcz0xO3M8dGhpcy5yb3dzO3MrKyl0aGlzLmdldChzLHQpPGUmJihlPXRoaXMuZ2V0KHMsdCksclswXT1zKTtyZXR1cm4gcn1kaWFnKCl7bGV0IHQ9TWF0aC5taW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLmdldChyLHIpKTtyZXR1cm4gZX1ub3JtKHQ9ImZyb2Jlbml1cyIpe3N3aXRjaCh0KXtjYXNlIm1heCI6cmV0dXJuIHRoaXMubWF4KCk7Y2FzZSJmcm9iZW5pdXMiOnJldHVybiBNYXRoLnNxcnQodGhpcy5kb3QodGhpcykpO2RlZmF1bHQ6dGhyb3cgbmV3IFJhbmdlRXJyb3IoYHVua25vd24gbm9ybSB0eXBlOiAke3R9YCl9fWN1bXVsYXRpdmVTdW0oKXtsZXQgdD0wO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdCs9dGhpcy5nZXQoZSxyKSx0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9ZG90KHQpe1plLmlzTWF0cml4KHQpJiYodD10LnRvMURBcnJheSgpKTtsZXQgZT10aGlzLnRvMURBcnJheSgpO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvcnMgZG8gbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSIpO2xldCByPTA7Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspcis9ZVtzXSp0W3NdO3JldHVybiByfW1tdWwodCl7dD1lci5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMscz10LmNvbHVtbnMsbj1uZXcgZXIoZSxzKSxvPW5ldyBGbG9hdDY0QXJyYXkocik7Zm9yKGxldCBpPTA7aTxzO2krKyl7Zm9yKGxldCBlPTA7ZTxyO2UrKylvW2VdPXQuZ2V0KGUsaSk7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9MDtmb3IobGV0IHM9MDtzPHI7cysrKWUrPXRoaXMuZ2V0KHQscykqb1tzXTtuLnNldCh0LGksZSl9fXJldHVybiBufW1wb3codCl7aWYoIXRoaXMuaXNTcXVhcmUoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cml4IG11c3QgYmUgc3F1YXJlIik7aWYoIU51bWJlci5pc0ludGVnZXIodCl8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRXhwb25lbnQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIik7bGV0IGU9ZXIuZXllKHRoaXMucm93cykscj10aGlzO2ZvcihsZXQgcz10O3M+PTE7cy89MikwIT0oMSZzKSYmKGU9ZS5tbXVsKHIpKSxyPXIubW11bChyKTtyZXR1cm4gZX1zdHJhc3NlbjJ4Mih0KXt0PWVyLmNoZWNrTWF0cml4KHQpO2xldCBlPW5ldyBlcigyLDIpO2NvbnN0IHI9dGhpcy5nZXQoMCwwKSxzPXQuZ2V0KDAsMCksbj10aGlzLmdldCgwLDEpLG89dC5nZXQoMCwxKSxpPXRoaXMuZ2V0KDEsMCksdT10LmdldCgxLDApLGE9dGhpcy5nZXQoMSwxKSxsPXQuZ2V0KDEsMSksaD0ocithKSoocytsKSxjPShpK2EpKnMsZj1yKihvLWwpLG09YSoodS1zKSxnPShyK24pKmwsdz1oK20tZysobi1hKSoodStsKSxwPWYrZyxkPWMrbSx5PWgtYytmKyhpLXIpKihzK28pO3JldHVybiBlLnNldCgwLDAsdyksZS5zZXQoMCwxLHApLGUuc2V0KDEsMCxkKSxlLnNldCgxLDEseSksZX1zdHJhc3NlbjN4Myh0KXt0PWVyLmNoZWNrTWF0cml4KHQpO2xldCBlPW5ldyBlcigzLDMpO2NvbnN0IHI9dGhpcy5nZXQoMCwwKSxzPXRoaXMuZ2V0KDAsMSksbj10aGlzLmdldCgwLDIpLG89dGhpcy5nZXQoMSwwKSxpPXRoaXMuZ2V0KDEsMSksdT10aGlzLmdldCgxLDIpLGE9dGhpcy5nZXQoMiwwKSxsPXRoaXMuZ2V0KDIsMSksaD10aGlzLmdldCgyLDIpLGM9dC5nZXQoMCwwKSxmPXQuZ2V0KDAsMSksbT10LmdldCgwLDIpLGc9dC5nZXQoMSwwKSx3PXQuZ2V0KDEsMSkscD10LmdldCgxLDIpLGQ9dC5nZXQoMiwwKSx5PXQuZ2V0KDIsMSksYj10LmdldCgyLDIpLE09KHItbykqKC1mK3cpLHY9KC1yK28raSkqKGMtZit3KSx4PShvK2kpKigtYytmKSxFPXIqYyxTPSgtcithK2wpKihjLW0rcCksXz0oLXIrYSkqKG0tcCksaj0oYStsKSooLWMrbSksQT0oLW4rbCtoKSoodytkLXkpLFI9KG4taCkqKHcteSksST1uKmQsQz0obCtoKSooLWQreSksTj0oLW4raSt1KSoocCtkLWIpLGs9KG4tdSkqKHAtYiksVD0oaSt1KSooLWQrYiksRj1FK0krcypnLE89KHIrcytuLW8taS1sLWgpKncrdit4K0UrQStJK0MsVj1FK1MraisocitzK24taS11LWEtbCkqcCtJK04rVCx6PU0raSooLWMrZitnLXctcC1kK2IpK3YrRStJK04rayxEPU0rdit4K0UrdSp5LFA9SStOK2srVCtvKm0scT1FK1MrXytsKigtYyttK2ctdy1wLWQreSkrQStSK0ksJD1BK1IrSStDK2EqZixMPUUrUytfK2oraCpiO3JldHVybiBlLnNldCgwLDAsRiksZS5zZXQoMCwxLE8pLGUuc2V0KDAsMixWKSxlLnNldCgxLDAseiksZS5zZXQoMSwxLEQpLGUuc2V0KDEsMixQKSxlLnNldCgyLDAscSksZS5zZXQoMiwxLCQpLGUuc2V0KDIsMixMKSxlfW1tdWxTdHJhc3Nlbih0KXt0PWVyLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuY2xvbmUoKSxyPWUucm93cyxzPWUuY29sdW1ucyxuPXQucm93cyxvPXQuY29sdW1ucztmdW5jdGlvbiBpKHQsZSxyKXtsZXQgcz10LnJvd3Msbj10LmNvbHVtbnM7aWYocz09PWUmJm49PT1yKXJldHVybiB0O3tsZXQgcz1aZS56ZXJvcyhlLHIpO3JldHVybiBzPXMuc2V0U3ViTWF0cml4KHQsMCwwKSxzfX1zIT09biYmY29uc29sZS53YXJuKGBNdWx0aXBseWluZyAke3J9IHggJHtzfSBhbmQgJHtufSB4ICR7b30gbWF0cml4OiBkaW1lbnNpb25zIGRvIG5vdCBtYXRjaC5gKTtsZXQgdT1NYXRoLm1heChyLG4pLGE9TWF0aC5tYXgocyxvKTtyZXR1cm4gZT1pKGUsdSxhKSxmdW5jdGlvbiB0KGUscixzLG4pe2lmKHM8PTUxMnx8bjw9NTEyKXJldHVybiBlLm1tdWwocik7cyUyPT0xJiZuJTI9PTE/KGU9aShlLHMrMSxuKzEpLHI9aShyLHMrMSxuKzEpKTpzJTI9PTE/KGU9aShlLHMrMSxuKSxyPWkocixzKzEsbikpOm4lMj09MSYmKGU9aShlLHMsbisxKSxyPWkocixzLG4rMSkpO2xldCBvPXBhcnNlSW50KGUucm93cy8yLDEwKSx1PXBhcnNlSW50KGUuY29sdW1ucy8yLDEwKSxhPWUuc3ViTWF0cml4KDAsby0xLDAsdS0xKSxsPXIuc3ViTWF0cml4KDAsby0xLDAsdS0xKSxoPWUuc3ViTWF0cml4KDAsby0xLHUsZS5jb2x1bW5zLTEpLGM9ci5zdWJNYXRyaXgoMCxvLTEsdSxyLmNvbHVtbnMtMSksZj1lLnN1Yk1hdHJpeChvLGUucm93cy0xLDAsdS0xKSxtPXIuc3ViTWF0cml4KG8sci5yb3dzLTEsMCx1LTEpLGc9ZS5zdWJNYXRyaXgobyxlLnJvd3MtMSx1LGUuY29sdW1ucy0xKSx3PXIuc3ViTWF0cml4KG8sci5yb3dzLTEsdSxyLmNvbHVtbnMtMSkscD10KFplLmFkZChhLGcpLFplLmFkZChsLHcpLG8sdSksZD10KFplLmFkZChmLGcpLGwsbyx1KSx5PXQoYSxaZS5zdWIoYyx3KSxvLHUpLGI9dChnLFplLnN1YihtLGwpLG8sdSksTT10KFplLmFkZChhLGgpLHcsbyx1KSx2PXQoWmUuc3ViKGYsYSksWmUuYWRkKGwsYyksbyx1KSx4PXQoWmUuc3ViKGgsZyksWmUuYWRkKG0sdyksbyx1KSxFPVplLmFkZChwLGIpO0Uuc3ViKE0pLEUuYWRkKHgpO2xldCBTPVplLmFkZCh5LE0pLF89WmUuYWRkKGQsYiksaj1aZS5zdWIocCxkKTtqLmFkZCh5KSxqLmFkZCh2KTtsZXQgQT1aZS56ZXJvcygyKkUucm93cywyKkUuY29sdW1ucyk7cmV0dXJuIEE9QS5zZXRTdWJNYXRyaXgoRSwwLDApLEE9QS5zZXRTdWJNYXRyaXgoUyxFLnJvd3MsMCksQT1BLnNldFN1Yk1hdHJpeChfLDAsRS5jb2x1bW5zKSxBPUEuc2V0U3ViTWF0cml4KGosRS5yb3dzLEUuY29sdW1ucyksQS5zdWJNYXRyaXgoMCxzLTEsMCxuLTEpfShlLHQ9aSh0LHUsYSksdSxhKX1zY2FsZVJvd3ModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IHM9bmV3IGVyKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyl7Y29uc3Qgbj10aGlzLmdldFJvdyh0KTtuLmxlbmd0aD4wJiZ6ZShuLHttaW46ZSxtYXg6cixvdXRwdXQ6bn0pLHMuc2V0Um93KHQsbil9cmV0dXJuIHN9c2NhbGVDb2x1bW5zKHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOmU9MCxtYXg6cj0xfT10O2lmKCFOdW1iZXIuaXNGaW5pdGUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYSBudW1iZXIiKTtpZighTnVtYmVyLmlzRmluaXRlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGEgbnVtYmVyIik7aWYoZT49cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBzPW5ldyBlcih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMuY29sdW1uczt0Kyspe2NvbnN0IG49dGhpcy5nZXRDb2x1bW4odCk7bi5sZW5ndGgmJnplKG4se21pbjplLG1heDpyLG91dHB1dDpufSkscy5zZXRDb2x1bW4odCxuKX1yZXR1cm4gc31mbGlwUm93cygpe2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMuY29sdW1ucy8yKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5nZXQoZSxyKSxzPXRoaXMuZ2V0KGUsdGhpcy5jb2x1bW5zLTEtcik7dGhpcy5zZXQoZSxyLHMpLHRoaXMuc2V0KGUsdGhpcy5jb2x1bW5zLTEtcix0KX1yZXR1cm4gdGhpc31mbGlwQ29sdW1ucygpe2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMucm93cy8yKTtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspZm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5nZXQocixlKSxzPXRoaXMuZ2V0KHRoaXMucm93cy0xLXIsZSk7dGhpcy5zZXQocixlLHMpLHRoaXMuc2V0KHRoaXMucm93cy0xLXIsZSx0KX1yZXR1cm4gdGhpc31rcm9uZWNrZXJQcm9kdWN0KHQpe3Q9ZXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5yb3dzLHI9dGhpcy5jb2x1bW5zLHM9dC5yb3dzLG49dC5jb2x1bW5zLG89bmV3IGVyKGUqcyxyKm4pO2ZvcihsZXQgaT0wO2k8ZTtpKyspZm9yKGxldCBlPTA7ZTxyO2UrKylmb3IobGV0IHI9MDtyPHM7cisrKWZvcihsZXQgdT0wO3U8bjt1Kyspby5zZXQocyppK3IsbiplK3UsdGhpcy5nZXQoaSxlKSp0LmdldChyLHUpKTtyZXR1cm4gb31rcm9uZWNrZXJTdW0odCl7aWYodD1lci5jaGVja01hdHJpeCh0KSwhdGhpcy5pc1NxdWFyZSgpfHwhdC5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiS3JvbmVja2VyIFN1bSBuZWVkcyB0d28gU3F1YXJlIE1hdHJpY2VzIik7bGV0IGU9dGhpcy5yb3dzLHI9dC5yb3dzLHM9dGhpcy5rcm9uZWNrZXJQcm9kdWN0KGVyLmV5ZShyLHIpKSxuPWVyLmV5ZShlLGUpLmtyb25lY2tlclByb2R1Y3QodCk7cmV0dXJuIHMuYWRkKG4pfXRyYW5zcG9zZSgpe2xldCB0PW5ldyBlcih0aGlzLmNvbHVtbnMsdGhpcy5yb3dzKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuc2V0KHIsZSx0aGlzLmdldChlLHIpKTtyZXR1cm4gdH1zb3J0Um93cyh0PXRyKXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspdGhpcy5zZXRSb3coZSx0aGlzLmdldFJvdyhlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zb3J0Q29sdW1ucyh0PXRyKXtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXRDb2x1bW4oZSx0aGlzLmdldENvbHVtbihlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zdWJNYXRyaXgodCxlLHIscyl7WGUodGhpcyx0LGUscixzKTtsZXQgbj1uZXcgZXIoZS10KzEscy1yKzEpO2ZvcihsZXQgbz10O288PWU7bysrKWZvcihsZXQgZT1yO2U8PXM7ZSsrKW4uc2V0KG8tdCxlLXIsdGhpcy5nZXQobyxlKSk7cmV0dXJuIG59c3ViTWF0cml4Um93KHQsZSxyKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10aGlzLmNvbHVtbnMtMSksZT5yfHxlPDB8fGU+PXRoaXMuY29sdW1uc3x8cjwwfHxyPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBzPW5ldyBlcih0Lmxlbmd0aCxyLWUrMSk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKGxldCBvPWU7bzw9cjtvKyspe2lmKHRbbl08MHx8dFtuXT49dGhpcy5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKGBSb3cgaW5kZXggb3V0IG9mIHJhbmdlOiAke3Rbbl19YCk7cy5zZXQobixvLWUsdGhpcy5nZXQodFtuXSxvKSl9cmV0dXJuIHN9c3ViTWF0cml4Q29sdW1uKHQsZSxyKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10aGlzLnJvd3MtMSksZT5yfHxlPDB8fGU+PXRoaXMucm93c3x8cjwwfHxyPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBzPW5ldyBlcihyLWUrMSx0Lmxlbmd0aCk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKGxldCBvPWU7bzw9cjtvKyspe2lmKHRbbl08MHx8dFtuXT49dGhpcy5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKGBDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlOiAke3Rbbl19YCk7cy5zZXQoby1lLG4sdGhpcy5nZXQobyx0W25dKSl9cmV0dXJuIHN9c2V0U3ViTWF0cml4KHQsZSxyKXtpZigodD1lci5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXJldHVybiB0aGlzO1hlKHRoaXMsZSxlK3Qucm93cy0xLHIscit0LmNvbHVtbnMtMSk7Zm9yKGxldCBzPTA7czx0LnJvd3M7cysrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0aGlzLnNldChlK3MscituLHQuZ2V0KHMsbikpO3JldHVybiB0aGlzfXNlbGVjdGlvbih0LGUpe0tlKHRoaXMsdCksUWUodGhpcyxlKTtsZXQgcj1uZXcgZXIodC5sZW5ndGgsZS5sZW5ndGgpO2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtsZXQgbj10W3NdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgbz1lW3RdO3Iuc2V0KHMsdCx0aGlzLmdldChuLG8pKX19cmV0dXJuIHJ9dHJhY2UoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPTA7Zm9yKGxldCByPTA7cjx0O3IrKyllKz10aGlzLmdldChyLHIpO3JldHVybiBlfWNsb25lKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29weSh0aGlzLG5ldyBlcih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSl9c3RhdGljIGNvcHkodCxlKXtmb3IoY29uc3RbcixzLG5db2YgdC5lbnRyaWVzKCkpZS5zZXQocixzLG4pO3JldHVybiBlfXN1bSh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1ZZSh0LnJvd3MpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IHM9MDtzPHQuY29sdW1uczsrK3MpZVtyXSs9dC5nZXQocixzKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSJjb2x1bW4iOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1ZZSh0LmNvbHVtbnMpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IHM9MDtzPHQuY29sdW1uczsrK3MpZVtzXSs9dC5nZXQocixzKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTA7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zO3MrKyllKz10LmdldChyLHMpO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19cHJvZHVjdCh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1ZZSh0LnJvd3MsMSk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zOysrcyllW3JdKj10LmdldChyLHMpO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPVllKHQuY29sdW1ucywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7KytzKWVbc10qPXQuZ2V0KHIscyk7cmV0dXJuIGV9KHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT0xO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspZSo9dC5nZXQocixzKTtyZXR1cm4gZX0odGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fW1lYW4odCl7Y29uc3QgZT10aGlzLnN1bSh0KTtzd2l0Y2godCl7Y2FzZSJyb3ciOmZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyllW3RdLz10aGlzLmNvbHVtbnM7cmV0dXJuIGU7Y2FzZSJjb2x1bW4iOmZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyllW3RdLz10aGlzLnJvd3M7cmV0dXJuIGU7Y2FzZSB2b2lkIDA6cmV0dXJuIGUvdGhpcy5zaXplO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX12YXJpYW5jZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHt1bmJpYXNlZDpyPSEwLG1lYW46cz10aGlzLm1lYW4odCl9PWU7aWYoImJvb2xlYW4iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmJpYXNlZCBtdXN0IGJlIGEgYm9vbGVhbiIpO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIVZlKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgcz10LnJvd3Msbj10LmNvbHVtbnMsbz1bXTtmb3IobGV0IGk9MDtpPHM7aSsrKXtsZXQgcz0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxuO2UrKylhPXQuZ2V0KGksZSktcltpXSxzKz1hLHUrPWEqYTtlP28ucHVzaCgodS1zKnMvbikvKG4tMSkpOm8ucHVzaCgodS1zKnMvbikvbil9cmV0dXJuIG99KHRoaXMscixzKTtjYXNlImNvbHVtbiI6aWYoIVZlKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgcz10LnJvd3Msbj10LmNvbHVtbnMsbz1bXTtmb3IobGV0IGk9MDtpPG47aSsrKXtsZXQgbj0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxzO2UrKylhPXQuZ2V0KGUsaSktcltpXSxuKz1hLHUrPWEqYTtlP28ucHVzaCgodS1uKm4vcykvKHMtMSkpOm8ucHVzaCgodS1uKm4vcykvcyl9cmV0dXJuIG99KHRoaXMscixzKTtjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIHMpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBzPXQucm93cyxuPXQuY29sdW1ucyxvPXMqbjtsZXQgaT0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxzO2UrKylmb3IobGV0IHM9MDtzPG47cysrKWE9dC5nZXQoZSxzKS1yLGkrPWEsdSs9YSphO3JldHVybiBlPyh1LWkqaS9vKS8oby0xKToodS1pKmkvbykvb30odGhpcyxyLHMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zdGFuZGFyZERldmlhdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCk7Y29uc3Qgcj10aGlzLnZhcmlhbmNlKHQsZSk7aWYodm9pZCAwPT09dClyZXR1cm4gTWF0aC5zcXJ0KHIpO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXJbdF09TWF0aC5zcXJ0KHJbdF0pO3JldHVybiByfWNlbnRlcih0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtjZW50ZXI6cj10aGlzLm1lYW4odCl9PWU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighVmUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7cysrKXQuc2V0KHIscyx0LmdldChyLHMpLWVbcl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKCFWZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspdC5zZXQocixzLHQuZ2V0KHIscyktZVtzXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7cysrKXQuc2V0KHIscyx0LmdldChyLHMpLWUpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXNjYWxlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2xldCByPWUuc2NhbGU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQucm93cztyKyspe2xldCBzPTA7Zm9yKGxldCBlPTA7ZTx0LmNvbHVtbnM7ZSsrKXMrPXQuZ2V0KHIsZSkqKjIvKHQuY29sdW1ucy0xKTtlLnB1c2goTWF0aC5zcXJ0KHMpKX1yZXR1cm4gZX0odGhpcyk7ZWxzZSBpZighVmUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspdC5zZXQocixzLHQuZ2V0KHIscykvZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0LmNvbHVtbnM7cisrKXtsZXQgcz0wO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKylzKz10LmdldChlLHIpKioyLyh0LnJvd3MtMSk7ZS5wdXNoKE1hdGguc3FydChzKSl9cmV0dXJuIGV9KHRoaXMpO2Vsc2UgaWYoIVZlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7cysrKXQuc2V0KHIscyx0LmdldChyLHMpL2Vbc10pfSh0aGlzLHIpLHRoaXM7Y2FzZSB2b2lkIDA6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5zaXplLTE7bGV0IHI9MDtmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspZm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKXIrPXQuZ2V0KG4scykqKjIvZTtyZXR1cm4gTWF0aC5zcXJ0KHIpfSh0aGlzKTtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zO3MrKyl0LnNldChyLHMsdC5nZXQocixzKS9lKX0odGhpcyxyKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX10b1N0cmluZyh0KXtyZXR1cm4gcWUodGhpcyx0KX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLmVudHJpZXMoKX0qZW50cmllcygpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspeWllbGRbdCxlLHRoaXMuZ2V0KHQsZSldfSp2YWx1ZXMoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXlpZWxkIHRoaXMuZ2V0KHQsZSl9fWZ1bmN0aW9uIHRyKHQsZSl7cmV0dXJuIHQtZX1aZS5wcm90b3R5cGUua2xhc3M9Ik1hdHJpeCIsInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJihaZS5wcm90b3R5cGVbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV09ZnVuY3Rpb24oKXtyZXR1cm4gcWUodGhpcyl9KSxaZS5yYW5kb209WmUucmFuZCxaZS5yYW5kb21JbnQ9WmUucmFuZEludCxaZS5kaWFnb25hbD1aZS5kaWFnLFplLnByb3RvdHlwZS5kaWFnb25hbD1aZS5wcm90b3R5cGUuZGlhZyxaZS5pZGVudGl0eT1aZS5leWUsWmUucHJvdG90eXBlLm5lZ2F0ZT1aZS5wcm90b3R5cGUubmVnLFplLnByb3RvdHlwZS50ZW5zb3JQcm9kdWN0PVplLnByb3RvdHlwZS5rcm9uZWNrZXJQcm9kdWN0O2xldCBlcj1jbGFzcyB0IGV4dGVuZHMgWmV7ZGF0YTsjdCh0LGUpe2lmKHRoaXMuZGF0YT1bXSwhKE51bWJlci5pc0ludGVnZXIoZSkmJmU+PTApKXRocm93IG5ldyBUeXBlRXJyb3IoIm5Db2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7Zm9yKGxldCByPTA7cjx0O3IrKyl0aGlzLmRhdGEucHVzaChuZXcgRmxvYXQ2NEFycmF5KGUpKTt0aGlzLnJvd3M9dCx0aGlzLmNvbHVtbnM9ZX1jb25zdHJ1Y3RvcihlLHIpe2lmKHN1cGVyKCksdC5pc01hdHJpeChlKSl0aGlzLiN0KGUucm93cyxlLmNvbHVtbnMpLHQuY29weShlLHRoaXMpO2Vsc2UgaWYoTnVtYmVyLmlzSW50ZWdlcihlKSYmZT49MCl0aGlzLiN0KGUscik7ZWxzZXtpZighVmUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvciBhbiBhcnJheSIpO3tjb25zdCB0PWU7aWYoIm51bWJlciIhPXR5cGVvZihyPShlPXQubGVuZ3RoKT90WzBdLmxlbmd0aDowKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJEYXRhIG11c3QgYmUgYSAyRCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50Iik7dGhpcy5kYXRhPVtdO2ZvcihsZXQgcz0wO3M8ZTtzKyspe2lmKHRbc10ubGVuZ3RoIT09cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5jb25zaXN0ZW50IGFycmF5IGRpbWVuc2lvbnMiKTtpZighdFtzXS5ldmVyeSgodD0+Im51bWJlciI9PXR5cGVvZiB0KSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW5wdXQgZGF0YSBjb250YWlucyBub24tbnVtZXJpYyB2YWx1ZXMiKTt0aGlzLmRhdGEucHVzaChGbG9hdDY0QXJyYXkuZnJvbSh0W3NdKSl9dGhpcy5yb3dzPWUsdGhpcy5jb2x1bW5zPXJ9fX1zZXQodCxlLHIpe3JldHVybiB0aGlzLmRhdGFbdF1bZV09cix0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLmRhdGFbdF1bZV19cmVtb3ZlUm93KHQpe3JldHVybiBVZSh0aGlzLHQpLHRoaXMuZGF0YS5zcGxpY2UodCwxKSx0aGlzLnJvd3MtPTEsdGhpc31hZGRSb3codCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMucm93cyksVWUodGhpcyx0LCEwKSxlPUZsb2F0NjRBcnJheS5mcm9tKEJlKHRoaXMsZSkpLHRoaXMuZGF0YS5zcGxpY2UodCwwLGUpLHRoaXMucm93cys9MSx0aGlzfXJlbW92ZUNvbHVtbih0KXtHZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7Y29uc3Qgcj1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucy0xKTtmb3IobGV0IHM9MDtzPHQ7cysrKXJbc109dGhpcy5kYXRhW2VdW3NdO2ZvcihsZXQgcz10KzE7czx0aGlzLmNvbHVtbnM7cysrKXJbcy0xXT10aGlzLmRhdGFbZV1bc107dGhpcy5kYXRhW2VdPXJ9cmV0dXJuIHRoaXMuY29sdW1ucy09MSx0aGlzfWFkZENvbHVtbih0LGUpe3ZvaWQgMD09PWUmJihlPXQsdD10aGlzLmNvbHVtbnMpLEdlKHRoaXMsdCwhMCksZT1XZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl7Y29uc3Qgcz1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucysxKTtsZXQgbj0wO2Zvcig7bjx0O24rKylzW25dPXRoaXMuZGF0YVtyXVtuXTtmb3Ioc1tuKytdPWVbcl07bjx0aGlzLmNvbHVtbnMrMTtuKyspc1tuXT10aGlzLmRhdGFbcl1bbi0xXTt0aGlzLmRhdGFbcl09c31yZXR1cm4gdGhpcy5jb2x1bW5zKz0xLHRoaXN9fTshZnVuY3Rpb24odCxlKXt0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuYWRkUyh0KTp0aGlzLmFkZE0odCl9LHQucHJvdG90eXBlLmFkZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuYWRkTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuYWRkPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmFkZChyKX0sdC5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnN1YlModCk6dGhpcy5zdWJNKHQpfSx0LnByb3RvdHlwZS5zdWJTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnN1Yk09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnN1Yj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5zdWIocil9LHQucHJvdG90eXBlLnN1YnRyYWN0PXQucHJvdG90eXBlLnN1Yix0LnByb3RvdHlwZS5zdWJ0cmFjdFM9dC5wcm90b3R5cGUuc3ViUyx0LnByb3RvdHlwZS5zdWJ0cmFjdE09dC5wcm90b3R5cGUuc3ViTSx0LnN1YnRyYWN0PXQuc3ViLHQucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5tdWxTKHQpOnRoaXMubXVsTSh0KX0sdC5wcm90b3R5cGUubXVsUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5tdWxNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5tdWw9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubXVsKHIpfSx0LnByb3RvdHlwZS5tdWx0aXBseT10LnByb3RvdHlwZS5tdWwsdC5wcm90b3R5cGUubXVsdGlwbHlTPXQucHJvdG90eXBlLm11bFMsdC5wcm90b3R5cGUubXVsdGlwbHlNPXQucHJvdG90eXBlLm11bE0sdC5tdWx0aXBseT10Lm11bCx0LnByb3RvdHlwZS5kaXY9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuZGl2Uyh0KTp0aGlzLmRpdk0odCl9LHQucHJvdG90eXBlLmRpdlM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZGl2TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuZGl2PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmRpdihyKX0sdC5wcm90b3R5cGUuZGl2aWRlPXQucHJvdG90eXBlLmRpdix0LnByb3RvdHlwZS5kaXZpZGVTPXQucHJvdG90eXBlLmRpdlMsdC5wcm90b3R5cGUuZGl2aWRlTT10LnByb3RvdHlwZS5kaXZNLHQuZGl2aWRlPXQuZGl2LHQucHJvdG90eXBlLm1vZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5tb2RTKHQpOnRoaXMubW9kTSh0KX0sdC5wcm90b3R5cGUubW9kUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJXQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5tb2RNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSV0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5tb2Q9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubW9kKHIpfSx0LnByb3RvdHlwZS5tb2R1bHVzPXQucHJvdG90eXBlLm1vZCx0LnByb3RvdHlwZS5tb2R1bHVzUz10LnByb3RvdHlwZS5tb2RTLHQucHJvdG90eXBlLm1vZHVsdXNNPXQucHJvdG90eXBlLm1vZE0sdC5tb2R1bHVzPXQubW9kLHQucHJvdG90eXBlLmFuZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5hbmRTKHQpOnRoaXMuYW5kTSh0KX0sdC5wcm90b3R5cGUuYW5kUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hbmRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSZ0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5hbmQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuYW5kKHIpfSx0LnByb3RvdHlwZS5vcj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5vclModCk6dGhpcy5vck0odCl9LHQucHJvdG90eXBlLm9yUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpfHQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5vck09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpfHQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm9yPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm9yKHIpfSx0LnByb3RvdHlwZS54b3I9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMueG9yUyh0KTp0aGlzLnhvck0odCl9LHQucHJvdG90eXBlLnhvclM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKV50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUueG9yTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciledC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQueG9yPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnhvcihyKX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmxlZnRTaGlmdFModCk6dGhpcy5sZWZ0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik8PHQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKTw8dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubGVmdFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmxlZnRTaGlmdChyKX0sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uyh0KTp0aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQocil9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMucmlnaHRTaGlmdFModCk6dGhpcy5yaWdodFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUucmlnaHRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+PnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+Pj50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnJpZ2h0U2hpZnQocil9LHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdD10LnByb3RvdHlwZS5yaWdodFNoaWZ0LHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdFM9dC5wcm90b3R5cGUucmlnaHRTaGlmdFMsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0TT10LnByb3RvdHlwZS5yaWdodFNoaWZ0TSx0Lnplcm9GaWxsUmlnaHRTaGlmdD10LnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUubm90PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsfnRoaXMuZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0Lm5vdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubm90KCl9LHQucHJvdG90eXBlLmFicz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWJzKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hYnM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFicygpfSx0LnByb3RvdHlwZS5hY29zPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hY29zKCl9LHQucHJvdG90eXBlLmFjb3NoPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hY29zaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWNvc2g9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFjb3NoKCl9LHQucHJvdG90eXBlLmFzaW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFzaW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFzaW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFzaW4oKX0sdC5wcm90b3R5cGUuYXNpbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFzaW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXNpbmgoKX0sdC5wcm90b3R5cGUuYXRhbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXRhbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXRhbigpfSx0LnByb3RvdHlwZS5hdGFuaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXRhbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hdGFuaCgpfSx0LnByb3RvdHlwZS5jYnJ0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jYnJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jYnJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jYnJ0KCl9LHQucHJvdG90eXBlLmNlaWw9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNlaWwodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNlaWw9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNlaWwoKX0sdC5wcm90b3R5cGUuY2x6MzI9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNsejMyKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jbHozMj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2x6MzIoKX0sdC5wcm90b3R5cGUuY29zPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNvcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY29zKCl9LHQucHJvdG90eXBlLmNvc2g9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNvc2g9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNvc2goKX0sdC5wcm90b3R5cGUuZXhwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5leHAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmV4cD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZXhwKCl9LHQucHJvdG90eXBlLmV4cG0xPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5leHBtMSh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwbTE9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmV4cG0xKCl9LHQucHJvdG90eXBlLmZsb29yPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mbG9vcih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZmxvb3I9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmZsb29yKCl9LHQucHJvdG90eXBlLmZyb3VuZD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5mcm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmZyb3VuZCgpfSx0LnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2coKX0sdC5wcm90b3R5cGUubG9nMXA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzFwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cxcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMXAoKX0sdC5wcm90b3R5cGUubG9nMTA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzEwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cxMD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMTAoKX0sdC5wcm90b3R5cGUubG9nMj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMigpfSx0LnByb3RvdHlwZS5yb3VuZD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgucm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5yb3VuZCgpfSx0LnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaWduKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaWduPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaWduKCl9LHQucHJvdG90eXBlLnNpbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpbigpfSx0LnByb3RvdHlwZS5zaW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaW5oKCl9LHQucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNxcnQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNxcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNxcnQoKX0sdC5wcm90b3R5cGUudGFuPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRhbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudGFuKCl9LHQucHJvdG90eXBlLnRhbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRhbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRhbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRhbmgoKX0sdC5wcm90b3R5cGUudHJ1bmM9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRydW5jKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50cnVuYz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudHJ1bmMoKX0sdC5wb3c9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkucG93KHIpfSx0LnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMucG93Uyh0KTp0aGlzLnBvd00odCl9LHQucHJvdG90eXBlLnBvd1M9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSoqdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnBvd009ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKip0LmdldChlLHIpKTtyZXR1cm4gdGhpc319KFplLGVyKTtjbGFzcyByciBleHRlbmRzIFpleyNlO2dldCBzaXplKCl7cmV0dXJuIHRoaXMuI2Uuc2l6ZX1nZXQgcm93cygpe3JldHVybiB0aGlzLiNlLnJvd3N9Z2V0IGNvbHVtbnMoKXtyZXR1cm4gdGhpcy4jZS5jb2x1bW5zfWdldCBkaWFnb25hbFNpemUoKXtyZXR1cm4gdGhpcy5yb3dzfXN0YXRpYyBpc1N5bW1ldHJpY01hdHJpeCh0KXtyZXR1cm4gZXIuaXNNYXRyaXgodCkmJiJTeW1tZXRyaWNNYXRyaXgiPT09dC5rbGFzc1R5cGV9c3RhdGljIHplcm9zKHQpe3JldHVybiBuZXcgdGhpcyh0KX1zdGF0aWMgb25lcyh0KXtyZXR1cm4gbmV3IHRoaXModCkuZmlsbCgxKX1jb25zdHJ1Y3Rvcih0KXtpZihzdXBlcigpLGVyLmlzTWF0cml4KHQpKXtpZighdC5pc1N5bW1ldHJpYygpKXRocm93IG5ldyBUeXBlRXJyb3IoIm5vdCBzeW1tZXRyaWMgZGF0YSIpO3RoaXMuI2U9ZXIuY29weSh0LG5ldyBlcih0LnJvd3MsdC5yb3dzKSl9ZWxzZSBpZihOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0Pj0wKXRoaXMuI2U9bmV3IGVyKHQsdCk7ZWxzZSBpZih0aGlzLiNlPW5ldyBlcih0KSwhdGhpcy5pc1N5bW1ldHJpYygpKXRocm93IG5ldyBUeXBlRXJyb3IoIm5vdCBzeW1tZXRyaWMgZGF0YSIpfWNsb25lKCl7Y29uc3QgdD1uZXcgcnIodGhpcy5kaWFnb25hbFNpemUpO2Zvcihjb25zdFtlLHIsc11vZiB0aGlzLnVwcGVyUmlnaHRFbnRyaWVzKCkpdC5zZXQoZSxyLHMpO3JldHVybiB0fXRvTWF0cml4KCl7cmV0dXJuIG5ldyBlcih0aGlzKX1nZXQodCxlKXtyZXR1cm4gdGhpcy4jZS5nZXQodCxlKX1zZXQodCxlLHIpe3JldHVybiB0aGlzLiNlLnNldCh0LGUsciksdGhpcy4jZS5zZXQoZSx0LHIpLHRoaXN9cmVtb3ZlQ3Jvc3ModCl7cmV0dXJuIHRoaXMuI2UucmVtb3ZlUm93KHQpLHRoaXMuI2UucmVtb3ZlQ29sdW1uKHQpLHRoaXN9YWRkQ3Jvc3ModCxlKXt2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5kaWFnb25hbFNpemUpO2NvbnN0IHI9ZS5zbGljZSgpO3JldHVybiByLnNwbGljZSh0LDEpLHRoaXMuI2UuYWRkUm93KHQsciksdGhpcy4jZS5hZGRDb2x1bW4odCxlKSx0aGlzfWFwcGx5TWFzayh0KXtpZih0Lmxlbmd0aCE9PXRoaXMuZGlhZ29uYWxTaXplKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXNrIHNpemUgZG8gbm90IG1hdGNoIHdpdGggbWF0cml4IHNpemUiKTtjb25zdCBlPVtdO2Zvcihjb25zdFtyLHNdb2YgdC5lbnRyaWVzKCkpc3x8ZS5wdXNoKHIpO2UucmV2ZXJzZSgpO2Zvcihjb25zdCB0IG9mIGUpdGhpcy5yZW1vdmVDcm9zcyh0KTtyZXR1cm4gdGhpc310b0NvbXBhY3QoKXtjb25zdHtkaWFnb25hbFNpemU6dH09dGhpcyxlPW5ldyBBcnJheSh0Kih0KzEpLzIpO2ZvcihsZXQgcj0wLHM9MCxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT10aGlzLmdldChzLHIpLCsrcj49dCYmKHI9KytzKTtyZXR1cm4gZX1zdGF0aWMgZnJvbUNvbXBhY3QodCl7Y29uc3QgZT10Lmxlbmd0aCxyPShNYXRoLnNxcnQoOCplKzEpLTEpLzI7aWYoIU51bWJlci5pc0ludGVnZXIocikpdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhpcyBhcnJheSBpcyBub3QgYSBjb21wYWN0IHJlcHJlc2VudGF0aW9uIG9mIGEgU3ltbWV0cmljIE1hdHJpeCwgJHtKU09OLnN0cmluZ2lmeSh0KX1gKTtjb25zdCBzPW5ldyBycihyKTtmb3IobGV0IG49MCxvPTAsaT0wO2k8ZTtpKyspcy5zZXQobixvLHRbaV0pLCsrbj49ciYmKG49KytvKTtyZXR1cm4gc30qdXBwZXJSaWdodEVudHJpZXMoKXtmb3IobGV0IHQ9MCxlPTA7dDx0aGlzLmRpYWdvbmFsU2l6ZTt2b2lkIDApe2NvbnN0IHI9dGhpcy5nZXQodCxlKTt5aWVsZFt0LGUscl0sKytlPj10aGlzLmRpYWdvbmFsU2l6ZSYmKGU9Kyt0KX19KnVwcGVyUmlnaHRWYWx1ZXMoKXtmb3IobGV0IHQ9MCxlPTA7dDx0aGlzLmRpYWdvbmFsU2l6ZTt2b2lkIDApe2NvbnN0IHI9dGhpcy5nZXQodCxlKTt5aWVsZCByLCsrZT49dGhpcy5kaWFnb25hbFNpemUmJihlPSsrdCl9fX1yci5wcm90b3R5cGUua2xhc3NUeXBlPSJTeW1tZXRyaWNNYXRyaXgiO2NsYXNzIHNyIGV4dGVuZHMgcnJ7c3RhdGljIGlzRGlzdGFuY2VNYXRyaXgodCl7cmV0dXJuIHJyLmlzU3ltbWV0cmljTWF0cml4KHQpJiYiRGlzdGFuY2VNYXRyaXgiPT09dC5rbGFzc1N1YlR5cGV9Y29uc3RydWN0b3IodCl7aWYoc3VwZXIodCksIXRoaXMuaXNEaXN0YW5jZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb3ZpZGVkIGFyZ3VtZW50cyBkbyBubyBwcm9kdWNlIGEgZGlzdGFuY2UgbWF0cml4Iil9c2V0KHQsZSxyKXtyZXR1cm4gdD09PWUmJihyPTApLHN1cGVyLnNldCh0LGUscil9YWRkQ3Jvc3ModCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMuZGlhZ29uYWxTaXplKSwoZT1lLnNsaWNlKCkpW3RdPTAsc3VwZXIuYWRkQ3Jvc3ModCxlKX10b1N5bW1ldHJpY01hdHJpeCgpe3JldHVybiBuZXcgcnIodGhpcyl9Y2xvbmUoKXtjb25zdCB0PW5ldyBzcih0aGlzLmRpYWdvbmFsU2l6ZSk7Zm9yKGNvbnN0W2UscixzXW9mIHRoaXMudXBwZXJSaWdodEVudHJpZXMoKSllIT09ciYmdC5zZXQoZSxyLHMpO3JldHVybiB0fXRvQ29tcGFjdCgpe2NvbnN0e2RpYWdvbmFsU2l6ZTp0fT10aGlzLGU9bmV3IEFycmF5KCh0LTEpKnQvMik7Zm9yKGxldCByPTEscz0wLG49MDtuPGUubGVuZ3RoO24rKyllW25dPXRoaXMuZ2V0KHMsciksKytyPj10JiYocj0xKyArK3MpO3JldHVybiBlfXN0YXRpYyBmcm9tQ29tcGFjdCh0KXtjb25zdCBlPXQubGVuZ3RoO2lmKDA9PT1lKXJldHVybiBuZXcgdGhpcygwKTtjb25zdCByPShNYXRoLnNxcnQoOCplKzEpKzEpLzI7aWYoIU51bWJlci5pc0ludGVnZXIocikpdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhpcyBhcnJheSBpcyBub3QgYSBjb21wYWN0IHJlcHJlc2VudGF0aW9uIG9mIGEgRGlzdGFuY2VNYXRyaXgsICR7SlNPTi5zdHJpbmdpZnkodCl9YCk7Y29uc3Qgcz1uZXcgdGhpcyhyKTtmb3IobGV0IG49MSxvPTAsaT0wO2k8ZTtpKyspcy5zZXQobixvLHRbaV0pLCsrbj49ciYmKG49MSsgKytvKTtyZXR1cm4gc319c3IucHJvdG90eXBlLmtsYXNzU3ViVHlwZT0iRGlzdGFuY2VNYXRyaXgiO2NsYXNzIG5yIGV4dGVuZHMgWmV7Y29uc3RydWN0b3IodCxlLHIpe3N1cGVyKCksdGhpcy5tYXRyaXg9dCx0aGlzLnJvd3M9ZSx0aGlzLmNvbHVtbnM9cn19Y2xhc3Mgb3IgZXh0ZW5kcyBucntjb25zdHJ1Y3Rvcih0LGUscil7S2UodCxlKSxRZSh0LHIpLHN1cGVyKHQsZS5sZW5ndGgsci5sZW5ndGgpLHRoaXMucm93SW5kaWNlcz1lLHRoaXMuY29sdW1uSW5kaWNlcz1yfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldCh0aGlzLnJvd0luZGljZXNbdF0sdGhpcy5jb2x1bW5JbmRpY2VzW2VdLHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0aGlzLnJvd0luZGljZXNbdF0sdGhpcy5jb2x1bW5JbmRpY2VzW2VdKX19Y2xhc3MgaXIgZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcih0LGU9e30pe2NvbnN0e3Jvd3M6cj0xfT1lO2lmKHQubGVuZ3RoJXIhPTApdGhyb3cgbmV3IEVycm9yKCJ0aGUgZGF0YSBsZW5ndGggaXMgbm90IGRpdmlzaWJsZSBieSB0aGUgbnVtYmVyIG9mIHJvd3MiKTtzdXBlcigpLHRoaXMucm93cz1yLHRoaXMuY29sdW1ucz10Lmxlbmd0aC9yLHRoaXMuZGF0YT10fXNldCh0LGUscil7bGV0IHM9dGhpcy5fY2FsY3VsYXRlSW5kZXgodCxlKTtyZXR1cm4gdGhpcy5kYXRhW3NdPXIsdGhpc31nZXQodCxlKXtsZXQgcj10aGlzLl9jYWxjdWxhdGVJbmRleCh0LGUpO3JldHVybiB0aGlzLmRhdGFbcl19X2NhbGN1bGF0ZUluZGV4KHQsZSl7cmV0dXJuIHQqdGhpcy5jb2x1bW5zK2V9fWNsYXNzIHVyIGV4dGVuZHMgWmV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmRhdGE9dCx0aGlzLnJvd3M9dC5sZW5ndGgsdGhpcy5jb2x1bW5zPXRbMF0ubGVuZ3RofXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX19Y2xhc3MgYXJ7Y29uc3RydWN0b3IodCl7bGV0IGUscixzLG4sbyxpLHUsYSxsLGg9KHQ9dXIuY2hlY2tNYXRyaXgodCkpLmNsb25lKCksYz1oLnJvd3MsZj1oLmNvbHVtbnMsbT1uZXcgRmxvYXQ2NEFycmF5KGMpLGc9MTtmb3IoZT0wO2U8YztlKyspbVtlXT1lO2ZvcihhPW5ldyBGbG9hdDY0QXJyYXkoYykscj0wO3I8ZjtyKyspe2ZvcihlPTA7ZTxjO2UrKylhW2VdPWguZ2V0KGUscik7Zm9yKGU9MDtlPGM7ZSsrKXtmb3IobD1NYXRoLm1pbihlLHIpLG89MCxzPTA7czxsO3MrKylvKz1oLmdldChlLHMpKmFbc107YVtlXS09byxoLnNldChlLHIsYVtlXSl9Zm9yKG49cixlPXIrMTtlPGM7ZSsrKU1hdGguYWJzKGFbZV0pPk1hdGguYWJzKGFbbl0pJiYobj1lKTtpZihuIT09cil7Zm9yKHM9MDtzPGY7cysrKWk9aC5nZXQobixzKSxoLnNldChuLHMsaC5nZXQocixzKSksaC5zZXQocixzLGkpO3U9bVtuXSxtW25dPW1bcl0sbVtyXT11LGc9LWd9aWYocjxjJiYwIT09aC5nZXQocixyKSlmb3IoZT1yKzE7ZTxjO2UrKyloLnNldChlLHIsaC5nZXQoZSxyKS9oLmdldChyLHIpKX10aGlzLkxVPWgsdGhpcy5waXZvdFZlY3Rvcj1tLHRoaXMucGl2b3RTaWduPWd9aXNTaW5ndWxhcigpe2xldCB0PXRoaXMuTFUsZT10LmNvbHVtbnM7Zm9yKGxldCByPTA7cjxlO3IrKylpZigwPT09dC5nZXQocixyKSlyZXR1cm4hMDtyZXR1cm4hMX1zb2x2ZSh0KXt0PWVyLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuTFU7aWYoZS5yb3dzIT09dC5yb3dzKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtYXRyaXggZGltZW5zaW9ucyIpO2lmKHRoaXMuaXNTaW5ndWxhcigpKXRocm93IG5ldyBFcnJvcigiTFUgbWF0cml4IGlzIHNpbmd1bGFyIik7bGV0IHIscyxuLG89dC5jb2x1bW5zLGk9dC5zdWJNYXRyaXhSb3codGhpcy5waXZvdFZlY3RvciwwLG8tMSksdT1lLmNvbHVtbnM7Zm9yKG49MDtuPHU7bisrKWZvcihyPW4rMTtyPHU7cisrKWZvcihzPTA7czxvO3MrKylpLnNldChyLHMsaS5nZXQocixzKS1pLmdldChuLHMpKmUuZ2V0KHIsbikpO2ZvcihuPXUtMTtuPj0wO24tLSl7Zm9yKHM9MDtzPG87cysrKWkuc2V0KG4scyxpLmdldChuLHMpL2UuZ2V0KG4sbikpO2ZvcihyPTA7cjxuO3IrKylmb3Iocz0wO3M8bztzKyspaS5zZXQocixzLGkuZ2V0KHIscyktaS5nZXQobixzKSplLmdldChyLG4pKX1yZXR1cm4gaX1nZXQgZGV0ZXJtaW5hbnQoKXtsZXQgdD10aGlzLkxVO2lmKCF0LmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBzcXVhcmUiKTtsZXQgZT10aGlzLnBpdm90U2lnbixyPXQuY29sdW1ucztmb3IobGV0IHM9MDtzPHI7cysrKWUqPXQuZ2V0KHMscyk7cmV0dXJuIGV9Z2V0IGxvd2VyVHJpYW5ndWxhck1hdHJpeCgpe2xldCB0PXRoaXMuTFUsZT10LnJvd3Mscj10LmNvbHVtbnMscz1uZXcgZXIoZSxyKTtmb3IobGV0IG49MDtuPGU7bisrKWZvcihsZXQgZT0wO2U8cjtlKyspbj5lP3Muc2V0KG4sZSx0LmdldChuLGUpKTpuPT09ZT9zLnNldChuLGUsMSk6cy5zZXQobixlLDApO3JldHVybiBzfWdldCB1cHBlclRyaWFuZ3VsYXJNYXRyaXgoKXtsZXQgdD10aGlzLkxVLGU9dC5yb3dzLHI9dC5jb2x1bW5zLHM9bmV3IGVyKGUscik7Zm9yKGxldCBuPTA7bjxlO24rKylmb3IobGV0IGU9MDtlPHI7ZSsrKW48PWU/cy5zZXQobixlLHQuZ2V0KG4sZSkpOnMuc2V0KG4sZSwwKTtyZXR1cm4gc31nZXQgcGl2b3RQZXJtdXRhdGlvblZlY3Rvcigpe3JldHVybiBBcnJheS5mcm9tKHRoaXMucGl2b3RWZWN0b3IpfX1mdW5jdGlvbiBscih0LGUpe2xldCByPTA7cmV0dXJuIE1hdGguYWJzKHQpPk1hdGguYWJzKGUpPyhyPWUvdCxNYXRoLmFicyh0KSpNYXRoLnNxcnQoMStyKnIpKTowIT09ZT8ocj10L2UsTWF0aC5hYnMoZSkqTWF0aC5zcXJ0KDErcipyKSk6MH1jbGFzcyBocntjb25zdHJ1Y3Rvcih0KXtsZXQgZSxyLHMsbixvPSh0PXVyLmNoZWNrTWF0cml4KHQpKS5jbG9uZSgpLGk9dC5yb3dzLHU9dC5jb2x1bW5zLGE9bmV3IEZsb2F0NjRBcnJheSh1KTtmb3Iocz0wO3M8dTtzKyspe2xldCB0PTA7Zm9yKGU9cztlPGk7ZSsrKXQ9bHIodCxvLmdldChlLHMpKTtpZigwIT09dCl7Zm9yKG8uZ2V0KHMscyk8MCYmKHQ9LXQpLGU9cztlPGk7ZSsrKW8uc2V0KGUscyxvLmdldChlLHMpL3QpO2ZvcihvLnNldChzLHMsby5nZXQocyxzKSsxKSxyPXMrMTtyPHU7cisrKXtmb3Iobj0wLGU9cztlPGk7ZSsrKW4rPW8uZ2V0KGUscykqby5nZXQoZSxyKTtmb3Iobj0tbi9vLmdldChzLHMpLGU9cztlPGk7ZSsrKW8uc2V0KGUscixvLmdldChlLHIpK24qby5nZXQoZSxzKSl9fWFbc109LXR9dGhpcy5RUj1vLHRoaXMuUmRpYWc9YX1zb2x2ZSh0KXt0PWVyLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuUVIscj1lLnJvd3M7aWYodC5yb3dzIT09cil0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCByb3cgZGltZW5zaW9ucyBtdXN0IGFncmVlIik7aWYoIXRoaXMuaXNGdWxsUmFuaygpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGlzIHJhbmsgZGVmaWNpZW50Iik7bGV0IHMsbixvLGksdT10LmNvbHVtbnMsYT10LmNsb25lKCksbD1lLmNvbHVtbnM7Zm9yKG89MDtvPGw7bysrKWZvcihuPTA7bjx1O24rKyl7Zm9yKGk9MCxzPW87czxyO3MrKylpKz1lLmdldChzLG8pKmEuZ2V0KHMsbik7Zm9yKGk9LWkvZS5nZXQobyxvKSxzPW87czxyO3MrKylhLnNldChzLG4sYS5nZXQocyxuKStpKmUuZ2V0KHMsbykpfWZvcihvPWwtMTtvPj0wO28tLSl7Zm9yKG49MDtuPHU7bisrKWEuc2V0KG8sbixhLmdldChvLG4pL3RoaXMuUmRpYWdbb10pO2ZvcihzPTA7czxvO3MrKylmb3Iobj0wO248dTtuKyspYS5zZXQocyxuLGEuZ2V0KHMsbiktYS5nZXQobyxuKSplLmdldChzLG8pKX1yZXR1cm4gYS5zdWJNYXRyaXgoMCxsLTEsMCx1LTEpfWlzRnVsbFJhbmsoKXtsZXQgdD10aGlzLlFSLmNvbHVtbnM7Zm9yKGxldCBlPTA7ZTx0O2UrKylpZigwPT09dGhpcy5SZGlhZ1tlXSlyZXR1cm4hMTtyZXR1cm4hMH1nZXQgdXBwZXJUcmlhbmd1bGFyTWF0cml4KCl7bGV0IHQsZSxyPXRoaXMuUVIscz1yLmNvbHVtbnMsbj1uZXcgZXIocyxzKTtmb3IodD0wO3Q8czt0KyspZm9yKGU9MDtlPHM7ZSsrKXQ8ZT9uLnNldCh0LGUsci5nZXQodCxlKSk6dD09PWU/bi5zZXQodCxlLHRoaXMuUmRpYWdbdF0pOm4uc2V0KHQsZSwwKTtyZXR1cm4gbn1nZXQgb3J0aG9nb25hbE1hdHJpeCgpe2xldCB0LGUscixzLG49dGhpcy5RUixvPW4ucm93cyxpPW4uY29sdW1ucyx1PW5ldyBlcihvLGkpO2ZvcihyPWktMTtyPj0wO3ItLSl7Zm9yKHQ9MDt0PG87dCsrKXUuc2V0KHQsciwwKTtmb3IodS5zZXQocixyLDEpLGU9cjtlPGk7ZSsrKWlmKDAhPT1uLmdldChyLHIpKXtmb3Iocz0wLHQ9cjt0PG87dCsrKXMrPW4uZ2V0KHQscikqdS5nZXQodCxlKTtmb3Iocz0tcy9uLmdldChyLHIpLHQ9cjt0PG87dCsrKXUuc2V0KHQsZSx1LmdldCh0LGUpK3Mqbi5nZXQodCxyKSl9fXJldHVybiB1fX1jbGFzcyBjcntjb25zdHJ1Y3Rvcih0LGU9e30pe2lmKCh0PXVyLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgcj10LnJvd3Mscz10LmNvbHVtbnM7Y29uc3R7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6bj0hMCxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6bz0hMCxhdXRvVHJhbnNwb3NlOmk9ITF9PWU7bGV0IHUsYT1Cb29sZWFuKG4pLGw9Qm9vbGVhbihvKSxoPSExO2lmKHI8cylpZihpKXt1PXQudHJhbnNwb3NlKCkscj11LnJvd3Mscz11LmNvbHVtbnMsaD0hMDtsZXQgZT1hO2E9bCxsPWV9ZWxzZSB1PXQuY2xvbmUoKSxjb25zb2xlLndhcm4oIkNvbXB1dGluZyBTVkQgb24gYSBtYXRyaXggd2l0aCBtb3JlIGNvbHVtbnMgdGhhbiByb3dzLiBDb25zaWRlciBlbmFibGluZyBhdXRvVHJhbnNwb3NlIik7ZWxzZSB1PXQuY2xvbmUoKTtsZXQgYz1NYXRoLm1pbihyLHMpLGY9TWF0aC5taW4ocisxLHMpLG09bmV3IEZsb2F0NjRBcnJheShmKSxnPW5ldyBlcihyLGMpLHc9bmV3IGVyKHMscykscD1uZXcgRmxvYXQ2NEFycmF5KHMpLGQ9bmV3IEZsb2F0NjRBcnJheShyKSx5PW5ldyBGbG9hdDY0QXJyYXkoZik7Zm9yKGxldCB0PTA7dDxmO3QrKyl5W3RdPXQ7bGV0IGI9TWF0aC5taW4oci0xLHMpLE09TWF0aC5tYXgoMCxNYXRoLm1pbihzLTIscikpLHY9TWF0aC5tYXgoYixNKTtmb3IobGV0IHQ9MDt0PHY7dCsrKXtpZih0PGIpe21bdF09MDtmb3IobGV0IGU9dDtlPHI7ZSsrKW1bdF09bHIobVt0XSx1LmdldChlLHQpKTtpZigwIT09bVt0XSl7dS5nZXQodCx0KTwwJiYobVt0XT0tbVt0XSk7Zm9yKGxldCBlPXQ7ZTxyO2UrKyl1LnNldChlLHQsdS5nZXQoZSx0KS9tW3RdKTt1LnNldCh0LHQsdS5nZXQodCx0KSsxKX1tW3RdPS1tW3RdfWZvcihsZXQgZT10KzE7ZTxzO2UrKyl7aWYodDxiJiYwIT09bVt0XSl7bGV0IHM9MDtmb3IobGV0IG49dDtuPHI7bisrKXMrPXUuZ2V0KG4sdCkqdS5nZXQobixlKTtzPS1zL3UuZ2V0KHQsdCk7Zm9yKGxldCBuPXQ7bjxyO24rKyl1LnNldChuLGUsdS5nZXQobixlKStzKnUuZ2V0KG4sdCkpfXBbZV09dS5nZXQodCxlKX1pZihhJiZ0PGIpZm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsdS5nZXQoZSx0KSk7aWYodDxNKXtwW3RdPTA7Zm9yKGxldCBlPXQrMTtlPHM7ZSsrKXBbdF09bHIocFt0XSxwW2VdKTtpZigwIT09cFt0XSl7cFt0KzFdPDAmJihwW3RdPTAtcFt0XSk7Zm9yKGxldCBlPXQrMTtlPHM7ZSsrKXBbZV0vPXBbdF07cFt0KzFdKz0xfWlmKHBbdF09LXBbdF0sdCsxPHImJjAhPT1wW3RdKXtmb3IobGV0IGU9dCsxO2U8cjtlKyspZFtlXT0wO2ZvcihsZXQgZT10KzE7ZTxyO2UrKylmb3IobGV0IHI9dCsxO3I8cztyKyspZFtlXSs9cFtyXSp1LmdldChlLHIpO2ZvcihsZXQgZT10KzE7ZTxzO2UrKyl7bGV0IHM9LXBbZV0vcFt0KzFdO2ZvcihsZXQgbj10KzE7bjxyO24rKyl1LnNldChuLGUsdS5nZXQobixlKStzKmRbbl0pfX1pZihsKWZvcihsZXQgZT10KzE7ZTxzO2UrKyl3LnNldChlLHQscFtlXSl9fWxldCB4PU1hdGgubWluKHMscisxKTtpZihiPHMmJihtW2JdPXUuZ2V0KGIsYikpLHI8eCYmKG1beC0xXT0wKSxNKzE8eCYmKHBbTV09dS5nZXQoTSx4LTEpKSxwW3gtMV09MCxhKXtmb3IobGV0IHQ9Yjt0PGM7dCsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9Zm9yKGxldCB0PWItMTt0Pj0wO3QtLSlpZigwIT09bVt0XSl7Zm9yKGxldCBlPXQrMTtlPGM7ZSsrKXtsZXQgcz0wO2ZvcihsZXQgbj10O248cjtuKyspcys9Zy5nZXQobix0KSpnLmdldChuLGUpO3M9LXMvZy5nZXQodCx0KTtmb3IobGV0IG49dDtuPHI7bisrKWcuc2V0KG4sZSxnLmdldChuLGUpK3MqZy5nZXQobix0KSl9Zm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsLWcuZ2V0KGUsdCkpO2cuc2V0KHQsdCwxK2cuZ2V0KHQsdCkpO2ZvcihsZXQgZT0wO2U8dC0xO2UrKylnLnNldChlLHQsMCl9ZWxzZXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9fWlmKGwpZm9yKGxldCB0PXMtMTt0Pj0wO3QtLSl7aWYodDxNJiYwIT09cFt0XSlmb3IobGV0IGU9dCsxO2U8cztlKyspe2xldCByPTA7Zm9yKGxldCBuPXQrMTtuPHM7bisrKXIrPXcuZ2V0KG4sdCkqdy5nZXQobixlKTtyPS1yL3cuZ2V0KHQrMSx0KTtmb3IobGV0IG49dCsxO248cztuKyspdy5zZXQobixlLHcuZ2V0KG4sZSkrcip3LmdldChuLHQpKX1mb3IobGV0IGU9MDtlPHM7ZSsrKXcuc2V0KGUsdCwwKTt3LnNldCh0LHQsMSl9bGV0IEU9eC0xLFM9TnVtYmVyLkVQU0lMT047Zm9yKDt4PjA7KXtsZXQgdCxlO2Zvcih0PXgtMjt0Pj0tMSYmLTEhPT10O3QtLSl7Y29uc3QgZT1OdW1iZXIuTUlOX1ZBTFVFK1MqTWF0aC5hYnMobVt0XStNYXRoLmFicyhtW3QrMV0pKTtpZihNYXRoLmFicyhwW3RdKTw9ZXx8TnVtYmVyLmlzTmFOKHBbdF0pKXtwW3RdPTA7YnJlYWt9fWlmKHQ9PT14LTIpZT00O2Vsc2V7bGV0IHI7Zm9yKHI9eC0xO3I+PXQmJnIhPT10O3ItLSl7bGV0IGU9KHIhPT14P01hdGguYWJzKHBbcl0pOjApKyhyIT09dCsxP01hdGguYWJzKHBbci0xXSk6MCk7aWYoTWF0aC5hYnMobVtyXSk8PVMqZSl7bVtyXT0wO2JyZWFrfX1yPT09dD9lPTM6cj09PXgtMT9lPTE6KGU9Mix0PXIpfXN3aXRjaCh0KyssZSl7Y2FzZSAxOntsZXQgZT1wW3gtMl07cFt4LTJdPTA7Zm9yKGxldCByPXgtMjtyPj10O3ItLSl7bGV0IG49bHIobVtyXSxlKSxvPW1bcl0vbixpPWUvbjtpZihtW3JdPW4sciE9PXQmJihlPS1pKnBbci0xXSxwW3ItMV09bypwW3ItMV0pLGwpZm9yKGxldCB0PTA7dDxzO3QrKyluPW8qdy5nZXQodCxyKStpKncuZ2V0KHQseC0xKSx3LnNldCh0LHgtMSwtaSp3LmdldCh0LHIpK28qdy5nZXQodCx4LTEpKSx3LnNldCh0LHIsbil9YnJlYWt9Y2FzZSAyOntsZXQgZT1wW3QtMV07cFt0LTFdPTA7Zm9yKGxldCBzPXQ7czx4O3MrKyl7bGV0IG49bHIobVtzXSxlKSxvPW1bc10vbixpPWUvbjtpZihtW3NdPW4sZT0taSpwW3NdLHBbc109bypwW3NdLGEpZm9yKGxldCBlPTA7ZTxyO2UrKyluPW8qZy5nZXQoZSxzKStpKmcuZ2V0KGUsdC0xKSxnLnNldChlLHQtMSwtaSpnLmdldChlLHMpK28qZy5nZXQoZSx0LTEpKSxnLnNldChlLHMsbil9YnJlYWt9Y2FzZSAzOntjb25zdCBlPU1hdGgubWF4KE1hdGguYWJzKG1beC0xXSksTWF0aC5hYnMobVt4LTJdKSxNYXRoLmFicyhwW3gtMl0pLE1hdGguYWJzKG1bdF0pLE1hdGguYWJzKHBbdF0pKSxuPW1beC0xXS9lLG89bVt4LTJdL2UsaT1wW3gtMl0vZSx1PW1bdF0vZSxoPXBbdF0vZSxjPSgobytuKSooby1uKStpKmkpLzIsZj1uKmkqKG4qaSk7bGV0IGQ9MDswPT09YyYmMD09PWZ8fChkPWM8MD8wLU1hdGguc3FydChjKmMrZik6TWF0aC5zcXJ0KGMqYytmKSxkPWYvKGMrZCkpO2xldCB5PSh1K24pKih1LW4pK2QsYj11Kmg7Zm9yKGxldCBlPXQ7ZTx4LTE7ZSsrKXtsZXQgbj1scih5LGIpOzA9PT1uJiYobj1OdW1iZXIuTUlOX1ZBTFVFKTtsZXQgbz15L24saT1iL247aWYoZSE9PXQmJihwW2UtMV09bikseT1vKm1bZV0raSpwW2VdLHBbZV09bypwW2VdLWkqbVtlXSxiPWkqbVtlKzFdLG1bZSsxXT1vKm1bZSsxXSxsKWZvcihsZXQgdD0wO3Q8czt0Kyspbj1vKncuZ2V0KHQsZSkraSp3LmdldCh0LGUrMSksdy5zZXQodCxlKzEsLWkqdy5nZXQodCxlKStvKncuZ2V0KHQsZSsxKSksdy5zZXQodCxlLG4pO2lmKG49bHIoeSxiKSwwPT09biYmKG49TnVtYmVyLk1JTl9WQUxVRSksbz15L24saT1iL24sbVtlXT1uLHk9bypwW2VdK2kqbVtlKzFdLG1bZSsxXT0taSpwW2VdK28qbVtlKzFdLGI9aSpwW2UrMV0scFtlKzFdPW8qcFtlKzFdLGEmJmU8ci0xKWZvcihsZXQgdD0wO3Q8cjt0Kyspbj1vKmcuZ2V0KHQsZSkraSpnLmdldCh0LGUrMSksZy5zZXQodCxlKzEsLWkqZy5nZXQodCxlKStvKmcuZ2V0KHQsZSsxKSksZy5zZXQodCxlLG4pfXBbeC0yXT15O2JyZWFrfWNhc2UgNDppZihtW3RdPD0wJiYobVt0XT1tW3RdPDA/LW1bdF06MCxsKSlmb3IobGV0IGU9MDtlPD1FO2UrKyl3LnNldChlLHQsLXcuZ2V0KGUsdCkpO2Zvcig7dDxFJiYhKG1bdF0+PW1bdCsxXSk7KXtsZXQgZT1tW3RdO2lmKG1bdF09bVt0KzFdLG1bdCsxXT1lLGwmJnQ8cy0xKWZvcihsZXQgcj0wO3I8cztyKyspZT13LmdldChyLHQrMSksdy5zZXQocix0KzEsdy5nZXQocix0KSksdy5zZXQocix0LGUpO2lmKGEmJnQ8ci0xKWZvcihsZXQgcz0wO3M8cjtzKyspZT1nLmdldChzLHQrMSksZy5zZXQocyx0KzEsZy5nZXQocyx0KSksZy5zZXQocyx0LGUpO3QrK314LS19fWlmKGgpe2xldCB0PXc7dz1nLGc9dH10aGlzLm09cix0aGlzLm49cyx0aGlzLnM9bSx0aGlzLlU9Zyx0aGlzLlY9d31zb2x2ZSh0KXtsZXQgZT10LHI9dGhpcy50aHJlc2hvbGQscz10aGlzLnMubGVuZ3RoLG49ZXIuemVyb3MocyxzKTtmb3IobGV0IHQ9MDt0PHM7dCsrKU1hdGguYWJzKHRoaXMuc1t0XSk8PXI/bi5zZXQodCx0LDApOm4uc2V0KHQsdCwxL3RoaXMuc1t0XSk7bGV0IG89dGhpcy5VLGk9dGhpcy5yaWdodFNpbmd1bGFyVmVjdG9ycyx1PWkubW11bChuKSxhPWkucm93cyxsPW8ucm93cyxoPWVyLnplcm9zKGEsbCk7Zm9yKGxldCB0PTA7dDxhO3QrKylmb3IobGV0IGU9MDtlPGw7ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248cztuKyspcis9dS5nZXQodCxuKSpvLmdldChlLG4pO2guc2V0KHQsZSxyKX1yZXR1cm4gaC5tbXVsKGUpfXNvbHZlRm9yRGlhZ29uYWwodCl7cmV0dXJuIHRoaXMuc29sdmUoZXIuZGlhZyh0KSl9aW52ZXJzZSgpe2xldCB0PXRoaXMuVixlPXRoaXMudGhyZXNob2xkLHI9dC5yb3dzLHM9dC5jb2x1bW5zLG49bmV3IGVyKHIsdGhpcy5zLmxlbmd0aCk7Zm9yKGxldCBvPTA7bzxyO28rKylmb3IobGV0IHI9MDtyPHM7cisrKU1hdGguYWJzKHRoaXMuc1tyXSk+ZSYmbi5zZXQobyxyLHQuZ2V0KG8scikvdGhpcy5zW3JdKTtsZXQgbz10aGlzLlUsaT1vLnJvd3MsdT1vLmNvbHVtbnMsYT1uZXcgZXIocixpKTtmb3IobGV0IHQ9MDt0PHI7dCsrKWZvcihsZXQgZT0wO2U8aTtlKyspe2xldCByPTA7Zm9yKGxldCBzPTA7czx1O3MrKylyKz1uLmdldCh0LHMpKm8uZ2V0KGUscyk7YS5zZXQodCxlLHIpfXJldHVybiBhfWdldCBjb25kaXRpb24oKXtyZXR1cm4gdGhpcy5zWzBdL3RoaXMuc1tNYXRoLm1pbih0aGlzLm0sdGhpcy5uKS0xXX1nZXQgbm9ybTIoKXtyZXR1cm4gdGhpcy5zWzBdfWdldCByYW5rKCl7bGV0IHQ9TWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdKk51bWJlci5FUFNJTE9OLGU9MCxyPXRoaXMucztmb3IobGV0IHM9MCxuPXIubGVuZ3RoO3M8bjtzKyspcltzXT50JiZlKys7cmV0dXJuIGV9Z2V0IGRpYWdvbmFsKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5zKX1nZXQgdGhyZXNob2xkKCl7cmV0dXJuIE51bWJlci5FUFNJTE9OLzIqTWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdfWdldCBsZWZ0U2luZ3VsYXJWZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXQgcmlnaHRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe3JldHVybiBlci5kaWFnKHRoaXMucyl9fWZ1bmN0aW9uIGZyKHQsZSxyPSExKXtyZXR1cm4gdD11ci5jaGVja01hdHJpeCh0KSxlPXVyLmNoZWNrTWF0cml4KGUpLHI/bmV3IGNyKHQpLnNvbHZlKGUpOnQuaXNTcXVhcmUoKT9uZXcgYXIodCkuc29sdmUoZSk6bmV3IGhyKHQpLnNvbHZlKGUpfWZ1bmN0aW9uIG1yKHQsZSl7bGV0IHI9W107Zm9yKGxldCBzPTA7czx0O3MrKylzIT09ZSYmci5wdXNoKHMpO3JldHVybiByfWZ1bmN0aW9uIGdyKHQsZSxyLHM9MWUtOSxuPTFlLTkpe2lmKHQ+bilyZXR1cm4gbmV3IEFycmF5KGUucm93cysxKS5maWxsKDApO3tsZXQgdD1lLmFkZFJvdyhyLFswXSk7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKU1hdGguYWJzKHQuZ2V0KGUsMCkpPHMmJnQuc2V0KGUsMCwwKTtyZXR1cm4gdC50bzFEQXJyYXkoKX19Y2xhc3Mgd3J7Y29uc3RydWN0b3IodCxlPXt9KXtjb25zdHthc3N1bWVTeW1tZXRyaWM6cj0hMX09ZTtpZighKHQ9dXIuY2hlY2tNYXRyaXgodCkpLmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggaXMgbm90IGEgc3F1YXJlIG1hdHJpeCIpO2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IG11c3QgYmUgbm9uLWVtcHR5Iik7bGV0IHMsbixvPXQuY29sdW1ucyxpPW5ldyBlcihvLG8pLHU9bmV3IEZsb2F0NjRBcnJheShvKSxhPW5ldyBGbG9hdDY0QXJyYXkobyksbD10LGg9ITE7aWYoaD0hIXJ8fHQuaXNTeW1tZXRyaWMoKSxoKXtmb3Iocz0wO3M8bztzKyspZm9yKG49MDtuPG87bisrKWkuc2V0KHMsbixsLmdldChzLG4pKTshZnVuY3Rpb24odCxlLHIscyl7bGV0IG4sbyxpLHUsYSxsLGgsYztmb3IoYT0wO2E8dDthKyspclthXT1zLmdldCh0LTEsYSk7Zm9yKHU9dC0xO3U+MDt1LS0pe2ZvcihjPTAsaT0wLGw9MDtsPHU7bCsrKWMrPU1hdGguYWJzKHJbbF0pO2lmKDA9PT1jKWZvcihlW3VdPXJbdS0xXSxhPTA7YTx1O2ErKylyW2FdPXMuZ2V0KHUtMSxhKSxzLnNldCh1LGEsMCkscy5zZXQoYSx1LDApO2Vsc2V7Zm9yKGw9MDtsPHU7bCsrKXJbbF0vPWMsaSs9cltsXSpyW2xdO2ZvcihuPXJbdS0xXSxvPU1hdGguc3FydChpKSxuPjAmJihvPS1vKSxlW3VdPWMqbyxpLT1uKm8sclt1LTFdPW4tbyxhPTA7YTx1O2ErKyllW2FdPTA7Zm9yKGE9MDthPHU7YSsrKXtmb3Iobj1yW2FdLHMuc2V0KGEsdSxuKSxvPWVbYV0rcy5nZXQoYSxhKSpuLGw9YSsxO2w8PXUtMTtsKyspbys9cy5nZXQobCxhKSpyW2xdLGVbbF0rPXMuZ2V0KGwsYSkqbjtlW2FdPW99Zm9yKG49MCxhPTA7YTx1O2ErKyllW2FdLz1pLG4rPWVbYV0qclthXTtmb3IoaD1uLyhpK2kpLGE9MDthPHU7YSsrKWVbYV0tPWgqclthXTtmb3IoYT0wO2E8dTthKyspe2ZvcihuPXJbYV0sbz1lW2FdLGw9YTtsPD11LTE7bCsrKXMuc2V0KGwsYSxzLmdldChsLGEpLShuKmVbbF0rbypyW2xdKSk7clthXT1zLmdldCh1LTEsYSkscy5zZXQodSxhLDApfX1yW3VdPWl9Zm9yKHU9MDt1PHQtMTt1Kyspe2lmKHMuc2V0KHQtMSx1LHMuZ2V0KHUsdSkpLHMuc2V0KHUsdSwxKSxpPXJbdSsxXSwwIT09aSl7Zm9yKGw9MDtsPD11O2wrKylyW2xdPXMuZ2V0KGwsdSsxKS9pO2ZvcihhPTA7YTw9dTthKyspe2ZvcihvPTAsbD0wO2w8PXU7bCsrKW8rPXMuZ2V0KGwsdSsxKSpzLmdldChsLGEpO2ZvcihsPTA7bDw9dTtsKyspcy5zZXQobCxhLHMuZ2V0KGwsYSktbypyW2xdKX19Zm9yKGw9MDtsPD11O2wrKylzLnNldChsLHUrMSwwKX1mb3IoYT0wO2E8dDthKyspclthXT1zLmdldCh0LTEsYSkscy5zZXQodC0xLGEsMCk7cy5zZXQodC0xLHQtMSwxKSxlWzBdPTB9KG8sYSx1LGkpLGZ1bmN0aW9uKHQsZSxyLHMpe2xldCBuLG8saSx1LGEsbCxoLGMsZixtLGcsdyxwLGQseSxiO2ZvcihpPTE7aTx0O2krKyllW2ktMV09ZVtpXTtlW3QtMV09MDtsZXQgTT0wLHY9MCx4PU51bWJlci5FUFNJTE9OO2ZvcihsPTA7bDx0O2wrKyl7Zm9yKHY9TWF0aC5tYXgodixNYXRoLmFicyhyW2xdKStNYXRoLmFicyhlW2xdKSksaD1sO2g8dCYmIShNYXRoLmFicyhlW2hdKTw9eCp2KTspaCsrO2lmKGg+bClkb3tmb3Iobj1yW2xdLGM9KHJbbCsxXS1uKS8oMiplW2xdKSxmPWxyKGMsMSksYzwwJiYoZj0tZikscltsXT1lW2xdLyhjK2YpLHJbbCsxXT1lW2xdKihjK2YpLG09cltsKzFdLG89bi1yW2xdLGk9bCsyO2k8dDtpKyspcltpXS09bztmb3IoTSs9byxjPXJbaF0sZz0xLHc9ZyxwPWcsZD1lW2wrMV0seT0wLGI9MCxpPWgtMTtpPj1sO2ktLSlmb3IocD13LHc9ZyxiPXksbj1nKmVbaV0sbz1nKmMsZj1scihjLGVbaV0pLGVbaSsxXT15KmYseT1lW2ldL2YsZz1jL2YsYz1nKnJbaV0teSpuLHJbaSsxXT1vK3kqKGcqbit5KnJbaV0pLGE9MDthPHQ7YSsrKW89cy5nZXQoYSxpKzEpLHMuc2V0KGEsaSsxLHkqcy5nZXQoYSxpKStnKm8pLHMuc2V0KGEsaSxnKnMuZ2V0KGEsaSkteSpvKTtjPS15KmIqcCpkKmVbbF0vbSxlW2xdPXkqYyxyW2xdPWcqY313aGlsZShNYXRoLmFicyhlW2xdKT54KnYpO3JbbF09cltsXStNLGVbbF09MH1mb3IoaT0wO2k8dC0xO2krKyl7Zm9yKGE9aSxjPXJbaV0sdT1pKzE7dTx0O3UrKylyW3VdPGMmJihhPXUsYz1yW3VdKTtpZihhIT09aSlmb3IoclthXT1yW2ldLHJbaV09Yyx1PTA7dTx0O3UrKyljPXMuZ2V0KHUsaSkscy5zZXQodSxpLHMuZ2V0KHUsYSkpLHMuc2V0KHUsYSxjKX19KG8sYSx1LGkpfWVsc2V7bGV0IHQ9bmV3IGVyKG8sbyksZT1uZXcgRmxvYXQ2NEFycmF5KG8pO2ZvcihuPTA7bjxvO24rKylmb3Iocz0wO3M8bztzKyspdC5zZXQocyxuLGwuZ2V0KHMsbikpOyFmdW5jdGlvbih0LGUscixzKXtsZXQgbixvLGksdSxhLGwsaCxjPTAsZj10LTE7Zm9yKGw9YysxO2w8PWYtMTtsKyspe2ZvcihoPTAsdT1sO3U8PWY7dSsrKWgrPU1hdGguYWJzKGUuZ2V0KHUsbC0xKSk7aWYoMCE9PWgpe2ZvcihpPTAsdT1mO3U+PWw7dS0tKXJbdV09ZS5nZXQodSxsLTEpL2gsaSs9clt1XSpyW3VdO2ZvcihvPU1hdGguc3FydChpKSxyW2xdPjAmJihvPS1vKSxpLT1yW2xdKm8scltsXT1yW2xdLW8sYT1sO2E8dDthKyspe2ZvcihuPTAsdT1mO3U+PWw7dS0tKW4rPXJbdV0qZS5nZXQodSxhKTtmb3Iobi89aSx1PWw7dTw9Zjt1KyspZS5zZXQodSxhLGUuZ2V0KHUsYSktbipyW3VdKX1mb3IodT0wO3U8PWY7dSsrKXtmb3Iobj0wLGE9ZjthPj1sO2EtLSluKz1yW2FdKmUuZ2V0KHUsYSk7Zm9yKG4vPWksYT1sO2E8PWY7YSsrKWUuc2V0KHUsYSxlLmdldCh1LGEpLW4qclthXSl9cltsXT1oKnJbbF0sZS5zZXQobCxsLTEsaCpvKX19Zm9yKHU9MDt1PHQ7dSsrKWZvcihhPTA7YTx0O2ErKylzLnNldCh1LGEsdT09PWE/MTowKTtmb3IobD1mLTE7bD49YysxO2wtLSlpZigwIT09ZS5nZXQobCxsLTEpKXtmb3IodT1sKzE7dTw9Zjt1Kyspclt1XT1lLmdldCh1LGwtMSk7Zm9yKGE9bDthPD1mO2ErKyl7Zm9yKG89MCx1PWw7dTw9Zjt1Kyspbys9clt1XSpzLmdldCh1LGEpO2ZvcihvPW8vcltsXS9lLmdldChsLGwtMSksdT1sO3U8PWY7dSsrKXMuc2V0KHUsYSxzLmdldCh1LGEpK28qclt1XSl9fX0obyx0LGUsaSksZnVuY3Rpb24odCxlLHIscyxuKXtsZXQgbyxpLHUsYSxsLGgsYyxmLG0sZyx3LHAsZCx5LGIsTT10LTEsdj0wLHg9dC0xLEU9TnVtYmVyLkVQU0lMT04sUz0wLF89MCxqPTAsQT0wLFI9MCxJPTAsQz0wLE49MDtmb3Iobz0wO288dDtvKyspZm9yKChvPHZ8fG8+eCkmJihyW29dPW4uZ2V0KG8sbyksZVtvXT0wKSxpPU1hdGgubWF4KG8tMSwwKTtpPHQ7aSsrKV8rPU1hdGguYWJzKG4uZ2V0KG8saSkpO2Zvcig7TT49djspe2ZvcihhPU07YT52JiYoST1NYXRoLmFicyhuLmdldChhLTEsYS0xKSkrTWF0aC5hYnMobi5nZXQoYSxhKSksMD09PUkmJihJPV8pLCEoTWF0aC5hYnMobi5nZXQoYSxhLTEpKTxFKkkpKTspYS0tO2lmKGE9PT1NKW4uc2V0KE0sTSxuLmdldChNLE0pK1MpLHJbTV09bi5nZXQoTSxNKSxlW01dPTAsTS0tLE49MDtlbHNlIGlmKGE9PT1NLTEpe2lmKGM9bi5nZXQoTSxNLTEpKm4uZ2V0KE0tMSxNKSxqPShuLmdldChNLTEsTS0xKS1uLmdldChNLE0pKS8yLEE9aipqK2MsQz1NYXRoLnNxcnQoTWF0aC5hYnMoQSkpLG4uc2V0KE0sTSxuLmdldChNLE0pK1MpLG4uc2V0KE0tMSxNLTEsbi5nZXQoTS0xLE0tMSkrUyksZj1uLmdldChNLE0pLEE+PTApe2ZvcihDPWo+PTA/aitDOmotQyxyW00tMV09ZitDLHJbTV09cltNLTFdLDAhPT1DJiYocltNXT1mLWMvQyksZVtNLTFdPTAsZVtNXT0wLGY9bi5nZXQoTSxNLTEpLEk9TWF0aC5hYnMoZikrTWF0aC5hYnMoQyksaj1mL0ksQT1DL0ksUj1NYXRoLnNxcnQoaipqK0EqQSksai89UixBLz1SLGk9TS0xO2k8dDtpKyspQz1uLmdldChNLTEsaSksbi5zZXQoTS0xLGksQSpDK2oqbi5nZXQoTSxpKSksbi5zZXQoTSxpLEEqbi5nZXQoTSxpKS1qKkMpO2ZvcihvPTA7bzw9TTtvKyspQz1uLmdldChvLE0tMSksbi5zZXQobyxNLTEsQSpDK2oqbi5nZXQobyxNKSksbi5zZXQobyxNLEEqbi5nZXQobyxNKS1qKkMpO2ZvcihvPXY7bzw9eDtvKyspQz1zLmdldChvLE0tMSkscy5zZXQobyxNLTEsQSpDK2oqcy5nZXQobyxNKSkscy5zZXQobyxNLEEqcy5nZXQobyxNKS1qKkMpfWVsc2UgcltNLTFdPWYraixyW01dPWYraixlW00tMV09QyxlW01dPS1DO00tPTIsTj0wfWVsc2V7aWYoZj1uLmdldChNLE0pLG09MCxjPTAsYTxNJiYobT1uLmdldChNLTEsTS0xKSxjPW4uZ2V0KE0sTS0xKSpuLmdldChNLTEsTSkpLDEwPT09Til7Zm9yKFMrPWYsbz12O288PU07bysrKW4uc2V0KG8sbyxuLmdldChvLG8pLWYpO0k9TWF0aC5hYnMobi5nZXQoTSxNLTEpKStNYXRoLmFicyhuLmdldChNLTEsTS0yKSksZj1tPS43NSpJLGM9LS40Mzc1KkkqSX1pZigzMD09PU4mJihJPShtLWYpLzIsST1JKkkrYyxJPjApKXtmb3IoST1NYXRoLnNxcnQoSSksbTxmJiYoST0tSSksST1mLWMvKChtLWYpLzIrSSksbz12O288PU07bysrKW4uc2V0KG8sbyxuLmdldChvLG8pLUkpO1MrPUksZj1tPWM9Ljk2NH1mb3IoTis9MSxsPU0tMjtsPj1hJiYoQz1uLmdldChsLGwpLFI9Zi1DLEk9bS1DLGo9KFIqSS1jKS9uLmdldChsKzEsbCkrbi5nZXQobCxsKzEpLEE9bi5nZXQobCsxLGwrMSktQy1SLUksUj1uLmdldChsKzIsbCsxKSxJPU1hdGguYWJzKGopK01hdGguYWJzKEEpK01hdGguYWJzKFIpLGovPUksQS89SSxSLz1JLGwhPT1hKSYmIShNYXRoLmFicyhuLmdldChsLGwtMSkpKihNYXRoLmFicyhBKStNYXRoLmFicyhSKSk8RSooTWF0aC5hYnMoaikqKE1hdGguYWJzKG4uZ2V0KGwtMSxsLTEpKStNYXRoLmFicyhDKStNYXRoLmFicyhuLmdldChsKzEsbCsxKSkpKSk7KWwtLTtmb3Iobz1sKzI7bzw9TTtvKyspbi5zZXQobyxvLTIsMCksbz5sKzImJm4uc2V0KG8sby0zLDApO2Zvcih1PWw7dTw9TS0xJiYoeT11IT09TS0xLHUhPT1sJiYoaj1uLmdldCh1LHUtMSksQT1uLmdldCh1KzEsdS0xKSxSPXk/bi5nZXQodSsyLHUtMSk6MCxmPU1hdGguYWJzKGopK01hdGguYWJzKEEpK01hdGguYWJzKFIpLDAhPT1mJiYoai89ZixBLz1mLFIvPWYpKSwwIT09Zik7dSsrKWlmKEk9TWF0aC5zcXJ0KGoqaitBKkErUipSKSxqPDAmJihJPS1JKSwwIT09SSl7Zm9yKHUhPT1sP24uc2V0KHUsdS0xLC1JKmYpOmEhPT1sJiZuLnNldCh1LHUtMSwtbi5nZXQodSx1LTEpKSxqKz1JLGY9ai9JLG09QS9JLEM9Ui9JLEEvPWosUi89aixpPXU7aTx0O2krKylqPW4uZ2V0KHUsaSkrQSpuLmdldCh1KzEsaSkseSYmKGorPVIqbi5nZXQodSsyLGkpLG4uc2V0KHUrMixpLG4uZ2V0KHUrMixpKS1qKkMpKSxuLnNldCh1LGksbi5nZXQodSxpKS1qKmYpLG4uc2V0KHUrMSxpLG4uZ2V0KHUrMSxpKS1qKm0pO2ZvcihvPTA7bzw9TWF0aC5taW4oTSx1KzMpO28rKylqPWYqbi5nZXQobyx1KSttKm4uZ2V0KG8sdSsxKSx5JiYoais9QypuLmdldChvLHUrMiksbi5zZXQobyx1KzIsbi5nZXQobyx1KzIpLWoqUikpLG4uc2V0KG8sdSxuLmdldChvLHUpLWopLG4uc2V0KG8sdSsxLG4uZ2V0KG8sdSsxKS1qKkEpO2ZvcihvPXY7bzw9eDtvKyspaj1mKnMuZ2V0KG8sdSkrbSpzLmdldChvLHUrMSkseSYmKGorPUMqcy5nZXQobyx1KzIpLHMuc2V0KG8sdSsyLHMuZ2V0KG8sdSsyKS1qKlIpKSxzLnNldChvLHUscy5nZXQobyx1KS1qKSxzLnNldChvLHUrMSxzLmdldChvLHUrMSktaipBKX19fWlmKDA9PT1fKXJldHVybjtmb3IoTT10LTE7TT49MDtNLS0paWYoaj1yW01dLEE9ZVtNXSwwPT09QSlmb3IoYT1NLG4uc2V0KE0sTSwxKSxvPU0tMTtvPj0wO28tLSl7Zm9yKGM9bi5nZXQobyxvKS1qLFI9MCxpPWE7aTw9TTtpKyspUis9bi5nZXQobyxpKSpuLmdldChpLE0pO2lmKGVbb108MClDPWMsST1SO2Vsc2UgaWYoYT1vLDA9PT1lW29dP24uc2V0KG8sTSwwIT09Yz8tUi9jOi1SLyhFKl8pKTooZj1uLmdldChvLG8rMSksbT1uLmdldChvKzEsbyksQT0ocltvXS1qKSoocltvXS1qKStlW29dKmVbb10saD0oZipJLUMqUikvQSxuLnNldChvLE0saCksbi5zZXQobysxLE0sTWF0aC5hYnMoZik+TWF0aC5hYnMoQyk/KC1SLWMqaCkvZjooLUktbSpoKS9DKSksaD1NYXRoLmFicyhuLmdldChvLE0pKSxFKmgqaD4xKWZvcihpPW87aTw9TTtpKyspbi5zZXQoaSxNLG4uZ2V0KGksTSkvaCl9ZWxzZSBpZihBPDApZm9yKGE9TS0xLE1hdGguYWJzKG4uZ2V0KE0sTS0xKSk+TWF0aC5hYnMobi5nZXQoTS0xLE0pKT8obi5zZXQoTS0xLE0tMSxBL24uZ2V0KE0sTS0xKSksbi5zZXQoTS0xLE0sLShuLmdldChNLE0pLWopL24uZ2V0KE0sTS0xKSkpOihiPXByKDAsLW4uZ2V0KE0tMSxNKSxuLmdldChNLTEsTS0xKS1qLEEpLG4uc2V0KE0tMSxNLTEsYlswXSksbi5zZXQoTS0xLE0sYlsxXSkpLG4uc2V0KE0sTS0xLDApLG4uc2V0KE0sTSwxKSxvPU0tMjtvPj0wO28tLSl7Zm9yKGc9MCx3PTAsaT1hO2k8PU07aSsrKWcrPW4uZ2V0KG8saSkqbi5nZXQoaSxNLTEpLHcrPW4uZ2V0KG8saSkqbi5nZXQoaSxNKTtpZihjPW4uZ2V0KG8sbyktaixlW29dPDApQz1jLFI9ZyxJPXc7ZWxzZSBpZihhPW8sMD09PWVbb10/KGI9cHIoLWcsLXcsYyxBKSxuLnNldChvLE0tMSxiWzBdKSxuLnNldChvLE0sYlsxXSkpOihmPW4uZ2V0KG8sbysxKSxtPW4uZ2V0KG8rMSxvKSxwPShyW29dLWopKihyW29dLWopK2Vbb10qZVtvXS1BKkEsZD0yKihyW29dLWopKkEsMD09PXAmJjA9PT1kJiYocD1FKl8qKE1hdGguYWJzKGMpK01hdGguYWJzKEEpK01hdGguYWJzKGYpK01hdGguYWJzKG0pK01hdGguYWJzKEMpKSksYj1wcihmKlItQypnK0EqdyxmKkktQyp3LUEqZyxwLGQpLG4uc2V0KG8sTS0xLGJbMF0pLG4uc2V0KG8sTSxiWzFdKSxNYXRoLmFicyhmKT5NYXRoLmFicyhDKStNYXRoLmFicyhBKT8obi5zZXQobysxLE0tMSwoLWctYypuLmdldChvLE0tMSkrQSpuLmdldChvLE0pKS9mKSxuLnNldChvKzEsTSwoLXctYypuLmdldChvLE0pLUEqbi5nZXQobyxNLTEpKS9mKSk6KGI9cHIoLVItbSpuLmdldChvLE0tMSksLUktbSpuLmdldChvLE0pLEMsQSksbi5zZXQobysxLE0tMSxiWzBdKSxuLnNldChvKzEsTSxiWzFdKSkpLGg9TWF0aC5tYXgoTWF0aC5hYnMobi5nZXQobyxNLTEpKSxNYXRoLmFicyhuLmdldChvLE0pKSksRSpoKmg+MSlmb3IoaT1vO2k8PU07aSsrKW4uc2V0KGksTS0xLG4uZ2V0KGksTS0xKS9oKSxuLnNldChpLE0sbi5nZXQoaSxNKS9oKX1mb3Iobz0wO288dDtvKyspaWYobzx2fHxvPngpZm9yKGk9bztpPHQ7aSsrKXMuc2V0KG8saSxuLmdldChvLGkpKTtmb3IoaT10LTE7aT49djtpLS0pZm9yKG89djtvPD14O28rKyl7Zm9yKEM9MCx1PXY7dTw9TWF0aC5taW4oaSx4KTt1KyspQys9cy5nZXQobyx1KSpuLmdldCh1LGkpO3Muc2V0KG8saSxDKX19KG8sYSx1LGksdCl9dGhpcy5uPW8sdGhpcy5lPWEsdGhpcy5kPXUsdGhpcy5WPWl9Z2V0IHJlYWxFaWdlbnZhbHVlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZCl9Z2V0IGltYWdpbmFyeUVpZ2VudmFsdWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5lKX1nZXQgZWlnZW52ZWN0b3JNYXRyaXgoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe2xldCB0LGUscj10aGlzLm4scz10aGlzLmUsbj10aGlzLmQsbz1uZXcgZXIocixyKTtmb3IodD0wO3Q8cjt0Kyspe2ZvcihlPTA7ZTxyO2UrKylvLnNldCh0LGUsMCk7by5zZXQodCx0LG5bdF0pLHNbdF0+MD9vLnNldCh0LHQrMSxzW3RdKTpzW3RdPDAmJm8uc2V0KHQsdC0xLHNbdF0pfXJldHVybiBvfX1mdW5jdGlvbiBwcih0LGUscixzKXtsZXQgbixvO3JldHVybiBNYXRoLmFicyhyKT5NYXRoLmFicyhzKT8obj1zL3Isbz1yK24qcyxbKHQrbiplKS9vLChlLW4qdCkvb10pOihuPXIvcyxvPXMrbipyLFsobip0K2UpL28sKG4qZS10KS9vXSl9Y2xhc3MgZHJ7Y29uc3RydWN0b3IodCl7aWYoISh0PXVyLmNoZWNrTWF0cml4KHQpKS5pc1N5bW1ldHJpYygpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGlzIG5vdCBzeW1tZXRyaWMiKTtsZXQgZSxyLHMsbj10LG89bi5yb3dzLGk9bmV3IGVyKG8sbyksdT0hMDtmb3Iocj0wO3I8bztyKyspe2xldCB0PTA7Zm9yKHM9MDtzPHI7cysrKXtsZXQgbz0wO2ZvcihlPTA7ZTxzO2UrKylvKz1pLmdldChzLGUpKmkuZ2V0KHIsZSk7bz0obi5nZXQocixzKS1vKS9pLmdldChzLHMpLGkuc2V0KHIscyxvKSx0Kz1vKm99Zm9yKHQ9bi5nZXQocixyKS10LHUmJj10PjAsaS5zZXQocixyLE1hdGguc3FydChNYXRoLm1heCh0LDApKSkscz1yKzE7czxvO3MrKylpLnNldChyLHMsMCl9dGhpcy5MPWksdGhpcy5wb3NpdGl2ZURlZmluaXRlPXV9aXNQb3NpdGl2ZURlZmluaXRlKCl7cmV0dXJuIHRoaXMucG9zaXRpdmVEZWZpbml0ZX1zb2x2ZSh0KXt0PXVyLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuTCxyPWUucm93cztpZih0LnJvd3MhPT1yKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoIik7aWYoITE9PT10aGlzLmlzUG9zaXRpdmVEZWZpbml0ZSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGlzIG5vdCBwb3NpdGl2ZSBkZWZpbml0ZSIpO2xldCBzLG4sbyxpPXQuY29sdW1ucyx1PXQuY2xvbmUoKTtmb3Iobz0wO288cjtvKyspZm9yKG49MDtuPGk7bisrKXtmb3Iocz0wO3M8bztzKyspdS5zZXQobyxuLHUuZ2V0KG8sbiktdS5nZXQocyxuKSplLmdldChvLHMpKTt1LnNldChvLG4sdS5nZXQobyxuKS9lLmdldChvLG8pKX1mb3Iobz1yLTE7bz49MDtvLS0pZm9yKG49MDtuPGk7bisrKXtmb3Iocz1vKzE7czxyO3MrKyl1LnNldChvLG4sdS5nZXQobyxuKS11LmdldChzLG4pKmUuZ2V0KHMsbykpO3Uuc2V0KG8sbix1LmdldChvLG4pL2UuZ2V0KG8sbykpfXJldHVybiB1fWdldCBsb3dlclRyaWFuZ3VsYXJNYXRyaXgoKXtyZXR1cm4gdGhpcy5MfX1jbGFzcyB5cntjb25zdHJ1Y3Rvcih0LGU9e30pe3Q9dXIuY2hlY2tNYXRyaXgodCk7bGV0e1k6cn09ZTtjb25zdHtzY2FsZVNjb3JlczpzPSExLG1heEl0ZXJhdGlvbnM6bj0xZTMsdGVybWluYXRpb25Dcml0ZXJpYTpvPTFlLTEwfT1lO2xldCBpO2lmKHIpe2lmKHI9VmUocikmJiJudW1iZXIiPT10eXBlb2YgclswXT9lci5jb2x1bW5WZWN0b3Iocik6dXIuY2hlY2tNYXRyaXgociksci5yb3dzIT09dC5yb3dzKXRocm93IG5ldyBFcnJvcigiWSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyBYIik7aT1yLmdldENvbHVtblZlY3RvcigwKX1lbHNlIGk9dC5nZXRDb2x1bW5WZWN0b3IoMCk7bGV0IHUsYSxsLGgsYz0xO2ZvcihsZXQgZT0wO2U8biYmYz5vO2UrKylsPXQudHJhbnNwb3NlKCkubW11bChpKS5kaXYoaS50cmFuc3Bvc2UoKS5tbXVsKGkpLmdldCgwLDApKSxsPWwuZGl2KGwubm9ybSgpKSx1PXQubW11bChsKS5kaXYobC50cmFuc3Bvc2UoKS5tbXVsKGwpLmdldCgwLDApKSxlPjAmJihjPXUuY2xvbmUoKS5zdWIoaCkucG93KDIpLnN1bSgpKSxoPXUuY2xvbmUoKSxyPyhhPXIudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxhPWEuZGl2KGEubm9ybSgpKSxpPXIubW11bChhKS5kaXYoYS50cmFuc3Bvc2UoKS5tbXVsKGEpLmdldCgwLDApKSk6aT11O2lmKHIpe2xldCBlPXQudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKTtlPWUuZGl2KGUubm9ybSgpKTtsZXQgcz10LmNsb25lKCkuc3ViKHUuY2xvbmUoKS5tbXVsKGUudHJhbnNwb3NlKCkpKSxuPWkudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxvPXIuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm11bFMobi5nZXQoMCwwKSkubW11bChhLnRyYW5zcG9zZSgpKSk7dGhpcy50PXUsdGhpcy5wPWUudHJhbnNwb3NlKCksdGhpcy53PWwudHJhbnNwb3NlKCksdGhpcy5xPWEsdGhpcy51PWksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KSx0aGlzLnhSZXNpZHVhbD1zLHRoaXMueVJlc2lkdWFsPW8sdGhpcy5iZXRhcz1ufWVsc2UgdGhpcy53PWwudHJhbnNwb3NlKCksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KS5zcXJ0KCksdGhpcy50PXM/dS5jbG9uZSgpLmRpdih0aGlzLnMuZ2V0KDAsMCkpOnUsdGhpcy54UmVzaWR1YWw9dC5zdWIodS5tbXVsKGwudHJhbnNwb3NlKCkpKX19RmUuQWJzdHJhY3RNYXRyaXg9WmUsRmUuQ0hPPWRyLEZlLkNob2xlc2t5RGVjb21wb3NpdGlvbj1kcixGZS5EaXN0YW5jZU1hdHJpeD1zcjt2YXIgYnI9RmUuRVZEPXdyO0ZlLkVpZ2VudmFsdWVEZWNvbXBvc2l0aW9uPXdyLEZlLkxVPWFyLEZlLkx1RGVjb21wb3NpdGlvbj1hcjt2YXIgTXI9RmUuTWF0cml4PWVyO0ZlLk1hdHJpeENvbHVtblNlbGVjdGlvblZpZXc9Y2xhc3MgZXh0ZW5kcyBucntjb25zdHJ1Y3Rvcih0LGUpe1FlKHQsZSksc3VwZXIodCx0LnJvd3MsZS5sZW5ndGgpLHRoaXMuY29sdW1uSW5kaWNlcz1lfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldCh0LHRoaXMuY29sdW1uSW5kaWNlc1tlXSxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQodCx0aGlzLmNvbHVtbkluZGljZXNbZV0pfX0sRmUuTWF0cml4Q29sdW1uVmlldz1jbGFzcyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKHQsZSl7R2UodCxlKSxzdXBlcih0LHQucm93cywxKSx0aGlzLmNvbHVtbj1lfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldCh0LHRoaXMuY29sdW1uLHIpLHRoaXN9Z2V0KHQpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQodCx0aGlzLmNvbHVtbil9fSxGZS5NYXRyaXhGbGlwQ29sdW1uVmlldz1jbGFzcyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsdC5yb3dzLHQuY29sdW1ucyl9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHQsdGhpcy5jb2x1bW5zLWUtMSxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQodCx0aGlzLmNvbHVtbnMtZS0xKX19LEZlLk1hdHJpeEZsaXBSb3dWaWV3PWNsYXNzIGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCx0LnJvd3MsdC5jb2x1bW5zKX1zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodGhpcy5yb3dzLXQtMSxlLHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0aGlzLnJvd3MtdC0xLGUpfX0sRmUuTWF0cml4Um93U2VsZWN0aW9uVmlldz1jbGFzcyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKHQsZSl7S2UodCxlKSxzdXBlcih0LGUubGVuZ3RoLHQuY29sdW1ucyksdGhpcy5yb3dJbmRpY2VzPWV9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHRoaXMucm93SW5kaWNlc1t0XSxlLHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0aGlzLnJvd0luZGljZXNbdF0sZSl9fSxGZS5NYXRyaXhSb3dWaWV3PWNsYXNzIGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IodCxlKXtVZSh0LGUpLHN1cGVyKHQsMSx0LmNvbHVtbnMpLHRoaXMucm93PWV9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHRoaXMucm93LGUsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMucm93LGUpfX0sRmUuTWF0cml4U2VsZWN0aW9uVmlldz1vcixGZS5NYXRyaXhTdWJWaWV3PWNsYXNzIGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IodCxlLHIscyxuKXtYZSh0LGUscixzLG4pLHN1cGVyKHQsci1lKzEsbi1zKzEpLHRoaXMuc3RhcnRSb3c9ZSx0aGlzLnN0YXJ0Q29sdW1uPXN9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHRoaXMuc3RhcnRSb3crdCx0aGlzLnN0YXJ0Q29sdW1uK2UsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMuc3RhcnRSb3crdCx0aGlzLnN0YXJ0Q29sdW1uK2UpfX07dmFyIHZyPUZlLk1hdHJpeFRyYW5zcG9zZVZpZXc9Y2xhc3MgZXh0ZW5kcyBucntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHQuY29sdW1ucyx0LnJvd3MpfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldChlLHQsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KGUsdCl9fSx4cj1GZS5OSVBBTFM9eXI7RmUuTmlwYWxzPXlyLEZlLlFSPWhyLEZlLlFyRGVjb21wb3NpdGlvbj1ocjt2YXIgRXI9RmUuU1ZEPWNyO0ZlLlNpbmd1bGFyVmFsdWVEZWNvbXBvc2l0aW9uPWNyLEZlLlN5bW1ldHJpY01hdHJpeD1ycixGZS5XcmFwcGVyTWF0cml4MUQ9aXIsRmUuV3JhcHBlck1hdHJpeDJEPXVyLEZlLmNvcnJlbGF0aW9uPWZ1bmN0aW9uKHQsZT10LHI9e30pe3Q9bmV3IGVyKHQpO2xldCBzPSExO2lmKCJvYmplY3QiIT10eXBlb2YgZXx8ZXIuaXNNYXRyaXgoZSl8fFZlKGUpP2U9bmV3IGVyKGUpOihyPWUsZT10LHM9ITApLHQucm93cyE9PWUucm93cyl0aHJvdyBuZXcgVHlwZUVycm9yKCJCb3RoIG1hdHJpY2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyIpO2NvbnN0e2NlbnRlcjpuPSEwLHNjYWxlOm89ITB9PXI7biYmKHQuY2VudGVyKCJjb2x1bW4iKSxzfHxlLmNlbnRlcigiY29sdW1uIikpLG8mJih0LnNjYWxlKCJjb2x1bW4iKSxzfHxlLnNjYWxlKCJjb2x1bW4iKSk7Y29uc3QgaT10LnN0YW5kYXJkRGV2aWF0aW9uKCJjb2x1bW4iLHt1bmJpYXNlZDohMH0pLHU9cz9pOmUuc3RhbmRhcmREZXZpYXRpb24oImNvbHVtbiIse3VuYmlhc2VkOiEwfSksYT10LnRyYW5zcG9zZSgpLm1tdWwoZSk7Zm9yKGxldCBlPTA7ZTxhLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8YS5jb2x1bW5zO3IrKylhLnNldChlLHIsYS5nZXQoZSxyKSooMS8oaVtlXSp1W3JdKSkqKDEvKHQucm93cy0xKSkpO3JldHVybiBhfSxGZS5jb3ZhcmlhbmNlPWZ1bmN0aW9uKHQsZT10LHI9e30pe3Q9bmV3IGVyKHQpO2xldCBzPSExO2lmKCJvYmplY3QiIT10eXBlb2YgZXx8ZXIuaXNNYXRyaXgoZSl8fFZlKGUpP2U9bmV3IGVyKGUpOihyPWUsZT10LHM9ITApLHQucm93cyE9PWUucm93cyl0aHJvdyBuZXcgVHlwZUVycm9yKCJCb3RoIG1hdHJpY2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyIpO2NvbnN0e2NlbnRlcjpuPSEwfT1yO24mJih0PXQuY2VudGVyKCJjb2x1bW4iKSxzfHwoZT1lLmNlbnRlcigiY29sdW1uIikpKTtjb25zdCBvPXQudHJhbnNwb3NlKCkubW11bChlKTtmb3IobGV0IGU9MDtlPG8ucm93cztlKyspZm9yKGxldCByPTA7cjxvLmNvbHVtbnM7cisrKW8uc2V0KGUscixvLmdldChlLHIpKigxLyh0LnJvd3MtMSkpKTtyZXR1cm4gb307dmFyIFNyPUZlLmRlZmF1bHQ9ZXI7RmUuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24gdChlKXtpZigoZT1lci5jaGVja01hdHJpeChlKSkuaXNTcXVhcmUoKSl7aWYoMD09PWUuY29sdW1ucylyZXR1cm4gMTtsZXQgcixzLG4sbztpZigyPT09ZS5jb2x1bW5zKXJldHVybiByPWUuZ2V0KDAsMCkscz1lLmdldCgwLDEpLG49ZS5nZXQoMSwwKSxvPWUuZ2V0KDEsMSkscipvLXMqbjtpZigzPT09ZS5jb2x1bW5zKXtsZXQgbyxpLHU7cmV0dXJuIG89bmV3IG9yKGUsWzEsMl0sWzEsMl0pLGk9bmV3IG9yKGUsWzEsMl0sWzAsMl0pLHU9bmV3IG9yKGUsWzEsMl0sWzAsMV0pLHI9ZS5nZXQoMCwwKSxzPWUuZ2V0KDAsMSksbj1lLmdldCgwLDIpLHIqdChvKS1zKnQoaSkrbip0KHUpfXJldHVybiBuZXcgYXIoZSkuZGV0ZXJtaW5hbnR9dGhyb3cgRXJyb3IoImRldGVybWluYW50IGNhbiBvbmx5IGJlIGNhbGN1bGF0ZWQgZm9yIGEgc3F1YXJlIG1hdHJpeCIpfSxGZS5pbnZlcnNlPWZ1bmN0aW9uKHQsZT0hMSl7cmV0dXJuIHQ9dXIuY2hlY2tNYXRyaXgodCksZT9uZXcgY3IodCkuaW52ZXJzZSgpOmZyKHQsZXIuZXllKHQucm93cykpfSxGZS5saW5lYXJEZXBlbmRlbmNpZXM9ZnVuY3Rpb24odCxlPXt9KXtjb25zdHt0aHJlc2hvbGRWYWx1ZTpyPTFlLTksdGhyZXNob2xkRXJyb3I6cz0xZS05fT1lO2xldCBuPSh0PWVyLmNoZWNrTWF0cml4KHQpKS5yb3dzLG89bmV3IGVyKG4sbik7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7bGV0IGk9ZXIuY29sdW1uVmVjdG9yKHQuZ2V0Um93KGUpKSx1PXQuc3ViTWF0cml4Um93KG1yKG4sZSkpLnRyYW5zcG9zZSgpLGE9bmV3IGNyKHUpLnNvbHZlKGkpLGw9ZXIuc3ViKGksdS5tbXVsKGEpKS5hYnMoKS5tYXgoKTtvLnNldFJvdyhlLGdyKGwsYSxlLHIscykpfXJldHVybiBvfSxGZS5wc2V1ZG9JbnZlcnNlPWZ1bmN0aW9uKHQsZT1OdW1iZXIuRVBTSUxPTil7aWYoKHQ9ZXIuY2hlY2tNYXRyaXgodCkpLmlzRW1wdHkoKSlyZXR1cm4gdC50cmFuc3Bvc2UoKTtsZXQgcj1uZXcgY3IodCx7YXV0b1RyYW5zcG9zZTohMH0pLHM9ci5sZWZ0U2luZ3VsYXJWZWN0b3JzLG49ci5yaWdodFNpbmd1bGFyVmVjdG9ycyxvPXIuZGlhZ29uYWw7Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0KyspTWF0aC5hYnMob1t0XSk+ZT9vW3RdPTEvb1t0XTpvW3RdPTA7cmV0dXJuIG4ubW11bChlci5kaWFnKG8pLm1tdWwocy50cmFuc3Bvc2UoKSkpfSxGZS5zb2x2ZT1mcixGZS53cmFwPWZ1bmN0aW9uKHQsZSl7aWYoVmUodCkpcmV0dXJuIHRbMF0mJlZlKHRbMF0pP25ldyB1cih0KTpuZXcgaXIodCxlKTt0aHJvdyBuZXcgRXJyb3IoInRoZSBhcmd1bWVudCBpcyBub3QgYW4gYXJyYXkiKX07Y29uc3QgX3I9YnIsanI9TXIsQXI9dnIsUnI9eHIsSXI9RXI7U3IuTWF0cml4JiZTci5NYXRyaXg7bGV0IENyPWNsYXNzIHR7Y29uc3RydWN0b3IodCxlPXt9LHIpe2lmKHRoaXMuVT1udWxsLHRoaXMuUz1udWxsLHIpcmV0dXJuIHRoaXMuY2VudGVyPXIuY2VudGVyLHRoaXMuc2NhbGU9ci5zY2FsZSx0aGlzLm1lYW5zPXIubWVhbnMsdGhpcy5zdGRldnM9ci5zdGRldnMsdGhpcy5VPWpyLmNoZWNrTWF0cml4KHIuVSksdGhpcy5TPXIuUyx0aGlzLlI9ci5SLHZvaWQodGhpcy5leGNsdWRlZEZlYXR1cmVzPXIuZXhjbHVkZWRGZWF0dXJlc3x8W10pO2xldCBzO3M9KEFycmF5LmlzQXJyYXkodCksbmV3IGpyKHQpKTtjb25zdHtpc0NvdmFyaWFuY2VNYXRyaXg6bj0hMSxtZXRob2Q6bz0iU1ZEIixuQ29tcE5JUEFMUzppPTIsY2VudGVyOnU9ITAsc2NhbGU6YT0hMSxpZ25vcmVaZXJvVmFyaWFuY2U6bD0hMX09ZTtpZih0aGlzLmNlbnRlcj11LHRoaXMuc2NhbGU9YSx0aGlzLm1lYW5zPW51bGwsdGhpcy5zdGRldnM9bnVsbCx0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9W10sbil0aGlzLl9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgocyk7ZWxzZSBzd2l0Y2godGhpcy5fYWRqdXN0KHMsbCksbyl7Y2FzZSJjb3ZhcmlhbmNlTWF0cml4Ijp7Y29uc3QgdD1uZXcgQXIocykubW11bChzKS5kaXYocy5yb3dzLTEpO3RoaXMuX2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeCh0KTticmVha31jYXNlIk5JUEFMUyI6dGhpcy5fY29tcHV0ZVdpdGhOSVBBTFMocyxpKTticmVhaztjYXNlIlNWRCI6e2NvbnN0IHQ9bmV3IElyKHMse2NvbXB1dGVMZWZ0U2luZ3VsYXJWZWN0b3JzOiExLGNvbXB1dGVSaWdodFNpbmd1bGFyVmVjdG9yczohMCxhdXRvVHJhbnNwb3NlOiEwfSk7dGhpcy5VPXQucmlnaHRTaW5ndWxhclZlY3RvcnM7Y29uc3QgZT10LmRpYWdvbmFsLHI9W107Zm9yKGNvbnN0IHQgb2YgZSlyLnB1c2godCp0LyhzLnJvd3MtMSkpO3RoaXMuUz1yO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bmtub3duIG1ldGhvZDogJHtvfWApfX1zdGF0aWMgbG9hZChlKXtpZigic3RyaW5nIiE9dHlwZW9mIGUubmFtZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtb2RlbCBtdXN0IGhhdmUgYSBuYW1lIHByb3BlcnR5Iik7aWYoIlBDQSIhPT1lLm5hbWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYGludmFsaWQgbW9kZWw6ICR7ZS5uYW1lfWApO3JldHVybiBuZXcgdCh2b2lkIDAsdm9pZCAwLGUpfXByZWRpY3QodCxlPXt9KXtjb25zdHtuQ29tcG9uZW50czpyPXRoaXMuVS5jb2x1bW5zfT1lO2xldCBzO2lmKHM9KEFycmF5LmlzQXJyYXkodCksbmV3IGpyKHQpKSx0aGlzLmNlbnRlciYmKHMuc3ViUm93VmVjdG9yKHRoaXMubWVhbnMpLHRoaXMuc2NhbGUpKXtmb3IobGV0IHQgb2YgdGhpcy5leGNsdWRlZEZlYXR1cmVzKXMucmVtb3ZlQ29sdW1uKHQpO3MuZGl2Um93VmVjdG9yKHRoaXMuc3RkZXZzKX1sZXQgbj1zLm1tdWwodGhpcy5VKTtyZXR1cm4gbi5zdWJNYXRyaXgoMCxuLnJvd3MtMSwwLHItMSl9aW52ZXJ0KHQpe2xldCBlPSh0PWpyLmNoZWNrTWF0cml4KHQpKS5tbXVsKHRoaXMuVS50cmFuc3Bvc2UoKSk7cmV0dXJuIHRoaXMuY2VudGVyJiYodGhpcy5zY2FsZSYmZS5tdWxSb3dWZWN0b3IodGhpcy5zdGRldnMpLGUuYWRkUm93VmVjdG9yKHRoaXMubWVhbnMpKSxlfWdldEV4cGxhaW5lZFZhcmlhbmNlKCl7bGV0IHQ9MDtpZih0aGlzLlMpZm9yKGNvbnN0IGUgb2YgdGhpcy5TKXQrPWU7cmV0dXJuIHRoaXMuUz90aGlzLlMubWFwKChlPT5lL3QpKTpbXX1nZXRDdW11bGF0aXZlVmFyaWFuY2UoKXtsZXQgdD10aGlzLmdldEV4cGxhaW5lZFZhcmlhbmNlKCk7Zm9yKGxldCBlPTE7ZTx0Lmxlbmd0aDtlKyspdFtlXSs9dFtlLTFdO3JldHVybiB0fWdldEVpZ2VudmVjdG9ycygpe3JldHVybiB0aGlzLlV9Z2V0RWlnZW52YWx1ZXMoKXtyZXR1cm4gdGhpcy5TfWdldFN0YW5kYXJkRGV2aWF0aW9ucygpe3JldHVybiB0aGlzLlMubWFwKCh0PT5NYXRoLnNxcnQodCkpKX1nZXRMb2FkaW5ncygpe3JldHVybiB0aGlzLlUudHJhbnNwb3NlKCl9dG9KU09OKCl7cmV0dXJue25hbWU6IlBDQSIsY2VudGVyOnRoaXMuY2VudGVyLHNjYWxlOnRoaXMuc2NhbGUsbWVhbnM6dGhpcy5tZWFucyxzdGRldnM6dGhpcy5zdGRldnMsVTp0aGlzLlUsUzp0aGlzLlMsZXhjbHVkZWRGZWF0dXJlczp0aGlzLmV4Y2x1ZGVkRmVhdHVyZXN9fV9hZGp1c3QodCxlKXtpZih0aGlzLmNlbnRlcil7Y29uc3Qgcj10Lm1lYW4oImNvbHVtbiIpLHM9dGhpcy5zY2FsZT90LnN0YW5kYXJkRGV2aWF0aW9uKCJjb2x1bW4iLHttZWFuOnJ9KTpudWxsO2lmKHRoaXMubWVhbnM9cix0LnN1YlJvd1ZlY3RvcihyKSx0aGlzLnNjYWxlKXtmb3IobGV0IHI9MDtyPHMubGVuZ3RoO3IrKylpZigwPT09c1tyXSl7aWYoIWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENhbm5vdCBzY2FsZSB0aGUgZGF0YXNldCAoc3RhbmRhcmQgZGV2aWF0aW9uIGlzIHplcm8gYXQgaW5kZXggJHtyfWApO3QucmVtb3ZlQ29sdW1uKHIpLHMuc3BsaWNlKHIsMSksdGhpcy5leGNsdWRlZEZlYXR1cmVzLnB1c2gociksci0tfXRoaXMuc3RkZXZzPXMsdC5kaXZSb3dWZWN0b3Iocyl9fX1fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpe2NvbnN0IGU9bmV3IF9yKHQse2Fzc3VtZVN5bW1ldHJpYzohMH0pO3RoaXMuVT1lLmVpZ2VudmVjdG9yTWF0cml4LHRoaXMuVS5mbGlwUm93cygpLHRoaXMuUz1lLnJlYWxFaWdlbnZhbHVlcyx0aGlzLlMucmV2ZXJzZSgpfV9jb21wdXRlV2l0aE5JUEFMUyh0LGUpe3RoaXMuVT1uZXcganIoZSx0LmNvbHVtbnMpLHRoaXMuUz1bXTtsZXQgcj10O2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW5ldyBScihyKTt0aGlzLlUuc2V0Um93KHQsZS53LnRyYW5zcG9zZSgpKSx0aGlzLlMucHVzaChNYXRoLnBvdyhlLnMuZ2V0KDAsMCksMikpLHI9ZS54UmVzaWR1YWx9dGhpcy5VPXRoaXMuVS50cmFuc3Bvc2UoKX19O2Z1bmN0aW9uIE5yKHQsZT17fSl7aWYoIWNlKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3QgZWZmLiBhcnJheSIpO2xldCByPXd0KGUsInNjYWxlIik7bWUocil8fChyPSEwKTtsZXQgcz13dChlLCJuQ29tcE5JUEFMUyIpO3dlKHMpfHwocz0yKSxzPWtlKHMpO2xldCBuPW9lKHd0KHQsMCxbXSkpO2lmKDA9PT1uKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBkaW1lbnNpb24gb2YgZGF0YSIpO2lmKHM+bil0aHJvdyBuZXcgRXJyb3IoYG5Db21wTklQQUxTWyR7c31dIGlzIG1vcmUgdGhhbiB0aGUgZGltZW5zaW9uWyR7bn1dIG9mIGRhdGFgKTtyZXR1cm4gbmV3IENyKHQse21ldGhvZDoiTklQQUxTIixzY2FsZTpyLG5Db21wTklQQUxTOnN9KS5wcmVkaWN0KHQpLnRvSlNPTigpfWZ1bmN0aW9uIGtyKHQsZSl7Zm9yKHZhciByPS0xLHM9bnVsbD09dD8wOnQubGVuZ3RoOysrcjxzJiYhMSE9PWUodFtyXSxyLHQpOyk7cmV0dXJuIHR9dmFyIFRyLEZyPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIHM9LTEsbj1PYmplY3QodCksbz1yKHQpLGk9by5sZW5ndGg7aS0tOyl7dmFyIHU9b1tUcj9pOisrc107aWYoITE9PT1lKG5bdV0sdSxuKSlicmVha31yZXR1cm4gdH07ZnVuY3Rpb24gT3IodCl7cmV0dXJuIGcodCkmJiJbb2JqZWN0IEFyZ3VtZW50c10iPT1tKHQpfXZhciBWcj1PYmplY3QucHJvdG90eXBlLHpyPVZyLmhhc093blByb3BlcnR5LERyPVZyLnByb3BlcnR5SXNFbnVtZXJhYmxlLFByPU9yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/T3I6ZnVuY3Rpb24odCl7cmV0dXJuIGcodCkmJnpyLmNhbGwodCwiY2FsbGVlIikmJiFEci5jYWxsKHQsImNhbGxlZSIpfTt2YXIgcXI9Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cywkcj1xciYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLExyPSRyJiYkci5leHBvcnRzPT09cXI/cy5CdWZmZXI6dm9pZCAwLFVyPShMcj9Mci5pc0J1ZmZlcjp2b2lkIDApfHxmdW5jdGlvbigpe3JldHVybiExfSxHcj05MDA3MTk5MjU0NzQwOTkxLEJyPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBXcih0LGUpe3ZhciByPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT9HcjplKSYmKCJudW1iZXIiPT1yfHwic3ltYm9sIiE9ciYmQnIudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfXZhciBLcj17fTtLclsiW29iamVjdCBGbG9hdDMyQXJyYXldIl09S3JbIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPUtyWyJbb2JqZWN0IEludDhBcnJheV0iXT1LclsiW29iamVjdCBJbnQxNkFycmF5XSJdPUtyWyJbb2JqZWN0IEludDMyQXJyYXldIl09S3JbIltvYmplY3QgVWludDhBcnJheV0iXT1LclsiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1LclsiW29iamVjdCBVaW50MTZBcnJheV0iXT1LclsiW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxLclsiW29iamVjdCBBcmd1bWVudHNdIl09S3JbIltvYmplY3QgQXJyYXldIl09S3JbIltvYmplY3QgQXJyYXlCdWZmZXJdIl09S3JbIltvYmplY3QgQm9vbGVhbl0iXT1LclsiW29iamVjdCBEYXRhVmlld10iXT1LclsiW29iamVjdCBEYXRlXSJdPUtyWyJbb2JqZWN0IEVycm9yXSJdPUtyWyJbb2JqZWN0IEZ1bmN0aW9uXSJdPUtyWyJbb2JqZWN0IE1hcF0iXT1LclsiW29iamVjdCBOdW1iZXJdIl09S3JbIltvYmplY3QgT2JqZWN0XSJdPUtyWyJbb2JqZWN0IFJlZ0V4cF0iXT1LclsiW29iamVjdCBTZXRdIl09S3JbIltvYmplY3QgU3RyaW5nXSJdPUtyWyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIFFyPSJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsWHI9UXImJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxZcj1YciYmWHIuZXhwb3J0cz09PVFyJiZlLnByb2Nlc3MsSnI9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9WHImJlhyLnJlcXVpcmUmJlhyLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8WXImJllyLmJpbmRpbmcmJllyLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpLEhyPUpyJiZKci5pc1R5cGVkQXJyYXksWnI9SHI/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX0oSHIpOmZ1bmN0aW9uKHQpe3JldHVybiBnKHQpJiZEdCh0Lmxlbmd0aCkmJiEhS3JbbSh0KV19LHRzPVpyLGVzPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gcnMoZSxyKXt2YXIgcz10KGUpLG49IXMmJlByKGUpLG89IXMmJiFuJiZVcihlKSxpPSFzJiYhbiYmIW8mJnRzKGUpLHU9c3x8bnx8b3x8aSxhPXU/ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEscz1BcnJheSh0KTsrK3I8dDspc1tyXT1lKHIpO3JldHVybiBzfShlLmxlbmd0aCxTdHJpbmcpOltdLGw9YS5sZW5ndGg7Zm9yKHZhciBoIGluIGUpIXImJiFlcy5jYWxsKGUsaCl8fHUmJigibGVuZ3RoIj09aHx8byYmKCJvZmZzZXQiPT1ofHwicGFyZW50Ij09aCl8fGkmJigiYnVmZmVyIj09aHx8ImJ5dGVMZW5ndGgiPT1ofHwiYnl0ZU9mZnNldCI9PWgpfHxXcihoLGwpKXx8YS5wdXNoKGgpO3JldHVybiBhfWZ1bmN0aW9uIHNzKHQpe3JldHVybiBQdCh0KT9ycyh0KTpNdCh0KX12YXIgbnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocixzKXtpZihudWxsPT1yKXJldHVybiByO2lmKCFQdChyKSlyZXR1cm4gdChyLHMpO2Zvcih2YXIgbj1yLmxlbmd0aCxvPWU/bjotMSxpPU9iamVjdChyKTsoZT9vLS06KytvPG4pJiYhMSE9PXMoaVtvXSxvLGkpOyk7cmV0dXJuIHJ9fSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmRnIodCxlLHNzKX0pKSxvcz1ucztmdW5jdGlvbiBpcyh0KXtyZXR1cm4gdH1mdW5jdGlvbiB1cyhlLHIpe3ZhciBzO3JldHVybih0KGUpP2tyOm9zKShlLCJmdW5jdGlvbiI9PXR5cGVvZihzPXIpP3M6aXMpfWZ1bmN0aW9uIGFzKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IFcodCk7dGhpcy5zaXplPWUuc2l6ZX1hcy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW5ldyBXLHRoaXMuc2l6ZT0wfSxhcy5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxyfSxhcy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX0sYXMucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9LGFzLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO2lmKHIgaW5zdGFuY2VvZiBXKXt2YXIgcz1yLl9fZGF0YV9fO2lmKCFLfHxzLmxlbmd0aDwxOTkpcmV0dXJuIHMucHVzaChbdCxlXSksdGhpcy5zaXplPSsrci5zaXplLHRoaXM7cj10aGlzLl9fZGF0YV9fPW5ldyBYKHMpfXJldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZT1yLnNpemUsdGhpc307ZnVuY3Rpb24gbHModCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IFg7KytlPHI7KXRoaXMuYWRkKHRbZV0pfWZ1bmN0aW9uIGhzKHQsZSl7Zm9yKHZhciByPS0xLHM9bnVsbD09dD8wOnQubGVuZ3RoOysrcjxzOylpZihlKHRbcl0scix0KSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBjcyh0LGUpe3JldHVybiB0LmhhcyhlKX1scy5wcm90b3R5cGUuYWRkPWxzLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIiksdGhpc30sbHMucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O3ZhciBmcz0xLG1zPTI7ZnVuY3Rpb24gZ3ModCxlLHIscyxuLG8pe3ZhciBpPXImZnMsdT10Lmxlbmd0aCxhPWUubGVuZ3RoO2lmKHUhPWEmJiEoaSYmYT51KSlyZXR1cm4hMTt2YXIgbD1vLmdldCh0KSxoPW8uZ2V0KGUpO2lmKGwmJmgpcmV0dXJuIGw9PWUmJmg9PXQ7dmFyIGM9LTEsZj0hMCxtPXImbXM/bmV3IGxzOnZvaWQgMDtmb3Ioby5zZXQodCxlKSxvLnNldChlLHQpOysrYzx1Oyl7dmFyIGc9dFtjXSx3PWVbY107aWYocyl2YXIgcD1pP3ModyxnLGMsZSx0LG8pOnMoZyx3LGMsdCxlLG8pO2lmKHZvaWQgMCE9PXApe2lmKHApY29udGludWU7Zj0hMTticmVha31pZihtKXtpZighaHMoZSwoZnVuY3Rpb24odCxlKXtpZighY3MobSxlKSYmKGc9PT10fHxuKGcsdCxyLHMsbykpKXJldHVybiBtLnB1c2goZSl9KSkpe2Y9ITE7YnJlYWt9fWVsc2UgaWYoZyE9PXcmJiFuKGcsdyxyLHMsbykpe2Y9ITE7YnJlYWt9fXJldHVybiBvLmRlbGV0ZSh0KSxvLmRlbGV0ZShlKSxmfXZhciB3cz1zLlVpbnQ4QXJyYXk7ZnVuY3Rpb24gcHModCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQscyl7clsrK2VdPVtzLHRdfSkpLHJ9ZnVuY3Rpb24gZHModCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3JbKytlXT10fSkpLHJ9dmFyIHlzPTEsYnM9MixNcz0iW29iamVjdCBCb29sZWFuXSIsdnM9IltvYmplY3QgRGF0ZV0iLHhzPSJbb2JqZWN0IEVycm9yXSIsRXM9IltvYmplY3QgTWFwXSIsU3M9IltvYmplY3QgTnVtYmVyXSIsX3M9IltvYmplY3QgUmVnRXhwXSIsanM9IltvYmplY3QgU2V0XSIsQXM9IltvYmplY3QgU3RyaW5nXSIsUnM9IltvYmplY3QgU3ltYm9sXSIsSXM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixDcz0iW29iamVjdCBEYXRhVmlld10iLE5zPW4/bi5wcm90b3R5cGU6dm9pZCAwLGtzPU5zP05zLnZhbHVlT2Y6dm9pZCAwO3ZhciBUcz1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLEZzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsT3M9RnM/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLHM9bnVsbD09dD8wOnQubGVuZ3RoLG49MCxvPVtdOysrcjxzOyl7dmFyIGk9dFtyXTtlKGkscix0KSYmKG9bbisrXT1pKX1yZXR1cm4gb30oRnModCksKGZ1bmN0aW9uKGUpe3JldHVybiBUcy5jYWxsKHQsZSl9KSkpfTpmdW5jdGlvbigpe3JldHVybltdfSxWcz1PcztmdW5jdGlvbiB6cyhlKXtyZXR1cm4gZnVuY3Rpb24oZSxyLHMpe3ZhciBuPXIoZSk7cmV0dXJuIHQoZSk/bjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxzPWUubGVuZ3RoLG49dC5sZW5ndGg7KytyPHM7KXRbbityXT1lW3JdO3JldHVybiB0fShuLHMoZSkpfShlLHNzLFZzKX12YXIgRHM9MSxQcz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBxcz0xLCRzPSJbb2JqZWN0IEFyZ3VtZW50c10iLExzPSJbb2JqZWN0IEFycmF5XSIsVXM9IltvYmplY3QgT2JqZWN0XSIsR3M9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBCcyhlLHIscyxuLG8saSl7dmFyIHU9dChlKSxhPXQociksbD11P0xzOlZ0KGUpLGg9YT9MczpWdChyKSxjPShsPWw9PSRzP1VzOmwpPT1VcyxmPShoPWg9PSRzP1VzOmgpPT1VcyxtPWw9PWg7aWYobSYmVXIoZSkpe2lmKCFVcihyKSlyZXR1cm4hMTt1PSEwLGM9ITF9aWYobSYmIWMpcmV0dXJuIGl8fChpPW5ldyBhcyksdXx8dHMoZSk/Z3MoZSxyLHMsbixvLGkpOmZ1bmN0aW9uKHQsZSxyLHMsbixvLGkpe3N3aXRjaChyKXtjYXNlIENzOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSBJczpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhbyhuZXcgd3ModCksbmV3IHdzKGUpKSk7Y2FzZSBNczpjYXNlIHZzOmNhc2UgU3M6cmV0dXJuIFUoK3QsK2UpO2Nhc2UgeHM6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIF9zOmNhc2UgQXM6cmV0dXJuIHQ9PWUrIiI7Y2FzZSBFczp2YXIgdT1wcztjYXNlIGpzOnZhciBhPXMmeXM7aWYodXx8KHU9ZHMpLHQuc2l6ZSE9ZS5zaXplJiYhYSlyZXR1cm4hMTt2YXIgbD1pLmdldCh0KTtpZihsKXJldHVybiBsPT1lO3N8PWJzLGkuc2V0KHQsZSk7dmFyIGg9Z3ModSh0KSx1KGUpLHMsbixvLGkpO3JldHVybiBpLmRlbGV0ZSh0KSxoO2Nhc2UgUnM6aWYoa3MpcmV0dXJuIGtzLmNhbGwodCk9PWtzLmNhbGwoZSl9cmV0dXJuITF9KGUscixsLHMsbixvLGkpO2lmKCEocyZxcykpe3ZhciBnPWMmJkdzLmNhbGwoZSwiX193cmFwcGVkX18iKSx3PWYmJkdzLmNhbGwociwiX193cmFwcGVkX18iKTtpZihnfHx3KXt2YXIgcD1nP2UudmFsdWUoKTplLGQ9dz9yLnZhbHVlKCk6cjtyZXR1cm4gaXx8KGk9bmV3IGFzKSxvKHAsZCxzLG4saSl9fXJldHVybiEhbSYmKGl8fChpPW5ldyBhcyksZnVuY3Rpb24odCxlLHIscyxuLG8pe3ZhciBpPXImRHMsdT16cyh0KSxhPXUubGVuZ3RoO2lmKGEhPXpzKGUpLmxlbmd0aCYmIWkpcmV0dXJuITE7Zm9yKHZhciBsPWE7bC0tOyl7dmFyIGg9dVtsXTtpZighKGk/aCBpbiBlOlBzLmNhbGwoZSxoKSkpcmV0dXJuITF9dmFyIGM9by5nZXQodCksZj1vLmdldChlKTtpZihjJiZmKXJldHVybiBjPT1lJiZmPT10O3ZhciBtPSEwO28uc2V0KHQsZSksby5zZXQoZSx0KTtmb3IodmFyIGc9aTsrK2w8YTspe3ZhciB3PXRbaD11W2xdXSxwPWVbaF07aWYocyl2YXIgZD1pP3MocCx3LGgsZSx0LG8pOnModyxwLGgsdCxlLG8pO2lmKCEodm9pZCAwPT09ZD93PT09cHx8bih3LHAscixzLG8pOmQpKXttPSExO2JyZWFrfWd8fChnPSJjb25zdHJ1Y3RvciI9PWgpfWlmKG0mJiFnKXt2YXIgeT10LmNvbnN0cnVjdG9yLGI9ZS5jb25zdHJ1Y3Rvcjt5PT1ifHwhKCJjb25zdHJ1Y3RvciJpbiB0KXx8ISgiY29uc3RydWN0b3IiaW4gZSl8fCJmdW5jdGlvbiI9PXR5cGVvZiB5JiZ5IGluc3RhbmNlb2YgeSYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBifHwobT0hMSl9cmV0dXJuIG8uZGVsZXRlKHQpLG8uZGVsZXRlKGUpLG19KGUscixzLG4sbyxpKSl9ZnVuY3Rpb24gV3ModCxlLHIscyxuKXtyZXR1cm4gdD09PWV8fChudWxsPT10fHxudWxsPT1lfHwhZyh0KSYmIWcoZSk/dCE9dCYmZSE9ZTpCcyh0LGUscixzLFdzLG4pKX12YXIgS3M9MSxRcz0yO2Z1bmN0aW9uIFhzKHQpe3JldHVybiB0PT10JiYhTSh0KX1mdW5jdGlvbiBZcyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gbnVsbCE9ciYmKHJbdF09PT1lJiYodm9pZCAwIT09ZXx8dCBpbiBPYmplY3QocikpKX19ZnVuY3Rpb24gSnModCl7dmFyIGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXNzKHQpLHI9ZS5sZW5ndGg7ci0tOyl7dmFyIHM9ZVtyXSxuPXRbc107ZVtyXT1bcyxuLFhzKG4pXX1yZXR1cm4gZX0odCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP1lzKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24ocil7cmV0dXJuIHI9PT10fHxmdW5jdGlvbih0LGUscixzKXt2YXIgbj1yLmxlbmd0aCxvPW4saT0hcztpZihudWxsPT10KXJldHVybiFvO2Zvcih0PU9iamVjdCh0KTtuLS07KXt2YXIgdT1yW25dO2lmKGkmJnVbMl0/dVsxXSE9PXRbdVswXV06ISh1WzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK248bzspe3ZhciBhPSh1PXJbbl0pWzBdLGw9dFthXSxoPXVbMV07aWYoaSYmdVsyXSl7aWYodm9pZCAwPT09bCYmIShhIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGM9bmV3IGFzO2lmKHMpdmFyIGY9cyhsLGgsYSx0LGUsYyk7aWYoISh2b2lkIDA9PT1mP1dzKGgsbCxLc3xRcyxzLGMpOmYpKXJldHVybiExfX1yZXR1cm4hMH0ocix0LGUpfX1mdW5jdGlvbiBIcyh0LGUpe3JldHVybiBudWxsIT10JiZlIGluIE9iamVjdCh0KX1mdW5jdGlvbiBacyhlLHIpe3JldHVybiBudWxsIT1lJiZmdW5jdGlvbihlLHIscyl7Zm9yKHZhciBuPS0xLG89KHI9Y3QocixlKSkubGVuZ3RoLGk9ITE7KytuPG87KXt2YXIgdT1tdChyW25dKTtpZighKGk9bnVsbCE9ZSYmcyhlLHUpKSlicmVhaztlPWVbdV19cmV0dXJuIGl8fCsrbiE9bz9pOiEhKG89bnVsbD09ZT8wOmUubGVuZ3RoKSYmRHQobykmJldyKHUsbykmJih0KGUpfHxQcihlKSl9KGUscixIcyl9dmFyIHRuPTEsZW49MjtmdW5jdGlvbiBybih0KXtyZXR1cm4gYih0KT8kdChtdCh0KSk6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBndChlLHQpfX0odCl9ZnVuY3Rpb24gc24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpudWxsPT1lP2lzOiJvYmplY3QiPT10eXBlb2YgZT90KGUpPyhyPWVbMF0scz1lWzFdLGIocikmJlhzKHMpP1lzKG10KHIpLHMpOmZ1bmN0aW9uKHQpe3ZhciBlPXd0KHQscik7cmV0dXJuIHZvaWQgMD09PWUmJmU9PT1zP1pzKHQscik6V3MocyxlLHRufGVuKX0pOkpzKGUpOnJuKGUpO3ZhciByLHN9ZnVuY3Rpb24gbm4odCxlKXt2YXIgcj0tMSxzPVB0KHQpP0FycmF5KHQubGVuZ3RoKTpbXTtyZXR1cm4gb3ModCwoZnVuY3Rpb24odCxuLG8pe3NbKytyXT1lKHQsbixvKX0pKSxzfWZ1bmN0aW9uIG9uKGUscil7cmV0dXJuKHQoZSk/b3Q6bm4pKGUsc24ocikpfWZ1bmN0aW9uIHVuKHQpe3JldHVybiBudWxsPT10P1tdOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG90KGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpfSh0LHNzKHQpKX1mdW5jdGlvbiBhbih0LGUpe2lmKCF1ZSh0KSlyZXR1cm57fTtpZighY2UoZSkpcmV0dXJue307bGV0IHI9e307cmV0dXJuIHVzKGUsKGZ1bmN0aW9uKGUpeyhmdW5jdGlvbih0LGUpe3JldHVybiEhdWUodCkmJiEoIWdlKGUpJiYhd2UoZSkpJiZlIGluIHR9KSh0LGUpJiYocltlXT13dCh0LGUpKX0pKSxyfXZhciBsbj17fSxobj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NsYXNzIGNue2NvbnN0cnVjdG9yKHQpe3RoaXMuZ2V0Q29zdD0oKT0+dGhpcy5FbGVtZW50cy5tYXAoKHQ9PnQuRGlzdGFuY2VGcm9tTWVkb2lkKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmRCZXN0TWVkb2lkSWR4PXQ9PnRoaXMuRWxlbWVudHMubWFwKChlPT50aGlzLmNhbGNDb3N0Rm9yR2l2ZW5FbGVtZW50QXNNZWRvaWQoZSx0KSkpLnJlZHVjZSgoKHQsZSxyLHMpPT5lLkNvc3RJZk1hZGVNZWRvaWQ8c1t0XS5Db3N0SWZNYWRlTWVkb2lkP3I6dCksMCksdGhpcy5jYWxjQ29zdEZvckdpdmVuRWxlbWVudEFzTWVkb2lkPSh0LGUpPT4oe0Nvc3RJZk1hZGVNZWRvaWQ6bmV3IGNuKHtFbGVtZW50czp0aGlzLkVsZW1lbnRzLm1hcCgocj0+KHtEaXN0YW5jZUZyb21NZWRvaWQ6ZShyLkVsZW1lbnQsdC5FbGVtZW50KSxFbGVtZW50OnIuRWxlbWVudH0pKSksTWVkb2lkOnQuRWxlbWVudH0pLmdldENvc3QoKSxFbGVtZW50OnR9KSx0aGlzLkVsZW1lbnRzPXQuRWxlbWVudHMsdGhpcy5NZWRvaWQ9dC5NZWRvaWR9fWhuLkNsdXN0ZXI9Y247dmFyIGZuPXt9LG1uPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShtbiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbW4uZGlzdGFuY2U9KHQsZSk9PntpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGlucHV0cyBtdXN0IGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uIik7Y29uc3Qgcj1BcnJheS5mcm9tKHQua2V5cygpKS5tYXAoKHI9Pk1hdGgucG93KE1hdGguYWJzKHRbcl0tZVtyXSksMikpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApO3JldHVybiBNYXRoLnNxcnQocil9O3ZhciBnbj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZ24sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGduLmtHdEVsZW1lbnRBcnJMZW5ndGg9ImsgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3Qgd249bW4scG49Z24sZG49aG47Y2xhc3MgeW57Y29uc3RydWN0b3IodCxlLHIpe3RoaXMuRWxlbWVudHM9dCx0aGlzLks9ZSx0aGlzLkRpc3RhbmNlRm49cix0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZD0hMSx0aGlzLml0ZXJhdGU9KCk9Pnt0aGlzLkl0ZXJhdGlvbkNvdW50KyssdGhpcy5DbHVzdGVyc3x8dGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHQ9dGhpcy5NZWRvaWRzLGU9dGhpcy5DbHVzdGVycyxyPXRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTtsZXQgcz1yO2ZvcihsZXQgdD0wO3Q8dGhpcy5NZWRvaWRzLmxlbmd0aDt0Kyspe2NvbnN0IGU9dD0+MD09PXRoaXMuTWVkb2lkcy5maWx0ZXIoKGU9PjA9PT10aGlzLkRpc3RhbmNlRm4odCxlKSkpLmxlbmd0aDtmb3IoY29uc3QgciBvZiB0aGlzLkVsZW1lbnRzLmZpbHRlcihlKSl7Y29uc3QgZT10aGlzLk1lZG9pZHMuc2xpY2UoKTtlW3RdPXI7Y29uc3Qgbj1uZXcgeW4odGhpcy5FbGVtZW50cy5zbGljZSgpLHRoaXMuSyx0aGlzLkRpc3RhbmNlRm4pO24uTWVkb2lkcz1lLG4uYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHMoKTtjb25zdCBvPW4uY2FsY3VsYXRlQ3VycmVudENvc3QoKTtvPHMmJihzPW8sdGhpcy5DbHVzdGVycz1uLkNsdXN0ZXJzLHRoaXMuTWVkb2lkcz1lKX19cmV0dXJuIHRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTxyfHwodGhpcy5DbHVzdGVycz1lLHRoaXMuTWVkb2lkcz10LHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSEwLCExKX0sdGhpcy5nZXRDbHVzdGVyZWREYXRhPSgpPT4odGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWR8fHRoaXMucnVuVG9Db21wbGV0aW9uKCksdGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuRWxlbWVudHMubWFwKCh0PT50LkVsZW1lbnQpKSkpKSx0aGlzLnJ1blRvQ29tcGxldGlvbj0oKT0+e2Zvcig7dGhpcy5pdGVyYXRlKCk7KTt9LHRoaXMuYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHM9KCk9Pnt0aGlzLkNsdXN0ZXJzPW5ldyBBcnJheSx0aGlzLk1lZG9pZHMuZm9yRWFjaCgodD0+e3RoaXMuQ2x1c3RlcnMucHVzaChuZXcgZG4uQ2x1c3Rlcih7RWxlbWVudHM6W10sTWVkb2lkOnR9KSl9KSksdGhpcy5FbGVtZW50cy5mb3JFYWNoKCgodCxlKT0+e2NvbnN0IHI9dGhpcy5maW5kRGlzdGFuY2VzKHRoaXMuQ2x1c3RlcnMubWFwKCh0PT50Lk1lZG9pZCkpLHQpLHM9ci5yZWR1Y2UoKCh0LGUscixzKT0+ZTxzW3RdP3I6dCksMCk7dGhpcy5DbHVzdGVyc1tzXS5FbGVtZW50cy5wdXNoKHtEaXN0YW5jZUZyb21NZWRvaWQ6cltzXSxFbGVtZW50OnR9KX0pKX0sdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdD0oKT0+dGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuZ2V0Q29zdCgpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmREaXN0YW5jZXM9KHQsZSk9PnQubWFwKCh0PT50aGlzLkRpc3RhbmNlRm4odCxlKSkpLHRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHM9KCk9PntpZih0aGlzLks+PXRoaXMuRWxlbWVudHMubGVuZ3RoKXRocm93IHBuLmtHdEVsZW1lbnRBcnJMZW5ndGg7Y29uc3QgdD1bXSxlPSh0LGUpPT57Zm9yKGNvbnN0IHIgb2YgZSlpZigwPT09dGhpcy5EaXN0YW5jZUZuKHIsdCkpcmV0dXJuITE7cmV0dXJuITB9O2xldCByPTA7Zm9yKDtyPHRoaXMuRWxlbWVudHMubGVuZ3RoJiZ0Lmxlbmd0aDx0aGlzLks7KWUodGhpcy5FbGVtZW50c1tyXSx0KSYmdC5wdXNoKHRoaXMuRWxlbWVudHNbcl0pLHIrKztyZXR1cm4gdH0sdGhpcy5EaXN0YW5jZUZuPXRoaXMuRGlzdGFuY2VGbnx8d24uZGlzdGFuY2UsdGhpcy5NZWRvaWRzPXRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHMoKSx0aGlzLkl0ZXJhdGlvbkNvdW50PTB9Z2V0IE9wdGltaXNhdGlvblN0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5JdGVyYXRpb25Db3VudD4wfX15bi5jbHVzdGVyRWxlbWVudHM9KHQsZSxyKT0+e3luLmdldEluc3RhbmNlKHQsZSxyKTtyZXR1cm4gbmV3IEFycmF5fSx5bi5nZXRJbnN0YW5jZT0odCxlLHIpPT5uZXcgeW4odCxlLHIpLGZuLkNsdXN0ZXJlcj15bixmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgciBpbiBlKXQuaGFzT3duUHJvcGVydHkocil8fCh0W3JdPWVbcl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKGhuKSxlKGZuKX0obG4pO3ZhciBibj1UZShsbik7ZnVuY3Rpb24gTW4odCxlKXtsZXQgcj0wO2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXIrPSh0W3NdLWVbc10pKih0W3NdLWVbc10pO3JldHVybiByfWNvbnN0IHZuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24geG4odCxlPXt9KXtjb25zdHttaW5MZW5ndGg6cn09ZTtpZighZnVuY3Rpb24odCl7Y29uc3QgZT12bi5jYWxsKHQpO3JldHVybiBlLmVuZHNXaXRoKCJBcnJheV0iKSYmIWUuaW5jbHVkZXMoIkJpZyIpfSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7aWYoIm51bWJlciIhPXR5cGVvZiB0WzBdKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgY29udGFpbiBudW1iZXJzIik7aWYociYmdC5sZW5ndGg8cil0aHJvdyBuZXcgRXJyb3IoYGlucHV0IG11c3QgaGF2ZSBhIGxlbmd0aCBvZiBhdCBsZWFzdCAke3J9YCl9ZnVuY3Rpb24gRW4odCxlLHI9e30pe2NvbnN0e3NvcnRlZDpzPSEwfT1yO2lmKHMpe2xldCByPTAscz10Lmxlbmd0aC0xLG49MDtmb3IoO3Mtcj4xOylpZihuPXIrKHMtcj4+MSksdFtuXTxlKXI9bjtlbHNle2lmKCEodFtuXT5lKSlyZXR1cm4gbjtzPW59cmV0dXJuIHI8dC5sZW5ndGgtMT9NYXRoLmFicyhlLXRbcl0pPE1hdGguYWJzKHRbcisxXS1lKT9yOnIrMTpyfXtsZXQgcj0wLHM9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBvPU1hdGguYWJzKHRbbl0tZSk7bzxzJiYocz1vLHI9bil9cmV0dXJuIHJ9fWZ1bmN0aW9uIFNuKHQsZT17fSl7bGV0e2Zyb21JbmRleDpyLHRvSW5kZXg6c309ZTtjb25zdHtmcm9tOm4sdG86b309ZTtyZXR1cm4gdm9pZCAwPT09ciYmKHI9dm9pZCAwIT09bj9Fbih0LG4pOjApLHZvaWQgMD09PXMmJihzPXZvaWQgMCE9PW8/RW4odCxvKTp0Lmxlbmd0aC0xKSxyPDAmJihyPTApLHM8MCYmKHM9MCkscj49dC5sZW5ndGgmJihyPXQubGVuZ3RoLTEpLHM+PXQubGVuZ3RoJiYocz10Lmxlbmd0aC0xKSxyPnMmJihbcixzXT1bcyxyXSkse2Zyb21JbmRleDpyLHRvSW5kZXg6c319ZnVuY3Rpb24gX24odCxlPXt9KXt4bih0KTtjb25zdHtmcm9tSW5kZXg6cix0b0luZGV4OnN9PVNuKHQsZSk7bGV0IG49dFtyXTtmb3IobGV0IGU9cisxO2U8PXM7ZSsrKW4rPXRbZV07cmV0dXJuIG4vKHMtcisxKX1mdW5jdGlvbiBqbih0LGUpe2NvbnN0IHI9NjU1MzUmKHQ+Pj49MCk7cmV0dXJuKCh0LXIpKihlPj4+PTApPj4+MCkrciplPj4+MH1jbGFzcyBBbntyYW5kb207c3RhdGU7Y29uc3RydWN0b3IodD1EYXRlLm5vdygpKXt0aGlzLnN0YXRlPW5ldyBVaW50MzJBcnJheSg0KSx0aGlzLmluaXQodCksdGhpcy5yYW5kb209dGhpcy5nZXRGbG9hdC5iaW5kKHRoaXMpfWdldFVpbnQzMigpe3JldHVybiB0aGlzLm5leHRTdGF0ZSgpLHRoaXMuc3RhdGVbM10rdGhpcy5zdGF0ZVsyXT4+PjB9Z2V0RmxvYXQoKXtyZXR1cm4gNS45NjA0NjQ0Nzc1MzkwNjNlLTgqKHRoaXMuZ2V0VWludDMyKCk+Pj44KX1pbml0KHQpe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoInNlZWQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7dGhpcy5zdGF0ZVswXT10LHRoaXMuc3RhdGVbMV09MCx0aGlzLnN0YXRlWzJdPTAsdGhpcy5zdGF0ZVszXT0wO2ZvcihsZXQgdD0xO3Q8ODt0KyspdGhpcy5zdGF0ZVszJnRdXj10K2puKDE4MTI0MzMyNTMsdGhpcy5zdGF0ZVt0LTEmM11edGhpcy5zdGF0ZVt0LTEmM10+Pj4zMD4+PjApPj4+MDt0aGlzLnBlcmlvZENlcnRpZmljYXRpb24oKTtmb3IobGV0IHQ9MDt0PDg7dCsrKXRoaXMubmV4dFN0YXRlKCl9cGVyaW9kQ2VydGlmaWNhdGlvbigpezA9PT10aGlzLnN0YXRlWzBdJiYwPT09dGhpcy5zdGF0ZVsxXSYmMD09PXRoaXMuc3RhdGVbMl0mJjA9PT10aGlzLnN0YXRlWzNdJiYodGhpcy5zdGF0ZVswXT04OCx0aGlzLnN0YXRlWzFdPTgzLHRoaXMuc3RhdGVbMl09NjUsdGhpcy5zdGF0ZVszXT02OCl9bmV4dFN0YXRlKCl7bGV0IHQ9dGhpcy5zdGF0ZVswXTt0Xj10PDwxNSx0Xj10Pj4+MTgsdF49dGhpcy5zdGF0ZVszXTw8MTEsdGhpcy5zdGF0ZVswXT10aGlzLnN0YXRlWzFdLHRoaXMuc3RhdGVbMV09dGhpcy5zdGF0ZVsyXSx0aGlzLnN0YXRlWzJdPXRoaXMuc3RhdGVbM10sdGhpcy5zdGF0ZVszXT10fX1mdW5jdGlvbiBSbih0LGU9e30pe3huKHQpO2NvbnN0e2Zyb21JbmRleDpyLHRvSW5kZXg6c309U24odCxlKTtsZXQgbj10W3JdO2ZvcihsZXQgZT1yKzE7ZTw9cztlKyspbis9dFtlXTtyZXR1cm4gbn1jb25zdCBJbj17ZGlzdGFuY2VGdW5jdGlvbjpNbn07ZnVuY3Rpb24gQ24odCxlLHI9SW4pe2NvbnN0IHM9ci5kaXN0YW5jZUZ1bmN0aW9ufHxJbi5kaXN0YW5jZUZ1bmN0aW9uLG49ci5zaW1pbGFyaXR5RnVuY3Rpb258fEluLnNpbWlsYXJpdHlGdW5jdGlvbjtsZXQgbz0tMTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbil7bGV0IHI9TnVtYmVyLk1JTl9WQUxVRTtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKyl7Y29uc3QgaT1uKGUsdFtzXSk7aT5yJiYocj1pLG89cyl9fWVsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHMpdGhyb3cgbmV3IEVycm9yKCJBIHNpbWlsYXJpdHkgb3IgZGlzdGFuY2UgZnVuY3Rpb24gaXQncyByZXF1aXJlZCIpO3tsZXQgcj1OdW1iZXIuTUFYX1ZBTFVFO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPXMoZSx0W25dKTtpPHImJihyPWksbz1uKX19fXJldHVybiBvfWZ1bmN0aW9uIE5uKHQsZSxyLHMpe2NvbnN0IG49e2Rpc3RhbmNlRnVuY3Rpb246c307Zm9yKGxldCBzPTA7czx0Lmxlbmd0aDtzKyspcltzXT1DbihlLHRbc10sbik7cmV0dXJuIHJ9Y2xhc3Mga257Y2x1c3RlcnM7Y2VudHJvaWRzO2NvbnZlcmdlZDtpdGVyYXRpb25zO2Rpc3RhbmNlO2NvbnN0cnVjdG9yKHQsZSxyLHMsbil7dGhpcy5jbHVzdGVycz10LHRoaXMuY2VudHJvaWRzPWUsdGhpcy5jb252ZXJnZWQ9cix0aGlzLml0ZXJhdGlvbnM9cyx0aGlzLmRpc3RhbmNlPW59bmVhcmVzdCh0KXtjb25zdCBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7cmV0dXJuIE5uKHQsdGhpcy5jZW50cm9pZHMsZSx0aGlzLmRpc3RhbmNlKX1jb21wdXRlSW5mb3JtYXRpb24odCl7Y29uc3QgZT10aGlzLmNlbnRyb2lkcy5tYXAoKCgpPT5bXSkpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKXtjb25zdCBzPXRoaXMuY2x1c3RlcnNbcl07ZVtzXS5wdXNoKHRoaXMuZGlzdGFuY2UodFtyXSx0aGlzLmNlbnRyb2lkc1tzXSkpfXJldHVybiB0aGlzLmNlbnRyb2lkcy5tYXAoKCh0LHIpPT57Y29uc3Qgcz1lW3JdO3JldHVybntjZW50cm9pZDp0LGVycm9yOnMubGVuZ3RoPjA/X24ocyk6LTEsc2l6ZTpzLmxlbmd0aH19KSl9fWZ1bmN0aW9uIFRuKHQsZT17fSxyPU1hdGgucmFuZG9tKXtjb25zdHtzaXplOnM9MSxyZXBsYWNlOm49ITEscHJvYmFiaWxpdGllczpvfT1lO2xldCBpLHU7aWYoaT0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaChyKTtyZXR1cm4gZX0odCk6dC5zbGljZSgpLG8pe2lmKCFuKXRocm93IG5ldyBFcnJvcigiY2hvaWNlIHdpdGggcHJvYmFiaWxpdGllcyBhbmQgbm8gcmVwbGFjZW1lbnQgaXMgbm90IGltcGxlbWVudGVkIik7aWYoby5sZW5ndGghPT1pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSBsZW5ndGggb2YgcHJvYmFiaWxpdGllcyBvcHRpb24gc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgY2hvaWNlcyIpO3U9W29bMF1dO2ZvcihsZXQgdD0xO3Q8by5sZW5ndGg7dCsrKXVbdF09dVt0LTFdK29bdF07aWYoTWF0aC5hYnMoMS11LmF0KC0xKSk+MWUtOCl0aHJvdyBuZXcgRXJyb3IoYHByb2JhYmlsaXRpZXMgc2hvdWxkIHN1bSB0byAxLCBidXQgaW5zdGVhZCBzdW1zIHRvICR7dS5hdCgtMSl9YCl9aWYoIW4mJnM+aS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzaXplIG9wdGlvbiBpcyB0b28gbGFyZ2UiKTtjb25zdCBhPVtdO2ZvcihsZXQgdD0wO3Q8czt0Kyspe2NvbnN0IHQ9Rm4oaS5sZW5ndGgscix1KTthLnB1c2goaVt0XSksbnx8aS5zcGxpY2UodCwxKX1yZXR1cm4gYX1mdW5jdGlvbiBGbih0LGUscil7Y29uc3Qgcz1lKCk7aWYocil7bGV0IHQ9MDtmb3IoO3M+clt0XTspdCsrO3JldHVybiB0fXJldHVybiBNYXRoLmZsb29yKHMqdCl9Y2xhc3MgT257cmFuZG9tR2VuZXJhdG9yO2NvbnN0cnVjdG9yKHQ9TWF0aC5yYW5kb20pe2lmKCJudW1iZXIiPT10eXBlb2YgdCl7Y29uc3QgZT1uZXcgQW4odCk7dGhpcy5yYW5kb21HZW5lcmF0b3I9ZS5yYW5kb219ZWxzZSB0aGlzLnJhbmRvbUdlbmVyYXRvcj10fWNob2ljZSh0LGUpe3JldHVybiBUbih0LGUsdGhpcy5yYW5kb21HZW5lcmF0b3IpfXJhbmRvbSgpe3JldHVybiB0aGlzLnJhbmRvbUdlbmVyYXRvcigpfXJhbmRJbnQodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PTApLHQrTWF0aC5mbG9vcih0aGlzLnJhbmRvbUdlbmVyYXRvcigpKihlLXQpKX1yYW5kb21TYW1wbGUodCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLnJhbmRvbSgpKTtyZXR1cm4gZX19ZnVuY3Rpb24gVm4odCxlKXtjb25zdCByPW5ldyBqcih0LnJvd3MsZS5yb3dzKTtmb3IobGV0IHM9MDtzPHQucm93cztzKyspZm9yKGxldCBuPTA7bjxlLnJvd3M7bisrKXIuc2V0KHMsbixNbih0LmdldFJvdyhzKSxlLmdldFJvdyhuKSkpO3JldHVybiByfWNvbnN0IHpuPXttYXhJdGVyYXRpb25zOjEwMCx0b2xlcmFuY2U6MWUtNixpbml0aWFsaXphdGlvbjoia21lYW5zKysiLGRpc3RhbmNlRnVuY3Rpb246TW59O2Z1bmN0aW9uIERuKHQsZSxyLHMsbixvKXtjb25zdCBpPWZ1bmN0aW9uKHQsZSxyLHMpe2NvbnN0IG49ZVswXS5sZW5ndGgsbz1uZXcgQXJyYXkocyksaT1uZXcgQXJyYXkocyk7Zm9yKGxldCB0PTA7dDxzO3QrKyl7b1t0XT1uZXcgQXJyYXkobiksaVt0XT0wO2ZvcihsZXQgZT0wO2U8bjtlKyspb1t0XVtlXT0wfWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtpW3JbdF1dKys7Zm9yKGxldCBzPTA7czxuO3MrKylvW3JbdF1dW3NdKz1lW3RdW3NdfWZvcihsZXQgZT0wO2U8cztlKyspZm9yKGxldCByPTA7cjxuO3IrKylpW2VdP29bZV1bcl0vPWlbZV06b1tlXVtyXT10W2VdW3JdO3JldHVybiBvfSh0LGUscj1ObihlLHQscixuLmRpc3RhbmNlRnVuY3Rpb24pLHMpLHU9ZnVuY3Rpb24odCxlLHIscyl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYocih0W25dLGVbbl0pPnMpcmV0dXJuITE7cmV0dXJuITB9KGksdCxuLmRpc3RhbmNlRnVuY3Rpb24sbi50b2xlcmFuY2UpO3JldHVybiBuZXcga24ocixpLHUsbyxuLmRpc3RhbmNlRnVuY3Rpb24pfWZ1bmN0aW9uIFBuKHQsZSxyKXtjb25zdCBzPWZ1bmN0aW9uKHQpe3JldHVybnsuLi56biwuLi50fX0ocik7IWZ1bmN0aW9uKHQsZSl7aWYoZTw9MHx8ZT50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIoZSkpdGhyb3cgbmV3IEVycm9yKCJLIHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgcG9pbnRzIil9KHQsZSk7bGV0IG49ZnVuY3Rpb24odCxlLHIpe2xldCBzO2lmKEFycmF5LmlzQXJyYXkoci5pbml0aWFsaXphdGlvbikpe2lmKHIuaW5pdGlhbGl6YXRpb24ubGVuZ3RoIT09ZSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBpbml0aWFsIGNlbnRlcnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIEsiKTtzPXIuaW5pdGlhbGl6YXRpb259ZWxzZSBzd2l0Y2goci5pbml0aWFsaXphdGlvbil7Y2FzZSJrbWVhbnMrKyI6cz1mdW5jdGlvbih0LGUscj17fSl7Y29uc3Qgcz1uZXcganIodCksbj1zLnJvd3Msbz1uZXcgT24oci5zZWVkKSxpPVtdLHU9ci5sb2NhbFRyaWFsc3x8MitNYXRoLmZsb29yKE1hdGgubG9nKGUpKSxhPW8ucmFuZEludChuKTtpLnB1c2gocy5nZXRSb3coYSkpO2xldCBsPW5ldyBqcigxLHMucm93cyk7Zm9yKGxldCB0PTA7dDxzLnJvd3M7dCsrKWwuc2V0KDAsdCxNbihzLmdldFJvdyh0KSxpWzBdKSk7bGV0IGg9anIubXVsKGwsMS9SbihsLmdldFJvdygwKSkpO2ZvcihsZXQgdD0xO3Q8ZTt0Kyspe2NvbnN0IGU9by5jaG9pY2Uobix7cmVwbGFjZTohMCxzaXplOnUscHJvYmFiaWxpdGllczpoLmdldFJvdygwKX0pLHI9Vm4ocy5zdWJNYXRyaXhSb3coZSkscyk7bGV0IGE9MS8wLGM9MS8wLGY9bDtmb3IobGV0IHQ9MDt0PHU7dCsrKXtjb25zdCBzPWpyLm1pbihsLFtyLmdldFJvdyh0KV0pLG49cy5zdW0oKTtuPGMmJihhPWVbdF0sYz1uLGY9cyl9aVt0XT1zLmdldFJvdyhhKSxsPWYsaD1qci5tdWwobCwxL1JuKGwuZ2V0Um93KDApKSl9cmV0dXJuIGl9KHQsZSxyKTticmVhaztjYXNlInJhbmRvbSI6cz1mdW5jdGlvbih0LGUscil7cmV0dXJuIG5ldyBPbihyKS5jaG9pY2UodCx7c2l6ZTplfSl9KHQsZSxyLnNlZWQpO2JyZWFrO2Nhc2UibW9zdERpc3RhbnQiOnM9ZnVuY3Rpb24odCxlLHIscyl7Y29uc3Qgbj1uZXcgT24ocyksbz1uZXcgQXJyYXkoZSk7aWYob1swXT1NYXRoLmZsb29yKG4ucmFuZG9tKCkqdC5sZW5ndGgpLGU+MSl7Y29uc3Qgcz17ZGlzdDotMSxpbmRleDotMX07Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDsrK2UpcltvWzBdXVtlXT5zLmRpc3QmJihzLmRpc3Q9cltvWzBdXVtlXSxzLmluZGV4PWUpO2lmKG9bMV09cy5pbmRleCxlPjIpZm9yKGxldCBzPTI7czxlOysrcyl7bGV0IGU9e2Rpc3Q6LTEsaW5kZXg6LTF9O2ZvcihsZXQgbj0wO248dC5sZW5ndGg7KytuKXtsZXQgdD17ZGlzdDpOdW1iZXIuTUFYX1ZBTFVFLGluZGV4Oi0xfTtpZighby5pbmNsdWRlcyhuKSlmb3IobGV0IGU9MDtlPHM7KytlKXJbb1tlXV1bbl08dC5kaXN0JiYodD17ZGlzdDpyW29bZV1dW25dLGluZGV4Om59KTt0LmRpc3QhPT1OdW1iZXIuTUFYX1ZBTFVFJiZ0LmRpc3Q+ZS5kaXN0JiYoZT17Li4udH0pfW9bc109ZS5pbmRleH19cmV0dXJuIG8ubWFwKChlPT50W2VdKSl9KHQsZSxmdW5jdGlvbih0LGUpe2NvbnN0IHI9bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoOysrZSlyW2VdPW5ldyBBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCBzPTA7czx0Lmxlbmd0aDsrK3MpZm9yKGxldCBuPXM7bjx0Lmxlbmd0aDsrK24pe2NvbnN0IG89ZSh0W3NdLHRbbl0pO3Jbc11bbl09byxyW25dW3NdPW99cmV0dXJuIHJ9KHQsci5kaXN0YW5jZUZ1bmN0aW9uKSxyLnNlZWQpO2JyZWFrO2RlZmF1bHQ6IWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKGAke2V9OiAiJHtTdHJpbmcodCl9ImApfShyLmluaXRpYWxpemF0aW9uLCJVbmtub3duIGluaXRpYWxpemF0aW9uIG1ldGhvZCIpfXJldHVybiBzfSh0LGUscyk7MD09PXMubWF4SXRlcmF0aW9ucyYmKHMubWF4SXRlcmF0aW9ucz1OdW1iZXIuTUFYX1ZBTFVFKTtjb25zdCBvPW5ldyBBcnJheSh0Lmxlbmd0aCk7bGV0IGksdT0hMSxhPTA7Zm9yKDshdSYmYTxzLm1heEl0ZXJhdGlvbnM7KWk9RG4obix0LG8sZSxzLCsrYSksdT1pLmNvbnZlcmdlZCxuPWkuY2VudHJvaWRzO2lmKCFpKXRocm93IG5ldyBFcnJvcigidW5yZWFjaGFibGU6IG5vIGttZWFucyBzdGVwIGV4ZWN1dGVkIik7cmV0dXJuIGl9Y2xhc3MgcW57Y29uc3RydWN0b3IodCl7dGhpcy5yb3dzPXR9bGVuKCl7cmV0dXJuIHRoaXMucm93cy5sZW5ndGh9aXNTcXVhcmUoKXtjb25zdCB0PXRoaXMucm93cy5sZW5ndGg7Zm9yKGxldCBlPTA7ZTx0O2UrKylpZih0aGlzLnJvd3NbZV0ubGVuZ3RoIT09dClyZXR1cm4hMTtyZXR1cm4hMH1nZXQodCxlKXtyZXR1cm4gdGhpcy5yb3dzW3RdW2VdfX1jb25zdCAkbj00Mjk0OTY3Mjk1O2NsYXNzIExue2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5pPXQsdGhpcy5kPWV9Y2xvbmUoKXtyZXR1cm4gbmV3IExuKHRoaXMuaSx0aGlzLmQpfXN0YXRpYyBlbXB0eSgpe3JldHVybiBuZXcgTG4oJG4sMCl9fWNsYXNzIFVue2NvbnN0cnVjdG9yKHQsZSxyLHMpe3RoaXMubmVhcj1uZXcgTG4odCxlKSx0aGlzLnNlY289bmV3IExuKHIscyl9Y2xvbmUoKXtyZXR1cm4gbmV3IFVuKHRoaXMubmVhci5pLHRoaXMubmVhci5kLHRoaXMuc2Vjby5pLHRoaXMuc2Vjby5kKX1zdGF0aWMgZW1wdHkoKXtyZXR1cm4gbmV3IFVuKCRuLDAsJG4sMCl9fWZ1bmN0aW9uIEduKHQsZSxyKXtjb25zdCBzPSh0PWZ1bmN0aW9uKHQpe2lmKHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmdldCYmImZ1bmN0aW9uIj09dHlwZW9mIHQubGVuKXJldHVybiB0O2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIG5ldyBxbih0KTt0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIG1hdHJpeCBpbnB1dDogcHJvdmlkZSBhIDJEIGFycmF5LCBhIERlbnNlTWF0cml4LCBvciBhIExvd2VyVHJpYW5nbGUiKX0odCkpLmxlbigpLG49ZS5sZW5ndGg7aWYoMT09PW4pe2NvbnN0IHI9bmV3IEFycmF5KHMpLmZpbGwoMCksW24sb109ZnVuY3Rpb24odCxlLHIscyl7Y29uc3Qgbj1yW3NdO2xldCBvPW4saT0wO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKW4hPT1yJiZlW3JdPT09cyYmKGkrPXQuZ2V0KG4scikpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKHIhPT1uJiZlW3JdPT09cyl7bGV0IG49MDtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKylvIT09ciYmZVtvXT09PXMmJihuKz10LmdldChyLG8pKTtuPGkmJihvPXIsaT1uKX1yZXR1cm4gcltzXT1vLFtvIT09bixpXX0odCxyLGUsMCk7cmV0dXJue2xvc3M6byxhc3NpOnIsbkl0ZXI6MSxuU3dhcHM6bj8xOjB9fWxldFtvLGldPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10LmxlbigpLHM9ZS5sZW5ndGg7aWYoIXQuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIkRpc3NpbWlsYXJpdHkgbWF0cml4IGlzIG5vdCBzcXVhcmUiKTtpZighKHI8PSRuKSl0aHJvdyBuZXcgRXJyb3IoIk4gaXMgdG9vIGxhcmdlIik7aWYoIShzPjAmJnM8JG4pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBOIik7aWYoIShzPD1yKSl0aHJvdyBuZXcgRXJyb3IoImsgbXVzdCBiZSBhdCBtb3N0IE4iKTtjb25zdCBuPUFycmF5LmZyb20oe2xlbmd0aDp0LmxlbigpfSwoKCk9PlVuLmVtcHR5KCkpKSxvPWVbMF07bGV0IGk9MDtmb3IobGV0IHI9MDtyPG4ubGVuZ3RoO3IrKyl7bltyXT1uZXcgVW4oMCx0LmdldChyLG8pLCRuLDApO2NvbnN0IHM9bltyXTtmb3IobGV0IG49MTtuPGUubGVuZ3RoO24rKyl7Y29uc3Qgbz1lW25dLGk9dC5nZXQocixvKTtpPHMubmVhci5kfHxyPT09bz8ocy5zZWNvPXMubmVhci5jbG9uZSgpLHMubmVhcj1uZXcgTG4obixpKSk6KHMuc2Vjby5pPT09JG58fGk8cy5zZWNvLmQpJiYocy5zZWNvPW5ldyBMbihuLGkpKX1pKz1zLm5lYXIuZH1yZXR1cm5baSxuXX0odCxlKSx1PW5ldyBBcnJheShuKS5maWxsKDApO1duKGksdSk7bGV0IGE9cyxsPTAsaD0wO2Zvcig7aDxyOyl7aCs9MTtjb25zdCByPWwsbj1vO2ZvcihsZXQgcj0wO3I8cyYmciE9PWE7cisrKXtpZihyPT09ZVtpW3JdLm5lYXIuaV0pY29udGludWU7Y29uc3RbcyxuXT1Cbih0LHUsaSxyKTtzPj0wfHwobCs9MSxhPXIsbz1Rbih0LGUsaSxuLHIpLFduKGksdSkpfWlmKGw9PT1yfHxvPj1uKWJyZWFrfXJldHVybntsb3NzOm8sYXNzaTppLm1hcCgodD0+dC5uZWFyLmkpKSxuSXRlcjpoLG5Td2FwczpsfX1mdW5jdGlvbiBCbih0LGUscixzKXtjb25zdCBuPWUuc2xpY2UoKTtsZXQgbz0wO2ZvcihsZXQgZT0wO2U8ci5sZW5ndGg7ZSsrKXtjb25zdCBpPXJbZV0sdT10LmdldChlLHMpO3U8aS5uZWFyLmQ/KG8rPXUtaS5uZWFyLmQsbltpLm5lYXIuaV0rPWkubmVhci5kLWkuc2Vjby5kKTp1PGkuc2Vjby5kJiYobltpLm5lYXIuaV0rPXUtaS5zZWNvLmQpfWNvbnN0W2ksdV09ZnVuY3Rpb24odCl7bGV0IGU9MCxyPXRbMF07Zm9yKGxldCBzPTE7czx0Lmxlbmd0aDtzKyspdFtzXTxyJiYoZT1zLHI9dFtzXSk7cmV0dXJuW2Uscl19KG4pO3JldHVyblt1K28saV19ZnVuY3Rpb24gV24odCxlKXtlLmZpbGwoMCk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IHM9dFtyXTtlW3MubmVhci5pXSs9cy5zZWNvLmQtcy5uZWFyLmR9fWZ1bmN0aW9uIEtuKHQsZSxyLHMsbixvKXtsZXQgaT1uZXcgTG4ocyxvKTtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl7Y29uc3QgdT1lW29dO2lmKG89PT1yfHxvPT09cyljb250aW51ZTtjb25zdCBhPXQuZ2V0KG4sdSk7YTxpLmQmJihpPW5ldyBMbihvLGEpKX1yZXR1cm4gaX1mdW5jdGlvbiBRbih0LGUscixzLG4pe2NvbnN0IG89dC5sZW4oKTtpZighKHM8ZS5sZW5ndGgpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBtZWRvaWQgbnVtYmVyIik7aWYoIShuPG8pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBvYmplY3QgbnVtYmVyIik7ZVtzXT1uO2xldCBpPTA7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKyspe2NvbnN0IHU9cltvXTtpZihvPT09bil7dS5uZWFyLmkhPT1zJiYodS5zZWNvPXUubmVhci5jbG9uZSgpKSx1Lm5lYXI9bmV3IExuKHMsMCksaSs9MDtjb250aW51ZX1jb25zdCBhPXQuZ2V0KG8sbik7dS5uZWFyLmk9PT1zP2E8dS5zZWNvLmQ/dS5uZWFyPW5ldyBMbihzLGEpOih1Lm5lYXI9dS5zZWNvLmNsb25lKCksdS5zZWNvPUtuKHQsZSx1Lm5lYXIuaSxzLG8sYSkpOmE8dS5uZWFyLmQ/KHUuc2Vjbz11Lm5lYXIuY2xvbmUoKSx1Lm5lYXI9bmV3IExuKHMsYSkpOmE8dS5zZWNvLmQ/dS5zZWNvPW5ldyBMbihzLGEpOnUuc2Vjby5pPT09cyYmKHUuc2Vjbz1Lbih0LGUsdS5uZWFyLmkscyxvLGEpKSxpKz11Lm5lYXIuZH1yZXR1cm4gaX1mdW5jdGlvbiBYbih0LGUpe2xldCByPTA7Zm9yKGxldCBzPTA7czx0Lmxlbmd0aDtzKyspe2xldCBuPXRbc10tZVtzXTtyKz1uKm59cmV0dXJuIE1hdGguc3FydChyKX1mdW5jdGlvbiBZbih0LGUscil7bGV0IHM9dC5sZW5ndGgsbj1fKHIpP3I6WG47bGV0IG89QXJyYXkuZnJvbSh7bGVuZ3RoOnN9LCgoKT0+bmV3IEZsb2F0NjRBcnJheShzKSkpO2ZvcihsZXQgZT0wO2U8cztlKyspZm9yKGxldCByPWUrMTtyPHM7cisrKXtsZXQgcz1uKHRbZV0sdFtyXSk7b1tlXVtyXT1zLG9bcl1bZV09c312YXIgaTtsZXQgdT1HbihvLChpPWUsQXJyYXkuZnJvbSh7bGVuZ3RoOml9LCgodCxlKT0+ZSkpKSwxMDApLGE9e307cmV0dXJuIHVzKHUuYXNzaSwoKHQsZSk9PnthW3RdfHwoYVt0XT1bXSksYVt0XS5wdXNoKGUpfSkpLHVuKGEpfWFzeW5jIGZ1bmN0aW9uIEpuKHQsZSxyPXt9KXtsZXQgcz13dChyLCJmdW5EaXN0IixudWxsKTtyZXR1cm4ic2ltcGxlIj09PXd0KHIsInVzZU1ldGhvZCIsImZhc3RlclBBTSIpP2Z1bmN0aW9uKHQsZSxyKXtsZXQgcz1uZXcgTWFwO3VzKHQsKCh0LGUpPT57cy5zZXQodCxlKX0pKTtsZXQgbj1ibi5DbHVzdGVyZXIuZ2V0SW5zdGFuY2UodCxlLHIpLmdldENsdXN0ZXJlZERhdGEoKTtyZXR1cm4gbj1vbihuLCh0PT5vbih0LCh0PT5zLmdldCh0KSkpKSksbn0odCxlLHMpOlluKHQsZSxzKX1hc3luYyBmdW5jdGlvbiBIbih0LGU9e30pe2xldCByPXd0KGUsImtOdW1iZXIiKTtyPXdlKHIpP2tlKHIpOjI7bGV0IHM9d3QoZSwibW9kZSIpOyJrLW1lZG9pZHMiIT09cyYmImstbWVhbnMiIT09cyYmKHM9ImstbWVkb2lkcyIpO2xldCBuLG89d3QoZSwic2VlZCIsbnVsbCksaT13dChlLCJmdW5EaXN0IixudWxsKSx1PXd0KGUsInVzZU1ldGhvZCIsImZhc3RlclBBTSIpO2lmKCJrLW1lZG9pZHMiPT09cyluPWF3YWl0IEpuKHQscix7ZnVuRGlzdDppLHVzZU1ldGhvZDp1fSk7ZWxzZXtpZigiay1tZWFucyIhPT1zKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBtb2RlWyR7c31dYCk7bj1hd2FpdCBhc3luYyBmdW5jdGlvbih0LGUscj17fSl7bGV0IHM9d3Qociwic2VlZCIsbnVsbCksbj17fTtudWxsIT09cyYmKG49e3NlZWQ6c30pO2xldCBvPVBuKHQsZSxuKSxpPXt9O3JldHVybiB1cyhvLmNsdXN0ZXJzLCgodCxlKT0+e2lbdF18fChpW3RdPVtdKSxpW3RdLnB1c2goZSl9KSksdW4oaSl9KHQscix7c2VlZDpvfSl9cmV0dXJuIG59YXN5bmMgZnVuY3Rpb24gWm4odCxlPXt9KXtpZighY2UodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9d3QoZSwia051bWJlciIsbnVsbCk7d2Uocil8fChyPTIpLHI9a2Uocik7bGV0IHM9d3QoZSwidXNlUENBIixudWxsKTttZShzKXx8KHM9ITApO2xldCBuPXd0KGUsIm5Db21wTklQQUxTIixudWxsKTt3ZShuKXx8KG49Miksbj1rZShuKTtsZXQgbz13dChlLCJtb2RlIixudWxsKSxpPXd0KGUsInNlZWQiLG51bGwpLHU9d3QoZSwiZnVuRGlzdCIsbnVsbCksYT13dChlLCJ1c2VNZXRob2QiLCJmYXN0ZXJQQU0iKSxsPSIiLGg9b2UodCksYz0wLGY9MDtpZih1cyh0LCh0PT57IWZ1bmN0aW9uKHQpe2lmKHVlKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMX0odCk/Y2UodCkmJihmKz0xKTpjKz0xfSkpLGM9PT1oKWw9Im9iaiI7ZWxzZXtpZihmIT09aCl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IG9mIHRoZSBzYW1lIHR5cGUiKTtsPSJtYXQifWxldCBtLGc9bnVsbDsib2JqIj09PWw/KGc9ZnVuY3Rpb24odCl7bGV0IGU9e307dXModCwodD0+e3VzKHQsKCh0LHIpPT57ZVtyXXx8KGVbcl09MCksMD09PWVbcl0mJndlKHQpJiYoZVtyXT0xKSwxIT09ZVtyXXx8d2UodCl8fChlW3JdPS0xKX0pKX0pKTtsZXQgcj1bXTtyZXR1cm4gdXMoZSwoKHQsZSk9PnsxPT09dCYmci5wdXNoKGUpfSkpLHJ9KHQpLG09ZnVuY3Rpb24odCxlKXtyZXR1cm4gb24odCwodD0+dW4oYW4odCxlKSkpKX0odCxnKSk6bT10O2xldCB3PW07cyYmKHc9TnIobSx7bkNvbXBOSVBBTFM6bn0pKTtsZXQgcD1hd2FpdCBIbih3LHtrTnVtYmVyOnIsbW9kZTpvLHNlZWQ6aSxmdW5EaXN0OnUsdXNlTWV0aG9kOmF9KTtyZXR1cm57a2V5czpnLGdpbmRzOnAsZ21hdDpvbihwLCh0PT5vbih0LCh0PT53W3RdKSkpKSxnbHRkdDpvbihwLChlPT5vbihlLChlPT50W2VdKSkpKX19bGV0IFdDbHVzdGVyPXtQQ0E6YXN5bmMgZnVuY3Rpb24odCxlPXt9KXtyZXR1cm4gTnIodCxlKX0sY2x1c3Rlcjphc3luYyBmdW5jdGlvbih0LGU9e30pe3RyeXtyZXR1cm4gYXdhaXQgWm4odCxlKX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9fX07CgpsZXQgaW5zdGFuY2UgPSBudWxsCmZ1bmN0aW9uIGluaXQoaW5wdXQpewoKICAgIC8vaW5pdAogICAgbGV0IHIKICAgIAogICAgICAgIHIgPSBXQ2x1c3RlciguLi5pbnB1dCkKICAgICAgICAKCiAgICAvL29uCiAgICAKCiAgICAvL3NhdmUKICAgIGluc3RhbmNlID0gcgoKfQoKZnVuY3Rpb24gc2VuZE1lc3NhZ2UoZGF0YSkgewogICAgCiAgICAgICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZShkYXRhKQogICAgICAgIAp9Cgphc3luYyBmdW5jdGlvbiBydW4oZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciBydW4nLGRhdGEpCgogICAgLy9tb2RlCiAgICBsZXQgbW9kZSA9IGRhdGEubW9kZQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgIT09ICdpbml0JyAmJiBtb2RlICE9PSAnY2FsbCcpewogICAgICAgIHJldHVybgogICAgfQoKICAgIC8vaW5pdAogICAgaWYobW9kZSA9PT0gJ2luaXQnKXsKICAgICAgICAKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL3R5cGUKICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGUKCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAogICAgCiAgICAgICAgICAgIC8vaW5zdGFuY2UKICAgICAgICAgICAgaWYodHlwZSA9PT0gJ2Z1bmN0aW9uJyl7CiAgICAgICAgICAgICAgICBpbml0KC4uLmlucHV0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZSA9PT0gJ29iamVjdCcpewogICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBXQ2x1c3RlcgogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgIAogICAgICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgICAgICBtb2RlOiAnZW1pdCcsCiAgICAgICAgICAgICAgICBldk5hbWU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtc2c6IGVyciwKICAgICAgICAgICAgfQogICAgICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgICAgIH0KICAgICAgICAgICAgCiAgICB9CgogICAgLy9jaGVjawogICAgaWYobW9kZSA9PT0gJ2NhbGwnKXsKICAgICAgICBsZXQgc3RhdGUgPSAnJwogICAgICAgIGxldCBtc2cgPSBudWxsCgogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vZnVuCiAgICAgICAgICAgIGxldCBmdW4gPSBpbnN0YW5jZVtkYXRhLmZ1bl0KCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAoKICAgICAgICAgICAgLy9leGVjCiAgICAgICAgICAgIGF3YWl0IGZ1biguLi5pbnB1dCkKICAgICAgICAgICAgICAgIC50aGVuKChzdWMpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nc3VjY2VzcycKICAgICAgICAgICAgICAgICAgICBtc2c9c3VjCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nZXJyb3InCiAgICAgICAgICAgICAgICAgICAgbXNnPWVycgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgICAgIHN0YXRlID0gJ2Vycm9yJwogICAgICAgICAgICBtc2cgPSBlcnIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgIG1vZGU6ICdyZXR1cm4nLAogICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgZnVuOiBkYXRhLmZ1biwKICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgIG1zZywKICAgICAgICB9CiAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgIH0KCn0KCmZ1bmN0aW9uIHJlY3ZNZXNzYWdlKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcmVjdjonLCBkYXRhKQoKICAgIC8vZGF0YVJlY3YKICAgIGxldCBkYXRhUmVjdiA9IGRhdGEKCiAgICAvL3J1bgogICAgcnVuKGRhdGFSZWN2KQoKfQoKCiAgICAgICAgcGFyZW50UG9ydC5vbignbWVzc2FnZScsIHJlY3ZNZXNzYWdlKQogICAgICAgIAoKdHJ5ewoKICAgIC8v5YOF5LuldW5jYXVnaHRFeGNlcHRpb25Nb25pdG9y6KiY6YyELCDkuI3lj6/oqLvlhop1bmNhdWdodEV4Y2VwdGlvbuiIh3VuaGFuZGxlZFJlamVjdGlvbuebo+iBvToKICAgIC8v5pa8d29ya2Vy5YWn6Ki75YaK5q2k5LqM55uj6IG95pyD6Zi75q2iTm9kZemgkOioreeahHdvcmtlcue1guatouihjOeCuiwg5L2/d29ya2Vy5bSp5r2w5b6M5LuN5a2Y5rS756m66L2JLAogICAgLy/lpJblsaTmlLbkuI3liLBlcnJvci9leGl05LqL5Lu2LCBwZW5kaW5nIHByb21pc2XmsLjkuYXmh7jnva4sIOS4lOWtmOa0u+aureWxjXdvcmtlcuacg+S7pOWuv+S4u+eoi+W6j+eEoeazlemAgOWHujsKICAgIC8v56e76Zmk5b6Md29ya2Vy5L6d6aCQ6Kit6KGM54K65q275LqhLCBlcnJvcuS6i+S7tuWCs+iHs+WkluWxpCwg55Sx5aSW5bGk5pW05om5cmVqZWN0IHBlbmRpbmcKICAgIC8vIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChlcnIpID0+IHsKICAgIC8vICAgICBjb25zb2xlLmxvZygnaW5uZXI6dW5oYW5kbGVkUmVqZWN0aW9uJywgZXJyKQogICAgLy8gfSkKICAgIC8vIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgKGVycikgPT4gewogICAgLy8gICAgIGNvbnNvbGUubG9nKCdpbm5lcjp1bmNhdWdodEV4Y2VwdGlvbicsIGVycikKICAgIC8vIH0pCiAgICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbk1vbml0b3InLCAoZXJyKSA9PiB7CiAgICAgICAgY29uc29sZS5sb2coJ2lubmVyOnVuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvcicsIGVycikKICAgIH0pCgp9CmNhdGNoKGVycil7fQoK",Buffer.from(y,"base64").toString("utf8"));var y;function m(){let c=l(),Z={},y=!1,m=!1;function K(d){for(let l in Z){let b=Z[l];delete Z[l],c.removeAllListeners(l),b.reject(d)}c.emit("error",d)}function p(d){y||(y=!0,K(d))}let I=function(l){try{return new d.Worker(l,{eval:!0})}catch(d){p(d)}}(G);return I?(I.on("message",(function(d){let l=d,Z=l.mode;"emit"!==Z&&"return"!==Z||("emit"===Z&&c.emit(l.evName,l.msg),"return"===Z&&c.emit(l.id,l))})),I.on("error",p),I.on("exit",(d=>{m||p("worker exit, code["+d+"]")})),function(){let d={mode:"init",type:"object",input:[...arguments]};I.postMessage(d)}([...arguments]),c.PCA=function(){let d=b();if(y)return d.reject("worker is dead"),d;let l=X();Z[l]=d;let G={mode:"call",id:l,fun:"PCA",input:[...arguments]};return I.postMessage(G),c.once(l,(c=>{delete Z[l],"success"===c.state?d.resolve(c.msg):d.reject(c.msg)})),d},c.cluster=function(){let d=b();if(y)return d.reject("worker is dead"),d;let l=X();Z[l]=d;let G={mode:"call",id:l,fun:"cluster",input:[...arguments]};return I.postMessage(G),c.once(l,(c=>{delete Z[l],"success"===c.state?d.resolve(c.msg):d.reject(c.msg)})),d},c.terminate=function(){I?(m=!0,I.terminate(),I=void 0):K("worker has been terminated")},c):(p("invalid worker"),null)}let K={PCA:async function(){let d=[...arguments],l=m();return await l.PCA(...d).finally((()=>{l.terminate()}))},cluster:async function(){let d=[...arguments],l=m();return await l.cluster(...d).finally((()=>{l.terminate()}))}};Z=l();for(let d in K){let l=K[d];Z[d]=l}}();try{process.on("uncaughtExceptionMonitor",(d=>{console.log("outer:uncaughtExceptionMonitor",d)}))}catch(d){}return Z}(d)}({get exports(){return l},set exports(d){l=d}});var c=l,Z={};!function(d,l){d.exports=function(){const d="function"==typeof TextDecoder?new TextDecoder("utf-8",{ignoreBOM:!0}):void 0,l=("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=")),c=(d=>{let l={};return d.forEach(((d,c)=>l[d]=c)),l})(l),Z=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,b=String.fromCharCode.bind(String),X="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):d=>new Uint8Array(Array.prototype.slice.call(d,0)),G=d=>d.replace(/[^A-Za-z0-9\+\/]/g,""),y=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,m=d=>{switch(d.length){case 4:var l=((7&d.charCodeAt(0))<<18|(63&d.charCodeAt(1))<<12|(63&d.charCodeAt(2))<<6|63&d.charCodeAt(3))-65536;return b(55296+(l>>>10))+b(56320+(1023&l));case 3:return b((15&d.charCodeAt(0))<<12|(63&d.charCodeAt(1))<<6|63&d.charCodeAt(2));default:return b((31&d.charCodeAt(0))<<6|63&d.charCodeAt(1))}},K=d=>d.replace(y,m),p=d=>{if(d=d.replace(/\s+/g,""),!Z.test(d))throw new TypeError("malformed base64.");let l,X,G;d+="==".slice(2-(3&d.length));let y=[];for(let Z=0;Z<d.length;)l=c[d.charAt(Z++)]<<18|c[d.charAt(Z++)]<<12|(X=c[d.charAt(Z++)])<<6|(G=c[d.charAt(Z++)]),64===X?y.push(b(l>>16&255)):64===G?y.push(b(l>>16&255,l>>8&255)):y.push(b(l>>16&255,l>>8&255,255&l));return y.join("")},I="function"==typeof atob?d=>atob(G(d)):p,W="function"==typeof Uint8Array.fromBase64?d=>Uint8Array.fromBase64(d):d=>X(I(d).split("").map((d=>d.charCodeAt(0)))),V=d?l=>d.decode(W(l)):d=>K(I(d)),u=d=>G(d.replace(/[-_]/g,(d=>"-"==d?"+":"/"))),h=d=>V(u(d)),H=h;var s={};!function(d){var l=Object.prototype.hasOwnProperty,c="~";function Z(){}function b(d,l,c){this.fn=d,this.context=l,this.once=c||!1}function X(d,l,Z,X,G){if("function"!=typeof Z)throw new TypeError("The listener must be a function");var y=new b(Z,X||d,G),m=c?c+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],y]:d._events[m].push(y):(d._events[m]=y,d._eventsCount++),d}function G(d,l){0==--d._eventsCount?d._events=new Z:delete d._events[l]}function y(){this._events=new Z,this._eventsCount=0}Object.create&&(Z.prototype=Object.create(null),(new Z).__proto__||(c=!1)),y.prototype.eventNames=function(){var d,Z,b=[];if(0===this._eventsCount)return b;for(Z in d=this._events)l.call(d,Z)&&b.push(c?Z.slice(1):Z);return Object.getOwnPropertySymbols?b.concat(Object.getOwnPropertySymbols(d)):b},y.prototype.listeners=function(d){var l=c?c+d:d,Z=this._events[l];if(!Z)return[];if(Z.fn)return[Z.fn];for(var b=0,X=Z.length,G=new Array(X);b<X;b++)G[b]=Z[b].fn;return G},y.prototype.listenerCount=function(d){var l=c?c+d:d,Z=this._events[l];return Z?Z.fn?1:Z.length:0},y.prototype.emit=function(d,l,Z,b,X,G){var y=c?c+d:d;if(!this._events[y])return!1;var m,K,p=this._events[y],I=arguments.length;if(p.fn){switch(p.once&&this.removeListener(d,p.fn,void 0,!0),I){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,l),!0;case 3:return p.fn.call(p.context,l,Z),!0;case 4:return p.fn.call(p.context,l,Z,b),!0;case 5:return p.fn.call(p.context,l,Z,b,X),!0;case 6:return p.fn.call(p.context,l,Z,b,X,G),!0}for(K=1,m=new Array(I-1);K<I;K++)m[K-1]=arguments[K];p.fn.apply(p.context,m)}else{var W,V=p.length;for(K=0;K<V;K++)switch(p[K].once&&this.removeListener(d,p[K].fn,void 0,!0),I){case 1:p[K].fn.call(p[K].context);break;case 2:p[K].fn.call(p[K].context,l);break;case 3:p[K].fn.call(p[K].context,l,Z);break;case 4:p[K].fn.call(p[K].context,l,Z,b);break;default:if(!m)for(W=1,m=new Array(I-1);W<I;W++)m[W-1]=arguments[W];p[K].fn.apply(p[K].context,m)}}return!0},y.prototype.on=function(d,l,c){return X(this,d,l,c,!1)},y.prototype.once=function(d,l,c){return X(this,d,l,c,!0)},y.prototype.removeListener=function(d,l,Z,b){var X=c?c+d:d;if(!this._events[X])return this;if(!l)return G(this,X),this;var y=this._events[X];if(y.fn)y.fn!==l||b&&!y.once||Z&&y.context!==Z||G(this,X);else{for(var m=0,K=[],p=y.length;m<p;m++)(y[m].fn!==l||b&&!y[m].once||Z&&y[m].context!==Z)&&K.push(y[m]);K.length?this._events[X]=1===K.length?K[0]:K:G(this,X)}return this},y.prototype.removeAllListeners=function(d){var l;return d?(l=c?c+d:d,this._events[l]&&G(this,l)):(this._events=new Z,this._eventsCount=0),this},y.prototype.off=y.prototype.removeListener,y.prototype.addListener=y.prototype.on,y.prefixed=c,y.EventEmitter=y,d.exports=y}({get exports(){return s},set exports(d){s=d}});var i=s;let L;!function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function d(){return new i}function l(){let d,l,c=new Promise((function(){d=arguments[0],l=arguments[1]}));return c.resolve=d,c.reject=l,c}function c(){let d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Z=c.length;for(let b=0;b<d;b++)l[b]=c[0|Math.random()*Z];return l.join("")}let Z=H("CgoKInVzZSBzdHJpY3QiO3ZhciB0PUFycmF5LmlzQXJyYXksZT0ib2JqZWN0Ij09dHlwZW9mIGdsb2JhbCYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwscj0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLHM9ZXx8cnx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxuPXMuU3ltYm9sLG89T2JqZWN0LnByb3RvdHlwZSxpPW8uaGFzT3duUHJvcGVydHksdT1vLnRvU3RyaW5nLGE9bj9uLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgbD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBoPSJbb2JqZWN0IE51bGxdIixjPSJbb2JqZWN0IFVuZGVmaW5lZF0iLGY9bj9uLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBtKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/YzpoOmYmJmYgaW4gT2JqZWN0KHQpP2Z1bmN0aW9uKHQpe3ZhciBlPWkuY2FsbCh0LGEpLHI9dFthXTt0cnl7dFthXT12b2lkIDA7dmFyIHM9ITB9Y2F0Y2godCl7fXZhciBuPXUuY2FsbCh0KTtyZXR1cm4gcyYmKGU/dFthXT1yOmRlbGV0ZSB0W2FdKSxufSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gbC5jYWxsKHQpfSh0KX1mdW5jdGlvbiBnKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9dmFyIHc9IltvYmplY3QgU3ltYm9sXSI7ZnVuY3Rpb24gcCh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fGcodCkmJm0odCk9PXd9dmFyIGQ9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8seT0vXlx3KiQvO2Z1bmN0aW9uIGIoZSxyKXtpZih0KGUpKXJldHVybiExO3ZhciBzPXR5cGVvZiBlO3JldHVybiEoIm51bWJlciIhPXMmJiJzeW1ib2wiIT1zJiYiYm9vbGVhbiIhPXMmJm51bGwhPWUmJiFwKGUpKXx8KHkudGVzdChlKXx8IWQudGVzdChlKXx8bnVsbCE9ciYmZSBpbiBPYmplY3QocikpfWZ1bmN0aW9uIE0odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9dmFyIHY9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLHg9IltvYmplY3QgRnVuY3Rpb25dIixFPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsUz0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIF8odCl7aWYoIU0odCkpcmV0dXJuITE7dmFyIGU9bSh0KTtyZXR1cm4gZT09eHx8ZT09RXx8ZT09dnx8ZT09U312YXIgaixBPXNbIl9fY29yZS1qc19zaGFyZWRfXyJdLFI9KGo9L1teLl0rJC8uZXhlYyhBJiZBLmtleXMmJkEua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK2o6IiI7dmFyIEk9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIEModCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBJLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifXZhciBOPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLGs9RnVuY3Rpb24ucHJvdG90eXBlLFQ9T2JqZWN0LnByb3RvdHlwZSxGPWsudG9TdHJpbmcsTz1ULmhhc093blByb3BlcnR5LFY9UmVnRXhwKCJeIitGLmNhbGwoTykucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24geih0KXtyZXR1cm4hKCFNKHQpfHwoZT10LFImJlIgaW4gZSkpJiYoXyh0KT9WOk4pLnRlc3QoQyh0KSk7dmFyIGV9ZnVuY3Rpb24gRCh0LGUpe3ZhciByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnRbZV19KHQsZSk7cmV0dXJuIHoocik/cjp2b2lkIDB9dmFyIFA9RChPYmplY3QsImNyZWF0ZSIpO3ZhciBxPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyICQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBMKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgcz10W2VdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fWZ1bmN0aW9uIFUodCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9ZnVuY3Rpb24gRyh0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKFUodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX1MLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189UD9QKG51bGwpOnt9LHRoaXMuc2l6ZT0wfSxMLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LEwucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKFApe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gcS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LEwucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBQP3ZvaWQgMCE9PWVbdF06JC5jYWxsKGUsdCl9LEwucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09UCYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTt2YXIgQj1BcnJheS5wcm90b3R5cGUuc3BsaWNlO2Z1bmN0aW9uIFcodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBzPXRbZV07dGhpcy5zZXQoc1swXSxzWzFdKX19Vy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfSxXLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPUcoZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6Qi5jYWxsKGUsciwxKSwtLXRoaXMuc2l6ZSwhMCl9LFcucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9RyhlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19LFcucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gRyh0aGlzLl9fZGF0YV9fLHQpPi0xfSxXLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLHM9RyhyLHQpO3JldHVybiBzPDA/KCsrdGhpcy5zaXplLHIucHVzaChbdCxlXSkpOnJbc11bMV09ZSx0aGlzfTt2YXIgSz1EKHMsIk1hcCIpO2Z1bmN0aW9uIFEodCxlKXt2YXIgcixzLG49dC5fX2RhdGFfXztyZXR1cm4oInN0cmluZyI9PShzPXR5cGVvZihyPWUpKXx8Im51bWJlciI9PXN8fCJzeW1ib2wiPT1zfHwiYm9vbGVhbiI9PXM/Il9fcHJvdG9fXyIhPT1yOm51bGw9PT1yKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIFgodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBzPXRbZV07dGhpcy5zZXQoc1swXSxzWzFdKX19WC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBMLG1hcDpuZXcoS3x8Vyksc3RyaW5nOm5ldyBMfX0sWC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPVEodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sWC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBRKHRoaXMsdCkuZ2V0KHQpfSxYLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIFEodGhpcyx0KS5oYXModCl9LFgucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPVEodGhpcyx0KSxzPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09cz8wOjEsdGhpc307dmFyIFk9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIEoodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihZKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBzPWFyZ3VtZW50cyxuPWU/ZS5hcHBseSh0aGlzLHMpOnNbMF0sbz1yLmNhY2hlO2lmKG8uaGFzKG4pKXJldHVybiBvLmdldChuKTt2YXIgaT10LmFwcGx5KHRoaXMscyk7cmV0dXJuIHIuY2FjaGU9by5zZXQobixpKXx8byxpfTtyZXR1cm4gci5jYWNoZT1uZXcoSi5DYWNoZXx8WCkscn1KLkNhY2hlPVg7dmFyIEgsWix0dCxldD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxydD0vXFwoXFwpPy9nLHN0PShIPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoZXQsKGZ1bmN0aW9uKHQscixzLG4pe2UucHVzaChzP24ucmVwbGFjZShydCwiJDEiKTpyfHx0KX0pKSxlfSxaPUooSCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PXR0LnNpemUmJnR0LmNsZWFyKCksdH0pKSx0dD1aLmNhY2hlLFopLG50PXN0O2Z1bmN0aW9uIG90KHQsZSl7Zm9yKHZhciByPS0xLHM9bnVsbD09dD8wOnQubGVuZ3RoLG49QXJyYXkocyk7KytyPHM7KW5bcl09ZSh0W3JdLHIsdCk7cmV0dXJuIG59dmFyIGl0PTEvMCx1dD1uP24ucHJvdG90eXBlOnZvaWQgMCxhdD11dD91dC50b1N0cmluZzp2b2lkIDA7ZnVuY3Rpb24gbHQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO2lmKHQoZSkpcmV0dXJuIG90KGUsbHQpKyIiO2lmKHAoZSkpcmV0dXJuIGF0P2F0LmNhbGwoZSk6IiI7dmFyIHI9ZSsiIjtyZXR1cm4iMCI9PXImJjEvZT09LWl0PyItMCI6cn1mdW5jdGlvbiBodCh0KXtyZXR1cm4gbnVsbD09dD8iIjpsdCh0KX1mdW5jdGlvbiBjdChlLHIpe3JldHVybiB0KGUpP2U6YihlLHIpP1tlXTpudChodChlKSl9dmFyIGZ0PTEvMDtmdW5jdGlvbiBtdCh0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fHAodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LWZ0PyItMCI6ZX1mdW5jdGlvbiBndCh0LGUpe2Zvcih2YXIgcj0wLHM9KGU9Y3QoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8czspdD10W210KGVbcisrXSldO3JldHVybiByJiZyPT1zP3Q6dm9pZCAwfWZ1bmN0aW9uIHd0KHQsZSxyKXt2YXIgcz1udWxsPT10P3ZvaWQgMDpndCh0LGUpO3JldHVybiB2b2lkIDA9PT1zP3I6c312YXIgcHQ9T2JqZWN0LnByb3RvdHlwZTt2YXIgZHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQoZShyKSl9fShPYmplY3Qua2V5cyxPYmplY3QpLHl0PWR0LGJ0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gTXQodCl7aWYocj0oZT10KSYmZS5jb25zdHJ1Y3RvcixlIT09KCJmdW5jdGlvbiI9PXR5cGVvZiByJiZyLnByb3RvdHlwZXx8cHQpKXJldHVybiB5dCh0KTt2YXIgZSxyLHM9W107Zm9yKHZhciBuIGluIE9iamVjdCh0KSlidC5jYWxsKHQsbikmJiJjb25zdHJ1Y3RvciIhPW4mJnMucHVzaChuKTtyZXR1cm4gc312YXIgdnQ9RChzLCJEYXRhVmlldyIpLHh0PUQocywiUHJvbWlzZSIpLEV0PUQocywiU2V0IiksU3Q9RChzLCJXZWFrTWFwIiksX3Q9IltvYmplY3QgTWFwXSIsanQ9IltvYmplY3QgUHJvbWlzZV0iLEF0PSJbb2JqZWN0IFNldF0iLFJ0PSJbb2JqZWN0IFdlYWtNYXBdIixJdD0iW29iamVjdCBEYXRhVmlld10iLEN0PUModnQpLE50PUMoSyksa3Q9Qyh4dCksVHQ9QyhFdCksRnQ9QyhTdCksT3Q9bTsodnQmJk90KG5ldyB2dChuZXcgQXJyYXlCdWZmZXIoMSkpKSE9SXR8fEsmJk90KG5ldyBLKSE9X3R8fHh0JiZPdCh4dC5yZXNvbHZlKCkpIT1qdHx8RXQmJk90KG5ldyBFdCkhPUF0fHxTdCYmT3QobmV3IFN0KSE9UnQpJiYoT3Q9ZnVuY3Rpb24odCl7dmFyIGU9bSh0KSxyPSJbb2JqZWN0IE9iamVjdF0iPT1lP3QuY29uc3RydWN0b3I6dm9pZCAwLHM9cj9DKHIpOiIiO2lmKHMpc3dpdGNoKHMpe2Nhc2UgQ3Q6cmV0dXJuIEl0O2Nhc2UgTnQ6cmV0dXJuIF90O2Nhc2Uga3Q6cmV0dXJuIGp0O2Nhc2UgVHQ6cmV0dXJuIEF0O2Nhc2UgRnQ6cmV0dXJuIFJ0fXJldHVybiBlfSk7dmFyIFZ0PU90LHp0PTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gRHQodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PXp0fWZ1bmN0aW9uIFB0KHQpe3JldHVybiBudWxsIT10JiZEdCh0Lmxlbmd0aCkmJiFfKHQpfXZhciBxdD0iW29iamVjdCBTdHJpbmddIjtmdW5jdGlvbiAkdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dm9pZCAwOmVbdF19fXZhciBMdD0kdCgibGVuZ3RoIiksVXQ9UmVnRXhwKCJbXFx1MjAwZFxcdWQ4MDAtXFx1ZGZmZlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZlxcdWZlMGVcXHVmZTBmXSIpO3ZhciBHdD0iXFx1ZDgwMC1cXHVkZmZmIixCdD0iWyIrR3QrIl0iLFd0PSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsS3Q9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsUXQ9IlteIitHdCsiXSIsWHQ9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLFl0PSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixKdD0iKD86IitXdCsifCIrS3QrIikiKyI/IixIdD0iW1xcdWZlMGVcXHVmZTBmXT8iLFp0PUh0K0p0KygiKD86XFx1MjAwZCg/OiIrW1F0LFh0LFl0XS5qb2luKCJ8IikrIikiK0h0K0p0KyIpKiIpLHRlPSIoPzoiK1tRdCtXdCsiPyIsV3QsWHQsWXQsQnRdLmpvaW4oInwiKSsiKSIsZWU9UmVnRXhwKEt0KyIoPz0iK0t0KyIpfCIrdGUrWnQsImciKTtmdW5jdGlvbiByZSh0KXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIFV0LnRlc3QodCl9KHQpP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1lZS5sYXN0SW5kZXg9MDtlZS50ZXN0KHQpOykrK2U7cmV0dXJuIGV9KHQpOkx0KHQpfXZhciBzZT0iW29iamVjdCBNYXBdIixuZT0iW29iamVjdCBTZXRdIjtmdW5jdGlvbiBvZShlKXtpZihudWxsPT1lKXJldHVybiAwO2lmKFB0KGUpKXJldHVybiJzdHJpbmciPT10eXBlb2Yocj1lKXx8IXQocikmJmcocikmJm0ocik9PXF0P3JlKGUpOmUubGVuZ3RoO3ZhciByLHM9VnQoZSk7cmV0dXJuIHM9PXNlfHxzPT1uZT9lLnNpemU6TXQoZSkubGVuZ3RofWZ1bmN0aW9uIGllKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gdWUodCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gYWUodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbGUodCl7cmV0dXJuIHQhPXR9ZnVuY3Rpb24gaGUodCl7cmV0dXJuISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bGxdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe2lmKHVlKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiEoIWFlKHQpfHwiIiE9PXQpfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISFpZSh0KSYmMD09PXQubGVuZ3RofSh0KXx8ISFsZSh0KSkpKSl9ZnVuY3Rpb24gY2UodCl7cmV0dXJuISFpZSh0KSYmKDAhPT10Lmxlbmd0aCYmKDEhPT10Lmxlbmd0aHx8IWhlKHRbMF0pKSl9dmFyIGZlPSJbb2JqZWN0IEJvb2xlYW5dIjtmdW5jdGlvbiBtZSh0KXtyZXR1cm4hMD09PShlPXQpfHwhMT09PWV8fGcoZSkmJm0oZSk9PWZlO3ZhciBlfWZ1bmN0aW9uIGdlKHQpe3JldHVybiEoIWFlKHQpfHwiIj09PXQpfWZ1bmN0aW9uIHdlKHQpe2xldCBlPSExO2lmKGdlKHQpKWU9IWlzTmFOKE51bWJlcih0KSk7ZWxzZSBpZihmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCkpe2lmKGxlKHQpKXJldHVybiExO2U9ITB9cmV0dXJuIGV9dmFyIHBlPS9ccy87dmFyIGRlPS9eXHMrLztmdW5jdGlvbiB5ZSh0KXtyZXR1cm4gdD90LnNsaWNlKDAsZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmcGUudGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX0odCkrMSkucmVwbGFjZShkZSwiIik6dH12YXIgYmU9TmFOLE1lPS9eWy0rXTB4WzAtOWEtZl0rJC9pLHZlPS9eMGJbMDFdKyQvaSx4ZT0vXjBvWzAtN10rJC9pLEVlPXBhcnNlSW50O2Z1bmN0aW9uIFNlKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihwKHQpKXJldHVybiBiZTtpZihNKHQpKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdC52YWx1ZU9mP3QudmFsdWVPZigpOnQ7dD1NKGUpP2UrIiI6ZX1pZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD15ZSh0KTt2YXIgcj12ZS50ZXN0KHQpO3JldHVybiByfHx4ZS50ZXN0KHQpP0VlKHQuc2xpY2UoMikscj8yOjgpOk1lLnRlc3QodCk/YmU6K3R9dmFyIF9lPTEvMCxqZT0xNzk3NjkzMTM0ODYyMzE1N2UyOTI7ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQ/KHQ9U2UodCkpPT09X2V8fHQ9PT0tX2U/KHQ8MD8tMToxKSpqZTp0PT10P3Q6MDowPT09dD90OjB9dmFyIFJlPXMuaXNGaW5pdGUsSWU9TWF0aC5taW47dmFyIENlPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGhbdF07cmV0dXJuIGZ1bmN0aW9uKHQscil7aWYodD1TZSh0KSxyPW51bGw9PXI/MDpJZShmdW5jdGlvbih0KXt2YXIgZT1BZSh0KSxyPWUlMTtyZXR1cm4gZT09ZT9yP2UtcjplOjB9KHIpLDI5MiksciYmUmUodCkpe3ZhciBzPShodCh0KSsiZSIpLnNwbGl0KCJlIik7cmV0dXJuKygocz0oaHQoZShzWzBdKyJlIisoK3NbMV0rcikpKSsiZSIpLnNwbGl0KCJlIikpWzBdKyJlIisoK3NbMV0tcikpfXJldHVybiBlKHQpfX0oInJvdW5kIiksTmU9Q2U7ZnVuY3Rpb24ga2UodCxlPXt9KXtsZXQgcj13dChlLCJ1c2VDbGFtcFNhZmUiLG51bGwpO21lKHIpfHwocj0hMSk7bGV0IHM9d3QoZSwidXNlTGltaXRTYWZlIixudWxsKTttZShzKXx8KHM9ITEpO2xldCBuPXd0KGUsInJldHVybldpdGhTdGF0ZUFuZE1zZyIsbnVsbCk7bWUobil8fChuPSExKTtsZXQgbz10PT5uP3tzdGF0ZToic3VjY2VzcyIsbXNnOnR9OnQsaT10PT57aWYobilyZXR1cm57c3RhdGU6ImVycm9yIixtc2c6dH07dGhyb3cgbmV3IEVycm9yKHQpfTtpZighd2UodCkpcmV0dXJuIG8oMCk7bGV0IHU9bnVsbDt0cnl7dD1mdW5jdGlvbih0KXtyZXR1cm4gd2UodCk/QWUodCk6MH0odCksdT1OZSh0KSxyJiYodT5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUj91PU51bWJlci5NQVhfU0FGRV9JTlRFR0VSOnU8TnVtYmVyLk1JTl9TQUZFX0lOVEVHRVImJih1PU51bWJlci5NSU5fU0FGRV9JTlRFR0VSKSl9Y2F0Y2godCl7cmV0dXJuIGkodC50b1N0cmluZygpKX1yZXR1cm4gcyYmIU51bWJlci5pc1NhZmVJbnRlZ2VyKE51bWJlcih1KSk/aShgdlske3R9XSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTooIjAiPT09U3RyaW5nKHUpJiYodT0wKSxvKHUpKX1mdW5jdGlvbiBUZSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBGZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRmUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IE9lPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gVmUodCl7Y29uc3QgZT1PZS5jYWxsKHQpO3JldHVybiBlLmVuZHNXaXRoKCJBcnJheV0iKSYmIWUuaW5jbHVkZXMoIkJpZyIpfWZ1bmN0aW9uIHplKHQsZT17fSl7aWYoIVZlKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtsZXQgcjtpZih2b2lkIDAhPT1lLm91dHB1dCl7aWYoIVZlKGUub3V0cHV0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvdXRwdXQgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkgaWYgc3BlY2lmaWVkIik7cj1lLm91dHB1dH1lbHNlIHI9bmV3IEFycmF5KHQubGVuZ3RoKTtjb25zdCBzPWZ1bmN0aW9uKHQsZT17fSl7aWYoIVZlKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtjb25zdHtmcm9tSW5kZXg6cj0wLHRvSW5kZXg6cz10Lmxlbmd0aH09ZTtpZihyPDB8fHI+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihyKSl0aHJvdyBuZXcgRXJyb3IoImZyb21JbmRleCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gbGVuZ3RoIik7aWYoczw9cnx8cz50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocykpdGhyb3cgbmV3IEVycm9yKCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCIpO2xldCBuPXRbcl07Zm9yKGxldCBlPXIrMTtlPHM7ZSsrKXRbZV08biYmKG49dFtlXSk7cmV0dXJuIG59KHQpLG49ZnVuY3Rpb24odCxlPXt9KXtpZighVmUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO2NvbnN0e2Zyb21JbmRleDpyPTAsdG9JbmRleDpzPXQubGVuZ3RofT1lO2lmKHI8MHx8cj49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKHIpKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1yfHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7bGV0IG49dFtyXTtmb3IobGV0IGU9cisxO2U8cztlKyspdFtlXT5uJiYobj10W2VdKTtyZXR1cm4gbn0odCk7aWYocz09PW4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbmltdW0gYW5kIG1heGltdW0gaW5wdXQgdmFsdWVzIGFyZSBlcXVhbC4gQ2Fubm90IHJlc2NhbGUgYSBjb25zdGFudCBhcnJheSIpO2NvbnN0e21pbjpvPShlLmF1dG9NaW5NYXg/czowKSxtYXg6aT0oZS5hdXRvTWluTWF4P246MSl9PWU7aWYobz49aSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG9wdGlvbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXggb3B0aW9uIik7Y29uc3QgdT0oaS1vKS8obi1zKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylyW2VdPSh0W2VdLXMpKnUrbztyZXR1cm4gcn1jb25zdCBEZT0iICIucmVwZWF0KDIpLFBlPSIgIi5yZXBlYXQoNCk7ZnVuY3Rpb24gcWUodCxlPXt9KXtjb25zdHttYXhSb3dzOnI9MTUsbWF4Q29sdW1uczpzPTEwLG1heE51bVNpemU6bj04LHBhZE1pbnVzOm89ImF1dG8ifT1lO3JldHVybmAke3QuY29uc3RydWN0b3IubmFtZX0ge1xuJHtEZX1bXG4ke1BlfSR7ZnVuY3Rpb24odCxlLHIscyxuKXtjb25zdHtyb3dzOm8sY29sdW1uczppfT10LHU9TWF0aC5taW4obyxlKSxhPU1hdGgubWluKGksciksbD1bXTtpZigiYXV0byI9PT1uKXtuPSExO3Q6Zm9yKGxldCBlPTA7ZTx1O2UrKylmb3IobGV0IHI9MDtyPGE7cisrKWlmKHQuZ2V0KGUscik8MCl7bj0hMDticmVhayB0fX1mb3IobGV0IGU9MDtlPHU7ZSsrKXtsZXQgcj1bXTtmb3IobGV0IG89MDtvPGE7bysrKXIucHVzaCgkZSh0LmdldChlLG8pLHMsbikpO2wucHVzaChgJHtyLmpvaW4oIiAiKX1gKX1hIT09aSYmKGxbbC5sZW5ndGgtMV0rPWAgLi4uICR7aS1yfSBtb3JlIGNvbHVtbnNgKTt1IT09byYmbC5wdXNoKGAuLi4gJHtvLWV9IG1vcmUgcm93c2ApO3JldHVybiBsLmpvaW4oYFxuJHtQZX1gKX0odCxyLHMsbixvKX1cbiR7RGV9XVxuJHtEZX1yb3dzOiAke3Qucm93c31cbiR7RGV9Y29sdW1uczogJHt0LmNvbHVtbnN9XG59YH1mdW5jdGlvbiAkZSh0LGUscil7cmV0dXJuKHQ+PTAmJnI/YCAke0xlKHQsZS0xKX1gOkxlKHQsZSkpLnBhZEVuZChlKX1mdW5jdGlvbiBMZSh0LGUpe2xldCByPXQudG9TdHJpbmcoKTtpZihyLmxlbmd0aDw9ZSlyZXR1cm4gcjtsZXQgcz10LnRvRml4ZWQoZSk7aWYocy5sZW5ndGg+ZSYmKHM9dC50b0ZpeGVkKE1hdGgubWF4KDAsZS0ocy5sZW5ndGgtZSkpKSkscy5sZW5ndGg8PWUmJiFzLnN0YXJ0c1dpdGgoIjAuMDAwIikmJiFzLnN0YXJ0c1dpdGgoIi0wLjAwMCIpKXJldHVybiBzO2xldCBuPXQudG9FeHBvbmVudGlhbChlKTtyZXR1cm4gbi5sZW5ndGg+ZSYmKG49dC50b0V4cG9uZW50aWFsKE1hdGgubWF4KDAsZS0obi5sZW5ndGgtZSkpKSksbi5zbGljZSgwKX1mdW5jdGlvbiBVZSh0LGUscil7bGV0IHM9cj90LnJvd3M6dC5yb3dzLTE7aWYoZTwwfHxlPnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlJvdyBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBHZSh0LGUscil7bGV0IHM9cj90LmNvbHVtbnM6dC5jb2x1bW5zLTE7aWYoZTwwfHxlPnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBCZSh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMiKTtyZXR1cm4gZX1mdW5jdGlvbiBXZSh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJvd3MiKTtyZXR1cm4gZX1mdW5jdGlvbiBLZSh0LGUpe2lmKCFWZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyb3cgaW5kaWNlcyBtdXN0IGJlIGFuIGFycmF5Iik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXTwwfHxlW3JdPj10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInJvdyBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBRZSh0LGUpe2lmKCFWZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW4gaW5kaWNlcyBtdXN0IGJlIGFuIGFycmF5Iik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXTwwfHxlW3JdPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImNvbHVtbiBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBYZSh0LGUscixzLG4pe2lmKDUhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJleHBlY3RlZCA0IGFyZ3VtZW50cyIpO2lmKEplKCJzdGFydFJvdyIsZSksSmUoImVuZFJvdyIsciksSmUoInN0YXJ0Q29sdW1uIixzKSxKZSgiZW5kQ29sdW1uIixuKSxlPnJ8fHM+bnx8ZTwwfHxlPj10LnJvd3N8fHI8MHx8cj49dC5yb3dzfHxzPDB8fHM+PXQuY29sdW1uc3x8bjwwfHxuPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlN1Ym1hdHJpeCBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBZZSh0LGU9MCl7bGV0IHI9W107Zm9yKGxldCBzPTA7czx0O3MrKylyLnB1c2goZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gSmUodCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0fSBtdXN0IGJlIGEgbnVtYmVyYCl9ZnVuY3Rpb24gSGUodCl7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJFbXB0eSBtYXRyaXggaGFzIG5vIGVsZW1lbnRzIHRvIGluZGV4Iil9Y2xhc3MgWmV7c3RhdGljIGZyb20xREFycmF5KHQsZSxyKXtpZih0KmUhPT1yLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZGF0YSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggZ2l2ZW4gZGltZW5zaW9ucyIpO2xldCBzPW5ldyBlcih0LGUpO2ZvcihsZXQgbj0wO248dDtuKyspZm9yKGxldCB0PTA7dDxlO3QrKylzLnNldChuLHQscltuKmUrdF0pO3JldHVybiBzfXN0YXRpYyByb3dWZWN0b3IodCl7bGV0IGU9bmV3IGVyKDEsdC5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWUuc2V0KDAscix0W3JdKTtyZXR1cm4gZX1zdGF0aWMgY29sdW1uVmVjdG9yKHQpe2xldCBlPW5ldyBlcih0Lmxlbmd0aCwxKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldChyLDAsdFtyXSk7cmV0dXJuIGV9c3RhdGljIHplcm9zKHQsZSl7cmV0dXJuIG5ldyBlcih0LGUpfXN0YXRpYyBvbmVzKHQsZSl7cmV0dXJuIG5ldyBlcih0LGUpLmZpbGwoMSl9c3RhdGljIHJhbmQodCxlLHI9e30pe2lmKCJvYmplY3QiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cmFuZG9tOnM9TWF0aC5yYW5kb219PXI7bGV0IG49bmV3IGVyKHQsZSk7Zm9yKGxldCByPTA7cjx0O3IrKylmb3IobGV0IHQ9MDt0PGU7dCsrKW4uc2V0KHIsdCxzKCkpO3JldHVybiBufXN0YXRpYyByYW5kSW50KHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjpzPTAsbWF4Om49MWUzLHJhbmRvbTpvPU1hdGgucmFuZG9tfT1yO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGFuIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYocz49bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBpPW4tcyx1PW5ldyBlcih0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9cytNYXRoLnJvdW5kKG8oKSppKTt1LnNldChyLHQsZSl9cmV0dXJuIHV9c3RhdGljIGV5ZSh0LGUscil7dm9pZCAwPT09ZSYmKGU9dCksdm9pZCAwPT09ciYmKHI9MSk7bGV0IHM9TWF0aC5taW4odCxlKSxuPXRoaXMuemVyb3ModCxlKTtmb3IobGV0IHQ9MDt0PHM7dCsrKW4uc2V0KHQsdCxyKTtyZXR1cm4gbn1zdGF0aWMgZGlhZyh0LGUscil7bGV0IHM9dC5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9cyksdm9pZCAwPT09ciYmKHI9ZSk7bGV0IG49TWF0aC5taW4ocyxlLHIpLG89dGhpcy56ZXJvcyhlLHIpO2ZvcihsZXQgZT0wO2U8bjtlKyspby5zZXQoZSxlLHRbZV0pO3JldHVybiBvfXN0YXRpYyBtaW4odCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxzPXQuY29sdW1ucyxuPW5ldyBlcihyLHMpO2ZvcihsZXQgbz0wO288cjtvKyspZm9yKGxldCByPTA7cjxzO3IrKyluLnNldChvLHIsTWF0aC5taW4odC5nZXQobyxyKSxlLmdldChvLHIpKSk7cmV0dXJuIG59c3RhdGljIG1heCh0LGUpe3Q9dGhpcy5jaGVja01hdHJpeCh0KSxlPXRoaXMuY2hlY2tNYXRyaXgoZSk7bGV0IHI9dC5yb3dzLHM9dC5jb2x1bW5zLG49bmV3IHRoaXMocixzKTtmb3IobGV0IG89MDtvPHI7bysrKWZvcihsZXQgcj0wO3I8cztyKyspbi5zZXQobyxyLE1hdGgubWF4KHQuZ2V0KG8sciksZS5nZXQobyxyKSkpO3JldHVybiBufXN0YXRpYyBjaGVja01hdHJpeCh0KXtyZXR1cm4gWmUuaXNNYXRyaXgodCk/dDpuZXcgZXIodCl9c3RhdGljIGlzTWF0cml4KHQpe3JldHVybiBudWxsIT10JiYiTWF0cml4Ij09PXQua2xhc3N9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5yb3dzKnRoaXMuY29sdW1uc31hcHBseSh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuY2FsbCh0aGlzLGUscik7cmV0dXJuIHRoaXN9dG8xREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnB1c2godGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9dG8yREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXt0LnB1c2goW10pO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0W2VdLnB1c2godGhpcy5nZXQoZSxyKSl9cmV0dXJuIHR9dG9KU09OKCl7cmV0dXJuIHRoaXMudG8yREFycmF5KCl9aXNSb3dWZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMucm93c31pc0NvbHVtblZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5jb2x1bW5zfWlzVmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N8fDE9PT10aGlzLmNvbHVtbnN9aXNTcXVhcmUoKXtyZXR1cm4gdGhpcy5yb3dzPT09dGhpcy5jb2x1bW5zfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMucm93c3x8MD09PXRoaXMuY29sdW1uc31pc1N5bW1ldHJpYygpe2lmKHRoaXMuaXNTcXVhcmUoKSl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8PXQ7ZSsrKWlmKHRoaXMuZ2V0KHQsZSkhPT10aGlzLmdldChlLHQpKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWlzRGlzdGFuY2UoKXtpZighdGhpcy5pc1N5bW1ldHJpYygpKXJldHVybiExO2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylpZigwIT09dGhpcy5nZXQodCx0KSlyZXR1cm4hMTtyZXR1cm4hMH1pc0VjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAscj0tMSxzPSEwLG49ITE7Zm9yKDt0PHRoaXMucm93cyYmczspe2ZvcihlPTAsbj0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1uOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+cj8obj0hMCxyPWUpOihzPSExLG49ITApO3QrK31yZXR1cm4gc31pc1JlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PTAsZT0wLHI9LTEscz0hMCxuPSExO2Zvcig7dDx0aGlzLnJvd3MmJnM7KXtmb3IoZT0wLG49ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09bjspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPnI/KG49ITAscj1lKToocz0hMSxuPSEwKTtmb3IobGV0IHI9ZSsxO3I8dGhpcy5yb3dzO3IrKykwIT09dGhpcy5nZXQodCxyKSYmKHM9ITEpO3QrK31yZXR1cm4gc31lY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuY2xvbmUoKSxlPTAscj0wO2Zvcig7ZTx0LnJvd3MmJnI8dC5jb2x1bW5zOyl7bGV0IHM9ZTtmb3IobGV0IG49ZTtuPHQucm93cztuKyspdC5nZXQobixyKT50LmdldChzLHIpJiYocz1uKTtpZigwPT09dC5nZXQocyxyKSlyKys7ZWxzZXt0LnN3YXBSb3dzKGUscyk7bGV0IG49dC5nZXQoZSxyKTtmb3IobGV0IHM9cjtzPHQuY29sdW1ucztzKyspdC5zZXQoZSxzLHQuZ2V0KGUscykvbik7Zm9yKGxldCBzPWUrMTtzPHQucm93cztzKyspe2xldCBuPXQuZ2V0KHMscikvdC5nZXQoZSxyKTt0LnNldChzLHIsMCk7Zm9yKGxldCBvPXIrMTtvPHQuY29sdW1ucztvKyspdC5zZXQocyxvLHQuZ2V0KHMsbyktdC5nZXQoZSxvKSpuKX1lKysscisrfX1yZXR1cm4gdH1yZWR1Y2VkRWNoZWxvbkZvcm0oKXtsZXQgdD10aGlzLmVjaGVsb25Gb3JtKCksZT10LmNvbHVtbnMscj10LnJvd3Mscz1yLTE7Zm9yKDtzPj0wOylpZigwPT09dC5tYXhSb3cocykpcy0tO2Vsc2V7bGV0IG49MCxvPSExO2Zvcig7bjxyJiYhMT09PW87KTE9PT10LmdldChzLG4pP289ITA6bisrO2ZvcihsZXQgcj0wO3I8cztyKyspe2xldCBvPXQuZ2V0KHIsbik7Zm9yKGxldCBpPW47aTxlO2krKyl7bGV0IGU9dC5nZXQocixpKS1vKnQuZ2V0KHMsaSk7dC5zZXQocixpLGUpfX1zLS19cmV0dXJuIHR9c2V0KCl7dGhyb3cgbmV3IEVycm9yKCJzZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQiKX1nZXQoKXt0aHJvdyBuZXcgRXJyb3IoImdldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfXJlcGVhdCh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3Jvd3M6ZT0xLGNvbHVtbnM6cj0xfT10O2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGUpfHxlPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoInJvd3MgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihyKXx8cjw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7bGV0IHM9bmV3IGVyKHRoaXMucm93cyplLHRoaXMuY29sdW1ucypyKTtmb3IobGV0IHQ9MDt0PGU7dCsrKWZvcihsZXQgZT0wO2U8cjtlKyspcy5zZXRTdWJNYXRyaXgodGhpcyx0aGlzLnJvd3MqdCx0aGlzLmNvbHVtbnMqZSk7cmV0dXJuIHN9ZmlsbCh0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0KTtyZXR1cm4gdGhpc31uZWcoKXtyZXR1cm4gdGhpcy5tdWxTKC0xKX1nZXRSb3codCl7VWUodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspZS5wdXNoKHRoaXMuZ2V0KHQscikpO3JldHVybiBlfWdldFJvd1ZlY3Rvcih0KXtyZXR1cm4gZXIucm93VmVjdG9yKHRoaXMuZ2V0Um93KHQpKX1zZXRSb3codCxlKXtVZSh0aGlzLHQpLGU9QmUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQodCxyLGVbcl0pO3JldHVybiB0aGlzfXN3YXBSb3dzKHQsZSl7VWUodGhpcyx0KSxVZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl7bGV0IHM9dGhpcy5nZXQodCxyKTt0aGlzLnNldCh0LHIsdGhpcy5nZXQoZSxyKSksdGhpcy5zZXQoZSxyLHMpfXJldHVybiB0aGlzfWdldENvbHVtbih0KXtHZSh0aGlzLHQpO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyllLnB1c2godGhpcy5nZXQocix0KSk7cmV0dXJuIGV9Z2V0Q29sdW1uVmVjdG9yKHQpe3JldHVybiBlci5jb2x1bW5WZWN0b3IodGhpcy5nZXRDb2x1bW4odCkpfXNldENvbHVtbih0LGUpe0dlKHRoaXMsdCksZT1XZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsZVtyXSk7cmV0dXJuIHRoaXN9c3dhcENvbHVtbnModCxlKXtHZSh0aGlzLHQpLEdlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtsZXQgcz10aGlzLmdldChyLHQpO3RoaXMuc2V0KHIsdCx0aGlzLmdldChyLGUpKSx0aGlzLnNldChyLGUscyl9cmV0dXJuIHRoaXN9YWRkUm93VmVjdG9yKHQpe3Q9QmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3Rbcl0pO3JldHVybiB0aGlzfXN1YlJvd1ZlY3Rvcih0KXt0PUJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10W3JdKTtyZXR1cm4gdGhpc31tdWxSb3dWZWN0b3IodCl7dD1CZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdFtyXSk7cmV0dXJuIHRoaXN9ZGl2Um93VmVjdG9yKHQpe3Q9QmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3Rbcl0pO3JldHVybiB0aGlzfWFkZENvbHVtblZlY3Rvcih0KXt0PVdlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0W2VdKTtyZXR1cm4gdGhpc31zdWJDb2x1bW5WZWN0b3IodCl7dD1XZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdFtlXSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uVmVjdG9yKHQpe3Q9V2UodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnRbZV0pO3JldHVybiB0aGlzfWRpdkNvbHVtblZlY3Rvcih0KXt0PVdlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90W2VdKTtyZXR1cm4gdGhpc31tdWxSb3codCxlKXtVZSh0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldCh0LHIsdGhpcy5nZXQodCxyKSplKTtyZXR1cm4gdGhpc31tdWxDb2x1bW4odCxlKXtHZSh0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsdGhpcy5nZXQocix0KSplKTtyZXR1cm4gdGhpc31tYXgodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtzd2l0Y2godCl7Y2FzZSJyb3ciOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLnJvd3MpLmZpbGwoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dFtlXSYmKHRbZV09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSJjb2x1bW4iOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLmNvbHVtbnMpLmZpbGwoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dFtyXSYmKHRbcl09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSB2b2lkIDA6e2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1tYXhJbmRleCgpe0hlKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBzPTA7czx0aGlzLmNvbHVtbnM7cysrKXRoaXMuZ2V0KHIscyk+dCYmKHQ9dGhpcy5nZXQocixzKSxlWzBdPXIsZVsxXT1zKTtyZXR1cm4gZX1taW4odCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtzd2l0Y2godCl7Y2FzZSJyb3ciOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLnJvd3MpLmZpbGwoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik8dFtlXSYmKHRbZV09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSJjb2x1bW4iOntjb25zdCB0PW5ldyBBcnJheSh0aGlzLmNvbHVtbnMpLmZpbGwoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik8dFtyXSYmKHRbcl09dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9Y2FzZSB2b2lkIDA6e2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPHQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1taW5JbmRleCgpe0hlKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBzPTA7czx0aGlzLmNvbHVtbnM7cysrKXRoaXMuZ2V0KHIscyk8dCYmKHQ9dGhpcy5nZXQocixzKSxlWzBdPXIsZVsxXT1zKTtyZXR1cm4gZX1tYXhSb3codCl7aWYoVWUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik+ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWF4Um93SW5kZXgodCl7VWUodGhpcyx0KSxIZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBzPTE7czx0aGlzLmNvbHVtbnM7cysrKXRoaXMuZ2V0KHQscyk+ZSYmKGU9dGhpcy5nZXQodCxzKSxyWzFdPXMpO3JldHVybiByfW1pblJvdyh0KXtpZihVZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IHI9MTtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQodCxyKTxlJiYoZT10aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1taW5Sb3dJbmRleCh0KXtVZSh0aGlzLHQpLEhlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KHQsMCkscj1bdCwwXTtmb3IobGV0IHM9MTtzPHRoaXMuY29sdW1ucztzKyspdGhpcy5nZXQodCxzKTxlJiYoZT10aGlzLmdldCh0LHMpLHJbMV09cyk7cmV0dXJuIHJ9bWF4Q29sdW1uKHQpe2lmKEdlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPmUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1heENvbHVtbkluZGV4KHQpe0dlKHRoaXMsdCksSGUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgcz0xO3M8dGhpcy5yb3dzO3MrKyl0aGlzLmdldChzLHQpPmUmJihlPXRoaXMuZ2V0KHMsdCksclswXT1zKTtyZXR1cm4gcn1taW5Db2x1bW4odCl7aWYoR2UodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCByPTE7cjx0aGlzLnJvd3M7cisrKXRoaXMuZ2V0KHIsdCk8ZSYmKGU9dGhpcy5nZXQocix0KSk7cmV0dXJuIGV9bWluQ29sdW1uSW5kZXgodCl7R2UodGhpcyx0KSxIZSh0aGlzKTtsZXQgZT10aGlzLmdldCgwLHQpLHI9WzAsdF07Zm9yKGxldCBzPTE7czx0aGlzLnJvd3M7cysrKXRoaXMuZ2V0KHMsdCk8ZSYmKGU9dGhpcy5nZXQocyx0KSxyWzBdPXMpO3JldHVybiByfWRpYWcoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMuZ2V0KHIscikpO3JldHVybiBlfW5vcm0odD0iZnJvYmVuaXVzIil7c3dpdGNoKHQpe2Nhc2UibWF4IjpyZXR1cm4gdGhpcy5tYXgoKTtjYXNlImZyb2Jlbml1cyI6cmV0dXJuIE1hdGguc3FydCh0aGlzLmRvdCh0aGlzKSk7ZGVmYXVsdDp0aHJvdyBuZXcgUmFuZ2VFcnJvcihgdW5rbm93biBub3JtIHR5cGU6ICR7dH1gKX19Y3VtdWxhdGl2ZVN1bSgpe2xldCB0PTA7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0Kz10aGlzLmdldChlLHIpLHRoaXMuc2V0KGUscix0KTtyZXR1cm4gdGhpc31kb3QodCl7WmUuaXNNYXRyaXgodCkmJih0PXQudG8xREFycmF5KCkpO2xldCBlPXRoaXMudG8xREFycmF5KCk7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9ycyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIik7bGV0IHI9MDtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrKylyKz1lW3NdKnRbc107cmV0dXJuIHJ9bW11bCh0KXt0PWVyLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMucm93cyxyPXRoaXMuY29sdW1ucyxzPXQuY29sdW1ucyxuPW5ldyBlcihlLHMpLG89bmV3IEZsb2F0NjRBcnJheShyKTtmb3IobGV0IGk9MDtpPHM7aSsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKW9bZV09dC5nZXQoZSxpKTtmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT0wO2ZvcihsZXQgcz0wO3M8cjtzKyspZSs9dGhpcy5nZXQodCxzKSpvW3NdO24uc2V0KHQsaSxlKX19cmV0dXJuIG59bXBvdyh0KXtpZighdGhpcy5pc1NxdWFyZSgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaXggbXVzdCBiZSBzcXVhcmUiKTtpZighTnVtYmVyLmlzSW50ZWdlcih0KXx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJFeHBvbmVudCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIiKTtsZXQgZT1lci5leWUodGhpcy5yb3dzKSxyPXRoaXM7Zm9yKGxldCBzPXQ7cz49MTtzLz0yKTAhPSgxJnMpJiYoZT1lLm1tdWwocikpLHI9ci5tbXVsKHIpO3JldHVybiBlfXN0cmFzc2VuMngyKHQpe3Q9ZXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IGVyKDIsMik7Y29uc3Qgcj10aGlzLmdldCgwLDApLHM9dC5nZXQoMCwwKSxuPXRoaXMuZ2V0KDAsMSksbz10LmdldCgwLDEpLGk9dGhpcy5nZXQoMSwwKSx1PXQuZ2V0KDEsMCksYT10aGlzLmdldCgxLDEpLGw9dC5nZXQoMSwxKSxoPShyK2EpKihzK2wpLGM9KGkrYSkqcyxmPXIqKG8tbCksbT1hKih1LXMpLGc9KHIrbikqbCx3PWgrbS1nKyhuLWEpKih1K2wpLHA9ZitnLGQ9YyttLHk9aC1jK2YrKGktcikqKHMrbyk7cmV0dXJuIGUuc2V0KDAsMCx3KSxlLnNldCgwLDEscCksZS5zZXQoMSwwLGQpLGUuc2V0KDEsMSx5KSxlfXN0cmFzc2VuM3gzKHQpe3Q9ZXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IGVyKDMsMyk7Y29uc3Qgcj10aGlzLmdldCgwLDApLHM9dGhpcy5nZXQoMCwxKSxuPXRoaXMuZ2V0KDAsMiksbz10aGlzLmdldCgxLDApLGk9dGhpcy5nZXQoMSwxKSx1PXRoaXMuZ2V0KDEsMiksYT10aGlzLmdldCgyLDApLGw9dGhpcy5nZXQoMiwxKSxoPXRoaXMuZ2V0KDIsMiksYz10LmdldCgwLDApLGY9dC5nZXQoMCwxKSxtPXQuZ2V0KDAsMiksZz10LmdldCgxLDApLHc9dC5nZXQoMSwxKSxwPXQuZ2V0KDEsMiksZD10LmdldCgyLDApLHk9dC5nZXQoMiwxKSxiPXQuZ2V0KDIsMiksTT0oci1vKSooLWYrdyksdj0oLXIrbytpKSooYy1mK3cpLHg9KG8raSkqKC1jK2YpLEU9cipjLFM9KC1yK2ErbCkqKGMtbStwKSxfPSgtcithKSoobS1wKSxqPShhK2wpKigtYyttKSxBPSgtbitsK2gpKih3K2QteSksUj0obi1oKSoody15KSxJPW4qZCxDPShsK2gpKigtZCt5KSxOPSgtbitpK3UpKihwK2QtYiksaz0obi11KSoocC1iKSxUPShpK3UpKigtZCtiKSxGPUUrSStzKmcsTz0ocitzK24tby1pLWwtaCkqdyt2K3grRStBK0krQyxWPUUrUytqKyhyK3Mrbi1pLXUtYS1sKSpwK0krTitULHo9TStpKigtYytmK2ctdy1wLWQrYikrditFK0krTitrLEQ9TSt2K3grRSt1KnksUD1JK04raytUK28qbSxxPUUrUytfK2wqKC1jK20rZy13LXAtZCt5KStBK1IrSSwkPUErUitJK0MrYSpmLEw9RStTK18raitoKmI7cmV0dXJuIGUuc2V0KDAsMCxGKSxlLnNldCgwLDEsTyksZS5zZXQoMCwyLFYpLGUuc2V0KDEsMCx6KSxlLnNldCgxLDEsRCksZS5zZXQoMSwyLFApLGUuc2V0KDIsMCxxKSxlLnNldCgyLDEsJCksZS5zZXQoMiwyLEwpLGV9bW11bFN0cmFzc2VuKHQpe3Q9ZXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5jbG9uZSgpLHI9ZS5yb3dzLHM9ZS5jb2x1bW5zLG49dC5yb3dzLG89dC5jb2x1bW5zO2Z1bmN0aW9uIGkodCxlLHIpe2xldCBzPXQucm93cyxuPXQuY29sdW1ucztpZihzPT09ZSYmbj09PXIpcmV0dXJuIHQ7e2xldCBzPVplLnplcm9zKGUscik7cmV0dXJuIHM9cy5zZXRTdWJNYXRyaXgodCwwLDApLHN9fXMhPT1uJiZjb25zb2xlLndhcm4oYE11bHRpcGx5aW5nICR7cn0geCAke3N9IGFuZCAke259IHggJHtvfSBtYXRyaXg6IGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoLmApO2xldCB1PU1hdGgubWF4KHIsbiksYT1NYXRoLm1heChzLG8pO3JldHVybiBlPWkoZSx1LGEpLGZ1bmN0aW9uIHQoZSxyLHMsbil7aWYoczw9NTEyfHxuPD01MTIpcmV0dXJuIGUubW11bChyKTtzJTI9PTEmJm4lMj09MT8oZT1pKGUscysxLG4rMSkscj1pKHIscysxLG4rMSkpOnMlMj09MT8oZT1pKGUscysxLG4pLHI9aShyLHMrMSxuKSk6biUyPT0xJiYoZT1pKGUscyxuKzEpLHI9aShyLHMsbisxKSk7bGV0IG89cGFyc2VJbnQoZS5yb3dzLzIsMTApLHU9cGFyc2VJbnQoZS5jb2x1bW5zLzIsMTApLGE9ZS5zdWJNYXRyaXgoMCxvLTEsMCx1LTEpLGw9ci5zdWJNYXRyaXgoMCxvLTEsMCx1LTEpLGg9ZS5zdWJNYXRyaXgoMCxvLTEsdSxlLmNvbHVtbnMtMSksYz1yLnN1Yk1hdHJpeCgwLG8tMSx1LHIuY29sdW1ucy0xKSxmPWUuc3ViTWF0cml4KG8sZS5yb3dzLTEsMCx1LTEpLG09ci5zdWJNYXRyaXgobyxyLnJvd3MtMSwwLHUtMSksZz1lLnN1Yk1hdHJpeChvLGUucm93cy0xLHUsZS5jb2x1bW5zLTEpLHc9ci5zdWJNYXRyaXgobyxyLnJvd3MtMSx1LHIuY29sdW1ucy0xKSxwPXQoWmUuYWRkKGEsZyksWmUuYWRkKGwsdyksbyx1KSxkPXQoWmUuYWRkKGYsZyksbCxvLHUpLHk9dChhLFplLnN1YihjLHcpLG8sdSksYj10KGcsWmUuc3ViKG0sbCksbyx1KSxNPXQoWmUuYWRkKGEsaCksdyxvLHUpLHY9dChaZS5zdWIoZixhKSxaZS5hZGQobCxjKSxvLHUpLHg9dChaZS5zdWIoaCxnKSxaZS5hZGQobSx3KSxvLHUpLEU9WmUuYWRkKHAsYik7RS5zdWIoTSksRS5hZGQoeCk7bGV0IFM9WmUuYWRkKHksTSksXz1aZS5hZGQoZCxiKSxqPVplLnN1YihwLGQpO2ouYWRkKHkpLGouYWRkKHYpO2xldCBBPVplLnplcm9zKDIqRS5yb3dzLDIqRS5jb2x1bW5zKTtyZXR1cm4gQT1BLnNldFN1Yk1hdHJpeChFLDAsMCksQT1BLnNldFN1Yk1hdHJpeChTLEUucm93cywwKSxBPUEuc2V0U3ViTWF0cml4KF8sMCxFLmNvbHVtbnMpLEE9QS5zZXRTdWJNYXRyaXgoaixFLnJvd3MsRS5jb2x1bW5zKSxBLnN1Yk1hdHJpeCgwLHMtMSwwLG4tMSl9KGUsdD1pKHQsdSxhKSx1LGEpfXNjYWxlUm93cyh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjplPTAsbWF4OnI9MX09dDtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIU51bWJlci5pc0Zpbml0ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhIG51bWJlciIpO2lmKGU+PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgcz1uZXcgZXIodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKXtjb25zdCBuPXRoaXMuZ2V0Um93KHQpO24ubGVuZ3RoPjAmJnplKG4se21pbjplLG1heDpyLG91dHB1dDpufSkscy5zZXRSb3codCxuKX1yZXR1cm4gc31zY2FsZUNvbHVtbnModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IHM9bmV3IGVyKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyl7Y29uc3Qgbj10aGlzLmdldENvbHVtbih0KTtuLmxlbmd0aCYmemUobix7bWluOmUsbWF4OnIsb3V0cHV0Om59KSxzLnNldENvbHVtbih0LG4pfXJldHVybiBzfWZsaXBSb3dzKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5jb2x1bW5zLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChlLHIpLHM9dGhpcy5nZXQoZSx0aGlzLmNvbHVtbnMtMS1yKTt0aGlzLnNldChlLHIscyksdGhpcy5zZXQoZSx0aGlzLmNvbHVtbnMtMS1yLHQpfXJldHVybiB0aGlzfWZsaXBDb2x1bW5zKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5yb3dzLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChyLGUpLHM9dGhpcy5nZXQodGhpcy5yb3dzLTEtcixlKTt0aGlzLnNldChyLGUscyksdGhpcy5zZXQodGhpcy5yb3dzLTEtcixlLHQpfXJldHVybiB0aGlzfWtyb25lY2tlclByb2R1Y3QodCl7dD1lci5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMscz10LnJvd3Msbj10LmNvbHVtbnMsbz1uZXcgZXIoZSpzLHIqbik7Zm9yKGxldCBpPTA7aTxlO2krKylmb3IobGV0IGU9MDtlPHI7ZSsrKWZvcihsZXQgcj0wO3I8cztyKyspZm9yKGxldCB1PTA7dTxuO3UrKylvLnNldChzKmkrcixuKmUrdSx0aGlzLmdldChpLGUpKnQuZ2V0KHIsdSkpO3JldHVybiBvfWtyb25lY2tlclN1bSh0KXtpZih0PWVyLmNoZWNrTWF0cml4KHQpLCF0aGlzLmlzU3F1YXJlKCl8fCF0LmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJLcm9uZWNrZXIgU3VtIG5lZWRzIHR3byBTcXVhcmUgTWF0cmljZXMiKTtsZXQgZT10aGlzLnJvd3Mscj10LnJvd3Mscz10aGlzLmtyb25lY2tlclByb2R1Y3QoZXIuZXllKHIscikpLG49ZXIuZXllKGUsZSkua3JvbmVja2VyUHJvZHVjdCh0KTtyZXR1cm4gcy5hZGQobil9dHJhbnNwb3NlKCl7bGV0IHQ9bmV3IGVyKHRoaXMuY29sdW1ucyx0aGlzLnJvd3MpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQocixlLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXNvcnRSb3dzKHQ9dHIpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl0aGlzLnNldFJvdyhlLHRoaXMuZ2V0Um93KGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXNvcnRDb2x1bW5zKHQ9dHIpe2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldENvbHVtbihlLHRoaXMuZ2V0Q29sdW1uKGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXN1Yk1hdHJpeCh0LGUscixzKXtYZSh0aGlzLHQsZSxyLHMpO2xldCBuPW5ldyBlcihlLXQrMSxzLXIrMSk7Zm9yKGxldCBvPXQ7bzw9ZTtvKyspZm9yKGxldCBlPXI7ZTw9cztlKyspbi5zZXQoby10LGUtcix0aGlzLmdldChvLGUpKTtyZXR1cm4gbn1zdWJNYXRyaXhSb3codCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMuY29sdW1ucy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5jb2x1bW5zfHxyPDB8fHI+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IHM9bmV3IGVyKHQubGVuZ3RoLHItZSsxKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylmb3IobGV0IG89ZTtvPD1yO28rKyl7aWYodFtuXTwwfHx0W25dPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFJvdyBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtuXX1gKTtzLnNldChuLG8tZSx0aGlzLmdldCh0W25dLG8pKX1yZXR1cm4gc31zdWJNYXRyaXhDb2x1bW4odCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMucm93cy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5yb3dzfHxyPDB8fHI+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IHM9bmV3IGVyKHItZSsxLHQubGVuZ3RoKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylmb3IobGV0IG89ZTtvPD1yO28rKyl7aWYodFtuXTwwfHx0W25dPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtuXX1gKTtzLnNldChvLWUsbix0aGlzLmdldChvLHRbbl0pKX1yZXR1cm4gc31zZXRTdWJNYXRyaXgodCxlLHIpe2lmKCh0PWVyLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7WGUodGhpcyxlLGUrdC5yb3dzLTEscixyK3QuY29sdW1ucy0xKTtmb3IobGV0IHM9MDtzPHQucm93cztzKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXRoaXMuc2V0KGUrcyxyK24sdC5nZXQocyxuKSk7cmV0dXJuIHRoaXN9c2VsZWN0aW9uKHQsZSl7S2UodGhpcyx0KSxRZSh0aGlzLGUpO2xldCByPW5ldyBlcih0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCBzPTA7czx0Lmxlbmd0aDtzKyspe2xldCBuPXRbc107Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBvPWVbdF07ci5zZXQocyx0LHRoaXMuZ2V0KG4sbykpfX1yZXR1cm4gcn10cmFjZSgpe2xldCB0PU1hdGgubWluKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpLGU9MDtmb3IobGV0IHI9MDtyPHQ7cisrKWUrPXRoaXMuZ2V0KHIscik7cmV0dXJuIGV9Y2xvbmUoKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb3B5KHRoaXMsbmV3IGVyKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpKX1zdGF0aWMgY29weSh0LGUpe2Zvcihjb25zdFtyLHMsbl1vZiB0LmVudHJpZXMoKSllLnNldChyLHMsbik7cmV0dXJuIGV9c3VtKHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPVllKHQucm93cyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zOysrcyllW3JdKz10LmdldChyLHMpO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPVllKHQuY29sdW1ucyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zOysrcyllW3NdKz10LmdldChyLHMpO3JldHVybiBlfSh0aGlzKTtjYXNlIHZvaWQgMDpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9MDtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7cysrKWUrPXQuZ2V0KHIscyk7cmV0dXJuIGV9KHRoaXMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1wcm9kdWN0KHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPVllKHQucm93cywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7KytzKWVbcl0qPXQuZ2V0KHIscyk7cmV0dXJuIGV9KHRoaXMpO2Nhc2UiY29sdW1uIjpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9WWUodC5jb2x1bW5zLDEpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IHM9MDtzPHQuY29sdW1uczsrK3MpZVtzXSo9dC5nZXQocixzKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTE7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zO3MrKyllKj10LmdldChyLHMpO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWVhbih0KXtjb25zdCBlPXRoaXMuc3VtKHQpO3N3aXRjaCh0KXtjYXNlInJvdyI6Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWVbdF0vPXRoaXMuY29sdW1ucztyZXR1cm4gZTtjYXNlImNvbHVtbiI6Zm9yKGxldCB0PTA7dDx0aGlzLmNvbHVtbnM7dCsrKWVbdF0vPXRoaXMucm93cztyZXR1cm4gZTtjYXNlIHZvaWQgMDpyZXR1cm4gZS90aGlzLnNpemU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXZhcmlhbmNlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3VuYmlhc2VkOnI9ITAsbWVhbjpzPXRoaXMubWVhbih0KX09ZTtpZigiYm9vbGVhbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInVuYmlhc2VkIG11c3QgYmUgYSBib29sZWFuIik7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighVmUocykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBzPXQucm93cyxuPXQuY29sdW1ucyxvPVtdO2ZvcihsZXQgaT0wO2k8cztpKyspe2xldCBzPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG47ZSsrKWE9dC5nZXQoaSxlKS1yW2ldLHMrPWEsdSs9YSphO2U/by5wdXNoKCh1LXMqcy9uKS8obi0xKSk6by5wdXNoKCh1LXMqcy9uKS9uKX1yZXR1cm4gb30odGhpcyxyLHMpO2Nhc2UiY29sdW1uIjppZighVmUocykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBzPXQucm93cyxuPXQuY29sdW1ucyxvPVtdO2ZvcihsZXQgaT0wO2k8bjtpKyspe2xldCBuPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPHM7ZSsrKWE9dC5nZXQoZSxpKS1yW2ldLG4rPWEsdSs9YSphO2U/by5wdXNoKCh1LW4qbi9zKS8ocy0xKSk6by5wdXNoKCh1LW4qbi9zKS9zKX1yZXR1cm4gb30odGhpcyxyLHMpO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJtZWFuIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2NvbnN0IHM9dC5yb3dzLG49dC5jb2x1bW5zLG89cypuO2xldCBpPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPHM7ZSsrKWZvcihsZXQgcz0wO3M8bjtzKyspYT10LmdldChlLHMpLXIsaSs9YSx1Kz1hKmE7cmV0dXJuIGU/KHUtaSppL28pLyhvLTEpOih1LWkqaS9vKS9vfSh0aGlzLHIscyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXN0YW5kYXJkRGV2aWF0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKTtjb25zdCByPXRoaXMudmFyaWFuY2UodCxlKTtpZih2b2lkIDA9PT10KXJldHVybiBNYXRoLnNxcnQocik7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspclt0XT1NYXRoLnNxcnQoclt0XSk7cmV0dXJuIHJ9Y2VudGVyKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e2NlbnRlcjpyPXRoaXMubWVhbih0KX09ZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKCFWZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspdC5zZXQocixzLHQuZ2V0KHIscyktZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYoIVZlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zO3MrKyl0LnNldChyLHMsdC5nZXQocixzKS1lW3NdKX0odGhpcyxyKSx0aGlzO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspdC5zZXQocixzLHQuZ2V0KHIscyktZSl9KHRoaXMsciksdGhpcztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19c2NhbGUodCxlPXt9KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7bGV0IHI9ZS5zY2FsZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKHZvaWQgMD09PXIpcj1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKyl7bGV0IHM9MDtmb3IobGV0IGU9MDtlPHQuY29sdW1ucztlKyspcys9dC5nZXQocixlKSoqMi8odC5jb2x1bW5zLTEpO2UucHVzaChNYXRoLnNxcnQocykpfXJldHVybiBlfSh0aGlzKTtlbHNlIGlmKCFWZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgcz0wO3M8dC5jb2x1bW5zO3MrKyl0LnNldChyLHMsdC5nZXQocixzKS9lW3JdKX0odGhpcyxyKSx0aGlzO2Nhc2UiY29sdW1uIjppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQuY29sdW1ucztyKyspe2xldCBzPTA7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKXMrPXQuZ2V0KGUscikqKjIvKHQucm93cy0xKTtlLnB1c2goTWF0aC5zcXJ0KHMpKX1yZXR1cm4gZX0odGhpcyk7ZWxzZSBpZighVmUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IHM9MDtzPHQuY29sdW1ucztzKyspdC5zZXQocixzLHQuZ2V0KHIscykvZVtzXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT10LnNpemUtMTtsZXQgcj0wO2ZvcihsZXQgcz0wO3M8dC5jb2x1bW5zO3MrKylmb3IobGV0IG49MDtuPHQucm93cztuKyspcis9dC5nZXQobixzKSoqMi9lO3JldHVybiBNYXRoLnNxcnQocil9KHRoaXMpO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBzPTA7czx0LmNvbHVtbnM7cysrKXQuc2V0KHIscyx0LmdldChyLHMpL2UpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXRvU3RyaW5nKHQpe3JldHVybiBxZSh0aGlzLHQpfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHRoaXMuZW50cmllcygpfSplbnRyaWVzKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl5aWVsZFt0LGUsdGhpcy5nZXQodCxlKV19KnZhbHVlcygpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspeWllbGQgdGhpcy5nZXQodCxlKX19ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4gdC1lfVplLnByb3RvdHlwZS5rbGFzcz0iTWF0cml4IiwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmKFplLnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1mdW5jdGlvbigpe3JldHVybiBxZSh0aGlzKX0pLFplLnJhbmRvbT1aZS5yYW5kLFplLnJhbmRvbUludD1aZS5yYW5kSW50LFplLmRpYWdvbmFsPVplLmRpYWcsWmUucHJvdG90eXBlLmRpYWdvbmFsPVplLnByb3RvdHlwZS5kaWFnLFplLmlkZW50aXR5PVplLmV5ZSxaZS5wcm90b3R5cGUubmVnYXRlPVplLnByb3RvdHlwZS5uZWcsWmUucHJvdG90eXBlLnRlbnNvclByb2R1Y3Q9WmUucHJvdG90eXBlLmtyb25lY2tlclByb2R1Y3Q7bGV0IGVyPWNsYXNzIHQgZXh0ZW5kcyBaZXtkYXRhOyN0KHQsZSl7aWYodGhpcy5kYXRhPVtdLCEoTnVtYmVyLmlzSW50ZWdlcihlKSYmZT49MCkpdGhyb3cgbmV3IFR5cGVFcnJvcigibkNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtmb3IobGV0IHI9MDtyPHQ7cisrKXRoaXMuZGF0YS5wdXNoKG5ldyBGbG9hdDY0QXJyYXkoZSkpO3RoaXMucm93cz10LHRoaXMuY29sdW1ucz1lfWNvbnN0cnVjdG9yKGUscil7aWYoc3VwZXIoKSx0LmlzTWF0cml4KGUpKXRoaXMuI3QoZS5yb3dzLGUuY29sdW1ucyksdC5jb3B5KGUsdGhpcyk7ZWxzZSBpZihOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj0wKXRoaXMuI3QoZSxyKTtlbHNle2lmKCFWZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIGFuIGFycmF5Iik7e2NvbnN0IHQ9ZTtpZigibnVtYmVyIiE9dHlwZW9mKHI9KGU9dC5sZW5ndGgpP3RbMF0ubGVuZ3RoOjApKXRocm93IG5ldyBUeXBlRXJyb3IoIkRhdGEgbXVzdCBiZSBhIDJEIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQiKTt0aGlzLmRhdGE9W107Zm9yKGxldCBzPTA7czxlO3MrKyl7aWYodFtzXS5sZW5ndGghPT1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmNvbnNpc3RlbnQgYXJyYXkgZGltZW5zaW9ucyIpO2lmKCF0W3NdLmV2ZXJ5KCh0PT4ibnVtYmVyIj09dHlwZW9mIHQpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnB1dCBkYXRhIGNvbnRhaW5zIG5vbi1udW1lcmljIHZhbHVlcyIpO3RoaXMuZGF0YS5wdXNoKEZsb2F0NjRBcnJheS5mcm9tKHRbc10pKX10aGlzLnJvd3M9ZSx0aGlzLmNvbHVtbnM9cn19fXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX1yZW1vdmVSb3codCl7cmV0dXJuIFVlKHRoaXMsdCksdGhpcy5kYXRhLnNwbGljZSh0LDEpLHRoaXMucm93cy09MSx0aGlzfWFkZFJvdyh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5yb3dzKSxVZSh0aGlzLHQsITApLGU9RmxvYXQ2NEFycmF5LmZyb20oQmUodGhpcyxlKSksdGhpcy5kYXRhLnNwbGljZSh0LDAsZSksdGhpcy5yb3dzKz0xLHRoaXN9cmVtb3ZlQ29sdW1uKHQpe0dlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXtjb25zdCByPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zLTEpO2ZvcihsZXQgcz0wO3M8dDtzKyspcltzXT10aGlzLmRhdGFbZV1bc107Zm9yKGxldCBzPXQrMTtzPHRoaXMuY29sdW1ucztzKyspcltzLTFdPXRoaXMuZGF0YVtlXVtzXTt0aGlzLmRhdGFbZV09cn1yZXR1cm4gdGhpcy5jb2x1bW5zLT0xLHRoaXN9YWRkQ29sdW1uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMuY29sdW1ucyksR2UodGhpcyx0LCEwKSxlPVdlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtjb25zdCBzPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zKzEpO2xldCBuPTA7Zm9yKDtuPHQ7bisrKXNbbl09dGhpcy5kYXRhW3JdW25dO2ZvcihzW24rK109ZVtyXTtuPHRoaXMuY29sdW1ucysxO24rKylzW25dPXRoaXMuZGF0YVtyXVtuLTFdO3RoaXMuZGF0YVtyXT1zfXJldHVybiB0aGlzLmNvbHVtbnMrPTEsdGhpc319OyFmdW5jdGlvbih0LGUpe3QucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5hZGRTKHQpOnRoaXMuYWRkTSh0KX0sdC5wcm90b3R5cGUuYWRkUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3QpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hZGRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5hZGQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuYWRkKHIpfSx0LnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuc3ViUyh0KTp0aGlzLnN1Yk0odCl9LHQucHJvdG90eXBlLnN1YlM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc3ViTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuc3ViPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnN1YihyKX0sdC5wcm90b3R5cGUuc3VidHJhY3Q9dC5wcm90b3R5cGUuc3ViLHQucHJvdG90eXBlLnN1YnRyYWN0Uz10LnByb3RvdHlwZS5zdWJTLHQucHJvdG90eXBlLnN1YnRyYWN0TT10LnByb3RvdHlwZS5zdWJNLHQuc3VidHJhY3Q9dC5zdWIsdC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm11bFModCk6dGhpcy5tdWxNKHQpfSx0LnByb3RvdHlwZS5tdWxTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm11bE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm11bD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5tdWwocil9LHQucHJvdG90eXBlLm11bHRpcGx5PXQucHJvdG90eXBlLm11bCx0LnByb3RvdHlwZS5tdWx0aXBseVM9dC5wcm90b3R5cGUubXVsUyx0LnByb3RvdHlwZS5tdWx0aXBseU09dC5wcm90b3R5cGUubXVsTSx0Lm11bHRpcGx5PXQubXVsLHQucHJvdG90eXBlLmRpdj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5kaXZTKHQpOnRoaXMuZGl2TSh0KX0sdC5wcm90b3R5cGUuZGl2Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3QpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaXZNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5kaXY9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuZGl2KHIpfSx0LnByb3RvdHlwZS5kaXZpZGU9dC5wcm90b3R5cGUuZGl2LHQucHJvdG90eXBlLmRpdmlkZVM9dC5wcm90b3R5cGUuZGl2Uyx0LnByb3RvdHlwZS5kaXZpZGVNPXQucHJvdG90eXBlLmRpdk0sdC5kaXZpZGU9dC5kaXYsdC5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm1vZFModCk6dGhpcy5tb2RNKHQpfSx0LnByb3RvdHlwZS5tb2RTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikldCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm1vZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJXQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm1vZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5tb2Qocil9LHQucHJvdG90eXBlLm1vZHVsdXM9dC5wcm90b3R5cGUubW9kLHQucHJvdG90eXBlLm1vZHVsdXNTPXQucHJvdG90eXBlLm1vZFMsdC5wcm90b3R5cGUubW9kdWx1c009dC5wcm90b3R5cGUubW9kTSx0Lm1vZHVsdXM9dC5tb2QsdC5wcm90b3R5cGUuYW5kPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmFuZFModCk6dGhpcy5hbmRNKHQpfSx0LnByb3RvdHlwZS5hbmRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikmdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmFuZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmFuZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5hbmQocil9LHQucHJvdG90eXBlLm9yPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm9yUyh0KTp0aGlzLm9yTSh0KX0sdC5wcm90b3R5cGUub3JTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscil8dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm9yTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscil8dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQub3I9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkub3Iocil9LHQucHJvdG90eXBlLnhvcj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy54b3JTKHQpOnRoaXMueG9yTSh0KX0sdC5wcm90b3R5cGUueG9yUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpXnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS54b3JNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKV50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC54b3I9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkueG9yKHIpfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubGVmdFNoaWZ0Uyh0KTp0aGlzLmxlZnRTaGlmdE0odCl9LHQucHJvdG90eXBlLmxlZnRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKTw8dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmxlZnRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPDx0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubGVmdFNoaWZ0KHIpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTKHQpOnRoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE0odCl9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+PnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+PnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdChyKX0sdC5wcm90b3R5cGUucmlnaHRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5yaWdodFNoaWZ0Uyh0KTp0aGlzLnJpZ2h0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj4+dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+PnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnJpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkucmlnaHRTaGlmdChyKX0sdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0PXQucHJvdG90eXBlLnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0Uz10LnByb3RvdHlwZS5yaWdodFNoaWZ0Uyx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRNPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRNLHQuemVyb0ZpbGxSaWdodFNoaWZ0PXQucmlnaHRTaGlmdCx0LnByb3RvdHlwZS5ub3Q9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx+dGhpcy5nZXQodCxlKSk7cmV0dXJuIHRoaXN9LHQubm90PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5ub3QoKX0sdC5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hYnModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFicz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWJzKCl9LHQucHJvdG90eXBlLmFjb3M9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFjb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFjb3MoKX0sdC5wcm90b3R5cGUuYWNvc2g9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFjb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWNvc2goKX0sdC5wcm90b3R5cGUuYXNpbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXNpbigpfSx0LnByb3RvdHlwZS5hc2luaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFzaW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hc2luaCgpfSx0LnByb3RvdHlwZS5hdGFuPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hdGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hdGFuKCl9LHQucHJvdG90eXBlLmF0YW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmF0YW5oKCl9LHQucHJvdG90eXBlLmNicnQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNicnQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNicnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNicnQoKX0sdC5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2VpbCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2VpbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2VpbCgpfSx0LnByb3RvdHlwZS5jbHozMj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2x6MzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNsejMyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jbHozMigpfSx0LnByb3RvdHlwZS5jb3M9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY29zPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jb3MoKX0sdC5wcm90b3R5cGUuY29zaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY29zaCgpfSx0LnByb3RvdHlwZS5leHA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5leHAoKX0sdC5wcm90b3R5cGUuZXhwbTE9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cG0xKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5leHBtMT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZXhwbTEoKX0sdC5wcm90b3R5cGUuZmxvb3I9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZsb29yKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5mbG9vcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZmxvb3IoKX0sdC5wcm90b3R5cGUuZnJvdW5kPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mcm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZyb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZnJvdW5kKCl9LHQucHJvdG90eXBlLmxvZz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2c9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZygpfSx0LnByb3RvdHlwZS5sb2cxcD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMXAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzFwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cxcCgpfSx0LnByb3RvdHlwZS5sb2cxMD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMTAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzEwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cxMCgpfSx0LnByb3RvdHlwZS5sb2cyPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cyKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cyKCl9LHQucHJvdG90eXBlLnJvdW5kPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5yb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnJvdW5kKCl9LHQucHJvdG90eXBlLnNpZ249ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpZ24odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpZ24oKX0sdC5wcm90b3R5cGUuc2luPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2luKCl9LHQucHJvdG90eXBlLnNpbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpbmgoKX0sdC5wcm90b3R5cGUuc3FydD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc3FydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc3FydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc3FydCgpfSx0LnByb3RvdHlwZS50YW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRhbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50YW4oKX0sdC5wcm90b3R5cGUudGFuaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudGFuaCgpfSx0LnByb3RvdHlwZS50cnVuYz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudHJ1bmModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRydW5jPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50cnVuYygpfSx0LnBvdz1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5wb3cocil9LHQucHJvdG90eXBlLnBvdz1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5wb3dTKHQpOnRoaXMucG93TSh0KX0sdC5wcm90b3R5cGUucG93Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKip0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucG93TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqKnQuZ2V0KGUscikpO3JldHVybiB0aGlzfX0oWmUsZXIpO2NsYXNzIHJyIGV4dGVuZHMgWmV7I2U7Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy4jZS5zaXplfWdldCByb3dzKCl7cmV0dXJuIHRoaXMuI2Uucm93c31nZXQgY29sdW1ucygpe3JldHVybiB0aGlzLiNlLmNvbHVtbnN9Z2V0IGRpYWdvbmFsU2l6ZSgpe3JldHVybiB0aGlzLnJvd3N9c3RhdGljIGlzU3ltbWV0cmljTWF0cml4KHQpe3JldHVybiBlci5pc01hdHJpeCh0KSYmIlN5bW1ldHJpY01hdHJpeCI9PT10LmtsYXNzVHlwZX1zdGF0aWMgemVyb3ModCl7cmV0dXJuIG5ldyB0aGlzKHQpfXN0YXRpYyBvbmVzKHQpe3JldHVybiBuZXcgdGhpcyh0KS5maWxsKDEpfWNvbnN0cnVjdG9yKHQpe2lmKHN1cGVyKCksZXIuaXNNYXRyaXgodCkpe2lmKCF0LmlzU3ltbWV0cmljKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigibm90IHN5bW1ldHJpYyBkYXRhIik7dGhpcy4jZT1lci5jb3B5KHQsbmV3IGVyKHQucm93cyx0LnJvd3MpKX1lbHNlIGlmKE51bWJlci5pc0ludGVnZXIodCkmJnQ+PTApdGhpcy4jZT1uZXcgZXIodCx0KTtlbHNlIGlmKHRoaXMuI2U9bmV3IGVyKHQpLCF0aGlzLmlzU3ltbWV0cmljKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigibm90IHN5bW1ldHJpYyBkYXRhIil9Y2xvbmUoKXtjb25zdCB0PW5ldyBycih0aGlzLmRpYWdvbmFsU2l6ZSk7Zm9yKGNvbnN0W2UscixzXW9mIHRoaXMudXBwZXJSaWdodEVudHJpZXMoKSl0LnNldChlLHIscyk7cmV0dXJuIHR9dG9NYXRyaXgoKXtyZXR1cm4gbmV3IGVyKHRoaXMpfWdldCh0LGUpe3JldHVybiB0aGlzLiNlLmdldCh0LGUpfXNldCh0LGUscil7cmV0dXJuIHRoaXMuI2Uuc2V0KHQsZSxyKSx0aGlzLiNlLnNldChlLHQsciksdGhpc31yZW1vdmVDcm9zcyh0KXtyZXR1cm4gdGhpcy4jZS5yZW1vdmVSb3codCksdGhpcy4jZS5yZW1vdmVDb2x1bW4odCksdGhpc31hZGRDcm9zcyh0LGUpe3ZvaWQgMD09PWUmJihlPXQsdD10aGlzLmRpYWdvbmFsU2l6ZSk7Y29uc3Qgcj1lLnNsaWNlKCk7cmV0dXJuIHIuc3BsaWNlKHQsMSksdGhpcy4jZS5hZGRSb3codCxyKSx0aGlzLiNlLmFkZENvbHVtbih0LGUpLHRoaXN9YXBwbHlNYXNrKHQpe2lmKHQubGVuZ3RoIT09dGhpcy5kaWFnb25hbFNpemUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hc2sgc2l6ZSBkbyBub3QgbWF0Y2ggd2l0aCBtYXRyaXggc2l6ZSIpO2NvbnN0IGU9W107Zm9yKGNvbnN0W3Isc11vZiB0LmVudHJpZXMoKSlzfHxlLnB1c2gocik7ZS5yZXZlcnNlKCk7Zm9yKGNvbnN0IHQgb2YgZSl0aGlzLnJlbW92ZUNyb3NzKHQpO3JldHVybiB0aGlzfXRvQ29tcGFjdCgpe2NvbnN0e2RpYWdvbmFsU2l6ZTp0fT10aGlzLGU9bmV3IEFycmF5KHQqKHQrMSkvMik7Zm9yKGxldCByPTAscz0wLG49MDtuPGUubGVuZ3RoO24rKyllW25dPXRoaXMuZ2V0KHMsciksKytyPj10JiYocj0rK3MpO3JldHVybiBlfXN0YXRpYyBmcm9tQ29tcGFjdCh0KXtjb25zdCBlPXQubGVuZ3RoLHI9KE1hdGguc3FydCg4KmUrMSktMSkvMjtpZighTnVtYmVyLmlzSW50ZWdlcihyKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGlzIGFycmF5IGlzIG5vdCBhIGNvbXBhY3QgcmVwcmVzZW50YXRpb24gb2YgYSBTeW1tZXRyaWMgTWF0cml4LCAke0pTT04uc3RyaW5naWZ5KHQpfWApO2NvbnN0IHM9bmV3IHJyKHIpO2ZvcihsZXQgbj0wLG89MCxpPTA7aTxlO2krKylzLnNldChuLG8sdFtpXSksKytuPj1yJiYobj0rK28pO3JldHVybiBzfSp1cHBlclJpZ2h0RW50cmllcygpe2ZvcihsZXQgdD0wLGU9MDt0PHRoaXMuZGlhZ29uYWxTaXplO3ZvaWQgMCl7Y29uc3Qgcj10aGlzLmdldCh0LGUpO3lpZWxkW3QsZSxyXSwrK2U+PXRoaXMuZGlhZ29uYWxTaXplJiYoZT0rK3QpfX0qdXBwZXJSaWdodFZhbHVlcygpe2ZvcihsZXQgdD0wLGU9MDt0PHRoaXMuZGlhZ29uYWxTaXplO3ZvaWQgMCl7Y29uc3Qgcj10aGlzLmdldCh0LGUpO3lpZWxkIHIsKytlPj10aGlzLmRpYWdvbmFsU2l6ZSYmKGU9Kyt0KX19fXJyLnByb3RvdHlwZS5rbGFzc1R5cGU9IlN5bW1ldHJpY01hdHJpeCI7Y2xhc3Mgc3IgZXh0ZW5kcyBycntzdGF0aWMgaXNEaXN0YW5jZU1hdHJpeCh0KXtyZXR1cm4gcnIuaXNTeW1tZXRyaWNNYXRyaXgodCkmJiJEaXN0YW5jZU1hdHJpeCI9PT10LmtsYXNzU3ViVHlwZX1jb25zdHJ1Y3Rvcih0KXtpZihzdXBlcih0KSwhdGhpcy5pc0Rpc3RhbmNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvdmlkZWQgYXJndW1lbnRzIGRvIG5vIHByb2R1Y2UgYSBkaXN0YW5jZSBtYXRyaXgiKX1zZXQodCxlLHIpe3JldHVybiB0PT09ZSYmKHI9MCksc3VwZXIuc2V0KHQsZSxyKX1hZGRDcm9zcyh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5kaWFnb25hbFNpemUpLChlPWUuc2xpY2UoKSlbdF09MCxzdXBlci5hZGRDcm9zcyh0LGUpfXRvU3ltbWV0cmljTWF0cml4KCl7cmV0dXJuIG5ldyBycih0aGlzKX1jbG9uZSgpe2NvbnN0IHQ9bmV3IHNyKHRoaXMuZGlhZ29uYWxTaXplKTtmb3IoY29uc3RbZSxyLHNdb2YgdGhpcy51cHBlclJpZ2h0RW50cmllcygpKWUhPT1yJiZ0LnNldChlLHIscyk7cmV0dXJuIHR9dG9Db21wYWN0KCl7Y29uc3R7ZGlhZ29uYWxTaXplOnR9PXRoaXMsZT1uZXcgQXJyYXkoKHQtMSkqdC8yKTtmb3IobGV0IHI9MSxzPTAsbj0wO248ZS5sZW5ndGg7bisrKWVbbl09dGhpcy5nZXQocyxyKSwrK3I+PXQmJihyPTErICsrcyk7cmV0dXJuIGV9c3RhdGljIGZyb21Db21wYWN0KHQpe2NvbnN0IGU9dC5sZW5ndGg7aWYoMD09PWUpcmV0dXJuIG5ldyB0aGlzKDApO2NvbnN0IHI9KE1hdGguc3FydCg4KmUrMSkrMSkvMjtpZighTnVtYmVyLmlzSW50ZWdlcihyKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGlzIGFycmF5IGlzIG5vdCBhIGNvbXBhY3QgcmVwcmVzZW50YXRpb24gb2YgYSBEaXN0YW5jZU1hdHJpeCwgJHtKU09OLnN0cmluZ2lmeSh0KX1gKTtjb25zdCBzPW5ldyB0aGlzKHIpO2ZvcihsZXQgbj0xLG89MCxpPTA7aTxlO2krKylzLnNldChuLG8sdFtpXSksKytuPj1yJiYobj0xKyArK28pO3JldHVybiBzfX1zci5wcm90b3R5cGUua2xhc3NTdWJUeXBlPSJEaXN0YW5jZU1hdHJpeCI7Y2xhc3MgbnIgZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcih0LGUscil7c3VwZXIoKSx0aGlzLm1hdHJpeD10LHRoaXMucm93cz1lLHRoaXMuY29sdW1ucz1yfX1jbGFzcyBvciBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKHQsZSxyKXtLZSh0LGUpLFFlKHQsciksc3VwZXIodCxlLmxlbmd0aCxyLmxlbmd0aCksdGhpcy5yb3dJbmRpY2VzPWUsdGhpcy5jb2x1bW5JbmRpY2VzPXJ9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHRoaXMucm93SW5kaWNlc1t0XSx0aGlzLmNvbHVtbkluZGljZXNbZV0sciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMucm93SW5kaWNlc1t0XSx0aGlzLmNvbHVtbkluZGljZXNbZV0pfX1jbGFzcyBpciBleHRlbmRzIFple2NvbnN0cnVjdG9yKHQsZT17fSl7Y29uc3R7cm93czpyPTF9PWU7aWYodC5sZW5ndGglciE9MCl0aHJvdyBuZXcgRXJyb3IoInRoZSBkYXRhIGxlbmd0aCBpcyBub3QgZGl2aXNpYmxlIGJ5IHRoZSBudW1iZXIgb2Ygcm93cyIpO3N1cGVyKCksdGhpcy5yb3dzPXIsdGhpcy5jb2x1bW5zPXQubGVuZ3RoL3IsdGhpcy5kYXRhPXR9c2V0KHQsZSxyKXtsZXQgcz10aGlzLl9jYWxjdWxhdGVJbmRleCh0LGUpO3JldHVybiB0aGlzLmRhdGFbc109cix0aGlzfWdldCh0LGUpe2xldCByPXRoaXMuX2NhbGN1bGF0ZUluZGV4KHQsZSk7cmV0dXJuIHRoaXMuZGF0YVtyXX1fY2FsY3VsYXRlSW5kZXgodCxlKXtyZXR1cm4gdCp0aGlzLmNvbHVtbnMrZX19Y2xhc3MgdXIgZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGF0YT10LHRoaXMucm93cz10Lmxlbmd0aCx0aGlzLmNvbHVtbnM9dFswXS5sZW5ndGh9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdPXIsdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdfX1jbGFzcyBhcntjb25zdHJ1Y3Rvcih0KXtsZXQgZSxyLHMsbixvLGksdSxhLGwsaD0odD11ci5jaGVja01hdHJpeCh0KSkuY2xvbmUoKSxjPWgucm93cyxmPWguY29sdW1ucyxtPW5ldyBGbG9hdDY0QXJyYXkoYyksZz0xO2ZvcihlPTA7ZTxjO2UrKyltW2VdPWU7Zm9yKGE9bmV3IEZsb2F0NjRBcnJheShjKSxyPTA7cjxmO3IrKyl7Zm9yKGU9MDtlPGM7ZSsrKWFbZV09aC5nZXQoZSxyKTtmb3IoZT0wO2U8YztlKyspe2ZvcihsPU1hdGgubWluKGUsciksbz0wLHM9MDtzPGw7cysrKW8rPWguZ2V0KGUscykqYVtzXTthW2VdLT1vLGguc2V0KGUscixhW2VdKX1mb3Iobj1yLGU9cisxO2U8YztlKyspTWF0aC5hYnMoYVtlXSk+TWF0aC5hYnMoYVtuXSkmJihuPWUpO2lmKG4hPT1yKXtmb3Iocz0wO3M8ZjtzKyspaT1oLmdldChuLHMpLGguc2V0KG4scyxoLmdldChyLHMpKSxoLnNldChyLHMsaSk7dT1tW25dLG1bbl09bVtyXSxtW3JdPXUsZz0tZ31pZihyPGMmJjAhPT1oLmdldChyLHIpKWZvcihlPXIrMTtlPGM7ZSsrKWguc2V0KGUscixoLmdldChlLHIpL2guZ2V0KHIscikpfXRoaXMuTFU9aCx0aGlzLnBpdm90VmVjdG9yPW0sdGhpcy5waXZvdFNpZ249Z31pc1Npbmd1bGFyKCl7bGV0IHQ9dGhpcy5MVSxlPXQuY29sdW1ucztmb3IobGV0IHI9MDtyPGU7cisrKWlmKDA9PT10LmdldChyLHIpKXJldHVybiEwO3JldHVybiExfXNvbHZlKHQpe3Q9ZXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5MVTtpZihlLnJvd3MhPT10LnJvd3MpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG1hdHJpeCBkaW1lbnNpb25zIik7aWYodGhpcy5pc1Npbmd1bGFyKCkpdGhyb3cgbmV3IEVycm9yKCJMVSBtYXRyaXggaXMgc2luZ3VsYXIiKTtsZXQgcixzLG4sbz10LmNvbHVtbnMsaT10LnN1Yk1hdHJpeFJvdyh0aGlzLnBpdm90VmVjdG9yLDAsby0xKSx1PWUuY29sdW1ucztmb3Iobj0wO248dTtuKyspZm9yKHI9bisxO3I8dTtyKyspZm9yKHM9MDtzPG87cysrKWkuc2V0KHIscyxpLmdldChyLHMpLWkuZ2V0KG4scykqZS5nZXQocixuKSk7Zm9yKG49dS0xO24+PTA7bi0tKXtmb3Iocz0wO3M8bztzKyspaS5zZXQobixzLGkuZ2V0KG4scykvZS5nZXQobixuKSk7Zm9yKHI9MDtyPG47cisrKWZvcihzPTA7czxvO3MrKylpLnNldChyLHMsaS5nZXQocixzKS1pLmdldChuLHMpKmUuZ2V0KHIsbikpfXJldHVybiBpfWdldCBkZXRlcm1pbmFudCgpe2xldCB0PXRoaXMuTFU7aWYoIXQuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIHNxdWFyZSIpO2xldCBlPXRoaXMucGl2b3RTaWduLHI9dC5jb2x1bW5zO2ZvcihsZXQgcz0wO3M8cjtzKyspZSo9dC5nZXQocyxzKTtyZXR1cm4gZX1nZXQgbG93ZXJUcmlhbmd1bGFyTWF0cml4KCl7bGV0IHQ9dGhpcy5MVSxlPXQucm93cyxyPXQuY29sdW1ucyxzPW5ldyBlcihlLHIpO2ZvcihsZXQgbj0wO248ZTtuKyspZm9yKGxldCBlPTA7ZTxyO2UrKyluPmU/cy5zZXQobixlLHQuZ2V0KG4sZSkpOm49PT1lP3Muc2V0KG4sZSwxKTpzLnNldChuLGUsMCk7cmV0dXJuIHN9Z2V0IHVwcGVyVHJpYW5ndWxhck1hdHJpeCgpe2xldCB0PXRoaXMuTFUsZT10LnJvd3Mscj10LmNvbHVtbnMscz1uZXcgZXIoZSxyKTtmb3IobGV0IG49MDtuPGU7bisrKWZvcihsZXQgZT0wO2U8cjtlKyspbjw9ZT9zLnNldChuLGUsdC5nZXQobixlKSk6cy5zZXQobixlLDApO3JldHVybiBzfWdldCBwaXZvdFBlcm11dGF0aW9uVmVjdG9yKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5waXZvdFZlY3Rvcil9fWZ1bmN0aW9uIGxyKHQsZSl7bGV0IHI9MDtyZXR1cm4gTWF0aC5hYnModCk+TWF0aC5hYnMoZSk/KHI9ZS90LE1hdGguYWJzKHQpKk1hdGguc3FydCgxK3IqcikpOjAhPT1lPyhyPXQvZSxNYXRoLmFicyhlKSpNYXRoLnNxcnQoMStyKnIpKTowfWNsYXNzIGhye2NvbnN0cnVjdG9yKHQpe2xldCBlLHIscyxuLG89KHQ9dXIuY2hlY2tNYXRyaXgodCkpLmNsb25lKCksaT10LnJvd3MsdT10LmNvbHVtbnMsYT1uZXcgRmxvYXQ2NEFycmF5KHUpO2ZvcihzPTA7czx1O3MrKyl7bGV0IHQ9MDtmb3IoZT1zO2U8aTtlKyspdD1scih0LG8uZ2V0KGUscykpO2lmKDAhPT10KXtmb3Ioby5nZXQocyxzKTwwJiYodD0tdCksZT1zO2U8aTtlKyspby5zZXQoZSxzLG8uZ2V0KGUscykvdCk7Zm9yKG8uc2V0KHMscyxvLmdldChzLHMpKzEpLHI9cysxO3I8dTtyKyspe2ZvcihuPTAsZT1zO2U8aTtlKyspbis9by5nZXQoZSxzKSpvLmdldChlLHIpO2ZvcihuPS1uL28uZ2V0KHMscyksZT1zO2U8aTtlKyspby5zZXQoZSxyLG8uZ2V0KGUscikrbipvLmdldChlLHMpKX19YVtzXT0tdH10aGlzLlFSPW8sdGhpcy5SZGlhZz1hfXNvbHZlKHQpe3Q9ZXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5RUixyPWUucm93cztpZih0LnJvd3MhPT1yKXRocm93IG5ldyBFcnJvcigiTWF0cml4IHJvdyBkaW1lbnNpb25zIG11c3QgYWdyZWUiKTtpZighdGhpcy5pc0Z1bGxSYW5rKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggaXMgcmFuayBkZWZpY2llbnQiKTtsZXQgcyxuLG8saSx1PXQuY29sdW1ucyxhPXQuY2xvbmUoKSxsPWUuY29sdW1ucztmb3Iobz0wO288bDtvKyspZm9yKG49MDtuPHU7bisrKXtmb3IoaT0wLHM9bztzPHI7cysrKWkrPWUuZ2V0KHMsbykqYS5nZXQocyxuKTtmb3IoaT0taS9lLmdldChvLG8pLHM9bztzPHI7cysrKWEuc2V0KHMsbixhLmdldChzLG4pK2kqZS5nZXQocyxvKSl9Zm9yKG89bC0xO28+PTA7by0tKXtmb3Iobj0wO248dTtuKyspYS5zZXQobyxuLGEuZ2V0KG8sbikvdGhpcy5SZGlhZ1tvXSk7Zm9yKHM9MDtzPG87cysrKWZvcihuPTA7bjx1O24rKylhLnNldChzLG4sYS5nZXQocyxuKS1hLmdldChvLG4pKmUuZ2V0KHMsbykpfXJldHVybiBhLnN1Yk1hdHJpeCgwLGwtMSwwLHUtMSl9aXNGdWxsUmFuaygpe2xldCB0PXRoaXMuUVIuY29sdW1ucztmb3IobGV0IGU9MDtlPHQ7ZSsrKWlmKDA9PT10aGlzLlJkaWFnW2VdKXJldHVybiExO3JldHVybiEwfWdldCB1cHBlclRyaWFuZ3VsYXJNYXRyaXgoKXtsZXQgdCxlLHI9dGhpcy5RUixzPXIuY29sdW1ucyxuPW5ldyBlcihzLHMpO2Zvcih0PTA7dDxzO3QrKylmb3IoZT0wO2U8cztlKyspdDxlP24uc2V0KHQsZSxyLmdldCh0LGUpKTp0PT09ZT9uLnNldCh0LGUsdGhpcy5SZGlhZ1t0XSk6bi5zZXQodCxlLDApO3JldHVybiBufWdldCBvcnRob2dvbmFsTWF0cml4KCl7bGV0IHQsZSxyLHMsbj10aGlzLlFSLG89bi5yb3dzLGk9bi5jb2x1bW5zLHU9bmV3IGVyKG8saSk7Zm9yKHI9aS0xO3I+PTA7ci0tKXtmb3IodD0wO3Q8bzt0KyspdS5zZXQodCxyLDApO2Zvcih1LnNldChyLHIsMSksZT1yO2U8aTtlKyspaWYoMCE9PW4uZ2V0KHIscikpe2ZvcihzPTAsdD1yO3Q8bzt0Kyspcys9bi5nZXQodCxyKSp1LmdldCh0LGUpO2ZvcihzPS1zL24uZ2V0KHIsciksdD1yO3Q8bzt0KyspdS5zZXQodCxlLHUuZ2V0KHQsZSkrcypuLmdldCh0LHIpKX19cmV0dXJuIHV9fWNsYXNzIGNye2NvbnN0cnVjdG9yKHQsZT17fSl7aWYoKHQ9dXIuY2hlY2tNYXRyaXgodCkpLmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIG5vbi1lbXB0eSIpO2xldCByPXQucm93cyxzPXQuY29sdW1ucztjb25zdHtjb21wdXRlTGVmdFNpbmd1bGFyVmVjdG9yczpuPSEwLGNvbXB1dGVSaWdodFNpbmd1bGFyVmVjdG9yczpvPSEwLGF1dG9UcmFuc3Bvc2U6aT0hMX09ZTtsZXQgdSxhPUJvb2xlYW4obiksbD1Cb29sZWFuKG8pLGg9ITE7aWYocjxzKWlmKGkpe3U9dC50cmFuc3Bvc2UoKSxyPXUucm93cyxzPXUuY29sdW1ucyxoPSEwO2xldCBlPWE7YT1sLGw9ZX1lbHNlIHU9dC5jbG9uZSgpLGNvbnNvbGUud2FybigiQ29tcHV0aW5nIFNWRCBvbiBhIG1hdHJpeCB3aXRoIG1vcmUgY29sdW1ucyB0aGFuIHJvd3MuIENvbnNpZGVyIGVuYWJsaW5nIGF1dG9UcmFuc3Bvc2UiKTtlbHNlIHU9dC5jbG9uZSgpO2xldCBjPU1hdGgubWluKHIscyksZj1NYXRoLm1pbihyKzEscyksbT1uZXcgRmxvYXQ2NEFycmF5KGYpLGc9bmV3IGVyKHIsYyksdz1uZXcgZXIocyxzKSxwPW5ldyBGbG9hdDY0QXJyYXkocyksZD1uZXcgRmxvYXQ2NEFycmF5KHIpLHk9bmV3IEZsb2F0NjRBcnJheShmKTtmb3IobGV0IHQ9MDt0PGY7dCsrKXlbdF09dDtsZXQgYj1NYXRoLm1pbihyLTEscyksTT1NYXRoLm1heCgwLE1hdGgubWluKHMtMixyKSksdj1NYXRoLm1heChiLE0pO2ZvcihsZXQgdD0wO3Q8djt0Kyspe2lmKHQ8Yil7bVt0XT0wO2ZvcihsZXQgZT10O2U8cjtlKyspbVt0XT1scihtW3RdLHUuZ2V0KGUsdCkpO2lmKDAhPT1tW3RdKXt1LmdldCh0LHQpPDAmJihtW3RdPS1tW3RdKTtmb3IobGV0IGU9dDtlPHI7ZSsrKXUuc2V0KGUsdCx1LmdldChlLHQpL21bdF0pO3Uuc2V0KHQsdCx1LmdldCh0LHQpKzEpfW1bdF09LW1bdF19Zm9yKGxldCBlPXQrMTtlPHM7ZSsrKXtpZih0PGImJjAhPT1tW3RdKXtsZXQgcz0wO2ZvcihsZXQgbj10O248cjtuKyspcys9dS5nZXQobix0KSp1LmdldChuLGUpO3M9LXMvdS5nZXQodCx0KTtmb3IobGV0IG49dDtuPHI7bisrKXUuc2V0KG4sZSx1LmdldChuLGUpK3MqdS5nZXQobix0KSl9cFtlXT11LmdldCh0LGUpfWlmKGEmJnQ8Yilmb3IobGV0IGU9dDtlPHI7ZSsrKWcuc2V0KGUsdCx1LmdldChlLHQpKTtpZih0PE0pe3BbdF09MDtmb3IobGV0IGU9dCsxO2U8cztlKyspcFt0XT1scihwW3RdLHBbZV0pO2lmKDAhPT1wW3RdKXtwW3QrMV08MCYmKHBbdF09MC1wW3RdKTtmb3IobGV0IGU9dCsxO2U8cztlKyspcFtlXS89cFt0XTtwW3QrMV0rPTF9aWYocFt0XT0tcFt0XSx0KzE8ciYmMCE9PXBbdF0pe2ZvcihsZXQgZT10KzE7ZTxyO2UrKylkW2VdPTA7Zm9yKGxldCBlPXQrMTtlPHI7ZSsrKWZvcihsZXQgcj10KzE7cjxzO3IrKylkW2VdKz1wW3JdKnUuZ2V0KGUscik7Zm9yKGxldCBlPXQrMTtlPHM7ZSsrKXtsZXQgcz0tcFtlXS9wW3QrMV07Zm9yKGxldCBuPXQrMTtuPHI7bisrKXUuc2V0KG4sZSx1LmdldChuLGUpK3MqZFtuXSl9fWlmKGwpZm9yKGxldCBlPXQrMTtlPHM7ZSsrKXcuc2V0KGUsdCxwW2VdKX19bGV0IHg9TWF0aC5taW4ocyxyKzEpO2lmKGI8cyYmKG1bYl09dS5nZXQoYixiKSkscjx4JiYobVt4LTFdPTApLE0rMTx4JiYocFtNXT11LmdldChNLHgtMSkpLHBbeC0xXT0wLGEpe2ZvcihsZXQgdD1iO3Q8Yzt0Kyspe2ZvcihsZXQgZT0wO2U8cjtlKyspZy5zZXQoZSx0LDApO2cuc2V0KHQsdCwxKX1mb3IobGV0IHQ9Yi0xO3Q+PTA7dC0tKWlmKDAhPT1tW3RdKXtmb3IobGV0IGU9dCsxO2U8YztlKyspe2xldCBzPTA7Zm9yKGxldCBuPXQ7bjxyO24rKylzKz1nLmdldChuLHQpKmcuZ2V0KG4sZSk7cz0tcy9nLmdldCh0LHQpO2ZvcihsZXQgbj10O248cjtuKyspZy5zZXQobixlLGcuZ2V0KG4sZSkrcypnLmdldChuLHQpKX1mb3IobGV0IGU9dDtlPHI7ZSsrKWcuc2V0KGUsdCwtZy5nZXQoZSx0KSk7Zy5zZXQodCx0LDErZy5nZXQodCx0KSk7Zm9yKGxldCBlPTA7ZTx0LTE7ZSsrKWcuc2V0KGUsdCwwKX1lbHNle2ZvcihsZXQgZT0wO2U8cjtlKyspZy5zZXQoZSx0LDApO2cuc2V0KHQsdCwxKX19aWYobClmb3IobGV0IHQ9cy0xO3Q+PTA7dC0tKXtpZih0PE0mJjAhPT1wW3RdKWZvcihsZXQgZT10KzE7ZTxzO2UrKyl7bGV0IHI9MDtmb3IobGV0IG49dCsxO248cztuKyspcis9dy5nZXQobix0KSp3LmdldChuLGUpO3I9LXIvdy5nZXQodCsxLHQpO2ZvcihsZXQgbj10KzE7bjxzO24rKyl3LnNldChuLGUsdy5nZXQobixlKStyKncuZ2V0KG4sdCkpfWZvcihsZXQgZT0wO2U8cztlKyspdy5zZXQoZSx0LDApO3cuc2V0KHQsdCwxKX1sZXQgRT14LTEsUz1OdW1iZXIuRVBTSUxPTjtmb3IoO3g+MDspe2xldCB0LGU7Zm9yKHQ9eC0yO3Q+PS0xJiYtMSE9PXQ7dC0tKXtjb25zdCBlPU51bWJlci5NSU5fVkFMVUUrUypNYXRoLmFicyhtW3RdK01hdGguYWJzKG1bdCsxXSkpO2lmKE1hdGguYWJzKHBbdF0pPD1lfHxOdW1iZXIuaXNOYU4ocFt0XSkpe3BbdF09MDticmVha319aWYodD09PXgtMillPTQ7ZWxzZXtsZXQgcjtmb3Iocj14LTE7cj49dCYmciE9PXQ7ci0tKXtsZXQgZT0ociE9PXg/TWF0aC5hYnMocFtyXSk6MCkrKHIhPT10KzE/TWF0aC5hYnMocFtyLTFdKTowKTtpZihNYXRoLmFicyhtW3JdKTw9UyplKXttW3JdPTA7YnJlYWt9fXI9PT10P2U9MzpyPT09eC0xP2U9MTooZT0yLHQ9cil9c3dpdGNoKHQrKyxlKXtjYXNlIDE6e2xldCBlPXBbeC0yXTtwW3gtMl09MDtmb3IobGV0IHI9eC0yO3I+PXQ7ci0tKXtsZXQgbj1scihtW3JdLGUpLG89bVtyXS9uLGk9ZS9uO2lmKG1bcl09bixyIT09dCYmKGU9LWkqcFtyLTFdLHBbci0xXT1vKnBbci0xXSksbClmb3IobGV0IHQ9MDt0PHM7dCsrKW49byp3LmdldCh0LHIpK2kqdy5nZXQodCx4LTEpLHcuc2V0KHQseC0xLC1pKncuZ2V0KHQscikrbyp3LmdldCh0LHgtMSkpLHcuc2V0KHQscixuKX1icmVha31jYXNlIDI6e2xldCBlPXBbdC0xXTtwW3QtMV09MDtmb3IobGV0IHM9dDtzPHg7cysrKXtsZXQgbj1scihtW3NdLGUpLG89bVtzXS9uLGk9ZS9uO2lmKG1bc109bixlPS1pKnBbc10scFtzXT1vKnBbc10sYSlmb3IobGV0IGU9MDtlPHI7ZSsrKW49bypnLmdldChlLHMpK2kqZy5nZXQoZSx0LTEpLGcuc2V0KGUsdC0xLC1pKmcuZ2V0KGUscykrbypnLmdldChlLHQtMSkpLGcuc2V0KGUscyxuKX1icmVha31jYXNlIDM6e2NvbnN0IGU9TWF0aC5tYXgoTWF0aC5hYnMobVt4LTFdKSxNYXRoLmFicyhtW3gtMl0pLE1hdGguYWJzKHBbeC0yXSksTWF0aC5hYnMobVt0XSksTWF0aC5hYnMocFt0XSkpLG49bVt4LTFdL2Usbz1tW3gtMl0vZSxpPXBbeC0yXS9lLHU9bVt0XS9lLGg9cFt0XS9lLGM9KChvK24pKihvLW4pK2kqaSkvMixmPW4qaSoobippKTtsZXQgZD0wOzA9PT1jJiYwPT09Znx8KGQ9YzwwPzAtTWF0aC5zcXJ0KGMqYytmKTpNYXRoLnNxcnQoYypjK2YpLGQ9Zi8oYytkKSk7bGV0IHk9KHUrbikqKHUtbikrZCxiPXUqaDtmb3IobGV0IGU9dDtlPHgtMTtlKyspe2xldCBuPWxyKHksYik7MD09PW4mJihuPU51bWJlci5NSU5fVkFMVUUpO2xldCBvPXkvbixpPWIvbjtpZihlIT09dCYmKHBbZS0xXT1uKSx5PW8qbVtlXStpKnBbZV0scFtlXT1vKnBbZV0taSptW2VdLGI9aSptW2UrMV0sbVtlKzFdPW8qbVtlKzFdLGwpZm9yKGxldCB0PTA7dDxzO3QrKyluPW8qdy5nZXQodCxlKStpKncuZ2V0KHQsZSsxKSx3LnNldCh0LGUrMSwtaSp3LmdldCh0LGUpK28qdy5nZXQodCxlKzEpKSx3LnNldCh0LGUsbik7aWYobj1scih5LGIpLDA9PT1uJiYobj1OdW1iZXIuTUlOX1ZBTFVFKSxvPXkvbixpPWIvbixtW2VdPW4seT1vKnBbZV0raSptW2UrMV0sbVtlKzFdPS1pKnBbZV0rbyptW2UrMV0sYj1pKnBbZSsxXSxwW2UrMV09bypwW2UrMV0sYSYmZTxyLTEpZm9yKGxldCB0PTA7dDxyO3QrKyluPW8qZy5nZXQodCxlKStpKmcuZ2V0KHQsZSsxKSxnLnNldCh0LGUrMSwtaSpnLmdldCh0LGUpK28qZy5nZXQodCxlKzEpKSxnLnNldCh0LGUsbil9cFt4LTJdPXk7YnJlYWt9Y2FzZSA0OmlmKG1bdF08PTAmJihtW3RdPW1bdF08MD8tbVt0XTowLGwpKWZvcihsZXQgZT0wO2U8PUU7ZSsrKXcuc2V0KGUsdCwtdy5nZXQoZSx0KSk7Zm9yKDt0PEUmJiEobVt0XT49bVt0KzFdKTspe2xldCBlPW1bdF07aWYobVt0XT1tW3QrMV0sbVt0KzFdPWUsbCYmdDxzLTEpZm9yKGxldCByPTA7cjxzO3IrKyllPXcuZ2V0KHIsdCsxKSx3LnNldChyLHQrMSx3LmdldChyLHQpKSx3LnNldChyLHQsZSk7aWYoYSYmdDxyLTEpZm9yKGxldCBzPTA7czxyO3MrKyllPWcuZ2V0KHMsdCsxKSxnLnNldChzLHQrMSxnLmdldChzLHQpKSxnLnNldChzLHQsZSk7dCsrfXgtLX19aWYoaCl7bGV0IHQ9dzt3PWcsZz10fXRoaXMubT1yLHRoaXMubj1zLHRoaXMucz1tLHRoaXMuVT1nLHRoaXMuVj13fXNvbHZlKHQpe2xldCBlPXQscj10aGlzLnRocmVzaG9sZCxzPXRoaXMucy5sZW5ndGgsbj1lci56ZXJvcyhzLHMpO2ZvcihsZXQgdD0wO3Q8czt0KyspTWF0aC5hYnModGhpcy5zW3RdKTw9cj9uLnNldCh0LHQsMCk6bi5zZXQodCx0LDEvdGhpcy5zW3RdKTtsZXQgbz10aGlzLlUsaT10aGlzLnJpZ2h0U2luZ3VsYXJWZWN0b3JzLHU9aS5tbXVsKG4pLGE9aS5yb3dzLGw9by5yb3dzLGg9ZXIuemVyb3MoYSxsKTtmb3IobGV0IHQ9MDt0PGE7dCsrKWZvcihsZXQgZT0wO2U8bDtlKyspe2xldCByPTA7Zm9yKGxldCBuPTA7bjxzO24rKylyKz11LmdldCh0LG4pKm8uZ2V0KGUsbik7aC5zZXQodCxlLHIpfXJldHVybiBoLm1tdWwoZSl9c29sdmVGb3JEaWFnb25hbCh0KXtyZXR1cm4gdGhpcy5zb2x2ZShlci5kaWFnKHQpKX1pbnZlcnNlKCl7bGV0IHQ9dGhpcy5WLGU9dGhpcy50aHJlc2hvbGQscj10LnJvd3Mscz10LmNvbHVtbnMsbj1uZXcgZXIocix0aGlzLnMubGVuZ3RoKTtmb3IobGV0IG89MDtvPHI7bysrKWZvcihsZXQgcj0wO3I8cztyKyspTWF0aC5hYnModGhpcy5zW3JdKT5lJiZuLnNldChvLHIsdC5nZXQobyxyKS90aGlzLnNbcl0pO2xldCBvPXRoaXMuVSxpPW8ucm93cyx1PW8uY29sdW1ucyxhPW5ldyBlcihyLGkpO2ZvcihsZXQgdD0wO3Q8cjt0KyspZm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IHI9MDtmb3IobGV0IHM9MDtzPHU7cysrKXIrPW4uZ2V0KHQscykqby5nZXQoZSxzKTthLnNldCh0LGUscil9cmV0dXJuIGF9Z2V0IGNvbmRpdGlvbigpe3JldHVybiB0aGlzLnNbMF0vdGhpcy5zW01hdGgubWluKHRoaXMubSx0aGlzLm4pLTFdfWdldCBub3JtMigpe3JldHVybiB0aGlzLnNbMF19Z2V0IHJhbmsoKXtsZXQgdD1NYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF0qTnVtYmVyLkVQU0lMT04sZT0wLHI9dGhpcy5zO2ZvcihsZXQgcz0wLG49ci5sZW5ndGg7czxuO3MrKylyW3NdPnQmJmUrKztyZXR1cm4gZX1nZXQgZGlhZ29uYWwoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnMpfWdldCB0aHJlc2hvbGQoKXtyZXR1cm4gTnVtYmVyLkVQU0lMT04vMipNYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF19Z2V0IGxlZnRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5VfWdldCByaWdodFNpbmd1bGFyVmVjdG9ycygpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7cmV0dXJuIGVyLmRpYWcodGhpcy5zKX19ZnVuY3Rpb24gZnIodCxlLHI9ITEpe3JldHVybiB0PXVyLmNoZWNrTWF0cml4KHQpLGU9dXIuY2hlY2tNYXRyaXgoZSkscj9uZXcgY3IodCkuc29sdmUoZSk6dC5pc1NxdWFyZSgpP25ldyBhcih0KS5zb2x2ZShlKTpuZXcgaHIodCkuc29sdmUoZSl9ZnVuY3Rpb24gbXIodCxlKXtsZXQgcj1bXTtmb3IobGV0IHM9MDtzPHQ7cysrKXMhPT1lJiZyLnB1c2gocyk7cmV0dXJuIHJ9ZnVuY3Rpb24gZ3IodCxlLHIscz0xZS05LG49MWUtOSl7aWYodD5uKXJldHVybiBuZXcgQXJyYXkoZS5yb3dzKzEpLmZpbGwoMCk7e2xldCB0PWUuYWRkUm93KHIsWzBdKTtmb3IobGV0IGU9MDtlPHQucm93cztlKyspTWF0aC5hYnModC5nZXQoZSwwKSk8cyYmdC5zZXQoZSwwLDApO3JldHVybiB0LnRvMURBcnJheSgpfX1jbGFzcyB3cntjb25zdHJ1Y3Rvcih0LGU9e30pe2NvbnN0e2Fzc3VtZVN5bW1ldHJpYzpyPSExfT1lO2lmKCEodD11ci5jaGVja01hdHJpeCh0KSkuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBpcyBub3QgYSBzcXVhcmUgbWF0cml4Iik7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgcyxuLG89dC5jb2x1bW5zLGk9bmV3IGVyKG8sbyksdT1uZXcgRmxvYXQ2NEFycmF5KG8pLGE9bmV3IEZsb2F0NjRBcnJheShvKSxsPXQsaD0hMTtpZihoPSEhcnx8dC5pc1N5bW1ldHJpYygpLGgpe2ZvcihzPTA7czxvO3MrKylmb3Iobj0wO248bztuKyspaS5zZXQocyxuLGwuZ2V0KHMsbikpOyFmdW5jdGlvbih0LGUscixzKXtsZXQgbixvLGksdSxhLGwsaCxjO2ZvcihhPTA7YTx0O2ErKylyW2FdPXMuZ2V0KHQtMSxhKTtmb3IodT10LTE7dT4wO3UtLSl7Zm9yKGM9MCxpPTAsbD0wO2w8dTtsKyspYys9TWF0aC5hYnMocltsXSk7aWYoMD09PWMpZm9yKGVbdV09clt1LTFdLGE9MDthPHU7YSsrKXJbYV09cy5nZXQodS0xLGEpLHMuc2V0KHUsYSwwKSxzLnNldChhLHUsMCk7ZWxzZXtmb3IobD0wO2w8dTtsKyspcltsXS89YyxpKz1yW2xdKnJbbF07Zm9yKG49clt1LTFdLG89TWF0aC5zcXJ0KGkpLG4+MCYmKG89LW8pLGVbdV09YypvLGktPW4qbyxyW3UtMV09bi1vLGE9MDthPHU7YSsrKWVbYV09MDtmb3IoYT0wO2E8dTthKyspe2ZvcihuPXJbYV0scy5zZXQoYSx1LG4pLG89ZVthXStzLmdldChhLGEpKm4sbD1hKzE7bDw9dS0xO2wrKylvKz1zLmdldChsLGEpKnJbbF0sZVtsXSs9cy5nZXQobCxhKSpuO2VbYV09b31mb3Iobj0wLGE9MDthPHU7YSsrKWVbYV0vPWksbis9ZVthXSpyW2FdO2ZvcihoPW4vKGkraSksYT0wO2E8dTthKyspZVthXS09aCpyW2FdO2ZvcihhPTA7YTx1O2ErKyl7Zm9yKG49clthXSxvPWVbYV0sbD1hO2w8PXUtMTtsKyspcy5zZXQobCxhLHMuZ2V0KGwsYSktKG4qZVtsXStvKnJbbF0pKTtyW2FdPXMuZ2V0KHUtMSxhKSxzLnNldCh1LGEsMCl9fXJbdV09aX1mb3IodT0wO3U8dC0xO3UrKyl7aWYocy5zZXQodC0xLHUscy5nZXQodSx1KSkscy5zZXQodSx1LDEpLGk9clt1KzFdLDAhPT1pKXtmb3IobD0wO2w8PXU7bCsrKXJbbF09cy5nZXQobCx1KzEpL2k7Zm9yKGE9MDthPD11O2ErKyl7Zm9yKG89MCxsPTA7bDw9dTtsKyspbys9cy5nZXQobCx1KzEpKnMuZ2V0KGwsYSk7Zm9yKGw9MDtsPD11O2wrKylzLnNldChsLGEscy5nZXQobCxhKS1vKnJbbF0pfX1mb3IobD0wO2w8PXU7bCsrKXMuc2V0KGwsdSsxLDApfWZvcihhPTA7YTx0O2ErKylyW2FdPXMuZ2V0KHQtMSxhKSxzLnNldCh0LTEsYSwwKTtzLnNldCh0LTEsdC0xLDEpLGVbMF09MH0obyxhLHUsaSksZnVuY3Rpb24odCxlLHIscyl7bGV0IG4sbyxpLHUsYSxsLGgsYyxmLG0sZyx3LHAsZCx5LGI7Zm9yKGk9MTtpPHQ7aSsrKWVbaS0xXT1lW2ldO2VbdC0xXT0wO2xldCBNPTAsdj0wLHg9TnVtYmVyLkVQU0lMT047Zm9yKGw9MDtsPHQ7bCsrKXtmb3Iodj1NYXRoLm1heCh2LE1hdGguYWJzKHJbbF0pK01hdGguYWJzKGVbbF0pKSxoPWw7aDx0JiYhKE1hdGguYWJzKGVbaF0pPD14KnYpOyloKys7aWYoaD5sKWRve2ZvcihuPXJbbF0sYz0ocltsKzFdLW4pLygyKmVbbF0pLGY9bHIoYywxKSxjPDAmJihmPS1mKSxyW2xdPWVbbF0vKGMrZikscltsKzFdPWVbbF0qKGMrZiksbT1yW2wrMV0sbz1uLXJbbF0saT1sKzI7aTx0O2krKylyW2ldLT1vO2ZvcihNKz1vLGM9cltoXSxnPTEsdz1nLHA9ZyxkPWVbbCsxXSx5PTAsYj0wLGk9aC0xO2k+PWw7aS0tKWZvcihwPXcsdz1nLGI9eSxuPWcqZVtpXSxvPWcqYyxmPWxyKGMsZVtpXSksZVtpKzFdPXkqZix5PWVbaV0vZixnPWMvZixjPWcqcltpXS15Km4scltpKzFdPW8reSooZypuK3kqcltpXSksYT0wO2E8dDthKyspbz1zLmdldChhLGkrMSkscy5zZXQoYSxpKzEseSpzLmdldChhLGkpK2cqbykscy5zZXQoYSxpLGcqcy5nZXQoYSxpKS15Km8pO2M9LXkqYipwKmQqZVtsXS9tLGVbbF09eSpjLHJbbF09ZypjfXdoaWxlKE1hdGguYWJzKGVbbF0pPngqdik7cltsXT1yW2xdK00sZVtsXT0wfWZvcihpPTA7aTx0LTE7aSsrKXtmb3IoYT1pLGM9cltpXSx1PWkrMTt1PHQ7dSsrKXJbdV08YyYmKGE9dSxjPXJbdV0pO2lmKGEhPT1pKWZvcihyW2FdPXJbaV0scltpXT1jLHU9MDt1PHQ7dSsrKWM9cy5nZXQodSxpKSxzLnNldCh1LGkscy5nZXQodSxhKSkscy5zZXQodSxhLGMpfX0obyxhLHUsaSl9ZWxzZXtsZXQgdD1uZXcgZXIobyxvKSxlPW5ldyBGbG9hdDY0QXJyYXkobyk7Zm9yKG49MDtuPG87bisrKWZvcihzPTA7czxvO3MrKyl0LnNldChzLG4sbC5nZXQocyxuKSk7IWZ1bmN0aW9uKHQsZSxyLHMpe2xldCBuLG8saSx1LGEsbCxoLGM9MCxmPXQtMTtmb3IobD1jKzE7bDw9Zi0xO2wrKyl7Zm9yKGg9MCx1PWw7dTw9Zjt1KyspaCs9TWF0aC5hYnMoZS5nZXQodSxsLTEpKTtpZigwIT09aCl7Zm9yKGk9MCx1PWY7dT49bDt1LS0pclt1XT1lLmdldCh1LGwtMSkvaCxpKz1yW3VdKnJbdV07Zm9yKG89TWF0aC5zcXJ0KGkpLHJbbF0+MCYmKG89LW8pLGktPXJbbF0qbyxyW2xdPXJbbF0tbyxhPWw7YTx0O2ErKyl7Zm9yKG49MCx1PWY7dT49bDt1LS0pbis9clt1XSplLmdldCh1LGEpO2ZvcihuLz1pLHU9bDt1PD1mO3UrKyllLnNldCh1LGEsZS5nZXQodSxhKS1uKnJbdV0pfWZvcih1PTA7dTw9Zjt1Kyspe2ZvcihuPTAsYT1mO2E+PWw7YS0tKW4rPXJbYV0qZS5nZXQodSxhKTtmb3Iobi89aSxhPWw7YTw9ZjthKyspZS5zZXQodSxhLGUuZ2V0KHUsYSktbipyW2FdKX1yW2xdPWgqcltsXSxlLnNldChsLGwtMSxoKm8pfX1mb3IodT0wO3U8dDt1KyspZm9yKGE9MDthPHQ7YSsrKXMuc2V0KHUsYSx1PT09YT8xOjApO2ZvcihsPWYtMTtsPj1jKzE7bC0tKWlmKDAhPT1lLmdldChsLGwtMSkpe2Zvcih1PWwrMTt1PD1mO3UrKylyW3VdPWUuZ2V0KHUsbC0xKTtmb3IoYT1sO2E8PWY7YSsrKXtmb3Iobz0wLHU9bDt1PD1mO3UrKylvKz1yW3VdKnMuZ2V0KHUsYSk7Zm9yKG89by9yW2xdL2UuZ2V0KGwsbC0xKSx1PWw7dTw9Zjt1Kyspcy5zZXQodSxhLHMuZ2V0KHUsYSkrbypyW3VdKX19fShvLHQsZSxpKSxmdW5jdGlvbih0LGUscixzLG4pe2xldCBvLGksdSxhLGwsaCxjLGYsbSxnLHcscCxkLHksYixNPXQtMSx2PTAseD10LTEsRT1OdW1iZXIuRVBTSUxPTixTPTAsXz0wLGo9MCxBPTAsUj0wLEk9MCxDPTAsTj0wO2ZvcihvPTA7bzx0O28rKylmb3IoKG88dnx8bz54KSYmKHJbb109bi5nZXQobyxvKSxlW29dPTApLGk9TWF0aC5tYXgoby0xLDApO2k8dDtpKyspXys9TWF0aC5hYnMobi5nZXQobyxpKSk7Zm9yKDtNPj12Oyl7Zm9yKGE9TTthPnYmJihJPU1hdGguYWJzKG4uZ2V0KGEtMSxhLTEpKStNYXRoLmFicyhuLmdldChhLGEpKSwwPT09SSYmKEk9XyksIShNYXRoLmFicyhuLmdldChhLGEtMSkpPEUqSSkpOylhLS07aWYoYT09PU0pbi5zZXQoTSxNLG4uZ2V0KE0sTSkrUykscltNXT1uLmdldChNLE0pLGVbTV09MCxNLS0sTj0wO2Vsc2UgaWYoYT09PU0tMSl7aWYoYz1uLmdldChNLE0tMSkqbi5nZXQoTS0xLE0pLGo9KG4uZ2V0KE0tMSxNLTEpLW4uZ2V0KE0sTSkpLzIsQT1qKmorYyxDPU1hdGguc3FydChNYXRoLmFicyhBKSksbi5zZXQoTSxNLG4uZ2V0KE0sTSkrUyksbi5zZXQoTS0xLE0tMSxuLmdldChNLTEsTS0xKStTKSxmPW4uZ2V0KE0sTSksQT49MCl7Zm9yKEM9aj49MD9qK0M6ai1DLHJbTS0xXT1mK0MscltNXT1yW00tMV0sMCE9PUMmJihyW01dPWYtYy9DKSxlW00tMV09MCxlW01dPTAsZj1uLmdldChNLE0tMSksST1NYXRoLmFicyhmKStNYXRoLmFicyhDKSxqPWYvSSxBPUMvSSxSPU1hdGguc3FydChqKmorQSpBKSxqLz1SLEEvPVIsaT1NLTE7aTx0O2krKylDPW4uZ2V0KE0tMSxpKSxuLnNldChNLTEsaSxBKkMraipuLmdldChNLGkpKSxuLnNldChNLGksQSpuLmdldChNLGkpLWoqQyk7Zm9yKG89MDtvPD1NO28rKylDPW4uZ2V0KG8sTS0xKSxuLnNldChvLE0tMSxBKkMraipuLmdldChvLE0pKSxuLnNldChvLE0sQSpuLmdldChvLE0pLWoqQyk7Zm9yKG89djtvPD14O28rKylDPXMuZ2V0KG8sTS0xKSxzLnNldChvLE0tMSxBKkMraipzLmdldChvLE0pKSxzLnNldChvLE0sQSpzLmdldChvLE0pLWoqQyl9ZWxzZSByW00tMV09ZitqLHJbTV09ZitqLGVbTS0xXT1DLGVbTV09LUM7TS09MixOPTB9ZWxzZXtpZihmPW4uZ2V0KE0sTSksbT0wLGM9MCxhPE0mJihtPW4uZ2V0KE0tMSxNLTEpLGM9bi5nZXQoTSxNLTEpKm4uZ2V0KE0tMSxNKSksMTA9PT1OKXtmb3IoUys9ZixvPXY7bzw9TTtvKyspbi5zZXQobyxvLG4uZ2V0KG8sbyktZik7ST1NYXRoLmFicyhuLmdldChNLE0tMSkpK01hdGguYWJzKG4uZ2V0KE0tMSxNLTIpKSxmPW09Ljc1KkksYz0tLjQzNzUqSSpJfWlmKDMwPT09TiYmKEk9KG0tZikvMixJPUkqSStjLEk+MCkpe2ZvcihJPU1hdGguc3FydChJKSxtPGYmJihJPS1JKSxJPWYtYy8oKG0tZikvMitJKSxvPXY7bzw9TTtvKyspbi5zZXQobyxvLG4uZ2V0KG8sbyktSSk7Uys9SSxmPW09Yz0uOTY0fWZvcihOKz0xLGw9TS0yO2w+PWEmJihDPW4uZ2V0KGwsbCksUj1mLUMsST1tLUMsaj0oUipJLWMpL24uZ2V0KGwrMSxsKStuLmdldChsLGwrMSksQT1uLmdldChsKzEsbCsxKS1DLVItSSxSPW4uZ2V0KGwrMixsKzEpLEk9TWF0aC5hYnMoaikrTWF0aC5hYnMoQSkrTWF0aC5hYnMoUiksai89SSxBLz1JLFIvPUksbCE9PWEpJiYhKE1hdGguYWJzKG4uZ2V0KGwsbC0xKSkqKE1hdGguYWJzKEEpK01hdGguYWJzKFIpKTxFKihNYXRoLmFicyhqKSooTWF0aC5hYnMobi5nZXQobC0xLGwtMSkpK01hdGguYWJzKEMpK01hdGguYWJzKG4uZ2V0KGwrMSxsKzEpKSkpKTspbC0tO2ZvcihvPWwrMjtvPD1NO28rKyluLnNldChvLG8tMiwwKSxvPmwrMiYmbi5zZXQobyxvLTMsMCk7Zm9yKHU9bDt1PD1NLTEmJih5PXUhPT1NLTEsdSE9PWwmJihqPW4uZ2V0KHUsdS0xKSxBPW4uZ2V0KHUrMSx1LTEpLFI9eT9uLmdldCh1KzIsdS0xKTowLGY9TWF0aC5hYnMoaikrTWF0aC5hYnMoQSkrTWF0aC5hYnMoUiksMCE9PWYmJihqLz1mLEEvPWYsUi89ZikpLDAhPT1mKTt1KyspaWYoST1NYXRoLnNxcnQoaipqK0EqQStSKlIpLGo8MCYmKEk9LUkpLDAhPT1JKXtmb3IodSE9PWw/bi5zZXQodSx1LTEsLUkqZik6YSE9PWwmJm4uc2V0KHUsdS0xLC1uLmdldCh1LHUtMSkpLGorPUksZj1qL0ksbT1BL0ksQz1SL0ksQS89aixSLz1qLGk9dTtpPHQ7aSsrKWo9bi5nZXQodSxpKStBKm4uZ2V0KHUrMSxpKSx5JiYoais9UipuLmdldCh1KzIsaSksbi5zZXQodSsyLGksbi5nZXQodSsyLGkpLWoqQykpLG4uc2V0KHUsaSxuLmdldCh1LGkpLWoqZiksbi5zZXQodSsxLGksbi5nZXQodSsxLGkpLWoqbSk7Zm9yKG89MDtvPD1NYXRoLm1pbihNLHUrMyk7bysrKWo9ZipuLmdldChvLHUpK20qbi5nZXQobyx1KzEpLHkmJihqKz1DKm4uZ2V0KG8sdSsyKSxuLnNldChvLHUrMixuLmdldChvLHUrMiktaipSKSksbi5zZXQobyx1LG4uZ2V0KG8sdSktaiksbi5zZXQobyx1KzEsbi5nZXQobyx1KzEpLWoqQSk7Zm9yKG89djtvPD14O28rKylqPWYqcy5nZXQobyx1KSttKnMuZ2V0KG8sdSsxKSx5JiYoais9QypzLmdldChvLHUrMikscy5zZXQobyx1KzIscy5nZXQobyx1KzIpLWoqUikpLHMuc2V0KG8sdSxzLmdldChvLHUpLWopLHMuc2V0KG8sdSsxLHMuZ2V0KG8sdSsxKS1qKkEpfX19aWYoMD09PV8pcmV0dXJuO2ZvcihNPXQtMTtNPj0wO00tLSlpZihqPXJbTV0sQT1lW01dLDA9PT1BKWZvcihhPU0sbi5zZXQoTSxNLDEpLG89TS0xO28+PTA7by0tKXtmb3IoYz1uLmdldChvLG8pLWosUj0wLGk9YTtpPD1NO2krKylSKz1uLmdldChvLGkpKm4uZ2V0KGksTSk7aWYoZVtvXTwwKUM9YyxJPVI7ZWxzZSBpZihhPW8sMD09PWVbb10/bi5zZXQobyxNLDAhPT1jPy1SL2M6LVIvKEUqXykpOihmPW4uZ2V0KG8sbysxKSxtPW4uZ2V0KG8rMSxvKSxBPShyW29dLWopKihyW29dLWopK2Vbb10qZVtvXSxoPShmKkktQypSKS9BLG4uc2V0KG8sTSxoKSxuLnNldChvKzEsTSxNYXRoLmFicyhmKT5NYXRoLmFicyhDKT8oLVItYypoKS9mOigtSS1tKmgpL0MpKSxoPU1hdGguYWJzKG4uZ2V0KG8sTSkpLEUqaCpoPjEpZm9yKGk9bztpPD1NO2krKyluLnNldChpLE0sbi5nZXQoaSxNKS9oKX1lbHNlIGlmKEE8MClmb3IoYT1NLTEsTWF0aC5hYnMobi5nZXQoTSxNLTEpKT5NYXRoLmFicyhuLmdldChNLTEsTSkpPyhuLnNldChNLTEsTS0xLEEvbi5nZXQoTSxNLTEpKSxuLnNldChNLTEsTSwtKG4uZ2V0KE0sTSktaikvbi5nZXQoTSxNLTEpKSk6KGI9cHIoMCwtbi5nZXQoTS0xLE0pLG4uZ2V0KE0tMSxNLTEpLWosQSksbi5zZXQoTS0xLE0tMSxiWzBdKSxuLnNldChNLTEsTSxiWzFdKSksbi5zZXQoTSxNLTEsMCksbi5zZXQoTSxNLDEpLG89TS0yO28+PTA7by0tKXtmb3IoZz0wLHc9MCxpPWE7aTw9TTtpKyspZys9bi5nZXQobyxpKSpuLmdldChpLE0tMSksdys9bi5nZXQobyxpKSpuLmdldChpLE0pO2lmKGM9bi5nZXQobyxvKS1qLGVbb108MClDPWMsUj1nLEk9dztlbHNlIGlmKGE9bywwPT09ZVtvXT8oYj1wcigtZywtdyxjLEEpLG4uc2V0KG8sTS0xLGJbMF0pLG4uc2V0KG8sTSxiWzFdKSk6KGY9bi5nZXQobyxvKzEpLG09bi5nZXQobysxLG8pLHA9KHJbb10taikqKHJbb10taikrZVtvXSplW29dLUEqQSxkPTIqKHJbb10taikqQSwwPT09cCYmMD09PWQmJihwPUUqXyooTWF0aC5hYnMoYykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoZikrTWF0aC5hYnMobSkrTWF0aC5hYnMoQykpKSxiPXByKGYqUi1DKmcrQSp3LGYqSS1DKnctQSpnLHAsZCksbi5zZXQobyxNLTEsYlswXSksbi5zZXQobyxNLGJbMV0pLE1hdGguYWJzKGYpPk1hdGguYWJzKEMpK01hdGguYWJzKEEpPyhuLnNldChvKzEsTS0xLCgtZy1jKm4uZ2V0KG8sTS0xKStBKm4uZ2V0KG8sTSkpL2YpLG4uc2V0KG8rMSxNLCgtdy1jKm4uZ2V0KG8sTSktQSpuLmdldChvLE0tMSkpL2YpKTooYj1wcigtUi1tKm4uZ2V0KG8sTS0xKSwtSS1tKm4uZ2V0KG8sTSksQyxBKSxuLnNldChvKzEsTS0xLGJbMF0pLG4uc2V0KG8rMSxNLGJbMV0pKSksaD1NYXRoLm1heChNYXRoLmFicyhuLmdldChvLE0tMSkpLE1hdGguYWJzKG4uZ2V0KG8sTSkpKSxFKmgqaD4xKWZvcihpPW87aTw9TTtpKyspbi5zZXQoaSxNLTEsbi5nZXQoaSxNLTEpL2gpLG4uc2V0KGksTSxuLmdldChpLE0pL2gpfWZvcihvPTA7bzx0O28rKylpZihvPHZ8fG8+eClmb3IoaT1vO2k8dDtpKyspcy5zZXQobyxpLG4uZ2V0KG8saSkpO2ZvcihpPXQtMTtpPj12O2ktLSlmb3Iobz12O288PXg7bysrKXtmb3IoQz0wLHU9djt1PD1NYXRoLm1pbihpLHgpO3UrKylDKz1zLmdldChvLHUpKm4uZ2V0KHUsaSk7cy5zZXQobyxpLEMpfX0obyxhLHUsaSx0KX10aGlzLm49byx0aGlzLmU9YSx0aGlzLmQ9dSx0aGlzLlY9aX1nZXQgcmVhbEVpZ2VudmFsdWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5kKX1nZXQgaW1hZ2luYXJ5RWlnZW52YWx1ZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmUpfWdldCBlaWdlbnZlY3Rvck1hdHJpeCgpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7bGV0IHQsZSxyPXRoaXMubixzPXRoaXMuZSxuPXRoaXMuZCxvPW5ldyBlcihyLHIpO2Zvcih0PTA7dDxyO3QrKyl7Zm9yKGU9MDtlPHI7ZSsrKW8uc2V0KHQsZSwwKTtvLnNldCh0LHQsblt0XSksc1t0XT4wP28uc2V0KHQsdCsxLHNbdF0pOnNbdF08MCYmby5zZXQodCx0LTEsc1t0XSl9cmV0dXJuIG99fWZ1bmN0aW9uIHByKHQsZSxyLHMpe2xldCBuLG87cmV0dXJuIE1hdGguYWJzKHIpPk1hdGguYWJzKHMpPyhuPXMvcixvPXIrbipzLFsodCtuKmUpL28sKGUtbip0KS9vXSk6KG49ci9zLG89cytuKnIsWyhuKnQrZSkvbywobiplLXQpL29dKX1jbGFzcyBkcntjb25zdHJ1Y3Rvcih0KXtpZighKHQ9dXIuY2hlY2tNYXRyaXgodCkpLmlzU3ltbWV0cmljKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggaXMgbm90IHN5bW1ldHJpYyIpO2xldCBlLHIscyxuPXQsbz1uLnJvd3MsaT1uZXcgZXIobyxvKSx1PSEwO2ZvcihyPTA7cjxvO3IrKyl7bGV0IHQ9MDtmb3Iocz0wO3M8cjtzKyspe2xldCBvPTA7Zm9yKGU9MDtlPHM7ZSsrKW8rPWkuZ2V0KHMsZSkqaS5nZXQocixlKTtvPShuLmdldChyLHMpLW8pL2kuZ2V0KHMscyksaS5zZXQocixzLG8pLHQrPW8qb31mb3IodD1uLmdldChyLHIpLXQsdSYmPXQ+MCxpLnNldChyLHIsTWF0aC5zcXJ0KE1hdGgubWF4KHQsMCkpKSxzPXIrMTtzPG87cysrKWkuc2V0KHIscywwKX10aGlzLkw9aSx0aGlzLnBvc2l0aXZlRGVmaW5pdGU9dX1pc1Bvc2l0aXZlRGVmaW5pdGUoKXtyZXR1cm4gdGhpcy5wb3NpdGl2ZURlZmluaXRlfXNvbHZlKHQpe3Q9dXIuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5MLHI9ZS5yb3dzO2lmKHQucm93cyE9PXIpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggZGltZW5zaW9ucyBkbyBub3QgbWF0Y2giKTtpZighMT09PXRoaXMuaXNQb3NpdGl2ZURlZmluaXRlKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggaXMgbm90IHBvc2l0aXZlIGRlZmluaXRlIik7bGV0IHMsbixvLGk9dC5jb2x1bW5zLHU9dC5jbG9uZSgpO2ZvcihvPTA7bzxyO28rKylmb3Iobj0wO248aTtuKyspe2ZvcihzPTA7czxvO3MrKyl1LnNldChvLG4sdS5nZXQobyxuKS11LmdldChzLG4pKmUuZ2V0KG8scykpO3Uuc2V0KG8sbix1LmdldChvLG4pL2UuZ2V0KG8sbykpfWZvcihvPXItMTtvPj0wO28tLSlmb3Iobj0wO248aTtuKyspe2ZvcihzPW8rMTtzPHI7cysrKXUuc2V0KG8sbix1LmdldChvLG4pLXUuZ2V0KHMsbikqZS5nZXQocyxvKSk7dS5zZXQobyxuLHUuZ2V0KG8sbikvZS5nZXQobyxvKSl9cmV0dXJuIHV9Z2V0IGxvd2VyVHJpYW5ndWxhck1hdHJpeCgpe3JldHVybiB0aGlzLkx9fWNsYXNzIHlye2NvbnN0cnVjdG9yKHQsZT17fSl7dD11ci5jaGVja01hdHJpeCh0KTtsZXR7WTpyfT1lO2NvbnN0e3NjYWxlU2NvcmVzOnM9ITEsbWF4SXRlcmF0aW9uczpuPTFlMyx0ZXJtaW5hdGlvbkNyaXRlcmlhOm89MWUtMTB9PWU7bGV0IGk7aWYocil7aWYocj1WZShyKSYmIm51bWJlciI9PXR5cGVvZiByWzBdP2VyLmNvbHVtblZlY3RvcihyKTp1ci5jaGVja01hdHJpeChyKSxyLnJvd3MhPT10LnJvd3MpdGhyb3cgbmV3IEVycm9yKCJZIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFzIFgiKTtpPXIuZ2V0Q29sdW1uVmVjdG9yKDApfWVsc2UgaT10LmdldENvbHVtblZlY3RvcigwKTtsZXQgdSxhLGwsaCxjPTE7Zm9yKGxldCBlPTA7ZTxuJiZjPm87ZSsrKWw9dC50cmFuc3Bvc2UoKS5tbXVsKGkpLmRpdihpLnRyYW5zcG9zZSgpLm1tdWwoaSkuZ2V0KDAsMCkpLGw9bC5kaXYobC5ub3JtKCkpLHU9dC5tbXVsKGwpLmRpdihsLnRyYW5zcG9zZSgpLm1tdWwobCkuZ2V0KDAsMCkpLGU+MCYmKGM9dS5jbG9uZSgpLnN1YihoKS5wb3coMikuc3VtKCkpLGg9dS5jbG9uZSgpLHI/KGE9ci50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpLGE9YS5kaXYoYS5ub3JtKCkpLGk9ci5tbXVsKGEpLmRpdihhLnRyYW5zcG9zZSgpLm1tdWwoYSkuZ2V0KDAsMCkpKTppPXU7aWYocil7bGV0IGU9dC50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpO2U9ZS5kaXYoZS5ub3JtKCkpO2xldCBzPXQuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm1tdWwoZS50cmFuc3Bvc2UoKSkpLG49aS50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpLG89ci5jbG9uZSgpLnN1Yih1LmNsb25lKCkubXVsUyhuLmdldCgwLDApKS5tbXVsKGEudHJhbnNwb3NlKCkpKTt0aGlzLnQ9dSx0aGlzLnA9ZS50cmFuc3Bvc2UoKSx0aGlzLnc9bC50cmFuc3Bvc2UoKSx0aGlzLnE9YSx0aGlzLnU9aSx0aGlzLnM9dS50cmFuc3Bvc2UoKS5tbXVsKHUpLHRoaXMueFJlc2lkdWFsPXMsdGhpcy55UmVzaWR1YWw9byx0aGlzLmJldGFzPW59ZWxzZSB0aGlzLnc9bC50cmFuc3Bvc2UoKSx0aGlzLnM9dS50cmFuc3Bvc2UoKS5tbXVsKHUpLnNxcnQoKSx0aGlzLnQ9cz91LmNsb25lKCkuZGl2KHRoaXMucy5nZXQoMCwwKSk6dSx0aGlzLnhSZXNpZHVhbD10LnN1Yih1Lm1tdWwobC50cmFuc3Bvc2UoKSkpfX1GZS5BYnN0cmFjdE1hdHJpeD1aZSxGZS5DSE89ZHIsRmUuQ2hvbGVza3lEZWNvbXBvc2l0aW9uPWRyLEZlLkRpc3RhbmNlTWF0cml4PXNyO3ZhciBicj1GZS5FVkQ9d3I7RmUuRWlnZW52YWx1ZURlY29tcG9zaXRpb249d3IsRmUuTFU9YXIsRmUuTHVEZWNvbXBvc2l0aW9uPWFyO3ZhciBNcj1GZS5NYXRyaXg9ZXI7RmUuTWF0cml4Q29sdW1uU2VsZWN0aW9uVmlldz1jbGFzcyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKHQsZSl7UWUodCxlKSxzdXBlcih0LHQucm93cyxlLmxlbmd0aCksdGhpcy5jb2x1bW5JbmRpY2VzPWV9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHQsdGhpcy5jb2x1bW5JbmRpY2VzW2VdLHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0LHRoaXMuY29sdW1uSW5kaWNlc1tlXSl9fSxGZS5NYXRyaXhDb2x1bW5WaWV3PWNsYXNzIGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IodCxlKXtHZSh0LGUpLHN1cGVyKHQsdC5yb3dzLDEpLHRoaXMuY29sdW1uPWV9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHQsdGhpcy5jb2x1bW4sciksdGhpc31nZXQodCl7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0LHRoaXMuY29sdW1uKX19LEZlLk1hdHJpeEZsaXBDb2x1bW5WaWV3PWNsYXNzIGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCx0LnJvd3MsdC5jb2x1bW5zKX1zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodCx0aGlzLmNvbHVtbnMtZS0xLHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0LHRoaXMuY29sdW1ucy1lLTEpfX0sRmUuTWF0cml4RmxpcFJvd1ZpZXc9Y2xhc3MgZXh0ZW5kcyBucntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHQucm93cyx0LmNvbHVtbnMpfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldCh0aGlzLnJvd3MtdC0xLGUsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMucm93cy10LTEsZSl9fSxGZS5NYXRyaXhSb3dTZWxlY3Rpb25WaWV3PWNsYXNzIGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IodCxlKXtLZSh0LGUpLHN1cGVyKHQsZS5sZW5ndGgsdC5jb2x1bW5zKSx0aGlzLnJvd0luZGljZXM9ZX1zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodGhpcy5yb3dJbmRpY2VzW3RdLGUsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMucm93SW5kaWNlc1t0XSxlKX19LEZlLk1hdHJpeFJvd1ZpZXc9Y2xhc3MgZXh0ZW5kcyBucntjb25zdHJ1Y3Rvcih0LGUpe1VlKHQsZSksc3VwZXIodCwxLHQuY29sdW1ucyksdGhpcy5yb3c9ZX1zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodGhpcy5yb3csZSxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQodGhpcy5yb3csZSl9fSxGZS5NYXRyaXhTZWxlY3Rpb25WaWV3PW9yLEZlLk1hdHJpeFN1YlZpZXc9Y2xhc3MgZXh0ZW5kcyBucntjb25zdHJ1Y3Rvcih0LGUscixzLG4pe1hlKHQsZSxyLHMsbiksc3VwZXIodCxyLWUrMSxuLXMrMSksdGhpcy5zdGFydFJvdz1lLHRoaXMuc3RhcnRDb2x1bW49c31zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodGhpcy5zdGFydFJvdyt0LHRoaXMuc3RhcnRDb2x1bW4rZSxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQodGhpcy5zdGFydFJvdyt0LHRoaXMuc3RhcnRDb2x1bW4rZSl9fTt2YXIgdnI9RmUuTWF0cml4VHJhbnNwb3NlVmlldz1jbGFzcyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsdC5jb2x1bW5zLHQucm93cyl9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KGUsdCxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQoZSx0KX19LHhyPUZlLk5JUEFMUz15cjtGZS5OaXBhbHM9eXIsRmUuUVI9aHIsRmUuUXJEZWNvbXBvc2l0aW9uPWhyO3ZhciBFcj1GZS5TVkQ9Y3I7RmUuU2luZ3VsYXJWYWx1ZURlY29tcG9zaXRpb249Y3IsRmUuU3ltbWV0cmljTWF0cml4PXJyLEZlLldyYXBwZXJNYXRyaXgxRD1pcixGZS5XcmFwcGVyTWF0cml4MkQ9dXIsRmUuY29ycmVsYXRpb249ZnVuY3Rpb24odCxlPXQscj17fSl7dD1uZXcgZXIodCk7bGV0IHM9ITE7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxlci5pc01hdHJpeChlKXx8VmUoZSk/ZT1uZXcgZXIoZSk6KHI9ZSxlPXQscz0hMCksdC5yb3dzIT09ZS5yb3dzKXRocm93IG5ldyBUeXBlRXJyb3IoIkJvdGggbWF0cmljZXMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIik7Y29uc3R7Y2VudGVyOm49ITAsc2NhbGU6bz0hMH09cjtuJiYodC5jZW50ZXIoImNvbHVtbiIpLHN8fGUuY2VudGVyKCJjb2x1bW4iKSksbyYmKHQuc2NhbGUoImNvbHVtbiIpLHN8fGUuc2NhbGUoImNvbHVtbiIpKTtjb25zdCBpPXQuc3RhbmRhcmREZXZpYXRpb24oImNvbHVtbiIse3VuYmlhc2VkOiEwfSksdT1zP2k6ZS5zdGFuZGFyZERldmlhdGlvbigiY29sdW1uIix7dW5iaWFzZWQ6ITB9KSxhPXQudHJhbnNwb3NlKCkubW11bChlKTtmb3IobGV0IGU9MDtlPGEucm93cztlKyspZm9yKGxldCByPTA7cjxhLmNvbHVtbnM7cisrKWEuc2V0KGUscixhLmdldChlLHIpKigxLyhpW2VdKnVbcl0pKSooMS8odC5yb3dzLTEpKSk7cmV0dXJuIGF9LEZlLmNvdmFyaWFuY2U9ZnVuY3Rpb24odCxlPXQscj17fSl7dD1uZXcgZXIodCk7bGV0IHM9ITE7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxlci5pc01hdHJpeChlKXx8VmUoZSk/ZT1uZXcgZXIoZSk6KHI9ZSxlPXQscz0hMCksdC5yb3dzIT09ZS5yb3dzKXRocm93IG5ldyBUeXBlRXJyb3IoIkJvdGggbWF0cmljZXMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIik7Y29uc3R7Y2VudGVyOm49ITB9PXI7biYmKHQ9dC5jZW50ZXIoImNvbHVtbiIpLHN8fChlPWUuY2VudGVyKCJjb2x1bW4iKSkpO2NvbnN0IG89dC50cmFuc3Bvc2UoKS5tbXVsKGUpO2ZvcihsZXQgZT0wO2U8by5yb3dzO2UrKylmb3IobGV0IHI9MDtyPG8uY29sdW1ucztyKyspby5zZXQoZSxyLG8uZ2V0KGUscikqKDEvKHQucm93cy0xKSkpO3JldHVybiBvfTt2YXIgU3I9RmUuZGVmYXVsdD1lcjtGZS5kZXRlcm1pbmFudD1mdW5jdGlvbiB0KGUpe2lmKChlPWVyLmNoZWNrTWF0cml4KGUpKS5pc1NxdWFyZSgpKXtpZigwPT09ZS5jb2x1bW5zKXJldHVybiAxO2xldCByLHMsbixvO2lmKDI9PT1lLmNvbHVtbnMpcmV0dXJuIHI9ZS5nZXQoMCwwKSxzPWUuZ2V0KDAsMSksbj1lLmdldCgxLDApLG89ZS5nZXQoMSwxKSxyKm8tcypuO2lmKDM9PT1lLmNvbHVtbnMpe2xldCBvLGksdTtyZXR1cm4gbz1uZXcgb3IoZSxbMSwyXSxbMSwyXSksaT1uZXcgb3IoZSxbMSwyXSxbMCwyXSksdT1uZXcgb3IoZSxbMSwyXSxbMCwxXSkscj1lLmdldCgwLDApLHM9ZS5nZXQoMCwxKSxuPWUuZ2V0KDAsMikscip0KG8pLXMqdChpKStuKnQodSl9cmV0dXJuIG5ldyBhcihlKS5kZXRlcm1pbmFudH10aHJvdyBFcnJvcigiZGV0ZXJtaW5hbnQgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBmb3IgYSBzcXVhcmUgbWF0cml4Iil9LEZlLmludmVyc2U9ZnVuY3Rpb24odCxlPSExKXtyZXR1cm4gdD11ci5jaGVja01hdHJpeCh0KSxlP25ldyBjcih0KS5pbnZlcnNlKCk6ZnIodCxlci5leWUodC5yb3dzKSl9LEZlLmxpbmVhckRlcGVuZGVuY2llcz1mdW5jdGlvbih0LGU9e30pe2NvbnN0e3RocmVzaG9sZFZhbHVlOnI9MWUtOSx0aHJlc2hvbGRFcnJvcjpzPTFlLTl9PWU7bGV0IG49KHQ9ZXIuY2hlY2tNYXRyaXgodCkpLnJvd3Msbz1uZXcgZXIobixuKTtmb3IobGV0IGU9MDtlPG47ZSsrKXtsZXQgaT1lci5jb2x1bW5WZWN0b3IodC5nZXRSb3coZSkpLHU9dC5zdWJNYXRyaXhSb3cobXIobixlKSkudHJhbnNwb3NlKCksYT1uZXcgY3IodSkuc29sdmUoaSksbD1lci5zdWIoaSx1Lm1tdWwoYSkpLmFicygpLm1heCgpO28uc2V0Um93KGUsZ3IobCxhLGUscixzKSl9cmV0dXJuIG99LEZlLnBzZXVkb0ludmVyc2U9ZnVuY3Rpb24odCxlPU51bWJlci5FUFNJTE9OKXtpZigodD1lci5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXJldHVybiB0LnRyYW5zcG9zZSgpO2xldCByPW5ldyBjcih0LHthdXRvVHJhbnNwb3NlOiEwfSkscz1yLmxlZnRTaW5ndWxhclZlY3RvcnMsbj1yLnJpZ2h0U2luZ3VsYXJWZWN0b3JzLG89ci5kaWFnb25hbDtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrKylNYXRoLmFicyhvW3RdKT5lP29bdF09MS9vW3RdOm9bdF09MDtyZXR1cm4gbi5tbXVsKGVyLmRpYWcobykubW11bChzLnRyYW5zcG9zZSgpKSl9LEZlLnNvbHZlPWZyLEZlLndyYXA9ZnVuY3Rpb24odCxlKXtpZihWZSh0KSlyZXR1cm4gdFswXSYmVmUodFswXSk/bmV3IHVyKHQpOm5ldyBpcih0LGUpO3Rocm93IG5ldyBFcnJvcigidGhlIGFyZ3VtZW50IGlzIG5vdCBhbiBhcnJheSIpfTtjb25zdCBfcj1icixqcj1NcixBcj12cixScj14cixJcj1FcjtTci5NYXRyaXgmJlNyLk1hdHJpeDtsZXQgQ3I9Y2xhc3MgdHtjb25zdHJ1Y3Rvcih0LGU9e30scil7aWYodGhpcy5VPW51bGwsdGhpcy5TPW51bGwscilyZXR1cm4gdGhpcy5jZW50ZXI9ci5jZW50ZXIsdGhpcy5zY2FsZT1yLnNjYWxlLHRoaXMubWVhbnM9ci5tZWFucyx0aGlzLnN0ZGV2cz1yLnN0ZGV2cyx0aGlzLlU9anIuY2hlY2tNYXRyaXgoci5VKSx0aGlzLlM9ci5TLHRoaXMuUj1yLlIsdm9pZCh0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9ci5leGNsdWRlZEZlYXR1cmVzfHxbXSk7bGV0IHM7cz0oQXJyYXkuaXNBcnJheSh0KSxuZXcganIodCkpO2NvbnN0e2lzQ292YXJpYW5jZU1hdHJpeDpuPSExLG1ldGhvZDpvPSJTVkQiLG5Db21wTklQQUxTOmk9MixjZW50ZXI6dT0hMCxzY2FsZTphPSExLGlnbm9yZVplcm9WYXJpYW5jZTpsPSExfT1lO2lmKHRoaXMuY2VudGVyPXUsdGhpcy5zY2FsZT1hLHRoaXMubWVhbnM9bnVsbCx0aGlzLnN0ZGV2cz1udWxsLHRoaXMuZXhjbHVkZWRGZWF0dXJlcz1bXSxuKXRoaXMuX2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeChzKTtlbHNlIHN3aXRjaCh0aGlzLl9hZGp1c3QocyxsKSxvKXtjYXNlImNvdmFyaWFuY2VNYXRyaXgiOntjb25zdCB0PW5ldyBBcihzKS5tbXVsKHMpLmRpdihzLnJvd3MtMSk7dGhpcy5fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpO2JyZWFrfWNhc2UiTklQQUxTIjp0aGlzLl9jb21wdXRlV2l0aE5JUEFMUyhzLGkpO2JyZWFrO2Nhc2UiU1ZEIjp7Y29uc3QgdD1uZXcgSXIocyx7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6ITEsY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzOiEwLGF1dG9UcmFuc3Bvc2U6ITB9KTt0aGlzLlU9dC5yaWdodFNpbmd1bGFyVmVjdG9ycztjb25zdCBlPXQuZGlhZ29uYWwscj1bXTtmb3IoY29uc3QgdCBvZiBlKXIucHVzaCh0KnQvKHMucm93cy0xKSk7dGhpcy5TPXI7YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gbWV0aG9kOiAke299YCl9fXN0YXRpYyBsb2FkKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZS5uYW1lKXRocm93IG5ldyBUeXBlRXJyb3IoIm1vZGVsIG11c3QgaGF2ZSBhIG5hbWUgcHJvcGVydHkiKTtpZigiUENBIiE9PWUubmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgaW52YWxpZCBtb2RlbDogJHtlLm5hbWV9YCk7cmV0dXJuIG5ldyB0KHZvaWQgMCx2b2lkIDAsZSl9cHJlZGljdCh0LGU9e30pe2NvbnN0e25Db21wb25lbnRzOnI9dGhpcy5VLmNvbHVtbnN9PWU7bGV0IHM7aWYocz0oQXJyYXkuaXNBcnJheSh0KSxuZXcganIodCkpLHRoaXMuY2VudGVyJiYocy5zdWJSb3dWZWN0b3IodGhpcy5tZWFucyksdGhpcy5zY2FsZSkpe2ZvcihsZXQgdCBvZiB0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMpcy5yZW1vdmVDb2x1bW4odCk7cy5kaXZSb3dWZWN0b3IodGhpcy5zdGRldnMpfWxldCBuPXMubW11bCh0aGlzLlUpO3JldHVybiBuLnN1Yk1hdHJpeCgwLG4ucm93cy0xLDAsci0xKX1pbnZlcnQodCl7bGV0IGU9KHQ9anIuY2hlY2tNYXRyaXgodCkpLm1tdWwodGhpcy5VLnRyYW5zcG9zZSgpKTtyZXR1cm4gdGhpcy5jZW50ZXImJih0aGlzLnNjYWxlJiZlLm11bFJvd1ZlY3Rvcih0aGlzLnN0ZGV2cyksZS5hZGRSb3dWZWN0b3IodGhpcy5tZWFucykpLGV9Z2V0RXhwbGFpbmVkVmFyaWFuY2UoKXtsZXQgdD0wO2lmKHRoaXMuUylmb3IoY29uc3QgZSBvZiB0aGlzLlMpdCs9ZTtyZXR1cm4gdGhpcy5TP3RoaXMuUy5tYXAoKGU9PmUvdCkpOltdfWdldEN1bXVsYXRpdmVWYXJpYW5jZSgpe2xldCB0PXRoaXMuZ2V0RXhwbGFpbmVkVmFyaWFuY2UoKTtmb3IobGV0IGU9MTtlPHQubGVuZ3RoO2UrKyl0W2VdKz10W2UtMV07cmV0dXJuIHR9Z2V0RWlnZW52ZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXRFaWdlbnZhbHVlcygpe3JldHVybiB0aGlzLlN9Z2V0U3RhbmRhcmREZXZpYXRpb25zKCl7cmV0dXJuIHRoaXMuUy5tYXAoKHQ9Pk1hdGguc3FydCh0KSkpfWdldExvYWRpbmdzKCl7cmV0dXJuIHRoaXMuVS50cmFuc3Bvc2UoKX10b0pTT04oKXtyZXR1cm57bmFtZToiUENBIixjZW50ZXI6dGhpcy5jZW50ZXIsc2NhbGU6dGhpcy5zY2FsZSxtZWFuczp0aGlzLm1lYW5zLHN0ZGV2czp0aGlzLnN0ZGV2cyxVOnRoaXMuVSxTOnRoaXMuUyxleGNsdWRlZEZlYXR1cmVzOnRoaXMuZXhjbHVkZWRGZWF0dXJlc319X2FkanVzdCh0LGUpe2lmKHRoaXMuY2VudGVyKXtjb25zdCByPXQubWVhbigiY29sdW1uIikscz10aGlzLnNjYWxlP3Quc3RhbmRhcmREZXZpYXRpb24oImNvbHVtbiIse21lYW46cn0pOm51bGw7aWYodGhpcy5tZWFucz1yLHQuc3ViUm93VmVjdG9yKHIpLHRoaXMuc2NhbGUpe2ZvcihsZXQgcj0wO3I8cy5sZW5ndGg7cisrKWlmKDA9PT1zW3JdKXtpZighZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ2Fubm90IHNjYWxlIHRoZSBkYXRhc2V0IChzdGFuZGFyZCBkZXZpYXRpb24gaXMgemVybyBhdCBpbmRleCAke3J9YCk7dC5yZW1vdmVDb2x1bW4ocikscy5zcGxpY2UociwxKSx0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMucHVzaChyKSxyLS19dGhpcy5zdGRldnM9cyx0LmRpdlJvd1ZlY3RvcihzKX19fV9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgodCl7Y29uc3QgZT1uZXcgX3IodCx7YXNzdW1lU3ltbWV0cmljOiEwfSk7dGhpcy5VPWUuZWlnZW52ZWN0b3JNYXRyaXgsdGhpcy5VLmZsaXBSb3dzKCksdGhpcy5TPWUucmVhbEVpZ2VudmFsdWVzLHRoaXMuUy5yZXZlcnNlKCl9X2NvbXB1dGVXaXRoTklQQUxTKHQsZSl7dGhpcy5VPW5ldyBqcihlLHQuY29sdW1ucyksdGhpcy5TPVtdO2xldCByPXQ7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bmV3IFJyKHIpO3RoaXMuVS5zZXRSb3codCxlLncudHJhbnNwb3NlKCkpLHRoaXMuUy5wdXNoKE1hdGgucG93KGUucy5nZXQoMCwwKSwyKSkscj1lLnhSZXNpZHVhbH10aGlzLlU9dGhpcy5VLnRyYW5zcG9zZSgpfX07ZnVuY3Rpb24gTnIodCxlPXt9KXtpZighY2UodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9d3QoZSwic2NhbGUiKTttZShyKXx8KHI9ITApO2xldCBzPXd0KGUsIm5Db21wTklQQUxTIik7d2Uocyl8fChzPTIpLHM9a2Uocyk7bGV0IG49b2Uod3QodCwwLFtdKSk7aWYoMD09PW4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGRpbWVuc2lvbiBvZiBkYXRhIik7aWYocz5uKXRocm93IG5ldyBFcnJvcihgbkNvbXBOSVBBTFNbJHtzfV0gaXMgbW9yZSB0aGFuIHRoZSBkaW1lbnNpb25bJHtufV0gb2YgZGF0YWApO3JldHVybiBuZXcgQ3IodCx7bWV0aG9kOiJOSVBBTFMiLHNjYWxlOnIsbkNvbXBOSVBBTFM6c30pLnByZWRpY3QodCkudG9KU09OKCl9ZnVuY3Rpb24ga3IodCxlKXtmb3IodmFyIHI9LTEscz1udWxsPT10PzA6dC5sZW5ndGg7KytyPHMmJiExIT09ZSh0W3JdLHIsdCk7KTtyZXR1cm4gdH12YXIgVHIsRnI9ZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgcz0tMSxuPU9iamVjdCh0KSxvPXIodCksaT1vLmxlbmd0aDtpLS07KXt2YXIgdT1vW1RyP2k6KytzXTtpZighMT09PWUoblt1XSx1LG4pKWJyZWFrfXJldHVybiB0fTtmdW5jdGlvbiBPcih0KXtyZXR1cm4gZyh0KSYmIltvYmplY3QgQXJndW1lbnRzXSI9PW0odCl9dmFyIFZyPU9iamVjdC5wcm90b3R5cGUsenI9VnIuaGFzT3duUHJvcGVydHksRHI9VnIucHJvcGVydHlJc0VudW1lcmFibGUsUHI9T3IoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9PcjpmdW5jdGlvbih0KXtyZXR1cm4gZyh0KSYmenIuY2FsbCh0LCJjYWxsZWUiKSYmIURyLmNhbGwodCwiY2FsbGVlIil9O3ZhciBxcj0ib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLCRyPXFyJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsTHI9JHImJiRyLmV4cG9ydHM9PT1xcj9zLkJ1ZmZlcjp2b2lkIDAsVXI9KExyP0xyLmlzQnVmZmVyOnZvaWQgMCl8fGZ1bmN0aW9uKCl7cmV0dXJuITF9LEdyPTkwMDcxOTkyNTQ3NDA5OTEsQnI9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIFdyKHQsZSl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lP0dyOmUpJiYoIm51bWJlciI9PXJ8fCJzeW1ib2wiIT1yJiZCci50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9dmFyIEtyPXt9O0tyWyJbb2JqZWN0IEZsb2F0MzJBcnJheV0iXT1LclsiW29iamVjdCBGbG9hdDY0QXJyYXldIl09S3JbIltvYmplY3QgSW50OEFycmF5XSJdPUtyWyJbb2JqZWN0IEludDE2QXJyYXldIl09S3JbIltvYmplY3QgSW50MzJBcnJheV0iXT1LclsiW29iamVjdCBVaW50OEFycmF5XSJdPUtyWyJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSJdPUtyWyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPUtyWyJbb2JqZWN0IFVpbnQzMkFycmF5XSJdPSEwLEtyWyJbb2JqZWN0IEFyZ3VtZW50c10iXT1LclsiW29iamVjdCBBcnJheV0iXT1LclsiW29iamVjdCBBcnJheUJ1ZmZlcl0iXT1LclsiW29iamVjdCBCb29sZWFuXSJdPUtyWyJbb2JqZWN0IERhdGFWaWV3XSJdPUtyWyJbb2JqZWN0IERhdGVdIl09S3JbIltvYmplY3QgRXJyb3JdIl09S3JbIltvYmplY3QgRnVuY3Rpb25dIl09S3JbIltvYmplY3QgTWFwXSJdPUtyWyJbb2JqZWN0IE51bWJlcl0iXT1LclsiW29iamVjdCBPYmplY3RdIl09S3JbIltvYmplY3QgUmVnRXhwXSJdPUtyWyJbb2JqZWN0IFNldF0iXT1LclsiW29iamVjdCBTdHJpbmddIl09S3JbIltvYmplY3QgV2Vha01hcF0iXT0hMTt2YXIgUXI9Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxYcj1RciYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLFlyPVhyJiZYci5leHBvcnRzPT09UXImJmUucHJvY2VzcyxKcj1mdW5jdGlvbigpe3RyeXt2YXIgdD1YciYmWHIucmVxdWlyZSYmWHIucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxZciYmWXIuYmluZGluZyYmWXIuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCksSHI9SnImJkpyLmlzVHlwZWRBcnJheSxacj1Icj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fShIcik6ZnVuY3Rpb24odCl7cmV0dXJuIGcodCkmJkR0KHQubGVuZ3RoKSYmISFLclttKHQpXX0sdHM9WnIsZXM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBycyhlLHIpe3ZhciBzPXQoZSksbj0hcyYmUHIoZSksbz0hcyYmIW4mJlVyKGUpLGk9IXMmJiFuJiYhbyYmdHMoZSksdT1zfHxufHxvfHxpLGE9dT9mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxzPUFycmF5KHQpOysrcjx0OylzW3JdPWUocik7cmV0dXJuIHN9KGUubGVuZ3RoLFN0cmluZyk6W10sbD1hLmxlbmd0aDtmb3IodmFyIGggaW4gZSkhciYmIWVzLmNhbGwoZSxoKXx8dSYmKCJsZW5ndGgiPT1ofHxvJiYoIm9mZnNldCI9PWh8fCJwYXJlbnQiPT1oKXx8aSYmKCJidWZmZXIiPT1ofHwiYnl0ZUxlbmd0aCI9PWh8fCJieXRlT2Zmc2V0Ij09aCl8fFdyKGgsbCkpfHxhLnB1c2goaCk7cmV0dXJuIGF9ZnVuY3Rpb24gc3ModCl7cmV0dXJuIFB0KHQpP3JzKHQpOk10KHQpfXZhciBucz1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyLHMpe2lmKG51bGw9PXIpcmV0dXJuIHI7aWYoIVB0KHIpKXJldHVybiB0KHIscyk7Zm9yKHZhciBuPXIubGVuZ3RoLG89ZT9uOi0xLGk9T2JqZWN0KHIpOyhlP28tLTorK288bikmJiExIT09cyhpW29dLG8saSk7KTtyZXR1cm4gcn19KChmdW5jdGlvbih0LGUpe3JldHVybiB0JiZGcih0LGUsc3MpfSkpLG9zPW5zO2Z1bmN0aW9uIGlzKHQpe3JldHVybiB0fWZ1bmN0aW9uIHVzKGUscil7dmFyIHM7cmV0dXJuKHQoZSk/a3I6b3MpKGUsImZ1bmN0aW9uIj09dHlwZW9mKHM9cik/czppcyl9ZnVuY3Rpb24gYXModCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgVyh0KTt0aGlzLnNpemU9ZS5zaXplfWFzLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IFcsdGhpcy5zaXplPTB9LGFzLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLHJ9LGFzLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfSxhcy5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sYXMucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187aWYociBpbnN0YW5jZW9mIFcpe3ZhciBzPXIuX19kYXRhX187aWYoIUt8fHMubGVuZ3RoPDE5OSlyZXR1cm4gcy5wdXNoKFt0LGVdKSx0aGlzLnNpemU9KytyLnNpemUsdGhpcztyPXRoaXMuX19kYXRhX189bmV3IFgocyl9cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplPXIuc2l6ZSx0aGlzfTtmdW5jdGlvbiBscyh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgWDsrK2U8cjspdGhpcy5hZGQodFtlXSl9ZnVuY3Rpb24gaHModCxlKXtmb3IodmFyIHI9LTEscz1udWxsPT10PzA6dC5sZW5ndGg7KytyPHM7KWlmKGUodFtyXSxyLHQpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGNzKHQsZSl7cmV0dXJuIHQuaGFzKGUpfWxzLnByb3RvdHlwZS5hZGQ9bHMucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iKSx0aGlzfSxscy5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07dmFyIGZzPTEsbXM9MjtmdW5jdGlvbiBncyh0LGUscixzLG4sbyl7dmFyIGk9ciZmcyx1PXQubGVuZ3RoLGE9ZS5sZW5ndGg7aWYodSE9YSYmIShpJiZhPnUpKXJldHVybiExO3ZhciBsPW8uZ2V0KHQpLGg9by5nZXQoZSk7aWYobCYmaClyZXR1cm4gbD09ZSYmaD09dDt2YXIgYz0tMSxmPSEwLG09ciZtcz9uZXcgbHM6dm9pZCAwO2ZvcihvLnNldCh0LGUpLG8uc2V0KGUsdCk7KytjPHU7KXt2YXIgZz10W2NdLHc9ZVtjXTtpZihzKXZhciBwPWk/cyh3LGcsYyxlLHQsbyk6cyhnLHcsYyx0LGUsbyk7aWYodm9pZCAwIT09cCl7aWYocCljb250aW51ZTtmPSExO2JyZWFrfWlmKG0pe2lmKCFocyhlLChmdW5jdGlvbih0LGUpe2lmKCFjcyhtLGUpJiYoZz09PXR8fG4oZyx0LHIscyxvKSkpcmV0dXJuIG0ucHVzaChlKX0pKSl7Zj0hMTticmVha319ZWxzZSBpZihnIT09dyYmIW4oZyx3LHIscyxvKSl7Zj0hMTticmVha319cmV0dXJuIG8uZGVsZXRlKHQpLG8uZGVsZXRlKGUpLGZ9dmFyIHdzPXMuVWludDhBcnJheTtmdW5jdGlvbiBwcyh0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxzKXtyWysrZV09W3MsdF19KSkscn1mdW5jdGlvbiBkcyh0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7clsrK2VdPXR9KSkscn12YXIgeXM9MSxicz0yLE1zPSJbb2JqZWN0IEJvb2xlYW5dIix2cz0iW29iamVjdCBEYXRlXSIseHM9IltvYmplY3QgRXJyb3JdIixFcz0iW29iamVjdCBNYXBdIixTcz0iW29iamVjdCBOdW1iZXJdIixfcz0iW29iamVjdCBSZWdFeHBdIixqcz0iW29iamVjdCBTZXRdIixBcz0iW29iamVjdCBTdHJpbmddIixScz0iW29iamVjdCBTeW1ib2xdIixJcz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLENzPSJbb2JqZWN0IERhdGFWaWV3XSIsTnM9bj9uLnByb3RvdHlwZTp2b2lkIDAsa3M9TnM/TnMudmFsdWVPZjp2b2lkIDA7dmFyIFRzPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsRnM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxPcz1Gcz9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1PYmplY3QodCksZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEscz1udWxsPT10PzA6dC5sZW5ndGgsbj0wLG89W107KytyPHM7KXt2YXIgaT10W3JdO2UoaSxyLHQpJiYob1tuKytdPWkpfXJldHVybiBvfShGcyh0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIFRzLmNhbGwodCxlKX0pKSl9OmZ1bmN0aW9uKCl7cmV0dXJuW119LFZzPU9zO2Z1bmN0aW9uIHpzKGUpe3JldHVybiBmdW5jdGlvbihlLHIscyl7dmFyIG49cihlKTtyZXR1cm4gdChlKT9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLHM9ZS5sZW5ndGgsbj10Lmxlbmd0aDsrK3I8czspdFtuK3JdPWVbcl07cmV0dXJuIHR9KG4scyhlKSl9KGUsc3MsVnMpfXZhciBEcz0xLFBzPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHFzPTEsJHM9IltvYmplY3QgQXJndW1lbnRzXSIsTHM9IltvYmplY3QgQXJyYXldIixVcz0iW29iamVjdCBPYmplY3RdIixHcz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEJzKGUscixzLG4sbyxpKXt2YXIgdT10KGUpLGE9dChyKSxsPXU/THM6VnQoZSksaD1hP0xzOlZ0KHIpLGM9KGw9bD09JHM/VXM6bCk9PVVzLGY9KGg9aD09JHM/VXM6aCk9PVVzLG09bD09aDtpZihtJiZVcihlKSl7aWYoIVVyKHIpKXJldHVybiExO3U9ITAsYz0hMX1pZihtJiYhYylyZXR1cm4gaXx8KGk9bmV3IGFzKSx1fHx0cyhlKT9ncyhlLHIscyxuLG8saSk6ZnVuY3Rpb24odCxlLHIscyxuLG8saSl7c3dpdGNoKHIpe2Nhc2UgQ3M6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIElzOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFvKG5ldyB3cyh0KSxuZXcgd3MoZSkpKTtjYXNlIE1zOmNhc2UgdnM6Y2FzZSBTczpyZXR1cm4gVSgrdCwrZSk7Y2FzZSB4czpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UgX3M6Y2FzZSBBczpyZXR1cm4gdD09ZSsiIjtjYXNlIEVzOnZhciB1PXBzO2Nhc2UganM6dmFyIGE9cyZ5cztpZih1fHwodT1kcyksdC5zaXplIT1lLnNpemUmJiFhKXJldHVybiExO3ZhciBsPWkuZ2V0KHQpO2lmKGwpcmV0dXJuIGw9PWU7c3w9YnMsaS5zZXQodCxlKTt2YXIgaD1ncyh1KHQpLHUoZSkscyxuLG8saSk7cmV0dXJuIGkuZGVsZXRlKHQpLGg7Y2FzZSBSczppZihrcylyZXR1cm4ga3MuY2FsbCh0KT09a3MuY2FsbChlKX1yZXR1cm4hMX0oZSxyLGwscyxuLG8saSk7aWYoIShzJnFzKSl7dmFyIGc9YyYmR3MuY2FsbChlLCJfX3dyYXBwZWRfXyIpLHc9ZiYmR3MuY2FsbChyLCJfX3dyYXBwZWRfXyIpO2lmKGd8fHcpe3ZhciBwPWc/ZS52YWx1ZSgpOmUsZD13P3IudmFsdWUoKTpyO3JldHVybiBpfHwoaT1uZXcgYXMpLG8ocCxkLHMsbixpKX19cmV0dXJuISFtJiYoaXx8KGk9bmV3IGFzKSxmdW5jdGlvbih0LGUscixzLG4sbyl7dmFyIGk9ciZEcyx1PXpzKHQpLGE9dS5sZW5ndGg7aWYoYSE9enMoZSkubGVuZ3RoJiYhaSlyZXR1cm4hMTtmb3IodmFyIGw9YTtsLS07KXt2YXIgaD11W2xdO2lmKCEoaT9oIGluIGU6UHMuY2FsbChlLGgpKSlyZXR1cm4hMX12YXIgYz1vLmdldCh0KSxmPW8uZ2V0KGUpO2lmKGMmJmYpcmV0dXJuIGM9PWUmJmY9PXQ7dmFyIG09ITA7by5zZXQodCxlKSxvLnNldChlLHQpO2Zvcih2YXIgZz1pOysrbDxhOyl7dmFyIHc9dFtoPXVbbF1dLHA9ZVtoXTtpZihzKXZhciBkPWk/cyhwLHcsaCxlLHQsbyk6cyh3LHAsaCx0LGUsbyk7aWYoISh2b2lkIDA9PT1kP3c9PT1wfHxuKHcscCxyLHMsbyk6ZCkpe209ITE7YnJlYWt9Z3x8KGc9ImNvbnN0cnVjdG9yIj09aCl9aWYobSYmIWcpe3ZhciB5PXQuY29uc3RydWN0b3IsYj1lLmNvbnN0cnVjdG9yO3k9PWJ8fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIHkmJnkgaW5zdGFuY2VvZiB5JiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYiBpbnN0YW5jZW9mIGJ8fChtPSExKX1yZXR1cm4gby5kZWxldGUodCksby5kZWxldGUoZSksbX0oZSxyLHMsbixvLGkpKX1mdW5jdGlvbiBXcyh0LGUscixzLG4pe3JldHVybiB0PT09ZXx8KG51bGw9PXR8fG51bGw9PWV8fCFnKHQpJiYhZyhlKT90IT10JiZlIT1lOkJzKHQsZSxyLHMsV3MsbikpfXZhciBLcz0xLFFzPTI7ZnVuY3Rpb24gWHModCl7cmV0dXJuIHQ9PXQmJiFNKHQpfWZ1bmN0aW9uIFlzKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBudWxsIT1yJiYoclt0XT09PWUmJih2b2lkIDAhPT1lfHx0IGluIE9iamVjdChyKSkpfX1mdW5jdGlvbiBKcyh0KXt2YXIgZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9c3ModCkscj1lLmxlbmd0aDtyLS07KXt2YXIgcz1lW3JdLG49dFtzXTtlW3JdPVtzLG4sWHMobildfXJldHVybiBlfSh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/WXMoZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihyKXtyZXR1cm4gcj09PXR8fGZ1bmN0aW9uKHQsZSxyLHMpe3ZhciBuPXIubGVuZ3RoLG89bixpPSFzO2lmKG51bGw9PXQpcmV0dXJuIW87Zm9yKHQ9T2JqZWN0KHQpO24tLTspe3ZhciB1PXJbbl07aWYoaSYmdVsyXT91WzFdIT09dFt1WzBdXTohKHVbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrbjxvOyl7dmFyIGE9KHU9cltuXSlbMF0sbD10W2FdLGg9dVsxXTtpZihpJiZ1WzJdKXtpZih2b2lkIDA9PT1sJiYhKGEgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgYz1uZXcgYXM7aWYocyl2YXIgZj1zKGwsaCxhLHQsZSxjKTtpZighKHZvaWQgMD09PWY/V3MoaCxsLEtzfFFzLHMsYyk6ZikpcmV0dXJuITF9fXJldHVybiEwfShyLHQsZSl9fWZ1bmN0aW9uIEhzKHQsZSl7cmV0dXJuIG51bGwhPXQmJmUgaW4gT2JqZWN0KHQpfWZ1bmN0aW9uIFpzKGUscil7cmV0dXJuIG51bGwhPWUmJmZ1bmN0aW9uKGUscixzKXtmb3IodmFyIG49LTEsbz0ocj1jdChyLGUpKS5sZW5ndGgsaT0hMTsrK248bzspe3ZhciB1PW10KHJbbl0pO2lmKCEoaT1udWxsIT1lJiZzKGUsdSkpKWJyZWFrO2U9ZVt1XX1yZXR1cm4gaXx8KytuIT1vP2k6ISEobz1udWxsPT1lPzA6ZS5sZW5ndGgpJiZEdChvKSYmV3IodSxvKSYmKHQoZSl8fFByKGUpKX0oZSxyLEhzKX12YXIgdG49MSxlbj0yO2Z1bmN0aW9uIHJuKHQpe3JldHVybiBiKHQpPyR0KG10KHQpKTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGd0KGUsdCl9fSh0KX1mdW5jdGlvbiBzbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGw9PWU/aXM6Im9iamVjdCI9PXR5cGVvZiBlP3QoZSk/KHI9ZVswXSxzPWVbMV0sYihyKSYmWHMocyk/WXMobXQocikscyk6ZnVuY3Rpb24odCl7dmFyIGU9d3QodCxyKTtyZXR1cm4gdm9pZCAwPT09ZSYmZT09PXM/WnModCxyKTpXcyhzLGUsdG58ZW4pfSk6SnMoZSk6cm4oZSk7dmFyIHIsc31mdW5jdGlvbiBubih0LGUpe3ZhciByPS0xLHM9UHQodCk/QXJyYXkodC5sZW5ndGgpOltdO3JldHVybiBvcyh0LChmdW5jdGlvbih0LG4sbyl7c1srK3JdPWUodCxuLG8pfSkpLHN9ZnVuY3Rpb24gb24oZSxyKXtyZXR1cm4odChlKT9vdDpubikoZSxzbihyKSl9ZnVuY3Rpb24gdW4odCl7cmV0dXJuIG51bGw9PXQ/W106ZnVuY3Rpb24odCxlKXtyZXR1cm4gb3QoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9KHQsc3ModCkpfWZ1bmN0aW9uIGFuKHQsZSl7aWYoIXVlKHQpKXJldHVybnt9O2lmKCFjZShlKSlyZXR1cm57fTtsZXQgcj17fTtyZXR1cm4gdXMoZSwoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKHQsZSl7cmV0dXJuISF1ZSh0KSYmISghZ2UoZSkmJiF3ZShlKSkmJmUgaW4gdH0pKHQsZSkmJihyW2VdPXd0KHQsZSkpfSkpLHJ9dmFyIGxuPXt9LGhuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y2xhc3MgY257Y29uc3RydWN0b3IodCl7dGhpcy5nZXRDb3N0PSgpPT50aGlzLkVsZW1lbnRzLm1hcCgodD0+dC5EaXN0YW5jZUZyb21NZWRvaWQpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApLHRoaXMuZmluZEJlc3RNZWRvaWRJZHg9dD0+dGhpcy5FbGVtZW50cy5tYXAoKGU9PnRoaXMuY2FsY0Nvc3RGb3JHaXZlbkVsZW1lbnRBc01lZG9pZChlLHQpKSkucmVkdWNlKCgodCxlLHIscyk9PmUuQ29zdElmTWFkZU1lZG9pZDxzW3RdLkNvc3RJZk1hZGVNZWRvaWQ/cjp0KSwwKSx0aGlzLmNhbGNDb3N0Rm9yR2l2ZW5FbGVtZW50QXNNZWRvaWQ9KHQsZSk9Pih7Q29zdElmTWFkZU1lZG9pZDpuZXcgY24oe0VsZW1lbnRzOnRoaXMuRWxlbWVudHMubWFwKChyPT4oe0Rpc3RhbmNlRnJvbU1lZG9pZDplKHIuRWxlbWVudCx0LkVsZW1lbnQpLEVsZW1lbnQ6ci5FbGVtZW50fSkpKSxNZWRvaWQ6dC5FbGVtZW50fSkuZ2V0Q29zdCgpLEVsZW1lbnQ6dH0pLHRoaXMuRWxlbWVudHM9dC5FbGVtZW50cyx0aGlzLk1lZG9pZD10Lk1lZG9pZH19aG4uQ2x1c3Rlcj1jbjt2YXIgZm49e30sbW49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KG1uLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxtbi5kaXN0YW5jZT0odCxlKT0+e2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgaW5wdXRzIG11c3QgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24iKTtjb25zdCByPUFycmF5LmZyb20odC5rZXlzKCkpLm1hcCgocj0+TWF0aC5wb3coTWF0aC5hYnModFtyXS1lW3JdKSwyKSkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCk7cmV0dXJuIE1hdGguc3FydChyKX07dmFyIGduPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShnbiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZ24ua0d0RWxlbWVudEFyckxlbmd0aD0iayBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheSIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCB3bj1tbixwbj1nbixkbj1objtjbGFzcyB5bntjb25zdHJ1Y3Rvcih0LGUscil7dGhpcy5FbGVtZW50cz10LHRoaXMuSz1lLHRoaXMuRGlzdGFuY2VGbj1yLHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSExLHRoaXMuaXRlcmF0ZT0oKT0+e3RoaXMuSXRlcmF0aW9uQ291bnQrKyx0aGlzLkNsdXN0ZXJzfHx0aGlzLmFsbG9jYXRlVG9DbHVzdGVyc0Fyb3VuZEN1cnJlbnRNZWRvaWRzKCk7Y29uc3QgdD10aGlzLk1lZG9pZHMsZT10aGlzLkNsdXN0ZXJzLHI9dGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO2xldCBzPXI7Zm9yKGxldCB0PTA7dDx0aGlzLk1lZG9pZHMubGVuZ3RoO3QrKyl7Y29uc3QgZT10PT4wPT09dGhpcy5NZWRvaWRzLmZpbHRlcigoZT0+MD09PXRoaXMuRGlzdGFuY2VGbih0LGUpKSkubGVuZ3RoO2Zvcihjb25zdCByIG9mIHRoaXMuRWxlbWVudHMuZmlsdGVyKGUpKXtjb25zdCBlPXRoaXMuTWVkb2lkcy5zbGljZSgpO2VbdF09cjtjb25zdCBuPW5ldyB5bih0aGlzLkVsZW1lbnRzLnNsaWNlKCksdGhpcy5LLHRoaXMuRGlzdGFuY2VGbik7bi5NZWRvaWRzPWUsbi5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IG89bi5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO288cyYmKHM9byx0aGlzLkNsdXN0ZXJzPW4uQ2x1c3RlcnMsdGhpcy5NZWRvaWRzPWUpfX1yZXR1cm4gdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpPHJ8fCh0aGlzLkNsdXN0ZXJzPWUsdGhpcy5NZWRvaWRzPXQsdGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWQ9ITAsITEpfSx0aGlzLmdldENsdXN0ZXJlZERhdGE9KCk9Pih0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZHx8dGhpcy5ydW5Ub0NvbXBsZXRpb24oKSx0aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5FbGVtZW50cy5tYXAoKHQ9PnQuRWxlbWVudCkpKSkpLHRoaXMucnVuVG9Db21wbGV0aW9uPSgpPT57Zm9yKDt0aGlzLml0ZXJhdGUoKTspO30sdGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcz0oKT0+e3RoaXMuQ2x1c3RlcnM9bmV3IEFycmF5LHRoaXMuTWVkb2lkcy5mb3JFYWNoKCh0PT57dGhpcy5DbHVzdGVycy5wdXNoKG5ldyBkbi5DbHVzdGVyKHtFbGVtZW50czpbXSxNZWRvaWQ6dH0pKX0pKSx0aGlzLkVsZW1lbnRzLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgcj10aGlzLmZpbmREaXN0YW5jZXModGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuTWVkb2lkKSksdCkscz1yLnJlZHVjZSgoKHQsZSxyLHMpPT5lPHNbdF0/cjp0KSwwKTt0aGlzLkNsdXN0ZXJzW3NdLkVsZW1lbnRzLnB1c2goe0Rpc3RhbmNlRnJvbU1lZG9pZDpyW3NdLEVsZW1lbnQ6dH0pfSkpfSx0aGlzLmNhbGN1bGF0ZUN1cnJlbnRDb3N0PSgpPT50aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5nZXRDb3N0KCkpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApLHRoaXMuZmluZERpc3RhbmNlcz0odCxlKT0+dC5tYXAoKHQ9PnRoaXMuRGlzdGFuY2VGbih0LGUpKSksdGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcz0oKT0+e2lmKHRoaXMuSz49dGhpcy5FbGVtZW50cy5sZW5ndGgpdGhyb3cgcG4ua0d0RWxlbWVudEFyckxlbmd0aDtjb25zdCB0PVtdLGU9KHQsZSk9Pntmb3IoY29uc3QgciBvZiBlKWlmKDA9PT10aGlzLkRpc3RhbmNlRm4ocix0KSlyZXR1cm4hMTtyZXR1cm4hMH07bGV0IHI9MDtmb3IoO3I8dGhpcy5FbGVtZW50cy5sZW5ndGgmJnQubGVuZ3RoPHRoaXMuSzspZSh0aGlzLkVsZW1lbnRzW3JdLHQpJiZ0LnB1c2godGhpcy5FbGVtZW50c1tyXSkscisrO3JldHVybiB0fSx0aGlzLkRpc3RhbmNlRm49dGhpcy5EaXN0YW5jZUZufHx3bi5kaXN0YW5jZSx0aGlzLk1lZG9pZHM9dGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcygpLHRoaXMuSXRlcmF0aW9uQ291bnQ9MH1nZXQgT3B0aW1pc2F0aW9uU3RhcnRlZCgpe3JldHVybiB0aGlzLkl0ZXJhdGlvbkNvdW50PjB9fXluLmNsdXN0ZXJFbGVtZW50cz0odCxlLHIpPT57eW4uZ2V0SW5zdGFuY2UodCxlLHIpO3JldHVybiBuZXcgQXJyYXl9LHluLmdldEluc3RhbmNlPSh0LGUscik9Pm5ldyB5bih0LGUsciksZm4uQ2x1c3RlcmVyPXluLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7Zm9yKHZhciByIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShyKXx8KHRbcl09ZVtyXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUoaG4pLGUoZm4pfShsbik7dmFyIGJuPVRlKGxuKTtmdW5jdGlvbiBNbih0LGUpe2xldCByPTA7Zm9yKGxldCBzPTA7czx0Lmxlbmd0aDtzKyspcis9KHRbc10tZVtzXSkqKHRbc10tZVtzXSk7cmV0dXJuIHJ9Y29uc3Qgdm49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB4bih0LGU9e30pe2NvbnN0e21pbkxlbmd0aDpyfT1lO2lmKCFmdW5jdGlvbih0KXtjb25zdCBlPXZuLmNhbGwodCk7cmV0dXJuIGUuZW5kc1dpdGgoIkFycmF5XSIpJiYhZS5pbmNsdWRlcygiQmlnIil9KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtpZigibnVtYmVyIiE9dHlwZW9mIHRbMF0pdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBjb250YWluIG51bWJlcnMiKTtpZihyJiZ0Lmxlbmd0aDxyKXRocm93IG5ldyBFcnJvcihgaW5wdXQgbXVzdCBoYXZlIGEgbGVuZ3RoIG9mIGF0IGxlYXN0ICR7cn1gKX1mdW5jdGlvbiBFbih0LGUscj17fSl7Y29uc3R7c29ydGVkOnM9ITB9PXI7aWYocyl7bGV0IHI9MCxzPXQubGVuZ3RoLTEsbj0wO2Zvcig7cy1yPjE7KWlmKG49cisocy1yPj4xKSx0W25dPGUpcj1uO2Vsc2V7aWYoISh0W25dPmUpKXJldHVybiBuO3M9bn1yZXR1cm4gcjx0Lmxlbmd0aC0xP01hdGguYWJzKGUtdFtyXSk8TWF0aC5hYnModFtyKzFdLWUpP3I6cisxOnJ9e2xldCByPTAscz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IG89TWF0aC5hYnModFtuXS1lKTtvPHMmJihzPW8scj1uKX1yZXR1cm4gcn19ZnVuY3Rpb24gU24odCxlPXt9KXtsZXR7ZnJvbUluZGV4OnIsdG9JbmRleDpzfT1lO2NvbnN0e2Zyb206bix0bzpvfT1lO3JldHVybiB2b2lkIDA9PT1yJiYocj12b2lkIDAhPT1uP0VuKHQsbik6MCksdm9pZCAwPT09cyYmKHM9dm9pZCAwIT09bz9Fbih0LG8pOnQubGVuZ3RoLTEpLHI8MCYmKHI9MCksczwwJiYocz0wKSxyPj10Lmxlbmd0aCYmKHI9dC5sZW5ndGgtMSkscz49dC5sZW5ndGgmJihzPXQubGVuZ3RoLTEpLHI+cyYmKFtyLHNdPVtzLHJdKSx7ZnJvbUluZGV4OnIsdG9JbmRleDpzfX1mdW5jdGlvbiBfbih0LGU9e30pe3huKHQpO2NvbnN0e2Zyb21JbmRleDpyLHRvSW5kZXg6c309U24odCxlKTtsZXQgbj10W3JdO2ZvcihsZXQgZT1yKzE7ZTw9cztlKyspbis9dFtlXTtyZXR1cm4gbi8ocy1yKzEpfWZ1bmN0aW9uIGpuKHQsZSl7Y29uc3Qgcj02NTUzNSYodD4+Pj0wKTtyZXR1cm4oKHQtcikqKGU+Pj49MCk+Pj4wKStyKmU+Pj4wfWNsYXNzIEFue3JhbmRvbTtzdGF0ZTtjb25zdHJ1Y3Rvcih0PURhdGUubm93KCkpe3RoaXMuc3RhdGU9bmV3IFVpbnQzMkFycmF5KDQpLHRoaXMuaW5pdCh0KSx0aGlzLnJhbmRvbT10aGlzLmdldEZsb2F0LmJpbmQodGhpcyl9Z2V0VWludDMyKCl7cmV0dXJuIHRoaXMubmV4dFN0YXRlKCksdGhpcy5zdGF0ZVszXSt0aGlzLnN0YXRlWzJdPj4+MH1nZXRGbG9hdCgpe3JldHVybiA1Ljk2MDQ2NDQ3NzUzOTA2M2UtOCoodGhpcy5nZXRVaW50MzIoKT4+PjgpfWluaXQodCl7aWYoIU51bWJlci5pc0ludGVnZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigic2VlZCBtdXN0IGJlIGFuIGludGVnZXIiKTt0aGlzLnN0YXRlWzBdPXQsdGhpcy5zdGF0ZVsxXT0wLHRoaXMuc3RhdGVbMl09MCx0aGlzLnN0YXRlWzNdPTA7Zm9yKGxldCB0PTE7dDw4O3QrKyl0aGlzLnN0YXRlWzMmdF1ePXQram4oMTgxMjQzMzI1Myx0aGlzLnN0YXRlW3QtMSYzXV50aGlzLnN0YXRlW3QtMSYzXT4+PjMwPj4+MCk+Pj4wO3RoaXMucGVyaW9kQ2VydGlmaWNhdGlvbigpO2ZvcihsZXQgdD0wO3Q8ODt0KyspdGhpcy5uZXh0U3RhdGUoKX1wZXJpb2RDZXJ0aWZpY2F0aW9uKCl7MD09PXRoaXMuc3RhdGVbMF0mJjA9PT10aGlzLnN0YXRlWzFdJiYwPT09dGhpcy5zdGF0ZVsyXSYmMD09PXRoaXMuc3RhdGVbM10mJih0aGlzLnN0YXRlWzBdPTg4LHRoaXMuc3RhdGVbMV09ODMsdGhpcy5zdGF0ZVsyXT02NSx0aGlzLnN0YXRlWzNdPTY4KX1uZXh0U3RhdGUoKXtsZXQgdD10aGlzLnN0YXRlWzBdO3RePXQ8PDE1LHRePXQ+Pj4xOCx0Xj10aGlzLnN0YXRlWzNdPDwxMSx0aGlzLnN0YXRlWzBdPXRoaXMuc3RhdGVbMV0sdGhpcy5zdGF0ZVsxXT10aGlzLnN0YXRlWzJdLHRoaXMuc3RhdGVbMl09dGhpcy5zdGF0ZVszXSx0aGlzLnN0YXRlWzNdPXR9fWZ1bmN0aW9uIFJuKHQsZT17fSl7eG4odCk7Y29uc3R7ZnJvbUluZGV4OnIsdG9JbmRleDpzfT1Tbih0LGUpO2xldCBuPXRbcl07Zm9yKGxldCBlPXIrMTtlPD1zO2UrKyluKz10W2VdO3JldHVybiBufWNvbnN0IEluPXtkaXN0YW5jZUZ1bmN0aW9uOk1ufTtmdW5jdGlvbiBDbih0LGUscj1Jbil7Y29uc3Qgcz1yLmRpc3RhbmNlRnVuY3Rpb258fEluLmRpc3RhbmNlRnVuY3Rpb24sbj1yLnNpbWlsYXJpdHlGdW5jdGlvbnx8SW4uc2ltaWxhcml0eUZ1bmN0aW9uO2xldCBvPS0xO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXtsZXQgcj1OdW1iZXIuTUlOX1ZBTFVFO2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtjb25zdCBpPW4oZSx0W3NdKTtpPnImJihyPWksbz1zKX19ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcyl0aHJvdyBuZXcgRXJyb3IoIkEgc2ltaWxhcml0eSBvciBkaXN0YW5jZSBmdW5jdGlvbiBpdCdzIHJlcXVpcmVkIik7e2xldCByPU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9cyhlLHRbbl0pO2k8ciYmKHI9aSxvPW4pfX19cmV0dXJuIG99ZnVuY3Rpb24gTm4odCxlLHIscyl7Y29uc3Qgbj17ZGlzdGFuY2VGdW5jdGlvbjpzfTtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKylyW3NdPUNuKGUsdFtzXSxuKTtyZXR1cm4gcn1jbGFzcyBrbntjbHVzdGVycztjZW50cm9pZHM7Y29udmVyZ2VkO2l0ZXJhdGlvbnM7ZGlzdGFuY2U7Y29uc3RydWN0b3IodCxlLHIscyxuKXt0aGlzLmNsdXN0ZXJzPXQsdGhpcy5jZW50cm9pZHM9ZSx0aGlzLmNvbnZlcmdlZD1yLHRoaXMuaXRlcmF0aW9ucz1zLHRoaXMuZGlzdGFuY2U9bn1uZWFyZXN0KHQpe2NvbnN0IGU9bmV3IEFycmF5KHQubGVuZ3RoKTtyZXR1cm4gTm4odCx0aGlzLmNlbnRyb2lkcyxlLHRoaXMuZGlzdGFuY2UpfWNvbXB1dGVJbmZvcm1hdGlvbih0KXtjb25zdCBlPXRoaXMuY2VudHJvaWRzLm1hcCgoKCk9PltdKSk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IHM9dGhpcy5jbHVzdGVyc1tyXTtlW3NdLnB1c2godGhpcy5kaXN0YW5jZSh0W3JdLHRoaXMuY2VudHJvaWRzW3NdKSl9cmV0dXJuIHRoaXMuY2VudHJvaWRzLm1hcCgoKHQscik9Pntjb25zdCBzPWVbcl07cmV0dXJue2NlbnRyb2lkOnQsZXJyb3I6cy5sZW5ndGg+MD9fbihzKTotMSxzaXplOnMubGVuZ3RofX0pKX19ZnVuY3Rpb24gVG4odCxlPXt9LHI9TWF0aC5yYW5kb20pe2NvbnN0e3NpemU6cz0xLHJlcGxhY2U6bj0hMSxwcm9iYWJpbGl0aWVzOm99PWU7bGV0IGksdTtpZihpPSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfSh0KTp0LnNsaWNlKCksbyl7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJjaG9pY2Ugd2l0aCBwcm9iYWJpbGl0aWVzIGFuZCBubyByZXBsYWNlbWVudCBpcyBub3QgaW1wbGVtZW50ZWQiKTtpZihvLmxlbmd0aCE9PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBwcm9iYWJpbGl0aWVzIG9wdGlvbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaG9pY2VzIik7dT1bb1swXV07Zm9yKGxldCB0PTE7dDxvLmxlbmd0aDt0KyspdVt0XT11W3QtMV0rb1t0XTtpZihNYXRoLmFicygxLXUuYXQoLTEpKT4xZS04KXRocm93IG5ldyBFcnJvcihgcHJvYmFiaWxpdGllcyBzaG91bGQgc3VtIHRvIDEsIGJ1dCBpbnN0ZWFkIHN1bXMgdG8gJHt1LmF0KC0xKX1gKX1pZighbiYmcz5pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNpemUgb3B0aW9uIGlzIHRvbyBsYXJnZSIpO2NvbnN0IGE9W107Zm9yKGxldCB0PTA7dDxzO3QrKyl7Y29uc3QgdD1GbihpLmxlbmd0aCxyLHUpO2EucHVzaChpW3RdKSxufHxpLnNwbGljZSh0LDEpfXJldHVybiBhfWZ1bmN0aW9uIEZuKHQsZSxyKXtjb25zdCBzPWUoKTtpZihyKXtsZXQgdD0wO2Zvcig7cz5yW3RdOyl0Kys7cmV0dXJuIHR9cmV0dXJuIE1hdGguZmxvb3Iocyp0KX1jbGFzcyBPbntyYW5kb21HZW5lcmF0b3I7Y29uc3RydWN0b3IodD1NYXRoLnJhbmRvbSl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtjb25zdCBlPW5ldyBBbih0KTt0aGlzLnJhbmRvbUdlbmVyYXRvcj1lLnJhbmRvbX1lbHNlIHRoaXMucmFuZG9tR2VuZXJhdG9yPXR9Y2hvaWNlKHQsZSl7cmV0dXJuIFRuKHQsZSx0aGlzLnJhbmRvbUdlbmVyYXRvcil9cmFuZG9tKCl7cmV0dXJuIHRoaXMucmFuZG9tR2VuZXJhdG9yKCl9cmFuZEludCh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9MCksdCtNYXRoLmZsb29yKHRoaXMucmFuZG9tR2VuZXJhdG9yKCkqKGUtdCkpfXJhbmRvbVNhbXBsZSh0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMucmFuZG9tKCkpO3JldHVybiBlfX1mdW5jdGlvbiBWbih0LGUpe2NvbnN0IHI9bmV3IGpyKHQucm93cyxlLnJvd3MpO2ZvcihsZXQgcz0wO3M8dC5yb3dzO3MrKylmb3IobGV0IG49MDtuPGUucm93cztuKyspci5zZXQocyxuLE1uKHQuZ2V0Um93KHMpLGUuZ2V0Um93KG4pKSk7cmV0dXJuIHJ9Y29uc3Qgem49e21heEl0ZXJhdGlvbnM6MTAwLHRvbGVyYW5jZToxZS02LGluaXRpYWxpemF0aW9uOiJrbWVhbnMrKyIsZGlzdGFuY2VGdW5jdGlvbjpNbn07ZnVuY3Rpb24gRG4odCxlLHIscyxuLG8pe2NvbnN0IGk9ZnVuY3Rpb24odCxlLHIscyl7Y29uc3Qgbj1lWzBdLmxlbmd0aCxvPW5ldyBBcnJheShzKSxpPW5ldyBBcnJheShzKTtmb3IobGV0IHQ9MDt0PHM7dCsrKXtvW3RdPW5ldyBBcnJheShuKSxpW3RdPTA7Zm9yKGxldCBlPTA7ZTxuO2UrKylvW3RdW2VdPTB9Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2lbclt0XV0rKztmb3IobGV0IHM9MDtzPG47cysrKW9bclt0XV1bc10rPWVbdF1bc119Zm9yKGxldCBlPTA7ZTxzO2UrKylmb3IobGV0IHI9MDtyPG47cisrKWlbZV0/b1tlXVtyXS89aVtlXTpvW2VdW3JdPXRbZV1bcl07cmV0dXJuIG99KHQsZSxyPU5uKGUsdCxyLG4uZGlzdGFuY2VGdW5jdGlvbikscyksdT1mdW5jdGlvbih0LGUscixzKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZihyKHRbbl0sZVtuXSk+cylyZXR1cm4hMTtyZXR1cm4hMH0oaSx0LG4uZGlzdGFuY2VGdW5jdGlvbixuLnRvbGVyYW5jZSk7cmV0dXJuIG5ldyBrbihyLGksdSxvLG4uZGlzdGFuY2VGdW5jdGlvbil9ZnVuY3Rpb24gUG4odCxlLHIpe2NvbnN0IHM9ZnVuY3Rpb24odCl7cmV0dXJuey4uLnpuLC4uLnR9fShyKTshZnVuY3Rpb24odCxlKXtpZihlPD0wfHxlPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgRXJyb3IoIksgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBwb2ludHMiKX0odCxlKTtsZXQgbj1mdW5jdGlvbih0LGUscil7bGV0IHM7aWYoQXJyYXkuaXNBcnJheShyLmluaXRpYWxpemF0aW9uKSl7aWYoci5pbml0aWFsaXphdGlvbi5sZW5ndGghPT1lKXRocm93IG5ldyBFcnJvcigiVGhlIGluaXRpYWwgY2VudGVycyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgSyIpO3M9ci5pbml0aWFsaXphdGlvbn1lbHNlIHN3aXRjaChyLmluaXRpYWxpemF0aW9uKXtjYXNlImttZWFucysrIjpzPWZ1bmN0aW9uKHQsZSxyPXt9KXtjb25zdCBzPW5ldyBqcih0KSxuPXMucm93cyxvPW5ldyBPbihyLnNlZWQpLGk9W10sdT1yLmxvY2FsVHJpYWxzfHwyK01hdGguZmxvb3IoTWF0aC5sb2coZSkpLGE9by5yYW5kSW50KG4pO2kucHVzaChzLmdldFJvdyhhKSk7bGV0IGw9bmV3IGpyKDEscy5yb3dzKTtmb3IobGV0IHQ9MDt0PHMucm93czt0KyspbC5zZXQoMCx0LE1uKHMuZ2V0Um93KHQpLGlbMF0pKTtsZXQgaD1qci5tdWwobCwxL1JuKGwuZ2V0Um93KDApKSk7Zm9yKGxldCB0PTE7dDxlO3QrKyl7Y29uc3QgZT1vLmNob2ljZShuLHtyZXBsYWNlOiEwLHNpemU6dSxwcm9iYWJpbGl0aWVzOmguZ2V0Um93KDApfSkscj1WbihzLnN1Yk1hdHJpeFJvdyhlKSxzKTtsZXQgYT0xLzAsYz0xLzAsZj1sO2ZvcihsZXQgdD0wO3Q8dTt0Kyspe2NvbnN0IHM9anIubWluKGwsW3IuZ2V0Um93KHQpXSksbj1zLnN1bSgpO248YyYmKGE9ZVt0XSxjPW4sZj1zKX1pW3RdPXMuZ2V0Um93KGEpLGw9ZixoPWpyLm11bChsLDEvUm4obC5nZXRSb3coMCkpKX1yZXR1cm4gaX0odCxlLHIpO2JyZWFrO2Nhc2UicmFuZG9tIjpzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbmV3IE9uKHIpLmNob2ljZSh0LHtzaXplOmV9KX0odCxlLHIuc2VlZCk7YnJlYWs7Y2FzZSJtb3N0RGlzdGFudCI6cz1mdW5jdGlvbih0LGUscixzKXtjb25zdCBuPW5ldyBPbihzKSxvPW5ldyBBcnJheShlKTtpZihvWzBdPU1hdGguZmxvb3Iobi5yYW5kb20oKSp0Lmxlbmd0aCksZT4xKXtjb25zdCBzPXtkaXN0Oi0xLGluZGV4Oi0xfTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoOysrZSlyW29bMF1dW2VdPnMuZGlzdCYmKHMuZGlzdD1yW29bMF1dW2VdLHMuaW5kZXg9ZSk7aWYob1sxXT1zLmluZGV4LGU+Milmb3IobGV0IHM9MjtzPGU7KytzKXtsZXQgZT17ZGlzdDotMSxpbmRleDotMX07Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDsrK24pe2xldCB0PXtkaXN0Ok51bWJlci5NQVhfVkFMVUUsaW5kZXg6LTF9O2lmKCFvLmluY2x1ZGVzKG4pKWZvcihsZXQgZT0wO2U8czsrK2UpcltvW2VdXVtuXTx0LmRpc3QmJih0PXtkaXN0OnJbb1tlXV1bbl0saW5kZXg6bn0pO3QuZGlzdCE9PU51bWJlci5NQVhfVkFMVUUmJnQuZGlzdD5lLmRpc3QmJihlPXsuLi50fSl9b1tzXT1lLmluZGV4fX1yZXR1cm4gby5tYXAoKGU9PnRbZV0pKX0odCxlLGZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj1uZXcgQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXJbZV09bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IHM9MDtzPHQubGVuZ3RoOysrcylmb3IobGV0IG49cztuPHQubGVuZ3RoOysrbil7Y29uc3Qgbz1lKHRbc10sdFtuXSk7cltzXVtuXT1vLHJbbl1bc109b31yZXR1cm4gcn0odCxyLmRpc3RhbmNlRnVuY3Rpb24pLHIuc2VlZCk7YnJlYWs7ZGVmYXVsdDohZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgRXJyb3IoYCR7ZX06ICIke1N0cmluZyh0KX0iYCl9KHIuaW5pdGlhbGl6YXRpb24sIlVua25vd24gaW5pdGlhbGl6YXRpb24gbWV0aG9kIil9cmV0dXJuIHN9KHQsZSxzKTswPT09cy5tYXhJdGVyYXRpb25zJiYocy5tYXhJdGVyYXRpb25zPU51bWJlci5NQVhfVkFMVUUpO2NvbnN0IG89bmV3IEFycmF5KHQubGVuZ3RoKTtsZXQgaSx1PSExLGE9MDtmb3IoOyF1JiZhPHMubWF4SXRlcmF0aW9uczspaT1EbihuLHQsbyxlLHMsKythKSx1PWkuY29udmVyZ2VkLG49aS5jZW50cm9pZHM7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJ1bnJlYWNoYWJsZTogbm8ga21lYW5zIHN0ZXAgZXhlY3V0ZWQiKTtyZXR1cm4gaX1jbGFzcyBxbntjb25zdHJ1Y3Rvcih0KXt0aGlzLnJvd3M9dH1sZW4oKXtyZXR1cm4gdGhpcy5yb3dzLmxlbmd0aH1pc1NxdWFyZSgpe2NvbnN0IHQ9dGhpcy5yb3dzLmxlbmd0aDtmb3IobGV0IGU9MDtlPHQ7ZSsrKWlmKHRoaXMucm93c1tlXS5sZW5ndGghPT10KXJldHVybiExO3JldHVybiEwfWdldCh0LGUpe3JldHVybiB0aGlzLnJvd3NbdF1bZV19fWNvbnN0ICRuPTQyOTQ5NjcyOTU7Y2xhc3MgTG57Y29uc3RydWN0b3IodCxlKXt0aGlzLmk9dCx0aGlzLmQ9ZX1jbG9uZSgpe3JldHVybiBuZXcgTG4odGhpcy5pLHRoaXMuZCl9c3RhdGljIGVtcHR5KCl7cmV0dXJuIG5ldyBMbigkbiwwKX19Y2xhc3MgVW57Y29uc3RydWN0b3IodCxlLHIscyl7dGhpcy5uZWFyPW5ldyBMbih0LGUpLHRoaXMuc2Vjbz1uZXcgTG4ocixzKX1jbG9uZSgpe3JldHVybiBuZXcgVW4odGhpcy5uZWFyLmksdGhpcy5uZWFyLmQsdGhpcy5zZWNvLmksdGhpcy5zZWNvLmQpfXN0YXRpYyBlbXB0eSgpe3JldHVybiBuZXcgVW4oJG4sMCwkbiwwKX19ZnVuY3Rpb24gR24odCxlLHIpe2NvbnN0IHM9KHQ9ZnVuY3Rpb24odCl7aWYodCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5sZW4pcmV0dXJuIHQ7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gbmV3IHFuKHQpO3Rocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgbWF0cml4IGlucHV0OiBwcm92aWRlIGEgMkQgYXJyYXksIGEgRGVuc2VNYXRyaXgsIG9yIGEgTG93ZXJUcmlhbmdsZSIpfSh0KSkubGVuKCksbj1lLmxlbmd0aDtpZigxPT09bil7Y29uc3Qgcj1uZXcgQXJyYXkocykuZmlsbCgwKSxbbixvXT1mdW5jdGlvbih0LGUscixzKXtjb25zdCBuPXJbc107bGV0IG89bixpPTA7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspbiE9PXImJmVbcl09PT1zJiYoaSs9dC5nZXQobixyKSk7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYociE9PW4mJmVbcl09PT1zKXtsZXQgbj0wO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKW8hPT1yJiZlW29dPT09cyYmKG4rPXQuZ2V0KHIsbykpO248aSYmKG89cixpPW4pfXJldHVybiByW3NdPW8sW28hPT1uLGldfSh0LHIsZSwwKTtyZXR1cm57bG9zczpvLGFzc2k6cixuSXRlcjoxLG5Td2FwczpuPzE6MH19bGV0W28saV09ZnVuY3Rpb24odCxlKXtjb25zdCByPXQubGVuKCkscz1lLmxlbmd0aDtpZighdC5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiRGlzc2ltaWxhcml0eSBtYXRyaXggaXMgbm90IHNxdWFyZSIpO2lmKCEocjw9JG4pKXRocm93IG5ldyBFcnJvcigiTiBpcyB0b28gbGFyZ2UiKTtpZighKHM+MCYmczwkbikpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIE4iKTtpZighKHM8PXIpKXRocm93IG5ldyBFcnJvcigiayBtdXN0IGJlIGF0IG1vc3QgTiIpO2NvbnN0IG49QXJyYXkuZnJvbSh7bGVuZ3RoOnQubGVuKCl9LCgoKT0+VW4uZW1wdHkoKSkpLG89ZVswXTtsZXQgaT0wO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtuW3JdPW5ldyBVbigwLHQuZ2V0KHIsbyksJG4sMCk7Y29uc3Qgcz1uW3JdO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXtjb25zdCBvPWVbbl0saT10LmdldChyLG8pO2k8cy5uZWFyLmR8fHI9PT1vPyhzLnNlY289cy5uZWFyLmNsb25lKCkscy5uZWFyPW5ldyBMbihuLGkpKToocy5zZWNvLmk9PT0kbnx8aTxzLnNlY28uZCkmJihzLnNlY289bmV3IExuKG4saSkpfWkrPXMubmVhci5kfXJldHVybltpLG5dfSh0LGUpLHU9bmV3IEFycmF5KG4pLmZpbGwoMCk7V24oaSx1KTtsZXQgYT1zLGw9MCxoPTA7Zm9yKDtoPHI7KXtoKz0xO2NvbnN0IHI9bCxuPW87Zm9yKGxldCByPTA7cjxzJiZyIT09YTtyKyspe2lmKHI9PT1lW2lbcl0ubmVhci5pXSljb250aW51ZTtjb25zdFtzLG5dPUJuKHQsdSxpLHIpO3M+PTB8fChsKz0xLGE9cixvPVFuKHQsZSxpLG4sciksV24oaSx1KSl9aWYobD09PXJ8fG8+PW4pYnJlYWt9cmV0dXJue2xvc3M6byxhc3NpOmkubWFwKCh0PT50Lm5lYXIuaSkpLG5JdGVyOmgsblN3YXBzOmx9fWZ1bmN0aW9uIEJuKHQsZSxyLHMpe2NvbnN0IG49ZS5zbGljZSgpO2xldCBvPTA7Zm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspe2NvbnN0IGk9cltlXSx1PXQuZ2V0KGUscyk7dTxpLm5lYXIuZD8obys9dS1pLm5lYXIuZCxuW2kubmVhci5pXSs9aS5uZWFyLmQtaS5zZWNvLmQpOnU8aS5zZWNvLmQmJihuW2kubmVhci5pXSs9dS1pLnNlY28uZCl9Y29uc3RbaSx1XT1mdW5jdGlvbih0KXtsZXQgZT0wLHI9dFswXTtmb3IobGV0IHM9MTtzPHQubGVuZ3RoO3MrKyl0W3NdPHImJihlPXMscj10W3NdKTtyZXR1cm5bZSxyXX0obik7cmV0dXJuW3UrbyxpXX1mdW5jdGlvbiBXbih0LGUpe2UuZmlsbCgwKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7Y29uc3Qgcz10W3JdO2Vbcy5uZWFyLmldKz1zLnNlY28uZC1zLm5lYXIuZH19ZnVuY3Rpb24gS24odCxlLHIscyxuLG8pe2xldCBpPW5ldyBMbihzLG8pO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKXtjb25zdCB1PWVbb107aWYobz09PXJ8fG89PT1zKWNvbnRpbnVlO2NvbnN0IGE9dC5nZXQobix1KTthPGkuZCYmKGk9bmV3IExuKG8sYSkpfXJldHVybiBpfWZ1bmN0aW9uIFFuKHQsZSxyLHMsbil7Y29uc3Qgbz10LmxlbigpO2lmKCEoczxlLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG1lZG9pZCBudW1iZXIiKTtpZighKG48bykpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG9iamVjdCBudW1iZXIiKTtlW3NdPW47bGV0IGk9MDtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKyl7Y29uc3QgdT1yW29dO2lmKG89PT1uKXt1Lm5lYXIuaSE9PXMmJih1LnNlY289dS5uZWFyLmNsb25lKCkpLHUubmVhcj1uZXcgTG4ocywwKSxpKz0wO2NvbnRpbnVlfWNvbnN0IGE9dC5nZXQobyxuKTt1Lm5lYXIuaT09PXM/YTx1LnNlY28uZD91Lm5lYXI9bmV3IExuKHMsYSk6KHUubmVhcj11LnNlY28uY2xvbmUoKSx1LnNlY289S24odCxlLHUubmVhci5pLHMsbyxhKSk6YTx1Lm5lYXIuZD8odS5zZWNvPXUubmVhci5jbG9uZSgpLHUubmVhcj1uZXcgTG4ocyxhKSk6YTx1LnNlY28uZD91LnNlY289bmV3IExuKHMsYSk6dS5zZWNvLmk9PT1zJiYodS5zZWNvPUtuKHQsZSx1Lm5lYXIuaSxzLG8sYSkpLGkrPXUubmVhci5kfXJldHVybiBpfWZ1bmN0aW9uIFhuKHQsZSl7bGV0IHI9MDtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKyl7bGV0IG49dFtzXS1lW3NdO3IrPW4qbn1yZXR1cm4gTWF0aC5zcXJ0KHIpfWZ1bmN0aW9uIFluKHQsZSxyKXtsZXQgcz10Lmxlbmd0aCxuPV8ocik/cjpYbjtsZXQgbz1BcnJheS5mcm9tKHtsZW5ndGg6c30sKCgpPT5uZXcgRmxvYXQ2NEFycmF5KHMpKSk7Zm9yKGxldCBlPTA7ZTxzO2UrKylmb3IobGV0IHI9ZSsxO3I8cztyKyspe2xldCBzPW4odFtlXSx0W3JdKTtvW2VdW3JdPXMsb1tyXVtlXT1zfXZhciBpO2xldCB1PUduKG8sKGk9ZSxBcnJheS5mcm9tKHtsZW5ndGg6aX0sKCh0LGUpPT5lKSkpLDEwMCksYT17fTtyZXR1cm4gdXModS5hc3NpLCgodCxlKT0+e2FbdF18fChhW3RdPVtdKSxhW3RdLnB1c2goZSl9KSksdW4oYSl9YXN5bmMgZnVuY3Rpb24gSm4odCxlLHI9e30pe2xldCBzPXd0KHIsImZ1bkRpc3QiLG51bGwpO3JldHVybiJzaW1wbGUiPT09d3QociwidXNlTWV0aG9kIiwiZmFzdGVyUEFNIik/ZnVuY3Rpb24odCxlLHIpe2xldCBzPW5ldyBNYXA7dXModCwoKHQsZSk9PntzLnNldCh0LGUpfSkpO2xldCBuPWJuLkNsdXN0ZXJlci5nZXRJbnN0YW5jZSh0LGUscikuZ2V0Q2x1c3RlcmVkRGF0YSgpO3JldHVybiBuPW9uKG4sKHQ9Pm9uKHQsKHQ9PnMuZ2V0KHQpKSkpKSxufSh0LGUscyk6WW4odCxlLHMpfWFzeW5jIGZ1bmN0aW9uIEhuKHQsZT17fSl7bGV0IHI9d3QoZSwia051bWJlciIpO3I9d2Uocik/a2Uocik6MjtsZXQgcz13dChlLCJtb2RlIik7ImstbWVkb2lkcyIhPT1zJiYiay1tZWFucyIhPT1zJiYocz0iay1tZWRvaWRzIik7bGV0IG4sbz13dChlLCJzZWVkIixudWxsKSxpPXd0KGUsImZ1bkRpc3QiLG51bGwpLHU9d3QoZSwidXNlTWV0aG9kIiwiZmFzdGVyUEFNIik7aWYoImstbWVkb2lkcyI9PT1zKW49YXdhaXQgSm4odCxyLHtmdW5EaXN0OmksdXNlTWV0aG9kOnV9KTtlbHNle2lmKCJrLW1lYW5zIiE9PXMpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG1vZGVbJHtzfV1gKTtuPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQsZSxyPXt9KXtsZXQgcz13dChyLCJzZWVkIixudWxsKSxuPXt9O251bGwhPT1zJiYobj17c2VlZDpzfSk7bGV0IG89UG4odCxlLG4pLGk9e307cmV0dXJuIHVzKG8uY2x1c3RlcnMsKCh0LGUpPT57aVt0XXx8KGlbdF09W10pLGlbdF0ucHVzaChlKX0pKSx1bihpKX0odCxyLHtzZWVkOm99KX1yZXR1cm4gbn1hc3luYyBmdW5jdGlvbiBabih0LGU9e30pe2lmKCFjZSh0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IGVmZi4gYXJyYXkiKTtsZXQgcj13dChlLCJrTnVtYmVyIixudWxsKTt3ZShyKXx8KHI9Mikscj1rZShyKTtsZXQgcz13dChlLCJ1c2VQQ0EiLG51bGwpO21lKHMpfHwocz0hMCk7bGV0IG49d3QoZSwibkNvbXBOSVBBTFMiLG51bGwpO3dlKG4pfHwobj0yKSxuPWtlKG4pO2xldCBvPXd0KGUsIm1vZGUiLG51bGwpLGk9d3QoZSwic2VlZCIsbnVsbCksdT13dChlLCJmdW5EaXN0IixudWxsKSxhPXd0KGUsInVzZU1ldGhvZCIsImZhc3RlclBBTSIpLGw9IiIsaD1vZSh0KSxjPTAsZj0wO2lmKHVzKHQsKHQ9PnshZnVuY3Rpb24odCl7aWYodWUodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiEwO3JldHVybiExfXJldHVybiExfSh0KT9jZSh0KSYmKGYrPTEpOmMrPTF9KSksYz09PWgpbD0ib2JqIjtlbHNle2lmKGYhPT1oKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3Qgb2YgdGhlIHNhbWUgdHlwZSIpO2w9Im1hdCJ9bGV0IG0sZz1udWxsOyJvYmoiPT09bD8oZz1mdW5jdGlvbih0KXtsZXQgZT17fTt1cyh0LCh0PT57dXModCwoKHQscik9PntlW3JdfHwoZVtyXT0wKSwwPT09ZVtyXSYmd2UodCkmJihlW3JdPTEpLDEhPT1lW3JdfHx3ZSh0KXx8KGVbcl09LTEpfSkpfSkpO2xldCByPVtdO3JldHVybiB1cyhlLCgodCxlKT0+ezE9PT10JiZyLnB1c2goZSl9KSkscn0odCksbT1mdW5jdGlvbih0LGUpe3JldHVybiBvbih0LCh0PT51bihhbih0LGUpKSkpfSh0LGcpKTptPXQ7bGV0IHc9bTtzJiYodz1OcihtLHtuQ29tcE5JUEFMUzpufSkpO2xldCBwPWF3YWl0IEhuKHcse2tOdW1iZXI6cixtb2RlOm8sc2VlZDppLGZ1bkRpc3Q6dSx1c2VNZXRob2Q6YX0pO3JldHVybntrZXlzOmcsZ2luZHM6cCxnbWF0Om9uKHAsKHQ9Pm9uKHQsKHQ9PndbdF0pKSkpLGdsdGR0Om9uKHAsKGU9Pm9uKGUsKGU9PnRbZV0pKSkpfX1sZXQgV0NsdXN0ZXI9e1BDQTphc3luYyBmdW5jdGlvbih0LGU9e30pe3JldHVybiBOcih0LGUpfSxjbHVzdGVyOmFzeW5jIGZ1bmN0aW9uKHQsZT17fSl7dHJ5e3JldHVybiBhd2FpdCBabih0LGUpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX19fTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IFdDbHVzdGVyKC4uLmlucHV0KQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFdDbHVzdGVyCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHJlY3ZNZXNzYWdlKGUuZGF0YSkKICAgICAgICB9CiAgICAgICAgCgp0cnl7CgogICAgLy/lg4Xku6V1bmNhdWdodEV4Y2VwdGlvbk1vbml0b3LoqJjpjIQsIOS4jeWPr+iou+WGinVuY2F1Z2h0RXhjZXB0aW9u6IiHdW5oYW5kbGVkUmVqZWN0aW9u55uj6IG9OgogICAgLy/mlrx3b3JrZXLlhafoqLvlhormraTkuoznm6Pogb3mnIPpmLvmraJOb2Rl6aCQ6Kit55qEd29ya2Vy57WC5q2i6KGM54K6LCDkvb93b3JrZXLltKnmvbDlvozku43lrZjmtLvnqbrovYksCiAgICAvL+WkluWxpOaUtuS4jeWIsGVycm9yL2V4aXTkuovku7YsIHBlbmRpbmcgcHJvbWlzZeawuOS5heaHuOe9riwg5LiU5a2Y5rS75q6t5bGNd29ya2Vy5pyD5Luk5a6/5Li756iL5bqP54Sh5rOV6YCA5Ye6OwogICAgLy/np7vpmaTlvox3b3JrZXLkvp3poJDoqK3ooYzngrrmrbvkuqEsIGVycm9y5LqL5Lu25YKz6Iez5aSW5bGkLCDnlLHlpJblsaTmlbTmiblyZWplY3QgcGVuZGluZwogICAgLy8gcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKGVycikgPT4gewogICAgLy8gICAgIGNvbnNvbGUubG9nKCdpbm5lcjp1bmhhbmRsZWRSZWplY3Rpb24nLCBlcnIpCiAgICAvLyB9KQogICAgLy8gcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCAoZXJyKSA9PiB7CiAgICAvLyAgICAgY29uc29sZS5sb2coJ2lubmVyOnVuY2F1Z2h0RXhjZXB0aW9uJywgZXJyKQogICAgLy8gfSkKICAgIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvcicsIChlcnIpID0+IHsKICAgICAgICBjb25zb2xlLmxvZygnaW5uZXI6dW5jYXVnaHRFeGNlcHRpb25Nb25pdG9yJywgZXJyKQogICAgfSkKCn0KY2F0Y2goZXJyKXt9Cgo=");function b(){let b=d(),X={},G=!1;function y(d){for(let l in X){let c=X[l];delete X[l],b.removeAllListeners(l),c.reject(d)}b.emit("error",d)}function m(d){G||(G=!0,y(d))}let K=function(d){try{let l=new Blob([d]),c=window.URL||window.webkitURL;return new Worker(c.createObjectURL(l))}catch(d){m(d)}}(Z);return K?(K.onmessage=function(d){!function(d){let l=d,c=l.mode;"emit"!==c&&"return"!==c||("emit"===c&&b.emit(l.evName,l.msg),"return"===c&&b.emit(l.id,l))}(d.data)},K.onerror=m,K.onmessageerror=function(d){y(d.data)},function(){let d={mode:"init",type:"object",input:[...arguments]};K.postMessage(d)}([...arguments]),b.PCA=function(){let d=l();if(G)return d.reject("worker is dead"),d;let Z=c();X[Z]=d;let y={mode:"call",id:Z,fun:"PCA",input:[...arguments]};return K.postMessage(y),b.once(Z,(l=>{delete X[Z],"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d},b.cluster=function(){let d=l();if(G)return d.reject("worker is dead"),d;let Z=c();X[Z]=d;let y={mode:"call",id:Z,fun:"cluster",input:[...arguments]};return K.postMessage(y),b.once(Z,(l=>{delete X[Z],"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d},b.terminate=function(){K?(K.terminate(),K=void 0):y("worker has been terminated")},b):(m("invalid worker"),null)}let X={PCA:async function(){let d=[...arguments],l=b();return await l.PCA(...d).finally((()=>{l.terminate()}))},cluster:async function(){let d=[...arguments],l=b();return await l.cluster(...d).finally((()=>{l.terminate()}))}};L=d();for(let d in X){let l=X[d];L[d]=l}}();try{process.on("uncaughtExceptionMonitor",(d=>{console.log("outer:uncaughtExceptionMonitor",d)}))}catch(d){}return L}()}({get exports(){return Z},set exports(d){Z=d}});var b=Z;let X;return X="undefined"!=typeof window&&void 0!==window.document?b:c,X}));