w-json-stream 1.0.16 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +17 -17
- package/README.md +2 -2
- package/babel.config.js +1 -0
- package/dist/into-stream.umd.js +2 -2
- package/dist/into-stream.umd.js.map +1 -1
- package/dist/json-stream-stringify.umd.js +2 -2
- package/dist/json-stream-stringify.umd.js.map +1 -1
- package/dist/through.umd.js +2 -2
- package/dist/through.umd.js.map +1 -1
- package/dist/w-json-stream.umd.js +2 -2
- package/dist/w-json-stream.umd.js.map +1 -1
- package/dist/w-json-stream.wk.umd.js +1 -1
- package/docs/WJsonStream.mjs.html +5 -2
- package/docs/examples/ex-large-webworker.html +2 -2
- package/docs/examples/ex-large.html +3 -3
- package/docs/examples/ex-small-stream.html +2 -2
- package/docs/examples/ex-small.html +2 -2
- package/docs/examples/ex-stream-createParseStream.html +2 -2
- package/docs/examples/ex-stream-createParseStreamWithFilter.html +3 -3
- package/docs/examples/ex-stream-createStringifyStream.html +2 -2
- package/docs/global.html +62 -52
- package/docs/index.html +5 -2
- package/docs/scripts/collapse.js +19 -0
- package/docs/scripts/commonNav.js +28 -0
- package/docs/scripts/search.js +16 -0
- package/docs/styles/jsdoc.css +13 -2
- package/docs/styles/prettify.css +1 -0
- package/examples/ex-large-webworker.html +1 -1
- package/examples/ex-large.html +2 -2
- package/examples/ex-small-stream.html +1 -1
- package/examples/ex-small.html +1 -1
- package/examples/ex-stream-createParseStream.html +1 -1
- package/examples/ex-stream-createParseStreamWithFilter.html +1 -1
- package/examples/ex-stream-createStringifyStream.html +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(l,Z){"object"==typeof exports&&"undefined"!=typeof module?module.exports=Z(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],Z):(l="undefined"!=typeof globalThis?globalThis:l||self)["w-json-stream"]=Z(l.worker_threads)}(this,(function(l){"use strict";function Z(l){return l&&"object"==typeof l&&"default"in l?l:{default:l}}var d=Z(l);function m(l){return m="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},m(l)}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function c(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var b=c((function(l,Z){l.exports=function(l){function Z(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 d(l){return function(l){if(Array.isArray(l))return Z(l)}(l)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(l)||function(l,d){if(l){if("string"==typeof l)return Z(l,d);var m=Object.prototype.toString.call(l).slice(8,-1);return"Object"===m&&l.constructor&&(m=l.constructor.name),"Map"===m||"Set"===m?Array.from(l):"Arguments"===m||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(m)?Z(l,d):void 0}}(l)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(l,Z,d,m,c,b,G){try{var X=l[b](G),i=X.value}catch(l){return void d(l)}X.done?Z(i):Promise.resolve(i).then(m,c)}function b(l){return function(){var Z=this,d=arguments;return new Promise((function(m,b){var G=l.apply(Z,d);function X(l){c(G,m,b,X,i,"next",l)}function i(l){c(G,m,b,X,i,"throw",l)}X(void 0)}))}}function G(l){return G="function"==typeof Symbol&&"symbol"==m(Symbol.iterator)?function(l){return m(l)}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":m(l)},G(l)}function X(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var i,W=X((function(l){var Z=function(l){var Z,d=Object.prototype,m=d.hasOwnProperty,c="function"==typeof Symbol?Symbol:{},b=c.iterator||"@@iterator",X=c.asyncIterator||"@@asyncIterator",i=c.toStringTag||"@@toStringTag";function W(l,Z,d){return Object.defineProperty(l,Z,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[Z]}try{W({},"")}catch(l){W=function(l,Z,d){return l[Z]=d}}function u(l,Z,d,m){var c=Z&&Z.prototype instanceof n?Z:n,b=Object.create(c.prototype),G=new x(m||[]);return b._invoke=function(l,Z,d){var m=I;return function(c,b){if(m===V)throw new Error("Generator is already running");if(m===h){if("throw"===c)throw b;return g()}for(d.method=c,d.arg=b;;){var G=d.delegate;if(G){var X=H(G,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===I)throw m=h,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);m=V;var i=y(l,Z,d);if("normal"===i.type){if(m=d.done?h:p,i.arg===a)continue;return{value:i.arg,done:d.done}}"throw"===i.type&&(m=h,d.method="throw",d.arg=i.arg)}}}(l,d,G),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 I="suspendedStart",p="suspendedYield",V="executing",h="completed",a={};function n(){}function o(){}function K(){}var Y={};W(Y,b,(function(){return this}));var R=Object.getPrototypeOf,L=R&&R(R(T([])));L&&L!==d&&m.call(L,b)&&(Y=L);var s=K.prototype=n.prototype=Object.create(Y);function J(l){["next","throw","return"].forEach((function(Z){W(l,Z,(function(l){return this._invoke(Z,l)}))}))}function t(l,Z){function d(c,b,X,i){var W=y(l[c],l,b);if("throw"!==W.type){var u=W.arg,I=u.value;return I&&"object"===G(I)&&m.call(I,"__await")?Z.resolve(I.__await).then((function(l){d("next",l,X,i)}),(function(l){d("throw",l,X,i)})):Z.resolve(I).then((function(l){u.value=l,X(u)}),(function(l){return d("throw",l,X,i)}))}i(W.arg)}var c;this._invoke=function(l,m){function b(){return new Z((function(Z,c){d(l,m,Z,c)}))}return c=c?c.then(b,b):b()}}function H(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,H(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 c=y(m,l.iterator,d.arg);if("throw"===c.type)return d.method="throw",d.arg=c.arg,d.delegate=null,a;var b=c.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 S(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 x(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(S,this),this.reset(!0)}function T(l){if(l){var d=l[b];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var c=-1,G=function d(){for(;++c<l.length;)if(m.call(l,c))return d.value=l[c],d.done=!1,d;return d.value=Z,d.done=!0,d};return G.next=G}}return{next:g}}function g(){return{value:Z,done:!0}}return o.prototype=K,W(s,"constructor",K),W(K,"constructor",o),o.displayName=W(K,i,"GeneratorFunction"),l.isGeneratorFunction=function(l){var Z="function"==typeof l&&l.constructor;return!!Z&&(Z===o||"GeneratorFunction"===(Z.displayName||Z.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,K):(l.__proto__=K,W(l,i,"GeneratorFunction")),l.prototype=Object.create(s),l},l.awrap=function(l){return{__await:l}},J(t.prototype),W(t.prototype,X,(function(){return this})),l.AsyncIterator=t,l.async=function(Z,d,m,c,b){void 0===b&&(b=Promise);var G=new t(u(Z,d,m,c),b);return l.isGeneratorFunction(d)?G:G.next().then((function(l){return l.done?l.value:G.next()}))},J(s),W(s,i,"Generator"),W(s,b,(function(){return this})),W(s,"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,x.prototype={constructor:x,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 c(m,c){return X.type="throw",X.arg=l,d.next=m,c&&(d.method="next",d.arg=Z),!!c}for(var b=this.tryEntries.length-1;b>=0;--b){var G=this.tryEntries[b],X=G.completion;if("root"===G.tryLoc)return c("end");if(G.tryLoc<=this.prev){var i=m.call(G,"catchLoc"),W=m.call(G,"finallyLoc");if(i&&W){if(this.prev<G.catchLoc)return c(G.catchLoc,!0);if(this.prev<G.finallyLoc)return c(G.finallyLoc)}else if(i){if(this.prev<G.catchLoc)return c(G.catchLoc,!0)}else{if(!W)throw new Error("try statement without catch or finally");if(this.prev<G.finallyLoc)return c(G.finallyLoc)}}}},abrupt:function(l,Z){for(var d=this.tryEntries.length-1;d>=0;--d){var c=this.tryEntries[d];if(c.tryLoc<=this.prev&&m.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var b=c;break}}b&&("break"===l||"continue"===l)&&b.tryLoc<=Z&&Z<=b.finallyLoc&&(b=null);var G=b?b.completion:{};return G.type=l,G.arg=Z,b?(this.method="next",this.next=b.finallyLoc,a):this.complete(G)},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 c=m.arg;C(d)}return c}}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){"object"===("undefined"==typeof globalThis?"undefined":G(globalThis))?globalThis.regeneratorRuntime=Z:Function("r","regeneratorRuntime = r")(Z)}})),u=X((function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function c(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function b(l,Z,m,b,G){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new c(m,b||l,G),i=d?d+Z:Z;return l._events[i]?l._events[i].fn?l._events[i]=[l._events[i],X]:l._events[i].push(X):(l._events[i]=X,l._eventsCount++),l}function G(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,c=[];if(0===this._eventsCount)return c;for(m in l=this._events)Z.call(l,m)&&c.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(l)):c},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 c=0,b=m.length,G=new Array(b);c<b;c++)G[c]=m[c].fn;return G},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,c,b,G){var X=d?d+l:l;if(!this._events[X])return!1;var i,W,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,c),!0;case 5:return u.fn.call(u.context,Z,m,c,b),!0;case 6:return u.fn.call(u.context,Z,m,c,b,G),!0}for(W=1,i=new Array(y-1);W<y;W++)i[W-1]=arguments[W];u.fn.apply(u.context,i)}else{var I,p=u.length;for(W=0;W<p;W++)switch(u[W].once&&this.removeListener(l,u[W].fn,void 0,!0),y){case 1:u[W].fn.call(u[W].context);break;case 2:u[W].fn.call(u[W].context,Z);break;case 3:u[W].fn.call(u[W].context,Z,m);break;case 4:u[W].fn.call(u[W].context,Z,m,c);break;default:if(!i)for(I=1,i=new Array(y-1);I<y;I++)i[I-1]=arguments[I];u[W].fn.apply(u[W].context,i)}}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,c){var b=d?d+l:l;if(!this._events[b])return this;if(!Z)return G(this,b),this;var X=this._events[b];if(X.fn)X.fn!==Z||c&&!X.once||m&&X.context!==m||G(this,b);else{for(var i=0,W=[],u=X.length;i<u;i++)(X[i].fn!==Z||c&&!X[i].once||m&&X[i].context!==m)&&W.push(X[i]);W.length?this._events[b]=1===W.length?W[0]:W:G(this,b)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&G(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}));return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function Z(){return new u}function m(){var l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function c(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length,c=0;c<l;c++)Z[c]=d[0|Math.random()*m];return Z.join("")}var G,X=(G="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCmZ1bmN0aW9uIHQoKXt9ZnVuY3Rpb24gZSgpe2UuaW5pdC5jYWxsKHRoaXMpfWZ1bmN0aW9uIHIodCl7cmV0dXJuIHZvaWQgMD09PXQuX21heExpc3RlbmVycz9lLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfWZ1bmN0aW9uIG4odCxlLHIpe2lmKGUpdC5jYWxsKHIpO2Vsc2UgZm9yKHZhciBuPXQubGVuZ3RoLGk9Yyh0LG4pLG89MDtvPG47KytvKWlbb10uY2FsbChyKX1mdW5jdGlvbiBpKHQsZSxyLG4pe2lmKGUpdC5jYWxsKHIsbik7ZWxzZSBmb3IodmFyIGk9dC5sZW5ndGgsbz1jKHQsaSkscz0wO3M8aTsrK3Mpb1tzXS5jYWxsKHIsbil9ZnVuY3Rpb24gbyh0LGUscixuLGkpe2lmKGUpdC5jYWxsKHIsbixpKTtlbHNlIGZvcih2YXIgbz10Lmxlbmd0aCxzPWModCxvKSxhPTA7YTxvOysrYSlzW2FdLmNhbGwocixuLGkpfWZ1bmN0aW9uIHModCxlLHIsbixpLG8pe2lmKGUpdC5jYWxsKHIsbixpLG8pO2Vsc2UgZm9yKHZhciBzPXQubGVuZ3RoLGE9Yyh0LHMpLHU9MDt1PHM7Kyt1KWFbdV0uY2FsbChyLG4saSxvKX1mdW5jdGlvbiBhKHQsZSxyLG4pe2lmKGUpdC5hcHBseShyLG4pO2Vsc2UgZm9yKHZhciBpPXQubGVuZ3RoLG89Yyh0LGkpLHM9MDtzPGk7KytzKW9bc10uYXBwbHkocixuKX1mdW5jdGlvbiB1KGUsbixpLG8pe3ZhciBzLGEsdSxoO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7aWYoKGE9ZS5fZXZlbnRzKT8oYS5uZXdMaXN0ZW5lciYmKGUuZW1pdCgibmV3TGlzdGVuZXIiLG4saS5saXN0ZW5lcj9pLmxpc3RlbmVyOmkpLGE9ZS5fZXZlbnRzKSx1PWFbbl0pOihhPWUuX2V2ZW50cz1uZXcgdCxlLl9ldmVudHNDb3VudD0wKSx1KXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdT91PWFbbl09bz9baSx1XTpbdSxpXTpvP3UudW5zaGlmdChpKTp1LnB1c2goaSksIXUud2FybmVkJiYocz1yKGUpKSYmcz4wJiZ1Lmxlbmd0aD5zKXt1Lndhcm5lZD0hMDt2YXIgZj1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIit1Lmxlbmd0aCsiICIrbisiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTtmLm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsZi5lbWl0dGVyPWUsZi50eXBlPW4sZi5jb3VudD11Lmxlbmd0aCxoPWYsImZ1bmN0aW9uIj09dHlwZW9mIGNvbnNvbGUud2Fybj9jb25zb2xlLndhcm4oaCk6Y29uc29sZS5sb2coaCl9fWVsc2UgdT1hW25dPWksKytlLl9ldmVudHNDb3VudDtyZXR1cm4gZX1mdW5jdGlvbiBoKHQsZSxyKXt2YXIgbj0hMTtmdW5jdGlvbiBpKCl7dC5yZW1vdmVMaXN0ZW5lcihlLGkpLG58fChuPSEwLHIuYXBwbHkodCxhcmd1bWVudHMpKX1yZXR1cm4gaS5saXN0ZW5lcj1yLGl9ZnVuY3Rpb24gZih0KXt2YXIgZT10aGlzLl9ldmVudHM7aWYoZSl7dmFyIHI9ZVt0XTtpZigiZnVuY3Rpb24iPT10eXBlb2YgcilyZXR1cm4gMTtpZihyKXJldHVybiByLmxlbmd0aH1yZXR1cm4gMH1mdW5jdGlvbiBjKHQsZSl7Zm9yKHZhciByPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtlXTtyZXR1cm4gcn10LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG51bGwpLGUuRXZlbnRFbWl0dGVyPWUsZS51c2luZ0RvbWFpbnM9ITEsZS5wcm90b3R5cGUuZG9tYWluPXZvaWQgMCxlLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxlLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMCxlLmRlZmF1bHRNYXhMaXN0ZW5lcnM9MTAsZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5kb21haW49bnVsbCxlLnVzaW5nRG9tYWlucyYmdW5kZWZpbmVkLmFjdGl2ZSx0aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50cyE9PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPW5ldyB0LHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sZS5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdHx8dDwwfHxpc05hTih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibiIgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9dCx0aGlzfSxlLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzKX0sZS5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt2YXIgZSxyLHUsaCxmLGMsbCxwPSJlcnJvciI9PT10O2lmKGM9dGhpcy5fZXZlbnRzKXA9cCYmbnVsbD09Yy5lcnJvcjtlbHNlIGlmKCFwKXJldHVybiExO2lmKGw9dGhpcy5kb21haW4scCl7aWYoZT1hcmd1bWVudHNbMV0sIWwpe2lmKGUgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBlO3ZhciBkPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQuICgnK2UrIikiKTt0aHJvdyBkLmNvbnRleHQ9ZSxkfXJldHVybiBlfHwoZT1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50JykpLGUuZG9tYWluRW1pdHRlcj10aGlzLGUuZG9tYWluPWwsZS5kb21haW5UaHJvd249ITEsbC5lbWl0KCJlcnJvciIsZSksITF9aWYoIShyPWNbdF0pKXJldHVybiExO3ZhciBnPSJmdW5jdGlvbiI9PXR5cGVvZiByO3N3aXRjaCh1PWFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpuKHIsZyx0aGlzKTticmVhaztjYXNlIDI6aShyLGcsdGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpvKHIsZyx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2Nhc2UgNDpzKHIsZyx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdKTticmVhaztkZWZhdWx0OmZvcihoPW5ldyBBcnJheSh1LTEpLGY9MTtmPHU7ZisrKWhbZi0xXT1hcmd1bWVudHNbZl07YShyLGcsdGhpcyxoKX1yZXR1cm4hMH0sZS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdSh0aGlzLHQsZSwhMSl9LGUucHJvdG90eXBlLm9uPWUucHJvdG90eXBlLmFkZExpc3RlbmVyLGUucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiB1KHRoaXMsdCxlLCEwKX0sZS5wcm90b3R5cGUub25jZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7cmV0dXJuIHRoaXMub24odCxoKHRoaXMsdCxlKSksdGhpc30sZS5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7cmV0dXJuIHRoaXMucHJlcGVuZExpc3RlbmVyKHQsaCh0aGlzLHQsZSkpLHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUscil7dmFyIG4saSxvLHMsYTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO2lmKCEoaT10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKCEobj1pW2VdKSlyZXR1cm4gdGhpcztpZihuPT09cnx8bi5saXN0ZW5lciYmbi5saXN0ZW5lcj09PXIpMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9bmV3IHQ6KGRlbGV0ZSBpW2VdLGkucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsbi5saXN0ZW5lcnx8cikpO2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pe2ZvcihvPS0xLHM9bi5sZW5ndGg7cy0tID4wOylpZihuW3NdPT09cnx8bltzXS5saXN0ZW5lciYmbltzXS5saXN0ZW5lcj09PXIpe2E9bltzXS5saXN0ZW5lcixvPXM7YnJlYWt9aWYobzwwKXJldHVybiB0aGlzO2lmKDE9PT1uLmxlbmd0aCl7aWYoblswXT12b2lkIDAsMD09LS10aGlzLl9ldmVudHNDb3VudClyZXR1cm4gdGhpcy5fZXZlbnRzPW5ldyB0LHRoaXM7ZGVsZXRlIGlbZV19ZWxzZSFmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lLG49cisxLGk9dC5sZW5ndGg7bjxpO3IrPTEsbis9MSl0W3JdPXRbbl07dC5wb3AoKX0obixvKTtpLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixlLGF8fHIpfXJldHVybiB0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7dmFyIHIsbjtpZighKG49dGhpcy5fZXZlbnRzKSlyZXR1cm4gdGhpcztpZighbi5yZW1vdmVMaXN0ZW5lcilyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzLl9ldmVudHNDb3VudD0wKTpuW2VdJiYoMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9bmV3IHQ6ZGVsZXRlIG5bZV0pLHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgaSxvPU9iamVjdC5rZXlzKG4pLHM9MDtzPG8ubGVuZ3RoOysrcykicmVtb3ZlTGlzdGVuZXIiIT09KGk9b1tzXSkmJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGkpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9bmV3IHQsdGhpcy5fZXZlbnRzQ291bnQ9MCx0aGlzfWlmKCJmdW5jdGlvbiI9PXR5cGVvZihyPW5bZV0pKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSxyKTtlbHNlIGlmKHIpZG97dGhpcy5yZW1vdmVMaXN0ZW5lcihlLHJbci5sZW5ndGgtMV0pfXdoaWxlKHJbMF0pO3JldHVybiB0aGlzfSxlLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24odCl7dmFyIGUscj10aGlzLl9ldmVudHM7cmV0dXJuIHImJihlPXJbdF0pPyJmdW5jdGlvbiI9PXR5cGVvZiBlP1tlLmxpc3RlbmVyfHxlXTpmdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQubGVuZ3RoKSxyPTA7cjxlLmxlbmd0aDsrK3IpZVtyXT10W3JdLmxpc3RlbmVyfHx0W3JdO3JldHVybiBlfShlKTpbXX0sZS5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQubGlzdGVuZXJDb3VudD90Lmxpc3RlbmVyQ291bnQoZSk6Zi5jYWxsKHQsZSl9LGUucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9ZixlLnByb3RvdHlwZS5ldmVudE5hbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50PjA/UmVmbGVjdC5vd25LZXlzKHRoaXMuX2V2ZW50cyk6W119O3ZhciBsPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30scD1bXSxkPVtdLGc9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXkseT0hMTtmdW5jdGlvbiB2KCl7eT0hMDtmb3IodmFyIHQ9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGU9MCxyPXQubGVuZ3RoO2U8cjsrK2UpcFtlXT10W2VdLGRbdC5jaGFyQ29kZUF0KGUpXT1lO2RbIi0iLmNoYXJDb2RlQXQoMCldPTYyLGRbIl8iLmNoYXJDb2RlQXQoMCldPTYzfWZ1bmN0aW9uIGIodCxlLHIpe2Zvcih2YXIgbixpLG89W10scz1lO3M8cjtzKz0zKW49KHRbc108PDE2KSsodFtzKzFdPDw4KSt0W3MrMl0sby5wdXNoKHBbKGk9bik+PjE4JjYzXStwW2k+PjEyJjYzXStwW2k+PjYmNjNdK3BbNjMmaV0pO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIG0odCl7dmFyIGU7eXx8digpO2Zvcih2YXIgcj10Lmxlbmd0aCxuPXIlMyxpPSIiLG89W10scz0xNjM4MyxhPTAsdT1yLW47YTx1O2ErPXMpby5wdXNoKGIodCxhLGErcz51P3U6YStzKSk7cmV0dXJuIDE9PT1uPyhlPXRbci0xXSxpKz1wW2U+PjJdLGkrPXBbZTw8NCY2M10saSs9Ij09Iik6Mj09PW4mJihlPSh0W3ItMl08PDgpK3Rbci0xXSxpKz1wW2U+PjEwXSxpKz1wW2U+PjQmNjNdLGkrPXBbZTw8MiY2M10saSs9Ij0iKSxvLnB1c2goaSksby5qb2luKCIiKX1mdW5jdGlvbiB3KHQsZSxyLG4saSl7dmFyIG8scyxhPTgqaS1uLTEsdT0oMTw8YSktMSxoPXU+PjEsZj0tNyxjPXI/aS0xOjAsbD1yPy0xOjEscD10W2UrY107Zm9yKGMrPWwsbz1wJigxPDwtZiktMSxwPj49LWYsZis9YTtmPjA7bz0yNTYqbyt0W2UrY10sYys9bCxmLT04KTtmb3Iocz1vJigxPDwtZiktMSxvPj49LWYsZis9bjtmPjA7cz0yNTYqcyt0W2UrY10sYys9bCxmLT04KTtpZigwPT09bylvPTEtaDtlbHNle2lmKG89PT11KXJldHVybiBzP05hTjoxLzAqKHA/LTE6MSk7cys9TWF0aC5wb3coMixuKSxvLT1ofXJldHVybihwPy0xOjEpKnMqTWF0aC5wb3coMixvLW4pfWZ1bmN0aW9uIF8odCxlLHIsbixpLG8pe3ZhciBzLGEsdSxoPTgqby1pLTEsZj0oMTw8aCktMSxjPWY+PjEsbD0yMz09PWk/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLHA9bj8wOm8tMSxkPW4/MTotMSxnPWU8MHx8MD09PWUmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8oYT1pc05hTihlKT8xOjAscz1mKToocz1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKih1PU1hdGgucG93KDIsLXMpKTwxJiYocy0tLHUqPTIpLChlKz1zK2M+PTE/bC91OmwqTWF0aC5wb3coMiwxLWMpKSp1Pj0yJiYocysrLHUvPTIpLHMrYz49Zj8oYT0wLHM9Zik6cytjPj0xPyhhPShlKnUtMSkqTWF0aC5wb3coMixpKSxzKz1jKTooYT1lKk1hdGgucG93KDIsYy0xKSpNYXRoLnBvdygyLGkpLHM9MCkpO2k+PTg7dFtyK3BdPTI1NSZhLHArPWQsYS89MjU2LGktPTgpO2ZvcihzPXM8PGl8YSxoKz1pO2g+MDt0W3IrcF09MjU1JnMscCs9ZCxzLz0yNTYsaC09OCk7dFtyK3AtZF18PTEyOCpnfXZhciBTPXt9LnRvU3RyaW5nLEU9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09Uy5jYWxsKHQpfTtmdW5jdGlvbiBrKCl7cmV0dXJuIEEuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gUih0LGUpe2lmKGsoKTxlKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9bmV3IFVpbnQ4QXJyYXkoZSkpLl9fcHJvdG9fXz1BLnByb3RvdHlwZToobnVsbD09PXQmJih0PW5ldyBBKGUpKSx0Lmxlbmd0aD1lKSx0fWZ1bmN0aW9uIEEodCxlLHIpe2lmKCEoQS5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgQSkpcmV0dXJuIG5ldyBBKHQsZSxyKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGoodGhpcyx0KX1yZXR1cm4gVCh0aGlzLHQsZSxyKX1mdW5jdGlvbiBUKHQsZSxyLG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKHQsZSxyLG4pe2lmKGUuYnl0ZUxlbmd0aCxyPDB8fGUuYnl0ZUxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYoZS5ieXRlTGVuZ3RoPHIrKG58fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7ZT12b2lkIDA9PT1yJiZ2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KGUpOnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSxyKTpuZXcgVWludDhBcnJheShlLHIsbik7QS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PWUpLl9fcHJvdG9fXz1BLnByb3RvdHlwZTp0PUwodCxlKTtyZXR1cm4gdH0odCxlLHIsbik6InN0cmluZyI9PXR5cGVvZiBlP2Z1bmN0aW9uKHQsZSxyKXsic3RyaW5nIj09dHlwZW9mIHImJiIiIT09cnx8KHI9InV0ZjgiKTtpZighQS5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciBuPTB8TShlLHIpLGk9KHQ9Uih0LG4pKS53cml0ZShlLHIpO2khPT1uJiYodD10LnNsaWNlKDAsaSkpO3JldHVybiB0fSh0LGUscik6ZnVuY3Rpb24odCxlKXtpZihQKGUpKXt2YXIgcj0wfEMoZS5sZW5ndGgpO3JldHVybiAwPT09KHQ9Uih0LHIpKS5sZW5ndGh8fGUuY29weSh0LDAsMCxyKSx0fWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwobj1lLmxlbmd0aCkhPW4/Uih0LDApOkwodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmRShlLmRhdGEpKXJldHVybiBMKHQsZS5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gTyh0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGoodCxlKXtpZihPKGUpLHQ9Uih0LGU8MD8wOjB8QyhlKSksIUEuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPGU7KytyKXRbcl09MDtyZXR1cm4gdH1mdW5jdGlvbiBMKHQsZSl7dmFyIHI9ZS5sZW5ndGg8MD8wOjB8QyhlLmxlbmd0aCk7dD1SKHQscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpdFtuXT0yNTUmZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBDKHQpe2lmKHQ+PWsoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIraygpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBQKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX1mdW5jdGlvbiBNKHQsZSl7aWYoUCh0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIHI9dC5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gb3QodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBzdCh0KS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBvdCh0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBCKHQsZSxyKXt2YXIgbj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09cnx8cj50aGlzLmxlbmd0aCkmJihyPXRoaXMubGVuZ3RoKSxyPD0wKXJldHVybiIiO2lmKChyPj4+PTApPD0oZT4+Pj0wKSlyZXR1cm4iIjtmb3IodHx8KHQ9InV0ZjgiKTs7KXN3aXRjaCh0KXtjYXNlImhleCI6cmV0dXJuIEgodGhpcyxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuICQodGhpcyxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBHKHRoaXMsZSxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBKKHRoaXMsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIFcodGhpcyxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gVih0aGlzLGUscik7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7dD0odCsiIikudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiB4KHQsZSxyKXt2YXIgbj10W2VdO3RbZV09dFtyXSx0W3JdPW59ZnVuY3Rpb24gVSh0LGUscixuLGkpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDp0Lmxlbmd0aC0xKSxyPDAmJihyPXQubGVuZ3RoK3IpLHI+PXQubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9dC5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9QS5mcm9tKGUsbikpLFAoZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTpJKHQsZSxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsQS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUscik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUscik6SSh0LFtlXSxyLG4saSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gSSh0LGUscixuLGkpe3ZhciBvLHM9MSxhPXQubGVuZ3RoLHU9ZS5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89Mix1Lz0yLHIvPTJ9ZnVuY3Rpb24gaCh0LGUpe3JldHVybiAxPT09cz90W2VdOnQucmVhZFVJbnQxNkJFKGUqcyl9aWYoaSl7dmFyIGY9LTE7Zm9yKG89cjtvPGE7bysrKWlmKGgodCxvKT09PWgoZSwtMT09PWY/MDpvLWYpKXtpZigtMT09PWYmJihmPW8pLG8tZisxPT09dSlyZXR1cm4gZipzfWVsc2UtMSE9PWYmJihvLT1vLWYpLGY9LTF9ZWxzZSBmb3Iocit1PmEmJihyPWEtdSksbz1yO28+PTA7by0tKXtmb3IodmFyIGM9ITAsbD0wO2w8dTtsKyspaWYoaCh0LG8rbCkhPT1oKGUsbCkpe2M9ITE7YnJlYWt9aWYoYylyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiBEKHQsZSxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBpPXQubGVuZ3RoLXI7bj8obj1OdW1iZXIobikpPmkmJihuPWkpOm49aTt2YXIgbz1lLmxlbmd0aDtpZihvJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5vLzImJihuPW8vMik7Zm9yKHZhciBzPTA7czxuOysrcyl7dmFyIGE9cGFyc2VJbnQoZS5zdWJzdHIoMipzLDIpLDE2KTtpZihpc05hTihhKSlyZXR1cm4gczt0W3Irc109YX1yZXR1cm4gc31mdW5jdGlvbiBOKHQsZSxyLG4pe3JldHVybiBhdChvdChlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBGKHQsZSxyLG4pe3JldHVybiBhdChmdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gZX0oZSksdCxyLG4pfWZ1bmN0aW9uIHoodCxlLHIsbil7cmV0dXJuIEYodCxlLHIsbil9ZnVuY3Rpb24gcSh0LGUscixuKXtyZXR1cm4gYXQoc3QoZSksdCxyLG4pfWZ1bmN0aW9uIFkodCxlLHIsbil7cmV0dXJuIGF0KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG4saSxvPVtdLHM9MDtzPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK3Mpbj0ocj10LmNoYXJDb2RlQXQocykpPj44LGk9ciUyNTYsby5wdXNoKGkpLG8ucHVzaChuKTtyZXR1cm4gb30oZSx0Lmxlbmd0aC1yKSx0LHIsbil9ZnVuY3Rpb24gVyh0LGUscil7cmV0dXJuIDA9PT1lJiZyPT09dC5sZW5ndGg/bSh0KTptKHQuc2xpY2UoZSxyKSl9ZnVuY3Rpb24gJCh0LGUscil7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIG49W10saT1lO2k8cjspe3ZhciBvLHMsYSx1LGg9dFtpXSxmPW51bGwsYz1oPjIzOT80Omg+MjIzPzM6aD4xOTE/MjoxO2lmKGkrYzw9cilzd2l0Y2goYyl7Y2FzZSAxOmg8MTI4JiYoZj1oKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPXRbaSsxXSkpJiYodT0oMzEmaCk8PDZ8NjMmbyk+MTI3JiYoZj11KTticmVhaztjYXNlIDM6bz10W2krMV0scz10W2krMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJih1PSgxNSZoKTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGY9dSk7YnJlYWs7Y2FzZSA0Om89dFtpKzFdLHM9dFtpKzJdLGE9dFtpKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJih1PSgxNSZoKTw8MTh8KDYzJm8pPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJnU8MTExNDExMiYmKGY9dSl9bnVsbD09PWY/KGY9NjU1MzMsYz0xKTpmPjY1NTM1JiYoZi09NjU1MzYsbi5wdXNoKGY+Pj4xMCYxMDIzfDU1Mjk2KSxmPTU2MzIwfDEwMjMmZiksbi5wdXNoKGYpLGkrPWN9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PTQwOTYpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciByPSIiLG49MDtmb3IoO248ZTspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShuLG4rPTQwOTYpKTtyZXR1cm4gcn0obil9QS5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMD09PWwuVFlQRURfQVJSQVlfU1VQUE9SVHx8bC5UWVBFRF9BUlJBWV9TVVBQT1JULEEucG9vbFNpemU9ODE5MixBLl9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz1BLnByb3RvdHlwZSx0fSxBLmZyb209ZnVuY3Rpb24odCxlLHIpe3JldHVybiBUKG51bGwsdCxlLHIpfSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQmJihBLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsQS5fX3Byb3RvX189VWludDhBcnJheSksQS5hbGxvYz1mdW5jdGlvbih0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBPKGUpLGU8PTA/Uih0LGUpOnZvaWQgMCE9PXI/InN0cmluZyI9PXR5cGVvZiBuP1IodCxlKS5maWxsKHIsbik6Uih0LGUpLmZpbGwocik6Uih0LGUpfShudWxsLHQsZSxyKX0sQS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gaihudWxsLHQpfSxBLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gaihudWxsLHQpfSxBLmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYoISF0Ll9pc0J1ZmZlcnx8dXQodCl8fGZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zbGljZSYmdXQodC5zbGljZSgwLDApKX0odCkpfSxBLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighUCh0KXx8IVAoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgcj10Lmxlbmd0aCxuPWUubGVuZ3RoLGk9MCxvPU1hdGgubWluKHIsbik7aTxvOysraSlpZih0W2ldIT09ZVtpXSl7cj10W2ldLG49ZVtpXTticmVha31yZXR1cm4gcjxuPy0xOm48cj8xOjB9LEEuaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sQS5jb25jYXQ9ZnVuY3Rpb24odCxlKXtpZighRSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiBBLmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PWUpZm9yKGU9MCxyPTA7cjx0Lmxlbmd0aDsrK3IpZSs9dFtyXS5sZW5ndGg7dmFyIG49QS5hbGxvY1Vuc2FmZShlKSxpPTA7Zm9yKHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIG89dFtyXTtpZighUChvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7by5jb3B5KG4saSksaSs9by5sZW5ndGh9cmV0dXJuIG59LEEuYnl0ZUxlbmd0aD1NLEEucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxBLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTIpeCh0aGlzLGUsZSsxKTtyZXR1cm4gdGhpc30sQS5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz00KXgodGhpcyxlLGUrMykseCh0aGlzLGUrMSxlKzIpO3JldHVybiB0aGlzfSxBLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTgpeCh0aGlzLGUsZSs3KSx4KHRoaXMsZSsxLGUrNikseCh0aGlzLGUrMixlKzUpLHgodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sQS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD8kKHRoaXMsMCx0KTpCLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sQS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCFQKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT1BLmNvbXBhcmUodGhpcyx0KX0sQS5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiO3JldHVybiB0aGlzLmxlbmd0aD4wJiYodD10aGlzLnRvU3RyaW5nKCJoZXgiLDAsNTApLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD41MCYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSxBLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxyLG4saSl7aWYoIVAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLGU8MHx8cj50Lmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZlPj1yKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYoZT49cilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKG4+Pj49MCkscz0ocj4+Pj0wKS0oZT4+Pj0wKSxhPU1hdGgubWluKG8scyksdT10aGlzLnNsaWNlKG4saSksaD10LnNsaWNlKGUsciksZj0wO2Y8YTsrK2YpaWYodVtmXSE9PWhbZl0pe289dVtmXSxzPWhbZl07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSxBLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUscil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLHIpfSxBLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVSh0aGlzLHQsZSxyLCEwKX0sQS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVKHRoaXMsdCxlLHIsITEpfSxBLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscixuKXtpZih2b2lkIDA9PT1lKW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiBlKW49ZSxyPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSx0Lmxlbmd0aD4wJiYocjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gRCh0aGlzLHQsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBOKHRoaXMsdCxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBGKHRoaXMsdCxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHoodGhpcyx0LGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBxKHRoaXMsdCxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gWSh0aGlzLHQsZSxyKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLG89ITB9fSxBLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O2Z1bmN0aW9uIEcodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBKKHQsZSxyKXt2YXIgbj0iIjtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgaT1lO2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBIKHQsZSxyKXt2YXIgbj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsbz1lO288cjsrK28paSs9aXQodFtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gVih0LGUscil7Zm9yKHZhciBuPXQuc2xpY2UoZSxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIEsodCxlLHIpe2lmKHQlMSE9MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIFoodCxlLHIsbixpLG8pe2lmKCFQKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPml8fGU8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBRKHQsZSxyLG4pe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKHQubGVuZ3RoLXIsMik7aTxvOysraSl0W3IraV09KGUmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBYKHQsZSxyLG4pe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciw0KTtpPG87KytpKXRbcitpXT1lPj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIHR0KHQsZSxyLG4saSxvKXtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gZXQodCxlLHIsbixpKXtyZXR1cm4gaXx8dHQodCwwLHIsNCksXyh0LGUscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBydCh0LGUscixuLGkpe3JldHVybiBpfHx0dCh0LDAsciw4KSxfKHQsZSxyLG4sNTIsOCkscis4fUEucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj10aGlzLmxlbmd0aDtpZigodD1+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksKGU9dm9pZCAwPT09ZT9uOn5+ZSk8MD8oZSs9bik8MCYmKGU9MCk6ZT5uJiYoZT1uKSxlPHQmJihlPXQpLEEuVFlQRURfQVJSQVlfU1VQUE9SVCkocj10aGlzLnN1YmFycmF5KHQsZSkpLl9fcHJvdG9fXz1BLnByb3RvdHlwZTtlbHNle3ZhciBpPWUtdDtyPW5ldyBBKGksdm9pZCAwKTtmb3IodmFyIG89MDtvPGk7KytvKXJbb109dGhpc1tvK3RdfXJldHVybiByfSxBLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Syh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOyluKz10aGlzW3Qrb10qaTtyZXR1cm4gbn0sQS5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEsodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0Ky0tZV0saT0xO2U+MCYmKGkqPTI1Nik7KW4rPXRoaXNbdCstLWVdKmk7cmV0dXJuIG59LEEucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sQS5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sQS5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sQS5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSxBLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LEEucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEsodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG4+PShpKj0xMjgpJiYobi09TWF0aC5wb3coMiw4KmUpKSxufSxBLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxLKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPWUsaT0xLG89dGhpc1t0Ky0tbl07bj4wJiYoaSo9MjU2KTspbys9dGhpc1t0Ky0tbl0qaTtyZXR1cm4gbz49KGkqPTEyOCkmJihvLT1NYXRoLnBvdygyLDgqZSkpLG99LEEucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sQS5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24odCxlKXtlfHxLKHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LEEucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7ZXx8Syh0LDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxBLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNnx0aGlzW3QrM108PDI0fSxBLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSxBLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsNCx0aGlzLmxlbmd0aCksdyh0aGlzLHQsITAsMjMsNCl9LEEucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSx3KHRoaXMsdCwhMSwyMyw0KX0sQS5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw4LHRoaXMubGVuZ3RoKSx3KHRoaXMsdCwhMCw1Miw4KX0sQS5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw4LHRoaXMubGVuZ3RoKSx3KHRoaXMsdCwhMSw1Miw4KX0sQS5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7KHQ9K3QsZXw9MCxyfD0wLG4pfHxaKHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihpKj0yNTYpOyl0aGlzW2Urb109dC9pJjI1NTtyZXR1cm4gZStyfSxBLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbih0LGUscixuKXsodD0rdCxlfD0wLHJ8PTAsbil8fFoodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT1yLTEsbz0xO2Zvcih0aGlzW2UraV09MjU1JnQ7LS1pPj0wJiYobyo9MjU2KTspdGhpc1tlK2ldPXQvbyYyNTU7cmV0dXJuIGUrcn0sQS5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDEsMjU1LDApLEEuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdGhpc1tlXT0yNTUmdCxlKzF9LEEucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSwyLDY1NTM1LDApLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOlEodGhpcyx0LGUsITApLGUrMn0sQS5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDIsNjU1MzUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6USh0aGlzLHQsZSwhMSksZSsyfSxBLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlKzNdPXQ+Pj4yNCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2VdPTI1NSZ0KTpYKHRoaXMsdCxlLCEwKSxlKzR9LEEucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOlgodGhpcyx0LGUsITEpLGUrNH0sQS5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO1oodGhpcyx0LGUscixpLTEsLWkpfXZhciBvPTAscz0xLGE9MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKHMqPTI1Nik7KXQ8MCYmMD09PWEmJjAhPT10aGlzW2Urby0xXSYmKGE9MSksdGhpc1tlK29dPSh0L3M+PjApLWEmMjU1O3JldHVybiBlK3J9LEEucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtaKHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgbz1yLTEscz0xLGE9MDtmb3IodGhpc1tlK29dPTI1NSZ0Oy0tbz49MCYmKHMqPTI1Nik7KXQ8MCYmMD09PWEmJjAhPT10aGlzW2UrbysxXSYmKGE9MSksdGhpc1tlK29dPSh0L3M+PjApLWEmMjU1O3JldHVybiBlK3J9LEEucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDEsMTI3LC0xMjgpLEEuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0sQS5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOlEodGhpcyx0LGUsITApLGUrMn0sQS5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOlEodGhpcyx0LGUsITEpLGUrMn0sQS5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNCk6WCh0aGlzLHQsZSwhMCksZSs0fSxBLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpYKHRoaXMsdCxlLCExKSxlKzR9LEEucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGV0KHRoaXMsdCxlLCEwLHIpfSxBLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBldCh0aGlzLHQsZSwhMSxyKX0sQS5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHJ0KHRoaXMsdCxlLCEwLHIpfSxBLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcnQodGhpcyx0LGUsITEscil9LEEucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLHIsbil7aWYocnx8KHI9MCksbnx8MD09PW58fChuPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLG4+MCYmbjxyJiYobj1yKSxuPT09cilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDB8fHI+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO24+dGhpcy5sZW5ndGgmJihuPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPG4tciYmKG49dC5sZW5ndGgtZStyKTt2YXIgaSxvPW4tcjtpZih0aGlzPT09dCYmcjxlJiZlPG4pZm9yKGk9by0xO2k+PTA7LS1pKXRbaStlXT10aGlzW2krcl07ZWxzZSBpZihvPDFlM3x8IUEuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpdFtpK2VdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShyLHIrbyksZSk7cmV0dXJuIG99LEEucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KG49ZSxlPTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIGk9dC5jaGFyQ29kZUF0KDApO2k8MjU2JiYodD1pKX1pZih2b2lkIDAhPT1uJiYic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIUEuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocjw9ZSlyZXR1cm4gdGhpczt2YXIgbztpZihlPj4+PTAscj12b2lkIDA9PT1yP3RoaXMubGVuZ3RoOnI+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3Iobz1lO288cjsrK28pdGhpc1tvXT10O2Vsc2V7dmFyIHM9UCh0KT90Om90KG5ldyBBKHQsbikudG9TdHJpbmcoKSksYT1zLmxlbmd0aDtmb3Iobz0wO288ci1lOysrbyl0aGlzW28rZV09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgbnQ9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIG90KHQsZSl7dmFyIHI7ZT1lfHwxLzA7Zm9yKHZhciBuPXQubGVuZ3RoLGk9bnVsbCxvPVtdLHM9MDtzPG47KytzKXtpZigocj10LmNoYXJDb2RlQXQocykpPjU1Mjk1JiZyPDU3MzQ0KXtpZighaSl7aWYocj41NjMxOSl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKHMrMT09PW4peyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPXI7Y29udGludWV9aWYocjw1NjMyMCl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9cjtjb250aW51ZX1yPTY1NTM2KyhpLTU1Mjk2PDwxMHxyLTU2MzIwKX1lbHNlIGkmJihlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwscjwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO28ucHVzaChyKX1lbHNlIGlmKHI8MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7by5wdXNoKHI+PjZ8MTkyLDYzJnJ8MTI4KX1lbHNlIGlmKHI8NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO28ucHVzaChyPj4xMnwyMjQscj4+NiY2M3wxMjgsNjMmcnwxMjgpfWVsc2V7aWYoIShyPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKGUtPTQpPDApYnJlYWs7by5wdXNoKHI+PjE4fDI0MCxyPj4xMiY2M3wxMjgscj4+NiY2M3wxMjgsNjMmcnwxMjgpfX1yZXR1cm4gb31mdW5jdGlvbiBzdCh0KXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGUscixuLGksbyxzO3l8fHYoKTt2YXIgYT10Lmxlbmd0aDtpZihhJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtvPSI9Ij09PXRbYS0yXT8yOiI9Ij09PXRbYS0xXT8xOjAscz1uZXcgZygzKmEvNC1vKSxuPW8+MD9hLTQ6YTt2YXIgdT0wO2ZvcihlPTAscj0wO2U8bjtlKz00LHIrPTMpaT1kW3QuY2hhckNvZGVBdChlKV08PDE4fGRbdC5jaGFyQ29kZUF0KGUrMSldPDwxMnxkW3QuY2hhckNvZGVBdChlKzIpXTw8NnxkW3QuY2hhckNvZGVBdChlKzMpXSxzW3UrK109aT4+MTYmMjU1LHNbdSsrXT1pPj44JjI1NSxzW3UrK109MjU1Jmk7cmV0dXJuIDI9PT1vPyhpPWRbdC5jaGFyQ29kZUF0KGUpXTw8MnxkW3QuY2hhckNvZGVBdChlKzEpXT4+NCxzW3UrK109MjU1JmkpOjE9PT1vJiYoaT1kW3QuY2hhckNvZGVBdChlKV08PDEwfGRbdC5jaGFyQ29kZUF0KGUrMSldPDw0fGRbdC5jaGFyQ29kZUF0KGUrMildPj4yLHNbdSsrXT1pPj44JjI1NSxzW3UrK109MjU1JmkpLHN9KGZ1bmN0aW9uKHQpe2lmKCh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KHQpLnJlcGxhY2UobnQsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPTA7KXQrPSI9IjtyZXR1cm4gdH0odCkpfWZ1bmN0aW9uIGF0KHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8biYmIShpK3I+PWUubGVuZ3RofHxpPj10Lmxlbmd0aCk7KytpKWVbaStyXT10W2ldO3JldHVybiBpfWZ1bmN0aW9uIHV0KHQpe3JldHVybiEhdC5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3IuaXNCdWZmZXImJnQuY29uc3RydWN0b3IuaXNCdWZmZXIodCl9ZnVuY3Rpb24gaHQoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBmdCgpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIGN0PWh0LGx0PWZ0O2Z1bmN0aW9uIHB0KHQpe2lmKGN0PT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dCh0LDApO2lmKChjdD09PWh0fHwhY3QpJiZzZXRUaW1lb3V0KXJldHVybiBjdD1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIGN0KHQsMCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBjdC5jYWxsKG51bGwsdCwwKX1jYXRjaChlKXtyZXR1cm4gY3QuY2FsbCh0aGlzLHQsMCl9fX0iZnVuY3Rpb24iPT10eXBlb2YgbC5zZXRUaW1lb3V0JiYoY3Q9c2V0VGltZW91dCksImZ1bmN0aW9uIj09dHlwZW9mIGwuY2xlYXJUaW1lb3V0JiYobHQ9Y2xlYXJUaW1lb3V0KTt2YXIgZHQsZ3Q9W10seXQ9ITEsdnQ9LTE7ZnVuY3Rpb24gYnQoKXt5dCYmZHQmJih5dD0hMSxkdC5sZW5ndGg/Z3Q9ZHQuY29uY2F0KGd0KTp2dD0tMSxndC5sZW5ndGgmJm10KCkpfWZ1bmN0aW9uIG10KCl7aWYoIXl0KXt2YXIgdD1wdChidCk7eXQ9ITA7Zm9yKHZhciBlPWd0Lmxlbmd0aDtlOyl7Zm9yKGR0PWd0LGd0PVtdOysrdnQ8ZTspZHQmJmR0W3Z0XS5ydW4oKTt2dD0tMSxlPWd0Lmxlbmd0aH1kdD1udWxsLHl0PSExLGZ1bmN0aW9uKHQpe2lmKGx0PT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQodCk7aWYoKGx0PT09ZnR8fCFsdCkmJmNsZWFyVGltZW91dClyZXR1cm4gbHQ9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dCh0KTt0cnl7bHQodCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBsdC5jYWxsKG51bGwsdCl9Y2F0Y2goZSl7cmV0dXJuIGx0LmNhbGwodGhpcyx0KX19fSh0KX19ZnVuY3Rpb24gd3QodCl7dmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspZVtyLTFdPWFyZ3VtZW50c1tyXTtndC5wdXNoKG5ldyBfdCh0LGUpKSwxIT09Z3QubGVuZ3RofHx5dHx8cHQobXQpfWZ1bmN0aW9uIF90KHQsZSl7dGhpcy5mdW49dCx0aGlzLmFycmF5PWV9X3QucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O2Z1bmN0aW9uIFN0KCl7fXZhciBFdD1TdCxrdD1TdCxSdD1TdCxBdD1TdCxUdD1TdCxPdD1TdCxqdD1TdDt2YXIgTHQ9bC5wZXJmb3JtYW5jZXx8e30sQ3Q9THQubm93fHxMdC5tb3pOb3d8fEx0Lm1zTm93fHxMdC5vTm93fHxMdC53ZWJraXROb3d8fGZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9O3ZhciBQdD1uZXcgRGF0ZTt2YXIgTXQsQnQ9e25leHRUaWNrOnd0LHRpdGxlOiJicm93c2VyIixicm93c2VyOiEwLGVudjp7fSxhcmd2OltdLHZlcnNpb246IiIsdmVyc2lvbnM6e30sb246RXQsYWRkTGlzdGVuZXI6a3Qsb25jZTpSdCxvZmY6QXQscmVtb3ZlTGlzdGVuZXI6VHQscmVtb3ZlQWxsTGlzdGVuZXJzOk90LGVtaXQ6anQsYmluZGluZzpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LGN3ZDpmdW5jdGlvbigpe3JldHVybiIvIn0sY2hkaXI6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sdW1hc2s6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saHJ0aW1lOmZ1bmN0aW9uKHQpe3ZhciBlPS4wMDEqQ3QuY2FsbChMdCkscj1NYXRoLmZsb29yKGUpLG49TWF0aC5mbG9vcihlJTEqMWU5KTtyZXR1cm4gdCYmKHItPXRbMF0sKG4tPXRbMV0pPDAmJihyLS0sbis9MWU5KSksW3Isbl19LHBsYXRmb3JtOiJicm93c2VyIixyZWxlYXNlOnt9LGNvbmZpZzp7fSx1cHRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUtUHQpLzFlM319O010PSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lO3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fTt2YXIgeHQ9TXQsVXQ9LyVbc2RqJV0vZztmdW5jdGlvbiBJdCh0KXtpZighVnQodCkpe2Zvcih2YXIgZT1bXSxyPTA7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllLnB1c2goenQoYXJndW1lbnRzW3JdKSk7cmV0dXJuIGUuam9pbigiICIpfXI9MTtmb3IodmFyIG49YXJndW1lbnRzLGk9bi5sZW5ndGgsbz1TdHJpbmcodCkucmVwbGFjZShVdCwoZnVuY3Rpb24odCl7aWYoIiUlIj09PXQpcmV0dXJuIiUiO2lmKHI+PWkpcmV0dXJuIHQ7c3dpdGNoKHQpe2Nhc2UiJXMiOnJldHVybiBTdHJpbmcobltyKytdKTtjYXNlIiVkIjpyZXR1cm4gTnVtYmVyKG5bcisrXSk7Y2FzZSIlaiI6dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeShuW3IrK10pfWNhdGNoKHQpe3JldHVybiJbQ2lyY3VsYXJdIn1kZWZhdWx0OnJldHVybiB0fX0pKSxzPW5bcl07cjxpO3M9blsrK3JdKUh0KHMpfHwhUXQocyk/bys9IiAiK3M6bys9IiAiK3p0KHMpO3JldHVybiBvfWZ1bmN0aW9uIER0KHQsZSl7aWYoS3QobC5wcm9jZXNzKSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gRHQodCxlKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2lmKCEwPT09QnQubm9EZXByZWNhdGlvbilyZXR1cm4gdDt2YXIgcj0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighcil7aWYoQnQudGhyb3dEZXByZWNhdGlvbil0aHJvdyBuZXcgRXJyb3IoZSk7QnQudHJhY2VEZXByZWNhdGlvbj9jb25zb2xlLnRyYWNlKGUpOmNvbnNvbGUuZXJyb3IoZSkscj0hMH1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fXZhciBOdCxGdD17fTtmdW5jdGlvbiB6dCh0LGUpe3ZhciByPXtzZWVuOltdLHN0eWxpemU6WXR9O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPj0zJiYoci5kZXB0aD1hcmd1bWVudHNbMl0pLGFyZ3VtZW50cy5sZW5ndGg+PTQmJihyLmNvbG9ycz1hcmd1bWVudHNbM10pLEp0KGUpP3Iuc2hvd0hpZGRlbj1lOmUmJm5lKHIsZSksS3Qoci5zaG93SGlkZGVuKSYmKHIuc2hvd0hpZGRlbj0hMSksS3Qoci5kZXB0aCkmJihyLmRlcHRoPTIpLEt0KHIuY29sb3JzKSYmKHIuY29sb3JzPSExKSxLdChyLmN1c3RvbUluc3BlY3QpJiYoci5jdXN0b21JbnNwZWN0PSEwKSxyLmNvbG9ycyYmKHIuc3R5bGl6ZT1xdCksV3Qocix0LHIuZGVwdGgpfWZ1bmN0aW9uIHF0KHQsZSl7dmFyIHI9enQuc3R5bGVzW2VdO3JldHVybiByPyIbWyIrenQuY29sb3JzW3JdWzBdKyJtIit0KyIbWyIrenQuY29sb3JzW3JdWzFdKyJtIjp0fWZ1bmN0aW9uIFl0KHQsZSl7cmV0dXJuIHR9ZnVuY3Rpb24gV3QodCxlLHIpe2lmKHQuY3VzdG9tSW5zcGVjdCYmZSYmZWUoZS5pbnNwZWN0KSYmZS5pbnNwZWN0IT09enQmJighZS5jb25zdHJ1Y3Rvcnx8ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUhPT1lKSl7dmFyIG49ZS5pbnNwZWN0KHIsdCk7cmV0dXJuIFZ0KG4pfHwobj1XdCh0LG4scikpLG59dmFyIGk9ZnVuY3Rpb24odCxlKXtpZihLdChlKSlyZXR1cm4gdC5zdHlsaXplKCJ1bmRlZmluZWQiLCJ1bmRlZmluZWQiKTtpZihWdChlKSl7dmFyIHI9IiciK0pTT04uc3RyaW5naWZ5KGUpLnJlcGxhY2UoL14ifCIkL2csIiIpLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKSsiJyI7cmV0dXJuIHQuc3R5bGl6ZShyLCJzdHJpbmciKX1pZihuPWUsIm51bWJlciI9PXR5cGVvZiBuKXJldHVybiB0LnN0eWxpemUoIiIrZSwibnVtYmVyIik7dmFyIG47aWYoSnQoZSkpcmV0dXJuIHQuc3R5bGl6ZSgiIitlLCJib29sZWFuIik7aWYoSHQoZSkpcmV0dXJuIHQuc3R5bGl6ZSgibnVsbCIsIm51bGwiKX0odCxlKTtpZihpKXJldHVybiBpO3ZhciBvPU9iamVjdC5rZXlzKGUpLHM9ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtlW3RdPSEwfSkpLGV9KG8pO2lmKHQuc2hvd0hpZGRlbiYmKG89T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkpLHRlKGUpJiYoby5pbmRleE9mKCJtZXNzYWdlIik+PTB8fG8uaW5kZXhPZigiZGVzY3JpcHRpb24iKT49MCkpcmV0dXJuICR0KGUpO2lmKDA9PT1vLmxlbmd0aCl7aWYoZWUoZSkpe3ZhciBhPWUubmFtZT8iOiAiK2UubmFtZToiIjtyZXR1cm4gdC5zdHlsaXplKCJbRnVuY3Rpb24iK2ErIl0iLCJzcGVjaWFsIil9aWYoWnQoZSkpcmV0dXJuIHQuc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksInJlZ2V4cCIpO2lmKFh0KGUpKXJldHVybiB0LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwiZGF0ZSIpO2lmKHRlKGUpKXJldHVybiAkdChlKX12YXIgdSxoLGY9IiIsYz0hMSxsPVsieyIsIn0iXTsodT1lLEFycmF5LmlzQXJyYXkodSkmJihjPSEwLGw9WyJbIiwiXSJdKSxlZShlKSkmJihmPSIgW0Z1bmN0aW9uIisoZS5uYW1lPyI6ICIrZS5uYW1lOiIiKSsiXSIpO3JldHVybiBadChlKSYmKGY9IiAiK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSksWHQoZSkmJihmPSIgIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKGUpKSx0ZShlKSYmKGY9IiAiKyR0KGUpKSwwIT09by5sZW5ndGh8fGMmJjAhPWUubGVuZ3RoP3I8MD9adChlKT90LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJyZWdleHAiKTp0LnN0eWxpemUoIltPYmplY3RdIiwic3BlY2lhbCIpOih0LnNlZW4ucHVzaChlKSxoPWM/ZnVuY3Rpb24odCxlLHIsbixpKXtmb3IodmFyIG89W10scz0wLGE9ZS5sZW5ndGg7czxhOysrcylpZShlLFN0cmluZyhzKSk/by5wdXNoKEd0KHQsZSxyLG4sU3RyaW5nKHMpLCEwKSk6by5wdXNoKCIiKTtyZXR1cm4gaS5mb3JFYWNoKChmdW5jdGlvbihpKXtpLm1hdGNoKC9eXGQrJC8pfHxvLnB1c2goR3QodCxlLHIsbixpLCEwKSl9KSksb30odCxlLHIscyxvKTpvLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIEd0KHQsZSxyLHMsbixjKX0pKSx0LnNlZW4ucG9wKCksZnVuY3Rpb24odCxlLHIpe2lmKHQucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBlLmluZGV4T2YoIlxuIiksdCtlLnJlcGxhY2UoL1x1MDAxYlxbXGRcZD9tL2csIiIpLmxlbmd0aCsxfSksMCk+NjApcmV0dXJuIHJbMF0rKCIiPT09ZT8iIjplKyJcbiAiKSsiICIrdC5qb2luKCIsXG4gICIpKyIgIityWzFdO3JldHVybiByWzBdK2UrIiAiK3Quam9pbigiLCAiKSsiICIrclsxXX0oaCxmLGwpKTpsWzBdK2YrbFsxXX1mdW5jdGlvbiAkdCh0KXtyZXR1cm4iWyIrRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkrIl0ifWZ1bmN0aW9uIEd0KHQsZSxyLG4saSxvKXt2YXIgcyxhLHU7aWYoKHU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLGkpfHx7dmFsdWU6ZVtpXX0pLmdldD9hPXUuc2V0P3Quc3R5bGl6ZSgiW0dldHRlci9TZXR0ZXJdIiwic3BlY2lhbCIpOnQuc3R5bGl6ZSgiW0dldHRlcl0iLCJzcGVjaWFsIik6dS5zZXQmJihhPXQuc3R5bGl6ZSgiW1NldHRlcl0iLCJzcGVjaWFsIikpLGllKG4saSl8fChzPSJbIitpKyJdIiksYXx8KHQuc2Vlbi5pbmRleE9mKHUudmFsdWUpPDA/KGE9SHQocik/V3QodCx1LnZhbHVlLG51bGwpOld0KHQsdS52YWx1ZSxyLTEpKS5pbmRleE9mKCJcbiIpPi0xJiYoYT1vP2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iICAiK3R9KSkuam9pbigiXG4iKS5zdWJzdHIoMik6IlxuIithLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiAgICIrdH0pKS5qb2luKCJcbiIpKTphPXQuc3R5bGl6ZSgiW0NpcmN1bGFyXSIsInNwZWNpYWwiKSksS3Qocykpe2lmKG8mJmkubWF0Y2goL15cZCskLykpcmV0dXJuIGE7KHM9SlNPTi5zdHJpbmdpZnkoIiIraSkpLm1hdGNoKC9eIihbYS16QS1aX11bYS16QS1aXzAtOV0qKSIkLyk/KHM9cy5zdWJzdHIoMSxzLmxlbmd0aC0yKSxzPXQuc3R5bGl6ZShzLCJuYW1lIikpOihzPXMucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpLnJlcGxhY2UoLyheInwiJCkvZywiJyIpLHM9dC5zdHlsaXplKHMsInN0cmluZyIpKX1yZXR1cm4gcysiOiAiK2F9ZnVuY3Rpb24gSnQodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH1mdW5jdGlvbiBIdCh0KXtyZXR1cm4gbnVsbD09PXR9ZnVuY3Rpb24gVnQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fWZ1bmN0aW9uIEt0KHQpe3JldHVybiB2b2lkIDA9PT10fWZ1bmN0aW9uIFp0KHQpe3JldHVybiBRdCh0KSYmIltvYmplY3QgUmVnRXhwXSI9PT1yZSh0KX1mdW5jdGlvbiBRdCh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fWZ1bmN0aW9uIFh0KHQpe3JldHVybiBRdCh0KSYmIltvYmplY3QgRGF0ZV0iPT09cmUodCl9ZnVuY3Rpb24gdGUodCl7cmV0dXJuIFF0KHQpJiYoIltvYmplY3QgRXJyb3JdIj09PXJlKHQpfHx0IGluc3RhbmNlb2YgRXJyb3IpfWZ1bmN0aW9uIGVlKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIHJlKHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbmUodCxlKXtpZighZXx8IVF0KGUpKXJldHVybiB0O2Zvcih2YXIgcj1PYmplY3Qua2V5cyhlKSxuPXIubGVuZ3RoO24tLTspdFtyW25dXT1lW3Jbbl1dO3JldHVybiB0fWZ1bmN0aW9uIGllKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIG9lKCl7dGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH16dC5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LHp0LnN0eWxlcz17c3BlY2lhbDoiY3lhbiIsbnVtYmVyOiJ5ZWxsb3ciLGJvb2xlYW46InllbGxvdyIsdW5kZWZpbmVkOiJncmV5IixudWxsOiJib2xkIixzdHJpbmc6ImdyZWVuIixkYXRlOiJtYWdlbnRhIixyZWdleHA6InJlZCJ9LG9lLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDpudWxsfTt0aGlzLmxlbmd0aD4wP3RoaXMudGFpbC5uZXh0PWU6dGhpcy5oZWFkPWUsdGhpcy50YWlsPWUsKyt0aGlzLmxlbmd0aH0sb2UucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPWUpLHRoaXMuaGVhZD1lLCsrdGhpcy5sZW5ndGh9LG9lLnByb3RvdHlwZS5zaGlmdD1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5oZWFkLmRhdGE7cmV0dXJuIDE9PT10aGlzLmxlbmd0aD90aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw6dGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0LC0tdGhpcy5sZW5ndGgsdH19LG9lLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfSxvZS5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBlPXRoaXMuaGVhZCxyPSIiK2UuZGF0YTtlPWUubmV4dDspcis9dCtlLmRhdGE7cmV0dXJuIHJ9LG9lLnByb3RvdHlwZS5jb25jYXQ9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiBBLmFsbG9jKDApO2lmKDE9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcy5oZWFkLmRhdGE7Zm9yKHZhciBlPUEuYWxsb2NVbnNhZmUodD4+PjApLHI9dGhpcy5oZWFkLG49MDtyOylyLmRhdGEuY29weShlLG4pLG4rPXIuZGF0YS5sZW5ndGgscj1yLm5leHQ7cmV0dXJuIGV9O3ZhciBzZT1BLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHQpe3N3aXRjaCh0JiZ0LnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOmNhc2UicmF3IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX07ZnVuY3Rpb24gYWUodCl7c3dpdGNoKHRoaXMuZW5jb2Rpbmc9KHR8fCJ1dGY4IikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywiIiksZnVuY3Rpb24odCl7aWYodCYmIXNlKHQpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KX0odCksdGhpcy5lbmNvZGluZyl7Y2FzZSJ1dGY4Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9MzticmVhaztjYXNlInVjczIiOmNhc2UidXRmMTZsZSI6dGhpcy5zdXJyb2dhdGVTaXplPTIsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1oZTticmVhaztjYXNlImJhc2U2NCI6dGhpcy5zdXJyb2dhdGVTaXplPTMsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1mZTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkKHRoaXMud3JpdGU9dWUpfXRoaXMuY2hhckJ1ZmZlcj1uZXcgQSg2KSx0aGlzLmNoYXJSZWNlaXZlZD0wLHRoaXMuY2hhckxlbmd0aD0wfWZ1bmN0aW9uIHVlKHQpe3JldHVybiB0LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpfWZ1bmN0aW9uIGhlKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTIsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzI6MH1mdW5jdGlvbiBmZSh0KXt0aGlzLmNoYXJSZWNlaXZlZD10Lmxlbmd0aCUzLHRoaXMuY2hhckxlbmd0aD10aGlzLmNoYXJSZWNlaXZlZD8zOjB9YWUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0iIjt0aGlzLmNoYXJMZW5ndGg7KXt2YXIgcj10Lmxlbmd0aD49dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkP3RoaXMuY2hhckxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZDp0Lmxlbmd0aDtpZih0LmNvcHkodGhpcy5jaGFyQnVmZmVyLHRoaXMuY2hhclJlY2VpdmVkLDAsciksdGhpcy5jaGFyUmVjZWl2ZWQrPXIsdGhpcy5jaGFyUmVjZWl2ZWQ8dGhpcy5jaGFyTGVuZ3RoKXJldHVybiIiO2lmKHQ9dC5zbGljZShyLHQubGVuZ3RoKSwhKChpPShlPXRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZykpLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkpPj01NTI5NiYmaTw9NTYzMTkpKXtpZih0aGlzLmNoYXJSZWNlaXZlZD10aGlzLmNoYXJMZW5ndGg9MCwwPT09dC5sZW5ndGgpcmV0dXJuIGU7YnJlYWt9dGhpcy5jaGFyTGVuZ3RoKz10aGlzLnN1cnJvZ2F0ZVNpemUsZT0iIn10aGlzLmRldGVjdEluY29tcGxldGVDaGFyKHQpO3ZhciBuPXQubGVuZ3RoO3RoaXMuY2hhckxlbmd0aCYmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCx0Lmxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZCxuKSxuLT10aGlzLmNoYXJSZWNlaXZlZCk7dmFyIGk7bj0oZSs9dC50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsbikpLmxlbmd0aC0xO2lmKChpPWUuY2hhckNvZGVBdChuKSk+PTU1Mjk2JiZpPD01NjMxOSl7dmFyIG89dGhpcy5zdXJyb2dhdGVTaXplO3JldHVybiB0aGlzLmNoYXJMZW5ndGgrPW8sdGhpcy5jaGFyUmVjZWl2ZWQrPW8sdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLG8sMCxvKSx0LmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsMCxvKSxlLnN1YnN0cmluZygwLG4pfXJldHVybiBlfSxhZS5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoPj0zPzM6dC5sZW5ndGg7ZT4wO2UtLSl7dmFyIHI9dFt0Lmxlbmd0aC1lXTtpZigxPT1lJiZyPj41PT02KXt0aGlzLmNoYXJMZW5ndGg9MjticmVha31pZihlPD0yJiZyPj40PT0xNCl7dGhpcy5jaGFyTGVuZ3RoPTM7YnJlYWt9aWYoZTw9MyYmcj4+Mz09MzApe3RoaXMuY2hhckxlbmd0aD00O2JyZWFrfX10aGlzLmNoYXJSZWNlaXZlZD1lfSxhZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPSIiO2lmKHQmJnQubGVuZ3RoJiYoZT10aGlzLndyaXRlKHQpKSx0aGlzLmNoYXJSZWNlaXZlZCl7dmFyIHI9dGhpcy5jaGFyUmVjZWl2ZWQsbj10aGlzLmNoYXJCdWZmZXIsaT10aGlzLmVuY29kaW5nO2UrPW4uc2xpY2UoMCxyKS50b1N0cmluZyhpKX1yZXR1cm4gZX0scGUuUmVhZGFibGVTdGF0ZT1sZTt2YXIgY2U9ZnVuY3Rpb24odCl7aWYoS3QoTnQpJiYoTnQ9QnQuZW52Lk5PREVfREVCVUd8fCIiKSx0PXQudG9VcHBlckNhc2UoKSwhRnRbdF0paWYobmV3IFJlZ0V4cCgiXFxiIit0KyJcXGIiLCJpIikudGVzdChOdCkpe0Z0W3RdPWZ1bmN0aW9uKCl7dmFyIGU9SXQuYXBwbHkobnVsbCxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoIiVzICVkOiAlcyIsdCwwLGUpfX1lbHNlIEZ0W3RdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gRnRbdF19KCJzdHJlYW0iKTtmdW5jdGlvbiBsZSh0LGUpe3Q9dHx8e30sdGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLGUgaW5zdGFuY2VvZiBGZSYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC5yZWFkYWJsZU9iamVjdE1vZGUpO3ZhciByPXQuaGlnaFdhdGVyTWFyayxuPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9cnx8MD09PXI/cjpuLHRoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyayx0aGlzLmJ1ZmZlcj1uZXcgb2UsdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5yYW5PdXQ9ITEsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsdC5lbmNvZGluZyYmKHRoaXMuZGVjb2Rlcj1uZXcgYWUodC5lbmNvZGluZyksdGhpcy5lbmNvZGluZz10LmVuY29kaW5nKX1mdW5jdGlvbiBwZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBwZSkpcmV0dXJuIG5ldyBwZSh0KTt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBsZSh0LHRoaXMpLHRoaXMucmVhZGFibGU9ITAsdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmKHRoaXMuX3JlYWQ9dC5yZWFkKSxlLmNhbGwodGhpcyl9ZnVuY3Rpb24gZGUodCxlLHIsbixpKXt2YXIgbz1mdW5jdGlvbih0LGUpe3ZhciByPW51bGw7QS5pc0J1ZmZlcihlKXx8InN0cmluZyI9PXR5cGVvZiBlfHxudWxsPT1lfHx0Lm9iamVjdE1vZGV8fChyPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSk7cmV0dXJuIHJ9KGUscik7aWYobyl0LmVtaXQoImVycm9yIixvKTtlbHNlIGlmKG51bGw9PT1yKWUucmVhZGluZz0hMSxmdW5jdGlvbih0LGUpe2lmKGUuZW5kZWQpcmV0dXJuO2lmKGUuZGVjb2Rlcil7dmFyIHI9ZS5kZWNvZGVyLmVuZCgpO3ImJnIubGVuZ3RoJiYoZS5idWZmZXIucHVzaChyKSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgpfWUuZW5kZWQ9ITAseWUodCl9KHQsZSk7ZWxzZSBpZihlLm9iamVjdE1vZGV8fHImJnIubGVuZ3RoPjApaWYoZS5lbmRlZCYmIWkpe3ZhciBzPW5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKTt0LmVtaXQoImVycm9yIixzKX1lbHNlIGlmKGUuZW5kRW1pdHRlZCYmaSl7dmFyIGE9bmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpO3QuZW1pdCgiZXJyb3IiLGEpfWVsc2V7dmFyIHU7IWUuZGVjb2Rlcnx8aXx8bnx8KHI9ZS5kZWNvZGVyLndyaXRlKHIpLHU9IWUub2JqZWN0TW9kZSYmMD09PXIubGVuZ3RoKSxpfHwoZS5yZWFkaW5nPSExKSx1fHwoZS5mbG93aW5nJiYwPT09ZS5sZW5ndGgmJiFlLnN5bmM/KHQuZW1pdCgiZGF0YSIsciksdC5yZWFkKDApKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoLGk/ZS5idWZmZXIudW5zaGlmdChyKTplLmJ1ZmZlci5wdXNoKHIpLGUubmVlZFJlYWRhYmxlJiZ5ZSh0KSkpLGZ1bmN0aW9uKHQsZSl7ZS5yZWFkaW5nTW9yZXx8KGUucmVhZGluZ01vcmU9ITAsd3QoYmUsdCxlKSl9KHQsZSl9ZWxzZSBpfHwoZS5yZWFkaW5nPSExKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIXQuZW5kZWQmJih0Lm5lZWRSZWFkYWJsZXx8dC5sZW5ndGg8dC5oaWdoV2F0ZXJNYXJrfHwwPT09dC5sZW5ndGgpfShlKX14dChwZSxlKSxwZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHIub2JqZWN0TW9kZXx8InN0cmluZyIhPXR5cGVvZiB0fHwoZT1lfHxyLmRlZmF1bHRFbmNvZGluZykhPT1yLmVuY29kaW5nJiYodD1BLmZyb20odCxlKSxlPSIiKSxkZSh0aGlzLHIsdCxlLCExKX0scGUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGRlKHRoaXMsdGhpcy5fcmVhZGFibGVTdGF0ZSx0LCIiLCEwKX0scGUucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LHBlLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPW5ldyBhZSh0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307ZnVuY3Rpb24gZ2UodCxlKXtyZXR1cm4gdDw9MHx8MD09PWUubGVuZ3RoJiZlLmVuZGVkPzA6ZS5vYmplY3RNb2RlPzE6dCE9dD9lLmZsb3dpbmcmJmUubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg6ZS5sZW5ndGg6KHQ+ZS5oaWdoV2F0ZXJNYXJrJiYoZS5oaWdoV2F0ZXJNYXJrPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj04Mzg4NjA4P3Q9ODM4ODYwODoodC0tLHR8PXQ+Pj4xLHR8PXQ+Pj4yLHR8PXQ+Pj40LHR8PXQ+Pj44LHR8PXQ+Pj4xNix0KyspLHR9KHQpKSx0PD1lLmxlbmd0aD90OmUuZW5kZWQ/ZS5sZW5ndGg6KGUubmVlZFJlYWRhYmxlPSEwLDApKX1mdW5jdGlvbiB5ZSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2UubmVlZFJlYWRhYmxlPSExLGUuZW1pdHRlZFJlYWRhYmxlfHwoY2UoImVtaXRSZWFkYWJsZSIsZS5mbG93aW5nKSxlLmVtaXR0ZWRSZWFkYWJsZT0hMCxlLnN5bmM/d3QodmUsdCk6dmUodCkpfWZ1bmN0aW9uIHZlKHQpe2NlKCJlbWl0IHJlYWRhYmxlIiksdC5lbWl0KCJyZWFkYWJsZSIpLF9lKHQpfWZ1bmN0aW9uIGJlKHQsZSl7Zm9yKHZhciByPWUubGVuZ3RoOyFlLnJlYWRpbmcmJiFlLmZsb3dpbmcmJiFlLmVuZGVkJiZlLmxlbmd0aDxlLmhpZ2hXYXRlck1hcmsmJihjZSgibWF5YmVSZWFkTW9yZSByZWFkIDAiKSx0LnJlYWQoMCksciE9PWUubGVuZ3RoKTspcj1lLmxlbmd0aDtlLnJlYWRpbmdNb3JlPSExfWZ1bmN0aW9uIG1lKHQpe2NlKCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDAiKSx0LnJlYWQoMCl9ZnVuY3Rpb24gd2UodCxlKXtlLnJlYWRpbmd8fChjZSgicmVzdW1lIHJlYWQgMCIpLHQucmVhZCgwKSksZS5yZXN1bWVTY2hlZHVsZWQ9ITEsZS5hd2FpdERyYWluPTAsdC5lbWl0KCJyZXN1bWUiKSxfZSh0KSxlLmZsb3dpbmcmJiFlLnJlYWRpbmcmJnQucmVhZCgwKX1mdW5jdGlvbiBfZSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2ZvcihjZSgiZmxvdyIsZS5mbG93aW5nKTtlLmZsb3dpbmcmJm51bGwhPT10LnJlYWQoKTspO31mdW5jdGlvbiBTZSh0LGUpe3JldHVybiAwPT09ZS5sZW5ndGg/bnVsbDooZS5vYmplY3RNb2RlP3I9ZS5idWZmZXIuc2hpZnQoKTohdHx8dD49ZS5sZW5ndGg/KHI9ZS5kZWNvZGVyP2UuYnVmZmVyLmpvaW4oIiIpOjE9PT1lLmJ1ZmZlci5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhOmUuYnVmZmVyLmNvbmNhdChlLmxlbmd0aCksZS5idWZmZXIuY2xlYXIoKSk6cj1mdW5jdGlvbih0LGUscil7dmFyIG47dDxlLmhlYWQuZGF0YS5sZW5ndGg/KG49ZS5oZWFkLmRhdGEuc2xpY2UoMCx0KSxlLmhlYWQuZGF0YT1lLmhlYWQuZGF0YS5zbGljZSh0KSk6bj10PT09ZS5oZWFkLmRhdGEubGVuZ3RoP2Uuc2hpZnQoKTpyP2Z1bmN0aW9uKHQsZSl7dmFyIHI9ZS5oZWFkLG49MSxpPXIuZGF0YTt0LT1pLmxlbmd0aDtmb3IoO3I9ci5uZXh0Oyl7dmFyIG89ci5kYXRhLHM9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKHM9PT1vLmxlbmd0aD9pKz1vOmkrPW8uc2xpY2UoMCx0KSwwPT09KHQtPXMpKXtzPT09by5sZW5ndGg/KCsrbixyLm5leHQ/ZS5oZWFkPXIubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9cixyLmRhdGE9by5zbGljZShzKSk7YnJlYWt9KytufXJldHVybiBlLmxlbmd0aC09bixpfSh0LGUpOmZ1bmN0aW9uKHQsZSl7dmFyIHI9QS5hbGxvY1Vuc2FmZSh0KSxuPWUuaGVhZCxpPTE7bi5kYXRhLmNvcHkociksdC09bi5kYXRhLmxlbmd0aDtmb3IoO249bi5uZXh0Oyl7dmFyIG89bi5kYXRhLHM9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKG8uY29weShyLHIubGVuZ3RoLXQsMCxzKSwwPT09KHQtPXMpKXtzPT09by5sZW5ndGg/KCsraSxuLm5leHQ/ZS5oZWFkPW4ubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9bixuLmRhdGE9by5zbGljZShzKSk7YnJlYWt9KytpfXJldHVybiBlLmxlbmd0aC09aSxyfSh0LGUpO3JldHVybiBufSh0LGUuYnVmZmVyLGUuZGVjb2Rlcikscik7dmFyIHJ9ZnVuY3Rpb24gRWUodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtpZihlLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcignImVuZFJlYWRhYmxlKCkiIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7ZS5lbmRFbWl0dGVkfHwoZS5lbmRlZD0hMCx3dChrZSxlLHQpKX1mdW5jdGlvbiBrZSh0LGUpe3QuZW5kRW1pdHRlZHx8MCE9PXQubGVuZ3RofHwodC5lbmRFbWl0dGVkPSEwLGUucmVhZGFibGU9ITEsZS5lbWl0KCJlbmQiKSl9ZnVuY3Rpb24gUmUodCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gQWUoKXt9ZnVuY3Rpb24gVGUodCxlLHIpe3RoaXMuY2h1bms9dCx0aGlzLmVuY29kaW5nPWUsdGhpcy5jYWxsYmFjaz1yLHRoaXMubmV4dD1udWxsfWZ1bmN0aW9uIE9lKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJ1ZmZlciIse2dldDpEdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0pLCJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLiIpfSksdD10fHx7fSx0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsZSBpbnN0YW5jZW9mIEZlJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LndyaXRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLG49dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1yfHwwPT09cj9yOm4sdGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrLHRoaXMubmVlZERyYWluPSExLHRoaXMuZW5kaW5nPSExLHRoaXMuZW5kZWQ9ITEsdGhpcy5maW5pc2hlZD0hMTt2YXIgaT0hMT09PXQuZGVjb2RlU3RyaW5nczt0aGlzLmRlY29kZVN0cmluZ3M9IWksdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmxlbmd0aD0wLHRoaXMud3JpdGluZz0hMSx0aGlzLmNvcmtlZD0wLHRoaXMuc3luYz0hMCx0aGlzLmJ1ZmZlclByb2Nlc3Npbmc9ITEsdGhpcy5vbndyaXRlPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe3ZhciByPXQuX3dyaXRhYmxlU3RhdGUsbj1yLnN5bmMsaT1yLndyaXRlY2I7aWYoZnVuY3Rpb24odCl7dC53cml0aW5nPSExLHQud3JpdGVjYj1udWxsLHQubGVuZ3RoLT10LndyaXRlbGVuLHQud3JpdGVsZW49MH0ociksZSkhZnVuY3Rpb24odCxlLHIsbixpKXstLWUucGVuZGluZ2NiLHI/d3QoaSxuKTppKG4pO3QuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHQuZW1pdCgiZXJyb3IiLG4pfSh0LHIsbixlLGkpO2Vsc2V7dmFyIG89TWUocik7b3x8ci5jb3JrZWR8fHIuYnVmZmVyUHJvY2Vzc2luZ3x8IXIuYnVmZmVyZWRSZXF1ZXN0fHxQZSh0LHIpLG4/d3QoQ2UsdCxyLG8saSk6Q2UodCxyLG8saSl9fShlLHQpfSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlbGVuPTAsdGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLnBlbmRpbmdjYj0wLHRoaXMucHJlZmluaXNoZWQ9ITEsdGhpcy5lcnJvckVtaXR0ZWQ9ITEsdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudD0wLHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBVZSh0aGlzKX1mdW5jdGlvbiBqZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBqZXx8dGhpcyBpbnN0YW5jZW9mIEZlKSlyZXR1cm4gbmV3IGplKHQpO3RoaXMuX3dyaXRhYmxlU3RhdGU9bmV3IE9lKHQsdGhpcyksdGhpcy53cml0YWJsZT0hMCx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGUmJih0aGlzLl93cml0ZT10LndyaXRlKSwiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZXYmJih0aGlzLl93cml0ZXY9dC53cml0ZXYpKSxlLmNhbGwodGhpcyl9ZnVuY3Rpb24gTGUodCxlLHIsbixpLG8scyl7ZS53cml0ZWxlbj1uLGUud3JpdGVjYj1zLGUud3JpdGluZz0hMCxlLnN5bmM9ITAscj90Ll93cml0ZXYoaSxlLm9ud3JpdGUpOnQuX3dyaXRlKGksbyxlLm9ud3JpdGUpLGUuc3luYz0hMX1mdW5jdGlvbiBDZSh0LGUscixuKXtyfHxmdW5jdGlvbih0LGUpezA9PT1lLmxlbmd0aCYmZS5uZWVkRHJhaW4mJihlLm5lZWREcmFpbj0hMSx0LmVtaXQoImRyYWluIikpfSh0LGUpLGUucGVuZGluZ2NiLS0sbigpLHhlKHQsZSl9ZnVuY3Rpb24gUGUodCxlKXtlLmJ1ZmZlclByb2Nlc3Npbmc9ITA7dmFyIHI9ZS5idWZmZXJlZFJlcXVlc3Q7aWYodC5fd3JpdGV2JiZyJiZyLm5leHQpe3ZhciBuPWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQsaT1uZXcgQXJyYXkobiksbz1lLmNvcmtlZFJlcXVlc3RzRnJlZTtvLmVudHJ5PXI7Zm9yKHZhciBzPTA7cjspaVtzXT1yLHI9ci5uZXh0LHMrPTE7TGUodCxlLCEwLGUubGVuZ3RoLGksIiIsby5maW5pc2gpLGUucGVuZGluZ2NiKyssZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsby5uZXh0PyhlLmNvcmtlZFJlcXVlc3RzRnJlZT1vLm5leHQsby5uZXh0PW51bGwpOmUuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBVZShlKX1lbHNle2Zvcig7cjspe3ZhciBhPXIuY2h1bmssdT1yLmVuY29kaW5nLGg9ci5jYWxsYmFjaztpZihMZSh0LGUsITEsZS5vYmplY3RNb2RlPzE6YS5sZW5ndGgsYSx1LGgpLHI9ci5uZXh0LGUud3JpdGluZylicmVha31udWxsPT09ciYmKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsZS5idWZmZXJlZFJlcXVlc3Q9cixlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9ZnVuY3Rpb24gTWUodCl7cmV0dXJuIHQuZW5kaW5nJiYwPT09dC5sZW5ndGgmJm51bGw9PT10LmJ1ZmZlcmVkUmVxdWVzdCYmIXQuZmluaXNoZWQmJiF0LndyaXRpbmd9ZnVuY3Rpb24gQmUodCxlKXtlLnByZWZpbmlzaGVkfHwoZS5wcmVmaW5pc2hlZD0hMCx0LmVtaXQoInByZWZpbmlzaCIpKX1mdW5jdGlvbiB4ZSh0LGUpe3ZhciByPU1lKGUpO3JldHVybiByJiYoMD09PWUucGVuZGluZ2NiPyhCZSh0LGUpLGUuZmluaXNoZWQ9ITAsdC5lbWl0KCJmaW5pc2giKSk6QmUodCxlKSkscn1mdW5jdGlvbiBVZSh0KXt2YXIgZT10aGlzO3RoaXMubmV4dD1udWxsLHRoaXMuZW50cnk9bnVsbCx0aGlzLmZpbmlzaD1mdW5jdGlvbihyKXt2YXIgbj1lLmVudHJ5O2ZvcihlLmVudHJ5PW51bGw7bjspe3ZhciBpPW4uY2FsbGJhY2s7dC5wZW5kaW5nY2ItLSxpKHIpLG49bi5uZXh0fXQuY29ya2VkUmVxdWVzdHNGcmVlP3QuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9ZTp0LmNvcmtlZFJlcXVlc3RzRnJlZT1lfX1wZS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXtjZSgicmVhZCIsdCksdD1wYXJzZUludCh0LDEwKTt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHI9dDtpZigwIT09dCYmKGUuZW1pdHRlZFJlYWRhYmxlPSExKSwwPT09dCYmZS5uZWVkUmVhZGFibGUmJihlLmxlbmd0aD49ZS5oaWdoV2F0ZXJNYXJrfHxlLmVuZGVkKSlyZXR1cm4gY2UoInJlYWQ6IGVtaXRSZWFkYWJsZSIsZS5sZW5ndGgsZS5lbmRlZCksMD09PWUubGVuZ3RoJiZlLmVuZGVkP0VlKHRoaXMpOnllKHRoaXMpLG51bGw7aWYoMD09PSh0PWdlKHQsZSkpJiZlLmVuZGVkKXJldHVybiAwPT09ZS5sZW5ndGgmJkVlKHRoaXMpLG51bGw7dmFyIG4saT1lLm5lZWRSZWFkYWJsZTtyZXR1cm4gY2UoIm5lZWQgcmVhZGFibGUiLGkpLCgwPT09ZS5sZW5ndGh8fGUubGVuZ3RoLXQ8ZS5oaWdoV2F0ZXJNYXJrKSYmY2UoImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrIixpPSEwKSxlLmVuZGVkfHxlLnJlYWRpbmc/Y2UoInJlYWRpbmcgb3IgZW5kZWQiLGk9ITEpOmkmJihjZSgiZG8gcmVhZCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsMD09PWUubGVuZ3RoJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwodD1nZShyLGUpKSksbnVsbD09PShuPXQ+MD9TZSh0LGUpOm51bGwpPyhlLm5lZWRSZWFkYWJsZT0hMCx0PTApOmUubGVuZ3RoLT10LDA9PT1lLmxlbmd0aCYmKGUuZW5kZWR8fChlLm5lZWRSZWFkYWJsZT0hMCksciE9PXQmJmUuZW5kZWQmJkVlKHRoaXMpKSxudWxsIT09biYmdGhpcy5lbWl0KCJkYXRhIixuKSxufSxwZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKSl9LHBlLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKG4ucGlwZXNDb3VudCl7Y2FzZSAwOm4ucGlwZXM9dDticmVhaztjYXNlIDE6bi5waXBlcz1bbi5waXBlcyx0XTticmVhaztkZWZhdWx0Om4ucGlwZXMucHVzaCh0KX1uLnBpcGVzQ291bnQrPTEsY2UoInBpcGUgY291bnQ9JWQgb3B0cz0laiIsbi5waXBlc0NvdW50LGUpO3ZhciBpPSFlfHwhMSE9PWUuZW5kP3M6aDtmdW5jdGlvbiBvKHQpe2NlKCJvbnVucGlwZSIpLHQ9PT1yJiZoKCl9ZnVuY3Rpb24gcygpe2NlKCJvbmVuZCIpLHQuZW5kKCl9bi5lbmRFbWl0dGVkP3d0KGkpOnIub25jZSgiZW5kIixpKSx0Lm9uKCJ1bnBpcGUiLG8pO3ZhciBhPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Y2UoInBpcGVPbkRyYWluIixlLmF3YWl0RHJhaW4pLGUuYXdhaXREcmFpbiYmZS5hd2FpdERyYWluLS0sMD09PWUuYXdhaXREcmFpbiYmdC5saXN0ZW5lcnMoImRhdGEiKS5sZW5ndGgmJihlLmZsb3dpbmc9ITAsX2UodCkpfX0ocik7dC5vbigiZHJhaW4iLGEpO3ZhciB1PSExO2Z1bmN0aW9uIGgoKXtjZSgiY2xlYW51cCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixwKSx0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLGQpLHQucmVtb3ZlTGlzdGVuZXIoImRyYWluIixhKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbCksdC5yZW1vdmVMaXN0ZW5lcigidW5waXBlIixvKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLHMpLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsaCksci5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsYyksdT0hMCwhbi5hd2FpdERyYWlufHx0Ll93cml0YWJsZVN0YXRlJiYhdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW58fGEoKX12YXIgZj0hMTtmdW5jdGlvbiBjKGUpe2NlKCJvbmRhdGEiKSxmPSExLCExIT09dC53cml0ZShlKXx8Znx8KCgxPT09bi5waXBlc0NvdW50JiZuLnBpcGVzPT09dHx8bi5waXBlc0NvdW50PjEmJi0xIT09UmUobi5waXBlcyx0KSkmJiF1JiYoY2UoImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsci5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKSxyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKyxmPSEwKSxyLnBhdXNlKCkpfWZ1bmN0aW9uIGwoZSl7dmFyIHI7Y2UoIm9uZXJyb3IiLGUpLGcoKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbCksMD09PShyPSJlcnJvciIsdC5saXN0ZW5lcnMocikubGVuZ3RoKSYmdC5lbWl0KCJlcnJvciIsZSl9ZnVuY3Rpb24gcCgpe3QucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZCksZygpfWZ1bmN0aW9uIGQoKXtjZSgib25maW5pc2giKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIscCksZygpfWZ1bmN0aW9uIGcoKXtjZSgidW5waXBlIiksci51bnBpcGUodCl9cmV0dXJuIHIub24oImRhdGEiLGMpLGZ1bmN0aW9uKHQsZSxyKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5wcmVwZW5kTGlzdGVuZXIpcmV0dXJuIHQucHJlcGVuZExpc3RlbmVyKGUscik7dC5fZXZlbnRzJiZ0Ll9ldmVudHNbZV0/QXJyYXkuaXNBcnJheSh0Ll9ldmVudHNbZV0pP3QuX2V2ZW50c1tlXS51bnNoaWZ0KHIpOnQuX2V2ZW50c1tlXT1bcix0Ll9ldmVudHNbZV1dOnQub24oZSxyKX0odCwiZXJyb3IiLGwpLHQub25jZSgiY2xvc2UiLHApLHQub25jZSgiZmluaXNoIixkKSx0LmVtaXQoInBpcGUiLHIpLG4uZmxvd2luZ3x8KGNlKCJwaXBlIHJlc3VtZSIpLHIucmVzdW1lKCkpLHR9LHBlLnByb3RvdHlwZS51bnBpcGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtpZigwPT09ZS5waXBlc0NvdW50KXJldHVybiB0aGlzO2lmKDE9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHQmJnQhPT1lLnBpcGVzfHwodHx8KHQ9ZS5waXBlcyksZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMSx0JiZ0LmVtaXQoInVucGlwZSIsdGhpcykpLHRoaXM7aWYoIXQpe3ZhciByPWUucGlwZXMsbj1lLnBpcGVzQ291bnQ7ZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMTtmb3IodmFyIGk9MDtpPG47aSsrKXJbaV0uZW1pdCgidW5waXBlIix0aGlzKTtyZXR1cm4gdGhpc312YXIgbz1SZShlLnBpcGVzLHQpO3JldHVybi0xPT09b3x8KGUucGlwZXMuc3BsaWNlKG8sMSksZS5waXBlc0NvdW50LT0xLDE9PT1lLnBpcGVzQ291bnQmJihlLnBpcGVzPWUucGlwZXNbMF0pLHQuZW1pdCgidW5waXBlIix0aGlzKSksdGhpc30scGUucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHQscil7dmFyIG49ZS5wcm90b3R5cGUub24uY2FsbCh0aGlzLHQscik7aWYoImRhdGEiPT09dCkhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmdGhpcy5yZXN1bWUoKTtlbHNlIGlmKCJyZWFkYWJsZSI9PT10KXt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlO2kuZW5kRW1pdHRlZHx8aS5yZWFkYWJsZUxpc3RlbmluZ3x8KGkucmVhZGFibGVMaXN0ZW5pbmc9aS5uZWVkUmVhZGFibGU9ITAsaS5lbWl0dGVkUmVhZGFibGU9ITEsaS5yZWFkaW5nP2kubGVuZ3RoJiZ5ZSh0aGlzKTp3dChtZSx0aGlzKSl9cmV0dXJuIG59LHBlLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1wZS5wcm90b3R5cGUub24scGUucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHQuZmxvd2luZ3x8KGNlKCJyZXN1bWUiKSx0LmZsb3dpbmc9ITAsZnVuY3Rpb24odCxlKXtlLnJlc3VtZVNjaGVkdWxlZHx8KGUucmVzdW1lU2NoZWR1bGVkPSEwLHd0KHdlLHQsZSkpfSh0aGlzLHQpKSx0aGlzfSxwZS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4gY2UoImNhbGwgcGF1c2UgZmxvd2luZz0laiIsdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSwhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmKGNlKCJwYXVzZSIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz0hMSx0aGlzLmVtaXQoInBhdXNlIikpLHRoaXN9LHBlLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj0hMSxuPXRoaXM7Zm9yKHZhciBpIGluIHQub24oImVuZCIsKGZ1bmN0aW9uKCl7aWYoY2UoIndyYXBwZWQgZW5kIiksZS5kZWNvZGVyJiYhZS5lbmRlZCl7dmFyIHQ9ZS5kZWNvZGVyLmVuZCgpO3QmJnQubGVuZ3RoJiZuLnB1c2godCl9bi5wdXNoKG51bGwpfSkpLHQub24oImRhdGEiLChmdW5jdGlvbihpKXsoY2UoIndyYXBwZWQgZGF0YSIpLGUuZGVjb2RlciYmKGk9ZS5kZWNvZGVyLndyaXRlKGkpKSxlLm9iamVjdE1vZGUmJm51bGw9PWkpfHwoZS5vYmplY3RNb2RlfHxpJiZpLmxlbmd0aCkmJihuLnB1c2goaSl8fChyPSEwLHQucGF1c2UoKSkpfSkpLHQpdm9pZCAwPT09dGhpc1tpXSYmImZ1bmN0aW9uIj09dHlwZW9mIHRbaV0mJih0aGlzW2ldPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0W2VdLmFwcGx5KHQsYXJndW1lbnRzKX19KGkpKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspZSh0W3JdLHIpfShbImVycm9yIiwiY2xvc2UiLCJkZXN0cm95IiwicGF1c2UiLCJyZXN1bWUiXSwoZnVuY3Rpb24oZSl7dC5vbihlLG4uZW1pdC5iaW5kKG4sZSkpfSkpLG4uX3JlYWQ9ZnVuY3Rpb24oZSl7Y2UoIndyYXBwZWQgX3JlYWQiLGUpLHImJihyPSExLHQucmVzdW1lKCkpfSxufSxwZS5fZnJvbUxpc3Q9U2UsamUuV3JpdGFibGVTdGF0ZT1PZSx4dChqZSxlKSxPZS5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuYnVmZmVyZWRSZXF1ZXN0LGU9W107dDspZS5wdXNoKHQpLHQ9dC5uZXh0O3JldHVybiBlfSxqZS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZSIpKX0samUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlLGk9ITE7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxBLmlzQnVmZmVyKHQpP2U9ImJ1ZmZlciI6ZXx8KGU9bi5kZWZhdWx0RW5jb2RpbmcpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiYocj1BZSksbi5lbmRlZD9mdW5jdGlvbih0LGUpe3ZhciByPW5ldyBFcnJvcigid3JpdGUgYWZ0ZXIgZW5kIik7dC5lbWl0KCJlcnJvciIsciksd3QoZSxyKX0odGhpcyxyKTpmdW5jdGlvbih0LGUscixuKXt2YXIgaT0hMCxvPSExO3JldHVybiBudWxsPT09cj9vPW5ldyBUeXBlRXJyb3IoIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtIik6QS5pc0J1ZmZlcihyKXx8InN0cmluZyI9PXR5cGVvZiByfHx2b2lkIDA9PT1yfHxlLm9iamVjdE1vZGV8fChvPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSksbyYmKHQuZW1pdCgiZXJyb3IiLG8pLHd0KG4sbyksaT0hMSksaX0odGhpcyxuLHQscikmJihuLnBlbmRpbmdjYisrLGk9ZnVuY3Rpb24odCxlLHIsbixpKXtyPWZ1bmN0aW9uKHQsZSxyKXt0Lm9iamVjdE1vZGV8fCExPT09dC5kZWNvZGVTdHJpbmdzfHwic3RyaW5nIiE9dHlwZW9mIGV8fChlPUEuZnJvbShlLHIpKTtyZXR1cm4gZX0oZSxyLG4pLEEuaXNCdWZmZXIocikmJihuPSJidWZmZXIiKTt2YXIgbz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aDtlLmxlbmd0aCs9bzt2YXIgcz1lLmxlbmd0aDxlLmhpZ2hXYXRlck1hcms7c3x8KGUubmVlZERyYWluPSEwKTtpZihlLndyaXRpbmd8fGUuY29ya2VkKXt2YXIgYT1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q7ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW5ldyBUZShyLG4saSksYT9hLm5leHQ9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0OmUuYnVmZmVyZWRSZXF1ZXN0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdCxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50Kz0xfWVsc2UgTGUodCxlLCExLG8scixuLGkpO3JldHVybiBzfSh0aGlzLG4sdCxlLHIpKSxpfSxqZS5wcm90b3R5cGUuY29yaz1mdW5jdGlvbigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKyt9LGplLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93cml0YWJsZVN0YXRlO3QuY29ya2VkJiYodC5jb3JrZWQtLSx0LndyaXRpbmd8fHQuY29ya2VkfHx0LmZpbmlzaGVkfHx0LmJ1ZmZlclByb2Nlc3Npbmd8fCF0LmJ1ZmZlcmVkUmVxdWVzdHx8UGUodGhpcyx0KSl9LGplLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2Rpbmc9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnRvTG93ZXJDYXNlKCkpLCEoWyJoZXgiLCJ1dGY4IiwidXRmLTgiLCJhc2NpaSIsImJpbmFyeSIsImJhc2U2NCIsInVjczIiLCJ1Y3MtMiIsInV0ZjE2bGUiLCJ1dGYtMTZsZSIsInJhdyJdLmluZGV4T2YoKHQrIiIpLnRvTG93ZXJDYXNlKCkpPi0xKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZz10LHRoaXN9LGplLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3IobmV3IEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKSl9LGplLnByb3RvdHlwZS5fd3JpdGV2PW51bGwsamUucHJvdG90eXBlLmVuZD1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZTsiZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10LHQ9bnVsbCxlPW51bGwpOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksbnVsbCE9dCYmdGhpcy53cml0ZSh0LGUpLG4uY29ya2VkJiYobi5jb3JrZWQ9MSx0aGlzLnVuY29yaygpKSxuLmVuZGluZ3x8bi5maW5pc2hlZHx8ZnVuY3Rpb24odCxlLHIpe2UuZW5kaW5nPSEwLHhlKHQsZSksciYmKGUuZmluaXNoZWQ/d3Qocik6dC5vbmNlKCJmaW5pc2giLHIpKTtlLmVuZGVkPSEwLHQud3JpdGFibGU9ITF9KHRoaXMsbixyKX0seHQoRmUscGUpO2Zvcih2YXIgSWU9T2JqZWN0LmtleXMoamUucHJvdG90eXBlKSxEZT0wO0RlPEllLmxlbmd0aDtEZSsrKXt2YXIgTmU9SWVbRGVdO0ZlLnByb3RvdHlwZVtOZV18fChGZS5wcm90b3R5cGVbTmVdPWplLnByb3RvdHlwZVtOZV0pfWZ1bmN0aW9uIEZlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEZlKSlyZXR1cm4gbmV3IEZlKHQpO3BlLmNhbGwodGhpcyx0KSxqZS5jYWxsKHRoaXMsdCksdCYmITE9PT10LnJlYWRhYmxlJiYodGhpcy5yZWFkYWJsZT0hMSksdCYmITE9PT10LndyaXRhYmxlJiYodGhpcy53cml0YWJsZT0hMSksdGhpcy5hbGxvd0hhbGZPcGVuPSEwLHQmJiExPT09dC5hbGxvd0hhbGZPcGVuJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExKSx0aGlzLm9uY2UoImVuZCIsemUpfWZ1bmN0aW9uIHplKCl7dGhpcy5hbGxvd0hhbGZPcGVufHx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHx3dChxZSx0aGlzKX1mdW5jdGlvbiBxZSh0KXt0LmVuZCgpfWZ1bmN0aW9uIFllKHQpe3RoaXMuYWZ0ZXJUcmFuc2Zvcm09ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQuX3RyYW5zZm9ybVN0YXRlO24udHJhbnNmb3JtaW5nPSExO3ZhciBpPW4ud3JpdGVjYjtpZighaSlyZXR1cm4gdC5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcyIpKTtuLndyaXRlY2h1bms9bnVsbCxuLndyaXRlY2I9bnVsbCxudWxsIT1yJiZ0LnB1c2gocik7aShlKTt2YXIgbz10Ll9yZWFkYWJsZVN0YXRlO28ucmVhZGluZz0hMSwoby5uZWVkUmVhZGFibGV8fG8ubGVuZ3RoPG8uaGlnaFdhdGVyTWFyaykmJnQuX3JlYWQoby5oaWdoV2F0ZXJNYXJrKX0odCxlLHIpfSx0aGlzLm5lZWRUcmFuc2Zvcm09ITEsdGhpcy50cmFuc2Zvcm1pbmc9ITEsdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWNodW5rPW51bGwsdGhpcy53cml0ZWVuY29kaW5nPW51bGx9ZnVuY3Rpb24gV2UodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgV2UpKXJldHVybiBuZXcgV2UodCk7RmUuY2FsbCh0aGlzLHQpLHRoaXMuX3RyYW5zZm9ybVN0YXRlPW5ldyBZZSh0aGlzKTt2YXIgZT10aGlzO3RoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQudHJhbnNmb3JtJiYodGhpcy5fdHJhbnNmb3JtPXQudHJhbnNmb3JtKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5mbHVzaCYmKHRoaXMuX2ZsdXNoPXQuZmx1c2gpKSx0aGlzLm9uY2UoInByZWZpbmlzaCIsKGZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX2ZsdXNoP3RoaXMuX2ZsdXNoKChmdW5jdGlvbih0KXskZShlLHQpfSkpOiRlKGUpfSkpfWZ1bmN0aW9uICRlKHQsZSl7aWYoZSlyZXR1cm4gdC5lbWl0KCJlcnJvciIsZSk7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXQuX3RyYW5zZm9ybVN0YXRlO2lmKHIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwIik7aWYobi50cmFuc2Zvcm1pbmcpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nIik7cmV0dXJuIHQucHVzaChudWxsKX1mdW5jdGlvbiBHZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBHZSkpcmV0dXJuIG5ldyBHZSh0KTtXZS5jYWxsKHRoaXMsdCl9ZnVuY3Rpb24gSmUoKXtlLmNhbGwodGhpcyl9eHQoV2UsRmUpLFdlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm09ITEsRmUucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLHQsZSl9LFdlLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfSxXZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZihuLndyaXRlY2I9cixuLndyaXRlY2h1bms9dCxuLndyaXRlZW5jb2Rpbmc9ZSwhbi50cmFuc2Zvcm1pbmcpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7KG4ubmVlZFRyYW5zZm9ybXx8aS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX19LFdlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90cmFuc2Zvcm1TdGF0ZTtudWxsIT09ZS53cml0ZWNodW5rJiZlLndyaXRlY2ImJiFlLnRyYW5zZm9ybWluZz8oZS50cmFuc2Zvcm1pbmc9ITAsdGhpcy5fdHJhbnNmb3JtKGUud3JpdGVjaHVuayxlLndyaXRlZW5jb2RpbmcsZS5hZnRlclRyYW5zZm9ybSkpOmUubmVlZFRyYW5zZm9ybT0hMH0seHQoR2UsV2UpLEdlLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXtyKG51bGwsdCl9LHh0KEplLGUpLEplLlJlYWRhYmxlPXBlLEplLldyaXRhYmxlPWplLEplLkR1cGxleD1GZSxKZS5UcmFuc2Zvcm09V2UsSmUuUGFzc1Rocm91Z2g9R2UsSmUuU3RyZWFtPUplLEplLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQscil7dmFyIG49dGhpcztmdW5jdGlvbiBpKGUpe3Qud3JpdGFibGUmJiExPT09dC53cml0ZShlKSYmbi5wYXVzZSYmbi5wYXVzZSgpfWZ1bmN0aW9uIG8oKXtuLnJlYWRhYmxlJiZuLnJlc3VtZSYmbi5yZXN1bWUoKX1uLm9uKCJkYXRhIixpKSx0Lm9uKCJkcmFpbiIsbyksdC5faXNTdGRpb3x8ciYmITE9PT1yLmVuZHx8KG4ub24oImVuZCIsYSksbi5vbigiY2xvc2UiLHUpKTt2YXIgcz0hMTtmdW5jdGlvbiBhKCl7c3x8KHM9ITAsdC5lbmQoKSl9ZnVuY3Rpb24gdSgpe3N8fChzPSEwLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRlc3Ryb3kmJnQuZGVzdHJveSgpKX1mdW5jdGlvbiBoKHQpe2lmKGYoKSwwPT09ZS5saXN0ZW5lckNvdW50KHRoaXMsImVycm9yIikpdGhyb3cgdH1mdW5jdGlvbiBmKCl7bi5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsaSksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLG8pLG4ucmVtb3ZlTGlzdGVuZXIoImVuZCIsYSksbi5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHUpLG4ucmVtb3ZlTGlzdGVuZXIoImVycm9yIixoKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsaCksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixmKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGYpfXJldHVybiBuLm9uKCJlcnJvciIsaCksdC5vbigiZXJyb3IiLGgpLG4ub24oImVuZCIsZiksbi5vbigiY2xvc2UiLGYpLHQub24oImNsb3NlIixmKSx0LmVtaXQoInBpcGUiLG4pLHR9O3ZhciBIZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O3ZhciBWZSxLZSxaZT0oVmU9ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7ZSYmKHQuc3VwZXJfPWUsdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSkpfTp0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihlKXt0LnN1cGVyXz1lO3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fX19LFZlKEtlPXtleHBvcnRzOnt9fSxLZS5leHBvcnRzKSxLZS5leHBvcnRzKTtsZXQgUWU9dHIoKTtmdW5jdGlvbiBYZSh0LGUpeygib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCkpJiYoZT10LHQ9e30pO2xldCByPW5ldyBRZSh0KTt2YXIgbjtyZXR1cm4gci5fZnJvbT1BcnJheS5pc0FycmF5KGUpPyhuPShuPWUpLnNsaWNlKCksZnVuY3Rpb24odCxlKXtsZXQgcj1udWxsLGk9bi5sZW5ndGg/bi5zaGlmdCgpOm51bGw7aSBpbnN0YW5jZW9mIEVycm9yJiYocj1pLGk9bnVsbCksZShyLGkpfSk6ZXx8ZXIscn1mdW5jdGlvbiB0cih0LGUpe2Z1bmN0aW9uIHIoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByKGUpO3RoaXMuX3JlYWRpbmc9ITEsdGhpcy5fY2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtpZihuLmRlc3Ryb3llZClyZXR1cm47aWYodClyZXR1cm4gbi5kZXN0cm95KHQpO2lmKG51bGw9PT1lKXJldHVybiBuLnB1c2gobnVsbCk7bi5fcmVhZGluZz0hMSxuLnB1c2goZSkmJm4uX3JlYWQoaSl9LHRoaXMuZGVzdHJveWVkPSExLHBlLmNhbGwodGhpcyxlfHx0KTtsZXQgbj10aGlzLGk9dGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZT10LHQ9e30pLHQ9cnIodCksWmUocixwZSksci5wcm90b3R5cGUuX2Zyb209ZXx8ZXIsci5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5fcmVhZGluZ3x8dGhpcy5kZXN0cm95ZWR8fCh0aGlzLl9yZWFkaW5nPSEwLHRoaXMuX2Zyb20odCx0aGlzLl9jYWxsYmFjaykpfSxyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKHQpe2lmKHRoaXMuZGVzdHJveWVkKXJldHVybjt0aGlzLmRlc3Ryb3llZD0hMDtsZXQgZT10aGlzO3Byb2Nlc3MubmV4dFRpY2soKGZ1bmN0aW9uKCl7dCYmZS5lbWl0KCJlcnJvciIsdCksZS5lbWl0KCJjbG9zZSIpfSkpfSxyfWZ1bmN0aW9uIGVyKCl7fWZ1bmN0aW9uIHJyKHQpe3JldHVybiB0PXR8fHt9fVhlLmN0b3I9dHIsWGUub2JqPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKCJmdW5jdGlvbiI9PXR5cGVvZiB0fHxBcnJheS5pc0FycmF5KHQpKSYmKGU9dCx0PXt9KSwodD1ycih0KSkub2JqZWN0TW9kZT0hMCx0LmhpZ2hXYXRlck1hcms9MTYsWGUodCxlKX07dmFyIG5yLGlyPTEsb3I9e30sc3I9ITEsYXI9bC5kb2N1bWVudDtmdW5jdGlvbiB1cih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9bmV3IEZ1bmN0aW9uKCIiK3QpKTtmb3IodmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSkscj0wO3I8ZS5sZW5ndGg7cisrKWVbcl09YXJndW1lbnRzW3IrMV07dmFyIG49e2NhbGxiYWNrOnQsYXJnczplfTtyZXR1cm4gb3JbaXJdPW4sbnIoaXIpLGlyKyt9ZnVuY3Rpb24gaHIodCl7aWYoc3Ipc2V0VGltZW91dChociwwLHQpO2Vsc2V7dmFyIGU9b3JbdF07aWYoZSl7c3I9ITA7dHJ5eyFmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLHI9dC5hcmdzO3N3aXRjaChyLmxlbmd0aCl7Y2FzZSAwOmUoKTticmVhaztjYXNlIDE6ZShyWzBdKTticmVhaztjYXNlIDI6ZShyWzBdLHJbMV0pO2JyZWFrO2Nhc2UgMzplKHJbMF0sclsxXSxyWzJdKTticmVhaztkZWZhdWx0OmUuYXBwbHkodm9pZCAwLHIpfX0oZSl9ZmluYWxseXshZnVuY3Rpb24odCl7ZGVsZXRlIG9yW3RdfSh0KSxzcj0hMX19fX12YXIgZnIsY3IsbHIscHIsZHI9T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YobCk7ZnVuY3Rpb24gZ3IodCl7bGV0IGUscj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7aWYoZT0iW29iamVjdCBQcm9taXNlXSI9PT1yLGUpcmV0dXJuITA7aWYoIltvYmplY3QgRnVuY3Rpb25dIiE9PXIpcmV0dXJuITE7dHJ5e2U9ImZ1bmN0aW9uIiE9dHlwZW9mIHQuc3Vic2NyaWJlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVufWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiB5cih0KXtsZXQgZSxyLG47ZnVuY3Rpb24gaShpKXsoKHQ9aSlpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxBcnJheUJ1ZmZlci5pc1ZpZXcodCkmJiFBLmlzQnVmZmVyKHQpKSYmKHQ9QS5mcm9tKHQpKSxlPWdyKHQpP3Q6bnVsbDtjb25zdCBvPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0mJiJzdHJpbmciIT10eXBlb2YgdCYmIUEuaXNCdWZmZXIodCk7cj1vP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGw7Y29uc3Qgcz0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl07bj1zP3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6bnVsbH1yZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dC5zbGljZSgpKSxpKHQpLFhlKChmdW5jdGlvbiBvKHMsYSl7aWYoZSlyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMscyxhKX1jYXRjaCh0KXthKHQpfX0pKCk7aWYocil7Y29uc3QgdD1yLm5leHQoKTtyZXR1cm4gdm9pZCB1cihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9aWYobilyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7dXIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe3VyKGEsdCl9fSkoKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHZvaWQgdXIoYSxudWxsLG51bGwpO2NvbnN0IHU9dC5zbGljZSgwLHMpO3Q9dC5zbGljZShzKSx1cihhLG51bGwsdSl9KSl9ZHI9ZHImJmRyLnNldFRpbWVvdXQ/ZHI6bCwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKGwucHJvY2Vzcyk/bnI9ZnVuY3Rpb24odCl7QnQubmV4dFRpY2soKGZ1bmN0aW9uKCl7aHIodCl9KSl9OiFmdW5jdGlvbigpe2lmKGwucG9zdE1lc3NhZ2UmJiFsLmltcG9ydFNjcmlwdHMpe3ZhciB0PSEwLGU9bC5vbm1lc3NhZ2U7cmV0dXJuIGwub25tZXNzYWdlPWZ1bmN0aW9uKCl7dD0hMX0sbC5wb3N0TWVzc2FnZSgiIiwiKiIpLGwub25tZXNzYWdlPWUsdH19KCk/bC5NZXNzYWdlQ2hhbm5lbD8oKGNyPW5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKHQpe2hyKHQuZGF0YSl9LG5yPWZ1bmN0aW9uKHQpe2NyLnBvcnQyLnBvc3RNZXNzYWdlKHQpfSk6YXImJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gYXIuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/KGZyPWFyLmRvY3VtZW50RWxlbWVudCxucj1mdW5jdGlvbih0KXt2YXIgZT1hci5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2hyKHQpLGUub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZnIucmVtb3ZlQ2hpbGQoZSksZT1udWxsfSxmci5hcHBlbmRDaGlsZChlKX0pOm5yPWZ1bmN0aW9uKHQpe3NldFRpbWVvdXQoaHIsMCx0KX06KGxyPSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIixwcj1mdW5jdGlvbih0KXt0LnNvdXJjZT09PWwmJiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09dC5kYXRhLmluZGV4T2YobHIpJiZocigrdC5kYXRhLnNsaWNlKGxyLmxlbmd0aCkpfSxsLmFkZEV2ZW50TGlzdGVuZXI/bC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixwciwhMSk6bC5hdHRhY2hFdmVudCgib25tZXNzYWdlIixwciksbnI9ZnVuY3Rpb24odCl7bC5wb3N0TWVzc2FnZShscit0LCIqIil9KSx5ci5vYmplY3Q9dD0+e2xldCBlLHIsbjtmdW5jdGlvbiBpKGkpe2U9Z3IodD1pKT90Om51bGwscj0hZSYmdFtTeW1ib2wuaXRlcmF0b3JdP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGwsbj0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0/dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTpudWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LnNsaWNlKCkpLGkodCksWGUub2JqKChmdW5jdGlvbiBvKHMsYSl7aWYoZSkoYXN5bmMoKT0+e3RyeXthd2FpdCBpKGF3YWl0IGUpLG8uY2FsbCh0aGlzLHMsYSl9Y2F0Y2godCl7YSh0KX19KSgpO2Vsc2UgaWYocil7Y29uc3QgdD1yLm5leHQoKTt1cihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9ZWxzZSBuPyhhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7dXIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe3VyKGEsdCl9fSkoKToodGhpcy5wdXNoKHQpLHVyKGEsbnVsbCxudWxsKSl9KSl9O3ZhciB2cj17fSxicj12ci5MRUZUX0JSQUNFPTEsbXI9dnIuUklHSFRfQlJBQ0U9Mix3cj12ci5MRUZUX0JSQUNLRVQ9Myxfcj12ci5SSUdIVF9CUkFDS0VUPTQsU3I9dnIuQ09MT049NSxFcj12ci5DT01NQT02LGtyPXZyLlRSVUU9NyxScj12ci5GQUxTRT04LEFyPXZyLk5VTEw9OSxUcj12ci5TVFJJTkc9MTAsT3I9dnIuTlVNQkVSPTExLGpyPXZyLlNUQVJUPTE3LExyPXZyLlNUT1A9MTgsQ3I9dnIuVFJVRTE9MzMsUHI9dnIuVFJVRTI9MzQsTXI9dnIuVFJVRTM9MzUsQnI9dnIuRkFMU0UxPTQ5LHhyPXZyLkZBTFNFMj01MCxVcj12ci5GQUxTRTM9NTEsSXI9dnIuRkFMU0U0PTUyLERyPXZyLk5VTEwxPTY1LE5yPXZyLk5VTEwyPTY2LEZyPXZyLk5VTEwzPTY3LHpyPXZyLk5VTUJFUjE9ODEscXI9dnIuTlVNQkVSMz04MyxZcj12ci5TVFJJTkcxPTk3LFdyPXZyLlNUUklORzI9OTgsJHI9dnIuU1RSSU5HMz05OSxHcj12ci5TVFJJTkc0PTEwMCxKcj12ci5TVFJJTkc1PTEwMSxIcj12ci5TVFJJTkc2PTEwMixWcj12ci5WQUxVRT0xMTMsS3I9dnIuS0VZPTExNCxacj12ci5PQkpFQ1Q9MTI5LFFyPXZyLkFSUkFZPTEzMCxYcj0iXFwiLmNoYXJDb2RlQXQoMCksdG49Ii8iLmNoYXJDb2RlQXQoMCksZW49IlxiIi5jaGFyQ29kZUF0KDApLHJuPSJcZiIuY2hhckNvZGVBdCgwKSxubj0iXG4iLmNoYXJDb2RlQXQoMCksb249IlxyIi5jaGFyQ29kZUF0KDApLHNuPSJcdCIuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiBhbigpe3RoaXMudFN0YXRlPWpyLHRoaXMudmFsdWU9dm9pZCAwLHRoaXMuc3RyaW5nPXZvaWQgMCx0aGlzLnN0cmluZ0J1ZmZlcj1BLmFsbG9jP0EuYWxsb2MoNjU1MzYpOm5ldyBBKDY1NTM2KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudW5pY29kZT12b2lkIDAsdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCx0aGlzLmtleT12b2lkIDAsdGhpcy5tb2RlPXZvaWQgMCx0aGlzLnN0YWNrPVtdLHRoaXMuc3RhdGU9VnIsdGhpcy5ieXRlc19yZW1haW5pbmc9MCx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTAsdGhpcy50ZW1wX2J1ZmZzPXsyOm5ldyBBKDIpLDM6bmV3IEEoMyksNDpuZXcgQSg0KX0sdGhpcy5vZmZzZXQ9LTF9YW4udG9rbmFtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyh2cikscj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl7dmFyIGk9ZVtyXTtpZih2cltpXT09PXQpcmV0dXJuIGl9cmV0dXJuIHQmJiIweCIrdC50b1N0cmluZygxNil9O3ZhciB1bj1hbi5wcm90b3R5cGU7dW4ub25FcnJvcj1mdW5jdGlvbih0KXt0aHJvdyB0fSx1bi5jaGFyRXJyb3I9ZnVuY3Rpb24odCxlKXt0aGlzLnRTdGF0ZT1Mcix0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJVbmV4cGVjdGVkICIrSlNPTi5zdHJpbmdpZnkoU3RyaW5nLmZyb21DaGFyQ29kZSh0W2VdKSkrIiBhdCBwb3NpdGlvbiAiK2UrIiBpbiBzdGF0ZSAiK2FuLnRva25hbSh0aGlzLnRTdGF0ZSkpKX0sdW4uYXBwZW5kU3RyaW5nQ2hhcj1mdW5jdGlvbih0KXt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD49NjU1MzYmJih0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0aGlzLnN0cmluZ0J1ZmZlclt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCsrXT10fSx1bi5hcHBlbmRTdHJpbmdCdWY9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQubGVuZ3RoOyJudW1iZXIiPT10eXBlb2YgZSYmKG49Im51bWJlciI9PXR5cGVvZiByP3I8MD90Lmxlbmd0aC1lK3I6ci1lOnQubGVuZ3RoLWUpLG48MCYmKG49MCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrbj42NTUzNiYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIsMCx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCksdC5jb3B5KHRoaXMuc3RyaW5nQnVmZmVyLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0LGUsciksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrPW59LHVuLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9bmV3IEEodCkpO2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0aGlzLnRTdGF0ZT09PWpyKXtpZihlPXRbcl0sdGhpcy5vZmZzZXQrKywxMjM9PT1lKXRoaXMub25Ub2tlbihiciwieyIpO2Vsc2UgaWYoMTI1PT09ZSl0aGlzLm9uVG9rZW4obXIsIn0iKTtlbHNlIGlmKDkxPT09ZSl0aGlzLm9uVG9rZW4od3IsIlsiKTtlbHNlIGlmKDkzPT09ZSl0aGlzLm9uVG9rZW4oX3IsIl0iKTtlbHNlIGlmKDU4PT09ZSl0aGlzLm9uVG9rZW4oU3IsIjoiKTtlbHNlIGlmKDQ0PT09ZSl0aGlzLm9uVG9rZW4oRXIsIiwiKTtlbHNlIGlmKDExNj09PWUpdGhpcy50U3RhdGU9Q3I7ZWxzZSBpZigxMDI9PT1lKXRoaXMudFN0YXRlPUJyO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLnRTdGF0ZT1EcjtlbHNlIGlmKDM0PT09ZSl0aGlzLnN0cmluZz0iIix0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoNDU9PT1lKXRoaXMuc3RyaW5nPSItIix0aGlzLnRTdGF0ZT16cjtlbHNlIGlmKGU+PTQ4JiZlPDY0KXRoaXMuc3RyaW5nPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGU9cXI7ZWxzZSBpZigzMiE9PWUmJjkhPT1lJiYxMCE9PWUmJjEzIT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09WXIpaWYoZT10W3JdLHRoaXMuYnl0ZXNfcmVtYWluaW5nPjApe2Zvcih2YXIgaT0wO2k8dGhpcy5ieXRlc19yZW1haW5pbmc7aSsrKXRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXVt0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLXRoaXMuYnl0ZXNfcmVtYWluaW5nK2ldPXRbaV07dGhpcy5hcHBlbmRTdHJpbmdCdWYodGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdKSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPXRoaXMuYnl0ZXNfcmVtYWluaW5nPTAscj1yK2ktMX1lbHNlIGlmKDA9PT10aGlzLmJ5dGVzX3JlbWFpbmluZyYmZT49MTI4KXtpZihlPD0xOTN8fGU+MjQ0KXJldHVybiB0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJJbnZhbGlkIFVURi04IGNoYXJhY3RlciBhdCBwb3NpdGlvbiAiK3IrIiBpbiBzdGF0ZSAiK2FuLnRva25hbSh0aGlzLnRTdGF0ZSkpKTtpZihlPj0xOTQmJmU8PTIyMyYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MiksZT49MjI0JiZlPD0yMzkmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTMpLGU+PTI0MCYmZTw9MjQ0JiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT00KSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlK3I+dC5sZW5ndGgpe2Zvcih2YXIgbz0wO288PXQubGVuZ3RoLTEtcjtvKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW29dPXRbcitvXTt0aGlzLmJ5dGVzX3JlbWFpbmluZz1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdC5sZW5ndGgscj10Lmxlbmd0aC0xfWVsc2UgdGhpcy5hcHBlbmRTdHJpbmdCdWYodCxyLHIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZSkscj1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtMX1lbHNlIGlmKDM0PT09ZSl0aGlzLnRTdGF0ZT1qcix0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiLDAsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy5vblRva2VuKFRyLHRoaXMuc3RyaW5nKSx0aGlzLm9mZnNldCs9QS5ieXRlTGVuZ3RoKHRoaXMuc3RyaW5nLCJ1dGY4IikrMSx0aGlzLnN0cmluZz12b2lkIDA7ZWxzZSBpZig5Mj09PWUpdGhpcy50U3RhdGU9V3I7ZWxzZXtpZighKGU+PTMyKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZSl9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVdyKWlmKDM0PT09KGU9dFtyXSkpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGUpLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoOTI9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihYciksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZig0Nz09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKHRuKSx0aGlzLnRTdGF0ZT1ZcjtlbHNlIGlmKDk4PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZW4pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoMTAyPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIocm4pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIobm4pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoMTE0PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIob24pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoMTE2PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoc24pLHRoaXMudFN0YXRlPVlyO2Vsc2V7aWYoMTE3IT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnVuaWNvZGU9IiIsdGhpcy50U3RhdGU9JHJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PSRyfHx0aGlzLnRTdGF0ZT09PUdyfHx0aGlzLnRTdGF0ZT09PUpyfHx0aGlzLnRTdGF0ZT09PUhyKXtpZighKChlPXRbcl0pPj00OCYmZTw2NHx8ZT42NCYmZTw9NzB8fGU+OTYmJmU8PTEwMikpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7aWYodGhpcy51bmljb2RlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlKys9PT1Icil7dmFyIHM9cGFyc2VJbnQodGhpcy51bmljb2RlLDE2KTt0aGlzLnVuaWNvZGU9dm9pZCAwLHZvaWQgMCE9PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmcz49NTYzMjAmJnM8NTczNDQ/KHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBBKFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5oaWdoU3Vycm9nYXRlLHMpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCk6dm9pZCAwPT09dGhpcy5oaWdoU3Vycm9nYXRlJiZzPj01NTI5NiYmczw1NjMyMD90aGlzLmhpZ2hTdXJyb2dhdGU9czoodm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiYodGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IEEoU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCksdGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IEEoU3RyaW5nLmZyb21DaGFyQ29kZShzKSkpKSx0aGlzLnRTdGF0ZT1Zcn19ZWxzZSBpZih0aGlzLnRTdGF0ZT09PXpyfHx0aGlzLnRTdGF0ZT09PXFyKXN3aXRjaChlPXRbcl0pe2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6Y2FzZSA0NjpjYXNlIDEwMTpjYXNlIDY5OmNhc2UgNDM6Y2FzZSA0NTp0aGlzLnN0cmluZys9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZT1xcjticmVhaztkZWZhdWx0OnRoaXMudFN0YXRlPWpyO3ZhciBhPU51bWJlcih0aGlzLnN0cmluZyk7aWYoaXNOYU4oYSkpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy5zdHJpbmcubWF0Y2goL1swLTldKy8pPT10aGlzLnN0cmluZyYmYS50b1N0cmluZygpIT10aGlzLnN0cmluZz90aGlzLm9uVG9rZW4oVHIsdGhpcy5zdHJpbmcpOnRoaXMub25Ub2tlbihPcixhKSx0aGlzLm9mZnNldCs9dGhpcy5zdHJpbmcubGVuZ3RoLTEsdGhpcy5zdHJpbmc9dm9pZCAwLHItLX1lbHNlIGlmKHRoaXMudFN0YXRlPT09Q3Ipe2lmKDExNCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9UHJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVByKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPU1yfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ncil7aWYoMTAxIT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1qcix0aGlzLm9uVG9rZW4oa3IsITApLHRoaXMub2Zmc2V0Kz0zfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ccil7aWYoOTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPXhyfWVsc2UgaWYodGhpcy50U3RhdGU9PT14cil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Vcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09VXIpe2lmKDExNSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9SXJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUlyKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPWpyLHRoaXMub25Ub2tlbihSciwhMSksdGhpcy5vZmZzZXQrPTR9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PURyKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPU5yfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ocil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Gcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09RnIpe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9anIsdGhpcy5vblRva2VuKEFyLG51bGwpLHRoaXMub2Zmc2V0Kz0zfX0sdW4ub25Ub2tlbj1mdW5jdGlvbih0LGUpe30sdW4ucGFyc2VFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPUxyLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIithbi50b2tuYW0odCkrKGU/IigiK0pTT04uc3RyaW5naWZ5KGUpKyIpIjoiIikrIiBpbiBzdGF0ZSAiK2FuLnRva25hbSh0aGlzLnN0YXRlKSkpfSx1bi5wdXNoPWZ1bmN0aW9uKCl7dGhpcy5zdGFjay5wdXNoKHt2YWx1ZTp0aGlzLnZhbHVlLGtleTp0aGlzLmtleSxtb2RlOnRoaXMubW9kZX0pfSx1bi5wb3A9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZhbHVlLGU9dGhpcy5zdGFjay5wb3AoKTt0aGlzLnZhbHVlPWUudmFsdWUsdGhpcy5rZXk9ZS5rZXksdGhpcy5tb2RlPWUubW9kZSx0aGlzLmVtaXQodCksdGhpcy5tb2RlfHwodGhpcy5zdGF0ZT1Wcil9LHVuLmVtaXQ9ZnVuY3Rpb24odCl7dGhpcy5tb2RlJiYodGhpcy5zdGF0ZT1FciksdGhpcy5vblZhbHVlKHQpfSx1bi5vblZhbHVlPWZ1bmN0aW9uKHQpe30sdW4ub25Ub2tlbj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuc3RhdGU9PT1WcilpZih0PT09VHJ8fHQ9PT1Pcnx8dD09PWtyfHx0PT09UnJ8fHQ9PT1Bcil0aGlzLnZhbHVlJiYodGhpcy52YWx1ZVt0aGlzLmtleV09ZSksdGhpcy5lbWl0KGUpO2Vsc2UgaWYodD09PWJyKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT17fTp0aGlzLnZhbHVlPXt9LHRoaXMua2V5PXZvaWQgMCx0aGlzLnN0YXRlPUtyLHRoaXMubW9kZT1acjtlbHNlIGlmKHQ9PT13cil0aGlzLnB1c2goKSx0aGlzLnZhbHVlP3RoaXMudmFsdWU9dGhpcy52YWx1ZVt0aGlzLmtleV09W106dGhpcy52YWx1ZT1bXSx0aGlzLmtleT0wLHRoaXMubW9kZT1Rcix0aGlzLnN0YXRlPVZyO2Vsc2UgaWYodD09PW1yKXtpZih0aGlzLm1vZGUhPT1acilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNle2lmKHQhPT1fcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7aWYodGhpcy5tb2RlIT09UXIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZSBpZih0aGlzLnN0YXRlPT09S3IpaWYodD09PVRyKXRoaXMua2V5PWUsdGhpcy5zdGF0ZT1TcjtlbHNle2lmKHQhPT1tcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT1Tcil7aWYodCE9PVNyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnN0YXRlPVZyfWVsc2V7aWYodGhpcy5zdGF0ZSE9PUVyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0PT09RXIpdGhpcy5tb2RlPT09UXI/KHRoaXMua2V5KyssdGhpcy5zdGF0ZT1Wcik6dGhpcy5tb2RlPT09WnImJih0aGlzLnN0YXRlPUtyKTtlbHNle2lmKCEodD09PV9yJiZ0aGlzLm1vZGU9PT1Rcnx8dD09PW1yJiZ0aGlzLm1vZGU9PT1acikpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9fX0sYW4uQz12cjt2YXIgaG49YW47ZnVuY3Rpb24gZm4odCxlLHIpe3Q9dHx8ZnVuY3Rpb24odCl7dGhpcy5xdWV1ZSh0KX0sZT1lfHxmdW5jdGlvbigpe3RoaXMucXVldWUobnVsbCl9O2xldCBuPSExLGk9ITEsbz1bXSxzPSExLGE9bmV3IEplO2Z1bmN0aW9uIHUoKXtmb3IoO28ubGVuZ3RoJiYhYS5wYXVzZWQ7KXtsZXQgdD1vLnNoaWZ0KCk7aWYobnVsbD09PXQpcmV0dXJuIGEuZW1pdCgiZW5kIik7YS5lbWl0KCJkYXRhIix0KX19ZnVuY3Rpb24gaCgpe2Eud3JpdGFibGU9ITEsZS5jYWxsKGEpLCFhLnJlYWRhYmxlJiZhLmF1dG9EZXN0cm95JiZhLmRlc3Ryb3koKX1yZXR1cm4gYS5yZWFkYWJsZT1hLndyaXRhYmxlPSEwLGEucGF1c2VkPSExLGEuYXV0b0Rlc3Ryb3k9IShyJiYhMT09PXIuYXV0b0Rlc3Ryb3kpLGEud3JpdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpLCFhLnBhdXNlZH0sYS5xdWV1ZT1hLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHN8fChudWxsPT09dCYmKHM9ITApLG8ucHVzaCh0KSx1KCkpLGF9LGEub24oImVuZCIsKGZ1bmN0aW9uKCl7YS5yZWFkYWJsZT0hMSwhYS53cml0YWJsZSYmYS5hdXRvRGVzdHJveSYmQnQubmV4dFRpY2soKGZ1bmN0aW9uKCl7YS5kZXN0cm95KCl9KSl9KSksYS5lbmQ9ZnVuY3Rpb24odCl7aWYoIW4pcmV0dXJuIG49ITAsYXJndW1lbnRzLmxlbmd0aCYmYS53cml0ZSh0KSxoKCksYX0sYS5kZXN0cm95PWZ1bmN0aW9uKCl7aWYoIWkpcmV0dXJuIGk9ITAsbj0hMCxvLmxlbmd0aD0wLGEud3JpdGFibGU9YS5yZWFkYWJsZT0hMSxhLmVtaXQoImNsb3NlIiksYX0sYS5wYXVzZT1mdW5jdGlvbigpe2lmKCFhLnBhdXNlZClyZXR1cm4gYS5wYXVzZWQ9ITAsYX0sYS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5wYXVzZWQmJihhLnBhdXNlZD0hMSxhLmVtaXQoInJlc3VtZSIpKSx1KCksYS5wYXVzZWR8fGEuZW1pdCgiZHJhaW4iKSxhfSxhfWZuLnRocm91Z2g9Zm47bGV0IGNuPXtwYXJzZTpmdW5jdGlvbih0LGUpe2xldCByLG47ZnVuY3Rpb24gaSh0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9lPT09dDp0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5leGVjP3QuZXhlYyhlKToiYm9vbGVhbiI9PXR5cGVvZiB0fHwib2JqZWN0Ij09dHlwZW9mIHQ/dDoiZnVuY3Rpb24iPT10eXBlb2YgdCYmdChlKX1sZXQgbz1uZXcgaG4scz1mbigoZnVuY3Rpb24odCl7InN0cmluZyI9PXR5cGVvZiB0JiYodD1BLmZyb20odCkpLG8ud3JpdGUodCl9KSwoZnVuY3Rpb24odCl7dCYmcy53cml0ZSh0KSxyJiZzLmVtaXQoImhlYWRlciIsciksbiYmcy5lbWl0KCJmb290ZXIiLG4pLHMucXVldWUobnVsbCl9KSk7ZnVuY3Rpb24gYSh0LGUpeyExIT09ciYmKHI9cnx8e30sclt0XT1lKSwhMSE9PW4mJiExPT09ciYmKG49bnx8e30sblt0XT1lKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoIi4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIkKiI9PT10P3tlbWl0S2V5OiEwfToiKiI9PT10fHwoIiI9PT10P3tyZWN1cnNlOiEwfTp0KX0pKSksdCYmdC5sZW5ndGh8fCh0PW51bGwpLG8ub25WYWx1ZT1mdW5jdGlvbihuKXtpZih0aGlzLnJvb3R8fChzLnJvb3Q9biksIXQpcmV0dXJuO2xldCBvPTAsdT0wLGg9ITEsZj0hMTtmb3IoO288dC5sZW5ndGg7KXtsZXQgZSxyPXRbb107aWYodSsrLHImJiFyLnJlY3Vyc2Upe2lmKGU9dT09PXRoaXMuc3RhY2subGVuZ3RoP3RoaXM6dGhpcy5zdGFja1t1XSwhZSlyZXR1cm47aWYoIWkocixlLmtleSkpcmV0dXJuIHZvaWQgYShlLmtleSxuKTtoPSEhci5lbWl0S2V5LGY9ISFyLmVtaXRQYXRoLG8rK31lbHNle28rKztsZXQgcj10W29dO2lmKCFyKXJldHVybjtmb3IoOzspe2lmKGU9dT09PXRoaXMuc3RhY2subGVuZ3RoP3RoaXM6dGhpcy5zdGFja1t1XSwhZSlyZXR1cm47aWYoaShyLGUua2V5KSl7bysrLE9iamVjdC5pc0Zyb3plbih0aGlzLnN0YWNrW3VdKXx8KHRoaXMuc3RhY2tbdV0udmFsdWU9bnVsbCk7YnJlYWt9YShlLmtleSxuKSx1Kyt9fX1pZihyJiYocy5lbWl0KCJoZWFkZXIiLHIpLHI9ITEpLHUhPT10aGlzLnN0YWNrLmxlbmd0aClyZXR1cm47bGV0IGM9dGhpcy5zdGFjay5zbGljZSgxKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmtleX0pKS5jb25jYXQoW3RoaXMua2V5XSksbD1uO251bGwhPWwmJm51bGwhPShsPWU/ZShsLGMpOmwpJiYoKGh8fGYpJiYobD17dmFsdWU6bH0saCYmKGwua2V5PXRoaXMua2V5KSxmJiYobC5wYXRoPWMpKSxzLnF1ZXVlKGwpKSx0aGlzLnZhbHVlJiZkZWxldGUgdGhpcy52YWx1ZVt0aGlzLmtleV07Zm9yKGxldCB0IGluIHRoaXMuc3RhY2spT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbdF0pfHwodGhpcy5zdGFja1t0XS52YWx1ZT1udWxsKX0sby5fb25Ub2tlbj1vLm9uVG9rZW4sby5vblRva2VuPWZ1bmN0aW9uKGUscil7by5fb25Ub2tlbihlLHIpLDA9PT10aGlzLnN0YWNrLmxlbmd0aCYmcy5yb290JiYodHx8cy5xdWV1ZShzLnJvb3QpLHMucm9vdD1udWxsKX0sby5vbkVycm9yPWZ1bmN0aW9uKHQpe3QubWVzc2FnZS5pbmRleE9mKCJhdCBwb3NpdGlvbiIpPi0xJiYodC5tZXNzYWdlPSJJbnZhbGlkIEpTT04gKCIrdC5tZXNzYWdlKyIpIikscy5lbWl0KCJlcnJvciIsdCl9LHN9fSxsbj1mdW5jdGlvbih0LGUpe3JldHVybiBsbj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IobGV0IHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiYodFtyXT1lW3JdKX0sbG4odCxlKX07bGV0IHBuLGRuPS9bXFwiXHUwMDAwLVx1MDAxZlx1MDA3Zi1cdTAwOWZcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vZyxnbj17IlxiIjoiXFxiIiwiXHQiOiJcXHQiLCJcbiI6IlxcbiIsIlxmIjoiXFxmIiwiXHIiOiJcXHIiLCciJzonXFwiJywiXFwiOiJcXFxcIn07ZnVuY3Rpb24geW4odCl7cmV0dXJuIHQ/ImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbj9wbi5Qcm9taXNlOmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnBpcGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlbW92ZUxpc3RlbmVyfSh0KT90Ll9yZWFkYWJsZVN0YXRlLm9iamVjdE1vZGU/cG4uUmVhZGFibGVPYmplY3Q6cG4uUmVhZGFibGVTdHJpbmc6QXJyYXkuaXNBcnJheSh0KT9wbi5BcnJheToib2JqZWN0Ij09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBPYmplY3Q/cG4uT2JqZWN0OnBuLlByaW1pdGl2ZTpwbi5QcmltaXRpdmV9IWZ1bmN0aW9uKHQpe3RbdC5BcnJheT0wXT0iQXJyYXkiLHRbdC5PYmplY3Q9MV09Ik9iamVjdCIsdFt0LlJlYWRhYmxlU3RyaW5nPTJdPSJSZWFkYWJsZVN0cmluZyIsdFt0LlJlYWRhYmxlT2JqZWN0PTNdPSJSZWFkYWJsZU9iamVjdCIsdFt0LlByaW1pdGl2ZT00XT0iUHJpbWl0aXZlIix0W3QuUHJvbWlzZT01XT0iUHJvbWlzZSJ9KHBufHwocG49e30pKTtsZXQgdm49W107dm5bcG4uQXJyYXldPSJbIix2bltwbi5PYmplY3RdPSJ7Iix2bltwbi5SZWFkYWJsZVN0cmluZ109JyInLHZuW3BuLlJlYWRhYmxlT2JqZWN0XT0iWyI7bGV0IGJuPVtdO2JuW3BuLkFycmF5XT0iXSIsYm5bcG4uT2JqZWN0XT0ifSIsYm5bcG4uUmVhZGFibGVTdHJpbmddPSciJyxibltwbi5SZWFkYWJsZU9iamVjdF09Il0iO2xldCBtbj1bXTtmb3IobGV0IHQ9MCxlPU9iamVjdC5lbnRyaWVzKHBuKTt0PGUubGVuZ3RoO3QrKyl7bGV0IHI9ZVt0XSxuPXJbMF0saT1yWzFdOyJudW1iZXIiPT10eXBlb2YgaSYmKG1uW2ldPSJwcm9jZXNzIituKX1mdW5jdGlvbiB3bih0KXtyZXR1cm4gdC5yZXBsYWNlKGRuLChmdW5jdGlvbih0KXtsZXQgZT1nblt0XTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/ZToiXFx1Iit0LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDQsIjAiKX0pKX1mdW5jdGlvbiBfbih0KXtyZXR1cm4nIicrd24odCkrJyInfWZ1bmN0aW9uIFNuKHQsZSl7bGV0IHI9dC5yZWFkKGUpO3JldHVybiBudWxsPT09cj9uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxyKXtsZXQgbj1mdW5jdGlvbigpe3JldHVybiBlKG51bGwpfTt0Lm9uY2UoImVuZCIsbiksdC5vbmNlKCJlcnJvciIsciksdC5vbmNlKCJyZWFkYWJsZSIsKGZ1bmN0aW9uKCl7dC5yZW1vdmVMaXN0ZW5lcigiZW5kIixuKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsciksZSh0LnJlYWQoKSl9KSl9KSk6UHJvbWlzZS5yZXNvbHZlKHIpfWZ1bmN0aW9uIEVuKHQpe3JldHVybiB0LnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiB5bih0KT09PXBuLlByb21pc2U/RW4odCk6dH0pKX1sZXQga249ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLHIsbixpKXt2b2lkIDA9PT1pJiYoaT0hMSk7bGV0IG89dC5jYWxsKHRoaXMpfHx0aGlzO28uY3ljbGU9aSxvLnN0YWNrPVtdLG8uZGVwdGg9MCxvLnB1c2hDYWxsZWQ9ITEsby5lbmQ9ITEsby5pc1JlYWRpbmc9ITEsby5yZWFkTW9yZT0hMTtsZXQgcz10eXBlb2YgbjtyZXR1cm4ic3RyaW5nIiE9PXMmJiJudW1iZXIiIT09c3x8KG8uZ2FwPU51bWJlci5pc0Zpbml0ZShuKT8iICIucmVwZWF0KG4pOm4pLE9iamVjdC5hc3NpZ24obyx7dmlzaXRlZDppP25ldyBXZWFrTWFwOm5ldyBXZWFrU2V0LHJlcGxhY2VyRnVuY3Rpb246ciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZyLHJlcGxhY2VyQXJyYXk6QXJyYXkuaXNBcnJheShyKSYmcn0pLHIgaW5zdGFuY2VvZiBGdW5jdGlvbiYmKG8ucmVwbGFjZXJGdW5jdGlvbj1yKSxBcnJheS5pc0FycmF5KHIpJiYoby5yZXBsYWNlckFycmF5PXIpLG8uYWRkVG9TdGFjayhlKSxvfXJldHVybiBmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9bG4odCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihyLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgcil9KGUsdCksZS5wcm90b3R5cGUuY3ljbGVyPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcy52aXNpdGVkLmdldChlKTtpZihyKXJldHVybnskcmVmOnJ9O2xldCBuPXRoaXMucGF0aCgpO3JldHVybiB2b2lkIDAhPT10JiZuLnB1c2godCksbj1uLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIlsiKyhOdW1iZXIuaXNJbnRlZ2VyKHQpP3Q6X24odCkpKyJdIn0pKSx0aGlzLnZpc2l0ZWQuc2V0KGUsbi5sZW5ndGg/IiQiK24uam9pbigiIik6IiQiKSxlfSxlLnByb3RvdHlwZS5hZGRUb1N0YWNrPWZ1bmN0aW9uKHQsZSxyLG4pe2xldCBpLG8scz10aGlzLGE9dDt0aGlzLnJlcGxhY2VyRnVuY3Rpb24mJihhPXRoaXMucmVwbGFjZXJGdW5jdGlvbihlfHxyLGEsdGhpcykpLGEmJmEudG9KU09OIGluc3RhbmNlb2YgRnVuY3Rpb24mJihhPWEudG9KU09OKCkpLChhIGluc3RhbmNlb2YgRnVuY3Rpb258fCJzeW1ib2wiPT10eXBlb2YgdCkmJihhPXZvaWQgMCksdm9pZCAwIT09ZSYmdGhpcy5yZXBsYWNlckFycmF5JiYodGhpcy5yZXBsYWNlckFycmF5LmluY2x1ZGVzKGUpfHwoYT12b2lkIDApKTtsZXQgdT15bihhKTtpZigobiYmbi50eXBlPT09cG4uQXJyYXl8fHZvaWQgMCE9PWEpJiZ1IT09cG4uUHJvbWlzZSYmKG4mJiFuLmZpcnN0JiZ0aGlzLl9wdXNoKCIsIiksbiYmKG4uZmlyc3Q9ITEpKSx2b2lkIDAhPT1hJiZ1IT09cG4uUHJvbWlzZSYmZSYmKHRoaXMuZ2FwP3RoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkrJyInK3duKGUpKyciOiAnKTp0aGlzLl9wdXNoKCciJyt3bihlKSsnIjonKSksdSE9PXBuLlByaW1pdGl2ZSlpZih0aGlzLmN5Y2xlKWE9dGhpcy5jeWNsZXIoZXx8cixhKSx1PXluKGEpO2Vsc2V7aWYodGhpcy52aXNpdGVkLmhhcyhhKSl0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcigiQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTiIpLHtyZWFsVmFsdWU6YSxrZXk6ZXx8cn0pO3RoaXMudmlzaXRlZC5hZGQoYSl9IWUmJnI+LTEmJnRoaXMuZGVwdGgmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKTtsZXQgaD12blt1XTtoJiZ0aGlzLl9wdXNoKGgpO2xldCBmPXtrZXk6ZSxpbmRleDpyLHR5cGU6dSxwYXJlbnQ6bix2YWx1ZTphLGZpcnN0OiEwfTtyZXR1cm4gdT09PXBuLk9iamVjdD8odGhpcy5kZXB0aCs9MSxmLnVucmVhZD1PYmplY3Qua2V5cyhhKSxmLmlzRW1wdHk9IWYudW5yZWFkLmxlbmd0aCk6dT09PXBuLkFycmF5Pyh0aGlzLmRlcHRoKz0xLGYudW5yZWFkPWEubGVuZ3RoLGYuYXJyYXlMZW5ndGg9Zi51bnJlYWQsZi5pc0VtcHR5PSFmLnVucmVhZCk6dSE9PXBuLlJlYWRhYmxlU3RyaW5nJiZ1IT09cG4uUmVhZGFibGVPYmplY3R8fCh0aGlzLmRlcHRoKz0xLGEucmVhZGFibGVFbmRlZHx8KG51bGw9PT0oaT1hLl9yZWFkYWJsZVN0YXRlKXx8dm9pZCAwPT09aT92b2lkIDA6aS5lbmRFbWl0dGVkKT90aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBoYXMgZW5kZWQgYmVmb3JlIGl0IHdhcyBzZXJpYWxpemVkLiBBbGwgc3RyZWFtIGRhdGEgaGF2ZSBiZWVuIGxvc3QiKSxhLGV8fHIpOihhLnJlYWRhYmxlRmxvd2luZ3x8KG51bGw9PT0obz1hLl9yZWFkYWJsZVN0YXRlKXx8dm9pZCAwPT09bz92b2lkIDA6by5mbG93aW5nKSkmJihhLnBhdXNlKCksdGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJSZWFkYWJsZSBTdHJlYW0gaXMgaW4gZmxvd2luZyBtb2RlLCBkYXRhIG1heSBoYXZlIGJlZW4gbG9zdC4gVHJ5aW5nIHRvIHBhdXNlIHN0cmVhbS4iKSxhLGV8fHIpKSxmLnJlYWRDb3VudD0wLGEub25jZSgiZW5kIiwoZnVuY3Rpb24oKXtmLmVuZD0hMCxzLl9fcmVhZCgpfSkpLGEub25jZSgiZXJyb3IiLChmdW5jdGlvbih0KXtzLmVycm9yPSEwLHMuZW1pdCgiZXJyb3IiLHQpfSkpKSx0aGlzLnN0YWNrLnVuc2hpZnQoZiksZn0sZS5wcm90b3R5cGUucmVtb3ZlRnJvbVN0YWNrPWZ1bmN0aW9uKHQpe2xldCBlPXQudHlwZSxyPWU9PT1wbi5PYmplY3R8fGU9PT1wbi5BcnJheXx8ZT09PXBuLlJlYWRhYmxlU3RyaW5nfHxlPT09cG4uUmVhZGFibGVPYmplY3Q7ZSE9PXBuLlByaW1pdGl2ZSYmKHRoaXMuY3ljbGV8fHRoaXMudmlzaXRlZC5kZWxldGUodC52YWx1ZSksciYmKHRoaXMuZGVwdGgtPTEpKTtsZXQgbj1ibltlXTtyJiYhdC5pc0VtcHR5JiZ0aGlzLmdhcCYmdGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSksbiYmdGhpcy5fcHVzaChuKTtsZXQgaT10aGlzLnN0YWNrLmluZGV4T2YodCk7dGhpcy5zdGFjay5zcGxpY2UoaSwxKX0sZS5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSEwLHRoaXMucHVzaCh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlT2JqZWN0PWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIFNuKHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24oZSl7bnVsbCE9PWUmJih0LmZpcnN0fHxyLl9wdXNoKCIsIiksdC5maXJzdD0hMSxyLmFkZFRvU3RhY2soZSx2b2lkIDAsdC5yZWFkQ291bnQpLHQucmVhZENvdW50Kz0xKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc09iamVjdD1mdW5jdGlvbih0KXtpZighdC51bnJlYWQubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlRnJvbVN0YWNrKHQpO2xldCBlPXQudW5yZWFkLnNoaWZ0KCkscj10LnZhbHVlW2VdO3RoaXMuYWRkVG9TdGFjayhyLGUsdm9pZCAwLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzQXJyYXk9ZnVuY3Rpb24odCl7bGV0IGU9dC51bnJlYWQ7aWYoIWUpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IHI9dC5hcnJheUxlbmd0aC1lLG49dC52YWx1ZVtyXTt0LnVucmVhZC09MSx0aGlzLmFkZFRvU3RhY2sobix2b2lkIDAscix0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1ByaW1pdGl2ZT1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT10LnZhbHVlKXtsZXQgZSxyPXR5cGVvZiB0LnZhbHVlO3N3aXRjaChyKXtjYXNlInN0cmluZyI6ZT1fbih0LnZhbHVlKTticmVhaztjYXNlIm51bWJlciI6ZT1OdW1iZXIuaXNGaW5pdGUodC52YWx1ZSk/U3RyaW5nKHQudmFsdWUpOiJudWxsIjticmVhaztjYXNlImJvb2xlYW4iOmU9U3RyaW5nKHQudmFsdWUpO2JyZWFrO2Nhc2Uib2JqZWN0Ijp0LnZhbHVlfHwoZT0ibnVsbCIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoJ1Vua25vd24gdHlwZSAiJytyKyciLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKSx7dmFsdWU6dC52YWx1ZX0pfXRoaXMuX3B1c2goZSl9ZWxzZSF0aGlzLnN0YWNrWzFdfHx0aGlzLnN0YWNrWzFdLnR5cGUhPT1wbi5BcnJheSYmdGhpcy5zdGFja1sxXS50eXBlIT09cG4uUmVhZGFibGVPYmplY3Q/dC5hZGRTZXBhcmF0b3JBZnRlckVuZD0hMTp0aGlzLl9wdXNoKCJudWxsIik7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NSZWFkYWJsZVN0cmluZz1mdW5jdGlvbih0LGUpe2xldCByPXRoaXM7aWYoIXQuZW5kKXJldHVybiBTbih0LnZhbHVlLGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3QmJnIuX3B1c2god24odC50b1N0cmluZygpKSl9KSk7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NQcm9taXNlPWZ1bmN0aW9uKHQpe2xldCBlPXRoaXM7cmV0dXJuIEVuKHQudmFsdWUpLnRoZW4oKGZ1bmN0aW9uKHIpe2UucmVtb3ZlRnJvbVN0YWNrKHQpLGUuYWRkVG9TdGFjayhyLHQua2V5LHQuaW5kZXgsdC5wYXJlbnQpfSkpfSxlLnByb3RvdHlwZS5wcm9jZXNzU3RhY2tUb3BJdGVtPWZ1bmN0aW9uKHQpe2xldCBlLHI9dGhpcyxuPXRoaXMuc3RhY2tbMF07aWYoIW58fHRoaXMuZXJyb3IpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3RyeXtlPXRoaXNbbW5bbi50eXBlXV0obix0KX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKS50aGVuKChmdW5jdGlvbigpezA9PT1yLnN0YWNrLmxlbmd0aCYmKHIuZW5kPSEwLHIuX3B1c2gobnVsbCkpfSkpfSxlLnByb3RvdHlwZS5fX3JlYWQ9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztpZighdGhpcy5pc1JlYWRpbmcmJiF0aGlzLmVycm9yKXJldHVybiB0aGlzLmlzUmVhZGluZz0hMCx0aGlzLnJlYWRNb3JlPSExLHRoaXMucHJvY2Vzc1N0YWNrVG9wSXRlbSh0KS50aGVuKChmdW5jdGlvbigpeyFlLmVuZCYmIWUuZXJyb3ImJihlLnJlYWRNb3JlfHwhZS5wdXNoQ2FsbGVkKT91cigoZnVuY3Rpb24oKXtlLmlzUmVhZGluZz0hMSxlLl9fcmVhZCgpfSkpOmUuaXNSZWFkaW5nPSExfSkpLmNhdGNoKChmdW5jdGlvbih0KXtlLmVycm9yPSEwLGUuZW1pdCgiZXJyb3IiLHQpfSkpO3RoaXMucmVhZE1vcmU9ITB9LGUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMucHVzaENhbGxlZD0hMSx0aGlzLl9fcmVhZCh0KX0sZS5wcm90b3R5cGUucGF0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YWNrLm1hcCgoZnVuY3Rpb24odCl7bGV0IGU9dC5rZXkscj10LmluZGV4O3JldHVybiBlfHxyfSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHR8fHQ+LTF9KSkucmV2ZXJzZSgpfSxlfShwZSk7dmFyIFJuPUFycmF5LmlzQXJyYXksQW49Im9iamVjdCI9PXR5cGVvZiBIZSYmSGUmJkhlLk9iamVjdD09PU9iamVjdCYmSGUsVG49Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixPbj1Bbnx8VG58fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksam49T24uU3ltYm9sLExuPU9iamVjdC5wcm90b3R5cGUsQ249TG4uaGFzT3duUHJvcGVydHksUG49TG4udG9TdHJpbmcsTW49am4/am4udG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBCbj1mdW5jdGlvbih0KXt2YXIgZT1Dbi5jYWxsKHQsTW4pLHI9dFtNbl07dHJ5e3RbTW5dPXZvaWQgMDt2YXIgbj0hMH1jYXRjaCh0KXt9dmFyIGk9UG4uY2FsbCh0KTtyZXR1cm4gbiYmKGU/dFtNbl09cjpkZWxldGUgdFtNbl0pLGl9LHhuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFVuPWZ1bmN0aW9uKHQpe3JldHVybiB4bi5jYWxsKHQpfSxJbj1qbj9qbi50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIERuPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOkluJiZJbiBpbiBPYmplY3QodCk/Qm4odCk6VW4odCl9O3ZhciBObj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fTt2YXIgRm49ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxObih0KSYmIltvYmplY3QgU3ltYm9sXSI9PURuKHQpfSx6bj0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxxbj0vXlx3KiQvO3ZhciBZbj1mdW5jdGlvbih0LGUpe2lmKFJuKHQpKXJldHVybiExO3ZhciByPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPXImJiJzeW1ib2wiIT1yJiYiYm9vbGVhbiIhPXImJm51bGwhPXQmJiFGbih0KSl8fChxbi50ZXN0KHQpfHwhem4udGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSkpfTt2YXIgV249ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9O3ZhciAkbixHbj1mdW5jdGlvbih0KXtpZighV24odCkpcmV0dXJuITE7dmFyIGU9RG4odCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfSxKbj1PblsiX19jb3JlLWpzX3NoYXJlZF9fIl0sSG49KCRuPS9bXi5dKyQvLmV4ZWMoSm4mJkpuLmtleXMmJkpuLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIiskbjoiIjt2YXIgVm49ZnVuY3Rpb24odCl7cmV0dXJuISFIbiYmSG4gaW4gdH0sS249RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBabj1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIEtuLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxRbj0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxYbj1GdW5jdGlvbi5wcm90b3R5cGUsdGk9T2JqZWN0LnByb3RvdHlwZSxlaT1Ybi50b1N0cmluZyxyaT10aS5oYXNPd25Qcm9wZXJ0eSxuaT1SZWdFeHAoIl4iK2VpLmNhbGwocmkpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBpaT1mdW5jdGlvbih0KXtyZXR1cm4hKCFXbih0KXx8Vm4odCkpJiYoR24odCk/bmk6UW4pLnRlc3QoWm4odCkpfTt2YXIgb2k9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIHNpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9b2kodCxlKTtyZXR1cm4gaWkocik/cjp2b2lkIDB9LGFpPXNpKE9iamVjdCwiY3JlYXRlIik7dmFyIHVpPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1haT9haShudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIGhpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxmaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBjaT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGFpKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIGZpLmNhbGwoZSx0KT9lW3RdOnZvaWQgMH0sbGk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgcGk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gYWk/dm9pZCAwIT09ZVt0XTpsaS5jYWxsKGUsdCl9O3ZhciBkaT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09YWkmJnZvaWQgMD09PWU/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOmUsdGhpc307ZnVuY3Rpb24gZ2kodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19Z2kucHJvdG90eXBlLmNsZWFyPXVpLGdpLnByb3RvdHlwZS5kZWxldGU9aGksZ2kucHJvdG90eXBlLmdldD1jaSxnaS5wcm90b3R5cGUuaGFzPXBpLGdpLnByb3RvdHlwZS5zZXQ9ZGk7dmFyIHlpPWdpO3ZhciB2aT1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9O3ZhciBiaT1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX07dmFyIG1pPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoO3ItLTspaWYoYmkodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX0sd2k9QXJyYXkucHJvdG90eXBlLnNwbGljZTt2YXIgX2k9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPW1pKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOndpLmNhbGwoZSxyLDEpLC0tdGhpcy5zaXplLCEwKX07dmFyIFNpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1taShlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19O3ZhciBFaT1mdW5jdGlvbih0KXtyZXR1cm4gbWkodGhpcy5fX2RhdGFfXyx0KT4tMX07dmFyIGtpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxuPW1pKHIsdCk7cmV0dXJuIG48MD8oKyt0aGlzLnNpemUsci5wdXNoKFt0LGVdKSk6cltuXVsxXT1lLHRoaXN9O2Z1bmN0aW9uIFJpKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fVJpLnByb3RvdHlwZS5jbGVhcj12aSxSaS5wcm90b3R5cGUuZGVsZXRlPV9pLFJpLnByb3RvdHlwZS5nZXQ9U2ksUmkucHJvdG90eXBlLmhhcz1FaSxSaS5wcm90b3R5cGUuc2V0PWtpO3ZhciBBaT1SaSxUaT1zaShPbiwiTWFwIik7dmFyIE9pPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgeWksbWFwOm5ldyhUaXx8QWkpLHN0cmluZzpuZXcgeWl9fTt2YXIgamk9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH07dmFyIExpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fX2RhdGFfXztyZXR1cm4gamkoZSk/clsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpyLm1hcH07dmFyIENpPWZ1bmN0aW9uKHQpe3ZhciBlPUxpKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9O3ZhciBQaT1mdW5jdGlvbih0KXtyZXR1cm4gTGkodGhpcyx0KS5nZXQodCl9O3ZhciBNaT1mdW5jdGlvbih0KXtyZXR1cm4gTGkodGhpcyx0KS5oYXModCl9O3ZhciBCaT1mdW5jdGlvbih0LGUpe3ZhciByPUxpKHRoaXMsdCksbj1yLnNpemU7cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplKz1yLnNpemU9PW4/MDoxLHRoaXN9O2Z1bmN0aW9uIHhpKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fXhpLnByb3RvdHlwZS5jbGVhcj1PaSx4aS5wcm90b3R5cGUuZGVsZXRlPUNpLHhpLnByb3RvdHlwZS5nZXQ9UGkseGkucHJvdG90eXBlLmhhcz1NaSx4aS5wcm90b3R5cGUuc2V0PUJpO3ZhciBVaT14aTtmdW5jdGlvbiBJaSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZ1bmN0aW9uIik7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgbj1hcmd1bWVudHMsaT1lP2UuYXBwbHkodGhpcyxuKTpuWzBdLG89ci5jYWNoZTtpZihvLmhhcyhpKSlyZXR1cm4gby5nZXQoaSk7dmFyIHM9dC5hcHBseSh0aGlzLG4pO3JldHVybiByLmNhY2hlPW8uc2V0KGkscyl8fG8sc307cmV0dXJuIHIuY2FjaGU9bmV3KElpLkNhY2hlfHxVaSkscn1JaS5DYWNoZT1VaTt2YXIgRGk9SWk7dmFyIE5pPS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLEZpPS9cXChcXCk/L2csemk9ZnVuY3Rpb24odCl7dmFyIGU9RGkodCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PXIuc2l6ZSYmci5jbGVhcigpLHR9KSkscj1lLmNhY2hlO3JldHVybiBlfSgoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIDQ2PT09dC5jaGFyQ29kZUF0KDApJiZlLnB1c2goIiIpLHQucmVwbGFjZShOaSwoZnVuY3Rpb24odCxyLG4saSl7ZS5wdXNoKG4/aS5yZXBsYWNlKEZpLCIkMSIpOnJ8fHQpfSkpLGV9KSk7dmFyIHFpPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLGk9QXJyYXkobik7KytyPG47KWlbcl09ZSh0W3JdLHIsdCk7cmV0dXJuIGl9LFlpPWpuP2puLnByb3RvdHlwZTp2b2lkIDAsV2k9WWk/WWkudG9TdHJpbmc6dm9pZCAwO3ZhciAkaT1mdW5jdGlvbiB0KGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTtpZihSbihlKSlyZXR1cm4gcWkoZSx0KSsiIjtpZihGbihlKSlyZXR1cm4gV2k/V2kuY2FsbChlKToiIjt2YXIgcj1lKyIiO3JldHVybiIwIj09ciYmMS9lPT0tSW5maW5pdHk/Ii0wIjpyfTt2YXIgR2k9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6JGkodCl9O3ZhciBKaT1mdW5jdGlvbih0LGUpe3JldHVybiBSbih0KT90OlluKHQsZSk/W3RdOnppKEdpKHQpKX07dmFyIEhpPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8Rm4odCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX07dmFyIFZpPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0oZT1KaShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxuOyl0PXRbSGkoZVtyKytdKV07cmV0dXJuIHImJnI9PW4/dDp2b2lkIDB9O3ZhciBLaT1mdW5jdGlvbih0LGUscil7dmFyIG49bnVsbD09dD92b2lkIDA6VmkodCxlKTtyZXR1cm4gdm9pZCAwPT09bj9yOm59O3ZhciBaaT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fE5uKHQpJiYiW29iamVjdCBOdW1iZXJdIj09RG4odCl9O2Z1bmN0aW9uIFFpKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIFhpKHQpe3JldHVybiEoIVFpKHQpfHwiIj09PXQpfWZ1bmN0aW9uIHRvKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gZW8odCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gcm8odCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbm8odCl7cmV0dXJuISghUWkodCl8fCIiIT09dCl9ZnVuY3Rpb24gaW8odCl7cmV0dXJuISFlbyh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYocm8odCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhbm8odCl8fCEhZnVuY3Rpb24odCl7cmV0dXJuISF0byh0KSYmMD09PXQubGVuZ3RofSh0KSkpKX1mdW5jdGlvbiBvbygpe2xldCB0LGUscj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oKXt0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXX0pKTtyZXR1cm4gci5yZXNvbHZlPXQsci5yZWplY3Q9ZSxyfWxldCBXSnNvblN0cmVhbT17cGFyc2U6YXN5bmMgZnVuY3Rpb24odCl7aWYoIVhpKHQpKXJldHVybnt9O2xldCBlPXt9O3RyeXtlPUpTT04ucGFyc2UodCl9Y2F0Y2godCl7ZT17fX1yZXR1cm4gZX0scGFyc2VCeVN0cmVhbTpmdW5jdGlvbih0KXtsZXQgZT17fTtpZigibnVsbCI9PT10KXJldHVybiBudWxsO2lmKCIiPT09dClyZXR1cm57fTtsZXQgcj0iX19zeXN0ZW1fXyIsbj1geyJfX3N5c3RlbV9fIjoke3R9fWAsaT1vbygpLG89eXIobikscz1jbi5wYXJzZSgiJCoiKTtyZXR1cm4gcy5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2VbdC5rZXldPXQudmFsdWV9KSkscy5vbigiZW5kIiwoZnVuY3Rpb24oKXtsZXQgdD1LaShlLHIpO2kucmVzb2x2ZSh0KX0pKSxzLm9uKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2kucmVqZWN0KHQpfSkpLG8ucGlwZShzKSxpfSxjcmVhdGVQYXJzZVN0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gWGkodCl8fGZ1bmN0aW9uKHQpe3JldHVybiEoIXRvKHQpfHwwPT09dC5sZW5ndGh8fDE9PT10Lmxlbmd0aCYmaW8odFswXSkpfSh0KXx8KHQ9IiQqIiksY24ucGFyc2UodCl9LHN0cmluZ2lmeTphc3luYyBmdW5jdGlvbih0KXtpZihlbyh0KSlyZXR1cm4iIjtsZXQgZT0iIjt0cnl7ZT1KU09OLnN0cmluZ2lmeSh0KX1jYXRjaCh0KXtlPSIifXJldHVybiBlfSxzdHJpbmdpZnlCeVN0cmVhbTpmdW5jdGlvbih0KXtsZXQgZT0iIjtpZihlbyh0KSlyZXR1cm4iIjtpZihudWxsPT09dClyZXR1cm4ibnVsbCI7aWYobm8odCkpcmV0dXJuJyIiJztpZihaaSh0KSlyZXR1cm5gJHt0fWA7aWYoUWkodCkpcmV0dXJuYCIke3R9ImA7bGV0IHI9b28oKSxuPW5ldyBrbih0LG51bGwsbnVsbCwhMSk7cmV0dXJuIG4ub24oImRhdGEiLChmdW5jdGlvbih0KXtlKz10fSkpLG4ub24oImVuZCIsKGZ1bmN0aW9uKCl7ci5yZXNvbHZlKGUpfSkpLG4ub24oImVycm9yIiwoZnVuY3Rpb24odCl7ci5yZWplY3QodCl9KSkscn0sY3JlYXRlU3RyaW5naWZ5U3RyZWFtOmZ1bmN0aW9uKHQpe2lmKCFybyh0KSYmIXRvKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5Iik7cmV0dXJuIG5ldyBrbih0LG51bGwsbnVsbCwhMSl9fTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IFdKc29uU3RyZWFtKC4uLmlucHV0KQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFdKc29uU3RyZWFtCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBwYXJlbnRQb3J0Lm9uKCdtZXNzYWdlJywgcmVjdk1lc3NhZ2UpCiAgICAgICAgCgo=",Buffer.from(G,"base64").toString("utf8"));function y(){var d=Z();function b(Z){try{return new l.Worker(Z,{eval:!0})}catch(l){p(l)}}var G=b(X);if(!G)return p("invalid worker"),null;function i(){G?(G.terminate(),G=void 0):p("worker has been terminated")}function W(){var l={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};G.postMessage(l)}function u(){var l=m(),Z=c(),b={mode:"call",id:Z,fun:"stringify",input:Array.prototype.slice.call(arguments)};return G.postMessage(b),d.once(Z,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function y(){var l=m(),Z=c(),b={mode:"call",id:Z,fun:"parse",input:Array.prototype.slice.call(arguments)};return G.postMessage(b),d.once(Z,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function I(l){var Z=l,m=Z.mode;"emit"!==m&&"return"!==m||("emit"===m&&d.emit(Z.evName,Z.msg),"return"===m&&d.emit(Z.id,Z))}function p(l){d.emit("error",l)}return G.on("message",I),G.on("error",p),W(Array.prototype.slice.call(arguments)),d.stringify=u,d.parse=y,d.terminate=i,d}var I,p,V={stringify:(p=b(W.mark((function l(){var Z,m,c,b=arguments;return W.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return Z=Array.prototype.slice.call(b),m=y(),l.next=4,m.stringify.apply(m,d(Z)).finally((function(){m.terminate()}));case 4:return c=l.sent,l.abrupt("return",c);case 6:case"end":return l.stop()}}),l)}))),function(){return p.apply(this,arguments)}),parse:(I=b(W.mark((function l(){var Z,m,c,b=arguments;return W.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return Z=Array.prototype.slice.call(b),m=y(),l.next=4,m.parse.apply(m,d(Z)).finally((function(){m.terminate()}));case 4:return c=l.sent,l.abrupt("return",c);case 6:case"end":return l.stop()}}),l)}))),function(){return I.apply(this,arguments)})};for(var h in i=Z(),V){var a=V[h];i[h]=a}}(),i}(d.default)})),G=c((function(l,Z){l.exports=function(){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,c,b,G){try{var X=l[b](G),i=X.value}catch(l){return void d(l)}X.done?Z(i):Promise.resolve(i).then(m,c)}function c(l){return function(){var Z=this,m=arguments;return new Promise((function(c,b){var G=l.apply(Z,m);function X(l){d(G,c,b,X,i,"next",l)}function i(l){d(G,c,b,X,i,"throw",l)}X(void 0)}))}}function b(l){return b="function"==typeof Symbol&&"symbol"==m(Symbol.iterator)?function(l){return m(l)}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":m(l)},b(l)}function G(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var X,i,W=G((function(l){var Z=function(l){var Z,d=Object.prototype,m=d.hasOwnProperty,c="function"==typeof Symbol?Symbol:{},G=c.iterator||"@@iterator",X=c.asyncIterator||"@@asyncIterator",i=c.toStringTag||"@@toStringTag";function W(l,Z,d){return Object.defineProperty(l,Z,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[Z]}try{W({},"")}catch(l){W=function(l,Z,d){return l[Z]=d}}function u(l,Z,d,m){var c=Z&&Z.prototype instanceof n?Z:n,b=Object.create(c.prototype),G=new x(m||[]);return b._invoke=function(l,Z,d){var m=I;return function(c,b){if(m===V)throw new Error("Generator is already running");if(m===h){if("throw"===c)throw b;return g()}for(d.method=c,d.arg=b;;){var G=d.delegate;if(G){var X=H(G,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===I)throw m=h,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);m=V;var i=y(l,Z,d);if("normal"===i.type){if(m=d.done?h:p,i.arg===a)continue;return{value:i.arg,done:d.done}}"throw"===i.type&&(m=h,d.method="throw",d.arg=i.arg)}}}(l,d,G),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 I="suspendedStart",p="suspendedYield",V="executing",h="completed",a={};function n(){}function o(){}function K(){}var Y={};W(Y,G,(function(){return this}));var R=Object.getPrototypeOf,L=R&&R(R(T([])));L&&L!==d&&m.call(L,G)&&(Y=L);var s=K.prototype=n.prototype=Object.create(Y);function J(l){["next","throw","return"].forEach((function(Z){W(l,Z,(function(l){return this._invoke(Z,l)}))}))}function t(l,Z){function d(c,G,X,i){var W=y(l[c],l,G);if("throw"!==W.type){var u=W.arg,I=u.value;return I&&"object"===b(I)&&m.call(I,"__await")?Z.resolve(I.__await).then((function(l){d("next",l,X,i)}),(function(l){d("throw",l,X,i)})):Z.resolve(I).then((function(l){u.value=l,X(u)}),(function(l){return d("throw",l,X,i)}))}i(W.arg)}var c;this._invoke=function(l,m){function b(){return new Z((function(Z,c){d(l,m,Z,c)}))}return c=c?c.then(b,b):b()}}function H(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,H(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 c=y(m,l.iterator,d.arg);if("throw"===c.type)return d.method="throw",d.arg=c.arg,d.delegate=null,a;var b=c.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 S(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 x(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(S,this),this.reset(!0)}function T(l){if(l){var d=l[G];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var c=-1,b=function d(){for(;++c<l.length;)if(m.call(l,c))return d.value=l[c],d.done=!1,d;return d.value=Z,d.done=!0,d};return b.next=b}}return{next:g}}function g(){return{value:Z,done:!0}}return o.prototype=K,W(s,"constructor",K),W(K,"constructor",o),o.displayName=W(K,i,"GeneratorFunction"),l.isGeneratorFunction=function(l){var Z="function"==typeof l&&l.constructor;return!!Z&&(Z===o||"GeneratorFunction"===(Z.displayName||Z.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,K):(l.__proto__=K,W(l,i,"GeneratorFunction")),l.prototype=Object.create(s),l},l.awrap=function(l){return{__await:l}},J(t.prototype),W(t.prototype,X,(function(){return this})),l.AsyncIterator=t,l.async=function(Z,d,m,c,b){void 0===b&&(b=Promise);var G=new t(u(Z,d,m,c),b);return l.isGeneratorFunction(d)?G:G.next().then((function(l){return l.done?l.value:G.next()}))},J(s),W(s,i,"Generator"),W(s,G,(function(){return this})),W(s,"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,x.prototype={constructor:x,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 c(m,c){return X.type="throw",X.arg=l,d.next=m,c&&(d.method="next",d.arg=Z),!!c}for(var b=this.tryEntries.length-1;b>=0;--b){var G=this.tryEntries[b],X=G.completion;if("root"===G.tryLoc)return c("end");if(G.tryLoc<=this.prev){var i=m.call(G,"catchLoc"),W=m.call(G,"finallyLoc");if(i&&W){if(this.prev<G.catchLoc)return c(G.catchLoc,!0);if(this.prev<G.finallyLoc)return c(G.finallyLoc)}else if(i){if(this.prev<G.catchLoc)return c(G.catchLoc,!0)}else{if(!W)throw new Error("try statement without catch or finally");if(this.prev<G.finallyLoc)return c(G.finallyLoc)}}}},abrupt:function(l,Z){for(var d=this.tryEntries.length-1;d>=0;--d){var c=this.tryEntries[d];if(c.tryLoc<=this.prev&&m.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var b=c;break}}b&&("break"===l||"continue"===l)&&b.tryLoc<=Z&&Z<=b.finallyLoc&&(b=null);var G=b?b.completion:{};return G.type=l,G.arg=Z,b?(this.method="next",this.next=b.finallyLoc,a):this.complete(G)},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 c=m.arg;C(d)}return c}}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){"object"===("undefined"==typeof globalThis?"undefined":b(globalThis))?globalThis.regeneratorRuntime=Z:Function("r","regeneratorRuntime = r")(Z)}})),u="function"==typeof atob,y="function"==typeof Buffer,I="function"==typeof TextDecoder?new TextDecoder:void 0,p=("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=")),V=(X={},p.forEach((function(l,Z){return X[l]=Z})),X),h=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,a=String.fromCharCode.bind(String),n="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):function(l){var Z=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(l){return l};return new Uint8Array(Array.prototype.slice.call(l,0).map(Z))},o=function(l){return l.replace(/[^A-Za-z0-9\+\/]/g,"")},K=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,Y=function(l){switch(l.length){case 4:var Z=((7&l.charCodeAt(0))<<18|(63&l.charCodeAt(1))<<12|(63&l.charCodeAt(2))<<6|63&l.charCodeAt(3))-65536;return a(55296+(Z>>>10))+a(56320+(1023&Z));case 3:return a((15&l.charCodeAt(0))<<12|(63&l.charCodeAt(1))<<6|63&l.charCodeAt(2));default:return a((31&l.charCodeAt(0))<<6|63&l.charCodeAt(1))}},R=function(l){return l.replace(K,Y)},L=function(l){if(l=l.replace(/\s+/g,""),!h.test(l))throw new TypeError("malformed base64.");l+="==".slice(2-(3&l.length));for(var Z,d,m,c="",b=0;b<l.length;)Z=V[l.charAt(b++)]<<18|V[l.charAt(b++)]<<12|(d=V[l.charAt(b++)])<<6|(m=V[l.charAt(b++)]),c+=64===d?a(Z>>16&255):64===m?a(Z>>16&255,Z>>8&255):a(Z>>16&255,Z>>8&255,255&Z);return c},s=u?function(l){return atob(o(l))}:y?function(l){return Buffer.from(l,"base64").toString("binary")}:L,J=y?function(l){return n(Buffer.from(l,"base64"))}:function(l){return n(s(l),(function(l){return l.charCodeAt(0)}))},t=y?function(l){return Buffer.from(l,"base64").toString("utf8")}:I?function(l){return I.decode(J(l))}:function(l){return R(s(l))},H=function(l){return o(l.replace(/[-_]/g,(function(l){return"-"==l?"+":"/"})))},S=function(l){return t(H(l))},C=S,x=G((function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function c(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function b(l,Z,m,b,G){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new c(m,b||l,G),i=d?d+Z:Z;return l._events[i]?l._events[i].fn?l._events[i]=[l._events[i],X]:l._events[i].push(X):(l._events[i]=X,l._eventsCount++),l}function G(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,c=[];if(0===this._eventsCount)return c;for(m in l=this._events)Z.call(l,m)&&c.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(l)):c},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 c=0,b=m.length,G=new Array(b);c<b;c++)G[c]=m[c].fn;return G},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,c,b,G){var X=d?d+l:l;if(!this._events[X])return!1;var i,W,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,c),!0;case 5:return u.fn.call(u.context,Z,m,c,b),!0;case 6:return u.fn.call(u.context,Z,m,c,b,G),!0}for(W=1,i=new Array(y-1);W<y;W++)i[W-1]=arguments[W];u.fn.apply(u.context,i)}else{var I,p=u.length;for(W=0;W<p;W++)switch(u[W].once&&this.removeListener(l,u[W].fn,void 0,!0),y){case 1:u[W].fn.call(u[W].context);break;case 2:u[W].fn.call(u[W].context,Z);break;case 3:u[W].fn.call(u[W].context,Z,m);break;case 4:u[W].fn.call(u[W].context,Z,m,c);break;default:if(!i)for(I=1,i=new Array(y-1);I<y;I++)i[I-1]=arguments[I];u[W].fn.apply(u[W].context,i)}}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,c){var b=d?d+l:l;if(!this._events[b])return this;if(!Z)return G(this,b),this;var X=this._events[b];if(X.fn)X.fn!==Z||c&&!X.once||m&&X.context!==m||G(this,b);else{for(var i=0,W=[],u=X.length;i<u;i++)(X[i].fn!==Z||c&&!X[i].once||m&&X[i].context!==m)&&W.push(X[i]);W.length?this._events[b]=1===W.length?W[0]:W:G(this,b)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&G(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}));return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new x}function d(){var l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function m(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length,c=0;c<l;c++)Z[c]=d[0|Math.random()*m];return Z.join("")}var b=C("CgoKZnVuY3Rpb24gdCgpe31mdW5jdGlvbiBlKCl7ZS5pbml0LmNhbGwodGhpcyl9ZnVuY3Rpb24gcih0KXtyZXR1cm4gdm9pZCAwPT09dC5fbWF4TGlzdGVuZXJzP2UuZGVmYXVsdE1heExpc3RlbmVyczp0Ll9tYXhMaXN0ZW5lcnN9ZnVuY3Rpb24gbih0LGUscil7aWYoZSl0LmNhbGwocik7ZWxzZSBmb3IodmFyIG49dC5sZW5ndGgsaT1jKHQsbiksbz0wO288bjsrK28paVtvXS5jYWxsKHIpfWZ1bmN0aW9uIGkodCxlLHIsbil7aWYoZSl0LmNhbGwocixuKTtlbHNlIGZvcih2YXIgaT10Lmxlbmd0aCxvPWModCxpKSxzPTA7czxpOysrcylvW3NdLmNhbGwocixuKX1mdW5jdGlvbiBvKHQsZSxyLG4saSl7aWYoZSl0LmNhbGwocixuLGkpO2Vsc2UgZm9yKHZhciBvPXQubGVuZ3RoLHM9Yyh0LG8pLGE9MDthPG87KythKXNbYV0uY2FsbChyLG4saSl9ZnVuY3Rpb24gcyh0LGUscixuLGksbyl7aWYoZSl0LmNhbGwocixuLGksbyk7ZWxzZSBmb3IodmFyIHM9dC5sZW5ndGgsYT1jKHQscyksdT0wO3U8czsrK3UpYVt1XS5jYWxsKHIsbixpLG8pfWZ1bmN0aW9uIGEodCxlLHIsbil7aWYoZSl0LmFwcGx5KHIsbik7ZWxzZSBmb3IodmFyIGk9dC5sZW5ndGgsbz1jKHQsaSkscz0wO3M8aTsrK3Mpb1tzXS5hcHBseShyLG4pfWZ1bmN0aW9uIHUoZSxuLGksbyl7dmFyIHMsYSx1LGg7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtpZigoYT1lLl9ldmVudHMpPyhhLm5ld0xpc3RlbmVyJiYoZS5lbWl0KCJuZXdMaXN0ZW5lciIsbixpLmxpc3RlbmVyP2kubGlzdGVuZXI6aSksYT1lLl9ldmVudHMpLHU9YVtuXSk6KGE9ZS5fZXZlbnRzPW5ldyB0LGUuX2V2ZW50c0NvdW50PTApLHUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB1P3U9YVtuXT1vP1tpLHVdOlt1LGldOm8/dS51bnNoaWZ0KGkpOnUucHVzaChpKSwhdS53YXJuZWQmJihzPXIoZSkpJiZzPjAmJnUubGVuZ3RoPnMpe3Uud2FybmVkPSEwO3ZhciBmPW5ldyBFcnJvcigiUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAiK3UubGVuZ3RoKyIgIituKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2YubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixmLmVtaXR0ZXI9ZSxmLnR5cGU9bixmLmNvdW50PXUubGVuZ3RoLGg9ZiwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS53YXJuP2NvbnNvbGUud2FybihoKTpjb25zb2xlLmxvZyhoKX19ZWxzZSB1PWFbbl09aSwrK2UuX2V2ZW50c0NvdW50O3JldHVybiBlfWZ1bmN0aW9uIGgodCxlLHIpe3ZhciBuPSExO2Z1bmN0aW9uIGkoKXt0LnJlbW92ZUxpc3RlbmVyKGUsaSksbnx8KG49ITAsci5hcHBseSh0LGFyZ3VtZW50cykpfXJldHVybiBpLmxpc3RlbmVyPXIsaX1mdW5jdGlvbiBmKHQpe3ZhciBlPXRoaXMuX2V2ZW50cztpZihlKXt2YXIgcj1lW3RdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByKXJldHVybiAxO2lmKHIpcmV0dXJuIHIubGVuZ3RofXJldHVybiAwfWZ1bmN0aW9uIGModCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT10W2VdO3JldHVybiByfXQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobnVsbCksZS5FdmVudEVtaXR0ZXI9ZSxlLnVzaW5nRG9tYWlucz0hMSxlLnByb3RvdHlwZS5kb21haW49dm9pZCAwLGUucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLGUucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLGUuZGVmYXVsdE1heExpc3RlbmVycz0xMCxlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmRvbWFpbj1udWxsLGUudXNpbmdEb21haW5zJiZ1bmRlZmluZWQuYWN0aXZlLHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9bmV3IHQsdGhpcy5fZXZlbnRzQ291bnQ9MCksdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfSxlLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0fHx0PDB8fGlzTmFOKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJuIiBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9LGUucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiByKHRoaXMpfSxlLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsdSxoLGYsYyxsLHA9ImVycm9yIj09PXQ7aWYoYz10aGlzLl9ldmVudHMpcD1wJiZudWxsPT1jLmVycm9yO2Vsc2UgaWYoIXApcmV0dXJuITE7aWYobD10aGlzLmRvbWFpbixwKXtpZihlPWFyZ3VtZW50c1sxXSwhbCl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGU7dmFyIGQ9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudC4gKCcrZSsiKSIpO3Rocm93IGQuY29udGV4dD1lLGR9cmV0dXJuIGV8fChlPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQnKSksZS5kb21haW5FbWl0dGVyPXRoaXMsZS5kb21haW49bCxlLmRvbWFpblRocm93bj0hMSxsLmVtaXQoImVycm9yIixlKSwhMX1pZighKHI9Y1t0XSkpcmV0dXJuITE7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIHI7c3dpdGNoKHU9YXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOm4ocixnLHRoaXMpO2JyZWFrO2Nhc2UgMjppKHIsZyx0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOm8ocixnLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7YnJlYWs7Y2FzZSA0OnMocixnLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10pO2JyZWFrO2RlZmF1bHQ6Zm9yKGg9bmV3IEFycmF5KHUtMSksZj0xO2Y8dTtmKyspaFtmLTFdPWFyZ3VtZW50c1tmXTthKHIsZyx0aGlzLGgpfXJldHVybiEwfSxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiB1KHRoaXMsdCxlLCExKX0sZS5wcm90b3R5cGUub249ZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIsZS5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUodGhpcyx0LGUsITApfSxlLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5vbih0LGgodGhpcyx0LGUpKSx0aGlzfSxlLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5wcmVwZW5kTGlzdGVuZXIodCxoKHRoaXMsdCxlKSksdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSxyKXt2YXIgbixpLG8scyxhO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7aWYoIShpPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYoIShuPWlbZV0pKXJldHVybiB0aGlzO2lmKG49PT1yfHxuLmxpc3RlbmVyJiZuLmxpc3RlbmVyPT09cikwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgdDooZGVsZXRlIGlbZV0saS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsZSxuLmxpc3RlbmVyfHxyKSk7ZWxzZSBpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil7Zm9yKG89LTEscz1uLmxlbmd0aDtzLS0gPjA7KWlmKG5bc109PT1yfHxuW3NdLmxpc3RlbmVyJiZuW3NdLmxpc3RlbmVyPT09cil7YT1uW3NdLmxpc3RlbmVyLG89czticmVha31pZihvPDApcmV0dXJuIHRoaXM7aWYoMT09PW4ubGVuZ3RoKXtpZihuWzBdPXZvaWQgMCwwPT0tLXRoaXMuX2V2ZW50c0NvdW50KXJldHVybiB0aGlzLl9ldmVudHM9bmV3IHQsdGhpcztkZWxldGUgaVtlXX1lbHNlIWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWUsbj1yKzEsaT10Lmxlbmd0aDtuPGk7cis9MSxuKz0xKXRbcl09dFtuXTt0LnBvcCgpfShuLG8pO2kucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsYXx8cil9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgcixuO2lmKCEobj10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKCFuLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZXZlbnRzPW5ldyB0LHRoaXMuX2V2ZW50c0NvdW50PTApOm5bZV0mJigwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgdDpkZWxldGUgbltlXSksdGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBpLG89T2JqZWN0LmtleXMobikscz0wO3M8by5sZW5ndGg7KytzKSJyZW1vdmVMaXN0ZW5lciIhPT0oaT1vW3NdKSYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoaSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoImZ1bmN0aW9uIj09dHlwZW9mKHI9bltlXSkpdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHIpO2Vsc2UgaWYocilkb3t0aGlzLnJlbW92ZUxpc3RlbmVyKGUscltyLmxlbmd0aC0xXSl9d2hpbGUoclswXSk7cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyPXRoaXMuX2V2ZW50cztyZXR1cm4gciYmKGU9clt0XSk/ImZ1bmN0aW9uIj09dHlwZW9mIGU/W2UubGlzdGVuZXJ8fGVdOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9MDtyPGUubGVuZ3RoOysrcillW3JdPXRbcl0ubGlzdGVuZXJ8fHRbcl07cmV0dXJuIGV9KGUpOltdfSxlLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5saXN0ZW5lckNvdW50P3QubGlzdGVuZXJDb3VudChlKTpmLmNhbGwodCxlKX0sZS5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1mLGUucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9SZWZsZWN0Lm93bktleXModGhpcy5fZXZlbnRzKTpbXX07dmFyIGw9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSxwPVtdLGQ9W10sZz0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSx5PSExO2Z1bmN0aW9uIHYoKXt5PSEwO2Zvcih2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSlwW2VdPXRbZV0sZFt0LmNoYXJDb2RlQXQoZSldPWU7ZFsiLSIuY2hhckNvZGVBdCgwKV09NjIsZFsiXyIuY2hhckNvZGVBdCgwKV09NjN9ZnVuY3Rpb24gYih0LGUscil7Zm9yKHZhciBuLGksbz1bXSxzPWU7czxyO3MrPTMpbj0odFtzXTw8MTYpKyh0W3MrMV08PDgpK3RbcysyXSxvLnB1c2gocFsoaT1uKT4+MTgmNjNdK3BbaT4+MTImNjNdK3BbaT4+NiY2M10rcFs2MyZpXSk7cmV0dXJuIG8uam9pbigiIil9ZnVuY3Rpb24gbSh0KXt2YXIgZTt5fHx2KCk7Zm9yKHZhciByPXQubGVuZ3RoLG49ciUzLGk9IiIsbz1bXSxzPTE2MzgzLGE9MCx1PXItbjthPHU7YSs9cylvLnB1c2goYih0LGEsYStzPnU/dTphK3MpKTtyZXR1cm4gMT09PW4/KGU9dFtyLTFdLGkrPXBbZT4+Ml0saSs9cFtlPDw0JjYzXSxpKz0iPT0iKToyPT09biYmKGU9KHRbci0yXTw8OCkrdFtyLTFdLGkrPXBbZT4+MTBdLGkrPXBbZT4+NCY2M10saSs9cFtlPDwyJjYzXSxpKz0iPSIpLG8ucHVzaChpKSxvLmpvaW4oIiIpfWZ1bmN0aW9uIHcodCxlLHIsbixpKXt2YXIgbyxzLGE9OCppLW4tMSx1PSgxPDxhKS0xLGg9dT4+MSxmPS03LGM9cj9pLTE6MCxsPXI/LTE6MSxwPXRbZStjXTtmb3IoYys9bCxvPXAmKDE8PC1mKS0xLHA+Pj0tZixmKz1hO2Y+MDtvPTI1NipvK3RbZStjXSxjKz1sLGYtPTgpO2ZvcihzPW8mKDE8PC1mKS0xLG8+Pj0tZixmKz1uO2Y+MDtzPTI1NipzK3RbZStjXSxjKz1sLGYtPTgpO2lmKDA9PT1vKW89MS1oO2Vsc2V7aWYobz09PXUpcmV0dXJuIHM/TmFOOjEvMCoocD8tMToxKTtzKz1NYXRoLnBvdygyLG4pLG8tPWh9cmV0dXJuKHA/LTE6MSkqcypNYXRoLnBvdygyLG8tbil9ZnVuY3Rpb24gXyh0LGUscixuLGksbyl7dmFyIHMsYSx1LGg9OCpvLWktMSxmPSgxPDxoKS0xLGM9Zj4+MSxsPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAscD1uPzA6by0xLGQ9bj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhhPWlzTmFOKGUpPzE6MCxzPWYpOihzPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MiksKGUrPXMrYz49MT9sL3U6bCpNYXRoLnBvdygyLDEtYykpKnU+PTImJihzKyssdS89MikscytjPj1mPyhhPTAscz1mKTpzK2M+PTE/KGE9KGUqdS0xKSpNYXRoLnBvdygyLGkpLHMrPWMpOihhPWUqTWF0aC5wb3coMixjLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODt0W3IrcF09MjU1JmEscCs9ZCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLGgrPWk7aD4wO3RbcitwXT0yNTUmcyxwKz1kLHMvPTI1NixoLT04KTt0W3IrcC1kXXw9MTI4Kmd9dmFyIFM9e30udG9TdHJpbmcsRT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1TLmNhbGwodCl9O2Z1bmN0aW9uIGsoKXtyZXR1cm4gQS5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBSKHQsZSl7aWYoaygpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPUEucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IEEoZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gQSh0LGUscil7aWYoIShBLlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBBKSlyZXR1cm4gbmV3IEEodCxlLHIpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gaih0aGlzLHQpfXJldHVybiBUKHRoaXMsdCxlLHIpfWZ1bmN0aW9uIFQodCxlLHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLHIsbil7aWYoZS5ieXRlTGVuZ3RoLHI8MHx8ZS5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlLHIpOm5ldyBVaW50OEFycmF5KGUscixuKTtBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPUEucHJvdG90eXBlOnQ9TCh0LGUpO3JldHVybiB0fSh0LGUscixuKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLHIpeyJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpO2lmKCFBLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIG49MHxNKGUsciksaT0odD1SKHQsbikpLndyaXRlKGUscik7aSE9PW4mJih0PXQuc2xpY2UoMCxpKSk7cmV0dXJuIHR9KHQsZSxyKTpmdW5jdGlvbih0LGUpe2lmKFAoZSkpe3ZhciByPTB8QyhlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD1SKHQscikpLmxlbmd0aHx8ZS5jb3B5KHQsMCwwLHIpLHR9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChuPWUubGVuZ3RoKSE9bj9SKHQsMCk6TCh0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZFKGUuZGF0YSkpcmV0dXJuIEwodCxlLmRhdGEpfXZhciBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0odCxlKX1mdW5jdGlvbiBPKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gaih0LGUpe2lmKE8oZSksdD1SKHQsZTwwPzA6MHxDKGUpKSwhQS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgcj0wO3I8ZTsrK3IpdFtyXT0wO3JldHVybiB0fWZ1bmN0aW9uIEwodCxlKXt2YXIgcj1lLmxlbmd0aDwwPzA6MHxDKGUubGVuZ3RoKTt0PVIodCxyKTtmb3IodmFyIG49MDtuPHI7bis9MSl0W25dPTI1NSZlW25dO3JldHVybiB0fWZ1bmN0aW9uIEModCl7aWYodD49aygpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitrKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIFAodCl7cmV0dXJuIShudWxsPT10fHwhdC5faXNCdWZmZXIpfWZ1bmN0aW9uIE0odCxlKXtpZihQKHQpKXJldHVybiB0Lmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KTt2YXIgcj10Lmxlbmd0aDtpZigwPT09cilyZXR1cm4gMDtmb3IodmFyIG49ITE7Oylzd2l0Y2goZSl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBvdCh0KS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKnI7Y2FzZSJoZXgiOnJldHVybiByPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIHN0KHQpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIG90KHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIEIodCxlLHIpe3ZhciBuPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1yfHxyPnRoaXMubGVuZ3RoKSYmKHI9dGhpcy5sZW5ndGgpLHI8PTApcmV0dXJuIiI7aWYoKHI+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gSCh0aGlzLGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gJCh0aGlzLGUscik7Y2FzZSJhc2NpaSI6cmV0dXJuIEcodGhpcyxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIEoodGhpcyxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gVyh0aGlzLGUscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBWKHRoaXMsZSxyKTtkZWZhdWx0OmlmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIHgodCxlLHIpe3ZhciBuPXRbZV07dFtlXT10W3JdLHRbcl09bn1mdW5jdGlvbiBVKHQsZSxyLG4saSl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygcj8obj1yLHI9MCk6cj4yMTQ3NDgzNjQ3P3I9MjE0NzQ4MzY0NzpyPC0yMTQ3NDgzNjQ4JiYocj0tMjE0NzQ4MzY0OCkscj0rcixpc05hTihyKSYmKHI9aT8wOnQubGVuZ3RoLTEpLHI8MCYmKHI9dC5sZW5ndGgrcikscj49dC5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7cj10Lmxlbmd0aC0xfWVsc2UgaWYocjwwKXtpZighaSlyZXR1cm4tMTtyPTB9aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1BLmZyb20oZSxuKSksUChlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOkkodCxlLHIsbixpKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGUmPTI1NSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxyKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxyKTpJKHQsW2VdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBJKHQsZSxyLG4saSl7dmFyIG8scz0xLGE9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO3M9MixhLz0yLHUvPTIsci89Mn1mdW5jdGlvbiBoKHQsZSl7cmV0dXJuIDE9PT1zP3RbZV06dC5yZWFkVUludDE2QkUoZSpzKX1pZihpKXt2YXIgZj0tMTtmb3Iobz1yO288YTtvKyspaWYoaCh0LG8pPT09aChlLC0xPT09Zj8wOm8tZikpe2lmKC0xPT09ZiYmKGY9byksby1mKzE9PT11KXJldHVybiBmKnN9ZWxzZS0xIT09ZiYmKG8tPW8tZiksZj0tMX1lbHNlIGZvcihyK3U+YSYmKHI9YS11KSxvPXI7bz49MDtvLS0pe2Zvcih2YXIgYz0hMCxsPTA7bDx1O2wrKylpZihoKHQsbytsKSE9PWgoZSxsKSl7Yz0hMTticmVha31pZihjKXJldHVybiBvfXJldHVybi0xfWZ1bmN0aW9uIEQodCxlLHIsbil7cj1OdW1iZXIocil8fDA7dmFyIGk9dC5sZW5ndGgtcjtuPyhuPU51bWJlcihuKSk+aSYmKG49aSk6bj1pO3ZhciBvPWUubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtuPm8vMiYmKG49by8yKTtmb3IodmFyIHM9MDtzPG47KytzKXt2YXIgYT1wYXJzZUludChlLnN1YnN0cigyKnMsMiksMTYpO2lmKGlzTmFOKGEpKXJldHVybiBzO3RbcitzXT1hfXJldHVybiBzfWZ1bmN0aW9uIE4odCxlLHIsbil7cmV0dXJuIGF0KG90KGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIEYodCxlLHIsbil7cmV0dXJuIGF0KGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDsrK3IpZS5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQocikpO3JldHVybiBlfShlKSx0LHIsbil9ZnVuY3Rpb24geih0LGUscixuKXtyZXR1cm4gRih0LGUscixuKX1mdW5jdGlvbiBxKHQsZSxyLG4pe3JldHVybiBhdChzdChlKSx0LHIsbil9ZnVuY3Rpb24gWSh0LGUscixuKXtyZXR1cm4gYXQoZnVuY3Rpb24odCxlKXtmb3IodmFyIHIsbixpLG89W10scz0wO3M8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrcyluPShyPXQuY2hhckNvZGVBdChzKSk+PjgsaT1yJTI1NixvLnB1c2goaSksby5wdXNoKG4pO3JldHVybiBvfShlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBXKHQsZSxyKXtyZXR1cm4gMD09PWUmJnI9PT10Lmxlbmd0aD9tKHQpOm0odC5zbGljZShlLHIpKX1mdW5jdGlvbiAkKHQsZSxyKXtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPWU7aTxyOyl7dmFyIG8scyxhLHUsaD10W2ldLGY9bnVsbCxjPWg+MjM5PzQ6aD4yMjM/MzpoPjE5MT8yOjE7aWYoaStjPD1yKXN3aXRjaChjKXtjYXNlIDE6aDwxMjgmJihmPWgpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKG89dFtpKzFdKSkmJih1PSgzMSZoKTw8Nnw2MyZvKT4xMjcmJihmPXUpO2JyZWFrO2Nhc2UgMzpvPXRbaSsxXSxzPXRbaSsyXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmKHU9KDE1JmgpPDwxMnwoNjMmbyk8PDZ8NjMmcyk+MjA0NyYmKHU8NTUyOTZ8fHU+NTczNDMpJiYoZj11KTticmVhaztjYXNlIDQ6bz10W2krMV0scz10W2krMl0sYT10W2krM10sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKHU9KDE1JmgpPDwxOHwoNjMmbyk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmdTwxMTE0MTEyJiYoZj11KX1udWxsPT09Zj8oZj02NTUzMyxjPTEpOmY+NjU1MzUmJihmLT02NTUzNixuLnB1c2goZj4+PjEwJjEwMjN8NTUyOTYpLGY9NTYzMjB8MTAyMyZmKSxuLnB1c2goZiksaSs9Y31yZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9NDA5NilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdCk7dmFyIHI9IiIsbj0wO2Zvcig7bjxlOylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0LnNsaWNlKG4sbis9NDA5NikpO3JldHVybiByfShuKX1BLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09bC5UWVBFRF9BUlJBWV9TVVBQT1JUfHxsLlRZUEVEX0FSUkFZX1NVUFBPUlQsQS5wb29sU2l6ZT04MTkyLEEuX2F1Z21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19fPUEucHJvdG90eXBlLHR9LEEuZnJvbT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFQobnVsbCx0LGUscil9LEEuVFlQRURfQVJSQVlfU1VQUE9SVCYmKEEucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxBLl9fcHJvdG9fXz1VaW50OEFycmF5KSxBLmFsbG9jPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIE8oZSksZTw9MD9SKHQsZSk6dm9pZCAwIT09cj8ic3RyaW5nIj09dHlwZW9mIG4/Uih0LGUpLmZpbGwocixuKTpSKHQsZSkuZmlsbChyKTpSKHQsZSl9KG51bGwsdCxlLHIpfSxBLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe3JldHVybiBqKG51bGwsdCl9LEEuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe3JldHVybiBqKG51bGwsdCl9LEEuaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJighIXQuX2lzQnVmZmVyfHx1dCh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZEZsb2F0TEUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnNsaWNlJiZ1dCh0LnNsaWNlKDAsMCkpfSh0KSl9LEEuY29tcGFyZT1mdW5jdGlvbih0LGUpe2lmKCFQKHQpfHwhUChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYodD09PWUpcmV0dXJuIDA7Zm9yKHZhciByPXQubGVuZ3RoLG49ZS5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKHRbaV0hPT1lW2ldKXtyPXRbaV0sbj1lW2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sQS5pc0VuY29kaW5nPWZ1bmN0aW9uKHQpe3N3aXRjaChTdHJpbmcodCkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxBLmNvbmNhdD1mdW5jdGlvbih0LGUpe2lmKCFFKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIEEuYWxsb2MoMCk7dmFyIHI7aWYodm9pZCAwPT09ZSlmb3IoZT0wLHI9MDtyPHQubGVuZ3RoOysrcillKz10W3JdLmxlbmd0aDt2YXIgbj1BLmFsbG9jVW5zYWZlKGUpLGk9MDtmb3Iocj0wO3I8dC5sZW5ndGg7KytyKXt2YXIgbz10W3JdO2lmKCFQKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0sQS5ieXRlTGVuZ3RoPU0sQS5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLEEucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9Mil4KHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSxBLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpeCh0aGlzLGUsZSszKSx4KHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LEEucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9OCl4KHRoaXMsZSxlKzcpLHgodGhpcyxlKzEsZSs2KSx4KHRoaXMsZSsyLGUrNSkseCh0aGlzLGUrMyxlKzQpO3JldHVybiB0aGlzfSxBLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT10PyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoPyQodGhpcywwLHQpOkIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxBLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoIVAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09dHx8MD09PUEuY29tcGFyZSh0aGlzLHQpfSxBLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9IiI7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJih0PXRoaXMudG9TdHJpbmcoImhleCIsMCw1MCkubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPjUwJiYodCs9IiAuLi4gIikpLCI8QnVmZmVyICIrdCsiPiJ9LEEucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlLHIsbixpKXtpZighUCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dD90Lmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksZTwwfHxyPnQubGVuZ3RofHxuPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWkmJmU+PXIpcmV0dXJuIDA7aWYobj49aSlyZXR1cm4tMTtpZihlPj1yKXJldHVybiAxO2lmKHRoaXM9PT10KXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0obj4+Pj0wKSxzPShyPj4+PTApLShlPj4+PTApLGE9TWF0aC5taW4obyxzKSx1PXRoaXMuc2xpY2UobixpKSxoPXQuc2xpY2UoZSxyKSxmPTA7ZjxhOysrZilpZih1W2ZdIT09aFtmXSl7bz11W2ZdLHM9aFtmXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LEEucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZih0LGUscil9LEEucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVKHRoaXMsdCxlLHIsITApfSxBLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUscil7cmV0dXJuIFUodGhpcyx0LGUsciwhMSl9LEEucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHZvaWQgMD09PWUpbj0idXRmOCIscj10aGlzLmxlbmd0aCxlPTA7ZWxzZSBpZih2b2lkIDA9PT1yJiYic3RyaW5nIj09dHlwZW9mIGUpbj1lLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2V7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTtlfD0wLGlzRmluaXRlKHIpPyhyfD0wLHZvaWQgMD09PW4mJihuPSJ1dGY4IikpOihuPXIscj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLWU7aWYoKHZvaWQgMD09PXJ8fHI+aSkmJihyPWkpLHQubGVuZ3RoPjAmJihyPDB8fGU8MCl8fGU+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7bnx8KG49InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gobil7Y2FzZSJoZXgiOnJldHVybiBEKHRoaXMsdCxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIE4odGhpcyx0LGUscik7Y2FzZSJhc2NpaSI6cmV0dXJuIEYodGhpcyx0LGUscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4geih0aGlzLHQsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIHEodGhpcyx0LGUscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBZKHRoaXMsdCxlLHIpO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pO249KCIiK24pLnRvTG93ZXJDYXNlKCksbz0hMH19LEEucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07ZnVuY3Rpb24gRyh0LGUscil7dmFyIG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbaV0pO3JldHVybiBufWZ1bmN0aW9uIEoodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbaV0pO3JldHVybiBufWZ1bmN0aW9uIEgodCxlLHIpe3ZhciBuPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFyfHxyPDB8fHI+bikmJihyPW4pO2Zvcih2YXIgaT0iIixvPWU7bzxyOysrbylpKz1pdCh0W29dKTtyZXR1cm4gaX1mdW5jdGlvbiBWKHQsZSxyKXtmb3IodmFyIG49dC5zbGljZShlLHIpLGk9IiIsbz0wO288bi5sZW5ndGg7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5bb10rMjU2Km5bbysxXSk7cmV0dXJuIGl9ZnVuY3Rpb24gSyh0LGUscil7aWYodCUxIT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5yKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gWih0LGUscixuLGksbyl7aWYoIVAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxvKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFEodCxlLHIsbil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciwyKTtpPG87KytpKXRbcitpXT0oZSYyNTU8PDgqKG4/aToxLWkpKT4+PjgqKG4/aToxLWkpfWZ1bmN0aW9uIFgodCxlLHIsbil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aC1yLDQpO2k8bzsrK2kpdFtyK2ldPWU+Pj44KihuP2k6My1pKSYyNTV9ZnVuY3Rpb24gdHQodCxlLHIsbixpLG8pe2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBldCh0LGUscixuLGkpe3JldHVybiBpfHx0dCh0LDAsciw0KSxfKHQsZSxyLG4sMjMsNCkscis0fWZ1bmN0aW9uIHJ0KHQsZSxyLG4saSl7cmV0dXJuIGl8fHR0KHQsMCxyLDgpLF8odCxlLHIsbiw1Miw4KSxyKzh9QS5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgcixuPXRoaXMubGVuZ3RoO2lmKCh0PX5+dCk8MD8odCs9bik8MCYmKHQ9MCk6dD5uJiYodD1uKSwoZT12b2lkIDA9PT1lP246fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLGU8dCYmKGU9dCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUKShyPXRoaXMuc3ViYXJyYXkodCxlKSkuX19wcm90b19fPUEucHJvdG90eXBlO2Vsc2V7dmFyIGk9ZS10O3I9bmV3IEEoaSx2b2lkIDApO2Zvcih2YXIgbz0wO288aTsrK28pcltvXT10aGlzW28rdF19cmV0dXJuIHJ9LEEucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxLKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdF0saT0xLG89MDsrK288ZSYmKGkqPTI1Nik7KW4rPXRoaXNbdCtvXSppO3JldHVybiBufSxBLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Syh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3QrLS1lXSxpPTE7ZT4wJiYoaSo9MjU2KTspbis9dGhpc1t0Ky0tZV0qaTtyZXR1cm4gbn0sQS5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSxBLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSxBLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSxBLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LEEucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sQS5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Syh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOyluKz10aGlzW3Qrb10qaTtyZXR1cm4gbj49KGkqPTEyOCkmJihuLT1NYXRoLnBvdygyLDgqZSkpLG59LEEucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEsodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49ZSxpPTEsbz10aGlzW3QrLS1uXTtuPjAmJihpKj0yNTYpOylvKz10aGlzW3QrLS1uXSppO3JldHVybiBvPj0oaSo9MTI4KSYmKG8tPU1hdGgucG93KDIsOCplKSksb30sQS5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPy0xKigyNTUtdGhpc1t0XSsxKTp0aGlzW3RdfSxBLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fEsodCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sQS5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxlKXtlfHxLKHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LEEucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LEEucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LEEucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSx3KHRoaXMsdCwhMCwyMyw0KX0sQS5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDQsdGhpcy5sZW5ndGgpLHcodGhpcyx0LCExLDIzLDQpfSxBLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDgsdGhpcy5sZW5ndGgpLHcodGhpcyx0LCEwLDUyLDgpfSxBLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDgsdGhpcy5sZW5ndGgpLHcodGhpcyx0LCExLDUyLDgpfSxBLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbih0LGUscixuKXsodD0rdCxlfD0wLHJ8PTAsbil8fFoodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT0xLG89MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKGkqPTI1Nik7KXRoaXNbZStvXT10L2kmMjU1O3JldHVybiBlK3J9LEEucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQsZSxyLG4peyh0PSt0LGV8PTAscnw9MCxuKXx8Wih0aGlzLHQsZSxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPXItMSxvPTE7Zm9yKHRoaXNbZStpXT0yNTUmdDstLWk+PTAmJihvKj0yNTYpOyl0aGlzW2UraV09dC9vJjI1NTtyZXR1cm4gZStyfSxBLnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMSwyNTUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0aGlzW2VdPTI1NSZ0LGUrMX0sQS5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDIsNjU1MzUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6USh0aGlzLHQsZSwhMCksZSsyfSxBLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMiw2NTUzNSwwKSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpRKHRoaXMsdCxlLCExKSxlKzJ9LEEucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2UrM109dD4+PjI0LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZV09MjU1JnQpOlgodGhpcyx0LGUsITApLGUrNH0sQS5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6WCh0aGlzLHQsZSwhMSksZSs0fSxBLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7Wih0aGlzLHQsZSxyLGktMSwtaSl9dmFyIG89MCxzPTEsYT0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxyJiYocyo9MjU2KTspdDwwJiYwPT09YSYmMCE9PXRoaXNbZStvLTFdJiYoYT0xKSx0aGlzW2Urb109KHQvcz4+MCktYSYyNTU7cmV0dXJuIGUrcn0sQS5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO1oodGhpcyx0LGUscixpLTEsLWkpfXZhciBvPXItMSxzPTEsYT0wO2Zvcih0aGlzW2Urb109MjU1JnQ7LS1vPj0wJiYocyo9MjU2KTspdDwwJiYwPT09YSYmMCE9PXRoaXNbZStvKzFdJiYoYT0xKSx0aGlzW2Urb109KHQvcz4+MCktYSYyNTU7cmV0dXJuIGUrcn0sQS5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMSwxMjcsLTEyOCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0PDAmJih0PTI1NSt0KzEpLHRoaXNbZV09MjU1JnQsZSsxfSxBLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6USh0aGlzLHQsZSwhMCksZSsyfSxBLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6USh0aGlzLHQsZSwhMSksZSsyfSxBLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrM109dD4+PjI0KTpYKHRoaXMsdCxlLCEwKSxlKzR9LEEucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdDwwJiYodD00Mjk0OTY3Mjk1K3QrMSksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOlgodGhpcyx0LGUsITEpLGUrNH0sQS5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZXQodGhpcyx0LGUsITAscil9LEEucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGV0KHRoaXMsdCxlLCExLHIpfSxBLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcnQodGhpcyx0LGUsITAscil9LEEucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBydCh0aGlzLHQsZSwhMSxyKX0sQS5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLGU+PXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8bi1yJiYobj10Lmxlbmd0aC1lK3IpO3ZhciBpLG89bi1yO2lmKHRoaXM9PT10JiZyPGUmJmU8bilmb3IoaT1vLTE7aT49MDstLWkpdFtpK2VdPXRoaXNbaStyXTtlbHNlIGlmKG88MWUzfHwhQS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxvOysraSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KHIscitvKSxlKTtyZXR1cm4gb30sQS5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LGUscixuKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZT8obj1lLGU9MCxyPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIHImJihuPXIscj10aGlzLmxlbmd0aCksMT09PXQubGVuZ3RoKXt2YXIgaT10LmNoYXJDb2RlQXQoMCk7aTwyNTYmJih0PWkpfWlmKHZvaWQgMCE9PW4mJiJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYhQS5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQmPTI1NSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD1lKXJldHVybiB0aGlzO3ZhciBvO2lmKGU+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsdHx8KHQ9MCksIm51bWJlciI9PXR5cGVvZiB0KWZvcihvPWU7bzxyOysrbyl0aGlzW29dPXQ7ZWxzZXt2YXIgcz1QKHQpP3Q6b3QobmV3IEEodCxuKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihvPTA7bzxyLWU7KytvKXRoaXNbbytlXT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciBudD0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBpdCh0KXtyZXR1cm4gdDwxNj8iMCIrdC50b1N0cmluZygxNik6dC50b1N0cmluZygxNil9ZnVuY3Rpb24gb3QodCxlKXt2YXIgcjtlPWV8fDEvMDtmb3IodmFyIG49dC5sZW5ndGgsaT1udWxsLG89W10scz0wO3M8bjsrK3Mpe2lmKChyPXQuY2hhckNvZGVBdChzKSk+NTUyOTUmJnI8NTczNDQpe2lmKCFpKXtpZihyPjU2MzE5KXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09bil7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9cjtjb250aW51ZX1pZihyPDU2MzIwKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT1yO2NvbnRpbnVlfXI9NjU1MzYrKGktNTUyOTY8PDEwfHItNTYzMjApfWVsc2UgaSYmKGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCxyPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7by5wdXNoKHIpfWVsc2UgaWYocjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztvLnB1c2gocj4+NnwxOTIsNjMmcnwxMjgpfWVsc2UgaWYocjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7by5wdXNoKHI+PjEyfDIyNCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9ZWxzZXtpZighKHI8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztvLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIHN0KHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZSxyLG4saSxvLHM7eXx8digpO3ZhciBhPXQubGVuZ3RoO2lmKGElND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO289Ij0iPT09dFthLTJdPzI6Ij0iPT09dFthLTFdPzE6MCxzPW5ldyBnKDMqYS80LW8pLG49bz4wP2EtNDphO3ZhciB1PTA7Zm9yKGU9MCxyPTA7ZTxuO2UrPTQscis9MylpPWRbdC5jaGFyQ29kZUF0KGUpXTw8MTh8ZFt0LmNoYXJDb2RlQXQoZSsxKV08PDEyfGRbdC5jaGFyQ29kZUF0KGUrMildPDw2fGRbdC5jaGFyQ29kZUF0KGUrMyldLHNbdSsrXT1pPj4xNiYyNTUsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9ZFt0LmNoYXJDb2RlQXQoZSldPDwyfGRbdC5jaGFyQ29kZUF0KGUrMSldPj40LHNbdSsrXT0yNTUmaSk6MT09PW8mJihpPWRbdC5jaGFyQ29kZUF0KGUpXTw8MTB8ZFt0LmNoYXJDb2RlQXQoZSsxKV08PDR8ZFt0LmNoYXJDb2RlQXQoZSsyKV0+PjIsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaSksc30oZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZShudCwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7dC5sZW5ndGglNCE9MDspdCs9Ij0iO3JldHVybiB0fSh0KSl9ZnVuY3Rpb24gYXQodCxlLHIsbil7Zm9yKHZhciBpPTA7aTxuJiYhKGkrcj49ZS5sZW5ndGh8fGk+PXQubGVuZ3RoKTsrK2kpZVtpK3JdPXRbaV07cmV0dXJuIGl9ZnVuY3Rpb24gdXQodCl7cmV0dXJuISF0LmNvbnN0cnVjdG9yJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih0KX1mdW5jdGlvbiBodCgpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGZ0KCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX12YXIgY3Q9aHQsbHQ9ZnQ7ZnVuY3Rpb24gcHQodCl7aWYoY3Q9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KHQsMCk7aWYoKGN0PT09aHR8fCFjdCkmJnNldFRpbWVvdXQpcmV0dXJuIGN0PXNldFRpbWVvdXQsc2V0VGltZW91dCh0LDApO3RyeXtyZXR1cm4gY3QodCwwKX1jYXRjaChlKXt0cnl7cmV0dXJuIGN0LmNhbGwobnVsbCx0LDApfWNhdGNoKGUpe3JldHVybiBjdC5jYWxsKHRoaXMsdCwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiBsLnNldFRpbWVvdXQmJihjdD1zZXRUaW1lb3V0KSwiZnVuY3Rpb24iPT10eXBlb2YgbC5jbGVhclRpbWVvdXQmJihsdD1jbGVhclRpbWVvdXQpO3ZhciBkdCxndD1bXSx5dD0hMSx2dD0tMTtmdW5jdGlvbiBidCgpe3l0JiZkdCYmKHl0PSExLGR0Lmxlbmd0aD9ndD1kdC5jb25jYXQoZ3QpOnZ0PS0xLGd0Lmxlbmd0aCYmbXQoKSl9ZnVuY3Rpb24gbXQoKXtpZigheXQpe3ZhciB0PXB0KGJ0KTt5dD0hMDtmb3IodmFyIGU9Z3QubGVuZ3RoO2U7KXtmb3IoZHQ9Z3QsZ3Q9W107Kyt2dDxlOylkdCYmZHRbdnRdLnJ1bigpO3Z0PS0xLGU9Z3QubGVuZ3RofWR0PW51bGwseXQ9ITEsZnVuY3Rpb24odCl7aWYobHQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dCh0KTtpZigobHQ9PT1mdHx8IWx0KSYmY2xlYXJUaW1lb3V0KXJldHVybiBsdD1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KHQpO3RyeXtsdCh0KX1jYXRjaChlKXt0cnl7cmV0dXJuIGx0LmNhbGwobnVsbCx0KX1jYXRjaChlKXtyZXR1cm4gbHQuY2FsbCh0aGlzLHQpfX19KHQpfX1mdW5jdGlvbiB3dCh0KXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllW3ItMV09YXJndW1lbnRzW3JdO2d0LnB1c2gobmV3IF90KHQsZSkpLDEhPT1ndC5sZW5ndGh8fHl0fHxwdChtdCl9ZnVuY3Rpb24gX3QodCxlKXt0aGlzLmZ1bj10LHRoaXMuYXJyYXk9ZX1fdC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07ZnVuY3Rpb24gU3QoKXt9dmFyIEV0PVN0LGt0PVN0LFJ0PVN0LEF0PVN0LFR0PVN0LE90PVN0LGp0PVN0O3ZhciBMdD1sLnBlcmZvcm1hbmNlfHx7fSxDdD1MdC5ub3d8fEx0Lm1vek5vd3x8THQubXNOb3d8fEx0Lm9Ob3d8fEx0LndlYmtpdE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIFB0PW5ldyBEYXRlO3ZhciBNdCxCdD17bmV4dFRpY2s6d3QsdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjpFdCxhZGRMaXN0ZW5lcjprdCxvbmNlOlJ0LG9mZjpBdCxyZW1vdmVMaXN0ZW5lcjpUdCxyZW1vdmVBbGxMaXN0ZW5lcnM6T3QsZW1pdDpqdCxiaW5kaW5nOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24odCl7dmFyIGU9LjAwMSpDdC5jYWxsKEx0KSxyPU1hdGguZmxvb3IoZSksbj1NYXRoLmZsb29yKGUlMSoxZTkpO3JldHVybiB0JiYoci09dFswXSwobi09dFsxXSk8MCYmKHItLSxuKz0xZTkpKSxbcixuXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1QdCkvMWUzfX07TXQ9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTpmdW5jdGlvbih0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9O3ZhciB4dD1NdCxVdD0vJVtzZGolXS9nO2Z1bmN0aW9uIEl0KHQpe2lmKCFWdCh0KSl7Zm9yKHZhciBlPVtdLHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWUucHVzaCh6dChhcmd1bWVudHNbcl0pKTtyZXR1cm4gZS5qb2luKCIgIil9cj0xO2Zvcih2YXIgbj1hcmd1bWVudHMsaT1uLmxlbmd0aCxvPVN0cmluZyh0KS5yZXBsYWNlKFV0LChmdW5jdGlvbih0KXtpZigiJSUiPT09dClyZXR1cm4iJSI7aWYocj49aSlyZXR1cm4gdDtzd2l0Y2godCl7Y2FzZSIlcyI6cmV0dXJuIFN0cmluZyhuW3IrK10pO2Nhc2UiJWQiOnJldHVybiBOdW1iZXIobltyKytdKTtjYXNlIiVqIjp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG5bcisrXSl9Y2F0Y2godCl7cmV0dXJuIltDaXJjdWxhcl0ifWRlZmF1bHQ6cmV0dXJuIHR9fSkpLHM9bltyXTtyPGk7cz1uWysrcl0pSHQocyl8fCFRdChzKT9vKz0iICIrczpvKz0iICIrenQocyk7cmV0dXJuIG99ZnVuY3Rpb24gRHQodCxlKXtpZihLdChsLnByb2Nlc3MpKXJldHVybiBmdW5jdGlvbigpe3JldHVybiBEdCh0LGUpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07aWYoITA9PT1CdC5ub0RlcHJlY2F0aW9uKXJldHVybiB0O3ZhciByPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFyKXtpZihCdC50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihlKTtCdC50cmFjZURlcHJlY2F0aW9uP2NvbnNvbGUudHJhY2UoZSk6Y29uc29sZS5lcnJvcihlKSxyPSEwfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19dmFyIE50LEZ0PXt9O2Z1bmN0aW9uIHp0KHQsZSl7dmFyIHI9e3NlZW46W10sc3R5bGl6ZTpZdH07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+PTMmJihyLmRlcHRoPWFyZ3VtZW50c1syXSksYXJndW1lbnRzLmxlbmd0aD49NCYmKHIuY29sb3JzPWFyZ3VtZW50c1szXSksSnQoZSk/ci5zaG93SGlkZGVuPWU6ZSYmbmUocixlKSxLdChyLnNob3dIaWRkZW4pJiYoci5zaG93SGlkZGVuPSExKSxLdChyLmRlcHRoKSYmKHIuZGVwdGg9MiksS3Qoci5jb2xvcnMpJiYoci5jb2xvcnM9ITEpLEt0KHIuY3VzdG9tSW5zcGVjdCkmJihyLmN1c3RvbUluc3BlY3Q9ITApLHIuY29sb3JzJiYoci5zdHlsaXplPXF0KSxXdChyLHQsci5kZXB0aCl9ZnVuY3Rpb24gcXQodCxlKXt2YXIgcj16dC5zdHlsZXNbZV07cmV0dXJuIHI/IhtbIit6dC5jb2xvcnNbcl1bMF0rIm0iK3QrIhtbIit6dC5jb2xvcnNbcl1bMV0rIm0iOnR9ZnVuY3Rpb24gWXQodCxlKXtyZXR1cm4gdH1mdW5jdGlvbiBXdCh0LGUscil7aWYodC5jdXN0b21JbnNwZWN0JiZlJiZlZShlLmluc3BlY3QpJiZlLmluc3BlY3QhPT16dCYmKCFlLmNvbnN0cnVjdG9yfHxlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PWUpKXt2YXIgbj1lLmluc3BlY3Qocix0KTtyZXR1cm4gVnQobil8fChuPVd0KHQsbixyKSksbn12YXIgaT1mdW5jdGlvbih0LGUpe2lmKEt0KGUpKXJldHVybiB0LnN0eWxpemUoInVuZGVmaW5lZCIsInVuZGVmaW5lZCIpO2lmKFZ0KGUpKXt2YXIgcj0iJyIrSlNPTi5zdHJpbmdpZnkoZSkucmVwbGFjZSgvXiJ8IiQvZywiIikucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpKyInIjtyZXR1cm4gdC5zdHlsaXplKHIsInN0cmluZyIpfWlmKG49ZSwibnVtYmVyIj09dHlwZW9mIG4pcmV0dXJuIHQuc3R5bGl6ZSgiIitlLCJudW1iZXIiKTt2YXIgbjtpZihKdChlKSlyZXR1cm4gdC5zdHlsaXplKCIiK2UsImJvb2xlYW4iKTtpZihIdChlKSlyZXR1cm4gdC5zdHlsaXplKCJudWxsIiwibnVsbCIpfSh0LGUpO2lmKGkpcmV0dXJuIGk7dmFyIG89T2JqZWN0LmtleXMoZSkscz1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2VbdF09ITB9KSksZX0obyk7aWYodC5zaG93SGlkZGVuJiYobz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSksdGUoZSkmJihvLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8by5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4gJHQoZSk7aWYoMD09PW8ubGVuZ3RoKXtpZihlZShlKSl7dmFyIGE9ZS5uYW1lPyI6ICIrZS5uYW1lOiIiO3JldHVybiB0LnN0eWxpemUoIltGdW5jdGlvbiIrYSsiXSIsInNwZWNpYWwiKX1pZihadChlKSlyZXR1cm4gdC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwicmVnZXhwIik7aWYoWHQoZSkpcmV0dXJuIHQuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJkYXRlIik7aWYodGUoZSkpcmV0dXJuICR0KGUpfXZhciB1LGgsZj0iIixjPSExLGw9WyJ7IiwifSJdOyh1PWUsQXJyYXkuaXNBcnJheSh1KSYmKGM9ITAsbD1bIlsiLCJdIl0pLGVlKGUpKSYmKGY9IiBbRnVuY3Rpb24iKyhlLm5hbWU/IjogIitlLm5hbWU6IiIpKyJdIik7cmV0dXJuIFp0KGUpJiYoZj0iICIrUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKSxYdChlKSYmKGY9IiAiK0RhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwoZSkpLHRlKGUpJiYoZj0iICIrJHQoZSkpLDAhPT1vLmxlbmd0aHx8YyYmMCE9ZS5sZW5ndGg/cjwwP1p0KGUpP3Quc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksInJlZ2V4cCIpOnQuc3R5bGl6ZSgiW09iamVjdF0iLCJzcGVjaWFsIik6KHQuc2Vlbi5wdXNoKGUpLGg9Yz9mdW5jdGlvbih0LGUscixuLGkpe2Zvcih2YXIgbz1bXSxzPTAsYT1lLmxlbmd0aDtzPGE7KytzKWllKGUsU3RyaW5nKHMpKT9vLnB1c2goR3QodCxlLHIsbixTdHJpbmcocyksITApKTpvLnB1c2goIiIpO3JldHVybiBpLmZvckVhY2goKGZ1bmN0aW9uKGkpe2kubWF0Y2goL15cZCskLyl8fG8ucHVzaChHdCh0LGUscixuLGksITApKX0pKSxvfSh0LGUscixzLG8pOm8ubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gR3QodCxlLHIscyxuLGMpfSkpLHQuc2Vlbi5wb3AoKSxmdW5jdGlvbih0LGUscil7aWYodC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiXG4iKSx0K2UucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKT42MClyZXR1cm4gclswXSsoIiI9PT1lPyIiOmUrIlxuICIpKyIgIit0LmpvaW4oIixcbiAgIikrIiAiK3JbMV07cmV0dXJuIHJbMF0rZSsiICIrdC5qb2luKCIsICIpKyIgIityWzFdfShoLGYsbCkpOmxbMF0rZitsWzFdfWZ1bmN0aW9uICR0KHQpe3JldHVybiJbIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSsiXSJ9ZnVuY3Rpb24gR3QodCxlLHIsbixpLG8pe3ZhciBzLGEsdTtpZigodT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsaSl8fHt2YWx1ZTplW2ldfSkuZ2V0P2E9dS5zZXQ/dC5zdHlsaXplKCJbR2V0dGVyL1NldHRlcl0iLCJzcGVjaWFsIik6dC5zdHlsaXplKCJbR2V0dGVyXSIsInNwZWNpYWwiKTp1LnNldCYmKGE9dC5zdHlsaXplKCJbU2V0dGVyXSIsInNwZWNpYWwiKSksaWUobixpKXx8KHM9IlsiK2krIl0iKSxhfHwodC5zZWVuLmluZGV4T2YodS52YWx1ZSk8MD8oYT1IdChyKT9XdCh0LHUudmFsdWUsbnVsbCk6V3QodCx1LnZhbHVlLHItMSkpLmluZGV4T2YoIlxuIik+LTEmJihhPW8/YS5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIgICIrdH0pKS5qb2luKCJcbiIpLnN1YnN0cigyKToiXG4iK2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iICAgIit0fSkpLmpvaW4oIlxuIikpOmE9dC5zdHlsaXplKCJbQ2lyY3VsYXJdIiwic3BlY2lhbCIpKSxLdChzKSl7aWYobyYmaS5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gYTsocz1KU09OLnN0cmluZ2lmeSgiIitpKSkubWF0Y2goL14iKFthLXpBLVpfXVthLXpBLVpfMC05XSopIiQvKT8ocz1zLnN1YnN0cigxLHMubGVuZ3RoLTIpLHM9dC5zdHlsaXplKHMsIm5hbWUiKSk6KHM9cy5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIikscz10LnN0eWxpemUocywic3RyaW5nIikpfXJldHVybiBzKyI6ICIrYX1mdW5jdGlvbiBKdCh0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIEh0KHQpe3JldHVybiBudWxsPT09dH1mdW5jdGlvbiBWdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9ZnVuY3Rpb24gS3QodCl7cmV0dXJuIHZvaWQgMD09PXR9ZnVuY3Rpb24gWnQodCl7cmV0dXJuIFF0KHQpJiYiW29iamVjdCBSZWdFeHBdIj09PXJlKHQpfWZ1bmN0aW9uIFF0KHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXR9ZnVuY3Rpb24gWHQodCl7cmV0dXJuIFF0KHQpJiYiW29iamVjdCBEYXRlXSI9PT1yZSh0KX1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gUXQodCkmJigiW29iamVjdCBFcnJvcl0iPT09cmUodCl8fHQgaW5zdGFuY2VvZiBFcnJvcil9ZnVuY3Rpb24gZWUodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gcmUodCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBuZSh0LGUpe2lmKCFlfHwhUXQoZSkpcmV0dXJuIHQ7Zm9yKHZhciByPU9iamVjdC5rZXlzKGUpLG49ci5sZW5ndGg7bi0tOyl0W3Jbbl1dPWVbcltuXV07cmV0dXJuIHR9ZnVuY3Rpb24gaWUodCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9ZnVuY3Rpb24gb2UoKXt0aGlzLmhlYWQ9bnVsbCx0aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfXp0LmNvbG9ycz17Ym9sZDpbMSwyMl0saXRhbGljOlszLDIzXSx1bmRlcmxpbmU6WzQsMjRdLGludmVyc2U6WzcsMjddLHdoaXRlOlszNywzOV0sZ3JleTpbOTAsMzldLGJsYWNrOlszMCwzOV0sYmx1ZTpbMzQsMzldLGN5YW46WzM2LDM5XSxncmVlbjpbMzIsMzldLG1hZ2VudGE6WzM1LDM5XSxyZWQ6WzMxLDM5XSx5ZWxsb3c6WzMzLDM5XX0senQuc3R5bGVzPXtzcGVjaWFsOiJjeWFuIixudW1iZXI6InllbGxvdyIsYm9vbGVhbjoieWVsbG93Iix1bmRlZmluZWQ6ImdyZXkiLG51bGw6ImJvbGQiLHN0cmluZzoiZ3JlZW4iLGRhdGU6Im1hZ2VudGEiLHJlZ2V4cDoicmVkIn0sb2UucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9ZTp0aGlzLmhlYWQ9ZSx0aGlzLnRhaWw9ZSwrK3RoaXMubGVuZ3RofSxvZS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6dGhpcy5oZWFkfTswPT09dGhpcy5sZW5ndGgmJih0aGlzLnRhaWw9ZSksdGhpcy5oZWFkPWUsKyt0aGlzLmxlbmd0aH0sb2UucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX0sb2UucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9LG9lLnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4iIjtmb3IodmFyIGU9dGhpcy5oZWFkLHI9IiIrZS5kYXRhO2U9ZS5uZXh0OylyKz10K2UuZGF0YTtyZXR1cm4gcn0sb2UucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIEEuYWxsb2MoMCk7aWYoMT09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzLmhlYWQuZGF0YTtmb3IodmFyIGU9QS5hbGxvY1Vuc2FmZSh0Pj4+MCkscj10aGlzLmhlYWQsbj0wO3I7KXIuZGF0YS5jb3B5KGUsbiksbis9ci5kYXRhLmxlbmd0aCxyPXIubmV4dDtyZXR1cm4gZX07dmFyIHNlPUEuaXNFbmNvZGluZ3x8ZnVuY3Rpb24odCl7c3dpdGNoKHQmJnQudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6Y2FzZSJyYXciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtmdW5jdGlvbiBhZSh0KXtzd2l0Y2godGhpcy5lbmNvZGluZz0odHx8InV0ZjgiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLCIiKSxmdW5jdGlvbih0KXtpZih0JiYhc2UodCkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpfSh0KSx0aGlzLmVuY29kaW5nKXtjYXNlInV0ZjgiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zO2JyZWFrO2Nhc2UidWNzMiI6Y2FzZSJ1dGYxNmxlIjp0aGlzLnN1cnJvZ2F0ZVNpemU9Mix0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPWhlO2JyZWFrO2Nhc2UiYmFzZTY0Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9Myx0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPWZlO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHZvaWQodGhpcy53cml0ZT11ZSl9dGhpcy5jaGFyQnVmZmVyPW5ldyBBKDYpLHRoaXMuY2hhclJlY2VpdmVkPTAsdGhpcy5jaGFyTGVuZ3RoPTB9ZnVuY3Rpb24gdWUodCl7cmV0dXJuIHQudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gaGUodCl7dGhpcy5jaGFyUmVjZWl2ZWQ9dC5sZW5ndGglMix0aGlzLmNoYXJMZW5ndGg9dGhpcy5jaGFyUmVjZWl2ZWQ/MjowfWZ1bmN0aW9uIGZlKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTMsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzM6MH1hZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSIiO3RoaXMuY2hhckxlbmd0aDspe3ZhciByPXQubGVuZ3RoPj10aGlzLmNoYXJMZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQ/dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkOnQubGVuZ3RoO2lmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsdGhpcy5jaGFyUmVjZWl2ZWQsMCxyKSx0aGlzLmNoYXJSZWNlaXZlZCs9cix0aGlzLmNoYXJSZWNlaXZlZDx0aGlzLmNoYXJMZW5ndGgpcmV0dXJuIiI7aWYodD10LnNsaWNlKHIsdC5sZW5ndGgpLCEoKGk9KGU9dGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKSkuY2hhckNvZGVBdChlLmxlbmd0aC0xKSk+PTU1Mjk2JiZpPD01NjMxOSkpe2lmKHRoaXMuY2hhclJlY2VpdmVkPXRoaXMuY2hhckxlbmd0aD0wLDA9PT10Lmxlbmd0aClyZXR1cm4gZTticmVha310aGlzLmNoYXJMZW5ndGgrPXRoaXMuc3Vycm9nYXRlU2l6ZSxlPSIifXRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIodCk7dmFyIG49dC5sZW5ndGg7dGhpcy5jaGFyTGVuZ3RoJiYodC5jb3B5KHRoaXMuY2hhckJ1ZmZlciwwLHQubGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkLG4pLG4tPXRoaXMuY2hhclJlY2VpdmVkKTt2YXIgaTtuPShlKz10LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCxuKSkubGVuZ3RoLTE7aWYoKGk9ZS5jaGFyQ29kZUF0KG4pKT49NTUyOTYmJmk8PTU2MzE5KXt2YXIgbz10aGlzLnN1cnJvZ2F0ZVNpemU7cmV0dXJuIHRoaXMuY2hhckxlbmd0aCs9byx0aGlzLmNoYXJSZWNlaXZlZCs9byx0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsbywwLG8pLHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCwwLG8pLGUuc3Vic3RyaW5nKDAsbil9cmV0dXJuIGV9LGFlLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGg+PTM/Mzp0Lmxlbmd0aDtlPjA7ZS0tKXt2YXIgcj10W3QubGVuZ3RoLWVdO2lmKDE9PWUmJnI+PjU9PTYpe3RoaXMuY2hhckxlbmd0aD0yO2JyZWFrfWlmKGU8PTImJnI+PjQ9PTE0KXt0aGlzLmNoYXJMZW5ndGg9MzticmVha31pZihlPD0zJiZyPj4zPT0zMCl7dGhpcy5jaGFyTGVuZ3RoPTQ7YnJlYWt9fXRoaXMuY2hhclJlY2VpdmVkPWV9LGFlLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCl7dmFyIGU9IiI7aWYodCYmdC5sZW5ndGgmJihlPXRoaXMud3JpdGUodCkpLHRoaXMuY2hhclJlY2VpdmVkKXt2YXIgcj10aGlzLmNoYXJSZWNlaXZlZCxuPXRoaXMuY2hhckJ1ZmZlcixpPXRoaXMuZW5jb2Rpbmc7ZSs9bi5zbGljZSgwLHIpLnRvU3RyaW5nKGkpfXJldHVybiBlfSxwZS5SZWFkYWJsZVN0YXRlPWxlO3ZhciBjZT1mdW5jdGlvbih0KXtpZihLdChOdCkmJihOdD1CdC5lbnYuTk9ERV9ERUJVR3x8IiIpLHQ9dC50b1VwcGVyQ2FzZSgpLCFGdFt0XSlpZihuZXcgUmVnRXhwKCJcXGIiK3QrIlxcYiIsImkiKS50ZXN0KE50KSl7RnRbdF09ZnVuY3Rpb24oKXt2YXIgZT1JdC5hcHBseShudWxsLGFyZ3VtZW50cyk7Y29uc29sZS5lcnJvcigiJXMgJWQ6ICVzIix0LDAsZSl9fWVsc2UgRnRbdF09ZnVuY3Rpb24oKXt9O3JldHVybiBGdFt0XX0oInN0cmVhbSIpO2Z1bmN0aW9uIGxlKHQsZSl7dD10fHx7fSx0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsZSBpbnN0YW5jZW9mIEZlJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LnJlYWRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLG49dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1yfHwwPT09cj9yOm4sdGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrLHRoaXMuYnVmZmVyPW5ldyBvZSx0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLnJhbk91dD0hMSx0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCx0LmVuY29kaW5nJiYodGhpcy5kZWNvZGVyPW5ldyBhZSh0LmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPXQuZW5jb2RpbmcpfWZ1bmN0aW9uIHBlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHBlKSlyZXR1cm4gbmV3IHBlKHQpO3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IGxlKHQsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCx0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYodGhpcy5fcmVhZD10LnJlYWQpLGUuY2FsbCh0aGlzKX1mdW5jdGlvbiBkZSh0LGUscixuLGkpe3ZhciBvPWZ1bmN0aW9uKHQsZSl7dmFyIHI9bnVsbDtBLmlzQnVmZmVyKGUpfHwic3RyaW5nIj09dHlwZW9mIGV8fG51bGw9PWV8fHQub2JqZWN0TW9kZXx8KHI9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKTtyZXR1cm4gcn0oZSxyKTtpZihvKXQuZW1pdCgiZXJyb3IiLG8pO2Vsc2UgaWYobnVsbD09PXIpZS5yZWFkaW5nPSExLGZ1bmN0aW9uKHQsZSl7aWYoZS5lbmRlZClyZXR1cm47aWYoZS5kZWNvZGVyKXt2YXIgcj1lLmRlY29kZXIuZW5kKCk7ciYmci5sZW5ndGgmJihlLmJ1ZmZlci5wdXNoKHIpLGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aCl9ZS5lbmRlZD0hMCx5ZSh0KX0odCxlKTtlbHNlIGlmKGUub2JqZWN0TW9kZXx8ciYmci5sZW5ndGg+MClpZihlLmVuZGVkJiYhaSl7dmFyIHM9bmV3IEVycm9yKCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpO3QuZW1pdCgiZXJyb3IiLHMpfWVsc2UgaWYoZS5lbmRFbWl0dGVkJiZpKXt2YXIgYT1uZXcgRXJyb3IoInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Iik7dC5lbWl0KCJlcnJvciIsYSl9ZWxzZXt2YXIgdTshZS5kZWNvZGVyfHxpfHxufHwocj1lLmRlY29kZXIud3JpdGUociksdT0hZS5vYmplY3RNb2RlJiYwPT09ci5sZW5ndGgpLGl8fChlLnJlYWRpbmc9ITEpLHV8fChlLmZsb3dpbmcmJjA9PT1lLmxlbmd0aCYmIWUuc3luYz8odC5lbWl0KCJkYXRhIixyKSx0LnJlYWQoMCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgsaT9lLmJ1ZmZlci51bnNoaWZ0KHIpOmUuYnVmZmVyLnB1c2gociksZS5uZWVkUmVhZGFibGUmJnllKHQpKSksZnVuY3Rpb24odCxlKXtlLnJlYWRpbmdNb3JlfHwoZS5yZWFkaW5nTW9yZT0hMCx3dChiZSx0LGUpKX0odCxlKX1lbHNlIGl8fChlLnJlYWRpbmc9ITEpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hdC5lbmRlZCYmKHQubmVlZFJlYWRhYmxlfHx0Lmxlbmd0aDx0LmhpZ2hXYXRlck1hcmt8fDA9PT10Lmxlbmd0aCl9KGUpfXh0KHBlLGUpLHBlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gci5vYmplY3RNb2RlfHwic3RyaW5nIiE9dHlwZW9mIHR8fChlPWV8fHIuZGVmYXVsdEVuY29kaW5nKSE9PXIuZW5jb2RpbmcmJih0PUEuZnJvbSh0LGUpLGU9IiIpLGRlKHRoaXMscix0LGUsITEpfSxwZS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4gZGUodGhpcyx0aGlzLl9yZWFkYWJsZVN0YXRlLHQsIiIsITApfSxwZS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30scGUucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9bmV3IGFlKHQpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2Rpbmc9dCx0aGlzfTtmdW5jdGlvbiBnZSh0LGUpe3JldHVybiB0PD0wfHwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/MDplLm9iamVjdE1vZGU/MTp0IT10P2UuZmxvd2luZyYmZS5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDplLmxlbmd0aDoodD5lLmhpZ2hXYXRlck1hcmsmJihlLmhpZ2hXYXRlck1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTgzODg2MDg/dD04Mzg4NjA4Oih0LS0sdHw9dD4+PjEsdHw9dD4+PjIsdHw9dD4+PjQsdHw9dD4+PjgsdHw9dD4+PjE2LHQrKyksdH0odCkpLHQ8PWUubGVuZ3RoP3Q6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIHllKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7ZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fChjZSgiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz93dCh2ZSx0KTp2ZSh0KSl9ZnVuY3Rpb24gdmUodCl7Y2UoImVtaXQgcmVhZGFibGUiKSx0LmVtaXQoInJlYWRhYmxlIiksX2UodCl9ZnVuY3Rpb24gYmUodCxlKXtmb3IodmFyIHI9ZS5sZW5ndGg7IWUucmVhZGluZyYmIWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyayYmKGNlKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxyIT09ZS5sZW5ndGgpOylyPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gbWUodCl7Y2UoInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLHQucmVhZCgwKX1mdW5jdGlvbiB3ZSh0LGUpe2UucmVhZGluZ3x8KGNlKCJyZXN1bWUgcmVhZCAwIiksdC5yZWFkKDApKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxlLmF3YWl0RHJhaW49MCx0LmVtaXQoInJlc3VtZSIpLF9lKHQpLGUuZmxvd2luZyYmIWUucmVhZGluZyYmdC5yZWFkKDApfWZ1bmN0aW9uIF9lKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKGNlKCJmbG93IixlLmZsb3dpbmcpO2UuZmxvd2luZyYmbnVsbCE9PXQucmVhZCgpOyk7fWZ1bmN0aW9uIFNlKHQsZSl7cmV0dXJuIDA9PT1lLmxlbmd0aD9udWxsOihlLm9iamVjdE1vZGU/cj1lLmJ1ZmZlci5zaGlmdCgpOiF0fHx0Pj1lLmxlbmd0aD8ocj1lLmRlY29kZXI/ZS5idWZmZXIuam9pbigiIik6MT09PWUuYnVmZmVyLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGE6ZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSxlLmJ1ZmZlci5jbGVhcigpKTpyPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbjt0PGUuaGVhZC5kYXRhLmxlbmd0aD8obj1lLmhlYWQuZGF0YS5zbGljZSgwLHQpLGUuaGVhZC5kYXRhPWUuaGVhZC5kYXRhLnNsaWNlKHQpKTpuPXQ9PT1lLmhlYWQuZGF0YS5sZW5ndGg/ZS5zaGlmdCgpOnI/ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmhlYWQsbj0xLGk9ci5kYXRhO3QtPWkubGVuZ3RoO2Zvcig7cj1yLm5leHQ7KXt2YXIgbz1yLmRhdGEscz10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYocz09PW8ubGVuZ3RoP2krPW86aSs9by5zbGljZSgwLHQpLDA9PT0odC09cykpe3M9PT1vLmxlbmd0aD8oKytuLHIubmV4dD9lLmhlYWQ9ci5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1yLHIuZGF0YT1vLnNsaWNlKHMpKTticmVha30rK259cmV0dXJuIGUubGVuZ3RoLT1uLGl9KHQsZSk6ZnVuY3Rpb24odCxlKXt2YXIgcj1BLmFsbG9jVW5zYWZlKHQpLG49ZS5oZWFkLGk9MTtuLmRhdGEuY29weShyKSx0LT1uLmRhdGEubGVuZ3RoO2Zvcig7bj1uLm5leHQ7KXt2YXIgbz1uLmRhdGEscz10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoby5jb3B5KHIsci5sZW5ndGgtdCwwLHMpLDA9PT0odC09cykpe3M9PT1vLmxlbmd0aD8oKytpLG4ubmV4dD9lLmhlYWQ9bi5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1uLG4uZGF0YT1vLnNsaWNlKHMpKTticmVha30rK2l9cmV0dXJuIGUubGVuZ3RoLT1pLHJ9KHQsZSk7cmV0dXJuIG59KHQsZS5idWZmZXIsZS5kZWNvZGVyKSxyKTt2YXIgcn1mdW5jdGlvbiBFZSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLHd0KGtlLGUsdCkpfWZ1bmN0aW9uIGtlKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBSZSh0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX1mdW5jdGlvbiBBZSgpe31mdW5jdGlvbiBUZSh0LGUscil7dGhpcy5jaHVuaz10LHRoaXMuZW5jb2Rpbmc9ZSx0aGlzLmNhbGxiYWNrPXIsdGhpcy5uZXh0PW51bGx9ZnVuY3Rpb24gT2UodCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7Z2V0OkR0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSksIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuIil9KSx0PXR8fHt9LHRoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxlIGluc3RhbmNlb2YgRmUmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQud3JpdGFibGVPYmplY3RNb2RlKTt2YXIgcj10LmhpZ2hXYXRlck1hcmssbj10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6bix0aGlzLmhpZ2hXYXRlck1hcms9fn50aGlzLmhpZ2hXYXRlck1hcmssdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExO3ZhciBpPSExPT09dC5kZWNvZGVTdHJpbmdzO3RoaXMuZGVjb2RlU3RyaW5ncz0haSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXIuc3luYyxpPXIud3JpdGVjYjtpZihmdW5jdGlvbih0KXt0LndyaXRpbmc9ITEsdC53cml0ZWNiPW51bGwsdC5sZW5ndGgtPXQud3JpdGVsZW4sdC53cml0ZWxlbj0wfShyKSxlKSFmdW5jdGlvbih0LGUscixuLGkpey0tZS5wZW5kaW5nY2Iscj93dChpLG4pOmkobik7dC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsbil9KHQscixuLGUsaSk7ZWxzZXt2YXIgbz1NZShyKTtvfHxyLmNvcmtlZHx8ci5idWZmZXJQcm9jZXNzaW5nfHwhci5idWZmZXJlZFJlcXVlc3R8fFBlKHQsciksbj93dChDZSx0LHIsbyxpKTpDZSh0LHIsbyxpKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFVlKHRoaXMpfWZ1bmN0aW9uIGplKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGplfHx0aGlzIGluc3RhbmNlb2YgRmUpKXJldHVybiBuZXcgamUodCk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgT2UodCx0aGlzKSx0aGlzLndyaXRhYmxlPSEwLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZSYmKHRoaXMuX3dyaXRlPXQud3JpdGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRldiYmKHRoaXMuX3dyaXRldj10LndyaXRldikpLGUuY2FsbCh0aGlzKX1mdW5jdGlvbiBMZSh0LGUscixuLGksbyxzKXtlLndyaXRlbGVuPW4sZS53cml0ZWNiPXMsZS53cml0aW5nPSEwLGUuc3luYz0hMCxyP3QuX3dyaXRldihpLGUub253cml0ZSk6dC5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIENlKHQsZSxyLG4pe3J8fGZ1bmN0aW9uKHQsZSl7MD09PWUubGVuZ3RoJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHQuZW1pdCgiZHJhaW4iKSl9KHQsZSksZS5wZW5kaW5nY2ItLSxuKCkseGUodCxlKX1mdW5jdGlvbiBQZSh0LGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgcj1lLmJ1ZmZlcmVkUmVxdWVzdDtpZih0Ll93cml0ZXYmJnImJnIubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9cjtmb3IodmFyIHM9MDtyOylpW3NdPXIscj1yLm5leHQscys9MTtMZSh0LGUsITAsZS5sZW5ndGgsaSwiIixvLmZpbmlzaCksZS5wZW5kaW5nY2IrKyxlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCxvLm5leHQ/KGUuY29ya2VkUmVxdWVzdHNGcmVlPW8ubmV4dCxvLm5leHQ9bnVsbCk6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFVlKGUpfWVsc2V7Zm9yKDtyOyl7dmFyIGE9ci5jaHVuayx1PXIuZW5jb2RpbmcsaD1yLmNhbGxiYWNrO2lmKExlKHQsZSwhMSxlLm9iamVjdE1vZGU/MTphLmxlbmd0aCxhLHUsaCkscj1yLm5leHQsZS53cml0aW5nKWJyZWFrfW51bGw9PT1yJiYoZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwpfWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCxlLmJ1ZmZlcmVkUmVxdWVzdD1yLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiBNZSh0KXtyZXR1cm4gdC5lbmRpbmcmJjA9PT10Lmxlbmd0aCYmbnVsbD09PXQuYnVmZmVyZWRSZXF1ZXN0JiYhdC5maW5pc2hlZCYmIXQud3JpdGluZ31mdW5jdGlvbiBCZSh0LGUpe2UucHJlZmluaXNoZWR8fChlLnByZWZpbmlzaGVkPSEwLHQuZW1pdCgicHJlZmluaXNoIikpfWZ1bmN0aW9uIHhlKHQsZSl7dmFyIHI9TWUoZSk7cmV0dXJuIHImJigwPT09ZS5wZW5kaW5nY2I/KEJlKHQsZSksZS5maW5pc2hlZD0hMCx0LmVtaXQoImZpbmlzaCIpKTpCZSh0LGUpKSxyfWZ1bmN0aW9uIFVlKHQpe3ZhciBlPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKHIpe3ZhciBuPWUuZW50cnk7Zm9yKGUuZW50cnk9bnVsbDtuOyl7dmFyIGk9bi5jYWxsYmFjazt0LnBlbmRpbmdjYi0tLGkociksbj1uLm5leHR9dC5jb3JrZWRSZXF1ZXN0c0ZyZWU/dC5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1lOnQuY29ya2VkUmVxdWVzdHNGcmVlPWV9fXBlLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe2NlKCJyZWFkIix0KSx0PXBhcnNlSW50KHQsMTApO3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj10O2lmKDAhPT10JiYoZS5lbWl0dGVkUmVhZGFibGU9ITEpLDA9PT10JiZlLm5lZWRSZWFkYWJsZSYmKGUubGVuZ3RoPj1lLmhpZ2hXYXRlck1hcmt8fGUuZW5kZWQpKXJldHVybiBjZSgicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/RWUodGhpcyk6eWUodGhpcyksbnVsbDtpZigwPT09KHQ9Z2UodCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmRWUodGhpcyksbnVsbDt2YXIgbixpPWUubmVlZFJlYWRhYmxlO3JldHVybiBjZSgibmVlZCByZWFkYWJsZSIsaSksKDA9PT1lLmxlbmd0aHx8ZS5sZW5ndGgtdDxlLmhpZ2hXYXRlck1hcmspJiZjZSgibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLGk9ITApLGUuZW5kZWR8fGUucmVhZGluZz9jZSgicmVhZGluZyBvciBlbmRlZCIsaT0hMSk6aSYmKGNlKCJkbyByZWFkIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCwwPT09ZS5sZW5ndGgmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fCh0PWdlKHIsZSkpKSxudWxsPT09KG49dD4wP1NlKHQsZSk6bnVsbCk/KGUubmVlZFJlYWRhYmxlPSEwLHQ9MCk6ZS5sZW5ndGgtPXQsMD09PWUubGVuZ3RoJiYoZS5lbmRlZHx8KGUubmVlZFJlYWRhYmxlPSEwKSxyIT09dCYmZS5lbmRlZCYmRWUodGhpcykpLG51bGwhPT1uJiZ0aGlzLmVtaXQoImRhdGEiLG4pLG59LHBlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0scGUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2gobi5waXBlc0NvdW50KXtjYXNlIDA6bi5waXBlcz10O2JyZWFrO2Nhc2UgMTpuLnBpcGVzPVtuLnBpcGVzLHRdO2JyZWFrO2RlZmF1bHQ6bi5waXBlcy5wdXNoKHQpfW4ucGlwZXNDb3VudCs9MSxjZSgicGlwZSBjb3VudD0lZCBvcHRzPSVqIixuLnBpcGVzQ291bnQsZSk7dmFyIGk9IWV8fCExIT09ZS5lbmQ/czpoO2Z1bmN0aW9uIG8odCl7Y2UoIm9udW5waXBlIiksdD09PXImJmgoKX1mdW5jdGlvbiBzKCl7Y2UoIm9uZW5kIiksdC5lbmQoKX1uLmVuZEVtaXR0ZWQ/d3QoaSk6ci5vbmNlKCJlbmQiLGkpLHQub24oInVucGlwZSIsbyk7dmFyIGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtjZSgicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZ0Lmxpc3RlbmVycygiZGF0YSIpLmxlbmd0aCYmKGUuZmxvd2luZz0hMCxfZSh0KSl9fShyKTt0Lm9uKCJkcmFpbiIsYSk7dmFyIHU9ITE7ZnVuY3Rpb24gaCgpe2NlKCJjbGVhbnVwIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZCksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLGEpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSx0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLG8pLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIscyksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixoKSxyLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixjKSx1PSEwLCFuLmF3YWl0RHJhaW58fHQuX3dyaXRhYmxlU3RhdGUmJiF0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8YSgpfXZhciBmPSExO2Z1bmN0aW9uIGMoZSl7Y2UoIm9uZGF0YSIpLGY9ITEsITEhPT10LndyaXRlKGUpfHxmfHwoKDE9PT1uLnBpcGVzQ291bnQmJm4ucGlwZXM9PT10fHxuLnBpcGVzQ291bnQ+MSYmLTEhPT1SZShuLnBpcGVzLHQpKSYmIXUmJihjZSgiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIixyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrLGY9ITApLHIucGF1c2UoKSl9ZnVuY3Rpb24gbChlKXt2YXIgcjtjZSgib25lcnJvciIsZSksZygpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSwwPT09KHI9ImVycm9yIix0Lmxpc3RlbmVycyhyKS5sZW5ndGgpJiZ0LmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiBwKCl7dC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixkKSxnKCl9ZnVuY3Rpb24gZCgpe2NlKCJvbmZpbmlzaCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixwKSxnKCl9ZnVuY3Rpb24gZygpe2NlKCJ1bnBpcGUiKSxyLnVucGlwZSh0KX1yZXR1cm4gci5vbigiZGF0YSIsYyksZnVuY3Rpb24odCxlLHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnByZXBlbmRMaXN0ZW5lcilyZXR1cm4gdC5wcmVwZW5kTGlzdGVuZXIoZSxyKTt0Ll9ldmVudHMmJnQuX2V2ZW50c1tlXT9BcnJheS5pc0FycmF5KHQuX2V2ZW50c1tlXSk/dC5fZXZlbnRzW2VdLnVuc2hpZnQocik6dC5fZXZlbnRzW2VdPVtyLHQuX2V2ZW50c1tlXV06dC5vbihlLHIpfSh0LCJlcnJvciIsbCksdC5vbmNlKCJjbG9zZSIscCksdC5vbmNlKCJmaW5pc2giLGQpLHQuZW1pdCgicGlwZSIsciksbi5mbG93aW5nfHwoY2UoInBpcGUgcmVzdW1lIiksci5yZXN1bWUoKSksdH0scGUucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlO2lmKDA9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PWUucGlwZXNDb3VudClyZXR1cm4gdCYmdCE9PWUucGlwZXN8fCh0fHwodD1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHQmJnQuZW1pdCgidW5waXBlIix0aGlzKSksdGhpcztpZighdCl7dmFyIHI9ZS5waXBlcyxuPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgaT0wO2k8bjtpKyspcltpXS5lbWl0KCJ1bnBpcGUiLHRoaXMpO3JldHVybiB0aGlzfXZhciBvPVJlKGUucGlwZXMsdCk7cmV0dXJuLTE9PT1vfHwoZS5waXBlcy5zcGxpY2UobywxKSxlLnBpcGVzQ291bnQtPTEsMT09PWUucGlwZXNDb3VudCYmKGUucGlwZXM9ZS5waXBlc1swXSksdC5lbWl0KCJ1bnBpcGUiLHRoaXMpKSx0aGlzfSxwZS5wcm90b3R5cGUub249ZnVuY3Rpb24odCxyKXt2YXIgbj1lLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsdCxyKTtpZigiZGF0YSI9PT10KSExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiZ0aGlzLnJlc3VtZSgpO2Vsc2UgaWYoInJlYWRhYmxlIj09PXQpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7aS5lbmRFbWl0dGVkfHxpLnJlYWRhYmxlTGlzdGVuaW5nfHwoaS5yZWFkYWJsZUxpc3RlbmluZz1pLm5lZWRSZWFkYWJsZT0hMCxpLmVtaXR0ZWRSZWFkYWJsZT0hMSxpLnJlYWRpbmc/aS5sZW5ndGgmJnllKHRoaXMpOnd0KG1lLHRoaXMpKX1yZXR1cm4gbn0scGUucHJvdG90eXBlLmFkZExpc3RlbmVyPXBlLnByb3RvdHlwZS5vbixwZS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gdC5mbG93aW5nfHwoY2UoInJlc3VtZSIpLHQuZmxvd2luZz0hMCxmdW5jdGlvbih0LGUpe2UucmVzdW1lU2NoZWR1bGVkfHwoZS5yZXN1bWVTY2hlZHVsZWQ9ITAsd3Qod2UsdCxlKSl9KHRoaXMsdCkpLHRoaXN9LHBlLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiBjZSgiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoY2UoInBhdXNlIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdCgicGF1c2UiKSksdGhpc30scGUucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPSExLG49dGhpcztmb3IodmFyIGkgaW4gdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtpZihjZSgid3JhcHBlZCBlbmQiKSxlLmRlY29kZXImJiFlLmVuZGVkKXt2YXIgdD1lLmRlY29kZXIuZW5kKCk7dCYmdC5sZW5ndGgmJm4ucHVzaCh0KX1uLnB1c2gobnVsbCl9KSksdC5vbigiZGF0YSIsKGZ1bmN0aW9uKGkpeyhjZSgid3JhcHBlZCBkYXRhIiksZS5kZWNvZGVyJiYoaT1lLmRlY29kZXIud3JpdGUoaSkpLGUub2JqZWN0TW9kZSYmbnVsbD09aSl8fChlLm9iamVjdE1vZGV8fGkmJmkubGVuZ3RoKSYmKG4ucHVzaChpKXx8KHI9ITAsdC5wYXVzZSgpKSl9KSksdCl2b2lkIDA9PT10aGlzW2ldJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKHRoaXNbaV09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0oaSkpO3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKyllKHRbcl0scil9KFsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdLChmdW5jdGlvbihlKXt0Lm9uKGUsbi5lbWl0LmJpbmQobixlKSl9KSksbi5fcmVhZD1mdW5jdGlvbihlKXtjZSgid3JhcHBlZCBfcmVhZCIsZSksciYmKHI9ITEsdC5yZXN1bWUoKSl9LG59LHBlLl9mcm9tTGlzdD1TZSxqZS5Xcml0YWJsZVN0YXRlPU9lLHh0KGplLGUpLE9lLnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5idWZmZXJlZFJlcXVlc3QsZT1bXTt0OyllLnB1c2godCksdD10Lm5leHQ7cmV0dXJuIGV9LGplLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIikpfSxqZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLEEuaXNCdWZmZXIodCk/ZT0iYnVmZmVyIjplfHwoZT1uLmRlZmF1bHRFbmNvZGluZyksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPUFlKSxuLmVuZGVkP2Z1bmN0aW9uKHQsZSl7dmFyIHI9bmV3IEVycm9yKCJ3cml0ZSBhZnRlciBlbmQiKTt0LmVtaXQoImVycm9yIixyKSx3dChlLHIpfSh0aGlzLHIpOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPSEwLG89ITE7cmV0dXJuIG51bGw9PT1yP289bmV3IFR5cGVFcnJvcigiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0iKTpBLmlzQnVmZmVyKHIpfHwic3RyaW5nIj09dHlwZW9mIHJ8fHZvaWQgMD09PXJ8fGUub2JqZWN0TW9kZXx8KG89bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKSxvJiYodC5lbWl0KCJlcnJvciIsbyksd3QobixvKSxpPSExKSxpfSh0aGlzLG4sdCxyKSYmKG4ucGVuZGluZ2NiKyssaT1mdW5jdGlvbih0LGUscixuLGkpe3I9ZnVuY3Rpb24odCxlLHIpe3Qub2JqZWN0TW9kZXx8ITE9PT10LmRlY29kZVN0cmluZ3N8fCJzdHJpbmciIT10eXBlb2YgZXx8KGU9QS5mcm9tKGUscikpO3JldHVybiBlfShlLHIsbiksQS5pc0J1ZmZlcihyKSYmKG49ImJ1ZmZlciIpO3ZhciBvPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoO2UubGVuZ3RoKz1vO3ZhciBzPWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyaztzfHwoZS5uZWVkRHJhaW49ITApO2lmKGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBhPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bmV3IFRlKHIsbixpKSxhP2EubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBMZSh0LGUsITEsbyxyLG4saSk7cmV0dXJuIHN9KHRoaXMsbix0LGUscikpLGl9LGplLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30samUucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3dyaXRhYmxlU3RhdGU7dC5jb3JrZWQmJih0LmNvcmtlZC0tLHQud3JpdGluZ3x8dC5jb3JrZWR8fHQuZmluaXNoZWR8fHQuYnVmZmVyUHJvY2Vzc2luZ3x8IXQuYnVmZmVyZWRSZXF1ZXN0fHxQZSh0aGlzLHQpKX0samUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudG9Mb3dlckNhc2UoKSksIShbImhleCIsInV0ZjgiLCJ1dGYtOCIsImFzY2lpIiwiYmluYXJ5IiwiYmFzZTY0IiwidWNzMiIsInVjcy0yIiwidXRmMTZsZSIsInV0Zi0xNmxlIiwicmF3Il0uaW5kZXhPZigodCsiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPXQsdGhpc30samUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7cihuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0samUucHJvdG90eXBlLl93cml0ZXY9bnVsbCxqZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlOyJmdW5jdGlvbiI9PXR5cGVvZiB0PyhyPXQsdD1udWxsLGU9bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxudWxsIT10JiZ0aGlzLndyaXRlKHQsZSksbi5jb3JrZWQmJihuLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLG4uZW5kaW5nfHxuLmZpbmlzaGVkfHxmdW5jdGlvbih0LGUscil7ZS5lbmRpbmc9ITAseGUodCxlKSxyJiYoZS5maW5pc2hlZD93dChyKTp0Lm9uY2UoImZpbmlzaCIscikpO2UuZW5kZWQ9ITAsdC53cml0YWJsZT0hMX0odGhpcyxuLHIpfSx4dChGZSxwZSk7Zm9yKHZhciBJZT1PYmplY3Qua2V5cyhqZS5wcm90b3R5cGUpLERlPTA7RGU8SWUubGVuZ3RoO0RlKyspe3ZhciBOZT1JZVtEZV07RmUucHJvdG90eXBlW05lXXx8KEZlLnByb3RvdHlwZVtOZV09amUucHJvdG90eXBlW05lXSl9ZnVuY3Rpb24gRmUodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgRmUpKXJldHVybiBuZXcgRmUodCk7cGUuY2FsbCh0aGlzLHQpLGplLmNhbGwodGhpcyx0KSx0JiYhMT09PXQucmVhZGFibGUmJih0aGlzLnJlYWRhYmxlPSExKSx0JiYhMT09PXQud3JpdGFibGUmJih0aGlzLndyaXRhYmxlPSExKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsdCYmITE9PT10LmFsbG93SGFsZk9wZW4mJih0aGlzLmFsbG93SGFsZk9wZW49ITEpLHRoaXMub25jZSgiZW5kIix6ZSl9ZnVuY3Rpb24gemUoKXt0aGlzLmFsbG93SGFsZk9wZW58fHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fHd0KHFlLHRoaXMpfWZ1bmN0aW9uIHFlKHQpe3QuZW5kKCl9ZnVuY3Rpb24gWWUodCl7dGhpcy5hZnRlclRyYW5zZm9ybT1mdW5jdGlvbihlLHIpe3JldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG49dC5fdHJhbnNmb3JtU3RhdGU7bi50cmFuc2Zvcm1pbmc9ITE7dmFyIGk9bi53cml0ZWNiO2lmKCFpKXJldHVybiB0LmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzIikpO24ud3JpdGVjaHVuaz1udWxsLG4ud3JpdGVjYj1udWxsLG51bGwhPXImJnQucHVzaChyKTtpKGUpO3ZhciBvPXQuX3JlYWRhYmxlU3RhdGU7by5yZWFkaW5nPSExLChvLm5lZWRSZWFkYWJsZXx8by5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrKSYmdC5fcmVhZChvLmhpZ2hXYXRlck1hcmspfSh0LGUscil9LHRoaXMubmVlZFRyYW5zZm9ybT0hMSx0aGlzLnRyYW5zZm9ybWluZz0hMSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlY2h1bms9bnVsbCx0aGlzLndyaXRlZW5jb2Rpbmc9bnVsbH1mdW5jdGlvbiBXZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBXZSkpcmV0dXJuIG5ldyBXZSh0KTtGZS5jYWxsKHRoaXMsdCksdGhpcy5fdHJhbnNmb3JtU3RhdGU9bmV3IFllKHRoaXMpO3ZhciBlPXRoaXM7dGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGU9ITAsdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jPSExLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC50cmFuc2Zvcm0mJih0aGlzLl90cmFuc2Zvcm09dC50cmFuc2Zvcm0pLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZsdXNoJiYodGhpcy5fZmx1c2g9dC5mbHVzaCkpLHRoaXMub25jZSgicHJlZmluaXNoIiwoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goKGZ1bmN0aW9uKHQpeyRlKGUsdCl9KSk6JGUoZSl9KSl9ZnVuY3Rpb24gJGUodCxlKXtpZihlKXJldHVybiB0LmVtaXQoImVycm9yIixlKTt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49dC5fdHJhbnNmb3JtU3RhdGU7aWYoci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAiKTtpZihuLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gdC5wdXNoKG51bGwpfWZ1bmN0aW9uIEdlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEdlKSlyZXR1cm4gbmV3IEdlKHQpO1dlLmNhbGwodGhpcyx0KX1mdW5jdGlvbiBKZSgpe2UuY2FsbCh0aGlzKX14dChXZSxGZSksV2UucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxGZS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsdCxlKX0sV2UucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIil9LFdlLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKG4ud3JpdGVjYj1yLG4ud3JpdGVjaHVuaz10LG4ud3JpdGVlbmNvZGluZz1lLCFuLnRyYW5zZm9ybWluZyl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTsobi5uZWVkVHJhbnNmb3JtfHxpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfX0sV2UucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RyYW5zZm9ybVN0YXRlO251bGwhPT1lLndyaXRlY2h1bmsmJmUud3JpdGVjYiYmIWUudHJhbnNmb3JtaW5nPyhlLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLGUud3JpdGVlbmNvZGluZyxlLmFmdGVyVHJhbnNmb3JtKSk6ZS5uZWVkVHJhbnNmb3JtPSEwfSx4dChHZSxXZSksR2UucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3IobnVsbCx0KX0seHQoSmUsZSksSmUuUmVhZGFibGU9cGUsSmUuV3JpdGFibGU9amUsSmUuRHVwbGV4PUZlLEplLlRyYW5zZm9ybT1XZSxKZS5QYXNzVGhyb3VnaD1HZSxKZS5TdHJlYW09SmUsSmUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxyKXt2YXIgbj10aGlzO2Z1bmN0aW9uIGkoZSl7dC53cml0YWJsZSYmITE9PT10LndyaXRlKGUpJiZuLnBhdXNlJiZuLnBhdXNlKCl9ZnVuY3Rpb24gbygpe24ucmVhZGFibGUmJm4ucmVzdW1lJiZuLnJlc3VtZSgpfW4ub24oImRhdGEiLGkpLHQub24oImRyYWluIixvKSx0Ll9pc1N0ZGlvfHxyJiYhMT09PXIuZW5kfHwobi5vbigiZW5kIixhKSxuLm9uKCJjbG9zZSIsdSkpO3ZhciBzPSExO2Z1bmN0aW9uIGEoKXtzfHwocz0hMCx0LmVuZCgpKX1mdW5jdGlvbiB1KCl7c3x8KHM9ITAsImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmdC5kZXN0cm95KCkpfWZ1bmN0aW9uIGgodCl7aWYoZigpLDA9PT1lLmxpc3RlbmVyQ291bnQodGhpcywiZXJyb3IiKSl0aHJvdyB0fWZ1bmN0aW9uIGYoKXtuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixpKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsbyksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsdSksbi5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixoKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGYpLG4ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixmKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZil9cmV0dXJuIG4ub24oImVycm9yIixoKSx0Lm9uKCJlcnJvciIsaCksbi5vbigiZW5kIixmKSxuLm9uKCJjbG9zZSIsZiksdC5vbigiY2xvc2UiLGYpLHQuZW1pdCgicGlwZSIsbiksdH07dmFyIEhlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307dmFyIFZlLEtlLFplPShWZT1mdW5jdGlvbih0KXsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT90LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtlJiYodC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSl9OnQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9fX0sVmUoS2U9e2V4cG9ydHM6e319LEtlLmV4cG9ydHMpLEtlLmV4cG9ydHMpO2xldCBRZT10cigpO2Z1bmN0aW9uIFhlKHQsZSl7KCJvYmplY3QiIT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KSkmJihlPXQsdD17fSk7bGV0IHI9bmV3IFFlKHQpO3ZhciBuO3JldHVybiByLl9mcm9tPUFycmF5LmlzQXJyYXkoZSk/KG49KG49ZSkuc2xpY2UoKSxmdW5jdGlvbih0LGUpe2xldCByPW51bGwsaT1uLmxlbmd0aD9uLnNoaWZ0KCk6bnVsbDtpIGluc3RhbmNlb2YgRXJyb3ImJihyPWksaT1udWxsKSxlKHIsaSl9KTplfHxlcixyfWZ1bmN0aW9uIHRyKHQsZSl7ZnVuY3Rpb24gcihlKXtpZighKHRoaXMgaW5zdGFuY2VvZiByKSlyZXR1cm4gbmV3IHIoZSk7dGhpcy5fcmVhZGluZz0hMSx0aGlzLl9jYWxsYmFjaz1mdW5jdGlvbih0LGUpe2lmKG4uZGVzdHJveWVkKXJldHVybjtpZih0KXJldHVybiBuLmRlc3Ryb3kodCk7aWYobnVsbD09PWUpcmV0dXJuIG4ucHVzaChudWxsKTtuLl9yZWFkaW5nPSExLG4ucHVzaChlKSYmbi5fcmVhZChpKX0sdGhpcy5kZXN0cm95ZWQ9ITEscGUuY2FsbCh0aGlzLGV8fHQpO2xldCBuPXRoaXMsaT10aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJihlPXQsdD17fSksdD1ycih0KSxaZShyLHBlKSxyLnByb3RvdHlwZS5fZnJvbT1lfHxlcixyLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLl9yZWFkaW5nfHx0aGlzLmRlc3Ryb3llZHx8KHRoaXMuX3JlYWRpbmc9ITAsdGhpcy5fZnJvbSh0LHRoaXMuX2NhbGxiYWNrKSl9LHIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24odCl7aWYodGhpcy5kZXN0cm95ZWQpcmV0dXJuO3RoaXMuZGVzdHJveWVkPSEwO2xldCBlPXRoaXM7cHJvY2Vzcy5uZXh0VGljaygoZnVuY3Rpb24oKXt0JiZlLmVtaXQoImVycm9yIix0KSxlLmVtaXQoImNsb3NlIil9KSl9LHJ9ZnVuY3Rpb24gZXIoKXt9ZnVuY3Rpb24gcnIodCl7cmV0dXJuIHQ9dHx8e319WGUuY3Rvcj10cixYZS5vYmo9ZnVuY3Rpb24odCxlKXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCkpJiYoZT10LHQ9e30pLCh0PXJyKHQpKS5vYmplY3RNb2RlPSEwLHQuaGlnaFdhdGVyTWFyaz0xNixYZSh0LGUpfTt2YXIgbnIsaXI9MSxvcj17fSxzcj0hMSxhcj1sLmRvY3VtZW50O2Z1bmN0aW9uIHVyKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1uZXcgRnVuY3Rpb24oIiIrdCkpO2Zvcih2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxyPTA7cjxlLmxlbmd0aDtyKyspZVtyXT1hcmd1bWVudHNbcisxXTt2YXIgbj17Y2FsbGJhY2s6dCxhcmdzOmV9O3JldHVybiBvcltpcl09bixucihpciksaXIrK31mdW5jdGlvbiBocih0KXtpZihzcilzZXRUaW1lb3V0KGhyLDAsdCk7ZWxzZXt2YXIgZT1vclt0XTtpZihlKXtzcj0hMDt0cnl7IWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2FsbGJhY2sscj10LmFyZ3M7c3dpdGNoKHIubGVuZ3RoKXtjYXNlIDA6ZSgpO2JyZWFrO2Nhc2UgMTplKHJbMF0pO2JyZWFrO2Nhc2UgMjplKHJbMF0sclsxXSk7YnJlYWs7Y2FzZSAzOmUoclswXSxyWzFdLHJbMl0pO2JyZWFrO2RlZmF1bHQ6ZS5hcHBseSh2b2lkIDAscil9fShlKX1maW5hbGx5eyFmdW5jdGlvbih0KXtkZWxldGUgb3JbdF19KHQpLHNyPSExfX19fXZhciBmcixjcixscixwcixkcj1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZihsKTtmdW5jdGlvbiBncih0KXtsZXQgZSxyPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KTtpZihlPSJbb2JqZWN0IFByb21pc2VdIj09PXIsZSlyZXR1cm4hMDtpZigiW29iamVjdCBGdW5jdGlvbl0iIT09cilyZXR1cm4hMTt0cnl7ZT0iZnVuY3Rpb24iIT10eXBlb2YgdC5zdWJzY3JpYmUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW59Y2F0Y2godCl7fXJldHVybiBlfWZ1bmN0aW9uIHlyKHQpe2xldCBlLHIsbjtmdW5jdGlvbiBpKGkpeygodD1pKWluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fEFycmF5QnVmZmVyLmlzVmlldyh0KSYmIUEuaXNCdWZmZXIodCkpJiYodD1BLmZyb20odCkpLGU9Z3IodCk/dDpudWxsO2NvbnN0IG89IWUmJnRbU3ltYm9sLml0ZXJhdG9yXSYmInN0cmluZyIhPXR5cGVvZiB0JiYhQS5pc0J1ZmZlcih0KTtyPW8/dFtTeW1ib2wuaXRlcmF0b3JdKCk6bnVsbDtjb25zdCBzPSFlJiZ0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtuPXM/dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTpudWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LnNsaWNlKCkpLGkodCksWGUoKGZ1bmN0aW9uIG8ocyxhKXtpZihlKXJldHVybiB2b2lkKGFzeW5jKCk9Pnt0cnl7YXdhaXQgaShhd2FpdCBlKSxvLmNhbGwodGhpcyxzLGEpfWNhdGNoKHQpe2EodCl9fSkoKTtpZihyKXtjb25zdCB0PXIubmV4dCgpO3JldHVybiB2b2lkIHVyKGEsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1pZihuKXJldHVybiB2b2lkKGFzeW5jKCk9Pnt0cnl7Y29uc3QgdD1hd2FpdCBuLm5leHQoKTt1cihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9Y2F0Y2godCl7dXIoYSx0KX19KSgpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdm9pZCB1cihhLG51bGwsbnVsbCk7Y29uc3QgdT10LnNsaWNlKDAscyk7dD10LnNsaWNlKHMpLHVyKGEsbnVsbCx1KX0pKX1kcj1kciYmZHIuc2V0VGltZW91dD9kcjpsLCJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwobC5wcm9jZXNzKT9ucj1mdW5jdGlvbih0KXtCdC5uZXh0VGljaygoZnVuY3Rpb24oKXtocih0KX0pKX06IWZ1bmN0aW9uKCl7aWYobC5wb3N0TWVzc2FnZSYmIWwuaW1wb3J0U2NyaXB0cyl7dmFyIHQ9ITAsZT1sLm9ubWVzc2FnZTtyZXR1cm4gbC5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXt0PSExfSxsLnBvc3RNZXNzYWdlKCIiLCIqIiksbC5vbm1lc3NhZ2U9ZSx0fX0oKT9sLk1lc3NhZ2VDaGFubmVsPygoY3I9bmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24odCl7aHIodC5kYXRhKX0sbnI9ZnVuY3Rpb24odCl7Y3IucG9ydDIucG9zdE1lc3NhZ2UodCl9KTphciYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBhci5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT8oZnI9YXIuZG9jdW1lbnRFbGVtZW50LG5yPWZ1bmN0aW9uKHQpe3ZhciBlPWFyLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aHIodCksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxmci5yZW1vdmVDaGlsZChlKSxlPW51bGx9LGZyLmFwcGVuZENoaWxkKGUpfSk6bnI9ZnVuY3Rpb24odCl7c2V0VGltZW91dChociwwLHQpfToobHI9InNldEltbWVkaWF0ZSQiK01hdGgucmFuZG9tKCkrIiQiLHByPWZ1bmN0aW9uKHQpe3Quc291cmNlPT09bCYmInN0cmluZyI9PXR5cGVvZiB0LmRhdGEmJjA9PT10LmRhdGEuaW5kZXhPZihscikmJmhyKCt0LmRhdGEuc2xpY2UobHIubGVuZ3RoKSl9LGwuYWRkRXZlbnRMaXN0ZW5lcj9sLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHByLCExKTpsLmF0dGFjaEV2ZW50KCJvbm1lc3NhZ2UiLHByKSxucj1mdW5jdGlvbih0KXtsLnBvc3RNZXNzYWdlKGxyK3QsIioiKX0pLHlyLm9iamVjdD10PT57bGV0IGUscixuO2Z1bmN0aW9uIGkoaSl7ZT1ncih0PWkpP3Q6bnVsbCxyPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0/dFtTeW1ib2wuaXRlcmF0b3JdKCk6bnVsbCxuPSFlJiZ0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXT90W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOm51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSksaSh0KSxYZS5vYmooKGZ1bmN0aW9uIG8ocyxhKXtpZihlKShhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMscyxhKX1jYXRjaCh0KXthKHQpfX0pKCk7ZWxzZSBpZihyKXtjb25zdCB0PXIubmV4dCgpO3VyKGEsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1lbHNlIG4/KGFzeW5jKCk9Pnt0cnl7Y29uc3QgdD1hd2FpdCBuLm5leHQoKTt1cihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9Y2F0Y2godCl7dXIoYSx0KX19KSgpOih0aGlzLnB1c2godCksdXIoYSxudWxsLG51bGwpKX0pKX07dmFyIHZyPXt9LGJyPXZyLkxFRlRfQlJBQ0U9MSxtcj12ci5SSUdIVF9CUkFDRT0yLHdyPXZyLkxFRlRfQlJBQ0tFVD0zLF9yPXZyLlJJR0hUX0JSQUNLRVQ9NCxTcj12ci5DT0xPTj01LEVyPXZyLkNPTU1BPTYsa3I9dnIuVFJVRT03LFJyPXZyLkZBTFNFPTgsQXI9dnIuTlVMTD05LFRyPXZyLlNUUklORz0xMCxPcj12ci5OVU1CRVI9MTEsanI9dnIuU1RBUlQ9MTcsTHI9dnIuU1RPUD0xOCxDcj12ci5UUlVFMT0zMyxQcj12ci5UUlVFMj0zNCxNcj12ci5UUlVFMz0zNSxCcj12ci5GQUxTRTE9NDkseHI9dnIuRkFMU0UyPTUwLFVyPXZyLkZBTFNFMz01MSxJcj12ci5GQUxTRTQ9NTIsRHI9dnIuTlVMTDE9NjUsTnI9dnIuTlVMTDI9NjYsRnI9dnIuTlVMTDM9NjcsenI9dnIuTlVNQkVSMT04MSxxcj12ci5OVU1CRVIzPTgzLFlyPXZyLlNUUklORzE9OTcsV3I9dnIuU1RSSU5HMj05OCwkcj12ci5TVFJJTkczPTk5LEdyPXZyLlNUUklORzQ9MTAwLEpyPXZyLlNUUklORzU9MTAxLEhyPXZyLlNUUklORzY9MTAyLFZyPXZyLlZBTFVFPTExMyxLcj12ci5LRVk9MTE0LFpyPXZyLk9CSkVDVD0xMjksUXI9dnIuQVJSQVk9MTMwLFhyPSJcXCIuY2hhckNvZGVBdCgwKSx0bj0iLyIuY2hhckNvZGVBdCgwKSxlbj0iXGIiLmNoYXJDb2RlQXQoMCkscm49IlxmIi5jaGFyQ29kZUF0KDApLG5uPSJcbiIuY2hhckNvZGVBdCgwKSxvbj0iXHIiLmNoYXJDb2RlQXQoMCksc249Ilx0Ii5jaGFyQ29kZUF0KDApO2Z1bmN0aW9uIGFuKCl7dGhpcy50U3RhdGU9anIsdGhpcy52YWx1ZT12b2lkIDAsdGhpcy5zdHJpbmc9dm9pZCAwLHRoaXMuc3RyaW5nQnVmZmVyPUEuYWxsb2M/QS5hbGxvYyg2NTUzNik6bmV3IEEoNjU1MzYpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy51bmljb2RlPXZvaWQgMCx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwLHRoaXMua2V5PXZvaWQgMCx0aGlzLm1vZGU9dm9pZCAwLHRoaXMuc3RhY2s9W10sdGhpcy5zdGF0ZT1Wcix0aGlzLmJ5dGVzX3JlbWFpbmluZz0wLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MCx0aGlzLnRlbXBfYnVmZnM9ezI6bmV3IEEoMiksMzpuZXcgQSgzKSw0Om5ldyBBKDQpfSx0aGlzLm9mZnNldD0tMX1hbi50b2tuYW09ZnVuY3Rpb24odCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKHZyKSxyPTAsbj1lLmxlbmd0aDtyPG47cisrKXt2YXIgaT1lW3JdO2lmKHZyW2ldPT09dClyZXR1cm4gaX1yZXR1cm4gdCYmIjB4Iit0LnRvU3RyaW5nKDE2KX07dmFyIHVuPWFuLnByb3RvdHlwZTt1bi5vbkVycm9yPWZ1bmN0aW9uKHQpe3Rocm93IHR9LHVuLmNoYXJFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPUxyLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIitKU09OLnN0cmluZ2lmeShTdHJpbmcuZnJvbUNoYXJDb2RlKHRbZV0pKSsiIGF0IHBvc2l0aW9uICIrZSsiIGluIHN0YXRlICIrYW4udG9rbmFtKHRoaXMudFN0YXRlKSkpfSx1bi5hcHBlbmRTdHJpbmdDaGFyPWZ1bmN0aW9uKHQpe3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0Pj02NTUzNiYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTApLHRoaXMuc3RyaW5nQnVmZmVyW3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KytdPXR9LHVuLmFwcGVuZFN0cmluZ0J1Zj1mdW5jdGlvbih0LGUscil7dmFyIG49dC5sZW5ndGg7Im51bWJlciI9PXR5cGVvZiBlJiYobj0ibnVtYmVyIj09dHlwZW9mIHI/cjwwP3QubGVuZ3RoLWUrcjpyLWU6dC5sZW5ndGgtZSksbjwwJiYobj0wKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCtuPjY1NTM2JiYodGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiwwLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0LmNvcHkodGhpcy5zdHJpbmdCdWZmZXIsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQsZSxyKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCs9bn0sdW4ud3JpdGU9ZnVuY3Rpb24odCl7dmFyIGU7InN0cmluZyI9PXR5cGVvZiB0JiYodD1uZXcgQSh0KSk7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWlmKHRoaXMudFN0YXRlPT09anIpe2lmKGU9dFtyXSx0aGlzLm9mZnNldCsrLDEyMz09PWUpdGhpcy5vblRva2VuKGJyLCJ7Iik7ZWxzZSBpZigxMjU9PT1lKXRoaXMub25Ub2tlbihtciwifSIpO2Vsc2UgaWYoOTE9PT1lKXRoaXMub25Ub2tlbih3ciwiWyIpO2Vsc2UgaWYoOTM9PT1lKXRoaXMub25Ub2tlbihfciwiXSIpO2Vsc2UgaWYoNTg9PT1lKXRoaXMub25Ub2tlbihTciwiOiIpO2Vsc2UgaWYoNDQ9PT1lKXRoaXMub25Ub2tlbihFciwiLCIpO2Vsc2UgaWYoMTE2PT09ZSl0aGlzLnRTdGF0ZT1DcjtlbHNlIGlmKDEwMj09PWUpdGhpcy50U3RhdGU9QnI7ZWxzZSBpZigxMTA9PT1lKXRoaXMudFN0YXRlPURyO2Vsc2UgaWYoMzQ9PT1lKXRoaXMuc3RyaW5nPSIiLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy50U3RhdGU9WXI7ZWxzZSBpZig0NT09PWUpdGhpcy5zdHJpbmc9Ii0iLHRoaXMudFN0YXRlPXpyO2Vsc2UgaWYoZT49NDgmJmU8NjQpdGhpcy5zdHJpbmc9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZT1xcjtlbHNlIGlmKDMyIT09ZSYmOSE9PWUmJjEwIT09ZSYmMTMhPT1lKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpfWVsc2UgaWYodGhpcy50U3RhdGU9PT1ZcilpZihlPXRbcl0sdGhpcy5ieXRlc19yZW1haW5pbmc+MCl7Zm9yKHZhciBpPTA7aTx0aGlzLmJ5dGVzX3JlbWFpbmluZztpKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdGhpcy5ieXRlc19yZW1haW5pbmcraV09dFtpXTt0aGlzLmFwcGVuZFN0cmluZ0J1Zih0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV0pLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9dGhpcy5ieXRlc19yZW1haW5pbmc9MCxyPXIraS0xfWVsc2UgaWYoMD09PXRoaXMuYnl0ZXNfcmVtYWluaW5nJiZlPj0xMjgpe2lmKGU8PTE5M3x8ZT4yNDQpcmV0dXJuIHRoaXMub25FcnJvcihuZXcgRXJyb3IoIkludmFsaWQgVVRGLTggY2hhcmFjdGVyIGF0IHBvc2l0aW9uICIrcisiIGluIHN0YXRlICIrYW4udG9rbmFtKHRoaXMudFN0YXRlKSkpO2lmKGU+PTE5NCYmZTw9MjIzJiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0yKSxlPj0yMjQmJmU8PTIzOSYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MyksZT49MjQwJiZlPD0yNDQmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTQpLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2Urcj50Lmxlbmd0aCl7Zm9yKHZhciBvPTA7bzw9dC5sZW5ndGgtMS1yO28rKyl0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV1bb109dFtyK29dO3RoaXMuYnl0ZXNfcmVtYWluaW5nPXIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS10Lmxlbmd0aCxyPXQubGVuZ3RoLTF9ZWxzZSB0aGlzLmFwcGVuZFN0cmluZ0J1Zih0LHIscit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlKSxyPXIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS0xfWVsc2UgaWYoMzQ9PT1lKXRoaXMudFN0YXRlPWpyLHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIsMCx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCx0aGlzLm9uVG9rZW4oVHIsdGhpcy5zdHJpbmcpLHRoaXMub2Zmc2V0Kz1BLmJ5dGVMZW5ndGgodGhpcy5zdHJpbmcsInV0ZjgiKSsxLHRoaXMuc3RyaW5nPXZvaWQgMDtlbHNlIGlmKDkyPT09ZSl0aGlzLnRTdGF0ZT1XcjtlbHNle2lmKCEoZT49MzIpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMuYXBwZW5kU3RyaW5nQ2hhcihlKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09V3IpaWYoMzQ9PT0oZT10W3JdKSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZSksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZig5Mj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFhyKSx0aGlzLnRTdGF0ZT1ZcjtlbHNlIGlmKDQ3PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIodG4pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoOTg9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihlbiksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZigxMDI9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihybiksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZigxMTA9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihubiksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZigxMTQ9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihvbiksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZigxMTY9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihzbiksdGhpcy50U3RhdGU9WXI7ZWxzZXtpZigxMTchPT1lKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudW5pY29kZT0iIix0aGlzLnRTdGF0ZT0kcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09JHJ8fHRoaXMudFN0YXRlPT09R3J8fHRoaXMudFN0YXRlPT09SnJ8fHRoaXMudFN0YXRlPT09SHIpe2lmKCEoKGU9dFtyXSk+PTQ4JiZlPDY0fHxlPjY0JiZlPD03MHx8ZT45NiYmZTw9MTAyKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTtpZih0aGlzLnVuaWNvZGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGUrKz09PUhyKXt2YXIgcz1wYXJzZUludCh0aGlzLnVuaWNvZGUsMTYpO3RoaXMudW5pY29kZT12b2lkIDAsdm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiZzPj01NjMyMCYmczw1NzM0ND8odGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IEEoU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUscykpKSx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwKTp2b2lkIDA9PT10aGlzLmhpZ2hTdXJyb2dhdGUmJnM+PTU1Mjk2JiZzPDU2MzIwP3RoaXMuaGlnaFN1cnJvZ2F0ZT1zOih2b2lkIDAhPT10aGlzLmhpZ2hTdXJyb2dhdGUmJih0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgQShTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuaGlnaFN1cnJvZ2F0ZSkpKSx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwKSx0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgQShTdHJpbmcuZnJvbUNoYXJDb2RlKHMpKSkpLHRoaXMudFN0YXRlPVlyfX1lbHNlIGlmKHRoaXMudFN0YXRlPT09enJ8fHRoaXMudFN0YXRlPT09cXIpc3dpdGNoKGU9dFtyXSl7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmNhc2UgNTY6Y2FzZSA1NzpjYXNlIDQ2OmNhc2UgMTAxOmNhc2UgNjk6Y2FzZSA0MzpjYXNlIDQ1OnRoaXMuc3RyaW5nKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlPXFyO2JyZWFrO2RlZmF1bHQ6dGhpcy50U3RhdGU9anI7dmFyIGE9TnVtYmVyKHRoaXMuc3RyaW5nKTtpZihpc05hTihhKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnN0cmluZy5tYXRjaCgvWzAtOV0rLyk9PXRoaXMuc3RyaW5nJiZhLnRvU3RyaW5nKCkhPXRoaXMuc3RyaW5nP3RoaXMub25Ub2tlbihUcix0aGlzLnN0cmluZyk6dGhpcy5vblRva2VuKE9yLGEpLHRoaXMub2Zmc2V0Kz10aGlzLnN0cmluZy5sZW5ndGgtMSx0aGlzLnN0cmluZz12b2lkIDAsci0tfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Dcil7aWYoMTE0IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Qcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09UHIpe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9TXJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PU1yKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPWpyLHRoaXMub25Ub2tlbihrciwhMCksdGhpcy5vZmZzZXQrPTN9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUJyKXtpZig5NyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9eHJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PXhyKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPVVyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Vcil7aWYoMTE1IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Jcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09SXIpe2lmKDEwMSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9anIsdGhpcy5vblRva2VuKFJyLCExKSx0aGlzLm9mZnNldCs9NH1lbHNlIGlmKHRoaXMudFN0YXRlPT09RHIpe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9TnJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PU5yKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUZyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Gcil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1qcix0aGlzLm9uVG9rZW4oQXIsbnVsbCksdGhpcy5vZmZzZXQrPTN9fSx1bi5vblRva2VuPWZ1bmN0aW9uKHQsZSl7fSx1bi5wYXJzZUVycm9yPWZ1bmN0aW9uKHQsZSl7dGhpcy50U3RhdGU9THIsdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiVW5leHBlY3RlZCAiK2FuLnRva25hbSh0KSsoZT8iKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiOiIiKSsiIGluIHN0YXRlICIrYW4udG9rbmFtKHRoaXMuc3RhdGUpKSl9LHVuLnB1c2g9ZnVuY3Rpb24oKXt0aGlzLnN0YWNrLnB1c2goe3ZhbHVlOnRoaXMudmFsdWUsa2V5OnRoaXMua2V5LG1vZGU6dGhpcy5tb2RlfSl9LHVuLnBvcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmFsdWUsZT10aGlzLnN0YWNrLnBvcCgpO3RoaXMudmFsdWU9ZS52YWx1ZSx0aGlzLmtleT1lLmtleSx0aGlzLm1vZGU9ZS5tb2RlLHRoaXMuZW1pdCh0KSx0aGlzLm1vZGV8fCh0aGlzLnN0YXRlPVZyKX0sdW4uZW1pdD1mdW5jdGlvbih0KXt0aGlzLm1vZGUmJih0aGlzLnN0YXRlPUVyKSx0aGlzLm9uVmFsdWUodCl9LHVuLm9uVmFsdWU9ZnVuY3Rpb24odCl7fSx1bi5vblRva2VuPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5zdGF0ZT09PVZyKWlmKHQ9PT1Ucnx8dD09PU9yfHx0PT09a3J8fHQ9PT1Scnx8dD09PUFyKXRoaXMudmFsdWUmJih0aGlzLnZhbHVlW3RoaXMua2V5XT1lKSx0aGlzLmVtaXQoZSk7ZWxzZSBpZih0PT09YnIpdGhpcy5wdXNoKCksdGhpcy52YWx1ZT90aGlzLnZhbHVlPXRoaXMudmFsdWVbdGhpcy5rZXldPXt9OnRoaXMudmFsdWU9e30sdGhpcy5rZXk9dm9pZCAwLHRoaXMuc3RhdGU9S3IsdGhpcy5tb2RlPVpyO2Vsc2UgaWYodD09PXdyKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT1bXTp0aGlzLnZhbHVlPVtdLHRoaXMua2V5PTAsdGhpcy5tb2RlPVFyLHRoaXMuc3RhdGU9VnI7ZWxzZSBpZih0PT09bXIpe2lmKHRoaXMubW9kZSE9PVpyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2V7aWYodCE9PV9yKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0aGlzLm1vZGUhPT1RcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT1LcilpZih0PT09VHIpdGhpcy5rZXk9ZSx0aGlzLnN0YXRlPVNyO2Vsc2V7aWYodCE9PW1yKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2UgaWYodGhpcy5zdGF0ZT09PVNyKXtpZih0IT09U3IpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMuc3RhdGU9VnJ9ZWxzZXtpZih0aGlzLnN0YXRlIT09RXIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO2lmKHQ9PT1Fcil0aGlzLm1vZGU9PT1Rcj8odGhpcy5rZXkrKyx0aGlzLnN0YXRlPVZyKTp0aGlzLm1vZGU9PT1aciYmKHRoaXMuc3RhdGU9S3IpO2Vsc2V7aWYoISh0PT09X3ImJnRoaXMubW9kZT09PVFyfHx0PT09bXImJnRoaXMubW9kZT09PVpyKSlyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX19fSxhbi5DPXZyO3ZhciBobj1hbjtmdW5jdGlvbiBmbih0LGUscil7dD10fHxmdW5jdGlvbih0KXt0aGlzLnF1ZXVlKHQpfSxlPWV8fGZ1bmN0aW9uKCl7dGhpcy5xdWV1ZShudWxsKX07bGV0IG49ITEsaT0hMSxvPVtdLHM9ITEsYT1uZXcgSmU7ZnVuY3Rpb24gdSgpe2Zvcig7by5sZW5ndGgmJiFhLnBhdXNlZDspe2xldCB0PW8uc2hpZnQoKTtpZihudWxsPT09dClyZXR1cm4gYS5lbWl0KCJlbmQiKTthLmVtaXQoImRhdGEiLHQpfX1mdW5jdGlvbiBoKCl7YS53cml0YWJsZT0hMSxlLmNhbGwoYSksIWEucmVhZGFibGUmJmEuYXV0b0Rlc3Ryb3kmJmEuZGVzdHJveSgpfXJldHVybiBhLnJlYWRhYmxlPWEud3JpdGFibGU9ITAsYS5wYXVzZWQ9ITEsYS5hdXRvRGVzdHJveT0hKHImJiExPT09ci5hdXRvRGVzdHJveSksYS53cml0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSksIWEucGF1c2VkfSxhLnF1ZXVlPWEucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gc3x8KG51bGw9PT10JiYocz0hMCksby5wdXNoKHQpLHUoKSksYX0sYS5vbigiZW5kIiwoZnVuY3Rpb24oKXthLnJlYWRhYmxlPSExLCFhLndyaXRhYmxlJiZhLmF1dG9EZXN0cm95JiZCdC5uZXh0VGljaygoZnVuY3Rpb24oKXthLmRlc3Ryb3koKX0pKX0pKSxhLmVuZD1mdW5jdGlvbih0KXtpZighbilyZXR1cm4gbj0hMCxhcmd1bWVudHMubGVuZ3RoJiZhLndyaXRlKHQpLGgoKSxhfSxhLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZighaSlyZXR1cm4gaT0hMCxuPSEwLG8ubGVuZ3RoPTAsYS53cml0YWJsZT1hLnJlYWRhYmxlPSExLGEuZW1pdCgiY2xvc2UiKSxhfSxhLnBhdXNlPWZ1bmN0aW9uKCl7aWYoIWEucGF1c2VkKXJldHVybiBhLnBhdXNlZD0hMCxhfSxhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBhLnBhdXNlZCYmKGEucGF1c2VkPSExLGEuZW1pdCgicmVzdW1lIikpLHUoKSxhLnBhdXNlZHx8YS5lbWl0KCJkcmFpbiIpLGF9LGF9Zm4udGhyb3VnaD1mbjtsZXQgY249e3BhcnNlOmZ1bmN0aW9uKHQsZSl7bGV0IHIsbjtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2U9PT10OnQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmV4ZWM/dC5leGVjKGUpOiJib29sZWFuIj09dHlwZW9mIHR8fCJvYmplY3QiPT10eXBlb2YgdD90OiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0KGUpfWxldCBvPW5ldyBobixzPWZuKChmdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PUEuZnJvbSh0KSksby53cml0ZSh0KX0pLChmdW5jdGlvbih0KXt0JiZzLndyaXRlKHQpLHImJnMuZW1pdCgiaGVhZGVyIixyKSxuJiZzLmVtaXQoImZvb3RlciIsbikscy5xdWV1ZShudWxsKX0pKTtmdW5jdGlvbiBhKHQsZSl7ITEhPT1yJiYocj1yfHx7fSxyW3RdPWUpLCExIT09biYmITE9PT1yJiYobj1ufHx7fSxuW3RdPWUpfXJldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC5zcGxpdCgiLiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiQqIj09PXQ/e2VtaXRLZXk6ITB9OiIqIj09PXR8fCgiIj09PXQ/e3JlY3Vyc2U6ITB9OnQpfSkpKSx0JiZ0Lmxlbmd0aHx8KHQ9bnVsbCksby5vblZhbHVlPWZ1bmN0aW9uKG4pe2lmKHRoaXMucm9vdHx8KHMucm9vdD1uKSwhdClyZXR1cm47bGV0IG89MCx1PTAsaD0hMSxmPSExO2Zvcig7bzx0Lmxlbmd0aDspe2xldCBlLHI9dFtvXTtpZih1KyssciYmIXIucmVjdXJzZSl7aWYoZT11PT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW3VdLCFlKXJldHVybjtpZighaShyLGUua2V5KSlyZXR1cm4gdm9pZCBhKGUua2V5LG4pO2g9ISFyLmVtaXRLZXksZj0hIXIuZW1pdFBhdGgsbysrfWVsc2V7bysrO2xldCByPXRbb107aWYoIXIpcmV0dXJuO2Zvcig7Oyl7aWYoZT11PT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW3VdLCFlKXJldHVybjtpZihpKHIsZS5rZXkpKXtvKyssT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbdV0pfHwodGhpcy5zdGFja1t1XS52YWx1ZT1udWxsKTticmVha31hKGUua2V5LG4pLHUrK319fWlmKHImJihzLmVtaXQoImhlYWRlciIscikscj0hMSksdSE9PXRoaXMuc3RhY2subGVuZ3RoKXJldHVybjtsZXQgYz10aGlzLnN0YWNrLnNsaWNlKDEpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQua2V5fSkpLmNvbmNhdChbdGhpcy5rZXldKSxsPW47bnVsbCE9bCYmbnVsbCE9KGw9ZT9lKGwsYyk6bCkmJigoaHx8ZikmJihsPXt2YWx1ZTpsfSxoJiYobC5rZXk9dGhpcy5rZXkpLGYmJihsLnBhdGg9YykpLHMucXVldWUobCkpLHRoaXMudmFsdWUmJmRlbGV0ZSB0aGlzLnZhbHVlW3RoaXMua2V5XTtmb3IobGV0IHQgaW4gdGhpcy5zdGFjaylPYmplY3QuaXNGcm96ZW4odGhpcy5zdGFja1t0XSl8fCh0aGlzLnN0YWNrW3RdLnZhbHVlPW51bGwpfSxvLl9vblRva2VuPW8ub25Ub2tlbixvLm9uVG9rZW49ZnVuY3Rpb24oZSxyKXtvLl9vblRva2VuKGUsciksMD09PXRoaXMuc3RhY2subGVuZ3RoJiZzLnJvb3QmJih0fHxzLnF1ZXVlKHMucm9vdCkscy5yb290PW51bGwpfSxvLm9uRXJyb3I9ZnVuY3Rpb24odCl7dC5tZXNzYWdlLmluZGV4T2YoImF0IHBvc2l0aW9uIik+LTEmJih0Lm1lc3NhZ2U9IkludmFsaWQgSlNPTiAoIit0Lm1lc3NhZ2UrIikiKSxzLmVtaXQoImVycm9yIix0KX0sc319LGxuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGxuPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2ZvcihsZXQgciBpbiBlKWUuaGFzT3duUHJvcGVydHkocikmJih0W3JdPWVbcl0pfSxsbih0LGUpfTtsZXQgcG4sZG49L1tcXCJcdTAwMDAtXHUwMDFmXHUwMDdmLVx1MDA5Zlx1MDBhZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAyZlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS9nLGduPXsiXGIiOiJcXGIiLCJcdCI6IlxcdCIsIlxuIjoiXFxuIiwiXGYiOiJcXGYiLCJcciI6IlxcciIsJyInOidcXCInLCJcXCI6IlxcXFwifTtmdW5jdGlvbiB5bih0KXtyZXR1cm4gdD8iZnVuY3Rpb24iPT10eXBlb2YgdC50aGVuP3BuLlByb21pc2U6ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGlwZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQub25jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXJ9KHQpP3QuX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZT9wbi5SZWFkYWJsZU9iamVjdDpwbi5SZWFkYWJsZVN0cmluZzpBcnJheS5pc0FycmF5KHQpP3BuLkFycmF5OiJvYmplY3QiPT10eXBlb2YgdHx8dCBpbnN0YW5jZW9mIE9iamVjdD9wbi5PYmplY3Q6cG4uUHJpbWl0aXZlOnBuLlByaW1pdGl2ZX0hZnVuY3Rpb24odCl7dFt0LkFycmF5PTBdPSJBcnJheSIsdFt0Lk9iamVjdD0xXT0iT2JqZWN0Iix0W3QuUmVhZGFibGVTdHJpbmc9Ml09IlJlYWRhYmxlU3RyaW5nIix0W3QuUmVhZGFibGVPYmplY3Q9M109IlJlYWRhYmxlT2JqZWN0Iix0W3QuUHJpbWl0aXZlPTRdPSJQcmltaXRpdmUiLHRbdC5Qcm9taXNlPTVdPSJQcm9taXNlIn0ocG58fChwbj17fSkpO2xldCB2bj1bXTt2bltwbi5BcnJheV09IlsiLHZuW3BuLk9iamVjdF09InsiLHZuW3BuLlJlYWRhYmxlU3RyaW5nXT0nIicsdm5bcG4uUmVhZGFibGVPYmplY3RdPSJbIjtsZXQgYm49W107Ym5bcG4uQXJyYXldPSJdIixibltwbi5PYmplY3RdPSJ9Iixibltwbi5SZWFkYWJsZVN0cmluZ109JyInLGJuW3BuLlJlYWRhYmxlT2JqZWN0XT0iXSI7bGV0IG1uPVtdO2ZvcihsZXQgdD0wLGU9T2JqZWN0LmVudHJpZXMocG4pO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcj1lW3RdLG49clswXSxpPXJbMV07Im51bWJlciI9PXR5cGVvZiBpJiYobW5baV09InByb2Nlc3MiK24pfWZ1bmN0aW9uIHduKHQpe3JldHVybiB0LnJlcGxhY2UoZG4sKGZ1bmN0aW9uKHQpe2xldCBlPWduW3RdO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9lOiJcXHUiK3QuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikucGFkU3RhcnQoNCwiMCIpfSkpfWZ1bmN0aW9uIF9uKHQpe3JldHVybiciJyt3bih0KSsnIid9ZnVuY3Rpb24gU24odCxlKXtsZXQgcj10LnJlYWQoZSk7cmV0dXJuIG51bGw9PT1yP25ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe2xldCBuPWZ1bmN0aW9uKCl7cmV0dXJuIGUobnVsbCl9O3Qub25jZSgiZW5kIixuKSx0Lm9uY2UoImVycm9yIixyKSx0Lm9uY2UoInJlYWRhYmxlIiwoZnVuY3Rpb24oKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLG4pLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixyKSxlKHQucmVhZCgpKX0pKX0pKTpQcm9taXNlLnJlc29sdmUocil9ZnVuY3Rpb24gRW4odCl7cmV0dXJuIHQudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHluKHQpPT09cG4uUHJvbWlzZT9Fbih0KTp0fSkpfWxldCBrbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUscixuLGkpe3ZvaWQgMD09PWkmJihpPSExKTtsZXQgbz10LmNhbGwodGhpcyl8fHRoaXM7by5jeWNsZT1pLG8uc3RhY2s9W10sby5kZXB0aD0wLG8ucHVzaENhbGxlZD0hMSxvLmVuZD0hMSxvLmlzUmVhZGluZz0hMSxvLnJlYWRNb3JlPSExO2xldCBzPXR5cGVvZiBuO3JldHVybiJzdHJpbmciIT09cyYmIm51bWJlciIhPT1zfHwoby5nYXA9TnVtYmVyLmlzRmluaXRlKG4pPyIgIi5yZXBlYXQobik6biksT2JqZWN0LmFzc2lnbihvLHt2aXNpdGVkOmk/bmV3IFdlYWtNYXA6bmV3IFdlYWtTZXQscmVwbGFjZXJGdW5jdGlvbjpyIGluc3RhbmNlb2YgRnVuY3Rpb24mJnIscmVwbGFjZXJBcnJheTpBcnJheS5pc0FycmF5KHIpJiZyfSksciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYoby5yZXBsYWNlckZ1bmN0aW9uPXIpLEFycmF5LmlzQXJyYXkocikmJihvLnJlcGxhY2VyQXJyYXk9ciksby5hZGRUb1N0YWNrKGUpLG99cmV0dXJuIGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1sbih0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KHIucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyByKX0oZSx0KSxlLnByb3RvdHlwZS5jeWNsZXI9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzLnZpc2l0ZWQuZ2V0KGUpO2lmKHIpcmV0dXJueyRyZWY6cn07bGV0IG49dGhpcy5wYXRoKCk7cmV0dXJuIHZvaWQgMCE9PXQmJm4ucHVzaCh0KSxuPW4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iWyIrKE51bWJlci5pc0ludGVnZXIodCk/dDpfbih0KSkrIl0ifSkpLHRoaXMudmlzaXRlZC5zZXQoZSxuLmxlbmd0aD8iJCIrbi5qb2luKCIiKToiJCIpLGV9LGUucHJvdG90eXBlLmFkZFRvU3RhY2s9ZnVuY3Rpb24odCxlLHIsbil7bGV0IGksbyxzPXRoaXMsYT10O3RoaXMucmVwbGFjZXJGdW5jdGlvbiYmKGE9dGhpcy5yZXBsYWNlckZ1bmN0aW9uKGV8fHIsYSx0aGlzKSksYSYmYS50b0pTT04gaW5zdGFuY2VvZiBGdW5jdGlvbiYmKGE9YS50b0pTT04oKSksKGEgaW5zdGFuY2VvZiBGdW5jdGlvbnx8InN5bWJvbCI9PXR5cGVvZiB0KSYmKGE9dm9pZCAwKSx2b2lkIDAhPT1lJiZ0aGlzLnJlcGxhY2VyQXJyYXkmJih0aGlzLnJlcGxhY2VyQXJyYXkuaW5jbHVkZXMoZSl8fChhPXZvaWQgMCkpO2xldCB1PXluKGEpO2lmKChuJiZuLnR5cGU9PT1wbi5BcnJheXx8dm9pZCAwIT09YSkmJnUhPT1wbi5Qcm9taXNlJiYobiYmIW4uZmlyc3QmJnRoaXMuX3B1c2goIiwiKSxuJiYobi5maXJzdD0hMSkpLHZvaWQgMCE9PWEmJnUhPT1wbi5Qcm9taXNlJiZlJiYodGhpcy5nYXA/dGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSsnIicrd24oZSkrJyI6ICcpOnRoaXMuX3B1c2goJyInK3duKGUpKyciOicpKSx1IT09cG4uUHJpbWl0aXZlKWlmKHRoaXMuY3ljbGUpYT10aGlzLmN5Y2xlcihlfHxyLGEpLHU9eW4oYSk7ZWxzZXtpZih0aGlzLnZpc2l0ZWQuaGFzKGEpKXRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OIikse3JlYWxWYWx1ZTphLGtleTplfHxyfSk7dGhpcy52aXNpdGVkLmFkZChhKX0hZSYmcj4tMSYmdGhpcy5kZXB0aCYmdGhpcy5nYXAmJnRoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkpO2xldCBoPXZuW3VdO2gmJnRoaXMuX3B1c2goaCk7bGV0IGY9e2tleTplLGluZGV4OnIsdHlwZTp1LHBhcmVudDpuLHZhbHVlOmEsZmlyc3Q6ITB9O3JldHVybiB1PT09cG4uT2JqZWN0Pyh0aGlzLmRlcHRoKz0xLGYudW5yZWFkPU9iamVjdC5rZXlzKGEpLGYuaXNFbXB0eT0hZi51bnJlYWQubGVuZ3RoKTp1PT09cG4uQXJyYXk/KHRoaXMuZGVwdGgrPTEsZi51bnJlYWQ9YS5sZW5ndGgsZi5hcnJheUxlbmd0aD1mLnVucmVhZCxmLmlzRW1wdHk9IWYudW5yZWFkKTp1IT09cG4uUmVhZGFibGVTdHJpbmcmJnUhPT1wbi5SZWFkYWJsZU9iamVjdHx8KHRoaXMuZGVwdGgrPTEsYS5yZWFkYWJsZUVuZGVkfHwobnVsbD09PShpPWEuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLmVuZEVtaXR0ZWQpP3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiUmVhZGFibGUgU3RyZWFtIGhhcyBlbmRlZCBiZWZvcmUgaXQgd2FzIHNlcmlhbGl6ZWQuIEFsbCBzdHJlYW0gZGF0YSBoYXZlIGJlZW4gbG9zdCIpLGEsZXx8cik6KGEucmVhZGFibGVGbG93aW5nfHwobnVsbD09PShvPWEuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmZsb3dpbmcpKSYmKGEucGF1c2UoKSx0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBpcyBpbiBmbG93aW5nIG1vZGUsIGRhdGEgbWF5IGhhdmUgYmVlbiBsb3N0LiBUcnlpbmcgdG8gcGF1c2Ugc3RyZWFtLiIpLGEsZXx8cikpLGYucmVhZENvdW50PTAsYS5vbmNlKCJlbmQiLChmdW5jdGlvbigpe2YuZW5kPSEwLHMuX19yZWFkKCl9KSksYS5vbmNlKCJlcnJvciIsKGZ1bmN0aW9uKHQpe3MuZXJyb3I9ITAscy5lbWl0KCJlcnJvciIsdCl9KSkpLHRoaXMuc3RhY2sudW5zaGlmdChmKSxmfSxlLnByb3RvdHlwZS5yZW1vdmVGcm9tU3RhY2s9ZnVuY3Rpb24odCl7bGV0IGU9dC50eXBlLHI9ZT09PXBuLk9iamVjdHx8ZT09PXBuLkFycmF5fHxlPT09cG4uUmVhZGFibGVTdHJpbmd8fGU9PT1wbi5SZWFkYWJsZU9iamVjdDtlIT09cG4uUHJpbWl0aXZlJiYodGhpcy5jeWNsZXx8dGhpcy52aXNpdGVkLmRlbGV0ZSh0LnZhbHVlKSxyJiYodGhpcy5kZXB0aC09MSkpO2xldCBuPWJuW2VdO3ImJiF0LmlzRW1wdHkmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKSxuJiZ0aGlzLl9wdXNoKG4pO2xldCBpPXRoaXMuc3RhY2suaW5kZXhPZih0KTt0aGlzLnN0YWNrLnNwbGljZShpLDEpfSxlLnByb3RvdHlwZS5fcHVzaD1mdW5jdGlvbih0KXt0aGlzLnB1c2hDYWxsZWQ9ITAsdGhpcy5wdXNoKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUmVhZGFibGVPYmplY3Q9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzO2lmKCF0LmVuZClyZXR1cm4gU24odC52YWx1ZSxlKS50aGVuKChmdW5jdGlvbihlKXtudWxsIT09ZSYmKHQuZmlyc3R8fHIuX3B1c2goIiwiKSx0LmZpcnN0PSExLHIuYWRkVG9TdGFjayhlLHZvaWQgMCx0LnJlYWRDb3VudCksdC5yZWFkQ291bnQrPTEpfSkpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzT2JqZWN0PWZ1bmN0aW9uKHQpe2lmKCF0LnVucmVhZC5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IGU9dC51bnJlYWQuc2hpZnQoKSxyPXQudmFsdWVbZV07dGhpcy5hZGRUb1N0YWNrKHIsZSx2b2lkIDAsdCl9LGUucHJvdG90eXBlLnByb2Nlc3NBcnJheT1mdW5jdGlvbih0KXtsZXQgZT10LnVucmVhZDtpZighZSlyZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUZyb21TdGFjayh0KTtsZXQgcj10LmFycmF5TGVuZ3RoLWUsbj10LnZhbHVlW3JdO3QudW5yZWFkLT0xLHRoaXMuYWRkVG9TdGFjayhuLHZvaWQgMCxyLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUHJpbWl0aXZlPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQudmFsdWUpe2xldCBlLHI9dHlwZW9mIHQudmFsdWU7c3dpdGNoKHIpe2Nhc2Uic3RyaW5nIjplPV9uKHQudmFsdWUpO2JyZWFrO2Nhc2UibnVtYmVyIjplPU51bWJlci5pc0Zpbml0ZSh0LnZhbHVlKT9TdHJpbmcodC52YWx1ZSk6Im51bGwiO2JyZWFrO2Nhc2UiYm9vbGVhbiI6ZT1TdHJpbmcodC52YWx1ZSk7YnJlYWs7Y2FzZSJvYmplY3QiOnQudmFsdWV8fChlPSJudWxsIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignVW5rbm93biB0eXBlICInK3IrJyIuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpLHt2YWx1ZTp0LnZhbHVlfSl9dGhpcy5fcHVzaChlKX1lbHNlIXRoaXMuc3RhY2tbMV18fHRoaXMuc3RhY2tbMV0udHlwZSE9PXBuLkFycmF5JiZ0aGlzLnN0YWNrWzFdLnR5cGUhPT1wbi5SZWFkYWJsZU9iamVjdD90LmFkZFNlcGFyYXRvckFmdGVyRW5kPSExOnRoaXMuX3B1c2goIm51bGwiKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlU3RyaW5nPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIFNuKHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24odCl7dCYmci5fcHVzaCh3bih0LnRvU3RyaW5nKCkpKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1Byb21pc2U9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztyZXR1cm4gRW4odC52YWx1ZSkudGhlbigoZnVuY3Rpb24ocil7ZS5yZW1vdmVGcm9tU3RhY2sodCksZS5hZGRUb1N0YWNrKHIsdC5rZXksdC5pbmRleCx0LnBhcmVudCl9KSl9LGUucHJvdG90eXBlLnByb2Nlc3NTdGFja1RvcEl0ZW09ZnVuY3Rpb24odCl7bGV0IGUscj10aGlzLG49dGhpcy5zdGFja1swXTtpZighbnx8dGhpcy5lcnJvcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dHJ5e2U9dGhpc1ttbltuLnR5cGVdXShuLHQpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpLnRoZW4oKGZ1bmN0aW9uKCl7MD09PXIuc3RhY2subGVuZ3RoJiYoci5lbmQ9ITAsci5fcHVzaChudWxsKSl9KSl9LGUucHJvdG90eXBlLl9fcmVhZD1mdW5jdGlvbih0KXtsZXQgZT10aGlzO2lmKCF0aGlzLmlzUmVhZGluZyYmIXRoaXMuZXJyb3IpcmV0dXJuIHRoaXMuaXNSZWFkaW5nPSEwLHRoaXMucmVhZE1vcmU9ITEsdGhpcy5wcm9jZXNzU3RhY2tUb3BJdGVtKHQpLnRoZW4oKGZ1bmN0aW9uKCl7IWUuZW5kJiYhZS5lcnJvciYmKGUucmVhZE1vcmV8fCFlLnB1c2hDYWxsZWQpP3VyKChmdW5jdGlvbigpe2UuaXNSZWFkaW5nPSExLGUuX19yZWFkKCl9KSk6ZS5pc1JlYWRpbmc9ITF9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2UuZXJyb3I9ITAsZS5lbWl0KCJlcnJvciIsdCl9KSk7dGhpcy5yZWFkTW9yZT0hMH0sZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSExLHRoaXMuX19yZWFkKHQpfSxlLnByb3RvdHlwZS5wYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhY2subWFwKChmdW5jdGlvbih0KXtsZXQgZT10LmtleSxyPXQuaW5kZXg7cmV0dXJuIGV8fHJ9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdHx8dD4tMX0pKS5yZXZlcnNlKCl9LGV9KHBlKTt2YXIgUm49QXJyYXkuaXNBcnJheSxBbj0ib2JqZWN0Ij09dHlwZW9mIEhlJiZIZSYmSGUuT2JqZWN0PT09T2JqZWN0JiZIZSxUbj0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLE9uPUFufHxUbnx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxqbj1Pbi5TeW1ib2wsTG49T2JqZWN0LnByb3RvdHlwZSxDbj1Mbi5oYXNPd25Qcm9wZXJ0eSxQbj1Mbi50b1N0cmluZyxNbj1qbj9qbi50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIEJuPWZ1bmN0aW9uKHQpe3ZhciBlPUNuLmNhbGwodCxNbikscj10W01uXTt0cnl7dFtNbl09dm9pZCAwO3ZhciBuPSEwfWNhdGNoKHQpe312YXIgaT1Qbi5jYWxsKHQpO3JldHVybiBuJiYoZT90W01uXT1yOmRlbGV0ZSB0W01uXSksaX0seG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgVW49ZnVuY3Rpb24odCl7cmV0dXJuIHhuLmNhbGwodCl9LEluPWpuP2puLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgRG49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6SW4mJkluIGluIE9iamVjdCh0KT9Cbih0KTpVbih0KX07dmFyIE5uPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9O3ZhciBGbj1mdW5jdGlvbih0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fE5uKHQpJiYiW29iamVjdCBTeW1ib2xdIj09RG4odCl9LHpuPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLHFuPS9eXHcqJC87dmFyIFluPWZ1bmN0aW9uKHQsZSl7aWYoUm4odCkpcmV0dXJuITE7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9ciYmInN5bWJvbCIhPXImJiJib29sZWFuIiE9ciYmbnVsbCE9dCYmIUZuKHQpKXx8KHFuLnRlc3QodCl8fCF6bi50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIE9iamVjdChlKSl9O3ZhciBXbj1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX07dmFyICRuLEduPWZ1bmN0aW9uKHQpe2lmKCFXbih0KSlyZXR1cm4hMTt2YXIgZT1Ebih0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LEpuPU9uWyJfX2NvcmUtanNfc2hhcmVkX18iXSxIbj0oJG49L1teLl0rJC8uZXhlYyhKbiYmSm4ua2V5cyYmSm4ua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iKyRuOiIiO3ZhciBWbj1mdW5jdGlvbih0KXtyZXR1cm4hIUhuJiZIbiBpbiB0fSxLbj1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFpuPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gS24uY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9LFFuPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLFhuPUZ1bmN0aW9uLnByb3RvdHlwZSx0aT1PYmplY3QucHJvdG90eXBlLGVpPVhuLnRvU3RyaW5nLHJpPXRpLmhhc093blByb3BlcnR5LG5pPVJlZ0V4cCgiXiIrZWkuY2FsbChyaSkucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIGlpPWZ1bmN0aW9uKHQpe3JldHVybiEoIVduKHQpfHxWbih0KSkmJihHbih0KT9uaTpRbikudGVzdChabih0KSl9O3ZhciBvaT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfTt2YXIgc2k9ZnVuY3Rpb24odCxlKXt2YXIgcj1vaSh0LGUpO3JldHVybiBpaShyKT9yOnZvaWQgMH0sYWk9c2koT2JqZWN0LCJjcmVhdGUiKTt2YXIgdWk9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPWFpP2FpKG51bGwpOnt9LHRoaXMuc2l6ZT0wfTt2YXIgaGk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LGZpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGNpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoYWkpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gZmkuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxsaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBwaT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBhaT92b2lkIDAhPT1lW3RdOmxpLmNhbGwoZSx0KX07dmFyIGRpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1haSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBnaSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1naS5wcm90b3R5cGUuY2xlYXI9dWksZ2kucHJvdG90eXBlLmRlbGV0ZT1oaSxnaS5wcm90b3R5cGUuZ2V0PWNpLGdpLnByb3RvdHlwZS5oYXM9cGksZ2kucHJvdG90eXBlLnNldD1kaTt2YXIgeWk9Z2k7dmFyIHZpPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIGJpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfTt2YXIgbWk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5sZW5ndGg7ci0tOylpZihiaSh0W3JdWzBdLGUpKXJldHVybiByO3JldHVybi0xfSx3aT1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBfaT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9bWkoZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6d2kuY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfTt2YXIgU2k9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPW1pKGUsdCk7cmV0dXJuIHI8MD92b2lkIDA6ZVtyXVsxXX07dmFyIEVpPWZ1bmN0aW9uKHQpe3JldHVybiBtaSh0aGlzLl9fZGF0YV9fLHQpPi0xfTt2YXIga2k9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG49bWkocix0KTtyZXR1cm4gbjwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW25dWzFdPWUsdGhpc307ZnVuY3Rpb24gUmkodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19UmkucHJvdG90eXBlLmNsZWFyPXZpLFJpLnByb3RvdHlwZS5kZWxldGU9X2ksUmkucHJvdG90eXBlLmdldD1TaSxSaS5wcm90b3R5cGUuaGFzPUVpLFJpLnByb3RvdHlwZS5zZXQ9a2k7dmFyIEFpPVJpLFRpPXNpKE9uLCJNYXAiKTt2YXIgT2k9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyB5aSxtYXA6bmV3KFRpfHxBaSksc3RyaW5nOm5ldyB5aX19O3ZhciBqaT1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fTt2YXIgTGk9ZnVuY3Rpb24odCxlKXt2YXIgcj10Ll9fZGF0YV9fO3JldHVybiBqaShlKT9yWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOnIubWFwfTt2YXIgQ2k9ZnVuY3Rpb24odCl7dmFyIGU9TGkodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX07dmFyIFBpPWZ1bmN0aW9uKHQpe3JldHVybiBMaSh0aGlzLHQpLmdldCh0KX07dmFyIE1pPWZ1bmN0aW9uKHQpe3JldHVybiBMaSh0aGlzLHQpLmhhcyh0KX07dmFyIEJpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9TGkodGhpcyx0KSxuPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bj8wOjEsdGhpc307ZnVuY3Rpb24geGkodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19eGkucHJvdG90eXBlLmNsZWFyPU9pLHhpLnByb3RvdHlwZS5kZWxldGU9Q2kseGkucHJvdG90eXBlLmdldD1QaSx4aS5wcm90b3R5cGUuaGFzPU1pLHhpLnByb3RvdHlwZS5zZXQ9Qmk7dmFyIFVpPXhpO2Z1bmN0aW9uIElpKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLG4pOm5bMF0sbz1yLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgcz10LmFwcGx5KHRoaXMsbik7cmV0dXJuIHIuY2FjaGU9by5zZXQoaSxzKXx8byxzfTtyZXR1cm4gci5jYWNoZT1uZXcoSWkuQ2FjaGV8fFVpKSxyfUlpLkNhY2hlPVVpO3ZhciBEaT1JaTt2YXIgTmk9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csRmk9L1xcKFxcKT8vZyx6aT1mdW5jdGlvbih0KXt2YXIgZT1EaSh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKE5pLChmdW5jdGlvbih0LHIsbixpKXtlLnB1c2gobj9pLnJlcGxhY2UoRmksIiQxIik6cnx8dCl9KSksZX0pKTt2YXIgcWk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShuKTsrK3I8bjspaVtyXT1lKHRbcl0scix0KTtyZXR1cm4gaX0sWWk9am4/am4ucHJvdG90eXBlOnZvaWQgMCxXaT1ZaT9ZaS50b1N0cmluZzp2b2lkIDA7dmFyICRpPWZ1bmN0aW9uIHQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO2lmKFJuKGUpKXJldHVybiBxaShlLHQpKyIiO2lmKEZuKGUpKXJldHVybiBXaT9XaS5jYWxsKGUpOiIiO3ZhciByPWUrIiI7cmV0dXJuIjAiPT1yJiYxL2U9PS1JbmZpbml0eT8iLTAiOnJ9O3ZhciBHaT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjokaSh0KX07dmFyIEppPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFJuKHQpP3Q6WW4odCxlKT9bdF06emkoR2kodCkpfTt2YXIgSGk9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxGbih0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tSW5maW5pdHk/Ii0wIjplfTt2YXIgVmk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxuPShlPUppKGUsdCkpLmxlbmd0aDtudWxsIT10JiZyPG47KXQ9dFtIaShlW3IrK10pXTtyZXR1cm4gciYmcj09bj90OnZvaWQgMH07dmFyIEtpPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1udWxsPT10P3ZvaWQgMDpWaSh0LGUpO3JldHVybiB2b2lkIDA9PT1uP3I6bn07dmFyIFppPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8Tm4odCkmJiJbb2JqZWN0IE51bWJlcl0iPT1Ebih0KX07ZnVuY3Rpb24gUWkodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gWGkodCl7cmV0dXJuISghUWkodCl8fCIiPT09dCl9ZnVuY3Rpb24gdG8odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBlbyh0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBybyh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBubyh0KXtyZXR1cm4hKCFRaSh0KXx8IiIhPT10KX1mdW5jdGlvbiBpbyh0KXtyZXR1cm4hIWVvKHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZihybyh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFubyh0KXx8ISFmdW5jdGlvbih0KXtyZXR1cm4hIXRvKHQpJiYwPT09dC5sZW5ndGh9KHQpKSkpfWZ1bmN0aW9uIG9vKCl7bGV0IHQsZSxyPW5ldyBQcm9taXNlKChmdW5jdGlvbigpe3Q9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdfSkpO3JldHVybiByLnJlc29sdmU9dCxyLnJlamVjdD1lLHJ9bGV0IFdKc29uU3RyZWFtPXtwYXJzZTphc3luYyBmdW5jdGlvbih0KXtpZighWGkodCkpcmV0dXJue307bGV0IGU9e307dHJ5e2U9SlNPTi5wYXJzZSh0KX1jYXRjaCh0KXtlPXt9fXJldHVybiBlfSxwYXJzZUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPXt9O2lmKCJudWxsIj09PXQpcmV0dXJuIG51bGw7aWYoIiI9PT10KXJldHVybnt9O2xldCByPSJfX3N5c3RlbV9fIixuPWB7Il9fc3lzdGVtX18iOiR7dH19YCxpPW9vKCksbz15cihuKSxzPWNuLnBhcnNlKCIkKiIpO3JldHVybiBzLm9uKCJkYXRhIiwoZnVuY3Rpb24odCl7ZVt0LmtleV09dC52YWx1ZX0pKSxzLm9uKCJlbmQiLChmdW5jdGlvbigpe2xldCB0PUtpKGUscik7aS5yZXNvbHZlKHQpfSkpLHMub24oImVycm9yIiwoZnVuY3Rpb24odCl7aS5yZWplY3QodCl9KSksby5waXBlKHMpLGl9LGNyZWF0ZVBhcnNlU3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiBYaSh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuISghdG8odCl8fDA9PT10Lmxlbmd0aHx8MT09PXQubGVuZ3RoJiZpbyh0WzBdKSl9KHQpfHwodD0iJCoiKSxjbi5wYXJzZSh0KX0sc3RyaW5naWZ5OmFzeW5jIGZ1bmN0aW9uKHQpe2lmKGVvKHQpKXJldHVybiIiO2xldCBlPSIiO3RyeXtlPUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKHQpe2U9IiJ9cmV0dXJuIGV9LHN0cmluZ2lmeUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPSIiO2lmKGVvKHQpKXJldHVybiIiO2lmKG51bGw9PT10KXJldHVybiJudWxsIjtpZihubyh0KSlyZXR1cm4nIiInO2lmKFppKHQpKXJldHVybmAke3R9YDtpZihRaSh0KSlyZXR1cm5gIiR7dH0iYDtsZXQgcj1vbygpLG49bmV3IGtuKHQsbnVsbCxudWxsLCExKTtyZXR1cm4gbi5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UrPXR9KSksbi5vbigiZW5kIiwoZnVuY3Rpb24oKXtyLnJlc29sdmUoZSl9KSksbi5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtyLnJlamVjdCh0KX0pKSxyfSxjcmVhdGVTdHJpbmdpZnlTdHJlYW06ZnVuY3Rpb24odCl7aWYoIXJvKHQpJiYhdG8odCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXkiKTtyZXR1cm4gbmV3IGtuKHQsbnVsbCxudWxsLCExKX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0pzb25TdHJlYW0oLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0pzb25TdHJlYW0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmVjdk1lc3NhZ2UoZS5kYXRhKQogICAgICAgIH0KICAgICAgICAKCg==");function G(){var Z=l();function c(l){try{var Z=new Blob([l]),d=window.URL||window.webkitURL;return new Worker(d.createObjectURL(Z))}catch(l){I(l)}}var G=c(b);if(!G)return I("invalid worker"),null;function X(){G?(G.terminate(),G=void 0):I("worker has been terminated")}function i(){var l={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};G.postMessage(l)}function W(){var l=d(),c=m(),b={mode:"call",id:c,fun:"stringify",input:Array.prototype.slice.call(arguments)};return G.postMessage(b),Z.once(c,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function u(){var l=d(),c=m(),b={mode:"call",id:c,fun:"parse",input:Array.prototype.slice.call(arguments)};return G.postMessage(b),Z.once(c,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function y(l){var d=l,m=d.mode;"emit"!==m&&"return"!==m||("emit"===m&&Z.emit(d.evName,d.msg),"return"===m&&Z.emit(d.id,d))}function I(l){Z.emit("error",l)}return G.onmessage=function(l){y(l.data)},G.onerror=I,i(Array.prototype.slice.call(arguments)),Z.stringify=W,Z.parse=u,Z.terminate=X,Z}var X,u,y={stringify:(u=c(W.mark((function l(){var d,m,c,b=arguments;return W.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(b),m=G(),l.next=4,m.stringify.apply(m,Z(d)).finally((function(){m.terminate()}));case 4:return c=l.sent,l.abrupt("return",c);case 6:case"end":return l.stop()}}),l)}))),function(){return u.apply(this,arguments)}),parse:(X=c(W.mark((function l(){var d,m,c,b=arguments;return W.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(b),m=G(),l.next=4,m.parse.apply(m,Z(d)).finally((function(){m.terminate()}));case 4:return c=l.sent,l.abrupt("return",c);case 6:case"end":return l.stop()}}),l)}))),function(){return X.apply(this,arguments)})};for(var I in i=l(),y){var p=y[I];i[I]=p}}(),i}()}));return"undefined"!=typeof window&&void 0!==window.document?G:b}));
|
|
1
|
+
!function(l,Z){"object"==typeof exports&&"undefined"!=typeof module?module.exports=Z(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],Z):(l="undefined"!=typeof globalThis?globalThis:l||self)["w-json-stream"]=Z(l.worker_threads)}(this,(function(l){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Z={};!function(Z,d){Z.exports=function(l){var Z={};!function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function b(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function c(l,Z,m,c,G){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new b(m,c||l,G),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 G(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,b=[];if(0===this._eventsCount)return b;for(m in l=this._events)Z.call(l,m)&&b.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?b.concat(Object.getOwnPropertySymbols(l)):b},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 b=0,c=m.length,G=new Array(c);b<c;b++)G[b]=m[b].fn;return G},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,b,c,G){var X=d?d+l:l;if(!this._events[X])return!1;var W,y,i=this._events[X],I=arguments.length;if(i.fn){switch(i.once&&this.removeListener(l,i.fn,void 0,!0),I){case 1:return i.fn.call(i.context),!0;case 2:return i.fn.call(i.context,Z),!0;case 3:return i.fn.call(i.context,Z,m),!0;case 4:return i.fn.call(i.context,Z,m,b),!0;case 5:return i.fn.call(i.context,Z,m,b,c),!0;case 6:return i.fn.call(i.context,Z,m,b,c,G),!0}for(y=1,W=new Array(I-1);y<I;y++)W[y-1]=arguments[y];i.fn.apply(i.context,W)}else{var V,u=i.length;for(y=0;y<u;y++)switch(i[y].once&&this.removeListener(l,i[y].fn,void 0,!0),I){case 1:i[y].fn.call(i[y].context);break;case 2:i[y].fn.call(i[y].context,Z);break;case 3:i[y].fn.call(i[y].context,Z,m);break;case 4:i[y].fn.call(i[y].context,Z,m,b);break;default:if(!W)for(V=1,W=new Array(I-1);V<I;V++)W[V-1]=arguments[V];i[y].fn.apply(i[y].context,W)}}return!0},X.prototype.on=function(l,Z,d){return c(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return c(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,b){var c=d?d+l:l;if(!this._events[c])return this;if(!Z)return G(this,c),this;var X=this._events[c];if(X.fn)X.fn!==Z||b&&!X.once||m&&X.context!==m||G(this,c);else{for(var W=0,y=[],i=X.length;W<i;W++)(X[W].fn!==Z||b&&!X[W].once||m&&X[W].context!==m)&&y.push(X[W]);y.length?this._events[c]=1===y.length?y[0]:y:G(this,c)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&G(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}({get exports(){return Z},set exports(l){Z=l}});var d=Z;let m;return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function Z(){return new d}function b(){let l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function c(){let l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length;for(let b=0;b<l;b++)Z[b]=d[0|Math.random()*m];return Z.join("")}let G=(X="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCmZ1bmN0aW9uIHQoKXt9ZnVuY3Rpb24gZSgpe2UuaW5pdC5jYWxsKHRoaXMpfWZ1bmN0aW9uIHIodCl7cmV0dXJuIHZvaWQgMD09PXQuX21heExpc3RlbmVycz9lLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfWZ1bmN0aW9uIG4oZSxuLGksbyl7dmFyIHMsYSx1LGg7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtpZigoYT1lLl9ldmVudHMpPyhhLm5ld0xpc3RlbmVyJiYoZS5lbWl0KCJuZXdMaXN0ZW5lciIsbixpLmxpc3RlbmVyP2kubGlzdGVuZXI6aSksYT1lLl9ldmVudHMpLHU9YVtuXSk6KGE9ZS5fZXZlbnRzPW5ldyB0LGUuX2V2ZW50c0NvdW50PTApLHUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB1P3U9YVtuXT1vP1tpLHVdOlt1LGldOm8/dS51bnNoaWZ0KGkpOnUucHVzaChpKSwhdS53YXJuZWQmJihzPXIoZSkpJiZzPjAmJnUubGVuZ3RoPnMpe3Uud2FybmVkPSEwO3ZhciBmPW5ldyBFcnJvcigiUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAiK3UubGVuZ3RoKyIgIituKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2YubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixmLmVtaXR0ZXI9ZSxmLnR5cGU9bixmLmNvdW50PXUubGVuZ3RoLGg9ZiwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS53YXJuP2NvbnNvbGUud2FybihoKTpjb25zb2xlLmxvZyhoKX19ZWxzZSB1PWFbbl09aSwrK2UuX2V2ZW50c0NvdW50O3JldHVybiBlfWZ1bmN0aW9uIGkodCxlLHIpe3ZhciBuPSExO2Z1bmN0aW9uIGkoKXt0LnJlbW92ZUxpc3RlbmVyKGUsaSksbnx8KG49ITAsci5hcHBseSh0LGFyZ3VtZW50cykpfXJldHVybiBpLmxpc3RlbmVyPXIsaX1mdW5jdGlvbiBvKHQpe3ZhciBlPXRoaXMuX2V2ZW50cztpZihlKXt2YXIgcj1lW3RdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByKXJldHVybiAxO2lmKHIpcmV0dXJuIHIubGVuZ3RofXJldHVybiAwfWZ1bmN0aW9uIHModCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT10W2VdO3JldHVybiByfXQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobnVsbCksZS5FdmVudEVtaXR0ZXI9ZSxlLnVzaW5nRG9tYWlucz0hMSxlLnByb3RvdHlwZS5kb21haW49dm9pZCAwLGUucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLGUucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLGUuZGVmYXVsdE1heExpc3RlbmVycz0xMCxlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmRvbWFpbj1udWxsLGUudXNpbmdEb21haW5zJiZ1bmRlZmluZWQuYWN0aXZlLHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9bmV3IHQsdGhpcy5fZXZlbnRzQ291bnQ9MCksdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfSxlLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0fHx0PDB8fGlzTmFOKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJuIiBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9LGUucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiByKHRoaXMpfSxlLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8sYSx1LGg9ImVycm9yIj09PXQ7aWYoYT10aGlzLl9ldmVudHMpaD1oJiZudWxsPT1hLmVycm9yO2Vsc2UgaWYoIWgpcmV0dXJuITE7aWYodT10aGlzLmRvbWFpbixoKXtpZihlPWFyZ3VtZW50c1sxXSwhdSl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGU7dmFyIGY9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudC4gKCcrZSsiKSIpO3Rocm93IGYuY29udGV4dD1lLGZ9cmV0dXJuIGV8fChlPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQnKSksZS5kb21haW5FbWl0dGVyPXRoaXMsZS5kb21haW49dSxlLmRvbWFpblRocm93bj0hMSx1LmVtaXQoImVycm9yIixlKSwhMX1pZighKHI9YVt0XSkpcmV0dXJuITE7dmFyIGM9ImZ1bmN0aW9uIj09dHlwZW9mIHI7c3dpdGNoKG49YXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOiFmdW5jdGlvbih0LGUscil7aWYoZSl0LmNhbGwocik7ZWxzZSBmb3IodmFyIG49dC5sZW5ndGgsaT1zKHQsbiksbz0wO288bjsrK28paVtvXS5jYWxsKHIpfShyLGMsdGhpcyk7YnJlYWs7Y2FzZSAyOiFmdW5jdGlvbih0LGUscixuKXtpZihlKXQuY2FsbChyLG4pO2Vsc2UgZm9yKHZhciBpPXQubGVuZ3RoLG89cyh0LGkpLGE9MDthPGk7KythKW9bYV0uY2FsbChyLG4pfShyLGMsdGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzohZnVuY3Rpb24odCxlLHIsbixpKXtpZihlKXQuY2FsbChyLG4saSk7ZWxzZSBmb3IodmFyIG89dC5sZW5ndGgsYT1zKHQsbyksdT0wO3U8bzsrK3UpYVt1XS5jYWxsKHIsbixpKX0ocixjLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7YnJlYWs7Y2FzZSA0OiFmdW5jdGlvbih0LGUscixuLGksbyl7aWYoZSl0LmNhbGwocixuLGksbyk7ZWxzZSBmb3IodmFyIGE9dC5sZW5ndGgsdT1zKHQsYSksaD0wO2g8YTsrK2gpdVtoXS5jYWxsKHIsbixpLG8pfShyLGMsdGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSk7YnJlYWs7ZGVmYXVsdDpmb3IoaT1uZXcgQXJyYXkobi0xKSxvPTE7bzxuO28rKylpW28tMV09YXJndW1lbnRzW29dOyFmdW5jdGlvbih0LGUscixuKXtpZihlKXQuYXBwbHkocixuKTtlbHNlIGZvcih2YXIgaT10Lmxlbmd0aCxvPXModCxpKSxhPTA7YTxpOysrYSlvW2FdLmFwcGx5KHIsbil9KHIsYyx0aGlzLGkpfXJldHVybiEwfSxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHRoaXMsdCxlLCExKX0sZS5wcm90b3R5cGUub249ZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIsZS5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odGhpcyx0LGUsITApfSxlLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5vbih0LGkodGhpcyx0LGUpKSx0aGlzfSxlLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5wcmVwZW5kTGlzdGVuZXIodCxpKHRoaXMsdCxlKSksdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSxyKXt2YXIgbixpLG8scyxhO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7aWYoIShpPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYoIShuPWlbZV0pKXJldHVybiB0aGlzO2lmKG49PT1yfHxuLmxpc3RlbmVyJiZuLmxpc3RlbmVyPT09cikwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgdDooZGVsZXRlIGlbZV0saS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsZSxuLmxpc3RlbmVyfHxyKSk7ZWxzZSBpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil7Zm9yKG89LTEscz1uLmxlbmd0aDtzLS0gPjA7KWlmKG5bc109PT1yfHxuW3NdLmxpc3RlbmVyJiZuW3NdLmxpc3RlbmVyPT09cil7YT1uW3NdLmxpc3RlbmVyLG89czticmVha31pZihvPDApcmV0dXJuIHRoaXM7aWYoMT09PW4ubGVuZ3RoKXtpZihuWzBdPXZvaWQgMCwwPT0tLXRoaXMuX2V2ZW50c0NvdW50KXJldHVybiB0aGlzLl9ldmVudHM9bmV3IHQsdGhpcztkZWxldGUgaVtlXX1lbHNlIWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWUsbj1yKzEsaT10Lmxlbmd0aDtuPGk7cis9MSxuKz0xKXRbcl09dFtuXTt0LnBvcCgpfShuLG8pO2kucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsYXx8cil9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgcixuO2lmKCEobj10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKCFuLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZXZlbnRzPW5ldyB0LHRoaXMuX2V2ZW50c0NvdW50PTApOm5bZV0mJigwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgdDpkZWxldGUgbltlXSksdGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBpLG89T2JqZWN0LmtleXMobikscz0wO3M8by5sZW5ndGg7KytzKSJyZW1vdmVMaXN0ZW5lciIhPT0oaT1vW3NdKSYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoaSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoImZ1bmN0aW9uIj09dHlwZW9mKHI9bltlXSkpdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHIpO2Vsc2UgaWYocilkb3t0aGlzLnJlbW92ZUxpc3RlbmVyKGUscltyLmxlbmd0aC0xXSl9d2hpbGUoclswXSk7cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyPXRoaXMuX2V2ZW50cztyZXR1cm4gciYmKGU9clt0XSk/ImZ1bmN0aW9uIj09dHlwZW9mIGU/W2UubGlzdGVuZXJ8fGVdOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9MDtyPGUubGVuZ3RoOysrcillW3JdPXRbcl0ubGlzdGVuZXJ8fHRbcl07cmV0dXJuIGV9KGUpOltdfSxlLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5saXN0ZW5lckNvdW50P3QubGlzdGVuZXJDb3VudChlKTpvLmNhbGwodCxlKX0sZS5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1vLGUucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9SZWZsZWN0Lm93bktleXModGhpcy5fZXZlbnRzKTpbXX07dmFyIGE9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSx1PVtdLGg9W10sZj0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxjPSExO2Z1bmN0aW9uIGwoKXtjPSEwO2Zvcih2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl1W2VdPXRbZV0saFt0LmNoYXJDb2RlQXQoZSldPWU7aFsiLSIuY2hhckNvZGVBdCgwKV09NjIsaFsiXyIuY2hhckNvZGVBdCgwKV09NjN9ZnVuY3Rpb24gcCh0LGUscil7Zm9yKHZhciBuLGksbz1bXSxzPWU7czxyO3MrPTMpbj0odFtzXTw8MTYpKyh0W3MrMV08PDgpK3RbcysyXSxvLnB1c2godVsoaT1uKT4+MTgmNjNdK3VbaT4+MTImNjNdK3VbaT4+NiY2M10rdVs2MyZpXSk7cmV0dXJuIG8uam9pbigiIil9ZnVuY3Rpb24gZCh0KXt2YXIgZTtjfHxsKCk7Zm9yKHZhciByPXQubGVuZ3RoLG49ciUzLGk9IiIsbz1bXSxzPTE2MzgzLGE9MCxoPXItbjthPGg7YSs9cylvLnB1c2gocCh0LGEsYStzPmg/aDphK3MpKTtyZXR1cm4gMT09PW4/KGU9dFtyLTFdLGkrPXVbZT4+Ml0saSs9dVtlPDw0JjYzXSxpKz0iPT0iKToyPT09biYmKGU9KHRbci0yXTw8OCkrdFtyLTFdLGkrPXVbZT4+MTBdLGkrPXVbZT4+NCY2M10saSs9dVtlPDwyJjYzXSxpKz0iPSIpLG8ucHVzaChpKSxvLmpvaW4oIiIpfWZ1bmN0aW9uIGcodCxlLHIsbixpKXt2YXIgbyxzLGE9OCppLW4tMSx1PSgxPDxhKS0xLGg9dT4+MSxmPS03LGM9cj9pLTE6MCxsPXI/LTE6MSxwPXRbZStjXTtmb3IoYys9bCxvPXAmKDE8PC1mKS0xLHA+Pj0tZixmKz1hO2Y+MDtvPTI1NipvK3RbZStjXSxjKz1sLGYtPTgpO2ZvcihzPW8mKDE8PC1mKS0xLG8+Pj0tZixmKz1uO2Y+MDtzPTI1NipzK3RbZStjXSxjKz1sLGYtPTgpO2lmKDA9PT1vKW89MS1oO2Vsc2V7aWYobz09PXUpcmV0dXJuIHM/TmFOOjEvMCoocD8tMToxKTtzKz1NYXRoLnBvdygyLG4pLG8tPWh9cmV0dXJuKHA/LTE6MSkqcypNYXRoLnBvdygyLG8tbil9ZnVuY3Rpb24geSh0LGUscixuLGksbyl7dmFyIHMsYSx1LGg9OCpvLWktMSxmPSgxPDxoKS0xLGM9Zj4+MSxsPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAscD1uPzA6by0xLGQ9bj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhhPWlzTmFOKGUpPzE6MCxzPWYpOihzPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MiksKGUrPXMrYz49MT9sL3U6bCpNYXRoLnBvdygyLDEtYykpKnU+PTImJihzKyssdS89MikscytjPj1mPyhhPTAscz1mKTpzK2M+PTE/KGE9KGUqdS0xKSpNYXRoLnBvdygyLGkpLHMrPWMpOihhPWUqTWF0aC5wb3coMixjLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODt0W3IrcF09MjU1JmEscCs9ZCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLGgrPWk7aD4wO3RbcitwXT0yNTUmcyxwKz1kLHMvPTI1NixoLT04KTt0W3IrcC1kXXw9MTI4Kmd9dmFyIHY9e30udG9TdHJpbmcsYj1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT12LmNhbGwodCl9O2Z1bmN0aW9uIG0oKXtyZXR1cm4gXy5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiB3KHQsZSl7aWYobSgpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPV8ucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IF8oZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gXyh0LGUscil7aWYoIShfLlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBfKSlyZXR1cm4gbmV3IF8odCxlLHIpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gayh0aGlzLHQpfXJldHVybiBTKHRoaXMsdCxlLHIpfWZ1bmN0aW9uIFModCxlLHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLHIsbil7aWYoZS5ieXRlTGVuZ3RoLHI8MHx8ZS5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlLHIpOm5ldyBVaW50OEFycmF5KGUscixuKTtfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPV8ucHJvdG90eXBlOnQ9Uih0LGUpO3JldHVybiB0fSh0LGUscixuKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLHIpeyJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpO2lmKCFfLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIG49MHxPKGUscik7dD13KHQsbik7dmFyIGk9dC53cml0ZShlLHIpO2khPT1uJiYodD10LnNsaWNlKDAsaSkpO3JldHVybiB0fSh0LGUscik6ZnVuY3Rpb24odCxlKXtpZihUKGUpKXt2YXIgcj0wfEEoZS5sZW5ndGgpO3JldHVybiAwPT09KHQ9dyh0LHIpKS5sZW5ndGh8fGUuY29weSh0LDAsMCxyKSx0fWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwobj1lLmxlbmd0aCkhPW4/dyh0LDApOlIodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmYihlLmRhdGEpKXJldHVybiBSKHQsZS5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gRSh0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGsodCxlKXtpZihFKGUpLHQ9dyh0LGU8MD8wOjB8QShlKSksIV8uVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPGU7KytyKXRbcl09MDtyZXR1cm4gdH1mdW5jdGlvbiBSKHQsZSl7dmFyIHI9ZS5sZW5ndGg8MD8wOjB8QShlLmxlbmd0aCk7dD13KHQscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpdFtuXT0yNTUmZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBBKHQpe2lmKHQ+PW0oKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrbSgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBUKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX1mdW5jdGlvbiBPKHQsZSl7aWYoVCh0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIHI9dC5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gZXQodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBydCh0KS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBldCh0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBqKHQsZSxyKXt2YXIgbj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09cnx8cj50aGlzLmxlbmd0aCkmJihyPXRoaXMubGVuZ3RoKSxyPD0wKXJldHVybiIiO2lmKChyPj4+PTApPD0oZT4+Pj0wKSlyZXR1cm4iIjtmb3IodHx8KHQ9InV0ZjgiKTs7KXN3aXRjaCh0KXtjYXNlImhleCI6cmV0dXJuIFcodGhpcyxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIEYodGhpcyxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBxKHRoaXMsZSxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBZKHRoaXMsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIE4odGhpcyxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gJCh0aGlzLGUscik7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7dD0odCsiIikudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBMKHQsZSxyKXt2YXIgbj10W2VdO3RbZV09dFtyXSx0W3JdPW59ZnVuY3Rpb24gQyh0LGUscixuLGkpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDp0Lmxlbmd0aC0xKSxyPDAmJihyPXQubGVuZ3RoK3IpLHI+PXQubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9dC5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9Xy5mcm9tKGUsbikpLFQoZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTpQKHQsZSxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsXy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUscik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUscik6UCh0LFtlXSxyLG4saSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gUCh0LGUscixuLGkpe3ZhciBvLHM9MSxhPXQubGVuZ3RoLHU9ZS5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89Mix1Lz0yLHIvPTJ9ZnVuY3Rpb24gaCh0LGUpe3JldHVybiAxPT09cz90W2VdOnQucmVhZFVJbnQxNkJFKGUqcyl9aWYoaSl7dmFyIGY9LTE7Zm9yKG89cjtvPGE7bysrKWlmKGgodCxvKT09PWgoZSwtMT09PWY/MDpvLWYpKXtpZigtMT09PWYmJihmPW8pLG8tZisxPT09dSlyZXR1cm4gZipzfWVsc2UtMSE9PWYmJihvLT1vLWYpLGY9LTF9ZWxzZSBmb3Iocit1PmEmJihyPWEtdSksbz1yO28+PTA7by0tKXtmb3IodmFyIGM9ITAsbD0wO2w8dTtsKyspaWYoaCh0LG8rbCkhPT1oKGUsbCkpe2M9ITE7YnJlYWt9aWYoYylyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiBNKHQsZSxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBpPXQubGVuZ3RoLXI7bj8obj1OdW1iZXIobikpPmkmJihuPWkpOm49aTt2YXIgbz1lLmxlbmd0aDtpZihvJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5vLzImJihuPW8vMik7Zm9yKHZhciBzPTA7czxuOysrcyl7dmFyIGE9cGFyc2VJbnQoZS5zdWJzdHIoMipzLDIpLDE2KTtpZihpc05hTihhKSlyZXR1cm4gczt0W3Irc109YX1yZXR1cm4gc31mdW5jdGlvbiBCKHQsZSxyLG4pe3JldHVybiBudChldChlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiB4KHQsZSxyLG4pe3JldHVybiBudChmdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gZX0oZSksdCxyLG4pfWZ1bmN0aW9uIFUodCxlLHIsbil7cmV0dXJuIHgodCxlLHIsbil9ZnVuY3Rpb24gSSh0LGUscixuKXtyZXR1cm4gbnQocnQoZSksdCxyLG4pfWZ1bmN0aW9uIEQodCxlLHIsbil7cmV0dXJuIG50KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG4saSxvPVtdLHM9MDtzPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK3Mpbj0ocj10LmNoYXJDb2RlQXQocykpPj44LGk9ciUyNTYsby5wdXNoKGkpLG8ucHVzaChuKTtyZXR1cm4gb30oZSx0Lmxlbmd0aC1yKSx0LHIsbil9ZnVuY3Rpb24gTih0LGUscil7cmV0dXJuIDA9PT1lJiZyPT09dC5sZW5ndGg/ZCh0KTpkKHQuc2xpY2UoZSxyKSl9ZnVuY3Rpb24gRih0LGUscil7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIG49W10saT1lO2k8cjspe3ZhciBvLHMsYSx1LGg9dFtpXSxmPW51bGwsYz1oPjIzOT80Omg+MjIzPzM6aD4xOTE/MjoxO2lmKGkrYzw9cilzd2l0Y2goYyl7Y2FzZSAxOmg8MTI4JiYoZj1oKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPXRbaSsxXSkpJiYodT0oMzEmaCk8PDZ8NjMmbyk+MTI3JiYoZj11KTticmVhaztjYXNlIDM6bz10W2krMV0scz10W2krMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJih1PSgxNSZoKTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGY9dSk7YnJlYWs7Y2FzZSA0Om89dFtpKzFdLHM9dFtpKzJdLGE9dFtpKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJih1PSgxNSZoKTw8MTh8KDYzJm8pPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJnU8MTExNDExMiYmKGY9dSl9bnVsbD09PWY/KGY9NjU1MzMsYz0xKTpmPjY1NTM1JiYoZi09NjU1MzYsbi5wdXNoKGY+Pj4xMCYxMDIzfDU1Mjk2KSxmPTU2MzIwfDEwMjMmZiksbi5wdXNoKGYpLGkrPWN9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PXopcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciByPSIiLG49MDtmb3IoO248ZTspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShuLG4rPXopKTtyZXR1cm4gcn0obil9Xy5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMD09PWEuVFlQRURfQVJSQVlfU1VQUE9SVHx8YS5UWVBFRF9BUlJBWV9TVVBQT1JULG0oKSxfLnBvb2xTaXplPTgxOTIsXy5fYXVnbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX189Xy5wcm90b3R5cGUsdH0sXy5mcm9tPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUyhudWxsLHQsZSxyKX0sXy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoXy5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLF8uX19wcm90b19fPVVpbnQ4QXJyYXkpLF8uYWxsb2M9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBmdW5jdGlvbih0LGUscixuKXtyZXR1cm4gRShlKSxlPD0wP3codCxlKTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj93KHQsZSkuZmlsbChyLG4pOncodCxlKS5maWxsKHIpOncodCxlKX0obnVsbCx0LGUscil9LF8uYWxsb2NVbnNhZmU9ZnVuY3Rpb24odCl7cmV0dXJuIGsobnVsbCx0KX0sXy5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGsobnVsbCx0KX0sXy5pc0J1ZmZlcj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmKCEhdC5faXNCdWZmZXJ8fGl0KHQpfHxmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuc2xpY2UmJml0KHQuc2xpY2UoMCwwKSl9KHQpKX0sXy5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYoIVQodCl8fCFUKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIHI9dC5sZW5ndGgsbj1lLmxlbmd0aCxpPTAsbz1NYXRoLm1pbihyLG4pO2k8bzsrK2kpaWYodFtpXSE9PWVbaV0pe3I9dFtpXSxuPWVbaV07YnJlYWt9cmV0dXJuIHI8bj8tMTpuPHI/MTowfSxfLmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LF8uY29uY2F0PWZ1bmN0aW9uKHQsZSl7aWYoIWIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gXy5hbGxvYygwKTt2YXIgcjtpZih2b2lkIDA9PT1lKWZvcihlPTAscj0wO3I8dC5sZW5ndGg7KytyKWUrPXRbcl0ubGVuZ3RoO3ZhciBuPV8uYWxsb2NVbnNhZmUoZSksaT0wO2ZvcihyPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBvPXRbcl07aWYoIVQobykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO28uY29weShuLGkpLGkrPW8ubGVuZ3RofXJldHVybiBufSxfLmJ5dGVMZW5ndGg9TyxfLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsXy5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKUwodGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LF8ucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9NClMKHRoaXMsZSxlKzMpLEwodGhpcyxlKzEsZSsyKTtyZXR1cm4gdGhpc30sXy5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz04KUwodGhpcyxlLGUrNyksTCh0aGlzLGUrMSxlKzYpLEwodGhpcyxlKzIsZSs1KSxMKHRoaXMsZSszLGUrNCk7cmV0dXJuIHRoaXN9LF8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PXQ/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/Rih0aGlzLDAsdCk6ai5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF8ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighVCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT10fHwwPT09Xy5jb21wYXJlKHRoaXMsdCl9LF8ucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgdD0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKHQ9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJih0Kz0iIC4uLiAiKSksIjxCdWZmZXIgIit0KyI+In0sXy5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUscixuLGkpe2lmKCFUKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10P3QubGVuZ3RoOjApLHZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PWkmJihpPXRoaXMubGVuZ3RoKSxlPDB8fHI+dC5sZW5ndGh8fG48MHx8aT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobj49aSYmZT49cilyZXR1cm4gMDtpZihuPj1pKXJldHVybi0xO2lmKGU+PXIpcmV0dXJuIDE7aWYodGhpcz09PXQpcmV0dXJuIDA7Zm9yKHZhciBvPShpPj4+PTApLShuPj4+PTApLHM9KHI+Pj49MCktKGU+Pj49MCksYT1NYXRoLm1pbihvLHMpLHU9dGhpcy5zbGljZShuLGkpLGg9dC5zbGljZShlLHIpLGY9MDtmPGE7KytmKWlmKHVbZl0hPT1oW2ZdKXtvPXVbZl0scz1oW2ZdO2JyZWFrfXJldHVybiBvPHM/LTE6czxvPzE6MH0sXy5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCxlLHIpe3JldHVybi0xIT09dGhpcy5pbmRleE9mKHQsZSxyKX0sXy5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0LGUscil7cmV0dXJuIEModGhpcyx0LGUsciwhMCl9LF8ucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQyh0aGlzLHQsZSxyLCExKX0sXy5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIsbil7aWYodm9pZCAwPT09ZSluPSJ1dGY4IixyPXRoaXMubGVuZ3RoLGU9MDtlbHNlIGlmKHZvaWQgMD09PXImJiJzdHJpbmciPT10eXBlb2YgZSluPWUscj10aGlzLmxlbmd0aCxlPTA7ZWxzZXtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO2V8PTAsaXNGaW5pdGUocik/KHJ8PTAsdm9pZCAwPT09biYmKG49InV0ZjgiKSk6KG49cixyPXZvaWQgMCl9dmFyIGk9dGhpcy5sZW5ndGgtZTtpZigodm9pZCAwPT09cnx8cj5pKSYmKHI9aSksdC5sZW5ndGg+MCYmKHI8MHx8ZTwwKXx8ZT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtufHwobj0idXRmOCIpO2Zvcih2YXIgbz0hMTs7KXN3aXRjaChuKXtjYXNlImhleCI6cmV0dXJuIE0odGhpcyx0LGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gQih0aGlzLHQsZSxyKTtjYXNlImFzY2lpIjpyZXR1cm4geCh0aGlzLHQsZSxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBVKHRoaXMsdCxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gSSh0aGlzLHQsZSxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEQodGhpcyx0LGUscik7ZGVmYXVsdDppZihvKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbik7bj0oIiIrbikudG9Mb3dlckNhc2UoKSxvPSEwfX0sXy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgej00MDk2O2Z1bmN0aW9uIHEodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBZKHQsZSxyKXt2YXIgbj0iIjtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgaT1lO2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBXKHQsZSxyKXt2YXIgbj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsbz1lO288cjsrK28paSs9dHQodFtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gJCh0LGUscil7Zm9yKHZhciBuPXQuc2xpY2UoZSxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIEcodCxlLHIpe2lmKHQlMSE9MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIEoodCxlLHIsbixpLG8pe2lmKCFUKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPml8fGU8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBIKHQsZSxyLG4pe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKHQubGVuZ3RoLXIsMik7aTxvOysraSl0W3IraV09KGUmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBWKHQsZSxyLG4pe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciw0KTtpPG87KytpKXRbcitpXT1lPj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIEsodCxlLHIsbixpLG8pe2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBaKHQsZSxyLG4saSl7cmV0dXJuIGl8fEsodCwwLHIsNCkseSh0LGUscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBRKHQsZSxyLG4saSl7cmV0dXJuIGl8fEsodCwwLHIsOCkseSh0LGUscixuLDUyLDgpLHIrOH1fLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKHQ9fn50KTwwPyh0Kz1uKTwwJiYodD0wKTp0Pm4mJih0PW4pLChlPXZvaWQgMD09PWU/bjp+fmUpPDA/KGUrPW4pPDAmJihlPTApOmU+biYmKGU9biksZTx0JiYoZT10KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQpKHI9dGhpcy5zdWJhcnJheSh0LGUpKS5fX3Byb3RvX189Xy5wcm90b3R5cGU7ZWxzZXt2YXIgaT1lLXQ7cj1uZXcgXyhpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbylyW29dPXRoaXNbbyt0XX1yZXR1cm4gcn0sXy5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEcodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG59LF8ucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxHKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdCstLWVdLGk9MTtlPjAmJihpKj0yNTYpOyluKz10aGlzW3QrLS1lXSppO3JldHVybiBufSxfLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDEsdGhpcy5sZW5ndGgpLHRoaXNbdF19LF8ucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh9LF8ucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XTw8OHx0aGlzW3QrMV19LF8ucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsNCx0aGlzLmxlbmd0aCksKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbdCszXX0sXy5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW3RdKyh0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM10pfSxfLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxHKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdF0saT0xLG89MDsrK288ZSYmKGkqPTI1Nik7KW4rPXRoaXNbdCtvXSppO3JldHVybiBuPj0oaSo9MTI4KSYmKG4tPU1hdGgucG93KDIsOCplKSksbn0sXy5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Ryh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj1lLGk9MSxvPXRoaXNbdCstLW5dO24+MCYmKGkqPTI1Nik7KW8rPXRoaXNbdCstLW5dKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KmUpKSxvfSxfLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbdF0/LTEqKDI1NS10aGlzW3RdKzEpOnRoaXNbdF19LF8ucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7ZXx8Ryh0LDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbdF18dGhpc1t0KzFdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxfLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbih0LGUpe2V8fEcodCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3QrMV18dGhpc1t0XTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sXy5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTZ8dGhpc1t0KzNdPDwyNH0sXy5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDI0fHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXX0sXy5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDQsdGhpcy5sZW5ndGgpLGcodGhpcyx0LCEwLDIzLDQpfSxfLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsNCx0aGlzLmxlbmd0aCksZyh0aGlzLHQsITEsMjMsNCl9LF8ucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsOCx0aGlzLmxlbmd0aCksZyh0aGlzLHQsITAsNTIsOCl9LF8ucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsOCx0aGlzLmxlbmd0aCksZyh0aGlzLHQsITEsNTIsOCl9LF8ucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKHQsZSxyLG4peyh0PSt0LGV8PTAscnw9MCxuKXx8Sih0aGlzLHQsZSxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPTEsbz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxyJiYoaSo9MjU2KTspdGhpc1tlK29dPXQvaSYyNTU7cmV0dXJuIGUrcn0sXy5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7KHQ9K3QsZXw9MCxyfD0wLG4pfHxKKHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9ci0xLG89MTtmb3IodGhpc1tlK2ldPTI1NSZ0Oy0taT49MCYmKG8qPTI1Nik7KXRoaXNbZStpXT10L28mMjU1O3JldHVybiBlK3J9LF8ucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSwxLDI1NSwwKSxfLlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHRoaXNbZV09MjU1JnQsZSsxfSxfLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsMiw2NTUzNSwwKSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpIKHRoaXMsdCxlLCEwKSxlKzJ9LF8ucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSwyLDY1NTM1LDApLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkgodGhpcyx0LGUsITEpLGUrMn0sXy5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCk6Vih0aGlzLHQsZSwhMCksZSs0fSxfLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpWKHRoaXMsdCxlLCExKSxlKzR9LF8ucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtKKHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgbz0wLHM9MSxhPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihzKj0yNTYpOyl0PDAmJjA9PT1hJiYwIT09dGhpc1tlK28tMV0mJihhPTEpLHRoaXNbZStvXT0odC9zPj4wKS1hJjI1NTtyZXR1cm4gZStyfSxfLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7Sih0aGlzLHQsZSxyLGktMSwtaSl9dmFyIG89ci0xLHM9MSxhPTA7Zm9yKHRoaXNbZStvXT0yNTUmdDstLW8+PTAmJihzKj0yNTYpOyl0PDAmJjA9PT1hJiYwIT09dGhpc1tlK28rMV0mJihhPTEpLHRoaXNbZStvXT0odC9zPj4wKS1hJjI1NTtyZXR1cm4gZStyfSxfLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSwxLDEyNywtMTI4KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHQ8MCYmKHQ9MjU1K3QrMSksdGhpc1tlXT0yNTUmdCxlKzF9LF8ucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpIKHRoaXMsdCxlLCEwKSxlKzJ9LF8ucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpIKHRoaXMsdCxlLCExKSxlKzJ9LF8ucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksXy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQpOlYodGhpcyx0LGUsITApLGUrNH0sXy5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6Vih0aGlzLHQsZSwhMSksZSs0fSxfLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBaKHRoaXMsdCxlLCEwLHIpfSxfLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBaKHRoaXMsdCxlLCExLHIpfSxfLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUSh0aGlzLHQsZSwhMCxyKX0sXy5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFEodGhpcyx0LGUsITEscil9LF8ucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLHIsbil7aWYocnx8KHI9MCksbnx8MD09PW58fChuPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLG4+MCYmbjxyJiYobj1yKSxuPT09cilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDB8fHI+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO24+dGhpcy5sZW5ndGgmJihuPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPG4tciYmKG49dC5sZW5ndGgtZStyKTt2YXIgaSxvPW4tcjtpZih0aGlzPT09dCYmcjxlJiZlPG4pZm9yKGk9by0xO2k+PTA7LS1pKXRbaStlXT10aGlzW2krcl07ZWxzZSBpZihvPDFlM3x8IV8uVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpdFtpK2VdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShyLHIrbyksZSk7cmV0dXJuIG99LF8ucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KG49ZSxlPTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIGk9dC5jaGFyQ29kZUF0KDApO2k8MjU2JiYodD1pKX1pZih2b2lkIDAhPT1uJiYic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIV8uaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocjw9ZSlyZXR1cm4gdGhpczt2YXIgbztpZihlPj4+PTAscj12b2lkIDA9PT1yP3RoaXMubGVuZ3RoOnI+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3Iobz1lO288cjsrK28pdGhpc1tvXT10O2Vsc2V7dmFyIHM9VCh0KT90OmV0KG5ldyBfKHQsbikudG9TdHJpbmcoKSksYT1zLmxlbmd0aDtmb3Iobz0wO288ci1lOysrbyl0aGlzW28rZV09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgWD0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiB0dCh0KXtyZXR1cm4gdDwxNj8iMCIrdC50b1N0cmluZygxNik6dC50b1N0cmluZygxNil9ZnVuY3Rpb24gZXQodCxlKXt2YXIgcjtlPWV8fDEvMDtmb3IodmFyIG49dC5sZW5ndGgsaT1udWxsLG89W10scz0wO3M8bjsrK3Mpe2lmKChyPXQuY2hhckNvZGVBdChzKSk+NTUyOTUmJnI8NTczNDQpe2lmKCFpKXtpZihyPjU2MzE5KXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09bil7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9cjtjb250aW51ZX1pZihyPDU2MzIwKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT1yO2NvbnRpbnVlfXI9NjU1MzYrKGktNTUyOTY8PDEwfHItNTYzMjApfWVsc2UgaSYmKGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCxyPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7by5wdXNoKHIpfWVsc2UgaWYocjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztvLnB1c2gocj4+NnwxOTIsNjMmcnwxMjgpfWVsc2UgaWYocjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7by5wdXNoKHI+PjEyfDIyNCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9ZWxzZXtpZighKHI8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztvLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIHJ0KHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZSxyLG4saSxvLHM7Y3x8bCgpO3ZhciBhPXQubGVuZ3RoO2lmKGElND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO289Ij0iPT09dFthLTJdPzI6Ij0iPT09dFthLTFdPzE6MCxzPW5ldyBmKDMqYS80LW8pLG49bz4wP2EtNDphO3ZhciB1PTA7Zm9yKGU9MCxyPTA7ZTxuO2UrPTQscis9MylpPWhbdC5jaGFyQ29kZUF0KGUpXTw8MTh8aFt0LmNoYXJDb2RlQXQoZSsxKV08PDEyfGhbdC5jaGFyQ29kZUF0KGUrMildPDw2fGhbdC5jaGFyQ29kZUF0KGUrMyldLHNbdSsrXT1pPj4xNiYyNTUsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9aFt0LmNoYXJDb2RlQXQoZSldPDwyfGhbdC5jaGFyQ29kZUF0KGUrMSldPj40LHNbdSsrXT0yNTUmaSk6MT09PW8mJihpPWhbdC5jaGFyQ29kZUF0KGUpXTw8MTB8aFt0LmNoYXJDb2RlQXQoZSsxKV08PDR8aFt0LmNoYXJDb2RlQXQoZSsyKV0+PjIsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaSksc30oZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZShYLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT0wOyl0Kz0iPSI7cmV0dXJuIHR9KHQpKX1mdW5jdGlvbiBudCh0LGUscixuKXtmb3IodmFyIGk9MDtpPG4mJiEoaStyPj1lLmxlbmd0aHx8aT49dC5sZW5ndGgpOysraSllW2krcl09dFtpXTtyZXR1cm4gaX1mdW5jdGlvbiBpdCh0KXtyZXR1cm4hIXQuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZ0LmNvbnN0cnVjdG9yLmlzQnVmZmVyKHQpfWZ1bmN0aW9uIG90KCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gc3QoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfXZhciBhdD1vdCx1dD1zdDtmdW5jdGlvbiBodCh0KXtpZihhdD09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQodCwwKTtpZigoYXQ9PT1vdHx8IWF0KSYmc2V0VGltZW91dClyZXR1cm4gYXQ9c2V0VGltZW91dCxzZXRUaW1lb3V0KHQsMCk7dHJ5e3JldHVybiBhdCh0LDApfWNhdGNoKGUpe3RyeXtyZXR1cm4gYXQuY2FsbChudWxsLHQsMCl9Y2F0Y2goZSl7cmV0dXJuIGF0LmNhbGwodGhpcyx0LDApfX19ImZ1bmN0aW9uIj09dHlwZW9mIGEuc2V0VGltZW91dCYmKGF0PXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiBhLmNsZWFyVGltZW91dCYmKHV0PWNsZWFyVGltZW91dCk7dmFyIGZ0LGN0PVtdLGx0PSExLHB0PS0xO2Z1bmN0aW9uIGR0KCl7bHQmJmZ0JiYobHQ9ITEsZnQubGVuZ3RoP2N0PWZ0LmNvbmNhdChjdCk6cHQ9LTEsY3QubGVuZ3RoJiZndCgpKX1mdW5jdGlvbiBndCgpe2lmKCFsdCl7dmFyIHQ9aHQoZHQpO2x0PSEwO2Zvcih2YXIgZT1jdC5sZW5ndGg7ZTspe2ZvcihmdD1jdCxjdD1bXTsrK3B0PGU7KWZ0JiZmdFtwdF0ucnVuKCk7cHQ9LTEsZT1jdC5sZW5ndGh9ZnQ9bnVsbCxsdD0hMSxmdW5jdGlvbih0KXtpZih1dD09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KHQpO2lmKCh1dD09PXN0fHwhdXQpJiZjbGVhclRpbWVvdXQpcmV0dXJuIHV0PWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQodCk7dHJ5e3JldHVybiB1dCh0KX1jYXRjaChlKXt0cnl7cmV0dXJuIHV0LmNhbGwobnVsbCx0KX1jYXRjaChlKXtyZXR1cm4gdXQuY2FsbCh0aGlzLHQpfX19KHQpfX1mdW5jdGlvbiB5dCh0KXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllW3ItMV09YXJndW1lbnRzW3JdO2N0LnB1c2gobmV3IHZ0KHQsZSkpLDEhPT1jdC5sZW5ndGh8fGx0fHxodChndCl9ZnVuY3Rpb24gdnQodCxlKXt0aGlzLmZ1bj10LHRoaXMuYXJyYXk9ZX12dC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07ZnVuY3Rpb24gYnQoKXt9dmFyIG10PWJ0LHd0PWJ0LF90PWJ0LFN0PWJ0LEV0PWJ0LGt0PWJ0LFJ0PWJ0O3ZhciBBdD1hLnBlcmZvcm1hbmNlfHx7fSxUdD1BdC5ub3d8fEF0Lm1vek5vd3x8QXQubXNOb3d8fEF0Lm9Ob3d8fEF0LndlYmtpdE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIE90PW5ldyBEYXRlO3ZhciBqdCxMdD17bmV4dFRpY2s6eXQsdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjptdCxhZGRMaXN0ZW5lcjp3dCxvbmNlOl90LG9mZjpTdCxyZW1vdmVMaXN0ZW5lcjpFdCxyZW1vdmVBbGxMaXN0ZW5lcnM6a3QsZW1pdDpSdCxiaW5kaW5nOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24odCl7dmFyIGU9LjAwMSpUdC5jYWxsKEF0KSxyPU1hdGguZmxvb3IoZSksbj1NYXRoLmZsb29yKGUlMSoxZTkpO3JldHVybiB0JiYoci09dFswXSwobi09dFsxXSk8MCYmKHItLSxuKz0xZTkpKSxbcixuXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1PdCkvMWUzfX07anQ9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTpmdW5jdGlvbih0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9O3ZhciBDdD1qdCxQdD0vJVtzZGolXS9nO2Z1bmN0aW9uIE10KHQpe2lmKCEkdCh0KSl7Zm9yKHZhciBlPVtdLHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWUucHVzaChJdChhcmd1bWVudHNbcl0pKTtyZXR1cm4gZS5qb2luKCIgIil9cj0xO2Zvcih2YXIgbj1hcmd1bWVudHMsaT1uLmxlbmd0aCxvPVN0cmluZyh0KS5yZXBsYWNlKFB0LChmdW5jdGlvbih0KXtpZigiJSUiPT09dClyZXR1cm4iJSI7aWYocj49aSlyZXR1cm4gdDtzd2l0Y2godCl7Y2FzZSIlcyI6cmV0dXJuIFN0cmluZyhuW3IrK10pO2Nhc2UiJWQiOnJldHVybiBOdW1iZXIobltyKytdKTtjYXNlIiVqIjp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG5bcisrXSl9Y2F0Y2godCl7cmV0dXJuIltDaXJjdWxhcl0ifWRlZmF1bHQ6cmV0dXJuIHR9fSkpLHM9bltyXTtyPGk7cz1uWysrcl0pV3Qocyl8fCFIdChzKT9vKz0iICIrczpvKz0iICIrSXQocyk7cmV0dXJuIG99ZnVuY3Rpb24gQnQodCxlKXtpZihHdChhLnByb2Nlc3MpKXJldHVybiBmdW5jdGlvbigpe3JldHVybiBCdCh0LGUpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07aWYoITA9PT1MdC5ub0RlcHJlY2F0aW9uKXJldHVybiB0O3ZhciByPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFyKXtpZihMdC50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihlKTtMdC50cmFjZURlcHJlY2F0aW9uP2NvbnNvbGUudHJhY2UoZSk6Y29uc29sZS5lcnJvcihlKSxyPSEwfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19dmFyIHh0LFV0PXt9O2Z1bmN0aW9uIEl0KHQsZSl7dmFyIHI9e3NlZW46W10sc3R5bGl6ZTpOdH07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+PTMmJihyLmRlcHRoPWFyZ3VtZW50c1syXSksYXJndW1lbnRzLmxlbmd0aD49NCYmKHIuY29sb3JzPWFyZ3VtZW50c1szXSksWXQoZSk/ci5zaG93SGlkZGVuPWU6ZSYmZnVuY3Rpb24odCxlKXtpZighZXx8IUh0KGUpKXJldHVybiB0O3ZhciByPU9iamVjdC5rZXlzKGUpLG49ci5sZW5ndGg7Zm9yKDtuLS07KXRbcltuXV09ZVtyW25dXX0ocixlKSxHdChyLnNob3dIaWRkZW4pJiYoci5zaG93SGlkZGVuPSExKSxHdChyLmRlcHRoKSYmKHIuZGVwdGg9MiksR3Qoci5jb2xvcnMpJiYoci5jb2xvcnM9ITEpLEd0KHIuY3VzdG9tSW5zcGVjdCkmJihyLmN1c3RvbUluc3BlY3Q9ITApLHIuY29sb3JzJiYoci5zdHlsaXplPUR0KSxGdChyLHQsci5kZXB0aCl9ZnVuY3Rpb24gRHQodCxlKXt2YXIgcj1JdC5zdHlsZXNbZV07cmV0dXJuIHI/IhtbIitJdC5jb2xvcnNbcl1bMF0rIm0iK3QrIhtbIitJdC5jb2xvcnNbcl1bMV0rIm0iOnR9ZnVuY3Rpb24gTnQodCxlKXtyZXR1cm4gdH1mdW5jdGlvbiBGdCh0LGUscil7aWYodC5jdXN0b21JbnNwZWN0JiZlJiZadChlLmluc3BlY3QpJiZlLmluc3BlY3QhPT1JdCYmKCFlLmNvbnN0cnVjdG9yfHxlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PWUpKXt2YXIgbj1lLmluc3BlY3Qocix0KTtyZXR1cm4gJHQobil8fChuPUZ0KHQsbixyKSksbn12YXIgaT1mdW5jdGlvbih0LGUpe2lmKEd0KGUpKXJldHVybiB0LnN0eWxpemUoInVuZGVmaW5lZCIsInVuZGVmaW5lZCIpO2lmKCR0KGUpKXt2YXIgcj0iJyIrSlNPTi5zdHJpbmdpZnkoZSkucmVwbGFjZSgvXiJ8IiQvZywiIikucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpKyInIjtyZXR1cm4gdC5zdHlsaXplKHIsInN0cmluZyIpfWlmKG49ZSwibnVtYmVyIj09dHlwZW9mIG4pcmV0dXJuIHQuc3R5bGl6ZSgiIitlLCJudW1iZXIiKTt2YXIgbjtpZihZdChlKSlyZXR1cm4gdC5zdHlsaXplKCIiK2UsImJvb2xlYW4iKTtpZihXdChlKSlyZXR1cm4gdC5zdHlsaXplKCJudWxsIiwibnVsbCIpfSh0LGUpO2lmKGkpcmV0dXJuIGk7dmFyIG89T2JqZWN0LmtleXMoZSkscz1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2VbdF09ITB9KSksZX0obyk7aWYodC5zaG93SGlkZGVuJiYobz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSksS3QoZSkmJihvLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8by5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4genQoZSk7aWYoMD09PW8ubGVuZ3RoKXtpZihadChlKSl7dmFyIGE9ZS5uYW1lPyI6ICIrZS5uYW1lOiIiO3JldHVybiB0LnN0eWxpemUoIltGdW5jdGlvbiIrYSsiXSIsInNwZWNpYWwiKX1pZihKdChlKSlyZXR1cm4gdC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwicmVnZXhwIik7aWYoVnQoZSkpcmV0dXJuIHQuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJkYXRlIik7aWYoS3QoZSkpcmV0dXJuIHp0KGUpfXZhciB1LGgsZj0iIixjPSExLGw9WyJ7IiwifSJdOyh1PWUsQXJyYXkuaXNBcnJheSh1KSYmKGM9ITAsbD1bIlsiLCJdIl0pLFp0KGUpKSYmKGY9IiBbRnVuY3Rpb24iKyhlLm5hbWU/IjogIitlLm5hbWU6IiIpKyJdIik7cmV0dXJuIEp0KGUpJiYoZj0iICIrUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKSxWdChlKSYmKGY9IiAiK0RhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwoZSkpLEt0KGUpJiYoZj0iICIrenQoZSkpLDAhPT1vLmxlbmd0aHx8YyYmMCE9ZS5sZW5ndGg/cjwwP0p0KGUpP3Quc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksInJlZ2V4cCIpOnQuc3R5bGl6ZSgiW09iamVjdF0iLCJzcGVjaWFsIik6KHQuc2Vlbi5wdXNoKGUpLGg9Yz9mdW5jdGlvbih0LGUscixuLGkpe2Zvcih2YXIgbz1bXSxzPTAsYT1lLmxlbmd0aDtzPGE7KytzKVh0KGUsU3RyaW5nKHMpKT9vLnB1c2gocXQodCxlLHIsbixTdHJpbmcocyksITApKTpvLnB1c2goIiIpO3JldHVybiBpLmZvckVhY2goKGZ1bmN0aW9uKGkpe2kubWF0Y2goL15cZCskLyl8fG8ucHVzaChxdCh0LGUscixuLGksITApKX0pKSxvfSh0LGUscixzLG8pOm8ubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gcXQodCxlLHIscyxuLGMpfSkpLHQuc2Vlbi5wb3AoKSxmdW5jdGlvbih0LGUscil7dmFyIG49dC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiXG4iKSx0K2UucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKTtpZihuPjYwKXJldHVybiByWzBdKygiIj09PWU/IiI6ZSsiXG4gIikrIiAiK3Quam9pbigiLFxuICAiKSsiICIrclsxXTtyZXR1cm4gclswXStlKyIgIit0LmpvaW4oIiwgIikrIiAiK3JbMV19KGgsZixsKSk6bFswXStmK2xbMV19ZnVuY3Rpb24genQodCl7cmV0dXJuIlsiK0Vycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKyJdIn1mdW5jdGlvbiBxdCh0LGUscixuLGksbyl7dmFyIHMsYSx1O2lmKCh1PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxpKXx8e3ZhbHVlOmVbaV19KS5nZXQ/YT11LnNldD90LnN0eWxpemUoIltHZXR0ZXIvU2V0dGVyXSIsInNwZWNpYWwiKTp0LnN0eWxpemUoIltHZXR0ZXJdIiwic3BlY2lhbCIpOnUuc2V0JiYoYT10LnN0eWxpemUoIltTZXR0ZXJdIiwic3BlY2lhbCIpKSxYdChuLGkpfHwocz0iWyIraSsiXSIpLGF8fCh0LnNlZW4uaW5kZXhPZih1LnZhbHVlKTwwPyhhPVd0KHIpP0Z0KHQsdS52YWx1ZSxudWxsKTpGdCh0LHUudmFsdWUsci0xKSkuaW5kZXhPZigiXG4iKT4tMSYmKGE9bz9hLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiAgIit0fSkpLmpvaW4oIlxuIikuc3Vic3RyKDIpOiJcbiIrYS5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIgICAiK3R9KSkuam9pbigiXG4iKSk6YT10LnN0eWxpemUoIltDaXJjdWxhcl0iLCJzcGVjaWFsIikpLEd0KHMpKXtpZihvJiZpLm1hdGNoKC9eXGQrJC8pKXJldHVybiBhOyhzPUpTT04uc3RyaW5naWZ5KCIiK2kpKS5tYXRjaCgvXiIoW2EtekEtWl9dW2EtekEtWl8wLTldKikiJC8pPyhzPXMuc3Vic3RyKDEscy5sZW5ndGgtMikscz10LnN0eWxpemUocywibmFtZSIpKToocz1zLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKS5yZXBsYWNlKC8oXiJ8IiQpL2csIiciKSxzPXQuc3R5bGl6ZShzLCJzdHJpbmciKSl9cmV0dXJuIHMrIjogIithfWZ1bmN0aW9uIFl0KHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR9ZnVuY3Rpb24gV3QodCl7cmV0dXJuIG51bGw9PT10fWZ1bmN0aW9uICR0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdH1mdW5jdGlvbiBHdCh0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiBKdCh0KXtyZXR1cm4gSHQodCkmJiJbb2JqZWN0IFJlZ0V4cF0iPT09UXQodCl9ZnVuY3Rpb24gSHQodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiBWdCh0KXtyZXR1cm4gSHQodCkmJiJbb2JqZWN0IERhdGVdIj09PVF0KHQpfWZ1bmN0aW9uIEt0KHQpe3JldHVybiBIdCh0KSYmKCJbb2JqZWN0IEVycm9yXSI9PT1RdCh0KXx8dCBpbnN0YW5jZW9mIEVycm9yKX1mdW5jdGlvbiBadCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBRdCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIFh0KHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIHRlKCl7dGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1JdC5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LEl0LnN0eWxlcz17c3BlY2lhbDoiY3lhbiIsbnVtYmVyOiJ5ZWxsb3ciLGJvb2xlYW46InllbGxvdyIsdW5kZWZpbmVkOiJncmV5IixudWxsOiJib2xkIixzdHJpbmc6ImdyZWVuIixkYXRlOiJtYWdlbnRhIixyZWdleHA6InJlZCJ9LHRlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDpudWxsfTt0aGlzLmxlbmd0aD4wP3RoaXMudGFpbC5uZXh0PWU6dGhpcy5oZWFkPWUsdGhpcy50YWlsPWUsKyt0aGlzLmxlbmd0aH0sdGUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPWUpLHRoaXMuaGVhZD1lLCsrdGhpcy5sZW5ndGh9LHRlLnByb3RvdHlwZS5zaGlmdD1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5oZWFkLmRhdGE7cmV0dXJuIDE9PT10aGlzLmxlbmd0aD90aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw6dGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0LC0tdGhpcy5sZW5ndGgsdH19LHRlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfSx0ZS5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBlPXRoaXMuaGVhZCxyPSIiK2UuZGF0YTtlPWUubmV4dDspcis9dCtlLmRhdGE7cmV0dXJuIHJ9LHRlLnByb3RvdHlwZS5jb25jYXQ9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiBfLmFsbG9jKDApO2lmKDE9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcy5oZWFkLmRhdGE7Zm9yKHZhciBlPV8uYWxsb2NVbnNhZmUodD4+PjApLHI9dGhpcy5oZWFkLG49MDtyOylyLmRhdGEuY29weShlLG4pLG4rPXIuZGF0YS5sZW5ndGgscj1yLm5leHQ7cmV0dXJuIGV9O3ZhciBlZT1fLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHQpe3N3aXRjaCh0JiZ0LnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOmNhc2UicmF3IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX07ZnVuY3Rpb24gcmUodCl7c3dpdGNoKHRoaXMuZW5jb2Rpbmc9KHR8fCJ1dGY4IikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywiIiksZnVuY3Rpb24odCl7aWYodCYmIWVlKHQpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KX0odCksdGhpcy5lbmNvZGluZyl7Y2FzZSJ1dGY4Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9MzticmVhaztjYXNlInVjczIiOmNhc2UidXRmMTZsZSI6dGhpcy5zdXJyb2dhdGVTaXplPTIsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1pZTticmVhaztjYXNlImJhc2U2NCI6dGhpcy5zdXJyb2dhdGVTaXplPTMsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1vZTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkKHRoaXMud3JpdGU9bmUpfXRoaXMuY2hhckJ1ZmZlcj1uZXcgXyg2KSx0aGlzLmNoYXJSZWNlaXZlZD0wLHRoaXMuY2hhckxlbmd0aD0wfWZ1bmN0aW9uIG5lKHQpe3JldHVybiB0LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpfWZ1bmN0aW9uIGllKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTIsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzI6MH1mdW5jdGlvbiBvZSh0KXt0aGlzLmNoYXJSZWNlaXZlZD10Lmxlbmd0aCUzLHRoaXMuY2hhckxlbmd0aD10aGlzLmNoYXJSZWNlaXZlZD8zOjB9cmUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0iIjt0aGlzLmNoYXJMZW5ndGg7KXt2YXIgcj10Lmxlbmd0aD49dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkP3RoaXMuY2hhckxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZDp0Lmxlbmd0aDtpZih0LmNvcHkodGhpcy5jaGFyQnVmZmVyLHRoaXMuY2hhclJlY2VpdmVkLDAsciksdGhpcy5jaGFyUmVjZWl2ZWQrPXIsdGhpcy5jaGFyUmVjZWl2ZWQ8dGhpcy5jaGFyTGVuZ3RoKXJldHVybiIiO2lmKHQ9dC5zbGljZShyLHQubGVuZ3RoKSwhKChpPShlPXRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZykpLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkpPj01NTI5NiYmaTw9NTYzMTkpKXtpZih0aGlzLmNoYXJSZWNlaXZlZD10aGlzLmNoYXJMZW5ndGg9MCwwPT09dC5sZW5ndGgpcmV0dXJuIGU7YnJlYWt9dGhpcy5jaGFyTGVuZ3RoKz10aGlzLnN1cnJvZ2F0ZVNpemUsZT0iIn10aGlzLmRldGVjdEluY29tcGxldGVDaGFyKHQpO3ZhciBuPXQubGVuZ3RoO3RoaXMuY2hhckxlbmd0aCYmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCx0Lmxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZCxuKSxuLT10aGlzLmNoYXJSZWNlaXZlZCk7dmFyIGk7bj0oZSs9dC50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsbikpLmxlbmd0aC0xO2lmKChpPWUuY2hhckNvZGVBdChuKSk+PTU1Mjk2JiZpPD01NjMxOSl7dmFyIG89dGhpcy5zdXJyb2dhdGVTaXplO3JldHVybiB0aGlzLmNoYXJMZW5ndGgrPW8sdGhpcy5jaGFyUmVjZWl2ZWQrPW8sdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLG8sMCxvKSx0LmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsMCxvKSxlLnN1YnN0cmluZygwLG4pfXJldHVybiBlfSxyZS5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoPj0zPzM6dC5sZW5ndGg7ZT4wO2UtLSl7dmFyIHI9dFt0Lmxlbmd0aC1lXTtpZigxPT1lJiZyPj41PT02KXt0aGlzLmNoYXJMZW5ndGg9MjticmVha31pZihlPD0yJiZyPj40PT0xNCl7dGhpcy5jaGFyTGVuZ3RoPTM7YnJlYWt9aWYoZTw9MyYmcj4+Mz09MzApe3RoaXMuY2hhckxlbmd0aD00O2JyZWFrfX10aGlzLmNoYXJSZWNlaXZlZD1lfSxyZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPSIiO2lmKHQmJnQubGVuZ3RoJiYoZT10aGlzLndyaXRlKHQpKSx0aGlzLmNoYXJSZWNlaXZlZCl7dmFyIHI9dGhpcy5jaGFyUmVjZWl2ZWQsbj10aGlzLmNoYXJCdWZmZXIsaT10aGlzLmVuY29kaW5nO2UrPW4uc2xpY2UoMCxyKS50b1N0cmluZyhpKX1yZXR1cm4gZX0sdWUuUmVhZGFibGVTdGF0ZT1hZTt2YXIgc2U9ZnVuY3Rpb24odCl7aWYoR3QoeHQpJiYoeHQ9THQuZW52Lk5PREVfREVCVUd8fCIiKSx0PXQudG9VcHBlckNhc2UoKSwhVXRbdF0paWYobmV3IFJlZ0V4cCgiXFxiIit0KyJcXGIiLCJpIikudGVzdCh4dCkpe1V0W3RdPWZ1bmN0aW9uKCl7dmFyIGU9TXQuYXBwbHkobnVsbCxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoIiVzICVkOiAlcyIsdCwwLGUpfX1lbHNlIFV0W3RdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gVXRbdF19KCJzdHJlYW0iKTtmdW5jdGlvbiBhZSh0LGUpe3Q9dHx8e30sdGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLGUgaW5zdGFuY2VvZiBVZSYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC5yZWFkYWJsZU9iamVjdE1vZGUpO3ZhciByPXQuaGlnaFdhdGVyTWFyayxuPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9cnx8MD09PXI/cjpuLHRoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyayx0aGlzLmJ1ZmZlcj1uZXcgdGUsdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5yYW5PdXQ9ITEsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsdC5lbmNvZGluZyYmKHRoaXMuZGVjb2Rlcj1uZXcgcmUodC5lbmNvZGluZyksdGhpcy5lbmNvZGluZz10LmVuY29kaW5nKX1mdW5jdGlvbiB1ZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiB1ZSkpcmV0dXJuIG5ldyB1ZSh0KTt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBhZSh0LHRoaXMpLHRoaXMucmVhZGFibGU9ITAsdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmKHRoaXMuX3JlYWQ9dC5yZWFkKSxlLmNhbGwodGhpcyl9ZnVuY3Rpb24gaGUodCxlLHIsbixpKXt2YXIgbz1mdW5jdGlvbih0LGUpe3ZhciByPW51bGw7Xy5pc0J1ZmZlcihlKXx8InN0cmluZyI9PXR5cGVvZiBlfHxudWxsPT1lfHx0Lm9iamVjdE1vZGV8fChyPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSk7cmV0dXJuIHJ9KGUscik7aWYobyl0LmVtaXQoImVycm9yIixvKTtlbHNlIGlmKG51bGw9PT1yKWUucmVhZGluZz0hMSxmdW5jdGlvbih0LGUpe2lmKGUuZW5kZWQpcmV0dXJuO2lmKGUuZGVjb2Rlcil7dmFyIHI9ZS5kZWNvZGVyLmVuZCgpO3ImJnIubGVuZ3RoJiYoZS5idWZmZXIucHVzaChyKSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgpfWUuZW5kZWQ9ITAsbGUodCl9KHQsZSk7ZWxzZSBpZihlLm9iamVjdE1vZGV8fHImJnIubGVuZ3RoPjApaWYoZS5lbmRlZCYmIWkpe3ZhciBzPW5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKTt0LmVtaXQoImVycm9yIixzKX1lbHNlIGlmKGUuZW5kRW1pdHRlZCYmaSl7dmFyIGE9bmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpO3QuZW1pdCgiZXJyb3IiLGEpfWVsc2V7dmFyIHU7IWUuZGVjb2Rlcnx8aXx8bnx8KHI9ZS5kZWNvZGVyLndyaXRlKHIpLHU9IWUub2JqZWN0TW9kZSYmMD09PXIubGVuZ3RoKSxpfHwoZS5yZWFkaW5nPSExKSx1fHwoZS5mbG93aW5nJiYwPT09ZS5sZW5ndGgmJiFlLnN5bmM/KHQuZW1pdCgiZGF0YSIsciksdC5yZWFkKDApKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoLGk/ZS5idWZmZXIudW5zaGlmdChyKTplLmJ1ZmZlci5wdXNoKHIpLGUubmVlZFJlYWRhYmxlJiZsZSh0KSkpLGZ1bmN0aW9uKHQsZSl7ZS5yZWFkaW5nTW9yZXx8KGUucmVhZGluZ01vcmU9ITAseXQoZGUsdCxlKSl9KHQsZSl9ZWxzZSBpfHwoZS5yZWFkaW5nPSExKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIXQuZW5kZWQmJih0Lm5lZWRSZWFkYWJsZXx8dC5sZW5ndGg8dC5oaWdoV2F0ZXJNYXJrfHwwPT09dC5sZW5ndGgpfShlKX1DdCh1ZSxlKSx1ZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHIub2JqZWN0TW9kZXx8InN0cmluZyIhPXR5cGVvZiB0fHwoZT1lfHxyLmRlZmF1bHRFbmNvZGluZykhPT1yLmVuY29kaW5nJiYodD1fLmZyb20odCxlKSxlPSIiKSxoZSh0aGlzLHIsdCxlLCExKX0sdWUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGhlKHRoaXMsdGhpcy5fcmVhZGFibGVTdGF0ZSx0LCIiLCEwKX0sdWUucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LHVlLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPW5ldyByZSh0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307dmFyIGZlPTgzODg2MDg7ZnVuY3Rpb24gY2UodCxlKXtyZXR1cm4gdDw9MHx8MD09PWUubGVuZ3RoJiZlLmVuZGVkPzA6ZS5vYmplY3RNb2RlPzE6dCE9dD9lLmZsb3dpbmcmJmUubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg6ZS5sZW5ndGg6KHQ+ZS5oaWdoV2F0ZXJNYXJrJiYoZS5oaWdoV2F0ZXJNYXJrPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj1mZT90PWZlOih0LS0sdHw9dD4+PjEsdHw9dD4+PjIsdHw9dD4+PjQsdHw9dD4+PjgsdHw9dD4+PjE2LHQrKyksdH0odCkpLHQ8PWUubGVuZ3RoP3Q6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIGxlKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7ZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fChzZSgiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz95dChwZSx0KTpwZSh0KSl9ZnVuY3Rpb24gcGUodCl7c2UoImVtaXQgcmVhZGFibGUiKSx0LmVtaXQoInJlYWRhYmxlIiksdmUodCl9ZnVuY3Rpb24gZGUodCxlKXtmb3IodmFyIHI9ZS5sZW5ndGg7IWUucmVhZGluZyYmIWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyayYmKHNlKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxyIT09ZS5sZW5ndGgpOylyPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gZ2UodCl7c2UoInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLHQucmVhZCgwKX1mdW5jdGlvbiB5ZSh0LGUpe2UucmVhZGluZ3x8KHNlKCJyZXN1bWUgcmVhZCAwIiksdC5yZWFkKDApKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxlLmF3YWl0RHJhaW49MCx0LmVtaXQoInJlc3VtZSIpLHZlKHQpLGUuZmxvd2luZyYmIWUucmVhZGluZyYmdC5yZWFkKDApfWZ1bmN0aW9uIHZlKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKHNlKCJmbG93IixlLmZsb3dpbmcpO2UuZmxvd2luZyYmbnVsbCE9PXQucmVhZCgpOyk7fWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuIDA9PT1lLmxlbmd0aD9udWxsOihlLm9iamVjdE1vZGU/cj1lLmJ1ZmZlci5zaGlmdCgpOiF0fHx0Pj1lLmxlbmd0aD8ocj1lLmRlY29kZXI/ZS5idWZmZXIuam9pbigiIik6MT09PWUuYnVmZmVyLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGE6ZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSxlLmJ1ZmZlci5jbGVhcigpKTpyPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbjt0PGUuaGVhZC5kYXRhLmxlbmd0aD8obj1lLmhlYWQuZGF0YS5zbGljZSgwLHQpLGUuaGVhZC5kYXRhPWUuaGVhZC5kYXRhLnNsaWNlKHQpKTpuPXQ9PT1lLmhlYWQuZGF0YS5sZW5ndGg/ZS5zaGlmdCgpOnI/ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmhlYWQsbj0xLGk9ci5kYXRhO3QtPWkubGVuZ3RoO2Zvcig7cj1yLm5leHQ7KXt2YXIgbz1yLmRhdGEscz10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYocz09PW8ubGVuZ3RoP2krPW86aSs9by5zbGljZSgwLHQpLDA9PT0odC09cykpe3M9PT1vLmxlbmd0aD8oKytuLHIubmV4dD9lLmhlYWQ9ci5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1yLHIuZGF0YT1vLnNsaWNlKHMpKTticmVha30rK259cmV0dXJuIGUubGVuZ3RoLT1uLGl9KHQsZSk6ZnVuY3Rpb24odCxlKXt2YXIgcj1fLmFsbG9jVW5zYWZlKHQpLG49ZS5oZWFkLGk9MTtuLmRhdGEuY29weShyKSx0LT1uLmRhdGEubGVuZ3RoO2Zvcig7bj1uLm5leHQ7KXt2YXIgbz1uLmRhdGEscz10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoby5jb3B5KHIsci5sZW5ndGgtdCwwLHMpLDA9PT0odC09cykpe3M9PT1vLmxlbmd0aD8oKytpLG4ubmV4dD9lLmhlYWQ9bi5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1uLG4uZGF0YT1vLnNsaWNlKHMpKTticmVha30rK2l9cmV0dXJuIGUubGVuZ3RoLT1pLHJ9KHQsZSk7cmV0dXJuIG59KHQsZS5idWZmZXIsZS5kZWNvZGVyKSxyKTt2YXIgcn1mdW5jdGlvbiBtZSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLHl0KHdlLGUsdCkpfWZ1bmN0aW9uIHdlKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBfZSh0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX1mdW5jdGlvbiBTZSgpe31mdW5jdGlvbiBFZSh0LGUscil7dGhpcy5jaHVuaz10LHRoaXMuZW5jb2Rpbmc9ZSx0aGlzLmNhbGxiYWNrPXIsdGhpcy5uZXh0PW51bGx9ZnVuY3Rpb24ga2UodCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7Z2V0OkJ0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSksIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuIil9KSx0PXR8fHt9LHRoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxlIGluc3RhbmNlb2YgVWUmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQud3JpdGFibGVPYmplY3RNb2RlKTt2YXIgcj10LmhpZ2hXYXRlck1hcmssbj10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6bix0aGlzLmhpZ2hXYXRlck1hcms9fn50aGlzLmhpZ2hXYXRlck1hcmssdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExO3ZhciBpPSExPT09dC5kZWNvZGVTdHJpbmdzO3RoaXMuZGVjb2RlU3RyaW5ncz0haSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXIuc3luYyxpPXIud3JpdGVjYjtpZihmdW5jdGlvbih0KXt0LndyaXRpbmc9ITEsdC53cml0ZWNiPW51bGwsdC5sZW5ndGgtPXQud3JpdGVsZW4sdC53cml0ZWxlbj0wfShyKSxlKSFmdW5jdGlvbih0LGUscixuLGkpey0tZS5wZW5kaW5nY2Iscj95dChpLG4pOmkobik7dC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsbil9KHQscixuLGUsaSk7ZWxzZXt2YXIgbz1qZShyKTtvfHxyLmNvcmtlZHx8ci5idWZmZXJQcm9jZXNzaW5nfHwhci5idWZmZXJlZFJlcXVlc3R8fE9lKHQsciksbj95dChUZSx0LHIsbyxpKTpUZSh0LHIsbyxpKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFBlKHRoaXMpfWZ1bmN0aW9uIFJlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFJlfHx0aGlzIGluc3RhbmNlb2YgVWUpKXJldHVybiBuZXcgUmUodCk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcga2UodCx0aGlzKSx0aGlzLndyaXRhYmxlPSEwLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZSYmKHRoaXMuX3dyaXRlPXQud3JpdGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRldiYmKHRoaXMuX3dyaXRldj10LndyaXRldikpLGUuY2FsbCh0aGlzKX1mdW5jdGlvbiBBZSh0LGUscixuLGksbyxzKXtlLndyaXRlbGVuPW4sZS53cml0ZWNiPXMsZS53cml0aW5nPSEwLGUuc3luYz0hMCxyP3QuX3dyaXRldihpLGUub253cml0ZSk6dC5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIFRlKHQsZSxyLG4pe3J8fGZ1bmN0aW9uKHQsZSl7MD09PWUubGVuZ3RoJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHQuZW1pdCgiZHJhaW4iKSl9KHQsZSksZS5wZW5kaW5nY2ItLSxuKCksQ2UodCxlKX1mdW5jdGlvbiBPZSh0LGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgcj1lLmJ1ZmZlcmVkUmVxdWVzdDtpZih0Ll93cml0ZXYmJnImJnIubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9cjtmb3IodmFyIHM9MDtyOylpW3NdPXIscj1yLm5leHQscys9MTtBZSh0LGUsITAsZS5sZW5ndGgsaSwiIixvLmZpbmlzaCksZS5wZW5kaW5nY2IrKyxlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCxvLm5leHQ/KGUuY29ya2VkUmVxdWVzdHNGcmVlPW8ubmV4dCxvLm5leHQ9bnVsbCk6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFBlKGUpfWVsc2V7Zm9yKDtyOyl7dmFyIGE9ci5jaHVuayx1PXIuZW5jb2RpbmcsaD1yLmNhbGxiYWNrO2lmKEFlKHQsZSwhMSxlLm9iamVjdE1vZGU/MTphLmxlbmd0aCxhLHUsaCkscj1yLm5leHQsZS53cml0aW5nKWJyZWFrfW51bGw9PT1yJiYoZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwpfWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCxlLmJ1ZmZlcmVkUmVxdWVzdD1yLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiBqZSh0KXtyZXR1cm4gdC5lbmRpbmcmJjA9PT10Lmxlbmd0aCYmbnVsbD09PXQuYnVmZmVyZWRSZXF1ZXN0JiYhdC5maW5pc2hlZCYmIXQud3JpdGluZ31mdW5jdGlvbiBMZSh0LGUpe2UucHJlZmluaXNoZWR8fChlLnByZWZpbmlzaGVkPSEwLHQuZW1pdCgicHJlZmluaXNoIikpfWZ1bmN0aW9uIENlKHQsZSl7dmFyIHI9amUoZSk7cmV0dXJuIHImJigwPT09ZS5wZW5kaW5nY2I/KExlKHQsZSksZS5maW5pc2hlZD0hMCx0LmVtaXQoImZpbmlzaCIpKTpMZSh0LGUpKSxyfWZ1bmN0aW9uIFBlKHQpe3ZhciBlPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKHIpe3ZhciBuPWUuZW50cnk7Zm9yKGUuZW50cnk9bnVsbDtuOyl7dmFyIGk9bi5jYWxsYmFjazt0LnBlbmRpbmdjYi0tLGkociksbj1uLm5leHR9dC5jb3JrZWRSZXF1ZXN0c0ZyZWU/dC5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1lOnQuY29ya2VkUmVxdWVzdHNGcmVlPWV9fXVlLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe3NlKCJyZWFkIix0KSx0PXBhcnNlSW50KHQsMTApO3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj10O2lmKDAhPT10JiYoZS5lbWl0dGVkUmVhZGFibGU9ITEpLDA9PT10JiZlLm5lZWRSZWFkYWJsZSYmKGUubGVuZ3RoPj1lLmhpZ2hXYXRlck1hcmt8fGUuZW5kZWQpKXJldHVybiBzZSgicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/bWUodGhpcyk6bGUodGhpcyksbnVsbDtpZigwPT09KHQ9Y2UodCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmbWUodGhpcyksbnVsbDt2YXIgbixpPWUubmVlZFJlYWRhYmxlO3JldHVybiBzZSgibmVlZCByZWFkYWJsZSIsaSksKDA9PT1lLmxlbmd0aHx8ZS5sZW5ndGgtdDxlLmhpZ2hXYXRlck1hcmspJiZzZSgibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLGk9ITApLGUuZW5kZWR8fGUucmVhZGluZz9zZSgicmVhZGluZyBvciBlbmRlZCIsaT0hMSk6aSYmKHNlKCJkbyByZWFkIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCwwPT09ZS5sZW5ndGgmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fCh0PWNlKHIsZSkpKSxudWxsPT09KG49dD4wP2JlKHQsZSk6bnVsbCk/KGUubmVlZFJlYWRhYmxlPSEwLHQ9MCk6ZS5sZW5ndGgtPXQsMD09PWUubGVuZ3RoJiYoZS5lbmRlZHx8KGUubmVlZFJlYWRhYmxlPSEwKSxyIT09dCYmZS5lbmRlZCYmbWUodGhpcykpLG51bGwhPT1uJiZ0aGlzLmVtaXQoImRhdGEiLG4pLG59LHVlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0sdWUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2gobi5waXBlc0NvdW50KXtjYXNlIDA6bi5waXBlcz10O2JyZWFrO2Nhc2UgMTpuLnBpcGVzPVtuLnBpcGVzLHRdO2JyZWFrO2RlZmF1bHQ6bi5waXBlcy5wdXNoKHQpfW4ucGlwZXNDb3VudCs9MSxzZSgicGlwZSBjb3VudD0lZCBvcHRzPSVqIixuLnBpcGVzQ291bnQsZSk7dmFyIGk9IWV8fCExIT09ZS5lbmQ/czpoO2Z1bmN0aW9uIG8odCl7c2UoIm9udW5waXBlIiksdD09PXImJmgoKX1mdW5jdGlvbiBzKCl7c2UoIm9uZW5kIiksdC5lbmQoKX1uLmVuZEVtaXR0ZWQ/eXQoaSk6ci5vbmNlKCJlbmQiLGkpLHQub24oInVucGlwZSIsbyk7dmFyIGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtzZSgicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZ0Lmxpc3RlbmVycygiZGF0YSIpLmxlbmd0aCYmKGUuZmxvd2luZz0hMCx2ZSh0KSl9fShyKTt0Lm9uKCJkcmFpbiIsYSk7dmFyIHU9ITE7ZnVuY3Rpb24gaCgpe3NlKCJjbGVhbnVwIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZCksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLGEpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSx0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLG8pLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIscyksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixoKSxyLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixjKSx1PSEwLCFuLmF3YWl0RHJhaW58fHQuX3dyaXRhYmxlU3RhdGUmJiF0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8YSgpfXZhciBmPSExO2Z1bmN0aW9uIGMoZSl7c2UoIm9uZGF0YSIpLGY9ITEsITEhPT10LndyaXRlKGUpfHxmfHwoKDE9PT1uLnBpcGVzQ291bnQmJm4ucGlwZXM9PT10fHxuLnBpcGVzQ291bnQ+MSYmLTEhPT1fZShuLnBpcGVzLHQpKSYmIXUmJihzZSgiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIixyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrLGY9ITApLHIucGF1c2UoKSl9ZnVuY3Rpb24gbChlKXt2YXIgcjtzZSgib25lcnJvciIsZSksZygpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSwwPT09KHI9ImVycm9yIix0Lmxpc3RlbmVycyhyKS5sZW5ndGgpJiZ0LmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiBwKCl7dC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixkKSxnKCl9ZnVuY3Rpb24gZCgpe3NlKCJvbmZpbmlzaCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixwKSxnKCl9ZnVuY3Rpb24gZygpe3NlKCJ1bnBpcGUiKSxyLnVucGlwZSh0KX1yZXR1cm4gci5vbigiZGF0YSIsYyksZnVuY3Rpb24odCxlLHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnByZXBlbmRMaXN0ZW5lcilyZXR1cm4gdC5wcmVwZW5kTGlzdGVuZXIoZSxyKTt0Ll9ldmVudHMmJnQuX2V2ZW50c1tlXT9BcnJheS5pc0FycmF5KHQuX2V2ZW50c1tlXSk/dC5fZXZlbnRzW2VdLnVuc2hpZnQocik6dC5fZXZlbnRzW2VdPVtyLHQuX2V2ZW50c1tlXV06dC5vbihlLHIpfSh0LCJlcnJvciIsbCksdC5vbmNlKCJjbG9zZSIscCksdC5vbmNlKCJmaW5pc2giLGQpLHQuZW1pdCgicGlwZSIsciksbi5mbG93aW5nfHwoc2UoInBpcGUgcmVzdW1lIiksci5yZXN1bWUoKSksdH0sdWUucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlO2lmKDA9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PWUucGlwZXNDb3VudClyZXR1cm4gdCYmdCE9PWUucGlwZXN8fCh0fHwodD1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHQmJnQuZW1pdCgidW5waXBlIix0aGlzKSksdGhpcztpZighdCl7dmFyIHI9ZS5waXBlcyxuPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgaT0wO2k8bjtpKyspcltpXS5lbWl0KCJ1bnBpcGUiLHRoaXMpO3JldHVybiB0aGlzfXZhciBvPV9lKGUucGlwZXMsdCk7cmV0dXJuLTE9PT1vfHwoZS5waXBlcy5zcGxpY2UobywxKSxlLnBpcGVzQ291bnQtPTEsMT09PWUucGlwZXNDb3VudCYmKGUucGlwZXM9ZS5waXBlc1swXSksdC5lbWl0KCJ1bnBpcGUiLHRoaXMpKSx0aGlzfSx1ZS5wcm90b3R5cGUub249ZnVuY3Rpb24odCxyKXt2YXIgbj1lLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsdCxyKTtpZigiZGF0YSI9PT10KSExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiZ0aGlzLnJlc3VtZSgpO2Vsc2UgaWYoInJlYWRhYmxlIj09PXQpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7aS5lbmRFbWl0dGVkfHxpLnJlYWRhYmxlTGlzdGVuaW5nfHwoaS5yZWFkYWJsZUxpc3RlbmluZz1pLm5lZWRSZWFkYWJsZT0hMCxpLmVtaXR0ZWRSZWFkYWJsZT0hMSxpLnJlYWRpbmc/aS5sZW5ndGgmJmxlKHRoaXMpOnl0KGdlLHRoaXMpKX1yZXR1cm4gbn0sdWUucHJvdG90eXBlLmFkZExpc3RlbmVyPXVlLnByb3RvdHlwZS5vbix1ZS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gdC5mbG93aW5nfHwoc2UoInJlc3VtZSIpLHQuZmxvd2luZz0hMCxmdW5jdGlvbih0LGUpe2UucmVzdW1lU2NoZWR1bGVkfHwoZS5yZXN1bWVTY2hlZHVsZWQ9ITAseXQoeWUsdCxlKSl9KHRoaXMsdCkpLHRoaXN9LHVlLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiBzZSgiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoc2UoInBhdXNlIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdCgicGF1c2UiKSksdGhpc30sdWUucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPSExLG49dGhpcztmb3IodmFyIGkgaW4gdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtpZihzZSgid3JhcHBlZCBlbmQiKSxlLmRlY29kZXImJiFlLmVuZGVkKXt2YXIgdD1lLmRlY29kZXIuZW5kKCk7dCYmdC5sZW5ndGgmJm4ucHVzaCh0KX1uLnB1c2gobnVsbCl9KSksdC5vbigiZGF0YSIsKGZ1bmN0aW9uKGkpeyhzZSgid3JhcHBlZCBkYXRhIiksZS5kZWNvZGVyJiYoaT1lLmRlY29kZXIud3JpdGUoaSkpLGUub2JqZWN0TW9kZSYmbnVsbD09aSl8fChlLm9iamVjdE1vZGV8fGkmJmkubGVuZ3RoKSYmKG4ucHVzaChpKXx8KHI9ITAsdC5wYXVzZSgpKSl9KSksdCl2b2lkIDA9PT10aGlzW2ldJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKHRoaXNbaV09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0oaSkpO3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKyllKHRbcl0scil9KFsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdLChmdW5jdGlvbihlKXt0Lm9uKGUsbi5lbWl0LmJpbmQobixlKSl9KSksbi5fcmVhZD1mdW5jdGlvbihlKXtzZSgid3JhcHBlZCBfcmVhZCIsZSksciYmKHI9ITEsdC5yZXN1bWUoKSl9LG59LHVlLl9mcm9tTGlzdD1iZSxSZS5Xcml0YWJsZVN0YXRlPWtlLEN0KFJlLGUpLGtlLnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5idWZmZXJlZFJlcXVlc3QsZT1bXTt0OyllLnB1c2godCksdD10Lm5leHQ7cmV0dXJuIGV9LFJlLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIikpfSxSZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLF8uaXNCdWZmZXIodCk/ZT0iYnVmZmVyIjplfHwoZT1uLmRlZmF1bHRFbmNvZGluZyksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPVNlKSxuLmVuZGVkP2Z1bmN0aW9uKHQsZSl7dmFyIHI9bmV3IEVycm9yKCJ3cml0ZSBhZnRlciBlbmQiKTt0LmVtaXQoImVycm9yIixyKSx5dChlLHIpfSh0aGlzLHIpOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPSEwLG89ITE7cmV0dXJuIG51bGw9PT1yP289bmV3IFR5cGVFcnJvcigiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0iKTpfLmlzQnVmZmVyKHIpfHwic3RyaW5nIj09dHlwZW9mIHJ8fHZvaWQgMD09PXJ8fGUub2JqZWN0TW9kZXx8KG89bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKSxvJiYodC5lbWl0KCJlcnJvciIsbykseXQobixvKSxpPSExKSxpfSh0aGlzLG4sdCxyKSYmKG4ucGVuZGluZ2NiKyssaT1mdW5jdGlvbih0LGUscixuLGkpe3I9ZnVuY3Rpb24odCxlLHIpe3Qub2JqZWN0TW9kZXx8ITE9PT10LmRlY29kZVN0cmluZ3N8fCJzdHJpbmciIT10eXBlb2YgZXx8KGU9Xy5mcm9tKGUscikpO3JldHVybiBlfShlLHIsbiksXy5pc0J1ZmZlcihyKSYmKG49ImJ1ZmZlciIpO3ZhciBvPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoO2UubGVuZ3RoKz1vO3ZhciBzPWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyaztzfHwoZS5uZWVkRHJhaW49ITApO2lmKGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBhPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bmV3IEVlKHIsbixpKSxhP2EubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBBZSh0LGUsITEsbyxyLG4saSk7cmV0dXJuIHN9KHRoaXMsbix0LGUscikpLGl9LFJlLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30sUmUucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3dyaXRhYmxlU3RhdGU7dC5jb3JrZWQmJih0LmNvcmtlZC0tLHQud3JpdGluZ3x8dC5jb3JrZWR8fHQuZmluaXNoZWR8fHQuYnVmZmVyUHJvY2Vzc2luZ3x8IXQuYnVmZmVyZWRSZXF1ZXN0fHxPZSh0aGlzLHQpKX0sUmUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudG9Mb3dlckNhc2UoKSksIShbImhleCIsInV0ZjgiLCJ1dGYtOCIsImFzY2lpIiwiYmluYXJ5IiwiYmFzZTY0IiwidWNzMiIsInVjcy0yIiwidXRmMTZsZSIsInV0Zi0xNmxlIiwicmF3Il0uaW5kZXhPZigodCsiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPXQsdGhpc30sUmUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7cihuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0sUmUucHJvdG90eXBlLl93cml0ZXY9bnVsbCxSZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlOyJmdW5jdGlvbiI9PXR5cGVvZiB0PyhyPXQsdD1udWxsLGU9bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxudWxsIT10JiZ0aGlzLndyaXRlKHQsZSksbi5jb3JrZWQmJihuLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLG4uZW5kaW5nfHxuLmZpbmlzaGVkfHxmdW5jdGlvbih0LGUscil7ZS5lbmRpbmc9ITAsQ2UodCxlKSxyJiYoZS5maW5pc2hlZD95dChyKTp0Lm9uY2UoImZpbmlzaCIscikpO2UuZW5kZWQ9ITAsdC53cml0YWJsZT0hMX0odGhpcyxuLHIpfSxDdChVZSx1ZSk7Zm9yKHZhciBNZT1PYmplY3Qua2V5cyhSZS5wcm90b3R5cGUpLEJlPTA7QmU8TWUubGVuZ3RoO0JlKyspe3ZhciB4ZT1NZVtCZV07VWUucHJvdG90eXBlW3hlXXx8KFVlLnByb3RvdHlwZVt4ZV09UmUucHJvdG90eXBlW3hlXSl9ZnVuY3Rpb24gVWUodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgVWUpKXJldHVybiBuZXcgVWUodCk7dWUuY2FsbCh0aGlzLHQpLFJlLmNhbGwodGhpcyx0KSx0JiYhMT09PXQucmVhZGFibGUmJih0aGlzLnJlYWRhYmxlPSExKSx0JiYhMT09PXQud3JpdGFibGUmJih0aGlzLndyaXRhYmxlPSExKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsdCYmITE9PT10LmFsbG93SGFsZk9wZW4mJih0aGlzLmFsbG93SGFsZk9wZW49ITEpLHRoaXMub25jZSgiZW5kIixJZSl9ZnVuY3Rpb24gSWUoKXt0aGlzLmFsbG93SGFsZk9wZW58fHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fHl0KERlLHRoaXMpfWZ1bmN0aW9uIERlKHQpe3QuZW5kKCl9ZnVuY3Rpb24gTmUodCl7dGhpcy5hZnRlclRyYW5zZm9ybT1mdW5jdGlvbihlLHIpe3JldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG49dC5fdHJhbnNmb3JtU3RhdGU7bi50cmFuc2Zvcm1pbmc9ITE7dmFyIGk9bi53cml0ZWNiO2lmKCFpKXJldHVybiB0LmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzIikpO24ud3JpdGVjaHVuaz1udWxsLG4ud3JpdGVjYj1udWxsLG51bGwhPXImJnQucHVzaChyKTtpKGUpO3ZhciBvPXQuX3JlYWRhYmxlU3RhdGU7by5yZWFkaW5nPSExLChvLm5lZWRSZWFkYWJsZXx8by5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrKSYmdC5fcmVhZChvLmhpZ2hXYXRlck1hcmspfSh0LGUscil9LHRoaXMubmVlZFRyYW5zZm9ybT0hMSx0aGlzLnRyYW5zZm9ybWluZz0hMSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlY2h1bms9bnVsbCx0aGlzLndyaXRlZW5jb2Rpbmc9bnVsbH1mdW5jdGlvbiBGZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBGZSkpcmV0dXJuIG5ldyBGZSh0KTtVZS5jYWxsKHRoaXMsdCksdGhpcy5fdHJhbnNmb3JtU3RhdGU9bmV3IE5lKHRoaXMpO3ZhciBlPXRoaXM7dGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGU9ITAsdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jPSExLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC50cmFuc2Zvcm0mJih0aGlzLl90cmFuc2Zvcm09dC50cmFuc2Zvcm0pLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZsdXNoJiYodGhpcy5fZmx1c2g9dC5mbHVzaCkpLHRoaXMub25jZSgicHJlZmluaXNoIiwoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goKGZ1bmN0aW9uKHQpe3plKGUsdCl9KSk6emUoZSl9KSl9ZnVuY3Rpb24gemUodCxlKXtpZihlKXJldHVybiB0LmVtaXQoImVycm9yIixlKTt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49dC5fdHJhbnNmb3JtU3RhdGU7aWYoci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAiKTtpZihuLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gdC5wdXNoKG51bGwpfWZ1bmN0aW9uIHFlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHFlKSlyZXR1cm4gbmV3IHFlKHQpO0ZlLmNhbGwodGhpcyx0KX1mdW5jdGlvbiBZZSgpe2UuY2FsbCh0aGlzKX1DdChGZSxVZSksRmUucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxVZS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsdCxlKX0sRmUucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIil9LEZlLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKG4ud3JpdGVjYj1yLG4ud3JpdGVjaHVuaz10LG4ud3JpdGVlbmNvZGluZz1lLCFuLnRyYW5zZm9ybWluZyl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTsobi5uZWVkVHJhbnNmb3JtfHxpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfX0sRmUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RyYW5zZm9ybVN0YXRlO251bGwhPT1lLndyaXRlY2h1bmsmJmUud3JpdGVjYiYmIWUudHJhbnNmb3JtaW5nPyhlLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLGUud3JpdGVlbmNvZGluZyxlLmFmdGVyVHJhbnNmb3JtKSk6ZS5uZWVkVHJhbnNmb3JtPSEwfSxDdChxZSxGZSkscWUucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3IobnVsbCx0KX0sQ3QoWWUsZSksWWUuUmVhZGFibGU9dWUsWWUuV3JpdGFibGU9UmUsWWUuRHVwbGV4PVVlLFllLlRyYW5zZm9ybT1GZSxZZS5QYXNzVGhyb3VnaD1xZSxZZS5TdHJlYW09WWUsWWUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxyKXt2YXIgbj10aGlzO2Z1bmN0aW9uIGkoZSl7dC53cml0YWJsZSYmITE9PT10LndyaXRlKGUpJiZuLnBhdXNlJiZuLnBhdXNlKCl9ZnVuY3Rpb24gbygpe24ucmVhZGFibGUmJm4ucmVzdW1lJiZuLnJlc3VtZSgpfW4ub24oImRhdGEiLGkpLHQub24oImRyYWluIixvKSx0Ll9pc1N0ZGlvfHxyJiYhMT09PXIuZW5kfHwobi5vbigiZW5kIixhKSxuLm9uKCJjbG9zZSIsdSkpO3ZhciBzPSExO2Z1bmN0aW9uIGEoKXtzfHwocz0hMCx0LmVuZCgpKX1mdW5jdGlvbiB1KCl7c3x8KHM9ITAsImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmdC5kZXN0cm95KCkpfWZ1bmN0aW9uIGgodCl7aWYoZigpLDA9PT1lLmxpc3RlbmVyQ291bnQodGhpcywiZXJyb3IiKSl0aHJvdyB0fWZ1bmN0aW9uIGYoKXtuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixpKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsbyksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsdSksbi5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixoKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGYpLG4ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixmKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZil9cmV0dXJuIG4ub24oImVycm9yIixoKSx0Lm9uKCJlcnJvciIsaCksbi5vbigiZW5kIixmKSxuLm9uKCJjbG9zZSIsZiksdC5vbigiY2xvc2UiLGYpLHQuZW1pdCgicGlwZSIsbiksdH07dmFyIFdlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e30sJGU9e30sR2U9e2dldCBleHBvcnRzKCl7cmV0dXJuICRlfSxzZXQgZXhwb3J0cyh0KXskZT10fX07ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/R2UuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2UmJih0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pKX06R2UuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9fTtsZXQgSmU9VmUoKTtmdW5jdGlvbiBIZSh0LGUpeygib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCkpJiYoZT10LHQ9e30pO2xldCByPW5ldyBKZSh0KTt2YXIgbjtyZXR1cm4gci5fZnJvbT1BcnJheS5pc0FycmF5KGUpPyhuPShuPWUpLnNsaWNlKCksZnVuY3Rpb24odCxlKXtsZXQgcj1udWxsLGk9bi5sZW5ndGg/bi5zaGlmdCgpOm51bGw7aSBpbnN0YW5jZW9mIEVycm9yJiYocj1pLGk9bnVsbCksZShyLGkpfSk6ZXx8S2Uscn1mdW5jdGlvbiBWZSh0LGUpe2Z1bmN0aW9uIHIoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByKGUpO3RoaXMuX3JlYWRpbmc9ITEsdGhpcy5fY2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtpZihuLmRlc3Ryb3llZClyZXR1cm47aWYodClyZXR1cm4gbi5kZXN0cm95KHQpO2lmKG51bGw9PT1lKXJldHVybiBuLnB1c2gobnVsbCk7bi5fcmVhZGluZz0hMSxuLnB1c2goZSkmJm4uX3JlYWQoaSl9LHRoaXMuZGVzdHJveWVkPSExLHVlLmNhbGwodGhpcyxlfHx0KTtsZXQgbj10aGlzLGk9dGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZT10LHQ9e30pLHQ9WmUodCksJGUocix1ZSksci5wcm90b3R5cGUuX2Zyb209ZXx8S2Usci5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5fcmVhZGluZ3x8dGhpcy5kZXN0cm95ZWR8fCh0aGlzLl9yZWFkaW5nPSEwLHRoaXMuX2Zyb20odCx0aGlzLl9jYWxsYmFjaykpfSxyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKHQpe2lmKHRoaXMuZGVzdHJveWVkKXJldHVybjt0aGlzLmRlc3Ryb3llZD0hMDtsZXQgZT10aGlzO3Byb2Nlc3MubmV4dFRpY2soKGZ1bmN0aW9uKCl7dCYmZS5lbWl0KCJlcnJvciIsdCksZS5lbWl0KCJjbG9zZSIpfSkpfSxyfWZ1bmN0aW9uIEtlKCl7fWZ1bmN0aW9uIFplKHQpe3JldHVybiB0PXR8fHt9fUhlLmN0b3I9VmUsSGUub2JqPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKCJmdW5jdGlvbiI9PXR5cGVvZiB0fHxBcnJheS5pc0FycmF5KHQpKSYmKGU9dCx0PXt9KSwodD1aZSh0KSkub2JqZWN0TW9kZT0hMCx0LmhpZ2hXYXRlck1hcms9MTYsSGUodCxlKX07dmFyIFFlLFhlPTEsdHI9e30sZXI9ITEscnI9YS5kb2N1bWVudDtmdW5jdGlvbiBucih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9bmV3IEZ1bmN0aW9uKCIiK3QpKTtmb3IodmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSkscj0wO3I8ZS5sZW5ndGg7cisrKWVbcl09YXJndW1lbnRzW3IrMV07dmFyIG49e2NhbGxiYWNrOnQsYXJnczplfTtyZXR1cm4gdHJbWGVdPW4sUWUoWGUpLFhlKyt9ZnVuY3Rpb24gaXIodCl7aWYoZXIpc2V0VGltZW91dChpciwwLHQpO2Vsc2V7dmFyIGU9dHJbdF07aWYoZSl7ZXI9ITA7dHJ5eyFmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLHI9dC5hcmdzO3N3aXRjaChyLmxlbmd0aCl7Y2FzZSAwOmUoKTticmVhaztjYXNlIDE6ZShyWzBdKTticmVhaztjYXNlIDI6ZShyWzBdLHJbMV0pO2JyZWFrO2Nhc2UgMzplKHJbMF0sclsxXSxyWzJdKTticmVhaztkZWZhdWx0OmUuYXBwbHkodm9pZCAwLHIpfX0oZSl9ZmluYWxseXshZnVuY3Rpb24odCl7ZGVsZXRlIHRyW3RdfSh0KSxlcj0hMX19fX12YXIgb3Isc3IsYXIsdXIsaHI9T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoYSk7ZnVuY3Rpb24gZnIodCl7bGV0IGUscj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7aWYoZT0iW29iamVjdCBQcm9taXNlXSI9PT1yLGUpcmV0dXJuITA7aWYoIltvYmplY3QgRnVuY3Rpb25dIiE9PXIpcmV0dXJuITE7dHJ5e2U9ImZ1bmN0aW9uIiE9dHlwZW9mIHQuc3Vic2NyaWJlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVufWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiBjcih0KXtsZXQgZSxyLG47ZnVuY3Rpb24gaShpKXsoKHQ9aSlpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxBcnJheUJ1ZmZlci5pc1ZpZXcodCkmJiFfLmlzQnVmZmVyKHQpKSYmKHQ9Xy5mcm9tKHQpKSxlPWZyKHQpP3Q6bnVsbDtjb25zdCBvPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0mJiJzdHJpbmciIT10eXBlb2YgdCYmIV8uaXNCdWZmZXIodCk7cj1vP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGw7Y29uc3Qgcz0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl07bj1zP3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6bnVsbH1yZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dC5zbGljZSgpKSxpKHQpLEhlKChmdW5jdGlvbiBvKHMsYSl7aWYoZSlyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMscyxhKX1jYXRjaCh0KXthKHQpfX0pKCk7aWYocil7Y29uc3QgdD1yLm5leHQoKTtyZXR1cm4gdm9pZCBucihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9aWYobilyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7bnIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe25yKGEsdCl9fSkoKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHZvaWQgbnIoYSxudWxsLG51bGwpO2NvbnN0IHU9dC5zbGljZSgwLHMpO3Q9dC5zbGljZShzKSxucihhLG51bGwsdSl9KSl9aHI9aHImJmhyLnNldFRpbWVvdXQ/aHI6YSwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKGEucHJvY2Vzcyk/UWU9ZnVuY3Rpb24odCl7THQubmV4dFRpY2soKGZ1bmN0aW9uKCl7aXIodCl9KSl9OiFmdW5jdGlvbigpe2lmKGEucG9zdE1lc3NhZ2UmJiFhLmltcG9ydFNjcmlwdHMpe3ZhciB0PSEwLGU9YS5vbm1lc3NhZ2U7cmV0dXJuIGEub25tZXNzYWdlPWZ1bmN0aW9uKCl7dD0hMX0sYS5wb3N0TWVzc2FnZSgiIiwiKiIpLGEub25tZXNzYWdlPWUsdH19KCk/YS5NZXNzYWdlQ2hhbm5lbD8oKHNyPW5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKHQpe2lyKHQuZGF0YSl9LFFlPWZ1bmN0aW9uKHQpe3NyLnBvcnQyLnBvc3RNZXNzYWdlKHQpfSk6cnImJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gcnIuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/KG9yPXJyLmRvY3VtZW50RWxlbWVudCxRZT1mdW5jdGlvbih0KXt2YXIgZT1yci5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lyKHQpLGUub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsb3IucmVtb3ZlQ2hpbGQoZSksZT1udWxsfSxvci5hcHBlbmRDaGlsZChlKX0pOlFlPWZ1bmN0aW9uKHQpe3NldFRpbWVvdXQoaXIsMCx0KX06KGFyPSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIix1cj1mdW5jdGlvbih0KXt0LnNvdXJjZT09PWEmJiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09dC5kYXRhLmluZGV4T2YoYXIpJiZpcigrdC5kYXRhLnNsaWNlKGFyLmxlbmd0aCkpfSxhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix1ciwhMSk6YS5hdHRhY2hFdmVudCgib25tZXNzYWdlIix1ciksUWU9ZnVuY3Rpb24odCl7YS5wb3N0TWVzc2FnZShhcit0LCIqIil9KSxjci5vYmplY3Q9dD0+e2xldCBlLHIsbjtmdW5jdGlvbiBpKGkpe2U9ZnIodD1pKT90Om51bGwscj0hZSYmdFtTeW1ib2wuaXRlcmF0b3JdP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGwsbj0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0/dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTpudWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LnNsaWNlKCkpLGkodCksSGUub2JqKChmdW5jdGlvbiBvKHMsYSl7aWYoZSkoYXN5bmMoKT0+e3RyeXthd2FpdCBpKGF3YWl0IGUpLG8uY2FsbCh0aGlzLHMsYSl9Y2F0Y2godCl7YSh0KX19KSgpO2Vsc2UgaWYocil7Y29uc3QgdD1yLm5leHQoKTtucihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9ZWxzZSBuPyhhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7bnIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe25yKGEsdCl9fSkoKToodGhpcy5wdXNoKHQpLG5yKGEsbnVsbCxudWxsKSl9KSl9O3ZhciBscj17fSxwcj1sci5MRUZUX0JSQUNFPTEsZHI9bHIuUklHSFRfQlJBQ0U9Mixncj1sci5MRUZUX0JSQUNLRVQ9Myx5cj1sci5SSUdIVF9CUkFDS0VUPTQsdnI9bHIuQ09MT049NSxicj1sci5DT01NQT02LG1yPWxyLlRSVUU9Nyx3cj1sci5GQUxTRT04LF9yPWxyLk5VTEw9OSxTcj1sci5TVFJJTkc9MTAsRXI9bHIuTlVNQkVSPTExLGtyPWxyLlNUQVJUPTE3LFJyPWxyLlNUT1A9MTgsQXI9bHIuVFJVRTE9MzMsVHI9bHIuVFJVRTI9MzQsT3I9bHIuVFJVRTM9MzUsanI9bHIuRkFMU0UxPTQ5LExyPWxyLkZBTFNFMj01MCxDcj1sci5GQUxTRTM9NTEsUHI9bHIuRkFMU0U0PTUyLE1yPWxyLk5VTEwxPTY1LEJyPWxyLk5VTEwyPTY2LHhyPWxyLk5VTEwzPTY3LFVyPWxyLk5VTUJFUjE9ODEsSXI9bHIuTlVNQkVSMz04MyxEcj1sci5TVFJJTkcxPTk3LE5yPWxyLlNUUklORzI9OTgsRnI9bHIuU1RSSU5HMz05OSx6cj1sci5TVFJJTkc0PTEwMCxxcj1sci5TVFJJTkc1PTEwMSxZcj1sci5TVFJJTkc2PTEwMixXcj1sci5WQUxVRT0xMTMsJHI9bHIuS0VZPTExNCxHcj1sci5PQkpFQ1Q9MTI5LEpyPWxyLkFSUkFZPTEzMCxIcj0iXFwiLmNoYXJDb2RlQXQoMCksVnI9Ii8iLmNoYXJDb2RlQXQoMCksS3I9IlxiIi5jaGFyQ29kZUF0KDApLFpyPSJcZiIuY2hhckNvZGVBdCgwKSxRcj0iXG4iLmNoYXJDb2RlQXQoMCksWHI9IlxyIi5jaGFyQ29kZUF0KDApLHRuPSJcdCIuY2hhckNvZGVBdCgwKSxlbj02NTUzNjtmdW5jdGlvbiBybigpe3RoaXMudFN0YXRlPWtyLHRoaXMudmFsdWU9dm9pZCAwLHRoaXMuc3RyaW5nPXZvaWQgMCx0aGlzLnN0cmluZ0J1ZmZlcj1fLmFsbG9jP18uYWxsb2MoZW4pOm5ldyBfKGVuKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudW5pY29kZT12b2lkIDAsdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCx0aGlzLmtleT12b2lkIDAsdGhpcy5tb2RlPXZvaWQgMCx0aGlzLnN0YWNrPVtdLHRoaXMuc3RhdGU9V3IsdGhpcy5ieXRlc19yZW1haW5pbmc9MCx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTAsdGhpcy50ZW1wX2J1ZmZzPXsyOm5ldyBfKDIpLDM6bmV3IF8oMyksNDpuZXcgXyg0KX0sdGhpcy5vZmZzZXQ9LTF9cm4udG9rbmFtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyhscikscj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl7dmFyIGk9ZVtyXTtpZihscltpXT09PXQpcmV0dXJuIGl9cmV0dXJuIHQmJiIweCIrdC50b1N0cmluZygxNil9O3ZhciBubj1ybi5wcm90b3R5cGU7bm4ub25FcnJvcj1mdW5jdGlvbih0KXt0aHJvdyB0fSxubi5jaGFyRXJyb3I9ZnVuY3Rpb24odCxlKXt0aGlzLnRTdGF0ZT1Scix0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJVbmV4cGVjdGVkICIrSlNPTi5zdHJpbmdpZnkoU3RyaW5nLmZyb21DaGFyQ29kZSh0W2VdKSkrIiBhdCBwb3NpdGlvbiAiK2UrIiBpbiBzdGF0ZSAiK3JuLnRva25hbSh0aGlzLnRTdGF0ZSkpKX0sbm4uYXBwZW5kU3RyaW5nQ2hhcj1mdW5jdGlvbih0KXt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD49ZW4mJih0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0aGlzLnN0cmluZ0J1ZmZlclt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCsrXT10fSxubi5hcHBlbmRTdHJpbmdCdWY9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQubGVuZ3RoOyJudW1iZXIiPT10eXBlb2YgZSYmKG49Im51bWJlciI9PXR5cGVvZiByP3I8MD90Lmxlbmd0aC1lK3I6ci1lOnQubGVuZ3RoLWUpLG48MCYmKG49MCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrbj5lbiYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIsMCx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCksdC5jb3B5KHRoaXMuc3RyaW5nQnVmZmVyLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0LGUsciksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrPW59LG5uLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9bmV3IF8odCkpO2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0aGlzLnRTdGF0ZT09PWtyKXtpZihlPXRbcl0sdGhpcy5vZmZzZXQrKywxMjM9PT1lKXRoaXMub25Ub2tlbihwciwieyIpO2Vsc2UgaWYoMTI1PT09ZSl0aGlzLm9uVG9rZW4oZHIsIn0iKTtlbHNlIGlmKDkxPT09ZSl0aGlzLm9uVG9rZW4oZ3IsIlsiKTtlbHNlIGlmKDkzPT09ZSl0aGlzLm9uVG9rZW4oeXIsIl0iKTtlbHNlIGlmKDU4PT09ZSl0aGlzLm9uVG9rZW4odnIsIjoiKTtlbHNlIGlmKDQ0PT09ZSl0aGlzLm9uVG9rZW4oYnIsIiwiKTtlbHNlIGlmKDExNj09PWUpdGhpcy50U3RhdGU9QXI7ZWxzZSBpZigxMDI9PT1lKXRoaXMudFN0YXRlPWpyO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLnRTdGF0ZT1NcjtlbHNlIGlmKDM0PT09ZSl0aGlzLnN0cmluZz0iIix0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudFN0YXRlPURyO2Vsc2UgaWYoNDU9PT1lKXRoaXMuc3RyaW5nPSItIix0aGlzLnRTdGF0ZT1VcjtlbHNlIGlmKGU+PTQ4JiZlPDY0KXRoaXMuc3RyaW5nPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGU9SXI7ZWxzZSBpZigzMiE9PWUmJjkhPT1lJiYxMCE9PWUmJjEzIT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09RHIpaWYoZT10W3JdLHRoaXMuYnl0ZXNfcmVtYWluaW5nPjApe2Zvcih2YXIgaT0wO2k8dGhpcy5ieXRlc19yZW1haW5pbmc7aSsrKXRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXVt0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLXRoaXMuYnl0ZXNfcmVtYWluaW5nK2ldPXRbaV07dGhpcy5hcHBlbmRTdHJpbmdCdWYodGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdKSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPXRoaXMuYnl0ZXNfcmVtYWluaW5nPTAscj1yK2ktMX1lbHNlIGlmKDA9PT10aGlzLmJ5dGVzX3JlbWFpbmluZyYmZT49MTI4KXtpZihlPD0xOTN8fGU+MjQ0KXJldHVybiB0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJJbnZhbGlkIFVURi04IGNoYXJhY3RlciBhdCBwb3NpdGlvbiAiK3IrIiBpbiBzdGF0ZSAiK3JuLnRva25hbSh0aGlzLnRTdGF0ZSkpKTtpZihlPj0xOTQmJmU8PTIyMyYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MiksZT49MjI0JiZlPD0yMzkmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTMpLGU+PTI0MCYmZTw9MjQ0JiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT00KSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlK3I+dC5sZW5ndGgpe2Zvcih2YXIgbz0wO288PXQubGVuZ3RoLTEtcjtvKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW29dPXRbcitvXTt0aGlzLmJ5dGVzX3JlbWFpbmluZz1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdC5sZW5ndGgscj10Lmxlbmd0aC0xfWVsc2UgdGhpcy5hcHBlbmRTdHJpbmdCdWYodCxyLHIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZSkscj1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtMX1lbHNlIGlmKDM0PT09ZSl0aGlzLnRTdGF0ZT1rcix0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiLDAsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy5vblRva2VuKFNyLHRoaXMuc3RyaW5nKSx0aGlzLm9mZnNldCs9Xy5ieXRlTGVuZ3RoKHRoaXMuc3RyaW5nLCJ1dGY4IikrMSx0aGlzLnN0cmluZz12b2lkIDA7ZWxzZSBpZig5Mj09PWUpdGhpcy50U3RhdGU9TnI7ZWxzZXtpZighKGU+PTMyKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZSl9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PU5yKWlmKDM0PT09KGU9dFtyXSkpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGUpLHRoaXMudFN0YXRlPURyO2Vsc2UgaWYoOTI9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihIciksdGhpcy50U3RhdGU9RHI7ZWxzZSBpZig0Nz09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFZyKSx0aGlzLnRTdGF0ZT1EcjtlbHNlIGlmKDk4PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoS3IpLHRoaXMudFN0YXRlPURyO2Vsc2UgaWYoMTAyPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoWnIpLHRoaXMudFN0YXRlPURyO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoUXIpLHRoaXMudFN0YXRlPURyO2Vsc2UgaWYoMTE0PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoWHIpLHRoaXMudFN0YXRlPURyO2Vsc2UgaWYoMTE2PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIodG4pLHRoaXMudFN0YXRlPURyO2Vsc2V7aWYoMTE3IT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnVuaWNvZGU9IiIsdGhpcy50U3RhdGU9RnJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUZyfHx0aGlzLnRTdGF0ZT09PXpyfHx0aGlzLnRTdGF0ZT09PXFyfHx0aGlzLnRTdGF0ZT09PVlyKXtpZighKChlPXRbcl0pPj00OCYmZTw2NHx8ZT42NCYmZTw9NzB8fGU+OTYmJmU8PTEwMikpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7aWYodGhpcy51bmljb2RlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlKys9PT1Zcil7dmFyIHM9cGFyc2VJbnQodGhpcy51bmljb2RlLDE2KTt0aGlzLnVuaWNvZGU9dm9pZCAwLHZvaWQgMCE9PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmcz49NTYzMjAmJnM8NTczNDQ/KHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBfKFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5oaWdoU3Vycm9nYXRlLHMpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCk6dm9pZCAwPT09dGhpcy5oaWdoU3Vycm9nYXRlJiZzPj01NTI5NiYmczw1NjMyMD90aGlzLmhpZ2hTdXJyb2dhdGU9czoodm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiYodGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IF8oU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCksdGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IF8oU3RyaW5nLmZyb21DaGFyQ29kZShzKSkpKSx0aGlzLnRTdGF0ZT1Ecn19ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVVyfHx0aGlzLnRTdGF0ZT09PUlyKXN3aXRjaChlPXRbcl0pe2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6Y2FzZSA0NjpjYXNlIDEwMTpjYXNlIDY5OmNhc2UgNDM6Y2FzZSA0NTp0aGlzLnN0cmluZys9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZT1JcjticmVhaztkZWZhdWx0OnRoaXMudFN0YXRlPWtyO3ZhciBhPU51bWJlcih0aGlzLnN0cmluZyk7aWYoaXNOYU4oYSkpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy5zdHJpbmcubWF0Y2goL1swLTldKy8pPT10aGlzLnN0cmluZyYmYS50b1N0cmluZygpIT10aGlzLnN0cmluZz90aGlzLm9uVG9rZW4oU3IsdGhpcy5zdHJpbmcpOnRoaXMub25Ub2tlbihFcixhKSx0aGlzLm9mZnNldCs9dGhpcy5zdHJpbmcubGVuZ3RoLTEsdGhpcy5zdHJpbmc9dm9pZCAwLHItLX1lbHNlIGlmKHRoaXMudFN0YXRlPT09QXIpe2lmKDExNCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9VHJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVRyKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPU9yfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Pcil7aWYoMTAxIT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1rcix0aGlzLm9uVG9rZW4obXIsITApLHRoaXMub2Zmc2V0Kz0zfWVsc2UgaWYodGhpcy50U3RhdGU9PT1qcil7aWYoOTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUxyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Mcil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Dcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09Q3Ipe2lmKDExNSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9UHJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVByKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPWtyLHRoaXMub25Ub2tlbih3ciwhMSksdGhpcy5vZmZzZXQrPTR9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PU1yKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUJyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ccil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT14cn1lbHNlIGlmKHRoaXMudFN0YXRlPT09eHIpe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9a3IsdGhpcy5vblRva2VuKF9yLG51bGwpLHRoaXMub2Zmc2V0Kz0zfX0sbm4ub25Ub2tlbj1mdW5jdGlvbih0LGUpe30sbm4ucGFyc2VFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPVJyLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIitybi50b2tuYW0odCkrKGU/IigiK0pTT04uc3RyaW5naWZ5KGUpKyIpIjoiIikrIiBpbiBzdGF0ZSAiK3JuLnRva25hbSh0aGlzLnN0YXRlKSkpfSxubi5wdXNoPWZ1bmN0aW9uKCl7dGhpcy5zdGFjay5wdXNoKHt2YWx1ZTp0aGlzLnZhbHVlLGtleTp0aGlzLmtleSxtb2RlOnRoaXMubW9kZX0pfSxubi5wb3A9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZhbHVlLGU9dGhpcy5zdGFjay5wb3AoKTt0aGlzLnZhbHVlPWUudmFsdWUsdGhpcy5rZXk9ZS5rZXksdGhpcy5tb2RlPWUubW9kZSx0aGlzLmVtaXQodCksdGhpcy5tb2RlfHwodGhpcy5zdGF0ZT1Xcil9LG5uLmVtaXQ9ZnVuY3Rpb24odCl7dGhpcy5tb2RlJiYodGhpcy5zdGF0ZT1iciksdGhpcy5vblZhbHVlKHQpfSxubi5vblZhbHVlPWZ1bmN0aW9uKHQpe30sbm4ub25Ub2tlbj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuc3RhdGU9PT1XcilpZih0PT09U3J8fHQ9PT1Fcnx8dD09PW1yfHx0PT09d3J8fHQ9PT1fcil0aGlzLnZhbHVlJiYodGhpcy52YWx1ZVt0aGlzLmtleV09ZSksdGhpcy5lbWl0KGUpO2Vsc2UgaWYodD09PXByKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT17fTp0aGlzLnZhbHVlPXt9LHRoaXMua2V5PXZvaWQgMCx0aGlzLnN0YXRlPSRyLHRoaXMubW9kZT1HcjtlbHNlIGlmKHQ9PT1ncil0aGlzLnB1c2goKSx0aGlzLnZhbHVlP3RoaXMudmFsdWU9dGhpcy52YWx1ZVt0aGlzLmtleV09W106dGhpcy52YWx1ZT1bXSx0aGlzLmtleT0wLHRoaXMubW9kZT1Kcix0aGlzLnN0YXRlPVdyO2Vsc2UgaWYodD09PWRyKXtpZih0aGlzLm1vZGUhPT1HcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNle2lmKHQhPT15cilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7aWYodGhpcy5tb2RlIT09SnIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZSBpZih0aGlzLnN0YXRlPT09JHIpaWYodD09PVNyKXRoaXMua2V5PWUsdGhpcy5zdGF0ZT12cjtlbHNle2lmKHQhPT1kcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT12cil7aWYodCE9PXZyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnN0YXRlPVdyfWVsc2V7aWYodGhpcy5zdGF0ZSE9PWJyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0PT09YnIpdGhpcy5tb2RlPT09SnI/KHRoaXMua2V5KyssdGhpcy5zdGF0ZT1Xcik6dGhpcy5tb2RlPT09R3ImJih0aGlzLnN0YXRlPSRyKTtlbHNle2lmKCEodD09PXlyJiZ0aGlzLm1vZGU9PT1Kcnx8dD09PWRyJiZ0aGlzLm1vZGU9PT1HcikpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9fX0scm4uQz1scjt2YXIgb249cm47ZnVuY3Rpb24gc24odCxlLHIpe3Q9dHx8ZnVuY3Rpb24odCl7dGhpcy5xdWV1ZSh0KX0sZT1lfHxmdW5jdGlvbigpe3RoaXMucXVldWUobnVsbCl9O2xldCBuPSExLGk9ITEsbz1bXSxzPSExLGE9bmV3IFllO2Z1bmN0aW9uIHUoKXtmb3IoO28ubGVuZ3RoJiYhYS5wYXVzZWQ7KXtsZXQgdD1vLnNoaWZ0KCk7aWYobnVsbD09PXQpcmV0dXJuIGEuZW1pdCgiZW5kIik7YS5lbWl0KCJkYXRhIix0KX19cmV0dXJuIGEucmVhZGFibGU9YS53cml0YWJsZT0hMCxhLnBhdXNlZD0hMSxhLmF1dG9EZXN0cm95PSEociYmITE9PT1yLmF1dG9EZXN0cm95KSxhLndyaXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNhbGwodGhpcyxlKSwhYS5wYXVzZWR9LGEucXVldWU9YS5wdXNoPWZ1bmN0aW9uKHQpe3JldHVybiBzfHwobnVsbD09PXQmJihzPSEwKSxvLnB1c2godCksdSgpKSxhfSxhLm9uKCJlbmQiLChmdW5jdGlvbigpe2EucmVhZGFibGU9ITEsIWEud3JpdGFibGUmJmEuYXV0b0Rlc3Ryb3kmJkx0Lm5leHRUaWNrKChmdW5jdGlvbigpe2EuZGVzdHJveSgpfSkpfSkpLGEuZW5kPWZ1bmN0aW9uKHQpe2lmKCFuKXJldHVybiBuPSEwLGFyZ3VtZW50cy5sZW5ndGgmJmEud3JpdGUodCksYS53cml0YWJsZT0hMSxlLmNhbGwoYSksIWEucmVhZGFibGUmJmEuYXV0b0Rlc3Ryb3kmJmEuZGVzdHJveSgpLGF9LGEuZGVzdHJveT1mdW5jdGlvbigpe2lmKCFpKXJldHVybiBpPSEwLG49ITAsby5sZW5ndGg9MCxhLndyaXRhYmxlPWEucmVhZGFibGU9ITEsYS5lbWl0KCJjbG9zZSIpLGF9LGEucGF1c2U9ZnVuY3Rpb24oKXtpZighYS5wYXVzZWQpcmV0dXJuIGEucGF1c2VkPSEwLGF9LGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGEucGF1c2VkJiYoYS5wYXVzZWQ9ITEsYS5lbWl0KCJyZXN1bWUiKSksdSgpLGEucGF1c2VkfHxhLmVtaXQoImRyYWluIiksYX0sYX1zbi50aHJvdWdoPXNuO2xldCBhbj17cGFyc2U6ZnVuY3Rpb24odCxlKXtsZXQgcixuO2Z1bmN0aW9uIGkodCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/ZT09PXQ6dCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuZXhlYz90LmV4ZWMoZSk6ImJvb2xlYW4iPT10eXBlb2YgdHx8Im9iamVjdCI9PXR5cGVvZiB0P3Q6ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQoZSl9bGV0IG89bmV3IG9uLHM9c24oKGZ1bmN0aW9uKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9Xy5mcm9tKHQpKSxvLndyaXRlKHQpfSksKGZ1bmN0aW9uKHQpe3QmJnMud3JpdGUodCksciYmcy5lbWl0KCJoZWFkZXIiLHIpLG4mJnMuZW1pdCgiZm9vdGVyIixuKSxzLnF1ZXVlKG51bGwpfSkpO2Z1bmN0aW9uIGEodCxlKXshMSE9PXImJihyPXJ8fHt9LHJbdF09ZSksITEhPT1uJiYhMT09PXImJihuPW58fHt9LG5bdF09ZSl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnNwbGl0KCIuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iJCoiPT09dD97ZW1pdEtleTohMH06IioiPT09dHx8KCIiPT09dD97cmVjdXJzZTohMH06dCl9KSkpLHQmJnQubGVuZ3RofHwodD1udWxsKSxvLm9uVmFsdWU9ZnVuY3Rpb24obil7aWYodGhpcy5yb290fHwocy5yb290PW4pLCF0KXJldHVybjtsZXQgbz0wLHU9MCxoPSExLGY9ITE7Zm9yKDtvPHQubGVuZ3RoOyl7bGV0IGUscj10W29dO2lmKHUrKyxyJiYhci5yZWN1cnNlKXtpZihlPXU9PT10aGlzLnN0YWNrLmxlbmd0aD90aGlzOnRoaXMuc3RhY2tbdV0sIWUpcmV0dXJuO2lmKCFpKHIsZS5rZXkpKXJldHVybiB2b2lkIGEoZS5rZXksbik7aD0hIXIuZW1pdEtleSxmPSEhci5lbWl0UGF0aCxvKyt9ZWxzZXtvKys7bGV0IHI9dFtvXTtpZighcilyZXR1cm47Zm9yKDs7KXtpZihlPXU9PT10aGlzLnN0YWNrLmxlbmd0aD90aGlzOnRoaXMuc3RhY2tbdV0sIWUpcmV0dXJuO2lmKGkocixlLmtleSkpe28rKyxPYmplY3QuaXNGcm96ZW4odGhpcy5zdGFja1t1XSl8fCh0aGlzLnN0YWNrW3VdLnZhbHVlPW51bGwpO2JyZWFrfWEoZS5rZXksbiksdSsrfX19aWYociYmKHMuZW1pdCgiaGVhZGVyIixyKSxyPSExKSx1IT09dGhpcy5zdGFjay5sZW5ndGgpcmV0dXJuO2xldCBjPXRoaXMuc3RhY2suc2xpY2UoMSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXl9KSkuY29uY2F0KFt0aGlzLmtleV0pLGw9bjtudWxsIT1sJiZudWxsIT0obD1lP2UobCxjKTpsKSYmKChofHxmKSYmKGw9e3ZhbHVlOmx9LGgmJihsLmtleT10aGlzLmtleSksZiYmKGwucGF0aD1jKSkscy5xdWV1ZShsKSksdGhpcy52YWx1ZSYmZGVsZXRlIHRoaXMudmFsdWVbdGhpcy5rZXldO2ZvcihsZXQgdCBpbiB0aGlzLnN0YWNrKU9iamVjdC5pc0Zyb3plbih0aGlzLnN0YWNrW3RdKXx8KHRoaXMuc3RhY2tbdF0udmFsdWU9bnVsbCl9LG8uX29uVG9rZW49by5vblRva2VuLG8ub25Ub2tlbj1mdW5jdGlvbihlLHIpe28uX29uVG9rZW4oZSxyKSwwPT09dGhpcy5zdGFjay5sZW5ndGgmJnMucm9vdCYmKHR8fHMucXVldWUocy5yb290KSxzLnJvb3Q9bnVsbCl9LG8ub25FcnJvcj1mdW5jdGlvbih0KXt0Lm1lc3NhZ2UuaW5kZXhPZigiYXQgcG9zaXRpb24iKT4tMSYmKHQubWVzc2FnZT0iSW52YWxpZCBKU09OICgiK3QubWVzc2FnZSsiKSIpLHMuZW1pdCgiZXJyb3IiLHQpfSxzfX0sdW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdW49T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShyKSYmKHRbcl09ZVtyXSl9LHVuKHQsZSl9O2xldCBobixmbj0vW1xcIlx1MDAwMC1cdTAwMWZcdTAwN2YtXHUwMDlmXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2csY249eyJcYiI6IlxcYiIsIlx0IjoiXFx0IiwiXG4iOiJcXG4iLCJcZiI6IlxcZiIsIlxyIjoiXFxyIiwnIic6J1xcIicsIlxcIjoiXFxcXCJ9O2Z1bmN0aW9uIGxuKHQpe3JldHVybiB0PyJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW4/aG4uUHJvbWlzZTpmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5waXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5vbmNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZW1vdmVMaXN0ZW5lcn0odCk/dC5fcmVhZGFibGVTdGF0ZS5vYmplY3RNb2RlP2huLlJlYWRhYmxlT2JqZWN0OmhuLlJlYWRhYmxlU3RyaW5nOkFycmF5LmlzQXJyYXkodCk/aG4uQXJyYXk6Im9iamVjdCI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2YgT2JqZWN0P2huLk9iamVjdDpobi5QcmltaXRpdmU6aG4uUHJpbWl0aXZlfSFmdW5jdGlvbih0KXt0W3QuQXJyYXk9MF09IkFycmF5Iix0W3QuT2JqZWN0PTFdPSJPYmplY3QiLHRbdC5SZWFkYWJsZVN0cmluZz0yXT0iUmVhZGFibGVTdHJpbmciLHRbdC5SZWFkYWJsZU9iamVjdD0zXT0iUmVhZGFibGVPYmplY3QiLHRbdC5QcmltaXRpdmU9NF09IlByaW1pdGl2ZSIsdFt0LlByb21pc2U9NV09IlByb21pc2UifShobnx8KGhuPXt9KSk7bGV0IHBuPVtdO3BuW2huLkFycmF5XT0iWyIscG5baG4uT2JqZWN0XT0ieyIscG5baG4uUmVhZGFibGVTdHJpbmddPSciJyxwbltobi5SZWFkYWJsZU9iamVjdF09IlsiO2xldCBkbj1bXTtkbltobi5BcnJheV09Il0iLGRuW2huLk9iamVjdF09In0iLGRuW2huLlJlYWRhYmxlU3RyaW5nXT0nIicsZG5baG4uUmVhZGFibGVPYmplY3RdPSJdIjtsZXQgZ249W107Zm9yKGxldCB0PTAsZT1PYmplY3QuZW50cmllcyhobik7dDxlLmxlbmd0aDt0Kyspe2xldCByPWVbdF0sbj1yWzBdLGk9clsxXTsibnVtYmVyIj09dHlwZW9mIGkmJihnbltpXT0icHJvY2VzcyIrbil9ZnVuY3Rpb24geW4odCl7cmV0dXJuIHQucmVwbGFjZShmbiwoZnVuY3Rpb24odCl7bGV0IGU9Y25bdF07cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP2U6IlxcdSIrdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg0LCIwIil9KSl9ZnVuY3Rpb24gdm4odCl7cmV0dXJuJyInK3luKHQpKyciJ31mdW5jdGlvbiBibih0LGUpe2xldCByPXQucmVhZChlKTtyZXR1cm4gbnVsbD09PXI/bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUscil7bGV0IG49ZnVuY3Rpb24oKXtyZXR1cm4gZShudWxsKX07dC5vbmNlKCJlbmQiLG4pLHQub25jZSgiZXJyb3IiLHIpLHQub25jZSgicmVhZGFibGUiLChmdW5jdGlvbigpe3QucmVtb3ZlTGlzdGVuZXIoImVuZCIsbiksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLHIpLGUodC5yZWFkKCkpfSkpfSkpOlByb21pc2UucmVzb2x2ZShyKX1mdW5jdGlvbiBtbih0KXtyZXR1cm4gdC50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gbG4odCk9PT1obi5Qcm9taXNlP21uKHQpOnR9KSl9bGV0IHduPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxyLG4saSl7dm9pZCAwPT09aSYmKGk9ITEpO2xldCBvPXQuY2FsbCh0aGlzKXx8dGhpcztvLmN5Y2xlPWksby5zdGFjaz1bXSxvLmRlcHRoPTAsby5wdXNoQ2FsbGVkPSExLG8uZW5kPSExLG8uaXNSZWFkaW5nPSExLG8ucmVhZE1vcmU9ITE7bGV0IHM9dHlwZW9mIG47cmV0dXJuInN0cmluZyIhPT1zJiYibnVtYmVyIiE9PXN8fChvLmdhcD1OdW1iZXIuaXNGaW5pdGUobik/IiAiLnJlcGVhdChuKTpuKSxPYmplY3QuYXNzaWduKG8se3Zpc2l0ZWQ6aT9uZXcgV2Vha01hcDpuZXcgV2Vha1NldCxyZXBsYWNlckZ1bmN0aW9uOnIgaW5zdGFuY2VvZiBGdW5jdGlvbiYmcixyZXBsYWNlckFycmF5OkFycmF5LmlzQXJyYXkocikmJnJ9KSxyIGluc3RhbmNlb2YgRnVuY3Rpb24mJihvLnJlcGxhY2VyRnVuY3Rpb249ciksQXJyYXkuaXNBcnJheShyKSYmKG8ucmVwbGFjZXJBcnJheT1yKSxvLmFkZFRvU3RhY2soZSksb31yZXR1cm4gZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fXVuKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKTooci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IHIpfShlLHQpLGUucHJvdG90eXBlLmN5Y2xlcj1mdW5jdGlvbih0LGUpe2xldCByPXRoaXMudmlzaXRlZC5nZXQoZSk7aWYocilyZXR1cm57JHJlZjpyfTtsZXQgbj10aGlzLnBhdGgoKTtyZXR1cm4gdm9pZCAwIT09dCYmbi5wdXNoKHQpLG49bi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiJbIisoTnVtYmVyLmlzSW50ZWdlcih0KT90OnZuKHQpKSsiXSJ9KSksdGhpcy52aXNpdGVkLnNldChlLG4ubGVuZ3RoPyIkIituLmpvaW4oIiIpOiIkIiksZX0sZS5wcm90b3R5cGUuYWRkVG9TdGFjaz1mdW5jdGlvbih0LGUscixuKXtsZXQgaSxvLHM9dGhpcyxhPXQ7dGhpcy5yZXBsYWNlckZ1bmN0aW9uJiYoYT10aGlzLnJlcGxhY2VyRnVuY3Rpb24oZXx8cixhLHRoaXMpKSxhJiZhLnRvSlNPTiBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYoYT1hLnRvSlNPTigpKSwoYSBpbnN0YW5jZW9mIEZ1bmN0aW9ufHwic3ltYm9sIj09dHlwZW9mIHQpJiYoYT12b2lkIDApLHZvaWQgMCE9PWUmJnRoaXMucmVwbGFjZXJBcnJheSYmKHRoaXMucmVwbGFjZXJBcnJheS5pbmNsdWRlcyhlKXx8KGE9dm9pZCAwKSk7bGV0IHU9bG4oYSk7aWYoKG4mJm4udHlwZT09PWhuLkFycmF5fHx2b2lkIDAhPT1hKSYmdSE9PWhuLlByb21pc2UmJihuJiYhbi5maXJzdCYmdGhpcy5fcHVzaCgiLCIpLG4mJihuLmZpcnN0PSExKSksdm9pZCAwIT09YSYmdSE9PWhuLlByb21pc2UmJmUmJih0aGlzLmdhcD90aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKyciJyt5bihlKSsnIjogJyk6dGhpcy5fcHVzaCgnIicreW4oZSkrJyI6JykpLHUhPT1obi5QcmltaXRpdmUpaWYodGhpcy5jeWNsZSlhPXRoaXMuY3ljbGVyKGV8fHIsYSksdT1sbihhKTtlbHNle2lmKHRoaXMudmlzaXRlZC5oYXMoYSkpdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoIkNvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT04iKSx7cmVhbFZhbHVlOmEsa2V5OmV8fHJ9KTt0aGlzLnZpc2l0ZWQuYWRkKGEpfSFlJiZyPi0xJiZ0aGlzLmRlcHRoJiZ0aGlzLmdhcCYmdGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSk7bGV0IGg9cG5bdV07aCYmdGhpcy5fcHVzaChoKTtsZXQgZj17a2V5OmUsaW5kZXg6cix0eXBlOnUscGFyZW50Om4sdmFsdWU6YSxmaXJzdDohMH07cmV0dXJuIHU9PT1obi5PYmplY3Q/KHRoaXMuZGVwdGgrPTEsZi51bnJlYWQ9T2JqZWN0LmtleXMoYSksZi5pc0VtcHR5PSFmLnVucmVhZC5sZW5ndGgpOnU9PT1obi5BcnJheT8odGhpcy5kZXB0aCs9MSxmLnVucmVhZD1hLmxlbmd0aCxmLmFycmF5TGVuZ3RoPWYudW5yZWFkLGYuaXNFbXB0eT0hZi51bnJlYWQpOnUhPT1obi5SZWFkYWJsZVN0cmluZyYmdSE9PWhuLlJlYWRhYmxlT2JqZWN0fHwodGhpcy5kZXB0aCs9MSxhLnJlYWRhYmxlRW5kZWR8fChudWxsPT09KGk9YS5fcmVhZGFibGVTdGF0ZSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuZW5kRW1pdHRlZCk/dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJSZWFkYWJsZSBTdHJlYW0gaGFzIGVuZGVkIGJlZm9yZSBpdCB3YXMgc2VyaWFsaXplZC4gQWxsIHN0cmVhbSBkYXRhIGhhdmUgYmVlbiBsb3N0IiksYSxlfHxyKTooYS5yZWFkYWJsZUZsb3dpbmd8fChudWxsPT09KG89YS5fcmVhZGFibGVTdGF0ZSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uZmxvd2luZykpJiYoYS5wYXVzZSgpLHRoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiUmVhZGFibGUgU3RyZWFtIGlzIGluIGZsb3dpbmcgbW9kZSwgZGF0YSBtYXkgaGF2ZSBiZWVuIGxvc3QuIFRyeWluZyB0byBwYXVzZSBzdHJlYW0uIiksYSxlfHxyKSksZi5yZWFkQ291bnQ9MCxhLm9uY2UoImVuZCIsKGZ1bmN0aW9uKCl7Zi5lbmQ9ITAscy5fX3JlYWQoKX0pKSxhLm9uY2UoImVycm9yIiwoZnVuY3Rpb24odCl7cy5lcnJvcj0hMCxzLmVtaXQoImVycm9yIix0KX0pKSksdGhpcy5zdGFjay51bnNoaWZ0KGYpLGZ9LGUucHJvdG90eXBlLnJlbW92ZUZyb21TdGFjaz1mdW5jdGlvbih0KXtsZXQgZT10LnR5cGUscj1lPT09aG4uT2JqZWN0fHxlPT09aG4uQXJyYXl8fGU9PT1obi5SZWFkYWJsZVN0cmluZ3x8ZT09PWhuLlJlYWRhYmxlT2JqZWN0O2UhPT1obi5QcmltaXRpdmUmJih0aGlzLmN5Y2xlfHx0aGlzLnZpc2l0ZWQuZGVsZXRlKHQudmFsdWUpLHImJih0aGlzLmRlcHRoLT0xKSk7bGV0IG49ZG5bZV07ciYmIXQuaXNFbXB0eSYmdGhpcy5nYXAmJnRoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkpLG4mJnRoaXMuX3B1c2gobik7bGV0IGk9dGhpcy5zdGFjay5pbmRleE9mKHQpO3RoaXMuc3RhY2suc3BsaWNlKGksMSl9LGUucHJvdG90eXBlLl9wdXNoPWZ1bmN0aW9uKHQpe3RoaXMucHVzaENhbGxlZD0hMCx0aGlzLnB1c2godCl9LGUucHJvdG90eXBlLnByb2Nlc3NSZWFkYWJsZU9iamVjdD1mdW5jdGlvbih0LGUpe2xldCByPXRoaXM7aWYoIXQuZW5kKXJldHVybiBibih0LnZhbHVlLGUpLnRoZW4oKGZ1bmN0aW9uKGUpe251bGwhPT1lJiYodC5maXJzdHx8ci5fcHVzaCgiLCIpLHQuZmlyc3Q9ITEsci5hZGRUb1N0YWNrKGUsdm9pZCAwLHQucmVhZENvdW50KSx0LnJlYWRDb3VudCs9MSl9KSk7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NPYmplY3Q9ZnVuY3Rpb24odCl7aWYoIXQudW5yZWFkLmxlbmd0aClyZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUZyb21TdGFjayh0KTtsZXQgZT10LnVucmVhZC5zaGlmdCgpLHI9dC52YWx1ZVtlXTt0aGlzLmFkZFRvU3RhY2socixlLHZvaWQgMCx0KX0sZS5wcm90b3R5cGUucHJvY2Vzc0FycmF5PWZ1bmN0aW9uKHQpe2xldCBlPXQudW5yZWFkO2lmKCFlKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlRnJvbVN0YWNrKHQpO2xldCByPXQuYXJyYXlMZW5ndGgtZSxuPXQudmFsdWVbcl07dC51bnJlYWQtPTEsdGhpcy5hZGRUb1N0YWNrKG4sdm9pZCAwLHIsdCl9LGUucHJvdG90eXBlLnByb2Nlc3NQcmltaXRpdmU9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dC52YWx1ZSl7bGV0IGUscj10eXBlb2YgdC52YWx1ZTtzd2l0Y2gocil7Y2FzZSJzdHJpbmciOmU9dm4odC52YWx1ZSk7YnJlYWs7Y2FzZSJudW1iZXIiOmU9TnVtYmVyLmlzRmluaXRlKHQudmFsdWUpP1N0cmluZyh0LnZhbHVlKToibnVsbCI7YnJlYWs7Y2FzZSJib29sZWFuIjplPVN0cmluZyh0LnZhbHVlKTticmVhaztjYXNlIm9iamVjdCI6dC52YWx1ZXx8KGU9Im51bGwiKTticmVhaztkZWZhdWx0OnRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdVbmtub3duIHR5cGUgIicrcisnIi4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJykse3ZhbHVlOnQudmFsdWV9KX10aGlzLl9wdXNoKGUpfWVsc2UhdGhpcy5zdGFja1sxXXx8dGhpcy5zdGFja1sxXS50eXBlIT09aG4uQXJyYXkmJnRoaXMuc3RhY2tbMV0udHlwZSE9PWhuLlJlYWRhYmxlT2JqZWN0P3QuYWRkU2VwYXJhdG9yQWZ0ZXJFbmQ9ITE6dGhpcy5fcHVzaCgibnVsbCIpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUmVhZGFibGVTdHJpbmc9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzO2lmKCF0LmVuZClyZXR1cm4gYm4odC52YWx1ZSxlKS50aGVuKChmdW5jdGlvbih0KXt0JiZyLl9wdXNoKHluKHQudG9TdHJpbmcoKSkpfSkpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUHJvbWlzZT1mdW5jdGlvbih0KXtsZXQgZT10aGlzO3JldHVybiBtbih0LnZhbHVlKS50aGVuKChmdW5jdGlvbihyKXtlLnJlbW92ZUZyb21TdGFjayh0KSxlLmFkZFRvU3RhY2socix0LmtleSx0LmluZGV4LHQucGFyZW50KX0pKX0sZS5wcm90b3R5cGUucHJvY2Vzc1N0YWNrVG9wSXRlbT1mdW5jdGlvbih0KXtsZXQgZSxyPXRoaXMsbj10aGlzLnN0YWNrWzBdO2lmKCFufHx0aGlzLmVycm9yKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTt0cnl7ZT10aGlzW2duW24udHlwZV1dKG4sdCl9Y2F0Y2godCl7cmV0dXJuIFByb21pc2UucmVqZWN0KHQpfXJldHVybiBQcm9taXNlLnJlc29sdmUoZSkudGhlbigoZnVuY3Rpb24oKXswPT09ci5zdGFjay5sZW5ndGgmJihyLmVuZD0hMCxyLl9wdXNoKG51bGwpKX0pKX0sZS5wcm90b3R5cGUuX19yZWFkPWZ1bmN0aW9uKHQpe2xldCBlPXRoaXM7aWYoIXRoaXMuaXNSZWFkaW5nJiYhdGhpcy5lcnJvcilyZXR1cm4gdGhpcy5pc1JlYWRpbmc9ITAsdGhpcy5yZWFkTW9yZT0hMSx0aGlzLnByb2Nlc3NTdGFja1RvcEl0ZW0odCkudGhlbigoZnVuY3Rpb24oKXshZS5lbmQmJiFlLmVycm9yJiYoZS5yZWFkTW9yZXx8IWUucHVzaENhbGxlZCk/bnIoKGZ1bmN0aW9uKCl7ZS5pc1JlYWRpbmc9ITEsZS5fX3JlYWQoKX0pKTplLmlzUmVhZGluZz0hMX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7ZS5lcnJvcj0hMCxlLmVtaXQoImVycm9yIix0KX0pKTt0aGlzLnJlYWRNb3JlPSEwfSxlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLnB1c2hDYWxsZWQ9ITEsdGhpcy5fX3JlYWQodCl9LGUucHJvdG90eXBlLnBhdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFjay5tYXAoKGZ1bmN0aW9uKHQpe2xldCBlPXQua2V5LHI9dC5pbmRleDtyZXR1cm4gZXx8cn0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0fHx0Pi0xfSkpLnJldmVyc2UoKX0sZX0odWUpO3ZhciBfbj1BcnJheS5pc0FycmF5LFNuPSJvYmplY3QiPT10eXBlb2YgV2UmJldlJiZXZS5PYmplY3Q9PT1PYmplY3QmJldlLEVuPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsa249U258fEVufHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLFJuPWtuLlN5bWJvbCxBbj1SbixUbj1PYmplY3QucHJvdG90eXBlLE9uPVRuLmhhc093blByb3BlcnR5LGpuPVRuLnRvU3RyaW5nLExuPUFuP0FuLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgQ249ZnVuY3Rpb24odCl7dmFyIGU9T24uY2FsbCh0LExuKSxyPXRbTG5dO3RyeXt0W0xuXT12b2lkIDA7dmFyIG49ITB9Y2F0Y2godCl7fXZhciBpPWpuLmNhbGwodCk7cmV0dXJuIG4mJihlP3RbTG5dPXI6ZGVsZXRlIHRbTG5dKSxpfSxQbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBNbj1DbixCbj1mdW5jdGlvbih0KXtyZXR1cm4gUG4uY2FsbCh0KX0seG49Um4/Um4udG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBVbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjp4biYmeG4gaW4gT2JqZWN0KHQpP01uKHQpOkJuKHQpfTt2YXIgSW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH0sRG49VW4sTm49SW47dmFyIEZuPWZ1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8Tm4odCkmJiJbb2JqZWN0IFN5bWJvbF0iPT1Ebih0KX0sem49X24scW49Rm4sWW49L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sV249L15cdyokLzt2YXIgJG49ZnVuY3Rpb24odCxlKXtpZih6bih0KSlyZXR1cm4hMTt2YXIgcj10eXBlb2YgdDtyZXR1cm4hKCJudW1iZXIiIT1yJiYic3ltYm9sIiE9ciYmImJvb2xlYW4iIT1yJiZudWxsIT10JiYhcW4odCkpfHwoV24udGVzdCh0KXx8IVluLnRlc3QodCl8fG51bGwhPWUmJnQgaW4gT2JqZWN0KGUpKX07dmFyIEduPWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfSxKbj1VbixIbj1Hbjt2YXIgVm4sS249ZnVuY3Rpb24odCl7aWYoIUhuKHQpKXJldHVybiExO3ZhciBlPUpuKHQpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgUHJveHldIj09ZX0sWm49a25bIl9fY29yZS1qc19zaGFyZWRfXyJdLFFuPShWbj0vW14uXSskLy5leGVjKFpuJiZabi5rZXlzJiZabi5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrVm46IiI7dmFyIFhuPWZ1bmN0aW9uKHQpe3JldHVybiEhUW4mJlFuIGluIHR9LHRpPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzt2YXIgZWk9S24scmk9WG4sbmk9R24saWk9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiB0aS5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn0sb2k9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sc2k9RnVuY3Rpb24ucHJvdG90eXBlLGFpPU9iamVjdC5wcm90b3R5cGUsdWk9c2kudG9TdHJpbmcsaGk9YWkuaGFzT3duUHJvcGVydHksZmk9UmVnRXhwKCJeIit1aS5jYWxsKGhpKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgY2k9ZnVuY3Rpb24odCl7cmV0dXJuISghbmkodCl8fHJpKHQpKSYmKGVpKHQpP2ZpOm9pKS50ZXN0KGlpKHQpKX0sbGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIHBpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9bGkodCxlKTtyZXR1cm4gY2kocik/cjp2b2lkIDB9LGRpPXBpKE9iamVjdCwiY3JlYXRlIiksZ2k9ZGk7dmFyIHlpPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1naT9naShudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIHZpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxiaT1kaSxtaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciB3aT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGJpKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIG1pLmNhbGwoZSx0KT9lW3RdOnZvaWQgMH0sX2k9ZGksU2k9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgRWk9ZGk7dmFyIGtpPXlpLFJpPXZpLEFpPXdpLFRpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIF9pP3ZvaWQgMCE9PWVbdF06U2kuY2FsbChlLHQpfSxPaT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09RWkmJnZvaWQgMD09PWU/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOmUsdGhpc307ZnVuY3Rpb24gamkodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19amkucHJvdG90eXBlLmNsZWFyPWtpLGppLnByb3RvdHlwZS5kZWxldGU9UmksamkucHJvdG90eXBlLmdldD1BaSxqaS5wcm90b3R5cGUuaGFzPVRpLGppLnByb3RvdHlwZS5zZXQ9T2k7dmFyIExpPWppO3ZhciBDaT1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9O3ZhciBQaT1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX07dmFyIE1pPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoO3ItLTspaWYoUGkodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX0sQmk9TWkseGk9QXJyYXkucHJvdG90eXBlLnNwbGljZTt2YXIgVWk9TWk7dmFyIElpPU1pO3ZhciBEaT1NaTt2YXIgTmk9Q2ksRmk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPUJpKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOnhpLmNhbGwoZSxyLDEpLC0tdGhpcy5zaXplLCEwKX0semk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPVVpKGUsdCk7cmV0dXJuIHI8MD92b2lkIDA6ZVtyXVsxXX0scWk9ZnVuY3Rpb24odCl7cmV0dXJuIElpKHRoaXMuX19kYXRhX18sdCk+LTF9LFlpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxuPURpKHIsdCk7cmV0dXJuIG48MD8oKyt0aGlzLnNpemUsci5wdXNoKFt0LGVdKSk6cltuXVsxXT1lLHRoaXN9O2Z1bmN0aW9uIFdpKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fVdpLnByb3RvdHlwZS5jbGVhcj1OaSxXaS5wcm90b3R5cGUuZGVsZXRlPUZpLFdpLnByb3RvdHlwZS5nZXQ9emksV2kucHJvdG90eXBlLmhhcz1xaSxXaS5wcm90b3R5cGUuc2V0PVlpO3ZhciAkaT1XaSxHaT1waShrbiwiTWFwIiksSmk9TGksSGk9JGksVmk9R2k7dmFyIEtpPWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9O3ZhciBaaT1mdW5jdGlvbih0LGUpe3ZhciByPXQuX19kYXRhX187cmV0dXJuIEtpKGUpP3JbInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06ci5tYXB9LFFpPVppO3ZhciBYaT1aaTt2YXIgdG89Wmk7dmFyIGVvPVppO3ZhciBybz1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IEppLG1hcDpuZXcoVml8fEhpKSxzdHJpbmc6bmV3IEppfX0sbm89ZnVuY3Rpb24odCl7dmFyIGU9UWkodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0saW89ZnVuY3Rpb24odCl7cmV0dXJuIFhpKHRoaXMsdCkuZ2V0KHQpfSxvbz1mdW5jdGlvbih0KXtyZXR1cm4gdG8odGhpcyx0KS5oYXModCl9LHNvPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZW8odGhpcyx0KSxuPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bj8wOjEsdGhpc307ZnVuY3Rpb24gYW8odCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19YW8ucHJvdG90eXBlLmNsZWFyPXJvLGFvLnByb3RvdHlwZS5kZWxldGU9bm8sYW8ucHJvdG90eXBlLmdldD1pbyxhby5wcm90b3R5cGUuaGFzPW9vLGFvLnByb3RvdHlwZS5zZXQ9c287dmFyIHVvPWFvO2Z1bmN0aW9uIGhvKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLG4pOm5bMF0sbz1yLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgcz10LmFwcGx5KHRoaXMsbik7cmV0dXJuIHIuY2FjaGU9by5zZXQoaSxzKXx8byxzfTtyZXR1cm4gci5jYWNoZT1uZXcoaG8uQ2FjaGV8fHVvKSxyfWhvLkNhY2hlPXVvO3ZhciBmbz1obzt2YXIgY289L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csbG89L1xcKFxcKT8vZyxwbz1mdW5jdGlvbih0KXt2YXIgZT1mbyh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKGNvLChmdW5jdGlvbih0LHIsbixpKXtlLnB1c2gobj9pLnJlcGxhY2UobG8sIiQxIik6cnx8dCl9KSksZX0pKTt2YXIgZ289ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShuKTsrK3I8bjspaVtyXT1lKHRbcl0scix0KTtyZXR1cm4gaX0seW89X24sdm89Rm4sYm89Um4/Um4ucHJvdG90eXBlOnZvaWQgMCxtbz1ibz9iby50b1N0cmluZzp2b2lkIDA7dmFyIHdvPWZ1bmN0aW9uIHQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO2lmKHlvKGUpKXJldHVybiBnbyhlLHQpKyIiO2lmKHZvKGUpKXJldHVybiBtbz9tby5jYWxsKGUpOiIiO3ZhciByPWUrIiI7cmV0dXJuIjAiPT1yJiYxL2U9PS1JbmZpbml0eT8iLTAiOnJ9LF9vPXdvO3ZhciBTbz1fbixFbz0kbixrbz1wbyxSbz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjpfbyh0KX07dmFyIEFvPUZuO3ZhciBUbz1mdW5jdGlvbih0LGUpe3JldHVybiBTbyh0KT90OkVvKHQsZSk/W3RdOmtvKFJvKHQpKX0sT289ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxBbyh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tSW5maW5pdHk/Ii0wIjplfTt2YXIgam89ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxuPShlPVRvKGUsdCkpLmxlbmd0aDtudWxsIT10JiZyPG47KXQ9dFtPbyhlW3IrK10pXTtyZXR1cm4gciYmcj09bj90OnZvaWQgMH07dmFyIExvPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1udWxsPT10P3ZvaWQgMDpqbyh0LGUpO3JldHVybiB2b2lkIDA9PT1uP3I6bn0sQ289VW4sUG89SW47dmFyIE1vPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8UG8odCkmJiJbb2JqZWN0IE51bWJlcl0iPT1Dbyh0KX07ZnVuY3Rpb24gQm8odCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24geG8odCl7cmV0dXJuISghQm8odCl8fCIiPT09dCl9ZnVuY3Rpb24gVW8odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBJbyh0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBEbyh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBObyh0KXtyZXR1cm4hKCFCbyh0KXx8IiIhPT10KX1mdW5jdGlvbiBGbyh0KXtyZXR1cm4hIUlvKHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZihEbyh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFObyh0KXx8ISFmdW5jdGlvbih0KXtyZXR1cm4hIVVvKHQpJiYwPT09dC5sZW5ndGh9KHQpKSkpfWZ1bmN0aW9uIHpvKCl7bGV0IHQsZSxyPW5ldyBQcm9taXNlKChmdW5jdGlvbigpe3Q9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdfSkpO3JldHVybiByLnJlc29sdmU9dCxyLnJlamVjdD1lLHJ9bGV0IFdKc29uU3RyZWFtPXtwYXJzZTphc3luYyBmdW5jdGlvbih0KXtpZigheG8odCkpcmV0dXJue307bGV0IGU9e307dHJ5e2U9SlNPTi5wYXJzZSh0KX1jYXRjaCh0KXtlPXt9fXJldHVybiBlfSxwYXJzZUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPXt9O2lmKCJudWxsIj09PXQpcmV0dXJuIG51bGw7aWYoIiI9PT10KXJldHVybnt9O2xldCByPSJfX3N5c3RlbV9fIixuPWB7IiR7cn0iOiR7dH19YCxpPXpvKCksbz1jcihuKSxzPWFuLnBhcnNlKCIkKiIpO3JldHVybiBzLm9uKCJkYXRhIiwoZnVuY3Rpb24odCl7ZVt0LmtleV09dC52YWx1ZX0pKSxzLm9uKCJlbmQiLChmdW5jdGlvbigpe2xldCB0PUxvKGUscik7aS5yZXNvbHZlKHQpfSkpLHMub24oImVycm9yIiwoZnVuY3Rpb24odCl7aS5yZWplY3QodCl9KSksby5waXBlKHMpLGl9LGNyZWF0ZVBhcnNlU3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiB4byh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuISghVW8odCl8fDA9PT10Lmxlbmd0aHx8MT09PXQubGVuZ3RoJiZGbyh0WzBdKSl9KHQpfHwodD0iJCoiKSxhbi5wYXJzZSh0KX0sc3RyaW5naWZ5OmFzeW5jIGZ1bmN0aW9uKHQpe2lmKElvKHQpKXJldHVybiIiO2xldCBlPSIiO3RyeXtlPUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKHQpe2U9IiJ9cmV0dXJuIGV9LHN0cmluZ2lmeUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPSIiO2lmKElvKHQpKXJldHVybiIiO2lmKG51bGw9PT10KXJldHVybiJudWxsIjtpZihObyh0KSlyZXR1cm4nIiInO2lmKE1vKHQpKXJldHVybmAke3R9YDtpZihCbyh0KSlyZXR1cm5gIiR7dH0iYDtsZXQgcj16bygpLG49bmV3IHduKHQsbnVsbCxudWxsLCExKTtyZXR1cm4gbi5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UrPXR9KSksbi5vbigiZW5kIiwoZnVuY3Rpb24oKXtyLnJlc29sdmUoZSl9KSksbi5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtyLnJlamVjdCh0KX0pKSxyfSxjcmVhdGVTdHJpbmdpZnlTdHJlYW06ZnVuY3Rpb24odCl7aWYoIURvKHQpJiYhVW8odCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXkiKTtyZXR1cm4gbmV3IHduKHQsbnVsbCxudWxsLCExKX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0pzb25TdHJlYW0oLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHBhcmVudFBvcnQucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0pzb25TdHJlYW0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHBhcmVudFBvcnQub24oJ21lc3NhZ2UnLCByZWN2TWVzc2FnZSkKICAgICAgICAKCg==",Buffer.from(X,"base64").toString("utf8"));var X;function W(){let d=Z(),m=function(Z){try{return new l.Worker(Z,{eval:!0})}catch(l){X(l)}}(G);if(!m)return X("invalid worker"),null;function X(l){d.emit("error",l)}return m.on("message",(function(l){let Z=l,m=Z.mode;"emit"!==m&&"return"!==m||("emit"===m&&d.emit(Z.evName,Z.msg),"return"===m&&d.emit(Z.id,Z))})),m.on("error",X),function(){let l={mode:"init",type:"object",input:[...arguments]};m.postMessage(l)}([...arguments]),d.stringify=function(){let l=b(),Z=c(),G={mode:"call",id:Z,fun:"stringify",input:[...arguments]};return m.postMessage(G),d.once(Z,(Z=>{"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},d.parse=function(){let l=b(),Z=c(),G={mode:"call",id:Z,fun:"parse",input:[...arguments]};return m.postMessage(G),d.once(Z,(Z=>{"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},d.terminate=function(){m?(m.terminate(),m=void 0):X("worker has been terminated")},d}let y={stringify:async function(){let l=[...arguments],Z=W();return await Z.stringify(...l).finally((()=>{Z.terminate()}))},parse:async function(){let l=[...arguments],Z=W();return await Z.parse(...l).finally((()=>{Z.terminate()}))}};m=Z();for(let l in y){let Z=y[l];m[l]=Z}}(),m}(l)}({get exports(){return Z},set exports(l){Z=l}});var d=Z,m={};!function(l,Z){l.exports=function(){const l="function"==typeof atob,Z="function"==typeof Buffer,d="function"==typeof TextDecoder?new TextDecoder:void 0,m=(l=>{let Z={};return l.forEach(((l,d)=>Z[l]=d)),Z})(("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="))),b=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,c=String.fromCharCode.bind(String),G="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):l=>new Uint8Array(Array.prototype.slice.call(l,0)),X=l=>l.replace(/[^A-Za-z0-9\+\/]/g,""),W=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,y=l=>{switch(l.length){case 4:var Z=((7&l.charCodeAt(0))<<18|(63&l.charCodeAt(1))<<12|(63&l.charCodeAt(2))<<6|63&l.charCodeAt(3))-65536;return c(55296+(Z>>>10))+c(56320+(1023&Z));case 3:return c((15&l.charCodeAt(0))<<12|(63&l.charCodeAt(1))<<6|63&l.charCodeAt(2));default:return c((31&l.charCodeAt(0))<<6|63&l.charCodeAt(1))}},i=l=>l.replace(W,y),I=l=>{if(l=l.replace(/\s+/g,""),!b.test(l))throw new TypeError("malformed base64.");l+="==".slice(2-(3&l.length));let Z,d,G,X="";for(let b=0;b<l.length;)Z=m[l.charAt(b++)]<<18|m[l.charAt(b++)]<<12|(d=m[l.charAt(b++)])<<6|(G=m[l.charAt(b++)]),X+=64===d?c(Z>>16&255):64===G?c(Z>>16&255,Z>>8&255):c(Z>>16&255,Z>>8&255,255&Z);return X},V=l?l=>atob(X(l)):Z?l=>Buffer.from(l,"base64").toString("binary"):I,u=Z?l=>G(Buffer.from(l,"base64")):l=>G(V(l).split("").map((l=>l.charCodeAt(0)))),p=Z?l=>Buffer.from(l,"base64").toString("utf8"):d?l=>d.decode(u(l)):l=>i(V(l)),h=l=>X(l.replace(/[-_]/g,(l=>"-"==l?"+":"/"))),K=l=>p(h(l)),a=K;var Y={};!function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function b(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function c(l,Z,m,c,G){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new b(m,c||l,G),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 G(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,b=[];if(0===this._eventsCount)return b;for(m in l=this._events)Z.call(l,m)&&b.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?b.concat(Object.getOwnPropertySymbols(l)):b},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 b=0,c=m.length,G=new Array(c);b<c;b++)G[b]=m[b].fn;return G},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,b,c,G){var X=d?d+l:l;if(!this._events[X])return!1;var W,y,i=this._events[X],I=arguments.length;if(i.fn){switch(i.once&&this.removeListener(l,i.fn,void 0,!0),I){case 1:return i.fn.call(i.context),!0;case 2:return i.fn.call(i.context,Z),!0;case 3:return i.fn.call(i.context,Z,m),!0;case 4:return i.fn.call(i.context,Z,m,b),!0;case 5:return i.fn.call(i.context,Z,m,b,c),!0;case 6:return i.fn.call(i.context,Z,m,b,c,G),!0}for(y=1,W=new Array(I-1);y<I;y++)W[y-1]=arguments[y];i.fn.apply(i.context,W)}else{var V,u=i.length;for(y=0;y<u;y++)switch(i[y].once&&this.removeListener(l,i[y].fn,void 0,!0),I){case 1:i[y].fn.call(i[y].context);break;case 2:i[y].fn.call(i[y].context,Z);break;case 3:i[y].fn.call(i[y].context,Z,m);break;case 4:i[y].fn.call(i[y].context,Z,m,b);break;default:if(!W)for(V=1,W=new Array(I-1);V<I;V++)W[V-1]=arguments[V];i[y].fn.apply(i[y].context,W)}}return!0},X.prototype.on=function(l,Z,d){return c(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return c(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,b){var c=d?d+l:l;if(!this._events[c])return this;if(!Z)return G(this,c),this;var X=this._events[c];if(X.fn)X.fn!==Z||b&&!X.once||m&&X.context!==m||G(this,c);else{for(var W=0,y=[],i=X.length;W<i;W++)(X[W].fn!==Z||b&&!X[W].once||m&&X[W].context!==m)&&y.push(X[W]);y.length?this._events[c]=1===y.length?y[0]:y:G(this,c)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&G(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}({get exports(){return Y},set exports(l){Y=l}});var R=Y;let L;return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new R}function Z(){let l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function d(){let l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length;for(let b=0;b<l;b++)Z[b]=d[0|Math.random()*m];return Z.join("")}let m=a("CgoKZnVuY3Rpb24gdCgpe31mdW5jdGlvbiBlKCl7ZS5pbml0LmNhbGwodGhpcyl9ZnVuY3Rpb24gcih0KXtyZXR1cm4gdm9pZCAwPT09dC5fbWF4TGlzdGVuZXJzP2UuZGVmYXVsdE1heExpc3RlbmVyczp0Ll9tYXhMaXN0ZW5lcnN9ZnVuY3Rpb24gbihlLG4saSxvKXt2YXIgcyxhLHUsaDtpZigiZnVuY3Rpb24iIT10eXBlb2YgaSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO2lmKChhPWUuX2V2ZW50cyk/KGEubmV3TGlzdGVuZXImJihlLmVtaXQoIm5ld0xpc3RlbmVyIixuLGkubGlzdGVuZXI/aS5saXN0ZW5lcjppKSxhPWUuX2V2ZW50cyksdT1hW25dKTooYT1lLl9ldmVudHM9bmV3IHQsZS5fZXZlbnRzQ291bnQ9MCksdSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHU/dT1hW25dPW8/W2ksdV06W3UsaV06bz91LnVuc2hpZnQoaSk6dS5wdXNoKGkpLCF1Lndhcm5lZCYmKHM9cihlKSkmJnM+MCYmdS5sZW5ndGg+cyl7dS53YXJuZWQ9ITA7dmFyIGY9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrdS5sZW5ndGgrIiAiK24rIiBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0Iik7Zi5uYW1lPSJNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmciLGYuZW1pdHRlcj1lLGYudHlwZT1uLGYuY291bnQ9dS5sZW5ndGgsaD1mLCJmdW5jdGlvbiI9PXR5cGVvZiBjb25zb2xlLndhcm4/Y29uc29sZS53YXJuKGgpOmNvbnNvbGUubG9nKGgpfX1lbHNlIHU9YVtuXT1pLCsrZS5fZXZlbnRzQ291bnQ7cmV0dXJuIGV9ZnVuY3Rpb24gaSh0LGUscil7dmFyIG49ITE7ZnVuY3Rpb24gaSgpe3QucmVtb3ZlTGlzdGVuZXIoZSxpKSxufHwobj0hMCxyLmFwcGx5KHQsYXJndW1lbnRzKSl9cmV0dXJuIGkubGlzdGVuZXI9cixpfWZ1bmN0aW9uIG8odCl7dmFyIGU9dGhpcy5fZXZlbnRzO2lmKGUpe3ZhciByPWVbdF07aWYoImZ1bmN0aW9uIj09dHlwZW9mIHIpcmV0dXJuIDE7aWYocilyZXR1cm4gci5sZW5ndGh9cmV0dXJuIDB9ZnVuY3Rpb24gcyh0LGUpe2Zvcih2YXIgcj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPXRbZV07cmV0dXJuIHJ9dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShudWxsKSxlLkV2ZW50RW1pdHRlcj1lLGUudXNpbmdEb21haW5zPSExLGUucHJvdG90eXBlLmRvbWFpbj12b2lkIDAsZS5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDAsZS5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDAsZS5kZWZhdWx0TWF4TGlzdGVuZXJzPTEwLGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuZG9tYWluPW51bGwsZS51c2luZ0RvbWFpbnMmJnVuZGVmaW5lZC5hY3RpdmUsdGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHMhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9LGUucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fHQ8MHx8aXNOYU4odCkpdGhyb3cgbmV3IFR5cGVFcnJvcignIm4iIGFyZ3VtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXQsdGhpc30sZS5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcyl9LGUucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksbyxhLHUsaD0iZXJyb3IiPT09dDtpZihhPXRoaXMuX2V2ZW50cyloPWgmJm51bGw9PWEuZXJyb3I7ZWxzZSBpZighaClyZXR1cm4hMTtpZih1PXRoaXMuZG9tYWluLGgpe2lmKGU9YXJndW1lbnRzWzFdLCF1KXtpZihlIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgZTt2YXIgZj1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50LiAoJytlKyIpIik7dGhyb3cgZi5jb250ZXh0PWUsZn1yZXR1cm4gZXx8KGU9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudCcpKSxlLmRvbWFpbkVtaXR0ZXI9dGhpcyxlLmRvbWFpbj11LGUuZG9tYWluVGhyb3duPSExLHUuZW1pdCgiZXJyb3IiLGUpLCExfWlmKCEocj1hW3RdKSlyZXR1cm4hMTt2YXIgYz0iZnVuY3Rpb24iPT10eXBlb2Ygcjtzd2l0Y2gobj1hcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6IWZ1bmN0aW9uKHQsZSxyKXtpZihlKXQuY2FsbChyKTtlbHNlIGZvcih2YXIgbj10Lmxlbmd0aCxpPXModCxuKSxvPTA7bzxuOysrbylpW29dLmNhbGwocil9KHIsYyx0aGlzKTticmVhaztjYXNlIDI6IWZ1bmN0aW9uKHQsZSxyLG4pe2lmKGUpdC5jYWxsKHIsbik7ZWxzZSBmb3IodmFyIGk9dC5sZW5ndGgsbz1zKHQsaSksYT0wO2E8aTsrK2Epb1thXS5jYWxsKHIsbil9KHIsYyx0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOiFmdW5jdGlvbih0LGUscixuLGkpe2lmKGUpdC5jYWxsKHIsbixpKTtlbHNlIGZvcih2YXIgbz10Lmxlbmd0aCxhPXModCxvKSx1PTA7dTxvOysrdSlhW3VdLmNhbGwocixuLGkpfShyLGMsdGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKTticmVhaztjYXNlIDQ6IWZ1bmN0aW9uKHQsZSxyLG4saSxvKXtpZihlKXQuY2FsbChyLG4saSxvKTtlbHNlIGZvcih2YXIgYT10Lmxlbmd0aCx1PXModCxhKSxoPTA7aDxhOysraCl1W2hdLmNhbGwocixuLGksbyl9KHIsYyx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdKTticmVhaztkZWZhdWx0OmZvcihpPW5ldyBBcnJheShuLTEpLG89MTtvPG47bysrKWlbby0xXT1hcmd1bWVudHNbb107IWZ1bmN0aW9uKHQsZSxyLG4pe2lmKGUpdC5hcHBseShyLG4pO2Vsc2UgZm9yKHZhciBpPXQubGVuZ3RoLG89cyh0LGkpLGE9MDthPGk7KythKW9bYV0uYXBwbHkocixuKX0ocixjLHRoaXMsaSl9cmV0dXJuITB9LGUucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odGhpcyx0LGUsITEpfSxlLnByb3RvdHlwZS5vbj1lLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixlLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0aGlzLHQsZSwhMCl9LGUucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3JldHVybiB0aGlzLm9uKHQsaSh0aGlzLHQsZSkpLHRoaXN9LGUucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3JldHVybiB0aGlzLnByZXBlbmRMaXN0ZW5lcih0LGkodGhpcyx0LGUpKSx0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihlLHIpe3ZhciBuLGksbyxzLGE7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtpZighKGk9dGhpcy5fZXZlbnRzKSlyZXR1cm4gdGhpcztpZighKG49aVtlXSkpcmV0dXJuIHRoaXM7aWYobj09PXJ8fG4ubGlzdGVuZXImJm4ubGlzdGVuZXI9PT1yKTA9PS0tdGhpcy5fZXZlbnRzQ291bnQ/dGhpcy5fZXZlbnRzPW5ldyB0OihkZWxldGUgaVtlXSxpLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixlLG4ubGlzdGVuZXJ8fHIpKTtlbHNlIGlmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXtmb3Iobz0tMSxzPW4ubGVuZ3RoO3MtLSA+MDspaWYobltzXT09PXJ8fG5bc10ubGlzdGVuZXImJm5bc10ubGlzdGVuZXI9PT1yKXthPW5bc10ubGlzdGVuZXIsbz1zO2JyZWFrfWlmKG88MClyZXR1cm4gdGhpcztpZigxPT09bi5sZW5ndGgpe2lmKG5bMF09dm9pZCAwLDA9PS0tdGhpcy5fZXZlbnRzQ291bnQpcmV0dXJuIHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzO2RlbGV0ZSBpW2VdfWVsc2UhZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9ZSxuPXIrMSxpPXQubGVuZ3RoO248aTtyKz0xLG4rPTEpdFtyXT10W25dO3QucG9wKCl9KG4sbyk7aS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsZSxhfHxyKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3ZhciByLG47aWYoIShuPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYoIW4ucmVtb3ZlTGlzdGVuZXIpcmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9ldmVudHM9bmV3IHQsdGhpcy5fZXZlbnRzQ291bnQ9MCk6bltlXSYmKDA9PS0tdGhpcy5fZXZlbnRzQ291bnQ/dGhpcy5fZXZlbnRzPW5ldyB0OmRlbGV0ZSBuW2VdKSx0aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGksbz1PYmplY3Qua2V5cyhuKSxzPTA7czxvLmxlbmd0aDsrK3MpInJlbW92ZUxpc3RlbmVyIiE9PShpPW9bc10pJiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhpKTtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoInJlbW92ZUxpc3RlbmVyIiksdGhpcy5fZXZlbnRzPW5ldyB0LHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZigiZnVuY3Rpb24iPT10eXBlb2Yocj1uW2VdKSl0aGlzLnJlbW92ZUxpc3RlbmVyKGUscik7ZWxzZSBpZihyKWRve3RoaXMucmVtb3ZlTGlzdGVuZXIoZSxyW3IubGVuZ3RoLTFdKX13aGlsZShyWzBdKTtyZXR1cm4gdGhpc30sZS5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHI9dGhpcy5fZXZlbnRzO3JldHVybiByJiYoZT1yW3RdKT8iZnVuY3Rpb24iPT10eXBlb2YgZT9bZS5saXN0ZW5lcnx8ZV06ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCkscj0wO3I8ZS5sZW5ndGg7KytyKWVbcl09dFtyXS5saXN0ZW5lcnx8dFtyXTtyZXR1cm4gZX0oZSk6W119LGUubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0Lmxpc3RlbmVyQ291bnQ/dC5saXN0ZW5lckNvdW50KGUpOm8uY2FsbCh0LGUpfSxlLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PW8sZS5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP1JlZmxlY3Qub3duS2V5cyh0aGlzLl9ldmVudHMpOltdfTt2YXIgYT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9LHU9W10saD1bXSxmPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LGM9ITE7ZnVuY3Rpb24gbCgpe2M9ITA7Zm9yKHZhciB0PSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixlPTAscj10Lmxlbmd0aDtlPHI7KytlKXVbZV09dFtlXSxoW3QuY2hhckNvZGVBdChlKV09ZTtoWyItIi5jaGFyQ29kZUF0KDApXT02MixoWyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBwKHQsZSxyKXtmb3IodmFyIG4saSxvPVtdLHM9ZTtzPHI7cys9MyluPSh0W3NdPDwxNikrKHRbcysxXTw8OCkrdFtzKzJdLG8ucHVzaCh1WyhpPW4pPj4xOCY2M10rdVtpPj4xMiY2M10rdVtpPj42JjYzXSt1WzYzJmldKTtyZXR1cm4gby5qb2luKCIiKX1mdW5jdGlvbiBkKHQpe3ZhciBlO2N8fGwoKTtmb3IodmFyIHI9dC5sZW5ndGgsbj1yJTMsaT0iIixvPVtdLHM9MTYzODMsYT0wLGg9ci1uO2E8aDthKz1zKW8ucHVzaChwKHQsYSxhK3M+aD9oOmErcykpO3JldHVybiAxPT09bj8oZT10W3ItMV0saSs9dVtlPj4yXSxpKz11W2U8PDQmNjNdLGkrPSI9PSIpOjI9PT1uJiYoZT0odFtyLTJdPDw4KSt0W3ItMV0saSs9dVtlPj4xMF0saSs9dVtlPj40JjYzXSxpKz11W2U8PDImNjNdLGkrPSI9Iiksby5wdXNoKGkpLG8uam9pbigiIil9ZnVuY3Rpb24gZyh0LGUscixuLGkpe3ZhciBvLHMsYT04Kmktbi0xLHU9KDE8PGEpLTEsaD11Pj4xLGY9LTcsYz1yP2ktMTowLGw9cj8tMToxLHA9dFtlK2NdO2ZvcihjKz1sLG89cCYoMTw8LWYpLTEscD4+PS1mLGYrPWE7Zj4wO289MjU2Km8rdFtlK2NdLGMrPWwsZi09OCk7Zm9yKHM9byYoMTw8LWYpLTEsbz4+PS1mLGYrPW47Zj4wO3M9MjU2KnMrdFtlK2NdLGMrPWwsZi09OCk7aWYoMD09PW8pbz0xLWg7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46MS8wKihwPy0xOjEpO3MrPU1hdGgucG93KDIsbiksby09aH1yZXR1cm4ocD8tMToxKSpzKk1hdGgucG93KDIsby1uKX1mdW5jdGlvbiB5KHQsZSxyLG4saSxvKXt2YXIgcyxhLHUsaD04Km8taS0xLGY9KDE8PGgpLTEsYz1mPj4xLGw9MjM9PT1pP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxwPW4/MDpvLTEsZD1uPzE6LTEsZz1lPDB8fDA9PT1lJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KGE9aXNOYU4oZSk/MTowLHM9Zik6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSoodT1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSx1Kj0yKSwoZSs9cytjPj0xP2wvdTpsKk1hdGgucG93KDIsMS1jKSkqdT49MiYmKHMrKyx1Lz0yKSxzK2M+PWY/KGE9MCxzPWYpOnMrYz49MT8oYT0oZSp1LTEpKk1hdGgucG93KDIsaSkscys9Yyk6KGE9ZSpNYXRoLnBvdygyLGMtMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O3RbcitwXT0yNTUmYSxwKz1kLGEvPTI1NixpLT04KTtmb3Iocz1zPDxpfGEsaCs9aTtoPjA7dFtyK3BdPTI1NSZzLHArPWQscy89MjU2LGgtPTgpO3RbcitwLWRdfD0xMjgqZ312YXIgdj17fS50b1N0cmluZyxiPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PXYuY2FsbCh0KX07ZnVuY3Rpb24gbSgpe3JldHVybiBfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIHcodCxlKXtpZihtKCk8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gXy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PW5ldyBVaW50OEFycmF5KGUpKS5fX3Byb3RvX189Xy5wcm90b3R5cGU6KG51bGw9PT10JiYodD1uZXcgXyhlKSksdC5sZW5ndGg9ZSksdH1mdW5jdGlvbiBfKHQsZSxyKXtpZighKF8uVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIF8pKXJldHVybiBuZXcgXyh0LGUscik7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBrKHRoaXMsdCl9cmV0dXJuIFModGhpcyx0LGUscil9ZnVuY3Rpb24gUyh0LGUscixuKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbih0LGUscixuKXtpZihlLmJ5dGVMZW5ndGgscjwwfHxlLmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKGUuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO2U9dm9pZCAwPT09ciYmdm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlKTp2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KGUscik6bmV3IFVpbnQ4QXJyYXkoZSxyLG4pO18uVFlQRURfQVJSQVlfU1VQUE9SVD8odD1lKS5fX3Byb3RvX189Xy5wcm90b3R5cGU6dD1SKHQsZSk7cmV0dXJuIHR9KHQsZSxyLG4pOiJzdHJpbmciPT10eXBlb2YgZT9mdW5jdGlvbih0LGUscil7InN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4Iik7aWYoIV8uaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj0wfE8oZSxyKTt0PXcodCxuKTt2YXIgaT10LndyaXRlKGUscik7aSE9PW4mJih0PXQuc2xpY2UoMCxpKSk7cmV0dXJuIHR9KHQsZSxyKTpmdW5jdGlvbih0LGUpe2lmKFQoZSkpe3ZhciByPTB8QShlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD13KHQscikpLmxlbmd0aHx8ZS5jb3B5KHQsMCwwLHIpLHR9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChuPWUubGVuZ3RoKSE9bj93KHQsMCk6Uih0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZiKGUuZGF0YSkpcmV0dXJuIFIodCxlLmRhdGEpfXZhciBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0odCxlKX1mdW5jdGlvbiBFKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gayh0LGUpe2lmKEUoZSksdD13KHQsZTwwPzA6MHxBKGUpKSwhXy5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgcj0wO3I8ZTsrK3IpdFtyXT0wO3JldHVybiB0fWZ1bmN0aW9uIFIodCxlKXt2YXIgcj1lLmxlbmd0aDwwPzA6MHxBKGUubGVuZ3RoKTt0PXcodCxyKTtmb3IodmFyIG49MDtuPHI7bis9MSl0W25dPTI1NSZlW25dO3JldHVybiB0fWZ1bmN0aW9uIEEodCl7aWYodD49bSgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IittKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIFQodCl7cmV0dXJuIShudWxsPT10fHwhdC5faXNCdWZmZXIpfWZ1bmN0aW9uIE8odCxlKXtpZihUKHQpKXJldHVybiB0Lmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KTt2YXIgcj10Lmxlbmd0aDtpZigwPT09cilyZXR1cm4gMDtmb3IodmFyIG49ITE7Oylzd2l0Y2goZSl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBldCh0KS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKnI7Y2FzZSJoZXgiOnJldHVybiByPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIHJ0KHQpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIGV0KHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIGoodCxlLHIpe3ZhciBuPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1yfHxyPnRoaXMubGVuZ3RoKSYmKHI9dGhpcy5sZW5ndGgpLHI8PTApcmV0dXJuIiI7aWYoKHI+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gVyh0aGlzLGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gRih0aGlzLGUscik7Y2FzZSJhc2NpaSI6cmV0dXJuIHEodGhpcyxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIFkodGhpcyxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gTih0aGlzLGUscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAkKHRoaXMsZSxyKTtkZWZhdWx0OmlmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIEwodCxlLHIpe3ZhciBuPXRbZV07dFtlXT10W3JdLHRbcl09bn1mdW5jdGlvbiBDKHQsZSxyLG4saSl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygcj8obj1yLHI9MCk6cj4yMTQ3NDgzNjQ3P3I9MjE0NzQ4MzY0NzpyPC0yMTQ3NDgzNjQ4JiYocj0tMjE0NzQ4MzY0OCkscj0rcixpc05hTihyKSYmKHI9aT8wOnQubGVuZ3RoLTEpLHI8MCYmKHI9dC5sZW5ndGgrcikscj49dC5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7cj10Lmxlbmd0aC0xfWVsc2UgaWYocjwwKXtpZighaSlyZXR1cm4tMTtyPTB9aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1fLmZyb20oZSxuKSksVChlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOlAodCxlLHIsbixpKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGUmPTI1NSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxyKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxyKTpQKHQsW2VdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBQKHQsZSxyLG4saSl7dmFyIG8scz0xLGE9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO3M9MixhLz0yLHUvPTIsci89Mn1mdW5jdGlvbiBoKHQsZSl7cmV0dXJuIDE9PT1zP3RbZV06dC5yZWFkVUludDE2QkUoZSpzKX1pZihpKXt2YXIgZj0tMTtmb3Iobz1yO288YTtvKyspaWYoaCh0LG8pPT09aChlLC0xPT09Zj8wOm8tZikpe2lmKC0xPT09ZiYmKGY9byksby1mKzE9PT11KXJldHVybiBmKnN9ZWxzZS0xIT09ZiYmKG8tPW8tZiksZj0tMX1lbHNlIGZvcihyK3U+YSYmKHI9YS11KSxvPXI7bz49MDtvLS0pe2Zvcih2YXIgYz0hMCxsPTA7bDx1O2wrKylpZihoKHQsbytsKSE9PWgoZSxsKSl7Yz0hMTticmVha31pZihjKXJldHVybiBvfXJldHVybi0xfWZ1bmN0aW9uIE0odCxlLHIsbil7cj1OdW1iZXIocil8fDA7dmFyIGk9dC5sZW5ndGgtcjtuPyhuPU51bWJlcihuKSk+aSYmKG49aSk6bj1pO3ZhciBvPWUubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtuPm8vMiYmKG49by8yKTtmb3IodmFyIHM9MDtzPG47KytzKXt2YXIgYT1wYXJzZUludChlLnN1YnN0cigyKnMsMiksMTYpO2lmKGlzTmFOKGEpKXJldHVybiBzO3RbcitzXT1hfXJldHVybiBzfWZ1bmN0aW9uIEIodCxlLHIsbil7cmV0dXJuIG50KGV0KGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIHgodCxlLHIsbil7cmV0dXJuIG50KGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDsrK3IpZS5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQocikpO3JldHVybiBlfShlKSx0LHIsbil9ZnVuY3Rpb24gVSh0LGUscixuKXtyZXR1cm4geCh0LGUscixuKX1mdW5jdGlvbiBJKHQsZSxyLG4pe3JldHVybiBudChydChlKSx0LHIsbil9ZnVuY3Rpb24gRCh0LGUscixuKXtyZXR1cm4gbnQoZnVuY3Rpb24odCxlKXtmb3IodmFyIHIsbixpLG89W10scz0wO3M8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrcyluPShyPXQuY2hhckNvZGVBdChzKSk+PjgsaT1yJTI1NixvLnB1c2goaSksby5wdXNoKG4pO3JldHVybiBvfShlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBOKHQsZSxyKXtyZXR1cm4gMD09PWUmJnI9PT10Lmxlbmd0aD9kKHQpOmQodC5zbGljZShlLHIpKX1mdW5jdGlvbiBGKHQsZSxyKXtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPWU7aTxyOyl7dmFyIG8scyxhLHUsaD10W2ldLGY9bnVsbCxjPWg+MjM5PzQ6aD4yMjM/MzpoPjE5MT8yOjE7aWYoaStjPD1yKXN3aXRjaChjKXtjYXNlIDE6aDwxMjgmJihmPWgpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKG89dFtpKzFdKSkmJih1PSgzMSZoKTw8Nnw2MyZvKT4xMjcmJihmPXUpO2JyZWFrO2Nhc2UgMzpvPXRbaSsxXSxzPXRbaSsyXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmKHU9KDE1JmgpPDwxMnwoNjMmbyk8PDZ8NjMmcyk+MjA0NyYmKHU8NTUyOTZ8fHU+NTczNDMpJiYoZj11KTticmVhaztjYXNlIDQ6bz10W2krMV0scz10W2krMl0sYT10W2krM10sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKHU9KDE1JmgpPDwxOHwoNjMmbyk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmdTwxMTE0MTEyJiYoZj11KX1udWxsPT09Zj8oZj02NTUzMyxjPTEpOmY+NjU1MzUmJihmLT02NTUzNixuLnB1c2goZj4+PjEwJjEwMjN8NTUyOTYpLGY9NTYzMjB8MTAyMyZmKSxuLnB1c2goZiksaSs9Y31yZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9eilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdCk7dmFyIHI9IiIsbj0wO2Zvcig7bjxlOylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0LnNsaWNlKG4sbis9eikpO3JldHVybiByfShuKX1fLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09YS5UWVBFRF9BUlJBWV9TVVBQT1JUfHxhLlRZUEVEX0FSUkFZX1NVUFBPUlQsbSgpLF8ucG9vbFNpemU9ODE5MixfLl9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz1fLnByb3RvdHlwZSx0fSxfLmZyb209ZnVuY3Rpb24odCxlLHIpe3JldHVybiBTKG51bGwsdCxlLHIpfSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQmJihfLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsXy5fX3Byb3RvX189VWludDhBcnJheSksXy5hbGxvYz1mdW5jdGlvbih0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBFKGUpLGU8PTA/dyh0LGUpOnZvaWQgMCE9PXI/InN0cmluZyI9PXR5cGVvZiBuP3codCxlKS5maWxsKHIsbik6dyh0LGUpLmZpbGwocik6dyh0LGUpfShudWxsLHQsZSxyKX0sXy5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gayhudWxsLHQpfSxfLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gayhudWxsLHQpfSxfLmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYoISF0Ll9pc0J1ZmZlcnx8aXQodCl8fGZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zbGljZSYmaXQodC5zbGljZSgwLDApKX0odCkpfSxfLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighVCh0KXx8IVQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgcj10Lmxlbmd0aCxuPWUubGVuZ3RoLGk9MCxvPU1hdGgubWluKHIsbik7aTxvOysraSlpZih0W2ldIT09ZVtpXSl7cj10W2ldLG49ZVtpXTticmVha31yZXR1cm4gcjxuPy0xOm48cj8xOjB9LF8uaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sXy5jb25jYXQ9ZnVuY3Rpb24odCxlKXtpZighYih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiBfLmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PWUpZm9yKGU9MCxyPTA7cjx0Lmxlbmd0aDsrK3IpZSs9dFtyXS5sZW5ndGg7dmFyIG49Xy5hbGxvY1Vuc2FmZShlKSxpPTA7Zm9yKHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIG89dFtyXTtpZighVChvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7by5jb3B5KG4saSksaSs9by5sZW5ndGh9cmV0dXJuIG59LF8uYnl0ZUxlbmd0aD1PLF8ucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxfLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTIpTCh0aGlzLGUsZSsxKTtyZXR1cm4gdGhpc30sXy5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz00KUwodGhpcyxlLGUrMyksTCh0aGlzLGUrMSxlKzIpO3JldHVybiB0aGlzfSxfLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTgpTCh0aGlzLGUsZSs3KSxMKHRoaXMsZSsxLGUrNiksTCh0aGlzLGUrMixlKzUpLEwodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sXy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9GKHRoaXMsMCx0KTpqLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sXy5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCFUKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT1fLmNvbXBhcmUodGhpcyx0KX0sXy5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiO3JldHVybiB0aGlzLmxlbmd0aD4wJiYodD10aGlzLnRvU3RyaW5nKCJoZXgiLDAsNTApLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD41MCYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSxfLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxyLG4saSl7aWYoIVQodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLGU8MHx8cj50Lmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZlPj1yKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYoZT49cilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKG4+Pj49MCkscz0ocj4+Pj0wKS0oZT4+Pj0wKSxhPU1hdGgubWluKG8scyksdT10aGlzLnNsaWNlKG4saSksaD10LnNsaWNlKGUsciksZj0wO2Y8YTsrK2YpaWYodVtmXSE9PWhbZl0pe289dVtmXSxzPWhbZl07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSxfLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUscil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLHIpfSxfLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQyh0aGlzLHQsZSxyLCEwKX0sXy5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBDKHRoaXMsdCxlLHIsITEpfSxfLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscixuKXtpZih2b2lkIDA9PT1lKW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiBlKW49ZSxyPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSx0Lmxlbmd0aD4wJiYocjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gTSh0aGlzLHQsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBCKHRoaXMsdCxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiB4KHRoaXMsdCxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIFUodGhpcyx0LGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBJKHRoaXMsdCxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRCh0aGlzLHQsZSxyKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLG89ITB9fSxfLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciB6PTQwOTY7ZnVuY3Rpb24gcSh0LGUscil7dmFyIG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbaV0pO3JldHVybiBufWZ1bmN0aW9uIFkodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbaV0pO3JldHVybiBufWZ1bmN0aW9uIFcodCxlLHIpe3ZhciBuPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFyfHxyPDB8fHI+bikmJihyPW4pO2Zvcih2YXIgaT0iIixvPWU7bzxyOysrbylpKz10dCh0W29dKTtyZXR1cm4gaX1mdW5jdGlvbiAkKHQsZSxyKXtmb3IodmFyIG49dC5zbGljZShlLHIpLGk9IiIsbz0wO288bi5sZW5ndGg7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5bb10rMjU2Km5bbysxXSk7cmV0dXJuIGl9ZnVuY3Rpb24gRyh0LGUscil7aWYodCUxIT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5yKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gSih0LGUscixuLGksbyl7aWYoIVQodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxvKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEgodCxlLHIsbil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciwyKTtpPG87KytpKXRbcitpXT0oZSYyNTU8PDgqKG4/aToxLWkpKT4+PjgqKG4/aToxLWkpfWZ1bmN0aW9uIFYodCxlLHIsbil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aC1yLDQpO2k8bzsrK2kpdFtyK2ldPWU+Pj44KihuP2k6My1pKSYyNTV9ZnVuY3Rpb24gSyh0LGUscixuLGksbyl7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFoodCxlLHIsbixpKXtyZXR1cm4gaXx8Syh0LDAsciw0KSx5KHQsZSxyLG4sMjMsNCkscis0fWZ1bmN0aW9uIFEodCxlLHIsbixpKXtyZXR1cm4gaXx8Syh0LDAsciw4KSx5KHQsZSxyLG4sNTIsOCkscis4fV8ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj10aGlzLmxlbmd0aDtpZigodD1+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksKGU9dm9pZCAwPT09ZT9uOn5+ZSk8MD8oZSs9bik8MCYmKGU9MCk6ZT5uJiYoZT1uKSxlPHQmJihlPXQpLF8uVFlQRURfQVJSQVlfU1VQUE9SVCkocj10aGlzLnN1YmFycmF5KHQsZSkpLl9fcHJvdG9fXz1fLnByb3RvdHlwZTtlbHNle3ZhciBpPWUtdDtyPW5ldyBfKGksdm9pZCAwKTtmb3IodmFyIG89MDtvPGk7KytvKXJbb109dGhpc1tvK3RdfXJldHVybiByfSxfLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Ryh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOyluKz10aGlzW3Qrb10qaTtyZXR1cm4gbn0sXy5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEcodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0Ky0tZV0saT0xO2U+MCYmKGkqPTI1Nik7KW4rPXRoaXNbdCstLWVdKmk7cmV0dXJuIG59LF8ucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sXy5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sXy5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sXy5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSxfLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Ryh0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LF8ucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEcodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG4+PShpKj0xMjgpJiYobi09TWF0aC5wb3coMiw4KmUpKSxufSxfLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxHKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPWUsaT0xLG89dGhpc1t0Ky0tbl07bj4wJiYoaSo9MjU2KTspbys9dGhpc1t0Ky0tbl0qaTtyZXR1cm4gbz49KGkqPTEyOCkmJihvLT1NYXRoLnBvdygyLDgqZSkpLG99LF8ucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sXy5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24odCxlKXtlfHxHKHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LF8ucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7ZXx8Ryh0LDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxfLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNnx0aGlzW3QrM108PDI0fSxfLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSxfLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxHKHQsNCx0aGlzLmxlbmd0aCksZyh0aGlzLHQsITAsMjMsNCl9LF8ucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCw0LHRoaXMubGVuZ3RoKSxnKHRoaXMsdCwhMSwyMyw0KX0sXy5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCw4LHRoaXMubGVuZ3RoKSxnKHRoaXMsdCwhMCw1Miw4KX0sXy5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEcodCw4LHRoaXMubGVuZ3RoKSxnKHRoaXMsdCwhMSw1Miw4KX0sXy5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7KHQ9K3QsZXw9MCxyfD0wLG4pfHxKKHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihpKj0yNTYpOyl0aGlzW2Urb109dC9pJjI1NTtyZXR1cm4gZStyfSxfLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbih0LGUscixuKXsodD0rdCxlfD0wLHJ8PTAsbil8fEoodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT1yLTEsbz0xO2Zvcih0aGlzW2UraV09MjU1JnQ7LS1pPj0wJiYobyo9MjU2KTspdGhpc1tlK2ldPXQvbyYyNTU7cmV0dXJuIGUrcn0sXy5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDEsMjU1LDApLF8uVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdGhpc1tlXT0yNTUmdCxlKzF9LF8ucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSwyLDY1NTM1LDApLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOkgodGhpcyx0LGUsITApLGUrMn0sXy5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDIsNjU1MzUsMCksXy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6SCh0aGlzLHQsZSwhMSksZSsyfSxfLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlKzNdPXQ+Pj4yNCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2VdPTI1NSZ0KTpWKHRoaXMsdCxlLCEwKSxlKzR9LF8ucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksXy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOlYodGhpcyx0LGUsITEpLGUrNH0sXy5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO0oodGhpcyx0LGUscixpLTEsLWkpfXZhciBvPTAscz0xLGE9MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKHMqPTI1Nik7KXQ8MCYmMD09PWEmJjAhPT10aGlzW2Urby0xXSYmKGE9MSksdGhpc1tlK29dPSh0L3M+PjApLWEmMjU1O3JldHVybiBlK3J9LF8ucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtKKHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgbz1yLTEscz0xLGE9MDtmb3IodGhpc1tlK29dPTI1NSZ0Oy0tbz49MCYmKHMqPTI1Nik7KXQ8MCYmMD09PWEmJjAhPT10aGlzW2UrbysxXSYmKGE9MSksdGhpc1tlK29dPSh0L3M+PjApLWEmMjU1O3JldHVybiBlK3J9LF8ucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxKKHRoaXMsdCxlLDEsMTI3LC0xMjgpLF8uVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0sXy5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOkgodGhpcyx0LGUsITApLGUrMn0sXy5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkgodGhpcyx0LGUsITEpLGUrMn0sXy5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fEoodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxfLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNCk6Vih0aGlzLHQsZSwhMCksZSs0fSxfLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Sih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLF8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpWKHRoaXMsdCxlLCExKSxlKzR9LF8ucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFoodGhpcyx0LGUsITAscil9LF8ucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFoodGhpcyx0LGUsITEscil9LF8ucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBRKHRoaXMsdCxlLCEwLHIpfSxfLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUSh0aGlzLHQsZSwhMSxyKX0sXy5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLGU+PXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8bi1yJiYobj10Lmxlbmd0aC1lK3IpO3ZhciBpLG89bi1yO2lmKHRoaXM9PT10JiZyPGUmJmU8bilmb3IoaT1vLTE7aT49MDstLWkpdFtpK2VdPXRoaXNbaStyXTtlbHNlIGlmKG88MWUzfHwhXy5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxvOysraSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KHIscitvKSxlKTtyZXR1cm4gb30sXy5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LGUscixuKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZT8obj1lLGU9MCxyPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIHImJihuPXIscj10aGlzLmxlbmd0aCksMT09PXQubGVuZ3RoKXt2YXIgaT10LmNoYXJDb2RlQXQoMCk7aTwyNTYmJih0PWkpfWlmKHZvaWQgMCE9PW4mJiJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYhXy5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQmPTI1NSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD1lKXJldHVybiB0aGlzO3ZhciBvO2lmKGU+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsdHx8KHQ9MCksIm51bWJlciI9PXR5cGVvZiB0KWZvcihvPWU7bzxyOysrbyl0aGlzW29dPXQ7ZWxzZXt2YXIgcz1UKHQpP3Q6ZXQobmV3IF8odCxuKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihvPTA7bzxyLWU7KytvKXRoaXNbbytlXT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciBYPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIHR0KHQpe3JldHVybiB0PDE2PyIwIit0LnRvU3RyaW5nKDE2KTp0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBldCh0LGUpe3ZhciByO2U9ZXx8MS8wO2Zvcih2YXIgbj10Lmxlbmd0aCxpPW51bGwsbz1bXSxzPTA7czxuOysrcyl7aWYoKHI9dC5jaGFyQ29kZUF0KHMpKT41NTI5NSYmcjw1NzM0NCl7aWYoIWkpe2lmKHI+NTYzMTkpeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihzKzE9PT1uKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPXI7Y29udGludWV9cj02NTUzNisoaS01NTI5Njw8MTB8ci01NjMyMCl9ZWxzZSBpJiYoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHI8MTI4KXtpZigoZS09MSk8MClicmVhaztvLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO28ucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigoZS09Myk8MClicmVhaztvLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChlLT00KTwwKWJyZWFrO28ucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIG99ZnVuY3Rpb24gcnQodCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8scztjfHxsKCk7dmFyIGE9dC5sZW5ndGg7aWYoYSU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7bz0iPSI9PT10W2EtMl0/MjoiPSI9PT10W2EtMV0/MTowLHM9bmV3IGYoMyphLzQtbyksbj1vPjA/YS00OmE7dmFyIHU9MDtmb3IoZT0wLHI9MDtlPG47ZSs9NCxyKz0zKWk9aFt0LmNoYXJDb2RlQXQoZSldPDwxOHxoW3QuY2hhckNvZGVBdChlKzEpXTw8MTJ8aFt0LmNoYXJDb2RlQXQoZSsyKV08PDZ8aFt0LmNoYXJDb2RlQXQoZSszKV0sc1t1KytdPWk+PjE2JjI1NSxzW3UrK109aT4+OCYyNTUsc1t1KytdPTI1NSZpO3JldHVybiAyPT09bz8oaT1oW3QuY2hhckNvZGVBdChlKV08PDJ8aFt0LmNoYXJDb2RlQXQoZSsxKV0+PjQsc1t1KytdPTI1NSZpKToxPT09byYmKGk9aFt0LmNoYXJDb2RlQXQoZSldPDwxMHxoW3QuY2hhckNvZGVBdChlKzEpXTw8NHxoW3QuY2hhckNvZGVBdChlKzIpXT4+MixzW3UrK109aT4+OCYyNTUsc1t1KytdPTI1NSZpKSxzfShmdW5jdGlvbih0KXtpZigodD1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltP3QudHJpbSgpOnQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSh0KS5yZXBsYWNlKFgsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPTA7KXQrPSI9IjtyZXR1cm4gdH0odCkpfWZ1bmN0aW9uIG50KHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8biYmIShpK3I+PWUubGVuZ3RofHxpPj10Lmxlbmd0aCk7KytpKWVbaStyXT10W2ldO3JldHVybiBpfWZ1bmN0aW9uIGl0KHQpe3JldHVybiEhdC5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3IuaXNCdWZmZXImJnQuY29uc3RydWN0b3IuaXNCdWZmZXIodCl9ZnVuY3Rpb24gb3QoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBzdCgpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIGF0PW90LHV0PXN0O2Z1bmN0aW9uIGh0KHQpe2lmKGF0PT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dCh0LDApO2lmKChhdD09PW90fHwhYXQpJiZzZXRUaW1lb3V0KXJldHVybiBhdD1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIGF0KHQsMCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBhdC5jYWxsKG51bGwsdCwwKX1jYXRjaChlKXtyZXR1cm4gYXQuY2FsbCh0aGlzLHQsMCl9fX0iZnVuY3Rpb24iPT10eXBlb2YgYS5zZXRUaW1lb3V0JiYoYXQ9c2V0VGltZW91dCksImZ1bmN0aW9uIj09dHlwZW9mIGEuY2xlYXJUaW1lb3V0JiYodXQ9Y2xlYXJUaW1lb3V0KTt2YXIgZnQsY3Q9W10sbHQ9ITEscHQ9LTE7ZnVuY3Rpb24gZHQoKXtsdCYmZnQmJihsdD0hMSxmdC5sZW5ndGg/Y3Q9ZnQuY29uY2F0KGN0KTpwdD0tMSxjdC5sZW5ndGgmJmd0KCkpfWZ1bmN0aW9uIGd0KCl7aWYoIWx0KXt2YXIgdD1odChkdCk7bHQ9ITA7Zm9yKHZhciBlPWN0Lmxlbmd0aDtlOyl7Zm9yKGZ0PWN0LGN0PVtdOysrcHQ8ZTspZnQmJmZ0W3B0XS5ydW4oKTtwdD0tMSxlPWN0Lmxlbmd0aH1mdD1udWxsLGx0PSExLGZ1bmN0aW9uKHQpe2lmKHV0PT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQodCk7aWYoKHV0PT09c3R8fCF1dCkmJmNsZWFyVGltZW91dClyZXR1cm4gdXQ9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dCh0KTt0cnl7cmV0dXJuIHV0KHQpfWNhdGNoKGUpe3RyeXtyZXR1cm4gdXQuY2FsbChudWxsLHQpfWNhdGNoKGUpe3JldHVybiB1dC5jYWxsKHRoaXMsdCl9fX0odCl9fWZ1bmN0aW9uIHl0KHQpe3ZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWVbci0xXT1hcmd1bWVudHNbcl07Y3QucHVzaChuZXcgdnQodCxlKSksMSE9PWN0Lmxlbmd0aHx8bHR8fGh0KGd0KX1mdW5jdGlvbiB2dCh0LGUpe3RoaXMuZnVuPXQsdGhpcy5hcnJheT1lfXZ0LnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtmdW5jdGlvbiBidCgpe312YXIgbXQ9YnQsd3Q9YnQsX3Q9YnQsU3Q9YnQsRXQ9YnQsa3Q9YnQsUnQ9YnQ7dmFyIEF0PWEucGVyZm9ybWFuY2V8fHt9LFR0PUF0Lm5vd3x8QXQubW96Tm93fHxBdC5tc05vd3x8QXQub05vd3x8QXQud2Via2l0Tm93fHxmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfTt2YXIgT3Q9bmV3IERhdGU7dmFyIGp0LEx0PXtuZXh0VGljazp5dCx0aXRsZToiYnJvd3NlciIsYnJvd3NlcjohMCxlbnY6e30sYXJndjpbXSx2ZXJzaW9uOiIiLHZlcnNpb25zOnt9LG9uOm10LGFkZExpc3RlbmVyOnd0LG9uY2U6X3Qsb2ZmOlN0LHJlbW92ZUxpc3RlbmVyOkV0LHJlbW92ZUFsbExpc3RlbmVyczprdCxlbWl0OlJ0LGJpbmRpbmc6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxjd2Q6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGNoZGlyOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LHVtYXNrOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhydGltZTpmdW5jdGlvbih0KXt2YXIgZT0uMDAxKlR0LmNhbGwoQXQpLHI9TWF0aC5mbG9vcihlKSxuPU1hdGguZmxvb3IoZSUxKjFlOSk7cmV0dXJuIHQmJihyLT10WzBdLChuLT10WzFdKTwwJiYoci0tLG4rPTFlOSkpLFtyLG5dfSxwbGF0Zm9ybToiYnJvd3NlciIscmVsZWFzZTp7fSxjb25maWc6e30sdXB0aW1lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlLU90KS8xZTN9fTtqdD0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbih0LGUpe3Quc3VwZXJfPWUsdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSl9OmZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZTt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH07dmFyIEN0PWp0LFB0PS8lW3NkaiVdL2c7ZnVuY3Rpb24gTXQodCl7aWYoISR0KHQpKXtmb3IodmFyIGU9W10scj0wO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspZS5wdXNoKEl0KGFyZ3VtZW50c1tyXSkpO3JldHVybiBlLmpvaW4oIiAiKX1yPTE7Zm9yKHZhciBuPWFyZ3VtZW50cyxpPW4ubGVuZ3RoLG89U3RyaW5nKHQpLnJlcGxhY2UoUHQsKGZ1bmN0aW9uKHQpe2lmKCIlJSI9PT10KXJldHVybiIlIjtpZihyPj1pKXJldHVybiB0O3N3aXRjaCh0KXtjYXNlIiVzIjpyZXR1cm4gU3RyaW5nKG5bcisrXSk7Y2FzZSIlZCI6cmV0dXJuIE51bWJlcihuW3IrK10pO2Nhc2UiJWoiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobltyKytdKX1jYXRjaCh0KXtyZXR1cm4iW0NpcmN1bGFyXSJ9ZGVmYXVsdDpyZXR1cm4gdH19KSkscz1uW3JdO3I8aTtzPW5bKytyXSlXdChzKXx8IUh0KHMpP28rPSIgIitzOm8rPSIgIitJdChzKTtyZXR1cm4gb31mdW5jdGlvbiBCdCh0LGUpe2lmKEd0KGEucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEJ0KHQsZSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZighMD09PUx0Lm5vRGVwcmVjYXRpb24pcmV0dXJuIHQ7dmFyIHI9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIXIpe2lmKEx0LnRocm93RGVwcmVjYXRpb24pdGhyb3cgbmV3IEVycm9yKGUpO0x0LnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShlKTpjb25zb2xlLmVycm9yKGUpLHI9ITB9cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX12YXIgeHQsVXQ9e307ZnVuY3Rpb24gSXQodCxlKXt2YXIgcj17c2VlbjpbXSxzdHlsaXplOk50fTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKHIuZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYoci5jb2xvcnM9YXJndW1lbnRzWzNdKSxZdChlKT9yLnNob3dIaWRkZW49ZTplJiZmdW5jdGlvbih0LGUpe2lmKCFlfHwhSHQoZSkpcmV0dXJuIHQ7dmFyIHI9T2JqZWN0LmtleXMoZSksbj1yLmxlbmd0aDtmb3IoO24tLTspdFtyW25dXT1lW3Jbbl1dfShyLGUpLEd0KHIuc2hvd0hpZGRlbikmJihyLnNob3dIaWRkZW49ITEpLEd0KHIuZGVwdGgpJiYoci5kZXB0aD0yKSxHdChyLmNvbG9ycykmJihyLmNvbG9ycz0hMSksR3Qoci5jdXN0b21JbnNwZWN0KSYmKHIuY3VzdG9tSW5zcGVjdD0hMCksci5jb2xvcnMmJihyLnN0eWxpemU9RHQpLEZ0KHIsdCxyLmRlcHRoKX1mdW5jdGlvbiBEdCh0LGUpe3ZhciByPUl0LnN0eWxlc1tlXTtyZXR1cm4gcj8iG1siK0l0LmNvbG9yc1tyXVswXSsibSIrdCsiG1siK0l0LmNvbG9yc1tyXVsxXSsibSI6dH1mdW5jdGlvbiBOdCh0LGUpe3JldHVybiB0fWZ1bmN0aW9uIEZ0KHQsZSxyKXtpZih0LmN1c3RvbUluc3BlY3QmJmUmJlp0KGUuaW5zcGVjdCkmJmUuaW5zcGVjdCE9PUl0JiYoIWUuY29uc3RydWN0b3J8fGUuY29uc3RydWN0b3IucHJvdG90eXBlIT09ZSkpe3ZhciBuPWUuaW5zcGVjdChyLHQpO3JldHVybiAkdChuKXx8KG49RnQodCxuLHIpKSxufXZhciBpPWZ1bmN0aW9uKHQsZSl7aWYoR3QoZSkpcmV0dXJuIHQuc3R5bGl6ZSgidW5kZWZpbmVkIiwidW5kZWZpbmVkIik7aWYoJHQoZSkpe3ZhciByPSInIitKU09OLnN0cmluZ2lmeShlKS5yZXBsYWNlKC9eInwiJC9nLCIiKS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykrIiciO3JldHVybiB0LnN0eWxpemUociwic3RyaW5nIil9aWYobj1lLCJudW1iZXIiPT10eXBlb2YgbilyZXR1cm4gdC5zdHlsaXplKCIiK2UsIm51bWJlciIpO3ZhciBuO2lmKFl0KGUpKXJldHVybiB0LnN0eWxpemUoIiIrZSwiYm9vbGVhbiIpO2lmKFd0KGUpKXJldHVybiB0LnN0eWxpemUoIm51bGwiLCJudWxsIil9KHQsZSk7aWYoaSlyZXR1cm4gaTt2YXIgbz1PYmplY3Qua2V5cyhlKSxzPWZ1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQscil7ZVt0XT0hMH0pKSxlfShvKTtpZih0LnNob3dIaWRkZW4mJihvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpKSxLdChlKSYmKG8uaW5kZXhPZigibWVzc2FnZSIpPj0wfHxvLmluZGV4T2YoImRlc2NyaXB0aW9uIik+PTApKXJldHVybiB6dChlKTtpZigwPT09by5sZW5ndGgpe2lmKFp0KGUpKXt2YXIgYT1lLm5hbWU/IjogIitlLm5hbWU6IiI7cmV0dXJuIHQuc3R5bGl6ZSgiW0Z1bmN0aW9uIithKyJdIiwic3BlY2lhbCIpfWlmKEp0KGUpKXJldHVybiB0LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJyZWdleHAiKTtpZihWdChlKSlyZXR1cm4gdC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksImRhdGUiKTtpZihLdChlKSlyZXR1cm4genQoZSl9dmFyIHUsaCxmPSIiLGM9ITEsbD1bInsiLCJ9Il07KHU9ZSxBcnJheS5pc0FycmF5KHUpJiYoYz0hMCxsPVsiWyIsIl0iXSksWnQoZSkpJiYoZj0iIFtGdW5jdGlvbiIrKGUubmFtZT8iOiAiK2UubmFtZToiIikrIl0iKTtyZXR1cm4gSnQoZSkmJihmPSIgIitSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpLFZ0KGUpJiYoZj0iICIrRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbChlKSksS3QoZSkmJihmPSIgIit6dChlKSksMCE9PW8ubGVuZ3RofHxjJiYwIT1lLmxlbmd0aD9yPDA/SnQoZSk/dC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwicmVnZXhwIik6dC5zdHlsaXplKCJbT2JqZWN0XSIsInNwZWNpYWwiKToodC5zZWVuLnB1c2goZSksaD1jP2Z1bmN0aW9uKHQsZSxyLG4saSl7Zm9yKHZhciBvPVtdLHM9MCxhPWUubGVuZ3RoO3M8YTsrK3MpWHQoZSxTdHJpbmcocykpP28ucHVzaChxdCh0LGUscixuLFN0cmluZyhzKSwhMCkpOm8ucHVzaCgiIik7cmV0dXJuIGkuZm9yRWFjaCgoZnVuY3Rpb24oaSl7aS5tYXRjaCgvXlxkKyQvKXx8by5wdXNoKHF0KHQsZSxyLG4saSwhMCkpfSkpLG99KHQsZSxyLHMsbyk6by5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBxdCh0LGUscixzLG4sYyl9KSksdC5zZWVuLnBvcCgpLGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10LnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5pbmRleE9mKCJcbiIpLHQrZS5yZXBsYWNlKC9cdTAwMWJcW1xkXGQ/bS9nLCIiKS5sZW5ndGgrMX0pLDApO2lmKG4+NjApcmV0dXJuIHJbMF0rKCIiPT09ZT8iIjplKyJcbiAiKSsiICIrdC5qb2luKCIsXG4gICIpKyIgIityWzFdO3JldHVybiByWzBdK2UrIiAiK3Quam9pbigiLCAiKSsiICIrclsxXX0oaCxmLGwpKTpsWzBdK2YrbFsxXX1mdW5jdGlvbiB6dCh0KXtyZXR1cm4iWyIrRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkrIl0ifWZ1bmN0aW9uIHF0KHQsZSxyLG4saSxvKXt2YXIgcyxhLHU7aWYoKHU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLGkpfHx7dmFsdWU6ZVtpXX0pLmdldD9hPXUuc2V0P3Quc3R5bGl6ZSgiW0dldHRlci9TZXR0ZXJdIiwic3BlY2lhbCIpOnQuc3R5bGl6ZSgiW0dldHRlcl0iLCJzcGVjaWFsIik6dS5zZXQmJihhPXQuc3R5bGl6ZSgiW1NldHRlcl0iLCJzcGVjaWFsIikpLFh0KG4saSl8fChzPSJbIitpKyJdIiksYXx8KHQuc2Vlbi5pbmRleE9mKHUudmFsdWUpPDA/KGE9V3Qocik/RnQodCx1LnZhbHVlLG51bGwpOkZ0KHQsdS52YWx1ZSxyLTEpKS5pbmRleE9mKCJcbiIpPi0xJiYoYT1vP2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iICAiK3R9KSkuam9pbigiXG4iKS5zdWJzdHIoMik6IlxuIithLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiAgICIrdH0pKS5qb2luKCJcbiIpKTphPXQuc3R5bGl6ZSgiW0NpcmN1bGFyXSIsInNwZWNpYWwiKSksR3Qocykpe2lmKG8mJmkubWF0Y2goL15cZCskLykpcmV0dXJuIGE7KHM9SlNPTi5zdHJpbmdpZnkoIiIraSkpLm1hdGNoKC9eIihbYS16QS1aX11bYS16QS1aXzAtOV0qKSIkLyk/KHM9cy5zdWJzdHIoMSxzLmxlbmd0aC0yKSxzPXQuc3R5bGl6ZShzLCJuYW1lIikpOihzPXMucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpLnJlcGxhY2UoLyheInwiJCkvZywiJyIpLHM9dC5zdHlsaXplKHMsInN0cmluZyIpKX1yZXR1cm4gcysiOiAiK2F9ZnVuY3Rpb24gWXQodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH1mdW5jdGlvbiBXdCh0KXtyZXR1cm4gbnVsbD09PXR9ZnVuY3Rpb24gJHQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fWZ1bmN0aW9uIEd0KHQpe3JldHVybiB2b2lkIDA9PT10fWZ1bmN0aW9uIEp0KHQpe3JldHVybiBIdCh0KSYmIltvYmplY3QgUmVnRXhwXSI9PT1RdCh0KX1mdW5jdGlvbiBIdCh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBIdCh0KSYmIltvYmplY3QgRGF0ZV0iPT09UXQodCl9ZnVuY3Rpb24gS3QodCl7cmV0dXJuIEh0KHQpJiYoIltvYmplY3QgRXJyb3JdIj09PVF0KHQpfHx0IGluc3RhbmNlb2YgRXJyb3IpfWZ1bmN0aW9uIFp0KHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIFF0KHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gWHQodCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9ZnVuY3Rpb24gdGUoKXt0aGlzLmhlYWQ9bnVsbCx0aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfUl0LmNvbG9ycz17Ym9sZDpbMSwyMl0saXRhbGljOlszLDIzXSx1bmRlcmxpbmU6WzQsMjRdLGludmVyc2U6WzcsMjddLHdoaXRlOlszNywzOV0sZ3JleTpbOTAsMzldLGJsYWNrOlszMCwzOV0sYmx1ZTpbMzQsMzldLGN5YW46WzM2LDM5XSxncmVlbjpbMzIsMzldLG1hZ2VudGE6WzM1LDM5XSxyZWQ6WzMxLDM5XSx5ZWxsb3c6WzMzLDM5XX0sSXQuc3R5bGVzPXtzcGVjaWFsOiJjeWFuIixudW1iZXI6InllbGxvdyIsYm9vbGVhbjoieWVsbG93Iix1bmRlZmluZWQ6ImdyZXkiLG51bGw6ImJvbGQiLHN0cmluZzoiZ3JlZW4iLGRhdGU6Im1hZ2VudGEiLHJlZ2V4cDoicmVkIn0sdGUucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9ZTp0aGlzLmhlYWQ9ZSx0aGlzLnRhaWw9ZSwrK3RoaXMubGVuZ3RofSx0ZS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6dGhpcy5oZWFkfTswPT09dGhpcy5sZW5ndGgmJih0aGlzLnRhaWw9ZSksdGhpcy5oZWFkPWUsKyt0aGlzLmxlbmd0aH0sdGUucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX0sdGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9LHRlLnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4iIjtmb3IodmFyIGU9dGhpcy5oZWFkLHI9IiIrZS5kYXRhO2U9ZS5uZXh0OylyKz10K2UuZGF0YTtyZXR1cm4gcn0sdGUucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIF8uYWxsb2MoMCk7aWYoMT09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzLmhlYWQuZGF0YTtmb3IodmFyIGU9Xy5hbGxvY1Vuc2FmZSh0Pj4+MCkscj10aGlzLmhlYWQsbj0wO3I7KXIuZGF0YS5jb3B5KGUsbiksbis9ci5kYXRhLmxlbmd0aCxyPXIubmV4dDtyZXR1cm4gZX07dmFyIGVlPV8uaXNFbmNvZGluZ3x8ZnVuY3Rpb24odCl7c3dpdGNoKHQmJnQudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6Y2FzZSJyYXciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtmdW5jdGlvbiByZSh0KXtzd2l0Y2godGhpcy5lbmNvZGluZz0odHx8InV0ZjgiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLCIiKSxmdW5jdGlvbih0KXtpZih0JiYhZWUodCkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpfSh0KSx0aGlzLmVuY29kaW5nKXtjYXNlInV0ZjgiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zO2JyZWFrO2Nhc2UidWNzMiI6Y2FzZSJ1dGYxNmxlIjp0aGlzLnN1cnJvZ2F0ZVNpemU9Mix0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPWllO2JyZWFrO2Nhc2UiYmFzZTY0Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9Myx0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPW9lO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHZvaWQodGhpcy53cml0ZT1uZSl9dGhpcy5jaGFyQnVmZmVyPW5ldyBfKDYpLHRoaXMuY2hhclJlY2VpdmVkPTAsdGhpcy5jaGFyTGVuZ3RoPTB9ZnVuY3Rpb24gbmUodCl7cmV0dXJuIHQudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gaWUodCl7dGhpcy5jaGFyUmVjZWl2ZWQ9dC5sZW5ndGglMix0aGlzLmNoYXJMZW5ndGg9dGhpcy5jaGFyUmVjZWl2ZWQ/MjowfWZ1bmN0aW9uIG9lKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTMsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzM6MH1yZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSIiO3RoaXMuY2hhckxlbmd0aDspe3ZhciByPXQubGVuZ3RoPj10aGlzLmNoYXJMZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQ/dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkOnQubGVuZ3RoO2lmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsdGhpcy5jaGFyUmVjZWl2ZWQsMCxyKSx0aGlzLmNoYXJSZWNlaXZlZCs9cix0aGlzLmNoYXJSZWNlaXZlZDx0aGlzLmNoYXJMZW5ndGgpcmV0dXJuIiI7aWYodD10LnNsaWNlKHIsdC5sZW5ndGgpLCEoKGk9KGU9dGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKSkuY2hhckNvZGVBdChlLmxlbmd0aC0xKSk+PTU1Mjk2JiZpPD01NjMxOSkpe2lmKHRoaXMuY2hhclJlY2VpdmVkPXRoaXMuY2hhckxlbmd0aD0wLDA9PT10Lmxlbmd0aClyZXR1cm4gZTticmVha310aGlzLmNoYXJMZW5ndGgrPXRoaXMuc3Vycm9nYXRlU2l6ZSxlPSIifXRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIodCk7dmFyIG49dC5sZW5ndGg7dGhpcy5jaGFyTGVuZ3RoJiYodC5jb3B5KHRoaXMuY2hhckJ1ZmZlciwwLHQubGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkLG4pLG4tPXRoaXMuY2hhclJlY2VpdmVkKTt2YXIgaTtuPShlKz10LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCxuKSkubGVuZ3RoLTE7aWYoKGk9ZS5jaGFyQ29kZUF0KG4pKT49NTUyOTYmJmk8PTU2MzE5KXt2YXIgbz10aGlzLnN1cnJvZ2F0ZVNpemU7cmV0dXJuIHRoaXMuY2hhckxlbmd0aCs9byx0aGlzLmNoYXJSZWNlaXZlZCs9byx0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsbywwLG8pLHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCwwLG8pLGUuc3Vic3RyaW5nKDAsbil9cmV0dXJuIGV9LHJlLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGg+PTM/Mzp0Lmxlbmd0aDtlPjA7ZS0tKXt2YXIgcj10W3QubGVuZ3RoLWVdO2lmKDE9PWUmJnI+PjU9PTYpe3RoaXMuY2hhckxlbmd0aD0yO2JyZWFrfWlmKGU8PTImJnI+PjQ9PTE0KXt0aGlzLmNoYXJMZW5ndGg9MzticmVha31pZihlPD0zJiZyPj4zPT0zMCl7dGhpcy5jaGFyTGVuZ3RoPTQ7YnJlYWt9fXRoaXMuY2hhclJlY2VpdmVkPWV9LHJlLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCl7dmFyIGU9IiI7aWYodCYmdC5sZW5ndGgmJihlPXRoaXMud3JpdGUodCkpLHRoaXMuY2hhclJlY2VpdmVkKXt2YXIgcj10aGlzLmNoYXJSZWNlaXZlZCxuPXRoaXMuY2hhckJ1ZmZlcixpPXRoaXMuZW5jb2Rpbmc7ZSs9bi5zbGljZSgwLHIpLnRvU3RyaW5nKGkpfXJldHVybiBlfSx1ZS5SZWFkYWJsZVN0YXRlPWFlO3ZhciBzZT1mdW5jdGlvbih0KXtpZihHdCh4dCkmJih4dD1MdC5lbnYuTk9ERV9ERUJVR3x8IiIpLHQ9dC50b1VwcGVyQ2FzZSgpLCFVdFt0XSlpZihuZXcgUmVnRXhwKCJcXGIiK3QrIlxcYiIsImkiKS50ZXN0KHh0KSl7VXRbdF09ZnVuY3Rpb24oKXt2YXIgZT1NdC5hcHBseShudWxsLGFyZ3VtZW50cyk7Y29uc29sZS5lcnJvcigiJXMgJWQ6ICVzIix0LDAsZSl9fWVsc2UgVXRbdF09ZnVuY3Rpb24oKXt9O3JldHVybiBVdFt0XX0oInN0cmVhbSIpO2Z1bmN0aW9uIGFlKHQsZSl7dD10fHx7fSx0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsZSBpbnN0YW5jZW9mIFVlJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LnJlYWRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLG49dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1yfHwwPT09cj9yOm4sdGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrLHRoaXMuYnVmZmVyPW5ldyB0ZSx0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLnJhbk91dD0hMSx0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCx0LmVuY29kaW5nJiYodGhpcy5kZWNvZGVyPW5ldyByZSh0LmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPXQuZW5jb2RpbmcpfWZ1bmN0aW9uIHVlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHVlKSlyZXR1cm4gbmV3IHVlKHQpO3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IGFlKHQsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCx0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYodGhpcy5fcmVhZD10LnJlYWQpLGUuY2FsbCh0aGlzKX1mdW5jdGlvbiBoZSh0LGUscixuLGkpe3ZhciBvPWZ1bmN0aW9uKHQsZSl7dmFyIHI9bnVsbDtfLmlzQnVmZmVyKGUpfHwic3RyaW5nIj09dHlwZW9mIGV8fG51bGw9PWV8fHQub2JqZWN0TW9kZXx8KHI9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKTtyZXR1cm4gcn0oZSxyKTtpZihvKXQuZW1pdCgiZXJyb3IiLG8pO2Vsc2UgaWYobnVsbD09PXIpZS5yZWFkaW5nPSExLGZ1bmN0aW9uKHQsZSl7aWYoZS5lbmRlZClyZXR1cm47aWYoZS5kZWNvZGVyKXt2YXIgcj1lLmRlY29kZXIuZW5kKCk7ciYmci5sZW5ndGgmJihlLmJ1ZmZlci5wdXNoKHIpLGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aCl9ZS5lbmRlZD0hMCxsZSh0KX0odCxlKTtlbHNlIGlmKGUub2JqZWN0TW9kZXx8ciYmci5sZW5ndGg+MClpZihlLmVuZGVkJiYhaSl7dmFyIHM9bmV3IEVycm9yKCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpO3QuZW1pdCgiZXJyb3IiLHMpfWVsc2UgaWYoZS5lbmRFbWl0dGVkJiZpKXt2YXIgYT1uZXcgRXJyb3IoInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Iik7dC5lbWl0KCJlcnJvciIsYSl9ZWxzZXt2YXIgdTshZS5kZWNvZGVyfHxpfHxufHwocj1lLmRlY29kZXIud3JpdGUociksdT0hZS5vYmplY3RNb2RlJiYwPT09ci5sZW5ndGgpLGl8fChlLnJlYWRpbmc9ITEpLHV8fChlLmZsb3dpbmcmJjA9PT1lLmxlbmd0aCYmIWUuc3luYz8odC5lbWl0KCJkYXRhIixyKSx0LnJlYWQoMCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgsaT9lLmJ1ZmZlci51bnNoaWZ0KHIpOmUuYnVmZmVyLnB1c2gociksZS5uZWVkUmVhZGFibGUmJmxlKHQpKSksZnVuY3Rpb24odCxlKXtlLnJlYWRpbmdNb3JlfHwoZS5yZWFkaW5nTW9yZT0hMCx5dChkZSx0LGUpKX0odCxlKX1lbHNlIGl8fChlLnJlYWRpbmc9ITEpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hdC5lbmRlZCYmKHQubmVlZFJlYWRhYmxlfHx0Lmxlbmd0aDx0LmhpZ2hXYXRlck1hcmt8fDA9PT10Lmxlbmd0aCl9KGUpfUN0KHVlLGUpLHVlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gci5vYmplY3RNb2RlfHwic3RyaW5nIiE9dHlwZW9mIHR8fChlPWV8fHIuZGVmYXVsdEVuY29kaW5nKSE9PXIuZW5jb2RpbmcmJih0PV8uZnJvbSh0LGUpLGU9IiIpLGhlKHRoaXMscix0LGUsITEpfSx1ZS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4gaGUodGhpcyx0aGlzLl9yZWFkYWJsZVN0YXRlLHQsIiIsITApfSx1ZS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30sdWUucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9bmV3IHJlKHQpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2Rpbmc9dCx0aGlzfTt2YXIgZmU9ODM4ODYwODtmdW5jdGlvbiBjZSh0LGUpe3JldHVybiB0PD0wfHwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/MDplLm9iamVjdE1vZGU/MTp0IT10P2UuZmxvd2luZyYmZS5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDplLmxlbmd0aDoodD5lLmhpZ2hXYXRlck1hcmsmJihlLmhpZ2hXYXRlck1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PWZlP3Q9ZmU6KHQtLSx0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCx0fD10Pj4+MTYsdCsrKSx0fSh0KSksdDw9ZS5sZW5ndGg/dDplLmVuZGVkP2UubGVuZ3RoOihlLm5lZWRSZWFkYWJsZT0hMCwwKSl9ZnVuY3Rpb24gbGUodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtlLm5lZWRSZWFkYWJsZT0hMSxlLmVtaXR0ZWRSZWFkYWJsZXx8KHNlKCJlbWl0UmVhZGFibGUiLGUuZmxvd2luZyksZS5lbWl0dGVkUmVhZGFibGU9ITAsZS5zeW5jP3l0KHBlLHQpOnBlKHQpKX1mdW5jdGlvbiBwZSh0KXtzZSgiZW1pdCByZWFkYWJsZSIpLHQuZW1pdCgicmVhZGFibGUiKSx2ZSh0KX1mdW5jdGlvbiBkZSh0LGUpe2Zvcih2YXIgcj1lLmxlbmd0aDshZS5yZWFkaW5nJiYhZS5mbG93aW5nJiYhZS5lbmRlZCYmZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrJiYoc2UoIm1heWJlUmVhZE1vcmUgcmVhZCAwIiksdC5yZWFkKDApLHIhPT1lLmxlbmd0aCk7KXI9ZS5sZW5ndGg7ZS5yZWFkaW5nTW9yZT0hMX1mdW5jdGlvbiBnZSh0KXtzZSgicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwIiksdC5yZWFkKDApfWZ1bmN0aW9uIHllKHQsZSl7ZS5yZWFkaW5nfHwoc2UoInJlc3VtZSByZWFkIDAiKSx0LnJlYWQoMCkpLGUucmVzdW1lU2NoZWR1bGVkPSExLGUuYXdhaXREcmFpbj0wLHQuZW1pdCgicmVzdW1lIiksdmUodCksZS5mbG93aW5nJiYhZS5yZWFkaW5nJiZ0LnJlYWQoMCl9ZnVuY3Rpb24gdmUodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtmb3Ioc2UoImZsb3ciLGUuZmxvd2luZyk7ZS5mbG93aW5nJiZudWxsIT09dC5yZWFkKCk7KTt9ZnVuY3Rpb24gYmUodCxlKXtyZXR1cm4gMD09PWUubGVuZ3RoP251bGw6KGUub2JqZWN0TW9kZT9yPWUuYnVmZmVyLnNoaWZ0KCk6IXR8fHQ+PWUubGVuZ3RoPyhyPWUuZGVjb2Rlcj9lLmJ1ZmZlci5qb2luKCIiKToxPT09ZS5idWZmZXIubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YTplLmJ1ZmZlci5jb25jYXQoZS5sZW5ndGgpLGUuYnVmZmVyLmNsZWFyKCkpOnI9ZnVuY3Rpb24odCxlLHIpe3ZhciBuO3Q8ZS5oZWFkLmRhdGEubGVuZ3RoPyhuPWUuaGVhZC5kYXRhLnNsaWNlKDAsdCksZS5oZWFkLmRhdGE9ZS5oZWFkLmRhdGEuc2xpY2UodCkpOm49dD09PWUuaGVhZC5kYXRhLmxlbmd0aD9lLnNoaWZ0KCk6cj9mdW5jdGlvbih0LGUpe3ZhciByPWUuaGVhZCxuPTEsaT1yLmRhdGE7dC09aS5sZW5ndGg7Zm9yKDtyPXIubmV4dDspe3ZhciBvPXIuZGF0YSxzPXQ+by5sZW5ndGg/by5sZW5ndGg6dDtpZihzPT09by5sZW5ndGg/aSs9bzppKz1vLnNsaWNlKDAsdCksMD09PSh0LT1zKSl7cz09PW8ubGVuZ3RoPygrK24sci5uZXh0P2UuaGVhZD1yLm5leHQ6ZS5oZWFkPWUudGFpbD1udWxsKTooZS5oZWFkPXIsci5kYXRhPW8uc2xpY2UocykpO2JyZWFrfSsrbn1yZXR1cm4gZS5sZW5ndGgtPW4saX0odCxlKTpmdW5jdGlvbih0LGUpe3ZhciByPV8uYWxsb2NVbnNhZmUodCksbj1lLmhlYWQsaT0xO24uZGF0YS5jb3B5KHIpLHQtPW4uZGF0YS5sZW5ndGg7Zm9yKDtuPW4ubmV4dDspe3ZhciBvPW4uZGF0YSxzPXQ+by5sZW5ndGg/by5sZW5ndGg6dDtpZihvLmNvcHkocixyLmxlbmd0aC10LDAscyksMD09PSh0LT1zKSl7cz09PW8ubGVuZ3RoPygrK2ksbi5uZXh0P2UuaGVhZD1uLm5leHQ6ZS5oZWFkPWUudGFpbD1udWxsKTooZS5oZWFkPW4sbi5kYXRhPW8uc2xpY2UocykpO2JyZWFrfSsraX1yZXR1cm4gZS5sZW5ndGgtPWkscn0odCxlKTtyZXR1cm4gbn0odCxlLmJ1ZmZlcixlLmRlY29kZXIpLHIpO3ZhciByfWZ1bmN0aW9uIG1lKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7aWYoZS5sZW5ndGg+MCl0aHJvdyBuZXcgRXJyb3IoJyJlbmRSZWFkYWJsZSgpIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO2UuZW5kRW1pdHRlZHx8KGUuZW5kZWQ9ITAseXQod2UsZSx0KSl9ZnVuY3Rpb24gd2UodCxlKXt0LmVuZEVtaXR0ZWR8fDAhPT10Lmxlbmd0aHx8KHQuZW5kRW1pdHRlZD0hMCxlLnJlYWRhYmxlPSExLGUuZW1pdCgiZW5kIikpfWZ1bmN0aW9uIF9lKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIFNlKCl7fWZ1bmN0aW9uIEVlKHQsZSxyKXt0aGlzLmNodW5rPXQsdGhpcy5lbmNvZGluZz1lLHRoaXMuY2FsbGJhY2s9cix0aGlzLm5leHQ9bnVsbH1mdW5jdGlvbiBrZSh0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJidWZmZXIiLHtnZXQ6QnQoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCl9KSwiX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgaW5zdGVhZC4iKX0pLHQ9dHx8e30sdGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLGUgaW5zdGFuY2VvZiBVZSYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC53cml0YWJsZU9iamVjdE1vZGUpO3ZhciByPXQuaGlnaFdhdGVyTWFyayxuPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9cnx8MD09PXI/cjpuLHRoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyayx0aGlzLm5lZWREcmFpbj0hMSx0aGlzLmVuZGluZz0hMSx0aGlzLmVuZGVkPSExLHRoaXMuZmluaXNoZWQ9ITE7dmFyIGk9ITE9PT10LmRlY29kZVN0cmluZ3M7dGhpcy5kZWNvZGVTdHJpbmdzPSFpLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5sZW5ndGg9MCx0aGlzLndyaXRpbmc9ITEsdGhpcy5jb3JrZWQ9MCx0aGlzLnN5bmM9ITAsdGhpcy5idWZmZXJQcm9jZXNzaW5nPSExLHRoaXMub253cml0ZT1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49ci5zeW5jLGk9ci53cml0ZWNiO2lmKGZ1bmN0aW9uKHQpe3Qud3JpdGluZz0hMSx0LndyaXRlY2I9bnVsbCx0Lmxlbmd0aC09dC53cml0ZWxlbix0LndyaXRlbGVuPTB9KHIpLGUpIWZ1bmN0aW9uKHQsZSxyLG4saSl7LS1lLnBlbmRpbmdjYixyP3l0KGksbik6aShuKTt0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0LmVtaXQoImVycm9yIixuKX0odCxyLG4sZSxpKTtlbHNle3ZhciBvPWplKHIpO298fHIuY29ya2VkfHxyLmJ1ZmZlclByb2Nlc3Npbmd8fCFyLmJ1ZmZlcmVkUmVxdWVzdHx8T2UodCxyKSxuP3l0KFRlLHQscixvLGkpOlRlKHQscixvLGkpfX0oZSx0KX0sdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWxlbj0wLHRoaXMuYnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5wZW5kaW5nY2I9MCx0aGlzLnByZWZpbmlzaGVkPSExLHRoaXMuZXJyb3JFbWl0dGVkPSExLHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCx0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgUGUodGhpcyl9ZnVuY3Rpb24gUmUodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgUmV8fHRoaXMgaW5zdGFuY2VvZiBVZSkpcmV0dXJuIG5ldyBSZSh0KTt0aGlzLl93cml0YWJsZVN0YXRlPW5ldyBrZSh0LHRoaXMpLHRoaXMud3JpdGFibGU9ITAsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRlJiYodGhpcy5fd3JpdGU9dC53cml0ZSksImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGV2JiYodGhpcy5fd3JpdGV2PXQud3JpdGV2KSksZS5jYWxsKHRoaXMpfWZ1bmN0aW9uIEFlKHQsZSxyLG4saSxvLHMpe2Uud3JpdGVsZW49bixlLndyaXRlY2I9cyxlLndyaXRpbmc9ITAsZS5zeW5jPSEwLHI/dC5fd3JpdGV2KGksZS5vbndyaXRlKTp0Ll93cml0ZShpLG8sZS5vbndyaXRlKSxlLnN5bmM9ITF9ZnVuY3Rpb24gVGUodCxlLHIsbil7cnx8ZnVuY3Rpb24odCxlKXswPT09ZS5sZW5ndGgmJmUubmVlZERyYWluJiYoZS5uZWVkRHJhaW49ITEsdC5lbWl0KCJkcmFpbiIpKX0odCxlKSxlLnBlbmRpbmdjYi0tLG4oKSxDZSh0LGUpfWZ1bmN0aW9uIE9lKHQsZSl7ZS5idWZmZXJQcm9jZXNzaW5nPSEwO3ZhciByPWUuYnVmZmVyZWRSZXF1ZXN0O2lmKHQuX3dyaXRldiYmciYmci5uZXh0KXt2YXIgbj1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50LGk9bmV3IEFycmF5KG4pLG89ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7by5lbnRyeT1yO2Zvcih2YXIgcz0wO3I7KWlbc109cixyPXIubmV4dCxzKz0xO0FlKHQsZSwhMCxlLmxlbmd0aCxpLCIiLG8uZmluaXNoKSxlLnBlbmRpbmdjYisrLGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLG8ubmV4dD8oZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9by5uZXh0LG8ubmV4dD1udWxsKTplLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgUGUoZSl9ZWxzZXtmb3IoO3I7KXt2YXIgYT1yLmNodW5rLHU9ci5lbmNvZGluZyxoPXIuY2FsbGJhY2s7aWYoQWUodCxlLCExLGUub2JqZWN0TW9kZT8xOmEubGVuZ3RoLGEsdSxoKSxyPXIubmV4dCxlLndyaXRpbmcpYnJlYWt9bnVsbD09PXImJihlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCl9ZS5idWZmZXJlZFJlcXVlc3RDb3VudD0wLGUuYnVmZmVyZWRSZXF1ZXN0PXIsZS5idWZmZXJQcm9jZXNzaW5nPSExfWZ1bmN0aW9uIGplKHQpe3JldHVybiB0LmVuZGluZyYmMD09PXQubGVuZ3RoJiZudWxsPT09dC5idWZmZXJlZFJlcXVlc3QmJiF0LmZpbmlzaGVkJiYhdC53cml0aW5nfWZ1bmN0aW9uIExlKHQsZSl7ZS5wcmVmaW5pc2hlZHx8KGUucHJlZmluaXNoZWQ9ITAsdC5lbWl0KCJwcmVmaW5pc2giKSl9ZnVuY3Rpb24gQ2UodCxlKXt2YXIgcj1qZShlKTtyZXR1cm4gciYmKDA9PT1lLnBlbmRpbmdjYj8oTGUodCxlKSxlLmZpbmlzaGVkPSEwLHQuZW1pdCgiZmluaXNoIikpOkxlKHQsZSkpLHJ9ZnVuY3Rpb24gUGUodCl7dmFyIGU9dGhpczt0aGlzLm5leHQ9bnVsbCx0aGlzLmVudHJ5PW51bGwsdGhpcy5maW5pc2g9ZnVuY3Rpb24ocil7dmFyIG49ZS5lbnRyeTtmb3IoZS5lbnRyeT1udWxsO247KXt2YXIgaT1uLmNhbGxiYWNrO3QucGVuZGluZ2NiLS0saShyKSxuPW4ubmV4dH10LmNvcmtlZFJlcXVlc3RzRnJlZT90LmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0PWU6dC5jb3JrZWRSZXF1ZXN0c0ZyZWU9ZX19dWUucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24odCl7c2UoInJlYWQiLHQpLHQ9cGFyc2VJbnQodCwxMCk7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPXQ7aWYoMCE9PXQmJihlLmVtaXR0ZWRSZWFkYWJsZT0hMSksMD09PXQmJmUubmVlZFJlYWRhYmxlJiYoZS5sZW5ndGg+PWUuaGlnaFdhdGVyTWFya3x8ZS5lbmRlZCkpcmV0dXJuIHNlKCJyZWFkOiBlbWl0UmVhZGFibGUiLGUubGVuZ3RoLGUuZW5kZWQpLDA9PT1lLmxlbmd0aCYmZS5lbmRlZD9tZSh0aGlzKTpsZSh0aGlzKSxudWxsO2lmKDA9PT0odD1jZSh0LGUpKSYmZS5lbmRlZClyZXR1cm4gMD09PWUubGVuZ3RoJiZtZSh0aGlzKSxudWxsO3ZhciBuLGk9ZS5uZWVkUmVhZGFibGU7cmV0dXJuIHNlKCJuZWVkIHJlYWRhYmxlIixpKSwoMD09PWUubGVuZ3RofHxlLmxlbmd0aC10PGUuaGlnaFdhdGVyTWFyaykmJnNlKCJsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyayIsaT0hMCksZS5lbmRlZHx8ZS5yZWFkaW5nP3NlKCJyZWFkaW5nIG9yIGVuZGVkIixpPSExKTppJiYoc2UoImRvIHJlYWQiKSxlLnJlYWRpbmc9ITAsZS5zeW5jPSEwLDA9PT1lLmxlbmd0aCYmKGUubmVlZFJlYWRhYmxlPSEwKSx0aGlzLl9yZWFkKGUuaGlnaFdhdGVyTWFyayksZS5zeW5jPSExLGUucmVhZGluZ3x8KHQ9Y2UocixlKSkpLG51bGw9PT0obj10PjA/YmUodCxlKTpudWxsKT8oZS5uZWVkUmVhZGFibGU9ITAsdD0wKTplLmxlbmd0aC09dCwwPT09ZS5sZW5ndGgmJihlLmVuZGVkfHwoZS5uZWVkUmVhZGFibGU9ITApLHIhPT10JiZlLmVuZGVkJiZtZSh0aGlzKSksbnVsbCE9PW4mJnRoaXMuZW1pdCgiZGF0YSIsbiksbn0sdWUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIikpfSx1ZS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMsbj10aGlzLl9yZWFkYWJsZVN0YXRlO3N3aXRjaChuLnBpcGVzQ291bnQpe2Nhc2UgMDpuLnBpcGVzPXQ7YnJlYWs7Y2FzZSAxOm4ucGlwZXM9W24ucGlwZXMsdF07YnJlYWs7ZGVmYXVsdDpuLnBpcGVzLnB1c2godCl9bi5waXBlc0NvdW50Kz0xLHNlKCJwaXBlIGNvdW50PSVkIG9wdHM9JWoiLG4ucGlwZXNDb3VudCxlKTt2YXIgaT0hZXx8ITEhPT1lLmVuZD9zOmg7ZnVuY3Rpb24gbyh0KXtzZSgib251bnBpcGUiKSx0PT09ciYmaCgpfWZ1bmN0aW9uIHMoKXtzZSgib25lbmQiKSx0LmVuZCgpfW4uZW5kRW1pdHRlZD95dChpKTpyLm9uY2UoImVuZCIsaSksdC5vbigidW5waXBlIixvKTt2YXIgYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO3NlKCJwaXBlT25EcmFpbiIsZS5hd2FpdERyYWluKSxlLmF3YWl0RHJhaW4mJmUuYXdhaXREcmFpbi0tLDA9PT1lLmF3YWl0RHJhaW4mJnQubGlzdGVuZXJzKCJkYXRhIikubGVuZ3RoJiYoZS5mbG93aW5nPSEwLHZlKHQpKX19KHIpO3Qub24oImRyYWluIixhKTt2YXIgdT0hMTtmdW5jdGlvbiBoKCl7c2UoImNsZWFudXAiKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIscCksdC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixkKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsYSksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGwpLHQucmVtb3ZlTGlzdGVuZXIoInVucGlwZSIsbyksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixzKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGgpLHIucmVtb3ZlTGlzdGVuZXIoImRhdGEiLGMpLHU9ITAsIW4uYXdhaXREcmFpbnx8dC5fd3JpdGFibGVTdGF0ZSYmIXQuX3dyaXRhYmxlU3RhdGUubmVlZERyYWlufHxhKCl9dmFyIGY9ITE7ZnVuY3Rpb24gYyhlKXtzZSgib25kYXRhIiksZj0hMSwhMSE9PXQud3JpdGUoZSl8fGZ8fCgoMT09PW4ucGlwZXNDb3VudCYmbi5waXBlcz09PXR8fG4ucGlwZXNDb3VudD4xJiYtMSE9PV9lKG4ucGlwZXMsdCkpJiYhdSYmKHNlKCJmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UiLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbiksci5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKyssZj0hMCksci5wYXVzZSgpKX1mdW5jdGlvbiBsKGUpe3ZhciByO3NlKCJvbmVycm9yIixlKSxnKCksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGwpLDA9PT0ocj0iZXJyb3IiLHQubGlzdGVuZXJzKHIpLmxlbmd0aCkmJnQuZW1pdCgiZXJyb3IiLGUpfWZ1bmN0aW9uIHAoKXt0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLGQpLGcoKX1mdW5jdGlvbiBkKCl7c2UoIm9uZmluaXNoIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLGcoKX1mdW5jdGlvbiBnKCl7c2UoInVucGlwZSIpLHIudW5waXBlKHQpfXJldHVybiByLm9uKCJkYXRhIixjKSxmdW5jdGlvbih0LGUscil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQucHJlcGVuZExpc3RlbmVyKXJldHVybiB0LnByZXBlbmRMaXN0ZW5lcihlLHIpO3QuX2V2ZW50cyYmdC5fZXZlbnRzW2VdP0FycmF5LmlzQXJyYXkodC5fZXZlbnRzW2VdKT90Ll9ldmVudHNbZV0udW5zaGlmdChyKTp0Ll9ldmVudHNbZV09W3IsdC5fZXZlbnRzW2VdXTp0Lm9uKGUscil9KHQsImVycm9yIixsKSx0Lm9uY2UoImNsb3NlIixwKSx0Lm9uY2UoImZpbmlzaCIsZCksdC5lbWl0KCJwaXBlIixyKSxuLmZsb3dpbmd8fChzZSgicGlwZSByZXN1bWUiKSxyLnJlc3VtZSgpKSx0fSx1ZS5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGU7aWYoMD09PWUucGlwZXNDb3VudClyZXR1cm4gdGhpcztpZigxPT09ZS5waXBlc0NvdW50KXJldHVybiB0JiZ0IT09ZS5waXBlc3x8KHR8fCh0PWUucGlwZXMpLGUucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITEsdCYmdC5lbWl0KCJ1bnBpcGUiLHRoaXMpKSx0aGlzO2lmKCF0KXt2YXIgcj1lLnBpcGVzLG49ZS5waXBlc0NvdW50O2UucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITE7Zm9yKHZhciBpPTA7aTxuO2krKylyW2ldLmVtaXQoInVucGlwZSIsdGhpcyk7cmV0dXJuIHRoaXN9dmFyIG89X2UoZS5waXBlcyx0KTtyZXR1cm4tMT09PW98fChlLnBpcGVzLnNwbGljZShvLDEpLGUucGlwZXNDb3VudC09MSwxPT09ZS5waXBlc0NvdW50JiYoZS5waXBlcz1lLnBpcGVzWzBdKSx0LmVtaXQoInVucGlwZSIsdGhpcykpLHRoaXN9LHVlLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LHIpe3ZhciBuPWUucHJvdG90eXBlLm9uLmNhbGwodGhpcyx0LHIpO2lmKCJkYXRhIj09PXQpITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJnRoaXMucmVzdW1lKCk7ZWxzZSBpZigicmVhZGFibGUiPT09dCl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTtpLmVuZEVtaXR0ZWR8fGkucmVhZGFibGVMaXN0ZW5pbmd8fChpLnJlYWRhYmxlTGlzdGVuaW5nPWkubmVlZFJlYWRhYmxlPSEwLGkuZW1pdHRlZFJlYWRhYmxlPSExLGkucmVhZGluZz9pLmxlbmd0aCYmbGUodGhpcyk6eXQoZ2UsdGhpcykpfXJldHVybiBufSx1ZS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9dWUucHJvdG90eXBlLm9uLHVlLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiB0LmZsb3dpbmd8fChzZSgicmVzdW1lIiksdC5mbG93aW5nPSEwLGZ1bmN0aW9uKHQsZSl7ZS5yZXN1bWVTY2hlZHVsZWR8fChlLnJlc3VtZVNjaGVkdWxlZD0hMCx5dCh5ZSx0LGUpKX0odGhpcyx0KSksdGhpc30sdWUucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuIHNlKCJjYWxsIHBhdXNlIGZsb3dpbmc9JWoiLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyksITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJihzZSgicGF1c2UiKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ITEsdGhpcy5lbWl0KCJwYXVzZSIpKSx0aGlzfSx1ZS5wcm90b3R5cGUud3JhcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHI9ITEsbj10aGlzO2Zvcih2YXIgaSBpbiB0Lm9uKCJlbmQiLChmdW5jdGlvbigpe2lmKHNlKCJ3cmFwcGVkIGVuZCIpLGUuZGVjb2RlciYmIWUuZW5kZWQpe3ZhciB0PWUuZGVjb2Rlci5lbmQoKTt0JiZ0Lmxlbmd0aCYmbi5wdXNoKHQpfW4ucHVzaChudWxsKX0pKSx0Lm9uKCJkYXRhIiwoZnVuY3Rpb24oaSl7KHNlKCJ3cmFwcGVkIGRhdGEiKSxlLmRlY29kZXImJihpPWUuZGVjb2Rlci53cml0ZShpKSksZS5vYmplY3RNb2RlJiZudWxsPT1pKXx8KGUub2JqZWN0TW9kZXx8aSYmaS5sZW5ndGgpJiYobi5wdXNoKGkpfHwocj0hMCx0LnBhdXNlKCkpKX0pKSx0KXZvaWQgMD09PXRoaXNbaV0mJiJmdW5jdGlvbiI9PXR5cGVvZiB0W2ldJiYodGhpc1tpXT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdFtlXS5hcHBseSh0LGFyZ3VtZW50cyl9fShpKSk7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWUodFtyXSxyKX0oWyJlcnJvciIsImNsb3NlIiwiZGVzdHJveSIsInBhdXNlIiwicmVzdW1lIl0sKGZ1bmN0aW9uKGUpe3Qub24oZSxuLmVtaXQuYmluZChuLGUpKX0pKSxuLl9yZWFkPWZ1bmN0aW9uKGUpe3NlKCJ3cmFwcGVkIF9yZWFkIixlKSxyJiYocj0hMSx0LnJlc3VtZSgpKX0sbn0sdWUuX2Zyb21MaXN0PWJlLFJlLldyaXRhYmxlU3RhdGU9a2UsQ3QoUmUsZSksa2UucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmJ1ZmZlcmVkUmVxdWVzdCxlPVtdO3Q7KWUucHVzaCh0KSx0PXQubmV4dDtyZXR1cm4gZX0sUmUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oKXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIkNhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUiKSl9LFJlLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZSxpPSExO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksXy5pc0J1ZmZlcih0KT9lPSJidWZmZXIiOmV8fChlPW4uZGVmYXVsdEVuY29kaW5nKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9U2UpLG4uZW5kZWQ/ZnVuY3Rpb24odCxlKXt2YXIgcj1uZXcgRXJyb3IoIndyaXRlIGFmdGVyIGVuZCIpO3QuZW1pdCgiZXJyb3IiLHIpLHl0KGUscil9KHRoaXMscik6ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9ITAsbz0hMTtyZXR1cm4gbnVsbD09PXI/bz1uZXcgVHlwZUVycm9yKCJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbSIpOl8uaXNCdWZmZXIocil8fCJzdHJpbmciPT10eXBlb2Ygcnx8dm9pZCAwPT09cnx8ZS5vYmplY3RNb2RlfHwobz1uZXcgVHlwZUVycm9yKCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rIikpLG8mJih0LmVtaXQoImVycm9yIixvKSx5dChuLG8pLGk9ITEpLGl9KHRoaXMsbix0LHIpJiYobi5wZW5kaW5nY2IrKyxpPWZ1bmN0aW9uKHQsZSxyLG4saSl7cj1mdW5jdGlvbih0LGUscil7dC5vYmplY3RNb2RlfHwhMT09PXQuZGVjb2RlU3RyaW5nc3x8InN0cmluZyIhPXR5cGVvZiBlfHwoZT1fLmZyb20oZSxyKSk7cmV0dXJuIGV9KGUscixuKSxfLmlzQnVmZmVyKHIpJiYobj0iYnVmZmVyIik7dmFyIG89ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGg7ZS5sZW5ndGgrPW87dmFyIHM9ZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrO3N8fChlLm5lZWREcmFpbj0hMCk7aWYoZS53cml0aW5nfHxlLmNvcmtlZCl7dmFyIGE9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O2UubGFzdEJ1ZmZlcmVkUmVxdWVzdD1uZXcgRWUocixuLGkpLGE/YS5uZXh0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDplLmJ1ZmZlcmVkUmVxdWVzdD1lLmxhc3RCdWZmZXJlZFJlcXVlc3QsZS5idWZmZXJlZFJlcXVlc3RDb3VudCs9MX1lbHNlIEFlKHQsZSwhMSxvLHIsbixpKTtyZXR1cm4gc30odGhpcyxuLHQsZSxyKSksaX0sUmUucHJvdG90eXBlLmNvcms9ZnVuY3Rpb24oKXt0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrfSxSZS5wcm90b3R5cGUudW5jb3JrPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fd3JpdGFibGVTdGF0ZTt0LmNvcmtlZCYmKHQuY29ya2VkLS0sdC53cml0aW5nfHx0LmNvcmtlZHx8dC5maW5pc2hlZHx8dC5idWZmZXJQcm9jZXNzaW5nfHwhdC5idWZmZXJlZFJlcXVlc3R8fE9lKHRoaXMsdCkpfSxSZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC50b0xvd2VyQ2FzZSgpKSwhKFsiaGV4IiwidXRmOCIsInV0Zi04IiwiYXNjaWkiLCJiaW5hcnkiLCJiYXNlNjQiLCJ1Y3MyIiwidWNzLTIiLCJ1dGYxNmxlIiwidXRmLTE2bGUiLCJyYXciXS5pbmRleE9mKCh0KyIiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2Rpbmc9dCx0aGlzfSxSZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXtyKG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIikpfSxSZS5wcm90b3R5cGUuX3dyaXRldj1udWxsLFJlLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGU7ImZ1bmN0aW9uIj09dHlwZW9mIHQ/KHI9dCx0PW51bGwsZT1udWxsKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLG51bGwhPXQmJnRoaXMud3JpdGUodCxlKSxuLmNvcmtlZCYmKG4uY29ya2VkPTEsdGhpcy51bmNvcmsoKSksbi5lbmRpbmd8fG4uZmluaXNoZWR8fGZ1bmN0aW9uKHQsZSxyKXtlLmVuZGluZz0hMCxDZSh0LGUpLHImJihlLmZpbmlzaGVkP3l0KHIpOnQub25jZSgiZmluaXNoIixyKSk7ZS5lbmRlZD0hMCx0LndyaXRhYmxlPSExfSh0aGlzLG4scil9LEN0KFVlLHVlKTtmb3IodmFyIE1lPU9iamVjdC5rZXlzKFJlLnByb3RvdHlwZSksQmU9MDtCZTxNZS5sZW5ndGg7QmUrKyl7dmFyIHhlPU1lW0JlXTtVZS5wcm90b3R5cGVbeGVdfHwoVWUucHJvdG90eXBlW3hlXT1SZS5wcm90b3R5cGVbeGVdKX1mdW5jdGlvbiBVZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBVZSkpcmV0dXJuIG5ldyBVZSh0KTt1ZS5jYWxsKHRoaXMsdCksUmUuY2FsbCh0aGlzLHQpLHQmJiExPT09dC5yZWFkYWJsZSYmKHRoaXMucmVhZGFibGU9ITEpLHQmJiExPT09dC53cml0YWJsZSYmKHRoaXMud3JpdGFibGU9ITEpLHRoaXMuYWxsb3dIYWxmT3Blbj0hMCx0JiYhMT09PXQuYWxsb3dIYWxmT3BlbiYmKHRoaXMuYWxsb3dIYWxmT3Blbj0hMSksdGhpcy5vbmNlKCJlbmQiLEllKX1mdW5jdGlvbiBJZSgpe3RoaXMuYWxsb3dIYWxmT3Blbnx8dGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZHx8eXQoRGUsdGhpcyl9ZnVuY3Rpb24gRGUodCl7dC5lbmQoKX1mdW5jdGlvbiBOZSh0KXt0aGlzLmFmdGVyVHJhbnNmb3JtPWZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10Ll90cmFuc2Zvcm1TdGF0ZTtuLnRyYW5zZm9ybWluZz0hMTt2YXIgaT1uLndyaXRlY2I7aWYoIWkpcmV0dXJuIHQuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigibm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MiKSk7bi53cml0ZWNodW5rPW51bGwsbi53cml0ZWNiPW51bGwsbnVsbCE9ciYmdC5wdXNoKHIpO2koZSk7dmFyIG89dC5fcmVhZGFibGVTdGF0ZTtvLnJlYWRpbmc9ITEsKG8ubmVlZFJlYWRhYmxlfHxvLmxlbmd0aDxvLmhpZ2hXYXRlck1hcmspJiZ0Ll9yZWFkKG8uaGlnaFdhdGVyTWFyayl9KHQsZSxyKX0sdGhpcy5uZWVkVHJhbnNmb3JtPSExLHRoaXMudHJhbnNmb3JtaW5nPSExLHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVjaHVuaz1udWxsLHRoaXMud3JpdGVlbmNvZGluZz1udWxsfWZ1bmN0aW9uIEZlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEZlKSlyZXR1cm4gbmV3IEZlKHQpO1VlLmNhbGwodGhpcyx0KSx0aGlzLl90cmFuc2Zvcm1TdGF0ZT1uZXcgTmUodGhpcyk7dmFyIGU9dGhpczt0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZT0hMCx0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ITEsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnRyYW5zZm9ybSYmKHRoaXMuX3RyYW5zZm9ybT10LnRyYW5zZm9ybSksImZ1bmN0aW9uIj09dHlwZW9mIHQuZmx1c2gmJih0aGlzLl9mbHVzaD10LmZsdXNoKSksdGhpcy5vbmNlKCJwcmVmaW5pc2giLChmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9mbHVzaD90aGlzLl9mbHVzaCgoZnVuY3Rpb24odCl7emUoZSx0KX0pKTp6ZShlKX0pKX1mdW5jdGlvbiB6ZSh0LGUpe2lmKGUpcmV0dXJuIHQuZW1pdCgiZXJyb3IiLGUpO3ZhciByPXQuX3dyaXRhYmxlU3RhdGUsbj10Ll90cmFuc2Zvcm1TdGF0ZTtpZihyLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCIpO2lmKG4udHJhbnNmb3JtaW5nKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZyIpO3JldHVybiB0LnB1c2gobnVsbCl9ZnVuY3Rpb24gcWUodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgcWUpKXJldHVybiBuZXcgcWUodCk7RmUuY2FsbCh0aGlzLHQpfWZ1bmN0aW9uIFllKCl7ZS5jYWxsKHRoaXMpfUN0KEZlLFVlKSxGZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLFVlLnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcyx0LGUpfSxGZS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7dGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQiKX0sRmUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fdHJhbnNmb3JtU3RhdGU7aWYobi53cml0ZWNiPXIsbi53cml0ZWNodW5rPXQsbi53cml0ZWVuY29kaW5nPWUsIW4udHJhbnNmb3JtaW5nKXt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlOyhuLm5lZWRUcmFuc2Zvcm18fGkubmVlZFJlYWRhYmxlfHxpLmxlbmd0aDxpLmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKGkuaGlnaFdhdGVyTWFyayl9fSxGZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdHJhbnNmb3JtU3RhdGU7bnVsbCE9PWUud3JpdGVjaHVuayYmZS53cml0ZWNiJiYhZS50cmFuc2Zvcm1pbmc/KGUudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybShlLndyaXRlY2h1bmssZS53cml0ZWVuY29kaW5nLGUuYWZ0ZXJUcmFuc2Zvcm0pKTplLm5lZWRUcmFuc2Zvcm09ITB9LEN0KHFlLEZlKSxxZS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7cihudWxsLHQpfSxDdChZZSxlKSxZZS5SZWFkYWJsZT11ZSxZZS5Xcml0YWJsZT1SZSxZZS5EdXBsZXg9VWUsWWUuVHJhbnNmb3JtPUZlLFllLlBhc3NUaHJvdWdoPXFlLFllLlN0cmVhbT1ZZSxZZS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbih0LHIpe3ZhciBuPXRoaXM7ZnVuY3Rpb24gaShlKXt0LndyaXRhYmxlJiYhMT09PXQud3JpdGUoZSkmJm4ucGF1c2UmJm4ucGF1c2UoKX1mdW5jdGlvbiBvKCl7bi5yZWFkYWJsZSYmbi5yZXN1bWUmJm4ucmVzdW1lKCl9bi5vbigiZGF0YSIsaSksdC5vbigiZHJhaW4iLG8pLHQuX2lzU3RkaW98fHImJiExPT09ci5lbmR8fChuLm9uKCJlbmQiLGEpLG4ub24oImNsb3NlIix1KSk7dmFyIHM9ITE7ZnVuY3Rpb24gYSgpe3N8fChzPSEwLHQuZW5kKCkpfWZ1bmN0aW9uIHUoKXtzfHwocz0hMCwiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXN0cm95JiZ0LmRlc3Ryb3koKSl9ZnVuY3Rpb24gaCh0KXtpZihmKCksMD09PWUubGlzdGVuZXJDb3VudCh0aGlzLCJlcnJvciIpKXRocm93IHR9ZnVuY3Rpb24gZigpe24ucmVtb3ZlTGlzdGVuZXIoImRhdGEiLGkpLHQucmVtb3ZlTGlzdGVuZXIoImRyYWluIixvKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGEpLG4ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIix1KSxuLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsaCksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGgpLG4ucmVtb3ZlTGlzdGVuZXIoImVuZCIsZiksbi5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGYpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixmKX1yZXR1cm4gbi5vbigiZXJyb3IiLGgpLHQub24oImVycm9yIixoKSxuLm9uKCJlbmQiLGYpLG4ub24oImNsb3NlIixmKSx0Lm9uKCJjbG9zZSIsZiksdC5lbWl0KCJwaXBlIixuKSx0fTt2YXIgV2U9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fSwkZT17fSxHZT17Z2V0IGV4cG9ydHMoKXtyZXR1cm4gJGV9LHNldCBleHBvcnRzKHQpeyRlPXR9fTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT9HZS5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7ZSYmKHQuc3VwZXJfPWUsdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSkpfTpHZS5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoZSl7dC5zdXBlcl89ZTt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH19O2xldCBKZT1WZSgpO2Z1bmN0aW9uIEhlKHQsZSl7KCJvYmplY3QiIT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KSkmJihlPXQsdD17fSk7bGV0IHI9bmV3IEplKHQpO3ZhciBuO3JldHVybiByLl9mcm9tPUFycmF5LmlzQXJyYXkoZSk/KG49KG49ZSkuc2xpY2UoKSxmdW5jdGlvbih0LGUpe2xldCByPW51bGwsaT1uLmxlbmd0aD9uLnNoaWZ0KCk6bnVsbDtpIGluc3RhbmNlb2YgRXJyb3ImJihyPWksaT1udWxsKSxlKHIsaSl9KTplfHxLZSxyfWZ1bmN0aW9uIFZlKHQsZSl7ZnVuY3Rpb24gcihlKXtpZighKHRoaXMgaW5zdGFuY2VvZiByKSlyZXR1cm4gbmV3IHIoZSk7dGhpcy5fcmVhZGluZz0hMSx0aGlzLl9jYWxsYmFjaz1mdW5jdGlvbih0LGUpe2lmKG4uZGVzdHJveWVkKXJldHVybjtpZih0KXJldHVybiBuLmRlc3Ryb3kodCk7aWYobnVsbD09PWUpcmV0dXJuIG4ucHVzaChudWxsKTtuLl9yZWFkaW5nPSExLG4ucHVzaChlKSYmbi5fcmVhZChpKX0sdGhpcy5kZXN0cm95ZWQ9ITEsdWUuY2FsbCh0aGlzLGV8fHQpO2xldCBuPXRoaXMsaT10aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJihlPXQsdD17fSksdD1aZSh0KSwkZShyLHVlKSxyLnByb3RvdHlwZS5fZnJvbT1lfHxLZSxyLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLl9yZWFkaW5nfHx0aGlzLmRlc3Ryb3llZHx8KHRoaXMuX3JlYWRpbmc9ITAsdGhpcy5fZnJvbSh0LHRoaXMuX2NhbGxiYWNrKSl9LHIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24odCl7aWYodGhpcy5kZXN0cm95ZWQpcmV0dXJuO3RoaXMuZGVzdHJveWVkPSEwO2xldCBlPXRoaXM7cHJvY2Vzcy5uZXh0VGljaygoZnVuY3Rpb24oKXt0JiZlLmVtaXQoImVycm9yIix0KSxlLmVtaXQoImNsb3NlIil9KSl9LHJ9ZnVuY3Rpb24gS2UoKXt9ZnVuY3Rpb24gWmUodCl7cmV0dXJuIHQ9dHx8e319SGUuY3Rvcj1WZSxIZS5vYmo9ZnVuY3Rpb24odCxlKXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCkpJiYoZT10LHQ9e30pLCh0PVplKHQpKS5vYmplY3RNb2RlPSEwLHQuaGlnaFdhdGVyTWFyaz0xNixIZSh0LGUpfTt2YXIgUWUsWGU9MSx0cj17fSxlcj0hMSxycj1hLmRvY3VtZW50O2Z1bmN0aW9uIG5yKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1uZXcgRnVuY3Rpb24oIiIrdCkpO2Zvcih2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxyPTA7cjxlLmxlbmd0aDtyKyspZVtyXT1hcmd1bWVudHNbcisxXTt2YXIgbj17Y2FsbGJhY2s6dCxhcmdzOmV9O3JldHVybiB0cltYZV09bixRZShYZSksWGUrK31mdW5jdGlvbiBpcih0KXtpZihlcilzZXRUaW1lb3V0KGlyLDAsdCk7ZWxzZXt2YXIgZT10clt0XTtpZihlKXtlcj0hMDt0cnl7IWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2FsbGJhY2sscj10LmFyZ3M7c3dpdGNoKHIubGVuZ3RoKXtjYXNlIDA6ZSgpO2JyZWFrO2Nhc2UgMTplKHJbMF0pO2JyZWFrO2Nhc2UgMjplKHJbMF0sclsxXSk7YnJlYWs7Y2FzZSAzOmUoclswXSxyWzFdLHJbMl0pO2JyZWFrO2RlZmF1bHQ6ZS5hcHBseSh2b2lkIDAscil9fShlKX1maW5hbGx5eyFmdW5jdGlvbih0KXtkZWxldGUgdHJbdF19KHQpLGVyPSExfX19fXZhciBvcixzcixhcix1cixocj1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtmdW5jdGlvbiBmcih0KXtsZXQgZSxyPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KTtpZihlPSJbb2JqZWN0IFByb21pc2VdIj09PXIsZSlyZXR1cm4hMDtpZigiW29iamVjdCBGdW5jdGlvbl0iIT09cilyZXR1cm4hMTt0cnl7ZT0iZnVuY3Rpb24iIT10eXBlb2YgdC5zdWJzY3JpYmUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW59Y2F0Y2godCl7fXJldHVybiBlfWZ1bmN0aW9uIGNyKHQpe2xldCBlLHIsbjtmdW5jdGlvbiBpKGkpeygodD1pKWluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fEFycmF5QnVmZmVyLmlzVmlldyh0KSYmIV8uaXNCdWZmZXIodCkpJiYodD1fLmZyb20odCkpLGU9ZnIodCk/dDpudWxsO2NvbnN0IG89IWUmJnRbU3ltYm9sLml0ZXJhdG9yXSYmInN0cmluZyIhPXR5cGVvZiB0JiYhXy5pc0J1ZmZlcih0KTtyPW8/dFtTeW1ib2wuaXRlcmF0b3JdKCk6bnVsbDtjb25zdCBzPSFlJiZ0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtuPXM/dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTpudWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LnNsaWNlKCkpLGkodCksSGUoKGZ1bmN0aW9uIG8ocyxhKXtpZihlKXJldHVybiB2b2lkKGFzeW5jKCk9Pnt0cnl7YXdhaXQgaShhd2FpdCBlKSxvLmNhbGwodGhpcyxzLGEpfWNhdGNoKHQpe2EodCl9fSkoKTtpZihyKXtjb25zdCB0PXIubmV4dCgpO3JldHVybiB2b2lkIG5yKGEsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1pZihuKXJldHVybiB2b2lkKGFzeW5jKCk9Pnt0cnl7Y29uc3QgdD1hd2FpdCBuLm5leHQoKTtucihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9Y2F0Y2godCl7bnIoYSx0KX19KSgpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdm9pZCBucihhLG51bGwsbnVsbCk7Y29uc3QgdT10LnNsaWNlKDAscyk7dD10LnNsaWNlKHMpLG5yKGEsbnVsbCx1KX0pKX1ocj1ociYmaHIuc2V0VGltZW91dD9ocjphLCJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwoYS5wcm9jZXNzKT9RZT1mdW5jdGlvbih0KXtMdC5uZXh0VGljaygoZnVuY3Rpb24oKXtpcih0KX0pKX06IWZ1bmN0aW9uKCl7aWYoYS5wb3N0TWVzc2FnZSYmIWEuaW1wb3J0U2NyaXB0cyl7dmFyIHQ9ITAsZT1hLm9ubWVzc2FnZTtyZXR1cm4gYS5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXt0PSExfSxhLnBvc3RNZXNzYWdlKCIiLCIqIiksYS5vbm1lc3NhZ2U9ZSx0fX0oKT9hLk1lc3NhZ2VDaGFubmVsPygoc3I9bmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24odCl7aXIodC5kYXRhKX0sUWU9ZnVuY3Rpb24odCl7c3IucG9ydDIucG9zdE1lc3NhZ2UodCl9KTpyciYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiByci5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT8ob3I9cnIuZG9jdW1lbnRFbGVtZW50LFFlPWZ1bmN0aW9uKHQpe3ZhciBlPXJyLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aXIodCksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxvci5yZW1vdmVDaGlsZChlKSxlPW51bGx9LG9yLmFwcGVuZENoaWxkKGUpfSk6UWU9ZnVuY3Rpb24odCl7c2V0VGltZW91dChpciwwLHQpfTooYXI9InNldEltbWVkaWF0ZSQiK01hdGgucmFuZG9tKCkrIiQiLHVyPWZ1bmN0aW9uKHQpe3Quc291cmNlPT09YSYmInN0cmluZyI9PXR5cGVvZiB0LmRhdGEmJjA9PT10LmRhdGEuaW5kZXhPZihhcikmJmlyKCt0LmRhdGEuc2xpY2UoYXIubGVuZ3RoKSl9LGEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHVyLCExKTphLmF0dGFjaEV2ZW50KCJvbm1lc3NhZ2UiLHVyKSxRZT1mdW5jdGlvbih0KXthLnBvc3RNZXNzYWdlKGFyK3QsIioiKX0pLGNyLm9iamVjdD10PT57bGV0IGUscixuO2Z1bmN0aW9uIGkoaSl7ZT1mcih0PWkpP3Q6bnVsbCxyPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0/dFtTeW1ib2wuaXRlcmF0b3JdKCk6bnVsbCxuPSFlJiZ0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXT90W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOm51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSksaSh0KSxIZS5vYmooKGZ1bmN0aW9uIG8ocyxhKXtpZihlKShhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMscyxhKX1jYXRjaCh0KXthKHQpfX0pKCk7ZWxzZSBpZihyKXtjb25zdCB0PXIubmV4dCgpO25yKGEsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1lbHNlIG4/KGFzeW5jKCk9Pnt0cnl7Y29uc3QgdD1hd2FpdCBuLm5leHQoKTtucihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9Y2F0Y2godCl7bnIoYSx0KX19KSgpOih0aGlzLnB1c2godCksbnIoYSxudWxsLG51bGwpKX0pKX07dmFyIGxyPXt9LHByPWxyLkxFRlRfQlJBQ0U9MSxkcj1sci5SSUdIVF9CUkFDRT0yLGdyPWxyLkxFRlRfQlJBQ0tFVD0zLHlyPWxyLlJJR0hUX0JSQUNLRVQ9NCx2cj1sci5DT0xPTj01LGJyPWxyLkNPTU1BPTYsbXI9bHIuVFJVRT03LHdyPWxyLkZBTFNFPTgsX3I9bHIuTlVMTD05LFNyPWxyLlNUUklORz0xMCxFcj1sci5OVU1CRVI9MTEsa3I9bHIuU1RBUlQ9MTcsUnI9bHIuU1RPUD0xOCxBcj1sci5UUlVFMT0zMyxUcj1sci5UUlVFMj0zNCxPcj1sci5UUlVFMz0zNSxqcj1sci5GQUxTRTE9NDksTHI9bHIuRkFMU0UyPTUwLENyPWxyLkZBTFNFMz01MSxQcj1sci5GQUxTRTQ9NTIsTXI9bHIuTlVMTDE9NjUsQnI9bHIuTlVMTDI9NjYseHI9bHIuTlVMTDM9NjcsVXI9bHIuTlVNQkVSMT04MSxJcj1sci5OVU1CRVIzPTgzLERyPWxyLlNUUklORzE9OTcsTnI9bHIuU1RSSU5HMj05OCxGcj1sci5TVFJJTkczPTk5LHpyPWxyLlNUUklORzQ9MTAwLHFyPWxyLlNUUklORzU9MTAxLFlyPWxyLlNUUklORzY9MTAyLFdyPWxyLlZBTFVFPTExMywkcj1sci5LRVk9MTE0LEdyPWxyLk9CSkVDVD0xMjksSnI9bHIuQVJSQVk9MTMwLEhyPSJcXCIuY2hhckNvZGVBdCgwKSxWcj0iLyIuY2hhckNvZGVBdCgwKSxLcj0iXGIiLmNoYXJDb2RlQXQoMCksWnI9IlxmIi5jaGFyQ29kZUF0KDApLFFyPSJcbiIuY2hhckNvZGVBdCgwKSxYcj0iXHIiLmNoYXJDb2RlQXQoMCksdG49Ilx0Ii5jaGFyQ29kZUF0KDApLGVuPTY1NTM2O2Z1bmN0aW9uIHJuKCl7dGhpcy50U3RhdGU9a3IsdGhpcy52YWx1ZT12b2lkIDAsdGhpcy5zdHJpbmc9dm9pZCAwLHRoaXMuc3RyaW5nQnVmZmVyPV8uYWxsb2M/Xy5hbGxvYyhlbik6bmV3IF8oZW4pLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy51bmljb2RlPXZvaWQgMCx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwLHRoaXMua2V5PXZvaWQgMCx0aGlzLm1vZGU9dm9pZCAwLHRoaXMuc3RhY2s9W10sdGhpcy5zdGF0ZT1Xcix0aGlzLmJ5dGVzX3JlbWFpbmluZz0wLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MCx0aGlzLnRlbXBfYnVmZnM9ezI6bmV3IF8oMiksMzpuZXcgXygzKSw0Om5ldyBfKDQpfSx0aGlzLm9mZnNldD0tMX1ybi50b2tuYW09ZnVuY3Rpb24odCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKGxyKSxyPTAsbj1lLmxlbmd0aDtyPG47cisrKXt2YXIgaT1lW3JdO2lmKGxyW2ldPT09dClyZXR1cm4gaX1yZXR1cm4gdCYmIjB4Iit0LnRvU3RyaW5nKDE2KX07dmFyIG5uPXJuLnByb3RvdHlwZTtubi5vbkVycm9yPWZ1bmN0aW9uKHQpe3Rocm93IHR9LG5uLmNoYXJFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPVJyLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIitKU09OLnN0cmluZ2lmeShTdHJpbmcuZnJvbUNoYXJDb2RlKHRbZV0pKSsiIGF0IHBvc2l0aW9uICIrZSsiIGluIHN0YXRlICIrcm4udG9rbmFtKHRoaXMudFN0YXRlKSkpfSxubi5hcHBlbmRTdHJpbmdDaGFyPWZ1bmN0aW9uKHQpe3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0Pj1lbiYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTApLHRoaXMuc3RyaW5nQnVmZmVyW3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KytdPXR9LG5uLmFwcGVuZFN0cmluZ0J1Zj1mdW5jdGlvbih0LGUscil7dmFyIG49dC5sZW5ndGg7Im51bWJlciI9PXR5cGVvZiBlJiYobj0ibnVtYmVyIj09dHlwZW9mIHI/cjwwP3QubGVuZ3RoLWUrcjpyLWU6dC5sZW5ndGgtZSksbjwwJiYobj0wKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCtuPmVuJiYodGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiwwLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0LmNvcHkodGhpcy5zdHJpbmdCdWZmZXIsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQsZSxyKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCs9bn0sbm4ud3JpdGU9ZnVuY3Rpb24odCl7dmFyIGU7InN0cmluZyI9PXR5cGVvZiB0JiYodD1uZXcgXyh0KSk7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWlmKHRoaXMudFN0YXRlPT09a3Ipe2lmKGU9dFtyXSx0aGlzLm9mZnNldCsrLDEyMz09PWUpdGhpcy5vblRva2VuKHByLCJ7Iik7ZWxzZSBpZigxMjU9PT1lKXRoaXMub25Ub2tlbihkciwifSIpO2Vsc2UgaWYoOTE9PT1lKXRoaXMub25Ub2tlbihnciwiWyIpO2Vsc2UgaWYoOTM9PT1lKXRoaXMub25Ub2tlbih5ciwiXSIpO2Vsc2UgaWYoNTg9PT1lKXRoaXMub25Ub2tlbih2ciwiOiIpO2Vsc2UgaWYoNDQ9PT1lKXRoaXMub25Ub2tlbihiciwiLCIpO2Vsc2UgaWYoMTE2PT09ZSl0aGlzLnRTdGF0ZT1BcjtlbHNlIGlmKDEwMj09PWUpdGhpcy50U3RhdGU9anI7ZWxzZSBpZigxMTA9PT1lKXRoaXMudFN0YXRlPU1yO2Vsc2UgaWYoMzQ9PT1lKXRoaXMuc3RyaW5nPSIiLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy50U3RhdGU9RHI7ZWxzZSBpZig0NT09PWUpdGhpcy5zdHJpbmc9Ii0iLHRoaXMudFN0YXRlPVVyO2Vsc2UgaWYoZT49NDgmJmU8NjQpdGhpcy5zdHJpbmc9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZT1JcjtlbHNlIGlmKDMyIT09ZSYmOSE9PWUmJjEwIT09ZSYmMTMhPT1lKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpfWVsc2UgaWYodGhpcy50U3RhdGU9PT1EcilpZihlPXRbcl0sdGhpcy5ieXRlc19yZW1haW5pbmc+MCl7Zm9yKHZhciBpPTA7aTx0aGlzLmJ5dGVzX3JlbWFpbmluZztpKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdGhpcy5ieXRlc19yZW1haW5pbmcraV09dFtpXTt0aGlzLmFwcGVuZFN0cmluZ0J1Zih0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV0pLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9dGhpcy5ieXRlc19yZW1haW5pbmc9MCxyPXIraS0xfWVsc2UgaWYoMD09PXRoaXMuYnl0ZXNfcmVtYWluaW5nJiZlPj0xMjgpe2lmKGU8PTE5M3x8ZT4yNDQpcmV0dXJuIHRoaXMub25FcnJvcihuZXcgRXJyb3IoIkludmFsaWQgVVRGLTggY2hhcmFjdGVyIGF0IHBvc2l0aW9uICIrcisiIGluIHN0YXRlICIrcm4udG9rbmFtKHRoaXMudFN0YXRlKSkpO2lmKGU+PTE5NCYmZTw9MjIzJiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0yKSxlPj0yMjQmJmU8PTIzOSYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MyksZT49MjQwJiZlPD0yNDQmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTQpLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2Urcj50Lmxlbmd0aCl7Zm9yKHZhciBvPTA7bzw9dC5sZW5ndGgtMS1yO28rKyl0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV1bb109dFtyK29dO3RoaXMuYnl0ZXNfcmVtYWluaW5nPXIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS10Lmxlbmd0aCxyPXQubGVuZ3RoLTF9ZWxzZSB0aGlzLmFwcGVuZFN0cmluZ0J1Zih0LHIscit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlKSxyPXIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS0xfWVsc2UgaWYoMzQ9PT1lKXRoaXMudFN0YXRlPWtyLHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIsMCx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCx0aGlzLm9uVG9rZW4oU3IsdGhpcy5zdHJpbmcpLHRoaXMub2Zmc2V0Kz1fLmJ5dGVMZW5ndGgodGhpcy5zdHJpbmcsInV0ZjgiKSsxLHRoaXMuc3RyaW5nPXZvaWQgMDtlbHNlIGlmKDkyPT09ZSl0aGlzLnRTdGF0ZT1OcjtlbHNle2lmKCEoZT49MzIpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMuYXBwZW5kU3RyaW5nQ2hhcihlKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09TnIpaWYoMzQ9PT0oZT10W3JdKSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZSksdGhpcy50U3RhdGU9RHI7ZWxzZSBpZig5Mj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKEhyKSx0aGlzLnRTdGF0ZT1EcjtlbHNlIGlmKDQ3PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoVnIpLHRoaXMudFN0YXRlPURyO2Vsc2UgaWYoOTg9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihLciksdGhpcy50U3RhdGU9RHI7ZWxzZSBpZigxMDI9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihaciksdGhpcy50U3RhdGU9RHI7ZWxzZSBpZigxMTA9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihRciksdGhpcy50U3RhdGU9RHI7ZWxzZSBpZigxMTQ9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihYciksdGhpcy50U3RhdGU9RHI7ZWxzZSBpZigxMTY9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcih0biksdGhpcy50U3RhdGU9RHI7ZWxzZXtpZigxMTchPT1lKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudW5pY29kZT0iIix0aGlzLnRTdGF0ZT1Gcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09RnJ8fHRoaXMudFN0YXRlPT09enJ8fHRoaXMudFN0YXRlPT09cXJ8fHRoaXMudFN0YXRlPT09WXIpe2lmKCEoKGU9dFtyXSk+PTQ4JiZlPDY0fHxlPjY0JiZlPD03MHx8ZT45NiYmZTw9MTAyKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTtpZih0aGlzLnVuaWNvZGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGUrKz09PVlyKXt2YXIgcz1wYXJzZUludCh0aGlzLnVuaWNvZGUsMTYpO3RoaXMudW5pY29kZT12b2lkIDAsdm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiZzPj01NjMyMCYmczw1NzM0ND8odGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IF8oU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUscykpKSx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwKTp2b2lkIDA9PT10aGlzLmhpZ2hTdXJyb2dhdGUmJnM+PTU1Mjk2JiZzPDU2MzIwP3RoaXMuaGlnaFN1cnJvZ2F0ZT1zOih2b2lkIDAhPT10aGlzLmhpZ2hTdXJyb2dhdGUmJih0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgXyhTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuaGlnaFN1cnJvZ2F0ZSkpKSx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwKSx0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgXyhTdHJpbmcuZnJvbUNoYXJDb2RlKHMpKSkpLHRoaXMudFN0YXRlPURyfX1lbHNlIGlmKHRoaXMudFN0YXRlPT09VXJ8fHRoaXMudFN0YXRlPT09SXIpc3dpdGNoKGU9dFtyXSl7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmNhc2UgNTY6Y2FzZSA1NzpjYXNlIDQ2OmNhc2UgMTAxOmNhc2UgNjk6Y2FzZSA0MzpjYXNlIDQ1OnRoaXMuc3RyaW5nKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlPUlyO2JyZWFrO2RlZmF1bHQ6dGhpcy50U3RhdGU9a3I7dmFyIGE9TnVtYmVyKHRoaXMuc3RyaW5nKTtpZihpc05hTihhKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnN0cmluZy5tYXRjaCgvWzAtOV0rLyk9PXRoaXMuc3RyaW5nJiZhLnRvU3RyaW5nKCkhPXRoaXMuc3RyaW5nP3RoaXMub25Ub2tlbihTcix0aGlzLnN0cmluZyk6dGhpcy5vblRva2VuKEVyLGEpLHRoaXMub2Zmc2V0Kz10aGlzLnN0cmluZy5sZW5ndGgtMSx0aGlzLnN0cmluZz12b2lkIDAsci0tfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Bcil7aWYoMTE0IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Ucn1lbHNlIGlmKHRoaXMudFN0YXRlPT09VHIpe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9T3J9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PU9yKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPWtyLHRoaXMub25Ub2tlbihtciwhMCksdGhpcy5vZmZzZXQrPTN9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PWpyKXtpZig5NyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9THJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUxyKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUNyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Dcil7aWYoMTE1IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Qcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09UHIpe2lmKDEwMSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9a3IsdGhpcy5vblRva2VuKHdyLCExKSx0aGlzLm9mZnNldCs9NH1lbHNlIGlmKHRoaXMudFN0YXRlPT09TXIpe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9QnJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUJyKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPXhyfWVsc2UgaWYodGhpcy50U3RhdGU9PT14cil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1rcix0aGlzLm9uVG9rZW4oX3IsbnVsbCksdGhpcy5vZmZzZXQrPTN9fSxubi5vblRva2VuPWZ1bmN0aW9uKHQsZSl7fSxubi5wYXJzZUVycm9yPWZ1bmN0aW9uKHQsZSl7dGhpcy50U3RhdGU9UnIsdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiVW5leHBlY3RlZCAiK3JuLnRva25hbSh0KSsoZT8iKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiOiIiKSsiIGluIHN0YXRlICIrcm4udG9rbmFtKHRoaXMuc3RhdGUpKSl9LG5uLnB1c2g9ZnVuY3Rpb24oKXt0aGlzLnN0YWNrLnB1c2goe3ZhbHVlOnRoaXMudmFsdWUsa2V5OnRoaXMua2V5LG1vZGU6dGhpcy5tb2RlfSl9LG5uLnBvcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmFsdWUsZT10aGlzLnN0YWNrLnBvcCgpO3RoaXMudmFsdWU9ZS52YWx1ZSx0aGlzLmtleT1lLmtleSx0aGlzLm1vZGU9ZS5tb2RlLHRoaXMuZW1pdCh0KSx0aGlzLm1vZGV8fCh0aGlzLnN0YXRlPVdyKX0sbm4uZW1pdD1mdW5jdGlvbih0KXt0aGlzLm1vZGUmJih0aGlzLnN0YXRlPWJyKSx0aGlzLm9uVmFsdWUodCl9LG5uLm9uVmFsdWU9ZnVuY3Rpb24odCl7fSxubi5vblRva2VuPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5zdGF0ZT09PVdyKWlmKHQ9PT1Tcnx8dD09PUVyfHx0PT09bXJ8fHQ9PT13cnx8dD09PV9yKXRoaXMudmFsdWUmJih0aGlzLnZhbHVlW3RoaXMua2V5XT1lKSx0aGlzLmVtaXQoZSk7ZWxzZSBpZih0PT09cHIpdGhpcy5wdXNoKCksdGhpcy52YWx1ZT90aGlzLnZhbHVlPXRoaXMudmFsdWVbdGhpcy5rZXldPXt9OnRoaXMudmFsdWU9e30sdGhpcy5rZXk9dm9pZCAwLHRoaXMuc3RhdGU9JHIsdGhpcy5tb2RlPUdyO2Vsc2UgaWYodD09PWdyKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT1bXTp0aGlzLnZhbHVlPVtdLHRoaXMua2V5PTAsdGhpcy5tb2RlPUpyLHRoaXMuc3RhdGU9V3I7ZWxzZSBpZih0PT09ZHIpe2lmKHRoaXMubW9kZSE9PUdyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2V7aWYodCE9PXlyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0aGlzLm1vZGUhPT1KcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT0kcilpZih0PT09U3IpdGhpcy5rZXk9ZSx0aGlzLnN0YXRlPXZyO2Vsc2V7aWYodCE9PWRyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2UgaWYodGhpcy5zdGF0ZT09PXZyKXtpZih0IT09dnIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMuc3RhdGU9V3J9ZWxzZXtpZih0aGlzLnN0YXRlIT09YnIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO2lmKHQ9PT1icil0aGlzLm1vZGU9PT1Kcj8odGhpcy5rZXkrKyx0aGlzLnN0YXRlPVdyKTp0aGlzLm1vZGU9PT1HciYmKHRoaXMuc3RhdGU9JHIpO2Vsc2V7aWYoISh0PT09eXImJnRoaXMubW9kZT09PUpyfHx0PT09ZHImJnRoaXMubW9kZT09PUdyKSlyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX19fSxybi5DPWxyO3ZhciBvbj1ybjtmdW5jdGlvbiBzbih0LGUscil7dD10fHxmdW5jdGlvbih0KXt0aGlzLnF1ZXVlKHQpfSxlPWV8fGZ1bmN0aW9uKCl7dGhpcy5xdWV1ZShudWxsKX07bGV0IG49ITEsaT0hMSxvPVtdLHM9ITEsYT1uZXcgWWU7ZnVuY3Rpb24gdSgpe2Zvcig7by5sZW5ndGgmJiFhLnBhdXNlZDspe2xldCB0PW8uc2hpZnQoKTtpZihudWxsPT09dClyZXR1cm4gYS5lbWl0KCJlbmQiKTthLmVtaXQoImRhdGEiLHQpfX1yZXR1cm4gYS5yZWFkYWJsZT1hLndyaXRhYmxlPSEwLGEucGF1c2VkPSExLGEuYXV0b0Rlc3Ryb3k9IShyJiYhMT09PXIuYXV0b0Rlc3Ryb3kpLGEud3JpdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpLCFhLnBhdXNlZH0sYS5xdWV1ZT1hLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHN8fChudWxsPT09dCYmKHM9ITApLG8ucHVzaCh0KSx1KCkpLGF9LGEub24oImVuZCIsKGZ1bmN0aW9uKCl7YS5yZWFkYWJsZT0hMSwhYS53cml0YWJsZSYmYS5hdXRvRGVzdHJveSYmTHQubmV4dFRpY2soKGZ1bmN0aW9uKCl7YS5kZXN0cm95KCl9KSl9KSksYS5lbmQ9ZnVuY3Rpb24odCl7aWYoIW4pcmV0dXJuIG49ITAsYXJndW1lbnRzLmxlbmd0aCYmYS53cml0ZSh0KSxhLndyaXRhYmxlPSExLGUuY2FsbChhKSwhYS5yZWFkYWJsZSYmYS5hdXRvRGVzdHJveSYmYS5kZXN0cm95KCksYX0sYS5kZXN0cm95PWZ1bmN0aW9uKCl7aWYoIWkpcmV0dXJuIGk9ITAsbj0hMCxvLmxlbmd0aD0wLGEud3JpdGFibGU9YS5yZWFkYWJsZT0hMSxhLmVtaXQoImNsb3NlIiksYX0sYS5wYXVzZT1mdW5jdGlvbigpe2lmKCFhLnBhdXNlZClyZXR1cm4gYS5wYXVzZWQ9ITAsYX0sYS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5wYXVzZWQmJihhLnBhdXNlZD0hMSxhLmVtaXQoInJlc3VtZSIpKSx1KCksYS5wYXVzZWR8fGEuZW1pdCgiZHJhaW4iKSxhfSxhfXNuLnRocm91Z2g9c247bGV0IGFuPXtwYXJzZTpmdW5jdGlvbih0LGUpe2xldCByLG47ZnVuY3Rpb24gaSh0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9lPT09dDp0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5leGVjP3QuZXhlYyhlKToiYm9vbGVhbiI9PXR5cGVvZiB0fHwib2JqZWN0Ij09dHlwZW9mIHQ/dDoiZnVuY3Rpb24iPT10eXBlb2YgdCYmdChlKX1sZXQgbz1uZXcgb24scz1zbigoZnVuY3Rpb24odCl7InN0cmluZyI9PXR5cGVvZiB0JiYodD1fLmZyb20odCkpLG8ud3JpdGUodCl9KSwoZnVuY3Rpb24odCl7dCYmcy53cml0ZSh0KSxyJiZzLmVtaXQoImhlYWRlciIsciksbiYmcy5lbWl0KCJmb290ZXIiLG4pLHMucXVldWUobnVsbCl9KSk7ZnVuY3Rpb24gYSh0LGUpeyExIT09ciYmKHI9cnx8e30sclt0XT1lKSwhMSE9PW4mJiExPT09ciYmKG49bnx8e30sblt0XT1lKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoIi4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIkKiI9PT10P3tlbWl0S2V5OiEwfToiKiI9PT10fHwoIiI9PT10P3tyZWN1cnNlOiEwfTp0KX0pKSksdCYmdC5sZW5ndGh8fCh0PW51bGwpLG8ub25WYWx1ZT1mdW5jdGlvbihuKXtpZih0aGlzLnJvb3R8fChzLnJvb3Q9biksIXQpcmV0dXJuO2xldCBvPTAsdT0wLGg9ITEsZj0hMTtmb3IoO288dC5sZW5ndGg7KXtsZXQgZSxyPXRbb107aWYodSsrLHImJiFyLnJlY3Vyc2Upe2lmKGU9dT09PXRoaXMuc3RhY2subGVuZ3RoP3RoaXM6dGhpcy5zdGFja1t1XSwhZSlyZXR1cm47aWYoIWkocixlLmtleSkpcmV0dXJuIHZvaWQgYShlLmtleSxuKTtoPSEhci5lbWl0S2V5LGY9ISFyLmVtaXRQYXRoLG8rK31lbHNle28rKztsZXQgcj10W29dO2lmKCFyKXJldHVybjtmb3IoOzspe2lmKGU9dT09PXRoaXMuc3RhY2subGVuZ3RoP3RoaXM6dGhpcy5zdGFja1t1XSwhZSlyZXR1cm47aWYoaShyLGUua2V5KSl7bysrLE9iamVjdC5pc0Zyb3plbih0aGlzLnN0YWNrW3VdKXx8KHRoaXMuc3RhY2tbdV0udmFsdWU9bnVsbCk7YnJlYWt9YShlLmtleSxuKSx1Kyt9fX1pZihyJiYocy5lbWl0KCJoZWFkZXIiLHIpLHI9ITEpLHUhPT10aGlzLnN0YWNrLmxlbmd0aClyZXR1cm47bGV0IGM9dGhpcy5zdGFjay5zbGljZSgxKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmtleX0pKS5jb25jYXQoW3RoaXMua2V5XSksbD1uO251bGwhPWwmJm51bGwhPShsPWU/ZShsLGMpOmwpJiYoKGh8fGYpJiYobD17dmFsdWU6bH0saCYmKGwua2V5PXRoaXMua2V5KSxmJiYobC5wYXRoPWMpKSxzLnF1ZXVlKGwpKSx0aGlzLnZhbHVlJiZkZWxldGUgdGhpcy52YWx1ZVt0aGlzLmtleV07Zm9yKGxldCB0IGluIHRoaXMuc3RhY2spT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbdF0pfHwodGhpcy5zdGFja1t0XS52YWx1ZT1udWxsKX0sby5fb25Ub2tlbj1vLm9uVG9rZW4sby5vblRva2VuPWZ1bmN0aW9uKGUscil7by5fb25Ub2tlbihlLHIpLDA9PT10aGlzLnN0YWNrLmxlbmd0aCYmcy5yb290JiYodHx8cy5xdWV1ZShzLnJvb3QpLHMucm9vdD1udWxsKX0sby5vbkVycm9yPWZ1bmN0aW9uKHQpe3QubWVzc2FnZS5pbmRleE9mKCJhdCBwb3NpdGlvbiIpPi0xJiYodC5tZXNzYWdlPSJJbnZhbGlkIEpTT04gKCIrdC5tZXNzYWdlKyIpIikscy5lbWl0KCJlcnJvciIsdCl9LHN9fSx1bj1mdW5jdGlvbih0LGUpe3JldHVybiB1bj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IobGV0IHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiYodFtyXT1lW3JdKX0sdW4odCxlKX07bGV0IGhuLGZuPS9bXFwiXHUwMDAwLVx1MDAxZlx1MDA3Zi1cdTAwOWZcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vZyxjbj17IlxiIjoiXFxiIiwiXHQiOiJcXHQiLCJcbiI6IlxcbiIsIlxmIjoiXFxmIiwiXHIiOiJcXHIiLCciJzonXFwiJywiXFwiOiJcXFxcIn07ZnVuY3Rpb24gbG4odCl7cmV0dXJuIHQ/ImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbj9obi5Qcm9taXNlOmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnBpcGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlbW92ZUxpc3RlbmVyfSh0KT90Ll9yZWFkYWJsZVN0YXRlLm9iamVjdE1vZGU/aG4uUmVhZGFibGVPYmplY3Q6aG4uUmVhZGFibGVTdHJpbmc6QXJyYXkuaXNBcnJheSh0KT9obi5BcnJheToib2JqZWN0Ij09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBPYmplY3Q/aG4uT2JqZWN0OmhuLlByaW1pdGl2ZTpobi5QcmltaXRpdmV9IWZ1bmN0aW9uKHQpe3RbdC5BcnJheT0wXT0iQXJyYXkiLHRbdC5PYmplY3Q9MV09Ik9iamVjdCIsdFt0LlJlYWRhYmxlU3RyaW5nPTJdPSJSZWFkYWJsZVN0cmluZyIsdFt0LlJlYWRhYmxlT2JqZWN0PTNdPSJSZWFkYWJsZU9iamVjdCIsdFt0LlByaW1pdGl2ZT00XT0iUHJpbWl0aXZlIix0W3QuUHJvbWlzZT01XT0iUHJvbWlzZSJ9KGhufHwoaG49e30pKTtsZXQgcG49W107cG5baG4uQXJyYXldPSJbIixwbltobi5PYmplY3RdPSJ7Iixwbltobi5SZWFkYWJsZVN0cmluZ109JyInLHBuW2huLlJlYWRhYmxlT2JqZWN0XT0iWyI7bGV0IGRuPVtdO2RuW2huLkFycmF5XT0iXSIsZG5baG4uT2JqZWN0XT0ifSIsZG5baG4uUmVhZGFibGVTdHJpbmddPSciJyxkbltobi5SZWFkYWJsZU9iamVjdF09Il0iO2xldCBnbj1bXTtmb3IobGV0IHQ9MCxlPU9iamVjdC5lbnRyaWVzKGhuKTt0PGUubGVuZ3RoO3QrKyl7bGV0IHI9ZVt0XSxuPXJbMF0saT1yWzFdOyJudW1iZXIiPT10eXBlb2YgaSYmKGduW2ldPSJwcm9jZXNzIituKX1mdW5jdGlvbiB5bih0KXtyZXR1cm4gdC5yZXBsYWNlKGZuLChmdW5jdGlvbih0KXtsZXQgZT1jblt0XTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/ZToiXFx1Iit0LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDQsIjAiKX0pKX1mdW5jdGlvbiB2bih0KXtyZXR1cm4nIicreW4odCkrJyInfWZ1bmN0aW9uIGJuKHQsZSl7bGV0IHI9dC5yZWFkKGUpO3JldHVybiBudWxsPT09cj9uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxyKXtsZXQgbj1mdW5jdGlvbigpe3JldHVybiBlKG51bGwpfTt0Lm9uY2UoImVuZCIsbiksdC5vbmNlKCJlcnJvciIsciksdC5vbmNlKCJyZWFkYWJsZSIsKGZ1bmN0aW9uKCl7dC5yZW1vdmVMaXN0ZW5lcigiZW5kIixuKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsciksZSh0LnJlYWQoKSl9KSl9KSk6UHJvbWlzZS5yZXNvbHZlKHIpfWZ1bmN0aW9uIG1uKHQpe3JldHVybiB0LnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBsbih0KT09PWhuLlByb21pc2U/bW4odCk6dH0pKX1sZXQgd249ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLHIsbixpKXt2b2lkIDA9PT1pJiYoaT0hMSk7bGV0IG89dC5jYWxsKHRoaXMpfHx0aGlzO28uY3ljbGU9aSxvLnN0YWNrPVtdLG8uZGVwdGg9MCxvLnB1c2hDYWxsZWQ9ITEsby5lbmQ9ITEsby5pc1JlYWRpbmc9ITEsby5yZWFkTW9yZT0hMTtsZXQgcz10eXBlb2YgbjtyZXR1cm4ic3RyaW5nIiE9PXMmJiJudW1iZXIiIT09c3x8KG8uZ2FwPU51bWJlci5pc0Zpbml0ZShuKT8iICIucmVwZWF0KG4pOm4pLE9iamVjdC5hc3NpZ24obyx7dmlzaXRlZDppP25ldyBXZWFrTWFwOm5ldyBXZWFrU2V0LHJlcGxhY2VyRnVuY3Rpb246ciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZyLHJlcGxhY2VyQXJyYXk6QXJyYXkuaXNBcnJheShyKSYmcn0pLHIgaW5zdGFuY2VvZiBGdW5jdGlvbiYmKG8ucmVwbGFjZXJGdW5jdGlvbj1yKSxBcnJheS5pc0FycmF5KHIpJiYoby5yZXBsYWNlckFycmF5PXIpLG8uYWRkVG9TdGFjayhlKSxvfXJldHVybiBmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9dW4odCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihyLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgcil9KGUsdCksZS5wcm90b3R5cGUuY3ljbGVyPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcy52aXNpdGVkLmdldChlKTtpZihyKXJldHVybnskcmVmOnJ9O2xldCBuPXRoaXMucGF0aCgpO3JldHVybiB2b2lkIDAhPT10JiZuLnB1c2godCksbj1uLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIlsiKyhOdW1iZXIuaXNJbnRlZ2VyKHQpP3Q6dm4odCkpKyJdIn0pKSx0aGlzLnZpc2l0ZWQuc2V0KGUsbi5sZW5ndGg/IiQiK24uam9pbigiIik6IiQiKSxlfSxlLnByb3RvdHlwZS5hZGRUb1N0YWNrPWZ1bmN0aW9uKHQsZSxyLG4pe2xldCBpLG8scz10aGlzLGE9dDt0aGlzLnJlcGxhY2VyRnVuY3Rpb24mJihhPXRoaXMucmVwbGFjZXJGdW5jdGlvbihlfHxyLGEsdGhpcykpLGEmJmEudG9KU09OIGluc3RhbmNlb2YgRnVuY3Rpb24mJihhPWEudG9KU09OKCkpLChhIGluc3RhbmNlb2YgRnVuY3Rpb258fCJzeW1ib2wiPT10eXBlb2YgdCkmJihhPXZvaWQgMCksdm9pZCAwIT09ZSYmdGhpcy5yZXBsYWNlckFycmF5JiYodGhpcy5yZXBsYWNlckFycmF5LmluY2x1ZGVzKGUpfHwoYT12b2lkIDApKTtsZXQgdT1sbihhKTtpZigobiYmbi50eXBlPT09aG4uQXJyYXl8fHZvaWQgMCE9PWEpJiZ1IT09aG4uUHJvbWlzZSYmKG4mJiFuLmZpcnN0JiZ0aGlzLl9wdXNoKCIsIiksbiYmKG4uZmlyc3Q9ITEpKSx2b2lkIDAhPT1hJiZ1IT09aG4uUHJvbWlzZSYmZSYmKHRoaXMuZ2FwP3RoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkrJyInK3luKGUpKyciOiAnKTp0aGlzLl9wdXNoKCciJyt5bihlKSsnIjonKSksdSE9PWhuLlByaW1pdGl2ZSlpZih0aGlzLmN5Y2xlKWE9dGhpcy5jeWNsZXIoZXx8cixhKSx1PWxuKGEpO2Vsc2V7aWYodGhpcy52aXNpdGVkLmhhcyhhKSl0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcigiQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTiIpLHtyZWFsVmFsdWU6YSxrZXk6ZXx8cn0pO3RoaXMudmlzaXRlZC5hZGQoYSl9IWUmJnI+LTEmJnRoaXMuZGVwdGgmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKTtsZXQgaD1wblt1XTtoJiZ0aGlzLl9wdXNoKGgpO2xldCBmPXtrZXk6ZSxpbmRleDpyLHR5cGU6dSxwYXJlbnQ6bix2YWx1ZTphLGZpcnN0OiEwfTtyZXR1cm4gdT09PWhuLk9iamVjdD8odGhpcy5kZXB0aCs9MSxmLnVucmVhZD1PYmplY3Qua2V5cyhhKSxmLmlzRW1wdHk9IWYudW5yZWFkLmxlbmd0aCk6dT09PWhuLkFycmF5Pyh0aGlzLmRlcHRoKz0xLGYudW5yZWFkPWEubGVuZ3RoLGYuYXJyYXlMZW5ndGg9Zi51bnJlYWQsZi5pc0VtcHR5PSFmLnVucmVhZCk6dSE9PWhuLlJlYWRhYmxlU3RyaW5nJiZ1IT09aG4uUmVhZGFibGVPYmplY3R8fCh0aGlzLmRlcHRoKz0xLGEucmVhZGFibGVFbmRlZHx8KG51bGw9PT0oaT1hLl9yZWFkYWJsZVN0YXRlKXx8dm9pZCAwPT09aT92b2lkIDA6aS5lbmRFbWl0dGVkKT90aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBoYXMgZW5kZWQgYmVmb3JlIGl0IHdhcyBzZXJpYWxpemVkLiBBbGwgc3RyZWFtIGRhdGEgaGF2ZSBiZWVuIGxvc3QiKSxhLGV8fHIpOihhLnJlYWRhYmxlRmxvd2luZ3x8KG51bGw9PT0obz1hLl9yZWFkYWJsZVN0YXRlKXx8dm9pZCAwPT09bz92b2lkIDA6by5mbG93aW5nKSkmJihhLnBhdXNlKCksdGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJSZWFkYWJsZSBTdHJlYW0gaXMgaW4gZmxvd2luZyBtb2RlLCBkYXRhIG1heSBoYXZlIGJlZW4gbG9zdC4gVHJ5aW5nIHRvIHBhdXNlIHN0cmVhbS4iKSxhLGV8fHIpKSxmLnJlYWRDb3VudD0wLGEub25jZSgiZW5kIiwoZnVuY3Rpb24oKXtmLmVuZD0hMCxzLl9fcmVhZCgpfSkpLGEub25jZSgiZXJyb3IiLChmdW5jdGlvbih0KXtzLmVycm9yPSEwLHMuZW1pdCgiZXJyb3IiLHQpfSkpKSx0aGlzLnN0YWNrLnVuc2hpZnQoZiksZn0sZS5wcm90b3R5cGUucmVtb3ZlRnJvbVN0YWNrPWZ1bmN0aW9uKHQpe2xldCBlPXQudHlwZSxyPWU9PT1obi5PYmplY3R8fGU9PT1obi5BcnJheXx8ZT09PWhuLlJlYWRhYmxlU3RyaW5nfHxlPT09aG4uUmVhZGFibGVPYmplY3Q7ZSE9PWhuLlByaW1pdGl2ZSYmKHRoaXMuY3ljbGV8fHRoaXMudmlzaXRlZC5kZWxldGUodC52YWx1ZSksciYmKHRoaXMuZGVwdGgtPTEpKTtsZXQgbj1kbltlXTtyJiYhdC5pc0VtcHR5JiZ0aGlzLmdhcCYmdGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSksbiYmdGhpcy5fcHVzaChuKTtsZXQgaT10aGlzLnN0YWNrLmluZGV4T2YodCk7dGhpcy5zdGFjay5zcGxpY2UoaSwxKX0sZS5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSEwLHRoaXMucHVzaCh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlT2JqZWN0PWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIGJuKHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24oZSl7bnVsbCE9PWUmJih0LmZpcnN0fHxyLl9wdXNoKCIsIiksdC5maXJzdD0hMSxyLmFkZFRvU3RhY2soZSx2b2lkIDAsdC5yZWFkQ291bnQpLHQucmVhZENvdW50Kz0xKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc09iamVjdD1mdW5jdGlvbih0KXtpZighdC51bnJlYWQubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlRnJvbVN0YWNrKHQpO2xldCBlPXQudW5yZWFkLnNoaWZ0KCkscj10LnZhbHVlW2VdO3RoaXMuYWRkVG9TdGFjayhyLGUsdm9pZCAwLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzQXJyYXk9ZnVuY3Rpb24odCl7bGV0IGU9dC51bnJlYWQ7aWYoIWUpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IHI9dC5hcnJheUxlbmd0aC1lLG49dC52YWx1ZVtyXTt0LnVucmVhZC09MSx0aGlzLmFkZFRvU3RhY2sobix2b2lkIDAscix0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1ByaW1pdGl2ZT1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT10LnZhbHVlKXtsZXQgZSxyPXR5cGVvZiB0LnZhbHVlO3N3aXRjaChyKXtjYXNlInN0cmluZyI6ZT12bih0LnZhbHVlKTticmVhaztjYXNlIm51bWJlciI6ZT1OdW1iZXIuaXNGaW5pdGUodC52YWx1ZSk/U3RyaW5nKHQudmFsdWUpOiJudWxsIjticmVhaztjYXNlImJvb2xlYW4iOmU9U3RyaW5nKHQudmFsdWUpO2JyZWFrO2Nhc2Uib2JqZWN0Ijp0LnZhbHVlfHwoZT0ibnVsbCIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoJ1Vua25vd24gdHlwZSAiJytyKyciLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKSx7dmFsdWU6dC52YWx1ZX0pfXRoaXMuX3B1c2goZSl9ZWxzZSF0aGlzLnN0YWNrWzFdfHx0aGlzLnN0YWNrWzFdLnR5cGUhPT1obi5BcnJheSYmdGhpcy5zdGFja1sxXS50eXBlIT09aG4uUmVhZGFibGVPYmplY3Q/dC5hZGRTZXBhcmF0b3JBZnRlckVuZD0hMTp0aGlzLl9wdXNoKCJudWxsIik7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NSZWFkYWJsZVN0cmluZz1mdW5jdGlvbih0LGUpe2xldCByPXRoaXM7aWYoIXQuZW5kKXJldHVybiBibih0LnZhbHVlLGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3QmJnIuX3B1c2goeW4odC50b1N0cmluZygpKSl9KSk7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NQcm9taXNlPWZ1bmN0aW9uKHQpe2xldCBlPXRoaXM7cmV0dXJuIG1uKHQudmFsdWUpLnRoZW4oKGZ1bmN0aW9uKHIpe2UucmVtb3ZlRnJvbVN0YWNrKHQpLGUuYWRkVG9TdGFjayhyLHQua2V5LHQuaW5kZXgsdC5wYXJlbnQpfSkpfSxlLnByb3RvdHlwZS5wcm9jZXNzU3RhY2tUb3BJdGVtPWZ1bmN0aW9uKHQpe2xldCBlLHI9dGhpcyxuPXRoaXMuc3RhY2tbMF07aWYoIW58fHRoaXMuZXJyb3IpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3RyeXtlPXRoaXNbZ25bbi50eXBlXV0obix0KX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKS50aGVuKChmdW5jdGlvbigpezA9PT1yLnN0YWNrLmxlbmd0aCYmKHIuZW5kPSEwLHIuX3B1c2gobnVsbCkpfSkpfSxlLnByb3RvdHlwZS5fX3JlYWQ9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztpZighdGhpcy5pc1JlYWRpbmcmJiF0aGlzLmVycm9yKXJldHVybiB0aGlzLmlzUmVhZGluZz0hMCx0aGlzLnJlYWRNb3JlPSExLHRoaXMucHJvY2Vzc1N0YWNrVG9wSXRlbSh0KS50aGVuKChmdW5jdGlvbigpeyFlLmVuZCYmIWUuZXJyb3ImJihlLnJlYWRNb3JlfHwhZS5wdXNoQ2FsbGVkKT9ucigoZnVuY3Rpb24oKXtlLmlzUmVhZGluZz0hMSxlLl9fcmVhZCgpfSkpOmUuaXNSZWFkaW5nPSExfSkpLmNhdGNoKChmdW5jdGlvbih0KXtlLmVycm9yPSEwLGUuZW1pdCgiZXJyb3IiLHQpfSkpO3RoaXMucmVhZE1vcmU9ITB9LGUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMucHVzaENhbGxlZD0hMSx0aGlzLl9fcmVhZCh0KX0sZS5wcm90b3R5cGUucGF0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YWNrLm1hcCgoZnVuY3Rpb24odCl7bGV0IGU9dC5rZXkscj10LmluZGV4O3JldHVybiBlfHxyfSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHR8fHQ+LTF9KSkucmV2ZXJzZSgpfSxlfSh1ZSk7dmFyIF9uPUFycmF5LmlzQXJyYXksU249Im9iamVjdCI9PXR5cGVvZiBXZSYmV2UmJldlLk9iamVjdD09PU9iamVjdCYmV2UsRW49Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixrbj1Tbnx8RW58fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksUm49a24uU3ltYm9sLEFuPVJuLFRuPU9iamVjdC5wcm90b3R5cGUsT249VG4uaGFzT3duUHJvcGVydHksam49VG4udG9TdHJpbmcsTG49QW4/QW4udG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBDbj1mdW5jdGlvbih0KXt2YXIgZT1Pbi5jYWxsKHQsTG4pLHI9dFtMbl07dHJ5e3RbTG5dPXZvaWQgMDt2YXIgbj0hMH1jYXRjaCh0KXt9dmFyIGk9am4uY2FsbCh0KTtyZXR1cm4gbiYmKGU/dFtMbl09cjpkZWxldGUgdFtMbl0pLGl9LFBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIE1uPUNuLEJuPWZ1bmN0aW9uKHQpe3JldHVybiBQbi5jYWxsKHQpfSx4bj1Sbj9Sbi50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIFVuPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOnhuJiZ4biBpbiBPYmplY3QodCk/TW4odCk6Qm4odCl9O3ZhciBJbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fSxEbj1VbixObj1Jbjt2YXIgRm49ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxObih0KSYmIltvYmplY3QgU3ltYm9sXSI9PURuKHQpfSx6bj1fbixxbj1GbixZbj0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxXbj0vXlx3KiQvO3ZhciAkbj1mdW5jdGlvbih0LGUpe2lmKHpuKHQpKXJldHVybiExO3ZhciByPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPXImJiJzeW1ib2wiIT1yJiYiYm9vbGVhbiIhPXImJm51bGwhPXQmJiFxbih0KSl8fChXbi50ZXN0KHQpfHwhWW4udGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSkpfTt2YXIgR249ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9LEpuPVVuLEhuPUduO3ZhciBWbixLbj1mdW5jdGlvbih0KXtpZighSG4odCkpcmV0dXJuITE7dmFyIGU9Sm4odCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfSxabj1rblsiX19jb3JlLWpzX3NoYXJlZF9fIl0sUW49KFZuPS9bXi5dKyQvLmV4ZWMoWm4mJlpuLmtleXMmJlpuLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIitWbjoiIjt2YXIgWG49ZnVuY3Rpb24odCl7cmV0dXJuISFRbiYmUW4gaW4gdH0sdGk9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBlaT1LbixyaT1YbixuaT1HbixpaT1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIHRpLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxvaT0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxzaT1GdW5jdGlvbi5wcm90b3R5cGUsYWk9T2JqZWN0LnByb3RvdHlwZSx1aT1zaS50b1N0cmluZyxoaT1haS5oYXNPd25Qcm9wZXJ0eSxmaT1SZWdFeHAoIl4iK3VpLmNhbGwoaGkpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBjaT1mdW5jdGlvbih0KXtyZXR1cm4hKCFuaSh0KXx8cmkodCkpJiYoZWkodCk/Zmk6b2kpLnRlc3QoaWkodCkpfSxsaT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfTt2YXIgcGk9ZnVuY3Rpb24odCxlKXt2YXIgcj1saSh0LGUpO3JldHVybiBjaShyKT9yOnZvaWQgMH0sZGk9cGkoT2JqZWN0LCJjcmVhdGUiKSxnaT1kaTt2YXIgeWk9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPWdpP2dpKG51bGwpOnt9LHRoaXMuc2l6ZT0wfTt2YXIgdmk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LGJpPWRpLG1pPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHdpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoYmkpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gbWkuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxfaT1kaSxTaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBFaT1kaTt2YXIga2k9eWksUmk9dmksQWk9d2ksVGk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gX2k/dm9pZCAwIT09ZVt0XTpTaS5jYWxsKGUsdCl9LE9pPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1FaSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBqaSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1qaS5wcm90b3R5cGUuY2xlYXI9a2ksamkucHJvdG90eXBlLmRlbGV0ZT1SaSxqaS5wcm90b3R5cGUuZ2V0PUFpLGppLnByb3RvdHlwZS5oYXM9VGksamkucHJvdG90eXBlLnNldD1PaTt2YXIgTGk9amk7dmFyIENpPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIFBpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfTt2YXIgTWk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5sZW5ndGg7ci0tOylpZihQaSh0W3JdWzBdLGUpKXJldHVybiByO3JldHVybi0xfSxCaT1NaSx4aT1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBVaT1NaTt2YXIgSWk9TWk7dmFyIERpPU1pO3ZhciBOaT1DaSxGaT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9QmkoZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6eGkuY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfSx6aT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9VWkoZSx0KTtyZXR1cm4gcjwwP3ZvaWQgMDplW3JdWzFdfSxxaT1mdW5jdGlvbih0KXtyZXR1cm4gSWkodGhpcy5fX2RhdGFfXyx0KT4tMX0sWWk9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG49RGkocix0KTtyZXR1cm4gbjwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW25dWzFdPWUsdGhpc307ZnVuY3Rpb24gV2kodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19V2kucHJvdG90eXBlLmNsZWFyPU5pLFdpLnByb3RvdHlwZS5kZWxldGU9RmksV2kucHJvdG90eXBlLmdldD16aSxXaS5wcm90b3R5cGUuaGFzPXFpLFdpLnByb3RvdHlwZS5zZXQ9WWk7dmFyICRpPVdpLEdpPXBpKGtuLCJNYXAiKSxKaT1MaSxIaT0kaSxWaT1HaTt2YXIgS2k9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH07dmFyIFppPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fX2RhdGFfXztyZXR1cm4gS2koZSk/clsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpyLm1hcH0sUWk9Wmk7dmFyIFhpPVppO3ZhciB0bz1aaTt2YXIgZW89Wmk7dmFyIHJvPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgSmksbWFwOm5ldyhWaXx8SGkpLHN0cmluZzpuZXcgSml9fSxubz1mdW5jdGlvbih0KXt2YXIgZT1RaSh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxpbz1mdW5jdGlvbih0KXtyZXR1cm4gWGkodGhpcyx0KS5nZXQodCl9LG9vPWZ1bmN0aW9uKHQpe3JldHVybiB0byh0aGlzLHQpLmhhcyh0KX0sc289ZnVuY3Rpb24odCxlKXt2YXIgcj1lbyh0aGlzLHQpLG49ci5zaXplO3JldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZSs9ci5zaXplPT1uPzA6MSx0aGlzfTtmdW5jdGlvbiBhbyh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1hby5wcm90b3R5cGUuY2xlYXI9cm8sYW8ucHJvdG90eXBlLmRlbGV0ZT1ubyxhby5wcm90b3R5cGUuZ2V0PWlvLGFvLnByb3RvdHlwZS5oYXM9b28sYW8ucHJvdG90eXBlLnNldD1zbzt2YXIgdW89YW87ZnVuY3Rpb24gaG8odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciByPWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMsbik6blswXSxvPXIuY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBzPXQuYXBwbHkodGhpcyxuKTtyZXR1cm4gci5jYWNoZT1vLnNldChpLHMpfHxvLHN9O3JldHVybiByLmNhY2hlPW5ldyhoby5DYWNoZXx8dW8pLHJ9aG8uQ2FjaGU9dW87dmFyIGZvPWhvO3ZhciBjbz0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxsbz0vXFwoXFwpPy9nLHBvPWZ1bmN0aW9uKHQpe3ZhciBlPWZvKHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1yLnNpemUmJnIuY2xlYXIoKSx0fSkpLHI9ZS5jYWNoZTtyZXR1cm4gZX0oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoY28sKGZ1bmN0aW9uKHQscixuLGkpe2UucHVzaChuP2kucmVwbGFjZShsbywiJDEiKTpyfHx0KX0pKSxlfSkpO3ZhciBnbz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFycmF5KG4pOysrcjxuOylpW3JdPWUodFtyXSxyLHQpO3JldHVybiBpfSx5bz1fbix2bz1Gbixibz1Sbj9Sbi5wcm90b3R5cGU6dm9pZCAwLG1vPWJvP2JvLnRvU3RyaW5nOnZvaWQgMDt2YXIgd289ZnVuY3Rpb24gdChlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYoeW8oZSkpcmV0dXJuIGdvKGUsdCkrIiI7aWYodm8oZSkpcmV0dXJuIG1vP21vLmNhbGwoZSk6IiI7dmFyIHI9ZSsiIjtyZXR1cm4iMCI9PXImJjEvZT09LUluZmluaXR5PyItMCI6cn0sX289d287dmFyIFNvPV9uLEVvPSRuLGtvPXBvLFJvPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOl9vKHQpfTt2YXIgQW89Rm47dmFyIFRvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFNvKHQpP3Q6RW8odCxlKT9bdF06a28oUm8odCkpfSxPbz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fEFvKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1JbmZpbml0eT8iLTAiOmV9O3ZhciBqbz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49KGU9VG8oZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8bjspdD10W09vKGVbcisrXSldO3JldHVybiByJiZyPT1uP3Q6dm9pZCAwfTt2YXIgTG89ZnVuY3Rpb24odCxlLHIpe3ZhciBuPW51bGw9PXQ/dm9pZCAwOmpvKHQsZSk7cmV0dXJuIHZvaWQgMD09PW4/cjpufSxDbz1VbixQbz1Jbjt2YXIgTW89ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fHxQbyh0KSYmIltvYmplY3QgTnVtYmVyXSI9PUNvKHQpfTtmdW5jdGlvbiBCbyh0KXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiB4byh0KXtyZXR1cm4hKCFCbyh0KXx8IiI9PT10KX1mdW5jdGlvbiBVbyh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIElvKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIERvKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIE5vKHQpe3JldHVybiEoIUJvKHQpfHwiIiE9PXQpfWZ1bmN0aW9uIEZvKHQpe3JldHVybiEhSW8odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bGxdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe2lmKERvKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0odCl8fCghIU5vKHQpfHwhIWZ1bmN0aW9uKHQpe3JldHVybiEhVW8odCkmJjA9PT10Lmxlbmd0aH0odCkpKSl9ZnVuY3Rpb24gem8oKXtsZXQgdCxlLHI9bmV3IFByb21pc2UoKGZ1bmN0aW9uKCl7dD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV19KSk7cmV0dXJuIHIucmVzb2x2ZT10LHIucmVqZWN0PWUscn1sZXQgV0pzb25TdHJlYW09e3BhcnNlOmFzeW5jIGZ1bmN0aW9uKHQpe2lmKCF4byh0KSlyZXR1cm57fTtsZXQgZT17fTt0cnl7ZT1KU09OLnBhcnNlKHQpfWNhdGNoKHQpe2U9e319cmV0dXJuIGV9LHBhcnNlQnlTdHJlYW06ZnVuY3Rpb24odCl7bGV0IGU9e307aWYoIm51bGwiPT09dClyZXR1cm4gbnVsbDtpZigiIj09PXQpcmV0dXJue307bGV0IHI9Il9fc3lzdGVtX18iLG49YHsiJHtyfSI6JHt0fX1gLGk9em8oKSxvPWNyKG4pLHM9YW4ucGFyc2UoIiQqIik7cmV0dXJuIHMub24oImRhdGEiLChmdW5jdGlvbih0KXtlW3Qua2V5XT10LnZhbHVlfSkpLHMub24oImVuZCIsKGZ1bmN0aW9uKCl7bGV0IHQ9TG8oZSxyKTtpLnJlc29sdmUodCl9KSkscy5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtpLnJlamVjdCh0KX0pKSxvLnBpcGUocyksaX0sY3JlYXRlUGFyc2VTdHJlYW06ZnVuY3Rpb24odCl7cmV0dXJuIHhvKHQpfHxmdW5jdGlvbih0KXtyZXR1cm4hKCFVbyh0KXx8MD09PXQubGVuZ3RofHwxPT09dC5sZW5ndGgmJkZvKHRbMF0pKX0odCl8fCh0PSIkKiIpLGFuLnBhcnNlKHQpfSxzdHJpbmdpZnk6YXN5bmMgZnVuY3Rpb24odCl7aWYoSW8odCkpcmV0dXJuIiI7bGV0IGU9IiI7dHJ5e2U9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2godCl7ZT0iIn1yZXR1cm4gZX0sc3RyaW5naWZ5QnlTdHJlYW06ZnVuY3Rpb24odCl7bGV0IGU9IiI7aWYoSW8odCkpcmV0dXJuIiI7aWYobnVsbD09PXQpcmV0dXJuIm51bGwiO2lmKE5vKHQpKXJldHVybiciIic7aWYoTW8odCkpcmV0dXJuYCR7dH1gO2lmKEJvKHQpKXJldHVybmAiJHt0fSJgO2xldCByPXpvKCksbj1uZXcgd24odCxudWxsLG51bGwsITEpO3JldHVybiBuLm9uKCJkYXRhIiwoZnVuY3Rpb24odCl7ZSs9dH0pKSxuLm9uKCJlbmQiLChmdW5jdGlvbigpe3IucmVzb2x2ZShlKX0pKSxuLm9uKCJlcnJvciIsKGZ1bmN0aW9uKHQpe3IucmVqZWN0KHQpfSkpLHJ9LGNyZWF0ZVN0cmluZ2lmeVN0cmVhbTpmdW5jdGlvbih0KXtpZighRG8odCkmJiFVbyh0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IG9iamVjdCBvciBhcnJheSIpO3JldHVybiBuZXcgd24odCxudWxsLG51bGwsITEpfX07CgpsZXQgaW5zdGFuY2UgPSBudWxsCmZ1bmN0aW9uIGluaXQoaW5wdXQpewoKICAgIC8vaW5pdAogICAgbGV0IHIKICAgIAogICAgICAgIHIgPSBXSnNvblN0cmVhbSguLi5pbnB1dCkKICAgICAgICAKCiAgICAvL29uCiAgICAKCiAgICAvL3NhdmUKICAgIGluc3RhbmNlID0gcgoKfQoKZnVuY3Rpb24gc2VuZE1lc3NhZ2UoZGF0YSkgewogICAgCiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShkYXRhKQogICAgICAgIAp9Cgphc3luYyBmdW5jdGlvbiBydW4oZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciBydW4nLGRhdGEpCgogICAgLy9tb2RlCiAgICBsZXQgbW9kZSA9IGRhdGEubW9kZQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgIT09ICdpbml0JyAmJiBtb2RlICE9PSAnY2FsbCcpewogICAgICAgIHJldHVybgogICAgfQoKICAgIC8vaW5pdAogICAgaWYobW9kZSA9PT0gJ2luaXQnKXsKICAgICAgICAKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL3R5cGUKICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGUKCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAogICAgCiAgICAgICAgICAgIC8vaW5zdGFuY2UKICAgICAgICAgICAgaWYodHlwZSA9PT0gJ2Z1bmN0aW9uJyl7CiAgICAgICAgICAgICAgICBpbml0KC4uLmlucHV0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZSA9PT0gJ29iamVjdCcpewogICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBXSnNvblN0cmVhbQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgIAogICAgICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgICAgICBtb2RlOiAnZW1pdCcsCiAgICAgICAgICAgICAgICBldk5hbWU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtc2c6IGVyciwKICAgICAgICAgICAgfQogICAgICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgICAgIH0KICAgICAgICAgICAgCiAgICB9CgogICAgLy9jaGVjawogICAgaWYobW9kZSA9PT0gJ2NhbGwnKXsKICAgICAgICBsZXQgc3RhdGUgPSAnJwogICAgICAgIGxldCBtc2cgPSBudWxsCgogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vZnVuCiAgICAgICAgICAgIGxldCBmdW4gPSBpbnN0YW5jZVtkYXRhLmZ1bl0KCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAoKICAgICAgICAgICAgLy9leGVjCiAgICAgICAgICAgIGF3YWl0IGZ1biguLi5pbnB1dCkKICAgICAgICAgICAgICAgIC50aGVuKChzdWMpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nc3VjY2VzcycKICAgICAgICAgICAgICAgICAgICBtc2c9c3VjCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nZXJyb3InCiAgICAgICAgICAgICAgICAgICAgbXNnPWVycgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgICAgIHN0YXRlID0gJ2Vycm9yJwogICAgICAgICAgICBtc2cgPSBlcnIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgIG1vZGU6ICdyZXR1cm4nLAogICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgZnVuOiBkYXRhLmZ1biwKICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgIG1zZywKICAgICAgICB9CiAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgIH0KCn0KCmZ1bmN0aW9uIHJlY3ZNZXNzYWdlKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcmVjdjonLCBkYXRhKQoKICAgIC8vZGF0YVJlY3YKICAgIGxldCBkYXRhUmVjdiA9IGRhdGEKCiAgICAvL3J1bgogICAgcnVuKGRhdGFSZWN2KQoKfQoKCiAgICAgICAgc2VsZi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICByZWN2TWVzc2FnZShlLmRhdGEpCiAgICAgICAgfQogICAgICAgIAoK");function b(){let b=l(),c=function(l){try{let Z=new Blob([l]),d=window.URL||window.webkitURL;return new Worker(d.createObjectURL(Z))}catch(l){G(l)}}(m);if(!c)return G("invalid worker"),null;function G(l){b.emit("error",l)}return c.onmessage=function(l){!function(l){let Z=l,d=Z.mode;"emit"!==d&&"return"!==d||("emit"===d&&b.emit(Z.evName,Z.msg),"return"===d&&b.emit(Z.id,Z))}(l.data)},c.onerror=G,function(){let l={mode:"init",type:"object",input:[...arguments]};c.postMessage(l)}([...arguments]),b.stringify=function(){let l=Z(),m=d(),G={mode:"call",id:m,fun:"stringify",input:[...arguments]};return c.postMessage(G),b.once(m,(Z=>{"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},b.parse=function(){let l=Z(),m=d(),G={mode:"call",id:m,fun:"parse",input:[...arguments]};return c.postMessage(G),b.once(m,(Z=>{"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l},b.terminate=function(){c?(c.terminate(),c=void 0):G("worker has been terminated")},b}let c={stringify:async function(){let l=[...arguments],Z=b();return await Z.stringify(...l).finally((()=>{Z.terminate()}))},parse:async function(){let l=[...arguments],Z=b();return await Z.parse(...l).finally((()=>{Z.terminate()}))}};L=l();for(let l in c){let Z=c[l];L[l]=Z}}(),L}()}({get exports(){return m},set exports(l){m=l}});var b=m;let c;return c="undefined"!=typeof window&&void 0!==window.document?b:d,c}));
|