w-json-stream 1.0.10 → 1.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- !function(l,Z){"object"==typeof exports&&"undefined"!=typeof module?module.exports=Z():"function"==typeof define&&define.amd?define(Z):(l="undefined"!=typeof globalThis?globalThis:l||self)["w-json-stream"]=Z()}(this,(function(){"use strict";function l(l,Z){(null==Z||Z>l.length)&&(Z=l.length);for(var d=0,m=new Array(Z);d<Z;d++)m[d]=l[d];return m}function Z(Z){return function(Z){if(Array.isArray(Z))return l(Z)}(Z)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(Z)||function(Z,d){if(Z){if("string"==typeof Z)return l(Z,d);var m=Object.prototype.toString.call(Z).slice(8,-1);return"Object"===m&&Z.constructor&&(m=Z.constructor.name),"Map"===m||"Set"===m?Array.from(Z):"Arguments"===m||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(m)?l(Z,d):void 0}}(Z)||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 d(l,Z,d,m,G,b,c){try{var X=l[b](c),W=X.value}catch(l){return void d(l)}X.done?Z(W):Promise.resolve(W).then(m,G)}function m(l){return function(){var Z=this,m=arguments;return new Promise((function(G,b){var c=l.apply(Z,m);function X(l){d(c,G,b,X,W,"next",l)}function W(l){d(c,G,b,X,W,"throw",l)}X(void 0)}))}}function G(l){return(G="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(l){return typeof l}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":typeof l})(l)}function b(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var c=b((function(l){var Z=function(l){var Z,d=Object.prototype,m=d.hasOwnProperty,b="function"==typeof Symbol?Symbol:{},c=b.iterator||"@@iterator",X=b.asyncIterator||"@@asyncIterator",W=b.toStringTag||"@@toStringTag";function i(l,Z,d){return Object.defineProperty(l,Z,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[Z]}try{i({},"")}catch(l){i=function(l,Z,d){return l[Z]=d}}function u(l,Z,d,m){var G=Z&&Z.prototype instanceof Y?Z:Y,b=Object.create(G.prototype),c=new t(m||[]);return b._invoke=function(l,Z,d){var m=V;return function(G,b){if(m===h)throw new Error("Generator is already running");if(m===I){if("throw"===G)throw b;return N()}for(d.method=G,d.arg=b;;){var c=d.delegate;if(c){var X=S(c,d);if(X){if(X===a)continue;return X}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if(m===V)throw m=I,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);m=h;var W=y(l,Z,d);if("normal"===W.type){if(m=d.done?I:p,W.arg===a)continue;return{value:W.arg,done:d.done}}"throw"===W.type&&(m=I,d.method="throw",d.arg=W.arg)}}}(l,d,c),b}function y(l,Z,d){try{return{type:"normal",arg:l.call(Z,d)}}catch(l){return{type:"throw",arg:l}}}l.wrap=u;var V="suspendedStart",p="suspendedYield",h="executing",I="completed",a={};function Y(){}function R(){}function K(){}var L={};L[c]=function(){return this};var o=Object.getPrototypeOf,n=o&&o(o(T([])));n&&n!==d&&m.call(n,c)&&(L=n);var J=K.prototype=Y.prototype=Object.create(L);function s(l){["next","throw","return"].forEach((function(Z){i(l,Z,(function(l){return this._invoke(Z,l)}))}))}function H(l,Z){function d(b,c,X,W){var i=y(l[b],l,c);if("throw"!==i.type){var u=i.arg,V=u.value;return V&&"object"===G(V)&&m.call(V,"__await")?Z.resolve(V.__await).then((function(l){d("next",l,X,W)}),(function(l){d("throw",l,X,W)})):Z.resolve(V).then((function(l){u.value=l,X(u)}),(function(l){return d("throw",l,X,W)}))}W(i.arg)}var b;this._invoke=function(l,m){function G(){return new Z((function(Z,G){d(l,m,Z,G)}))}return b=b?b.then(G,G):G()}}function S(l,d){var m=l.iterator[d.method];if(m===Z){if(d.delegate=null,"throw"===d.method){if(l.iterator.return&&(d.method="return",d.arg=Z,S(l,d),"throw"===d.method))return a;d.method="throw",d.arg=new TypeError("The iterator does not provide a 'throw' method")}return a}var G=y(m,l.iterator,d.arg);if("throw"===G.type)return d.method="throw",d.arg=G.arg,d.delegate=null,a;var b=G.arg;return b?b.done?(d[l.resultName]=b.value,d.next=l.nextLoc,"return"!==d.method&&(d.method="next",d.arg=Z),d.delegate=null,a):b:(d.method="throw",d.arg=new TypeError("iterator result is not an object"),d.delegate=null,a)}function x(l){var Z={tryLoc:l[0]};1 in l&&(Z.catchLoc=l[1]),2 in l&&(Z.finallyLoc=l[2],Z.afterLoc=l[3]),this.tryEntries.push(Z)}function C(l){var Z=l.completion||{};Z.type="normal",delete Z.arg,l.completion=Z}function t(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(x,this),this.reset(!0)}function T(l){if(l){var d=l[c];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var G=-1,b=function d(){for(;++G<l.length;)if(m.call(l,G))return d.value=l[G],d.done=!1,d;return d.value=Z,d.done=!0,d};return b.next=b}}return{next:N}}function N(){return{value:Z,done:!0}}return R.prototype=J.constructor=K,K.constructor=R,R.displayName=i(K,W,"GeneratorFunction"),l.isGeneratorFunction=function(l){var Z="function"==typeof l&&l.constructor;return!!Z&&(Z===R||"GeneratorFunction"===(Z.displayName||Z.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,K):(l.__proto__=K,i(l,W,"GeneratorFunction")),l.prototype=Object.create(J),l},l.awrap=function(l){return{__await:l}},s(H.prototype),H.prototype[X]=function(){return this},l.AsyncIterator=H,l.async=function(Z,d,m,G,b){void 0===b&&(b=Promise);var c=new H(u(Z,d,m,G),b);return l.isGeneratorFunction(d)?c:c.next().then((function(l){return l.done?l.value:c.next()}))},s(J),i(J,W,"Generator"),J[c]=function(){return this},J.toString=function(){return"[object Generator]"},l.keys=function(l){var Z=[];for(var d in l)Z.push(d);return Z.reverse(),function d(){for(;Z.length;){var m=Z.pop();if(m in l)return d.value=m,d.done=!1,d}return d.done=!0,d}},l.values=T,t.prototype={constructor:t,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=Z,this.done=!1,this.delegate=null,this.method="next",this.arg=Z,this.tryEntries.forEach(C),!l)for(var d in this)"t"===d.charAt(0)&&m.call(this,d)&&!isNaN(+d.slice(1))&&(this[d]=Z)},stop:function(){this.done=!0;var l=this.tryEntries[0].completion;if("throw"===l.type)throw l.arg;return this.rval},dispatchException:function(l){if(this.done)throw l;var d=this;function G(m,G){return X.type="throw",X.arg=l,d.next=m,G&&(d.method="next",d.arg=Z),!!G}for(var b=this.tryEntries.length-1;b>=0;--b){var c=this.tryEntries[b],X=c.completion;if("root"===c.tryLoc)return G("end");if(c.tryLoc<=this.prev){var W=m.call(c,"catchLoc"),i=m.call(c,"finallyLoc");if(W&&i){if(this.prev<c.catchLoc)return G(c.catchLoc,!0);if(this.prev<c.finallyLoc)return G(c.finallyLoc)}else if(W){if(this.prev<c.catchLoc)return G(c.catchLoc,!0)}else{if(!i)throw new Error("try statement without catch or finally");if(this.prev<c.finallyLoc)return G(c.finallyLoc)}}}},abrupt:function(l,Z){for(var d=this.tryEntries.length-1;d>=0;--d){var G=this.tryEntries[d];if(G.tryLoc<=this.prev&&m.call(G,"finallyLoc")&&this.prev<G.finallyLoc){var b=G;break}}b&&("break"===l||"continue"===l)&&b.tryLoc<=Z&&Z<=b.finallyLoc&&(b=null);var c=b?b.completion:{};return c.type=l,c.arg=Z,b?(this.method="next",this.next=b.finallyLoc,a):this.complete(c)},complete:function(l,Z){if("throw"===l.type)throw l.arg;return"break"===l.type||"continue"===l.type?this.next=l.arg:"return"===l.type?(this.rval=this.arg=l.arg,this.method="return",this.next="end"):"normal"===l.type&&Z&&(this.next=Z),a},finish:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.finallyLoc===l)return this.complete(d.completion,d.afterLoc),C(d),a}},catch:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.tryLoc===l){var m=d.completion;if("throw"===m.type){var G=m.arg;C(d)}return G}}throw new Error("illegal catch attempt")},delegateYield:function(l,d,m){return this.delegate={iterator:T(l),resultName:d,nextLoc:m},"next"===this.method&&(this.arg=Z),a}},l}(l.exports);try{regeneratorRuntime=Z}catch(l){Function("r","regeneratorRuntime = r")(Z)}})),X=b((function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function G(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function b(l,Z,m,b,c){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new G(m,b||l,c),W=d?d+Z:Z;return l._events[W]?l._events[W].fn?l._events[W]=[l._events[W],X]:l._events[W].push(X):(l._events[W]=X,l._eventsCount++),l}function c(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,G=[];if(0===this._eventsCount)return G;for(m in l=this._events)Z.call(l,m)&&G.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?G.concat(Object.getOwnPropertySymbols(l)):G},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var G=0,b=m.length,c=new Array(b);G<b;G++)c[G]=m[G].fn;return c},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,G,b,c){var X=d?d+l:l;if(!this._events[X])return!1;var W,i,u=this._events[X],y=arguments.length;if(u.fn){switch(u.once&&this.removeListener(l,u.fn,void 0,!0),y){case 1:return u.fn.call(u.context),!0;case 2:return u.fn.call(u.context,Z),!0;case 3:return u.fn.call(u.context,Z,m),!0;case 4:return u.fn.call(u.context,Z,m,G),!0;case 5:return u.fn.call(u.context,Z,m,G,b),!0;case 6:return u.fn.call(u.context,Z,m,G,b,c),!0}for(i=1,W=new Array(y-1);i<y;i++)W[i-1]=arguments[i];u.fn.apply(u.context,W)}else{var V,p=u.length;for(i=0;i<p;i++)switch(u[i].once&&this.removeListener(l,u[i].fn,void 0,!0),y){case 1:u[i].fn.call(u[i].context);break;case 2:u[i].fn.call(u[i].context,Z);break;case 3:u[i].fn.call(u[i].context,Z,m);break;case 4:u[i].fn.call(u[i].context,Z,m,G);break;default:if(!W)for(V=1,W=new Array(y-1);V<y;V++)W[V-1]=arguments[V];u[i].fn.apply(u[i].context,W)}}return!0},X.prototype.on=function(l,Z,d){return b(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return b(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,G){var b=d?d+l:l;if(!this._events[b])return this;if(!Z)return c(this,b),this;var X=this._events[b];if(X.fn)X.fn!==Z||G&&!X.once||m&&X.context!==m||c(this,b);else{for(var W=0,i=[],u=X.length;W<u;W++)(X[W].fn!==Z||G&&!X[W].once||m&&X[W].context!==m)&&i.push(X[W]);i.length?this._events[b]=1===i.length?i[0]:i:c(this,b)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&c(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}));function W(){return new X}function i(){var l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function u(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length,G=0;G<l;G++)Z[G]=d[0|Math.random()*m];var b=Z.join("");return b}var y=atob("Cgp2YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9O2Z1bmN0aW9uIGUoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiByKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX12YXIgbj1lLGk9cjtmdW5jdGlvbiBvKHQpe2lmKG49PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KHQsMCk7aWYoKG49PT1lfHwhbikmJnNldFRpbWVvdXQpcmV0dXJuIG49c2V0VGltZW91dCxzZXRUaW1lb3V0KHQsMCk7dHJ5e3JldHVybiBuKHQsMCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBuLmNhbGwobnVsbCx0LDApfWNhdGNoKGUpe3JldHVybiBuLmNhbGwodGhpcyx0LDApfX19ImZ1bmN0aW9uIj09dHlwZW9mIHQuc2V0VGltZW91dCYmKG49c2V0VGltZW91dCksImZ1bmN0aW9uIj09dHlwZW9mIHQuY2xlYXJUaW1lb3V0JiYoaT1jbGVhclRpbWVvdXQpO3ZhciBhLHM9W10sdT0hMSxmPS0xO2Z1bmN0aW9uIGgoKXt1JiZhJiYodT0hMSxhLmxlbmd0aD9zPWEuY29uY2F0KHMpOmY9LTEscy5sZW5ndGgmJmwoKSl9ZnVuY3Rpb24gbCgpe2lmKCF1KXt2YXIgdD1vKGgpO3U9ITA7Zm9yKHZhciBlPXMubGVuZ3RoO2U7KXtmb3IoYT1zLHM9W107KytmPGU7KWEmJmFbZl0ucnVuKCk7Zj0tMSxlPXMubGVuZ3RofWE9bnVsbCx1PSExLGZ1bmN0aW9uKHQpe2lmKGk9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dCh0KTtpZigoaT09PXJ8fCFpKSYmY2xlYXJUaW1lb3V0KXJldHVybiBpPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQodCk7dHJ5e2kodCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBpLmNhbGwobnVsbCx0KX1jYXRjaChlKXtyZXR1cm4gaS5jYWxsKHRoaXMsdCl9fX0odCl9fWZ1bmN0aW9uIGModCl7dmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspZVtyLTFdPWFyZ3VtZW50c1tyXTtzLnB1c2gobmV3IGQodCxlKSksMSE9PXMubGVuZ3RofHx1fHxvKGwpfWZ1bmN0aW9uIGQodCxlKXt0aGlzLmZ1bj10LHRoaXMuYXJyYXk9ZX1kLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtmdW5jdGlvbiBwKCl7fXZhciBnPXAseT1wLGI9cCx2PXAsdz1wLG09cCxfPXA7dmFyIFM9dC5wZXJmb3JtYW5jZXx8e30sRT1TLm5vd3x8Uy5tb3pOb3d8fFMubXNOb3d8fFMub05vd3x8Uy53ZWJraXROb3d8fGZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9O3ZhciBrPW5ldyBEYXRlO3ZhciBSPXtuZXh0VGljazpjLHRpdGxlOiJicm93c2VyIixicm93c2VyOiEwLGVudjp7fSxhcmd2OltdLHZlcnNpb246IiIsdmVyc2lvbnM6e30sb246ZyxhZGRMaXN0ZW5lcjp5LG9uY2U6YixvZmY6dixyZW1vdmVMaXN0ZW5lcjp3LHJlbW92ZUFsbExpc3RlbmVyczptLGVtaXQ6XyxiaW5kaW5nOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24odCl7dmFyIGU9LjAwMSpFLmNhbGwoUykscj1NYXRoLmZsb29yKGUpLG49TWF0aC5mbG9vcihlJTEqMWU5KTtyZXR1cm4gdCYmKHItPXRbMF0sKG4tPXRbMV0pPDAmJihyLS0sbis9MWU5KSksW3Isbl19LHBsYXRmb3JtOiJicm93c2VyIixyZWxlYXNlOnt9LGNvbmZpZzp7fSx1cHRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUtaykvMWUzfX0saj0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIFQodCl7aWYodC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKHIpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxyKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLG4uZ2V0P246e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbcl19fSl9KSksZX1mdW5jdGlvbiBPKHQpe3ZhciBlPXtleHBvcnRzOnt9fTtyZXR1cm4gdChlLGUuZXhwb3J0cyksZS5leHBvcnRzfXZhciBBPU8oKGZ1bmN0aW9uKHQpe3ZvaWQgMD09PVJ8fCFSLnZlcnNpb258fDA9PT1SLnZlcnNpb24uaW5kZXhPZigidjAuIil8fDA9PT1SLnZlcnNpb24uaW5kZXhPZigidjEuIikmJjAhPT1SLnZlcnNpb24uaW5kZXhPZigidjEuOC4iKT90LmV4cG9ydHM9e25leHRUaWNrOmZ1bmN0aW9uKHQsZSxyLG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJjYWxsYmFjayIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7dmFyIGksbyxhPWFyZ3VtZW50cy5sZW5ndGg7c3dpdGNoKGEpe2Nhc2UgMDpjYXNlIDE6cmV0dXJuIFIubmV4dFRpY2sodCk7Y2FzZSAyOnJldHVybiBSLm5leHRUaWNrKChmdW5jdGlvbigpe3QuY2FsbChudWxsLGUpfSkpO2Nhc2UgMzpyZXR1cm4gUi5uZXh0VGljaygoZnVuY3Rpb24oKXt0LmNhbGwobnVsbCxlLHIpfSkpO2Nhc2UgNDpyZXR1cm4gUi5uZXh0VGljaygoZnVuY3Rpb24oKXt0LmNhbGwobnVsbCxlLHIsbil9KSk7ZGVmYXVsdDpmb3IoaT1uZXcgQXJyYXkoYS0xKSxvPTA7bzxpLmxlbmd0aDspaVtvKytdPWFyZ3VtZW50c1tvXTtyZXR1cm4gUi5uZXh0VGljaygoZnVuY3Rpb24oKXt0LmFwcGx5KG51bGwsaSl9KSl9fX06dC5leHBvcnRzPVJ9KSksQz17fS50b1N0cmluZyxNPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PUMuY2FsbCh0KX07ZnVuY3Rpb24geCgpe31mdW5jdGlvbiBMKCl7TC5pbml0LmNhbGwodGhpcyl9ZnVuY3Rpb24gQih0KXtyZXR1cm4gdm9pZCAwPT09dC5fbWF4TGlzdGVuZXJzP0wuZGVmYXVsdE1heExpc3RlbmVyczp0Ll9tYXhMaXN0ZW5lcnN9ZnVuY3Rpb24gUCh0LGUscil7aWYoZSl0LmNhbGwocik7ZWxzZSBmb3IodmFyIG49dC5sZW5ndGgsaT16KHQsbiksbz0wO288bjsrK28paVtvXS5jYWxsKHIpfWZ1bmN0aW9uIFUodCxlLHIsbil7aWYoZSl0LmNhbGwocixuKTtlbHNlIGZvcih2YXIgaT10Lmxlbmd0aCxvPXoodCxpKSxhPTA7YTxpOysrYSlvW2FdLmNhbGwocixuKX1mdW5jdGlvbiBOKHQsZSxyLG4saSl7aWYoZSl0LmNhbGwocixuLGkpO2Vsc2UgZm9yKHZhciBvPXQubGVuZ3RoLGE9eih0LG8pLHM9MDtzPG87KytzKWFbc10uY2FsbChyLG4saSl9ZnVuY3Rpb24gRCh0LGUscixuLGksbyl7aWYoZSl0LmNhbGwocixuLGksbyk7ZWxzZSBmb3IodmFyIGE9dC5sZW5ndGgscz16KHQsYSksdT0wO3U8YTsrK3Upc1t1XS5jYWxsKHIsbixpLG8pfWZ1bmN0aW9uIEkodCxlLHIsbil7aWYoZSl0LmFwcGx5KHIsbik7ZWxzZSBmb3IodmFyIGk9dC5sZW5ndGgsbz16KHQsaSksYT0wO2E8aTsrK2Epb1thXS5hcHBseShyLG4pfWZ1bmN0aW9uIHEodCxlLHIsbil7dmFyIGksbyxhLHM7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtpZigobz10Ll9ldmVudHMpPyhvLm5ld0xpc3RlbmVyJiYodC5lbWl0KCJuZXdMaXN0ZW5lciIsZSxyLmxpc3RlbmVyP3IubGlzdGVuZXI6ciksbz10Ll9ldmVudHMpLGE9b1tlXSk6KG89dC5fZXZlbnRzPW5ldyB4LHQuX2V2ZW50c0NvdW50PTApLGEpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhP2E9b1tlXT1uP1tyLGFdOlthLHJdOm4/YS51bnNoaWZ0KHIpOmEucHVzaChyKSwhYS53YXJuZWQmJihpPUIodCkpJiZpPjAmJmEubGVuZ3RoPmkpe2Eud2FybmVkPSEwO3ZhciB1PW5ldyBFcnJvcigiUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAiK2EubGVuZ3RoKyIgIitlKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO3UubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIix1LmVtaXR0ZXI9dCx1LnR5cGU9ZSx1LmNvdW50PWEubGVuZ3RoLHM9dSwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS53YXJuP2NvbnNvbGUud2FybihzKTpjb25zb2xlLmxvZyhzKX19ZWxzZSBhPW9bZV09ciwrK3QuX2V2ZW50c0NvdW50O3JldHVybiB0fWZ1bmN0aW9uIEYodCxlLHIpe3ZhciBuPSExO2Z1bmN0aW9uIGkoKXt0LnJlbW92ZUxpc3RlbmVyKGUsaSksbnx8KG49ITAsci5hcHBseSh0LGFyZ3VtZW50cykpfXJldHVybiBpLmxpc3RlbmVyPXIsaX1mdW5jdGlvbiBXKHQpe3ZhciBlPXRoaXMuX2V2ZW50cztpZihlKXt2YXIgcj1lW3RdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByKXJldHVybiAxO2lmKHIpcmV0dXJuIHIubGVuZ3RofXJldHVybiAwfWZ1bmN0aW9uIHoodCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT10W2VdO3JldHVybiByfXgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobnVsbCksTC5FdmVudEVtaXR0ZXI9TCxMLnVzaW5nRG9tYWlucz0hMSxMLnByb3RvdHlwZS5kb21haW49dm9pZCAwLEwucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLEwucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLEwuZGVmYXVsdE1heExpc3RlbmVycz0xMCxMLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmRvbWFpbj1udWxsLEwudXNpbmdEb21haW5zJiZ1bmRlZmluZWQuYWN0aXZlLHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9bmV3IHgsdGhpcy5fZXZlbnRzQ291bnQ9MCksdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfSxMLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0fHx0PDB8fGlzTmFOKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJuIiBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9LEwucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBCKHRoaXMpfSxMLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8sYSxzLHU9ImVycm9yIj09PXQ7aWYoYT10aGlzLl9ldmVudHMpdT11JiZudWxsPT1hLmVycm9yO2Vsc2UgaWYoIXUpcmV0dXJuITE7aWYocz10aGlzLmRvbWFpbix1KXtpZihlPWFyZ3VtZW50c1sxXSwhcyl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGU7dmFyIGY9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudC4gKCcrZSsiKSIpO3Rocm93IGYuY29udGV4dD1lLGZ9cmV0dXJuIGV8fChlPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQnKSksZS5kb21haW5FbWl0dGVyPXRoaXMsZS5kb21haW49cyxlLmRvbWFpblRocm93bj0hMSxzLmVtaXQoImVycm9yIixlKSwhMX1pZighKHI9YVt0XSkpcmV0dXJuITE7dmFyIGg9ImZ1bmN0aW9uIj09dHlwZW9mIHI7c3dpdGNoKG49YXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOlAocixoLHRoaXMpO2JyZWFrO2Nhc2UgMjpVKHIsaCx0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOk4ocixoLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7YnJlYWs7Y2FzZSA0OkQocixoLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10pO2JyZWFrO2RlZmF1bHQ6Zm9yKGk9bmV3IEFycmF5KG4tMSksbz0xO288bjtvKyspaVtvLTFdPWFyZ3VtZW50c1tvXTtJKHIsaCx0aGlzLGkpfXJldHVybiEwfSxMLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBxKHRoaXMsdCxlLCExKX0sTC5wcm90b3R5cGUub249TC5wcm90b3R5cGUuYWRkTGlzdGVuZXIsTC5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHEodGhpcyx0LGUsITApfSxMLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5vbih0LEYodGhpcyx0LGUpKSx0aGlzfSxMLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5wcmVwZW5kTGlzdGVuZXIodCxGKHRoaXMsdCxlKSksdGhpc30sTC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxhO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7aWYoIShuPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYoIShyPW5bdF0pKXJldHVybiB0aGlzO2lmKHI9PT1lfHxyLmxpc3RlbmVyJiZyLmxpc3RlbmVyPT09ZSkwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgeDooZGVsZXRlIG5bdF0sbi5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxyLmxpc3RlbmVyfHxlKSk7ZWxzZSBpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil7Zm9yKGk9LTEsbz1yLmxlbmd0aDtvLS0gPjA7KWlmKHJbb109PT1lfHxyW29dLmxpc3RlbmVyJiZyW29dLmxpc3RlbmVyPT09ZSl7YT1yW29dLmxpc3RlbmVyLGk9bzticmVha31pZihpPDApcmV0dXJuIHRoaXM7aWYoMT09PXIubGVuZ3RoKXtpZihyWzBdPXZvaWQgMCwwPT0tLXRoaXMuX2V2ZW50c0NvdW50KXJldHVybiB0aGlzLl9ldmVudHM9bmV3IHgsdGhpcztkZWxldGUgblt0XX1lbHNlIWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWUsbj1yKzEsaT10Lmxlbmd0aDtuPGk7cis9MSxuKz0xKXRbcl09dFtuXTt0LnBvcCgpfShyLGkpO24ucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHQsYXx8ZSl9cmV0dXJuIHRoaXN9LEwucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyO2lmKCEocj10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKCFyLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZXZlbnRzPW5ldyB4LHRoaXMuX2V2ZW50c0NvdW50PTApOnJbdF0mJigwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgeDpkZWxldGUgclt0XSksdGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBuLGk9T2JqZWN0LmtleXMociksbz0wO288aS5sZW5ndGg7KytvKSJyZW1vdmVMaXN0ZW5lciIhPT0obj1pW29dKSYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMobik7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1uZXcgeCx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoImZ1bmN0aW9uIj09dHlwZW9mKGU9clt0XSkpdGhpcy5yZW1vdmVMaXN0ZW5lcih0LGUpO2Vsc2UgaWYoZSlkb3t0aGlzLnJlbW92ZUxpc3RlbmVyKHQsZVtlLmxlbmd0aC0xXSl9d2hpbGUoZVswXSk7cmV0dXJuIHRoaXN9LEwucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyPXRoaXMuX2V2ZW50cztyZXR1cm4gciYmKGU9clt0XSk/ImZ1bmN0aW9uIj09dHlwZW9mIGU/W2UubGlzdGVuZXJ8fGVdOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9MDtyPGUubGVuZ3RoOysrcillW3JdPXRbcl0ubGlzdGVuZXJ8fHRbcl07cmV0dXJuIGV9KGUpOltdfSxMLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5saXN0ZW5lckNvdW50P3QubGlzdGVuZXJDb3VudChlKTpXLmNhbGwodCxlKX0sTC5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1XLEwucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9SZWZsZWN0Lm93bktleXModGhpcy5fZXZlbnRzKTpbXX07dmFyIFk9VChPYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0OkwsRXZlbnRFbWl0dGVyOkx9KSksJD1ZLkV2ZW50RW1pdHRlcixIPVtdLEo9W10sRz0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxWPSExO2Z1bmN0aW9uIEsoKXtWPSEwO2Zvcih2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSlIW2VdPXRbZV0sSlt0LmNoYXJDb2RlQXQoZSldPWU7SlsiLSIuY2hhckNvZGVBdCgwKV09NjIsSlsiXyIuY2hhckNvZGVBdCgwKV09NjN9ZnVuY3Rpb24gWih0LGUscil7Zm9yKHZhciBuLGksbz1bXSxhPWU7YTxyO2ErPTMpbj0odFthXTw8MTYpKyh0W2ErMV08PDgpK3RbYSsyXSxvLnB1c2goSFsoaT1uKT4+MTgmNjNdK0hbaT4+MTImNjNdK0hbaT4+NiY2M10rSFs2MyZpXSk7cmV0dXJuIG8uam9pbigiIil9ZnVuY3Rpb24gWCh0KXt2YXIgZTtWfHxLKCk7Zm9yKHZhciByPXQubGVuZ3RoLG49ciUzLGk9IiIsbz1bXSxhPTE2MzgzLHM9MCx1PXItbjtzPHU7cys9YSlvLnB1c2goWih0LHMscythPnU/dTpzK2EpKTtyZXR1cm4gMT09PW4/KGU9dFtyLTFdLGkrPUhbZT4+Ml0saSs9SFtlPDw0JjYzXSxpKz0iPT0iKToyPT09biYmKGU9KHRbci0yXTw8OCkrdFtyLTFdLGkrPUhbZT4+MTBdLGkrPUhbZT4+NCY2M10saSs9SFtlPDwyJjYzXSxpKz0iPSIpLG8ucHVzaChpKSxvLmpvaW4oIiIpfWZ1bmN0aW9uIFEodCxlLHIsbixpKXt2YXIgbyxhLHM9OCppLW4tMSx1PSgxPDxzKS0xLGY9dT4+MSxoPS03LGw9cj9pLTE6MCxjPXI/LTE6MSxkPXRbZStsXTtmb3IobCs9YyxvPWQmKDE8PC1oKS0xLGQ+Pj0taCxoKz1zO2g+MDtvPTI1NipvK3RbZStsXSxsKz1jLGgtPTgpO2ZvcihhPW8mKDE8PC1oKS0xLG8+Pj0taCxoKz1uO2g+MDthPTI1NiphK3RbZStsXSxsKz1jLGgtPTgpO2lmKDA9PT1vKW89MS1mO2Vsc2V7aWYobz09PXUpcmV0dXJuIGE/TmFOOjEvMCooZD8tMToxKTthKz1NYXRoLnBvdygyLG4pLG8tPWZ9cmV0dXJuKGQ/LTE6MSkqYSpNYXRoLnBvdygyLG8tbil9ZnVuY3Rpb24gdHQodCxlLHIsbixpLG8pe3ZhciBhLHMsdSxmPTgqby1pLTEsaD0oMTw8ZiktMSxsPWg+PjEsYz0yMz09PWk/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGQ9bj8wOm8tMSxwPW4/MTotMSxnPWU8MHx8MD09PWUmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8ocz1pc05hTihlKT8xOjAsYT1oKTooYT1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKih1PU1hdGgucG93KDIsLWEpKTwxJiYoYS0tLHUqPTIpLChlKz1hK2w+PTE/Yy91OmMqTWF0aC5wb3coMiwxLWwpKSp1Pj0yJiYoYSsrLHUvPTIpLGErbD49aD8ocz0wLGE9aCk6YStsPj0xPyhzPShlKnUtMSkqTWF0aC5wb3coMixpKSxhKz1sKToocz1lKk1hdGgucG93KDIsbC0xKSpNYXRoLnBvdygyLGkpLGE9MCkpO2k+PTg7dFtyK2RdPTI1NSZzLGQrPXAscy89MjU2LGktPTgpO2ZvcihhPWE8PGl8cyxmKz1pO2Y+MDt0W3IrZF09MjU1JmEsZCs9cCxhLz0yNTYsZi09OCk7dFtyK2QtcF18PTEyOCpnfXZhciBldD17fS50b1N0cmluZyxydD1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1ldC5jYWxsKHQpfTthdC5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMD09PXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8dC5UWVBFRF9BUlJBWV9TVVBQT1JUO3ZhciBudD1pdCgpO2Z1bmN0aW9uIGl0KCl7cmV0dXJuIGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIG90KHQsZSl7aWYoaXQoKTxlKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PW5ldyBVaW50OEFycmF5KGUpKS5fX3Byb3RvX189YXQucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IGF0KGUpKSx0Lmxlbmd0aD1lKSx0fWZ1bmN0aW9uIGF0KHQsZSxyKXtpZighKGF0LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBhdCkpcmV0dXJuIG5ldyBhdCh0LGUscik7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBmdCh0aGlzLHQpfXJldHVybiBzdCh0aGlzLHQsZSxyKX1mdW5jdGlvbiBzdCh0LGUscixuKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbih0LGUscixuKXtpZihlLmJ5dGVMZW5ndGgscjwwfHxlLmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKGUuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO2U9dm9pZCAwPT09ciYmdm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlKTp2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KGUscik6bmV3IFVpbnQ4QXJyYXkoZSxyLG4pO2F0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPWF0LnByb3RvdHlwZTp0PWh0KHQsZSk7cmV0dXJuIHR9KHQsZSxyLG4pOiJzdHJpbmciPT10eXBlb2YgZT9mdW5jdGlvbih0LGUscil7InN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4Iik7aWYoIWF0LmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIG49MHxkdChlLHIpLGk9KHQ9b3QodCxuKSkud3JpdGUoZSxyKTtpIT09biYmKHQ9dC5zbGljZSgwLGkpKTtyZXR1cm4gdH0odCxlLHIpOmZ1bmN0aW9uKHQsZSl7aWYoY3QoZSkpe3ZhciByPTB8bHQoZS5sZW5ndGgpO3JldHVybiAwPT09KHQ9b3QodCxyKSkubGVuZ3RofHxlLmNvcHkodCwwLDAsciksdH1pZihlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIGUpcmV0dXJuIm51bWJlciIhPXR5cGVvZiBlLmxlbmd0aHx8KG49ZS5sZW5ndGgpIT1uP290KHQsMCk6aHQodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmcnQoZS5kYXRhKSlyZXR1cm4gaHQodCxlLmRhdGEpfXZhciBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0odCxlKX1mdW5jdGlvbiB1dCh0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGZ0KHQsZSl7aWYodXQoZSksdD1vdCh0LGU8MD8wOjB8bHQoZSkpLCFhdC5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgcj0wO3I8ZTsrK3IpdFtyXT0wO3JldHVybiB0fWZ1bmN0aW9uIGh0KHQsZSl7dmFyIHI9ZS5sZW5ndGg8MD8wOjB8bHQoZS5sZW5ndGgpO3Q9b3QodCxyKTtmb3IodmFyIG49MDtuPHI7bis9MSl0W25dPTI1NSZlW25dO3JldHVybiB0fWZ1bmN0aW9uIGx0KHQpe2lmKHQ+PWl0KCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK2l0KCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIGN0KHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX1mdW5jdGlvbiBkdCh0LGUpe2lmKGN0KHQpKXJldHVybiB0Lmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KTt2YXIgcj10Lmxlbmd0aDtpZigwPT09cilyZXR1cm4gMDtmb3IodmFyIG49ITE7Oylzd2l0Y2goZSl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBJdCh0KS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKnI7Y2FzZSJoZXgiOnJldHVybiByPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIHF0KHQpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIEl0KHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIHB0KHQsZSxyKXt2YXIgbj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09cnx8cj50aGlzLmxlbmd0aCkmJihyPXRoaXMubGVuZ3RoKSxyPD0wKXJldHVybiIiO2lmKChyPj4+PTApPD0oZT4+Pj0wKSlyZXR1cm4iIjtmb3IodHx8KHQ9InV0ZjgiKTs7KXN3aXRjaCh0KXtjYXNlImhleCI6cmV0dXJuIE90KHRoaXMsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBSdCh0aGlzLGUscik7Y2FzZSJhc2NpaSI6cmV0dXJuIGp0KHRoaXMsZSxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBUdCh0aGlzLGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBrdCh0aGlzLGUscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBBdCh0aGlzLGUscik7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7dD0odCsiIikudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBndCh0LGUscil7dmFyIG49dFtlXTt0W2VdPXRbcl0sdFtyXT1ufWZ1bmN0aW9uIHl0KHQsZSxyLG4saSl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygcj8obj1yLHI9MCk6cj4yMTQ3NDgzNjQ3P3I9MjE0NzQ4MzY0NzpyPC0yMTQ3NDgzNjQ4JiYocj0tMjE0NzQ4MzY0OCkscj0rcixpc05hTihyKSYmKHI9aT8wOnQubGVuZ3RoLTEpLHI8MCYmKHI9dC5sZW5ndGgrcikscj49dC5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7cj10Lmxlbmd0aC0xfWVsc2UgaWYocjwwKXtpZighaSlyZXR1cm4tMTtyPTB9aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1hdC5mcm9tKGUsbikpLGN0KGUpKXJldHVybiAwPT09ZS5sZW5ndGg/LTE6YnQodCxlLHIsbixpKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGUmPTI1NSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUscik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUscik6YnQodCxbZV0scixuLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIGJ0KHQsZSxyLG4saSl7dmFyIG8sYT0xLHM9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO2E9MixzLz0yLHUvPTIsci89Mn1mdW5jdGlvbiBmKHQsZSl7cmV0dXJuIDE9PT1hP3RbZV06dC5yZWFkVUludDE2QkUoZSphKX1pZihpKXt2YXIgaD0tMTtmb3Iobz1yO288cztvKyspaWYoZih0LG8pPT09ZihlLC0xPT09aD8wOm8taCkpe2lmKC0xPT09aCYmKGg9byksby1oKzE9PT11KXJldHVybiBoKmF9ZWxzZS0xIT09aCYmKG8tPW8taCksaD0tMX1lbHNlIGZvcihyK3U+cyYmKHI9cy11KSxvPXI7bz49MDtvLS0pe2Zvcih2YXIgbD0hMCxjPTA7Yzx1O2MrKylpZihmKHQsbytjKSE9PWYoZSxjKSl7bD0hMTticmVha31pZihsKXJldHVybiBvfXJldHVybi0xfWZ1bmN0aW9uIHZ0KHQsZSxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBpPXQubGVuZ3RoLXI7bj8obj1OdW1iZXIobikpPmkmJihuPWkpOm49aTt2YXIgbz1lLmxlbmd0aDtpZihvJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5vLzImJihuPW8vMik7Zm9yKHZhciBhPTA7YTxuOysrYSl7dmFyIHM9cGFyc2VJbnQoZS5zdWJzdHIoMiphLDIpLDE2KTtpZihpc05hTihzKSlyZXR1cm4gYTt0W3IrYV09c31yZXR1cm4gYX1mdW5jdGlvbiB3dCh0LGUscixuKXtyZXR1cm4gRnQoSXQoZSx0Lmxlbmd0aC1yKSx0LHIsbil9ZnVuY3Rpb24gbXQodCxlLHIsbil7cmV0dXJuIEZ0KGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDsrK3IpZS5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQocikpO3JldHVybiBlfShlKSx0LHIsbil9ZnVuY3Rpb24gX3QodCxlLHIsbil7cmV0dXJuIG10KHQsZSxyLG4pfWZ1bmN0aW9uIFN0KHQsZSxyLG4pe3JldHVybiBGdChxdChlKSx0LHIsbil9ZnVuY3Rpb24gRXQodCxlLHIsbil7cmV0dXJuIEZ0KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG4saSxvPVtdLGE9MDthPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK2Epbj0ocj10LmNoYXJDb2RlQXQoYSkpPj44LGk9ciUyNTYsby5wdXNoKGkpLG8ucHVzaChuKTtyZXR1cm4gb30oZSx0Lmxlbmd0aC1yKSx0LHIsbil9ZnVuY3Rpb24ga3QodCxlLHIpe3JldHVybiAwPT09ZSYmcj09PXQubGVuZ3RoP1godCk6WCh0LnNsaWNlKGUscikpfWZ1bmN0aW9uIFJ0KHQsZSxyKXtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPWU7aTxyOyl7dmFyIG8sYSxzLHUsZj10W2ldLGg9bnVsbCxsPWY+MjM5PzQ6Zj4yMjM/MzpmPjE5MT8yOjE7aWYoaStsPD1yKXN3aXRjaChsKXtjYXNlIDE6ZjwxMjgmJihoPWYpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKG89dFtpKzFdKSkmJih1PSgzMSZmKTw8Nnw2MyZvKT4xMjcmJihoPXUpO2JyZWFrO2Nhc2UgMzpvPXRbaSsxXSxhPXRbaSsyXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZhKSYmKHU9KDE1JmYpPDwxMnwoNjMmbyk8PDZ8NjMmYSk+MjA0NyYmKHU8NTUyOTZ8fHU+NTczNDMpJiYoaD11KTticmVhaztjYXNlIDQ6bz10W2krMV0sYT10W2krMl0scz10W2krM10sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImYSkmJjEyOD09KDE5MiZzKSYmKHU9KDE1JmYpPDwxOHwoNjMmbyk8PDEyfCg2MyZhKTw8Nnw2MyZzKT42NTUzNSYmdTwxMTE0MTEyJiYoaD11KX1udWxsPT09aD8oaD02NTUzMyxsPTEpOmg+NjU1MzUmJihoLT02NTUzNixuLnB1c2goaD4+PjEwJjEwMjN8NTUyOTYpLGg9NTYzMjB8MTAyMyZoKSxuLnB1c2goaCksaSs9bH1yZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9NDA5NilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdCk7dmFyIHI9IiIsbj0wO2Zvcig7bjxlOylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0LnNsaWNlKG4sbis9NDA5NikpO3JldHVybiByfShuKX1hdC5wb29sU2l6ZT04MTkyLGF0Ll9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz1hdC5wcm90b3R5cGUsdH0sYXQuZnJvbT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHN0KG51bGwsdCxlLHIpfSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoYXQucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxhdC5fX3Byb3RvX189VWludDhBcnJheSksYXQuYWxsb2M9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBmdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdXQoZSksZTw9MD9vdCh0LGUpOnZvaWQgMCE9PXI/InN0cmluZyI9PXR5cGVvZiBuP290KHQsZSkuZmlsbChyLG4pOm90KHQsZSkuZmlsbChyKTpvdCh0LGUpfShudWxsLHQsZSxyKX0sYXQuYWxsb2NVbnNhZmU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ0KG51bGwsdCl9LGF0LmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gZnQobnVsbCx0KX0sYXQuaXNCdWZmZXI9V3QsYXQuY29tcGFyZT1mdW5jdGlvbih0LGUpe2lmKCFjdCh0KXx8IWN0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIHI9dC5sZW5ndGgsbj1lLmxlbmd0aCxpPTAsbz1NYXRoLm1pbihyLG4pO2k8bzsrK2kpaWYodFtpXSE9PWVbaV0pe3I9dFtpXSxuPWVbaV07YnJlYWt9cmV0dXJuIHI8bj8tMTpuPHI/MTowfSxhdC5pc0VuY29kaW5nPWZ1bmN0aW9uKHQpe3N3aXRjaChTdHJpbmcodCkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxhdC5jb25jYXQ9ZnVuY3Rpb24odCxlKXtpZighcnQodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gYXQuYWxsb2MoMCk7dmFyIHI7aWYodm9pZCAwPT09ZSlmb3IoZT0wLHI9MDtyPHQubGVuZ3RoOysrcillKz10W3JdLmxlbmd0aDt2YXIgbj1hdC5hbGxvY1Vuc2FmZShlKSxpPTA7Zm9yKHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIG89dFtyXTtpZighY3QobykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO28uY29weShuLGkpLGkrPW8ubGVuZ3RofXJldHVybiBufSxhdC5ieXRlTGVuZ3RoPWR0LGF0LnByb3RvdHlwZS5faXNCdWZmZXI9ITAsYXQucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9MilndCh0aGlzLGUsZSsxKTtyZXR1cm4gdGhpc30sYXQucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9NClndCh0aGlzLGUsZSszKSxndCh0aGlzLGUrMSxlKzIpO3JldHVybiB0aGlzfSxhdC5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz04KWd0KHRoaXMsZSxlKzcpLGd0KHRoaXMsZSsxLGUrNiksZ3QodGhpcyxlKzIsZSs1KSxndCh0aGlzLGUrMyxlKzQpO3JldHVybiB0aGlzfSxhdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9SdCh0aGlzLDAsdCk6cHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhdC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCFjdCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT10fHwwPT09YXQuY29tcGFyZSh0aGlzLHQpfSxhdC5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiO3JldHVybiB0aGlzLmxlbmd0aD4wJiYodD10aGlzLnRvU3RyaW5nKCJoZXgiLDAsNTApLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD41MCYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSxhdC5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUscixuLGkpe2lmKCFjdCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dD90Lmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksZTwwfHxyPnQubGVuZ3RofHxuPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWkmJmU+PXIpcmV0dXJuIDA7aWYobj49aSlyZXR1cm4tMTtpZihlPj1yKXJldHVybiAxO2lmKHRoaXM9PT10KXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0obj4+Pj0wKSxhPShyPj4+PTApLShlPj4+PTApLHM9TWF0aC5taW4obyxhKSx1PXRoaXMuc2xpY2UobixpKSxmPXQuc2xpY2UoZSxyKSxoPTA7aDxzOysraClpZih1W2hdIT09ZltoXSl7bz11W2hdLGE9ZltoXTticmVha31yZXR1cm4gbzxhPy0xOmE8bz8xOjB9LGF0LnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUscil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLHIpfSxhdC5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHl0KHRoaXMsdCxlLHIsITApfSxhdC5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB5dCh0aGlzLHQsZSxyLCExKX0sYXQucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHZvaWQgMD09PWUpbj0idXRmOCIscj10aGlzLmxlbmd0aCxlPTA7ZWxzZSBpZih2b2lkIDA9PT1yJiYic3RyaW5nIj09dHlwZW9mIGUpbj1lLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2V7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTtlfD0wLGlzRmluaXRlKHIpPyhyfD0wLHZvaWQgMD09PW4mJihuPSJ1dGY4IikpOihuPXIscj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLWU7aWYoKHZvaWQgMD09PXJ8fHI+aSkmJihyPWkpLHQubGVuZ3RoPjAmJihyPDB8fGU8MCl8fGU+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7bnx8KG49InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gobil7Y2FzZSJoZXgiOnJldHVybiB2dCh0aGlzLHQsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiB3dCh0aGlzLHQsZSxyKTtjYXNlImFzY2lpIjpyZXR1cm4gbXQodGhpcyx0LGUscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gX3QodGhpcyx0LGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBTdCh0aGlzLHQsZSxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEV0KHRoaXMsdCxlLHIpO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pO249KCIiK24pLnRvTG93ZXJDYXNlKCksbz0hMH19LGF0LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O2Z1bmN0aW9uIGp0KHQsZSxyKXt2YXIgbj0iIjtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgaT1lO2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmdFtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gVHQodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbaV0pO3JldHVybiBufWZ1bmN0aW9uIE90KHQsZSxyKXt2YXIgbj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsbz1lO288cjsrK28paSs9RHQodFtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gQXQodCxlLHIpe2Zvcih2YXIgbj10LnNsaWNlKGUsciksaT0iIixvPTA7bzxuLmxlbmd0aDtvKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUobltvXSsyNTYqbltvKzFdKTtyZXR1cm4gaX1mdW5jdGlvbiBDdCh0LGUscil7aWYodCUxIT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5yKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gTXQodCxlLHIsbixpLG8pe2lmKCFjdCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYoZT5pfHxlPG8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24geHQodCxlLHIsbil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciwyKTtpPG87KytpKXRbcitpXT0oZSYyNTU8PDgqKG4/aToxLWkpKT4+PjgqKG4/aToxLWkpfWZ1bmN0aW9uIEx0KHQsZSxyLG4pe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciw0KTtpPG87KytpKXRbcitpXT1lPj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIEJ0KHQsZSxyLG4saSxvKXtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUHQodCxlLHIsbixpKXtyZXR1cm4gaXx8QnQodCwwLHIsNCksdHQodCxlLHIsbiwyMyw0KSxyKzR9ZnVuY3Rpb24gVXQodCxlLHIsbixpKXtyZXR1cm4gaXx8QnQodCwwLHIsOCksdHQodCxlLHIsbiw1Miw4KSxyKzh9YXQucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj10aGlzLmxlbmd0aDtpZigodD1+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksKGU9dm9pZCAwPT09ZT9uOn5+ZSk8MD8oZSs9bik8MCYmKGU9MCk6ZT5uJiYoZT1uKSxlPHQmJihlPXQpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQpKHI9dGhpcy5zdWJhcnJheSh0LGUpKS5fX3Byb3RvX189YXQucHJvdG90eXBlO2Vsc2V7dmFyIGk9ZS10O3I9bmV3IGF0KGksdm9pZCAwKTtmb3IodmFyIG89MDtvPGk7KytvKXJbb109dGhpc1tvK3RdfXJldHVybiByfSxhdC5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEN0KHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdF0saT0xLG89MDsrK288ZSYmKGkqPTI1Nik7KW4rPXRoaXNbdCtvXSppO3JldHVybiBufSxhdC5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEN0KHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdCstLWVdLGk9MTtlPjAmJihpKj0yNTYpOyluKz10aGlzW3QrLS1lXSppO3JldHVybiBufSxhdC5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sYXQucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSxhdC5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XTw8OHx0aGlzW3QrMV19LGF0LnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSxhdC5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sYXQucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEN0KHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdF0saT0xLG89MDsrK288ZSYmKGkqPTI1Nik7KW4rPXRoaXNbdCtvXSppO3JldHVybiBuPj0oaSo9MTI4KSYmKG4tPU1hdGgucG93KDIsOCplKSksbn0sYXQucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEN0KHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPWUsaT0xLG89dGhpc1t0Ky0tbl07bj4wJiYoaSo9MjU2KTspbys9dGhpc1t0Ky0tbl0qaTtyZXR1cm4gbz49KGkqPTEyOCkmJihvLT1NYXRoLnBvdygyLDgqZSkpLG99LGF0LnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPy0xKigyNTUtdGhpc1t0XSsxKTp0aGlzW3RdfSxhdC5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24odCxlKXtlfHxDdCh0LDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbdF18dGhpc1t0KzFdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxhdC5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxlKXtlfHxDdCh0LDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxhdC5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LGF0LnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDI0fHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXX0sYXQucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsNCx0aGlzLmxlbmd0aCksUSh0aGlzLHQsITAsMjMsNCl9LGF0LnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDQsdGhpcy5sZW5ndGgpLFEodGhpcyx0LCExLDIzLDQpfSxhdC5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsOCx0aGlzLmxlbmd0aCksUSh0aGlzLHQsITAsNTIsOCl9LGF0LnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw4LHRoaXMubGVuZ3RoKSxRKHRoaXMsdCwhMSw1Miw4KX0sYXQucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKHQsZSxyLG4peyh0PSt0LGV8PTAscnw9MCxuKXx8TXQodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT0xLG89MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKGkqPTI1Nik7KXRoaXNbZStvXT10L2kmMjU1O3JldHVybiBlK3J9LGF0LnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbih0LGUscixuKXsodD0rdCxlfD0wLHJ8PTAsbil8fE10KHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9ci0xLG89MTtmb3IodGhpc1tlK2ldPTI1NSZ0Oy0taT49MCYmKG8qPTI1Nik7KXRoaXNbZStpXT10L28mMjU1O3JldHVybiBlK3J9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDEsMjU1LDApLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHRoaXNbZV09MjU1JnQsZSsxfSxhdC5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSwyLDY1NTM1LDApLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTp4dCh0aGlzLHQsZSwhMCksZSsyfSxhdC5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSwyLDY1NTM1LDApLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTp4dCh0aGlzLHQsZSwhMSksZSsyfSxhdC5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlKzNdPXQ+Pj4yNCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2VdPTI1NSZ0KTpMdCh0aGlzLHQsZSwhMCksZSs0fSxhdC5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpMdCh0aGlzLHQsZSwhMSksZSs0fSxhdC5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO010KHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgbz0wLGE9MSxzPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihhKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK28tMV0mJihzPTEpLHRoaXNbZStvXT0odC9hPj4wKS1zJjI1NTtyZXR1cm4gZStyfSxhdC5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO010KHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgbz1yLTEsYT0xLHM9MDtmb3IodGhpc1tlK29dPTI1NSZ0Oy0tbz49MCYmKGEqPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UrbysxXSYmKHM9MSksdGhpc1tlK29dPSh0L2E+PjApLXMmMjU1O3JldHVybiBlK3J9LGF0LnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsMSwxMjcsLTEyOCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0sYXQucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOnh0KHRoaXMsdCxlLCEwKSxlKzJ9LGF0LnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTp4dCh0aGlzLHQsZSwhMSksZSsyfSxhdC5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrM109dD4+PjI0KTpMdCh0aGlzLHQsZSwhMCksZSs0fSxhdC5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdDwwJiYodD00Mjk0OTY3Mjk1K3QrMSksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpMdCh0aGlzLHQsZSwhMSksZSs0fSxhdC5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUHQodGhpcyx0LGUsITAscil9LGF0LnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBQdCh0aGlzLHQsZSwhMSxyKX0sYXQucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVdCh0aGlzLHQsZSwhMCxyKX0sYXQucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVdCh0aGlzLHQsZSwhMSxyKX0sYXQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLHIsbil7aWYocnx8KHI9MCksbnx8MD09PW58fChuPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLG4+MCYmbjxyJiYobj1yKSxuPT09cilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDB8fHI+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO24+dGhpcy5sZW5ndGgmJihuPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPG4tciYmKG49dC5sZW5ndGgtZStyKTt2YXIgaSxvPW4tcjtpZih0aGlzPT09dCYmcjxlJiZlPG4pZm9yKGk9by0xO2k+PTA7LS1pKXRbaStlXT10aGlzW2krcl07ZWxzZSBpZihvPDFlM3x8IWF0LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKGk9MDtpPG87KytpKXRbaStlXT10aGlzW2krcl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbCh0LHRoaXMuc3ViYXJyYXkocixyK28pLGUpO3JldHVybiBvfSxhdC5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LGUscixuKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZT8obj1lLGU9MCxyPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIHImJihuPXIscj10aGlzLmxlbmd0aCksMT09PXQubGVuZ3RoKXt2YXIgaT10LmNoYXJDb2RlQXQoMCk7aTwyNTYmJih0PWkpfWlmKHZvaWQgMCE9PW4mJiJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYhYXQuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocjw9ZSlyZXR1cm4gdGhpczt2YXIgbztpZihlPj4+PTAscj12b2lkIDA9PT1yP3RoaXMubGVuZ3RoOnI+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3Iobz1lO288cjsrK28pdGhpc1tvXT10O2Vsc2V7dmFyIGE9Y3QodCk/dDpJdChuZXcgYXQodCxuKS50b1N0cmluZygpKSxzPWEubGVuZ3RoO2ZvcihvPTA7bzxyLWU7KytvKXRoaXNbbytlXT1hW28lc119cmV0dXJuIHRoaXN9O3ZhciBOdD0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBEdCh0KXtyZXR1cm4gdDwxNj8iMCIrdC50b1N0cmluZygxNik6dC50b1N0cmluZygxNil9ZnVuY3Rpb24gSXQodCxlKXt2YXIgcjtlPWV8fDEvMDtmb3IodmFyIG49dC5sZW5ndGgsaT1udWxsLG89W10sYT0wO2E8bjsrK2Epe2lmKChyPXQuY2hhckNvZGVBdChhKSk+NTUyOTUmJnI8NTczNDQpe2lmKCFpKXtpZihyPjU2MzE5KXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYoYSsxPT09bil7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9cjtjb250aW51ZX1pZihyPDU2MzIwKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT1yO2NvbnRpbnVlfXI9NjU1MzYrKGktNTUyOTY8PDEwfHItNTYzMjApfWVsc2UgaSYmKGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCxyPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7by5wdXNoKHIpfWVsc2UgaWYocjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztvLnB1c2gocj4+NnwxOTIsNjMmcnwxMjgpfWVsc2UgaWYocjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7by5wdXNoKHI+PjEyfDIyNCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9ZWxzZXtpZighKHI8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztvLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIHF0KHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZSxyLG4saSxvLGE7Vnx8SygpO3ZhciBzPXQubGVuZ3RoO2lmKHMlND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO289Ij0iPT09dFtzLTJdPzI6Ij0iPT09dFtzLTFdPzE6MCxhPW5ldyBHKDMqcy80LW8pLG49bz4wP3MtNDpzO3ZhciB1PTA7Zm9yKGU9MCxyPTA7ZTxuO2UrPTQscis9MylpPUpbdC5jaGFyQ29kZUF0KGUpXTw8MTh8Slt0LmNoYXJDb2RlQXQoZSsxKV08PDEyfEpbdC5jaGFyQ29kZUF0KGUrMildPDw2fEpbdC5jaGFyQ29kZUF0KGUrMyldLGFbdSsrXT1pPj4xNiYyNTUsYVt1KytdPWk+PjgmMjU1LGFbdSsrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9Slt0LmNoYXJDb2RlQXQoZSldPDwyfEpbdC5jaGFyQ29kZUF0KGUrMSldPj40LGFbdSsrXT0yNTUmaSk6MT09PW8mJihpPUpbdC5jaGFyQ29kZUF0KGUpXTw8MTB8Slt0LmNoYXJDb2RlQXQoZSsxKV08PDR8Slt0LmNoYXJDb2RlQXQoZSsyKV0+PjIsYVt1KytdPWk+PjgmMjU1LGFbdSsrXT0yNTUmaSksYX0oZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZShOdCwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7dC5sZW5ndGglNCE9MDspdCs9Ij0iO3JldHVybiB0fSh0KSl9ZnVuY3Rpb24gRnQodCxlLHIsbil7Zm9yKHZhciBpPTA7aTxuJiYhKGkrcj49ZS5sZW5ndGh8fGk+PXQubGVuZ3RoKTsrK2kpZVtpK3JdPXRbaV07cmV0dXJuIGl9ZnVuY3Rpb24gV3QodCl7cmV0dXJuIG51bGwhPXQmJighIXQuX2lzQnVmZmVyfHx6dCh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZEZsb2F0TEUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnNsaWNlJiZ6dCh0LnNsaWNlKDAsMCkpfSh0KSl9ZnVuY3Rpb24genQodCl7cmV0dXJuISF0LmNvbnN0cnVjdG9yJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih0KX12YXIgWXQ9VChPYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxCdWZmZXI6YXQsSU5TUEVDVF9NQVhfQllURVM6NTAsU2xvd0J1ZmZlcjpmdW5jdGlvbih0KXtyZXR1cm4rdCE9dCYmKHQ9MCksYXQuYWxsb2MoK3QpfSxpc0J1ZmZlcjpXdCxrTWF4TGVuZ3RoOm50fSkpLCR0PU8oKGZ1bmN0aW9uKHQsZSl7dmFyIHI9WXQuQnVmZmVyO2Z1bmN0aW9uIG4odCxlKXtmb3IodmFyIHIgaW4gdCllW3JdPXRbcl19ZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIHIodCxlLG4pfXIuZnJvbSYmci5hbGxvYyYmci5hbGxvY1Vuc2FmZSYmci5hbGxvY1Vuc2FmZVNsb3c/dC5leHBvcnRzPVl0OihuKFl0LGUpLGUuQnVmZmVyPWkpLG4ocixpKSxpLmZyb209ZnVuY3Rpb24odCxlLG4pe2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlciIpO3JldHVybiByKHQsZSxuKX0saS5hbGxvYz1mdW5jdGlvbih0LGUsbil7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTt2YXIgaT1yKHQpO3JldHVybiB2b2lkIDAhPT1lPyJzdHJpbmciPT10eXBlb2Ygbj9pLmZpbGwoZSxuKTppLmZpbGwoZSk6aS5maWxsKDApLGl9LGkuYWxsb2NVbnNhZmU9ZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gcih0KX0saS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gWXQuU2xvd0J1ZmZlcih0KX19KSk7ZnVuY3Rpb24gSHQodCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX12YXIgSnQ9e2lzQXJyYXk6ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXk/QXJyYXkuaXNBcnJheSh0KToiW29iamVjdCBBcnJheV0iPT09SHQodCl9LGlzQm9vbGVhbjpmdW5jdGlvbih0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fSxpc051bGw6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10fSxpc051bGxPclVuZGVmaW5lZDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dH0saXNOdW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fSxpc1N0cmluZzpmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9LGlzU3ltYm9sOmZ1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdH0saXNVbmRlZmluZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR9LGlzUmVnRXhwOmZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IFJlZ0V4cF0iPT09SHQodCl9LGlzT2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXR9LGlzRGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBEYXRlXSI9PT1IdCh0KX0saXNFcnJvcjpmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBFcnJvcl0iPT09SHQodCl8fHQgaW5zdGFuY2VvZiBFcnJvcn0saXNGdW5jdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH0saXNQcmltaXRpdmU6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10fHwiYm9vbGVhbiI9PXR5cGVvZiB0fHwibnVtYmVyIj09dHlwZW9mIHR8fCJzdHJpbmciPT10eXBlb2YgdHx8InN5bWJvbCI9PXR5cGVvZiB0fHx2b2lkIDA9PT10fSxpc0J1ZmZlcjphdC5pc0J1ZmZlcn0sR3Q9TygoZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7ZSYmKHQuc3VwZXJfPWUsdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSkpfTp0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihlKXt0LnN1cGVyXz1lO3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fX19KSksVnQ9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTpmdW5jdGlvbih0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9LEt0PS8lW3NkaiVdL2c7ZnVuY3Rpb24gWnQodCl7aWYoIWRlKHQpKXtmb3IodmFyIGU9W10scj0wO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspZS5wdXNoKHJlKGFyZ3VtZW50c1tyXSkpO3JldHVybiBlLmpvaW4oIiAiKX1yPTE7Zm9yKHZhciBuPWFyZ3VtZW50cyxpPW4ubGVuZ3RoLG89U3RyaW5nKHQpLnJlcGxhY2UoS3QsKGZ1bmN0aW9uKHQpe2lmKCIlJSI9PT10KXJldHVybiIlIjtpZihyPj1pKXJldHVybiB0O3N3aXRjaCh0KXtjYXNlIiVzIjpyZXR1cm4gU3RyaW5nKG5bcisrXSk7Y2FzZSIlZCI6cmV0dXJuIE51bWJlcihuW3IrK10pO2Nhc2UiJWoiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobltyKytdKX1jYXRjaCh0KXtyZXR1cm4iW0NpcmN1bGFyXSJ9ZGVmYXVsdDpyZXR1cm4gdH19KSksYT1uW3JdO3I8aTthPW5bKytyXSloZShhKXx8IWJlKGEpP28rPSIgIithOm8rPSIgIityZShhKTtyZXR1cm4gb31mdW5jdGlvbiBYdChlLHIpe2lmKGdlKHQucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFh0KGUscikuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZighMD09PVIubm9EZXByZWNhdGlvbilyZXR1cm4gZTt2YXIgbj0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighbil7aWYoUi50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihyKTtSLnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShyKTpjb25zb2xlLmVycm9yKHIpLG49ITB9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX12YXIgUXQsdGU9e307ZnVuY3Rpb24gZWUodCl7aWYoZ2UoUXQpJiYoUXQ9Ui5lbnYuTk9ERV9ERUJVR3x8IiIpLHQ9dC50b1VwcGVyQ2FzZSgpLCF0ZVt0XSlpZihuZXcgUmVnRXhwKCJcXGIiK3QrIlxcYiIsImkiKS50ZXN0KFF0KSl7dGVbdF09ZnVuY3Rpb24oKXt2YXIgZT1adC5hcHBseShudWxsLGFyZ3VtZW50cyk7Y29uc29sZS5lcnJvcigiJXMgJWQ6ICVzIix0LDAsZSl9fWVsc2UgdGVbdF09ZnVuY3Rpb24oKXt9O3JldHVybiB0ZVt0XX1mdW5jdGlvbiByZSh0LGUpe3ZhciByPXtzZWVuOltdLHN0eWxpemU6aWV9O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPj0zJiYoci5kZXB0aD1hcmd1bWVudHNbMl0pLGFyZ3VtZW50cy5sZW5ndGg+PTQmJihyLmNvbG9ycz1hcmd1bWVudHNbM10pLGZlKGUpP3Iuc2hvd0hpZGRlbj1lOmUmJk9lKHIsZSksZ2Uoci5zaG93SGlkZGVuKSYmKHIuc2hvd0hpZGRlbj0hMSksZ2Uoci5kZXB0aCkmJihyLmRlcHRoPTIpLGdlKHIuY29sb3JzKSYmKHIuY29sb3JzPSExKSxnZShyLmN1c3RvbUluc3BlY3QpJiYoci5jdXN0b21JbnNwZWN0PSEwKSxyLmNvbG9ycyYmKHIuc3R5bGl6ZT1uZSksb2Uocix0LHIuZGVwdGgpfWZ1bmN0aW9uIG5lKHQsZSl7dmFyIHI9cmUuc3R5bGVzW2VdO3JldHVybiByPyIbWyIrcmUuY29sb3JzW3JdWzBdKyJtIit0KyIbWyIrcmUuY29sb3JzW3JdWzFdKyJtIjp0fWZ1bmN0aW9uIGllKHQsZSl7cmV0dXJuIHR9ZnVuY3Rpb24gb2UodCxlLHIpe2lmKHQuY3VzdG9tSW5zcGVjdCYmZSYmbWUoZS5pbnNwZWN0KSYmZS5pbnNwZWN0IT09cmUmJighZS5jb25zdHJ1Y3Rvcnx8ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUhPT1lKSl7dmFyIG49ZS5pbnNwZWN0KHIsdCk7cmV0dXJuIGRlKG4pfHwobj1vZSh0LG4scikpLG59dmFyIGk9ZnVuY3Rpb24odCxlKXtpZihnZShlKSlyZXR1cm4gdC5zdHlsaXplKCJ1bmRlZmluZWQiLCJ1bmRlZmluZWQiKTtpZihkZShlKSl7dmFyIHI9IiciK0pTT04uc3RyaW5naWZ5KGUpLnJlcGxhY2UoL14ifCIkL2csIiIpLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKSsiJyI7cmV0dXJuIHQuc3R5bGl6ZShyLCJzdHJpbmciKX1pZihjZShlKSlyZXR1cm4gdC5zdHlsaXplKCIiK2UsIm51bWJlciIpO2lmKGZlKGUpKXJldHVybiB0LnN0eWxpemUoIiIrZSwiYm9vbGVhbiIpO2lmKGhlKGUpKXJldHVybiB0LnN0eWxpemUoIm51bGwiLCJudWxsIil9KHQsZSk7aWYoaSlyZXR1cm4gaTt2YXIgbz1PYmplY3Qua2V5cyhlKSxhPWZ1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQscil7ZVt0XT0hMH0pKSxlfShvKTtpZih0LnNob3dIaWRkZW4mJihvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpKSx3ZShlKSYmKG8uaW5kZXhPZigibWVzc2FnZSIpPj0wfHxvLmluZGV4T2YoImRlc2NyaXB0aW9uIik+PTApKXJldHVybiBhZShlKTtpZigwPT09by5sZW5ndGgpe2lmKG1lKGUpKXt2YXIgcz1lLm5hbWU/IjogIitlLm5hbWU6IiI7cmV0dXJuIHQuc3R5bGl6ZSgiW0Z1bmN0aW9uIitzKyJdIiwic3BlY2lhbCIpfWlmKHllKGUpKXJldHVybiB0LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJyZWdleHAiKTtpZih2ZShlKSlyZXR1cm4gdC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksImRhdGUiKTtpZih3ZShlKSlyZXR1cm4gYWUoZSl9dmFyIHUsZj0iIixoPSExLGw9WyJ7IiwifSJdOyh1ZShlKSYmKGg9ITAsbD1bIlsiLCJdIl0pLG1lKGUpKSYmKGY9IiBbRnVuY3Rpb24iKyhlLm5hbWU/IjogIitlLm5hbWU6IiIpKyJdIik7cmV0dXJuIHllKGUpJiYoZj0iICIrUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKSx2ZShlKSYmKGY9IiAiK0RhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwoZSkpLHdlKGUpJiYoZj0iICIrYWUoZSkpLDAhPT1vLmxlbmd0aHx8aCYmMCE9ZS5sZW5ndGg/cjwwP3llKGUpP3Quc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksInJlZ2V4cCIpOnQuc3R5bGl6ZSgiW09iamVjdF0iLCJzcGVjaWFsIik6KHQuc2Vlbi5wdXNoKGUpLHU9aD9mdW5jdGlvbih0LGUscixuLGkpe2Zvcih2YXIgbz1bXSxhPTAscz1lLmxlbmd0aDthPHM7KythKUFlKGUsU3RyaW5nKGEpKT9vLnB1c2goc2UodCxlLHIsbixTdHJpbmcoYSksITApKTpvLnB1c2goIiIpO3JldHVybiBpLmZvckVhY2goKGZ1bmN0aW9uKGkpe2kubWF0Y2goL15cZCskLyl8fG8ucHVzaChzZSh0LGUscixuLGksITApKX0pKSxvfSh0LGUscixhLG8pOm8ubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gc2UodCxlLHIsYSxuLGgpfSkpLHQuc2Vlbi5wb3AoKSxmdW5jdGlvbih0LGUscil7aWYodC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiXG4iKSx0K2UucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKT42MClyZXR1cm4gclswXSsoIiI9PT1lPyIiOmUrIlxuICIpKyIgIit0LmpvaW4oIixcbiAgIikrIiAiK3JbMV07cmV0dXJuIHJbMF0rZSsiICIrdC5qb2luKCIsICIpKyIgIityWzFdfSh1LGYsbCkpOmxbMF0rZitsWzFdfWZ1bmN0aW9uIGFlKHQpe3JldHVybiJbIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSsiXSJ9ZnVuY3Rpb24gc2UodCxlLHIsbixpLG8pe3ZhciBhLHMsdTtpZigodT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsaSl8fHt2YWx1ZTplW2ldfSkuZ2V0P3M9dS5zZXQ/dC5zdHlsaXplKCJbR2V0dGVyL1NldHRlcl0iLCJzcGVjaWFsIik6dC5zdHlsaXplKCJbR2V0dGVyXSIsInNwZWNpYWwiKTp1LnNldCYmKHM9dC5zdHlsaXplKCJbU2V0dGVyXSIsInNwZWNpYWwiKSksQWUobixpKXx8KGE9IlsiK2krIl0iKSxzfHwodC5zZWVuLmluZGV4T2YodS52YWx1ZSk8MD8ocz1oZShyKT9vZSh0LHUudmFsdWUsbnVsbCk6b2UodCx1LnZhbHVlLHItMSkpLmluZGV4T2YoIlxuIik+LTEmJihzPW8/cy5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIgICIrdH0pKS5qb2luKCJcbiIpLnN1YnN0cigyKToiXG4iK3Muc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iICAgIit0fSkpLmpvaW4oIlxuIikpOnM9dC5zdHlsaXplKCJbQ2lyY3VsYXJdIiwic3BlY2lhbCIpKSxnZShhKSl7aWYobyYmaS5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gczsoYT1KU09OLnN0cmluZ2lmeSgiIitpKSkubWF0Y2goL14iKFthLXpBLVpfXVthLXpBLVpfMC05XSopIiQvKT8oYT1hLnN1YnN0cigxLGEubGVuZ3RoLTIpLGE9dC5zdHlsaXplKGEsIm5hbWUiKSk6KGE9YS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIiksYT10LnN0eWxpemUoYSwic3RyaW5nIikpfXJldHVybiBhKyI6ICIrc31mdW5jdGlvbiB1ZSh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KX1mdW5jdGlvbiBmZSh0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGhlKHQpe3JldHVybiBudWxsPT09dH1mdW5jdGlvbiBsZSh0KXtyZXR1cm4gbnVsbD09dH1mdW5jdGlvbiBjZSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR9ZnVuY3Rpb24gZGUodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fWZ1bmN0aW9uIHBlKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdH1mdW5jdGlvbiBnZSh0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiB5ZSh0KXtyZXR1cm4gYmUodCkmJiJbb2JqZWN0IFJlZ0V4cF0iPT09RWUodCl9ZnVuY3Rpb24gYmUodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiB2ZSh0KXtyZXR1cm4gYmUodCkmJiJbb2JqZWN0IERhdGVdIj09PUVlKHQpfWZ1bmN0aW9uIHdlKHQpe3JldHVybiBiZSh0KSYmKCJbb2JqZWN0IEVycm9yXSI9PT1FZSh0KXx8dCBpbnN0YW5jZW9mIEVycm9yKX1mdW5jdGlvbiBtZSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBfZSh0KXtyZXR1cm4gbnVsbD09PXR8fCJib29sZWFuIj09dHlwZW9mIHR8fCJudW1iZXIiPT10eXBlb2YgdHx8InN0cmluZyI9PXR5cGVvZiB0fHwic3ltYm9sIj09dHlwZW9mIHR8fHZvaWQgMD09PXR9ZnVuY3Rpb24gU2UodCl7cmV0dXJuIGF0LmlzQnVmZmVyKHQpfWZ1bmN0aW9uIEVlKHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24ga2UodCl7cmV0dXJuIHQ8MTA/IjAiK3QudG9TdHJpbmcoMTApOnQudG9TdHJpbmcoMTApfXJlLmNvbG9ycz17Ym9sZDpbMSwyMl0saXRhbGljOlszLDIzXSx1bmRlcmxpbmU6WzQsMjRdLGludmVyc2U6WzcsMjddLHdoaXRlOlszNywzOV0sZ3JleTpbOTAsMzldLGJsYWNrOlszMCwzOV0sYmx1ZTpbMzQsMzldLGN5YW46WzM2LDM5XSxncmVlbjpbMzIsMzldLG1hZ2VudGE6WzM1LDM5XSxyZWQ6WzMxLDM5XSx5ZWxsb3c6WzMzLDM5XX0scmUuc3R5bGVzPXtzcGVjaWFsOiJjeWFuIixudW1iZXI6InllbGxvdyIsYm9vbGVhbjoieWVsbG93Iix1bmRlZmluZWQ6ImdyZXkiLG51bGw6ImJvbGQiLHN0cmluZzoiZ3JlZW4iLGRhdGU6Im1hZ2VudGEiLHJlZ2V4cDoicmVkIn07dmFyIFJlPVsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl07ZnVuY3Rpb24gamUoKXt2YXIgdD1uZXcgRGF0ZSxlPVtrZSh0LmdldEhvdXJzKCkpLGtlKHQuZ2V0TWludXRlcygpKSxrZSh0LmdldFNlY29uZHMoKSldLmpvaW4oIjoiKTtyZXR1cm5bdC5nZXREYXRlKCksUmVbdC5nZXRNb250aCgpXSxlXS5qb2luKCIgIil9ZnVuY3Rpb24gVGUoKXtjb25zb2xlLmxvZygiJXMgLSAlcyIsamUoKSxadC5hcHBseShudWxsLGFyZ3VtZW50cykpfWZ1bmN0aW9uIE9lKHQsZSl7aWYoIWV8fCFiZShlKSlyZXR1cm4gdDtmb3IodmFyIHI9T2JqZWN0LmtleXMoZSksbj1yLmxlbmd0aDtuLS07KXRbcltuXV09ZVtyW25dXTtyZXR1cm4gdH1mdW5jdGlvbiBBZSh0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX12YXIgQ2U9e2luaGVyaXRzOlZ0LF9leHRlbmQ6T2UsbG9nOlRlLGlzQnVmZmVyOlNlLGlzUHJpbWl0aXZlOl9lLGlzRnVuY3Rpb246bWUsaXNFcnJvcjp3ZSxpc0RhdGU6dmUsaXNPYmplY3Q6YmUsaXNSZWdFeHA6eWUsaXNVbmRlZmluZWQ6Z2UsaXNTeW1ib2w6cGUsaXNTdHJpbmc6ZGUsaXNOdW1iZXI6Y2UsaXNOdWxsT3JVbmRlZmluZWQ6bGUsaXNOdWxsOmhlLGlzQm9vbGVhbjpmZSxpc0FycmF5OnVlLGluc3BlY3Q6cmUsZGVwcmVjYXRlOlh0LGZvcm1hdDpadCxkZWJ1Z2xvZzplZX0sTWU9VChPYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxmb3JtYXQ6WnQsZGVwcmVjYXRlOlh0LGRlYnVnbG9nOmVlLGluc3BlY3Q6cmUsaXNBcnJheTp1ZSxpc0Jvb2xlYW46ZmUsaXNOdWxsOmhlLGlzTnVsbE9yVW5kZWZpbmVkOmxlLGlzTnVtYmVyOmNlLGlzU3RyaW5nOmRlLGlzU3ltYm9sOnBlLGlzVW5kZWZpbmVkOmdlLGlzUmVnRXhwOnllLGlzT2JqZWN0OmJlLGlzRGF0ZTp2ZSxpc0Vycm9yOndlLGlzRnVuY3Rpb246bWUsaXNQcmltaXRpdmU6X2UsaXNCdWZmZXI6U2UsbG9nOlRlLGluaGVyaXRzOlZ0LF9leHRlbmQ6T2UsZGVmYXVsdDpDZX0pKSx4ZT1PKChmdW5jdGlvbih0KXt2YXIgZT0kdC5CdWZmZXI7dC5leHBvcnRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLHQpLHRoaXMuaGVhZD1udWxsLHRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9cmV0dXJuIHQucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9ZTp0aGlzLmhlYWQ9ZSx0aGlzLnRhaWw9ZSwrK3RoaXMubGVuZ3RofSx0LnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDp0aGlzLmhlYWR9OzA9PT10aGlzLmxlbmd0aCYmKHRoaXMudGFpbD1lKSx0aGlzLmhlYWQ9ZSwrK3RoaXMubGVuZ3RofSx0LnByb3RvdHlwZS5zaGlmdD1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5oZWFkLmRhdGE7cmV0dXJuIDE9PT10aGlzLmxlbmd0aD90aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw6dGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0LC0tdGhpcy5sZW5ndGgsdH19LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9LHQucHJvdG90eXBlLmpvaW49ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiIiO2Zvcih2YXIgZT10aGlzLmhlYWQscj0iIitlLmRhdGE7ZT1lLm5leHQ7KXIrPXQrZS5kYXRhO3JldHVybiByfSx0LnByb3RvdHlwZS5jb25jYXQ9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiBlLmFsbG9jKDApO2lmKDE9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcy5oZWFkLmRhdGE7Zm9yKHZhciByLG4saSxvPWUuYWxsb2NVbnNhZmUodD4+PjApLGE9dGhpcy5oZWFkLHM9MDthOylyPWEuZGF0YSxuPW8saT1zLHIuY29weShuLGkpLHMrPWEuZGF0YS5sZW5ndGgsYT1hLm5leHQ7cmV0dXJuIG99LHR9KCksTWUmJk1lLmluc3BlY3QmJk1lLmluc3BlY3QuY3VzdG9tJiYodC5leHBvcnRzLnByb3RvdHlwZVtNZS5pbnNwZWN0LmN1c3RvbV09ZnVuY3Rpb24oKXt2YXIgdD1NZS5pbnNwZWN0KHtsZW5ndGg6dGhpcy5sZW5ndGh9KTtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKyIgIit0fSl9KSk7ZnVuY3Rpb24gTGUodCxlKXt0LmVtaXQoImVycm9yIixlKX12YXIgQmU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQsaT10aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtyZXR1cm4gbnx8aT8oZT9lKHQpOiF0fHx0aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZHx8QS5uZXh0VGljayhMZSx0aGlzLHQpLHRoaXMpOih0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fZGVzdHJveSh0fHxudWxsLChmdW5jdGlvbih0KXshZSYmdD8oQS5uZXh0VGljayhMZSxyLHQpLHIuX3dyaXRhYmxlU3RhdGUmJihyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCkpOmUmJmUodCl9KSksdGhpcyl9LFBlPWZ1bmN0aW9uKCl7dGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGluZz0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZD0hMSksdGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmc9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMSl9LFVlPWZ1bmN0aW9uKHQsZSl7aWYoTmUoIm5vRGVwcmVjYXRpb24iKSlyZXR1cm4gdDt2YXIgcj0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighcil7aWYoTmUoInRocm93RGVwcmVjYXRpb24iKSl0aHJvdyBuZXcgRXJyb3IoZSk7TmUoInRyYWNlRGVwcmVjYXRpb24iKT9jb25zb2xlLnRyYWNlKGUpOmNvbnNvbGUud2FybihlKSxyPSEwfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19O2Z1bmN0aW9uIE5lKHQpe3RyeXtpZighai5sb2NhbFN0b3JhZ2UpcmV0dXJuITF9Y2F0Y2godCl7cmV0dXJuITF9dmFyIGU9ai5sb2NhbFN0b3JhZ2VbdF07cmV0dXJuIG51bGwhPWUmJiJ0cnVlIj09PVN0cmluZyhlKS50b0xvd2VyQ2FzZSgpfXZhciBEZT1WZTtmdW5jdGlvbiBJZSh0KXt2YXIgZT10aGlzO3RoaXMubmV4dD1udWxsLHRoaXMuZW50cnk9bnVsbCx0aGlzLmZpbmlzaD1mdW5jdGlvbigpeyFmdW5jdGlvbih0LGUscil7dmFyIG49dC5lbnRyeTt0LmVudHJ5PW51bGw7Zm9yKDtuOyl7dmFyIGk9bi5jYWxsYmFjaztlLnBlbmRpbmdjYi0tLGkociksbj1uLm5leHR9ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU/ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD10OmUuY29ya2VkUmVxdWVzdHNGcmVlPXR9KGUsdCl9fXZhciBxZSxGZT0hUi5icm93c2VyJiZbInYwLjEwIiwidjAuOS4iXS5pbmRleE9mKFIudmVyc2lvbi5zbGljZSgwLDUpKT4tMT9zZXRJbW1lZGlhdGU6QS5uZXh0VGljaztWZS5Xcml0YWJsZVN0YXRlPUdlO3ZhciBXZT1PYmplY3QuY3JlYXRlKEp0KTtXZS5pbmhlcml0cz1HdDt2YXIgemUsWWU9e2RlcHJlY2F0ZTpVZX0sJGU9JHQuQnVmZmVyLEhlPWouVWludDhBcnJheXx8ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIEplKCl7fWZ1bmN0aW9uIEdlKHQsZSl7dD10fHx7fTt2YXIgcj1lIGluc3RhbmNlb2YocWU9cWV8fG5yKTt0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsciYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC53cml0YWJsZU9iamVjdE1vZGUpO3ZhciBuPXQuaGlnaFdhdGVyTWFyayxpPXQud3JpdGFibGVIaWdoV2F0ZXJNYXJrLG89dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1ufHwwPT09bj9uOnImJihpfHwwPT09aSk/aTpvLHRoaXMuaGlnaFdhdGVyTWFyaz1NYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayksdGhpcy5maW5hbENhbGxlZD0hMSx0aGlzLm5lZWREcmFpbj0hMSx0aGlzLmVuZGluZz0hMSx0aGlzLmVuZGVkPSExLHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5kZXN0cm95ZWQ9ITE7dmFyIGE9ITE9PT10LmRlY29kZVN0cmluZ3M7dGhpcy5kZWNvZGVTdHJpbmdzPSFhLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5sZW5ndGg9MCx0aGlzLndyaXRpbmc9ITEsdGhpcy5jb3JrZWQ9MCx0aGlzLnN5bmM9ITAsdGhpcy5idWZmZXJQcm9jZXNzaW5nPSExLHRoaXMub253cml0ZT1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49ci5zeW5jLGk9ci53cml0ZWNiO2lmKGZ1bmN0aW9uKHQpe3Qud3JpdGluZz0hMSx0LndyaXRlY2I9bnVsbCx0Lmxlbmd0aC09dC53cml0ZWxlbix0LndyaXRlbGVuPTB9KHIpLGUpIWZ1bmN0aW9uKHQsZSxyLG4saSl7LS1lLnBlbmRpbmdjYixyPyhBLm5leHRUaWNrKGksbiksQS5uZXh0VGljayhlcix0LGUpLHQuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHQuZW1pdCgiZXJyb3IiLG4pKTooaShuKSx0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0LmVtaXQoImVycm9yIixuKSxlcih0LGUpKX0odCxyLG4sZSxpKTtlbHNle3ZhciBvPVFlKHIpO298fHIuY29ya2VkfHxyLmJ1ZmZlclByb2Nlc3Npbmd8fCFyLmJ1ZmZlcmVkUmVxdWVzdHx8WGUodCxyKSxuP0ZlKFplLHQscixvLGkpOlplKHQscixvLGkpfX0oZSx0KX0sdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWxlbj0wLHRoaXMuYnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5wZW5kaW5nY2I9MCx0aGlzLnByZWZpbmlzaGVkPSExLHRoaXMuZXJyb3JFbWl0dGVkPSExLHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCx0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgSWUodGhpcyl9ZnVuY3Rpb24gVmUodCl7aWYocWU9cWV8fG5yLCEoemUuY2FsbChWZSx0aGlzKXx8dGhpcyBpbnN0YW5jZW9mIHFlKSlyZXR1cm4gbmV3IFZlKHQpO3RoaXMuX3dyaXRhYmxlU3RhdGU9bmV3IEdlKHQsdGhpcyksdGhpcy53cml0YWJsZT0hMCx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGUmJih0aGlzLl93cml0ZT10LndyaXRlKSwiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZXYmJih0aGlzLl93cml0ZXY9dC53cml0ZXYpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRlc3Ryb3kmJih0aGlzLl9kZXN0cm95PXQuZGVzdHJveSksImZ1bmN0aW9uIj09dHlwZW9mIHQuZmluYWwmJih0aGlzLl9maW5hbD10LmZpbmFsKSksJC5jYWxsKHRoaXMpfWZ1bmN0aW9uIEtlKHQsZSxyLG4saSxvLGEpe2Uud3JpdGVsZW49bixlLndyaXRlY2I9YSxlLndyaXRpbmc9ITAsZS5zeW5jPSEwLHI/dC5fd3JpdGV2KGksZS5vbndyaXRlKTp0Ll93cml0ZShpLG8sZS5vbndyaXRlKSxlLnN5bmM9ITF9ZnVuY3Rpb24gWmUodCxlLHIsbil7cnx8ZnVuY3Rpb24odCxlKXswPT09ZS5sZW5ndGgmJmUubmVlZERyYWluJiYoZS5uZWVkRHJhaW49ITEsdC5lbWl0KCJkcmFpbiIpKX0odCxlKSxlLnBlbmRpbmdjYi0tLG4oKSxlcih0LGUpfWZ1bmN0aW9uIFhlKHQsZSl7ZS5idWZmZXJQcm9jZXNzaW5nPSEwO3ZhciByPWUuYnVmZmVyZWRSZXF1ZXN0O2lmKHQuX3dyaXRldiYmciYmci5uZXh0KXt2YXIgbj1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50LGk9bmV3IEFycmF5KG4pLG89ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7by5lbnRyeT1yO2Zvcih2YXIgYT0wLHM9ITA7cjspaVthXT1yLHIuaXNCdWZ8fChzPSExKSxyPXIubmV4dCxhKz0xO2kuYWxsQnVmZmVycz1zLEtlKHQsZSwhMCxlLmxlbmd0aCxpLCIiLG8uZmluaXNoKSxlLnBlbmRpbmdjYisrLGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLG8ubmV4dD8oZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9by5uZXh0LG8ubmV4dD1udWxsKTplLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgSWUoZSksZS5idWZmZXJlZFJlcXVlc3RDb3VudD0wfWVsc2V7Zm9yKDtyOyl7dmFyIHU9ci5jaHVuayxmPXIuZW5jb2RpbmcsaD1yLmNhbGxiYWNrO2lmKEtlKHQsZSwhMSxlLm9iamVjdE1vZGU/MTp1Lmxlbmd0aCx1LGYsaCkscj1yLm5leHQsZS5idWZmZXJlZFJlcXVlc3RDb3VudC0tLGUud3JpdGluZylicmVha31udWxsPT09ciYmKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX1lLmJ1ZmZlcmVkUmVxdWVzdD1yLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiBRZSh0KXtyZXR1cm4gdC5lbmRpbmcmJjA9PT10Lmxlbmd0aCYmbnVsbD09PXQuYnVmZmVyZWRSZXF1ZXN0JiYhdC5maW5pc2hlZCYmIXQud3JpdGluZ31mdW5jdGlvbiB0cih0LGUpe3QuX2ZpbmFsKChmdW5jdGlvbihyKXtlLnBlbmRpbmdjYi0tLHImJnQuZW1pdCgiZXJyb3IiLHIpLGUucHJlZmluaXNoZWQ9ITAsdC5lbWl0KCJwcmVmaW5pc2giKSxlcih0LGUpfSkpfWZ1bmN0aW9uIGVyKHQsZSl7dmFyIHI9UWUoZSk7cmV0dXJuIHImJighZnVuY3Rpb24odCxlKXtlLnByZWZpbmlzaGVkfHxlLmZpbmFsQ2FsbGVkfHwoImZ1bmN0aW9uIj09dHlwZW9mIHQuX2ZpbmFsPyhlLnBlbmRpbmdjYisrLGUuZmluYWxDYWxsZWQ9ITAsQS5uZXh0VGljayh0cix0LGUpKTooZS5wcmVmaW5pc2hlZD0hMCx0LmVtaXQoInByZWZpbmlzaCIpKSl9KHQsZSksMD09PWUucGVuZGluZ2NiJiYoZS5maW5pc2hlZD0hMCx0LmVtaXQoImZpbmlzaCIpKSkscn1XZS5pbmhlcml0cyhWZSwkKSxHZS5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuYnVmZmVyZWRSZXF1ZXN0LGU9W107dDspZS5wdXNoKHQpLHQ9dC5uZXh0O3JldHVybiBlfSxmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoR2UucHJvdG90eXBlLCJidWZmZXIiLHtnZXQ6WWUuZGVwcmVjYXRlKChmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSksIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuIiwiREVQMDAwMyIpfSl9Y2F0Y2godCl7fX0oKSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaGFzSW5zdGFuY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXT8oemU9RnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0sT2JqZWN0LmRlZmluZVByb3BlcnR5KFZlLFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuISF6ZS5jYWxsKHRoaXMsdCl8fHRoaXM9PT1WZSYmKHQmJnQuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBHZSl9fSkpOnplPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdGhpc30sVmUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oKXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIkNhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUiKSl9LFZlLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZSxpPSExLG89IW4ub2JqZWN0TW9kZSYmZnVuY3Rpb24odCl7cmV0dXJuICRlLmlzQnVmZmVyKHQpfHx0IGluc3RhbmNlb2YgSGV9KHQpO3JldHVybiBvJiYhJGUuaXNCdWZmZXIodCkmJih0PWZ1bmN0aW9uKHQpe3JldHVybiAkZS5mcm9tKHQpfSh0KSksImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxvP2U9ImJ1ZmZlciI6ZXx8KGU9bi5kZWZhdWx0RW5jb2RpbmcpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiYocj1KZSksbi5lbmRlZD9mdW5jdGlvbih0LGUpe3ZhciByPW5ldyBFcnJvcigid3JpdGUgYWZ0ZXIgZW5kIik7dC5lbWl0KCJlcnJvciIsciksQS5uZXh0VGljayhlLHIpfSh0aGlzLHIpOihvfHxmdW5jdGlvbih0LGUscixuKXt2YXIgaT0hMCxvPSExO3JldHVybiBudWxsPT09cj9vPW5ldyBUeXBlRXJyb3IoIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtIik6InN0cmluZyI9PXR5cGVvZiByfHx2b2lkIDA9PT1yfHxlLm9iamVjdE1vZGV8fChvPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSksbyYmKHQuZW1pdCgiZXJyb3IiLG8pLEEubmV4dFRpY2sobixvKSxpPSExKSxpfSh0aGlzLG4sdCxyKSkmJihuLnBlbmRpbmdjYisrLGk9ZnVuY3Rpb24odCxlLHIsbixpLG8pe2lmKCFyKXt2YXIgYT1mdW5jdGlvbih0LGUscil7dC5vYmplY3RNb2RlfHwhMT09PXQuZGVjb2RlU3RyaW5nc3x8InN0cmluZyIhPXR5cGVvZiBlfHwoZT0kZS5mcm9tKGUscikpO3JldHVybiBlfShlLG4saSk7biE9PWEmJihyPSEwLGk9ImJ1ZmZlciIsbj1hKX12YXIgcz1lLm9iamVjdE1vZGU/MTpuLmxlbmd0aDtlLmxlbmd0aCs9czt2YXIgdT1lLmxlbmd0aDxlLmhpZ2hXYXRlck1hcms7dXx8KGUubmVlZERyYWluPSEwKTtpZihlLndyaXRpbmd8fGUuY29ya2VkKXt2YXIgZj1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q7ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PXtjaHVuazpuLGVuY29kaW5nOmksaXNCdWY6cixjYWxsYmFjazpvLG5leHQ6bnVsbH0sZj9mLm5leHQ9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0OmUuYnVmZmVyZWRSZXF1ZXN0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdCxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50Kz0xfWVsc2UgS2UodCxlLCExLHMsbixpLG8pO3JldHVybiB1fSh0aGlzLG4sbyx0LGUscikpLGl9LFZlLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30sVmUucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3dyaXRhYmxlU3RhdGU7dC5jb3JrZWQmJih0LmNvcmtlZC0tLHQud3JpdGluZ3x8dC5jb3JrZWR8fHQuZmluaXNoZWR8fHQuYnVmZmVyUHJvY2Vzc2luZ3x8IXQuYnVmZmVyZWRSZXF1ZXN0fHxYZSh0aGlzLHQpKX0sVmUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudG9Mb3dlckNhc2UoKSksIShbImhleCIsInV0ZjgiLCJ1dGYtOCIsImFzY2lpIiwiYmluYXJ5IiwiYmFzZTY0IiwidWNzMiIsInVjcy0yIiwidXRmMTZsZSIsInV0Zi0xNmxlIiwicmF3Il0uaW5kZXhPZigodCsiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPXQsdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KFZlLnByb3RvdHlwZSwid3JpdGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLFZlLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3IobmV3IEVycm9yKCJfd3JpdGUoKSBpcyBub3QgaW1wbGVtZW50ZWQiKSl9LFZlLnByb3RvdHlwZS5fd3JpdGV2PW51bGwsVmUucHJvdG90eXBlLmVuZD1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZTsiZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10LHQ9bnVsbCxlPW51bGwpOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksbnVsbCE9dCYmdGhpcy53cml0ZSh0LGUpLG4uY29ya2VkJiYobi5jb3JrZWQ9MSx0aGlzLnVuY29yaygpKSxuLmVuZGluZ3x8bi5maW5pc2hlZHx8ZnVuY3Rpb24odCxlLHIpe2UuZW5kaW5nPSEwLGVyKHQsZSksciYmKGUuZmluaXNoZWQ/QS5uZXh0VGljayhyKTp0Lm9uY2UoImZpbmlzaCIscikpO2UuZW5kZWQ9ITAsdC53cml0YWJsZT0hMX0odGhpcyxuLHIpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVmUucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9dCl9fSksVmUucHJvdG90eXBlLmRlc3Ryb3k9QmUsVmUucHJvdG90eXBlLl91bmRlc3Ryb3k9UGUsVmUucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHQsZSl7dGhpcy5lbmQoKSxlKHQpfTt2YXIgcnI9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KWUucHVzaChyKTtyZXR1cm4gZX0sbnI9dXIsaXI9T2JqZWN0LmNyZWF0ZShKdCk7aXIuaW5oZXJpdHM9R3QsaXIuaW5oZXJpdHModXIsUnIpO2Zvcih2YXIgb3I9cnIoRGUucHJvdG90eXBlKSxhcj0wO2FyPG9yLmxlbmd0aDthcisrKXt2YXIgc3I9b3JbYXJdO3VyLnByb3RvdHlwZVtzcl18fCh1ci5wcm90b3R5cGVbc3JdPURlLnByb3RvdHlwZVtzcl0pfWZ1bmN0aW9uIHVyKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHVyKSlyZXR1cm4gbmV3IHVyKHQpO1JyLmNhbGwodGhpcyx0KSxEZS5jYWxsKHRoaXMsdCksdCYmITE9PT10LnJlYWRhYmxlJiYodGhpcy5yZWFkYWJsZT0hMSksdCYmITE9PT10LndyaXRhYmxlJiYodGhpcy53cml0YWJsZT0hMSksdGhpcy5hbGxvd0hhbGZPcGVuPSEwLHQmJiExPT09dC5hbGxvd0hhbGZPcGVuJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExKSx0aGlzLm9uY2UoImVuZCIsZnIpfWZ1bmN0aW9uIGZyKCl7dGhpcy5hbGxvd0hhbGZPcGVufHx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHxBLm5leHRUaWNrKGhyLHRoaXMpfWZ1bmN0aW9uIGhyKHQpe3QuZW5kKCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHVyLnByb3RvdHlwZSwid3JpdGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1ci5wcm90b3R5cGUsImRlc3Ryb3llZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLl9yZWFkYWJsZVN0YXRlJiZ2b2lkIDAhPT10aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkKX0sc2V0OmZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXRoaXMuX3JlYWRhYmxlU3RhdGUmJnZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD10LHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPXQpfX0pLHVyLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbih0LGUpe3RoaXMucHVzaChudWxsKSx0aGlzLmVuZCgpLEEubmV4dFRpY2soZSx0KX07dmFyIGxyPSR0LkJ1ZmZlcixjcj1sci5pc0VuY29kaW5nfHxmdW5jdGlvbih0KXtzd2l0Y2goKHQ9IiIrdCkmJnQudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6Y2FzZSJyYXciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTt2YXIgZHI9cHI7ZnVuY3Rpb24gcHIodCl7dmFyIGU7c3dpdGNoKHRoaXMuZW5jb2Rpbmc9ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuInV0ZjgiO2Zvcih2YXIgZTs7KXN3aXRjaCh0KXtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiJ1dGY4IjtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuInV0ZjE2bGUiO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuImxhdGluMSI7Y2FzZSJiYXNlNjQiOmNhc2UiYXNjaWkiOmNhc2UiaGV4IjpyZXR1cm4gdDtkZWZhdWx0OmlmKGUpcmV0dXJuO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCksZT0hMH19KHQpO2lmKCJzdHJpbmciIT10eXBlb2YgZSYmKGxyLmlzRW5jb2Rpbmc9PT1jcnx8IWNyKHQpKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIGV8fHR9KHQpLHRoaXMuZW5jb2Rpbmcpe2Nhc2UidXRmMTZsZSI6dGhpcy50ZXh0PWJyLHRoaXMuZW5kPXZyLGU9NDticmVhaztjYXNlInV0ZjgiOnRoaXMuZmlsbExhc3Q9eXIsZT00O2JyZWFrO2Nhc2UiYmFzZTY0Ijp0aGlzLnRleHQ9d3IsdGhpcy5lbmQ9bXIsZT0zO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHRoaXMud3JpdGU9X3Isdm9pZCh0aGlzLmVuZD1Tcil9dGhpcy5sYXN0TmVlZD0wLHRoaXMubGFzdFRvdGFsPTAsdGhpcy5sYXN0Q2hhcj1sci5hbGxvY1Vuc2FmZShlKX1mdW5jdGlvbiBncih0KXtyZXR1cm4gdDw9MTI3PzA6dD4+NT09Nj8yOnQ+PjQ9PTE0PzM6dD4+Mz09MzA/NDp0Pj42PT0yPy0xOi0yfWZ1bmN0aW9uIHlyKHQpe3ZhciBlPXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQscj1mdW5jdGlvbih0LGUscil7aWYoMTI4IT0oMTkyJmVbMF0pKXJldHVybiB0Lmxhc3ROZWVkPTAsIu+/vSI7aWYodC5sYXN0TmVlZD4xJiZlLmxlbmd0aD4xKXtpZigxMjghPSgxOTImZVsxXSkpcmV0dXJuIHQubGFzdE5lZWQ9MSwi77+9IjtpZih0Lmxhc3ROZWVkPjImJmUubGVuZ3RoPjImJjEyOCE9KDE5MiZlWzJdKSlyZXR1cm4gdC5sYXN0TmVlZD0yLCLvv70ifX0odGhpcyx0KTtyZXR1cm4gdm9pZCAwIT09cj9yOnRoaXMubGFzdE5lZWQ8PXQubGVuZ3RoPyh0LmNvcHkodGhpcy5sYXN0Q2hhcixlLDAsdGhpcy5sYXN0TmVlZCksdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsdGhpcy5sYXN0VG90YWwpKToodC5jb3B5KHRoaXMubGFzdENoYXIsZSwwLHQubGVuZ3RoKSx2b2lkKHRoaXMubGFzdE5lZWQtPXQubGVuZ3RoKSl9ZnVuY3Rpb24gYnIodCxlKXtpZigodC5sZW5ndGgtZSklMj09MCl7dmFyIHI9dC50b1N0cmluZygidXRmMTZsZSIsZSk7aWYocil7dmFyIG49ci5jaGFyQ29kZUF0KHIubGVuZ3RoLTEpO2lmKG4+PTU1Mjk2JiZuPD01NjMxOSlyZXR1cm4gdGhpcy5sYXN0TmVlZD0yLHRoaXMubGFzdFRvdGFsPTQsdGhpcy5sYXN0Q2hhclswXT10W3QubGVuZ3RoLTJdLHRoaXMubGFzdENoYXJbMV09dFt0Lmxlbmd0aC0xXSxyLnNsaWNlKDAsLTEpfXJldHVybiByfXJldHVybiB0aGlzLmxhc3ROZWVkPTEsdGhpcy5sYXN0VG90YWw9Mix0aGlzLmxhc3RDaGFyWzBdPXRbdC5sZW5ndGgtMV0sdC50b1N0cmluZygidXRmMTZsZSIsZSx0Lmxlbmd0aC0xKX1mdW5jdGlvbiB2cih0KXt2YXIgZT10JiZ0Lmxlbmd0aD90aGlzLndyaXRlKHQpOiIiO2lmKHRoaXMubGFzdE5lZWQpe3ZhciByPXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQ7cmV0dXJuIGUrdGhpcy5sYXN0Q2hhci50b1N0cmluZygidXRmMTZsZSIsMCxyKX1yZXR1cm4gZX1mdW5jdGlvbiB3cih0LGUpe3ZhciByPSh0Lmxlbmd0aC1lKSUzO3JldHVybiAwPT09cj90LnRvU3RyaW5nKCJiYXNlNjQiLGUpOih0aGlzLmxhc3ROZWVkPTMtcix0aGlzLmxhc3RUb3RhbD0zLDE9PT1yP3RoaXMubGFzdENoYXJbMF09dFt0Lmxlbmd0aC0xXToodGhpcy5sYXN0Q2hhclswXT10W3QubGVuZ3RoLTJdLHRoaXMubGFzdENoYXJbMV09dFt0Lmxlbmd0aC0xXSksdC50b1N0cmluZygiYmFzZTY0IixlLHQubGVuZ3RoLXIpKX1mdW5jdGlvbiBtcih0KXt2YXIgZT10JiZ0Lmxlbmd0aD90aGlzLndyaXRlKHQpOiIiO3JldHVybiB0aGlzLmxhc3ROZWVkP2UrdGhpcy5sYXN0Q2hhci50b1N0cmluZygiYmFzZTY0IiwwLDMtdGhpcy5sYXN0TmVlZCk6ZX1mdW5jdGlvbiBfcih0KXtyZXR1cm4gdC50b1N0cmluZyh0aGlzLmVuY29kaW5nKX1mdW5jdGlvbiBTcih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIn1wci5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7aWYoMD09PXQubGVuZ3RoKXJldHVybiIiO3ZhciBlLHI7aWYodGhpcy5sYXN0TmVlZCl7aWYodm9pZCAwPT09KGU9dGhpcy5maWxsTGFzdCh0KSkpcmV0dXJuIiI7cj10aGlzLmxhc3ROZWVkLHRoaXMubGFzdE5lZWQ9MH1lbHNlIHI9MDtyZXR1cm4gcjx0Lmxlbmd0aD9lP2UrdGhpcy50ZXh0KHQscik6dGhpcy50ZXh0KHQscik6ZXx8IiJ9LHByLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIjtyZXR1cm4gdGhpcy5sYXN0TmVlZD9lKyLvv70iOmV9LHByLnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWUubGVuZ3RoLTE7aWYobjxyKXJldHVybiAwO3ZhciBpPWdyKGVbbl0pO2lmKGk+PTApcmV0dXJuIGk+MCYmKHQubGFzdE5lZWQ9aS0xKSxpO2lmKC0tbjxyfHwtMj09PWkpcmV0dXJuIDA7aWYoKGk9Z3IoZVtuXSkpPj0wKXJldHVybiBpPjAmJih0Lmxhc3ROZWVkPWktMiksaTtpZigtLW48cnx8LTI9PT1pKXJldHVybiAwO2lmKChpPWdyKGVbbl0pKT49MClyZXR1cm4gaT4wJiYoMj09PWk/aT0wOnQubGFzdE5lZWQ9aS0zKSxpO3JldHVybiAwfSh0aGlzLHQsZSk7aWYoIXRoaXMubGFzdE5lZWQpcmV0dXJuIHQudG9TdHJpbmcoInV0ZjgiLGUpO3RoaXMubGFzdFRvdGFsPXI7dmFyIG49dC5sZW5ndGgtKHItdGhpcy5sYXN0TmVlZCk7cmV0dXJuIHQuY29weSh0aGlzLmxhc3RDaGFyLDAsbiksdC50b1N0cmluZygidXRmOCIsZSxuKX0scHIucHJvdG90eXBlLmZpbGxMYXN0PWZ1bmN0aW9uKHQpe2lmKHRoaXMubGFzdE5lZWQ8PXQubGVuZ3RoKXJldHVybiB0LmNvcHkodGhpcy5sYXN0Q2hhcix0aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLDAsdGhpcy5sYXN0TmVlZCksdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsdGhpcy5sYXN0VG90YWwpO3QuY29weSh0aGlzLmxhc3RDaGFyLHRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsMCx0Lmxlbmd0aCksdGhpcy5sYXN0TmVlZC09dC5sZW5ndGh9O3ZhciBFcixrcj17U3RyaW5nRGVjb2Rlcjpkcn0sUnI9QnI7QnIuUmVhZGFibGVTdGF0ZT1McixZLkV2ZW50RW1pdHRlcjt2YXIganI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5saXN0ZW5lcnMoZSkubGVuZ3RofSxUcj0kdC5CdWZmZXIsT3I9ai5VaW50OEFycmF5fHxmdW5jdGlvbigpe307dmFyIEFyPU9iamVjdC5jcmVhdGUoSnQpO0FyLmluaGVyaXRzPUd0O3ZhciBDcixNcj12b2lkIDA7TXI9TWUmJk1lLmRlYnVnbG9nP01lLmRlYnVnbG9nKCJzdHJlYW0iKTpmdW5jdGlvbigpe30sQXIuaW5oZXJpdHMoQnIsJCk7dmFyIHhyPVsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdO2Z1bmN0aW9uIExyKHQsZSl7dD10fHx7fTt2YXIgcj1lIGluc3RhbmNlb2YoRXI9RXJ8fG5yKTt0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsciYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC5yZWFkYWJsZU9iamVjdE1vZGUpO3ZhciBuPXQuaGlnaFdhdGVyTWFyayxpPXQucmVhZGFibGVIaWdoV2F0ZXJNYXJrLG89dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1ufHwwPT09bj9uOnImJihpfHwwPT09aSk/aTpvLHRoaXMuaGlnaFdhdGVyTWFyaz1NYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayksdGhpcy5idWZmZXI9bmV3IHhlLHRoaXMubGVuZ3RoPTAsdGhpcy5waXBlcz1udWxsLHRoaXMucGlwZXNDb3VudD0wLHRoaXMuZmxvd2luZz1udWxsLHRoaXMuZW5kZWQ9ITEsdGhpcy5lbmRFbWl0dGVkPSExLHRoaXMucmVhZGluZz0hMSx0aGlzLnN5bmM9ITAsdGhpcy5uZWVkUmVhZGFibGU9ITEsdGhpcy5lbWl0dGVkUmVhZGFibGU9ITEsdGhpcy5yZWFkYWJsZUxpc3RlbmluZz0hMSx0aGlzLnJlc3VtZVNjaGVkdWxlZD0hMSx0aGlzLmRlc3Ryb3llZD0hMSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMuYXdhaXREcmFpbj0wLHRoaXMucmVhZGluZ01vcmU9ITEsdGhpcy5kZWNvZGVyPW51bGwsdGhpcy5lbmNvZGluZz1udWxsLHQuZW5jb2RpbmcmJihDcnx8KENyPWtyLlN0cmluZ0RlY29kZXIpLHRoaXMuZGVjb2Rlcj1uZXcgQ3IodC5lbmNvZGluZyksdGhpcy5lbmNvZGluZz10LmVuY29kaW5nKX1mdW5jdGlvbiBCcih0KXtpZihFcj1Fcnx8bnIsISh0aGlzIGluc3RhbmNlb2YgQnIpKXJldHVybiBuZXcgQnIodCk7dGhpcy5fcmVhZGFibGVTdGF0ZT1uZXcgTHIodCx0aGlzKSx0aGlzLnJlYWRhYmxlPSEwLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYodGhpcy5fcmVhZD10LnJlYWQpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRlc3Ryb3kmJih0aGlzLl9kZXN0cm95PXQuZGVzdHJveSkpLCQuY2FsbCh0aGlzKX1mdW5jdGlvbiBQcih0LGUscixuLGkpe3ZhciBvLGE9dC5fcmVhZGFibGVTdGF0ZTtudWxsPT09ZT8oYS5yZWFkaW5nPSExLGZ1bmN0aW9uKHQsZSl7aWYoZS5lbmRlZClyZXR1cm47aWYoZS5kZWNvZGVyKXt2YXIgcj1lLmRlY29kZXIuZW5kKCk7ciYmci5sZW5ndGgmJihlLmJ1ZmZlci5wdXNoKHIpLGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aCl9ZS5lbmRlZD0hMCxEcih0KX0odCxhKSk6KGl8fChvPWZ1bmN0aW9uKHQsZSl7dmFyIHI7KGZ1bmN0aW9uKHQpe3JldHVybiBUci5pc0J1ZmZlcih0KXx8dCBpbnN0YW5jZW9mIE9yfSkoZSl8fCJzdHJpbmciPT10eXBlb2YgZXx8dm9pZCAwPT09ZXx8dC5vYmplY3RNb2RlfHwocj1uZXcgVHlwZUVycm9yKCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rIikpO3JldHVybiByfShhLGUpKSxvP3QuZW1pdCgiZXJyb3IiLG8pOmEub2JqZWN0TW9kZXx8ZSYmZS5sZW5ndGg+MD8oInN0cmluZyI9PXR5cGVvZiBlfHxhLm9iamVjdE1vZGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PVRyLnByb3RvdHlwZXx8KGU9ZnVuY3Rpb24odCl7cmV0dXJuIFRyLmZyb20odCl9KGUpKSxuP2EuZW5kRW1pdHRlZD90LmVtaXQoImVycm9yIixuZXcgRXJyb3IoInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50IikpOlVyKHQsYSxlLCEwKTphLmVuZGVkP3QuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKSk6KGEucmVhZGluZz0hMSxhLmRlY29kZXImJiFyPyhlPWEuZGVjb2Rlci53cml0ZShlKSxhLm9iamVjdE1vZGV8fDAhPT1lLmxlbmd0aD9Vcih0LGEsZSwhMSk6cXIodCxhKSk6VXIodCxhLGUsITEpKSk6bnx8KGEucmVhZGluZz0hMSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hdC5lbmRlZCYmKHQubmVlZFJlYWRhYmxlfHx0Lmxlbmd0aDx0LmhpZ2hXYXRlck1hcmt8fDA9PT10Lmxlbmd0aCl9KGEpfWZ1bmN0aW9uIFVyKHQsZSxyLG4pe2UuZmxvd2luZyYmMD09PWUubGVuZ3RoJiYhZS5zeW5jPyh0LmVtaXQoImRhdGEiLHIpLHQucmVhZCgwKSk6KGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aCxuP2UuYnVmZmVyLnVuc2hpZnQocik6ZS5idWZmZXIucHVzaChyKSxlLm5lZWRSZWFkYWJsZSYmRHIodCkpLHFyKHQsZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEJyLnByb3RvdHlwZSwiZGVzdHJveWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPXQpfX0pLEJyLnByb3RvdHlwZS5kZXN0cm95PUJlLEJyLnByb3RvdHlwZS5fdW5kZXN0cm95PVBlLEJyLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbih0LGUpe3RoaXMucHVzaChudWxsKSxlKHQpfSxCci5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3ZhciByLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gbi5vYmplY3RNb2RlP3I9ITA6InN0cmluZyI9PXR5cGVvZiB0JiYoKGU9ZXx8bi5kZWZhdWx0RW5jb2RpbmcpIT09bi5lbmNvZGluZyYmKHQ9VHIuZnJvbSh0LGUpLGU9IiIpLHI9ITApLFByKHRoaXMsdCxlLCExLHIpfSxCci5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4gUHIodGhpcyx0LG51bGwsITAsITEpfSxCci5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30sQnIucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBDcnx8KENyPWtyLlN0cmluZ0RlY29kZXIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlcj1uZXcgQ3IodCksdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZz10LHRoaXN9O2Z1bmN0aW9uIE5yKHQsZSl7cmV0dXJuIHQ8PTB8fDA9PT1lLmxlbmd0aCYmZS5lbmRlZD8wOmUub2JqZWN0TW9kZT8xOnQhPXQ/ZS5mbG93aW5nJiZlLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoOmUubGVuZ3RoOih0PmUuaGlnaFdhdGVyTWFyayYmKGUuaGlnaFdhdGVyTWFyaz1mdW5jdGlvbih0KXtyZXR1cm4gdD49ODM4ODYwOD90PTgzODg2MDg6KHQtLSx0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCx0fD10Pj4+MTYsdCsrKSx0fSh0KSksdDw9ZS5sZW5ndGg/dDplLmVuZGVkP2UubGVuZ3RoOihlLm5lZWRSZWFkYWJsZT0hMCwwKSl9ZnVuY3Rpb24gRHIodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtlLm5lZWRSZWFkYWJsZT0hMSxlLmVtaXR0ZWRSZWFkYWJsZXx8KE1yKCJlbWl0UmVhZGFibGUiLGUuZmxvd2luZyksZS5lbWl0dGVkUmVhZGFibGU9ITAsZS5zeW5jP0EubmV4dFRpY2soSXIsdCk6SXIodCkpfWZ1bmN0aW9uIElyKHQpe01yKCJlbWl0IHJlYWRhYmxlIiksdC5lbWl0KCJyZWFkYWJsZSIpLFlyKHQpfWZ1bmN0aW9uIHFyKHQsZSl7ZS5yZWFkaW5nTW9yZXx8KGUucmVhZGluZ01vcmU9ITAsQS5uZXh0VGljayhGcix0LGUpKX1mdW5jdGlvbiBGcih0LGUpe2Zvcih2YXIgcj1lLmxlbmd0aDshZS5yZWFkaW5nJiYhZS5mbG93aW5nJiYhZS5lbmRlZCYmZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrJiYoTXIoIm1heWJlUmVhZE1vcmUgcmVhZCAwIiksdC5yZWFkKDApLHIhPT1lLmxlbmd0aCk7KXI9ZS5sZW5ndGg7ZS5yZWFkaW5nTW9yZT0hMX1mdW5jdGlvbiBXcih0KXtNcigicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwIiksdC5yZWFkKDApfWZ1bmN0aW9uIHpyKHQsZSl7ZS5yZWFkaW5nfHwoTXIoInJlc3VtZSByZWFkIDAiKSx0LnJlYWQoMCkpLGUucmVzdW1lU2NoZWR1bGVkPSExLGUuYXdhaXREcmFpbj0wLHQuZW1pdCgicmVzdW1lIiksWXIodCksZS5mbG93aW5nJiYhZS5yZWFkaW5nJiZ0LnJlYWQoMCl9ZnVuY3Rpb24gWXIodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtmb3IoTXIoImZsb3ciLGUuZmxvd2luZyk7ZS5mbG93aW5nJiZudWxsIT09dC5yZWFkKCk7KTt9ZnVuY3Rpb24gJHIodCxlKXtyZXR1cm4gMD09PWUubGVuZ3RoP251bGw6KGUub2JqZWN0TW9kZT9yPWUuYnVmZmVyLnNoaWZ0KCk6IXR8fHQ+PWUubGVuZ3RoPyhyPWUuZGVjb2Rlcj9lLmJ1ZmZlci5qb2luKCIiKToxPT09ZS5idWZmZXIubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YTplLmJ1ZmZlci5jb25jYXQoZS5sZW5ndGgpLGUuYnVmZmVyLmNsZWFyKCkpOnI9ZnVuY3Rpb24odCxlLHIpe3ZhciBuO3Q8ZS5oZWFkLmRhdGEubGVuZ3RoPyhuPWUuaGVhZC5kYXRhLnNsaWNlKDAsdCksZS5oZWFkLmRhdGE9ZS5oZWFkLmRhdGEuc2xpY2UodCkpOm49dD09PWUuaGVhZC5kYXRhLmxlbmd0aD9lLnNoaWZ0KCk6cj9mdW5jdGlvbih0LGUpe3ZhciByPWUuaGVhZCxuPTEsaT1yLmRhdGE7dC09aS5sZW5ndGg7Zm9yKDtyPXIubmV4dDspe3ZhciBvPXIuZGF0YSxhPXQ+by5sZW5ndGg/by5sZW5ndGg6dDtpZihhPT09by5sZW5ndGg/aSs9bzppKz1vLnNsaWNlKDAsdCksMD09PSh0LT1hKSl7YT09PW8ubGVuZ3RoPygrK24sci5uZXh0P2UuaGVhZD1yLm5leHQ6ZS5oZWFkPWUudGFpbD1udWxsKTooZS5oZWFkPXIsci5kYXRhPW8uc2xpY2UoYSkpO2JyZWFrfSsrbn1yZXR1cm4gZS5sZW5ndGgtPW4saX0odCxlKTpmdW5jdGlvbih0LGUpe3ZhciByPVRyLmFsbG9jVW5zYWZlKHQpLG49ZS5oZWFkLGk9MTtuLmRhdGEuY29weShyKSx0LT1uLmRhdGEubGVuZ3RoO2Zvcig7bj1uLm5leHQ7KXt2YXIgbz1uLmRhdGEsYT10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoby5jb3B5KHIsci5sZW5ndGgtdCwwLGEpLDA9PT0odC09YSkpe2E9PT1vLmxlbmd0aD8oKytpLG4ubmV4dD9lLmhlYWQ9bi5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1uLG4uZGF0YT1vLnNsaWNlKGEpKTticmVha30rK2l9cmV0dXJuIGUubGVuZ3RoLT1pLHJ9KHQsZSk7cmV0dXJuIG59KHQsZS5idWZmZXIsZS5kZWNvZGVyKSxyKTt2YXIgcn1mdW5jdGlvbiBIcih0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLEEubmV4dFRpY2soSnIsZSx0KSl9ZnVuY3Rpb24gSnIodCxlKXt0LmVuZEVtaXR0ZWR8fDAhPT10Lmxlbmd0aHx8KHQuZW5kRW1pdHRlZD0hMCxlLnJlYWRhYmxlPSExLGUuZW1pdCgiZW5kIikpfWZ1bmN0aW9uIEdyKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfUJyLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe01yKCJyZWFkIix0KSx0PXBhcnNlSW50KHQsMTApO3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj10O2lmKDAhPT10JiYoZS5lbWl0dGVkUmVhZGFibGU9ITEpLDA9PT10JiZlLm5lZWRSZWFkYWJsZSYmKGUubGVuZ3RoPj1lLmhpZ2hXYXRlck1hcmt8fGUuZW5kZWQpKXJldHVybiBNcigicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/SHIodGhpcyk6RHIodGhpcyksbnVsbDtpZigwPT09KHQ9TnIodCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmSHIodGhpcyksbnVsbDt2YXIgbixpPWUubmVlZFJlYWRhYmxlO3JldHVybiBNcigibmVlZCByZWFkYWJsZSIsaSksKDA9PT1lLmxlbmd0aHx8ZS5sZW5ndGgtdDxlLmhpZ2hXYXRlck1hcmspJiZNcigibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLGk9ITApLGUuZW5kZWR8fGUucmVhZGluZz9NcigicmVhZGluZyBvciBlbmRlZCIsaT0hMSk6aSYmKE1yKCJkbyByZWFkIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCwwPT09ZS5sZW5ndGgmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fCh0PU5yKHIsZSkpKSxudWxsPT09KG49dD4wPyRyKHQsZSk6bnVsbCk/KGUubmVlZFJlYWRhYmxlPSEwLHQ9MCk6ZS5sZW5ndGgtPXQsMD09PWUubGVuZ3RoJiYoZS5lbmRlZHx8KGUubmVlZFJlYWRhYmxlPSEwKSxyIT09dCYmZS5lbmRlZCYmSHIodGhpcykpLG51bGwhPT1uJiZ0aGlzLmVtaXQoImRhdGEiLG4pLG59LEJyLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIl9yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkIikpfSxCci5wcm90b3R5cGUucGlwZT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMsbj10aGlzLl9yZWFkYWJsZVN0YXRlO3N3aXRjaChuLnBpcGVzQ291bnQpe2Nhc2UgMDpuLnBpcGVzPXQ7YnJlYWs7Y2FzZSAxOm4ucGlwZXM9W24ucGlwZXMsdF07YnJlYWs7ZGVmYXVsdDpuLnBpcGVzLnB1c2godCl9bi5waXBlc0NvdW50Kz0xLE1yKCJwaXBlIGNvdW50PSVkIG9wdHM9JWoiLG4ucGlwZXNDb3VudCxlKTt2YXIgaT0oIWV8fCExIT09ZS5lbmQpJiZ0IT09Ui5zdGRvdXQmJnQhPT1SLnN0ZGVycj9hOnA7ZnVuY3Rpb24gbyhlLGkpe01yKCJvbnVucGlwZSIpLGU9PT1yJiZpJiYhMT09PWkuaGFzVW5waXBlZCYmKGkuaGFzVW5waXBlZD0hMCxNcigiY2xlYW51cCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixjKSx0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLGQpLHQucmVtb3ZlTGlzdGVuZXIoImRyYWluIixzKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbCksdC5yZW1vdmVMaXN0ZW5lcigidW5waXBlIixvKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGEpLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIscCksci5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsaCksdT0hMCwhbi5hd2FpdERyYWlufHx0Ll93cml0YWJsZVN0YXRlJiYhdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW58fHMoKSl9ZnVuY3Rpb24gYSgpe01yKCJvbmVuZCIpLHQuZW5kKCl9bi5lbmRFbWl0dGVkP0EubmV4dFRpY2soaSk6ci5vbmNlKCJlbmQiLGkpLHQub24oInVucGlwZSIsbyk7dmFyIHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtNcigicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZqcih0LCJkYXRhIikmJihlLmZsb3dpbmc9ITAsWXIodCkpfX0ocik7dC5vbigiZHJhaW4iLHMpO3ZhciB1PSExO3ZhciBmPSExO2Z1bmN0aW9uIGgoZSl7TXIoIm9uZGF0YSIpLGY9ITEsITEhPT10LndyaXRlKGUpfHxmfHwoKDE9PT1uLnBpcGVzQ291bnQmJm4ucGlwZXM9PT10fHxuLnBpcGVzQ291bnQ+MSYmLTEhPT1HcihuLnBpcGVzLHQpKSYmIXUmJihNcigiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIixyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrLGY9ITApLHIucGF1c2UoKSl9ZnVuY3Rpb24gbChlKXtNcigib25lcnJvciIsZSkscCgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSwwPT09anIodCwiZXJyb3IiKSYmdC5lbWl0KCJlcnJvciIsZSl9ZnVuY3Rpb24gYygpe3QucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZCkscCgpfWZ1bmN0aW9uIGQoKXtNcigib25maW5pc2giKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsYykscCgpfWZ1bmN0aW9uIHAoKXtNcigidW5waXBlIiksci51bnBpcGUodCl9cmV0dXJuIHIub24oImRhdGEiLGgpLGZ1bmN0aW9uKHQsZSxyKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5wcmVwZW5kTGlzdGVuZXIpcmV0dXJuIHQucHJlcGVuZExpc3RlbmVyKGUscik7dC5fZXZlbnRzJiZ0Ll9ldmVudHNbZV0/TSh0Ll9ldmVudHNbZV0pP3QuX2V2ZW50c1tlXS51bnNoaWZ0KHIpOnQuX2V2ZW50c1tlXT1bcix0Ll9ldmVudHNbZV1dOnQub24oZSxyKX0odCwiZXJyb3IiLGwpLHQub25jZSgiY2xvc2UiLGMpLHQub25jZSgiZmluaXNoIixkKSx0LmVtaXQoInBpcGUiLHIpLG4uZmxvd2luZ3x8KE1yKCJwaXBlIHJlc3VtZSIpLHIucmVzdW1lKCkpLHR9LEJyLnByb3RvdHlwZS51bnBpcGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPXtoYXNVbnBpcGVkOiExfTtpZigwPT09ZS5waXBlc0NvdW50KXJldHVybiB0aGlzO2lmKDE9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHQmJnQhPT1lLnBpcGVzfHwodHx8KHQ9ZS5waXBlcyksZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMSx0JiZ0LmVtaXQoInVucGlwZSIsdGhpcyxyKSksdGhpcztpZighdCl7dmFyIG49ZS5waXBlcyxpPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgbz0wO288aTtvKyspbltvXS5lbWl0KCJ1bnBpcGUiLHRoaXMscik7cmV0dXJuIHRoaXN9dmFyIGE9R3IoZS5waXBlcyx0KTtyZXR1cm4tMT09PWF8fChlLnBpcGVzLnNwbGljZShhLDEpLGUucGlwZXNDb3VudC09MSwxPT09ZS5waXBlc0NvdW50JiYoZS5waXBlcz1lLnBpcGVzWzBdKSx0LmVtaXQoInVucGlwZSIsdGhpcyxyKSksdGhpc30sQnIucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHQsZSl7dmFyIHI9JC5wcm90b3R5cGUub24uY2FsbCh0aGlzLHQsZSk7aWYoImRhdGEiPT09dCkhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmdGhpcy5yZXN1bWUoKTtlbHNlIGlmKCJyZWFkYWJsZSI9PT10KXt2YXIgbj10aGlzLl9yZWFkYWJsZVN0YXRlO24uZW5kRW1pdHRlZHx8bi5yZWFkYWJsZUxpc3RlbmluZ3x8KG4ucmVhZGFibGVMaXN0ZW5pbmc9bi5uZWVkUmVhZGFibGU9ITAsbi5lbWl0dGVkUmVhZGFibGU9ITEsbi5yZWFkaW5nP24ubGVuZ3RoJiZEcih0aGlzKTpBLm5leHRUaWNrKFdyLHRoaXMpKX1yZXR1cm4gcn0sQnIucHJvdG90eXBlLmFkZExpc3RlbmVyPUJyLnByb3RvdHlwZS5vbixCci5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gdC5mbG93aW5nfHwoTXIoInJlc3VtZSIpLHQuZmxvd2luZz0hMCxmdW5jdGlvbih0LGUpe2UucmVzdW1lU2NoZWR1bGVkfHwoZS5yZXN1bWVTY2hlZHVsZWQ9ITAsQS5uZXh0VGljayh6cix0LGUpKX0odGhpcyx0KSksdGhpc30sQnIucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuIE1yKCJjYWxsIHBhdXNlIGZsb3dpbmc9JWoiLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyksITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJihNcigicGF1c2UiKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ITEsdGhpcy5lbWl0KCJwYXVzZSIpKSx0aGlzfSxCci5wcm90b3R5cGUud3JhcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLHI9dGhpcy5fcmVhZGFibGVTdGF0ZSxuPSExO2Zvcih2YXIgaSBpbiB0Lm9uKCJlbmQiLChmdW5jdGlvbigpe2lmKE1yKCJ3cmFwcGVkIGVuZCIpLHIuZGVjb2RlciYmIXIuZW5kZWQpe3ZhciB0PXIuZGVjb2Rlci5lbmQoKTt0JiZ0Lmxlbmd0aCYmZS5wdXNoKHQpfWUucHVzaChudWxsKX0pKSx0Lm9uKCJkYXRhIiwoZnVuY3Rpb24oaSl7KE1yKCJ3cmFwcGVkIGRhdGEiKSxyLmRlY29kZXImJihpPXIuZGVjb2Rlci53cml0ZShpKSksci5vYmplY3RNb2RlJiZudWxsPT1pKXx8KHIub2JqZWN0TW9kZXx8aSYmaS5sZW5ndGgpJiYoZS5wdXNoKGkpfHwobj0hMCx0LnBhdXNlKCkpKX0pKSx0KXZvaWQgMD09PXRoaXNbaV0mJiJmdW5jdGlvbiI9PXR5cGVvZiB0W2ldJiYodGhpc1tpXT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdFtlXS5hcHBseSh0LGFyZ3VtZW50cyl9fShpKSk7Zm9yKHZhciBvPTA7bzx4ci5sZW5ndGg7bysrKXQub24oeHJbb10sdGhpcy5lbWl0LmJpbmQodGhpcyx4cltvXSkpO3JldHVybiB0aGlzLl9yZWFkPWZ1bmN0aW9uKGUpe01yKCJ3cmFwcGVkIF9yZWFkIixlKSxuJiYobj0hMSx0LnJlc3VtZSgpKX0sdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KEJyLnByb3RvdHlwZSwicmVhZGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLEJyLl9mcm9tTGlzdD0kcjt2YXIgVnI9WHIsS3I9T2JqZWN0LmNyZWF0ZShKdCk7ZnVuY3Rpb24gWnIodCxlKXt2YXIgcj10aGlzLl90cmFuc2Zvcm1TdGF0ZTtyLnRyYW5zZm9ybWluZz0hMTt2YXIgbj1yLndyaXRlY2I7aWYoIW4pcmV0dXJuIHRoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigid3JpdGUgY2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzIikpO3Iud3JpdGVjaHVuaz1udWxsLHIud3JpdGVjYj1udWxsLG51bGwhPWUmJnRoaXMucHVzaChlKSxuKHQpO3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7aS5yZWFkaW5nPSExLChpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfWZ1bmN0aW9uIFhyKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFhyKSlyZXR1cm4gbmV3IFhyKHQpO25yLmNhbGwodGhpcyx0KSx0aGlzLl90cmFuc2Zvcm1TdGF0ZT17YWZ0ZXJUcmFuc2Zvcm06WnIuYmluZCh0aGlzKSxuZWVkVHJhbnNmb3JtOiExLHRyYW5zZm9ybWluZzohMSx3cml0ZWNiOm51bGwsd3JpdGVjaHVuazpudWxsLHdyaXRlZW5jb2Rpbmc6bnVsbH0sdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGU9ITAsdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jPSExLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC50cmFuc2Zvcm0mJih0aGlzLl90cmFuc2Zvcm09dC50cmFuc2Zvcm0pLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZsdXNoJiYodGhpcy5fZmx1c2g9dC5mbHVzaCkpLHRoaXMub24oInByZWZpbmlzaCIsUXIpfWZ1bmN0aW9uIFFyKCl7dmFyIHQ9dGhpczsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goKGZ1bmN0aW9uKGUscil7dG4odCxlLHIpfSkpOnRuKHRoaXMsbnVsbCxudWxsKX1mdW5jdGlvbiB0bih0LGUscil7aWYoZSlyZXR1cm4gdC5lbWl0KCJlcnJvciIsZSk7aWYobnVsbCE9ciYmdC5wdXNoKHIpLHQuX3dyaXRhYmxlU3RhdGUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwIik7aWYodC5fdHJhbnNmb3JtU3RhdGUudHJhbnNmb3JtaW5nKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZyIpO3JldHVybiB0LnB1c2gobnVsbCl9S3IuaW5oZXJpdHM9R3QsS3IuaW5oZXJpdHMoWHIsbnIpLFhyLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm09ITEsbnIucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLHQsZSl9LFhyLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXt0aHJvdyBuZXcgRXJyb3IoIl90cmFuc2Zvcm0oKSBpcyBub3QgaW1wbGVtZW50ZWQiKX0sWHIucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fdHJhbnNmb3JtU3RhdGU7aWYobi53cml0ZWNiPXIsbi53cml0ZWNodW5rPXQsbi53cml0ZWVuY29kaW5nPWUsIW4udHJhbnNmb3JtaW5nKXt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlOyhuLm5lZWRUcmFuc2Zvcm18fGkubmVlZFJlYWRhYmxlfHxpLmxlbmd0aDxpLmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKGkuaGlnaFdhdGVyTWFyayl9fSxYci5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdHJhbnNmb3JtU3RhdGU7bnVsbCE9PWUud3JpdGVjaHVuayYmZS53cml0ZWNiJiYhZS50cmFuc2Zvcm1pbmc/KGUudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybShlLndyaXRlY2h1bmssZS53cml0ZWVuY29kaW5nLGUuYWZ0ZXJUcmFuc2Zvcm0pKTplLm5lZWRUcmFuc2Zvcm09ITB9LFhyLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXM7bnIucHJvdG90eXBlLl9kZXN0cm95LmNhbGwodGhpcyx0LChmdW5jdGlvbih0KXtlKHQpLHIuZW1pdCgiY2xvc2UiKX0pKX07dmFyIGVuPW5uLHJuPU9iamVjdC5jcmVhdGUoSnQpO2Z1bmN0aW9uIG5uKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG5uKSlyZXR1cm4gbmV3IG5uKHQpO1ZyLmNhbGwodGhpcyx0KX1ybi5pbmhlcml0cz1HdCxybi5pbmhlcml0cyhubixWciksbm4ucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3IobnVsbCx0KX07dmFyIG9uPU8oKGZ1bmN0aW9uKHQsZSl7KGU9dC5leHBvcnRzPVJyKS5TdHJlYW09ZSxlLlJlYWRhYmxlPWUsZS5Xcml0YWJsZT1EZSxlLkR1cGxleD1ucixlLlRyYW5zZm9ybT1WcixlLlBhc3NUaHJvdWdoPWVufSkpLlJlYWRhYmxlLGFuPXVuO3VuLmN0b3I9Zm4sdW4ub2JqPWZ1bmN0aW9uKHQsZSl7KCJmdW5jdGlvbiI9PXR5cGVvZiB0fHxBcnJheS5pc0FycmF5KHQpKSYmKGU9dCx0PXt9KTtyZXR1cm4odD1sbih0KSkub2JqZWN0TW9kZT0hMCx0LmhpZ2hXYXRlck1hcms9MTYsdW4odCxlKX07dmFyIHNuPWZuKCk7ZnVuY3Rpb24gdW4odCxlKXsoIm9iamVjdCIhPXR5cGVvZiB0fHxBcnJheS5pc0FycmF5KHQpKSYmKGU9dCx0PXt9KTt2YXIgcixuPW5ldyBzbih0KTtyZXR1cm4gbi5fZnJvbT1BcnJheS5pc0FycmF5KGUpPyhyPShyPWUpLnNsaWNlKCksZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsLGk9ci5sZW5ndGg/ci5zaGlmdCgpOm51bGw7aSBpbnN0YW5jZW9mIEVycm9yJiYobj1pLGk9bnVsbCksZShuLGkpfSk6ZXx8aG4sbn1mdW5jdGlvbiBmbih0LGUpe2Z1bmN0aW9uIHIoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByKGUpO3RoaXMuX3JlYWRpbmc9ITEsdGhpcy5fY2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtpZihuLmRlc3Ryb3llZClyZXR1cm47aWYodClyZXR1cm4gbi5kZXN0cm95KHQpO2lmKG51bGw9PT1lKXJldHVybiBuLnB1c2gobnVsbCk7bi5fcmVhZGluZz0hMSxuLnB1c2goZSkmJm4uX3JlYWQoaSl9LHRoaXMuZGVzdHJveWVkPSExLG9uLmNhbGwodGhpcyxlfHx0KTt2YXIgbj10aGlzLGk9dGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZT10LHQ9e30pLHQ9bG4odCksR3Qocixvbiksci5wcm90b3R5cGUuX2Zyb209ZXx8aG4sci5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5fcmVhZGluZ3x8dGhpcy5kZXN0cm95ZWR8fCh0aGlzLl9yZWFkaW5nPSEwLHRoaXMuX2Zyb20odCx0aGlzLl9jYWxsYmFjaykpfSxyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmRlc3Ryb3llZCl7dGhpcy5kZXN0cm95ZWQ9ITA7dmFyIGU9dGhpcztSLm5leHRUaWNrKChmdW5jdGlvbigpe3QmJmUuZW1pdCgiZXJyb3IiLHQpLGUuZW1pdCgiY2xvc2UiKX0pKX19LHJ9ZnVuY3Rpb24gaG4oKXt9ZnVuY3Rpb24gbG4odCl7cmV0dXJuIHQ9dHx8e319dmFyIGNuLGRuPTEscG49e30sZ249ITEseW49dC5kb2N1bWVudDtmdW5jdGlvbiBibih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9bmV3IEZ1bmN0aW9uKCIiK3QpKTtmb3IodmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSkscj0wO3I8ZS5sZW5ndGg7cisrKWVbcl09YXJndW1lbnRzW3IrMV07dmFyIG49e2NhbGxiYWNrOnQsYXJnczplfTtyZXR1cm4gcG5bZG5dPW4sY24oZG4pLGRuKyt9ZnVuY3Rpb24gdm4odCl7aWYoZ24pc2V0VGltZW91dCh2biwwLHQpO2Vsc2V7dmFyIGU9cG5bdF07aWYoZSl7Z249ITA7dHJ5eyFmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLHI9dC5hcmdzO3N3aXRjaChyLmxlbmd0aCl7Y2FzZSAwOmUoKTticmVhaztjYXNlIDE6ZShyWzBdKTticmVhaztjYXNlIDI6ZShyWzBdLHJbMV0pO2JyZWFrO2Nhc2UgMzplKHJbMF0sclsxXSxyWzJdKTticmVhaztkZWZhdWx0OmUuYXBwbHkodm9pZCAwLHIpfX0oZSl9ZmluYWxseXshZnVuY3Rpb24odCl7ZGVsZXRlIHBuW3RdfSh0KSxnbj0hMX19fX12YXIgd24sbW4sX24sU24sRW49T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7ZnVuY3Rpb24ga24odCl7bGV0IGUscj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7aWYoZT0iW29iamVjdCBQcm9taXNlXSI9PT1yLGUpcmV0dXJuITA7aWYoIltvYmplY3QgRnVuY3Rpb25dIiE9PXIpcmV0dXJuITE7dHJ5e2U9ImZ1bmN0aW9uIiE9dHlwZW9mIHQuc3Vic2NyaWJlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVufWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiBSbih0KXtsZXQgZSxyLG47ZnVuY3Rpb24gaShpKXsoKHQ9aSlpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxBcnJheUJ1ZmZlci5pc1ZpZXcodCkmJiFhdC5pc0J1ZmZlcih0KSkmJih0PWF0LmZyb20odCkpLGU9a24odCk/dDpudWxsO2NvbnN0IG89IWUmJnRbU3ltYm9sLml0ZXJhdG9yXSYmInN0cmluZyIhPXR5cGVvZiB0JiYhYXQuaXNCdWZmZXIodCk7cj1vP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGw7Y29uc3QgYT0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl07bj1hP3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6bnVsbH1yZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dC5zbGljZSgpKSxpKHQpLGFuKChmdW5jdGlvbiBvKGEscyl7aWYoZSlyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMsYSxzKX1jYXRjaCh0KXtzKHQpfX0pKCk7aWYocil7Y29uc3QgdD1yLm5leHQoKTtyZXR1cm4gdm9pZCBibihzLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9aWYobilyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7Ym4ocyxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe2JuKHMsdCl9fSkoKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHZvaWQgYm4ocyxudWxsLG51bGwpO2NvbnN0IHU9dC5zbGljZSgwLGEpO3Q9dC5zbGljZShhKSxibihzLG51bGwsdSl9KSl9RW49RW4mJkVuLnNldFRpbWVvdXQ/RW46dCwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKHQucHJvY2Vzcyk/Y249ZnVuY3Rpb24odCl7Ui5uZXh0VGljaygoZnVuY3Rpb24oKXt2bih0KX0pKX06IWZ1bmN0aW9uKCl7aWYodC5wb3N0TWVzc2FnZSYmIXQuaW1wb3J0U2NyaXB0cyl7dmFyIGU9ITAscj10Lm9ubWVzc2FnZTtyZXR1cm4gdC5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXtlPSExfSx0LnBvc3RNZXNzYWdlKCIiLCIqIiksdC5vbm1lc3NhZ2U9cixlfX0oKT90Lk1lc3NhZ2VDaGFubmVsPygobW49bmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24odCl7dm4odC5kYXRhKX0sY249ZnVuY3Rpb24odCl7bW4ucG9ydDIucG9zdE1lc3NhZ2UodCl9KTp5biYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiB5bi5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT8od249eW4uZG9jdW1lbnRFbGVtZW50LGNuPWZ1bmN0aW9uKHQpe3ZhciBlPXluLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7dm4odCksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCx3bi5yZW1vdmVDaGlsZChlKSxlPW51bGx9LHduLmFwcGVuZENoaWxkKGUpfSk6Y249ZnVuY3Rpb24odCl7c2V0VGltZW91dCh2biwwLHQpfTooX249InNldEltbWVkaWF0ZSQiK01hdGgucmFuZG9tKCkrIiQiLFNuPWZ1bmN0aW9uKGUpe2Uuc291cmNlPT09dCYmInN0cmluZyI9PXR5cGVvZiBlLmRhdGEmJjA9PT1lLmRhdGEuaW5kZXhPZihfbikmJnZuKCtlLmRhdGEuc2xpY2UoX24ubGVuZ3RoKSl9LHQuYWRkRXZlbnRMaXN0ZW5lcj90LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLFNuLCExKTp0LmF0dGFjaEV2ZW50KCJvbm1lc3NhZ2UiLFNuKSxjbj1mdW5jdGlvbihlKXt0LnBvc3RNZXNzYWdlKF9uK2UsIioiKX0pLFJuLm9iamVjdD10PT57bGV0IGUscixuO2Z1bmN0aW9uIGkoaSl7ZT1rbih0PWkpP3Q6bnVsbCxyPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0/dFtTeW1ib2wuaXRlcmF0b3JdKCk6bnVsbCxuPSFlJiZ0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXT90W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOm51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSksaSh0KSxhbi5vYmooKGZ1bmN0aW9uIG8oYSxzKXtpZihlKShhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMsYSxzKX1jYXRjaCh0KXtzKHQpfX0pKCk7ZWxzZSBpZihyKXtjb25zdCB0PXIubmV4dCgpO2JuKHMsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1lbHNlIG4/KGFzeW5jKCk9Pnt0cnl7Y29uc3QgdD1hd2FpdCBuLm5leHQoKTtibihzLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9Y2F0Y2godCl7Ym4ocyx0KX19KSgpOih0aGlzLnB1c2godCksYm4ocyxudWxsLG51bGwpKX0pKX07dmFyIGpuPXt9LFRuPWpuLkxFRlRfQlJBQ0U9MSxPbj1qbi5SSUdIVF9CUkFDRT0yLEFuPWpuLkxFRlRfQlJBQ0tFVD0zLENuPWpuLlJJR0hUX0JSQUNLRVQ9NCxNbj1qbi5DT0xPTj01LHhuPWpuLkNPTU1BPTYsTG49am4uVFJVRT03LEJuPWpuLkZBTFNFPTgsUG49am4uTlVMTD05LFVuPWpuLlNUUklORz0xMCxObj1qbi5OVU1CRVI9MTEsRG49am4uU1RBUlQ9MTcsSW49am4uU1RPUD0xOCxxbj1qbi5UUlVFMT0zMyxGbj1qbi5UUlVFMj0zNCxXbj1qbi5UUlVFMz0zNSx6bj1qbi5GQUxTRTE9NDksWW49am4uRkFMU0UyPTUwLCRuPWpuLkZBTFNFMz01MSxIbj1qbi5GQUxTRTQ9NTIsSm49am4uTlVMTDE9NjUsR249am4uTlVMTDI9NjYsVm49am4uTlVMTDM9NjcsS249am4uTlVNQkVSMT04MSxabj1qbi5OVU1CRVIzPTgzLFhuPWpuLlNUUklORzE9OTcsUW49am4uU1RSSU5HMj05OCx0aT1qbi5TVFJJTkczPTk5LGVpPWpuLlNUUklORzQ9MTAwLHJpPWpuLlNUUklORzU9MTAxLG5pPWpuLlNUUklORzY9MTAyLGlpPWpuLlZBTFVFPTExMyxvaT1qbi5LRVk9MTE0LGFpPWpuLk9CSkVDVD0xMjksc2k9am4uQVJSQVk9MTMwLHVpPSJcXCIuY2hhckNvZGVBdCgwKSxmaT0iLyIuY2hhckNvZGVBdCgwKSxoaT0iXGIiLmNoYXJDb2RlQXQoMCksbGk9IlxmIi5jaGFyQ29kZUF0KDApLGNpPSJcbiIuY2hhckNvZGVBdCgwKSxkaT0iXHIiLmNoYXJDb2RlQXQoMCkscGk9Ilx0Ii5jaGFyQ29kZUF0KDApO2Z1bmN0aW9uIGdpKCl7dGhpcy50U3RhdGU9RG4sdGhpcy52YWx1ZT12b2lkIDAsdGhpcy5zdHJpbmc9dm9pZCAwLHRoaXMuc3RyaW5nQnVmZmVyPWF0LmFsbG9jP2F0LmFsbG9jKDY1NTM2KTpuZXcgYXQoNjU1MzYpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy51bmljb2RlPXZvaWQgMCx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwLHRoaXMua2V5PXZvaWQgMCx0aGlzLm1vZGU9dm9pZCAwLHRoaXMuc3RhY2s9W10sdGhpcy5zdGF0ZT1paSx0aGlzLmJ5dGVzX3JlbWFpbmluZz0wLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MCx0aGlzLnRlbXBfYnVmZnM9ezI6bmV3IGF0KDIpLDM6bmV3IGF0KDMpLDQ6bmV3IGF0KDQpfSx0aGlzLm9mZnNldD0tMX1naS50b2tuYW09ZnVuY3Rpb24odCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKGpuKSxyPTAsbj1lLmxlbmd0aDtyPG47cisrKXt2YXIgaT1lW3JdO2lmKGpuW2ldPT09dClyZXR1cm4gaX1yZXR1cm4gdCYmIjB4Iit0LnRvU3RyaW5nKDE2KX07dmFyIHlpPWdpLnByb3RvdHlwZTt5aS5vbkVycm9yPWZ1bmN0aW9uKHQpe3Rocm93IHR9LHlpLmNoYXJFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPUluLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIitKU09OLnN0cmluZ2lmeShTdHJpbmcuZnJvbUNoYXJDb2RlKHRbZV0pKSsiIGF0IHBvc2l0aW9uICIrZSsiIGluIHN0YXRlICIrZ2kudG9rbmFtKHRoaXMudFN0YXRlKSkpfSx5aS5hcHBlbmRTdHJpbmdDaGFyPWZ1bmN0aW9uKHQpe3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0Pj02NTUzNiYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTApLHRoaXMuc3RyaW5nQnVmZmVyW3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KytdPXR9LHlpLmFwcGVuZFN0cmluZ0J1Zj1mdW5jdGlvbih0LGUscil7dmFyIG49dC5sZW5ndGg7Im51bWJlciI9PXR5cGVvZiBlJiYobj0ibnVtYmVyIj09dHlwZW9mIHI/cjwwP3QubGVuZ3RoLWUrcjpyLWU6dC5sZW5ndGgtZSksbjwwJiYobj0wKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCtuPjY1NTM2JiYodGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiwwLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0LmNvcHkodGhpcy5zdHJpbmdCdWZmZXIsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQsZSxyKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCs9bn0seWkud3JpdGU9ZnVuY3Rpb24odCl7dmFyIGU7InN0cmluZyI9PXR5cGVvZiB0JiYodD1uZXcgYXQodCkpO2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0aGlzLnRTdGF0ZT09PURuKXtpZihlPXRbcl0sdGhpcy5vZmZzZXQrKywxMjM9PT1lKXRoaXMub25Ub2tlbihUbiwieyIpO2Vsc2UgaWYoMTI1PT09ZSl0aGlzLm9uVG9rZW4oT24sIn0iKTtlbHNlIGlmKDkxPT09ZSl0aGlzLm9uVG9rZW4oQW4sIlsiKTtlbHNlIGlmKDkzPT09ZSl0aGlzLm9uVG9rZW4oQ24sIl0iKTtlbHNlIGlmKDU4PT09ZSl0aGlzLm9uVG9rZW4oTW4sIjoiKTtlbHNlIGlmKDQ0PT09ZSl0aGlzLm9uVG9rZW4oeG4sIiwiKTtlbHNlIGlmKDExNj09PWUpdGhpcy50U3RhdGU9cW47ZWxzZSBpZigxMDI9PT1lKXRoaXMudFN0YXRlPXpuO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLnRTdGF0ZT1KbjtlbHNlIGlmKDM0PT09ZSl0aGlzLnN0cmluZz0iIix0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudFN0YXRlPVhuO2Vsc2UgaWYoNDU9PT1lKXRoaXMuc3RyaW5nPSItIix0aGlzLnRTdGF0ZT1LbjtlbHNlIGlmKGU+PTQ4JiZlPDY0KXRoaXMuc3RyaW5nPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGU9Wm47ZWxzZSBpZigzMiE9PWUmJjkhPT1lJiYxMCE9PWUmJjEzIT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09WG4paWYoZT10W3JdLHRoaXMuYnl0ZXNfcmVtYWluaW5nPjApe2Zvcih2YXIgaT0wO2k8dGhpcy5ieXRlc19yZW1haW5pbmc7aSsrKXRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXVt0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLXRoaXMuYnl0ZXNfcmVtYWluaW5nK2ldPXRbaV07dGhpcy5hcHBlbmRTdHJpbmdCdWYodGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdKSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPXRoaXMuYnl0ZXNfcmVtYWluaW5nPTAscj1yK2ktMX1lbHNlIGlmKDA9PT10aGlzLmJ5dGVzX3JlbWFpbmluZyYmZT49MTI4KXtpZihlPD0xOTN8fGU+MjQ0KXJldHVybiB0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJJbnZhbGlkIFVURi04IGNoYXJhY3RlciBhdCBwb3NpdGlvbiAiK3IrIiBpbiBzdGF0ZSAiK2dpLnRva25hbSh0aGlzLnRTdGF0ZSkpKTtpZihlPj0xOTQmJmU8PTIyMyYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MiksZT49MjI0JiZlPD0yMzkmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTMpLGU+PTI0MCYmZTw9MjQ0JiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT00KSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlK3I+dC5sZW5ndGgpe2Zvcih2YXIgbz0wO288PXQubGVuZ3RoLTEtcjtvKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW29dPXRbcitvXTt0aGlzLmJ5dGVzX3JlbWFpbmluZz1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdC5sZW5ndGgscj10Lmxlbmd0aC0xfWVsc2UgdGhpcy5hcHBlbmRTdHJpbmdCdWYodCxyLHIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZSkscj1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtMX1lbHNlIGlmKDM0PT09ZSl0aGlzLnRTdGF0ZT1Ebix0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiLDAsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy5vblRva2VuKFVuLHRoaXMuc3RyaW5nKSx0aGlzLm9mZnNldCs9YXQuYnl0ZUxlbmd0aCh0aGlzLnN0cmluZywidXRmOCIpKzEsdGhpcy5zdHJpbmc9dm9pZCAwO2Vsc2UgaWYoOTI9PT1lKXRoaXMudFN0YXRlPVFuO2Vsc2V7aWYoIShlPj0zMikpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy5hcHBlbmRTdHJpbmdDaGFyKGUpfWVsc2UgaWYodGhpcy50U3RhdGU9PT1RbilpZigzND09PShlPXRbcl0pKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihlKSx0aGlzLnRTdGF0ZT1YbjtlbHNlIGlmKDkyPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIodWkpLHRoaXMudFN0YXRlPVhuO2Vsc2UgaWYoNDc9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihmaSksdGhpcy50U3RhdGU9WG47ZWxzZSBpZig5OD09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGhpKSx0aGlzLnRTdGF0ZT1YbjtlbHNlIGlmKDEwMj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGxpKSx0aGlzLnRTdGF0ZT1YbjtlbHNlIGlmKDExMD09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGNpKSx0aGlzLnRTdGF0ZT1YbjtlbHNlIGlmKDExND09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGRpKSx0aGlzLnRTdGF0ZT1YbjtlbHNlIGlmKDExNj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKHBpKSx0aGlzLnRTdGF0ZT1YbjtlbHNle2lmKDExNyE9PWUpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy51bmljb2RlPSIiLHRoaXMudFN0YXRlPXRpfWVsc2UgaWYodGhpcy50U3RhdGU9PT10aXx8dGhpcy50U3RhdGU9PT1laXx8dGhpcy50U3RhdGU9PT1yaXx8dGhpcy50U3RhdGU9PT1uaSl7aWYoISgoZT10W3JdKT49NDgmJmU8NjR8fGU+NjQmJmU8PTcwfHxlPjk2JiZlPD0xMDIpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO2lmKHRoaXMudW5pY29kZSs9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZSsrPT09bmkpe3ZhciBhPXBhcnNlSW50KHRoaXMudW5pY29kZSwxNik7dGhpcy51bmljb2RlPXZvaWQgMCx2b2lkIDAhPT10aGlzLmhpZ2hTdXJyb2dhdGUmJmE+PTU2MzIwJiZhPDU3MzQ0Pyh0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgYXQoU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUsYSkpKSx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwKTp2b2lkIDA9PT10aGlzLmhpZ2hTdXJyb2dhdGUmJmE+PTU1Mjk2JiZhPDU2MzIwP3RoaXMuaGlnaFN1cnJvZ2F0ZT1hOih2b2lkIDAhPT10aGlzLmhpZ2hTdXJyb2dhdGUmJih0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgYXQoU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCksdGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IGF0KFN0cmluZy5mcm9tQ2hhckNvZGUoYSkpKSksdGhpcy50U3RhdGU9WG59fWVsc2UgaWYodGhpcy50U3RhdGU9PT1Lbnx8dGhpcy50U3RhdGU9PT1abilzd2l0Y2goZT10W3JdKXtjYXNlIDQ4OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6Y2FzZSA1NjpjYXNlIDU3OmNhc2UgNDY6Y2FzZSAxMDE6Y2FzZSA2OTpjYXNlIDQzOmNhc2UgNDU6dGhpcy5zdHJpbmcrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGU9Wm47YnJlYWs7ZGVmYXVsdDp0aGlzLnRTdGF0ZT1Ebjt2YXIgcz1OdW1iZXIodGhpcy5zdHJpbmcpO2lmKGlzTmFOKHMpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMuc3RyaW5nLm1hdGNoKC9bMC05XSsvKT09dGhpcy5zdHJpbmcmJnMudG9TdHJpbmcoKSE9dGhpcy5zdHJpbmc/dGhpcy5vblRva2VuKFVuLHRoaXMuc3RyaW5nKTp0aGlzLm9uVG9rZW4oTm4scyksdGhpcy5vZmZzZXQrPXRoaXMuc3RyaW5nLmxlbmd0aC0xLHRoaXMuc3RyaW5nPXZvaWQgMCxyLS19ZWxzZSBpZih0aGlzLnRTdGF0ZT09PXFuKXtpZigxMTQhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUZufWVsc2UgaWYodGhpcy50U3RhdGU9PT1Gbil7aWYoMTE3IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Xbn1lbHNlIGlmKHRoaXMudFN0YXRlPT09V24pe2lmKDEwMSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9RG4sdGhpcy5vblRva2VuKExuLCEwKSx0aGlzLm9mZnNldCs9M31lbHNlIGlmKHRoaXMudFN0YXRlPT09em4pe2lmKDk3IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Zbn1lbHNlIGlmKHRoaXMudFN0YXRlPT09WW4pe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9JG59ZWxzZSBpZih0aGlzLnRTdGF0ZT09PSRuKXtpZigxMTUhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUhufWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ibil7aWYoMTAxIT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Ebix0aGlzLm9uVG9rZW4oQm4sITEpLHRoaXMub2Zmc2V0Kz00fWVsc2UgaWYodGhpcy50U3RhdGU9PT1Kbil7aWYoMTE3IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Hbn1lbHNlIGlmKHRoaXMudFN0YXRlPT09R24pe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9Vm59ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVZuKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPURuLHRoaXMub25Ub2tlbihQbixudWxsKSx0aGlzLm9mZnNldCs9M319LHlpLm9uVG9rZW49ZnVuY3Rpb24odCxlKXt9LHlpLnBhcnNlRXJyb3I9ZnVuY3Rpb24odCxlKXt0aGlzLnRTdGF0ZT1Jbix0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJVbmV4cGVjdGVkICIrZ2kudG9rbmFtKHQpKyhlPyIoIitKU09OLnN0cmluZ2lmeShlKSsiKSI6IiIpKyIgaW4gc3RhdGUgIitnaS50b2tuYW0odGhpcy5zdGF0ZSkpKX0seWkucHVzaD1mdW5jdGlvbigpe3RoaXMuc3RhY2sucHVzaCh7dmFsdWU6dGhpcy52YWx1ZSxrZXk6dGhpcy5rZXksbW9kZTp0aGlzLm1vZGV9KX0seWkucG9wPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52YWx1ZSxlPXRoaXMuc3RhY2sucG9wKCk7dGhpcy52YWx1ZT1lLnZhbHVlLHRoaXMua2V5PWUua2V5LHRoaXMubW9kZT1lLm1vZGUsdGhpcy5lbWl0KHQpLHRoaXMubW9kZXx8KHRoaXMuc3RhdGU9aWkpfSx5aS5lbWl0PWZ1bmN0aW9uKHQpe3RoaXMubW9kZSYmKHRoaXMuc3RhdGU9eG4pLHRoaXMub25WYWx1ZSh0KX0seWkub25WYWx1ZT1mdW5jdGlvbih0KXt9LHlpLm9uVG9rZW49ZnVuY3Rpb24odCxlKXtpZih0aGlzLnN0YXRlPT09aWkpaWYodD09PVVufHx0PT09Tm58fHQ9PT1Mbnx8dD09PUJufHx0PT09UG4pdGhpcy52YWx1ZSYmKHRoaXMudmFsdWVbdGhpcy5rZXldPWUpLHRoaXMuZW1pdChlKTtlbHNlIGlmKHQ9PT1Ubil0aGlzLnB1c2goKSx0aGlzLnZhbHVlP3RoaXMudmFsdWU9dGhpcy52YWx1ZVt0aGlzLmtleV09e306dGhpcy52YWx1ZT17fSx0aGlzLmtleT12b2lkIDAsdGhpcy5zdGF0ZT1vaSx0aGlzLm1vZGU9YWk7ZWxzZSBpZih0PT09QW4pdGhpcy5wdXNoKCksdGhpcy52YWx1ZT90aGlzLnZhbHVlPXRoaXMudmFsdWVbdGhpcy5rZXldPVtdOnRoaXMudmFsdWU9W10sdGhpcy5rZXk9MCx0aGlzLm1vZGU9c2ksdGhpcy5zdGF0ZT1paTtlbHNlIGlmKHQ9PT1Pbil7aWYodGhpcy5tb2RlIT09YWkpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZXtpZih0IT09Q24pcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO2lmKHRoaXMubW9kZSE9PXNpKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2UgaWYodGhpcy5zdGF0ZT09PW9pKWlmKHQ9PT1Vbil0aGlzLmtleT1lLHRoaXMuc3RhdGU9TW47ZWxzZXtpZih0IT09T24pcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZSBpZih0aGlzLnN0YXRlPT09TW4pe2lmKHQhPT1NbilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5zdGF0ZT1paX1lbHNle2lmKHRoaXMuc3RhdGUhPT14bilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7aWYodD09PXhuKXRoaXMubW9kZT09PXNpPyh0aGlzLmtleSsrLHRoaXMuc3RhdGU9aWkpOnRoaXMubW9kZT09PWFpJiYodGhpcy5zdGF0ZT1vaSk7ZWxzZXtpZighKHQ9PT1DbiYmdGhpcy5tb2RlPT09c2l8fHQ9PT1PbiYmdGhpcy5tb2RlPT09YWkpKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfX19LGdpLkM9am47dmFyIGJpPWdpO2Z1bmN0aW9uIHZpKCl7dGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH12aS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6bnVsbH07dGhpcy5sZW5ndGg+MD90aGlzLnRhaWwubmV4dD1lOnRoaXMuaGVhZD1lLHRoaXMudGFpbD1lLCsrdGhpcy5sZW5ndGh9LHZpLnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDp0aGlzLmhlYWR9OzA9PT10aGlzLmxlbmd0aCYmKHRoaXMudGFpbD1lKSx0aGlzLmhlYWQ9ZSwrK3RoaXMubGVuZ3RofSx2aS5wcm90b3R5cGUuc2hpZnQ9ZnVuY3Rpb24oKXtpZigwIT09dGhpcy5sZW5ndGgpe3ZhciB0PXRoaXMuaGVhZC5kYXRhO3JldHVybiAxPT09dGhpcy5sZW5ndGg/dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsOnRoaXMuaGVhZD10aGlzLmhlYWQubmV4dCwtLXRoaXMubGVuZ3RoLHR9fSx2aS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH0sdmkucHJvdG90eXBlLmpvaW49ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiIiO2Zvcih2YXIgZT10aGlzLmhlYWQscj0iIitlLmRhdGE7ZT1lLm5leHQ7KXIrPXQrZS5kYXRhO3JldHVybiByfSx2aS5wcm90b3R5cGUuY29uY2F0PWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4gYXQuYWxsb2MoMCk7aWYoMT09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzLmhlYWQuZGF0YTtmb3IodmFyIGU9YXQuYWxsb2NVbnNhZmUodD4+PjApLHI9dGhpcy5oZWFkLG49MDtyOylyLmRhdGEuY29weShlLG4pLG4rPXIuZGF0YS5sZW5ndGgscj1yLm5leHQ7cmV0dXJuIGV9O3ZhciB3aT1hdC5pc0VuY29kaW5nfHxmdW5jdGlvbih0KXtzd2l0Y2godCYmdC50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpjYXNlInJhdyI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19O2Z1bmN0aW9uIG1pKHQpe3N3aXRjaCh0aGlzLmVuY29kaW5nPSh0fHwidXRmOCIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS8sIiIpLGZ1bmN0aW9uKHQpe2lmKHQmJiF3aSh0KSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCl9KHQpLHRoaXMuZW5jb2Rpbmcpe2Nhc2UidXRmOCI6dGhpcy5zdXJyb2dhdGVTaXplPTM7YnJlYWs7Y2FzZSJ1Y3MyIjpjYXNlInV0ZjE2bGUiOnRoaXMuc3Vycm9nYXRlU2l6ZT0yLHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9U2k7YnJlYWs7Y2FzZSJiYXNlNjQiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zLHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9RWk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdm9pZCh0aGlzLndyaXRlPV9pKX10aGlzLmNoYXJCdWZmZXI9bmV3IGF0KDYpLHRoaXMuY2hhclJlY2VpdmVkPTAsdGhpcy5jaGFyTGVuZ3RoPTB9ZnVuY3Rpb24gX2kodCl7cmV0dXJuIHQudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gU2kodCl7dGhpcy5jaGFyUmVjZWl2ZWQ9dC5sZW5ndGglMix0aGlzLmNoYXJMZW5ndGg9dGhpcy5jaGFyUmVjZWl2ZWQ/MjowfWZ1bmN0aW9uIEVpKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTMsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzM6MH1taS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSIiO3RoaXMuY2hhckxlbmd0aDspe3ZhciByPXQubGVuZ3RoPj10aGlzLmNoYXJMZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQ/dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkOnQubGVuZ3RoO2lmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsdGhpcy5jaGFyUmVjZWl2ZWQsMCxyKSx0aGlzLmNoYXJSZWNlaXZlZCs9cix0aGlzLmNoYXJSZWNlaXZlZDx0aGlzLmNoYXJMZW5ndGgpcmV0dXJuIiI7aWYodD10LnNsaWNlKHIsdC5sZW5ndGgpLCEoKGk9KGU9dGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKSkuY2hhckNvZGVBdChlLmxlbmd0aC0xKSk+PTU1Mjk2JiZpPD01NjMxOSkpe2lmKHRoaXMuY2hhclJlY2VpdmVkPXRoaXMuY2hhckxlbmd0aD0wLDA9PT10Lmxlbmd0aClyZXR1cm4gZTticmVha310aGlzLmNoYXJMZW5ndGgrPXRoaXMuc3Vycm9nYXRlU2l6ZSxlPSIifXRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIodCk7dmFyIG49dC5sZW5ndGg7dGhpcy5jaGFyTGVuZ3RoJiYodC5jb3B5KHRoaXMuY2hhckJ1ZmZlciwwLHQubGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkLG4pLG4tPXRoaXMuY2hhclJlY2VpdmVkKTt2YXIgaTtuPShlKz10LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCxuKSkubGVuZ3RoLTE7aWYoKGk9ZS5jaGFyQ29kZUF0KG4pKT49NTUyOTYmJmk8PTU2MzE5KXt2YXIgbz10aGlzLnN1cnJvZ2F0ZVNpemU7cmV0dXJuIHRoaXMuY2hhckxlbmd0aCs9byx0aGlzLmNoYXJSZWNlaXZlZCs9byx0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsbywwLG8pLHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCwwLG8pLGUuc3Vic3RyaW5nKDAsbil9cmV0dXJuIGV9LG1pLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGg+PTM/Mzp0Lmxlbmd0aDtlPjA7ZS0tKXt2YXIgcj10W3QubGVuZ3RoLWVdO2lmKDE9PWUmJnI+PjU9PTYpe3RoaXMuY2hhckxlbmd0aD0yO2JyZWFrfWlmKGU8PTImJnI+PjQ9PTE0KXt0aGlzLmNoYXJMZW5ndGg9MzticmVha31pZihlPD0zJiZyPj4zPT0zMCl7dGhpcy5jaGFyTGVuZ3RoPTQ7YnJlYWt9fXRoaXMuY2hhclJlY2VpdmVkPWV9LG1pLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCl7dmFyIGU9IiI7aWYodCYmdC5sZW5ndGgmJihlPXRoaXMud3JpdGUodCkpLHRoaXMuY2hhclJlY2VpdmVkKXt2YXIgcj10aGlzLmNoYXJSZWNlaXZlZCxuPXRoaXMuY2hhckJ1ZmZlcixpPXRoaXMuZW5jb2Rpbmc7ZSs9bi5zbGljZSgwLHIpLnRvU3RyaW5nKGkpfXJldHVybiBlfSxqaS5SZWFkYWJsZVN0YXRlPVJpO3ZhciBraT1lZSgic3RyZWFtIik7ZnVuY3Rpb24gUmkodCxlKXt0PXR8fHt9LHRoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxlIGluc3RhbmNlb2YgUWkmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQucmVhZGFibGVPYmplY3RNb2RlKTt2YXIgcj10LmhpZ2hXYXRlck1hcmssbj10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6bix0aGlzLmhpZ2hXYXRlck1hcms9fn50aGlzLmhpZ2hXYXRlck1hcmssdGhpcy5idWZmZXI9bmV3IHZpLHRoaXMubGVuZ3RoPTAsdGhpcy5waXBlcz1udWxsLHRoaXMucGlwZXNDb3VudD0wLHRoaXMuZmxvd2luZz1udWxsLHRoaXMuZW5kZWQ9ITEsdGhpcy5lbmRFbWl0dGVkPSExLHRoaXMucmVhZGluZz0hMSx0aGlzLnN5bmM9ITAsdGhpcy5uZWVkUmVhZGFibGU9ITEsdGhpcy5lbWl0dGVkUmVhZGFibGU9ITEsdGhpcy5yZWFkYWJsZUxpc3RlbmluZz0hMSx0aGlzLnJlc3VtZVNjaGVkdWxlZD0hMSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMucmFuT3V0PSExLHRoaXMuYXdhaXREcmFpbj0wLHRoaXMucmVhZGluZ01vcmU9ITEsdGhpcy5kZWNvZGVyPW51bGwsdGhpcy5lbmNvZGluZz1udWxsLHQuZW5jb2RpbmcmJih0aGlzLmRlY29kZXI9bmV3IG1pKHQuZW5jb2RpbmcpLHRoaXMuZW5jb2Rpbmc9dC5lbmNvZGluZyl9ZnVuY3Rpb24gamkodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgamkpKXJldHVybiBuZXcgamkodCk7dGhpcy5fcmVhZGFibGVTdGF0ZT1uZXcgUmkodCx0aGlzKSx0aGlzLnJlYWRhYmxlPSEwLHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWQmJih0aGlzLl9yZWFkPXQucmVhZCksTC5jYWxsKHRoaXMpfWZ1bmN0aW9uIFRpKHQsZSxyLG4saSl7dmFyIG89ZnVuY3Rpb24odCxlKXt2YXIgcj1udWxsO2F0LmlzQnVmZmVyKGUpfHwic3RyaW5nIj09dHlwZW9mIGV8fG51bGw9PWV8fHQub2JqZWN0TW9kZXx8KHI9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKTtyZXR1cm4gcn0oZSxyKTtpZihvKXQuZW1pdCgiZXJyb3IiLG8pO2Vsc2UgaWYobnVsbD09PXIpZS5yZWFkaW5nPSExLGZ1bmN0aW9uKHQsZSl7aWYoZS5lbmRlZClyZXR1cm47aWYoZS5kZWNvZGVyKXt2YXIgcj1lLmRlY29kZXIuZW5kKCk7ciYmci5sZW5ndGgmJihlLmJ1ZmZlci5wdXNoKHIpLGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aCl9ZS5lbmRlZD0hMCxBaSh0KX0odCxlKTtlbHNlIGlmKGUub2JqZWN0TW9kZXx8ciYmci5sZW5ndGg+MClpZihlLmVuZGVkJiYhaSl7dmFyIGE9bmV3IEVycm9yKCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpO3QuZW1pdCgiZXJyb3IiLGEpfWVsc2UgaWYoZS5lbmRFbWl0dGVkJiZpKXt2YXIgcz1uZXcgRXJyb3IoInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Iik7dC5lbWl0KCJlcnJvciIscyl9ZWxzZXt2YXIgdTshZS5kZWNvZGVyfHxpfHxufHwocj1lLmRlY29kZXIud3JpdGUociksdT0hZS5vYmplY3RNb2RlJiYwPT09ci5sZW5ndGgpLGl8fChlLnJlYWRpbmc9ITEpLHV8fChlLmZsb3dpbmcmJjA9PT1lLmxlbmd0aCYmIWUuc3luYz8odC5lbWl0KCJkYXRhIixyKSx0LnJlYWQoMCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgsaT9lLmJ1ZmZlci51bnNoaWZ0KHIpOmUuYnVmZmVyLnB1c2gociksZS5uZWVkUmVhZGFibGUmJkFpKHQpKSksZnVuY3Rpb24odCxlKXtlLnJlYWRpbmdNb3JlfHwoZS5yZWFkaW5nTW9yZT0hMCxjKE1pLHQsZSkpfSh0LGUpfWVsc2UgaXx8KGUucmVhZGluZz0hMSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiF0LmVuZGVkJiYodC5uZWVkUmVhZGFibGV8fHQubGVuZ3RoPHQuaGlnaFdhdGVyTWFya3x8MD09PXQubGVuZ3RoKX0oZSl9VnQoamksTCksamkucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiByLm9iamVjdE1vZGV8fCJzdHJpbmciIT10eXBlb2YgdHx8KGU9ZXx8ci5kZWZhdWx0RW5jb2RpbmcpIT09ci5lbmNvZGluZyYmKHQ9YXQuZnJvbSh0LGUpLGU9IiIpLFRpKHRoaXMscix0LGUsITEpfSxqaS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4gVGkodGhpcyx0aGlzLl9yZWFkYWJsZVN0YXRlLHQsIiIsITApfSxqaS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30samkucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9bmV3IG1pKHQpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2Rpbmc9dCx0aGlzfTtmdW5jdGlvbiBPaSh0LGUpe3JldHVybiB0PD0wfHwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/MDplLm9iamVjdE1vZGU/MTp0IT10P2UuZmxvd2luZyYmZS5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDplLmxlbmd0aDoodD5lLmhpZ2hXYXRlck1hcmsmJihlLmhpZ2hXYXRlck1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTgzODg2MDg/dD04Mzg4NjA4Oih0LS0sdHw9dD4+PjEsdHw9dD4+PjIsdHw9dD4+PjQsdHw9dD4+PjgsdHw9dD4+PjE2LHQrKyksdH0odCkpLHQ8PWUubGVuZ3RoP3Q6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIEFpKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7ZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fChraSgiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz9jKENpLHQpOkNpKHQpKX1mdW5jdGlvbiBDaSh0KXtraSgiZW1pdCByZWFkYWJsZSIpLHQuZW1pdCgicmVhZGFibGUiKSxCaSh0KX1mdW5jdGlvbiBNaSh0LGUpe2Zvcih2YXIgcj1lLmxlbmd0aDshZS5yZWFkaW5nJiYhZS5mbG93aW5nJiYhZS5lbmRlZCYmZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrJiYoa2koIm1heWJlUmVhZE1vcmUgcmVhZCAwIiksdC5yZWFkKDApLHIhPT1lLmxlbmd0aCk7KXI9ZS5sZW5ndGg7ZS5yZWFkaW5nTW9yZT0hMX1mdW5jdGlvbiB4aSh0KXtraSgicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwIiksdC5yZWFkKDApfWZ1bmN0aW9uIExpKHQsZSl7ZS5yZWFkaW5nfHwoa2koInJlc3VtZSByZWFkIDAiKSx0LnJlYWQoMCkpLGUucmVzdW1lU2NoZWR1bGVkPSExLGUuYXdhaXREcmFpbj0wLHQuZW1pdCgicmVzdW1lIiksQmkodCksZS5mbG93aW5nJiYhZS5yZWFkaW5nJiZ0LnJlYWQoMCl9ZnVuY3Rpb24gQmkodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtmb3Ioa2koImZsb3ciLGUuZmxvd2luZyk7ZS5mbG93aW5nJiZudWxsIT09dC5yZWFkKCk7KTt9ZnVuY3Rpb24gUGkodCxlKXtyZXR1cm4gMD09PWUubGVuZ3RoP251bGw6KGUub2JqZWN0TW9kZT9yPWUuYnVmZmVyLnNoaWZ0KCk6IXR8fHQ+PWUubGVuZ3RoPyhyPWUuZGVjb2Rlcj9lLmJ1ZmZlci5qb2luKCIiKToxPT09ZS5idWZmZXIubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YTplLmJ1ZmZlci5jb25jYXQoZS5sZW5ndGgpLGUuYnVmZmVyLmNsZWFyKCkpOnI9ZnVuY3Rpb24odCxlLHIpe3ZhciBuO3Q8ZS5oZWFkLmRhdGEubGVuZ3RoPyhuPWUuaGVhZC5kYXRhLnNsaWNlKDAsdCksZS5oZWFkLmRhdGE9ZS5oZWFkLmRhdGEuc2xpY2UodCkpOm49dD09PWUuaGVhZC5kYXRhLmxlbmd0aD9lLnNoaWZ0KCk6cj9mdW5jdGlvbih0LGUpe3ZhciByPWUuaGVhZCxuPTEsaT1yLmRhdGE7dC09aS5sZW5ndGg7Zm9yKDtyPXIubmV4dDspe3ZhciBvPXIuZGF0YSxhPXQ+by5sZW5ndGg/by5sZW5ndGg6dDtpZihhPT09by5sZW5ndGg/aSs9bzppKz1vLnNsaWNlKDAsdCksMD09PSh0LT1hKSl7YT09PW8ubGVuZ3RoPygrK24sci5uZXh0P2UuaGVhZD1yLm5leHQ6ZS5oZWFkPWUudGFpbD1udWxsKTooZS5oZWFkPXIsci5kYXRhPW8uc2xpY2UoYSkpO2JyZWFrfSsrbn1yZXR1cm4gZS5sZW5ndGgtPW4saX0odCxlKTpmdW5jdGlvbih0LGUpe3ZhciByPWF0LmFsbG9jVW5zYWZlKHQpLG49ZS5oZWFkLGk9MTtuLmRhdGEuY29weShyKSx0LT1uLmRhdGEubGVuZ3RoO2Zvcig7bj1uLm5leHQ7KXt2YXIgbz1uLmRhdGEsYT10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoby5jb3B5KHIsci5sZW5ndGgtdCwwLGEpLDA9PT0odC09YSkpe2E9PT1vLmxlbmd0aD8oKytpLG4ubmV4dD9lLmhlYWQ9bi5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1uLG4uZGF0YT1vLnNsaWNlKGEpKTticmVha30rK2l9cmV0dXJuIGUubGVuZ3RoLT1pLHJ9KHQsZSk7cmV0dXJuIG59KHQsZS5idWZmZXIsZS5kZWNvZGVyKSxyKTt2YXIgcn1mdW5jdGlvbiBVaSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLGMoTmksZSx0KSl9ZnVuY3Rpb24gTmkodCxlKXt0LmVuZEVtaXR0ZWR8fDAhPT10Lmxlbmd0aHx8KHQuZW5kRW1pdHRlZD0hMCxlLnJlYWRhYmxlPSExLGUuZW1pdCgiZW5kIikpfWZ1bmN0aW9uIERpKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIElpKCl7fWZ1bmN0aW9uIHFpKHQsZSxyKXt0aGlzLmNodW5rPXQsdGhpcy5lbmNvZGluZz1lLHRoaXMuY2FsbGJhY2s9cix0aGlzLm5leHQ9bnVsbH1mdW5jdGlvbiBGaSh0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJidWZmZXIiLHtnZXQ6WHQoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCl9KSwiX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgaW5zdGVhZC4iKX0pLHQ9dHx8e30sdGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLGUgaW5zdGFuY2VvZiBRaSYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC53cml0YWJsZU9iamVjdE1vZGUpO3ZhciByPXQuaGlnaFdhdGVyTWFyayxuPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9cnx8MD09PXI/cjpuLHRoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyayx0aGlzLm5lZWREcmFpbj0hMSx0aGlzLmVuZGluZz0hMSx0aGlzLmVuZGVkPSExLHRoaXMuZmluaXNoZWQ9ITE7dmFyIGk9ITE9PT10LmRlY29kZVN0cmluZ3M7dGhpcy5kZWNvZGVTdHJpbmdzPSFpLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5sZW5ndGg9MCx0aGlzLndyaXRpbmc9ITEsdGhpcy5jb3JrZWQ9MCx0aGlzLnN5bmM9ITAsdGhpcy5idWZmZXJQcm9jZXNzaW5nPSExLHRoaXMub253cml0ZT1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49ci5zeW5jLGk9ci53cml0ZWNiO2lmKGZ1bmN0aW9uKHQpe3Qud3JpdGluZz0hMSx0LndyaXRlY2I9bnVsbCx0Lmxlbmd0aC09dC53cml0ZWxlbix0LndyaXRlbGVuPTB9KHIpLGUpIWZ1bmN0aW9uKHQsZSxyLG4saSl7LS1lLnBlbmRpbmdjYixyP2MoaSxuKTppKG4pO3QuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHQuZW1pdCgiZXJyb3IiLG4pfSh0LHIsbixlLGkpO2Vsc2V7dmFyIG89SGkocik7b3x8ci5jb3JrZWR8fHIuYnVmZmVyUHJvY2Vzc2luZ3x8IXIuYnVmZmVyZWRSZXF1ZXN0fHwkaSh0LHIpLG4/YyhZaSx0LHIsbyxpKTpZaSh0LHIsbyxpKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFZpKHRoaXMpfWZ1bmN0aW9uIFdpKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFdpfHx0aGlzIGluc3RhbmNlb2YgUWkpKXJldHVybiBuZXcgV2kodCk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgRmkodCx0aGlzKSx0aGlzLndyaXRhYmxlPSEwLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZSYmKHRoaXMuX3dyaXRlPXQud3JpdGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRldiYmKHRoaXMuX3dyaXRldj10LndyaXRldikpLEwuY2FsbCh0aGlzKX1mdW5jdGlvbiB6aSh0LGUscixuLGksbyxhKXtlLndyaXRlbGVuPW4sZS53cml0ZWNiPWEsZS53cml0aW5nPSEwLGUuc3luYz0hMCxyP3QuX3dyaXRldihpLGUub253cml0ZSk6dC5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIFlpKHQsZSxyLG4pe3J8fGZ1bmN0aW9uKHQsZSl7MD09PWUubGVuZ3RoJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHQuZW1pdCgiZHJhaW4iKSl9KHQsZSksZS5wZW5kaW5nY2ItLSxuKCksR2kodCxlKX1mdW5jdGlvbiAkaSh0LGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgcj1lLmJ1ZmZlcmVkUmVxdWVzdDtpZih0Ll93cml0ZXYmJnImJnIubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9cjtmb3IodmFyIGE9MDtyOylpW2FdPXIscj1yLm5leHQsYSs9MTt6aSh0LGUsITAsZS5sZW5ndGgsaSwiIixvLmZpbmlzaCksZS5wZW5kaW5nY2IrKyxlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCxvLm5leHQ/KGUuY29ya2VkUmVxdWVzdHNGcmVlPW8ubmV4dCxvLm5leHQ9bnVsbCk6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFZpKGUpfWVsc2V7Zm9yKDtyOyl7dmFyIHM9ci5jaHVuayx1PXIuZW5jb2RpbmcsZj1yLmNhbGxiYWNrO2lmKHppKHQsZSwhMSxlLm9iamVjdE1vZGU/MTpzLmxlbmd0aCxzLHUsZikscj1yLm5leHQsZS53cml0aW5nKWJyZWFrfW51bGw9PT1yJiYoZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwpfWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCxlLmJ1ZmZlcmVkUmVxdWVzdD1yLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiBIaSh0KXtyZXR1cm4gdC5lbmRpbmcmJjA9PT10Lmxlbmd0aCYmbnVsbD09PXQuYnVmZmVyZWRSZXF1ZXN0JiYhdC5maW5pc2hlZCYmIXQud3JpdGluZ31mdW5jdGlvbiBKaSh0LGUpe2UucHJlZmluaXNoZWR8fChlLnByZWZpbmlzaGVkPSEwLHQuZW1pdCgicHJlZmluaXNoIikpfWZ1bmN0aW9uIEdpKHQsZSl7dmFyIHI9SGkoZSk7cmV0dXJuIHImJigwPT09ZS5wZW5kaW5nY2I/KEppKHQsZSksZS5maW5pc2hlZD0hMCx0LmVtaXQoImZpbmlzaCIpKTpKaSh0LGUpKSxyfWZ1bmN0aW9uIFZpKHQpe3ZhciBlPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKHIpe3ZhciBuPWUuZW50cnk7Zm9yKGUuZW50cnk9bnVsbDtuOyl7dmFyIGk9bi5jYWxsYmFjazt0LnBlbmRpbmdjYi0tLGkociksbj1uLm5leHR9dC5jb3JrZWRSZXF1ZXN0c0ZyZWU/dC5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1lOnQuY29ya2VkUmVxdWVzdHNGcmVlPWV9fWppLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe2tpKCJyZWFkIix0KSx0PXBhcnNlSW50KHQsMTApO3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj10O2lmKDAhPT10JiYoZS5lbWl0dGVkUmVhZGFibGU9ITEpLDA9PT10JiZlLm5lZWRSZWFkYWJsZSYmKGUubGVuZ3RoPj1lLmhpZ2hXYXRlck1hcmt8fGUuZW5kZWQpKXJldHVybiBraSgicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/VWkodGhpcyk6QWkodGhpcyksbnVsbDtpZigwPT09KHQ9T2kodCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmVWkodGhpcyksbnVsbDt2YXIgbixpPWUubmVlZFJlYWRhYmxlO3JldHVybiBraSgibmVlZCByZWFkYWJsZSIsaSksKDA9PT1lLmxlbmd0aHx8ZS5sZW5ndGgtdDxlLmhpZ2hXYXRlck1hcmspJiZraSgibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLGk9ITApLGUuZW5kZWR8fGUucmVhZGluZz9raSgicmVhZGluZyBvciBlbmRlZCIsaT0hMSk6aSYmKGtpKCJkbyByZWFkIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCwwPT09ZS5sZW5ndGgmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fCh0PU9pKHIsZSkpKSxudWxsPT09KG49dD4wP1BpKHQsZSk6bnVsbCk/KGUubmVlZFJlYWRhYmxlPSEwLHQ9MCk6ZS5sZW5ndGgtPXQsMD09PWUubGVuZ3RoJiYoZS5lbmRlZHx8KGUubmVlZFJlYWRhYmxlPSEwKSxyIT09dCYmZS5lbmRlZCYmVWkodGhpcykpLG51bGwhPT1uJiZ0aGlzLmVtaXQoImRhdGEiLG4pLG59LGppLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0samkucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2gobi5waXBlc0NvdW50KXtjYXNlIDA6bi5waXBlcz10O2JyZWFrO2Nhc2UgMTpuLnBpcGVzPVtuLnBpcGVzLHRdO2JyZWFrO2RlZmF1bHQ6bi5waXBlcy5wdXNoKHQpfW4ucGlwZXNDb3VudCs9MSxraSgicGlwZSBjb3VudD0lZCBvcHRzPSVqIixuLnBpcGVzQ291bnQsZSk7dmFyIGk9IWV8fCExIT09ZS5lbmQ/YTpmO2Z1bmN0aW9uIG8odCl7a2koIm9udW5waXBlIiksdD09PXImJmYoKX1mdW5jdGlvbiBhKCl7a2koIm9uZW5kIiksdC5lbmQoKX1uLmVuZEVtaXR0ZWQ/YyhpKTpyLm9uY2UoImVuZCIsaSksdC5vbigidW5waXBlIixvKTt2YXIgcz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2tpKCJwaXBlT25EcmFpbiIsZS5hd2FpdERyYWluKSxlLmF3YWl0RHJhaW4mJmUuYXdhaXREcmFpbi0tLDA9PT1lLmF3YWl0RHJhaW4mJnQubGlzdGVuZXJzKCJkYXRhIikubGVuZ3RoJiYoZS5mbG93aW5nPSEwLEJpKHQpKX19KHIpO3Qub24oImRyYWluIixzKTt2YXIgdT0hMTtmdW5jdGlvbiBmKCl7a2koImNsZWFudXAiKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIscCksdC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixnKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIscyksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGQpLHQucmVtb3ZlTGlzdGVuZXIoInVucGlwZSIsbyksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGYpLHIucmVtb3ZlTGlzdGVuZXIoImRhdGEiLGwpLHU9ITAsIW4uYXdhaXREcmFpbnx8dC5fd3JpdGFibGVTdGF0ZSYmIXQuX3dyaXRhYmxlU3RhdGUubmVlZERyYWlufHxzKCl9dmFyIGg9ITE7ZnVuY3Rpb24gbChlKXtraSgib25kYXRhIiksaD0hMSwhMSE9PXQud3JpdGUoZSl8fGh8fCgoMT09PW4ucGlwZXNDb3VudCYmbi5waXBlcz09PXR8fG4ucGlwZXNDb3VudD4xJiYtMSE9PURpKG4ucGlwZXMsdCkpJiYhdSYmKGtpKCJmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UiLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbiksci5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKyssaD0hMCksci5wYXVzZSgpKX1mdW5jdGlvbiBkKGUpe3ZhciByO2tpKCJvbmVycm9yIixlKSx5KCksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGQpLDA9PT0ocj0iZXJyb3IiLHQubGlzdGVuZXJzKHIpLmxlbmd0aCkmJnQuZW1pdCgiZXJyb3IiLGUpfWZ1bmN0aW9uIHAoKXt0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLGcpLHkoKX1mdW5jdGlvbiBnKCl7a2koIm9uZmluaXNoIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLHkoKX1mdW5jdGlvbiB5KCl7a2koInVucGlwZSIpLHIudW5waXBlKHQpfXJldHVybiByLm9uKCJkYXRhIixsKSxmdW5jdGlvbih0LGUscil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQucHJlcGVuZExpc3RlbmVyKXJldHVybiB0LnByZXBlbmRMaXN0ZW5lcihlLHIpO3QuX2V2ZW50cyYmdC5fZXZlbnRzW2VdP0FycmF5LmlzQXJyYXkodC5fZXZlbnRzW2VdKT90Ll9ldmVudHNbZV0udW5zaGlmdChyKTp0Ll9ldmVudHNbZV09W3IsdC5fZXZlbnRzW2VdXTp0Lm9uKGUscil9KHQsImVycm9yIixkKSx0Lm9uY2UoImNsb3NlIixwKSx0Lm9uY2UoImZpbmlzaCIsZyksdC5lbWl0KCJwaXBlIixyKSxuLmZsb3dpbmd8fChraSgicGlwZSByZXN1bWUiKSxyLnJlc3VtZSgpKSx0fSxqaS5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGU7aWYoMD09PWUucGlwZXNDb3VudClyZXR1cm4gdGhpcztpZigxPT09ZS5waXBlc0NvdW50KXJldHVybiB0JiZ0IT09ZS5waXBlc3x8KHR8fCh0PWUucGlwZXMpLGUucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITEsdCYmdC5lbWl0KCJ1bnBpcGUiLHRoaXMpKSx0aGlzO2lmKCF0KXt2YXIgcj1lLnBpcGVzLG49ZS5waXBlc0NvdW50O2UucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITE7Zm9yKHZhciBpPTA7aTxuO2krKylyW2ldLmVtaXQoInVucGlwZSIsdGhpcyk7cmV0dXJuIHRoaXN9dmFyIG89RGkoZS5waXBlcyx0KTtyZXR1cm4tMT09PW98fChlLnBpcGVzLnNwbGljZShvLDEpLGUucGlwZXNDb3VudC09MSwxPT09ZS5waXBlc0NvdW50JiYoZS5waXBlcz1lLnBpcGVzWzBdKSx0LmVtaXQoInVucGlwZSIsdGhpcykpLHRoaXN9LGppLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe3ZhciByPUwucHJvdG90eXBlLm9uLmNhbGwodGhpcyx0LGUpO2lmKCJkYXRhIj09PXQpITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJnRoaXMucmVzdW1lKCk7ZWxzZSBpZigicmVhZGFibGUiPT09dCl7dmFyIG49dGhpcy5fcmVhZGFibGVTdGF0ZTtuLmVuZEVtaXR0ZWR8fG4ucmVhZGFibGVMaXN0ZW5pbmd8fChuLnJlYWRhYmxlTGlzdGVuaW5nPW4ubmVlZFJlYWRhYmxlPSEwLG4uZW1pdHRlZFJlYWRhYmxlPSExLG4ucmVhZGluZz9uLmxlbmd0aCYmQWkodGhpcyk6Yyh4aSx0aGlzKSl9cmV0dXJuIHJ9LGppLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1qaS5wcm90b3R5cGUub24samkucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHQuZmxvd2luZ3x8KGtpKCJyZXN1bWUiKSx0LmZsb3dpbmc9ITAsZnVuY3Rpb24odCxlKXtlLnJlc3VtZVNjaGVkdWxlZHx8KGUucmVzdW1lU2NoZWR1bGVkPSEwLGMoTGksdCxlKSl9KHRoaXMsdCkpLHRoaXN9LGppLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiBraSgiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoa2koInBhdXNlIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdCgicGF1c2UiKSksdGhpc30samkucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPSExLG49dGhpcztmb3IodmFyIGkgaW4gdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtpZihraSgid3JhcHBlZCBlbmQiKSxlLmRlY29kZXImJiFlLmVuZGVkKXt2YXIgdD1lLmRlY29kZXIuZW5kKCk7dCYmdC5sZW5ndGgmJm4ucHVzaCh0KX1uLnB1c2gobnVsbCl9KSksdC5vbigiZGF0YSIsKGZ1bmN0aW9uKGkpeyhraSgid3JhcHBlZCBkYXRhIiksZS5kZWNvZGVyJiYoaT1lLmRlY29kZXIud3JpdGUoaSkpLGUub2JqZWN0TW9kZSYmbnVsbD09aSl8fChlLm9iamVjdE1vZGV8fGkmJmkubGVuZ3RoKSYmKG4ucHVzaChpKXx8KHI9ITAsdC5wYXVzZSgpKSl9KSksdCl2b2lkIDA9PT10aGlzW2ldJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKHRoaXNbaV09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0oaSkpO3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKyllKHRbcl0scil9KFsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdLChmdW5jdGlvbihlKXt0Lm9uKGUsbi5lbWl0LmJpbmQobixlKSl9KSksbi5fcmVhZD1mdW5jdGlvbihlKXtraSgid3JhcHBlZCBfcmVhZCIsZSksciYmKHI9ITEsdC5yZXN1bWUoKSl9LG59LGppLl9mcm9tTGlzdD1QaSxXaS5Xcml0YWJsZVN0YXRlPUZpLFZ0KFdpLEwpLEZpLnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5idWZmZXJlZFJlcXVlc3QsZT1bXTt0OyllLnB1c2godCksdD10Lm5leHQ7cmV0dXJuIGV9LFdpLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIikpfSxXaS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLGF0LmlzQnVmZmVyKHQpP2U9ImJ1ZmZlciI6ZXx8KGU9bi5kZWZhdWx0RW5jb2RpbmcpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiYocj1JaSksbi5lbmRlZD9mdW5jdGlvbih0LGUpe3ZhciByPW5ldyBFcnJvcigid3JpdGUgYWZ0ZXIgZW5kIik7dC5lbWl0KCJlcnJvciIsciksYyhlLHIpfSh0aGlzLHIpOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPSEwLG89ITE7cmV0dXJuIG51bGw9PT1yP289bmV3IFR5cGVFcnJvcigiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0iKTphdC5pc0J1ZmZlcihyKXx8InN0cmluZyI9PXR5cGVvZiByfHx2b2lkIDA9PT1yfHxlLm9iamVjdE1vZGV8fChvPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSksbyYmKHQuZW1pdCgiZXJyb3IiLG8pLGMobixvKSxpPSExKSxpfSh0aGlzLG4sdCxyKSYmKG4ucGVuZGluZ2NiKyssaT1mdW5jdGlvbih0LGUscixuLGkpe3I9ZnVuY3Rpb24odCxlLHIpe3Qub2JqZWN0TW9kZXx8ITE9PT10LmRlY29kZVN0cmluZ3N8fCJzdHJpbmciIT10eXBlb2YgZXx8KGU9YXQuZnJvbShlLHIpKTtyZXR1cm4gZX0oZSxyLG4pLGF0LmlzQnVmZmVyKHIpJiYobj0iYnVmZmVyIik7dmFyIG89ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGg7ZS5sZW5ndGgrPW87dmFyIGE9ZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrO2F8fChlLm5lZWREcmFpbj0hMCk7aWYoZS53cml0aW5nfHxlLmNvcmtlZCl7dmFyIHM9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O2UubGFzdEJ1ZmZlcmVkUmVxdWVzdD1uZXcgcWkocixuLGkpLHM/cy5uZXh0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDplLmJ1ZmZlcmVkUmVxdWVzdD1lLmxhc3RCdWZmZXJlZFJlcXVlc3QsZS5idWZmZXJlZFJlcXVlc3RDb3VudCs9MX1lbHNlIHppKHQsZSwhMSxvLHIsbixpKTtyZXR1cm4gYX0odGhpcyxuLHQsZSxyKSksaX0sV2kucHJvdG90eXBlLmNvcms9ZnVuY3Rpb24oKXt0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrfSxXaS5wcm90b3R5cGUudW5jb3JrPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fd3JpdGFibGVTdGF0ZTt0LmNvcmtlZCYmKHQuY29ya2VkLS0sdC53cml0aW5nfHx0LmNvcmtlZHx8dC5maW5pc2hlZHx8dC5idWZmZXJQcm9jZXNzaW5nfHwhdC5idWZmZXJlZFJlcXVlc3R8fCRpKHRoaXMsdCkpfSxXaS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC50b0xvd2VyQ2FzZSgpKSwhKFsiaGV4IiwidXRmOCIsInV0Zi04IiwiYXNjaWkiLCJiaW5hcnkiLCJiYXNlNjQiLCJ1Y3MyIiwidWNzLTIiLCJ1dGYxNmxlIiwidXRmLTE2bGUiLCJyYXciXS5pbmRleE9mKCh0KyIiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2Rpbmc9dCx0aGlzfSxXaS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXtyKG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIikpfSxXaS5wcm90b3R5cGUuX3dyaXRldj1udWxsLFdpLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGU7ImZ1bmN0aW9uIj09dHlwZW9mIHQ/KHI9dCx0PW51bGwsZT1udWxsKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLG51bGwhPXQmJnRoaXMud3JpdGUodCxlKSxuLmNvcmtlZCYmKG4uY29ya2VkPTEsdGhpcy51bmNvcmsoKSksbi5lbmRpbmd8fG4uZmluaXNoZWR8fGZ1bmN0aW9uKHQsZSxyKXtlLmVuZGluZz0hMCxHaSh0LGUpLHImJihlLmZpbmlzaGVkP2Mocik6dC5vbmNlKCJmaW5pc2giLHIpKTtlLmVuZGVkPSEwLHQud3JpdGFibGU9ITF9KHRoaXMsbixyKX0sVnQoUWksamkpO2Zvcih2YXIgS2k9T2JqZWN0LmtleXMoV2kucHJvdG90eXBlKSxaaT0wO1ppPEtpLmxlbmd0aDtaaSsrKXt2YXIgWGk9S2lbWmldO1FpLnByb3RvdHlwZVtYaV18fChRaS5wcm90b3R5cGVbWGldPVdpLnByb3RvdHlwZVtYaV0pfWZ1bmN0aW9uIFFpKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFFpKSlyZXR1cm4gbmV3IFFpKHQpO2ppLmNhbGwodGhpcyx0KSxXaS5jYWxsKHRoaXMsdCksdCYmITE9PT10LnJlYWRhYmxlJiYodGhpcy5yZWFkYWJsZT0hMSksdCYmITE9PT10LndyaXRhYmxlJiYodGhpcy53cml0YWJsZT0hMSksdGhpcy5hbGxvd0hhbGZPcGVuPSEwLHQmJiExPT09dC5hbGxvd0hhbGZPcGVuJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExKSx0aGlzLm9uY2UoImVuZCIsdG8pfWZ1bmN0aW9uIHRvKCl7dGhpcy5hbGxvd0hhbGZPcGVufHx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHxjKGVvLHRoaXMpfWZ1bmN0aW9uIGVvKHQpe3QuZW5kKCl9ZnVuY3Rpb24gcm8odCl7dGhpcy5hZnRlclRyYW5zZm9ybT1mdW5jdGlvbihlLHIpe3JldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG49dC5fdHJhbnNmb3JtU3RhdGU7bi50cmFuc2Zvcm1pbmc9ITE7dmFyIGk9bi53cml0ZWNiO2lmKCFpKXJldHVybiB0LmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzIikpO24ud3JpdGVjaHVuaz1udWxsLG4ud3JpdGVjYj1udWxsLG51bGwhPXImJnQucHVzaChyKTtpKGUpO3ZhciBvPXQuX3JlYWRhYmxlU3RhdGU7by5yZWFkaW5nPSExLChvLm5lZWRSZWFkYWJsZXx8by5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrKSYmdC5fcmVhZChvLmhpZ2hXYXRlck1hcmspfSh0LGUscil9LHRoaXMubmVlZFRyYW5zZm9ybT0hMSx0aGlzLnRyYW5zZm9ybWluZz0hMSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlY2h1bms9bnVsbCx0aGlzLndyaXRlZW5jb2Rpbmc9bnVsbH1mdW5jdGlvbiBubyh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBubykpcmV0dXJuIG5ldyBubyh0KTtRaS5jYWxsKHRoaXMsdCksdGhpcy5fdHJhbnNmb3JtU3RhdGU9bmV3IHJvKHRoaXMpO3ZhciBlPXRoaXM7dGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGU9ITAsdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jPSExLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC50cmFuc2Zvcm0mJih0aGlzLl90cmFuc2Zvcm09dC50cmFuc2Zvcm0pLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZsdXNoJiYodGhpcy5fZmx1c2g9dC5mbHVzaCkpLHRoaXMub25jZSgicHJlZmluaXNoIiwoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goKGZ1bmN0aW9uKHQpe2lvKGUsdCl9KSk6aW8oZSl9KSl9ZnVuY3Rpb24gaW8odCxlKXtpZihlKXJldHVybiB0LmVtaXQoImVycm9yIixlKTt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49dC5fdHJhbnNmb3JtU3RhdGU7aWYoci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAiKTtpZihuLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gdC5wdXNoKG51bGwpfWZ1bmN0aW9uIG9vKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG9vKSlyZXR1cm4gbmV3IG9vKHQpO25vLmNhbGwodGhpcyx0KX1mdW5jdGlvbiBhbygpe0wuY2FsbCh0aGlzKX1mdW5jdGlvbiBzbyh0LGUscil7dD10fHxmdW5jdGlvbih0KXt0aGlzLnF1ZXVlKHQpfSxlPWV8fGZ1bmN0aW9uKCl7dGhpcy5xdWV1ZShudWxsKX07bGV0IG49ITEsaT0hMSxvPVtdLGE9ITEscz1uZXcgYW87ZnVuY3Rpb24gdSgpe2Zvcig7by5sZW5ndGgmJiFzLnBhdXNlZDspe2xldCB0PW8uc2hpZnQoKTtpZihudWxsPT09dClyZXR1cm4gcy5lbWl0KCJlbmQiKTtzLmVtaXQoImRhdGEiLHQpfX1mdW5jdGlvbiBmKCl7cy53cml0YWJsZT0hMSxlLmNhbGwocyksIXMucmVhZGFibGUmJnMuYXV0b0Rlc3Ryb3kmJnMuZGVzdHJveSgpfXJldHVybiBzLnJlYWRhYmxlPXMud3JpdGFibGU9ITAscy5wYXVzZWQ9ITEscy5hdXRvRGVzdHJveT0hKHImJiExPT09ci5hdXRvRGVzdHJveSkscy53cml0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSksIXMucGF1c2VkfSxzLnF1ZXVlPXMucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gYXx8KG51bGw9PT10JiYoYT0hMCksby5wdXNoKHQpLHUoKSksc30scy5vbigiZW5kIiwoZnVuY3Rpb24oKXtzLnJlYWRhYmxlPSExLCFzLndyaXRhYmxlJiZzLmF1dG9EZXN0cm95JiZSLm5leHRUaWNrKChmdW5jdGlvbigpe3MuZGVzdHJveSgpfSkpfSkpLHMuZW5kPWZ1bmN0aW9uKHQpe2lmKCFuKXJldHVybiBuPSEwLGFyZ3VtZW50cy5sZW5ndGgmJnMud3JpdGUodCksZigpLHN9LHMuZGVzdHJveT1mdW5jdGlvbigpe2lmKCFpKXJldHVybiBpPSEwLG49ITAsby5sZW5ndGg9MCxzLndyaXRhYmxlPXMucmVhZGFibGU9ITEscy5lbWl0KCJjbG9zZSIpLHN9LHMucGF1c2U9ZnVuY3Rpb24oKXtpZighcy5wYXVzZWQpcmV0dXJuIHMucGF1c2VkPSEwLHN9LHMucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHMucGF1c2VkJiYocy5wYXVzZWQ9ITEscy5lbWl0KCJyZXN1bWUiKSksdSgpLHMucGF1c2VkfHxzLmVtaXQoImRyYWluIiksc30sc31WdChubyxRaSksbm8ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxRaS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsdCxlKX0sbm8ucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIil9LG5vLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKG4ud3JpdGVjYj1yLG4ud3JpdGVjaHVuaz10LG4ud3JpdGVlbmNvZGluZz1lLCFuLnRyYW5zZm9ybWluZyl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTsobi5uZWVkVHJhbnNmb3JtfHxpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfX0sbm8ucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RyYW5zZm9ybVN0YXRlO251bGwhPT1lLndyaXRlY2h1bmsmJmUud3JpdGVjYiYmIWUudHJhbnNmb3JtaW5nPyhlLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLGUud3JpdGVlbmNvZGluZyxlLmFmdGVyVHJhbnNmb3JtKSk6ZS5uZWVkVHJhbnNmb3JtPSEwfSxWdChvbyxubyksb28ucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3IobnVsbCx0KX0sVnQoYW8sTCksYW8uUmVhZGFibGU9amksYW8uV3JpdGFibGU9V2ksYW8uRHVwbGV4PVFpLGFvLlRyYW5zZm9ybT1ubyxhby5QYXNzVGhyb3VnaD1vbyxhby5TdHJlYW09YW8sYW8ucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzO2Z1bmN0aW9uIG4oZSl7dC53cml0YWJsZSYmITE9PT10LndyaXRlKGUpJiZyLnBhdXNlJiZyLnBhdXNlKCl9ZnVuY3Rpb24gaSgpe3IucmVhZGFibGUmJnIucmVzdW1lJiZyLnJlc3VtZSgpfXIub24oImRhdGEiLG4pLHQub24oImRyYWluIixpKSx0Ll9pc1N0ZGlvfHxlJiYhMT09PWUuZW5kfHwoci5vbigiZW5kIixhKSxyLm9uKCJjbG9zZSIscykpO3ZhciBvPSExO2Z1bmN0aW9uIGEoKXtvfHwobz0hMCx0LmVuZCgpKX1mdW5jdGlvbiBzKCl7b3x8KG89ITAsImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmdC5kZXN0cm95KCkpfWZ1bmN0aW9uIHUodCl7aWYoZigpLDA9PT1MLmxpc3RlbmVyQ291bnQodGhpcywiZXJyb3IiKSl0aHJvdyB0fWZ1bmN0aW9uIGYoKXtyLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixuKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsaSksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxyLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIscyksci5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLHUpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIix1KSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGYpLHIucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixmKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZil9cmV0dXJuIHIub24oImVycm9yIix1KSx0Lm9uKCJlcnJvciIsdSksci5vbigiZW5kIixmKSxyLm9uKCJjbG9zZSIsZiksdC5vbigiY2xvc2UiLGYpLHQuZW1pdCgicGlwZSIsciksdH0sc28udGhyb3VnaD1zbztsZXQgdW89e3BhcnNlOmZ1bmN0aW9uKHQsZSl7bGV0IHIsbjtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2U9PT10OnQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmV4ZWM/dC5leGVjKGUpOiJib29sZWFuIj09dHlwZW9mIHR8fCJvYmplY3QiPT10eXBlb2YgdD90OiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0KGUpfWxldCBvPW5ldyBiaSxhPXNvKChmdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PWF0LmZyb20odCkpLG8ud3JpdGUodCl9KSwoZnVuY3Rpb24odCl7dCYmYS53cml0ZSh0KSxyJiZhLmVtaXQoImhlYWRlciIsciksbiYmYS5lbWl0KCJmb290ZXIiLG4pLGEucXVldWUobnVsbCl9KSk7ZnVuY3Rpb24gcyh0LGUpeyExIT09ciYmKHI9cnx8e30sclt0XT1lKSwhMSE9PW4mJiExPT09ciYmKG49bnx8e30sblt0XT1lKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoIi4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIkKiI9PT10P3tlbWl0S2V5OiEwfToiKiI9PT10fHwoIiI9PT10P3tyZWN1cnNlOiEwfTp0KX0pKSksdCYmdC5sZW5ndGh8fCh0PW51bGwpLG8ub25WYWx1ZT1mdW5jdGlvbihuKXtpZih0aGlzLnJvb3R8fChhLnJvb3Q9biksIXQpcmV0dXJuO2xldCBvPTAsdT0wLGY9ITEsaD0hMTtmb3IoO288dC5sZW5ndGg7KXtsZXQgZSxyPXRbb107aWYodSsrLHImJiFyLnJlY3Vyc2Upe2lmKGU9dT09PXRoaXMuc3RhY2subGVuZ3RoP3RoaXM6dGhpcy5zdGFja1t1XSwhZSlyZXR1cm47aWYoIWkocixlLmtleSkpcmV0dXJuIHZvaWQgcyhlLmtleSxuKTtmPSEhci5lbWl0S2V5LGg9ISFyLmVtaXRQYXRoLG8rK31lbHNle28rKztsZXQgcj10W29dO2lmKCFyKXJldHVybjtmb3IoOzspe2lmKGU9dT09PXRoaXMuc3RhY2subGVuZ3RoP3RoaXM6dGhpcy5zdGFja1t1XSwhZSlyZXR1cm47aWYoaShyLGUua2V5KSl7bysrLE9iamVjdC5pc0Zyb3plbih0aGlzLnN0YWNrW3VdKXx8KHRoaXMuc3RhY2tbdV0udmFsdWU9bnVsbCk7YnJlYWt9cyhlLmtleSxuKSx1Kyt9fX1pZihyJiYoYS5lbWl0KCJoZWFkZXIiLHIpLHI9ITEpLHUhPT10aGlzLnN0YWNrLmxlbmd0aClyZXR1cm47bGV0IGw9dGhpcy5zdGFjay5zbGljZSgxKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmtleX0pKS5jb25jYXQoW3RoaXMua2V5XSksYz1uO251bGwhPWMmJm51bGwhPShjPWU/ZShjLGwpOmMpJiYoKGZ8fGgpJiYoYz17dmFsdWU6Y30sZiYmKGMua2V5PXRoaXMua2V5KSxoJiYoYy5wYXRoPWwpKSxhLnF1ZXVlKGMpKSx0aGlzLnZhbHVlJiZkZWxldGUgdGhpcy52YWx1ZVt0aGlzLmtleV07Zm9yKGxldCB0IGluIHRoaXMuc3RhY2spT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbdF0pfHwodGhpcy5zdGFja1t0XS52YWx1ZT1udWxsKX0sby5fb25Ub2tlbj1vLm9uVG9rZW4sby5vblRva2VuPWZ1bmN0aW9uKGUscil7by5fb25Ub2tlbihlLHIpLDA9PT10aGlzLnN0YWNrLmxlbmd0aCYmYS5yb290JiYodHx8YS5xdWV1ZShhLnJvb3QpLGEucm9vdD1udWxsKX0sby5vbkVycm9yPWZ1bmN0aW9uKHQpe3QubWVzc2FnZS5pbmRleE9mKCJhdCBwb3NpdGlvbiIpPi0xJiYodC5tZXNzYWdlPSJJbnZhbGlkIEpTT04gKCIrdC5tZXNzYWdlKyIpIiksYS5lbWl0KCJlcnJvciIsdCl9LGF9fSxmbz1mdW5jdGlvbih0LGUpe3JldHVybiBmbz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IobGV0IHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiYodFtyXT1lW3JdKX0sZm8odCxlKX07bGV0IGhvLGxvPS9bXFwiXHUwMDAwLVx1MDAxZlx1MDA3Zi1cdTAwOWZcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vZyxjbz17IlxiIjoiXFxiIiwiXHQiOiJcXHQiLCJcbiI6IlxcbiIsIlxmIjoiXFxmIiwiXHIiOiJcXHIiLCciJzonXFwiJywiXFwiOiJcXFxcIn07ZnVuY3Rpb24gcG8odCl7cmV0dXJuIHQ/ImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbj9oby5Qcm9taXNlOmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnBpcGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlbW92ZUxpc3RlbmVyfSh0KT90Ll9yZWFkYWJsZVN0YXRlLm9iamVjdE1vZGU/aG8uUmVhZGFibGVPYmplY3Q6aG8uUmVhZGFibGVTdHJpbmc6QXJyYXkuaXNBcnJheSh0KT9oby5BcnJheToib2JqZWN0Ij09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBPYmplY3Q/aG8uT2JqZWN0OmhvLlByaW1pdGl2ZTpoby5QcmltaXRpdmV9IWZ1bmN0aW9uKHQpe3RbdC5BcnJheT0wXT0iQXJyYXkiLHRbdC5PYmplY3Q9MV09Ik9iamVjdCIsdFt0LlJlYWRhYmxlU3RyaW5nPTJdPSJSZWFkYWJsZVN0cmluZyIsdFt0LlJlYWRhYmxlT2JqZWN0PTNdPSJSZWFkYWJsZU9iamVjdCIsdFt0LlByaW1pdGl2ZT00XT0iUHJpbWl0aXZlIix0W3QuUHJvbWlzZT01XT0iUHJvbWlzZSJ9KGhvfHwoaG89e30pKTtsZXQgZ289W107Z29baG8uQXJyYXldPSJbIixnb1toby5PYmplY3RdPSJ7Iixnb1toby5SZWFkYWJsZVN0cmluZ109JyInLGdvW2hvLlJlYWRhYmxlT2JqZWN0XT0iWyI7bGV0IHlvPVtdO3lvW2hvLkFycmF5XT0iXSIseW9baG8uT2JqZWN0XT0ifSIseW9baG8uUmVhZGFibGVTdHJpbmddPSciJyx5b1toby5SZWFkYWJsZU9iamVjdF09Il0iO2xldCBibz1bXTtmb3IobGV0IHQ9MCxlPU9iamVjdC5lbnRyaWVzKGhvKTt0PGUubGVuZ3RoO3QrKyl7bGV0IHI9ZVt0XSxuPXJbMF0saT1yWzFdOyJudW1iZXIiPT10eXBlb2YgaSYmKGJvW2ldPSJwcm9jZXNzIituKX1mdW5jdGlvbiB2byh0KXtyZXR1cm4gdC5yZXBsYWNlKGxvLChmdW5jdGlvbih0KXtsZXQgZT1jb1t0XTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/ZToiXFx1Iit0LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDQsIjAiKX0pKX1mdW5jdGlvbiB3byh0KXtyZXR1cm4nIicrdm8odCkrJyInfWZ1bmN0aW9uIG1vKHQsZSl7bGV0IHI9dC5yZWFkKGUpO3JldHVybiBudWxsPT09cj9uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxyKXtsZXQgbj1mdW5jdGlvbigpe3JldHVybiBlKG51bGwpfTt0Lm9uY2UoImVuZCIsbiksdC5vbmNlKCJlcnJvciIsciksdC5vbmNlKCJyZWFkYWJsZSIsKGZ1bmN0aW9uKCl7dC5yZW1vdmVMaXN0ZW5lcigiZW5kIixuKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsciksZSh0LnJlYWQoKSl9KSl9KSk6UHJvbWlzZS5yZXNvbHZlKHIpfWZ1bmN0aW9uIF9vKHQpe3JldHVybiB0LnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBwbyh0KT09PWhvLlByb21pc2U/X28odCk6dH0pKX1sZXQgU289ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLHIsbixpKXt2b2lkIDA9PT1pJiYoaT0hMSk7bGV0IG89dC5jYWxsKHRoaXMpfHx0aGlzO28uY3ljbGU9aSxvLnN0YWNrPVtdLG8uZGVwdGg9MCxvLnB1c2hDYWxsZWQ9ITEsby5lbmQ9ITEsby5pc1JlYWRpbmc9ITEsby5yZWFkTW9yZT0hMTtsZXQgYT10eXBlb2YgbjtyZXR1cm4ic3RyaW5nIiE9PWEmJiJudW1iZXIiIT09YXx8KG8uZ2FwPU51bWJlci5pc0Zpbml0ZShuKT8iICIucmVwZWF0KG4pOm4pLE9iamVjdC5hc3NpZ24obyx7dmlzaXRlZDppP25ldyBXZWFrTWFwOm5ldyBXZWFrU2V0LHJlcGxhY2VyRnVuY3Rpb246ciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZyLHJlcGxhY2VyQXJyYXk6QXJyYXkuaXNBcnJheShyKSYmcn0pLHIgaW5zdGFuY2VvZiBGdW5jdGlvbiYmKG8ucmVwbGFjZXJGdW5jdGlvbj1yKSxBcnJheS5pc0FycmF5KHIpJiYoby5yZXBsYWNlckFycmF5PXIpLG8uYWRkVG9TdGFjayhlKSxvfXJldHVybiBmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm8odCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihyLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgcil9KGUsdCksZS5wcm90b3R5cGUuY3ljbGVyPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcy52aXNpdGVkLmdldChlKTtpZihyKXJldHVybnskcmVmOnJ9O2xldCBuPXRoaXMucGF0aCgpO3JldHVybiB2b2lkIDAhPT10JiZuLnB1c2godCksbj1uLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIlsiKyhOdW1iZXIuaXNJbnRlZ2VyKHQpP3Q6d28odCkpKyJdIn0pKSx0aGlzLnZpc2l0ZWQuc2V0KGUsbi5sZW5ndGg/IiQiK24uam9pbigiIik6IiQiKSxlfSxlLnByb3RvdHlwZS5hZGRUb1N0YWNrPWZ1bmN0aW9uKHQsZSxyLG4pe2xldCBpLG8sYT10aGlzLHM9dDt0aGlzLnJlcGxhY2VyRnVuY3Rpb24mJihzPXRoaXMucmVwbGFjZXJGdW5jdGlvbihlfHxyLHMsdGhpcykpLHMmJnMudG9KU09OIGluc3RhbmNlb2YgRnVuY3Rpb24mJihzPXMudG9KU09OKCkpLChzIGluc3RhbmNlb2YgRnVuY3Rpb258fCJzeW1ib2wiPT10eXBlb2YgdCkmJihzPXZvaWQgMCksdm9pZCAwIT09ZSYmdGhpcy5yZXBsYWNlckFycmF5JiYodGhpcy5yZXBsYWNlckFycmF5LmluY2x1ZGVzKGUpfHwocz12b2lkIDApKTtsZXQgdT1wbyhzKTtpZigobiYmbi50eXBlPT09aG8uQXJyYXl8fHZvaWQgMCE9PXMpJiZ1IT09aG8uUHJvbWlzZSYmKG4mJiFuLmZpcnN0JiZ0aGlzLl9wdXNoKCIsIiksbiYmKG4uZmlyc3Q9ITEpKSx2b2lkIDAhPT1zJiZ1IT09aG8uUHJvbWlzZSYmZSYmKHRoaXMuZ2FwP3RoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkrJyInK3ZvKGUpKyciOiAnKTp0aGlzLl9wdXNoKCciJyt2byhlKSsnIjonKSksdSE9PWhvLlByaW1pdGl2ZSlpZih0aGlzLmN5Y2xlKXM9dGhpcy5jeWNsZXIoZXx8cixzKSx1PXBvKHMpO2Vsc2V7aWYodGhpcy52aXNpdGVkLmhhcyhzKSl0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcigiQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTiIpLHtyZWFsVmFsdWU6cyxrZXk6ZXx8cn0pO3RoaXMudmlzaXRlZC5hZGQocyl9IWUmJnI+LTEmJnRoaXMuZGVwdGgmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKTtsZXQgZj1nb1t1XTtmJiZ0aGlzLl9wdXNoKGYpO2xldCBoPXtrZXk6ZSxpbmRleDpyLHR5cGU6dSxwYXJlbnQ6bix2YWx1ZTpzLGZpcnN0OiEwfTtyZXR1cm4gdT09PWhvLk9iamVjdD8odGhpcy5kZXB0aCs9MSxoLnVucmVhZD1PYmplY3Qua2V5cyhzKSxoLmlzRW1wdHk9IWgudW5yZWFkLmxlbmd0aCk6dT09PWhvLkFycmF5Pyh0aGlzLmRlcHRoKz0xLGgudW5yZWFkPXMubGVuZ3RoLGguYXJyYXlMZW5ndGg9aC51bnJlYWQsaC5pc0VtcHR5PSFoLnVucmVhZCk6dSE9PWhvLlJlYWRhYmxlU3RyaW5nJiZ1IT09aG8uUmVhZGFibGVPYmplY3R8fCh0aGlzLmRlcHRoKz0xLHMucmVhZGFibGVFbmRlZHx8KG51bGw9PT0oaT1zLl9yZWFkYWJsZVN0YXRlKXx8dm9pZCAwPT09aT92b2lkIDA6aS5lbmRFbWl0dGVkKT90aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBoYXMgZW5kZWQgYmVmb3JlIGl0IHdhcyBzZXJpYWxpemVkLiBBbGwgc3RyZWFtIGRhdGEgaGF2ZSBiZWVuIGxvc3QiKSxzLGV8fHIpOihzLnJlYWRhYmxlRmxvd2luZ3x8KG51bGw9PT0obz1zLl9yZWFkYWJsZVN0YXRlKXx8dm9pZCAwPT09bz92b2lkIDA6by5mbG93aW5nKSkmJihzLnBhdXNlKCksdGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJSZWFkYWJsZSBTdHJlYW0gaXMgaW4gZmxvd2luZyBtb2RlLCBkYXRhIG1heSBoYXZlIGJlZW4gbG9zdC4gVHJ5aW5nIHRvIHBhdXNlIHN0cmVhbS4iKSxzLGV8fHIpKSxoLnJlYWRDb3VudD0wLHMub25jZSgiZW5kIiwoZnVuY3Rpb24oKXtoLmVuZD0hMCxhLl9fcmVhZCgpfSkpLHMub25jZSgiZXJyb3IiLChmdW5jdGlvbih0KXthLmVycm9yPSEwLGEuZW1pdCgiZXJyb3IiLHQpfSkpKSx0aGlzLnN0YWNrLnVuc2hpZnQoaCksaH0sZS5wcm90b3R5cGUucmVtb3ZlRnJvbVN0YWNrPWZ1bmN0aW9uKHQpe2xldCBlPXQudHlwZSxyPWU9PT1oby5PYmplY3R8fGU9PT1oby5BcnJheXx8ZT09PWhvLlJlYWRhYmxlU3RyaW5nfHxlPT09aG8uUmVhZGFibGVPYmplY3Q7ZSE9PWhvLlByaW1pdGl2ZSYmKHRoaXMuY3ljbGV8fHRoaXMudmlzaXRlZC5kZWxldGUodC52YWx1ZSksciYmKHRoaXMuZGVwdGgtPTEpKTtsZXQgbj15b1tlXTtyJiYhdC5pc0VtcHR5JiZ0aGlzLmdhcCYmdGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSksbiYmdGhpcy5fcHVzaChuKTtsZXQgaT10aGlzLnN0YWNrLmluZGV4T2YodCk7dGhpcy5zdGFjay5zcGxpY2UoaSwxKX0sZS5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSEwLHRoaXMucHVzaCh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlT2JqZWN0PWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIG1vKHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24oZSl7bnVsbCE9PWUmJih0LmZpcnN0fHxyLl9wdXNoKCIsIiksdC5maXJzdD0hMSxyLmFkZFRvU3RhY2soZSx2b2lkIDAsdC5yZWFkQ291bnQpLHQucmVhZENvdW50Kz0xKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc09iamVjdD1mdW5jdGlvbih0KXtpZighdC51bnJlYWQubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlRnJvbVN0YWNrKHQpO2xldCBlPXQudW5yZWFkLnNoaWZ0KCkscj10LnZhbHVlW2VdO3RoaXMuYWRkVG9TdGFjayhyLGUsdm9pZCAwLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzQXJyYXk9ZnVuY3Rpb24odCl7bGV0IGU9dC51bnJlYWQ7aWYoIWUpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IHI9dC5hcnJheUxlbmd0aC1lLG49dC52YWx1ZVtyXTt0LnVucmVhZC09MSx0aGlzLmFkZFRvU3RhY2sobix2b2lkIDAscix0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1ByaW1pdGl2ZT1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT10LnZhbHVlKXtsZXQgZSxyPXR5cGVvZiB0LnZhbHVlO3N3aXRjaChyKXtjYXNlInN0cmluZyI6ZT13byh0LnZhbHVlKTticmVhaztjYXNlIm51bWJlciI6ZT1OdW1iZXIuaXNGaW5pdGUodC52YWx1ZSk/U3RyaW5nKHQudmFsdWUpOiJudWxsIjticmVhaztjYXNlImJvb2xlYW4iOmU9U3RyaW5nKHQudmFsdWUpO2JyZWFrO2Nhc2Uib2JqZWN0Ijp0LnZhbHVlfHwoZT0ibnVsbCIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoJ1Vua25vd24gdHlwZSAiJytyKyciLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKSx7dmFsdWU6dC52YWx1ZX0pfXRoaXMuX3B1c2goZSl9ZWxzZSF0aGlzLnN0YWNrWzFdfHx0aGlzLnN0YWNrWzFdLnR5cGUhPT1oby5BcnJheSYmdGhpcy5zdGFja1sxXS50eXBlIT09aG8uUmVhZGFibGVPYmplY3Q/dC5hZGRTZXBhcmF0b3JBZnRlckVuZD0hMTp0aGlzLl9wdXNoKCJudWxsIik7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NSZWFkYWJsZVN0cmluZz1mdW5jdGlvbih0LGUpe2xldCByPXRoaXM7aWYoIXQuZW5kKXJldHVybiBtbyh0LnZhbHVlLGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3QmJnIuX3B1c2godm8odC50b1N0cmluZygpKSl9KSk7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NQcm9taXNlPWZ1bmN0aW9uKHQpe2xldCBlPXRoaXM7cmV0dXJuIF9vKHQudmFsdWUpLnRoZW4oKGZ1bmN0aW9uKHIpe2UucmVtb3ZlRnJvbVN0YWNrKHQpLGUuYWRkVG9TdGFjayhyLHQua2V5LHQuaW5kZXgsdC5wYXJlbnQpfSkpfSxlLnByb3RvdHlwZS5wcm9jZXNzU3RhY2tUb3BJdGVtPWZ1bmN0aW9uKHQpe2xldCBlLHI9dGhpcyxuPXRoaXMuc3RhY2tbMF07aWYoIW58fHRoaXMuZXJyb3IpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3RyeXtlPXRoaXNbYm9bbi50eXBlXV0obix0KX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKS50aGVuKChmdW5jdGlvbigpezA9PT1yLnN0YWNrLmxlbmd0aCYmKHIuZW5kPSEwLHIuX3B1c2gobnVsbCkpfSkpfSxlLnByb3RvdHlwZS5fX3JlYWQ9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztpZighdGhpcy5pc1JlYWRpbmcmJiF0aGlzLmVycm9yKXJldHVybiB0aGlzLmlzUmVhZGluZz0hMCx0aGlzLnJlYWRNb3JlPSExLHRoaXMucHJvY2Vzc1N0YWNrVG9wSXRlbSh0KS50aGVuKChmdW5jdGlvbigpeyFlLmVuZCYmIWUuZXJyb3ImJihlLnJlYWRNb3JlfHwhZS5wdXNoQ2FsbGVkKT9ibigoZnVuY3Rpb24oKXtlLmlzUmVhZGluZz0hMSxlLl9fcmVhZCgpfSkpOmUuaXNSZWFkaW5nPSExfSkpLmNhdGNoKChmdW5jdGlvbih0KXtlLmVycm9yPSEwLGUuZW1pdCgiZXJyb3IiLHQpfSkpO3RoaXMucmVhZE1vcmU9ITB9LGUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMucHVzaENhbGxlZD0hMSx0aGlzLl9fcmVhZCh0KX0sZS5wcm90b3R5cGUucGF0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YWNrLm1hcCgoZnVuY3Rpb24odCl7bGV0IGU9dC5rZXkscj10LmluZGV4O3JldHVybiBlfHxyfSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHR8fHQ+LTF9KSkucmV2ZXJzZSgpfSxlfShqaSk7dmFyIEVvPUFycmF5LmlzQXJyYXksa289Im9iamVjdCI9PXR5cGVvZiBqJiZqJiZqLk9iamVjdD09PU9iamVjdCYmaixSbz0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGpvPWtvfHxSb3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxUbz1qby5TeW1ib2wsT289T2JqZWN0LnByb3RvdHlwZSxBbz1Pby5oYXNPd25Qcm9wZXJ0eSxDbz1Pby50b1N0cmluZyxNbz1Ubz9Uby50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIHhvPWZ1bmN0aW9uKHQpe3ZhciBlPUFvLmNhbGwodCxNbykscj10W01vXTt0cnl7dFtNb109dm9pZCAwO3ZhciBuPSEwfWNhdGNoKHQpe312YXIgaT1Dby5jYWxsKHQpO3JldHVybiBuJiYoZT90W01vXT1yOmRlbGV0ZSB0W01vXSksaX0sTG89T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgQm89ZnVuY3Rpb24odCl7cmV0dXJuIExvLmNhbGwodCl9LFBvPVRvP1RvLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgVW89ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6UG8mJlBvIGluIE9iamVjdCh0KT94byh0KTpCbyh0KX07dmFyIE5vPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9O3ZhciBEbz1mdW5jdGlvbih0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fE5vKHQpJiYiW29iamVjdCBTeW1ib2xdIj09VW8odCl9LElvPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLHFvPS9eXHcqJC87dmFyIEZvPWZ1bmN0aW9uKHQsZSl7aWYoRW8odCkpcmV0dXJuITE7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9ciYmInN5bWJvbCIhPXImJiJib29sZWFuIiE9ciYmbnVsbCE9dCYmIURvKHQpKXx8KHFvLnRlc3QodCl8fCFJby50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIE9iamVjdChlKSl9O3ZhciBXbz1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX07dmFyIHpvLFlvPWZ1bmN0aW9uKHQpe2lmKCFXbyh0KSlyZXR1cm4hMTt2YXIgZT1Vbyh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LCRvPWpvWyJfX2NvcmUtanNfc2hhcmVkX18iXSxIbz0oem89L1teLl0rJC8uZXhlYygkbyYmJG8ua2V5cyYmJG8ua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK3pvOiIiO3ZhciBKbz1mdW5jdGlvbih0KXtyZXR1cm4hIUhvJiZIbyBpbiB0fSxHbz1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFZvPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gR28uY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9LEtvPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLFpvPUZ1bmN0aW9uLnByb3RvdHlwZSxYbz1PYmplY3QucHJvdG90eXBlLFFvPVpvLnRvU3RyaW5nLHRhPVhvLmhhc093blByb3BlcnR5LGVhPVJlZ0V4cCgiXiIrUW8uY2FsbCh0YSkucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIHJhPWZ1bmN0aW9uKHQpe3JldHVybiEoIVdvKHQpfHxKbyh0KSkmJihZbyh0KT9lYTpLbykudGVzdChWbyh0KSl9O3ZhciBuYT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfTt2YXIgaWE9ZnVuY3Rpb24odCxlKXt2YXIgcj1uYSh0LGUpO3JldHVybiByYShyKT9yOnZvaWQgMH0sb2E9aWEoT2JqZWN0LCJjcmVhdGUiKTt2YXIgYWE9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW9hP29hKG51bGwpOnt9LHRoaXMuc2l6ZT0wfTt2YXIgc2E9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LHVhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGZhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYob2Epe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gdWEuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxoYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBsYT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBvYT92b2lkIDAhPT1lW3RdOmhhLmNhbGwoZSx0KX07dmFyIGNhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1vYSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBkYSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1kYS5wcm90b3R5cGUuY2xlYXI9YWEsZGEucHJvdG90eXBlLmRlbGV0ZT1zYSxkYS5wcm90b3R5cGUuZ2V0PWZhLGRhLnByb3RvdHlwZS5oYXM9bGEsZGEucHJvdG90eXBlLnNldD1jYTt2YXIgcGE9ZGE7dmFyIGdhPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIHlhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfTt2YXIgYmE9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5sZW5ndGg7ci0tOylpZih5YSh0W3JdWzBdLGUpKXJldHVybiByO3JldHVybi0xfSx2YT1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciB3YT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9YmEoZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6dmEuY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfTt2YXIgbWE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPWJhKGUsdCk7cmV0dXJuIHI8MD92b2lkIDA6ZVtyXVsxXX07dmFyIF9hPWZ1bmN0aW9uKHQpe3JldHVybiBiYSh0aGlzLl9fZGF0YV9fLHQpPi0xfTt2YXIgU2E9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG49YmEocix0KTtyZXR1cm4gbjwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW25dWzFdPWUsdGhpc307ZnVuY3Rpb24gRWEodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19RWEucHJvdG90eXBlLmNsZWFyPWdhLEVhLnByb3RvdHlwZS5kZWxldGU9d2EsRWEucHJvdG90eXBlLmdldD1tYSxFYS5wcm90b3R5cGUuaGFzPV9hLEVhLnByb3RvdHlwZS5zZXQ9U2E7dmFyIGthPUVhLFJhPWlhKGpvLCJNYXAiKTt2YXIgamE9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBwYSxtYXA6bmV3KFJhfHxrYSksc3RyaW5nOm5ldyBwYX19O3ZhciBUYT1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fTt2YXIgT2E9ZnVuY3Rpb24odCxlKXt2YXIgcj10Ll9fZGF0YV9fO3JldHVybiBUYShlKT9yWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOnIubWFwfTt2YXIgQWE9ZnVuY3Rpb24odCl7dmFyIGU9T2EodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX07dmFyIENhPWZ1bmN0aW9uKHQpe3JldHVybiBPYSh0aGlzLHQpLmdldCh0KX07dmFyIE1hPWZ1bmN0aW9uKHQpe3JldHVybiBPYSh0aGlzLHQpLmhhcyh0KX07dmFyIHhhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9T2EodGhpcyx0KSxuPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bj8wOjEsdGhpc307ZnVuY3Rpb24gTGEodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19TGEucHJvdG90eXBlLmNsZWFyPWphLExhLnByb3RvdHlwZS5kZWxldGU9QWEsTGEucHJvdG90eXBlLmdldD1DYSxMYS5wcm90b3R5cGUuaGFzPU1hLExhLnByb3RvdHlwZS5zZXQ9eGE7dmFyIEJhPUxhO2Z1bmN0aW9uIFBhKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLG4pOm5bMF0sbz1yLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgYT10LmFwcGx5KHRoaXMsbik7cmV0dXJuIHIuY2FjaGU9by5zZXQoaSxhKXx8byxhfTtyZXR1cm4gci5jYWNoZT1uZXcoUGEuQ2FjaGV8fEJhKSxyfVBhLkNhY2hlPUJhO3ZhciBVYT1QYTt2YXIgTmE9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csRGE9L1xcKFxcKT8vZyxJYT1mdW5jdGlvbih0KXt2YXIgZT1VYSh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKE5hLChmdW5jdGlvbih0LHIsbixpKXtlLnB1c2gobj9pLnJlcGxhY2UoRGEsIiQxIik6cnx8dCl9KSksZX0pKTt2YXIgcWE9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShuKTsrK3I8bjspaVtyXT1lKHRbcl0scix0KTtyZXR1cm4gaX0sRmE9VG8/VG8ucHJvdG90eXBlOnZvaWQgMCxXYT1GYT9GYS50b1N0cmluZzp2b2lkIDA7dmFyIHphPWZ1bmN0aW9uIHQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO2lmKEVvKGUpKXJldHVybiBxYShlLHQpKyIiO2lmKERvKGUpKXJldHVybiBXYT9XYS5jYWxsKGUpOiIiO3ZhciByPWUrIiI7cmV0dXJuIjAiPT1yJiYxL2U9PS1JbmZpbml0eT8iLTAiOnJ9O3ZhciBZYT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjp6YSh0KX07dmFyICRhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEVvKHQpP3Q6Rm8odCxlKT9bdF06SWEoWWEodCkpfTt2YXIgSGE9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxEbyh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tSW5maW5pdHk/Ii0wIjplfTt2YXIgSmE9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxuPShlPSRhKGUsdCkpLmxlbmd0aDtudWxsIT10JiZyPG47KXQ9dFtIYShlW3IrK10pXTtyZXR1cm4gciYmcj09bj90OnZvaWQgMH07dmFyIEdhPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1udWxsPT10P3ZvaWQgMDpKYSh0LGUpO3JldHVybiB2b2lkIDA9PT1uP3I6bn07dmFyIFZhPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8Tm8odCkmJiJbb2JqZWN0IE51bWJlcl0iPT1Vbyh0KX07ZnVuY3Rpb24gS2EodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gWmEodCl7cmV0dXJuISghS2EodCl8fCIiPT09dCl9ZnVuY3Rpb24gWGEodCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBRYSh0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiB0cyh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBlcyh0KXtyZXR1cm4hKCFLYSh0KXx8IiIhPT10KX1mdW5jdGlvbiBycyh0KXtyZXR1cm4hIVFhKHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZih0cyh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFlcyh0KXx8ISFmdW5jdGlvbih0KXtyZXR1cm4hIVhhKHQpJiYwPT09dC5sZW5ndGh9KHQpKSkpfWZ1bmN0aW9uIG5zKCl7bGV0IHQsZSxyPW5ldyBQcm9taXNlKChmdW5jdGlvbigpe3Q9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdfSkpO3JldHVybiByLnJlc29sdmU9dCxyLnJlamVjdD1lLHJ9bGV0IFdKc29uU3RyZWFtPXtwYXJzZTphc3luYyBmdW5jdGlvbih0KXtpZighWmEodCkpcmV0dXJue307bGV0IGU9e307dHJ5e2U9SlNPTi5wYXJzZSh0KX1jYXRjaCh0KXtlPXt9fXJldHVybiBlfSxwYXJzZUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPXt9O2lmKCJudWxsIj09PXQpcmV0dXJuIG51bGw7aWYoIiI9PT10KXJldHVybnt9O2xldCByPSJfX3N5c3RlbV9fIixuPWB7Il9fc3lzdGVtX18iOiR7dH19YCxpPW5zKCksbz1SbihuKSxhPXVvLnBhcnNlKCIkKiIpO3JldHVybiBhLm9uKCJkYXRhIiwoZnVuY3Rpb24odCl7ZVt0LmtleV09dC52YWx1ZX0pKSxhLm9uKCJlbmQiLChmdW5jdGlvbigpe2xldCB0PUdhKGUscik7aS5yZXNvbHZlKHQpfSkpLGEub24oImVycm9yIiwoZnVuY3Rpb24odCl7aS5yZWplY3QodCl9KSksby5waXBlKGEpLGl9LGNyZWF0ZVBhcnNlU3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiBaYSh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuISghWGEodCl8fDA9PT10Lmxlbmd0aHx8MT09PXQubGVuZ3RoJiZycyh0WzBdKSl9KHQpfHwodD0iJCoiKSx1by5wYXJzZSh0KX0sc3RyaW5naWZ5OmFzeW5jIGZ1bmN0aW9uKHQpe2lmKFFhKHQpKXJldHVybiIiO2xldCBlPSIiO3RyeXtlPUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKHQpe2U9IiJ9cmV0dXJuIGV9LHN0cmluZ2lmeUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPSIiO2lmKFFhKHQpKXJldHVybiIiO2lmKG51bGw9PT10KXJldHVybiJudWxsIjtpZihlcyh0KSlyZXR1cm4nIiInO2lmKFZhKHQpKXJldHVybmAke3R9YDtpZihLYSh0KSlyZXR1cm5gIiR7dH0iYDtsZXQgcj1ucygpLG49bmV3IFNvKHQsbnVsbCxudWxsLCExKTtyZXR1cm4gbi5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UrPXR9KSksbi5vbigiZW5kIiwoZnVuY3Rpb24oKXtyLnJlc29sdmUoZSl9KSksbi5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtyLnJlamVjdCh0KX0pKSxyfSxjcmVhdGVTdHJpbmdpZnlTdHJlYW06ZnVuY3Rpb24odCl7aWYoIXRzKHQpJiYhWGEodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXkiKTtyZXR1cm4gbmV3IFNvKHQsbnVsbCxudWxsLCExKX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByID0gV0pzb25TdHJlYW0oLi4uaW5wdXQpCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSkKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0pzb25TdHJlYW0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZS5kYXRhKQoKICAgIC8vZGF0YVJlY3YKICAgIGxldCBkYXRhUmVjdiA9IGUuZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CiAgICAK");function V(){function l(l){var Z,d=window.URL||window.webkitURL;try{return Z=new Blob([l]),new Worker(d.createObjectURL(Z))}catch(l){console.log(l)}}var Z=l(y);if(null===Z)return console.log("invalid webworker"),null;function d(){Z.terminate(),Z=void 0}var m=W();function G(){var l={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};Z.postMessage(l)}function b(){var l=i(),d=u(),G={mode:"call",id:d,fun:"stringify",input:Array.prototype.slice.call(arguments)};return Z.postMessage(G),m.once(d,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function c(){var l=i(),d=u(),G={mode:"call",id:d,fun:"parse",input:Array.prototype.slice.call(arguments)};return Z.postMessage(G),m.once(d,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}return Z.onmessage=function(l){var Z=l.data,d=Z.mode;"emit"!==d&&"return"!==d||("emit"===d&&m.emit(Z.evName,Z.msg),"return"===d&&m.emit(Z.id,Z))},G(Array.prototype.slice.call(arguments)),m.stringify=b,m.parse=c,m.terminate=d,m}var p,h,I=null,a={stringify:(h=m(c.mark((function l(){var d,m,G,b=arguments;return c.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(b),m=V(),l.next=4,m.stringify.apply(m,Z(d)).finally((function(){m.terminate()}));case 4:return G=l.sent,l.abrupt("return",G);case 6:case"end":return l.stop()}}),l)}))),function(){return h.apply(this,arguments)}),parse:(p=m(c.mark((function l(){var d,m,G,b=arguments;return c.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(b),m=V(),l.next=4,m.parse.apply(m,Z(d)).finally((function(){m.terminate()}));case 4:return G=l.sent,l.abrupt("return",G);case 6:case"end":return l.stop()}}),l)}))),function(){return p.apply(this,arguments)})};for(var Y in I=W(),a){var R=a[Y];I[Y]=R}return I}));