w-cluster 1.0.4 → 1.0.5
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.
- package/.github/workflows/ci-test.yml +24 -0
- package/README.md +2 -3
- package/SECURITY.md +5 -0
- package/dist/w-cluster.umd.js +2 -2
- package/dist/w-cluster.umd.js.map +1 -1
- package/dist/w-cluster.wk.umd.js +1 -1
- package/docs/WCluster.mjs.html +1 -1
- package/docs/examples/ex-PCA.html +1 -1
- package/docs/examples/ex-cluster-k-means.html +1 -1
- package/docs/examples/ex-cluster-k-medoids.html +1 -1
- package/docs/examples/ex-cluster-webworker-k-medoids.html +1 -1
- package/docs/global.html +1 -1
- package/docs/index.html +1 -1
- package/package.json +2 -2
package/dist/w-cluster.wk.umd.js
CHANGED
|
@@ -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";function l(d){return d&&"object"==typeof d&&"default"in d?d:{default:d}}var c=l(d);function b(d){return(b="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(d){return typeof d}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":typeof d})(d)}var Z="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function X(d){var l={exports:{}};return d(l,l.exports),l.exports}var y=X((function(d,l){d.exports=function(d){function l(d,l){(null==l||l>d.length)&&(l=d.length);for(var c=0,b=new Array(l);c<l;c++)b[c]=d[c];return b}function c(d){return function(d){if(Array.isArray(d))return l(d)}(d)||function(d){if("undefined"!=typeof Symbol&&null!=d[Symbol.iterator]||null!=d["@@iterator"])return Array.from(d)}(d)||function(d,c){if(d){if("string"==typeof d)return l(d,c);var b=Object.prototype.toString.call(d).slice(8,-1);return"Object"===b&&d.constructor&&(b=d.constructor.name),"Map"===b||"Set"===b?Array.from(d):"Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b)?l(d,c):void 0}}(d)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Z(d,l,c,b,Z,X,y){try{var G=d[X](y),m=G.value}catch(d){return void c(d)}G.done?l(m):Promise.resolve(m).then(b,Z)}function X(d){return function(){var l=this,c=arguments;return new Promise((function(b,X){var y=d.apply(l,c);function G(d){Z(y,b,X,G,m,"next",d)}function m(d){Z(y,b,X,G,m,"throw",d)}G(void 0)}))}}function y(d){return(y="function"==typeof Symbol&&"symbol"==b(Symbol.iterator)?function(d){return b(d)}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":b(d)})(d)}function G(d){var l={exports:{}};return d(l,l.exports),l.exports}var m,K=G((function(d){var l=function(d){var l,c=Object.prototype,b=c.hasOwnProperty,Z="function"==typeof Symbol?Symbol:{},X=Z.iterator||"@@iterator",G=Z.asyncIterator||"@@asyncIterator",m=Z.toStringTag||"@@toStringTag";function K(d,l,c){return Object.defineProperty(d,l,{value:c,enumerable:!0,configurable:!0,writable:!0}),d[l]}try{K({},"")}catch(d){K=function(d,l,c){return d[l]=c}}function t(d,l,c,b){var Z=l&&l.prototype instanceof u?l:u,X=Object.create(Z.prototype),y=new R(b||[]);return X._invoke=function(d,l,c){var b=o;return function(Z,X){if(b===i)throw new Error("Generator is already running");if(b===I){if("throw"===Z)throw X;return T()}for(c.method=Z,c.arg=X;;){var y=c.delegate;if(y){var G=S(y,c);if(G){if(G===W)continue;return G}}if("next"===c.method)c.sent=c._sent=c.arg;else if("throw"===c.method){if(b===o)throw b=I,c.arg;c.dispatchException(c.arg)}else"return"===c.method&&c.abrupt("return",c.arg);b=i;var m=p(d,l,c);if("normal"===m.type){if(b=c.done?I:h,m.arg===W)continue;return{value:m.arg,done:c.done}}"throw"===m.type&&(b=I,c.method="throw",c.arg=m.arg)}}}(d,c,y),X}function p(d,l,c){try{return{type:"normal",arg:d.call(l,c)}}catch(d){return{type:"throw",arg:d}}}d.wrap=t;var o="suspendedStart",h="suspendedYield",i="executing",I="completed",W={};function u(){}function V(){}function s(){}var H={};H[X]=function(){return this};var n=Object.getPrototypeOf,C=n&&n(n(z([])));C&&C!==c&&b.call(C,X)&&(H=C);var L=s.prototype=u.prototype=Object.create(H);function a(d){["next","throw","return"].forEach((function(l){K(d,l,(function(d){return this._invoke(l,d)}))}))}function x(d,l){function c(Z,X,G,m){var K=p(d[Z],d,X);if("throw"!==K.type){var t=K.arg,o=t.value;return o&&"object"===y(o)&&b.call(o,"__await")?l.resolve(o.__await).then((function(d){c("next",d,G,m)}),(function(d){c("throw",d,G,m)})):l.resolve(o).then((function(d){t.value=d,G(t)}),(function(d){return c("throw",d,G,m)}))}m(K.arg)}var Z;this._invoke=function(d,b){function X(){return new l((function(l,Z){c(d,b,l,Z)}))}return Z=Z?Z.then(X,X):X()}}function S(d,c){var b=d.iterator[c.method];if(b===l){if(c.delegate=null,"throw"===c.method){if(d.iterator.return&&(c.method="return",c.arg=l,S(d,c),"throw"===c.method))return W;c.method="throw",c.arg=new TypeError("The iterator does not provide a 'throw' method")}return W}var Z=p(b,d.iterator,c.arg);if("throw"===Z.type)return c.method="throw",c.arg=Z.arg,c.delegate=null,W;var X=Z.arg;return X?X.done?(c[d.resultName]=X.value,c.next=d.nextLoc,"return"!==c.method&&(c.method="next",c.arg=l),c.delegate=null,W):X:(c.method="throw",c.arg=new TypeError("iterator result is not an object"),c.delegate=null,W)}function Y(d){var l={tryLoc:d[0]};1 in d&&(l.catchLoc=d[1]),2 in d&&(l.finallyLoc=d[2],l.afterLoc=d[3]),this.tryEntries.push(l)}function g(d){var l=d.completion||{};l.type="normal",delete l.arg,d.completion=l}function R(d){this.tryEntries=[{tryLoc:"root"}],d.forEach(Y,this),this.reset(!0)}function z(d){if(d){var c=d[X];if(c)return c.call(d);if("function"==typeof d.next)return d;if(!isNaN(d.length)){var Z=-1,y=function c(){for(;++Z<d.length;)if(b.call(d,Z))return c.value=d[Z],c.done=!1,c;return c.value=l,c.done=!0,c};return y.next=y}}return{next:T}}function T(){return{value:l,done:!0}}return V.prototype=L.constructor=s,s.constructor=V,V.displayName=K(s,m,"GeneratorFunction"),d.isGeneratorFunction=function(d){var l="function"==typeof d&&d.constructor;return!!l&&(l===V||"GeneratorFunction"===(l.displayName||l.name))},d.mark=function(d){return Object.setPrototypeOf?Object.setPrototypeOf(d,s):(d.__proto__=s,K(d,m,"GeneratorFunction")),d.prototype=Object.create(L),d},d.awrap=function(d){return{__await:d}},a(x.prototype),x.prototype[G]=function(){return this},d.AsyncIterator=x,d.async=function(l,c,b,Z,X){void 0===X&&(X=Promise);var y=new x(t(l,c,b,Z),X);return d.isGeneratorFunction(c)?y:y.next().then((function(d){return d.done?d.value:y.next()}))},a(L),K(L,m,"Generator"),L[X]=function(){return this},L.toString=function(){return"[object Generator]"},d.keys=function(d){var l=[];for(var c in d)l.push(c);return l.reverse(),function c(){for(;l.length;){var b=l.pop();if(b in d)return c.value=b,c.done=!1,c}return c.done=!0,c}},d.values=z,R.prototype={constructor:R,reset:function(d){if(this.prev=0,this.next=0,this.sent=this._sent=l,this.done=!1,this.delegate=null,this.method="next",this.arg=l,this.tryEntries.forEach(g),!d)for(var c in this)"t"===c.charAt(0)&&b.call(this,c)&&!isNaN(+c.slice(1))&&(this[c]=l)},stop:function(){this.done=!0;var d=this.tryEntries[0].completion;if("throw"===d.type)throw d.arg;return this.rval},dispatchException:function(d){if(this.done)throw d;var c=this;function Z(b,Z){return G.type="throw",G.arg=d,c.next=b,Z&&(c.method="next",c.arg=l),!!Z}for(var X=this.tryEntries.length-1;X>=0;--X){var y=this.tryEntries[X],G=y.completion;if("root"===y.tryLoc)return Z("end");if(y.tryLoc<=this.prev){var m=b.call(y,"catchLoc"),K=b.call(y,"finallyLoc");if(m&&K){if(this.prev<y.catchLoc)return Z(y.catchLoc,!0);if(this.prev<y.finallyLoc)return Z(y.finallyLoc)}else if(m){if(this.prev<y.catchLoc)return Z(y.catchLoc,!0)}else{if(!K)throw new Error("try statement without catch or finally");if(this.prev<y.finallyLoc)return Z(y.finallyLoc)}}}},abrupt:function(d,l){for(var c=this.tryEntries.length-1;c>=0;--c){var Z=this.tryEntries[c];if(Z.tryLoc<=this.prev&&b.call(Z,"finallyLoc")&&this.prev<Z.finallyLoc){var X=Z;break}}X&&("break"===d||"continue"===d)&&X.tryLoc<=l&&l<=X.finallyLoc&&(X=null);var y=X?X.completion:{};return y.type=d,y.arg=l,X?(this.method="next",this.next=X.finallyLoc,W):this.complete(y)},complete:function(d,l){if("throw"===d.type)throw d.arg;return"break"===d.type||"continue"===d.type?this.next=d.arg:"return"===d.type?(this.rval=this.arg=d.arg,this.method="return",this.next="end"):"normal"===d.type&&l&&(this.next=l),W},finish:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var c=this.tryEntries[l];if(c.finallyLoc===d)return this.complete(c.completion,c.afterLoc),g(c),W}},catch:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var c=this.tryEntries[l];if(c.tryLoc===d){var b=c.completion;if("throw"===b.type){var Z=b.arg;g(c)}return Z}}throw new Error("illegal catch attempt")},delegateYield:function(d,c,b){return this.delegate={iterator:z(d),resultName:c,nextLoc:b},"next"===this.method&&(this.arg=l),W}},d}(d.exports);try{regeneratorRuntime=l}catch(d){Function("r","regeneratorRuntime = r")(l)}})),t=G((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,y){if("function"!=typeof b)throw new TypeError("The listener must be a function");var G=new Z(b,X||d,y),m=c?c+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],G]:d._events[m].push(G):(d._events[m]=G,d._eventsCount++),d}function y(d,l){0==--d._eventsCount?d._events=new b:delete d._events[l]}function G(){this._events=new b,this._eventsCount=0}Object.create&&(b.prototype=Object.create(null),(new b).__proto__||(c=!1)),G.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},G.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,y=new Array(X);Z<X;Z++)y[Z]=b[Z].fn;return y},G.prototype.listenerCount=function(d){var l=c?c+d:d,b=this._events[l];return b?b.fn?1:b.length:0},G.prototype.emit=function(d,l,b,Z,X,y){var G=c?c+d:d;if(!this._events[G])return!1;var m,K,t=this._events[G],p=arguments.length;if(t.fn){switch(t.once&&this.removeListener(d,t.fn,void 0,!0),p){case 1:return t.fn.call(t.context),!0;case 2:return t.fn.call(t.context,l),!0;case 3:return t.fn.call(t.context,l,b),!0;case 4:return t.fn.call(t.context,l,b,Z),!0;case 5:return t.fn.call(t.context,l,b,Z,X),!0;case 6:return t.fn.call(t.context,l,b,Z,X,y),!0}for(K=1,m=new Array(p-1);K<p;K++)m[K-1]=arguments[K];t.fn.apply(t.context,m)}else{var o,h=t.length;for(K=0;K<h;K++)switch(t[K].once&&this.removeListener(d,t[K].fn,void 0,!0),p){case 1:t[K].fn.call(t[K].context);break;case 2:t[K].fn.call(t[K].context,l);break;case 3:t[K].fn.call(t[K].context,l,b);break;case 4:t[K].fn.call(t[K].context,l,b,Z);break;default:if(!m)for(o=1,m=new Array(p-1);o<p;o++)m[o-1]=arguments[o];t[K].fn.apply(t[K].context,m)}}return!0},G.prototype.on=function(d,l,c){return X(this,d,l,c,!1)},G.prototype.once=function(d,l,c){return X(this,d,l,c,!0)},G.prototype.removeListener=function(d,l,b,Z){var X=c?c+d:d;if(!this._events[X])return this;if(!l)return y(this,X),this;var G=this._events[X];if(G.fn)G.fn!==l||Z&&!G.once||b&&G.context!==b||y(this,X);else{for(var m=0,K=[],t=G.length;m<t;m++)(G[m].fn!==l||Z&&!G[m].once||b&&G[m].context!==b)&&K.push(G[m]);K.length?this._events[X]=1===K.length?K[0]:K:y(this,X)}return this},G.prototype.removeAllListeners=function(d){var l;return d?(l=c?c+d:d,this._events[l]&&y(this,l)):(this._events=new b,this._eventsCount=0),this},G.prototype.off=G.prototype.removeListener,G.prototype.addListener=G.prototype.on,G.prefixed=c,G.EventEmitter=G,d.exports=G}));return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new t}function b(){var d,l,c=new Promise((function(){d=arguments[0],l=arguments[1]}));return c.resolve=d,c.reject=l,c}function Z(){for(var d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=c.length,Z=0;Z<d;Z++)l[Z]=c[0|Math.random()*b];return l.join("")}var y,G=(y="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCnZhciB0PUFycmF5LmlzQXJyYXksZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImRlZmF1bHQiKT90LmRlZmF1bHQ6dH1mdW5jdGlvbiBvKHQpe3ZhciBlPXtleHBvcnRzOnt9fTtyZXR1cm4gdChlLGUuZXhwb3J0cyksZS5leHBvcnRzfXZhciBuPSJvYmplY3QiPT10eXBlb2YgZSYmZSYmZS5PYmplY3Q9PT1PYmplY3QmJmUscz0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGk9bnx8c3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSx1PWkuU3ltYm9sLGE9T2JqZWN0LnByb3RvdHlwZSxoPWEuaGFzT3duUHJvcGVydHksbD1hLnRvU3RyaW5nLGM9dT91LnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgZj1mdW5jdGlvbih0KXt2YXIgZT1oLmNhbGwodCxjKSxyPXRbY107dHJ5e3RbY109dm9pZCAwO3ZhciBvPSEwfWNhdGNoKHQpe312YXIgbj1sLmNhbGwodCk7cmV0dXJuIG8mJihlP3RbY109cjpkZWxldGUgdFtjXSksbn0sbT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBnPWZ1bmN0aW9uKHQpe3JldHVybiBtLmNhbGwodCl9LHA9dT91LnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgdz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjpwJiZwIGluIE9iamVjdCh0KT9mKHQpOmcodCl9O3ZhciBkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9O3ZhciBiPWZ1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8ZCh0KSYmIltvYmplY3QgU3ltYm9sXSI9PXcodCl9LHk9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sdj0vXlx3KiQvO3ZhciBNPWZ1bmN0aW9uKGUscil7aWYodChlKSlyZXR1cm4hMTt2YXIgbz10eXBlb2YgZTtyZXR1cm4hKCJudW1iZXIiIT1vJiYic3ltYm9sIiE9byYmImJvb2xlYW4iIT1vJiZudWxsIT1lJiYhYihlKSl8fCh2LnRlc3QoZSl8fCF5LnRlc3QoZSl8fG51bGwhPXImJmUgaW4gT2JqZWN0KHIpKX07dmFyIHg9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9O3ZhciBFLFM9ZnVuY3Rpb24odCl7aWYoIXgodCkpcmV0dXJuITE7dmFyIGU9dyh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LGo9aVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sXz0oRT0vW14uXSskLy5leGVjKGomJmoua2V5cyYmai5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrRToiIjt2YXIgQT1mdW5jdGlvbih0KXtyZXR1cm4hIV8mJl8gaW4gdH0sQz1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFI9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBDLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxJPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLGs9RnVuY3Rpb24ucHJvdG90eXBlLE49T2JqZWN0LnByb3RvdHlwZSxPPWsudG9TdHJpbmcsRj1OLmhhc093blByb3BlcnR5LHo9UmVnRXhwKCJeIitPLmNhbGwoRikucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIFQ9ZnVuY3Rpb24odCl7cmV0dXJuISgheCh0KXx8QSh0KSkmJihTKHQpP3o6SSkudGVzdChSKHQpKX07dmFyIFY9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIFA9ZnVuY3Rpb24odCxlKXt2YXIgcj1WKHQsZSk7cmV0dXJuIFQocik/cjp2b2lkIDB9LHE9UChPYmplY3QsImNyZWF0ZSIpO3ZhciAkPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1xP3EobnVsbCk6e30sdGhpcy5zaXplPTB9O3ZhciBEPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxVPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihxKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIFUuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxCPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gcT92b2lkIDAhPT1lW3RdOkIuY2FsbChlLHQpfTt2YXIgSz1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09cSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBXKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbz10W2VdO3RoaXMuc2V0KG9bMF0sb1sxXSl9fVcucHJvdG90eXBlLmNsZWFyPSQsVy5wcm90b3R5cGUuZGVsZXRlPUQsVy5wcm90b3R5cGUuZ2V0PUwsVy5wcm90b3R5cGUuaGFzPUcsVy5wcm90b3R5cGUuc2V0PUs7dmFyIFg9Vzt2YXIgSj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9O3ZhciBZPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfTt2YXIgWj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKFkodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX0sSD1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBRPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1aKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOkguY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfTt2YXIgdHQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPVooZSx0KTtyZXR1cm4gcjwwP3ZvaWQgMDplW3JdWzFdfTt2YXIgZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIFoodGhpcy5fX2RhdGFfXyx0KT4tMX07dmFyIHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxvPVoocix0KTtyZXR1cm4gbzwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW29dWzFdPWUsdGhpc307ZnVuY3Rpb24gb3QodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBvPXRbZV07dGhpcy5zZXQob1swXSxvWzFdKX19b3QucHJvdG90eXBlLmNsZWFyPUosb3QucHJvdG90eXBlLmRlbGV0ZT1RLG90LnByb3RvdHlwZS5nZXQ9dHQsb3QucHJvdG90eXBlLmhhcz1ldCxvdC5wcm90b3R5cGUuc2V0PXJ0O3ZhciBudD1vdCxzdD1QKGksIk1hcCIpO3ZhciBpdD1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFgsbWFwOm5ldyhzdHx8bnQpLHN0cmluZzpuZXcgWH19O3ZhciB1dD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fTt2YXIgYXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10Ll9fZGF0YV9fO3JldHVybiB1dChlKT9yWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOnIubWFwfTt2YXIgaHQ9ZnVuY3Rpb24odCl7dmFyIGU9YXQodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX07dmFyIGx0PWZ1bmN0aW9uKHQpe3JldHVybiBhdCh0aGlzLHQpLmdldCh0KX07dmFyIGN0PWZ1bmN0aW9uKHQpe3JldHVybiBhdCh0aGlzLHQpLmhhcyh0KX07dmFyIGZ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9YXQodGhpcyx0KSxvPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bz8wOjEsdGhpc307ZnVuY3Rpb24gbXQodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBvPXRbZV07dGhpcy5zZXQob1swXSxvWzFdKX19bXQucHJvdG90eXBlLmNsZWFyPWl0LG10LnByb3RvdHlwZS5kZWxldGU9aHQsbXQucHJvdG90eXBlLmdldD1sdCxtdC5wcm90b3R5cGUuaGFzPWN0LG10LnByb3RvdHlwZS5zZXQ9ZnQ7dmFyIGd0PW10O2Z1bmN0aW9uIHB0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBvPWFyZ3VtZW50cyxuPWU/ZS5hcHBseSh0aGlzLG8pOm9bMF0scz1yLmNhY2hlO2lmKHMuaGFzKG4pKXJldHVybiBzLmdldChuKTt2YXIgaT10LmFwcGx5KHRoaXMsbyk7cmV0dXJuIHIuY2FjaGU9cy5zZXQobixpKXx8cyxpfTtyZXR1cm4gci5jYWNoZT1uZXcocHQuQ2FjaGV8fGd0KSxyfXB0LkNhY2hlPWd0O3ZhciB3dD1wdDt2YXIgZHQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csYnQ9L1xcKFxcKT8vZyx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKGR0LChmdW5jdGlvbih0LHIsbyxuKXtlLnB1c2gobz9uLnJlcGxhY2UoYnQsIiQxIik6cnx8dCl9KSksZX0pKTt2YXIgdnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGgsbj1BcnJheShvKTsrK3I8bzspbltyXT1lKHRbcl0scix0KTtyZXR1cm4gbn0sTXQ9dT91LnByb3RvdHlwZTp2b2lkIDAseHQ9TXQ/TXQudG9TdHJpbmc6dm9pZCAwO3ZhciBFdD1mdW5jdGlvbiBlKHIpe2lmKCJzdHJpbmciPT10eXBlb2YgcilyZXR1cm4gcjtpZih0KHIpKXJldHVybiB2dChyLGUpKyIiO2lmKGIocikpcmV0dXJuIHh0P3h0LmNhbGwocik6IiI7dmFyIG89cisiIjtyZXR1cm4iMCI9PW8mJjEvcj09LUluZmluaXR5PyItMCI6b307dmFyIFN0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOkV0KHQpfTt2YXIganQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdChlKT9lOk0oZSxyKT9bZV06eXQoU3QoZSkpfTt2YXIgX3Q9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxiKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1JbmZpbml0eT8iLTAiOmV9O3ZhciBBdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG89KGU9anQoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8bzspdD10W190KGVbcisrXSldO3JldHVybiByJiZyPT1vP3Q6dm9pZCAwfTt2YXIgQ3Q9ZnVuY3Rpb24odCxlLHIpe3ZhciBvPW51bGw9PXQ/dm9pZCAwOkF0KHQsZSk7cmV0dXJuIHZvaWQgMD09PW8/cjpvfSxSdD1PYmplY3QucHJvdG90eXBlO3ZhciBJdD1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8UnQpfTt2YXIga3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQoZShyKSl9fShPYmplY3Qua2V5cyxPYmplY3QpLE50PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIE90PWZ1bmN0aW9uKHQpe2lmKCFJdCh0KSlyZXR1cm4ga3QodCk7dmFyIGU9W107Zm9yKHZhciByIGluIE9iamVjdCh0KSlOdC5jYWxsKHQscikmJiJjb25zdHJ1Y3RvciIhPXImJmUucHVzaChyKTtyZXR1cm4gZX0sRnQ9UChpLCJEYXRhVmlldyIpLHp0PVAoaSwiUHJvbWlzZSIpLFR0PVAoaSwiU2V0IiksVnQ9UChpLCJXZWFrTWFwIiksUHQ9UihGdCkscXQ9UihzdCksJHQ9Uih6dCksRHQ9UihUdCksVXQ9UihWdCksTHQ9dzsoRnQmJiJbb2JqZWN0IERhdGFWaWV3XSIhPUx0KG5ldyBGdChuZXcgQXJyYXlCdWZmZXIoMSkpKXx8c3QmJiJbb2JqZWN0IE1hcF0iIT1MdChuZXcgc3QpfHx6dCYmIltvYmplY3QgUHJvbWlzZV0iIT1MdCh6dC5yZXNvbHZlKCkpfHxUdCYmIltvYmplY3QgU2V0XSIhPUx0KG5ldyBUdCl8fFZ0JiYiW29iamVjdCBXZWFrTWFwXSIhPUx0KG5ldyBWdCkpJiYoTHQ9ZnVuY3Rpb24odCl7dmFyIGU9dyh0KSxyPSJbb2JqZWN0IE9iamVjdF0iPT1lP3QuY29uc3RydWN0b3I6dm9pZCAwLG89cj9SKHIpOiIiO2lmKG8pc3dpdGNoKG8pe2Nhc2UgUHQ6cmV0dXJuIltvYmplY3QgRGF0YVZpZXddIjtjYXNlIHF0OnJldHVybiJbb2JqZWN0IE1hcF0iO2Nhc2UgJHQ6cmV0dXJuIltvYmplY3QgUHJvbWlzZV0iO2Nhc2UgRHQ6cmV0dXJuIltvYmplY3QgU2V0XSI7Y2FzZSBVdDpyZXR1cm4iW29iamVjdCBXZWFrTWFwXSJ9cmV0dXJuIGV9KTt2YXIgQnQ9THQ7dmFyIEd0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD05MDA3MTk5MjU0NzQwOTkxfTt2YXIgS3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJkd0KHQubGVuZ3RoKSYmIVModCl9O3ZhciBXdD1mdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCF0KGUpJiZkKGUpJiYiW29iamVjdCBTdHJpbmddIj09dyhlKX07dmFyIFh0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19LEp0PVh0KCJsZW5ndGgiKSxZdD1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIik7dmFyIFp0PWZ1bmN0aW9uKHQpe3JldHVybiBZdC50ZXN0KHQpfSxIdD0iW1xcdWQ4MDAtXFx1ZGZmZl0iLFF0PSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsdGU9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsZWU9IlteXFx1ZDgwMC1cXHVkZmZmXSIscmU9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLG9lPSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixuZT0iKD86IitRdCsifCIrdGUrIikiKyI/IixzZT0iW1xcdWZlMGVcXHVmZTBmXT8iK25lKygiKD86XFx1MjAwZCg/OiIrW2VlLHJlLG9lXS5qb2luKCJ8IikrIilbXFx1ZmUwZVxcdWZlMGZdPyIrbmUrIikqIiksaWU9Iig/OiIrW2VlK1F0KyI/IixRdCxyZSxvZSxIdF0uam9pbigifCIpKyIpIix1ZT1SZWdFeHAodGUrIig/PSIrdGUrIil8IitpZStzZSwiZyIpO3ZhciBhZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dWUubGFzdEluZGV4PTA7dWUudGVzdCh0KTspKytlO3JldHVybiBlfTt2YXIgaGU9ZnVuY3Rpb24odCl7cmV0dXJuIFp0KHQpP2FlKHQpOkp0KHQpfTt2YXIgbGU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihLdCh0KSlyZXR1cm4gV3QodCk/aGUodCk6dC5sZW5ndGg7dmFyIGU9QnQodCk7cmV0dXJuIltvYmplY3QgTWFwXSI9PWV8fCJbb2JqZWN0IFNldF0iPT1lP3Quc2l6ZTpPdCh0KS5sZW5ndGh9O3ZhciBjZT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fGQodCkmJiJbb2JqZWN0IE51bWJlcl0iPT13KHQpfTt2YXIgZmU9ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10fHwhMT09PXR8fGQodCkmJiJbb2JqZWN0IEJvb2xlYW5dIj09dyh0KX07ZnVuY3Rpb24gbWUodCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBwZSh0KXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4hIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYoZ2UodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISghcGUodCl8fCIiIT09dCl9KHQpfHwhIWZ1bmN0aW9uKHQpe3JldHVybiEhbWUodCkmJjA9PT10Lmxlbmd0aH0odCkpKSl9ZnVuY3Rpb24gZGUodCl7cmV0dXJuISFtZSh0KSYmKDAhPT10Lmxlbmd0aCYmKDEhPT10Lmxlbmd0aHx8IXdlKHRbMF0pKSl9Y29uc3QgYmU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB5ZSh0KXtyZXR1cm4gYmUuY2FsbCh0KS5lbmRzV2l0aCgiQXJyYXldIil9ZnVuY3Rpb24gdmUodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF5ZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7dmFyIHI9ZS5mcm9tSW5kZXgsbz12b2lkIDA9PT1yPzA6cixuPWUudG9JbmRleCxzPXZvaWQgMD09PW4/dC5sZW5ndGg6bjtpZihvPDB8fG8+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihvKSl0aHJvdyBuZXcgRXJyb3IoImZyb21JbmRleCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gbGVuZ3RoIik7aWYoczw9b3x8cz50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocykpdGhyb3cgbmV3IEVycm9yKCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCIpO2Zvcih2YXIgaT10W29dLHU9bysxO3U8czt1KyspdFt1XT5pJiYoaT10W3VdKTtyZXR1cm4gaX1mdW5jdGlvbiBNZSh0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgcj1lLmZyb21JbmRleCxvPXZvaWQgMD09PXI/MDpyLG49ZS50b0luZGV4LHM9dm9pZCAwPT09bj90Lmxlbmd0aDpuO2lmKG88MHx8bz49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG8pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1vfHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciBpPXRbb10sdT1vKzE7dTxzO3UrKyl0W3VdPGkmJihpPXRbdV0pO3JldHVybiBpfWZ1bmN0aW9uIHhlKHQpe3ZhciBlLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF5ZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7aWYodm9pZCAwIT09ci5vdXRwdXQpe2lmKCF5ZShyLm91dHB1dCkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZCIpO2U9ci5vdXRwdXR9ZWxzZSBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7dmFyIG89TWUodCksbj12ZSh0KTtpZihvPT09bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluaW11bSBhbmQgbWF4aW11bSBpbnB1dCB2YWx1ZXMgYXJlIGVxdWFsLiBDYW5ub3QgcmVzY2FsZSBhIGNvbnN0YW50IGFycmF5Iik7dmFyIHM9ci5taW4saT12b2lkIDA9PT1zP3IuYXV0b01pbk1heD9vOjA6cyx1PXIubWF4LGE9dm9pZCAwPT09dT9yLmF1dG9NaW5NYXg/bjoxOnU7aWYoaT49YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG9wdGlvbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXggb3B0aW9uIik7Zm9yKHZhciBoPShhLWkpLyhuLW8pLGw9MDtsPHQubGVuZ3RoO2wrKyllW2xdPSh0W2xdLW8pKmgraTtyZXR1cm4gZX1jb25zdCBFZT0iICIucmVwZWF0KDIpLFNlPSIgIi5yZXBlYXQoNCk7ZnVuY3Rpb24gamUodCxlPXt9KXtjb25zdHttYXhSb3dzOnI9MTUsbWF4Q29sdW1uczpvPTEwLG1heE51bVNpemU6bj04fT1lO3JldHVybmAke3QuY29uc3RydWN0b3IubmFtZX0ge1xuJHtFZX1bXG4ke1NlfSR7ZnVuY3Rpb24odCxlLHIsbyl7Y29uc3R7cm93czpuLGNvbHVtbnM6c309dCxpPU1hdGgubWluKG4sZSksdT1NYXRoLm1pbihzLHIpLGE9W107Zm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IHI9W107Zm9yKGxldCBuPTA7bjx1O24rKylyLnB1c2goX2UodC5nZXQoZSxuKSxvKSk7YS5wdXNoKGAke3Iuam9pbigiICIpfWApfXUhPT1zJiYoYVthLmxlbmd0aC0xXSs9YCAuLi4gJHtzLXJ9IG1vcmUgY29sdW1uc2ApO2khPT1uJiZhLnB1c2goYC4uLiAke24tZX0gbW9yZSByb3dzYCk7cmV0dXJuIGEuam9pbihgXG4ke1NlfWApfSh0LHIsbyxuKX1cbiR7RWV9XVxuJHtFZX1yb3dzOiAke3Qucm93c31cbiR7RWV9Y29sdW1uczogJHt0LmNvbHVtbnN9XG59YH1mdW5jdGlvbiBfZSh0LGUpe2NvbnN0IHI9U3RyaW5nKHQpO2lmKHIubGVuZ3RoPD1lKXJldHVybiByLnBhZEVuZChlLCIgIik7Y29uc3Qgbz10LnRvUHJlY2lzaW9uKGUtMik7aWYoby5sZW5ndGg8PWUpcmV0dXJuIG87Y29uc3Qgbj10LnRvRXhwb25lbnRpYWwoZS0yKSxzPW4uaW5kZXhPZigiZSIpLGk9bi5zbGljZShzKTtyZXR1cm4gbi5zbGljZSgwLGUtaS5sZW5ndGgpK2l9ZnVuY3Rpb24gQWUodCxlLHIpe2xldCBvPXI/dC5yb3dzOnQucm93cy0xO2lmKGU8MHx8ZT5vKXRocm93IG5ldyBSYW5nZUVycm9yKCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gQ2UodCxlLHIpe2xldCBvPXI/dC5jb2x1bW5zOnQuY29sdW1ucy0xO2lmKGU8MHx8ZT5vKXRocm93IG5ldyBSYW5nZUVycm9yKCJDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUmUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIik7cmV0dXJuIGV9ZnVuY3Rpb24gSWUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzIik7cmV0dXJuIGV9ZnVuY3Rpb24ga2UodCxlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigidW5leHBlY3RlZCB0eXBlIGZvciByb3cgaW5kaWNlcyIpO2lmKGUuc29tZSgoZT0+ZTwwfHxlPj10LnJvd3MpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicm93IGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpO3JldHVybiBBcnJheS5pc0FycmF5KGUpfHwoZT1BcnJheS5mcm9tKGUpKSxlfWZ1bmN0aW9uIE5lKHQsZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoInVuZXhwZWN0ZWQgdHlwZSBmb3IgY29sdW1uIGluZGljZXMiKTtpZihlLnNvbWUoKGU9PmU8MHx8ZT49dC5jb2x1bW5zKSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImNvbHVtbiBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKTtyZXR1cm4gQXJyYXkuaXNBcnJheShlKXx8KGU9QXJyYXkuZnJvbShlKSksZX1mdW5jdGlvbiBPZSh0LGUscixvLG4pe2lmKDUhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJleHBlY3RlZCA0IGFyZ3VtZW50cyIpO2lmKHplKCJzdGFydFJvdyIsZSksemUoImVuZFJvdyIsciksemUoInN0YXJ0Q29sdW1uIixvKSx6ZSgiZW5kQ29sdW1uIixuKSxlPnJ8fG8+bnx8ZTwwfHxlPj10LnJvd3N8fHI8MHx8cj49dC5yb3dzfHxvPDB8fG8+PXQuY29sdW1uc3x8bjwwfHxuPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlN1Ym1hdHJpeCBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBGZSh0LGU9MCl7bGV0IHI9W107Zm9yKGxldCBvPTA7bzx0O28rKylyLnB1c2goZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gemUodCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0fSBtdXN0IGJlIGEgbnVtYmVyYCl9ZnVuY3Rpb24gVGUodCl7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJFbXB0eSBtYXRyaXggaGFzIG5vIGVsZW1lbnRzIHRvIGluZGV4Iil9Y2xhc3MgVmV7c3RhdGljIGZyb20xREFycmF5KHQsZSxyKXtpZih0KmUhPT1yLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZGF0YSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggZ2l2ZW4gZGltZW5zaW9ucyIpO2xldCBvPW5ldyBxZSh0LGUpO2ZvcihsZXQgbj0wO248dDtuKyspZm9yKGxldCB0PTA7dDxlO3QrKylvLnNldChuLHQscltuKmUrdF0pO3JldHVybiBvfXN0YXRpYyByb3dWZWN0b3IodCl7bGV0IGU9bmV3IHFlKDEsdC5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWUuc2V0KDAscix0W3JdKTtyZXR1cm4gZX1zdGF0aWMgY29sdW1uVmVjdG9yKHQpe2xldCBlPW5ldyBxZSh0Lmxlbmd0aCwxKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldChyLDAsdFtyXSk7cmV0dXJuIGV9c3RhdGljIHplcm9zKHQsZSl7cmV0dXJuIG5ldyBxZSh0LGUpfXN0YXRpYyBvbmVzKHQsZSl7cmV0dXJuIG5ldyBxZSh0LGUpLmZpbGwoMSl9c3RhdGljIHJhbmQodCxlLHI9e30pe2lmKCJvYmplY3QiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cmFuZG9tOm89TWF0aC5yYW5kb219PXI7bGV0IG49bmV3IHFlKHQsZSk7Zm9yKGxldCByPTA7cjx0O3IrKylmb3IobGV0IHQ9MDt0PGU7dCsrKW4uc2V0KHIsdCxvKCkpO3JldHVybiBufXN0YXRpYyByYW5kSW50KHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjpvPTAsbWF4Om49MWUzLHJhbmRvbTpzPU1hdGgucmFuZG9tfT1yO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGFuIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYobz49bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBpPW4tbyx1PW5ldyBxZSh0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bytNYXRoLnJvdW5kKHMoKSppKTt1LnNldChyLHQsZSl9cmV0dXJuIHV9c3RhdGljIGV5ZSh0LGUscil7dm9pZCAwPT09ZSYmKGU9dCksdm9pZCAwPT09ciYmKHI9MSk7bGV0IG89TWF0aC5taW4odCxlKSxuPXRoaXMuemVyb3ModCxlKTtmb3IobGV0IHQ9MDt0PG87dCsrKW4uc2V0KHQsdCxyKTtyZXR1cm4gbn1zdGF0aWMgZGlhZyh0LGUscil7bGV0IG89dC5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9byksdm9pZCAwPT09ciYmKHI9ZSk7bGV0IG49TWF0aC5taW4obyxlLHIpLHM9dGhpcy56ZXJvcyhlLHIpO2ZvcihsZXQgZT0wO2U8bjtlKyspcy5zZXQoZSxlLHRbZV0pO3JldHVybiBzfXN0YXRpYyBtaW4odCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxvPXQuY29sdW1ucyxuPW5ldyBxZShyLG8pO2ZvcihsZXQgcz0wO3M8cjtzKyspZm9yKGxldCByPTA7cjxvO3IrKyluLnNldChzLHIsTWF0aC5taW4odC5nZXQocyxyKSxlLmdldChzLHIpKSk7cmV0dXJuIG59c3RhdGljIG1heCh0LGUpe3Q9dGhpcy5jaGVja01hdHJpeCh0KSxlPXRoaXMuY2hlY2tNYXRyaXgoZSk7bGV0IHI9dC5yb3dzLG89dC5jb2x1bW5zLG49bmV3IHRoaXMocixvKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bztyKyspbi5zZXQocyxyLE1hdGgubWF4KHQuZ2V0KHMsciksZS5nZXQocyxyKSkpO3JldHVybiBufXN0YXRpYyBjaGVja01hdHJpeCh0KXtyZXR1cm4gVmUuaXNNYXRyaXgodCk/dDpuZXcgcWUodCl9c3RhdGljIGlzTWF0cml4KHQpe3JldHVybiBudWxsIT10JiYiTWF0cml4Ij09PXQua2xhc3N9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5yb3dzKnRoaXMuY29sdW1uc31hcHBseSh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuY2FsbCh0aGlzLGUscik7cmV0dXJuIHRoaXN9dG8xREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnB1c2godGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9dG8yREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXt0LnB1c2goW10pO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0W2VdLnB1c2godGhpcy5nZXQoZSxyKSl9cmV0dXJuIHR9dG9KU09OKCl7cmV0dXJuIHRoaXMudG8yREFycmF5KCl9aXNSb3dWZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMucm93c31pc0NvbHVtblZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5jb2x1bW5zfWlzVmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N8fDE9PT10aGlzLmNvbHVtbnN9aXNTcXVhcmUoKXtyZXR1cm4gdGhpcy5yb3dzPT09dGhpcy5jb2x1bW5zfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMucm93c3x8MD09PXRoaXMuY29sdW1uc31pc1N5bW1ldHJpYygpe2lmKHRoaXMuaXNTcXVhcmUoKSl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8PXQ7ZSsrKWlmKHRoaXMuZ2V0KHQsZSkhPT10aGlzLmdldChlLHQpKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWlzRWNoZWxvbkZvcm0oKXtsZXQgdD0wLGU9MCxyPS0xLG89ITAsbj0hMTtmb3IoO3Q8dGhpcy5yb3dzJiZvOyl7Zm9yKGU9MCxuPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PW47KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5yPyhuPSEwLHI9ZSk6KG89ITEsbj0hMCk7dCsrfXJldHVybiBvfWlzUmVkdWNlZEVjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAscj0tMSxvPSEwLG49ITE7Zm9yKDt0PHRoaXMucm93cyYmbzspe2ZvcihlPTAsbj0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1uOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+cj8obj0hMCxyPWUpOihvPSExLG49ITApO2ZvcihsZXQgcj1lKzE7cjx0aGlzLnJvd3M7cisrKTAhPT10aGlzLmdldCh0LHIpJiYobz0hMSk7dCsrfXJldHVybiBvfWVjaGVsb25Gb3JtKCl7bGV0IHQ9dGhpcy5jbG9uZSgpLGU9MCxyPTA7Zm9yKDtlPHQucm93cyYmcjx0LmNvbHVtbnM7KXtsZXQgbz1lO2ZvcihsZXQgbj1lO248dC5yb3dzO24rKyl0LmdldChuLHIpPnQuZ2V0KG8scikmJihvPW4pO2lmKDA9PT10LmdldChvLHIpKXIrKztlbHNle3Quc3dhcFJvd3MoZSxvKTtsZXQgbj10LmdldChlLHIpO2ZvcihsZXQgbz1yO288dC5jb2x1bW5zO28rKyl0LnNldChlLG8sdC5nZXQoZSxvKS9uKTtmb3IobGV0IG89ZSsxO288dC5yb3dzO28rKyl7bGV0IG49dC5nZXQobyxyKS90LmdldChlLHIpO3Quc2V0KG8sciwwKTtmb3IobGV0IHM9cisxO3M8dC5jb2x1bW5zO3MrKyl0LnNldChvLHMsdC5nZXQobyxzKS10LmdldChlLHMpKm4pfWUrKyxyKyt9fXJldHVybiB0fXJlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuZWNoZWxvbkZvcm0oKSxlPXQuY29sdW1ucyxyPXQucm93cyxvPXItMTtmb3IoO28+PTA7KWlmKDA9PT10Lm1heFJvdyhvKSlvLS07ZWxzZXtsZXQgbj0wLHM9ITE7Zm9yKDtuPHImJiExPT09czspMT09PXQuZ2V0KG8sbik/cz0hMDpuKys7Zm9yKGxldCByPTA7cjxvO3IrKyl7bGV0IHM9dC5nZXQocixuKTtmb3IobGV0IGk9bjtpPGU7aSsrKXtsZXQgZT10LmdldChyLGkpLXMqdC5nZXQobyxpKTt0LnNldChyLGksZSl9fW8tLX1yZXR1cm4gdH1zZXQoKXt0aHJvdyBuZXcgRXJyb3IoInNldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfWdldCgpe3Rocm93IG5ldyBFcnJvcigiZ2V0IG1ldGhvZCBpcyB1bmltcGxlbWVudGVkIil9cmVwZWF0KHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cm93czplPTEsY29sdW1uczpyPTF9PXQ7aWYoIU51bWJlci5pc0ludGVnZXIoZSl8fGU8PTApdGhyb3cgbmV3IFR5cGVFcnJvcigicm93cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHIpfHxyPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoImNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtsZXQgbz1uZXcgcWUodGhpcy5yb3dzKmUsdGhpcy5jb2x1bW5zKnIpO2ZvcihsZXQgdD0wO3Q8ZTt0KyspZm9yKGxldCBlPTA7ZTxyO2UrKylvLnNldFN1Yk1hdHJpeCh0aGlzLHRoaXMucm93cyp0LHRoaXMuY29sdW1ucyplKTtyZXR1cm4gb31maWxsKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHQpO3JldHVybiB0aGlzfW5lZygpe3JldHVybiB0aGlzLm11bFMoLTEpfWdldFJvdyh0KXtBZSh0aGlzLHQpO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyllLnB1c2godGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9Z2V0Um93VmVjdG9yKHQpe3JldHVybiBxZS5yb3dWZWN0b3IodGhpcy5nZXRSb3codCkpfXNldFJvdyh0LGUpe0FlKHRoaXMsdCksZT1SZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldCh0LHIsZVtyXSk7cmV0dXJuIHRoaXN9c3dhcFJvd3ModCxlKXtBZSh0aGlzLHQpLEFlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXtsZXQgbz10aGlzLmdldCh0LHIpO3RoaXMuc2V0KHQscix0aGlzLmdldChlLHIpKSx0aGlzLnNldChlLHIsbyl9cmV0dXJuIHRoaXN9Z2V0Q29sdW1uKHQpe0NlKHRoaXMsdCk7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWUucHVzaCh0aGlzLmdldChyLHQpKTtyZXR1cm4gZX1nZXRDb2x1bW5WZWN0b3IodCl7cmV0dXJuIHFlLmNvbHVtblZlY3Rvcih0aGlzLmdldENvbHVtbih0KSl9c2V0Q29sdW1uKHQsZSl7Q2UodGhpcyx0KSxlPUllKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXRoaXMuc2V0KHIsdCxlW3JdKTtyZXR1cm4gdGhpc31zd2FwQ29sdW1ucyh0LGUpe0NlKHRoaXMsdCksQ2UodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspe2xldCBvPXRoaXMuZ2V0KHIsdCk7dGhpcy5zZXQocix0LHRoaXMuZ2V0KHIsZSkpLHRoaXMuc2V0KHIsZSxvKX1yZXR1cm4gdGhpc31hZGRSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdFtyXSk7cmV0dXJuIHRoaXN9c3ViUm93VmVjdG9yKHQpe3Q9UmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXRbcl0pO3JldHVybiB0aGlzfW11bFJvd1ZlY3Rvcih0KXt0PVJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0W3JdKTtyZXR1cm4gdGhpc31kaXZSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdFtyXSk7cmV0dXJuIHRoaXN9YWRkQ29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3RbZV0pO3JldHVybiB0aGlzfXN1YkNvbHVtblZlY3Rvcih0KXt0PUllKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10W2VdKTtyZXR1cm4gdGhpc31tdWxDb2x1bW5WZWN0b3IodCl7dD1JZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdFtlXSk7cmV0dXJuIHRoaXN9ZGl2Q29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3RbZV0pO3JldHVybiB0aGlzfW11bFJvdyh0LGUpe0FlKHRoaXMsdCk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KHQscix0aGlzLmdldCh0LHIpKmUpO3JldHVybiB0aGlzfW11bENvbHVtbih0LGUpe0NlKHRoaXMsdCk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXRoaXMuc2V0KHIsdCx0aGlzLmdldChyLHQpKmUpO3JldHVybiB0aGlzfW1heCgpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IHQ9dGhpcy5nZXQoMCwwKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dCYmKHQ9dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9bWF4SW5kZXgoKXtUZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgbz0wO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldChyLG8pPnQmJih0PXRoaXMuZ2V0KHIsbyksZVswXT1yLGVbMV09byk7cmV0dXJuIGV9bWluKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKTx0JiYodD10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1taW5JbmRleCgpe1RlKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBvPTA7bzx0aGlzLmNvbHVtbnM7bysrKXRoaXMuZ2V0KHIsbyk8dCYmKHQ9dGhpcy5nZXQocixvKSxlWzBdPXIsZVsxXT1vKTtyZXR1cm4gZX1tYXhSb3codCl7aWYoQWUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik+ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWF4Um93SW5kZXgodCl7QWUodGhpcyx0KSxUZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBvPTE7bzx0aGlzLmNvbHVtbnM7bysrKXRoaXMuZ2V0KHQsbyk+ZSYmKGU9dGhpcy5nZXQodCxvKSxyWzFdPW8pO3JldHVybiByfW1pblJvdyh0KXtpZihBZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IHI9MTtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQodCxyKTxlJiYoZT10aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1taW5Sb3dJbmRleCh0KXtBZSh0aGlzLHQpLFRlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KHQsMCkscj1bdCwwXTtmb3IobGV0IG89MTtvPHRoaXMuY29sdW1ucztvKyspdGhpcy5nZXQodCxvKTxlJiYoZT10aGlzLmdldCh0LG8pLHJbMV09byk7cmV0dXJuIHJ9bWF4Q29sdW1uKHQpe2lmKENlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPmUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1heENvbHVtbkluZGV4KHQpe0NlKHRoaXMsdCksVGUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgbz0xO288dGhpcy5yb3dzO28rKyl0aGlzLmdldChvLHQpPmUmJihlPXRoaXMuZ2V0KG8sdCksclswXT1vKTtyZXR1cm4gcn1taW5Db2x1bW4odCl7aWYoQ2UodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCByPTE7cjx0aGlzLnJvd3M7cisrKXRoaXMuZ2V0KHIsdCk8ZSYmKGU9dGhpcy5nZXQocix0KSk7cmV0dXJuIGV9bWluQ29sdW1uSW5kZXgodCl7Q2UodGhpcyx0KSxUZSh0aGlzKTtsZXQgZT10aGlzLmdldCgwLHQpLHI9WzAsdF07Zm9yKGxldCBvPTE7bzx0aGlzLnJvd3M7bysrKXRoaXMuZ2V0KG8sdCk8ZSYmKGU9dGhpcy5nZXQobyx0KSxyWzBdPW8pO3JldHVybiByfWRpYWcoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMuZ2V0KHIscikpO3JldHVybiBlfW5vcm0odD0iZnJvYmVuaXVzIil7bGV0IGU9MDtpZigibWF4Ij09PXQpcmV0dXJuIHRoaXMubWF4KCk7aWYoImZyb2Jlbml1cyI9PT10KXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKWUrPXRoaXMuZ2V0KHQscikqdGhpcy5nZXQodCxyKTtyZXR1cm4gTWF0aC5zcXJ0KGUpfXRocm93IG5ldyBSYW5nZUVycm9yKGB1bmtub3duIG5vcm0gdHlwZTogJHt0fWApfWN1bXVsYXRpdmVTdW0oKXtsZXQgdD0wO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdCs9dGhpcy5nZXQoZSxyKSx0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9ZG90KHQpe1ZlLmlzTWF0cml4KHQpJiYodD10LnRvMURBcnJheSgpKTtsZXQgZT10aGlzLnRvMURBcnJheSgpO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvcnMgZG8gbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSIpO2xldCByPTA7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspcis9ZVtvXSp0W29dO3JldHVybiByfW1tdWwodCl7dD1xZS5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMsbz10LmNvbHVtbnMsbj1uZXcgcWUoZSxvKSxzPW5ldyBGbG9hdDY0QXJyYXkocik7Zm9yKGxldCBpPTA7aTxvO2krKyl7Zm9yKGxldCBlPTA7ZTxyO2UrKylzW2VdPXQuZ2V0KGUsaSk7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9MDtmb3IobGV0IG89MDtvPHI7bysrKWUrPXRoaXMuZ2V0KHQsbykqc1tvXTtuLnNldCh0LGksZSl9fXJldHVybiBufXN0cmFzc2VuMngyKHQpe3Q9cWUuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IHFlKDIsMik7Y29uc3Qgcj10aGlzLmdldCgwLDApLG89dC5nZXQoMCwwKSxuPXRoaXMuZ2V0KDAsMSkscz10LmdldCgwLDEpLGk9dGhpcy5nZXQoMSwwKSx1PXQuZ2V0KDEsMCksYT10aGlzLmdldCgxLDEpLGg9dC5nZXQoMSwxKSxsPShyK2EpKihvK2gpLGM9KGkrYSkqbyxmPXIqKHMtaCksbT1hKih1LW8pLGc9KHIrbikqaCxwPWwrbS1nKyhuLWEpKih1K2gpLHc9ZitnLGQ9YyttLGI9bC1jK2YrKGktcikqKG8rcyk7cmV0dXJuIGUuc2V0KDAsMCxwKSxlLnNldCgwLDEsdyksZS5zZXQoMSwwLGQpLGUuc2V0KDEsMSxiKSxlfXN0cmFzc2VuM3gzKHQpe3Q9cWUuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IHFlKDMsMyk7Y29uc3Qgcj10aGlzLmdldCgwLDApLG89dGhpcy5nZXQoMCwxKSxuPXRoaXMuZ2V0KDAsMikscz10aGlzLmdldCgxLDApLGk9dGhpcy5nZXQoMSwxKSx1PXRoaXMuZ2V0KDEsMiksYT10aGlzLmdldCgyLDApLGg9dGhpcy5nZXQoMiwxKSxsPXRoaXMuZ2V0KDIsMiksYz10LmdldCgwLDApLGY9dC5nZXQoMCwxKSxtPXQuZ2V0KDAsMiksZz10LmdldCgxLDApLHA9dC5nZXQoMSwxKSx3PXQuZ2V0KDEsMiksZD10LmdldCgyLDApLGI9dC5nZXQoMiwxKSx5PXQuZ2V0KDIsMiksdj0oci1zKSooLWYrcCksTT0oLXIrcytpKSooYy1mK3ApLHg9KHMraSkqKC1jK2YpLEU9cipjLFM9KC1yK2EraCkqKGMtbSt3KSxqPSgtcithKSoobS13KSxfPShhK2gpKigtYyttKSxBPSgtbitoK2wpKihwK2QtYiksQz0obi1sKSoocC1iKSxSPW4qZCxJPShoK2wpKigtZCtiKSxrPSgtbitpK3UpKih3K2QteSksTj0obi11KSoody15KSxPPShpK3UpKigtZCt5KSxGPUUrUitvKmcsej0ocitvK24tcy1pLWgtbCkqcCtNK3grRStBK1IrSSxUPUUrUytfKyhyK28rbi1pLXUtYS1oKSp3K1IraytPLFY9ditpKigtYytmK2ctcC13LWQreSkrTStFK1IraytOLFA9ditNK3grRSt1KmIscT1SK2srTitPK3MqbSwkPUUrUytqK2gqKC1jK20rZy1wLXctZCtiKStBK0MrUixEPUErQytSK0krYSpmLFU9RStTK2orXytsKnk7cmV0dXJuIGUuc2V0KDAsMCxGKSxlLnNldCgwLDEseiksZS5zZXQoMCwyLFQpLGUuc2V0KDEsMCxWKSxlLnNldCgxLDEsUCksZS5zZXQoMSwyLHEpLGUuc2V0KDIsMCwkKSxlLnNldCgyLDEsRCksZS5zZXQoMiwyLFUpLGV9bW11bFN0cmFzc2VuKHQpe3Q9cWUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5jbG9uZSgpLHI9ZS5yb3dzLG89ZS5jb2x1bW5zLG49dC5yb3dzLHM9dC5jb2x1bW5zO2Z1bmN0aW9uIGkodCxlLHIpe2xldCBvPXQucm93cyxuPXQuY29sdW1ucztpZihvPT09ZSYmbj09PXIpcmV0dXJuIHQ7e2xldCBvPVZlLnplcm9zKGUscik7cmV0dXJuIG89by5zZXRTdWJNYXRyaXgodCwwLDApLG99fW8hPT1uJiZjb25zb2xlLndhcm4oYE11bHRpcGx5aW5nICR7cn0geCAke299IGFuZCAke259IHggJHtzfSBtYXRyaXg6IGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoLmApO2xldCB1PU1hdGgubWF4KHIsbiksYT1NYXRoLm1heChvLHMpO3JldHVybiBlPWkoZSx1LGEpLGZ1bmN0aW9uIHQoZSxyLG8sbil7aWYobzw9NTEyfHxuPD01MTIpcmV0dXJuIGUubW11bChyKTtvJTI9PTEmJm4lMj09MT8oZT1pKGUsbysxLG4rMSkscj1pKHIsbysxLG4rMSkpOm8lMj09MT8oZT1pKGUsbysxLG4pLHI9aShyLG8rMSxuKSk6biUyPT0xJiYoZT1pKGUsbyxuKzEpLHI9aShyLG8sbisxKSk7bGV0IHM9cGFyc2VJbnQoZS5yb3dzLzIsMTApLHU9cGFyc2VJbnQoZS5jb2x1bW5zLzIsMTApLGE9ZS5zdWJNYXRyaXgoMCxzLTEsMCx1LTEpLGg9ci5zdWJNYXRyaXgoMCxzLTEsMCx1LTEpLGw9ZS5zdWJNYXRyaXgoMCxzLTEsdSxlLmNvbHVtbnMtMSksYz1yLnN1Yk1hdHJpeCgwLHMtMSx1LHIuY29sdW1ucy0xKSxmPWUuc3ViTWF0cml4KHMsZS5yb3dzLTEsMCx1LTEpLG09ci5zdWJNYXRyaXgocyxyLnJvd3MtMSwwLHUtMSksZz1lLnN1Yk1hdHJpeChzLGUucm93cy0xLHUsZS5jb2x1bW5zLTEpLHA9ci5zdWJNYXRyaXgocyxyLnJvd3MtMSx1LHIuY29sdW1ucy0xKSx3PXQoVmUuYWRkKGEsZyksVmUuYWRkKGgscCkscyx1KSxkPXQoVmUuYWRkKGYsZyksaCxzLHUpLGI9dChhLFZlLnN1YihjLHApLHMsdSkseT10KGcsVmUuc3ViKG0saCkscyx1KSx2PXQoVmUuYWRkKGEsbCkscCxzLHUpLE09dChWZS5zdWIoZixhKSxWZS5hZGQoaCxjKSxzLHUpLHg9dChWZS5zdWIobCxnKSxWZS5hZGQobSxwKSxzLHUpLEU9VmUuYWRkKHcseSk7RS5zdWIodiksRS5hZGQoeCk7bGV0IFM9VmUuYWRkKGIsdiksaj1WZS5hZGQoZCx5KSxfPVZlLnN1Yih3LGQpO18uYWRkKGIpLF8uYWRkKE0pO2xldCBBPVZlLnplcm9zKDIqRS5yb3dzLDIqRS5jb2x1bW5zKTtyZXR1cm4gQT1BLnNldFN1Yk1hdHJpeChFLDAsMCksQT1BLnNldFN1Yk1hdHJpeChTLEUucm93cywwKSxBPUEuc2V0U3ViTWF0cml4KGosMCxFLmNvbHVtbnMpLEE9QS5zZXRTdWJNYXRyaXgoXyxFLnJvd3MsRS5jb2x1bW5zKSxBLnN1Yk1hdHJpeCgwLG8tMSwwLG4tMSl9KGUsdD1pKHQsdSxhKSx1LGEpfXNjYWxlUm93cyh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjplPTAsbWF4OnI9MX09dDtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIU51bWJlci5pc0Zpbml0ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhIG51bWJlciIpO2lmKGU+PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgbz1uZXcgcWUodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKXtjb25zdCBuPXRoaXMuZ2V0Um93KHQpO24ubGVuZ3RoPjAmJnhlKG4se21pbjplLG1heDpyLG91dHB1dDpufSksby5zZXRSb3codCxuKX1yZXR1cm4gb31zY2FsZUNvbHVtbnModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG89bmV3IHFlKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyl7Y29uc3Qgbj10aGlzLmdldENvbHVtbih0KTtuLmxlbmd0aCYmeGUobix7bWluOmUsbWF4OnIsb3V0cHV0Om59KSxvLnNldENvbHVtbih0LG4pfXJldHVybiBvfWZsaXBSb3dzKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5jb2x1bW5zLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChlLHIpLG89dGhpcy5nZXQoZSx0aGlzLmNvbHVtbnMtMS1yKTt0aGlzLnNldChlLHIsbyksdGhpcy5zZXQoZSx0aGlzLmNvbHVtbnMtMS1yLHQpfXJldHVybiB0aGlzfWZsaXBDb2x1bW5zKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5yb3dzLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChyLGUpLG89dGhpcy5nZXQodGhpcy5yb3dzLTEtcixlKTt0aGlzLnNldChyLGUsbyksdGhpcy5zZXQodGhpcy5yb3dzLTEtcixlLHQpfXJldHVybiB0aGlzfWtyb25lY2tlclByb2R1Y3QodCl7dD1xZS5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMsbz10LnJvd3Msbj10LmNvbHVtbnMscz1uZXcgcWUoZSpvLHIqbik7Zm9yKGxldCBpPTA7aTxlO2krKylmb3IobGV0IGU9MDtlPHI7ZSsrKWZvcihsZXQgcj0wO3I8bztyKyspZm9yKGxldCB1PTA7dTxuO3UrKylzLnNldChvKmkrcixuKmUrdSx0aGlzLmdldChpLGUpKnQuZ2V0KHIsdSkpO3JldHVybiBzfWtyb25lY2tlclN1bSh0KXtpZih0PXFlLmNoZWNrTWF0cml4KHQpLCF0aGlzLmlzU3F1YXJlKCl8fCF0LmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJLcm9uZWNrZXIgU3VtIG5lZWRzIHR3byBTcXVhcmUgTWF0cmljZXMiKTtsZXQgZT10aGlzLnJvd3Mscj10LnJvd3Msbz10aGlzLmtyb25lY2tlclByb2R1Y3QocWUuZXllKHIscikpLG49cWUuZXllKGUsZSkua3JvbmVja2VyUHJvZHVjdCh0KTtyZXR1cm4gby5hZGQobil9dHJhbnNwb3NlKCl7bGV0IHQ9bmV3IHFlKHRoaXMuY29sdW1ucyx0aGlzLnJvd3MpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQocixlLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXNvcnRSb3dzKHQ9UGUpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl0aGlzLnNldFJvdyhlLHRoaXMuZ2V0Um93KGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXNvcnRDb2x1bW5zKHQ9UGUpe2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldENvbHVtbihlLHRoaXMuZ2V0Q29sdW1uKGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXN1Yk1hdHJpeCh0LGUscixvKXtPZSh0aGlzLHQsZSxyLG8pO2xldCBuPW5ldyBxZShlLXQrMSxvLXIrMSk7Zm9yKGxldCBzPXQ7czw9ZTtzKyspZm9yKGxldCBlPXI7ZTw9bztlKyspbi5zZXQocy10LGUtcix0aGlzLmdldChzLGUpKTtyZXR1cm4gbn1zdWJNYXRyaXhSb3codCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMuY29sdW1ucy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5jb2x1bW5zfHxyPDB8fHI+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG89bmV3IHFlKHQubGVuZ3RoLHItZSsxKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylmb3IobGV0IHM9ZTtzPD1yO3MrKyl7aWYodFtuXTwwfHx0W25dPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFJvdyBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtuXX1gKTtvLnNldChuLHMtZSx0aGlzLmdldCh0W25dLHMpKX1yZXR1cm4gb31zdWJNYXRyaXhDb2x1bW4odCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMucm93cy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5yb3dzfHxyPDB8fHI+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG89bmV3IHFlKHItZSsxLHQubGVuZ3RoKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylmb3IobGV0IHM9ZTtzPD1yO3MrKyl7aWYodFtuXTwwfHx0W25dPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtuXX1gKTtvLnNldChzLWUsbix0aGlzLmdldChzLHRbbl0pKX1yZXR1cm4gb31zZXRTdWJNYXRyaXgodCxlLHIpe2lmKCh0PXFlLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7T2UodGhpcyxlLGUrdC5yb3dzLTEscixyK3QuY29sdW1ucy0xKTtmb3IobGV0IG89MDtvPHQucm93cztvKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXRoaXMuc2V0KGUrbyxyK24sdC5nZXQobyxuKSk7cmV0dXJuIHRoaXN9c2VsZWN0aW9uKHQsZSl7bGV0IHI9ZnVuY3Rpb24odCxlLHIpe3JldHVybntyb3c6a2UodCxlKSxjb2x1bW46TmUodCxyKX19KHRoaXMsdCxlKSxvPW5ldyBxZSh0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCB0PTA7dDxyLnJvdy5sZW5ndGg7dCsrKXtsZXQgZT1yLnJvd1t0XTtmb3IobGV0IG49MDtuPHIuY29sdW1uLmxlbmd0aDtuKyspe2xldCBzPXIuY29sdW1uW25dO28uc2V0KHQsbix0aGlzLmdldChlLHMpKX19cmV0dXJuIG99dHJhY2UoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPTA7Zm9yKGxldCByPTA7cjx0O3IrKyllKz10aGlzLmdldChyLHIpO3JldHVybiBlfWNsb25lKCl7bGV0IHQ9bmV3IHFlKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQoZSxyLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXN1bSh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1GZSh0LnJvd3MpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtyXSs9dC5nZXQocixvKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSJjb2x1bW4iOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1GZSh0LmNvbHVtbnMpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtvXSs9dC5nZXQocixvKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTA7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyllKz10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19cHJvZHVjdCh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1GZSh0LnJvd3MsMSk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbz0wO288dC5jb2x1bW5zOysrbyllW3JdKj10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPUZlKHQuY29sdW1ucywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7KytvKWVbb10qPXQuZ2V0KHIsbyk7cmV0dXJuIGV9KHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT0xO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspZSo9dC5nZXQocixvKTtyZXR1cm4gZX0odGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fW1lYW4odCl7Y29uc3QgZT10aGlzLnN1bSh0KTtzd2l0Y2godCl7Y2FzZSJyb3ciOmZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyllW3RdLz10aGlzLmNvbHVtbnM7cmV0dXJuIGU7Y2FzZSJjb2x1bW4iOmZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyllW3RdLz10aGlzLnJvd3M7cmV0dXJuIGU7Y2FzZSB2b2lkIDA6cmV0dXJuIGUvdGhpcy5zaXplO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX12YXJpYW5jZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHt1bmJpYXNlZDpyPSEwLG1lYW46bz10aGlzLm1lYW4odCl9PWU7aWYoImJvb2xlYW4iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmJpYXNlZCBtdXN0IGJlIGEgYm9vbGVhbiIpO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIUFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBvPXQucm93cyxuPXQuY29sdW1ucyxzPVtdO2ZvcihsZXQgaT0wO2k8bztpKyspe2xldCBvPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG47ZSsrKWE9dC5nZXQoaSxlKS1yW2ldLG8rPWEsdSs9YSphO2U/cy5wdXNoKCh1LW8qby9uKS8obi0xKSk6cy5wdXNoKCh1LW8qby9uKS9uKX1yZXR1cm4gc30odGhpcyxyLG8pO2Nhc2UiY29sdW1uIjppZighQXJyYXkuaXNBcnJheShvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtZWFuIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2NvbnN0IG89dC5yb3dzLG49dC5jb2x1bW5zLHM9W107Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IG49MCx1PTAsYT0wO2ZvcihsZXQgZT0wO2U8bztlKyspYT10LmdldChlLGkpLXJbaV0sbis9YSx1Kz1hKmE7ZT9zLnB1c2goKHUtbipuL28pLyhvLTEpKTpzLnB1c2goKHUtbipuL28pL28pfXJldHVybiBzfSh0aGlzLHIsbyk7Y2FzZSB2b2lkIDA6aWYoIm51bWJlciIhPXR5cGVvZiBvKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbz10LnJvd3Msbj10LmNvbHVtbnMscz1vKm47bGV0IGk9MCx1PTAsYT0wO2ZvcihsZXQgZT0wO2U8bztlKyspZm9yKGxldCBvPTA7bzxuO28rKylhPXQuZ2V0KGUsbyktcixpKz1hLHUrPWEqYTtyZXR1cm4gZT8odS1pKmkvcykvKHMtMSk6KHUtaSppL3MpL3N9KHRoaXMscixvKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19c3RhbmRhcmREZXZpYXRpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApO2NvbnN0IHI9dGhpcy52YXJpYW5jZSh0LGUpO2lmKHZvaWQgMD09PXQpcmV0dXJuIE1hdGguc3FydChyKTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKylyW3RdPU1hdGguc3FydChyW3RdKTtyZXR1cm4gcn1jZW50ZXIodCxlPXt9KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7Y2VudGVyOnI9dGhpcy5tZWFuKHQpfT1lO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pLWVbcl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0LnNldChyLG8sdC5nZXQocixvKS1lW29dKX0odGhpcyxyKSx0aGlzO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbyktZSl9KHRoaXMsciksdGhpcztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19c2NhbGUodCxlPXt9KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7bGV0IHI9ZS5zY2FsZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKHZvaWQgMD09PXIpcj1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKyl7bGV0IG89MDtmb3IobGV0IGU9MDtlPHQuY29sdW1ucztlKyspbys9TWF0aC5wb3codC5nZXQocixlKSwyKS8odC5jb2x1bW5zLTEpO2UucHVzaChNYXRoLnNxcnQobykpfXJldHVybiBlfSh0aGlzKTtlbHNlIGlmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pL2Vbcl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKHZvaWQgMD09PXIpcj1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5jb2x1bW5zO3IrKyl7bGV0IG89MDtmb3IobGV0IGU9MDtlPHQucm93cztlKyspbys9TWF0aC5wb3codC5nZXQoZSxyKSwyKS8odC5yb3dzLTEpO2UucHVzaChNYXRoLnNxcnQobykpfXJldHVybiBlfSh0aGlzKTtlbHNlIGlmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pL2Vbb10pfSh0aGlzLHIpLHRoaXM7Y2FzZSB2b2lkIDA6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5zaXplLTE7bGV0IHI9MDtmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspZm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKXIrPU1hdGgucG93KHQuZ2V0KG4sbyksMikvZTtyZXR1cm4gTWF0aC5zcXJ0KHIpfSh0aGlzKTtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0LnNldChyLG8sdC5nZXQocixvKS9lKX0odGhpcyxyKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX10b1N0cmluZyh0KXtyZXR1cm4gamUodGhpcyx0KX19ZnVuY3Rpb24gUGUodCxlKXtyZXR1cm4gdC1lfVZlLnByb3RvdHlwZS5rbGFzcz0iTWF0cml4IiwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmKFZlLnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1mdW5jdGlvbigpe3JldHVybiBqZSh0aGlzKX0pLFZlLnJhbmRvbT1WZS5yYW5kLFZlLnJhbmRvbUludD1WZS5yYW5kSW50LFZlLmRpYWdvbmFsPVZlLmRpYWcsVmUucHJvdG90eXBlLmRpYWdvbmFsPVZlLnByb3RvdHlwZS5kaWFnLFZlLmlkZW50aXR5PVZlLmV5ZSxWZS5wcm90b3R5cGUubmVnYXRlPVZlLnByb3RvdHlwZS5uZWcsVmUucHJvdG90eXBlLnRlbnNvclByb2R1Y3Q9VmUucHJvdG90eXBlLmtyb25lY2tlclByb2R1Y3Q7Y2xhc3MgcWUgZXh0ZW5kcyBWZXtjb25zdHJ1Y3Rvcih0LGUpe2lmKHN1cGVyKCkscWUuaXNNYXRyaXgodCkpcmV0dXJuIHQuY2xvbmUoKTtpZihOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0Pj0wKXtpZih0aGlzLmRhdGE9W10sIShOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj0wKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJuQ29sdW1ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2ZvcihsZXQgcj0wO3I8dDtyKyspdGhpcy5kYXRhLnB1c2gobmV3IEZsb2F0NjRBcnJheShlKSl9ZWxzZXtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIGFuIGFycmF5Iik7e2NvbnN0IHI9dDtpZigibnVtYmVyIiE9dHlwZW9mKGU9KHQ9ci5sZW5ndGgpP3JbMF0ubGVuZ3RoOjApKXRocm93IG5ldyBUeXBlRXJyb3IoIkRhdGEgbXVzdCBiZSBhIDJEIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQiKTt0aGlzLmRhdGE9W107Zm9yKGxldCBvPTA7bzx0O28rKyl7aWYocltvXS5sZW5ndGghPT1lKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmNvbnNpc3RlbnQgYXJyYXkgZGltZW5zaW9ucyIpO3RoaXMuZGF0YS5wdXNoKEZsb2F0NjRBcnJheS5mcm9tKHJbb10pKX19fXRoaXMucm93cz10LHRoaXMuY29sdW1ucz1lfXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX1yZW1vdmVSb3codCl7cmV0dXJuIEFlKHRoaXMsdCksdGhpcy5kYXRhLnNwbGljZSh0LDEpLHRoaXMucm93cy09MSx0aGlzfWFkZFJvdyh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5yb3dzKSxBZSh0aGlzLHQsITApLGU9RmxvYXQ2NEFycmF5LmZyb20oUmUodGhpcyxlKSksdGhpcy5kYXRhLnNwbGljZSh0LDAsZSksdGhpcy5yb3dzKz0xLHRoaXN9cmVtb3ZlQ29sdW1uKHQpe0NlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXtjb25zdCByPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zLTEpO2ZvcihsZXQgbz0wO288dDtvKyspcltvXT10aGlzLmRhdGFbZV1bb107Zm9yKGxldCBvPXQrMTtvPHRoaXMuY29sdW1ucztvKyspcltvLTFdPXRoaXMuZGF0YVtlXVtvXTt0aGlzLmRhdGFbZV09cn1yZXR1cm4gdGhpcy5jb2x1bW5zLT0xLHRoaXN9YWRkQ29sdW1uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMuY29sdW1ucyksQ2UodGhpcyx0LCEwKSxlPUllKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtjb25zdCBvPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zKzEpO2xldCBuPTA7Zm9yKDtuPHQ7bisrKW9bbl09dGhpcy5kYXRhW3JdW25dO2ZvcihvW24rK109ZVtyXTtuPHRoaXMuY29sdW1ucysxO24rKylvW25dPXRoaXMuZGF0YVtyXVtuLTFdO3RoaXMuZGF0YVtyXT1vfXJldHVybiB0aGlzLmNvbHVtbnMrPTEsdGhpc319IWZ1bmN0aW9uKHQsZSl7dC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmFkZFModCk6dGhpcy5hZGRNKHQpfSx0LnByb3RvdHlwZS5hZGRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmFkZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3QuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmFkZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5hZGQocil9LHQucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5zdWJTKHQpOnRoaXMuc3ViTSh0KX0sdC5wcm90b3R5cGUuc3ViUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zdWJNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5zdWI9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuc3ViKHIpfSx0LnByb3RvdHlwZS5zdWJ0cmFjdD10LnByb3RvdHlwZS5zdWIsdC5wcm90b3R5cGUuc3VidHJhY3RTPXQucHJvdG90eXBlLnN1YlMsdC5wcm90b3R5cGUuc3VidHJhY3RNPXQucHJvdG90eXBlLnN1Yk0sdC5zdWJ0cmFjdD10LnN1Yix0LnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubXVsUyh0KTp0aGlzLm11bE0odCl9LHQucHJvdG90eXBlLm11bFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubXVsTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubXVsPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm11bChyKX0sdC5wcm90b3R5cGUubXVsdGlwbHk9dC5wcm90b3R5cGUubXVsLHQucHJvdG90eXBlLm11bHRpcGx5Uz10LnByb3RvdHlwZS5tdWxTLHQucHJvdG90eXBlLm11bHRpcGx5TT10LnByb3RvdHlwZS5tdWxNLHQubXVsdGlwbHk9dC5tdWwsdC5wcm90b3R5cGUuZGl2PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmRpdlModCk6dGhpcy5kaXZNKHQpfSx0LnByb3RvdHlwZS5kaXZTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmRpdk09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3QuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmRpdj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5kaXYocil9LHQucHJvdG90eXBlLmRpdmlkZT10LnByb3RvdHlwZS5kaXYsdC5wcm90b3R5cGUuZGl2aWRlUz10LnByb3RvdHlwZS5kaXZTLHQucHJvdG90eXBlLmRpdmlkZU09dC5wcm90b3R5cGUuZGl2TSx0LmRpdmlkZT10LmRpdix0LnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubW9kUyh0KTp0aGlzLm1vZE0odCl9LHQucHJvdG90eXBlLm1vZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSV0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubW9kTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikldC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubW9kPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm1vZChyKX0sdC5wcm90b3R5cGUubW9kdWx1cz10LnByb3RvdHlwZS5tb2QsdC5wcm90b3R5cGUubW9kdWx1c1M9dC5wcm90b3R5cGUubW9kUyx0LnByb3RvdHlwZS5tb2R1bHVzTT10LnByb3RvdHlwZS5tb2RNLHQubW9kdWx1cz10Lm1vZCx0LnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuYW5kUyh0KTp0aGlzLmFuZE0odCl9LHQucHJvdG90eXBlLmFuZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSZ0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuYW5kTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikmdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuYW5kPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmFuZChyKX0sdC5wcm90b3R5cGUub3I9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMub3JTKHQpOnRoaXMub3JNKHQpfSx0LnByb3RvdHlwZS5vclM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKXx0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUub3JNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKXx0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5vcj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5vcihyKX0sdC5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnhvclModCk6dGhpcy54b3JNKHQpfSx0LnByb3RvdHlwZS54b3JTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciledCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnhvck09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpXnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lnhvcj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS54b3Iocil9LHQucHJvdG90eXBlLmxlZnRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5sZWZ0U2hpZnRTKHQpOnRoaXMubGVmdFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPDx0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubGVmdFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik8PHQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmxlZnRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5sZWZ0U2hpZnQocil9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdFModCk6dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0KHIpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnJpZ2h0U2hpZnRTKHQpOnRoaXMucmlnaHRTaGlmdE0odCl9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+Pj50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucmlnaHRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj4+dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQucmlnaHRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5yaWdodFNoaWZ0KHIpfSx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnQ9dC5wcm90b3R5cGUucmlnaHRTaGlmdCx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRTPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRTLHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdE09dC5wcm90b3R5cGUucmlnaHRTaGlmdE0sdC56ZXJvRmlsbFJpZ2h0U2hpZnQ9dC5yaWdodFNoaWZ0LHQucHJvdG90eXBlLm5vdD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLH50aGlzLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5ub3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLm5vdCgpfSx0LnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFicyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWJzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hYnMoKX0sdC5wcm90b3R5cGUuYWNvcz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWNvcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWNvcygpfSx0LnByb3RvdHlwZS5hY29zaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3NoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hY29zaCgpfSx0LnByb3RvdHlwZS5hc2luPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hc2luKCl9LHQucHJvdG90eXBlLmFzaW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFzaW5oKCl9LHQucHJvdG90eXBlLmF0YW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmF0YW4oKX0sdC5wcm90b3R5cGUuYXRhbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hdGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXRhbmgoKX0sdC5wcm90b3R5cGUuY2JydD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2JydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2JydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2JydCgpfSx0LnByb3RvdHlwZS5jZWlsPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jZWlsKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jZWlsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jZWlsKCl9LHQucHJvdG90eXBlLmNsejMyPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jbHozMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2x6MzI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNsejMyKCl9LHQucHJvdG90eXBlLmNvcz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNvcygpfSx0LnByb3RvdHlwZS5jb3NoPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3NoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jb3NoKCl9LHQucHJvdG90eXBlLmV4cD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5leHA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmV4cCgpfSx0LnByb3RvdHlwZS5leHBtMT1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwbTEodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmV4cG0xPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5leHBtMSgpfSx0LnByb3RvdHlwZS5mbG9vcj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZmxvb3IodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZsb29yPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5mbG9vcigpfSx0LnByb3RvdHlwZS5mcm91bmQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZyb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5mcm91bmQoKX0sdC5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2codGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nKCl9LHQucHJvdG90eXBlLmxvZzFwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxcCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzFwKCl9LHQucHJvdG90eXBlLmxvZzEwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxMCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMTA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzEwKCl9LHQucHJvdG90eXBlLmxvZzI9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzIoKX0sdC5wcm90b3R5cGUucm91bmQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkucm91bmQoKX0sdC5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2lnbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2lnbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2lnbigpfSx0LnByb3RvdHlwZS5zaW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaW4oKX0sdC5wcm90b3R5cGUuc2luaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2luaCgpfSx0LnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zcXJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zcXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zcXJ0KCl9LHQucHJvdG90eXBlLnRhbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRhbigpfSx0LnByb3RvdHlwZS50YW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50YW5oKCl9LHQucHJvdG90eXBlLnRydW5jPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50cnVuYyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudHJ1bmM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRydW5jKCl9LHQucG93PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnBvdyhyKX0sdC5wcm90b3R5cGUucG93PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnBvd1ModCk6dGhpcy5wb3dNKHQpfSx0LnByb3RvdHlwZS5wb3dTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLE1hdGgucG93KHRoaXMuZ2V0KGUsciksdCkpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5wb3dNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsTWF0aC5wb3codGhpcy5nZXQoZSxyKSx0LmdldChlLHIpKSk7cmV0dXJuIHRoaXN9fShWZSxxZSk7Y2xhc3MgJGUgZXh0ZW5kcyBWZXtjb25zdHJ1Y3Rvcih0LGUscil7c3VwZXIoKSx0aGlzLm1hdHJpeD10LHRoaXMucm93cz1lLHRoaXMuY29sdW1ucz1yfX1jbGFzcyBEZSBleHRlbmRzICRle2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsdC5jb2x1bW5zLHQucm93cyl9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KGUsdCxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQoZSx0KX19Y2xhc3MgVWUgZXh0ZW5kcyBWZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGF0YT10LHRoaXMucm93cz10Lmxlbmd0aCx0aGlzLmNvbHVtbnM9dFswXS5sZW5ndGh9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdPXIsdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdfX1mdW5jdGlvbiBMZSh0LGUpe2xldCByPTA7cmV0dXJuIE1hdGguYWJzKHQpPk1hdGguYWJzKGUpPyhyPWUvdCxNYXRoLmFicyh0KSpNYXRoLnNxcnQoMStyKnIpKTowIT09ZT8ocj10L2UsTWF0aC5hYnMoZSkqTWF0aC5zcXJ0KDErcipyKSk6MH1jbGFzcyBCZXtjb25zdHJ1Y3Rvcih0LGU9e30pe2lmKCh0PVVlLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgcj10LnJvd3Msbz10LmNvbHVtbnM7Y29uc3R7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6bj0hMCxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6cz0hMCxhdXRvVHJhbnNwb3NlOmk9ITF9PWU7bGV0IHUsYT1Cb29sZWFuKG4pLGg9Qm9vbGVhbihzKSxsPSExO2lmKHI8bylpZihpKXt1PXQudHJhbnNwb3NlKCkscj11LnJvd3Msbz11LmNvbHVtbnMsbD0hMDtsZXQgZT1hO2E9aCxoPWV9ZWxzZSB1PXQuY2xvbmUoKSxjb25zb2xlLndhcm4oIkNvbXB1dGluZyBTVkQgb24gYSBtYXRyaXggd2l0aCBtb3JlIGNvbHVtbnMgdGhhbiByb3dzLiBDb25zaWRlciBlbmFibGluZyBhdXRvVHJhbnNwb3NlIik7ZWxzZSB1PXQuY2xvbmUoKTtsZXQgYz1NYXRoLm1pbihyLG8pLGY9TWF0aC5taW4ocisxLG8pLG09bmV3IEZsb2F0NjRBcnJheShmKSxnPW5ldyBxZShyLGMpLHA9bmV3IHFlKG8sbyksdz1uZXcgRmxvYXQ2NEFycmF5KG8pLGQ9bmV3IEZsb2F0NjRBcnJheShyKSxiPW5ldyBGbG9hdDY0QXJyYXkoZik7Zm9yKGxldCB0PTA7dDxmO3QrKyliW3RdPXQ7bGV0IHk9TWF0aC5taW4oci0xLG8pLHY9TWF0aC5tYXgoMCxNYXRoLm1pbihvLTIscikpLE09TWF0aC5tYXgoeSx2KTtmb3IobGV0IHQ9MDt0PE07dCsrKXtpZih0PHkpe21bdF09MDtmb3IobGV0IGU9dDtlPHI7ZSsrKW1bdF09TGUobVt0XSx1LmdldChlLHQpKTtpZigwIT09bVt0XSl7dS5nZXQodCx0KTwwJiYobVt0XT0tbVt0XSk7Zm9yKGxldCBlPXQ7ZTxyO2UrKyl1LnNldChlLHQsdS5nZXQoZSx0KS9tW3RdKTt1LnNldCh0LHQsdS5nZXQodCx0KSsxKX1tW3RdPS1tW3RdfWZvcihsZXQgZT10KzE7ZTxvO2UrKyl7aWYodDx5JiYwIT09bVt0XSl7bGV0IG89MDtmb3IobGV0IG49dDtuPHI7bisrKW8rPXUuZ2V0KG4sdCkqdS5nZXQobixlKTtvPS1vL3UuZ2V0KHQsdCk7Zm9yKGxldCBuPXQ7bjxyO24rKyl1LnNldChuLGUsdS5nZXQobixlKStvKnUuZ2V0KG4sdCkpfXdbZV09dS5nZXQodCxlKX1pZihhJiZ0PHkpZm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsdS5nZXQoZSx0KSk7aWYodDx2KXt3W3RdPTA7Zm9yKGxldCBlPXQrMTtlPG87ZSsrKXdbdF09TGUod1t0XSx3W2VdKTtpZigwIT09d1t0XSl7d1t0KzFdPDAmJih3W3RdPTAtd1t0XSk7Zm9yKGxldCBlPXQrMTtlPG87ZSsrKXdbZV0vPXdbdF07d1t0KzFdKz0xfWlmKHdbdF09LXdbdF0sdCsxPHImJjAhPT13W3RdKXtmb3IobGV0IGU9dCsxO2U8cjtlKyspZFtlXT0wO2ZvcihsZXQgZT10KzE7ZTxyO2UrKylmb3IobGV0IHI9dCsxO3I8bztyKyspZFtlXSs9d1tyXSp1LmdldChlLHIpO2ZvcihsZXQgZT10KzE7ZTxvO2UrKyl7bGV0IG89LXdbZV0vd1t0KzFdO2ZvcihsZXQgbj10KzE7bjxyO24rKyl1LnNldChuLGUsdS5nZXQobixlKStvKmRbbl0pfX1pZihoKWZvcihsZXQgZT10KzE7ZTxvO2UrKylwLnNldChlLHQsd1tlXSl9fWxldCB4PU1hdGgubWluKG8scisxKTtpZih5PG8mJihtW3ldPXUuZ2V0KHkseSkpLHI8eCYmKG1beC0xXT0wKSx2KzE8eCYmKHdbdl09dS5nZXQodix4LTEpKSx3W3gtMV09MCxhKXtmb3IobGV0IHQ9eTt0PGM7dCsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9Zm9yKGxldCB0PXktMTt0Pj0wO3QtLSlpZigwIT09bVt0XSl7Zm9yKGxldCBlPXQrMTtlPGM7ZSsrKXtsZXQgbz0wO2ZvcihsZXQgbj10O248cjtuKyspbys9Zy5nZXQobix0KSpnLmdldChuLGUpO289LW8vZy5nZXQodCx0KTtmb3IobGV0IG49dDtuPHI7bisrKWcuc2V0KG4sZSxnLmdldChuLGUpK28qZy5nZXQobix0KSl9Zm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsLWcuZ2V0KGUsdCkpO2cuc2V0KHQsdCwxK2cuZ2V0KHQsdCkpO2ZvcihsZXQgZT0wO2U8dC0xO2UrKylnLnNldChlLHQsMCl9ZWxzZXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9fWlmKGgpZm9yKGxldCB0PW8tMTt0Pj0wO3QtLSl7aWYodDx2JiYwIT09d1t0XSlmb3IobGV0IGU9dCsxO2U8bztlKyspe2xldCByPTA7Zm9yKGxldCBuPXQrMTtuPG87bisrKXIrPXAuZ2V0KG4sdCkqcC5nZXQobixlKTtyPS1yL3AuZ2V0KHQrMSx0KTtmb3IobGV0IG49dCsxO248bztuKyspcC5zZXQobixlLHAuZ2V0KG4sZSkrcipwLmdldChuLHQpKX1mb3IobGV0IGU9MDtlPG87ZSsrKXAuc2V0KGUsdCwwKTtwLnNldCh0LHQsMSl9bGV0IEU9eC0xLFM9TnVtYmVyLkVQU0lMT047Zm9yKDt4PjA7KXtsZXQgdCxlO2Zvcih0PXgtMjt0Pj0tMSYmLTEhPT10O3QtLSl7Y29uc3QgZT1OdW1iZXIuTUlOX1ZBTFVFK1MqTWF0aC5hYnMobVt0XStNYXRoLmFicyhtW3QrMV0pKTtpZihNYXRoLmFicyh3W3RdKTw9ZXx8TnVtYmVyLmlzTmFOKHdbdF0pKXt3W3RdPTA7YnJlYWt9fWlmKHQ9PT14LTIpZT00O2Vsc2V7bGV0IHI7Zm9yKHI9eC0xO3I+PXQmJnIhPT10O3ItLSl7bGV0IGU9KHIhPT14P01hdGguYWJzKHdbcl0pOjApKyhyIT09dCsxP01hdGguYWJzKHdbci0xXSk6MCk7aWYoTWF0aC5hYnMobVtyXSk8PVMqZSl7bVtyXT0wO2JyZWFrfX1yPT09dD9lPTM6cj09PXgtMT9lPTE6KGU9Mix0PXIpfXN3aXRjaCh0KyssZSl7Y2FzZSAxOntsZXQgZT13W3gtMl07d1t4LTJdPTA7Zm9yKGxldCByPXgtMjtyPj10O3ItLSl7bGV0IG49TGUobVtyXSxlKSxzPW1bcl0vbixpPWUvbjtpZihtW3JdPW4sciE9PXQmJihlPS1pKndbci0xXSx3W3ItMV09cyp3W3ItMV0pLGgpZm9yKGxldCB0PTA7dDxvO3QrKyluPXMqcC5nZXQodCxyKStpKnAuZ2V0KHQseC0xKSxwLnNldCh0LHgtMSwtaSpwLmdldCh0LHIpK3MqcC5nZXQodCx4LTEpKSxwLnNldCh0LHIsbil9YnJlYWt9Y2FzZSAyOntsZXQgZT13W3QtMV07d1t0LTFdPTA7Zm9yKGxldCBvPXQ7bzx4O28rKyl7bGV0IG49TGUobVtvXSxlKSxzPW1bb10vbixpPWUvbjtpZihtW29dPW4sZT0taSp3W29dLHdbb109cyp3W29dLGEpZm9yKGxldCBlPTA7ZTxyO2UrKyluPXMqZy5nZXQoZSxvKStpKmcuZ2V0KGUsdC0xKSxnLnNldChlLHQtMSwtaSpnLmdldChlLG8pK3MqZy5nZXQoZSx0LTEpKSxnLnNldChlLG8sbil9YnJlYWt9Y2FzZSAzOntjb25zdCBlPU1hdGgubWF4KE1hdGguYWJzKG1beC0xXSksTWF0aC5hYnMobVt4LTJdKSxNYXRoLmFicyh3W3gtMl0pLE1hdGguYWJzKG1bdF0pLE1hdGguYWJzKHdbdF0pKSxuPW1beC0xXS9lLHM9bVt4LTJdL2UsaT13W3gtMl0vZSx1PW1bdF0vZSxsPXdbdF0vZSxjPSgocytuKSoocy1uKStpKmkpLzIsZj1uKmkqKG4qaSk7bGV0IGQ9MDswPT09YyYmMD09PWZ8fChkPWM8MD8wLU1hdGguc3FydChjKmMrZik6TWF0aC5zcXJ0KGMqYytmKSxkPWYvKGMrZCkpO2xldCBiPSh1K24pKih1LW4pK2QseT11Kmw7Zm9yKGxldCBlPXQ7ZTx4LTE7ZSsrKXtsZXQgbj1MZShiLHkpOzA9PT1uJiYobj1OdW1iZXIuTUlOX1ZBTFVFKTtsZXQgcz1iL24saT15L247aWYoZSE9PXQmJih3W2UtMV09biksYj1zKm1bZV0raSp3W2VdLHdbZV09cyp3W2VdLWkqbVtlXSx5PWkqbVtlKzFdLG1bZSsxXT1zKm1bZSsxXSxoKWZvcihsZXQgdD0wO3Q8bzt0Kyspbj1zKnAuZ2V0KHQsZSkraSpwLmdldCh0LGUrMSkscC5zZXQodCxlKzEsLWkqcC5nZXQodCxlKStzKnAuZ2V0KHQsZSsxKSkscC5zZXQodCxlLG4pO2lmKG49TGUoYix5KSwwPT09biYmKG49TnVtYmVyLk1JTl9WQUxVRSkscz1iL24saT15L24sbVtlXT1uLGI9cyp3W2VdK2kqbVtlKzFdLG1bZSsxXT0taSp3W2VdK3MqbVtlKzFdLHk9aSp3W2UrMV0sd1tlKzFdPXMqd1tlKzFdLGEmJmU8ci0xKWZvcihsZXQgdD0wO3Q8cjt0Kyspbj1zKmcuZ2V0KHQsZSkraSpnLmdldCh0LGUrMSksZy5zZXQodCxlKzEsLWkqZy5nZXQodCxlKStzKmcuZ2V0KHQsZSsxKSksZy5zZXQodCxlLG4pfXdbeC0yXT1iO2JyZWFrfWNhc2UgNDppZihtW3RdPD0wJiYobVt0XT1tW3RdPDA/LW1bdF06MCxoKSlmb3IobGV0IGU9MDtlPD1FO2UrKylwLnNldChlLHQsLXAuZ2V0KGUsdCkpO2Zvcig7dDxFJiYhKG1bdF0+PW1bdCsxXSk7KXtsZXQgZT1tW3RdO2lmKG1bdF09bVt0KzFdLG1bdCsxXT1lLGgmJnQ8by0xKWZvcihsZXQgcj0wO3I8bztyKyspZT1wLmdldChyLHQrMSkscC5zZXQocix0KzEscC5nZXQocix0KSkscC5zZXQocix0LGUpO2lmKGEmJnQ8ci0xKWZvcihsZXQgbz0wO288cjtvKyspZT1nLmdldChvLHQrMSksZy5zZXQobyx0KzEsZy5nZXQobyx0KSksZy5zZXQobyx0LGUpO3QrK314LS19fWlmKGwpe2xldCB0PXA7cD1nLGc9dH10aGlzLm09cix0aGlzLm49byx0aGlzLnM9bSx0aGlzLlU9Zyx0aGlzLlY9cH1zb2x2ZSh0KXtsZXQgZT10LHI9dGhpcy50aHJlc2hvbGQsbz10aGlzLnMubGVuZ3RoLG49cWUuemVyb3MobyxvKTtmb3IobGV0IHQ9MDt0PG87dCsrKU1hdGguYWJzKHRoaXMuc1t0XSk8PXI/bi5zZXQodCx0LDApOm4uc2V0KHQsdCwxL3RoaXMuc1t0XSk7bGV0IHM9dGhpcy5VLGk9dGhpcy5yaWdodFNpbmd1bGFyVmVjdG9ycyx1PWkubW11bChuKSxhPWkucm93cyxoPXMucm93cyxsPXFlLnplcm9zKGEsaCk7Zm9yKGxldCB0PTA7dDxhO3QrKylmb3IobGV0IGU9MDtlPGg7ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248bztuKyspcis9dS5nZXQodCxuKSpzLmdldChlLG4pO2wuc2V0KHQsZSxyKX1yZXR1cm4gbC5tbXVsKGUpfXNvbHZlRm9yRGlhZ29uYWwodCl7cmV0dXJuIHRoaXMuc29sdmUocWUuZGlhZyh0KSl9aW52ZXJzZSgpe2xldCB0PXRoaXMuVixlPXRoaXMudGhyZXNob2xkLHI9dC5yb3dzLG89dC5jb2x1bW5zLG49bmV3IHFlKHIsdGhpcy5zLmxlbmd0aCk7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG87cisrKU1hdGguYWJzKHRoaXMuc1tyXSk+ZSYmbi5zZXQocyxyLHQuZ2V0KHMscikvdGhpcy5zW3JdKTtsZXQgcz10aGlzLlUsaT1zLnJvd3MsdT1zLmNvbHVtbnMsYT1uZXcgcWUocixpKTtmb3IobGV0IHQ9MDt0PHI7dCsrKWZvcihsZXQgZT0wO2U8aTtlKyspe2xldCByPTA7Zm9yKGxldCBvPTA7bzx1O28rKylyKz1uLmdldCh0LG8pKnMuZ2V0KGUsbyk7YS5zZXQodCxlLHIpfXJldHVybiBhfWdldCBjb25kaXRpb24oKXtyZXR1cm4gdGhpcy5zWzBdL3RoaXMuc1tNYXRoLm1pbih0aGlzLm0sdGhpcy5uKS0xXX1nZXQgbm9ybTIoKXtyZXR1cm4gdGhpcy5zWzBdfWdldCByYW5rKCl7bGV0IHQ9TWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdKk51bWJlci5FUFNJTE9OLGU9MCxyPXRoaXMucztmb3IobGV0IG89MCxuPXIubGVuZ3RoO288bjtvKyspcltvXT50JiZlKys7cmV0dXJuIGV9Z2V0IGRpYWdvbmFsKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5zKX1nZXQgdGhyZXNob2xkKCl7cmV0dXJuIE51bWJlci5FUFNJTE9OLzIqTWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdfWdldCBsZWZ0U2luZ3VsYXJWZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXQgcmlnaHRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe3JldHVybiBxZS5kaWFnKHRoaXMucyl9fWNsYXNzIEdle2NvbnN0cnVjdG9yKHQsZT17fSl7Y29uc3R7YXNzdW1lU3ltbWV0cmljOnI9ITF9PWU7aWYoISh0PVVlLmNoZWNrTWF0cml4KHQpKS5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGlzIG5vdCBhIHNxdWFyZSBtYXRyaXgiKTtpZih0LmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIG5vbi1lbXB0eSIpO2xldCBvLG4scz10LmNvbHVtbnMsaT1uZXcgcWUocyxzKSx1PW5ldyBGbG9hdDY0QXJyYXkocyksYT1uZXcgRmxvYXQ2NEFycmF5KHMpLGg9dCxsPSExO2lmKGw9ISFyfHx0LmlzU3ltbWV0cmljKCksbCl7Zm9yKG89MDtvPHM7bysrKWZvcihuPTA7bjxzO24rKylpLnNldChvLG4saC5nZXQobyxuKSk7IWZ1bmN0aW9uKHQsZSxyLG8pe2xldCBuLHMsaSx1LGEsaCxsLGM7Zm9yKGE9MDthPHQ7YSsrKXJbYV09by5nZXQodC0xLGEpO2Zvcih1PXQtMTt1PjA7dS0tKXtmb3IoYz0wLGk9MCxoPTA7aDx1O2grKyljKz1NYXRoLmFicyhyW2hdKTtpZigwPT09Yylmb3IoZVt1XT1yW3UtMV0sYT0wO2E8dTthKyspclthXT1vLmdldCh1LTEsYSksby5zZXQodSxhLDApLG8uc2V0KGEsdSwwKTtlbHNle2ZvcihoPTA7aDx1O2grKylyW2hdLz1jLGkrPXJbaF0qcltoXTtmb3Iobj1yW3UtMV0scz1NYXRoLnNxcnQoaSksbj4wJiYocz0tcyksZVt1XT1jKnMsaS09bipzLHJbdS0xXT1uLXMsYT0wO2E8dTthKyspZVthXT0wO2ZvcihhPTA7YTx1O2ErKyl7Zm9yKG49clthXSxvLnNldChhLHUsbikscz1lW2FdK28uZ2V0KGEsYSkqbixoPWErMTtoPD11LTE7aCsrKXMrPW8uZ2V0KGgsYSkqcltoXSxlW2hdKz1vLmdldChoLGEpKm47ZVthXT1zfWZvcihuPTAsYT0wO2E8dTthKyspZVthXS89aSxuKz1lW2FdKnJbYV07Zm9yKGw9bi8oaStpKSxhPTA7YTx1O2ErKyllW2FdLT1sKnJbYV07Zm9yKGE9MDthPHU7YSsrKXtmb3Iobj1yW2FdLHM9ZVthXSxoPWE7aDw9dS0xO2grKylvLnNldChoLGEsby5nZXQoaCxhKS0obiplW2hdK3MqcltoXSkpO3JbYV09by5nZXQodS0xLGEpLG8uc2V0KHUsYSwwKX19clt1XT1pfWZvcih1PTA7dTx0LTE7dSsrKXtpZihvLnNldCh0LTEsdSxvLmdldCh1LHUpKSxvLnNldCh1LHUsMSksaT1yW3UrMV0sMCE9PWkpe2ZvcihoPTA7aDw9dTtoKyspcltoXT1vLmdldChoLHUrMSkvaTtmb3IoYT0wO2E8PXU7YSsrKXtmb3Iocz0wLGg9MDtoPD11O2grKylzKz1vLmdldChoLHUrMSkqby5nZXQoaCxhKTtmb3IoaD0wO2g8PXU7aCsrKW8uc2V0KGgsYSxvLmdldChoLGEpLXMqcltoXSl9fWZvcihoPTA7aDw9dTtoKyspby5zZXQoaCx1KzEsMCl9Zm9yKGE9MDthPHQ7YSsrKXJbYV09by5nZXQodC0xLGEpLG8uc2V0KHQtMSxhLDApO28uc2V0KHQtMSx0LTEsMSksZVswXT0wfShzLGEsdSxpKSxmdW5jdGlvbih0LGUscixvKXtsZXQgbixzLGksdSxhLGgsbCxjLGYsbSxnLHAsdyxkLGIseTtmb3IoaT0xO2k8dDtpKyspZVtpLTFdPWVbaV07ZVt0LTFdPTA7bGV0IHY9MCxNPTAseD1OdW1iZXIuRVBTSUxPTjtmb3IoaD0wO2g8dDtoKyspe2ZvcihNPU1hdGgubWF4KE0sTWF0aC5hYnMocltoXSkrTWF0aC5hYnMoZVtoXSkpLGw9aDtsPHQmJiEoTWF0aC5hYnMoZVtsXSk8PXgqTSk7KWwrKztpZihsPmgpZG97Zm9yKG49cltoXSxjPShyW2grMV0tbikvKDIqZVtoXSksZj1MZShjLDEpLGM8MCYmKGY9LWYpLHJbaF09ZVtoXS8oYytmKSxyW2grMV09ZVtoXSooYytmKSxtPXJbaCsxXSxzPW4tcltoXSxpPWgrMjtpPHQ7aSsrKXJbaV0tPXM7Zm9yKHYrPXMsYz1yW2xdLGc9MSxwPWcsdz1nLGQ9ZVtoKzFdLGI9MCx5PTAsaT1sLTE7aT49aDtpLS0pZm9yKHc9cCxwPWcseT1iLG49ZyplW2ldLHM9ZypjLGY9TGUoYyxlW2ldKSxlW2krMV09YipmLGI9ZVtpXS9mLGc9Yy9mLGM9ZypyW2ldLWIqbixyW2krMV09cytiKihnKm4rYipyW2ldKSxhPTA7YTx0O2ErKylzPW8uZ2V0KGEsaSsxKSxvLnNldChhLGkrMSxiKm8uZ2V0KGEsaSkrZypzKSxvLnNldChhLGksZypvLmdldChhLGkpLWIqcyk7Yz0tYip5KncqZCplW2hdL20sZVtoXT1iKmMscltoXT1nKmN9d2hpbGUoTWF0aC5hYnMoZVtoXSk+eCpNKTtyW2hdPXJbaF0rdixlW2hdPTB9Zm9yKGk9MDtpPHQtMTtpKyspe2ZvcihhPWksYz1yW2ldLHU9aSsxO3U8dDt1Kyspclt1XTxjJiYoYT11LGM9clt1XSk7aWYoYSE9PWkpZm9yKHJbYV09cltpXSxyW2ldPWMsdT0wO3U8dDt1KyspYz1vLmdldCh1LGkpLG8uc2V0KHUsaSxvLmdldCh1LGEpKSxvLnNldCh1LGEsYyl9fShzLGEsdSxpKX1lbHNle2xldCB0PW5ldyBxZShzLHMpLGU9bmV3IEZsb2F0NjRBcnJheShzKTtmb3Iobj0wO248cztuKyspZm9yKG89MDtvPHM7bysrKXQuc2V0KG8sbixoLmdldChvLG4pKTshZnVuY3Rpb24odCxlLHIsbyl7bGV0IG4scyxpLHUsYSxoLGwsYz0wLGY9dC0xO2ZvcihoPWMrMTtoPD1mLTE7aCsrKXtmb3IobD0wLHU9aDt1PD1mO3UrKylsKz1NYXRoLmFicyhlLmdldCh1LGgtMSkpO2lmKDAhPT1sKXtmb3IoaT0wLHU9Zjt1Pj1oO3UtLSlyW3VdPWUuZ2V0KHUsaC0xKS9sLGkrPXJbdV0qclt1XTtmb3Iocz1NYXRoLnNxcnQoaSkscltoXT4wJiYocz0tcyksaS09cltoXSpzLHJbaF09cltoXS1zLGE9aDthPHQ7YSsrKXtmb3Iobj0wLHU9Zjt1Pj1oO3UtLSluKz1yW3VdKmUuZ2V0KHUsYSk7Zm9yKG4vPWksdT1oO3U8PWY7dSsrKWUuc2V0KHUsYSxlLmdldCh1LGEpLW4qclt1XSl9Zm9yKHU9MDt1PD1mO3UrKyl7Zm9yKG49MCxhPWY7YT49aDthLS0pbis9clthXSplLmdldCh1LGEpO2ZvcihuLz1pLGE9aDthPD1mO2ErKyllLnNldCh1LGEsZS5nZXQodSxhKS1uKnJbYV0pfXJbaF09bCpyW2hdLGUuc2V0KGgsaC0xLGwqcyl9fWZvcih1PTA7dTx0O3UrKylmb3IoYT0wO2E8dDthKyspby5zZXQodSxhLHU9PT1hPzE6MCk7Zm9yKGg9Zi0xO2g+PWMrMTtoLS0paWYoMCE9PWUuZ2V0KGgsaC0xKSl7Zm9yKHU9aCsxO3U8PWY7dSsrKXJbdV09ZS5nZXQodSxoLTEpO2ZvcihhPWg7YTw9ZjthKyspe2ZvcihzPTAsdT1oO3U8PWY7dSsrKXMrPXJbdV0qby5nZXQodSxhKTtmb3Iocz1zL3JbaF0vZS5nZXQoaCxoLTEpLHU9aDt1PD1mO3UrKylvLnNldCh1LGEsby5nZXQodSxhKStzKnJbdV0pfX19KHMsdCxlLGkpLGZ1bmN0aW9uKHQsZSxyLG8sbil7bGV0IHMsaSx1LGEsaCxsLGMsZixtLGcscCx3LGQsYix5LHY9dC0xLE09MCx4PXQtMSxFPU51bWJlci5FUFNJTE9OLFM9MCxqPTAsXz0wLEE9MCxDPTAsUj0wLEk9MCxrPTA7Zm9yKHM9MDtzPHQ7cysrKWZvcigoczxNfHxzPngpJiYocltzXT1uLmdldChzLHMpLGVbc109MCksaT1NYXRoLm1heChzLTEsMCk7aTx0O2krKylqKz1NYXRoLmFicyhuLmdldChzLGkpKTtmb3IoO3Y+PU07KXtmb3IoYT12O2E+TSYmKFI9TWF0aC5hYnMobi5nZXQoYS0xLGEtMSkpK01hdGguYWJzKG4uZ2V0KGEsYSkpLDA9PT1SJiYoUj1qKSwhKE1hdGguYWJzKG4uZ2V0KGEsYS0xKSk8RSpSKSk7KWEtLTtpZihhPT09diluLnNldCh2LHYsbi5nZXQodix2KStTKSxyW3ZdPW4uZ2V0KHYsdiksZVt2XT0wLHYtLSxrPTA7ZWxzZSBpZihhPT09di0xKXtpZihjPW4uZ2V0KHYsdi0xKSpuLmdldCh2LTEsdiksXz0obi5nZXQodi0xLHYtMSktbi5nZXQodix2KSkvMixBPV8qXytjLEk9TWF0aC5zcXJ0KE1hdGguYWJzKEEpKSxuLnNldCh2LHYsbi5nZXQodix2KStTKSxuLnNldCh2LTEsdi0xLG4uZ2V0KHYtMSx2LTEpK1MpLGY9bi5nZXQodix2KSxBPj0wKXtmb3IoST1fPj0wP18rSTpfLUksclt2LTFdPWYrSSxyW3ZdPXJbdi0xXSwwIT09SSYmKHJbdl09Zi1jL0kpLGVbdi0xXT0wLGVbdl09MCxmPW4uZ2V0KHYsdi0xKSxSPU1hdGguYWJzKGYpK01hdGguYWJzKEkpLF89Zi9SLEE9SS9SLEM9TWF0aC5zcXJ0KF8qXytBKkEpLF8vPUMsQS89QyxpPXYtMTtpPHQ7aSsrKUk9bi5nZXQodi0xLGkpLG4uc2V0KHYtMSxpLEEqSStfKm4uZ2V0KHYsaSkpLG4uc2V0KHYsaSxBKm4uZ2V0KHYsaSktXypJKTtmb3Iocz0wO3M8PXY7cysrKUk9bi5nZXQocyx2LTEpLG4uc2V0KHMsdi0xLEEqSStfKm4uZ2V0KHMsdikpLG4uc2V0KHMsdixBKm4uZ2V0KHMsdiktXypJKTtmb3Iocz1NO3M8PXg7cysrKUk9by5nZXQocyx2LTEpLG8uc2V0KHMsdi0xLEEqSStfKm8uZ2V0KHMsdikpLG8uc2V0KHMsdixBKm8uZ2V0KHMsdiktXypJKX1lbHNlIHJbdi0xXT1mK18sclt2XT1mK18sZVt2LTFdPUksZVt2XT0tSTt2LT0yLGs9MH1lbHNle2lmKGY9bi5nZXQodix2KSxtPTAsYz0wLGE8diYmKG09bi5nZXQodi0xLHYtMSksYz1uLmdldCh2LHYtMSkqbi5nZXQodi0xLHYpKSwxMD09PWspe2ZvcihTKz1mLHM9TTtzPD12O3MrKyluLnNldChzLHMsbi5nZXQocyxzKS1mKTtSPU1hdGguYWJzKG4uZ2V0KHYsdi0xKSkrTWF0aC5hYnMobi5nZXQodi0xLHYtMikpLGY9bT0uNzUqUixjPS0uNDM3NSpSKlJ9aWYoMzA9PT1rJiYoUj0obS1mKS8yLFI9UipSK2MsUj4wKSl7Zm9yKFI9TWF0aC5zcXJ0KFIpLG08ZiYmKFI9LVIpLFI9Zi1jLygobS1mKS8yK1IpLHM9TTtzPD12O3MrKyluLnNldChzLHMsbi5nZXQocyxzKS1SKTtTKz1SLGY9bT1jPS45NjR9Zm9yKGsrPTEsaD12LTI7aD49YSYmKEk9bi5nZXQoaCxoKSxDPWYtSSxSPW0tSSxfPShDKlItYykvbi5nZXQoaCsxLGgpK24uZ2V0KGgsaCsxKSxBPW4uZ2V0KGgrMSxoKzEpLUktQy1SLEM9bi5nZXQoaCsyLGgrMSksUj1NYXRoLmFicyhfKStNYXRoLmFicyhBKStNYXRoLmFicyhDKSxfLz1SLEEvPVIsQy89UixoIT09YSkmJiEoTWF0aC5hYnMobi5nZXQoaCxoLTEpKSooTWF0aC5hYnMoQSkrTWF0aC5hYnMoQykpPEUqKE1hdGguYWJzKF8pKihNYXRoLmFicyhuLmdldChoLTEsaC0xKSkrTWF0aC5hYnMoSSkrTWF0aC5hYnMobi5nZXQoaCsxLGgrMSkpKSkpOyloLS07Zm9yKHM9aCsyO3M8PXY7cysrKW4uc2V0KHMscy0yLDApLHM+aCsyJiZuLnNldChzLHMtMywwKTtmb3IodT1oO3U8PXYtMSYmKGI9dSE9PXYtMSx1IT09aCYmKF89bi5nZXQodSx1LTEpLEE9bi5nZXQodSsxLHUtMSksQz1iP24uZ2V0KHUrMix1LTEpOjAsZj1NYXRoLmFicyhfKStNYXRoLmFicyhBKStNYXRoLmFicyhDKSwwIT09ZiYmKF8vPWYsQS89ZixDLz1mKSksMCE9PWYpO3UrKylpZihSPU1hdGguc3FydChfKl8rQSpBK0MqQyksXzwwJiYoUj0tUiksMCE9PVIpe2Zvcih1IT09aD9uLnNldCh1LHUtMSwtUipmKTphIT09aCYmbi5zZXQodSx1LTEsLW4uZ2V0KHUsdS0xKSksXys9UixmPV8vUixtPUEvUixJPUMvUixBLz1fLEMvPV8saT11O2k8dDtpKyspXz1uLmdldCh1LGkpK0Eqbi5nZXQodSsxLGkpLGImJihfKz1DKm4uZ2V0KHUrMixpKSxuLnNldCh1KzIsaSxuLmdldCh1KzIsaSktXypJKSksbi5zZXQodSxpLG4uZ2V0KHUsaSktXypmKSxuLnNldCh1KzEsaSxuLmdldCh1KzEsaSktXyptKTtmb3Iocz0wO3M8PU1hdGgubWluKHYsdSszKTtzKyspXz1mKm4uZ2V0KHMsdSkrbSpuLmdldChzLHUrMSksYiYmKF8rPUkqbi5nZXQocyx1KzIpLG4uc2V0KHMsdSsyLG4uZ2V0KHMsdSsyKS1fKkMpKSxuLnNldChzLHUsbi5nZXQocyx1KS1fKSxuLnNldChzLHUrMSxuLmdldChzLHUrMSktXypBKTtmb3Iocz1NO3M8PXg7cysrKV89ZipvLmdldChzLHUpK20qby5nZXQocyx1KzEpLGImJihfKz1JKm8uZ2V0KHMsdSsyKSxvLnNldChzLHUrMixvLmdldChzLHUrMiktXypDKSksby5zZXQocyx1LG8uZ2V0KHMsdSktXyksby5zZXQocyx1KzEsby5nZXQocyx1KzEpLV8qQSl9fX1pZigwPT09ailyZXR1cm47Zm9yKHY9dC0xO3Y+PTA7di0tKWlmKF89clt2XSxBPWVbdl0sMD09PUEpZm9yKGE9dixuLnNldCh2LHYsMSkscz12LTE7cz49MDtzLS0pe2ZvcihjPW4uZ2V0KHMscyktXyxDPTAsaT1hO2k8PXY7aSsrKUMrPW4uZ2V0KHMsaSkqbi5nZXQoaSx2KTtpZihlW3NdPDApST1jLFI9QztlbHNlIGlmKGE9cywwPT09ZVtzXT9uLnNldChzLHYsMCE9PWM/LUMvYzotQy8oRSpqKSk6KGY9bi5nZXQocyxzKzEpLG09bi5nZXQocysxLHMpLEE9KHJbc10tXykqKHJbc10tXykrZVtzXSplW3NdLGw9KGYqUi1JKkMpL0Esbi5zZXQocyx2LGwpLG4uc2V0KHMrMSx2LE1hdGguYWJzKGYpPk1hdGguYWJzKEkpPygtQy1jKmwpL2Y6KC1SLW0qbCkvSSkpLGw9TWF0aC5hYnMobi5nZXQocyx2KSksRSpsKmw+MSlmb3IoaT1zO2k8PXY7aSsrKW4uc2V0KGksdixuLmdldChpLHYpL2wpfWVsc2UgaWYoQTwwKWZvcihhPXYtMSxNYXRoLmFicyhuLmdldCh2LHYtMSkpPk1hdGguYWJzKG4uZ2V0KHYtMSx2KSk/KG4uc2V0KHYtMSx2LTEsQS9uLmdldCh2LHYtMSkpLG4uc2V0KHYtMSx2LC0obi5nZXQodix2KS1fKS9uLmdldCh2LHYtMSkpKTooeT1LZSgwLC1uLmdldCh2LTEsdiksbi5nZXQodi0xLHYtMSktXyxBKSxuLnNldCh2LTEsdi0xLHlbMF0pLG4uc2V0KHYtMSx2LHlbMV0pKSxuLnNldCh2LHYtMSwwKSxuLnNldCh2LHYsMSkscz12LTI7cz49MDtzLS0pe2ZvcihnPTAscD0wLGk9YTtpPD12O2krKylnKz1uLmdldChzLGkpKm4uZ2V0KGksdi0xKSxwKz1uLmdldChzLGkpKm4uZ2V0KGksdik7aWYoYz1uLmdldChzLHMpLV8sZVtzXTwwKUk9YyxDPWcsUj1wO2Vsc2UgaWYoYT1zLDA9PT1lW3NdPyh5PUtlKC1nLC1wLGMsQSksbi5zZXQocyx2LTEseVswXSksbi5zZXQocyx2LHlbMV0pKTooZj1uLmdldChzLHMrMSksbT1uLmdldChzKzEscyksdz0ocltzXS1fKSoocltzXS1fKStlW3NdKmVbc10tQSpBLGQ9MioocltzXS1fKSpBLDA9PT13JiYwPT09ZCYmKHc9RSpqKihNYXRoLmFicyhjKStNYXRoLmFicyhBKStNYXRoLmFicyhmKStNYXRoLmFicyhtKStNYXRoLmFicyhJKSkpLHk9S2UoZipDLUkqZytBKnAsZipSLUkqcC1BKmcsdyxkKSxuLnNldChzLHYtMSx5WzBdKSxuLnNldChzLHYseVsxXSksTWF0aC5hYnMoZik+TWF0aC5hYnMoSSkrTWF0aC5hYnMoQSk/KG4uc2V0KHMrMSx2LTEsKC1nLWMqbi5nZXQocyx2LTEpK0Eqbi5nZXQocyx2KSkvZiksbi5zZXQocysxLHYsKC1wLWMqbi5nZXQocyx2KS1BKm4uZ2V0KHMsdi0xKSkvZikpOih5PUtlKC1DLW0qbi5nZXQocyx2LTEpLC1SLW0qbi5nZXQocyx2KSxJLEEpLG4uc2V0KHMrMSx2LTEseVswXSksbi5zZXQocysxLHYseVsxXSkpKSxsPU1hdGgubWF4KE1hdGguYWJzKG4uZ2V0KHMsdi0xKSksTWF0aC5hYnMobi5nZXQocyx2KSkpLEUqbCpsPjEpZm9yKGk9cztpPD12O2krKyluLnNldChpLHYtMSxuLmdldChpLHYtMSkvbCksbi5zZXQoaSx2LG4uZ2V0KGksdikvbCl9Zm9yKHM9MDtzPHQ7cysrKWlmKHM8TXx8cz54KWZvcihpPXM7aTx0O2krKylvLnNldChzLGksbi5nZXQocyxpKSk7Zm9yKGk9dC0xO2k+PU07aS0tKWZvcihzPU07czw9eDtzKyspe2ZvcihJPTAsdT1NO3U8PU1hdGgubWluKGkseCk7dSsrKUkrPW8uZ2V0KHMsdSkqbi5nZXQodSxpKTtvLnNldChzLGksSSl9fShzLGEsdSxpLHQpfXRoaXMubj1zLHRoaXMuZT1hLHRoaXMuZD11LHRoaXMuVj1pfWdldCByZWFsRWlnZW52YWx1ZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmQpfWdldCBpbWFnaW5hcnlFaWdlbnZhbHVlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZSl9Z2V0IGVpZ2VudmVjdG9yTWF0cml4KCl7cmV0dXJuIHRoaXMuVn1nZXQgZGlhZ29uYWxNYXRyaXgoKXtsZXQgdCxlLHI9dGhpcy5uLG89dGhpcy5lLG49dGhpcy5kLHM9bmV3IHFlKHIscik7Zm9yKHQ9MDt0PHI7dCsrKXtmb3IoZT0wO2U8cjtlKyspcy5zZXQodCxlLDApO3Muc2V0KHQsdCxuW3RdKSxvW3RdPjA/cy5zZXQodCx0KzEsb1t0XSk6b1t0XTwwJiZzLnNldCh0LHQtMSxvW3RdKX1yZXR1cm4gc319ZnVuY3Rpb24gS2UodCxlLHIsbyl7bGV0IG4scztyZXR1cm4gTWF0aC5hYnMocik+TWF0aC5hYnMobyk/KG49by9yLHM9cituKm8sWyh0K24qZSkvcywoZS1uKnQpL3NdKToobj1yL28scz1vK24qcixbKG4qdCtlKS9zLChuKmUtdCkvc10pfWNsYXNzIFdle2NvbnN0cnVjdG9yKHQsZT17fSl7dD1VZS5jaGVja01hdHJpeCh0KTtsZXR7WTpyfT1lO2NvbnN0e3NjYWxlU2NvcmVzOm89ITEsbWF4SXRlcmF0aW9uczpuPTFlMyx0ZXJtaW5hdGlvbkNyaXRlcmlhOnM9MWUtMTB9PWU7bGV0IGk7aWYocil7aWYocj1BcnJheS5pc0FycmF5KHIpJiYibnVtYmVyIj09dHlwZW9mIHJbMF0/cWUuY29sdW1uVmVjdG9yKHIpOlVlLmNoZWNrTWF0cml4KHIpLHIucm93cyE9PXQucm93cyl0aHJvdyBuZXcgRXJyb3IoIlkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHJvd3MgYXMgWCIpO2k9ci5nZXRDb2x1bW5WZWN0b3IoMCl9ZWxzZSBpPXQuZ2V0Q29sdW1uVmVjdG9yKDApO2xldCB1LGEsaCxsLGM9MTtmb3IobGV0IGU9MDtlPG4mJmM+cztlKyspaD10LnRyYW5zcG9zZSgpLm1tdWwoaSkuZGl2KGkudHJhbnNwb3NlKCkubW11bChpKS5nZXQoMCwwKSksaD1oLmRpdihoLm5vcm0oKSksdT10Lm1tdWwoaCkuZGl2KGgudHJhbnNwb3NlKCkubW11bChoKS5nZXQoMCwwKSksZT4wJiYoYz11LmNsb25lKCkuc3ViKGwpLnBvdygyKS5zdW0oKSksbD11LmNsb25lKCkscj8oYT1yLnRyYW5zcG9zZSgpLm1tdWwodSkuZGl2KHUudHJhbnNwb3NlKCkubW11bCh1KS5nZXQoMCwwKSksYT1hLmRpdihhLm5vcm0oKSksaT1yLm1tdWwoYSkuZGl2KGEudHJhbnNwb3NlKCkubW11bChhKS5nZXQoMCwwKSkpOmk9dTtpZihyKXtsZXQgZT10LnRyYW5zcG9zZSgpLm1tdWwodSkuZGl2KHUudHJhbnNwb3NlKCkubW11bCh1KS5nZXQoMCwwKSk7ZT1lLmRpdihlLm5vcm0oKSk7bGV0IG89dC5jbG9uZSgpLnN1Yih1LmNsb25lKCkubW11bChlLnRyYW5zcG9zZSgpKSksbj1pLnRyYW5zcG9zZSgpLm1tdWwodSkuZGl2KHUudHJhbnNwb3NlKCkubW11bCh1KS5nZXQoMCwwKSkscz1yLmNsb25lKCkuc3ViKHUuY2xvbmUoKS5tdWxTKG4uZ2V0KDAsMCkpLm1tdWwoYS50cmFuc3Bvc2UoKSkpO3RoaXMudD11LHRoaXMucD1lLnRyYW5zcG9zZSgpLHRoaXMudz1oLnRyYW5zcG9zZSgpLHRoaXMucT1hLHRoaXMudT1pLHRoaXMucz11LnRyYW5zcG9zZSgpLm1tdWwodSksdGhpcy54UmVzaWR1YWw9byx0aGlzLnlSZXNpZHVhbD1zLHRoaXMuYmV0YXM9bn1lbHNlIHRoaXMudz1oLnRyYW5zcG9zZSgpLHRoaXMucz11LnRyYW5zcG9zZSgpLm1tdWwodSkuc3FydCgpLHRoaXMudD1vP3UuY2xvbmUoKS5kaXYodGhpcy5zLmdldCgwLDApKTp1LHRoaXMueFJlc2lkdWFsPXQuc3ViKHUubW11bChoLnRyYW5zcG9zZSgpKSl9fWNsYXNzIFhle2NvbnN0cnVjdG9yKHQsZT17fSl7aWYoITA9PT10KXtjb25zdCB0PWU7cmV0dXJuIHRoaXMuY2VudGVyPXQuY2VudGVyLHRoaXMuc2NhbGU9dC5zY2FsZSx0aGlzLm1lYW5zPXQubWVhbnMsdGhpcy5zdGRldnM9dC5zdGRldnMsdGhpcy5VPXFlLmNoZWNrTWF0cml4KHQuVSksdGhpcy5TPXQuUyx0aGlzLlI9dC5SLHZvaWQodGhpcy5leGNsdWRlZEZlYXR1cmVzPXQuZXhjbHVkZWRGZWF0dXJlc3x8W10pfXQ9bmV3IHFlKHQpO2NvbnN0e2lzQ292YXJpYW5jZU1hdHJpeDpyPSExLG1ldGhvZDpvPSJTVkQiLG5Db21wTklQQUxTOm49MixjZW50ZXI6cz0hMCxzY2FsZTppPSExLGlnbm9yZVplcm9WYXJpYW5jZTp1PSExfT1lO2lmKHRoaXMuY2VudGVyPXMsdGhpcy5zY2FsZT1pLHRoaXMubWVhbnM9bnVsbCx0aGlzLnN0ZGV2cz1udWxsLHRoaXMuZXhjbHVkZWRGZWF0dXJlcz1bXSxyKXRoaXMuX2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeCh0KTtlbHNlIHN3aXRjaCh0aGlzLl9hZGp1c3QodCx1KSxvKXtjYXNlImNvdmFyaWFuY2VNYXRyaXgiOntjb25zdCBlPW5ldyBEZSh0KS5tbXVsKHQpLmRpdih0LnJvd3MtMSk7dGhpcy5fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KGUpO2JyZWFrfWNhc2UiTklQQUxTIjp0aGlzLl9jb21wdXRlV2l0aE5JUEFMUyh0LG4pO2JyZWFrO2Nhc2UiU1ZEIjp7Y29uc3QgZT1uZXcgQmUodCx7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6ITEsY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzOiEwLGF1dG9UcmFuc3Bvc2U6ITB9KTt0aGlzLlU9ZS5yaWdodFNpbmd1bGFyVmVjdG9ycztjb25zdCByPWUuZGlhZ29uYWwsbz1bXTtmb3IoY29uc3QgZSBvZiByKW8ucHVzaChlKmUvKHQucm93cy0xKSk7dGhpcy5TPW87YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gbWV0aG9kOiAke299YCl9fXN0YXRpYyBsb2FkKHQpe2lmKCJzdHJpbmciIT10eXBlb2YgdC5uYW1lKXRocm93IG5ldyBUeXBlRXJyb3IoIm1vZGVsIG11c3QgaGF2ZSBhIG5hbWUgcHJvcGVydHkiKTtpZigiUENBIiE9PXQubmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgaW52YWxpZCBtb2RlbDogJHt0Lm5hbWV9YCk7cmV0dXJuIG5ldyBYZSghMCx0KX1wcmVkaWN0KHQsZT17fSl7Y29uc3R7bkNvbXBvbmVudHM6cj10aGlzLlUuY29sdW1uc309ZTtpZih0PW5ldyBxZSh0KSx0aGlzLmNlbnRlciYmKHQuc3ViUm93VmVjdG9yKHRoaXMubWVhbnMpLHRoaXMuc2NhbGUpKXtmb3IobGV0IGUgb2YgdGhpcy5leGNsdWRlZEZlYXR1cmVzKXQucmVtb3ZlQ29sdW1uKGUpO3QuZGl2Um93VmVjdG9yKHRoaXMuc3RkZXZzKX1sZXQgbz10Lm1tdWwodGhpcy5VKTtyZXR1cm4gby5zdWJNYXRyaXgoMCxvLnJvd3MtMSwwLHItMSl9aW52ZXJ0KHQpe2xldCBlPSh0PXFlLmNoZWNrTWF0cml4KHQpKS5tbXVsKHRoaXMuVS50cmFuc3Bvc2UoKSk7cmV0dXJuIHRoaXMuY2VudGVyJiYodGhpcy5zY2FsZSYmZS5tdWxSb3dWZWN0b3IodGhpcy5zdGRldnMpLGUuYWRkUm93VmVjdG9yKHRoaXMubWVhbnMpKSxlfWdldEV4cGxhaW5lZFZhcmlhbmNlKCl7bGV0IHQ9MDtmb3IoY29uc3QgZSBvZiB0aGlzLlMpdCs9ZTtyZXR1cm4gdGhpcy5TLm1hcCgoZT0+ZS90KSl9Z2V0Q3VtdWxhdGl2ZVZhcmlhbmNlKCl7bGV0IHQ9dGhpcy5nZXRFeHBsYWluZWRWYXJpYW5jZSgpO2ZvcihsZXQgZT0xO2U8dC5sZW5ndGg7ZSsrKXRbZV0rPXRbZS0xXTtyZXR1cm4gdH1nZXRFaWdlbnZlY3RvcnMoKXtyZXR1cm4gdGhpcy5VfWdldEVpZ2VudmFsdWVzKCl7cmV0dXJuIHRoaXMuU31nZXRTdGFuZGFyZERldmlhdGlvbnMoKXtyZXR1cm4gdGhpcy5TLm1hcCgodD0+TWF0aC5zcXJ0KHQpKSl9Z2V0TG9hZGluZ3MoKXtyZXR1cm4gdGhpcy5VLnRyYW5zcG9zZSgpfXRvSlNPTigpe3JldHVybntuYW1lOiJQQ0EiLGNlbnRlcjp0aGlzLmNlbnRlcixzY2FsZTp0aGlzLnNjYWxlLG1lYW5zOnRoaXMubWVhbnMsc3RkZXZzOnRoaXMuc3RkZXZzLFU6dGhpcy5VLFM6dGhpcy5TLGV4Y2x1ZGVkRmVhdHVyZXM6dGhpcy5leGNsdWRlZEZlYXR1cmVzfX1fYWRqdXN0KHQsZSl7aWYodGhpcy5jZW50ZXIpe2NvbnN0IHI9dC5tZWFuKCJjb2x1bW4iKSxvPXRoaXMuc2NhbGU/dC5zdGFuZGFyZERldmlhdGlvbigiY29sdW1uIix7bWVhbjpyfSk6bnVsbDtpZih0aGlzLm1lYW5zPXIsdC5zdWJSb3dWZWN0b3IociksdGhpcy5zY2FsZSl7Zm9yKGxldCByPTA7cjxvLmxlbmd0aDtyKyspaWYoMD09PW9bcl0pe2lmKCFlKXRocm93IG5ldyBSYW5nZUVycm9yKGBDYW5ub3Qgc2NhbGUgdGhlIGRhdGFzZXQgKHN0YW5kYXJkIGRldmlhdGlvbiBpcyB6ZXJvIGF0IGluZGV4ICR7cn1gKTt0LnJlbW92ZUNvbHVtbihyKSxvLnNwbGljZShyLDEpLHRoaXMuZXhjbHVkZWRGZWF0dXJlcy5wdXNoKHIpLHItLX10aGlzLnN0ZGV2cz1vLHQuZGl2Um93VmVjdG9yKG8pfX19X2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeCh0KXtjb25zdCBlPW5ldyBHZSh0LHthc3N1bWVTeW1tZXRyaWM6ITB9KTt0aGlzLlU9ZS5laWdlbnZlY3Rvck1hdHJpeCx0aGlzLlUuZmxpcFJvd3MoKSx0aGlzLlM9ZS5yZWFsRWlnZW52YWx1ZXMsdGhpcy5TLnJldmVyc2UoKX1fY29tcHV0ZVdpdGhOSVBBTFModCxlKXt0aGlzLlU9bmV3IHFlKGUsdC5jb2x1bW5zKSx0aGlzLlM9W107bGV0IHI9dDtmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT1uZXcgV2Uocik7dGhpcy5VLnNldFJvdyh0LGUudy50cmFuc3Bvc2UoKSksdGhpcy5TLnB1c2goTWF0aC5wb3coZS5zLmdldCgwLDApLDIpKSxyPWUueFJlc2lkdWFsfXRoaXMuVT10aGlzLlUudHJhbnNwb3NlKCl9fWZ1bmN0aW9uIEplKHQsZT17fSl7aWYoIWRlKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3QgZWZmLiBhcnJheSIpO2xldCByPUN0KGUsInNjYWxlIik7ZmUocil8fChyPSEwKTtsZXQgbz1DdChlLCJuQ29tcE5JUEFMUyIpO2NlKG8pfHwobz0yKTtsZXQgbj1sZShDdCh0LDAsW10pKTtpZigwPT09bil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZGltZW5zaW9uIG9mIGRhdGEiKTtpZihvPm4pdGhyb3cgbmV3IEVycm9yKCJuQ29tcE5JUEFMUyBpcyBtb3JlIHRoYW4gdGhlIGRpbWVuc2lvbiBvZiBkYXRhIik7bGV0IHM9bmV3IFhlKHQse21ldGhvZDoiTklQQUxTIixzY2FsZTpyLG5Db21wTklQQUxTOm99KSxpPXMucHJlZGljdCh0KTtyZXR1cm4gcy5pbnZlcnQoaSkudG9KU09OKCl9dmFyIFllPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoOysrcjxvJiYhMSE9PWUodFtyXSxyLHQpOyk7cmV0dXJuIHR9O3ZhciBaZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLG8pe2Zvcih2YXIgbj0tMSxzPU9iamVjdChlKSxpPW8oZSksdT1pLmxlbmd0aDt1LS07KXt2YXIgYT1pW3Q/dTorK25dO2lmKCExPT09cihzW2FdLGEscykpYnJlYWt9cmV0dXJuIGV9fSgpO3ZhciBIZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxvPUFycmF5KHQpOysrcjx0OylvW3JdPWUocik7cmV0dXJuIG99O3ZhciBRZT1mdW5jdGlvbih0KXtyZXR1cm4gZCh0KSYmIltvYmplY3QgQXJndW1lbnRzXSI9PXcodCl9LHRyPU9iamVjdC5wcm90b3R5cGUsZXI9dHIuaGFzT3duUHJvcGVydHkscnI9dHIucHJvcGVydHlJc0VudW1lcmFibGUsb3I9UWUoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9RZTpmdW5jdGlvbih0KXtyZXR1cm4gZCh0KSYmZXIuY2FsbCh0LCJjYWxsZWUiKSYmIXJyLmNhbGwodCwiY2FsbGVlIil9O3ZhciBucj1mdW5jdGlvbigpe3JldHVybiExfSxzcj1vKChmdW5jdGlvbih0LGUpe3ZhciByPWUmJiFlLm5vZGVUeXBlJiZlLG89ciYmdCYmIXQubm9kZVR5cGUmJnQsbj1vJiZvLmV4cG9ydHM9PT1yP2kuQnVmZmVyOnZvaWQgMCxzPShuP24uaXNCdWZmZXI6dm9pZCAwKXx8bnI7dC5leHBvcnRzPXN9KSksaXI9L14oPzowfFsxLTldXGQqKSQvO3ZhciB1cj1mdW5jdGlvbih0LGUpe3ZhciByPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT85MDA3MTk5MjU0NzQwOTkxOmUpJiYoIm51bWJlciI9PXJ8fCJzeW1ib2wiIT1yJiZpci50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9LGFyPXt9O2FyWyJbb2JqZWN0IEZsb2F0MzJBcnJheV0iXT1hclsiW29iamVjdCBGbG9hdDY0QXJyYXldIl09YXJbIltvYmplY3QgSW50OEFycmF5XSJdPWFyWyJbb2JqZWN0IEludDE2QXJyYXldIl09YXJbIltvYmplY3QgSW50MzJBcnJheV0iXT1hclsiW29iamVjdCBVaW50OEFycmF5XSJdPWFyWyJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSJdPWFyWyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPWFyWyJbb2JqZWN0IFVpbnQzMkFycmF5XSJdPSEwLGFyWyJbb2JqZWN0IEFyZ3VtZW50c10iXT1hclsiW29iamVjdCBBcnJheV0iXT1hclsiW29iamVjdCBBcnJheUJ1ZmZlcl0iXT1hclsiW29iamVjdCBCb29sZWFuXSJdPWFyWyJbb2JqZWN0IERhdGFWaWV3XSJdPWFyWyJbb2JqZWN0IERhdGVdIl09YXJbIltvYmplY3QgRXJyb3JdIl09YXJbIltvYmplY3QgRnVuY3Rpb25dIl09YXJbIltvYmplY3QgTWFwXSJdPWFyWyJbb2JqZWN0IE51bWJlcl0iXT1hclsiW29iamVjdCBPYmplY3RdIl09YXJbIltvYmplY3QgUmVnRXhwXSJdPWFyWyJbb2JqZWN0IFNldF0iXT1hclsiW29iamVjdCBTdHJpbmddIl09YXJbIltvYmplY3QgV2Vha01hcF0iXT0hMTt2YXIgaHI9ZnVuY3Rpb24odCl7cmV0dXJuIGQodCkmJkd0KHQubGVuZ3RoKSYmISFhclt3KHQpXX07dmFyIGxyPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19LGNyPW8oKGZ1bmN0aW9uKHQsZSl7dmFyIHI9ZSYmIWUubm9kZVR5cGUmJmUsbz1yJiZ0JiYhdC5ub2RlVHlwZSYmdCxzPW8mJm8uZXhwb3J0cz09PXImJm4ucHJvY2VzcyxpPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW8mJm8ucmVxdWlyZSYmby5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fHMmJnMuYmluZGluZyYmcy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKTt0LmV4cG9ydHM9aX0pKSxmcj1jciYmY3IuaXNUeXBlZEFycmF5LG1yPWZyP2xyKGZyKTpocixncj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBwcj1mdW5jdGlvbihlLHIpe3ZhciBvPXQoZSksbj0hbyYmb3IoZSkscz0hbyYmIW4mJnNyKGUpLGk9IW8mJiFuJiYhcyYmbXIoZSksdT1vfHxufHxzfHxpLGE9dT9IZShlLmxlbmd0aCxTdHJpbmcpOltdLGg9YS5sZW5ndGg7Zm9yKHZhciBsIGluIGUpIXImJiFnci5jYWxsKGUsbCl8fHUmJigibGVuZ3RoIj09bHx8cyYmKCJvZmZzZXQiPT1sfHwicGFyZW50Ij09bCl8fGkmJigiYnVmZmVyIj09bHx8ImJ5dGVMZW5ndGgiPT1sfHwiYnl0ZU9mZnNldCI9PWwpfHx1cihsLGgpKXx8YS5wdXNoKGwpO3JldHVybiBhfTt2YXIgd3I9ZnVuY3Rpb24odCl7cmV0dXJuIEt0KHQpP3ByKHQpOk90KHQpfTt2YXIgZHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocixvKXtpZihudWxsPT1yKXJldHVybiByO2lmKCFLdChyKSlyZXR1cm4gdChyLG8pO2Zvcih2YXIgbj1yLmxlbmd0aCxzPWU/bjotMSxpPU9iamVjdChyKTsoZT9zLS06KytzPG4pJiYhMSE9PW8oaVtzXSxzLGkpOyk7cmV0dXJuIHJ9fSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmWmUodCxlLHdyKX0pKTt2YXIgYnI9ZnVuY3Rpb24odCl7cmV0dXJuIHR9O3ZhciB5cj1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OmJyfTt2YXIgdnI9ZnVuY3Rpb24oZSxyKXtyZXR1cm4odChlKT9ZZTpkcikoZSx5cihyKSl9O3ZhciBNcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IG50LHRoaXMuc2l6ZT0wfTt2YXIgeHI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLHJ9O3ZhciBFcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9O3ZhciBTcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O3ZhciBqcj1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187aWYociBpbnN0YW5jZW9mIG50KXt2YXIgbz1yLl9fZGF0YV9fO2lmKCFzdHx8by5sZW5ndGg8MTk5KXJldHVybiBvLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK3Iuc2l6ZSx0aGlzO3I9dGhpcy5fX2RhdGFfXz1uZXcgZ3Qobyl9cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplPXIuc2l6ZSx0aGlzfTtmdW5jdGlvbiBfcih0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBudCh0KTt0aGlzLnNpemU9ZS5zaXplfV9yLnByb3RvdHlwZS5jbGVhcj1Ncixfci5wcm90b3R5cGUuZGVsZXRlPXhyLF9yLnByb3RvdHlwZS5nZXQ9RXIsX3IucHJvdG90eXBlLmhhcz1Tcixfci5wcm90b3R5cGUuc2V0PWpyO3ZhciBBcj1fcjt2YXIgQ3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iKSx0aGlzfTt2YXIgUnI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfTtmdW5jdGlvbiBJcih0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgZ3Q7KytlPHI7KXRoaXMuYWRkKHRbZV0pfUlyLnByb3RvdHlwZS5hZGQ9SXIucHJvdG90eXBlLnB1c2g9Q3IsSXIucHJvdG90eXBlLmhhcz1Scjt2YXIga3I9SXI7dmFyIE5yPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoOysrcjxvOylpZihlKHRbcl0scix0KSlyZXR1cm4hMDtyZXR1cm4hMX07dmFyIE9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaGFzKGUpfTt2YXIgRnI9ZnVuY3Rpb24odCxlLHIsbyxuLHMpe3ZhciBpPTEmcix1PXQubGVuZ3RoLGE9ZS5sZW5ndGg7aWYodSE9YSYmIShpJiZhPnUpKXJldHVybiExO3ZhciBoPXMuZ2V0KHQpLGw9cy5nZXQoZSk7aWYoaCYmbClyZXR1cm4gaD09ZSYmbD09dDt2YXIgYz0tMSxmPSEwLG09MiZyP25ldyBrcjp2b2lkIDA7Zm9yKHMuc2V0KHQsZSkscy5zZXQoZSx0KTsrK2M8dTspe3ZhciBnPXRbY10scD1lW2NdO2lmKG8pdmFyIHc9aT9vKHAsZyxjLGUsdCxzKTpvKGcscCxjLHQsZSxzKTtpZih2b2lkIDAhPT13KXtpZih3KWNvbnRpbnVlO2Y9ITE7YnJlYWt9aWYobSl7aWYoIU5yKGUsKGZ1bmN0aW9uKHQsZSl7aWYoIU9yKG0sZSkmJihnPT09dHx8bihnLHQscixvLHMpKSlyZXR1cm4gbS5wdXNoKGUpfSkpKXtmPSExO2JyZWFrfX1lbHNlIGlmKGchPT1wJiYhbihnLHAscixvLHMpKXtmPSExO2JyZWFrfX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSksZn0senI9aS5VaW50OEFycmF5O3ZhciBUcj1mdW5jdGlvbih0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxvKXtyWysrZV09W28sdF19KSkscn07dmFyIFZyPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLHI9QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtyWysrZV09dH0pKSxyfSxQcj11P3UucHJvdG90eXBlOnZvaWQgMCxxcj1Qcj9Qci52YWx1ZU9mOnZvaWQgMDt2YXIgJHI9ZnVuY3Rpb24odCxlLHIsbyxuLHMsaSl7c3dpdGNoKHIpe2Nhc2UiW29iamVjdCBEYXRhVmlld10iOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSJbb2JqZWN0IEFycmF5QnVmZmVyXSI6cmV0dXJuISh0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8IXMobmV3IHpyKHQpLG5ldyB6cihlKSkpO2Nhc2UiW29iamVjdCBCb29sZWFuXSI6Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuIFkoK3QsK2UpO2Nhc2UiW29iamVjdCBFcnJvcl0iOnJldHVybiB0Lm5hbWU9PWUubmFtZSYmdC5tZXNzYWdlPT1lLm1lc3NhZ2U7Y2FzZSJbb2JqZWN0IFJlZ0V4cF0iOmNhc2UiW29iamVjdCBTdHJpbmddIjpyZXR1cm4gdD09ZSsiIjtjYXNlIltvYmplY3QgTWFwXSI6dmFyIHU9VHI7Y2FzZSJbb2JqZWN0IFNldF0iOnZhciBhPTEmbztpZih1fHwodT1WciksdC5zaXplIT1lLnNpemUmJiFhKXJldHVybiExO3ZhciBoPWkuZ2V0KHQpO2lmKGgpcmV0dXJuIGg9PWU7b3w9MixpLnNldCh0LGUpO3ZhciBsPUZyKHUodCksdShlKSxvLG4scyxpKTtyZXR1cm4gaS5kZWxldGUodCksbDtjYXNlIltvYmplY3QgU3ltYm9sXSI6aWYocXIpcmV0dXJuIHFyLmNhbGwodCk9PXFyLmNhbGwoZSl9cmV0dXJuITF9O3ZhciBEcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxvPWUubGVuZ3RoLG49dC5sZW5ndGg7KytyPG87KXRbbityXT1lW3JdO3JldHVybiB0fTt2YXIgVXI9ZnVuY3Rpb24oZSxyLG8pe3ZhciBuPXIoZSk7cmV0dXJuIHQoZSk/bjpEcihuLG8oZSkpfTt2YXIgTHI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGgsbj0wLHM9W107KytyPG87KXt2YXIgaT10W3JdO2UoaSxyLHQpJiYoc1tuKytdPWkpfXJldHVybiBzfTt2YXIgQnI9ZnVuY3Rpb24oKXtyZXR1cm5bXX0sR3I9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxLcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFdyPUtyP2Z1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOih0PU9iamVjdCh0KSxMcihLcih0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIEdyLmNhbGwodCxlKX0pKSl9OkJyO3ZhciBYcj1mdW5jdGlvbih0KXtyZXR1cm4gVXIodCx3cixXcil9LEpyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIFlyPWZ1bmN0aW9uKHQsZSxyLG8sbixzKXt2YXIgaT0xJnIsdT1Ycih0KSxhPXUubGVuZ3RoO2lmKGEhPVhyKGUpLmxlbmd0aCYmIWkpcmV0dXJuITE7Zm9yKHZhciBoPWE7aC0tOyl7dmFyIGw9dVtoXTtpZighKGk/bCBpbiBlOkpyLmNhbGwoZSxsKSkpcmV0dXJuITF9dmFyIGM9cy5nZXQodCksZj1zLmdldChlKTtpZihjJiZmKXJldHVybiBjPT1lJiZmPT10O3ZhciBtPSEwO3Muc2V0KHQsZSkscy5zZXQoZSx0KTtmb3IodmFyIGc9aTsrK2g8YTspe3ZhciBwPXRbbD11W2hdXSx3PWVbbF07aWYobyl2YXIgZD1pP28odyxwLGwsZSx0LHMpOm8ocCx3LGwsdCxlLHMpO2lmKCEodm9pZCAwPT09ZD9wPT09d3x8bihwLHcscixvLHMpOmQpKXttPSExO2JyZWFrfWd8fChnPSJjb25zdHJ1Y3RvciI9PWwpfWlmKG0mJiFnKXt2YXIgYj10LmNvbnN0cnVjdG9yLHk9ZS5jb25zdHJ1Y3RvcjtiPT15fHwhKCJjb25zdHJ1Y3RvciJpbiB0KXx8ISgiY29uc3RydWN0b3IiaW4gZSl8fCJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiIGluc3RhbmNlb2YgYiYmImZ1bmN0aW9uIj09dHlwZW9mIHkmJnkgaW5zdGFuY2VvZiB5fHwobT0hMSl9cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLG19LFpyPSJbb2JqZWN0IE9iamVjdF0iLEhyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIFFyPWZ1bmN0aW9uKGUscixvLG4scyxpKXt2YXIgdT10KGUpLGE9dChyKSxoPXU/IltvYmplY3QgQXJyYXldIjpCdChlKSxsPWE/IltvYmplY3QgQXJyYXldIjpCdChyKSxjPShoPSJbb2JqZWN0IEFyZ3VtZW50c10iPT1oP1pyOmgpPT1acixmPShsPSJbb2JqZWN0IEFyZ3VtZW50c10iPT1sP1pyOmwpPT1acixtPWg9PWw7aWYobSYmc3IoZSkpe2lmKCFzcihyKSlyZXR1cm4hMTt1PSEwLGM9ITF9aWYobSYmIWMpcmV0dXJuIGl8fChpPW5ldyBBciksdXx8bXIoZSk/RnIoZSxyLG8sbixzLGkpOiRyKGUscixoLG8sbixzLGkpO2lmKCEoMSZvKSl7dmFyIGc9YyYmSHIuY2FsbChlLCJfX3dyYXBwZWRfXyIpLHA9ZiYmSHIuY2FsbChyLCJfX3dyYXBwZWRfXyIpO2lmKGd8fHApe3ZhciB3PWc/ZS52YWx1ZSgpOmUsZD1wP3IudmFsdWUoKTpyO3JldHVybiBpfHwoaT1uZXcgQXIpLHModyxkLG8sbixpKX19cmV0dXJuISFtJiYoaXx8KGk9bmV3IEFyKSxZcihlLHIsbyxuLHMsaSkpfTt2YXIgdG89ZnVuY3Rpb24gdChlLHIsbyxuLHMpe3JldHVybiBlPT09cnx8KG51bGw9PWV8fG51bGw9PXJ8fCFkKGUpJiYhZChyKT9lIT1lJiZyIT1yOlFyKGUscixvLG4sdCxzKSl9O3ZhciBlbz1mdW5jdGlvbih0LGUscixvKXt2YXIgbj1yLmxlbmd0aCxzPW4saT0hbztpZihudWxsPT10KXJldHVybiFzO2Zvcih0PU9iamVjdCh0KTtuLS07KXt2YXIgdT1yW25dO2lmKGkmJnVbMl0/dVsxXSE9PXRbdVswXV06ISh1WzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK248czspe3ZhciBhPSh1PXJbbl0pWzBdLGg9dFthXSxsPXVbMV07aWYoaSYmdVsyXSl7aWYodm9pZCAwPT09aCYmIShhIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGM9bmV3IEFyO2lmKG8pdmFyIGY9byhoLGwsYSx0LGUsYyk7aWYoISh2b2lkIDA9PT1mP3RvKGwsaCwzLG8sYyk6ZikpcmV0dXJuITF9fXJldHVybiEwfTt2YXIgcm89ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PXQmJiF4KHQpfTt2YXIgb289ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXdyKHQpLHI9ZS5sZW5ndGg7ci0tOyl7dmFyIG89ZVtyXSxuPXRbb107ZVtyXT1bbyxuLHJvKG4pXX1yZXR1cm4gZX07dmFyIG5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBudWxsIT1yJiYoclt0XT09PWUmJih2b2lkIDAhPT1lfHx0IGluIE9iamVjdChyKSkpfX07dmFyIHNvPWZ1bmN0aW9uKHQpe3ZhciBlPW9vKHQpO3JldHVybiAxPT1lLmxlbmd0aCYmZVswXVsyXT9ubyhlWzBdWzBdLGVbMF1bMV0pOmZ1bmN0aW9uKHIpe3JldHVybiByPT09dHx8ZW8ocix0LGUpfX07dmFyIGlvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJmUgaW4gT2JqZWN0KHQpfTt2YXIgdW89ZnVuY3Rpb24oZSxyLG8pe2Zvcih2YXIgbj0tMSxzPShyPWp0KHIsZSkpLmxlbmd0aCxpPSExOysrbjxzOyl7dmFyIHU9X3QocltuXSk7aWYoIShpPW51bGwhPWUmJm8oZSx1KSkpYnJlYWs7ZT1lW3VdfXJldHVybiBpfHwrK24hPXM/aTohIShzPW51bGw9PWU/MDplLmxlbmd0aCkmJkd0KHMpJiZ1cih1LHMpJiYodChlKXx8b3IoZSkpfTt2YXIgYW89ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmdW8odCxlLGlvKX07dmFyIGhvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE0odCkmJnJvKGUpP25vKF90KHQpLGUpOmZ1bmN0aW9uKHIpe3ZhciBvPUN0KHIsdCk7cmV0dXJuIHZvaWQgMD09PW8mJm89PT1lP2FvKHIsdCk6dG8oZSxvLDMpfX07dmFyIGxvPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gQXQoZSx0KX19O3ZhciBjbz1mdW5jdGlvbih0KXtyZXR1cm4gTSh0KT9YdChfdCh0KSk6bG8odCl9O3ZhciBmbz1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGw9PWU/YnI6Im9iamVjdCI9PXR5cGVvZiBlP3QoZSk/aG8oZVswXSxlWzFdKTpzbyhlKTpjbyhlKX07dmFyIG1vPWZ1bmN0aW9uKHQsZSl7dmFyIHI9LTEsbz1LdCh0KT9BcnJheSh0Lmxlbmd0aCk6W107cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQsbixzKXtvWysrcl09ZSh0LG4scyl9KSksb307dmFyIGdvPWZ1bmN0aW9uKGUscil7cmV0dXJuKHQoZSk/dnQ6bW8pKGUsZm8ocikpfTt2YXIgcG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gdnQoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9O3ZhciB3bz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXTpwbyh0LHdyKHQpKX07ZnVuY3Rpb24gYm8odCl7cmV0dXJuISghcGUodCl8fCIiPT09dCl9ZnVuY3Rpb24geW8odCxlKXtpZighZ2UodCkpcmV0dXJue307aWYoIWRlKGUpKXJldHVybnt9O2xldCByPXt9O3JldHVybiB2cihlLChmdW5jdGlvbihlKXsoZnVuY3Rpb24odCxlKXtyZXR1cm4hIWdlKHQpJiYhIWJvKGUpJiZlIGluIHR9KSh0LGUpJiYocltlXT1DdCh0LGUpKX0pKSxyfWZ1bmN0aW9uIHZvKHQpe2xldCBlPSExO3JldHVybiBibyh0KT9lPSFpc05hTihOdW1iZXIodCkpOmZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KSYmKGU9ITApLGV9dmFyIE1vPS9ccy87dmFyIHhvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJk1vLnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9LEVvPS9eXHMrLzt2YXIgU289ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dC5zbGljZSgwLHhvKHQpKzEpLnJlcGxhY2UoRW8sIiIpOnR9LGpvPS9eWy0rXTB4WzAtOWEtZl0rJC9pLF9vPS9eMGJbMDFdKyQvaSxBbz0vXjBvWzAtN10rJC9pLENvPXBhcnNlSW50O3ZhciBSbz1mdW5jdGlvbih0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoYih0KSlyZXR1cm4gTmFOO2lmKHgodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PXgoZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PVNvKHQpO3ZhciByPV9vLnRlc3QodCk7cmV0dXJuIHJ8fEFvLnRlc3QodCk/Q28odC5zbGljZSgyKSxyPzI6OCk6am8udGVzdCh0KT9OYU46K3R9O3ZhciBJbz1mdW5jdGlvbih0KXtyZXR1cm4gdD9JbmZpbml0eT09PSh0PVJvKHQpKXx8LUluZmluaXR5PT09dD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9O3ZhciBrbz1mdW5jdGlvbih0KXt2YXIgZT1Jbyh0KSxyPWUlMTtyZXR1cm4gZT09ZT9yP2UtcjplOjB9LE5vPWkuaXNGaW5pdGUsT289TWF0aC5taW47dmFyIEZvPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGhbdF07cmV0dXJuIGZ1bmN0aW9uKHQscil7aWYodD1Sbyh0KSwocj1udWxsPT1yPzA6T28oa28ociksMjkyKSkmJk5vKHQpKXt2YXIgbz0oU3QodCkrImUiKS5zcGxpdCgiZSIpLG49ZShvWzBdKyJlIisoK29bMV0rcikpO3JldHVybisoKG89KFN0KG4pKyJlIikuc3BsaXQoImUiKSlbMF0rImUiKygrb1sxXS1yKSl9cmV0dXJuIGUodCl9fSgicm91bmQiKTtmdW5jdGlvbiB6byh0KXtpZighdm8odCkpcmV0dXJuIDA7dD1mdW5jdGlvbih0KXtyZXR1cm4gdm8odCk/SW8odCk6MH0odCk7bGV0IGU9Rm8odCk7cmV0dXJuIjAiPT09U3RyaW5nKGUpPzA6ZX12YXIgVG89QXJyYXkucHJvdG90eXBlLmpvaW47dmFyIFZvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/IiI6VG8uY2FsbCh0LGUpfTtjbGFzcyBQb3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmdldENvc3Q9KCk9PnRoaXMuRWxlbWVudHMubWFwKCh0PT50LkRpc3RhbmNlRnJvbU1lZG9pZCkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCksdGhpcy5maW5kQmVzdE1lZG9pZElkeD10PT50aGlzLkVsZW1lbnRzLm1hcCgoZT0+dGhpcy5jYWxjQ29zdEZvckdpdmVuRWxlbWVudEFzTWVkb2lkKGUsdCkpKS5yZWR1Y2UoKCh0LGUscixvKT0+ZS5Db3N0SWZNYWRlTWVkb2lkPG9bdF0uQ29zdElmTWFkZU1lZG9pZD9yOnQpLDApLHRoaXMuY2FsY0Nvc3RGb3JHaXZlbkVsZW1lbnRBc01lZG9pZD0odCxlKT0+KHtDb3N0SWZNYWRlTWVkb2lkOm5ldyBQbyh7RWxlbWVudHM6dGhpcy5FbGVtZW50cy5tYXAoKHI9Pih7RGlzdGFuY2VGcm9tTWVkb2lkOmUoci5FbGVtZW50LHQuRWxlbWVudCksRWxlbWVudDpyLkVsZW1lbnR9KSkpLE1lZG9pZDp0LkVsZW1lbnR9KS5nZXRDb3N0KCksRWxlbWVudDp0fSksdGhpcy5FbGVtZW50cz10LkVsZW1lbnRzLHRoaXMuTWVkb2lkPXQuTWVkb2lkfX12YXIgcW89UG8sJG89T2JqZWN0LmRlZmluZVByb3BlcnR5KHtDbHVzdGVyOnFvfSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksRG89T2JqZWN0LmRlZmluZVByb3BlcnR5KHtkaXN0YW5jZToodCxlKT0+e2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgaW5wdXRzIG11c3QgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24iKTtjb25zdCByPUFycmF5LmZyb20odC5rZXlzKCkpLm1hcCgocj0+TWF0aC5wb3coTWF0aC5hYnModFtyXS1lW3JdKSwyKSkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCk7cmV0dXJuIE1hdGguc3FydChyKX19LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxVbz1PYmplY3QuZGVmaW5lUHJvcGVydHkoe2tHdEVsZW1lbnRBcnJMZW5ndGg6ImsgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkifSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y2xhc3MgTG97Y29uc3RydWN0b3IodCxlLHIpe3RoaXMuRWxlbWVudHM9dCx0aGlzLks9ZSx0aGlzLkRpc3RhbmNlRm49cix0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZD0hMSx0aGlzLml0ZXJhdGU9KCk9Pnt0aGlzLkl0ZXJhdGlvbkNvdW50KyssdGhpcy5DbHVzdGVyc3x8dGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHQ9dGhpcy5NZWRvaWRzLGU9dGhpcy5DbHVzdGVycyxyPXRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTtsZXQgbz1yO2ZvcihsZXQgdD0wO3Q8dGhpcy5NZWRvaWRzLmxlbmd0aDt0Kyspe2NvbnN0IGU9dD0+MD09PXRoaXMuTWVkb2lkcy5maWx0ZXIoKGU9PjA9PT10aGlzLkRpc3RhbmNlRm4odCxlKSkpLmxlbmd0aDtmb3IoY29uc3QgciBvZiB0aGlzLkVsZW1lbnRzLmZpbHRlcihlKSl7Y29uc3QgZT10aGlzLk1lZG9pZHMuc2xpY2UoKTtlW3RdPXI7Y29uc3Qgbj1uZXcgTG8odGhpcy5FbGVtZW50cy5zbGljZSgpLHRoaXMuSyx0aGlzLkRpc3RhbmNlRm4pO24uTWVkb2lkcz1lLG4uYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHMoKTtjb25zdCBzPW4uY2FsY3VsYXRlQ3VycmVudENvc3QoKTtzPG8mJihvPXMsdGhpcy5DbHVzdGVycz1uLkNsdXN0ZXJzLHRoaXMuTWVkb2lkcz1lKX19cmV0dXJuIHRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTxyfHwodGhpcy5DbHVzdGVycz1lLHRoaXMuTWVkb2lkcz10LHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSEwLCExKX0sdGhpcy5nZXRDbHVzdGVyZWREYXRhPSgpPT4odGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWR8fHRoaXMucnVuVG9Db21wbGV0aW9uKCksdGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuRWxlbWVudHMubWFwKCh0PT50LkVsZW1lbnQpKSkpKSx0aGlzLnJ1blRvQ29tcGxldGlvbj0oKT0+e2Zvcig7dGhpcy5pdGVyYXRlKCk7KTt9LHRoaXMuYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHM9KCk9Pnt0aGlzLkNsdXN0ZXJzPW5ldyBBcnJheSx0aGlzLk1lZG9pZHMuZm9yRWFjaCgodD0+e3RoaXMuQ2x1c3RlcnMucHVzaChuZXcgJG8uQ2x1c3Rlcih7RWxlbWVudHM6W10sTWVkb2lkOnR9KSl9KSksdGhpcy5FbGVtZW50cy5mb3JFYWNoKCgodCxlKT0+e2NvbnN0IHI9dGhpcy5maW5kRGlzdGFuY2VzKHRoaXMuQ2x1c3RlcnMubWFwKCh0PT50Lk1lZG9pZCkpLHQpLG89ci5yZWR1Y2UoKCh0LGUscixvKT0+ZTxvW3RdP3I6dCksMCk7dGhpcy5DbHVzdGVyc1tvXS5FbGVtZW50cy5wdXNoKHtEaXN0YW5jZUZyb21NZWRvaWQ6cltvXSxFbGVtZW50OnR9KX0pKX0sdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdD0oKT0+dGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuZ2V0Q29zdCgpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmREaXN0YW5jZXM9KHQsZSk9PnQubWFwKCh0PT50aGlzLkRpc3RhbmNlRm4odCxlKSkpLHRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHM9KCk9PntpZih0aGlzLks+PXRoaXMuRWxlbWVudHMubGVuZ3RoKXRocm93IFVvLmtHdEVsZW1lbnRBcnJMZW5ndGg7Y29uc3QgdD1bXSxlPSh0LGUpPT57Zm9yKGNvbnN0IHIgb2YgZSlpZigwPT09dGhpcy5EaXN0YW5jZUZuKHIsdCkpcmV0dXJuITE7cmV0dXJuITB9O2xldCByPTA7Zm9yKDtyPHRoaXMuRWxlbWVudHMubGVuZ3RoJiZ0Lmxlbmd0aDx0aGlzLks7KWUodGhpcy5FbGVtZW50c1tyXSx0KSYmdC5wdXNoKHRoaXMuRWxlbWVudHNbcl0pLHIrKztyZXR1cm4gdH0sdGhpcy5EaXN0YW5jZUZuPXRoaXMuRGlzdGFuY2VGbnx8RG8uZGlzdGFuY2UsdGhpcy5NZWRvaWRzPXRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHMoKSx0aGlzLkl0ZXJhdGlvbkNvdW50PTB9Z2V0IE9wdGltaXNhdGlvblN0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5JdGVyYXRpb25Db3VudD4wfX1Mby5jbHVzdGVyRWxlbWVudHM9KHQsZSxyKT0+e0xvLmdldEluc3RhbmNlKHQsZSxyKTtyZXR1cm4gbmV3IEFycmF5fSxMby5nZXRJbnN0YW5jZT0odCxlLHIpPT5uZXcgTG8odCxlLHIpO3ZhciBCbz1MbyxHbz1PYmplY3QuZGVmaW5lUHJvcGVydHkoe0NsdXN0ZXJlcjpCb30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLEtvPXIobygoZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQpe2Zvcih2YXIgciBpbiB0KWUuaGFzT3duUHJvcGVydHkocil8fChlW3JdPXRbcl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxyKCRvKSxyKEdvKX0pKSk7ZnVuY3Rpb24gV28odCxlKXtsZXQgcj0wO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXIrPSh0W29dLWVbb10pKih0W29dLWVbb10pO3JldHVybiByfWNvbnN0IFhvPXtkaXN0YW5jZUZ1bmN0aW9uOldvfTtmdW5jdGlvbiBKbyh0LGUscj1Ybyl7Y29uc3Qgbz1yLmRpc3RhbmNlRnVuY3Rpb258fFhvLmRpc3RhbmNlRnVuY3Rpb24sbj1yLnNpbWlsYXJpdHlGdW5jdGlvbnx8WG8uc2ltaWxhcml0eUZ1bmN0aW9uO2xldCBzPS0xO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXtsZXQgcj1OdW1iZXIuTUlOX1ZBTFVFO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBpPW4oZSx0W29dKTtpPnImJihyPWkscz1vKX19ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbyl0aHJvdyBuZXcgRXJyb3IoIkEgc2ltaWxhcml0eSBvciBkaXN0YW5jZSBmdW5jdGlvbiBpdCdzIHJlcXVpcmVkIik7e2xldCByPU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9byhlLHRbbl0pO2k8ciYmKHI9aSxzPW4pfX19cmV0dXJuIHN9ZnVuY3Rpb24gWW8odCxlLHIsbyl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspcltuXT1KbyhlLHRbbl0se2Rpc3RhbmNlRnVuY3Rpb246b30pO3JldHVybiByfWZ1bmN0aW9uIFpvKHQsZSl7Y29uc3Qgcj02NTUzNSYodD4+Pj0wKTtyZXR1cm4oKHQtcikqKGU+Pj49MCk+Pj4wKStyKmU+Pj4wfWNsYXNzIEhve2NvbnN0cnVjdG9yKHQ9RGF0ZS5ub3coKSl7dGhpcy5zdGF0ZT1uZXcgVWludDMyQXJyYXkoNCksdGhpcy5pbml0KHQpLHRoaXMucmFuZG9tPXRoaXMuZ2V0RmxvYXQuYmluZCh0aGlzKX1nZXRVaW50MzIoKXtyZXR1cm4gdGhpcy5uZXh0U3RhdGUoKSx0aGlzLnN0YXRlWzNdK3RoaXMuc3RhdGVbMl0+Pj4wfWdldEZsb2F0KCl7cmV0dXJuIDUuOTYwNDY0NDc3NTM5MDYzZS04Kih0aGlzLmdldFVpbnQzMigpPj4+OCl9aW5pdCh0KXtpZighTnVtYmVyLmlzSW50ZWdlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzZWVkIG11c3QgYmUgYW4gaW50ZWdlciIpO3RoaXMuc3RhdGVbMF09dCx0aGlzLnN0YXRlWzFdPTAsdGhpcy5zdGF0ZVsyXT0wLHRoaXMuc3RhdGVbM109MDtmb3IobGV0IHQ9MTt0PDg7dCsrKXRoaXMuc3RhdGVbMyZ0XV49dCtabygxODEyNDMzMjUzLHRoaXMuc3RhdGVbdC0xJjNdXnRoaXMuc3RhdGVbdC0xJjNdPj4+MzA+Pj4wKT4+PjA7dGhpcy5wZXJpb2RDZXJ0aWZpY2F0aW9uKCk7Zm9yKGxldCB0PTA7dDw4O3QrKyl0aGlzLm5leHRTdGF0ZSgpfXBlcmlvZENlcnRpZmljYXRpb24oKXswPT09dGhpcy5zdGF0ZVswXSYmMD09PXRoaXMuc3RhdGVbMV0mJjA9PT10aGlzLnN0YXRlWzJdJiYwPT09dGhpcy5zdGF0ZVszXSYmKHRoaXMuc3RhdGVbMF09ODgsdGhpcy5zdGF0ZVsxXT04Myx0aGlzLnN0YXRlWzJdPTY1LHRoaXMuc3RhdGVbM109NjgpfW5leHRTdGF0ZSgpe2xldCB0PXRoaXMuc3RhdGVbMF07dF49dDw8MTUsdF49dD4+PjE4LHRePXRoaXMuc3RhdGVbM108PDExLHRoaXMuc3RhdGVbMF09dGhpcy5zdGF0ZVsxXSx0aGlzLnN0YXRlWzFdPXRoaXMuc3RhdGVbMl0sdGhpcy5zdGF0ZVsyXT10aGlzLnN0YXRlWzNdLHRoaXMuc3RhdGVbM109dH19ZnVuY3Rpb24gUW8odCxlPXt9LHI9TWF0aC5yYW5kb20pe2NvbnN0e3NpemU6bz0xLHJlcGxhY2U6bj0hMSxwcm9iYWJpbGl0aWVzOnN9PWU7bGV0IGksdTtpZihpPSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfSh0KTp0LnNsaWNlKCkscyl7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJjaG9pY2Ugd2l0aCBwcm9iYWJpbGl0aWVzIGFuZCBubyByZXBsYWNlbWVudCBpcyBub3QgaW1wbGVtZW50ZWQiKTtpZihzLmxlbmd0aCE9PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBwcm9iYWJpbGl0aWVzIG9wdGlvbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaG9pY2VzIik7dT1bc1swXV07Zm9yKGxldCB0PTE7dDxzLmxlbmd0aDt0KyspdVt0XT11W3QtMV0rc1t0XTtpZihNYXRoLmFicygxLXVbdS5sZW5ndGgtMV0pPjFlLTgpdGhyb3cgbmV3IEVycm9yKGBwcm9iYWJpbGl0aWVzIHNob3VsZCBzdW0gdG8gMSwgYnV0IGluc3RlYWQgc3VtcyB0byAke3VbdS5sZW5ndGgtMV19YCl9aWYoITE9PT1uJiZvPmkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic2l6ZSBvcHRpb24gaXMgdG9vIGxhcmdlIik7Y29uc3QgYT1bXTtmb3IobGV0IHQ9MDt0PG87dCsrKXtjb25zdCB0PXRuKGkubGVuZ3RoLHIsdSk7YS5wdXNoKGlbdF0pLG58fGkuc3BsaWNlKHQsMSl9cmV0dXJuIGF9ZnVuY3Rpb24gdG4odCxlLHIpe2NvbnN0IG89ZSgpO2lmKHIpe2xldCB0PTA7Zm9yKDtvPnJbdF07KXQrKztyZXR1cm4gdH1yZXR1cm4gTWF0aC5mbG9vcihvKnQpfWNsYXNzIGVue2NvbnN0cnVjdG9yKHQ9TWF0aC5yYW5kb20pe2lmKCJudW1iZXIiPT10eXBlb2YgdCl7Y29uc3QgZT1uZXcgSG8odCk7dGhpcy5yYW5kb21HZW5lcmF0b3I9ZS5yYW5kb219ZWxzZSB0aGlzLnJhbmRvbUdlbmVyYXRvcj10fWNob2ljZSh0LGUpe3JldHVybiBRbyh0LGUsdGhpcy5yYW5kb21HZW5lcmF0b3IpfXJhbmRvbSgpe3JldHVybiB0aGlzLnJhbmRvbUdlbmVyYXRvcigpfXJhbmRJbnQodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PTApLHQrTWF0aC5mbG9vcih0aGlzLnJhbmRvbUdlbmVyYXRvcigpKihlLXQpKX1yYW5kb21TYW1wbGUodCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLnJhbmRvbSgpKTtyZXR1cm4gZX19ZnVuY3Rpb24gcm4odCxlKXtjb25zdCByPW5ldyBxZSh0LnJvd3MsZS5yb3dzKTtmb3IobGV0IG89MDtvPHQucm93cztvKyspZm9yKGxldCBuPTA7bjxlLnJvd3M7bisrKXIuc2V0KG8sbixXbyh0LmdldFJvdyhvKSxlLmdldFJvdyhuKSkpO3JldHVybiByfWZ1bmN0aW9uIG9uKHQpe2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfWZ1bmN0aW9uIG5uKHQpe2xldCBlPVt0WzBdXTtmb3IobGV0IHI9MTtyPHQubGVuZ3RoO3IrKyllW3JdPWVbci0xXSt0W3JdO3JldHVybiBlfWNvbnN0IHNuPVN5bWJvbCgiZGlzdGFuY2UiKTtjbGFzcyB1bntjb25zdHJ1Y3Rvcih0LGUscixvLG4pe3RoaXMuY2x1c3RlcnM9dCx0aGlzLmNlbnRyb2lkcz1lLHRoaXMuY29udmVyZ2VkPXIsdGhpcy5pdGVyYXRpb25zPW8sdGhpc1tzbl09bn1uZWFyZXN0KHQpe2NvbnN0IGU9bmV3IEFycmF5KHQubGVuZ3RoKTtyZXR1cm4gWW8odCx0aGlzLmNlbnRyb2lkcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNlbnRyb2lkfSkpLGUsdGhpc1tzbl0pfWNvbXB1dGVJbmZvcm1hdGlvbih0KXtmb3IodmFyIGU9dGhpcy5jZW50cm9pZHMubWFwKChmdW5jdGlvbih0KXtyZXR1cm57Y2VudHJvaWQ6dCxlcnJvcjowLHNpemU6MH19KSkscj0wO3I8dC5sZW5ndGg7cisrKWVbdGhpcy5jbHVzdGVyc1tyXV0uZXJyb3IrPXRoaXNbc25dKHRbcl0sdGhpcy5jZW50cm9pZHNbdGhpcy5jbHVzdGVyc1tyXV0pLGVbdGhpcy5jbHVzdGVyc1tyXV0uc2l6ZSsrO2Zvcih2YXIgbz0wO288dGhpcy5jZW50cm9pZHMubGVuZ3RoO28rKyllW29dLnNpemU/ZVtvXS5lcnJvci89ZVtvXS5zaXplOmVbb10uZXJyb3I9bnVsbDtyZXR1cm4gbmV3IHVuKHRoaXMuY2x1c3RlcnMsZSx0aGlzLmNvbnZlcmdlZCx0aGlzLml0ZXJhdGlvbnMsdGhpc1tzbl0pfX1jb25zdCBhbj17bWF4SXRlcmF0aW9uczoxMDAsdG9sZXJhbmNlOjFlLTYsd2l0aEl0ZXJhdGlvbnM6ITEsaW5pdGlhbGl6YXRpb246ImttZWFucysrIixkaXN0YW5jZUZ1bmN0aW9uOldvfTtmdW5jdGlvbiBobih0LGUscixvLG4scyl7dmFyIGk9ZnVuY3Rpb24odCxlLHIsbyl7Y29uc3Qgbj1lWzBdLmxlbmd0aDtmb3IodmFyIHM9bmV3IEFycmF5KG8pLGk9bmV3IEFycmF5KG8pLHU9MDt1PG87dSsrKXtzW3VdPW5ldyBBcnJheShuKSxpW3VdPTA7Zm9yKHZhciBhPTA7YTxuO2ErKylzW3VdW2FdPTB9Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspe2lbcltoXV0rKztmb3IodmFyIGw9MDtsPG47bCsrKXNbcltoXV1bbF0rPWVbaF1bbF19Zm9yKHZhciBjPTA7YzxvO2MrKylmb3IodmFyIGY9MDtmPG47ZisrKWlbY10/c1tjXVtmXS89aVtjXTpzW2NdW2ZdPXRbY11bZl07cmV0dXJuIHN9KHQsZSxyPVlvKGUsdCxyLG4uZGlzdGFuY2VGdW5jdGlvbiksbyksdT1mdW5jdGlvbih0LGUscixvKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZihyKHRbbl0sZVtuXSk+bylyZXR1cm4hMTtyZXR1cm4hMH0oaSx0LG4uZGlzdGFuY2VGdW5jdGlvbixuLnRvbGVyYW5jZSk7cmV0dXJuIG5ldyB1bihyLGksdSxzLG4uZGlzdGFuY2VGdW5jdGlvbil9ZnVuY3Rpb24gbG4odCxlLHIpe2lmKHI9T2JqZWN0LmFzc2lnbih7fSxhbixyKSxlPD0wfHxlPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgRXJyb3IoIksgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBwb2ludHMiKTt2YXIgbztpZihBcnJheS5pc0FycmF5KHIuaW5pdGlhbGl6YXRpb24pKXtpZihyLmluaXRpYWxpemF0aW9uLmxlbmd0aCE9PWUpdGhyb3cgbmV3IEVycm9yKCJUaGUgaW5pdGlhbCBjZW50ZXJzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyBLIik7bz1yLmluaXRpYWxpemF0aW9ufWVsc2Ugc3dpdGNoKHIuaW5pdGlhbGl6YXRpb24pe2Nhc2Uia21lYW5zKysiOm89ZnVuY3Rpb24odCxlLHI9e30pe2NvbnN0IG89KHQ9bmV3IHFlKHQpKS5yb3dzLG49bmV3IGVuKHIuc2VlZCkscz1bXSxpPXIubG9jYWxUcmlhbHN8fDIrTWF0aC5mbG9vcihNYXRoLmxvZyhlKSksdT1uLnJhbmRJbnQobyk7cy5wdXNoKHQuZ2V0Um93KHUpKTtsZXQgYT1uZXcgcWUoMSx0LnJvd3MpO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKylhLnNldCgwLGUsV28odC5nZXRSb3coZSksc1swXSkpO2xldCBoPVtubihhLmdldFJvdygwKSldO2NvbnN0IGw9MS9oWzBdW28tMV07bGV0IGM9cWUubXVsKGEsbCk7Zm9yKGxldCByPTE7cjxlO3IrKyl7Y29uc3QgZT1uLmNob2ljZShvLHtyZXBsYWNlOiEwLHNpemU6aSxwcm9iYWJpbGl0aWVzOmNbMF19KSx1PXJuKHQuc2VsZWN0aW9uKGUsb24odC5jb2x1bW5zKSksdCk7bGV0IGwsZixtO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IHI9cWUubWluKGEsW3UuZ2V0Um93KHQpXSksbz1yLnN1bSgpOyh2b2lkIDA9PT1sfHxvPGYpJiYobD1lW3RdLGY9byxtPXIpfXNbcl09dC5nZXRSb3cobCksYT1tLGg9W25uKGEuZ2V0Um93KDApKV0sYz1xZS5tdWwoYSwxL2hbMF1bby0xXSl9cmV0dXJuIHN9KHQsZSxyKTticmVhaztjYXNlInJhbmRvbSI6bz1mdW5jdGlvbih0LGUscil7cmV0dXJuIG5ldyBlbihyKS5jaG9pY2UodCx7c2l6ZTplfSl9KHQsZSxyLnNlZWQpO2JyZWFrO2Nhc2UibW9zdERpc3RhbnQiOm89ZnVuY3Rpb24odCxlLHIsbyl7Y29uc3Qgbj1uZXcgZW4obyk7dmFyIHM9bmV3IEFycmF5KGUpO2lmKHNbMF09TWF0aC5mbG9vcihuLnJhbmRvbSgpKnQubGVuZ3RoKSxlPjEpe2Zvcih2YXIgaT17ZGlzdDotMSxpbmRleDotMX0sdT0wO3U8dC5sZW5ndGg7Kyt1KXJbc1swXV1bdV0+aS5kaXN0JiYoaS5kaXN0PXJbc1swXV1bdV0saS5pbmRleD11KTtpZihzWzFdPWkuaW5kZXgsZT4yKWZvcih2YXIgYT0yO2E8ZTsrK2Epe2Zvcih2YXIgaD17ZGlzdDotMSxpbmRleDotMX0sbD0wO2w8dC5sZW5ndGg7KytsKXtmb3IodmFyIGM9e2Rpc3Q6TnVtYmVyLk1BWF9WQUxVRSxpbmRleDotMX0sZj0wO2Y8YTsrK2YpcltmXVtsXTxjLmRpc3QmJi0xPT09cy5pbmRleE9mKGwpJiYoYz17ZGlzdDpyW2ZdW2xdLGluZGV4Omx9KTtjLmRpc3QhPT1OdW1iZXIuTUFYX1ZBTFVFJiZjLmRpc3Q+aC5kaXN0JiYoaD1PYmplY3QuYXNzaWduKHt9LGMpKX1zW2FdPWguaW5kZXh9fXJldHVybiBzLm1hcCgoZT0+dFtlXSkpfSh0LGUsZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxvPTA7bzx0Lmxlbmd0aDsrK28pZm9yKHZhciBuPW87bjx0Lmxlbmd0aDsrK24pe3Jbb118fChyW29dPW5ldyBBcnJheSh0Lmxlbmd0aCkpLHJbbl18fChyW25dPW5ldyBBcnJheSh0Lmxlbmd0aCkpO2NvbnN0IHM9ZSh0W29dLHRbbl0pO3Jbb11bbl09cyxyW25dW29dPXN9cmV0dXJuIHJ9KHQsci5kaXN0YW5jZUZ1bmN0aW9uKSxyLnNlZWQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGluaXRpYWxpemF0aW9uIG1ldGhvZDogIiR7ci5pbml0aWFsaXphdGlvbn0iYCl9MD09PXIubWF4SXRlcmF0aW9ucyYmKHIubWF4SXRlcmF0aW9ucz1OdW1iZXIuTUFYX1ZBTFVFKTt2YXIgbj1uZXcgQXJyYXkodC5sZW5ndGgpO2lmKHIud2l0aEl0ZXJhdGlvbnMpcmV0dXJuIGZ1bmN0aW9uKih0LGUscixvLG4pe2Zvcih2YXIgcyxpPSExLHU9MDshaSYmdTxuLm1heEl0ZXJhdGlvbnM7KXM9aG4odCxlLHIsbyxuLCsrdSkseWllbGQgcy5jb21wdXRlSW5mb3JtYXRpb24oZSksaT1zLmNvbnZlcmdlZCx0PXMuY2VudHJvaWRzfShvLHQsbixlLHIpO2Zvcih2YXIgcyxpPSExLHU9MDshaSYmdTxyLm1heEl0ZXJhdGlvbnM7KWk9KHM9aG4obyx0LG4sZSxyLCsrdSkpLmNvbnZlcmdlZCxvPXMuY2VudHJvaWRzO3JldHVybiBzLmNvbXB1dGVJbmZvcm1hdGlvbih0KX1mdW5jdGlvbiBjbih0LGU9e30pe2xldCByPUN0KGUsImtOdW1iZXIiKTtyPXZvKHIpP3pvKHIpOjI7bGV0IG8sbj1DdChlLCJtb2RlIik7aWYoImstbWVkb2lkcyIhPT1uJiYiay1tZWFucyIhPT1uJiYobj0iay1tZWRvaWRzIiksImstbWVkb2lkcyI9PT1uKW89ZnVuY3Rpb24odCxlKXtsZXQgcj17fTtmdW5jdGlvbiBvKHQpe3JldHVybiBWbyh0LCI6Iil9dnIodCwoKHQsZSk9PntsZXQgbj1vKHQpO3Jbbl09ZX0pKTtsZXQgbj1Lby5DbHVzdGVyZXIuZ2V0SW5zdGFuY2UodCxlKS5nZXRDbHVzdGVyZWREYXRhKCk7cmV0dXJuIG49Z28obiwodD0+Z28odCwodD0+e2xldCBlPW8odCk7cmV0dXJuIHJbZV19KSkpKSxufSh0LHIpO2Vsc2V7aWYoImstbWVhbnMiIT09bil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgbW9kZSIpO289ZnVuY3Rpb24odCxlKXtsZXQgcj1sbih0LGUpLG89e307cmV0dXJuIHZyKHIuY2x1c3RlcnMsKCh0LGUpPT57b1t0XXx8KG9bdF09W10pLG9bdF0ucHVzaChlKX0pKSx3byhvKX0odCxyKX1yZXR1cm4gb31mdW5jdGlvbiBmbih0LGU9e30pe2lmKCFkZSh0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IGVmZi4gYXJyYXkiKTtsZXQgcj1DdChlLCJrTnVtYmVyIik7cj12byhyKT96byhyKToyO2xldCBvPUN0KGUsIm5Db21wTklQQUxTIik7bz12byhvKT96byhvKToyO2xldCBuPUN0KGUsIm1vZGUiKSxzPSIiLGk9bGUodCksdT0wLGE9MDtpZih2cih0LCh0PT57IWZ1bmN0aW9uKHQpe2lmKGdlKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMX0odCk/ZGUodCkmJihhKz0xKTp1Kz0xfSkpLHU9PT1pKXM9Im9iaiI7ZWxzZXtpZihhIT09aSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IG9mIHRoZSBzYW1lIHR5cGUiKTtzPSJtYXQifWxldCBoLGw9bnVsbDsib2JqIj09PXM/KGw9ZnVuY3Rpb24odCl7bGV0IGU9e307dnIodCwodD0+e3ZyKHQsKCh0LHIpPT57ZVtyXXx8KGVbcl09MCksMD09PWVbcl0mJnZvKHQpJiYoZVtyXT0xKSwxIT09ZVtyXXx8dm8odCl8fChlW3JdPS0xKX0pKX0pKTtsZXQgcj1bXTtyZXR1cm4gdnIoZSwoKHQsZSk9PnsxPT09dCYmci5wdXNoKGUpfSkpLHJ9KHQpLGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZ28odCwodD0+e2xldCByPXlvKHQsZSk7cmV0dXJuIHdvKHIpfSkpfSh0LGwpKTpoPXQ7bGV0IGM9SmUoaCx7bkNvbXBOSVBBTFM6b30pLGY9Y24oYyx7a051bWJlcjpyLG1vZGU6bn0pLG09Z28oZiwodD0+Z28odCwodD0+Y1t0XSkpKSk7cmV0dXJue2tleXM6bCxnaW5kczpmLGdsdGR0OmdvKGYsKGU9PmdvKGUsKGU9PnRbZV0pKSkpLGdtYXQ6bX19bGV0IFdDbHVzdGVyPXtQQ0E6YXN5bmMgZnVuY3Rpb24odCxlPXt9KXtyZXR1cm4gSmUodCxlKX0sY2x1c3Rlcjphc3luYyBmdW5jdGlvbih0LGU9e30pe3RyeXtyZXR1cm4gZm4odCxlKX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9fX07CgpsZXQgaW5zdGFuY2UgPSBudWxsCmZ1bmN0aW9uIGluaXQoaW5wdXQpewoKICAgIC8vaW5pdAogICAgbGV0IHIKICAgIAogICAgICAgIHIgPSBXQ2x1c3RlciguLi5pbnB1dCkKICAgICAgICAKCiAgICAvL29uCiAgICAKCiAgICAvL3NhdmUKICAgIGluc3RhbmNlID0gcgoKfQoKZnVuY3Rpb24gc2VuZE1lc3NhZ2UoZGF0YSkgewogICAgCiAgICAgICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZShkYXRhKQogICAgICAgIAp9Cgphc3luYyBmdW5jdGlvbiBydW4oZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciBydW4nLGRhdGEpCgogICAgLy9tb2RlCiAgICBsZXQgbW9kZSA9IGRhdGEubW9kZQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgIT09ICdpbml0JyAmJiBtb2RlICE9PSAnY2FsbCcpewogICAgICAgIHJldHVybgogICAgfQoKICAgIC8vaW5pdAogICAgaWYobW9kZSA9PT0gJ2luaXQnKXsKICAgICAgICAKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL3R5cGUKICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGUKCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAogICAgCiAgICAgICAgICAgIC8vaW5zdGFuY2UKICAgICAgICAgICAgaWYodHlwZSA9PT0gJ2Z1bmN0aW9uJyl7CiAgICAgICAgICAgICAgICBpbml0KC4uLmlucHV0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZSA9PT0gJ29iamVjdCcpewogICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBXQ2x1c3RlcgogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgIAogICAgICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgICAgICBtb2RlOiAnZW1pdCcsCiAgICAgICAgICAgICAgICBldk5hbWU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtc2c6IGVyciwKICAgICAgICAgICAgfQogICAgICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgICAgIH0KICAgICAgICAgICAgCiAgICB9CgogICAgLy9jaGVjawogICAgaWYobW9kZSA9PT0gJ2NhbGwnKXsKICAgICAgICBsZXQgc3RhdGUgPSAnJwogICAgICAgIGxldCBtc2cgPSBudWxsCgogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vZnVuCiAgICAgICAgICAgIGxldCBmdW4gPSBpbnN0YW5jZVtkYXRhLmZ1bl0KCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAoKICAgICAgICAgICAgLy9leGVjCiAgICAgICAgICAgIGF3YWl0IGZ1biguLi5pbnB1dCkKICAgICAgICAgICAgICAgIC50aGVuKChzdWMpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nc3VjY2VzcycKICAgICAgICAgICAgICAgICAgICBtc2c9c3VjCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nZXJyb3InCiAgICAgICAgICAgICAgICAgICAgbXNnPWVycgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgICAgIHN0YXRlID0gJ2Vycm9yJwogICAgICAgICAgICBtc2cgPSBlcnIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgIG1vZGU6ICdyZXR1cm4nLAogICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgZnVuOiBkYXRhLmZ1biwKICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgIG1zZywKICAgICAgICB9CiAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgIH0KCn0KCmZ1bmN0aW9uIHJlY3ZNZXNzYWdlKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcmVjdjonLCBkYXRhKQoKICAgIC8vZGF0YVJlY3YKICAgIGxldCBkYXRhUmVjdiA9IGRhdGEKCiAgICAvL3J1bgogICAgcnVuKGRhdGFSZWN2KQoKfQoKCiAgICAgICAgcGFyZW50UG9ydC5vbignbWVzc2FnZScsIHJlY3ZNZXNzYWdlKQogICAgICAgIAoK",Buffer.from(y,"base64").toString("utf8"));function p(){var c=l();function X(l){try{return new d.Worker(l,{eval:!0})}catch(d){h(d)}}var y=X(G);if(!y)return h("invalid worker"),null;function m(){y?(y.terminate(),y=void 0):h("worker has been terminated")}function K(){var d={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};y.postMessage(d)}function t(){var d=b(),l=Z(),X={mode:"call",id:l,fun:"PCA",input:Array.prototype.slice.call(arguments)};return y.postMessage(X),c.once(l,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function p(){var d=b(),l=Z(),X={mode:"call",id:l,fun:"cluster",input:Array.prototype.slice.call(arguments)};return y.postMessage(X),c.once(l,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function o(d){var l=d,b=l.mode;"emit"!==b&&"return"!==b||("emit"===b&&c.emit(l.evName,l.msg),"return"===b&&c.emit(l.id,l))}function h(d){c.emit("error",d)}return y.on("message",o),y.on("error",h),K(Array.prototype.slice.call(arguments)),c.PCA=t,c.cluster=p,c.terminate=m,c}var o,h,i={PCA:(h=X(K.mark((function d(){var l,b,Z,X=arguments;return K.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return l=Array.prototype.slice.call(X),b=p(),d.next=4,b.PCA.apply(b,c(l)).finally((function(){b.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return h.apply(this,arguments)}),cluster:(o=X(K.mark((function d(){var l,b,Z,X=arguments;return K.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return l=Array.prototype.slice.call(X),b=p(),d.next=4,b.cluster.apply(b,c(l)).finally((function(){b.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return o.apply(this,arguments)})};for(var I in m=l(),i){var W=i[I];m[I]=W}}(),m}(c.default)})),G=X((function(d,l){d.exports=function(){function d(d,l){(null==l||l>d.length)&&(l=d.length);for(var c=0,b=new Array(l);c<l;c++)b[c]=d[c];return b}function l(l){return function(l){if(Array.isArray(l))return d(l)}(l)||function(d){if("undefined"!=typeof Symbol&&null!=d[Symbol.iterator]||null!=d["@@iterator"])return Array.from(d)}(l)||function(l,c){if(l){if("string"==typeof l)return d(l,c);var b=Object.prototype.toString.call(l).slice(8,-1);return"Object"===b&&l.constructor&&(b=l.constructor.name),"Map"===b||"Set"===b?Array.from(l):"Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b)?d(l,c):void 0}}(l)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(d,l,c,b,Z,X,y){try{var G=d[X](y),m=G.value}catch(d){return void c(d)}G.done?l(m):Promise.resolve(m).then(b,Z)}function X(d){return function(){var l=this,b=arguments;return new Promise((function(Z,X){var y=d.apply(l,b);function G(d){c(y,Z,X,G,m,"next",d)}function m(d){c(y,Z,X,G,m,"throw",d)}G(void 0)}))}}function y(d){return(y="function"==typeof Symbol&&"symbol"==b(Symbol.iterator)?function(d){return b(d)}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":b(d)})(d)}var G="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==Z?Z:"undefined"!=typeof self?self:{};function m(d){var l={exports:{}};return d(l,l.exports),l.exports}var K,t=m((function(d){var l=function(d){var l,c=Object.prototype,b=c.hasOwnProperty,Z="function"==typeof Symbol?Symbol:{},X=Z.iterator||"@@iterator",G=Z.asyncIterator||"@@asyncIterator",m=Z.toStringTag||"@@toStringTag";function K(d,l,c){return Object.defineProperty(d,l,{value:c,enumerable:!0,configurable:!0,writable:!0}),d[l]}try{K({},"")}catch(d){K=function(d,l,c){return d[l]=c}}function t(d,l,c,b){var Z=l&&l.prototype instanceof u?l:u,X=Object.create(Z.prototype),y=new R(b||[]);return X._invoke=function(d,l,c){var b=o;return function(Z,X){if(b===i)throw new Error("Generator is already running");if(b===I){if("throw"===Z)throw X;return T()}for(c.method=Z,c.arg=X;;){var y=c.delegate;if(y){var G=S(y,c);if(G){if(G===W)continue;return G}}if("next"===c.method)c.sent=c._sent=c.arg;else if("throw"===c.method){if(b===o)throw b=I,c.arg;c.dispatchException(c.arg)}else"return"===c.method&&c.abrupt("return",c.arg);b=i;var m=p(d,l,c);if("normal"===m.type){if(b=c.done?I:h,m.arg===W)continue;return{value:m.arg,done:c.done}}"throw"===m.type&&(b=I,c.method="throw",c.arg=m.arg)}}}(d,c,y),X}function p(d,l,c){try{return{type:"normal",arg:d.call(l,c)}}catch(d){return{type:"throw",arg:d}}}d.wrap=t;var o="suspendedStart",h="suspendedYield",i="executing",I="completed",W={};function u(){}function V(){}function s(){}var H={};H[X]=function(){return this};var n=Object.getPrototypeOf,C=n&&n(n(z([])));C&&C!==c&&b.call(C,X)&&(H=C);var L=s.prototype=u.prototype=Object.create(H);function a(d){["next","throw","return"].forEach((function(l){K(d,l,(function(d){return this._invoke(l,d)}))}))}function x(d,l){function c(Z,X,G,m){var K=p(d[Z],d,X);if("throw"!==K.type){var t=K.arg,o=t.value;return o&&"object"===y(o)&&b.call(o,"__await")?l.resolve(o.__await).then((function(d){c("next",d,G,m)}),(function(d){c("throw",d,G,m)})):l.resolve(o).then((function(d){t.value=d,G(t)}),(function(d){return c("throw",d,G,m)}))}m(K.arg)}var Z;this._invoke=function(d,b){function X(){return new l((function(l,Z){c(d,b,l,Z)}))}return Z=Z?Z.then(X,X):X()}}function S(d,c){var b=d.iterator[c.method];if(b===l){if(c.delegate=null,"throw"===c.method){if(d.iterator.return&&(c.method="return",c.arg=l,S(d,c),"throw"===c.method))return W;c.method="throw",c.arg=new TypeError("The iterator does not provide a 'throw' method")}return W}var Z=p(b,d.iterator,c.arg);if("throw"===Z.type)return c.method="throw",c.arg=Z.arg,c.delegate=null,W;var X=Z.arg;return X?X.done?(c[d.resultName]=X.value,c.next=d.nextLoc,"return"!==c.method&&(c.method="next",c.arg=l),c.delegate=null,W):X:(c.method="throw",c.arg=new TypeError("iterator result is not an object"),c.delegate=null,W)}function Y(d){var l={tryLoc:d[0]};1 in d&&(l.catchLoc=d[1]),2 in d&&(l.finallyLoc=d[2],l.afterLoc=d[3]),this.tryEntries.push(l)}function g(d){var l=d.completion||{};l.type="normal",delete l.arg,d.completion=l}function R(d){this.tryEntries=[{tryLoc:"root"}],d.forEach(Y,this),this.reset(!0)}function z(d){if(d){var c=d[X];if(c)return c.call(d);if("function"==typeof d.next)return d;if(!isNaN(d.length)){var Z=-1,y=function c(){for(;++Z<d.length;)if(b.call(d,Z))return c.value=d[Z],c.done=!1,c;return c.value=l,c.done=!0,c};return y.next=y}}return{next:T}}function T(){return{value:l,done:!0}}return V.prototype=L.constructor=s,s.constructor=V,V.displayName=K(s,m,"GeneratorFunction"),d.isGeneratorFunction=function(d){var l="function"==typeof d&&d.constructor;return!!l&&(l===V||"GeneratorFunction"===(l.displayName||l.name))},d.mark=function(d){return Object.setPrototypeOf?Object.setPrototypeOf(d,s):(d.__proto__=s,K(d,m,"GeneratorFunction")),d.prototype=Object.create(L),d},d.awrap=function(d){return{__await:d}},a(x.prototype),x.prototype[G]=function(){return this},d.AsyncIterator=x,d.async=function(l,c,b,Z,X){void 0===X&&(X=Promise);var y=new x(t(l,c,b,Z),X);return d.isGeneratorFunction(c)?y:y.next().then((function(d){return d.done?d.value:y.next()}))},a(L),K(L,m,"Generator"),L[X]=function(){return this},L.toString=function(){return"[object Generator]"},d.keys=function(d){var l=[];for(var c in d)l.push(c);return l.reverse(),function c(){for(;l.length;){var b=l.pop();if(b in d)return c.value=b,c.done=!1,c}return c.done=!0,c}},d.values=z,R.prototype={constructor:R,reset:function(d){if(this.prev=0,this.next=0,this.sent=this._sent=l,this.done=!1,this.delegate=null,this.method="next",this.arg=l,this.tryEntries.forEach(g),!d)for(var c in this)"t"===c.charAt(0)&&b.call(this,c)&&!isNaN(+c.slice(1))&&(this[c]=l)},stop:function(){this.done=!0;var d=this.tryEntries[0].completion;if("throw"===d.type)throw d.arg;return this.rval},dispatchException:function(d){if(this.done)throw d;var c=this;function Z(b,Z){return G.type="throw",G.arg=d,c.next=b,Z&&(c.method="next",c.arg=l),!!Z}for(var X=this.tryEntries.length-1;X>=0;--X){var y=this.tryEntries[X],G=y.completion;if("root"===y.tryLoc)return Z("end");if(y.tryLoc<=this.prev){var m=b.call(y,"catchLoc"),K=b.call(y,"finallyLoc");if(m&&K){if(this.prev<y.catchLoc)return Z(y.catchLoc,!0);if(this.prev<y.finallyLoc)return Z(y.finallyLoc)}else if(m){if(this.prev<y.catchLoc)return Z(y.catchLoc,!0)}else{if(!K)throw new Error("try statement without catch or finally");if(this.prev<y.finallyLoc)return Z(y.finallyLoc)}}}},abrupt:function(d,l){for(var c=this.tryEntries.length-1;c>=0;--c){var Z=this.tryEntries[c];if(Z.tryLoc<=this.prev&&b.call(Z,"finallyLoc")&&this.prev<Z.finallyLoc){var X=Z;break}}X&&("break"===d||"continue"===d)&&X.tryLoc<=l&&l<=X.finallyLoc&&(X=null);var y=X?X.completion:{};return y.type=d,y.arg=l,X?(this.method="next",this.next=X.finallyLoc,W):this.complete(y)},complete:function(d,l){if("throw"===d.type)throw d.arg;return"break"===d.type||"continue"===d.type?this.next=d.arg:"return"===d.type?(this.rval=this.arg=d.arg,this.method="return",this.next="end"):"normal"===d.type&&l&&(this.next=l),W},finish:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var c=this.tryEntries[l];if(c.finallyLoc===d)return this.complete(c.completion,c.afterLoc),g(c),W}},catch:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var c=this.tryEntries[l];if(c.tryLoc===d){var b=c.completion;if("throw"===b.type){var Z=b.arg;g(c)}return Z}}throw new Error("illegal catch attempt")},delegateYield:function(d,c,b){return this.delegate={iterator:z(d),resultName:c,nextLoc:b},"next"===this.method&&(this.arg=l),W}},d}(d.exports);try{regeneratorRuntime=l}catch(d){Function("r","regeneratorRuntime = r")(l)}})),p=m((function(d,l){!function(l,c){d.exports=function(l){var c,b=(l=l||{}).Base64,Z="2.6.4",X="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",y=function(d){for(var l={},c=0,b=d.length;c<b;c++)l[d.charAt(c)]=c;return l}(X),G=String.fromCharCode,m=function(d){if(d.length<2)return(l=d.charCodeAt(0))<128?d:l<2048?G(192|l>>>6)+G(128|63&l):G(224|l>>>12&15)+G(128|l>>>6&63)+G(128|63&l);var l=65536+1024*(d.charCodeAt(0)-55296)+(d.charCodeAt(1)-56320);return G(240|l>>>18&7)+G(128|l>>>12&63)+G(128|l>>>6&63)+G(128|63&l)},K=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,t=function(d){return d.replace(K,m)},p=function(d){var l=[0,2,1][d.length%3],c=d.charCodeAt(0)<<16|(d.length>1?d.charCodeAt(1):0)<<8|(d.length>2?d.charCodeAt(2):0);return[X.charAt(c>>>18),X.charAt(c>>>12&63),l>=2?"=":X.charAt(c>>>6&63),l>=1?"=":X.charAt(63&c)].join("")},o=l.btoa&&"function"==typeof l.btoa?function(d){return l.btoa(d)}:function(d){if(d.match(/[^\x00-\xFF]/))throw new RangeError("The string contains invalid characters.");return d.replace(/[\s\S]{1,3}/g,p)},h=function(d){return o(t(String(d)))},i=function(d){return d.replace(/[+\/]/g,(function(d){return"+"==d?"-":"_"})).replace(/=/g,"")},I=function(d,l){return l?i(h(d)):h(d)},W=function(d){return I(d,!0)};l.Uint8Array&&(c=function(d,l){for(var c="",b=0,Z=d.length;b<Z;b+=3){var y=d[b],G=d[b+1],m=d[b+2],K=y<<16|G<<8|m;c+=X.charAt(K>>>18)+X.charAt(K>>>12&63)+(void 0!==G?X.charAt(K>>>6&63):"=")+(void 0!==m?X.charAt(63&K):"=")}return l?i(c):c});var u,V=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,s=function(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 G(55296+(l>>>10))+G(56320+(1023&l));case 3:return G((15&d.charCodeAt(0))<<12|(63&d.charCodeAt(1))<<6|63&d.charCodeAt(2));default:return G((31&d.charCodeAt(0))<<6|63&d.charCodeAt(1))}},H=function(d){return d.replace(V,s)},n=function(d){var l=d.length,c=l%4,b=(l>0?y[d.charAt(0)]<<18:0)|(l>1?y[d.charAt(1)]<<12:0)|(l>2?y[d.charAt(2)]<<6:0)|(l>3?y[d.charAt(3)]:0),Z=[G(b>>>16),G(b>>>8&255),G(255&b)];return Z.length-=[0,0,2,1][c],Z.join("")},C=l.atob&&"function"==typeof l.atob?function(d){return l.atob(d)}:function(d){return d.replace(/\S{1,4}/g,n)},L=function(d){return C(String(d).replace(/[^A-Za-z0-9\+\/]/g,""))},a=function(d){return H(C(d))},x=function(d){return String(d).replace(/[-_]/g,(function(d){return"-"==d?"+":"/"})).replace(/[^A-Za-z0-9\+\/]/g,"")},S=function(d){return a(x(d))};l.Uint8Array&&(u=function(d){return Uint8Array.from(L(x(d)),(function(d){return d.charCodeAt(0)}))});var Y=function(){var d=l.Base64;return l.Base64=b,d};if(l.Base64={VERSION:Z,atob:L,btoa:o,fromBase64:S,toBase64:I,utob:t,encode:I,encodeURI:W,btou:H,decode:S,noConflict:Y,fromUint8Array:c,toUint8Array:u},"function"==typeof Object.defineProperty){var g=function(d){return{value:d,enumerable:!1,writable:!0,configurable:!0}};l.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",g((function(){return S(this)}))),Object.defineProperty(String.prototype,"toBase64",g((function(d){return I(this,d)}))),Object.defineProperty(String.prototype,"toBase64URI",g((function(){return I(this,!0)})))}}return l.Meteor&&(Base64=l.Base64),d.exports&&(d.exports.Base64=l.Base64),{Base64:l.Base64}}(l)}("undefined"!=typeof self?self:"undefined"!=typeof window?window:G)})),o=m((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,y){if("function"!=typeof b)throw new TypeError("The listener must be a function");var G=new Z(b,X||d,y),m=c?c+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],G]:d._events[m].push(G):(d._events[m]=G,d._eventsCount++),d}function y(d,l){0==--d._eventsCount?d._events=new b:delete d._events[l]}function G(){this._events=new b,this._eventsCount=0}Object.create&&(b.prototype=Object.create(null),(new b).__proto__||(c=!1)),G.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},G.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,y=new Array(X);Z<X;Z++)y[Z]=b[Z].fn;return y},G.prototype.listenerCount=function(d){var l=c?c+d:d,b=this._events[l];return b?b.fn?1:b.length:0},G.prototype.emit=function(d,l,b,Z,X,y){var G=c?c+d:d;if(!this._events[G])return!1;var m,K,t=this._events[G],p=arguments.length;if(t.fn){switch(t.once&&this.removeListener(d,t.fn,void 0,!0),p){case 1:return t.fn.call(t.context),!0;case 2:return t.fn.call(t.context,l),!0;case 3:return t.fn.call(t.context,l,b),!0;case 4:return t.fn.call(t.context,l,b,Z),!0;case 5:return t.fn.call(t.context,l,b,Z,X),!0;case 6:return t.fn.call(t.context,l,b,Z,X,y),!0}for(K=1,m=new Array(p-1);K<p;K++)m[K-1]=arguments[K];t.fn.apply(t.context,m)}else{var o,h=t.length;for(K=0;K<h;K++)switch(t[K].once&&this.removeListener(d,t[K].fn,void 0,!0),p){case 1:t[K].fn.call(t[K].context);break;case 2:t[K].fn.call(t[K].context,l);break;case 3:t[K].fn.call(t[K].context,l,b);break;case 4:t[K].fn.call(t[K].context,l,b,Z);break;default:if(!m)for(o=1,m=new Array(p-1);o<p;o++)m[o-1]=arguments[o];t[K].fn.apply(t[K].context,m)}}return!0},G.prototype.on=function(d,l,c){return X(this,d,l,c,!1)},G.prototype.once=function(d,l,c){return X(this,d,l,c,!0)},G.prototype.removeListener=function(d,l,b,Z){var X=c?c+d:d;if(!this._events[X])return this;if(!l)return y(this,X),this;var G=this._events[X];if(G.fn)G.fn!==l||Z&&!G.once||b&&G.context!==b||y(this,X);else{for(var m=0,K=[],t=G.length;m<t;m++)(G[m].fn!==l||Z&&!G[m].once||b&&G[m].context!==b)&&K.push(G[m]);K.length?this._events[X]=1===K.length?K[0]:K:y(this,X)}return this},G.prototype.removeAllListeners=function(d){var l;return d?(l=c?c+d:d,this._events[l]&&y(this,l)):(this._events=new b,this._eventsCount=0),this},G.prototype.off=G.prototype.removeListener,G.prototype.addListener=G.prototype.on,G.prefixed=c,G.EventEmitter=G,d.exports=G}));return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function d(){return new o}function c(){var d,l,c=new Promise((function(){d=arguments[0],l=arguments[1]}));return c.resolve=d,c.reject=l,c}function b(){for(var d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=c.length,Z=0;Z<d;Z++)l[Z]=c[0|Math.random()*b];return l.join("")}var Z,y=(Z="CgoKdmFyIHQ9QXJyYXkuaXNBcnJheSxlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fWZ1bmN0aW9uIG8odCl7dmFyIGU9e2V4cG9ydHM6e319O3JldHVybiB0KGUsZS5leHBvcnRzKSxlLmV4cG9ydHN9dmFyIG49Im9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLk9iamVjdD09PU9iamVjdCYmZSxzPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsaT1ufHxzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHU9aS5TeW1ib2wsYT1PYmplY3QucHJvdG90eXBlLGg9YS5oYXNPd25Qcm9wZXJ0eSxsPWEudG9TdHJpbmcsYz11P3UudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBmPWZ1bmN0aW9uKHQpe3ZhciBlPWguY2FsbCh0LGMpLHI9dFtjXTt0cnl7dFtjXT12b2lkIDA7dmFyIG89ITB9Y2F0Y2godCl7fXZhciBuPWwuY2FsbCh0KTtyZXR1cm4gbyYmKGU/dFtjXT1yOmRlbGV0ZSB0W2NdKSxufSxtPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIGc9ZnVuY3Rpb24odCl7cmV0dXJuIG0uY2FsbCh0KX0scD11P3UudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciB3PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOnAmJnAgaW4gT2JqZWN0KHQpP2YodCk6Zyh0KX07dmFyIGQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH07dmFyIGI9ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxkKHQpJiYiW29iamVjdCBTeW1ib2xdIj09dyh0KX0seT0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyx2PS9eXHcqJC87dmFyIE09ZnVuY3Rpb24oZSxyKXtpZih0KGUpKXJldHVybiExO3ZhciBvPXR5cGVvZiBlO3JldHVybiEoIm51bWJlciIhPW8mJiJzeW1ib2wiIT1vJiYiYm9vbGVhbiIhPW8mJm51bGwhPWUmJiFiKGUpKXx8KHYudGVzdChlKXx8IXkudGVzdChlKXx8bnVsbCE9ciYmZSBpbiBPYmplY3QocikpfTt2YXIgeD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX07dmFyIEUsUz1mdW5jdGlvbih0KXtpZigheCh0KSlyZXR1cm4hMTt2YXIgZT13KHQpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgUHJveHldIj09ZX0saj1pWyJfX2NvcmUtanNfc2hhcmVkX18iXSxfPShFPS9bXi5dKyQvLmV4ZWMoaiYmai5rZXlzJiZqLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIitFOiIiO3ZhciBBPWZ1bmN0aW9uKHQpe3JldHVybiEhXyYmXyBpbiB0fSxDPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzt2YXIgUj1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIEMuY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9LEk9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8saz1GdW5jdGlvbi5wcm90b3R5cGUsTj1PYmplY3QucHJvdG90eXBlLE89ay50b1N0cmluZyxGPU4uaGFzT3duUHJvcGVydHksej1SZWdFeHAoIl4iK08uY2FsbChGKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgVD1mdW5jdGlvbih0KXtyZXR1cm4hKCF4KHQpfHxBKHQpKSYmKFModCk/ejpJKS50ZXN0KFIodCkpfTt2YXIgVj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfTt2YXIgUD1mdW5jdGlvbih0LGUpe3ZhciByPVYodCxlKTtyZXR1cm4gVChyKT9yOnZvaWQgMH0scT1QKE9iamVjdCwiY3JlYXRlIik7dmFyICQ9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPXE/cShudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIEQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgTD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKHEpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gVS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LEI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgRz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBxP3ZvaWQgMCE9PWVbdF06Qi5jYWxsKGUsdCl9O3ZhciBLPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1xJiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O2Z1bmN0aW9uIFcodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBvPXRbZV07dGhpcy5zZXQob1swXSxvWzFdKX19Vy5wcm90b3R5cGUuY2xlYXI9JCxXLnByb3RvdHlwZS5kZWxldGU9RCxXLnByb3RvdHlwZS5nZXQ9TCxXLnByb3RvdHlwZS5oYXM9RyxXLnByb3RvdHlwZS5zZXQ9Szt2YXIgWD1XO3ZhciBKPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIFk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9O3ZhciBaPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoO3ItLTspaWYoWSh0W3JdWzBdLGUpKXJldHVybiByO3JldHVybi0xfSxIPUFycmF5LnByb3RvdHlwZS5zcGxpY2U7dmFyIFE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPVooZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6SC5jYWxsKGUsciwxKSwtLXRoaXMuc2l6ZSwhMCl9O3ZhciB0dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9WihlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19O3ZhciBldD1mdW5jdGlvbih0KXtyZXR1cm4gWih0aGlzLl9fZGF0YV9fLHQpPi0xfTt2YXIgcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG89WihyLHQpO3JldHVybiBvPDA/KCsrdGhpcy5zaXplLHIucHVzaChbdCxlXSkpOnJbb11bMV09ZSx0aGlzfTtmdW5jdGlvbiBvdCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG89dFtlXTt0aGlzLnNldChvWzBdLG9bMV0pfX1vdC5wcm90b3R5cGUuY2xlYXI9SixvdC5wcm90b3R5cGUuZGVsZXRlPVEsb3QucHJvdG90eXBlLmdldD10dCxvdC5wcm90b3R5cGUuaGFzPWV0LG90LnByb3RvdHlwZS5zZXQ9cnQ7dmFyIG50PW90LHN0PVAoaSwiTWFwIik7dmFyIGl0PWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgWCxtYXA6bmV3KHN0fHxudCksc3RyaW5nOm5ldyBYfX07dmFyIHV0PWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9O3ZhciBhdD1mdW5jdGlvbih0LGUpe3ZhciByPXQuX19kYXRhX187cmV0dXJuIHV0KGUpP3JbInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06ci5tYXB9O3ZhciBodD1mdW5jdGlvbih0KXt2YXIgZT1hdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfTt2YXIgbHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGF0KHRoaXMsdCkuZ2V0KHQpfTt2YXIgY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGF0KHRoaXMsdCkuaGFzKHQpfTt2YXIgZnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1hdCh0aGlzLHQpLG89ci5zaXplO3JldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZSs9ci5zaXplPT1vPzA6MSx0aGlzfTtmdW5jdGlvbiBtdCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG89dFtlXTt0aGlzLnNldChvWzBdLG9bMV0pfX1tdC5wcm90b3R5cGUuY2xlYXI9aXQsbXQucHJvdG90eXBlLmRlbGV0ZT1odCxtdC5wcm90b3R5cGUuZ2V0PWx0LG10LnByb3RvdHlwZS5oYXM9Y3QsbXQucHJvdG90eXBlLnNldD1mdDt2YXIgZ3Q9bXQ7ZnVuY3Rpb24gcHQodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciByPWZ1bmN0aW9uKCl7dmFyIG89YXJndW1lbnRzLG49ZT9lLmFwcGx5KHRoaXMsbyk6b1swXSxzPXIuY2FjaGU7aWYocy5oYXMobikpcmV0dXJuIHMuZ2V0KG4pO3ZhciBpPXQuYXBwbHkodGhpcyxvKTtyZXR1cm4gci5jYWNoZT1zLnNldChuLGkpfHxzLGl9O3JldHVybiByLmNhY2hlPW5ldyhwdC5DYWNoZXx8Z3QpLHJ9cHQuQ2FjaGU9Z3Q7dmFyIHd0PXB0O3ZhciBkdD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxidD0vXFwoXFwpPy9nLHl0PWZ1bmN0aW9uKHQpe3ZhciBlPXd0KHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1yLnNpemUmJnIuY2xlYXIoKSx0fSkpLHI9ZS5jYWNoZTtyZXR1cm4gZX0oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoZHQsKGZ1bmN0aW9uKHQscixvLG4pe2UucHVzaChvP24ucmVwbGFjZShidCwiJDEiKTpyfHx0KX0pKSxlfSkpO3ZhciB2dD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aCxuPUFycmF5KG8pOysrcjxvOyluW3JdPWUodFtyXSxyLHQpO3JldHVybiBufSxNdD11P3UucHJvdG90eXBlOnZvaWQgMCx4dD1NdD9NdC50b1N0cmluZzp2b2lkIDA7dmFyIEV0PWZ1bmN0aW9uIGUocil7aWYoInN0cmluZyI9PXR5cGVvZiByKXJldHVybiByO2lmKHQocikpcmV0dXJuIHZ0KHIsZSkrIiI7aWYoYihyKSlyZXR1cm4geHQ/eHQuY2FsbChyKToiIjt2YXIgbz1yKyIiO3JldHVybiIwIj09byYmMS9yPT0tSW5maW5pdHk/Ii0wIjpvfTt2YXIgU3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6RXQodCl9O3ZhciBqdD1mdW5jdGlvbihlLHIpe3JldHVybiB0KGUpP2U6TShlLHIpP1tlXTp5dChTdChlKSl9O3ZhciBfdD1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fGIodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX07dmFyIEF0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbz0oZT1qdChlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxvOyl0PXRbX3QoZVtyKytdKV07cmV0dXJuIHImJnI9PW8/dDp2b2lkIDB9O3ZhciBDdD1mdW5jdGlvbih0LGUscil7dmFyIG89bnVsbD09dD92b2lkIDA6QXQodCxlKTtyZXR1cm4gdm9pZCAwPT09bz9yOm99LFJ0PU9iamVjdC5wcm90b3R5cGU7dmFyIEl0PWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxSdCl9O3ZhciBrdD1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdChlKHIpKX19KE9iamVjdC5rZXlzLE9iamVjdCksTnQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgT3Q9ZnVuY3Rpb24odCl7aWYoIUl0KHQpKXJldHVybiBrdCh0KTt2YXIgZT1bXTtmb3IodmFyIHIgaW4gT2JqZWN0KHQpKU50LmNhbGwodCxyKSYmImNvbnN0cnVjdG9yIiE9ciYmZS5wdXNoKHIpO3JldHVybiBlfSxGdD1QKGksIkRhdGFWaWV3IiksenQ9UChpLCJQcm9taXNlIiksVHQ9UChpLCJTZXQiKSxWdD1QKGksIldlYWtNYXAiKSxQdD1SKEZ0KSxxdD1SKHN0KSwkdD1SKHp0KSxEdD1SKFR0KSxVdD1SKFZ0KSxMdD13OyhGdCYmIltvYmplY3QgRGF0YVZpZXddIiE9THQobmV3IEZ0KG5ldyBBcnJheUJ1ZmZlcigxKSkpfHxzdCYmIltvYmplY3QgTWFwXSIhPUx0KG5ldyBzdCl8fHp0JiYiW29iamVjdCBQcm9taXNlXSIhPUx0KHp0LnJlc29sdmUoKSl8fFR0JiYiW29iamVjdCBTZXRdIiE9THQobmV3IFR0KXx8VnQmJiJbb2JqZWN0IFdlYWtNYXBdIiE9THQobmV3IFZ0KSkmJihMdD1mdW5jdGlvbih0KXt2YXIgZT13KHQpLHI9IltvYmplY3QgT2JqZWN0XSI9PWU/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAsbz1yP1Iocik6IiI7aWYobylzd2l0Y2gobyl7Y2FzZSBQdDpyZXR1cm4iW29iamVjdCBEYXRhVmlld10iO2Nhc2UgcXQ6cmV0dXJuIltvYmplY3QgTWFwXSI7Y2FzZSAkdDpyZXR1cm4iW29iamVjdCBQcm9taXNlXSI7Y2FzZSBEdDpyZXR1cm4iW29iamVjdCBTZXRdIjtjYXNlIFV0OnJldHVybiJbb2JqZWN0IFdlYWtNYXBdIn1yZXR1cm4gZX0pO3ZhciBCdD1MdDt2YXIgR3Q9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PTkwMDcxOTkyNTQ3NDA5OTF9O3ZhciBLdD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmR3QodC5sZW5ndGgpJiYhUyh0KX07dmFyIFd0PWZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8IXQoZSkmJmQoZSkmJiJbb2JqZWN0IFN0cmluZ10iPT13KGUpfTt2YXIgWHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3ZvaWQgMDplW3RdfX0sSnQ9WHQoImxlbmd0aCIpLFl0PVJlZ0V4cCgiW1xcdTIwMGRcXHVkODAwLVxcdWRmZmZcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZcXHVmZTBlXFx1ZmUwZl0iKTt2YXIgWnQ9ZnVuY3Rpb24odCl7cmV0dXJuIFl0LnRlc3QodCl9LEh0PSJbXFx1ZDgwMC1cXHVkZmZmXSIsUXQ9IltcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZdIix0ZT0iXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdIixlZT0iW15cXHVkODAwLVxcdWRmZmZdIixyZT0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIsb2U9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLG5lPSIoPzoiK1F0KyJ8Iit0ZSsiKSIrIj8iLHNlPSJbXFx1ZmUwZVxcdWZlMGZdPyIrbmUrKCIoPzpcXHUyMDBkKD86IitbZWUscmUsb2VdLmpvaW4oInwiKSsiKVtcXHVmZTBlXFx1ZmUwZl0/IituZSsiKSoiKSxpZT0iKD86IitbZWUrUXQrIj8iLFF0LHJlLG9lLEh0XS5qb2luKCJ8IikrIikiLHVlPVJlZ0V4cCh0ZSsiKD89Iit0ZSsiKXwiK2llK3NlLCJnIik7dmFyIGFlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT11ZS5sYXN0SW5kZXg9MDt1ZS50ZXN0KHQpOykrK2U7cmV0dXJuIGV9O3ZhciBoZT1mdW5jdGlvbih0KXtyZXR1cm4gWnQodCk/YWUodCk6SnQodCl9O3ZhciBsZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKEt0KHQpKXJldHVybiBXdCh0KT9oZSh0KTp0Lmxlbmd0aDt2YXIgZT1CdCh0KTtyZXR1cm4iW29iamVjdCBNYXBdIj09ZXx8IltvYmplY3QgU2V0XSI9PWU/dC5zaXplOk90KHQpLmxlbmd0aH07dmFyIGNlPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8ZCh0KSYmIltvYmplY3QgTnVtYmVyXSI9PXcodCl9O3ZhciBmZT1mdW5jdGlvbih0KXtyZXR1cm4hMD09PXR8fCExPT09dHx8ZCh0KSYmIltvYmplY3QgQm9vbGVhbl0iPT13KHQpfTtmdW5jdGlvbiBtZSh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGdlKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHBlKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHdlKHQpe3JldHVybiEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZihnZSh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hKCFwZSh0KXx8IiIhPT10KX0odCl8fCEhZnVuY3Rpb24odCl7cmV0dXJuISFtZSh0KSYmMD09PXQubGVuZ3RofSh0KSkpKX1mdW5jdGlvbiBkZSh0KXtyZXR1cm4hIW1lKHQpJiYoMCE9PXQubGVuZ3RoJiYoMSE9PXQubGVuZ3RofHwhd2UodFswXSkpKX1jb25zdCBiZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIHllKHQpe3JldHVybiBiZS5jYWxsKHQpLmVuZHNXaXRoKCJBcnJheV0iKX1mdW5jdGlvbiB2ZSh0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgcj1lLmZyb21JbmRleCxvPXZvaWQgMD09PXI/MDpyLG49ZS50b0luZGV4LHM9dm9pZCAwPT09bj90Lmxlbmd0aDpuO2lmKG88MHx8bz49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG8pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1vfHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciBpPXRbb10sdT1vKzE7dTxzO3UrKyl0W3VdPmkmJihpPXRbdV0pO3JldHVybiBpfWZ1bmN0aW9uIE1lKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZigheWUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO3ZhciByPWUuZnJvbUluZGV4LG89dm9pZCAwPT09cj8wOnIsbj1lLnRvSW5kZXgscz12b2lkIDA9PT1uP3QubGVuZ3RoOm47aWYobzwwfHxvPj10Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IEVycm9yKCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aCIpO2lmKHM8PW98fHM+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKHMpKXRocm93IG5ldyBFcnJvcigidG9JbmRleCBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGZyb21JbmRleCBhbmQgYXQgbW9zdCBlcXVhbCB0byBsZW5ndGgiKTtmb3IodmFyIGk9dFtvXSx1PW8rMTt1PHM7dSsrKXRbdV08aSYmKGk9dFt1XSk7cmV0dXJuIGl9ZnVuY3Rpb24geGUodCl7dmFyIGUscj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtpZih2b2lkIDAhPT1yLm91dHB1dCl7aWYoIXllKHIub3V0cHV0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvdXRwdXQgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkgaWYgc3BlY2lmaWVkIik7ZT1yLm91dHB1dH1lbHNlIGU9bmV3IEFycmF5KHQubGVuZ3RoKTt2YXIgbz1NZSh0KSxuPXZlKHQpO2lmKG89PT1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW5pbXVtIGFuZCBtYXhpbXVtIGlucHV0IHZhbHVlcyBhcmUgZXF1YWwuIENhbm5vdCByZXNjYWxlIGEgY29uc3RhbnQgYXJyYXkiKTt2YXIgcz1yLm1pbixpPXZvaWQgMD09PXM/ci5hdXRvTWluTWF4P286MDpzLHU9ci5tYXgsYT12b2lkIDA9PT11P3IuYXV0b01pbk1heD9uOjE6dTtpZihpPj1hKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gb3B0aW9uIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCBvcHRpb24iKTtmb3IodmFyIGg9KGEtaSkvKG4tbyksbD0wO2w8dC5sZW5ndGg7bCsrKWVbbF09KHRbbF0tbykqaCtpO3JldHVybiBlfWNvbnN0IEVlPSIgIi5yZXBlYXQoMiksU2U9IiAiLnJlcGVhdCg0KTtmdW5jdGlvbiBqZSh0LGU9e30pe2NvbnN0e21heFJvd3M6cj0xNSxtYXhDb2x1bW5zOm89MTAsbWF4TnVtU2l6ZTpuPTh9PWU7cmV0dXJuYCR7dC5jb25zdHJ1Y3Rvci5uYW1lfSB7XG4ke0VlfVtcbiR7U2V9JHtmdW5jdGlvbih0LGUscixvKXtjb25zdHtyb3dzOm4sY29sdW1uczpzfT10LGk9TWF0aC5taW4obixlKSx1PU1hdGgubWluKHMsciksYT1bXTtmb3IobGV0IGU9MDtlPGk7ZSsrKXtsZXQgcj1bXTtmb3IobGV0IG49MDtuPHU7bisrKXIucHVzaChfZSh0LmdldChlLG4pLG8pKTthLnB1c2goYCR7ci5qb2luKCIgIil9YCl9dSE9PXMmJihhW2EubGVuZ3RoLTFdKz1gIC4uLiAke3Mtcn0gbW9yZSBjb2x1bW5zYCk7aSE9PW4mJmEucHVzaChgLi4uICR7bi1lfSBtb3JlIHJvd3NgKTtyZXR1cm4gYS5qb2luKGBcbiR7U2V9YCl9KHQscixvLG4pfVxuJHtFZX1dXG4ke0VlfXJvd3M6ICR7dC5yb3dzfVxuJHtFZX1jb2x1bW5zOiAke3QuY29sdW1uc31cbn1gfWZ1bmN0aW9uIF9lKHQsZSl7Y29uc3Qgcj1TdHJpbmcodCk7aWYoci5sZW5ndGg8PWUpcmV0dXJuIHIucGFkRW5kKGUsIiAiKTtjb25zdCBvPXQudG9QcmVjaXNpb24oZS0yKTtpZihvLmxlbmd0aDw9ZSlyZXR1cm4gbztjb25zdCBuPXQudG9FeHBvbmVudGlhbChlLTIpLHM9bi5pbmRleE9mKCJlIiksaT1uLnNsaWNlKHMpO3JldHVybiBuLnNsaWNlKDAsZS1pLmxlbmd0aCkraX1mdW5jdGlvbiBBZSh0LGUscil7bGV0IG89cj90LnJvd3M6dC5yb3dzLTE7aWYoZTwwfHxlPm8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlJvdyBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBDZSh0LGUscil7bGV0IG89cj90LmNvbHVtbnM6dC5jb2x1bW5zLTE7aWYoZTwwfHxlPm8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBSZSh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMiKTtyZXR1cm4gZX1mdW5jdGlvbiBJZSh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJvd3MiKTtyZXR1cm4gZX1mdW5jdGlvbiBrZSh0LGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmV4cGVjdGVkIHR5cGUgZm9yIHJvdyBpbmRpY2VzIik7aWYoZS5zb21lKChlPT5lPDB8fGU+PXQucm93cykpKXRocm93IG5ldyBSYW5nZUVycm9yKCJyb3cgaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIik7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl8fChlPUFycmF5LmZyb20oZSkpLGV9ZnVuY3Rpb24gTmUodCxlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigidW5leHBlY3RlZCB0eXBlIGZvciBjb2x1bW4gaW5kaWNlcyIpO2lmKGUuc29tZSgoZT0+ZTwwfHxlPj10LmNvbHVtbnMpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiY29sdW1uIGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpO3JldHVybiBBcnJheS5pc0FycmF5KGUpfHwoZT1BcnJheS5mcm9tKGUpKSxlfWZ1bmN0aW9uIE9lKHQsZSxyLG8sbil7aWYoNSE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImV4cGVjdGVkIDQgYXJndW1lbnRzIik7aWYoemUoInN0YXJ0Um93IixlKSx6ZSgiZW5kUm93IixyKSx6ZSgic3RhcnRDb2x1bW4iLG8pLHplKCJlbmRDb2x1bW4iLG4pLGU+cnx8bz5ufHxlPDB8fGU+PXQucm93c3x8cjwwfHxyPj10LnJvd3N8fG88MHx8bz49dC5jb2x1bW5zfHxuPDB8fG4+PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiU3VibWF0cml4IGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEZlKHQsZT0wKXtsZXQgcj1bXTtmb3IobGV0IG89MDtvPHQ7bysrKXIucHVzaChlKTtyZXR1cm4gcn1mdW5jdGlvbiB6ZSh0LGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke3R9IG11c3QgYmUgYSBudW1iZXJgKX1mdW5jdGlvbiBUZSh0KXtpZih0LmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIkVtcHR5IG1hdHJpeCBoYXMgbm8gZWxlbWVudHMgdG8gaW5kZXgiKX1jbGFzcyBWZXtzdGF0aWMgZnJvbTFEQXJyYXkodCxlLHIpe2lmKHQqZSE9PXIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJkYXRhIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBnaXZlbiBkaW1lbnNpb25zIik7bGV0IG89bmV3IHFlKHQsZSk7Zm9yKGxldCBuPTA7bjx0O24rKylmb3IobGV0IHQ9MDt0PGU7dCsrKW8uc2V0KG4sdCxyW24qZSt0XSk7cmV0dXJuIG99c3RhdGljIHJvd1ZlY3Rvcih0KXtsZXQgZT1uZXcgcWUoMSx0Lmxlbmd0aCk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZS5zZXQoMCxyLHRbcl0pO3JldHVybiBlfXN0YXRpYyBjb2x1bW5WZWN0b3IodCl7bGV0IGU9bmV3IHFlKHQubGVuZ3RoLDEpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWUuc2V0KHIsMCx0W3JdKTtyZXR1cm4gZX1zdGF0aWMgemVyb3ModCxlKXtyZXR1cm4gbmV3IHFlKHQsZSl9c3RhdGljIG9uZXModCxlKXtyZXR1cm4gbmV3IHFlKHQsZSkuZmlsbCgxKX1zdGF0aWMgcmFuZCh0LGUscj17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtyYW5kb206bz1NYXRoLnJhbmRvbX09cjtsZXQgbj1uZXcgcWUodCxlKTtmb3IobGV0IHI9MDtyPHQ7cisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspbi5zZXQocix0LG8oKSk7cmV0dXJuIG59c3RhdGljIHJhbmRJbnQodCxlLHI9e30pe2lmKCJvYmplY3QiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOm89MCxtYXg6bj0xZTMscmFuZG9tOnM9TWF0aC5yYW5kb219PXI7aWYoIU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGFuIGludGVnZXIiKTtpZihvPj1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IGk9bi1vLHU9bmV3IHFlKHQsZSk7Zm9yKGxldCByPTA7cjx0O3IrKylmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT1vK01hdGgucm91bmQocygpKmkpO3Uuc2V0KHIsdCxlKX1yZXR1cm4gdX1zdGF0aWMgZXllKHQsZSxyKXt2b2lkIDA9PT1lJiYoZT10KSx2b2lkIDA9PT1yJiYocj0xKTtsZXQgbz1NYXRoLm1pbih0LGUpLG49dGhpcy56ZXJvcyh0LGUpO2ZvcihsZXQgdD0wO3Q8bzt0Kyspbi5zZXQodCx0LHIpO3JldHVybiBufXN0YXRpYyBkaWFnKHQsZSxyKXtsZXQgbz10Lmxlbmd0aDt2b2lkIDA9PT1lJiYoZT1vKSx2b2lkIDA9PT1yJiYocj1lKTtsZXQgbj1NYXRoLm1pbihvLGUscikscz10aGlzLnplcm9zKGUscik7Zm9yKGxldCBlPTA7ZTxuO2UrKylzLnNldChlLGUsdFtlXSk7cmV0dXJuIHN9c3RhdGljIG1pbih0LGUpe3Q9dGhpcy5jaGVja01hdHJpeCh0KSxlPXRoaXMuY2hlY2tNYXRyaXgoZSk7bGV0IHI9dC5yb3dzLG89dC5jb2x1bW5zLG49bmV3IHFlKHIsbyk7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG87cisrKW4uc2V0KHMscixNYXRoLm1pbih0LmdldChzLHIpLGUuZ2V0KHMscikpKTtyZXR1cm4gbn1zdGF0aWMgbWF4KHQsZSl7dD10aGlzLmNoZWNrTWF0cml4KHQpLGU9dGhpcy5jaGVja01hdHJpeChlKTtsZXQgcj10LnJvd3Msbz10LmNvbHVtbnMsbj1uZXcgdGhpcyhyLG8pO2ZvcihsZXQgcz0wO3M8cjtzKyspZm9yKGxldCByPTA7cjxvO3IrKyluLnNldChzLHIsTWF0aC5tYXgodC5nZXQocyxyKSxlLmdldChzLHIpKSk7cmV0dXJuIG59c3RhdGljIGNoZWNrTWF0cml4KHQpe3JldHVybiBWZS5pc01hdHJpeCh0KT90Om5ldyBxZSh0KX1zdGF0aWMgaXNNYXRyaXgodCl7cmV0dXJuIG51bGwhPXQmJiJNYXRyaXgiPT09dC5rbGFzc31nZXQgc2l6ZSgpe3JldHVybiB0aGlzLnJvd3MqdGhpcy5jb2x1bW5zfWFwcGx5KHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbiIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5jYWxsKHRoaXMsZSxyKTtyZXR1cm4gdGhpc310bzFEQXJyYXkoKXtsZXQgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQucHVzaCh0aGlzLmdldChlLHIpKTtyZXR1cm4gdH10bzJEQXJyYXkoKXtsZXQgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspe3QucHVzaChbXSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRbZV0ucHVzaCh0aGlzLmdldChlLHIpKX1yZXR1cm4gdH10b0pTT04oKXtyZXR1cm4gdGhpcy50bzJEQXJyYXkoKX1pc1Jvd1ZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5yb3dzfWlzQ29sdW1uVmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLmNvbHVtbnN9aXNWZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMucm93c3x8MT09PXRoaXMuY29sdW1uc31pc1NxdWFyZSgpe3JldHVybiB0aGlzLnJvd3M9PT10aGlzLmNvbHVtbnN9aXNFbXB0eSgpe3JldHVybiAwPT09dGhpcy5yb3dzfHwwPT09dGhpcy5jb2x1bW5zfWlzU3ltbWV0cmljKCl7aWYodGhpcy5pc1NxdWFyZSgpKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTw9dDtlKyspaWYodGhpcy5nZXQodCxlKSE9PXRoaXMuZ2V0KGUsdCkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9aXNFY2hlbG9uRm9ybSgpe2xldCB0PTAsZT0wLHI9LTEsbz0hMCxuPSExO2Zvcig7dDx0aGlzLnJvd3MmJm87KXtmb3IoZT0wLG49ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09bjspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPnI/KG49ITAscj1lKToobz0hMSxuPSEwKTt0Kyt9cmV0dXJuIG99aXNSZWR1Y2VkRWNoZWxvbkZvcm0oKXtsZXQgdD0wLGU9MCxyPS0xLG89ITAsbj0hMTtmb3IoO3Q8dGhpcy5yb3dzJiZvOyl7Zm9yKGU9MCxuPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PW47KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5yPyhuPSEwLHI9ZSk6KG89ITEsbj0hMCk7Zm9yKGxldCByPWUrMTtyPHRoaXMucm93cztyKyspMCE9PXRoaXMuZ2V0KHQscikmJihvPSExKTt0Kyt9cmV0dXJuIG99ZWNoZWxvbkZvcm0oKXtsZXQgdD10aGlzLmNsb25lKCksZT0wLHI9MDtmb3IoO2U8dC5yb3dzJiZyPHQuY29sdW1uczspe2xldCBvPWU7Zm9yKGxldCBuPWU7bjx0LnJvd3M7bisrKXQuZ2V0KG4scik+dC5nZXQobyxyKSYmKG89bik7aWYoMD09PXQuZ2V0KG8scikpcisrO2Vsc2V7dC5zd2FwUm93cyhlLG8pO2xldCBuPXQuZ2V0KGUscik7Zm9yKGxldCBvPXI7bzx0LmNvbHVtbnM7bysrKXQuc2V0KGUsbyx0LmdldChlLG8pL24pO2ZvcihsZXQgbz1lKzE7bzx0LnJvd3M7bysrKXtsZXQgbj10LmdldChvLHIpL3QuZ2V0KGUscik7dC5zZXQobyxyLDApO2ZvcihsZXQgcz1yKzE7czx0LmNvbHVtbnM7cysrKXQuc2V0KG8scyx0LmdldChvLHMpLXQuZ2V0KGUscykqbil9ZSsrLHIrK319cmV0dXJuIHR9cmVkdWNlZEVjaGVsb25Gb3JtKCl7bGV0IHQ9dGhpcy5lY2hlbG9uRm9ybSgpLGU9dC5jb2x1bW5zLHI9dC5yb3dzLG89ci0xO2Zvcig7bz49MDspaWYoMD09PXQubWF4Um93KG8pKW8tLTtlbHNle2xldCBuPTAscz0hMTtmb3IoO248ciYmITE9PT1zOykxPT09dC5nZXQobyxuKT9zPSEwOm4rKztmb3IobGV0IHI9MDtyPG87cisrKXtsZXQgcz10LmdldChyLG4pO2ZvcihsZXQgaT1uO2k8ZTtpKyspe2xldCBlPXQuZ2V0KHIsaSktcyp0LmdldChvLGkpO3Quc2V0KHIsaSxlKX19by0tfXJldHVybiB0fXNldCgpe3Rocm93IG5ldyBFcnJvcigic2V0IG1ldGhvZCBpcyB1bmltcGxlbWVudGVkIil9Z2V0KCl7dGhyb3cgbmV3IEVycm9yKCJnZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQiKX1yZXBlYXQodD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtyb3dzOmU9MSxjb2x1bW5zOnI9MX09dDtpZighTnVtYmVyLmlzSW50ZWdlcihlKXx8ZTw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJyb3dzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7aWYoIU51bWJlci5pc0ludGVnZXIocil8fHI8PTApdGhyb3cgbmV3IFR5cGVFcnJvcigiY29sdW1ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2xldCBvPW5ldyBxZSh0aGlzLnJvd3MqZSx0aGlzLmNvbHVtbnMqcik7Zm9yKGxldCB0PTA7dDxlO3QrKylmb3IobGV0IGU9MDtlPHI7ZSsrKW8uc2V0U3ViTWF0cml4KHRoaXMsdGhpcy5yb3dzKnQsdGhpcy5jb2x1bW5zKmUpO3JldHVybiBvfWZpbGwodCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9bmVnKCl7cmV0dXJuIHRoaXMubXVsUygtMSl9Z2V0Um93KHQpe0FlKHRoaXMsdCk7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKWUucHVzaCh0aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1nZXRSb3dWZWN0b3IodCl7cmV0dXJuIHFlLnJvd1ZlY3Rvcih0aGlzLmdldFJvdyh0KSl9c2V0Um93KHQsZSl7QWUodGhpcyx0KSxlPVJlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KHQscixlW3JdKTtyZXR1cm4gdGhpc31zd2FwUm93cyh0LGUpe0FlKHRoaXMsdCksQWUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspe2xldCBvPXRoaXMuZ2V0KHQscik7dGhpcy5zZXQodCxyLHRoaXMuZ2V0KGUscikpLHRoaXMuc2V0KGUscixvKX1yZXR1cm4gdGhpc31nZXRDb2x1bW4odCl7Q2UodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZS5wdXNoKHRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfWdldENvbHVtblZlY3Rvcih0KXtyZXR1cm4gcWUuY29sdW1uVmVjdG9yKHRoaXMuZ2V0Q29sdW1uKHQpKX1zZXRDb2x1bW4odCxlKXtDZSh0aGlzLHQpLGU9SWUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspdGhpcy5zZXQocix0LGVbcl0pO3JldHVybiB0aGlzfXN3YXBDb2x1bW5zKHQsZSl7Q2UodGhpcyx0KSxDZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl7bGV0IG89dGhpcy5nZXQocix0KTt0aGlzLnNldChyLHQsdGhpcy5nZXQocixlKSksdGhpcy5zZXQocixlLG8pfXJldHVybiB0aGlzfWFkZFJvd1ZlY3Rvcih0KXt0PVJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0W3JdKTtyZXR1cm4gdGhpc31zdWJSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdFtyXSk7cmV0dXJuIHRoaXN9bXVsUm93VmVjdG9yKHQpe3Q9UmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnRbcl0pO3JldHVybiB0aGlzfWRpdlJvd1ZlY3Rvcih0KXt0PVJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90W3JdKTtyZXR1cm4gdGhpc31hZGRDb2x1bW5WZWN0b3IodCl7dD1JZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdFtlXSk7cmV0dXJuIHRoaXN9c3ViQ29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXRbZV0pO3JldHVybiB0aGlzfW11bENvbHVtblZlY3Rvcih0KXt0PUllKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0W2VdKTtyZXR1cm4gdGhpc31kaXZDb2x1bW5WZWN0b3IodCl7dD1JZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdFtlXSk7cmV0dXJuIHRoaXN9bXVsUm93KHQsZSl7QWUodGhpcyx0KTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQodCxyLHRoaXMuZ2V0KHQscikqZSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uKHQsZSl7Q2UodGhpcyx0KTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspdGhpcy5zZXQocix0LHRoaXMuZ2V0KHIsdCkqZSk7cmV0dXJuIHRoaXN9bWF4KCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKT50JiYodD10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1tYXhJbmRleCgpe1RlKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBvPTA7bzx0aGlzLmNvbHVtbnM7bysrKXRoaXMuZ2V0KHIsbyk+dCYmKHQ9dGhpcy5nZXQocixvKSxlWzBdPXIsZVsxXT1vKTtyZXR1cm4gZX1taW4oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPHQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fW1pbkluZGV4KCl7VGUodGhpcyk7bGV0IHQ9dGhpcy5nZXQoMCwwKSxlPVswLDBdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKylmb3IobGV0IG89MDtvPHRoaXMuY29sdW1ucztvKyspdGhpcy5nZXQocixvKTx0JiYodD10aGlzLmdldChyLG8pLGVbMF09cixlWzFdPW8pO3JldHVybiBlfW1heFJvdyh0KXtpZihBZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IHI9MTtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQodCxyKT5lJiYoZT10aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1tYXhSb3dJbmRleCh0KXtBZSh0aGlzLHQpLFRlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KHQsMCkscj1bdCwwXTtmb3IobGV0IG89MTtvPHRoaXMuY29sdW1ucztvKyspdGhpcy5nZXQodCxvKT5lJiYoZT10aGlzLmdldCh0LG8pLHJbMV09byk7cmV0dXJuIHJ9bWluUm93KHQpe2lmKEFlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCh0LDApO2ZvcihsZXQgcj0xO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldCh0LHIpPGUmJihlPXRoaXMuZ2V0KHQscikpO3JldHVybiBlfW1pblJvd0luZGV4KHQpe0FlKHRoaXMsdCksVGUodGhpcyk7bGV0IGU9dGhpcy5nZXQodCwwKSxyPVt0LDBdO2ZvcihsZXQgbz0xO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldCh0LG8pPGUmJihlPXRoaXMuZ2V0KHQsbyksclsxXT1vKTtyZXR1cm4gcn1tYXhDb2x1bW4odCl7aWYoQ2UodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCByPTE7cjx0aGlzLnJvd3M7cisrKXRoaXMuZ2V0KHIsdCk+ZSYmKGU9dGhpcy5nZXQocix0KSk7cmV0dXJuIGV9bWF4Q29sdW1uSW5kZXgodCl7Q2UodGhpcyx0KSxUZSh0aGlzKTtsZXQgZT10aGlzLmdldCgwLHQpLHI9WzAsdF07Zm9yKGxldCBvPTE7bzx0aGlzLnJvd3M7bysrKXRoaXMuZ2V0KG8sdCk+ZSYmKGU9dGhpcy5nZXQobyx0KSxyWzBdPW8pO3JldHVybiByfW1pbkNvbHVtbih0KXtpZihDZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQoMCx0KTtmb3IobGV0IHI9MTtyPHRoaXMucm93cztyKyspdGhpcy5nZXQocix0KTxlJiYoZT10aGlzLmdldChyLHQpKTtyZXR1cm4gZX1taW5Db2x1bW5JbmRleCh0KXtDZSh0aGlzLHQpLFRlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KDAsdCkscj1bMCx0XTtmb3IobGV0IG89MTtvPHRoaXMucm93cztvKyspdGhpcy5nZXQobyx0KTxlJiYoZT10aGlzLmdldChvLHQpLHJbMF09byk7cmV0dXJuIHJ9ZGlhZygpe2xldCB0PU1hdGgubWluKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpLGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2godGhpcy5nZXQocixyKSk7cmV0dXJuIGV9bm9ybSh0PSJmcm9iZW5pdXMiKXtsZXQgZT0wO2lmKCJtYXgiPT09dClyZXR1cm4gdGhpcy5tYXgoKTtpZigiZnJvYmVuaXVzIj09PXQpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspZSs9dGhpcy5nZXQodCxyKSp0aGlzLmdldCh0LHIpO3JldHVybiBNYXRoLnNxcnQoZSl9dGhyb3cgbmV3IFJhbmdlRXJyb3IoYHVua25vd24gbm9ybSB0eXBlOiAke3R9YCl9Y3VtdWxhdGl2ZVN1bSgpe2xldCB0PTA7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0Kz10aGlzLmdldChlLHIpLHRoaXMuc2V0KGUscix0KTtyZXR1cm4gdGhpc31kb3QodCl7VmUuaXNNYXRyaXgodCkmJih0PXQudG8xREFycmF5KCkpO2xldCBlPXRoaXMudG8xREFycmF5KCk7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9ycyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIik7bGV0IHI9MDtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKylyKz1lW29dKnRbb107cmV0dXJuIHJ9bW11bCh0KXt0PXFlLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMucm93cyxyPXRoaXMuY29sdW1ucyxvPXQuY29sdW1ucyxuPW5ldyBxZShlLG8pLHM9bmV3IEZsb2F0NjRBcnJheShyKTtmb3IobGV0IGk9MDtpPG87aSsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKXNbZV09dC5nZXQoZSxpKTtmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT0wO2ZvcihsZXQgbz0wO288cjtvKyspZSs9dGhpcy5nZXQodCxvKSpzW29dO24uc2V0KHQsaSxlKX19cmV0dXJuIG59c3RyYXNzZW4yeDIodCl7dD1xZS5jaGVja01hdHJpeCh0KTtsZXQgZT1uZXcgcWUoMiwyKTtjb25zdCByPXRoaXMuZ2V0KDAsMCksbz10LmdldCgwLDApLG49dGhpcy5nZXQoMCwxKSxzPXQuZ2V0KDAsMSksaT10aGlzLmdldCgxLDApLHU9dC5nZXQoMSwwKSxhPXRoaXMuZ2V0KDEsMSksaD10LmdldCgxLDEpLGw9KHIrYSkqKG8raCksYz0oaSthKSpvLGY9cioocy1oKSxtPWEqKHUtbyksZz0ocituKSpoLHA9bCttLWcrKG4tYSkqKHUraCksdz1mK2csZD1jK20sYj1sLWMrZisoaS1yKSoobytzKTtyZXR1cm4gZS5zZXQoMCwwLHApLGUuc2V0KDAsMSx3KSxlLnNldCgxLDAsZCksZS5zZXQoMSwxLGIpLGV9c3RyYXNzZW4zeDModCl7dD1xZS5jaGVja01hdHJpeCh0KTtsZXQgZT1uZXcgcWUoMywzKTtjb25zdCByPXRoaXMuZ2V0KDAsMCksbz10aGlzLmdldCgwLDEpLG49dGhpcy5nZXQoMCwyKSxzPXRoaXMuZ2V0KDEsMCksaT10aGlzLmdldCgxLDEpLHU9dGhpcy5nZXQoMSwyKSxhPXRoaXMuZ2V0KDIsMCksaD10aGlzLmdldCgyLDEpLGw9dGhpcy5nZXQoMiwyKSxjPXQuZ2V0KDAsMCksZj10LmdldCgwLDEpLG09dC5nZXQoMCwyKSxnPXQuZ2V0KDEsMCkscD10LmdldCgxLDEpLHc9dC5nZXQoMSwyKSxkPXQuZ2V0KDIsMCksYj10LmdldCgyLDEpLHk9dC5nZXQoMiwyKSx2PShyLXMpKigtZitwKSxNPSgtcitzK2kpKihjLWYrcCkseD0ocytpKSooLWMrZiksRT1yKmMsUz0oLXIrYStoKSooYy1tK3cpLGo9KC1yK2EpKihtLXcpLF89KGEraCkqKC1jK20pLEE9KC1uK2grbCkqKHArZC1iKSxDPShuLWwpKihwLWIpLFI9bipkLEk9KGgrbCkqKC1kK2IpLGs9KC1uK2krdSkqKHcrZC15KSxOPShuLXUpKih3LXkpLE89KGkrdSkqKC1kK3kpLEY9RStSK28qZyx6PShyK28rbi1zLWktaC1sKSpwK00reCtFK0ErUitJLFQ9RStTK18rKHIrbytuLWktdS1hLWgpKncrUitrK08sVj12K2kqKC1jK2YrZy1wLXctZCt5KStNK0UrUitrK04sUD12K00reCtFK3UqYixxPVIraytOK08rcyptLCQ9RStTK2oraCooLWMrbStnLXAtdy1kK2IpK0ErQytSLEQ9QStDK1IrSSthKmYsVT1FK1MraitfK2wqeTtyZXR1cm4gZS5zZXQoMCwwLEYpLGUuc2V0KDAsMSx6KSxlLnNldCgwLDIsVCksZS5zZXQoMSwwLFYpLGUuc2V0KDEsMSxQKSxlLnNldCgxLDIscSksZS5zZXQoMiwwLCQpLGUuc2V0KDIsMSxEKSxlLnNldCgyLDIsVSksZX1tbXVsU3RyYXNzZW4odCl7dD1xZS5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLmNsb25lKCkscj1lLnJvd3Msbz1lLmNvbHVtbnMsbj10LnJvd3Mscz10LmNvbHVtbnM7ZnVuY3Rpb24gaSh0LGUscil7bGV0IG89dC5yb3dzLG49dC5jb2x1bW5zO2lmKG89PT1lJiZuPT09cilyZXR1cm4gdDt7bGV0IG89VmUuemVyb3MoZSxyKTtyZXR1cm4gbz1vLnNldFN1Yk1hdHJpeCh0LDAsMCksb319byE9PW4mJmNvbnNvbGUud2FybihgTXVsdGlwbHlpbmcgJHtyfSB4ICR7b30gYW5kICR7bn0geCAke3N9IG1hdHJpeDogZGltZW5zaW9ucyBkbyBub3QgbWF0Y2guYCk7bGV0IHU9TWF0aC5tYXgocixuKSxhPU1hdGgubWF4KG8scyk7cmV0dXJuIGU9aShlLHUsYSksZnVuY3Rpb24gdChlLHIsbyxuKXtpZihvPD01MTJ8fG48PTUxMilyZXR1cm4gZS5tbXVsKHIpO28lMj09MSYmbiUyPT0xPyhlPWkoZSxvKzEsbisxKSxyPWkocixvKzEsbisxKSk6byUyPT0xPyhlPWkoZSxvKzEsbikscj1pKHIsbysxLG4pKTpuJTI9PTEmJihlPWkoZSxvLG4rMSkscj1pKHIsbyxuKzEpKTtsZXQgcz1wYXJzZUludChlLnJvd3MvMiwxMCksdT1wYXJzZUludChlLmNvbHVtbnMvMiwxMCksYT1lLnN1Yk1hdHJpeCgwLHMtMSwwLHUtMSksaD1yLnN1Yk1hdHJpeCgwLHMtMSwwLHUtMSksbD1lLnN1Yk1hdHJpeCgwLHMtMSx1LGUuY29sdW1ucy0xKSxjPXIuc3ViTWF0cml4KDAscy0xLHUsci5jb2x1bW5zLTEpLGY9ZS5zdWJNYXRyaXgocyxlLnJvd3MtMSwwLHUtMSksbT1yLnN1Yk1hdHJpeChzLHIucm93cy0xLDAsdS0xKSxnPWUuc3ViTWF0cml4KHMsZS5yb3dzLTEsdSxlLmNvbHVtbnMtMSkscD1yLnN1Yk1hdHJpeChzLHIucm93cy0xLHUsci5jb2x1bW5zLTEpLHc9dChWZS5hZGQoYSxnKSxWZS5hZGQoaCxwKSxzLHUpLGQ9dChWZS5hZGQoZixnKSxoLHMsdSksYj10KGEsVmUuc3ViKGMscCkscyx1KSx5PXQoZyxWZS5zdWIobSxoKSxzLHUpLHY9dChWZS5hZGQoYSxsKSxwLHMsdSksTT10KFZlLnN1YihmLGEpLFZlLmFkZChoLGMpLHMsdSkseD10KFZlLnN1YihsLGcpLFZlLmFkZChtLHApLHMsdSksRT1WZS5hZGQodyx5KTtFLnN1Yih2KSxFLmFkZCh4KTtsZXQgUz1WZS5hZGQoYix2KSxqPVZlLmFkZChkLHkpLF89VmUuc3ViKHcsZCk7Xy5hZGQoYiksXy5hZGQoTSk7bGV0IEE9VmUuemVyb3MoMipFLnJvd3MsMipFLmNvbHVtbnMpO3JldHVybiBBPUEuc2V0U3ViTWF0cml4KEUsMCwwKSxBPUEuc2V0U3ViTWF0cml4KFMsRS5yb3dzLDApLEE9QS5zZXRTdWJNYXRyaXgoaiwwLEUuY29sdW1ucyksQT1BLnNldFN1Yk1hdHJpeChfLEUucm93cyxFLmNvbHVtbnMpLEEuc3ViTWF0cml4KDAsby0xLDAsbi0xKX0oZSx0PWkodCx1LGEpLHUsYSl9c2NhbGVSb3dzKHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOmU9MCxtYXg6cj0xfT10O2lmKCFOdW1iZXIuaXNGaW5pdGUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYSBudW1iZXIiKTtpZighTnVtYmVyLmlzRmluaXRlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGEgbnVtYmVyIik7aWYoZT49cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBvPW5ldyBxZSh0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0Kyspe2NvbnN0IG49dGhpcy5nZXRSb3codCk7bi5sZW5ndGg+MCYmeGUobix7bWluOmUsbWF4OnIsb3V0cHV0Om59KSxvLnNldFJvdyh0LG4pfXJldHVybiBvfXNjYWxlQ29sdW1ucyh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjplPTAsbWF4OnI9MX09dDtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIU51bWJlci5pc0Zpbml0ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhIG51bWJlciIpO2lmKGU+PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgbz1uZXcgcWUodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCB0PTA7dDx0aGlzLmNvbHVtbnM7dCsrKXtjb25zdCBuPXRoaXMuZ2V0Q29sdW1uKHQpO24ubGVuZ3RoJiZ4ZShuLHttaW46ZSxtYXg6cixvdXRwdXQ6bn0pLG8uc2V0Q29sdW1uKHQsbil9cmV0dXJuIG99ZmxpcFJvd3MoKXtjb25zdCB0PU1hdGguY2VpbCh0aGlzLmNvbHVtbnMvMik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dDtyKyspe2xldCB0PXRoaXMuZ2V0KGUsciksbz10aGlzLmdldChlLHRoaXMuY29sdW1ucy0xLXIpO3RoaXMuc2V0KGUscixvKSx0aGlzLnNldChlLHRoaXMuY29sdW1ucy0xLXIsdCl9cmV0dXJuIHRoaXN9ZmxpcENvbHVtbnMoKXtjb25zdCB0PU1hdGguY2VpbCh0aGlzLnJvd3MvMik7Zm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKWZvcihsZXQgcj0wO3I8dDtyKyspe2xldCB0PXRoaXMuZ2V0KHIsZSksbz10aGlzLmdldCh0aGlzLnJvd3MtMS1yLGUpO3RoaXMuc2V0KHIsZSxvKSx0aGlzLnNldCh0aGlzLnJvd3MtMS1yLGUsdCl9cmV0dXJuIHRoaXN9a3JvbmVja2VyUHJvZHVjdCh0KXt0PXFlLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMucm93cyxyPXRoaXMuY29sdW1ucyxvPXQucm93cyxuPXQuY29sdW1ucyxzPW5ldyBxZShlKm8scipuKTtmb3IobGV0IGk9MDtpPGU7aSsrKWZvcihsZXQgZT0wO2U8cjtlKyspZm9yKGxldCByPTA7cjxvO3IrKylmb3IobGV0IHU9MDt1PG47dSsrKXMuc2V0KG8qaStyLG4qZSt1LHRoaXMuZ2V0KGksZSkqdC5nZXQocix1KSk7cmV0dXJuIHN9a3JvbmVja2VyU3VtKHQpe2lmKHQ9cWUuY2hlY2tNYXRyaXgodCksIXRoaXMuaXNTcXVhcmUoKXx8IXQuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIktyb25lY2tlciBTdW0gbmVlZHMgdHdvIFNxdWFyZSBNYXRyaWNlcyIpO2xldCBlPXRoaXMucm93cyxyPXQucm93cyxvPXRoaXMua3JvbmVja2VyUHJvZHVjdChxZS5leWUocixyKSksbj1xZS5leWUoZSxlKS5rcm9uZWNrZXJQcm9kdWN0KHQpO3JldHVybiBvLmFkZChuKX10cmFuc3Bvc2UoKXtsZXQgdD1uZXcgcWUodGhpcy5jb2x1bW5zLHRoaXMucm93cyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnNldChyLGUsdGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9c29ydFJvd3ModD1QZSl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXRoaXMuc2V0Um93KGUsdGhpcy5nZXRSb3coZSkuc29ydCh0KSk7cmV0dXJuIHRoaXN9c29ydENvbHVtbnModD1QZSl7Zm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0Q29sdW1uKGUsdGhpcy5nZXRDb2x1bW4oZSkuc29ydCh0KSk7cmV0dXJuIHRoaXN9c3ViTWF0cml4KHQsZSxyLG8pe09lKHRoaXMsdCxlLHIsbyk7bGV0IG49bmV3IHFlKGUtdCsxLG8tcisxKTtmb3IobGV0IHM9dDtzPD1lO3MrKylmb3IobGV0IGU9cjtlPD1vO2UrKyluLnNldChzLXQsZS1yLHRoaXMuZ2V0KHMsZSkpO3JldHVybiBufXN1Yk1hdHJpeFJvdyh0LGUscil7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dGhpcy5jb2x1bW5zLTEpLGU+cnx8ZTwwfHxlPj10aGlzLmNvbHVtbnN8fHI8MHx8cj49dGhpcy5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJBcmd1bWVudCBvdXQgb2YgcmFuZ2UiKTtsZXQgbz1uZXcgcWUodC5sZW5ndGgsci1lKzEpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWZvcihsZXQgcz1lO3M8PXI7cysrKXtpZih0W25dPDB8fHRbbl0+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUm93IGluZGV4IG91dCBvZiByYW5nZTogJHt0W25dfWApO28uc2V0KG4scy1lLHRoaXMuZ2V0KHRbbl0scykpfXJldHVybiBvfXN1Yk1hdHJpeENvbHVtbih0LGUscil7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dGhpcy5yb3dzLTEpLGU+cnx8ZTwwfHxlPj10aGlzLnJvd3N8fHI8MHx8cj49dGhpcy5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKCJBcmd1bWVudCBvdXQgb2YgcmFuZ2UiKTtsZXQgbz1uZXcgcWUoci1lKzEsdC5sZW5ndGgpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWZvcihsZXQgcz1lO3M8PXI7cysrKXtpZih0W25dPDB8fHRbbl0+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ29sdW1uIGluZGV4IG91dCBvZiByYW5nZTogJHt0W25dfWApO28uc2V0KHMtZSxuLHRoaXMuZ2V0KHMsdFtuXSkpfXJldHVybiBvfXNldFN1Yk1hdHJpeCh0LGUscil7aWYoKHQ9cWUuY2hlY2tNYXRyaXgodCkpLmlzRW1wdHkoKSlyZXR1cm4gdGhpcztPZSh0aGlzLGUsZSt0LnJvd3MtMSxyLHIrdC5jb2x1bW5zLTEpO2ZvcihsZXQgbz0wO288dC5yb3dzO28rKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdGhpcy5zZXQoZStvLHIrbix0LmdldChvLG4pKTtyZXR1cm4gdGhpc31zZWxlY3Rpb24odCxlKXtsZXQgcj1mdW5jdGlvbih0LGUscil7cmV0dXJue3JvdzprZSh0LGUpLGNvbHVtbjpOZSh0LHIpfX0odGhpcyx0LGUpLG89bmV3IHFlKHQubGVuZ3RoLGUubGVuZ3RoKTtmb3IobGV0IHQ9MDt0PHIucm93Lmxlbmd0aDt0Kyspe2xldCBlPXIucm93W3RdO2ZvcihsZXQgbj0wO248ci5jb2x1bW4ubGVuZ3RoO24rKyl7bGV0IHM9ci5jb2x1bW5bbl07by5zZXQodCxuLHRoaXMuZ2V0KGUscykpfX1yZXR1cm4gb310cmFjZSgpe2xldCB0PU1hdGgubWluKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpLGU9MDtmb3IobGV0IHI9MDtyPHQ7cisrKWUrPXRoaXMuZ2V0KHIscik7cmV0dXJuIGV9Y2xvbmUoKXtsZXQgdD1uZXcgcWUodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnNldChlLHIsdGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9c3VtKHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPUZlKHQucm93cyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbz0wO288dC5jb2x1bW5zOysrbyllW3JdKz10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPUZlKHQuY29sdW1ucyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbz0wO288dC5jb2x1bW5zOysrbyllW29dKz10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtjYXNlIHZvaWQgMDpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9MDtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKWUrPXQuZ2V0KHIsbyk7cmV0dXJuIGV9KHRoaXMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1wcm9kdWN0KHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPUZlKHQucm93cywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7KytvKWVbcl0qPXQuZ2V0KHIsbyk7cmV0dXJuIGV9KHRoaXMpO2Nhc2UiY29sdW1uIjpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9RmUodC5jb2x1bW5zLDEpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtvXSo9dC5nZXQocixvKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTE7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyllKj10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWVhbih0KXtjb25zdCBlPXRoaXMuc3VtKHQpO3N3aXRjaCh0KXtjYXNlInJvdyI6Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWVbdF0vPXRoaXMuY29sdW1ucztyZXR1cm4gZTtjYXNlImNvbHVtbiI6Zm9yKGxldCB0PTA7dDx0aGlzLmNvbHVtbnM7dCsrKWVbdF0vPXRoaXMucm93cztyZXR1cm4gZTtjYXNlIHZvaWQgMDpyZXR1cm4gZS90aGlzLnNpemU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXZhcmlhbmNlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3VuYmlhc2VkOnI9ITAsbWVhbjpvPXRoaXMubWVhbih0KX09ZTtpZigiYm9vbGVhbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInVuYmlhc2VkIG11c3QgYmUgYSBib29sZWFuIik7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighQXJyYXkuaXNBcnJheShvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtZWFuIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2NvbnN0IG89dC5yb3dzLG49dC5jb2x1bW5zLHM9W107Zm9yKGxldCBpPTA7aTxvO2krKyl7bGV0IG89MCx1PTAsYT0wO2ZvcihsZXQgZT0wO2U8bjtlKyspYT10LmdldChpLGUpLXJbaV0sbys9YSx1Kz1hKmE7ZT9zLnB1c2goKHUtbypvL24pLyhuLTEpKTpzLnB1c2goKHUtbypvL24pL24pfXJldHVybiBzfSh0aGlzLHIsbyk7Y2FzZSJjb2x1bW4iOmlmKCFBcnJheS5pc0FycmF5KG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbz10LnJvd3Msbj10LmNvbHVtbnMscz1bXTtmb3IobGV0IGk9MDtpPG47aSsrKXtsZXQgbj0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxvO2UrKylhPXQuZ2V0KGUsaSktcltpXSxuKz1hLHUrPWEqYTtlP3MucHVzaCgodS1uKm4vbykvKG8tMSkpOnMucHVzaCgodS1uKm4vbykvbyl9cmV0dXJuIHN9KHRoaXMscixvKTtjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIG8pdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBvPXQucm93cyxuPXQuY29sdW1ucyxzPW8qbjtsZXQgaT0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxvO2UrKylmb3IobGV0IG89MDtvPG47bysrKWE9dC5nZXQoZSxvKS1yLGkrPWEsdSs9YSphO3JldHVybiBlPyh1LWkqaS9zKS8ocy0xKToodS1pKmkvcykvc30odGhpcyxyLG8pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zdGFuZGFyZERldmlhdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCk7Y29uc3Qgcj10aGlzLnZhcmlhbmNlKHQsZSk7aWYodm9pZCAwPT09dClyZXR1cm4gTWF0aC5zcXJ0KHIpO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXJbdF09TWF0aC5zcXJ0KHJbdF0pO3JldHVybiByfWNlbnRlcih0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtjZW50ZXI6cj10aGlzLm1lYW4odCl9PWU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbyktZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pLWVbb10pfSh0aGlzLHIpLHRoaXM7Y2FzZSB2b2lkIDA6aWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0LnNldChyLG8sdC5nZXQocixvKS1lKX0odGhpcyxyKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zY2FsZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtsZXQgcj1lLnNjYWxlO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKXtsZXQgbz0wO2ZvcihsZXQgZT0wO2U8dC5jb2x1bW5zO2UrKylvKz1NYXRoLnBvdyh0LmdldChyLGUpLDIpLyh0LmNvbHVtbnMtMSk7ZS5wdXNoKE1hdGguc3FydChvKSl9cmV0dXJuIGV9KHRoaXMpO2Vsc2UgaWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbykvZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0LmNvbHVtbnM7cisrKXtsZXQgbz0wO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKylvKz1NYXRoLnBvdyh0LmdldChlLHIpLDIpLyh0LnJvd3MtMSk7ZS5wdXNoKE1hdGguc3FydChvKSl9cmV0dXJuIGV9KHRoaXMpO2Vsc2UgaWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbykvZVtvXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT10LnNpemUtMTtsZXQgcj0wO2ZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKylmb3IobGV0IG49MDtuPHQucm93cztuKyspcis9TWF0aC5wb3codC5nZXQobixvKSwyKS9lO3JldHVybiBNYXRoLnNxcnQocil9KHRoaXMpO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pL2UpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXRvU3RyaW5nKHQpe3JldHVybiBqZSh0aGlzLHQpfX1mdW5jdGlvbiBQZSh0LGUpe3JldHVybiB0LWV9VmUucHJvdG90eXBlLmtsYXNzPSJNYXRyaXgiLCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiYoVmUucHJvdG90eXBlW1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildPWZ1bmN0aW9uKCl7cmV0dXJuIGplKHRoaXMpfSksVmUucmFuZG9tPVZlLnJhbmQsVmUucmFuZG9tSW50PVZlLnJhbmRJbnQsVmUuZGlhZ29uYWw9VmUuZGlhZyxWZS5wcm90b3R5cGUuZGlhZ29uYWw9VmUucHJvdG90eXBlLmRpYWcsVmUuaWRlbnRpdHk9VmUuZXllLFZlLnByb3RvdHlwZS5uZWdhdGU9VmUucHJvdG90eXBlLm5lZyxWZS5wcm90b3R5cGUudGVuc29yUHJvZHVjdD1WZS5wcm90b3R5cGUua3JvbmVja2VyUHJvZHVjdDtjbGFzcyBxZSBleHRlbmRzIFZle2NvbnN0cnVjdG9yKHQsZSl7aWYoc3VwZXIoKSxxZS5pc01hdHJpeCh0KSlyZXR1cm4gdC5jbG9uZSgpO2lmKE51bWJlci5pc0ludGVnZXIodCkmJnQ+PTApe2lmKHRoaXMuZGF0YT1bXSwhKE51bWJlci5pc0ludGVnZXIoZSkmJmU+PTApKXRocm93IG5ldyBUeXBlRXJyb3IoIm5Db2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7Zm9yKGxldCByPTA7cjx0O3IrKyl0aGlzLmRhdGEucHVzaChuZXcgRmxvYXQ2NEFycmF5KGUpKX1lbHNle2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIgb3IgYW4gYXJyYXkiKTt7Y29uc3Qgcj10O2lmKCJudW1iZXIiIT10eXBlb2YoZT0odD1yLmxlbmd0aCk/clswXS5sZW5ndGg6MCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGF0YSBtdXN0IGJlIGEgMkQgYXJyYXkgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudCIpO3RoaXMuZGF0YT1bXTtmb3IobGV0IG89MDtvPHQ7bysrKXtpZihyW29dLmxlbmd0aCE9PWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluY29uc2lzdGVudCBhcnJheSBkaW1lbnNpb25zIik7dGhpcy5kYXRhLnB1c2goRmxvYXQ2NEFycmF5LmZyb20ocltvXSkpfX19dGhpcy5yb3dzPXQsdGhpcy5jb2x1bW5zPWV9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdPXIsdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdfXJlbW92ZVJvdyh0KXtyZXR1cm4gQWUodGhpcyx0KSx0aGlzLmRhdGEuc3BsaWNlKHQsMSksdGhpcy5yb3dzLT0xLHRoaXN9YWRkUm93KHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXQsdD10aGlzLnJvd3MpLEFlKHRoaXMsdCwhMCksZT1GbG9hdDY0QXJyYXkuZnJvbShSZSh0aGlzLGUpKSx0aGlzLmRhdGEuc3BsaWNlKHQsMCxlKSx0aGlzLnJvd3MrPTEsdGhpc31yZW1vdmVDb2x1bW4odCl7Q2UodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspe2NvbnN0IHI9bmV3IEZsb2F0NjRBcnJheSh0aGlzLmNvbHVtbnMtMSk7Zm9yKGxldCBvPTA7bzx0O28rKylyW29dPXRoaXMuZGF0YVtlXVtvXTtmb3IobGV0IG89dCsxO288dGhpcy5jb2x1bW5zO28rKylyW28tMV09dGhpcy5kYXRhW2VdW29dO3RoaXMuZGF0YVtlXT1yfXJldHVybiB0aGlzLmNvbHVtbnMtPTEsdGhpc31hZGRDb2x1bW4odCxlKXt2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5jb2x1bW5zKSxDZSh0aGlzLHQsITApLGU9SWUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspe2NvbnN0IG89bmV3IEZsb2F0NjRBcnJheSh0aGlzLmNvbHVtbnMrMSk7bGV0IG49MDtmb3IoO248dDtuKyspb1tuXT10aGlzLmRhdGFbcl1bbl07Zm9yKG9bbisrXT1lW3JdO248dGhpcy5jb2x1bW5zKzE7bisrKW9bbl09dGhpcy5kYXRhW3JdW24tMV07dGhpcy5kYXRhW3JdPW99cmV0dXJuIHRoaXMuY29sdW1ucys9MSx0aGlzfX0hZnVuY3Rpb24odCxlKXt0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuYWRkUyh0KTp0aGlzLmFkZE0odCl9LHQucHJvdG90eXBlLmFkZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuYWRkTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuYWRkPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmFkZChyKX0sdC5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnN1YlModCk6dGhpcy5zdWJNKHQpfSx0LnByb3RvdHlwZS5zdWJTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnN1Yk09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnN1Yj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5zdWIocil9LHQucHJvdG90eXBlLnN1YnRyYWN0PXQucHJvdG90eXBlLnN1Yix0LnByb3RvdHlwZS5zdWJ0cmFjdFM9dC5wcm90b3R5cGUuc3ViUyx0LnByb3RvdHlwZS5zdWJ0cmFjdE09dC5wcm90b3R5cGUuc3ViTSx0LnN1YnRyYWN0PXQuc3ViLHQucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5tdWxTKHQpOnRoaXMubXVsTSh0KX0sdC5wcm90b3R5cGUubXVsUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5tdWxNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5tdWw9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubXVsKHIpfSx0LnByb3RvdHlwZS5tdWx0aXBseT10LnByb3RvdHlwZS5tdWwsdC5wcm90b3R5cGUubXVsdGlwbHlTPXQucHJvdG90eXBlLm11bFMsdC5wcm90b3R5cGUubXVsdGlwbHlNPXQucHJvdG90eXBlLm11bE0sdC5tdWx0aXBseT10Lm11bCx0LnByb3RvdHlwZS5kaXY9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuZGl2Uyh0KTp0aGlzLmRpdk0odCl9LHQucHJvdG90eXBlLmRpdlM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZGl2TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuZGl2PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmRpdihyKX0sdC5wcm90b3R5cGUuZGl2aWRlPXQucHJvdG90eXBlLmRpdix0LnByb3RvdHlwZS5kaXZpZGVTPXQucHJvdG90eXBlLmRpdlMsdC5wcm90b3R5cGUuZGl2aWRlTT10LnByb3RvdHlwZS5kaXZNLHQuZGl2aWRlPXQuZGl2LHQucHJvdG90eXBlLm1vZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5tb2RTKHQpOnRoaXMubW9kTSh0KX0sdC5wcm90b3R5cGUubW9kUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJXQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5tb2RNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSV0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5tb2Q9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubW9kKHIpfSx0LnByb3RvdHlwZS5tb2R1bHVzPXQucHJvdG90eXBlLm1vZCx0LnByb3RvdHlwZS5tb2R1bHVzUz10LnByb3RvdHlwZS5tb2RTLHQucHJvdG90eXBlLm1vZHVsdXNNPXQucHJvdG90eXBlLm1vZE0sdC5tb2R1bHVzPXQubW9kLHQucHJvdG90eXBlLmFuZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5hbmRTKHQpOnRoaXMuYW5kTSh0KX0sdC5wcm90b3R5cGUuYW5kUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hbmRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSZ0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5hbmQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuYW5kKHIpfSx0LnByb3RvdHlwZS5vcj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5vclModCk6dGhpcy5vck0odCl9LHQucHJvdG90eXBlLm9yUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpfHQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5vck09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpfHQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm9yPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm9yKHIpfSx0LnByb3RvdHlwZS54b3I9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMueG9yUyh0KTp0aGlzLnhvck0odCl9LHQucHJvdG90eXBlLnhvclM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKV50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUueG9yTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciledC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQueG9yPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnhvcihyKX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmxlZnRTaGlmdFModCk6dGhpcy5sZWZ0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik8PHQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKTw8dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubGVmdFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmxlZnRTaGlmdChyKX0sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uyh0KTp0aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQocil9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMucmlnaHRTaGlmdFModCk6dGhpcy5yaWdodFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUucmlnaHRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+PnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+Pj50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnJpZ2h0U2hpZnQocil9LHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdD10LnByb3RvdHlwZS5yaWdodFNoaWZ0LHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdFM9dC5wcm90b3R5cGUucmlnaHRTaGlmdFMsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0TT10LnByb3RvdHlwZS5yaWdodFNoaWZ0TSx0Lnplcm9GaWxsUmlnaHRTaGlmdD10LnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUubm90PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsfnRoaXMuZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0Lm5vdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubm90KCl9LHQucHJvdG90eXBlLmFicz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWJzKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hYnM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFicygpfSx0LnByb3RvdHlwZS5hY29zPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hY29zKCl9LHQucHJvdG90eXBlLmFjb3NoPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hY29zaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWNvc2g9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFjb3NoKCl9LHQucHJvdG90eXBlLmFzaW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFzaW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFzaW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFzaW4oKX0sdC5wcm90b3R5cGUuYXNpbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFzaW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXNpbmgoKX0sdC5wcm90b3R5cGUuYXRhbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXRhbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXRhbigpfSx0LnByb3RvdHlwZS5hdGFuaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXRhbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hdGFuaCgpfSx0LnByb3RvdHlwZS5jYnJ0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jYnJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jYnJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jYnJ0KCl9LHQucHJvdG90eXBlLmNlaWw9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNlaWwodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNlaWw9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNlaWwoKX0sdC5wcm90b3R5cGUuY2x6MzI9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNsejMyKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jbHozMj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2x6MzIoKX0sdC5wcm90b3R5cGUuY29zPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNvcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY29zKCl9LHQucHJvdG90eXBlLmNvc2g9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNvc2g9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNvc2goKX0sdC5wcm90b3R5cGUuZXhwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5leHAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmV4cD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZXhwKCl9LHQucHJvdG90eXBlLmV4cG0xPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5leHBtMSh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwbTE9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmV4cG0xKCl9LHQucHJvdG90eXBlLmZsb29yPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mbG9vcih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZmxvb3I9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmZsb29yKCl9LHQucHJvdG90eXBlLmZyb3VuZD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5mcm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmZyb3VuZCgpfSx0LnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2coKX0sdC5wcm90b3R5cGUubG9nMXA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzFwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cxcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMXAoKX0sdC5wcm90b3R5cGUubG9nMTA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzEwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cxMD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMTAoKX0sdC5wcm90b3R5cGUubG9nMj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMigpfSx0LnByb3RvdHlwZS5yb3VuZD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgucm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5yb3VuZCgpfSx0LnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaWduKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaWduPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaWduKCl9LHQucHJvdG90eXBlLnNpbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpbigpfSx0LnByb3RvdHlwZS5zaW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaW5oKCl9LHQucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNxcnQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNxcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNxcnQoKX0sdC5wcm90b3R5cGUudGFuPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRhbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudGFuKCl9LHQucHJvdG90eXBlLnRhbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRhbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRhbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRhbmgoKX0sdC5wcm90b3R5cGUudHJ1bmM9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRydW5jKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50cnVuYz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudHJ1bmMoKX0sdC5wb3c9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkucG93KHIpfSx0LnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMucG93Uyh0KTp0aGlzLnBvd00odCl9LHQucHJvdG90eXBlLnBvd1M9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsTWF0aC5wb3codGhpcy5nZXQoZSxyKSx0KSk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnBvd009ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscixNYXRoLnBvdyh0aGlzLmdldChlLHIpLHQuZ2V0KGUscikpKTtyZXR1cm4gdGhpc319KFZlLHFlKTtjbGFzcyAkZSBleHRlbmRzIFZle2NvbnN0cnVjdG9yKHQsZSxyKXtzdXBlcigpLHRoaXMubWF0cml4PXQsdGhpcy5yb3dzPWUsdGhpcy5jb2x1bW5zPXJ9fWNsYXNzIERlIGV4dGVuZHMgJGV7Y29uc3RydWN0b3IodCl7c3VwZXIodCx0LmNvbHVtbnMsdC5yb3dzKX1zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQoZSx0LHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldChlLHQpfX1jbGFzcyBVZSBleHRlbmRzIFZle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5kYXRhPXQsdGhpcy5yb3dzPXQubGVuZ3RoLHRoaXMuY29sdW1ucz10WzBdLmxlbmd0aH1zZXQodCxlLHIpe3JldHVybiB0aGlzLmRhdGFbdF1bZV09cix0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLmRhdGFbdF1bZV19fWZ1bmN0aW9uIExlKHQsZSl7bGV0IHI9MDtyZXR1cm4gTWF0aC5hYnModCk+TWF0aC5hYnMoZSk/KHI9ZS90LE1hdGguYWJzKHQpKk1hdGguc3FydCgxK3IqcikpOjAhPT1lPyhyPXQvZSxNYXRoLmFicyhlKSpNYXRoLnNxcnQoMStyKnIpKTowfWNsYXNzIEJle2NvbnN0cnVjdG9yKHQsZT17fSl7aWYoKHQ9VWUuY2hlY2tNYXRyaXgodCkpLmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIG5vbi1lbXB0eSIpO2xldCByPXQucm93cyxvPXQuY29sdW1ucztjb25zdHtjb21wdXRlTGVmdFNpbmd1bGFyVmVjdG9yczpuPSEwLGNvbXB1dGVSaWdodFNpbmd1bGFyVmVjdG9yczpzPSEwLGF1dG9UcmFuc3Bvc2U6aT0hMX09ZTtsZXQgdSxhPUJvb2xlYW4obiksaD1Cb29sZWFuKHMpLGw9ITE7aWYocjxvKWlmKGkpe3U9dC50cmFuc3Bvc2UoKSxyPXUucm93cyxvPXUuY29sdW1ucyxsPSEwO2xldCBlPWE7YT1oLGg9ZX1lbHNlIHU9dC5jbG9uZSgpLGNvbnNvbGUud2FybigiQ29tcHV0aW5nIFNWRCBvbiBhIG1hdHJpeCB3aXRoIG1vcmUgY29sdW1ucyB0aGFuIHJvd3MuIENvbnNpZGVyIGVuYWJsaW5nIGF1dG9UcmFuc3Bvc2UiKTtlbHNlIHU9dC5jbG9uZSgpO2xldCBjPU1hdGgubWluKHIsbyksZj1NYXRoLm1pbihyKzEsbyksbT1uZXcgRmxvYXQ2NEFycmF5KGYpLGc9bmV3IHFlKHIsYykscD1uZXcgcWUobyxvKSx3PW5ldyBGbG9hdDY0QXJyYXkobyksZD1uZXcgRmxvYXQ2NEFycmF5KHIpLGI9bmV3IEZsb2F0NjRBcnJheShmKTtmb3IobGV0IHQ9MDt0PGY7dCsrKWJbdF09dDtsZXQgeT1NYXRoLm1pbihyLTEsbyksdj1NYXRoLm1heCgwLE1hdGgubWluKG8tMixyKSksTT1NYXRoLm1heCh5LHYpO2ZvcihsZXQgdD0wO3Q8TTt0Kyspe2lmKHQ8eSl7bVt0XT0wO2ZvcihsZXQgZT10O2U8cjtlKyspbVt0XT1MZShtW3RdLHUuZ2V0KGUsdCkpO2lmKDAhPT1tW3RdKXt1LmdldCh0LHQpPDAmJihtW3RdPS1tW3RdKTtmb3IobGV0IGU9dDtlPHI7ZSsrKXUuc2V0KGUsdCx1LmdldChlLHQpL21bdF0pO3Uuc2V0KHQsdCx1LmdldCh0LHQpKzEpfW1bdF09LW1bdF19Zm9yKGxldCBlPXQrMTtlPG87ZSsrKXtpZih0PHkmJjAhPT1tW3RdKXtsZXQgbz0wO2ZvcihsZXQgbj10O248cjtuKyspbys9dS5nZXQobix0KSp1LmdldChuLGUpO289LW8vdS5nZXQodCx0KTtmb3IobGV0IG49dDtuPHI7bisrKXUuc2V0KG4sZSx1LmdldChuLGUpK28qdS5nZXQobix0KSl9d1tlXT11LmdldCh0LGUpfWlmKGEmJnQ8eSlmb3IobGV0IGU9dDtlPHI7ZSsrKWcuc2V0KGUsdCx1LmdldChlLHQpKTtpZih0PHYpe3dbdF09MDtmb3IobGV0IGU9dCsxO2U8bztlKyspd1t0XT1MZSh3W3RdLHdbZV0pO2lmKDAhPT13W3RdKXt3W3QrMV08MCYmKHdbdF09MC13W3RdKTtmb3IobGV0IGU9dCsxO2U8bztlKyspd1tlXS89d1t0XTt3W3QrMV0rPTF9aWYod1t0XT0td1t0XSx0KzE8ciYmMCE9PXdbdF0pe2ZvcihsZXQgZT10KzE7ZTxyO2UrKylkW2VdPTA7Zm9yKGxldCBlPXQrMTtlPHI7ZSsrKWZvcihsZXQgcj10KzE7cjxvO3IrKylkW2VdKz13W3JdKnUuZ2V0KGUscik7Zm9yKGxldCBlPXQrMTtlPG87ZSsrKXtsZXQgbz0td1tlXS93W3QrMV07Zm9yKGxldCBuPXQrMTtuPHI7bisrKXUuc2V0KG4sZSx1LmdldChuLGUpK28qZFtuXSl9fWlmKGgpZm9yKGxldCBlPXQrMTtlPG87ZSsrKXAuc2V0KGUsdCx3W2VdKX19bGV0IHg9TWF0aC5taW4obyxyKzEpO2lmKHk8byYmKG1beV09dS5nZXQoeSx5KSkscjx4JiYobVt4LTFdPTApLHYrMTx4JiYod1t2XT11LmdldCh2LHgtMSkpLHdbeC0xXT0wLGEpe2ZvcihsZXQgdD15O3Q8Yzt0Kyspe2ZvcihsZXQgZT0wO2U8cjtlKyspZy5zZXQoZSx0LDApO2cuc2V0KHQsdCwxKX1mb3IobGV0IHQ9eS0xO3Q+PTA7dC0tKWlmKDAhPT1tW3RdKXtmb3IobGV0IGU9dCsxO2U8YztlKyspe2xldCBvPTA7Zm9yKGxldCBuPXQ7bjxyO24rKylvKz1nLmdldChuLHQpKmcuZ2V0KG4sZSk7bz0tby9nLmdldCh0LHQpO2ZvcihsZXQgbj10O248cjtuKyspZy5zZXQobixlLGcuZ2V0KG4sZSkrbypnLmdldChuLHQpKX1mb3IobGV0IGU9dDtlPHI7ZSsrKWcuc2V0KGUsdCwtZy5nZXQoZSx0KSk7Zy5zZXQodCx0LDErZy5nZXQodCx0KSk7Zm9yKGxldCBlPTA7ZTx0LTE7ZSsrKWcuc2V0KGUsdCwwKX1lbHNle2ZvcihsZXQgZT0wO2U8cjtlKyspZy5zZXQoZSx0LDApO2cuc2V0KHQsdCwxKX19aWYoaClmb3IobGV0IHQ9by0xO3Q+PTA7dC0tKXtpZih0PHYmJjAhPT13W3RdKWZvcihsZXQgZT10KzE7ZTxvO2UrKyl7bGV0IHI9MDtmb3IobGV0IG49dCsxO248bztuKyspcis9cC5nZXQobix0KSpwLmdldChuLGUpO3I9LXIvcC5nZXQodCsxLHQpO2ZvcihsZXQgbj10KzE7bjxvO24rKylwLnNldChuLGUscC5nZXQobixlKStyKnAuZ2V0KG4sdCkpfWZvcihsZXQgZT0wO2U8bztlKyspcC5zZXQoZSx0LDApO3Auc2V0KHQsdCwxKX1sZXQgRT14LTEsUz1OdW1iZXIuRVBTSUxPTjtmb3IoO3g+MDspe2xldCB0LGU7Zm9yKHQ9eC0yO3Q+PS0xJiYtMSE9PXQ7dC0tKXtjb25zdCBlPU51bWJlci5NSU5fVkFMVUUrUypNYXRoLmFicyhtW3RdK01hdGguYWJzKG1bdCsxXSkpO2lmKE1hdGguYWJzKHdbdF0pPD1lfHxOdW1iZXIuaXNOYU4od1t0XSkpe3dbdF09MDticmVha319aWYodD09PXgtMillPTQ7ZWxzZXtsZXQgcjtmb3Iocj14LTE7cj49dCYmciE9PXQ7ci0tKXtsZXQgZT0ociE9PXg/TWF0aC5hYnMod1tyXSk6MCkrKHIhPT10KzE/TWF0aC5hYnMod1tyLTFdKTowKTtpZihNYXRoLmFicyhtW3JdKTw9UyplKXttW3JdPTA7YnJlYWt9fXI9PT10P2U9MzpyPT09eC0xP2U9MTooZT0yLHQ9cil9c3dpdGNoKHQrKyxlKXtjYXNlIDE6e2xldCBlPXdbeC0yXTt3W3gtMl09MDtmb3IobGV0IHI9eC0yO3I+PXQ7ci0tKXtsZXQgbj1MZShtW3JdLGUpLHM9bVtyXS9uLGk9ZS9uO2lmKG1bcl09bixyIT09dCYmKGU9LWkqd1tyLTFdLHdbci0xXT1zKndbci0xXSksaClmb3IobGV0IHQ9MDt0PG87dCsrKW49cypwLmdldCh0LHIpK2kqcC5nZXQodCx4LTEpLHAuc2V0KHQseC0xLC1pKnAuZ2V0KHQscikrcypwLmdldCh0LHgtMSkpLHAuc2V0KHQscixuKX1icmVha31jYXNlIDI6e2xldCBlPXdbdC0xXTt3W3QtMV09MDtmb3IobGV0IG89dDtvPHg7bysrKXtsZXQgbj1MZShtW29dLGUpLHM9bVtvXS9uLGk9ZS9uO2lmKG1bb109bixlPS1pKndbb10sd1tvXT1zKndbb10sYSlmb3IobGV0IGU9MDtlPHI7ZSsrKW49cypnLmdldChlLG8pK2kqZy5nZXQoZSx0LTEpLGcuc2V0KGUsdC0xLC1pKmcuZ2V0KGUsbykrcypnLmdldChlLHQtMSkpLGcuc2V0KGUsbyxuKX1icmVha31jYXNlIDM6e2NvbnN0IGU9TWF0aC5tYXgoTWF0aC5hYnMobVt4LTFdKSxNYXRoLmFicyhtW3gtMl0pLE1hdGguYWJzKHdbeC0yXSksTWF0aC5hYnMobVt0XSksTWF0aC5hYnMod1t0XSkpLG49bVt4LTFdL2Uscz1tW3gtMl0vZSxpPXdbeC0yXS9lLHU9bVt0XS9lLGw9d1t0XS9lLGM9KChzK24pKihzLW4pK2kqaSkvMixmPW4qaSoobippKTtsZXQgZD0wOzA9PT1jJiYwPT09Znx8KGQ9YzwwPzAtTWF0aC5zcXJ0KGMqYytmKTpNYXRoLnNxcnQoYypjK2YpLGQ9Zi8oYytkKSk7bGV0IGI9KHUrbikqKHUtbikrZCx5PXUqbDtmb3IobGV0IGU9dDtlPHgtMTtlKyspe2xldCBuPUxlKGIseSk7MD09PW4mJihuPU51bWJlci5NSU5fVkFMVUUpO2xldCBzPWIvbixpPXkvbjtpZihlIT09dCYmKHdbZS0xXT1uKSxiPXMqbVtlXStpKndbZV0sd1tlXT1zKndbZV0taSptW2VdLHk9aSptW2UrMV0sbVtlKzFdPXMqbVtlKzFdLGgpZm9yKGxldCB0PTA7dDxvO3QrKyluPXMqcC5nZXQodCxlKStpKnAuZ2V0KHQsZSsxKSxwLnNldCh0LGUrMSwtaSpwLmdldCh0LGUpK3MqcC5nZXQodCxlKzEpKSxwLnNldCh0LGUsbik7aWYobj1MZShiLHkpLDA9PT1uJiYobj1OdW1iZXIuTUlOX1ZBTFVFKSxzPWIvbixpPXkvbixtW2VdPW4sYj1zKndbZV0raSptW2UrMV0sbVtlKzFdPS1pKndbZV0rcyptW2UrMV0seT1pKndbZSsxXSx3W2UrMV09cyp3W2UrMV0sYSYmZTxyLTEpZm9yKGxldCB0PTA7dDxyO3QrKyluPXMqZy5nZXQodCxlKStpKmcuZ2V0KHQsZSsxKSxnLnNldCh0LGUrMSwtaSpnLmdldCh0LGUpK3MqZy5nZXQodCxlKzEpKSxnLnNldCh0LGUsbil9d1t4LTJdPWI7YnJlYWt9Y2FzZSA0OmlmKG1bdF08PTAmJihtW3RdPW1bdF08MD8tbVt0XTowLGgpKWZvcihsZXQgZT0wO2U8PUU7ZSsrKXAuc2V0KGUsdCwtcC5nZXQoZSx0KSk7Zm9yKDt0PEUmJiEobVt0XT49bVt0KzFdKTspe2xldCBlPW1bdF07aWYobVt0XT1tW3QrMV0sbVt0KzFdPWUsaCYmdDxvLTEpZm9yKGxldCByPTA7cjxvO3IrKyllPXAuZ2V0KHIsdCsxKSxwLnNldChyLHQrMSxwLmdldChyLHQpKSxwLnNldChyLHQsZSk7aWYoYSYmdDxyLTEpZm9yKGxldCBvPTA7bzxyO28rKyllPWcuZ2V0KG8sdCsxKSxnLnNldChvLHQrMSxnLmdldChvLHQpKSxnLnNldChvLHQsZSk7dCsrfXgtLX19aWYobCl7bGV0IHQ9cDtwPWcsZz10fXRoaXMubT1yLHRoaXMubj1vLHRoaXMucz1tLHRoaXMuVT1nLHRoaXMuVj1wfXNvbHZlKHQpe2xldCBlPXQscj10aGlzLnRocmVzaG9sZCxvPXRoaXMucy5sZW5ndGgsbj1xZS56ZXJvcyhvLG8pO2ZvcihsZXQgdD0wO3Q8bzt0KyspTWF0aC5hYnModGhpcy5zW3RdKTw9cj9uLnNldCh0LHQsMCk6bi5zZXQodCx0LDEvdGhpcy5zW3RdKTtsZXQgcz10aGlzLlUsaT10aGlzLnJpZ2h0U2luZ3VsYXJWZWN0b3JzLHU9aS5tbXVsKG4pLGE9aS5yb3dzLGg9cy5yb3dzLGw9cWUuemVyb3MoYSxoKTtmb3IobGV0IHQ9MDt0PGE7dCsrKWZvcihsZXQgZT0wO2U8aDtlKyspe2xldCByPTA7Zm9yKGxldCBuPTA7bjxvO24rKylyKz11LmdldCh0LG4pKnMuZ2V0KGUsbik7bC5zZXQodCxlLHIpfXJldHVybiBsLm1tdWwoZSl9c29sdmVGb3JEaWFnb25hbCh0KXtyZXR1cm4gdGhpcy5zb2x2ZShxZS5kaWFnKHQpKX1pbnZlcnNlKCl7bGV0IHQ9dGhpcy5WLGU9dGhpcy50aHJlc2hvbGQscj10LnJvd3Msbz10LmNvbHVtbnMsbj1uZXcgcWUocix0aGlzLnMubGVuZ3RoKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bztyKyspTWF0aC5hYnModGhpcy5zW3JdKT5lJiZuLnNldChzLHIsdC5nZXQocyxyKS90aGlzLnNbcl0pO2xldCBzPXRoaXMuVSxpPXMucm93cyx1PXMuY29sdW1ucyxhPW5ldyBxZShyLGkpO2ZvcihsZXQgdD0wO3Q8cjt0KyspZm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IHI9MDtmb3IobGV0IG89MDtvPHU7bysrKXIrPW4uZ2V0KHQsbykqcy5nZXQoZSxvKTthLnNldCh0LGUscil9cmV0dXJuIGF9Z2V0IGNvbmRpdGlvbigpe3JldHVybiB0aGlzLnNbMF0vdGhpcy5zW01hdGgubWluKHRoaXMubSx0aGlzLm4pLTFdfWdldCBub3JtMigpe3JldHVybiB0aGlzLnNbMF19Z2V0IHJhbmsoKXtsZXQgdD1NYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF0qTnVtYmVyLkVQU0lMT04sZT0wLHI9dGhpcy5zO2ZvcihsZXQgbz0wLG49ci5sZW5ndGg7bzxuO28rKylyW29dPnQmJmUrKztyZXR1cm4gZX1nZXQgZGlhZ29uYWwoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnMpfWdldCB0aHJlc2hvbGQoKXtyZXR1cm4gTnVtYmVyLkVQU0lMT04vMipNYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF19Z2V0IGxlZnRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5VfWdldCByaWdodFNpbmd1bGFyVmVjdG9ycygpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7cmV0dXJuIHFlLmRpYWcodGhpcy5zKX19Y2xhc3MgR2V7Y29uc3RydWN0b3IodCxlPXt9KXtjb25zdHthc3N1bWVTeW1tZXRyaWM6cj0hMX09ZTtpZighKHQ9VWUuY2hlY2tNYXRyaXgodCkpLmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggaXMgbm90IGEgc3F1YXJlIG1hdHJpeCIpO2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IG11c3QgYmUgbm9uLWVtcHR5Iik7bGV0IG8sbixzPXQuY29sdW1ucyxpPW5ldyBxZShzLHMpLHU9bmV3IEZsb2F0NjRBcnJheShzKSxhPW5ldyBGbG9hdDY0QXJyYXkocyksaD10LGw9ITE7aWYobD0hIXJ8fHQuaXNTeW1tZXRyaWMoKSxsKXtmb3Iobz0wO288cztvKyspZm9yKG49MDtuPHM7bisrKWkuc2V0KG8sbixoLmdldChvLG4pKTshZnVuY3Rpb24odCxlLHIsbyl7bGV0IG4scyxpLHUsYSxoLGwsYztmb3IoYT0wO2E8dDthKyspclthXT1vLmdldCh0LTEsYSk7Zm9yKHU9dC0xO3U+MDt1LS0pe2ZvcihjPTAsaT0wLGg9MDtoPHU7aCsrKWMrPU1hdGguYWJzKHJbaF0pO2lmKDA9PT1jKWZvcihlW3VdPXJbdS0xXSxhPTA7YTx1O2ErKylyW2FdPW8uZ2V0KHUtMSxhKSxvLnNldCh1LGEsMCksby5zZXQoYSx1LDApO2Vsc2V7Zm9yKGg9MDtoPHU7aCsrKXJbaF0vPWMsaSs9cltoXSpyW2hdO2ZvcihuPXJbdS0xXSxzPU1hdGguc3FydChpKSxuPjAmJihzPS1zKSxlW3VdPWMqcyxpLT1uKnMsclt1LTFdPW4tcyxhPTA7YTx1O2ErKyllW2FdPTA7Zm9yKGE9MDthPHU7YSsrKXtmb3Iobj1yW2FdLG8uc2V0KGEsdSxuKSxzPWVbYV0rby5nZXQoYSxhKSpuLGg9YSsxO2g8PXUtMTtoKyspcys9by5nZXQoaCxhKSpyW2hdLGVbaF0rPW8uZ2V0KGgsYSkqbjtlW2FdPXN9Zm9yKG49MCxhPTA7YTx1O2ErKyllW2FdLz1pLG4rPWVbYV0qclthXTtmb3IobD1uLyhpK2kpLGE9MDthPHU7YSsrKWVbYV0tPWwqclthXTtmb3IoYT0wO2E8dTthKyspe2ZvcihuPXJbYV0scz1lW2FdLGg9YTtoPD11LTE7aCsrKW8uc2V0KGgsYSxvLmdldChoLGEpLShuKmVbaF0rcypyW2hdKSk7clthXT1vLmdldCh1LTEsYSksby5zZXQodSxhLDApfX1yW3VdPWl9Zm9yKHU9MDt1PHQtMTt1Kyspe2lmKG8uc2V0KHQtMSx1LG8uZ2V0KHUsdSkpLG8uc2V0KHUsdSwxKSxpPXJbdSsxXSwwIT09aSl7Zm9yKGg9MDtoPD11O2grKylyW2hdPW8uZ2V0KGgsdSsxKS9pO2ZvcihhPTA7YTw9dTthKyspe2ZvcihzPTAsaD0wO2g8PXU7aCsrKXMrPW8uZ2V0KGgsdSsxKSpvLmdldChoLGEpO2ZvcihoPTA7aDw9dTtoKyspby5zZXQoaCxhLG8uZ2V0KGgsYSktcypyW2hdKX19Zm9yKGg9MDtoPD11O2grKylvLnNldChoLHUrMSwwKX1mb3IoYT0wO2E8dDthKyspclthXT1vLmdldCh0LTEsYSksby5zZXQodC0xLGEsMCk7by5zZXQodC0xLHQtMSwxKSxlWzBdPTB9KHMsYSx1LGkpLGZ1bmN0aW9uKHQsZSxyLG8pe2xldCBuLHMsaSx1LGEsaCxsLGMsZixtLGcscCx3LGQsYix5O2ZvcihpPTE7aTx0O2krKyllW2ktMV09ZVtpXTtlW3QtMV09MDtsZXQgdj0wLE09MCx4PU51bWJlci5FUFNJTE9OO2ZvcihoPTA7aDx0O2grKyl7Zm9yKE09TWF0aC5tYXgoTSxNYXRoLmFicyhyW2hdKStNYXRoLmFicyhlW2hdKSksbD1oO2w8dCYmIShNYXRoLmFicyhlW2xdKTw9eCpNKTspbCsrO2lmKGw+aClkb3tmb3Iobj1yW2hdLGM9KHJbaCsxXS1uKS8oMiplW2hdKSxmPUxlKGMsMSksYzwwJiYoZj0tZikscltoXT1lW2hdLyhjK2YpLHJbaCsxXT1lW2hdKihjK2YpLG09cltoKzFdLHM9bi1yW2hdLGk9aCsyO2k8dDtpKyspcltpXS09cztmb3Iodis9cyxjPXJbbF0sZz0xLHA9Zyx3PWcsZD1lW2grMV0sYj0wLHk9MCxpPWwtMTtpPj1oO2ktLSlmb3Iodz1wLHA9Zyx5PWIsbj1nKmVbaV0scz1nKmMsZj1MZShjLGVbaV0pLGVbaSsxXT1iKmYsYj1lW2ldL2YsZz1jL2YsYz1nKnJbaV0tYipuLHJbaSsxXT1zK2IqKGcqbitiKnJbaV0pLGE9MDthPHQ7YSsrKXM9by5nZXQoYSxpKzEpLG8uc2V0KGEsaSsxLGIqby5nZXQoYSxpKStnKnMpLG8uc2V0KGEsaSxnKm8uZ2V0KGEsaSktYipzKTtjPS1iKnkqdypkKmVbaF0vbSxlW2hdPWIqYyxyW2hdPWcqY313aGlsZShNYXRoLmFicyhlW2hdKT54Kk0pO3JbaF09cltoXSt2LGVbaF09MH1mb3IoaT0wO2k8dC0xO2krKyl7Zm9yKGE9aSxjPXJbaV0sdT1pKzE7dTx0O3UrKylyW3VdPGMmJihhPXUsYz1yW3VdKTtpZihhIT09aSlmb3IoclthXT1yW2ldLHJbaV09Yyx1PTA7dTx0O3UrKyljPW8uZ2V0KHUsaSksby5zZXQodSxpLG8uZ2V0KHUsYSkpLG8uc2V0KHUsYSxjKX19KHMsYSx1LGkpfWVsc2V7bGV0IHQ9bmV3IHFlKHMscyksZT1uZXcgRmxvYXQ2NEFycmF5KHMpO2ZvcihuPTA7bjxzO24rKylmb3Iobz0wO288cztvKyspdC5zZXQobyxuLGguZ2V0KG8sbikpOyFmdW5jdGlvbih0LGUscixvKXtsZXQgbixzLGksdSxhLGgsbCxjPTAsZj10LTE7Zm9yKGg9YysxO2g8PWYtMTtoKyspe2ZvcihsPTAsdT1oO3U8PWY7dSsrKWwrPU1hdGguYWJzKGUuZ2V0KHUsaC0xKSk7aWYoMCE9PWwpe2ZvcihpPTAsdT1mO3U+PWg7dS0tKXJbdV09ZS5nZXQodSxoLTEpL2wsaSs9clt1XSpyW3VdO2ZvcihzPU1hdGguc3FydChpKSxyW2hdPjAmJihzPS1zKSxpLT1yW2hdKnMscltoXT1yW2hdLXMsYT1oO2E8dDthKyspe2ZvcihuPTAsdT1mO3U+PWg7dS0tKW4rPXJbdV0qZS5nZXQodSxhKTtmb3Iobi89aSx1PWg7dTw9Zjt1KyspZS5zZXQodSxhLGUuZ2V0KHUsYSktbipyW3VdKX1mb3IodT0wO3U8PWY7dSsrKXtmb3Iobj0wLGE9ZjthPj1oO2EtLSluKz1yW2FdKmUuZ2V0KHUsYSk7Zm9yKG4vPWksYT1oO2E8PWY7YSsrKWUuc2V0KHUsYSxlLmdldCh1LGEpLW4qclthXSl9cltoXT1sKnJbaF0sZS5zZXQoaCxoLTEsbCpzKX19Zm9yKHU9MDt1PHQ7dSsrKWZvcihhPTA7YTx0O2ErKylvLnNldCh1LGEsdT09PWE/MTowKTtmb3IoaD1mLTE7aD49YysxO2gtLSlpZigwIT09ZS5nZXQoaCxoLTEpKXtmb3IodT1oKzE7dTw9Zjt1Kyspclt1XT1lLmdldCh1LGgtMSk7Zm9yKGE9aDthPD1mO2ErKyl7Zm9yKHM9MCx1PWg7dTw9Zjt1Kyspcys9clt1XSpvLmdldCh1LGEpO2ZvcihzPXMvcltoXS9lLmdldChoLGgtMSksdT1oO3U8PWY7dSsrKW8uc2V0KHUsYSxvLmdldCh1LGEpK3Mqclt1XSl9fX0ocyx0LGUsaSksZnVuY3Rpb24odCxlLHIsbyxuKXtsZXQgcyxpLHUsYSxoLGwsYyxmLG0sZyxwLHcsZCxiLHksdj10LTEsTT0wLHg9dC0xLEU9TnVtYmVyLkVQU0lMT04sUz0wLGo9MCxfPTAsQT0wLEM9MCxSPTAsST0wLGs9MDtmb3Iocz0wO3M8dDtzKyspZm9yKChzPE18fHM+eCkmJihyW3NdPW4uZ2V0KHMscyksZVtzXT0wKSxpPU1hdGgubWF4KHMtMSwwKTtpPHQ7aSsrKWorPU1hdGguYWJzKG4uZ2V0KHMsaSkpO2Zvcig7dj49TTspe2ZvcihhPXY7YT5NJiYoUj1NYXRoLmFicyhuLmdldChhLTEsYS0xKSkrTWF0aC5hYnMobi5nZXQoYSxhKSksMD09PVImJihSPWopLCEoTWF0aC5hYnMobi5nZXQoYSxhLTEpKTxFKlIpKTspYS0tO2lmKGE9PT12KW4uc2V0KHYsdixuLmdldCh2LHYpK1MpLHJbdl09bi5nZXQodix2KSxlW3ZdPTAsdi0tLGs9MDtlbHNlIGlmKGE9PT12LTEpe2lmKGM9bi5nZXQodix2LTEpKm4uZ2V0KHYtMSx2KSxfPShuLmdldCh2LTEsdi0xKS1uLmdldCh2LHYpKS8yLEE9XypfK2MsST1NYXRoLnNxcnQoTWF0aC5hYnMoQSkpLG4uc2V0KHYsdixuLmdldCh2LHYpK1MpLG4uc2V0KHYtMSx2LTEsbi5nZXQodi0xLHYtMSkrUyksZj1uLmdldCh2LHYpLEE+PTApe2ZvcihJPV8+PTA/XytJOl8tSSxyW3YtMV09ZitJLHJbdl09clt2LTFdLDAhPT1JJiYoclt2XT1mLWMvSSksZVt2LTFdPTAsZVt2XT0wLGY9bi5nZXQodix2LTEpLFI9TWF0aC5hYnMoZikrTWF0aC5hYnMoSSksXz1mL1IsQT1JL1IsQz1NYXRoLnNxcnQoXypfK0EqQSksXy89QyxBLz1DLGk9di0xO2k8dDtpKyspST1uLmdldCh2LTEsaSksbi5zZXQodi0xLGksQSpJK18qbi5nZXQodixpKSksbi5zZXQodixpLEEqbi5nZXQodixpKS1fKkkpO2ZvcihzPTA7czw9djtzKyspST1uLmdldChzLHYtMSksbi5zZXQocyx2LTEsQSpJK18qbi5nZXQocyx2KSksbi5zZXQocyx2LEEqbi5nZXQocyx2KS1fKkkpO2ZvcihzPU07czw9eDtzKyspST1vLmdldChzLHYtMSksby5zZXQocyx2LTEsQSpJK18qby5nZXQocyx2KSksby5zZXQocyx2LEEqby5nZXQocyx2KS1fKkkpfWVsc2Ugclt2LTFdPWYrXyxyW3ZdPWYrXyxlW3YtMV09SSxlW3ZdPS1JO3YtPTIsaz0wfWVsc2V7aWYoZj1uLmdldCh2LHYpLG09MCxjPTAsYTx2JiYobT1uLmdldCh2LTEsdi0xKSxjPW4uZ2V0KHYsdi0xKSpuLmdldCh2LTEsdikpLDEwPT09ayl7Zm9yKFMrPWYscz1NO3M8PXY7cysrKW4uc2V0KHMscyxuLmdldChzLHMpLWYpO1I9TWF0aC5hYnMobi5nZXQodix2LTEpKStNYXRoLmFicyhuLmdldCh2LTEsdi0yKSksZj1tPS43NSpSLGM9LS40Mzc1KlIqUn1pZigzMD09PWsmJihSPShtLWYpLzIsUj1SKlIrYyxSPjApKXtmb3IoUj1NYXRoLnNxcnQoUiksbTxmJiYoUj0tUiksUj1mLWMvKChtLWYpLzIrUikscz1NO3M8PXY7cysrKW4uc2V0KHMscyxuLmdldChzLHMpLVIpO1MrPVIsZj1tPWM9Ljk2NH1mb3Ioays9MSxoPXYtMjtoPj1hJiYoST1uLmdldChoLGgpLEM9Zi1JLFI9bS1JLF89KEMqUi1jKS9uLmdldChoKzEsaCkrbi5nZXQoaCxoKzEpLEE9bi5nZXQoaCsxLGgrMSktSS1DLVIsQz1uLmdldChoKzIsaCsxKSxSPU1hdGguYWJzKF8pK01hdGguYWJzKEEpK01hdGguYWJzKEMpLF8vPVIsQS89UixDLz1SLGghPT1hKSYmIShNYXRoLmFicyhuLmdldChoLGgtMSkpKihNYXRoLmFicyhBKStNYXRoLmFicyhDKSk8RSooTWF0aC5hYnMoXykqKE1hdGguYWJzKG4uZ2V0KGgtMSxoLTEpKStNYXRoLmFicyhJKStNYXRoLmFicyhuLmdldChoKzEsaCsxKSkpKSk7KWgtLTtmb3Iocz1oKzI7czw9djtzKyspbi5zZXQocyxzLTIsMCkscz5oKzImJm4uc2V0KHMscy0zLDApO2Zvcih1PWg7dTw9di0xJiYoYj11IT09di0xLHUhPT1oJiYoXz1uLmdldCh1LHUtMSksQT1uLmdldCh1KzEsdS0xKSxDPWI/bi5nZXQodSsyLHUtMSk6MCxmPU1hdGguYWJzKF8pK01hdGguYWJzKEEpK01hdGguYWJzKEMpLDAhPT1mJiYoXy89ZixBLz1mLEMvPWYpKSwwIT09Zik7dSsrKWlmKFI9TWF0aC5zcXJ0KF8qXytBKkErQypDKSxfPDAmJihSPS1SKSwwIT09Uil7Zm9yKHUhPT1oP24uc2V0KHUsdS0xLC1SKmYpOmEhPT1oJiZuLnNldCh1LHUtMSwtbi5nZXQodSx1LTEpKSxfKz1SLGY9Xy9SLG09QS9SLEk9Qy9SLEEvPV8sQy89XyxpPXU7aTx0O2krKylfPW4uZ2V0KHUsaSkrQSpuLmdldCh1KzEsaSksYiYmKF8rPUMqbi5nZXQodSsyLGkpLG4uc2V0KHUrMixpLG4uZ2V0KHUrMixpKS1fKkkpKSxuLnNldCh1LGksbi5nZXQodSxpKS1fKmYpLG4uc2V0KHUrMSxpLG4uZ2V0KHUrMSxpKS1fKm0pO2ZvcihzPTA7czw9TWF0aC5taW4odix1KzMpO3MrKylfPWYqbi5nZXQocyx1KSttKm4uZ2V0KHMsdSsxKSxiJiYoXys9SSpuLmdldChzLHUrMiksbi5zZXQocyx1KzIsbi5nZXQocyx1KzIpLV8qQykpLG4uc2V0KHMsdSxuLmdldChzLHUpLV8pLG4uc2V0KHMsdSsxLG4uZ2V0KHMsdSsxKS1fKkEpO2ZvcihzPU07czw9eDtzKyspXz1mKm8uZ2V0KHMsdSkrbSpvLmdldChzLHUrMSksYiYmKF8rPUkqby5nZXQocyx1KzIpLG8uc2V0KHMsdSsyLG8uZ2V0KHMsdSsyKS1fKkMpKSxvLnNldChzLHUsby5nZXQocyx1KS1fKSxvLnNldChzLHUrMSxvLmdldChzLHUrMSktXypBKX19fWlmKDA9PT1qKXJldHVybjtmb3Iodj10LTE7dj49MDt2LS0paWYoXz1yW3ZdLEE9ZVt2XSwwPT09QSlmb3IoYT12LG4uc2V0KHYsdiwxKSxzPXYtMTtzPj0wO3MtLSl7Zm9yKGM9bi5nZXQocyxzKS1fLEM9MCxpPWE7aTw9djtpKyspQys9bi5nZXQocyxpKSpuLmdldChpLHYpO2lmKGVbc108MClJPWMsUj1DO2Vsc2UgaWYoYT1zLDA9PT1lW3NdP24uc2V0KHMsdiwwIT09Yz8tQy9jOi1DLyhFKmopKTooZj1uLmdldChzLHMrMSksbT1uLmdldChzKzEscyksQT0ocltzXS1fKSoocltzXS1fKStlW3NdKmVbc10sbD0oZipSLUkqQykvQSxuLnNldChzLHYsbCksbi5zZXQocysxLHYsTWF0aC5hYnMoZik+TWF0aC5hYnMoSSk/KC1DLWMqbCkvZjooLVItbSpsKS9JKSksbD1NYXRoLmFicyhuLmdldChzLHYpKSxFKmwqbD4xKWZvcihpPXM7aTw9djtpKyspbi5zZXQoaSx2LG4uZ2V0KGksdikvbCl9ZWxzZSBpZihBPDApZm9yKGE9di0xLE1hdGguYWJzKG4uZ2V0KHYsdi0xKSk+TWF0aC5hYnMobi5nZXQodi0xLHYpKT8obi5zZXQodi0xLHYtMSxBL24uZ2V0KHYsdi0xKSksbi5zZXQodi0xLHYsLShuLmdldCh2LHYpLV8pL24uZ2V0KHYsdi0xKSkpOih5PUtlKDAsLW4uZ2V0KHYtMSx2KSxuLmdldCh2LTEsdi0xKS1fLEEpLG4uc2V0KHYtMSx2LTEseVswXSksbi5zZXQodi0xLHYseVsxXSkpLG4uc2V0KHYsdi0xLDApLG4uc2V0KHYsdiwxKSxzPXYtMjtzPj0wO3MtLSl7Zm9yKGc9MCxwPTAsaT1hO2k8PXY7aSsrKWcrPW4uZ2V0KHMsaSkqbi5nZXQoaSx2LTEpLHArPW4uZ2V0KHMsaSkqbi5nZXQoaSx2KTtpZihjPW4uZ2V0KHMscyktXyxlW3NdPDApST1jLEM9ZyxSPXA7ZWxzZSBpZihhPXMsMD09PWVbc10/KHk9S2UoLWcsLXAsYyxBKSxuLnNldChzLHYtMSx5WzBdKSxuLnNldChzLHYseVsxXSkpOihmPW4uZ2V0KHMscysxKSxtPW4uZ2V0KHMrMSxzKSx3PShyW3NdLV8pKihyW3NdLV8pK2Vbc10qZVtzXS1BKkEsZD0yKihyW3NdLV8pKkEsMD09PXcmJjA9PT1kJiYodz1FKmoqKE1hdGguYWJzKGMpK01hdGguYWJzKEEpK01hdGguYWJzKGYpK01hdGguYWJzKG0pK01hdGguYWJzKEkpKSkseT1LZShmKkMtSSpnK0EqcCxmKlItSSpwLUEqZyx3LGQpLG4uc2V0KHMsdi0xLHlbMF0pLG4uc2V0KHMsdix5WzFdKSxNYXRoLmFicyhmKT5NYXRoLmFicyhJKStNYXRoLmFicyhBKT8obi5zZXQocysxLHYtMSwoLWctYypuLmdldChzLHYtMSkrQSpuLmdldChzLHYpKS9mKSxuLnNldChzKzEsdiwoLXAtYypuLmdldChzLHYpLUEqbi5nZXQocyx2LTEpKS9mKSk6KHk9S2UoLUMtbSpuLmdldChzLHYtMSksLVItbSpuLmdldChzLHYpLEksQSksbi5zZXQocysxLHYtMSx5WzBdKSxuLnNldChzKzEsdix5WzFdKSkpLGw9TWF0aC5tYXgoTWF0aC5hYnMobi5nZXQocyx2LTEpKSxNYXRoLmFicyhuLmdldChzLHYpKSksRSpsKmw+MSlmb3IoaT1zO2k8PXY7aSsrKW4uc2V0KGksdi0xLG4uZ2V0KGksdi0xKS9sKSxuLnNldChpLHYsbi5nZXQoaSx2KS9sKX1mb3Iocz0wO3M8dDtzKyspaWYoczxNfHxzPngpZm9yKGk9cztpPHQ7aSsrKW8uc2V0KHMsaSxuLmdldChzLGkpKTtmb3IoaT10LTE7aT49TTtpLS0pZm9yKHM9TTtzPD14O3MrKyl7Zm9yKEk9MCx1PU07dTw9TWF0aC5taW4oaSx4KTt1KyspSSs9by5nZXQocyx1KSpuLmdldCh1LGkpO28uc2V0KHMsaSxJKX19KHMsYSx1LGksdCl9dGhpcy5uPXMsdGhpcy5lPWEsdGhpcy5kPXUsdGhpcy5WPWl9Z2V0IHJlYWxFaWdlbnZhbHVlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZCl9Z2V0IGltYWdpbmFyeUVpZ2VudmFsdWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5lKX1nZXQgZWlnZW52ZWN0b3JNYXRyaXgoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe2xldCB0LGUscj10aGlzLm4sbz10aGlzLmUsbj10aGlzLmQscz1uZXcgcWUocixyKTtmb3IodD0wO3Q8cjt0Kyspe2ZvcihlPTA7ZTxyO2UrKylzLnNldCh0LGUsMCk7cy5zZXQodCx0LG5bdF0pLG9bdF0+MD9zLnNldCh0LHQrMSxvW3RdKTpvW3RdPDAmJnMuc2V0KHQsdC0xLG9bdF0pfXJldHVybiBzfX1mdW5jdGlvbiBLZSh0LGUscixvKXtsZXQgbixzO3JldHVybiBNYXRoLmFicyhyKT5NYXRoLmFicyhvKT8obj1vL3Iscz1yK24qbyxbKHQrbiplKS9zLChlLW4qdCkvc10pOihuPXIvbyxzPW8rbipyLFsobip0K2UpL3MsKG4qZS10KS9zXSl9Y2xhc3MgV2V7Y29uc3RydWN0b3IodCxlPXt9KXt0PVVlLmNoZWNrTWF0cml4KHQpO2xldHtZOnJ9PWU7Y29uc3R7c2NhbGVTY29yZXM6bz0hMSxtYXhJdGVyYXRpb25zOm49MWUzLHRlcm1pbmF0aW9uQ3JpdGVyaWE6cz0xZS0xMH09ZTtsZXQgaTtpZihyKXtpZihyPUFycmF5LmlzQXJyYXkocikmJiJudW1iZXIiPT10eXBlb2YgclswXT9xZS5jb2x1bW5WZWN0b3Iocik6VWUuY2hlY2tNYXRyaXgociksci5yb3dzIT09dC5yb3dzKXRocm93IG5ldyBFcnJvcigiWSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyBYIik7aT1yLmdldENvbHVtblZlY3RvcigwKX1lbHNlIGk9dC5nZXRDb2x1bW5WZWN0b3IoMCk7bGV0IHUsYSxoLGwsYz0xO2ZvcihsZXQgZT0wO2U8biYmYz5zO2UrKyloPXQudHJhbnNwb3NlKCkubW11bChpKS5kaXYoaS50cmFuc3Bvc2UoKS5tbXVsKGkpLmdldCgwLDApKSxoPWguZGl2KGgubm9ybSgpKSx1PXQubW11bChoKS5kaXYoaC50cmFuc3Bvc2UoKS5tbXVsKGgpLmdldCgwLDApKSxlPjAmJihjPXUuY2xvbmUoKS5zdWIobCkucG93KDIpLnN1bSgpKSxsPXUuY2xvbmUoKSxyPyhhPXIudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxhPWEuZGl2KGEubm9ybSgpKSxpPXIubW11bChhKS5kaXYoYS50cmFuc3Bvc2UoKS5tbXVsKGEpLmdldCgwLDApKSk6aT11O2lmKHIpe2xldCBlPXQudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKTtlPWUuZGl2KGUubm9ybSgpKTtsZXQgbz10LmNsb25lKCkuc3ViKHUuY2xvbmUoKS5tbXVsKGUudHJhbnNwb3NlKCkpKSxuPWkudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxzPXIuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm11bFMobi5nZXQoMCwwKSkubW11bChhLnRyYW5zcG9zZSgpKSk7dGhpcy50PXUsdGhpcy5wPWUudHJhbnNwb3NlKCksdGhpcy53PWgudHJhbnNwb3NlKCksdGhpcy5xPWEsdGhpcy51PWksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KSx0aGlzLnhSZXNpZHVhbD1vLHRoaXMueVJlc2lkdWFsPXMsdGhpcy5iZXRhcz1ufWVsc2UgdGhpcy53PWgudHJhbnNwb3NlKCksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KS5zcXJ0KCksdGhpcy50PW8/dS5jbG9uZSgpLmRpdih0aGlzLnMuZ2V0KDAsMCkpOnUsdGhpcy54UmVzaWR1YWw9dC5zdWIodS5tbXVsKGgudHJhbnNwb3NlKCkpKX19Y2xhc3MgWGV7Y29uc3RydWN0b3IodCxlPXt9KXtpZighMD09PXQpe2NvbnN0IHQ9ZTtyZXR1cm4gdGhpcy5jZW50ZXI9dC5jZW50ZXIsdGhpcy5zY2FsZT10LnNjYWxlLHRoaXMubWVhbnM9dC5tZWFucyx0aGlzLnN0ZGV2cz10LnN0ZGV2cyx0aGlzLlU9cWUuY2hlY2tNYXRyaXgodC5VKSx0aGlzLlM9dC5TLHRoaXMuUj10LlIsdm9pZCh0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9dC5leGNsdWRlZEZlYXR1cmVzfHxbXSl9dD1uZXcgcWUodCk7Y29uc3R7aXNDb3ZhcmlhbmNlTWF0cml4OnI9ITEsbWV0aG9kOm89IlNWRCIsbkNvbXBOSVBBTFM6bj0yLGNlbnRlcjpzPSEwLHNjYWxlOmk9ITEsaWdub3JlWmVyb1ZhcmlhbmNlOnU9ITF9PWU7aWYodGhpcy5jZW50ZXI9cyx0aGlzLnNjYWxlPWksdGhpcy5tZWFucz1udWxsLHRoaXMuc3RkZXZzPW51bGwsdGhpcy5leGNsdWRlZEZlYXR1cmVzPVtdLHIpdGhpcy5fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpO2Vsc2Ugc3dpdGNoKHRoaXMuX2FkanVzdCh0LHUpLG8pe2Nhc2UiY292YXJpYW5jZU1hdHJpeCI6e2NvbnN0IGU9bmV3IERlKHQpLm1tdWwodCkuZGl2KHQucm93cy0xKTt0aGlzLl9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgoZSk7YnJlYWt9Y2FzZSJOSVBBTFMiOnRoaXMuX2NvbXB1dGVXaXRoTklQQUxTKHQsbik7YnJlYWs7Y2FzZSJTVkQiOntjb25zdCBlPW5ldyBCZSh0LHtjb21wdXRlTGVmdFNpbmd1bGFyVmVjdG9yczohMSxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6ITAsYXV0b1RyYW5zcG9zZTohMH0pO3RoaXMuVT1lLnJpZ2h0U2luZ3VsYXJWZWN0b3JzO2NvbnN0IHI9ZS5kaWFnb25hbCxvPVtdO2Zvcihjb25zdCBlIG9mIHIpby5wdXNoKGUqZS8odC5yb3dzLTEpKTt0aGlzLlM9bzticmVha31kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5rbm93biBtZXRob2Q6ICR7b31gKX19c3RhdGljIGxvYWQodCl7aWYoInN0cmluZyIhPXR5cGVvZiB0Lm5hbWUpdGhyb3cgbmV3IFR5cGVFcnJvcigibW9kZWwgbXVzdCBoYXZlIGEgbmFtZSBwcm9wZXJ0eSIpO2lmKCJQQ0EiIT09dC5uYW1lKXRocm93IG5ldyBSYW5nZUVycm9yKGBpbnZhbGlkIG1vZGVsOiAke3QubmFtZX1gKTtyZXR1cm4gbmV3IFhlKCEwLHQpfXByZWRpY3QodCxlPXt9KXtjb25zdHtuQ29tcG9uZW50czpyPXRoaXMuVS5jb2x1bW5zfT1lO2lmKHQ9bmV3IHFlKHQpLHRoaXMuY2VudGVyJiYodC5zdWJSb3dWZWN0b3IodGhpcy5tZWFucyksdGhpcy5zY2FsZSkpe2ZvcihsZXQgZSBvZiB0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMpdC5yZW1vdmVDb2x1bW4oZSk7dC5kaXZSb3dWZWN0b3IodGhpcy5zdGRldnMpfWxldCBvPXQubW11bCh0aGlzLlUpO3JldHVybiBvLnN1Yk1hdHJpeCgwLG8ucm93cy0xLDAsci0xKX1pbnZlcnQodCl7bGV0IGU9KHQ9cWUuY2hlY2tNYXRyaXgodCkpLm1tdWwodGhpcy5VLnRyYW5zcG9zZSgpKTtyZXR1cm4gdGhpcy5jZW50ZXImJih0aGlzLnNjYWxlJiZlLm11bFJvd1ZlY3Rvcih0aGlzLnN0ZGV2cyksZS5hZGRSb3dWZWN0b3IodGhpcy5tZWFucykpLGV9Z2V0RXhwbGFpbmVkVmFyaWFuY2UoKXtsZXQgdD0wO2Zvcihjb25zdCBlIG9mIHRoaXMuUyl0Kz1lO3JldHVybiB0aGlzLlMubWFwKChlPT5lL3QpKX1nZXRDdW11bGF0aXZlVmFyaWFuY2UoKXtsZXQgdD10aGlzLmdldEV4cGxhaW5lZFZhcmlhbmNlKCk7Zm9yKGxldCBlPTE7ZTx0Lmxlbmd0aDtlKyspdFtlXSs9dFtlLTFdO3JldHVybiB0fWdldEVpZ2VudmVjdG9ycygpe3JldHVybiB0aGlzLlV9Z2V0RWlnZW52YWx1ZXMoKXtyZXR1cm4gdGhpcy5TfWdldFN0YW5kYXJkRGV2aWF0aW9ucygpe3JldHVybiB0aGlzLlMubWFwKCh0PT5NYXRoLnNxcnQodCkpKX1nZXRMb2FkaW5ncygpe3JldHVybiB0aGlzLlUudHJhbnNwb3NlKCl9dG9KU09OKCl7cmV0dXJue25hbWU6IlBDQSIsY2VudGVyOnRoaXMuY2VudGVyLHNjYWxlOnRoaXMuc2NhbGUsbWVhbnM6dGhpcy5tZWFucyxzdGRldnM6dGhpcy5zdGRldnMsVTp0aGlzLlUsUzp0aGlzLlMsZXhjbHVkZWRGZWF0dXJlczp0aGlzLmV4Y2x1ZGVkRmVhdHVyZXN9fV9hZGp1c3QodCxlKXtpZih0aGlzLmNlbnRlcil7Y29uc3Qgcj10Lm1lYW4oImNvbHVtbiIpLG89dGhpcy5zY2FsZT90LnN0YW5kYXJkRGV2aWF0aW9uKCJjb2x1bW4iLHttZWFuOnJ9KTpudWxsO2lmKHRoaXMubWVhbnM9cix0LnN1YlJvd1ZlY3RvcihyKSx0aGlzLnNjYWxlKXtmb3IobGV0IHI9MDtyPG8ubGVuZ3RoO3IrKylpZigwPT09b1tyXSl7aWYoIWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENhbm5vdCBzY2FsZSB0aGUgZGF0YXNldCAoc3RhbmRhcmQgZGV2aWF0aW9uIGlzIHplcm8gYXQgaW5kZXggJHtyfWApO3QucmVtb3ZlQ29sdW1uKHIpLG8uc3BsaWNlKHIsMSksdGhpcy5leGNsdWRlZEZlYXR1cmVzLnB1c2gociksci0tfXRoaXMuc3RkZXZzPW8sdC5kaXZSb3dWZWN0b3Iobyl9fX1fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpe2NvbnN0IGU9bmV3IEdlKHQse2Fzc3VtZVN5bW1ldHJpYzohMH0pO3RoaXMuVT1lLmVpZ2VudmVjdG9yTWF0cml4LHRoaXMuVS5mbGlwUm93cygpLHRoaXMuUz1lLnJlYWxFaWdlbnZhbHVlcyx0aGlzLlMucmV2ZXJzZSgpfV9jb21wdXRlV2l0aE5JUEFMUyh0LGUpe3RoaXMuVT1uZXcgcWUoZSx0LmNvbHVtbnMpLHRoaXMuUz1bXTtsZXQgcj10O2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW5ldyBXZShyKTt0aGlzLlUuc2V0Um93KHQsZS53LnRyYW5zcG9zZSgpKSx0aGlzLlMucHVzaChNYXRoLnBvdyhlLnMuZ2V0KDAsMCksMikpLHI9ZS54UmVzaWR1YWx9dGhpcy5VPXRoaXMuVS50cmFuc3Bvc2UoKX19ZnVuY3Rpb24gSmUodCxlPXt9KXtpZighZGUodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9Q3QoZSwic2NhbGUiKTtmZShyKXx8KHI9ITApO2xldCBvPUN0KGUsIm5Db21wTklQQUxTIik7Y2Uobyl8fChvPTIpO2xldCBuPWxlKEN0KHQsMCxbXSkpO2lmKDA9PT1uKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBkaW1lbnNpb24gb2YgZGF0YSIpO2lmKG8+bil0aHJvdyBuZXcgRXJyb3IoIm5Db21wTklQQUxTIGlzIG1vcmUgdGhhbiB0aGUgZGltZW5zaW9uIG9mIGRhdGEiKTtsZXQgcz1uZXcgWGUodCx7bWV0aG9kOiJOSVBBTFMiLHNjYWxlOnIsbkNvbXBOSVBBTFM6b30pLGk9cy5wcmVkaWN0KHQpO3JldHVybiBzLmludmVydChpKS50b0pTT04oKX12YXIgWWU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7KytyPG8mJiExIT09ZSh0W3JdLHIsdCk7KTtyZXR1cm4gdH07dmFyIFplPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbyl7Zm9yKHZhciBuPS0xLHM9T2JqZWN0KGUpLGk9byhlKSx1PWkubGVuZ3RoO3UtLTspe3ZhciBhPWlbdD91Oisrbl07aWYoITE9PT1yKHNbYV0sYSxzKSlicmVha31yZXR1cm4gZX19KCk7dmFyIEhlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG89QXJyYXkodCk7KytyPHQ7KW9bcl09ZShyKTtyZXR1cm4gb307dmFyIFFlPWZ1bmN0aW9uKHQpe3JldHVybiBkKHQpJiYiW29iamVjdCBBcmd1bWVudHNdIj09dyh0KX0sdHI9T2JqZWN0LnByb3RvdHlwZSxlcj10ci5oYXNPd25Qcm9wZXJ0eSxycj10ci5wcm9wZXJ0eUlzRW51bWVyYWJsZSxvcj1RZShmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP1FlOmZ1bmN0aW9uKHQpe3JldHVybiBkKHQpJiZlci5jYWxsKHQsImNhbGxlZSIpJiYhcnIuY2FsbCh0LCJjYWxsZWUiKX07dmFyIG5yPWZ1bmN0aW9uKCl7cmV0dXJuITF9LHNyPW8oKGZ1bmN0aW9uKHQsZSl7dmFyIHI9ZSYmIWUubm9kZVR5cGUmJmUsbz1yJiZ0JiYhdC5ub2RlVHlwZSYmdCxuPW8mJm8uZXhwb3J0cz09PXI/aS5CdWZmZXI6dm9pZCAwLHM9KG4/bi5pc0J1ZmZlcjp2b2lkIDApfHxucjt0LmV4cG9ydHM9c30pKSxpcj0vXig/OjB8WzEtOV1cZCopJC87dmFyIHVyPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lPzkwMDcxOTkyNTQ3NDA5OTE6ZSkmJigibnVtYmVyIj09cnx8InN5bWJvbCIhPXImJmlyLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX0sYXI9e307YXJbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPWFyWyJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXT1hclsiW29iamVjdCBJbnQ4QXJyYXldIl09YXJbIltvYmplY3QgSW50MTZBcnJheV0iXT1hclsiW29iamVjdCBJbnQzMkFycmF5XSJdPWFyWyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09YXJbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09YXJbIltvYmplY3QgVWludDE2QXJyYXldIl09YXJbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsYXJbIltvYmplY3QgQXJndW1lbnRzXSJdPWFyWyJbb2JqZWN0IEFycmF5XSJdPWFyWyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPWFyWyJbb2JqZWN0IEJvb2xlYW5dIl09YXJbIltvYmplY3QgRGF0YVZpZXddIl09YXJbIltvYmplY3QgRGF0ZV0iXT1hclsiW29iamVjdCBFcnJvcl0iXT1hclsiW29iamVjdCBGdW5jdGlvbl0iXT1hclsiW29iamVjdCBNYXBdIl09YXJbIltvYmplY3QgTnVtYmVyXSJdPWFyWyJbb2JqZWN0IE9iamVjdF0iXT1hclsiW29iamVjdCBSZWdFeHBdIl09YXJbIltvYmplY3QgU2V0XSJdPWFyWyJbb2JqZWN0IFN0cmluZ10iXT1hclsiW29iamVjdCBXZWFrTWFwXSJdPSExO3ZhciBocj1mdW5jdGlvbih0KXtyZXR1cm4gZCh0KSYmR3QodC5sZW5ndGgpJiYhIWFyW3codCldfTt2YXIgbHI9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX0sY3I9bygoZnVuY3Rpb24odCxlKXt2YXIgcj1lJiYhZS5ub2RlVHlwZSYmZSxvPXImJnQmJiF0Lm5vZGVUeXBlJiZ0LHM9byYmby5leHBvcnRzPT09ciYmbi5wcm9jZXNzLGk9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9byYmby5yZXF1aXJlJiZvLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8cyYmcy5iaW5kaW5nJiZzLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpO3QuZXhwb3J0cz1pfSkpLGZyPWNyJiZjci5pc1R5cGVkQXJyYXksbXI9ZnI/bHIoZnIpOmhyLGdyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHByPWZ1bmN0aW9uKGUscil7dmFyIG89dChlKSxuPSFvJiZvcihlKSxzPSFvJiYhbiYmc3IoZSksaT0hbyYmIW4mJiFzJiZtcihlKSx1PW98fG58fHN8fGksYT11P0hlKGUubGVuZ3RoLFN0cmluZyk6W10saD1hLmxlbmd0aDtmb3IodmFyIGwgaW4gZSkhciYmIWdyLmNhbGwoZSxsKXx8dSYmKCJsZW5ndGgiPT1sfHxzJiYoIm9mZnNldCI9PWx8fCJwYXJlbnQiPT1sKXx8aSYmKCJidWZmZXIiPT1sfHwiYnl0ZUxlbmd0aCI9PWx8fCJieXRlT2Zmc2V0Ij09bCl8fHVyKGwsaCkpfHxhLnB1c2gobCk7cmV0dXJuIGF9O3ZhciB3cj1mdW5jdGlvbih0KXtyZXR1cm4gS3QodCk/cHIodCk6T3QodCl9O3ZhciBkcj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyLG8pe2lmKG51bGw9PXIpcmV0dXJuIHI7aWYoIUt0KHIpKXJldHVybiB0KHIsbyk7Zm9yKHZhciBuPXIubGVuZ3RoLHM9ZT9uOi0xLGk9T2JqZWN0KHIpOyhlP3MtLTorK3M8bikmJiExIT09byhpW3NdLHMsaSk7KTtyZXR1cm4gcn19KChmdW5jdGlvbih0LGUpe3JldHVybiB0JiZaZSh0LGUsd3IpfSkpO3ZhciBicj1mdW5jdGlvbih0KXtyZXR1cm4gdH07dmFyIHlyPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6YnJ9O3ZhciB2cj1mdW5jdGlvbihlLHIpe3JldHVybih0KGUpP1llOmRyKShlLHlyKHIpKX07dmFyIE1yPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgbnQsdGhpcy5zaXplPTB9O3ZhciB4cj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUscn07dmFyIEVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX07dmFyIFNyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07dmFyIGpyPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihyIGluc3RhbmNlb2YgbnQpe3ZhciBvPXIuX19kYXRhX187aWYoIXN0fHxvLmxlbmd0aDwxOTkpcmV0dXJuIG8ucHVzaChbdCxlXSksdGhpcy5zaXplPSsrci5zaXplLHRoaXM7cj10aGlzLl9fZGF0YV9fPW5ldyBndChvKX1yZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemU9ci5zaXplLHRoaXN9O2Z1bmN0aW9uIF9yKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IG50KHQpO3RoaXMuc2l6ZT1lLnNpemV9X3IucHJvdG90eXBlLmNsZWFyPU1yLF9yLnByb3RvdHlwZS5kZWxldGU9eHIsX3IucHJvdG90eXBlLmdldD1Fcixfci5wcm90b3R5cGUuaGFzPVNyLF9yLnByb3RvdHlwZS5zZXQ9anI7dmFyIEFyPV9yO3ZhciBDcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQodCwiX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIpLHRoaXN9O3ZhciBScj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O2Z1bmN0aW9uIElyKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBndDsrK2U8cjspdGhpcy5hZGQodFtlXSl9SXIucHJvdG90eXBlLmFkZD1Jci5wcm90b3R5cGUucHVzaD1DcixJci5wcm90b3R5cGUuaGFzPVJyO3ZhciBrcj1Jcjt2YXIgTnI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7KytyPG87KWlmKGUodFtyXSxyLHQpKXJldHVybiEwO3JldHVybiExfTt2YXIgT3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5oYXMoZSl9O3ZhciBGcj1mdW5jdGlvbih0LGUscixvLG4scyl7dmFyIGk9MSZyLHU9dC5sZW5ndGgsYT1lLmxlbmd0aDtpZih1IT1hJiYhKGkmJmE+dSkpcmV0dXJuITE7dmFyIGg9cy5nZXQodCksbD1zLmdldChlKTtpZihoJiZsKXJldHVybiBoPT1lJiZsPT10O3ZhciBjPS0xLGY9ITAsbT0yJnI/bmV3IGtyOnZvaWQgMDtmb3Iocy5zZXQodCxlKSxzLnNldChlLHQpOysrYzx1Oyl7dmFyIGc9dFtjXSxwPWVbY107aWYobyl2YXIgdz1pP28ocCxnLGMsZSx0LHMpOm8oZyxwLGMsdCxlLHMpO2lmKHZvaWQgMCE9PXcpe2lmKHcpY29udGludWU7Zj0hMTticmVha31pZihtKXtpZighTnIoZSwoZnVuY3Rpb24odCxlKXtpZighT3IobSxlKSYmKGc9PT10fHxuKGcsdCxyLG8scykpKXJldHVybiBtLnB1c2goZSl9KSkpe2Y9ITE7YnJlYWt9fWVsc2UgaWYoZyE9PXAmJiFuKGcscCxyLG8scykpe2Y9ITE7YnJlYWt9fXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSxmfSx6cj1pLlVpbnQ4QXJyYXk7dmFyIFRyPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLHI9QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LG8pe3JbKytlXT1bbyx0XX0pKSxyfTt2YXIgVnI9ZnVuY3Rpb24odCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3JbKytlXT10fSkpLHJ9LFByPXU/dS5wcm90b3R5cGU6dm9pZCAwLHFyPVByP1ByLnZhbHVlT2Y6dm9pZCAwO3ZhciAkcj1mdW5jdGlvbih0LGUscixvLG4scyxpKXtzd2l0Y2gocil7Y2FzZSJbb2JqZWN0IERhdGFWaWV3XSI6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIltvYmplY3QgQXJyYXlCdWZmZXJdIjpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhcyhuZXcgenIodCksbmV3IHpyKGUpKSk7Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpjYXNlIltvYmplY3QgRGF0ZV0iOmNhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4gWSgrdCwrZSk7Y2FzZSJbb2JqZWN0IEVycm9yXSI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIltvYmplY3QgUmVnRXhwXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiB0PT1lKyIiO2Nhc2UiW29iamVjdCBNYXBdIjp2YXIgdT1UcjtjYXNlIltvYmplY3QgU2V0XSI6dmFyIGE9MSZvO2lmKHV8fCh1PVZyKSx0LnNpemUhPWUuc2l6ZSYmIWEpcmV0dXJuITE7dmFyIGg9aS5nZXQodCk7aWYoaClyZXR1cm4gaD09ZTtvfD0yLGkuc2V0KHQsZSk7dmFyIGw9RnIodSh0KSx1KGUpLG8sbixzLGkpO3JldHVybiBpLmRlbGV0ZSh0KSxsO2Nhc2UiW29iamVjdCBTeW1ib2xdIjppZihxcilyZXR1cm4gcXIuY2FsbCh0KT09cXIuY2FsbChlKX1yZXR1cm4hMX07dmFyIERyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG89ZS5sZW5ndGgsbj10Lmxlbmd0aDsrK3I8bzspdFtuK3JdPWVbcl07cmV0dXJuIHR9O3ZhciBVcj1mdW5jdGlvbihlLHIsbyl7dmFyIG49cihlKTtyZXR1cm4gdChlKT9uOkRyKG4sbyhlKSl9O3ZhciBMcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aCxuPTAscz1bXTsrK3I8bzspe3ZhciBpPXRbcl07ZShpLHIsdCkmJihzW24rK109aSl9cmV0dXJuIHN9O3ZhciBCcj1mdW5jdGlvbigpe3JldHVybltdfSxHcj1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLEtyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsV3I9S3I/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLExyKEtyKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gR3IuY2FsbCh0LGUpfSkpKX06QnI7dmFyIFhyPWZ1bmN0aW9uKHQpe3JldHVybiBVcih0LHdyLFdyKX0sSnI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgWXI9ZnVuY3Rpb24odCxlLHIsbyxuLHMpe3ZhciBpPTEmcix1PVhyKHQpLGE9dS5sZW5ndGg7aWYoYSE9WHIoZSkubGVuZ3RoJiYhaSlyZXR1cm4hMTtmb3IodmFyIGg9YTtoLS07KXt2YXIgbD11W2hdO2lmKCEoaT9sIGluIGU6SnIuY2FsbChlLGwpKSlyZXR1cm4hMX12YXIgYz1zLmdldCh0KSxmPXMuZ2V0KGUpO2lmKGMmJmYpcmV0dXJuIGM9PWUmJmY9PXQ7dmFyIG09ITA7cy5zZXQodCxlKSxzLnNldChlLHQpO2Zvcih2YXIgZz1pOysraDxhOyl7dmFyIHA9dFtsPXVbaF1dLHc9ZVtsXTtpZihvKXZhciBkPWk/byh3LHAsbCxlLHQscyk6byhwLHcsbCx0LGUscyk7aWYoISh2b2lkIDA9PT1kP3A9PT13fHxuKHAsdyxyLG8scyk6ZCkpe209ITE7YnJlYWt9Z3x8KGc9ImNvbnN0cnVjdG9yIj09bCl9aWYobSYmIWcpe3ZhciBiPXQuY29uc3RydWN0b3IseT1lLmNvbnN0cnVjdG9yO2I9PXl8fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBiJiYiZnVuY3Rpb24iPT10eXBlb2YgeSYmeSBpbnN0YW5jZW9mIHl8fChtPSExKX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSksbX0sWnI9IltvYmplY3QgT2JqZWN0XSIsSHI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgUXI9ZnVuY3Rpb24oZSxyLG8sbixzLGkpe3ZhciB1PXQoZSksYT10KHIpLGg9dT8iW29iamVjdCBBcnJheV0iOkJ0KGUpLGw9YT8iW29iamVjdCBBcnJheV0iOkJ0KHIpLGM9KGg9IltvYmplY3QgQXJndW1lbnRzXSI9PWg/WnI6aCk9PVpyLGY9KGw9IltvYmplY3QgQXJndW1lbnRzXSI9PWw/WnI6bCk9PVpyLG09aD09bDtpZihtJiZzcihlKSl7aWYoIXNyKHIpKXJldHVybiExO3U9ITAsYz0hMX1pZihtJiYhYylyZXR1cm4gaXx8KGk9bmV3IEFyKSx1fHxtcihlKT9GcihlLHIsbyxuLHMsaSk6JHIoZSxyLGgsbyxuLHMsaSk7aWYoISgxJm8pKXt2YXIgZz1jJiZIci5jYWxsKGUsIl9fd3JhcHBlZF9fIikscD1mJiZIci5jYWxsKHIsIl9fd3JhcHBlZF9fIik7aWYoZ3x8cCl7dmFyIHc9Zz9lLnZhbHVlKCk6ZSxkPXA/ci52YWx1ZSgpOnI7cmV0dXJuIGl8fChpPW5ldyBBcikscyh3LGQsbyxuLGkpfX1yZXR1cm4hIW0mJihpfHwoaT1uZXcgQXIpLFlyKGUscixvLG4scyxpKSl9O3ZhciB0bz1mdW5jdGlvbiB0KGUscixvLG4scyl7cmV0dXJuIGU9PT1yfHwobnVsbD09ZXx8bnVsbD09cnx8IWQoZSkmJiFkKHIpP2UhPWUmJnIhPXI6UXIoZSxyLG8sbix0LHMpKX07dmFyIGVvPWZ1bmN0aW9uKHQsZSxyLG8pe3ZhciBuPXIubGVuZ3RoLHM9bixpPSFvO2lmKG51bGw9PXQpcmV0dXJuIXM7Zm9yKHQ9T2JqZWN0KHQpO24tLTspe3ZhciB1PXJbbl07aWYoaSYmdVsyXT91WzFdIT09dFt1WzBdXTohKHVbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrbjxzOyl7dmFyIGE9KHU9cltuXSlbMF0saD10W2FdLGw9dVsxXTtpZihpJiZ1WzJdKXtpZih2b2lkIDA9PT1oJiYhKGEgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgYz1uZXcgQXI7aWYobyl2YXIgZj1vKGgsbCxhLHQsZSxjKTtpZighKHZvaWQgMD09PWY/dG8obCxoLDMsbyxjKTpmKSlyZXR1cm4hMX19cmV0dXJuITB9O3ZhciBybz1mdW5jdGlvbih0KXtyZXR1cm4gdD09dCYmIXgodCl9O3ZhciBvbz1mdW5jdGlvbih0KXtmb3IodmFyIGU9d3IodCkscj1lLmxlbmd0aDtyLS07KXt2YXIgbz1lW3JdLG49dFtvXTtlW3JdPVtvLG4scm8obildfXJldHVybiBlfTt2YXIgbm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG51bGwhPXImJihyW3RdPT09ZSYmKHZvaWQgMCE9PWV8fHQgaW4gT2JqZWN0KHIpKSl9fTt2YXIgc289ZnVuY3Rpb24odCl7dmFyIGU9b28odCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP25vKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24ocil7cmV0dXJuIHI9PT10fHxlbyhyLHQsZSl9fTt2YXIgaW89ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9O3ZhciB1bz1mdW5jdGlvbihlLHIsbyl7Zm9yKHZhciBuPS0xLHM9KHI9anQocixlKSkubGVuZ3RoLGk9ITE7KytuPHM7KXt2YXIgdT1fdChyW25dKTtpZighKGk9bnVsbCE9ZSYmbyhlLHUpKSlicmVhaztlPWVbdV19cmV0dXJuIGl8fCsrbiE9cz9pOiEhKHM9bnVsbD09ZT8wOmUubGVuZ3RoKSYmR3QocykmJnVyKHUscykmJih0KGUpfHxvcihlKSl9O3ZhciBhbz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZ1byh0LGUsaW8pfTt2YXIgaG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gTSh0KSYmcm8oZSk/bm8oX3QodCksZSk6ZnVuY3Rpb24ocil7dmFyIG89Q3Qocix0KTtyZXR1cm4gdm9pZCAwPT09byYmbz09PWU/YW8ocix0KTp0byhlLG8sMyl9fTt2YXIgbG89ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBBdChlLHQpfX07dmFyIGNvPWZ1bmN0aW9uKHQpe3JldHVybiBNKHQpP1h0KF90KHQpKTpsbyh0KX07dmFyIGZvPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bnVsbD09ZT9icjoib2JqZWN0Ij09dHlwZW9mIGU/dChlKT9obyhlWzBdLGVbMV0pOnNvKGUpOmNvKGUpfTt2YXIgbW89ZnVuY3Rpb24odCxlKXt2YXIgcj0tMSxvPUt0KHQpP0FycmF5KHQubGVuZ3RoKTpbXTtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxuLHMpe29bKytyXT1lKHQsbixzKX0pKSxvfTt2YXIgZ289ZnVuY3Rpb24oZSxyKXtyZXR1cm4odChlKT92dDptbykoZSxmbyhyKSl9O3ZhciBwbz1mdW5jdGlvbih0LGUpe3JldHVybiB2dChlLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX07dmFyIHdvPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOnBvKHQsd3IodCkpfTtmdW5jdGlvbiBibyh0KXtyZXR1cm4hKCFwZSh0KXx8IiI9PT10KX1mdW5jdGlvbiB5byh0LGUpe2lmKCFnZSh0KSlyZXR1cm57fTtpZighZGUoZSkpcmV0dXJue307bGV0IHI9e307cmV0dXJuIHZyKGUsKGZ1bmN0aW9uKGUpeyhmdW5jdGlvbih0LGUpe3JldHVybiEhZ2UodCkmJiEhYm8oZSkmJmUgaW4gdH0pKHQsZSkmJihyW2VdPUN0KHQsZSkpfSkpLHJ9ZnVuY3Rpb24gdm8odCl7bGV0IGU9ITE7cmV0dXJuIGJvKHQpP2U9IWlzTmFOKE51bWJlcih0KSk6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVtYmVyXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpJiYoZT0hMCksZX12YXIgTW89L1xzLzt2YXIgeG89ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmTW8udGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX0sRW89L15ccysvO3ZhciBTbz1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnNsaWNlKDAseG8odCkrMSkucmVwbGFjZShFbywiIik6dH0sam89L15bLStdMHhbMC05YS1mXSskL2ksX289L14wYlswMV0rJC9pLEFvPS9eMG9bMC03XSskL2ksQ289cGFyc2VJbnQ7dmFyIFJvPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihiKHQpKXJldHVybiBOYU47aWYoeCh0KSl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQudmFsdWVPZj90LnZhbHVlT2YoKTp0O3Q9eChlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9U28odCk7dmFyIHI9X28udGVzdCh0KTtyZXR1cm4gcnx8QW8udGVzdCh0KT9Dbyh0LnNsaWNlKDIpLHI/Mjo4KTpqby50ZXN0KHQpP05hTjordH07dmFyIElvPWZ1bmN0aW9uKHQpe3JldHVybiB0P0luZmluaXR5PT09KHQ9Um8odCkpfHwtSW5maW5pdHk9PT10PzE3OTc2OTMxMzQ4NjIzMTU3ZTI5MioodDwwPy0xOjEpOnQ9PXQ/dDowOjA9PT10P3Q6MH07dmFyIGtvPWZ1bmN0aW9uKHQpe3ZhciBlPUlvKHQpLHI9ZSUxO3JldHVybiBlPT1lP3I/ZS1yOmU6MH0sTm89aS5pc0Zpbml0ZSxPbz1NYXRoLm1pbjt2YXIgRm89ZnVuY3Rpb24odCl7dmFyIGU9TWF0aFt0XTtyZXR1cm4gZnVuY3Rpb24odCxyKXtpZih0PVJvKHQpLChyPW51bGw9PXI/MDpPbyhrbyhyKSwyOTIpKSYmTm8odCkpe3ZhciBvPShTdCh0KSsiZSIpLnNwbGl0KCJlIiksbj1lKG9bMF0rImUiKygrb1sxXStyKSk7cmV0dXJuKygobz0oU3QobikrImUiKS5zcGxpdCgiZSIpKVswXSsiZSIrKCtvWzFdLXIpKX1yZXR1cm4gZSh0KX19KCJyb3VuZCIpO2Z1bmN0aW9uIHpvKHQpe2lmKCF2byh0KSlyZXR1cm4gMDt0PWZ1bmN0aW9uKHQpe3JldHVybiB2byh0KT9Jbyh0KTowfSh0KTtsZXQgZT1Gbyh0KTtyZXR1cm4iMCI9PT1TdHJpbmcoZSk/MDplfXZhciBUbz1BcnJheS5wcm90b3R5cGUuam9pbjt2YXIgVm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD8iIjpUby5jYWxsKHQsZSl9O2NsYXNzIFBve2NvbnN0cnVjdG9yKHQpe3RoaXMuZ2V0Q29zdD0oKT0+dGhpcy5FbGVtZW50cy5tYXAoKHQ9PnQuRGlzdGFuY2VGcm9tTWVkb2lkKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmRCZXN0TWVkb2lkSWR4PXQ9PnRoaXMuRWxlbWVudHMubWFwKChlPT50aGlzLmNhbGNDb3N0Rm9yR2l2ZW5FbGVtZW50QXNNZWRvaWQoZSx0KSkpLnJlZHVjZSgoKHQsZSxyLG8pPT5lLkNvc3RJZk1hZGVNZWRvaWQ8b1t0XS5Db3N0SWZNYWRlTWVkb2lkP3I6dCksMCksdGhpcy5jYWxjQ29zdEZvckdpdmVuRWxlbWVudEFzTWVkb2lkPSh0LGUpPT4oe0Nvc3RJZk1hZGVNZWRvaWQ6bmV3IFBvKHtFbGVtZW50czp0aGlzLkVsZW1lbnRzLm1hcCgocj0+KHtEaXN0YW5jZUZyb21NZWRvaWQ6ZShyLkVsZW1lbnQsdC5FbGVtZW50KSxFbGVtZW50OnIuRWxlbWVudH0pKSksTWVkb2lkOnQuRWxlbWVudH0pLmdldENvc3QoKSxFbGVtZW50OnR9KSx0aGlzLkVsZW1lbnRzPXQuRWxlbWVudHMsdGhpcy5NZWRvaWQ9dC5NZWRvaWR9fXZhciBxbz1Qbywkbz1PYmplY3QuZGVmaW5lUHJvcGVydHkoe0NsdXN0ZXI6cW99LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxEbz1PYmplY3QuZGVmaW5lUHJvcGVydHkoe2Rpc3RhbmNlOih0LGUpPT57aWYodC5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSBpbnB1dHMgbXVzdCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbiIpO2NvbnN0IHI9QXJyYXkuZnJvbSh0LmtleXMoKSkubWFwKChyPT5NYXRoLnBvdyhNYXRoLmFicyh0W3JdLWVbcl0pLDIpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKTtyZXR1cm4gTWF0aC5zcXJ0KHIpfX0sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLFVvPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7a0d0RWxlbWVudEFyckxlbmd0aDoiayBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheSJ9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjbGFzcyBMb3tjb25zdHJ1Y3Rvcih0LGUscil7dGhpcy5FbGVtZW50cz10LHRoaXMuSz1lLHRoaXMuRGlzdGFuY2VGbj1yLHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSExLHRoaXMuaXRlcmF0ZT0oKT0+e3RoaXMuSXRlcmF0aW9uQ291bnQrKyx0aGlzLkNsdXN0ZXJzfHx0aGlzLmFsbG9jYXRlVG9DbHVzdGVyc0Fyb3VuZEN1cnJlbnRNZWRvaWRzKCk7Y29uc3QgdD10aGlzLk1lZG9pZHMsZT10aGlzLkNsdXN0ZXJzLHI9dGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO2xldCBvPXI7Zm9yKGxldCB0PTA7dDx0aGlzLk1lZG9pZHMubGVuZ3RoO3QrKyl7Y29uc3QgZT10PT4wPT09dGhpcy5NZWRvaWRzLmZpbHRlcigoZT0+MD09PXRoaXMuRGlzdGFuY2VGbih0LGUpKSkubGVuZ3RoO2Zvcihjb25zdCByIG9mIHRoaXMuRWxlbWVudHMuZmlsdGVyKGUpKXtjb25zdCBlPXRoaXMuTWVkb2lkcy5zbGljZSgpO2VbdF09cjtjb25zdCBuPW5ldyBMbyh0aGlzLkVsZW1lbnRzLnNsaWNlKCksdGhpcy5LLHRoaXMuRGlzdGFuY2VGbik7bi5NZWRvaWRzPWUsbi5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHM9bi5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO3M8byYmKG89cyx0aGlzLkNsdXN0ZXJzPW4uQ2x1c3RlcnMsdGhpcy5NZWRvaWRzPWUpfX1yZXR1cm4gdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpPHJ8fCh0aGlzLkNsdXN0ZXJzPWUsdGhpcy5NZWRvaWRzPXQsdGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWQ9ITAsITEpfSx0aGlzLmdldENsdXN0ZXJlZERhdGE9KCk9Pih0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZHx8dGhpcy5ydW5Ub0NvbXBsZXRpb24oKSx0aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5FbGVtZW50cy5tYXAoKHQ9PnQuRWxlbWVudCkpKSkpLHRoaXMucnVuVG9Db21wbGV0aW9uPSgpPT57Zm9yKDt0aGlzLml0ZXJhdGUoKTspO30sdGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcz0oKT0+e3RoaXMuQ2x1c3RlcnM9bmV3IEFycmF5LHRoaXMuTWVkb2lkcy5mb3JFYWNoKCh0PT57dGhpcy5DbHVzdGVycy5wdXNoKG5ldyAkby5DbHVzdGVyKHtFbGVtZW50czpbXSxNZWRvaWQ6dH0pKX0pKSx0aGlzLkVsZW1lbnRzLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgcj10aGlzLmZpbmREaXN0YW5jZXModGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuTWVkb2lkKSksdCksbz1yLnJlZHVjZSgoKHQsZSxyLG8pPT5lPG9bdF0/cjp0KSwwKTt0aGlzLkNsdXN0ZXJzW29dLkVsZW1lbnRzLnB1c2goe0Rpc3RhbmNlRnJvbU1lZG9pZDpyW29dLEVsZW1lbnQ6dH0pfSkpfSx0aGlzLmNhbGN1bGF0ZUN1cnJlbnRDb3N0PSgpPT50aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5nZXRDb3N0KCkpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApLHRoaXMuZmluZERpc3RhbmNlcz0odCxlKT0+dC5tYXAoKHQ9PnRoaXMuRGlzdGFuY2VGbih0LGUpKSksdGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcz0oKT0+e2lmKHRoaXMuSz49dGhpcy5FbGVtZW50cy5sZW5ndGgpdGhyb3cgVW8ua0d0RWxlbWVudEFyckxlbmd0aDtjb25zdCB0PVtdLGU9KHQsZSk9Pntmb3IoY29uc3QgciBvZiBlKWlmKDA9PT10aGlzLkRpc3RhbmNlRm4ocix0KSlyZXR1cm4hMTtyZXR1cm4hMH07bGV0IHI9MDtmb3IoO3I8dGhpcy5FbGVtZW50cy5sZW5ndGgmJnQubGVuZ3RoPHRoaXMuSzspZSh0aGlzLkVsZW1lbnRzW3JdLHQpJiZ0LnB1c2godGhpcy5FbGVtZW50c1tyXSkscisrO3JldHVybiB0fSx0aGlzLkRpc3RhbmNlRm49dGhpcy5EaXN0YW5jZUZufHxEby5kaXN0YW5jZSx0aGlzLk1lZG9pZHM9dGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcygpLHRoaXMuSXRlcmF0aW9uQ291bnQ9MH1nZXQgT3B0aW1pc2F0aW9uU3RhcnRlZCgpe3JldHVybiB0aGlzLkl0ZXJhdGlvbkNvdW50PjB9fUxvLmNsdXN0ZXJFbGVtZW50cz0odCxlLHIpPT57TG8uZ2V0SW5zdGFuY2UodCxlLHIpO3JldHVybiBuZXcgQXJyYXl9LExvLmdldEluc3RhbmNlPSh0LGUscik9Pm5ldyBMbyh0LGUscik7dmFyIEJvPUxvLEdvPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7Q2x1c3RlcmVyOkJvfSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksS289cihvKChmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIodCl7Zm9yKHZhciByIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShyKXx8KGVbcl09dFtyXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIoJG8pLHIoR28pfSkpKTtmdW5jdGlvbiBXbyh0LGUpe2xldCByPTA7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspcis9KHRbb10tZVtvXSkqKHRbb10tZVtvXSk7cmV0dXJuIHJ9Y29uc3QgWG89e2Rpc3RhbmNlRnVuY3Rpb246V299O2Z1bmN0aW9uIEpvKHQsZSxyPVhvKXtjb25zdCBvPXIuZGlzdGFuY2VGdW5jdGlvbnx8WG8uZGlzdGFuY2VGdW5jdGlvbixuPXIuc2ltaWxhcml0eUZ1bmN0aW9ufHxYby5zaW1pbGFyaXR5RnVuY3Rpb247bGV0IHM9LTE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pe2xldCByPU51bWJlci5NSU5fVkFMVUU7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGk9bihlLHRbb10pO2k+ciYmKHI9aSxzPW8pfX1lbHNle2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvKXRocm93IG5ldyBFcnJvcigiQSBzaW1pbGFyaXR5IG9yIGRpc3RhbmNlIGZ1bmN0aW9uIGl0J3MgcmVxdWlyZWQiKTt7bGV0IHI9TnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3QgaT1vKGUsdFtuXSk7aTxyJiYocj1pLHM9bil9fX1yZXR1cm4gc31mdW5jdGlvbiBZbyh0LGUscixvKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylyW25dPUpvKGUsdFtuXSx7ZGlzdGFuY2VGdW5jdGlvbjpvfSk7cmV0dXJuIHJ9ZnVuY3Rpb24gWm8odCxlKXtjb25zdCByPTY1NTM1Jih0Pj4+PTApO3JldHVybigodC1yKSooZT4+Pj0wKT4+PjApK3IqZT4+PjB9Y2xhc3MgSG97Y29uc3RydWN0b3IodD1EYXRlLm5vdygpKXt0aGlzLnN0YXRlPW5ldyBVaW50MzJBcnJheSg0KSx0aGlzLmluaXQodCksdGhpcy5yYW5kb209dGhpcy5nZXRGbG9hdC5iaW5kKHRoaXMpfWdldFVpbnQzMigpe3JldHVybiB0aGlzLm5leHRTdGF0ZSgpLHRoaXMuc3RhdGVbM10rdGhpcy5zdGF0ZVsyXT4+PjB9Z2V0RmxvYXQoKXtyZXR1cm4gNS45NjA0NjQ0Nzc1MzkwNjNlLTgqKHRoaXMuZ2V0VWludDMyKCk+Pj44KX1pbml0KHQpe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoInNlZWQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7dGhpcy5zdGF0ZVswXT10LHRoaXMuc3RhdGVbMV09MCx0aGlzLnN0YXRlWzJdPTAsdGhpcy5zdGF0ZVszXT0wO2ZvcihsZXQgdD0xO3Q8ODt0KyspdGhpcy5zdGF0ZVszJnRdXj10K1pvKDE4MTI0MzMyNTMsdGhpcy5zdGF0ZVt0LTEmM11edGhpcy5zdGF0ZVt0LTEmM10+Pj4zMD4+PjApPj4+MDt0aGlzLnBlcmlvZENlcnRpZmljYXRpb24oKTtmb3IobGV0IHQ9MDt0PDg7dCsrKXRoaXMubmV4dFN0YXRlKCl9cGVyaW9kQ2VydGlmaWNhdGlvbigpezA9PT10aGlzLnN0YXRlWzBdJiYwPT09dGhpcy5zdGF0ZVsxXSYmMD09PXRoaXMuc3RhdGVbMl0mJjA9PT10aGlzLnN0YXRlWzNdJiYodGhpcy5zdGF0ZVswXT04OCx0aGlzLnN0YXRlWzFdPTgzLHRoaXMuc3RhdGVbMl09NjUsdGhpcy5zdGF0ZVszXT02OCl9bmV4dFN0YXRlKCl7bGV0IHQ9dGhpcy5zdGF0ZVswXTt0Xj10PDwxNSx0Xj10Pj4+MTgsdF49dGhpcy5zdGF0ZVszXTw8MTEsdGhpcy5zdGF0ZVswXT10aGlzLnN0YXRlWzFdLHRoaXMuc3RhdGVbMV09dGhpcy5zdGF0ZVsyXSx0aGlzLnN0YXRlWzJdPXRoaXMuc3RhdGVbM10sdGhpcy5zdGF0ZVszXT10fX1mdW5jdGlvbiBRbyh0LGU9e30scj1NYXRoLnJhbmRvbSl7Y29uc3R7c2l6ZTpvPTEscmVwbGFjZTpuPSExLHByb2JhYmlsaXRpZXM6c309ZTtsZXQgaSx1O2lmKGk9Im51bWJlciI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2gocik7cmV0dXJuIGV9KHQpOnQuc2xpY2UoKSxzKXtpZighbil0aHJvdyBuZXcgRXJyb3IoImNob2ljZSB3aXRoIHByb2JhYmlsaXRpZXMgYW5kIG5vIHJlcGxhY2VtZW50IGlzIG5vdCBpbXBsZW1lbnRlZCIpO2lmKHMubGVuZ3RoIT09aS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgbGVuZ3RoIG9mIHByb2JhYmlsaXRpZXMgb3B0aW9uIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNob2ljZXMiKTt1PVtzWzBdXTtmb3IobGV0IHQ9MTt0PHMubGVuZ3RoO3QrKyl1W3RdPXVbdC0xXStzW3RdO2lmKE1hdGguYWJzKDEtdVt1Lmxlbmd0aC0xXSk+MWUtOCl0aHJvdyBuZXcgRXJyb3IoYHByb2JhYmlsaXRpZXMgc2hvdWxkIHN1bSB0byAxLCBidXQgaW5zdGVhZCBzdW1zIHRvICR7dVt1Lmxlbmd0aC0xXX1gKX1pZighMT09PW4mJm8+aS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzaXplIG9wdGlvbiBpcyB0b28gbGFyZ2UiKTtjb25zdCBhPVtdO2ZvcihsZXQgdD0wO3Q8bzt0Kyspe2NvbnN0IHQ9dG4oaS5sZW5ndGgscix1KTthLnB1c2goaVt0XSksbnx8aS5zcGxpY2UodCwxKX1yZXR1cm4gYX1mdW5jdGlvbiB0bih0LGUscil7Y29uc3Qgbz1lKCk7aWYocil7bGV0IHQ9MDtmb3IoO28+clt0XTspdCsrO3JldHVybiB0fXJldHVybiBNYXRoLmZsb29yKG8qdCl9Y2xhc3MgZW57Y29uc3RydWN0b3IodD1NYXRoLnJhbmRvbSl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtjb25zdCBlPW5ldyBIbyh0KTt0aGlzLnJhbmRvbUdlbmVyYXRvcj1lLnJhbmRvbX1lbHNlIHRoaXMucmFuZG9tR2VuZXJhdG9yPXR9Y2hvaWNlKHQsZSl7cmV0dXJuIFFvKHQsZSx0aGlzLnJhbmRvbUdlbmVyYXRvcil9cmFuZG9tKCl7cmV0dXJuIHRoaXMucmFuZG9tR2VuZXJhdG9yKCl9cmFuZEludCh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9MCksdCtNYXRoLmZsb29yKHRoaXMucmFuZG9tR2VuZXJhdG9yKCkqKGUtdCkpfXJhbmRvbVNhbXBsZSh0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMucmFuZG9tKCkpO3JldHVybiBlfX1mdW5jdGlvbiBybih0LGUpe2NvbnN0IHI9bmV3IHFlKHQucm93cyxlLnJvd3MpO2ZvcihsZXQgbz0wO288dC5yb3dzO28rKylmb3IobGV0IG49MDtuPGUucm93cztuKyspci5zZXQobyxuLFdvKHQuZ2V0Um93KG8pLGUuZ2V0Um93KG4pKSk7cmV0dXJuIHJ9ZnVuY3Rpb24gb24odCl7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2gocik7cmV0dXJuIGV9ZnVuY3Rpb24gbm4odCl7bGV0IGU9W3RbMF1dO2ZvcihsZXQgcj0xO3I8dC5sZW5ndGg7cisrKWVbcl09ZVtyLTFdK3Rbcl07cmV0dXJuIGV9Y29uc3Qgc249U3ltYm9sKCJkaXN0YW5jZSIpO2NsYXNzIHVue2NvbnN0cnVjdG9yKHQsZSxyLG8sbil7dGhpcy5jbHVzdGVycz10LHRoaXMuY2VudHJvaWRzPWUsdGhpcy5jb252ZXJnZWQ9cix0aGlzLml0ZXJhdGlvbnM9byx0aGlzW3NuXT1ufW5lYXJlc3QodCl7Y29uc3QgZT1uZXcgQXJyYXkodC5sZW5ndGgpO3JldHVybiBZbyh0LHRoaXMuY2VudHJvaWRzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2VudHJvaWR9KSksZSx0aGlzW3NuXSl9Y29tcHV0ZUluZm9ybWF0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmNlbnRyb2lkcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntjZW50cm9pZDp0LGVycm9yOjAsc2l6ZTowfX0pKSxyPTA7cjx0Lmxlbmd0aDtyKyspZVt0aGlzLmNsdXN0ZXJzW3JdXS5lcnJvcis9dGhpc1tzbl0odFtyXSx0aGlzLmNlbnRyb2lkc1t0aGlzLmNsdXN0ZXJzW3JdXSksZVt0aGlzLmNsdXN0ZXJzW3JdXS5zaXplKys7Zm9yKHZhciBvPTA7bzx0aGlzLmNlbnRyb2lkcy5sZW5ndGg7bysrKWVbb10uc2l6ZT9lW29dLmVycm9yLz1lW29dLnNpemU6ZVtvXS5lcnJvcj1udWxsO3JldHVybiBuZXcgdW4odGhpcy5jbHVzdGVycyxlLHRoaXMuY29udmVyZ2VkLHRoaXMuaXRlcmF0aW9ucyx0aGlzW3NuXSl9fWNvbnN0IGFuPXttYXhJdGVyYXRpb25zOjEwMCx0b2xlcmFuY2U6MWUtNix3aXRoSXRlcmF0aW9uczohMSxpbml0aWFsaXphdGlvbjoia21lYW5zKysiLGRpc3RhbmNlRnVuY3Rpb246V299O2Z1bmN0aW9uIGhuKHQsZSxyLG8sbixzKXt2YXIgaT1mdW5jdGlvbih0LGUscixvKXtjb25zdCBuPWVbMF0ubGVuZ3RoO2Zvcih2YXIgcz1uZXcgQXJyYXkobyksaT1uZXcgQXJyYXkobyksdT0wO3U8bzt1Kyspe3NbdV09bmV3IEFycmF5KG4pLGlbdV09MDtmb3IodmFyIGE9MDthPG47YSsrKXNbdV1bYV09MH1mb3IodmFyIGg9MDtoPGUubGVuZ3RoO2grKyl7aVtyW2hdXSsrO2Zvcih2YXIgbD0wO2w8bjtsKyspc1tyW2hdXVtsXSs9ZVtoXVtsXX1mb3IodmFyIGM9MDtjPG87YysrKWZvcih2YXIgZj0wO2Y8bjtmKyspaVtjXT9zW2NdW2ZdLz1pW2NdOnNbY11bZl09dFtjXVtmXTtyZXR1cm4gc30odCxlLHI9WW8oZSx0LHIsbi5kaXN0YW5jZUZ1bmN0aW9uKSxvKSx1PWZ1bmN0aW9uKHQsZSxyLG8pe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWlmKHIodFtuXSxlW25dKT5vKXJldHVybiExO3JldHVybiEwfShpLHQsbi5kaXN0YW5jZUZ1bmN0aW9uLG4udG9sZXJhbmNlKTtyZXR1cm4gbmV3IHVuKHIsaSx1LHMsbi5kaXN0YW5jZUZ1bmN0aW9uKX1mdW5jdGlvbiBsbih0LGUscil7aWYocj1PYmplY3QuYXNzaWduKHt9LGFuLHIpLGU8PTB8fGU+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKGUpKXRocm93IG5ldyBFcnJvcigiSyBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHBvaW50cyIpO3ZhciBvO2lmKEFycmF5LmlzQXJyYXkoci5pbml0aWFsaXphdGlvbikpe2lmKHIuaW5pdGlhbGl6YXRpb24ubGVuZ3RoIT09ZSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBpbml0aWFsIGNlbnRlcnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIEsiKTtvPXIuaW5pdGlhbGl6YXRpb259ZWxzZSBzd2l0Y2goci5pbml0aWFsaXphdGlvbil7Y2FzZSJrbWVhbnMrKyI6bz1mdW5jdGlvbih0LGUscj17fSl7Y29uc3Qgbz0odD1uZXcgcWUodCkpLnJvd3Msbj1uZXcgZW4oci5zZWVkKSxzPVtdLGk9ci5sb2NhbFRyaWFsc3x8MitNYXRoLmZsb29yKE1hdGgubG9nKGUpKSx1PW4ucmFuZEludChvKTtzLnB1c2godC5nZXRSb3codSkpO2xldCBhPW5ldyBxZSgxLHQucm93cyk7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKWEuc2V0KDAsZSxXbyh0LmdldFJvdyhlKSxzWzBdKSk7bGV0IGg9W25uKGEuZ2V0Um93KDApKV07Y29uc3QgbD0xL2hbMF1bby0xXTtsZXQgYz1xZS5tdWwoYSxsKTtmb3IobGV0IHI9MTtyPGU7cisrKXtjb25zdCBlPW4uY2hvaWNlKG8se3JlcGxhY2U6ITAsc2l6ZTppLHByb2JhYmlsaXRpZXM6Y1swXX0pLHU9cm4odC5zZWxlY3Rpb24oZSxvbih0LmNvbHVtbnMpKSx0KTtsZXQgbCxmLG07Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgcj1xZS5taW4oYSxbdS5nZXRSb3codCldKSxvPXIuc3VtKCk7KHZvaWQgMD09PWx8fG88ZikmJihsPWVbdF0sZj1vLG09cil9c1tyXT10LmdldFJvdyhsKSxhPW0saD1bbm4oYS5nZXRSb3coMCkpXSxjPXFlLm11bChhLDEvaFswXVtvLTFdKX1yZXR1cm4gc30odCxlLHIpO2JyZWFrO2Nhc2UicmFuZG9tIjpvPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbmV3IGVuKHIpLmNob2ljZSh0LHtzaXplOmV9KX0odCxlLHIuc2VlZCk7YnJlYWs7Y2FzZSJtb3N0RGlzdGFudCI6bz1mdW5jdGlvbih0LGUscixvKXtjb25zdCBuPW5ldyBlbihvKTt2YXIgcz1uZXcgQXJyYXkoZSk7aWYoc1swXT1NYXRoLmZsb29yKG4ucmFuZG9tKCkqdC5sZW5ndGgpLGU+MSl7Zm9yKHZhciBpPXtkaXN0Oi0xLGluZGV4Oi0xfSx1PTA7dTx0Lmxlbmd0aDsrK3UpcltzWzBdXVt1XT5pLmRpc3QmJihpLmRpc3Q9cltzWzBdXVt1XSxpLmluZGV4PXUpO2lmKHNbMV09aS5pbmRleCxlPjIpZm9yKHZhciBhPTI7YTxlOysrYSl7Zm9yKHZhciBoPXtkaXN0Oi0xLGluZGV4Oi0xfSxsPTA7bDx0Lmxlbmd0aDsrK2wpe2Zvcih2YXIgYz17ZGlzdDpOdW1iZXIuTUFYX1ZBTFVFLGluZGV4Oi0xfSxmPTA7ZjxhOysrZilyW2ZdW2xdPGMuZGlzdCYmLTE9PT1zLmluZGV4T2YobCkmJihjPXtkaXN0OnJbZl1bbF0saW5kZXg6bH0pO2MuZGlzdCE9PU51bWJlci5NQVhfVkFMVUUmJmMuZGlzdD5oLmRpc3QmJihoPU9iamVjdC5hc3NpZ24oe30sYykpfXNbYV09aC5pbmRleH19cmV0dXJuIHMubWFwKChlPT50W2VdKSl9KHQsZSxmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1uZXcgQXJyYXkodC5sZW5ndGgpLG89MDtvPHQubGVuZ3RoOysrbylmb3IodmFyIG49bztuPHQubGVuZ3RoOysrbil7cltvXXx8KHJbb109bmV3IEFycmF5KHQubGVuZ3RoKSkscltuXXx8KHJbbl09bmV3IEFycmF5KHQubGVuZ3RoKSk7Y29uc3Qgcz1lKHRbb10sdFtuXSk7cltvXVtuXT1zLHJbbl1bb109c31yZXR1cm4gcn0odCxyLmRpc3RhbmNlRnVuY3Rpb24pLHIuc2VlZCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gaW5pdGlhbGl6YXRpb24gbWV0aG9kOiAiJHtyLmluaXRpYWxpemF0aW9ufSJgKX0wPT09ci5tYXhJdGVyYXRpb25zJiYoci5tYXhJdGVyYXRpb25zPU51bWJlci5NQVhfVkFMVUUpO3ZhciBuPW5ldyBBcnJheSh0Lmxlbmd0aCk7aWYoci53aXRoSXRlcmF0aW9ucylyZXR1cm4gZnVuY3Rpb24qKHQsZSxyLG8sbil7Zm9yKHZhciBzLGk9ITEsdT0wOyFpJiZ1PG4ubWF4SXRlcmF0aW9uczspcz1obih0LGUscixvLG4sKyt1KSx5aWVsZCBzLmNvbXB1dGVJbmZvcm1hdGlvbihlKSxpPXMuY29udmVyZ2VkLHQ9cy5jZW50cm9pZHN9KG8sdCxuLGUscik7Zm9yKHZhciBzLGk9ITEsdT0wOyFpJiZ1PHIubWF4SXRlcmF0aW9uczspaT0ocz1obihvLHQsbixlLHIsKyt1KSkuY29udmVyZ2VkLG89cy5jZW50cm9pZHM7cmV0dXJuIHMuY29tcHV0ZUluZm9ybWF0aW9uKHQpfWZ1bmN0aW9uIGNuKHQsZT17fSl7bGV0IHI9Q3QoZSwia051bWJlciIpO3I9dm8ocik/em8ocik6MjtsZXQgbyxuPUN0KGUsIm1vZGUiKTtpZigiay1tZWRvaWRzIiE9PW4mJiJrLW1lYW5zIiE9PW4mJihuPSJrLW1lZG9pZHMiKSwiay1tZWRvaWRzIj09PW4pbz1mdW5jdGlvbih0LGUpe2xldCByPXt9O2Z1bmN0aW9uIG8odCl7cmV0dXJuIFZvKHQsIjoiKX12cih0LCgodCxlKT0+e2xldCBuPW8odCk7cltuXT1lfSkpO2xldCBuPUtvLkNsdXN0ZXJlci5nZXRJbnN0YW5jZSh0LGUpLmdldENsdXN0ZXJlZERhdGEoKTtyZXR1cm4gbj1nbyhuLCh0PT5nbyh0LCh0PT57bGV0IGU9byh0KTtyZXR1cm4gcltlXX0pKSkpLG59KHQscik7ZWxzZXtpZigiay1tZWFucyIhPT1uKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBtb2RlIik7bz1mdW5jdGlvbih0LGUpe2xldCByPWxuKHQsZSksbz17fTtyZXR1cm4gdnIoci5jbHVzdGVycywoKHQsZSk9PntvW3RdfHwob1t0XT1bXSksb1t0XS5wdXNoKGUpfSkpLHdvKG8pfSh0LHIpfXJldHVybiBvfWZ1bmN0aW9uIGZuKHQsZT17fSl7aWYoIWRlKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3QgZWZmLiBhcnJheSIpO2xldCByPUN0KGUsImtOdW1iZXIiKTtyPXZvKHIpP3pvKHIpOjI7bGV0IG89Q3QoZSwibkNvbXBOSVBBTFMiKTtvPXZvKG8pP3pvKG8pOjI7bGV0IG49Q3QoZSwibW9kZSIpLHM9IiIsaT1sZSh0KSx1PTAsYT0wO2lmKHZyKHQsKHQ9PnshZnVuY3Rpb24odCl7aWYoZ2UodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiEwO3JldHVybiExfXJldHVybiExfSh0KT9kZSh0KSYmKGErPTEpOnUrPTF9KSksdT09PWkpcz0ib2JqIjtlbHNle2lmKGEhPT1pKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3Qgb2YgdGhlIHNhbWUgdHlwZSIpO3M9Im1hdCJ9bGV0IGgsbD1udWxsOyJvYmoiPT09cz8obD1mdW5jdGlvbih0KXtsZXQgZT17fTt2cih0LCh0PT57dnIodCwoKHQscik9PntlW3JdfHwoZVtyXT0wKSwwPT09ZVtyXSYmdm8odCkmJihlW3JdPTEpLDEhPT1lW3JdfHx2byh0KXx8KGVbcl09LTEpfSkpfSkpO2xldCByPVtdO3JldHVybiB2cihlLCgodCxlKT0+ezE9PT10JiZyLnB1c2goZSl9KSkscn0odCksaD1mdW5jdGlvbih0LGUpe3JldHVybiBnbyh0LCh0PT57bGV0IHI9eW8odCxlKTtyZXR1cm4gd28ocil9KSl9KHQsbCkpOmg9dDtsZXQgYz1KZShoLHtuQ29tcE5JUEFMUzpvfSksZj1jbihjLHtrTnVtYmVyOnIsbW9kZTpufSksbT1nbyhmLCh0PT5nbyh0LCh0PT5jW3RdKSkpKTtyZXR1cm57a2V5czpsLGdpbmRzOmYsZ2x0ZHQ6Z28oZiwoZT0+Z28oZSwoZT0+dFtlXSkpKSksZ21hdDptfX1sZXQgV0NsdXN0ZXI9e1BDQTphc3luYyBmdW5jdGlvbih0LGU9e30pe3JldHVybiBKZSh0LGUpfSxjbHVzdGVyOmFzeW5jIGZ1bmN0aW9uKHQsZT17fSl7dHJ5e3JldHVybiBmbih0LGUpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX19fTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IFdDbHVzdGVyKC4uLmlucHV0KQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFdDbHVzdGVyCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHJlY3ZNZXNzYWdlKGUuZGF0YSkKICAgICAgICB9CiAgICAgICAgCgo=",p.Base64.decode(Z));function G(){var l=d();function Z(d){try{var l=new Blob([d]),c=window.URL||window.webkitURL;return new Worker(c.createObjectURL(l))}catch(d){o(d)}}var X=Z(y);if(!X)return o("invalid worker"),null;function G(){X?(X.terminate(),X=void 0):o("worker has been terminated")}function m(){var d={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};X.postMessage(d)}function K(){var d=c(),Z=b(),y={mode:"call",id:Z,fun:"PCA",input:Array.prototype.slice.call(arguments)};return X.postMessage(y),l.once(Z,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function t(){var d=c(),Z=b(),y={mode:"call",id:Z,fun:"cluster",input:Array.prototype.slice.call(arguments)};return X.postMessage(y),l.once(Z,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function p(d){var c=d,b=c.mode;"emit"!==b&&"return"!==b||("emit"===b&&l.emit(c.evName,c.msg),"return"===b&&l.emit(c.id,c))}function o(d){l.emit("error",d)}return X.onmessage=function(d){p(d.data)},X.onerror=o,m(Array.prototype.slice.call(arguments)),l.PCA=K,l.cluster=t,l.terminate=G,l}var m,h,i={PCA:(h=X(t.mark((function d(){var c,b,Z,X=arguments;return t.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return c=Array.prototype.slice.call(X),b=G(),d.next=4,b.PCA.apply(b,l(c)).finally((function(){b.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return h.apply(this,arguments)}),cluster:(m=X(t.mark((function d(){var c,b,Z,X=arguments;return t.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return c=Array.prototype.slice.call(X),b=G(),d.next=4,b.cluster.apply(b,l(c)).finally((function(){b.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return m.apply(this,arguments)})};for(var I in K=d(),i){var W=i[I];K[I]=W}}(),K}()}));return"undefined"!=typeof window&&void 0!==window.document?G:y}));
|
|
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";function l(d){return d&&"object"==typeof d&&"default"in d?d:{default:d}}var c=l(d);function b(d){return(b="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(d){return typeof d}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":typeof d})(d)}var Z="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function X(d){var l={exports:{}};return d(l,l.exports),l.exports}var y=X((function(d,l){d.exports=function(d){function l(d,l){(null==l||l>d.length)&&(l=d.length);for(var c=0,b=new Array(l);c<l;c++)b[c]=d[c];return b}function c(d){return function(d){if(Array.isArray(d))return l(d)}(d)||function(d){if("undefined"!=typeof Symbol&&null!=d[Symbol.iterator]||null!=d["@@iterator"])return Array.from(d)}(d)||function(d,c){if(d){if("string"==typeof d)return l(d,c);var b=Object.prototype.toString.call(d).slice(8,-1);return"Object"===b&&d.constructor&&(b=d.constructor.name),"Map"===b||"Set"===b?Array.from(d):"Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b)?l(d,c):void 0}}(d)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Z(d,l,c,b,Z,X,y){try{var G=d[X](y),m=G.value}catch(d){return void c(d)}G.done?l(m):Promise.resolve(m).then(b,Z)}function X(d){return function(){var l=this,c=arguments;return new Promise((function(b,X){var y=d.apply(l,c);function G(d){Z(y,b,X,G,m,"next",d)}function m(d){Z(y,b,X,G,m,"throw",d)}G(void 0)}))}}function y(d){return(y="function"==typeof Symbol&&"symbol"==b(Symbol.iterator)?function(d){return b(d)}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":b(d)})(d)}function G(d){var l={exports:{}};return d(l,l.exports),l.exports}var m,K=G((function(d){var l=function(d){var l,c=Object.prototype,b=c.hasOwnProperty,Z="function"==typeof Symbol?Symbol:{},X=Z.iterator||"@@iterator",G=Z.asyncIterator||"@@asyncIterator",m=Z.toStringTag||"@@toStringTag";function K(d,l,c){return Object.defineProperty(d,l,{value:c,enumerable:!0,configurable:!0,writable:!0}),d[l]}try{K({},"")}catch(d){K=function(d,l,c){return d[l]=c}}function t(d,l,c,b){var Z=l&&l.prototype instanceof u?l:u,X=Object.create(Z.prototype),y=new R(b||[]);return X._invoke=function(d,l,c){var b=o;return function(Z,X){if(b===h)throw new Error("Generator is already running");if(b===W){if("throw"===Z)throw X;return T()}for(c.method=Z,c.arg=X;;){var y=c.delegate;if(y){var G=S(y,c);if(G){if(G===i)continue;return G}}if("next"===c.method)c.sent=c._sent=c.arg;else if("throw"===c.method){if(b===o)throw b=W,c.arg;c.dispatchException(c.arg)}else"return"===c.method&&c.abrupt("return",c.arg);b=h;var m=p(d,l,c);if("normal"===m.type){if(b=c.done?W:I,m.arg===i)continue;return{value:m.arg,done:c.done}}"throw"===m.type&&(b=W,c.method="throw",c.arg=m.arg)}}}(d,c,y),X}function p(d,l,c){try{return{type:"normal",arg:d.call(l,c)}}catch(d){return{type:"throw",arg:d}}}d.wrap=t;var o="suspendedStart",I="suspendedYield",h="executing",W="completed",i={};function u(){}function V(){}function s(){}var H={};H[X]=function(){return this};var n=Object.getPrototypeOf,C=n&&n(n(z([])));C&&C!==c&&b.call(C,X)&&(H=C);var L=s.prototype=u.prototype=Object.create(H);function a(d){["next","throw","return"].forEach((function(l){K(d,l,(function(d){return this._invoke(l,d)}))}))}function x(d,l){function c(Z,X,G,m){var K=p(d[Z],d,X);if("throw"!==K.type){var t=K.arg,o=t.value;return o&&"object"===y(o)&&b.call(o,"__await")?l.resolve(o.__await).then((function(d){c("next",d,G,m)}),(function(d){c("throw",d,G,m)})):l.resolve(o).then((function(d){t.value=d,G(t)}),(function(d){return c("throw",d,G,m)}))}m(K.arg)}var Z;this._invoke=function(d,b){function X(){return new l((function(l,Z){c(d,b,l,Z)}))}return Z=Z?Z.then(X,X):X()}}function S(d,c){var b=d.iterator[c.method];if(b===l){if(c.delegate=null,"throw"===c.method){if(d.iterator.return&&(c.method="return",c.arg=l,S(d,c),"throw"===c.method))return i;c.method="throw",c.arg=new TypeError("The iterator does not provide a 'throw' method")}return i}var Z=p(b,d.iterator,c.arg);if("throw"===Z.type)return c.method="throw",c.arg=Z.arg,c.delegate=null,i;var X=Z.arg;return X?X.done?(c[d.resultName]=X.value,c.next=d.nextLoc,"return"!==c.method&&(c.method="next",c.arg=l),c.delegate=null,i):X:(c.method="throw",c.arg=new TypeError("iterator result is not an object"),c.delegate=null,i)}function Y(d){var l={tryLoc:d[0]};1 in d&&(l.catchLoc=d[1]),2 in d&&(l.finallyLoc=d[2],l.afterLoc=d[3]),this.tryEntries.push(l)}function g(d){var l=d.completion||{};l.type="normal",delete l.arg,d.completion=l}function R(d){this.tryEntries=[{tryLoc:"root"}],d.forEach(Y,this),this.reset(!0)}function z(d){if(d){var c=d[X];if(c)return c.call(d);if("function"==typeof d.next)return d;if(!isNaN(d.length)){var Z=-1,y=function c(){for(;++Z<d.length;)if(b.call(d,Z))return c.value=d[Z],c.done=!1,c;return c.value=l,c.done=!0,c};return y.next=y}}return{next:T}}function T(){return{value:l,done:!0}}return V.prototype=L.constructor=s,s.constructor=V,V.displayName=K(s,m,"GeneratorFunction"),d.isGeneratorFunction=function(d){var l="function"==typeof d&&d.constructor;return!!l&&(l===V||"GeneratorFunction"===(l.displayName||l.name))},d.mark=function(d){return Object.setPrototypeOf?Object.setPrototypeOf(d,s):(d.__proto__=s,K(d,m,"GeneratorFunction")),d.prototype=Object.create(L),d},d.awrap=function(d){return{__await:d}},a(x.prototype),x.prototype[G]=function(){return this},d.AsyncIterator=x,d.async=function(l,c,b,Z,X){void 0===X&&(X=Promise);var y=new x(t(l,c,b,Z),X);return d.isGeneratorFunction(c)?y:y.next().then((function(d){return d.done?d.value:y.next()}))},a(L),K(L,m,"Generator"),L[X]=function(){return this},L.toString=function(){return"[object Generator]"},d.keys=function(d){var l=[];for(var c in d)l.push(c);return l.reverse(),function c(){for(;l.length;){var b=l.pop();if(b in d)return c.value=b,c.done=!1,c}return c.done=!0,c}},d.values=z,R.prototype={constructor:R,reset:function(d){if(this.prev=0,this.next=0,this.sent=this._sent=l,this.done=!1,this.delegate=null,this.method="next",this.arg=l,this.tryEntries.forEach(g),!d)for(var c in this)"t"===c.charAt(0)&&b.call(this,c)&&!isNaN(+c.slice(1))&&(this[c]=l)},stop:function(){this.done=!0;var d=this.tryEntries[0].completion;if("throw"===d.type)throw d.arg;return this.rval},dispatchException:function(d){if(this.done)throw d;var c=this;function Z(b,Z){return G.type="throw",G.arg=d,c.next=b,Z&&(c.method="next",c.arg=l),!!Z}for(var X=this.tryEntries.length-1;X>=0;--X){var y=this.tryEntries[X],G=y.completion;if("root"===y.tryLoc)return Z("end");if(y.tryLoc<=this.prev){var m=b.call(y,"catchLoc"),K=b.call(y,"finallyLoc");if(m&&K){if(this.prev<y.catchLoc)return Z(y.catchLoc,!0);if(this.prev<y.finallyLoc)return Z(y.finallyLoc)}else if(m){if(this.prev<y.catchLoc)return Z(y.catchLoc,!0)}else{if(!K)throw new Error("try statement without catch or finally");if(this.prev<y.finallyLoc)return Z(y.finallyLoc)}}}},abrupt:function(d,l){for(var c=this.tryEntries.length-1;c>=0;--c){var Z=this.tryEntries[c];if(Z.tryLoc<=this.prev&&b.call(Z,"finallyLoc")&&this.prev<Z.finallyLoc){var X=Z;break}}X&&("break"===d||"continue"===d)&&X.tryLoc<=l&&l<=X.finallyLoc&&(X=null);var y=X?X.completion:{};return y.type=d,y.arg=l,X?(this.method="next",this.next=X.finallyLoc,i):this.complete(y)},complete:function(d,l){if("throw"===d.type)throw d.arg;return"break"===d.type||"continue"===d.type?this.next=d.arg:"return"===d.type?(this.rval=this.arg=d.arg,this.method="return",this.next="end"):"normal"===d.type&&l&&(this.next=l),i},finish:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var c=this.tryEntries[l];if(c.finallyLoc===d)return this.complete(c.completion,c.afterLoc),g(c),i}},catch:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var c=this.tryEntries[l];if(c.tryLoc===d){var b=c.completion;if("throw"===b.type){var Z=b.arg;g(c)}return Z}}throw new Error("illegal catch attempt")},delegateYield:function(d,c,b){return this.delegate={iterator:z(d),resultName:c,nextLoc:b},"next"===this.method&&(this.arg=l),i}},d}(d.exports);try{regeneratorRuntime=l}catch(d){Function("r","regeneratorRuntime = r")(l)}})),t=G((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,y){if("function"!=typeof b)throw new TypeError("The listener must be a function");var G=new Z(b,X||d,y),m=c?c+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],G]:d._events[m].push(G):(d._events[m]=G,d._eventsCount++),d}function y(d,l){0==--d._eventsCount?d._events=new b:delete d._events[l]}function G(){this._events=new b,this._eventsCount=0}Object.create&&(b.prototype=Object.create(null),(new b).__proto__||(c=!1)),G.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},G.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,y=new Array(X);Z<X;Z++)y[Z]=b[Z].fn;return y},G.prototype.listenerCount=function(d){var l=c?c+d:d,b=this._events[l];return b?b.fn?1:b.length:0},G.prototype.emit=function(d,l,b,Z,X,y){var G=c?c+d:d;if(!this._events[G])return!1;var m,K,t=this._events[G],p=arguments.length;if(t.fn){switch(t.once&&this.removeListener(d,t.fn,void 0,!0),p){case 1:return t.fn.call(t.context),!0;case 2:return t.fn.call(t.context,l),!0;case 3:return t.fn.call(t.context,l,b),!0;case 4:return t.fn.call(t.context,l,b,Z),!0;case 5:return t.fn.call(t.context,l,b,Z,X),!0;case 6:return t.fn.call(t.context,l,b,Z,X,y),!0}for(K=1,m=new Array(p-1);K<p;K++)m[K-1]=arguments[K];t.fn.apply(t.context,m)}else{var o,I=t.length;for(K=0;K<I;K++)switch(t[K].once&&this.removeListener(d,t[K].fn,void 0,!0),p){case 1:t[K].fn.call(t[K].context);break;case 2:t[K].fn.call(t[K].context,l);break;case 3:t[K].fn.call(t[K].context,l,b);break;case 4:t[K].fn.call(t[K].context,l,b,Z);break;default:if(!m)for(o=1,m=new Array(p-1);o<p;o++)m[o-1]=arguments[o];t[K].fn.apply(t[K].context,m)}}return!0},G.prototype.on=function(d,l,c){return X(this,d,l,c,!1)},G.prototype.once=function(d,l,c){return X(this,d,l,c,!0)},G.prototype.removeListener=function(d,l,b,Z){var X=c?c+d:d;if(!this._events[X])return this;if(!l)return y(this,X),this;var G=this._events[X];if(G.fn)G.fn!==l||Z&&!G.once||b&&G.context!==b||y(this,X);else{for(var m=0,K=[],t=G.length;m<t;m++)(G[m].fn!==l||Z&&!G[m].once||b&&G[m].context!==b)&&K.push(G[m]);K.length?this._events[X]=1===K.length?K[0]:K:y(this,X)}return this},G.prototype.removeAllListeners=function(d){var l;return d?(l=c?c+d:d,this._events[l]&&y(this,l)):(this._events=new b,this._eventsCount=0),this},G.prototype.off=G.prototype.removeListener,G.prototype.addListener=G.prototype.on,G.prefixed=c,G.EventEmitter=G,d.exports=G}));return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new t}function b(){var d,l,c=new Promise((function(){d=arguments[0],l=arguments[1]}));return c.resolve=d,c.reject=l,c}function Z(){for(var d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=c.length,Z=0;Z<d;Z++)l[Z]=c[0|Math.random()*b];return l.join("")}var y,G=(y="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCnZhciB0PUFycmF5LmlzQXJyYXksZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImRlZmF1bHQiKT90LmRlZmF1bHQ6dH1mdW5jdGlvbiBvKHQpe3ZhciBlPXtleHBvcnRzOnt9fTtyZXR1cm4gdChlLGUuZXhwb3J0cyksZS5leHBvcnRzfXZhciBuPSJvYmplY3QiPT10eXBlb2YgZSYmZSYmZS5PYmplY3Q9PT1PYmplY3QmJmUscz0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGk9bnx8c3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSx1PWkuU3ltYm9sLGE9T2JqZWN0LnByb3RvdHlwZSxoPWEuaGFzT3duUHJvcGVydHksbD1hLnRvU3RyaW5nLGM9dT91LnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgZj1mdW5jdGlvbih0KXt2YXIgZT1oLmNhbGwodCxjKSxyPXRbY107dHJ5e3RbY109dm9pZCAwO3ZhciBvPSEwfWNhdGNoKHQpe312YXIgbj1sLmNhbGwodCk7cmV0dXJuIG8mJihlP3RbY109cjpkZWxldGUgdFtjXSksbn0sbT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBnPWZ1bmN0aW9uKHQpe3JldHVybiBtLmNhbGwodCl9LHA9dT91LnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgdz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjpwJiZwIGluIE9iamVjdCh0KT9mKHQpOmcodCl9O3ZhciBkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9O3ZhciBiPWZ1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8ZCh0KSYmIltvYmplY3QgU3ltYm9sXSI9PXcodCl9LHk9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sdj0vXlx3KiQvO3ZhciBNPWZ1bmN0aW9uKGUscil7aWYodChlKSlyZXR1cm4hMTt2YXIgbz10eXBlb2YgZTtyZXR1cm4hKCJudW1iZXIiIT1vJiYic3ltYm9sIiE9byYmImJvb2xlYW4iIT1vJiZudWxsIT1lJiYhYihlKSl8fCh2LnRlc3QoZSl8fCF5LnRlc3QoZSl8fG51bGwhPXImJmUgaW4gT2JqZWN0KHIpKX07dmFyIHg9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9O3ZhciBFLFM9ZnVuY3Rpb24odCl7aWYoIXgodCkpcmV0dXJuITE7dmFyIGU9dyh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LGo9aVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sXz0oRT0vW14uXSskLy5leGVjKGomJmoua2V5cyYmai5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrRToiIjt2YXIgQT1mdW5jdGlvbih0KXtyZXR1cm4hIV8mJl8gaW4gdH0sQz1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFI9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBDLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxJPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLGs9RnVuY3Rpb24ucHJvdG90eXBlLE49T2JqZWN0LnByb3RvdHlwZSxPPWsudG9TdHJpbmcsRj1OLmhhc093blByb3BlcnR5LHo9UmVnRXhwKCJeIitPLmNhbGwoRikucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIFQ9ZnVuY3Rpb24odCl7cmV0dXJuISgheCh0KXx8QSh0KSkmJihTKHQpP3o6SSkudGVzdChSKHQpKX07dmFyIFY9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIFA9ZnVuY3Rpb24odCxlKXt2YXIgcj1WKHQsZSk7cmV0dXJuIFQocik/cjp2b2lkIDB9LHE9UChPYmplY3QsImNyZWF0ZSIpO3ZhciAkPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1xP3EobnVsbCk6e30sdGhpcy5zaXplPTB9O3ZhciBEPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxVPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihxKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIFUuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxCPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gcT92b2lkIDAhPT1lW3RdOkIuY2FsbChlLHQpfTt2YXIgSz1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09cSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBXKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbz10W2VdO3RoaXMuc2V0KG9bMF0sb1sxXSl9fVcucHJvdG90eXBlLmNsZWFyPSQsVy5wcm90b3R5cGUuZGVsZXRlPUQsVy5wcm90b3R5cGUuZ2V0PUwsVy5wcm90b3R5cGUuaGFzPUcsVy5wcm90b3R5cGUuc2V0PUs7dmFyIFg9Vzt2YXIgSj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9O3ZhciBZPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfTt2YXIgWj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKFkodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX0sSD1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBRPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1aKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOkguY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfTt2YXIgdHQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPVooZSx0KTtyZXR1cm4gcjwwP3ZvaWQgMDplW3JdWzFdfTt2YXIgZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIFoodGhpcy5fX2RhdGFfXyx0KT4tMX07dmFyIHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxvPVoocix0KTtyZXR1cm4gbzwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW29dWzFdPWUsdGhpc307ZnVuY3Rpb24gb3QodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBvPXRbZV07dGhpcy5zZXQob1swXSxvWzFdKX19b3QucHJvdG90eXBlLmNsZWFyPUosb3QucHJvdG90eXBlLmRlbGV0ZT1RLG90LnByb3RvdHlwZS5nZXQ9dHQsb3QucHJvdG90eXBlLmhhcz1ldCxvdC5wcm90b3R5cGUuc2V0PXJ0O3ZhciBudD1vdCxzdD1QKGksIk1hcCIpO3ZhciBpdD1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFgsbWFwOm5ldyhzdHx8bnQpLHN0cmluZzpuZXcgWH19O3ZhciB1dD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fTt2YXIgYXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10Ll9fZGF0YV9fO3JldHVybiB1dChlKT9yWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOnIubWFwfTt2YXIgaHQ9ZnVuY3Rpb24odCl7dmFyIGU9YXQodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX07dmFyIGx0PWZ1bmN0aW9uKHQpe3JldHVybiBhdCh0aGlzLHQpLmdldCh0KX07dmFyIGN0PWZ1bmN0aW9uKHQpe3JldHVybiBhdCh0aGlzLHQpLmhhcyh0KX07dmFyIGZ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9YXQodGhpcyx0KSxvPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bz8wOjEsdGhpc307ZnVuY3Rpb24gbXQodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBvPXRbZV07dGhpcy5zZXQob1swXSxvWzFdKX19bXQucHJvdG90eXBlLmNsZWFyPWl0LG10LnByb3RvdHlwZS5kZWxldGU9aHQsbXQucHJvdG90eXBlLmdldD1sdCxtdC5wcm90b3R5cGUuaGFzPWN0LG10LnByb3RvdHlwZS5zZXQ9ZnQ7dmFyIGd0PW10O2Z1bmN0aW9uIHB0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBvPWFyZ3VtZW50cyxuPWU/ZS5hcHBseSh0aGlzLG8pOm9bMF0scz1yLmNhY2hlO2lmKHMuaGFzKG4pKXJldHVybiBzLmdldChuKTt2YXIgaT10LmFwcGx5KHRoaXMsbyk7cmV0dXJuIHIuY2FjaGU9cy5zZXQobixpKXx8cyxpfTtyZXR1cm4gci5jYWNoZT1uZXcocHQuQ2FjaGV8fGd0KSxyfXB0LkNhY2hlPWd0O3ZhciB3dD1wdDt2YXIgZHQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csYnQ9L1xcKFxcKT8vZyx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKGR0LChmdW5jdGlvbih0LHIsbyxuKXtlLnB1c2gobz9uLnJlcGxhY2UoYnQsIiQxIik6cnx8dCl9KSksZX0pKTt2YXIgdnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGgsbj1BcnJheShvKTsrK3I8bzspbltyXT1lKHRbcl0scix0KTtyZXR1cm4gbn0sTXQ9dT91LnByb3RvdHlwZTp2b2lkIDAseHQ9TXQ/TXQudG9TdHJpbmc6dm9pZCAwO3ZhciBFdD1mdW5jdGlvbiBlKHIpe2lmKCJzdHJpbmciPT10eXBlb2YgcilyZXR1cm4gcjtpZih0KHIpKXJldHVybiB2dChyLGUpKyIiO2lmKGIocikpcmV0dXJuIHh0P3h0LmNhbGwocik6IiI7dmFyIG89cisiIjtyZXR1cm4iMCI9PW8mJjEvcj09LUluZmluaXR5PyItMCI6b307dmFyIFN0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOkV0KHQpfTt2YXIganQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdChlKT9lOk0oZSxyKT9bZV06eXQoU3QoZSkpfTt2YXIgX3Q9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxiKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1JbmZpbml0eT8iLTAiOmV9O3ZhciBBdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG89KGU9anQoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8bzspdD10W190KGVbcisrXSldO3JldHVybiByJiZyPT1vP3Q6dm9pZCAwfTt2YXIgQ3Q9ZnVuY3Rpb24odCxlLHIpe3ZhciBvPW51bGw9PXQ/dm9pZCAwOkF0KHQsZSk7cmV0dXJuIHZvaWQgMD09PW8/cjpvfSxSdD1PYmplY3QucHJvdG90eXBlO3ZhciBJdD1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8UnQpfTt2YXIga3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQoZShyKSl9fShPYmplY3Qua2V5cyxPYmplY3QpLE50PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIE90PWZ1bmN0aW9uKHQpe2lmKCFJdCh0KSlyZXR1cm4ga3QodCk7dmFyIGU9W107Zm9yKHZhciByIGluIE9iamVjdCh0KSlOdC5jYWxsKHQscikmJiJjb25zdHJ1Y3RvciIhPXImJmUucHVzaChyKTtyZXR1cm4gZX0sRnQ9UChpLCJEYXRhVmlldyIpLHp0PVAoaSwiUHJvbWlzZSIpLFR0PVAoaSwiU2V0IiksVnQ9UChpLCJXZWFrTWFwIiksUHQ9UihGdCkscXQ9UihzdCksJHQ9Uih6dCksRHQ9UihUdCksVXQ9UihWdCksTHQ9dzsoRnQmJiJbb2JqZWN0IERhdGFWaWV3XSIhPUx0KG5ldyBGdChuZXcgQXJyYXlCdWZmZXIoMSkpKXx8c3QmJiJbb2JqZWN0IE1hcF0iIT1MdChuZXcgc3QpfHx6dCYmIltvYmplY3QgUHJvbWlzZV0iIT1MdCh6dC5yZXNvbHZlKCkpfHxUdCYmIltvYmplY3QgU2V0XSIhPUx0KG5ldyBUdCl8fFZ0JiYiW29iamVjdCBXZWFrTWFwXSIhPUx0KG5ldyBWdCkpJiYoTHQ9ZnVuY3Rpb24odCl7dmFyIGU9dyh0KSxyPSJbb2JqZWN0IE9iamVjdF0iPT1lP3QuY29uc3RydWN0b3I6dm9pZCAwLG89cj9SKHIpOiIiO2lmKG8pc3dpdGNoKG8pe2Nhc2UgUHQ6cmV0dXJuIltvYmplY3QgRGF0YVZpZXddIjtjYXNlIHF0OnJldHVybiJbb2JqZWN0IE1hcF0iO2Nhc2UgJHQ6cmV0dXJuIltvYmplY3QgUHJvbWlzZV0iO2Nhc2UgRHQ6cmV0dXJuIltvYmplY3QgU2V0XSI7Y2FzZSBVdDpyZXR1cm4iW29iamVjdCBXZWFrTWFwXSJ9cmV0dXJuIGV9KTt2YXIgQnQ9THQ7dmFyIEd0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD05MDA3MTk5MjU0NzQwOTkxfTt2YXIgS3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJkd0KHQubGVuZ3RoKSYmIVModCl9O3ZhciBXdD1mdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCF0KGUpJiZkKGUpJiYiW29iamVjdCBTdHJpbmddIj09dyhlKX07dmFyIFh0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19LEp0PVh0KCJsZW5ndGgiKSxZdD1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIik7dmFyIFp0PWZ1bmN0aW9uKHQpe3JldHVybiBZdC50ZXN0KHQpfSxIdD0iW1xcdWQ4MDAtXFx1ZGZmZl0iLFF0PSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsdGU9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsZWU9IlteXFx1ZDgwMC1cXHVkZmZmXSIscmU9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLG9lPSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixuZT0iKD86IitRdCsifCIrdGUrIikiKyI/IixzZT0iW1xcdWZlMGVcXHVmZTBmXT8iK25lKygiKD86XFx1MjAwZCg/OiIrW2VlLHJlLG9lXS5qb2luKCJ8IikrIilbXFx1ZmUwZVxcdWZlMGZdPyIrbmUrIikqIiksaWU9Iig/OiIrW2VlK1F0KyI/IixRdCxyZSxvZSxIdF0uam9pbigifCIpKyIpIix1ZT1SZWdFeHAodGUrIig/PSIrdGUrIil8IitpZStzZSwiZyIpO3ZhciBhZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dWUubGFzdEluZGV4PTA7dWUudGVzdCh0KTspKytlO3JldHVybiBlfTt2YXIgaGU9ZnVuY3Rpb24odCl7cmV0dXJuIFp0KHQpP2FlKHQpOkp0KHQpfTt2YXIgbGU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihLdCh0KSlyZXR1cm4gV3QodCk/aGUodCk6dC5sZW5ndGg7dmFyIGU9QnQodCk7cmV0dXJuIltvYmplY3QgTWFwXSI9PWV8fCJbb2JqZWN0IFNldF0iPT1lP3Quc2l6ZTpPdCh0KS5sZW5ndGh9O3ZhciBjZT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fGQodCkmJiJbb2JqZWN0IE51bWJlcl0iPT13KHQpfTt2YXIgZmU9ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10fHwhMT09PXR8fGQodCkmJiJbb2JqZWN0IEJvb2xlYW5dIj09dyh0KX07ZnVuY3Rpb24gbWUodCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBwZSh0KXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4hIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYoZ2UodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISghcGUodCl8fCIiIT09dCl9KHQpfHwhIWZ1bmN0aW9uKHQpe3JldHVybiEhbWUodCkmJjA9PT10Lmxlbmd0aH0odCkpKSl9ZnVuY3Rpb24gZGUodCl7cmV0dXJuISFtZSh0KSYmKDAhPT10Lmxlbmd0aCYmKDEhPT10Lmxlbmd0aHx8IXdlKHRbMF0pKSl9Y29uc3QgYmU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB5ZSh0KXtyZXR1cm4gYmUuY2FsbCh0KS5lbmRzV2l0aCgiQXJyYXldIil9ZnVuY3Rpb24gdmUodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF5ZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7dmFyIHI9ZS5mcm9tSW5kZXgsbz12b2lkIDA9PT1yPzA6cixuPWUudG9JbmRleCxzPXZvaWQgMD09PW4/dC5sZW5ndGg6bjtpZihvPDB8fG8+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihvKSl0aHJvdyBuZXcgRXJyb3IoImZyb21JbmRleCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gbGVuZ3RoIik7aWYoczw9b3x8cz50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocykpdGhyb3cgbmV3IEVycm9yKCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCIpO2Zvcih2YXIgaT10W29dLHU9bysxO3U8czt1KyspdFt1XT5pJiYoaT10W3VdKTtyZXR1cm4gaX1mdW5jdGlvbiBNZSh0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgcj1lLmZyb21JbmRleCxvPXZvaWQgMD09PXI/MDpyLG49ZS50b0luZGV4LHM9dm9pZCAwPT09bj90Lmxlbmd0aDpuO2lmKG88MHx8bz49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG8pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1vfHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciBpPXRbb10sdT1vKzE7dTxzO3UrKyl0W3VdPGkmJihpPXRbdV0pO3JldHVybiBpfWZ1bmN0aW9uIHhlKHQpe3ZhciBlLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF5ZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7aWYodm9pZCAwIT09ci5vdXRwdXQpe2lmKCF5ZShyLm91dHB1dCkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZCIpO2U9ci5vdXRwdXR9ZWxzZSBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7dmFyIG89TWUodCksbj12ZSh0KTtpZihvPT09bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluaW11bSBhbmQgbWF4aW11bSBpbnB1dCB2YWx1ZXMgYXJlIGVxdWFsLiBDYW5ub3QgcmVzY2FsZSBhIGNvbnN0YW50IGFycmF5Iik7dmFyIHM9ci5taW4saT12b2lkIDA9PT1zP3IuYXV0b01pbk1heD9vOjA6cyx1PXIubWF4LGE9dm9pZCAwPT09dT9yLmF1dG9NaW5NYXg/bjoxOnU7aWYoaT49YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG9wdGlvbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXggb3B0aW9uIik7Zm9yKHZhciBoPShhLWkpLyhuLW8pLGw9MDtsPHQubGVuZ3RoO2wrKyllW2xdPSh0W2xdLW8pKmgraTtyZXR1cm4gZX1jb25zdCBFZT0iICIucmVwZWF0KDIpLFNlPSIgIi5yZXBlYXQoNCk7ZnVuY3Rpb24gamUodCxlPXt9KXtjb25zdHttYXhSb3dzOnI9MTUsbWF4Q29sdW1uczpvPTEwLG1heE51bVNpemU6bj04fT1lO3JldHVybmAke3QuY29uc3RydWN0b3IubmFtZX0ge1xuJHtFZX1bXG4ke1NlfSR7ZnVuY3Rpb24odCxlLHIsbyl7Y29uc3R7cm93czpuLGNvbHVtbnM6c309dCxpPU1hdGgubWluKG4sZSksdT1NYXRoLm1pbihzLHIpLGE9W107Zm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IHI9W107Zm9yKGxldCBuPTA7bjx1O24rKylyLnB1c2goX2UodC5nZXQoZSxuKSxvKSk7YS5wdXNoKGAke3Iuam9pbigiICIpfWApfXUhPT1zJiYoYVthLmxlbmd0aC0xXSs9YCAuLi4gJHtzLXJ9IG1vcmUgY29sdW1uc2ApO2khPT1uJiZhLnB1c2goYC4uLiAke24tZX0gbW9yZSByb3dzYCk7cmV0dXJuIGEuam9pbihgXG4ke1NlfWApfSh0LHIsbyxuKX1cbiR7RWV9XVxuJHtFZX1yb3dzOiAke3Qucm93c31cbiR7RWV9Y29sdW1uczogJHt0LmNvbHVtbnN9XG59YH1mdW5jdGlvbiBfZSh0LGUpe2NvbnN0IHI9U3RyaW5nKHQpO2lmKHIubGVuZ3RoPD1lKXJldHVybiByLnBhZEVuZChlLCIgIik7Y29uc3Qgbz10LnRvUHJlY2lzaW9uKGUtMik7aWYoby5sZW5ndGg8PWUpcmV0dXJuIG87Y29uc3Qgbj10LnRvRXhwb25lbnRpYWwoZS0yKSxzPW4uaW5kZXhPZigiZSIpLGk9bi5zbGljZShzKTtyZXR1cm4gbi5zbGljZSgwLGUtaS5sZW5ndGgpK2l9ZnVuY3Rpb24gQWUodCxlLHIpe2xldCBvPXI/dC5yb3dzOnQucm93cy0xO2lmKGU8MHx8ZT5vKXRocm93IG5ldyBSYW5nZUVycm9yKCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gQ2UodCxlLHIpe2xldCBvPXI/dC5jb2x1bW5zOnQuY29sdW1ucy0xO2lmKGU8MHx8ZT5vKXRocm93IG5ldyBSYW5nZUVycm9yKCJDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUmUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIik7cmV0dXJuIGV9ZnVuY3Rpb24gSWUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzIik7cmV0dXJuIGV9ZnVuY3Rpb24ga2UodCxlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigidW5leHBlY3RlZCB0eXBlIGZvciByb3cgaW5kaWNlcyIpO2lmKGUuc29tZSgoZT0+ZTwwfHxlPj10LnJvd3MpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicm93IGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpO3JldHVybiBBcnJheS5pc0FycmF5KGUpfHwoZT1BcnJheS5mcm9tKGUpKSxlfWZ1bmN0aW9uIE5lKHQsZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoInVuZXhwZWN0ZWQgdHlwZSBmb3IgY29sdW1uIGluZGljZXMiKTtpZihlLnNvbWUoKGU9PmU8MHx8ZT49dC5jb2x1bW5zKSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImNvbHVtbiBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKTtyZXR1cm4gQXJyYXkuaXNBcnJheShlKXx8KGU9QXJyYXkuZnJvbShlKSksZX1mdW5jdGlvbiBPZSh0LGUscixvLG4pe2lmKDUhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJleHBlY3RlZCA0IGFyZ3VtZW50cyIpO2lmKHplKCJzdGFydFJvdyIsZSksemUoImVuZFJvdyIsciksemUoInN0YXJ0Q29sdW1uIixvKSx6ZSgiZW5kQ29sdW1uIixuKSxlPnJ8fG8+bnx8ZTwwfHxlPj10LnJvd3N8fHI8MHx8cj49dC5yb3dzfHxvPDB8fG8+PXQuY29sdW1uc3x8bjwwfHxuPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlN1Ym1hdHJpeCBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBGZSh0LGU9MCl7bGV0IHI9W107Zm9yKGxldCBvPTA7bzx0O28rKylyLnB1c2goZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gemUodCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0fSBtdXN0IGJlIGEgbnVtYmVyYCl9ZnVuY3Rpb24gVGUodCl7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJFbXB0eSBtYXRyaXggaGFzIG5vIGVsZW1lbnRzIHRvIGluZGV4Iil9Y2xhc3MgVmV7c3RhdGljIGZyb20xREFycmF5KHQsZSxyKXtpZih0KmUhPT1yLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZGF0YSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggZ2l2ZW4gZGltZW5zaW9ucyIpO2xldCBvPW5ldyBxZSh0LGUpO2ZvcihsZXQgbj0wO248dDtuKyspZm9yKGxldCB0PTA7dDxlO3QrKylvLnNldChuLHQscltuKmUrdF0pO3JldHVybiBvfXN0YXRpYyByb3dWZWN0b3IodCl7bGV0IGU9bmV3IHFlKDEsdC5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWUuc2V0KDAscix0W3JdKTtyZXR1cm4gZX1zdGF0aWMgY29sdW1uVmVjdG9yKHQpe2xldCBlPW5ldyBxZSh0Lmxlbmd0aCwxKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldChyLDAsdFtyXSk7cmV0dXJuIGV9c3RhdGljIHplcm9zKHQsZSl7cmV0dXJuIG5ldyBxZSh0LGUpfXN0YXRpYyBvbmVzKHQsZSl7cmV0dXJuIG5ldyBxZSh0LGUpLmZpbGwoMSl9c3RhdGljIHJhbmQodCxlLHI9e30pe2lmKCJvYmplY3QiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cmFuZG9tOm89TWF0aC5yYW5kb219PXI7bGV0IG49bmV3IHFlKHQsZSk7Zm9yKGxldCByPTA7cjx0O3IrKylmb3IobGV0IHQ9MDt0PGU7dCsrKW4uc2V0KHIsdCxvKCkpO3JldHVybiBufXN0YXRpYyByYW5kSW50KHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjpvPTAsbWF4Om49MWUzLHJhbmRvbTpzPU1hdGgucmFuZG9tfT1yO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGFuIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYobz49bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBpPW4tbyx1PW5ldyBxZSh0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bytNYXRoLnJvdW5kKHMoKSppKTt1LnNldChyLHQsZSl9cmV0dXJuIHV9c3RhdGljIGV5ZSh0LGUscil7dm9pZCAwPT09ZSYmKGU9dCksdm9pZCAwPT09ciYmKHI9MSk7bGV0IG89TWF0aC5taW4odCxlKSxuPXRoaXMuemVyb3ModCxlKTtmb3IobGV0IHQ9MDt0PG87dCsrKW4uc2V0KHQsdCxyKTtyZXR1cm4gbn1zdGF0aWMgZGlhZyh0LGUscil7bGV0IG89dC5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9byksdm9pZCAwPT09ciYmKHI9ZSk7bGV0IG49TWF0aC5taW4obyxlLHIpLHM9dGhpcy56ZXJvcyhlLHIpO2ZvcihsZXQgZT0wO2U8bjtlKyspcy5zZXQoZSxlLHRbZV0pO3JldHVybiBzfXN0YXRpYyBtaW4odCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxvPXQuY29sdW1ucyxuPW5ldyBxZShyLG8pO2ZvcihsZXQgcz0wO3M8cjtzKyspZm9yKGxldCByPTA7cjxvO3IrKyluLnNldChzLHIsTWF0aC5taW4odC5nZXQocyxyKSxlLmdldChzLHIpKSk7cmV0dXJuIG59c3RhdGljIG1heCh0LGUpe3Q9dGhpcy5jaGVja01hdHJpeCh0KSxlPXRoaXMuY2hlY2tNYXRyaXgoZSk7bGV0IHI9dC5yb3dzLG89dC5jb2x1bW5zLG49bmV3IHRoaXMocixvKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bztyKyspbi5zZXQocyxyLE1hdGgubWF4KHQuZ2V0KHMsciksZS5nZXQocyxyKSkpO3JldHVybiBufXN0YXRpYyBjaGVja01hdHJpeCh0KXtyZXR1cm4gVmUuaXNNYXRyaXgodCk/dDpuZXcgcWUodCl9c3RhdGljIGlzTWF0cml4KHQpe3JldHVybiBudWxsIT10JiYiTWF0cml4Ij09PXQua2xhc3N9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5yb3dzKnRoaXMuY29sdW1uc31hcHBseSh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuY2FsbCh0aGlzLGUscik7cmV0dXJuIHRoaXN9dG8xREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnB1c2godGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9dG8yREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXt0LnB1c2goW10pO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0W2VdLnB1c2godGhpcy5nZXQoZSxyKSl9cmV0dXJuIHR9dG9KU09OKCl7cmV0dXJuIHRoaXMudG8yREFycmF5KCl9aXNSb3dWZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMucm93c31pc0NvbHVtblZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5jb2x1bW5zfWlzVmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N8fDE9PT10aGlzLmNvbHVtbnN9aXNTcXVhcmUoKXtyZXR1cm4gdGhpcy5yb3dzPT09dGhpcy5jb2x1bW5zfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMucm93c3x8MD09PXRoaXMuY29sdW1uc31pc1N5bW1ldHJpYygpe2lmKHRoaXMuaXNTcXVhcmUoKSl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8PXQ7ZSsrKWlmKHRoaXMuZ2V0KHQsZSkhPT10aGlzLmdldChlLHQpKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWlzRWNoZWxvbkZvcm0oKXtsZXQgdD0wLGU9MCxyPS0xLG89ITAsbj0hMTtmb3IoO3Q8dGhpcy5yb3dzJiZvOyl7Zm9yKGU9MCxuPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PW47KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5yPyhuPSEwLHI9ZSk6KG89ITEsbj0hMCk7dCsrfXJldHVybiBvfWlzUmVkdWNlZEVjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAscj0tMSxvPSEwLG49ITE7Zm9yKDt0PHRoaXMucm93cyYmbzspe2ZvcihlPTAsbj0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1uOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+cj8obj0hMCxyPWUpOihvPSExLG49ITApO2ZvcihsZXQgcj1lKzE7cjx0aGlzLnJvd3M7cisrKTAhPT10aGlzLmdldCh0LHIpJiYobz0hMSk7dCsrfXJldHVybiBvfWVjaGVsb25Gb3JtKCl7bGV0IHQ9dGhpcy5jbG9uZSgpLGU9MCxyPTA7Zm9yKDtlPHQucm93cyYmcjx0LmNvbHVtbnM7KXtsZXQgbz1lO2ZvcihsZXQgbj1lO248dC5yb3dzO24rKyl0LmdldChuLHIpPnQuZ2V0KG8scikmJihvPW4pO2lmKDA9PT10LmdldChvLHIpKXIrKztlbHNle3Quc3dhcFJvd3MoZSxvKTtsZXQgbj10LmdldChlLHIpO2ZvcihsZXQgbz1yO288dC5jb2x1bW5zO28rKyl0LnNldChlLG8sdC5nZXQoZSxvKS9uKTtmb3IobGV0IG89ZSsxO288dC5yb3dzO28rKyl7bGV0IG49dC5nZXQobyxyKS90LmdldChlLHIpO3Quc2V0KG8sciwwKTtmb3IobGV0IHM9cisxO3M8dC5jb2x1bW5zO3MrKyl0LnNldChvLHMsdC5nZXQobyxzKS10LmdldChlLHMpKm4pfWUrKyxyKyt9fXJldHVybiB0fXJlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuZWNoZWxvbkZvcm0oKSxlPXQuY29sdW1ucyxyPXQucm93cyxvPXItMTtmb3IoO28+PTA7KWlmKDA9PT10Lm1heFJvdyhvKSlvLS07ZWxzZXtsZXQgbj0wLHM9ITE7Zm9yKDtuPHImJiExPT09czspMT09PXQuZ2V0KG8sbik/cz0hMDpuKys7Zm9yKGxldCByPTA7cjxvO3IrKyl7bGV0IHM9dC5nZXQocixuKTtmb3IobGV0IGk9bjtpPGU7aSsrKXtsZXQgZT10LmdldChyLGkpLXMqdC5nZXQobyxpKTt0LnNldChyLGksZSl9fW8tLX1yZXR1cm4gdH1zZXQoKXt0aHJvdyBuZXcgRXJyb3IoInNldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfWdldCgpe3Rocm93IG5ldyBFcnJvcigiZ2V0IG1ldGhvZCBpcyB1bmltcGxlbWVudGVkIil9cmVwZWF0KHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cm93czplPTEsY29sdW1uczpyPTF9PXQ7aWYoIU51bWJlci5pc0ludGVnZXIoZSl8fGU8PTApdGhyb3cgbmV3IFR5cGVFcnJvcigicm93cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHIpfHxyPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoImNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtsZXQgbz1uZXcgcWUodGhpcy5yb3dzKmUsdGhpcy5jb2x1bW5zKnIpO2ZvcihsZXQgdD0wO3Q8ZTt0KyspZm9yKGxldCBlPTA7ZTxyO2UrKylvLnNldFN1Yk1hdHJpeCh0aGlzLHRoaXMucm93cyp0LHRoaXMuY29sdW1ucyplKTtyZXR1cm4gb31maWxsKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHQpO3JldHVybiB0aGlzfW5lZygpe3JldHVybiB0aGlzLm11bFMoLTEpfWdldFJvdyh0KXtBZSh0aGlzLHQpO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyllLnB1c2godGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9Z2V0Um93VmVjdG9yKHQpe3JldHVybiBxZS5yb3dWZWN0b3IodGhpcy5nZXRSb3codCkpfXNldFJvdyh0LGUpe0FlKHRoaXMsdCksZT1SZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldCh0LHIsZVtyXSk7cmV0dXJuIHRoaXN9c3dhcFJvd3ModCxlKXtBZSh0aGlzLHQpLEFlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXtsZXQgbz10aGlzLmdldCh0LHIpO3RoaXMuc2V0KHQscix0aGlzLmdldChlLHIpKSx0aGlzLnNldChlLHIsbyl9cmV0dXJuIHRoaXN9Z2V0Q29sdW1uKHQpe0NlKHRoaXMsdCk7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWUucHVzaCh0aGlzLmdldChyLHQpKTtyZXR1cm4gZX1nZXRDb2x1bW5WZWN0b3IodCl7cmV0dXJuIHFlLmNvbHVtblZlY3Rvcih0aGlzLmdldENvbHVtbih0KSl9c2V0Q29sdW1uKHQsZSl7Q2UodGhpcyx0KSxlPUllKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXRoaXMuc2V0KHIsdCxlW3JdKTtyZXR1cm4gdGhpc31zd2FwQ29sdW1ucyh0LGUpe0NlKHRoaXMsdCksQ2UodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspe2xldCBvPXRoaXMuZ2V0KHIsdCk7dGhpcy5zZXQocix0LHRoaXMuZ2V0KHIsZSkpLHRoaXMuc2V0KHIsZSxvKX1yZXR1cm4gdGhpc31hZGRSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdFtyXSk7cmV0dXJuIHRoaXN9c3ViUm93VmVjdG9yKHQpe3Q9UmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXRbcl0pO3JldHVybiB0aGlzfW11bFJvd1ZlY3Rvcih0KXt0PVJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0W3JdKTtyZXR1cm4gdGhpc31kaXZSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdFtyXSk7cmV0dXJuIHRoaXN9YWRkQ29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3RbZV0pO3JldHVybiB0aGlzfXN1YkNvbHVtblZlY3Rvcih0KXt0PUllKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10W2VdKTtyZXR1cm4gdGhpc31tdWxDb2x1bW5WZWN0b3IodCl7dD1JZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdFtlXSk7cmV0dXJuIHRoaXN9ZGl2Q29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3RbZV0pO3JldHVybiB0aGlzfW11bFJvdyh0LGUpe0FlKHRoaXMsdCk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KHQscix0aGlzLmdldCh0LHIpKmUpO3JldHVybiB0aGlzfW11bENvbHVtbih0LGUpe0NlKHRoaXMsdCk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXRoaXMuc2V0KHIsdCx0aGlzLmdldChyLHQpKmUpO3JldHVybiB0aGlzfW1heCgpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IHQ9dGhpcy5nZXQoMCwwKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dCYmKHQ9dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9bWF4SW5kZXgoKXtUZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgbz0wO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldChyLG8pPnQmJih0PXRoaXMuZ2V0KHIsbyksZVswXT1yLGVbMV09byk7cmV0dXJuIGV9bWluKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKTx0JiYodD10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1taW5JbmRleCgpe1RlKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBvPTA7bzx0aGlzLmNvbHVtbnM7bysrKXRoaXMuZ2V0KHIsbyk8dCYmKHQ9dGhpcy5nZXQocixvKSxlWzBdPXIsZVsxXT1vKTtyZXR1cm4gZX1tYXhSb3codCl7aWYoQWUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik+ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWF4Um93SW5kZXgodCl7QWUodGhpcyx0KSxUZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBvPTE7bzx0aGlzLmNvbHVtbnM7bysrKXRoaXMuZ2V0KHQsbyk+ZSYmKGU9dGhpcy5nZXQodCxvKSxyWzFdPW8pO3JldHVybiByfW1pblJvdyh0KXtpZihBZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IHI9MTtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQodCxyKTxlJiYoZT10aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1taW5Sb3dJbmRleCh0KXtBZSh0aGlzLHQpLFRlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KHQsMCkscj1bdCwwXTtmb3IobGV0IG89MTtvPHRoaXMuY29sdW1ucztvKyspdGhpcy5nZXQodCxvKTxlJiYoZT10aGlzLmdldCh0LG8pLHJbMV09byk7cmV0dXJuIHJ9bWF4Q29sdW1uKHQpe2lmKENlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPmUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1heENvbHVtbkluZGV4KHQpe0NlKHRoaXMsdCksVGUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgbz0xO288dGhpcy5yb3dzO28rKyl0aGlzLmdldChvLHQpPmUmJihlPXRoaXMuZ2V0KG8sdCksclswXT1vKTtyZXR1cm4gcn1taW5Db2x1bW4odCl7aWYoQ2UodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCByPTE7cjx0aGlzLnJvd3M7cisrKXRoaXMuZ2V0KHIsdCk8ZSYmKGU9dGhpcy5nZXQocix0KSk7cmV0dXJuIGV9bWluQ29sdW1uSW5kZXgodCl7Q2UodGhpcyx0KSxUZSh0aGlzKTtsZXQgZT10aGlzLmdldCgwLHQpLHI9WzAsdF07Zm9yKGxldCBvPTE7bzx0aGlzLnJvd3M7bysrKXRoaXMuZ2V0KG8sdCk8ZSYmKGU9dGhpcy5nZXQobyx0KSxyWzBdPW8pO3JldHVybiByfWRpYWcoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMuZ2V0KHIscikpO3JldHVybiBlfW5vcm0odD0iZnJvYmVuaXVzIil7bGV0IGU9MDtpZigibWF4Ij09PXQpcmV0dXJuIHRoaXMubWF4KCk7aWYoImZyb2Jlbml1cyI9PT10KXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKWUrPXRoaXMuZ2V0KHQscikqdGhpcy5nZXQodCxyKTtyZXR1cm4gTWF0aC5zcXJ0KGUpfXRocm93IG5ldyBSYW5nZUVycm9yKGB1bmtub3duIG5vcm0gdHlwZTogJHt0fWApfWN1bXVsYXRpdmVTdW0oKXtsZXQgdD0wO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdCs9dGhpcy5nZXQoZSxyKSx0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9ZG90KHQpe1ZlLmlzTWF0cml4KHQpJiYodD10LnRvMURBcnJheSgpKTtsZXQgZT10aGlzLnRvMURBcnJheSgpO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvcnMgZG8gbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSIpO2xldCByPTA7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspcis9ZVtvXSp0W29dO3JldHVybiByfW1tdWwodCl7dD1xZS5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMsbz10LmNvbHVtbnMsbj1uZXcgcWUoZSxvKSxzPW5ldyBGbG9hdDY0QXJyYXkocik7Zm9yKGxldCBpPTA7aTxvO2krKyl7Zm9yKGxldCBlPTA7ZTxyO2UrKylzW2VdPXQuZ2V0KGUsaSk7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9MDtmb3IobGV0IG89MDtvPHI7bysrKWUrPXRoaXMuZ2V0KHQsbykqc1tvXTtuLnNldCh0LGksZSl9fXJldHVybiBufXN0cmFzc2VuMngyKHQpe3Q9cWUuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IHFlKDIsMik7Y29uc3Qgcj10aGlzLmdldCgwLDApLG89dC5nZXQoMCwwKSxuPXRoaXMuZ2V0KDAsMSkscz10LmdldCgwLDEpLGk9dGhpcy5nZXQoMSwwKSx1PXQuZ2V0KDEsMCksYT10aGlzLmdldCgxLDEpLGg9dC5nZXQoMSwxKSxsPShyK2EpKihvK2gpLGM9KGkrYSkqbyxmPXIqKHMtaCksbT1hKih1LW8pLGc9KHIrbikqaCxwPWwrbS1nKyhuLWEpKih1K2gpLHc9ZitnLGQ9YyttLGI9bC1jK2YrKGktcikqKG8rcyk7cmV0dXJuIGUuc2V0KDAsMCxwKSxlLnNldCgwLDEsdyksZS5zZXQoMSwwLGQpLGUuc2V0KDEsMSxiKSxlfXN0cmFzc2VuM3gzKHQpe3Q9cWUuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IHFlKDMsMyk7Y29uc3Qgcj10aGlzLmdldCgwLDApLG89dGhpcy5nZXQoMCwxKSxuPXRoaXMuZ2V0KDAsMikscz10aGlzLmdldCgxLDApLGk9dGhpcy5nZXQoMSwxKSx1PXRoaXMuZ2V0KDEsMiksYT10aGlzLmdldCgyLDApLGg9dGhpcy5nZXQoMiwxKSxsPXRoaXMuZ2V0KDIsMiksYz10LmdldCgwLDApLGY9dC5nZXQoMCwxKSxtPXQuZ2V0KDAsMiksZz10LmdldCgxLDApLHA9dC5nZXQoMSwxKSx3PXQuZ2V0KDEsMiksZD10LmdldCgyLDApLGI9dC5nZXQoMiwxKSx5PXQuZ2V0KDIsMiksdj0oci1zKSooLWYrcCksTT0oLXIrcytpKSooYy1mK3ApLHg9KHMraSkqKC1jK2YpLEU9cipjLFM9KC1yK2EraCkqKGMtbSt3KSxqPSgtcithKSoobS13KSxfPShhK2gpKigtYyttKSxBPSgtbitoK2wpKihwK2QtYiksQz0obi1sKSoocC1iKSxSPW4qZCxJPShoK2wpKigtZCtiKSxrPSgtbitpK3UpKih3K2QteSksTj0obi11KSoody15KSxPPShpK3UpKigtZCt5KSxGPUUrUitvKmcsej0ocitvK24tcy1pLWgtbCkqcCtNK3grRStBK1IrSSxUPUUrUytfKyhyK28rbi1pLXUtYS1oKSp3K1IraytPLFY9ditpKigtYytmK2ctcC13LWQreSkrTStFK1IraytOLFA9ditNK3grRSt1KmIscT1SK2srTitPK3MqbSwkPUUrUytqK2gqKC1jK20rZy1wLXctZCtiKStBK0MrUixEPUErQytSK0krYSpmLFU9RStTK2orXytsKnk7cmV0dXJuIGUuc2V0KDAsMCxGKSxlLnNldCgwLDEseiksZS5zZXQoMCwyLFQpLGUuc2V0KDEsMCxWKSxlLnNldCgxLDEsUCksZS5zZXQoMSwyLHEpLGUuc2V0KDIsMCwkKSxlLnNldCgyLDEsRCksZS5zZXQoMiwyLFUpLGV9bW11bFN0cmFzc2VuKHQpe3Q9cWUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5jbG9uZSgpLHI9ZS5yb3dzLG89ZS5jb2x1bW5zLG49dC5yb3dzLHM9dC5jb2x1bW5zO2Z1bmN0aW9uIGkodCxlLHIpe2xldCBvPXQucm93cyxuPXQuY29sdW1ucztpZihvPT09ZSYmbj09PXIpcmV0dXJuIHQ7e2xldCBvPVZlLnplcm9zKGUscik7cmV0dXJuIG89by5zZXRTdWJNYXRyaXgodCwwLDApLG99fW8hPT1uJiZjb25zb2xlLndhcm4oYE11bHRpcGx5aW5nICR7cn0geCAke299IGFuZCAke259IHggJHtzfSBtYXRyaXg6IGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoLmApO2xldCB1PU1hdGgubWF4KHIsbiksYT1NYXRoLm1heChvLHMpO3JldHVybiBlPWkoZSx1LGEpLGZ1bmN0aW9uIHQoZSxyLG8sbil7aWYobzw9NTEyfHxuPD01MTIpcmV0dXJuIGUubW11bChyKTtvJTI9PTEmJm4lMj09MT8oZT1pKGUsbysxLG4rMSkscj1pKHIsbysxLG4rMSkpOm8lMj09MT8oZT1pKGUsbysxLG4pLHI9aShyLG8rMSxuKSk6biUyPT0xJiYoZT1pKGUsbyxuKzEpLHI9aShyLG8sbisxKSk7bGV0IHM9cGFyc2VJbnQoZS5yb3dzLzIsMTApLHU9cGFyc2VJbnQoZS5jb2x1bW5zLzIsMTApLGE9ZS5zdWJNYXRyaXgoMCxzLTEsMCx1LTEpLGg9ci5zdWJNYXRyaXgoMCxzLTEsMCx1LTEpLGw9ZS5zdWJNYXRyaXgoMCxzLTEsdSxlLmNvbHVtbnMtMSksYz1yLnN1Yk1hdHJpeCgwLHMtMSx1LHIuY29sdW1ucy0xKSxmPWUuc3ViTWF0cml4KHMsZS5yb3dzLTEsMCx1LTEpLG09ci5zdWJNYXRyaXgocyxyLnJvd3MtMSwwLHUtMSksZz1lLnN1Yk1hdHJpeChzLGUucm93cy0xLHUsZS5jb2x1bW5zLTEpLHA9ci5zdWJNYXRyaXgocyxyLnJvd3MtMSx1LHIuY29sdW1ucy0xKSx3PXQoVmUuYWRkKGEsZyksVmUuYWRkKGgscCkscyx1KSxkPXQoVmUuYWRkKGYsZyksaCxzLHUpLGI9dChhLFZlLnN1YihjLHApLHMsdSkseT10KGcsVmUuc3ViKG0saCkscyx1KSx2PXQoVmUuYWRkKGEsbCkscCxzLHUpLE09dChWZS5zdWIoZixhKSxWZS5hZGQoaCxjKSxzLHUpLHg9dChWZS5zdWIobCxnKSxWZS5hZGQobSxwKSxzLHUpLEU9VmUuYWRkKHcseSk7RS5zdWIodiksRS5hZGQoeCk7bGV0IFM9VmUuYWRkKGIsdiksaj1WZS5hZGQoZCx5KSxfPVZlLnN1Yih3LGQpO18uYWRkKGIpLF8uYWRkKE0pO2xldCBBPVZlLnplcm9zKDIqRS5yb3dzLDIqRS5jb2x1bW5zKTtyZXR1cm4gQT1BLnNldFN1Yk1hdHJpeChFLDAsMCksQT1BLnNldFN1Yk1hdHJpeChTLEUucm93cywwKSxBPUEuc2V0U3ViTWF0cml4KGosMCxFLmNvbHVtbnMpLEE9QS5zZXRTdWJNYXRyaXgoXyxFLnJvd3MsRS5jb2x1bW5zKSxBLnN1Yk1hdHJpeCgwLG8tMSwwLG4tMSl9KGUsdD1pKHQsdSxhKSx1LGEpfXNjYWxlUm93cyh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjplPTAsbWF4OnI9MX09dDtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIU51bWJlci5pc0Zpbml0ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhIG51bWJlciIpO2lmKGU+PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgbz1uZXcgcWUodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKXtjb25zdCBuPXRoaXMuZ2V0Um93KHQpO24ubGVuZ3RoPjAmJnhlKG4se21pbjplLG1heDpyLG91dHB1dDpufSksby5zZXRSb3codCxuKX1yZXR1cm4gb31zY2FsZUNvbHVtbnModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG89bmV3IHFlKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyl7Y29uc3Qgbj10aGlzLmdldENvbHVtbih0KTtuLmxlbmd0aCYmeGUobix7bWluOmUsbWF4OnIsb3V0cHV0Om59KSxvLnNldENvbHVtbih0LG4pfXJldHVybiBvfWZsaXBSb3dzKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5jb2x1bW5zLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChlLHIpLG89dGhpcy5nZXQoZSx0aGlzLmNvbHVtbnMtMS1yKTt0aGlzLnNldChlLHIsbyksdGhpcy5zZXQoZSx0aGlzLmNvbHVtbnMtMS1yLHQpfXJldHVybiB0aGlzfWZsaXBDb2x1bW5zKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5yb3dzLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChyLGUpLG89dGhpcy5nZXQodGhpcy5yb3dzLTEtcixlKTt0aGlzLnNldChyLGUsbyksdGhpcy5zZXQodGhpcy5yb3dzLTEtcixlLHQpfXJldHVybiB0aGlzfWtyb25lY2tlclByb2R1Y3QodCl7dD1xZS5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMsbz10LnJvd3Msbj10LmNvbHVtbnMscz1uZXcgcWUoZSpvLHIqbik7Zm9yKGxldCBpPTA7aTxlO2krKylmb3IobGV0IGU9MDtlPHI7ZSsrKWZvcihsZXQgcj0wO3I8bztyKyspZm9yKGxldCB1PTA7dTxuO3UrKylzLnNldChvKmkrcixuKmUrdSx0aGlzLmdldChpLGUpKnQuZ2V0KHIsdSkpO3JldHVybiBzfWtyb25lY2tlclN1bSh0KXtpZih0PXFlLmNoZWNrTWF0cml4KHQpLCF0aGlzLmlzU3F1YXJlKCl8fCF0LmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJLcm9uZWNrZXIgU3VtIG5lZWRzIHR3byBTcXVhcmUgTWF0cmljZXMiKTtsZXQgZT10aGlzLnJvd3Mscj10LnJvd3Msbz10aGlzLmtyb25lY2tlclByb2R1Y3QocWUuZXllKHIscikpLG49cWUuZXllKGUsZSkua3JvbmVja2VyUHJvZHVjdCh0KTtyZXR1cm4gby5hZGQobil9dHJhbnNwb3NlKCl7bGV0IHQ9bmV3IHFlKHRoaXMuY29sdW1ucyx0aGlzLnJvd3MpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQocixlLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXNvcnRSb3dzKHQ9UGUpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl0aGlzLnNldFJvdyhlLHRoaXMuZ2V0Um93KGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXNvcnRDb2x1bW5zKHQ9UGUpe2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldENvbHVtbihlLHRoaXMuZ2V0Q29sdW1uKGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXN1Yk1hdHJpeCh0LGUscixvKXtPZSh0aGlzLHQsZSxyLG8pO2xldCBuPW5ldyBxZShlLXQrMSxvLXIrMSk7Zm9yKGxldCBzPXQ7czw9ZTtzKyspZm9yKGxldCBlPXI7ZTw9bztlKyspbi5zZXQocy10LGUtcix0aGlzLmdldChzLGUpKTtyZXR1cm4gbn1zdWJNYXRyaXhSb3codCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMuY29sdW1ucy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5jb2x1bW5zfHxyPDB8fHI+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG89bmV3IHFlKHQubGVuZ3RoLHItZSsxKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylmb3IobGV0IHM9ZTtzPD1yO3MrKyl7aWYodFtuXTwwfHx0W25dPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFJvdyBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtuXX1gKTtvLnNldChuLHMtZSx0aGlzLmdldCh0W25dLHMpKX1yZXR1cm4gb31zdWJNYXRyaXhDb2x1bW4odCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMucm93cy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5yb3dzfHxyPDB8fHI+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG89bmV3IHFlKHItZSsxLHQubGVuZ3RoKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylmb3IobGV0IHM9ZTtzPD1yO3MrKyl7aWYodFtuXTwwfHx0W25dPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtuXX1gKTtvLnNldChzLWUsbix0aGlzLmdldChzLHRbbl0pKX1yZXR1cm4gb31zZXRTdWJNYXRyaXgodCxlLHIpe2lmKCh0PXFlLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7T2UodGhpcyxlLGUrdC5yb3dzLTEscixyK3QuY29sdW1ucy0xKTtmb3IobGV0IG89MDtvPHQucm93cztvKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXRoaXMuc2V0KGUrbyxyK24sdC5nZXQobyxuKSk7cmV0dXJuIHRoaXN9c2VsZWN0aW9uKHQsZSl7bGV0IHI9ZnVuY3Rpb24odCxlLHIpe3JldHVybntyb3c6a2UodCxlKSxjb2x1bW46TmUodCxyKX19KHRoaXMsdCxlKSxvPW5ldyBxZSh0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCB0PTA7dDxyLnJvdy5sZW5ndGg7dCsrKXtsZXQgZT1yLnJvd1t0XTtmb3IobGV0IG49MDtuPHIuY29sdW1uLmxlbmd0aDtuKyspe2xldCBzPXIuY29sdW1uW25dO28uc2V0KHQsbix0aGlzLmdldChlLHMpKX19cmV0dXJuIG99dHJhY2UoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPTA7Zm9yKGxldCByPTA7cjx0O3IrKyllKz10aGlzLmdldChyLHIpO3JldHVybiBlfWNsb25lKCl7bGV0IHQ9bmV3IHFlKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQoZSxyLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXN1bSh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1GZSh0LnJvd3MpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtyXSs9dC5nZXQocixvKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSJjb2x1bW4iOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1GZSh0LmNvbHVtbnMpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtvXSs9dC5nZXQocixvKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTA7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyllKz10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19cHJvZHVjdCh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1GZSh0LnJvd3MsMSk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbz0wO288dC5jb2x1bW5zOysrbyllW3JdKj10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPUZlKHQuY29sdW1ucywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7KytvKWVbb10qPXQuZ2V0KHIsbyk7cmV0dXJuIGV9KHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT0xO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspZSo9dC5nZXQocixvKTtyZXR1cm4gZX0odGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fW1lYW4odCl7Y29uc3QgZT10aGlzLnN1bSh0KTtzd2l0Y2godCl7Y2FzZSJyb3ciOmZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyllW3RdLz10aGlzLmNvbHVtbnM7cmV0dXJuIGU7Y2FzZSJjb2x1bW4iOmZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyllW3RdLz10aGlzLnJvd3M7cmV0dXJuIGU7Y2FzZSB2b2lkIDA6cmV0dXJuIGUvdGhpcy5zaXplO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX12YXJpYW5jZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHt1bmJpYXNlZDpyPSEwLG1lYW46bz10aGlzLm1lYW4odCl9PWU7aWYoImJvb2xlYW4iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmJpYXNlZCBtdXN0IGJlIGEgYm9vbGVhbiIpO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIUFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBvPXQucm93cyxuPXQuY29sdW1ucyxzPVtdO2ZvcihsZXQgaT0wO2k8bztpKyspe2xldCBvPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG47ZSsrKWE9dC5nZXQoaSxlKS1yW2ldLG8rPWEsdSs9YSphO2U/cy5wdXNoKCh1LW8qby9uKS8obi0xKSk6cy5wdXNoKCh1LW8qby9uKS9uKX1yZXR1cm4gc30odGhpcyxyLG8pO2Nhc2UiY29sdW1uIjppZighQXJyYXkuaXNBcnJheShvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtZWFuIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2NvbnN0IG89dC5yb3dzLG49dC5jb2x1bW5zLHM9W107Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IG49MCx1PTAsYT0wO2ZvcihsZXQgZT0wO2U8bztlKyspYT10LmdldChlLGkpLXJbaV0sbis9YSx1Kz1hKmE7ZT9zLnB1c2goKHUtbipuL28pLyhvLTEpKTpzLnB1c2goKHUtbipuL28pL28pfXJldHVybiBzfSh0aGlzLHIsbyk7Y2FzZSB2b2lkIDA6aWYoIm51bWJlciIhPXR5cGVvZiBvKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbz10LnJvd3Msbj10LmNvbHVtbnMscz1vKm47bGV0IGk9MCx1PTAsYT0wO2ZvcihsZXQgZT0wO2U8bztlKyspZm9yKGxldCBvPTA7bzxuO28rKylhPXQuZ2V0KGUsbyktcixpKz1hLHUrPWEqYTtyZXR1cm4gZT8odS1pKmkvcykvKHMtMSk6KHUtaSppL3MpL3N9KHRoaXMscixvKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19c3RhbmRhcmREZXZpYXRpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApO2NvbnN0IHI9dGhpcy52YXJpYW5jZSh0LGUpO2lmKHZvaWQgMD09PXQpcmV0dXJuIE1hdGguc3FydChyKTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKylyW3RdPU1hdGguc3FydChyW3RdKTtyZXR1cm4gcn1jZW50ZXIodCxlPXt9KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7Y2VudGVyOnI9dGhpcy5tZWFuKHQpfT1lO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pLWVbcl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0LnNldChyLG8sdC5nZXQocixvKS1lW29dKX0odGhpcyxyKSx0aGlzO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbyktZSl9KHRoaXMsciksdGhpcztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19c2NhbGUodCxlPXt9KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7bGV0IHI9ZS5zY2FsZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKHZvaWQgMD09PXIpcj1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKyl7bGV0IG89MDtmb3IobGV0IGU9MDtlPHQuY29sdW1ucztlKyspbys9TWF0aC5wb3codC5nZXQocixlKSwyKS8odC5jb2x1bW5zLTEpO2UucHVzaChNYXRoLnNxcnQobykpfXJldHVybiBlfSh0aGlzKTtlbHNlIGlmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pL2Vbcl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKHZvaWQgMD09PXIpcj1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5jb2x1bW5zO3IrKyl7bGV0IG89MDtmb3IobGV0IGU9MDtlPHQucm93cztlKyspbys9TWF0aC5wb3codC5nZXQoZSxyKSwyKS8odC5yb3dzLTEpO2UucHVzaChNYXRoLnNxcnQobykpfXJldHVybiBlfSh0aGlzKTtlbHNlIGlmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pL2Vbb10pfSh0aGlzLHIpLHRoaXM7Y2FzZSB2b2lkIDA6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5zaXplLTE7bGV0IHI9MDtmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspZm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKXIrPU1hdGgucG93KHQuZ2V0KG4sbyksMikvZTtyZXR1cm4gTWF0aC5zcXJ0KHIpfSh0aGlzKTtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0LnNldChyLG8sdC5nZXQocixvKS9lKX0odGhpcyxyKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX10b1N0cmluZyh0KXtyZXR1cm4gamUodGhpcyx0KX19ZnVuY3Rpb24gUGUodCxlKXtyZXR1cm4gdC1lfVZlLnByb3RvdHlwZS5rbGFzcz0iTWF0cml4IiwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmKFZlLnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1mdW5jdGlvbigpe3JldHVybiBqZSh0aGlzKX0pLFZlLnJhbmRvbT1WZS5yYW5kLFZlLnJhbmRvbUludD1WZS5yYW5kSW50LFZlLmRpYWdvbmFsPVZlLmRpYWcsVmUucHJvdG90eXBlLmRpYWdvbmFsPVZlLnByb3RvdHlwZS5kaWFnLFZlLmlkZW50aXR5PVZlLmV5ZSxWZS5wcm90b3R5cGUubmVnYXRlPVZlLnByb3RvdHlwZS5uZWcsVmUucHJvdG90eXBlLnRlbnNvclByb2R1Y3Q9VmUucHJvdG90eXBlLmtyb25lY2tlclByb2R1Y3Q7Y2xhc3MgcWUgZXh0ZW5kcyBWZXtjb25zdHJ1Y3Rvcih0LGUpe2lmKHN1cGVyKCkscWUuaXNNYXRyaXgodCkpcmV0dXJuIHQuY2xvbmUoKTtpZihOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0Pj0wKXtpZih0aGlzLmRhdGE9W10sIShOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj0wKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJuQ29sdW1ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2ZvcihsZXQgcj0wO3I8dDtyKyspdGhpcy5kYXRhLnB1c2gobmV3IEZsb2F0NjRBcnJheShlKSl9ZWxzZXtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIGFuIGFycmF5Iik7e2NvbnN0IHI9dDtpZigibnVtYmVyIiE9dHlwZW9mKGU9KHQ9ci5sZW5ndGgpP3JbMF0ubGVuZ3RoOjApKXRocm93IG5ldyBUeXBlRXJyb3IoIkRhdGEgbXVzdCBiZSBhIDJEIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQiKTt0aGlzLmRhdGE9W107Zm9yKGxldCBvPTA7bzx0O28rKyl7aWYocltvXS5sZW5ndGghPT1lKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmNvbnNpc3RlbnQgYXJyYXkgZGltZW5zaW9ucyIpO3RoaXMuZGF0YS5wdXNoKEZsb2F0NjRBcnJheS5mcm9tKHJbb10pKX19fXRoaXMucm93cz10LHRoaXMuY29sdW1ucz1lfXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX1yZW1vdmVSb3codCl7cmV0dXJuIEFlKHRoaXMsdCksdGhpcy5kYXRhLnNwbGljZSh0LDEpLHRoaXMucm93cy09MSx0aGlzfWFkZFJvdyh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5yb3dzKSxBZSh0aGlzLHQsITApLGU9RmxvYXQ2NEFycmF5LmZyb20oUmUodGhpcyxlKSksdGhpcy5kYXRhLnNwbGljZSh0LDAsZSksdGhpcy5yb3dzKz0xLHRoaXN9cmVtb3ZlQ29sdW1uKHQpe0NlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXtjb25zdCByPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zLTEpO2ZvcihsZXQgbz0wO288dDtvKyspcltvXT10aGlzLmRhdGFbZV1bb107Zm9yKGxldCBvPXQrMTtvPHRoaXMuY29sdW1ucztvKyspcltvLTFdPXRoaXMuZGF0YVtlXVtvXTt0aGlzLmRhdGFbZV09cn1yZXR1cm4gdGhpcy5jb2x1bW5zLT0xLHRoaXN9YWRkQ29sdW1uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMuY29sdW1ucyksQ2UodGhpcyx0LCEwKSxlPUllKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtjb25zdCBvPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zKzEpO2xldCBuPTA7Zm9yKDtuPHQ7bisrKW9bbl09dGhpcy5kYXRhW3JdW25dO2ZvcihvW24rK109ZVtyXTtuPHRoaXMuY29sdW1ucysxO24rKylvW25dPXRoaXMuZGF0YVtyXVtuLTFdO3RoaXMuZGF0YVtyXT1vfXJldHVybiB0aGlzLmNvbHVtbnMrPTEsdGhpc319IWZ1bmN0aW9uKHQsZSl7dC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmFkZFModCk6dGhpcy5hZGRNKHQpfSx0LnByb3RvdHlwZS5hZGRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmFkZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3QuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmFkZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5hZGQocil9LHQucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5zdWJTKHQpOnRoaXMuc3ViTSh0KX0sdC5wcm90b3R5cGUuc3ViUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zdWJNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5zdWI9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuc3ViKHIpfSx0LnByb3RvdHlwZS5zdWJ0cmFjdD10LnByb3RvdHlwZS5zdWIsdC5wcm90b3R5cGUuc3VidHJhY3RTPXQucHJvdG90eXBlLnN1YlMsdC5wcm90b3R5cGUuc3VidHJhY3RNPXQucHJvdG90eXBlLnN1Yk0sdC5zdWJ0cmFjdD10LnN1Yix0LnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubXVsUyh0KTp0aGlzLm11bE0odCl9LHQucHJvdG90eXBlLm11bFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubXVsTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubXVsPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm11bChyKX0sdC5wcm90b3R5cGUubXVsdGlwbHk9dC5wcm90b3R5cGUubXVsLHQucHJvdG90eXBlLm11bHRpcGx5Uz10LnByb3RvdHlwZS5tdWxTLHQucHJvdG90eXBlLm11bHRpcGx5TT10LnByb3RvdHlwZS5tdWxNLHQubXVsdGlwbHk9dC5tdWwsdC5wcm90b3R5cGUuZGl2PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmRpdlModCk6dGhpcy5kaXZNKHQpfSx0LnByb3RvdHlwZS5kaXZTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmRpdk09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3QuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmRpdj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5kaXYocil9LHQucHJvdG90eXBlLmRpdmlkZT10LnByb3RvdHlwZS5kaXYsdC5wcm90b3R5cGUuZGl2aWRlUz10LnByb3RvdHlwZS5kaXZTLHQucHJvdG90eXBlLmRpdmlkZU09dC5wcm90b3R5cGUuZGl2TSx0LmRpdmlkZT10LmRpdix0LnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubW9kUyh0KTp0aGlzLm1vZE0odCl9LHQucHJvdG90eXBlLm1vZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSV0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubW9kTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikldC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubW9kPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm1vZChyKX0sdC5wcm90b3R5cGUubW9kdWx1cz10LnByb3RvdHlwZS5tb2QsdC5wcm90b3R5cGUubW9kdWx1c1M9dC5wcm90b3R5cGUubW9kUyx0LnByb3RvdHlwZS5tb2R1bHVzTT10LnByb3RvdHlwZS5tb2RNLHQubW9kdWx1cz10Lm1vZCx0LnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuYW5kUyh0KTp0aGlzLmFuZE0odCl9LHQucHJvdG90eXBlLmFuZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSZ0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuYW5kTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikmdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuYW5kPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmFuZChyKX0sdC5wcm90b3R5cGUub3I9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMub3JTKHQpOnRoaXMub3JNKHQpfSx0LnByb3RvdHlwZS5vclM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKXx0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUub3JNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKXx0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5vcj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5vcihyKX0sdC5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnhvclModCk6dGhpcy54b3JNKHQpfSx0LnByb3RvdHlwZS54b3JTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciledCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnhvck09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpXnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lnhvcj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS54b3Iocil9LHQucHJvdG90eXBlLmxlZnRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5sZWZ0U2hpZnRTKHQpOnRoaXMubGVmdFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPDx0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubGVmdFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik8PHQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmxlZnRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5sZWZ0U2hpZnQocil9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdFModCk6dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0KHIpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnJpZ2h0U2hpZnRTKHQpOnRoaXMucmlnaHRTaGlmdE0odCl9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+Pj50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucmlnaHRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj4+dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQucmlnaHRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5yaWdodFNoaWZ0KHIpfSx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnQ9dC5wcm90b3R5cGUucmlnaHRTaGlmdCx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRTPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRTLHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdE09dC5wcm90b3R5cGUucmlnaHRTaGlmdE0sdC56ZXJvRmlsbFJpZ2h0U2hpZnQ9dC5yaWdodFNoaWZ0LHQucHJvdG90eXBlLm5vdD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLH50aGlzLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5ub3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLm5vdCgpfSx0LnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFicyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWJzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hYnMoKX0sdC5wcm90b3R5cGUuYWNvcz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWNvcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWNvcygpfSx0LnByb3RvdHlwZS5hY29zaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3NoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hY29zaCgpfSx0LnByb3RvdHlwZS5hc2luPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hc2luKCl9LHQucHJvdG90eXBlLmFzaW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFzaW5oKCl9LHQucHJvdG90eXBlLmF0YW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmF0YW4oKX0sdC5wcm90b3R5cGUuYXRhbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hdGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXRhbmgoKX0sdC5wcm90b3R5cGUuY2JydD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2JydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2JydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2JydCgpfSx0LnByb3RvdHlwZS5jZWlsPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jZWlsKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jZWlsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jZWlsKCl9LHQucHJvdG90eXBlLmNsejMyPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jbHozMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2x6MzI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNsejMyKCl9LHQucHJvdG90eXBlLmNvcz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNvcygpfSx0LnByb3RvdHlwZS5jb3NoPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3NoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jb3NoKCl9LHQucHJvdG90eXBlLmV4cD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5leHA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmV4cCgpfSx0LnByb3RvdHlwZS5leHBtMT1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwbTEodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmV4cG0xPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5leHBtMSgpfSx0LnByb3RvdHlwZS5mbG9vcj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZmxvb3IodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZsb29yPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5mbG9vcigpfSx0LnByb3RvdHlwZS5mcm91bmQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZyb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5mcm91bmQoKX0sdC5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2codGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nKCl9LHQucHJvdG90eXBlLmxvZzFwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxcCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzFwKCl9LHQucHJvdG90eXBlLmxvZzEwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxMCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMTA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzEwKCl9LHQucHJvdG90eXBlLmxvZzI9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzIoKX0sdC5wcm90b3R5cGUucm91bmQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkucm91bmQoKX0sdC5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2lnbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2lnbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2lnbigpfSx0LnByb3RvdHlwZS5zaW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaW4oKX0sdC5wcm90b3R5cGUuc2luaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2luaCgpfSx0LnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zcXJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zcXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zcXJ0KCl9LHQucHJvdG90eXBlLnRhbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRhbigpfSx0LnByb3RvdHlwZS50YW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50YW5oKCl9LHQucHJvdG90eXBlLnRydW5jPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50cnVuYyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudHJ1bmM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRydW5jKCl9LHQucG93PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnBvdyhyKX0sdC5wcm90b3R5cGUucG93PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnBvd1ModCk6dGhpcy5wb3dNKHQpfSx0LnByb3RvdHlwZS5wb3dTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLE1hdGgucG93KHRoaXMuZ2V0KGUsciksdCkpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5wb3dNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsTWF0aC5wb3codGhpcy5nZXQoZSxyKSx0LmdldChlLHIpKSk7cmV0dXJuIHRoaXN9fShWZSxxZSk7Y2xhc3MgJGUgZXh0ZW5kcyBWZXtjb25zdHJ1Y3Rvcih0LGUscil7c3VwZXIoKSx0aGlzLm1hdHJpeD10LHRoaXMucm93cz1lLHRoaXMuY29sdW1ucz1yfX1jbGFzcyBEZSBleHRlbmRzICRle2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsdC5jb2x1bW5zLHQucm93cyl9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KGUsdCxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQoZSx0KX19Y2xhc3MgVWUgZXh0ZW5kcyBWZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGF0YT10LHRoaXMucm93cz10Lmxlbmd0aCx0aGlzLmNvbHVtbnM9dFswXS5sZW5ndGh9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdPXIsdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdfX1mdW5jdGlvbiBMZSh0LGUpe2xldCByPTA7cmV0dXJuIE1hdGguYWJzKHQpPk1hdGguYWJzKGUpPyhyPWUvdCxNYXRoLmFicyh0KSpNYXRoLnNxcnQoMStyKnIpKTowIT09ZT8ocj10L2UsTWF0aC5hYnMoZSkqTWF0aC5zcXJ0KDErcipyKSk6MH1jbGFzcyBCZXtjb25zdHJ1Y3Rvcih0LGU9e30pe2lmKCh0PVVlLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgcj10LnJvd3Msbz10LmNvbHVtbnM7Y29uc3R7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6bj0hMCxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6cz0hMCxhdXRvVHJhbnNwb3NlOmk9ITF9PWU7bGV0IHUsYT1Cb29sZWFuKG4pLGg9Qm9vbGVhbihzKSxsPSExO2lmKHI8bylpZihpKXt1PXQudHJhbnNwb3NlKCkscj11LnJvd3Msbz11LmNvbHVtbnMsbD0hMDtsZXQgZT1hO2E9aCxoPWV9ZWxzZSB1PXQuY2xvbmUoKSxjb25zb2xlLndhcm4oIkNvbXB1dGluZyBTVkQgb24gYSBtYXRyaXggd2l0aCBtb3JlIGNvbHVtbnMgdGhhbiByb3dzLiBDb25zaWRlciBlbmFibGluZyBhdXRvVHJhbnNwb3NlIik7ZWxzZSB1PXQuY2xvbmUoKTtsZXQgYz1NYXRoLm1pbihyLG8pLGY9TWF0aC5taW4ocisxLG8pLG09bmV3IEZsb2F0NjRBcnJheShmKSxnPW5ldyBxZShyLGMpLHA9bmV3IHFlKG8sbyksdz1uZXcgRmxvYXQ2NEFycmF5KG8pLGQ9bmV3IEZsb2F0NjRBcnJheShyKSxiPW5ldyBGbG9hdDY0QXJyYXkoZik7Zm9yKGxldCB0PTA7dDxmO3QrKyliW3RdPXQ7bGV0IHk9TWF0aC5taW4oci0xLG8pLHY9TWF0aC5tYXgoMCxNYXRoLm1pbihvLTIscikpLE09TWF0aC5tYXgoeSx2KTtmb3IobGV0IHQ9MDt0PE07dCsrKXtpZih0PHkpe21bdF09MDtmb3IobGV0IGU9dDtlPHI7ZSsrKW1bdF09TGUobVt0XSx1LmdldChlLHQpKTtpZigwIT09bVt0XSl7dS5nZXQodCx0KTwwJiYobVt0XT0tbVt0XSk7Zm9yKGxldCBlPXQ7ZTxyO2UrKyl1LnNldChlLHQsdS5nZXQoZSx0KS9tW3RdKTt1LnNldCh0LHQsdS5nZXQodCx0KSsxKX1tW3RdPS1tW3RdfWZvcihsZXQgZT10KzE7ZTxvO2UrKyl7aWYodDx5JiYwIT09bVt0XSl7bGV0IG89MDtmb3IobGV0IG49dDtuPHI7bisrKW8rPXUuZ2V0KG4sdCkqdS5nZXQobixlKTtvPS1vL3UuZ2V0KHQsdCk7Zm9yKGxldCBuPXQ7bjxyO24rKyl1LnNldChuLGUsdS5nZXQobixlKStvKnUuZ2V0KG4sdCkpfXdbZV09dS5nZXQodCxlKX1pZihhJiZ0PHkpZm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsdS5nZXQoZSx0KSk7aWYodDx2KXt3W3RdPTA7Zm9yKGxldCBlPXQrMTtlPG87ZSsrKXdbdF09TGUod1t0XSx3W2VdKTtpZigwIT09d1t0XSl7d1t0KzFdPDAmJih3W3RdPTAtd1t0XSk7Zm9yKGxldCBlPXQrMTtlPG87ZSsrKXdbZV0vPXdbdF07d1t0KzFdKz0xfWlmKHdbdF09LXdbdF0sdCsxPHImJjAhPT13W3RdKXtmb3IobGV0IGU9dCsxO2U8cjtlKyspZFtlXT0wO2ZvcihsZXQgZT10KzE7ZTxyO2UrKylmb3IobGV0IHI9dCsxO3I8bztyKyspZFtlXSs9d1tyXSp1LmdldChlLHIpO2ZvcihsZXQgZT10KzE7ZTxvO2UrKyl7bGV0IG89LXdbZV0vd1t0KzFdO2ZvcihsZXQgbj10KzE7bjxyO24rKyl1LnNldChuLGUsdS5nZXQobixlKStvKmRbbl0pfX1pZihoKWZvcihsZXQgZT10KzE7ZTxvO2UrKylwLnNldChlLHQsd1tlXSl9fWxldCB4PU1hdGgubWluKG8scisxKTtpZih5PG8mJihtW3ldPXUuZ2V0KHkseSkpLHI8eCYmKG1beC0xXT0wKSx2KzE8eCYmKHdbdl09dS5nZXQodix4LTEpKSx3W3gtMV09MCxhKXtmb3IobGV0IHQ9eTt0PGM7dCsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9Zm9yKGxldCB0PXktMTt0Pj0wO3QtLSlpZigwIT09bVt0XSl7Zm9yKGxldCBlPXQrMTtlPGM7ZSsrKXtsZXQgbz0wO2ZvcihsZXQgbj10O248cjtuKyspbys9Zy5nZXQobix0KSpnLmdldChuLGUpO289LW8vZy5nZXQodCx0KTtmb3IobGV0IG49dDtuPHI7bisrKWcuc2V0KG4sZSxnLmdldChuLGUpK28qZy5nZXQobix0KSl9Zm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsLWcuZ2V0KGUsdCkpO2cuc2V0KHQsdCwxK2cuZ2V0KHQsdCkpO2ZvcihsZXQgZT0wO2U8dC0xO2UrKylnLnNldChlLHQsMCl9ZWxzZXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9fWlmKGgpZm9yKGxldCB0PW8tMTt0Pj0wO3QtLSl7aWYodDx2JiYwIT09d1t0XSlmb3IobGV0IGU9dCsxO2U8bztlKyspe2xldCByPTA7Zm9yKGxldCBuPXQrMTtuPG87bisrKXIrPXAuZ2V0KG4sdCkqcC5nZXQobixlKTtyPS1yL3AuZ2V0KHQrMSx0KTtmb3IobGV0IG49dCsxO248bztuKyspcC5zZXQobixlLHAuZ2V0KG4sZSkrcipwLmdldChuLHQpKX1mb3IobGV0IGU9MDtlPG87ZSsrKXAuc2V0KGUsdCwwKTtwLnNldCh0LHQsMSl9bGV0IEU9eC0xLFM9TnVtYmVyLkVQU0lMT047Zm9yKDt4PjA7KXtsZXQgdCxlO2Zvcih0PXgtMjt0Pj0tMSYmLTEhPT10O3QtLSl7Y29uc3QgZT1OdW1iZXIuTUlOX1ZBTFVFK1MqTWF0aC5hYnMobVt0XStNYXRoLmFicyhtW3QrMV0pKTtpZihNYXRoLmFicyh3W3RdKTw9ZXx8TnVtYmVyLmlzTmFOKHdbdF0pKXt3W3RdPTA7YnJlYWt9fWlmKHQ9PT14LTIpZT00O2Vsc2V7bGV0IHI7Zm9yKHI9eC0xO3I+PXQmJnIhPT10O3ItLSl7bGV0IGU9KHIhPT14P01hdGguYWJzKHdbcl0pOjApKyhyIT09dCsxP01hdGguYWJzKHdbci0xXSk6MCk7aWYoTWF0aC5hYnMobVtyXSk8PVMqZSl7bVtyXT0wO2JyZWFrfX1yPT09dD9lPTM6cj09PXgtMT9lPTE6KGU9Mix0PXIpfXN3aXRjaCh0KyssZSl7Y2FzZSAxOntsZXQgZT13W3gtMl07d1t4LTJdPTA7Zm9yKGxldCByPXgtMjtyPj10O3ItLSl7bGV0IG49TGUobVtyXSxlKSxzPW1bcl0vbixpPWUvbjtpZihtW3JdPW4sciE9PXQmJihlPS1pKndbci0xXSx3W3ItMV09cyp3W3ItMV0pLGgpZm9yKGxldCB0PTA7dDxvO3QrKyluPXMqcC5nZXQodCxyKStpKnAuZ2V0KHQseC0xKSxwLnNldCh0LHgtMSwtaSpwLmdldCh0LHIpK3MqcC5nZXQodCx4LTEpKSxwLnNldCh0LHIsbil9YnJlYWt9Y2FzZSAyOntsZXQgZT13W3QtMV07d1t0LTFdPTA7Zm9yKGxldCBvPXQ7bzx4O28rKyl7bGV0IG49TGUobVtvXSxlKSxzPW1bb10vbixpPWUvbjtpZihtW29dPW4sZT0taSp3W29dLHdbb109cyp3W29dLGEpZm9yKGxldCBlPTA7ZTxyO2UrKyluPXMqZy5nZXQoZSxvKStpKmcuZ2V0KGUsdC0xKSxnLnNldChlLHQtMSwtaSpnLmdldChlLG8pK3MqZy5nZXQoZSx0LTEpKSxnLnNldChlLG8sbil9YnJlYWt9Y2FzZSAzOntjb25zdCBlPU1hdGgubWF4KE1hdGguYWJzKG1beC0xXSksTWF0aC5hYnMobVt4LTJdKSxNYXRoLmFicyh3W3gtMl0pLE1hdGguYWJzKG1bdF0pLE1hdGguYWJzKHdbdF0pKSxuPW1beC0xXS9lLHM9bVt4LTJdL2UsaT13W3gtMl0vZSx1PW1bdF0vZSxsPXdbdF0vZSxjPSgocytuKSoocy1uKStpKmkpLzIsZj1uKmkqKG4qaSk7bGV0IGQ9MDswPT09YyYmMD09PWZ8fChkPWM8MD8wLU1hdGguc3FydChjKmMrZik6TWF0aC5zcXJ0KGMqYytmKSxkPWYvKGMrZCkpO2xldCBiPSh1K24pKih1LW4pK2QseT11Kmw7Zm9yKGxldCBlPXQ7ZTx4LTE7ZSsrKXtsZXQgbj1MZShiLHkpOzA9PT1uJiYobj1OdW1iZXIuTUlOX1ZBTFVFKTtsZXQgcz1iL24saT15L247aWYoZSE9PXQmJih3W2UtMV09biksYj1zKm1bZV0raSp3W2VdLHdbZV09cyp3W2VdLWkqbVtlXSx5PWkqbVtlKzFdLG1bZSsxXT1zKm1bZSsxXSxoKWZvcihsZXQgdD0wO3Q8bzt0Kyspbj1zKnAuZ2V0KHQsZSkraSpwLmdldCh0LGUrMSkscC5zZXQodCxlKzEsLWkqcC5nZXQodCxlKStzKnAuZ2V0KHQsZSsxKSkscC5zZXQodCxlLG4pO2lmKG49TGUoYix5KSwwPT09biYmKG49TnVtYmVyLk1JTl9WQUxVRSkscz1iL24saT15L24sbVtlXT1uLGI9cyp3W2VdK2kqbVtlKzFdLG1bZSsxXT0taSp3W2VdK3MqbVtlKzFdLHk9aSp3W2UrMV0sd1tlKzFdPXMqd1tlKzFdLGEmJmU8ci0xKWZvcihsZXQgdD0wO3Q8cjt0Kyspbj1zKmcuZ2V0KHQsZSkraSpnLmdldCh0LGUrMSksZy5zZXQodCxlKzEsLWkqZy5nZXQodCxlKStzKmcuZ2V0KHQsZSsxKSksZy5zZXQodCxlLG4pfXdbeC0yXT1iO2JyZWFrfWNhc2UgNDppZihtW3RdPD0wJiYobVt0XT1tW3RdPDA/LW1bdF06MCxoKSlmb3IobGV0IGU9MDtlPD1FO2UrKylwLnNldChlLHQsLXAuZ2V0KGUsdCkpO2Zvcig7dDxFJiYhKG1bdF0+PW1bdCsxXSk7KXtsZXQgZT1tW3RdO2lmKG1bdF09bVt0KzFdLG1bdCsxXT1lLGgmJnQ8by0xKWZvcihsZXQgcj0wO3I8bztyKyspZT1wLmdldChyLHQrMSkscC5zZXQocix0KzEscC5nZXQocix0KSkscC5zZXQocix0LGUpO2lmKGEmJnQ8ci0xKWZvcihsZXQgbz0wO288cjtvKyspZT1nLmdldChvLHQrMSksZy5zZXQobyx0KzEsZy5nZXQobyx0KSksZy5zZXQobyx0LGUpO3QrK314LS19fWlmKGwpe2xldCB0PXA7cD1nLGc9dH10aGlzLm09cix0aGlzLm49byx0aGlzLnM9bSx0aGlzLlU9Zyx0aGlzLlY9cH1zb2x2ZSh0KXtsZXQgZT10LHI9dGhpcy50aHJlc2hvbGQsbz10aGlzLnMubGVuZ3RoLG49cWUuemVyb3MobyxvKTtmb3IobGV0IHQ9MDt0PG87dCsrKU1hdGguYWJzKHRoaXMuc1t0XSk8PXI/bi5zZXQodCx0LDApOm4uc2V0KHQsdCwxL3RoaXMuc1t0XSk7bGV0IHM9dGhpcy5VLGk9dGhpcy5yaWdodFNpbmd1bGFyVmVjdG9ycyx1PWkubW11bChuKSxhPWkucm93cyxoPXMucm93cyxsPXFlLnplcm9zKGEsaCk7Zm9yKGxldCB0PTA7dDxhO3QrKylmb3IobGV0IGU9MDtlPGg7ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248bztuKyspcis9dS5nZXQodCxuKSpzLmdldChlLG4pO2wuc2V0KHQsZSxyKX1yZXR1cm4gbC5tbXVsKGUpfXNvbHZlRm9yRGlhZ29uYWwodCl7cmV0dXJuIHRoaXMuc29sdmUocWUuZGlhZyh0KSl9aW52ZXJzZSgpe2xldCB0PXRoaXMuVixlPXRoaXMudGhyZXNob2xkLHI9dC5yb3dzLG89dC5jb2x1bW5zLG49bmV3IHFlKHIsdGhpcy5zLmxlbmd0aCk7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG87cisrKU1hdGguYWJzKHRoaXMuc1tyXSk+ZSYmbi5zZXQocyxyLHQuZ2V0KHMscikvdGhpcy5zW3JdKTtsZXQgcz10aGlzLlUsaT1zLnJvd3MsdT1zLmNvbHVtbnMsYT1uZXcgcWUocixpKTtmb3IobGV0IHQ9MDt0PHI7dCsrKWZvcihsZXQgZT0wO2U8aTtlKyspe2xldCByPTA7Zm9yKGxldCBvPTA7bzx1O28rKylyKz1uLmdldCh0LG8pKnMuZ2V0KGUsbyk7YS5zZXQodCxlLHIpfXJldHVybiBhfWdldCBjb25kaXRpb24oKXtyZXR1cm4gdGhpcy5zWzBdL3RoaXMuc1tNYXRoLm1pbih0aGlzLm0sdGhpcy5uKS0xXX1nZXQgbm9ybTIoKXtyZXR1cm4gdGhpcy5zWzBdfWdldCByYW5rKCl7bGV0IHQ9TWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdKk51bWJlci5FUFNJTE9OLGU9MCxyPXRoaXMucztmb3IobGV0IG89MCxuPXIubGVuZ3RoO288bjtvKyspcltvXT50JiZlKys7cmV0dXJuIGV9Z2V0IGRpYWdvbmFsKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5zKX1nZXQgdGhyZXNob2xkKCl7cmV0dXJuIE51bWJlci5FUFNJTE9OLzIqTWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdfWdldCBsZWZ0U2luZ3VsYXJWZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXQgcmlnaHRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe3JldHVybiBxZS5kaWFnKHRoaXMucyl9fWNsYXNzIEdle2NvbnN0cnVjdG9yKHQsZT17fSl7Y29uc3R7YXNzdW1lU3ltbWV0cmljOnI9ITF9PWU7aWYoISh0PVVlLmNoZWNrTWF0cml4KHQpKS5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGlzIG5vdCBhIHNxdWFyZSBtYXRyaXgiKTtpZih0LmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIG5vbi1lbXB0eSIpO2xldCBvLG4scz10LmNvbHVtbnMsaT1uZXcgcWUocyxzKSx1PW5ldyBGbG9hdDY0QXJyYXkocyksYT1uZXcgRmxvYXQ2NEFycmF5KHMpLGg9dCxsPSExO2lmKGw9ISFyfHx0LmlzU3ltbWV0cmljKCksbCl7Zm9yKG89MDtvPHM7bysrKWZvcihuPTA7bjxzO24rKylpLnNldChvLG4saC5nZXQobyxuKSk7IWZ1bmN0aW9uKHQsZSxyLG8pe2xldCBuLHMsaSx1LGEsaCxsLGM7Zm9yKGE9MDthPHQ7YSsrKXJbYV09by5nZXQodC0xLGEpO2Zvcih1PXQtMTt1PjA7dS0tKXtmb3IoYz0wLGk9MCxoPTA7aDx1O2grKyljKz1NYXRoLmFicyhyW2hdKTtpZigwPT09Yylmb3IoZVt1XT1yW3UtMV0sYT0wO2E8dTthKyspclthXT1vLmdldCh1LTEsYSksby5zZXQodSxhLDApLG8uc2V0KGEsdSwwKTtlbHNle2ZvcihoPTA7aDx1O2grKylyW2hdLz1jLGkrPXJbaF0qcltoXTtmb3Iobj1yW3UtMV0scz1NYXRoLnNxcnQoaSksbj4wJiYocz0tcyksZVt1XT1jKnMsaS09bipzLHJbdS0xXT1uLXMsYT0wO2E8dTthKyspZVthXT0wO2ZvcihhPTA7YTx1O2ErKyl7Zm9yKG49clthXSxvLnNldChhLHUsbikscz1lW2FdK28uZ2V0KGEsYSkqbixoPWErMTtoPD11LTE7aCsrKXMrPW8uZ2V0KGgsYSkqcltoXSxlW2hdKz1vLmdldChoLGEpKm47ZVthXT1zfWZvcihuPTAsYT0wO2E8dTthKyspZVthXS89aSxuKz1lW2FdKnJbYV07Zm9yKGw9bi8oaStpKSxhPTA7YTx1O2ErKyllW2FdLT1sKnJbYV07Zm9yKGE9MDthPHU7YSsrKXtmb3Iobj1yW2FdLHM9ZVthXSxoPWE7aDw9dS0xO2grKylvLnNldChoLGEsby5nZXQoaCxhKS0obiplW2hdK3MqcltoXSkpO3JbYV09by5nZXQodS0xLGEpLG8uc2V0KHUsYSwwKX19clt1XT1pfWZvcih1PTA7dTx0LTE7dSsrKXtpZihvLnNldCh0LTEsdSxvLmdldCh1LHUpKSxvLnNldCh1LHUsMSksaT1yW3UrMV0sMCE9PWkpe2ZvcihoPTA7aDw9dTtoKyspcltoXT1vLmdldChoLHUrMSkvaTtmb3IoYT0wO2E8PXU7YSsrKXtmb3Iocz0wLGg9MDtoPD11O2grKylzKz1vLmdldChoLHUrMSkqby5nZXQoaCxhKTtmb3IoaD0wO2g8PXU7aCsrKW8uc2V0KGgsYSxvLmdldChoLGEpLXMqcltoXSl9fWZvcihoPTA7aDw9dTtoKyspby5zZXQoaCx1KzEsMCl9Zm9yKGE9MDthPHQ7YSsrKXJbYV09by5nZXQodC0xLGEpLG8uc2V0KHQtMSxhLDApO28uc2V0KHQtMSx0LTEsMSksZVswXT0wfShzLGEsdSxpKSxmdW5jdGlvbih0LGUscixvKXtsZXQgbixzLGksdSxhLGgsbCxjLGYsbSxnLHAsdyxkLGIseTtmb3IoaT0xO2k8dDtpKyspZVtpLTFdPWVbaV07ZVt0LTFdPTA7bGV0IHY9MCxNPTAseD1OdW1iZXIuRVBTSUxPTjtmb3IoaD0wO2g8dDtoKyspe2ZvcihNPU1hdGgubWF4KE0sTWF0aC5hYnMocltoXSkrTWF0aC5hYnMoZVtoXSkpLGw9aDtsPHQmJiEoTWF0aC5hYnMoZVtsXSk8PXgqTSk7KWwrKztpZihsPmgpZG97Zm9yKG49cltoXSxjPShyW2grMV0tbikvKDIqZVtoXSksZj1MZShjLDEpLGM8MCYmKGY9LWYpLHJbaF09ZVtoXS8oYytmKSxyW2grMV09ZVtoXSooYytmKSxtPXJbaCsxXSxzPW4tcltoXSxpPWgrMjtpPHQ7aSsrKXJbaV0tPXM7Zm9yKHYrPXMsYz1yW2xdLGc9MSxwPWcsdz1nLGQ9ZVtoKzFdLGI9MCx5PTAsaT1sLTE7aT49aDtpLS0pZm9yKHc9cCxwPWcseT1iLG49ZyplW2ldLHM9ZypjLGY9TGUoYyxlW2ldKSxlW2krMV09YipmLGI9ZVtpXS9mLGc9Yy9mLGM9ZypyW2ldLWIqbixyW2krMV09cytiKihnKm4rYipyW2ldKSxhPTA7YTx0O2ErKylzPW8uZ2V0KGEsaSsxKSxvLnNldChhLGkrMSxiKm8uZ2V0KGEsaSkrZypzKSxvLnNldChhLGksZypvLmdldChhLGkpLWIqcyk7Yz0tYip5KncqZCplW2hdL20sZVtoXT1iKmMscltoXT1nKmN9d2hpbGUoTWF0aC5hYnMoZVtoXSk+eCpNKTtyW2hdPXJbaF0rdixlW2hdPTB9Zm9yKGk9MDtpPHQtMTtpKyspe2ZvcihhPWksYz1yW2ldLHU9aSsxO3U8dDt1Kyspclt1XTxjJiYoYT11LGM9clt1XSk7aWYoYSE9PWkpZm9yKHJbYV09cltpXSxyW2ldPWMsdT0wO3U8dDt1KyspYz1vLmdldCh1LGkpLG8uc2V0KHUsaSxvLmdldCh1LGEpKSxvLnNldCh1LGEsYyl9fShzLGEsdSxpKX1lbHNle2xldCB0PW5ldyBxZShzLHMpLGU9bmV3IEZsb2F0NjRBcnJheShzKTtmb3Iobj0wO248cztuKyspZm9yKG89MDtvPHM7bysrKXQuc2V0KG8sbixoLmdldChvLG4pKTshZnVuY3Rpb24odCxlLHIsbyl7bGV0IG4scyxpLHUsYSxoLGwsYz0wLGY9dC0xO2ZvcihoPWMrMTtoPD1mLTE7aCsrKXtmb3IobD0wLHU9aDt1PD1mO3UrKylsKz1NYXRoLmFicyhlLmdldCh1LGgtMSkpO2lmKDAhPT1sKXtmb3IoaT0wLHU9Zjt1Pj1oO3UtLSlyW3VdPWUuZ2V0KHUsaC0xKS9sLGkrPXJbdV0qclt1XTtmb3Iocz1NYXRoLnNxcnQoaSkscltoXT4wJiYocz0tcyksaS09cltoXSpzLHJbaF09cltoXS1zLGE9aDthPHQ7YSsrKXtmb3Iobj0wLHU9Zjt1Pj1oO3UtLSluKz1yW3VdKmUuZ2V0KHUsYSk7Zm9yKG4vPWksdT1oO3U8PWY7dSsrKWUuc2V0KHUsYSxlLmdldCh1LGEpLW4qclt1XSl9Zm9yKHU9MDt1PD1mO3UrKyl7Zm9yKG49MCxhPWY7YT49aDthLS0pbis9clthXSplLmdldCh1LGEpO2ZvcihuLz1pLGE9aDthPD1mO2ErKyllLnNldCh1LGEsZS5nZXQodSxhKS1uKnJbYV0pfXJbaF09bCpyW2hdLGUuc2V0KGgsaC0xLGwqcyl9fWZvcih1PTA7dTx0O3UrKylmb3IoYT0wO2E8dDthKyspby5zZXQodSxhLHU9PT1hPzE6MCk7Zm9yKGg9Zi0xO2g+PWMrMTtoLS0paWYoMCE9PWUuZ2V0KGgsaC0xKSl7Zm9yKHU9aCsxO3U8PWY7dSsrKXJbdV09ZS5nZXQodSxoLTEpO2ZvcihhPWg7YTw9ZjthKyspe2ZvcihzPTAsdT1oO3U8PWY7dSsrKXMrPXJbdV0qby5nZXQodSxhKTtmb3Iocz1zL3JbaF0vZS5nZXQoaCxoLTEpLHU9aDt1PD1mO3UrKylvLnNldCh1LGEsby5nZXQodSxhKStzKnJbdV0pfX19KHMsdCxlLGkpLGZ1bmN0aW9uKHQsZSxyLG8sbil7bGV0IHMsaSx1LGEsaCxsLGMsZixtLGcscCx3LGQsYix5LHY9dC0xLE09MCx4PXQtMSxFPU51bWJlci5FUFNJTE9OLFM9MCxqPTAsXz0wLEE9MCxDPTAsUj0wLEk9MCxrPTA7Zm9yKHM9MDtzPHQ7cysrKWZvcigoczxNfHxzPngpJiYocltzXT1uLmdldChzLHMpLGVbc109MCksaT1NYXRoLm1heChzLTEsMCk7aTx0O2krKylqKz1NYXRoLmFicyhuLmdldChzLGkpKTtmb3IoO3Y+PU07KXtmb3IoYT12O2E+TSYmKFI9TWF0aC5hYnMobi5nZXQoYS0xLGEtMSkpK01hdGguYWJzKG4uZ2V0KGEsYSkpLDA9PT1SJiYoUj1qKSwhKE1hdGguYWJzKG4uZ2V0KGEsYS0xKSk8RSpSKSk7KWEtLTtpZihhPT09diluLnNldCh2LHYsbi5nZXQodix2KStTKSxyW3ZdPW4uZ2V0KHYsdiksZVt2XT0wLHYtLSxrPTA7ZWxzZSBpZihhPT09di0xKXtpZihjPW4uZ2V0KHYsdi0xKSpuLmdldCh2LTEsdiksXz0obi5nZXQodi0xLHYtMSktbi5nZXQodix2KSkvMixBPV8qXytjLEk9TWF0aC5zcXJ0KE1hdGguYWJzKEEpKSxuLnNldCh2LHYsbi5nZXQodix2KStTKSxuLnNldCh2LTEsdi0xLG4uZ2V0KHYtMSx2LTEpK1MpLGY9bi5nZXQodix2KSxBPj0wKXtmb3IoST1fPj0wP18rSTpfLUksclt2LTFdPWYrSSxyW3ZdPXJbdi0xXSwwIT09SSYmKHJbdl09Zi1jL0kpLGVbdi0xXT0wLGVbdl09MCxmPW4uZ2V0KHYsdi0xKSxSPU1hdGguYWJzKGYpK01hdGguYWJzKEkpLF89Zi9SLEE9SS9SLEM9TWF0aC5zcXJ0KF8qXytBKkEpLF8vPUMsQS89QyxpPXYtMTtpPHQ7aSsrKUk9bi5nZXQodi0xLGkpLG4uc2V0KHYtMSxpLEEqSStfKm4uZ2V0KHYsaSkpLG4uc2V0KHYsaSxBKm4uZ2V0KHYsaSktXypJKTtmb3Iocz0wO3M8PXY7cysrKUk9bi5nZXQocyx2LTEpLG4uc2V0KHMsdi0xLEEqSStfKm4uZ2V0KHMsdikpLG4uc2V0KHMsdixBKm4uZ2V0KHMsdiktXypJKTtmb3Iocz1NO3M8PXg7cysrKUk9by5nZXQocyx2LTEpLG8uc2V0KHMsdi0xLEEqSStfKm8uZ2V0KHMsdikpLG8uc2V0KHMsdixBKm8uZ2V0KHMsdiktXypJKX1lbHNlIHJbdi0xXT1mK18sclt2XT1mK18sZVt2LTFdPUksZVt2XT0tSTt2LT0yLGs9MH1lbHNle2lmKGY9bi5nZXQodix2KSxtPTAsYz0wLGE8diYmKG09bi5nZXQodi0xLHYtMSksYz1uLmdldCh2LHYtMSkqbi5nZXQodi0xLHYpKSwxMD09PWspe2ZvcihTKz1mLHM9TTtzPD12O3MrKyluLnNldChzLHMsbi5nZXQocyxzKS1mKTtSPU1hdGguYWJzKG4uZ2V0KHYsdi0xKSkrTWF0aC5hYnMobi5nZXQodi0xLHYtMikpLGY9bT0uNzUqUixjPS0uNDM3NSpSKlJ9aWYoMzA9PT1rJiYoUj0obS1mKS8yLFI9UipSK2MsUj4wKSl7Zm9yKFI9TWF0aC5zcXJ0KFIpLG08ZiYmKFI9LVIpLFI9Zi1jLygobS1mKS8yK1IpLHM9TTtzPD12O3MrKyluLnNldChzLHMsbi5nZXQocyxzKS1SKTtTKz1SLGY9bT1jPS45NjR9Zm9yKGsrPTEsaD12LTI7aD49YSYmKEk9bi5nZXQoaCxoKSxDPWYtSSxSPW0tSSxfPShDKlItYykvbi5nZXQoaCsxLGgpK24uZ2V0KGgsaCsxKSxBPW4uZ2V0KGgrMSxoKzEpLUktQy1SLEM9bi5nZXQoaCsyLGgrMSksUj1NYXRoLmFicyhfKStNYXRoLmFicyhBKStNYXRoLmFicyhDKSxfLz1SLEEvPVIsQy89UixoIT09YSkmJiEoTWF0aC5hYnMobi5nZXQoaCxoLTEpKSooTWF0aC5hYnMoQSkrTWF0aC5hYnMoQykpPEUqKE1hdGguYWJzKF8pKihNYXRoLmFicyhuLmdldChoLTEsaC0xKSkrTWF0aC5hYnMoSSkrTWF0aC5hYnMobi5nZXQoaCsxLGgrMSkpKSkpOyloLS07Zm9yKHM9aCsyO3M8PXY7cysrKW4uc2V0KHMscy0yLDApLHM+aCsyJiZuLnNldChzLHMtMywwKTtmb3IodT1oO3U8PXYtMSYmKGI9dSE9PXYtMSx1IT09aCYmKF89bi5nZXQodSx1LTEpLEE9bi5nZXQodSsxLHUtMSksQz1iP24uZ2V0KHUrMix1LTEpOjAsZj1NYXRoLmFicyhfKStNYXRoLmFicyhBKStNYXRoLmFicyhDKSwwIT09ZiYmKF8vPWYsQS89ZixDLz1mKSksMCE9PWYpO3UrKylpZihSPU1hdGguc3FydChfKl8rQSpBK0MqQyksXzwwJiYoUj0tUiksMCE9PVIpe2Zvcih1IT09aD9uLnNldCh1LHUtMSwtUipmKTphIT09aCYmbi5zZXQodSx1LTEsLW4uZ2V0KHUsdS0xKSksXys9UixmPV8vUixtPUEvUixJPUMvUixBLz1fLEMvPV8saT11O2k8dDtpKyspXz1uLmdldCh1LGkpK0Eqbi5nZXQodSsxLGkpLGImJihfKz1DKm4uZ2V0KHUrMixpKSxuLnNldCh1KzIsaSxuLmdldCh1KzIsaSktXypJKSksbi5zZXQodSxpLG4uZ2V0KHUsaSktXypmKSxuLnNldCh1KzEsaSxuLmdldCh1KzEsaSktXyptKTtmb3Iocz0wO3M8PU1hdGgubWluKHYsdSszKTtzKyspXz1mKm4uZ2V0KHMsdSkrbSpuLmdldChzLHUrMSksYiYmKF8rPUkqbi5nZXQocyx1KzIpLG4uc2V0KHMsdSsyLG4uZ2V0KHMsdSsyKS1fKkMpKSxuLnNldChzLHUsbi5nZXQocyx1KS1fKSxuLnNldChzLHUrMSxuLmdldChzLHUrMSktXypBKTtmb3Iocz1NO3M8PXg7cysrKV89ZipvLmdldChzLHUpK20qby5nZXQocyx1KzEpLGImJihfKz1JKm8uZ2V0KHMsdSsyKSxvLnNldChzLHUrMixvLmdldChzLHUrMiktXypDKSksby5zZXQocyx1LG8uZ2V0KHMsdSktXyksby5zZXQocyx1KzEsby5nZXQocyx1KzEpLV8qQSl9fX1pZigwPT09ailyZXR1cm47Zm9yKHY9dC0xO3Y+PTA7di0tKWlmKF89clt2XSxBPWVbdl0sMD09PUEpZm9yKGE9dixuLnNldCh2LHYsMSkscz12LTE7cz49MDtzLS0pe2ZvcihjPW4uZ2V0KHMscyktXyxDPTAsaT1hO2k8PXY7aSsrKUMrPW4uZ2V0KHMsaSkqbi5nZXQoaSx2KTtpZihlW3NdPDApST1jLFI9QztlbHNlIGlmKGE9cywwPT09ZVtzXT9uLnNldChzLHYsMCE9PWM/LUMvYzotQy8oRSpqKSk6KGY9bi5nZXQocyxzKzEpLG09bi5nZXQocysxLHMpLEE9KHJbc10tXykqKHJbc10tXykrZVtzXSplW3NdLGw9KGYqUi1JKkMpL0Esbi5zZXQocyx2LGwpLG4uc2V0KHMrMSx2LE1hdGguYWJzKGYpPk1hdGguYWJzKEkpPygtQy1jKmwpL2Y6KC1SLW0qbCkvSSkpLGw9TWF0aC5hYnMobi5nZXQocyx2KSksRSpsKmw+MSlmb3IoaT1zO2k8PXY7aSsrKW4uc2V0KGksdixuLmdldChpLHYpL2wpfWVsc2UgaWYoQTwwKWZvcihhPXYtMSxNYXRoLmFicyhuLmdldCh2LHYtMSkpPk1hdGguYWJzKG4uZ2V0KHYtMSx2KSk/KG4uc2V0KHYtMSx2LTEsQS9uLmdldCh2LHYtMSkpLG4uc2V0KHYtMSx2LC0obi5nZXQodix2KS1fKS9uLmdldCh2LHYtMSkpKTooeT1LZSgwLC1uLmdldCh2LTEsdiksbi5nZXQodi0xLHYtMSktXyxBKSxuLnNldCh2LTEsdi0xLHlbMF0pLG4uc2V0KHYtMSx2LHlbMV0pKSxuLnNldCh2LHYtMSwwKSxuLnNldCh2LHYsMSkscz12LTI7cz49MDtzLS0pe2ZvcihnPTAscD0wLGk9YTtpPD12O2krKylnKz1uLmdldChzLGkpKm4uZ2V0KGksdi0xKSxwKz1uLmdldChzLGkpKm4uZ2V0KGksdik7aWYoYz1uLmdldChzLHMpLV8sZVtzXTwwKUk9YyxDPWcsUj1wO2Vsc2UgaWYoYT1zLDA9PT1lW3NdPyh5PUtlKC1nLC1wLGMsQSksbi5zZXQocyx2LTEseVswXSksbi5zZXQocyx2LHlbMV0pKTooZj1uLmdldChzLHMrMSksbT1uLmdldChzKzEscyksdz0ocltzXS1fKSoocltzXS1fKStlW3NdKmVbc10tQSpBLGQ9MioocltzXS1fKSpBLDA9PT13JiYwPT09ZCYmKHc9RSpqKihNYXRoLmFicyhjKStNYXRoLmFicyhBKStNYXRoLmFicyhmKStNYXRoLmFicyhtKStNYXRoLmFicyhJKSkpLHk9S2UoZipDLUkqZytBKnAsZipSLUkqcC1BKmcsdyxkKSxuLnNldChzLHYtMSx5WzBdKSxuLnNldChzLHYseVsxXSksTWF0aC5hYnMoZik+TWF0aC5hYnMoSSkrTWF0aC5hYnMoQSk/KG4uc2V0KHMrMSx2LTEsKC1nLWMqbi5nZXQocyx2LTEpK0Eqbi5nZXQocyx2KSkvZiksbi5zZXQocysxLHYsKC1wLWMqbi5nZXQocyx2KS1BKm4uZ2V0KHMsdi0xKSkvZikpOih5PUtlKC1DLW0qbi5nZXQocyx2LTEpLC1SLW0qbi5nZXQocyx2KSxJLEEpLG4uc2V0KHMrMSx2LTEseVswXSksbi5zZXQocysxLHYseVsxXSkpKSxsPU1hdGgubWF4KE1hdGguYWJzKG4uZ2V0KHMsdi0xKSksTWF0aC5hYnMobi5nZXQocyx2KSkpLEUqbCpsPjEpZm9yKGk9cztpPD12O2krKyluLnNldChpLHYtMSxuLmdldChpLHYtMSkvbCksbi5zZXQoaSx2LG4uZ2V0KGksdikvbCl9Zm9yKHM9MDtzPHQ7cysrKWlmKHM8TXx8cz54KWZvcihpPXM7aTx0O2krKylvLnNldChzLGksbi5nZXQocyxpKSk7Zm9yKGk9dC0xO2k+PU07aS0tKWZvcihzPU07czw9eDtzKyspe2ZvcihJPTAsdT1NO3U8PU1hdGgubWluKGkseCk7dSsrKUkrPW8uZ2V0KHMsdSkqbi5nZXQodSxpKTtvLnNldChzLGksSSl9fShzLGEsdSxpLHQpfXRoaXMubj1zLHRoaXMuZT1hLHRoaXMuZD11LHRoaXMuVj1pfWdldCByZWFsRWlnZW52YWx1ZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmQpfWdldCBpbWFnaW5hcnlFaWdlbnZhbHVlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZSl9Z2V0IGVpZ2VudmVjdG9yTWF0cml4KCl7cmV0dXJuIHRoaXMuVn1nZXQgZGlhZ29uYWxNYXRyaXgoKXtsZXQgdCxlLHI9dGhpcy5uLG89dGhpcy5lLG49dGhpcy5kLHM9bmV3IHFlKHIscik7Zm9yKHQ9MDt0PHI7dCsrKXtmb3IoZT0wO2U8cjtlKyspcy5zZXQodCxlLDApO3Muc2V0KHQsdCxuW3RdKSxvW3RdPjA/cy5zZXQodCx0KzEsb1t0XSk6b1t0XTwwJiZzLnNldCh0LHQtMSxvW3RdKX1yZXR1cm4gc319ZnVuY3Rpb24gS2UodCxlLHIsbyl7bGV0IG4scztyZXR1cm4gTWF0aC5hYnMocik+TWF0aC5hYnMobyk/KG49by9yLHM9cituKm8sWyh0K24qZSkvcywoZS1uKnQpL3NdKToobj1yL28scz1vK24qcixbKG4qdCtlKS9zLChuKmUtdCkvc10pfWNsYXNzIFdle2NvbnN0cnVjdG9yKHQsZT17fSl7dD1VZS5jaGVja01hdHJpeCh0KTtsZXR7WTpyfT1lO2NvbnN0e3NjYWxlU2NvcmVzOm89ITEsbWF4SXRlcmF0aW9uczpuPTFlMyx0ZXJtaW5hdGlvbkNyaXRlcmlhOnM9MWUtMTB9PWU7bGV0IGk7aWYocil7aWYocj1BcnJheS5pc0FycmF5KHIpJiYibnVtYmVyIj09dHlwZW9mIHJbMF0/cWUuY29sdW1uVmVjdG9yKHIpOlVlLmNoZWNrTWF0cml4KHIpLHIucm93cyE9PXQucm93cyl0aHJvdyBuZXcgRXJyb3IoIlkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHJvd3MgYXMgWCIpO2k9ci5nZXRDb2x1bW5WZWN0b3IoMCl9ZWxzZSBpPXQuZ2V0Q29sdW1uVmVjdG9yKDApO2xldCB1LGEsaCxsLGM9MTtmb3IobGV0IGU9MDtlPG4mJmM+cztlKyspaD10LnRyYW5zcG9zZSgpLm1tdWwoaSkuZGl2KGkudHJhbnNwb3NlKCkubW11bChpKS5nZXQoMCwwKSksaD1oLmRpdihoLm5vcm0oKSksdT10Lm1tdWwoaCkuZGl2KGgudHJhbnNwb3NlKCkubW11bChoKS5nZXQoMCwwKSksZT4wJiYoYz11LmNsb25lKCkuc3ViKGwpLnBvdygyKS5zdW0oKSksbD11LmNsb25lKCkscj8oYT1yLnRyYW5zcG9zZSgpLm1tdWwodSkuZGl2KHUudHJhbnNwb3NlKCkubW11bCh1KS5nZXQoMCwwKSksYT1hLmRpdihhLm5vcm0oKSksaT1yLm1tdWwoYSkuZGl2KGEudHJhbnNwb3NlKCkubW11bChhKS5nZXQoMCwwKSkpOmk9dTtpZihyKXtsZXQgZT10LnRyYW5zcG9zZSgpLm1tdWwodSkuZGl2KHUudHJhbnNwb3NlKCkubW11bCh1KS5nZXQoMCwwKSk7ZT1lLmRpdihlLm5vcm0oKSk7bGV0IG89dC5jbG9uZSgpLnN1Yih1LmNsb25lKCkubW11bChlLnRyYW5zcG9zZSgpKSksbj1pLnRyYW5zcG9zZSgpLm1tdWwodSkuZGl2KHUudHJhbnNwb3NlKCkubW11bCh1KS5nZXQoMCwwKSkscz1yLmNsb25lKCkuc3ViKHUuY2xvbmUoKS5tdWxTKG4uZ2V0KDAsMCkpLm1tdWwoYS50cmFuc3Bvc2UoKSkpO3RoaXMudD11LHRoaXMucD1lLnRyYW5zcG9zZSgpLHRoaXMudz1oLnRyYW5zcG9zZSgpLHRoaXMucT1hLHRoaXMudT1pLHRoaXMucz11LnRyYW5zcG9zZSgpLm1tdWwodSksdGhpcy54UmVzaWR1YWw9byx0aGlzLnlSZXNpZHVhbD1zLHRoaXMuYmV0YXM9bn1lbHNlIHRoaXMudz1oLnRyYW5zcG9zZSgpLHRoaXMucz11LnRyYW5zcG9zZSgpLm1tdWwodSkuc3FydCgpLHRoaXMudD1vP3UuY2xvbmUoKS5kaXYodGhpcy5zLmdldCgwLDApKTp1LHRoaXMueFJlc2lkdWFsPXQuc3ViKHUubW11bChoLnRyYW5zcG9zZSgpKSl9fWNsYXNzIFhle2NvbnN0cnVjdG9yKHQsZT17fSl7aWYoITA9PT10KXtjb25zdCB0PWU7cmV0dXJuIHRoaXMuY2VudGVyPXQuY2VudGVyLHRoaXMuc2NhbGU9dC5zY2FsZSx0aGlzLm1lYW5zPXQubWVhbnMsdGhpcy5zdGRldnM9dC5zdGRldnMsdGhpcy5VPXFlLmNoZWNrTWF0cml4KHQuVSksdGhpcy5TPXQuUyx0aGlzLlI9dC5SLHZvaWQodGhpcy5leGNsdWRlZEZlYXR1cmVzPXQuZXhjbHVkZWRGZWF0dXJlc3x8W10pfXQ9bmV3IHFlKHQpO2NvbnN0e2lzQ292YXJpYW5jZU1hdHJpeDpyPSExLG1ldGhvZDpvPSJTVkQiLG5Db21wTklQQUxTOm49MixjZW50ZXI6cz0hMCxzY2FsZTppPSExLGlnbm9yZVplcm9WYXJpYW5jZTp1PSExfT1lO2lmKHRoaXMuY2VudGVyPXMsdGhpcy5zY2FsZT1pLHRoaXMubWVhbnM9bnVsbCx0aGlzLnN0ZGV2cz1udWxsLHRoaXMuZXhjbHVkZWRGZWF0dXJlcz1bXSxyKXRoaXMuX2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeCh0KTtlbHNlIHN3aXRjaCh0aGlzLl9hZGp1c3QodCx1KSxvKXtjYXNlImNvdmFyaWFuY2VNYXRyaXgiOntjb25zdCBlPW5ldyBEZSh0KS5tbXVsKHQpLmRpdih0LnJvd3MtMSk7dGhpcy5fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KGUpO2JyZWFrfWNhc2UiTklQQUxTIjp0aGlzLl9jb21wdXRlV2l0aE5JUEFMUyh0LG4pO2JyZWFrO2Nhc2UiU1ZEIjp7Y29uc3QgZT1uZXcgQmUodCx7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6ITEsY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzOiEwLGF1dG9UcmFuc3Bvc2U6ITB9KTt0aGlzLlU9ZS5yaWdodFNpbmd1bGFyVmVjdG9ycztjb25zdCByPWUuZGlhZ29uYWwsbz1bXTtmb3IoY29uc3QgZSBvZiByKW8ucHVzaChlKmUvKHQucm93cy0xKSk7dGhpcy5TPW87YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gbWV0aG9kOiAke299YCl9fXN0YXRpYyBsb2FkKHQpe2lmKCJzdHJpbmciIT10eXBlb2YgdC5uYW1lKXRocm93IG5ldyBUeXBlRXJyb3IoIm1vZGVsIG11c3QgaGF2ZSBhIG5hbWUgcHJvcGVydHkiKTtpZigiUENBIiE9PXQubmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgaW52YWxpZCBtb2RlbDogJHt0Lm5hbWV9YCk7cmV0dXJuIG5ldyBYZSghMCx0KX1wcmVkaWN0KHQsZT17fSl7Y29uc3R7bkNvbXBvbmVudHM6cj10aGlzLlUuY29sdW1uc309ZTtpZih0PW5ldyBxZSh0KSx0aGlzLmNlbnRlciYmKHQuc3ViUm93VmVjdG9yKHRoaXMubWVhbnMpLHRoaXMuc2NhbGUpKXtmb3IobGV0IGUgb2YgdGhpcy5leGNsdWRlZEZlYXR1cmVzKXQucmVtb3ZlQ29sdW1uKGUpO3QuZGl2Um93VmVjdG9yKHRoaXMuc3RkZXZzKX1sZXQgbz10Lm1tdWwodGhpcy5VKTtyZXR1cm4gby5zdWJNYXRyaXgoMCxvLnJvd3MtMSwwLHItMSl9aW52ZXJ0KHQpe2xldCBlPSh0PXFlLmNoZWNrTWF0cml4KHQpKS5tbXVsKHRoaXMuVS50cmFuc3Bvc2UoKSk7cmV0dXJuIHRoaXMuY2VudGVyJiYodGhpcy5zY2FsZSYmZS5tdWxSb3dWZWN0b3IodGhpcy5zdGRldnMpLGUuYWRkUm93VmVjdG9yKHRoaXMubWVhbnMpKSxlfWdldEV4cGxhaW5lZFZhcmlhbmNlKCl7bGV0IHQ9MDtmb3IoY29uc3QgZSBvZiB0aGlzLlMpdCs9ZTtyZXR1cm4gdGhpcy5TLm1hcCgoZT0+ZS90KSl9Z2V0Q3VtdWxhdGl2ZVZhcmlhbmNlKCl7bGV0IHQ9dGhpcy5nZXRFeHBsYWluZWRWYXJpYW5jZSgpO2ZvcihsZXQgZT0xO2U8dC5sZW5ndGg7ZSsrKXRbZV0rPXRbZS0xXTtyZXR1cm4gdH1nZXRFaWdlbnZlY3RvcnMoKXtyZXR1cm4gdGhpcy5VfWdldEVpZ2VudmFsdWVzKCl7cmV0dXJuIHRoaXMuU31nZXRTdGFuZGFyZERldmlhdGlvbnMoKXtyZXR1cm4gdGhpcy5TLm1hcCgodD0+TWF0aC5zcXJ0KHQpKSl9Z2V0TG9hZGluZ3MoKXtyZXR1cm4gdGhpcy5VLnRyYW5zcG9zZSgpfXRvSlNPTigpe3JldHVybntuYW1lOiJQQ0EiLGNlbnRlcjp0aGlzLmNlbnRlcixzY2FsZTp0aGlzLnNjYWxlLG1lYW5zOnRoaXMubWVhbnMsc3RkZXZzOnRoaXMuc3RkZXZzLFU6dGhpcy5VLFM6dGhpcy5TLGV4Y2x1ZGVkRmVhdHVyZXM6dGhpcy5leGNsdWRlZEZlYXR1cmVzfX1fYWRqdXN0KHQsZSl7aWYodGhpcy5jZW50ZXIpe2NvbnN0IHI9dC5tZWFuKCJjb2x1bW4iKSxvPXRoaXMuc2NhbGU/dC5zdGFuZGFyZERldmlhdGlvbigiY29sdW1uIix7bWVhbjpyfSk6bnVsbDtpZih0aGlzLm1lYW5zPXIsdC5zdWJSb3dWZWN0b3IociksdGhpcy5zY2FsZSl7Zm9yKGxldCByPTA7cjxvLmxlbmd0aDtyKyspaWYoMD09PW9bcl0pe2lmKCFlKXRocm93IG5ldyBSYW5nZUVycm9yKGBDYW5ub3Qgc2NhbGUgdGhlIGRhdGFzZXQgKHN0YW5kYXJkIGRldmlhdGlvbiBpcyB6ZXJvIGF0IGluZGV4ICR7cn1gKTt0LnJlbW92ZUNvbHVtbihyKSxvLnNwbGljZShyLDEpLHRoaXMuZXhjbHVkZWRGZWF0dXJlcy5wdXNoKHIpLHItLX10aGlzLnN0ZGV2cz1vLHQuZGl2Um93VmVjdG9yKG8pfX19X2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeCh0KXtjb25zdCBlPW5ldyBHZSh0LHthc3N1bWVTeW1tZXRyaWM6ITB9KTt0aGlzLlU9ZS5laWdlbnZlY3Rvck1hdHJpeCx0aGlzLlUuZmxpcFJvd3MoKSx0aGlzLlM9ZS5yZWFsRWlnZW52YWx1ZXMsdGhpcy5TLnJldmVyc2UoKX1fY29tcHV0ZVdpdGhOSVBBTFModCxlKXt0aGlzLlU9bmV3IHFlKGUsdC5jb2x1bW5zKSx0aGlzLlM9W107bGV0IHI9dDtmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT1uZXcgV2Uocik7dGhpcy5VLnNldFJvdyh0LGUudy50cmFuc3Bvc2UoKSksdGhpcy5TLnB1c2goTWF0aC5wb3coZS5zLmdldCgwLDApLDIpKSxyPWUueFJlc2lkdWFsfXRoaXMuVT10aGlzLlUudHJhbnNwb3NlKCl9fWZ1bmN0aW9uIEplKHQsZT17fSl7aWYoIWRlKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3QgZWZmLiBhcnJheSIpO2xldCByPUN0KGUsInNjYWxlIik7ZmUocil8fChyPSEwKTtsZXQgbz1DdChlLCJuQ29tcE5JUEFMUyIpO2NlKG8pfHwobz0yKTtsZXQgbj1sZShDdCh0LDAsW10pKTtpZigwPT09bil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZGltZW5zaW9uIG9mIGRhdGEiKTtpZihvPm4pdGhyb3cgbmV3IEVycm9yKCJuQ29tcE5JUEFMUyBpcyBtb3JlIHRoYW4gdGhlIGRpbWVuc2lvbiBvZiBkYXRhIik7bGV0IHM9bmV3IFhlKHQse21ldGhvZDoiTklQQUxTIixzY2FsZTpyLG5Db21wTklQQUxTOm99KSxpPXMucHJlZGljdCh0KTtyZXR1cm4gcy5pbnZlcnQoaSkudG9KU09OKCl9dmFyIFllPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoOysrcjxvJiYhMSE9PWUodFtyXSxyLHQpOyk7cmV0dXJuIHR9O3ZhciBaZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLG8pe2Zvcih2YXIgbj0tMSxzPU9iamVjdChlKSxpPW8oZSksdT1pLmxlbmd0aDt1LS07KXt2YXIgYT1pW3Q/dTorK25dO2lmKCExPT09cihzW2FdLGEscykpYnJlYWt9cmV0dXJuIGV9fSgpO3ZhciBIZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxvPUFycmF5KHQpOysrcjx0OylvW3JdPWUocik7cmV0dXJuIG99O3ZhciBRZT1mdW5jdGlvbih0KXtyZXR1cm4gZCh0KSYmIltvYmplY3QgQXJndW1lbnRzXSI9PXcodCl9LHRyPU9iamVjdC5wcm90b3R5cGUsZXI9dHIuaGFzT3duUHJvcGVydHkscnI9dHIucHJvcGVydHlJc0VudW1lcmFibGUsb3I9UWUoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9RZTpmdW5jdGlvbih0KXtyZXR1cm4gZCh0KSYmZXIuY2FsbCh0LCJjYWxsZWUiKSYmIXJyLmNhbGwodCwiY2FsbGVlIil9O3ZhciBucj1mdW5jdGlvbigpe3JldHVybiExfSxzcj1vKChmdW5jdGlvbih0LGUpe3ZhciByPWUmJiFlLm5vZGVUeXBlJiZlLG89ciYmdCYmIXQubm9kZVR5cGUmJnQsbj1vJiZvLmV4cG9ydHM9PT1yP2kuQnVmZmVyOnZvaWQgMCxzPShuP24uaXNCdWZmZXI6dm9pZCAwKXx8bnI7dC5leHBvcnRzPXN9KSksaXI9L14oPzowfFsxLTldXGQqKSQvO3ZhciB1cj1mdW5jdGlvbih0LGUpe3ZhciByPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT85MDA3MTk5MjU0NzQwOTkxOmUpJiYoIm51bWJlciI9PXJ8fCJzeW1ib2wiIT1yJiZpci50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9LGFyPXt9O2FyWyJbb2JqZWN0IEZsb2F0MzJBcnJheV0iXT1hclsiW29iamVjdCBGbG9hdDY0QXJyYXldIl09YXJbIltvYmplY3QgSW50OEFycmF5XSJdPWFyWyJbb2JqZWN0IEludDE2QXJyYXldIl09YXJbIltvYmplY3QgSW50MzJBcnJheV0iXT1hclsiW29iamVjdCBVaW50OEFycmF5XSJdPWFyWyJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSJdPWFyWyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPWFyWyJbb2JqZWN0IFVpbnQzMkFycmF5XSJdPSEwLGFyWyJbb2JqZWN0IEFyZ3VtZW50c10iXT1hclsiW29iamVjdCBBcnJheV0iXT1hclsiW29iamVjdCBBcnJheUJ1ZmZlcl0iXT1hclsiW29iamVjdCBCb29sZWFuXSJdPWFyWyJbb2JqZWN0IERhdGFWaWV3XSJdPWFyWyJbb2JqZWN0IERhdGVdIl09YXJbIltvYmplY3QgRXJyb3JdIl09YXJbIltvYmplY3QgRnVuY3Rpb25dIl09YXJbIltvYmplY3QgTWFwXSJdPWFyWyJbb2JqZWN0IE51bWJlcl0iXT1hclsiW29iamVjdCBPYmplY3RdIl09YXJbIltvYmplY3QgUmVnRXhwXSJdPWFyWyJbb2JqZWN0IFNldF0iXT1hclsiW29iamVjdCBTdHJpbmddIl09YXJbIltvYmplY3QgV2Vha01hcF0iXT0hMTt2YXIgaHI9ZnVuY3Rpb24odCl7cmV0dXJuIGQodCkmJkd0KHQubGVuZ3RoKSYmISFhclt3KHQpXX07dmFyIGxyPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19LGNyPW8oKGZ1bmN0aW9uKHQsZSl7dmFyIHI9ZSYmIWUubm9kZVR5cGUmJmUsbz1yJiZ0JiYhdC5ub2RlVHlwZSYmdCxzPW8mJm8uZXhwb3J0cz09PXImJm4ucHJvY2VzcyxpPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW8mJm8ucmVxdWlyZSYmby5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fHMmJnMuYmluZGluZyYmcy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKTt0LmV4cG9ydHM9aX0pKSxmcj1jciYmY3IuaXNUeXBlZEFycmF5LG1yPWZyP2xyKGZyKTpocixncj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBwcj1mdW5jdGlvbihlLHIpe3ZhciBvPXQoZSksbj0hbyYmb3IoZSkscz0hbyYmIW4mJnNyKGUpLGk9IW8mJiFuJiYhcyYmbXIoZSksdT1vfHxufHxzfHxpLGE9dT9IZShlLmxlbmd0aCxTdHJpbmcpOltdLGg9YS5sZW5ndGg7Zm9yKHZhciBsIGluIGUpIXImJiFnci5jYWxsKGUsbCl8fHUmJigibGVuZ3RoIj09bHx8cyYmKCJvZmZzZXQiPT1sfHwicGFyZW50Ij09bCl8fGkmJigiYnVmZmVyIj09bHx8ImJ5dGVMZW5ndGgiPT1sfHwiYnl0ZU9mZnNldCI9PWwpfHx1cihsLGgpKXx8YS5wdXNoKGwpO3JldHVybiBhfTt2YXIgd3I9ZnVuY3Rpb24odCl7cmV0dXJuIEt0KHQpP3ByKHQpOk90KHQpfTt2YXIgZHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocixvKXtpZihudWxsPT1yKXJldHVybiByO2lmKCFLdChyKSlyZXR1cm4gdChyLG8pO2Zvcih2YXIgbj1yLmxlbmd0aCxzPWU/bjotMSxpPU9iamVjdChyKTsoZT9zLS06KytzPG4pJiYhMSE9PW8oaVtzXSxzLGkpOyk7cmV0dXJuIHJ9fSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmWmUodCxlLHdyKX0pKTt2YXIgYnI9ZnVuY3Rpb24odCl7cmV0dXJuIHR9O3ZhciB5cj1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OmJyfTt2YXIgdnI9ZnVuY3Rpb24oZSxyKXtyZXR1cm4odChlKT9ZZTpkcikoZSx5cihyKSl9O3ZhciBNcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IG50LHRoaXMuc2l6ZT0wfTt2YXIgeHI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLHJ9O3ZhciBFcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9O3ZhciBTcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O3ZhciBqcj1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187aWYociBpbnN0YW5jZW9mIG50KXt2YXIgbz1yLl9fZGF0YV9fO2lmKCFzdHx8by5sZW5ndGg8MTk5KXJldHVybiBvLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK3Iuc2l6ZSx0aGlzO3I9dGhpcy5fX2RhdGFfXz1uZXcgZ3Qobyl9cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplPXIuc2l6ZSx0aGlzfTtmdW5jdGlvbiBfcih0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBudCh0KTt0aGlzLnNpemU9ZS5zaXplfV9yLnByb3RvdHlwZS5jbGVhcj1Ncixfci5wcm90b3R5cGUuZGVsZXRlPXhyLF9yLnByb3RvdHlwZS5nZXQ9RXIsX3IucHJvdG90eXBlLmhhcz1Tcixfci5wcm90b3R5cGUuc2V0PWpyO3ZhciBBcj1fcjt2YXIgQ3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iKSx0aGlzfTt2YXIgUnI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfTtmdW5jdGlvbiBJcih0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgZ3Q7KytlPHI7KXRoaXMuYWRkKHRbZV0pfUlyLnByb3RvdHlwZS5hZGQ9SXIucHJvdG90eXBlLnB1c2g9Q3IsSXIucHJvdG90eXBlLmhhcz1Scjt2YXIga3I9SXI7dmFyIE5yPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoOysrcjxvOylpZihlKHRbcl0scix0KSlyZXR1cm4hMDtyZXR1cm4hMX07dmFyIE9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaGFzKGUpfTt2YXIgRnI9ZnVuY3Rpb24odCxlLHIsbyxuLHMpe3ZhciBpPTEmcix1PXQubGVuZ3RoLGE9ZS5sZW5ndGg7aWYodSE9YSYmIShpJiZhPnUpKXJldHVybiExO3ZhciBoPXMuZ2V0KHQpLGw9cy5nZXQoZSk7aWYoaCYmbClyZXR1cm4gaD09ZSYmbD09dDt2YXIgYz0tMSxmPSEwLG09MiZyP25ldyBrcjp2b2lkIDA7Zm9yKHMuc2V0KHQsZSkscy5zZXQoZSx0KTsrK2M8dTspe3ZhciBnPXRbY10scD1lW2NdO2lmKG8pdmFyIHc9aT9vKHAsZyxjLGUsdCxzKTpvKGcscCxjLHQsZSxzKTtpZih2b2lkIDAhPT13KXtpZih3KWNvbnRpbnVlO2Y9ITE7YnJlYWt9aWYobSl7aWYoIU5yKGUsKGZ1bmN0aW9uKHQsZSl7aWYoIU9yKG0sZSkmJihnPT09dHx8bihnLHQscixvLHMpKSlyZXR1cm4gbS5wdXNoKGUpfSkpKXtmPSExO2JyZWFrfX1lbHNlIGlmKGchPT1wJiYhbihnLHAscixvLHMpKXtmPSExO2JyZWFrfX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSksZn0senI9aS5VaW50OEFycmF5O3ZhciBUcj1mdW5jdGlvbih0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxvKXtyWysrZV09W28sdF19KSkscn07dmFyIFZyPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLHI9QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtyWysrZV09dH0pKSxyfSxQcj11P3UucHJvdG90eXBlOnZvaWQgMCxxcj1Qcj9Qci52YWx1ZU9mOnZvaWQgMDt2YXIgJHI9ZnVuY3Rpb24odCxlLHIsbyxuLHMsaSl7c3dpdGNoKHIpe2Nhc2UiW29iamVjdCBEYXRhVmlld10iOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSJbb2JqZWN0IEFycmF5QnVmZmVyXSI6cmV0dXJuISh0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8IXMobmV3IHpyKHQpLG5ldyB6cihlKSkpO2Nhc2UiW29iamVjdCBCb29sZWFuXSI6Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuIFkoK3QsK2UpO2Nhc2UiW29iamVjdCBFcnJvcl0iOnJldHVybiB0Lm5hbWU9PWUubmFtZSYmdC5tZXNzYWdlPT1lLm1lc3NhZ2U7Y2FzZSJbb2JqZWN0IFJlZ0V4cF0iOmNhc2UiW29iamVjdCBTdHJpbmddIjpyZXR1cm4gdD09ZSsiIjtjYXNlIltvYmplY3QgTWFwXSI6dmFyIHU9VHI7Y2FzZSJbb2JqZWN0IFNldF0iOnZhciBhPTEmbztpZih1fHwodT1WciksdC5zaXplIT1lLnNpemUmJiFhKXJldHVybiExO3ZhciBoPWkuZ2V0KHQpO2lmKGgpcmV0dXJuIGg9PWU7b3w9MixpLnNldCh0LGUpO3ZhciBsPUZyKHUodCksdShlKSxvLG4scyxpKTtyZXR1cm4gaS5kZWxldGUodCksbDtjYXNlIltvYmplY3QgU3ltYm9sXSI6aWYocXIpcmV0dXJuIHFyLmNhbGwodCk9PXFyLmNhbGwoZSl9cmV0dXJuITF9O3ZhciBEcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxvPWUubGVuZ3RoLG49dC5sZW5ndGg7KytyPG87KXRbbityXT1lW3JdO3JldHVybiB0fTt2YXIgVXI9ZnVuY3Rpb24oZSxyLG8pe3ZhciBuPXIoZSk7cmV0dXJuIHQoZSk/bjpEcihuLG8oZSkpfTt2YXIgTHI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGgsbj0wLHM9W107KytyPG87KXt2YXIgaT10W3JdO2UoaSxyLHQpJiYoc1tuKytdPWkpfXJldHVybiBzfTt2YXIgQnI9ZnVuY3Rpb24oKXtyZXR1cm5bXX0sR3I9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxLcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFdyPUtyP2Z1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOih0PU9iamVjdCh0KSxMcihLcih0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIEdyLmNhbGwodCxlKX0pKSl9OkJyO3ZhciBYcj1mdW5jdGlvbih0KXtyZXR1cm4gVXIodCx3cixXcil9LEpyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIFlyPWZ1bmN0aW9uKHQsZSxyLG8sbixzKXt2YXIgaT0xJnIsdT1Ycih0KSxhPXUubGVuZ3RoO2lmKGEhPVhyKGUpLmxlbmd0aCYmIWkpcmV0dXJuITE7Zm9yKHZhciBoPWE7aC0tOyl7dmFyIGw9dVtoXTtpZighKGk/bCBpbiBlOkpyLmNhbGwoZSxsKSkpcmV0dXJuITF9dmFyIGM9cy5nZXQodCksZj1zLmdldChlKTtpZihjJiZmKXJldHVybiBjPT1lJiZmPT10O3ZhciBtPSEwO3Muc2V0KHQsZSkscy5zZXQoZSx0KTtmb3IodmFyIGc9aTsrK2g8YTspe3ZhciBwPXRbbD11W2hdXSx3PWVbbF07aWYobyl2YXIgZD1pP28odyxwLGwsZSx0LHMpOm8ocCx3LGwsdCxlLHMpO2lmKCEodm9pZCAwPT09ZD9wPT09d3x8bihwLHcscixvLHMpOmQpKXttPSExO2JyZWFrfWd8fChnPSJjb25zdHJ1Y3RvciI9PWwpfWlmKG0mJiFnKXt2YXIgYj10LmNvbnN0cnVjdG9yLHk9ZS5jb25zdHJ1Y3RvcjtiPT15fHwhKCJjb25zdHJ1Y3RvciJpbiB0KXx8ISgiY29uc3RydWN0b3IiaW4gZSl8fCJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiIGluc3RhbmNlb2YgYiYmImZ1bmN0aW9uIj09dHlwZW9mIHkmJnkgaW5zdGFuY2VvZiB5fHwobT0hMSl9cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLG19LFpyPSJbb2JqZWN0IE9iamVjdF0iLEhyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIFFyPWZ1bmN0aW9uKGUscixvLG4scyxpKXt2YXIgdT10KGUpLGE9dChyKSxoPXU/IltvYmplY3QgQXJyYXldIjpCdChlKSxsPWE/IltvYmplY3QgQXJyYXldIjpCdChyKSxjPShoPSJbb2JqZWN0IEFyZ3VtZW50c10iPT1oP1pyOmgpPT1acixmPShsPSJbb2JqZWN0IEFyZ3VtZW50c10iPT1sP1pyOmwpPT1acixtPWg9PWw7aWYobSYmc3IoZSkpe2lmKCFzcihyKSlyZXR1cm4hMTt1PSEwLGM9ITF9aWYobSYmIWMpcmV0dXJuIGl8fChpPW5ldyBBciksdXx8bXIoZSk/RnIoZSxyLG8sbixzLGkpOiRyKGUscixoLG8sbixzLGkpO2lmKCEoMSZvKSl7dmFyIGc9YyYmSHIuY2FsbChlLCJfX3dyYXBwZWRfXyIpLHA9ZiYmSHIuY2FsbChyLCJfX3dyYXBwZWRfXyIpO2lmKGd8fHApe3ZhciB3PWc/ZS52YWx1ZSgpOmUsZD1wP3IudmFsdWUoKTpyO3JldHVybiBpfHwoaT1uZXcgQXIpLHModyxkLG8sbixpKX19cmV0dXJuISFtJiYoaXx8KGk9bmV3IEFyKSxZcihlLHIsbyxuLHMsaSkpfTt2YXIgdG89ZnVuY3Rpb24gdChlLHIsbyxuLHMpe3JldHVybiBlPT09cnx8KG51bGw9PWV8fG51bGw9PXJ8fCFkKGUpJiYhZChyKT9lIT1lJiZyIT1yOlFyKGUscixvLG4sdCxzKSl9O3ZhciBlbz1mdW5jdGlvbih0LGUscixvKXt2YXIgbj1yLmxlbmd0aCxzPW4saT0hbztpZihudWxsPT10KXJldHVybiFzO2Zvcih0PU9iamVjdCh0KTtuLS07KXt2YXIgdT1yW25dO2lmKGkmJnVbMl0/dVsxXSE9PXRbdVswXV06ISh1WzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK248czspe3ZhciBhPSh1PXJbbl0pWzBdLGg9dFthXSxsPXVbMV07aWYoaSYmdVsyXSl7aWYodm9pZCAwPT09aCYmIShhIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGM9bmV3IEFyO2lmKG8pdmFyIGY9byhoLGwsYSx0LGUsYyk7aWYoISh2b2lkIDA9PT1mP3RvKGwsaCwzLG8sYyk6ZikpcmV0dXJuITF9fXJldHVybiEwfTt2YXIgcm89ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PXQmJiF4KHQpfTt2YXIgb289ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXdyKHQpLHI9ZS5sZW5ndGg7ci0tOyl7dmFyIG89ZVtyXSxuPXRbb107ZVtyXT1bbyxuLHJvKG4pXX1yZXR1cm4gZX07dmFyIG5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBudWxsIT1yJiYoclt0XT09PWUmJih2b2lkIDAhPT1lfHx0IGluIE9iamVjdChyKSkpfX07dmFyIHNvPWZ1bmN0aW9uKHQpe3ZhciBlPW9vKHQpO3JldHVybiAxPT1lLmxlbmd0aCYmZVswXVsyXT9ubyhlWzBdWzBdLGVbMF1bMV0pOmZ1bmN0aW9uKHIpe3JldHVybiByPT09dHx8ZW8ocix0LGUpfX07dmFyIGlvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJmUgaW4gT2JqZWN0KHQpfTt2YXIgdW89ZnVuY3Rpb24oZSxyLG8pe2Zvcih2YXIgbj0tMSxzPShyPWp0KHIsZSkpLmxlbmd0aCxpPSExOysrbjxzOyl7dmFyIHU9X3QocltuXSk7aWYoIShpPW51bGwhPWUmJm8oZSx1KSkpYnJlYWs7ZT1lW3VdfXJldHVybiBpfHwrK24hPXM/aTohIShzPW51bGw9PWU/MDplLmxlbmd0aCkmJkd0KHMpJiZ1cih1LHMpJiYodChlKXx8b3IoZSkpfTt2YXIgYW89ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmdW8odCxlLGlvKX07dmFyIGhvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE0odCkmJnJvKGUpP25vKF90KHQpLGUpOmZ1bmN0aW9uKHIpe3ZhciBvPUN0KHIsdCk7cmV0dXJuIHZvaWQgMD09PW8mJm89PT1lP2FvKHIsdCk6dG8oZSxvLDMpfX07dmFyIGxvPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gQXQoZSx0KX19O3ZhciBjbz1mdW5jdGlvbih0KXtyZXR1cm4gTSh0KT9YdChfdCh0KSk6bG8odCl9O3ZhciBmbz1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGw9PWU/YnI6Im9iamVjdCI9PXR5cGVvZiBlP3QoZSk/aG8oZVswXSxlWzFdKTpzbyhlKTpjbyhlKX07dmFyIG1vPWZ1bmN0aW9uKHQsZSl7dmFyIHI9LTEsbz1LdCh0KT9BcnJheSh0Lmxlbmd0aCk6W107cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQsbixzKXtvWysrcl09ZSh0LG4scyl9KSksb307dmFyIGdvPWZ1bmN0aW9uKGUscil7cmV0dXJuKHQoZSk/dnQ6bW8pKGUsZm8ocikpfTt2YXIgcG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gdnQoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9O3ZhciB3bz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXTpwbyh0LHdyKHQpKX07ZnVuY3Rpb24gYm8odCl7cmV0dXJuISghcGUodCl8fCIiPT09dCl9ZnVuY3Rpb24geW8odCl7bGV0IGU9ITE7cmV0dXJuIGJvKHQpP2U9IWlzTmFOKE51bWJlcih0KSk6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVtYmVyXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpJiYoZT0hMCksZX1mdW5jdGlvbiB2byh0LGUpe2lmKCFnZSh0KSlyZXR1cm57fTtpZighZGUoZSkpcmV0dXJue307bGV0IHI9e307cmV0dXJuIHZyKGUsKGZ1bmN0aW9uKGUpeyhmdW5jdGlvbih0LGUpe3JldHVybiEhZ2UodCkmJiEoIWJvKGUpJiYheW8oZSkpJiZlIGluIHR9KSh0LGUpJiYocltlXT1DdCh0LGUpKX0pKSxyfXZhciBNbz0vXHMvO3ZhciB4bz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGg7ZS0tJiZNby50ZXN0KHQuY2hhckF0KGUpKTspO3JldHVybiBlfSxFbz0vXlxzKy87dmFyIFNvPWZ1bmN0aW9uKHQpe3JldHVybiB0P3Quc2xpY2UoMCx4byh0KSsxKS5yZXBsYWNlKEVvLCIiKTp0fSxqbz0vXlstK10weFswLTlhLWZdKyQvaSxfbz0vXjBiWzAxXSskL2ksQW89L14wb1swLTddKyQvaSxDbz1wYXJzZUludDt2YXIgUm89ZnVuY3Rpb24odCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0O2lmKGIodCkpcmV0dXJuIE5hTjtpZih4KHQpKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdC52YWx1ZU9mP3QudmFsdWVPZigpOnQ7dD14KGUpP2UrIiI6ZX1pZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD1Tbyh0KTt2YXIgcj1fby50ZXN0KHQpO3JldHVybiByfHxBby50ZXN0KHQpP0NvKHQuc2xpY2UoMikscj8yOjgpOmpvLnRlc3QodCk/TmFOOit0fTt2YXIgSW89ZnVuY3Rpb24odCl7cmV0dXJuIHQ/SW5maW5pdHk9PT0odD1Sbyh0KSl8fC1JbmZpbml0eT09PXQ/MTc5NzY5MzEzNDg2MjMxNTdlMjkyKih0PDA/LTE6MSk6dD09dD90OjA6MD09PXQ/dDowfTt2YXIga289ZnVuY3Rpb24odCl7dmFyIGU9SW8odCkscj1lJTE7cmV0dXJuIGU9PWU/cj9lLXI6ZTowfSxObz1pLmlzRmluaXRlLE9vPU1hdGgubWluO3ZhciBGbz1mdW5jdGlvbih0KXt2YXIgZT1NYXRoW3RdO3JldHVybiBmdW5jdGlvbih0LHIpe2lmKHQ9Um8odCksKHI9bnVsbD09cj8wOk9vKGtvKHIpLDI5MikpJiZObyh0KSl7dmFyIG89KFN0KHQpKyJlIikuc3BsaXQoImUiKSxuPWUob1swXSsiZSIrKCtvWzFdK3IpKTtyZXR1cm4rKChvPShTdChuKSsiZSIpLnNwbGl0KCJlIikpWzBdKyJlIisoK29bMV0tcikpfXJldHVybiBlKHQpfX0oInJvdW5kIik7ZnVuY3Rpb24gem8odCl7aWYoIXlvKHQpKXJldHVybiAwO3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHlvKHQpP0lvKHQpOjB9KHQpO2xldCBlPUZvKHQpO3JldHVybiIwIj09PVN0cmluZyhlKT8wOmV9dmFyIFRvPUFycmF5LnByb3RvdHlwZS5qb2luO3ZhciBWbz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10PyIiOlRvLmNhbGwodCxlKX07Y2xhc3MgUG97Y29uc3RydWN0b3IodCl7dGhpcy5nZXRDb3N0PSgpPT50aGlzLkVsZW1lbnRzLm1hcCgodD0+dC5EaXN0YW5jZUZyb21NZWRvaWQpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApLHRoaXMuZmluZEJlc3RNZWRvaWRJZHg9dD0+dGhpcy5FbGVtZW50cy5tYXAoKGU9PnRoaXMuY2FsY0Nvc3RGb3JHaXZlbkVsZW1lbnRBc01lZG9pZChlLHQpKSkucmVkdWNlKCgodCxlLHIsbyk9PmUuQ29zdElmTWFkZU1lZG9pZDxvW3RdLkNvc3RJZk1hZGVNZWRvaWQ/cjp0KSwwKSx0aGlzLmNhbGNDb3N0Rm9yR2l2ZW5FbGVtZW50QXNNZWRvaWQ9KHQsZSk9Pih7Q29zdElmTWFkZU1lZG9pZDpuZXcgUG8oe0VsZW1lbnRzOnRoaXMuRWxlbWVudHMubWFwKChyPT4oe0Rpc3RhbmNlRnJvbU1lZG9pZDplKHIuRWxlbWVudCx0LkVsZW1lbnQpLEVsZW1lbnQ6ci5FbGVtZW50fSkpKSxNZWRvaWQ6dC5FbGVtZW50fSkuZ2V0Q29zdCgpLEVsZW1lbnQ6dH0pLHRoaXMuRWxlbWVudHM9dC5FbGVtZW50cyx0aGlzLk1lZG9pZD10Lk1lZG9pZH19dmFyIHFvPVBvLCRvPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7Q2x1c3Rlcjpxb30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLERvPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7ZGlzdGFuY2U6KHQsZSk9PntpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGlucHV0cyBtdXN0IGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uIik7Y29uc3Qgcj1BcnJheS5mcm9tKHQua2V5cygpKS5tYXAoKHI9Pk1hdGgucG93KE1hdGguYWJzKHRbcl0tZVtyXSksMikpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApO3JldHVybiBNYXRoLnNxcnQocil9fSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksVW89T2JqZWN0LmRlZmluZVByb3BlcnR5KHtrR3RFbGVtZW50QXJyTGVuZ3RoOiJrIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5In0sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NsYXNzIExve2NvbnN0cnVjdG9yKHQsZSxyKXt0aGlzLkVsZW1lbnRzPXQsdGhpcy5LPWUsdGhpcy5EaXN0YW5jZUZuPXIsdGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWQ9ITEsdGhpcy5pdGVyYXRlPSgpPT57dGhpcy5JdGVyYXRpb25Db3VudCsrLHRoaXMuQ2x1c3RlcnN8fHRoaXMuYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHMoKTtjb25zdCB0PXRoaXMuTWVkb2lkcyxlPXRoaXMuQ2x1c3RlcnMscj10aGlzLmNhbGN1bGF0ZUN1cnJlbnRDb3N0KCk7bGV0IG89cjtmb3IobGV0IHQ9MDt0PHRoaXMuTWVkb2lkcy5sZW5ndGg7dCsrKXtjb25zdCBlPXQ9PjA9PT10aGlzLk1lZG9pZHMuZmlsdGVyKChlPT4wPT09dGhpcy5EaXN0YW5jZUZuKHQsZSkpKS5sZW5ndGg7Zm9yKGNvbnN0IHIgb2YgdGhpcy5FbGVtZW50cy5maWx0ZXIoZSkpe2NvbnN0IGU9dGhpcy5NZWRvaWRzLnNsaWNlKCk7ZVt0XT1yO2NvbnN0IG49bmV3IExvKHRoaXMuRWxlbWVudHMuc2xpY2UoKSx0aGlzLkssdGhpcy5EaXN0YW5jZUZuKTtuLk1lZG9pZHM9ZSxuLmFsbG9jYXRlVG9DbHVzdGVyc0Fyb3VuZEN1cnJlbnRNZWRvaWRzKCk7Y29uc3Qgcz1uLmNhbGN1bGF0ZUN1cnJlbnRDb3N0KCk7czxvJiYobz1zLHRoaXMuQ2x1c3RlcnM9bi5DbHVzdGVycyx0aGlzLk1lZG9pZHM9ZSl9fXJldHVybiB0aGlzLmNhbGN1bGF0ZUN1cnJlbnRDb3N0KCk8cnx8KHRoaXMuQ2x1c3RlcnM9ZSx0aGlzLk1lZG9pZHM9dCx0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZD0hMCwhMSl9LHRoaXMuZ2V0Q2x1c3RlcmVkRGF0YT0oKT0+KHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkfHx0aGlzLnJ1blRvQ29tcGxldGlvbigpLHRoaXMuQ2x1c3RlcnMubWFwKCh0PT50LkVsZW1lbnRzLm1hcCgodD0+dC5FbGVtZW50KSkpKSksdGhpcy5ydW5Ub0NvbXBsZXRpb249KCk9Pntmb3IoO3RoaXMuaXRlcmF0ZSgpOyk7fSx0aGlzLmFsbG9jYXRlVG9DbHVzdGVyc0Fyb3VuZEN1cnJlbnRNZWRvaWRzPSgpPT57dGhpcy5DbHVzdGVycz1uZXcgQXJyYXksdGhpcy5NZWRvaWRzLmZvckVhY2goKHQ9Pnt0aGlzLkNsdXN0ZXJzLnB1c2gobmV3ICRvLkNsdXN0ZXIoe0VsZW1lbnRzOltdLE1lZG9pZDp0fSkpfSkpLHRoaXMuRWxlbWVudHMuZm9yRWFjaCgoKHQsZSk9Pntjb25zdCByPXRoaXMuZmluZERpc3RhbmNlcyh0aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5NZWRvaWQpKSx0KSxvPXIucmVkdWNlKCgodCxlLHIsbyk9PmU8b1t0XT9yOnQpLDApO3RoaXMuQ2x1c3RlcnNbb10uRWxlbWVudHMucHVzaCh7RGlzdGFuY2VGcm9tTWVkb2lkOnJbb10sRWxlbWVudDp0fSl9KSl9LHRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3Q9KCk9PnRoaXMuQ2x1c3RlcnMubWFwKCh0PT50LmdldENvc3QoKSkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCksdGhpcy5maW5kRGlzdGFuY2VzPSh0LGUpPT50Lm1hcCgodD0+dGhpcy5EaXN0YW5jZUZuKHQsZSkpKSx0aGlzLnNlbGVjdEluaXRpYWxNZWRvaWRzPSgpPT57aWYodGhpcy5LPj10aGlzLkVsZW1lbnRzLmxlbmd0aCl0aHJvdyBVby5rR3RFbGVtZW50QXJyTGVuZ3RoO2NvbnN0IHQ9W10sZT0odCxlKT0+e2Zvcihjb25zdCByIG9mIGUpaWYoMD09PXRoaXMuRGlzdGFuY2VGbihyLHQpKXJldHVybiExO3JldHVybiEwfTtsZXQgcj0wO2Zvcig7cjx0aGlzLkVsZW1lbnRzLmxlbmd0aCYmdC5sZW5ndGg8dGhpcy5LOyllKHRoaXMuRWxlbWVudHNbcl0sdCkmJnQucHVzaCh0aGlzLkVsZW1lbnRzW3JdKSxyKys7cmV0dXJuIHR9LHRoaXMuRGlzdGFuY2VGbj10aGlzLkRpc3RhbmNlRm58fERvLmRpc3RhbmNlLHRoaXMuTWVkb2lkcz10aGlzLnNlbGVjdEluaXRpYWxNZWRvaWRzKCksdGhpcy5JdGVyYXRpb25Db3VudD0wfWdldCBPcHRpbWlzYXRpb25TdGFydGVkKCl7cmV0dXJuIHRoaXMuSXRlcmF0aW9uQ291bnQ+MH19TG8uY2x1c3RlckVsZW1lbnRzPSh0LGUscik9PntMby5nZXRJbnN0YW5jZSh0LGUscik7cmV0dXJuIG5ldyBBcnJheX0sTG8uZ2V0SW5zdGFuY2U9KHQsZSxyKT0+bmV3IExvKHQsZSxyKTt2YXIgQm89TG8sR289T2JqZWN0LmRlZmluZVByb3BlcnR5KHtDbHVzdGVyZXI6Qm99LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxLbz1yKG8oKGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcih0KXtmb3IodmFyIHIgaW4gdCllLmhhc093blByb3BlcnR5KHIpfHwoZVtyXT10W3JdKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscigkbykscihHbyl9KSkpO2Z1bmN0aW9uIFdvKHQsZSl7bGV0IHI9MDtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKylyKz0odFtvXS1lW29dKSoodFtvXS1lW29dKTtyZXR1cm4gcn1jb25zdCBYbz17ZGlzdGFuY2VGdW5jdGlvbjpXb307ZnVuY3Rpb24gSm8odCxlLHI9WG8pe2NvbnN0IG89ci5kaXN0YW5jZUZ1bmN0aW9ufHxYby5kaXN0YW5jZUZ1bmN0aW9uLG49ci5zaW1pbGFyaXR5RnVuY3Rpb258fFhvLnNpbWlsYXJpdHlGdW5jdGlvbjtsZXQgcz0tMTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbil7bGV0IHI9TnVtYmVyLk1JTl9WQUxVRTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgaT1uKGUsdFtvXSk7aT5yJiYocj1pLHM9byl9fWVsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG8pdGhyb3cgbmV3IEVycm9yKCJBIHNpbWlsYXJpdHkgb3IgZGlzdGFuY2UgZnVuY3Rpb24gaXQncyByZXF1aXJlZCIpO3tsZXQgcj1OdW1iZXIuTUFYX1ZBTFVFO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPW8oZSx0W25dKTtpPHImJihyPWkscz1uKX19fXJldHVybiBzfWZ1bmN0aW9uIFlvKHQsZSxyLG8pe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXJbbl09Sm8oZSx0W25dLHtkaXN0YW5jZUZ1bmN0aW9uOm99KTtyZXR1cm4gcn1mdW5jdGlvbiBabyh0LGUpe2NvbnN0IHI9NjU1MzUmKHQ+Pj49MCk7cmV0dXJuKCh0LXIpKihlPj4+PTApPj4+MCkrciplPj4+MH1jbGFzcyBIb3tjb25zdHJ1Y3Rvcih0PURhdGUubm93KCkpe3RoaXMuc3RhdGU9bmV3IFVpbnQzMkFycmF5KDQpLHRoaXMuaW5pdCh0KSx0aGlzLnJhbmRvbT10aGlzLmdldEZsb2F0LmJpbmQodGhpcyl9Z2V0VWludDMyKCl7cmV0dXJuIHRoaXMubmV4dFN0YXRlKCksdGhpcy5zdGF0ZVszXSt0aGlzLnN0YXRlWzJdPj4+MH1nZXRGbG9hdCgpe3JldHVybiA1Ljk2MDQ2NDQ3NzUzOTA2M2UtOCoodGhpcy5nZXRVaW50MzIoKT4+PjgpfWluaXQodCl7aWYoIU51bWJlci5pc0ludGVnZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigic2VlZCBtdXN0IGJlIGFuIGludGVnZXIiKTt0aGlzLnN0YXRlWzBdPXQsdGhpcy5zdGF0ZVsxXT0wLHRoaXMuc3RhdGVbMl09MCx0aGlzLnN0YXRlWzNdPTA7Zm9yKGxldCB0PTE7dDw4O3QrKyl0aGlzLnN0YXRlWzMmdF1ePXQrWm8oMTgxMjQzMzI1Myx0aGlzLnN0YXRlW3QtMSYzXV50aGlzLnN0YXRlW3QtMSYzXT4+PjMwPj4+MCk+Pj4wO3RoaXMucGVyaW9kQ2VydGlmaWNhdGlvbigpO2ZvcihsZXQgdD0wO3Q8ODt0KyspdGhpcy5uZXh0U3RhdGUoKX1wZXJpb2RDZXJ0aWZpY2F0aW9uKCl7MD09PXRoaXMuc3RhdGVbMF0mJjA9PT10aGlzLnN0YXRlWzFdJiYwPT09dGhpcy5zdGF0ZVsyXSYmMD09PXRoaXMuc3RhdGVbM10mJih0aGlzLnN0YXRlWzBdPTg4LHRoaXMuc3RhdGVbMV09ODMsdGhpcy5zdGF0ZVsyXT02NSx0aGlzLnN0YXRlWzNdPTY4KX1uZXh0U3RhdGUoKXtsZXQgdD10aGlzLnN0YXRlWzBdO3RePXQ8PDE1LHRePXQ+Pj4xOCx0Xj10aGlzLnN0YXRlWzNdPDwxMSx0aGlzLnN0YXRlWzBdPXRoaXMuc3RhdGVbMV0sdGhpcy5zdGF0ZVsxXT10aGlzLnN0YXRlWzJdLHRoaXMuc3RhdGVbMl09dGhpcy5zdGF0ZVszXSx0aGlzLnN0YXRlWzNdPXR9fWZ1bmN0aW9uIFFvKHQsZT17fSxyPU1hdGgucmFuZG9tKXtjb25zdHtzaXplOm89MSxyZXBsYWNlOm49ITEscHJvYmFiaWxpdGllczpzfT1lO2xldCBpLHU7aWYoaT0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaChyKTtyZXR1cm4gZX0odCk6dC5zbGljZSgpLHMpe2lmKCFuKXRocm93IG5ldyBFcnJvcigiY2hvaWNlIHdpdGggcHJvYmFiaWxpdGllcyBhbmQgbm8gcmVwbGFjZW1lbnQgaXMgbm90IGltcGxlbWVudGVkIik7aWYocy5sZW5ndGghPT1pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSBsZW5ndGggb2YgcHJvYmFiaWxpdGllcyBvcHRpb24gc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgY2hvaWNlcyIpO3U9W3NbMF1dO2ZvcihsZXQgdD0xO3Q8cy5sZW5ndGg7dCsrKXVbdF09dVt0LTFdK3NbdF07aWYoTWF0aC5hYnMoMS11W3UubGVuZ3RoLTFdKT4xZS04KXRocm93IG5ldyBFcnJvcihgcHJvYmFiaWxpdGllcyBzaG91bGQgc3VtIHRvIDEsIGJ1dCBpbnN0ZWFkIHN1bXMgdG8gJHt1W3UubGVuZ3RoLTFdfWApfWlmKCExPT09biYmbz5pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNpemUgb3B0aW9uIGlzIHRvbyBsYXJnZSIpO2NvbnN0IGE9W107Zm9yKGxldCB0PTA7dDxvO3QrKyl7Y29uc3QgdD10bihpLmxlbmd0aCxyLHUpO2EucHVzaChpW3RdKSxufHxpLnNwbGljZSh0LDEpfXJldHVybiBhfWZ1bmN0aW9uIHRuKHQsZSxyKXtjb25zdCBvPWUoKTtpZihyKXtsZXQgdD0wO2Zvcig7bz5yW3RdOyl0Kys7cmV0dXJuIHR9cmV0dXJuIE1hdGguZmxvb3Iobyp0KX1jbGFzcyBlbntjb25zdHJ1Y3Rvcih0PU1hdGgucmFuZG9tKXtpZigibnVtYmVyIj09dHlwZW9mIHQpe2NvbnN0IGU9bmV3IEhvKHQpO3RoaXMucmFuZG9tR2VuZXJhdG9yPWUucmFuZG9tfWVsc2UgdGhpcy5yYW5kb21HZW5lcmF0b3I9dH1jaG9pY2UodCxlKXtyZXR1cm4gUW8odCxlLHRoaXMucmFuZG9tR2VuZXJhdG9yKX1yYW5kb20oKXtyZXR1cm4gdGhpcy5yYW5kb21HZW5lcmF0b3IoKX1yYW5kSW50KHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXQsdD0wKSx0K01hdGguZmxvb3IodGhpcy5yYW5kb21HZW5lcmF0b3IoKSooZS10KSl9cmFuZG9tU2FtcGxlKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2godGhpcy5yYW5kb20oKSk7cmV0dXJuIGV9fWZ1bmN0aW9uIHJuKHQsZSl7Y29uc3Qgcj1uZXcgcWUodC5yb3dzLGUucm93cyk7Zm9yKGxldCBvPTA7bzx0LnJvd3M7bysrKWZvcihsZXQgbj0wO248ZS5yb3dzO24rKylyLnNldChvLG4sV28odC5nZXRSb3cobyksZS5nZXRSb3cobikpKTtyZXR1cm4gcn1mdW5jdGlvbiBvbih0KXtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaChyKTtyZXR1cm4gZX1mdW5jdGlvbiBubih0KXtsZXQgZT1bdFswXV07Zm9yKGxldCByPTE7cjx0Lmxlbmd0aDtyKyspZVtyXT1lW3ItMV0rdFtyXTtyZXR1cm4gZX1jb25zdCBzbj1TeW1ib2woImRpc3RhbmNlIik7Y2xhc3MgdW57Y29uc3RydWN0b3IodCxlLHIsbyxuKXt0aGlzLmNsdXN0ZXJzPXQsdGhpcy5jZW50cm9pZHM9ZSx0aGlzLmNvbnZlcmdlZD1yLHRoaXMuaXRlcmF0aW9ucz1vLHRoaXNbc25dPW59bmVhcmVzdCh0KXtjb25zdCBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7cmV0dXJuIFlvKHQsdGhpcy5jZW50cm9pZHMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jZW50cm9pZH0pKSxlLHRoaXNbc25dKX1jb21wdXRlSW5mb3JtYXRpb24odCl7Zm9yKHZhciBlPXRoaXMuY2VudHJvaWRzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue2NlbnRyb2lkOnQsZXJyb3I6MCxzaXplOjB9fSkpLHI9MDtyPHQubGVuZ3RoO3IrKyllW3RoaXMuY2x1c3RlcnNbcl1dLmVycm9yKz10aGlzW3NuXSh0W3JdLHRoaXMuY2VudHJvaWRzW3RoaXMuY2x1c3RlcnNbcl1dKSxlW3RoaXMuY2x1c3RlcnNbcl1dLnNpemUrKztmb3IodmFyIG89MDtvPHRoaXMuY2VudHJvaWRzLmxlbmd0aDtvKyspZVtvXS5zaXplP2Vbb10uZXJyb3IvPWVbb10uc2l6ZTplW29dLmVycm9yPW51bGw7cmV0dXJuIG5ldyB1bih0aGlzLmNsdXN0ZXJzLGUsdGhpcy5jb252ZXJnZWQsdGhpcy5pdGVyYXRpb25zLHRoaXNbc25dKX19Y29uc3QgYW49e21heEl0ZXJhdGlvbnM6MTAwLHRvbGVyYW5jZToxZS02LHdpdGhJdGVyYXRpb25zOiExLGluaXRpYWxpemF0aW9uOiJrbWVhbnMrKyIsZGlzdGFuY2VGdW5jdGlvbjpXb307ZnVuY3Rpb24gaG4odCxlLHIsbyxuLHMpe3ZhciBpPWZ1bmN0aW9uKHQsZSxyLG8pe2NvbnN0IG49ZVswXS5sZW5ndGg7Zm9yKHZhciBzPW5ldyBBcnJheShvKSxpPW5ldyBBcnJheShvKSx1PTA7dTxvO3UrKyl7c1t1XT1uZXcgQXJyYXkobiksaVt1XT0wO2Zvcih2YXIgYT0wO2E8bjthKyspc1t1XVthXT0wfWZvcih2YXIgaD0wO2g8ZS5sZW5ndGg7aCsrKXtpW3JbaF1dKys7Zm9yKHZhciBsPTA7bDxuO2wrKylzW3JbaF1dW2xdKz1lW2hdW2xdfWZvcih2YXIgYz0wO2M8bztjKyspZm9yKHZhciBmPTA7ZjxuO2YrKylpW2NdP3NbY11bZl0vPWlbY106c1tjXVtmXT10W2NdW2ZdO3JldHVybiBzfSh0LGUscj1ZbyhlLHQscixuLmRpc3RhbmNlRnVuY3Rpb24pLG8pLHU9ZnVuY3Rpb24odCxlLHIsbyl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYocih0W25dLGVbbl0pPm8pcmV0dXJuITE7cmV0dXJuITB9KGksdCxuLmRpc3RhbmNlRnVuY3Rpb24sbi50b2xlcmFuY2UpO3JldHVybiBuZXcgdW4ocixpLHUscyxuLmRpc3RhbmNlRnVuY3Rpb24pfWZ1bmN0aW9uIGxuKHQsZSxyKXtpZihyPU9iamVjdC5hc3NpZ24oe30sYW4sciksZTw9MHx8ZT50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIoZSkpdGhyb3cgbmV3IEVycm9yKCJLIHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgcG9pbnRzIik7dmFyIG87aWYoQXJyYXkuaXNBcnJheShyLmluaXRpYWxpemF0aW9uKSl7aWYoci5pbml0aWFsaXphdGlvbi5sZW5ndGghPT1lKXRocm93IG5ldyBFcnJvcigiVGhlIGluaXRpYWwgY2VudGVycyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgSyIpO289ci5pbml0aWFsaXphdGlvbn1lbHNlIHN3aXRjaChyLmluaXRpYWxpemF0aW9uKXtjYXNlImttZWFucysrIjpvPWZ1bmN0aW9uKHQsZSxyPXt9KXtjb25zdCBvPSh0PW5ldyBxZSh0KSkucm93cyxuPW5ldyBlbihyLnNlZWQpLHM9W10saT1yLmxvY2FsVHJpYWxzfHwyK01hdGguZmxvb3IoTWF0aC5sb2coZSkpLHU9bi5yYW5kSW50KG8pO3MucHVzaCh0LmdldFJvdyh1KSk7bGV0IGE9bmV3IHFlKDEsdC5yb3dzKTtmb3IobGV0IGU9MDtlPHQucm93cztlKyspYS5zZXQoMCxlLFdvKHQuZ2V0Um93KGUpLHNbMF0pKTtsZXQgaD1bbm4oYS5nZXRSb3coMCkpXTtjb25zdCBsPTEvaFswXVtvLTFdO2xldCBjPXFlLm11bChhLGwpO2ZvcihsZXQgcj0xO3I8ZTtyKyspe2NvbnN0IGU9bi5jaG9pY2Uobyx7cmVwbGFjZTohMCxzaXplOmkscHJvYmFiaWxpdGllczpjWzBdfSksdT1ybih0LnNlbGVjdGlvbihlLG9uKHQuY29sdW1ucykpLHQpO2xldCBsLGYsbTtmb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCByPXFlLm1pbihhLFt1LmdldFJvdyh0KV0pLG89ci5zdW0oKTsodm9pZCAwPT09bHx8bzxmKSYmKGw9ZVt0XSxmPW8sbT1yKX1zW3JdPXQuZ2V0Um93KGwpLGE9bSxoPVtubihhLmdldFJvdygwKSldLGM9cWUubXVsKGEsMS9oWzBdW28tMV0pfXJldHVybiBzfSh0LGUscik7YnJlYWs7Y2FzZSJyYW5kb20iOm89ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuZXcgZW4ocikuY2hvaWNlKHQse3NpemU6ZX0pfSh0LGUsci5zZWVkKTticmVhaztjYXNlIm1vc3REaXN0YW50IjpvPWZ1bmN0aW9uKHQsZSxyLG8pe2NvbnN0IG49bmV3IGVuKG8pO3ZhciBzPW5ldyBBcnJheShlKTtpZihzWzBdPU1hdGguZmxvb3Iobi5yYW5kb20oKSp0Lmxlbmd0aCksZT4xKXtmb3IodmFyIGk9e2Rpc3Q6LTEsaW5kZXg6LTF9LHU9MDt1PHQubGVuZ3RoOysrdSlyW3NbMF1dW3VdPmkuZGlzdCYmKGkuZGlzdD1yW3NbMF1dW3VdLGkuaW5kZXg9dSk7aWYoc1sxXT1pLmluZGV4LGU+Milmb3IodmFyIGE9MjthPGU7KythKXtmb3IodmFyIGg9e2Rpc3Q6LTEsaW5kZXg6LTF9LGw9MDtsPHQubGVuZ3RoOysrbCl7Zm9yKHZhciBjPXtkaXN0Ok51bWJlci5NQVhfVkFMVUUsaW5kZXg6LTF9LGY9MDtmPGE7KytmKXJbZl1bbF08Yy5kaXN0JiYtMT09PXMuaW5kZXhPZihsKSYmKGM9e2Rpc3Q6cltmXVtsXSxpbmRleDpsfSk7Yy5kaXN0IT09TnVtYmVyLk1BWF9WQUxVRSYmYy5kaXN0PmguZGlzdCYmKGg9T2JqZWN0LmFzc2lnbih7fSxjKSl9c1thXT1oLmluZGV4fX1yZXR1cm4gcy5tYXAoKGU9PnRbZV0pKX0odCxlLGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPW5ldyBBcnJheSh0Lmxlbmd0aCksbz0wO288dC5sZW5ndGg7KytvKWZvcih2YXIgbj1vO248dC5sZW5ndGg7KytuKXtyW29dfHwocltvXT1uZXcgQXJyYXkodC5sZW5ndGgpKSxyW25dfHwocltuXT1uZXcgQXJyYXkodC5sZW5ndGgpKTtjb25zdCBzPWUodFtvXSx0W25dKTtyW29dW25dPXMscltuXVtvXT1zfXJldHVybiByfSh0LHIuZGlzdGFuY2VGdW5jdGlvbiksci5zZWVkKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5rbm93biBpbml0aWFsaXphdGlvbiBtZXRob2Q6ICIke3IuaW5pdGlhbGl6YXRpb259ImApfTA9PT1yLm1heEl0ZXJhdGlvbnMmJihyLm1heEl0ZXJhdGlvbnM9TnVtYmVyLk1BWF9WQUxVRSk7dmFyIG49bmV3IEFycmF5KHQubGVuZ3RoKTtpZihyLndpdGhJdGVyYXRpb25zKXJldHVybiBmdW5jdGlvbioodCxlLHIsbyxuKXtmb3IodmFyIHMsaT0hMSx1PTA7IWkmJnU8bi5tYXhJdGVyYXRpb25zOylzPWhuKHQsZSxyLG8sbiwrK3UpLHlpZWxkIHMuY29tcHV0ZUluZm9ybWF0aW9uKGUpLGk9cy5jb252ZXJnZWQsdD1zLmNlbnRyb2lkc30obyx0LG4sZSxyKTtmb3IodmFyIHMsaT0hMSx1PTA7IWkmJnU8ci5tYXhJdGVyYXRpb25zOylpPShzPWhuKG8sdCxuLGUsciwrK3UpKS5jb252ZXJnZWQsbz1zLmNlbnRyb2lkcztyZXR1cm4gcy5jb21wdXRlSW5mb3JtYXRpb24odCl9ZnVuY3Rpb24gY24odCxlPXt9KXtsZXQgcj1DdChlLCJrTnVtYmVyIik7cj15byhyKT96byhyKToyO2xldCBvLG49Q3QoZSwibW9kZSIpO2lmKCJrLW1lZG9pZHMiIT09biYmImstbWVhbnMiIT09biYmKG49ImstbWVkb2lkcyIpLCJrLW1lZG9pZHMiPT09bilvPWZ1bmN0aW9uKHQsZSl7bGV0IHI9e307ZnVuY3Rpb24gbyh0KXtyZXR1cm4gVm8odCwiOiIpfXZyKHQsKCh0LGUpPT57bGV0IG49byh0KTtyW25dPWV9KSk7bGV0IG49S28uQ2x1c3RlcmVyLmdldEluc3RhbmNlKHQsZSkuZ2V0Q2x1c3RlcmVkRGF0YSgpO3JldHVybiBuPWdvKG4sKHQ9PmdvKHQsKHQ9PntsZXQgZT1vKHQpO3JldHVybiByW2VdfSkpKSksbn0odCxyKTtlbHNle2lmKCJrLW1lYW5zIiE9PW4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG1vZGUiKTtvPWZ1bmN0aW9uKHQsZSl7bGV0IHI9bG4odCxlKSxvPXt9O3JldHVybiB2cihyLmNsdXN0ZXJzLCgodCxlKT0+e29bdF18fChvW3RdPVtdKSxvW3RdLnB1c2goZSl9KSksd28obyl9KHQscil9cmV0dXJuIG99ZnVuY3Rpb24gZm4odCxlPXt9KXtpZighZGUodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9Q3QoZSwia051bWJlciIpO3I9eW8ocik/em8ocik6MjtsZXQgbz1DdChlLCJuQ29tcE5JUEFMUyIpO289eW8obyk/em8obyk6MjtsZXQgbj1DdChlLCJtb2RlIikscz0iIixpPWxlKHQpLHU9MCxhPTA7aWYodnIodCwodD0+eyFmdW5jdGlvbih0KXtpZihnZSh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITA7cmV0dXJuITF9cmV0dXJuITF9KHQpP2RlKHQpJiYoYSs9MSk6dSs9MX0pKSx1PT09aSlzPSJvYmoiO2Vsc2V7aWYoYSE9PWkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvZiB0aGUgc2FtZSB0eXBlIik7cz0ibWF0In1sZXQgaCxsPW51bGw7Im9iaiI9PT1zPyhsPWZ1bmN0aW9uKHQpe2xldCBlPXt9O3ZyKHQsKHQ9Pnt2cih0LCgodCxyKT0+e2Vbcl18fChlW3JdPTApLDA9PT1lW3JdJiZ5byh0KSYmKGVbcl09MSksMSE9PWVbcl18fHlvKHQpfHwoZVtyXT0tMSl9KSl9KSk7bGV0IHI9W107cmV0dXJuIHZyKGUsKCh0LGUpPT57MT09PXQmJnIucHVzaChlKX0pKSxyfSh0KSxoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGdvKHQsKHQ9PntsZXQgcj12byh0LGUpO3JldHVybiB3byhyKX0pKX0odCxsKSk6aD10O2xldCBjPUplKGgse25Db21wTklQQUxTOm99KSxmPWNuKGMse2tOdW1iZXI6cixtb2RlOm59KSxtPWdvKGYsKHQ9PmdvKHQsKHQ9PmNbdF0pKSkpO3JldHVybntrZXlzOmwsZ2luZHM6ZixnbHRkdDpnbyhmLChlPT5nbyhlLChlPT50W2VdKSkpKSxnbWF0Om19fWxldCBXQ2x1c3Rlcj17UENBOmFzeW5jIGZ1bmN0aW9uKHQsZT17fSl7cmV0dXJuIEplKHQsZSl9LGNsdXN0ZXI6YXN5bmMgZnVuY3Rpb24odCxlPXt9KXt0cnl7cmV0dXJuIGZuKHQsZSl9Y2F0Y2godCl7cmV0dXJuIFByb21pc2UucmVqZWN0KHQpfX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0NsdXN0ZXIoLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0NsdXN0ZXIKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHBhcmVudFBvcnQub24oJ21lc3NhZ2UnLCByZWN2TWVzc2FnZSkKICAgICAgICAKCg==",Buffer.from(y,"base64").toString("utf8"));function p(){var c=l();function X(l){try{return new d.Worker(l,{eval:!0})}catch(d){I(d)}}var y=X(G);if(!y)return I("invalid worker"),null;function m(){y?(y.terminate(),y=void 0):I("worker has been terminated")}function K(){var d={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};y.postMessage(d)}function t(){var d=b(),l=Z(),X={mode:"call",id:l,fun:"PCA",input:Array.prototype.slice.call(arguments)};return y.postMessage(X),c.once(l,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function p(){var d=b(),l=Z(),X={mode:"call",id:l,fun:"cluster",input:Array.prototype.slice.call(arguments)};return y.postMessage(X),c.once(l,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function o(d){var l=d,b=l.mode;"emit"!==b&&"return"!==b||("emit"===b&&c.emit(l.evName,l.msg),"return"===b&&c.emit(l.id,l))}function I(d){c.emit("error",d)}return y.on("message",o),y.on("error",I),K(Array.prototype.slice.call(arguments)),c.PCA=t,c.cluster=p,c.terminate=m,c}var o,I,h={PCA:(I=X(K.mark((function d(){var l,b,Z,X=arguments;return K.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return l=Array.prototype.slice.call(X),b=p(),d.next=4,b.PCA.apply(b,c(l)).finally((function(){b.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return I.apply(this,arguments)}),cluster:(o=X(K.mark((function d(){var l,b,Z,X=arguments;return K.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return l=Array.prototype.slice.call(X),b=p(),d.next=4,b.cluster.apply(b,c(l)).finally((function(){b.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return o.apply(this,arguments)})};for(var W in m=l(),h){var i=h[W];m[W]=i}}(),m}(c.default)})),G=X((function(d,l){d.exports=function(){function d(d,l){(null==l||l>d.length)&&(l=d.length);for(var c=0,b=new Array(l);c<l;c++)b[c]=d[c];return b}function l(l){return function(l){if(Array.isArray(l))return d(l)}(l)||function(d){if("undefined"!=typeof Symbol&&null!=d[Symbol.iterator]||null!=d["@@iterator"])return Array.from(d)}(l)||function(l,c){if(l){if("string"==typeof l)return d(l,c);var b=Object.prototype.toString.call(l).slice(8,-1);return"Object"===b&&l.constructor&&(b=l.constructor.name),"Map"===b||"Set"===b?Array.from(l):"Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b)?d(l,c):void 0}}(l)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(d,l,c,b,Z,X,y){try{var G=d[X](y),m=G.value}catch(d){return void c(d)}G.done?l(m):Promise.resolve(m).then(b,Z)}function X(d){return function(){var l=this,b=arguments;return new Promise((function(Z,X){var y=d.apply(l,b);function G(d){c(y,Z,X,G,m,"next",d)}function m(d){c(y,Z,X,G,m,"throw",d)}G(void 0)}))}}function y(d){return(y="function"==typeof Symbol&&"symbol"==b(Symbol.iterator)?function(d){return b(d)}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":b(d)})(d)}var G="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==Z?Z:"undefined"!=typeof self?self:{};function m(d){var l={exports:{}};return d(l,l.exports),l.exports}var K,t=m((function(d){var l=function(d){var l,c=Object.prototype,b=c.hasOwnProperty,Z="function"==typeof Symbol?Symbol:{},X=Z.iterator||"@@iterator",G=Z.asyncIterator||"@@asyncIterator",m=Z.toStringTag||"@@toStringTag";function K(d,l,c){return Object.defineProperty(d,l,{value:c,enumerable:!0,configurable:!0,writable:!0}),d[l]}try{K({},"")}catch(d){K=function(d,l,c){return d[l]=c}}function t(d,l,c,b){var Z=l&&l.prototype instanceof u?l:u,X=Object.create(Z.prototype),y=new R(b||[]);return X._invoke=function(d,l,c){var b=o;return function(Z,X){if(b===h)throw new Error("Generator is already running");if(b===W){if("throw"===Z)throw X;return T()}for(c.method=Z,c.arg=X;;){var y=c.delegate;if(y){var G=S(y,c);if(G){if(G===i)continue;return G}}if("next"===c.method)c.sent=c._sent=c.arg;else if("throw"===c.method){if(b===o)throw b=W,c.arg;c.dispatchException(c.arg)}else"return"===c.method&&c.abrupt("return",c.arg);b=h;var m=p(d,l,c);if("normal"===m.type){if(b=c.done?W:I,m.arg===i)continue;return{value:m.arg,done:c.done}}"throw"===m.type&&(b=W,c.method="throw",c.arg=m.arg)}}}(d,c,y),X}function p(d,l,c){try{return{type:"normal",arg:d.call(l,c)}}catch(d){return{type:"throw",arg:d}}}d.wrap=t;var o="suspendedStart",I="suspendedYield",h="executing",W="completed",i={};function u(){}function V(){}function s(){}var H={};H[X]=function(){return this};var n=Object.getPrototypeOf,C=n&&n(n(z([])));C&&C!==c&&b.call(C,X)&&(H=C);var L=s.prototype=u.prototype=Object.create(H);function a(d){["next","throw","return"].forEach((function(l){K(d,l,(function(d){return this._invoke(l,d)}))}))}function x(d,l){function c(Z,X,G,m){var K=p(d[Z],d,X);if("throw"!==K.type){var t=K.arg,o=t.value;return o&&"object"===y(o)&&b.call(o,"__await")?l.resolve(o.__await).then((function(d){c("next",d,G,m)}),(function(d){c("throw",d,G,m)})):l.resolve(o).then((function(d){t.value=d,G(t)}),(function(d){return c("throw",d,G,m)}))}m(K.arg)}var Z;this._invoke=function(d,b){function X(){return new l((function(l,Z){c(d,b,l,Z)}))}return Z=Z?Z.then(X,X):X()}}function S(d,c){var b=d.iterator[c.method];if(b===l){if(c.delegate=null,"throw"===c.method){if(d.iterator.return&&(c.method="return",c.arg=l,S(d,c),"throw"===c.method))return i;c.method="throw",c.arg=new TypeError("The iterator does not provide a 'throw' method")}return i}var Z=p(b,d.iterator,c.arg);if("throw"===Z.type)return c.method="throw",c.arg=Z.arg,c.delegate=null,i;var X=Z.arg;return X?X.done?(c[d.resultName]=X.value,c.next=d.nextLoc,"return"!==c.method&&(c.method="next",c.arg=l),c.delegate=null,i):X:(c.method="throw",c.arg=new TypeError("iterator result is not an object"),c.delegate=null,i)}function Y(d){var l={tryLoc:d[0]};1 in d&&(l.catchLoc=d[1]),2 in d&&(l.finallyLoc=d[2],l.afterLoc=d[3]),this.tryEntries.push(l)}function g(d){var l=d.completion||{};l.type="normal",delete l.arg,d.completion=l}function R(d){this.tryEntries=[{tryLoc:"root"}],d.forEach(Y,this),this.reset(!0)}function z(d){if(d){var c=d[X];if(c)return c.call(d);if("function"==typeof d.next)return d;if(!isNaN(d.length)){var Z=-1,y=function c(){for(;++Z<d.length;)if(b.call(d,Z))return c.value=d[Z],c.done=!1,c;return c.value=l,c.done=!0,c};return y.next=y}}return{next:T}}function T(){return{value:l,done:!0}}return V.prototype=L.constructor=s,s.constructor=V,V.displayName=K(s,m,"GeneratorFunction"),d.isGeneratorFunction=function(d){var l="function"==typeof d&&d.constructor;return!!l&&(l===V||"GeneratorFunction"===(l.displayName||l.name))},d.mark=function(d){return Object.setPrototypeOf?Object.setPrototypeOf(d,s):(d.__proto__=s,K(d,m,"GeneratorFunction")),d.prototype=Object.create(L),d},d.awrap=function(d){return{__await:d}},a(x.prototype),x.prototype[G]=function(){return this},d.AsyncIterator=x,d.async=function(l,c,b,Z,X){void 0===X&&(X=Promise);var y=new x(t(l,c,b,Z),X);return d.isGeneratorFunction(c)?y:y.next().then((function(d){return d.done?d.value:y.next()}))},a(L),K(L,m,"Generator"),L[X]=function(){return this},L.toString=function(){return"[object Generator]"},d.keys=function(d){var l=[];for(var c in d)l.push(c);return l.reverse(),function c(){for(;l.length;){var b=l.pop();if(b in d)return c.value=b,c.done=!1,c}return c.done=!0,c}},d.values=z,R.prototype={constructor:R,reset:function(d){if(this.prev=0,this.next=0,this.sent=this._sent=l,this.done=!1,this.delegate=null,this.method="next",this.arg=l,this.tryEntries.forEach(g),!d)for(var c in this)"t"===c.charAt(0)&&b.call(this,c)&&!isNaN(+c.slice(1))&&(this[c]=l)},stop:function(){this.done=!0;var d=this.tryEntries[0].completion;if("throw"===d.type)throw d.arg;return this.rval},dispatchException:function(d){if(this.done)throw d;var c=this;function Z(b,Z){return G.type="throw",G.arg=d,c.next=b,Z&&(c.method="next",c.arg=l),!!Z}for(var X=this.tryEntries.length-1;X>=0;--X){var y=this.tryEntries[X],G=y.completion;if("root"===y.tryLoc)return Z("end");if(y.tryLoc<=this.prev){var m=b.call(y,"catchLoc"),K=b.call(y,"finallyLoc");if(m&&K){if(this.prev<y.catchLoc)return Z(y.catchLoc,!0);if(this.prev<y.finallyLoc)return Z(y.finallyLoc)}else if(m){if(this.prev<y.catchLoc)return Z(y.catchLoc,!0)}else{if(!K)throw new Error("try statement without catch or finally");if(this.prev<y.finallyLoc)return Z(y.finallyLoc)}}}},abrupt:function(d,l){for(var c=this.tryEntries.length-1;c>=0;--c){var Z=this.tryEntries[c];if(Z.tryLoc<=this.prev&&b.call(Z,"finallyLoc")&&this.prev<Z.finallyLoc){var X=Z;break}}X&&("break"===d||"continue"===d)&&X.tryLoc<=l&&l<=X.finallyLoc&&(X=null);var y=X?X.completion:{};return y.type=d,y.arg=l,X?(this.method="next",this.next=X.finallyLoc,i):this.complete(y)},complete:function(d,l){if("throw"===d.type)throw d.arg;return"break"===d.type||"continue"===d.type?this.next=d.arg:"return"===d.type?(this.rval=this.arg=d.arg,this.method="return",this.next="end"):"normal"===d.type&&l&&(this.next=l),i},finish:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var c=this.tryEntries[l];if(c.finallyLoc===d)return this.complete(c.completion,c.afterLoc),g(c),i}},catch:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var c=this.tryEntries[l];if(c.tryLoc===d){var b=c.completion;if("throw"===b.type){var Z=b.arg;g(c)}return Z}}throw new Error("illegal catch attempt")},delegateYield:function(d,c,b){return this.delegate={iterator:z(d),resultName:c,nextLoc:b},"next"===this.method&&(this.arg=l),i}},d}(d.exports);try{regeneratorRuntime=l}catch(d){Function("r","regeneratorRuntime = r")(l)}})),p=m((function(d,l){!function(l,c){d.exports=function(l){var c,b=(l=l||{}).Base64,Z="2.6.4",X="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",y=function(d){for(var l={},c=0,b=d.length;c<b;c++)l[d.charAt(c)]=c;return l}(X),G=String.fromCharCode,m=function(d){if(d.length<2)return(l=d.charCodeAt(0))<128?d:l<2048?G(192|l>>>6)+G(128|63&l):G(224|l>>>12&15)+G(128|l>>>6&63)+G(128|63&l);var l=65536+1024*(d.charCodeAt(0)-55296)+(d.charCodeAt(1)-56320);return G(240|l>>>18&7)+G(128|l>>>12&63)+G(128|l>>>6&63)+G(128|63&l)},K=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,t=function(d){return d.replace(K,m)},p=function(d){var l=[0,2,1][d.length%3],c=d.charCodeAt(0)<<16|(d.length>1?d.charCodeAt(1):0)<<8|(d.length>2?d.charCodeAt(2):0);return[X.charAt(c>>>18),X.charAt(c>>>12&63),l>=2?"=":X.charAt(c>>>6&63),l>=1?"=":X.charAt(63&c)].join("")},o=l.btoa&&"function"==typeof l.btoa?function(d){return l.btoa(d)}:function(d){if(d.match(/[^\x00-\xFF]/))throw new RangeError("The string contains invalid characters.");return d.replace(/[\s\S]{1,3}/g,p)},I=function(d){return o(t(String(d)))},h=function(d){return d.replace(/[+\/]/g,(function(d){return"+"==d?"-":"_"})).replace(/=/g,"")},W=function(d,l){return l?h(I(d)):I(d)},i=function(d){return W(d,!0)};l.Uint8Array&&(c=function(d,l){for(var c="",b=0,Z=d.length;b<Z;b+=3){var y=d[b],G=d[b+1],m=d[b+2],K=y<<16|G<<8|m;c+=X.charAt(K>>>18)+X.charAt(K>>>12&63)+(void 0!==G?X.charAt(K>>>6&63):"=")+(void 0!==m?X.charAt(63&K):"=")}return l?h(c):c});var u,V=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,s=function(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 G(55296+(l>>>10))+G(56320+(1023&l));case 3:return G((15&d.charCodeAt(0))<<12|(63&d.charCodeAt(1))<<6|63&d.charCodeAt(2));default:return G((31&d.charCodeAt(0))<<6|63&d.charCodeAt(1))}},H=function(d){return d.replace(V,s)},n=function(d){var l=d.length,c=l%4,b=(l>0?y[d.charAt(0)]<<18:0)|(l>1?y[d.charAt(1)]<<12:0)|(l>2?y[d.charAt(2)]<<6:0)|(l>3?y[d.charAt(3)]:0),Z=[G(b>>>16),G(b>>>8&255),G(255&b)];return Z.length-=[0,0,2,1][c],Z.join("")},C=l.atob&&"function"==typeof l.atob?function(d){return l.atob(d)}:function(d){return d.replace(/\S{1,4}/g,n)},L=function(d){return C(String(d).replace(/[^A-Za-z0-9\+\/]/g,""))},a=function(d){return H(C(d))},x=function(d){return String(d).replace(/[-_]/g,(function(d){return"-"==d?"+":"/"})).replace(/[^A-Za-z0-9\+\/]/g,"")},S=function(d){return a(x(d))};l.Uint8Array&&(u=function(d){return Uint8Array.from(L(x(d)),(function(d){return d.charCodeAt(0)}))});var Y=function(){var d=l.Base64;return l.Base64=b,d};if(l.Base64={VERSION:Z,atob:L,btoa:o,fromBase64:S,toBase64:W,utob:t,encode:W,encodeURI:i,btou:H,decode:S,noConflict:Y,fromUint8Array:c,toUint8Array:u},"function"==typeof Object.defineProperty){var g=function(d){return{value:d,enumerable:!1,writable:!0,configurable:!0}};l.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",g((function(){return S(this)}))),Object.defineProperty(String.prototype,"toBase64",g((function(d){return W(this,d)}))),Object.defineProperty(String.prototype,"toBase64URI",g((function(){return W(this,!0)})))}}return l.Meteor&&(Base64=l.Base64),d.exports&&(d.exports.Base64=l.Base64),{Base64:l.Base64}}(l)}("undefined"!=typeof self?self:"undefined"!=typeof window?window:G)})),o=m((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,y){if("function"!=typeof b)throw new TypeError("The listener must be a function");var G=new Z(b,X||d,y),m=c?c+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],G]:d._events[m].push(G):(d._events[m]=G,d._eventsCount++),d}function y(d,l){0==--d._eventsCount?d._events=new b:delete d._events[l]}function G(){this._events=new b,this._eventsCount=0}Object.create&&(b.prototype=Object.create(null),(new b).__proto__||(c=!1)),G.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},G.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,y=new Array(X);Z<X;Z++)y[Z]=b[Z].fn;return y},G.prototype.listenerCount=function(d){var l=c?c+d:d,b=this._events[l];return b?b.fn?1:b.length:0},G.prototype.emit=function(d,l,b,Z,X,y){var G=c?c+d:d;if(!this._events[G])return!1;var m,K,t=this._events[G],p=arguments.length;if(t.fn){switch(t.once&&this.removeListener(d,t.fn,void 0,!0),p){case 1:return t.fn.call(t.context),!0;case 2:return t.fn.call(t.context,l),!0;case 3:return t.fn.call(t.context,l,b),!0;case 4:return t.fn.call(t.context,l,b,Z),!0;case 5:return t.fn.call(t.context,l,b,Z,X),!0;case 6:return t.fn.call(t.context,l,b,Z,X,y),!0}for(K=1,m=new Array(p-1);K<p;K++)m[K-1]=arguments[K];t.fn.apply(t.context,m)}else{var o,I=t.length;for(K=0;K<I;K++)switch(t[K].once&&this.removeListener(d,t[K].fn,void 0,!0),p){case 1:t[K].fn.call(t[K].context);break;case 2:t[K].fn.call(t[K].context,l);break;case 3:t[K].fn.call(t[K].context,l,b);break;case 4:t[K].fn.call(t[K].context,l,b,Z);break;default:if(!m)for(o=1,m=new Array(p-1);o<p;o++)m[o-1]=arguments[o];t[K].fn.apply(t[K].context,m)}}return!0},G.prototype.on=function(d,l,c){return X(this,d,l,c,!1)},G.prototype.once=function(d,l,c){return X(this,d,l,c,!0)},G.prototype.removeListener=function(d,l,b,Z){var X=c?c+d:d;if(!this._events[X])return this;if(!l)return y(this,X),this;var G=this._events[X];if(G.fn)G.fn!==l||Z&&!G.once||b&&G.context!==b||y(this,X);else{for(var m=0,K=[],t=G.length;m<t;m++)(G[m].fn!==l||Z&&!G[m].once||b&&G[m].context!==b)&&K.push(G[m]);K.length?this._events[X]=1===K.length?K[0]:K:y(this,X)}return this},G.prototype.removeAllListeners=function(d){var l;return d?(l=c?c+d:d,this._events[l]&&y(this,l)):(this._events=new b,this._eventsCount=0),this},G.prototype.off=G.prototype.removeListener,G.prototype.addListener=G.prototype.on,G.prefixed=c,G.EventEmitter=G,d.exports=G}));return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function d(){return new o}function c(){var d,l,c=new Promise((function(){d=arguments[0],l=arguments[1]}));return c.resolve=d,c.reject=l,c}function b(){for(var d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=c.length,Z=0;Z<d;Z++)l[Z]=c[0|Math.random()*b];return l.join("")}var Z,y=(Z="CgoKdmFyIHQ9QXJyYXkuaXNBcnJheSxlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fWZ1bmN0aW9uIG8odCl7dmFyIGU9e2V4cG9ydHM6e319O3JldHVybiB0KGUsZS5leHBvcnRzKSxlLmV4cG9ydHN9dmFyIG49Im9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLk9iamVjdD09PU9iamVjdCYmZSxzPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsaT1ufHxzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHU9aS5TeW1ib2wsYT1PYmplY3QucHJvdG90eXBlLGg9YS5oYXNPd25Qcm9wZXJ0eSxsPWEudG9TdHJpbmcsYz11P3UudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBmPWZ1bmN0aW9uKHQpe3ZhciBlPWguY2FsbCh0LGMpLHI9dFtjXTt0cnl7dFtjXT12b2lkIDA7dmFyIG89ITB9Y2F0Y2godCl7fXZhciBuPWwuY2FsbCh0KTtyZXR1cm4gbyYmKGU/dFtjXT1yOmRlbGV0ZSB0W2NdKSxufSxtPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIGc9ZnVuY3Rpb24odCl7cmV0dXJuIG0uY2FsbCh0KX0scD11P3UudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciB3PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOnAmJnAgaW4gT2JqZWN0KHQpP2YodCk6Zyh0KX07dmFyIGQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH07dmFyIGI9ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxkKHQpJiYiW29iamVjdCBTeW1ib2xdIj09dyh0KX0seT0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyx2PS9eXHcqJC87dmFyIE09ZnVuY3Rpb24oZSxyKXtpZih0KGUpKXJldHVybiExO3ZhciBvPXR5cGVvZiBlO3JldHVybiEoIm51bWJlciIhPW8mJiJzeW1ib2wiIT1vJiYiYm9vbGVhbiIhPW8mJm51bGwhPWUmJiFiKGUpKXx8KHYudGVzdChlKXx8IXkudGVzdChlKXx8bnVsbCE9ciYmZSBpbiBPYmplY3QocikpfTt2YXIgeD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX07dmFyIEUsUz1mdW5jdGlvbih0KXtpZigheCh0KSlyZXR1cm4hMTt2YXIgZT13KHQpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgUHJveHldIj09ZX0saj1pWyJfX2NvcmUtanNfc2hhcmVkX18iXSxfPShFPS9bXi5dKyQvLmV4ZWMoaiYmai5rZXlzJiZqLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIitFOiIiO3ZhciBBPWZ1bmN0aW9uKHQpe3JldHVybiEhXyYmXyBpbiB0fSxDPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzt2YXIgUj1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIEMuY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9LEk9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8saz1GdW5jdGlvbi5wcm90b3R5cGUsTj1PYmplY3QucHJvdG90eXBlLE89ay50b1N0cmluZyxGPU4uaGFzT3duUHJvcGVydHksej1SZWdFeHAoIl4iK08uY2FsbChGKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgVD1mdW5jdGlvbih0KXtyZXR1cm4hKCF4KHQpfHxBKHQpKSYmKFModCk/ejpJKS50ZXN0KFIodCkpfTt2YXIgVj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfTt2YXIgUD1mdW5jdGlvbih0LGUpe3ZhciByPVYodCxlKTtyZXR1cm4gVChyKT9yOnZvaWQgMH0scT1QKE9iamVjdCwiY3JlYXRlIik7dmFyICQ9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPXE/cShudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIEQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgTD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKHEpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gVS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LEI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgRz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBxP3ZvaWQgMCE9PWVbdF06Qi5jYWxsKGUsdCl9O3ZhciBLPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1xJiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O2Z1bmN0aW9uIFcodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBvPXRbZV07dGhpcy5zZXQob1swXSxvWzFdKX19Vy5wcm90b3R5cGUuY2xlYXI9JCxXLnByb3RvdHlwZS5kZWxldGU9RCxXLnByb3RvdHlwZS5nZXQ9TCxXLnByb3RvdHlwZS5oYXM9RyxXLnByb3RvdHlwZS5zZXQ9Szt2YXIgWD1XO3ZhciBKPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIFk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9O3ZhciBaPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoO3ItLTspaWYoWSh0W3JdWzBdLGUpKXJldHVybiByO3JldHVybi0xfSxIPUFycmF5LnByb3RvdHlwZS5zcGxpY2U7dmFyIFE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPVooZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6SC5jYWxsKGUsciwxKSwtLXRoaXMuc2l6ZSwhMCl9O3ZhciB0dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9WihlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19O3ZhciBldD1mdW5jdGlvbih0KXtyZXR1cm4gWih0aGlzLl9fZGF0YV9fLHQpPi0xfTt2YXIgcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG89WihyLHQpO3JldHVybiBvPDA/KCsrdGhpcy5zaXplLHIucHVzaChbdCxlXSkpOnJbb11bMV09ZSx0aGlzfTtmdW5jdGlvbiBvdCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG89dFtlXTt0aGlzLnNldChvWzBdLG9bMV0pfX1vdC5wcm90b3R5cGUuY2xlYXI9SixvdC5wcm90b3R5cGUuZGVsZXRlPVEsb3QucHJvdG90eXBlLmdldD10dCxvdC5wcm90b3R5cGUuaGFzPWV0LG90LnByb3RvdHlwZS5zZXQ9cnQ7dmFyIG50PW90LHN0PVAoaSwiTWFwIik7dmFyIGl0PWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgWCxtYXA6bmV3KHN0fHxudCksc3RyaW5nOm5ldyBYfX07dmFyIHV0PWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9O3ZhciBhdD1mdW5jdGlvbih0LGUpe3ZhciByPXQuX19kYXRhX187cmV0dXJuIHV0KGUpP3JbInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06ci5tYXB9O3ZhciBodD1mdW5jdGlvbih0KXt2YXIgZT1hdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfTt2YXIgbHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGF0KHRoaXMsdCkuZ2V0KHQpfTt2YXIgY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGF0KHRoaXMsdCkuaGFzKHQpfTt2YXIgZnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1hdCh0aGlzLHQpLG89ci5zaXplO3JldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZSs9ci5zaXplPT1vPzA6MSx0aGlzfTtmdW5jdGlvbiBtdCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG89dFtlXTt0aGlzLnNldChvWzBdLG9bMV0pfX1tdC5wcm90b3R5cGUuY2xlYXI9aXQsbXQucHJvdG90eXBlLmRlbGV0ZT1odCxtdC5wcm90b3R5cGUuZ2V0PWx0LG10LnByb3RvdHlwZS5oYXM9Y3QsbXQucHJvdG90eXBlLnNldD1mdDt2YXIgZ3Q9bXQ7ZnVuY3Rpb24gcHQodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciByPWZ1bmN0aW9uKCl7dmFyIG89YXJndW1lbnRzLG49ZT9lLmFwcGx5KHRoaXMsbyk6b1swXSxzPXIuY2FjaGU7aWYocy5oYXMobikpcmV0dXJuIHMuZ2V0KG4pO3ZhciBpPXQuYXBwbHkodGhpcyxvKTtyZXR1cm4gci5jYWNoZT1zLnNldChuLGkpfHxzLGl9O3JldHVybiByLmNhY2hlPW5ldyhwdC5DYWNoZXx8Z3QpLHJ9cHQuQ2FjaGU9Z3Q7dmFyIHd0PXB0O3ZhciBkdD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxidD0vXFwoXFwpPy9nLHl0PWZ1bmN0aW9uKHQpe3ZhciBlPXd0KHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1yLnNpemUmJnIuY2xlYXIoKSx0fSkpLHI9ZS5jYWNoZTtyZXR1cm4gZX0oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoZHQsKGZ1bmN0aW9uKHQscixvLG4pe2UucHVzaChvP24ucmVwbGFjZShidCwiJDEiKTpyfHx0KX0pKSxlfSkpO3ZhciB2dD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aCxuPUFycmF5KG8pOysrcjxvOyluW3JdPWUodFtyXSxyLHQpO3JldHVybiBufSxNdD11P3UucHJvdG90eXBlOnZvaWQgMCx4dD1NdD9NdC50b1N0cmluZzp2b2lkIDA7dmFyIEV0PWZ1bmN0aW9uIGUocil7aWYoInN0cmluZyI9PXR5cGVvZiByKXJldHVybiByO2lmKHQocikpcmV0dXJuIHZ0KHIsZSkrIiI7aWYoYihyKSlyZXR1cm4geHQ/eHQuY2FsbChyKToiIjt2YXIgbz1yKyIiO3JldHVybiIwIj09byYmMS9yPT0tSW5maW5pdHk/Ii0wIjpvfTt2YXIgU3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6RXQodCl9O3ZhciBqdD1mdW5jdGlvbihlLHIpe3JldHVybiB0KGUpP2U6TShlLHIpP1tlXTp5dChTdChlKSl9O3ZhciBfdD1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fGIodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX07dmFyIEF0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbz0oZT1qdChlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxvOyl0PXRbX3QoZVtyKytdKV07cmV0dXJuIHImJnI9PW8/dDp2b2lkIDB9O3ZhciBDdD1mdW5jdGlvbih0LGUscil7dmFyIG89bnVsbD09dD92b2lkIDA6QXQodCxlKTtyZXR1cm4gdm9pZCAwPT09bz9yOm99LFJ0PU9iamVjdC5wcm90b3R5cGU7dmFyIEl0PWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxSdCl9O3ZhciBrdD1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdChlKHIpKX19KE9iamVjdC5rZXlzLE9iamVjdCksTnQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgT3Q9ZnVuY3Rpb24odCl7aWYoIUl0KHQpKXJldHVybiBrdCh0KTt2YXIgZT1bXTtmb3IodmFyIHIgaW4gT2JqZWN0KHQpKU50LmNhbGwodCxyKSYmImNvbnN0cnVjdG9yIiE9ciYmZS5wdXNoKHIpO3JldHVybiBlfSxGdD1QKGksIkRhdGFWaWV3IiksenQ9UChpLCJQcm9taXNlIiksVHQ9UChpLCJTZXQiKSxWdD1QKGksIldlYWtNYXAiKSxQdD1SKEZ0KSxxdD1SKHN0KSwkdD1SKHp0KSxEdD1SKFR0KSxVdD1SKFZ0KSxMdD13OyhGdCYmIltvYmplY3QgRGF0YVZpZXddIiE9THQobmV3IEZ0KG5ldyBBcnJheUJ1ZmZlcigxKSkpfHxzdCYmIltvYmplY3QgTWFwXSIhPUx0KG5ldyBzdCl8fHp0JiYiW29iamVjdCBQcm9taXNlXSIhPUx0KHp0LnJlc29sdmUoKSl8fFR0JiYiW29iamVjdCBTZXRdIiE9THQobmV3IFR0KXx8VnQmJiJbb2JqZWN0IFdlYWtNYXBdIiE9THQobmV3IFZ0KSkmJihMdD1mdW5jdGlvbih0KXt2YXIgZT13KHQpLHI9IltvYmplY3QgT2JqZWN0XSI9PWU/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAsbz1yP1Iocik6IiI7aWYobylzd2l0Y2gobyl7Y2FzZSBQdDpyZXR1cm4iW29iamVjdCBEYXRhVmlld10iO2Nhc2UgcXQ6cmV0dXJuIltvYmplY3QgTWFwXSI7Y2FzZSAkdDpyZXR1cm4iW29iamVjdCBQcm9taXNlXSI7Y2FzZSBEdDpyZXR1cm4iW29iamVjdCBTZXRdIjtjYXNlIFV0OnJldHVybiJbb2JqZWN0IFdlYWtNYXBdIn1yZXR1cm4gZX0pO3ZhciBCdD1MdDt2YXIgR3Q9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PTkwMDcxOTkyNTQ3NDA5OTF9O3ZhciBLdD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmR3QodC5sZW5ndGgpJiYhUyh0KX07dmFyIFd0PWZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8IXQoZSkmJmQoZSkmJiJbb2JqZWN0IFN0cmluZ10iPT13KGUpfTt2YXIgWHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3ZvaWQgMDplW3RdfX0sSnQ9WHQoImxlbmd0aCIpLFl0PVJlZ0V4cCgiW1xcdTIwMGRcXHVkODAwLVxcdWRmZmZcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZcXHVmZTBlXFx1ZmUwZl0iKTt2YXIgWnQ9ZnVuY3Rpb24odCl7cmV0dXJuIFl0LnRlc3QodCl9LEh0PSJbXFx1ZDgwMC1cXHVkZmZmXSIsUXQ9IltcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZdIix0ZT0iXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdIixlZT0iW15cXHVkODAwLVxcdWRmZmZdIixyZT0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIsb2U9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLG5lPSIoPzoiK1F0KyJ8Iit0ZSsiKSIrIj8iLHNlPSJbXFx1ZmUwZVxcdWZlMGZdPyIrbmUrKCIoPzpcXHUyMDBkKD86IitbZWUscmUsb2VdLmpvaW4oInwiKSsiKVtcXHVmZTBlXFx1ZmUwZl0/IituZSsiKSoiKSxpZT0iKD86IitbZWUrUXQrIj8iLFF0LHJlLG9lLEh0XS5qb2luKCJ8IikrIikiLHVlPVJlZ0V4cCh0ZSsiKD89Iit0ZSsiKXwiK2llK3NlLCJnIik7dmFyIGFlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT11ZS5sYXN0SW5kZXg9MDt1ZS50ZXN0KHQpOykrK2U7cmV0dXJuIGV9O3ZhciBoZT1mdW5jdGlvbih0KXtyZXR1cm4gWnQodCk/YWUodCk6SnQodCl9O3ZhciBsZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKEt0KHQpKXJldHVybiBXdCh0KT9oZSh0KTp0Lmxlbmd0aDt2YXIgZT1CdCh0KTtyZXR1cm4iW29iamVjdCBNYXBdIj09ZXx8IltvYmplY3QgU2V0XSI9PWU/dC5zaXplOk90KHQpLmxlbmd0aH07dmFyIGNlPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8ZCh0KSYmIltvYmplY3QgTnVtYmVyXSI9PXcodCl9O3ZhciBmZT1mdW5jdGlvbih0KXtyZXR1cm4hMD09PXR8fCExPT09dHx8ZCh0KSYmIltvYmplY3QgQm9vbGVhbl0iPT13KHQpfTtmdW5jdGlvbiBtZSh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGdlKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHBlKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHdlKHQpe3JldHVybiEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZihnZSh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hKCFwZSh0KXx8IiIhPT10KX0odCl8fCEhZnVuY3Rpb24odCl7cmV0dXJuISFtZSh0KSYmMD09PXQubGVuZ3RofSh0KSkpKX1mdW5jdGlvbiBkZSh0KXtyZXR1cm4hIW1lKHQpJiYoMCE9PXQubGVuZ3RoJiYoMSE9PXQubGVuZ3RofHwhd2UodFswXSkpKX1jb25zdCBiZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIHllKHQpe3JldHVybiBiZS5jYWxsKHQpLmVuZHNXaXRoKCJBcnJheV0iKX1mdW5jdGlvbiB2ZSh0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgcj1lLmZyb21JbmRleCxvPXZvaWQgMD09PXI/MDpyLG49ZS50b0luZGV4LHM9dm9pZCAwPT09bj90Lmxlbmd0aDpuO2lmKG88MHx8bz49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG8pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1vfHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciBpPXRbb10sdT1vKzE7dTxzO3UrKyl0W3VdPmkmJihpPXRbdV0pO3JldHVybiBpfWZ1bmN0aW9uIE1lKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZigheWUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO3ZhciByPWUuZnJvbUluZGV4LG89dm9pZCAwPT09cj8wOnIsbj1lLnRvSW5kZXgscz12b2lkIDA9PT1uP3QubGVuZ3RoOm47aWYobzwwfHxvPj10Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IEVycm9yKCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aCIpO2lmKHM8PW98fHM+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKHMpKXRocm93IG5ldyBFcnJvcigidG9JbmRleCBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGZyb21JbmRleCBhbmQgYXQgbW9zdCBlcXVhbCB0byBsZW5ndGgiKTtmb3IodmFyIGk9dFtvXSx1PW8rMTt1PHM7dSsrKXRbdV08aSYmKGk9dFt1XSk7cmV0dXJuIGl9ZnVuY3Rpb24geGUodCl7dmFyIGUscj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtpZih2b2lkIDAhPT1yLm91dHB1dCl7aWYoIXllKHIub3V0cHV0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvdXRwdXQgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkgaWYgc3BlY2lmaWVkIik7ZT1yLm91dHB1dH1lbHNlIGU9bmV3IEFycmF5KHQubGVuZ3RoKTt2YXIgbz1NZSh0KSxuPXZlKHQpO2lmKG89PT1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW5pbXVtIGFuZCBtYXhpbXVtIGlucHV0IHZhbHVlcyBhcmUgZXF1YWwuIENhbm5vdCByZXNjYWxlIGEgY29uc3RhbnQgYXJyYXkiKTt2YXIgcz1yLm1pbixpPXZvaWQgMD09PXM/ci5hdXRvTWluTWF4P286MDpzLHU9ci5tYXgsYT12b2lkIDA9PT11P3IuYXV0b01pbk1heD9uOjE6dTtpZihpPj1hKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gb3B0aW9uIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCBvcHRpb24iKTtmb3IodmFyIGg9KGEtaSkvKG4tbyksbD0wO2w8dC5sZW5ndGg7bCsrKWVbbF09KHRbbF0tbykqaCtpO3JldHVybiBlfWNvbnN0IEVlPSIgIi5yZXBlYXQoMiksU2U9IiAiLnJlcGVhdCg0KTtmdW5jdGlvbiBqZSh0LGU9e30pe2NvbnN0e21heFJvd3M6cj0xNSxtYXhDb2x1bW5zOm89MTAsbWF4TnVtU2l6ZTpuPTh9PWU7cmV0dXJuYCR7dC5jb25zdHJ1Y3Rvci5uYW1lfSB7XG4ke0VlfVtcbiR7U2V9JHtmdW5jdGlvbih0LGUscixvKXtjb25zdHtyb3dzOm4sY29sdW1uczpzfT10LGk9TWF0aC5taW4obixlKSx1PU1hdGgubWluKHMsciksYT1bXTtmb3IobGV0IGU9MDtlPGk7ZSsrKXtsZXQgcj1bXTtmb3IobGV0IG49MDtuPHU7bisrKXIucHVzaChfZSh0LmdldChlLG4pLG8pKTthLnB1c2goYCR7ci5qb2luKCIgIil9YCl9dSE9PXMmJihhW2EubGVuZ3RoLTFdKz1gIC4uLiAke3Mtcn0gbW9yZSBjb2x1bW5zYCk7aSE9PW4mJmEucHVzaChgLi4uICR7bi1lfSBtb3JlIHJvd3NgKTtyZXR1cm4gYS5qb2luKGBcbiR7U2V9YCl9KHQscixvLG4pfVxuJHtFZX1dXG4ke0VlfXJvd3M6ICR7dC5yb3dzfVxuJHtFZX1jb2x1bW5zOiAke3QuY29sdW1uc31cbn1gfWZ1bmN0aW9uIF9lKHQsZSl7Y29uc3Qgcj1TdHJpbmcodCk7aWYoci5sZW5ndGg8PWUpcmV0dXJuIHIucGFkRW5kKGUsIiAiKTtjb25zdCBvPXQudG9QcmVjaXNpb24oZS0yKTtpZihvLmxlbmd0aDw9ZSlyZXR1cm4gbztjb25zdCBuPXQudG9FeHBvbmVudGlhbChlLTIpLHM9bi5pbmRleE9mKCJlIiksaT1uLnNsaWNlKHMpO3JldHVybiBuLnNsaWNlKDAsZS1pLmxlbmd0aCkraX1mdW5jdGlvbiBBZSh0LGUscil7bGV0IG89cj90LnJvd3M6dC5yb3dzLTE7aWYoZTwwfHxlPm8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlJvdyBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBDZSh0LGUscil7bGV0IG89cj90LmNvbHVtbnM6dC5jb2x1bW5zLTE7aWYoZTwwfHxlPm8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBSZSh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMiKTtyZXR1cm4gZX1mdW5jdGlvbiBJZSh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJvd3MiKTtyZXR1cm4gZX1mdW5jdGlvbiBrZSh0LGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmV4cGVjdGVkIHR5cGUgZm9yIHJvdyBpbmRpY2VzIik7aWYoZS5zb21lKChlPT5lPDB8fGU+PXQucm93cykpKXRocm93IG5ldyBSYW5nZUVycm9yKCJyb3cgaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIik7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl8fChlPUFycmF5LmZyb20oZSkpLGV9ZnVuY3Rpb24gTmUodCxlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigidW5leHBlY3RlZCB0eXBlIGZvciBjb2x1bW4gaW5kaWNlcyIpO2lmKGUuc29tZSgoZT0+ZTwwfHxlPj10LmNvbHVtbnMpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiY29sdW1uIGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpO3JldHVybiBBcnJheS5pc0FycmF5KGUpfHwoZT1BcnJheS5mcm9tKGUpKSxlfWZ1bmN0aW9uIE9lKHQsZSxyLG8sbil7aWYoNSE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImV4cGVjdGVkIDQgYXJndW1lbnRzIik7aWYoemUoInN0YXJ0Um93IixlKSx6ZSgiZW5kUm93IixyKSx6ZSgic3RhcnRDb2x1bW4iLG8pLHplKCJlbmRDb2x1bW4iLG4pLGU+cnx8bz5ufHxlPDB8fGU+PXQucm93c3x8cjwwfHxyPj10LnJvd3N8fG88MHx8bz49dC5jb2x1bW5zfHxuPDB8fG4+PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiU3VibWF0cml4IGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEZlKHQsZT0wKXtsZXQgcj1bXTtmb3IobGV0IG89MDtvPHQ7bysrKXIucHVzaChlKTtyZXR1cm4gcn1mdW5jdGlvbiB6ZSh0LGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke3R9IG11c3QgYmUgYSBudW1iZXJgKX1mdW5jdGlvbiBUZSh0KXtpZih0LmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIkVtcHR5IG1hdHJpeCBoYXMgbm8gZWxlbWVudHMgdG8gaW5kZXgiKX1jbGFzcyBWZXtzdGF0aWMgZnJvbTFEQXJyYXkodCxlLHIpe2lmKHQqZSE9PXIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJkYXRhIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBnaXZlbiBkaW1lbnNpb25zIik7bGV0IG89bmV3IHFlKHQsZSk7Zm9yKGxldCBuPTA7bjx0O24rKylmb3IobGV0IHQ9MDt0PGU7dCsrKW8uc2V0KG4sdCxyW24qZSt0XSk7cmV0dXJuIG99c3RhdGljIHJvd1ZlY3Rvcih0KXtsZXQgZT1uZXcgcWUoMSx0Lmxlbmd0aCk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZS5zZXQoMCxyLHRbcl0pO3JldHVybiBlfXN0YXRpYyBjb2x1bW5WZWN0b3IodCl7bGV0IGU9bmV3IHFlKHQubGVuZ3RoLDEpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWUuc2V0KHIsMCx0W3JdKTtyZXR1cm4gZX1zdGF0aWMgemVyb3ModCxlKXtyZXR1cm4gbmV3IHFlKHQsZSl9c3RhdGljIG9uZXModCxlKXtyZXR1cm4gbmV3IHFlKHQsZSkuZmlsbCgxKX1zdGF0aWMgcmFuZCh0LGUscj17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtyYW5kb206bz1NYXRoLnJhbmRvbX09cjtsZXQgbj1uZXcgcWUodCxlKTtmb3IobGV0IHI9MDtyPHQ7cisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspbi5zZXQocix0LG8oKSk7cmV0dXJuIG59c3RhdGljIHJhbmRJbnQodCxlLHI9e30pe2lmKCJvYmplY3QiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOm89MCxtYXg6bj0xZTMscmFuZG9tOnM9TWF0aC5yYW5kb219PXI7aWYoIU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGFuIGludGVnZXIiKTtpZihvPj1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IGk9bi1vLHU9bmV3IHFlKHQsZSk7Zm9yKGxldCByPTA7cjx0O3IrKylmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT1vK01hdGgucm91bmQocygpKmkpO3Uuc2V0KHIsdCxlKX1yZXR1cm4gdX1zdGF0aWMgZXllKHQsZSxyKXt2b2lkIDA9PT1lJiYoZT10KSx2b2lkIDA9PT1yJiYocj0xKTtsZXQgbz1NYXRoLm1pbih0LGUpLG49dGhpcy56ZXJvcyh0LGUpO2ZvcihsZXQgdD0wO3Q8bzt0Kyspbi5zZXQodCx0LHIpO3JldHVybiBufXN0YXRpYyBkaWFnKHQsZSxyKXtsZXQgbz10Lmxlbmd0aDt2b2lkIDA9PT1lJiYoZT1vKSx2b2lkIDA9PT1yJiYocj1lKTtsZXQgbj1NYXRoLm1pbihvLGUscikscz10aGlzLnplcm9zKGUscik7Zm9yKGxldCBlPTA7ZTxuO2UrKylzLnNldChlLGUsdFtlXSk7cmV0dXJuIHN9c3RhdGljIG1pbih0LGUpe3Q9dGhpcy5jaGVja01hdHJpeCh0KSxlPXRoaXMuY2hlY2tNYXRyaXgoZSk7bGV0IHI9dC5yb3dzLG89dC5jb2x1bW5zLG49bmV3IHFlKHIsbyk7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG87cisrKW4uc2V0KHMscixNYXRoLm1pbih0LmdldChzLHIpLGUuZ2V0KHMscikpKTtyZXR1cm4gbn1zdGF0aWMgbWF4KHQsZSl7dD10aGlzLmNoZWNrTWF0cml4KHQpLGU9dGhpcy5jaGVja01hdHJpeChlKTtsZXQgcj10LnJvd3Msbz10LmNvbHVtbnMsbj1uZXcgdGhpcyhyLG8pO2ZvcihsZXQgcz0wO3M8cjtzKyspZm9yKGxldCByPTA7cjxvO3IrKyluLnNldChzLHIsTWF0aC5tYXgodC5nZXQocyxyKSxlLmdldChzLHIpKSk7cmV0dXJuIG59c3RhdGljIGNoZWNrTWF0cml4KHQpe3JldHVybiBWZS5pc01hdHJpeCh0KT90Om5ldyBxZSh0KX1zdGF0aWMgaXNNYXRyaXgodCl7cmV0dXJuIG51bGwhPXQmJiJNYXRyaXgiPT09dC5rbGFzc31nZXQgc2l6ZSgpe3JldHVybiB0aGlzLnJvd3MqdGhpcy5jb2x1bW5zfWFwcGx5KHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbiIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5jYWxsKHRoaXMsZSxyKTtyZXR1cm4gdGhpc310bzFEQXJyYXkoKXtsZXQgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQucHVzaCh0aGlzLmdldChlLHIpKTtyZXR1cm4gdH10bzJEQXJyYXkoKXtsZXQgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspe3QucHVzaChbXSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRbZV0ucHVzaCh0aGlzLmdldChlLHIpKX1yZXR1cm4gdH10b0pTT04oKXtyZXR1cm4gdGhpcy50bzJEQXJyYXkoKX1pc1Jvd1ZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5yb3dzfWlzQ29sdW1uVmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLmNvbHVtbnN9aXNWZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMucm93c3x8MT09PXRoaXMuY29sdW1uc31pc1NxdWFyZSgpe3JldHVybiB0aGlzLnJvd3M9PT10aGlzLmNvbHVtbnN9aXNFbXB0eSgpe3JldHVybiAwPT09dGhpcy5yb3dzfHwwPT09dGhpcy5jb2x1bW5zfWlzU3ltbWV0cmljKCl7aWYodGhpcy5pc1NxdWFyZSgpKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTw9dDtlKyspaWYodGhpcy5nZXQodCxlKSE9PXRoaXMuZ2V0KGUsdCkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9aXNFY2hlbG9uRm9ybSgpe2xldCB0PTAsZT0wLHI9LTEsbz0hMCxuPSExO2Zvcig7dDx0aGlzLnJvd3MmJm87KXtmb3IoZT0wLG49ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09bjspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPnI/KG49ITAscj1lKToobz0hMSxuPSEwKTt0Kyt9cmV0dXJuIG99aXNSZWR1Y2VkRWNoZWxvbkZvcm0oKXtsZXQgdD0wLGU9MCxyPS0xLG89ITAsbj0hMTtmb3IoO3Q8dGhpcy5yb3dzJiZvOyl7Zm9yKGU9MCxuPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PW47KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5yPyhuPSEwLHI9ZSk6KG89ITEsbj0hMCk7Zm9yKGxldCByPWUrMTtyPHRoaXMucm93cztyKyspMCE9PXRoaXMuZ2V0KHQscikmJihvPSExKTt0Kyt9cmV0dXJuIG99ZWNoZWxvbkZvcm0oKXtsZXQgdD10aGlzLmNsb25lKCksZT0wLHI9MDtmb3IoO2U8dC5yb3dzJiZyPHQuY29sdW1uczspe2xldCBvPWU7Zm9yKGxldCBuPWU7bjx0LnJvd3M7bisrKXQuZ2V0KG4scik+dC5nZXQobyxyKSYmKG89bik7aWYoMD09PXQuZ2V0KG8scikpcisrO2Vsc2V7dC5zd2FwUm93cyhlLG8pO2xldCBuPXQuZ2V0KGUscik7Zm9yKGxldCBvPXI7bzx0LmNvbHVtbnM7bysrKXQuc2V0KGUsbyx0LmdldChlLG8pL24pO2ZvcihsZXQgbz1lKzE7bzx0LnJvd3M7bysrKXtsZXQgbj10LmdldChvLHIpL3QuZ2V0KGUscik7dC5zZXQobyxyLDApO2ZvcihsZXQgcz1yKzE7czx0LmNvbHVtbnM7cysrKXQuc2V0KG8scyx0LmdldChvLHMpLXQuZ2V0KGUscykqbil9ZSsrLHIrK319cmV0dXJuIHR9cmVkdWNlZEVjaGVsb25Gb3JtKCl7bGV0IHQ9dGhpcy5lY2hlbG9uRm9ybSgpLGU9dC5jb2x1bW5zLHI9dC5yb3dzLG89ci0xO2Zvcig7bz49MDspaWYoMD09PXQubWF4Um93KG8pKW8tLTtlbHNle2xldCBuPTAscz0hMTtmb3IoO248ciYmITE9PT1zOykxPT09dC5nZXQobyxuKT9zPSEwOm4rKztmb3IobGV0IHI9MDtyPG87cisrKXtsZXQgcz10LmdldChyLG4pO2ZvcihsZXQgaT1uO2k8ZTtpKyspe2xldCBlPXQuZ2V0KHIsaSktcyp0LmdldChvLGkpO3Quc2V0KHIsaSxlKX19by0tfXJldHVybiB0fXNldCgpe3Rocm93IG5ldyBFcnJvcigic2V0IG1ldGhvZCBpcyB1bmltcGxlbWVudGVkIil9Z2V0KCl7dGhyb3cgbmV3IEVycm9yKCJnZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQiKX1yZXBlYXQodD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtyb3dzOmU9MSxjb2x1bW5zOnI9MX09dDtpZighTnVtYmVyLmlzSW50ZWdlcihlKXx8ZTw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJyb3dzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7aWYoIU51bWJlci5pc0ludGVnZXIocil8fHI8PTApdGhyb3cgbmV3IFR5cGVFcnJvcigiY29sdW1ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2xldCBvPW5ldyBxZSh0aGlzLnJvd3MqZSx0aGlzLmNvbHVtbnMqcik7Zm9yKGxldCB0PTA7dDxlO3QrKylmb3IobGV0IGU9MDtlPHI7ZSsrKW8uc2V0U3ViTWF0cml4KHRoaXMsdGhpcy5yb3dzKnQsdGhpcy5jb2x1bW5zKmUpO3JldHVybiBvfWZpbGwodCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9bmVnKCl7cmV0dXJuIHRoaXMubXVsUygtMSl9Z2V0Um93KHQpe0FlKHRoaXMsdCk7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKWUucHVzaCh0aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1nZXRSb3dWZWN0b3IodCl7cmV0dXJuIHFlLnJvd1ZlY3Rvcih0aGlzLmdldFJvdyh0KSl9c2V0Um93KHQsZSl7QWUodGhpcyx0KSxlPVJlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KHQscixlW3JdKTtyZXR1cm4gdGhpc31zd2FwUm93cyh0LGUpe0FlKHRoaXMsdCksQWUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspe2xldCBvPXRoaXMuZ2V0KHQscik7dGhpcy5zZXQodCxyLHRoaXMuZ2V0KGUscikpLHRoaXMuc2V0KGUscixvKX1yZXR1cm4gdGhpc31nZXRDb2x1bW4odCl7Q2UodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZS5wdXNoKHRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfWdldENvbHVtblZlY3Rvcih0KXtyZXR1cm4gcWUuY29sdW1uVmVjdG9yKHRoaXMuZ2V0Q29sdW1uKHQpKX1zZXRDb2x1bW4odCxlKXtDZSh0aGlzLHQpLGU9SWUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspdGhpcy5zZXQocix0LGVbcl0pO3JldHVybiB0aGlzfXN3YXBDb2x1bW5zKHQsZSl7Q2UodGhpcyx0KSxDZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl7bGV0IG89dGhpcy5nZXQocix0KTt0aGlzLnNldChyLHQsdGhpcy5nZXQocixlKSksdGhpcy5zZXQocixlLG8pfXJldHVybiB0aGlzfWFkZFJvd1ZlY3Rvcih0KXt0PVJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0W3JdKTtyZXR1cm4gdGhpc31zdWJSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdFtyXSk7cmV0dXJuIHRoaXN9bXVsUm93VmVjdG9yKHQpe3Q9UmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnRbcl0pO3JldHVybiB0aGlzfWRpdlJvd1ZlY3Rvcih0KXt0PVJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90W3JdKTtyZXR1cm4gdGhpc31hZGRDb2x1bW5WZWN0b3IodCl7dD1JZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdFtlXSk7cmV0dXJuIHRoaXN9c3ViQ29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXRbZV0pO3JldHVybiB0aGlzfW11bENvbHVtblZlY3Rvcih0KXt0PUllKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0W2VdKTtyZXR1cm4gdGhpc31kaXZDb2x1bW5WZWN0b3IodCl7dD1JZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdFtlXSk7cmV0dXJuIHRoaXN9bXVsUm93KHQsZSl7QWUodGhpcyx0KTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQodCxyLHRoaXMuZ2V0KHQscikqZSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uKHQsZSl7Q2UodGhpcyx0KTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspdGhpcy5zZXQocix0LHRoaXMuZ2V0KHIsdCkqZSk7cmV0dXJuIHRoaXN9bWF4KCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKT50JiYodD10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1tYXhJbmRleCgpe1RlKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBvPTA7bzx0aGlzLmNvbHVtbnM7bysrKXRoaXMuZ2V0KHIsbyk+dCYmKHQ9dGhpcy5nZXQocixvKSxlWzBdPXIsZVsxXT1vKTtyZXR1cm4gZX1taW4oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPHQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fW1pbkluZGV4KCl7VGUodGhpcyk7bGV0IHQ9dGhpcy5nZXQoMCwwKSxlPVswLDBdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKylmb3IobGV0IG89MDtvPHRoaXMuY29sdW1ucztvKyspdGhpcy5nZXQocixvKTx0JiYodD10aGlzLmdldChyLG8pLGVbMF09cixlWzFdPW8pO3JldHVybiBlfW1heFJvdyh0KXtpZihBZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IHI9MTtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQodCxyKT5lJiYoZT10aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1tYXhSb3dJbmRleCh0KXtBZSh0aGlzLHQpLFRlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KHQsMCkscj1bdCwwXTtmb3IobGV0IG89MTtvPHRoaXMuY29sdW1ucztvKyspdGhpcy5nZXQodCxvKT5lJiYoZT10aGlzLmdldCh0LG8pLHJbMV09byk7cmV0dXJuIHJ9bWluUm93KHQpe2lmKEFlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCh0LDApO2ZvcihsZXQgcj0xO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldCh0LHIpPGUmJihlPXRoaXMuZ2V0KHQscikpO3JldHVybiBlfW1pblJvd0luZGV4KHQpe0FlKHRoaXMsdCksVGUodGhpcyk7bGV0IGU9dGhpcy5nZXQodCwwKSxyPVt0LDBdO2ZvcihsZXQgbz0xO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldCh0LG8pPGUmJihlPXRoaXMuZ2V0KHQsbyksclsxXT1vKTtyZXR1cm4gcn1tYXhDb2x1bW4odCl7aWYoQ2UodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCByPTE7cjx0aGlzLnJvd3M7cisrKXRoaXMuZ2V0KHIsdCk+ZSYmKGU9dGhpcy5nZXQocix0KSk7cmV0dXJuIGV9bWF4Q29sdW1uSW5kZXgodCl7Q2UodGhpcyx0KSxUZSh0aGlzKTtsZXQgZT10aGlzLmdldCgwLHQpLHI9WzAsdF07Zm9yKGxldCBvPTE7bzx0aGlzLnJvd3M7bysrKXRoaXMuZ2V0KG8sdCk+ZSYmKGU9dGhpcy5nZXQobyx0KSxyWzBdPW8pO3JldHVybiByfW1pbkNvbHVtbih0KXtpZihDZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQoMCx0KTtmb3IobGV0IHI9MTtyPHRoaXMucm93cztyKyspdGhpcy5nZXQocix0KTxlJiYoZT10aGlzLmdldChyLHQpKTtyZXR1cm4gZX1taW5Db2x1bW5JbmRleCh0KXtDZSh0aGlzLHQpLFRlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KDAsdCkscj1bMCx0XTtmb3IobGV0IG89MTtvPHRoaXMucm93cztvKyspdGhpcy5nZXQobyx0KTxlJiYoZT10aGlzLmdldChvLHQpLHJbMF09byk7cmV0dXJuIHJ9ZGlhZygpe2xldCB0PU1hdGgubWluKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpLGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2godGhpcy5nZXQocixyKSk7cmV0dXJuIGV9bm9ybSh0PSJmcm9iZW5pdXMiKXtsZXQgZT0wO2lmKCJtYXgiPT09dClyZXR1cm4gdGhpcy5tYXgoKTtpZigiZnJvYmVuaXVzIj09PXQpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspZSs9dGhpcy5nZXQodCxyKSp0aGlzLmdldCh0LHIpO3JldHVybiBNYXRoLnNxcnQoZSl9dGhyb3cgbmV3IFJhbmdlRXJyb3IoYHVua25vd24gbm9ybSB0eXBlOiAke3R9YCl9Y3VtdWxhdGl2ZVN1bSgpe2xldCB0PTA7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0Kz10aGlzLmdldChlLHIpLHRoaXMuc2V0KGUscix0KTtyZXR1cm4gdGhpc31kb3QodCl7VmUuaXNNYXRyaXgodCkmJih0PXQudG8xREFycmF5KCkpO2xldCBlPXRoaXMudG8xREFycmF5KCk7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9ycyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIik7bGV0IHI9MDtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKylyKz1lW29dKnRbb107cmV0dXJuIHJ9bW11bCh0KXt0PXFlLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMucm93cyxyPXRoaXMuY29sdW1ucyxvPXQuY29sdW1ucyxuPW5ldyBxZShlLG8pLHM9bmV3IEZsb2F0NjRBcnJheShyKTtmb3IobGV0IGk9MDtpPG87aSsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKXNbZV09dC5nZXQoZSxpKTtmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT0wO2ZvcihsZXQgbz0wO288cjtvKyspZSs9dGhpcy5nZXQodCxvKSpzW29dO24uc2V0KHQsaSxlKX19cmV0dXJuIG59c3RyYXNzZW4yeDIodCl7dD1xZS5jaGVja01hdHJpeCh0KTtsZXQgZT1uZXcgcWUoMiwyKTtjb25zdCByPXRoaXMuZ2V0KDAsMCksbz10LmdldCgwLDApLG49dGhpcy5nZXQoMCwxKSxzPXQuZ2V0KDAsMSksaT10aGlzLmdldCgxLDApLHU9dC5nZXQoMSwwKSxhPXRoaXMuZ2V0KDEsMSksaD10LmdldCgxLDEpLGw9KHIrYSkqKG8raCksYz0oaSthKSpvLGY9cioocy1oKSxtPWEqKHUtbyksZz0ocituKSpoLHA9bCttLWcrKG4tYSkqKHUraCksdz1mK2csZD1jK20sYj1sLWMrZisoaS1yKSoobytzKTtyZXR1cm4gZS5zZXQoMCwwLHApLGUuc2V0KDAsMSx3KSxlLnNldCgxLDAsZCksZS5zZXQoMSwxLGIpLGV9c3RyYXNzZW4zeDModCl7dD1xZS5jaGVja01hdHJpeCh0KTtsZXQgZT1uZXcgcWUoMywzKTtjb25zdCByPXRoaXMuZ2V0KDAsMCksbz10aGlzLmdldCgwLDEpLG49dGhpcy5nZXQoMCwyKSxzPXRoaXMuZ2V0KDEsMCksaT10aGlzLmdldCgxLDEpLHU9dGhpcy5nZXQoMSwyKSxhPXRoaXMuZ2V0KDIsMCksaD10aGlzLmdldCgyLDEpLGw9dGhpcy5nZXQoMiwyKSxjPXQuZ2V0KDAsMCksZj10LmdldCgwLDEpLG09dC5nZXQoMCwyKSxnPXQuZ2V0KDEsMCkscD10LmdldCgxLDEpLHc9dC5nZXQoMSwyKSxkPXQuZ2V0KDIsMCksYj10LmdldCgyLDEpLHk9dC5nZXQoMiwyKSx2PShyLXMpKigtZitwKSxNPSgtcitzK2kpKihjLWYrcCkseD0ocytpKSooLWMrZiksRT1yKmMsUz0oLXIrYStoKSooYy1tK3cpLGo9KC1yK2EpKihtLXcpLF89KGEraCkqKC1jK20pLEE9KC1uK2grbCkqKHArZC1iKSxDPShuLWwpKihwLWIpLFI9bipkLEk9KGgrbCkqKC1kK2IpLGs9KC1uK2krdSkqKHcrZC15KSxOPShuLXUpKih3LXkpLE89KGkrdSkqKC1kK3kpLEY9RStSK28qZyx6PShyK28rbi1zLWktaC1sKSpwK00reCtFK0ErUitJLFQ9RStTK18rKHIrbytuLWktdS1hLWgpKncrUitrK08sVj12K2kqKC1jK2YrZy1wLXctZCt5KStNK0UrUitrK04sUD12K00reCtFK3UqYixxPVIraytOK08rcyptLCQ9RStTK2oraCooLWMrbStnLXAtdy1kK2IpK0ErQytSLEQ9QStDK1IrSSthKmYsVT1FK1MraitfK2wqeTtyZXR1cm4gZS5zZXQoMCwwLEYpLGUuc2V0KDAsMSx6KSxlLnNldCgwLDIsVCksZS5zZXQoMSwwLFYpLGUuc2V0KDEsMSxQKSxlLnNldCgxLDIscSksZS5zZXQoMiwwLCQpLGUuc2V0KDIsMSxEKSxlLnNldCgyLDIsVSksZX1tbXVsU3RyYXNzZW4odCl7dD1xZS5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLmNsb25lKCkscj1lLnJvd3Msbz1lLmNvbHVtbnMsbj10LnJvd3Mscz10LmNvbHVtbnM7ZnVuY3Rpb24gaSh0LGUscil7bGV0IG89dC5yb3dzLG49dC5jb2x1bW5zO2lmKG89PT1lJiZuPT09cilyZXR1cm4gdDt7bGV0IG89VmUuemVyb3MoZSxyKTtyZXR1cm4gbz1vLnNldFN1Yk1hdHJpeCh0LDAsMCksb319byE9PW4mJmNvbnNvbGUud2FybihgTXVsdGlwbHlpbmcgJHtyfSB4ICR7b30gYW5kICR7bn0geCAke3N9IG1hdHJpeDogZGltZW5zaW9ucyBkbyBub3QgbWF0Y2guYCk7bGV0IHU9TWF0aC5tYXgocixuKSxhPU1hdGgubWF4KG8scyk7cmV0dXJuIGU9aShlLHUsYSksZnVuY3Rpb24gdChlLHIsbyxuKXtpZihvPD01MTJ8fG48PTUxMilyZXR1cm4gZS5tbXVsKHIpO28lMj09MSYmbiUyPT0xPyhlPWkoZSxvKzEsbisxKSxyPWkocixvKzEsbisxKSk6byUyPT0xPyhlPWkoZSxvKzEsbikscj1pKHIsbysxLG4pKTpuJTI9PTEmJihlPWkoZSxvLG4rMSkscj1pKHIsbyxuKzEpKTtsZXQgcz1wYXJzZUludChlLnJvd3MvMiwxMCksdT1wYXJzZUludChlLmNvbHVtbnMvMiwxMCksYT1lLnN1Yk1hdHJpeCgwLHMtMSwwLHUtMSksaD1yLnN1Yk1hdHJpeCgwLHMtMSwwLHUtMSksbD1lLnN1Yk1hdHJpeCgwLHMtMSx1LGUuY29sdW1ucy0xKSxjPXIuc3ViTWF0cml4KDAscy0xLHUsci5jb2x1bW5zLTEpLGY9ZS5zdWJNYXRyaXgocyxlLnJvd3MtMSwwLHUtMSksbT1yLnN1Yk1hdHJpeChzLHIucm93cy0xLDAsdS0xKSxnPWUuc3ViTWF0cml4KHMsZS5yb3dzLTEsdSxlLmNvbHVtbnMtMSkscD1yLnN1Yk1hdHJpeChzLHIucm93cy0xLHUsci5jb2x1bW5zLTEpLHc9dChWZS5hZGQoYSxnKSxWZS5hZGQoaCxwKSxzLHUpLGQ9dChWZS5hZGQoZixnKSxoLHMsdSksYj10KGEsVmUuc3ViKGMscCkscyx1KSx5PXQoZyxWZS5zdWIobSxoKSxzLHUpLHY9dChWZS5hZGQoYSxsKSxwLHMsdSksTT10KFZlLnN1YihmLGEpLFZlLmFkZChoLGMpLHMsdSkseD10KFZlLnN1YihsLGcpLFZlLmFkZChtLHApLHMsdSksRT1WZS5hZGQodyx5KTtFLnN1Yih2KSxFLmFkZCh4KTtsZXQgUz1WZS5hZGQoYix2KSxqPVZlLmFkZChkLHkpLF89VmUuc3ViKHcsZCk7Xy5hZGQoYiksXy5hZGQoTSk7bGV0IEE9VmUuemVyb3MoMipFLnJvd3MsMipFLmNvbHVtbnMpO3JldHVybiBBPUEuc2V0U3ViTWF0cml4KEUsMCwwKSxBPUEuc2V0U3ViTWF0cml4KFMsRS5yb3dzLDApLEE9QS5zZXRTdWJNYXRyaXgoaiwwLEUuY29sdW1ucyksQT1BLnNldFN1Yk1hdHJpeChfLEUucm93cyxFLmNvbHVtbnMpLEEuc3ViTWF0cml4KDAsby0xLDAsbi0xKX0oZSx0PWkodCx1LGEpLHUsYSl9c2NhbGVSb3dzKHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOmU9MCxtYXg6cj0xfT10O2lmKCFOdW1iZXIuaXNGaW5pdGUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYSBudW1iZXIiKTtpZighTnVtYmVyLmlzRmluaXRlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGEgbnVtYmVyIik7aWYoZT49cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBvPW5ldyBxZSh0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0Kyspe2NvbnN0IG49dGhpcy5nZXRSb3codCk7bi5sZW5ndGg+MCYmeGUobix7bWluOmUsbWF4OnIsb3V0cHV0Om59KSxvLnNldFJvdyh0LG4pfXJldHVybiBvfXNjYWxlQ29sdW1ucyh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjplPTAsbWF4OnI9MX09dDtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIU51bWJlci5pc0Zpbml0ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhIG51bWJlciIpO2lmKGU+PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgbz1uZXcgcWUodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCB0PTA7dDx0aGlzLmNvbHVtbnM7dCsrKXtjb25zdCBuPXRoaXMuZ2V0Q29sdW1uKHQpO24ubGVuZ3RoJiZ4ZShuLHttaW46ZSxtYXg6cixvdXRwdXQ6bn0pLG8uc2V0Q29sdW1uKHQsbil9cmV0dXJuIG99ZmxpcFJvd3MoKXtjb25zdCB0PU1hdGguY2VpbCh0aGlzLmNvbHVtbnMvMik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dDtyKyspe2xldCB0PXRoaXMuZ2V0KGUsciksbz10aGlzLmdldChlLHRoaXMuY29sdW1ucy0xLXIpO3RoaXMuc2V0KGUscixvKSx0aGlzLnNldChlLHRoaXMuY29sdW1ucy0xLXIsdCl9cmV0dXJuIHRoaXN9ZmxpcENvbHVtbnMoKXtjb25zdCB0PU1hdGguY2VpbCh0aGlzLnJvd3MvMik7Zm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKWZvcihsZXQgcj0wO3I8dDtyKyspe2xldCB0PXRoaXMuZ2V0KHIsZSksbz10aGlzLmdldCh0aGlzLnJvd3MtMS1yLGUpO3RoaXMuc2V0KHIsZSxvKSx0aGlzLnNldCh0aGlzLnJvd3MtMS1yLGUsdCl9cmV0dXJuIHRoaXN9a3JvbmVja2VyUHJvZHVjdCh0KXt0PXFlLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMucm93cyxyPXRoaXMuY29sdW1ucyxvPXQucm93cyxuPXQuY29sdW1ucyxzPW5ldyBxZShlKm8scipuKTtmb3IobGV0IGk9MDtpPGU7aSsrKWZvcihsZXQgZT0wO2U8cjtlKyspZm9yKGxldCByPTA7cjxvO3IrKylmb3IobGV0IHU9MDt1PG47dSsrKXMuc2V0KG8qaStyLG4qZSt1LHRoaXMuZ2V0KGksZSkqdC5nZXQocix1KSk7cmV0dXJuIHN9a3JvbmVja2VyU3VtKHQpe2lmKHQ9cWUuY2hlY2tNYXRyaXgodCksIXRoaXMuaXNTcXVhcmUoKXx8IXQuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIktyb25lY2tlciBTdW0gbmVlZHMgdHdvIFNxdWFyZSBNYXRyaWNlcyIpO2xldCBlPXRoaXMucm93cyxyPXQucm93cyxvPXRoaXMua3JvbmVja2VyUHJvZHVjdChxZS5leWUocixyKSksbj1xZS5leWUoZSxlKS5rcm9uZWNrZXJQcm9kdWN0KHQpO3JldHVybiBvLmFkZChuKX10cmFuc3Bvc2UoKXtsZXQgdD1uZXcgcWUodGhpcy5jb2x1bW5zLHRoaXMucm93cyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnNldChyLGUsdGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9c29ydFJvd3ModD1QZSl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXRoaXMuc2V0Um93KGUsdGhpcy5nZXRSb3coZSkuc29ydCh0KSk7cmV0dXJuIHRoaXN9c29ydENvbHVtbnModD1QZSl7Zm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0Q29sdW1uKGUsdGhpcy5nZXRDb2x1bW4oZSkuc29ydCh0KSk7cmV0dXJuIHRoaXN9c3ViTWF0cml4KHQsZSxyLG8pe09lKHRoaXMsdCxlLHIsbyk7bGV0IG49bmV3IHFlKGUtdCsxLG8tcisxKTtmb3IobGV0IHM9dDtzPD1lO3MrKylmb3IobGV0IGU9cjtlPD1vO2UrKyluLnNldChzLXQsZS1yLHRoaXMuZ2V0KHMsZSkpO3JldHVybiBufXN1Yk1hdHJpeFJvdyh0LGUscil7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dGhpcy5jb2x1bW5zLTEpLGU+cnx8ZTwwfHxlPj10aGlzLmNvbHVtbnN8fHI8MHx8cj49dGhpcy5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJBcmd1bWVudCBvdXQgb2YgcmFuZ2UiKTtsZXQgbz1uZXcgcWUodC5sZW5ndGgsci1lKzEpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWZvcihsZXQgcz1lO3M8PXI7cysrKXtpZih0W25dPDB8fHRbbl0+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUm93IGluZGV4IG91dCBvZiByYW5nZTogJHt0W25dfWApO28uc2V0KG4scy1lLHRoaXMuZ2V0KHRbbl0scykpfXJldHVybiBvfXN1Yk1hdHJpeENvbHVtbih0LGUscil7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dGhpcy5yb3dzLTEpLGU+cnx8ZTwwfHxlPj10aGlzLnJvd3N8fHI8MHx8cj49dGhpcy5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKCJBcmd1bWVudCBvdXQgb2YgcmFuZ2UiKTtsZXQgbz1uZXcgcWUoci1lKzEsdC5sZW5ndGgpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWZvcihsZXQgcz1lO3M8PXI7cysrKXtpZih0W25dPDB8fHRbbl0+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ29sdW1uIGluZGV4IG91dCBvZiByYW5nZTogJHt0W25dfWApO28uc2V0KHMtZSxuLHRoaXMuZ2V0KHMsdFtuXSkpfXJldHVybiBvfXNldFN1Yk1hdHJpeCh0LGUscil7aWYoKHQ9cWUuY2hlY2tNYXRyaXgodCkpLmlzRW1wdHkoKSlyZXR1cm4gdGhpcztPZSh0aGlzLGUsZSt0LnJvd3MtMSxyLHIrdC5jb2x1bW5zLTEpO2ZvcihsZXQgbz0wO288dC5yb3dzO28rKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdGhpcy5zZXQoZStvLHIrbix0LmdldChvLG4pKTtyZXR1cm4gdGhpc31zZWxlY3Rpb24odCxlKXtsZXQgcj1mdW5jdGlvbih0LGUscil7cmV0dXJue3JvdzprZSh0LGUpLGNvbHVtbjpOZSh0LHIpfX0odGhpcyx0LGUpLG89bmV3IHFlKHQubGVuZ3RoLGUubGVuZ3RoKTtmb3IobGV0IHQ9MDt0PHIucm93Lmxlbmd0aDt0Kyspe2xldCBlPXIucm93W3RdO2ZvcihsZXQgbj0wO248ci5jb2x1bW4ubGVuZ3RoO24rKyl7bGV0IHM9ci5jb2x1bW5bbl07by5zZXQodCxuLHRoaXMuZ2V0KGUscykpfX1yZXR1cm4gb310cmFjZSgpe2xldCB0PU1hdGgubWluKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpLGU9MDtmb3IobGV0IHI9MDtyPHQ7cisrKWUrPXRoaXMuZ2V0KHIscik7cmV0dXJuIGV9Y2xvbmUoKXtsZXQgdD1uZXcgcWUodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnNldChlLHIsdGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9c3VtKHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPUZlKHQucm93cyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbz0wO288dC5jb2x1bW5zOysrbyllW3JdKz10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPUZlKHQuY29sdW1ucyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbz0wO288dC5jb2x1bW5zOysrbyllW29dKz10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtjYXNlIHZvaWQgMDpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9MDtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKWUrPXQuZ2V0KHIsbyk7cmV0dXJuIGV9KHRoaXMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1wcm9kdWN0KHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPUZlKHQucm93cywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7KytvKWVbcl0qPXQuZ2V0KHIsbyk7cmV0dXJuIGV9KHRoaXMpO2Nhc2UiY29sdW1uIjpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9RmUodC5jb2x1bW5zLDEpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtvXSo9dC5nZXQocixvKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTE7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyllKj10LmdldChyLG8pO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWVhbih0KXtjb25zdCBlPXRoaXMuc3VtKHQpO3N3aXRjaCh0KXtjYXNlInJvdyI6Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWVbdF0vPXRoaXMuY29sdW1ucztyZXR1cm4gZTtjYXNlImNvbHVtbiI6Zm9yKGxldCB0PTA7dDx0aGlzLmNvbHVtbnM7dCsrKWVbdF0vPXRoaXMucm93cztyZXR1cm4gZTtjYXNlIHZvaWQgMDpyZXR1cm4gZS90aGlzLnNpemU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXZhcmlhbmNlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3VuYmlhc2VkOnI9ITAsbWVhbjpvPXRoaXMubWVhbih0KX09ZTtpZigiYm9vbGVhbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInVuYmlhc2VkIG11c3QgYmUgYSBib29sZWFuIik7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighQXJyYXkuaXNBcnJheShvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtZWFuIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2NvbnN0IG89dC5yb3dzLG49dC5jb2x1bW5zLHM9W107Zm9yKGxldCBpPTA7aTxvO2krKyl7bGV0IG89MCx1PTAsYT0wO2ZvcihsZXQgZT0wO2U8bjtlKyspYT10LmdldChpLGUpLXJbaV0sbys9YSx1Kz1hKmE7ZT9zLnB1c2goKHUtbypvL24pLyhuLTEpKTpzLnB1c2goKHUtbypvL24pL24pfXJldHVybiBzfSh0aGlzLHIsbyk7Y2FzZSJjb2x1bW4iOmlmKCFBcnJheS5pc0FycmF5KG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbz10LnJvd3Msbj10LmNvbHVtbnMscz1bXTtmb3IobGV0IGk9MDtpPG47aSsrKXtsZXQgbj0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxvO2UrKylhPXQuZ2V0KGUsaSktcltpXSxuKz1hLHUrPWEqYTtlP3MucHVzaCgodS1uKm4vbykvKG8tMSkpOnMucHVzaCgodS1uKm4vbykvbyl9cmV0dXJuIHN9KHRoaXMscixvKTtjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIG8pdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBvPXQucm93cyxuPXQuY29sdW1ucyxzPW8qbjtsZXQgaT0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxvO2UrKylmb3IobGV0IG89MDtvPG47bysrKWE9dC5nZXQoZSxvKS1yLGkrPWEsdSs9YSphO3JldHVybiBlPyh1LWkqaS9zKS8ocy0xKToodS1pKmkvcykvc30odGhpcyxyLG8pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zdGFuZGFyZERldmlhdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCk7Y29uc3Qgcj10aGlzLnZhcmlhbmNlKHQsZSk7aWYodm9pZCAwPT09dClyZXR1cm4gTWF0aC5zcXJ0KHIpO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXJbdF09TWF0aC5zcXJ0KHJbdF0pO3JldHVybiByfWNlbnRlcih0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtjZW50ZXI6cj10aGlzLm1lYW4odCl9PWU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbyktZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pLWVbb10pfSh0aGlzLHIpLHRoaXM7Y2FzZSB2b2lkIDA6aWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0LnNldChyLG8sdC5nZXQocixvKS1lKX0odGhpcyxyKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zY2FsZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtsZXQgcj1lLnNjYWxlO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKXtsZXQgbz0wO2ZvcihsZXQgZT0wO2U8dC5jb2x1bW5zO2UrKylvKz1NYXRoLnBvdyh0LmdldChyLGUpLDIpLyh0LmNvbHVtbnMtMSk7ZS5wdXNoKE1hdGguc3FydChvKSl9cmV0dXJuIGV9KHRoaXMpO2Vsc2UgaWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbykvZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0LmNvbHVtbnM7cisrKXtsZXQgbz0wO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKylvKz1NYXRoLnBvdyh0LmdldChlLHIpLDIpLyh0LnJvd3MtMSk7ZS5wdXNoKE1hdGguc3FydChvKSl9cmV0dXJuIGV9KHRoaXMpO2Vsc2UgaWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQocixvLHQuZ2V0KHIsbykvZVtvXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT10LnNpemUtMTtsZXQgcj0wO2ZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKylmb3IobGV0IG49MDtuPHQucm93cztuKyspcis9TWF0aC5wb3codC5nZXQobixvKSwyKS9lO3JldHVybiBNYXRoLnNxcnQocil9KHRoaXMpO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KHIsbyx0LmdldChyLG8pL2UpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXRvU3RyaW5nKHQpe3JldHVybiBqZSh0aGlzLHQpfX1mdW5jdGlvbiBQZSh0LGUpe3JldHVybiB0LWV9VmUucHJvdG90eXBlLmtsYXNzPSJNYXRyaXgiLCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiYoVmUucHJvdG90eXBlW1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildPWZ1bmN0aW9uKCl7cmV0dXJuIGplKHRoaXMpfSksVmUucmFuZG9tPVZlLnJhbmQsVmUucmFuZG9tSW50PVZlLnJhbmRJbnQsVmUuZGlhZ29uYWw9VmUuZGlhZyxWZS5wcm90b3R5cGUuZGlhZ29uYWw9VmUucHJvdG90eXBlLmRpYWcsVmUuaWRlbnRpdHk9VmUuZXllLFZlLnByb3RvdHlwZS5uZWdhdGU9VmUucHJvdG90eXBlLm5lZyxWZS5wcm90b3R5cGUudGVuc29yUHJvZHVjdD1WZS5wcm90b3R5cGUua3JvbmVja2VyUHJvZHVjdDtjbGFzcyBxZSBleHRlbmRzIFZle2NvbnN0cnVjdG9yKHQsZSl7aWYoc3VwZXIoKSxxZS5pc01hdHJpeCh0KSlyZXR1cm4gdC5jbG9uZSgpO2lmKE51bWJlci5pc0ludGVnZXIodCkmJnQ+PTApe2lmKHRoaXMuZGF0YT1bXSwhKE51bWJlci5pc0ludGVnZXIoZSkmJmU+PTApKXRocm93IG5ldyBUeXBlRXJyb3IoIm5Db2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7Zm9yKGxldCByPTA7cjx0O3IrKyl0aGlzLmRhdGEucHVzaChuZXcgRmxvYXQ2NEFycmF5KGUpKX1lbHNle2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIgb3IgYW4gYXJyYXkiKTt7Y29uc3Qgcj10O2lmKCJudW1iZXIiIT10eXBlb2YoZT0odD1yLmxlbmd0aCk/clswXS5sZW5ndGg6MCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGF0YSBtdXN0IGJlIGEgMkQgYXJyYXkgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudCIpO3RoaXMuZGF0YT1bXTtmb3IobGV0IG89MDtvPHQ7bysrKXtpZihyW29dLmxlbmd0aCE9PWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluY29uc2lzdGVudCBhcnJheSBkaW1lbnNpb25zIik7dGhpcy5kYXRhLnB1c2goRmxvYXQ2NEFycmF5LmZyb20ocltvXSkpfX19dGhpcy5yb3dzPXQsdGhpcy5jb2x1bW5zPWV9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdPXIsdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdfXJlbW92ZVJvdyh0KXtyZXR1cm4gQWUodGhpcyx0KSx0aGlzLmRhdGEuc3BsaWNlKHQsMSksdGhpcy5yb3dzLT0xLHRoaXN9YWRkUm93KHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXQsdD10aGlzLnJvd3MpLEFlKHRoaXMsdCwhMCksZT1GbG9hdDY0QXJyYXkuZnJvbShSZSh0aGlzLGUpKSx0aGlzLmRhdGEuc3BsaWNlKHQsMCxlKSx0aGlzLnJvd3MrPTEsdGhpc31yZW1vdmVDb2x1bW4odCl7Q2UodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspe2NvbnN0IHI9bmV3IEZsb2F0NjRBcnJheSh0aGlzLmNvbHVtbnMtMSk7Zm9yKGxldCBvPTA7bzx0O28rKylyW29dPXRoaXMuZGF0YVtlXVtvXTtmb3IobGV0IG89dCsxO288dGhpcy5jb2x1bW5zO28rKylyW28tMV09dGhpcy5kYXRhW2VdW29dO3RoaXMuZGF0YVtlXT1yfXJldHVybiB0aGlzLmNvbHVtbnMtPTEsdGhpc31hZGRDb2x1bW4odCxlKXt2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5jb2x1bW5zKSxDZSh0aGlzLHQsITApLGU9SWUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspe2NvbnN0IG89bmV3IEZsb2F0NjRBcnJheSh0aGlzLmNvbHVtbnMrMSk7bGV0IG49MDtmb3IoO248dDtuKyspb1tuXT10aGlzLmRhdGFbcl1bbl07Zm9yKG9bbisrXT1lW3JdO248dGhpcy5jb2x1bW5zKzE7bisrKW9bbl09dGhpcy5kYXRhW3JdW24tMV07dGhpcy5kYXRhW3JdPW99cmV0dXJuIHRoaXMuY29sdW1ucys9MSx0aGlzfX0hZnVuY3Rpb24odCxlKXt0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuYWRkUyh0KTp0aGlzLmFkZE0odCl9LHQucHJvdG90eXBlLmFkZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuYWRkTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuYWRkPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmFkZChyKX0sdC5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnN1YlModCk6dGhpcy5zdWJNKHQpfSx0LnByb3RvdHlwZS5zdWJTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnN1Yk09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnN1Yj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5zdWIocil9LHQucHJvdG90eXBlLnN1YnRyYWN0PXQucHJvdG90eXBlLnN1Yix0LnByb3RvdHlwZS5zdWJ0cmFjdFM9dC5wcm90b3R5cGUuc3ViUyx0LnByb3RvdHlwZS5zdWJ0cmFjdE09dC5wcm90b3R5cGUuc3ViTSx0LnN1YnRyYWN0PXQuc3ViLHQucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5tdWxTKHQpOnRoaXMubXVsTSh0KX0sdC5wcm90b3R5cGUubXVsUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5tdWxNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5tdWw9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubXVsKHIpfSx0LnByb3RvdHlwZS5tdWx0aXBseT10LnByb3RvdHlwZS5tdWwsdC5wcm90b3R5cGUubXVsdGlwbHlTPXQucHJvdG90eXBlLm11bFMsdC5wcm90b3R5cGUubXVsdGlwbHlNPXQucHJvdG90eXBlLm11bE0sdC5tdWx0aXBseT10Lm11bCx0LnByb3RvdHlwZS5kaXY9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuZGl2Uyh0KTp0aGlzLmRpdk0odCl9LHQucHJvdG90eXBlLmRpdlM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZGl2TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuZGl2PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmRpdihyKX0sdC5wcm90b3R5cGUuZGl2aWRlPXQucHJvdG90eXBlLmRpdix0LnByb3RvdHlwZS5kaXZpZGVTPXQucHJvdG90eXBlLmRpdlMsdC5wcm90b3R5cGUuZGl2aWRlTT10LnByb3RvdHlwZS5kaXZNLHQuZGl2aWRlPXQuZGl2LHQucHJvdG90eXBlLm1vZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5tb2RTKHQpOnRoaXMubW9kTSh0KX0sdC5wcm90b3R5cGUubW9kUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJXQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5tb2RNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSV0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5tb2Q9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubW9kKHIpfSx0LnByb3RvdHlwZS5tb2R1bHVzPXQucHJvdG90eXBlLm1vZCx0LnByb3RvdHlwZS5tb2R1bHVzUz10LnByb3RvdHlwZS5tb2RTLHQucHJvdG90eXBlLm1vZHVsdXNNPXQucHJvdG90eXBlLm1vZE0sdC5tb2R1bHVzPXQubW9kLHQucHJvdG90eXBlLmFuZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5hbmRTKHQpOnRoaXMuYW5kTSh0KX0sdC5wcm90b3R5cGUuYW5kUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hbmRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSZ0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5hbmQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuYW5kKHIpfSx0LnByb3RvdHlwZS5vcj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5vclModCk6dGhpcy5vck0odCl9LHQucHJvdG90eXBlLm9yUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpfHQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5vck09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpfHQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm9yPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm9yKHIpfSx0LnByb3RvdHlwZS54b3I9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMueG9yUyh0KTp0aGlzLnhvck0odCl9LHQucHJvdG90eXBlLnhvclM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKV50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUueG9yTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciledC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQueG9yPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnhvcihyKX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmxlZnRTaGlmdFModCk6dGhpcy5sZWZ0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik8PHQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKTw8dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubGVmdFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmxlZnRTaGlmdChyKX0sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uyh0KTp0aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQocil9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMucmlnaHRTaGlmdFModCk6dGhpcy5yaWdodFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUucmlnaHRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+PnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+Pj50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnJpZ2h0U2hpZnQocil9LHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdD10LnByb3RvdHlwZS5yaWdodFNoaWZ0LHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdFM9dC5wcm90b3R5cGUucmlnaHRTaGlmdFMsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0TT10LnByb3RvdHlwZS5yaWdodFNoaWZ0TSx0Lnplcm9GaWxsUmlnaHRTaGlmdD10LnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUubm90PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsfnRoaXMuZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0Lm5vdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubm90KCl9LHQucHJvdG90eXBlLmFicz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWJzKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hYnM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFicygpfSx0LnByb3RvdHlwZS5hY29zPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hY29zKCl9LHQucHJvdG90eXBlLmFjb3NoPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hY29zaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWNvc2g9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFjb3NoKCl9LHQucHJvdG90eXBlLmFzaW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFzaW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFzaW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFzaW4oKX0sdC5wcm90b3R5cGUuYXNpbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFzaW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXNpbmgoKX0sdC5wcm90b3R5cGUuYXRhbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXRhbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXRhbigpfSx0LnByb3RvdHlwZS5hdGFuaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXRhbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hdGFuaCgpfSx0LnByb3RvdHlwZS5jYnJ0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jYnJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jYnJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jYnJ0KCl9LHQucHJvdG90eXBlLmNlaWw9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNlaWwodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNlaWw9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNlaWwoKX0sdC5wcm90b3R5cGUuY2x6MzI9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNsejMyKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jbHozMj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2x6MzIoKX0sdC5wcm90b3R5cGUuY29zPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNvcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY29zKCl9LHQucHJvdG90eXBlLmNvc2g9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNvc2g9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNvc2goKX0sdC5wcm90b3R5cGUuZXhwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5leHAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmV4cD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZXhwKCl9LHQucHJvdG90eXBlLmV4cG0xPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5leHBtMSh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwbTE9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmV4cG0xKCl9LHQucHJvdG90eXBlLmZsb29yPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mbG9vcih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZmxvb3I9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmZsb29yKCl9LHQucHJvdG90eXBlLmZyb3VuZD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5mcm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmZyb3VuZCgpfSx0LnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2coKX0sdC5wcm90b3R5cGUubG9nMXA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzFwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cxcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMXAoKX0sdC5wcm90b3R5cGUubG9nMTA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzEwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cxMD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMTAoKX0sdC5wcm90b3R5cGUubG9nMj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nMigpfSx0LnByb3RvdHlwZS5yb3VuZD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgucm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5yb3VuZCgpfSx0LnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaWduKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaWduPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaWduKCl9LHQucHJvdG90eXBlLnNpbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpbigpfSx0LnByb3RvdHlwZS5zaW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaW5oKCl9LHQucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNxcnQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNxcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNxcnQoKX0sdC5wcm90b3R5cGUudGFuPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRhbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudGFuKCl9LHQucHJvdG90eXBlLnRhbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRhbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRhbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRhbmgoKX0sdC5wcm90b3R5cGUudHJ1bmM9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRydW5jKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50cnVuYz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudHJ1bmMoKX0sdC5wb3c9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkucG93KHIpfSx0LnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMucG93Uyh0KTp0aGlzLnBvd00odCl9LHQucHJvdG90eXBlLnBvd1M9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsTWF0aC5wb3codGhpcy5nZXQoZSxyKSx0KSk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnBvd009ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscixNYXRoLnBvdyh0aGlzLmdldChlLHIpLHQuZ2V0KGUscikpKTtyZXR1cm4gdGhpc319KFZlLHFlKTtjbGFzcyAkZSBleHRlbmRzIFZle2NvbnN0cnVjdG9yKHQsZSxyKXtzdXBlcigpLHRoaXMubWF0cml4PXQsdGhpcy5yb3dzPWUsdGhpcy5jb2x1bW5zPXJ9fWNsYXNzIERlIGV4dGVuZHMgJGV7Y29uc3RydWN0b3IodCl7c3VwZXIodCx0LmNvbHVtbnMsdC5yb3dzKX1zZXQodCxlLHIpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQoZSx0LHIpLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMubWF0cml4LmdldChlLHQpfX1jbGFzcyBVZSBleHRlbmRzIFZle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5kYXRhPXQsdGhpcy5yb3dzPXQubGVuZ3RoLHRoaXMuY29sdW1ucz10WzBdLmxlbmd0aH1zZXQodCxlLHIpe3JldHVybiB0aGlzLmRhdGFbdF1bZV09cix0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLmRhdGFbdF1bZV19fWZ1bmN0aW9uIExlKHQsZSl7bGV0IHI9MDtyZXR1cm4gTWF0aC5hYnModCk+TWF0aC5hYnMoZSk/KHI9ZS90LE1hdGguYWJzKHQpKk1hdGguc3FydCgxK3IqcikpOjAhPT1lPyhyPXQvZSxNYXRoLmFicyhlKSpNYXRoLnNxcnQoMStyKnIpKTowfWNsYXNzIEJle2NvbnN0cnVjdG9yKHQsZT17fSl7aWYoKHQ9VWUuY2hlY2tNYXRyaXgodCkpLmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIG5vbi1lbXB0eSIpO2xldCByPXQucm93cyxvPXQuY29sdW1ucztjb25zdHtjb21wdXRlTGVmdFNpbmd1bGFyVmVjdG9yczpuPSEwLGNvbXB1dGVSaWdodFNpbmd1bGFyVmVjdG9yczpzPSEwLGF1dG9UcmFuc3Bvc2U6aT0hMX09ZTtsZXQgdSxhPUJvb2xlYW4obiksaD1Cb29sZWFuKHMpLGw9ITE7aWYocjxvKWlmKGkpe3U9dC50cmFuc3Bvc2UoKSxyPXUucm93cyxvPXUuY29sdW1ucyxsPSEwO2xldCBlPWE7YT1oLGg9ZX1lbHNlIHU9dC5jbG9uZSgpLGNvbnNvbGUud2FybigiQ29tcHV0aW5nIFNWRCBvbiBhIG1hdHJpeCB3aXRoIG1vcmUgY29sdW1ucyB0aGFuIHJvd3MuIENvbnNpZGVyIGVuYWJsaW5nIGF1dG9UcmFuc3Bvc2UiKTtlbHNlIHU9dC5jbG9uZSgpO2xldCBjPU1hdGgubWluKHIsbyksZj1NYXRoLm1pbihyKzEsbyksbT1uZXcgRmxvYXQ2NEFycmF5KGYpLGc9bmV3IHFlKHIsYykscD1uZXcgcWUobyxvKSx3PW5ldyBGbG9hdDY0QXJyYXkobyksZD1uZXcgRmxvYXQ2NEFycmF5KHIpLGI9bmV3IEZsb2F0NjRBcnJheShmKTtmb3IobGV0IHQ9MDt0PGY7dCsrKWJbdF09dDtsZXQgeT1NYXRoLm1pbihyLTEsbyksdj1NYXRoLm1heCgwLE1hdGgubWluKG8tMixyKSksTT1NYXRoLm1heCh5LHYpO2ZvcihsZXQgdD0wO3Q8TTt0Kyspe2lmKHQ8eSl7bVt0XT0wO2ZvcihsZXQgZT10O2U8cjtlKyspbVt0XT1MZShtW3RdLHUuZ2V0KGUsdCkpO2lmKDAhPT1tW3RdKXt1LmdldCh0LHQpPDAmJihtW3RdPS1tW3RdKTtmb3IobGV0IGU9dDtlPHI7ZSsrKXUuc2V0KGUsdCx1LmdldChlLHQpL21bdF0pO3Uuc2V0KHQsdCx1LmdldCh0LHQpKzEpfW1bdF09LW1bdF19Zm9yKGxldCBlPXQrMTtlPG87ZSsrKXtpZih0PHkmJjAhPT1tW3RdKXtsZXQgbz0wO2ZvcihsZXQgbj10O248cjtuKyspbys9dS5nZXQobix0KSp1LmdldChuLGUpO289LW8vdS5nZXQodCx0KTtmb3IobGV0IG49dDtuPHI7bisrKXUuc2V0KG4sZSx1LmdldChuLGUpK28qdS5nZXQobix0KSl9d1tlXT11LmdldCh0LGUpfWlmKGEmJnQ8eSlmb3IobGV0IGU9dDtlPHI7ZSsrKWcuc2V0KGUsdCx1LmdldChlLHQpKTtpZih0PHYpe3dbdF09MDtmb3IobGV0IGU9dCsxO2U8bztlKyspd1t0XT1MZSh3W3RdLHdbZV0pO2lmKDAhPT13W3RdKXt3W3QrMV08MCYmKHdbdF09MC13W3RdKTtmb3IobGV0IGU9dCsxO2U8bztlKyspd1tlXS89d1t0XTt3W3QrMV0rPTF9aWYod1t0XT0td1t0XSx0KzE8ciYmMCE9PXdbdF0pe2ZvcihsZXQgZT10KzE7ZTxyO2UrKylkW2VdPTA7Zm9yKGxldCBlPXQrMTtlPHI7ZSsrKWZvcihsZXQgcj10KzE7cjxvO3IrKylkW2VdKz13W3JdKnUuZ2V0KGUscik7Zm9yKGxldCBlPXQrMTtlPG87ZSsrKXtsZXQgbz0td1tlXS93W3QrMV07Zm9yKGxldCBuPXQrMTtuPHI7bisrKXUuc2V0KG4sZSx1LmdldChuLGUpK28qZFtuXSl9fWlmKGgpZm9yKGxldCBlPXQrMTtlPG87ZSsrKXAuc2V0KGUsdCx3W2VdKX19bGV0IHg9TWF0aC5taW4obyxyKzEpO2lmKHk8byYmKG1beV09dS5nZXQoeSx5KSkscjx4JiYobVt4LTFdPTApLHYrMTx4JiYod1t2XT11LmdldCh2LHgtMSkpLHdbeC0xXT0wLGEpe2ZvcihsZXQgdD15O3Q8Yzt0Kyspe2ZvcihsZXQgZT0wO2U8cjtlKyspZy5zZXQoZSx0LDApO2cuc2V0KHQsdCwxKX1mb3IobGV0IHQ9eS0xO3Q+PTA7dC0tKWlmKDAhPT1tW3RdKXtmb3IobGV0IGU9dCsxO2U8YztlKyspe2xldCBvPTA7Zm9yKGxldCBuPXQ7bjxyO24rKylvKz1nLmdldChuLHQpKmcuZ2V0KG4sZSk7bz0tby9nLmdldCh0LHQpO2ZvcihsZXQgbj10O248cjtuKyspZy5zZXQobixlLGcuZ2V0KG4sZSkrbypnLmdldChuLHQpKX1mb3IobGV0IGU9dDtlPHI7ZSsrKWcuc2V0KGUsdCwtZy5nZXQoZSx0KSk7Zy5zZXQodCx0LDErZy5nZXQodCx0KSk7Zm9yKGxldCBlPTA7ZTx0LTE7ZSsrKWcuc2V0KGUsdCwwKX1lbHNle2ZvcihsZXQgZT0wO2U8cjtlKyspZy5zZXQoZSx0LDApO2cuc2V0KHQsdCwxKX19aWYoaClmb3IobGV0IHQ9by0xO3Q+PTA7dC0tKXtpZih0PHYmJjAhPT13W3RdKWZvcihsZXQgZT10KzE7ZTxvO2UrKyl7bGV0IHI9MDtmb3IobGV0IG49dCsxO248bztuKyspcis9cC5nZXQobix0KSpwLmdldChuLGUpO3I9LXIvcC5nZXQodCsxLHQpO2ZvcihsZXQgbj10KzE7bjxvO24rKylwLnNldChuLGUscC5nZXQobixlKStyKnAuZ2V0KG4sdCkpfWZvcihsZXQgZT0wO2U8bztlKyspcC5zZXQoZSx0LDApO3Auc2V0KHQsdCwxKX1sZXQgRT14LTEsUz1OdW1iZXIuRVBTSUxPTjtmb3IoO3g+MDspe2xldCB0LGU7Zm9yKHQ9eC0yO3Q+PS0xJiYtMSE9PXQ7dC0tKXtjb25zdCBlPU51bWJlci5NSU5fVkFMVUUrUypNYXRoLmFicyhtW3RdK01hdGguYWJzKG1bdCsxXSkpO2lmKE1hdGguYWJzKHdbdF0pPD1lfHxOdW1iZXIuaXNOYU4od1t0XSkpe3dbdF09MDticmVha319aWYodD09PXgtMillPTQ7ZWxzZXtsZXQgcjtmb3Iocj14LTE7cj49dCYmciE9PXQ7ci0tKXtsZXQgZT0ociE9PXg/TWF0aC5hYnMod1tyXSk6MCkrKHIhPT10KzE/TWF0aC5hYnMod1tyLTFdKTowKTtpZihNYXRoLmFicyhtW3JdKTw9UyplKXttW3JdPTA7YnJlYWt9fXI9PT10P2U9MzpyPT09eC0xP2U9MTooZT0yLHQ9cil9c3dpdGNoKHQrKyxlKXtjYXNlIDE6e2xldCBlPXdbeC0yXTt3W3gtMl09MDtmb3IobGV0IHI9eC0yO3I+PXQ7ci0tKXtsZXQgbj1MZShtW3JdLGUpLHM9bVtyXS9uLGk9ZS9uO2lmKG1bcl09bixyIT09dCYmKGU9LWkqd1tyLTFdLHdbci0xXT1zKndbci0xXSksaClmb3IobGV0IHQ9MDt0PG87dCsrKW49cypwLmdldCh0LHIpK2kqcC5nZXQodCx4LTEpLHAuc2V0KHQseC0xLC1pKnAuZ2V0KHQscikrcypwLmdldCh0LHgtMSkpLHAuc2V0KHQscixuKX1icmVha31jYXNlIDI6e2xldCBlPXdbdC0xXTt3W3QtMV09MDtmb3IobGV0IG89dDtvPHg7bysrKXtsZXQgbj1MZShtW29dLGUpLHM9bVtvXS9uLGk9ZS9uO2lmKG1bb109bixlPS1pKndbb10sd1tvXT1zKndbb10sYSlmb3IobGV0IGU9MDtlPHI7ZSsrKW49cypnLmdldChlLG8pK2kqZy5nZXQoZSx0LTEpLGcuc2V0KGUsdC0xLC1pKmcuZ2V0KGUsbykrcypnLmdldChlLHQtMSkpLGcuc2V0KGUsbyxuKX1icmVha31jYXNlIDM6e2NvbnN0IGU9TWF0aC5tYXgoTWF0aC5hYnMobVt4LTFdKSxNYXRoLmFicyhtW3gtMl0pLE1hdGguYWJzKHdbeC0yXSksTWF0aC5hYnMobVt0XSksTWF0aC5hYnMod1t0XSkpLG49bVt4LTFdL2Uscz1tW3gtMl0vZSxpPXdbeC0yXS9lLHU9bVt0XS9lLGw9d1t0XS9lLGM9KChzK24pKihzLW4pK2kqaSkvMixmPW4qaSoobippKTtsZXQgZD0wOzA9PT1jJiYwPT09Znx8KGQ9YzwwPzAtTWF0aC5zcXJ0KGMqYytmKTpNYXRoLnNxcnQoYypjK2YpLGQ9Zi8oYytkKSk7bGV0IGI9KHUrbikqKHUtbikrZCx5PXUqbDtmb3IobGV0IGU9dDtlPHgtMTtlKyspe2xldCBuPUxlKGIseSk7MD09PW4mJihuPU51bWJlci5NSU5fVkFMVUUpO2xldCBzPWIvbixpPXkvbjtpZihlIT09dCYmKHdbZS0xXT1uKSxiPXMqbVtlXStpKndbZV0sd1tlXT1zKndbZV0taSptW2VdLHk9aSptW2UrMV0sbVtlKzFdPXMqbVtlKzFdLGgpZm9yKGxldCB0PTA7dDxvO3QrKyluPXMqcC5nZXQodCxlKStpKnAuZ2V0KHQsZSsxKSxwLnNldCh0LGUrMSwtaSpwLmdldCh0LGUpK3MqcC5nZXQodCxlKzEpKSxwLnNldCh0LGUsbik7aWYobj1MZShiLHkpLDA9PT1uJiYobj1OdW1iZXIuTUlOX1ZBTFVFKSxzPWIvbixpPXkvbixtW2VdPW4sYj1zKndbZV0raSptW2UrMV0sbVtlKzFdPS1pKndbZV0rcyptW2UrMV0seT1pKndbZSsxXSx3W2UrMV09cyp3W2UrMV0sYSYmZTxyLTEpZm9yKGxldCB0PTA7dDxyO3QrKyluPXMqZy5nZXQodCxlKStpKmcuZ2V0KHQsZSsxKSxnLnNldCh0LGUrMSwtaSpnLmdldCh0LGUpK3MqZy5nZXQodCxlKzEpKSxnLnNldCh0LGUsbil9d1t4LTJdPWI7YnJlYWt9Y2FzZSA0OmlmKG1bdF08PTAmJihtW3RdPW1bdF08MD8tbVt0XTowLGgpKWZvcihsZXQgZT0wO2U8PUU7ZSsrKXAuc2V0KGUsdCwtcC5nZXQoZSx0KSk7Zm9yKDt0PEUmJiEobVt0XT49bVt0KzFdKTspe2xldCBlPW1bdF07aWYobVt0XT1tW3QrMV0sbVt0KzFdPWUsaCYmdDxvLTEpZm9yKGxldCByPTA7cjxvO3IrKyllPXAuZ2V0KHIsdCsxKSxwLnNldChyLHQrMSxwLmdldChyLHQpKSxwLnNldChyLHQsZSk7aWYoYSYmdDxyLTEpZm9yKGxldCBvPTA7bzxyO28rKyllPWcuZ2V0KG8sdCsxKSxnLnNldChvLHQrMSxnLmdldChvLHQpKSxnLnNldChvLHQsZSk7dCsrfXgtLX19aWYobCl7bGV0IHQ9cDtwPWcsZz10fXRoaXMubT1yLHRoaXMubj1vLHRoaXMucz1tLHRoaXMuVT1nLHRoaXMuVj1wfXNvbHZlKHQpe2xldCBlPXQscj10aGlzLnRocmVzaG9sZCxvPXRoaXMucy5sZW5ndGgsbj1xZS56ZXJvcyhvLG8pO2ZvcihsZXQgdD0wO3Q8bzt0KyspTWF0aC5hYnModGhpcy5zW3RdKTw9cj9uLnNldCh0LHQsMCk6bi5zZXQodCx0LDEvdGhpcy5zW3RdKTtsZXQgcz10aGlzLlUsaT10aGlzLnJpZ2h0U2luZ3VsYXJWZWN0b3JzLHU9aS5tbXVsKG4pLGE9aS5yb3dzLGg9cy5yb3dzLGw9cWUuemVyb3MoYSxoKTtmb3IobGV0IHQ9MDt0PGE7dCsrKWZvcihsZXQgZT0wO2U8aDtlKyspe2xldCByPTA7Zm9yKGxldCBuPTA7bjxvO24rKylyKz11LmdldCh0LG4pKnMuZ2V0KGUsbik7bC5zZXQodCxlLHIpfXJldHVybiBsLm1tdWwoZSl9c29sdmVGb3JEaWFnb25hbCh0KXtyZXR1cm4gdGhpcy5zb2x2ZShxZS5kaWFnKHQpKX1pbnZlcnNlKCl7bGV0IHQ9dGhpcy5WLGU9dGhpcy50aHJlc2hvbGQscj10LnJvd3Msbz10LmNvbHVtbnMsbj1uZXcgcWUocix0aGlzLnMubGVuZ3RoKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bztyKyspTWF0aC5hYnModGhpcy5zW3JdKT5lJiZuLnNldChzLHIsdC5nZXQocyxyKS90aGlzLnNbcl0pO2xldCBzPXRoaXMuVSxpPXMucm93cyx1PXMuY29sdW1ucyxhPW5ldyBxZShyLGkpO2ZvcihsZXQgdD0wO3Q8cjt0KyspZm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IHI9MDtmb3IobGV0IG89MDtvPHU7bysrKXIrPW4uZ2V0KHQsbykqcy5nZXQoZSxvKTthLnNldCh0LGUscil9cmV0dXJuIGF9Z2V0IGNvbmRpdGlvbigpe3JldHVybiB0aGlzLnNbMF0vdGhpcy5zW01hdGgubWluKHRoaXMubSx0aGlzLm4pLTFdfWdldCBub3JtMigpe3JldHVybiB0aGlzLnNbMF19Z2V0IHJhbmsoKXtsZXQgdD1NYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF0qTnVtYmVyLkVQU0lMT04sZT0wLHI9dGhpcy5zO2ZvcihsZXQgbz0wLG49ci5sZW5ndGg7bzxuO28rKylyW29dPnQmJmUrKztyZXR1cm4gZX1nZXQgZGlhZ29uYWwoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnMpfWdldCB0aHJlc2hvbGQoKXtyZXR1cm4gTnVtYmVyLkVQU0lMT04vMipNYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF19Z2V0IGxlZnRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5VfWdldCByaWdodFNpbmd1bGFyVmVjdG9ycygpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7cmV0dXJuIHFlLmRpYWcodGhpcy5zKX19Y2xhc3MgR2V7Y29uc3RydWN0b3IodCxlPXt9KXtjb25zdHthc3N1bWVTeW1tZXRyaWM6cj0hMX09ZTtpZighKHQ9VWUuY2hlY2tNYXRyaXgodCkpLmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggaXMgbm90IGEgc3F1YXJlIG1hdHJpeCIpO2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IG11c3QgYmUgbm9uLWVtcHR5Iik7bGV0IG8sbixzPXQuY29sdW1ucyxpPW5ldyBxZShzLHMpLHU9bmV3IEZsb2F0NjRBcnJheShzKSxhPW5ldyBGbG9hdDY0QXJyYXkocyksaD10LGw9ITE7aWYobD0hIXJ8fHQuaXNTeW1tZXRyaWMoKSxsKXtmb3Iobz0wO288cztvKyspZm9yKG49MDtuPHM7bisrKWkuc2V0KG8sbixoLmdldChvLG4pKTshZnVuY3Rpb24odCxlLHIsbyl7bGV0IG4scyxpLHUsYSxoLGwsYztmb3IoYT0wO2E8dDthKyspclthXT1vLmdldCh0LTEsYSk7Zm9yKHU9dC0xO3U+MDt1LS0pe2ZvcihjPTAsaT0wLGg9MDtoPHU7aCsrKWMrPU1hdGguYWJzKHJbaF0pO2lmKDA9PT1jKWZvcihlW3VdPXJbdS0xXSxhPTA7YTx1O2ErKylyW2FdPW8uZ2V0KHUtMSxhKSxvLnNldCh1LGEsMCksby5zZXQoYSx1LDApO2Vsc2V7Zm9yKGg9MDtoPHU7aCsrKXJbaF0vPWMsaSs9cltoXSpyW2hdO2ZvcihuPXJbdS0xXSxzPU1hdGguc3FydChpKSxuPjAmJihzPS1zKSxlW3VdPWMqcyxpLT1uKnMsclt1LTFdPW4tcyxhPTA7YTx1O2ErKyllW2FdPTA7Zm9yKGE9MDthPHU7YSsrKXtmb3Iobj1yW2FdLG8uc2V0KGEsdSxuKSxzPWVbYV0rby5nZXQoYSxhKSpuLGg9YSsxO2g8PXUtMTtoKyspcys9by5nZXQoaCxhKSpyW2hdLGVbaF0rPW8uZ2V0KGgsYSkqbjtlW2FdPXN9Zm9yKG49MCxhPTA7YTx1O2ErKyllW2FdLz1pLG4rPWVbYV0qclthXTtmb3IobD1uLyhpK2kpLGE9MDthPHU7YSsrKWVbYV0tPWwqclthXTtmb3IoYT0wO2E8dTthKyspe2ZvcihuPXJbYV0scz1lW2FdLGg9YTtoPD11LTE7aCsrKW8uc2V0KGgsYSxvLmdldChoLGEpLShuKmVbaF0rcypyW2hdKSk7clthXT1vLmdldCh1LTEsYSksby5zZXQodSxhLDApfX1yW3VdPWl9Zm9yKHU9MDt1PHQtMTt1Kyspe2lmKG8uc2V0KHQtMSx1LG8uZ2V0KHUsdSkpLG8uc2V0KHUsdSwxKSxpPXJbdSsxXSwwIT09aSl7Zm9yKGg9MDtoPD11O2grKylyW2hdPW8uZ2V0KGgsdSsxKS9pO2ZvcihhPTA7YTw9dTthKyspe2ZvcihzPTAsaD0wO2g8PXU7aCsrKXMrPW8uZ2V0KGgsdSsxKSpvLmdldChoLGEpO2ZvcihoPTA7aDw9dTtoKyspby5zZXQoaCxhLG8uZ2V0KGgsYSktcypyW2hdKX19Zm9yKGg9MDtoPD11O2grKylvLnNldChoLHUrMSwwKX1mb3IoYT0wO2E8dDthKyspclthXT1vLmdldCh0LTEsYSksby5zZXQodC0xLGEsMCk7by5zZXQodC0xLHQtMSwxKSxlWzBdPTB9KHMsYSx1LGkpLGZ1bmN0aW9uKHQsZSxyLG8pe2xldCBuLHMsaSx1LGEsaCxsLGMsZixtLGcscCx3LGQsYix5O2ZvcihpPTE7aTx0O2krKyllW2ktMV09ZVtpXTtlW3QtMV09MDtsZXQgdj0wLE09MCx4PU51bWJlci5FUFNJTE9OO2ZvcihoPTA7aDx0O2grKyl7Zm9yKE09TWF0aC5tYXgoTSxNYXRoLmFicyhyW2hdKStNYXRoLmFicyhlW2hdKSksbD1oO2w8dCYmIShNYXRoLmFicyhlW2xdKTw9eCpNKTspbCsrO2lmKGw+aClkb3tmb3Iobj1yW2hdLGM9KHJbaCsxXS1uKS8oMiplW2hdKSxmPUxlKGMsMSksYzwwJiYoZj0tZikscltoXT1lW2hdLyhjK2YpLHJbaCsxXT1lW2hdKihjK2YpLG09cltoKzFdLHM9bi1yW2hdLGk9aCsyO2k8dDtpKyspcltpXS09cztmb3Iodis9cyxjPXJbbF0sZz0xLHA9Zyx3PWcsZD1lW2grMV0sYj0wLHk9MCxpPWwtMTtpPj1oO2ktLSlmb3Iodz1wLHA9Zyx5PWIsbj1nKmVbaV0scz1nKmMsZj1MZShjLGVbaV0pLGVbaSsxXT1iKmYsYj1lW2ldL2YsZz1jL2YsYz1nKnJbaV0tYipuLHJbaSsxXT1zK2IqKGcqbitiKnJbaV0pLGE9MDthPHQ7YSsrKXM9by5nZXQoYSxpKzEpLG8uc2V0KGEsaSsxLGIqby5nZXQoYSxpKStnKnMpLG8uc2V0KGEsaSxnKm8uZ2V0KGEsaSktYipzKTtjPS1iKnkqdypkKmVbaF0vbSxlW2hdPWIqYyxyW2hdPWcqY313aGlsZShNYXRoLmFicyhlW2hdKT54Kk0pO3JbaF09cltoXSt2LGVbaF09MH1mb3IoaT0wO2k8dC0xO2krKyl7Zm9yKGE9aSxjPXJbaV0sdT1pKzE7dTx0O3UrKylyW3VdPGMmJihhPXUsYz1yW3VdKTtpZihhIT09aSlmb3IoclthXT1yW2ldLHJbaV09Yyx1PTA7dTx0O3UrKyljPW8uZ2V0KHUsaSksby5zZXQodSxpLG8uZ2V0KHUsYSkpLG8uc2V0KHUsYSxjKX19KHMsYSx1LGkpfWVsc2V7bGV0IHQ9bmV3IHFlKHMscyksZT1uZXcgRmxvYXQ2NEFycmF5KHMpO2ZvcihuPTA7bjxzO24rKylmb3Iobz0wO288cztvKyspdC5zZXQobyxuLGguZ2V0KG8sbikpOyFmdW5jdGlvbih0LGUscixvKXtsZXQgbixzLGksdSxhLGgsbCxjPTAsZj10LTE7Zm9yKGg9YysxO2g8PWYtMTtoKyspe2ZvcihsPTAsdT1oO3U8PWY7dSsrKWwrPU1hdGguYWJzKGUuZ2V0KHUsaC0xKSk7aWYoMCE9PWwpe2ZvcihpPTAsdT1mO3U+PWg7dS0tKXJbdV09ZS5nZXQodSxoLTEpL2wsaSs9clt1XSpyW3VdO2ZvcihzPU1hdGguc3FydChpKSxyW2hdPjAmJihzPS1zKSxpLT1yW2hdKnMscltoXT1yW2hdLXMsYT1oO2E8dDthKyspe2ZvcihuPTAsdT1mO3U+PWg7dS0tKW4rPXJbdV0qZS5nZXQodSxhKTtmb3Iobi89aSx1PWg7dTw9Zjt1KyspZS5zZXQodSxhLGUuZ2V0KHUsYSktbipyW3VdKX1mb3IodT0wO3U8PWY7dSsrKXtmb3Iobj0wLGE9ZjthPj1oO2EtLSluKz1yW2FdKmUuZ2V0KHUsYSk7Zm9yKG4vPWksYT1oO2E8PWY7YSsrKWUuc2V0KHUsYSxlLmdldCh1LGEpLW4qclthXSl9cltoXT1sKnJbaF0sZS5zZXQoaCxoLTEsbCpzKX19Zm9yKHU9MDt1PHQ7dSsrKWZvcihhPTA7YTx0O2ErKylvLnNldCh1LGEsdT09PWE/MTowKTtmb3IoaD1mLTE7aD49YysxO2gtLSlpZigwIT09ZS5nZXQoaCxoLTEpKXtmb3IodT1oKzE7dTw9Zjt1Kyspclt1XT1lLmdldCh1LGgtMSk7Zm9yKGE9aDthPD1mO2ErKyl7Zm9yKHM9MCx1PWg7dTw9Zjt1Kyspcys9clt1XSpvLmdldCh1LGEpO2ZvcihzPXMvcltoXS9lLmdldChoLGgtMSksdT1oO3U8PWY7dSsrKW8uc2V0KHUsYSxvLmdldCh1LGEpK3Mqclt1XSl9fX0ocyx0LGUsaSksZnVuY3Rpb24odCxlLHIsbyxuKXtsZXQgcyxpLHUsYSxoLGwsYyxmLG0sZyxwLHcsZCxiLHksdj10LTEsTT0wLHg9dC0xLEU9TnVtYmVyLkVQU0lMT04sUz0wLGo9MCxfPTAsQT0wLEM9MCxSPTAsST0wLGs9MDtmb3Iocz0wO3M8dDtzKyspZm9yKChzPE18fHM+eCkmJihyW3NdPW4uZ2V0KHMscyksZVtzXT0wKSxpPU1hdGgubWF4KHMtMSwwKTtpPHQ7aSsrKWorPU1hdGguYWJzKG4uZ2V0KHMsaSkpO2Zvcig7dj49TTspe2ZvcihhPXY7YT5NJiYoUj1NYXRoLmFicyhuLmdldChhLTEsYS0xKSkrTWF0aC5hYnMobi5nZXQoYSxhKSksMD09PVImJihSPWopLCEoTWF0aC5hYnMobi5nZXQoYSxhLTEpKTxFKlIpKTspYS0tO2lmKGE9PT12KW4uc2V0KHYsdixuLmdldCh2LHYpK1MpLHJbdl09bi5nZXQodix2KSxlW3ZdPTAsdi0tLGs9MDtlbHNlIGlmKGE9PT12LTEpe2lmKGM9bi5nZXQodix2LTEpKm4uZ2V0KHYtMSx2KSxfPShuLmdldCh2LTEsdi0xKS1uLmdldCh2LHYpKS8yLEE9XypfK2MsST1NYXRoLnNxcnQoTWF0aC5hYnMoQSkpLG4uc2V0KHYsdixuLmdldCh2LHYpK1MpLG4uc2V0KHYtMSx2LTEsbi5nZXQodi0xLHYtMSkrUyksZj1uLmdldCh2LHYpLEE+PTApe2ZvcihJPV8+PTA/XytJOl8tSSxyW3YtMV09ZitJLHJbdl09clt2LTFdLDAhPT1JJiYoclt2XT1mLWMvSSksZVt2LTFdPTAsZVt2XT0wLGY9bi5nZXQodix2LTEpLFI9TWF0aC5hYnMoZikrTWF0aC5hYnMoSSksXz1mL1IsQT1JL1IsQz1NYXRoLnNxcnQoXypfK0EqQSksXy89QyxBLz1DLGk9di0xO2k8dDtpKyspST1uLmdldCh2LTEsaSksbi5zZXQodi0xLGksQSpJK18qbi5nZXQodixpKSksbi5zZXQodixpLEEqbi5nZXQodixpKS1fKkkpO2ZvcihzPTA7czw9djtzKyspST1uLmdldChzLHYtMSksbi5zZXQocyx2LTEsQSpJK18qbi5nZXQocyx2KSksbi5zZXQocyx2LEEqbi5nZXQocyx2KS1fKkkpO2ZvcihzPU07czw9eDtzKyspST1vLmdldChzLHYtMSksby5zZXQocyx2LTEsQSpJK18qby5nZXQocyx2KSksby5zZXQocyx2LEEqby5nZXQocyx2KS1fKkkpfWVsc2Ugclt2LTFdPWYrXyxyW3ZdPWYrXyxlW3YtMV09SSxlW3ZdPS1JO3YtPTIsaz0wfWVsc2V7aWYoZj1uLmdldCh2LHYpLG09MCxjPTAsYTx2JiYobT1uLmdldCh2LTEsdi0xKSxjPW4uZ2V0KHYsdi0xKSpuLmdldCh2LTEsdikpLDEwPT09ayl7Zm9yKFMrPWYscz1NO3M8PXY7cysrKW4uc2V0KHMscyxuLmdldChzLHMpLWYpO1I9TWF0aC5hYnMobi5nZXQodix2LTEpKStNYXRoLmFicyhuLmdldCh2LTEsdi0yKSksZj1tPS43NSpSLGM9LS40Mzc1KlIqUn1pZigzMD09PWsmJihSPShtLWYpLzIsUj1SKlIrYyxSPjApKXtmb3IoUj1NYXRoLnNxcnQoUiksbTxmJiYoUj0tUiksUj1mLWMvKChtLWYpLzIrUikscz1NO3M8PXY7cysrKW4uc2V0KHMscyxuLmdldChzLHMpLVIpO1MrPVIsZj1tPWM9Ljk2NH1mb3Ioays9MSxoPXYtMjtoPj1hJiYoST1uLmdldChoLGgpLEM9Zi1JLFI9bS1JLF89KEMqUi1jKS9uLmdldChoKzEsaCkrbi5nZXQoaCxoKzEpLEE9bi5nZXQoaCsxLGgrMSktSS1DLVIsQz1uLmdldChoKzIsaCsxKSxSPU1hdGguYWJzKF8pK01hdGguYWJzKEEpK01hdGguYWJzKEMpLF8vPVIsQS89UixDLz1SLGghPT1hKSYmIShNYXRoLmFicyhuLmdldChoLGgtMSkpKihNYXRoLmFicyhBKStNYXRoLmFicyhDKSk8RSooTWF0aC5hYnMoXykqKE1hdGguYWJzKG4uZ2V0KGgtMSxoLTEpKStNYXRoLmFicyhJKStNYXRoLmFicyhuLmdldChoKzEsaCsxKSkpKSk7KWgtLTtmb3Iocz1oKzI7czw9djtzKyspbi5zZXQocyxzLTIsMCkscz5oKzImJm4uc2V0KHMscy0zLDApO2Zvcih1PWg7dTw9di0xJiYoYj11IT09di0xLHUhPT1oJiYoXz1uLmdldCh1LHUtMSksQT1uLmdldCh1KzEsdS0xKSxDPWI/bi5nZXQodSsyLHUtMSk6MCxmPU1hdGguYWJzKF8pK01hdGguYWJzKEEpK01hdGguYWJzKEMpLDAhPT1mJiYoXy89ZixBLz1mLEMvPWYpKSwwIT09Zik7dSsrKWlmKFI9TWF0aC5zcXJ0KF8qXytBKkErQypDKSxfPDAmJihSPS1SKSwwIT09Uil7Zm9yKHUhPT1oP24uc2V0KHUsdS0xLC1SKmYpOmEhPT1oJiZuLnNldCh1LHUtMSwtbi5nZXQodSx1LTEpKSxfKz1SLGY9Xy9SLG09QS9SLEk9Qy9SLEEvPV8sQy89XyxpPXU7aTx0O2krKylfPW4uZ2V0KHUsaSkrQSpuLmdldCh1KzEsaSksYiYmKF8rPUMqbi5nZXQodSsyLGkpLG4uc2V0KHUrMixpLG4uZ2V0KHUrMixpKS1fKkkpKSxuLnNldCh1LGksbi5nZXQodSxpKS1fKmYpLG4uc2V0KHUrMSxpLG4uZ2V0KHUrMSxpKS1fKm0pO2ZvcihzPTA7czw9TWF0aC5taW4odix1KzMpO3MrKylfPWYqbi5nZXQocyx1KSttKm4uZ2V0KHMsdSsxKSxiJiYoXys9SSpuLmdldChzLHUrMiksbi5zZXQocyx1KzIsbi5nZXQocyx1KzIpLV8qQykpLG4uc2V0KHMsdSxuLmdldChzLHUpLV8pLG4uc2V0KHMsdSsxLG4uZ2V0KHMsdSsxKS1fKkEpO2ZvcihzPU07czw9eDtzKyspXz1mKm8uZ2V0KHMsdSkrbSpvLmdldChzLHUrMSksYiYmKF8rPUkqby5nZXQocyx1KzIpLG8uc2V0KHMsdSsyLG8uZ2V0KHMsdSsyKS1fKkMpKSxvLnNldChzLHUsby5nZXQocyx1KS1fKSxvLnNldChzLHUrMSxvLmdldChzLHUrMSktXypBKX19fWlmKDA9PT1qKXJldHVybjtmb3Iodj10LTE7dj49MDt2LS0paWYoXz1yW3ZdLEE9ZVt2XSwwPT09QSlmb3IoYT12LG4uc2V0KHYsdiwxKSxzPXYtMTtzPj0wO3MtLSl7Zm9yKGM9bi5nZXQocyxzKS1fLEM9MCxpPWE7aTw9djtpKyspQys9bi5nZXQocyxpKSpuLmdldChpLHYpO2lmKGVbc108MClJPWMsUj1DO2Vsc2UgaWYoYT1zLDA9PT1lW3NdP24uc2V0KHMsdiwwIT09Yz8tQy9jOi1DLyhFKmopKTooZj1uLmdldChzLHMrMSksbT1uLmdldChzKzEscyksQT0ocltzXS1fKSoocltzXS1fKStlW3NdKmVbc10sbD0oZipSLUkqQykvQSxuLnNldChzLHYsbCksbi5zZXQocysxLHYsTWF0aC5hYnMoZik+TWF0aC5hYnMoSSk/KC1DLWMqbCkvZjooLVItbSpsKS9JKSksbD1NYXRoLmFicyhuLmdldChzLHYpKSxFKmwqbD4xKWZvcihpPXM7aTw9djtpKyspbi5zZXQoaSx2LG4uZ2V0KGksdikvbCl9ZWxzZSBpZihBPDApZm9yKGE9di0xLE1hdGguYWJzKG4uZ2V0KHYsdi0xKSk+TWF0aC5hYnMobi5nZXQodi0xLHYpKT8obi5zZXQodi0xLHYtMSxBL24uZ2V0KHYsdi0xKSksbi5zZXQodi0xLHYsLShuLmdldCh2LHYpLV8pL24uZ2V0KHYsdi0xKSkpOih5PUtlKDAsLW4uZ2V0KHYtMSx2KSxuLmdldCh2LTEsdi0xKS1fLEEpLG4uc2V0KHYtMSx2LTEseVswXSksbi5zZXQodi0xLHYseVsxXSkpLG4uc2V0KHYsdi0xLDApLG4uc2V0KHYsdiwxKSxzPXYtMjtzPj0wO3MtLSl7Zm9yKGc9MCxwPTAsaT1hO2k8PXY7aSsrKWcrPW4uZ2V0KHMsaSkqbi5nZXQoaSx2LTEpLHArPW4uZ2V0KHMsaSkqbi5nZXQoaSx2KTtpZihjPW4uZ2V0KHMscyktXyxlW3NdPDApST1jLEM9ZyxSPXA7ZWxzZSBpZihhPXMsMD09PWVbc10/KHk9S2UoLWcsLXAsYyxBKSxuLnNldChzLHYtMSx5WzBdKSxuLnNldChzLHYseVsxXSkpOihmPW4uZ2V0KHMscysxKSxtPW4uZ2V0KHMrMSxzKSx3PShyW3NdLV8pKihyW3NdLV8pK2Vbc10qZVtzXS1BKkEsZD0yKihyW3NdLV8pKkEsMD09PXcmJjA9PT1kJiYodz1FKmoqKE1hdGguYWJzKGMpK01hdGguYWJzKEEpK01hdGguYWJzKGYpK01hdGguYWJzKG0pK01hdGguYWJzKEkpKSkseT1LZShmKkMtSSpnK0EqcCxmKlItSSpwLUEqZyx3LGQpLG4uc2V0KHMsdi0xLHlbMF0pLG4uc2V0KHMsdix5WzFdKSxNYXRoLmFicyhmKT5NYXRoLmFicyhJKStNYXRoLmFicyhBKT8obi5zZXQocysxLHYtMSwoLWctYypuLmdldChzLHYtMSkrQSpuLmdldChzLHYpKS9mKSxuLnNldChzKzEsdiwoLXAtYypuLmdldChzLHYpLUEqbi5nZXQocyx2LTEpKS9mKSk6KHk9S2UoLUMtbSpuLmdldChzLHYtMSksLVItbSpuLmdldChzLHYpLEksQSksbi5zZXQocysxLHYtMSx5WzBdKSxuLnNldChzKzEsdix5WzFdKSkpLGw9TWF0aC5tYXgoTWF0aC5hYnMobi5nZXQocyx2LTEpKSxNYXRoLmFicyhuLmdldChzLHYpKSksRSpsKmw+MSlmb3IoaT1zO2k8PXY7aSsrKW4uc2V0KGksdi0xLG4uZ2V0KGksdi0xKS9sKSxuLnNldChpLHYsbi5nZXQoaSx2KS9sKX1mb3Iocz0wO3M8dDtzKyspaWYoczxNfHxzPngpZm9yKGk9cztpPHQ7aSsrKW8uc2V0KHMsaSxuLmdldChzLGkpKTtmb3IoaT10LTE7aT49TTtpLS0pZm9yKHM9TTtzPD14O3MrKyl7Zm9yKEk9MCx1PU07dTw9TWF0aC5taW4oaSx4KTt1KyspSSs9by5nZXQocyx1KSpuLmdldCh1LGkpO28uc2V0KHMsaSxJKX19KHMsYSx1LGksdCl9dGhpcy5uPXMsdGhpcy5lPWEsdGhpcy5kPXUsdGhpcy5WPWl9Z2V0IHJlYWxFaWdlbnZhbHVlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZCl9Z2V0IGltYWdpbmFyeUVpZ2VudmFsdWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5lKX1nZXQgZWlnZW52ZWN0b3JNYXRyaXgoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe2xldCB0LGUscj10aGlzLm4sbz10aGlzLmUsbj10aGlzLmQscz1uZXcgcWUocixyKTtmb3IodD0wO3Q8cjt0Kyspe2ZvcihlPTA7ZTxyO2UrKylzLnNldCh0LGUsMCk7cy5zZXQodCx0LG5bdF0pLG9bdF0+MD9zLnNldCh0LHQrMSxvW3RdKTpvW3RdPDAmJnMuc2V0KHQsdC0xLG9bdF0pfXJldHVybiBzfX1mdW5jdGlvbiBLZSh0LGUscixvKXtsZXQgbixzO3JldHVybiBNYXRoLmFicyhyKT5NYXRoLmFicyhvKT8obj1vL3Iscz1yK24qbyxbKHQrbiplKS9zLChlLW4qdCkvc10pOihuPXIvbyxzPW8rbipyLFsobip0K2UpL3MsKG4qZS10KS9zXSl9Y2xhc3MgV2V7Y29uc3RydWN0b3IodCxlPXt9KXt0PVVlLmNoZWNrTWF0cml4KHQpO2xldHtZOnJ9PWU7Y29uc3R7c2NhbGVTY29yZXM6bz0hMSxtYXhJdGVyYXRpb25zOm49MWUzLHRlcm1pbmF0aW9uQ3JpdGVyaWE6cz0xZS0xMH09ZTtsZXQgaTtpZihyKXtpZihyPUFycmF5LmlzQXJyYXkocikmJiJudW1iZXIiPT10eXBlb2YgclswXT9xZS5jb2x1bW5WZWN0b3Iocik6VWUuY2hlY2tNYXRyaXgociksci5yb3dzIT09dC5yb3dzKXRocm93IG5ldyBFcnJvcigiWSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyBYIik7aT1yLmdldENvbHVtblZlY3RvcigwKX1lbHNlIGk9dC5nZXRDb2x1bW5WZWN0b3IoMCk7bGV0IHUsYSxoLGwsYz0xO2ZvcihsZXQgZT0wO2U8biYmYz5zO2UrKyloPXQudHJhbnNwb3NlKCkubW11bChpKS5kaXYoaS50cmFuc3Bvc2UoKS5tbXVsKGkpLmdldCgwLDApKSxoPWguZGl2KGgubm9ybSgpKSx1PXQubW11bChoKS5kaXYoaC50cmFuc3Bvc2UoKS5tbXVsKGgpLmdldCgwLDApKSxlPjAmJihjPXUuY2xvbmUoKS5zdWIobCkucG93KDIpLnN1bSgpKSxsPXUuY2xvbmUoKSxyPyhhPXIudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxhPWEuZGl2KGEubm9ybSgpKSxpPXIubW11bChhKS5kaXYoYS50cmFuc3Bvc2UoKS5tbXVsKGEpLmdldCgwLDApKSk6aT11O2lmKHIpe2xldCBlPXQudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKTtlPWUuZGl2KGUubm9ybSgpKTtsZXQgbz10LmNsb25lKCkuc3ViKHUuY2xvbmUoKS5tbXVsKGUudHJhbnNwb3NlKCkpKSxuPWkudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxzPXIuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm11bFMobi5nZXQoMCwwKSkubW11bChhLnRyYW5zcG9zZSgpKSk7dGhpcy50PXUsdGhpcy5wPWUudHJhbnNwb3NlKCksdGhpcy53PWgudHJhbnNwb3NlKCksdGhpcy5xPWEsdGhpcy51PWksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KSx0aGlzLnhSZXNpZHVhbD1vLHRoaXMueVJlc2lkdWFsPXMsdGhpcy5iZXRhcz1ufWVsc2UgdGhpcy53PWgudHJhbnNwb3NlKCksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KS5zcXJ0KCksdGhpcy50PW8/dS5jbG9uZSgpLmRpdih0aGlzLnMuZ2V0KDAsMCkpOnUsdGhpcy54UmVzaWR1YWw9dC5zdWIodS5tbXVsKGgudHJhbnNwb3NlKCkpKX19Y2xhc3MgWGV7Y29uc3RydWN0b3IodCxlPXt9KXtpZighMD09PXQpe2NvbnN0IHQ9ZTtyZXR1cm4gdGhpcy5jZW50ZXI9dC5jZW50ZXIsdGhpcy5zY2FsZT10LnNjYWxlLHRoaXMubWVhbnM9dC5tZWFucyx0aGlzLnN0ZGV2cz10LnN0ZGV2cyx0aGlzLlU9cWUuY2hlY2tNYXRyaXgodC5VKSx0aGlzLlM9dC5TLHRoaXMuUj10LlIsdm9pZCh0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9dC5leGNsdWRlZEZlYXR1cmVzfHxbXSl9dD1uZXcgcWUodCk7Y29uc3R7aXNDb3ZhcmlhbmNlTWF0cml4OnI9ITEsbWV0aG9kOm89IlNWRCIsbkNvbXBOSVBBTFM6bj0yLGNlbnRlcjpzPSEwLHNjYWxlOmk9ITEsaWdub3JlWmVyb1ZhcmlhbmNlOnU9ITF9PWU7aWYodGhpcy5jZW50ZXI9cyx0aGlzLnNjYWxlPWksdGhpcy5tZWFucz1udWxsLHRoaXMuc3RkZXZzPW51bGwsdGhpcy5leGNsdWRlZEZlYXR1cmVzPVtdLHIpdGhpcy5fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpO2Vsc2Ugc3dpdGNoKHRoaXMuX2FkanVzdCh0LHUpLG8pe2Nhc2UiY292YXJpYW5jZU1hdHJpeCI6e2NvbnN0IGU9bmV3IERlKHQpLm1tdWwodCkuZGl2KHQucm93cy0xKTt0aGlzLl9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgoZSk7YnJlYWt9Y2FzZSJOSVBBTFMiOnRoaXMuX2NvbXB1dGVXaXRoTklQQUxTKHQsbik7YnJlYWs7Y2FzZSJTVkQiOntjb25zdCBlPW5ldyBCZSh0LHtjb21wdXRlTGVmdFNpbmd1bGFyVmVjdG9yczohMSxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6ITAsYXV0b1RyYW5zcG9zZTohMH0pO3RoaXMuVT1lLnJpZ2h0U2luZ3VsYXJWZWN0b3JzO2NvbnN0IHI9ZS5kaWFnb25hbCxvPVtdO2Zvcihjb25zdCBlIG9mIHIpby5wdXNoKGUqZS8odC5yb3dzLTEpKTt0aGlzLlM9bzticmVha31kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5rbm93biBtZXRob2Q6ICR7b31gKX19c3RhdGljIGxvYWQodCl7aWYoInN0cmluZyIhPXR5cGVvZiB0Lm5hbWUpdGhyb3cgbmV3IFR5cGVFcnJvcigibW9kZWwgbXVzdCBoYXZlIGEgbmFtZSBwcm9wZXJ0eSIpO2lmKCJQQ0EiIT09dC5uYW1lKXRocm93IG5ldyBSYW5nZUVycm9yKGBpbnZhbGlkIG1vZGVsOiAke3QubmFtZX1gKTtyZXR1cm4gbmV3IFhlKCEwLHQpfXByZWRpY3QodCxlPXt9KXtjb25zdHtuQ29tcG9uZW50czpyPXRoaXMuVS5jb2x1bW5zfT1lO2lmKHQ9bmV3IHFlKHQpLHRoaXMuY2VudGVyJiYodC5zdWJSb3dWZWN0b3IodGhpcy5tZWFucyksdGhpcy5zY2FsZSkpe2ZvcihsZXQgZSBvZiB0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMpdC5yZW1vdmVDb2x1bW4oZSk7dC5kaXZSb3dWZWN0b3IodGhpcy5zdGRldnMpfWxldCBvPXQubW11bCh0aGlzLlUpO3JldHVybiBvLnN1Yk1hdHJpeCgwLG8ucm93cy0xLDAsci0xKX1pbnZlcnQodCl7bGV0IGU9KHQ9cWUuY2hlY2tNYXRyaXgodCkpLm1tdWwodGhpcy5VLnRyYW5zcG9zZSgpKTtyZXR1cm4gdGhpcy5jZW50ZXImJih0aGlzLnNjYWxlJiZlLm11bFJvd1ZlY3Rvcih0aGlzLnN0ZGV2cyksZS5hZGRSb3dWZWN0b3IodGhpcy5tZWFucykpLGV9Z2V0RXhwbGFpbmVkVmFyaWFuY2UoKXtsZXQgdD0wO2Zvcihjb25zdCBlIG9mIHRoaXMuUyl0Kz1lO3JldHVybiB0aGlzLlMubWFwKChlPT5lL3QpKX1nZXRDdW11bGF0aXZlVmFyaWFuY2UoKXtsZXQgdD10aGlzLmdldEV4cGxhaW5lZFZhcmlhbmNlKCk7Zm9yKGxldCBlPTE7ZTx0Lmxlbmd0aDtlKyspdFtlXSs9dFtlLTFdO3JldHVybiB0fWdldEVpZ2VudmVjdG9ycygpe3JldHVybiB0aGlzLlV9Z2V0RWlnZW52YWx1ZXMoKXtyZXR1cm4gdGhpcy5TfWdldFN0YW5kYXJkRGV2aWF0aW9ucygpe3JldHVybiB0aGlzLlMubWFwKCh0PT5NYXRoLnNxcnQodCkpKX1nZXRMb2FkaW5ncygpe3JldHVybiB0aGlzLlUudHJhbnNwb3NlKCl9dG9KU09OKCl7cmV0dXJue25hbWU6IlBDQSIsY2VudGVyOnRoaXMuY2VudGVyLHNjYWxlOnRoaXMuc2NhbGUsbWVhbnM6dGhpcy5tZWFucyxzdGRldnM6dGhpcy5zdGRldnMsVTp0aGlzLlUsUzp0aGlzLlMsZXhjbHVkZWRGZWF0dXJlczp0aGlzLmV4Y2x1ZGVkRmVhdHVyZXN9fV9hZGp1c3QodCxlKXtpZih0aGlzLmNlbnRlcil7Y29uc3Qgcj10Lm1lYW4oImNvbHVtbiIpLG89dGhpcy5zY2FsZT90LnN0YW5kYXJkRGV2aWF0aW9uKCJjb2x1bW4iLHttZWFuOnJ9KTpudWxsO2lmKHRoaXMubWVhbnM9cix0LnN1YlJvd1ZlY3RvcihyKSx0aGlzLnNjYWxlKXtmb3IobGV0IHI9MDtyPG8ubGVuZ3RoO3IrKylpZigwPT09b1tyXSl7aWYoIWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENhbm5vdCBzY2FsZSB0aGUgZGF0YXNldCAoc3RhbmRhcmQgZGV2aWF0aW9uIGlzIHplcm8gYXQgaW5kZXggJHtyfWApO3QucmVtb3ZlQ29sdW1uKHIpLG8uc3BsaWNlKHIsMSksdGhpcy5leGNsdWRlZEZlYXR1cmVzLnB1c2gociksci0tfXRoaXMuc3RkZXZzPW8sdC5kaXZSb3dWZWN0b3Iobyl9fX1fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpe2NvbnN0IGU9bmV3IEdlKHQse2Fzc3VtZVN5bW1ldHJpYzohMH0pO3RoaXMuVT1lLmVpZ2VudmVjdG9yTWF0cml4LHRoaXMuVS5mbGlwUm93cygpLHRoaXMuUz1lLnJlYWxFaWdlbnZhbHVlcyx0aGlzLlMucmV2ZXJzZSgpfV9jb21wdXRlV2l0aE5JUEFMUyh0LGUpe3RoaXMuVT1uZXcgcWUoZSx0LmNvbHVtbnMpLHRoaXMuUz1bXTtsZXQgcj10O2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW5ldyBXZShyKTt0aGlzLlUuc2V0Um93KHQsZS53LnRyYW5zcG9zZSgpKSx0aGlzLlMucHVzaChNYXRoLnBvdyhlLnMuZ2V0KDAsMCksMikpLHI9ZS54UmVzaWR1YWx9dGhpcy5VPXRoaXMuVS50cmFuc3Bvc2UoKX19ZnVuY3Rpb24gSmUodCxlPXt9KXtpZighZGUodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9Q3QoZSwic2NhbGUiKTtmZShyKXx8KHI9ITApO2xldCBvPUN0KGUsIm5Db21wTklQQUxTIik7Y2Uobyl8fChvPTIpO2xldCBuPWxlKEN0KHQsMCxbXSkpO2lmKDA9PT1uKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBkaW1lbnNpb24gb2YgZGF0YSIpO2lmKG8+bil0aHJvdyBuZXcgRXJyb3IoIm5Db21wTklQQUxTIGlzIG1vcmUgdGhhbiB0aGUgZGltZW5zaW9uIG9mIGRhdGEiKTtsZXQgcz1uZXcgWGUodCx7bWV0aG9kOiJOSVBBTFMiLHNjYWxlOnIsbkNvbXBOSVBBTFM6b30pLGk9cy5wcmVkaWN0KHQpO3JldHVybiBzLmludmVydChpKS50b0pTT04oKX12YXIgWWU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7KytyPG8mJiExIT09ZSh0W3JdLHIsdCk7KTtyZXR1cm4gdH07dmFyIFplPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbyl7Zm9yKHZhciBuPS0xLHM9T2JqZWN0KGUpLGk9byhlKSx1PWkubGVuZ3RoO3UtLTspe3ZhciBhPWlbdD91Oisrbl07aWYoITE9PT1yKHNbYV0sYSxzKSlicmVha31yZXR1cm4gZX19KCk7dmFyIEhlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG89QXJyYXkodCk7KytyPHQ7KW9bcl09ZShyKTtyZXR1cm4gb307dmFyIFFlPWZ1bmN0aW9uKHQpe3JldHVybiBkKHQpJiYiW29iamVjdCBBcmd1bWVudHNdIj09dyh0KX0sdHI9T2JqZWN0LnByb3RvdHlwZSxlcj10ci5oYXNPd25Qcm9wZXJ0eSxycj10ci5wcm9wZXJ0eUlzRW51bWVyYWJsZSxvcj1RZShmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP1FlOmZ1bmN0aW9uKHQpe3JldHVybiBkKHQpJiZlci5jYWxsKHQsImNhbGxlZSIpJiYhcnIuY2FsbCh0LCJjYWxsZWUiKX07dmFyIG5yPWZ1bmN0aW9uKCl7cmV0dXJuITF9LHNyPW8oKGZ1bmN0aW9uKHQsZSl7dmFyIHI9ZSYmIWUubm9kZVR5cGUmJmUsbz1yJiZ0JiYhdC5ub2RlVHlwZSYmdCxuPW8mJm8uZXhwb3J0cz09PXI/aS5CdWZmZXI6dm9pZCAwLHM9KG4/bi5pc0J1ZmZlcjp2b2lkIDApfHxucjt0LmV4cG9ydHM9c30pKSxpcj0vXig/OjB8WzEtOV1cZCopJC87dmFyIHVyPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lPzkwMDcxOTkyNTQ3NDA5OTE6ZSkmJigibnVtYmVyIj09cnx8InN5bWJvbCIhPXImJmlyLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX0sYXI9e307YXJbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPWFyWyJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXT1hclsiW29iamVjdCBJbnQ4QXJyYXldIl09YXJbIltvYmplY3QgSW50MTZBcnJheV0iXT1hclsiW29iamVjdCBJbnQzMkFycmF5XSJdPWFyWyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09YXJbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09YXJbIltvYmplY3QgVWludDE2QXJyYXldIl09YXJbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsYXJbIltvYmplY3QgQXJndW1lbnRzXSJdPWFyWyJbb2JqZWN0IEFycmF5XSJdPWFyWyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPWFyWyJbb2JqZWN0IEJvb2xlYW5dIl09YXJbIltvYmplY3QgRGF0YVZpZXddIl09YXJbIltvYmplY3QgRGF0ZV0iXT1hclsiW29iamVjdCBFcnJvcl0iXT1hclsiW29iamVjdCBGdW5jdGlvbl0iXT1hclsiW29iamVjdCBNYXBdIl09YXJbIltvYmplY3QgTnVtYmVyXSJdPWFyWyJbb2JqZWN0IE9iamVjdF0iXT1hclsiW29iamVjdCBSZWdFeHBdIl09YXJbIltvYmplY3QgU2V0XSJdPWFyWyJbb2JqZWN0IFN0cmluZ10iXT1hclsiW29iamVjdCBXZWFrTWFwXSJdPSExO3ZhciBocj1mdW5jdGlvbih0KXtyZXR1cm4gZCh0KSYmR3QodC5sZW5ndGgpJiYhIWFyW3codCldfTt2YXIgbHI9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX0sY3I9bygoZnVuY3Rpb24odCxlKXt2YXIgcj1lJiYhZS5ub2RlVHlwZSYmZSxvPXImJnQmJiF0Lm5vZGVUeXBlJiZ0LHM9byYmby5leHBvcnRzPT09ciYmbi5wcm9jZXNzLGk9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9byYmby5yZXF1aXJlJiZvLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8cyYmcy5iaW5kaW5nJiZzLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpO3QuZXhwb3J0cz1pfSkpLGZyPWNyJiZjci5pc1R5cGVkQXJyYXksbXI9ZnI/bHIoZnIpOmhyLGdyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHByPWZ1bmN0aW9uKGUscil7dmFyIG89dChlKSxuPSFvJiZvcihlKSxzPSFvJiYhbiYmc3IoZSksaT0hbyYmIW4mJiFzJiZtcihlKSx1PW98fG58fHN8fGksYT11P0hlKGUubGVuZ3RoLFN0cmluZyk6W10saD1hLmxlbmd0aDtmb3IodmFyIGwgaW4gZSkhciYmIWdyLmNhbGwoZSxsKXx8dSYmKCJsZW5ndGgiPT1sfHxzJiYoIm9mZnNldCI9PWx8fCJwYXJlbnQiPT1sKXx8aSYmKCJidWZmZXIiPT1sfHwiYnl0ZUxlbmd0aCI9PWx8fCJieXRlT2Zmc2V0Ij09bCl8fHVyKGwsaCkpfHxhLnB1c2gobCk7cmV0dXJuIGF9O3ZhciB3cj1mdW5jdGlvbih0KXtyZXR1cm4gS3QodCk/cHIodCk6T3QodCl9O3ZhciBkcj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyLG8pe2lmKG51bGw9PXIpcmV0dXJuIHI7aWYoIUt0KHIpKXJldHVybiB0KHIsbyk7Zm9yKHZhciBuPXIubGVuZ3RoLHM9ZT9uOi0xLGk9T2JqZWN0KHIpOyhlP3MtLTorK3M8bikmJiExIT09byhpW3NdLHMsaSk7KTtyZXR1cm4gcn19KChmdW5jdGlvbih0LGUpe3JldHVybiB0JiZaZSh0LGUsd3IpfSkpO3ZhciBicj1mdW5jdGlvbih0KXtyZXR1cm4gdH07dmFyIHlyPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6YnJ9O3ZhciB2cj1mdW5jdGlvbihlLHIpe3JldHVybih0KGUpP1llOmRyKShlLHlyKHIpKX07dmFyIE1yPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgbnQsdGhpcy5zaXplPTB9O3ZhciB4cj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUscn07dmFyIEVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX07dmFyIFNyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07dmFyIGpyPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihyIGluc3RhbmNlb2YgbnQpe3ZhciBvPXIuX19kYXRhX187aWYoIXN0fHxvLmxlbmd0aDwxOTkpcmV0dXJuIG8ucHVzaChbdCxlXSksdGhpcy5zaXplPSsrci5zaXplLHRoaXM7cj10aGlzLl9fZGF0YV9fPW5ldyBndChvKX1yZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemU9ci5zaXplLHRoaXN9O2Z1bmN0aW9uIF9yKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IG50KHQpO3RoaXMuc2l6ZT1lLnNpemV9X3IucHJvdG90eXBlLmNsZWFyPU1yLF9yLnByb3RvdHlwZS5kZWxldGU9eHIsX3IucHJvdG90eXBlLmdldD1Fcixfci5wcm90b3R5cGUuaGFzPVNyLF9yLnByb3RvdHlwZS5zZXQ9anI7dmFyIEFyPV9yO3ZhciBDcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQodCwiX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIpLHRoaXN9O3ZhciBScj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O2Z1bmN0aW9uIElyKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBndDsrK2U8cjspdGhpcy5hZGQodFtlXSl9SXIucHJvdG90eXBlLmFkZD1Jci5wcm90b3R5cGUucHVzaD1DcixJci5wcm90b3R5cGUuaGFzPVJyO3ZhciBrcj1Jcjt2YXIgTnI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7KytyPG87KWlmKGUodFtyXSxyLHQpKXJldHVybiEwO3JldHVybiExfTt2YXIgT3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5oYXMoZSl9O3ZhciBGcj1mdW5jdGlvbih0LGUscixvLG4scyl7dmFyIGk9MSZyLHU9dC5sZW5ndGgsYT1lLmxlbmd0aDtpZih1IT1hJiYhKGkmJmE+dSkpcmV0dXJuITE7dmFyIGg9cy5nZXQodCksbD1zLmdldChlKTtpZihoJiZsKXJldHVybiBoPT1lJiZsPT10O3ZhciBjPS0xLGY9ITAsbT0yJnI/bmV3IGtyOnZvaWQgMDtmb3Iocy5zZXQodCxlKSxzLnNldChlLHQpOysrYzx1Oyl7dmFyIGc9dFtjXSxwPWVbY107aWYobyl2YXIgdz1pP28ocCxnLGMsZSx0LHMpOm8oZyxwLGMsdCxlLHMpO2lmKHZvaWQgMCE9PXcpe2lmKHcpY29udGludWU7Zj0hMTticmVha31pZihtKXtpZighTnIoZSwoZnVuY3Rpb24odCxlKXtpZighT3IobSxlKSYmKGc9PT10fHxuKGcsdCxyLG8scykpKXJldHVybiBtLnB1c2goZSl9KSkpe2Y9ITE7YnJlYWt9fWVsc2UgaWYoZyE9PXAmJiFuKGcscCxyLG8scykpe2Y9ITE7YnJlYWt9fXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSxmfSx6cj1pLlVpbnQ4QXJyYXk7dmFyIFRyPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLHI9QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LG8pe3JbKytlXT1bbyx0XX0pKSxyfTt2YXIgVnI9ZnVuY3Rpb24odCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3JbKytlXT10fSkpLHJ9LFByPXU/dS5wcm90b3R5cGU6dm9pZCAwLHFyPVByP1ByLnZhbHVlT2Y6dm9pZCAwO3ZhciAkcj1mdW5jdGlvbih0LGUscixvLG4scyxpKXtzd2l0Y2gocil7Y2FzZSJbb2JqZWN0IERhdGFWaWV3XSI6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIltvYmplY3QgQXJyYXlCdWZmZXJdIjpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhcyhuZXcgenIodCksbmV3IHpyKGUpKSk7Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpjYXNlIltvYmplY3QgRGF0ZV0iOmNhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4gWSgrdCwrZSk7Y2FzZSJbb2JqZWN0IEVycm9yXSI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIltvYmplY3QgUmVnRXhwXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiB0PT1lKyIiO2Nhc2UiW29iamVjdCBNYXBdIjp2YXIgdT1UcjtjYXNlIltvYmplY3QgU2V0XSI6dmFyIGE9MSZvO2lmKHV8fCh1PVZyKSx0LnNpemUhPWUuc2l6ZSYmIWEpcmV0dXJuITE7dmFyIGg9aS5nZXQodCk7aWYoaClyZXR1cm4gaD09ZTtvfD0yLGkuc2V0KHQsZSk7dmFyIGw9RnIodSh0KSx1KGUpLG8sbixzLGkpO3JldHVybiBpLmRlbGV0ZSh0KSxsO2Nhc2UiW29iamVjdCBTeW1ib2xdIjppZihxcilyZXR1cm4gcXIuY2FsbCh0KT09cXIuY2FsbChlKX1yZXR1cm4hMX07dmFyIERyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG89ZS5sZW5ndGgsbj10Lmxlbmd0aDsrK3I8bzspdFtuK3JdPWVbcl07cmV0dXJuIHR9O3ZhciBVcj1mdW5jdGlvbihlLHIsbyl7dmFyIG49cihlKTtyZXR1cm4gdChlKT9uOkRyKG4sbyhlKSl9O3ZhciBMcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aCxuPTAscz1bXTsrK3I8bzspe3ZhciBpPXRbcl07ZShpLHIsdCkmJihzW24rK109aSl9cmV0dXJuIHN9O3ZhciBCcj1mdW5jdGlvbigpe3JldHVybltdfSxHcj1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLEtyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsV3I9S3I/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLExyKEtyKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gR3IuY2FsbCh0LGUpfSkpKX06QnI7dmFyIFhyPWZ1bmN0aW9uKHQpe3JldHVybiBVcih0LHdyLFdyKX0sSnI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgWXI9ZnVuY3Rpb24odCxlLHIsbyxuLHMpe3ZhciBpPTEmcix1PVhyKHQpLGE9dS5sZW5ndGg7aWYoYSE9WHIoZSkubGVuZ3RoJiYhaSlyZXR1cm4hMTtmb3IodmFyIGg9YTtoLS07KXt2YXIgbD11W2hdO2lmKCEoaT9sIGluIGU6SnIuY2FsbChlLGwpKSlyZXR1cm4hMX12YXIgYz1zLmdldCh0KSxmPXMuZ2V0KGUpO2lmKGMmJmYpcmV0dXJuIGM9PWUmJmY9PXQ7dmFyIG09ITA7cy5zZXQodCxlKSxzLnNldChlLHQpO2Zvcih2YXIgZz1pOysraDxhOyl7dmFyIHA9dFtsPXVbaF1dLHc9ZVtsXTtpZihvKXZhciBkPWk/byh3LHAsbCxlLHQscyk6byhwLHcsbCx0LGUscyk7aWYoISh2b2lkIDA9PT1kP3A9PT13fHxuKHAsdyxyLG8scyk6ZCkpe209ITE7YnJlYWt9Z3x8KGc9ImNvbnN0cnVjdG9yIj09bCl9aWYobSYmIWcpe3ZhciBiPXQuY29uc3RydWN0b3IseT1lLmNvbnN0cnVjdG9yO2I9PXl8fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBiJiYiZnVuY3Rpb24iPT10eXBlb2YgeSYmeSBpbnN0YW5jZW9mIHl8fChtPSExKX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSksbX0sWnI9IltvYmplY3QgT2JqZWN0XSIsSHI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgUXI9ZnVuY3Rpb24oZSxyLG8sbixzLGkpe3ZhciB1PXQoZSksYT10KHIpLGg9dT8iW29iamVjdCBBcnJheV0iOkJ0KGUpLGw9YT8iW29iamVjdCBBcnJheV0iOkJ0KHIpLGM9KGg9IltvYmplY3QgQXJndW1lbnRzXSI9PWg/WnI6aCk9PVpyLGY9KGw9IltvYmplY3QgQXJndW1lbnRzXSI9PWw/WnI6bCk9PVpyLG09aD09bDtpZihtJiZzcihlKSl7aWYoIXNyKHIpKXJldHVybiExO3U9ITAsYz0hMX1pZihtJiYhYylyZXR1cm4gaXx8KGk9bmV3IEFyKSx1fHxtcihlKT9GcihlLHIsbyxuLHMsaSk6JHIoZSxyLGgsbyxuLHMsaSk7aWYoISgxJm8pKXt2YXIgZz1jJiZIci5jYWxsKGUsIl9fd3JhcHBlZF9fIikscD1mJiZIci5jYWxsKHIsIl9fd3JhcHBlZF9fIik7aWYoZ3x8cCl7dmFyIHc9Zz9lLnZhbHVlKCk6ZSxkPXA/ci52YWx1ZSgpOnI7cmV0dXJuIGl8fChpPW5ldyBBcikscyh3LGQsbyxuLGkpfX1yZXR1cm4hIW0mJihpfHwoaT1uZXcgQXIpLFlyKGUscixvLG4scyxpKSl9O3ZhciB0bz1mdW5jdGlvbiB0KGUscixvLG4scyl7cmV0dXJuIGU9PT1yfHwobnVsbD09ZXx8bnVsbD09cnx8IWQoZSkmJiFkKHIpP2UhPWUmJnIhPXI6UXIoZSxyLG8sbix0LHMpKX07dmFyIGVvPWZ1bmN0aW9uKHQsZSxyLG8pe3ZhciBuPXIubGVuZ3RoLHM9bixpPSFvO2lmKG51bGw9PXQpcmV0dXJuIXM7Zm9yKHQ9T2JqZWN0KHQpO24tLTspe3ZhciB1PXJbbl07aWYoaSYmdVsyXT91WzFdIT09dFt1WzBdXTohKHVbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrbjxzOyl7dmFyIGE9KHU9cltuXSlbMF0saD10W2FdLGw9dVsxXTtpZihpJiZ1WzJdKXtpZih2b2lkIDA9PT1oJiYhKGEgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgYz1uZXcgQXI7aWYobyl2YXIgZj1vKGgsbCxhLHQsZSxjKTtpZighKHZvaWQgMD09PWY/dG8obCxoLDMsbyxjKTpmKSlyZXR1cm4hMX19cmV0dXJuITB9O3ZhciBybz1mdW5jdGlvbih0KXtyZXR1cm4gdD09dCYmIXgodCl9O3ZhciBvbz1mdW5jdGlvbih0KXtmb3IodmFyIGU9d3IodCkscj1lLmxlbmd0aDtyLS07KXt2YXIgbz1lW3JdLG49dFtvXTtlW3JdPVtvLG4scm8obildfXJldHVybiBlfTt2YXIgbm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG51bGwhPXImJihyW3RdPT09ZSYmKHZvaWQgMCE9PWV8fHQgaW4gT2JqZWN0KHIpKSl9fTt2YXIgc289ZnVuY3Rpb24odCl7dmFyIGU9b28odCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP25vKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24ocil7cmV0dXJuIHI9PT10fHxlbyhyLHQsZSl9fTt2YXIgaW89ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9O3ZhciB1bz1mdW5jdGlvbihlLHIsbyl7Zm9yKHZhciBuPS0xLHM9KHI9anQocixlKSkubGVuZ3RoLGk9ITE7KytuPHM7KXt2YXIgdT1fdChyW25dKTtpZighKGk9bnVsbCE9ZSYmbyhlLHUpKSlicmVhaztlPWVbdV19cmV0dXJuIGl8fCsrbiE9cz9pOiEhKHM9bnVsbD09ZT8wOmUubGVuZ3RoKSYmR3QocykmJnVyKHUscykmJih0KGUpfHxvcihlKSl9O3ZhciBhbz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZ1byh0LGUsaW8pfTt2YXIgaG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gTSh0KSYmcm8oZSk/bm8oX3QodCksZSk6ZnVuY3Rpb24ocil7dmFyIG89Q3Qocix0KTtyZXR1cm4gdm9pZCAwPT09byYmbz09PWU/YW8ocix0KTp0byhlLG8sMyl9fTt2YXIgbG89ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBBdChlLHQpfX07dmFyIGNvPWZ1bmN0aW9uKHQpe3JldHVybiBNKHQpP1h0KF90KHQpKTpsbyh0KX07dmFyIGZvPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bnVsbD09ZT9icjoib2JqZWN0Ij09dHlwZW9mIGU/dChlKT9obyhlWzBdLGVbMV0pOnNvKGUpOmNvKGUpfTt2YXIgbW89ZnVuY3Rpb24odCxlKXt2YXIgcj0tMSxvPUt0KHQpP0FycmF5KHQubGVuZ3RoKTpbXTtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxuLHMpe29bKytyXT1lKHQsbixzKX0pKSxvfTt2YXIgZ289ZnVuY3Rpb24oZSxyKXtyZXR1cm4odChlKT92dDptbykoZSxmbyhyKSl9O3ZhciBwbz1mdW5jdGlvbih0LGUpe3JldHVybiB2dChlLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX07dmFyIHdvPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOnBvKHQsd3IodCkpfTtmdW5jdGlvbiBibyh0KXtyZXR1cm4hKCFwZSh0KXx8IiI9PT10KX1mdW5jdGlvbiB5byh0KXtsZXQgZT0hMTtyZXR1cm4gYm8odCk/ZT0haXNOYU4oTnVtYmVyKHQpKTpmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCkmJihlPSEwKSxlfWZ1bmN0aW9uIHZvKHQsZSl7aWYoIWdlKHQpKXJldHVybnt9O2lmKCFkZShlKSlyZXR1cm57fTtsZXQgcj17fTtyZXR1cm4gdnIoZSwoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKHQsZSl7cmV0dXJuISFnZSh0KSYmISghYm8oZSkmJiF5byhlKSkmJmUgaW4gdH0pKHQsZSkmJihyW2VdPUN0KHQsZSkpfSkpLHJ9dmFyIE1vPS9ccy87dmFyIHhvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJk1vLnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9LEVvPS9eXHMrLzt2YXIgU289ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dC5zbGljZSgwLHhvKHQpKzEpLnJlcGxhY2UoRW8sIiIpOnR9LGpvPS9eWy0rXTB4WzAtOWEtZl0rJC9pLF9vPS9eMGJbMDFdKyQvaSxBbz0vXjBvWzAtN10rJC9pLENvPXBhcnNlSW50O3ZhciBSbz1mdW5jdGlvbih0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoYih0KSlyZXR1cm4gTmFOO2lmKHgodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PXgoZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PVNvKHQpO3ZhciByPV9vLnRlc3QodCk7cmV0dXJuIHJ8fEFvLnRlc3QodCk/Q28odC5zbGljZSgyKSxyPzI6OCk6am8udGVzdCh0KT9OYU46K3R9O3ZhciBJbz1mdW5jdGlvbih0KXtyZXR1cm4gdD9JbmZpbml0eT09PSh0PVJvKHQpKXx8LUluZmluaXR5PT09dD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9O3ZhciBrbz1mdW5jdGlvbih0KXt2YXIgZT1Jbyh0KSxyPWUlMTtyZXR1cm4gZT09ZT9yP2UtcjplOjB9LE5vPWkuaXNGaW5pdGUsT289TWF0aC5taW47dmFyIEZvPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGhbdF07cmV0dXJuIGZ1bmN0aW9uKHQscil7aWYodD1Sbyh0KSwocj1udWxsPT1yPzA6T28oa28ociksMjkyKSkmJk5vKHQpKXt2YXIgbz0oU3QodCkrImUiKS5zcGxpdCgiZSIpLG49ZShvWzBdKyJlIisoK29bMV0rcikpO3JldHVybisoKG89KFN0KG4pKyJlIikuc3BsaXQoImUiKSlbMF0rImUiKygrb1sxXS1yKSl9cmV0dXJuIGUodCl9fSgicm91bmQiKTtmdW5jdGlvbiB6byh0KXtpZigheW8odCkpcmV0dXJuIDA7dD1mdW5jdGlvbih0KXtyZXR1cm4geW8odCk/SW8odCk6MH0odCk7bGV0IGU9Rm8odCk7cmV0dXJuIjAiPT09U3RyaW5nKGUpPzA6ZX12YXIgVG89QXJyYXkucHJvdG90eXBlLmpvaW47dmFyIFZvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/IiI6VG8uY2FsbCh0LGUpfTtjbGFzcyBQb3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmdldENvc3Q9KCk9PnRoaXMuRWxlbWVudHMubWFwKCh0PT50LkRpc3RhbmNlRnJvbU1lZG9pZCkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCksdGhpcy5maW5kQmVzdE1lZG9pZElkeD10PT50aGlzLkVsZW1lbnRzLm1hcCgoZT0+dGhpcy5jYWxjQ29zdEZvckdpdmVuRWxlbWVudEFzTWVkb2lkKGUsdCkpKS5yZWR1Y2UoKCh0LGUscixvKT0+ZS5Db3N0SWZNYWRlTWVkb2lkPG9bdF0uQ29zdElmTWFkZU1lZG9pZD9yOnQpLDApLHRoaXMuY2FsY0Nvc3RGb3JHaXZlbkVsZW1lbnRBc01lZG9pZD0odCxlKT0+KHtDb3N0SWZNYWRlTWVkb2lkOm5ldyBQbyh7RWxlbWVudHM6dGhpcy5FbGVtZW50cy5tYXAoKHI9Pih7RGlzdGFuY2VGcm9tTWVkb2lkOmUoci5FbGVtZW50LHQuRWxlbWVudCksRWxlbWVudDpyLkVsZW1lbnR9KSkpLE1lZG9pZDp0LkVsZW1lbnR9KS5nZXRDb3N0KCksRWxlbWVudDp0fSksdGhpcy5FbGVtZW50cz10LkVsZW1lbnRzLHRoaXMuTWVkb2lkPXQuTWVkb2lkfX12YXIgcW89UG8sJG89T2JqZWN0LmRlZmluZVByb3BlcnR5KHtDbHVzdGVyOnFvfSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksRG89T2JqZWN0LmRlZmluZVByb3BlcnR5KHtkaXN0YW5jZToodCxlKT0+e2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgaW5wdXRzIG11c3QgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24iKTtjb25zdCByPUFycmF5LmZyb20odC5rZXlzKCkpLm1hcCgocj0+TWF0aC5wb3coTWF0aC5hYnModFtyXS1lW3JdKSwyKSkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCk7cmV0dXJuIE1hdGguc3FydChyKX19LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxVbz1PYmplY3QuZGVmaW5lUHJvcGVydHkoe2tHdEVsZW1lbnRBcnJMZW5ndGg6ImsgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkifSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y2xhc3MgTG97Y29uc3RydWN0b3IodCxlLHIpe3RoaXMuRWxlbWVudHM9dCx0aGlzLks9ZSx0aGlzLkRpc3RhbmNlRm49cix0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZD0hMSx0aGlzLml0ZXJhdGU9KCk9Pnt0aGlzLkl0ZXJhdGlvbkNvdW50KyssdGhpcy5DbHVzdGVyc3x8dGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHQ9dGhpcy5NZWRvaWRzLGU9dGhpcy5DbHVzdGVycyxyPXRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTtsZXQgbz1yO2ZvcihsZXQgdD0wO3Q8dGhpcy5NZWRvaWRzLmxlbmd0aDt0Kyspe2NvbnN0IGU9dD0+MD09PXRoaXMuTWVkb2lkcy5maWx0ZXIoKGU9PjA9PT10aGlzLkRpc3RhbmNlRm4odCxlKSkpLmxlbmd0aDtmb3IoY29uc3QgciBvZiB0aGlzLkVsZW1lbnRzLmZpbHRlcihlKSl7Y29uc3QgZT10aGlzLk1lZG9pZHMuc2xpY2UoKTtlW3RdPXI7Y29uc3Qgbj1uZXcgTG8odGhpcy5FbGVtZW50cy5zbGljZSgpLHRoaXMuSyx0aGlzLkRpc3RhbmNlRm4pO24uTWVkb2lkcz1lLG4uYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHMoKTtjb25zdCBzPW4uY2FsY3VsYXRlQ3VycmVudENvc3QoKTtzPG8mJihvPXMsdGhpcy5DbHVzdGVycz1uLkNsdXN0ZXJzLHRoaXMuTWVkb2lkcz1lKX19cmV0dXJuIHRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTxyfHwodGhpcy5DbHVzdGVycz1lLHRoaXMuTWVkb2lkcz10LHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSEwLCExKX0sdGhpcy5nZXRDbHVzdGVyZWREYXRhPSgpPT4odGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWR8fHRoaXMucnVuVG9Db21wbGV0aW9uKCksdGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuRWxlbWVudHMubWFwKCh0PT50LkVsZW1lbnQpKSkpKSx0aGlzLnJ1blRvQ29tcGxldGlvbj0oKT0+e2Zvcig7dGhpcy5pdGVyYXRlKCk7KTt9LHRoaXMuYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHM9KCk9Pnt0aGlzLkNsdXN0ZXJzPW5ldyBBcnJheSx0aGlzLk1lZG9pZHMuZm9yRWFjaCgodD0+e3RoaXMuQ2x1c3RlcnMucHVzaChuZXcgJG8uQ2x1c3Rlcih7RWxlbWVudHM6W10sTWVkb2lkOnR9KSl9KSksdGhpcy5FbGVtZW50cy5mb3JFYWNoKCgodCxlKT0+e2NvbnN0IHI9dGhpcy5maW5kRGlzdGFuY2VzKHRoaXMuQ2x1c3RlcnMubWFwKCh0PT50Lk1lZG9pZCkpLHQpLG89ci5yZWR1Y2UoKCh0LGUscixvKT0+ZTxvW3RdP3I6dCksMCk7dGhpcy5DbHVzdGVyc1tvXS5FbGVtZW50cy5wdXNoKHtEaXN0YW5jZUZyb21NZWRvaWQ6cltvXSxFbGVtZW50OnR9KX0pKX0sdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdD0oKT0+dGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuZ2V0Q29zdCgpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmREaXN0YW5jZXM9KHQsZSk9PnQubWFwKCh0PT50aGlzLkRpc3RhbmNlRm4odCxlKSkpLHRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHM9KCk9PntpZih0aGlzLks+PXRoaXMuRWxlbWVudHMubGVuZ3RoKXRocm93IFVvLmtHdEVsZW1lbnRBcnJMZW5ndGg7Y29uc3QgdD1bXSxlPSh0LGUpPT57Zm9yKGNvbnN0IHIgb2YgZSlpZigwPT09dGhpcy5EaXN0YW5jZUZuKHIsdCkpcmV0dXJuITE7cmV0dXJuITB9O2xldCByPTA7Zm9yKDtyPHRoaXMuRWxlbWVudHMubGVuZ3RoJiZ0Lmxlbmd0aDx0aGlzLks7KWUodGhpcy5FbGVtZW50c1tyXSx0KSYmdC5wdXNoKHRoaXMuRWxlbWVudHNbcl0pLHIrKztyZXR1cm4gdH0sdGhpcy5EaXN0YW5jZUZuPXRoaXMuRGlzdGFuY2VGbnx8RG8uZGlzdGFuY2UsdGhpcy5NZWRvaWRzPXRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHMoKSx0aGlzLkl0ZXJhdGlvbkNvdW50PTB9Z2V0IE9wdGltaXNhdGlvblN0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5JdGVyYXRpb25Db3VudD4wfX1Mby5jbHVzdGVyRWxlbWVudHM9KHQsZSxyKT0+e0xvLmdldEluc3RhbmNlKHQsZSxyKTtyZXR1cm4gbmV3IEFycmF5fSxMby5nZXRJbnN0YW5jZT0odCxlLHIpPT5uZXcgTG8odCxlLHIpO3ZhciBCbz1MbyxHbz1PYmplY3QuZGVmaW5lUHJvcGVydHkoe0NsdXN0ZXJlcjpCb30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLEtvPXIobygoZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQpe2Zvcih2YXIgciBpbiB0KWUuaGFzT3duUHJvcGVydHkocil8fChlW3JdPXRbcl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxyKCRvKSxyKEdvKX0pKSk7ZnVuY3Rpb24gV28odCxlKXtsZXQgcj0wO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXIrPSh0W29dLWVbb10pKih0W29dLWVbb10pO3JldHVybiByfWNvbnN0IFhvPXtkaXN0YW5jZUZ1bmN0aW9uOldvfTtmdW5jdGlvbiBKbyh0LGUscj1Ybyl7Y29uc3Qgbz1yLmRpc3RhbmNlRnVuY3Rpb258fFhvLmRpc3RhbmNlRnVuY3Rpb24sbj1yLnNpbWlsYXJpdHlGdW5jdGlvbnx8WG8uc2ltaWxhcml0eUZ1bmN0aW9uO2xldCBzPS0xO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXtsZXQgcj1OdW1iZXIuTUlOX1ZBTFVFO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBpPW4oZSx0W29dKTtpPnImJihyPWkscz1vKX19ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbyl0aHJvdyBuZXcgRXJyb3IoIkEgc2ltaWxhcml0eSBvciBkaXN0YW5jZSBmdW5jdGlvbiBpdCdzIHJlcXVpcmVkIik7e2xldCByPU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9byhlLHRbbl0pO2k8ciYmKHI9aSxzPW4pfX19cmV0dXJuIHN9ZnVuY3Rpb24gWW8odCxlLHIsbyl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspcltuXT1KbyhlLHRbbl0se2Rpc3RhbmNlRnVuY3Rpb246b30pO3JldHVybiByfWZ1bmN0aW9uIFpvKHQsZSl7Y29uc3Qgcj02NTUzNSYodD4+Pj0wKTtyZXR1cm4oKHQtcikqKGU+Pj49MCk+Pj4wKStyKmU+Pj4wfWNsYXNzIEhve2NvbnN0cnVjdG9yKHQ9RGF0ZS5ub3coKSl7dGhpcy5zdGF0ZT1uZXcgVWludDMyQXJyYXkoNCksdGhpcy5pbml0KHQpLHRoaXMucmFuZG9tPXRoaXMuZ2V0RmxvYXQuYmluZCh0aGlzKX1nZXRVaW50MzIoKXtyZXR1cm4gdGhpcy5uZXh0U3RhdGUoKSx0aGlzLnN0YXRlWzNdK3RoaXMuc3RhdGVbMl0+Pj4wfWdldEZsb2F0KCl7cmV0dXJuIDUuOTYwNDY0NDc3NTM5MDYzZS04Kih0aGlzLmdldFVpbnQzMigpPj4+OCl9aW5pdCh0KXtpZighTnVtYmVyLmlzSW50ZWdlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzZWVkIG11c3QgYmUgYW4gaW50ZWdlciIpO3RoaXMuc3RhdGVbMF09dCx0aGlzLnN0YXRlWzFdPTAsdGhpcy5zdGF0ZVsyXT0wLHRoaXMuc3RhdGVbM109MDtmb3IobGV0IHQ9MTt0PDg7dCsrKXRoaXMuc3RhdGVbMyZ0XV49dCtabygxODEyNDMzMjUzLHRoaXMuc3RhdGVbdC0xJjNdXnRoaXMuc3RhdGVbdC0xJjNdPj4+MzA+Pj4wKT4+PjA7dGhpcy5wZXJpb2RDZXJ0aWZpY2F0aW9uKCk7Zm9yKGxldCB0PTA7dDw4O3QrKyl0aGlzLm5leHRTdGF0ZSgpfXBlcmlvZENlcnRpZmljYXRpb24oKXswPT09dGhpcy5zdGF0ZVswXSYmMD09PXRoaXMuc3RhdGVbMV0mJjA9PT10aGlzLnN0YXRlWzJdJiYwPT09dGhpcy5zdGF0ZVszXSYmKHRoaXMuc3RhdGVbMF09ODgsdGhpcy5zdGF0ZVsxXT04Myx0aGlzLnN0YXRlWzJdPTY1LHRoaXMuc3RhdGVbM109NjgpfW5leHRTdGF0ZSgpe2xldCB0PXRoaXMuc3RhdGVbMF07dF49dDw8MTUsdF49dD4+PjE4LHRePXRoaXMuc3RhdGVbM108PDExLHRoaXMuc3RhdGVbMF09dGhpcy5zdGF0ZVsxXSx0aGlzLnN0YXRlWzFdPXRoaXMuc3RhdGVbMl0sdGhpcy5zdGF0ZVsyXT10aGlzLnN0YXRlWzNdLHRoaXMuc3RhdGVbM109dH19ZnVuY3Rpb24gUW8odCxlPXt9LHI9TWF0aC5yYW5kb20pe2NvbnN0e3NpemU6bz0xLHJlcGxhY2U6bj0hMSxwcm9iYWJpbGl0aWVzOnN9PWU7bGV0IGksdTtpZihpPSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfSh0KTp0LnNsaWNlKCkscyl7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJjaG9pY2Ugd2l0aCBwcm9iYWJpbGl0aWVzIGFuZCBubyByZXBsYWNlbWVudCBpcyBub3QgaW1wbGVtZW50ZWQiKTtpZihzLmxlbmd0aCE9PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBwcm9iYWJpbGl0aWVzIG9wdGlvbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaG9pY2VzIik7dT1bc1swXV07Zm9yKGxldCB0PTE7dDxzLmxlbmd0aDt0KyspdVt0XT11W3QtMV0rc1t0XTtpZihNYXRoLmFicygxLXVbdS5sZW5ndGgtMV0pPjFlLTgpdGhyb3cgbmV3IEVycm9yKGBwcm9iYWJpbGl0aWVzIHNob3VsZCBzdW0gdG8gMSwgYnV0IGluc3RlYWQgc3VtcyB0byAke3VbdS5sZW5ndGgtMV19YCl9aWYoITE9PT1uJiZvPmkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic2l6ZSBvcHRpb24gaXMgdG9vIGxhcmdlIik7Y29uc3QgYT1bXTtmb3IobGV0IHQ9MDt0PG87dCsrKXtjb25zdCB0PXRuKGkubGVuZ3RoLHIsdSk7YS5wdXNoKGlbdF0pLG58fGkuc3BsaWNlKHQsMSl9cmV0dXJuIGF9ZnVuY3Rpb24gdG4odCxlLHIpe2NvbnN0IG89ZSgpO2lmKHIpe2xldCB0PTA7Zm9yKDtvPnJbdF07KXQrKztyZXR1cm4gdH1yZXR1cm4gTWF0aC5mbG9vcihvKnQpfWNsYXNzIGVue2NvbnN0cnVjdG9yKHQ9TWF0aC5yYW5kb20pe2lmKCJudW1iZXIiPT10eXBlb2YgdCl7Y29uc3QgZT1uZXcgSG8odCk7dGhpcy5yYW5kb21HZW5lcmF0b3I9ZS5yYW5kb219ZWxzZSB0aGlzLnJhbmRvbUdlbmVyYXRvcj10fWNob2ljZSh0LGUpe3JldHVybiBRbyh0LGUsdGhpcy5yYW5kb21HZW5lcmF0b3IpfXJhbmRvbSgpe3JldHVybiB0aGlzLnJhbmRvbUdlbmVyYXRvcigpfXJhbmRJbnQodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PTApLHQrTWF0aC5mbG9vcih0aGlzLnJhbmRvbUdlbmVyYXRvcigpKihlLXQpKX1yYW5kb21TYW1wbGUodCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLnJhbmRvbSgpKTtyZXR1cm4gZX19ZnVuY3Rpb24gcm4odCxlKXtjb25zdCByPW5ldyBxZSh0LnJvd3MsZS5yb3dzKTtmb3IobGV0IG89MDtvPHQucm93cztvKyspZm9yKGxldCBuPTA7bjxlLnJvd3M7bisrKXIuc2V0KG8sbixXbyh0LmdldFJvdyhvKSxlLmdldFJvdyhuKSkpO3JldHVybiByfWZ1bmN0aW9uIG9uKHQpe2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfWZ1bmN0aW9uIG5uKHQpe2xldCBlPVt0WzBdXTtmb3IobGV0IHI9MTtyPHQubGVuZ3RoO3IrKyllW3JdPWVbci0xXSt0W3JdO3JldHVybiBlfWNvbnN0IHNuPVN5bWJvbCgiZGlzdGFuY2UiKTtjbGFzcyB1bntjb25zdHJ1Y3Rvcih0LGUscixvLG4pe3RoaXMuY2x1c3RlcnM9dCx0aGlzLmNlbnRyb2lkcz1lLHRoaXMuY29udmVyZ2VkPXIsdGhpcy5pdGVyYXRpb25zPW8sdGhpc1tzbl09bn1uZWFyZXN0KHQpe2NvbnN0IGU9bmV3IEFycmF5KHQubGVuZ3RoKTtyZXR1cm4gWW8odCx0aGlzLmNlbnRyb2lkcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNlbnRyb2lkfSkpLGUsdGhpc1tzbl0pfWNvbXB1dGVJbmZvcm1hdGlvbih0KXtmb3IodmFyIGU9dGhpcy5jZW50cm9pZHMubWFwKChmdW5jdGlvbih0KXtyZXR1cm57Y2VudHJvaWQ6dCxlcnJvcjowLHNpemU6MH19KSkscj0wO3I8dC5sZW5ndGg7cisrKWVbdGhpcy5jbHVzdGVyc1tyXV0uZXJyb3IrPXRoaXNbc25dKHRbcl0sdGhpcy5jZW50cm9pZHNbdGhpcy5jbHVzdGVyc1tyXV0pLGVbdGhpcy5jbHVzdGVyc1tyXV0uc2l6ZSsrO2Zvcih2YXIgbz0wO288dGhpcy5jZW50cm9pZHMubGVuZ3RoO28rKyllW29dLnNpemU/ZVtvXS5lcnJvci89ZVtvXS5zaXplOmVbb10uZXJyb3I9bnVsbDtyZXR1cm4gbmV3IHVuKHRoaXMuY2x1c3RlcnMsZSx0aGlzLmNvbnZlcmdlZCx0aGlzLml0ZXJhdGlvbnMsdGhpc1tzbl0pfX1jb25zdCBhbj17bWF4SXRlcmF0aW9uczoxMDAsdG9sZXJhbmNlOjFlLTYsd2l0aEl0ZXJhdGlvbnM6ITEsaW5pdGlhbGl6YXRpb246ImttZWFucysrIixkaXN0YW5jZUZ1bmN0aW9uOldvfTtmdW5jdGlvbiBobih0LGUscixvLG4scyl7dmFyIGk9ZnVuY3Rpb24odCxlLHIsbyl7Y29uc3Qgbj1lWzBdLmxlbmd0aDtmb3IodmFyIHM9bmV3IEFycmF5KG8pLGk9bmV3IEFycmF5KG8pLHU9MDt1PG87dSsrKXtzW3VdPW5ldyBBcnJheShuKSxpW3VdPTA7Zm9yKHZhciBhPTA7YTxuO2ErKylzW3VdW2FdPTB9Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspe2lbcltoXV0rKztmb3IodmFyIGw9MDtsPG47bCsrKXNbcltoXV1bbF0rPWVbaF1bbF19Zm9yKHZhciBjPTA7YzxvO2MrKylmb3IodmFyIGY9MDtmPG47ZisrKWlbY10/c1tjXVtmXS89aVtjXTpzW2NdW2ZdPXRbY11bZl07cmV0dXJuIHN9KHQsZSxyPVlvKGUsdCxyLG4uZGlzdGFuY2VGdW5jdGlvbiksbyksdT1mdW5jdGlvbih0LGUscixvKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZihyKHRbbl0sZVtuXSk+bylyZXR1cm4hMTtyZXR1cm4hMH0oaSx0LG4uZGlzdGFuY2VGdW5jdGlvbixuLnRvbGVyYW5jZSk7cmV0dXJuIG5ldyB1bihyLGksdSxzLG4uZGlzdGFuY2VGdW5jdGlvbil9ZnVuY3Rpb24gbG4odCxlLHIpe2lmKHI9T2JqZWN0LmFzc2lnbih7fSxhbixyKSxlPD0wfHxlPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgRXJyb3IoIksgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBwb2ludHMiKTt2YXIgbztpZihBcnJheS5pc0FycmF5KHIuaW5pdGlhbGl6YXRpb24pKXtpZihyLmluaXRpYWxpemF0aW9uLmxlbmd0aCE9PWUpdGhyb3cgbmV3IEVycm9yKCJUaGUgaW5pdGlhbCBjZW50ZXJzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyBLIik7bz1yLmluaXRpYWxpemF0aW9ufWVsc2Ugc3dpdGNoKHIuaW5pdGlhbGl6YXRpb24pe2Nhc2Uia21lYW5zKysiOm89ZnVuY3Rpb24odCxlLHI9e30pe2NvbnN0IG89KHQ9bmV3IHFlKHQpKS5yb3dzLG49bmV3IGVuKHIuc2VlZCkscz1bXSxpPXIubG9jYWxUcmlhbHN8fDIrTWF0aC5mbG9vcihNYXRoLmxvZyhlKSksdT1uLnJhbmRJbnQobyk7cy5wdXNoKHQuZ2V0Um93KHUpKTtsZXQgYT1uZXcgcWUoMSx0LnJvd3MpO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKylhLnNldCgwLGUsV28odC5nZXRSb3coZSksc1swXSkpO2xldCBoPVtubihhLmdldFJvdygwKSldO2NvbnN0IGw9MS9oWzBdW28tMV07bGV0IGM9cWUubXVsKGEsbCk7Zm9yKGxldCByPTE7cjxlO3IrKyl7Y29uc3QgZT1uLmNob2ljZShvLHtyZXBsYWNlOiEwLHNpemU6aSxwcm9iYWJpbGl0aWVzOmNbMF19KSx1PXJuKHQuc2VsZWN0aW9uKGUsb24odC5jb2x1bW5zKSksdCk7bGV0IGwsZixtO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IHI9cWUubWluKGEsW3UuZ2V0Um93KHQpXSksbz1yLnN1bSgpOyh2b2lkIDA9PT1sfHxvPGYpJiYobD1lW3RdLGY9byxtPXIpfXNbcl09dC5nZXRSb3cobCksYT1tLGg9W25uKGEuZ2V0Um93KDApKV0sYz1xZS5tdWwoYSwxL2hbMF1bby0xXSl9cmV0dXJuIHN9KHQsZSxyKTticmVhaztjYXNlInJhbmRvbSI6bz1mdW5jdGlvbih0LGUscil7cmV0dXJuIG5ldyBlbihyKS5jaG9pY2UodCx7c2l6ZTplfSl9KHQsZSxyLnNlZWQpO2JyZWFrO2Nhc2UibW9zdERpc3RhbnQiOm89ZnVuY3Rpb24odCxlLHIsbyl7Y29uc3Qgbj1uZXcgZW4obyk7dmFyIHM9bmV3IEFycmF5KGUpO2lmKHNbMF09TWF0aC5mbG9vcihuLnJhbmRvbSgpKnQubGVuZ3RoKSxlPjEpe2Zvcih2YXIgaT17ZGlzdDotMSxpbmRleDotMX0sdT0wO3U8dC5sZW5ndGg7Kyt1KXJbc1swXV1bdV0+aS5kaXN0JiYoaS5kaXN0PXJbc1swXV1bdV0saS5pbmRleD11KTtpZihzWzFdPWkuaW5kZXgsZT4yKWZvcih2YXIgYT0yO2E8ZTsrK2Epe2Zvcih2YXIgaD17ZGlzdDotMSxpbmRleDotMX0sbD0wO2w8dC5sZW5ndGg7KytsKXtmb3IodmFyIGM9e2Rpc3Q6TnVtYmVyLk1BWF9WQUxVRSxpbmRleDotMX0sZj0wO2Y8YTsrK2YpcltmXVtsXTxjLmRpc3QmJi0xPT09cy5pbmRleE9mKGwpJiYoYz17ZGlzdDpyW2ZdW2xdLGluZGV4Omx9KTtjLmRpc3QhPT1OdW1iZXIuTUFYX1ZBTFVFJiZjLmRpc3Q+aC5kaXN0JiYoaD1PYmplY3QuYXNzaWduKHt9LGMpKX1zW2FdPWguaW5kZXh9fXJldHVybiBzLm1hcCgoZT0+dFtlXSkpfSh0LGUsZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxvPTA7bzx0Lmxlbmd0aDsrK28pZm9yKHZhciBuPW87bjx0Lmxlbmd0aDsrK24pe3Jbb118fChyW29dPW5ldyBBcnJheSh0Lmxlbmd0aCkpLHJbbl18fChyW25dPW5ldyBBcnJheSh0Lmxlbmd0aCkpO2NvbnN0IHM9ZSh0W29dLHRbbl0pO3Jbb11bbl09cyxyW25dW29dPXN9cmV0dXJuIHJ9KHQsci5kaXN0YW5jZUZ1bmN0aW9uKSxyLnNlZWQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGluaXRpYWxpemF0aW9uIG1ldGhvZDogIiR7ci5pbml0aWFsaXphdGlvbn0iYCl9MD09PXIubWF4SXRlcmF0aW9ucyYmKHIubWF4SXRlcmF0aW9ucz1OdW1iZXIuTUFYX1ZBTFVFKTt2YXIgbj1uZXcgQXJyYXkodC5sZW5ndGgpO2lmKHIud2l0aEl0ZXJhdGlvbnMpcmV0dXJuIGZ1bmN0aW9uKih0LGUscixvLG4pe2Zvcih2YXIgcyxpPSExLHU9MDshaSYmdTxuLm1heEl0ZXJhdGlvbnM7KXM9aG4odCxlLHIsbyxuLCsrdSkseWllbGQgcy5jb21wdXRlSW5mb3JtYXRpb24oZSksaT1zLmNvbnZlcmdlZCx0PXMuY2VudHJvaWRzfShvLHQsbixlLHIpO2Zvcih2YXIgcyxpPSExLHU9MDshaSYmdTxyLm1heEl0ZXJhdGlvbnM7KWk9KHM9aG4obyx0LG4sZSxyLCsrdSkpLmNvbnZlcmdlZCxvPXMuY2VudHJvaWRzO3JldHVybiBzLmNvbXB1dGVJbmZvcm1hdGlvbih0KX1mdW5jdGlvbiBjbih0LGU9e30pe2xldCByPUN0KGUsImtOdW1iZXIiKTtyPXlvKHIpP3pvKHIpOjI7bGV0IG8sbj1DdChlLCJtb2RlIik7aWYoImstbWVkb2lkcyIhPT1uJiYiay1tZWFucyIhPT1uJiYobj0iay1tZWRvaWRzIiksImstbWVkb2lkcyI9PT1uKW89ZnVuY3Rpb24odCxlKXtsZXQgcj17fTtmdW5jdGlvbiBvKHQpe3JldHVybiBWbyh0LCI6Iil9dnIodCwoKHQsZSk9PntsZXQgbj1vKHQpO3Jbbl09ZX0pKTtsZXQgbj1Lby5DbHVzdGVyZXIuZ2V0SW5zdGFuY2UodCxlKS5nZXRDbHVzdGVyZWREYXRhKCk7cmV0dXJuIG49Z28obiwodD0+Z28odCwodD0+e2xldCBlPW8odCk7cmV0dXJuIHJbZV19KSkpKSxufSh0LHIpO2Vsc2V7aWYoImstbWVhbnMiIT09bil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgbW9kZSIpO289ZnVuY3Rpb24odCxlKXtsZXQgcj1sbih0LGUpLG89e307cmV0dXJuIHZyKHIuY2x1c3RlcnMsKCh0LGUpPT57b1t0XXx8KG9bdF09W10pLG9bdF0ucHVzaChlKX0pKSx3byhvKX0odCxyKX1yZXR1cm4gb31mdW5jdGlvbiBmbih0LGU9e30pe2lmKCFkZSh0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IGVmZi4gYXJyYXkiKTtsZXQgcj1DdChlLCJrTnVtYmVyIik7cj15byhyKT96byhyKToyO2xldCBvPUN0KGUsIm5Db21wTklQQUxTIik7bz15byhvKT96byhvKToyO2xldCBuPUN0KGUsIm1vZGUiKSxzPSIiLGk9bGUodCksdT0wLGE9MDtpZih2cih0LCh0PT57IWZ1bmN0aW9uKHQpe2lmKGdlKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMX0odCk/ZGUodCkmJihhKz0xKTp1Kz0xfSkpLHU9PT1pKXM9Im9iaiI7ZWxzZXtpZihhIT09aSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IG9mIHRoZSBzYW1lIHR5cGUiKTtzPSJtYXQifWxldCBoLGw9bnVsbDsib2JqIj09PXM/KGw9ZnVuY3Rpb24odCl7bGV0IGU9e307dnIodCwodD0+e3ZyKHQsKCh0LHIpPT57ZVtyXXx8KGVbcl09MCksMD09PWVbcl0mJnlvKHQpJiYoZVtyXT0xKSwxIT09ZVtyXXx8eW8odCl8fChlW3JdPS0xKX0pKX0pKTtsZXQgcj1bXTtyZXR1cm4gdnIoZSwoKHQsZSk9PnsxPT09dCYmci5wdXNoKGUpfSkpLHJ9KHQpLGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZ28odCwodD0+e2xldCByPXZvKHQsZSk7cmV0dXJuIHdvKHIpfSkpfSh0LGwpKTpoPXQ7bGV0IGM9SmUoaCx7bkNvbXBOSVBBTFM6b30pLGY9Y24oYyx7a051bWJlcjpyLG1vZGU6bn0pLG09Z28oZiwodD0+Z28odCwodD0+Y1t0XSkpKSk7cmV0dXJue2tleXM6bCxnaW5kczpmLGdsdGR0OmdvKGYsKGU9PmdvKGUsKGU9PnRbZV0pKSkpLGdtYXQ6bX19bGV0IFdDbHVzdGVyPXtQQ0E6YXN5bmMgZnVuY3Rpb24odCxlPXt9KXtyZXR1cm4gSmUodCxlKX0sY2x1c3Rlcjphc3luYyBmdW5jdGlvbih0LGU9e30pe3RyeXtyZXR1cm4gZm4odCxlKX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9fX07CgpsZXQgaW5zdGFuY2UgPSBudWxsCmZ1bmN0aW9uIGluaXQoaW5wdXQpewoKICAgIC8vaW5pdAogICAgbGV0IHIKICAgIAogICAgICAgIHIgPSBXQ2x1c3RlciguLi5pbnB1dCkKICAgICAgICAKCiAgICAvL29uCiAgICAKCiAgICAvL3NhdmUKICAgIGluc3RhbmNlID0gcgoKfQoKZnVuY3Rpb24gc2VuZE1lc3NhZ2UoZGF0YSkgewogICAgCiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShkYXRhKQogICAgICAgIAp9Cgphc3luYyBmdW5jdGlvbiBydW4oZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciBydW4nLGRhdGEpCgogICAgLy9tb2RlCiAgICBsZXQgbW9kZSA9IGRhdGEubW9kZQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgIT09ICdpbml0JyAmJiBtb2RlICE9PSAnY2FsbCcpewogICAgICAgIHJldHVybgogICAgfQoKICAgIC8vaW5pdAogICAgaWYobW9kZSA9PT0gJ2luaXQnKXsKICAgICAgICAKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL3R5cGUKICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGUKCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAogICAgCiAgICAgICAgICAgIC8vaW5zdGFuY2UKICAgICAgICAgICAgaWYodHlwZSA9PT0gJ2Z1bmN0aW9uJyl7CiAgICAgICAgICAgICAgICBpbml0KC4uLmlucHV0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZSA9PT0gJ29iamVjdCcpewogICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBXQ2x1c3RlcgogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgIAogICAgICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgICAgICBtb2RlOiAnZW1pdCcsCiAgICAgICAgICAgICAgICBldk5hbWU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtc2c6IGVyciwKICAgICAgICAgICAgfQogICAgICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgICAgIH0KICAgICAgICAgICAgCiAgICB9CgogICAgLy9jaGVjawogICAgaWYobW9kZSA9PT0gJ2NhbGwnKXsKICAgICAgICBsZXQgc3RhdGUgPSAnJwogICAgICAgIGxldCBtc2cgPSBudWxsCgogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vZnVuCiAgICAgICAgICAgIGxldCBmdW4gPSBpbnN0YW5jZVtkYXRhLmZ1bl0KCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAoKICAgICAgICAgICAgLy9leGVjCiAgICAgICAgICAgIGF3YWl0IGZ1biguLi5pbnB1dCkKICAgICAgICAgICAgICAgIC50aGVuKChzdWMpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nc3VjY2VzcycKICAgICAgICAgICAgICAgICAgICBtc2c9c3VjCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nZXJyb3InCiAgICAgICAgICAgICAgICAgICAgbXNnPWVycgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgICAgIHN0YXRlID0gJ2Vycm9yJwogICAgICAgICAgICBtc2cgPSBlcnIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgIG1vZGU6ICdyZXR1cm4nLAogICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgZnVuOiBkYXRhLmZ1biwKICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgIG1zZywKICAgICAgICB9CiAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgIH0KCn0KCmZ1bmN0aW9uIHJlY3ZNZXNzYWdlKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcmVjdjonLCBkYXRhKQoKICAgIC8vZGF0YVJlY3YKICAgIGxldCBkYXRhUmVjdiA9IGRhdGEKCiAgICAvL3J1bgogICAgcnVuKGRhdGFSZWN2KQoKfQoKCiAgICAgICAgc2VsZi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICByZWN2TWVzc2FnZShlLmRhdGEpCiAgICAgICAgfQogICAgICAgIAoK",p.Base64.decode(Z));function G(){var l=d();function Z(d){try{var l=new Blob([d]),c=window.URL||window.webkitURL;return new Worker(c.createObjectURL(l))}catch(d){o(d)}}var X=Z(y);if(!X)return o("invalid worker"),null;function G(){X?(X.terminate(),X=void 0):o("worker has been terminated")}function m(){var d={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};X.postMessage(d)}function K(){var d=c(),Z=b(),y={mode:"call",id:Z,fun:"PCA",input:Array.prototype.slice.call(arguments)};return X.postMessage(y),l.once(Z,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function t(){var d=c(),Z=b(),y={mode:"call",id:Z,fun:"cluster",input:Array.prototype.slice.call(arguments)};return X.postMessage(y),l.once(Z,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function p(d){var c=d,b=c.mode;"emit"!==b&&"return"!==b||("emit"===b&&l.emit(c.evName,c.msg),"return"===b&&l.emit(c.id,c))}function o(d){l.emit("error",d)}return X.onmessage=function(d){p(d.data)},X.onerror=o,m(Array.prototype.slice.call(arguments)),l.PCA=K,l.cluster=t,l.terminate=G,l}var m,I,h={PCA:(I=X(t.mark((function d(){var c,b,Z,X=arguments;return t.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return c=Array.prototype.slice.call(X),b=G(),d.next=4,b.PCA.apply(b,l(c)).finally((function(){b.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return I.apply(this,arguments)}),cluster:(m=X(t.mark((function d(){var c,b,Z,X=arguments;return t.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return c=Array.prototype.slice.call(X),b=G(),d.next=4,b.cluster.apply(b,l(c)).finally((function(){b.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return m.apply(this,arguments)})};for(var W in K=d(),h){var i=h[W];K[W]=i}}(),K}()}));return"undefined"!=typeof window&&void 0!==window.document?G:y}));
|