w-gis 1.0.12 → 1.0.13
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/README.md +1 -1
- package/dist/w-gis.umd.js +2 -2
- package/dist/w-gis.umd.js.map +1 -1
- package/docs/-_class.mjs.html +1 -1
- package/docs/convertCoordinate.mjs.html +1 -1
- package/docs/examples/ex-getCenterOfMassMultiPolygon.html +1 -1
- package/docs/examples/ex-getCentroidMultiPolygon.html +1 -1
- package/docs/index.html +1 -1
- package/docs/w-gis.html +1 -1
- package/g-getCenterOfMassMultiPolygon.mjs +3 -3
- package/g-getCentroidMultiPolygon.mjs +3 -3
- package/package.json +2 -1
- package/src/WGis.mjs +18 -585
- package/src/{convertTurfCode.mjs → _convertTurfCode.mjs} +5 -5
- package/src/{importTurfBrowser.mjs → _importTurfBrowser.mjs} +1 -4
- package/src/{importTurfNode.mjs → _importTurfNode.mjs} +0 -0
- package/src/_turfCoreBrowser.mjs +1 -0
- package/src/calcContours.mjs +267 -0
- package/src/clipMultiPolygon.mjs +15 -0
- package/src/distilMultiPolygon.mjs +30 -0
- package/src/fixGeometryMultiPolygon.mjs +52 -0
- package/src/getArea.mjs +20 -0
- package/src/getCenterOfMassMultiPolygon.mjs +24 -0
- package/src/getCentroidMultiPolygon.mjs +24 -0
- package/src/getTurf.mjs +32 -0
- package/src/intersectMultiPolygon.mjs +21 -0
- package/src/invCoordMultiPolygon.mjs +22 -0
- package/src/invCoordPolygon.mjs +24 -0
- package/src/isPointInPolygon.mjs +21 -0
- package/src/maskMultiPolygon.mjs +21 -0
- package/src/parseGeometryCollection.mjs +27 -0
- package/src/simplifyMultiPolygon.mjs +41 -0
- package/src/splineMultiPolygon.mjs +38 -0
- package/src/toMultiPolygon.mjs +49 -0
- package/toolg/gPackageIndex.mjs +46 -0
- package/src/importTurfBrowser.json +0 -1
package/dist/w-gis.umd.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* w-gis v1.0.
|
|
2
|
+
* w-gis v1.0.13
|
|
3
3
|
* (c) 2018-2021 yuda-lyu(semisphere)
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
!function(l,d){"object"==typeof exports&&"undefined"!=typeof module?module.exports=d(require("@turf/turf")):"function"==typeof define&&define.amd?define(["@turf/turf"],d):(l="undefined"!=typeof globalThis?globalThis:l||self)["w-gis"]=d(l["@turf/turf"])}(this,(function(l){"use strict";function d(l){if(l&&l.__esModule)return l;var d=Object.create(null);return l&&Object.keys(l).forEach((function(b){if("default"!==b){var Z=Object.getOwnPropertyDescriptor(l,b);Object.defineProperty(d,b,Z.get?Z:{enumerable:!0,get:function(){return l[b]}})}})),d.default=l,Object.freeze(d)}var b=d(l);function Z(l,d,b){return d in l?Object.defineProperty(l,d,{value:b,enumerable:!0,configurable:!0,writable:!0}):l[d]=b,l}function c(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}function m(l,d){if(l){if("string"==typeof l)return c(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);return"Object"===b&&l.constructor&&(b=l.constructor.name),"Map"===b||"Set"===b?Array.from(l):"Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b)?c(l,d):void 0}}function X(l){return function(l){if(Array.isArray(l))return c(l)}(l)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(l)||m(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.")}()}var G=function(l,d){for(var b=-1,Z=null==l?0:l.length;++b<Z&&!1!==d(l[b],b,l););return l};var W=function(l){return function(d,b,Z){for(var c=-1,m=Object(d),X=Z(d),G=X.length;G--;){var W=X[l?G:++c];if(!1===b(m[W],W,m))break}return d}},u=W();var a=function(l,d){for(var b=-1,Z=Array(l);++b<l;)Z[b]=d(b);return Z};function h(l){return h="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},h(l)}var s="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function V(l){if(l.__esModule)return l;var d=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(l).forEach((function(b){var Z=Object.getOwnPropertyDescriptor(l,b);Object.defineProperty(d,b,Z.get?Z:{enumerable:!0,get:function(){return l[b]}})})),d}function y(l){var d={exports:{}};return l(d,d.exports),d.exports}var p="object"==h(s)&&s&&s.Object===Object&&s,t="object"==("undefined"==typeof self?"undefined":h(self))&&self&&self.Object===Object&&self,n=p||t||Function("return this")(),i=n.Symbol,R=Object.prototype,o=R.hasOwnProperty,L=R.toString,K=i?i.toStringTag:void 0;var H=function(l){var d=o.call(l,K),b=l[K];try{l[K]=void 0;var Z=!0}catch(l){}var c=L.call(l);return Z&&(d?l[K]=b:delete l[K]),c},x=Object.prototype.toString;var S=function(l){return x.call(l)},Y=i?i.toStringTag:void 0;var e=function(l){return null==l?void 0===l?"[object Undefined]":"[object Null]":Y&&Y in Object(l)?H(l):S(l)};var J=function(l){return null!=l&&"object"==h(l)};var z=function(l){return J(l)&&"[object Arguments]"==e(l)},v=Object.prototype,T=v.hasOwnProperty,M=v.propertyIsEnumerable,C=z(function(){return arguments}())?z:function(l){return J(l)&&T.call(l,"callee")&&!M.call(l,"callee")},F=C,I=Array.isArray;var k=function(){return!1},N=y((function(l,d){var b=d&&!d.nodeType&&d,Z=b&&l&&!l.nodeType&&l,c=Z&&Z.exports===b?n.Buffer:void 0,m=(c?c.isBuffer:void 0)||k;l.exports=m})),g=/^(?:0|[1-9]\d*)$/;var P=function(l,d){var b=h(l);return!!(d=null==d?9007199254740991:d)&&("number"==b||"symbol"!=b&&g.test(l))&&l>-1&&l%1==0&&l<d};var B=function(l){return"number"==typeof l&&l>-1&&l%1==0&&l<=9007199254740991},w={};w["[object Float32Array]"]=w["[object Float64Array]"]=w["[object Int8Array]"]=w["[object Int16Array]"]=w["[object Int32Array]"]=w["[object Uint8Array]"]=w["[object Uint8ClampedArray]"]=w["[object Uint16Array]"]=w["[object Uint32Array]"]=!0,w["[object Arguments]"]=w["[object Array]"]=w["[object ArrayBuffer]"]=w["[object Boolean]"]=w["[object DataView]"]=w["[object Date]"]=w["[object Error]"]=w["[object Function]"]=w["[object Map]"]=w["[object Number]"]=w["[object Object]"]=w["[object RegExp]"]=w["[object Set]"]=w["[object String]"]=w["[object WeakMap]"]=!1;var U=function(l){return J(l)&&B(l.length)&&!!w[e(l)]};var r=function(l){return function(d){return l(d)}},Q=y((function(l,d){var b=d&&!d.nodeType&&d,Z=b&&l&&!l.nodeType&&l,c=Z&&Z.exports===b&&p.process,m=function(){try{var l=Z&&Z.require&&Z.require("util").types;return l||c&&c.binding&&c.binding("util")}catch(l){}}();l.exports=m})),j=Q&&Q.isTypedArray,f=j?r(j):U,E=Object.prototype.hasOwnProperty;var O=function(l,d){var b=I(l),Z=!b&&F(l),c=!b&&!Z&&N(l),m=!b&&!Z&&!c&&f(l),X=b||Z||c||m,G=X?a(l.length,String):[],W=G.length;for(var u in l)!d&&!E.call(l,u)||X&&("length"==u||c&&("offset"==u||"parent"==u)||m&&("buffer"==u||"byteLength"==u||"byteOffset"==u)||P(u,W))||G.push(u);return G},D=Object.prototype;var A=function(l){var d=l&&l.constructor;return l===("function"==typeof d&&d.prototype||D)};var _=function(l,d){return function(b){return l(d(b))}},q=_(Object.keys,Object),$=Object.prototype.hasOwnProperty;var ll=function(l){if(!A(l))return q(l);var d=[];for(var b in Object(l))$.call(l,b)&&"constructor"!=b&&d.push(b);return d};var dl=function(l){var d=h(l);return null!=l&&("object"==d||"function"==d)};var bl=function(l){if(!dl(l))return!1;var d=e(l);return"[object Function]"==d||"[object GeneratorFunction]"==d||"[object AsyncFunction]"==d||"[object Proxy]"==d};var Zl=function(l){return null!=l&&B(l.length)&&!bl(l)};var cl=function(l){return Zl(l)?O(l):ll(l)};var ml=function(l,d){return l&&u(l,d,cl)};var Xl=function(l,d){return function(b,Z){if(null==b)return b;if(!Zl(b))return l(b,Z);for(var c=b.length,m=d?c:-1,X=Object(b);(d?m--:++m<c)&&!1!==Z(X[m],m,X););return b}}(ml);var Gl=function(l){return l};var Wl=function(l){return"function"==typeof l?l:Gl};var ul=function(l,d){return(I(l)?G:Xl)(l,Wl(d))};var al=function(l,d){for(var b=-1,Z=null==l?0:l.length,c=Array(Z);++b<Z;)c[b]=d(l[b],b,l);return c};var hl=function(){this.__data__=[],this.size=0};var sl=function(l,d){return l===d||l!=l&&d!=d};var Vl=function(l,d){for(var b=l.length;b--;)if(sl(l[b][0],d))return b;return-1},yl=Array.prototype.splice;var pl=function(l){var d=this.__data__,b=Vl(d,l);return!(b<0)&&(b==d.length-1?d.pop():yl.call(d,b,1),--this.size,!0)};var tl=function(l){var d=this.__data__,b=Vl(d,l);return b<0?void 0:d[b][1]};var nl=function(l){return Vl(this.__data__,l)>-1};var il=function(l,d){var b=this.__data__,Z=Vl(b,l);return Z<0?(++this.size,b.push([l,d])):b[Z][1]=d,this};function Rl(l){var d=-1,b=null==l?0:l.length;for(this.clear();++d<b;){var Z=l[d];this.set(Z[0],Z[1])}}Rl.prototype.clear=hl,Rl.prototype.delete=pl,Rl.prototype.get=tl,Rl.prototype.has=nl,Rl.prototype.set=il;var ol=Rl;var Ll=function(){this.__data__=new ol,this.size=0};var Kl=function(l){var d=this.__data__,b=d.delete(l);return this.size=d.size,b};var Hl=function(l){return this.__data__.get(l)};var xl,Sl=function(l){return this.__data__.has(l)},Yl=n["__core-js_shared__"],el=(xl=/[^.]+$/.exec(Yl&&Yl.keys&&Yl.keys.IE_PROTO||""))?"Symbol(src)_1."+xl:"";var Jl=function(l){return!!el&&el in l},zl=Function.prototype.toString;var vl=function(l){if(null!=l){try{return zl.call(l)}catch(l){}try{return l+""}catch(l){}}return""},Tl=/^\[object .+?Constructor\]$/,Ml=Function.prototype,Cl=Object.prototype,Fl=Ml.toString,Il=Cl.hasOwnProperty,kl=RegExp("^"+Fl.call(Il).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");var Nl=function(l){return!(!dl(l)||Jl(l))&&(bl(l)?kl:Tl).test(vl(l))};var gl=function(l,d){return null==l?void 0:l[d]};var Pl=function(l,d){var b=gl(l,d);return Nl(b)?b:void 0},Bl=Pl(n,"Map"),wl=Pl(Object,"create");var Ul=function(){this.__data__=wl?wl(null):{},this.size=0};var rl=function(l){var d=this.has(l)&&delete this.__data__[l];return this.size-=d?1:0,d},Ql=Object.prototype.hasOwnProperty;var jl=function(l){var d=this.__data__;if(wl){var b=d[l];return"__lodash_hash_undefined__"===b?void 0:b}return Ql.call(d,l)?d[l]:void 0},fl=Object.prototype.hasOwnProperty;var El=function(l){var d=this.__data__;return wl?void 0!==d[l]:fl.call(d,l)};var Ol=function(l,d){var b=this.__data__;return this.size+=this.has(l)?0:1,b[l]=wl&&void 0===d?"__lodash_hash_undefined__":d,this};function Dl(l){var d=-1,b=null==l?0:l.length;for(this.clear();++d<b;){var Z=l[d];this.set(Z[0],Z[1])}}Dl.prototype.clear=Ul,Dl.prototype.delete=rl,Dl.prototype.get=jl,Dl.prototype.has=El,Dl.prototype.set=Ol;var Al=Dl;var _l=function(){this.size=0,this.__data__={hash:new Al,map:new(Bl||ol),string:new Al}};var ql=function(l){var d=h(l);return"string"==d||"number"==d||"symbol"==d||"boolean"==d?"__proto__"!==l:null===l};var $l=function(l,d){var b=l.__data__;return ql(d)?b["string"==typeof d?"string":"hash"]:b.map};var ld=function(l){var d=$l(this,l).delete(l);return this.size-=d?1:0,d};var dd=function(l){return $l(this,l).get(l)};var bd=function(l){return $l(this,l).has(l)};var Zd=function(l,d){var b=$l(this,l),Z=b.size;return b.set(l,d),this.size+=b.size==Z?0:1,this};function cd(l){var d=-1,b=null==l?0:l.length;for(this.clear();++d<b;){var Z=l[d];this.set(Z[0],Z[1])}}cd.prototype.clear=_l,cd.prototype.delete=ld,cd.prototype.get=dd,cd.prototype.has=bd,cd.prototype.set=Zd;var md=cd;var Xd=function(l,d){var b=this.__data__;if(b instanceof ol){var Z=b.__data__;if(!Bl||Z.length<199)return Z.push([l,d]),this.size=++b.size,this;b=this.__data__=new md(Z)}return b.set(l,d),this.size=b.size,this};function Gd(l){var d=this.__data__=new ol(l);this.size=d.size}Gd.prototype.clear=Ll,Gd.prototype.delete=Kl,Gd.prototype.get=Hl,Gd.prototype.has=Sl,Gd.prototype.set=Xd;var Wd=Gd;var ud=function(l){return this.__data__.set(l,"__lodash_hash_undefined__"),this};var ad=function(l){return this.__data__.has(l)};function hd(l){var d=-1,b=null==l?0:l.length;for(this.__data__=new md;++d<b;)this.add(l[d])}hd.prototype.add=hd.prototype.push=ud,hd.prototype.has=ad;var sd=hd;var Vd=function(l,d){for(var b=-1,Z=null==l?0:l.length;++b<Z;)if(d(l[b],b,l))return!0;return!1};var yd=function(l,d){return l.has(d)};var pd=function(l,d,b,Z,c,m){var X=1&b,G=l.length,W=d.length;if(G!=W&&!(X&&W>G))return!1;var u=m.get(l),a=m.get(d);if(u&&a)return u==d&&a==l;var h=-1,s=!0,V=2&b?new sd:void 0;for(m.set(l,d),m.set(d,l);++h<G;){var y=l[h],p=d[h];if(Z)var t=X?Z(p,y,h,d,l,m):Z(y,p,h,l,d,m);if(void 0!==t){if(t)continue;s=!1;break}if(V){if(!Vd(d,(function(l,d){if(!yd(V,d)&&(y===l||c(y,l,b,Z,m)))return V.push(d)}))){s=!1;break}}else if(y!==p&&!c(y,p,b,Z,m)){s=!1;break}}return m.delete(l),m.delete(d),s},td=n.Uint8Array;var nd=function(l){var d=-1,b=Array(l.size);return l.forEach((function(l,Z){b[++d]=[Z,l]})),b};var id=function(l){var d=-1,b=Array(l.size);return l.forEach((function(l){b[++d]=l})),b},Rd=i?i.prototype:void 0,od=Rd?Rd.valueOf:void 0;var Ld=function(l,d,b,Z,c,m,X){switch(b){case"[object DataView]":if(l.byteLength!=d.byteLength||l.byteOffset!=d.byteOffset)return!1;l=l.buffer,d=d.buffer;case"[object ArrayBuffer]":return!(l.byteLength!=d.byteLength||!m(new td(l),new td(d)));case"[object Boolean]":case"[object Date]":case"[object Number]":return sl(+l,+d);case"[object Error]":return l.name==d.name&&l.message==d.message;case"[object RegExp]":case"[object String]":return l==d+"";case"[object Map]":var G=nd;case"[object Set]":var W=1&Z;if(G||(G=id),l.size!=d.size&&!W)return!1;var u=X.get(l);if(u)return u==d;Z|=2,X.set(l,d);var a=pd(G(l),G(d),Z,c,m,X);return X.delete(l),a;case"[object Symbol]":if(od)return od.call(l)==od.call(d)}return!1};var Kd=function(l,d){for(var b=-1,Z=d.length,c=l.length;++b<Z;)l[c+b]=d[b];return l};var Hd=function(l,d,b){var Z=d(l);return I(l)?Z:Kd(Z,b(l))};var xd=function(l,d){for(var b=-1,Z=null==l?0:l.length,c=0,m=[];++b<Z;){var X=l[b];d(X,b,l)&&(m[c++]=X)}return m};var Sd=function(){return[]},Yd=Object.prototype.propertyIsEnumerable,ed=Object.getOwnPropertySymbols,Jd=ed?function(l){return null==l?[]:(l=Object(l),xd(ed(l),(function(d){return Yd.call(l,d)})))}:Sd,zd=Jd;var vd=function(l){return Hd(l,cl,zd)},Td=Object.prototype.hasOwnProperty;var Md=function(l,d,b,Z,c,m){var X=1&b,G=vd(l),W=G.length;if(W!=vd(d).length&&!X)return!1;for(var u=W;u--;){var a=G[u];if(!(X?a in d:Td.call(d,a)))return!1}var h=m.get(l),s=m.get(d);if(h&&s)return h==d&&s==l;var V=!0;m.set(l,d),m.set(d,l);for(var y=X;++u<W;){var p=l[a=G[u]],t=d[a];if(Z)var n=X?Z(t,p,a,d,l,m):Z(p,t,a,l,d,m);if(!(void 0===n?p===t||c(p,t,b,Z,m):n)){V=!1;break}y||(y="constructor"==a)}if(V&&!y){var i=l.constructor,R=d.constructor;i==R||!("constructor"in l)||!("constructor"in d)||"function"==typeof i&&i instanceof i&&"function"==typeof R&&R instanceof R||(V=!1)}return m.delete(l),m.delete(d),V},Cd=Pl(n,"DataView"),Fd=Pl(n,"Promise"),Id=Pl(n,"Set"),kd=Pl(n,"WeakMap"),Nd="[object Map]",gd="[object Promise]",Pd="[object Set]",Bd="[object WeakMap]",wd="[object DataView]",Ud=vl(Cd),rd=vl(Bl),Qd=vl(Fd),jd=vl(Id),fd=vl(kd),Ed=e;(Cd&&Ed(new Cd(new ArrayBuffer(1)))!=wd||Bl&&Ed(new Bl)!=Nd||Fd&&Ed(Fd.resolve())!=gd||Id&&Ed(new Id)!=Pd||kd&&Ed(new kd)!=Bd)&&(Ed=function(l){var d=e(l),b="[object Object]"==d?l.constructor:void 0,Z=b?vl(b):"";if(Z)switch(Z){case Ud:return wd;case rd:return Nd;case Qd:return gd;case jd:return Pd;case fd:return Bd}return d});var Od=Ed,Dd="[object Arguments]",Ad="[object Array]",_d="[object Object]",qd=Object.prototype.hasOwnProperty;var $d=function(l,d,b,Z,c,m){var X=I(l),G=I(d),W=X?Ad:Od(l),u=G?Ad:Od(d),a=(W=W==Dd?_d:W)==_d,h=(u=u==Dd?_d:u)==_d,s=W==u;if(s&&N(l)){if(!N(d))return!1;X=!0,a=!1}if(s&&!a)return m||(m=new Wd),X||f(l)?pd(l,d,b,Z,c,m):Ld(l,d,W,b,Z,c,m);if(!(1&b)){var V=a&&qd.call(l,"__wrapped__"),y=h&&qd.call(d,"__wrapped__");if(V||y){var p=V?l.value():l,t=y?d.value():d;return m||(m=new Wd),c(p,t,b,Z,m)}}return!!s&&(m||(m=new Wd),Md(l,d,b,Z,c,m))};var lb=function l(d,b,Z,c,m){return d===b||(null==d||null==b||!J(d)&&!J(b)?d!=d&&b!=b:$d(d,b,Z,c,l,m))};var db=function(l,d,b,Z){var c=b.length,m=c,X=!Z;if(null==l)return!m;for(l=Object(l);c--;){var G=b[c];if(X&&G[2]?G[1]!==l[G[0]]:!(G[0]in l))return!1}for(;++c<m;){var W=(G=b[c])[0],u=l[W],a=G[1];if(X&&G[2]){if(void 0===u&&!(W in l))return!1}else{var h=new Wd;if(Z)var s=Z(u,a,W,l,d,h);if(!(void 0===s?lb(a,u,3,Z,h):s))return!1}}return!0};var bb=function(l){return l==l&&!dl(l)};var Zb=function(l){for(var d=cl(l),b=d.length;b--;){var Z=d[b],c=l[Z];d[b]=[Z,c,bb(c)]}return d};var cb=function(l,d){return function(b){return null!=b&&(b[l]===d&&(void 0!==d||l in Object(b)))}};var mb=function(l){var d=Zb(l);return 1==d.length&&d[0][2]?cb(d[0][0],d[0][1]):function(b){return b===l||db(b,l,d)}};var Xb=function(l){return"symbol"==h(l)||J(l)&&"[object Symbol]"==e(l)},Gb=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Wb=/^\w*$/;var ub=function(l,d){if(I(l))return!1;var b=h(l);return!("number"!=b&&"symbol"!=b&&"boolean"!=b&&null!=l&&!Xb(l))||(Wb.test(l)||!Gb.test(l)||null!=d&&l in Object(d))};function ab(l,d){if("function"!=typeof l||null!=d&&"function"!=typeof d)throw new TypeError("Expected a function");var b=function b(){var Z=arguments,c=d?d.apply(this,Z):Z[0],m=b.cache;if(m.has(c))return m.get(c);var X=l.apply(this,Z);return b.cache=m.set(c,X)||m,X};return b.cache=new(ab.Cache||md),b}ab.Cache=md;var hb=ab;var sb=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Vb=/\\(\\)?/g,yb=function(l){var d=hb(l,(function(l){return 500===b.size&&b.clear(),l})),b=d.cache;return d}((function(l){var d=[];return 46===l.charCodeAt(0)&&d.push(""),l.replace(sb,(function(l,b,Z,c){d.push(Z?c.replace(Vb,"$1"):b||l)})),d})),pb=yb,tb=i?i.prototype:void 0,nb=tb?tb.toString:void 0;var ib=function l(d){if("string"==typeof d)return d;if(I(d))return al(d,l)+"";if(Xb(d))return nb?nb.call(d):"";var b=d+"";return"0"==b&&1/d==-Infinity?"-0":b};var Rb=function(l){return null==l?"":ib(l)};var ob=function(l,d){return I(l)?l:ub(l,d)?[l]:pb(Rb(l))};var Lb=function(l){if("string"==typeof l||Xb(l))return l;var d=l+"";return"0"==d&&1/l==-Infinity?"-0":d};var Kb=function(l,d){for(var b=0,Z=(d=ob(d,l)).length;null!=l&&b<Z;)l=l[Lb(d[b++])];return b&&b==Z?l:void 0};var Hb=function(l,d,b){var Z=null==l?void 0:Kb(l,d);return void 0===Z?b:Z};var xb=function(l,d){return null!=l&&d in Object(l)};var Sb=function(l,d,b){for(var Z=-1,c=(d=ob(d,l)).length,m=!1;++Z<c;){var X=Lb(d[Z]);if(!(m=null!=l&&b(l,X)))break;l=l[X]}return m||++Z!=c?m:!!(c=null==l?0:l.length)&&B(c)&&P(X,c)&&(I(l)||F(l))};var Yb=function(l,d){return null!=l&&Sb(l,d,xb)};var eb=function(l,d){return ub(l)&&bb(d)?cb(Lb(l),d):function(b){var Z=Hb(b,l);return void 0===Z&&Z===d?Yb(b,l):lb(d,Z,3)}};var Jb=function(l){return function(d){return null==d?void 0:d[l]}};var zb=function(l){return function(d){return Kb(d,l)}};var vb=function(l){return ub(l)?Jb(Lb(l)):zb(l)};var Tb=function(l){return"function"==typeof l?l:null==l?Gl:"object"==h(l)?I(l)?eb(l[0],l[1]):mb(l):vb(l)};var Mb=function(l,d){var b=-1,Z=Zl(l)?Array(l.length):[];return Xl(l,(function(l,c,m){Z[++b]=d(l,c,m)})),Z};var Cb=function(l,d){return(I(l)?al:Mb)(l,Tb(d))};var Fb=function(l,d,b){for(var Z=-1,c=l.length;++Z<c;){var m=l[Z],X=d(m);if(null!=X&&(void 0===G?X==X&&!Xb(X):b(X,G)))var G=X,W=m}return W};var Ib=function(l,d){return l<d};var kb=function(l){return l&&l.length?Fb(l,Gl,Ib):void 0};var Nb=function(l,d){return l>d};var gb=function(l){return l&&l.length?Fb(l,Gl,Nb):void 0};var Pb=function(l,d){var b=[];return Xl(l,(function(l,Z,c){d(l,Z,c)&&b.push(l)})),b};var Bb=function(l,d){return(I(l)?xd:Pb)(l,Tb(d))};var wb=function(l){return"string"==typeof l||!I(l)&&J(l)&&"[object String]"==e(l)},Ub=Jb("length"),rb=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");var Qb=function(l){return rb.test(l)},jb="[\\ud800-\\udfff]",fb="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Eb="\\ud83c[\\udffb-\\udfff]",Ob="[^\\ud800-\\udfff]",Db="(?:\\ud83c[\\udde6-\\uddff]){2}",Ab="[\\ud800-\\udbff][\\udc00-\\udfff]",_b="(?:"+fb+"|"+Eb+")"+"?",qb="[\\ufe0e\\ufe0f]?",$b=qb+_b+("(?:\\u200d(?:"+[Ob,Db,Ab].join("|")+")"+qb+_b+")*"),lZ="(?:"+[Ob+fb+"?",fb,Db,Ab,jb].join("|")+")",dZ=RegExp(Eb+"(?="+Eb+")|"+lZ+$b,"g");var bZ=function(l){for(var d=dZ.lastIndex=0;dZ.test(l);)++d;return d};var ZZ=function(l){return Qb(l)?bZ(l):Ub(l)};var cZ=function(l){if(null==l)return 0;if(Zl(l))return wb(l)?ZZ(l):l.length;var d=Od(l);return"[object Map]"==d||"[object Set]"==d?l.size:ll(l).length};var mZ=function(l){return"number"==typeof l||J(l)&&"[object Number]"==e(l)},XZ=function(){try{var l=Pl(Object,"defineProperty");return l({},"",{}),l}catch(l){}}();var GZ=function(l,d,b){"__proto__"==d&&XZ?XZ(l,d,{configurable:!0,enumerable:!0,value:b,writable:!0}):l[d]=b},WZ=Object.prototype.hasOwnProperty;var uZ=function(l,d,b){var Z=l[d];WZ.call(l,d)&&sl(Z,b)&&(void 0!==b||d in l)||GZ(l,d,b)};var aZ=function(l,d,b,Z){var c=!b;b||(b={});for(var m=-1,X=d.length;++m<X;){var G=d[m],W=Z?Z(b[G],l[G],G,b,l):void 0;void 0===W&&(W=l[G]),c?GZ(b,G,W):uZ(b,G,W)}return b};var hZ=function(l,d){return l&&aZ(d,cl(d),l)};var sZ=function(l){var d=[];if(null!=l)for(var b in Object(l))d.push(b);return d},VZ=Object.prototype.hasOwnProperty;var yZ=function(l){if(!dl(l))return sZ(l);var d=A(l),b=[];for(var Z in l)("constructor"!=Z||!d&&VZ.call(l,Z))&&b.push(Z);return b};var pZ=function(l){return Zl(l)?O(l,!0):yZ(l)};var tZ=function(l,d){return l&&aZ(d,pZ(d),l)},nZ=y((function(l,d){var b=d&&!d.nodeType&&d,Z=b&&l&&!l.nodeType&&l,c=Z&&Z.exports===b?n.Buffer:void 0,m=c?c.allocUnsafe:void 0;l.exports=function(l,d){if(d)return l.slice();var b=l.length,Z=m?m(b):new l.constructor(b);return l.copy(Z),Z}}));var iZ=function(l,d){var b=-1,Z=l.length;for(d||(d=Array(Z));++b<Z;)d[b]=l[b];return d};var RZ=function(l,d){return aZ(l,zd(l),d)},oZ=_(Object.getPrototypeOf,Object),LZ=Object.getOwnPropertySymbols?function(l){for(var d=[];l;)Kd(d,zd(l)),l=oZ(l);return d}:Sd,KZ=LZ;var HZ=function(l,d){return aZ(l,KZ(l),d)};var xZ=function(l){return Hd(l,pZ,KZ)},SZ=Object.prototype.hasOwnProperty;var YZ=function(l){var d=l.length,b=new l.constructor(d);return d&&"string"==typeof l[0]&&SZ.call(l,"index")&&(b.index=l.index,b.input=l.input),b};var eZ=function(l){var d=new l.constructor(l.byteLength);return new td(d).set(new td(l)),d};var JZ=function(l,d){var b=d?eZ(l.buffer):l.buffer;return new l.constructor(b,l.byteOffset,l.byteLength)},zZ=/\w*$/;var vZ=function(l){var d=new l.constructor(l.source,zZ.exec(l));return d.lastIndex=l.lastIndex,d},TZ=i?i.prototype:void 0,MZ=TZ?TZ.valueOf:void 0;var CZ=function(l){return MZ?Object(MZ.call(l)):{}};var FZ=function(l,d){var b=d?eZ(l.buffer):l.buffer;return new l.constructor(b,l.byteOffset,l.length)};var IZ=function(l,d,b){var Z=l.constructor;switch(d){case"[object ArrayBuffer]":return eZ(l);case"[object Boolean]":case"[object Date]":return new Z(+l);case"[object DataView]":return JZ(l,b);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return FZ(l,b);case"[object Map]":case"[object Set]":return new Z;case"[object Number]":case"[object String]":return new Z(l);case"[object RegExp]":return vZ(l);case"[object Symbol]":return CZ(l)}},kZ=Object.create,NZ=function(){function l(){}return function(d){if(!dl(d))return{};if(kZ)return kZ(d);l.prototype=d;var b=new l;return l.prototype=void 0,b}}(),gZ=NZ;var PZ=function(l){return"function"!=typeof l.constructor||A(l)?{}:gZ(oZ(l))};var BZ=function(l){return J(l)&&"[object Map]"==Od(l)},wZ=Q&&Q.isMap,UZ=wZ?r(wZ):BZ;var rZ=function(l){return J(l)&&"[object Set]"==Od(l)},QZ=Q&&Q.isSet,jZ=QZ?r(QZ):rZ,fZ="[object Arguments]",EZ="[object Function]",OZ="[object Object]",DZ={};DZ[fZ]=DZ["[object Array]"]=DZ["[object ArrayBuffer]"]=DZ["[object DataView]"]=DZ["[object Boolean]"]=DZ["[object Date]"]=DZ["[object Float32Array]"]=DZ["[object Float64Array]"]=DZ["[object Int8Array]"]=DZ["[object Int16Array]"]=DZ["[object Int32Array]"]=DZ["[object Map]"]=DZ["[object Number]"]=DZ[OZ]=DZ["[object RegExp]"]=DZ["[object Set]"]=DZ["[object String]"]=DZ["[object Symbol]"]=DZ["[object Uint8Array]"]=DZ["[object Uint8ClampedArray]"]=DZ["[object Uint16Array]"]=DZ["[object Uint32Array]"]=!0,DZ["[object Error]"]=DZ[EZ]=DZ["[object WeakMap]"]=!1;var AZ=function l(d,b,Z,c,m,X){var W,u=1&b,a=2&b,h=4&b;if(Z&&(W=m?Z(d,c,m,X):Z(d)),void 0!==W)return W;if(!dl(d))return d;var s=I(d);if(s){if(W=YZ(d),!u)return iZ(d,W)}else{var V=Od(d),y=V==EZ||"[object GeneratorFunction]"==V;if(N(d))return nZ(d,u);if(V==OZ||V==fZ||y&&!m){if(W=a||y?{}:PZ(d),!u)return a?HZ(d,tZ(W,d)):RZ(d,hZ(W,d))}else{if(!DZ[V])return m?d:{};W=IZ(d,V,u)}}X||(X=new Wd);var p=X.get(d);if(p)return p;X.set(d,W),jZ(d)?d.forEach((function(c){W.add(l(c,b,Z,c,d,X))})):UZ(d)&&d.forEach((function(c,m){W.set(m,l(c,b,Z,m,d,X))}));var t=s?void 0:(h?a?xZ:vd:a?pZ:cl)(d);return G(t||d,(function(c,m){t&&(c=d[m=c]),uZ(W,m,l(c,b,Z,m,d,X))})),W};var _Z=function(l){return AZ(l,5)};function qZ(l){return"[object Object]"===Object.prototype.toString.call(l)}function $Z(l){return"[object String]"===Object.prototype.toString.call(l)}function lc(l){return"[object Array]"===Object.prototype.toString.call(l)}function dc(l){return!!function(l){return"[object Undefined]"===Object.prototype.toString.call(l)}(l)||(!!function(l){return"[object Null]"===Object.prototype.toString.call(l)}(l)||(!!function(l){if(qZ(l)){for(var d in l)return!1;return!0}return!1}(l)||(!!function(l){return!(!$Z(l)||""!==l)}(l)||!!function(l){return!!lc(l)&&0===l.length}(l))))}function bc(l){return!dc(l)}function Zc(l){return!!lc(l)&&(0!==l.length&&(1!==l.length||!dc(l[0])))}var cc=function(l){return!0===l||!1===l||J(l)&&"[object Boolean]"==e(l)};function mc(l){return cc(l)}function Xc(){return"undefined"!=typeof window&&void 0!==window.document}var Gc=y((function(l){var d=function(l){var d,b=Object.prototype,Z=b.hasOwnProperty,c="function"==typeof Symbol?Symbol:{},m=c.iterator||"@@iterator",X=c.asyncIterator||"@@asyncIterator",G=c.toStringTag||"@@toStringTag";function W(l,d,b){return Object.defineProperty(l,d,{value:b,enumerable:!0,configurable:!0,writable:!0}),l[d]}try{W({},"")}catch(l){W=function(l,d,b){return l[d]=b}}function u(l,d,b,Z){var c=d&&d.prototype instanceof n?d:n,m=Object.create(c.prototype),X=new z(Z||[]);return m._invoke=function(l,d,b){var Z=s;return function(c,m){if(Z===y)throw new Error("Generator is already running");if(Z===p){if("throw"===c)throw m;return T()}for(b.method=c,b.arg=m;;){var X=b.delegate;if(X){var G=Y(X,b);if(G){if(G===t)continue;return G}}if("next"===b.method)b.sent=b._sent=b.arg;else if("throw"===b.method){if(Z===s)throw Z=p,b.arg;b.dispatchException(b.arg)}else"return"===b.method&&b.abrupt("return",b.arg);Z=y;var W=a(l,d,b);if("normal"===W.type){if(Z=b.done?p:V,W.arg===t)continue;return{value:W.arg,done:b.done}}"throw"===W.type&&(Z=p,b.method="throw",b.arg=W.arg)}}}(l,b,X),m}function a(l,d,b){try{return{type:"normal",arg:l.call(d,b)}}catch(l){return{type:"throw",arg:l}}}l.wrap=u;var s="suspendedStart",V="suspendedYield",y="executing",p="completed",t={};function n(){}function i(){}function R(){}var o={};W(o,m,(function(){return this}));var L=Object.getPrototypeOf,K=L&&L(L(v([])));K&&K!==b&&Z.call(K,m)&&(o=K);var H=R.prototype=n.prototype=Object.create(o);function x(l){["next","throw","return"].forEach((function(d){W(l,d,(function(l){return this._invoke(d,l)}))}))}function S(l,d){function b(c,m,X,G){var W=a(l[c],l,m);if("throw"!==W.type){var u=W.arg,s=u.value;return s&&"object"===h(s)&&Z.call(s,"__await")?d.resolve(s.__await).then((function(l){b("next",l,X,G)}),(function(l){b("throw",l,X,G)})):d.resolve(s).then((function(l){u.value=l,X(u)}),(function(l){return b("throw",l,X,G)}))}G(W.arg)}var c;this._invoke=function(l,Z){function m(){return new d((function(d,c){b(l,Z,d,c)}))}return c=c?c.then(m,m):m()}}function Y(l,b){var Z=l.iterator[b.method];if(Z===d){if(b.delegate=null,"throw"===b.method){if(l.iterator.return&&(b.method="return",b.arg=d,Y(l,b),"throw"===b.method))return t;b.method="throw",b.arg=new TypeError("The iterator does not provide a 'throw' method")}return t}var c=a(Z,l.iterator,b.arg);if("throw"===c.type)return b.method="throw",b.arg=c.arg,b.delegate=null,t;var m=c.arg;return m?m.done?(b[l.resultName]=m.value,b.next=l.nextLoc,"return"!==b.method&&(b.method="next",b.arg=d),b.delegate=null,t):m:(b.method="throw",b.arg=new TypeError("iterator result is not an object"),b.delegate=null,t)}function e(l){var d={tryLoc:l[0]};1 in l&&(d.catchLoc=l[1]),2 in l&&(d.finallyLoc=l[2],d.afterLoc=l[3]),this.tryEntries.push(d)}function J(l){var d=l.completion||{};d.type="normal",delete d.arg,l.completion=d}function z(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(e,this),this.reset(!0)}function v(l){if(l){var b=l[m];if(b)return b.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var c=-1,X=function b(){for(;++c<l.length;)if(Z.call(l,c))return b.value=l[c],b.done=!1,b;return b.value=d,b.done=!0,b};return X.next=X}}return{next:T}}function T(){return{value:d,done:!0}}return i.prototype=R,W(H,"constructor",R),W(R,"constructor",i),i.displayName=W(R,G,"GeneratorFunction"),l.isGeneratorFunction=function(l){var d="function"==typeof l&&l.constructor;return!!d&&(d===i||"GeneratorFunction"===(d.displayName||d.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,R):(l.__proto__=R,W(l,G,"GeneratorFunction")),l.prototype=Object.create(H),l},l.awrap=function(l){return{__await:l}},x(S.prototype),W(S.prototype,X,(function(){return this})),l.AsyncIterator=S,l.async=function(d,b,Z,c,m){void 0===m&&(m=Promise);var X=new S(u(d,b,Z,c),m);return l.isGeneratorFunction(b)?X:X.next().then((function(l){return l.done?l.value:X.next()}))},x(H),W(H,G,"Generator"),W(H,m,(function(){return this})),W(H,"toString",(function(){return"[object Generator]"})),l.keys=function(l){var d=[];for(var b in l)d.push(b);return d.reverse(),function b(){for(;d.length;){var Z=d.pop();if(Z in l)return b.value=Z,b.done=!1,b}return b.done=!0,b}},l.values=v,z.prototype={constructor:z,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=d,this.done=!1,this.delegate=null,this.method="next",this.arg=d,this.tryEntries.forEach(J),!l)for(var b in this)"t"===b.charAt(0)&&Z.call(this,b)&&!isNaN(+b.slice(1))&&(this[b]=d)},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 b=this;function c(Z,c){return G.type="throw",G.arg=l,b.next=Z,c&&(b.method="next",b.arg=d),!!c}for(var m=this.tryEntries.length-1;m>=0;--m){var X=this.tryEntries[m],G=X.completion;if("root"===X.tryLoc)return c("end");if(X.tryLoc<=this.prev){var W=Z.call(X,"catchLoc"),u=Z.call(X,"finallyLoc");if(W&&u){if(this.prev<X.catchLoc)return c(X.catchLoc,!0);if(this.prev<X.finallyLoc)return c(X.finallyLoc)}else if(W){if(this.prev<X.catchLoc)return c(X.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<X.finallyLoc)return c(X.finallyLoc)}}}},abrupt:function(l,d){for(var b=this.tryEntries.length-1;b>=0;--b){var c=this.tryEntries[b];if(c.tryLoc<=this.prev&&Z.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var m=c;break}}m&&("break"===l||"continue"===l)&&m.tryLoc<=d&&d<=m.finallyLoc&&(m=null);var X=m?m.completion:{};return X.type=l,X.arg=d,m?(this.method="next",this.next=m.finallyLoc,t):this.complete(X)},complete:function(l,d){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&&d&&(this.next=d),t},finish:function(l){for(var d=this.tryEntries.length-1;d>=0;--d){var b=this.tryEntries[d];if(b.finallyLoc===l)return this.complete(b.completion,b.afterLoc),J(b),t}},catch:function(l){for(var d=this.tryEntries.length-1;d>=0;--d){var b=this.tryEntries[d];if(b.tryLoc===l){var Z=b.completion;if("throw"===Z.type){var c=Z.arg;J(b)}return c}}throw new Error("illegal catch attempt")},delegateYield:function(l,b,Z){return this.delegate={iterator:v(l),resultName:b,nextLoc:Z},"next"===this.method&&(this.arg=d),t}},l}(l.exports);try{regeneratorRuntime=d}catch(l){"object"===("undefined"==typeof globalThis?"undefined":h(globalThis))?globalThis.regeneratorRuntime=d:Function("r","regeneratorRuntime = r")(d)}})),Wc=Gc;function uc(l,d){if(!(l instanceof d))throw new TypeError("Cannot call a class as a function")}function ac(l,d){for(var b=0;b<d.length;b++){var Z=d[b];Z.enumerable=Z.enumerable||!1,Z.configurable=!0,"value"in Z&&(Z.writable=!0),Object.defineProperty(l,Z.key,Z)}}function hc(l,d,b){return d&&ac(l.prototype,d),b&&ac(l,b),Object.defineProperty(l,"prototype",{writable:!1}),l}var sc=134217729;function Vc(l,d,b,Z,c){var m,X,G,W,u=d[0],a=Z[0],h=0,s=0;a>u==a>-u?(m=u,u=d[++h]):(m=a,a=Z[++s]);var V=0;if(h<l&&s<b)for(a>u==a>-u?(G=m-((X=u+m)-u),u=d[++h]):(G=m-((X=a+m)-a),a=Z[++s]),m=X,0!==G&&(c[V++]=G);h<l&&s<b;)a>u==a>-u?(G=m-((X=m+u)-(W=X-m))+(u-W),u=d[++h]):(G=m-((X=m+a)-(W=X-m))+(a-W),a=Z[++s]),m=X,0!==G&&(c[V++]=G);for(;h<l;)G=m-((X=m+u)-(W=X-m))+(u-W),u=d[++h],m=X,0!==G&&(c[V++]=G);for(;s<b;)G=m-((X=m+a)-(W=X-m))+(a-W),a=Z[++s],m=X,0!==G&&(c[V++]=G);return 0===m&&0!==V||(c[V++]=m),V}function yc(l){return new Float64Array(l)}var pc=yc(4),tc=yc(8),nc=yc(12),ic=yc(16),Rc=yc(4);function oc(l,d,b,Z,c,m){var X=(d-m)*(b-c),G=(l-c)*(Z-m),W=X-G;if(0===X||0===G||X>0!=G>0)return W;var u=Math.abs(X+G);return Math.abs(W)>=33306690738754716e-32*u?W:-function(l,d,b,Z,c,m,X){var G,W,u,a,h,s,V,y,p,t,n,i,R,o,L,K,H,x,S=l-c,Y=b-c,e=d-m,J=Z-m;h=(L=(y=S-(V=(s=sc*S)-(s-S)))*(t=J-(p=(s=sc*J)-(s-J)))-((o=S*J)-V*p-y*p-V*t))-(n=L-(H=(y=e-(V=(s=sc*e)-(s-e)))*(t=Y-(p=(s=sc*Y)-(s-Y)))-((K=e*Y)-V*p-y*p-V*t))),pc[0]=L-(n+h)+(h-H),h=(R=o-((i=o+n)-(h=i-o))+(n-h))-(n=R-K),pc[1]=R-(n+h)+(h-K),h=(x=i+n)-i,pc[2]=i-(x-h)+(n-h),pc[3]=x;var z=function(l,d){for(var b=d[0],Z=1;Z<l;Z++)b+=d[Z];return b}(4,pc),v=22204460492503146e-32*X;if(z>=v||-z>=v)return z;if(G=l-(S+(h=l-S))+(h-c),u=b-(Y+(h=b-Y))+(h-c),W=d-(e+(h=d-e))+(h-m),a=Z-(J+(h=Z-J))+(h-m),0===G&&0===W&&0===u&&0===a)return z;if(v=11093356479670487e-47*X+33306690738754706e-32*Math.abs(z),(z+=S*a+J*G-(e*u+Y*W))>=v||-z>=v)return z;h=(L=(y=G-(V=(s=sc*G)-(s-G)))*(t=J-(p=(s=sc*J)-(s-J)))-((o=G*J)-V*p-y*p-V*t))-(n=L-(H=(y=W-(V=(s=sc*W)-(s-W)))*(t=Y-(p=(s=sc*Y)-(s-Y)))-((K=W*Y)-V*p-y*p-V*t))),Rc[0]=L-(n+h)+(h-H),h=(R=o-((i=o+n)-(h=i-o))+(n-h))-(n=R-K),Rc[1]=R-(n+h)+(h-K),h=(x=i+n)-i,Rc[2]=i-(x-h)+(n-h),Rc[3]=x;var T=Vc(4,pc,4,Rc,tc);h=(L=(y=S-(V=(s=sc*S)-(s-S)))*(t=a-(p=(s=sc*a)-(s-a)))-((o=S*a)-V*p-y*p-V*t))-(n=L-(H=(y=e-(V=(s=sc*e)-(s-e)))*(t=u-(p=(s=sc*u)-(s-u)))-((K=e*u)-V*p-y*p-V*t))),Rc[0]=L-(n+h)+(h-H),h=(R=o-((i=o+n)-(h=i-o))+(n-h))-(n=R-K),Rc[1]=R-(n+h)+(h-K),h=(x=i+n)-i,Rc[2]=i-(x-h)+(n-h),Rc[3]=x;var M=Vc(T,tc,4,Rc,nc);h=(L=(y=G-(V=(s=sc*G)-(s-G)))*(t=a-(p=(s=sc*a)-(s-a)))-((o=G*a)-V*p-y*p-V*t))-(n=L-(H=(y=W-(V=(s=sc*W)-(s-W)))*(t=u-(p=(s=sc*u)-(s-u)))-((K=W*u)-V*p-y*p-V*t))),Rc[0]=L-(n+h)+(h-H),h=(R=o-((i=o+n)-(h=i-o))+(n-h))-(n=R-K),Rc[1]=R-(n+h)+(h-K),h=(x=i+n)-i,Rc[2]=i-(x-h)+(n-h),Rc[3]=x;var C=Vc(M,nc,4,Rc,ic);return ic[C-1]}(l,d,b,Z,c,m,u)}var Lc=Math.pow(2,-52),Kc=new Uint32Array(512),Hc=function(){function l(d){uc(this,l);var b=d.length>>1;if(b>0&&"number"!=typeof d[0])throw new Error("Expected coords to contain numbers.");this.coords=d;var Z=Math.max(2*b-5,0);this._triangles=new Uint32Array(3*Z),this._halfedges=new Int32Array(3*Z),this._hashSize=Math.ceil(Math.sqrt(b)),this._hullPrev=new Uint32Array(b),this._hullNext=new Uint32Array(b),this._hullTri=new Uint32Array(b),this._hullHash=new Int32Array(this._hashSize).fill(-1),this._ids=new Uint32Array(b),this._dists=new Float64Array(b),this.update()}return hc(l,[{key:"update",value:function(){for(var l=this.coords,d=this._hullPrev,b=this._hullNext,Z=this._hullTri,c=this._hullHash,m=l.length>>1,X=1/0,G=1/0,W=-1/0,u=-1/0,a=0;a<m;a++){var h=l[2*a],s=l[2*a+1];h<X&&(X=h),s<G&&(G=s),h>W&&(W=h),s>u&&(u=s),this._ids[a]=a}for(var V,y,p,t=(X+W)/2,n=(G+u)/2,i=1/0,R=0;R<m;R++){var o=xc(t,n,l[2*R],l[2*R+1]);o<i&&(V=R,i=o)}var L=l[2*V],K=l[2*V+1];i=1/0;for(var H=0;H<m;H++)if(H!==V){var x=xc(L,K,l[2*H],l[2*H+1]);x<i&&x>0&&(y=H,i=x)}for(var S=l[2*y],Y=l[2*y+1],e=1/0,J=0;J<m;J++)if(J!==V&&J!==y){var z=Sc(L,K,S,Y,l[2*J],l[2*J+1]);z<e&&(p=J,e=z)}var v=l[2*p],T=l[2*p+1];if(e===1/0){for(var M=0;M<m;M++)this._dists[M]=l[2*M]-l[0]||l[2*M+1]-l[1];Yc(this._ids,this._dists,0,m-1);for(var C=new Uint32Array(m),F=0,I=0,k=-1/0;I<m;I++){var N=this._ids[I];this._dists[N]>k&&(C[F++]=N,k=this._dists[N])}return this.hull=C.subarray(0,F),this.triangles=new Uint32Array(0),void(this.halfedges=new Uint32Array(0))}if(oc(L,K,S,Y,v,T)<0){var g=y,P=S,B=Y;y=p,S=v,Y=T,p=g,v=P,T=B}var w=function(l,d,b,Z,c,m){var X=b-l,G=Z-d,W=c-l,u=m-d,a=X*X+G*G,h=W*W+u*u,s=.5/(X*u-G*W);return{x:l+(u*a-G*h)*s,y:d+(X*h-W*a)*s}}(L,K,S,Y,v,T);this._cx=w.x,this._cy=w.y;for(var U=0;U<m;U++)this._dists[U]=xc(l[2*U],l[2*U+1],w.x,w.y);Yc(this._ids,this._dists,0,m-1),this._hullStart=V;var r=3;b[V]=d[p]=y,b[y]=d[V]=p,b[p]=d[y]=V,Z[V]=0,Z[y]=1,Z[p]=2,c.fill(-1),c[this._hashKey(L,K)]=V,c[this._hashKey(S,Y)]=y,c[this._hashKey(v,T)]=p,this.trianglesLen=0,this._addTriangle(V,y,p,-1,-1,-1);for(var Q,j,f=0;f<this._ids.length;f++){var E=this._ids[f],O=l[2*E],D=l[2*E+1];if(!(f>0&&Math.abs(O-Q)<=Lc&&Math.abs(D-j)<=Lc)&&(Q=O,j=D,E!==V&&E!==y&&E!==p)){for(var A=0,_=0,q=this._hashKey(O,D);_<this._hashSize&&(-1===(A=c[(q+_)%this._hashSize])||A===b[A]);_++);for(var $=A=d[A],ll=void 0;ll=b[$],oc(O,D,l[2*$],l[2*$+1],l[2*ll],l[2*ll+1])>=0;)if(($=ll)===A){$=-1;break}if(-1!==$){var dl=this._addTriangle($,E,b[$],-1,-1,Z[$]);Z[E]=this._legalize(dl+2),Z[$]=dl,r++;for(var bl=b[$];ll=b[bl],oc(O,D,l[2*bl],l[2*bl+1],l[2*ll],l[2*ll+1])<0;)dl=this._addTriangle(bl,E,ll,Z[E],-1,Z[bl]),Z[E]=this._legalize(dl+2),b[bl]=bl,r--,bl=ll;if($===A)for(;oc(O,D,l[2*(ll=d[$])],l[2*ll+1],l[2*$],l[2*$+1])<0;)dl=this._addTriangle(ll,E,$,-1,Z[$],Z[ll]),this._legalize(dl+2),Z[ll]=dl,b[$]=$,r--,$=ll;this._hullStart=d[E]=$,b[$]=d[bl]=E,b[E]=bl,c[this._hashKey(O,D)]=E,c[this._hashKey(l[2*$],l[2*$+1])]=$}}}this.hull=new Uint32Array(r);for(var Zl=0,cl=this._hullStart;Zl<r;Zl++)this.hull[Zl]=cl,cl=b[cl];this.triangles=this._triangles.subarray(0,this.trianglesLen),this.halfedges=this._halfedges.subarray(0,this.trianglesLen)}},{key:"_hashKey",value:function(l,d){return Math.floor((b=l-this._cx,Z=d-this._cy,c=b/(Math.abs(b)+Math.abs(Z)),(Z>0?3-c:1+c)/4*this._hashSize))%this._hashSize;var b,Z,c}},{key:"_legalize",value:function(l){for(var d,b,Z,c,m,X,G,W,u,a,h,s,V,y,p,t,n=this._triangles,i=this._halfedges,R=this.coords,o=0,L=0;;){var K=i[l],H=l-l%3;if(L=H+(l+2)%3,-1!==K){var x=K-K%3,S=H+(l+1)%3,Y=x+(K+2)%3,e=n[L],J=n[l],z=n[S],v=n[Y];if(d=R[2*e],b=R[2*e+1],Z=R[2*J],c=R[2*J+1],m=R[2*z],X=R[2*z+1],G=R[2*v],W=R[2*v+1],u=void 0,a=void 0,h=void 0,s=void 0,V=void 0,y=void 0,void 0,p=void 0,t=void 0,(u=d-G)*((s=c-W)*(t=(V=m-G)*V+(y=X-W)*y)-(p=(h=Z-G)*h+s*s)*y)-(a=b-W)*(h*t-p*V)+(u*u+a*a)*(h*y-s*V)<0){n[l]=v,n[K]=e;var T=i[Y];if(-1===T){var M=this._hullStart;do{if(this._hullTri[M]===Y){this._hullTri[M]=l;break}M=this._hullPrev[M]}while(M!==this._hullStart)}this._link(l,T),this._link(K,i[L]),this._link(L,Y);var C=x+(K+1)%3;o<Kc.length&&(Kc[o++]=C)}else{if(0===o)break;l=Kc[--o]}}else{if(0===o)break;l=Kc[--o]}}return L}},{key:"_link",value:function(l,d){this._halfedges[l]=d,-1!==d&&(this._halfedges[d]=l)}},{key:"_addTriangle",value:function(l,d,b,Z,c,m){var X=this.trianglesLen;return this._triangles[X]=l,this._triangles[X+1]=d,this._triangles[X+2]=b,this._link(X,Z),this._link(X+1,c),this._link(X+2,m),this.trianglesLen+=3,X}}],[{key:"from",value:function(d){for(var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Jc,Z=arguments.length>2&&void 0!==arguments[2]?arguments[2]:zc,c=d.length,m=new Float64Array(2*c),X=0;X<c;X++){var G=d[X];m[2*X]=b(G),m[2*X+1]=Z(G)}return new l(m)}}]),l}();function xc(l,d,b,Z){var c=l-b,m=d-Z;return c*c+m*m}function Sc(l,d,b,Z,c,m){var X=b-l,G=Z-d,W=c-l,u=m-d,a=X*X+G*G,h=W*W+u*u,s=.5/(X*u-G*W),V=(u*a-G*h)*s,y=(X*h-W*a)*s;return V*V+y*y}function Yc(l,d,b,Z){if(Z-b<=20)for(var c=b+1;c<=Z;c++){for(var m=l[c],X=d[m],G=c-1;G>=b&&d[l[G]]>X;)l[G+1]=l[G--];l[G+1]=m}else{var W=b+1,u=Z;ec(l,b+Z>>1,W),d[l[b]]>d[l[Z]]&&ec(l,b,Z),d[l[W]]>d[l[Z]]&&ec(l,W,Z),d[l[b]]>d[l[W]]&&ec(l,b,W);for(var a=l[W],h=d[a];;){do{W++}while(d[l[W]]<h);do{u--}while(d[l[u]]>h);if(u<W)break;ec(l,W,u)}l[b+1]=l[u],l[u]=a,Z-W+1>=u-b?(Yc(l,d,W,Z),Yc(l,d,b,u-1)):(Yc(l,d,b,u-1),Yc(l,d,W,Z))}}function ec(l,d,b){var Z=l[d];l[d]=l[b],l[b]=Z}function Jc(l){return l[0]}function zc(l){return l[1]}var vc=1e-6,Tc=function(){function l(){uc(this,l),this._x0=this._y0=this._x1=this._y1=null,this._=""}return hc(l,[{key:"moveTo",value:function(l,d){this._+="M".concat(this._x0=this._x1=+l,",").concat(this._y0=this._y1=+d)}},{key:"closePath",value:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}},{key:"lineTo",value:function(l,d){this._+="L".concat(this._x1=+l,",").concat(this._y1=+d)}},{key:"arc",value:function(l,d,b){var Z=(l=+l)+(b=+b),c=d=+d;if(b<0)throw new Error("negative radius");null===this._x1?this._+="M".concat(Z,",").concat(c):(Math.abs(this._x1-Z)>vc||Math.abs(this._y1-c)>vc)&&(this._+="L"+Z+","+c),b&&(this._+="A".concat(b,",").concat(b,",0,1,1,").concat(l-b,",").concat(d,"A").concat(b,",").concat(b,",0,1,1,").concat(this._x1=Z,",").concat(this._y1=c))}},{key:"rect",value:function(l,d,b,Z){this._+="M".concat(this._x0=this._x1=+l,",").concat(this._y0=this._y1=+d,"h").concat(+b,"v").concat(+Z,"h").concat(-b,"Z")}},{key:"value",value:function(){return this._||null}}]),l}(),Mc=function(){function l(){uc(this,l),this._=[]}return hc(l,[{key:"moveTo",value:function(l,d){this._.push([l,d])}},{key:"closePath",value:function(){this._.push(this._[0].slice())}},{key:"lineTo",value:function(l,d){this._.push([l,d])}},{key:"value",value:function(){return this._.length?this._:null}}]),l}();function Cc(l,d){return function(l){if(Array.isArray(l))return l}(l)||function(l,d){var b=null==l?null:"undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(null!=b){var Z,c,m=[],X=!0,G=!1;try{for(b=b.call(l);!(X=(Z=b.next()).done)&&(m.push(Z.value),!d||m.length!==d);X=!0);}catch(l){G=!0,c=l}finally{try{X||null==b.return||b.return()}finally{if(G)throw c}}return m}}(l,d)||m(l,d)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Fc(l,d){var b="undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(!b){if(Array.isArray(l)||(b=function(l,d){if(!l)return;if("string"==typeof l)return Ic(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);"Object"===b&&l.constructor&&(b=l.constructor.name);if("Map"===b||"Set"===b)return Array.from(l);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return Ic(l,d)}(l))||d&&l&&"number"==typeof l.length){b&&(l=b);var Z=0,c=function(){};return{s:c,n:function(){return Z>=l.length?{done:!0}:{done:!1,value:l[Z++]}},e:function(l){throw l},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,X=!0,G=!1;return{s:function(){b=b.call(l)},n:function(){var l=b.next();return X=l.done,l},e:function(l){G=!0,m=l},f:function(){try{X||null==b.return||b.return()}finally{if(G)throw m}}}}function Ic(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}var kc=function(){function l(d){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[0,0,960,500],Z=Cc(b,4),c=Z[0],m=Z[1],X=Z[2],G=Z[3];if(uc(this,l),!((X=+X)>=(c=+c)&&(G=+G)>=(m=+m)))throw new Error("invalid bounds");this.delaunay=d,this._circumcenters=new Float64Array(2*d.points.length),this.vectors=new Float64Array(2*d.points.length),this.xmax=X,this.xmin=c,this.ymax=G,this.ymin=m,this._init()}return hc(l,[{key:"update",value:function(){return this.delaunay.update(),this._init(),this}},{key:"_init",value:function(){for(var l,d,b=this.delaunay,Z=b.points,c=b.hull,m=b.triangles,X=this.vectors,G=this.circumcenters=this._circumcenters.subarray(0,m.length/3*2),W=0,u=0,a=m.length;W<a;W+=3,u+=2){var h=2*m[W],s=2*m[W+1],V=2*m[W+2],y=Z[h],p=Z[h+1],t=Z[s],n=Z[s+1],i=Z[V],R=Z[V+1],o=t-y,L=n-p,K=i-y,H=R-p,x=2*(o*H-L*K);if(Math.abs(x)<1e-9){var S=1e9,Y=2*m[0];l=(y+i)/2-(S*=Math.sign((Z[Y]-y)*H-(Z[Y+1]-p)*K))*H,d=(p+R)/2+S*K}else{var e=1/x,J=o*o+L*L,z=K*K+H*H;l=y+(H*J-L*z)*e,d=p+(o*z-K*J)*e}G[u]=l,G[u+1]=d}var v,T,M,C=c[c.length-1],F=4*C,I=Z[2*C],k=Z[2*C+1];X.fill(0);for(var N=0;N<c.length;++N)v=F,T=I,M=k,F=4*(C=c[N]),I=Z[2*C],k=Z[2*C+1],X[v+2]=X[F]=M-k,X[v+3]=X[F+1]=I-T}},{key:"render",value:function(l){var d=null==l?l=new Tc:void 0,b=this.delaunay,Z=b.halfedges,c=b.inedges,m=b.hull,X=this.circumcenters,G=this.vectors;if(m.length<=1)return null;for(var W=0,u=Z.length;W<u;++W){var a=Z[W];if(!(a<W)){var h=2*Math.floor(W/3),s=2*Math.floor(a/3),V=X[h],y=X[h+1],p=X[s],t=X[s+1];this._renderSegment(V,y,p,t,l)}}for(var n,i=m[m.length-1],R=0;R<m.length;++R){n=i,i=m[R];var o=2*Math.floor(c[i]/3),L=X[o],K=X[o+1],H=4*n,x=this._project(L,K,G[H+2],G[H+3]);x&&this._renderSegment(L,K,x[0],x[1],l)}return d&&d.value()}},{key:"renderBounds",value:function(l){var d=null==l?l=new Tc:void 0;return l.rect(this.xmin,this.ymin,this.xmax-this.xmin,this.ymax-this.ymin),d&&d.value()}},{key:"renderCell",value:function(l,d){var b=null==d?d=new Tc:void 0,Z=this._clip(l);if(null!==Z&&Z.length){d.moveTo(Z[0],Z[1]);for(var c=Z.length;Z[0]===Z[c-2]&&Z[1]===Z[c-1]&&c>1;)c-=2;for(var m=2;m<c;m+=2)Z[m]===Z[m-2]&&Z[m+1]===Z[m-1]||d.lineTo(Z[m],Z[m+1]);return d.closePath(),b&&b.value()}}},{key:"cellPolygons",value:Wc.mark((function l(){var d,b,Z,c;return Wc.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:d=this.delaunay.points,b=0,Z=d.length/2;case 2:if(!(b<Z)){l.next=11;break}if(!(c=this.cellPolygon(b))){l.next=8;break}return c.index=b,l.next=8,c;case 8:++b,l.next=2;break;case 11:case"end":return l.stop()}}),l,this)}))},{key:"cellPolygon",value:function(l){var d=new Mc;return this.renderCell(l,d),d.value()}},{key:"_renderSegment",value:function(l,d,b,Z,c){var m,X=this._regioncode(l,d),G=this._regioncode(b,Z);0===X&&0===G?(c.moveTo(l,d),c.lineTo(b,Z)):(m=this._clipSegment(l,d,b,Z,X,G))&&(c.moveTo(m[0],m[1]),c.lineTo(m[2],m[3]))}},{key:"contains",value:function(l,d,b){return(d=+d)==d&&(b=+b)==b&&this.delaunay._step(l,d,b)===l}},{key:"neighbors",value:Wc.mark((function l(d){var b,Z,c,m,X,G,W,u,a;return Wc.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:if(!(b=this._clip(d))){l.next=33;break}Z=Fc(this.delaunay.neighbors(d)),l.prev=3,Z.s();case 5:if((c=Z.n()).done){l.next=25;break}if(m=c.value,!(X=this._clip(m))){l.next=23;break}G=0,W=b.length;case 10:if(!(G<W)){l.next=23;break}u=0,a=X.length;case 12:if(!(u<a)){l.next=20;break}if(b[G]!=X[u]||b[G+1]!=X[u+1]||b[(G+2)%W]!=X[(u+a-2)%a]||b[(G+3)%W]!=X[(u+a-1)%a]){l.next=17;break}return l.next=16,m;case 16:return l.abrupt("break",23);case 17:u+=2,l.next=12;break;case 20:G+=2,l.next=10;break;case 23:l.next=5;break;case 25:l.next=30;break;case 27:l.prev=27,l.t0=l.catch(3),Z.e(l.t0);case 30:return l.prev=30,Z.f(),l.finish(30);case 33:case"end":return l.stop()}}),l,this,[[3,27,30,33]])}))},{key:"_cell",value:function(l){var d=this.circumcenters,b=this.delaunay,Z=b.inedges,c=b.halfedges,m=b.triangles,X=Z[l];if(-1===X)return null;var G=[],W=X;do{var u=Math.floor(W/3);if(G.push(d[2*u],d[2*u+1]),m[W=W%3==2?W-2:W+1]!==l)break;W=c[W]}while(W!==X&&-1!==W);return G}},{key:"_clip",value:function(l){if(0===l&&1===this.delaunay.hull.length)return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];var d=this._cell(l);if(null===d)return null;var b=this.vectors,Z=4*l;return b[Z]||b[Z+1]?this._clipInfinite(l,d,b[Z],b[Z+1],b[Z+2],b[Z+3]):this._clipFinite(l,d)}},{key:"_clipFinite",value:function(l,d){for(var b,Z,c,m,X=d.length,G=null,W=d[X-2],u=d[X-1],a=this._regioncode(W,u),h=0,s=0;s<X;s+=2)if(b=W,Z=u,W=d[s],u=d[s+1],c=a,a=this._regioncode(W,u),0===c&&0===a)m=h,h=0,G?G.push(W,u):G=[W,u];else{var V=void 0,y=void 0,p=void 0,t=void 0,n=void 0;if(0===c){if(null===(V=this._clipSegment(b,Z,W,u,c,a)))continue;var i=Cc(V,4);y=i[0],p=i[1],t=i[2],n=i[3]}else{if(null===(V=this._clipSegment(W,u,b,Z,a,c)))continue;var R=Cc(V,4);t=R[0],n=R[1],y=R[2],p=R[3],m=h,h=this._edgecode(y,p),m&&h&&this._edge(l,m,h,G,G.length),G?G.push(y,p):G=[y,p]}m=h,h=this._edgecode(t,n),m&&h&&this._edge(l,m,h,G,G.length),G?G.push(t,n):G=[t,n]}if(G)m=h,h=this._edgecode(G[0],G[1]),m&&h&&this._edge(l,m,h,G,G.length);else if(this.contains(l,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2))return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];return G}},{key:"_clipSegment",value:function(l,d,b,Z,c,m){for(;;){if(0===c&&0===m)return[l,d,b,Z];if(c&m)return null;var X=void 0,G=void 0,W=c||m;8&W?(X=l+(b-l)*(this.ymax-d)/(Z-d),G=this.ymax):4&W?(X=l+(b-l)*(this.ymin-d)/(Z-d),G=this.ymin):2&W?(G=d+(Z-d)*(this.xmax-l)/(b-l),X=this.xmax):(G=d+(Z-d)*(this.xmin-l)/(b-l),X=this.xmin),c?(l=X,d=G,c=this._regioncode(l,d)):(b=X,Z=G,m=this._regioncode(b,Z))}}},{key:"_clipInfinite",value:function(l,d,b,Z,c,m){var X,G=Array.from(d);if((X=this._project(G[0],G[1],b,Z))&&G.unshift(X[0],X[1]),(X=this._project(G[G.length-2],G[G.length-1],c,m))&&G.push(X[0],X[1]),G=this._clipFinite(l,G))for(var W,u=0,a=G.length,h=this._edgecode(G[a-2],G[a-1]);u<a;u+=2)W=h,h=this._edgecode(G[u],G[u+1]),W&&h&&(u=this._edge(l,W,h,G,u),a=G.length);else this.contains(l,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2)&&(G=[this.xmin,this.ymin,this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax]);return G}},{key:"_edge",value:function(l,d,b,Z,c){for(;d!==b;){var m=void 0,X=void 0;switch(d){case 5:d=4;continue;case 4:d=6,m=this.xmax,X=this.ymin;break;case 6:d=2;continue;case 2:d=10,m=this.xmax,X=this.ymax;break;case 10:d=8;continue;case 8:d=9,m=this.xmin,X=this.ymax;break;case 9:d=1;continue;case 1:d=5,m=this.xmin,X=this.ymin}Z[c]===m&&Z[c+1]===X||!this.contains(l,m,X)||(Z.splice(c,0,m,X),c+=2)}if(Z.length>4)for(var G=0;G<Z.length;G+=2){var W=(G+2)%Z.length,u=(G+4)%Z.length;(Z[G]===Z[W]&&Z[W]===Z[u]||Z[G+1]===Z[W+1]&&Z[W+1]===Z[u+1])&&(Z.splice(W,2),G-=2)}return c}},{key:"_project",value:function(l,d,b,Z){var c,m,X,G=1/0;if(Z<0){if(d<=this.ymin)return null;(c=(this.ymin-d)/Z)<G&&(X=this.ymin,m=l+(G=c)*b)}else if(Z>0){if(d>=this.ymax)return null;(c=(this.ymax-d)/Z)<G&&(X=this.ymax,m=l+(G=c)*b)}if(b>0){if(l>=this.xmax)return null;(c=(this.xmax-l)/b)<G&&(m=this.xmax,X=d+(G=c)*Z)}else if(b<0){if(l<=this.xmin)return null;(c=(this.xmin-l)/b)<G&&(m=this.xmin,X=d+(G=c)*Z)}return[m,X]}},{key:"_edgecode",value:function(l,d){return(l===this.xmin?1:l===this.xmax?2:0)|(d===this.ymin?4:d===this.ymax?8:0)}},{key:"_regioncode",value:function(l,d){return(l<this.xmin?1:l>this.xmax?2:0)|(d<this.ymin?4:d>this.ymax?8:0)}}]),l}(),Nc=Wc.mark(Ec);function gc(l,d){var b="undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(!b){if(Array.isArray(l)||(b=function(l,d){if(!l)return;if("string"==typeof l)return Pc(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);"Object"===b&&l.constructor&&(b=l.constructor.name);if("Map"===b||"Set"===b)return Array.from(l);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return Pc(l,d)}(l))||d&&l&&"number"==typeof l.length){b&&(l=b);var Z=0,c=function(){};return{s:c,n:function(){return Z>=l.length?{done:!0}:{done:!1,value:l[Z++]}},e:function(l){throw l},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,X=!0,G=!1;return{s:function(){b=b.call(l)},n:function(){var l=b.next();return X=l.done,l},e:function(l){G=!0,m=l},f:function(){try{X||null==b.return||b.return()}finally{if(G)throw m}}}}function Pc(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}var Bc=2*Math.PI,wc=Math.pow;function Uc(l){return l[0]}function rc(l){return l[1]}function Qc(l,d,b){return[l+Math.sin(l+d)*b,d+Math.cos(l-d)*b]}var jc=function(){function l(d){uc(this,l),this._delaunator=new Hc(d),this.inedges=new Int32Array(d.length/2),this._hullIndex=new Int32Array(d.length/2),this.points=this._delaunator.coords,this._init()}return hc(l,[{key:"update",value:function(){return this._delaunator.update(),this._init(),this}},{key:"_init",value:function(){var l=this._delaunator,d=this.points;if(l.hull&&l.hull.length>2&&function(l){for(var d=l.triangles,b=l.coords,Z=0;Z<d.length;Z+=3){var c=2*d[Z],m=2*d[Z+1],X=2*d[Z+2];if((b[X]-b[c])*(b[m+1]-b[c+1])-(b[m]-b[c])*(b[X+1]-b[c+1])>1e-10)return!1}return!0}(l)){this.collinear=Int32Array.from({length:d.length/2},(function(l,d){return d})).sort((function(l,b){return d[2*l]-d[2*b]||d[2*l+1]-d[2*b+1]}));for(var b=this.collinear[0],Z=this.collinear[this.collinear.length-1],c=[d[2*b],d[2*b+1],d[2*Z],d[2*Z+1]],m=1e-8*Math.hypot(c[3]-c[1],c[2]-c[0]),X=0,G=d.length/2;X<G;++X){var W=Qc(d[2*X],d[2*X+1],m);d[2*X]=W[0],d[2*X+1]=W[1]}this._delaunator=new Hc(d)}else delete this.collinear;for(var u=this.halfedges=this._delaunator.halfedges,a=this.hull=this._delaunator.hull,h=this.triangles=this._delaunator.triangles,s=this.inedges.fill(-1),V=this._hullIndex.fill(-1),y=0,p=u.length;y<p;++y){var t=h[y%3==2?y-2:y+1];-1!==u[y]&&-1!==s[t]||(s[t]=y)}for(var n=0,i=a.length;n<i;++n)V[a[n]]=n;a.length<=2&&a.length>0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=a[0],s[a[0]]=1,2===a.length&&(s[a[1]]=0,this.triangles[1]=a[1],this.triangles[2]=a[1]))}},{key:"voronoi",value:function(l){return new kc(this,l)}},{key:"neighbors",value:Wc.mark((function l(d){var b,Z,c,m,X,G,W,u,a,h,s;return Wc.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:if(b=this.inedges,Z=this.hull,c=this._hullIndex,m=this.halfedges,X=this.triangles,!(G=this.collinear)){l.next=10;break}if(!((W=G.indexOf(d))>0)){l.next=6;break}return l.next=6,G[W-1];case 6:if(!(W<G.length-1)){l.next=9;break}return l.next=9,G[W+1];case 9:return l.abrupt("return");case 10:if(-1!==(u=b[d])){l.next=13;break}return l.abrupt("return");case 13:a=u,h=-1;case 14:return l.next=16,h=X[a];case 16:if(X[a=a%3==2?a-2:a+1]===d){l.next=19;break}return l.abrupt("return");case 19:if(-1!==(a=m[a])){l.next=26;break}if((s=Z[(c[d]+1)%Z.length])===h){l.next=25;break}return l.next=25,s;case 25:return l.abrupt("return");case 26:if(a!==u){l.next=14;break}case 27:case"end":return l.stop()}}),l,this)}))},{key:"find",value:function(l,d){var b=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if((l=+l)!=l||(d=+d)!=d)return-1;for(var Z,c=b;(Z=this._step(b,l,d))>=0&&Z!==b&&Z!==c;)b=Z;return Z}},{key:"_step",value:function(l,d,b){var Z=this.inedges,c=this.hull,m=this._hullIndex,X=this.halfedges,G=this.triangles,W=this.points;if(-1===Z[l]||!W.length)return(l+1)%(W.length>>1);var u=l,a=wc(d-W[2*l],2)+wc(b-W[2*l+1],2),h=Z[l],s=h;do{var V=G[s],y=wc(d-W[2*V],2)+wc(b-W[2*V+1],2);if(y<a&&(a=y,u=V),G[s=s%3==2?s-2:s+1]!==l)break;if(-1===(s=X[s])){if((s=c[(m[l]+1)%c.length])!==V&&wc(d-W[2*s],2)+wc(b-W[2*s+1],2)<a)return s;break}}while(s!==h);return u}},{key:"render",value:function(l){for(var d=null==l?l=new Tc:void 0,b=this.points,Z=this.halfedges,c=this.triangles,m=0,X=Z.length;m<X;++m){var G=Z[m];if(!(G<m)){var W=2*c[m],u=2*c[G];l.moveTo(b[W],b[W+1]),l.lineTo(b[u],b[u+1])}}return this.renderHull(l),d&&d.value()}},{key:"renderPoints",value:function(l,d){void 0!==d||l&&"function"==typeof l.moveTo||(d=l,l=null),d=null==d?2:+d;for(var b=null==l?l=new Tc:void 0,Z=this.points,c=0,m=Z.length;c<m;c+=2){var X=Z[c],G=Z[c+1];l.moveTo(X+d,G),l.arc(X,G,d,0,Bc)}return b&&b.value()}},{key:"renderHull",value:function(l){var d=null==l?l=new Tc:void 0,b=this.hull,Z=this.points,c=2*b[0],m=b.length;l.moveTo(Z[c],Z[c+1]);for(var X=1;X<m;++X){var G=2*b[X];l.lineTo(Z[G],Z[G+1])}return l.closePath(),d&&d.value()}},{key:"hullPolygon",value:function(){var l=new Mc;return this.renderHull(l),l.value()}},{key:"renderTriangle",value:function(l,d){var b=null==d?d=new Tc:void 0,Z=this.points,c=this.triangles,m=2*c[l*=3],X=2*c[l+1],G=2*c[l+2];return d.moveTo(Z[m],Z[m+1]),d.lineTo(Z[X],Z[X+1]),d.lineTo(Z[G],Z[G+1]),d.closePath(),b&&b.value()}},{key:"trianglePolygons",value:Wc.mark((function l(){var d,b,Z;return Wc.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:d=this.triangles,b=0,Z=d.length/3;case 2:if(!(b<Z)){l.next=8;break}return l.next=5,this.trianglePolygon(b);case 5:++b,l.next=2;break;case 8:case"end":return l.stop()}}),l,this)}))},{key:"trianglePolygon",value:function(l){var d=new Mc;return this.renderTriangle(l,d),d.value()}}],[{key:"from",value:function(d){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Uc,Z=arguments.length>2&&void 0!==arguments[2]?arguments[2]:rc,c=arguments.length>3?arguments[3]:void 0;return new l("length"in d?fc(d,b,Z,c):Float64Array.from(Ec(d,b,Z,c)))}}]),l}();function fc(l,d,b,Z){for(var c=l.length,m=new Float64Array(2*c),X=0;X<c;++X){var G=l[X];m[2*X]=d.call(Z,G,X,l),m[2*X+1]=b.call(Z,G,X,l)}return m}function Ec(l,d,b,Z){var c,m,X,G;return Wc.wrap((function(W){for(;;)switch(W.prev=W.next){case 0:c=0,m=gc(l),W.prev=2,m.s();case 4:if((X=m.n()).done){W.next=13;break}return G=X.value,W.next=8,d.call(Z,G,c,l);case 8:return W.next=10,b.call(Z,G,c,l);case 10:++c;case 11:W.next=4;break;case 13:W.next=18;break;case 15:W.prev=15,W.t0=W.catch(2),m.e(W.t0);case 18:return W.prev=18,m.f(),W.finish(18);case 21:case"end":return W.stop()}}),Nc,null,[[2,15,18,21]])}function Oc(l,d){return null==l||null==d?NaN:l<d?-1:l>d?1:l>=d?0:NaN}function Dc(l){var d=l,b=l,Z=l;function c(l,d){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,m=arguments.length>3&&void 0!==arguments[3]?arguments[3]:l.length;if(c<m){if(0!==b(d,d))return m;do{var X=c+m>>>1;Z(l[X],d)<0?c=X+1:m=X}while(c<m)}return c}return 2!==l.length&&(d=function(d,b){return l(d)-b},b=Oc,Z=function(d,b){return Oc(l(d),b)}),{left:c,center:function(l,b){var Z=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,m=arguments.length>3&&void 0!==arguments[3]?arguments[3]:l.length,X=c(l,b,Z,m-1);return X>Z&&d(l[X-1],b)>-d(l[X],b)?X-1:X},right:function(l,d){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,m=arguments.length>3&&void 0!==arguments[3]?arguments[3]:l.length;if(c<m){if(0!==b(d,d))return m;do{var X=c+m>>>1;Z(l[X],d)<=0?c=X+1:m=X}while(c<m)}return c}}}var Ac=Dc(Oc).right;Dc((function(l){return null===l?NaN:+l})).center;var _c=Ac,qc=Math.sqrt(50),$c=Math.sqrt(10),lm=Math.sqrt(2);function dm(l,d,b){var Z=(d-l)/Math.max(0,b),c=Math.floor(Math.log(Z)/Math.LN10),m=Z/Math.pow(10,c);return c>=0?(m>=qc?10:m>=$c?5:m>=lm?2:1)*Math.pow(10,c):-Math.pow(10,-c)/(m>=qc?10:m>=$c?5:m>=lm?2:1)}function bm(l,d){switch(arguments.length){case 0:break;case 1:this.range(l);break;default:this.range(d).domain(l)}return this}function Zm(l,d,b){l.prototype=d.prototype=b,b.constructor=l}function cm(l,d){var b=Object.create(l.prototype);for(var Z in d)b[Z]=d[Z];return b}function mm(){}var Xm=.7,Gm=1/Xm,Wm="\\s*([+-]?\\d+)\\s*",um="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",am="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",hm=/^#([0-9a-f]{3,8})$/,sm=new RegExp("^rgb\\(".concat(Wm,",").concat(Wm,",").concat(Wm,"\\)$")),Vm=new RegExp("^rgb\\(".concat(am,",").concat(am,",").concat(am,"\\)$")),ym=new RegExp("^rgba\\(".concat(Wm,",").concat(Wm,",").concat(Wm,",").concat(um,"\\)$")),pm=new RegExp("^rgba\\(".concat(am,",").concat(am,",").concat(am,",").concat(um,"\\)$")),tm=new RegExp("^hsl\\(".concat(um,",").concat(am,",").concat(am,"\\)$")),nm=new RegExp("^hsla\\(".concat(um,",").concat(am,",").concat(am,",").concat(um,"\\)$")),im={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function Rm(){return this.rgb().formatHex()}function om(){return this.rgb().formatRgb()}function Lm(l){var d,b;return l=(l+"").trim().toLowerCase(),(d=hm.exec(l))?(b=d[1].length,d=parseInt(d[1],16),6===b?Km(d):3===b?new Ym(d>>8&15|d>>4&240,d>>4&15|240&d,(15&d)<<4|15&d,1):8===b?Hm(d>>24&255,d>>16&255,d>>8&255,(255&d)/255):4===b?Hm(d>>12&15|d>>8&240,d>>8&15|d>>4&240,d>>4&15|240&d,((15&d)<<4|15&d)/255):null):(d=sm.exec(l))?new Ym(d[1],d[2],d[3],1):(d=Vm.exec(l))?new Ym(255*d[1]/100,255*d[2]/100,255*d[3]/100,1):(d=ym.exec(l))?Hm(d[1],d[2],d[3],d[4]):(d=pm.exec(l))?Hm(255*d[1]/100,255*d[2]/100,255*d[3]/100,d[4]):(d=tm.exec(l))?Mm(d[1],d[2]/100,d[3]/100,1):(d=nm.exec(l))?Mm(d[1],d[2]/100,d[3]/100,d[4]):im.hasOwnProperty(l)?Km(im[l]):"transparent"===l?new Ym(NaN,NaN,NaN,0):null}function Km(l){return new Ym(l>>16&255,l>>8&255,255&l,1)}function Hm(l,d,b,Z){return Z<=0&&(l=d=b=NaN),new Ym(l,d,b,Z)}function xm(l){return l instanceof mm||(l=Lm(l)),l?new Ym((l=l.rgb()).r,l.g,l.b,l.opacity):new Ym}function Sm(l,d,b,Z){return 1===arguments.length?xm(l):new Ym(l,d,b,null==Z?1:Z)}function Ym(l,d,b,Z){this.r=+l,this.g=+d,this.b=+b,this.opacity=+Z}function em(){return"#".concat(Tm(this.r)).concat(Tm(this.g)).concat(Tm(this.b))}function Jm(){var l=zm(this.opacity);return"".concat(1===l?"rgb(":"rgba(").concat(vm(this.r),", ").concat(vm(this.g),", ").concat(vm(this.b)).concat(1===l?")":", ".concat(l,")"))}function zm(l){return isNaN(l)?1:Math.max(0,Math.min(1,l))}function vm(l){return Math.max(0,Math.min(255,Math.round(l)||0))}function Tm(l){return((l=vm(l))<16?"0":"")+l.toString(16)}function Mm(l,d,b,Z){return Z<=0?l=d=b=NaN:b<=0||b>=1?l=d=NaN:d<=0&&(l=NaN),new Fm(l,d,b,Z)}function Cm(l){if(l instanceof Fm)return new Fm(l.h,l.s,l.l,l.opacity);if(l instanceof mm||(l=Lm(l)),!l)return new Fm;if(l instanceof Fm)return l;var d=(l=l.rgb()).r/255,b=l.g/255,Z=l.b/255,c=Math.min(d,b,Z),m=Math.max(d,b,Z),X=NaN,G=m-c,W=(m+c)/2;return G?(X=d===m?(b-Z)/G+6*(b<Z):b===m?(Z-d)/G+2:(d-b)/G+4,G/=W<.5?m+c:2-m-c,X*=60):G=W>0&&W<1?0:X,new Fm(X,G,W,l.opacity)}function Fm(l,d,b,Z){this.h=+l,this.s=+d,this.l=+b,this.opacity=+Z}function Im(l){return(l=(l||0)%360)<0?l+360:l}function km(l){return Math.max(0,Math.min(1,l||0))}function Nm(l,d,b){return 255*(l<60?d+(b-d)*l/60:l<180?b:l<240?d+(b-d)*(240-l)/60:d)}Zm(mm,Lm,{copy:function(l){return Object.assign(new this.constructor,this,l)},displayable:function(){return this.rgb().displayable()},hex:Rm,formatHex:Rm,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return Cm(this).formatHsl()},formatRgb:om,toString:om}),Zm(Ym,Sm,cm(mm,{brighter:function(l){return l=null==l?Gm:Math.pow(Gm,l),new Ym(this.r*l,this.g*l,this.b*l,this.opacity)},darker:function(l){return l=null==l?Xm:Math.pow(Xm,l),new Ym(this.r*l,this.g*l,this.b*l,this.opacity)},rgb:function(){return this},clamp:function(){return new Ym(vm(this.r),vm(this.g),vm(this.b),zm(this.opacity))},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:em,formatHex:em,formatHex8:function(){return"#".concat(Tm(this.r)).concat(Tm(this.g)).concat(Tm(this.b)).concat(Tm(255*(isNaN(this.opacity)?1:this.opacity)))},formatRgb:Jm,toString:Jm})),Zm(Fm,(function(l,d,b,Z){return 1===arguments.length?Cm(l):new Fm(l,d,b,null==Z?1:Z)}),cm(mm,{brighter:function(l){return l=null==l?Gm:Math.pow(Gm,l),new Fm(this.h,this.s,this.l*l,this.opacity)},darker:function(l){return l=null==l?Xm:Math.pow(Xm,l),new Fm(this.h,this.s,this.l*l,this.opacity)},rgb:function(){var l=this.h%360+360*(this.h<0),d=isNaN(l)||isNaN(this.s)?0:this.s,b=this.l,Z=b+(b<.5?b:1-b)*d,c=2*b-Z;return new Ym(Nm(l>=240?l-240:l+120,c,Z),Nm(l,c,Z),Nm(l<120?l+240:l-120,c,Z),this.opacity)},clamp:function(){return new Fm(Im(this.h),km(this.s),km(this.l),zm(this.opacity))},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var l=zm(this.opacity);return"".concat(1===l?"hsl(":"hsla(").concat(Im(this.h),", ").concat(100*km(this.s),"%, ").concat(100*km(this.l),"%").concat(1===l?")":", ".concat(l,")"))}}));var gm=function(l){return function(){return l}};function Pm(l){return 1==(l=+l)?Bm:function(d,b){return b-d?function(l,d,b){return l=Math.pow(l,b),d=Math.pow(d,b)-l,b=1/b,function(Z){return Math.pow(l+Z*d,b)}}(d,b,l):gm(isNaN(d)?b:d)}}function Bm(l,d){var b=d-l;return b?function(l,d){return function(b){return l+b*d}}(l,b):gm(isNaN(l)?d:l)}var wm=function l(d){var b=Pm(d);function Z(l,d){var Z=b((l=Sm(l)).r,(d=Sm(d)).r),c=b(l.g,d.g),m=b(l.b,d.b),X=Bm(l.opacity,d.opacity);return function(d){return l.r=Z(d),l.g=c(d),l.b=m(d),l.opacity=X(d),l+""}}return Z.gamma=l,Z}(1);function Um(l,d){d||(d=[]);var b,Z=l?Math.min(d.length,l.length):0,c=d.slice();return function(m){for(b=0;b<Z;++b)c[b]=l[b]*(1-m)+d[b]*m;return c}}function rm(l,d){var b,Z=d?d.length:0,c=l?Math.min(Z,l.length):0,m=new Array(c),X=new Array(Z);for(b=0;b<c;++b)m[b]=Am(l[b],d[b]);for(;b<Z;++b)X[b]=d[b];return function(l){for(b=0;b<c;++b)X[b]=m[b](l);return X}}function Qm(l,d){var b=new Date;return l=+l,d=+d,function(Z){return b.setTime(l*(1-Z)+d*Z),b}}function jm(l,d){return l=+l,d=+d,function(b){return l*(1-b)+d*b}}function fm(l,d){var b,Z={},c={};for(b in null!==l&&"object"===h(l)||(l={}),null!==d&&"object"===h(d)||(d={}),d)b in l?Z[b]=Am(l[b],d[b]):c[b]=d[b];return function(l){for(b in Z)c[b]=Z[b](l);return c}}var Em=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Om=new RegExp(Em.source,"g");function Dm(l,d){var b,Z,c,m=Em.lastIndex=Om.lastIndex=0,X=-1,G=[],W=[];for(l+="",d+="";(b=Em.exec(l))&&(Z=Om.exec(d));)(c=Z.index)>m&&(c=d.slice(m,c),G[X]?G[X]+=c:G[++X]=c),(b=b[0])===(Z=Z[0])?G[X]?G[X]+=Z:G[++X]=Z:(G[++X]=null,W.push({i:X,x:jm(b,Z)})),m=Om.lastIndex;return m<d.length&&(c=d.slice(m),G[X]?G[X]+=c:G[++X]=c),G.length<2?W[0]?function(l){return function(d){return l(d)+""}}(W[0].x):function(l){return function(){return l}}(d):(d=W.length,function(l){for(var b,Z=0;Z<d;++Z)G[(b=W[Z]).i]=b.x(l);return G.join("")})}function Am(l,d){var b,Z,c=h(d);return null==d||"boolean"===c?gm(d):("number"===c?jm:"string"===c?(b=Lm(d))?(d=b,wm):Dm:d instanceof Lm?wm:d instanceof Date?Qm:(Z=d,!ArrayBuffer.isView(Z)||Z instanceof DataView?Array.isArray(d)?rm:"function"!=typeof d.valueOf&&"function"!=typeof d.toString||isNaN(d)?fm:jm:Um))(l,d)}function _m(l,d){return l=+l,d=+d,function(b){return Math.round(l*(1-b)+d*b)}}function qm(l){return+l}var $m=[0,1];function lX(l){return l}function dX(l,d){return(d-=l=+l)?function(b){return(b-l)/d}:(b=isNaN(d)?NaN:.5,function(){return b});var b}function bX(l,d,b){var Z=l[0],c=l[1],m=d[0],X=d[1];return c<Z?(Z=dX(c,Z),m=b(X,m)):(Z=dX(Z,c),m=b(m,X)),function(l){return m(Z(l))}}function ZX(l,d,b){var Z=Math.min(l.length,d.length)-1,c=new Array(Z),m=new Array(Z),X=-1;for(l[Z]<l[0]&&(l=l.slice().reverse(),d=d.slice().reverse());++X<Z;)c[X]=dX(l[X],l[X+1]),m[X]=b(d[X],d[X+1]);return function(d){var b=_c(l,d,1,Z)-1;return m[b](c[b](d))}}function cX(l,d){return d.domain(l.domain()).range(l.range()).interpolate(l.interpolate()).clamp(l.clamp()).unknown(l.unknown())}function mX(){var l,d,b,Z,c,m,X=$m,G=$m,W=Am,u=lX;function a(){var l,d,b,W=Math.min(X.length,G.length);return u!==lX&&(l=X[0],d=X[W-1],l>d&&(b=l,l=d,d=b),u=function(b){return Math.max(l,Math.min(d,b))}),Z=W>2?ZX:bX,c=m=null,h}function h(d){return null==d||isNaN(d=+d)?b:(c||(c=Z(X.map(l),G,W)))(l(u(d)))}return h.invert=function(b){return u(d((m||(m=Z(G,X.map(l),jm)))(b)))},h.domain=function(l){return arguments.length?(X=Array.from(l,qm),a()):X.slice()},h.range=function(l){return arguments.length?(G=Array.from(l),a()):G.slice()},h.rangeRound=function(l){return G=Array.from(l),W=_m,a()},h.clamp=function(l){return arguments.length?(u=!!l||lX,a()):u!==lX},h.interpolate=function(l){return arguments.length?(W=l,a()):W},h.unknown=function(l){return arguments.length?(b=l,h):b},function(b,Z){return l=b,d=Z,a()}}function XX(){return mX()(lX,lX)}function GX(l,d){if((b=(l=d?l.toExponential(d-1):l.toExponential()).indexOf("e"))<0)return null;var b,Z=l.slice(0,b);return[Z.length>1?Z[0]+Z.slice(2):Z,+l.slice(b+1)]}function WX(l){return(l=GX(Math.abs(l)))?l[1]:NaN}var uX,aX=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function hX(l){if(!(d=aX.exec(l)))throw new Error("invalid format: "+l);var d;return new sX({fill:d[1],align:d[2],sign:d[3],symbol:d[4],zero:d[5],width:d[6],comma:d[7],precision:d[8]&&d[8].slice(1),trim:d[9],type:d[10]})}function sX(l){this.fill=void 0===l.fill?" ":l.fill+"",this.align=void 0===l.align?">":l.align+"",this.sign=void 0===l.sign?"-":l.sign+"",this.symbol=void 0===l.symbol?"":l.symbol+"",this.zero=!!l.zero,this.width=void 0===l.width?void 0:+l.width,this.comma=!!l.comma,this.precision=void 0===l.precision?void 0:+l.precision,this.trim=!!l.trim,this.type=void 0===l.type?"":l.type+""}function VX(l,d){var b=GX(l,d);if(!b)return l+"";var Z=b[0],c=b[1];return c<0?"0."+new Array(-c).join("0")+Z:Z.length>c+1?Z.slice(0,c+1)+"."+Z.slice(c+1):Z+new Array(c-Z.length+2).join("0")}hX.prototype=sX.prototype,sX.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var yX={"%":function(l,d){return(100*l).toFixed(d)},b:function(l){return Math.round(l).toString(2)},c:function(l){return l+""},d:function(l){return Math.abs(l=Math.round(l))>=1e21?l.toLocaleString("en").replace(/,/g,""):l.toString(10)},e:function(l,d){return l.toExponential(d)},f:function(l,d){return l.toFixed(d)},g:function(l,d){return l.toPrecision(d)},o:function(l){return Math.round(l).toString(8)},p:function(l,d){return VX(100*l,d)},r:VX,s:function(l,d){var b=GX(l,d);if(!b)return l+"";var Z=b[0],c=b[1],m=c-(uX=3*Math.max(-8,Math.min(8,Math.floor(c/3))))+1,X=Z.length;return m===X?Z:m>X?Z+new Array(m-X+1).join("0"):m>0?Z.slice(0,m)+"."+Z.slice(m):"0."+new Array(1-m).join("0")+GX(l,Math.max(0,d+m-1))[0]},X:function(l){return Math.round(l).toString(16).toUpperCase()},x:function(l){return Math.round(l).toString(16)}};function pX(l){return l}var tX,nX,iX,RX=Array.prototype.map,oX=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function LX(l){var d,b,Z=void 0===l.grouping||void 0===l.thousands?pX:(d=RX.call(l.grouping,Number),b=l.thousands+"",function(l,Z){for(var c=l.length,m=[],X=0,G=d[0],W=0;c>0&&G>0&&(W+G+1>Z&&(G=Math.max(1,Z-W)),m.push(l.substring(c-=G,c+G)),!((W+=G+1)>Z));)G=d[X=(X+1)%d.length];return m.reverse().join(b)}),c=void 0===l.currency?"":l.currency[0]+"",m=void 0===l.currency?"":l.currency[1]+"",X=void 0===l.decimal?".":l.decimal+"",G=void 0===l.numerals?pX:function(l){return function(d){return d.replace(/[0-9]/g,(function(d){return l[+d]}))}}(RX.call(l.numerals,String)),W=void 0===l.percent?"%":l.percent+"",u=void 0===l.minus?"−":l.minus+"",a=void 0===l.nan?"NaN":l.nan+"";function h(l){var d=(l=hX(l)).fill,b=l.align,h=l.sign,s=l.symbol,V=l.zero,y=l.width,p=l.comma,t=l.precision,n=l.trim,i=l.type;"n"===i?(p=!0,i="g"):yX[i]||(void 0===t&&(t=12),n=!0,i="g"),(V||"0"===d&&"="===b)&&(V=!0,d="0",b="=");var R="$"===s?c:"#"===s&&/[boxX]/.test(i)?"0"+i.toLowerCase():"",o="$"===s?m:/[%p]/.test(i)?W:"",L=yX[i],K=/[defgprs%]/.test(i);function H(l){var c,m,W,s=R,H=o;if("c"===i)H=L(l)+H,l="";else{var x=(l=+l)<0||1/l<0;if(l=isNaN(l)?a:L(Math.abs(l),t),n&&(l=function(l){l:for(var d,b=l.length,Z=1,c=-1;Z<b;++Z)switch(l[Z]){case".":c=d=Z;break;case"0":0===c&&(c=Z),d=Z;break;default:if(!+l[Z])break l;c>0&&(c=0)}return c>0?l.slice(0,c)+l.slice(d+1):l}(l)),x&&0==+l&&"+"!==h&&(x=!1),s=(x?"("===h?h:u:"-"===h||"("===h?"":h)+s,H=("s"===i?oX[8+uX/3]:"")+H+(x&&"("===h?")":""),K)for(c=-1,m=l.length;++c<m;)if(48>(W=l.charCodeAt(c))||W>57){H=(46===W?X+l.slice(c+1):l.slice(c))+H,l=l.slice(0,c);break}}p&&!V&&(l=Z(l,1/0));var S=s.length+l.length+H.length,Y=S<y?new Array(y-S+1).join(d):"";switch(p&&V&&(l=Z(Y+l,Y.length?y-H.length:1/0),Y=""),b){case"<":l=s+l+H+Y;break;case"=":l=s+Y+l+H;break;case"^":l=Y.slice(0,S=Y.length>>1)+s+l+H+Y.slice(S);break;default:l=Y+s+l+H}return G(l)}return t=void 0===t?6:/[gprs]/.test(i)?Math.max(1,Math.min(21,t)):Math.max(0,Math.min(20,t)),H.toString=function(){return l+""},H}return{format:h,formatPrefix:function(l,d){var b=h(((l=hX(l)).type="f",l)),Z=3*Math.max(-8,Math.min(8,Math.floor(WX(d)/3))),c=Math.pow(10,-Z),m=oX[8+Z/3];return function(l){return b(c*l)+m}}}}function KX(l,d,b,Z){var c,m=function(l,d,b){var Z=Math.abs(d-l)/Math.max(0,b),c=Math.pow(10,Math.floor(Math.log(Z)/Math.LN10)),m=Z/c;return m>=qc?c*=10:m>=$c?c*=5:m>=lm&&(c*=2),d<l?-c:c}(l,d,b);switch((Z=hX(null==Z?",f":Z)).type){case"s":var X=Math.max(Math.abs(l),Math.abs(d));return null!=Z.precision||isNaN(c=function(l,d){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(WX(d)/3)))-WX(Math.abs(l)))}(m,X))||(Z.precision=c),iX(Z,X);case"":case"e":case"g":case"p":case"r":null!=Z.precision||isNaN(c=function(l,d){return l=Math.abs(l),d=Math.abs(d)-l,Math.max(0,WX(d)-WX(l))+1}(m,Math.max(Math.abs(l),Math.abs(d))))||(Z.precision=c-("e"===Z.type));break;case"f":case"%":null!=Z.precision||isNaN(c=function(l){return Math.max(0,-WX(Math.abs(l)))}(m))||(Z.precision=c-2*("%"===Z.type))}return nX(Z)}function HX(l){var d=l.domain;return l.ticks=function(l){var b=d();return function(l,d,b){var Z,c,m,X,G=-1;if(b=+b,(l=+l)==(d=+d)&&b>0)return[l];if((Z=d<l)&&(c=l,l=d,d=c),0===(X=dm(l,d,b))||!isFinite(X))return[];if(X>0){var W=Math.round(l/X),u=Math.round(d/X);for(W*X<l&&++W,u*X>d&&--u,m=new Array(c=u-W+1);++G<c;)m[G]=(W+G)*X}else{X=-X;var a=Math.round(l*X),h=Math.round(d*X);for(a/X<l&&++a,h/X>d&&--h,m=new Array(c=h-a+1);++G<c;)m[G]=(a+G)/X}return Z&&m.reverse(),m}(b[0],b[b.length-1],null==l?10:l)},l.tickFormat=function(l,b){var Z=d();return KX(Z[0],Z[Z.length-1],null==l?10:l,b)},l.nice=function(b){null==b&&(b=10);var Z,c,m=d(),X=0,G=m.length-1,W=m[X],u=m[G],a=10;for(u<W&&(c=W,W=u,u=c,c=X,X=G,G=c);a-- >0;){if((c=dm(W,u,b))===Z)return m[X]=W,m[G]=u,d(m);if(c>0)W=Math.floor(W/c)*c,u=Math.ceil(u/c)*c;else{if(!(c<0))break;W=Math.ceil(W*c)/c,u=Math.floor(u*c)/c}Z=c}return l},l}function xX(){var l=XX();return l.copy=function(){return cX(l,xX())},bm.apply(l,arguments),HX(l)}function SX(l,d){var b="undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(!b){if(Array.isArray(l)||(b=function(l,d){if(!l)return;if("string"==typeof l)return YX(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);"Object"===b&&l.constructor&&(b=l.constructor.name);if("Map"===b||"Set"===b)return Array.from(l);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return YX(l,d)}(l))||d&&l&&"number"==typeof l.length){b&&(l=b);var Z=0,c=function(){};return{s:c,n:function(){return Z>=l.length?{done:!0}:{done:!1,value:l[Z++]}},e:function(l){throw l},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,X=!0,G=!1;return{s:function(){b=b.call(l)},n:function(){var l=b.next();return X=l.done,l},e:function(l){G=!0,m=l},f:function(){try{X||null==b.return||b.return()}finally{if(G)throw m}}}}function YX(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}tX=LX({thousands:",",grouping:[3],currency:["$",""]}),nX=tX.format,iX=tX.formatPrefix;var eX=Wc.mark(vX);function JX(l,d){var b="undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(!b){if(Array.isArray(l)||(b=function(l,d){if(!l)return;if("string"==typeof l)return zX(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);"Object"===b&&l.constructor&&(b=l.constructor.name);if("Map"===b||"Set"===b)return Array.from(l);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return zX(l,d)}(l))||d&&l&&"number"==typeof l.length){b&&(l=b);var Z=0,c=function(){};return{s:c,n:function(){return Z>=l.length?{done:!0}:{done:!1,value:l[Z++]}},e:function(l){throw l},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,X=!0,G=!1;return{s:function(){b=b.call(l)},n:function(){var l=b.next();return X=l.done,l},e:function(l){G=!0,m=l},f:function(){try{X||null==b.return||b.return()}finally{if(G)throw m}}}}function zX(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}function vX(l){var d,b,Z;return Wc.wrap((function(c){for(;;)switch(c.prev=c.next){case 0:d=JX(l),c.prev=1,d.s();case 3:if((b=d.n()).done){c.next=8;break}return Z=b.value,c.delegateYield(Z,"t0",6);case 6:c.next=3;break;case 8:c.next=13;break;case 10:c.prev=10,c.t1=c.catch(1),d.e(c.t1);case 13:return c.prev=13,d.f(),c.finish(13);case 16:case"end":return c.stop()}}),eX,null,[[1,10,13,16]])}function TX(l,d){for(var b=d.length,Z=-1;++Z<b;){var c=MX(l,d[Z]);if(c)return c}return 0}function MX(l,d){for(var b=d[0],Z=d[1],c=-1,m=0,X=l.length,G=X-1;m<X;G=m++){var W=l[m],u=W[0],a=W[1],h=l[G],s=h[0],V=h[1];if(CX(W,h,d))return 0;a>Z!=V>Z&&b<(s-u)*(Z-a)/(V-a)+u&&(c=-c)}return c}function CX(l,d,b){var Z,c,m,X;return function(l,d,b){return(d[0]-l[0])*(b[1]-l[1])==(b[0]-l[0])*(d[1]-l[1])}(l,d,b)&&(c=l[Z=+(l[0]===d[0])],m=b[Z],X=d[Z],c<=m&&m<=X||X<=m&&m<=c)}function FX(l){for(var d=0,b=l.length,Z=l[b-1][1]*l[0][0]-l[b-1][0]*l[0][1];++d<b;)Z+=l[d-1][1]*l[d][0]-l[d-1][0]*l[d][1];return Z}function IX(l,d){var b="undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(!b){if(Array.isArray(l)||(b=function(l,d){if(!l)return;if("string"==typeof l)return kX(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);"Object"===b&&l.constructor&&(b=l.constructor.name);if("Map"===b||"Set"===b)return Array.from(l);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return kX(l,d)}(l))||d&&l&&"number"==typeof l.length){b&&(l=b);var Z=0,c=function(){};return{s:c,n:function(){return Z>=l.length?{done:!0}:{done:!1,value:l[Z++]}},e:function(l){throw l},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,X=!0,G=!1;return{s:function(){b=b.call(l)},n:function(){var l=b.next();return X=l.done,l},e:function(l){G=!0,m=l},f:function(){try{X||null==b.return||b.return()}finally{if(G)throw m}}}}function kX(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}function NX(l){var d,b=[],Z=[],c=IX(l);try{for(c.s();!(d=c.n()).done;){var m=d.value;FX(m)>0?b.push([m]):Z.push(m)}}catch(l){c.e(l)}finally{c.f()}return Z.forEach((function(l){for(var d,Z=0,c=b.length;Z<c;++Z)if(-1!==TX((d=b[Z])[0],l))return void d.push(l)})),b}function gX(l,d){var b="undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(!b){if(Array.isArray(l)||(b=function(l,d){if(!l)return;if("string"==typeof l)return PX(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);"Object"===b&&l.constructor&&(b=l.constructor.name);if("Map"===b||"Set"===b)return Array.from(l);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return PX(l,d)}(l))||d&&l&&"number"==typeof l.length){b&&(l=b);var Z=0,c=function(){};return{s:c,n:function(){return Z>=l.length?{done:!0}:{done:!1,value:l[Z++]}},e:function(l){throw l},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,X=!0,G=!1;return{s:function(){b=b.call(l)},n:function(){var l=b.next();return X=l.done,l},e:function(l){G=!0,m=l},f:function(){try{X||null==b.return||b.return()}finally{if(G)throw m}}}}function PX(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}function BX(){var l,d,b,Z=Wc.mark(y),c=Wc.mark(p),m=function(l){return l[0]},G=function(l){return l[1]},W=function(l){return isFinite(+l[2])?+l[2]:0},u=jc.from,a=function(l,d,Z){var c=b.points,m=[c[2*l],c[2*l+1]],X=[c[2*d],c[2*d+1]];return[Z*X[0]+(1-Z)*m[0],Z*X[1]+(1-Z)*m[1]]},s=NX;function V(Z){b=u(Z,m,G),d=Array.from(Z,W),"object"!==h(l)&&(l=xX().domain(function(l){var d,b,Z,c=SX(l);try{for(c.s();!(Z=c.n()).done;){var m=Z.value;null!=m&&(void 0===d?m>=m&&(d=b=m):(d>m&&(d=m),b<m&&(b=m)))}}catch(l){c.e(l)}finally{c.f()}return[d,b]}(d)).nice().ticks(l))}function y(c){var m,X,G,W;return Wc.wrap((function(Z){for(;;)switch(Z.prev=Z.next){case 0:V(c),m=gX(l),Z.prev=2,m.s();case 4:if((X=m.n()).done){Z.next=11;break}return G=X.value,W=R(b,d,G),Z.next=9,{type:"MultiPolygon",coordinates:W,value:G};case 9:Z.next=4;break;case 11:Z.next=16;break;case 13:Z.prev=13,Z.t0=Z.catch(2),m.e(Z.t0);case 16:return Z.prev=16,m.f(),Z.finish(16);case 19:case"end":return Z.stop()}}),Z,null,[[2,13,16,19]])}function p(Z){var m,X,G,W,u,a;return Wc.wrap((function(c){for(;;)switch(c.prev=c.next){case 0:V(Z),W=gX(l),c.prev=2,W.s();case 4:if((u=W.n()).done){c.next=14;break}if(a=u.value,X&&(m=X),h=R(b,d,a),X=Array.from(vX(h)),!m){c.next=11;break}return c.next=11,{type:"MultiPolygon",coordinates:s(m.concat(X.map((function(l){return l.slice().reverse()})))),value:G,valueMax:a};case 11:G=a;case 12:c.next=4;break;case 14:c.next=19;break;case 16:c.prev=16,c.t0=c.catch(2),W.e(c.t0);case 19:return c.prev=19,W.f(),c.finish(19);case 22:case"end":return c.stop()}var h}),c,null,[[2,16,19,22]])}var t=function(l){return X(y(l))};return t.x=function(l){return l?(m=l,t):m},t.y=function(l){return l?(G=l,t):G},t.value=function(l){return l?(W=l,t):W},t.thresholds=function(d){return d?(l=d,t):l},t.triangulate=function(l){return l?(u=l,t):u},t.pointInterpolate=function(l){return l?(a=l,t):a},t.ringsort=function(l){return l?(s=l,t):s},t.contours=y,t.contour=function(l,Z){return V(l),{type:"MultiPolygon",coordinates:R(b,d,Z),value:Z}},t.isobands=p,t._values=function(){return d},t._triangulation=function(){return b},t;function n(l){return l%3==2?l-2:l+1}function i(l){return l%3==0?l+2:l-1}function R(l,d){var b,Z=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,c=gX(d);try{for(c.s();!(b=c.n()).done;){var m=b.value;if(!isFinite(m))throw["Invalid value",m]}}catch(l){c.e(l)}finally{c.f()}var X=l.halfedges,G=l.hull,W=l.inedges,u=l.triangles,h=d.length;function V(l){return y(u[l],u[n(l)])}function y(l,b){var c=d[l],m=d[b];if(c<=Z&&m>=Z&&c<m)return(Z-c)/(m-c)}var p,t,R,o,L,K=[],H=new Uint8Array(X.length).fill(0);for(o=0;o<X.length;o++)if(!H[o]){for(t=o,p=[];(L=V(t))>0;){var x=[u[t],u[R=n(t)]],S=x[0],Y=x[1];if(p.length&&S===p[0].ti&&Y===p[0].tj||p.length>2*h)break;if(H[t]=1,p.push({ti:S,tj:Y,a:L}),(R=X[t])>-1){if(V(R=n(R))>0){t=R;continue}if(V(R=n(R))>0){t=R;continue}}else{for(var e=(G.indexOf(u[t])+1)%G.length;d[G[e]]<Z;)e=(e+1)%G.length;for(;d[G[e]]>=Z;)p.push({ti:G[e],tj:G[e],a:0}),e=(e+1)%G.length;if(R=W[G[e]],p.push({ti:G[e],tj:u[R],a:y(G[e],u[R])}),V(t=n(R))>0)continue;if(V(t=i(R))>0)continue}}p.length&&(p.push(p[0]),K.push(p.map((function(l){var d=l.ti,b=l.tj,Z=l.a;return a(d,b,Z)}))))}return G.every((function(l){return d[l]>=Z}))&&K.unshift(Array.from(G).concat([G[0]]).map((function(l){return a(l,l,0)}))),s(K)}}var wX=V(Object.freeze({__proto__:null,default:{}})),UX=y((function(l,d){var b;l.exports=(b=b||function(l,d){var b;if("undefined"!=typeof window&&window.crypto&&(b=window.crypto),"undefined"!=typeof self&&self.crypto&&(b=self.crypto),"undefined"!=typeof globalThis&&globalThis.crypto&&(b=globalThis.crypto),!b&&"undefined"!=typeof window&&window.msCrypto&&(b=window.msCrypto),!b&&void 0!==s&&s.crypto&&(b=s.crypto),!b)try{b=wX}catch(l){}var Z=function(){if(b){if("function"==typeof b.getRandomValues)try{return b.getRandomValues(new Uint32Array(1))[0]}catch(l){}if("function"==typeof b.randomBytes)try{return b.randomBytes(4).readInt32LE()}catch(l){}}throw new Error("Native crypto module could not be used to get secure random number.")},c=Object.create||function(){function l(){}return function(d){var b;return l.prototype=d,b=new l,l.prototype=null,b}}(),m={},X=m.lib={},G=X.Base={extend:function(l){var d=c(this);return l&&d.mixIn(l),d.hasOwnProperty("init")&&this.init!==d.init||(d.init=function(){d.$super.init.apply(this,arguments)}),d.init.prototype=d,d.$super=this,d},create:function(){var l=this.extend();return l.init.apply(l,arguments),l},init:function(){},mixIn:function(l){for(var d in l)l.hasOwnProperty(d)&&(this[d]=l[d]);l.hasOwnProperty("toString")&&(this.toString=l.toString)},clone:function(){return this.init.prototype.extend(this)}},W=X.WordArray=G.extend({init:function(l,b){l=this.words=l||[],this.sigBytes=b!=d?b:4*l.length},toString:function(l){return(l||a).stringify(this)},concat:function(l){var d=this.words,b=l.words,Z=this.sigBytes,c=l.sigBytes;if(this.clamp(),Z%4)for(var m=0;m<c;m++){var X=b[m>>>2]>>>24-m%4*8&255;d[Z+m>>>2]|=X<<24-(Z+m)%4*8}else for(var G=0;G<c;G+=4)d[Z+G>>>2]=b[G>>>2];return this.sigBytes+=c,this},clamp:function(){var d=this.words,b=this.sigBytes;d[b>>>2]&=4294967295<<32-b%4*8,d.length=l.ceil(b/4)},clone:function(){var l=G.clone.call(this);return l.words=this.words.slice(0),l},random:function(l){for(var d=[],b=0;b<l;b+=4)d.push(Z());return new W.init(d,l)}}),u=m.enc={},a=u.Hex={stringify:function(l){for(var d=l.words,b=l.sigBytes,Z=[],c=0;c<b;c++){var m=d[c>>>2]>>>24-c%4*8&255;Z.push((m>>>4).toString(16)),Z.push((15&m).toString(16))}return Z.join("")},parse:function(l){for(var d=l.length,b=[],Z=0;Z<d;Z+=2)b[Z>>>3]|=parseInt(l.substr(Z,2),16)<<24-Z%8*4;return new W.init(b,d/2)}},h=u.Latin1={stringify:function(l){for(var d=l.words,b=l.sigBytes,Z=[],c=0;c<b;c++){var m=d[c>>>2]>>>24-c%4*8&255;Z.push(String.fromCharCode(m))}return Z.join("")},parse:function(l){for(var d=l.length,b=[],Z=0;Z<d;Z++)b[Z>>>2]|=(255&l.charCodeAt(Z))<<24-Z%4*8;return new W.init(b,d)}},V=u.Utf8={stringify:function(l){try{return decodeURIComponent(escape(h.stringify(l)))}catch(l){throw new Error("Malformed UTF-8 data")}},parse:function(l){return h.parse(unescape(encodeURIComponent(l)))}},y=X.BufferedBlockAlgorithm=G.extend({reset:function(){this._data=new W.init,this._nDataBytes=0},_append:function(l){"string"==typeof l&&(l=V.parse(l)),this._data.concat(l),this._nDataBytes+=l.sigBytes},_process:function(d){var b,Z=this._data,c=Z.words,m=Z.sigBytes,X=this.blockSize,G=m/(4*X),u=(G=d?l.ceil(G):l.max((0|G)-this._minBufferSize,0))*X,a=l.min(4*u,m);if(u){for(var h=0;h<u;h+=X)this._doProcessBlock(c,h);b=c.splice(0,u),Z.sigBytes-=a}return new W.init(b,a)},clone:function(){var l=G.clone.call(this);return l._data=this._data.clone(),l},_minBufferSize:0});X.Hasher=y.extend({cfg:G.extend(),init:function(l){this.cfg=this.cfg.extend(l),this.reset()},reset:function(){y.reset.call(this),this._doReset()},update:function(l){return this._append(l),this._process(),this},finalize:function(l){return l&&this._append(l),this._doFinalize()},blockSize:16,_createHelper:function(l){return function(d,b){return new l.init(b).finalize(d)}},_createHmacHelper:function(l){return function(d,b){return new p.HMAC.init(l,b).finalize(d)}}});var p=m.algo={};return m}(Math),b)})),rX=y((function(l,d){l.exports=UX.enc.Utf8})),QX=y((function(l,d){var b;l.exports=(b=UX,function(){var l=b,d=l.lib.WordArray;function Z(l,b,Z){for(var c=[],m=0,X=0;X<b;X++)if(X%4){var G=Z[l.charCodeAt(X-1)]<<X%4*2|Z[l.charCodeAt(X)]>>>6-X%4*2;c[m>>>2]|=G<<24-m%4*8,m++}return d.create(c,m)}l.enc.Base64={stringify:function(l){var d=l.words,b=l.sigBytes,Z=this._map;l.clamp();for(var c=[],m=0;m<b;m+=3)for(var X=(d[m>>>2]>>>24-m%4*8&255)<<16|(d[m+1>>>2]>>>24-(m+1)%4*8&255)<<8|d[m+2>>>2]>>>24-(m+2)%4*8&255,G=0;G<4&&m+.75*G<b;G++)c.push(Z.charAt(X>>>6*(3-G)&63));var W=Z.charAt(64);if(W)for(;c.length%4;)c.push(W);return c.join("")},parse:function(l){var d=l.length,b=this._map,c=this._reverseMap;if(!c){c=this._reverseMap=[];for(var m=0;m<b.length;m++)c[b.charCodeAt(m)]=m}var X=b.charAt(64);if(X){var G=l.indexOf(X);-1!==G&&(d=G)}return Z(l,d,c)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),b.enc.Base64)}));function jX(l){return!(!$Z(l)||""===l)}function fX(l){var d=!1;return jX(l)?d=!isNaN(Number(l)):function(l){return"[object Number]"===Object.prototype.toString.call(l)}(l)&&(d=!0),d}function EX(l,d){return!!qZ(l)&&(!(!jX(d)&&!fX(d))&&d in l)}var OX="IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9lKGV4cG9ydHMpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZXhwb3J0cyJdLGUpOmUoKHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6dHx8c2VsZikudHVyZj17fSl9KHRoaXMsKGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT02MzcxMDA4Ljgsbj17Y2VudGltZXRlcnM6NjM3MTAwODgwLGNlbnRpbWV0cmVzOjYzNzEwMDg4MCxkZWdyZWVzOjU3LjIyODkxMzU0MTQzMjc0LGZlZXQ6MjA5MDIyNjAuNTExMzkyLGluY2hlczozOS4zNyplLGtpbG9tZXRlcnM6NjM3MS4wMDg4LGtpbG9tZXRyZXM6NjM3MS4wMDg4LG1ldGVyczplLG1ldHJlczplLG1pbGVzOjM5NTguNzYxMzMzODEwNTQ2LG1pbGxpbWV0ZXJzOjYzNzEwMDg4MDAsbWlsbGltZXRyZXM6NjM3MTAwODgwMCxuYXV0aWNhbG1pbGVzOmUvMTg1MixyYWRpYW5zOjEseWFyZHM6Njk2NzMzNS4yMjM2Nzk5OTl9LHI9e2NlbnRpbWV0ZXJzOjEwMCxjZW50aW1ldHJlczoxMDAsZGVncmVlczoxLzExMTMyNSxmZWV0OjMuMjgwODQsaW5jaGVzOjM5LjM3LGtpbG9tZXRlcnM6LjAwMSxraWxvbWV0cmVzOi4wMDEsbWV0ZXJzOjEsbWV0cmVzOjEsbWlsZXM6MS8xNjA5LjM0NCxtaWxsaW1ldGVyczoxZTMsbWlsbGltZXRyZXM6MWUzLG5hdXRpY2FsbWlsZXM6MS8xODUyLHJhZGlhbnM6MS9lLHlhcmRzOjEuMDkzNjEzM30saT17YWNyZXM6MjQ3MTA1ZS05LGNlbnRpbWV0ZXJzOjFlNCxjZW50aW1ldHJlczoxZTQsZmVldDoxMC43NjM5MTA0MTcsaGVjdGFyZXM6MWUtNCxpbmNoZXM6MTU1MC4wMDMxMDAwMDYsa2lsb21ldGVyczoxZS02LGtpbG9tZXRyZXM6MWUtNixtZXRlcnM6MSxtZXRyZXM6MSxtaWxlczozODZlLTksbWlsbGltZXRlcnM6MWU2LG1pbGxpbWV0cmVzOjFlNix5YXJkczoxLjE5NTk5MDA0Nn07ZnVuY3Rpb24gbyh0LGUsbil7dm9pZCAwPT09biYmKG49e30pO3ZhciByPXt0eXBlOiJGZWF0dXJlIn07cmV0dXJuKDA9PT1uLmlkfHxuLmlkKSYmKHIuaWQ9bi5pZCksbi5iYm94JiYoci5iYm94PW4uYmJveCksci5wcm9wZXJ0aWVzPWV8fHt9LHIuZ2VvbWV0cnk9dCxyfWZ1bmN0aW9uIHModCxlLG4pe3N3aXRjaCh0KXtjYXNlIlBvaW50IjpyZXR1cm4gYShlKS5nZW9tZXRyeTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBoKGUpLmdlb21ldHJ5O2Nhc2UiUG9seWdvbiI6cmV0dXJuIGwoZSkuZ2VvbWV0cnk7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gZChlKS5nZW9tZXRyeTtjYXNlIk11bHRpTGluZVN0cmluZyI6cmV0dXJuIGcoZSkuZ2VvbWV0cnk7Y2FzZSJNdWx0aVBvbHlnb24iOnJldHVybiB5KGUpLmdlb21ldHJ5O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKHQrIiBpcyBpbnZhbGlkIil9fWZ1bmN0aW9uIGEodCxlLG4pe2lmKHZvaWQgMD09PW4mJihuPXt9KSwhdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Iik7aWYodC5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYXQgbGVhc3QgMiBudW1iZXJzIGxvbmciKTtpZighQyh0WzBdKXx8IUModFsxXSkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGNvbnRhaW4gbnVtYmVycyIpO3JldHVybiBvKHt0eXBlOiJQb2ludCIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiB1KHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLGYodC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQsZSl9KSksbil9ZnVuY3Rpb24gbCh0LGUsbil7dm9pZCAwPT09biYmKG49e30pO2Zvcih2YXIgcj0wLGk9dDtyPGkubGVuZ3RoO3IrKyl7dmFyIHM9aVtyXTtpZihzLmxlbmd0aDw0KXRocm93IG5ldyBFcnJvcigiRWFjaCBMaW5lYXJSaW5nIG9mIGEgUG9seWdvbiBtdXN0IGhhdmUgNCBvciBtb3JlIFBvc2l0aW9ucy4iKTtmb3IodmFyIGE9MDthPHNbcy5sZW5ndGgtMV0ubGVuZ3RoO2ErKylpZihzW3MubGVuZ3RoLTFdW2FdIT09c1swXVthXSl0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFuZCBsYXN0IFBvc2l0aW9uIGFyZSBub3QgZXF1aXZhbGVudC4iKX1yZXR1cm4gbyh7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiBjKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLGYodC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBsKHQsZSl9KSksbil9ZnVuY3Rpb24gaCh0LGUsbil7aWYodm9pZCAwPT09biYmKG49e30pLHQubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIGFycmF5IG9mIHR3byBvciBtb3JlIHBvc2l0aW9ucyIpO3JldHVybiBvKHt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIHAodCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj17fSksZih0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGgodCxlKX0pKSxuKX1mdW5jdGlvbiBmKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiJ9O3JldHVybiBlLmlkJiYobi5pZD1lLmlkKSxlLmJib3gmJihuLmJib3g9ZS5iYm94KSxuLmZlYXR1cmVzPXQsbn1mdW5jdGlvbiBnKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLG8oe3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiBkKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLG8oe3R5cGU6Ik11bHRpUG9pbnQiLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24geSh0LGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPXt9KSxvKHt0eXBlOiJNdWx0aVBvbHlnb24iLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24gdih0LGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPXt9KSxvKHt0eXBlOiJHZW9tZXRyeUNvbGxlY3Rpb24iLGdlb21ldHJpZXM6dH0sZSxuKX1mdW5jdGlvbiBfKHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9MCksZSYmIShlPj0wKSl0aHJvdyBuZXcgRXJyb3IoInByZWNpc2lvbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7dmFyIG49TWF0aC5wb3coMTAsZXx8MCk7cmV0dXJuIE1hdGgucm91bmQodCpuKS9ufWZ1bmN0aW9uIG0odCxlKXt2b2lkIDA9PT1lJiYoZT0ia2lsb21ldGVycyIpO3ZhciByPW5bZV07aWYoIXIpdGhyb3cgbmV3IEVycm9yKGUrIiB1bml0cyBpcyBpbnZhbGlkIik7cmV0dXJuIHQqcn1mdW5jdGlvbiB4KHQsZSl7dm9pZCAwPT09ZSYmKGU9ImtpbG9tZXRlcnMiKTt2YXIgcj1uW2VdO2lmKCFyKXRocm93IG5ldyBFcnJvcihlKyIgdW5pdHMgaXMgaW52YWxpZCIpO3JldHVybiB0L3J9ZnVuY3Rpb24gRSh0LGUpe3JldHVybiB3KHgodCxlKSl9ZnVuY3Rpb24gYih0KXt2YXIgZT10JTM2MDtyZXR1cm4gZTwwJiYoZSs9MzYwKSxlfWZ1bmN0aW9uIHcodCl7cmV0dXJuIDE4MCoodCUoMipNYXRoLlBJKSkvTWF0aC5QSX1mdW5jdGlvbiBJKHQpe3JldHVybiB0JTM2MCpNYXRoLlBJLzE4MH1mdW5jdGlvbiBOKHQsZSxuKXtpZih2b2lkIDA9PT1lJiYoZT0ia2lsb21ldGVycyIpLHZvaWQgMD09PW4mJihuPSJraWxvbWV0ZXJzIiksISh0Pj0wKSl0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIG0oeCh0LGUpLG4pfWZ1bmN0aW9uIFModCxlLG4pe2lmKHZvaWQgMD09PWUmJihlPSJtZXRlcnMiKSx2b2lkIDA9PT1uJiYobj0ia2lsb21ldGVycyIpLCEodD49MCkpdGhyb3cgbmV3IEVycm9yKCJhcmVhIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTt2YXIgcj1pW2VdO2lmKCFyKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBvcmlnaW5hbCB1bml0cyIpO3ZhciBvPWlbbl07aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZpbmFsIHVuaXRzIik7cmV0dXJuIHQvcipvfWZ1bmN0aW9uIEModCl7cmV0dXJuIWlzTmFOKHQpJiZudWxsIT09dCYmIUFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gUCh0KXtyZXR1cm4hIXQmJnQuY29uc3RydWN0b3I9PT1PYmplY3R9ZnVuY3Rpb24gTSh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImJib3ggaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBiZSBhbiBBcnJheSIpO2lmKDQhPT10Lmxlbmd0aCYmNiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiYmJveCBtdXN0IGJlIGFuIEFycmF5IG9mIDQgb3IgNiBudW1iZXJzIik7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighQyh0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBvbmx5IGNvbnRhaW4gbnVtYmVycyIpfSkpfWZ1bmN0aW9uIEwodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJpZCBpcyByZXF1aXJlZCIpO2lmKC0xPT09WyJzdHJpbmciLCJudW1iZXIiXS5pbmRleE9mKHR5cGVvZiB0KSl0aHJvdyBuZXcgRXJyb3IoImlkIG11c3QgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmciKX12YXIgTz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxlYXJ0aFJhZGl1czplLGZhY3RvcnM6bix1bml0c0ZhY3RvcnM6cixhcmVhRmFjdG9yczppLGZlYXR1cmU6byxnZW9tZXRyeTpzLHBvaW50OmEscG9pbnRzOnUscG9seWdvbjpsLHBvbHlnb25zOmMsbGluZVN0cmluZzpoLGxpbmVTdHJpbmdzOnAsZmVhdHVyZUNvbGxlY3Rpb246ZixtdWx0aUxpbmVTdHJpbmc6ZyxtdWx0aVBvaW50OmQsbXVsdGlQb2x5Z29uOnksZ2VvbWV0cnlDb2xsZWN0aW9uOnYscm91bmQ6XyxyYWRpYW5zVG9MZW5ndGg6bSxsZW5ndGhUb1JhZGlhbnM6eCxsZW5ndGhUb0RlZ3JlZXM6RSxiZWFyaW5nVG9BemltdXRoOmIscmFkaWFuc1RvRGVncmVlczp3LGRlZ3JlZXNUb1JhZGlhbnM6SSxjb252ZXJ0TGVuZ3RoOk4sY29udmVydEFyZWE6Uyxpc051bWJlcjpDLGlzT2JqZWN0OlAsdmFsaWRhdGVCQm94Ok0sdmFsaWRhdGVJZDpMfSk7ZnVuY3Rpb24gUih0LGUsbil7aWYobnVsbCE9PXQpZm9yKHZhciByLGksbyxzLGEsdSxsLGMsaD0wLHA9MCxmPXQudHlwZSxnPSJGZWF0dXJlQ29sbGVjdGlvbiI9PT1mLGQ9IkZlYXR1cmUiPT09Zix5PWc/dC5mZWF0dXJlcy5sZW5ndGg6MSx2PTA7djx5O3YrKyl7YT0oYz0hIShsPWc/dC5mZWF0dXJlc1t2XS5nZW9tZXRyeTpkP3QuZ2VvbWV0cnk6dCkmJiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09bC50eXBlKT9sLmdlb21ldHJpZXMubGVuZ3RoOjE7Zm9yKHZhciBfPTA7XzxhO18rKyl7dmFyIG09MCx4PTA7aWYobnVsbCE9PShzPWM/bC5nZW9tZXRyaWVzW19dOmwpKXt1PXMuY29vcmRpbmF0ZXM7dmFyIEU9cy50eXBlO3N3aXRjaChoPSFufHwiUG9seWdvbiIhPT1FJiYiTXVsdGlQb2x5Z29uIiE9PUU/MDoxLEUpe2Nhc2UgbnVsbDpicmVhaztjYXNlIlBvaW50IjppZighMT09PWUodSxwLHYsbSx4KSlyZXR1cm4hMTtwKyssbSsrO2JyZWFrO2Nhc2UiTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvaW50Ijpmb3Iocj0wO3I8dS5sZW5ndGg7cisrKXtpZighMT09PWUodVtyXSxwLHYsbSx4KSlyZXR1cm4hMTtwKyssIk11bHRpUG9pbnQiPT09RSYmbSsrfSJMaW5lU3RyaW5nIj09PUUmJm0rKzticmVhaztjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpmb3Iocj0wO3I8dS5sZW5ndGg7cisrKXtmb3IoaT0wO2k8dVtyXS5sZW5ndGgtaDtpKyspe2lmKCExPT09ZSh1W3JdW2ldLHAsdixtLHgpKXJldHVybiExO3ArK30iTXVsdGlMaW5lU3RyaW5nIj09PUUmJm0rKywiUG9seWdvbiI9PT1FJiZ4Kyt9IlBvbHlnb24iPT09RSYmbSsrO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpmb3Iocj0wO3I8dS5sZW5ndGg7cisrKXtmb3IoeD0wLGk9MDtpPHVbcl0ubGVuZ3RoO2krKyl7Zm9yKG89MDtvPHVbcl1baV0ubGVuZ3RoLWg7bysrKXtpZighMT09PWUodVtyXVtpXVtvXSxwLHYsbSx4KSlyZXR1cm4hMTtwKyt9eCsrfW0rK31icmVhaztjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6Zm9yKHI9MDtyPHMuZ2VvbWV0cmllcy5sZW5ndGg7cisrKWlmKCExPT09UihzLmdlb21ldHJpZXNbcl0sZSxuKSlyZXR1cm4hMTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBHZW9tZXRyeSBUeXBlIil9fX19fWZ1bmN0aW9uIFQodCxlLG4scil7dmFyIGk9bjtyZXR1cm4gUih0LChmdW5jdGlvbih0LHIsbyxzLGEpe2k9MD09PXImJnZvaWQgMD09PW4/dDplKGksdCxyLG8scyxhKX0pLHIpLGl9ZnVuY3Rpb24gQSh0LGUpe3ZhciBuO3N3aXRjaCh0LnR5cGUpe2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOmZvcihuPTA7bjx0LmZlYXR1cmVzLmxlbmd0aCYmITEhPT1lKHQuZmVhdHVyZXNbbl0ucHJvcGVydGllcyxuKTtuKyspO2JyZWFrO2Nhc2UiRmVhdHVyZSI6ZSh0LnByb3BlcnRpZXMsMCl9fWZ1bmN0aW9uIEQodCxlLG4pe3ZhciByPW47cmV0dXJuIEEodCwoZnVuY3Rpb24odCxpKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSl9KSkscn1mdW5jdGlvbiBGKHQsZSl7aWYoIkZlYXR1cmUiPT09dC50eXBlKWUodCwwKTtlbHNlIGlmKCJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGUpZm9yKHZhciBuPTA7bjx0LmZlYXR1cmVzLmxlbmd0aCYmITEhPT1lKHQuZmVhdHVyZXNbbl0sbik7bisrKTt9ZnVuY3Rpb24gayh0LGUsbil7dmFyIHI9bjtyZXR1cm4gRih0LChmdW5jdGlvbih0LGkpe3I9MD09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxpKX0pKSxyfWZ1bmN0aW9uIEcodCl7dmFyIGU9W107cmV0dXJuIFIodCwoZnVuY3Rpb24odCl7ZS5wdXNoKHQpfSkpLGV9ZnVuY3Rpb24gcSh0LGUpe3ZhciBuLHIsaSxvLHMsYSx1LGwsYyxoLHA9MCxmPSJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGUsZz0iRmVhdHVyZSI9PT10LnR5cGUsZD1mP3QuZmVhdHVyZXMubGVuZ3RoOjE7Zm9yKG49MDtuPGQ7bisrKXtmb3IoYT1mP3QuZmVhdHVyZXNbbl0uZ2VvbWV0cnk6Zz90Lmdlb21ldHJ5OnQsbD1mP3QuZmVhdHVyZXNbbl0ucHJvcGVydGllczpnP3QucHJvcGVydGllczp7fSxjPWY/dC5mZWF0dXJlc1tuXS5iYm94Omc/dC5iYm94OnZvaWQgMCxoPWY/dC5mZWF0dXJlc1tuXS5pZDpnP3QuaWQ6dm9pZCAwLHM9KHU9ISFhJiYiR2VvbWV0cnlDb2xsZWN0aW9uIj09PWEudHlwZSk/YS5nZW9tZXRyaWVzLmxlbmd0aDoxLGk9MDtpPHM7aSsrKWlmKG51bGwhPT0obz11P2EuZ2VvbWV0cmllc1tpXTphKSlzd2l0Y2goby50eXBlKXtjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2ludCI6Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvbHlnb24iOmlmKCExPT09ZShvLHAsbCxjLGgpKXJldHVybiExO2JyZWFrO2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpmb3Iocj0wO3I8by5nZW9tZXRyaWVzLmxlbmd0aDtyKyspaWYoITE9PT1lKG8uZ2VvbWV0cmllc1tyXSxwLGwsYyxoKSlyZXR1cm4hMTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBHZW9tZXRyeSBUeXBlIil9ZWxzZSBpZighMT09PWUobnVsbCxwLGwsYyxoKSlyZXR1cm4hMTtwKyt9fWZ1bmN0aW9uIEIodCxlLG4pe3ZhciByPW47cmV0dXJuIHEodCwoZnVuY3Rpb24odCxpLG8scyxhKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSxvLHMsYSl9KSkscn1mdW5jdGlvbiB6KHQsZSl7cSh0LChmdW5jdGlvbih0LG4scixpLHMpe3ZhciBhLHU9bnVsbD09PXQ/bnVsbDp0LnR5cGU7c3dpdGNoKHUpe2Nhc2UgbnVsbDpjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6cmV0dXJuITEhPT1lKG8odCxyLHtiYm94OmksaWQ6c30pLG4sMCkmJnZvaWQgMH1zd2l0Y2godSl7Y2FzZSJNdWx0aVBvaW50IjphPSJQb2ludCI7YnJlYWs7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOmE9IkxpbmVTdHJpbmciO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjphPSJQb2x5Z29uIn1mb3IodmFyIGw9MDtsPHQuY29vcmRpbmF0ZXMubGVuZ3RoO2wrKyl7dmFyIGM9dC5jb29yZGluYXRlc1tsXTtpZighMT09PWUobyh7dHlwZTphLGNvb3JkaW5hdGVzOmN9LHIpLG4sbCkpcmV0dXJuITF9fSkpfWZ1bmN0aW9uIGoodCxlLG4pe3ZhciByPW47cmV0dXJuIHoodCwoZnVuY3Rpb24odCxpLG8pe3I9MD09PWkmJjA9PT1vJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSxvKX0pKSxyfWZ1bmN0aW9uIFUodCxlKXt6KHQsKGZ1bmN0aW9uKHQsbixyKXt2YXIgaT0wO2lmKHQuZ2VvbWV0cnkpe3ZhciBvPXQuZ2VvbWV0cnkudHlwZTtpZigiUG9pbnQiIT09byYmIk11bHRpUG9pbnQiIT09byl7dmFyIHMsYT0wLHU9MCxsPTA7cmV0dXJuITEhPT1SKHQsKGZ1bmN0aW9uKG8sYyxwLGYsZyl7aWYodm9pZCAwPT09c3x8bj5hfHxmPnV8fGc+bClyZXR1cm4gcz1vLGE9bix1PWYsbD1nLHZvaWQoaT0wKTt2YXIgZD1oKFtzLG9dLHQucHJvcGVydGllcyk7aWYoITE9PT1lKGQsbixyLGcsaSkpcmV0dXJuITE7aSsrLHM9b30pKSYmdm9pZCAwfX19KSl9ZnVuY3Rpb24gVih0LGUsbil7dmFyIHI9bixpPSExO3JldHVybiBVKHQsKGZ1bmN0aW9uKHQsbyxzLGEsdSl7cj0hMT09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxvLHMsYSx1KSxpPSEwfSkpLHJ9ZnVuY3Rpb24gWCh0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO3oodCwoZnVuY3Rpb24odCxuLHIpe2lmKG51bGwhPT10Lmdlb21ldHJ5KXt2YXIgaT10Lmdlb21ldHJ5LnR5cGUsbz10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzO3N3aXRjaChpKXtjYXNlIkxpbmVTdHJpbmciOmlmKCExPT09ZSh0LG4sciwwLDApKXJldHVybiExO2JyZWFrO2Nhc2UiUG9seWdvbiI6Zm9yKHZhciBzPTA7czxvLmxlbmd0aDtzKyspaWYoITE9PT1lKGgob1tzXSx0LnByb3BlcnRpZXMpLG4scixzKSlyZXR1cm4hMX19fSkpfWZ1bmN0aW9uIFkodCxlLG4pe3ZhciByPW47cmV0dXJuIFgodCwoZnVuY3Rpb24odCxpLG8scyl7cj0wPT09aSYmdm9pZCAwPT09bj90OmUocix0LGksbyxzKX0pKSxyfWZ1bmN0aW9uIEgodCxlKXtpZighUChlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuLHI9ZS5mZWF0dXJlSW5kZXh8fDAsaT1lLm11bHRpRmVhdHVyZUluZGV4fHwwLG89ZS5nZW9tZXRyeUluZGV4fHwwLHM9ZS5zZWdtZW50SW5kZXh8fDAsYT1lLnByb3BlcnRpZXM7c3dpdGNoKHQudHlwZSl7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6cjwwJiYocj10LmZlYXR1cmVzLmxlbmd0aCtyKSxhPWF8fHQuZmVhdHVyZXNbcl0ucHJvcGVydGllcyxuPXQuZmVhdHVyZXNbcl0uZ2VvbWV0cnk7YnJlYWs7Y2FzZSJGZWF0dXJlIjphPWF8fHQucHJvcGVydGllcyxuPXQuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJQb2ludCI6Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gbnVsbDtjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aUxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2x5Z29uIjpuPXQ7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgaW52YWxpZCIpfWlmKG51bGw9PT1uKXJldHVybiBudWxsO3ZhciB1PW4uY29vcmRpbmF0ZXM7c3dpdGNoKG4udHlwZSl7Y2FzZSJQb2ludCI6Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gbnVsbDtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBzPDAmJihzPXUubGVuZ3RoK3MtMSksaChbdVtzXSx1W3MrMV1dLGEsZSk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gbzwwJiYobz11Lmxlbmd0aCtvKSxzPDAmJihzPXVbb10ubGVuZ3RoK3MtMSksaChbdVtvXVtzXSx1W29dW3MrMV1dLGEsZSk7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiBpPDAmJihpPXUubGVuZ3RoK2kpLHM8MCYmKHM9dVtpXS5sZW5ndGgrcy0xKSxoKFt1W2ldW3NdLHVbaV1bcysxXV0sYSxlKTtjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIGk8MCYmKGk9dS5sZW5ndGgraSksbzwwJiYobz11W2ldLmxlbmd0aCtvKSxzPDAmJihzPXVbaV1bb10ubGVuZ3RoLXMtMSksaChbdVtpXVtvXVtzXSx1W2ldW29dW3MrMV1dLGEsZSl9dGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIGludmFsaWQiKX1mdW5jdGlvbiBXKHQsZSl7aWYoIVAoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbixyPWUuZmVhdHVyZUluZGV4fHwwLGk9ZS5tdWx0aUZlYXR1cmVJbmRleHx8MCxvPWUuZ2VvbWV0cnlJbmRleHx8MCxzPWUuY29vcmRJbmRleHx8MCx1PWUucHJvcGVydGllcztzd2l0Y2godC50eXBlKXtjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpyPDAmJihyPXQuZmVhdHVyZXMubGVuZ3RoK3IpLHU9dXx8dC5mZWF0dXJlc1tyXS5wcm9wZXJ0aWVzLG49dC5mZWF0dXJlc1tyXS5nZW9tZXRyeTticmVhaztjYXNlIkZlYXR1cmUiOnU9dXx8dC5wcm9wZXJ0aWVzLG49dC5nZW9tZXRyeTticmVhaztjYXNlIlBvaW50IjpjYXNlIk11bHRpUG9pbnQiOnJldHVybiBudWxsO2Nhc2UiTGluZVN0cmluZyI6Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvbHlnb24iOm49dDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyBpbnZhbGlkIil9aWYobnVsbD09PW4pcmV0dXJuIG51bGw7dmFyIGw9bi5jb29yZGluYXRlcztzd2l0Y2gobi50eXBlKXtjYXNlIlBvaW50IjpyZXR1cm4gYShsLHUsZSk7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gaTwwJiYoaT1sLmxlbmd0aCtpKSxhKGxbaV0sdSxlKTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBzPDAmJihzPWwubGVuZ3RoK3MpLGEobFtzXSx1LGUpO2Nhc2UiUG9seWdvbiI6cmV0dXJuIG88MCYmKG89bC5sZW5ndGgrbyksczwwJiYocz1sW29dLmxlbmd0aCtzKSxhKGxbb11bc10sdSxlKTtjYXNlIk11bHRpTGluZVN0cmluZyI6cmV0dXJuIGk8MCYmKGk9bC5sZW5ndGgraSksczwwJiYocz1sW2ldLmxlbmd0aCtzKSxhKGxbaV1bc10sdSxlKTtjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIGk8MCYmKGk9bC5sZW5ndGgraSksbzwwJiYobz1sW2ldLmxlbmd0aCtvKSxzPDAmJihzPWxbaV1bb10ubGVuZ3RoLXMpLGEobFtpXVtvXVtzXSx1LGUpfXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyBpbnZhbGlkIil9dmFyIEo9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY29vcmRBbGw6Ryxjb29yZEVhY2g6Uixjb29yZFJlZHVjZTpULGZlYXR1cmVFYWNoOkYsZmVhdHVyZVJlZHVjZTprLGZpbmRQb2ludDpXLGZpbmRTZWdtZW50OkgsZmxhdHRlbkVhY2g6eixmbGF0dGVuUmVkdWNlOmosZ2VvbUVhY2g6cSxnZW9tUmVkdWNlOkIsbGluZUVhY2g6WCxsaW5lUmVkdWNlOlkscHJvcEVhY2g6QSxwcm9wUmVkdWNlOkQsc2VnbWVudEVhY2g6VSxzZWdtZW50UmVkdWNlOlZ9KTtmdW5jdGlvbiBaKHQpe3ZhciBlPVsxLzAsMS8wLC0xLzAsLTEvMF07cmV0dXJuIFIodCwoZnVuY3Rpb24odCl7ZVswXT50WzBdJiYoZVswXT10WzBdKSxlWzFdPnRbMV0mJihlWzFdPXRbMV0pLGVbMl08dFswXSYmKGVbMl09dFswXSksZVszXTx0WzFdJiYoZVszXT10WzFdKX0pKSxlfWZ1bmN0aW9uIEsodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZCBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXtpZigiRmVhdHVyZSI9PT10LnR5cGUmJm51bGwhPT10Lmdlb21ldHJ5JiYiUG9pbnQiPT09dC5nZW9tZXRyeS50eXBlKXJldHVybiB0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzO2lmKCJQb2ludCI9PT10LnR5cGUpcmV0dXJuIHQuY29vcmRpbmF0ZXN9aWYoQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+PTImJiFBcnJheS5pc0FycmF5KHRbMF0pJiYhQXJyYXkuaXNBcnJheSh0WzFdKSlyZXR1cm4gdDt0aHJvdyBuZXcgRXJyb3IoImNvb3JkIG11c3QgYmUgR2VvSlNPTiBQb2ludCBvciBhbiBBcnJheSBvZiBudW1iZXJzIil9ZnVuY3Rpb24gUSh0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0O2lmKCJGZWF0dXJlIj09PXQudHlwZSl7aWYobnVsbCE9PXQuZ2VvbWV0cnkpcmV0dXJuIHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXN9ZWxzZSBpZih0LmNvb3JkaW5hdGVzKXJldHVybiB0LmNvb3JkaW5hdGVzO3Rocm93IG5ldyBFcnJvcigiY29vcmRzIG11c3QgYmUgR2VvSlNPTiBGZWF0dXJlLCBHZW9tZXRyeSBPYmplY3Qgb3IgYW4gQXJyYXkiKX1mdW5jdGlvbiAkKHQpe2lmKHQubGVuZ3RoPjEmJkModFswXSkmJkModFsxXSkpcmV0dXJuITA7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSYmdFswXS5sZW5ndGgpcmV0dXJuICQodFswXSk7dGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IG9ubHkgY29udGFpbiBudW1iZXJzIil9ZnVuY3Rpb24gdHQodCxlLG4pe2lmKCFlfHwhbil0aHJvdyBuZXcgRXJyb3IoInR5cGUgYW5kIG5hbWUgcmVxdWlyZWQiKTtpZighdHx8dC50eXBlIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyI6IG11c3QgYmUgYSAiK2UrIiwgZ2l2ZW4gIit0LnR5cGUpfWZ1bmN0aW9uIGV0KHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIk5vIGZlYXR1cmUgcGFzc2VkIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCIuZmVhdHVyZU9mKCkgcmVxdWlyZXMgYSBuYW1lIik7aWYoIXR8fCJGZWF0dXJlIiE9PXQudHlwZXx8IXQuZ2VvbWV0cnkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiLCBGZWF0dXJlIHdpdGggZ2VvbWV0cnkgcmVxdWlyZWQiKTtpZighdC5nZW9tZXRyeXx8dC5nZW9tZXRyeS50eXBlIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyI6IG11c3QgYmUgYSAiK2UrIiwgZ2l2ZW4gIit0Lmdlb21ldHJ5LnR5cGUpfWZ1bmN0aW9uIG50KHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIk5vIGZlYXR1cmVDb2xsZWN0aW9uIHBhc3NlZCIpO2lmKCFuKXRocm93IG5ldyBFcnJvcigiLmNvbGxlY3Rpb25PZigpIHJlcXVpcmVzIGEgbmFtZSIpO2lmKCF0fHwiRmVhdHVyZUNvbGxlY3Rpb24iIT09dC50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byAiK24rIiwgRmVhdHVyZUNvbGxlY3Rpb24gcmVxdWlyZWQiKTtmb3IodmFyIHI9MCxpPXQuZmVhdHVyZXM7cjxpLmxlbmd0aDtyKyspe3ZhciBvPWlbcl07aWYoIW98fCJGZWF0dXJlIiE9PW8udHlwZXx8IW8uZ2VvbWV0cnkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiLCBGZWF0dXJlIHdpdGggZ2VvbWV0cnkgcmVxdWlyZWQiKTtpZighby5nZW9tZXRyeXx8by5nZW9tZXRyeS50eXBlIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyI6IG11c3QgYmUgYSAiK2UrIiwgZ2l2ZW4gIitvLmdlb21ldHJ5LnR5cGUpfX1mdW5jdGlvbiBydCh0KXtyZXR1cm4iRmVhdHVyZSI9PT10LnR5cGU/dC5nZW9tZXRyeTp0fWZ1bmN0aW9uIGl0KHQsZSl7cmV0dXJuIkZlYXR1cmVDb2xsZWN0aW9uIj09PXQudHlwZT8iRmVhdHVyZUNvbGxlY3Rpb24iOiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09dC50eXBlPyJHZW9tZXRyeUNvbGxlY3Rpb24iOiJGZWF0dXJlIj09PXQudHlwZSYmbnVsbCE9PXQuZ2VvbWV0cnk/dC5nZW9tZXRyeS50eXBlOnQudHlwZX1aLmRlZmF1bHQ9Wjt2YXIgb3Q9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0Q29vcmQ6SyxnZXRDb29yZHM6USxjb250YWluc051bWJlcjokLGdlb2pzb25UeXBlOnR0LGZlYXR1cmVPZjpldCxjb2xsZWN0aW9uT2Y6bnQsZ2V0R2VvbTpydCxnZXRUeXBlOml0fSksc3Q9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxhdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHV0PU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7Ci8qCiAgICBvYmplY3QtYXNzaWduCiAgICAoYykgU2luZHJlIFNvcmh1cwogICAgQGxpY2Vuc2UgTUlUCiAgICAqL2Z1bmN0aW9uIGx0KHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQiKTtyZXR1cm4gT2JqZWN0KHQpfXZhciBjdD1mdW5jdGlvbigpe3RyeXtpZighT2JqZWN0LmFzc2lnbilyZXR1cm4hMTt2YXIgdD1uZXcgU3RyaW5nKCJhYmMiKTtpZih0WzVdPSJkZSIsIjUiPT09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModClbMF0pcmV0dXJuITE7Zm9yKHZhciBlPXt9LG49MDtuPDEwO24rKyllWyJfIitTdHJpbmcuZnJvbUNoYXJDb2RlKG4pXT1uO2lmKCIwMTIzNDU2Nzg5IiE9PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19KSkuam9pbigiIikpcmV0dXJuITE7dmFyIHI9e307cmV0dXJuImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7clt0XT10fSkpLCJhYmNkZWZnaGlqa2xtbm9wcXJzdCI9PT1PYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LHIpKS5qb2luKCIiKX1jYXRjaCh0KXtyZXR1cm4hMX19KCk/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyLGk9bHQodCksbz0xO288YXJndW1lbnRzLmxlbmd0aDtvKyspe2Zvcih2YXIgcyBpbiBuPU9iamVjdChhcmd1bWVudHNbb10pKWF0LmNhbGwobixzKSYmKGlbc109bltzXSk7aWYoc3Qpe3I9c3Qobik7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspdXQuY2FsbChuLHJbYV0pJiYoaVtyW2FdXT1uW3JbYV1dKX19cmV0dXJuIGl9LGh0PXtzdWNjZXNzQ2FsbGJhY2s6bnVsbCx2ZXJib3NlOiExfSxwdD17fTsKLyoqCiAgICAgKiBAbGljZW5zZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTUgUm9ubnkgTG9yZW56IDxyb25ueUB0YmkudW5pdmllLmFjLmF0PgogICAgICogdi4gMS4yLjAKICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9SYXVtWmVpdC9NYXJjaGluZ1NxdWFyZXMuanMKICAgICAqCiAgICAgKiBNYXJjaGluZ1NxdWFyZXNKUyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICAgICoKICAgICAqIE1hcmNoaW5nU3F1YXJlc0pTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgICogR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgICAgKgogICAgICogQXMgYWRkaXRpb25hbCBwZXJtaXNzaW9uIHVuZGVyIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMKICAgICAqIHNlY3Rpb24gNywgdGhpcmQtcGFydHkgcHJvamVjdHMgKHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwpIG1heSBkaXN0cmlidXRlLAogICAgICogaW5jbHVkZSwgb3IgbGluayBhZ2FpbnN0IFVOTU9ESUZJRUQgVkVSU0lPTlMgb2YgTWFyY2hpbmdTcXVhcmVzSlMgd2l0aG91dCB0aGUKICAgICAqIHJlcXVpcmVtZW50IHRoYXQgc2FpZCB0aGlyZC1wYXJ0eSBwcm9qZWN0IGZvciB0aGF0IHJlYXNvbiBhbG9uZSBiZWNvbWVzCiAgICAgKiBzdWJqZWN0IHRvIGFueSByZXF1aXJlbWVudCBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMy4KICAgICAqIEFueSBtb2RpZmljYXRpb25zIHRvIE1hcmNoaW5nU3F1YXJlc0pTLCBob3dldmVyLCBtdXN0IGJlIHNoYXJlZCB3aXRoIHRoZSBwdWJsaWMKICAgICAqIGFuZCBtYWRlIGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBJbiBzdW1tYXJ5IHRoaXM6CiAgICAgKiAtIGFsbG93cyB5b3UgdG8gdXNlIE1hcmNoaW5nU3F1YXJlc0pTIGF0IG5vIGNvc3QKICAgICAqIC0gYWxsb3dzIHlvdSB0byB1c2UgTWFyY2hpbmdTcXVhcmVzSlMgZm9yIGJvdGggcGVyc29uYWwgYW5kIGNvbW1lcmNpYWwgcHVycG9zZXMKICAgICAqIC0gYWxsb3dzIHlvdSB0byBkaXN0cmlidXRlIFVOTU9ESUZJRUQgVkVSU0lPTlMgb2YgTWFyY2hpbmdTcXVhcmVzSlMgdW5kZXIgYW55CiAgICAgKiAgIGxpY2Vuc2UgYXMgbG9uZyBhcyB0aGlzIGxpY2Vuc2Ugbm90aWNlIGlzIGluY2x1ZGVkCiAgICAgKiAtIGVuYWJsZXMgeW91IHRvIGtlZXAgdGhlIHNvdXJjZSBjb2RlIG9mIHlvdXIgcHJvZ3JhbSB0aGF0IHVzZXMgTWFyY2hpbmdTcXVhcmVzSlMKICAgICAqICAgdW5kaXNjbG9zZWQKICAgICAqIC0gZm9yY2VzIHlvdSB0byBzaGFyZSBhbnkgbW9kaWZpY2F0aW9ucyB5b3UgaGF2ZSBtYWRlIHRvIE1hcmNoaW5nU3F1YXJlc0pTLAogICAgICogICBlLmcuIGJ1Zy1maXhlcwogICAgICoKICAgICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgICogYWxvbmcgd2l0aCBNYXJjaGluZ1NxdWFyZXNKUy4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAgICAqL2Z1bmN0aW9uIGZ0KHQsZSxuKXtuPW58fHt9O2Zvcih2YXIgcj1PYmplY3Qua2V5cyhodCksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1yW2ldLHM9bltvXTtzPW51bGwhPXM/czpodFtvXSxwdFtvXT1zfXB0LnZlcmJvc2UmJmNvbnNvbGUubG9nKCJNYXJjaGluZ1NxdWFyZXNKUy1pc29Db250b3VyczogY29tcHV0aW5nIGlzb2NvbnRvdXIgZm9yICIrZSk7dmFyIGE9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj0wLHI9MWUtNztyZXR1cm4gdC5jZWxscy5mb3JFYWNoKChmdW5jdGlvbihpLG8pe2kuZm9yRWFjaCgoZnVuY3Rpb24oaSxzKXtpZih2b2lkIDAhPT1pJiYoNSE9PShmPWkpLmN2YWwmJjEwIT09Zi5jdmFsKSYmIWR0KGkpKXt2YXIgYT1mdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvPXQubGVuZ3RoLHM9W10sYT1bMCwwLDEsMSwwLDAsMCwwLC0xLDAsMSwxLC0xLDAsLTEsMF0sdT1bMCwtMSwwLDAsMSwxLDEsMSwwLC0xLDAsMCwwLC0xLDAsMF0sbD1bIm5vbmUiLCJsZWZ0IiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwibm9uZSIsImJvdHRvbSIsImxlZnQiLCJ0b3AiLCJ0b3AiLCJub25lIiwidG9wIiwicmlnaHQiLCJyaWdodCIsImJvdHRvbSIsIm5vbmUiXSxjPVsibm9uZSIsImJvdHRvbSIsInJpZ2h0IiwicmlnaHQiLCJ0b3AiLCJ0b3AiLCJ0b3AiLCJ0b3AiLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiLCJyaWdodCIsImxlZnQiLCJib3R0b20iLCJsZWZ0Iiwibm9uZSJdLGg9dFtlXVtuXSxwPWguY3ZhbCxmPWxbcF0sZz12dChoLGYpO3MucHVzaChbbitnWzBdLGUrZ1sxXV0pLGY9Y1twXSxnPXZ0KGgsZikscy5wdXNoKFtuK2dbMF0sZStnWzFdXSkseXQoaCk7dmFyIGQ9bithW3BdLHk9ZSt1W3BdLHY9cDtmb3IoO2Q+PTAmJnk+PTAmJnk8byYmKGQhPW58fHkhPWUpJiZ2b2lkIDAhPT0oaD10W3ldW2RdKTspe2lmKDA9PT0ocD1oLmN2YWwpfHwxNT09PXApcmV0dXJue3BhdGg6cyxpbmZvOiJtZXJnZWFibGUifTtmPWNbcF0scj1hW3BdLGk9dVtwXSw1IT09cCYmMTAhPT1wfHwoNT09PXA/aC5mbGlwcGVkPy0xPT09dVt2XT8oZj0ibGVmdCIscj0tMSxpPTApOihmPSJyaWdodCIscj0xLGk9MCk6LTE9PT1hW3ZdJiYoZj0iYm90dG9tIixyPTAsaT0tMSk6MTA9PT1wJiYoaC5mbGlwcGVkPy0xPT09YVt2XT8oZj0idG9wIixyPTAsaT0xKTooZj0iYm90dG9tIixyPTAsaT0tMSk6MT09PXVbdl0mJihmPSJsZWZ0IixyPS0xLGk9MCkpKSxnPXZ0KGgsZikscy5wdXNoKFtkK2dbMF0seStnWzFdXSkseXQoaCksZCs9cix5Kz1pLHY9cH1yZXR1cm57cGF0aDpzLGluZm86ImNsb3NlZCJ9fSh0LmNlbGxzLG8scyksdT0hMTtpZigibWVyZ2VhYmxlIj09PWEuaW5mbylmb3IodmFyIGw9YS5wYXRoW2EucGF0aC5sZW5ndGgtMV1bMF0sYz1hLnBhdGhbYS5wYXRoLmxlbmd0aC0xXVsxXSxoPW4tMTtoPj0wO2gtLSlpZihNYXRoLmFicyhlW2hdWzBdWzBdLWwpPD1yJiZNYXRoLmFicyhlW2hdWzBdWzFdLWMpPD1yKXtmb3IodmFyIHA9YS5wYXRoLmxlbmd0aC0yO3A+PTA7LS1wKWVbaF0udW5zaGlmdChhLnBhdGhbcF0pO3U9ITA7YnJlYWt9dXx8KGVbbisrXT1hLnBhdGgpfXZhciBmfSkpfSkpLGV9KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoLTEscj10WzBdLmxlbmd0aC0xLGk9e3Jvd3M6bixjb2xzOnIsY2VsbHM6W119LG89MDtvPG47KytvKXtpLmNlbGxzW29dPVtdO2Zvcih2YXIgcz0wO3M8cjsrK3Mpe3ZhciBhPTAsdT10W28rMV1bc10sbD10W28rMV1bcysxXSxjPXRbb11bcysxXSxoPXRbb11bc107aWYoIShpc05hTih1KXx8aXNOYU4obCl8fGlzTmFOKGMpfHxpc05hTihoKSkpe2F8PXU+PWU/ODowLGF8PWw+PWU/NDowLGF8PWM+PWU/MjowO3ZhciBwLGYsZyxkLHk9ITE7aWYoNT09PShhfD1oPj1lPzE6MCl8fDEwPT09YSl7dmFyIHY9KHUrbCtjK2gpLzQ7NT09PWEmJnY8ZT8oYT0xMCx5PSEwKToxMD09PWEmJnY8ZSYmKGE9NSx5PSEwKX1pZigwIT09YSYmMTUhPT1hKXA9Zj1nPWQ9LjUsMT09PWE/KGc9MS1ndChlLHUsaCksZj0xLWd0KGUsYyxoKSk6Mj09PWE/KGY9Z3QoZSxoLGMpLGQ9MS1ndChlLGwsYykpOjM9PT1hPyhnPTEtZ3QoZSx1LGgpLGQ9MS1ndChlLGwsYykpOjQ9PT1hPyhwPWd0KGUsdSxsKSxkPWd0KGUsYyxsKSk6NT09PWE/KHA9Z3QoZSx1LGwpLGQ9Z3QoZSxjLGwpLGY9MS1ndChlLGMsaCksZz0xLWd0KGUsdSxoKSk6Nj09PWE/KGY9Z3QoZSxoLGMpLHA9Z3QoZSx1LGwpKTo3PT09YT8oZz0xLWd0KGUsdSxoKSxwPWd0KGUsdSxsKSk6OD09PWE/KGc9Z3QoZSxoLHUpLHA9MS1ndChlLGwsdSkpOjk9PT1hPyhmPTEtZ3QoZSxjLGgpLHA9MS1ndChlLGwsdSkpOjEwPT09YT8ocD0xLWd0KGUsbCx1KSxkPTEtZ3QoZSxsLGMpLGY9Z3QoZSxoLGMpLGc9Z3QoZSxoLHUpKToxMT09PWE/KHA9MS1ndChlLGwsdSksZD0xLWd0KGUsbCxjKSk6MTI9PT1hPyhnPWd0KGUsaCx1KSxkPWd0KGUsYyxsKSk6MTM9PT1hPyhmPTEtZ3QoZSxjLGgpLGQ9Z3QoZSxjLGwpKToxND09PWE/KGc9Z3QoZSxoLHUpLGY9Z3QoZSxoLGMpKTpjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQ29udG91cnM6IElsbGVnYWwgY3ZhbCBkZXRlY3RlZDogIithKSxpLmNlbGxzW29dW3NdPXtjdmFsOmEsZmxpcHBlZDp5LHRvcDpwLHJpZ2h0OmQsYm90dG9tOmYsbGVmdDpnfX19fXJldHVybiBpfSh0LGUpKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgcHQuc3VjY2Vzc0NhbGxiYWNrJiZwdC5zdWNjZXNzQ2FsbGJhY2soYSksYX1mdW5jdGlvbiBndCh0LGUsbil7cmV0dXJuKHQtZSkvKG4tZSl9ZnVuY3Rpb24gZHQodCl7cmV0dXJuIDA9PT10LmN2YWx8fDE1PT09dC5jdmFsfWZ1bmN0aW9uIHl0KHQpe2R0KHQpfHw1PT09dC5jdmFsfHwxMD09PXQuY3ZhbHx8KHQuY3ZhbD0xNSl9ZnVuY3Rpb24gdnQodCxlKXtyZXR1cm4idG9wIj09PWU/W3QudG9wLDFdOiJib3R0b20iPT09ZT9bdC5ib3R0b20sMF06InJpZ2h0Ij09PWU/WzEsdC5yaWdodF06ImxlZnQiPT09ZT9bMCx0LmxlZnRdOnZvaWQgMH1mdW5jdGlvbiBfdCh0LGUpe2lmKCFQKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS56UHJvcGVydHl8fCJlbGV2YXRpb24iLHI9ZS5mbGlwLGk9ZS5mbGFncztudCh0LCJQb2ludCIsImlucHV0IG11c3QgY29udGFpbiBQb2ludHMiKTtmb3IodmFyIG89ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtyZXR1cm4gRih0LChmdW5jdGlvbih0KXt2YXIgZT1RKHQpWzFdO25bZV18fChuW2VdPVtdKSxuW2VdLnB1c2godCl9KSksT2JqZWN0LmtleXMobikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gblt0XS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBRKHQpWzBdLVEoZSlbMF19KSl9KSkuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZT9RKHRbMF0pWzFdLVEoblswXSlbMV06UShuWzBdKVsxXS1RKHRbMF0pWzFdfSkpfSh0LHIpLHM9W10sYT0wO2E8by5sZW5ndGg7YSsrKXtmb3IodmFyIHU9b1thXSxsPVtdLGM9MDtjPHUubGVuZ3RoO2MrKyl7dmFyIGg9dVtjXTtoLnByb3BlcnRpZXNbbl0/bC5wdXNoKGgucHJvcGVydGllc1tuXSk6bC5wdXNoKDApLCEwPT09aSYmKGgucHJvcGVydGllcy5tYXRyaXhQb3NpdGlvbj1bYSxjXSl9cy5wdXNoKGwpfXJldHVybiBzfXZhciBtdD1FdCx4dD1FdDtmdW5jdGlvbiBFdCh0LGUsbixyLGkpe2J0KHQsZSxufHwwLHJ8fHQubGVuZ3RoLTEsaXx8SXQpfWZ1bmN0aW9uIGJ0KHQsZSxuLHIsaSl7Zm9yKDtyPm47KXtpZihyLW4+NjAwKXt2YXIgbz1yLW4rMSxzPWUtbisxLGE9TWF0aC5sb2cobyksdT0uNSpNYXRoLmV4cCgyKmEvMyksbD0uNSpNYXRoLnNxcnQoYSp1KihvLXUpL28pKihzLW8vMjwwPy0xOjEpO2J0KHQsZSxNYXRoLm1heChuLE1hdGguZmxvb3IoZS1zKnUvbytsKSksTWF0aC5taW4ocixNYXRoLmZsb29yKGUrKG8tcykqdS9vK2wpKSxpKX12YXIgYz10W2VdLGg9bixwPXI7Zm9yKHd0KHQsbixlKSxpKHRbcl0sYyk+MCYmd3QodCxuLHIpO2g8cDspe2Zvcih3dCh0LGgscCksaCsrLHAtLTtpKHRbaF0sYyk8MDspaCsrO2Zvcig7aSh0W3BdLGMpPjA7KXAtLX0wPT09aSh0W25dLGMpP3d0KHQsbixwKTp3dCh0LCsrcCxyKSxwPD1lJiYobj1wKzEpLGU8PXAmJihyPXAtMSl9fWZ1bmN0aW9uIHd0KHQsZSxuKXt2YXIgcj10W2VdO3RbZV09dFtuXSx0W25dPXJ9ZnVuY3Rpb24gSXQodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9bXQuZGVmYXVsdD14dDt2YXIgTnQ9Q3QsU3Q9Q3Q7ZnVuY3Rpb24gQ3QodCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBDdCkpcmV0dXJuIG5ldyBDdCh0LGUpO3RoaXMuX21heEVudHJpZXM9TWF0aC5tYXgoNCx0fHw5KSx0aGlzLl9taW5FbnRyaWVzPU1hdGgubWF4KDIsTWF0aC5jZWlsKC40KnRoaXMuX21heEVudHJpZXMpKSxlJiZ0aGlzLl9pbml0Rm9ybWF0KGUpLHRoaXMuY2xlYXIoKX1mdW5jdGlvbiBQdCh0LGUsbil7aWYoIW4pcmV0dXJuIGUuaW5kZXhPZih0KTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKylpZihuKHQsZVtyXSkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gTXQodCxlKXtMdCh0LDAsdC5jaGlsZHJlbi5sZW5ndGgsZSx0KX1mdW5jdGlvbiBMdCh0LGUsbixyLGkpe2l8fChpPUd0KG51bGwpKSxpLm1pblg9MS8wLGkubWluWT0xLzAsaS5tYXhYPS0xLzAsaS5tYXhZPS0xLzA7Zm9yKHZhciBvLHM9ZTtzPG47cysrKW89dC5jaGlsZHJlbltzXSxPdChpLHQubGVhZj9yKG8pOm8pO3JldHVybiBpfWZ1bmN0aW9uIE90KHQsZSl7cmV0dXJuIHQubWluWD1NYXRoLm1pbih0Lm1pblgsZS5taW5YKSx0Lm1pblk9TWF0aC5taW4odC5taW5ZLGUubWluWSksdC5tYXhYPU1hdGgubWF4KHQubWF4WCxlLm1heFgpLHQubWF4WT1NYXRoLm1heCh0Lm1heFksZS5tYXhZKSx0fWZ1bmN0aW9uIFJ0KHQsZSl7cmV0dXJuIHQubWluWC1lLm1pblh9ZnVuY3Rpb24gVHQodCxlKXtyZXR1cm4gdC5taW5ZLWUubWluWX1mdW5jdGlvbiBBdCh0KXtyZXR1cm4odC5tYXhYLXQubWluWCkqKHQubWF4WS10Lm1pblkpfWZ1bmN0aW9uIER0KHQpe3JldHVybiB0Lm1heFgtdC5taW5YKyh0Lm1heFktdC5taW5ZKX1mdW5jdGlvbiBGdCh0LGUpe3JldHVybiB0Lm1pblg8PWUubWluWCYmdC5taW5ZPD1lLm1pblkmJmUubWF4WDw9dC5tYXhYJiZlLm1heFk8PXQubWF4WX1mdW5jdGlvbiBrdCh0LGUpe3JldHVybiBlLm1pblg8PXQubWF4WCYmZS5taW5ZPD10Lm1heFkmJmUubWF4WD49dC5taW5YJiZlLm1heFk+PXQubWluWX1mdW5jdGlvbiBHdCh0KXtyZXR1cm57Y2hpbGRyZW46dCxoZWlnaHQ6MSxsZWFmOiEwLG1pblg6MS8wLG1pblk6MS8wLG1heFg6LTEvMCxtYXhZOi0xLzB9fWZ1bmN0aW9uIHF0KHQsZSxuLHIsaSl7Zm9yKHZhciBvLHM9W2Usbl07cy5sZW5ndGg7KShuPXMucG9wKCkpLShlPXMucG9wKCkpPD1yfHwobz1lK01hdGguY2VpbCgobi1lKS9yLzIpKnIsbXQodCxvLGUsbixpKSxzLnB1c2goZSxvLG8sbikpfWZ1bmN0aW9uIEJ0KHQpe3ZhciBlPXtleHBvcnRzOnt9fTtyZXR1cm4gdChlLGUuZXhwb3J0cyksZS5leHBvcnRzfUN0LnByb3RvdHlwZT17YWxsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FsbCh0aGlzLmRhdGEsW10pfSxzZWFyY2g6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXRhLG49W10scj10aGlzLnRvQkJveDtpZigha3QodCxlKSlyZXR1cm4gbjtmb3IodmFyIGksbyxzLGEsdT1bXTtlOyl7Zm9yKGk9MCxvPWUuY2hpbGRyZW4ubGVuZ3RoO2k8bztpKyspcz1lLmNoaWxkcmVuW2ldLGt0KHQsYT1lLmxlYWY/cihzKTpzKSYmKGUubGVhZj9uLnB1c2gocyk6RnQodCxhKT90aGlzLl9hbGwocyxuKTp1LnB1c2gocykpO2U9dS5wb3AoKX1yZXR1cm4gbn0sY29sbGlkZXM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXRhLG49dGhpcy50b0JCb3g7aWYoIWt0KHQsZSkpcmV0dXJuITE7Zm9yKHZhciByLGksbyxzLGE9W107ZTspe2ZvcihyPTAsaT1lLmNoaWxkcmVuLmxlbmd0aDtyPGk7cisrKWlmKG89ZS5jaGlsZHJlbltyXSxrdCh0LHM9ZS5sZWFmP24obyk6bykpe2lmKGUubGVhZnx8RnQodCxzKSlyZXR1cm4hMDthLnB1c2gobyl9ZT1hLnBvcCgpfXJldHVybiExfSxsb2FkOmZ1bmN0aW9uKHQpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuIHRoaXM7aWYodC5sZW5ndGg8dGhpcy5fbWluRW50cmllcyl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuaW5zZXJ0KHRbZV0pO3JldHVybiB0aGlzfXZhciByPXRoaXMuX2J1aWxkKHQuc2xpY2UoKSwwLHQubGVuZ3RoLTEsMCk7aWYodGhpcy5kYXRhLmNoaWxkcmVuLmxlbmd0aClpZih0aGlzLmRhdGEuaGVpZ2h0PT09ci5oZWlnaHQpdGhpcy5fc3BsaXRSb290KHRoaXMuZGF0YSxyKTtlbHNle2lmKHRoaXMuZGF0YS5oZWlnaHQ8ci5oZWlnaHQpe3ZhciBpPXRoaXMuZGF0YTt0aGlzLmRhdGE9cixyPWl9dGhpcy5faW5zZXJ0KHIsdGhpcy5kYXRhLmhlaWdodC1yLmhlaWdodC0xLCEwKX1lbHNlIHRoaXMuZGF0YT1yO3JldHVybiB0aGlzfSxpbnNlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMuX2luc2VydCh0LHRoaXMuZGF0YS5oZWlnaHQtMSksdGhpc30sY2xlYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhPUd0KFtdKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gdGhpcztmb3IodmFyIG4scixpLG8scz10aGlzLmRhdGEsYT10aGlzLnRvQkJveCh0KSx1PVtdLGw9W107c3x8dS5sZW5ndGg7KXtpZihzfHwocz11LnBvcCgpLHI9dVt1Lmxlbmd0aC0xXSxuPWwucG9wKCksbz0hMCkscy5sZWFmJiYtMSE9PShpPVB0KHQscy5jaGlsZHJlbixlKSkpcmV0dXJuIHMuY2hpbGRyZW4uc3BsaWNlKGksMSksdS5wdXNoKHMpLHRoaXMuX2NvbmRlbnNlKHUpLHRoaXM7b3x8cy5sZWFmfHwhRnQocyxhKT9yPyhuKysscz1yLmNoaWxkcmVuW25dLG89ITEpOnM9bnVsbDoodS5wdXNoKHMpLGwucHVzaChuKSxuPTAscj1zLHM9cy5jaGlsZHJlblswXSl9cmV0dXJuIHRoaXN9LHRvQkJveDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sY29tcGFyZU1pblg6UnQsY29tcGFyZU1pblk6VHQsdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX0sZnJvbUpTT046ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YT10LHRoaXN9LF9hbGw6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W107dDspdC5sZWFmP2UucHVzaC5hcHBseShlLHQuY2hpbGRyZW4pOm4ucHVzaC5hcHBseShuLHQuY2hpbGRyZW4pLHQ9bi5wb3AoKTtyZXR1cm4gZX0sX2J1aWxkOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpLG89bi1lKzEscz10aGlzLl9tYXhFbnRyaWVzO2lmKG88PXMpcmV0dXJuIE10KGk9R3QodC5zbGljZShlLG4rMSkpLHRoaXMudG9CQm94KSxpO3J8fChyPU1hdGguY2VpbChNYXRoLmxvZyhvKS9NYXRoLmxvZyhzKSkscz1NYXRoLmNlaWwoby9NYXRoLnBvdyhzLHItMSkpKSwoaT1HdChbXSkpLmxlYWY9ITEsaS5oZWlnaHQ9cjt2YXIgYSx1LGwsYyxoPU1hdGguY2VpbChvL3MpLHA9aCpNYXRoLmNlaWwoTWF0aC5zcXJ0KHMpKTtmb3IocXQodCxlLG4scCx0aGlzLmNvbXBhcmVNaW5YKSxhPWU7YTw9bjthKz1wKWZvcihxdCh0LGEsbD1NYXRoLm1pbihhK3AtMSxuKSxoLHRoaXMuY29tcGFyZU1pblkpLHU9YTt1PD1sO3UrPWgpYz1NYXRoLm1pbih1K2gtMSxsKSxpLmNoaWxkcmVuLnB1c2godGhpcy5fYnVpbGQodCx1LGMsci0xKSk7cmV0dXJuIE10KGksdGhpcy50b0JCb3gpLGl9LF9jaG9vc2VTdWJ0cmVlOmZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaSxvLHMsYSx1LGwsYyxoLHAsZjtyLnB1c2goZSksIWUubGVhZiYmci5sZW5ndGgtMSE9PW47KXtmb3IoYz1oPTEvMCxpPTAsbz1lLmNoaWxkcmVuLmxlbmd0aDtpPG87aSsrKXU9QXQocz1lLmNoaWxkcmVuW2ldKSxwPXQsZj1zLChsPShNYXRoLm1heChmLm1heFgscC5tYXhYKS1NYXRoLm1pbihmLm1pblgscC5taW5YKSkqKE1hdGgubWF4KGYubWF4WSxwLm1heFkpLU1hdGgubWluKGYubWluWSxwLm1pblkpKS11KTxoPyhoPWwsYz11PGM/dTpjLGE9cyk6bD09PWgmJnU8YyYmKGM9dSxhPXMpO2U9YXx8ZS5jaGlsZHJlblswXX1yZXR1cm4gZX0sX2luc2VydDpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy50b0JCb3gsaT1uP3Q6cih0KSxvPVtdLHM9dGhpcy5fY2hvb3NlU3VidHJlZShpLHRoaXMuZGF0YSxlLG8pO2ZvcihzLmNoaWxkcmVuLnB1c2godCksT3QocyxpKTtlPj0wJiZvW2VdLmNoaWxkcmVuLmxlbmd0aD50aGlzLl9tYXhFbnRyaWVzOyl0aGlzLl9zcGxpdChvLGUpLGUtLTt0aGlzLl9hZGp1c3RQYXJlbnRCQm94ZXMoaSxvLGUpfSxfc3BsaXQ6ZnVuY3Rpb24odCxlKXt2YXIgbj10W2VdLHI9bi5jaGlsZHJlbi5sZW5ndGgsaT10aGlzLl9taW5FbnRyaWVzO3RoaXMuX2Nob29zZVNwbGl0QXhpcyhuLGkscik7dmFyIG89dGhpcy5fY2hvb3NlU3BsaXRJbmRleChuLGkscikscz1HdChuLmNoaWxkcmVuLnNwbGljZShvLG4uY2hpbGRyZW4ubGVuZ3RoLW8pKTtzLmhlaWdodD1uLmhlaWdodCxzLmxlYWY9bi5sZWFmLE10KG4sdGhpcy50b0JCb3gpLE10KHMsdGhpcy50b0JCb3gpLGU/dFtlLTFdLmNoaWxkcmVuLnB1c2gocyk6dGhpcy5fc3BsaXRSb290KG4scyl9LF9zcGxpdFJvb3Q6ZnVuY3Rpb24odCxlKXt0aGlzLmRhdGE9R3QoW3QsZV0pLHRoaXMuZGF0YS5oZWlnaHQ9dC5oZWlnaHQrMSx0aGlzLmRhdGEubGVhZj0hMSxNdCh0aGlzLmRhdGEsdGhpcy50b0JCb3gpfSxfY2hvb3NlU3BsaXRJbmRleDpmdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvLHMsYSx1LGwsYyxoLHAsZixnLGQseTtmb3IodT1sPTEvMCxyPWU7cjw9bi1lO3IrKylpPUx0KHQsMCxyLHRoaXMudG9CQm94KSxvPUx0KHQscixuLHRoaXMudG9CQm94KSxoPWkscD1vLGY9dm9pZCAwLGc9dm9pZCAwLGQ9dm9pZCAwLHk9dm9pZCAwLGY9TWF0aC5tYXgoaC5taW5YLHAubWluWCksZz1NYXRoLm1heChoLm1pblkscC5taW5ZKSxkPU1hdGgubWluKGgubWF4WCxwLm1heFgpLHk9TWF0aC5taW4oaC5tYXhZLHAubWF4WSkscz1NYXRoLm1heCgwLGQtZikqTWF0aC5tYXgoMCx5LWcpLGE9QXQoaSkrQXQobyksczx1Pyh1PXMsYz1yLGw9YTxsP2E6bCk6cz09PXUmJmE8bCYmKGw9YSxjPXIpO3JldHVybiBjfSxfY2hvb3NlU3BsaXRBeGlzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmxlYWY/dGhpcy5jb21wYXJlTWluWDpSdCxpPXQubGVhZj90aGlzLmNvbXBhcmVNaW5ZOlR0O3RoaXMuX2FsbERpc3RNYXJnaW4odCxlLG4scik8dGhpcy5fYWxsRGlzdE1hcmdpbih0LGUsbixpKSYmdC5jaGlsZHJlbi5zb3J0KHIpfSxfYWxsRGlzdE1hcmdpbjpmdW5jdGlvbih0LGUsbixyKXt0LmNoaWxkcmVuLnNvcnQocik7dmFyIGksbyxzPXRoaXMudG9CQm94LGE9THQodCwwLGUscyksdT1MdCh0LG4tZSxuLHMpLGw9RHQoYSkrRHQodSk7Zm9yKGk9ZTtpPG4tZTtpKyspbz10LmNoaWxkcmVuW2ldLE90KGEsdC5sZWFmP3Mobyk6byksbCs9RHQoYSk7Zm9yKGk9bi1lLTE7aT49ZTtpLS0pbz10LmNoaWxkcmVuW2ldLE90KHUsdC5sZWFmP3Mobyk6byksbCs9RHQodSk7cmV0dXJuIGx9LF9hZGp1c3RQYXJlbnRCQm94ZXM6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uO3I+PTA7ci0tKU90KGVbcl0sdCl9LF9jb25kZW5zZTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbj10Lmxlbmd0aC0xO24+PTA7bi0tKTA9PT10W25dLmNoaWxkcmVuLmxlbmd0aD9uPjA/KGU9dFtuLTFdLmNoaWxkcmVuKS5zcGxpY2UoZS5pbmRleE9mKHRbbl0pLDEpOnRoaXMuY2xlYXIoKTpNdCh0W25dLHRoaXMudG9CQm94KX0sX2luaXRGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9WyJyZXR1cm4gYSIsIiAtIGIiLCI7Il07dGhpcy5jb21wYXJlTWluWD1uZXcgRnVuY3Rpb24oImEiLCJiIixlLmpvaW4odFswXSkpLHRoaXMuY29tcGFyZU1pblk9bmV3IEZ1bmN0aW9uKCJhIiwiYiIsZS5qb2luKHRbMV0pKSx0aGlzLnRvQkJveD1uZXcgRnVuY3Rpb24oImEiLCJyZXR1cm4ge21pblg6IGEiK3RbMF0rIiwgbWluWTogYSIrdFsxXSsiLCBtYXhYOiBhIit0WzJdKyIsIG1heFk6IGEiK3RbM10rIn07Iil9fSxOdC5kZWZhdWx0PVN0O3ZhciB6dD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dCplLGk9anQqdCxvPWktKGktdCkscz10LW8sYT1qdCplLHU9YS0oYS1lKSxsPWUtdSxjPXMqbC0oci1vKnUtcyp1LW8qbCk7aWYobilyZXR1cm4gblswXT1jLG5bMV09cixuO3JldHVybltjLHJdfSxqdD0rKE1hdGgucG93KDIsMjcpKzEpO3ZhciBVdD1mdW5jdGlvbih0LGUpe3ZhciBuPTB8dC5sZW5ndGgscj0wfGUubGVuZ3RoO2lmKDE9PT1uJiYxPT09cilyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj10K2Uscj1uLXQsaT10LShuLXIpKyhlLXIpO2lmKGkpcmV0dXJuW2ksbl07cmV0dXJuW25dfSh0WzBdLGVbMF0pO3ZhciBpLG8scz1uZXcgQXJyYXkobityKSxhPTAsdT0wLGw9MCxjPU1hdGguYWJzLGg9dFt1XSxwPWMoaCksZj1lW2xdLGc9YyhmKTtwPGc/KG89aCwodSs9MSk8biYmKGg9dFt1XSxwPWMoaCkpKToobz1mLChsKz0xKTxyJiYoZj1lW2xdLGc9YyhmKSkpO3U8biYmcDxnfHxsPj1yPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0scD1jKGgpKSk6KGk9ZiwobCs9MSk8ciYmKGY9ZVtsXSxnPWMoZikpKTt2YXIgZCx5LHY9aStvLF89di1pLG09by1fLHg9bSxFPXY7Zm9yKDt1PG4mJmw8cjspcDxnPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0scD1jKGgpKSk6KGk9ZiwobCs9MSk8ciYmKGY9ZVtsXSxnPWMoZikpKSwobT0obz14KS0oXz0odj1pK28pLWkpKSYmKHNbYSsrXT1tKSx4PUUtKChkPUUrdiktKHk9ZC1FKSkrKHYteSksRT1kO2Zvcig7dTxuOykobT0obz14KS0oXz0odj0oaT1oKStvKS1pKSkmJihzW2ErK109bSkseD1FLSgoZD1FK3YpLSh5PWQtRSkpKyh2LXkpLEU9ZCwodSs9MSk8biYmKGg9dFt1XSk7Zm9yKDtsPHI7KShtPShvPXgpLShfPSh2PShpPWYpK28pLWkpKSYmKHNbYSsrXT1tKSx4PUUtKChkPUUrdiktKHk9ZC1FKSkrKHYteSksRT1kLChsKz0xKTxyJiYoZj1lW2xdKTt4JiYoc1thKytdPXgpO0UmJihzW2ErK109RSk7YXx8KHNbYSsrXT0wKTtyZXR1cm4gcy5sZW5ndGg9YSxzfTt2YXIgVnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQrZSxpPXItdCxvPWUtaSxzPXQtKHItaSk7aWYobilyZXR1cm4gblswXT1zK28sblsxXT1yLG47cmV0dXJuW3MrbyxyXX07dmFyIFh0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5sZW5ndGg7aWYoMT09PW4pe3ZhciByPXp0KHRbMF0sZSk7cmV0dXJuIHJbMF0/cjpbclsxXV19dmFyIGk9bmV3IEFycmF5KDIqbiksbz1bLjEsLjFdLHM9Wy4xLC4xXSxhPTA7enQodFswXSxlLG8pLG9bMF0mJihpW2ErK109b1swXSk7Zm9yKHZhciB1PTE7dTxuOysrdSl7enQodFt1XSxlLHMpO3ZhciBsPW9bMV07VnQobCxzWzBdLG8pLG9bMF0mJihpW2ErK109b1swXSk7dmFyIGM9c1sxXSxoPW9bMV0scD1jK2gsZj1oLShwLWMpO29bMV09cCxmJiYoaVthKytdPWYpfW9bMV0mJihpW2ErK109b1sxXSk7MD09PWEmJihpW2ErK109MCk7cmV0dXJuIGkubGVuZ3RoPWEsaX07dmFyIFl0PWZ1bmN0aW9uKHQsZSl7dmFyIG49MHx0Lmxlbmd0aCxyPTB8ZS5sZW5ndGg7aWYoMT09PW4mJjE9PT1yKXJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPXQrZSxyPW4tdCxpPXQtKG4tcikrKGUtcik7aWYoaSlyZXR1cm5baSxuXTtyZXR1cm5bbl19KHRbMF0sLWVbMF0pO3ZhciBpLG8scz1uZXcgQXJyYXkobityKSxhPTAsdT0wLGw9MCxjPU1hdGguYWJzLGg9dFt1XSxwPWMoaCksZj0tZVtsXSxnPWMoZik7cDxnPyhvPWgsKHUrPTEpPG4mJihoPXRbdV0scD1jKGgpKSk6KG89ZiwobCs9MSk8ciYmKGY9LWVbbF0sZz1jKGYpKSk7dTxuJiZwPGd8fGw+PXI/KGk9aCwodSs9MSk8biYmKGg9dFt1XSxwPWMoaCkpKTooaT1mLChsKz0xKTxyJiYoZj0tZVtsXSxnPWMoZikpKTt2YXIgZCx5LHY9aStvLF89di1pLG09by1fLHg9bSxFPXY7Zm9yKDt1PG4mJmw8cjspcDxnPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0scD1jKGgpKSk6KGk9ZiwobCs9MSk8ciYmKGY9LWVbbF0sZz1jKGYpKSksKG09KG89eCktKF89KHY9aStvKS1pKSkmJihzW2ErK109bSkseD1FLSgoZD1FK3YpLSh5PWQtRSkpKyh2LXkpLEU9ZDtmb3IoO3U8bjspKG09KG89eCktKF89KHY9KGk9aCkrbyktaSkpJiYoc1thKytdPW0pLHg9RS0oKGQ9RSt2KS0oeT1kLUUpKSsodi15KSxFPWQsKHUrPTEpPG4mJihoPXRbdV0pO2Zvcig7bDxyOykobT0obz14KS0oXz0odj0oaT1mKStvKS1pKSkmJihzW2ErK109bSkseD1FLSgoZD1FK3YpLSh5PWQtRSkpKyh2LXkpLEU9ZCwobCs9MSk8ciYmKGY9LWVbbF0pO3gmJihzW2ErK109eCk7RSYmKHNbYSsrXT1FKTthfHwoc1thKytdPTApO3JldHVybiBzLmxlbmd0aD1hLHN9O3ZhciBIdD1CdCgoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUpe2Zvcih2YXIgbj1uZXcgQXJyYXkodC5sZW5ndGgtMSkscj0xO3I8dC5sZW5ndGg7KytyKWZvcih2YXIgaT1uW3ItMV09bmV3IEFycmF5KHQubGVuZ3RoLTEpLG89MCxzPTA7bzx0Lmxlbmd0aDsrK28pbyE9PWUmJihpW3MrK109dFtyXVtvXSk7cmV0dXJuIG59ZnVuY3Rpb24gbih0KXtpZigxPT09dC5sZW5ndGgpcmV0dXJuIHRbMF07aWYoMj09PXQubGVuZ3RoKXJldHVyblsic3VtKCIsdFswXSwiLCIsdFsxXSwiKSJdLmpvaW4oIiIpO3ZhciBlPXQubGVuZ3RoPj4xO3JldHVyblsic3VtKCIsbih0LnNsaWNlKDAsZSkpLCIsIixuKHQuc2xpY2UoZSkpLCIpIl0uam9pbigiIil9ZnVuY3Rpb24gcih0KXtpZigyPT09dC5sZW5ndGgpcmV0dXJuW1sic3VtKHByb2QoIix0WzBdWzBdLCIsIix0WzFdWzFdLCIpLHByb2QoLSIsdFswXVsxXSwiLCIsdFsxXVswXSwiKSkiXS5qb2luKCIiKV07Zm9yKHZhciBpPVtdLG89MDtvPHQubGVuZ3RoOysrbylpLnB1c2goWyJzY2FsZSgiLG4ocihlKHQsbykpKSwiLCIsKHM9bywxJnM/Ii0iOiIiKSx0WzBdW29dLCIpIl0uam9pbigiIikpO3JldHVybiBpO3ZhciBzfWZ1bmN0aW9uIGkodCl7Zm9yKHZhciBpPVtdLG89W10scz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7KytuKXtlW25dPW5ldyBBcnJheSh0KTtmb3IodmFyIHI9MDtyPHQ7KytyKWVbbl1bcl09WyJtIixyLCJbIix0LW4tMSwiXSJdLmpvaW4oIiIpfXJldHVybiBlfSh0KSxhPVtdLHU9MDt1PHQ7Kyt1KTA9PSgxJnUpP2kucHVzaC5hcHBseShpLHIoZShzLHUpKSk6by5wdXNoLmFwcGx5KG8scihlKHMsdSkpKSxhLnB1c2goIm0iK3UpO3ZhciBsPW4oaSksYz1uKG8pLGg9Im9yaWVudGF0aW9uIit0KyJFeGFjdCIscD1bImZ1bmN0aW9uICIsaCwiKCIsYS5qb2luKCksIil7dmFyIHA9IixsLCIsbj0iLGMsIixkPXN1YihwLG4pO3JldHVybiBkW2QubGVuZ3RoLTFdO307cmV0dXJuICIsaF0uam9pbigiIik7cmV0dXJuIG5ldyBGdW5jdGlvbigic3VtIiwicHJvZCIsInNjYWxlIiwic3ViIixwKShVdCx6dCxYdCxZdCl9dmFyIG89aSgzKSxzPWkoNCksYT1bZnVuY3Rpb24oKXtyZXR1cm4gMH0sZnVuY3Rpb24oKXtyZXR1cm4gMH0sZnVuY3Rpb24odCxlKXtyZXR1cm4gZVswXS10WzBdfSxmdW5jdGlvbih0LGUsbil7dmFyIHIsaT0odFsxXS1uWzFdKSooZVswXS1uWzBdKSxzPSh0WzBdLW5bMF0pKihlWzFdLW5bMV0pLGE9aS1zO2lmKGk+MCl7aWYoczw9MClyZXR1cm4gYTtyPWkrc31lbHNle2lmKCEoaTwwKSlyZXR1cm4gYTtpZihzPj0wKXJldHVybiBhO3I9LShpK3MpfXZhciB1PTMzMzA2NjkwNzM4NzU0NzE2ZS0zMipyO3JldHVybiBhPj11fHxhPD0tdT9hOm8odCxlLG4pfSxmdW5jdGlvbih0LGUsbixyKXt2YXIgaT10WzBdLXJbMF0sbz1lWzBdLXJbMF0sYT1uWzBdLXJbMF0sdT10WzFdLXJbMV0sbD1lWzFdLXJbMV0sYz1uWzFdLXJbMV0saD10WzJdLXJbMl0scD1lWzJdLXJbMl0sZj1uWzJdLXJbMl0sZz1vKmMsZD1hKmwseT1hKnUsdj1pKmMsXz1pKmwsbT1vKnUseD1oKihnLWQpK3AqKHktdikrZiooXy1tKSxFPTc3NzE1NjExNzIzNzYxMDNlLTMxKigoTWF0aC5hYnMoZykrTWF0aC5hYnMoZCkpKk1hdGguYWJzKGgpKyhNYXRoLmFicyh5KStNYXRoLmFicyh2KSkqTWF0aC5hYnMocCkrKE1hdGguYWJzKF8pK01hdGguYWJzKG0pKSpNYXRoLmFicyhmKSk7cmV0dXJuIHg+RXx8LXg+RT94OnModCxlLG4scil9XTtmdW5jdGlvbiB1KHQpe3ZhciBlPWFbdC5sZW5ndGhdO3JldHVybiBlfHwoZT1hW3QubGVuZ3RoXT1pKHQubGVuZ3RoKSksZS5hcHBseSh2b2lkIDAsdCl9IWZ1bmN0aW9uKCl7Zm9yKDthLmxlbmd0aDw9NTspYS5wdXNoKGkoYS5sZW5ndGgpKTtmb3IodmFyIGU9W10sbj1bInNsb3ciXSxyPTA7cjw9NTsrK3IpZS5wdXNoKCJhIityKSxuLnB1c2goIm8iK3IpO3ZhciBvPVsiZnVuY3Rpb24gZ2V0T3JpZW50YXRpb24oIixlLmpvaW4oKSwiKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOmNhc2UgMTpyZXR1cm4gMDsiXTtmb3Iocj0yO3I8PTU7KytyKW8ucHVzaCgiY2FzZSAiLHIsIjpyZXR1cm4gbyIsciwiKCIsZS5zbGljZSgwLHIpLmpvaW4oKSwiKTsiKTtvLnB1c2goIn12YXIgcz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoOysraSl7c1tpXT1hcmd1bWVudHNbaV19O3JldHVybiBzbG93KHMpO31yZXR1cm4gZ2V0T3JpZW50YXRpb24iKSxuLnB1c2goby5qb2luKCIiKSk7dmFyIHM9RnVuY3Rpb24uYXBwbHkodm9pZCAwLG4pO2Zvcih0LmV4cG9ydHM9cy5hcHBseSh2b2lkIDAsW3VdLmNvbmNhdChhKSkscj0wO3I8PTU7KytyKXQuZXhwb3J0c1tyXT1hW3JdfSgpfSkpLFd0PWZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8Myl7Zm9yKHZhciBuPW5ldyBBcnJheShlKSxyPTA7cjxlOysrciluW3JdPXI7cmV0dXJuIDI9PT1lJiZ0WzBdWzBdPT09dFsxXVswXSYmdFswXVsxXT09PXRbMV1bMV0/WzBdOm59dmFyIGk9bmV3IEFycmF5KGUpO2ZvcihyPTA7cjxlOysrcilpW3JdPXI7aS5zb3J0KChmdW5jdGlvbihlLG4pe3ZhciByPXRbZV1bMF0tdFtuXVswXTtyZXR1cm4gcnx8dFtlXVsxXS10W25dWzFdfSkpO3ZhciBvPVtpWzBdLGlbMV1dLHM9W2lbMF0saVsxXV07Zm9yKHI9MjtyPGU7KytyKXtmb3IodmFyIGE9aVtyXSx1PXRbYV0sbD1vLmxlbmd0aDtsPjEmJkp0KHRbb1tsLTJdXSx0W29bbC0xXV0sdSk8PTA7KWwtPTEsby5wb3AoKTtmb3Ioby5wdXNoKGEpLGw9cy5sZW5ndGg7bD4xJiZKdCh0W3NbbC0yXV0sdFtzW2wtMV1dLHUpPj0wOylsLT0xLHMucG9wKCk7cy5wdXNoKGEpfW49bmV3IEFycmF5KHMubGVuZ3RoK28ubGVuZ3RoLTIpO2Zvcih2YXIgYz0wLGg9KHI9MCxvLmxlbmd0aCk7cjxoOysrciluW2MrK109b1tyXTtmb3IodmFyIHA9cy5sZW5ndGgtMjtwPjA7LS1wKW5bYysrXT1zW3BdO3JldHVybiBufSxKdD1IdFszXTt2YXIgWnQ9UXQsS3Q9UXQ7ZnVuY3Rpb24gUXQodCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBRdCkpcmV0dXJuIG5ldyBRdCh0LGUpO2lmKHRoaXMuZGF0YT10fHxbXSx0aGlzLmxlbmd0aD10aGlzLmRhdGEubGVuZ3RoLHRoaXMuY29tcGFyZT1lfHwkdCx0aGlzLmxlbmd0aD4wKWZvcih2YXIgbj0odGhpcy5sZW5ndGg+PjEpLTE7bj49MDtuLS0pdGhpcy5fZG93bihuKX1mdW5jdGlvbiAkdCh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6MH1RdC5wcm90b3R5cGU9e3B1c2g6ZnVuY3Rpb24odCl7dGhpcy5kYXRhLnB1c2godCksdGhpcy5sZW5ndGgrKyx0aGlzLl91cCh0aGlzLmxlbmd0aC0xKX0scG9wOmZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmRhdGFbMF07cmV0dXJuIHRoaXMubGVuZ3RoLS0sdGhpcy5sZW5ndGg+MCYmKHRoaXMuZGF0YVswXT10aGlzLmRhdGFbdGhpcy5sZW5ndGhdLHRoaXMuX2Rvd24oMCkpLHRoaXMuZGF0YS5wb3AoKSx0fX0scGVlazpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGFbMF19LF91cDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5kYXRhLG49dGhpcy5jb21wYXJlLHI9ZVt0XTt0PjA7KXt2YXIgaT10LTE+PjEsbz1lW2ldO2lmKG4ocixvKT49MClicmVhaztlW3RdPW8sdD1pfWVbdF09cn0sX2Rvd246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZGF0YSxuPXRoaXMuY29tcGFyZSxyPXRoaXMubGVuZ3RoPj4xLGk9ZVt0XTt0PHI7KXt2YXIgbz0xKyh0PDwxKSxzPW8rMSxhPWVbb107aWYoczx0aGlzLmxlbmd0aCYmbihlW3NdLGEpPDAmJihvPXMsYT1lW3NdKSxuKGEsaSk+PTApYnJlYWs7ZVt0XT1hLHQ9b31lW3RdPWl9fSxadC5kZWZhdWx0PUt0O3ZhciB0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10WzBdLHI9dFsxXSxpPSExLG89MCxzPWUubGVuZ3RoLTE7bzxlLmxlbmd0aDtzPW8rKyl7dmFyIGE9ZVtvXVswXSx1PWVbb11bMV0sbD1lW3NdWzBdLGM9ZVtzXVsxXTt1PnIhPWM+ciYmbjwobC1hKSooci11KS8oYy11KSthJiYoaT0haSl9cmV0dXJuIGl9LGVlPUh0WzNdLG5lPWllLHJlPWllO2Z1bmN0aW9uIGllKHQsZSxuKXtlPU1hdGgubWF4KDAsdm9pZCAwPT09ZT8yOmUpLG49bnx8MDtmb3IodmFyIHIsaT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXSxuPXRbMF0scj10WzBdLGk9dFswXSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBzPXRbb107c1swXTxlWzBdJiYoZT1zKSxzWzBdPnJbMF0mJihyPXMpLHNbMV08blsxXSYmKG49cyksc1sxXT5pWzFdJiYoaT1zKX12YXIgYT1bZSxuLHIsaV0sdT1hLnNsaWNlKCk7Zm9yKG89MDtvPHQubGVuZ3RoO28rKyl0ZSh0W29dLGEpfHx1LnB1c2godFtvXSk7dmFyIGw9V3QodSksYz1bXTtmb3Iobz0wO288bC5sZW5ndGg7bysrKWMucHVzaCh1W2xbb11dKTtyZXR1cm4gY30odCksbz1OdCgxNixbIlswXSIsIlsxXSIsIlswXSIsIlsxXSJdKS5sb2FkKHQpLHM9W10sYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgdT1pW2FdO28ucmVtb3ZlKHUpLHI9aGUodSxyKSxzLnB1c2gocil9dmFyIGw9TnQoMTYpO2ZvcihhPTA7YTxzLmxlbmd0aDthKyspbC5pbnNlcnQoY2Uoc1thXSkpO2Zvcih2YXIgYz1lKmUsaD1uKm47cy5sZW5ndGg7KXt2YXIgcD1zLnNoaWZ0KCksZj1wLnAsZz1wLm5leHQucCxkPXBlKGYsZyk7aWYoIShkPGgpKXt2YXIgeT1kL2M7KHU9b2UobyxwLnByZXYucCxmLGcscC5uZXh0Lm5leHQucCx5LGwpKSYmTWF0aC5taW4ocGUodSxmKSxwZSh1LGcpKTw9eSYmKHMucHVzaChwKSxzLnB1c2goaGUodSxwKSksby5yZW1vdmUodSksbC5yZW1vdmUocCksbC5pbnNlcnQoY2UocCkpLGwuaW5zZXJ0KGNlKHAubmV4dCkpKX19cD1yO3ZhciB2PVtdO2Rve3YucHVzaChwLnApLHA9cC5uZXh0fXdoaWxlKHAhPT1yKTtyZXR1cm4gdi5wdXNoKHAucCksdn1mdW5jdGlvbiBvZSh0LGUsbixyLGksbyxzKXtmb3IodmFyIGE9bmV3IFp0KG51bGwsc2UpLHU9dC5kYXRhO3U7KXtmb3IodmFyIGw9MDtsPHUuY2hpbGRyZW4ubGVuZ3RoO2wrKyl7dmFyIGM9dS5jaGlsZHJlbltsXSxoPXUubGVhZj9mZShjLG4scik6YWUobixyLGMpO2g+b3x8YS5wdXNoKHtub2RlOmMsZGlzdDpofSl9Zm9yKDthLmxlbmd0aCYmIWEucGVlaygpLm5vZGUuY2hpbGRyZW47KXt2YXIgcD1hLnBvcCgpLGY9cC5ub2RlLGc9ZmUoZixlLG4pLGQ9ZmUoZixyLGkpO2lmKHAuZGlzdDxnJiZwLmRpc3Q8ZCYmbGUobixmLHMpJiZsZShyLGYscykpcmV0dXJuIGZ9KHU9YS5wb3AoKSkmJih1PXUubm9kZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gc2UodCxlKXtyZXR1cm4gdC5kaXN0LWUuZGlzdH1mdW5jdGlvbiBhZSh0LGUsbil7aWYodWUodCxuKXx8dWUoZSxuKSlyZXR1cm4gMDt2YXIgcj1nZSh0WzBdLHRbMV0sZVswXSxlWzFdLG4ubWluWCxuLm1pblksbi5tYXhYLG4ubWluWSk7aWYoMD09PXIpcmV0dXJuIDA7dmFyIGk9Z2UodFswXSx0WzFdLGVbMF0sZVsxXSxuLm1pblgsbi5taW5ZLG4ubWluWCxuLm1heFkpO2lmKDA9PT1pKXJldHVybiAwO3ZhciBvPWdlKHRbMF0sdFsxXSxlWzBdLGVbMV0sbi5tYXhYLG4ubWluWSxuLm1heFgsbi5tYXhZKTtpZigwPT09bylyZXR1cm4gMDt2YXIgcz1nZSh0WzBdLHRbMV0sZVswXSxlWzFdLG4ubWluWCxuLm1heFksbi5tYXhYLG4ubWF4WSk7cmV0dXJuIDA9PT1zPzA6TWF0aC5taW4ocixpLG8scyl9ZnVuY3Rpb24gdWUodCxlKXtyZXR1cm4gdFswXT49ZS5taW5YJiZ0WzBdPD1lLm1heFgmJnRbMV0+PWUubWluWSYmdFsxXTw9ZS5tYXhZfWZ1bmN0aW9uIGxlKHQsZSxuKXtmb3IodmFyIHIsaSxvLHMsYT1NYXRoLm1pbih0WzBdLGVbMF0pLHU9TWF0aC5taW4odFsxXSxlWzFdKSxsPU1hdGgubWF4KHRbMF0sZVswXSksYz1NYXRoLm1heCh0WzFdLGVbMV0pLGg9bi5zZWFyY2goe21pblg6YSxtaW5ZOnUsbWF4WDpsLG1heFk6Y30pLHA9MDtwPGgubGVuZ3RoO3ArKylpZihyPWhbcF0ucCxpPWhbcF0ubmV4dC5wLG89dCxyIT09KHM9ZSkmJmkhPT1vJiZlZShyLGksbyk+MCE9ZWUocixpLHMpPjAmJmVlKG8scyxyKT4wIT1lZShvLHMsaSk+MClyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBjZSh0KXt2YXIgZT10LnAsbj10Lm5leHQucDtyZXR1cm4gdC5taW5YPU1hdGgubWluKGVbMF0sblswXSksdC5taW5ZPU1hdGgubWluKGVbMV0sblsxXSksdC5tYXhYPU1hdGgubWF4KGVbMF0sblswXSksdC5tYXhZPU1hdGgubWF4KGVbMV0sblsxXSksdH1mdW5jdGlvbiBoZSh0LGUpe3ZhciBuPXtwOnQscHJldjpudWxsLG5leHQ6bnVsbCxtaW5YOjAsbWluWTowLG1heFg6MCxtYXhZOjB9O3JldHVybiBlPyhuLm5leHQ9ZS5uZXh0LG4ucHJldj1lLGUubmV4dC5wcmV2PW4sZS5uZXh0PW4pOihuLnByZXY9bixuLm5leHQ9biksbn1mdW5jdGlvbiBwZSh0LGUpe3ZhciBuPXRbMF0tZVswXSxyPXRbMV0tZVsxXTtyZXR1cm4gbipuK3Iqcn1mdW5jdGlvbiBmZSh0LGUsbil7dmFyIHI9ZVswXSxpPWVbMV0sbz1uWzBdLXIscz1uWzFdLWk7aWYoMCE9PW98fDAhPT1zKXt2YXIgYT0oKHRbMF0tcikqbysodFsxXS1pKSpzKS8obypvK3Mqcyk7YT4xPyhyPW5bMF0saT1uWzFdKTphPjAmJihyKz1vKmEsaSs9cyphKX1yZXR1cm4obz10WzBdLXIpKm8rKHM9dFsxXS1pKSpzfWZ1bmN0aW9uIGdlKHQsZSxuLHIsaSxvLHMsYSl7dmFyIHUsbCxjLGgscD1uLXQsZj1yLWUsZz1zLWksZD1hLW8seT10LWksdj1lLW8sXz1wKnArZipmLG09cCpnK2YqZCx4PWcqZytkKmQsRT1wKnkrZip2LGI9Zyp5K2Qqdix3PV8qeC1tKm0sST13LE49dzswPT09dz8obD0wLEk9MSxoPWIsTj14KTooaD1fKmItbSpFLChsPW0qYi14KkUpPDA/KGw9MCxoPWIsTj14KTpsPkkmJihsPUksaD1iK20sTj14KSksaDwwPyhoPTAsLUU8MD9sPTA6LUU+Xz9sPUk6KGw9LUUsST1fKSk6aD5OJiYoaD1OLC1FK208MD9sPTA6LUUrbT5fP2w9SToobD0tRSttLEk9XykpO3ZhciBTPSgxLShjPTA9PT1oPzA6aC9OKSkqaStjKnMtKCgxLSh1PTA9PT1sPzA6bC9JKSkqdCt1Km4pLEM9KDEtYykqbytjKmEtKCgxLXUpKmUrdSpyKTtyZXR1cm4gUypTK0MqQ31mdW5jdGlvbiBkZSh0LGUpe3ZvaWQgMD09PWUmJihlPXt9KSxlLmNvbmNhdml0eT1lLmNvbmNhdml0eXx8MS8wO3ZhciBuPVtdO2lmKFIodCwoZnVuY3Rpb24odCl7bi5wdXNoKFt0WzBdLHRbMV1dKX0pKSwhbi5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIHI9bmUobixlLmNvbmNhdml0eSk7cmV0dXJuIHIubGVuZ3RoPjM/bChbcl0pOm51bGx9ZnVuY3Rpb24geWUodCxlLG4pe2lmKHZvaWQgMD09PW4mJihuPXt9KSwhdCl0aHJvdyBuZXcgRXJyb3IoInBvaW50IGlzIHJlcXVpcmVkIik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJwb2x5Z29uIGlzIHJlcXVpcmVkIik7dmFyIHI9Syh0KSxpPXJ0KGUpLG89aS50eXBlLHM9ZS5iYm94LGE9aS5jb29yZGluYXRlcztpZihzJiYhMT09PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVbMF08PXRbMF0mJmVbMV08PXRbMV0mJmVbMl0+PXRbMF0mJmVbM10+PXRbMV19KHIscykpcmV0dXJuITE7IlBvbHlnb24iPT09byYmKGE9W2FdKTtmb3IodmFyIHU9ITEsbD0wO2w8YS5sZW5ndGgmJiF1O2wrKylpZih2ZShyLGFbbF1bMF0sbi5pZ25vcmVCb3VuZGFyeSkpe2Zvcih2YXIgYz0hMSxoPTE7aDxhW2xdLmxlbmd0aCYmIWM7KXZlKHIsYVtsXVtoXSwhbi5pZ25vcmVCb3VuZGFyeSkmJihjPSEwKSxoKys7Y3x8KHU9ITApfXJldHVybiB1fWZ1bmN0aW9uIHZlKHQsZSxuKXt2YXIgcj0hMTtlWzBdWzBdPT09ZVtlLmxlbmd0aC0xXVswXSYmZVswXVsxXT09PWVbZS5sZW5ndGgtMV1bMV0mJihlPWUuc2xpY2UoMCxlLmxlbmd0aC0xKSk7Zm9yKHZhciBpPTAsbz1lLmxlbmd0aC0xO2k8ZS5sZW5ndGg7bz1pKyspe3ZhciBzPWVbaV1bMF0sYT1lW2ldWzFdLHU9ZVtvXVswXSxsPWVbb11bMV07aWYodFsxXSoocy11KSthKih1LXRbMF0pK2wqKHRbMF0tcyk9PTAmJihzLXRbMF0pKih1LXRbMF0pPD0wJiYoYS10WzFdKSoobC10WzFdKTw9MClyZXR1cm4hbjthPnRbMV0hPWw+dFsxXSYmdFswXTwodS1zKSoodFsxXS1hKS8obC1hKStzJiYocj0hcil9cmV0dXJuIHJ9ZnVuY3Rpb24gX2UodCxlKXt2YXIgbj1bXTtyZXR1cm4gRih0LChmdW5jdGlvbih0KXt2YXIgcj0hMTtpZigiUG9pbnQiPT09dC5nZW9tZXRyeS50eXBlKXEoZSwoZnVuY3Rpb24oZSl7eWUodCxlKSYmKHI9ITApfSkpLHImJm4ucHVzaCh0KTtlbHNle2lmKCJNdWx0aVBvaW50IiE9PXQuZ2VvbWV0cnkudHlwZSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IGdlb21ldHJ5IG11c3QgYmUgYSBQb2ludCBvciBNdWx0aVBvaW50Iik7dmFyIGk9W107cShlLChmdW5jdGlvbihlKXtSKHQsKGZ1bmN0aW9uKHQpe3llKHQsZSkmJihyPSEwLGkucHVzaCh0KSl9KSl9KSksciYmbi5wdXNoKGQoaSkpfX0pKSxmKG4pfWZ1bmN0aW9uIG1lKHQsZSxuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9Syh0KSxpPUsoZSksbz1JKGlbMV0tclsxXSkscz1JKGlbMF0tclswXSksYT1JKHJbMV0pLHU9SShpWzFdKSxsPU1hdGgucG93KE1hdGguc2luKG8vMiksMikrTWF0aC5wb3coTWF0aC5zaW4ocy8yKSwyKSpNYXRoLmNvcyhhKSpNYXRoLmNvcyh1KTtyZXR1cm4gbSgyKk1hdGguYXRhbjIoTWF0aC5zcXJ0KGwpLE1hdGguc3FydCgxLWwpKSxuLnVuaXRzKX1mdW5jdGlvbiB4ZSh0LGUpe3ZhciBuPSExO3JldHVybiBmKGZ1bmN0aW9uKHQpe2lmKHQubGVuZ3RoPDMpcmV0dXJuW107dC5zb3J0KGJlKTt2YXIgZSxuLHIsaSxvLHMsYT10Lmxlbmd0aC0xLHU9dFthXS54LGw9dFswXS54LGM9dFthXS55LGg9YyxwPTFlLTEyO2Zvcig7YS0tOyl0W2FdLnk8YyYmKGM9dFthXS55KSx0W2FdLnk+aCYmKGg9dFthXS55KTt2YXIgZixnPWwtdSxkPWgtYyx5PWc+ZD9nOmQsdj0uNSoobCt1KSxfPS41KihoK2MpLG09W25ldyBFZSh7X19zZW50aW5lbDohMCx4OnYtMjAqeSx5Ol8teX0se19fc2VudGluZWw6ITAseDp2LHk6XysyMCp5fSx7X19zZW50aW5lbDohMCx4OnYrMjAqeSx5Ol8teX0pXSx4PVtdLEU9W107YT10Lmxlbmd0aDtmb3IoO2EtLTspe2ZvcihFLmxlbmd0aD0wLGY9bS5sZW5ndGg7Zi0tOykoZz10W2FdLngtbVtmXS54KT4wJiZnKmc+bVtmXS5yPyh4LnB1c2gobVtmXSksbS5zcGxpY2UoZiwxKSk6ZypnKyhkPXRbYV0ueS1tW2ZdLnkpKmQ+bVtmXS5yfHwoRS5wdXNoKG1bZl0uYSxtW2ZdLmIsbVtmXS5iLG1bZl0uYyxtW2ZdLmMsbVtmXS5hKSxtLnNwbGljZShmLDEpKTtmb3Iod2UoRSksZj1FLmxlbmd0aDtmOyluPUVbLS1mXSxlPUVbLS1mXSxyPXRbYV0saT1uLngtZS54LG89bi55LWUueSxzPTIqKGkqKHIueS1uLnkpLW8qKHIueC1uLngpKSxNYXRoLmFicyhzKT5wJiZtLnB1c2gobmV3IEVlKGUsbixyKSl9QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoeCxtKSxhPXgubGVuZ3RoO2Zvcig7YS0tOykoeFthXS5hLl9fc2VudGluZWx8fHhbYV0uYi5fX3NlbnRpbmVsfHx4W2FdLmMuX19zZW50aW5lbCkmJnguc3BsaWNlKGEsMSk7cmV0dXJuIHh9KHQuZmVhdHVyZXMubWFwKChmdW5jdGlvbih0KXt2YXIgcj17eDp0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLHk6dC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXX07cmV0dXJuIGU/ci56PXQucHJvcGVydGllc1tlXTozPT09dC5nZW9tZXRyeS5jb29yZGluYXRlcy5sZW5ndGgmJihuPSEwLHIuej10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzJdKSxyfSkpKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPVt0LmEueCx0LmEueV0scj1bdC5iLngsdC5iLnldLGk9W3QuYy54LHQuYy55XSxvPXt9O3JldHVybiBuPyhlLnB1c2godC5hLnopLHIucHVzaCh0LmIueiksaS5wdXNoKHQuYy56KSk6bz17YTp0LmEueixiOnQuYi56LGM6dC5jLnp9LGwoW1tlLHIsaSxlXV0sbyl9KSkpfW5lLmRlZmF1bHQ9cmU7dmFyIEVlPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLmM9bjt2YXIgcixpLG89ZS54LXQueCxzPWUueS10LnksYT1uLngtdC54LHU9bi55LXQueSxsPW8qKHQueCtlLngpK3MqKHQueStlLnkpLGM9YSoodC54K24ueCkrdSoodC55K24ueSksaD0yKihvKihuLnktZS55KS1zKihuLngtZS54KSk7dGhpcy54PSh1KmwtcypjKS9oLHRoaXMueT0obypjLWEqbCkvaCxyPXRoaXMueC10LngsaT10aGlzLnktdC55LHRoaXMucj1yKnIraSppfTtmdW5jdGlvbiBiZSh0LGUpe3JldHVybiBlLngtdC54fWZ1bmN0aW9uIHdlKHQpe3ZhciBlLG4scixpLG8scz10Lmxlbmd0aDt0OmZvcig7czspZm9yKG49dFstLXNdLGU9dFstLXNdLHI9cztyOylpZihvPXRbLS1yXSxlPT09KGk9dFstLXJdKSYmbj09PW98fGU9PT1vJiZuPT09aSl7dC5zcGxpY2UocywyKSx0LnNwbGljZShyLDIpLHMtPTI7Y29udGludWUgdH19ZnVuY3Rpb24gSWUodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7c3dpdGNoKHQudHlwZSl7Y2FzZSJGZWF0dXJlIjpyZXR1cm4gTmUodCk7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiJ9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihuKXtzd2l0Y2gobil7Y2FzZSJ0eXBlIjpjYXNlImZlYXR1cmVzIjpyZXR1cm47ZGVmYXVsdDplW25dPXRbbl19fSkpLGUuZmVhdHVyZXM9dC5mZWF0dXJlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBOZSh0KX0pKSxlfSh0KTtjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aVBvaW50IjpjYXNlIk11bHRpTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvbHlnb24iOmNhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpyZXR1cm4gQ2UodCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVua25vd24gR2VvSlNPTiB0eXBlIil9fWZ1bmN0aW9uIE5lKHQpe3ZhciBlPXt0eXBlOiJGZWF0dXJlIn07cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3N3aXRjaChuKXtjYXNlInR5cGUiOmNhc2UicHJvcGVydGllcyI6Y2FzZSJnZW9tZXRyeSI6cmV0dXJuO2RlZmF1bHQ6ZVtuXT10W25dfX0pKSxlLnByb3BlcnRpZXM9U2UodC5wcm9wZXJ0aWVzKSxlLmdlb21ldHJ5PUNlKHQuZ2VvbWV0cnkpLGV9ZnVuY3Rpb24gU2UodCl7dmFyIGU9e307cmV0dXJuIHQ/KE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPXRbbl07Im9iamVjdCI9PXR5cGVvZiByP251bGw9PT1yP2Vbbl09bnVsbDpBcnJheS5pc0FycmF5KHIpP2Vbbl09ci5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpOmVbbl09U2Uocik6ZVtuXT1yfSkpLGUpOmV9ZnVuY3Rpb24gQ2UodCl7dmFyIGU9e3R5cGU6dC50eXBlfTtyZXR1cm4gdC5iYm94JiYoZS5iYm94PXQuYmJveCksIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT10LnR5cGU/KGUuZ2VvbWV0cmllcz10Lmdlb21ldHJpZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gQ2UodCl9KSksZSk6KGUuY29vcmRpbmF0ZXM9UGUodC5jb29yZGluYXRlcyksZSl9ZnVuY3Rpb24gUGUodCl7dmFyIGU9dDtyZXR1cm4ib2JqZWN0IiE9dHlwZW9mIGVbMF0/ZS5zbGljZSgpOmUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gUGUodCl9KSl9ZnVuY3Rpb24gTWUodCxlKXtpZih2b2lkIDA9PT1lJiYoZT17fSksIVAoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj1lLm11dGF0ZTtpZigiRmVhdHVyZUNvbGxlY3Rpb24iIT09aXQodCkpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIG11c3QgYmUgYSBGZWF0dXJlQ29sbGVjdGlvbiIpO2lmKCF0LmZlYXR1cmVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgZW1wdHkiKTshMSE9PW4mJnZvaWQgMCE9PW58fCh0PUllKHQpKTt2YXIgcj1bXSxpPVkodCwoZnVuY3Rpb24odCxlKXt2YXIgbj1mdW5jdGlvbih0LGUpe3ZhciBuLHI9dC5nZW9tZXRyeS5jb29yZGluYXRlcyxpPWUuZ2VvbWV0cnkuY29vcmRpbmF0ZXMsbz1MZShyWzBdKSxzPUxlKHJbci5sZW5ndGgtMV0pLGE9TGUoaVswXSksdT1MZShpW2kubGVuZ3RoLTFdKTtpZihvPT09dSluPWkuY29uY2F0KHIuc2xpY2UoMSkpO2Vsc2UgaWYoYT09PXMpbj1yLmNvbmNhdChpLnNsaWNlKDEpKTtlbHNlIGlmKG89PT1hKW49ci5zbGljZSgxKS5yZXZlcnNlKCkuY29uY2F0KGkpO2Vsc2V7aWYocyE9PXUpcmV0dXJuIG51bGw7bj1yLmNvbmNhdChpLnJldmVyc2UoKS5zbGljZSgxKSl9cmV0dXJuIGgobil9KHQsZSk7cmV0dXJuIG58fChyLnB1c2godCksZSl9KSk7cmV0dXJuIGkmJnIucHVzaChpKSxyLmxlbmd0aD8xPT09ci5sZW5ndGg/clswXTpnKHIubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jb29yZGluYXRlc30pKSk6bnVsbH1mdW5jdGlvbiBMZSh0KXtyZXR1cm4gdFswXS50b1N0cmluZygpKyIsIit0WzFdLnRvU3RyaW5nKCl9ZnVuY3Rpb24gT2UodCl7cmV0dXJuIHR9ZnVuY3Rpb24gUmUodCxlKXt2YXIgbj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiBPZTt2YXIgZSxuLHI9dC5zY2FsZVswXSxpPXQuc2NhbGVbMV0sbz10LnRyYW5zbGF0ZVswXSxzPXQudHJhbnNsYXRlWzFdO3JldHVybiBmdW5jdGlvbih0LGEpe2F8fChlPW49MCk7dmFyIHU9MixsPXQubGVuZ3RoLGM9bmV3IEFycmF5KGwpO2ZvcihjWzBdPShlKz10WzBdKSpyK28sY1sxXT0obis9dFsxXSkqaStzO3U8bDspY1t1XT10W3VdLCsrdTtyZXR1cm4gY319KHQudHJhbnNmb3JtKSxyPXQuYXJjcztmdW5jdGlvbiBpKHQsZSl7ZS5sZW5ndGgmJmUucG9wKCk7Zm9yKHZhciBpPXJbdDwwP350OnRdLG89MCxzPWkubGVuZ3RoO288czsrK28pZS5wdXNoKG4oaVtvXSxvKSk7dDwwJiZmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyPXQubGVuZ3RoLGk9ci1lO2k8LS1yOyluPXRbaV0sdFtpKytdPXRbcl0sdFtyXT1ufShlLHMpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIG4odCl9ZnVuY3Rpb24gcyh0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5sZW5ndGg7bjxyOysrbilpKHRbbl0sZSk7cmV0dXJuIGUubGVuZ3RoPDImJmUucHVzaChlWzBdKSxlfWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlPXModCk7ZS5sZW5ndGg8NDspZS5wdXNoKGVbMF0pO3JldHVybiBlfWZ1bmN0aW9uIHUodCl7cmV0dXJuIHQubWFwKGEpfXJldHVybiBmdW5jdGlvbiB0KGUpe3ZhciBuLHI9ZS50eXBlO3N3aXRjaChyKXtjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6cmV0dXJue3R5cGU6cixnZW9tZXRyaWVzOmUuZ2VvbWV0cmllcy5tYXAodCl9O2Nhc2UiUG9pbnQiOm49byhlLmNvb3JkaW5hdGVzKTticmVhaztjYXNlIk11bHRpUG9pbnQiOm49ZS5jb29yZGluYXRlcy5tYXAobyk7YnJlYWs7Y2FzZSJMaW5lU3RyaW5nIjpuPXMoZS5hcmNzKTticmVhaztjYXNlIk11bHRpTGluZVN0cmluZyI6bj1lLmFyY3MubWFwKHMpO2JyZWFrO2Nhc2UiUG9seWdvbiI6bj11KGUuYXJjcyk7YnJlYWs7Y2FzZSJNdWx0aVBvbHlnb24iOm49ZS5hcmNzLm1hcCh1KTticmVhaztkZWZhdWx0OnJldHVybiBudWxsfXJldHVybnt0eXBlOnIsY29vcmRpbmF0ZXM6bn19KGUpfWZ1bmN0aW9uIFRlKHQsZSl7dmFyIG49e30scj17fSxpPXt9LG89W10scz0tMTtmdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByIGluIHQpe3ZhciBpPXRbcl07ZGVsZXRlIGVbaS5zdGFydF0sZGVsZXRlIGkuc3RhcnQsZGVsZXRlIGkuZW5kLGkuZm9yRWFjaCgoZnVuY3Rpb24odCl7blt0PDA/fnQ6dF09MX0pKSxvLnB1c2goaSl9fXJldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKG4scil7dmFyIGksbz10LmFyY3NbbjwwP35uOm5dO28ubGVuZ3RoPDMmJiFvWzFdWzBdJiYhb1sxXVsxXSYmKGk9ZVsrK3NdLGVbc109bixlW3JdPWkpfSkpLGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG4sbyxzPWZ1bmN0aW9uKGUpe3ZhciBuLHI9dC5hcmNzW2U8MD9+ZTplXSxpPXJbMF07dC50cmFuc2Zvcm0/KG49WzAsMF0sci5mb3JFYWNoKChmdW5jdGlvbih0KXtuWzBdKz10WzBdLG5bMV0rPXRbMV19KSkpOm49cltyLmxlbmd0aC0xXTtyZXR1cm4gZTwwP1tuLGldOltpLG5dfShlKSxhPXNbMF0sdT1zWzFdO2lmKG49aVthXSlpZihkZWxldGUgaVtuLmVuZF0sbi5wdXNoKGUpLG4uZW5kPXUsbz1yW3VdKXtkZWxldGUgcltvLnN0YXJ0XTt2YXIgbD1vPT09bj9uOm4uY29uY2F0KG8pO3JbbC5zdGFydD1uLnN0YXJ0XT1pW2wuZW5kPW8uZW5kXT1sfWVsc2UgcltuLnN0YXJ0XT1pW24uZW5kXT1uO2Vsc2UgaWYobj1yW3VdKWlmKGRlbGV0ZSByW24uc3RhcnRdLG4udW5zaGlmdChlKSxuLnN0YXJ0PWEsbz1pW2FdKXtkZWxldGUgaVtvLmVuZF07dmFyIGM9bz09PW4/bjpvLmNvbmNhdChuKTtyW2Muc3RhcnQ9by5zdGFydF09aVtjLmVuZD1uLmVuZF09Y31lbHNlIHJbbi5zdGFydF09aVtuLmVuZF09bjtlbHNlIHJbKG49W2VdKS5zdGFydD1hXT1pW24uZW5kPXVdPW59KSksYShpLHIpLGEocixpKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe25bdDwwP350OnRdfHxvLnB1c2goW3RdKX0pKSxvfWZ1bmN0aW9uIEFlKHQsZSl7dmFyIG49e30scj1bXSxpPVtdO2Z1bmN0aW9uIG8odCl7dC5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyhuW2U9ZTwwP35lOmVdfHwobltlXT1bXSkpLnB1c2godCl9KSl9KSksci5wdXNoKHQpfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPS0xLHI9dC5sZW5ndGgsaT10W3ItMV0sbz0wOysrbjxyOyllPWksaT10W25dLG8rPWVbMF0qaVsxXS1lWzFdKmlbMF07cmV0dXJuIE1hdGguYWJzKG8pfShSZSh0LHt0eXBlOiJQb2x5Z29uIixhcmNzOltlXX0pLmNvb3JkaW5hdGVzWzBdKX1yZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbiB0KGUpe3N3aXRjaChlLnR5cGUpe2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjplLmdlb21ldHJpZXMuZm9yRWFjaCh0KTticmVhaztjYXNlIlBvbHlnb24iOm8oZS5hcmNzKTticmVhaztjYXNlIk11bHRpUG9seWdvbiI6ZS5hcmNzLmZvckVhY2gobyl9fSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIXQuXyl7dmFyIGU9W10scj1bdF07Zm9yKHQuXz0xLGkucHVzaChlKTt0PXIucG9wKCk7KWUucHVzaCh0KSx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7blt0PDA/fnQ6dF0uZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5ffHwodC5fPTEsci5wdXNoKHQpKX0pKX0pKX0pKX19KSksci5mb3JFYWNoKChmdW5jdGlvbih0KXtkZWxldGUgdC5ffSkpLHt0eXBlOiJNdWx0aVBvbHlnb24iLGFyY3M6aS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciByLGk9W107aWYoZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7blt0PDA/fnQ6dF0ubGVuZ3RoPDImJmkucHVzaCh0KX0pKX0pKX0pKSwocj0oaT1UZSh0LGkpKS5sZW5ndGgpPjEpZm9yKHZhciBvLGEsdT0xLGw9cyhpWzBdKTt1PHI7Kyt1KShvPXMoaVt1XSkpPmwmJihhPWlbMF0saVswXT1pW3VdLGlbdV09YSxsPW8pO3JldHVybiBpfSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoPjB9KSl9fXZhciBEZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEZlKHQsZSxuLHIsaSxvKXszPT09YXJndW1lbnRzLmxlbmd0aCYmKHI9bz1BcnJheSxpPW51bGwpO2Zvcih2YXIgcz1uZXcgcih0PTE8PE1hdGgubWF4KDQsTWF0aC5jZWlsKE1hdGgubG9nKHQpL01hdGguTE4yKSkpLGE9bmV3IG8odCksdT10LTEsbD0wO2w8dDsrK2wpc1tsXT1pO2Z1bmN0aW9uIGMocixvKXtmb3IodmFyIGw9ZShyKSZ1LGM9c1tsXSxoPTA7YyE9aTspe2lmKG4oYyxyKSlyZXR1cm4gYVtsXT1vO2lmKCsraD49dCl0aHJvdyBuZXcgRXJyb3IoImZ1bGwgaGFzaG1hcCIpO2M9c1tsPWwrMSZ1XX1yZXR1cm4gc1tsXT1yLGFbbF09byxvfWZ1bmN0aW9uIGgocixvKXtmb3IodmFyIGw9ZShyKSZ1LGM9c1tsXSxoPTA7YyE9aTspe2lmKG4oYyxyKSlyZXR1cm4gYVtsXTtpZigrK2g+PXQpdGhyb3cgbmV3IEVycm9yKCJmdWxsIGhhc2htYXAiKTtjPXNbbD1sKzEmdV19cmV0dXJuIHNbbF09cixhW2xdPW8sb31mdW5jdGlvbiBwKHIsbyl7Zm9yKHZhciBsPWUocikmdSxjPXNbbF0saD0wO2MhPWk7KXtpZihuKGMscikpcmV0dXJuIGFbbF07aWYoKytoPj10KWJyZWFrO2M9c1tsPWwrMSZ1XX1yZXR1cm4gb31mdW5jdGlvbiBmKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXMubGVuZ3RoO2U8bjsrK2Upe3ZhciByPXNbZV07ciE9aSYmdC5wdXNoKHIpfXJldHVybiB0fXJldHVybntzZXQ6YyxtYXliZVNldDpoLGdldDpwLGtleXM6Zn19ZnVuY3Rpb24ga2UodCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdfXZhciBHZT1uZXcgQXJyYXlCdWZmZXIoMTYpLHFlPW5ldyBGbG9hdDY0QXJyYXkoR2UpLEJlPW5ldyBVaW50MzJBcnJheShHZSk7ZnVuY3Rpb24gemUodCl7cWVbMF09dFswXSxxZVsxXT10WzFdO3ZhciBlPUJlWzBdXkJlWzFdO3JldHVybiAyMTQ3NDgzNjQ3JihlPWU8PDVeZT4+N15CZVsyXV5CZVszXSl9ZnVuY3Rpb24gamUodCl7dmFyIGUsbixyLGksbz10LmNvb3JkaW5hdGVzLHM9dC5saW5lcyxhPXQucmluZ3MsdT1mdW5jdGlvbigpe2Zvcih2YXIgdD1GZSgxLjQqby5sZW5ndGgsRSxiLEludDMyQXJyYXksLTEsSW50MzJBcnJheSksZT1uZXcgSW50MzJBcnJheShvLmxlbmd0aCksbj0wLHI9by5sZW5ndGg7bjxyOysrbillW25dPXQubWF5YmVTZXQobixuKTtyZXR1cm4gZX0oKSxsPW5ldyBJbnQzMkFycmF5KG8ubGVuZ3RoKSxjPW5ldyBJbnQzMkFycmF5KG8ubGVuZ3RoKSxoPW5ldyBJbnQzMkFycmF5KG8ubGVuZ3RoKSxwPW5ldyBJbnQ4QXJyYXkoby5sZW5ndGgpLGY9MDtmb3IoZT0wLG49by5sZW5ndGg7ZTxuOysrZSlsW2VdPWNbZV09aFtlXT0tMTtmb3IoZT0wLG49cy5sZW5ndGg7ZTxuOysrZSl7dmFyIGc9c1tlXSxkPWdbMF0seT1nWzFdO2ZvcihyPXVbZF0saT11WysrZF0sKytmLHBbcl09MTsrK2Q8PXk7KXgoZSxyLHI9aSxpPXVbZF0pOysrZixwW2ldPTF9Zm9yKGU9MCxuPW8ubGVuZ3RoO2U8bjsrK2UpbFtlXT0tMTtmb3IoZT0wLG49YS5sZW5ndGg7ZTxuOysrZSl7dmFyIHY9YVtlXSxfPXZbMF0rMSxtPXZbMV07Zm9yKHgoZSx1W20tMV0scj11W18tMV0saT11W19dKTsrK188PW07KXgoZSxyLHI9aSxpPXVbX10pfWZ1bmN0aW9uIHgodCxlLG4scil7aWYobFtuXSE9PXQpe2xbbl09dDt2YXIgaT1jW25dO2lmKGk+PTApe3ZhciBvPWhbbl07aT09PWUmJm89PT1yfHxpPT09ciYmbz09PWV8fCgrK2YscFtuXT0xKX1lbHNlIGNbbl09ZSxoW25dPXJ9fWZ1bmN0aW9uIEUodCl7cmV0dXJuIHplKG9bdF0pfWZ1bmN0aW9uIGIodCxlKXtyZXR1cm4ga2Uob1t0XSxvW2VdKX1sPWM9aD1udWxsO3ZhciB3LEk9ZnVuY3Rpb24odCxlLG4scixpKXszPT09YXJndW1lbnRzLmxlbmd0aCYmKHI9QXJyYXksaT1udWxsKTtmb3IodmFyIG89bmV3IHIodD0xPDxNYXRoLm1heCg0LE1hdGguY2VpbChNYXRoLmxvZyh0KS9NYXRoLkxOMikpKSxzPXQtMSxhPTA7YTx0OysrYSlvW2FdPWk7ZnVuY3Rpb24gdShyKXtmb3IodmFyIGE9ZShyKSZzLHU9b1thXSxsPTA7dSE9aTspe2lmKG4odSxyKSlyZXR1cm4hMDtpZigrK2w+PXQpdGhyb3cgbmV3IEVycm9yKCJmdWxsIGhhc2hzZXQiKTt1PW9bYT1hKzEmc119cmV0dXJuIG9bYV09ciwhMH1mdW5jdGlvbiBsKHIpe2Zvcih2YXIgYT1lKHIpJnMsdT1vW2FdLGw9MDt1IT1pOyl7aWYobih1LHIpKXJldHVybiEwO2lmKCsrbD49dClicmVhazt1PW9bYT1hKzEmc119cmV0dXJuITF9ZnVuY3Rpb24gYygpe2Zvcih2YXIgdD1bXSxlPTAsbj1vLmxlbmd0aDtlPG47KytlKXt2YXIgcj1vW2VdO3IhPWkmJnQucHVzaChyKX1yZXR1cm4gdH1yZXR1cm57YWRkOnUsaGFzOmwsdmFsdWVzOmN9fSgxLjQqZix6ZSxrZSk7Zm9yKGU9MCxuPW8ubGVuZ3RoO2U8bjsrK2UpcFt3PXVbZV1dJiZJLmFkZChvW3ddKTtyZXR1cm4gSX1mdW5jdGlvbiBVZSh0LGUsbixyKXtWZSh0LGUsbiksVmUodCxlLGUrciksVmUodCxlK3Isbil9ZnVuY3Rpb24gVmUodCxlLG4pe2Zvcih2YXIgcixpPWUrKG4tLS1lPj4xKTtlPGk7KytlLC0tbilyPXRbZV0sdFtlXT10W25dLHRbbl09cn1mdW5jdGlvbiBYZSh0KXt2YXIgZSxuLHI9e307Zm9yKGUgaW4gdClyW2VdPW51bGw9PShuPXRbZV0pP3t0eXBlOm51bGx9OigiRmVhdHVyZUNvbGxlY3Rpb24iPT09bi50eXBlP1llOiJGZWF0dXJlIj09PW4udHlwZT9IZTpXZSkobik7cmV0dXJuIHJ9ZnVuY3Rpb24gWWUodCl7dmFyIGU9e3R5cGU6Ikdlb21ldHJ5Q29sbGVjdGlvbiIsZ2VvbWV0cmllczp0LmZlYXR1cmVzLm1hcChIZSl9O3JldHVybiBudWxsIT10LmJib3gmJihlLmJib3g9dC5iYm94KSxlfWZ1bmN0aW9uIEhlKHQpe3ZhciBlLG49V2UodC5nZW9tZXRyeSk7Zm9yKGUgaW4gbnVsbCE9dC5pZCYmKG4uaWQ9dC5pZCksbnVsbCE9dC5iYm94JiYobi5iYm94PXQuYmJveCksdC5wcm9wZXJ0aWVzKXtuLnByb3BlcnRpZXM9dC5wcm9wZXJ0aWVzO2JyZWFrfXJldHVybiBufWZ1bmN0aW9uIFdlKHQpe2lmKG51bGw9PXQpcmV0dXJue3R5cGU6bnVsbH07dmFyIGU9Ikdlb21ldHJ5Q29sbGVjdGlvbiI9PT10LnR5cGU/e3R5cGU6Ikdlb21ldHJ5Q29sbGVjdGlvbiIsZ2VvbWV0cmllczp0Lmdlb21ldHJpZXMubWFwKFdlKX06IlBvaW50Ij09PXQudHlwZXx8Ik11bHRpUG9pbnQiPT09dC50eXBlP3t0eXBlOnQudHlwZSxjb29yZGluYXRlczp0LmNvb3JkaW5hdGVzfTp7dHlwZTp0LnR5cGUsYXJjczp0LmNvb3JkaW5hdGVzfTtyZXR1cm4gbnVsbCE9dC5iYm94JiYoZS5iYm94PXQuYmJveCksZX1mdW5jdGlvbiBKZSh0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciBlPTEvMCxuPTEvMCxyPS0xLzAsaT0tMS8wO2Z1bmN0aW9uIG8odCl7bnVsbCE9dCYmRGUuY2FsbChzLHQudHlwZSkmJnNbdC50eXBlXSh0KX12YXIgcz17R2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQpe3QuZ2VvbWV0cmllcy5mb3JFYWNoKG8pfSxQb2ludDpmdW5jdGlvbih0KXthKHQuY29vcmRpbmF0ZXMpfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQpe3QuY29vcmRpbmF0ZXMuZm9yRWFjaChhKX0sTGluZVN0cmluZzpmdW5jdGlvbih0KXt1KHQuYXJjcyl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0KXt0LmFyY3MuZm9yRWFjaCh1KX0sUG9seWdvbjpmdW5jdGlvbih0KXt0LmFyY3MuZm9yRWFjaCh1KX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQpe3QuYXJjcy5mb3JFYWNoKGwpfX07ZnVuY3Rpb24gYSh0KXt2YXIgbz10WzBdLHM9dFsxXTtvPGUmJihlPW8pLG8+ciYmKHI9byksczxuJiYobj1zKSxzPmkmJihpPXMpfWZ1bmN0aW9uIHUodCl7dC5mb3JFYWNoKGEpfWZ1bmN0aW9uIGwodCl7dC5mb3JFYWNoKHUpfWZvcih2YXIgYyBpbiB0KW8odFtjXSk7cmV0dXJuIHI+PWUmJmk+PW4/W2UsbixyLGldOnZvaWQgMH0odD1YZSh0KSkscj1lPjAmJm4mJmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lWzBdLGk9ZVsxXSxvPWVbMl0scz1lWzNdLGE9by1yPyhuLTEpLyhvLXIpOjEsdT1zLWk/KG4tMSkvKHMtaSk6MTtmdW5jdGlvbiBsKHQpe3JldHVybltNYXRoLnJvdW5kKCh0WzBdLXIpKmEpLE1hdGgucm91bmQoKHRbMV0taSkqdSldfWZ1bmN0aW9uIGModCxlKXtmb3IodmFyIG4sbyxzLGwsYyxoPS0xLHA9MCxmPXQubGVuZ3RoLGc9bmV3IEFycmF5KGYpOysraDxmOyluPXRbaF0sbD1NYXRoLnJvdW5kKChuWzBdLXIpKmEpLGM9TWF0aC5yb3VuZCgoblsxXS1pKSp1KSxsPT09byYmYz09PXN8fChnW3ArK109W289bCxzPWNdKTtmb3IoZy5sZW5ndGg9cDtwPGU7KXA9Zy5wdXNoKFtnWzBdWzBdLGdbMF1bMV1dKTtyZXR1cm4gZ31mdW5jdGlvbiBoKHQpe3JldHVybiBjKHQsMil9ZnVuY3Rpb24gcCh0KXtyZXR1cm4gYyh0LDQpfWZ1bmN0aW9uIGYodCl7cmV0dXJuIHQubWFwKHApfWZ1bmN0aW9uIGcodCl7bnVsbCE9dCYmRGUuY2FsbChkLHQudHlwZSkmJmRbdC50eXBlXSh0KX12YXIgZD17R2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQpe3QuZ2VvbWV0cmllcy5mb3JFYWNoKGcpfSxQb2ludDpmdW5jdGlvbih0KXt0LmNvb3JkaW5hdGVzPWwodC5jb29yZGluYXRlcyl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCl7dC5jb29yZGluYXRlcz10LmNvb3JkaW5hdGVzLm1hcChsKX0sTGluZVN0cmluZzpmdW5jdGlvbih0KXt0LmFyY3M9aCh0LmFyY3MpfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCl7dC5hcmNzPXQuYXJjcy5tYXAoaCl9LFBvbHlnb246ZnVuY3Rpb24odCl7dC5hcmNzPWYodC5hcmNzKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQpe3QuYXJjcz10LmFyY3MubWFwKGYpfX07Zm9yKHZhciB5IGluIHQpZyh0W3ldKTtyZXR1cm57c2NhbGU6WzEvYSwxL3VdLHRyYW5zbGF0ZTpbcixpXX19KHQsbixlKSxpPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG89dC5jb29yZGluYXRlcyxzPXQubGluZXMsYT10LnJpbmdzLHU9cy5sZW5ndGgrYS5sZW5ndGg7Zm9yKGRlbGV0ZSB0LmxpbmVzLGRlbGV0ZSB0LnJpbmdzLHI9MCxpPXMubGVuZ3RoO3I8aTsrK3IpZm9yKGU9c1tyXTtlPWUubmV4dDspKyt1O2ZvcihyPTAsaT1hLmxlbmd0aDtyPGk7KytyKWZvcihuPWFbcl07bj1uLm5leHQ7KSsrdTt2YXIgbD1GZSgyKnUqMS40LHplLGtlKSxjPXQuYXJjcz1bXTtmb3Iocj0wLGk9cy5sZW5ndGg7cjxpOysrcil7ZT1zW3JdO2Rve2goZSl9d2hpbGUoZT1lLm5leHQpfWZvcihyPTAsaT1hLmxlbmd0aDtyPGk7KytyKWlmKChuPWFbcl0pLm5leHQpZG97aChuKX13aGlsZShuPW4ubmV4dCk7ZWxzZSBwKG4pO2Z1bmN0aW9uIGgodCl7dmFyIGUsbixyLGkscyxhLHUsaDtpZihyPWwuZ2V0KGU9b1t0WzBdXSkpZm9yKHU9MCxoPXIubGVuZ3RoO3U8aDsrK3UpaWYoZihpPXJbdV0sdCkpcmV0dXJuIHRbMF09aVswXSx2b2lkKHRbMV09aVsxXSk7aWYocz1sLmdldChuPW9bdFsxXV0pKWZvcih1PTAsaD1zLmxlbmd0aDt1PGg7Kyt1KWlmKGcoYT1zW3VdLHQpKXJldHVybiB0WzFdPWFbMF0sdm9pZCh0WzBdPWFbMV0pO3I/ci5wdXNoKHQpOmwuc2V0KGUsW3RdKSxzP3MucHVzaCh0KTpsLnNldChuLFt0XSksYy5wdXNoKHQpfWZ1bmN0aW9uIHAodCl7dmFyIGUsbixyLGkscztpZihuPWwuZ2V0KG9bdFswXV0pKWZvcihpPTAscz1uLmxlbmd0aDtpPHM7KytpKXtpZihkKHI9bltpXSx0KSlyZXR1cm4gdFswXT1yWzBdLHZvaWQodFsxXT1yWzFdKTtpZih5KHIsdCkpcmV0dXJuIHRbMF09clsxXSx2b2lkKHRbMV09clswXSl9aWYobj1sLmdldChlPW9bdFswXSt2KHQpXSkpZm9yKGk9MCxzPW4ubGVuZ3RoO2k8czsrK2kpe2lmKGQocj1uW2ldLHQpKXJldHVybiB0WzBdPXJbMF0sdm9pZCh0WzFdPXJbMV0pO2lmKHkocix0KSlyZXR1cm4gdFswXT1yWzFdLHZvaWQodFsxXT1yWzBdKX1uP24ucHVzaCh0KTpsLnNldChlLFt0XSksYy5wdXNoKHQpfWZ1bmN0aW9uIGYodCxlKXt2YXIgbj10WzBdLHI9ZVswXSxpPXRbMV07aWYobi1pIT1yLWVbMV0pcmV0dXJuITE7Zm9yKDtuPD1pOysrbiwrK3IpaWYoIWtlKG9bbl0sb1tyXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZyh0LGUpe3ZhciBuPXRbMF0scj1lWzBdLGk9dFsxXSxzPWVbMV07aWYobi1pIT1yLXMpcmV0dXJuITE7Zm9yKDtuPD1pOysrbiwtLXMpaWYoIWtlKG9bbl0sb1tzXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZCh0LGUpe3ZhciBuPXRbMF0scj1lWzBdLGk9dFsxXS1uO2lmKGkhPT1lWzFdLXIpcmV0dXJuITE7Zm9yKHZhciBzPXYodCksYT12KGUpLHU9MDt1PGk7Kyt1KWlmKCFrZShvW24rKHUrcyklaV0sb1tyKyh1K2EpJWldKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB5KHQsZSl7dmFyIG49dFswXSxyPWVbMF0saT10WzFdLHM9ZVsxXSxhPWktbjtpZihhIT09cy1yKXJldHVybiExO2Zvcih2YXIgdT12KHQpLGw9YS12KGUpLGM9MDtjPGE7KytjKWlmKCFrZShvW24rKGMrdSklYV0sb1tzLShjK2wpJWFdKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB2KHQpe2Zvcih2YXIgZT10WzBdLG49dFsxXSxyPWUsaT1yLHM9b1tyXTsrK3I8bjspe3ZhciBhPW9bcl07KGFbMF08c1swXXx8YVswXT09PXNbMF0mJmFbMV08c1sxXSkmJihpPXIscz1hKX1yZXR1cm4gaS1lfXJldHVybiB0fShmdW5jdGlvbih0KXt2YXIgZSxuLHIsaT1qZSh0KSxvPXQuY29vcmRpbmF0ZXMscz10LmxpbmVzLGE9dC5yaW5ncztmb3Iobj0wLHI9cy5sZW5ndGg7bjxyOysrbilmb3IodmFyIHU9c1tuXSxsPXVbMF0sYz11WzFdOysrbDxjOylpLmhhcyhvW2xdKSYmKGU9ezA6bCwxOnVbMV19LHVbMV09bCx1PXUubmV4dD1lKTtmb3Iobj0wLHI9YS5sZW5ndGg7bjxyOysrbilmb3IodmFyIGg9YVtuXSxwPWhbMF0sZj1wLGc9aFsxXSxkPWkuaGFzKG9bcF0pOysrZjxnOylpLmhhcyhvW2ZdKSYmKGQ/KGU9ezA6ZiwxOmhbMV19LGhbMV09ZixoPWgubmV4dD1lKTooVWUobyxwLGcsZy1mKSxvW2ddPW9bcF0sZD0hMCxmPXApKTtyZXR1cm4gdH0oZnVuY3Rpb24odCl7dmFyIGU9LTEsbj1bXSxyPVtdLGk9W107ZnVuY3Rpb24gbyh0KXt0JiZEZS5jYWxsKHMsdC50eXBlKSYmc1t0LnR5cGVdKHQpfXZhciBzPXtHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCl7dC5nZW9tZXRyaWVzLmZvckVhY2gobyl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCl7dC5hcmNzPWEodC5hcmNzKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQpe3QuYXJjcz10LmFyY3MubWFwKGEpfSxQb2x5Z29uOmZ1bmN0aW9uKHQpe3QuYXJjcz10LmFyY3MubWFwKHUpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCl7dC5hcmNzPXQuYXJjcy5tYXAobCl9fTtmdW5jdGlvbiBhKHQpe2Zvcih2YXIgcj0wLG89dC5sZW5ndGg7cjxvOysrcilpWysrZV09dFtyXTt2YXIgcz17MDplLW8rMSwxOmV9O3JldHVybiBuLnB1c2gocyksc31mdW5jdGlvbiB1KHQpe2Zvcih2YXIgbj0wLG89dC5sZW5ndGg7bjxvOysrbilpWysrZV09dFtuXTt2YXIgcz17MDplLW8rMSwxOmV9O3JldHVybiByLnB1c2gocyksc31mdW5jdGlvbiBsKHQpe3JldHVybiB0Lm1hcCh1KX1mb3IodmFyIGMgaW4gdClvKHRbY10pO3JldHVybnt0eXBlOiJUb3BvbG9neSIsY29vcmRpbmF0ZXM6aSxsaW5lczpuLHJpbmdzOnIsb2JqZWN0czp0fX0odCkpKSxvPWkuY29vcmRpbmF0ZXMscz1GZSgxLjQqaS5hcmNzLmxlbmd0aCxaZSxLZSk7ZnVuY3Rpb24gYSh0KXt0JiZEZS5jYWxsKHUsdC50eXBlKSYmdVt0LnR5cGVdKHQpfXQ9aS5vYmplY3RzLGkuYmJveD1uLGkuYXJjcz1pLmFyY3MubWFwKChmdW5jdGlvbih0LGUpe3JldHVybiBzLnNldCh0LGUpLG8uc2xpY2UodFswXSx0WzFdKzEpfSkpLGRlbGV0ZSBpLmNvb3JkaW5hdGVzLG89bnVsbDt2YXIgdT17R2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQpe3QuZ2VvbWV0cmllcy5mb3JFYWNoKGEpfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQpe3QuYXJjcz1sKHQuYXJjcyl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0KXt0LmFyY3M9dC5hcmNzLm1hcChsKX0sUG9seWdvbjpmdW5jdGlvbih0KXt0LmFyY3M9dC5hcmNzLm1hcChsKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQpe3QuYXJjcz10LmFyY3MubWFwKGMpfX07ZnVuY3Rpb24gbCh0KXt2YXIgZT1bXTtkb3t2YXIgbj1zLmdldCh0KTtlLnB1c2godFswXTx0WzFdP246fm4pfXdoaWxlKHQ9dC5uZXh0KTtyZXR1cm4gZX1mdW5jdGlvbiBjKHQpe3JldHVybiB0Lm1hcChsKX1mb3IodmFyIGggaW4gdClhKHRbaF0pO3JldHVybiByJiYoaS50cmFuc2Zvcm09cixpLmFyY3M9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPS0xLG49dC5sZW5ndGg7KytlPG47KXtmb3IodmFyIHIsaSxvPXRbZV0scz0wLGE9MSx1PW8ubGVuZ3RoLGw9b1swXSxjPWxbMF0saD1sWzFdOysrczx1OylyPShsPW9bc10pWzBdLGk9bFsxXSxyPT09YyYmaT09PWh8fChvW2ErK109W3ItYyxpLWhdLGM9cixoPWkpOzE9PT1hJiYob1thKytdPVswLDBdKSxvLmxlbmd0aD1hfXJldHVybiB0fShpLmFyY3MpKSxpfWZ1bmN0aW9uIFplKHQpe3ZhciBlLG49dFswXSxyPXRbMV07cmV0dXJuIHI8biYmKGU9bixuPXIscj1lKSxuKzMxKnJ9ZnVuY3Rpb24gS2UodCxlKXt2YXIgbixyPXRbMF0saT10WzFdLG89ZVswXSxzPWVbMV07cmV0dXJuIGk8ciYmKG49cixyPWksaT1uKSxzPG8mJihuPW8sbz1zLHM9bikscj09PW8mJmk9PT1zfWZ1bmN0aW9uIFFlKHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9e30pLCJGZWF0dXJlQ29sbGVjdGlvbiIhPT1pdCh0KSl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gbXVzdCBiZSBhIEZlYXR1cmVDb2xsZWN0aW9uIik7aWYoIXQuZmVhdHVyZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyBlbXB0eSIpOyExIT09ZS5tdXRhdGUmJnZvaWQgMCE9PWUubXV0YXRlfHwodD1JZSh0KSk7dmFyIG49W107eih0LChmdW5jdGlvbih0KXtuLnB1c2godC5nZW9tZXRyeSl9KSk7dmFyIHI9SmUoe2dlb21zOnYobikuZ2VvbWV0cnl9KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIFJlKHQsQWUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0ocixyLm9iamVjdHMuZ2VvbXMuZ2VvbWV0cmllcyl9ZnVuY3Rpb24gJGUodCxlKXtpZih2b2lkIDA9PT1lJiYoZT17fSksIVAoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj1lLm11dGF0ZTtpZigiRmVhdHVyZUNvbGxlY3Rpb24iIT09aXQodCkpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIG11c3QgYmUgYSBGZWF0dXJlQ29sbGVjdGlvbiIpO2lmKCF0LmZlYXR1cmVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgZW1wdHkiKTshMSE9PW4mJnZvaWQgMCE9PW58fCh0PUllKHQpKTt2YXIgcj1mdW5jdGlvbih0KXt2YXIgZT17fTt6KHQsKGZ1bmN0aW9uKHQpe2VbdC5nZW9tZXRyeS50eXBlXT0hMH0pKTt2YXIgbj1PYmplY3Qua2V5cyhlKTtpZigxPT09bi5sZW5ndGgpcmV0dXJuIG5bMF07cmV0dXJuIG51bGx9KHQpO2lmKCFyKXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBtdXN0IGJlIGhvbW9nZW5vdXMiKTt2YXIgaT10O3N3aXRjaChyKXtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBNZShpLGUpO2Nhc2UiUG9seWdvbiI6cmV0dXJuIFFlKGksZSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IocisiIGlzIG5vdCBzdXBwb3J0ZWQiKX19ZnVuY3Rpb24gdG4odCxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49Im9iamVjdCI9PXR5cGVvZiBlP2UubXV0YXRlOmU7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7dmFyIHI9aXQodCksaT1bXTtzd2l0Y2gocil7Y2FzZSJMaW5lU3RyaW5nIjppPWVuKHQpO2JyZWFrO2Nhc2UiTXVsdGlMaW5lU3RyaW5nIjpjYXNlIlBvbHlnb24iOlEodCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5wdXNoKGVuKHQpKX0pKTticmVhaztjYXNlIk11bHRpUG9seWdvbiI6USh0KS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1bXTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2UucHVzaChlbih0KSl9KSksaS5wdXNoKGUpfSkpO2JyZWFrO2Nhc2UiUG9pbnQiOnJldHVybiB0O2Nhc2UiTXVsdGlQb2ludCI6dmFyIHM9e307USh0KS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LmpvaW4oIi0iKTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyxlKXx8KGkucHVzaCh0KSxzW2VdPSEwKX0pKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihyKyIgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpfXJldHVybiB0LmNvb3JkaW5hdGVzPyEwPT09bj8odC5jb29yZGluYXRlcz1pLHQpOnt0eXBlOnIsY29vcmRpbmF0ZXM6aX06ITA9PT1uPyh0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzPWksdCk6byh7dHlwZTpyLGNvb3JkaW5hdGVzOml9LHQucHJvcGVydGllcyx7YmJveDp0LmJib3gsaWQ6dC5pZH0pfWZ1bmN0aW9uIGVuKHQpe3ZhciBlPVEodCk7aWYoMj09PWUubGVuZ3RoJiYhbm4oZVswXSxlWzFdKSlyZXR1cm4gZTt2YXIgbj1bXSxyPWUubGVuZ3RoLTEsaT1uLmxlbmd0aDtuLnB1c2goZVswXSk7Zm9yKHZhciBvPTE7bzxyO28rKyl7dmFyIHM9bltuLmxlbmd0aC0xXTtlW29dWzBdPT09c1swXSYmZVtvXVsxXT09PXNbMV18fChuLnB1c2goZVtvXSksKGk9bi5sZW5ndGgpPjImJnJuKG5baS0zXSxuW2ktMV0sbltpLTJdKSYmbi5zcGxpY2Uobi5sZW5ndGgtMiwxKSl9aWYobi5wdXNoKGVbZS5sZW5ndGgtMV0pLGk9bi5sZW5ndGgsbm4oZVswXSxlW2UubGVuZ3RoLTFdKSYmaTw0KXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBwb2x5Z29uIik7cmV0dXJuIHJuKG5baS0zXSxuW2ktMV0sbltpLTJdKSYmbi5zcGxpY2Uobi5sZW5ndGgtMiwxKSxufWZ1bmN0aW9uIG5uKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX1mdW5jdGlvbiBybih0LGUsbil7dmFyIHI9blswXSxpPW5bMV0sbz10WzBdLHM9dFsxXSxhPWVbMF0sdT1lWzFdLGw9YS1vLGM9dS1zO3JldHVybiAwPT09KHItbykqYy0oaS1zKSpsJiYoTWF0aC5hYnMobCk+PU1hdGguYWJzKGMpP2w+MD9vPD1yJiZyPD1hOmE8PXImJnI8PW86Yz4wP3M8PWkmJmk8PXU6dTw9aSYmaTw9cyl9ZnVuY3Rpb24gb24odCxlLG4pe3ZhciByPWUueCxpPWUueSxvPW4ueC1yLHM9bi55LWk7aWYoMCE9PW98fDAhPT1zKXt2YXIgYT0oKHQueC1yKSpvKyh0LnktaSkqcykvKG8qbytzKnMpO2E+MT8ocj1uLngsaT1uLnkpOmE+MCYmKHIrPW8qYSxpKz1zKmEpfXJldHVybihvPXQueC1yKSpvKyhzPXQueS1pKSpzfWZ1bmN0aW9uIHNuKHQsZSxuLHIsaSl7Zm9yKHZhciBvLHM9cixhPWUrMTthPG47YSsrKXt2YXIgdT1vbih0W2FdLHRbZV0sdFtuXSk7dT5zJiYobz1hLHM9dSl9cz5yJiYoby1lPjEmJnNuKHQsZSxvLHIsaSksaS5wdXNoKHRbb10pLG4tbz4xJiZzbih0LG8sbixyLGkpKX1mdW5jdGlvbiBhbih0LGUpe3ZhciBuPXQubGVuZ3RoLTEscj1bdFswXV07cmV0dXJuIHNuKHQsMCxuLGUsciksci5wdXNoKHRbbl0pLHJ9ZnVuY3Rpb24gdW4odCxlLG4pe2lmKHQubGVuZ3RoPD0yKXJldHVybiB0O3ZhciByPXZvaWQgMCE9PWU/ZSplOjE7cmV0dXJuIHQ9YW4odD1uP3Q6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixpLG8scyxhPXRbMF0sdT1bYV0sbD0xLGM9dC5sZW5ndGg7bDxjO2wrKyluPXRbbF0saT1hLG89dm9pZCAwLHM9dm9pZCAwLG89KHI9bikueC1pLngscz1yLnktaS55LG8qbytzKnM+ZSYmKHUucHVzaChuKSxhPW4pO3JldHVybiBhIT09biYmdS5wdXNoKG4pLHV9KHQscikscil9ZnVuY3Rpb24gbG4odCxlLG4pe3JldHVybiB1bih0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3g6dFswXSx5OnRbMV0sejp0WzJdfX0pKSxlLG4pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuej9bdC54LHQueSx0LnpdOlt0LngsdC55XX0pKX1mdW5jdGlvbiBjbih0LGUsbil7cmV0dXJuIHQubWFwKChmdW5jdGlvbih0KXt2YXIgcj10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3g6dFswXSx5OnRbMV19fSkpO2lmKHIubGVuZ3RoPDQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHBvbHlnb24iKTtmb3IodmFyIGk9dW4ocixlLG4pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuW3QueCx0LnldfSkpOyFobihpKTspaT11bihyLGUtPS4wMSplLG4pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuW3QueCx0LnldfSkpO3JldHVybiBpW2kubGVuZ3RoLTFdWzBdPT09aVswXVswXSYmaVtpLmxlbmd0aC0xXVsxXT09PWlbMF1bMV18fGkucHVzaChpWzBdKSxpfSkpfWZ1bmN0aW9uIGhuKHQpe3JldHVybiEodC5sZW5ndGg8MykmJiEoMz09PXQubGVuZ3RoJiZ0WzJdWzBdPT09dFswXVswXSYmdFsyXVsxXT09PXRbMF1bMV0pfXZhciBwbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5wb2ludHM9dC5wb2ludHN8fFtdLHRoaXMuZHVyYXRpb249dC5kdXJhdGlvbnx8MWU0LHRoaXMuc2hhcnBuZXNzPXQuc2hhcnBuZXNzfHwuODUsdGhpcy5jZW50ZXJzPVtdLHRoaXMuY29udHJvbHM9W10sdGhpcy5zdGVwTGVuZ3RoPXQuc3RlcExlbmd0aHx8NjAsdGhpcy5sZW5ndGg9dGhpcy5wb2ludHMubGVuZ3RoLHRoaXMuZGVsYXk9MDtmb3IodmFyIGU9MDtlPHRoaXMubGVuZ3RoO2UrKyl0aGlzLnBvaW50c1tlXS56PXRoaXMucG9pbnRzW2VdLnp8fDA7Zm9yKGU9MDtlPHRoaXMubGVuZ3RoLTE7ZSsrKXt2YXIgbj10aGlzLnBvaW50c1tlXSxyPXRoaXMucG9pbnRzW2UrMV07dGhpcy5jZW50ZXJzLnB1c2goe3g6KG4ueCtyLngpLzIseToobi55K3IueSkvMix6OihuLnorci56KS8yfSl9dGhpcy5jb250cm9scy5wdXNoKFt0aGlzLnBvaW50c1swXSx0aGlzLnBvaW50c1swXV0pO2ZvcihlPTA7ZTx0aGlzLmNlbnRlcnMubGVuZ3RoLTE7ZSsrKXt2YXIgaT10aGlzLnBvaW50c1tlKzFdLngtKHRoaXMuY2VudGVyc1tlXS54K3RoaXMuY2VudGVyc1tlKzFdLngpLzIsbz10aGlzLnBvaW50c1tlKzFdLnktKHRoaXMuY2VudGVyc1tlXS55K3RoaXMuY2VudGVyc1tlKzFdLnkpLzIscz10aGlzLnBvaW50c1tlKzFdLnotKHRoaXMuY2VudGVyc1tlXS55K3RoaXMuY2VudGVyc1tlKzFdLnopLzI7dGhpcy5jb250cm9scy5wdXNoKFt7eDooMS10aGlzLnNoYXJwbmVzcykqdGhpcy5wb2ludHNbZSsxXS54K3RoaXMuc2hhcnBuZXNzKih0aGlzLmNlbnRlcnNbZV0ueCtpKSx5OigxLXRoaXMuc2hhcnBuZXNzKSp0aGlzLnBvaW50c1tlKzFdLnkrdGhpcy5zaGFycG5lc3MqKHRoaXMuY2VudGVyc1tlXS55K28pLHo6KDEtdGhpcy5zaGFycG5lc3MpKnRoaXMucG9pbnRzW2UrMV0ueit0aGlzLnNoYXJwbmVzcyoodGhpcy5jZW50ZXJzW2VdLnorcyl9LHt4OigxLXRoaXMuc2hhcnBuZXNzKSp0aGlzLnBvaW50c1tlKzFdLngrdGhpcy5zaGFycG5lc3MqKHRoaXMuY2VudGVyc1tlKzFdLngraSkseTooMS10aGlzLnNoYXJwbmVzcykqdGhpcy5wb2ludHNbZSsxXS55K3RoaXMuc2hhcnBuZXNzKih0aGlzLmNlbnRlcnNbZSsxXS55K28pLHo6KDEtdGhpcy5zaGFycG5lc3MpKnRoaXMucG9pbnRzW2UrMV0ueit0aGlzLnNoYXJwbmVzcyoodGhpcy5jZW50ZXJzW2UrMV0ueitzKX1dKX1yZXR1cm4gdGhpcy5jb250cm9scy5wdXNoKFt0aGlzLnBvaW50c1t0aGlzLmxlbmd0aC0xXSx0aGlzLnBvaW50c1t0aGlzLmxlbmd0aC0xXV0pLHRoaXMuc3RlcHM9dGhpcy5jYWNoZVN0ZXBzKHRoaXMuc3RlcExlbmd0aCksdGhpc31yZXR1cm4gdC5wcm90b3R5cGUuY2FjaGVTdGVwcz1mdW5jdGlvbih0KXt2YXIgZT1bXSxuPXRoaXMucG9zKDApO2UucHVzaCgwKTtmb3IodmFyIHI9MDtyPHRoaXMuZHVyYXRpb247cis9MTApe3ZhciBpPXRoaXMucG9zKHIpO01hdGguc3FydCgoaS54LW4ueCkqKGkueC1uLngpKyhpLnktbi55KSooaS55LW4ueSkrKGkuei1uLnopKihpLnotbi56KSk+dCYmKGUucHVzaChyKSxuPWkpfXJldHVybiBlfSx0LnByb3RvdHlwZS52ZWN0b3I9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wb3ModCsxMCksbj10aGlzLnBvcyh0LTEwKTtyZXR1cm57YW5nbGU6MTgwKk1hdGguYXRhbjIoZS55LW4ueSxlLngtbi54KS8zLjE0LHNwZWVkOk1hdGguc3FydCgobi54LWUueCkqKG4ueC1lLngpKyhuLnktZS55KSoobi55LWUueSkrKG4uei1lLnopKihuLnotZS56KSl9fSx0LnByb3RvdHlwZS5wb3M9ZnVuY3Rpb24odCl7dmFyIGU9dC10aGlzLmRlbGF5O2U8MCYmKGU9MCksZT50aGlzLmR1cmF0aW9uJiYoZT10aGlzLmR1cmF0aW9uLTEpO3ZhciBuPWUvdGhpcy5kdXJhdGlvbjtpZihuPj0xKXJldHVybiB0aGlzLnBvaW50c1t0aGlzLmxlbmd0aC0xXTt2YXIgcj1NYXRoLmZsb29yKCh0aGlzLnBvaW50cy5sZW5ndGgtMSkqbik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89ZnVuY3Rpb24odCl7dmFyIGU9dCp0O3JldHVybltlKnQsMyplKigxLXQpLDMqdCooMS10KSooMS10KSwoMS10KSooMS10KSooMS10KV19KHQpO3JldHVybnt4OmkueCpvWzBdK3IueCpvWzFdK24ueCpvWzJdK2UueCpvWzNdLHk6aS55Km9bMF0rci55Km9bMV0rbi55Km9bMl0rZS55Km9bM10sejppLnoqb1swXStyLnoqb1sxXStuLnoqb1syXStlLnoqb1szXX19KCh0aGlzLmxlbmd0aC0xKSpuLXIsdGhpcy5wb2ludHNbcl0sdGhpcy5jb250cm9sc1tyXVsxXSx0aGlzLmNvbnRyb2xzW3IrMV1bMF0sdGhpcy5wb2ludHNbcisxXSl9LHR9KCk7ZnVuY3Rpb24gZm4odCxlKXt2b2lkIDA9PT1lJiYoZT17fSk7Zm9yKHZhciBuPWUucmVzb2x1dGlvbnx8MWU0LHI9ZS5zaGFycG5lc3N8fC44NSxpPVtdLG89cnQodCkuY29vcmRpbmF0ZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm57eDp0WzBdLHk6dFsxXX19KSkscz1uZXcgcG4oe2R1cmF0aW9uOm4scG9pbnRzOm8sc2hhcnBuZXNzOnJ9KSxhPWZ1bmN0aW9uKHQpe3ZhciBlPXMucG9zKHQpO01hdGguZmxvb3IodC8xMDApJTI9PTAmJmkucHVzaChbZS54LGUueV0pfSx1PTA7dTxzLmR1cmF0aW9uO3UrPTEwKWEodSk7cmV0dXJuIGEocy5kdXJhdGlvbiksaChpLGUucHJvcGVydGllcyl9ZnVuY3Rpb24gZ24odCxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49TnVtYmVyKHRbMF0pLHI9TnVtYmVyKHRbMV0pLGk9TnVtYmVyKHRbMl0pLG89TnVtYmVyKHRbM10pO2lmKDY9PT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkB0dXJmL2Jib3gtcG9seWdvbiBkb2VzIG5vdCBzdXBwb3J0IEJCb3ggd2l0aCA2IHBvc2l0aW9ucyIpO3ZhciBzPVtuLHJdO3JldHVybiBsKFtbcyxbaSxyXSxbaSxvXSxbbixvXSxzXV0sZS5wcm9wZXJ0aWVzLHtiYm94OnQsaWQ6ZS5pZH0pfWZ1bmN0aW9uIGRuKHQpe3JldHVybiBnbihaKHQpKX1mdW5jdGlvbiB5bih0KXt2YXIgZT10WzBdLG49dFsxXSxyPXRbMl0saT10WzNdO2lmKG1lKHQuc2xpY2UoMCwyKSxbcixuXSk+PW1lKHQuc2xpY2UoMCwyKSxbZSxpXSkpe3ZhciBvPShuK2kpLzI7cmV0dXJuW2Usby0oci1lKS8yLHIsbysoci1lKS8yXX12YXIgcz0oZStyKS8yO3JldHVybltzLShpLW4pLzIsbixzKyhpLW4pLzIsaV19ZnVuY3Rpb24gdm4odCxlLG4scil7dm9pZCAwPT09ciYmKHI9e30pO3ZhciBpPUsodCksbz1JKGlbMF0pLHM9SShpWzFdKSx1PUkobiksbD14KGUsci51bml0cyksYz1NYXRoLmFzaW4oTWF0aC5zaW4ocykqTWF0aC5jb3MobCkrTWF0aC5jb3MocykqTWF0aC5zaW4obCkqTWF0aC5jb3ModSkpO3JldHVybiBhKFt3KG8rTWF0aC5hdGFuMihNYXRoLnNpbih1KSpNYXRoLnNpbihsKSpNYXRoLmNvcyhzKSxNYXRoLmNvcyhsKS1NYXRoLnNpbihzKSpNYXRoLnNpbihjKSkpLHcoYyldLHIucHJvcGVydGllcyl9ZnVuY3Rpb24gX24odCxlLG4pe3ZvaWQgMD09PW4mJihuPXt9KTtmb3IodmFyIHI9bi5zdGVwc3x8NjQsaT1uLnByb3BlcnRpZXM/bi5wcm9wZXJ0aWVzOiFBcnJheS5pc0FycmF5KHQpJiYiRmVhdHVyZSI9PT10LnR5cGUmJnQucHJvcGVydGllcz90LnByb3BlcnRpZXM6e30sbz1bXSxzPTA7czxyO3MrKylvLnB1c2godm4odCxlLC0zNjAqcy9yLG4pLmdlb21ldHJ5LmNvb3JkaW5hdGVzKTtyZXR1cm4gby5wdXNoKG9bMF0pLGwoW29dLGkpfWZ1bmN0aW9uIG1uKHQsZSxuKXtpZih2b2lkIDA9PT1uJiYobj17fSksITA9PT1uLmZpbmFsKXJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPW1uKGUsdCk7cmV0dXJuIG49KG4rMTgwKSUzNjB9KHQsZSk7dmFyIHI9Syh0KSxpPUsoZSksbz1JKHJbMF0pLHM9SShpWzBdKSxhPUkoclsxXSksdT1JKGlbMV0pLGw9TWF0aC5zaW4ocy1vKSpNYXRoLmNvcyh1KSxjPU1hdGguY29zKGEpKk1hdGguc2luKHUpLU1hdGguc2luKGEpKk1hdGguY29zKHUpKk1hdGguY29zKHMtbyk7cmV0dXJuIHcoTWF0aC5hdGFuMihsLGMpKX1mdW5jdGlvbiB4bih0LGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1aKHQpO3JldHVybiBhKFsoblswXStuWzJdKS8yLChuWzFdK25bM10pLzJdLGUucHJvcGVydGllcyxlKX1mdW5jdGlvbiBFbih0LGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj0wLHI9MCxpPTA7cmV0dXJuIFIodCwoZnVuY3Rpb24odCl7bis9dFswXSxyKz10WzFdLGkrK30pLCEwKSxhKFtuL2ksci9pXSxlLnByb3BlcnRpZXMpfWZ1bmN0aW9uIGJuKHQpe3ZhciBlPVtdO3JldHVybiJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGU/Rih0LChmdW5jdGlvbih0KXtSKHQsKGZ1bmN0aW9uKG4pe2UucHVzaChhKG4sdC5wcm9wZXJ0aWVzKSl9KSl9KSk6Uih0LChmdW5jdGlvbihuKXtlLnB1c2goYShuLHQucHJvcGVydGllcykpfSkpLGYoZSl9dmFyIHduPU5uLEluPU5uO2Z1bmN0aW9uIE5uKHQsZSxuKXtuPW58fDI7dmFyIHIsaSxvLHMsYSx1LGwsYz1lJiZlLmxlbmd0aCxoPWM/ZVswXSpuOnQubGVuZ3RoLHA9U24odCwwLGgsbiwhMCksZj1bXTtpZighcClyZXR1cm4gZjtpZihjJiYocD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvLHMsYT1bXTtmb3IoaT0wLG89ZS5sZW5ndGg7aTxvO2krKykocz1Tbih0LGVbaV0qcixpPG8tMT9lW2krMV0qcjp0Lmxlbmd0aCxyLCExKSk9PT1zLm5leHQmJihzLnN0ZWluZXI9ITApLGEucHVzaChGbihzKSk7Zm9yKGEuc29ydChUbiksaT0wO2k8YS5sZW5ndGg7aSsrKUFuKGFbaV0sbiksbj1DbihuLG4ubmV4dCk7cmV0dXJuIG59KHQsZSxwLG4pKSx0Lmxlbmd0aD44MCpuKXtyPW89dFswXSxpPXM9dFsxXTtmb3IodmFyIGc9bjtnPGg7Zys9bikoYT10W2ddKTxyJiYocj1hKSwodT10W2crMV0pPGkmJihpPXUpLGE+byYmKG89YSksdT5zJiYocz11KTtsPTAhPT0obD1NYXRoLm1heChvLXIscy1pKSk/MS9sOjB9cmV0dXJuIFBuKHAsZixuLHIsaSxsKSxmfWZ1bmN0aW9uIFNuKHQsZSxuLHIsaSl7dmFyIG8scztpZihpPT09SG4odCxlLG4scik+MClmb3Iobz1lO288bjtvKz1yKXM9Vm4obyx0W29dLHRbbysxXSxzKTtlbHNlIGZvcihvPW4tcjtvPj1lO28tPXIpcz1WbihvLHRbb10sdFtvKzFdLHMpO3JldHVybiBzJiZCbihzLHMubmV4dCkmJihYbihzKSxzPXMubmV4dCksc31mdW5jdGlvbiBDbih0LGUpe2lmKCF0KXJldHVybiB0O2V8fChlPXQpO3ZhciBuLHI9dDtkb3tpZihuPSExLHIuc3RlaW5lcnx8IUJuKHIsci5uZXh0KSYmMCE9PXFuKHIucHJldixyLHIubmV4dCkpcj1yLm5leHQ7ZWxzZXtpZihYbihyKSwocj1lPXIucHJldik9PT1yLm5leHQpYnJlYWs7bj0hMH19d2hpbGUobnx8ciE9PWUpO3JldHVybiBlfWZ1bmN0aW9uIFBuKHQsZSxuLHIsaSxvLHMpe2lmKHQpeyFzJiZvJiZmdW5jdGlvbih0LGUsbixyKXt2YXIgaT10O2Rve251bGw9PT1pLnomJihpLno9RG4oaS54LGkueSxlLG4scikpLGkucHJldlo9aS5wcmV2LGkubmV4dFo9aS5uZXh0LGk9aS5uZXh0fXdoaWxlKGkhPT10KTtpLnByZXZaLm5leHRaPW51bGwsaS5wcmV2Wj1udWxsLGZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhLHUsbD0xO2Rve2ZvcihuPXQsdD1udWxsLG89bnVsbCxzPTA7bjspe2ZvcihzKysscj1uLGE9MCxlPTA7ZTxsJiYoYSsrLHI9ci5uZXh0Wik7ZSsrKTtmb3IodT1sO2E+MHx8dT4wJiZyOykwIT09YSYmKDA9PT11fHwhcnx8bi56PD1yLnopPyhpPW4sbj1uLm5leHRaLGEtLSk6KGk9cixyPXIubmV4dFosdS0tKSxvP28ubmV4dFo9aTp0PWksaS5wcmV2Wj1vLG89aTtuPXJ9by5uZXh0Wj1udWxsLGwqPTJ9d2hpbGUocz4xKX0oaSl9KHQscixpLG8pO2Zvcih2YXIgYSx1LGw9dDt0LnByZXYhPT10Lm5leHQ7KWlmKGE9dC5wcmV2LHU9dC5uZXh0LG8/TG4odCxyLGksbyk6TW4odCkpZS5wdXNoKGEuaS9uKSxlLnB1c2godC5pL24pLGUucHVzaCh1LmkvbiksWG4odCksdD11Lm5leHQsbD11Lm5leHQ7ZWxzZSBpZigodD11KT09PWwpe3M/MT09PXM/UG4odD1Pbih0LGUsbiksZSxuLHIsaSxvLDIpOjI9PT1zJiZSbih0LGUsbixyLGksbyk6UG4oQ24odCksZSxuLHIsaSxvLDEpO2JyZWFrfX19ZnVuY3Rpb24gTW4odCl7dmFyIGU9dC5wcmV2LG49dCxyPXQubmV4dDtpZihxbihlLG4scik+PTApcmV0dXJuITE7Zm9yKHZhciBpPXQubmV4dC5uZXh0O2khPT10LnByZXY7KXtpZihrbihlLngsZS55LG4ueCxuLnksci54LHIueSxpLngsaS55KSYmcW4oaS5wcmV2LGksaS5uZXh0KT49MClyZXR1cm4hMTtpPWkubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBMbih0LGUsbixyKXt2YXIgaT10LnByZXYsbz10LHM9dC5uZXh0O2lmKHFuKGksbyxzKT49MClyZXR1cm4hMTtmb3IodmFyIGE9aS54PG8ueD9pLng8cy54P2kueDpzLng6by54PHMueD9vLng6cy54LHU9aS55PG8ueT9pLnk8cy55P2kueTpzLnk6by55PHMueT9vLnk6cy55LGw9aS54Pm8ueD9pLng+cy54P2kueDpzLng6by54PnMueD9vLng6cy54LGM9aS55Pm8ueT9pLnk+cy55P2kueTpzLnk6by55PnMueT9vLnk6cy55LGg9RG4oYSx1LGUsbixyKSxwPURuKGwsYyxlLG4sciksZj10LnByZXZaLGc9dC5uZXh0WjtmJiZmLno+PWgmJmcmJmcuejw9cDspe2lmKGYhPT10LnByZXYmJmYhPT10Lm5leHQmJmtuKGkueCxpLnksby54LG8ueSxzLngscy55LGYueCxmLnkpJiZxbihmLnByZXYsZixmLm5leHQpPj0wKXJldHVybiExO2lmKGY9Zi5wcmV2WixnIT09dC5wcmV2JiZnIT09dC5uZXh0JiZrbihpLngsaS55LG8ueCxvLnkscy54LHMueSxnLngsZy55KSYmcW4oZy5wcmV2LGcsZy5uZXh0KT49MClyZXR1cm4hMTtnPWcubmV4dFp9Zm9yKDtmJiZmLno+PWg7KXtpZihmIT09dC5wcmV2JiZmIT09dC5uZXh0JiZrbihpLngsaS55LG8ueCxvLnkscy54LHMueSxmLngsZi55KSYmcW4oZi5wcmV2LGYsZi5uZXh0KT49MClyZXR1cm4hMTtmPWYucHJldlp9Zm9yKDtnJiZnLno8PXA7KXtpZihnIT09dC5wcmV2JiZnIT09dC5uZXh0JiZrbihpLngsaS55LG8ueCxvLnkscy54LHMueSxnLngsZy55KSYmcW4oZy5wcmV2LGcsZy5uZXh0KT49MClyZXR1cm4hMTtnPWcubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gT24odCxlLG4pe3ZhciByPXQ7ZG97dmFyIGk9ci5wcmV2LG89ci5uZXh0Lm5leHQ7IUJuKGksbykmJnpuKGkscixyLm5leHQsbykmJmpuKGksbykmJmpuKG8saSkmJihlLnB1c2goaS5pL24pLGUucHVzaChyLmkvbiksZS5wdXNoKG8uaS9uKSxYbihyKSxYbihyLm5leHQpLHI9dD1vKSxyPXIubmV4dH13aGlsZShyIT09dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gUm4odCxlLG4scixpLG8pe3ZhciBzPXQ7ZG97Zm9yKHZhciBhPXMubmV4dC5uZXh0O2EhPT1zLnByZXY7KXtpZihzLmkhPT1hLmkmJkduKHMsYSkpe3ZhciB1PVVuKHMsYSk7cmV0dXJuIHM9Q24ocyxzLm5leHQpLHU9Q24odSx1Lm5leHQpLFBuKHMsZSxuLHIsaSxvKSx2b2lkIFBuKHUsZSxuLHIsaSxvKX1hPWEubmV4dH1zPXMubmV4dH13aGlsZShzIT09dCl9ZnVuY3Rpb24gVG4odCxlKXtyZXR1cm4gdC54LWUueH1mdW5jdGlvbiBBbih0LGUpe2lmKGU9ZnVuY3Rpb24odCxlKXt2YXIgbixyPWUsaT10Lngsbz10Lnkscz0tMS8wO2Rve2lmKG88PXIueSYmbz49ci5uZXh0LnkmJnIubmV4dC55IT09ci55KXt2YXIgYT1yLngrKG8tci55KSooci5uZXh0Lngtci54KS8oci5uZXh0Lnktci55KTtpZihhPD1pJiZhPnMpe2lmKHM9YSxhPT09aSl7aWYobz09PXIueSlyZXR1cm4gcjtpZihvPT09ci5uZXh0LnkpcmV0dXJuIHIubmV4dH1uPXIueDxyLm5leHQueD9yOnIubmV4dH19cj1yLm5leHR9d2hpbGUociE9PWUpO2lmKCFuKXJldHVybiBudWxsO2lmKGk9PT1zKXJldHVybiBuLnByZXY7dmFyIHUsbD1uLGM9bi54LGg9bi55LHA9MS8wO3I9bi5uZXh0O2Zvcig7ciE9PWw7KWk+PXIueCYmci54Pj1jJiZpIT09ci54JiZrbihvPGg/aTpzLG8sYyxoLG88aD9zOmksbyxyLngsci55KSYmKCh1PU1hdGguYWJzKG8tci55KS8oaS1yLngpKTxwfHx1PT09cCYmci54Pm4ueCkmJmpuKHIsdCkmJihuPXIscD11KSxyPXIubmV4dDtyZXR1cm4gbn0odCxlKSl7dmFyIG49VW4oZSx0KTtDbihuLG4ubmV4dCl9fWZ1bmN0aW9uIERuKHQsZSxuLHIsaSl7cmV0dXJuKHQ9MTQzMTY1NTc2NSYoKHQ9ODU4OTkzNDU5JigodD0yNTI2NDUxMzUmKCh0PTE2NzExOTM1JigodD0zMjc2NyoodC1uKSppKXx0PDw4KSl8dDw8NCkpfHQ8PDIpKXx0PDwxKSl8KGU9MTQzMTY1NTc2NSYoKGU9ODU4OTkzNDU5JigoZT0yNTI2NDUxMzUmKChlPTE2NzExOTM1JigoZT0zMjc2NyooZS1yKSppKXxlPDw4KSl8ZTw8NCkpfGU8PDIpKXxlPDwxKSk8PDF9ZnVuY3Rpb24gRm4odCl7dmFyIGU9dCxuPXQ7ZG97ZS54PG4ueCYmKG49ZSksZT1lLm5leHR9d2hpbGUoZSE9PXQpO3JldHVybiBufWZ1bmN0aW9uIGtuKHQsZSxuLHIsaSxvLHMsYSl7cmV0dXJuKGktcykqKGUtYSktKHQtcykqKG8tYSk+PTAmJih0LXMpKihyLWEpLShuLXMpKihlLWEpPj0wJiYobi1zKSooby1hKS0oaS1zKSooci1hKT49MH1mdW5jdGlvbiBHbih0LGUpe3JldHVybiB0Lm5leHQuaSE9PWUuaSYmdC5wcmV2LmkhPT1lLmkmJiFmdW5jdGlvbih0LGUpe3ZhciBuPXQ7ZG97aWYobi5pIT09dC5pJiZuLm5leHQuaSE9PXQuaSYmbi5pIT09ZS5pJiZuLm5leHQuaSE9PWUuaSYmem4obixuLm5leHQsdCxlKSlyZXR1cm4hMDtuPW4ubmV4dH13aGlsZShuIT09dCk7cmV0dXJuITF9KHQsZSkmJmpuKHQsZSkmJmpuKGUsdCkmJmZ1bmN0aW9uKHQsZSl7dmFyIG49dCxyPSExLGk9KHQueCtlLngpLzIsbz0odC55K2UueSkvMjtkb3tuLnk+byE9bi5uZXh0Lnk+byYmbi5uZXh0LnkhPT1uLnkmJmk8KG4ubmV4dC54LW4ueCkqKG8tbi55KS8obi5uZXh0Lnktbi55KStuLngmJihyPSFyKSxuPW4ubmV4dH13aGlsZShuIT09dCk7cmV0dXJuIHJ9KHQsZSl9ZnVuY3Rpb24gcW4odCxlLG4pe3JldHVybihlLnktdC55KSoobi54LWUueCktKGUueC10LngpKihuLnktZS55KX1mdW5jdGlvbiBCbih0LGUpe3JldHVybiB0Lng9PT1lLngmJnQueT09PWUueX1mdW5jdGlvbiB6bih0LGUsbixyKXtyZXR1cm4hIShCbih0LGUpJiZCbihuLHIpfHxCbih0LHIpJiZCbihuLGUpKXx8cW4odCxlLG4pPjAhPXFuKHQsZSxyKT4wJiZxbihuLHIsdCk+MCE9cW4obixyLGUpPjB9ZnVuY3Rpb24gam4odCxlKXtyZXR1cm4gcW4odC5wcmV2LHQsdC5uZXh0KTwwP3FuKHQsZSx0Lm5leHQpPj0wJiZxbih0LHQucHJldixlKT49MDpxbih0LGUsdC5wcmV2KTwwfHxxbih0LHQubmV4dCxlKTwwfWZ1bmN0aW9uIFVuKHQsZSl7dmFyIG49bmV3IFluKHQuaSx0LngsdC55KSxyPW5ldyBZbihlLmksZS54LGUueSksaT10Lm5leHQsbz1lLnByZXY7cmV0dXJuIHQubmV4dD1lLGUucHJldj10LG4ubmV4dD1pLGkucHJldj1uLHIubmV4dD1uLG4ucHJldj1yLG8ubmV4dD1yLHIucHJldj1vLHJ9ZnVuY3Rpb24gVm4odCxlLG4scil7dmFyIGk9bmV3IFluKHQsZSxuKTtyZXR1cm4gcj8oaS5uZXh0PXIubmV4dCxpLnByZXY9cixyLm5leHQucHJldj1pLHIubmV4dD1pKTooaS5wcmV2PWksaS5uZXh0PWkpLGl9ZnVuY3Rpb24gWG4odCl7dC5uZXh0LnByZXY9dC5wcmV2LHQucHJldi5uZXh0PXQubmV4dCx0LnByZXZaJiYodC5wcmV2Wi5uZXh0Wj10Lm5leHRaKSx0Lm5leHRaJiYodC5uZXh0Wi5wcmV2Wj10LnByZXZaKX1mdW5jdGlvbiBZbih0LGUsbil7dGhpcy5pPXQsdGhpcy54PWUsdGhpcy55PW4sdGhpcy5wcmV2PW51bGwsdGhpcy5uZXh0PW51bGwsdGhpcy56PW51bGwsdGhpcy5wcmV2Wj1udWxsLHRoaXMubmV4dFo9bnVsbCx0aGlzLnN0ZWluZXI9ITF9ZnVuY3Rpb24gSG4odCxlLG4scil7Zm9yKHZhciBpPTAsbz1lLHM9bi1yO288bjtvKz1yKWkrPSh0W3NdLXRbb10pKih0W28rMV0rdFtzKzFdKSxzPW87cmV0dXJuIGl9ZnVuY3Rpb24gV24odCl7dmFyIGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF1bMF0ubGVuZ3RoLG49e3ZlcnRpY2VzOltdLGhvbGVzOltdLGRpbWVuc2lvbnM6ZX0scj0wLGk9MDtpPHQubGVuZ3RoO2krKyl7Zm9yKHZhciBvPTA7bzx0W2ldLmxlbmd0aDtvKyspZm9yKHZhciBzPTA7czxlO3MrKyluLnZlcnRpY2VzLnB1c2godFtpXVtvXVtzXSk7aT4wJiYocis9dFtpLTFdLmxlbmd0aCxuLmhvbGVzLnB1c2gocikpfXJldHVybiBufSh0KSxuPXduKGUudmVydGljZXMsZS5ob2xlcywyKSxyPVtdLGk9W107bi5mb3JFYWNoKChmdW5jdGlvbih0LHIpe3ZhciBvPW5bcl07aS5wdXNoKFtlLnZlcnRpY2VzWzIqb10sZS52ZXJ0aWNlc1syKm8rMV1dKX0pKTtmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rPTMpe3ZhciBzPWkuc2xpY2UobyxvKzMpO3MucHVzaChpW29dKSxyLnB1c2gobChbc10pKX1yZXR1cm4gcn1mdW5jdGlvbiBKbih0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcigidGFyZ2V0UG9pbnQgaXMgcmVxdWlyZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoInBvaW50cyBpcyByZXF1aXJlZCIpO3ZhciBuLHI9MS8wLGk9MDtyZXR1cm4gRihlLChmdW5jdGlvbihlLG4pe3ZhciBvPW1lKHQsZSk7bzxyJiYoaT1uLHI9byl9KSksKG49SWUoZS5mZWF0dXJlc1tpXSkpLnByb3BlcnRpZXMuZmVhdHVyZUluZGV4PWksbi5wcm9wZXJ0aWVzLmRpc3RhbmNlVG9Qb2ludD1yLG59ZnVuY3Rpb24gWm4odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7dmFyIGU9W107cmV0dXJuIHoodCwoZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIG49W10scj10Lmdlb21ldHJ5O2lmKG51bGwhPT1yKXtzd2l0Y2goci50eXBlKXtjYXNlIlBvbHlnb24iOm49UShyKTticmVhaztjYXNlIkxpbmVTdHJpbmciOm49W1EocildfW4uZm9yRWFjaCgoZnVuY3Rpb24obil7KGZ1bmN0aW9uKHQsZSl7dmFyIG49W107cmV0dXJuIHQucmVkdWNlKChmdW5jdGlvbih0LHIpe3ZhciBpPWgoW3Qscl0sZSk7cmV0dXJuIGkuYmJveD1mdW5jdGlvbih0LGUpe3ZhciBuPXRbMF0scj10WzFdLGk9ZVswXSxvPWVbMV07cmV0dXJuW248aT9uOmkscjxvP3I6byxuPmk/bjppLHI+bz9yOm9dfSh0LHIpLG4ucHVzaChpKSxyfSkpLG59KShuLHQucHJvcGVydGllcykuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5pZD1lLmxlbmd0aCxlLnB1c2godCl9KSl9KSl9fSh0LGUpfSkpLGYoZSl9Tm4uZGV2aWF0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWUmJmUubGVuZ3RoLG89aT9lWzBdKm46dC5sZW5ndGgscz1NYXRoLmFicyhIbih0LDAsbyxuKSk7aWYoaSlmb3IodmFyIGE9MCx1PWUubGVuZ3RoO2E8dTthKyspe3ZhciBsPWVbYV0qbixjPWE8dS0xP2VbYSsxXSpuOnQubGVuZ3RoO3MtPU1hdGguYWJzKEhuKHQsbCxjLG4pKX12YXIgaD0wO2ZvcihhPTA7YTxyLmxlbmd0aDthKz0zKXt2YXIgcD1yW2FdKm4sZj1yW2ErMV0qbixnPXJbYSsyXSpuO2grPU1hdGguYWJzKCh0W3BdLXRbZ10pKih0W2YrMV0tdFtwKzFdKS0odFtwXS10W2ZdKSoodFtnKzFdLXRbcCsxXSkpfXJldHVybiAwPT09cyYmMD09PWg/MDpNYXRoLmFicygoaC1zKS9zKX0sTm4uZmxhdHRlbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXVswXS5sZW5ndGgsbj17dmVydGljZXM6W10saG9sZXM6W10sZGltZW5zaW9uczplfSxyPTAsaT0wO2k8dC5sZW5ndGg7aSsrKXtmb3IodmFyIG89MDtvPHRbaV0ubGVuZ3RoO28rKylmb3IodmFyIHM9MDtzPGU7cysrKW4udmVydGljZXMucHVzaCh0W2ldW29dW3NdKTtpPjAmJihyKz10W2ktMV0ubGVuZ3RoLG4uaG9sZXMucHVzaChyKSl9cmV0dXJuIG59LHduLmRlZmF1bHQ9SW47dmFyIEtuPUJ0KChmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4odCxlLG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj17dHlwZToiRmVhdHVyZSJ9O3JldHVybigwPT09bi5pZHx8bi5pZCkmJihyLmlkPW4uaWQpLG4uYmJveCYmKHIuYmJveD1uLmJib3gpLHIucHJvcGVydGllcz1lfHx7fSxyLmdlb21ldHJ5PXQscn1mdW5jdGlvbiByKHQsZSxyKXtpZih2b2lkIDA9PT1yJiYocj17fSksIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSIpO2lmKHQubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGF0IGxlYXN0IDIgbnVtYmVycyBsb25nIik7aWYoIWYodFswXSl8fCFmKHRbMV0pKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBjb250YWluIG51bWJlcnMiKTtyZXR1cm4gbih7dHlwZToiUG9pbnQiLGNvb3JkaW5hdGVzOnR9LGUscil9ZnVuY3Rpb24gaSh0LGUscil7dm9pZCAwPT09ciYmKHI9e30pO2Zvcih2YXIgaT0wLG89dDtpPG8ubGVuZ3RoO2krKyl7dmFyIHM9b1tpXTtpZihzLmxlbmd0aDw0KXRocm93IG5ldyBFcnJvcigiRWFjaCBMaW5lYXJSaW5nIG9mIGEgUG9seWdvbiBtdXN0IGhhdmUgNCBvciBtb3JlIFBvc2l0aW9ucy4iKTtmb3IodmFyIGE9MDthPHNbcy5sZW5ndGgtMV0ubGVuZ3RoO2ErKylpZihzW3MubGVuZ3RoLTFdW2FdIT09c1swXVthXSl0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFuZCBsYXN0IFBvc2l0aW9uIGFyZSBub3QgZXF1aXZhbGVudC4iKX1yZXR1cm4gbih7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6dH0sZSxyKX1mdW5jdGlvbiBvKHQsZSxyKXtpZih2b2lkIDA9PT1yJiYocj17fSksdC5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gYXJyYXkgb2YgdHdvIG9yIG1vcmUgcG9zaXRpb25zIik7cmV0dXJuIG4oe3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9LGUscil9ZnVuY3Rpb24gcyh0LGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj17dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24ifTtyZXR1cm4gZS5pZCYmKG4uaWQ9ZS5pZCksZS5iYm94JiYobi5iYm94PWUuYmJveCksbi5mZWF0dXJlcz10LG59ZnVuY3Rpb24gYSh0LGUscil7cmV0dXJuIHZvaWQgMD09PXImJihyPXt9KSxuKHt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9LGUscil9ZnVuY3Rpb24gdSh0LGUscil7cmV0dXJuIHZvaWQgMD09PXImJihyPXt9KSxuKHt0eXBlOiJNdWx0aVBvaW50Iixjb29yZGluYXRlczp0fSxlLHIpfWZ1bmN0aW9uIGwodCxlLHIpe3JldHVybiB2b2lkIDA9PT1yJiYocj17fSksbih7dHlwZToiTXVsdGlQb2x5Z29uIixjb29yZGluYXRlczp0fSxlLHIpfWZ1bmN0aW9uIGModCxuKXt2b2lkIDA9PT1uJiYobj0ia2lsb21ldGVycyIpO3ZhciByPWUuZmFjdG9yc1tuXTtpZighcil0aHJvdyBuZXcgRXJyb3IobisiIHVuaXRzIGlzIGludmFsaWQiKTtyZXR1cm4gdCpyfWZ1bmN0aW9uIGgodCxuKXt2b2lkIDA9PT1uJiYobj0ia2lsb21ldGVycyIpO3ZhciByPWUuZmFjdG9yc1tuXTtpZighcil0aHJvdyBuZXcgRXJyb3IobisiIHVuaXRzIGlzIGludmFsaWQiKTtyZXR1cm4gdC9yfWZ1bmN0aW9uIHAodCl7cmV0dXJuIDE4MCoodCUoMipNYXRoLlBJKSkvTWF0aC5QSX1mdW5jdGlvbiBmKHQpe3JldHVybiFpc05hTih0KSYmbnVsbCE9PXQmJiFBcnJheS5pc0FycmF5KHQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmVhcnRoUmFkaXVzPTYzNzEwMDguOCxlLmZhY3RvcnM9e2NlbnRpbWV0ZXJzOjEwMCplLmVhcnRoUmFkaXVzLGNlbnRpbWV0cmVzOjEwMCplLmVhcnRoUmFkaXVzLGRlZ3JlZXM6ZS5lYXJ0aFJhZGl1cy8xMTEzMjUsZmVldDozLjI4MDg0KmUuZWFydGhSYWRpdXMsaW5jaGVzOjM5LjM3KmUuZWFydGhSYWRpdXMsa2lsb21ldGVyczplLmVhcnRoUmFkaXVzLzFlMyxraWxvbWV0cmVzOmUuZWFydGhSYWRpdXMvMWUzLG1ldGVyczplLmVhcnRoUmFkaXVzLG1ldHJlczplLmVhcnRoUmFkaXVzLG1pbGVzOmUuZWFydGhSYWRpdXMvMTYwOS4zNDQsbWlsbGltZXRlcnM6MWUzKmUuZWFydGhSYWRpdXMsbWlsbGltZXRyZXM6MWUzKmUuZWFydGhSYWRpdXMsbmF1dGljYWxtaWxlczplLmVhcnRoUmFkaXVzLzE4NTIscmFkaWFuczoxLHlhcmRzOjEuMDkzNiplLmVhcnRoUmFkaXVzfSxlLnVuaXRzRmFjdG9ycz17Y2VudGltZXRlcnM6MTAwLGNlbnRpbWV0cmVzOjEwMCxkZWdyZWVzOjEvMTExMzI1LGZlZXQ6My4yODA4NCxpbmNoZXM6MzkuMzcsa2lsb21ldGVyczouMDAxLGtpbG9tZXRyZXM6LjAwMSxtZXRlcnM6MSxtZXRyZXM6MSxtaWxlczoxLzE2MDkuMzQ0LG1pbGxpbWV0ZXJzOjFlMyxtaWxsaW1ldHJlczoxZTMsbmF1dGljYWxtaWxlczoxLzE4NTIscmFkaWFuczoxL2UuZWFydGhSYWRpdXMseWFyZHM6MS4wOTM2MTMzfSxlLmFyZWFGYWN0b3JzPXthY3JlczoyNDcxMDVlLTksY2VudGltZXRlcnM6MWU0LGNlbnRpbWV0cmVzOjFlNCxmZWV0OjEwLjc2MzkxMDQxNyxoZWN0YXJlczoxZS00LGluY2hlczoxNTUwLjAwMzEwMDAwNixraWxvbWV0ZXJzOjFlLTYsa2lsb21ldHJlczoxZS02LG1ldGVyczoxLG1ldHJlczoxLG1pbGVzOjM4NmUtOSxtaWxsaW1ldGVyczoxZTYsbWlsbGltZXRyZXM6MWU2LHlhcmRzOjEuMTk1OTkwMDQ2fSxlLmZlYXR1cmU9bixlLmdlb21ldHJ5PWZ1bmN0aW9uKHQsZSxuKXtzd2l0Y2godCl7Y2FzZSJQb2ludCI6cmV0dXJuIHIoZSkuZ2VvbWV0cnk7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4gbyhlKS5nZW9tZXRyeTtjYXNlIlBvbHlnb24iOnJldHVybiBpKGUpLmdlb21ldHJ5O2Nhc2UiTXVsdGlQb2ludCI6cmV0dXJuIHUoZSkuZ2VvbWV0cnk7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiBhKGUpLmdlb21ldHJ5O2Nhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4gbChlKS5nZW9tZXRyeTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcih0KyIgaXMgaW52YWxpZCIpfX0sZS5wb2ludD1yLGUucG9pbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLHModC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiByKHQsZSl9KSksbil9LGUucG9seWdvbj1pLGUucG9seWdvbnM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj17fSkscyh0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGkodCxlKX0pKSxuKX0sZS5saW5lU3RyaW5nPW8sZS5saW5lU3RyaW5ncz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPXt9KSxzKHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gbyh0LGUpfSkpLG4pfSxlLmZlYXR1cmVDb2xsZWN0aW9uPXMsZS5tdWx0aUxpbmVTdHJpbmc9YSxlLm11bHRpUG9pbnQ9dSxlLm11bHRpUG9seWdvbj1sLGUuZ2VvbWV0cnlDb2xsZWN0aW9uPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdm9pZCAwPT09ciYmKHI9e30pLG4oe3R5cGU6Ikdlb21ldHJ5Q29sbGVjdGlvbiIsZ2VvbWV0cmllczp0fSxlLHIpfSxlLnJvdW5kPWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9MCksZSYmIShlPj0wKSl0aHJvdyBuZXcgRXJyb3IoInByZWNpc2lvbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7dmFyIG49TWF0aC5wb3coMTAsZXx8MCk7cmV0dXJuIE1hdGgucm91bmQodCpuKS9ufSxlLnJhZGlhbnNUb0xlbmd0aD1jLGUubGVuZ3RoVG9SYWRpYW5zPWgsZS5sZW5ndGhUb0RlZ3JlZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcChoKHQsZSkpfSxlLmJlYXJpbmdUb0F6aW11dGg9ZnVuY3Rpb24odCl7dmFyIGU9dCUzNjA7cmV0dXJuIGU8MCYmKGUrPTM2MCksZX0sZS5yYWRpYW5zVG9EZWdyZWVzPXAsZS5kZWdyZWVzVG9SYWRpYW5zPWZ1bmN0aW9uKHQpe3JldHVybiB0JTM2MCpNYXRoLlBJLzE4MH0sZS5jb252ZXJ0TGVuZ3RoPWZ1bmN0aW9uKHQsZSxuKXtpZih2b2lkIDA9PT1lJiYoZT0ia2lsb21ldGVycyIpLHZvaWQgMD09PW4mJihuPSJraWxvbWV0ZXJzIiksISh0Pj0wKSl0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGMoaCh0LGUpLG4pfSxlLmNvbnZlcnRBcmVhPWZ1bmN0aW9uKHQsbixyKXtpZih2b2lkIDA9PT1uJiYobj0ibWV0ZXJzIiksdm9pZCAwPT09ciYmKHI9ImtpbG9tZXRlcnMiKSwhKHQ+PTApKXRocm93IG5ldyBFcnJvcigiYXJlYSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7dmFyIGk9ZS5hcmVhRmFjdG9yc1tuXTtpZighaSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgb3JpZ2luYWwgdW5pdHMiKTt2YXIgbz1lLmFyZWFGYWN0b3JzW3JdO2lmKCFvKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmaW5hbCB1bml0cyIpO3JldHVybiB0L2kqb30sZS5pc051bWJlcj1mLGUuaXNPYmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuISF0JiZ0LmNvbnN0cnVjdG9yPT09T2JqZWN0fSxlLnZhbGlkYXRlQkJveD1mdW5jdGlvbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImJib3ggaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBiZSBhbiBBcnJheSIpO2lmKDQhPT10Lmxlbmd0aCYmNiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiYmJveCBtdXN0IGJlIGFuIEFycmF5IG9mIDQgb3IgNiBudW1iZXJzIik7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighZih0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBvbmx5IGNvbnRhaW4gbnVtYmVycyIpfSkpfSxlLnZhbGlkYXRlSWQ9ZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJpZCBpcyByZXF1aXJlZCIpO2lmKC0xPT09WyJzdHJpbmciLCJudW1iZXIiXS5pbmRleE9mKHR5cGVvZiB0KSl0aHJvdyBuZXcgRXJyb3IoImlkIG11c3QgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmciKX19KSk7ZnVuY3Rpb24gUW4odCxlLG4pe2lmKG51bGwhPT10KWZvcih2YXIgcixpLG8scyxhLHUsbCxjLGg9MCxwPTAsZj10LnR5cGUsZz0iRmVhdHVyZUNvbGxlY3Rpb24iPT09ZixkPSJGZWF0dXJlIj09PWYseT1nP3QuZmVhdHVyZXMubGVuZ3RoOjEsdj0wO3Y8eTt2Kyspe2E9KGM9ISEobD1nP3QuZmVhdHVyZXNbdl0uZ2VvbWV0cnk6ZD90Lmdlb21ldHJ5OnQpJiYiR2VvbWV0cnlDb2xsZWN0aW9uIj09PWwudHlwZSk/bC5nZW9tZXRyaWVzLmxlbmd0aDoxO2Zvcih2YXIgXz0wO188YTtfKyspe3ZhciBtPTAseD0wO2lmKG51bGwhPT0ocz1jP2wuZ2VvbWV0cmllc1tfXTpsKSl7dT1zLmNvb3JkaW5hdGVzO3ZhciBFPXMudHlwZTtzd2l0Y2goaD0hbnx8IlBvbHlnb24iIT09RSYmIk11bHRpUG9seWdvbiIhPT1FPzA6MSxFKXtjYXNlIG51bGw6YnJlYWs7Y2FzZSJQb2ludCI6aWYoITE9PT1lKHUscCx2LG0seCkpcmV0dXJuITE7cCsrLG0rKzticmVhaztjYXNlIkxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2ludCI6Zm9yKHI9MDtyPHUubGVuZ3RoO3IrKyl7aWYoITE9PT1lKHVbcl0scCx2LG0seCkpcmV0dXJuITE7cCsrLCJNdWx0aVBvaW50Ij09PUUmJm0rK30iTGluZVN0cmluZyI9PT1FJiZtKys7YnJlYWs7Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpTGluZVN0cmluZyI6Zm9yKHI9MDtyPHUubGVuZ3RoO3IrKyl7Zm9yKGk9MDtpPHVbcl0ubGVuZ3RoLWg7aSsrKXtpZighMT09PWUodVtyXVtpXSxwLHYsbSx4KSlyZXR1cm4hMTtwKyt9Ik11bHRpTGluZVN0cmluZyI9PT1FJiZtKyssIlBvbHlnb24iPT09RSYmeCsrfSJQb2x5Z29uIj09PUUmJm0rKzticmVhaztjYXNlIk11bHRpUG9seWdvbiI6Zm9yKHI9MDtyPHUubGVuZ3RoO3IrKyl7Zm9yKHg9MCxpPTA7aTx1W3JdLmxlbmd0aDtpKyspe2ZvcihvPTA7bzx1W3JdW2ldLmxlbmd0aC1oO28rKyl7aWYoITE9PT1lKHVbcl1baV1bb10scCx2LG0seCkpcmV0dXJuITE7cCsrfXgrK31tKyt9YnJlYWs7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOmZvcihyPTA7cjxzLmdlb21ldHJpZXMubGVuZ3RoO3IrKylpZighMT09PVFuKHMuZ2VvbWV0cmllc1tyXSxlLG4pKXJldHVybiExO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIEdlb21ldHJ5IFR5cGUiKX19fX19ZnVuY3Rpb24gJG4odCxlKXt2YXIgbjtzd2l0Y2godC50eXBlKXtjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpmb3Iobj0wO248dC5mZWF0dXJlcy5sZW5ndGgmJiExIT09ZSh0LmZlYXR1cmVzW25dLnByb3BlcnRpZXMsbik7bisrKTticmVhaztjYXNlIkZlYXR1cmUiOmUodC5wcm9wZXJ0aWVzLDApfX1mdW5jdGlvbiB0cih0LGUpe2lmKCJGZWF0dXJlIj09PXQudHlwZSllKHQsMCk7ZWxzZSBpZigiRmVhdHVyZUNvbGxlY3Rpb24iPT09dC50eXBlKWZvcih2YXIgbj0wO248dC5mZWF0dXJlcy5sZW5ndGgmJiExIT09ZSh0LmZlYXR1cmVzW25dLG4pO24rKyk7fWZ1bmN0aW9uIGVyKHQsZSl7dmFyIG4scixpLG8scyxhLHUsbCxjLGgscD0wLGY9IkZlYXR1cmVDb2xsZWN0aW9uIj09PXQudHlwZSxnPSJGZWF0dXJlIj09PXQudHlwZSxkPWY/dC5mZWF0dXJlcy5sZW5ndGg6MTtmb3Iobj0wO248ZDtuKyspe2ZvcihhPWY/dC5mZWF0dXJlc1tuXS5nZW9tZXRyeTpnP3QuZ2VvbWV0cnk6dCxsPWY/dC5mZWF0dXJlc1tuXS5wcm9wZXJ0aWVzOmc/dC5wcm9wZXJ0aWVzOnt9LGM9Zj90LmZlYXR1cmVzW25dLmJib3g6Zz90LmJib3g6dm9pZCAwLGg9Zj90LmZlYXR1cmVzW25dLmlkOmc/dC5pZDp2b2lkIDAscz0odT0hIWEmJiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09YS50eXBlKT9hLmdlb21ldHJpZXMubGVuZ3RoOjEsaT0wO2k8cztpKyspaWYobnVsbCE9PShvPXU/YS5nZW9tZXRyaWVzW2ldOmEpKXN3aXRjaChvLnR5cGUpe2Nhc2UiUG9pbnQiOmNhc2UiTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvaW50IjpjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpjYXNlIk11bHRpUG9seWdvbiI6aWYoITE9PT1lKG8scCxsLGMsaCkpcmV0dXJuITE7YnJlYWs7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOmZvcihyPTA7cjxvLmdlb21ldHJpZXMubGVuZ3RoO3IrKylpZighMT09PWUoby5nZW9tZXRyaWVzW3JdLHAsbCxjLGgpKXJldHVybiExO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIEdlb21ldHJ5IFR5cGUiKX1lbHNlIGlmKCExPT09ZShudWxsLHAsbCxjLGgpKXJldHVybiExO3ArK319ZnVuY3Rpb24gbnIodCxlKXtlcih0LChmdW5jdGlvbih0LG4scixpLG8pe3ZhciBzLGE9bnVsbD09PXQ/bnVsbDp0LnR5cGU7c3dpdGNoKGEpe2Nhc2UgbnVsbDpjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6cmV0dXJuITEhPT1lKEtuLmZlYXR1cmUodCxyLHtiYm94OmksaWQ6b30pLG4sMCkmJnZvaWQgMH1zd2l0Y2goYSl7Y2FzZSJNdWx0aVBvaW50IjpzPSJQb2ludCI7YnJlYWs7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnM9IkxpbmVTdHJpbmciO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpzPSJQb2x5Z29uIn1mb3IodmFyIHU9MDt1PHQuY29vcmRpbmF0ZXMubGVuZ3RoO3UrKyl7dmFyIGw9e3R5cGU6cyxjb29yZGluYXRlczp0LmNvb3JkaW5hdGVzW3VdfTtpZighMT09PWUoS24uZmVhdHVyZShsLHIpLG4sdSkpcmV0dXJuITF9fSkpfWZ1bmN0aW9uIHJyKHQsZSl7bnIodCwoZnVuY3Rpb24odCxuLHIpe3ZhciBpPTA7aWYodC5nZW9tZXRyeSl7dmFyIG89dC5nZW9tZXRyeS50eXBlO2lmKCJQb2ludCIhPT1vJiYiTXVsdGlQb2ludCIhPT1vKXt2YXIgcyxhPTAsdT0wLGw9MDtyZXR1cm4hMSE9PVFuKHQsKGZ1bmN0aW9uKG8sYyxoLHAsZil7aWYodm9pZCAwPT09c3x8bj5hfHxwPnV8fGY+bClyZXR1cm4gcz1vLGE9bix1PXAsbD1mLHZvaWQoaT0wKTt2YXIgZz1Lbi5saW5lU3RyaW5nKFtzLG9dLHQucHJvcGVydGllcyk7aWYoITE9PT1lKGcsbixyLGYsaSkpcmV0dXJuITE7aSsrLHM9b30pKSYmdm9pZCAwfX19KSl9ZnVuY3Rpb24gaXIodCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtucih0LChmdW5jdGlvbih0LG4scil7aWYobnVsbCE9PXQuZ2VvbWV0cnkpe3ZhciBpPXQuZ2VvbWV0cnkudHlwZSxvPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7c3dpdGNoKGkpe2Nhc2UiTGluZVN0cmluZyI6aWYoITE9PT1lKHQsbixyLDAsMCkpcmV0dXJuITE7YnJlYWs7Y2FzZSJQb2x5Z29uIjpmb3IodmFyIHM9MDtzPG8ubGVuZ3RoO3MrKylpZighMT09PWUoS24ubGluZVN0cmluZyhvW3NdLHQucHJvcGVydGllcyksbixyLHMpKXJldHVybiExfX19KSl9dmFyIG9yPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiBRbih0LChmdW5jdGlvbih0KXtlLnB1c2godCl9KSksZX0sc3I9UW4sYXI9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bjtyZXR1cm4gUW4odCwoZnVuY3Rpb24odCxyLG8scyxhKXtpPTA9PT1yJiZ2b2lkIDA9PT1uP3Q6ZShpLHQscixvLHMsYSl9KSxyKSxpfSx1cj10cixscj1mdW5jdGlvbih0LGUsbil7dmFyIHI9bjtyZXR1cm4gdHIodCwoZnVuY3Rpb24odCxpKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSl9KSkscn0sY3I9ZnVuY3Rpb24odCxlKXtpZihlPWV8fHt9LCFLbi5pc09iamVjdChlKSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuLHI9ZS5mZWF0dXJlSW5kZXh8fDAsaT1lLm11bHRpRmVhdHVyZUluZGV4fHwwLG89ZS5nZW9tZXRyeUluZGV4fHwwLHM9ZS5jb29yZEluZGV4fHwwLGE9ZS5wcm9wZXJ0aWVzO3N3aXRjaCh0LnR5cGUpe2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnI8MCYmKHI9dC5mZWF0dXJlcy5sZW5ndGgrciksYT1hfHx0LmZlYXR1cmVzW3JdLnByb3BlcnRpZXMsbj10LmZlYXR1cmVzW3JdLmdlb21ldHJ5O2JyZWFrO2Nhc2UiRmVhdHVyZSI6YT1hfHx0LnByb3BlcnRpZXMsbj10Lmdlb21ldHJ5O2JyZWFrO2Nhc2UiUG9pbnQiOmNhc2UiTXVsdGlQb2ludCI6cmV0dXJuIG51bGw7Y2FzZSJMaW5lU3RyaW5nIjpjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpjYXNlIk11bHRpUG9seWdvbiI6bj10O2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIGludmFsaWQiKX1pZihudWxsPT09bilyZXR1cm4gbnVsbDt2YXIgdT1uLmNvb3JkaW5hdGVzO3N3aXRjaChuLnR5cGUpe2Nhc2UiUG9pbnQiOnJldHVybiBLbi5wb2ludCh1LGEsZSk7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gaTwwJiYoaT11Lmxlbmd0aCtpKSxLbi5wb2ludCh1W2ldLGEsZSk7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4gczwwJiYocz11Lmxlbmd0aCtzKSxLbi5wb2ludCh1W3NdLGEsZSk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gbzwwJiYobz11Lmxlbmd0aCtvKSxzPDAmJihzPXVbb10ubGVuZ3RoK3MpLEtuLnBvaW50KHVbb11bc10sYSxlKTtjYXNlIk11bHRpTGluZVN0cmluZyI6cmV0dXJuIGk8MCYmKGk9dS5sZW5ndGgraSksczwwJiYocz11W2ldLmxlbmd0aCtzKSxLbi5wb2ludCh1W2ldW3NdLGEsZSk7Y2FzZSJNdWx0aVBvbHlnb24iOnJldHVybiBpPDAmJihpPXUubGVuZ3RoK2kpLG88MCYmKG89dVtpXS5sZW5ndGgrbyksczwwJiYocz11W2ldW29dLmxlbmd0aC1zKSxLbi5wb2ludCh1W2ldW29dW3NdLGEsZSl9dGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIGludmFsaWQiKX0saHI9ZnVuY3Rpb24odCxlKXtpZihlPWV8fHt9LCFLbi5pc09iamVjdChlKSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuLHI9ZS5mZWF0dXJlSW5kZXh8fDAsaT1lLm11bHRpRmVhdHVyZUluZGV4fHwwLG89ZS5nZW9tZXRyeUluZGV4fHwwLHM9ZS5zZWdtZW50SW5kZXh8fDAsYT1lLnByb3BlcnRpZXM7c3dpdGNoKHQudHlwZSl7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6cjwwJiYocj10LmZlYXR1cmVzLmxlbmd0aCtyKSxhPWF8fHQuZmVhdHVyZXNbcl0ucHJvcGVydGllcyxuPXQuZmVhdHVyZXNbcl0uZ2VvbWV0cnk7YnJlYWs7Y2FzZSJGZWF0dXJlIjphPWF8fHQucHJvcGVydGllcyxuPXQuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJQb2ludCI6Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gbnVsbDtjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aUxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2x5Z29uIjpuPXQ7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgaW52YWxpZCIpfWlmKG51bGw9PT1uKXJldHVybiBudWxsO3ZhciB1PW4uY29vcmRpbmF0ZXM7c3dpdGNoKG4udHlwZSl7Y2FzZSJQb2ludCI6Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gbnVsbDtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBzPDAmJihzPXUubGVuZ3RoK3MtMSksS24ubGluZVN0cmluZyhbdVtzXSx1W3MrMV1dLGEsZSk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gbzwwJiYobz11Lmxlbmd0aCtvKSxzPDAmJihzPXVbb10ubGVuZ3RoK3MtMSksS24ubGluZVN0cmluZyhbdVtvXVtzXSx1W29dW3MrMV1dLGEsZSk7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiBpPDAmJihpPXUubGVuZ3RoK2kpLHM8MCYmKHM9dVtpXS5sZW5ndGgrcy0xKSxLbi5saW5lU3RyaW5nKFt1W2ldW3NdLHVbaV1bcysxXV0sYSxlKTtjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIGk8MCYmKGk9dS5sZW5ndGgraSksbzwwJiYobz11W2ldLmxlbmd0aCtvKSxzPDAmJihzPXVbaV1bb10ubGVuZ3RoLXMtMSksS24ubGluZVN0cmluZyhbdVtpXVtvXVtzXSx1W2ldW29dW3MrMV1dLGEsZSl9dGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIGludmFsaWQiKX0scHI9bnIsZnI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIG5yKHQsKGZ1bmN0aW9uKHQsaSxvKXtyPTA9PT1pJiYwPT09byYmdm9pZCAwPT09bj90OmUocix0LGksbyl9KSkscn0sZ3I9ZXIsZHI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIGVyKHQsKGZ1bmN0aW9uKHQsaSxvLHMsYSl7cj0wPT09aSYmdm9pZCAwPT09bj90OmUocix0LGksbyxzLGEpfSkpLHJ9LHlyPWlyLHZyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uO3JldHVybiBpcih0LChmdW5jdGlvbih0LGksbyxzKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSxvLHMpfSkpLHJ9LF9yPSRuLG1yPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uO3JldHVybiAkbih0LChmdW5jdGlvbih0LGkpe3I9MD09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxpKX0pKSxyfSx4cj1ycixFcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9bixpPSExO3JldHVybiBycih0LChmdW5jdGlvbih0LG8scyxhLHUpe3I9ITE9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsbyxzLGEsdSksaT0hMH0pKSxyfSxicj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe2Nvb3JkQWxsOm9yLGNvb3JkRWFjaDpzcixjb29yZFJlZHVjZTphcixmZWF0dXJlRWFjaDp1cixmZWF0dXJlUmVkdWNlOmxyLGZpbmRQb2ludDpjcixmaW5kU2VnbWVudDpocixmbGF0dGVuRWFjaDpwcixmbGF0dGVuUmVkdWNlOmZyLGdlb21FYWNoOmdyLGdlb21SZWR1Y2U6ZHIsbGluZUVhY2g6eXIsbGluZVJlZHVjZTp2cixwcm9wRWFjaDpfcixwcm9wUmVkdWNlOm1yLHNlZ21lbnRFYWNoOnhyLHNlZ21lbnRSZWR1Y2U6RXJ9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtmdW5jdGlvbiB3cih0KXt2YXIgZT1bMS8wLDEvMCwtMS8wLC0xLzBdO3JldHVybiBici5jb29yZEVhY2godCwoZnVuY3Rpb24odCl7ZVswXT50WzBdJiYoZVswXT10WzBdKSxlWzFdPnRbMV0mJihlWzFdPXRbMV0pLGVbMl08dFswXSYmKGVbMl09dFswXSksZVszXTx0WzFdJiYoZVszXT10WzFdKX0pKSxlfXdyLmRlZmF1bHQ9d3I7dmFyIElyPXdyLE5yPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7ZGVmYXVsdDpJcn0sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLmRlZmF1bHQsU3I9YnIuZmVhdHVyZUVhY2gsQ3I9KGJyLmNvb3JkRWFjaCxLbi5wb2x5Z29uLEtuLmZlYXR1cmVDb2xsZWN0aW9uKTtmdW5jdGlvbiBQcih0KXt2YXIgZT1OdCh0KTtyZXR1cm4gZS5pbnNlcnQ9ZnVuY3Rpb24odCl7aWYoIkZlYXR1cmUiIT09dC50eXBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmZWF0dXJlIik7cmV0dXJuIHQuYmJveD10LmJib3g/dC5iYm94Ok5yKHQpLE50LnByb3RvdHlwZS5pbnNlcnQuY2FsbCh0aGlzLHQpfSxlLmxvYWQ9ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZigiRmVhdHVyZSIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZlYXR1cmVzIik7dC5iYm94PXQuYmJveD90LmJib3g6TnIodCksZS5wdXNoKHQpfSkpOlNyKHQsKGZ1bmN0aW9uKHQpe2lmKCJGZWF0dXJlIiE9PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZmVhdHVyZXMiKTt0LmJib3g9dC5iYm94P3QuYmJveDpOcih0KSxlLnB1c2godCl9KSksTnQucHJvdG90eXBlLmxvYWQuY2FsbCh0aGlzLGUpfSxlLnJlbW92ZT1mdW5jdGlvbih0LGUpe2lmKCJGZWF0dXJlIiE9PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZmVhdHVyZSIpO3JldHVybiB0LmJib3g9dC5iYm94P3QuYmJveDpOcih0KSxOdC5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyx0LGUpfSxlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIE50LnByb3RvdHlwZS5jbGVhci5jYWxsKHRoaXMpfSxlLnNlYXJjaD1mdW5jdGlvbih0KXt2YXIgZT1OdC5wcm90b3R5cGUuc2VhcmNoLmNhbGwodGhpcyx0aGlzLnRvQkJveCh0KSk7cmV0dXJuIENyKGUpfSxlLmNvbGxpZGVzPWZ1bmN0aW9uKHQpe3JldHVybiBOdC5wcm90b3R5cGUuY29sbGlkZXMuY2FsbCh0aGlzLHRoaXMudG9CQm94KHQpKX0sZS5hbGw9ZnVuY3Rpb24oKXt2YXIgdD1OdC5wcm90b3R5cGUuYWxsLmNhbGwodGhpcyk7cmV0dXJuIENyKHQpfSxlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiBOdC5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyl9LGUuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIE50LnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsdCl9LGUudG9CQm94PWZ1bmN0aW9uKHQpe3ZhciBlO2lmKHQuYmJveCllPXQuYmJveDtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkmJjQ9PT10Lmxlbmd0aCllPXQ7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpJiY2PT09dC5sZW5ndGgpZT1bdFswXSx0WzFdLHRbM10sdFs0XV07ZWxzZSBpZigiRmVhdHVyZSI9PT10LnR5cGUpZT1Ocih0KTtlbHNle2lmKCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGdlb2pzb24iKTtlPU5yKHQpfXJldHVybnttaW5YOmVbMF0sbWluWTplWzFdLG1heFg6ZVsyXSxtYXhZOmVbM119fSxlfXZhciBNcj1QcixMcj1QcjtmdW5jdGlvbiBPcih0LGUpe3ZhciBuPXt9LHI9W107aWYoIkxpbmVTdHJpbmciPT09dC50eXBlJiYodD1vKHQpKSwiTGluZVN0cmluZyI9PT1lLnR5cGUmJihlPW8oZSkpLCJGZWF0dXJlIj09PXQudHlwZSYmIkZlYXR1cmUiPT09ZS50eXBlJiZudWxsIT09dC5nZW9tZXRyeSYmbnVsbCE9PWUuZ2VvbWV0cnkmJiJMaW5lU3RyaW5nIj09PXQuZ2VvbWV0cnkudHlwZSYmIkxpbmVTdHJpbmciPT09ZS5nZW9tZXRyeS50eXBlJiYyPT09dC5nZW9tZXRyeS5jb29yZGluYXRlcy5sZW5ndGgmJjI9PT1lLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aCl7dmFyIGk9UnIodCxlKTtyZXR1cm4gaSYmci5wdXNoKGkpLGYocil9dmFyIHM9TXIoKTtyZXR1cm4gcy5sb2FkKFpuKGUpKSxGKFpuKHQpLChmdW5jdGlvbih0KXtGKHMuc2VhcmNoKHQpLChmdW5jdGlvbihlKXt2YXIgaT1Scih0LGUpO2lmKGkpe3ZhciBvPVEoaSkuam9pbigiLCIpO25bb118fChuW29dPSEwLHIucHVzaChpKSl9fSkpfSkpLGYocil9ZnVuY3Rpb24gUnIodCxlKXt2YXIgbj1RKHQpLHI9UShlKTtpZigyIT09bi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCI8aW50ZXJzZWN0cz4gbGluZTEgbXVzdCBvbmx5IGNvbnRhaW4gMiBjb29yZGluYXRlcyIpO2lmKDIhPT1yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIjxpbnRlcnNlY3RzPiBsaW5lMiBtdXN0IG9ubHkgY29udGFpbiAyIGNvb3JkaW5hdGVzIik7dmFyIGk9blswXVswXSxvPW5bMF1bMV0scz1uWzFdWzBdLHU9blsxXVsxXSxsPXJbMF1bMF0sYz1yWzBdWzFdLGg9clsxXVswXSxwPXJbMV1bMV0sZj0ocC1jKSoocy1pKS0oaC1sKSoodS1vKSxnPShoLWwpKihvLWMpLShwLWMpKihpLWwpLGQ9KHMtaSkqKG8tYyktKHUtbykqKGktbCk7aWYoMD09PWYpcmV0dXJuIG51bGw7dmFyIHk9Zy9mLHY9ZC9mO3JldHVybiB5Pj0wJiZ5PD0xJiZ2Pj0wJiZ2PD0xP2EoW2kreSoocy1pKSxvK3kqKHUtbyldKTpudWxsfWZ1bmN0aW9uIFRyKHQsZSxuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9YShbMS8wLDEvMF0se2Rpc3Q6MS8wfSksaT0wO3JldHVybiB6KHQsKGZ1bmN0aW9uKHQpe2Zvcih2YXIgbz1RKHQpLHM9MDtzPG8ubGVuZ3RoLTE7cysrKXt2YXIgdT1hKG9bc10pO3UucHJvcGVydGllcy5kaXN0PW1lKGUsdSxuKTt2YXIgbD1hKG9bcysxXSk7bC5wcm9wZXJ0aWVzLmRpc3Q9bWUoZSxsLG4pO3ZhciBjPW1lKHUsbCxuKSxwPU1hdGgubWF4KHUucHJvcGVydGllcy5kaXN0LGwucHJvcGVydGllcy5kaXN0KSxmPW1uKHUsbCksZz12bihlLHAsZis5MCxuKSxkPXZuKGUscCxmLTkwLG4pLHk9T3IoaChbZy5nZW9tZXRyeS5jb29yZGluYXRlcyxkLmdlb21ldHJ5LmNvb3JkaW5hdGVzXSksaChbdS5nZW9tZXRyeS5jb29yZGluYXRlcyxsLmdlb21ldHJ5LmNvb3JkaW5hdGVzXSkpLHY9bnVsbDt5LmZlYXR1cmVzLmxlbmd0aD4wJiYoKHY9eS5mZWF0dXJlc1swXSkucHJvcGVydGllcy5kaXN0PW1lKGUsdixuKSx2LnByb3BlcnRpZXMubG9jYXRpb249aSttZSh1LHYsbikpLHUucHJvcGVydGllcy5kaXN0PHIucHJvcGVydGllcy5kaXN0JiYoKHI9dSkucHJvcGVydGllcy5pbmRleD1zLHIucHJvcGVydGllcy5sb2NhdGlvbj1pKSxsLnByb3BlcnRpZXMuZGlzdDxyLnByb3BlcnRpZXMuZGlzdCYmKChyPWwpLnByb3BlcnRpZXMuaW5kZXg9cysxLHIucHJvcGVydGllcy5sb2NhdGlvbj1pK2MpLHYmJnYucHJvcGVydGllcy5kaXN0PHIucHJvcGVydGllcy5kaXN0JiYoKHI9dikucHJvcGVydGllcy5pbmRleD1zKSxpKz1jfX0pKSxyfWZ1bmN0aW9uIEFyKHQsbixyKXt2b2lkIDA9PT1yJiYocj17fSk7dmFyIGk9Syh0KSxvPUsobik7cmV0dXJuIG9bMF0rPW9bMF0taVswXT4xODA/LTM2MDppWzBdLW9bMF0+MTgwPzM2MDowLE4oZnVuY3Rpb24odCxuLHIpe3ZhciBpPXI9dm9pZCAwPT09cj9lOk51bWJlcihyKSxvPXRbMV0qTWF0aC5QSS8xODAscz1uWzFdKk1hdGguUEkvMTgwLGE9cy1vLHU9TWF0aC5hYnMoblswXS10WzBdKSpNYXRoLlBJLzE4MDt1Pk1hdGguUEkmJih1LT0yKk1hdGguUEkpO3ZhciBsPU1hdGgubG9nKE1hdGgudGFuKHMvMitNYXRoLlBJLzQpL01hdGgudGFuKG8vMitNYXRoLlBJLzQpKSxjPU1hdGguYWJzKGwpPjFlLTExP2EvbDpNYXRoLmNvcyhvKTtyZXR1cm4gTWF0aC5zcXJ0KGEqYStjKmMqdSp1KSppfShpLG8pLCJtZXRlcnMiLHIudW5pdHMpfWZ1bmN0aW9uIERyKHQsZSxuKXtpZih2b2lkIDA9PT1uJiYobj17fSksbi5tZXRob2R8fChuLm1ldGhvZD0iZ2VvZGVzaWMiKSxuLnVuaXRzfHwobi51bml0cz0ia2lsb21ldGVycyIpLCF0KXRocm93IG5ldyBFcnJvcigicHQgaXMgcmVxdWlyZWQiKTtpZihBcnJheS5pc0FycmF5KHQpP3Q9YSh0KToiUG9pbnQiPT09dC50eXBlP3Q9byh0KTpldCh0LCJQb2ludCIsInBvaW50IiksIWUpdGhyb3cgbmV3IEVycm9yKCJsaW5lIGlzIHJlcXVpcmVkIik7QXJyYXkuaXNBcnJheShlKT9lPWgoZSk6IkxpbmVTdHJpbmciPT09ZS50eXBlP2U9byhlKTpldChlLCJMaW5lU3RyaW5nIiwibGluZSIpO3ZhciByPTEvMCxpPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7cmV0dXJuIFUoZSwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxvPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0scz1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1bblswXS1lWzBdLG5bMV0tZVsxXV0sbz1GcihbdFswXS1lWzBdLHRbMV0tZVsxXV0saSk7aWYobzw9MClyZXR1cm4ga3IodCxlLHttZXRob2Q6ci5tZXRob2QsdW5pdHM6ImRlZ3JlZXMifSk7dmFyIHM9RnIoaSxpKTtpZihzPD1vKXJldHVybiBrcih0LG4se21ldGhvZDpyLm1ldGhvZCx1bml0czoiZGVncmVlcyJ9KTt2YXIgYT1vL3MsdT1bZVswXSthKmlbMF0sZVsxXSthKmlbMV1dO3JldHVybiBrcih0LHUse21ldGhvZDpyLm1ldGhvZCx1bml0czoiZGVncmVlcyJ9KX0oaSxlLG8sbik7czxyJiYocj1zKX0pKSxOKHIsImRlZ3JlZXMiLG4udW5pdHMpfWZ1bmN0aW9uIEZyKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV19ZnVuY3Rpb24ga3IodCxlLG4pe3JldHVybiJwbGFuYXIiPT09bi5tZXRob2Q/QXIodCxlLG4pOm1lKHQsZSxuKX1mdW5jdGlvbiBHcih0LGUsbixyLGksbyxzLGEpe3ZhciB1LGwsYyxoLHA9e3g6bnVsbCx5Om51bGwsb25MaW5lMTohMSxvbkxpbmUyOiExfTtyZXR1cm4gMD09PSh1PShhLW8pKihuLXQpLShzLWkpKihyLWUpKT9udWxsIT09cC54JiZudWxsIT09cC55JiZwOihoPShuLXQpKihsPWUtbyktKHItZSkqKGM9dC1pKSxsPSgocy1pKSpsLShhLW8pKmMpL3UsYz1oL3UscC54PXQrbCoobi10KSxwLnk9ZStsKihyLWUpLGw+PTAmJmw8PTEmJihwLm9uTGluZTE9ITApLGM+PTAmJmM8PTEmJihwLm9uTGluZTI9ITApLCEoIXAub25MaW5lMXx8IXAub25MaW5lMikmJltwLngscC55XSl9ZnVuY3Rpb24gcXIodCl7Zm9yKHZhciBlPWZ1bmN0aW9uKHQpe2lmKCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUpcmV0dXJuIkZlYXR1cmUiIT09dC50eXBlP2YoW28odCldKTpmKFt0XSk7cmV0dXJuIHR9KHQpLG49eG4oZSkscj0hMSxpPTA7IXImJmk8ZS5mZWF0dXJlcy5sZW5ndGg7KXt2YXIgcyx1PWUuZmVhdHVyZXNbaV0uZ2VvbWV0cnksbD0hMTtpZigiUG9pbnQiPT09dS50eXBlKW4uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF09PT11LmNvb3JkaW5hdGVzWzBdJiZuLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdPT09dS5jb29yZGluYXRlc1sxXSYmKHI9ITApO2Vsc2UgaWYoIk11bHRpUG9pbnQiPT09dS50eXBlKXt2YXIgYz0hMTtmb3Iocz0wOyFjJiZzPHUuY29vcmRpbmF0ZXMubGVuZ3RoOyluLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdPT09dS5jb29yZGluYXRlc1tzXVswXSYmbi5nZW9tZXRyeS5jb29yZGluYXRlc1sxXT09PXUuY29vcmRpbmF0ZXNbc11bMV0mJihyPSEwLGM9ITApLHMrK31lbHNlIGlmKCJMaW5lU3RyaW5nIj09PXUudHlwZSlmb3Iocz0wOyFsJiZzPHUuY29vcmRpbmF0ZXMubGVuZ3RoLTE7KUJyKG4uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sbi5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSx1LmNvb3JkaW5hdGVzW3NdWzBdLHUuY29vcmRpbmF0ZXNbc11bMV0sdS5jb29yZGluYXRlc1tzKzFdWzBdLHUuY29vcmRpbmF0ZXNbcysxXVsxXSkmJihsPSEwLHI9ITApLHMrKztlbHNlIGlmKCJNdWx0aUxpbmVTdHJpbmciPT09dS50eXBlKWZvcih2YXIgaD0wO2g8dS5jb29yZGluYXRlcy5sZW5ndGg7KXtsPSExLHM9MDtmb3IodmFyIHA9dS5jb29yZGluYXRlc1toXTshbCYmczxwLmxlbmd0aC0xOylCcihuLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLG4uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0scFtzXVswXSxwW3NdWzFdLHBbcysxXVswXSxwW3MrMV1bMV0pJiYobD0hMCxyPSEwKSxzKys7aCsrfWVsc2UiUG9seWdvbiIhPT11LnR5cGUmJiJNdWx0aVBvbHlnb24iIT09dS50eXBlfHx5ZShuLHUpJiYocj0hMCk7aSsrfWlmKHIpcmV0dXJuIG47dmFyIGc9ZihbXSk7Zm9yKGk9MDtpPGUuZmVhdHVyZXMubGVuZ3RoO2krKylnLmZlYXR1cmVzPWcuZmVhdHVyZXMuY29uY2F0KGJuKGUuZmVhdHVyZXNbaV0pLmZlYXR1cmVzKTtyZXR1cm4gYShKbihuLGcpLmdlb21ldHJ5LmNvb3JkaW5hdGVzKX1mdW5jdGlvbiBCcih0LGUsbixyLGksbyl7cmV0dXJuIE1hdGguc3FydCgoaS1uKSooaS1uKSsoby1yKSooby1yKSk9PT1NYXRoLnNxcnQoKHQtbikqKHQtbikrKGUtcikqKGUtcikpK01hdGguc3FydCgoaS10KSooaS10KSsoby1lKSooby1lKSl9TXIuZGVmYXVsdD1Mcjt2YXIgenI9NjM3ODEzNztmdW5jdGlvbiBqcih0KXtyZXR1cm4gQih0LChmdW5jdGlvbih0LGUpe3JldHVybiB0K2Z1bmN0aW9uKHQpe3ZhciBlLG49MDtzd2l0Y2godC50eXBlKXtjYXNlIlBvbHlnb24iOnJldHVybiBVcih0LmNvb3JkaW5hdGVzKTtjYXNlIk11bHRpUG9seWdvbiI6Zm9yKGU9MDtlPHQuY29vcmRpbmF0ZXMubGVuZ3RoO2UrKyluKz1Vcih0LmNvb3JkaW5hdGVzW2VdKTtyZXR1cm4gbjtjYXNlIlBvaW50IjpjYXNlIk11bHRpUG9pbnQiOmNhc2UiTGluZVN0cmluZyI6Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiAwfXJldHVybiAwfShlKX0pLDApfWZ1bmN0aW9uIFVyKHQpe3ZhciBlPTA7aWYodCYmdC5sZW5ndGg+MCl7ZSs9TWF0aC5hYnMoVnIodFswXSkpO2Zvcih2YXIgbj0xO248dC5sZW5ndGg7bisrKWUtPU1hdGguYWJzKFZyKHRbbl0pKX1yZXR1cm4gZX1mdW5jdGlvbiBWcih0KXt2YXIgZSxuLHIsaSxvLHMsYT0wLHU9dC5sZW5ndGg7aWYodT4yKXtmb3Iocz0wO3M8dTtzKyspcz09PXUtMj8ocj11LTIsaT11LTEsbz0wKTpzPT09dS0xPyhyPXUtMSxpPTAsbz0xKToocj1zLGk9cysxLG89cysyKSxlPXRbcl0sbj10W2ldLGErPShYcih0W29dWzBdKS1YcihlWzBdKSkqTWF0aC5zaW4oWHIoblsxXSkpO2E9YSp6cip6ci8yfXJldHVybiBhfWZ1bmN0aW9uIFhyKHQpe3JldHVybiB0Kk1hdGguUEkvMTgwfWZ1bmN0aW9uIFlyKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxWKHQsKGZ1bmN0aW9uKHQsbil7dmFyIHI9bi5nZW9tZXRyeS5jb29yZGluYXRlcztyZXR1cm4gdCttZShyWzBdLHJbMV0sZSl9KSwwKX1mdW5jdGlvbiBIcih0LGUsbixyKXtpZighUChyPXJ8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBpLG89W107aWYoIkZlYXR1cmUiPT09dC50eXBlKWk9dC5nZW9tZXRyeS5jb29yZGluYXRlcztlbHNle2lmKCJMaW5lU3RyaW5nIiE9PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoImlucHV0IG11c3QgYmUgYSBMaW5lU3RyaW5nIEZlYXR1cmUgb3IgR2VvbWV0cnkiKTtpPXQuY29vcmRpbmF0ZXN9Zm9yKHZhciBzLGEsdSxsPWkubGVuZ3RoLGM9MCxwPTA7cDxpLmxlbmd0aCYmIShlPj1jJiZwPT09aS5sZW5ndGgtMSk7cCsrKXtpZihjPmUmJjA9PT1vLmxlbmd0aCl7aWYoIShzPWUtYykpcmV0dXJuIG8ucHVzaChpW3BdKSxoKG8pO2E9bW4oaVtwXSxpW3AtMV0pLTE4MCx1PXZuKGlbcF0scyxhLHIpLG8ucHVzaCh1Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKX1pZihjPj1uKXJldHVybihzPW4tYyk/KGE9bW4oaVtwXSxpW3AtMV0pLTE4MCx1PXZuKGlbcF0scyxhLHIpLG8ucHVzaCh1Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSxoKG8pKTooby5wdXNoKGlbcF0pLGgobykpO2lmKGM+PWUmJm8ucHVzaChpW3BdKSxwPT09aS5sZW5ndGgtMSlyZXR1cm4gaChvKTtjKz1tZShpW3BdLGlbcCsxXSxyKX1pZihjPGUmJmkubGVuZ3RoPT09bCl0aHJvdyBuZXcgRXJyb3IoIlN0YXJ0IHBvc2l0aW9uIGlzIGJleW9uZCBsaW5lIik7dmFyIGY9aVtpLmxlbmd0aC0xXTtyZXR1cm4gaChbZixmXSl9ZnVuY3Rpb24gV3IodCxlLG4pe3ZvaWQgMD09PW4mJihuPXt9KTtmb3IodmFyIHI9Syh0KSxpPVEoZSksbz0wO288aS5sZW5ndGgtMTtvKyspe3ZhciBzPSExO2lmKG4uaWdub3JlRW5kVmVydGljZXMmJigwPT09byYmKHM9InN0YXJ0Iiksbz09PWkubGVuZ3RoLTImJihzPSJlbmQiKSwwPT09byYmbysxPT09aS5sZW5ndGgtMSYmKHM9ImJvdGgiKSksSnIoaVtvXSxpW28rMV0scixzLHZvaWQgMD09PW4uZXBzaWxvbj9udWxsOm4uZXBzaWxvbikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gSnIodCxlLG4scixpKXt2YXIgbz1uWzBdLHM9blsxXSxhPXRbMF0sdT10WzFdLGw9ZVswXSxjPWVbMV0saD1sLWEscD1jLXUsZj0oblswXS1hKSpwLShuWzFdLXUpKmg7aWYobnVsbCE9PWkpe2lmKE1hdGguYWJzKGYpPmkpcmV0dXJuITF9ZWxzZSBpZigwIT09ZilyZXR1cm4hMTtyZXR1cm4gcj8ic3RhcnQiPT09cj9NYXRoLmFicyhoKT49TWF0aC5hYnMocCk/aD4wP2E8byYmbzw9bDpsPD1vJiZvPGE6cD4wP3U8cyYmczw9YzpjPD1zJiZzPHU6ImVuZCI9PT1yP01hdGguYWJzKGgpPj1NYXRoLmFicyhwKT9oPjA/YTw9byYmbzxsOmw8byYmbzw9YTpwPjA/dTw9cyYmczxjOmM8cyYmczw9dToiYm90aCI9PT1yJiYoTWF0aC5hYnMoaCk+PU1hdGguYWJzKHApP2g+MD9hPG8mJm88bDpsPG8mJm88YTpwPjA/dTxzJiZzPGM6YzxzJiZzPHUpOk1hdGguYWJzKGgpPj1NYXRoLmFicyhwKT9oPjA/YTw9byYmbzw9bDpsPD1vJiZvPD1hOnA+MD91PD1zJiZzPD1jOmM8PXMmJnM8PXV9ZnVuY3Rpb24gWnIodCxlKXt2YXIgbj1ydCh0KSxyPXJ0KGUpLGk9bi50eXBlLG89ci50eXBlO3N3aXRjaChpKXtjYXNlIlBvaW50Ijpzd2l0Y2gobyl7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbixyPSExO2ZvcihuPTA7bjxlLmNvb3JkaW5hdGVzLmxlbmd0aDtuKyspaWYoUXIoZS5jb29yZGluYXRlc1tuXSx0LmNvb3JkaW5hdGVzKSl7cj0hMDticmVha31yZXR1cm4gcn0obixyKTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBXcihuLHIse2lnbm9yZUVuZFZlcnRpY2VzOiEwfSk7Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIHllKG4scix7aWdub3JlQm91bmRhcnk6ITB9KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZmVhdHVyZTIgIitvKyIgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpfWNhc2UiTXVsdGlQb2ludCI6c3dpdGNoKG8pe2Nhc2UiTXVsdGlQb2ludCI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0LmNvb3JkaW5hdGVzLmxlbmd0aDtuKyspe2Zvcih2YXIgcj0hMSxpPTA7aTxlLmNvb3JkaW5hdGVzLmxlbmd0aDtpKyspUXIodC5jb29yZGluYXRlc1tuXSxlLmNvb3JkaW5hdGVzW2ldKSYmKHI9ITApO2lmKCFyKXJldHVybiExfXJldHVybiEwfShuLHIpO2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPSExLHI9MDtyPHQuY29vcmRpbmF0ZXMubGVuZ3RoO3IrKyl7aWYoIVdyKHQuY29vcmRpbmF0ZXNbcl0sZSkpcmV0dXJuITE7bnx8KG49V3IodC5jb29yZGluYXRlc1tyXSxlLHtpZ25vcmVFbmRWZXJ0aWNlczohMH0pKX1yZXR1cm4gbn0obixyKTtjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ITAscj0hMSxpPTA7aTx0LmNvb3JkaW5hdGVzLmxlbmd0aDtpKyspe2lmKCEocj15ZSh0LmNvb3JkaW5hdGVzWzFdLGUpKSl7bj0hMTticmVha31yPXllKHQuY29vcmRpbmF0ZXNbMV0sZSx7aWdub3JlQm91bmRhcnk6ITB9KX1yZXR1cm4gbiYmcn0obixyKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZmVhdHVyZTIgIitvKyIgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpfWNhc2UiTGluZVN0cmluZyI6c3dpdGNoKG8pe2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0LmNvb3JkaW5hdGVzLmxlbmd0aDtuKyspaWYoIVdyKHQuY29vcmRpbmF0ZXNbbl0sZSkpcmV0dXJuITE7cmV0dXJuITB9KG4scik7Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49WihlKSxyPVoodCk7aWYoIUtyKG4scikpcmV0dXJuITE7Zm9yKHZhciBpPSExLG89MDtvPHQuY29vcmRpbmF0ZXMubGVuZ3RoLTE7bysrKXtpZigheWUodC5jb29yZGluYXRlc1tvXSxlKSlyZXR1cm4hMTtpZihpfHwoaT15ZSh0LmNvb3JkaW5hdGVzW29dLGUse2lnbm9yZUJvdW5kYXJ5OiEwfSkpLCFpKWk9eWUoJHIodC5jb29yZGluYXRlc1tvXSx0LmNvb3JkaW5hdGVzW28rMV0pLGUse2lnbm9yZUJvdW5kYXJ5OiEwfSl9cmV0dXJuIGl9KG4scik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmUyICIrbysiIGdlb21ldHJ5IG5vdCBzdXBwb3J0ZWQiKX1jYXNlIlBvbHlnb24iOnN3aXRjaChvKXtjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj1aKHQpO2lmKCFLcihaKGUpLG4pKXJldHVybiExO2Zvcih2YXIgcj0wO3I8dC5jb29yZGluYXRlc1swXS5sZW5ndGg7cisrKWlmKCF5ZSh0LmNvb3JkaW5hdGVzWzBdW3JdLGUpKXJldHVybiExO3JldHVybiEwfShuLHIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlMiAiK28rIiBnZW9tZXRyeSBub3Qgc3VwcG9ydGVkIil9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmUxICIraSsiIGdlb21ldHJ5IG5vdCBzdXBwb3J0ZWQiKX19ZnVuY3Rpb24gS3IodCxlKXtyZXR1cm4hKHRbMF0+ZVswXSkmJighKHRbMl08ZVsyXSkmJighKHRbMV0+ZVsxXSkmJiEodFszXTxlWzNdKSkpfWZ1bmN0aW9uIFFyKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX1mdW5jdGlvbiAkcih0LGUpe3JldHVyblsodFswXStlWzBdKS8yLCh0WzFdK2VbMV0pLzJdfWZ1bmN0aW9uIHRpKHQsZSxuKXt2b2lkIDA9PT1uJiYobj17fSksbi5tYXNrJiYhbi51bml0cyYmKG4udW5pdHM9ImtpbG9tZXRlcnMiKTtmb3IodmFyIHI9W10saT10WzBdLG89dFsxXSxzPXRbMl0sdT10WzNdLGw9ZS9tZShbaSxvXSxbcyxvXSxuKSoocy1pKSxjPWUvbWUoW2ksb10sW2ksdV0sbikqKHUtbyksaD1zLWkscD11LW8sZz1NYXRoLmZsb29yKGgvbCksZD0ocC1NYXRoLmZsb29yKHAvYykqYykvMix5PWkrKGgtZypsKS8yO3k8PXM7KXtmb3IodmFyIHY9bytkO3Y8PXU7KXt2YXIgXz1hKFt5LHZdLG4ucHJvcGVydGllcyk7bi5tYXNrP1pyKF8sbi5tYXNrKSYmci5wdXNoKF8pOnIucHVzaChfKSx2Kz1jfXkrPWx9cmV0dXJuIGYocil9ZnVuY3Rpb24gZWkodCxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5wcmVjaXNpb24scj1lLmNvb3JkaW5hdGVzLGk9ZS5tdXRhdGU7aWYobj1udWxsPT1ufHxpc05hTihuKT82Om4scj1udWxsPT1yfHxpc05hTihyKT8zOnIsIXQpdGhyb3cgbmV3IEVycm9yKCI8Z2VvanNvbj4gaXMgcmVxdWlyZWQiKTtpZigibnVtYmVyIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yKCI8cHJlY2lzaW9uPiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBFcnJvcigiPGNvb3JkaW5hdGVzPiBtdXN0IGJlIGEgbnVtYmVyIik7ITEhPT1pJiZ2b2lkIDAhPT1pfHwodD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQpKSk7dmFyIG89TWF0aC5wb3coMTAsbik7cmV0dXJuIFIodCwoZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSxuKXt0Lmxlbmd0aD5uJiZ0LnNwbGljZShuLHQubGVuZ3RoKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdPU1hdGgucm91bmQodFtyXSplKS9lfSh0LG8scil9KSksdH1mdW5jdGlvbiBuaSh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTt2YXIgZT1bXTtyZXR1cm4geih0LChmdW5jdGlvbih0KXtlLnB1c2godCl9KSksZihlKX1mdW5jdGlvbiByaSh0LGUsbil7aWYoIlBvbHlnb24iIT09dC5nZW9tZXRyeS50eXBlKXRocm93IG5ldyBFcnJvcigiVGhlIGlucHV0IGZlYXR1cmUgbXVzdCBiZSBhIFBvbHlnb24iKTt2b2lkIDA9PT1uJiYobj0xKTt2YXIgcj10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzLGk9W10sbz17fTtpZihuKXtmb3IodmFyIHM9W10sYT0wO2E8ci5sZW5ndGg7YSsrKWZvcih2YXIgdT0wO3U8clthXS5sZW5ndGgtMTt1Kyspcy5wdXNoKGQoYSx1KSk7dmFyIGw9TnQoKTtsLmxvYWQocyl9Zm9yKHZhciBjPTA7YzxyLmxlbmd0aDtjKyspZm9yKHZhciBoPTA7aDxyW2NdLmxlbmd0aC0xO2grKyl7aWYobilsLnNlYXJjaChkKGMsaCkpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucmluZyxuPXQuZWRnZTtnKGMsaCxlLG4pfSkpO2Vsc2UgZm9yKHZhciBwPTA7cDxyLmxlbmd0aDtwKyspZm9yKHZhciBmPTA7ZjxyW3BdLmxlbmd0aC0xO2YrKylnKGMsaCxwLGYpfXJldHVybiBlfHwoaT17dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6e3R5cGU6Ik11bHRpUG9pbnQiLGNvb3JkaW5hdGVzOml9fSksaTtmdW5jdGlvbiBnKHQsbixzLGEpe3ZhciB1LGwsYz1yW3RdW25dLGg9clt0XVtuKzFdLHA9cltzXVthXSxmPXJbc11bYSsxXSxnPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKGlpKHQsbil8fGlpKHQscil8fGlpKGUsbil8fGlpKHIsbikpcmV0dXJuIG51bGw7dmFyIGk9dFswXSxvPXRbMV0scz1lWzBdLGE9ZVsxXSx1PW5bMF0sbD1uWzFdLGM9clswXSxoPXJbMV0scD0oaS1zKSoobC1oKS0oby1hKSoodS1jKTtyZXR1cm4gMD09PXA/bnVsbDpbKChpKmEtbypzKSoodS1jKS0oaS1zKSoodSpoLWwqYykpL3AsKChpKmEtbypzKSoobC1oKS0oby1hKSoodSpoLWwqYykpL3BdfShjLGgscCxmKTtpZihudWxsIT09ZyYmKHU9aFswXSE9PWNbMF0/KGdbMF0tY1swXSkvKGhbMF0tY1swXSk6KGdbMV0tY1sxXSkvKGhbMV0tY1sxXSksbD1mWzBdIT09cFswXT8oZ1swXS1wWzBdKS8oZlswXS1wWzBdKTooZ1sxXS1wWzFdKS8oZlsxXS1wWzFdKSwhKHU+PTF8fHU8PTB8fGw+PTF8fGw8PTApKSl7dmFyIGQ9Zyx5PSFvW2RdO3kmJihvW2RdPSEwKSxlP2kucHVzaChlKGcsdCxuLGMsaCx1LHMsYSxwLGYsbCx5KSk6aS5wdXNoKGcpfX1mdW5jdGlvbiBkKHQsZSl7dmFyIG4saSxvLHMsYT1yW3RdW2VdLHU9clt0XVtlKzFdO3JldHVybiBhWzBdPHVbMF0/KG49YVswXSxpPXVbMF0pOihuPXVbMF0saT1hWzBdKSxhWzFdPHVbMV0/KG89YVsxXSxzPXVbMV0pOihvPXVbMV0scz1hWzFdKSx7bWluWDpuLG1pblk6byxtYXhYOmksbWF4WTpzLHJpbmc6dCxlZGdlOmV9fX1mdW5jdGlvbiBpaSh0LGUpe2lmKCF0fHwhZSlyZXR1cm4hMTtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZih0W25daW5zdGFuY2VvZiBBcnJheSYmZVtuXWluc3RhbmNlb2YgQXJyYXkpe2lmKCFpaSh0W25dLGVbbl0pKXJldHVybiExfWVsc2UgaWYodFtuXSE9PWVbbl0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gb2kodCl7aWYoIkZlYXR1cmUiIT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJUaGUgaW5wdXQgbXVzdCBhIGdlb2pzb24gb2JqZWN0IG9mIHR5cGUgRmVhdHVyZSIpO2lmKHZvaWQgMD09PXQuZ2VvbWV0cnl8fG51bGw9PXQuZ2VvbWV0cnkpdGhyb3cgbmV3IEVycm9yKCJUaGUgaW5wdXQgbXVzdCBhIGdlb2pzb24gb2JqZWN0IHdpdGggYSBub24tZW1wdHkgZ2VvbWV0cnkiKTtpZigiUG9seWdvbiIhPXQuZ2VvbWV0cnkudHlwZSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBpbnB1dCBtdXN0IGJlIGEgZ2VvanNvbiBQb2x5Z29uIik7Zm9yKHZhciBlPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoLG49W10scj0wO3I8ZTtyKyspe3ZhciBpPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbcl07Y2koaVswXSxpW2kubGVuZ3RoLTFdKXx8aS5wdXNoKGlbMF0pLG4ucHVzaC5hcHBseShuLGkuc2xpY2UoMCxpLmxlbmd0aC0xKSl9aWYoIWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT17fSxuPTEscj0wLGk9dC5sZW5ndGg7cjxpOysrcil7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdFtyXSkpe249MDticmVha31lW3Rbcl1dPTF9cmV0dXJuIG59KG4pKXRocm93IG5ldyBFcnJvcigiVGhlIGlucHV0IHBvbHlnb24gbWF5IG5vdCBoYXZlIGR1cGxpY2F0ZSB2ZXJ0aWNlcyAoZXhjZXB0IGZvciB0aGUgZmlyc3QgYW5kIGxhc3QgdmVydGV4IG9mIGVhY2ggcmluZykiKTt2YXIgbz1uLmxlbmd0aCxzPXJpKHQsKGZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMsYSx1LGwsYyxoKXtyZXR1cm5bdCxlLG4scixpLG8scyxhLHUsbCxjLGhdfSkpLGE9cy5sZW5ndGg7aWYoMD09YSl7dmFyIHU9W107Zm9yKHI9MDtyPGU7cisrKXUucHVzaChsKFt0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzW3JdXSx7cGFyZW50Oi0xLHdpbmRpbmc6bGkodC5nZW9tZXRyeS5jb29yZGluYXRlc1tyXSl9KSk7dmFyIGM9Zih1KTtyZXR1cm4gRygpLHEoKSxjfXZhciBoPVtdLHA9W107Zm9yKHI9MDtyPGU7cisrKXtoLnB1c2goW10pO2Zvcih2YXIgZz0wO2c8dC5nZW9tZXRyeS5jb29yZGluYXRlc1tyXS5sZW5ndGgtMTtnKyspaFtyXS5wdXNoKFtuZXcgc2kodC5nZW9tZXRyeS5jb29yZGluYXRlc1tyXVtoaShnKzEsdC5nZW9tZXRyeS5jb29yZGluYXRlc1tyXS5sZW5ndGgtMSldLDEsW3IsZ10sW3IsaGkoZysxLHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbcl0ubGVuZ3RoLTEpXSx2b2lkIDApXSkscC5wdXNoKG5ldyBhaSh0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzW3JdW2ddLFtyLGhpKGctMSx0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzW3JdLmxlbmd0aC0xKV0sW3IsZ10sdm9pZCAwLHZvaWQgMCwhMSwhMCkpfWZvcihyPTA7cjxhO3IrKyloW3Nbcl1bMV1dW3Nbcl1bMl1dLnB1c2gobmV3IHNpKHNbcl1bMF0sc1tyXVs1XSxbc1tyXVsxXSxzW3JdWzJdXSxbc1tyXVs2XSxzW3JdWzddXSx2b2lkIDApKSxzW3JdWzExXSYmcC5wdXNoKG5ldyBhaShzW3JdWzBdLFtzW3JdWzFdLHNbcl1bMl1dLFtzW3JdWzZdLHNbcl1bN11dLHZvaWQgMCx2b2lkIDAsITAsITApKTt2YXIgZD1wLmxlbmd0aDtmb3Iocj0wO3I8aC5sZW5ndGg7cisrKWZvcihnPTA7ZzxoW3JdLmxlbmd0aDtnKyspaFtyXVtnXS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LnBhcmFtPGUucGFyYW0/LTE6MX0pKTt2YXIgeT1bXTtmb3Iocj0wO3I8ZDtyKyspeS5wdXNoKHttaW5YOnBbcl0uY29vcmRbMF0sbWluWTpwW3JdLmNvb3JkWzFdLG1heFg6cFtyXS5jb29yZFswXSxtYXhZOnBbcl0uY29vcmRbMV0saW5kZXg6cn0pO3ZhciB2PU50KCk7di5sb2FkKHkpO2ZvcihyPTA7cjxoLmxlbmd0aDtyKyspZm9yKGc9MDtnPGhbcl0ubGVuZ3RoO2crKylmb3IodmFyIF89MDtfPGhbcl1bZ10ubGVuZ3RoO18rKyl7eD1fPT1oW3JdW2ddLmxlbmd0aC0xP2hbcl1baGkoZysxLHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbcl0ubGVuZ3RoLTEpXVswXS5jb29yZDpoW3JdW2ddW18rMV0uY29vcmQ7dmFyIG09di5zZWFyY2goe21pblg6eFswXSxtaW5ZOnhbMV0sbWF4WDp4WzBdLG1heFk6eFsxXX0pWzBdO2hbcl1bZ11bX10ubnh0SXNlY3RBbG9uZ0VkZ2VJbj1tLmluZGV4fWZvcihyPTA7cjxoLmxlbmd0aDtyKyspZm9yKGc9MDtnPGhbcl0ubGVuZ3RoO2crKylmb3IoXz0wO188aFtyXVtnXS5sZW5ndGg7XysrKXt2YXIgeD1oW3JdW2ddW19dLmNvb3JkLEU9KG09di5zZWFyY2goe21pblg6eFswXSxtaW5ZOnhbMV0sbWF4WDp4WzBdLG1heFk6eFsxXX0pWzBdKS5pbmRleDtFPG8/cFtFXS5ueHRJc2VjdEFsb25nUmluZ0FuZEVkZ2UyPWhbcl1bZ11bX10ubnh0SXNlY3RBbG9uZ0VkZ2VJbjpjaShwW0VdLnJpbmdBbmRFZGdlMSxoW3JdW2ddW19dLnJpbmdBbmRFZGdlSW4pP3BbRV0ubnh0SXNlY3RBbG9uZ1JpbmdBbmRFZGdlMT1oW3JdW2ddW19dLm54dElzZWN0QWxvbmdFZGdlSW46cFtFXS5ueHRJc2VjdEFsb25nUmluZ0FuZEVkZ2UyPWhbcl1bZ11bX10ubnh0SXNlY3RBbG9uZ0VkZ2VJbn12YXIgYj1bXTtmb3Iocj0wLGc9MDtnPGU7ZysrKXt2YXIgdz1yO2ZvcihfPTA7Xzx0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzW2ddLmxlbmd0aC0xO18rKylwW3JdLmNvb3JkWzBdPHBbd10uY29vcmRbMF0mJih3PXIpLHIrKzt2YXIgST1wW3ddLm54dElzZWN0QWxvbmdSaW5nQW5kRWRnZTI7Zm9yKF89MDtfPHAubGVuZ3RoO18rKylpZihwW19dLm54dElzZWN0QWxvbmdSaW5nQW5kRWRnZTE9PXd8fHBbX10ubnh0SXNlY3RBbG9uZ1JpbmdBbmRFZGdlMj09dyl7dmFyIE49XzticmVha312YXIgUz11aShbcFtOXS5jb29yZCxwW3ddLmNvb3JkLHBbSV0uY29vcmRdLCEwKT8xOi0xO2IucHVzaCh7aXNlY3Q6dyxwYXJlbnQ6LTEsd2luZGluZzpTfSl9Yi5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBwW3QuaXNlY3RdLmNvb3JkPnBbZS5pc2VjdF0uY29vcmQ/LTE6MX0pKTtmb3IodT1bXTtiLmxlbmd0aD4wOyl7dmFyIEM9Yi5wb3AoKSxQPUMuaXNlY3QsTT1DLnBhcmVudCxMPUMud2luZGluZyxPPXUubGVuZ3RoLFI9W3BbUF0uY29vcmRdLFQ9UDtpZihwW1BdLnJpbmdBbmRFZGdlMVdhbGthYmxlKXZhciBBPXBbUF0ucmluZ0FuZEVkZ2UxLEQ9cFtQXS5ueHRJc2VjdEFsb25nUmluZ0FuZEVkZ2UxO2Vsc2UgQT1wW1BdLnJpbmdBbmRFZGdlMixEPXBbUF0ubnh0SXNlY3RBbG9uZ1JpbmdBbmRFZGdlMjtmb3IoOyFjaShwW1BdLmNvb3JkLHBbRF0uY29vcmQpOyl7Ui5wdXNoKHBbRF0uY29vcmQpO3ZhciBGPXZvaWQgMDtmb3Iocj0wO3I8Yi5sZW5ndGg7cisrKWlmKGJbcl0uaXNlY3Q9PUQpe0Y9cjticmVha31pZihudWxsIT1GJiZiLnNwbGljZShGLDEpLGNpKEEscFtEXS5yaW5nQW5kRWRnZTEpKXtpZihBPXBbRF0ucmluZ0FuZEVkZ2UyLHBbRF0ucmluZ0FuZEVkZ2UyV2Fsa2FibGU9ITEscFtEXS5yaW5nQW5kRWRnZTFXYWxrYWJsZSl7dmFyIGs9e2lzZWN0OkR9O3VpKFtwW1RdLmNvb3JkLHBbRF0uY29vcmQscFtwW0RdLm54dElzZWN0QWxvbmdSaW5nQW5kRWRnZTJdLmNvb3JkXSwxPT1MKT8oay5wYXJlbnQ9TSxrLndpbmRpbmc9LUwpOihrLnBhcmVudD1PLGsud2luZGluZz1MKSxiLnB1c2goayl9VD1ELEQ9cFtEXS5ueHRJc2VjdEFsb25nUmluZ0FuZEVkZ2UyfWVsc2V7aWYoQT1wW0RdLnJpbmdBbmRFZGdlMSxwW0RdLnJpbmdBbmRFZGdlMVdhbGthYmxlPSExLHBbRF0ucmluZ0FuZEVkZ2UyV2Fsa2FibGUpe2s9e2lzZWN0OkR9O3VpKFtwW1RdLmNvb3JkLHBbRF0uY29vcmQscFtwW0RdLm54dElzZWN0QWxvbmdSaW5nQW5kRWRnZTFdLmNvb3JkXSwxPT1MKT8oay5wYXJlbnQ9TSxrLndpbmRpbmc9LUwpOihrLnBhcmVudD1PLGsud2luZGluZz1MKSxiLnB1c2goayl9VD1ELEQ9cFtEXS5ueHRJc2VjdEFsb25nUmluZ0FuZEVkZ2UxfX1SLnB1c2gocFtEXS5jb29yZCksdS5wdXNoKGwoW1JdLHtpbmRleDpPLHBhcmVudDpNLHdpbmRpbmc6TCxuZXRXaW5kaW5nOnZvaWQgMH0pKX1jPWYodSk7ZnVuY3Rpb24gRygpe2Zvcih2YXIgdD1bXSxlPTA7ZTxjLmZlYXR1cmVzLmxlbmd0aDtlKyspLTE9PWMuZmVhdHVyZXNbZV0ucHJvcGVydGllcy5wYXJlbnQmJnQucHVzaChlKTtpZih0Lmxlbmd0aD4xKWZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspe2Zvcih2YXIgbj0tMSxyPTA7cjxjLmZlYXR1cmVzLmxlbmd0aDtyKyspdFtlXSE9ciYmeWUoYy5mZWF0dXJlc1t0W2VdXS5nZW9tZXRyeS5jb29yZGluYXRlc1swXVswXSxjLmZlYXR1cmVzW3JdLHtpZ25vcmVCb3VuZGFyeTohMH0pJiZqcihjLmZlYXR1cmVzW3JdKTxJbmZpbml0eSYmKG49cik7Yy5mZWF0dXJlc1t0W2VdXS5wcm9wZXJ0aWVzLnBhcmVudD1ufX1mdW5jdGlvbiBxKCl7Zm9yKHZhciB0PTA7dDxjLmZlYXR1cmVzLmxlbmd0aDt0KyspaWYoLTE9PWMuZmVhdHVyZXNbdF0ucHJvcGVydGllcy5wYXJlbnQpe3ZhciBlPWMuZmVhdHVyZXNbdF0ucHJvcGVydGllcy53aW5kaW5nO2MuZmVhdHVyZXNbdF0ucHJvcGVydGllcy5uZXRXaW5kaW5nPWUsQih0LGUpfX1mdW5jdGlvbiBCKHQsZSl7Zm9yKHZhciBuPTA7bjxjLmZlYXR1cmVzLmxlbmd0aDtuKyspaWYoYy5mZWF0dXJlc1tuXS5wcm9wZXJ0aWVzLnBhcmVudD09dCl7dmFyIHI9ZStjLmZlYXR1cmVzW25dLnByb3BlcnRpZXMud2luZGluZztjLmZlYXR1cmVzW25dLnByb3BlcnRpZXMubmV0V2luZGluZz1yLEIobixyKX19cmV0dXJuIEcoKSxxKCksY312YXIgc2k9ZnVuY3Rpb24odCxlLG4scixpKXt0aGlzLmNvb3JkPXQsdGhpcy5wYXJhbT1lLHRoaXMucmluZ0FuZEVkZ2VJbj1uLHRoaXMucmluZ0FuZEVkZ2VPdXQ9cix0aGlzLm54dElzZWN0QWxvbmdFZGdlSW49aX0sYWk9ZnVuY3Rpb24odCxlLG4scixpLG8scyl7dGhpcy5jb29yZD10LHRoaXMucmluZ0FuZEVkZ2UxPWUsdGhpcy5yaW5nQW5kRWRnZTI9bix0aGlzLm54dElzZWN0QWxvbmdSaW5nQW5kRWRnZTE9cix0aGlzLm54dElzZWN0QWxvbmdSaW5nQW5kRWRnZTI9aSx0aGlzLnJpbmdBbmRFZGdlMVdhbGthYmxlPW8sdGhpcy5yaW5nQW5kRWRnZTJXYWxrYWJsZT1zfTtmdW5jdGlvbiB1aSh0LGUpe2lmKHZvaWQgMD09PWUmJihlPSEwKSwzIT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgYW4gYXJyYXkgb2YgdGhyZWUgcG9pbnRzIFt4LHldIik7cmV0dXJuKHRbMV1bMF0tdFswXVswXSkqKHRbMl1bMV0tdFswXVsxXSktKHRbMV1bMV0tdFswXVsxXSkqKHRbMl1bMF0tdFswXVswXSk+PTA9PWV9ZnVuY3Rpb24gbGkodCl7Zm9yKHZhciBlPTAsbj0wO248dC5sZW5ndGgtMTtuKyspdFtuXVswXTx0W2VdWzBdJiYoZT1uKTtpZih1aShbdFtoaShlLTEsdC5sZW5ndGgtMSldLHRbZV0sdFtoaShlKzEsdC5sZW5ndGgtMSldXSwhMCkpdmFyIHI9MTtlbHNlIHI9LTE7cmV0dXJuIHJ9ZnVuY3Rpb24gY2kodCxlKXtpZighdHx8IWUpcmV0dXJuITE7aWYodC5sZW5ndGghPWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZih0W25daW5zdGFuY2VvZiBBcnJheSYmZVtuXWluc3RhbmNlb2YgQXJyYXkpe2lmKCFjaSh0W25dLGVbbl0pKXJldHVybiExfWVsc2UgaWYodFtuXSE9ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBoaSh0LGUpe3JldHVybih0JWUrZSklZX12YXIgcGk9TWF0aC5QSS8xODAsZmk9MTgwL01hdGguUEksZ2k9ZnVuY3Rpb24odCxlKXt0aGlzLmxvbj10LHRoaXMubGF0PWUsdGhpcy54PXBpKnQsdGhpcy55PXBpKmV9O2dpLnByb3RvdHlwZS52aWV3PWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZyh0aGlzLmxvbikuc2xpY2UoMCw0KSsiLCIrU3RyaW5nKHRoaXMubGF0KS5zbGljZSgwLDQpfSxnaS5wcm90b3R5cGUuYW50aXBvZGU9ZnVuY3Rpb24oKXt2YXIgdD0tMSp0aGlzLmxhdCxlPXRoaXMubG9uPDA/MTgwK3RoaXMubG9uOi0xKigxODAtdGhpcy5sb24pO3JldHVybiBuZXcgZ2koZSx0KX07dmFyIGRpPWZ1bmN0aW9uKCl7dGhpcy5jb29yZHM9W10sdGhpcy5sZW5ndGg9MH07ZGkucHJvdG90eXBlLm1vdmVfdG89ZnVuY3Rpb24odCl7dGhpcy5sZW5ndGgrKyx0aGlzLmNvb3Jkcy5wdXNoKHQpfTt2YXIgeWk9ZnVuY3Rpb24odCl7dGhpcy5wcm9wZXJ0aWVzPXR8fHt9LHRoaXMuZ2VvbWV0cmllcz1bXX07eWkucHJvdG90eXBlLmpzb249ZnVuY3Rpb24oKXtpZih0aGlzLmdlb21ldHJpZXMubGVuZ3RoPD0wKXJldHVybntnZW9tZXRyeTp7dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6bnVsbH0sdHlwZToiRmVhdHVyZSIscHJvcGVydGllczp0aGlzLnByb3BlcnRpZXN9O2lmKDE9PT10aGlzLmdlb21ldHJpZXMubGVuZ3RoKXJldHVybntnZW9tZXRyeTp7dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dGhpcy5nZW9tZXRyaWVzWzBdLmNvb3Jkc30sdHlwZToiRmVhdHVyZSIscHJvcGVydGllczp0aGlzLnByb3BlcnRpZXN9O2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLmdlb21ldHJpZXMubGVuZ3RoO2UrKyl0LnB1c2godGhpcy5nZW9tZXRyaWVzW2VdLmNvb3Jkcyk7cmV0dXJue2dlb21ldHJ5Ont0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9LHR5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6dGhpcy5wcm9wZXJ0aWVzfX0seWkucHJvdG90eXBlLndrdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0iIixlPSJMSU5FU1RSSU5HKCIsbj1mdW5jdGlvbih0KXtlKz10WzBdKyIgIit0WzFdKyIsIn0scj0wO3I8dGhpcy5nZW9tZXRyaWVzLmxlbmd0aDtyKyspe2lmKDA9PT10aGlzLmdlb21ldHJpZXNbcl0uY29vcmRzLmxlbmd0aClyZXR1cm4iTElORVNUUklORyhlbXB0eSkiO3RoaXMuZ2VvbWV0cmllc1tyXS5jb29yZHMuZm9yRWFjaChuKSx0Kz1lLnN1YnN0cmluZygwLGUubGVuZ3RoLTEpKyIpIn1yZXR1cm4gdH07dmFyIHZpPWZ1bmN0aW9uKHQsZSxuKXtpZighdHx8dm9pZCAwPT09dC54fHx2b2lkIDA9PT10LnkpdGhyb3cgbmV3IEVycm9yKCJHcmVhdENpcmNsZSBjb25zdHJ1Y3RvciBleHBlY3RzIHR3byBhcmdzOiBzdGFydCBhbmQgZW5kIG9iamVjdHMgd2l0aCB4IGFuZCB5IHByb3BlcnRpZXMiKTtpZighZXx8dm9pZCAwPT09ZS54fHx2b2lkIDA9PT1lLnkpdGhyb3cgbmV3IEVycm9yKCJHcmVhdENpcmNsZSBjb25zdHJ1Y3RvciBleHBlY3RzIHR3byBhcmdzOiBzdGFydCBhbmQgZW5kIG9iamVjdHMgd2l0aCB4IGFuZCB5IHByb3BlcnRpZXMiKTt0aGlzLnN0YXJ0PW5ldyBnaSh0LngsdC55KSx0aGlzLmVuZD1uZXcgZ2koZS54LGUueSksdGhpcy5wcm9wZXJ0aWVzPW58fHt9O3ZhciByPXRoaXMuc3RhcnQueC10aGlzLmVuZC54LGk9dGhpcy5zdGFydC55LXRoaXMuZW5kLnksbz1NYXRoLnBvdyhNYXRoLnNpbihpLzIpLDIpK01hdGguY29zKHRoaXMuc3RhcnQueSkqTWF0aC5jb3ModGhpcy5lbmQueSkqTWF0aC5wb3coTWF0aC5zaW4oci8yKSwyKTtpZih0aGlzLmc9MipNYXRoLmFzaW4oTWF0aC5zcXJ0KG8pKSx0aGlzLmc9PT1NYXRoLlBJKXRocm93IG5ldyBFcnJvcigiaXQgYXBwZWFycyAiK3QudmlldygpKyIgYW5kICIrZS52aWV3KCkrIiBhcmUgJ2FudGlwb2RhbCcsIGUuZyBkaWFtZXRyaWNhbGx5IG9wcG9zaXRlLCB0aHVzIHRoZXJlIGlzIG5vIHNpbmdsZSByb3V0ZSBidXQgcmF0aGVyIGluZmluaXRlIik7aWYoaXNOYU4odGhpcy5nKSl0aHJvdyBuZXcgRXJyb3IoImNvdWxkIG5vdCBjYWxjdWxhdGUgZ3JlYXQgY2lyY2xlIGJldHdlZW4gIit0KyIgYW5kICIrZSl9O2Z1bmN0aW9uIF9pKHQsZSl7dmFyIG49W10scj1NcigpO3JldHVybiB6KGUsKGZ1bmN0aW9uKGUpe2lmKG4uZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt0LmlkPWV9KSksbi5sZW5ndGgpe3ZhciBpPXIuc2VhcmNoKGUpO2lmKGkuZmVhdHVyZXMubGVuZ3RoKXt2YXIgbz14aShlLGkpO249bi5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmlkIT09by5pZH0pKSxyLnJlbW92ZShvKSxGKG1pKG8sZSksKGZ1bmN0aW9uKHQpe24ucHVzaCh0KSxyLmluc2VydCh0KX0pKX19ZWxzZShuPW1pKHQsZSkuZmVhdHVyZXMpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYmJveHx8KHQuYmJveD15bihaKHQpKSl9KSksci5sb2FkKGYobikpfSkpLGYobil9ZnVuY3Rpb24gbWkodCxlKXt2YXIgbj1bXSxyPVEodClbMF0saT1RKHQpW3QuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoLTFdO2lmKEVpKHIsSyhlKSl8fEVpKGksSyhlKSkpcmV0dXJuIGYoW3RdKTt2YXIgbz1NcigpLHM9Wm4odCk7by5sb2FkKHMpO3ZhciBhPW8uc2VhcmNoKGUpO2lmKCFhLmZlYXR1cmVzLmxlbmd0aClyZXR1cm4gZihbdF0pO3ZhciB1PXhpKGUsYSksbD1rKHMsKGZ1bmN0aW9uKHQscixpKXt2YXIgbz1RKHIpWzFdLHM9SyhlKTtyZXR1cm4gaT09PXUuaWQ/KHQucHVzaChzKSxuLnB1c2goaCh0KSksRWkocyxvKT9bc106W3Msb10pOih0LnB1c2gobyksdCl9KSxbcl0pO3JldHVybiBsLmxlbmd0aD4xJiZuLnB1c2goaChsKSksZihuKX1mdW5jdGlvbiB4aSh0LGUpe2lmKCFlLmZlYXR1cmVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImxpbmVzIG11c3QgY29udGFpbiBmZWF0dXJlcyIpO2lmKDE9PT1lLmZlYXR1cmVzLmxlbmd0aClyZXR1cm4gZS5mZWF0dXJlc1swXTt2YXIgbixyPTEvMDtyZXR1cm4gRihlLChmdW5jdGlvbihlKXt2YXIgaT1UcihlLHQpLnByb3BlcnRpZXMuZGlzdDtpPHImJihuPWUscj1pKX0pKSxufWZ1bmN0aW9uIEVpKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX1mdW5jdGlvbiBiaSh0LGUsbixyLGkpe3ZvaWQgMD09PWkmJihpPXt9KTt2YXIgbz1pLnN0ZXBzfHw2NCxzPXdpKG4pLGE9d2kociksdT1BcnJheS5pc0FycmF5KHQpfHwiRmVhdHVyZSIhPT10LnR5cGU/e306dC5wcm9wZXJ0aWVzO2lmKHM9PT1hKXJldHVybiBoKF9uKHQsZSxpKS5nZW9tZXRyeS5jb29yZGluYXRlc1swXSx1KTtmb3IodmFyIGw9cyxjPXM8YT9hOmErMzYwLHA9bCxmPVtdLGc9MDtwPGM7KWYucHVzaCh2bih0LGUscCxpKS5nZW9tZXRyeS5jb29yZGluYXRlcykscD1sKzM2MCorK2cvbztyZXR1cm4gcD5jJiZmLnB1c2godm4odCxlLGMsaSkuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpLGgoZix1KX1mdW5jdGlvbiB3aSh0KXt2YXIgZT10JTM2MDtyZXR1cm4gZTwwJiYoZSs9MzYwKSxlfWZ1bmN0aW9uIElpKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPXJ0KHQpO3N3aXRjaChlLnByb3BlcnRpZXN8fCJGZWF0dXJlIiE9PXQudHlwZXx8KGUucHJvcGVydGllcz10LnByb3BlcnRpZXMpLG4udHlwZSl7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gTmkobixlKTtjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPXJ0KHQpLmNvb3JkaW5hdGVzLHI9ZS5wcm9wZXJ0aWVzP2UucHJvcGVydGllczoiRmVhdHVyZSI9PT10LnR5cGU/dC5wcm9wZXJ0aWVzOnt9LGk9W107cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5wdXNoKFNpKHQscikpfSkpLGYoaSl9KG4sZSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcG9seSIpfX1mdW5jdGlvbiBOaSh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksU2kocnQodCkuY29vcmRpbmF0ZXMsZS5wcm9wZXJ0aWVzP2UucHJvcGVydGllczoiRmVhdHVyZSI9PT10LnR5cGU/dC5wcm9wZXJ0aWVzOnt9KX1mdW5jdGlvbiBTaSh0LGUpe3JldHVybiB0Lmxlbmd0aD4xP2codCxlKTpoKHRbMF0sZSl9ZnVuY3Rpb24gQ2kodCxlKXt2YXIgbixyLGk7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBvPWUucHJvcGVydGllcyxzPW51bGw9PT0obj1lLmF1dG9Db21wbGV0ZSl8fHZvaWQgMD09PW58fG4sYT1udWxsPT09KHI9ZS5vcmRlckNvb3Jkcyl8fHZvaWQgMD09PXJ8fHI7c3dpdGNoKG51bGwhPT0oaT1lLm11dGF0ZSkmJnZvaWQgMCE9PWkmJml8fCh0PUllKHQpKSx0LnR5cGUpe2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnZhciB1PVtdO3JldHVybiB0LmZlYXR1cmVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3UucHVzaChRKFBpKHQse30scyxhKSkpfSkpLHkodSxvKTtkZWZhdWx0OnJldHVybiBQaSh0LG8scyxhKX19ZnVuY3Rpb24gUGkodCxlLG4scil7ZT1lfHwoIkZlYXR1cmUiPT09dC50eXBlP3QucHJvcGVydGllczp7fSk7dmFyIGk9cnQodCksbz1pLmNvb3JkaW5hdGVzLHM9aS50eXBlO2lmKCFvLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImxpbmUgbXVzdCBjb250YWluIGNvb3JkaW5hdGVzIik7c3dpdGNoKHMpe2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIG4mJihvPU1pKG8pKSxsKFtvXSxlKTtjYXNlIk11bHRpTGluZVN0cmluZyI6dmFyIGE9W10sdT0wO3JldHVybiBvLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKG4mJih0PU1pKHQpKSxyKXt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT10WzBdLG49dFsxXSxyPXRbMl0saT10WzNdO3JldHVybiBNYXRoLmFicyhlLXIpKk1hdGguYWJzKG4taSl9KFooaCh0KSkpO2U+dT8oYS51bnNoaWZ0KHQpLHU9ZSk6YS5wdXNoKHQpfWVsc2UgYS5wdXNoKHQpfSkpLGwoYSxlKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZ2VvbWV0cnkgdHlwZSAiK3MrIiBpcyBub3Qgc3VwcG9ydGVkIil9fWZ1bmN0aW9uIE1pKHQpe3ZhciBlPXRbMF0sbj1lWzBdLHI9ZVsxXSxpPXRbdC5sZW5ndGgtMV0sbz1pWzBdLHM9aVsxXTtyZXR1cm4gbj09PW8mJnI9PT1zfHx0LnB1c2goZSksdH1mdW5jdGlvbiBMaSh0LGUpe3ZhciBuLHIsaSxvLHMsYSx1O2ZvcihyPTE7cjw9ODtyKj0yKXtmb3Iobj1bXSxvPSEoUmkoaT10W3QubGVuZ3RoLTFdLGUpJnIpLHM9MDtzPHQubGVuZ3RoO3MrKykodT0hKFJpKGE9dFtzXSxlKSZyKSkhPT1vJiZuLnB1c2goT2koaSxhLHIsZSkpLHUmJm4ucHVzaChhKSxpPWEsbz11O2lmKCEodD1uKS5sZW5ndGgpYnJlYWt9cmV0dXJuIG59ZnVuY3Rpb24gT2kodCxlLG4scil7cmV0dXJuIDgmbj9bdFswXSsoZVswXS10WzBdKSooclszXS10WzFdKS8oZVsxXS10WzFdKSxyWzNdXTo0Jm4/W3RbMF0rKGVbMF0tdFswXSkqKHJbMV0tdFsxXSkvKGVbMV0tdFsxXSksclsxXV06MiZuP1tyWzJdLHRbMV0rKGVbMV0tdFsxXSkqKHJbMl0tdFswXSkvKGVbMF0tdFswXSldOjEmbj9bclswXSx0WzFdKyhlWzFdLXRbMV0pKihyWzBdLXRbMF0pLyhlWzBdLXRbMF0pXTpudWxsfWZ1bmN0aW9uIFJpKHQsZSl7dmFyIG49MDtyZXR1cm4gdFswXTxlWzBdP258PTE6dFswXT5lWzJdJiYobnw9MiksdFsxXTxlWzFdP258PTQ6dFsxXT5lWzNdJiYobnw9OCksbn1mdW5jdGlvbiBUaSh0LGUpe2Zvcih2YXIgbj1bXSxyPTAsaT10O3I8aS5sZW5ndGg7cisrKXt2YXIgbz1MaShpW3JdLGUpO28ubGVuZ3RoPjAmJihvWzBdWzBdPT09b1tvLmxlbmd0aC0xXVswXSYmb1swXVsxXT09PW9bby5sZW5ndGgtMV1bMV18fG8ucHVzaChvWzBdKSxvLmxlbmd0aD49NCYmbi5wdXNoKG8pKX1yZXR1cm4gbn12aS5wcm90b3R5cGUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5zaW4oKDEtdCkqdGhpcy5nKS9NYXRoLnNpbih0aGlzLmcpLG49TWF0aC5zaW4odCp0aGlzLmcpL01hdGguc2luKHRoaXMuZykscj1lKk1hdGguY29zKHRoaXMuc3RhcnQueSkqTWF0aC5jb3ModGhpcy5zdGFydC54KStuKk1hdGguY29zKHRoaXMuZW5kLnkpKk1hdGguY29zKHRoaXMuZW5kLngpLGk9ZSpNYXRoLmNvcyh0aGlzLnN0YXJ0LnkpKk1hdGguc2luKHRoaXMuc3RhcnQueCkrbipNYXRoLmNvcyh0aGlzLmVuZC55KSpNYXRoLnNpbih0aGlzLmVuZC54KSxvPWUqTWF0aC5zaW4odGhpcy5zdGFydC55KStuKk1hdGguc2luKHRoaXMuZW5kLnkpLHM9ZmkqTWF0aC5hdGFuMihvLE1hdGguc3FydChNYXRoLnBvdyhyLDIpK01hdGgucG93KGksMikpKTtyZXR1cm5bZmkqTWF0aC5hdGFuMihpLHIpLHNdfSx2aS5wcm90b3R5cGUuQXJjPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107aWYoIXR8fHQ8PTIpbi5wdXNoKFt0aGlzLnN0YXJ0Lmxvbix0aGlzLnN0YXJ0LmxhdF0pLG4ucHVzaChbdGhpcy5lbmQubG9uLHRoaXMuZW5kLmxhdF0pO2Vsc2UgZm9yKHZhciByPTEvKHQtMSksaT0wO2k8dDsrK2kpe3ZhciBvPXIqaSxzPXRoaXMuaW50ZXJwb2xhdGUobyk7bi5wdXNoKHMpfWZvcih2YXIgYT0hMSx1PTAsbD1lJiZlLm9mZnNldD9lLm9mZnNldDoxMCxjPTE4MC1sLGg9LTE4MCtsLHA9MzYwLWwsZj0xO2Y8bi5sZW5ndGg7KytmKXt2YXIgZz1uW2YtMV1bMF0sZD1uW2ZdWzBdLHk9TWF0aC5hYnMoZC1nKTt5PnAmJihkPmMmJmc8aHx8Zz5jJiZkPGgpP2E9ITA6eT51JiYodT15KX12YXIgdj1bXTtpZihhJiZ1PGwpe3ZhciBfPVtdO3YucHVzaChfKTtmb3IodmFyIG09MDttPG4ubGVuZ3RoOysrbSl7dmFyIHg9cGFyc2VGbG9hdChuW21dWzBdKTtpZihtPjAmJk1hdGguYWJzKHgtblttLTFdWzBdKT5wKXt2YXIgRT1wYXJzZUZsb2F0KG5bbS0xXVswXSksYj1wYXJzZUZsb2F0KG5bbS0xXVsxXSksdz1wYXJzZUZsb2F0KG5bbV1bMF0pLEk9cGFyc2VGbG9hdChuW21dWzFdKTtpZihFPi0xODAmJkU8aCYmMTgwPT09dyYmbSsxPG4ubGVuZ3RoJiZuW20tMV1bMF0+LTE4MCYmblttLTFdWzBdPGgpe18ucHVzaChbLTE4MCxuW21dWzFdXSksbSsrLF8ucHVzaChbblttXVswXSxuW21dWzFdXSk7Y29udGludWV9aWYoRT5jJiZFPDE4MCYmLTE4MD09PXcmJm0rMTxuLmxlbmd0aCYmblttLTFdWzBdPmMmJm5bbS0xXVswXTwxODApe18ucHVzaChbMTgwLG5bbV1bMV1dKSxtKyssXy5wdXNoKFtuW21dWzBdLG5bbV1bMV1dKTtjb250aW51ZX1pZihFPGgmJnc+Yyl7dmFyIE49RTtFPXcsdz1OO3ZhciBTPWI7Yj1JLEk9U31pZihFPmMmJnc8aCYmKHcrPTM2MCksRTw9MTgwJiZ3Pj0xODAmJkU8dyl7dmFyIEM9KDE4MC1FKS8ody1FKSxQPUMqSSsoMS1DKSpiO18ucHVzaChbblttLTFdWzBdPmM/MTgwOi0xODAsUF0pLChfPVtdKS5wdXNoKFtuW20tMV1bMF0+Yz8tMTgwOjE4MCxQXSksdi5wdXNoKF8pfWVsc2UgXz1bXSx2LnB1c2goXyk7Xy5wdXNoKFt4LG5bbV1bMV1dKX1lbHNlIF8ucHVzaChbblttXVswXSxuW21dWzFdXSl9fWVsc2V7dmFyIE09W107di5wdXNoKE0pO2Zvcih2YXIgTD0wO0w8bi5sZW5ndGg7KytMKU0ucHVzaChbbltMXVswXSxuW0xdWzFdXSl9Zm9yKHZhciBPPW5ldyB5aSh0aGlzLnByb3BlcnRpZXMpLFI9MDtSPHYubGVuZ3RoOysrUil7dmFyIFQ9bmV3IGRpO08uZ2VvbWV0cmllcy5wdXNoKFQpO2Zvcih2YXIgQT12W1JdLEQ9MDtEPEEubGVuZ3RoOysrRClULm1vdmVfdG8oQVtEXSl9cmV0dXJuIE99O3ZhciBBaT1CdCgoZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZX0odC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3Qua2V5cz9PYmplY3Qua2V5czpuKS5zaGltPW59KSksRGk9QnQoKGZ1bmN0aW9uKHQsZSl7dmFyIG49IltvYmplY3QgQXJndW1lbnRzXSI9PWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudHMpfSgpO2Z1bmN0aW9uIHIodCl7cmV0dXJuIltvYmplY3QgQXJndW1lbnRzXSI9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBpKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJjYWxsZWUiKSYmIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LCJjYWxsZWUiKXx8ITF9KGU9dC5leHBvcnRzPW4/cjppKS5zdXBwb3J0ZWQ9cixlLnVuc3VwcG9ydGVkPWl9KSksRmk9QnQoKGZ1bmN0aW9uKHQpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZSxuPXQuZXhwb3J0cz1mdW5jdGlvbih0LG8scyl7cmV0dXJuIHN8fChzPXt9KSx0PT09b3x8KHQgaW5zdGFuY2VvZiBEYXRlJiZvIGluc3RhbmNlb2YgRGF0ZT90LmdldFRpbWUoKT09PW8uZ2V0VGltZSgpOiF0fHwhb3x8Im9iamVjdCIhPXR5cGVvZiB0JiYib2JqZWN0IiE9dHlwZW9mIG8/cy5zdHJpY3Q/dD09PW86dD09bzpmdW5jdGlvbih0LG8scyl7dmFyIGEsdTtpZihyKHQpfHxyKG8pKXJldHVybiExO2lmKHQucHJvdG90eXBlIT09by5wcm90b3R5cGUpcmV0dXJuITE7aWYoRGkodCkpcmV0dXJuISFEaShvKSYmKHQ9ZS5jYWxsKHQpLG89ZS5jYWxsKG8pLG4odCxvLHMpKTtpZihpKHQpKXtpZighaShvKSlyZXR1cm4hMTtpZih0Lmxlbmd0aCE9PW8ubGVuZ3RoKXJldHVybiExO2ZvcihhPTA7YTx0Lmxlbmd0aDthKyspaWYodFthXSE9PW9bYV0pcmV0dXJuITE7cmV0dXJuITB9dHJ5e3ZhciBsPUFpKHQpLGM9QWkobyl9Y2F0Y2godCl7cmV0dXJuITF9aWYobC5sZW5ndGghPWMubGVuZ3RoKXJldHVybiExO2ZvcihsLnNvcnQoKSxjLnNvcnQoKSxhPWwubGVuZ3RoLTE7YT49MDthLS0paWYobFthXSE9Y1thXSlyZXR1cm4hMTtmb3IoYT1sLmxlbmd0aC0xO2E+PTA7YS0tKWlmKHU9bFthXSwhbih0W3VdLG9bdV0scykpcmV0dXJuITE7cmV0dXJuIHR5cGVvZiB0PT10eXBlb2Ygb30odCxvLHMpKX07ZnVuY3Rpb24gcih0KXtyZXR1cm4gbnVsbD09dH1mdW5jdGlvbiBpKHQpe3JldHVybiEoIXR8fCJvYmplY3QiIT10eXBlb2YgdHx8Im51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aCkmJigiZnVuY3Rpb24iPT10eXBlb2YgdC5jb3B5JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zbGljZSYmISh0Lmxlbmd0aD4wJiYibnVtYmVyIiE9dHlwZW9mIHRbMF0pKX19KSk7ZnVuY3Rpb24ga2kodCxlLG4pe2lmKHZvaWQgMD09PW4mJihuPXt9KSwhUChuPW58fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciByLGk9bi50b2xlcmFuY2V8fDAsbz1bXSxzPU1yKCksYT1abih0KTtyZXR1cm4gcy5sb2FkKGEpLFUoZSwoZnVuY3Rpb24odCl7dmFyIGU9ITE7dCYmKEYocy5zZWFyY2godCksKGZ1bmN0aW9uKG4pe2lmKCExPT09ZSl7dmFyIG89USh0KS5zb3J0KCkscz1RKG4pLnNvcnQoKTtGaShvLHMpfHwoMD09PWk/V3Iob1swXSxuKSYmV3Iob1sxXSxuKTpUcihuLG9bMF0pLnByb3BlcnRpZXMuZGlzdDw9aSYmVHIobixvWzFdKS5wcm9wZXJ0aWVzLmRpc3Q8PWkpPyhlPSEwLHI9cj9HaShyLHQpOnQpOigwPT09aT9XcihzWzBdLHQpJiZXcihzWzFdLHQpOlRyKHQsc1swXSkucHJvcGVydGllcy5kaXN0PD1pJiZUcih0LHNbMV0pLnByb3BlcnRpZXMuZGlzdDw9aSkmJihyPXI/R2kocixuKTpuKX19KSksITE9PT1lJiZyJiYoby5wdXNoKHIpLHI9dm9pZCAwKSl9KSksciYmby5wdXNoKHIpLGYobyl9ZnVuY3Rpb24gR2kodCxlKXt2YXIgbj1RKGUpLHI9USh0KSxpPXJbMF0sbz1yW3IubGVuZ3RoLTFdLHM9dC5nZW9tZXRyeS5jb29yZGluYXRlcztyZXR1cm4gRmkoblswXSxpKT9zLnVuc2hpZnQoblsxXSk6RmkoblswXSxvKT9zLnB1c2goblsxXSk6RmkoblsxXSxpKT9zLnVuc2hpZnQoblswXSk6RmkoblsxXSxvKSYmcy5wdXNoKG5bMF0pLHR9ZnVuY3Rpb24gcWkodCl7dmFyIGU9dCUzNjA7cmV0dXJuIGU8MCYmKGUrPTM2MCksZX1mdW5jdGlvbiBCaSh0LGUsbil7dmFyIHI7cmV0dXJuIHZvaWQgMD09PW4mJihuPXt9KSwocj1uLmZpbmFsP3ppKEsoZSksSyh0KSk6emkoSyh0KSxLKGUpKSk+MTgwPy0oMzYwLXIpOnJ9ZnVuY3Rpb24gemkodCxlKXt2YXIgbj1JKHRbMV0pLHI9SShlWzFdKSxpPUkoZVswXS10WzBdKTtpPk1hdGguUEkmJihpLT0yKk1hdGguUEkpLGk8LU1hdGguUEkmJihpKz0yKk1hdGguUEkpO3ZhciBvPU1hdGgubG9nKE1hdGgudGFuKHIvMitNYXRoLlBJLzQpL01hdGgudGFuKG4vMitNYXRoLlBJLzQpKTtyZXR1cm4odyhNYXRoLmF0YW4yKGksbykpKzM2MCklMzYwfWZ1bmN0aW9uIGppKHQsbixyLGkpe3ZvaWQgMD09PWkmJihpPXt9KTt2YXIgbz1uPDAscz1OKE1hdGguYWJzKG4pLGkudW5pdHMsIm1ldGVycyIpO28mJihzPS1NYXRoLmFicyhzKSk7dmFyIHU9Syh0KSxsPWZ1bmN0aW9uKHQsbixyLGkpe2k9dm9pZCAwPT09aT9lOk51bWJlcihpKTt2YXIgbz1uL2kscz10WzBdKk1hdGguUEkvMTgwLGE9SSh0WzFdKSx1PUkociksbD1vKk1hdGguY29zKHUpLGM9YStsO01hdGguYWJzKGMpPk1hdGguUEkvMiYmKGM9Yz4wP01hdGguUEktYzotTWF0aC5QSS1jKTt2YXIgaD1NYXRoLmxvZyhNYXRoLnRhbihjLzIrTWF0aC5QSS80KS9NYXRoLnRhbihhLzIrTWF0aC5QSS80KSkscD1NYXRoLmFicyhoKT4xZS0xMT9sL2g6TWF0aC5jb3MoYSksZj1vKk1hdGguc2luKHUpL3A7cmV0dXJuWygxODAqKHMrZikvTWF0aC5QSSs1NDApJTM2MC0xODAsMTgwKmMvTWF0aC5QSV19KHUscyxyKTtyZXR1cm4gbFswXSs9bFswXS11WzBdPjE4MD8tMzYwOnVbMF0tbFswXT4xODA/MzYwOjAsYShsLGkucHJvcGVydGllcyl9ZnVuY3Rpb24gVWkodCxlLG4scixpLG8pe2Zvcih2YXIgcz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgYT10W3NdLHU9dFtzKzFdO3M9PT10Lmxlbmd0aC0xJiYodT10WzBdKSxyPVhpKGEsdSxlKSxuPD0wJiZyPjA/WGkoZSxhLGkpPDB8fChpPWEpOm4+MCYmcjw9MCYmKFZpKGUsYSxvKXx8KG89YSkpLG49cn1yZXR1cm5baSxvXX1mdW5jdGlvbiBWaSh0LGUsbil7cmV0dXJuIFhpKHQsZSxuKT4wfWZ1bmN0aW9uIFhpKHQsZSxuKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKS0oblswXS10WzBdKSooZVsxXS10WzFdKX1mdW5jdGlvbiBZaSh0KXtmb3IodmFyIGUsbixyPVEodCksaT0wLG89MTtvPHIubGVuZ3RoOyllPW58fHJbMF0saSs9KChuPXJbb10pWzBdLWVbMF0pKihuWzFdK2VbMV0pLG8rKztyZXR1cm4gaT4wfWZ1bmN0aW9uIEhpKHQsZSl7c3dpdGNoKCJGZWF0dXJlIj09PXQudHlwZT90Lmdlb21ldHJ5LnR5cGU6dC50eXBlKXtjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6cmV0dXJuIHEodCwoZnVuY3Rpb24odCl7SGkodCxlKX0pKSx0O2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIFdpKFEodCksZSksdDtjYXNlIlBvbHlnb24iOnJldHVybiBKaShRKHQpLGUpLHQ7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiBRKHQpLmZvckVhY2goKGZ1bmN0aW9uKHQpe1dpKHQsZSl9KSksdDtjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIFEodCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7SmkodCxlKX0pKSx0O2Nhc2UiUG9pbnQiOmNhc2UiTXVsdGlQb2ludCI6cmV0dXJuIHR9fWZ1bmN0aW9uIFdpKHQsZSl7WWkodCk9PT1lJiZ0LnJldmVyc2UoKX1mdW5jdGlvbiBKaSh0LGUpe1lpKHRbMF0pIT09ZSYmdFswXS5yZXZlcnNlKCk7Zm9yKHZhciBuPTE7bjx0Lmxlbmd0aDtuKyspWWkodFtuXSk9PT1lJiZ0W25dLnJldmVyc2UoKX1mdW5jdGlvbiBaaSh0LGUpe2lmKCFQKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS56UHJvcGVydHl8fCJlbGV2YXRpb24iLHI9ZS5mbGlwLGk9ZS5mbGFncztudCh0LCJQb2ludCIsImlucHV0IG11c3QgY29udGFpbiBQb2ludHMiKTtmb3IodmFyIG89ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtyZXR1cm4gRih0LChmdW5jdGlvbih0KXt2YXIgZT1RKHQpWzFdO25bZV18fChuW2VdPVtdKSxuW2VdLnB1c2godCl9KSksT2JqZWN0LmtleXMobikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gblt0XS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBRKHQpWzBdLVEoZSlbMF19KSl9KSkuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZT9RKHRbMF0pWzFdLVEoblswXSlbMV06UShuWzBdKVsxXS1RKHRbMF0pWzFdfSkpfQovKiEKICAgICAqIEBsaWNlbnNlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KICAgICAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxNSBSb25ueSBMb3JlbnogPHJvbm55QHRiaS51bml2aWUuYWMuYXQ+CiAgICAgKiB2LiAxLjIuMAogICAgICogaHR0cHM6Ly9naXRodWIuY29tL1JhdW1aZWl0L01hcmNoaW5nU3F1YXJlcy5qcwogICAgICoKICAgICAqIE1hcmNoaW5nU3F1YXJlc0pTIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgICAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgICAgKgogICAgICogTWFyY2hpbmdTcXVhcmVzSlMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICAgKiBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAgICAqCiAgICAgKiBBcyBhZGRpdGlvbmFsIHBlcm1pc3Npb24gdW5kZXIgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMwogICAgICogc2VjdGlvbiA3LCB0aGlyZC1wYXJ0eSBwcm9qZWN0cyAocGVyc29uYWwgb3IgY29tbWVyY2lhbCkgbWF5IGRpc3RyaWJ1dGUsCiAgICAgKiBpbmNsdWRlLCBvciBsaW5rIGFnYWluc3QgVU5NT0RJRklFRCBWRVJTSU9OUyBvZiBNYXJjaGluZ1NxdWFyZXNKUyB3aXRob3V0IHRoZQogICAgICogcmVxdWlyZW1lbnQgdGhhdCBzYWlkIHRoaXJkLXBhcnR5IHByb2plY3QgZm9yIHRoYXQgcmVhc29uIGFsb25lIGJlY29tZXMKICAgICAqIHN1YmplY3QgdG8gYW55IHJlcXVpcmVtZW50IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzLgogICAgICogQW55IG1vZGlmaWNhdGlvbnMgdG8gTWFyY2hpbmdTcXVhcmVzSlMsIGhvd2V2ZXIsIG11c3QgYmUgc2hhcmVkIHdpdGggdGhlIHB1YmxpYwogICAgICogYW5kIG1hZGUgYXZhaWxhYmxlLgogICAgICoKICAgICAqIEluIHN1bW1hcnkgdGhpczoKICAgICAqIC0gYWxsb3dzIHlvdSB0byB1c2UgTWFyY2hpbmdTcXVhcmVzSlMgYXQgbm8gY29zdAogICAgICogLSBhbGxvd3MgeW91IHRvIHVzZSBNYXJjaGluZ1NxdWFyZXNKUyBmb3IgYm90aCBwZXJzb25hbCBhbmQgY29tbWVyY2lhbCBwdXJwb3NlcwogICAgICogLSBhbGxvd3MgeW91IHRvIGRpc3RyaWJ1dGUgVU5NT0RJRklFRCBWRVJTSU9OUyBvZiBNYXJjaGluZ1NxdWFyZXNKUyB1bmRlciBhbnkKICAgICAqICAgbGljZW5zZSBhcyBsb25nIGFzIHRoaXMgbGljZW5zZSBub3RpY2UgaXMgaW5jbHVkZWQKICAgICAqIC0gZW5hYmxlcyB5b3UgdG8ga2VlcCB0aGUgc291cmNlIGNvZGUgb2YgeW91ciBwcm9ncmFtIHRoYXQgdXNlcyBNYXJjaGluZ1NxdWFyZXNKUwogICAgICogICB1bmRpc2Nsb3NlZAogICAgICogLSBmb3JjZXMgeW91IHRvIHNoYXJlIGFueSBtb2RpZmljYXRpb25zIHlvdSBoYXZlIG1hZGUgdG8gTWFyY2hpbmdTcXVhcmVzSlMsCiAgICAgKiAgIGUuZy4gYnVnLWZpeGVzCiAgICAgKgogICAgICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICAgKiBhbG9uZyB3aXRoIE1hcmNoaW5nU3F1YXJlc0pTLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICAgICovKHQscikscz1bXSxhPTA7YTxvLmxlbmd0aDthKyspe2Zvcih2YXIgdT1vW2FdLGw9W10sYz0wO2M8dS5sZW5ndGg7YysrKXt2YXIgaD11W2NdO2gucHJvcGVydGllc1tuXT9sLnB1c2goaC5wcm9wZXJ0aWVzW25dKTpsLnB1c2goMCksITA9PT1pJiYoaC5wcm9wZXJ0aWVzLm1hdHJpeFBvc2l0aW9uPVthLGNdKX1zLnB1c2gobCl9cmV0dXJuIHN9dmFyIEtpPXtzdWNjZXNzQ2FsbGJhY2s6bnVsbCx2ZXJib3NlOiExLHBvbHlnb25zOiExfSxRaT17fTtmdW5jdGlvbiAkaSh0LGUsbixyKXtyPXJ8fHt9O2Zvcih2YXIgaT1PYmplY3Qua2V5cyhLaSksbz0wO288aS5sZW5ndGg7bysrKXt2YXIgcz1pW29dLGE9cltzXTthPW51bGwhPWE/YTpLaVtzXSxRaVtzXT1hfVFpLnZlcmJvc2UmJmNvbnNvbGUubG9nKCJNYXJjaGluZ1NxdWFyZXNKUy1pc29CYW5kczogY29tcHV0aW5nIGlzb2JhbmRzIGZvciBbIitlKyI6IisoZStuKSsiXSIpO3ZhciB1LGw9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10Lmxlbmd0aC0xLGk9dFswXS5sZW5ndGgtMSxvPXtyb3dzOnIsY29sczppLGNlbGxzOltdfSxzPWUrTWF0aC5hYnMobiksYT0wO2E8cjsrK2Epe28uY2VsbHNbYV09W107Zm9yKHZhciB1PTA7dTxpOysrdSl7dmFyIGw9MCxjPXRbYSsxXVt1XSxoPXRbYSsxXVt1KzFdLHA9dFthXVt1KzFdLGY9dFthXVt1XTtpZighKGlzTmFOKGMpfHxpc05hTihoKXx8aXNOYU4ocCl8fGlzTmFOKGYpKSl7bHw9YzxlPzA6Yz5zPzEyODo2NCxsfD1oPGU/MDpoPnM/MzI6MTYsbHw9cDxlPzA6cD5zPzg6NDt2YXIgZz0rKGx8PWY8ZT8wOmY+cz8yOjEpLGQ9MDtpZigxNz09PWx8fDE4PT09bHx8MzM9PT1sfHwzND09PWx8fDM4PT09bHx8Njg9PT1sfHw3Mj09PWx8fDk4PT09bHx8MTAyPT09bHx8MTMyPT09bHx8MTM2PT09bHx8MTM3PT09bHx8MTUyPT09bHx8MTUzPT09bCl7dmFyIHk9KGMraCtwK2YpLzQ7ZD15PnM/Mjp5PGU/MDoxLDM0PT09bD8xPT09ZD9sPTM1OjA9PT1kJiYobD0xMzYpOjEzNj09PWw/MT09PWQ/KGw9MzUsZD00KTowPT09ZCYmKGw9MzQpOjE3PT09bD8xPT09ZD8obD0xNTUsZD00KTowPT09ZCYmKGw9MTUzKTo2OD09PWw/MT09PWQ/KGw9MTAzLGQ9NCk6MD09PWQmJihsPTEwMik6MTUzPT09bD8xPT09ZCYmKGw9MTU1KToxMDI9PT1sPzE9PT1kJiYobD0xMDMpOjE1Mj09PWw/ZDwyJiYobD0xNTYsZD0xKToxMzc9PT1sP2Q8MiYmKGw9MTM5LGQ9MSk6OTg9PT1sP2Q8MiYmKGw9OTksZD0xKTozOD09PWw/ZDwyJiYobD0zOSxkPTEpOjE4PT09bD9kPjA/KGw9MTU2LGQ9NCk6bD0xNTI6MzM9PT1sP2Q+MD8obD0xMzksZD00KTpsPTEzNzo3Mj09PWw/ZD4wPyhsPTk5LGQ9NCk6bD05ODoxMzI9PT1sJiYoZD4wPyhsPTM5LGQ9NCk6bD0zOCl9aWYoMCE9bCYmMTcwIT1sKXt2YXIgdixfLG0seCxFLGIsdyxJO3Y9Xz1tPXg9RT1iPXc9ST0uNTt2YXIgTj1bXTsxPT09bD8obT0xLVZvKGUscCxmKSxJPTEtVm8oZSxjLGYpLE4ucHVzaChHb1tsXSkpOjE2OT09PWw/KG09Vm8ocyxmLHApLEk9Vm8ocyxmLGMpLE4ucHVzaChHb1tsXSkpOjQ9PT1sPyhiPTEtVm8oZSxoLHApLHg9Vm8oZSxmLHApLE4ucHVzaChGb1tsXSkpOjE2Nj09PWw/KGI9Vm8ocyxwLGgpLHg9MS1WbyhzLHAsZiksTi5wdXNoKEZvW2xdKSk6MTY9PT1sPyhFPVZvKGUscCxoKSxfPVZvKGUsYyxoKSxOLnB1c2goRG9bbF0pKToxNTQ9PT1sPyhFPTEtVm8ocyxoLHApLF89MS1WbyhzLGgsYyksTi5wdXNoKERvW2xdKSk6NjQ9PT1sPyh3PVZvKGUsZixjKSx2PTEtVm8oZSxoLGMpLE4ucHVzaChCb1tsXSkpOjEwNj09PWw/KHc9MS1WbyhzLGMsZiksdj1WbyhzLGMsaCksTi5wdXNoKEJvW2xdKSk6MTY4PT09bD8oeD1WbyhzLGYscCksbT1WbyhlLGYscCksST1WbyhlLGYsYyksdz1WbyhzLGYsYyksTi5wdXNoKGtvW2xdKSxOLnB1c2goR29bbF0pKToyPT09bD8oeD0xLVZvKGUscCxmKSxtPTEtVm8ocyxwLGYpLEk9MS1WbyhzLGMsZiksdz0xLVZvKGUsYyxmKSxOLnB1c2goa29bbF0pLE4ucHVzaChHb1tsXSkpOjE2Mj09PWw/KEU9Vm8ocyxwLGgpLGI9Vm8oZSxwLGgpLHg9MS1WbyhlLHAsZiksbT0xLVZvKHMscCxmKSxOLnB1c2goa29bbF0pLE4ucHVzaChHb1tsXSkpOjg9PT1sPyhFPTEtVm8oZSxoLHApLGI9MS1WbyhzLGgscCkseD1WbyhzLGYscCksbT1WbyhlLGYscCksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pKToxMzg9PT1sPyhFPTEtVm8oZSxoLHApLGI9MS1WbyhzLGgscCksdj0xLVZvKHMsaCxjKSxfPTEtVm8oZSxoLGMpLE4ucHVzaChEb1tsXSksTi5wdXNoKEZvW2xdKSk6MzI9PT1sPyhFPVZvKHMscCxoKSxiPVZvKGUscCxoKSx2PVZvKGUsYyxoKSxfPVZvKHMsYyxoKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSkpOjQyPT09bD8oST0xLVZvKHMsYyxmKSx3PTEtVm8oZSxjLGYpLHY9Vm8oZSxjLGgpLF89Vm8ocyxjLGgpLE4ucHVzaChxb1tsXSksTi5wdXNoKEJvW2xdKSk6MTI4PT09bCYmKEk9Vm8oZSxmLGMpLHc9Vm8ocyxmLGMpLHY9MS1WbyhzLGgsYyksXz0xLVZvKGUsaCxjKSxOLnB1c2gocW9bbF0pLE4ucHVzaChCb1tsXSkpLDU9PT1sPyhiPTEtVm8oZSxoLHApLEk9MS1WbyhlLGMsZiksTi5wdXNoKEZvW2xdKSk6MTY1PT09bD8oYj1WbyhzLHAsaCksST1WbyhzLGYsYyksTi5wdXNoKEZvW2xdKSk6MjA9PT1sPyh4PVZvKGUsZixwKSxfPVZvKGUsYyxoKSxOLnB1c2goa29bbF0pKToxNTA9PT1sPyh4PTEtVm8ocyxwLGYpLF89MS1WbyhzLGgsYyksTi5wdXNoKGtvW2xdKSk6ODA9PT1sPyhFPVZvKGUscCxoKSx3PVZvKGUsZixjKSxOLnB1c2goRG9bbF0pKTo5MD09PWw/KEU9MS1WbyhzLGgscCksdz0xLVZvKHMsYyxmKSxOLnB1c2goRG9bbF0pKTo2NT09PWw/KG09MS1WbyhlLHAsZiksdj0xLVZvKGUsaCxjKSxOLnB1c2goR29bbF0pKToxMDU9PT1sPyhtPVZvKHMsZixwKSx2PVZvKHMsYyxoKSxOLnB1c2goR29bbF0pKToxNjA9PT1sPyhFPVZvKHMscCxoKSxiPVZvKGUscCxoKSxJPVZvKGUsZixjKSx3PVZvKHMsZixjKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSkpOjEwPT09bD8oRT0xLVZvKGUsaCxwKSxiPTEtVm8ocyxoLHApLEk9MS1WbyhzLGMsZiksdz0xLVZvKGUsYyxmKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSkpOjEzMD09PWw/KHg9MS1WbyhlLHAsZiksbT0xLVZvKHMscCxmKSx2PTEtVm8ocyxoLGMpLF89MS1WbyhlLGgsYyksTi5wdXNoKGtvW2xdKSxOLnB1c2goR29bbF0pKTo0MD09PWw/KHg9Vm8ocyxmLHApLG09Vm8oZSxmLHApLHY9Vm8oZSxjLGgpLF89Vm8ocyxjLGgpLE4ucHVzaChrb1tsXSksTi5wdXNoKEdvW2xdKSk6MTAxPT09bD8oYj1WbyhzLHAsaCksdj1WbyhzLGMsaCksTi5wdXNoKEZvW2xdKSk6Njk9PT1sPyhiPTEtVm8oZSxoLHApLHY9MS1WbyhlLGgsYyksTi5wdXNoKEZvW2xdKSk6MTQ5PT09bD8oST1WbyhzLGYsYyksXz0xLVZvKHMsaCxjKSxOLnB1c2gocW9bbF0pKToyMT09PWw/KEk9MS1WbyhlLGMsZiksXz1WbyhlLGMsaCksTi5wdXNoKHFvW2xdKSk6ODY9PT1sPyh4PTEtVm8ocyxwLGYpLHc9MS1WbyhzLGMsZiksTi5wdXNoKGtvW2xdKSk6ODQ9PT1sPyh4PVZvKGUsZixwKSx3PVZvKGUsZixjKSxOLnB1c2goa29bbF0pKTo4OT09PWw/KEU9MS1WbyhzLGgscCksbT1WbyhzLGYscCksTi5wdXNoKEdvW2xdKSk6ODE9PT1sPyhFPVZvKGUscCxoKSxtPTEtVm8oZSxwLGYpLE4ucHVzaChHb1tsXSkpOjk2PT09bD8oRT1WbyhzLHAsaCksYj1WbyhlLHAsaCksdz1WbyhlLGYsYyksdj1WbyhzLGMsaCksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pKTo3ND09PWw/KEU9MS1WbyhlLGgscCksYj0xLVZvKHMsaCxwKSx3PTEtVm8ocyxjLGYpLHY9MS1WbyhlLGgsYyksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pKToyND09PWw/KEU9MS1WbyhzLGgscCkseD1WbyhzLGYscCksbT1WbyhlLGYscCksXz1WbyhlLGMsaCksTi5wdXNoKERvW2xdKSxOLnB1c2goR29bbF0pKToxNDY9PT1sPyhFPVZvKGUscCxoKSx4PTEtVm8oZSxwLGYpLG09MS1WbyhzLHAsZiksXz0xLVZvKHMsaCxjKSxOLnB1c2goRG9bbF0pLE4ucHVzaChHb1tsXSkpOjY9PT1sPyhiPTEtVm8oZSxoLHApLHg9MS1WbyhzLHAsZiksST0xLVZvKHMsYyxmKSx3PTEtVm8oZSxjLGYpLE4ucHVzaChGb1tsXSksTi5wdXNoKGtvW2xdKSk6MTY0PT09bD8oYj1WbyhzLHAsaCkseD1WbyhlLGYscCksST1WbyhlLGYsYyksdz1WbyhzLGYsYyksTi5wdXNoKEZvW2xdKSxOLnB1c2goa29bbF0pKToxMjk9PT1sPyhtPTEtVm8oZSxwLGYpLEk9Vm8ocyxmLGMpLHY9MS1WbyhzLGgsYyksXz0xLVZvKGUsaCxjKSxOLnB1c2goR29bbF0pLE4ucHVzaChxb1tsXSkpOjQxPT09bD8obT1WbyhzLGYscCksST0xLVZvKGUsYyxmKSx2PVZvKGUsYyxoKSxfPVZvKHMsYyxoKSxOLnB1c2goR29bbF0pLE4ucHVzaChxb1tsXSkpOjY2PT09bD8oeD0xLVZvKGUscCxmKSxtPTEtVm8ocyxwLGYpLHc9MS1WbyhzLGMsZiksdj0xLVZvKGUsaCxjKSxOLnB1c2goa29bbF0pLE4ucHVzaChHb1tsXSkpOjEwND09PWw/KHg9Vm8ocyxmLHApLG09Vm8oZSxmLHApLHc9Vm8oZSxmLGMpLHY9Vm8ocyxjLGgpLE4ucHVzaChHb1tsXSksTi5wdXNoKHpvW2xdKSk6MTQ0PT09bD8oRT1WbyhlLHAsaCksST1WbyhlLGYsYyksdz1WbyhzLGYsYyksXz0xLVZvKHMsaCxjKSxOLnB1c2goRG9bbF0pLE4ucHVzaChCb1tsXSkpOjI2PT09bD8oRT0xLVZvKHMsaCxwKSxJPTEtVm8ocyxjLGYpLHc9MS1WbyhlLGMsZiksXz1WbyhlLGMsaCksTi5wdXNoKERvW2xdKSxOLnB1c2goQm9bbF0pKTozNj09PWw/KGI9Vm8ocyxwLGgpLHg9Vm8oZSxmLHApLHY9Vm8oZSxjLGgpLF89Vm8ocyxjLGgpLE4ucHVzaChGb1tsXSksTi5wdXNoKGtvW2xdKSk6MTM0PT09bD8oYj0xLVZvKGUsaCxwKSx4PTEtVm8ocyxwLGYpLHY9MS1WbyhzLGgsYyksXz0xLVZvKGUsaCxjKSxOLnB1c2goRm9bbF0pLE4ucHVzaChrb1tsXSkpOjk9PT1sPyhFPTEtVm8oZSxoLHApLGI9MS1WbyhzLGgscCksbT1WbyhzLGYscCksST0xLVZvKGUsYyxmKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSkpOjE2MT09PWw/KEU9Vm8ocyxwLGgpLGI9Vm8oZSxwLGgpLG09MS1WbyhlLHAsZiksST1WbyhzLGYsYyksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pKTozNz09PWw/KGI9Vm8ocyxwLGgpLEk9MS1WbyhlLGMsZiksdj1WbyhlLGMsaCksXz1WbyhzLGMsaCksTi5wdXNoKEZvW2xdKSxOLnB1c2gocW9bbF0pKToxMzM9PT1sPyhiPTEtVm8oZSxoLHApLEk9Vm8ocyxmLGMpLHY9MS1WbyhzLGgsYyksXz0xLVZvKGUsaCxjKSxOLnB1c2goRm9bbF0pLE4ucHVzaChxb1tsXSkpOjE0OD09PWw/KHg9Vm8oZSxmLHApLEk9Vm8oZSxmLGMpLHc9Vm8ocyxmLGMpLF89MS1WbyhzLGgsYyksTi5wdXNoKGtvW2xdKSxOLnB1c2goQm9bbF0pKToyMj09PWw/KHg9MS1WbyhzLHAsZiksST0xLVZvKHMsYyxmKSx3PTEtVm8oZSxjLGYpLF89Vm8oZSxjLGgpLE4ucHVzaChrb1tsXSksTi5wdXNoKEJvW2xdKSk6ODI9PT1sPyhFPVZvKGUscCxoKSx4PTEtVm8oZSxwLGYpLG09MS1WbyhzLHAsZiksdz0xLVZvKHMsYyxmKSxOLnB1c2goRG9bbF0pLE4ucHVzaChHb1tsXSkpOjg4PT09bD8oRT0xLVZvKHMsaCxwKSx4PVZvKHMsZixwKSxtPVZvKGUsZixwKSx3PVZvKGUsZixjKSxOLnB1c2goRG9bbF0pLE4ucHVzaChHb1tsXSkpOjczPT09bD8oRT0xLVZvKGUsaCxwKSxiPTEtVm8ocyxoLHApLG09Vm8ocyxmLHApLHY9MS1WbyhlLGgsYyksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pKTo5Nz09PWw/KEU9Vm8ocyxwLGgpLGI9Vm8oZSxwLGgpLG09MS1WbyhlLHAsZiksdj1WbyhzLGMsaCksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pKToxNDU9PT1sPyhFPVZvKGUscCxoKSxtPTEtVm8oZSxwLGYpLEk9Vm8ocyxmLGMpLF89MS1WbyhzLGgsYyksTi5wdXNoKERvW2xdKSxOLnB1c2gocW9bbF0pKToyNT09PWw/KEU9MS1WbyhzLGgscCksbT1WbyhzLGYscCksST0xLVZvKGUsYyxmKSxfPVZvKGUsYyxoKSxOLnB1c2goRG9bbF0pLE4ucHVzaChxb1tsXSkpOjcwPT09bD8oYj0xLVZvKGUsaCxwKSx4PTEtVm8ocyxwLGYpLHc9MS1WbyhzLGMsZiksdj0xLVZvKGUsaCxjKSxOLnB1c2goRm9bbF0pLE4ucHVzaChrb1tsXSkpOjEwMD09PWw/KGI9Vm8ocyxwLGgpLHg9Vm8oZSxmLHApLHc9Vm8oZSxmLGMpLHY9Vm8ocyxjLGgpLE4ucHVzaChGb1tsXSksTi5wdXNoKGtvW2xdKSk6MzQ9PT1sPygwPT09ZD8oRT0xLVZvKGUsaCxwKSxiPTEtVm8ocyxoLHApLHg9Vm8ocyxmLHApLG09Vm8oZSxmLHApLEk9Vm8oZSxmLGMpLHc9Vm8ocyxmLGMpLHY9MS1WbyhzLGgsYyksXz0xLVZvKGUsaCxjKSk6KEU9Vm8ocyxwLGgpLGI9Vm8oZSxwLGgpLHg9MS1WbyhlLHAsZiksbT0xLVZvKHMscCxmKSxJPTEtVm8ocyxjLGYpLHc9MS1WbyhlLGMsZiksdj1WbyhlLGMsaCksXz1WbyhzLGMsaCkpLE4ucHVzaChEb1tsXSksTi5wdXNoKEZvW2xdKSxOLnB1c2gocW9bbF0pLE4ucHVzaChCb1tsXSkpOjM1PT09bD8oND09PWQ/KEU9MS1WbyhlLGgscCksYj0xLVZvKHMsaCxwKSx4PVZvKHMsZixwKSxtPVZvKGUsZixwKSxJPVZvKGUsZixjKSx3PVZvKHMsZixjKSx2PTEtVm8ocyxoLGMpLF89MS1WbyhlLGgsYykpOihFPVZvKHMscCxoKSxiPVZvKGUscCxoKSx4PTEtVm8oZSxwLGYpLG09MS1WbyhzLHAsZiksST0xLVZvKHMsYyxmKSx3PTEtVm8oZSxjLGYpLHY9Vm8oZSxjLGgpLF89Vm8ocyxjLGgpKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSksTi5wdXNoKEdvW2xdKSxOLnB1c2goQm9bbF0pKToxMzY9PT1sPygwPT09ZD8oRT1WbyhzLHAsaCksYj1WbyhlLHAsaCkseD0xLVZvKGUscCxmKSxtPTEtVm8ocyxwLGYpLEk9MS1WbyhzLGMsZiksdz0xLVZvKGUsYyxmKSx2PVZvKGUsYyxoKSxfPVZvKHMsYyxoKSk6KEU9MS1WbyhlLGgscCksYj0xLVZvKHMsaCxwKSx4PVZvKHMsZixwKSxtPVZvKGUsZixwKSxJPVZvKGUsZixjKSx3PVZvKHMsZixjKSx2PTEtVm8ocyxoLGMpLF89MS1WbyhlLGgsYykpLE4ucHVzaChEb1tsXSksTi5wdXNoKEZvW2xdKSxOLnB1c2gocW9bbF0pLE4ucHVzaChCb1tsXSkpOjE1Mz09PWw/KDA9PT1kPyhFPVZvKGUscCxoKSxtPTEtVm8oZSxwLGYpLEk9MS1WbyhlLGMsZiksXz1WbyhlLGMsaCkpOihFPTEtVm8ocyxoLHApLG09Vm8ocyxmLHApLEk9Vm8ocyxmLGMpLF89MS1WbyhzLGgsYykpLE4ucHVzaChEb1tsXSksTi5wdXNoKEdvW2xdKSk6MTAyPT09bD8oMD09PWQ/KGI9MS1WbyhlLGgscCkseD1WbyhlLGYscCksdz1WbyhlLGYsYyksdj0xLVZvKGUsaCxjKSk6KGI9Vm8ocyxwLGgpLHg9MS1WbyhzLHAsZiksdz0xLVZvKHMsYyxmKSx2PVZvKHMsYyxoKSksTi5wdXNoKEZvW2xdKSxOLnB1c2goQm9bbF0pKToxNTU9PT1sPyg0PT09ZD8oRT1WbyhlLHAsaCksbT0xLVZvKGUscCxmKSxJPTEtVm8oZSxjLGYpLF89Vm8oZSxjLGgpKTooRT0xLVZvKHMsaCxwKSxtPVZvKHMsZixwKSxJPVZvKHMsZixjKSxfPTEtVm8ocyxoLGMpKSxOLnB1c2goRG9bbF0pLE4ucHVzaChxb1tsXSkpOjEwMz09PWw/KDQ9PT1kPyhiPTEtVm8oZSxoLHApLHg9Vm8oZSxmLHApLHc9Vm8oZSxmLGMpLHY9MS1WbyhlLGgsYykpOihiPVZvKHMscCxoKSx4PTEtVm8ocyxwLGYpLHc9MS1WbyhzLGMsZiksdj1WbyhzLGMsaCkpLE4ucHVzaChGb1tsXSksTi5wdXNoKGtvW2xdKSk6MTUyPT09bD8oMD09PWQ/KEU9Vm8oZSxwLGgpLHg9MS1WbyhlLHAsZiksbT0xLVZvKHMscCxmKSxJPTEtVm8ocyxjLGYpLHc9MS1WbyhlLGMsZiksXz1WbyhlLGMsaCkpOihFPTEtVm8ocyxoLHApLHg9Vm8ocyxmLHApLG09Vm8oZSxmLHApLEk9Vm8oZSxmLGMpLHc9Vm8ocyxmLGMpLF89MS1WbyhzLGgsYykpLE4ucHVzaChEb1tsXSksTi5wdXNoKGtvW2xdKSxOLnB1c2goR29bbF0pKToxNTY9PT1sPyg0PT09ZD8oRT1WbyhlLHAsaCkseD0xLVZvKGUscCxmKSxtPTEtVm8ocyxwLGYpLEk9MS1WbyhzLGMsZiksdz0xLVZvKGUsYyxmKSxfPVZvKGUsYyxoKSk6KEU9MS1WbyhzLGgscCkseD1WbyhzLGYscCksbT1WbyhlLGYscCksST1WbyhlLGYsYyksdz1WbyhzLGYsYyksXz0xLVZvKHMsaCxjKSksTi5wdXNoKERvW2xdKSxOLnB1c2goR29bbF0pLE4ucHVzaChCb1tsXSkpOjEzNz09PWw/KDA9PT1kPyhFPVZvKHMscCxoKSxiPVZvKGUscCxoKSxtPTEtVm8oZSxwLGYpLEk9MS1WbyhlLGMsZiksdj1WbyhlLGMsaCksXz1WbyhzLGMsaCkpOihFPTEtVm8oZSxoLHApLGI9MS1WbyhzLGgscCksbT1WbyhzLGYscCksST1WbyhzLGYsYyksdj0xLVZvKHMsaCxjKSxfPTEtVm8oZSxoLGMpKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSksTi5wdXNoKEdvW2xdKSk6MTM5PT09bD8oND09PWQ/KEU9Vm8ocyxwLGgpLGI9Vm8oZSxwLGgpLG09MS1WbyhlLHAsZiksST0xLVZvKGUsYyxmKSx2PVZvKGUsYyxoKSxfPVZvKHMsYyxoKSk6KEU9MS1WbyhlLGgscCksYj0xLVZvKHMsaCxwKSxtPVZvKHMsZixwKSxJPVZvKHMsZixjKSx2PTEtVm8ocyxoLGMpLF89MS1WbyhlLGgsYykpLE4ucHVzaChEb1tsXSksTi5wdXNoKEZvW2xdKSxOLnB1c2gocW9bbF0pKTo5OD09PWw/KDA9PT1kPyhFPTEtVm8oZSxoLHApLGI9MS1WbyhzLGgscCkseD1WbyhzLGYscCksbT1WbyhlLGYscCksdz1WbyhlLGYsYyksdj0xLVZvKGUsaCxjKSk6KEU9Vm8ocyxwLGgpLGI9Vm8oZSxwLGgpLHg9MS1WbyhlLHAsZiksbT0xLVZvKHMscCxmKSx3PTEtVm8ocyxjLGYpLHY9Vm8ocyxjLGgpKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSksTi5wdXNoKEJvW2xdKSk6OTk9PT1sPyg0PT09ZD8oRT0xLVZvKGUsaCxwKSxiPTEtVm8ocyxoLHApLHg9Vm8ocyxmLHApLG09Vm8oZSxmLHApLHc9Vm8oZSxmLGMpLHY9MS1WbyhlLGgsYykpOihFPVZvKHMscCxoKSxiPVZvKGUscCxoKSx4PTEtVm8oZSxwLGYpLG09MS1WbyhzLHAsZiksdz0xLVZvKHMsYyxmKSx2PVZvKHMsYyxoKSksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pLE4ucHVzaChHb1tsXSkpOjM4PT09bD8oMD09PWQ/KGI9MS1WbyhlLGgscCkseD1WbyhlLGYscCksST1WbyhlLGYsYyksdz1WbyhzLGYsYyksdj0xLVZvKHMsaCxjKSxfPTEtVm8oZSxoLGMpKTooYj1WbyhzLHAsaCkseD0xLVZvKHMscCxmKSxJPTEtVm8ocyxjLGYpLHc9MS1WbyhlLGMsZiksdj1WbyhlLGMsaCksXz1WbyhzLGMsaCkpLE4ucHVzaChGb1tsXSksTi5wdXNoKHFvW2xdKSxOLnB1c2goQm9bbF0pKTozOT09PWw/KDQ9PT1kPyhiPTEtVm8oZSxoLHApLHg9Vm8oZSxmLHApLEk9Vm8oZSxmLGMpLHc9Vm8ocyxmLGMpLHY9MS1WbyhzLGgsYyksXz0xLVZvKGUsaCxjKSk6KGI9Vm8ocyxwLGgpLHg9MS1WbyhzLHAsZiksST0xLVZvKHMsYyxmKSx3PTEtVm8oZSxjLGYpLHY9Vm8oZSxjLGgpLF89Vm8ocyxjLGgpKSxOLnB1c2goRm9bbF0pLE4ucHVzaChrb1tsXSksTi5wdXNoKEJvW2xdKSk6ODU9PT1sJiYoRT0xLGI9MCx4PTEsbT0wLEk9MCx3PTEsdj0wLF89MSksKHY8MHx8dj4xfHxfPDB8fF8+MXx8RTwwfHxFPjF8fHg8MHx8eD4xfHxJPDB8fEk+MXx8dzwwfHx3PjEpJiZjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6ICIrbCsiICIrZysiICIrYysiLCIraCsiLCIrcCsiLCIrZisiICIrZCsiICIrdisiICIrXysiICIrRSsiICIrYisiICIreCsiICIrbSsiICIrSSsiICIrdyksby5jZWxsc1thXVt1XT17Y3ZhbDpsLGN2YWxfcmVhbDpnLGZsaXBwZWQ6ZCx0b3BsZWZ0OnYsdG9wcmlnaHQ6XyxyaWdodHRvcDpFLHJpZ2h0Ym90dG9tOmIsYm90dG9tcmlnaHQ6eCxib3R0b21sZWZ0Om0sbGVmdGJvdHRvbTpJLGxlZnR0b3A6dyxlZGdlczpOfX19fX1yZXR1cm4gb30odCxlLG4pO3JldHVybiBRaS5wb2x5Z29ucz8oUWkudmVyYm9zZSYmY29uc29sZS5sb2coIk1hcmNoaW5nU3F1YXJlc0pTLWlzb0JhbmRzOiByZXR1cm5pbmcgc2luZ2xlIHBvbHlnb25zIGZvciBlYWNoIGdyaWQgY2VsbCIpLHU9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj0wO3JldHVybiB0LmNlbGxzLmZvckVhY2goKGZ1bmN0aW9uKHQscil7dC5mb3JFYWNoKChmdW5jdGlvbih0LGkpe2lmKHZvaWQgMCE9PXQpe3ZhciBvPVVvW3QuY3ZhbF0odCk7Im9iamVjdCI9PXR5cGVvZiBvJiZYbyhvKT8ib2JqZWN0Ij09dHlwZW9mIG9bMF0mJlhvKG9bMF0pPyJvYmplY3QiPT10eXBlb2Ygb1swXVswXSYmWG8ob1swXVswXSk/by5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3RbMF0rPWksdFsxXSs9cn0pKSxlW24rK109dH0pKTooby5mb3JFYWNoKChmdW5jdGlvbih0KXt0WzBdKz1pLHRbMV0rPXJ9KSksZVtuKytdPW8pOmNvbnNvbGUubG9nKCJNYXJjaGluZ1NxdWFyZXNKUy1pc29CYW5kczogYmFuZGNlbGwgcG9seWdvbiB3aXRoIG1hbGZvcm1lZCBjb29yZGluYXRlcyIpOmNvbnNvbGUubG9nKCJNYXJjaGluZ1NxdWFyZXNKUy1pc29CYW5kczogYmFuZGNlbGwgcG9seWdvbiB3aXRoIG51bGwgY29vcmRpbmF0ZXMiKX19KSl9KSksZX0obCkpOihRaS52ZXJib3NlJiZjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IHJldHVybmluZyBwb2x5Z29uIHBhdGhzIGZvciBlbnRpcmUgZGF0YSBncmlkIiksdT1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj10LnJvd3Mscj10LmNvbHMsaT1bXSxvPTA7bzxuO28rKylmb3IodmFyIHM9MDtzPHI7cysrKWlmKHZvaWQgMCE9PXQuY2VsbHNbb11bc10mJnQuY2VsbHNbb11bc10uZWRnZXMubGVuZ3RoPjApe3ZhciBhPUhvKHQuY2VsbHNbb11bc10pLHU9bnVsbCxsPXMsYz1vO251bGwhPT1hJiZpLnB1c2goW2EucFswXStsLGEucFsxXStjXSk7ZG97aWYobnVsbD09PSh1PVdvKHQuY2VsbHNbY11bbF0sYS54LGEueSxhLm8pKSlicmVhaztpZihpLnB1c2goW3UucFswXStsLHUucFsxXStjXSksbCs9dS54LGE9dSwoYys9dS55KTwwfHxjPj1ufHxsPDB8fGw+PXJ8fHZvaWQgMD09PXQuY2VsbHNbY11bbF0pe3ZhciBoPVlvKHQsbC09dS54LGMtPXUueSx1LngsdS55LHUubyk7aWYobnVsbD09PWgpYnJlYWs7aC5wYXRoLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kucHVzaCh0KX0pKSxsPWguaSxjPWguaixhPWh9fXdoaWxlKHZvaWQgMCE9PXQuY2VsbHNbY11bbF0mJnQuY2VsbHNbY11bbF0uZWRnZXMubGVuZ3RoPjApO2UucHVzaChpKSxpPVtdLHQuY2VsbHNbb11bc10uZWRnZXMubGVuZ3RoPjAmJnMtLX1yZXR1cm4gZX0obCkpLCJmdW5jdGlvbiI9PXR5cGVvZiBRaS5zdWNjZXNzQ2FsbGJhY2smJlFpLnN1Y2Nlc3NDYWxsYmFjayh1KSx1fXZhciB0bz02NCxlbz0xNixubz1bXSxybz1bXSxpbz1bXSxvbz1bXSxzbz1bXSxhbz1bXSx1bz1bXSxsbz1bXSxjbz1bXSxobz1bXSxwbz1bXSxmbz1bXSxnbz1bXSx5bz1bXSx2bz1bXSxfbz1bXSxtbz1bXSx4bz1bXSxFbz1bXSxibz1bXSx3bz1bXSxJbz1bXSxObz1bXSxTbz1bXTt1b1s4NV09aG9bODVdPS0xLGxvWzg1XT1wb1s4NV09MCxjb1s4NV09Zm9bODVdPTEsRW9bODVdPUlvWzg1XT0xLGJvWzg1XT1Ob1s4NV09MCx3b1s4NV09U29bODVdPTEsbm9bODVdPW9vWzg1XT0wLHJvWzg1XT1zb1s4NV09LTEsaW9bODVdPXZvWzg1XT0wLF9vWzg1XT1nb1s4NV09MCxtb1s4NV09eW9bODVdPTEsYW9bODVdPXhvWzg1XT0xLElvWzFdPUlvWzE2OV09MCxOb1sxXT1Ob1sxNjldPS0xLFNvWzFdPVNvWzE2OV09MCxnb1sxXT1nb1sxNjldPS0xLHlvWzFdPXlvWzE2OV09MCx2b1sxXT12b1sxNjldPTAsaG9bNF09aG9bMTY2XT0wLHBvWzRdPXBvWzE2Nl09LTEsZm9bNF09Zm9bMTY2XT0xLF9vWzRdPV9vWzE2Nl09MSxtb1s0XT1tb1sxNjZdPTAseG9bNF09eG9bMTY2XT0wLHVvWzE2XT11b1sxNTRdPTAsbG9bMTZdPWxvWzE1NF09MSxjb1sxNl09Y29bMTU0XT0xLG9vWzE2XT1vb1sxNTRdPTEsc29bMTZdPXNvWzE1NF09MCxhb1sxNl09YW9bMTU0XT0xLEVvWzY0XT1Fb1sxMDZdPTAsYm9bNjRdPWJvWzEwNl09MSx3b1s2NF09d29bMTA2XT0wLG5vWzY0XT1ub1sxMDZdPS0xLHJvWzY0XT1yb1sxMDZdPTAsaW9bNjRdPWlvWzEwNl09MSxFb1syXT1Fb1sxNjhdPTAsYm9bMl09Ym9bMTY4XT0tMSx3b1syXT13b1sxNjhdPTEsSW9bMl09SW9bMTY4XT0wLE5vWzJdPU5vWzE2OF09LTEsU29bMl09U29bMTY4XT0wLGdvWzJdPWdvWzE2OF09LTEseW9bMl09eW9bMTY4XT0wLHZvWzJdPXZvWzE2OF09MCxfb1syXT1fb1sxNjhdPS0xLG1vWzJdPW1vWzE2OF09MCx4b1syXT14b1sxNjhdPTEsdW9bOF09dW9bMTYyXT0wLGxvWzhdPWxvWzE2Ml09LTEsY29bOF09Y29bMTYyXT0wLGhvWzhdPWhvWzE2Ml09MCxwb1s4XT1wb1sxNjJdPS0xLGZvWzhdPWZvWzE2Ml09MSxnb1s4XT1nb1sxNjJdPTEseW9bOF09eW9bMTYyXT0wLHZvWzhdPXZvWzE2Ml09MSxfb1s4XT1fb1sxNjJdPTEsbW9bOF09bW9bMTYyXT0wLHhvWzhdPXhvWzE2Ml09MCx1b1szMl09dW9bMTM4XT0wLGxvWzMyXT1sb1sxMzhdPTEsY29bMzJdPWNvWzEzOF09MSxob1szMl09aG9bMTM4XT0wLHBvWzMyXT1wb1sxMzhdPTEsZm9bMzJdPWZvWzEzOF09MCxub1szMl09bm9bMTM4XT0xLHJvWzMyXT1yb1sxMzhdPTAsaW9bMzJdPWlvWzEzOF09MCxvb1szMl09b29bMTM4XT0xLHNvWzMyXT1zb1sxMzhdPTAsYW9bMzJdPWFvWzEzOF09MSxJb1sxMjhdPUlvWzQyXT0wLE5vWzEyOF09Tm9bNDJdPTEsU29bMTI4XT1Tb1s0Ml09MSxFb1sxMjhdPUVvWzQyXT0wLGJvWzEyOF09Ym9bNDJdPTEsd29bMTI4XT13b1s0Ml09MCxub1sxMjhdPW5vWzQyXT0tMSxyb1sxMjhdPXJvWzQyXT0wLGlvWzEyOF09aW9bNDJdPTEsb29bMTI4XT1vb1s0Ml09LTEsc29bMTI4XT1zb1s0Ml09MCxhb1sxMjhdPWFvWzQyXT0wLGhvWzVdPWhvWzE2NV09LTEscG9bNV09cG9bMTY1XT0wLGZvWzVdPWZvWzE2NV09MCxJb1s1XT1Jb1sxNjVdPTEsTm9bNV09Tm9bMTY1XT0wLFNvWzVdPVNvWzE2NV09MCxfb1syMF09X29bMTUwXT0wLG1vWzIwXT1tb1sxNTBdPTEseG9bMjBdPXhvWzE1MF09MSxvb1syMF09b29bMTUwXT0wLHNvWzIwXT1zb1sxNTBdPS0xLGFvWzIwXT1hb1sxNTBdPTEsdW9bODBdPXVvWzkwXT0tMSxsb1s4MF09bG9bOTBdPTAsY29bODBdPWNvWzkwXT0xLEVvWzgwXT1Fb1s5MF09MSxib1s4MF09Ym9bOTBdPTAsd29bODBdPXdvWzkwXT0xLGdvWzY1XT1nb1sxMDVdPTAseW9bNjVdPXlvWzEwNV09MSx2b1s2NV09dm9bMTA1XT0wLG5vWzY1XT1ub1sxMDVdPTAscm9bNjVdPXJvWzEwNV09LTEsaW9bNjVdPWlvWzEwNV09MCx1b1sxNjBdPXVvWzEwXT0tMSxsb1sxNjBdPWxvWzEwXT0wLGNvWzE2MF09Y29bMTBdPTEsaG9bMTYwXT1ob1sxMF09LTEscG9bMTYwXT1wb1sxMF09MCxmb1sxNjBdPWZvWzEwXT0wLElvWzE2MF09SW9bMTBdPTEsTm9bMTYwXT1Ob1sxMF09MCxTb1sxNjBdPVNvWzEwXT0wLEVvWzE2MF09RW9bMTBdPTEsYm9bMTYwXT1ib1sxMF09MCx3b1sxNjBdPXdvWzEwXT0xLF9vWzEzMF09X29bNDBdPTAsbW9bMTMwXT1tb1s0MF09MSx4b1sxMzBdPXhvWzQwXT0xLGdvWzEzMF09Z29bNDBdPTAseW9bMTMwXT15b1s0MF09MSx2b1sxMzBdPXZvWzQwXT0wLG5vWzEzMF09bm9bNDBdPTAscm9bMTMwXT1yb1s0MF09LTEsaW9bMTMwXT1pb1s0MF09MCxvb1sxMzBdPW9vWzQwXT0wLHNvWzEzMF09c29bNDBdPS0xLGFvWzEzMF09YW9bNDBdPTEsaG9bMzddPWhvWzEzM109MCxwb1szN109cG9bMTMzXT0xLGZvWzM3XT1mb1sxMzNdPTEsSW9bMzddPUlvWzEzM109MCxOb1szN109Tm9bMTMzXT0xLFNvWzM3XT1Tb1sxMzNdPTAsbm9bMzddPW5vWzEzM109LTEscm9bMzddPXJvWzEzM109MCxpb1szN109aW9bMTMzXT0wLG9vWzM3XT1vb1sxMzNdPTEsc29bMzddPXNvWzEzM109MCxhb1szN109YW9bMTMzXT0wLF9vWzE0OF09X29bMjJdPS0xLG1vWzE0OF09bW9bMjJdPTAseG9bMTQ4XT14b1syMl09MCxJb1sxNDhdPUlvWzIyXT0wLE5vWzE0OF09Tm9bMjJdPS0xLFNvWzE0OF09U29bMjJdPTEsRW9bMTQ4XT1Fb1syMl09MCxib1sxNDhdPWJvWzIyXT0xLHdvWzE0OF09d29bMjJdPTEsb29bMTQ4XT1vb1syMl09LTEsc29bMTQ4XT1zb1syMl09MCxhb1sxNDhdPWFvWzIyXT0xLHVvWzgyXT11b1s4OF09MCxsb1s4Ml09bG9bODhdPS0xLGNvWzgyXT1jb1s4OF09MSxfb1s4Ml09X29bODhdPTEsbW9bODJdPW1vWzg4XT0wLHhvWzgyXT14b1s4OF09MSxnb1s4Ml09Z29bODhdPS0xLHlvWzgyXT15b1s4OF09MCx2b1s4Ml09dm9bODhdPTEsRW9bODJdPUVvWzg4XT0wLGJvWzgyXT1ib1s4OF09LTEsd29bODJdPXdvWzg4XT0wLHVvWzczXT11b1s5N109MCxsb1s3M109bG9bOTddPTEsY29bNzNdPWNvWzk3XT0wLGhvWzczXT1ob1s5N109MCxwb1s3M109cG9bOTddPS0xLGZvWzczXT1mb1s5N109MCxnb1s3M109Z29bOTddPTEseW9bNzNdPXlvWzk3XT0wLHZvWzczXT12b1s5N109MCxub1s3M109bm9bOTddPTEscm9bNzNdPXJvWzk3XT0wLGlvWzczXT1pb1s5N109MSx1b1sxNDVdPXVvWzI1XT0wLGxvWzE0NV09bG9bMjVdPS0xLGNvWzE0NV09Y29bMjVdPTAsZ29bMTQ1XT1nb1syNV09MSx5b1sxNDVdPXlvWzI1XT0wLHZvWzE0NV09dm9bMjVdPTEsSW9bMTQ1XT1Jb1syNV09MCxOb1sxNDVdPU5vWzI1XT0xLFNvWzE0NV09U29bMjVdPTEsb29bMTQ1XT1vb1syNV09LTEsc29bMTQ1XT1zb1syNV09MCxhb1sxNDVdPWFvWzI1XT0wLGhvWzcwXT1ob1sxMDBdPTAscG9bNzBdPXBvWzEwMF09MSxmb1s3MF09Zm9bMTAwXT0wLF9vWzcwXT1fb1sxMDBdPS0xLG1vWzcwXT1tb1sxMDBdPTAseG9bNzBdPXhvWzEwMF09MSxFb1s3MF09RW9bMTAwXT0wLGJvWzcwXT1ib1sxMDBdPS0xLHdvWzcwXT13b1sxMDBdPTEsbm9bNzBdPW5vWzEwMF09MSxyb1s3MF09cm9bMTAwXT0wLGlvWzcwXT1pb1sxMDBdPTAsaG9bMTAxXT1ob1s2OV09MCxwb1sxMDFdPXBvWzY5XT0xLGZvWzEwMV09Zm9bNjldPTAsbm9bMTAxXT1ub1s2OV09MSxyb1sxMDFdPXJvWzY5XT0wLGlvWzEwMV09aW9bNjldPTAsSW9bMTQ5XT1Jb1syMV09MCxOb1sxNDldPU5vWzIxXT0xLFNvWzE0OV09U29bMjFdPTEsb29bMTQ5XT1vb1syMV09LTEsc29bMTQ5XT1zb1syMV09MCxhb1sxNDldPWFvWzIxXT0wLF9vWzg2XT1fb1s4NF09LTEsbW9bODZdPW1vWzg0XT0wLHhvWzg2XT14b1s4NF09MSxFb1s4Nl09RW9bODRdPTAsYm9bODZdPWJvWzg0XT0tMSx3b1s4Nl09d29bODRdPTEsdW9bODldPXVvWzgxXT0wLGxvWzg5XT1sb1s4MV09LTEsY29bODldPWNvWzgxXT0wLGdvWzg5XT1nb1s4MV09MSx5b1s4OV09eW9bODFdPTAsdm9bODldPXZvWzgxXT0xLHVvWzk2XT11b1s3NF09MCxsb1s5Nl09bG9bNzRdPTEsY29bOTZdPWNvWzc0XT0wLGhvWzk2XT1ob1s3NF09LTEscG9bOTZdPXBvWzc0XT0wLGZvWzk2XT1mb1s3NF09MSxFb1s5Nl09RW9bNzRdPTEsYm9bOTZdPWJvWzc0XT0wLHdvWzk2XT13b1s3NF09MCxub1s5Nl09bm9bNzRdPTEscm9bOTZdPXJvWzc0XT0wLGlvWzk2XT1pb1s3NF09MSx1b1syNF09dW9bMTQ2XT0wLGxvWzI0XT1sb1sxNDZdPS0xLGNvWzI0XT1jb1sxNDZdPTEsX29bMjRdPV9vWzE0Nl09MSxtb1syNF09bW9bMTQ2XT0wLHhvWzI0XT14b1sxNDZdPTEsZ29bMjRdPWdvWzE0Nl09MCx5b1syNF09eW9bMTQ2XT0xLHZvWzI0XT12b1sxNDZdPTEsb29bMjRdPW9vWzE0Nl09MCxzb1syNF09c29bMTQ2XT0tMSxhb1syNF09YW9bMTQ2XT0wLGhvWzZdPWhvWzE2NF09LTEscG9bNl09cG9bMTY0XT0wLGZvWzZdPWZvWzE2NF09MSxfb1s2XT1fb1sxNjRdPS0xLG1vWzZdPW1vWzE2NF09MCx4b1s2XT14b1sxNjRdPTAsSW9bNl09SW9bMTY0XT0wLE5vWzZdPU5vWzE2NF09LTEsU29bNl09U29bMTY0XT0xLEVvWzZdPUVvWzE2NF09MSxib1s2XT1ib1sxNjRdPTAsd29bNl09d29bMTY0XT0wLGdvWzEyOV09Z29bNDFdPTAseW9bMTI5XT15b1s0MV09MSx2b1sxMjldPXZvWzQxXT0xLElvWzEyOV09SW9bNDFdPTAsTm9bMTI5XT1Ob1s0MV09MSxTb1sxMjldPVNvWzQxXT0wLG5vWzEyOV09bm9bNDFdPS0xLHJvWzEyOV09cm9bNDFdPTAsaW9bMTI5XT1pb1s0MV09MCxvb1sxMjldPW9vWzQxXT0wLHNvWzEyOV09c29bNDFdPS0xLGFvWzEyOV09YW9bNDFdPTAsX29bNjZdPV9vWzEwNF09MCxtb1s2Nl09bW9bMTA0XT0xLHhvWzY2XT14b1sxMDRdPTAsZ29bNjZdPWdvWzEwNF09LTEseW9bNjZdPXlvWzEwNF09MCx2b1s2Nl09dm9bMTA0XT0xLEVvWzY2XT1Fb1sxMDRdPTAsYm9bNjZdPWJvWzEwNF09LTEsd29bNjZdPXdvWzEwNF09MCxub1s2Nl09bm9bMTA0XT0wLHJvWzY2XT1yb1sxMDRdPS0xLGlvWzY2XT1pb1sxMDRdPTEsdW9bMTQ0XT11b1syNl09LTEsbG9bMTQ0XT1sb1syNl09MCxjb1sxNDRdPWNvWzI2XT0wLElvWzE0NF09SW9bMjZdPTEsTm9bMTQ0XT1Ob1syNl09MCxTb1sxNDRdPVNvWzI2XT0xLEVvWzE0NF09RW9bMjZdPTAsYm9bMTQ0XT1ib1syNl09MSx3b1sxNDRdPXdvWzI2XT0xLG9vWzE0NF09b29bMjZdPS0xLHNvWzE0NF09c29bMjZdPTAsYW9bMTQ0XT1hb1syNl09MSxob1szNl09aG9bMTM0XT0wLHBvWzM2XT1wb1sxMzRdPTEsZm9bMzZdPWZvWzEzNF09MSxfb1szNl09X29bMTM0XT0wLG1vWzM2XT1tb1sxMzRdPTEseG9bMzZdPXhvWzEzNF09MCxub1szNl09bm9bMTM0XT0wLHJvWzM2XT1yb1sxMzRdPS0xLGlvWzM2XT1pb1sxMzRdPTEsb29bMzZdPW9vWzEzNF09MSxzb1szNl09c29bMTM0XT0wLGFvWzM2XT1hb1sxMzRdPTAsdW9bOV09dW9bMTYxXT0tMSxsb1s5XT1sb1sxNjFdPTAsY29bOV09Y29bMTYxXT0wLGhvWzldPWhvWzE2MV09MCxwb1s5XT1wb1sxNjFdPS0xLGZvWzldPWZvWzE2MV09MCxnb1s5XT1nb1sxNjFdPTEseW9bOV09eW9bMTYxXT0wLHZvWzldPXZvWzE2MV09MCxJb1s5XT1Jb1sxNjFdPTEsTm9bOV09Tm9bMTYxXT0wLFNvWzldPVNvWzE2MV09MSx1b1sxMzZdPTAsbG9bMTM2XT0xLGNvWzEzNl09MSxob1sxMzZdPTAscG9bMTM2XT0xLGZvWzEzNl09MCxfb1sxMzZdPS0xLG1vWzEzNl09MCx4b1sxMzZdPTEsZ29bMTM2XT0tMSx5b1sxMzZdPTAsdm9bMTM2XT0wLElvWzEzNl09MCxOb1sxMzZdPS0xLFNvWzEzNl09MCxFb1sxMzZdPTAsYm9bMTM2XT0tMSx3b1sxMzZdPTEsbm9bMTM2XT0xLHJvWzEzNl09MCxpb1sxMzZdPTAsb29bMTM2XT0xLHNvWzEzNl09MCxhb1sxMzZdPTEsdW9bMzRdPTAsbG9bMzRdPS0xLGNvWzM0XT0wLGhvWzM0XT0wLHBvWzM0XT0tMSxmb1szNF09MSxfb1szNF09MSxtb1szNF09MCx4b1szNF09MCxnb1szNF09MSx5b1szNF09MCx2b1szNF09MSxJb1szNF09MCxOb1szNF09MSxTb1szNF09MSxFb1szNF09MCxib1szNF09MSx3b1szNF09MCxub1szNF09LTEscm9bMzRdPTAsaW9bMzRdPTEsb29bMzRdPS0xLHNvWzM0XT0wLGFvWzM0XT0wLHVvWzM1XT0wLGxvWzM1XT0xLGNvWzM1XT0xLGhvWzM1XT0wLHBvWzM1XT0tMSxmb1szNV09MSxfb1szNV09MSxtb1szNV09MCx4b1szNV09MCxnb1szNV09LTEseW9bMzVdPTAsdm9bMzVdPTAsSW9bMzVdPTAsTm9bMzVdPS0xLFNvWzM1XT0wLEVvWzM1XT0wLGJvWzM1XT0xLHdvWzM1XT0wLG5vWzM1XT0tMSxyb1szNV09MCxpb1szNV09MSxvb1szNV09MSxzb1szNV09MCxhb1szNV09MSx1b1sxNTNdPTAsbG9bMTUzXT0xLGNvWzE1M109MSxnb1sxNTNdPS0xLHlvWzE1M109MCx2b1sxNTNdPTAsSW9bMTUzXT0wLE5vWzE1M109LTEsU29bMTUzXT0wLG9vWzE1M109MSxzb1sxNTNdPTAsYW9bMTUzXT0xLGhvWzEwMl09MCxwb1sxMDJdPS0xLGZvWzEwMl09MSxfb1sxMDJdPTEsbW9bMTAyXT0wLHhvWzEwMl09MCxFb1sxMDJdPTAsYm9bMTAyXT0xLHdvWzEwMl09MCxub1sxMDJdPS0xLHJvWzEwMl09MCxpb1sxMDJdPTEsdW9bMTU1XT0wLGxvWzE1NV09LTEsY29bMTU1XT0wLGdvWzE1NV09MSx5b1sxNTVdPTAsdm9bMTU1XT0xLElvWzE1NV09MCxOb1sxNTVdPTEsU29bMTU1XT0xLG9vWzE1NV09LTEsc29bMTU1XT0wLGFvWzE1NV09MCxob1sxMDNdPTAscG9bMTAzXT0xLGZvWzEwM109MCxfb1sxMDNdPS0xLG1vWzEwM109MCx4b1sxMDNdPTEsRW9bMTAzXT0wLGJvWzEwM109LTEsd29bMTAzXT0xLG5vWzEwM109MSxyb1sxMDNdPTAsaW9bMTAzXT0wLHVvWzE1Ml09MCxsb1sxNTJdPTEsY29bMTUyXT0xLF9vWzE1Ml09LTEsbW9bMTUyXT0wLHhvWzE1Ml09MSxnb1sxNTJdPS0xLHlvWzE1Ml09MCx2b1sxNTJdPTAsSW9bMTUyXT0wLE5vWzE1Ml09LTEsU29bMTUyXT0wLEVvWzE1Ml09MCxib1sxNTJdPS0xLHdvWzE1Ml09MSxvb1sxNTJdPTEsc29bMTUyXT0wLGFvWzE1Ml09MSx1b1sxNTZdPTAsbG9bMTU2XT0tMSxjb1sxNTZdPTEsX29bMTU2XT0xLG1vWzE1Nl09MCx4b1sxNTZdPTEsZ29bMTU2XT0tMSx5b1sxNTZdPTAsdm9bMTU2XT0wLElvWzE1Nl09MCxOb1sxNTZdPS0xLFNvWzE1Nl09MCxFb1sxNTZdPTAsYm9bMTU2XT0xLHdvWzE1Nl09MSxvb1sxNTZdPS0xLHNvWzE1Nl09MCxhb1sxNTZdPTEsdW9bMTM3XT0wLGxvWzEzN109MSxjb1sxMzddPTEsaG9bMTM3XT0wLHBvWzEzN109MSxmb1sxMzddPTAsZ29bMTM3XT0tMSx5b1sxMzddPTAsdm9bMTM3XT0wLElvWzEzN109MCxOb1sxMzddPS0xLFNvWzEzN109MCxub1sxMzddPTEscm9bMTM3XT0wLGlvWzEzN109MCxvb1sxMzddPTEsc29bMTM3XT0wLGFvWzEzN109MSx1b1sxMzldPTAsbG9bMTM5XT0xLGNvWzEzOV09MSxob1sxMzldPTAscG9bMTM5XT0tMSxmb1sxMzldPTAsZ29bMTM5XT0xLHlvWzEzOV09MCx2b1sxMzldPTAsSW9bMTM5XT0wLE5vWzEzOV09MSxTb1sxMzldPTAsbm9bMTM5XT0tMSxyb1sxMzldPTAsaW9bMTM5XT0wLG9vWzEzOV09MSxzb1sxMzldPTAsYW9bMTM5XT0xLHVvWzk4XT0wLGxvWzk4XT0tMSxjb1s5OF09MCxob1s5OF09MCxwb1s5OF09LTEsZm9bOThdPTEsX29bOThdPTEsbW9bOThdPTAseG9bOThdPTAsZ29bOThdPTEseW9bOThdPTAsdm9bOThdPTEsRW9bOThdPTAsYm9bOThdPTEsd29bOThdPTAsbm9bOThdPS0xLHJvWzk4XT0wLGlvWzk4XT0xLHVvWzk5XT0wLGxvWzk5XT0xLGNvWzk5XT0wLGhvWzk5XT0wLHBvWzk5XT0tMSxmb1s5OV09MSxfb1s5OV09MSxtb1s5OV09MCx4b1s5OV09MCxnb1s5OV09LTEseW9bOTldPTAsdm9bOTldPTEsRW9bOTldPTAsYm9bOTldPS0xLHdvWzk5XT0wLG5vWzk5XT0xLHJvWzk5XT0wLGlvWzk5XT0xLGhvWzM4XT0wLHBvWzM4XT0tMSxmb1szOF09MSxfb1szOF09MSxtb1szOF09MCx4b1szOF09MCxJb1szOF09MCxOb1szOF09MSxTb1szOF09MSxFb1szOF09MCxib1szOF09MSx3b1szOF09MCxub1szOF09LTEscm9bMzhdPTAsaW9bMzhdPTEsb29bMzhdPS0xLHNvWzM4XT0wLGFvWzM4XT0wLGhvWzM5XT0wLHBvWzM5XT0xLGZvWzM5XT0xLF9vWzM5XT0tMSxtb1szOV09MCx4b1szOV09MCxJb1szOV09MCxOb1szOV09LTEsU29bMzldPTEsRW9bMzldPTAsYm9bMzldPTEsd29bMzldPTAsbm9bMzldPS0xLHJvWzM5XT0wLGlvWzM5XT0xLG9vWzM5XT0xLHNvWzM5XT0wLGFvWzM5XT0wO3ZhciBDbz1mdW5jdGlvbih0KXtyZXR1cm5bW3QuYm90dG9tbGVmdCwwXSxbMCwwXSxbMCx0LmxlZnRib3R0b21dXX0sUG89ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHRib3R0b21dLFsxLDBdLFt0LmJvdHRvbXJpZ2h0LDBdXX0sTW89ZnVuY3Rpb24odCl7cmV0dXJuW1t0LnRvcHJpZ2h0LDFdLFsxLDFdLFsxLHQucmlnaHR0b3BdXX0sTG89ZnVuY3Rpb24odCl7cmV0dXJuW1swLHQubGVmdHRvcF0sWzAsMV0sW3QudG9wbGVmdCwxXV19LE9vPWZ1bmN0aW9uKHQpe3JldHVybltbdC5ib3R0b21yaWdodCwwXSxbdC5ib3R0b21sZWZ0LDBdLFswLHQubGVmdGJvdHRvbV0sWzAsdC5sZWZ0dG9wXV19LFJvPWZ1bmN0aW9uKHQpe3JldHVybltbdC5ib3R0b21yaWdodCwwXSxbdC5ib3R0b21sZWZ0LDBdLFsxLHQucmlnaHR0b3BdLFsxLHQucmlnaHRib3R0b21dXX0sVG89ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHR0b3BdLFsxLHQucmlnaHRib3R0b21dLFt0LnRvcGxlZnQsMV0sW3QudG9wcmlnaHQsMV1dfSxBbz1mdW5jdGlvbih0KXtyZXR1cm5bWzAsdC5sZWZ0Ym90dG9tXSxbMCx0LmxlZnR0b3BdLFt0LnRvcGxlZnQsMV0sW3QudG9wcmlnaHQsMV1dfSxEbz1bXSxGbz1bXSxrbz1bXSxHbz1bXSxxbz1bXSxCbz1bXSx6bz1bXSxqbz1bXTtHb1sxXT1xb1sxXT0xOCxHb1sxNjldPXFvWzE2OV09MTgsa29bNF09Rm9bNF09MTIsa29bMTY2XT1Gb1sxNjZdPTEyLERvWzE2XT1qb1sxNl09NCxEb1sxNTRdPWpvWzE1NF09NCxCb1s2NF09em9bNjRdPTIyLEJvWzEwNl09em9bMTA2XT0yMixrb1syXT1Cb1syXT0xNyxHb1syXT1xb1syXT0xOCxrb1sxNjhdPUJvWzE2OF09MTcsR29bMTY4XT1xb1sxNjhdPTE4LERvWzhdPUdvWzhdPTksRm9bOF09a29bOF09MTIsRG9bMTYyXT1Hb1sxNjJdPTksRm9bMTYyXT1rb1sxNjJdPTEyLERvWzMyXT1qb1szMl09NCxGb1szMl09em9bMzJdPTEsRG9bMTM4XT1qb1sxMzhdPTQsRm9bMTM4XT16b1sxMzhdPTEscW9bMTI4XT1qb1sxMjhdPTIxLEJvWzEyOF09em9bMTI4XT0yMixxb1s0Ml09am9bNDJdPTIxLEJvWzQyXT16b1s0Ml09MjIsRm9bNV09cW9bNV09MTQsRm9bMTY1XT1xb1sxNjVdPTE0LGtvWzIwXT1qb1syMF09Nixrb1sxNTBdPWpvWzE1MF09NixEb1s4MF09Qm9bODBdPTExLERvWzkwXT1Cb1s5MF09MTEsR29bNjVdPXpvWzY1XT0zLEdvWzEwNV09em9bMTA1XT0zLERvWzE2MF09Qm9bMTYwXT0xMSxGb1sxNjBdPXFvWzE2MF09MTQsRG9bMTBdPUJvWzEwXT0xMSxGb1sxMF09cW9bMTBdPTE0LGtvWzEzMF09am9bMTMwXT02LEdvWzEzMF09em9bMTMwXT0zLGtvWzQwXT1qb1s0MF09NixHb1s0MF09em9bNDBdPTMsRm9bMTAxXT16b1sxMDFdPTEsRm9bNjldPXpvWzY5XT0xLHFvWzE0OV09am9bMTQ5XT0yMSxxb1syMV09am9bMjFdPTIxLGtvWzg2XT1Cb1s4Nl09MTcsa29bODRdPUJvWzg0XT0xNyxEb1s4OV09R29bODldPTksRG9bODFdPUdvWzgxXT05LERvWzk2XT16b1s5Nl09MCxGb1s5Nl09Qm9bOTZdPTE1LERvWzc0XT16b1s3NF09MCxGb1s3NF09Qm9bNzRdPTE1LERvWzI0XT1rb1syNF09OCxHb1syNF09am9bMjRdPTcsRG9bMTQ2XT1rb1sxNDZdPTgsR29bMTQ2XT1qb1sxNDZdPTcsRm9bNl09Qm9bNl09MTUsa29bNl09cW9bNl09MTYsRm9bMTY0XT1Cb1sxNjRdPTE1LGtvWzE2NF09cW9bMTY0XT0xNixHb1sxMjldPWpvWzEyOV09Nyxxb1sxMjldPXpvWzEyOV09MjAsR29bNDFdPWpvWzQxXT03LHFvWzQxXT16b1s0MV09MjAsa29bNjZdPXpvWzY2XT0yLEdvWzY2XT1Cb1s2Nl09MTksa29bMTA0XT16b1sxMDRdPTIsR29bMTA0XT1Cb1sxMDRdPTE5LERvWzE0NF09cW9bMTQ0XT0xMCxCb1sxNDRdPWpvWzE0NF09MjMsRG9bMjZdPXFvWzI2XT0xMCxCb1syNl09am9bMjZdPTIzLEZvWzM2XT1qb1szNl09NSxrb1szNl09em9bMzZdPTIsRm9bMTM0XT1qb1sxMzRdPTUsa29bMTM0XT16b1sxMzRdPTIsRG9bOV09cW9bOV09MTAsRm9bOV09R29bOV09MTMsRG9bMTYxXT1xb1sxNjFdPTEwLEZvWzE2MV09R29bMTYxXT0xMyxGb1szN109am9bMzddPTUscW9bMzddPXpvWzM3XT0yMCxGb1sxMzNdPWpvWzEzM109NSxxb1sxMzNdPXpvWzEzM109MjAsa29bMTQ4XT1xb1sxNDhdPTE2LEJvWzE0OF09am9bMTQ4XT0yMyxrb1syMl09cW9bMjJdPTE2LEJvWzIyXT1qb1syMl09MjMsRG9bODJdPWtvWzgyXT04LEdvWzgyXT1Cb1s4Ml09MTksRG9bODhdPWtvWzg4XT04LEdvWzg4XT1Cb1s4OF09MTksRG9bNzNdPXpvWzczXT0wLEZvWzczXT1Hb1s3M109MTMsRG9bOTddPXpvWzk3XT0wLEZvWzk3XT1Hb1s5N109MTMsRG9bMTQ1XT1Hb1sxNDVdPTkscW9bMTQ1XT1qb1sxNDVdPTIxLERvWzI1XT1Hb1syNV09OSxxb1syNV09am9bMjVdPTIxLEZvWzcwXT16b1s3MF09MSxrb1s3MF09Qm9bNzBdPTE3LEZvWzEwMF09em9bMTAwXT0xLGtvWzEwMF09Qm9bMTAwXT0xNyxEb1szNF09R29bMzRdPTksRm9bMzRdPWtvWzM0XT0xMixxb1szNF09am9bMzRdPTIxLEJvWzM0XT16b1szNF09MjIsRG9bMTM2XT1qb1sxMzZdPTQsRm9bMTM2XT16b1sxMzZdPTEsa29bMTM2XT1Cb1sxMzZdPTE3LEdvWzEzNl09cW9bMTM2XT0xOCxEb1szNV09am9bMzVdPTQsRm9bMzVdPWtvWzM1XT0xMixHb1szNV09cW9bMzVdPTE4LEJvWzM1XT16b1szNV09MjIsRG9bMTUzXT1qb1sxNTNdPTQsR29bMTUzXT1xb1sxNTNdPTE4LEZvWzEwMl09a29bMTAyXT0xMixCb1sxMDJdPXpvWzEwMl09MjIsRG9bMTU1XT1Hb1sxNTVdPTkscW9bMTU1XT1qb1sxNTVdPTIzLEZvWzEwM109em9bMTAzXT0xLGtvWzEwM109Qm9bMTAzXT0xNyxEb1sxNTJdPWpvWzE1Ml09NCxrb1sxNTJdPUJvWzE1Ml09MTcsR29bMTUyXT1xb1sxNTJdPTE4LERvWzE1Nl09a29bMTU2XT04LEdvWzE1Nl09cW9bMTU2XT0xOCxCb1sxNTZdPWpvWzE1Nl09MjMsRG9bMTM3XT1qb1sxMzddPTQsRm9bMTM3XT16b1sxMzddPTEsR29bMTM3XT1xb1sxMzddPTE4LERvWzEzOV09am9bMTM5XT00LEZvWzEzOV09R29bMTM5XT0xMyxxb1sxMzldPXpvWzEzOV09MjAsRG9bOThdPUdvWzk4XT05LEZvWzk4XT1rb1s5OF09MTIsQm9bOThdPXpvWzk4XT0yMixEb1s5OV09em9bOTldPTAsRm9bOTldPWtvWzk5XT0xMixHb1s5OV09Qm9bOTldPTE5LEZvWzM4XT1rb1szOF09MTIscW9bMzhdPWpvWzM4XT0yMSxCb1szOF09em9bMzhdPTIyLEZvWzM5XT1qb1szOV09NSxrb1szOV09cW9bMzldPTE2LEJvWzM5XT16b1szOV09MjI7dmFyIFVvPVtdO2Z1bmN0aW9uIFZvKHQsZSxuKXtyZXR1cm4odC1lKS8obi1lKX1mdW5jdGlvbiBYbyh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci50b1N0cmluZygpLmluZGV4T2YoIkFycmF5Iik+LTF9ZnVuY3Rpb24gWW8odCxlLG4scixpLG8pe2Zvcih2YXIgcz10LmNlbGxzW25dW2VdLGE9cy5jdmFsX3JlYWwsdT1lK3IsbD1uK2ksYz1bXSxoPSExOyFoOyl7aWYodm9pZCAwPT09dC5jZWxsc1tsXXx8dm9pZCAwPT09dC5jZWxsc1tsXVt1XSlpZihsLT1pLHUtPXIsYT0ocz10LmNlbGxzW2xdW3VdKS5jdmFsX3JlYWwsLTE9PT1pKWlmKDA9PT1vKWlmKDEmYSljLnB1c2goW3UsbF0pLHI9LTEsaT0wLG89MDtlbHNle2lmKCEoNCZhKSl7Yy5wdXNoKFt1K3MuYm90dG9tcmlnaHQsbF0pLHI9MCxpPTEsbz0xLGg9ITA7YnJlYWt9Yy5wdXNoKFt1KzEsbF0pLHI9MSxpPTAsbz0wfWVsc2V7aWYoISgxJmEpKXtpZig0JmEpe2MucHVzaChbdStzLmJvdHRvbXJpZ2h0LGxdKSxyPTAsaT0xLG89MSxoPSEwO2JyZWFrfWMucHVzaChbdStzLmJvdHRvbWxlZnQsbF0pLHI9MCxpPTEsbz0wLGg9ITA7YnJlYWt9Yy5wdXNoKFt1LGxdKSxyPS0xLGk9MCxvPTB9ZWxzZSBpZigxPT09aSlpZigwPT09byl7aWYoIShhJmVvKSl7aWYoYSZ0byl7Yy5wdXNoKFt1K3MudG9wbGVmdCxsKzFdKSxyPTAsaT0tMSxvPTAsaD0hMDticmVha31jLnB1c2goW3Urcy50b3ByaWdodCxsKzFdKSxyPTAsaT0tMSxvPTEsaD0hMDticmVha31jLnB1c2goW3UrMSxsKzFdKSxyPTEsaT0wLG89MX1lbHNlIGMucHVzaChbdSsxLGwrMV0pLHI9MSxpPTAsbz0xO2Vsc2UgaWYoLTE9PT1yKWlmKDA9PT1vKXtpZighKGEmdG8pKXtpZigxJmEpe2MucHVzaChbdSxsK3MubGVmdGJvdHRvbV0pLHI9MSxpPTAsbz0wLGg9ITA7YnJlYWt9Yy5wdXNoKFt1LGwrcy5sZWZ0dG9wXSkscj0xLGk9MCxvPTEsaD0hMDticmVha31jLnB1c2goW3UsbCsxXSkscj0wLGk9MSxvPTB9ZWxzZXtpZighKGEmdG8pKXtjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IHd0ZiIpO2JyZWFrfWMucHVzaChbdSxsKzFdKSxyPTAsaT0xLG89MH1lbHNle2lmKDEhPT1yKXtjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IHdlIGNhbWUgZnJvbSBub3doZXJlISIpO2JyZWFrfWlmKDA9PT1vKXtpZighKDQmYSkpe2MucHVzaChbdSsxLGwrcy5yaWdodGJvdHRvbV0pLHI9LTEsaT0wLG89MCxoPSEwO2JyZWFrfWMucHVzaChbdSsxLGxdKSxyPTAsaT0tMSxvPTF9ZWxzZXtpZighKDQmYSkpe2lmKGEmZW8pe2MucHVzaChbdSsxLGwrcy5yaWdodHRvcF0pLHI9LTEsaT0wLG89MTticmVha31jLnB1c2goW3UrMSxsK3MucmlnaHRib3R0b21dKSxyPS0xLGk9MCxvPTAsaD0hMDticmVha31jLnB1c2goW3UrMSxsXSkscj0wLGk9LTEsbz0xfX1lbHNlIGlmKGE9KHM9dC5jZWxsc1tsXVt1XSkuY3ZhbF9yZWFsLC0xPT09cilpZigwPT09bylpZih2b2lkIDAhPT10LmNlbGxzW2wtMV0mJnZvaWQgMCE9PXQuY2VsbHNbbC0xXVt1XSlyPTAsaT0tMSxvPTE7ZWxzZXtpZighKDEmYSkpe2MucHVzaChbdStzLmJvdHRvbXJpZ2h0LGxdKSxyPTAsaT0xLG89MSxoPSEwO2JyZWFrfWMucHVzaChbdSxsXSl9ZWxzZXtpZighKGEmdG8pKXtjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IGZvdW5kIGVudHJ5IGZyb20gdG9wIGF0ICIrdSsiLCIrbCk7YnJlYWt9Y29uc29sZS5sb2coIk1hcmNoaW5nU3F1YXJlc0pTLWlzb0JhbmRzOiBwcm9jZWVkaW5nIGluIHgtZGlyZWN0aW9uISIpfWVsc2UgaWYoMT09PXIpe2lmKDA9PT1vKXtjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IHd0ZiIpO2JyZWFrfWlmKHZvaWQgMCE9PXQuY2VsbHNbbCsxXSYmdm9pZCAwIT09dC5jZWxsc1tsKzFdW3VdKXI9MCxpPTEsbz0wO2Vsc2V7aWYoIShhJmVvKSl7Yy5wdXNoKFt1K3MudG9wbGVmdCxsKzFdKSxyPTAsaT0tMSxvPTAsaD0hMDticmVha31jLnB1c2goW3UrMSxsKzFdKSxyPTEsaT0wLG89MX19ZWxzZSBpZigtMT09PWkpe2lmKDEhPT1vKXtjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IHd0ZiIpO2JyZWFrfWlmKHZvaWQgMCE9PXQuY2VsbHNbbF1bdSsxXSlyPTEsaT0wLG89MTtlbHNle2lmKCEoNCZhKSl7Yy5wdXNoKFt1KzEsbCtzLnJpZ2h0dG9wXSkscj0tMSxpPTAsbz0xLGg9ITA7YnJlYWt9Yy5wdXNoKFt1KzEsbF0pLHI9MCxpPS0xLG89MX19ZWxzZXtpZigxIT09aSl7Y29uc29sZS5sb2coIk1hcmNoaW5nU3F1YXJlc0pTLWlzb0JhbmRzOiB3aGVyZSBkaWQgd2UgY2FtZSBmcm9tPz8/Iik7YnJlYWt9aWYoMCE9PW8pe2NvbnNvbGUubG9nKCJNYXJjaGluZ1NxdWFyZXNKUy1pc29CYW5kczogd3RmIik7YnJlYWt9aWYodm9pZCAwIT09dC5jZWxsc1tsXVt1LTFdKXI9LTEsaT0wLG89MDtlbHNle2lmKCEoYSZ0bykpe2MucHVzaChbdSxsK3MubGVmdGJvdHRvbV0pLHI9MSxpPTAsbz0wLGg9ITA7YnJlYWt9Yy5wdXNoKFt1LGwrMV0pLHI9MCxpPTEsbz0wfX1pZihsKz1pLCh1Kz1yKT09PWUmJmw9PT1uKWJyZWFrfXJldHVybntwYXRoOmMsaTp1LGo6bCx4OnIseTppLG86b319ZnVuY3Rpb24gSG8odCl7aWYodC5lZGdlcy5sZW5ndGg+MCl7dmFyIGU9dC5lZGdlc1t0LmVkZ2VzLmxlbmd0aC0xXSxuPXQuY3ZhbF9yZWFsO3N3aXRjaChlKXtjYXNlIDA6cmV0dXJuIG4mZW8/e3A6WzEsdC5yaWdodHRvcF0seDotMSx5OjAsbzoxfTp7cDpbdC50b3BsZWZ0LDFdLHg6MCx5Oi0xLG86MH07Y2FzZSAxOnJldHVybiA0Jm4/e3A6W3QudG9wbGVmdCwxXSx4OjAseTotMSxvOjB9OntwOlsxLHQucmlnaHRib3R0b21dLHg6LTEseTowLG86MH07Y2FzZSAyOnJldHVybiA0Jm4/e3A6W3QuYm90dG9tcmlnaHQsMF0seDowLHk6MSxvOjF9OntwOlt0LnRvcGxlZnQsMV0seDowLHk6LTEsbzowfTtjYXNlIDM6cmV0dXJuIDEmbj97cDpbdC50b3BsZWZ0LDFdLHg6MCx5Oi0xLG86MH06e3A6W3QuYm90dG9tbGVmdCwwXSx4OjAseToxLG86MH07Y2FzZSA0OnJldHVybiBuJmVvP3twOlsxLHQucmlnaHR0b3BdLHg6LTEseTowLG86MX06e3A6W3QudG9wcmlnaHQsMV0seDowLHk6LTEsbzoxfTtjYXNlIDU6cmV0dXJuIDQmbj97cDpbdC50b3ByaWdodCwxXSx4OjAseTotMSxvOjF9OntwOlsxLHQucmlnaHRib3R0b21dLHg6LTEseTowLG86MH07Y2FzZSA2OnJldHVybiA0Jm4/e3A6W3QuYm90dG9tcmlnaHQsMF0seDowLHk6MSxvOjF9OntwOlt0LnRvcHJpZ2h0LDFdLHg6MCx5Oi0xLG86MX07Y2FzZSA3OnJldHVybiAxJm4/e3A6W3QudG9wcmlnaHQsMV0seDowLHk6LTEsbzoxfTp7cDpbdC5ib3R0b21sZWZ0LDBdLHg6MCx5OjEsbzowfTtjYXNlIDg6cmV0dXJuIDQmbj97cDpbdC5ib3R0b21yaWdodCwwXSx4OjAseToxLG86MX06e3A6WzEsdC5yaWdodHRvcF0seDotMSx5OjAsbzoxfTtjYXNlIDk6cmV0dXJuIDEmbj97cDpbMSx0LnJpZ2h0dG9wXSx4Oi0xLHk6MCxvOjF9OntwOlt0LmJvdHRvbWxlZnQsMF0seDowLHk6MSxvOjB9O2Nhc2UgMTA6cmV0dXJuIDEmbj97cDpbMCx0LmxlZnRib3R0b21dLHg6MSx5OjAsbzowfTp7cDpbMSx0LnJpZ2h0dG9wXSx4Oi0xLHk6MCxvOjF9O2Nhc2UgMTE6cmV0dXJuIG4mdG8/e3A6WzEsdC5yaWdodHRvcF0seDotMSx5OjAsbzoxfTp7cDpbMCx0LmxlZnR0b3BdLHg6MSx5OjAsbzoxfTtjYXNlIDEyOnJldHVybiA0Jm4/e3A6W3QuYm90dG9tcmlnaHQsMF0seDowLHk6MSxvOjF9OntwOlsxLHQucmlnaHRib3R0b21dLHg6LTEseTowLG86MH07Y2FzZSAxMzpyZXR1cm4gMSZuP3twOlsxLHQucmlnaHRib3R0b21dLHg6LTEseTowLG86MH06e3A6W3QuYm90dG9tbGVmdCwwXSx4OjAseToxLG86MH07Y2FzZSAxNDpyZXR1cm4gMSZuP3twOlswLHQubGVmdGJvdHRvbV0seDoxLHk6MCxvOjB9OntwOlsxLHQucmlnaHRib3R0b21dLHg6LTEseTowLG86MH07Y2FzZSAxNTpyZXR1cm4gbiZ0bz97cDpbMSx0LnJpZ2h0Ym90dG9tXSx4Oi0xLHk6MCxvOjB9OntwOlswLHQubGVmdHRvcF0seDoxLHk6MCxvOjF9O2Nhc2UgMTY6cmV0dXJuIDQmbj97cDpbdC5ib3R0b21yaWdodCwwXSx4OjAseToxLG86MX06e3A6WzAsdC5sZWZ0Ym90dG9tXSx4OjEseTowLG86MH07Y2FzZSAxNzpyZXR1cm4gbiZ0bz97cDpbdC5ib3R0b21yaWdodCwwXSx4OjAseToxLG86MX06e3A6WzAsdC5sZWZ0dG9wXSx4OjEseTowLG86MX07Y2FzZSAxODpyZXR1cm4gMSZuP3twOlswLHQubGVmdGJvdHRvbV0seDoxLHk6MCxvOjB9OntwOlt0LmJvdHRvbWxlZnQsMF0seDowLHk6MSxvOjB9O2Nhc2UgMTk6cmV0dXJuIG4mdG8/e3A6W3QuYm90dG9tbGVmdCwwXSx4OjAseToxLG86MH06e3A6WzAsdC5sZWZ0dG9wXSx4OjEseTowLG86MX07Y2FzZSAyMDpyZXR1cm4gbiZ0bz97cDpbdC50b3BsZWZ0LDFdLHg6MCx5Oi0xLG86MH06e3A6WzAsdC5sZWZ0Ym90dG9tXSx4OjEseTowLG86MH07Y2FzZSAyMTpyZXR1cm4gbiZlbz97cDpbMCx0LmxlZnRib3R0b21dLHg6MSx5OjAsbzowfTp7cDpbdC50b3ByaWdodCwxXSx4OjAseTotMSxvOjF9O2Nhc2UgMjI6cmV0dXJuIG4mdG8/e3A6W3QudG9wbGVmdCwxXSx4OjAseTotMSxvOjB9OntwOlswLHQubGVmdHRvcF0seDoxLHk6MCxvOjF9O2Nhc2UgMjM6cmV0dXJuIG4mZW8/e3A6WzAsdC5sZWZ0dG9wXSx4OjEseTowLG86MX06e3A6W3QudG9wcmlnaHQsMV0seDowLHk6LTEsbzoxfTtkZWZhdWx0OmNvbnNvbGUubG9nKCJNYXJjaGluZ1NxdWFyZXNKUy1pc29CYW5kczogZWRnZSBpbmRleCBvdXQgb2YgcmFuZ2UhIiksY29uc29sZS5sb2codCl9fXJldHVybiBudWxsfWZ1bmN0aW9uIFdvKHQsZSxuLHIpe3ZhciBpLG8scyxhLHUsbD10LmN2YWw7c3dpdGNoKGUpe2Nhc2UtMTpzd2l0Y2gocil7Y2FzZSAwOmk9Rm9bbF0scz1ob1tsXSxhPXBvW2xdLHU9Zm9bbF07YnJlYWs7ZGVmYXVsdDppPURvW2xdLHM9dW9bbF0sYT1sb1tsXSx1PWNvW2xdfWJyZWFrO2Nhc2UgMTpzd2l0Y2gocil7Y2FzZSAwOmk9cW9bbF0scz1Jb1tsXSxhPU5vW2xdLHU9U29bbF07YnJlYWs7ZGVmYXVsdDppPUJvW2xdLHM9RW9bbF0sYT1ib1tsXSx1PXdvW2xdfWJyZWFrO2RlZmF1bHQ6c3dpdGNoKG4pe2Nhc2UtMTpzd2l0Y2gocil7Y2FzZSAwOmk9em9bbF0scz1ub1tsXSxhPXJvW2xdLHU9aW9bbF07YnJlYWs7ZGVmYXVsdDppPWpvW2xdLHM9b29bbF0sYT1zb1tsXSx1PWFvW2xdfWJyZWFrO2Nhc2UgMTpzd2l0Y2gocil7Y2FzZSAwOmk9R29bbF0scz1nb1tsXSxhPXlvW2xdLHU9dm9bbF07YnJlYWs7ZGVmYXVsdDppPWtvW2xdLHM9X29bbF0sYT1tb1tsXSx1PXhvW2xdfX19aWYobz10LmVkZ2VzLmluZGV4T2YoaSksdm9pZCAwPT09dC5lZGdlc1tvXSlyZXR1cm4gbnVsbDtzd2l0Y2goZnVuY3Rpb24odCxlKXtkZWxldGUgdC5lZGdlc1tlXTtmb3IodmFyIG49ZSsxO248dC5lZGdlcy5sZW5ndGg7bisrKXQuZWRnZXNbbi0xXT10LmVkZ2VzW25dO3QuZWRnZXMucG9wKCl9KHQsbyksbD10LmN2YWxfcmVhbCxpKXtjYXNlIDA6bCZlbz8oZT10LnRvcGxlZnQsbj0xKTooZT0xLG49dC5yaWdodHRvcCk7YnJlYWs7Y2FzZSAxOjQmbD8oZT0xLG49dC5yaWdodGJvdHRvbSk6KGU9dC50b3BsZWZ0LG49MSk7YnJlYWs7Y2FzZSAyOjQmbD8oZT10LnRvcGxlZnQsbj0xKTooZT10LmJvdHRvbXJpZ2h0LG49MCk7YnJlYWs7Y2FzZSAzOjEmbD8oZT10LmJvdHRvbWxlZnQsbj0wKTooZT10LnRvcGxlZnQsbj0xKTticmVhaztjYXNlIDQ6bCZlbz8oZT10LnRvcHJpZ2h0LG49MSk6KGU9MSxuPXQucmlnaHR0b3ApO2JyZWFrO2Nhc2UgNTo0Jmw/KGU9MSxuPXQucmlnaHRib3R0b20pOihlPXQudG9wcmlnaHQsbj0xKTticmVhaztjYXNlIDY6NCZsPyhlPXQudG9wcmlnaHQsbj0xKTooZT10LmJvdHRvbXJpZ2h0LG49MCk7YnJlYWs7Y2FzZSA3OjEmbD8oZT10LmJvdHRvbWxlZnQsbj0wKTooZT10LnRvcHJpZ2h0LG49MSk7YnJlYWs7Y2FzZSA4OjQmbD8oZT0xLG49dC5yaWdodHRvcCk6KGU9dC5ib3R0b21yaWdodCxuPTApO2JyZWFrO2Nhc2UgOToxJmw/KGU9dC5ib3R0b21sZWZ0LG49MCk6KGU9MSxuPXQucmlnaHR0b3ApO2JyZWFrO2Nhc2UgMTA6MSZsPyhlPTEsbj10LnJpZ2h0dG9wKTooZT0wLG49dC5sZWZ0Ym90dG9tKTticmVhaztjYXNlIDExOmwmdG8/KGU9MCxuPXQubGVmdHRvcCk6KGU9MSxuPXQucmlnaHR0b3ApO2JyZWFrO2Nhc2UgMTI6NCZsPyhlPTEsbj10LnJpZ2h0Ym90dG9tKTooZT10LmJvdHRvbXJpZ2h0LG49MCk7YnJlYWs7Y2FzZSAxMzoxJmw/KGU9dC5ib3R0b21sZWZ0LG49MCk6KGU9MSxuPXQucmlnaHRib3R0b20pO2JyZWFrO2Nhc2UgMTQ6MSZsPyhlPTEsbj10LnJpZ2h0Ym90dG9tKTooZT0wLG49dC5sZWZ0Ym90dG9tKTticmVhaztjYXNlIDE1OmwmdG8/KGU9MCxuPXQubGVmdHRvcCk6KGU9MSxuPXQucmlnaHRib3R0b20pO2JyZWFrO2Nhc2UgMTY6NCZsPyhlPTAsbj10LmxlZnRib3R0b20pOihlPXQuYm90dG9tcmlnaHQsbj0wKTticmVhaztjYXNlIDE3OmwmdG8/KGU9MCxuPXQubGVmdHRvcCk6KGU9dC5ib3R0b21yaWdodCxuPTApO2JyZWFrO2Nhc2UgMTg6MSZsPyhlPXQuYm90dG9tbGVmdCxuPTApOihlPTAsbj10LmxlZnRib3R0b20pO2JyZWFrO2Nhc2UgMTk6bCZ0bz8oZT0wLG49dC5sZWZ0dG9wKTooZT10LmJvdHRvbWxlZnQsbj0wKTticmVhaztjYXNlIDIwOmwmdG8/KGU9MCxuPXQubGVmdGJvdHRvbSk6KGU9dC50b3BsZWZ0LG49MSk7YnJlYWs7Y2FzZSAyMTpsJmVvPyhlPXQudG9wcmlnaHQsbj0xKTooZT0wLG49dC5sZWZ0Ym90dG9tKTticmVhaztjYXNlIDIyOmwmdG8/KGU9MCxuPXQubGVmdHRvcCk6KGU9dC50b3BsZWZ0LG49MSk7YnJlYWs7Y2FzZSAyMzpsJmVvPyhlPXQudG9wcmlnaHQsbj0xKTooZT0wLG49dC5sZWZ0dG9wKTticmVhaztkZWZhdWx0OnJldHVybiBjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IGVkZ2UgaW5kZXggb3V0IG9mIHJhbmdlISIpLGNvbnNvbGUubG9nKHQpLG51bGx9cmV0dXJuIHZvaWQgMCE9PWUmJnZvaWQgMCE9PW4mJnZvaWQgMCE9PXMmJnZvaWQgMCE9PWEmJnZvaWQgMCE9PXV8fChjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IHVuZGVmaW5lZCB2YWx1ZSEiKSxjb25zb2xlLmxvZyh0KSxjb25zb2xlLmxvZyhlKyIgIituKyIgIitzKyIgIithKyIgIit1KSkse3A6W2Usbl0seDpzLHk6YSxvOnV9fWZ1bmN0aW9uIEpvKHQpe3ZhciBlPVtdLG49W107dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgcj1qcihsKFt0XSkpO24ucHVzaChyKSxlLnB1c2goe3Jpbmc6dCxhcmVhOnJ9KX0pKSxuLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKTt2YXIgcj1bXTtyZXR1cm4gbi5mb3JFYWNoKChmdW5jdGlvbih0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihlW25dLmFyZWE9PT10KXtyLnB1c2goZVtuXS5yaW5nKSxlLnNwbGljZShuLDEpO2JyZWFrfX0pKSxyfWZ1bmN0aW9uIFpvKHQpe2Zvcih2YXIgZT10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue2xyQ29vcmRpbmF0ZXM6dCxncm91cGVkOiExfX0pKSxuPVtdOyFRbyhlKTspZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoIWVbcl0uZ3JvdXBlZCl7dmFyIGk9W107aS5wdXNoKGVbcl0ubHJDb29yZGluYXRlcyksZVtyXS5ncm91cGVkPSEwO2Zvcih2YXIgbz1sKFtlW3JdLmxyQ29vcmRpbmF0ZXNdKSxzPXIrMTtzPGUubGVuZ3RoO3MrKyl7aWYoIWVbc10uZ3JvdXBlZClLbyhsKFtlW3NdLmxyQ29vcmRpbmF0ZXNdKSxvKSYmKGkucHVzaChlW3NdLmxyQ29vcmRpbmF0ZXMpLGVbc10uZ3JvdXBlZD0hMCl9bi5wdXNoKGkpfXJldHVybiBufWZ1bmN0aW9uIEtvKHQsZSl7Zm9yKHZhciBuPWJuKHQpLHI9MDtyPG4uZmVhdHVyZXMubGVuZ3RoO3IrKylpZigheWUobi5mZWF0dXJlc1tyXSxlKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBRbyh0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZighMT09PXRbZV0uZ3JvdXBlZClyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiAkbyh0LGUsbil7aWYoIVAobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLnBpdm90LGk9bi5tdXRhdGU7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7aWYobnVsbD09ZXx8aXNOYU4oZSkpdGhyb3cgbmV3IEVycm9yKCJhbmdsZSBpcyByZXF1aXJlZCIpO3JldHVybiAwPT09ZXx8KHJ8fChyPUVuKHQpKSwhMSE9PWkmJnZvaWQgMCE9PWl8fCh0PUllKHQpKSxSKHQsKGZ1bmN0aW9uKHQpe3ZhciBuPUJpKHIsdCkrZSxpPUFyKHIsdCksbz1RKGppKHIsaSxuKSk7dFswXT1vWzBdLHRbMV09b1sxXX0pKSksdH1mdW5jdGlvbiB0cyh0LGUsbil7aWYoIVAobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLm9yaWdpbixpPW4ubXV0YXRlO2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiByZXF1aXJlZCIpO2lmKCJudW1iZXIiIT10eXBlb2YgZXx8MD09PWUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZhY3RvciIpO3ZhciBvPUFycmF5LmlzQXJyYXkocil8fCJvYmplY3QiPT10eXBlb2YgcjtyZXR1cm4hMCE9PWkmJih0PUllKHQpKSwiRmVhdHVyZUNvbGxlY3Rpb24iIT09dC50eXBlfHxvP2VzKHQsZSxyKTooRih0LChmdW5jdGlvbihuLGkpe3QuZmVhdHVyZXNbaV09ZXMobixlLHIpfSkpLHQpfWZ1bmN0aW9uIGVzKHQsZSxuKXt2YXIgcj0iUG9pbnQiPT09aXQodCk7cmV0dXJuIG49ZnVuY3Rpb24odCxlKXtudWxsPT1lJiYoZT0iY2VudHJvaWQiKTtpZihBcnJheS5pc0FycmF5KGUpfHwib2JqZWN0Ij09dHlwZW9mIGUpcmV0dXJuIEsoZSk7dmFyIG49dC5iYm94P3QuYmJveDpaKHQpLHI9blswXSxpPW5bMV0sbz1uWzJdLHM9blszXTtzd2l0Y2goZSl7Y2FzZSJzdyI6Y2FzZSJzb3V0aHdlc3QiOmNhc2Uid2VzdHNvdXRoIjpjYXNlImJvdHRvbWxlZnQiOnJldHVybiBhKFtyLGldKTtjYXNlInNlIjpjYXNlInNvdXRoZWFzdCI6Y2FzZSJlYXN0c291dGgiOmNhc2UiYm90dG9tcmlnaHQiOnJldHVybiBhKFtvLGldKTtjYXNlIm53IjpjYXNlIm5vcnRod2VzdCI6Y2FzZSJ3ZXN0bm9ydGgiOmNhc2UidG9wbGVmdCI6cmV0dXJuIGEoW3Isc10pO2Nhc2UibmUiOmNhc2Uibm9ydGhlYXN0IjpjYXNlImVhc3Rub3J0aCI6Y2FzZSJ0b3ByaWdodCI6cmV0dXJuIGEoW28sc10pO2Nhc2UiY2VudGVyIjpyZXR1cm4geG4odCk7Y2FzZSB2b2lkIDA6Y2FzZSBudWxsOmNhc2UiY2VudHJvaWQiOnJldHVybiBFbih0KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW52YWxpZCBvcmlnaW4iKX19KHQsbiksMT09PWV8fHJ8fFIodCwoZnVuY3Rpb24odCl7dmFyIHI9QXIobix0KSxpPUJpKG4sdCksbz1RKGppKG4sciplLGkpKTt0WzBdPW9bMF0sdFsxXT1vWzFdLDM9PT10Lmxlbmd0aCYmKHRbMl0qPWUpfSkpLHR9ZnVuY3Rpb24gbnModCl7dmFyIGU9dFswXSxuPXRbMV07cmV0dXJuW25bMF0tZVswXSxuWzFdLWVbMV1dfWZ1bmN0aW9uIHJzKHQsZSl7cmV0dXJuIHRbMF0qZVsxXS1lWzBdKnRbMV19ZnVuY3Rpb24gaXModCxlKXtyZXR1cm4hZnVuY3Rpb24odCxlKXtyZXR1cm4gMD09PXJzKG5zKHQpLG5zKGUpKX0odCxlKSYmZnVuY3Rpb24odCxlKXt2YXIgbixyLGk9dFswXSxvPW5zKHQpLHM9ZVswXSxhPW5zKGUpLHU9cnMobyxhKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm5bdFswXStlWzBdLHRbMV0rZVsxXV19KGksZnVuY3Rpb24odCxlKXtyZXR1cm5bdCplWzBdLHQqZVsxXV19KHJzKChyPWksWyhuPXMpWzBdLXJbMF0sblsxXS1yWzFdXSksYSkvdSxvKSl9KHQsZSl9ZnVuY3Rpb24gb3ModCxlLG4pe3ZhciByPVtdLGk9RShlLG4pLG89USh0KSxzPVtdO3JldHVybiBvLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7aWYoZSE9PW8ubGVuZ3RoLTEpe3ZhciBuPShsPXQsYz1vW2UrMV0saD1pLHA9TWF0aC5zcXJ0KChsWzBdLWNbMF0pKihsWzBdLWNbMF0pKyhsWzFdLWNbMV0pKihsWzFdLWNbMV0pKSxmPWxbMF0raCooY1sxXS1sWzFdKS9wLGc9Y1swXStoKihjWzFdLWxbMV0pL3AsZD1sWzFdK2gqKGxbMF0tY1swXSkvcCx5PWNbMV0raCoobFswXS1jWzBdKS9wLFtbZixkXSxbZyx5XV0pO2lmKHIucHVzaChuKSxlPjApe3ZhciBhPXJbZS0xXSx1PWlzKG4sYSk7ITEhPT11JiYoYVsxXT11LG5bMF09dSkscy5wdXNoKGFbMF0pLGU9PT1vLmxlbmd0aC0yJiYocy5wdXNoKG5bMF0pLHMucHVzaChuWzFdKSl9Mj09PW8ubGVuZ3RoJiYocy5wdXNoKG5bMF0pLHMucHVzaChuWzFdKSl9dmFyIGwsYyxoLHAsZixnLGQseX0pKSxoKHMsdC5wcm9wZXJ0aWVzKX1mdW5jdGlvbiBzcyh0LGUsbil7dmFyIHI9ZVswXS10WzBdLGk9ZVsxXS10WzFdLG89blswXS1lWzBdO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4odD4wKS0odDwwKXx8K3R9KHIqKG5bMV0tZVsxXSktbyppKX1mdW5jdGlvbiBhcyh0LGUpe3JldHVybiBlLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4geWUoYShlKSx0KX0pKX1Vb1sxXT1Vb1sxNjldPUNvLFVvWzRdPVVvWzE2Nl09UG8sVW9bMTZdPVVvWzE1NF09TW8sVW9bNjRdPVVvWzEwNl09TG8sVW9bMTY4XT1Vb1syXT1PbyxVb1sxNjJdPVVvWzhdPVJvLFVvWzEzOF09VW9bMzJdPVRvLFVvWzQyXT1Vb1sxMjhdPUFvLFVvWzVdPVVvWzE2NV09ZnVuY3Rpb24odCl7cmV0dXJuW1swLDBdLFswLHQubGVmdGJvdHRvbV0sWzEsdC5yaWdodGJvdHRvbV0sWzEsMF1dfSxVb1syMF09VW9bMTUwXT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsMF0sW3QuYm90dG9tcmlnaHQsMF0sW3QudG9wcmlnaHQsMV0sWzEsMV1dfSxVb1s4MF09VW9bOTBdPWZ1bmN0aW9uKHQpe3JldHVybltbMSwxXSxbMSx0LnJpZ2h0dG9wXSxbMCx0LmxlZnR0b3BdLFswLDFdXX0sVW9bNjVdPVVvWzEwNV09ZnVuY3Rpb24odCl7cmV0dXJuW1t0LmJvdHRvbWxlZnQsMF0sWzAsMF0sWzAsMV0sW3QudG9wbGVmdCwxXV19LFVvWzE2MF09VW9bMTBdPWZ1bmN0aW9uKHQpe3JldHVybltbMSx0LnJpZ2h0dG9wXSxbMSx0LnJpZ2h0Ym90dG9tXSxbMCx0LmxlZnRib3R0b21dLFswLHQubGVmdHRvcF1dfSxVb1sxMzBdPVVvWzQwXT1mdW5jdGlvbih0KXtyZXR1cm5bW3QudG9wbGVmdCwxXSxbdC50b3ByaWdodCwxXSxbdC5ib3R0b21yaWdodCwwXSxbdC5ib3R0b21sZWZ0LDBdXX0sVW9bODVdPWZ1bmN0aW9uKCl7cmV0dXJuW1swLDBdLFswLDFdLFsxLDFdLFsxLDBdXX0sVW9bMTAxXT1Vb1s2OV09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHRib3R0b21dLFsxLDBdLFswLDBdLFswLDFdLFt0LnRvcGxlZnQsMV1dfSxVb1sxNDldPVVvWzIxXT1mdW5jdGlvbih0KXtyZXR1cm5bW3QudG9wcmlnaHQsMV0sWzEsMV0sWzEsMF0sWzAsMF0sWzAsdC5sZWZ0Ym90dG9tXV19LFVvWzg2XT1Vb1s4NF09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLDBdLFt0LmJvdHRvbXJpZ2h0LDBdLFswLHQubGVmdHRvcF0sWzAsMV0sWzEsMV1dfSxVb1s4OV09VW9bODFdPWZ1bmN0aW9uKHQpe3JldHVybltbMSwxXSxbMSx0LnJpZ2h0dG9wXSxbdC5ib3R0b21sZWZ0LDBdLFswLDBdLFswLDFdXX0sVW9bOTZdPVVvWzc0XT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsdC5yaWdodHRvcF0sWzEsdC5yaWdodGJvdHRvbV0sWzAsdC5sZWZ0dG9wXSxbMCwxXSxbdC50b3BsZWZ0LDFdXX0sVW9bMjRdPVVvWzE0Nl09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLDFdLFsxLHQucmlnaHR0b3BdLFt0LmJvdHRvbXJpZ2h0LDBdLFt0LmJvdHRvbWxlZnQsMF0sW3QudG9wcmlnaHQsMV1dfSxVb1s2XT1Vb1sxNjRdPWZ1bmN0aW9uKHQpe3JldHVybltbMSx0LnJpZ2h0Ym90dG9tXSxbMSwwXSxbdC5ib3R0b21yaWdodCwwXSxbMCx0LmxlZnRib3R0b21dLFswLHQubGVmdHRvcF1dfSxVb1sxMjldPVVvWzQxXT1mdW5jdGlvbih0KXtyZXR1cm5bW3QudG9wcmlnaHQsMV0sW3QuYm90dG9tbGVmdCwwXSxbMCwwXSxbMCx0LmxlZnRib3R0b21dLFt0LnRvcGxlZnQsMV1dfSxVb1s2Nl09VW9bMTA0XT1mdW5jdGlvbih0KXtyZXR1cm5bW3QuYm90dG9tcmlnaHQsMF0sW3QuYm90dG9tbGVmdCwwXSxbMCx0LmxlZnR0b3BdLFswLDFdLFt0LnRvcGxlZnQsMV1dfSxVb1sxNDRdPVVvWzI2XT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsMV0sWzEsdC5yaWdodHRvcF0sWzAsdC5sZWZ0Ym90dG9tXSxbMCx0LmxlZnR0b3BdLFt0LnRvcHJpZ2h0LDFdXX0sVW9bMzZdPVVvWzEzNF09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHRib3R0b21dLFsxLDBdLFt0LmJvdHRvbXJpZ2h0LDBdLFt0LnRvcGxlZnQsMV0sW3QudG9wcmlnaHQsMV1dfSxVb1s5XT1Vb1sxNjFdPWZ1bmN0aW9uKHQpe3JldHVybltbMSx0LnJpZ2h0dG9wXSxbMSx0LnJpZ2h0Ym90dG9tXSxbdC5ib3R0b21sZWZ0LDBdLFswLDBdLFswLHQubGVmdGJvdHRvbV1dfSxVb1szN109VW9bMTMzXT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsdC5yaWdodGJvdHRvbV0sWzEsMF0sWzAsMF0sWzAsdC5sZWZ0Ym90dG9tXSxbdC50b3BsZWZ0LDFdLFt0LnRvcHJpZ2h0LDFdXX0sVW9bMTQ4XT1Vb1syMl09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLDFdLFsxLDBdLFt0LmJvdHRvbXJpZ2h0LDBdLFswLHQubGVmdGJvdHRvbV0sWzAsdC5sZWZ0dG9wXSxbdC50b3ByaWdodCwxXV19LFVvWzgyXT1Vb1s4OF09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLDFdLFsxLHQucmlnaHR0b3BdLFt0LmJvdHRvbXJpZ2h0LDBdLFt0LmJvdHRvbWxlZnQsMF0sWzAsdC5sZWZ0dG9wXSxbMCwxXV19LFVvWzczXT1Vb1s5N109ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHR0b3BdLFsxLHQucmlnaHRib3R0b21dLFt0LmJvdHRvbWxlZnQsMF0sWzAsMF0sWzAsMV0sW3QudG9wbGVmdCwxXV19LFVvWzE0NV09VW9bMjVdPWZ1bmN0aW9uKHQpe3JldHVybltbMSwxXSxbMSx0LnJpZ2h0dG9wXSxbdC5ib3R0b21sZWZ0LDBdLFswLDBdLFswLHQubGVmdGJvdHRvbV0sW3QudG9wcmlnaHQsMV1dfSxVb1s3MF09VW9bMTAwXT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsdC5yaWdodGJvdHRvbV0sWzEsMF0sW3QuYm90dG9tcmlnaHQsMF0sWzAsdC5sZWZ0dG9wXSxbMCwxXSxbdC50b3BsZWZ0LDFdXX0sVW9bMzRdPWZ1bmN0aW9uKHQpe3JldHVybltBbyh0KSxSbyh0KV19LFVvWzM1XT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsdC5yaWdodHRvcF0sWzEsdC5yaWdodGJvdHRvbV0sW3QuYm90dG9tcmlnaHQsMF0sW3QuYm90dG9tbGVmdCwwXSxbMCx0LmxlZnRib3R0b21dLFswLHQubGVmdHRvcF0sW3QudG9wbGVmdCwxXSxbdC50b3ByaWdodCwxXV19LFVvWzEzNl09ZnVuY3Rpb24odCl7cmV0dXJuW1RvKHQpLE9vKHQpXX0sVW9bMTUzXT1mdW5jdGlvbih0KXtyZXR1cm5bTW8odCksQ28odCldfSxVb1sxMDJdPWZ1bmN0aW9uKHQpe3JldHVybltQbyh0KSxMbyh0KV19LFVvWzE1NV09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLDFdLFsxLHQucmlnaHR0b3BdLFt0LmJvdHRvbWxlZnQsMF0sWzAsMF0sWzAsdC5sZWZ0Ym90dG9tXSxbdC50b3ByaWdodCwxXV19LFVvWzEwM109ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHRib3R0b21dLFsxLDBdLFt0LmJvdHRvbXJpZ2h0LDBdLFswLHQubGVmdHRvcF0sWzAsMV0sW3QudG9wbGVmdCwxXV19LFVvWzE1Ml09ZnVuY3Rpb24odCl7cmV0dXJuW01vKHQpLE9vKHQpXX0sVW9bMTU2XT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsMV0sWzEsdC5yaWdodHRvcF0sW3QuYm90dG9tcmlnaHQsMF0sW3QuYm90dG9tbGVmdCwwXSxbMCx0LmxlZnRib3R0b21dLFswLHQubGVmdHRvcF0sW3QudG9wcmlnaHQsMV1dfSxVb1sxMzddPWZ1bmN0aW9uKHQpe3JldHVybltUbyh0KSxDbyh0KV19LFVvWzEzOV09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHR0b3BdLFsxLHQucmlnaHRib3R0b21dLFt0LmJvdHRvbWxlZnQsMF0sWzAsMF0sWzAsdC5sZWZ0Ym90dG9tXSxbdC50b3BsZWZ0LDFdLFt0LnRvcHJpZ2h0LDFdXX0sVW9bOThdPWZ1bmN0aW9uKHQpe3JldHVybltSbyh0KSxMbyh0KV19LFVvWzk5XT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsdC5yaWdodHRvcF0sWzEsdC5yaWdodGJvdHRvbV0sW3QuYm90dG9tcmlnaHQsMF0sW3QuYm90dG9tbGVmdCwwXSxbMCx0LmxlZnR0b3BdLFswLDFdLFt0LnRvcGxlZnQsMV1dfSxVb1szOF09ZnVuY3Rpb24odCl7cmV0dXJuW1BvKHQpLEFvKHQpXX0sVW9bMzldPWZ1bmN0aW9uKHQpe3JldHVybltbMSx0LnJpZ2h0Ym90dG9tXSxbMSwwXSxbdC5ib3R0b21yaWdodCwwXSxbMCx0LmxlZnRib3R0b21dLFswLHQubGVmdHRvcF0sW3QudG9wbGVmdCwxXSxbdC50b3ByaWdodCwxXV19O3ZhciB1cz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dGhpcy5pZD10LmJ1aWxkSWQoZSksdGhpcy5jb29yZGluYXRlcz1lLHRoaXMuaW5uZXJFZGdlcz1bXSx0aGlzLm91dGVyRWRnZXM9W10sdGhpcy5vdXRlckVkZ2VzU29ydGVkPSExfXJldHVybiB0LmJ1aWxkSWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuam9pbigiLCIpfSx0LnByb3RvdHlwZS5yZW1vdmVJbm5lckVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5pbm5lckVkZ2VzPXRoaXMuaW5uZXJFZGdlcy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmZyb20uaWQhPT10LmZyb20uaWR9KSl9LHQucHJvdG90eXBlLnJlbW92ZU91dGVyRWRnZT1mdW5jdGlvbih0KXt0aGlzLm91dGVyRWRnZXM9dGhpcy5vdXRlckVkZ2VzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG8uaWQhPT10LnRvLmlkfSkpfSx0LnByb3RvdHlwZS5hZGRPdXRlckVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5vdXRlckVkZ2VzLnB1c2godCksdGhpcy5vdXRlckVkZ2VzU29ydGVkPSExfSx0LnByb3RvdHlwZS5zb3J0T3V0ZXJFZGdlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5vdXRlckVkZ2VzU29ydGVkfHwodGhpcy5vdXRlckVkZ2VzLnNvcnQoKGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS50byxpPW4udG87aWYoci5jb29yZGluYXRlc1swXS10LmNvb3JkaW5hdGVzWzBdPj0wJiZpLmNvb3JkaW5hdGVzWzBdLXQuY29vcmRpbmF0ZXNbMF08MClyZXR1cm4gMTtpZihyLmNvb3JkaW5hdGVzWzBdLXQuY29vcmRpbmF0ZXNbMF08MCYmaS5jb29yZGluYXRlc1swXS10LmNvb3JkaW5hdGVzWzBdPj0wKXJldHVybi0xO2lmKHIuY29vcmRpbmF0ZXNbMF0tdC5jb29yZGluYXRlc1swXT09MCYmaS5jb29yZGluYXRlc1swXS10LmNvb3JkaW5hdGVzWzBdPT0wKXJldHVybiByLmNvb3JkaW5hdGVzWzFdLXQuY29vcmRpbmF0ZXNbMV0+PTB8fGkuY29vcmRpbmF0ZXNbMV0tdC5jb29yZGluYXRlc1sxXT49MD9yLmNvb3JkaW5hdGVzWzFdLWkuY29vcmRpbmF0ZXNbMV06aS5jb29yZGluYXRlc1sxXS1yLmNvb3JkaW5hdGVzWzFdO3ZhciBvPXNzKHQuY29vcmRpbmF0ZXMsci5jb29yZGluYXRlcyxpLmNvb3JkaW5hdGVzKTtyZXR1cm4gbzwwPzE6bz4wPy0xOk1hdGgucG93KHIuY29vcmRpbmF0ZXNbMF0tdC5jb29yZGluYXRlc1swXSwyKStNYXRoLnBvdyhyLmNvb3JkaW5hdGVzWzFdLXQuY29vcmRpbmF0ZXNbMV0sMiktKE1hdGgucG93KGkuY29vcmRpbmF0ZXNbMF0tdC5jb29yZGluYXRlc1swXSwyKStNYXRoLnBvdyhpLmNvb3JkaW5hdGVzWzFdLXQuY29vcmRpbmF0ZXNbMV0sMikpfSkpLHRoaXMub3V0ZXJFZGdlc1NvcnRlZD0hMCl9LHQucHJvdG90eXBlLmdldE91dGVyRWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb3J0T3V0ZXJFZGdlcygpLHRoaXMub3V0ZXJFZGdlc30sdC5wcm90b3R5cGUuZ2V0T3V0ZXJFZGdlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNvcnRPdXRlckVkZ2VzKCksdGhpcy5vdXRlckVkZ2VzW3RdfSx0LnByb3RvdHlwZS5hZGRJbm5lckVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5pbm5lckVkZ2VzLnB1c2godCl9LHR9KCksbHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5mcm9tPXQsdGhpcy50bz1lLHRoaXMubmV4dD12b2lkIDAsdGhpcy5sYWJlbD12b2lkIDAsdGhpcy5zeW1ldHJpYz12b2lkIDAsdGhpcy5yaW5nPXZvaWQgMCx0aGlzLmZyb20uYWRkT3V0ZXJFZGdlKHRoaXMpLHRoaXMudG8uYWRkSW5uZXJFZGdlKHRoaXMpfXJldHVybiB0LnByb3RvdHlwZS5nZXRTeW1ldHJpYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN5bWV0cmljfHwodGhpcy5zeW1ldHJpYz1uZXcgdCh0aGlzLnRvLHRoaXMuZnJvbSksdGhpcy5zeW1ldHJpYy5zeW1ldHJpYz10aGlzKSx0aGlzLnN5bWV0cmljfSx0LnByb3RvdHlwZS5kZWxldGVFZGdlPWZ1bmN0aW9uKCl7dGhpcy5mcm9tLnJlbW92ZU91dGVyRWRnZSh0aGlzKSx0aGlzLnRvLnJlbW92ZUlubmVyRWRnZSh0aGlzKX0sdC5wcm90b3R5cGUuaXNFcXVhbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mcm9tLmlkPT09dC5mcm9tLmlkJiZ0aGlzLnRvLmlkPT09dC50by5pZH0sdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iRWRnZSB7ICIrdGhpcy5mcm9tLmlkKyIgLT4gIit0aGlzLnRvLmlkKyIgfSJ9LHQucHJvdG90eXBlLnRvTGluZVN0cmluZz1mdW5jdGlvbigpe3JldHVybiBoKFt0aGlzLmZyb20uY29vcmRpbmF0ZXMsdGhpcy50by5jb29yZGluYXRlc10pfSx0LnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7cmV0dXJuIHNzKHQuZnJvbS5jb29yZGluYXRlcyx0LnRvLmNvb3JkaW5hdGVzLHRoaXMudG8uY29vcmRpbmF0ZXMpfSx0fSgpLGNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZWRnZXM9W10sdGhpcy5wb2x5Z29uPXZvaWQgMCx0aGlzLmVudmVsb3BlPXZvaWQgMH1yZXR1cm4gdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXt0aGlzLmVkZ2VzLnB1c2godCksdGhpcy5wb2x5Z29uPXRoaXMuZW52ZWxvcGU9dm9pZCAwfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWRnZXNbdF19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibGVuZ3RoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMubGVuZ3RofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dGhpcy5lZGdlcy5mb3JFYWNoKHQpfSx0LnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWRnZXMubWFwKHQpfSx0LnByb3RvdHlwZS5zb21lPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVkZ2VzLnNvbWUodCl9LHQucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdC5wcm90b3R5cGUuaXNIb2xlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuZWRnZXMucmVkdWNlKChmdW5jdGlvbihlLG4scil7cmV0dXJuIG4uZnJvbS5jb29yZGluYXRlc1sxXT50LmVkZ2VzW2VdLmZyb20uY29vcmRpbmF0ZXNbMV0mJihlPXIpLGV9KSwwKSxuPSgwPT09ZT90aGlzLmxlbmd0aDplKS0xLHI9KGUrMSkldGhpcy5sZW5ndGgsaT1zcyh0aGlzLmVkZ2VzW25dLmZyb20uY29vcmRpbmF0ZXMsdGhpcy5lZGdlc1tlXS5mcm9tLmNvb3JkaW5hdGVzLHRoaXMuZWRnZXNbcl0uZnJvbS5jb29yZGluYXRlcyk7cmV0dXJuIDA9PT1pP3RoaXMuZWRnZXNbbl0uZnJvbS5jb29yZGluYXRlc1swXT50aGlzLmVkZ2VzW3JdLmZyb20uY29vcmRpbmF0ZXNbMF06aT4wfSx0LnByb3RvdHlwZS50b011bHRpUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZCh0aGlzLmVkZ2VzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZnJvbS5jb29yZGluYXRlc30pKSl9LHQucHJvdG90eXBlLnRvUG9seWdvbj1mdW5jdGlvbigpe2lmKHRoaXMucG9seWdvbilyZXR1cm4gdGhpcy5wb2x5Z29uO3ZhciB0PXRoaXMuZWRnZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5mcm9tLmNvb3JkaW5hdGVzfSkpO3JldHVybiB0LnB1c2godGhpcy5lZGdlc1swXS5mcm9tLmNvb3JkaW5hdGVzKSx0aGlzLnBvbHlnb249bChbdF0pfSx0LnByb3RvdHlwZS5nZXRFbnZlbG9wZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVudmVsb3BlP3RoaXMuZW52ZWxvcGU6dGhpcy5lbnZlbG9wZT1kbih0aGlzLnRvUG9seWdvbigpKX0sdC5maW5kRWRnZVJpbmdDb250YWluaW5nPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXQuZ2V0RW52ZWxvcGUoKTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbyxzLHUsbCxjLGgscD1lLmdldEVudmVsb3BlKCk7aWYoKHImJihuPXIuZ2V0RW52ZWxvcGUoKSkscz1pLHU9KG89cCkuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFswXX0pKSxsPW8uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFsxXX0pKSxjPXMuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFswXX0pKSxoPXMuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFsxXX0pKSxNYXRoLm1heC5hcHBseShudWxsLHUpIT09TWF0aC5tYXguYXBwbHkobnVsbCxjKXx8TWF0aC5tYXguYXBwbHkobnVsbCxsKSE9PU1hdGgubWF4LmFwcGx5KG51bGwsaCl8fE1hdGgubWluLmFwcGx5KG51bGwsdSkhPT1NYXRoLm1pbi5hcHBseShudWxsLGMpfHxNYXRoLm1pbi5hcHBseShudWxsLGwpIT09TWF0aC5taW4uYXBwbHkobnVsbCxoKSkmJmFzKHAsaSkpe2Zvcih2YXIgZj10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZnJvbS5jb29yZGluYXRlc30pKSxnPXZvaWQgMCxkPWZ1bmN0aW9uKHQpe2Uuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIG49dCxyPWUuZnJvbS5jb29yZGluYXRlcyxuWzBdPT09clswXSYmblsxXT09PXJbMV07dmFyIG4scn0pKXx8KGc9dCl9LHk9MCx2PWY7eTx2Lmxlbmd0aDt5Kyspe2Qodlt5XSl9ZyYmZS5pbnNpZGUoYShnKSkmJihyJiYhYXMobixwKXx8KHI9ZSkpfX0pKSxyfSx0LnByb3RvdHlwZS5pbnNpZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHllKHQsdGhpcy50b1BvbHlnb24oKSl9LHR9KCk7dmFyIGhzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZWRnZXM9W10sdGhpcy5ub2Rlcz17fX1yZXR1cm4gdC5mcm9tR2VvSnNvbj1mdW5jdGlvbihlKXshZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJObyBnZW9qc29uIHBhc3NlZCIpO2lmKCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUmJiJHZW9tZXRyeUNvbGxlY3Rpb24iIT09dC50eXBlJiYiTXVsdGlMaW5lU3RyaW5nIiE9PXQudHlwZSYmIkxpbmVTdHJpbmciIT09dC50eXBlJiYiRmVhdHVyZSIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUgJyIrdC50eXBlKyInLiBHZW9qc29uIG11c3QgYmUgRmVhdHVyZUNvbGxlY3Rpb24sIEdlb21ldHJ5Q29sbGVjdGlvbiwgTGluZVN0cmluZywgTXVsdGlMaW5lU3RyaW5nIG9yIEZlYXR1cmUiKX0oZSk7dmFyIG49bmV3IHQ7cmV0dXJuIHooZSwoZnVuY3Rpb24odCl7ZXQodCwiTGluZVN0cmluZyIsIkdyYXBoOjpmcm9tR2VvSnNvbiIpLFQodCwoZnVuY3Rpb24odCxlKXtpZih0KXt2YXIgcj1uLmdldE5vZGUodCksaT1uLmdldE5vZGUoZSk7bi5hZGRFZGdlKHIsaSl9cmV0dXJuIGV9KSl9KSksbn0sdC5wcm90b3R5cGUuZ2V0Tm9kZT1mdW5jdGlvbih0KXt2YXIgZT11cy5idWlsZElkKHQpLG49dGhpcy5ub2Rlc1tlXTtyZXR1cm4gbnx8KG49dGhpcy5ub2Rlc1tlXT1uZXcgdXModCkpLG59LHQucHJvdG90eXBlLmFkZEVkZ2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgbHModCxlKSxyPW4uZ2V0U3ltZXRyaWMoKTt0aGlzLmVkZ2VzLnB1c2gobiksdGhpcy5lZGdlcy5wdXNoKHIpfSx0LnByb3RvdHlwZS5kZWxldGVEYW5nbGVzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztPYmplY3Qua2V5cyh0aGlzLm5vZGVzKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGVzW2VdfSkpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9yZW1vdmVJZkRhbmdsZShlKX0pKX0sdC5wcm90b3R5cGUuX3JlbW92ZUlmRGFuZ2xlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodC5pbm5lckVkZ2VzLmxlbmd0aDw9MSl7dmFyIG49dC5nZXRPdXRlckVkZ2VzKCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC50b30pKTt0aGlzLnJlbW92ZU5vZGUodCksbi5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fcmVtb3ZlSWZEYW5nbGUodCl9KSl9fSx0LnByb3RvdHlwZS5kZWxldGVDdXRFZGdlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fY29tcHV0ZU5leHRDV0VkZ2VzKCksdGhpcy5fZmluZExhYmVsZWRFZGdlUmluZ3MoKSx0aGlzLmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UubGFiZWw9PT1lLnN5bWV0cmljLmxhYmVsJiYodC5yZW1vdmVFZGdlKGUuc3ltZXRyaWMpLHQucmVtb3ZlRWRnZShlKSl9KSl9LHQucHJvdG90eXBlLl9jb21wdXRlTmV4dENXRWRnZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt2b2lkIDA9PT10P09iamVjdC5rZXlzKHRoaXMubm9kZXMpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9jb21wdXRlTmV4dENXRWRnZXMoZS5ub2Rlc1t0XSl9KSk6dC5nZXRPdXRlckVkZ2VzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt0LmdldE91dGVyRWRnZSgoMD09PW4/dC5nZXRPdXRlckVkZ2VzKCkubGVuZ3RoOm4pLTEpLnN5bWV0cmljLm5leHQ9ZX0pKX0sdC5wcm90b3R5cGUuX2NvbXB1dGVOZXh0Q0NXRWRnZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixpPXQuZ2V0T3V0ZXJFZGdlcygpLG89aS5sZW5ndGgtMTtvPj0wOy0tbyl7dmFyIHM9aVtvXSxhPXMuc3ltZXRyaWMsdT12b2lkIDAsbD12b2lkIDA7cy5sYWJlbD09PWUmJih1PXMpLGEubGFiZWw9PT1lJiYobD1hKSx1JiZsJiYobCYmKHI9bCksdSYmKHImJihyLm5leHQ9dSxyPXZvaWQgMCksbnx8KG49dSkpKX1yJiYoci5uZXh0PW4pfSx0LnByb3RvdHlwZS5fZmluZExhYmVsZWRFZGdlUmluZ3M9ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPTA7cmV0dXJuIHRoaXMuZWRnZXMuZm9yRWFjaCgoZnVuY3Rpb24obil7aWYoIShuLmxhYmVsPj0wKSl7dC5wdXNoKG4pO3ZhciByPW47ZG97ci5sYWJlbD1lLHI9ci5uZXh0fXdoaWxlKCFuLmlzRXF1YWwocikpO2UrK319KSksdH0sdC5wcm90b3R5cGUuZ2V0RWRnZVJpbmdzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9jb21wdXRlTmV4dENXRWRnZXMoKSx0aGlzLmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QubGFiZWw9dm9pZCAwfSkpLHRoaXMuX2ZpbmRMYWJlbGVkRWRnZVJpbmdzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5fZmluZEludGVyc2VjdGlvbk5vZGVzKGUpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3QuX2NvbXB1dGVOZXh0Q0NXRWRnZXMobixlLmxhYmVsKX0pKX0pKTt2YXIgZT1bXTtyZXR1cm4gdGhpcy5lZGdlcy5mb3JFYWNoKChmdW5jdGlvbihuKXtuLnJpbmd8fGUucHVzaCh0Ll9maW5kRWRnZVJpbmcobikpfSkpLGV9LHQucHJvdG90eXBlLl9maW5kSW50ZXJzZWN0aW9uTm9kZXM9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj10LHI9ZnVuY3Rpb24oKXt2YXIgcj0wO24uZnJvbS5nZXRPdXRlckVkZ2VzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5sYWJlbD09PXQubGFiZWwmJisrcn0pKSxyPjEmJmUucHVzaChuLmZyb20pLG49bi5uZXh0fTtkb3tyKCl9d2hpbGUoIXQuaXNFcXVhbChuKSk7cmV0dXJuIGV9LHQucHJvdG90eXBlLl9maW5kRWRnZVJpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dCxuPW5ldyBjcztkb3tuLnB1c2goZSksZS5yaW5nPW4sZT1lLm5leHR9d2hpbGUoIXQuaXNFcXVhbChlKSk7cmV0dXJuIG59LHQucHJvdG90eXBlLnJlbW92ZU5vZGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0LmdldE91dGVyRWRnZXMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5yZW1vdmVFZGdlKHQpfSkpLHQuaW5uZXJFZGdlcy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5yZW1vdmVFZGdlKHQpfSkpLGRlbGV0ZSB0aGlzLm5vZGVzW3QuaWRdfSx0LnByb3RvdHlwZS5yZW1vdmVFZGdlPWZ1bmN0aW9uKHQpe3RoaXMuZWRnZXM9dGhpcy5lZGdlcy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiFlLmlzRXF1YWwodCl9KSksdC5kZWxldGVFZGdlKCl9LHR9KCk7ZnVuY3Rpb24gcHModCxlKXt2YXIgbj0hMDtyZXR1cm4geih0LChmdW5jdGlvbih0KXt6KGUsKGZ1bmN0aW9uKGUpe2lmKCExPT09bilyZXR1cm4hMTtuPWZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQudHlwZSl7Y2FzZSJQb2ludCI6c3dpdGNoKGUudHlwZSl7Y2FzZSJQb2ludCI6cmV0dXJuIG49dC5jb29yZGluYXRlcyxyPWUuY29vcmRpbmF0ZXMsIShuWzBdPT09clswXSYmblsxXT09PXJbMV0pO2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIWZzKGUsdCk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4heWUodCxlKX1icmVhaztjYXNlIkxpbmVTdHJpbmciOnN3aXRjaChlLnR5cGUpe2Nhc2UiUG9pbnQiOnJldHVybiFmcyh0LGUpO2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIWZ1bmN0aW9uKHQsZSl7aWYoT3IodCxlKS5mZWF0dXJlcy5sZW5ndGg+MClyZXR1cm4hMDtyZXR1cm4hMX0odCxlKTtjYXNlIlBvbHlnb24iOnJldHVybiFncyhlLHQpfWJyZWFrO2Nhc2UiUG9seWdvbiI6c3dpdGNoKGUudHlwZSl7Y2FzZSJQb2ludCI6cmV0dXJuIXllKGUsdCk7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4hZ3ModCxlKTtjYXNlIlBvbHlnb24iOnJldHVybiFmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9dC5jb29yZGluYXRlc1swXTtuPHIubGVuZ3RoO24rKyl7aWYoeWUocltuXSxlKSlyZXR1cm4hMH1mb3IodmFyIGk9MCxvPWUuY29vcmRpbmF0ZXNbMF07aTxvLmxlbmd0aDtpKyspe2lmKHllKG9baV0sdCkpcmV0dXJuITB9aWYoT3IoSWkodCksSWkoZSkpLmZlYXR1cmVzLmxlbmd0aD4wKXJldHVybiEwO3JldHVybiExfShlLHQpfX12YXIgbixyO3JldHVybiExfSh0Lmdlb21ldHJ5LGUuZ2VvbWV0cnkpfSkpfSkpLG59ZnVuY3Rpb24gZnModCxlKXtmb3IodmFyIG49MDtuPHQuY29vcmRpbmF0ZXMubGVuZ3RoLTE7bisrKWlmKGRzKHQuY29vcmRpbmF0ZXNbbl0sdC5jb29yZGluYXRlc1tuKzFdLGUuY29vcmRpbmF0ZXMpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGdzKHQsZSl7Zm9yKHZhciBuPTAscj1lLmNvb3JkaW5hdGVzO248ci5sZW5ndGg7bisrKXtpZih5ZShyW25dLHQpKXJldHVybiEwfXJldHVybiBPcihlLElpKHQpKS5mZWF0dXJlcy5sZW5ndGg+MH1mdW5jdGlvbiBkcyh0LGUsbil7dmFyIHI9blswXS10WzBdLGk9blsxXS10WzFdLG89ZVswXS10WzBdLHM9ZVsxXS10WzFdO3JldHVybiAwPT1yKnMtaSpvJiYoTWF0aC5hYnMobyk+PU1hdGguYWJzKHMpP28+MD90WzBdPD1uWzBdJiZuWzBdPD1lWzBdOmVbMF08PW5bMF0mJm5bMF08PXRbMF06cz4wP3RbMV08PW5bMV0mJm5bMV08PWVbMV06ZVsxXTw9blsxXSYmblsxXTw9dFsxXSl9ZnVuY3Rpb24geXModCxlKXtyZXR1cm4hKHRbMF0+ZVswXSkmJighKHRbMl08ZVsyXSkmJighKHRbMV0+ZVsxXSkmJiEodFszXTxlWzNdKSkpfWZ1bmN0aW9uIHZzKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX1mdW5jdGlvbiBfcyh0LGUpe3JldHVyblsodFswXStlWzBdKS8yLCh0WzFdK2VbMV0pLzJdfWZ1bmN0aW9uIG1zKHQsZSl7Zm9yKHZhciBuPSExLHI9ITEsaT10LmNvb3JkaW5hdGVzLmxlbmd0aCxvPTA7bzxpJiYhbiYmIXI7KXtmb3IodmFyIHM9MDtzPGUuY29vcmRpbmF0ZXMubGVuZ3RoLTE7cysrKXt2YXIgYT0hMDswIT09cyYmcyE9PWUuY29vcmRpbmF0ZXMubGVuZ3RoLTJ8fChhPSExKSxicyhlLmNvb3JkaW5hdGVzW3NdLGUuY29vcmRpbmF0ZXNbcysxXSx0LmNvb3JkaW5hdGVzW29dLGEpP249ITA6cj0hMH1vKyt9cmV0dXJuIG4mJnJ9ZnVuY3Rpb24geHModCxlKXtyZXR1cm4gT3IodCxOaShlKSkuZmVhdHVyZXMubGVuZ3RoPjB9ZnVuY3Rpb24gRXModCxlKXtmb3IodmFyIG49ITEscj0hMSxpPXQuY29vcmRpbmF0ZXMubGVuZ3RoLG89MDtvPGkmJighbnx8IXIpO28rKyl5ZShhKHQuY29vcmRpbmF0ZXNbb10pLGUpP249ITA6cj0hMDtyZXR1cm4gciYmbn1mdW5jdGlvbiBicyh0LGUsbixyKXt2YXIgaT1uWzBdLXRbMF0sbz1uWzFdLXRbMV0scz1lWzBdLXRbMF0sYT1lWzFdLXRbMV07cmV0dXJuIDA9PWkqYS1vKnMmJihyP01hdGguYWJzKHMpPj1NYXRoLmFicyhhKT9zPjA/dFswXTw9blswXSYmblswXTw9ZVswXTplWzBdPD1uWzBdJiZuWzBdPD10WzBdOmE+MD90WzFdPD1uWzFdJiZuWzFdPD1lWzFdOmVbMV08PW5bMV0mJm5bMV08PXRbMV06TWF0aC5hYnMocyk+PU1hdGguYWJzKGEpP3M+MD90WzBdPG5bMF0mJm5bMF08ZVswXTplWzBdPG5bMF0mJm5bMF08dFswXTphPjA/dFsxXTxuWzFdJiZuWzFdPGVbMV06ZVsxXTxuWzFdJiZuWzFdPHRbMV0pfXZhciB3cz1mdW5jdGlvbih0KXt0aGlzLnByZWNpc2lvbj10JiZ0LnByZWNpc2lvbj90LnByZWNpc2lvbjoxNyx0aGlzLmRpcmVjdGlvbj0hKCF0fHwhdC5kaXJlY3Rpb24pJiZ0LmRpcmVjdGlvbix0aGlzLnBzZXVkb05vZGU9ISghdHx8IXQucHNldWRvTm9kZSkmJnQucHNldWRvTm9kZSx0aGlzLm9iamVjdENvbXBhcmF0b3I9dCYmdC5vYmplY3RDb21wYXJhdG9yP3Qub2JqZWN0Q29tcGFyYXRvcjpTc307ZnVuY3Rpb24gSXModCl7cmV0dXJuIHQuY29vcmRpbmF0ZXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm57dHlwZTp0LnR5cGUucmVwbGFjZSgiTXVsdGkiLCIiKSxjb29yZGluYXRlczplfX0pKX1mdW5jdGlvbiBOcyh0LGUpe3JldHVybiB0Lmhhc093blByb3BlcnR5KCJjb29yZGluYXRlcyIpP3QuY29vcmRpbmF0ZXMubGVuZ3RoPT09ZS5jb29yZGluYXRlcy5sZW5ndGg6dC5sZW5ndGg9PT1lLmxlbmd0aH1mdW5jdGlvbiBTcyh0LGUpe3JldHVybiBGaSh0LGUse3N0cmljdDohMH0pfXdzLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYodC50eXBlIT09ZS50eXBlfHwhTnModCxlKSlyZXR1cm4hMTtzd2l0Y2godC50eXBlKXtjYXNlIlBvaW50IjpyZXR1cm4gdGhpcy5jb21wYXJlQ29vcmQodC5jb29yZGluYXRlcyxlLmNvb3JkaW5hdGVzKTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiB0aGlzLmNvbXBhcmVMaW5lKHQuY29vcmRpbmF0ZXMsZS5jb29yZGluYXRlcywwLCExKTtjYXNlIlBvbHlnb24iOnJldHVybiB0aGlzLmNvbXBhcmVQb2x5Z29uKHQsZSk7Y2FzZSJGZWF0dXJlIjpyZXR1cm4gdGhpcy5jb21wYXJlRmVhdHVyZSh0LGUpO2RlZmF1bHQ6aWYoMD09PXQudHlwZS5pbmRleE9mKCJNdWx0aSIpKXt2YXIgbj10aGlzLHI9SXModCksaT1JcyhlKTtyZXR1cm4gci5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIG4uY29tcGFyZSh0LGUpfSkpfSksaSl9fXJldHVybiExfSx3cy5wcm90b3R5cGUuY29tcGFyZUNvb3JkPWZ1bmN0aW9uKHQsZSl7aWYodC5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25dLnRvRml4ZWQodGhpcy5wcmVjaXNpb24pIT09ZVtuXS50b0ZpeGVkKHRoaXMucHJlY2lzaW9uKSlyZXR1cm4hMTtyZXR1cm4hMH0sd3MucHJvdG90eXBlLmNvbXBhcmVMaW5lPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCFOcyh0LGUpKXJldHVybiExO3ZhciBpPXRoaXMucHNldWRvTm9kZT90OnRoaXMucmVtb3ZlUHNldWRvKHQpLG89dGhpcy5wc2V1ZG9Ob2RlP2U6dGhpcy5yZW1vdmVQc2V1ZG8oZSk7aWYoIXJ8fHRoaXMuY29tcGFyZUNvb3JkKGlbMF0sb1swXSl8fChvPXRoaXMuZml4U3RhcnRJbmRleChvLGkpKSl7dmFyIHM9dGhpcy5jb21wYXJlQ29vcmQoaVtuXSxvW25dKTtyZXR1cm4gdGhpcy5kaXJlY3Rpb258fHM/dGhpcy5jb21wYXJlUGF0aChpLG8pOiEhdGhpcy5jb21wYXJlQ29vcmQoaVtuXSxvW28ubGVuZ3RoLSgxK24pXSkmJnRoaXMuY29tcGFyZVBhdGgoaS5zbGljZSgpLnJldmVyc2UoKSxvKX19LHdzLnByb3RvdHlwZS5maXhTdGFydEluZGV4PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHI9LTEsaT0wO2k8dC5sZW5ndGg7aSsrKWlmKHRoaXMuY29tcGFyZUNvb3JkKHRbaV0sZVswXSkpe3I9aTticmVha31yZXR1cm4gcj49MCYmKG49W10uY29uY2F0KHQuc2xpY2Uocix0Lmxlbmd0aCksdC5zbGljZSgxLHIrMSkpKSxufSx3cy5wcm90b3R5cGUuY29tcGFyZVBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiB0LmV2ZXJ5KChmdW5jdGlvbih0LGUpe3JldHVybiBuLmNvbXBhcmVDb29yZCh0LHRoaXNbZV0pfSksZSl9LHdzLnByb3RvdHlwZS5jb21wYXJlUG9seWdvbj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuY29tcGFyZUxpbmUodC5jb29yZGluYXRlc1swXSxlLmNvb3JkaW5hdGVzWzBdLDEsITApKXt2YXIgbj10LmNvb3JkaW5hdGVzLnNsaWNlKDEsdC5jb29yZGluYXRlcy5sZW5ndGgpLHI9ZS5jb29yZGluYXRlcy5zbGljZSgxLGUuY29vcmRpbmF0ZXMubGVuZ3RoKSxpPXRoaXM7cmV0dXJuIG4uZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBpLmNvbXBhcmVMaW5lKHQsZSwxLCEwKX0pKX0pLHIpfXJldHVybiExfSx3cy5wcm90b3R5cGUuY29tcGFyZUZlYXR1cmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4hKHQuaWQhPT1lLmlkfHwhdGhpcy5vYmplY3RDb21wYXJhdG9yKHQucHJvcGVydGllcyxlLnByb3BlcnRpZXMpfHwhdGhpcy5jb21wYXJlQkJveCh0LGUpKSYmdGhpcy5jb21wYXJlKHQuZ2VvbWV0cnksZS5nZW9tZXRyeSl9LHdzLnByb3RvdHlwZS5jb21wYXJlQkJveD1mdW5jdGlvbih0LGUpe3JldHVybiEhKCF0LmJib3gmJiFlLmJib3h8fHQuYmJveCYmZS5iYm94JiZ0aGlzLmNvbXBhcmVDb29yZCh0LmJib3gsZS5iYm94KSl9LHdzLnByb3RvdHlwZS5yZW1vdmVQc2V1ZG89ZnVuY3Rpb24odCl7cmV0dXJuIHR9O3ZhciBDcz13cztmdW5jdGlvbiBQcyh0LGUpe3ZhciBuPSExO3JldHVybiB6KHQsKGZ1bmN0aW9uKHQpe3ooZSwoZnVuY3Rpb24oZSl7aWYoITA9PT1uKXJldHVybiEwO249IXBzKHQuZ2VvbWV0cnksZS5nZW9tZXRyeSl9KSl9KSksbn12YXIgTXM9QnQoKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlLG4scil7dGhpcy5kYXRhc2V0PVtdLHRoaXMuZXBzaWxvbj0xLHRoaXMubWluUHRzPTIsdGhpcy5kaXN0YW5jZT10aGlzLl9ldWNsaWRlYW5EaXN0YW5jZSx0aGlzLmNsdXN0ZXJzPVtdLHRoaXMubm9pc2U9W10sdGhpcy5fdmlzaXRlZD1bXSx0aGlzLl9hc3NpZ25lZD1bXSx0aGlzLl9kYXRhc2V0TGVuZ3RoPTAsdGhpcy5faW5pdCh0LGUsbixyKX1lLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24odCxlLG4scil7dGhpcy5faW5pdCh0LGUsbixyKTtmb3IodmFyIGk9MDtpPHRoaXMuX2RhdGFzZXRMZW5ndGg7aSsrKWlmKDEhPT10aGlzLl92aXNpdGVkW2ldKXt0aGlzLl92aXNpdGVkW2ldPTE7dmFyIG89dGhpcy5fcmVnaW9uUXVlcnkoaSk7aWYoby5sZW5ndGg8dGhpcy5taW5QdHMpdGhpcy5ub2lzZS5wdXNoKGkpO2Vsc2V7dmFyIHM9dGhpcy5jbHVzdGVycy5sZW5ndGg7dGhpcy5jbHVzdGVycy5wdXNoKFtdKSx0aGlzLl9hZGRUb0NsdXN0ZXIoaSxzKSx0aGlzLl9leHBhbmRDbHVzdGVyKHMsbyl9fXJldHVybiB0aGlzLmNsdXN0ZXJzfSxlLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbixyKXtpZih0KXtpZighKHQgaW5zdGFuY2VvZiBBcnJheSkpdGhyb3cgRXJyb3IoIkRhdGFzZXQgbXVzdCBiZSBvZiB0eXBlIGFycmF5LCAiK3R5cGVvZiB0KyIgZ2l2ZW4iKTt0aGlzLmRhdGFzZXQ9dCx0aGlzLmNsdXN0ZXJzPVtdLHRoaXMubm9pc2U9W10sdGhpcy5fZGF0YXNldExlbmd0aD10Lmxlbmd0aCx0aGlzLl92aXNpdGVkPW5ldyBBcnJheSh0aGlzLl9kYXRhc2V0TGVuZ3RoKSx0aGlzLl9hc3NpZ25lZD1uZXcgQXJyYXkodGhpcy5fZGF0YXNldExlbmd0aCl9ZSYmKHRoaXMuZXBzaWxvbj1lKSxuJiYodGhpcy5taW5QdHM9biksciYmKHRoaXMuZGlzdGFuY2U9cil9LGUucHJvdG90eXBlLl9leHBhbmRDbHVzdGVyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07aWYoMSE9PXRoaXMuX3Zpc2l0ZWRbcl0pe3RoaXMuX3Zpc2l0ZWRbcl09MTt2YXIgaT10aGlzLl9yZWdpb25RdWVyeShyKTtpLmxlbmd0aD49dGhpcy5taW5QdHMmJihlPXRoaXMuX21lcmdlQXJyYXlzKGUsaSkpfTEhPT10aGlzLl9hc3NpZ25lZFtyXSYmdGhpcy5fYWRkVG9DbHVzdGVyKHIsdCl9fSxlLnByb3RvdHlwZS5fYWRkVG9DbHVzdGVyPWZ1bmN0aW9uKHQsZSl7dGhpcy5jbHVzdGVyc1tlXS5wdXNoKHQpLHRoaXMuX2Fzc2lnbmVkW3RdPTF9LGUucHJvdG90eXBlLl9yZWdpb25RdWVyeT1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dGhpcy5fZGF0YXNldExlbmd0aDtuKyspe3RoaXMuZGlzdGFuY2UodGhpcy5kYXRhc2V0W3RdLHRoaXMuZGF0YXNldFtuXSk8dGhpcy5lcHNpbG9uJiZlLnB1c2gobil9cmV0dXJuIGV9LGUucHJvdG90eXBlLl9tZXJnZUFycmF5cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLmxlbmd0aCxyPTA7cjxuO3IrKyl7dmFyIGk9ZVtyXTt0LmluZGV4T2YoaSk8MCYmdC5wdXNoKGkpfXJldHVybiB0fSxlLnByb3RvdHlwZS5fZXVjbGlkZWFuRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKTtyLS07KW4rPSh0W3JdLWVbcl0pKih0W3JdLWVbcl0pO3JldHVybiBNYXRoLnNxcnQobil9LHQuZXhwb3J0cyYmKHQuZXhwb3J0cz1lKX0pKSxMcz1CdCgoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsbil7dGhpcy5rPTMsdGhpcy5kYXRhc2V0PVtdLHRoaXMuYXNzaWdubWVudHM9W10sdGhpcy5jZW50cm9pZHM9W10sdGhpcy5pbml0KHQsZSxuKX1lLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmFzc2lnbm1lbnRzPVtdLHRoaXMuY2VudHJvaWRzPVtdLHZvaWQgMCE9PXQmJih0aGlzLmRhdGFzZXQ9dCksdm9pZCAwIT09ZSYmKHRoaXMuaz1lKSx2b2lkIDAhPT1uJiYodGhpcy5kaXN0YW5jZT1uKX0sZS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKHQsZSl7dGhpcy5pbml0KHQsZSk7Zm9yKHZhciBuPXRoaXMuZGF0YXNldC5sZW5ndGgscj0wO3I8dGhpcy5rO3IrKyl0aGlzLmNlbnRyb2lkc1tyXT10aGlzLnJhbmRvbUNlbnRyb2lkKCk7Zm9yKHZhciBpPSEwO2k7KXtpPXRoaXMuYXNzaWduKCk7Zm9yKHZhciBvPTA7bzx0aGlzLms7bysrKXtmb3IodmFyIHM9bmV3IEFycmF5KGMpLGE9MCx1PTA7dTxjO3UrKylzW3VdPTA7Zm9yKHZhciBsPTA7bDxuO2wrKyl7dmFyIGM9dGhpcy5kYXRhc2V0W2xdLmxlbmd0aDtpZihvPT09dGhpcy5hc3NpZ25tZW50c1tsXSl7Zm9yKHU9MDt1PGM7dSsrKXNbdV0rPXRoaXMuZGF0YXNldFtsXVt1XTthKyt9fWlmKGE+MCl7Zm9yKHU9MDt1PGM7dSsrKXNbdV0vPWE7dGhpcy5jZW50cm9pZHNbb109c31lbHNlIHRoaXMuY2VudHJvaWRzW29dPXRoaXMucmFuZG9tQ2VudHJvaWQoKSxpPSEwfX1yZXR1cm4gdGhpcy5nZXRDbHVzdGVycygpfSxlLnByb3RvdHlwZS5yYW5kb21DZW50cm9pZD1mdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLmRhdGFzZXQubGVuZ3RoLTE7ZG97ZT1NYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqbiksdD10aGlzLmRhdGFzZXRbZV19d2hpbGUodGhpcy5jZW50cm9pZHMuaW5kZXhPZih0KT49MCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmFzc2lnbj1mdW5jdGlvbigpe2Zvcih2YXIgdCxlPSExLG49dGhpcy5kYXRhc2V0Lmxlbmd0aCxyPTA7cjxuO3IrKykodD10aGlzLmFyZ21pbih0aGlzLmRhdGFzZXRbcl0sdGhpcy5jZW50cm9pZHMsdGhpcy5kaXN0YW5jZSkpIT10aGlzLmFzc2lnbm1lbnRzW3JdJiYodGhpcy5hc3NpZ25tZW50c1tyXT10LGU9ITApO3JldHVybiBlfSxlLnByb3RvdHlwZS5nZXRDbHVzdGVycz1mdW5jdGlvbigpe2Zvcih2YXIgdCxlPW5ldyBBcnJheSh0aGlzLmspLG49MDtuPHRoaXMuYXNzaWdubWVudHMubGVuZ3RoO24rKyl2b2lkIDA9PT1lW3Q9dGhpcy5hc3NpZ25tZW50c1tuXV0mJihlW3RdPVtdKSxlW3RdLnB1c2gobik7cmV0dXJuIGV9LGUucHJvdG90eXBlLmFyZ21pbj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGk9TnVtYmVyLk1BWF9WQUxVRSxvPTAscz1lLmxlbmd0aCxhPTA7YTxzO2ErKykocj1uKHQsZVthXSkpPGkmJihpPXIsbz1hKTtyZXR1cm4gb30sZS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKTtyLS07KXt2YXIgaT10W3JdLWVbcl07bis9aSppfXJldHVybiBNYXRoLnNxcnQobil9LHQuZXhwb3J0cyYmKHQuZXhwb3J0cz1lKX0pKSxPcz1CdCgoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsbil7dGhpcy5fcXVldWU9W10sdGhpcy5fcHJpb3JpdGllcz1bXSx0aGlzLl9zb3J0aW5nPSJkZXNjIix0aGlzLl9pbml0KHQsZSxuKX1lLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5fcXVldWUubGVuZ3RoLHI9bjtyLS07KXt2YXIgaT10aGlzLl9wcmlvcml0aWVzW3JdOyJkZXNjIj09PXRoaXMuX3NvcnRpbmc/ZT5pJiYobj1yKTplPGkmJihuPXIpfXRoaXMuX2luc2VydEF0KHQsZSxuKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9xdWV1ZS5sZW5ndGg7ZS0tOyl7aWYodD09PXRoaXMuX3F1ZXVlW2VdKXt0aGlzLl9xdWV1ZS5zcGxpY2UoZSwxKSx0aGlzLl9wcmlvcml0aWVzLnNwbGljZShlLDEpO2JyZWFrfX19LGUucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dGhpcy5fcXVldWUuZm9yRWFjaCh0KX0sZS5wcm90b3R5cGUuZ2V0RWxlbWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcXVldWV9LGUucHJvdG90eXBlLmdldEVsZW1lbnRQcmlvcml0eT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHJpb3JpdGllc1t0XX0sZS5wcm90b3R5cGUuZ2V0UHJpb3JpdGllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmlvcml0aWVzfSxlLnByb3RvdHlwZS5nZXRFbGVtZW50c1dpdGhQcmlvcml0aWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX3F1ZXVlLmxlbmd0aDtlPG47ZSsrKXQucHVzaChbdGhpcy5fcXVldWVbZV0sdGhpcy5fcHJpb3JpdGllc1tlXV0pO3JldHVybiB0fSxlLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbil7aWYodCYmZSl7aWYodGhpcy5fcXVldWU9W10sdGhpcy5fcHJpb3JpdGllcz1bXSx0Lmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl0aGlzLmluc2VydCh0W3JdLGVbcl0pfW4mJih0aGlzLl9zb3J0aW5nPW4pfSxlLnByb3RvdHlwZS5faW5zZXJ0QXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX3F1ZXVlLmxlbmd0aD09PW4/KHRoaXMuX3F1ZXVlLnB1c2godCksdGhpcy5fcHJpb3JpdGllcy5wdXNoKGUpKToodGhpcy5fcXVldWUuc3BsaWNlKG4sMCx0KSx0aGlzLl9wcmlvcml0aWVzLnNwbGljZShuLDAsZSkpfSx0LmV4cG9ydHMmJih0LmV4cG9ydHM9ZSl9KSksUnM9QnQoKGZ1bmN0aW9uKHQpe2lmKHQuZXhwb3J0cyl2YXIgZT1PcztmdW5jdGlvbiBuKHQsZSxuLHIpe3RoaXMuZXBzaWxvbj0xLHRoaXMubWluUHRzPTEsdGhpcy5kaXN0YW5jZT10aGlzLl9ldWNsaWRlYW5EaXN0YW5jZSx0aGlzLl9yZWFjaGFiaWxpdHk9W10sdGhpcy5fcHJvY2Vzc2VkPVtdLHRoaXMuX2NvcmVEaXN0YW5jZT0wLHRoaXMuX29yZGVyZWRMaXN0PVtdLHRoaXMuX2luaXQodCxlLG4scil9bi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKHQsbixyLGkpe3RoaXMuX2luaXQodCxuLHIsaSk7Zm9yKHZhciBvPTAscz10aGlzLmRhdGFzZXQubGVuZ3RoO288cztvKyspaWYoMSE9PXRoaXMuX3Byb2Nlc3NlZFtvXSl7dGhpcy5fcHJvY2Vzc2VkW29dPTEsdGhpcy5jbHVzdGVycy5wdXNoKFtvXSk7dmFyIGE9dGhpcy5jbHVzdGVycy5sZW5ndGgtMTt0aGlzLl9vcmRlcmVkTGlzdC5wdXNoKG8pO3ZhciB1PW5ldyBlKG51bGwsbnVsbCwiYXNjIiksbD10aGlzLl9yZWdpb25RdWVyeShvKTt2b2lkIDAhPT10aGlzLl9kaXN0YW5jZVRvQ29yZShvKSYmKHRoaXMuX3VwZGF0ZVF1ZXVlKG8sbCx1KSx0aGlzLl9leHBhbmRDbHVzdGVyKGEsdSkpfXJldHVybiB0aGlzLmNsdXN0ZXJzfSxuLnByb3RvdHlwZS5nZXRSZWFjaGFiaWxpdHlQbG90PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX29yZGVyZWRMaXN0Lmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9vcmRlcmVkTGlzdFtlXSxpPXRoaXMuX3JlYWNoYWJpbGl0eVtyXTt0LnB1c2goW3IsaV0pfXJldHVybiB0fSxuLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbixyKXtpZih0KXtpZighKHQgaW5zdGFuY2VvZiBBcnJheSkpdGhyb3cgRXJyb3IoIkRhdGFzZXQgbXVzdCBiZSBvZiB0eXBlIGFycmF5LCAiK3R5cGVvZiB0KyIgZ2l2ZW4iKTt0aGlzLmRhdGFzZXQ9dCx0aGlzLmNsdXN0ZXJzPVtdLHRoaXMuX3JlYWNoYWJpbGl0eT1uZXcgQXJyYXkodGhpcy5kYXRhc2V0Lmxlbmd0aCksdGhpcy5fcHJvY2Vzc2VkPW5ldyBBcnJheSh0aGlzLmRhdGFzZXQubGVuZ3RoKSx0aGlzLl9jb3JlRGlzdGFuY2U9MCx0aGlzLl9vcmRlcmVkTGlzdD1bXX1lJiYodGhpcy5lcHNpbG9uPWUpLG4mJih0aGlzLm1pblB0cz1uKSxyJiYodGhpcy5kaXN0YW5jZT1yKX0sbi5wcm90b3R5cGUuX3VwZGF0ZVF1ZXVlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO3RoaXMuX2NvcmVEaXN0YW5jZT10aGlzLl9kaXN0YW5jZVRvQ29yZSh0KSxlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PXIuX3Byb2Nlc3NlZFtlXSl7dmFyIGk9ci5kaXN0YW5jZShyLmRhdGFzZXRbdF0sci5kYXRhc2V0W2VdKSxvPU1hdGgubWF4KHIuX2NvcmVEaXN0YW5jZSxpKTt2b2lkIDA9PT1yLl9yZWFjaGFiaWxpdHlbZV0/KHIuX3JlYWNoYWJpbGl0eVtlXT1vLG4uaW5zZXJ0KGUsbykpOm88ci5fcmVhY2hhYmlsaXR5W2VdJiYoci5fcmVhY2hhYmlsaXR5W2VdPW8sbi5yZW1vdmUoZSksbi5pbnNlcnQoZSxvKSl9fSkpfSxuLnByb3RvdHlwZS5fZXhwYW5kQ2x1c3Rlcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLmdldEVsZW1lbnRzKCkscj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7dmFyIG89bltyXTtpZih2b2lkIDA9PT10aGlzLl9wcm9jZXNzZWRbb10pe3ZhciBzPXRoaXMuX3JlZ2lvblF1ZXJ5KG8pO3RoaXMuX3Byb2Nlc3NlZFtvXT0xLHRoaXMuY2x1c3RlcnNbdF0ucHVzaChvKSx0aGlzLl9vcmRlcmVkTGlzdC5wdXNoKG8pLHZvaWQgMCE9PXRoaXMuX2Rpc3RhbmNlVG9Db3JlKG8pJiYodGhpcy5fdXBkYXRlUXVldWUobyxzLGUpLHRoaXMuX2V4cGFuZENsdXN0ZXIodCxlKSl9fX0sbi5wcm90b3R5cGUuX2Rpc3RhbmNlVG9Db3JlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmVwc2lsb24sbj0wO248ZTtuKyspe2lmKHRoaXMuX3JlZ2lvblF1ZXJ5KHQsbikubGVuZ3RoPj10aGlzLm1pblB0cylyZXR1cm4gbn19LG4ucHJvdG90eXBlLl9yZWdpb25RdWVyeT1mdW5jdGlvbih0LGUpe2U9ZXx8dGhpcy5lcHNpbG9uO2Zvcih2YXIgbj1bXSxyPTAsaT10aGlzLmRhdGFzZXQubGVuZ3RoO3I8aTtyKyspdGhpcy5kaXN0YW5jZSh0aGlzLmRhdGFzZXRbdF0sdGhpcy5kYXRhc2V0W3JdKTxlJiZuLnB1c2gocik7cmV0dXJuIG59LG4ucHJvdG90eXBlLl9ldWNsaWRlYW5EaXN0YW5jZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpO3ItLTspbis9KHRbcl0tZVtyXSkqKHRbcl0tZVtyXSk7cmV0dXJuIE1hdGguc3FydChuKX0sdC5leHBvcnRzJiYodC5leHBvcnRzPW4pfSkpLFRzPUJ0KChmdW5jdGlvbih0KXt0LmV4cG9ydHMmJih0LmV4cG9ydHM9e0RCU0NBTjpNcyxLTUVBTlM6THMsT1BUSUNTOlJzLFByaW9yaXR5UXVldWU6T3N9KX0pKTt2YXIgQXM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10Lmxlbmd0aCxpPTAsbz0wO288cjtvKyspe3ZhciBzPSh0W29dfHwwKS0oZVtvXXx8MCk7aSs9cypzfXJldHVybiBuP01hdGguc3FydChpKTppfSxEcz1BcyxGcz1mdW5jdGlvbih0LGUsbil7dmFyIHI9TWF0aC5hYnModC1lKTtyZXR1cm4gbj9yOnIqcn0sa3M9QXMsR3M9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49e30scj1bXSxpPWU8PDIsbz10Lmxlbmd0aCxzPXRbMF0ubGVuZ3RoPjA7ci5sZW5ndGg8ZSYmaS0tID4wOyl7dmFyIGE9dFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbyldLHU9cz9hLmpvaW4oIl8iKToiIithO25bdV18fChuW3VdPSEwLHIucHVzaChhKSl9aWYoci5sZW5ndGg8ZSl0aHJvdyBuZXcgRXJyb3IoIkVycm9yIGluaXRpYWxpemF0aW5nIGNsdXN0ZXJzIik7cmV0dXJuIHJ9LHFzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dFswXS5sZW5ndGg/RHM6RnMscj1bXSxpPXQubGVuZ3RoLG89dFswXS5sZW5ndGg+MCxzPXRbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmkpXTtvJiZzLmpvaW4oIl8iKTtmb3Ioci5wdXNoKHMpO3IubGVuZ3RoPGU7KXtmb3IodmFyIGE9W10sdT1yLmxlbmd0aCxsPTAsYz1bXSxoPTA7aDxpO2grKyl7Zm9yKHZhciBwPTEvMCxmPTA7Zjx1O2YrKyl7dmFyIGc9bih0W2hdLHJbZl0pO2c8PXAmJihwPWcpfWFbaF09cH1mb3IodmFyIGQ9MDtkPGk7ZCsrKWwrPWFbZF07Zm9yKHZhciB5PTA7eTxpO3krKyljW3ldPXtpOnksdjp0W3ldLHByOmFbeV0vbCxjczowfTtjLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucHItZS5wcn0pKSxjWzBdLmNzPWNbMF0ucHI7Zm9yKHZhciB2PTE7djxpO3YrKyljW3ZdLmNzPWNbdi0xXS5jcytjW3ZdLnByO2Zvcih2YXIgXz1NYXRoLnJhbmRvbSgpLG09MDttPGktMSYmY1ttKytdLmNzPF87KTtyLnB1c2goY1ttLTFdLnYpfXJldHVybiByfTtmdW5jdGlvbiBCcyh0LGUsbil7bj1ufHxbXTtmb3IodmFyIHI9MDtyPHQ7cisrKW5bcl09ZTtyZXR1cm4gbn12YXIgenM9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9W10sbz1bXSxzPVtdLGE9W10sdT0hMSxsPXJ8fDFlNCxjPXQubGVuZ3RoLGg9dFswXS5sZW5ndGgscD1oPjAsZj1bXTtpZihuKWk9ImttcmFuZCI9PW4/R3ModCxlKToia21wcCI9PW4/cXModCxlKTpuO2Vsc2UgZm9yKHZhciBnPXt9O2kubGVuZ3RoPGU7KXt2YXIgZD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYyk7Z1tkXXx8KGdbZF09ITAsaS5wdXNoKHRbZF0pKX1kb3tCcyhlLDAsZik7Zm9yKHZhciB5PTA7eTxjO3krKyl7Zm9yKHZhciB2PTEvMCxfPTAsbT0wO208ZTttKyspeyhhPXA/a3ModFt5XSxpW21dKTpNYXRoLmFicyh0W3ldLWlbbV0pKTw9diYmKHY9YSxfPW0pfXNbeV09XyxmW19dKyt9Zm9yKHZhciB4PVtdLEU9KG89W10sMCk7RTxlO0UrKyl4W0VdPXA/QnMoaCwwLHhbRV0pOjAsb1tFXT1pW0VdO2lmKHApe2Zvcih2YXIgYj0wO2I8ZTtiKyspaVtiXT1bXTtmb3IodmFyIHc9MDt3PGM7dysrKWZvcih2YXIgST14W3Nbd11dLE49dFt3XSxTPTA7UzxoO1MrKylJW1NdKz1OW1NdO3U9ITA7Zm9yKHZhciBDPTA7QzxlO0MrKyl7Zm9yKHZhciBQPWlbQ10sTT14W0NdLEw9b1tDXSxPPWZbQ10sUj0wO1I8aDtSKyspUFtSXT1NW1JdL098fDA7aWYodSlmb3IodmFyIFQ9MDtUPGg7VCsrKWlmKExbVF0hPVBbVF0pe3U9ITE7YnJlYWt9fX1lbHNle2Zvcih2YXIgQT0wO0E8YztBKyspe3hbc1tBXV0rPXRbQV19Zm9yKHZhciBEPTA7RDxlO0QrKylpW0RdPXhbRF0vZltEXXx8MDt1PSEwO2Zvcih2YXIgRj0wO0Y8ZTtGKyspaWYob1tGXSE9aVtGXSl7dT0hMTticmVha319dT11fHwtLWw8PTB9d2hpbGUoIXUpO3JldHVybntpdDoxZTQtbCxrOmUsaWR4czpzLGNlbnRyb2lkczppfX07ZnVuY3Rpb24ganModCxlKXtyZXR1cm4gYihCaSh0WzBdLHRbMV0pKT09PWIoQmkoZVswXSxlWzFdKSl9ZnVuY3Rpb24gVXModCxlKXtpZih0Lmdlb21ldHJ5JiZ0Lmdlb21ldHJ5LnR5cGUpcmV0dXJuIHQuZ2VvbWV0cnkudHlwZTtpZih0LnR5cGUpcmV0dXJuIHQudHlwZTt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgR2VvSlNPTiBvYmplY3QgZm9yICIrZSl9ZnVuY3Rpb24gVnModCl7Zm9yKHZhciBlPXQsbj1bXTtlLnBhcmVudDspbi51bnNoaWZ0KGUpLGU9ZS5wYXJlbnQ7cmV0dXJuIG59dmFyIFhzPXtzZWFyY2g6ZnVuY3Rpb24odCxlLG4scil7dC5jbGVhbkRpcnR5KCk7dmFyIGk9KHI9cnx8e30pLmhldXJpc3RpY3x8WHMuaGV1cmlzdGljcy5tYW5oYXR0YW4sbz1yLmNsb3Nlc3R8fCExLHM9bmV3IFdzKChmdW5jdGlvbih0KXtyZXR1cm4gdC5mfSkpLGE9ZTtmb3IoZS5oPWkoZSxuKSxzLnB1c2goZSk7cy5zaXplKCk+MDspe3ZhciB1PXMucG9wKCk7aWYodT09PW4pcmV0dXJuIFZzKHUpO3UuY2xvc2VkPSEwO2Zvcih2YXIgbD10Lm5laWdoYm9ycyh1KSxjPTAsaD1sLmxlbmd0aDtjPGg7KytjKXt2YXIgcD1sW2NdO2lmKCFwLmNsb3NlZCYmIXAuaXNXYWxsKCkpe3ZhciBmPXUuZytwLmdldENvc3QodSksZz1wLnZpc2l0ZWQ7KCFnfHxmPHAuZykmJihwLnZpc2l0ZWQ9ITAscC5wYXJlbnQ9dSxwLmg9cC5ofHxpKHAsbikscC5nPWYscC5mPXAuZytwLmgsdC5tYXJrRGlydHkocCksbyYmKHAuaDxhLmh8fHAuaD09PWEuaCYmcC5nPGEuZykmJihhPXApLGc/cy5yZXNjb3JlRWxlbWVudChwKTpzLnB1c2gocCkpfX19cmV0dXJuIG8/VnMoYSk6W119LGhldXJpc3RpY3M6e21hbmhhdHRhbjpmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLmFicyhlLngtdC54KStNYXRoLmFicyhlLnktdC55KX0sZGlhZ29uYWw6ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNxcnQoMikscj1NYXRoLmFicyhlLngtdC54KSxpPU1hdGguYWJzKGUueS10LnkpO3JldHVybiAxKihyK2kpKyhuLTIpKk1hdGgubWluKHIsaSl9fSxjbGVhbk5vZGU6ZnVuY3Rpb24odCl7dC5mPTAsdC5nPTAsdC5oPTAsdC52aXNpdGVkPSExLHQuY2xvc2VkPSExLHQucGFyZW50PW51bGx9fTtmdW5jdGlvbiBZcyh0LGUpe2U9ZXx8e30sdGhpcy5ub2Rlcz1bXSx0aGlzLmRpYWdvbmFsPSEhZS5kaWFnb25hbCx0aGlzLmdyaWQ9W107Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3RoaXMuZ3JpZFtuXT1bXTtmb3IodmFyIHI9MCxpPXRbbl07cjxpLmxlbmd0aDtyKyspe3ZhciBvPW5ldyBIcyhuLHIsaVtyXSk7dGhpcy5ncmlkW25dW3JdPW8sdGhpcy5ub2Rlcy5wdXNoKG8pfX10aGlzLmluaXQoKX1mdW5jdGlvbiBIcyh0LGUsbil7dGhpcy54PXQsdGhpcy55PWUsdGhpcy53ZWlnaHQ9bn1mdW5jdGlvbiBXcyh0KXt0aGlzLmNvbnRlbnQ9W10sdGhpcy5zY29yZUZ1bmN0aW9uPXR9ZnVuY3Rpb24gSnModCxlKXtmb3IodmFyIG49MDtuPGUuZmVhdHVyZXMubGVuZ3RoO24rKylpZih5ZSh0LGUuZmVhdHVyZXNbbl0pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIFpzKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBLcyh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBRcyh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiAkcygpe3RoaXMuXz1udWxsfWZ1bmN0aW9uIHRhKHQpe3QuVT10LkM9dC5MPXQuUj10LlA9dC5OPW51bGx9ZnVuY3Rpb24gZWEodCxlKXt2YXIgbj1lLHI9ZS5SLGk9bi5VO2k/aS5MPT09bj9pLkw9cjppLlI9cjp0Ll89cixyLlU9aSxuLlU9cixuLlI9ci5MLG4uUiYmKG4uUi5VPW4pLHIuTD1ufWZ1bmN0aW9uIG5hKHQsZSl7dmFyIG49ZSxyPWUuTCxpPW4uVTtpP2kuTD09PW4/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksbi5VPXIsbi5MPXIuUixuLkwmJihuLkwuVT1uKSxyLlI9bn1mdW5jdGlvbiByYSh0KXtmb3IoO3QuTDspdD10Lkw7cmV0dXJuIHR9ZnVuY3Rpb24gaWEodCxlLG4scil7dmFyIGk9W251bGwsbnVsbF0sbz1QYS5wdXNoKGkpLTE7cmV0dXJuIGkubGVmdD10LGkucmlnaHQ9ZSxuJiZzYShpLHQsZSxuKSxyJiZzYShpLGUsdCxyKSxTYVt0LmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxTYVtlLmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxpfWZ1bmN0aW9uIG9hKHQsZSxuKXt2YXIgcj1bZSxuXTtyZXR1cm4gci5sZWZ0PXQscn1mdW5jdGlvbiBzYSh0LGUsbixyKXt0WzBdfHx0WzFdP3QubGVmdD09PW4/dFsxXT1yOnRbMF09cjoodFswXT1yLHQubGVmdD1lLHQucmlnaHQ9bil9ZnVuY3Rpb24gYWEodCxlLG4scixpKXt2YXIgbyxzPXRbMF0sYT10WzFdLHU9c1swXSxsPXNbMV0sYz0wLGg9MSxwPWFbMF0tdSxmPWFbMV0tbDtpZihvPWUtdSxwfHwhKG8+MCkpe2lmKG8vPXAscDwwKXtpZihvPGMpcmV0dXJuO288aCYmKGg9byl9ZWxzZSBpZihwPjApe2lmKG8+aClyZXR1cm47bz5jJiYoYz1vKX1pZihvPXItdSxwfHwhKG88MCkpe2lmKG8vPXAscDwwKXtpZihvPmgpcmV0dXJuO28+YyYmKGM9byl9ZWxzZSBpZihwPjApe2lmKG88YylyZXR1cm47bzxoJiYoaD1vKX1pZihvPW4tbCxmfHwhKG8+MCkpe2lmKG8vPWYsZjwwKXtpZihvPGMpcmV0dXJuO288aCYmKGg9byl9ZWxzZSBpZihmPjApe2lmKG8+aClyZXR1cm47bz5jJiYoYz1vKX1pZihvPWktbCxmfHwhKG88MCkpe2lmKG8vPWYsZjwwKXtpZihvPmgpcmV0dXJuO28+YyYmKGM9byl9ZWxzZSBpZihmPjApe2lmKG88YylyZXR1cm47bzxoJiYoaD1vKX1yZXR1cm4hKGM+MHx8aDwxKXx8KGM+MCYmKHRbMF09W3UrYypwLGwrYypmXSksaDwxJiYodFsxXT1bdStoKnAsbCtoKmZdKSwhMCl9fX19fWZ1bmN0aW9uIHVhKHQsZSxuLHIsaSl7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciBzLGEsdT10WzBdLGw9dC5sZWZ0LGM9dC5yaWdodCxoPWxbMF0scD1sWzFdLGY9Y1swXSxnPWNbMV0sZD0oaCtmKS8yLHk9KHArZykvMjtpZihnPT09cCl7aWYoZDxlfHxkPj1yKXJldHVybjtpZihoPmYpe2lmKHUpe2lmKHVbMV0+PWkpcmV0dXJufWVsc2UgdT1bZCxuXTtvPVtkLGldfWVsc2V7aWYodSl7aWYodVsxXTxuKXJldHVybn1lbHNlIHU9W2QsaV07bz1bZCxuXX19ZWxzZSBpZihhPXktKHM9KGgtZikvKGctcCkpKmQsczwtMXx8cz4xKWlmKGg+Zil7aWYodSl7aWYodVsxXT49aSlyZXR1cm59ZWxzZSB1PVsobi1hKS9zLG5dO289WyhpLWEpL3MsaV19ZWxzZXtpZih1KXtpZih1WzFdPG4pcmV0dXJufWVsc2UgdT1bKGktYSkvcyxpXTtvPVsobi1hKS9zLG5dfWVsc2UgaWYocDxnKXtpZih1KXtpZih1WzBdPj1yKXJldHVybn1lbHNlIHU9W2UscyplK2FdO289W3IscypyK2FdfWVsc2V7aWYodSl7aWYodVswXTxlKXJldHVybn1lbHNlIHU9W3IscypyK2FdO289W2UscyplK2FdfXJldHVybiB0WzBdPXUsdFsxXT1vLCEwfWZ1bmN0aW9uIGxhKHQsZSl7dmFyIG49dC5zaXRlLHI9ZS5sZWZ0LGk9ZS5yaWdodDtyZXR1cm4gbj09PWkmJihpPXIscj1uKSxpP01hdGguYXRhbjIoaVsxXS1yWzFdLGlbMF0tclswXSk6KG49PT1yPyhyPWVbMV0saT1lWzBdKToocj1lWzBdLGk9ZVsxXSksTWF0aC5hdGFuMihyWzBdLWlbMF0saVsxXS1yWzFdKSl9ZnVuY3Rpb24gY2EodCxlKXtyZXR1cm4gZVsrKGUubGVmdCE9PXQuc2l0ZSldfWZ1bmN0aW9uIGhhKHQsZSl7cmV0dXJuIGVbKyhlLmxlZnQ9PT10LnNpdGUpXX1Zcy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuZGlydHlOb2Rlcz1bXTtmb3IodmFyIHQ9MDt0PHRoaXMubm9kZXMubGVuZ3RoO3QrKylYcy5jbGVhbk5vZGUodGhpcy5ub2Rlc1t0XSl9LFlzLnByb3RvdHlwZS5jbGVhbkRpcnR5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLmRpcnR5Tm9kZXMubGVuZ3RoO3QrKylYcy5jbGVhbk5vZGUodGhpcy5kaXJ0eU5vZGVzW3RdKTt0aGlzLmRpcnR5Tm9kZXM9W119LFlzLnByb3RvdHlwZS5tYXJrRGlydHk9ZnVuY3Rpb24odCl7dGhpcy5kaXJ0eU5vZGVzLnB1c2godCl9LFlzLnByb3RvdHlwZS5uZWlnaGJvcnM9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj10Lngscj10LnksaT10aGlzLmdyaWQ7cmV0dXJuIGlbbi0xXSYmaVtuLTFdW3JdJiZlLnB1c2goaVtuLTFdW3JdKSxpW24rMV0mJmlbbisxXVtyXSYmZS5wdXNoKGlbbisxXVtyXSksaVtuXSYmaVtuXVtyLTFdJiZlLnB1c2goaVtuXVtyLTFdKSxpW25dJiZpW25dW3IrMV0mJmUucHVzaChpW25dW3IrMV0pLHRoaXMuZGlhZ29uYWwmJihpW24tMV0mJmlbbi0xXVtyLTFdJiZlLnB1c2goaVtuLTFdW3ItMV0pLGlbbisxXSYmaVtuKzFdW3ItMV0mJmUucHVzaChpW24rMV1bci0xXSksaVtuLTFdJiZpW24tMV1bcisxXSYmZS5wdXNoKGlbbi0xXVtyKzFdKSxpW24rMV0mJmlbbisxXVtyKzFdJiZlLnB1c2goaVtuKzFdW3IrMV0pKSxlfSxZcy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxuLHIsaT1bXSxvPXRoaXMuZ3JpZCxzPTAsYT1vLmxlbmd0aDtzPGE7cysrKXtmb3IodD1bXSxuPTAscj0oZT1vW3NdKS5sZW5ndGg7bjxyO24rKyl0LnB1c2goZVtuXS53ZWlnaHQpO2kucHVzaCh0LmpvaW4oIiAiKSl9cmV0dXJuIGkuam9pbigiXG4iKX0sSHMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlsiK3RoaXMueCsiICIrdGhpcy55KyJdIn0sSHMucHJvdG90eXBlLmdldENvc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQueCE9PXRoaXMueCYmdC55IT09dGhpcy55PzEuNDE0MjEqdGhpcy53ZWlnaHQ6dGhpcy53ZWlnaHR9LEhzLnByb3RvdHlwZS5pc1dhbGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMud2VpZ2h0fSxXcy5wcm90b3R5cGU9e3B1c2g6ZnVuY3Rpb24odCl7dGhpcy5jb250ZW50LnB1c2godCksdGhpcy5zaW5rRG93bih0aGlzLmNvbnRlbnQubGVuZ3RoLTEpfSxwb3A6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRlbnRbMF0sZT10aGlzLmNvbnRlbnQucG9wKCk7cmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGg+MCYmKHRoaXMuY29udGVudFswXT1lLHRoaXMuYnViYmxlVXAoMCkpLHR9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRlbnQuaW5kZXhPZih0KSxuPXRoaXMuY29udGVudC5wb3AoKTtlIT09dGhpcy5jb250ZW50Lmxlbmd0aC0xJiYodGhpcy5jb250ZW50W2VdPW4sdGhpcy5zY29yZUZ1bmN0aW9uKG4pPHRoaXMuc2NvcmVGdW5jdGlvbih0KT90aGlzLnNpbmtEb3duKGUpOnRoaXMuYnViYmxlVXAoZSkpfSxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGh9LHJlc2NvcmVFbGVtZW50OmZ1bmN0aW9uKHQpe3RoaXMuc2lua0Rvd24odGhpcy5jb250ZW50LmluZGV4T2YodCkpfSxzaW5rRG93bjpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5jb250ZW50W3RdO3Q+MDspe3ZhciBuPSh0KzE+PjEpLTEscj10aGlzLmNvbnRlbnRbbl07aWYoISh0aGlzLnNjb3JlRnVuY3Rpb24oZSk8dGhpcy5zY29yZUZ1bmN0aW9uKHIpKSlicmVhazt0aGlzLmNvbnRlbnRbbl09ZSx0aGlzLmNvbnRlbnRbdF09cix0PW59fSxidWJibGVVcDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5jb250ZW50Lmxlbmd0aCxuPXRoaXMuY29udGVudFt0XSxyPXRoaXMuc2NvcmVGdW5jdGlvbihuKTs7KXt2YXIgaSxvPXQrMTw8MSxzPW8tMSxhPW51bGw7aWYoczxlKXt2YXIgdT10aGlzLmNvbnRlbnRbc107KGk9dGhpcy5zY29yZUZ1bmN0aW9uKHUpKTxyJiYoYT1zKX1pZihvPGUpe3ZhciBsPXRoaXMuY29udGVudFtvXTt0aGlzLnNjb3JlRnVuY3Rpb24obCk8KG51bGw9PT1hP3I6aSkmJihhPW8pfWlmKG51bGw9PT1hKWJyZWFrO3RoaXMuY29udGVudFt0XT10aGlzLmNvbnRlbnRbYV0sdGhpcy5jb250ZW50W2FdPW4sdD1hfX19LCRzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6JHMsaW5zZXJ0OmZ1bmN0aW9uKHQsZSl7dmFyIG4scixpO2lmKHQpe2lmKGUuUD10LGUuTj10Lk4sdC5OJiYodC5OLlA9ZSksdC5OPWUsdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9ZX1lbHNlIHQuUj1lO249dH1lbHNlIHRoaXMuXz8odD1yYSh0aGlzLl8pLGUuUD1udWxsLGUuTj10LHQuUD10Lkw9ZSxuPXQpOihlLlA9ZS5OPW51bGwsdGhpcy5fPWUsbj1udWxsKTtmb3IoZS5MPWUuUj1udWxsLGUuVT1uLGUuQz0hMCx0PWU7biYmbi5DOyluPT09KHI9bi5VKS5MPyhpPXIuUikmJmkuQz8obi5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PW4uUiYmKGVhKHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsci5DPSEwLG5hKHRoaXMscikpOihpPXIuTCkmJmkuQz8obi5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PW4uTCYmKG5hKHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsci5DPSEwLGVhKHRoaXMscikpLG49dC5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24odCl7dC5OJiYodC5OLlA9dC5QKSx0LlAmJih0LlAuTj10Lk4pLHQuTj10LlA9bnVsbDt2YXIgZSxuLHIsaT10LlUsbz10Lkwscz10LlI7aWYobj1vP3M/cmEocyk6bzpzLGk/aS5MPT09dD9pLkw9bjppLlI9bjp0aGlzLl89bixvJiZzPyhyPW4uQyxuLkM9dC5DLG4uTD1vLG8uVT1uLG4hPT1zPyhpPW4uVSxuLlU9dC5VLHQ9bi5SLGkuTD10LG4uUj1zLHMuVT1uKToobi5VPWksaT1uLHQ9bi5SKSk6KHI9dC5DLHQ9biksdCYmKHQuVT1pKSwhcilpZih0JiZ0LkMpdC5DPSExO2Vsc2V7ZG97aWYodD09PXRoaXMuXylicmVhaztpZih0PT09aS5MKXtpZigoZT1pLlIpLkMmJihlLkM9ITEsaS5DPSEwLGVhKHRoaXMsaSksZT1pLlIpLGUuTCYmZS5MLkN8fGUuUiYmZS5SLkMpe2UuUiYmZS5SLkN8fChlLkwuQz0hMSxlLkM9ITAsbmEodGhpcyxlKSxlPWkuUiksZS5DPWkuQyxpLkM9ZS5SLkM9ITEsZWEodGhpcyxpKSx0PXRoaXMuXzticmVha319ZWxzZSBpZigoZT1pLkwpLkMmJihlLkM9ITEsaS5DPSEwLG5hKHRoaXMsaSksZT1pLkwpLGUuTCYmZS5MLkN8fGUuUiYmZS5SLkMpe2UuTCYmZS5MLkN8fChlLlIuQz0hMSxlLkM9ITAsZWEodGhpcyxlKSxlPWkuTCksZS5DPWkuQyxpLkM9ZS5MLkM9ITEsbmEodGhpcyxpKSx0PXRoaXMuXzticmVha31lLkM9ITAsdD1pLGk9aS5VfXdoaWxlKCF0LkMpO3QmJih0LkM9ITEpfX19O3ZhciBwYSxmYT1bXTtmdW5jdGlvbiBnYSgpe3RhKHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBkYSh0KXt2YXIgZT10LlAsbj10Lk47aWYoZSYmbil7dmFyIHI9ZS5zaXRlLGk9dC5zaXRlLG89bi5zaXRlO2lmKHIhPT1vKXt2YXIgcz1pWzBdLGE9aVsxXSx1PXJbMF0tcyxsPXJbMV0tYSxjPW9bMF0tcyxoPW9bMV0tYSxwPTIqKHUqaC1sKmMpO2lmKCEocD49LUxhKSl7dmFyIGY9dSp1K2wqbCxnPWMqYytoKmgsZD0oaCpmLWwqZykvcCx5PSh1KmctYypmKS9wLHY9ZmEucG9wKCl8fG5ldyBnYTt2LmFyYz10LHYuc2l0ZT1pLHYueD1kK3Msdi55PSh2LmN5PXkrYSkrTWF0aC5zcXJ0KGQqZCt5KnkpLHQuY2lyY2xlPXY7Zm9yKHZhciBfPW51bGwsbT1DYS5fO207KWlmKHYueTxtLnl8fHYueT09PW0ueSYmdi54PD1tLngpe2lmKCFtLkwpe189bS5QO2JyZWFrfW09bS5MfWVsc2V7aWYoIW0uUil7Xz1tO2JyZWFrfW09bS5SfUNhLmluc2VydChfLHYpLF98fChwYT12KX19fX1mdW5jdGlvbiB5YSh0KXt2YXIgZT10LmNpcmNsZTtlJiYoZS5QfHwocGE9ZS5OKSxDYS5yZW1vdmUoZSksZmEucHVzaChlKSx0YShlKSx0LmNpcmNsZT1udWxsKX12YXIgdmE9W107ZnVuY3Rpb24gX2EoKXt0YSh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gbWEodCl7dmFyIGU9dmEucG9wKCl8fG5ldyBfYTtyZXR1cm4gZS5zaXRlPXQsZX1mdW5jdGlvbiB4YSh0KXt5YSh0KSxOYS5yZW1vdmUodCksdmEucHVzaCh0KSx0YSh0KX1mdW5jdGlvbiBFYSh0KXt2YXIgZT10LmNpcmNsZSxuPWUueCxyPWUuY3ksaT1bbixyXSxvPXQuUCxzPXQuTixhPVt0XTt4YSh0KTtmb3IodmFyIHU9bzt1LmNpcmNsZSYmTWF0aC5hYnMobi11LmNpcmNsZS54KTxNYSYmTWF0aC5hYnMoci11LmNpcmNsZS5jeSk8TWE7KW89dS5QLGEudW5zaGlmdCh1KSx4YSh1KSx1PW87YS51bnNoaWZ0KHUpLHlhKHUpO2Zvcih2YXIgbD1zO2wuY2lyY2xlJiZNYXRoLmFicyhuLWwuY2lyY2xlLngpPE1hJiZNYXRoLmFicyhyLWwuY2lyY2xlLmN5KTxNYTspcz1sLk4sYS5wdXNoKGwpLHhhKGwpLGw9czthLnB1c2gobCkseWEobCk7dmFyIGMsaD1hLmxlbmd0aDtmb3IoYz0xO2M8aDsrK2MpbD1hW2NdLHU9YVtjLTFdLHNhKGwuZWRnZSx1LnNpdGUsbC5zaXRlLGkpO3U9YVswXSwobD1hW2gtMV0pLmVkZ2U9aWEodS5zaXRlLGwuc2l0ZSxudWxsLGkpLGRhKHUpLGRhKGwpfWZ1bmN0aW9uIGJhKHQpe2Zvcih2YXIgZSxuLHIsaSxvPXRbMF0scz10WzFdLGE9TmEuXzthOylpZigocj13YShhLHMpLW8pPk1hKWE9YS5MO2Vsc2V7aWYoISgoaT1vLUlhKGEscykpPk1hKSl7cj4tTWE/KGU9YS5QLG49YSk6aT4tTWE/KGU9YSxuPWEuTik6ZT1uPWE7YnJlYWt9aWYoIWEuUil7ZT1hO2JyZWFrfWE9YS5SfSFmdW5jdGlvbih0KXtTYVt0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19KHQpO3ZhciB1PW1hKHQpO2lmKE5hLmluc2VydChlLHUpLGV8fG4pe2lmKGU9PT1uKXJldHVybiB5YShlKSxuPW1hKGUuc2l0ZSksTmEuaW5zZXJ0KHUsbiksdS5lZGdlPW4uZWRnZT1pYShlLnNpdGUsdS5zaXRlKSxkYShlKSx2b2lkIGRhKG4pO2lmKG4pe3lhKGUpLHlhKG4pO3ZhciBsPWUuc2l0ZSxjPWxbMF0saD1sWzFdLHA9dFswXS1jLGY9dFsxXS1oLGc9bi5zaXRlLGQ9Z1swXS1jLHk9Z1sxXS1oLHY9MioocCp5LWYqZCksXz1wKnArZipmLG09ZCpkK3kqeSx4PVsoeSpfLWYqbSkvditjLChwKm0tZCpfKS92K2hdO3NhKG4uZWRnZSxsLGcseCksdS5lZGdlPWlhKGwsdCxudWxsLHgpLG4uZWRnZT1pYSh0LGcsbnVsbCx4KSxkYShlKSxkYShuKX1lbHNlIHUuZWRnZT1pYShlLnNpdGUsdS5zaXRlKX19ZnVuY3Rpb24gd2EodCxlKXt2YXIgbj10LnNpdGUscj1uWzBdLGk9blsxXSxvPWktZTtpZighbylyZXR1cm4gcjt2YXIgcz10LlA7aWYoIXMpcmV0dXJuLTEvMDt2YXIgYT0obj1zLnNpdGUpWzBdLHU9blsxXSxsPXUtZTtpZighbClyZXR1cm4gYTt2YXIgYz1hLXIsaD0xL28tMS9sLHA9Yy9sO3JldHVybiBoPygtcCtNYXRoLnNxcnQocCpwLTIqaCooYypjLygtMipsKS11K2wvMitpLW8vMikpKS9oK3I6KHIrYSkvMn1mdW5jdGlvbiBJYSh0LGUpe3ZhciBuPXQuTjtpZihuKXJldHVybiB3YShuLGUpO3ZhciByPXQuc2l0ZTtyZXR1cm4gclsxXT09PWU/clswXToxLzB9dmFyIE5hLFNhLENhLFBhLE1hPTFlLTYsTGE9MWUtMTI7ZnVuY3Rpb24gT2EodCxlKXtyZXR1cm4gZVsxXS10WzFdfHxlWzBdLXRbMF19ZnVuY3Rpb24gUmEodCxlKXt2YXIgbixyLGksbz10LnNvcnQoT2EpLnBvcCgpO2ZvcihQYT1bXSxTYT1uZXcgQXJyYXkodC5sZW5ndGgpLE5hPW5ldyAkcyxDYT1uZXcgJHM7OylpZihpPXBhLG8mJighaXx8b1sxXTxpLnl8fG9bMV09PT1pLnkmJm9bMF08aS54KSlvWzBdPT09biYmb1sxXT09PXJ8fChiYShvKSxuPW9bMF0scj1vWzFdKSxvPXQucG9wKCk7ZWxzZXtpZighaSlicmVhaztFYShpLmFyYyl9aWYoZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxuLHIsaT0wLG89U2EubGVuZ3RoO2k8bzsrK2kpaWYoKHQ9U2FbaV0pJiYocj0oZT10LmhhbGZlZGdlcykubGVuZ3RoKSl7dmFyIHM9bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KHIpO2ZvcihuPTA7bjxyOysrbilzW25dPW4sYVtuXT1sYSh0LFBhW2Vbbl1dKTtmb3Iocy5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBhW2VdLWFbdF19KSksbj0wO248cjsrK24pYVtuXT1lW3Nbbl1dO2ZvcihuPTA7bjxyOysrbillW25dPWFbbl19fSgpLGUpe3ZhciBzPStlWzBdWzBdLGE9K2VbMF1bMV0sdT0rZVsxXVswXSxsPStlWzFdWzFdOyFmdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGksbz1QYS5sZW5ndGg7by0tOyl1YShpPVBhW29dLHQsZSxuLHIpJiZhYShpLHQsZSxuLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5NYXx8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5NYSl8fGRlbGV0ZSBQYVtvXX0ocyxhLHUsbCksZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzLGEsdSxsLGMsaCxwLGYsZyxkLHk9U2EubGVuZ3RoLHY9ITA7Zm9yKGk9MDtpPHk7KytpKWlmKG89U2FbaV0pe2ZvcihzPW8uc2l0ZSxhPSh1PW8uaGFsZmVkZ2VzKS5sZW5ndGg7YS0tOylQYVt1W2FdXXx8dS5zcGxpY2UoYSwxKTtmb3IoYT0wLGw9dS5sZW5ndGg7YTxsOylnPShmPWhhKG8sUGFbdVthXV0pKVswXSxkPWZbMV0saD0oYz1jYShvLFBhW3VbKythJWxdXSkpWzBdLHA9Y1sxXSwoTWF0aC5hYnMoZy1oKT5NYXx8TWF0aC5hYnMoZC1wKT5NYSkmJih1LnNwbGljZShhLDAsUGEucHVzaChvYShzLGYsTWF0aC5hYnMoZy10KTxNYSYmci1kPk1hP1t0LE1hdGguYWJzKGgtdCk8TWE/cDpyXTpNYXRoLmFicyhkLXIpPE1hJiZuLWc+TWE/W01hdGguYWJzKHAtcik8TWE/aDpuLHJdOk1hdGguYWJzKGctbik8TWEmJmQtZT5NYT9bbixNYXRoLmFicyhoLW4pPE1hP3A6ZV06TWF0aC5hYnMoZC1lKTxNYSYmZy10Pk1hP1tNYXRoLmFicyhwLWUpPE1hP2g6dCxlXTpudWxsKSktMSksKytsKTtsJiYodj0hMSl9aWYodil7dmFyIF8sbSx4LEU9MS8wO2ZvcihpPTAsdj1udWxsO2k8eTsrK2kpKG89U2FbaV0pJiYoeD0oXz0ocz1vLnNpdGUpWzBdLXQpKl8rKG09c1sxXS1lKSptKTxFJiYoRT14LHY9byk7aWYodil7dmFyIGI9W3QsZV0sdz1bdCxyXSxJPVtuLHJdLE49W24sZV07di5oYWxmZWRnZXMucHVzaChQYS5wdXNoKG9hKHM9di5zaXRlLGIsdykpLTEsUGEucHVzaChvYShzLHcsSSkpLTEsUGEucHVzaChvYShzLEksTikpLTEsUGEucHVzaChvYShzLE4sYikpLTEpfX1mb3IoaT0wO2k8eTsrK2kpKG89U2FbaV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgU2FbaV0pfShzLGEsdSxsKX10aGlzLmVkZ2VzPVBhLHRoaXMuY2VsbHM9U2EsTmE9Q2E9UGE9U2E9bnVsbH1mdW5jdGlvbiBUYSh0KXtyZXR1cm4odD10LnNsaWNlKCkpLnB1c2godFswXSksbChbdF0pfWZ1bmN0aW9uIEFhKHQsZSxuLHIpe3ZhciBpPShyPXJ8fHt9KS5zdGVwc3x8NjQsbz1yLnVuaXRzfHwia2lsb21ldGVycyIscz1yLmFuZ2xlfHwwLGE9ci5waXZvdHx8dCx1PXIucHJvcGVydGllc3x8dC5wcm9wZXJ0aWVzfHx7fTtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNlbnRlciBpcyByZXF1aXJlZCIpO2lmKCFlKXRocm93IG5ldyBFcnJvcigieFNlbWlBeGlzIGlzIHJlcXVpcmVkIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJ5U2VtaUF4aXMgaXMgcmVxdWlyZWQiKTtpZighUChyKSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtpZighQyhpKSl0aHJvdyBuZXcgRXJyb3IoInN0ZXBzIG11c3QgYmUgYSBudW1iZXIiKTtpZighQyhzKSl0aHJvdyBuZXcgRXJyb3IoImFuZ2xlIG11c3QgYmUgYSBudW1iZXIiKTt2YXIgYz1LKHQpO2lmKCJkZWdyZWVzIj09PW8pdmFyIGg9SShzKTtlbHNlIGU9amkodCxlLDkwLHt1bml0czpvfSksbj1qaSh0LG4sMCx7dW5pdHM6b30pLGU9SyhlKVswXS1jWzBdLG49SyhuKVsxXS1jWzFdO2Zvcih2YXIgcD1bXSxmPTA7ZjxpO2YrPTEpe3ZhciBnPS0zNjAqZi9pLGQ9ZSpuL01hdGguc3FydChNYXRoLnBvdyhuLDIpK01hdGgucG93KGUsMikqTWF0aC5wb3coRGEoZyksMikpLHk9ZSpuL01hdGguc3FydChNYXRoLnBvdyhlLDIpK01hdGgucG93KG4sMikvTWF0aC5wb3coRGEoZyksMikpO2lmKGc8LTkwJiZnPj0tMjcwJiYoZD0tZCksZzwtMTgwJiZnPj0tMzYwJiYoeT0teSksImRlZ3JlZXMiPT09byl7dmFyIHY9ZCpNYXRoLmNvcyhoKSt5Kk1hdGguc2luKGgpLF89eSpNYXRoLmNvcyhoKS1kKk1hdGguc2luKGgpO2Q9dix5PV99cC5wdXNoKFtkK2NbMF0seStjWzFdXSl9cmV0dXJuIHAucHVzaChwWzBdKSwiZGVncmVlcyI9PT1vP2woW3BdLHUpOiRvKGwoW3BdLHUpLHMse3Bpdm90OmF9KX1mdW5jdGlvbiBEYSh0KXt2YXIgZT10Kk1hdGguUEkvMTgwO3JldHVybiBNYXRoLnRhbihlKX1mdW5jdGlvbiBGYSh0LGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj0wLHI9MCxpPTA7cmV0dXJuIHEodCwoZnVuY3Rpb24odCxvLHMpe3ZhciBhPWUud2VpZ2h0P251bGw9PXM/dm9pZCAwOnNbZS53ZWlnaHRdOnZvaWQgMDtpZighQyhhPW51bGw9PWE/MTphKSl0aHJvdyBuZXcgRXJyb3IoIndlaWdodCB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyIGZvciBmZWF0dXJlIGluZGV4ICIrbyk7KGE9TnVtYmVyKGEpKT4wJiZSKHQsKGZ1bmN0aW9uKHQpe24rPXRbMF0qYSxyKz10WzFdKmEsaSs9YX0pKX0pKSxhKFtuL2ksci9pXSxlLnByb3BlcnRpZXMsZSl9ZnVuY3Rpb24ga2EodCxlLG4scixpKXt2YXIgbz1yLnRvbGVyYW5jZXx8LjAwMSxzPTAsdT0wLGw9MCxjPTA7aWYoRihuLChmdW5jdGlvbihlKXt2YXIgbixyPW51bGw9PT0obj1lLnByb3BlcnRpZXMpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLndlaWdodCxpPW51bGw9PXI/MTpyO2lmKCFDKGk9TnVtYmVyKGkpKSl0aHJvdyBuZXcgRXJyb3IoIndlaWdodCB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyIik7aWYoaT4wKXtjKz0xO3ZhciBvPWkqbWUoZSx0KTswPT09byYmKG89MSk7dmFyIGE9aS9vO3MrPWUuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0qYSx1Kz1lLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdKmEsbCs9YX19KSksYzwxKXRocm93IG5ldyBFcnJvcigibm8gZmVhdHVyZXMgdG8gbWVhc3VyZSIpO3ZhciBoPXMvbCxwPXUvbDtyZXR1cm4gMT09PWN8fDA9PT1pfHxNYXRoLmFicyhoLWVbMF0pPG8mJk1hdGguYWJzKHAtZVsxXSk8bz9hKFtoLHBdLHttZWRpYW5DYW5kaWRhdGVzOnIubWVkaWFuQ2FuZGlkYXRlc30pOihyLm1lZGlhbkNhbmRpZGF0ZXMucHVzaChbaCxwXSksa2EoW2gscF0sdCxuLHIsaS0xKSl9ZnVuY3Rpb24gR2EodCxlKXtyZXR1cm57eDp0WzBdLWVbMF0seTp0WzFdLWVbMV19fWZ1bmN0aW9uIHFhKHQsZSl7dmFyIG49MCxyPTA7Uih0LChmdW5jdGlvbihpLG8scyxhLHUpe3U+biYmKG49dSxyPW8sZS5wdXNoKFtdKSk7dmFyIGw9by1yLGM9dC5jb29yZGluYXRlc1t1XVtsKzFdLGg9aVswXSxwPWlbMV0sZj1jWzBdLGc9Y1sxXTtlW3VdLnB1c2goWy43NSpoKy4yNSpmLC43NSpwKy4yNSpnXSksZVt1XS5wdXNoKFsuMjUqaCsuNzUqZiwuMjUqcCsuNzUqZ10pfSksITApLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5wdXNoKHRbMF0pfSkpfWZ1bmN0aW9uIEJhKHQsZSl7dmFyIG49MCxyPTAsaT0wO1IodCwoZnVuY3Rpb24obyxzLGEsdSxsKXt1PmkmJihpPXUscj1zLGUucHVzaChbW11dKSksbD5uJiYobj1sLHI9cyxlW3VdLnB1c2goW10pKTt2YXIgYz1zLXIsaD10LmNvb3JkaW5hdGVzW3VdW2xdW2MrMV0scD1vWzBdLGY9b1sxXSxnPWhbMF0sZD1oWzFdO2VbdV1bbF0ucHVzaChbLjc1KnArLjI1KmcsLjc1KmYrLjI1KmRdKSxlW3VdW2xdLnB1c2goWy4yNSpwKy43NSpnLC4yNSpmKy43NSpkXSl9KSwhMCksZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QucHVzaCh0WzBdKX0pKX0pKX1mdW5jdGlvbiB6YSh0LGUsbil7dm9pZCAwPT09biYmKG49Mik7dmFyIHI9Syh0KSxpPUsoZSksbz1yWzBdLWlbMF0scz1yWzFdLWlbMV07cmV0dXJuIDE9PT1uP01hdGguYWJzKG8pK01hdGguYWJzKHMpOk1hdGgucG93KE1hdGgucG93KG8sbikrTWF0aC5wb3cocyxuKSwxL24pfWZ1bmN0aW9uIGphKHQsZSl7dmFyIG49KGU9ZXx8e30pLnRocmVzaG9sZHx8MWU0LHI9ZS5wfHwyLGk9ZS5iaW5hcnl8fCExLG89ZS5hbHBoYXx8LTEscz1lLnN0YW5kYXJkaXphdGlvbnx8ITEsYT1bXTtGKHQsKGZ1bmN0aW9uKHQpe2EucHVzaChFbih0KSl9KSk7Zm9yKHZhciB1PVtdLGw9MDtsPGEubGVuZ3RoO2wrKyl1W2xdPVtdO2ZvcihsPTA7bDxhLmxlbmd0aDtsKyspZm9yKHZhciBjPWw7YzxhLmxlbmd0aDtjKyspe2w9PT1jJiYodVtsXVtjXT0wKTt2YXIgaD16YShhW2xdLGFbY10scik7dVtsXVtjXT1oLHVbY11bbF09aH1mb3IobD0wO2w8YS5sZW5ndGg7bCsrKWZvcihjPTA7YzxhLmxlbmd0aDtjKyspezAhPT0oaD11W2xdW2NdKSYmKHVbbF1bY109aT9oPD1uPzE6MDpoPD1uP01hdGgucG93KGgsbyk6MCl9aWYocylmb3IobD0wO2w8YS5sZW5ndGg7bCsrKXt2YXIgcD11W2xdLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlfSksMCk7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyl1W2xdW2NdPXVbbF1bY10vcH1yZXR1cm4gdX1mdW5jdGlvbiBVYSh0KXtmb3IodmFyIGU9MCxuPTAscj10O248ci5sZW5ndGg7bisrKXtlKz1yW25dfXJldHVybiBlL3QubGVuZ3RofWZ1bmN0aW9uIFZhKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxZYSh0LCJtZXJjYXRvciIsZSl9ZnVuY3Rpb24gWGEodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLFlhKHQsIndnczg0IixlKX1mdW5jdGlvbiBZYSh0LGUsbil7dm9pZCAwPT09biYmKG49e30pO3ZhciByPShuPW58fHt9KS5tdXRhdGU7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJkModFswXSk/dD0ibWVyY2F0b3IiPT09ZT9IYSh0KTpXYSh0KTooITAhPT1yJiYodD1JZSh0KSksUih0LChmdW5jdGlvbih0KXt2YXIgbj0ibWVyY2F0b3IiPT09ZT9IYSh0KTpXYSh0KTt0WzBdPW5bMF0sdFsxXT1uWzFdfSkpKSx0fWZ1bmN0aW9uIEhhKHQpe3ZhciBlPU1hdGguUEkvMTgwLG49NjM3ODEzNyxyPTIwMDM3NTA4LjM0Mjc4OTI0NCxpPVtuKihNYXRoLmFicyh0WzBdKTw9MTgwP3RbMF06dFswXS0zNjAqZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD8tMTp0PjA/MTowfSh0WzBdKSkqZSxuKk1hdGgubG9nKE1hdGgudGFuKC4yNSpNYXRoLlBJKy41KnRbMV0qZSkpXTtyZXR1cm4gaVswXT5yJiYoaVswXT1yKSxpWzBdPC1yJiYoaVswXT0tciksaVsxXT5yJiYoaVsxXT1yKSxpWzFdPC1yJiYoaVsxXT0tciksaX1mdW5jdGlvbiBXYSh0KXt2YXIgZT0xODAvTWF0aC5QSSxuPTYzNzgxMzc7cmV0dXJuW3RbMF0qZS9uLCguNSpNYXRoLlBJLTIqTWF0aC5hdGFuKE1hdGguZXhwKC10WzFdL24pKSkqZV19UmEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpSYSxwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKChmdW5jdGlvbihlKXt2YXIgbj1lLmhhbGZlZGdlcy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBjYShlLHRbbl0pfSkpO3JldHVybiBuLmRhdGE9ZS5zaXRlLmRhdGEsbn0pKX0sdHJpYW5nbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9W10sZT10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLmZvckVhY2goKGZ1bmN0aW9uKG4scil7aWYobz0oaT1uLmhhbGZlZGdlcykubGVuZ3RoKWZvcih2YXIgaSxvLHMsYSx1LGwsYz1uLnNpdGUsaD0tMSxwPWVbaVtvLTFdXSxmPXAubGVmdD09PWM/cC5yaWdodDpwLmxlZnQ7KytoPG87KXM9ZixmPShwPWVbaVtoXV0pLmxlZnQ9PT1jP3AucmlnaHQ6cC5sZWZ0LHMmJmYmJnI8cy5pbmRleCYmcjxmLmluZGV4JiYodT1zLGw9ZiwoKGE9YylbMF0tbFswXSkqKHVbMV0tYVsxXSktKGFbMF0tdVswXSkqKGxbMV0tYVsxXSk8MCkmJnQucHVzaChbYy5kYXRhLHMuZGF0YSxmLmRhdGFdKX0pKSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucmlnaHR9KSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSkpfSxmaW5kOmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsaSxvPXRoaXMscz1vLl9mb3VuZHx8MCxhPW8uY2VsbHMubGVuZ3RoOyEoaT1vLmNlbGxzW3NdKTspaWYoKytzPj1hKXJldHVybiBudWxsO3ZhciB1PXQtaS5zaXRlWzBdLGw9ZS1pLnNpdGVbMV0sYz11KnUrbCpsO2Rve2k9by5jZWxsc1tyPXNdLHM9bnVsbCxpLmhhbGZlZGdlcy5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgcj1vLmVkZ2VzW25dLGE9ci5sZWZ0O2lmKGEhPT1pLnNpdGUmJmF8fChhPXIucmlnaHQpKXt2YXIgdT10LWFbMF0sbD1lLWFbMV0saD11KnUrbCpsO2g8YyYmKGM9aCxzPWEuaW5kZXgpfX0pKX13aGlsZShudWxsIT09cyk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09bnx8Yzw9bipuP2kuc2l0ZTpudWxsfX07dmFyIEphPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHRvTWVyY2F0b3I6VmEsdG9XZ3M4NDpYYX0pLFphPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wLG49YXJndW1lbnRzLmxlbmd0aDtlPG47ZSsrKXQrPWFyZ3VtZW50c1tlXS5sZW5ndGg7dmFyIHI9QXJyYXkodCksaT0wO2ZvcihlPTA7ZTxuO2UrKylmb3IodmFyIG89YXJndW1lbnRzW2VdLHM9MCxhPW8ubGVuZ3RoO3M8YTtzKyssaSsrKXJbaV09b1tzXTtyZXR1cm4gcn07ZnVuY3Rpb24gS2EodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/bnUodCk6dCYmdC5iYm94P251KHQuYmJveCk6WzM2MCpldSgpLDE4MCpldSgpXX1mdW5jdGlvbiBRYSh0LGUpe3ZvaWQgMD09PWUmJihlPXt9KSxudWxsPT10JiYodD0xKTtmb3IodmFyIG49W10scj0wO3I8dDtyKyspbi5wdXNoKGEoS2EoZS5iYm94KSkpO3JldHVybiBmKG4pfWZ1bmN0aW9uICRhKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pLG51bGw9PXQmJih0PTEpLEMoZS5udW1fdmVydGljZXMpJiZ2b2lkIDAhPT1lLm51bV92ZXJ0aWNlc3x8KGUubnVtX3ZlcnRpY2VzPTEwKSxDKGUubWF4X3JhZGlhbF9sZW5ndGgpJiZ2b2lkIDAhPT1lLm1heF9yYWRpYWxfbGVuZ3RofHwoZS5tYXhfcmFkaWFsX2xlbmd0aD0xMCk7Zm9yKHZhciBuPVtdLHI9ZnVuY3Rpb24odCl7dmFyIHIsaT1bXSxvPVphKEFycmF5KGUubnVtX3ZlcnRpY2VzKzEpKS5tYXAoTWF0aC5yYW5kb20pO28uZm9yRWFjaCgoZnVuY3Rpb24odCxlLG4pe25bZV09ZT4wP3QrbltlLTFdOnR9KSksby5mb3JFYWNoKChmdW5jdGlvbih0KXt0PTIqdCpNYXRoLlBJL29bby5sZW5ndGgtMV07dmFyIG49TWF0aC5yYW5kb20oKTtpLnB1c2goW24qKGUubWF4X3JhZGlhbF9sZW5ndGh8fDEwKSpNYXRoLnNpbih0KSxuKihlLm1heF9yYWRpYWxfbGVuZ3RofHwxMCkqTWF0aC5jb3ModCldKX0pKSxpW2kubGVuZ3RoLTFdPWlbMF0saT1pLm1hcCgocj1LYShlLmJib3gpLGZ1bmN0aW9uKHQpe3JldHVyblt0WzBdK3JbMF0sdFsxXStyWzFdXX0pKSxuLnB1c2gobChbaV0pKX0saT0wO2k8dDtpKyspcigpO3JldHVybiBmKG4pfWZ1bmN0aW9uIHR1KHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9e30pLCFQKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5iYm94LHI9ZS5udW1fdmVydGljZXMsaT1lLm1heF9sZW5ndGgsbz1lLm1heF9yb3RhdGlvbjtudWxsPT10JiYodD0xKSwoIUMocil8fHZvaWQgMD09PXJ8fHI8MikmJihyPTEwKSxDKGkpJiZ2b2lkIDAhPT1pfHwoaT0xZS00KSxDKG8pJiZ2b2lkIDAhPT1vfHwobz1NYXRoLlBJLzgpO2Zvcih2YXIgcz1bXSxhPTA7YTx0O2ErKyl7Zm9yKHZhciB1PVtLYShuKV0sbD0wO2w8ci0xO2wrKyl7dmFyIGM9KDA9PT1sPzIqTWF0aC5yYW5kb20oKSpNYXRoLlBJOk1hdGgudGFuKCh1W2xdWzFdLXVbbC0xXVsxXSkvKHVbbF1bMF0tdVtsLTFdWzBdKSkpKyhNYXRoLnJhbmRvbSgpLS41KSpvKjIscD1NYXRoLnJhbmRvbSgpKmk7dS5wdXNoKFt1W2xdWzBdK3AqTWF0aC5jb3MoYyksdVtsXVsxXStwKk1hdGguc2luKGMpXSl9cy5wdXNoKGgodSkpfXJldHVybiBmKHMpfWZ1bmN0aW9uIGV1KCl7cmV0dXJuIE1hdGgucmFuZG9tKCktLjV9ZnVuY3Rpb24gbnUodCl7cmV0dXJuW01hdGgucmFuZG9tKCkqKHRbMl0tdFswXSkrdFswXSxNYXRoLnJhbmRvbSgpKih0WzNdLXRbMV0pK3RbMV1dfXZhciBydT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyYW5kb21Qb3NpdGlvbjpLYSxyYW5kb21Qb2ludDpRYSxyYW5kb21Qb2x5Z29uOiRhLHJhbmRvbUxpbmVTdHJpbmc6dHV9KTtmdW5jdGlvbiBpdSh0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO2lmKCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIG11c3QgYmUgYSBGZWF0dXJlQ29sbGVjdGlvbiIpO2lmKG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJmaWx0ZXIgaXMgcmVxdWlyZWQiKTt2YXIgbj1bXTtyZXR1cm4gRih0LChmdW5jdGlvbih0KXt1dSh0LnByb3BlcnRpZXMsZSkmJm4ucHVzaCh0KX0pKSxmKG4pfWZ1bmN0aW9uIG91KHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtpZigiRmVhdHVyZUNvbGxlY3Rpb24iIT09dC50eXBlKXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBtdXN0IGJlIGEgRmVhdHVyZUNvbGxlY3Rpb24iKTtpZihudWxsPT1lKXRocm93IG5ldyBFcnJvcigicHJvcGVydHkgaXMgcmVxdWlyZWQiKTtmb3IodmFyIHI9YXUodCxlKSxpPU9iamVjdC5rZXlzKHIpLG89MDtvPGkubGVuZ3RoO28rKyl7Zm9yKHZhciBzPWlbb10sYT1yW3NdLHU9W10sbD0wO2w8YS5sZW5ndGg7bCsrKXUucHVzaCh0LmZlYXR1cmVzW2FbbF1dKTtuKGYodSkscyxvKX19ZnVuY3Rpb24gc3UodCxlLG4scil7dmFyIGk9cjtyZXR1cm4gb3UodCxlLChmdW5jdGlvbih0LGUsbyl7aT0wPT09byYmdm9pZCAwPT09cj90Om4oaSx0LGUsbyl9KSksaX1mdW5jdGlvbiBhdSh0LGUpe3ZhciBuPXt9O3JldHVybiBGKHQsKGZ1bmN0aW9uKHQscil7dmFyIGk9dC5wcm9wZXJ0aWVzfHx7fTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaSxTdHJpbmcoZSkpKXt2YXIgbz1pW2VdO09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLG8pP25bb10ucHVzaChyKTpuW29dPVtyXX19KSksbn1mdW5jdGlvbiB1dSh0LGUpe2lmKHZvaWQgMD09PXQpcmV0dXJuITE7dmFyIG49dHlwZW9mIGU7aWYoIm51bWJlciI9PT1ufHwic3RyaW5nIj09PW4pcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpO2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKCF1dSh0LGVbcl0pKXJldHVybiExO3JldHVybiEwfXJldHVybiBsdSh0LGUpfWZ1bmN0aW9uIGx1KHQsZSl7Zm9yKHZhciBuPU9iamVjdC5rZXlzKGUpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpZih0W2ldIT09ZVtpXSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBjdSh0LGUpe2lmKCFlKXJldHVybnt9O2lmKCFlLmxlbmd0aClyZXR1cm57fTtmb3IodmFyIG49e30scj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdO09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiYobltpXT10W2ldKX1yZXR1cm4gbn12YXIgaHU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0Q2x1c3RlcjppdSxjbHVzdGVyRWFjaDpvdSxjbHVzdGVyUmVkdWNlOnN1LGNyZWF0ZUJpbnM6YXUsYXBwbHlGaWx0ZXI6dXUscHJvcGVydGllc0NvbnRhaW5zRmlsdGVyOmx1LGZpbHRlclByb3BlcnRpZXM6Y3V9KSxwdT1mdW5jdGlvbih0LGUpe3RoaXMubmV4dD1udWxsLHRoaXMua2V5PXQsdGhpcy5kYXRhPWUsdGhpcy5sZWZ0PW51bGwsdGhpcy5yaWdodD1udWxsfTsKLyoqCiAgICAgKiBzcGxheXRyZWUgdjMuMS4wCiAgICAgKiBGYXN0IFNwbGF5IHRyZWUgZm9yIE5vZGUgYW5kIGJyb3dzZXIKICAgICAqCiAgICAgKiBAYXV0aG9yIEFsZXhhbmRlciBNaWxldnNraSA8aW5mb0B3OHIubmFtZT4KICAgICAqIEBsaWNlbnNlIE1JVAogICAgICogQHByZXNlcnZlCiAgICAgKi9mdW5jdGlvbiBmdSh0LGUpe3JldHVybiB0PmU/MTp0PGU/LTE6MH1mdW5jdGlvbiBndSh0LGUsbil7Zm9yKHZhciByPW5ldyBwdShudWxsLG51bGwpLGk9cixvPXI7Oyl7dmFyIHM9bih0LGUua2V5KTtpZihzPDApe2lmKG51bGw9PT1lLmxlZnQpYnJlYWs7aWYobih0LGUubGVmdC5rZXkpPDApe3ZhciBhPWUubGVmdDtpZihlLmxlZnQ9YS5yaWdodCxhLnJpZ2h0PWUsbnVsbD09PShlPWEpLmxlZnQpYnJlYWt9by5sZWZ0PWUsbz1lLGU9ZS5sZWZ0fWVsc2V7aWYoIShzPjApKWJyZWFrO2lmKG51bGw9PT1lLnJpZ2h0KWJyZWFrO2lmKG4odCxlLnJpZ2h0LmtleSk+MCl7YT1lLnJpZ2h0O2lmKGUucmlnaHQ9YS5sZWZ0LGEubGVmdD1lLG51bGw9PT0oZT1hKS5yaWdodClicmVha31pLnJpZ2h0PWUsaT1lLGU9ZS5yaWdodH19cmV0dXJuIGkucmlnaHQ9ZS5sZWZ0LG8ubGVmdD1lLnJpZ2h0LGUubGVmdD1yLnJpZ2h0LGUucmlnaHQ9ci5sZWZ0LGV9ZnVuY3Rpb24gZHUodCxlLG4scil7dmFyIGk9bmV3IHB1KHQsZSk7aWYobnVsbD09PW4pcmV0dXJuIGkubGVmdD1pLnJpZ2h0PW51bGwsaTt2YXIgbz1yKHQsKG49Z3UodCxuLHIpKS5rZXkpO3JldHVybiBvPDA/KGkubGVmdD1uLmxlZnQsaS5yaWdodD1uLG4ubGVmdD1udWxsKTpvPj0wJiYoaS5yaWdodD1uLnJpZ2h0LGkubGVmdD1uLG4ucmlnaHQ9bnVsbCksaX1mdW5jdGlvbiB5dSh0LGUsbil7dmFyIHI9bnVsbCxpPW51bGw7aWYoZSl7dmFyIG89bigoZT1ndSh0LGUsbikpLmtleSx0KTswPT09bz8ocj1lLmxlZnQsaT1lLnJpZ2h0KTpvPDA/KGk9ZS5yaWdodCxlLnJpZ2h0PW51bGwscj1lKToocj1lLmxlZnQsZS5sZWZ0PW51bGwsaT1lKX1yZXR1cm57bGVmdDpyLHJpZ2h0Oml9fWZ1bmN0aW9uIHZ1KHQsZSxuLHIsaSl7aWYodCl7cihlKyhuPyLilJTilIDilIAgIjoi4pSc4pSA4pSAICIpK2kodCkrIlxuIik7dmFyIG89ZSsobj8iICAgICI6IuKUgiAgICIpO3QubGVmdCYmdnUodC5sZWZ0LG8sITEscixpKSx0LnJpZ2h0JiZ2dSh0LnJpZ2h0LG8sITAscixpKX19dmFyIF91PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2b2lkIDA9PT10JiYodD1mdSksdGhpcy5fcm9vdD1udWxsLHRoaXMuX3NpemU9MCx0aGlzLl9jb21wYXJhdG9yPXR9cmV0dXJuIHQucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9zaXplKyssdGhpcy5fcm9vdD1kdSh0LGUsdGhpcy5fcm9vdCx0aGlzLl9jb21wYXJhdG9yKX0sdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IHB1KHQsZSk7bnVsbD09PXRoaXMuX3Jvb3QmJihuLmxlZnQ9bi5yaWdodD1udWxsLHRoaXMuX3NpemUrKyx0aGlzLl9yb290PW4pO3ZhciByPXRoaXMuX2NvbXBhcmF0b3IsaT1ndSh0LHRoaXMuX3Jvb3Qsciksbz1yKHQsaS5rZXkpO3JldHVybiAwPT09bz90aGlzLl9yb290PWk6KG88MD8obi5sZWZ0PWkubGVmdCxuLnJpZ2h0PWksaS5sZWZ0PW51bGwpOm8+MCYmKG4ucmlnaHQ9aS5yaWdodCxuLmxlZnQ9aSxpLnJpZ2h0PW51bGwpLHRoaXMuX3NpemUrKyx0aGlzLl9yb290PW4pLHRoaXMuX3Jvb3R9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt0aGlzLl9yb290PXRoaXMuX3JlbW92ZSh0LHRoaXMuX3Jvb3QsdGhpcy5fY29tcGFyYXRvcil9LHQucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByO3JldHVybiBudWxsPT09ZT9udWxsOjA9PT1uKHQsKGU9Z3UodCxlLG4pKS5rZXkpPyhudWxsPT09ZS5sZWZ0P3I9ZS5yaWdodDoocj1ndSh0LGUubGVmdCxuKSkucmlnaHQ9ZS5yaWdodCx0aGlzLl9zaXplLS0scik6ZX0sdC5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcm9vdDtpZih0KXtmb3IoO3QubGVmdDspdD10LmxlZnQ7cmV0dXJuIHRoaXMuX3Jvb3Q9Z3UodC5rZXksdGhpcy5fcm9vdCx0aGlzLl9jb21wYXJhdG9yKSx0aGlzLl9yb290PXRoaXMuX3JlbW92ZSh0LmtleSx0aGlzLl9yb290LHRoaXMuX2NvbXBhcmF0b3IpLHtrZXk6dC5rZXksZGF0YTp0LmRhdGF9fXJldHVybiBudWxsfSx0LnByb3RvdHlwZS5maW5kU3RhdGljPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9yb290LG49dGhpcy5fY29tcGFyYXRvcjtlOyl7dmFyIHI9bih0LGUua2V5KTtpZigwPT09cilyZXR1cm4gZTtlPXI8MD9lLmxlZnQ6ZS5yaWdodH1yZXR1cm4gbnVsbH0sdC5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcm9vdCYmKHRoaXMuX3Jvb3Q9Z3UodCx0aGlzLl9yb290LHRoaXMuX2NvbXBhcmF0b3IpLDAhPT10aGlzLl9jb21wYXJhdG9yKHQsdGhpcy5fcm9vdC5rZXkpKT9udWxsOnRoaXMuX3Jvb3R9LHQucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9yb290LG49dGhpcy5fY29tcGFyYXRvcjtlOyl7dmFyIHI9bih0LGUua2V5KTtpZigwPT09cilyZXR1cm4hMDtlPXI8MD9lLmxlZnQ6ZS5yaWdodH1yZXR1cm4hMX0sdC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLl9yb290LHI9W10saT0hMTshaTspbnVsbCE9PW4/KHIucHVzaChuKSxuPW4ubGVmdCk6MCE9PXIubGVuZ3RoPyhuPXIucG9wKCksdC5jYWxsKGUsbiksbj1uLnJpZ2h0KTppPSEwO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5yYW5nZT1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9W10sbz10aGlzLl9jb21wYXJhdG9yLHM9dGhpcy5fcm9vdDswIT09aS5sZW5ndGh8fHM7KWlmKHMpaS5wdXNoKHMpLHM9cy5sZWZ0O2Vsc2V7aWYobygocz1pLnBvcCgpKS5rZXksZSk+MClicmVhaztpZihvKHMua2V5LHQpPj0wJiZuLmNhbGwocixzKSlyZXR1cm4gdGhpcztzPXMucmlnaHR9cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmtleXM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLmtleTtyZXR1cm4gdC5wdXNoKG4pfSkpLHR9LHQucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWUuZGF0YTtyZXR1cm4gdC5wdXNoKG4pfSkpLHR9LHQucHJvdG90eXBlLm1pbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290P3RoaXMubWluTm9kZSh0aGlzLl9yb290KS5rZXk6bnVsbH0sdC5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3Q/dGhpcy5tYXhOb2RlKHRoaXMuX3Jvb3QpLmtleTpudWxsfSx0LnByb3RvdHlwZS5taW5Ob2RlPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQmJih0PXRoaXMuX3Jvb3QpLHQpZm9yKDt0LmxlZnQ7KXQ9dC5sZWZ0O3JldHVybiB0fSx0LnByb3RvdHlwZS5tYXhOb2RlPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQmJih0PXRoaXMuX3Jvb3QpLHQpZm9yKDt0LnJpZ2h0Oyl0PXQucmlnaHQ7cmV0dXJuIHR9LHQucHJvdG90eXBlLmF0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9yb290LG49ITEscj0wLGk9W107IW47KWlmKGUpaS5wdXNoKGUpLGU9ZS5sZWZ0O2Vsc2UgaWYoaS5sZW5ndGg+MCl7aWYoZT1pLnBvcCgpLHI9PT10KXJldHVybiBlO3IrKyxlPWUucmlnaHR9ZWxzZSBuPSEwO3JldHVybiBudWxsfSx0LnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3Jvb3Qsbj1udWxsO2lmKHQucmlnaHQpe2ZvcihuPXQucmlnaHQ7bi5sZWZ0OyluPW4ubGVmdDtyZXR1cm4gbn1mb3IodmFyIHI9dGhpcy5fY29tcGFyYXRvcjtlOyl7dmFyIGk9cih0LmtleSxlLmtleSk7aWYoMD09PWkpYnJlYWs7aTwwPyhuPWUsZT1lLmxlZnQpOmU9ZS5yaWdodH1yZXR1cm4gbn0sdC5wcm90b3R5cGUucHJldj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yb290LG49bnVsbDtpZihudWxsIT09dC5sZWZ0KXtmb3Iobj10LmxlZnQ7bi5yaWdodDspbj1uLnJpZ2h0O3JldHVybiBufWZvcih2YXIgcj10aGlzLl9jb21wYXJhdG9yO2U7KXt2YXIgaT1yKHQua2V5LGUua2V5KTtpZigwPT09aSlicmVhaztpPDA/ZT1lLmxlZnQ6KG49ZSxlPWUucmlnaHQpfXJldHVybiBufSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290PW51bGwsdGhpcy5fc2l6ZT0wLHRoaXN9LHQucHJvdG90eXBlLnRvTGlzdD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10LG49W10scj0hMSxpPW5ldyBwdShudWxsLG51bGwpLG89aTtmb3IoOyFyOyllPyhuLnB1c2goZSksZT1lLmxlZnQpOm4ubGVuZ3RoPjA/ZT0oZT1vPW8ubmV4dD1uLnBvcCgpKS5yaWdodDpyPSEwO3JldHVybiBvLm5leHQ9bnVsbCxpLm5leHR9KHRoaXMuX3Jvb3QpfSx0LnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1lJiYoZT1bXSksdm9pZCAwPT09biYmKG49ITEpO3ZhciByPXQubGVuZ3RoLGk9dGhpcy5fY29tcGFyYXRvcjtpZihuJiZFdSh0LGUsMCxyLTEsaSksbnVsbD09PXRoaXMuX3Jvb3QpdGhpcy5fcm9vdD1tdSh0LGUsMCxyKSx0aGlzLl9zaXplPXI7ZWxzZXt2YXIgbz1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IHB1KG51bGwsbnVsbCksaT1yLG89dCxzPWU7Zm9yKDtudWxsIT09byYmbnVsbCE9PXM7KW4oby5rZXkscy5rZXkpPDA/KGkubmV4dD1vLG89by5uZXh0KTooaS5uZXh0PXMscz1zLm5leHQpLGk9aS5uZXh0O251bGwhPT1vP2kubmV4dD1vOm51bGwhPT1zJiYoaS5uZXh0PXMpO3JldHVybiByLm5leHR9KHRoaXMudG9MaXN0KCksZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IHB1KG51bGwsbnVsbCkscj1uLGk9MDtpPHQubGVuZ3RoO2krKylyPXIubmV4dD1uZXcgcHUodFtpXSxlW2ldKTtyZXR1cm4gci5uZXh0PW51bGwsbi5uZXh0fSh0LGUpLGkpO3I9dGhpcy5fc2l6ZStyLHRoaXMuX3Jvb3Q9eHUoe2hlYWQ6b30sMCxyKX1yZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fcm9vdH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NpemV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJyb290Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0LmtleSl9KTt2YXIgZT1bXTtyZXR1cm4gdnUodGhpcy5fcm9vdCwiIiwhMCwoZnVuY3Rpb24odCl7cmV0dXJuIGUucHVzaCh0KX0pLHQpLGUuam9pbigiIil9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5fY29tcGFyYXRvcixpPXl1KHQsdGhpcy5fcm9vdCxyKSxvPWkubGVmdCxzPWkucmlnaHQ7cih0LGUpPDA/cz1kdShlLG4scyxyKTpvPWR1KGUsbixvLHIpLHRoaXMuX3Jvb3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT09ZT90OihudWxsPT09dHx8KChlPWd1KHQua2V5LGUsbikpLmxlZnQ9dCksZSl9KG8scyxyKX0sdC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHl1KHQsdGhpcy5fcm9vdCx0aGlzLl9jb21wYXJhdG9yKX0sdH0oKTtmdW5jdGlvbiBtdSh0LGUsbixyKXt2YXIgaT1yLW47aWYoaT4wKXt2YXIgbz1uK01hdGguZmxvb3IoaS8yKSxzPXRbb10sYT1lW29dLHU9bmV3IHB1KHMsYSk7cmV0dXJuIHUubGVmdD1tdSh0LGUsbixvKSx1LnJpZ2h0PW11KHQsZSxvKzEsciksdX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB4dSh0LGUsbil7dmFyIHI9bi1lO2lmKHI+MCl7dmFyIGk9ZStNYXRoLmZsb29yKHIvMiksbz14dSh0LGUsaSkscz10LmhlYWQ7cmV0dXJuIHMubGVmdD1vLHQuaGVhZD10LmhlYWQubmV4dCxzLnJpZ2h0PXh1KHQsaSsxLG4pLHN9cmV0dXJuIG51bGx9ZnVuY3Rpb24gRXUodCxlLG4scixpKXtpZighKG4+PXIpKXtmb3IodmFyIG89dFtuK3I+PjFdLHM9bi0xLGE9cisxOzspe2Rve3MrK313aGlsZShpKHRbc10sbyk8MCk7ZG97YS0tfXdoaWxlKGkodFthXSxvKT4wKTtpZihzPj1hKWJyZWFrO3ZhciB1PXRbc107dFtzXT10W2FdLHRbYV09dSx1PWVbc10sZVtzXT1lW2FdLGVbYV09dX1FdSh0LGUsbixhLGkpLEV1KHQsZSxhKzEscixpKX19ZnVuY3Rpb24gYnUodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiB3dSh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIEl1KHQsZSxuKXtyZXR1cm4gZSYmd3UodC5wcm90b3R5cGUsZSksbiYmd3UodCxuKSx0fXZhciBOdT1mdW5jdGlvbih0LGUpe3JldHVybiB0LmxsLng8PWUueCYmZS54PD10LnVyLngmJnQubGwueTw9ZS55JiZlLnk8PXQudXIueX0sU3U9ZnVuY3Rpb24odCxlKXtpZihlLnVyLng8dC5sbC54fHx0LnVyLng8ZS5sbC54fHxlLnVyLnk8dC5sbC55fHx0LnVyLnk8ZS5sbC55KXJldHVybiBudWxsO3ZhciBuPXQubGwueDxlLmxsLng/ZS5sbC54OnQubGwueCxyPXQudXIueDxlLnVyLng/dC51ci54OmUudXIueDtyZXR1cm57bGw6e3g6bix5OnQubGwueTxlLmxsLnk/ZS5sbC55OnQubGwueX0sdXI6e3g6cix5OnQudXIueTxlLnVyLnk/dC51ci55OmUudXIueX19fSxDdT1OdW1iZXIuRVBTSUxPTjt2b2lkIDA9PT1DdSYmKEN1PU1hdGgucG93KDIsLTUyKSk7dmFyIFB1PUN1KkN1LE11PWZ1bmN0aW9uKHQsZSl7aWYoLUN1PHQmJnQ8Q3UmJi1DdTxlJiZlPEN1KXJldHVybiAwO3ZhciBuPXQtZTtyZXR1cm4gbipuPFB1KnQqZT8wOnQ8ZT8tMToxfSxMdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtidSh0aGlzLHQpLHRoaXMucmVzZXQoKX1yZXR1cm4gSXUodCxbe2tleToicmVzZXQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy54Um91bmRlcj1uZXcgT3UsdGhpcy55Um91bmRlcj1uZXcgT3V9fSx7a2V5OiJyb3VuZCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm57eDp0aGlzLnhSb3VuZGVyLnJvdW5kKHQpLHk6dGhpcy55Um91bmRlci5yb3VuZChlKX19fV0pLHR9KCksT3U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7YnUodGhpcyx0KSx0aGlzLnRyZWU9bmV3IF91LHRoaXMucm91bmQoMCl9cmV0dXJuIEl1KHQsW3trZXk6InJvdW5kIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnRyZWUuYWRkKHQpLG49dGhpcy50cmVlLnByZXYoZSk7aWYobnVsbCE9PW4mJjA9PT1NdShlLmtleSxuLmtleSkpcmV0dXJuIHRoaXMudHJlZS5yZW1vdmUodCksbi5rZXk7dmFyIHI9dGhpcy50cmVlLm5leHQoZSk7cmV0dXJuIG51bGwhPT1yJiYwPT09TXUoZS5rZXksci5rZXkpPyh0aGlzLnRyZWUucmVtb3ZlKHQpLHIua2V5KTp0fX1dKSx0fSgpLFJ1PW5ldyBMdSxUdT1mdW5jdGlvbih0LGUpe3JldHVybiB0LngqZS55LXQueSplLnh9LEF1PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueCplLngrdC55KmUueX0sRHU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXt4OmUueC10LngseTplLnktdC55fSxpPXt4Om4ueC10LngseTpuLnktdC55fSxvPVR1KHIsaSk7cmV0dXJuIE11KG8sMCl9LEZ1PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoQXUodCx0KSl9LGt1PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj17eDplLngtdC54LHk6ZS55LXQueX0saT17eDpuLngtdC54LHk6bi55LXQueX07cmV0dXJuIEF1KGkscikvRnUoaSkvRnUocil9LEd1PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMD09PWUueT9udWxsOnt4OnQueCtlLngvZS55KihuLXQueSkseTpufX0scXU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiAwPT09ZS54P251bGw6e3g6bix5OnQueStlLnkvZS54KihuLXQueCl9fSxCdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtidSh0aGlzLHQpLHZvaWQgMD09PWUuZXZlbnRzP2UuZXZlbnRzPVt0aGlzXTplLmV2ZW50cy5wdXNoKHRoaXMpLHRoaXMucG9pbnQ9ZSx0aGlzLmlzTGVmdD1ufXJldHVybiBJdSh0LG51bGwsW3trZXk6ImNvbXBhcmUiLHZhbHVlOmZ1bmN0aW9uKGUsbil7dmFyIHI9dC5jb21wYXJlUG9pbnRzKGUucG9pbnQsbi5wb2ludCk7cmV0dXJuIDAhPT1yP3I6KGUucG9pbnQhPT1uLnBvaW50JiZlLmxpbmsobiksZS5pc0xlZnQhPT1uLmlzTGVmdD9lLmlzTGVmdD8xOi0xOmp1LmNvbXBhcmUoZS5zZWdtZW50LG4uc2VnbWVudCkpfX0se2tleToiY29tcGFyZVBvaW50cyIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC54PGUueD8tMTp0Lng+ZS54PzE6dC55PGUueT8tMTp0Lnk+ZS55PzE6MH19XSksSXUodCxbe2tleToibGluayIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodC5wb2ludD09PXRoaXMucG9pbnQpdGhyb3cgbmV3IEVycm9yKCJUcmllZCB0byBsaW5rIGFscmVhZHkgbGlua2VkIGV2ZW50cyIpO2Zvcih2YXIgZT10LnBvaW50LmV2ZW50cyxuPTAscj1lLmxlbmd0aDtuPHI7bisrKXt2YXIgaT1lW25dO3RoaXMucG9pbnQuZXZlbnRzLnB1c2goaSksaS5wb2ludD10aGlzLnBvaW50fXRoaXMuY2hlY2tGb3JDb25zdW1pbmcoKX19LHtrZXk6ImNoZWNrRm9yQ29uc3VtaW5nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnBvaW50LmV2ZW50cy5sZW5ndGgsZT0wO2U8dDtlKyspe3ZhciBuPXRoaXMucG9pbnQuZXZlbnRzW2VdO2lmKHZvaWQgMD09PW4uc2VnbWVudC5jb25zdW1lZEJ5KWZvcih2YXIgcj1lKzE7cjx0O3IrKyl7dmFyIGk9dGhpcy5wb2ludC5ldmVudHNbcl07dm9pZCAwPT09aS5jb25zdW1lZEJ5JiYobi5vdGhlclNFLnBvaW50LmV2ZW50cz09PWkub3RoZXJTRS5wb2ludC5ldmVudHMmJm4uc2VnbWVudC5jb25zdW1lKGkuc2VnbWVudCkpfX19fSx7a2V5OiJnZXRBdmFpbGFibGVMaW5rZWRFdmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMucG9pbnQuZXZlbnRzLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLnBvaW50LmV2ZW50c1tlXTtyIT09dGhpcyYmIXIuc2VnbWVudC5yaW5nT3V0JiZyLnNlZ21lbnQuaXNJblJlc3VsdCgpJiZ0LnB1c2gocil9cmV0dXJuIHR9fSx7a2V5OiJnZXRMZWZ0bW9zdENvbXBhcmF0b3IiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1uZXcgTWFwLHI9ZnVuY3Rpb24ocil7dmFyIGksbyxzLGEsdSxsPXIub3RoZXJTRTtuLnNldChyLHtzaW5lOihpPWUucG9pbnQsbz10LnBvaW50LHM9bC5wb2ludCxhPXt4Om8ueC1pLngseTpvLnktaS55fSx1PXt4OnMueC1pLngseTpzLnktaS55fSxUdSh1LGEpL0Z1KHUpL0Z1KGEpKSxjb3NpbmU6a3UoZS5wb2ludCx0LnBvaW50LGwucG9pbnQpfSl9O3JldHVybiBmdW5jdGlvbih0LGUpe24uaGFzKHQpfHxyKHQpLG4uaGFzKGUpfHxyKGUpO3ZhciBpPW4uZ2V0KHQpLG89aS5zaW5lLHM9aS5jb3NpbmUsYT1uLmdldChlKSx1PWEuc2luZSxsPWEuY29zaW5lO3JldHVybiBvPj0wJiZ1Pj0wP3M8bD8xOnM+bD8tMTowOm88MCYmdTwwP3M8bD8tMTpzPmw/MTowOnU8bz8tMTp1Pm8/MTowfX19XSksdH0oKSx6dT0wLGp1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4scixpKXtidSh0aGlzLHQpLHRoaXMuaWQ9Kyt6dSx0aGlzLmxlZnRTRT1lLGUuc2VnbWVudD10aGlzLGUub3RoZXJTRT1uLHRoaXMucmlnaHRTRT1uLG4uc2VnbWVudD10aGlzLG4ub3RoZXJTRT1lLHRoaXMucmluZ3M9cix0aGlzLndpbmRpbmdzPWl9cmV0dXJuIEl1KHQsbnVsbCxbe2tleToiY29tcGFyZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10LmxlZnRTRS5wb2ludC54LHI9ZS5sZWZ0U0UucG9pbnQueCxpPXQucmlnaHRTRS5wb2ludC54LG89ZS5yaWdodFNFLnBvaW50Lng7aWYobzxuKXJldHVybiAxO2lmKGk8cilyZXR1cm4tMTt2YXIgcz10LmxlZnRTRS5wb2ludC55LGE9ZS5sZWZ0U0UucG9pbnQueSx1PXQucmlnaHRTRS5wb2ludC55LGw9ZS5yaWdodFNFLnBvaW50Lnk7aWYobjxyKXtpZihhPHMmJmE8dSlyZXR1cm4gMTtpZihhPnMmJmE+dSlyZXR1cm4tMTt2YXIgYz10LmNvbXBhcmVQb2ludChlLmxlZnRTRS5wb2ludCk7aWYoYzwwKXJldHVybiAxO2lmKGM+MClyZXR1cm4tMTt2YXIgaD1lLmNvbXBhcmVQb2ludCh0LnJpZ2h0U0UucG9pbnQpO3JldHVybiAwIT09aD9oOi0xfWlmKG4+cil7aWYoczxhJiZzPGwpcmV0dXJuLTE7aWYocz5hJiZzPmwpcmV0dXJuIDE7dmFyIHA9ZS5jb21wYXJlUG9pbnQodC5sZWZ0U0UucG9pbnQpO2lmKDAhPT1wKXJldHVybiBwO3ZhciBmPXQuY29tcGFyZVBvaW50KGUucmlnaHRTRS5wb2ludCk7cmV0dXJuIGY8MD8xOmY+MD8tMToxfWlmKHM8YSlyZXR1cm4tMTtpZihzPmEpcmV0dXJuIDE7aWYoaTxvKXt2YXIgZz1lLmNvbXBhcmVQb2ludCh0LnJpZ2h0U0UucG9pbnQpO2lmKDAhPT1nKXJldHVybiBnfWlmKGk+byl7dmFyIGQ9dC5jb21wYXJlUG9pbnQoZS5yaWdodFNFLnBvaW50KTtpZihkPDApcmV0dXJuIDE7aWYoZD4wKXJldHVybi0xfWlmKGkhPT1vKXt2YXIgeT11LXMsdj1pLW4sXz1sLWEsbT1vLXI7aWYoeT52JiZfPG0pcmV0dXJuIDE7aWYoeTx2JiZfPm0pcmV0dXJuLTF9cmV0dXJuIGk+bz8xOmk8b3x8dTxsPy0xOnU+bD8xOnQuaWQ8ZS5pZD8tMTp0LmlkPmUuaWQ/MTowfX1dKSxJdSh0LFt7a2V5OiJyZXBsYWNlUmlnaHRTRSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5yaWdodFNFPXQsdGhpcy5yaWdodFNFLnNlZ21lbnQ9dGhpcyx0aGlzLnJpZ2h0U0Uub3RoZXJTRT10aGlzLmxlZnRTRSx0aGlzLmxlZnRTRS5vdGhlclNFPXRoaXMucmlnaHRTRX19LHtrZXk6ImJib3giLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZWZ0U0UucG9pbnQueSxlPXRoaXMucmlnaHRTRS5wb2ludC55O3JldHVybntsbDp7eDp0aGlzLmxlZnRTRS5wb2ludC54LHk6dDxlP3Q6ZX0sdXI6e3g6dGhpcy5yaWdodFNFLnBvaW50LngseTp0PmU/dDplfX19fSx7a2V5OiJ2ZWN0b3IiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3g6dGhpcy5yaWdodFNFLnBvaW50LngtdGhpcy5sZWZ0U0UucG9pbnQueCx5OnRoaXMucmlnaHRTRS5wb2ludC55LXRoaXMubGVmdFNFLnBvaW50Lnl9fX0se2tleToiaXNBbkVuZHBvaW50Iix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdC54PT09dGhpcy5sZWZ0U0UucG9pbnQueCYmdC55PT09dGhpcy5sZWZ0U0UucG9pbnQueXx8dC54PT09dGhpcy5yaWdodFNFLnBvaW50LngmJnQueT09PXRoaXMucmlnaHRTRS5wb2ludC55fX0se2tleToiY29tcGFyZVBvaW50Iix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLmlzQW5FbmRwb2ludCh0KSlyZXR1cm4gMDt2YXIgZT10aGlzLmxlZnRTRS5wb2ludCxuPXRoaXMucmlnaHRTRS5wb2ludCxyPXRoaXMudmVjdG9yKCk7aWYoZS54PT09bi54KXJldHVybiB0Lng9PT1lLng/MDp0Lng8ZS54PzE6LTE7dmFyIGk9KHQueS1lLnkpL3IueSxvPWUueCtpKnIueDtpZih0Lng9PT1vKXJldHVybiAwO3ZhciBzPSh0LngtZS54KS9yLngsYT1lLnkrcypyLnk7cmV0dXJuIHQueT09PWE/MDp0Lnk8YT8tMToxfX0se2tleToiZ2V0SW50ZXJzZWN0aW9uIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmJib3goKSxuPXQuYmJveCgpLHI9U3UoZSxuKTtpZihudWxsPT09cilyZXR1cm4gbnVsbDt2YXIgaT10aGlzLmxlZnRTRS5wb2ludCxvPXRoaXMucmlnaHRTRS5wb2ludCxzPXQubGVmdFNFLnBvaW50LGE9dC5yaWdodFNFLnBvaW50LHU9TnUoZSxzKSYmMD09PXRoaXMuY29tcGFyZVBvaW50KHMpLGw9TnUobixpKSYmMD09PXQuY29tcGFyZVBvaW50KGkpLGM9TnUoZSxhKSYmMD09PXRoaXMuY29tcGFyZVBvaW50KGEpLGg9TnUobixvKSYmMD09PXQuY29tcGFyZVBvaW50KG8pO2lmKGwmJnUpcmV0dXJuIGgmJiFjP286IWgmJmM/YTpudWxsO2lmKGwpcmV0dXJuIGMmJmkueD09PWEueCYmaS55PT09YS55P251bGw6aTtpZih1KXJldHVybiBoJiZvLng9PT1zLngmJm8ueT09PXMueT9udWxsOnM7aWYoaCYmYylyZXR1cm4gbnVsbDtpZihoKXJldHVybiBvO2lmKGMpcmV0dXJuIGE7dmFyIHA9ZnVuY3Rpb24odCxlLG4scil7aWYoMD09PWUueClyZXR1cm4gcXUobixyLHQueCk7aWYoMD09PXIueClyZXR1cm4gcXUodCxlLG4ueCk7aWYoMD09PWUueSlyZXR1cm4gR3UobixyLHQueSk7aWYoMD09PXIueSlyZXR1cm4gR3UodCxlLG4ueSk7dmFyIGk9VHUoZSxyKTtpZigwPT1pKXJldHVybiBudWxsO3ZhciBvPXt4Om4ueC10LngseTpuLnktdC55fSxzPVR1KG8sZSkvaSxhPVR1KG8scikvaTtyZXR1cm57eDoodC54K2EqZS54KyhuLngrcypyLngpKS8yLHk6KHQueSthKmUueSsobi55K3Mqci55KSkvMn19KGksdGhpcy52ZWN0b3IoKSxzLHQudmVjdG9yKCkpO3JldHVybiBudWxsPT09cD9udWxsOk51KHIscCk/UnUucm91bmQocC54LHAueSk6bnVsbH19LHtrZXk6InNwbGl0Iix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgbj1bXSxyPXZvaWQgMCE9PWUuZXZlbnRzLGk9bmV3IEJ1KGUsITApLG89bmV3IEJ1KGUsITEpLHM9dGhpcy5yaWdodFNFO3RoaXMucmVwbGFjZVJpZ2h0U0Uobyksbi5wdXNoKG8pLG4ucHVzaChpKTt2YXIgYT1uZXcgdChpLHMsdGhpcy5yaW5ncy5zbGljZSgpLHRoaXMud2luZGluZ3Muc2xpY2UoKSk7cmV0dXJuIEJ1LmNvbXBhcmVQb2ludHMoYS5sZWZ0U0UucG9pbnQsYS5yaWdodFNFLnBvaW50KT4wJiZhLnN3YXBFdmVudHMoKSxCdS5jb21wYXJlUG9pbnRzKHRoaXMubGVmdFNFLnBvaW50LHRoaXMucmlnaHRTRS5wb2ludCk+MCYmdGhpcy5zd2FwRXZlbnRzKCksciYmKGkuY2hlY2tGb3JDb25zdW1pbmcoKSxvLmNoZWNrRm9yQ29uc3VtaW5nKCkpLG59fSx7a2V5OiJzd2FwRXZlbnRzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmlnaHRTRTt0aGlzLnJpZ2h0U0U9dGhpcy5sZWZ0U0UsdGhpcy5sZWZ0U0U9dCx0aGlzLmxlZnRTRS5pc0xlZnQ9ITAsdGhpcy5yaWdodFNFLmlzTGVmdD0hMTtmb3IodmFyIGU9MCxuPXRoaXMud2luZGluZ3MubGVuZ3RoO2U8bjtlKyspdGhpcy53aW5kaW5nc1tlXSo9LTF9fSx7a2V5OiJjb25zdW1lIix2YWx1ZTpmdW5jdGlvbihlKXtmb3IodmFyIG49dGhpcyxyPWU7bi5jb25zdW1lZEJ5OyluPW4uY29uc3VtZWRCeTtmb3IoO3IuY29uc3VtZWRCeTspcj1yLmNvbnN1bWVkQnk7dmFyIGk9dC5jb21wYXJlKG4scik7aWYoMCE9PWkpe2lmKGk+MCl7dmFyIG89bjtuPXIscj1vfWlmKG4ucHJldj09PXIpe3ZhciBzPW47bj1yLHI9c31mb3IodmFyIGE9MCx1PXIucmluZ3MubGVuZ3RoO2E8dTthKyspe3ZhciBsPXIucmluZ3NbYV0sYz1yLndpbmRpbmdzW2FdLGg9bi5yaW5ncy5pbmRleE9mKGwpOy0xPT09aD8obi5yaW5ncy5wdXNoKGwpLG4ud2luZGluZ3MucHVzaChjKSk6bi53aW5kaW5nc1toXSs9Y31yLnJpbmdzPW51bGwsci53aW5kaW5ncz1udWxsLHIuY29uc3VtZWRCeT1uLHIubGVmdFNFLmNvbnN1bWVkQnk9bi5sZWZ0U0Usci5yaWdodFNFLmNvbnN1bWVkQnk9bi5yaWdodFNFfX19LHtrZXk6InByZXZJblJlc3VsdCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcHJldkluUmVzdWx0fHwodGhpcy5wcmV2P3RoaXMucHJldi5pc0luUmVzdWx0KCk/dGhpcy5fcHJldkluUmVzdWx0PXRoaXMucHJldjp0aGlzLl9wcmV2SW5SZXN1bHQ9dGhpcy5wcmV2LnByZXZJblJlc3VsdCgpOnRoaXMuX3ByZXZJblJlc3VsdD1udWxsKSx0aGlzLl9wcmV2SW5SZXN1bHR9fSx7a2V5OiJiZWZvcmVTdGF0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT10aGlzLl9iZWZvcmVTdGF0ZSlyZXR1cm4gdGhpcy5fYmVmb3JlU3RhdGU7aWYodGhpcy5wcmV2KXt2YXIgdD10aGlzLnByZXYuY29uc3VtZWRCeXx8dGhpcy5wcmV2O3RoaXMuX2JlZm9yZVN0YXRlPXQuYWZ0ZXJTdGF0ZSgpfWVsc2UgdGhpcy5fYmVmb3JlU3RhdGU9e3JpbmdzOltdLHdpbmRpbmdzOltdLG11bHRpUG9seXM6W119O3JldHVybiB0aGlzLl9iZWZvcmVTdGF0ZX19LHtrZXk6ImFmdGVyU3RhdGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodm9pZCAwIT09dGhpcy5fYWZ0ZXJTdGF0ZSlyZXR1cm4gdGhpcy5fYWZ0ZXJTdGF0ZTt2YXIgdD10aGlzLmJlZm9yZVN0YXRlKCk7dGhpcy5fYWZ0ZXJTdGF0ZT17cmluZ3M6dC5yaW5ncy5zbGljZSgwKSx3aW5kaW5nczp0LndpbmRpbmdzLnNsaWNlKDApLG11bHRpUG9seXM6W119O2Zvcih2YXIgZT10aGlzLl9hZnRlclN0YXRlLnJpbmdzLG49dGhpcy5fYWZ0ZXJTdGF0ZS53aW5kaW5ncyxyPXRoaXMuX2FmdGVyU3RhdGUubXVsdGlQb2x5cyxpPTAsbz10aGlzLnJpbmdzLmxlbmd0aDtpPG87aSsrKXt2YXIgcz10aGlzLnJpbmdzW2ldLGE9dGhpcy53aW5kaW5nc1tpXSx1PWUuaW5kZXhPZihzKTstMT09PXU/KGUucHVzaChzKSxuLnB1c2goYSkpOm5bdV0rPWF9Zm9yKHZhciBsPVtdLGM9W10saD0wLHA9ZS5sZW5ndGg7aDxwO2grKylpZigwIT09bltoXSl7dmFyIGY9ZVtoXSxnPWYucG9seTtpZigtMT09PWMuaW5kZXhPZihnKSlpZihmLmlzRXh0ZXJpb3IpbC5wdXNoKGcpO2Vsc2V7LTE9PT1jLmluZGV4T2YoZykmJmMucHVzaChnKTt2YXIgZD1sLmluZGV4T2YoZi5wb2x5KTstMSE9PWQmJmwuc3BsaWNlKGQsMSl9fWZvcih2YXIgeT0wLHY9bC5sZW5ndGg7eTx2O3krKyl7dmFyIF89bFt5XS5tdWx0aVBvbHk7LTE9PT1yLmluZGV4T2YoXykmJnIucHVzaChfKX1yZXR1cm4gdGhpcy5fYWZ0ZXJTdGF0ZX19LHtrZXk6ImlzSW5SZXN1bHQiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5jb25zdW1lZEJ5KXJldHVybiExO2lmKHZvaWQgMCE9PXRoaXMuX2lzSW5SZXN1bHQpcmV0dXJuIHRoaXMuX2lzSW5SZXN1bHQ7dmFyIHQ9dGhpcy5iZWZvcmVTdGF0ZSgpLm11bHRpUG9seXMsZT10aGlzLmFmdGVyU3RhdGUoKS5tdWx0aVBvbHlzO3N3aXRjaChRdS50eXBlKXtjYXNlInVuaW9uIjp2YXIgbj0wPT09dC5sZW5ndGgscj0wPT09ZS5sZW5ndGg7dGhpcy5faXNJblJlc3VsdD1uIT09cjticmVhaztjYXNlImludGVyc2VjdGlvbiI6dmFyIGksbzt0Lmxlbmd0aDxlLmxlbmd0aD8oaT10Lmxlbmd0aCxvPWUubGVuZ3RoKTooaT1lLmxlbmd0aCxvPXQubGVuZ3RoKSx0aGlzLl9pc0luUmVzdWx0PW89PT1RdS5udW1NdWx0aVBvbHlzJiZpPG87YnJlYWs7Y2FzZSJ4b3IiOnZhciBzPU1hdGguYWJzKHQubGVuZ3RoLWUubGVuZ3RoKTt0aGlzLl9pc0luUmVzdWx0PXMlMj09MTticmVhaztjYXNlImRpZmZlcmVuY2UiOnZhciBhPWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5sZW5ndGgmJnRbMF0uaXNTdWJqZWN0fTt0aGlzLl9pc0luUmVzdWx0PWEodCkhPT1hKGUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgb3BlcmF0aW9uIHR5cGUgZm91bmQgIi5jb25jYXQoUXUudHlwZSkpfXJldHVybiB0aGlzLl9pc0luUmVzdWx0fX1dLFt7a2V5OiJmcm9tUmluZyIsdmFsdWU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8scyxhPUJ1LmNvbXBhcmVQb2ludHMoZSxuKTtpZihhPDApaT1lLG89bixzPTE7ZWxzZXtpZighKGE+MCkpdGhyb3cgbmV3IEVycm9yKCJUcmllZCB0byBjcmVhdGUgZGVnZW5lcmF0ZSBzZWdtZW50IGF0IFsiLmNvbmNhdChlLngsIiwgIikuY29uY2F0KGUueSwiXSIpKTtpPW4sbz1lLHM9LTF9cmV0dXJuIG5ldyB0KG5ldyBCdShpLCEwKSxuZXcgQnUobywhMSksW3JdLFtzXSl9fV0pLHR9KCksVXU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixyKXtpZihidSh0aGlzLHQpLCFBcnJheS5pc0FycmF5KGUpfHwwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBnZW9tZXRyeSBpcyBub3QgYSB2YWxpZCBQb2x5Z29uIG9yIE11bHRpUG9seWdvbiIpO2lmKHRoaXMucG9seT1uLHRoaXMuaXNFeHRlcmlvcj1yLHRoaXMuc2VnbWVudHM9W10sIm51bWJlciIhPXR5cGVvZiBlWzBdWzBdfHwibnVtYmVyIiE9dHlwZW9mIGVbMF1bMV0pdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBnZW9tZXRyeSBpcyBub3QgYSB2YWxpZCBQb2x5Z29uIG9yIE11bHRpUG9seWdvbiIpO3ZhciBpPVJ1LnJvdW5kKGVbMF1bMF0sZVswXVsxXSk7dGhpcy5iYm94PXtsbDp7eDppLngseTppLnl9LHVyOnt4OmkueCx5OmkueX19O2Zvcih2YXIgbz1pLHM9MSxhPWUubGVuZ3RoO3M8YTtzKyspe2lmKCJudW1iZXIiIT10eXBlb2YgZVtzXVswXXx8Im51bWJlciIhPXR5cGVvZiBlW3NdWzFdKXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ2VvbWV0cnkgaXMgbm90IGEgdmFsaWQgUG9seWdvbiBvciBNdWx0aVBvbHlnb24iKTt2YXIgdT1SdS5yb3VuZChlW3NdWzBdLGVbc11bMV0pO3UueD09PW8ueCYmdS55PT09by55fHwodGhpcy5zZWdtZW50cy5wdXNoKGp1LmZyb21SaW5nKG8sdSx0aGlzKSksdS54PHRoaXMuYmJveC5sbC54JiYodGhpcy5iYm94LmxsLng9dS54KSx1Lnk8dGhpcy5iYm94LmxsLnkmJih0aGlzLmJib3gubGwueT11LnkpLHUueD50aGlzLmJib3gudXIueCYmKHRoaXMuYmJveC51ci54PXUueCksdS55PnRoaXMuYmJveC51ci55JiYodGhpcy5iYm94LnVyLnk9dS55KSxvPXUpfWkueD09PW8ueCYmaS55PT09by55fHx0aGlzLnNlZ21lbnRzLnB1c2goanUuZnJvbVJpbmcobyxpLHRoaXMpKX1yZXR1cm4gSXUodCxbe2tleToiZ2V0U3dlZXBFdmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuc2VnbWVudHMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuc2VnbWVudHNbZV07dC5wdXNoKHIubGVmdFNFKSx0LnB1c2goci5yaWdodFNFKX1yZXR1cm4gdH19XSksdH0oKSxWdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtpZihidSh0aGlzLHQpLCFBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ2VvbWV0cnkgaXMgbm90IGEgdmFsaWQgUG9seWdvbiBvciBNdWx0aVBvbHlnb24iKTt0aGlzLmV4dGVyaW9yUmluZz1uZXcgVXUoZVswXSx0aGlzLCEwKSx0aGlzLmJib3g9e2xsOnt4OnRoaXMuZXh0ZXJpb3JSaW5nLmJib3gubGwueCx5OnRoaXMuZXh0ZXJpb3JSaW5nLmJib3gubGwueX0sdXI6e3g6dGhpcy5leHRlcmlvclJpbmcuYmJveC51ci54LHk6dGhpcy5leHRlcmlvclJpbmcuYmJveC51ci55fX0sdGhpcy5pbnRlcmlvclJpbmdzPVtdO2Zvcih2YXIgcj0xLGk9ZS5sZW5ndGg7cjxpO3IrKyl7dmFyIG89bmV3IFV1KGVbcl0sdGhpcywhMSk7by5iYm94LmxsLng8dGhpcy5iYm94LmxsLngmJih0aGlzLmJib3gubGwueD1vLmJib3gubGwueCksby5iYm94LmxsLnk8dGhpcy5iYm94LmxsLnkmJih0aGlzLmJib3gubGwueT1vLmJib3gubGwueSksby5iYm94LnVyLng+dGhpcy5iYm94LnVyLngmJih0aGlzLmJib3gudXIueD1vLmJib3gudXIueCksby5iYm94LnVyLnk+dGhpcy5iYm94LnVyLnkmJih0aGlzLmJib3gudXIueT1vLmJib3gudXIueSksdGhpcy5pbnRlcmlvclJpbmdzLnB1c2gobyl9dGhpcy5tdWx0aVBvbHk9bn1yZXR1cm4gSXUodCxbe2tleToiZ2V0U3dlZXBFdmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZXh0ZXJpb3JSaW5nLmdldFN3ZWVwRXZlbnRzKCksZT0wLG49dGhpcy5pbnRlcmlvclJpbmdzLmxlbmd0aDtlPG47ZSsrKWZvcih2YXIgcj10aGlzLmludGVyaW9yUmluZ3NbZV0uZ2V0U3dlZXBFdmVudHMoKSxpPTAsbz1yLmxlbmd0aDtpPG87aSsrKXQucHVzaChyW2ldKTtyZXR1cm4gdH19XSksdH0oKSxYdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtpZihidSh0aGlzLHQpLCFBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ2VvbWV0cnkgaXMgbm90IGEgdmFsaWQgUG9seWdvbiBvciBNdWx0aVBvbHlnb24iKTt0cnl7Im51bWJlciI9PXR5cGVvZiBlWzBdWzBdWzBdJiYoZT1bZV0pfWNhdGNoKHQpe310aGlzLnBvbHlzPVtdLHRoaXMuYmJveD17bGw6e3g6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHk6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfSx1cjp7eDpOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkseTpOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFl9fTtmb3IodmFyIHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5ldyBWdShlW3JdLHRoaXMpO28uYmJveC5sbC54PHRoaXMuYmJveC5sbC54JiYodGhpcy5iYm94LmxsLng9by5iYm94LmxsLngpLG8uYmJveC5sbC55PHRoaXMuYmJveC5sbC55JiYodGhpcy5iYm94LmxsLnk9by5iYm94LmxsLnkpLG8uYmJveC51ci54PnRoaXMuYmJveC51ci54JiYodGhpcy5iYm94LnVyLng9by5iYm94LnVyLngpLG8uYmJveC51ci55PnRoaXMuYmJveC51ci55JiYodGhpcy5iYm94LnVyLnk9by5iYm94LnVyLnkpLHRoaXMucG9seXMucHVzaChvKX10aGlzLmlzU3ViamVjdD1ufXJldHVybiBJdSh0LFt7a2V5OiJnZXRTd2VlcEV2ZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5wb2x5cy5sZW5ndGg7ZTxuO2UrKylmb3IodmFyIHI9dGhpcy5wb2x5c1tlXS5nZXRTd2VlcEV2ZW50cygpLGk9MCxvPXIubGVuZ3RoO2k8bztpKyspdC5wdXNoKHJbaV0pO3JldHVybiB0fX1dKSx0fSgpLFl1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtidSh0aGlzLHQpLHRoaXMuZXZlbnRzPWU7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0uc2VnbWVudC5yaW5nT3V0PXRoaXM7dGhpcy5wb2x5PW51bGx9cmV0dXJuIEl1KHQsbnVsbCxbe2tleToiZmFjdG9yeSIsdmFsdWU6ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPVtdLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBvPWVbcl07aWYoby5pc0luUmVzdWx0KCkmJiFvLnJpbmdPdXQpe2Zvcih2YXIgcz1udWxsLGE9by5sZWZ0U0UsdT1vLnJpZ2h0U0UsbD1bYV0sYz1hLnBvaW50LGg9W107cz1hLGE9dSxsLnB1c2goYSksYS5wb2ludCE9PWM7KWZvcig7Oyl7dmFyIHA9YS5nZXRBdmFpbGFibGVMaW5rZWRFdmVudHMoKTtpZigwPT09cC5sZW5ndGgpe3ZhciBmPWxbMF0ucG9pbnQsZz1sW2wubGVuZ3RoLTFdLnBvaW50O3Rocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNvbXBsZXRlIG91dHB1dCByaW5nIHN0YXJ0aW5nIGF0IFsiLmNvbmNhdChmLngsIiwiKSsiICIuY29uY2F0KGYueSwiXS4gTGFzdCBtYXRjaGluZyBzZWdtZW50IGZvdW5kIGVuZHMgYXQiKSsiIFsiLmNvbmNhdChnLngsIiwgIikuY29uY2F0KGcueSwiXS4iKSl9aWYoMT09PXAubGVuZ3RoKXt1PXBbMF0ub3RoZXJTRTticmVha31mb3IodmFyIGQ9bnVsbCx5PTAsdj1oLmxlbmd0aDt5PHY7eSsrKWlmKGhbeV0ucG9pbnQ9PT1hLnBvaW50KXtkPXk7YnJlYWt9aWYobnVsbD09PWQpe2gucHVzaCh7aW5kZXg6bC5sZW5ndGgscG9pbnQ6YS5wb2ludH0pO3ZhciBfPWEuZ2V0TGVmdG1vc3RDb21wYXJhdG9yKHMpO3U9cC5zb3J0KF8pWzBdLm90aGVyU0U7YnJlYWt9dmFyIG09aC5zcGxpY2UoZClbMF0seD1sLnNwbGljZShtLmluZGV4KTt4LnVuc2hpZnQoeFswXS5vdGhlclNFKSxuLnB1c2gobmV3IHQoeC5yZXZlcnNlKCkpKX1uLnB1c2gobmV3IHQobCkpfX1yZXR1cm4gbn19XSksSXUodCxbe2tleToiZ2V0R2VvbSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5ldmVudHNbMF0ucG9pbnQsZT1bdF0sbj0xLHI9dGhpcy5ldmVudHMubGVuZ3RoLTE7bjxyO24rKyl7dmFyIGk9dGhpcy5ldmVudHNbbl0ucG9pbnQsbz10aGlzLmV2ZW50c1tuKzFdLnBvaW50OzAhPT1EdShpLHQsbykmJihlLnB1c2goaSksdD1pKX1pZigxPT09ZS5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIHM9ZVswXSxhPWVbMV07MD09PUR1KHMsdCxhKSYmZS5zaGlmdCgpLGUucHVzaChlWzBdKTtmb3IodmFyIHU9dGhpcy5pc0V4dGVyaW9yUmluZygpPzE6LTEsbD10aGlzLmlzRXh0ZXJpb3JSaW5nKCk/MDplLmxlbmd0aC0xLGM9dGhpcy5pc0V4dGVyaW9yUmluZygpP2UubGVuZ3RoOi0xLGg9W10scD1sO3AhPWM7cCs9dSloLnB1c2goW2VbcF0ueCxlW3BdLnldKTtyZXR1cm4gaH19LHtrZXk6ImlzRXh0ZXJpb3JSaW5nIix2YWx1ZTpmdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMuX2lzRXh0ZXJpb3JSaW5nKXt2YXIgdD10aGlzLmVuY2xvc2luZ1JpbmcoKTt0aGlzLl9pc0V4dGVyaW9yUmluZz0hdHx8IXQuaXNFeHRlcmlvclJpbmcoKX1yZXR1cm4gdGhpcy5faXNFeHRlcmlvclJpbmd9fSx7a2V5OiJlbmNsb3NpbmdSaW5nIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLl9lbmNsb3NpbmdSaW5nJiYodGhpcy5fZW5jbG9zaW5nUmluZz10aGlzLl9jYWxjRW5jbG9zaW5nUmluZygpKSx0aGlzLl9lbmNsb3NpbmdSaW5nfX0se2tleToiX2NhbGNFbmNsb3NpbmdSaW5nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmV2ZW50c1swXSxlPTEsbj10aGlzLmV2ZW50cy5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dGhpcy5ldmVudHNbZV07QnUuY29tcGFyZSh0LHIpPjAmJih0PXIpfWZvcih2YXIgaT10LnNlZ21lbnQucHJldkluUmVzdWx0KCksbz1pP2kucHJldkluUmVzdWx0KCk6bnVsbDs7KXtpZighaSlyZXR1cm4gbnVsbDtpZighbylyZXR1cm4gaS5yaW5nT3V0O2lmKG8ucmluZ091dCE9PWkucmluZ091dClyZXR1cm4gby5yaW5nT3V0LmVuY2xvc2luZ1JpbmcoKSE9PWkucmluZ091dD9pLnJpbmdPdXQ6aS5yaW5nT3V0LmVuY2xvc2luZ1JpbmcoKTtpPW8ucHJldkluUmVzdWx0KCksbz1pP2kucHJldkluUmVzdWx0KCk6bnVsbH19fV0pLHR9KCksSHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe2J1KHRoaXMsdCksdGhpcy5leHRlcmlvclJpbmc9ZSxlLnBvbHk9dGhpcyx0aGlzLmludGVyaW9yUmluZ3M9W119cmV0dXJuIEl1KHQsW3trZXk6ImFkZEludGVyaW9yIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmludGVyaW9yUmluZ3MucHVzaCh0KSx0LnBvbHk9dGhpc319LHtrZXk6ImdldEdlb20iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9W3RoaXMuZXh0ZXJpb3JSaW5nLmdldEdlb20oKV07aWYobnVsbD09PXRbMF0pcmV0dXJuIG51bGw7Zm9yKHZhciBlPTAsbj10aGlzLmludGVyaW9yUmluZ3MubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuaW50ZXJpb3JSaW5nc1tlXS5nZXRHZW9tKCk7bnVsbCE9PXImJnQucHVzaChyKX1yZXR1cm4gdH19XSksdH0oKSxXdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7YnUodGhpcyx0KSx0aGlzLnJpbmdzPWUsdGhpcy5wb2x5cz10aGlzLl9jb21wb3NlUG9seXMoZSl9cmV0dXJuIEl1KHQsW3trZXk6ImdldEdlb20iLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMucG9seXMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMucG9seXNbZV0uZ2V0R2VvbSgpO251bGwhPT1yJiZ0LnB1c2gocil9cmV0dXJuIHR9fSx7a2V5OiJfY29tcG9zZVBvbHlzIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5sZW5ndGg7bjxyO24rKyl7dmFyIGk9dFtuXTtpZighaS5wb2x5KWlmKGkuaXNFeHRlcmlvclJpbmcoKSllLnB1c2gobmV3IEh1KGkpKTtlbHNle3ZhciBvPWkuZW5jbG9zaW5nUmluZygpO28ucG9seXx8ZS5wdXNoKG5ldyBIdShvKSksby5wb2x5LmFkZEludGVyaW9yKGkpfX1yZXR1cm4gZX19XSksdH0oKSxKdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmp1LmNvbXBhcmU7YnUodGhpcyx0KSx0aGlzLnF1ZXVlPWUsdGhpcy50cmVlPW5ldyBfdShuKSx0aGlzLnNlZ21lbnRzPVtdfXJldHVybiBJdSh0LFt7a2V5OiJwcm9jZXNzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LnNlZ21lbnQsbj1bXTtpZih0LmNvbnN1bWVkQnkpcmV0dXJuIHQuaXNMZWZ0P3RoaXMucXVldWUucmVtb3ZlKHQub3RoZXJTRSk6dGhpcy50cmVlLnJlbW92ZShlKSxuO3ZhciByPXQuaXNMZWZ0P3RoaXMudHJlZS5pbnNlcnQoZSk6dGhpcy50cmVlLmZpbmQoZSk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZmluZCBzZWdtZW50ICMiLmNvbmNhdChlLmlkLCIgIikrIlsiLmNvbmNhdChlLmxlZnRTRS5wb2ludC54LCIsICIpLmNvbmNhdChlLmxlZnRTRS5wb2ludC55LCJdIC0+ICIpKyJbIi5jb25jYXQoZS5yaWdodFNFLnBvaW50LngsIiwgIikuY29uY2F0KGUucmlnaHRTRS5wb2ludC55LCJdICIpKyJpbiBTd2VlcExpbmUgdHJlZS4gUGxlYXNlIHN1Ym1pdCBhIGJ1ZyByZXBvcnQuIik7Zm9yKHZhciBpPXIsbz1yLHM9dm9pZCAwLGE9dm9pZCAwO3ZvaWQgMD09PXM7KW51bGw9PT0oaT10aGlzLnRyZWUucHJldihpKSk/cz1udWxsOnZvaWQgMD09PWkua2V5LmNvbnN1bWVkQnkmJihzPWkua2V5KTtmb3IoO3ZvaWQgMD09PWE7KW51bGw9PT0obz10aGlzLnRyZWUubmV4dChvKSk/YT1udWxsOnZvaWQgMD09PW8ua2V5LmNvbnN1bWVkQnkmJihhPW8ua2V5KTtpZih0LmlzTGVmdCl7dmFyIHU9bnVsbDtpZihzKXt2YXIgbD1zLmdldEludGVyc2VjdGlvbihlKTtpZihudWxsIT09bCYmKGUuaXNBbkVuZHBvaW50KGwpfHwodT1sKSwhcy5pc0FuRW5kcG9pbnQobCkpKWZvcih2YXIgYz10aGlzLl9zcGxpdFNhZmVseShzLGwpLGg9MCxwPWMubGVuZ3RoO2g8cDtoKyspbi5wdXNoKGNbaF0pfXZhciBmPW51bGw7aWYoYSl7dmFyIGc9YS5nZXRJbnRlcnNlY3Rpb24oZSk7aWYobnVsbCE9PWcmJihlLmlzQW5FbmRwb2ludChnKXx8KGY9ZyksIWEuaXNBbkVuZHBvaW50KGcpKSlmb3IodmFyIGQ9dGhpcy5fc3BsaXRTYWZlbHkoYSxnKSx5PTAsdj1kLmxlbmd0aDt5PHY7eSsrKW4ucHVzaChkW3ldKX1pZihudWxsIT09dXx8bnVsbCE9PWYpe3ZhciBfPW51bGw7aWYobnVsbD09PXUpXz1mO2Vsc2UgaWYobnVsbD09PWYpXz11O2Vsc2V7Xz1CdS5jb21wYXJlUG9pbnRzKHUsZik8PTA/dTpmfXRoaXMucXVldWUucmVtb3ZlKGUucmlnaHRTRSksbi5wdXNoKGUucmlnaHRTRSk7Zm9yKHZhciBtPWUuc3BsaXQoXykseD0wLEU9bS5sZW5ndGg7eDxFO3grKyluLnB1c2gobVt4XSl9bi5sZW5ndGg+MD8odGhpcy50cmVlLnJlbW92ZShlKSxuLnB1c2godCkpOih0aGlzLnNlZ21lbnRzLnB1c2goZSksZS5wcmV2PXMpfWVsc2V7aWYocyYmYSl7dmFyIGI9cy5nZXRJbnRlcnNlY3Rpb24oYSk7aWYobnVsbCE9PWIpe2lmKCFzLmlzQW5FbmRwb2ludChiKSlmb3IodmFyIHc9dGhpcy5fc3BsaXRTYWZlbHkocyxiKSxJPTAsTj13Lmxlbmd0aDtJPE47SSsrKW4ucHVzaCh3W0ldKTtpZighYS5pc0FuRW5kcG9pbnQoYikpZm9yKHZhciBTPXRoaXMuX3NwbGl0U2FmZWx5KGEsYiksQz0wLFA9Uy5sZW5ndGg7QzxQO0MrKyluLnB1c2goU1tDXSl9fXRoaXMudHJlZS5yZW1vdmUoZSl9cmV0dXJuIG59fSx7a2V5OiJfc3BsaXRTYWZlbHkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy50cmVlLnJlbW92ZSh0KTt2YXIgbj10LnJpZ2h0U0U7dGhpcy5xdWV1ZS5yZW1vdmUobik7dmFyIHI9dC5zcGxpdChlKTtyZXR1cm4gci5wdXNoKG4pLHZvaWQgMD09PXQuY29uc3VtZWRCeSYmdGhpcy50cmVlLmluc2VydCh0KSxyfX1dKSx0fSgpLFp1PSJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy5lbnYuUE9MWUdPTl9DTElQUElOR19NQVhfUVVFVUVfU0laRXx8MWU2LEt1PSJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy5lbnYuUE9MWUdPTl9DTElQUElOR19NQVhfU1dFRVBMSU5FX1NFR01FTlRTfHwxZTYsUXU9bmV3KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2J1KHRoaXMsdCl9cmV0dXJuIEl1KHQsW3trZXk6InJ1biIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe1F1LnR5cGU9dCxSdS5yZXNldCgpO2Zvcih2YXIgcj1bbmV3IFh1KGUsITApXSxpPTAsbz1uLmxlbmd0aDtpPG87aSsrKXIucHVzaChuZXcgWHUobltpXSwhMSkpO2lmKFF1Lm51bU11bHRpUG9seXM9ci5sZW5ndGgsImRpZmZlcmVuY2UiPT09UXUudHlwZSlmb3IodmFyIHM9clswXSxhPTE7YTxyLmxlbmd0aDspbnVsbCE9PVN1KHJbYV0uYmJveCxzLmJib3gpP2ErKzpyLnNwbGljZShhLDEpO2lmKCJpbnRlcnNlY3Rpb24iPT09UXUudHlwZSlmb3IodmFyIHU9MCxsPXIubGVuZ3RoO3U8bDt1KyspZm9yKHZhciBjPXJbdV0saD11KzEscD1yLmxlbmd0aDtoPHA7aCsrKWlmKG51bGw9PT1TdShjLmJib3gscltoXS5iYm94KSlyZXR1cm5bXTtmb3IodmFyIGY9bmV3IF91KEJ1LmNvbXBhcmUpLGc9MCxkPXIubGVuZ3RoO2c8ZDtnKyspZm9yKHZhciB5PXJbZ10uZ2V0U3dlZXBFdmVudHMoKSx2PTAsXz15Lmxlbmd0aDt2PF87disrKWlmKGYuaW5zZXJ0KHlbdl0pLGYuc2l6ZT5adSl0aHJvdyBuZXcgRXJyb3IoIkluZmluaXRlIGxvb3Agd2hlbiBwdXR0aW5nIHNlZ21lbnQgZW5kcG9pbnRzIGluIGEgcHJpb3JpdHkgcXVldWUgKHF1ZXVlIHNpemUgdG9vIGJpZykuIFBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydC4iKTtmb3IodmFyIG09bmV3IEp1KGYpLHg9Zi5zaXplLEU9Zi5wb3AoKTtFOyl7dmFyIGI9RS5rZXk7aWYoZi5zaXplPT09eCl7dmFyIHc9Yi5zZWdtZW50O3Rocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIHBvcCgpICIuY29uY2F0KGIuaXNMZWZ0PyJsZWZ0IjoicmlnaHQiLCIgU3dlZXBFdmVudCAiKSsiWyIuY29uY2F0KGIucG9pbnQueCwiLCAiKS5jb25jYXQoYi5wb2ludC55LCJdIGZyb20gc2VnbWVudCAjIikuY29uY2F0KHcuaWQsIiAiKSsiWyIuY29uY2F0KHcubGVmdFNFLnBvaW50LngsIiwgIikuY29uY2F0KHcubGVmdFNFLnBvaW50LnksIl0gLT4gIikrIlsiLmNvbmNhdCh3LnJpZ2h0U0UucG9pbnQueCwiLCAiKS5jb25jYXQody5yaWdodFNFLnBvaW50LnksIl0gZnJvbSBxdWV1ZS4gIikrIlBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydC4iKX1pZihmLnNpemU+WnUpdGhyb3cgbmV3IEVycm9yKCJJbmZpbml0ZSBsb29wIHdoZW4gcGFzc2luZyBzd2VlcCBsaW5lIG92ZXIgZW5kcG9pbnRzIChxdWV1ZSBzaXplIHRvbyBiaWcpLiBQbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQuIik7aWYobS5zZWdtZW50cy5sZW5ndGg+S3UpdGhyb3cgbmV3IEVycm9yKCJJbmZpbml0ZSBsb29wIHdoZW4gcGFzc2luZyBzd2VlcCBsaW5lIG92ZXIgZW5kcG9pbnRzICh0b28gbWFueSBzd2VlcCBsaW5lIHNlZ21lbnRzKS4gUGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0LiIpO2Zvcih2YXIgST1tLnByb2Nlc3MoYiksTj0wLFM9SS5sZW5ndGg7TjxTO04rKyl7dmFyIEM9SVtOXTt2b2lkIDA9PT1DLmNvbnN1bWVkQnkmJmYuaW5zZXJ0KEMpfXg9Zi5zaXplLEU9Zi5wb3AoKX1SdS5yZXNldCgpO3ZhciBQPVl1LmZhY3RvcnkobS5zZWdtZW50cyk7cmV0dXJuIG5ldyBXdShQKS5nZXRHZW9tKCl9fV0pLHR9KCkpLCR1PXt1bmlvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07cmV0dXJuIFF1LnJ1bigidW5pb24iLHQsbil9LGludGVyc2VjdGlvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07cmV0dXJuIFF1LnJ1bigiaW50ZXJzZWN0aW9uIix0LG4pfSx4b3I6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO3JldHVybiBRdS5ydW4oInhvciIsdCxuKX0sZGlmZmVyZW5jZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07cmV0dXJuIFF1LnJ1bigiZGlmZmVyZW5jZSIsdCxuKX19OyJmaWxsImluIEFycmF5LnByb3RvdHlwZXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwiZmlsbCIse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTpmdW5jdGlvbih0KXtpZihudWxsPT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3IodGhpcysiIGlzIG5vdCBhbiBvYmplY3QiKTt2YXIgZT1PYmplY3QodGhpcyksbj1NYXRoLm1heChNYXRoLm1pbihlLmxlbmd0aCw5MDA3MTk5MjU0NzQwOTkxKSwwKXx8MCxyPTEgaW4gYXJndW1lbnRzJiZwYXJzZUludChOdW1iZXIoYXJndW1lbnRzWzFdKSwxMCl8fDA7cj1yPDA/TWF0aC5tYXgobityLDApOk1hdGgubWluKHIsbik7dmFyIGk9MiBpbiBhcmd1bWVudHMmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9wYXJzZUludChOdW1iZXIoYXJndW1lbnRzWzJdKSwxMCl8fDA6bjtmb3IoaT1pPDA/TWF0aC5tYXgobithcmd1bWVudHNbMl0sMCk6TWF0aC5taW4oaSxuKTtyPGk7KWVbcl09dCwrK3I7cmV0dXJuIGV9LHdyaXRhYmxlOiEwfSksTnVtYmVyLmlzRmluaXRlPU51bWJlci5pc0Zpbml0ZXx8ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZpc0Zpbml0ZSh0KX0sTnVtYmVyLmlzSW50ZWdlcj1OdW1iZXIuaXNJbnRlZ2VyfHxmdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJmlzRmluaXRlKHQpJiZNYXRoLmZsb29yKHQpPT09dH0sTnVtYmVyLnBhcnNlRmxvYXQ9TnVtYmVyLnBhcnNlRmxvYXR8fHBhcnNlRmxvYXQsTnVtYmVyLmlzTmFOPU51bWJlci5pc05hTnx8ZnVuY3Rpb24odCl7cmV0dXJuIHQhPXR9LE1hdGgudHJ1bmM9TWF0aC50cnVuY3x8ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD9NYXRoLmNlaWwodCk6TWF0aC5mbG9vcih0KX07dmFyIHRsPWZ1bmN0aW9uKCl7fTt0bC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdGwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHRsfSx0bC5wcm90b3R5cGUuZXF1YWxzV2l0aFRvbGVyYW5jZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE1hdGguYWJzKHQtZSk8PW59O3ZhciBlbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLGUpLHRoaXMubmFtZT0iSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIix0aGlzLm1lc3NhZ2U9ZSx0aGlzLnN0YWNrPShuZXcgdCkuc3RhY2t9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEVycm9yKSxubD1mdW5jdGlvbigpe30scmw9e01BWF9WQUxVRTp7Y29uZmlndXJhYmxlOiEwfX07bmwuaXNOYU49ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlci5pc05hTih0KX0sbmwuZG91YmxlVG9Mb25nQml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sbmwubG9uZ0JpdHNUb0RvdWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sbmwuaXNJbmZpbml0ZT1mdW5jdGlvbih0KXtyZXR1cm4hTnVtYmVyLmlzRmluaXRlKHQpfSxybC5NQVhfVkFMVUUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE51bWJlci5NQVhfVkFMVUV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG5sLHJsKTt2YXIgaWw9ZnVuY3Rpb24oKXt9LG9sPWZ1bmN0aW9uKCl7fSxzbD1mdW5jdGlvbigpe307ZnVuY3Rpb24gYWwoKXt9dmFyIHVsPWZ1bmN0aW9uIHQoKXtpZih0aGlzLng9bnVsbCx0aGlzLnk9bnVsbCx0aGlzLno9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLng9MCx0aGlzLnk9MCx0aGlzLno9dC5OVUxMX09SRElOQVRFO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLng9ZS54LHRoaXMueT1lLnksdGhpcy56PWUuen1lbHNlIDI9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLng9YXJndW1lbnRzWzBdLHRoaXMueT1hcmd1bWVudHNbMV0sdGhpcy56PXQuTlVMTF9PUkRJTkFURSk6Mz09PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLng9YXJndW1lbnRzWzBdLHRoaXMueT1hcmd1bWVudHNbMV0sdGhpcy56PWFyZ3VtZW50c1syXSl9LGxsPXtEaW1lbnNpb25hbENvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0sc2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxOVUxMX09SRElOQVRFOntjb25maWd1cmFibGU6ITB9LFg6e2NvbmZpZ3VyYWJsZTohMH0sWTp7Y29uZmlndXJhYmxlOiEwfSxaOntjb25maWd1cmFibGU6ITB9fTt1bC5wcm90b3R5cGUuc2V0T3JkaW5hdGU9ZnVuY3Rpb24odCxlKXtzd2l0Y2godCl7Y2FzZSB1bC5YOnRoaXMueD1lO2JyZWFrO2Nhc2UgdWwuWTp0aGlzLnk9ZTticmVhaztjYXNlIHVsLlo6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgZWwoIkludmFsaWQgb3JkaW5hdGUgaW5kZXg6ICIrdCl9fSx1bC5wcm90b3R5cGUuZXF1YWxzMkQ9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLng9PT10LngmJnRoaXMueT09PXQueX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGwuZXF1YWxzV2l0aFRvbGVyYW5jZSh0aGlzLngsZS54LG4pJiYhIXRsLmVxdWFsc1dpdGhUb2xlcmFuY2UodGhpcy55LGUueSxuKX19LHVsLnByb3RvdHlwZS5nZXRPcmRpbmF0ZT1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSB1bC5YOnJldHVybiB0aGlzLng7Y2FzZSB1bC5ZOnJldHVybiB0aGlzLnk7Y2FzZSB1bC5aOnJldHVybiB0aGlzLnp9dGhyb3cgbmV3IGVsKCJJbnZhbGlkIG9yZGluYXRlIGluZGV4OiAiK3QpfSx1bC5wcm90b3R5cGUuZXF1YWxzM0Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD09PXQueCYmdGhpcy55PT09dC55JiYodGhpcy56PT09dC56fHxubC5pc05hTih0aGlzLnopKSYmbmwuaXNOYU4odC56KX0sdWwucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHVsJiZ0aGlzLmVxdWFsczJEKHQpfSx1bC5wcm90b3R5cGUuZXF1YWxJblo9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGwuZXF1YWxzV2l0aFRvbGVyYW5jZSh0aGlzLnosdC56LGUpfSx1bC5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMueDxlLng/LTE6dGhpcy54PmUueD8xOnRoaXMueTxlLnk/LTE6dGhpcy55PmUueT8xOjB9LHVsLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe30sdWwucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHVsKHRoaXMpfSx1bC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iKCIrdGhpcy54KyIsICIrdGhpcy55KyIsICIrdGhpcy56KyIpIn0sdWwucHJvdG90eXBlLmRpc3RhbmNlM0Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnkscj10aGlzLnotdC56O3JldHVybiBNYXRoLnNxcnQoZSplK24qbityKnIpfSx1bC5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIE1hdGguc3FydChlKmUrbipuKX0sdWwucHJvdG90eXBlLmhhc2hDb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9MTc7cmV0dXJuIHQ9MzcqKHQ9MzcqdCt1bC5oYXNoQ29kZSh0aGlzLngpKSt1bC5oYXNoQ29kZSh0aGlzLnkpfSx1bC5wcm90b3R5cGUuc2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXt0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQuen0sdWwucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2lsLG9sLGFsXX0sdWwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHVsfSx1bC5oYXNoQ29kZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1ubC5kb3VibGVUb0xvbmdCaXRzKHQpO3JldHVybiBNYXRoLnRydW5jKChlXmUpPj4+MzIpfX0sbGwuRGltZW5zaW9uYWxDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiBjbH0sbGwuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg1Y2JmMmMyMzVjN2U1ODAwfSxsbC5OVUxMX09SRElOQVRFLmdldD1mdW5jdGlvbigpe3JldHVybiBubC5OYU59LGxsLlguZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGxsLlkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LGxsLlouZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHVsLGxsKTt2YXIgY2w9ZnVuY3Rpb24odCl7aWYodGhpcy5fZGltZW5zaW9uc1RvVGVzdD0yLDA9PT1hcmd1bWVudHMubGVuZ3RoKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07aWYoMiE9PWUmJjMhPT1lKXRocm93IG5ldyBlbCgib25seSAyIG9yIDMgZGltZW5zaW9ucyBtYXkgYmUgc3BlY2lmaWVkIik7dGhpcy5fZGltZW5zaW9uc1RvVGVzdD1lfX07Y2wucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZSxpPWNsLmNvbXBhcmUobi54LHIueCk7aWYoMCE9PWkpcmV0dXJuIGk7dmFyIG89Y2wuY29tcGFyZShuLnksci55KTtyZXR1cm4gMCE9PW8/bzp0aGlzLl9kaW1lbnNpb25zVG9UZXN0PD0yPzA6Y2wuY29tcGFyZShuLnosci56KX0sY2wucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3NsXX0sY2wucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGNsfSxjbC5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTpubC5pc05hTih0KT9ubC5pc05hTihlKT8wOi0xOm5sLmlzTmFOKGUpPzE6MH07dmFyIGhsPWZ1bmN0aW9uKCl7fTtobC5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7fSxobC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0saGwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGhsfTt2YXIgcGw9ZnVuY3Rpb24oKXt9LGZsPXtJTlRFUklPUjp7Y29uZmlndXJhYmxlOiEwfSxCT1VOREFSWTp7Y29uZmlndXJhYmxlOiEwfSxFWFRFUklPUjp7Y29uZmlndXJhYmxlOiEwfSxOT05FOntjb25maWd1cmFibGU6ITB9fTtwbC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scGwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHBsfSxwbC50b0xvY2F0aW9uU3ltYm9sPWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlIHBsLkVYVEVSSU9SOnJldHVybiJlIjtjYXNlIHBsLkJPVU5EQVJZOnJldHVybiJiIjtjYXNlIHBsLklOVEVSSU9SOnJldHVybiJpIjtjYXNlIHBsLk5PTkU6cmV0dXJuIi0ifXRocm93IG5ldyBlbCgiVW5rbm93biBsb2NhdGlvbiB2YWx1ZTogIit0KX0sZmwuSU5URVJJT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGZsLkJPVU5EQVJZLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxmbC5FWFRFUklPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sZmwuTk9ORS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocGwsZmwpO3ZhciBnbD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmludGVyZmFjZXNfJiZ0LmludGVyZmFjZXNfKCkuaW5kZXhPZihlKT4tMX0sZGw9ZnVuY3Rpb24oKXt9LHlsPXtMT0dfMTA6e2NvbmZpZ3VyYWJsZTohMH19O2RsLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxkbC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZGx9LGRsLmxvZzEwPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGgubG9nKHQpO3JldHVybiBubC5pc0luZmluaXRlKGUpfHxubC5pc05hTihlKT9lOmUvZGwuTE9HXzEwfSxkbC5taW49ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dDtyZXR1cm4gZTxpJiYoaT1lKSxuPGkmJihpPW4pLHI8aSYmKGk9ciksaX0sZGwuY2xhbXA9ZnVuY3Rpb24oKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07cmV0dXJuIHQ8ZT9lOnQ+bj9uOnR9aWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMl0pJiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkmJk51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzFdKSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO3JldHVybiByPGk/aTpyPm8/bzpyfX0sZGwud3JhcD1mdW5jdGlvbih0LGUpe3JldHVybiB0PDA/ZS0gLXQlZTp0JWV9LGRsLm1heD1mdW5jdGlvbigpe2lmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj10O3JldHVybiBlPnImJihyPWUpLG4+ciYmKHI9bikscn1pZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzNdLHU9aTtyZXR1cm4gbz51JiYodT1vKSxzPnUmJih1PXMpLGE+dSYmKHU9YSksdX19LGRsLmF2ZXJhZ2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4odCtlKS8yfSx5bC5MT0dfMTAuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubG9nKDEwKX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGwseWwpO3ZhciB2bD1mdW5jdGlvbih0KXt0aGlzLnN0cj10fTt2bC5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKHQpe3RoaXMuc3RyKz10fSx2bC5wcm90b3R5cGUuc2V0Q2hhckF0PWZ1bmN0aW9uKHQsZSl7dGhpcy5zdHI9dGhpcy5zdHIuc3Vic3RyKDAsdCkrZSt0aGlzLnN0ci5zdWJzdHIodCsxKX0sdmwucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0cn07dmFyIF9sPWZ1bmN0aW9uKHQpe3RoaXMudmFsdWU9dH07X2wucHJvdG90eXBlLmludFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LF9sLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudmFsdWU8dD8tMTp0aGlzLnZhbHVlPnQ/MTowfSxfbC5pc05hTj1mdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyLmlzTmFOKHQpfTt2YXIgbWw9ZnVuY3Rpb24oKXt9O21sLmlzV2hpdGVzcGFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdDw9MzImJnQ+PTB8fDEyNz09PXR9LG1sLnRvVXBwZXJDYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9O3ZhciB4bD1mdW5jdGlvbiB0KCl7aWYodGhpcy5faGk9MCx0aGlzLl9sbz0wLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuaW5pdCgwKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuaW5pdChlKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMuaW5pdChuKX1lbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgcj1hcmd1bWVudHNbMF07dC5jYWxsKHRoaXMsdC5wYXJzZShyKSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXTt0aGlzLmluaXQoaSxvKX19LEVsPXtQSTp7Y29uZmlndXJhYmxlOiEwfSxUV09fUEk6e2NvbmZpZ3VyYWJsZTohMH0sUElfMjp7Y29uZmlndXJhYmxlOiEwfSxFOntjb25maWd1cmFibGU6ITB9LE5hTjp7Y29uZmlndXJhYmxlOiEwfSxFUFM6e2NvbmZpZ3VyYWJsZTohMH0sU1BMSVQ6e2NvbmZpZ3VyYWJsZTohMH0sTUFYX1BSSU5UX0RJR0lUUzp7Y29uZmlndXJhYmxlOiEwfSxURU46e2NvbmZpZ3VyYWJsZTohMH0sT05FOntjb25maWd1cmFibGU6ITB9LFNDSV9OT1RfRVhQT05FTlRfQ0hBUjp7Y29uZmlndXJhYmxlOiEwfSxTQ0lfTk9UX1pFUk86e2NvbmZpZ3VyYWJsZTohMH19O3hsLnByb3RvdHlwZS5sZT1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5faGk8dC5faGl8fHRoaXMuX2hpPT09dC5faGkpJiZ0aGlzLl9sbzw9dC5fbG99LHhsLnByb3RvdHlwZS5leHRyYWN0U2lnbmlmaWNhbnREaWdpdHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmFicygpLHI9eGwubWFnbml0dWRlKG4uX2hpKSxpPXhsLlRFTi5wb3cocik7KG49bi5kaXZpZGUoaSkpLmd0KHhsLlRFTik/KG49bi5kaXZpZGUoeGwuVEVOKSxyKz0xKTpuLmx0KHhsLk9ORSkmJihuPW4ubXVsdGlwbHkoeGwuVEVOKSxyLT0xKTtmb3IodmFyIG89cisxLHM9bmV3IHZsLGE9eGwuTUFYX1BSSU5UX0RJR0lUUy0xLHU9MDt1PD1hO3UrKyl7dCYmdT09PW8mJnMuYXBwZW5kKCIuIik7dmFyIGw9TWF0aC50cnVuYyhuLl9oaSk7aWYobDwwKWJyZWFrO3ZhciBjPSExLGg9MDtsPjk/KGM9ITAsaD0iOSIpOmg9IjAiK2wscy5hcHBlbmQoaCksbj1uLnN1YnRyYWN0KHhsLnZhbHVlT2YobCkpLm11bHRpcGx5KHhsLlRFTiksYyYmbi5zZWxmQWRkKHhsLlRFTik7dmFyIHA9ITAsZj14bC5tYWduaXR1ZGUobi5faGkpO2lmKGY8MCYmTWF0aC5hYnMoZik+PWEtdSYmKHA9ITEpLCFwKWJyZWFrfXJldHVybiBlWzBdPXIscy50b1N0cmluZygpfSx4bC5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGlwbHkodGhpcyl9LHhsLnByb3RvdHlwZS5kb3VibGVWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oaSt0aGlzLl9sb30seGwucHJvdG90eXBlLnN1YnRyYWN0PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB4bCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmFkZCh0Lm5lZ2F0ZSgpKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmFkZCgtZSl9fSx4bC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5faGk9PT10Ll9oaSYmdGhpcy5fbG89PT10Ll9sb319LHhsLnByb3RvdHlwZS5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuX2hpJiYwPT09dGhpcy5fbG99LHhsLnByb3RvdHlwZS5zZWxmU3VidHJhY3Q9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHhsKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuaXNOYU4oKT90aGlzOnRoaXMuc2VsZkFkZCgtdC5faGksLXQuX2xvKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczp0aGlzLnNlbGZBZGQoLWUsMCl9fSx4bC5wcm90b3R5cGUuZ2V0U3BlY2lhbE51bWJlclN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzWmVybygpPyIwLjAiOnRoaXMuaXNOYU4oKT8iTmFOICI6bnVsbH0seGwucHJvdG90eXBlLm1pbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZSh0KT90aGlzOnR9LHhsLnByb3RvdHlwZS5zZWxmRGl2aWRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgeGwpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmRGl2aWRlKHQuX2hpLHQuX2xvKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnNlbGZEaXZpZGUoZSwwKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9bnVsbCxvPW51bGwscz1udWxsLGE9bnVsbCx1PW51bGwsbD1udWxsLGM9bnVsbCxoPW51bGw7cmV0dXJuIHU9dGhpcy5faGkvbixoPShpPShsPXhsLlNQTElUKnUpLShpPWwtdSkpKihzPShoPXhsLlNQTElUKm4pLShzPWgtbikpLShjPXUqbikraSooYT1uLXMpKyhvPXUtaSkqcytvKmEsaD11KyhsPSh0aGlzLl9oaS1jLWgrdGhpcy5fbG8tdSpyKS9uKSx0aGlzLl9oaT1oLHRoaXMuX2xvPXUtaCtsLHRoaXN9fSx4bC5wcm90b3R5cGUuZHVtcD1mdW5jdGlvbigpe3JldHVybiJERDwiK3RoaXMuX2hpKyIsICIrdGhpcy5fbG8rIj4ifSx4bC5wcm90b3R5cGUuZGl2aWRlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB4bCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9bnVsbCxuPW51bGwscj1udWxsLGk9bnVsbCxvPW51bGwscz1udWxsLGE9bnVsbCx1PW51bGw7bj0obz10aGlzLl9oaS90Ll9oaSktKGU9KHM9eGwuU1BMSVQqbyktKGU9cy1vKSksdT1lKihyPSh1PXhsLlNQTElUKnQuX2hpKS0ocj11LXQuX2hpKSktKGE9byp0Ll9oaSkrZSooaT10Ll9oaS1yKStuKnIrbippO3ZhciBsPXU9bysocz0odGhpcy5faGktYS11K3RoaXMuX2xvLW8qdC5fbG8pL3QuX2hpKSxjPW8tdStzO3JldHVybiBuZXcgeGwobCxjKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGg9YXJndW1lbnRzWzBdO3JldHVybiBubC5pc05hTihoKT94bC5jcmVhdGVOYU4oKTp4bC5jb3B5KHRoaXMpLnNlbGZEaXZpZGUoaCwwKX19LHhsLnByb3RvdHlwZS5nZT1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5faGk+dC5faGl8fHRoaXMuX2hpPT09dC5faGkpJiZ0aGlzLl9sbz49dC5fbG99LHhsLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7aWYoMD09PXQpcmV0dXJuIHhsLnZhbHVlT2YoMSk7dmFyIGU9bmV3IHhsKHRoaXMpLG49eGwudmFsdWVPZigxKSxyPU1hdGguYWJzKHQpO2lmKHI+MSlmb3IoO3I+MDspciUyPT0xJiZuLnNlbGZNdWx0aXBseShlKSwoci89Mik+MCYmKGU9ZS5zcXIoKSk7ZWxzZSBuPWU7cmV0dXJuIHQ8MD9uLnJlY2lwcm9jYWwoKTpufSx4bC5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbigpe2lmKHRoaXMuaXNOYU4oKSlyZXR1cm4geGwuTmFOO3ZhciB0PU1hdGguY2VpbCh0aGlzLl9oaSksZT0wO3JldHVybiB0PT09dGhpcy5faGkmJihlPU1hdGguY2VpbCh0aGlzLl9sbykpLG5ldyB4bCh0LGUpfSx4bC5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX2hpPGUuX2hpPy0xOnRoaXMuX2hpPmUuX2hpPzE6dGhpcy5fbG88ZS5fbG8/LTE6dGhpcy5fbG8+ZS5fbG8/MTowfSx4bC5wcm90b3R5cGUucmludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczp0aGlzLmFkZCguNSkuZmxvb3IoKX0seGwucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB4bCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmluaXQodCksdGhpc31pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmluaXQoZSksdGhpc319LHhsLnByb3RvdHlwZS5tYXg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2UodCk/dGhpczp0fSx4bC5wcm90b3R5cGUuc3FydD1mdW5jdGlvbigpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIHhsLnZhbHVlT2YoMCk7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHhsLk5hTjt2YXIgdD0xL01hdGguc3FydCh0aGlzLl9oaSksZT10aGlzLl9oaSp0LG49eGwudmFsdWVPZihlKSxyPXRoaXMuc3VidHJhY3Qobi5zcXIoKSkuX2hpKiguNSp0KTtyZXR1cm4gbi5hZGQocil9LHhsLnByb3RvdHlwZS5zZWxmQWRkPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgeGwpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmQWRkKHQuX2hpLHQuX2xvKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdLG49bnVsbCxyPW51bGwsaT1udWxsLG89bnVsbCxzPW51bGwsYT1udWxsO3JldHVybiBvPShpPXRoaXMuX2hpK2UpLShzPWktdGhpcy5faGkpLHI9KGE9KG89ZS1zKyh0aGlzLl9oaS1vKSkrdGhpcy5fbG8pKyhpLShuPWkrYSkpLHRoaXMuX2hpPW4rcix0aGlzLl9sbz1yKyhuLXRoaXMuX2hpKSx0aGlzfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdT1hcmd1bWVudHNbMF0sbD1hcmd1bWVudHNbMV0sYz1udWxsLGg9bnVsbCxwPW51bGwsZj1udWxsLGc9bnVsbCxkPW51bGwseT1udWxsO2Y9dGhpcy5faGkrdSxoPXRoaXMuX2xvK2wsZz1mLShkPWYtdGhpcy5faGkpLHA9aC0oeT1oLXRoaXMuX2xvKTt2YXIgdj0oYz1mKyhkPShnPXUtZCsodGhpcy5faGktZykpK2gpKSsoZD0ocD1sLXkrKHRoaXMuX2xvLXApKSsoZCsoZi1jKSkpLF89ZCsoYy12KTtyZXR1cm4gdGhpcy5faGk9dix0aGlzLl9sbz1fLHRoaXN9fSx4bC5wcm90b3R5cGUuc2VsZk11bHRpcGx5PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgeGwpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmTXVsdGlwbHkodC5faGksdC5fbG8pfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc2VsZk11bHRpcGx5KGUsMCl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPW51bGwsbz1udWxsLHM9bnVsbCxhPW51bGwsdT1udWxsLGw9bnVsbDtpPSh1PXhsLlNQTElUKnRoaXMuX2hpKS10aGlzLl9oaSxsPXhsLlNQTElUKm4saT11LWksbz10aGlzLl9oaS1pLHM9bC1uO3ZhciBjPSh1PXRoaXMuX2hpKm4pKyhsPWkqKHM9bC1zKS11K2kqKGE9bi1zKStvKnMrbyphKyh0aGlzLl9oaSpyK3RoaXMuX2xvKm4pKSxoPWwrKGk9dS1jKTtyZXR1cm4gdGhpcy5faGk9Yyx0aGlzLl9sbz1oLHRoaXN9fSx4bC5wcm90b3R5cGUuc2VsZlNxcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGZNdWx0aXBseSh0aGlzKX0seGwucHJvdG90eXBlLmZsb29yPWZ1bmN0aW9uKCl7aWYodGhpcy5pc05hTigpKXJldHVybiB4bC5OYU47dmFyIHQ9TWF0aC5mbG9vcih0aGlzLl9oaSksZT0wO3JldHVybiB0PT09dGhpcy5faGkmJihlPU1hdGguZmxvb3IodGhpcy5fbG8pKSxuZXcgeGwodCxlKX0seGwucHJvdG90eXBlLm5lZ2F0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczpuZXcgeGwoLXRoaXMuX2hpLC10aGlzLl9sbyl9LHhsLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe30seGwucHJvdG90eXBlLm11bHRpcGx5PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB4bCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0LmlzTmFOKCk/eGwuY3JlYXRlTmFOKCk6eGwuY29weSh0aGlzKS5zZWxmTXVsdGlwbHkodCl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gbmwuaXNOYU4oZSk/eGwuY3JlYXRlTmFOKCk6eGwuY29weSh0aGlzKS5zZWxmTXVsdGlwbHkoZSwwKX19LHhsLnByb3RvdHlwZS5pc05hTj1mdW5jdGlvbigpe3JldHVybiBubC5pc05hTih0aGlzLl9oaSl9LHhsLnByb3RvdHlwZS5pbnRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBNYXRoLnRydW5jKHRoaXMuX2hpKX0seGwucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9eGwubWFnbml0dWRlKHRoaXMuX2hpKTtyZXR1cm4gdD49LTMmJnQ8PTIwP3RoaXMudG9TdGFuZGFyZE5vdGF0aW9uKCk6dGhpcy50b1NjaU5vdGF0aW9uKCl9LHhsLnByb3RvdHlwZS50b1N0YW5kYXJkTm90YXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFNwZWNpYWxOdW1iZXJTdHJpbmcoKTtpZihudWxsIT09dClyZXR1cm4gdDt2YXIgZT1uZXcgQXJyYXkoMSkuZmlsbChudWxsKSxuPXRoaXMuZXh0cmFjdFNpZ25pZmljYW50RGlnaXRzKCEwLGUpLHI9ZVswXSsxLGk9bjtpZigiLiI9PT1uLmNoYXJBdCgwKSlpPSIwIituO2Vsc2UgaWYocjwwKWk9IjAuIit4bC5zdHJpbmdPZkNoYXIoIjAiLC1yKStuO2Vsc2UgaWYoLTE9PT1uLmluZGV4T2YoIi4iKSl7dmFyIG89ci1uLmxlbmd0aDtpPW4reGwuc3RyaW5nT2ZDaGFyKCIwIixvKSsiLjAifXJldHVybiB0aGlzLmlzTmVnYXRpdmUoKT8iLSIraTppfSx4bC5wcm90b3R5cGUucmVjaXByb2NhbD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9bnVsbCxvPW51bGwscz1udWxsLGE9bnVsbDt0PShuPTEvdGhpcy5faGkpLShpPShzPXhsLlNQTElUKm4pLShpPXMtbikpLG89KGE9eGwuU1BMSVQqdGhpcy5faGkpLXRoaXMuX2hpO3ZhciB1PW4rKHM9KDEtKHI9bip0aGlzLl9oaSktKGE9aSoobz1hLW8pLXIraSooZT10aGlzLl9oaS1vKSt0Km8rdCplKS1uKnRoaXMuX2xvKS90aGlzLl9oaSk7cmV0dXJuIG5ldyB4bCh1LG4tdStzKX0seGwucHJvdG90eXBlLnRvU2NpTm90YXRpb249ZnVuY3Rpb24oKXtpZih0aGlzLmlzWmVybygpKXJldHVybiB4bC5TQ0lfTk9UX1pFUk87dmFyIHQ9dGhpcy5nZXRTcGVjaWFsTnVtYmVyU3RyaW5nKCk7aWYobnVsbCE9PXQpcmV0dXJuIHQ7dmFyIGU9bmV3IEFycmF5KDEpLmZpbGwobnVsbCksbj10aGlzLmV4dHJhY3RTaWduaWZpY2FudERpZ2l0cyghMSxlKSxyPXhsLlNDSV9OT1RfRVhQT05FTlRfQ0hBUitlWzBdO2lmKCIwIj09PW4uY2hhckF0KDApKXRocm93IG5ldyBFcnJvcigiRm91bmQgbGVhZGluZyB6ZXJvOiAiK24pO3ZhciBpPSIiO24ubGVuZ3RoPjEmJihpPW4uc3Vic3RyaW5nKDEpKTt2YXIgbz1uLmNoYXJBdCgwKSsiLiIraTtyZXR1cm4gdGhpcy5pc05lZ2F0aXZlKCk/Ii0iK28rcjpvK3J9LHhsLnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc05hTigpP3hsLk5hTjp0aGlzLmlzTmVnYXRpdmUoKT90aGlzLm5lZ2F0ZSgpOm5ldyB4bCh0aGlzKX0seGwucHJvdG90eXBlLmlzUG9zaXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5faGk+MHx8MD09PXRoaXMuX2hpKSYmdGhpcy5fbG8+MH0seGwucHJvdG90eXBlLmx0PWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9oaTx0Ll9oaXx8dGhpcy5faGk9PT10Ll9oaSkmJnRoaXMuX2xvPHQuX2xvfSx4bC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB4bCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB4bC5jb3B5KHRoaXMpLnNlbGZBZGQodCl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4geGwuY29weSh0aGlzKS5zZWxmQWRkKGUpfX0seGwucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9oaT10LHRoaXMuX2xvPTB9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHhsKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5faGk9ZS5faGksdGhpcy5fbG89ZS5fbG99fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLl9oaT1uLHRoaXMuX2xvPXJ9fSx4bC5wcm90b3R5cGUuZ3Q9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuX2hpPnQuX2hpfHx0aGlzLl9oaT09PXQuX2hpKSYmdGhpcy5fbG8+dC5fbG99LHhsLnByb3RvdHlwZS5pc05lZ2F0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuX2hpPDB8fDA9PT10aGlzLl9oaSkmJnRoaXMuX2xvPDB9LHhsLnByb3RvdHlwZS50cnVuYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/eGwuTmFOOnRoaXMuaXNQb3NpdGl2ZSgpP3RoaXMuZmxvb3IoKTp0aGlzLmNlaWwoKX0seGwucHJvdG90eXBlLnNpZ251bT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oaT4wPzE6dGhpcy5faGk8MD8tMTp0aGlzLl9sbz4wPzE6dGhpcy5fbG88MD8tMTowfSx4bC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bYWwsaWwsb2xdfSx4bC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geGx9LHhsLnNxcj1mdW5jdGlvbih0KXtyZXR1cm4geGwudmFsdWVPZih0KS5zZWxmTXVsdGlwbHkodCl9LHhsLnZhbHVlT2Y9ZnVuY3Rpb24oKXtpZigic3RyaW5nIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB4bC5wYXJzZSh0KX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBuZXcgeGwoZSl9fSx4bC5zcXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB4bC52YWx1ZU9mKHQpLnNxcnQoKX0seGwucGFyc2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDttbC5pc1doaXRlc3BhY2UodC5jaGFyQXQoZSkpOyllKys7dmFyIHI9ITE7aWYoZTxuKXt2YXIgaT10LmNoYXJBdChlKTsiLSIhPT1pJiYiKyIhPT1pfHwoZSsrLCItIj09PWkmJihyPSEwKSl9Zm9yKHZhciBvPW5ldyB4bCxzPTAsYT0wLHU9MDshKGU+PW4pOyl7dmFyIGw9dC5jaGFyQXQoZSk7aWYoZSsrLG1sLmlzRGlnaXQobCkpe3ZhciBjPWwtIjAiO28uc2VsZk11bHRpcGx5KHhsLlRFTiksby5zZWxmQWRkKGMpLHMrK31lbHNle2lmKCIuIiE9PWwpe2lmKCJlIj09PWx8fCJFIj09PWwpe3ZhciBoPXQuc3Vic3RyaW5nKGUpO3RyeXt1PV9sLnBhcnNlSW50KGgpfWNhdGNoKGUpe3Rocm93IGUgaW5zdGFuY2VvZiBFcnJvcj9uZXcgRXJyb3IoIkludmFsaWQgZXhwb25lbnQgIitoKyIgaW4gc3RyaW5nICIrdCk6ZX1icmVha310aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICciK2wrIicgYXQgcG9zaXRpb24gIitlKyIgaW4gc3RyaW5nICIrdCl9YT1zfX12YXIgcD1vLGY9cy1hLXU7aWYoMD09PWYpcD1vO2Vsc2UgaWYoZj4wKXt2YXIgZz14bC5URU4ucG93KGYpO3A9by5kaXZpZGUoZyl9ZWxzZSBpZihmPDApe3ZhciBkPXhsLlRFTi5wb3coLWYpO3A9by5tdWx0aXBseShkKX1yZXR1cm4gcj9wLm5lZ2F0ZSgpOnB9LHhsLmNyZWF0ZU5hTj1mdW5jdGlvbigpe3JldHVybiBuZXcgeGwobmwuTmFOLG5sLk5hTil9LHhsLmNvcHk9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB4bCh0KX0seGwubWFnbml0dWRlPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguYWJzKHQpLG49TWF0aC5sb2coZSkvTWF0aC5sb2coMTApLHI9TWF0aC50cnVuYyhNYXRoLmZsb29yKG4pKTtyZXR1cm4gMTAqTWF0aC5wb3coMTAscik8PWUmJihyKz0xKSxyfSx4bC5zdHJpbmdPZkNoYXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IHZsLHI9MDtyPGU7cisrKW4uYXBwZW5kKHQpO3JldHVybiBuLnRvU3RyaW5nKCl9LEVsLlBJLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgeGwoMy4xNDE1OTI2NTM1ODk3OTMsMTIyNDY0Njc5OTE0NzM1MzJlLTMyKX0sRWwuVFdPX1BJLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgeGwoNi4yODMxODUzMDcxNzk1ODYsMjQ0OTI5MzU5ODI5NDcwNjRlLTMyKX0sRWwuUElfMi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHhsKDEuNTcwNzk2MzI2Nzk0ODk2Niw2MTIzMjMzOTk1NzM2NzY2ZS0zMil9LEVsLkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB4bCgyLjcxODI4MTgyODQ1OTA0NSwxNDQ1NjQ2ODkxNzI5MjUwMmUtMzIpfSxFbC5OYU4uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB4bChubC5OYU4sbmwuTmFOKX0sRWwuRVBTLmdldD1mdW5jdGlvbigpe3JldHVybiAxMjMyNTk1MTY0NDA3ODNlLTQ2fSxFbC5TUExJVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTM0MjE3NzI5fSxFbC5NQVhfUFJJTlRfRElHSVRTLmdldD1mdW5jdGlvbigpe3JldHVybiAzMn0sRWwuVEVOLmdldD1mdW5jdGlvbigpe3JldHVybiB4bC52YWx1ZU9mKDEwKX0sRWwuT05FLmdldD1mdW5jdGlvbigpe3JldHVybiB4bC52YWx1ZU9mKDEpfSxFbC5TQ0lfTk9UX0VYUE9ORU5UX0NIQVIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIkUifSxFbC5TQ0lfTk9UX1pFUk8uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIjAuMEUwIn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeGwsRWwpO3ZhciBibD1mdW5jdGlvbigpe30sd2w9e0RQX1NBRkVfRVBTSUxPTjp7Y29uZmlndXJhYmxlOiEwfX07YmwucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGJsLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBibH0sYmwub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbih0LGUsbil7dmFyIHI9Ymwub3JpZW50YXRpb25JbmRleEZpbHRlcih0LGUsbik7aWYocjw9MSlyZXR1cm4gcjt2YXIgaT14bC52YWx1ZU9mKGUueCkuc2VsZkFkZCgtdC54KSxvPXhsLnZhbHVlT2YoZS55KS5zZWxmQWRkKC10LnkpLHM9eGwudmFsdWVPZihuLngpLnNlbGZBZGQoLWUueCksYT14bC52YWx1ZU9mKG4ueSkuc2VsZkFkZCgtZS55KTtyZXR1cm4gaS5zZWxmTXVsdGlwbHkoYSkuc2VsZlN1YnRyYWN0KG8uc2VsZk11bHRpcGx5KHMpKS5zaWdudW0oKX0sYmwuc2lnbk9mRGV0MngyPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0Lm11bHRpcGx5KHIpLnNlbGZTdWJ0cmFjdChlLm11bHRpcGx5KG4pKS5zaWdudW0oKX0sYmwuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXhsLnZhbHVlT2Yoci55KS5zZWxmU3VidHJhY3Qobi55KS5zZWxmTXVsdGlwbHkoeGwudmFsdWVPZihlLngpLnNlbGZTdWJ0cmFjdCh0LngpKSxvPXhsLnZhbHVlT2Yoci54KS5zZWxmU3VidHJhY3Qobi54KS5zZWxmTXVsdGlwbHkoeGwudmFsdWVPZihlLnkpLnNlbGZTdWJ0cmFjdCh0LnkpKSxzPWkuc3VidHJhY3QobyksYT14bC52YWx1ZU9mKHIueCkuc2VsZlN1YnRyYWN0KG4ueCkuc2VsZk11bHRpcGx5KHhsLnZhbHVlT2YodC55KS5zZWxmU3VidHJhY3Qobi55KSksdT14bC52YWx1ZU9mKHIueSkuc2VsZlN1YnRyYWN0KG4ueSkuc2VsZk11bHRpcGx5KHhsLnZhbHVlT2YodC54KS5zZWxmU3VidHJhY3Qobi54KSksbD1hLnN1YnRyYWN0KHUpLnNlbGZEaXZpZGUocykuZG91YmxlVmFsdWUoKSxjPXhsLnZhbHVlT2YodC54KS5zZWxmQWRkKHhsLnZhbHVlT2YoZS54KS5zZWxmU3VidHJhY3QodC54KS5zZWxmTXVsdGlwbHkobCkpLmRvdWJsZVZhbHVlKCksaD14bC52YWx1ZU9mKGUueCkuc2VsZlN1YnRyYWN0KHQueCkuc2VsZk11bHRpcGx5KHhsLnZhbHVlT2YodC55KS5zZWxmU3VidHJhY3Qobi55KSkscD14bC52YWx1ZU9mKGUueSkuc2VsZlN1YnRyYWN0KHQueSkuc2VsZk11bHRpcGx5KHhsLnZhbHVlT2YodC54KS5zZWxmU3VidHJhY3Qobi54KSksZj1oLnN1YnRyYWN0KHApLnNlbGZEaXZpZGUocykuZG91YmxlVmFsdWUoKSxnPXhsLnZhbHVlT2Yobi55KS5zZWxmQWRkKHhsLnZhbHVlT2Yoci55KS5zZWxmU3VidHJhY3Qobi55KS5zZWxmTXVsdGlwbHkoZikpLmRvdWJsZVZhbHVlKCk7cmV0dXJuIG5ldyB1bChjLGcpfSxibC5vcmllbnRhdGlvbkluZGV4RmlsdGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1udWxsLGk9KHQueC1uLngpKihlLnktbi55KSxvPSh0Lnktbi55KSooZS54LW4ueCkscz1pLW87aWYoaT4wKXtpZihvPD0wKXJldHVybiBibC5zaWdudW0ocyk7cj1pK299ZWxzZXtpZighKGk8MCkpcmV0dXJuIGJsLnNpZ251bShzKTtpZihvPj0wKXJldHVybiBibC5zaWdudW0ocyk7cj0taS1vfXZhciBhPWJsLkRQX1NBRkVfRVBTSUxPTipyO3JldHVybiBzPj1hfHwtcz49YT9ibC5zaWdudW0ocyk6Mn0sYmwuc2lnbnVtPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sd2wuRFBfU0FGRV9FUFNJTE9OLmdldD1mdW5jdGlvbigpe3JldHVybiAxZS0xNX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYmwsd2wpO3ZhciBJbD1mdW5jdGlvbigpe30sTmw9e1g6e2NvbmZpZ3VyYWJsZTohMH0sWTp7Y29uZmlndXJhYmxlOiEwfSxaOntjb25maWd1cmFibGU6ITB9LE06e2NvbmZpZ3VyYWJsZTohMH19O05sLlguZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LE5sLlkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LE5sLlouZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LE5sLk0uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LElsLnByb3RvdHlwZS5zZXRPcmRpbmF0ZT1mdW5jdGlvbih0LGUsbil7fSxJbC5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe30sSWwucHJvdG90eXBlLmdldE9yZGluYXRlPWZ1bmN0aW9uKHQsZSl7fSxJbC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe30sSWwucHJvdG90eXBlLmdldENvb3JkaW5hdGVDb3B5PWZ1bmN0aW9uKHQpe30sSWwucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe30sSWwucHJvdG90eXBlLmdldFg9ZnVuY3Rpb24odCl7fSxJbC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt9LElsLnByb3RvdHlwZS5leHBhbmRFbnZlbG9wZT1mdW5jdGlvbih0KXt9LElsLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7fSxJbC5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbih0KXt9LElsLnByb3RvdHlwZS50b0Nvb3JkaW5hdGVBcnJheT1mdW5jdGlvbigpe30sSWwucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW29sXX0sSWwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIElsfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhJbCxObCk7dmFyIFNsPWZ1bmN0aW9uKCl7fSxDbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMsIlByb2plY3RpdmUgcG9pbnQgbm90IHJlcHJlc2VudGFibGUgb24gdGhlIENhcnRlc2lhbiBwbGFuZS4iKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oU2wpLFBsPWZ1bmN0aW9uKCl7fTtQbC5hcnJheWNvcHk9ZnVuY3Rpb24odCxlLG4scixpKXtmb3IodmFyIG89MCxzPWU7czxlK2k7cysrKW5bcitvXT10W3NdLG8rK30sUGwuZ2V0UHJvcGVydHk9ZnVuY3Rpb24odCl7cmV0dXJueyJsaW5lLnNlcGFyYXRvciI6IlxuIn1bdF19O3ZhciBNbD1mdW5jdGlvbiB0KCl7aWYodGhpcy54PW51bGwsdGhpcy55PW51bGwsdGhpcy53PW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy54PTAsdGhpcy55PTAsdGhpcy53PTE7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMueD1lLngsdGhpcy55PWUueSx0aGlzLnc9MX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLng9bix0aGlzLnk9cix0aGlzLnc9MX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0KXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV07dGhpcy54PWkueSpvLnctby55Kmkudyx0aGlzLnk9by54Kmkudy1pLngqby53LHRoaXMudz1pLngqby55LW8ueCppLnl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV07dGhpcy54PXMueS1hLnksdGhpcy55PWEueC1zLngsdGhpcy53PXMueCphLnktYS54KnMueX19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHU9YXJndW1lbnRzWzBdLGw9YXJndW1lbnRzWzFdLGM9YXJndW1lbnRzWzJdO3RoaXMueD11LHRoaXMueT1sLHRoaXMudz1jfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBoPWFyZ3VtZW50c1swXSxwPWFyZ3VtZW50c1sxXSxmPWFyZ3VtZW50c1syXSxnPWFyZ3VtZW50c1szXSxkPWgueS1wLnkseT1wLngtaC54LHY9aC54KnAueS1wLngqaC55LF89Zi55LWcueSxtPWcueC1mLngseD1mLngqZy55LWcueCpmLnk7dGhpcy54PXkqeC1tKnYsdGhpcy55PV8qdi1kKngsdGhpcy53PWQqbS1fKnl9fTtNbC5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbigpe3ZhciB0PXRoaXMueS90aGlzLnc7aWYobmwuaXNOYU4odCl8fG5sLmlzSW5maW5pdGUodCkpdGhyb3cgbmV3IENsO3JldHVybiB0fSxNbC5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe3ZhciB0PXRoaXMueC90aGlzLnc7aWYobmwuaXNOYU4odCl8fG5sLmlzSW5maW5pdGUodCkpdGhyb3cgbmV3IENsO3JldHVybiB0fSxNbC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyB1bDtyZXR1cm4gdC54PXRoaXMuZ2V0WCgpLHQueT10aGlzLmdldFkoKSx0fSxNbC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sTWwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE1sfSxNbC5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dC55LWUueSxvPWUueC10Lngscz10LngqZS55LWUueCp0LnksYT1uLnktci55LHU9ci54LW4ueCxsPW4ueCpyLnktci54Km4ueSxjPWkqdS1hKm8saD0obypsLXUqcykvYyxwPShhKnMtaSpsKS9jO2lmKG5sLmlzTmFOKGgpfHxubC5pc0luZmluaXRlKGgpfHxubC5pc05hTihwKXx8bmwuaXNJbmZpbml0ZShwKSl0aHJvdyBuZXcgQ2w7cmV0dXJuIG5ldyB1bChoLHApfTt2YXIgTGw9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX21pbng9bnVsbCx0aGlzLl9tYXh4PW51bGwsdGhpcy5fbWlueT1udWxsLHRoaXMuX21heHk9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLmluaXQoKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5pbml0KGUueCxlLngsZS55LGUueSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLmluaXQobil9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTt0aGlzLmluaXQoci54LGkueCxyLnksaS55KX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl0sdT1hcmd1bWVudHNbM107dGhpcy5pbml0KG8scyxhLHUpfX0sT2w9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O0xsLnByb3RvdHlwZS5nZXRBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSp0aGlzLmdldEhlaWdodCgpfSxMbC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIExsKSlyZXR1cm4hMTt2YXIgZT10O3JldHVybiB0aGlzLmlzTnVsbCgpP2UuaXNOdWxsKCk6dGhpcy5fbWF4eD09PWUuZ2V0TWF4WCgpJiZ0aGlzLl9tYXh5PT09ZS5nZXRNYXhZKCkmJnRoaXMuX21pbng9PT1lLmdldE1pblgoKSYmdGhpcy5fbWlueT09PWUuZ2V0TWluWSgpfSxMbC5wcm90b3R5cGUuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNOdWxsKCl8fHQuaXNOdWxsKCl8fCF0aGlzLmludGVyc2VjdHModCkpcmV0dXJuIG5ldyBMbDt2YXIgZT10aGlzLl9taW54PnQuX21pbng/dGhpcy5fbWlueDp0Ll9taW54LG49dGhpcy5fbWlueT50Ll9taW55P3RoaXMuX21pbnk6dC5fbWlueSxyPXRoaXMuX21heHg8dC5fbWF4eD90aGlzLl9tYXh4OnQuX21heHgsaT10aGlzLl9tYXh5PHQuX21heHk/dGhpcy5fbWF4eTp0Ll9tYXh5O3JldHVybiBuZXcgTGwoZSxyLG4saSl9LExsLnByb3RvdHlwZS5pc051bGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4eDx0aGlzLl9taW54fSxMbC5wcm90b3R5cGUuZ2V0TWF4WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXh4fSxMbC5wcm90b3R5cGUuY292ZXJzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jb3ZlcnModC54LHQueSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBMbCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiF0aGlzLmlzTnVsbCgpJiYhZS5pc051bGwoKSYmKGUuZ2V0TWluWCgpPj10aGlzLl9taW54JiZlLmdldE1heFgoKTw9dGhpcy5fbWF4eCYmZS5nZXRNaW5ZKCk+PXRoaXMuX21pbnkmJmUuZ2V0TWF4WSgpPD10aGlzLl9tYXh5KX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3JldHVybiF0aGlzLmlzTnVsbCgpJiYobj49dGhpcy5fbWlueCYmbjw9dGhpcy5fbWF4eCYmcj49dGhpcy5fbWlueSYmcjw9dGhpcy5fbWF4eSl9fSxMbC5wcm90b3R5cGUuaW50ZXJzZWN0cz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIExsKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIXRoaXMuaXNOdWxsKCkmJiF0LmlzTnVsbCgpJiYhKHQuX21pbng+dGhpcy5fbWF4eHx8dC5fbWF4eDx0aGlzLl9taW54fHx0Ll9taW55PnRoaXMuX21heHl8fHQuX21heHk8dGhpcy5fbWlueSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB1bCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmludGVyc2VjdHMoZS54LGUueSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4hdGhpcy5pc051bGwoKSYmIShuPnRoaXMuX21heHh8fG48dGhpcy5fbWlueHx8cj50aGlzLl9tYXh5fHxyPHRoaXMuX21pbnkpfX0sTGwucHJvdG90eXBlLmdldE1pblk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWlueX0sTGwucHJvdG90eXBlLmdldE1pblg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWlueH0sTGwucHJvdG90eXBlLmV4cGFuZFRvSW5jbHVkZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5leHBhbmRUb0luY2x1ZGUodC54LHQueSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIExsKXt2YXIgZT1hcmd1bWVudHNbMF07aWYoZS5pc051bGwoKSlyZXR1cm4gbnVsbDt0aGlzLmlzTnVsbCgpPyh0aGlzLl9taW54PWUuZ2V0TWluWCgpLHRoaXMuX21heHg9ZS5nZXRNYXhYKCksdGhpcy5fbWlueT1lLmdldE1pblkoKSx0aGlzLl9tYXh5PWUuZ2V0TWF4WSgpKTooZS5fbWlueDx0aGlzLl9taW54JiYodGhpcy5fbWlueD1lLl9taW54KSxlLl9tYXh4PnRoaXMuX21heHgmJih0aGlzLl9tYXh4PWUuX21heHgpLGUuX21pbnk8dGhpcy5fbWlueSYmKHRoaXMuX21pbnk9ZS5fbWlueSksZS5fbWF4eT50aGlzLl9tYXh5JiYodGhpcy5fbWF4eT1lLl9tYXh5KSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLmlzTnVsbCgpPyh0aGlzLl9taW54PW4sdGhpcy5fbWF4eD1uLHRoaXMuX21pbnk9cix0aGlzLl9tYXh5PXIpOihuPHRoaXMuX21pbngmJih0aGlzLl9taW54PW4pLG4+dGhpcy5fbWF4eCYmKHRoaXMuX21heHg9bikscjx0aGlzLl9taW55JiYodGhpcy5fbWlueT1yKSxyPnRoaXMuX21heHkmJih0aGlzLl9tYXh5PXIpKX19LExsLnByb3RvdHlwZS5taW5FeHRlbnQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTnVsbCgpKXJldHVybiAwO3ZhciB0PXRoaXMuZ2V0V2lkdGgoKSxlPXRoaXMuZ2V0SGVpZ2h0KCk7cmV0dXJuIHQ8ZT90OmV9LExsLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTnVsbCgpPzA6dGhpcy5fbWF4eC10aGlzLl9taW54fSxMbC5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuaXNOdWxsKCk/ZS5pc051bGwoKT8wOi0xOmUuaXNOdWxsKCk/MTp0aGlzLl9taW54PGUuX21pbng/LTE6dGhpcy5fbWlueD5lLl9taW54PzE6dGhpcy5fbWlueTxlLl9taW55Py0xOnRoaXMuX21pbnk+ZS5fbWlueT8xOnRoaXMuX21heHg8ZS5fbWF4eD8tMTp0aGlzLl9tYXh4PmUuX21heHg/MTp0aGlzLl9tYXh5PGUuX21heHk/LTE6dGhpcy5fbWF4eT5lLl9tYXh5PzE6MH0sTGwucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuaXNOdWxsKCkpcmV0dXJuIG51bGw7dGhpcy5pbml0KHRoaXMuZ2V0TWluWCgpK3QsdGhpcy5nZXRNYXhYKCkrdCx0aGlzLmdldE1pblkoKStlLHRoaXMuZ2V0TWF4WSgpK2UpfSxMbC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iRW52WyIrdGhpcy5fbWlueCsiIDogIit0aGlzLl9tYXh4KyIsICIrdGhpcy5fbWlueSsiIDogIit0aGlzLl9tYXh5KyJdIn0sTGwucHJvdG90eXBlLnNldFRvTnVsbD1mdW5jdGlvbigpe3RoaXMuX21pbng9MCx0aGlzLl9tYXh4PS0xLHRoaXMuX21pbnk9MCx0aGlzLl9tYXh5PS0xfSxMbC5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/MDp0aGlzLl9tYXh5LXRoaXMuX21pbnl9LExsLnByb3RvdHlwZS5tYXhFeHRlbnQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTnVsbCgpKXJldHVybiAwO3ZhciB0PXRoaXMuZ2V0V2lkdGgoKSxlPXRoaXMuZ2V0SGVpZ2h0KCk7cmV0dXJuIHQ+ZT90OmV9LExsLnByb3RvdHlwZS5leHBhbmRCeT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5leHBhbmRCeSh0LHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLmlzTnVsbCgpKXJldHVybiBudWxsO3RoaXMuX21pbngtPWUsdGhpcy5fbWF4eCs9ZSx0aGlzLl9taW55LT1uLHRoaXMuX21heHkrPW4sKHRoaXMuX21pbng+dGhpcy5fbWF4eHx8dGhpcy5fbWlueT50aGlzLl9tYXh5KSYmdGhpcy5zZXRUb051bGwoKX19LExsLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIExsKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY292ZXJzKHQpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jb3ZlcnMoZSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5jb3ZlcnMobixyKX19LExsLnByb3RvdHlwZS5jZW50cmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc051bGwoKT9udWxsOm5ldyB1bCgodGhpcy5nZXRNaW5YKCkrdGhpcy5nZXRNYXhYKCkpLzIsKHRoaXMuZ2V0TWluWSgpK3RoaXMuZ2V0TWF4WSgpKS8yKX0sTGwucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLnNldFRvTnVsbCgpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmluaXQodC54LHQueCx0LnksdC55KX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTGwpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9taW54PWUuX21pbngsdGhpcy5fbWF4eD1lLl9tYXh4LHRoaXMuX21pbnk9ZS5fbWlueSx0aGlzLl9tYXh5PWUuX21heHl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLmluaXQobi54LHIueCxuLnksci55KX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbM107aTxvPyh0aGlzLl9taW54PWksdGhpcy5fbWF4eD1vKToodGhpcy5fbWlueD1vLHRoaXMuX21heHg9aSksczxhPyh0aGlzLl9taW55PXMsdGhpcy5fbWF4eT1hKToodGhpcy5fbWlueT1hLHRoaXMuX21heHk9cyl9fSxMbC5wcm90b3R5cGUuZ2V0TWF4WT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXh5fSxMbC5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCl7aWYodGhpcy5pbnRlcnNlY3RzKHQpKXJldHVybiAwO3ZhciBlPTA7dGhpcy5fbWF4eDx0Ll9taW54P2U9dC5fbWlueC10aGlzLl9tYXh4OnRoaXMuX21pbng+dC5fbWF4eCYmKGU9dGhpcy5fbWlueC10Ll9tYXh4KTt2YXIgbj0wO3JldHVybiB0aGlzLl9tYXh5PHQuX21pbnk/bj10Ll9taW55LXRoaXMuX21heHk6dGhpcy5fbWlueT50Ll9tYXh5JiYobj10aGlzLl9taW55LXQuX21heHkpLDA9PT1lP246MD09PW4/ZTpNYXRoLnNxcnQoZSplK24qbil9LExsLnByb3RvdHlwZS5oYXNoQ29kZT1mdW5jdGlvbigpe3ZhciB0PTE3O3JldHVybiB0PTM3Kih0PTM3Kih0PTM3Kih0PTM3KnQrdWwuaGFzaENvZGUodGhpcy5fbWlueCkpK3VsLmhhc2hDb2RlKHRoaXMuX21heHgpKSt1bC5oYXNoQ29kZSh0aGlzLl9taW55KSkrdWwuaGFzaENvZGUodGhpcy5fbWF4eSl9LExsLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpbCxhbF19LExsLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBMbH0sTGwuaW50ZXJzZWN0cz1mdW5jdGlvbigpe2lmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07cmV0dXJuIG4ueD49KHQueDxlLng/dC54OmUueCkmJm4ueDw9KHQueD5lLng/dC54OmUueCkmJm4ueT49KHQueTxlLnk/dC55OmUueSkmJm4ueTw9KHQueT5lLnk/dC55OmUueSl9aWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXSxzPWFyZ3VtZW50c1szXSxhPU1hdGgubWluKG8ueCxzLngpLHU9TWF0aC5tYXgoby54LHMueCksbD1NYXRoLm1pbihyLngsaS54KSxjPU1hdGgubWF4KHIueCxpLngpO3JldHVybiEobD51KSYmKCEoYzxhKSYmKGE9TWF0aC5taW4oby55LHMueSksdT1NYXRoLm1heChvLnkscy55KSxsPU1hdGgubWluKHIueSxpLnkpLGM9TWF0aC5tYXgoci55LGkueSksIShsPnUpJiYhKGM8YSkpKX19LE9sLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NTE4NDVjZDU1MjE4OTgwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTGwsT2wpO3ZhciBSbD17dHlwZVN0cjovXlxzKihcdyspXHMqXChccyooLiopXHMqXClccyokLyxlbXB0eVR5cGVTdHI6L15ccyooXHcrKVxzKkVNUFRZXHMqJC8sc3BhY2VzOi9ccysvLHBhcmVuQ29tbWE6L1wpXHMqLFxzKlwoLyxkb3VibGVQYXJlbkNvbW1hOi9cKVxzKlwpXHMqLFxzKlwoXHMqXCgvLHRyaW1QYXJlbnM6L15ccypcKD8oLio/KVwpP1xzKiQvfSxUbD1mdW5jdGlvbih0KXt0aGlzLmdlb21ldHJ5RmFjdG9yeT10fHxuZXcgX2h9O1RsLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlLG4scjt0PXQucmVwbGFjZSgvW1xuXHJdL2csIiAiKTt2YXIgaT1SbC50eXBlU3RyLmV4ZWModCk7aWYoLTEhPT10LnNlYXJjaCgiRU1QVFkiKSYmKChpPVJsLmVtcHR5VHlwZVN0ci5leGVjKHQpKVsyXT12b2lkIDApLGkmJihuPWlbMV0udG9Mb3dlckNhc2UoKSxyPWlbMl0sRGxbbl0mJihlPURsW25dLmFwcGx5KHRoaXMsW3JdKSkpLHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgcGFyc2UgV0tUICIrdCk7cmV0dXJuIGV9LFRsLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5leHRyYWN0R2VvbWV0cnkodCl9LFRsLnByb3RvdHlwZS5leHRyYWN0R2VvbWV0cnk9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRHZW9tZXRyeVR5cGUoKS50b0xvd2VyQ2FzZSgpO2lmKCFBbFtlXSlyZXR1cm4gbnVsbDt2YXIgbj1lLnRvVXBwZXJDYXNlKCk7cmV0dXJuIHQuaXNFbXB0eSgpP24rIiBFTVBUWSI6bisiKCIrQWxbZV0uYXBwbHkodGhpcyxbdF0pKyIpIn07dmFyIEFsPXtjb29yZGluYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0LngrIiAiK3QueX0scG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIEFsLmNvb3JkaW5hdGUuY2FsbCh0aGlzLHQuX2Nvb3JkaW5hdGVzLl9jb29yZGluYXRlc1swXSl9LG11bHRpcG9pbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX2dlb21ldHJpZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKCIoIitBbC5wb2ludC5hcHBseSh0aGlzLFt0Ll9nZW9tZXRyaWVzW25dXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9LGxpbmVzdHJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX3BvaW50cy5fY29vcmRpbmF0ZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKEFsLmNvb3JkaW5hdGUuYXBwbHkodGhpcyxbdC5fcG9pbnRzLl9jb29yZGluYXRlc1tuXV0pKTtyZXR1cm4gZS5qb2luKCIsIil9LGxpbmVhcnJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX3BvaW50cy5fY29vcmRpbmF0ZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKEFsLmNvb3JkaW5hdGUuYXBwbHkodGhpcyxbdC5fcG9pbnRzLl9jb29yZGluYXRlc1tuXV0pKTtyZXR1cm4gZS5qb2luKCIsIil9LG11bHRpbGluZXN0cmluZzpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fZ2VvbWV0cmllcy5sZW5ndGg7bjxyOysrbillLnB1c2goIigiK0FsLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbdC5fZ2VvbWV0cmllc1tuXV0pKyIpIik7cmV0dXJuIGUuam9pbigiLCIpfSxwb2x5Z29uOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2UucHVzaCgiKCIrQWwubGluZXN0cmluZy5hcHBseSh0aGlzLFt0Ll9zaGVsbF0pKyIpIik7Zm9yKHZhciBuPTAscj10Ll9ob2xlcy5sZW5ndGg7bjxyOysrbillLnB1c2goIigiK0FsLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbdC5faG9sZXNbbl1dKSsiKSIpO3JldHVybiBlLmpvaW4oIiwiKX0sbXVsdGlwb2x5Z29uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Ll9nZW9tZXRyaWVzLmxlbmd0aDtuPHI7KytuKWUucHVzaCgiKCIrQWwucG9seWdvbi5hcHBseSh0aGlzLFt0Ll9nZW9tZXRyaWVzW25dXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9LGdlb21ldHJ5Y29sbGVjdGlvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fZ2VvbWV0cmllcy5sZW5ndGg7bjxyOysrbillLnB1c2godGhpcy5leHRyYWN0R2VvbWV0cnkodC5fZ2VvbWV0cmllc1tuXSkpO3JldHVybiBlLmpvaW4oIiwiKX19LERsPXtwb2ludDpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2ludCgpO3ZhciBlPXQudHJpbSgpLnNwbGl0KFJsLnNwYWNlcyk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvaW50KG5ldyB1bChOdW1iZXIucGFyc2VGbG9hdChlWzBdKSxOdW1iZXIucGFyc2VGbG9hdChlWzFdKSkpfSxtdWx0aXBvaW50OmZ1bmN0aW9uKHQpe3ZhciBlO2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9pbnQoKTtmb3IodmFyIG49dC50cmltKCkuc3BsaXQoIiwiKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnJlcGxhY2UoUmwudHJpbVBhcmVucywiJDEiKSxyLnB1c2goRGwucG9pbnQuYXBwbHkodGhpcyxbZV0pKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlQb2ludChyKX0sbGluZXN0cmluZzpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQoIiwiKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnRyaW0oKS5zcGxpdChSbC5zcGFjZXMpLHIucHVzaChuZXcgdWwoTnVtYmVyLnBhcnNlRmxvYXQoZVswXSksTnVtYmVyLnBhcnNlRmxvYXQoZVsxXSkpKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZVN0cmluZyhyKX0sbGluZWFycmluZzpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQoIiwiKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnRyaW0oKS5zcGxpdChSbC5zcGFjZXMpLHIucHVzaChuZXcgdWwoTnVtYmVyLnBhcnNlRmxvYXQoZVswXSksTnVtYmVyLnBhcnNlRmxvYXQoZVsxXSkpKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhyKX0sbXVsdGlsaW5lc3RyaW5nOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpTGluZVN0cmluZygpO2Zvcih2YXIgbj10LnRyaW0oKS5zcGxpdChSbC5wYXJlbkNvbW1hKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnJlcGxhY2UoUmwudHJpbVBhcmVucywiJDEiKSxyLnB1c2goRGwubGluZXN0cmluZy5hcHBseSh0aGlzLFtlXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcocil9LHBvbHlnb246ZnVuY3Rpb24odCl7dmFyIGUsbixyO2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvbHlnb24oKTtmb3IodmFyIGksbz10LnRyaW0oKS5zcGxpdChSbC5wYXJlbkNvbW1hKSxzPVtdLGE9MCx1PW8ubGVuZ3RoO2E8dTsrK2EpZT1vW2FdLnJlcGxhY2UoUmwudHJpbVBhcmVucywiJDEiKSxuPURsLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbZV0pLHI9dGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhuLl9wb2ludHMpLDA9PT1hP2k9cjpzLnB1c2gocik7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvbHlnb24oaSxzKX0sbXVsdGlwb2x5Z29uOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9seWdvbigpO2Zvcih2YXIgbj10LnRyaW0oKS5zcGxpdChSbC5kb3VibGVQYXJlbkNvbW1hKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnJlcGxhY2UoUmwudHJpbVBhcmVucywiJDEiKSxyLnB1c2goRGwucG9seWdvbi5hcHBseSh0aGlzLFtlXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aVBvbHlnb24ocil9LGdlb21ldHJ5Y29sbGVjdGlvbjpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oKTtmb3IodmFyIGU9KHQ9dC5yZXBsYWNlKC8sXHMqKFtBLVphLXpdKS9nLCJ8JDEiKSkudHJpbSgpLnNwbGl0KCJ8Iiksbj1bXSxyPTAsaT1lLmxlbmd0aDtyPGk7KytyKW4ucHVzaCh0aGlzLnJlYWQoZVtyXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obil9fSxGbD1mdW5jdGlvbih0KXt0aGlzLnBhcnNlcj1uZXcgVGwodCl9O0ZsLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wYXJzZXIud3JpdGUodCl9LEZsLnRvTGluZVN0cmluZz1mdW5jdGlvbih0LGUpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIik7cmV0dXJuIkxJTkVTVFJJTkcgKCAiK3QueCsiICIrdC55KyIsICIrZS54KyIgIitlLnkrIiApIn07dmFyIGtsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMsZSksdGhpcy5uYW1lPSJSdW50aW1lRXhjZXB0aW9uIix0aGlzLm1lc3NhZ2U9ZSx0aGlzLnN0YWNrPShuZXcgdCkuc3RhY2t9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEVycm9yKSxHbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7aWYodC5jYWxsKHRoaXMpLDA9PT1hcmd1bWVudHMubGVuZ3RoKXQuY2FsbCh0aGlzKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dC5jYWxsKHRoaXMsZSl9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShrbCkscWw9ZnVuY3Rpb24oKXt9O3FsLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxxbC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcWx9LHFsLnNob3VsZE5ldmVyUmVhY2hIZXJlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcWwuc2hvdWxkTmV2ZXJSZWFjaEhlcmUobnVsbCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3Rocm93IG5ldyBHbCgiU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUiKyhudWxsIT09dD8iOiAiK3Q6IiIpKX19LHFsLmlzVHJ1ZT1mdW5jdGlvbigpe3ZhciB0O2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXFsLmlzVHJ1ZShhcmd1bWVudHNbMF0sbnVsbCk7ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmKHQ9YXJndW1lbnRzWzFdLCFhcmd1bWVudHNbMF0pKXRocm93IG51bGw9PT10P25ldyBHbDpuZXcgR2wodCl9LHFsLmVxdWFscz1mdW5jdGlvbigpe3ZhciB0LGUsbjtpZigyPT09YXJndW1lbnRzLmxlbmd0aClxbC5lcXVhbHModD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbnVsbCk7ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCYmKHQ9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzJdLCEoZT1hcmd1bWVudHNbMV0pLmVxdWFscyh0KSkpdGhyb3cgbmV3IEdsKCJFeHBlY3RlZCAiK3QrIiBidXQgZW5jb3VudGVyZWQgIitlKyhudWxsIT09bj8iOiAiK246IiIpKX07dmFyIEJsPWZ1bmN0aW9uKCl7dGhpcy5fcmVzdWx0PW51bGwsdGhpcy5faW5wdXRMaW5lcz1BcnJheSgyKS5maWxsKCkubWFwKChmdW5jdGlvbigpe3JldHVybiBBcnJheSgyKX0pKSx0aGlzLl9pbnRQdD1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9pbnRMaW5lSW5kZXg9bnVsbCx0aGlzLl9pc1Byb3Blcj1udWxsLHRoaXMuX3BhPW51bGwsdGhpcy5fcGI9bnVsbCx0aGlzLl9wcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX2ludFB0WzBdPW5ldyB1bCx0aGlzLl9pbnRQdFsxXT1uZXcgdWwsdGhpcy5fcGE9dGhpcy5faW50UHRbMF0sdGhpcy5fcGI9dGhpcy5faW50UHRbMV0sdGhpcy5fcmVzdWx0PTB9LHpsPXtET05UX0lOVEVSU0VDVDp7Y29uZmlndXJhYmxlOiEwfSxET19JTlRFUlNFQ1Q6e2NvbmZpZ3VyYWJsZTohMH0sQ09MTElORUFSOntjb25maWd1cmFibGU6ITB9LE5PX0lOVEVSU0VDVElPTjp7Y29uZmlndXJhYmxlOiEwfSxQT0lOVF9JTlRFUlNFQ1RJT046e2NvbmZpZ3VyYWJsZTohMH0sQ09MTElORUFSX0lOVEVSU0VDVElPTjp7Y29uZmlndXJhYmxlOiEwfX07QmwucHJvdG90eXBlLmdldEluZGV4QWxvbmdTZWdtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29tcHV0ZUludExpbmVJbmRleCgpLHRoaXMuX2ludExpbmVJbmRleFt0XVtlXX0sQmwucHJvdG90eXBlLmdldFRvcG9sb2d5U3VtbWFyeT1mdW5jdGlvbigpe3ZhciB0PW5ldyB2bDtyZXR1cm4gdGhpcy5pc0VuZFBvaW50KCkmJnQuYXBwZW5kKCIgZW5kcG9pbnQiKSx0aGlzLl9pc1Byb3BlciYmdC5hcHBlbmQoIiBwcm9wZXIiKSx0aGlzLmlzQ29sbGluZWFyKCkmJnQuYXBwZW5kKCIgY29sbGluZWFyIiksdC50b1N0cmluZygpfSxCbC5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXt0aGlzLl9pbnB1dExpbmVzWzBdWzBdPXQsdGhpcy5faW5wdXRMaW5lc1swXVsxXT1lLHRoaXMuX2lucHV0TGluZXNbMV1bMF09bix0aGlzLl9pbnB1dExpbmVzWzFdWzFdPXIsdGhpcy5fcmVzdWx0PXRoaXMuY29tcHV0ZUludGVyc2VjdCh0LGUsbixyKX0sQmwucHJvdG90eXBlLmdldEludGVyc2VjdGlvbk51bT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXN1bHR9LEJsLnByb3RvdHlwZS5jb21wdXRlSW50TGluZUluZGV4PWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpbnVsbD09PXRoaXMuX2ludExpbmVJbmRleCYmKHRoaXMuX2ludExpbmVJbmRleD1BcnJheSgyKS5maWxsKCkubWFwKChmdW5jdGlvbigpe3JldHVybiBBcnJheSgyKX0pKSx0aGlzLmNvbXB1dGVJbnRMaW5lSW5kZXgoMCksdGhpcy5jb21wdXRlSW50TGluZUluZGV4KDEpKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT10aGlzLmdldEVkZ2VEaXN0YW5jZSh0LDApLG49dGhpcy5nZXRFZGdlRGlzdGFuY2UodCwxKTtlPm4/KHRoaXMuX2ludExpbmVJbmRleFt0XVswXT0wLHRoaXMuX2ludExpbmVJbmRleFt0XVsxXT0xKToodGhpcy5faW50TGluZUluZGV4W3RdWzBdPTEsdGhpcy5faW50TGluZUluZGV4W3RdWzFdPTApfX0sQmwucHJvdG90eXBlLmlzUHJvcGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFzSW50ZXJzZWN0aW9uKCkmJnRoaXMuX2lzUHJvcGVyfSxCbC5wcm90b3R5cGUuc2V0UHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24odCl7dGhpcy5fcHJlY2lzaW9uTW9kZWw9dH0sQmwucHJvdG90eXBlLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiEhdGhpcy5pc0ludGVyaW9ySW50ZXJzZWN0aW9uKDApfHwhIXRoaXMuaXNJbnRlcmlvckludGVyc2VjdGlvbigxKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPTA7bjx0aGlzLl9yZXN1bHQ7bisrKWlmKCF0Ll9pbnRQdFtuXS5lcXVhbHMyRCh0Ll9pbnB1dExpbmVzW2VdWzBdKSYmIXQuX2ludFB0W25dLmVxdWFsczJEKHQuX2lucHV0TGluZXNbZV1bMV0pKXJldHVybiEwO3JldHVybiExfX0sQmwucHJvdG90eXBlLmdldEludGVyc2VjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW50UHRbdF19LEJsLnByb3RvdHlwZS5pc0VuZFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFzSW50ZXJzZWN0aW9uKCkmJiF0aGlzLl9pc1Byb3Blcn0sQmwucHJvdG90eXBlLmhhc0ludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXN1bHQhPT1CbC5OT19JTlRFUlNFQ1RJT059LEJsLnByb3RvdHlwZS5nZXRFZGdlRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQmwuY29tcHV0ZUVkZ2VEaXN0YW5jZSh0aGlzLl9pbnRQdFtlXSx0aGlzLl9pbnB1dExpbmVzW3RdWzBdLHRoaXMuX2lucHV0TGluZXNbdF1bMV0pfSxCbC5wcm90b3R5cGUuaXNDb2xsaW5lYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzdWx0PT09QmwuQ09MTElORUFSX0lOVEVSU0VDVElPTn0sQmwucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEZsLnRvTGluZVN0cmluZyh0aGlzLl9pbnB1dExpbmVzWzBdWzBdLHRoaXMuX2lucHV0TGluZXNbMF1bMV0pKyIgLSAiK0ZsLnRvTGluZVN0cmluZyh0aGlzLl9pbnB1dExpbmVzWzFdWzBdLHRoaXMuX2lucHV0TGluZXNbMV1bMV0pK3RoaXMuZ2V0VG9wb2xvZ3lTdW1tYXJ5KCl9LEJsLnByb3RvdHlwZS5nZXRFbmRwb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9pbnB1dExpbmVzW3RdW2VdfSxCbC5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9yZXN1bHQ7ZSsrKWlmKHRoaXMuX2ludFB0W2VdLmVxdWFsczJEKHQpKXJldHVybiEwO3JldHVybiExfSxCbC5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9uQWxvbmdTZWdtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29tcHV0ZUludExpbmVJbmRleCgpLHRoaXMuX2ludFB0W3RoaXMuX2ludExpbmVJbmRleFt0XVtlXV19LEJsLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxCbC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQmx9LEJsLmNvbXB1dGVFZGdlRGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPU1hdGguYWJzKG4ueC1lLngpLGk9TWF0aC5hYnMobi55LWUueSksbz0tMTtpZih0LmVxdWFscyhlKSlvPTA7ZWxzZSBpZih0LmVxdWFscyhuKSlvPXI+aT9yOmk7ZWxzZXt2YXIgcz1NYXRoLmFicyh0LngtZS54KSxhPU1hdGguYWJzKHQueS1lLnkpOzAhPT0obz1yPmk/czphKXx8dC5lcXVhbHMoZSl8fChvPU1hdGgubWF4KHMsYSkpfXJldHVybiBxbC5pc1RydWUoISgwPT09byYmIXQuZXF1YWxzKGUpKSwiQmFkIGRpc3RhbmNlIGNhbGN1bGF0aW9uIiksb30sQmwubm9uUm9idXN0Q29tcHV0ZUVkZ2VEaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC54LWUueCxpPXQueS1lLnksbz1NYXRoLnNxcnQocipyK2kqaSk7cmV0dXJuIHFsLmlzVHJ1ZSghKDA9PT1vJiYhdC5lcXVhbHMoZSkpLCJJbnZhbGlkIGRpc3RhbmNlIGNhbGN1bGF0aW9uIiksb30semwuRE9OVF9JTlRFUlNFQ1QuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHpsLkRPX0lOVEVSU0VDVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0semwuQ09MTElORUFSLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSx6bC5OT19JTlRFUlNFQ1RJT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHpsLlBPSU5UX0lOVEVSU0VDVElPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0semwuQ09MTElORUFSX0lOVEVSU0VDVElPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmwsemwpO3ZhciBqbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzSW5TZWdtZW50RW52ZWxvcGVzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBMbCh0aGlzLl9pbnB1dExpbmVzWzBdWzBdLHRoaXMuX2lucHV0TGluZXNbMF1bMV0pLG49bmV3IExsKHRoaXMuX2lucHV0TGluZXNbMV1bMF0sdGhpcy5faW5wdXRMaW5lc1sxXVsxXSk7cmV0dXJuIGUuY29udGFpbnModCkmJm4uY29udGFpbnModCl9LGUucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtpZigzIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO2lmKHRoaXMuX2lzUHJvcGVyPSExLExsLmludGVyc2VjdHMobixyLGUpJiYwPT09WGwub3JpZW50YXRpb25JbmRleChuLHIsZSkmJjA9PT1YbC5vcmllbnRhdGlvbkluZGV4KHIsbixlKSlyZXR1cm4gdGhpcy5faXNQcm9wZXI9ITAsKGUuZXF1YWxzKG4pfHxlLmVxdWFscyhyKSkmJih0aGlzLl9pc1Byb3Blcj0hMSksdGhpcy5fcmVzdWx0PXQuUE9JTlRfSU5URVJTRUNUSU9OLG51bGw7dGhpcy5fcmVzdWx0PXQuTk9fSU5URVJTRUNUSU9OfSxlLnByb3RvdHlwZS5ub3JtYWxpemVUb01pbmltdW09ZnVuY3Rpb24odCxlLG4scixpKXtpLng9dGhpcy5zbWFsbGVzdEluQWJzVmFsdWUodC54LGUueCxuLngsci54KSxpLnk9dGhpcy5zbWFsbGVzdEluQWJzVmFsdWUodC55LGUueSxuLnksci55KSx0LngtPWkueCx0LnktPWkueSxlLngtPWkueCxlLnktPWkueSxuLngtPWkueCxuLnktPWkueSxyLngtPWkueCxyLnktPWkueX0sZS5wcm90b3R5cGUuc2FmZUhDb29yZGluYXRlSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPW51bGw7dHJ5e289TWwuaW50ZXJzZWN0aW9uKHQsbixyLGkpfWNhdGNoKHMpe2lmKCEocyBpbnN0YW5jZW9mIENsKSl0aHJvdyBzO289ZS5uZWFyZXN0RW5kcG9pbnQodCxuLHIsaSl9cmV0dXJuIG99LGUucHJvdG90eXBlLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LG4scixpKXt2YXIgbz10aGlzLmludGVyc2VjdGlvbldpdGhOb3JtYWxpemF0aW9uKHQsbixyLGkpO3JldHVybiB0aGlzLmlzSW5TZWdtZW50RW52ZWxvcGVzKG8pfHwobz1uZXcgdWwoZS5uZWFyZXN0RW5kcG9pbnQodCxuLHIsaSkpKSxudWxsIT09dGhpcy5fcHJlY2lzaW9uTW9kZWwmJnRoaXMuX3ByZWNpc2lvbk1vZGVsLm1ha2VQcmVjaXNlKG8pLG99LGUucHJvdG90eXBlLnNtYWxsZXN0SW5BYnNWYWx1ZT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LG89TWF0aC5hYnMoaSk7cmV0dXJuIE1hdGguYWJzKGUpPG8mJihpPWUsbz1NYXRoLmFicyhlKSksTWF0aC5hYnMobik8byYmKGk9bixvPU1hdGguYWJzKG4pKSxNYXRoLmFicyhyKTxvJiYoaT1yKSxpfSxlLnByb3RvdHlwZS5jaGVja0REPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89YmwuaW50ZXJzZWN0aW9uKHQsZSxuLHIpLHM9dGhpcy5pc0luU2VnbWVudEVudmVsb3BlcyhvKTtQbC5vdXQucHJpbnRsbigiREQgaW4gZW52ID0gIitzKyIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAiK28pLGkuZGlzdGFuY2Uobyk+MWUtNCYmUGwub3V0LnByaW50bG4oIkRpc3RhbmNlID0gIitpLmRpc3RhbmNlKG8pKX0sZS5wcm90b3R5cGUuaW50ZXJzZWN0aW9uV2l0aE5vcm1hbGl6YXRpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bmV3IHVsKHQpLG89bmV3IHVsKGUpLHM9bmV3IHVsKG4pLGE9bmV3IHVsKHIpLHU9bmV3IHVsO3RoaXMubm9ybWFsaXplVG9FbnZDZW50cmUoaSxvLHMsYSx1KTt2YXIgbD10aGlzLnNhZmVIQ29vcmRpbmF0ZUludGVyc2VjdGlvbihpLG8scyxhKTtyZXR1cm4gbC54Kz11LngsbC55Kz11LnksbH0sZS5wcm90b3R5cGUuY29tcHV0ZUNvbGxpbmVhckludGVyc2VjdGlvbj1mdW5jdGlvbihlLG4scixpKXt2YXIgbz1MbC5pbnRlcnNlY3RzKGUsbixyKSxzPUxsLmludGVyc2VjdHMoZSxuLGkpLGE9TGwuaW50ZXJzZWN0cyhyLGksZSksdT1MbC5pbnRlcnNlY3RzKHIsaSxuKTtyZXR1cm4gbyYmcz8odGhpcy5faW50UHRbMF09cix0aGlzLl9pbnRQdFsxXT1pLHQuQ09MTElORUFSX0lOVEVSU0VDVElPTik6YSYmdT8odGhpcy5faW50UHRbMF09ZSx0aGlzLl9pbnRQdFsxXT1uLHQuQ09MTElORUFSX0lOVEVSU0VDVElPTik6byYmYT8odGhpcy5faW50UHRbMF09cix0aGlzLl9pbnRQdFsxXT1lLCFyLmVxdWFscyhlKXx8c3x8dT90LkNPTExJTkVBUl9JTlRFUlNFQ1RJT046dC5QT0lOVF9JTlRFUlNFQ1RJT04pOm8mJnU/KHRoaXMuX2ludFB0WzBdPXIsdGhpcy5faW50UHRbMV09biwhci5lcXVhbHMobil8fHN8fGE/dC5DT0xMSU5FQVJfSU5URVJTRUNUSU9OOnQuUE9JTlRfSU5URVJTRUNUSU9OKTpzJiZhPyh0aGlzLl9pbnRQdFswXT1pLHRoaXMuX2ludFB0WzFdPWUsIWkuZXF1YWxzKGUpfHxvfHx1P3QuQ09MTElORUFSX0lOVEVSU0VDVElPTjp0LlBPSU5UX0lOVEVSU0VDVElPTik6cyYmdT8odGhpcy5faW50UHRbMF09aSx0aGlzLl9pbnRQdFsxXT1uLCFpLmVxdWFscyhuKXx8b3x8YT90LkNPTExJTkVBUl9JTlRFUlNFQ1RJT046dC5QT0lOVF9JTlRFUlNFQ1RJT04pOnQuTk9fSU5URVJTRUNUSU9OfSxlLnByb3RvdHlwZS5ub3JtYWxpemVUb0VudkNlbnRyZT1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXQueDxlLng/dC54OmUueCxzPXQueTxlLnk/dC55OmUueSxhPXQueD5lLng/dC54OmUueCx1PXQueT5lLnk/dC55OmUueSxsPW4ueDxyLng/bi54OnIueCxjPW4ueTxyLnk/bi55OnIueSxoPW4ueD5yLng/bi54OnIueCxwPW4ueT5yLnk/bi55OnIueSxmPSgobz5sP286bCkrKGE8aD9hOmgpKS8yLGc9KChzPmM/czpjKSsodTxwP3U6cCkpLzI7aS54PWYsaS55PWcsdC54LT1pLngsdC55LT1pLnksZS54LT1pLngsZS55LT1pLnksbi54LT1pLngsbi55LT1pLnksci54LT1pLngsci55LT1pLnl9LGUucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Q9ZnVuY3Rpb24oZSxuLHIsaSl7aWYodGhpcy5faXNQcm9wZXI9ITEsIUxsLmludGVyc2VjdHMoZSxuLHIsaSkpcmV0dXJuIHQuTk9fSU5URVJTRUNUSU9OO3ZhciBvPVhsLm9yaWVudGF0aW9uSW5kZXgoZSxuLHIpLHM9WGwub3JpZW50YXRpb25JbmRleChlLG4saSk7aWYobz4wJiZzPjB8fG88MCYmczwwKXJldHVybiB0Lk5PX0lOVEVSU0VDVElPTjt2YXIgYT1YbC5vcmllbnRhdGlvbkluZGV4KHIsaSxlKSx1PVhsLm9yaWVudGF0aW9uSW5kZXgocixpLG4pO3JldHVybiBhPjAmJnU+MHx8YTwwJiZ1PDA/dC5OT19JTlRFUlNFQ1RJT046MD09PW8mJjA9PT1zJiYwPT09YSYmMD09PXU/dGhpcy5jb21wdXRlQ29sbGluZWFySW50ZXJzZWN0aW9uKGUsbixyLGkpOigwPT09b3x8MD09PXN8fDA9PT1hfHwwPT09dT8odGhpcy5faXNQcm9wZXI9ITEsZS5lcXVhbHMyRChyKXx8ZS5lcXVhbHMyRChpKT90aGlzLl9pbnRQdFswXT1lOm4uZXF1YWxzMkQocil8fG4uZXF1YWxzMkQoaSk/dGhpcy5faW50UHRbMF09bjowPT09bz90aGlzLl9pbnRQdFswXT1uZXcgdWwocik6MD09PXM/dGhpcy5faW50UHRbMF09bmV3IHVsKGkpOjA9PT1hP3RoaXMuX2ludFB0WzBdPW5ldyB1bChlKTowPT09dSYmKHRoaXMuX2ludFB0WzBdPW5ldyB1bChuKSkpOih0aGlzLl9pc1Byb3Blcj0hMCx0aGlzLl9pbnRQdFswXT10aGlzLmludGVyc2VjdGlvbihlLG4scixpKSksdC5QT0lOVF9JTlRFUlNFQ1RJT04pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLm5lYXJlc3RFbmRwb2ludD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LG89WGwuZGlzdGFuY2VQb2ludExpbmUodCxuLHIpLHM9WGwuZGlzdGFuY2VQb2ludExpbmUoZSxuLHIpO3JldHVybiBzPG8mJihvPXMsaT1lKSwocz1YbC5kaXN0YW5jZVBvaW50TGluZShuLHQsZSkpPG8mJihvPXMsaT1uKSwocz1YbC5kaXN0YW5jZVBvaW50TGluZShyLHQsZSkpPG8mJihvPXMsaT1yKSxpfSxlfShCbCksVWw9ZnVuY3Rpb24oKXt9O1VsLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxVbC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVWx9LFVsLm9yaWVudGF0aW9uSW5kZXg9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUueC10LngsaT1lLnktdC55LG89bi54LWUueCxzPW4ueS1lLnk7cmV0dXJuIFVsLnNpZ25PZkRldDJ4MihyLGksbyxzKX0sVWwuc2lnbk9mRGV0MngyPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW51bGwsbz1udWxsLHM9bnVsbDtpZihpPTEsMD09PXR8fDA9PT1yKXJldHVybiAwPT09ZXx8MD09PW4/MDplPjA/bj4wPy1pOmk6bj4wP2k6LWk7aWYoMD09PWV8fDA9PT1uKXJldHVybiByPjA/dD4wP2k6LWk6dD4wPy1pOmk7aWYoZT4wP3I+MD9lPD1yfHwoaT0taSxvPXQsdD1uLG49byxvPWUsZT1yLHI9byk6ZTw9LXI/KGk9LWksbj0tbixyPS1yKToobz10LHQ9LW4sbj1vLG89ZSxlPS1yLHI9byk6cj4wPy1lPD1yPyhpPS1pLHQ9LXQsZT0tZSk6KG89LXQsdD1uLG49byxvPS1lLGU9cixyPW8pOmU+PXI/KHQ9LXQsZT0tZSxuPS1uLHI9LXIpOihpPS1pLG89LXQsdD0tbixuPW8sbz0tZSxlPS1yLHI9byksdD4wKXtpZighKG4+MCkpcmV0dXJuIGk7aWYoISh0PD1uKSlyZXR1cm4gaX1lbHNle2lmKG4+MClyZXR1cm4taTtpZighKHQ+PW4pKXJldHVybi1pO2k9LWksdD0tdCxuPS1ufWZvcig7Oyl7aWYoKHItPShzPU1hdGguZmxvb3Iobi90KSkqZSk8MClyZXR1cm4taTtpZihyPmUpcmV0dXJuIGk7aWYodD4obi09cyp0KStuKXtpZihlPHIrcilyZXR1cm4gaX1lbHNle2lmKGU+cityKXJldHVybi1pO249dC1uLHI9ZS1yLGk9LWl9aWYoMD09PXIpcmV0dXJuIDA9PT1uPzA6LWk7aWYoMD09PW4pcmV0dXJuIGk7aWYoKGUtPShzPU1hdGguZmxvb3IodC9uKSkqcik8MClyZXR1cm4gaTtpZihlPnIpcmV0dXJuLWk7aWYobj4odC09cypuKSt0KXtpZihyPGUrZSlyZXR1cm4taX1lbHNle2lmKHI+ZStlKXJldHVybiBpO3Q9bi10LGU9ci1lLGk9LWl9aWYoMD09PWUpcmV0dXJuIDA9PT10PzA6aTtpZigwPT09dClyZXR1cm4taX19O3ZhciBWbD1mdW5jdGlvbigpe3RoaXMuX3A9bnVsbCx0aGlzLl9jcm9zc2luZ0NvdW50PTAsdGhpcy5faXNQb2ludE9uU2VnbWVudD0hMTt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fcD10fTtWbC5wcm90b3R5cGUuY291bnRTZWdtZW50PWZ1bmN0aW9uKHQsZSl7aWYodC54PHRoaXMuX3AueCYmZS54PHRoaXMuX3AueClyZXR1cm4gbnVsbDtpZih0aGlzLl9wLng9PT1lLngmJnRoaXMuX3AueT09PWUueSlyZXR1cm4gdGhpcy5faXNQb2ludE9uU2VnbWVudD0hMCxudWxsO2lmKHQueT09PXRoaXMuX3AueSYmZS55PT09dGhpcy5fcC55KXt2YXIgbj10Lngscj1lLng7cmV0dXJuIG4+ciYmKG49ZS54LHI9dC54KSx0aGlzLl9wLng+PW4mJnRoaXMuX3AueDw9ciYmKHRoaXMuX2lzUG9pbnRPblNlZ21lbnQ9ITApLG51bGx9aWYodC55PnRoaXMuX3AueSYmZS55PD10aGlzLl9wLnl8fGUueT50aGlzLl9wLnkmJnQueTw9dGhpcy5fcC55KXt2YXIgaT10LngtdGhpcy5fcC54LG89dC55LXRoaXMuX3AueSxzPWUueC10aGlzLl9wLngsYT1lLnktdGhpcy5fcC55LHU9VWwuc2lnbk9mRGV0MngyKGksbyxzLGEpO2lmKDA9PT11KXJldHVybiB0aGlzLl9pc1BvaW50T25TZWdtZW50PSEwLG51bGw7YTxvJiYodT0tdSksdT4wJiZ0aGlzLl9jcm9zc2luZ0NvdW50Kyt9fSxWbC5wcm90b3R5cGUuaXNQb2ludEluUG9seWdvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldExvY2F0aW9uKCkhPT1wbC5FWFRFUklPUn0sVmwucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzUG9pbnRPblNlZ21lbnQ/cGwuQk9VTkRBUlk6dGhpcy5fY3Jvc3NpbmdDb3VudCUyPT0xP3BsLklOVEVSSU9SOnBsLkVYVEVSSU9SfSxWbC5wcm90b3R5cGUuaXNPblNlZ21lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNQb2ludE9uU2VnbWVudH0sVmwucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFZsLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBWbH0sVmwubG9jYXRlUG9pbnRJblJpbmc9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsJiZnbChhcmd1bWVudHNbMV0sSWwpKXtmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IFZsKHQpLHI9bmV3IHVsLGk9bmV3IHVsLG89MTtvPGUuc2l6ZSgpO28rKylpZihlLmdldENvb3JkaW5hdGUobyxyKSxlLmdldENvb3JkaW5hdGUoby0xLGkpLG4uY291bnRTZWdtZW50KHIsaSksbi5pc09uU2VnbWVudCgpKXJldHVybiBuLmdldExvY2F0aW9uKCk7cmV0dXJuIG4uZ2V0TG9jYXRpb24oKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdLHU9bmV3IFZsKHMpLGw9MTtsPGEubGVuZ3RoO2wrKyl7dmFyIGM9YVtsXSxoPWFbbC0xXTtpZih1LmNvdW50U2VnbWVudChjLGgpLHUuaXNPblNlZ21lbnQoKSlyZXR1cm4gdS5nZXRMb2NhdGlvbigpfXJldHVybiB1LmdldExvY2F0aW9uKCl9fTt2YXIgWGw9ZnVuY3Rpb24oKXt9LFlsPXtDTE9DS1dJU0U6e2NvbmZpZ3VyYWJsZTohMH0sUklHSFQ6e2NvbmZpZ3VyYWJsZTohMH0sQ09VTlRFUkNMT0NLV0lTRTp7Y29uZmlndXJhYmxlOiEwfSxMRUZUOntjb25maWd1cmFibGU6ITB9LENPTExJTkVBUjp7Y29uZmlndXJhYmxlOiEwfSxTVFJBSUdIVDp7Y29uZmlndXJhYmxlOiEwfX07WGwucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFhsLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBYbH0sWGwub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGJsLm9yaWVudGF0aW9uSW5kZXgodCxlLG4pfSxYbC5zaWduZWRBcmVhPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7dmFyIHQ9YXJndW1lbnRzWzBdO2lmKHQubGVuZ3RoPDMpcmV0dXJuIDA7Zm9yKHZhciBlPTAsbj10WzBdLngscj0xO3I8dC5sZW5ndGgtMTtyKyspe3ZhciBpPXRbcl0ueC1uLG89dFtyKzFdLnkscz10W3ItMV0ueTtlKz1pKihzLW8pfXJldHVybiBlLzJ9aWYoZ2woYXJndW1lbnRzWzBdLElsKSl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YS5zaXplKCk7aWYodTwzKXJldHVybiAwO3ZhciBsPW5ldyB1bCxjPW5ldyB1bCxoPW5ldyB1bDthLmdldENvb3JkaW5hdGUoMCxjKSxhLmdldENvb3JkaW5hdGUoMSxoKTt2YXIgcD1jLng7aC54LT1wO2Zvcih2YXIgZj0wLGc9MTtnPHUtMTtnKyspbC55PWMueSxjLng9aC54LGMueT1oLnksYS5nZXRDb29yZGluYXRlKGcrMSxoKSxoLngtPXAsZis9Yy54KihsLnktaC55KTtyZXR1cm4gZi8yfX0sWGwuZGlzdGFuY2VMaW5lTGluZT1mdW5jdGlvbih0LGUsbixyKXtpZih0LmVxdWFscyhlKSlyZXR1cm4gWGwuZGlzdGFuY2VQb2ludExpbmUodCxuLHIpO2lmKG4uZXF1YWxzKHIpKXJldHVybiBYbC5kaXN0YW5jZVBvaW50TGluZShyLHQsZSk7dmFyIGk9ITE7aWYoTGwuaW50ZXJzZWN0cyh0LGUsbixyKSl7dmFyIG89KGUueC10LngpKihyLnktbi55KS0oZS55LXQueSkqKHIueC1uLngpO2lmKDA9PT1vKWk9ITA7ZWxzZXt2YXIgcz0odC55LW4ueSkqKHIueC1uLngpLSh0Lngtbi54KSooci55LW4ueSksYT0oKHQueS1uLnkpKihlLngtdC54KS0odC54LW4ueCkqKGUueS10LnkpKS9vLHU9cy9vOyh1PDB8fHU+MXx8YTwwfHxhPjEpJiYoaT0hMCl9fWVsc2UgaT0hMDtyZXR1cm4gaT9kbC5taW4oWGwuZGlzdGFuY2VQb2ludExpbmUodCxuLHIpLFhsLmRpc3RhbmNlUG9pbnRMaW5lKGUsbixyKSxYbC5kaXN0YW5jZVBvaW50TGluZShuLHQsZSksWGwuZGlzdGFuY2VQb2ludExpbmUocix0LGUpKTowfSxYbC5pc1BvaW50SW5SaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFhsLmxvY2F0ZVBvaW50SW5SaW5nKHQsZSkhPT1wbC5FWFRFUklPUn0sWGwuY29tcHV0ZUxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT10LnNpemUoKTtpZihlPD0xKXJldHVybiAwO3ZhciBuPTAscj1uZXcgdWw7dC5nZXRDb29yZGluYXRlKDAscik7Zm9yKHZhciBpPXIueCxvPXIueSxzPTE7czxlO3MrKyl7dC5nZXRDb29yZGluYXRlKHMscik7dmFyIGE9ci54LHU9ci55LGw9YS1pLGM9dS1vO24rPU1hdGguc3FydChsKmwrYypjKSxpPWEsbz11fXJldHVybiBufSxYbC5pc0NDVz1mdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aC0xO2lmKGU8Myl0aHJvdyBuZXcgZWwoIlJpbmcgaGFzIGZld2VyIHRoYW4gNCBwb2ludHMsIHNvIG9yaWVudGF0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkIik7Zm9yKHZhciBuPXRbMF0scj0wLGk9MTtpPD1lO2krKyl7dmFyIG89dFtpXTtvLnk+bi55JiYobj1vLHI9aSl9dmFyIHM9cjtkb3socy09MSk8MCYmKHM9ZSl9d2hpbGUodFtzXS5lcXVhbHMyRChuKSYmcyE9PXIpO3ZhciBhPXI7ZG97YT0oYSsxKSVlfXdoaWxlKHRbYV0uZXF1YWxzMkQobikmJmEhPT1yKTt2YXIgdT10W3NdLGw9dFthXTtpZih1LmVxdWFsczJEKG4pfHxsLmVxdWFsczJEKG4pfHx1LmVxdWFsczJEKGwpKXJldHVybiExO3ZhciBjPVhsLmNvbXB1dGVPcmllbnRhdGlvbih1LG4sbCksaD0hMTtyZXR1cm4gaD0wPT09Yz91Lng+bC54OmM+MCxofSxYbC5sb2NhdGVQb2ludEluUmluZz1mdW5jdGlvbih0LGUpe3JldHVybiBWbC5sb2NhdGVQb2ludEluUmluZyh0LGUpfSxYbC5kaXN0YW5jZVBvaW50TGluZVBlcnBlbmRpY3VsYXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPShuLngtZS54KSoobi54LWUueCkrKG4ueS1lLnkpKihuLnktZS55KSxpPSgoZS55LXQueSkqKG4ueC1lLngpLShlLngtdC54KSoobi55LWUueSkpL3I7cmV0dXJuIE1hdGguYWJzKGkpKk1hdGguc3FydChyKX0sWGwuY29tcHV0ZU9yaWVudGF0aW9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gWGwub3JpZW50YXRpb25JbmRleCh0LGUsbil9LFhsLmRpc3RhbmNlUG9pbnRMaW5lPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IGVsKCJMaW5lIGFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgdmVydGV4Iik7Zm9yKHZhciBuPXQuZGlzdGFuY2UoZVswXSkscj0wO3I8ZS5sZW5ndGgtMTtyKyspe3ZhciBpPVhsLmRpc3RhbmNlUG9pbnRMaW5lKHQsZVtyXSxlW3IrMV0pO2k8biYmKG49aSl9cmV0dXJuIG59aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXTtpZihzLng9PT1hLngmJnMueT09PWEueSlyZXR1cm4gby5kaXN0YW5jZShzKTt2YXIgdT0oYS54LXMueCkqKGEueC1zLngpKyhhLnktcy55KSooYS55LXMueSksbD0oKG8ueC1zLngpKihhLngtcy54KSsoby55LXMueSkqKGEueS1zLnkpKS91O2lmKGw8PTApcmV0dXJuIG8uZGlzdGFuY2Uocyk7aWYobD49MSlyZXR1cm4gby5kaXN0YW5jZShhKTt2YXIgYz0oKHMueS1vLnkpKihhLngtcy54KS0ocy54LW8ueCkqKGEueS1zLnkpKS91O3JldHVybiBNYXRoLmFicyhjKSpNYXRoLnNxcnQodSl9fSxYbC5pc09uTGluZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgamwscj0xO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3ItMV0sbz1lW3JdO2lmKG4uY29tcHV0ZUludGVyc2VjdGlvbih0LGksbyksbi5oYXNJbnRlcnNlY3Rpb24oKSlyZXR1cm4hMH1yZXR1cm4hMX0sWWwuQ0xPQ0tXSVNFLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxZbC5SSUdIVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gWGwuQ0xPQ0tXSVNFfSxZbC5DT1VOVEVSQ0xPQ0tXSVNFLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxZbC5MRUZULmdldD1mdW5jdGlvbigpe3JldHVybiBYbC5DT1VOVEVSQ0xPQ0tXSVNFfSxZbC5DT0xMSU5FQVIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LFlsLlNUUkFJR0hULmdldD1mdW5jdGlvbigpe3JldHVybiBYbC5DT0xMSU5FQVJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFhsLFlsKTt2YXIgSGw9ZnVuY3Rpb24oKXt9O0hsLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7fSxIbC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSGwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEhsfTt2YXIgV2w9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZW52ZWxvcGU9bnVsbCx0aGlzLl9mYWN0b3J5PW51bGwsdGhpcy5fU1JJRD1udWxsLHRoaXMuX3VzZXJEYXRhPW51bGwsdGhpcy5fZmFjdG9yeT10LHRoaXMuX1NSSUQ9dC5nZXRTUklEKCl9LEpsPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9QT0lOVDp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTVVMVElQT0lOVDp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTElORVNUUklORzp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTElORUFSUklORzp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTVVMVElMSU5FU1RSSU5HOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9QT0xZR09OOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9NVUxUSVBPTFlHT046e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTjp7Y29uZmlndXJhYmxlOiEwfSxnZW9tZXRyeUNoYW5nZWRGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH19O1dsLnByb3RvdHlwZS5pc0dlb21ldHJ5Q29sbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFNvcnRJbmRleCgpPT09V2wuU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTn0sV2wucHJvdG90eXBlLmdldEZhY3Rvcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmFjdG9yeX0sV2wucHJvdG90eXBlLmdldEdlb21ldHJ5Tj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpc30sV2wucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sV2wucHJvdG90eXBlLmlzUmVjdGFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuITF9LFdsLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFdsKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIG51bGwhPT10JiZ0aGlzLmVxdWFsc1RvcG8odCl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3Qpe3ZhciBlPWFyZ3VtZW50c1swXTtpZighKGUgaW5zdGFuY2VvZiBXbCkpcmV0dXJuITE7dmFyIG49ZTtyZXR1cm4gdGhpcy5lcXVhbHNFeGFjdChuKX19LFdsLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcz09PXR8fHRoaXMuZXF1YWxzRXhhY3QodCwwKX0sV2wucHJvdG90eXBlLmdlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3RoaXMuYXBwbHkoV2wuZ2VvbWV0cnlDaGFuZ2VkRmlsdGVyKX0sV2wucHJvdG90eXBlLmdlb21ldHJ5Q2hhbmdlZEFjdGlvbj1mdW5jdGlvbigpe3RoaXMuX2VudmVsb3BlPW51bGx9LFdsLnByb3RvdHlwZS5lcXVhbHNOb3JtPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dCYmdGhpcy5ub3JtKCkuZXF1YWxzRXhhY3QodC5ub3JtKCkpfSxXbC5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LFdsLnByb3RvdHlwZS5nZXROdW1HZW9tZXRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIDF9LFdsLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dDtyZXR1cm4gdGhpcy5nZXRTb3J0SW5kZXgoKSE9PWUuZ2V0U29ydEluZGV4KCk/dGhpcy5nZXRTb3J0SW5kZXgoKS1lLmdldFNvcnRJbmRleCgpOnRoaXMuaXNFbXB0eSgpJiZlLmlzRW1wdHkoKT8wOnRoaXMuaXNFbXB0eSgpPy0xOmUuaXNFbXB0eSgpPzE6dGhpcy5jb21wYXJlVG9TYW1lQ2xhc3ModCl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5nZXRTb3J0SW5kZXgoKSE9PW4uZ2V0U29ydEluZGV4KCk/dGhpcy5nZXRTb3J0SW5kZXgoKS1uLmdldFNvcnRJbmRleCgpOnRoaXMuaXNFbXB0eSgpJiZuLmlzRW1wdHkoKT8wOnRoaXMuaXNFbXB0eSgpPy0xOm4uaXNFbXB0eSgpPzE6dGhpcy5jb21wYXJlVG9TYW1lQ2xhc3MobixyKX19LFdsLnByb3RvdHlwZS5nZXRVc2VyRGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91c2VyRGF0YX0sV2wucHJvdG90eXBlLmdldFNSSUQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fU1JJRH0sV2wucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLnRvR2VvbWV0cnkodGhpcy5nZXRFbnZlbG9wZUludGVybmFsKCkpfSxXbC5wcm90b3R5cGUuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24odCl7aWYodC5nZXRTb3J0SW5kZXgoKT09PVdsLlNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT04pdGhyb3cgbmV3IGVsKCJUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IEdlb21ldHJ5Q29sbGVjdGlvbiBhcmd1bWVudHMiKX0sV2wucHJvdG90eXBlLmVxdWFsPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMD09PW4/dC5lcXVhbHMoZSk6dC5kaXN0YW5jZShlKTw9bn0sV2wucHJvdG90eXBlLm5vcm09ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvcHkoKTtyZXR1cm4gdC5ub3JtYWxpemUoKSx0fSxXbC5wcm90b3R5cGUuZ2V0UHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmFjdG9yeS5nZXRQcmVjaXNpb25Nb2RlbCgpfSxXbC5wcm90b3R5cGUuZ2V0RW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fZW52ZWxvcGUmJih0aGlzLl9lbnZlbG9wZT10aGlzLmNvbXB1dGVFbnZlbG9wZUludGVybmFsKCkpLG5ldyBMbCh0aGlzLl9lbnZlbG9wZSl9LFdsLnByb3RvdHlwZS5zZXRTUklEPWZ1bmN0aW9uKHQpe3RoaXMuX1NSSUQ9dH0sV2wucHJvdG90eXBlLnNldFVzZXJEYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX3VzZXJEYXRhPXR9LFdsLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuaXRlcmF0b3IoKSxyPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKSYmci5oYXNOZXh0KCk7KXt2YXIgaT1uLm5leHQoKSxvPXIubmV4dCgpLHM9aS5jb21wYXJlVG8obyk7aWYoMCE9PXMpcmV0dXJuIHN9cmV0dXJuIG4uaGFzTmV4dCgpPzE6ci5oYXNOZXh0KCk/LTE6MH0sV2wucHJvdG90eXBlLmhhc2hDb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmhhc2hDb2RlKCl9LFdsLnByb3RvdHlwZS5pc0dlb21ldHJ5Q29sbGVjdGlvbk9yRGVyaXZlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFNvcnRJbmRleCgpPT09V2wuU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTnx8dGhpcy5nZXRTb3J0SW5kZXgoKT09PVdsLlNPUlRJTkRFWF9NVUxUSVBPSU5UfHx0aGlzLmdldFNvcnRJbmRleCgpPT09V2wuU09SVElOREVYX01VTFRJTElORVNUUklOR3x8dGhpcy5nZXRTb3J0SW5kZXgoKT09PVdsLlNPUlRJTkRFWF9NVUxUSVBPTFlHT059LFdsLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltvbCxpbCxhbF19LFdsLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBXbH0sV2wuaGFzTm9uRW1wdHlFbGVtZW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZighdFtlXS5pc0VtcHR5KCkpcmV0dXJuITA7cmV0dXJuITF9LFdsLmhhc051bGxFbGVtZW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZihudWxsPT09dFtlXSlyZXR1cm4hMDtyZXR1cm4hMX0sSmwuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg3OTllYTQ2NTIyODU0YzAwfSxKbC5TT1JUSU5ERVhfUE9JTlQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LEpsLlNPUlRJTkRFWF9NVUxUSVBPSU5ULmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxKbC5TT1JUSU5ERVhfTElORVNUUklORy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sSmwuU09SVElOREVYX0xJTkVBUlJJTkcuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LEpsLlNPUlRJTkRFWF9NVUxUSUxJTkVTVFJJTkcuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDR9LEpsLlNPUlRJTkRFWF9QT0xZR09OLmdldD1mdW5jdGlvbigpe3JldHVybiA1fSxKbC5TT1JUSU5ERVhfTVVMVElQT0xZR09OLmdldD1mdW5jdGlvbigpe3JldHVybiA2fSxKbC5TT1JUSU5ERVhfR0VPTUVUUllDT0xMRUNUSU9OLmdldD1mdW5jdGlvbigpe3JldHVybiA3fSxKbC5nZW9tZXRyeUNoYW5nZWRGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFpsfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhXbCxKbCk7dmFyIFpsPWZ1bmN0aW9uKCl7fTtabC5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltIbF19LFpsLmZpbHRlcj1mdW5jdGlvbih0KXt0Lmdlb21ldHJ5Q2hhbmdlZEFjdGlvbigpfTt2YXIgS2w9ZnVuY3Rpb24oKXt9O0tsLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7fSxLbC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sS2wucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEtsfTt2YXIgUWw9ZnVuY3Rpb24oKXt9LCRsPXtNb2QyQm91bmRhcnlOb2RlUnVsZTp7Y29uZmlndXJhYmxlOiEwfSxFbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGU6e2NvbmZpZ3VyYWJsZTohMH0sTXVsdGlWYWxlbnRFbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGU6e2NvbmZpZ3VyYWJsZTohMH0sTW9ub1ZhbGVudEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZTp7Y29uZmlndXJhYmxlOiEwfSxNT0QyX0JPVU5EQVJZX1JVTEU6e2NvbmZpZ3VyYWJsZTohMH0sRU5EUE9JTlRfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfSxNVUxUSVZBTEVOVF9FTkRQT0lOVF9CT1VOREFSWV9SVUxFOntjb25maWd1cmFibGU6ITB9LE1PTk9WQUxFTlRfRU5EUE9JTlRfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfSxPR0NfU0ZTX0JPVU5EQVJZX1JVTEU6e2NvbmZpZ3VyYWJsZTohMH19O1FsLnByb3RvdHlwZS5pc0luQm91bmRhcnk9ZnVuY3Rpb24odCl7fSxRbC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUWwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFFsfSwkbC5Nb2QyQm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGN9LCRsLkVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZWN9LCRsLk11bHRpVmFsZW50RW5kUG9pbnRCb3VuZGFyeU5vZGVSdWxlLmdldD1mdW5jdGlvbigpe3JldHVybiBuY30sJGwuTW9ub1ZhbGVudEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gcmN9LCRsLk1PRDJfQk9VTkRBUllfUlVMRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRjfSwkbC5FTkRQT0lOVF9CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgZWN9LCRsLk1VTFRJVkFMRU5UX0VORFBPSU5UX0JPVU5EQVJZX1JVTEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuY30sJGwuTU9OT1ZBTEVOVF9FTkRQT0lOVF9CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgcmN9LCRsLk9HQ19TRlNfQk9VTkRBUllfUlVMRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gUWwuTU9EMl9CT1VOREFSWV9SVUxFfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhRbCwkbCk7dmFyIHRjPWZ1bmN0aW9uKCl7fTt0Yy5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0JTI9PTF9LHRjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltRbF19LHRjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0Y307dmFyIGVjPWZ1bmN0aW9uKCl7fTtlYy5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PjB9LGVjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltRbF19LGVjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlY307dmFyIG5jPWZ1bmN0aW9uKCl7fTtuYy5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PjF9LG5jLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltRbF19LG5jLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBuY307dmFyIHJjPWZ1bmN0aW9uKCl7fTtyYy5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dH0scmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1FsXX0scmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHJjfTt2YXIgaWM9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIG9jKHQpe3RoaXMubWVzc2FnZT10fHwiIn1pYy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7fSxpYy5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKCl7fSxpYy5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe30saWMucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7fSxpYy5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe30saWMucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXt9LGljLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt9LG9jLnByb3RvdHlwZT1uZXcgRXJyb3Isb2MucHJvdG90eXBlLm5hbWU9IkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iO3ZhciBzYz1mdW5jdGlvbigpe307c2MucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXt9LHNjLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7fSxzYy5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7fTt2YXIgYWM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLnNldD1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe30sZX0oaWMpO2Z1bmN0aW9uIHVjKHQpe3RoaXMubWVzc2FnZT10fHwiIn11Yy5wcm90b3R5cGU9bmV3IEVycm9yLHVjLnByb3RvdHlwZS5uYW1lPSJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIjt2YXIgbGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLmFycmF5Xz1bXSxhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGljJiZ0aGlzLmFkZEFsbChhcmd1bWVudHNbMF0pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5lbnN1cmVDYXBhY2l0eT1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdCxpY119LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5hcnJheV8ucHVzaCh0KTp0aGlzLmFycmF5Xy5zcGxpY2UoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSksITB9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5hcnJheV89W119LGUucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSk7cmV0dXJuITB9LGUucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuYXJyYXlfW3RdO3JldHVybiB0aGlzLmFycmF5X1t0XT1lLG59LGUucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBjYyh0aGlzKX0sZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2lmKHQ8MHx8dD49dGhpcy5zaXplKCkpdGhyb3cgbmV3IG9jO3JldHVybiB0aGlzLmFycmF5X1t0XX0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofSxlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLmxlbmd0aH0sZS5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl0LnB1c2godGhpcy5hcnJheV9bZV0pO3JldHVybiB0fSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSExLG49MCxyPXRoaXMuYXJyYXlfLmxlbmd0aDtuPHI7bisrKWlmKHRoaXMuYXJyYXlfW25dPT09dCl7dGhpcy5hcnJheV8uc3BsaWNlKG4sMSksZT0hMDticmVha31yZXR1cm4gZX0sZX0oYWMpLGNjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpLHRoaXMuYXJyYXlMaXN0Xz1lLHRoaXMucG9zaXRpb25fPTB9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvc2l0aW9uXz09PXRoaXMuYXJyYXlMaXN0Xy5zaXplKCkpdGhyb3cgbmV3IHVjO3JldHVybiB0aGlzLmFycmF5TGlzdF8uZ2V0KHRoaXMucG9zaXRpb25fKyspfSxlLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb25fPHRoaXMuYXJyYXlMaXN0Xy5zaXplKCl9LGUucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hcnJheUxpc3RfLnNldCh0aGlzLnBvc2l0aW9uXy0xLHQpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmFycmF5TGlzdF8ucmVtb3ZlKHRoaXMuYXJyYXlMaXN0Xy5nZXQodGhpcy5wb3NpdGlvbl8pKX0sZX0oc2MpLGhjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtpZih0LmNhbGwodGhpcyksMD09PWFyZ3VtZW50cy5sZW5ndGgpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmVuc3VyZUNhcGFjaXR5KGUubGVuZ3RoKSx0aGlzLmFkZChlLCEwKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5lbnN1cmVDYXBhY2l0eShuLmxlbmd0aCksdGhpcy5hZGQobixyKX19dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e2Nvb3JkQXJyYXlUeXBlOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gbi5jb29yZEFycmF5VHlwZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFycmF5KDApLmZpbGwobnVsbCl9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0KHQpfSxlLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9ITEsbz1uLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KWUuYWRkKG8ubmV4dCgpLHIpLGk9ITA7cmV0dXJuIGl9cmV0dXJuIHQucHJvdG90eXBlLmFkZEFsbC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXQucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyksbj0wO248dGhpcy5zaXplKCk7bisrKWUuYWRkKG4sdGhpcy5nZXQobikuY29weSgpKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUudG9Db29yZGluYXRlQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b0FycmF5KGUuY29vcmRBcnJheVR5cGUpfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF07dC5wcm90b3R5cGUuYWRkLmNhbGwodGhpcyxuKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5hZGQocixpLCEwKSwhMH1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsJiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXTtpZighcyYmdGhpcy5zaXplKCk+PTEpe3ZhciBhPXRoaXMuZ2V0KHRoaXMuc2l6ZSgpLTEpO2lmKGEuZXF1YWxzMkQobykpcmV0dXJuIG51bGx9dC5wcm90b3R5cGUuYWRkLmNhbGwodGhpcyxvKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgT2JqZWN0JiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciB1PWFyZ3VtZW50c1swXSxsPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5hZGQodSxsKSwhMH19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBjPWFyZ3VtZW50c1swXSxoPWFyZ3VtZW50c1sxXSxwPWFyZ3VtZW50c1syXTtpZihwKWZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKWUuYWRkKGNbZl0saCk7ZWxzZSBmb3IodmFyIGc9Yy5sZW5ndGgtMTtnPj0wO2ctLSllLmFkZChjW2ddLGgpO3JldHVybiEwfWlmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKXt2YXIgZD1hcmd1bWVudHNbMF0seT1hcmd1bWVudHNbMV0sdj1hcmd1bWVudHNbMl07aWYoIXYpe3ZhciBfPXRoaXMuc2l6ZSgpO2lmKF8+MCl7aWYoZD4wKXt2YXIgbT10aGlzLmdldChkLTEpO2lmKG0uZXF1YWxzMkQoeSkpcmV0dXJuIG51bGx9aWYoZDxfKXt2YXIgeD10aGlzLmdldChkKTtpZih4LmVxdWFsczJEKHkpKXJldHVybiBudWxsfX19dC5wcm90b3R5cGUuYWRkLmNhbGwodGhpcyxkLHkpfX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgRT1hcmd1bWVudHNbMF0sYj1hcmd1bWVudHNbMV0sdz1hcmd1bWVudHNbMl0sST1hcmd1bWVudHNbM10sTj0xO3c+SSYmKE49LTEpO2Zvcih2YXIgUz13O1MhPT1JO1MrPU4pZS5hZGQoRVtTXSxiKTtyZXR1cm4hMH19LGUucHJvdG90eXBlLmNsb3NlUmluZz1mdW5jdGlvbigpe3RoaXMuc2l6ZSgpPjAmJnRoaXMuYWRkKG5ldyB1bCh0aGlzLmdldCgwKSksITEpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGxjKSxwYz1mdW5jdGlvbigpe30sZmM9e0ZvcndhcmRDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LEJpZGlyZWN0aW9uYWxDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LGNvb3JkQXJyYXlUeXBlOntjb25maWd1cmFibGU6ITB9fTtmYy5Gb3J3YXJkQ29tcGFyYXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZ2N9LGZjLkJpZGlyZWN0aW9uYWxDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiBkY30sZmMuY29vcmRBcnJheVR5cGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBcnJheSgwKS5maWxsKG51bGwpfSxwYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHBjfSxwYy5pc1Jpbmc9ZnVuY3Rpb24odCl7cmV0dXJuISh0Lmxlbmd0aDw0KSYmISF0WzBdLmVxdWFsczJEKHRbdC5sZW5ndGgtMV0pfSxwYy5wdE5vdEluTGlzdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO2lmKHBjLmluZGV4T2YocixlKTwwKXJldHVybiByfXJldHVybiBudWxsfSxwYy5zY3JvbGw9ZnVuY3Rpb24odCxlKXt2YXIgbj1wYy5pbmRleE9mKGUsdCk7aWYobjwwKXJldHVybiBudWxsO3ZhciByPW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbChudWxsKTtQbC5hcnJheWNvcHkodCxuLHIsMCx0Lmxlbmd0aC1uKSxQbC5hcnJheWNvcHkodCwwLHIsdC5sZW5ndGgtbixuKSxQbC5hcnJheWNvcHkociwwLHQsMCx0Lmxlbmd0aCl9LHBjLmVxdWFscz1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYodD09PWUpcmV0dXJuITA7aWYobnVsbD09PXR8fG51bGw9PT1lKXJldHVybiExO2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYoIXRbbl0uZXF1YWxzKGVbbl0pKXJldHVybiExO3JldHVybiEwfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07aWYocj09PWkpcmV0dXJuITA7aWYobnVsbD09PXJ8fG51bGw9PT1pKXJldHVybiExO2lmKHIubGVuZ3RoIT09aS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBzPTA7czxyLmxlbmd0aDtzKyspaWYoMCE9PW8uY29tcGFyZShyW3NdLGlbc10pKXJldHVybiExO3JldHVybiEwfX0scGMuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyBoYyxyPTA7cjx0Lmxlbmd0aDtyKyspZS5pbnRlcnNlY3RzKHRbcl0pJiZuLmFkZCh0W3JdLCEwKTtyZXR1cm4gbi50b0Nvb3JkaW5hdGVBcnJheSgpfSxwYy5oYXNSZXBlYXRlZFBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPHQubGVuZ3RoO2UrKylpZih0W2UtMV0uZXF1YWxzKHRbZV0pKXJldHVybiEwO3JldHVybiExfSxwYy5yZW1vdmVSZXBlYXRlZFBvaW50cz1mdW5jdGlvbih0KXtyZXR1cm4gcGMuaGFzUmVwZWF0ZWRQb2ludHModCk/bmV3IGhjKHQsITEpLnRvQ29vcmRpbmF0ZUFycmF5KCk6dH0scGMucmV2ZXJzZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGgtMSxuPU1hdGgudHJ1bmMoZS8yKSxyPTA7cjw9bjtyKyspe3ZhciBpPXRbcl07dFtyXT10W2Utcl0sdFtlLXJdPWl9fSxwYy5yZW1vdmVOdWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49MDtuPHQubGVuZ3RoO24rKyludWxsIT09dFtuXSYmZSsrO3ZhciByPW5ldyBBcnJheShlKS5maWxsKG51bGwpO2lmKDA9PT1lKXJldHVybiByO2Zvcih2YXIgaT0wLG89MDtvPHQubGVuZ3RoO28rKyludWxsIT09dFtvXSYmKHJbaSsrXT10W29dKTtyZXR1cm4gcn0scGMuY29weURlZXA9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciB0PWFyZ3VtZW50c1swXSxlPW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjx0Lmxlbmd0aDtuKyspZVtuXT1uZXcgdWwodFtuXSk7cmV0dXJuIGV9aWYoNT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXSxzPWFyZ3VtZW50c1szXSxhPWFyZ3VtZW50c1s0XSx1PTA7dTxhO3UrKylvW3MrdV09bmV3IHVsKHJbaSt1XSl9LHBjLmlzRXF1YWxSZXZlcnNlZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dLGk9ZVt0Lmxlbmd0aC1uLTFdO2lmKDAhPT1yLmNvbXBhcmVUbyhpKSlyZXR1cm4hMX1yZXR1cm4hMH0scGMuZW52ZWxvcGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBMbCxuPTA7bjx0Lmxlbmd0aDtuKyspZS5leHBhbmRUb0luY2x1ZGUodFtuXSk7cmV0dXJuIGV9LHBjLnRvQ29vcmRpbmF0ZUFycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRvQXJyYXkocGMuY29vcmRBcnJheVR5cGUpfSxwYy5hdExlYXN0TkNvb3JkaW5hdGVzT3JOb3RoaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUubGVuZ3RoPj10P2U6W119LHBjLmluZGV4T2Y9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZih0LmVxdWFscyhlW25dKSlyZXR1cm4gbjtyZXR1cm4tMX0scGMuaW5jcmVhc2luZ0RpcmVjdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPE1hdGgudHJ1bmModC5sZW5ndGgvMik7ZSsrKXt2YXIgbj10Lmxlbmd0aC0xLWUscj10W2VdLmNvbXBhcmVUbyh0W25dKTtpZigwIT09cilyZXR1cm4gcn1yZXR1cm4gMX0scGMuY29tcGFyZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGgmJm48ZS5sZW5ndGg7KXt2YXIgcj10W25dLmNvbXBhcmVUbyhlW25dKTtpZigwIT09cilyZXR1cm4gcjtuKyt9cmV0dXJuIG48ZS5sZW5ndGg/LTE6bjx0Lmxlbmd0aD8xOjB9LHBjLm1pbkNvb3JkaW5hdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW51bGwsbj0wO248dC5sZW5ndGg7bisrKShudWxsPT09ZXx8ZS5jb21wYXJlVG8odFtuXSk+MCkmJihlPXRbbl0pO3JldHVybiBlfSxwYy5leHRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtlPWRsLmNsYW1wKGUsMCx0Lmxlbmd0aCk7dmFyIHI9KG49ZGwuY2xhbXAobiwtMSx0Lmxlbmd0aCkpLWUrMTtuPDAmJihyPTApLGU+PXQubGVuZ3RoJiYocj0wKSxuPGUmJihyPTApO3ZhciBpPW5ldyBBcnJheShyKS5maWxsKG51bGwpO2lmKDA9PT1yKXJldHVybiBpO2Zvcih2YXIgbz0wLHM9ZTtzPD1uO3MrKylpW28rK109dFtzXTtyZXR1cm4gaX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocGMsZmMpO3ZhciBnYz1mdW5jdGlvbigpe307Z2MucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcGMuY29tcGFyZSh0LGUpfSxnYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bc2xdfSxnYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZ2N9O3ZhciBkYz1mdW5jdGlvbigpe307ZGMucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZTtpZihuLmxlbmd0aDxyLmxlbmd0aClyZXR1cm4tMTtpZihuLmxlbmd0aD5yLmxlbmd0aClyZXR1cm4gMTtpZigwPT09bi5sZW5ndGgpcmV0dXJuIDA7dmFyIGk9cGMuY29tcGFyZShuLHIpO3JldHVybiBwYy5pc0VxdWFsUmV2ZXJzZWQobixyKT8wOml9LGRjLnByb3RvdHlwZS5PTERjb21wYXJlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dCxyPWU7aWYobi5sZW5ndGg8ci5sZW5ndGgpcmV0dXJuLTE7aWYobi5sZW5ndGg+ci5sZW5ndGgpcmV0dXJuIDE7aWYoMD09PW4ubGVuZ3RoKXJldHVybiAwO2Zvcih2YXIgaT1wYy5pbmNyZWFzaW5nRGlyZWN0aW9uKG4pLG89cGMuaW5jcmVhc2luZ0RpcmVjdGlvbihyKSxzPWk+MD8wOm4ubGVuZ3RoLTEsYT1vPjA/MDpuLmxlbmd0aC0xLHU9MDt1PG4ubGVuZ3RoO3UrKyl7dmFyIGw9bltzXS5jb21wYXJlVG8oclthXSk7aWYoMCE9PWwpcmV0dXJuIGw7cys9aSxhKz1vfXJldHVybiAwfSxkYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bc2xdfSxkYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZGN9O3ZhciB5Yz1mdW5jdGlvbigpe307eWMucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe30seWMucHJvdG90eXBlLnB1dD1mdW5jdGlvbigpe30seWMucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXt9LHljLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt9LHljLnByb3RvdHlwZS5lbnRyeVNldD1mdW5jdGlvbigpe307dmFyIHZjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oeWMpO2Z1bmN0aW9uIF9jKHQpe3RoaXMubWVzc2FnZT10fHwiIn1mdW5jdGlvbiBtYygpe31fYy5wcm90b3R5cGU9bmV3IEVycm9yLF9jLnByb3RvdHlwZS5uYW1lPSJPcGVyYXRpb25Ob3RTdXBwb3J0ZWQiLG1jLnByb3RvdHlwZT1uZXcgaWMsbWMucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKCl7fTt2YXIgeGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLmFycmF5Xz1bXSxhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGljJiZ0aGlzLmFkZEFsbChhcmd1bWVudHNbMF0pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXtpZih0aGlzLmFycmF5X1tlXT09PXQpcmV0dXJuITB9cmV0dXJuITF9LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4hdGhpcy5jb250YWlucyh0KSYmKHRoaXMuYXJyYXlfLnB1c2godCksITApfSxlLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspdGhpcy5hZGQoZS5uZXh0KCkpO3JldHVybiEwfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yfSxlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLmxlbmd0aH0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofSxlLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXQucHVzaCh0aGlzLmFycmF5X1tlXSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFYyh0aGlzKX0sZX0obWMpLEVjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpLHRoaXMuaGFzaFNldF89ZSx0aGlzLnBvc2l0aW9uXz0wfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5wb3NpdGlvbl89PT10aGlzLmhhc2hTZXRfLnNpemUoKSl0aHJvdyBuZXcgdWM7cmV0dXJuIHRoaXMuaGFzaFNldF8uYXJyYXlfW3RoaXMucG9zaXRpb25fKytdfSxlLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb25fPHRoaXMuaGFzaFNldF8uc2l6ZSgpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgX2N9LGV9KHNjKTtmdW5jdGlvbiBiYyh0KXtyZXR1cm4gbnVsbD09PXQ/MDp0LmNvbG9yfWZ1bmN0aW9uIHdjKHQpe3JldHVybiBudWxsPT09dD9udWxsOnQucGFyZW50fWZ1bmN0aW9uIEljKHQsZSl7bnVsbCE9PXQmJih0LmNvbG9yPWUpfWZ1bmN0aW9uIE5jKHQpe3JldHVybiBudWxsPT09dD9udWxsOnQubGVmdH1mdW5jdGlvbiBTYyh0KXtyZXR1cm4gbnVsbD09PXQ/bnVsbDp0LnJpZ2h0fWZ1bmN0aW9uIENjKCl7dGhpcy5yb290Xz1udWxsLHRoaXMuc2l6ZV89MH1DYy5wcm90b3R5cGU9bmV3IHZjLENjLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMucm9vdF87bnVsbCE9PWU7KXt2YXIgbj10LmNvbXBhcmVUbyhlLmtleSk7aWYobjwwKWU9ZS5sZWZ0O2Vsc2V7aWYoIShuPjApKXJldHVybiBlLnZhbHVlO2U9ZS5yaWdodH19cmV0dXJuIG51bGx9LENjLnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT09dGhpcy5yb290XylyZXR1cm4gdGhpcy5yb290Xz17a2V5OnQsdmFsdWU6ZSxsZWZ0Om51bGwscmlnaHQ6bnVsbCxwYXJlbnQ6bnVsbCxjb2xvcjowLGdldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LGdldEtleTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtleX19LHRoaXMuc2l6ZV89MSxudWxsO3ZhciBuLHIsaT10aGlzLnJvb3RfO2Rve2lmKG49aSwocj10LmNvbXBhcmVUbyhpLmtleSkpPDApaT1pLmxlZnQ7ZWxzZXtpZighKHI+MCkpe3ZhciBvPWkudmFsdWU7cmV0dXJuIGkudmFsdWU9ZSxvfWk9aS5yaWdodH19d2hpbGUobnVsbCE9PWkpO3ZhciBzPXtrZXk6dCxsZWZ0Om51bGwscmlnaHQ6bnVsbCx2YWx1ZTplLHBhcmVudDpuLGNvbG9yOjAsZ2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX0sZ2V0S2V5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2V5fX07cmV0dXJuIHI8MD9uLmxlZnQ9czpuLnJpZ2h0PXMsdGhpcy5maXhBZnRlckluc2VydGlvbihzKSx0aGlzLnNpemVfKyssbnVsbH0sQ2MucHJvdG90eXBlLmZpeEFmdGVySW5zZXJ0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7Zm9yKHQuY29sb3I9MTtudWxsIT10JiZ0IT09dGhpcy5yb290XyYmMT09PXQucGFyZW50LmNvbG9yOylpZih3Yyh0KT09PU5jKHdjKHdjKHQpKSkpe3ZhciBuPVNjKHdjKHdjKHQpKSk7MT09PWJjKG4pPyhJYyh3Yyh0KSwwKSxJYyhuLDApLEljKHdjKHdjKHQpKSwxKSx0PXdjKHdjKHQpKSk6KHQ9PT1TYyh3Yyh0KSkmJih0PXdjKHQpLGUucm90YXRlTGVmdCh0KSksSWMod2ModCksMCksSWMod2Mod2ModCkpLDEpLGUucm90YXRlUmlnaHQod2Mod2ModCkpKSl9ZWxzZXt2YXIgcj1OYyh3Yyh3Yyh0KSkpOzE9PT1iYyhyKT8oSWMod2ModCksMCksSWMociwwKSxJYyh3Yyh3Yyh0KSksMSksdD13Yyh3Yyh0KSkpOih0PT09TmMod2ModCkpJiYodD13Yyh0KSxlLnJvdGF0ZVJpZ2h0KHQpKSxJYyh3Yyh0KSwwKSxJYyh3Yyh3Yyh0KSksMSksZS5yb3RhdGVMZWZ0KHdjKHdjKHQpKSkpfXRoaXMucm9vdF8uY29sb3I9MH0sQ2MucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3ZhciB0PW5ldyBsYyxlPXRoaXMuZ2V0Rmlyc3RFbnRyeSgpO2lmKG51bGwhPT1lKWZvcih0LmFkZChlLnZhbHVlKTtudWxsIT09KGU9Q2Muc3VjY2Vzc29yKGUpKTspdC5hZGQoZS52YWx1ZSk7cmV0dXJuIHR9LENjLnByb3RvdHlwZS5lbnRyeVNldD1mdW5jdGlvbigpe3ZhciB0PW5ldyB4YyxlPXRoaXMuZ2V0Rmlyc3RFbnRyeSgpO2lmKG51bGwhPT1lKWZvcih0LmFkZChlKTtudWxsIT09KGU9Q2Muc3VjY2Vzc29yKGUpKTspdC5hZGQoZSk7cmV0dXJuIHR9LENjLnByb3RvdHlwZS5yb3RhdGVMZWZ0PWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3ZhciBlPXQucmlnaHQ7dC5yaWdodD1lLmxlZnQsbnVsbCE9ZS5sZWZ0JiYoZS5sZWZ0LnBhcmVudD10KSxlLnBhcmVudD10LnBhcmVudCxudWxsPT09dC5wYXJlbnQ/dGhpcy5yb290Xz1lOnQucGFyZW50LmxlZnQ9PT10P3QucGFyZW50LmxlZnQ9ZTp0LnBhcmVudC5yaWdodD1lLGUubGVmdD10LHQucGFyZW50PWV9fSxDYy5wcm90b3R5cGUucm90YXRlUmlnaHQ9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dmFyIGU9dC5sZWZ0O3QubGVmdD1lLnJpZ2h0LG51bGwhPWUucmlnaHQmJihlLnJpZ2h0LnBhcmVudD10KSxlLnBhcmVudD10LnBhcmVudCxudWxsPT09dC5wYXJlbnQ/dGhpcy5yb290Xz1lOnQucGFyZW50LnJpZ2h0PT09dD90LnBhcmVudC5yaWdodD1lOnQucGFyZW50LmxlZnQ9ZSxlLnJpZ2h0PXQsdC5wYXJlbnQ9ZX19LENjLnByb3RvdHlwZS5nZXRGaXJzdEVudHJ5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yb290XztpZihudWxsIT10KWZvcig7bnVsbCE9dC5sZWZ0Oyl0PXQubGVmdDtyZXR1cm4gdH0sQ2Muc3VjY2Vzc29yPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXJldHVybiBudWxsO2lmKG51bGwhPT10LnJpZ2h0KXtmb3IodmFyIGU9dC5yaWdodDtudWxsIT09ZS5sZWZ0OyllPWUubGVmdDtyZXR1cm4gZX1mb3IodmFyIG49dC5wYXJlbnQscj10O251bGwhPT1uJiZyPT09bi5yaWdodDspcj1uLG49bi5wYXJlbnQ7cmV0dXJuIG59LENjLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2l6ZV99O3ZhciBQYz1mdW5jdGlvbigpe307ZnVuY3Rpb24gTWMoKXt9ZnVuY3Rpb24gTGMoKXt0aGlzLmFycmF5Xz1bXSxhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGljJiZ0aGlzLmFkZEFsbChhcmd1bWVudHNbMF0pfVBjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxQYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUGN9LE1jLnByb3RvdHlwZT1uZXcgbWMsTGMucHJvdG90eXBlPW5ldyBNYyxMYy5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl7aWYoMD09PXRoaXMuYXJyYXlfW2VdLmNvbXBhcmVUbyh0KSlyZXR1cm4hMH1yZXR1cm4hMX0sTGMucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZih0aGlzLmNvbnRhaW5zKHQpKXJldHVybiExO2Zvcih2YXIgZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspe2lmKDE9PT10aGlzLmFycmF5X1tlXS5jb21wYXJlVG8odCkpcmV0dXJuIHRoaXMuYXJyYXlfLnNwbGljZShlLDAsdCksITB9cmV0dXJuIHRoaXMuYXJyYXlfLnB1c2godCksITB9LExjLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspdGhpcy5hZGQoZS5uZXh0KCkpO3JldHVybiEwfSxMYy5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBfY30sTGMucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcnJheV8ubGVuZ3RofSxMYy5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofSxMYy5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl0LnB1c2godGhpcy5hcnJheV9bZV0pO3JldHVybiB0fSxMYy5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE9jKHRoaXMpfTt2YXIgT2M9ZnVuY3Rpb24odCl7dGhpcy50cmVlU2V0Xz10LHRoaXMucG9zaXRpb25fPTB9O09jLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5wb3NpdGlvbl89PT10aGlzLnRyZWVTZXRfLnNpemUoKSl0aHJvdyBuZXcgdWM7cmV0dXJuIHRoaXMudHJlZVNldF8uYXJyYXlfW3RoaXMucG9zaXRpb25fKytdfSxPYy5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uXzx0aGlzLnRyZWVTZXRfLnNpemUoKX0sT2MucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBfY307dmFyIFJjPWZ1bmN0aW9uKCl7fTtSYy5zb3J0PWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaT1hcmd1bWVudHNbMF07aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcj1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNvbXBhcmVUbyhlKX0saS5zb3J0KHIpO2Vsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpbj1hcmd1bWVudHNbMV0scj1mdW5jdGlvbih0LGUpe3JldHVybiBuLmNvbXBhcmUodCxlKX0saS5zb3J0KHIpO2Vsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpeyhlPWkuc2xpY2UoYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSkpLnNvcnQoKTt2YXIgbz1pLnNsaWNlKDAsYXJndW1lbnRzWzFdKS5jb25jYXQoZSxpLnNsaWNlKGFyZ3VtZW50c1syXSxpLmxlbmd0aCkpO2ZvcihpLnNwbGljZSgwLGkubGVuZ3RoKSx0PTA7dDxvLmxlbmd0aDt0KyspaS5wdXNoKG9bdF0pfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKGU9aS5zbGljZShhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKSxuPWFyZ3VtZW50c1szXSxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY29tcGFyZSh0LGUpfSxlLnNvcnQociksbz1pLnNsaWNlKDAsYXJndW1lbnRzWzFdKS5jb25jYXQoZSxpLnNsaWNlKGFyZ3VtZW50c1syXSxpLmxlbmd0aCkpLGkuc3BsaWNlKDAsaS5sZW5ndGgpLHQ9MDt0PG8ubGVuZ3RoO3QrKylpLnB1c2gob1t0XSl9LFJjLmFzTGlzdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGxjLG49MCxyPXQubGVuZ3RoO248cjtuKyspZS5hZGQodFtuXSk7cmV0dXJuIGV9O3ZhciBUYz1mdW5jdGlvbigpe30sQWM9e1A6e2NvbmZpZ3VyYWJsZTohMH0sTDp7Y29uZmlndXJhYmxlOiEwfSxBOntjb25maWd1cmFibGU6ITB9LEZBTFNFOntjb25maWd1cmFibGU6ITB9LFRSVUU6e2NvbmZpZ3VyYWJsZTohMH0sRE9OVENBUkU6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX0ZBTFNFOntjb25maWd1cmFibGU6ITB9LFNZTV9UUlVFOntjb25maWd1cmFibGU6ITB9LFNZTV9ET05UQ0FSRTp7Y29uZmlndXJhYmxlOiEwfSxTWU1fUDp7Y29uZmlndXJhYmxlOiEwfSxTWU1fTDp7Y29uZmlndXJhYmxlOiEwfSxTWU1fQTp7Y29uZmlndXJhYmxlOiEwfX07QWMuUC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sQWMuTC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sQWMuQS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sQWMuRkFMU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTF9LEFjLlRSVUUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTJ9LEFjLkRPTlRDQVJFLmdldD1mdW5jdGlvbigpe3JldHVybi0zfSxBYy5TWU1fRkFMU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIkYifSxBYy5TWU1fVFJVRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iVCJ9LEFjLlNZTV9ET05UQ0FSRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iKiJ9LEFjLlNZTV9QLmdldD1mdW5jdGlvbigpe3JldHVybiIwIn0sQWMuU1lNX0wuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIjEifSxBYy5TWU1fQS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iMiJ9LFRjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxUYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVGN9LFRjLnRvRGltZW5zaW9uU3ltYm9sPWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlIFRjLkZBTFNFOnJldHVybiBUYy5TWU1fRkFMU0U7Y2FzZSBUYy5UUlVFOnJldHVybiBUYy5TWU1fVFJVRTtjYXNlIFRjLkRPTlRDQVJFOnJldHVybiBUYy5TWU1fRE9OVENBUkU7Y2FzZSBUYy5QOnJldHVybiBUYy5TWU1fUDtjYXNlIFRjLkw6cmV0dXJuIFRjLlNZTV9MO2Nhc2UgVGMuQTpyZXR1cm4gVGMuU1lNX0F9dGhyb3cgbmV3IGVsKCJVbmtub3duIGRpbWVuc2lvbiB2YWx1ZTogIit0KX0sVGMudG9EaW1lbnNpb25WYWx1ZT1mdW5jdGlvbih0KXtzd2l0Y2gobWwudG9VcHBlckNhc2UodCkpe2Nhc2UgVGMuU1lNX0ZBTFNFOnJldHVybiBUYy5GQUxTRTtjYXNlIFRjLlNZTV9UUlVFOnJldHVybiBUYy5UUlVFO2Nhc2UgVGMuU1lNX0RPTlRDQVJFOnJldHVybiBUYy5ET05UQ0FSRTtjYXNlIFRjLlNZTV9QOnJldHVybiBUYy5QO2Nhc2UgVGMuU1lNX0w6cmV0dXJuIFRjLkw7Y2FzZSBUYy5TWU1fQTpyZXR1cm4gVGMuQX10aHJvdyBuZXcgZWwoIlVua25vd24gZGltZW5zaW9uIHN5bWJvbDogIit0KX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVGMsQWMpO3ZhciBEYz1mdW5jdGlvbigpe307RGMucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt9LERjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxEYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRGN9O3ZhciBGYz1mdW5jdGlvbigpe307RmMucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0LGUpe30sRmMucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe30sRmMucHJvdG90eXBlLmlzR2VvbWV0cnlDaGFuZ2VkPWZ1bmN0aW9uKCl7fSxGYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEZjfTt2YXIga2M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe2lmKHQuY2FsbCh0aGlzLG4pLHRoaXMuX2dlb21ldHJpZXM9ZXx8W10sdC5oYXNOdWxsRWxlbWVudHModGhpcy5fZ2VvbWV0cmllcykpdGhyb3cgbmV3IGVsKCJnZW9tZXRyaWVzIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBlbGVtZW50cyIpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuY29tcHV0ZUVudmVsb3BlSW50ZXJuYWw9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IExsLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKyl0LmV4cGFuZFRvSW5jbHVkZSh0aGlzLl9nZW9tZXRyaWVzW2VdLmdldEVudmVsb3BlSW50ZXJuYWwoKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5Tj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZ2VvbWV0cmllc1t0XX0sZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHQuU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTn0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuZ2V0TnVtUG9pbnRzKCkpLmZpbGwobnVsbCksZT0tMSxuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspZm9yKHZhciByPXRoaXMuX2dlb21ldHJpZXNbbl0uZ2V0Q29vcmRpbmF0ZXMoKSxpPTA7aTxyLmxlbmd0aDtpKyspdFsrK2VdPXJbaV07cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdCs9dGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRBcmVhKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO2lmKCF0aGlzLmlzRXF1aXZhbGVudENsYXNzKG4pKXJldHVybiExO3ZhciBpPW47aWYodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGghPT1pLl9nZW9tZXRyaWVzLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIG89MDtvPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO28rKylpZighZS5fZ2VvbWV0cmllc1tvXS5lcXVhbHNFeGFjdChpLl9nZW9tZXRyaWVzW29dLHIpKXJldHVybiExO3JldHVybiEwfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7dCsrKXRoaXMuX2dlb21ldHJpZXNbdF0ubm9ybWFsaXplKCk7UmMuc29ydCh0aGlzLl9nZW9tZXRyaWVzKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9udWxsOnRoaXMuX2dlb21ldHJpZXNbMF0uZ2V0Q29vcmRpbmF0ZSgpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe2Zvcih2YXIgdD1UYy5GQUxTRSxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdD1NYXRoLm1heCh0LHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0Qm91bmRhcnlEaW1lbnNpb24oKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe2Zvcih2YXIgdD1UYy5GQUxTRSxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdD1NYXRoLm1heCh0LHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0RGltZW5zaW9uKCkpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdCs9dGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRMZW5ndGgoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKXQrPXRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0TnVtUG9pbnRzKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldE51bUdlb21ldHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2VvbWV0cmllcy5sZW5ndGh9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgsZT1uZXcgQXJyYXkodCkuZmlsbChudWxsKSxuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspZVtuXT10aGlzLl9nZW9tZXRyaWVzW25dLnJldmVyc2UoKTtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKGUpfSxlLnByb3RvdHlwZS5jb21wYXJlVG9TYW1lQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1uZXcgTGMoUmMuYXNMaXN0KHRoaXMuX2dlb21ldHJpZXMpKSxyPW5ldyBMYyhSYy5hc0xpc3QoZS5fZ2VvbWV0cmllcykpO3JldHVybiB0aGlzLmNvbXBhcmUobixyKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWksYT10aGlzLmdldE51bUdlb21ldHJpZXMoKSx1PXMuZ2V0TnVtR2VvbWV0cmllcygpLGw9MDtsPGEmJmw8dTspe3ZhciBjPXQuZ2V0R2VvbWV0cnlOKGwpLGg9cy5nZXRHZW9tZXRyeU4obCkscD1jLmNvbXBhcmVUb1NhbWVDbGFzcyhoLG8pO2lmKDAhPT1wKXJldHVybiBwO2wrK31yZXR1cm4gbDxhPzE6bDx1Py0xOjB9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoZ2woYXJndW1lbnRzWzBdLEtsKSlmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyl0Ll9nZW9tZXRyaWVzW25dLmFwcGx5KGUpO2Vsc2UgaWYoZ2woYXJndW1lbnRzWzBdLEZjKSl7dmFyIHI9YXJndW1lbnRzWzBdO2lmKDA9PT10aGlzLl9nZW9tZXRyaWVzLmxlbmd0aClyZXR1cm4gbnVsbDtmb3IodmFyIGk9MDtpPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoJiYodC5fZ2VvbWV0cmllc1tpXS5hcHBseShyKSwhci5pc0RvbmUoKSk7aSsrKTtyLmlzR2VvbWV0cnlDaGFuZ2VkKCkmJnRoaXMuZ2VvbWV0cnlDaGFuZ2VkKCl9ZWxzZSBpZihnbChhcmd1bWVudHNbMF0sRGMpKXt2YXIgbz1hcmd1bWVudHNbMF07by5maWx0ZXIodGhpcyk7Zm9yKHZhciBzPTA7czx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtzKyspdC5fZ2VvbWV0cmllc1tzXS5hcHBseShvKX1lbHNlIGlmKGdsKGFyZ3VtZW50c1swXSxIbCkpe3ZhciBhPWFyZ3VtZW50c1swXTthLmZpbHRlcih0aGlzKTtmb3IodmFyIHU9MDt1PHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO3UrKyl0Ll9nZW9tZXRyaWVzW3VdLmFwcGx5KGEpfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbih0aGlzKSxxbC5zaG91bGROZXZlclJlYWNoSGVyZSgpLG51bGx9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtlLl9nZW9tZXRyaWVzPW5ldyBBcnJheSh0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCkuZmlsbChudWxsKTtmb3IodmFyIG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyllLl9nZW9tZXRyaWVzW25dPXRoaXMuX2dlb21ldHJpZXNbbl0uY2xvbmUoKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIkdlb21ldHJ5Q29sbGVjdGlvbiJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoKS5maWxsKG51bGwpLG49MDtuPHQubGVuZ3RoO24rKyl0W25dPXRoaXMuX2dlb21ldHJpZXNbbl0uY29weSgpO3JldHVybiBuZXcgZSh0LHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDt0KyspaWYoIXRoaXMuX2dlb21ldHJpZXNbdF0uaXNFbXB0eSgpKXJldHVybiExO3JldHVybiEwfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4NGYwN2JjYjFmODU3ZDgwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShXbCksR2M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIFdsLlNPUlRJTkRFWF9NVUxUSUxJTkVTVFJJTkd9LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4hIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MoZSkmJnQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmNhbGwodGhpcyxlLG4pfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNDbG9zZWQoKT9UYy5GQUxTRTowfSxlLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO2Zvcih2YXIgdD0wO3Q8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7dCsrKWlmKCF0aGlzLl9nZW9tZXRyaWVzW3RdLmlzQ2xvc2VkKCkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dlb21ldHJpZXMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLmZpbGwobnVsbCksbj0wO248dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7bisrKWVbdC0xLW5dPXRoaXMuX2dlb21ldHJpZXNbbl0ucmV2ZXJzZSgpO3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoZSl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxYyh0aGlzKS5nZXRCb3VuZGFyeSgpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTXVsdGlMaW5lU3RyaW5nIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1BjXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDcxNTVkMmFiNGFmYTgwMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oa2MpLHFjPWZ1bmN0aW9uKCl7aWYodGhpcy5fZ2VvbT1udWxsLHRoaXMuX2dlb21GYWN0PW51bGwsdGhpcy5fYm5SdWxlPW51bGwsdGhpcy5fZW5kcG9pbnRNYXA9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9UWwuTU9EMl9CT1VOREFSWV9SVUxFO3RoaXMuX2dlb209dCx0aGlzLl9nZW9tRmFjdD10LmdldEZhY3RvcnkoKSx0aGlzLl9iblJ1bGU9ZX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbT1uLHRoaXMuX2dlb21GYWN0PW4uZ2V0RmFjdG9yeSgpLHRoaXMuX2JuUnVsZT1yfX07cWMucHJvdG90eXBlLmJvdW5kYXJ5TXVsdGlMaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2dlb20uaXNFbXB0eSgpKXJldHVybiB0aGlzLmdldEVtcHR5TXVsdGlQb2ludCgpO3ZhciBlPXRoaXMuY29tcHV0ZUJvdW5kYXJ5Q29vcmRpbmF0ZXModCk7cmV0dXJuIDE9PT1lLmxlbmd0aD90aGlzLl9nZW9tRmFjdC5jcmVhdGVQb2ludChlWzBdKTp0aGlzLl9nZW9tRmFjdC5jcmVhdGVNdWx0aVBvaW50RnJvbUNvb3JkcyhlKX0scWMucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dlb20gaW5zdGFuY2VvZiBaYz90aGlzLmJvdW5kYXJ5TGluZVN0cmluZyh0aGlzLl9nZW9tKTp0aGlzLl9nZW9tIGluc3RhbmNlb2YgR2M/dGhpcy5ib3VuZGFyeU11bHRpTGluZVN0cmluZyh0aGlzLl9nZW9tKTp0aGlzLl9nZW9tLmdldEJvdW5kYXJ5KCl9LHFjLnByb3RvdHlwZS5ib3VuZGFyeUxpbmVTdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dlb20uaXNFbXB0eSgpP3RoaXMuZ2V0RW1wdHlNdWx0aVBvaW50KCk6dC5pc0Nsb3NlZCgpP3RoaXMuX2JuUnVsZS5pc0luQm91bmRhcnkoMik/dC5nZXRTdGFydFBvaW50KCk6dGhpcy5fZ2VvbUZhY3QuY3JlYXRlTXVsdGlQb2ludCgpOnRoaXMuX2dlb21GYWN0LmNyZWF0ZU11bHRpUG9pbnQoW3QuZ2V0U3RhcnRQb2ludCgpLHQuZ2V0RW5kUG9pbnQoKV0pfSxxYy5wcm90b3R5cGUuZ2V0RW1wdHlNdWx0aVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dlb21GYWN0LmNyZWF0ZU11bHRpUG9pbnQoKX0scWMucHJvdG90eXBlLmNvbXB1dGVCb3VuZGFyeUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1uZXcgbGM7dGhpcy5fZW5kcG9pbnRNYXA9bmV3IENjO2Zvcih2YXIgcj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10LmdldEdlb21ldHJ5TihyKTswIT09aS5nZXROdW1Qb2ludHMoKSYmKGUuYWRkRW5kcG9pbnQoaS5nZXRDb29yZGluYXRlTigwKSksZS5hZGRFbmRwb2ludChpLmdldENvb3JkaW5hdGVOKGkuZ2V0TnVtUG9pbnRzKCktMSkpKX1mb3IodmFyIG89dGhpcy5fZW5kcG9pbnRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCksYT1zLmdldFZhbHVlKCkuY291bnQ7ZS5fYm5SdWxlLmlzSW5Cb3VuZGFyeShhKSYmbi5hZGQocy5nZXRLZXkoKSl9cmV0dXJuIHBjLnRvQ29vcmRpbmF0ZUFycmF5KG4pfSxxYy5wcm90b3R5cGUuYWRkRW5kcG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZW5kcG9pbnRNYXAuZ2V0KHQpO251bGw9PT1lJiYoZT1uZXcgQmMsdGhpcy5fZW5kcG9pbnRNYXAucHV0KHQsZSkpLGUuY291bnQrK30scWMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHFjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxY30scWMuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9bmV3IHFjKHQpO3JldHVybiBlLmdldEJvdW5kYXJ5KCl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPW5ldyBxYyhuLHIpO3JldHVybiBpLmdldEJvdW5kYXJ5KCl9fTt2YXIgQmM9ZnVuY3Rpb24oKXt0aGlzLmNvdW50PW51bGx9O2Z1bmN0aW9uIHpjKCl7fWZ1bmN0aW9uIGpjKCl7fUJjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxCYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQmN9O3ZhciBVYz1mdW5jdGlvbigpe307ZnVuY3Rpb24gVmMoKXt9ZnVuY3Rpb24gWGMoKXt9ZnVuY3Rpb24gWWMoKXt9dmFyIEhjPWZ1bmN0aW9uKCl7fSxXYz17TkVXTElORTp7Y29uZmlndXJhYmxlOiEwfSxTSU1QTEVfT1JESU5BVEVfRk9STUFUOntjb25maWd1cmFibGU6ITB9fTtIYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEhjfSxIYy5jaGFycz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgQXJyYXkoZSkuZmlsbChudWxsKSxyPTA7cjxlO3IrKyluW3JdPXQ7cmV0dXJuIFN0cmluZyhuKX0sSGMuZ2V0U3RhY2tUcmFjZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgVmMsbj1uZXcgemMoZSk7cmV0dXJuIHQucHJpbnRTdGFja1RyYWNlKG4pLGUudG9TdHJpbmcoKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPSIiLHM9bmV3IGpjKEhjLmdldFN0YWNrVHJhY2UocikpLGE9bmV3IFljKHMpLHU9MDt1PGk7dSsrKXRyeXtvKz1hLnJlYWRMaW5lKCkrSGMuTkVXTElORX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBYYykpdGhyb3cgdDtxbC5zaG91bGROZXZlclJlYWNoSGVyZSgpfXJldHVybiBvfX0sSGMuc3BsaXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5sZW5ndGgscj1uZXcgbGMsaT0iIit0LG89aS5pbmRleE9mKGUpO28+PTA7KXt2YXIgcz1pLnN1YnN0cmluZygwLG8pO3IuYWRkKHMpLG89KGk9aS5zdWJzdHJpbmcobytuKSkuaW5kZXhPZihlKX1pLmxlbmd0aD4wJiZyLmFkZChpKTtmb3IodmFyIGE9bmV3IEFycmF5KHIuc2l6ZSgpKS5maWxsKG51bGwpLHU9MDt1PGEubGVuZ3RoO3UrKylhW3VdPXIuZ2V0KHUpO3JldHVybiBhfSxIYy50b1N0cmluZz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIEhjLlNJTVBMRV9PUkRJTkFURV9GT1JNQVQuZm9ybWF0KHQpfX0sSGMuc3BhY2VzPWZ1bmN0aW9uKHQpe3JldHVybiBIYy5jaGFycygiICIsdCl9LFdjLk5FV0xJTkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFBsLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpfSxXYy5TSU1QTEVfT1JESU5BVEVfRk9STUFULmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgVWMoIjAuIyIpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhIYyxXYyk7dmFyIEpjPWZ1bmN0aW9uKCl7fTtKYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEpjfSxKYy5jb3B5Q29vcmQ9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPU1hdGgubWluKHQuZ2V0RGltZW5zaW9uKCksbi5nZXREaW1lbnNpb24oKSksbz0wO288aTtvKyspbi5zZXRPcmRpbmF0ZShyLG8sdC5nZXRPcmRpbmF0ZShlLG8pKX0sSmMuaXNSaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2l6ZSgpO3JldHVybiAwPT09ZXx8IShlPD0zKSYmKHQuZ2V0T3JkaW5hdGUoMCxJbC5YKT09PXQuZ2V0T3JkaW5hdGUoZS0xLElsLlgpJiZ0LmdldE9yZGluYXRlKDAsSWwuWSk9PT10LmdldE9yZGluYXRlKGUtMSxJbC5ZKSl9LEpjLmlzRXF1YWw9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnNpemUoKTtpZihuIT09ZS5zaXplKCkpcmV0dXJuITE7Zm9yKHZhciByPU1hdGgubWluKHQuZ2V0RGltZW5zaW9uKCksZS5nZXREaW1lbnNpb24oKSksaT0wO2k8bjtpKyspZm9yKHZhciBvPTA7bzxyO28rKyl7dmFyIHM9dC5nZXRPcmRpbmF0ZShpLG8pLGE9ZS5nZXRPcmRpbmF0ZShpLG8pO2lmKHQuZ2V0T3JkaW5hdGUoaSxvKSE9PWUuZ2V0T3JkaW5hdGUoaSxvKSYmKCFubC5pc05hTihzKXx8IW5sLmlzTmFOKGEpKSlyZXR1cm4hMX1yZXR1cm4hMH0sSmMuZXh0ZW5kPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmNyZWF0ZShuLGUuZ2V0RGltZW5zaW9uKCkpLGk9ZS5zaXplKCk7aWYoSmMuY29weShlLDAsciwwLGkpLGk+MClmb3IodmFyIG89aTtvPG47bysrKUpjLmNvcHkoZSxpLTEscixvLDEpO3JldHVybiByfSxKYy5yZXZlcnNlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnNpemUoKS0xLG49TWF0aC50cnVuYyhlLzIpLHI9MDtyPD1uO3IrKylKYy5zd2FwKHQscixlLXIpfSxKYy5zd2FwPWZ1bmN0aW9uKHQsZSxuKXtpZihlPT09bilyZXR1cm4gbnVsbDtmb3IodmFyIHI9MDtyPHQuZ2V0RGltZW5zaW9uKCk7cisrKXt2YXIgaT10LmdldE9yZGluYXRlKGUscik7dC5zZXRPcmRpbmF0ZShlLHIsdC5nZXRPcmRpbmF0ZShuLHIpKSx0LnNldE9yZGluYXRlKG4scixpKX19LEpjLmNvcHk9ZnVuY3Rpb24odCxlLG4scixpKXtmb3IodmFyIG89MDtvPGk7bysrKUpjLmNvcHlDb29yZCh0LGUrbyxuLHIrbyl9LEpjLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXQuc2l6ZSgpO2lmKDA9PT1lKXJldHVybiIoKSI7dmFyIG49dC5nZXREaW1lbnNpb24oKSxyPW5ldyB2bDtyLmFwcGVuZCgiKCIpO2Zvcih2YXIgaT0wO2k8ZTtpKyspe2k+MCYmci5hcHBlbmQoIiAiKTtmb3IodmFyIG89MDtvPG47bysrKW8+MCYmci5hcHBlbmQoIiwiKSxyLmFwcGVuZChIYy50b1N0cmluZyh0LmdldE9yZGluYXRlKGksbykpKX1yZXR1cm4gci5hcHBlbmQoIikiKSxyLnRvU3RyaW5nKCl9fSxKYy5lbnN1cmVWYWxpZFJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnNpemUoKTtyZXR1cm4gMD09PW4/ZTpuPD0zP0pjLmNyZWF0ZUNsb3NlZFJpbmcodCxlLDQpOmUuZ2V0T3JkaW5hdGUoMCxJbC5YKT09PWUuZ2V0T3JkaW5hdGUobi0xLElsLlgpJiZlLmdldE9yZGluYXRlKDAsSWwuWSk9PT1lLmdldE9yZGluYXRlKG4tMSxJbC5ZKT9lOkpjLmNyZWF0ZUNsb3NlZFJpbmcodCxlLG4rMSl9LEpjLmNyZWF0ZUNsb3NlZFJpbmc9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuY3JlYXRlKG4sZS5nZXREaW1lbnNpb24oKSksaT1lLnNpemUoKTtKYy5jb3B5KGUsMCxyLDAsaSk7Zm9yKHZhciBvPWk7bzxuO28rKylKYy5jb3B5KGUsMCxyLG8sMSk7cmV0dXJuIHJ9O3ZhciBaYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dC5jYWxsKHRoaXMsbiksdGhpcy5fcG9pbnRzPW51bGwsdGhpcy5pbml0KGUpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuY29tcHV0ZUVudmVsb3BlSW50ZXJuYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/bmV3IExsOnRoaXMuX3BvaW50cy5leHBhbmRFbnZlbG9wZShuZXcgTGwpfSxlLnByb3RvdHlwZS5pc1Jpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0Nsb3NlZCgpJiZ0aGlzLmlzU2ltcGxlKCl9LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9MSU5FU1RSSU5HfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb2ludHMudG9Db29yZGluYXRlQXJyYXkoKX0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07aWYoIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MobikpcmV0dXJuITE7dmFyIGk9bjtpZih0aGlzLl9wb2ludHMuc2l6ZSgpIT09aS5fcG9pbnRzLnNpemUoKSlyZXR1cm4hMTtmb3IodmFyIG89MDtvPHRoaXMuX3BvaW50cy5zaXplKCk7bysrKWlmKCFlLmVxdWFsKGUuX3BvaW50cy5nZXRDb29yZGluYXRlKG8pLGkuX3BvaW50cy5nZXRDb29yZGluYXRlKG8pLHIpKXJldHVybiExO3JldHVybiEwfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9MDtlPE1hdGgudHJ1bmModGhpcy5fcG9pbnRzLnNpemUoKS8yKTtlKyspe3ZhciBuPXQuX3BvaW50cy5zaXplKCktMS1lO2lmKCF0Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShlKS5lcXVhbHModC5fcG9pbnRzLmdldENvb3JkaW5hdGUobikpKXJldHVybiB0Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShlKS5jb21wYXJlVG8odC5fcG9pbnRzLmdldENvb3JkaW5hdGUobikpPjAmJkpjLnJldmVyc2UodC5fcG9pbnRzKSxudWxsfX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9udWxsOnRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKDApfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzQ2xvc2VkKCk/VGMuRkFMU0U6MH0sZS5wcm90b3R5cGUuaXNDbG9zZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0VtcHR5KCkmJnRoaXMuZ2V0Q29vcmRpbmF0ZU4oMCkuZXF1YWxzMkQodGhpcy5nZXRDb29yZGluYXRlTih0aGlzLmdldE51bVBvaW50cygpLTEpKX0sZS5wcm90b3R5cGUuZ2V0RW5kUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/bnVsbDp0aGlzLmdldFBvaW50Tih0aGlzLmdldE51bVBvaW50cygpLTEpfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZS5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIFhsLmNvbXB1dGVMZW5ndGgodGhpcy5fcG9pbnRzKX0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvaW50cy5zaXplKCl9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wb2ludHMuY29weSgpO3JldHVybiBKYy5yZXZlcnNlKHQpLHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcodCl9LGUucHJvdG90eXBlLmNvbXBhcmVUb1NhbWVDbGFzcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj1lLHI9MCxpPTA7cjx0aGlzLl9wb2ludHMuc2l6ZSgpJiZpPG4uX3BvaW50cy5zaXplKCk7KXt2YXIgbz10Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShyKS5jb21wYXJlVG8obi5fcG9pbnRzLmdldENvb3JkaW5hdGUoaSkpO2lmKDAhPT1vKXJldHVybiBvO3IrKyxpKyt9cmV0dXJuIHI8dGhpcy5fcG9pbnRzLnNpemUoKT8xOmk8bi5fcG9pbnRzLnNpemUoKT8tMTowfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV0sdT1zO3JldHVybiBhLmNvbXBhcmUodGhpcy5fcG9pbnRzLHUuX3BvaW50cyl9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoZ2woYXJndW1lbnRzWzBdLEtsKSlmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MDtuPHRoaXMuX3BvaW50cy5zaXplKCk7bisrKWUuZmlsdGVyKHQuX3BvaW50cy5nZXRDb29yZGluYXRlKG4pKTtlbHNlIGlmKGdsKGFyZ3VtZW50c1swXSxGYykpe3ZhciByPWFyZ3VtZW50c1swXTtpZigwPT09dGhpcy5fcG9pbnRzLnNpemUoKSlyZXR1cm4gbnVsbDtmb3IodmFyIGk9MDtpPHRoaXMuX3BvaW50cy5zaXplKCkmJihyLmZpbHRlcih0Ll9wb2ludHMsaSksIXIuaXNEb25lKCkpO2krKyk7ci5pc0dlb21ldHJ5Q2hhbmdlZCgpJiZ0aGlzLmdlb21ldHJ5Q2hhbmdlZCgpfWVsc2UgaWYoZ2woYXJndW1lbnRzWzBdLERjKSl7dmFyIG89YXJndW1lbnRzWzBdO28uZmlsdGVyKHRoaXMpfWVsc2UgaWYoZ2woYXJndW1lbnRzWzBdLEhsKSl7dmFyIHM9YXJndW1lbnRzWzBdO3MuZmlsdGVyKHRoaXMpfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHFjKHRoaXMpLmdldEJvdW5kYXJ5KCl9LGUucHJvdG90eXBlLmlzRXF1aXZhbGVudENsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgZX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiBlLl9wb2ludHM9dGhpcy5fcG9pbnRzLmNsb25lKCksZX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZU49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKHQpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTGluZVN0cmluZyJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5fcG9pbnRzLmNvcHkoKSx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvaW50c30sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5fcG9pbnRzLnNpemUoKX0sZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0KXtpZihudWxsPT09dCYmKHQ9dGhpcy5nZXRGYWN0b3J5KCkuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSkpLDE9PT10LnNpemUoKSl0aHJvdyBuZXcgZWwoIkludmFsaWQgbnVtYmVyIG9mIHBvaW50cyBpbiBMaW5lU3RyaW5nIChmb3VuZCAiK3Quc2l6ZSgpKyIgLSBtdXN0IGJlIDAgb3IgPj0gMikiKTt0aGlzLl9wb2ludHM9dH0sZS5wcm90b3R5cGUuaXNDb29yZGluYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fcG9pbnRzLnNpemUoKTtlKyspaWYodGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUoZSkuZXF1YWxzKHQpKXJldHVybiEwO3JldHVybiExfSxlLnByb3RvdHlwZS5nZXRTdGFydFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP251bGw6dGhpcy5nZXRQb2ludE4oMCl9LGUucHJvdG90eXBlLmdldFBvaW50Tj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlUG9pbnQodGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUodCkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltQY119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHgyYjJiNTFiYTQzNWM4ZTAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KFdsKSxLYz1mdW5jdGlvbigpe307S2MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEtjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBLY307dmFyIFFjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt0LmNhbGwodGhpcyxuKSx0aGlzLl9jb29yZGluYXRlcz1lfHxudWxsLHRoaXMuaW5pdCh0aGlzLl9jb29yZGluYXRlcyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jb21wdXRlRW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBuZXcgTGw7dmFyIHQ9bmV3IExsO3JldHVybiB0LmV4cGFuZFRvSW5jbHVkZSh0aGlzLl9jb29yZGluYXRlcy5nZXRYKDApLHRoaXMuX2Nvb3JkaW5hdGVzLmdldFkoMCkpLHR9LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9QT0lOVH0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/W106W3RoaXMuZ2V0Q29vcmRpbmF0ZSgpXX0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSYmKCEoIXRoaXMuaXNFbXB0eSgpfHwhZS5pc0VtcHR5KCkpfHx0aGlzLmlzRW1wdHkoKT09PWUuaXNFbXB0eSgpJiZ0aGlzLmVxdWFsKGUuZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLG4pKX1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMuX2Nvb3JkaW5hdGVzLnNpemUoKT90aGlzLl9jb29yZGluYXRlcy5nZXRDb29yZGluYXRlKDApOm51bGx9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIFRjLkZBTFNFfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPzA6MX0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvcHkoKX0sZS5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLmdldENvb3JkaW5hdGUoKSl0aHJvdyBuZXcgRXJyb3IoImdldFggY2FsbGVkIG9uIGVtcHR5IFBvaW50Iik7cmV0dXJuIHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLnh9LGUucHJvdG90eXBlLmNvbXBhcmVUb1NhbWVDbGFzcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT10O3JldHVybiB0aGlzLmdldENvb3JkaW5hdGUoKS5jb21wYXJlVG8oZS5nZXRDb29yZGluYXRlKCkpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1uO3JldHVybiByLmNvbXBhcmUodGhpcy5fY29vcmRpbmF0ZXMsaS5fY29vcmRpbmF0ZXMpfX0sZS5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oKXtpZihnbChhcmd1bWVudHNbMF0sS2wpKXt2YXIgdD1hcmd1bWVudHNbMF07aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dC5maWx0ZXIodGhpcy5nZXRDb29yZGluYXRlKCkpfWVsc2UgaWYoZ2woYXJndW1lbnRzWzBdLEZjKSl7dmFyIGU9YXJndW1lbnRzWzBdO2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBudWxsO2UuZmlsdGVyKHRoaXMuX2Nvb3JkaW5hdGVzLDApLGUuaXNHZW9tZXRyeUNoYW5nZWQoKSYmdGhpcy5nZW9tZXRyeUNoYW5nZWQoKX1lbHNlIGlmKGdsKGFyZ3VtZW50c1swXSxEYykpe3ZhciBuPWFyZ3VtZW50c1swXTtuLmZpbHRlcih0aGlzKX1lbHNlIGlmKGdsKGFyZ3VtZW50c1swXSxIbCkpe3ZhciByPWFyZ3VtZW50c1swXTtyLmZpbHRlcih0aGlzKX19LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihudWxsKX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiBlLl9jb29yZGluYXRlcz10aGlzLl9jb29yZGluYXRlcy5jbG9uZSgpLGV9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJQb2ludCJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5fY29vcmRpbmF0ZXMuY29weSgpLHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlU2VxdWVuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXN9LGUucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5nZXRDb29yZGluYXRlKCkpdGhyb3cgbmV3IEVycm9yKCJnZXRZIGNhbGxlZCBvbiBlbXB0eSBQb2ludCIpO3JldHVybiB0aGlzLmdldENvb3JkaW5hdGUoKS55fSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9jb29yZGluYXRlcy5zaXplKCl9LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCl7bnVsbD09PXQmJih0PXRoaXMuZ2V0RmFjdG9yeSgpLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoW10pKSxxbC5pc1RydWUodC5zaXplKCk8PTEpLHRoaXMuX2Nvb3JkaW5hdGVzPXR9LGUucHJvdG90eXBlLmlzU2ltcGxlPWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0tjXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDQ0MDc3YmFkMTYxY2JjMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oV2wpLCRjPWZ1bmN0aW9uKCl7fTskYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sJGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICRjfTt2YXIgdGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scil7aWYodC5jYWxsKHRoaXMsciksdGhpcy5fc2hlbGw9bnVsbCx0aGlzLl9ob2xlcz1udWxsLG51bGw9PT1lJiYoZT10aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lYXJSaW5nKCkpLG51bGw9PT1uJiYobj1bXSksdC5oYXNOdWxsRWxlbWVudHMobikpdGhyb3cgbmV3IGVsKCJob2xlcyBtdXN0IG5vdCBjb250YWluIG51bGwgZWxlbWVudHMiKTtpZihlLmlzRW1wdHkoKSYmdC5oYXNOb25FbXB0eUVsZW1lbnRzKG4pKXRocm93IG5ldyBlbCgic2hlbGwgaXMgZW1wdHkgYnV0IGhvbGVzIGFyZSBub3QiKTt0aGlzLl9zaGVsbD1lLHRoaXMuX2hvbGVzPW59dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jb21wdXRlRW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbC5nZXRFbnZlbG9wZUludGVybmFsKCl9LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9QT0xZR09OfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybltdO2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5nZXROdW1Qb2ludHMoKSkuZmlsbChudWxsKSxlPS0xLG49dGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZXMoKSxyPTA7cjxuLmxlbmd0aDtyKyspdFsrK2VdPW5bcl07Zm9yKHZhciBpPTA7aTx0aGlzLl9ob2xlcy5sZW5ndGg7aSsrKWZvcih2YXIgbz10aGlzLl9ob2xlc1tpXS5nZXRDb29yZGluYXRlcygpLHM9MDtzPG8ubGVuZ3RoO3MrKyl0WysrZV09b1tzXTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0QXJlYT1mdW5jdGlvbigpe3ZhciB0PTA7dCs9TWF0aC5hYnMoWGwuc2lnbmVkQXJlYSh0aGlzLl9zaGVsbC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSkpO2Zvcih2YXIgZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0LT1NYXRoLmFicyhYbC5zaWduZWRBcmVhKHRoaXMuX2hvbGVzW2VdLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmlzUmVjdGFuZ2xlPWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMuZ2V0TnVtSW50ZXJpb3JSaW5nKCkpcmV0dXJuITE7aWYobnVsbD09PXRoaXMuX3NoZWxsKXJldHVybiExO2lmKDUhPT10aGlzLl9zaGVsbC5nZXROdW1Qb2ludHMoKSlyZXR1cm4hMTtmb3IodmFyIHQ9dGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksZT10aGlzLmdldEVudmVsb3BlSW50ZXJuYWwoKSxuPTA7bjw1O24rKyl7dmFyIHI9dC5nZXRYKG4pO2lmKHIhPT1lLmdldE1pblgoKSYmciE9PWUuZ2V0TWF4WCgpKXJldHVybiExO3ZhciBpPXQuZ2V0WShuKTtpZihpIT09ZS5nZXRNaW5ZKCkmJmkhPT1lLmdldE1heFkoKSlyZXR1cm4hMX1mb3IodmFyIG89dC5nZXRYKDApLHM9dC5nZXRZKDApLGE9MTthPD00O2ErKyl7dmFyIHU9dC5nZXRYKGEpLGw9dC5nZXRZKGEpO2lmKHUhPT1vPT09KGwhPT1zKSlyZXR1cm4hMTtvPXUscz1sfXJldHVybiEwfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtpZighdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhuKSlyZXR1cm4hMTt2YXIgaT1uLG89dGhpcy5fc2hlbGwscz1pLl9zaGVsbDtpZighby5lcXVhbHNFeGFjdChzLHIpKXJldHVybiExO2lmKHRoaXMuX2hvbGVzLmxlbmd0aCE9PWkuX2hvbGVzLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGE9MDthPHRoaXMuX2hvbGVzLmxlbmd0aDthKyspaWYoIWUuX2hvbGVzW2FdLmVxdWFsc0V4YWN0KGkuX2hvbGVzW2FdLHIpKXJldHVybiExO3JldHVybiEwfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe3RoaXMubm9ybWFsaXplKHRoaXMuX3NoZWxsLCEwKTtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdC5ub3JtYWxpemUodC5faG9sZXNbZV0sITEpO1JjLnNvcnQodGhpcy5faG9sZXMpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtpZihuLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt2YXIgaT1uZXcgQXJyYXkobi5nZXRDb29yZGluYXRlcygpLmxlbmd0aC0xKS5maWxsKG51bGwpO1BsLmFycmF5Y29weShuLmdldENvb3JkaW5hdGVzKCksMCxpLDAsaS5sZW5ndGgpO3ZhciBvPXBjLm1pbkNvb3JkaW5hdGUobi5nZXRDb29yZGluYXRlcygpKTtwYy5zY3JvbGwoaSxvKSxQbC5hcnJheWNvcHkoaSwwLG4uZ2V0Q29vcmRpbmF0ZXMoKSwwLGkubGVuZ3RoKSxuLmdldENvb3JkaW5hdGVzKClbaS5sZW5ndGhdPWlbMF0sWGwuaXNDQ1cobi5nZXRDb29yZGluYXRlcygpKT09PXImJnBjLnJldmVyc2Uobi5nZXRDb29yZGluYXRlcygpKX19LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZSgpfSxlLnByb3RvdHlwZS5nZXROdW1JbnRlcmlvclJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faG9sZXMubGVuZ3RofSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMn0sZS5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIHQ9MDt0Kz10aGlzLl9zaGVsbC5nZXRMZW5ndGgoKTtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdCs9dGhpcy5faG9sZXNbZV0uZ2V0TGVuZ3RoKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldE51bVBvaW50cz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9zaGVsbC5nZXROdW1Qb2ludHMoKSxlPTA7ZTx0aGlzLl9ob2xlcy5sZW5ndGg7ZSsrKXQrPXRoaXMuX2hvbGVzW2VdLmdldE51bVBvaW50cygpO3JldHVybiB0fSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb3B5KCk7dC5fc2hlbGw9dGhpcy5fc2hlbGwuY29weSgpLnJldmVyc2UoKSx0Ll9ob2xlcz1uZXcgQXJyYXkodGhpcy5faG9sZXMubGVuZ3RoKS5maWxsKG51bGwpO2Zvcih2YXIgZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0Ll9ob2xlc1tlXT10aGlzLl9ob2xlc1tlXS5jb3B5KCkucmV2ZXJzZSgpO3JldHVybiB0fSxlLnByb3RvdHlwZS5jb252ZXhIdWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RXh0ZXJpb3JSaW5nKCkuY29udmV4SHVsbCgpfSxlLnByb3RvdHlwZS5jb21wYXJlVG9TYW1lQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj10aGlzLl9zaGVsbCxyPWUuX3NoZWxsO3JldHVybiBuLmNvbXBhcmVUb1NhbWVDbGFzcyhyKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9aSxhPXRoaXMuX3NoZWxsLHU9cy5fc2hlbGwsbD1hLmNvbXBhcmVUb1NhbWVDbGFzcyh1LG8pO2lmKDAhPT1sKXJldHVybiBsO2Zvcih2YXIgYz10aGlzLmdldE51bUludGVyaW9yUmluZygpLGg9cy5nZXROdW1JbnRlcmlvclJpbmcoKSxwPTA7cDxjJiZwPGg7KXt2YXIgZj10LmdldEludGVyaW9yUmluZ04ocCksZz1zLmdldEludGVyaW9yUmluZ04ocCksZD1mLmNvbXBhcmVUb1NhbWVDbGFzcyhnLG8pO2lmKDAhPT1kKXJldHVybiBkO3ArK31yZXR1cm4gcDxjPzE6cDxoPy0xOjB9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKGdsKHQsS2wpKXt0aGlzLl9zaGVsbC5hcHBseSh0KTtmb3IodmFyIG49MDtuPHRoaXMuX2hvbGVzLmxlbmd0aDtuKyspZS5faG9sZXNbbl0uYXBwbHkodCl9ZWxzZSBpZihnbCh0LEZjKSl7aWYodGhpcy5fc2hlbGwuYXBwbHkodCksIXQuaXNEb25lKCkpZm9yKHZhciByPTA7cjx0aGlzLl9ob2xlcy5sZW5ndGgmJihlLl9ob2xlc1tyXS5hcHBseSh0KSwhdC5pc0RvbmUoKSk7cisrKTt0LmlzR2VvbWV0cnlDaGFuZ2VkKCkmJnRoaXMuZ2VvbWV0cnlDaGFuZ2VkKCl9ZWxzZSBpZihnbCh0LERjKSl0LmZpbHRlcih0aGlzKTtlbHNlIGlmKGdsKHQsSGwpKXt0LmZpbHRlcih0aGlzKSx0aGlzLl9zaGVsbC5hcHBseSh0KTtmb3IodmFyIGk9MDtpPHRoaXMuX2hvbGVzLmxlbmd0aDtpKyspZS5faG9sZXNbaV0uYXBwbHkodCl9fSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoKTt2YXIgdD1uZXcgQXJyYXkodGhpcy5faG9sZXMubGVuZ3RoKzEpLmZpbGwobnVsbCk7dFswXT10aGlzLl9zaGVsbDtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdFtlKzFdPXRoaXMuX2hvbGVzW2VdO3JldHVybiB0Lmxlbmd0aDw9MT90aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lYXJSaW5nKHRbMF0uZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkpOnRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyh0KX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO2UuX3NoZWxsPXRoaXMuX3NoZWxsLmNsb25lKCksZS5faG9sZXM9bmV3IEFycmF5KHRoaXMuX2hvbGVzLmxlbmd0aCkuZmlsbChudWxsKTtmb3IodmFyIG49MDtuPHRoaXMuX2hvbGVzLmxlbmd0aDtuKyspZS5faG9sZXNbbl09dGhpcy5faG9sZXNbbl0uY2xvbmUoKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIlBvbHlnb24ifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3NoZWxsLmNvcHkoKSxuPW5ldyBBcnJheSh0aGlzLl9ob2xlcy5sZW5ndGgpLmZpbGwobnVsbCkscj0wO3I8bi5sZW5ndGg7cisrKW5bcl09dGhpcy5faG9sZXNbcl0uY29weSgpO3JldHVybiBuZXcgZSh0LG4sdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmdldEV4dGVyaW9yUmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbH0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbC5pc0VtcHR5KCl9LGUucHJvdG90eXBlLmdldEludGVyaW9yUmluZ049ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2hvbGVzW3RdfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblskY119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHgzMDdmZmVmZDhkYzk3MjAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KFdsKSxlaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gV2wuU09SVElOREVYX01VTFRJUE9JTlR9LGUucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSYmdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0Q29vcmRpbmF0ZSgpfXJldHVybiB0LnByb3RvdHlwZS5nZXRDb29yZGluYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gVGMuRkFMU0V9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAwfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obnVsbCl9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJNdWx0aVBvaW50In0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0tjXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDZmYjFlZDQxNjJlMGZjMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oa2MpLG5oPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXtlIGluc3RhbmNlb2YgdWwmJm4gaW5zdGFuY2VvZiBfaCYmKGU9bi5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKGUpKSx0LmNhbGwodGhpcyxlLG4pLHRoaXMudmFsaWRhdGVDb25zdHJ1Y3Rpb24oKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17TUlOSU1VTV9WQUxJRF9TSVpFOntjb25maWd1cmFibGU6ITB9LHNlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gV2wuU09SVElOREVYX0xJTkVBUlJJTkd9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIFRjLkZBTFNFfSxlLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5pc0VtcHR5KCl8fHQucHJvdG90eXBlLmlzQ2xvc2VkLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wb2ludHMuY29weSgpO3JldHVybiBKYy5yZXZlcnNlKHQpLHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVhclJpbmcodCl9LGUucHJvdG90eXBlLnZhbGlkYXRlQ29uc3RydWN0aW9uPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNFbXB0eSgpJiYhdC5wcm90b3R5cGUuaXNDbG9zZWQuY2FsbCh0aGlzKSl0aHJvdyBuZXcgZWwoIlBvaW50cyBvZiBMaW5lYXJSaW5nIGRvIG5vdCBmb3JtIGEgY2xvc2VkIGxpbmVzdHJpbmciKTtpZih0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLnNpemUoKT49MSYmdGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2UoKS5zaXplKCk8ZS5NSU5JTVVNX1ZBTElEX1NJWkUpdGhyb3cgbmV3IGVsKCJJbnZhbGlkIG51bWJlciBvZiBwb2ludHMgaW4gTGluZWFyUmluZyAoZm91bmQgIit0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLnNpemUoKSsiIC0gbXVzdCBiZSAwIG9yID49IDQpIil9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJMaW5lYXJSaW5nIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLl9wb2ludHMuY29weSgpLHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLk1JTklNVU1fVkFMSURfU0laRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gNH0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDNiMjI5ZTI2MjM2N2E2MDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oWmMpLHJoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiBXbC5TT1JUSU5ERVhfTVVMVElQT0xZR09OfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuISF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpJiZ0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5jYWxsKHRoaXMsZSxuKX1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMn0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCxlPW5ldyBBcnJheSh0KS5maWxsKG51bGwpLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyllW25dPXRoaXMuX2dlb21ldHJpZXNbbl0ucmV2ZXJzZSgpO3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aVBvbHlnb24oZSl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZygpO2Zvcih2YXIgdD1uZXcgbGMsZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKWZvcih2YXIgbj10aGlzLl9nZW9tZXRyaWVzW2VdLmdldEJvdW5kYXJ5KCkscj0wO3I8bi5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXQuYWRkKG4uZ2V0R2VvbWV0cnlOKHIpKTt2YXIgaT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyh0LnRvQXJyYXkoaSkpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTXVsdGlQb2x5Z29uIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuWyRjXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDdhNWFhMTM2OTE3MTk4MH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShrYyksaWg9ZnVuY3Rpb24odCl7dGhpcy5fZmFjdG9yeT10fHxudWxsLHRoaXMuX2lzVXNlckRhdGFDb3BpZWQ9ITF9LG9oPXtOb09wR2VvbWV0cnlPcGVyYXRpb246e2NvbmZpZ3VyYWJsZTohMH0sQ29vcmRpbmF0ZU9wZXJhdGlvbjp7Y29uZmlndXJhYmxlOiEwfSxDb29yZGluYXRlU2VxdWVuY2VPcGVyYXRpb246e2NvbmZpZ3VyYWJsZTohMH19O2loLnByb3RvdHlwZS5zZXRDb3B5VXNlckRhdGE9ZnVuY3Rpb24odCl7dGhpcy5faXNVc2VyRGF0YUNvcGllZD10fSxpaC5wcm90b3R5cGUuZWRpdD1mdW5jdGlvbih0LGUpe2lmKG51bGw9PT10KXJldHVybiBudWxsO3ZhciBuPXRoaXMuZWRpdEludGVybmFsKHQsZSk7cmV0dXJuIHRoaXMuX2lzVXNlckRhdGFDb3BpZWQmJm4uc2V0VXNlckRhdGEodC5nZXRVc2VyRGF0YSgpKSxufSxpaC5wcm90b3R5cGUuZWRpdEludGVybmFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PT10aGlzLl9mYWN0b3J5JiYodGhpcy5fZmFjdG9yeT10LmdldEZhY3RvcnkoKSksdCBpbnN0YW5jZW9mIGtjP3RoaXMuZWRpdEdlb21ldHJ5Q29sbGVjdGlvbih0LGUpOnQgaW5zdGFuY2VvZiB0aD90aGlzLmVkaXRQb2x5Z29uKHQsZSk6dCBpbnN0YW5jZW9mIFFjfHx0IGluc3RhbmNlb2YgWmM/ZS5lZGl0KHQsdGhpcy5fZmFjdG9yeSk6KHFsLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJVbnN1cHBvcnRlZCBHZW9tZXRyeSBjbGFzczogIit0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSxudWxsKX0saWgucHJvdG90eXBlLmVkaXRHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5lZGl0KHQsdGhpcy5fZmFjdG9yeSkscj1uZXcgbGMsaT0wO2k8bi5nZXROdW1HZW9tZXRyaWVzKCk7aSsrKXt2YXIgbz10aGlzLmVkaXQobi5nZXRHZW9tZXRyeU4oaSksZSk7bnVsbD09PW98fG8uaXNFbXB0eSgpfHxyLmFkZChvKX1yZXR1cm4gbi5nZXRDbGFzcygpPT09ZWg/dGhpcy5fZmFjdG9yeS5jcmVhdGVNdWx0aVBvaW50KHIudG9BcnJheShbXSkpOm4uZ2V0Q2xhc3MoKT09PUdjP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKHIudG9BcnJheShbXSkpOm4uZ2V0Q2xhc3MoKT09PXJoP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTXVsdGlQb2x5Z29uKHIudG9BcnJheShbXSkpOnRoaXMuX2ZhY3RvcnkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKHIudG9BcnJheShbXSkpfSxpaC5wcm90b3R5cGUuZWRpdFBvbHlnb249ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmVkaXQodCx0aGlzLl9mYWN0b3J5KTtpZihudWxsPT09biYmKG49dGhpcy5fZmFjdG9yeS5jcmVhdGVQb2x5Z29uKG51bGwpKSxuLmlzRW1wdHkoKSlyZXR1cm4gbjt2YXIgcj10aGlzLmVkaXQobi5nZXRFeHRlcmlvclJpbmcoKSxlKTtpZihudWxsPT09cnx8ci5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9seWdvbigpO2Zvcih2YXIgaT1uZXcgbGMsbz0wO288bi5nZXROdW1JbnRlcmlvclJpbmcoKTtvKyspe3ZhciBzPXRoaXMuZWRpdChuLmdldEludGVyaW9yUmluZ04obyksZSk7bnVsbD09PXN8fHMuaXNFbXB0eSgpfHxpLmFkZChzKX1yZXR1cm4gdGhpcy5fZmFjdG9yeS5jcmVhdGVQb2x5Z29uKHIsaS50b0FycmF5KFtdKSl9LGloLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxpaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaWh9LGloLkdlb21ldHJ5RWRpdG9yT3BlcmF0aW9uPWZ1bmN0aW9uKCl7fSxvaC5Ob09wR2VvbWV0cnlPcGVyYXRpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHNofSxvaC5Db29yZGluYXRlT3BlcmF0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiBhaH0sb2guQ29vcmRpbmF0ZVNlcXVlbmNlT3BlcmF0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiB1aH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaWgsb2gpO3ZhciBzaD1mdW5jdGlvbigpe307c2gucHJvdG90eXBlLmVkaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdH0sc2gucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2loLkdlb21ldHJ5RWRpdG9yT3BlcmF0aW9uXX0sc2gucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHNofTt2YXIgYWg9ZnVuY3Rpb24oKXt9O2FoLnByb3RvdHlwZS5lZGl0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5lZGl0Q29vcmRpbmF0ZXModC5nZXRDb29yZGluYXRlcygpLHQpO3JldHVybiBudWxsPT09bj90OnQgaW5zdGFuY2VvZiBuaD9lLmNyZWF0ZUxpbmVhclJpbmcobik6dCBpbnN0YW5jZW9mIFpjP2UuY3JlYXRlTGluZVN0cmluZyhuKTp0IGluc3RhbmNlb2YgUWM/bi5sZW5ndGg+MD9lLmNyZWF0ZVBvaW50KG5bMF0pOmUuY3JlYXRlUG9pbnQoKTp0fSxhaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5baWguR2VvbWV0cnlFZGl0b3JPcGVyYXRpb25dfSxhaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYWh9O3ZhciB1aD1mdW5jdGlvbigpe307dWgucHJvdG90eXBlLmVkaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIG5oP2UuY3JlYXRlTGluZWFyUmluZyh0aGlzLmVkaXQodC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSk6dCBpbnN0YW5jZW9mIFpjP2UuY3JlYXRlTGluZVN0cmluZyh0aGlzLmVkaXQodC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSk6dCBpbnN0YW5jZW9mIFFjP2UuY3JlYXRlUG9pbnQodGhpcy5lZGl0KHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCkpOnR9LHVoLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpaC5HZW9tZXRyeUVkaXRvck9wZXJhdGlvbl19LHVoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB1aH07dmFyIGxoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZih0aGlzLl9kaW1lbnNpb249Myx0aGlzLl9jb29yZGluYXRlcz1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXRoaXMuX2Nvb3JkaW5hdGVzPWFyZ3VtZW50c1swXSx0aGlzLl9kaW1lbnNpb249MztlbHNlIGlmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX2Nvb3JkaW5hdGVzPW5ldyBBcnJheShlKS5maWxsKG51bGwpO2Zvcih2YXIgbj0wO248ZTtuKyspdC5fY29vcmRpbmF0ZXNbbl09bmV3IHVsfWVsc2UgaWYoZ2woYXJndW1lbnRzWzBdLElsKSl7dmFyIHI9YXJndW1lbnRzWzBdO2lmKG51bGw9PT1yKXJldHVybiB0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoMCkuZmlsbChudWxsKSxudWxsO3RoaXMuX2RpbWVuc2lvbj1yLmdldERpbWVuc2lvbigpLHRoaXMuX2Nvb3JkaW5hdGVzPW5ldyBBcnJheShyLnNpemUoKSkuZmlsbChudWxsKTtmb3IodmFyIGk9MDtpPHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtpKyspdC5fY29vcmRpbmF0ZXNbaV09ci5nZXRDb29yZGluYXRlQ29weShpKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aClpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1sxXSkpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXTt0aGlzLl9jb29yZGluYXRlcz1vLHRoaXMuX2RpbWVuc2lvbj1zLG51bGw9PT1vJiYodGhpcy5fY29vcmRpbmF0ZXM9bmV3IEFycmF5KDApLmZpbGwobnVsbCkpfWVsc2UgaWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pJiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1sxXSkpe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXTt0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoYSkuZmlsbChudWxsKSx0aGlzLl9kaW1lbnNpb249dTtmb3IodmFyIGw9MDtsPGE7bCsrKXQuX2Nvb3JkaW5hdGVzW2xdPW5ldyB1bH19LGNoPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtsaC5wcm90b3R5cGUuc2V0T3JkaW5hdGU9ZnVuY3Rpb24odCxlLG4pe3N3aXRjaChlKXtjYXNlIElsLlg6dGhpcy5fY29vcmRpbmF0ZXNbdF0ueD1uO2JyZWFrO2Nhc2UgSWwuWTp0aGlzLl9jb29yZGluYXRlc1t0XS55PW47YnJlYWs7Y2FzZSBJbC5aOnRoaXMuX2Nvb3JkaW5hdGVzW3RdLno9bjticmVhaztkZWZhdWx0OnRocm93IG5ldyBlbCgiaW52YWxpZCBvcmRpbmF0ZUluZGV4Iil9fSxsaC5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGh9LGxoLnByb3RvdHlwZS5nZXRPcmRpbmF0ZT1mdW5jdGlvbih0LGUpe3N3aXRjaChlKXtjYXNlIElsLlg6cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdLng7Y2FzZSBJbC5ZOnJldHVybiB0aGlzLl9jb29yZGluYXRlc1t0XS55O2Nhc2UgSWwuWjpyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0uen1yZXR1cm4gbmwuTmFOfSxsaC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07bi54PXRoaXMuX2Nvb3JkaW5hdGVzW2VdLngsbi55PXRoaXMuX2Nvb3JkaW5hdGVzW2VdLnksbi56PXRoaXMuX2Nvb3JkaW5hdGVzW2VdLnp9fSxsaC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZUNvcHk9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB1bCh0aGlzLl9jb29yZGluYXRlc1t0XSl9LGxoLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGltZW5zaW9ufSxsaC5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0ueH0sbGgucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSkuZmlsbChudWxsKSxlPTA7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXRbZV09dGhpcy5fY29vcmRpbmF0ZXNbZV0uY2xvbmUoKTtyZXR1cm4gbmV3IGxoKHQsdGhpcy5fZGltZW5zaW9uKX0sbGgucHJvdG90eXBlLmV4cGFuZEVudmVsb3BlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2UrKyl0LmV4cGFuZFRvSW5jbHVkZSh0aGlzLl9jb29yZGluYXRlc1tlXSk7cmV0dXJuIHR9LGxoLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSkuZmlsbChudWxsKSxlPTA7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXRbZV09dGhpcy5fY29vcmRpbmF0ZXNbZV0uY29weSgpO3JldHVybiBuZXcgbGgodCx0aGlzLl9kaW1lbnNpb24pfSxsaC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtpZih0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg+MCl7dmFyIHQ9bmV3IHZsKDE3KnRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aCk7dC5hcHBlbmQoIigiKSx0LmFwcGVuZCh0aGlzLl9jb29yZGluYXRlc1swXSk7Zm9yKHZhciBlPTE7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXQuYXBwZW5kKCIsICIpLHQuYXBwZW5kKHRoaXMuX2Nvb3JkaW5hdGVzW2VdKTtyZXR1cm4gdC5hcHBlbmQoIikiKSx0LnRvU3RyaW5nKCl9cmV0dXJuIigpIn0sbGgucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdLnl9LGxoLnByb3RvdHlwZS50b0Nvb3JkaW5hdGVBcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlc30sbGgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0lsLGFsXX0sbGgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGxofSxjaC5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weGNiNDRhNzc4ZGIxOGUwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGgsY2gpO3ZhciBoaD1mdW5jdGlvbigpe30scGg9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0saW5zdGFuY2VPYmplY3Q6e2NvbmZpZ3VyYWJsZTohMH19O2hoLnByb3RvdHlwZS5yZWFkUmVzb2x2ZT1mdW5jdGlvbigpe3JldHVybiBoaC5pbnN0YW5jZSgpfSxoaC5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gbmV3IGxoKHQpfWlmKGdsKGFyZ3VtZW50c1swXSxJbCkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gbmV3IGxoKGUpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07cmV0dXJuIHI+MyYmKHI9MykscjwyP25ldyBsaChuKTpuZXcgbGgobixyKX19LGhoLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltobCxhbF19LGhoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBoaH0saGguaW5zdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gaGguaW5zdGFuY2VPYmplY3R9LHBoLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4MzhlNDlmYTZjZjZmMmUwMH0scGguaW5zdGFuY2VPYmplY3QuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBoaH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaGgscGgpO3ZhciBmaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMubWFwXz1uZXcgTWFwfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFwXy5nZXQodCl8fG51bGx9LGUucHJvdG90eXBlLnB1dD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1hcF8uc2V0KHQsZSksZX0sZS5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBsYyxlPXRoaXMubWFwXy52YWx1ZXMoKSxuPWUubmV4dCgpOyFuLmRvbmU7KXQuYWRkKG4udmFsdWUpLG49ZS5uZXh0KCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmVudHJ5U2V0PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHhjO3JldHVybiB0aGlzLm1hcF8uZW50cmllcygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmFkZChlKX0pKSx0fSxlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwXy5zaXplKCl9LGV9KHljKSxnaD1mdW5jdGlvbiB0KCl7aWYodGhpcy5fbW9kZWxUeXBlPW51bGwsdGhpcy5fc2NhbGU9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLl9tb2RlbFR5cGU9dC5GTE9BVElORztlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgeWgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9tb2RlbFR5cGU9ZSxlPT09dC5GSVhFRCYmdGhpcy5zZXRTY2FsZSgxKX1lbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5fbW9kZWxUeXBlPXQuRklYRUQsdGhpcy5zZXRTY2FsZShuKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIHI9YXJndW1lbnRzWzBdO3RoaXMuX21vZGVsVHlwZT1yLl9tb2RlbFR5cGUsdGhpcy5fc2NhbGU9ci5fc2NhbGV9fSxkaD17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxtYXhpbXVtUHJlY2lzZVZhbHVlOntjb25maWd1cmFibGU6ITB9fTtnaC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIGdoKSlyZXR1cm4hMTt2YXIgZT10O3JldHVybiB0aGlzLl9tb2RlbFR5cGU9PT1lLl9tb2RlbFR5cGUmJnRoaXMuX3NjYWxlPT09ZS5fc2NhbGV9LGdoLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dCxuPXRoaXMuZ2V0TWF4aW11bVNpZ25pZmljYW50RGlnaXRzKCkscj1lLmdldE1heGltdW1TaWduaWZpY2FudERpZ2l0cygpO3JldHVybiBuZXcgX2wobikuY29tcGFyZVRvKG5ldyBfbChyKSl9LGdoLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX0sZ2gucHJvdG90eXBlLmlzRmxvYXRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kZWxUeXBlPT09Z2guRkxPQVRJTkd8fHRoaXMuX21vZGVsVHlwZT09PWdoLkZMT0FUSU5HX1NJTkdMRX0sZ2gucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kZWxUeXBlfSxnaC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0iVU5LTk9XTiI7cmV0dXJuIHRoaXMuX21vZGVsVHlwZT09PWdoLkZMT0FUSU5HP3Q9IkZsb2F0aW5nIjp0aGlzLl9tb2RlbFR5cGU9PT1naC5GTE9BVElOR19TSU5HTEU/dD0iRmxvYXRpbmctU2luZ2xlIjp0aGlzLl9tb2RlbFR5cGU9PT1naC5GSVhFRCYmKHQ9IkZpeGVkIChTY2FsZT0iK3RoaXMuZ2V0U2NhbGUoKSsiKSIpLHR9LGdoLnByb3RvdHlwZS5tYWtlUHJlY2lzZT1mdW5jdGlvbigpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgdD1hcmd1bWVudHNbMF07aWYobmwuaXNOYU4odCkpcmV0dXJuIHQ7aWYodGhpcy5fbW9kZWxUeXBlPT09Z2guRkxPQVRJTkdfU0lOR0xFKXtyZXR1cm4gdH1yZXR1cm4gdGhpcy5fbW9kZWxUeXBlPT09Z2guRklYRUQ/TWF0aC5yb3VuZCh0KnRoaXMuX3NjYWxlKS90aGlzLl9zY2FsZTp0fWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwpe3ZhciBlPWFyZ3VtZW50c1swXTtpZih0aGlzLl9tb2RlbFR5cGU9PT1naC5GTE9BVElORylyZXR1cm4gbnVsbDtlLng9dGhpcy5tYWtlUHJlY2lzZShlLngpLGUueT10aGlzLm1ha2VQcmVjaXNlKGUueSl9fSxnaC5wcm90b3R5cGUuZ2V0TWF4aW11bVNpZ25pZmljYW50RGlnaXRzPWZ1bmN0aW9uKCl7dmFyIHQ9MTY7cmV0dXJuIHRoaXMuX21vZGVsVHlwZT09PWdoLkZMT0FUSU5HP3Q9MTY6dGhpcy5fbW9kZWxUeXBlPT09Z2guRkxPQVRJTkdfU0lOR0xFP3Q9Njp0aGlzLl9tb2RlbFR5cGU9PT1naC5GSVhFRCYmKHQ9MStNYXRoLnRydW5jKE1hdGguY2VpbChNYXRoLmxvZyh0aGlzLmdldFNjYWxlKCkpL01hdGgubG9nKDEwKSkpKSx0fSxnaC5wcm90b3R5cGUuc2V0U2NhbGU9ZnVuY3Rpb24odCl7dGhpcy5fc2NhbGU9TWF0aC5hYnModCl9LGdoLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblthbCxpbF19LGdoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBnaH0sZ2gubW9zdFByZWNpc2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb21wYXJlVG8oZSk+PTA/dDplfSxkaC5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDZiZWU2NDA0ZTlhMjVjMDB9LGRoLm1heGltdW1QcmVjaXNlVmFsdWUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDkwMDcxOTkyNTQ3NDA5OTJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGdoLGRoKTt2YXIgeWg9ZnVuY3Rpb24gdChlKXt0aGlzLl9uYW1lPWV8fG51bGwsdC5uYW1lVG9UeXBlTWFwLnB1dChlLHRoaXMpfSx2aD17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxuYW1lVG9UeXBlTWFwOntjb25maWd1cmFibGU6ITB9fTt5aC5wcm90b3R5cGUucmVhZFJlc29sdmU9ZnVuY3Rpb24oKXtyZXR1cm4geWgubmFtZVRvVHlwZU1hcC5nZXQodGhpcy5fbmFtZSl9LHloLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9uYW1lfSx5aC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bYWxdfSx5aC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geWh9LHZoLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTU1Mjg2MDI2MzE3MzE1OWU0fSx2aC5uYW1lVG9UeXBlTWFwLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgZmh9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHloLHZoKSxnaC5UeXBlPXloLGdoLkZJWEVEPW5ldyB5aCgiRklYRUQiKSxnaC5GTE9BVElORz1uZXcgeWgoIkZMT0FUSU5HIiksZ2guRkxPQVRJTkdfU0lOR0xFPW5ldyB5aCgiRkxPQVRJTkcgU0lOR0xFIik7dmFyIF9oPWZ1bmN0aW9uIHQoKXt0aGlzLl9wcmVjaXNpb25Nb2RlbD1uZXcgZ2gsdGhpcy5fU1JJRD0wLHRoaXMuX2Nvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnk9dC5nZXREZWZhdWx0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLDA9PT1hcmd1bWVudHMubGVuZ3RofHwoMT09PWFyZ3VtZW50cy5sZW5ndGg/Z2woYXJndW1lbnRzWzBdLGhsKT90aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PWFyZ3VtZW50c1swXTphcmd1bWVudHNbMF1pbnN0YW5jZW9mIGdoJiYodGhpcy5fcHJlY2lzaW9uTW9kZWw9YXJndW1lbnRzWzBdKToyPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5fcHJlY2lzaW9uTW9kZWw9YXJndW1lbnRzWzBdLHRoaXMuX1NSSUQ9YXJndW1lbnRzWzFdKTozPT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX3ByZWNpc2lvbk1vZGVsPWFyZ3VtZW50c1swXSx0aGlzLl9TUklEPWFyZ3VtZW50c1sxXSx0aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PWFyZ3VtZW50c1syXSkpfSxtaD17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07X2gucHJvdG90eXBlLnRvR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNOdWxsKCk/dGhpcy5jcmVhdGVQb2ludChudWxsKTp0LmdldE1pblgoKT09PXQuZ2V0TWF4WCgpJiZ0LmdldE1pblkoKT09PXQuZ2V0TWF4WSgpP3RoaXMuY3JlYXRlUG9pbnQobmV3IHVsKHQuZ2V0TWluWCgpLHQuZ2V0TWluWSgpKSk6dC5nZXRNaW5YKCk9PT10LmdldE1heFgoKXx8dC5nZXRNaW5ZKCk9PT10LmdldE1heFkoKT90aGlzLmNyZWF0ZUxpbmVTdHJpbmcoW25ldyB1bCh0LmdldE1pblgoKSx0LmdldE1pblkoKSksbmV3IHVsKHQuZ2V0TWF4WCgpLHQuZ2V0TWF4WSgpKV0pOnRoaXMuY3JlYXRlUG9seWdvbih0aGlzLmNyZWF0ZUxpbmVhclJpbmcoW25ldyB1bCh0LmdldE1pblgoKSx0LmdldE1pblkoKSksbmV3IHVsKHQuZ2V0TWluWCgpLHQuZ2V0TWF4WSgpKSxuZXcgdWwodC5nZXRNYXhYKCksdC5nZXRNYXhZKCkpLG5ldyB1bCh0LmdldE1heFgoKSx0LmdldE1pblkoKSksbmV3IHVsKHQuZ2V0TWluWCgpLHQuZ2V0TWluWSgpKV0pLG51bGwpfSxfaC5wcm90b3R5cGUuY3JlYXRlTGluZVN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdD90IGluc3RhbmNlb2YgQXJyYXk/bmV3IFpjKHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KSx0aGlzKTpnbCh0LElsKT9uZXcgWmModCx0aGlzKTp2b2lkIDA6bmV3IFpjKHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSksdGhpcyl9LF9oLnByb3RvdHlwZS5jcmVhdGVNdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IEdjKG51bGwsdGhpcyk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gbmV3IEdjKHQsdGhpcyl9fSxfaC5wcm90b3R5cGUuYnVpbGRHZW9tZXRyeT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bnVsbCxuPSExLHI9ITEsaT10Lml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKSxzPW8uZ2V0Q2xhc3MoKTtudWxsPT09ZSYmKGU9cykscyE9PWUmJihuPSEwKSxvLmlzR2VvbWV0cnlDb2xsZWN0aW9uT3JEZXJpdmVkKCkmJihyPSEwKX1pZihudWxsPT09ZSlyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oKTtpZihufHxyKXJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihfaC50b0dlb21ldHJ5QXJyYXkodCkpO3ZhciBhPXQuaXRlcmF0b3IoKS5uZXh0KCk7aWYodC5zaXplKCk+MSl7aWYoYSBpbnN0YW5jZW9mIHRoKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9seWdvbihfaC50b1BvbHlnb25BcnJheSh0KSk7aWYoYSBpbnN0YW5jZW9mIFpjKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpTGluZVN0cmluZyhfaC50b0xpbmVTdHJpbmdBcnJheSh0KSk7aWYoYSBpbnN0YW5jZW9mIFFjKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9pbnQoX2gudG9Qb2ludEFycmF5KHQpKTtxbC5zaG91bGROZXZlclJlYWNoSGVyZSgiVW5oYW5kbGVkIGNsYXNzOiAiK2EuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpfXJldHVybiBhfSxfaC5wcm90b3R5cGUuY3JlYXRlTXVsdGlQb2ludEZyb21Db29yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChudWxsIT09dD90aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUodCk6bnVsbCl9LF9oLnByb3RvdHlwZS5jcmVhdGVQb2ludD1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmNyZWF0ZVBvaW50KHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlUG9pbnQobnVsbCE9PXQ/dGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFt0XSk6bnVsbCl9aWYoZ2woYXJndW1lbnRzWzBdLElsKSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBuZXcgUWMoZSx0aGlzKX19fSxfaC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5fSxfaC5wcm90b3R5cGUuY3JlYXRlUG9seWdvbj1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBuZXcgdGgobnVsbCxudWxsLHRoaXMpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihnbChhcmd1bWVudHNbMF0sSWwpKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlUG9seWdvbih0aGlzLmNyZWF0ZUxpbmVhclJpbmcodCkpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVQb2x5Z29uKHRoaXMuY3JlYXRlTGluZWFyUmluZyhlKSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBuaCl7dmFyIG49YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNyZWF0ZVBvbHlnb24obixudWxsKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3JldHVybiBuZXcgdGgocixpLHRoaXMpfX0sX2gucHJvdG90eXBlLmdldFNSSUQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fU1JJRH0sX2gucHJvdG90eXBlLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbj1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBuZXcga2MobnVsbCx0aGlzKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBuZXcga2ModCx0aGlzKX19LF9oLnByb3RvdHlwZS5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGloKHRoaXMpLmVkaXQodCx7ZWRpdDpmdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkuY3JlYXRlKHQpfX19KX0sX2gucHJvdG90eXBlLmdldFByZWNpc2lvbk1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZWNpc2lvbk1vZGVsfSxfaC5wcm90b3R5cGUuY3JlYXRlTGluZWFyUmluZz1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmNyZWF0ZUxpbmVhclJpbmcodGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFtdKSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVMaW5lYXJSaW5nKG51bGwhPT10P3RoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KTpudWxsKX1pZihnbChhcmd1bWVudHNbMF0sSWwpKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIG5ldyBuaChlLHRoaXMpfX19LF9oLnByb3RvdHlwZS5jcmVhdGVNdWx0aVBvbHlnb249ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IHJoKG51bGwsdGhpcyk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gbmV3IHJoKHQsdGhpcyl9fSxfaC5wcm90b3R5cGUuY3JlYXRlTXVsdGlQb2ludD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG5ldyBlaChudWxsLHRoaXMpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIG5ldyBlaChlLHRoaXMpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciBuPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVNdWx0aVBvaW50KG51bGwhPT1uP3RoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShuKTpudWxsKX1pZihnbChhcmd1bWVudHNbMF0sSWwpKXt2YXIgcj1hcmd1bWVudHNbMF07aWYobnVsbD09PXIpcmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChuZXcgQXJyYXkoMCkuZmlsbChudWxsKSk7Zm9yKHZhciBpPW5ldyBBcnJheShyLnNpemUoKSkuZmlsbChudWxsKSxvPTA7bzxyLnNpemUoKTtvKyspe3ZhciBzPXQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSgxLHIuZ2V0RGltZW5zaW9uKCkpO0pjLmNvcHkocixvLHMsMCwxKSxpW29dPXQuY3JlYXRlUG9pbnQocyl9cmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChpKX19fSxfaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bYWxdfSxfaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gX2h9LF9oLnRvTXVsdGlQb2x5Z29uQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LF9oLnRvR2VvbWV0cnlBcnJheT1mdW5jdGlvbih0KXtpZihudWxsPT09dClyZXR1cm4gbnVsbDt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sX2guZ2V0RGVmYXVsdENvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnk9ZnVuY3Rpb24oKXtyZXR1cm4gaGguaW5zdGFuY2UoKX0sX2gudG9NdWx0aUxpbmVTdHJpbmdBcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sX2gudG9MaW5lU3RyaW5nQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LF9oLnRvTXVsdGlQb2ludEFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxfaC50b0xpbmVhclJpbmdBcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sX2gudG9Qb2ludEFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxfaC50b1BvbHlnb25BcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sX2guY3JlYXRlUG9pbnRGcm9tSW50ZXJuYWxDb29yZD1mdW5jdGlvbih0LGUpe3JldHVybiBlLmdldFByZWNpc2lvbk1vZGVsKCkubWFrZVByZWNpc2UodCksZS5nZXRGYWN0b3J5KCkuY3JlYXRlUG9pbnQodCl9LG1oLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4NWVhNzVmMjA1MWVlYjQwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoX2gsbWgpO3ZhciB4aD1bIlBvaW50IiwiTXVsdGlQb2ludCIsIkxpbmVTdHJpbmciLCJNdWx0aUxpbmVTdHJpbmciLCJQb2x5Z29uIiwiTXVsdGlQb2x5Z29uIl0sRWg9ZnVuY3Rpb24odCl7dGhpcy5nZW9tZXRyeUZhY3Rvcnk9dHx8bmV3IF9ofTtFaC5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXt2YXIgZSxuPShlPSJzdHJpbmciPT10eXBlb2YgdD9KU09OLnBhcnNlKHQpOnQpLnR5cGU7aWYoIWJoW25dKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBHZW9KU09OIHR5cGU6ICIrZS50eXBlKTtyZXR1cm4tMSE9PXhoLmluZGV4T2Yobik/Ymhbbl0uYXBwbHkodGhpcyxbZS5jb29yZGluYXRlc10pOiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09bj9iaFtuXS5hcHBseSh0aGlzLFtlLmdlb21ldHJpZXNdKTpiaFtuXS5hcHBseSh0aGlzLFtlXSl9LEVoLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXt2YXIgZT10LmdldEdlb21ldHJ5VHlwZSgpO2lmKCF3aFtlXSl0aHJvdyBuZXcgRXJyb3IoIkdlb21ldHJ5IGlzIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4gd2hbZV0uYXBwbHkodGhpcyxbdF0pfTt2YXIgYmg9e0ZlYXR1cmU6ZnVuY3Rpb24odCl7dmFyIGU9e307Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO2lmKHQuZ2VvbWV0cnkpe3ZhciByPXQuZ2VvbWV0cnkudHlwZTtpZighYmhbcl0pdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIEdlb0pTT04gdHlwZTogIit0LnR5cGUpO2UuZ2VvbWV0cnk9dGhpcy5yZWFkKHQuZ2VvbWV0cnkpfXJldHVybiB0LmJib3gmJihlLmJib3g9YmguYmJveC5hcHBseSh0aGlzLFt0LmJib3hdKSksZX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCl7dmFyIGU9e307aWYodC5mZWF0dXJlcyl7ZS5mZWF0dXJlcz1bXTtmb3IodmFyIG49MDtuPHQuZmVhdHVyZXMubGVuZ3RoOysrbillLmZlYXR1cmVzLnB1c2godGhpcy5yZWFkKHQuZmVhdHVyZXNbbl0pKX1yZXR1cm4gdC5iYm94JiYoZS5iYm94PXRoaXMucGFyc2UuYmJveC5hcHBseSh0aGlzLFt0LmJib3hdKSksZX0sY29vcmRpbmF0ZXM6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoOysrbil7dmFyIHI9dFtuXTtlLnB1c2gobmV3IHVsKHJbMF0sclsxXSkpfXJldHVybiBlfSxiYm94OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKFtuZXcgdWwodFswXSx0WzFdKSxuZXcgdWwodFsyXSx0WzFdKSxuZXcgdWwodFsyXSx0WzNdKSxuZXcgdWwodFswXSx0WzNdKSxuZXcgdWwodFswXSx0WzFdKV0pfSxQb2ludDpmdW5jdGlvbih0KXt2YXIgZT1uZXcgdWwodFswXSx0WzFdKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlUG9pbnQoZSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoOysrbillLnB1c2goYmguUG9pbnQuYXBwbHkodGhpcyxbdFtuXV0pKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlQb2ludChlKX0sTGluZVN0cmluZzpmdW5jdGlvbih0KXt2YXIgZT1iaC5jb29yZGluYXRlcy5hcHBseSh0aGlzLFt0XSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVTdHJpbmcoZSl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7KytuKWUucHVzaChiaC5MaW5lU3RyaW5nLmFwcGx5KHRoaXMsW3Rbbl1dKSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpTGluZVN0cmluZyhlKX0sUG9seWdvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9YmguY29vcmRpbmF0ZXMuYXBwbHkodGhpcyxbdFswXV0pLG49dGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhlKSxyPVtdLGk9MTtpPHQubGVuZ3RoOysraSl7dmFyIG89dFtpXSxzPWJoLmNvb3JkaW5hdGVzLmFwcGx5KHRoaXMsW29dKSxhPXRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcocyk7ci5wdXNoKGEpfXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2x5Z29uKG4scil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7KytuKXt2YXIgcj10W25dO2UucHVzaChiaC5Qb2x5Z29uLmFwcGx5KHRoaXMsW3JdKSl9cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9seWdvbihlKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciByPXRbbl07ZS5wdXNoKHRoaXMucmVhZChyKSl9cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihlKX19LHdoPXtjb29yZGluYXRlOmZ1bmN0aW9uKHQpe3JldHVyblt0LngsdC55XX0sUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6IlBvaW50Iixjb29yZGluYXRlczp3aC5jb29yZGluYXRlLmFwcGx5KHRoaXMsW3QuZ2V0Q29vcmRpbmF0ZSgpXSl9fSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Ll9nZW9tZXRyaWVzLmxlbmd0aDsrK24pe3ZhciByPXQuX2dlb21ldHJpZXNbbl0saT13aC5Qb2ludC5hcHBseSh0aGlzLFtyXSk7ZS5wdXNoKGkuY29vcmRpbmF0ZXMpfXJldHVybnt0eXBlOiJNdWx0aVBvaW50Iixjb29yZGluYXRlczplfX0sTGluZVN0cmluZzpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj10LmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGg7KytyKXt2YXIgaT1uW3JdO2UucHVzaCh3aC5jb29yZGluYXRlLmFwcGx5KHRoaXMsW2ldKSl9cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmV9fSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQuX2dlb21ldHJpZXMubGVuZ3RoOysrbil7dmFyIHI9dC5fZ2VvbWV0cmllc1tuXSxpPXdoLkxpbmVTdHJpbmcuYXBwbHkodGhpcyxbcl0pO2UucHVzaChpLmNvb3JkaW5hdGVzKX1yZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczplfX0sUG9seWdvbjpmdW5jdGlvbih0KXt2YXIgZT1bXSxuPXdoLkxpbmVTdHJpbmcuYXBwbHkodGhpcyxbdC5fc2hlbGxdKTtlLnB1c2gobi5jb29yZGluYXRlcyk7Zm9yKHZhciByPTA7cjx0Ll9ob2xlcy5sZW5ndGg7KytyKXt2YXIgaT10Ll9ob2xlc1tyXSxvPXdoLkxpbmVTdHJpbmcuYXBwbHkodGhpcyxbaV0pO2UucHVzaChvLmNvb3JkaW5hdGVzKX1yZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6ZX19LE11bHRpUG9seWdvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dC5fZ2VvbWV0cmllcy5sZW5ndGg7KytuKXt2YXIgcj10Ll9nZW9tZXRyaWVzW25dLGk9d2guUG9seWdvbi5hcHBseSh0aGlzLFtyXSk7ZS5wdXNoKGkuY29vcmRpbmF0ZXMpfXJldHVybnt0eXBlOiJNdWx0aVBvbHlnb24iLGNvb3JkaW5hdGVzOmV9fSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQuX2dlb21ldHJpZXMubGVuZ3RoOysrbil7dmFyIHI9dC5fZ2VvbWV0cmllc1tuXSxpPXIuZ2V0R2VvbWV0cnlUeXBlKCk7ZS5wdXNoKHdoW2ldLmFwcGx5KHRoaXMsW3JdKSl9cmV0dXJue3R5cGU6Ikdlb21ldHJ5Q29sbGVjdGlvbiIsZ2VvbWV0cmllczplfX19LEloPWZ1bmN0aW9uKHQpe3RoaXMuZ2VvbWV0cnlGYWN0b3J5PXR8fG5ldyBfaCx0aGlzLnByZWNpc2lvbk1vZGVsPXRoaXMuZ2VvbWV0cnlGYWN0b3J5LmdldFByZWNpc2lvbk1vZGVsKCksdGhpcy5wYXJzZXI9bmV3IEVoKHRoaXMuZ2VvbWV0cnlGYWN0b3J5KX07SWgucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wYXJzZXIucmVhZCh0KTtyZXR1cm4gdGhpcy5wcmVjaXNpb25Nb2RlbC5nZXRUeXBlKCk9PT1naC5GSVhFRCYmdGhpcy5yZWR1Y2VQcmVjaXNpb24oZSksZX0sSWgucHJvdG90eXBlLnJlZHVjZVByZWNpc2lvbj1mdW5jdGlvbih0KXt2YXIgZSxuO2lmKHQuY29vcmRpbmF0ZSl0aGlzLnByZWNpc2lvbk1vZGVsLm1ha2VQcmVjaXNlKHQuY29vcmRpbmF0ZSk7ZWxzZSBpZih0LnBvaW50cylmb3IoZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspdGhpcy5wcmVjaXNpb25Nb2RlbC5tYWtlUHJlY2lzZSh0LnBvaW50c1tlXSk7ZWxzZSBpZih0Lmdlb21ldHJpZXMpZm9yKGU9MCxuPXQuZ2VvbWV0cmllcy5sZW5ndGg7ZTxuO2UrKyl0aGlzLnJlZHVjZVByZWNpc2lvbih0Lmdlb21ldHJpZXNbZV0pfTt2YXIgTmg9ZnVuY3Rpb24oKXt0aGlzLnBhcnNlcj1uZXcgRWgodGhpcy5nZW9tZXRyeUZhY3RvcnkpfTtOaC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucGFyc2VyLndyaXRlKHQpfTt2YXIgU2g9ZnVuY3Rpb24oKXt9LENoPXtPTjp7Y29uZmlndXJhYmxlOiEwfSxMRUZUOntjb25maWd1cmFibGU6ITB9LFJJR0hUOntjb25maWd1cmFibGU6ITB9fTtmdW5jdGlvbiBQaCh0KXt0aGlzLm1lc3NhZ2U9dHx8IiJ9ZnVuY3Rpb24gTWgoKXt0aGlzLmFycmF5Xz1bXX1TaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sU2gucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFNofSxTaC5vcHBvc2l0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVNoLkxFRlQ/U2guUklHSFQ6dD09PVNoLlJJR0hUP1NoLkxFRlQ6dH0sQ2guT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LENoLkxFRlQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LENoLlJJR0hULmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhTaCxDaCksUGgucHJvdG90eXBlPW5ldyBFcnJvcixQaC5wcm90b3R5cGUubmFtZT0iRW1wdHlTdGFja0V4Y2VwdGlvbiIsTWgucHJvdG90eXBlPW5ldyBhYyxNaC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFycmF5Xy5wdXNoKHQpLCEwfSxNaC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2lmKHQ8MHx8dD49dGhpcy5zaXplKCkpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLmFycmF5X1t0XX0sTWgucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXJyYXlfLnB1c2godCksdH0sTWgucHJvdG90eXBlLnBvcD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5hcnJheV8ubGVuZ3RoKXRocm93IG5ldyBQaDtyZXR1cm4gdGhpcy5hcnJheV8ucG9wKCl9LE1oLnByb3RvdHlwZS5wZWVrPWZ1bmN0aW9uKCl7aWYoMD09PXRoaXMuYXJyYXlfLmxlbmd0aCl0aHJvdyBuZXcgUGg7cmV0dXJuIHRoaXMuYXJyYXlfW3RoaXMuYXJyYXlfLmxlbmd0aC0xXX0sTWgucHJvdG90eXBlLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9LE1oLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1wdHkoKX0sTWgucHJvdG90eXBlLnNlYXJjaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hcnJheV8uaW5kZXhPZih0KX0sTWgucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcnJheV8ubGVuZ3RofSxNaC5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl0LnB1c2godGhpcy5hcnJheV9bZV0pO3JldHVybiB0fTt2YXIgTGg9ZnVuY3Rpb24oKXt0aGlzLl9taW5JbmRleD0tMSx0aGlzLl9taW5Db29yZD1udWxsLHRoaXMuX21pbkRlPW51bGwsdGhpcy5fb3JpZW50ZWREZT1udWxsfTtMaC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5Db29yZH0sTGgucHJvdG90eXBlLmdldFJpZ2h0bW9zdFNpZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldFJpZ2h0bW9zdFNpZGVPZlNlZ21lbnQodCxlKTtyZXR1cm4gbjwwJiYobj10aGlzLmdldFJpZ2h0bW9zdFNpZGVPZlNlZ21lbnQodCxlLTEpKSxuPDAmJih0aGlzLl9taW5Db29yZD1udWxsLHRoaXMuY2hlY2tGb3JSaWdodG1vc3RDb29yZGluYXRlKHQpKSxufSxMaC5wcm90b3R5cGUuZmluZFJpZ2h0bW9zdEVkZ2VBdFZlcnRleD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX21pbkRlLmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpO3FsLmlzVHJ1ZSh0aGlzLl9taW5JbmRleD4wJiZ0aGlzLl9taW5JbmRleDx0Lmxlbmd0aCwicmlnaHRtb3N0IHBvaW50IGV4cGVjdGVkIHRvIGJlIGludGVyaW9yIHZlcnRleCBvZiBlZGdlIik7dmFyIGU9dFt0aGlzLl9taW5JbmRleC0xXSxuPXRbdGhpcy5fbWluSW5kZXgrMV0scj1YbC5jb21wdXRlT3JpZW50YXRpb24odGhpcy5fbWluQ29vcmQsbixlKSxpPSExOyhlLnk8dGhpcy5fbWluQ29vcmQueSYmbi55PHRoaXMuX21pbkNvb3JkLnkmJnI9PT1YbC5DT1VOVEVSQ0xPQ0tXSVNFfHxlLnk+dGhpcy5fbWluQ29vcmQueSYmbi55PnRoaXMuX21pbkNvb3JkLnkmJnI9PT1YbC5DTE9DS1dJU0UpJiYoaT0hMCksaSYmKHRoaXMuX21pbkluZGV4PXRoaXMuX21pbkluZGV4LTEpfSxMaC5wcm90b3R5cGUuZ2V0UmlnaHRtb3N0U2lkZU9mU2VnbWVudD1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCk7aWYoZTwwfHxlKzE+PW4ubGVuZ3RoKXJldHVybi0xO2lmKG5bZV0ueT09PW5bZSsxXS55KXJldHVybi0xO3ZhciByPVNoLkxFRlQ7cmV0dXJuIG5bZV0ueTxuW2UrMV0ueSYmKHI9U2guUklHSFQpLHJ9LExoLnByb3RvdHlwZS5nZXRFZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGVkRGV9LExoLnByb3RvdHlwZS5jaGVja0ZvclJpZ2h0bW9zdENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj10LmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpLHI9MDtyPG4ubGVuZ3RoLTE7cisrKShudWxsPT09ZS5fbWluQ29vcmR8fG5bcl0ueD5lLl9taW5Db29yZC54KSYmKGUuX21pbkRlPXQsZS5fbWluSW5kZXg9cixlLl9taW5Db29yZD1uW3JdKX0sTGgucHJvdG90eXBlLmZpbmRSaWdodG1vc3RFZGdlQXROb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWluRGUuZ2V0Tm9kZSgpLmdldEVkZ2VzKCk7dGhpcy5fbWluRGU9dC5nZXRSaWdodG1vc3RFZGdlKCksdGhpcy5fbWluRGUuaXNGb3J3YXJkKCl8fCh0aGlzLl9taW5EZT10aGlzLl9taW5EZS5nZXRTeW0oKSx0aGlzLl9taW5JbmRleD10aGlzLl9taW5EZS5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKS5sZW5ndGgtMSl9LExoLnByb3RvdHlwZS5maW5kRWRnZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7bi5pc0ZvcndhcmQoKSYmdGhpcy5jaGVja0ZvclJpZ2h0bW9zdENvb3JkaW5hdGUobil9cWwuaXNUcnVlKDAhPT10aGlzLl9taW5JbmRleHx8dGhpcy5fbWluQ29vcmQuZXF1YWxzKHRoaXMuX21pbkRlLmdldENvb3JkaW5hdGUoKSksImluY29uc2lzdGVuY3kgaW4gcmlnaHRtb3N0IHByb2Nlc3NpbmciKSwwPT09dGhpcy5fbWluSW5kZXg/dGhpcy5maW5kUmlnaHRtb3N0RWRnZUF0Tm9kZSgpOnRoaXMuZmluZFJpZ2h0bW9zdEVkZ2VBdFZlcnRleCgpLHRoaXMuX29yaWVudGVkRGU9dGhpcy5fbWluRGUsdGhpcy5nZXRSaWdodG1vc3RTaWRlKHRoaXMuX21pbkRlLHRoaXMuX21pbkluZGV4KT09PVNoLkxFRlQmJih0aGlzLl9vcmllbnRlZERlPXRoaXMuX21pbkRlLmdldFN5bSgpKX0sTGgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LExoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBMaH07dmFyIE9oPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobixyKXt0LmNhbGwodGhpcyxlLm1zZ1dpdGhDb29yZChuLHIpKSx0aGlzLnB0PXI/bmV3IHVsKHIpOm51bGwsdGhpcy5uYW1lPSJUb3BvbG9neUV4Y2VwdGlvbiJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdH0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS5tc2dXaXRoQ29vcmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT90OnQrIiBbICIrZSsiIF0ifSxlfShrbCksUmg9ZnVuY3Rpb24oKXt0aGlzLmFycmF5Xz1bXX07UmgucHJvdG90eXBlLmFkZExhc3Q9ZnVuY3Rpb24odCl7dGhpcy5hcnJheV8ucHVzaCh0KX0sUmgucHJvdG90eXBlLnJlbW92ZUZpcnN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLnNoaWZ0KCl9LFJoLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9O3ZhciBUaD1mdW5jdGlvbigpe3RoaXMuX2ZpbmRlcj1udWxsLHRoaXMuX2RpckVkZ2VMaXN0PW5ldyBsYyx0aGlzLl9ub2Rlcz1uZXcgbGMsdGhpcy5fcmlnaHRNb3N0Q29vcmQ9bnVsbCx0aGlzLl9lbnY9bnVsbCx0aGlzLl9maW5kZXI9bmV3IExofTtUaC5wcm90b3R5cGUuY2xlYXJWaXNpdGVkRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZGlyRWRnZUxpc3QuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLnNldFZpc2l0ZWQoITEpfX0sVGgucHJvdG90eXBlLmdldFJpZ2h0bW9zdENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmlnaHRNb3N0Q29vcmR9LFRoLnByb3RvdHlwZS5jb21wdXRlTm9kZURlcHRoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLG49dC5nZXRFZGdlcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihyLmlzVmlzaXRlZCgpfHxyLmdldFN5bSgpLmlzVmlzaXRlZCgpKXtlPXI7YnJlYWt9fWlmKG51bGw9PT1lKXRocm93IG5ldyBPaCgidW5hYmxlIHRvIGZpbmQgZWRnZSB0byBjb21wdXRlIGRlcHRocyBhdCAiK3QuZ2V0Q29vcmRpbmF0ZSgpKTt0LmdldEVkZ2VzKCkuY29tcHV0ZURlcHRocyhlKTtmb3IodmFyIGk9dC5nZXRFZGdlcygpLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKTtvLnNldFZpc2l0ZWQoITApLHRoaXMuY29weVN5bURlcHRocyhvKX19LFRoLnByb3RvdHlwZS5jb21wdXRlRGVwdGg9ZnVuY3Rpb24odCl7dGhpcy5jbGVhclZpc2l0ZWRFZGdlcygpO3ZhciBlPXRoaXMuX2ZpbmRlci5nZXRFZGdlKCk7ZS5zZXRFZGdlRGVwdGhzKFNoLlJJR0hULHQpLHRoaXMuY29weVN5bURlcHRocyhlKSx0aGlzLmNvbXB1dGVEZXB0aHMoZSl9LFRoLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCl7dGhpcy5hZGRSZWFjaGFibGUodCksdGhpcy5fZmluZGVyLmZpbmRFZGdlKHRoaXMuX2RpckVkZ2VMaXN0KSx0aGlzLl9yaWdodE1vc3RDb29yZD10aGlzLl9maW5kZXIuZ2V0Q29vcmRpbmF0ZSgpfSxUaC5wcm90b3R5cGUuZmluZFJlc3VsdEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2RpckVkZ2VMaXN0Lml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKTtlLmdldERlcHRoKFNoLlJJR0hUKT49MSYmZS5nZXREZXB0aChTaC5MRUZUKTw9MCYmIWUuaXNJbnRlcmlvckFyZWFFZGdlKCkmJmUuc2V0SW5SZXN1bHQoITApfX0sVGgucHJvdG90eXBlLmNvbXB1dGVEZXB0aHM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHhjLG49bmV3IFJoLHI9dC5nZXROb2RlKCk7Zm9yKG4uYWRkTGFzdChyKSxlLmFkZChyKSx0LnNldFZpc2l0ZWQoITApOyFuLmlzRW1wdHkoKTspe3ZhciBpPW4ucmVtb3ZlRmlyc3QoKTtlLmFkZChpKSx0aGlzLmNvbXB1dGVOb2RlRGVwdGgoaSk7Zm9yKHZhciBvPWkuZ2V0RWRnZXMoKS5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCkuZ2V0U3ltKCk7aWYoIXMuaXNWaXNpdGVkKCkpe3ZhciBhPXMuZ2V0Tm9kZSgpO2UuY29udGFpbnMoYSl8fChuLmFkZExhc3QoYSksZS5hZGQoYSkpfX19fSxUaC5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX3JpZ2h0TW9zdENvb3JkLng8ZS5fcmlnaHRNb3N0Q29vcmQueD8tMTp0aGlzLl9yaWdodE1vc3RDb29yZC54PmUuX3JpZ2h0TW9zdENvb3JkLng/MTowfSxUaC5wcm90b3R5cGUuZ2V0RW52ZWxvcGU9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fZW52KXtmb3IodmFyIHQ9bmV3IExsLGU9dGhpcy5fZGlyRWRnZUxpc3QuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspZm9yKHZhciBuPWUubmV4dCgpLmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpLHI9MDtyPG4ubGVuZ3RoLTE7cisrKXQuZXhwYW5kVG9JbmNsdWRlKG5bcl0pO3RoaXMuX2Vudj10fXJldHVybiB0aGlzLl9lbnZ9LFRoLnByb3RvdHlwZS5hZGRSZWFjaGFibGU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IE1oO2ZvcihlLmFkZCh0KTshZS5lbXB0eSgpOyl7dmFyIG49ZS5wb3AoKTt0aGlzLmFkZChuLGUpfX0sVGgucHJvdG90eXBlLmNvcHlTeW1EZXB0aHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRTeW0oKTtlLnNldERlcHRoKFNoLkxFRlQsdC5nZXREZXB0aChTaC5SSUdIVCkpLGUuc2V0RGVwdGgoU2guUklHSFQsdC5nZXREZXB0aChTaC5MRUZUKSl9LFRoLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXt0LnNldFZpc2l0ZWQoITApLHRoaXMuX25vZGVzLmFkZCh0KTtmb3IodmFyIG49dC5nZXRFZGdlcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTt0aGlzLl9kaXJFZGdlTGlzdC5hZGQocik7dmFyIGk9ci5nZXRTeW0oKS5nZXROb2RlKCk7aS5pc1Zpc2l0ZWQoKXx8ZS5wdXNoKGkpfX0sVGgucHJvdG90eXBlLmdldE5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzfSxUaC5wcm90b3R5cGUuZ2V0RGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXJFZGdlTGlzdH0sVGgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2lsXX0sVGgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFRofTt2YXIgQWg9ZnVuY3Rpb24gdCgpe3ZhciBlPXRoaXM7aWYodGhpcy5sb2NhdGlvbj1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5pbml0KG4ubGVuZ3RoKX1lbHNlIGlmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSl7dmFyIHI9YXJndW1lbnRzWzBdO3RoaXMuaW5pdCgxKSx0aGlzLmxvY2F0aW9uW1NoLk9OXT1yfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0KXt2YXIgaT1hcmd1bWVudHNbMF07aWYodGhpcy5pbml0KGkubG9jYXRpb24ubGVuZ3RoKSxudWxsIT09aSlmb3IodmFyIG89MDtvPHRoaXMubG9jYXRpb24ubGVuZ3RoO28rKyllLmxvY2F0aW9uW29dPWkubG9jYXRpb25bb119fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXSx1PWFyZ3VtZW50c1syXTt0aGlzLmluaXQoMyksdGhpcy5sb2NhdGlvbltTaC5PTl09cyx0aGlzLmxvY2F0aW9uW1NoLkxFRlRdPWEsdGhpcy5sb2NhdGlvbltTaC5SSUdIVF09dX19O0FoLnByb3RvdHlwZS5zZXRBbGxMb2NhdGlvbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmxvY2F0aW9uLmxlbmd0aDtlKyspdGhpcy5sb2NhdGlvbltlXT10fSxBaC5wcm90b3R5cGUuaXNOdWxsPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLmxvY2F0aW9uLmxlbmd0aDt0KyspaWYodGhpcy5sb2NhdGlvblt0XSE9PXBsLk5PTkUpcmV0dXJuITE7cmV0dXJuITB9LEFoLnByb3RvdHlwZS5zZXRBbGxMb2NhdGlvbnNJZk51bGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmxvY2F0aW9uLmxlbmd0aDtlKyspdGhpcy5sb2NhdGlvbltlXT09PXBsLk5PTkUmJih0aGlzLmxvY2F0aW9uW2VdPXQpfSxBaC5wcm90b3R5cGUuaXNMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLmxvY2F0aW9uLmxlbmd0aH0sQWgucHJvdG90eXBlLm1lcmdlPWZ1bmN0aW9uKHQpe2lmKHQubG9jYXRpb24ubGVuZ3RoPnRoaXMubG9jYXRpb24ubGVuZ3RoKXt2YXIgZT1uZXcgQXJyYXkoMykuZmlsbChudWxsKTtlW1NoLk9OXT10aGlzLmxvY2F0aW9uW1NoLk9OXSxlW1NoLkxFRlRdPXBsLk5PTkUsZVtTaC5SSUdIVF09cGwuTk9ORSx0aGlzLmxvY2F0aW9uPWV9Zm9yKHZhciBuPTA7bjx0aGlzLmxvY2F0aW9uLmxlbmd0aDtuKyspdGhpcy5sb2NhdGlvbltuXT09PXBsLk5PTkUmJm48dC5sb2NhdGlvbi5sZW5ndGgmJih0aGlzLmxvY2F0aW9uW25dPXQubG9jYXRpb25bbl0pfSxBaC5wcm90b3R5cGUuZ2V0TG9jYXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYXRpb259LEFoLnByb3RvdHlwZS5mbGlwPWZ1bmN0aW9uKCl7aWYodGhpcy5sb2NhdGlvbi5sZW5ndGg8PTEpcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5sb2NhdGlvbltTaC5MRUZUXTt0aGlzLmxvY2F0aW9uW1NoLkxFRlRdPXRoaXMubG9jYXRpb25bU2guUklHSFRdLHRoaXMubG9jYXRpb25bU2guUklHSFRdPXR9LEFoLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PW5ldyB2bDtyZXR1cm4gdGhpcy5sb2NhdGlvbi5sZW5ndGg+MSYmdC5hcHBlbmQocGwudG9Mb2NhdGlvblN5bWJvbCh0aGlzLmxvY2F0aW9uW1NoLkxFRlRdKSksdC5hcHBlbmQocGwudG9Mb2NhdGlvblN5bWJvbCh0aGlzLmxvY2F0aW9uW1NoLk9OXSkpLHRoaXMubG9jYXRpb24ubGVuZ3RoPjEmJnQuYXBwZW5kKHBsLnRvTG9jYXRpb25TeW1ib2wodGhpcy5sb2NhdGlvbltTaC5SSUdIVF0pKSx0LnRvU3RyaW5nKCl9LEFoLnByb3RvdHlwZS5zZXRMb2NhdGlvbnM9ZnVuY3Rpb24odCxlLG4pe3RoaXMubG9jYXRpb25bU2guT05dPXQsdGhpcy5sb2NhdGlvbltTaC5MRUZUXT1lLHRoaXMubG9jYXRpb25bU2guUklHSFRdPW59LEFoLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ8dGhpcy5sb2NhdGlvbi5sZW5ndGg/dGhpcy5sb2NhdGlvblt0XTpwbC5OT05FfSxBaC5wcm90b3R5cGUuaXNBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYXRpb24ubGVuZ3RoPjF9LEFoLnByb3RvdHlwZS5pc0FueU51bGw9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMubG9jYXRpb24ubGVuZ3RoO3QrKylpZih0aGlzLmxvY2F0aW9uW3RdPT09cGwuTk9ORSlyZXR1cm4hMDtyZXR1cm4hMX0sQWgucHJvdG90eXBlLnNldExvY2F0aW9uPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldExvY2F0aW9uKFNoLk9OLHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLmxvY2F0aW9uW2VdPW59fSxBaC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0KXt0aGlzLmxvY2F0aW9uPW5ldyBBcnJheSh0KS5maWxsKG51bGwpLHRoaXMuc2V0QWxsTG9jYXRpb25zKHBsLk5PTkUpfSxBaC5wcm90b3R5cGUuaXNFcXVhbE9uU2lkZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmxvY2F0aW9uW2VdPT09dC5sb2NhdGlvbltlXX0sQWgucHJvdG90eXBlLmFsbFBvc2l0aW9uc0VxdWFsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5sb2NhdGlvbi5sZW5ndGg7ZSsrKWlmKHRoaXMubG9jYXRpb25bZV0hPT10KXJldHVybiExO3JldHVybiEwfSxBaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sQWgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEFofTt2YXIgRGg9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuZWx0PW5ldyBBcnJheSgyKS5maWxsKG51bGwpLDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmVsdFswXT1uZXcgQWgoZSksdGhpcy5lbHRbMV09bmV3IEFoKGUpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0KXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5lbHRbMF09bmV3IEFoKG4uZWx0WzBdKSx0aGlzLmVsdFsxXT1uZXcgQWgobi5lbHRbMV0pfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07dGhpcy5lbHRbMF09bmV3IEFoKHBsLk5PTkUpLHRoaXMuZWx0WzFdPW5ldyBBaChwbC5OT05FKSx0aGlzLmVsdFtyXS5zZXRMb2NhdGlvbihpKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl07dGhpcy5lbHRbMF09bmV3IEFoKG8scyxhKSx0aGlzLmVsdFsxXT1uZXcgQWgobyxzLGEpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB1PWFyZ3VtZW50c1swXSxsPWFyZ3VtZW50c1sxXSxjPWFyZ3VtZW50c1syXSxoPWFyZ3VtZW50c1szXTt0aGlzLmVsdFswXT1uZXcgQWgocGwuTk9ORSxwbC5OT05FLHBsLk5PTkUpLHRoaXMuZWx0WzFdPW5ldyBBaChwbC5OT05FLHBsLk5PTkUscGwuTk9ORSksdGhpcy5lbHRbdV0uc2V0TG9jYXRpb25zKGwsYyxoKX19O0RoLnByb3RvdHlwZS5nZXRHZW9tZXRyeUNvdW50PWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lbHRbMF0uaXNOdWxsKCl8fHQrKyx0aGlzLmVsdFsxXS5pc051bGwoKXx8dCsrLHR9LERoLnByb3RvdHlwZS5zZXRBbGxMb2NhdGlvbnM9ZnVuY3Rpb24odCxlKXt0aGlzLmVsdFt0XS5zZXRBbGxMb2NhdGlvbnMoZSl9LERoLnByb3RvdHlwZS5pc051bGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWx0W3RdLmlzTnVsbCgpfSxEaC5wcm90b3R5cGUuc2V0QWxsTG9jYXRpb25zSWZOdWxsPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldEFsbExvY2F0aW9uc0lmTnVsbCgwLHQpLHRoaXMuc2V0QWxsTG9jYXRpb25zSWZOdWxsKDEsdCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuZWx0W2VdLnNldEFsbExvY2F0aW9uc0lmTnVsbChuKX19LERoLnByb3RvdHlwZS5pc0xpbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWx0W3RdLmlzTGluZSgpfSxEaC5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj0wO248MjtuKyspbnVsbD09PWUuZWx0W25dJiZudWxsIT09dC5lbHRbbl0/ZS5lbHRbbl09bmV3IEFoKHQuZWx0W25dKTplLmVsdFtuXS5tZXJnZSh0LmVsdFtuXSl9LERoLnByb3RvdHlwZS5mbGlwPWZ1bmN0aW9uKCl7dGhpcy5lbHRbMF0uZmxpcCgpLHRoaXMuZWx0WzFdLmZsaXAoKX0sRGgucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5lbHRbdF0uZ2V0KFNoLk9OKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmVsdFtlXS5nZXQobil9fSxEaC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgdmw7cmV0dXJuIG51bGwhPT10aGlzLmVsdFswXSYmKHQuYXBwZW5kKCJBOiIpLHQuYXBwZW5kKHRoaXMuZWx0WzBdLnRvU3RyaW5nKCkpKSxudWxsIT09dGhpcy5lbHRbMV0mJih0LmFwcGVuZCgiIEI6IiksdC5hcHBlbmQodGhpcy5lbHRbMV0udG9TdHJpbmcoKSkpLHQudG9TdHJpbmcoKX0sRGgucHJvdG90eXBlLmlzQXJlYT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmVsdFswXS5pc0FyZWEoKXx8dGhpcy5lbHRbMV0uaXNBcmVhKCk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5lbHRbdF0uaXNBcmVhKCl9fSxEaC5wcm90b3R5cGUuaXNBbnlOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVsdFt0XS5pc0FueU51bGwoKX0sRGgucHJvdG90eXBlLnNldExvY2F0aW9uPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLmVsdFt0XS5zZXRMb2NhdGlvbihTaC5PTixlKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl07dGhpcy5lbHRbbl0uc2V0TG9jYXRpb24ocixpKX19LERoLnByb3RvdHlwZS5pc0VxdWFsT25TaWRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWx0WzBdLmlzRXF1YWxPblNpZGUodC5lbHRbMF0sZSkmJnRoaXMuZWx0WzFdLmlzRXF1YWxPblNpZGUodC5lbHRbMV0sZSl9LERoLnByb3RvdHlwZS5hbGxQb3NpdGlvbnNFcXVhbD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVsdFt0XS5hbGxQb3NpdGlvbnNFcXVhbChlKX0sRGgucHJvdG90eXBlLnRvTGluZT1mdW5jdGlvbih0KXt0aGlzLmVsdFt0XS5pc0FyZWEoKSYmKHRoaXMuZWx0W3RdPW5ldyBBaCh0aGlzLmVsdFt0XS5sb2NhdGlvblswXSkpfSxEaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRGgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIERofSxEaC50b0xpbmVMYWJlbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IERoKHBsLk5PTkUpLG49MDtuPDI7bisrKWUuc2V0TG9jYXRpb24obix0LmdldExvY2F0aW9uKG4pKTtyZXR1cm4gZX07dmFyIEZoPWZ1bmN0aW9uKCl7dGhpcy5fc3RhcnREZT1udWxsLHRoaXMuX21heE5vZGVEZWdyZWU9LTEsdGhpcy5fZWRnZXM9bmV3IGxjLHRoaXMuX3B0cz1uZXcgbGMsdGhpcy5fbGFiZWw9bmV3IERoKHBsLk5PTkUpLHRoaXMuX3Jpbmc9bnVsbCx0aGlzLl9pc0hvbGU9bnVsbCx0aGlzLl9zaGVsbD1udWxsLHRoaXMuX2hvbGVzPW5ldyBsYyx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbWV0cnlGYWN0b3J5PWUsdGhpcy5jb21wdXRlUG9pbnRzKHQpLHRoaXMuY29tcHV0ZVJpbmcoKX07RmgucHJvdG90eXBlLmNvbXB1dGVSaW5nPWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3JpbmcpcmV0dXJuIG51bGw7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLl9wdHMuc2l6ZSgpKS5maWxsKG51bGwpLGU9MDtlPHRoaXMuX3B0cy5zaXplKCk7ZSsrKXRbZV09dGhpcy5fcHRzLmdldChlKTt0aGlzLl9yaW5nPXRoaXMuX2dlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKHQpLHRoaXMuX2lzSG9sZT1YbC5pc0NDVyh0aGlzLl9yaW5nLmdldENvb3JkaW5hdGVzKCkpfSxGaC5wcm90b3R5cGUuaXNJc29sYXRlZD1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5fbGFiZWwuZ2V0R2VvbWV0cnlDb3VudCgpfSxGaC5wcm90b3R5cGUuY29tcHV0ZVBvaW50cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX3N0YXJ0RGU9dDt2YXIgbj10LHI9ITA7ZG97aWYobnVsbD09PW4pdGhyb3cgbmV3IE9oKCJGb3VuZCBudWxsIERpcmVjdGVkRWRnZSIpO2lmKG4uZ2V0RWRnZVJpbmcoKT09PWUpdGhyb3cgbmV3IE9oKCJEaXJlY3RlZCBFZGdlIHZpc2l0ZWQgdHdpY2UgZHVyaW5nIHJpbmctYnVpbGRpbmcgYXQgIituLmdldENvb3JkaW5hdGUoKSk7ZS5fZWRnZXMuYWRkKG4pO3ZhciBpPW4uZ2V0TGFiZWwoKTtxbC5pc1RydWUoaS5pc0FyZWEoKSksZS5tZXJnZUxhYmVsKGkpLGUuYWRkUG9pbnRzKG4uZ2V0RWRnZSgpLG4uaXNGb3J3YXJkKCkscikscj0hMSxlLnNldEVkZ2VSaW5nKG4sZSksbj1lLmdldE5leHQobil9d2hpbGUobiE9PXRoaXMuX3N0YXJ0RGUpfSxGaC5wcm90b3R5cGUuZ2V0TGluZWFyUmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yaW5nfSxGaC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHRzLmdldCh0KX0sRmgucHJvdG90eXBlLmNvbXB1dGVNYXhOb2RlRGVncmVlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9tYXhOb2RlRGVncmVlPTA7dmFyIGU9dGhpcy5fc3RhcnREZTtkb3t2YXIgbj1lLmdldE5vZGUoKS5nZXRFZGdlcygpLmdldE91dGdvaW5nRGVncmVlKHQpO24+dC5fbWF4Tm9kZURlZ3JlZSYmKHQuX21heE5vZGVEZWdyZWU9biksZT10LmdldE5leHQoZSl9d2hpbGUoZSE9PXRoaXMuX3N0YXJ0RGUpO3RoaXMuX21heE5vZGVEZWdyZWUqPTJ9LEZoLnByb3RvdHlwZS5hZGRQb2ludHM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuZ2V0Q29vcmRpbmF0ZXMoKTtpZihlKXt2YXIgaT0xO24mJihpPTApO2Zvcih2YXIgbz1pO288ci5sZW5ndGg7bysrKXRoaXMuX3B0cy5hZGQocltvXSl9ZWxzZXt2YXIgcz1yLmxlbmd0aC0yO24mJihzPXIubGVuZ3RoLTEpO2Zvcih2YXIgYT1zO2E+PTA7YS0tKXRoaXMuX3B0cy5hZGQoclthXSl9fSxGaC5wcm90b3R5cGUuaXNIb2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSG9sZX0sRmgucHJvdG90eXBlLnNldEluUmVzdWx0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3RhcnREZTtkb3t0LmdldEVkZ2UoKS5zZXRJblJlc3VsdCghMCksdD10LmdldE5leHQoKX13aGlsZSh0IT09dGhpcy5fc3RhcnREZSl9LEZoLnByb3RvdHlwZS5jb250YWluc1BvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0TGluZWFyUmluZygpO2lmKCFlLmdldEVudmVsb3BlSW50ZXJuYWwoKS5jb250YWlucyh0KSlyZXR1cm4hMTtpZighWGwuaXNQb2ludEluUmluZyh0LGUuZ2V0Q29vcmRpbmF0ZXMoKSkpcmV0dXJuITE7Zm9yKHZhciBuPXRoaXMuX2hvbGVzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXtpZihuLm5leHQoKS5jb250YWluc1BvaW50KHQpKXJldHVybiExfXJldHVybiEwfSxGaC5wcm90b3R5cGUuYWRkSG9sZT1mdW5jdGlvbih0KXt0aGlzLl9ob2xlcy5hZGQodCl9LEZoLnByb3RvdHlwZS5pc1NoZWxsPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9zaGVsbH0sRmgucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxGaC5wcm90b3R5cGUuZ2V0RWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZXN9LEZoLnByb3RvdHlwZS5nZXRNYXhOb2RlRGVncmVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heE5vZGVEZWdyZWU8MCYmdGhpcy5jb21wdXRlTWF4Tm9kZURlZ3JlZSgpLHRoaXMuX21heE5vZGVEZWdyZWV9LEZoLnByb3RvdHlwZS5nZXRTaGVsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbH0sRmgucHJvdG90eXBlLm1lcmdlTGFiZWw9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMubWVyZ2VMYWJlbCh0LDApLHRoaXMubWVyZ2VMYWJlbCh0LDEpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWUuZ2V0TG9jYXRpb24obixTaC5SSUdIVCk7aWYocj09PXBsLk5PTkUpcmV0dXJuIG51bGw7aWYodGhpcy5fbGFiZWwuZ2V0TG9jYXRpb24obik9PT1wbC5OT05FKXJldHVybiB0aGlzLl9sYWJlbC5zZXRMb2NhdGlvbihuLHIpLG51bGx9fSxGaC5wcm90b3R5cGUuc2V0U2hlbGw9ZnVuY3Rpb24odCl7dGhpcy5fc2hlbGw9dCxudWxsIT09dCYmdC5hZGRIb2xlKHRoaXMpfSxGaC5wcm90b3R5cGUudG9Qb2x5Z29uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodGhpcy5faG9sZXMuc2l6ZSgpKS5maWxsKG51bGwpLG49MDtuPHRoaXMuX2hvbGVzLnNpemUoKTtuKyspZVtuXT10aGlzLl9ob2xlcy5nZXQobikuZ2V0TGluZWFyUmluZygpO3JldHVybiB0LmNyZWF0ZVBvbHlnb24odGhpcy5nZXRMaW5lYXJSaW5nKCksZSl9LEZoLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxGaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRmh9O3ZhciBraD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnNldEVkZ2VSaW5nPWZ1bmN0aW9uKHQsZSl7dC5zZXRNaW5FZGdlUmluZyhlKX0sZS5wcm90b3R5cGUuZ2V0TmV4dD1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXROZXh0TWluKCl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KEZoKSxHaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmJ1aWxkTWluaW1hbFJpbmdzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGxjLGU9dGhpcy5fc3RhcnREZTtkb3tpZihudWxsPT09ZS5nZXRNaW5FZGdlUmluZygpKXt2YXIgbj1uZXcga2goZSx0aGlzLl9nZW9tZXRyeUZhY3RvcnkpO3QuYWRkKG4pfWU9ZS5nZXROZXh0KCl9d2hpbGUoZSE9PXRoaXMuX3N0YXJ0RGUpO3JldHVybiB0fSxlLnByb3RvdHlwZS5zZXRFZGdlUmluZz1mdW5jdGlvbih0LGUpe3Quc2V0RWRnZVJpbmcoZSl9LGUucHJvdG90eXBlLmxpbmtEaXJlY3RlZEVkZ2VzRm9yTWluaW1hbEVkZ2VSaW5ncz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3N0YXJ0RGU7ZG97dC5nZXROb2RlKCkuZ2V0RWRnZXMoKS5saW5rTWluaW1hbERpcmVjdGVkRWRnZXModGhpcyksdD10LmdldE5leHQoKX13aGlsZSh0IT09dGhpcy5fc3RhcnREZSl9LGUucHJvdG90eXBlLmdldE5leHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TmV4dCgpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShGaCkscWg9ZnVuY3Rpb24oKXtpZih0aGlzLl9sYWJlbD1udWxsLHRoaXMuX2lzSW5SZXN1bHQ9ITEsdGhpcy5faXNDb3ZlcmVkPSExLHRoaXMuX2lzQ292ZXJlZFNldD0hMSx0aGlzLl9pc1Zpc2l0ZWQ9ITEsMD09PWFyZ3VtZW50cy5sZW5ndGgpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9sYWJlbD10fX07cWgucHJvdG90eXBlLnNldFZpc2l0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNWaXNpdGVkPXR9LHFoLnByb3RvdHlwZS5zZXRJblJlc3VsdD1mdW5jdGlvbih0KXt0aGlzLl9pc0luUmVzdWx0PXR9LHFoLnByb3RvdHlwZS5pc0NvdmVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNDb3ZlcmVkfSxxaC5wcm90b3R5cGUuaXNDb3ZlcmVkU2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQ292ZXJlZFNldH0scWgucHJvdG90eXBlLnNldExhYmVsPWZ1bmN0aW9uKHQpe3RoaXMuX2xhYmVsPXR9LHFoLnByb3RvdHlwZS5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0scWgucHJvdG90eXBlLnNldENvdmVyZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNDb3ZlcmVkPXQsdGhpcy5faXNDb3ZlcmVkU2V0PSEwfSxxaC5wcm90b3R5cGUudXBkYXRlSU09ZnVuY3Rpb24odCl7cWwuaXNUcnVlKHRoaXMuX2xhYmVsLmdldEdlb21ldHJ5Q291bnQoKT49MiwiZm91bmQgcGFydGlhbCBsYWJlbCIpLHRoaXMuY29tcHV0ZUlNKHQpfSxxaC5wcm90b3R5cGUuaXNJblJlc3VsdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0luUmVzdWx0fSxxaC5wcm90b3R5cGUuaXNWaXNpdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmlzaXRlZH0scWgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHFoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxaH07dmFyIEJoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5fY29vcmQ9bnVsbCx0aGlzLl9lZGdlcz1udWxsO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9jb29yZD1lLHRoaXMuX2VkZ2VzPW4sdGhpcy5fbGFiZWw9bmV3IERoKDAscGwuTk9ORSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzSW5jaWRlbnRFZGdlSW5SZXN1bHQ9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5nZXRFZGdlcygpLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe2lmKHQubmV4dCgpLmdldEVkZ2UoKS5pc0luUmVzdWx0KCkpcmV0dXJuITB9cmV0dXJuITF9LGUucHJvdG90eXBlLmlzSXNvbGF0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMuX2xhYmVsLmdldEdlb21ldHJ5Q291bnQoKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZH0sZS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludGxuKCJub2RlICIrdGhpcy5fY29vcmQrIiBsYmw6ICIrdGhpcy5fbGFiZWwpfSxlLnByb3RvdHlwZS5jb21wdXRlSU09ZnVuY3Rpb24odCl7fSxlLnByb3RvdHlwZS5jb21wdXRlTWVyZ2VkTG9jYXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj1wbC5OT05FO2lmKG49dGhpcy5fbGFiZWwuZ2V0TG9jYXRpb24oZSksIXQuaXNOdWxsKGUpKXt2YXIgcj10LmdldExvY2F0aW9uKGUpO24hPT1wbC5CT1VOREFSWSYmKG49cil9cmV0dXJuIG59LGUucHJvdG90eXBlLnNldExhYmVsPWZ1bmN0aW9uKCl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQucHJvdG90eXBlLnNldExhYmVsLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07bnVsbD09PXRoaXMuX2xhYmVsP3RoaXMuX2xhYmVsPW5ldyBEaChlLG4pOnRoaXMuX2xhYmVsLnNldExvY2F0aW9uKGUsbil9LGUucHJvdG90eXBlLmdldEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzfSxlLnByb3RvdHlwZS5tZXJnZUxhYmVsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGUpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLm1lcmdlTGFiZWwobi5fbGFiZWwpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBEaClmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9MDtpPDI7aSsrKXt2YXIgbz10LmNvbXB1dGVNZXJnZWRMb2NhdGlvbihyLGkpLHM9dC5fbGFiZWwuZ2V0TG9jYXRpb24oaSk7cz09PXBsLk5PTkUmJnQuX2xhYmVsLnNldExvY2F0aW9uKGksbyl9fSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5fZWRnZXMuaW5zZXJ0KHQpLHQuc2V0Tm9kZSh0aGlzKX0sZS5wcm90b3R5cGUuc2V0TGFiZWxCb3VuZGFyeT1mdW5jdGlvbih0KXtpZihudWxsPT09dGhpcy5fbGFiZWwpcmV0dXJuIG51bGw7dmFyIGU9cGwuTk9ORTtudWxsIT09dGhpcy5fbGFiZWwmJihlPXRoaXMuX2xhYmVsLmdldExvY2F0aW9uKHQpKTt2YXIgbj1udWxsO3N3aXRjaChlKXtjYXNlIHBsLkJPVU5EQVJZOm49cGwuSU5URVJJT1I7YnJlYWs7Y2FzZSBwbC5JTlRFUklPUjpkZWZhdWx0Om49cGwuQk9VTkRBUll9dGhpcy5fbGFiZWwuc2V0TG9jYXRpb24odCxuKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0ocWgpLHpoPWZ1bmN0aW9uKCl7dGhpcy5ub2RlTWFwPW5ldyBDYyx0aGlzLm5vZGVGYWN0PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMubm9kZUZhY3Q9dH07emgucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubm9kZU1hcC5nZXQodCl9LHpoLnByb3RvdHlwZS5hZGROb2RlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB1bCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dGhpcy5ub2RlTWFwLmdldCh0KTtyZXR1cm4gbnVsbD09PWUmJihlPXRoaXMubm9kZUZhY3QuY3JlYXRlTm9kZSh0KSx0aGlzLm5vZGVNYXAucHV0KHQsZSkpLGV9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBCaCl7dmFyIG49YXJndW1lbnRzWzBdLHI9dGhpcy5ub2RlTWFwLmdldChuLmdldENvb3JkaW5hdGUoKSk7cmV0dXJuIG51bGw9PT1yPyh0aGlzLm5vZGVNYXAucHV0KG4uZ2V0Q29vcmRpbmF0ZSgpLG4pLG4pOihyLm1lcmdlTGFiZWwobikscil9fSx6aC5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLnByaW50KHQpfX0semgucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpfSx6aC5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZU1hcC52YWx1ZXMoKX0semgucHJvdG90eXBlLmdldEJvdW5kYXJ5Tm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBsYyxuPXRoaXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3IuZ2V0TGFiZWwoKS5nZXRMb2NhdGlvbih0KT09PXBsLkJPVU5EQVJZJiZlLmFkZChyKX1yZXR1cm4gZX0semgucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZT10LmdldENvb3JkaW5hdGUoKTt0aGlzLmFkZE5vZGUoZSkuYWRkKHQpfSx6aC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0semgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHpofTt2YXIgamg9ZnVuY3Rpb24oKXt9LFVoPXtORTp7Y29uZmlndXJhYmxlOiEwfSxOVzp7Y29uZmlndXJhYmxlOiEwfSxTVzp7Y29uZmlndXJhYmxlOiEwfSxTRTp7Y29uZmlndXJhYmxlOiEwfX07amgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGpoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBqaH0samguaXNOb3J0aGVybj1mdW5jdGlvbih0KXtyZXR1cm4gdD09PWpoLk5FfHx0PT09amguTld9LGpoLmlzT3Bwb3NpdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCE9PWUmJjI9PT0odC1lKzQpJTR9LGpoLmNvbW1vbkhhbGZQbGFuZT1mdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiB0O2lmKDI9PT0odC1lKzQpJTQpcmV0dXJuLTE7dmFyIG49dDxlP3Q6ZTtyZXR1cm4gMD09PW4mJjM9PT0odD5lP3Q6ZSk/MzpufSxqaC5pc0luSGFsZlBsYW5lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9PT1qaC5TRT90PT09amguU0V8fHQ9PT1qaC5TVzp0PT09ZXx8dD09PWUrMX0samgucXVhZHJhbnQ9ZnVuY3Rpb24oKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZigwPT09dCYmMD09PWUpdGhyb3cgbmV3IGVsKCJDYW5ub3QgY29tcHV0ZSB0aGUgcXVhZHJhbnQgZm9yIHBvaW50ICggIit0KyIsICIrZSsiICkiKTtyZXR1cm4gdD49MD9lPj0wP2poLk5FOmpoLlNFOmU+PTA/amguTlc6amguU1d9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB1bCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB1bCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO2lmKHIueD09PW4ueCYmci55PT09bi55KXRocm93IG5ldyBlbCgiQ2Fubm90IGNvbXB1dGUgdGhlIHF1YWRyYW50IGZvciB0d28gaWRlbnRpY2FsIHBvaW50cyAiK24pO3JldHVybiByLng+PW4ueD9yLnk+PW4ueT9qaC5ORTpqaC5TRTpyLnk+PW4ueT9qaC5OVzpqaC5TV319LFVoLk5FLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxVaC5OVy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sVWguU1cuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LFVoLlNFLmdldD1mdW5jdGlvbigpe3JldHVybiAzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhqaCxVaCk7dmFyIFZoPWZ1bmN0aW9uKCl7aWYodGhpcy5fZWRnZT1udWxsLHRoaXMuX2xhYmVsPW51bGwsdGhpcy5fbm9kZT1udWxsLHRoaXMuX3AwPW51bGwsdGhpcy5fcDE9bnVsbCx0aGlzLl9keD1udWxsLHRoaXMuX2R5PW51bGwsdGhpcy5fcXVhZHJhbnQ9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2VkZ2U9dH1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl0saT1udWxsO3RoaXMuX2VkZ2U9ZSx0aGlzLmluaXQobixyKSx0aGlzLl9sYWJlbD1pfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXSx1PWFyZ3VtZW50c1szXTt0aGlzLl9lZGdlPW8sdGhpcy5pbml0KHMsYSksdGhpcy5fbGFiZWw9dX19O1ZoLnByb3RvdHlwZS5jb21wYXJlRGlyZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9keD09PXQuX2R4JiZ0aGlzLl9keT09PXQuX2R5PzA6dGhpcy5fcXVhZHJhbnQ+dC5fcXVhZHJhbnQ/MTp0aGlzLl9xdWFkcmFudDx0Ll9xdWFkcmFudD8tMTpYbC5jb21wdXRlT3JpZW50YXRpb24odC5fcDAsdC5fcDEsdGhpcy5fcDEpfSxWaC5wcm90b3R5cGUuZ2V0RHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHl9LFZoLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3AwfSxWaC5wcm90b3R5cGUuc2V0Tm9kZT1mdW5jdGlvbih0KXt0aGlzLl9ub2RlPXR9LFZoLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt2YXIgZT1NYXRoLmF0YW4yKHRoaXMuX2R5LHRoaXMuX2R4KSxuPXRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkscj1uLmxhc3RJbmRleE9mKCIuIiksaT1uLnN1YnN0cmluZyhyKzEpO3QucHJpbnQoIiAgIitpKyI6ICIrdGhpcy5fcDArIiAtICIrdGhpcy5fcDErIiAiK3RoaXMuX3F1YWRyYW50KyI6IitlKyIgICAiK3RoaXMuX2xhYmVsKX0sVmgucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLmNvbXBhcmVEaXJlY3Rpb24oZSl9LFZoLnByb3RvdHlwZS5nZXREaXJlY3RlZENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcDF9LFZoLnByb3RvdHlwZS5nZXREeD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9keH0sVmgucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxWaC5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlfSxWaC5wcm90b3R5cGUuZ2V0UXVhZHJhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcXVhZHJhbnR9LFZoLnByb3RvdHlwZS5nZXROb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGV9LFZoLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PU1hdGguYXRhbjIodGhpcy5fZHksdGhpcy5fZHgpLGU9dGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSxuPWUubGFzdEluZGV4T2YoIi4iKTtyZXR1cm4iICAiK2Uuc3Vic3RyaW5nKG4rMSkrIjogIit0aGlzLl9wMCsiIC0gIit0aGlzLl9wMSsiICIrdGhpcy5fcXVhZHJhbnQrIjoiK3QrIiAgICIrdGhpcy5fbGFiZWx9LFZoLnByb3RvdHlwZS5jb21wdXRlTGFiZWw9ZnVuY3Rpb24odCl7fSxWaC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUpe3RoaXMuX3AwPXQsdGhpcy5fcDE9ZSx0aGlzLl9keD1lLngtdC54LHRoaXMuX2R5PWUueS10LnksdGhpcy5fcXVhZHJhbnQ9amgucXVhZHJhbnQodGhpcy5fZHgsdGhpcy5fZHkpLHFsLmlzVHJ1ZSghKDA9PT10aGlzLl9keCYmMD09PXRoaXMuX2R5KSwiRWRnZUVuZCB3aXRoIGlkZW50aWNhbCBlbmRwb2ludHMgZm91bmQiKX0sVmgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2lsXX0sVmgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFZofTt2YXIgWGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0LmNhbGwodGhpcyxlKSx0aGlzLl9pc0ZvcndhcmQ9bnVsbCx0aGlzLl9pc0luUmVzdWx0PSExLHRoaXMuX2lzVmlzaXRlZD0hMSx0aGlzLl9zeW09bnVsbCx0aGlzLl9uZXh0PW51bGwsdGhpcy5fbmV4dE1pbj1udWxsLHRoaXMuX2VkZ2VSaW5nPW51bGwsdGhpcy5fbWluRWRnZVJpbmc9bnVsbCx0aGlzLl9kZXB0aD1bMCwtOTk5LC05OTldLHRoaXMuX2lzRm9yd2FyZD1uLG4pdGhpcy5pbml0KGUuZ2V0Q29vcmRpbmF0ZSgwKSxlLmdldENvb3JkaW5hdGUoMSkpO2Vsc2V7dmFyIHI9ZS5nZXROdW1Qb2ludHMoKS0xO3RoaXMuaW5pdChlLmdldENvb3JkaW5hdGUociksZS5nZXRDb29yZGluYXRlKHItMSkpfXRoaXMuY29tcHV0ZURpcmVjdGVkTGFiZWwoKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0TmV4dE1pbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9uZXh0TWlufSxlLnByb3RvdHlwZS5nZXREZXB0aD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGVwdGhbdF19LGUucHJvdG90eXBlLnNldFZpc2l0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNWaXNpdGVkPXR9LGUucHJvdG90eXBlLmNvbXB1dGVEaXJlY3RlZExhYmVsPWZ1bmN0aW9uKCl7dGhpcy5fbGFiZWw9bmV3IERoKHRoaXMuX2VkZ2UuZ2V0TGFiZWwoKSksdGhpcy5faXNGb3J3YXJkfHx0aGlzLl9sYWJlbC5mbGlwKCl9LGUucHJvdG90eXBlLmdldE5leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV4dH0sZS5wcm90b3R5cGUuc2V0RGVwdGg9ZnVuY3Rpb24odCxlKXtpZigtOTk5IT09dGhpcy5fZGVwdGhbdF0mJnRoaXMuX2RlcHRoW3RdIT09ZSl0aHJvdyBuZXcgT2goImFzc2lnbmVkIGRlcHRocyBkbyBub3QgbWF0Y2giLHRoaXMuZ2V0Q29vcmRpbmF0ZSgpKTt0aGlzLl9kZXB0aFt0XT1lfSxlLnByb3RvdHlwZS5pc0ludGVyaW9yQXJlYUVkZ2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPSEwLG49MDtuPDI7bisrKXQuX2xhYmVsLmlzQXJlYShuKSYmdC5fbGFiZWwuZ2V0TG9jYXRpb24obixTaC5MRUZUKT09PXBsLklOVEVSSU9SJiZ0Ll9sYWJlbC5nZXRMb2NhdGlvbihuLFNoLlJJR0hUKT09PXBsLklOVEVSSU9SfHwoZT0hMSk7cmV0dXJuIGV9LGUucHJvdG90eXBlLnNldE5leHRNaW49ZnVuY3Rpb24odCl7dGhpcy5fbmV4dE1pbj10fSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5wcmludC5jYWxsKHRoaXMsZSksZS5wcmludCgiICIrdGhpcy5fZGVwdGhbU2guTEVGVF0rIi8iK3RoaXMuX2RlcHRoW1NoLlJJR0hUXSksZS5wcmludCgiICgiK3RoaXMuZ2V0RGVwdGhEZWx0YSgpKyIpIiksdGhpcy5faXNJblJlc3VsdCYmZS5wcmludCgiIGluUmVzdWx0Iil9LGUucHJvdG90eXBlLnNldE1pbkVkZ2VSaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX21pbkVkZ2VSaW5nPXR9LGUucHJvdG90eXBlLmlzTGluZUVkZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9sYWJlbC5pc0xpbmUoMCl8fHRoaXMuX2xhYmVsLmlzTGluZSgxKSxlPSF0aGlzLl9sYWJlbC5pc0FyZWEoMCl8fHRoaXMuX2xhYmVsLmFsbFBvc2l0aW9uc0VxdWFsKDAscGwuRVhURVJJT1IpLG49IXRoaXMuX2xhYmVsLmlzQXJlYSgxKXx8dGhpcy5fbGFiZWwuYWxsUG9zaXRpb25zRXF1YWwoMSxwbC5FWFRFUklPUik7cmV0dXJuIHQmJmUmJm59LGUucHJvdG90eXBlLnNldEVkZ2VSaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX2VkZ2VSaW5nPXR9LGUucHJvdG90eXBlLmdldE1pbkVkZ2VSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbkVkZ2VSaW5nfSxlLnByb3RvdHlwZS5nZXREZXB0aERlbHRhPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWRnZS5nZXREZXB0aERlbHRhKCk7cmV0dXJuIHRoaXMuX2lzRm9yd2FyZHx8KHQ9LXQpLHR9LGUucHJvdG90eXBlLnNldEluUmVzdWx0PWZ1bmN0aW9uKHQpe3RoaXMuX2lzSW5SZXN1bHQ9dH0sZS5wcm90b3R5cGUuZ2V0U3ltPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N5bX0sZS5wcm90b3R5cGUuaXNGb3J3YXJkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRm9yd2FyZH0sZS5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlfSxlLnByb3RvdHlwZS5wcmludEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5wcmludCh0KSx0LnByaW50KCIgIiksdGhpcy5faXNGb3J3YXJkP3RoaXMuX2VkZ2UucHJpbnQodCk6dGhpcy5fZWRnZS5wcmludFJldmVyc2UodCl9LGUucHJvdG90eXBlLnNldFN5bT1mdW5jdGlvbih0KXt0aGlzLl9zeW09dH0sZS5wcm90b3R5cGUuc2V0VmlzaXRlZEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5zZXRWaXNpdGVkKHQpLHRoaXMuX3N5bS5zZXRWaXNpdGVkKHQpfSxlLnByb3RvdHlwZS5zZXRFZGdlRGVwdGhzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRFZGdlKCkuZ2V0RGVwdGhEZWx0YSgpO3RoaXMuX2lzRm9yd2FyZHx8KG49LW4pO3ZhciByPTE7dD09PVNoLkxFRlQmJihyPS0xKTt2YXIgaT1TaC5vcHBvc2l0ZSh0KSxvPWUrbipyO3RoaXMuc2V0RGVwdGgodCxlKSx0aGlzLnNldERlcHRoKGksbyl9LGUucHJvdG90eXBlLmdldEVkZ2VSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VSaW5nfSxlLnByb3RvdHlwZS5pc0luUmVzdWx0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSW5SZXN1bHR9LGUucHJvdG90eXBlLnNldE5leHQ9ZnVuY3Rpb24odCl7dGhpcy5fbmV4dD10fSxlLnByb3RvdHlwZS5pc1Zpc2l0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWaXNpdGVkfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLmRlcHRoRmFjdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1wbC5FWFRFUklPUiYmZT09PXBsLklOVEVSSU9SPzE6dD09PXBsLklOVEVSSU9SJiZlPT09cGwuRVhURVJJT1I/LTE6MH0sZX0oVmgpLFloPWZ1bmN0aW9uKCl7fTtZaC5wcm90b3R5cGUuY3JlYXRlTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEJoKHQsbnVsbCl9LFloLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxZaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWWh9O3ZhciBIaD1mdW5jdGlvbigpe2lmKHRoaXMuX2VkZ2VzPW5ldyBsYyx0aGlzLl9ub2Rlcz1udWxsLHRoaXMuX2VkZ2VFbmRMaXN0PW5ldyBsYywwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLl9ub2Rlcz1uZXcgemgobmV3IFloKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbm9kZXM9bmV3IHpoKHQpfX07SGgucHJvdG90eXBlLnByaW50RWRnZXM9ZnVuY3Rpb24odCl7dC5wcmludGxuKCJFZGdlczoiKTtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2VzLnNpemUoKTtlKyspe3QucHJpbnRsbigiZWRnZSAiK2UrIjoiKTt2YXIgbj10aGlzLl9lZGdlcy5nZXQoZSk7bi5wcmludCh0KSxuLmVpTGlzdC5wcmludCh0KX19LEhoLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ub2Rlcy5maW5kKHQpfSxIaC5wcm90b3R5cGUuYWRkTm9kZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQmgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fbm9kZXMuYWRkTm9kZSh0KX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX25vZGVzLmFkZE5vZGUoZSl9fSxIaC5wcm90b3R5cGUuZ2V0Tm9kZUl0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzLml0ZXJhdG9yKCl9LEhoLnByb3RvdHlwZS5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ub2Rlcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcygpfX0sSGgucHJvdG90eXBlLmRlYnVnUHJpbnRsbj1mdW5jdGlvbih0KXtQbC5vdXQucHJpbnRsbih0KX0sSGgucHJvdG90eXBlLmlzQm91bmRhcnlOb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZXMuZmluZChlKTtpZihudWxsPT09bilyZXR1cm4hMTt2YXIgcj1uLmdldExhYmVsKCk7cmV0dXJuIG51bGwhPT1yJiZyLmdldExvY2F0aW9uKHQpPT09cGwuQk9VTkRBUll9LEhoLnByb3RvdHlwZS5saW5rQWxsRGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ub2Rlcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5saW5rQWxsRGlyZWN0ZWRFZGdlcygpfX0sSGgucHJvdG90eXBlLm1hdGNoSW5TYW1lRGlyZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiEhdC5lcXVhbHMobikmJihYbC5jb21wdXRlT3JpZW50YXRpb24odCxlLHIpPT09WGwuQ09MTElORUFSJiZqaC5xdWFkcmFudCh0LGUpPT09amgucXVhZHJhbnQobixyKSl9LEhoLnByb3RvdHlwZS5nZXRFZGdlRW5kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlRW5kTGlzdH0sSGgucHJvdG90eXBlLmRlYnVnUHJpbnQ9ZnVuY3Rpb24odCl7UGwub3V0LnByaW50KHQpfSxIaC5wcm90b3R5cGUuZ2V0RWRnZUl0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzLml0ZXJhdG9yKCl9LEhoLnByb3RvdHlwZS5maW5kRWRnZUluU2FtZURpcmVjdGlvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLHI9MDtyPHRoaXMuX2VkZ2VzLnNpemUoKTtyKyspe3ZhciBpPW4uX2VkZ2VzLmdldChyKSxvPWkuZ2V0Q29vcmRpbmF0ZXMoKTtpZihuLm1hdGNoSW5TYW1lRGlyZWN0aW9uKHQsZSxvWzBdLG9bMV0pKXJldHVybiBpO2lmKG4ubWF0Y2hJblNhbWVEaXJlY3Rpb24odCxlLG9bby5sZW5ndGgtMV0sb1tvLmxlbmd0aC0yXSkpcmV0dXJuIGl9cmV0dXJuIG51bGx9LEhoLnByb3RvdHlwZS5pbnNlcnRFZGdlPWZ1bmN0aW9uKHQpe3RoaXMuX2VkZ2VzLmFkZCh0KX0sSGgucHJvdG90eXBlLmZpbmRFZGdlRW5kPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO2lmKG4uZ2V0RWRnZSgpPT09dClyZXR1cm4gbn1yZXR1cm4gbnVsbH0sSGgucHJvdG90eXBlLmFkZEVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ZS5fZWRnZXMuYWRkKHIpO3ZhciBpPW5ldyBYaChyLCEwKSxvPW5ldyBYaChyLCExKTtpLnNldFN5bShvKSxvLnNldFN5bShpKSxlLmFkZChpKSxlLmFkZChvKX19LEhoLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5fbm9kZXMuYWRkKHQpLHRoaXMuX2VkZ2VFbmRMaXN0LmFkZCh0KX0sSGgucHJvdG90eXBlLmdldE5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzLnZhbHVlcygpfSxIaC5wcm90b3R5cGUuZmluZEVkZ2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHRoaXMuX2VkZ2VzLnNpemUoKTtuKyspe3ZhciByPXRoaXMuX2VkZ2VzLmdldChuKSxpPXIuZ2V0Q29vcmRpbmF0ZXMoKTtpZih0LmVxdWFscyhpWzBdKSYmZS5lcXVhbHMoaVsxXSkpcmV0dXJuIHJ9cmV0dXJuIG51bGx9LEhoLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxIaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSGh9LEhoLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5nZXRFZGdlcygpLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzKCl9fTt2YXIgV2g9ZnVuY3Rpb24oKXt0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9bnVsbCx0aGlzLl9zaGVsbExpc3Q9bmV3IGxjO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9dH07V2gucHJvdG90eXBlLnNvcnRTaGVsbHNBbmRIb2xlcz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXQuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2kuaXNIb2xlKCk/bi5hZGQoaSk6ZS5hZGQoaSl9fSxXaC5wcm90b3R5cGUuY29tcHV0ZVBvbHlnb25zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgbGMsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKS50b1BvbHlnb24odGhpcy5fZ2VvbWV0cnlGYWN0b3J5KTtlLmFkZChyKX1yZXR1cm4gZX0sV2gucHJvdG90eXBlLnBsYWNlRnJlZUhvbGVzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2lmKG51bGw9PT1yLmdldFNoZWxsKCkpe3ZhciBpPXRoaXMuZmluZEVkZ2VSaW5nQ29udGFpbmluZyhyLHQpO2lmKG51bGw9PT1pKXRocm93IG5ldyBPaCgidW5hYmxlIHRvIGFzc2lnbiBob2xlIHRvIGEgc2hlbGwiLHIuZ2V0Q29vcmRpbmF0ZSgwKSk7ci5zZXRTaGVsbChpKX19fSxXaC5wcm90b3R5cGUuYnVpbGRNaW5pbWFsRWRnZVJpbmdzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bmV3IGxjLGk9dC5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCk7aWYoby5nZXRNYXhOb2RlRGVncmVlKCk+Mil7by5saW5rRGlyZWN0ZWRFZGdlc0Zvck1pbmltYWxFZGdlUmluZ3MoKTt2YXIgcz1vLmJ1aWxkTWluaW1hbFJpbmdzKCksYT10aGlzLmZpbmRTaGVsbChzKTtudWxsIT09YT8odGhpcy5wbGFjZVBvbHlnb25Ib2xlcyhhLHMpLGUuYWRkKGEpKTpuLmFkZEFsbChzKX1lbHNlIHIuYWRkKG8pfXJldHVybiByfSxXaC5wcm90b3R5cGUuY29udGFpbnNQb2ludD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fc2hlbGxMaXN0Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtpZihlLm5leHQoKS5jb250YWluc1BvaW50KHQpKXJldHVybiEwfXJldHVybiExfSxXaC5wcm90b3R5cGUuYnVpbGRNYXhpbWFsRWRnZVJpbmdzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgbGMsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihyLmlzSW5SZXN1bHQoKSYmci5nZXRMYWJlbCgpLmlzQXJlYSgpJiZudWxsPT09ci5nZXRFZGdlUmluZygpKXt2YXIgaT1uZXcgR2gocix0aGlzLl9nZW9tZXRyeUZhY3RvcnkpO2UuYWRkKGkpLGkuc2V0SW5SZXN1bHQoKX19cmV0dXJuIGV9LFdoLnByb3RvdHlwZS5wbGFjZVBvbHlnb25Ib2xlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtyLmlzSG9sZSgpJiZyLnNldFNoZWxsKHQpfX0sV2gucHJvdG90eXBlLmdldFBvbHlnb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZVBvbHlnb25zKHRoaXMuX3NoZWxsTGlzdCl9LFdoLnByb3RvdHlwZS5maW5kRWRnZVJpbmdDb250YWluaW5nPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2V0TGluZWFyUmluZygpLHI9bi5nZXRFbnZlbG9wZUludGVybmFsKCksaT1uLmdldENvb3JkaW5hdGVOKDApLG89bnVsbCxzPW51bGwsYT1lLml0ZXJhdG9yKCk7YS5oYXNOZXh0KCk7KXt2YXIgdT1hLm5leHQoKSxsPXUuZ2V0TGluZWFyUmluZygpLGM9bC5nZXRFbnZlbG9wZUludGVybmFsKCk7bnVsbCE9PW8mJihzPW8uZ2V0TGluZWFyUmluZygpLmdldEVudmVsb3BlSW50ZXJuYWwoKSk7dmFyIGg9ITE7Yy5jb250YWlucyhyKSYmWGwuaXNQb2ludEluUmluZyhpLGwuZ2V0Q29vcmRpbmF0ZXMoKSkmJihoPSEwKSxoJiYobnVsbD09PW98fHMuY29udGFpbnMoYykpJiYobz11KX1yZXR1cm4gb30sV2gucHJvdG90eXBlLmZpbmRTaGVsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPW51bGwscj10Lml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtpLmlzSG9sZSgpfHwobj1pLGUrKyl9cmV0dXJuIHFsLmlzVHJ1ZShlPD0xLCJmb3VuZCB0d28gc2hlbGxzIGluIE1pbmltYWxFZGdlUmluZyBsaXN0Iiksbn0sV2gucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5hZGQodC5nZXRFZGdlRW5kcygpLHQuZ2V0Tm9kZXMoKSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO0hoLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzKG4pO3ZhciByPXRoaXMuYnVpbGRNYXhpbWFsRWRnZVJpbmdzKGUpLGk9bmV3IGxjLG89dGhpcy5idWlsZE1pbmltYWxFZGdlUmluZ3Mocix0aGlzLl9zaGVsbExpc3QsaSk7dGhpcy5zb3J0U2hlbGxzQW5kSG9sZXMobyx0aGlzLl9zaGVsbExpc3QsaSksdGhpcy5wbGFjZUZyZWVIb2xlcyh0aGlzLl9zaGVsbExpc3QsaSl9fSxXaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sV2gucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFdofTt2YXIgSmg9ZnVuY3Rpb24oKXt9O0poLnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oKXt9LEpoLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxKaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSmh9O3ZhciBaaD1mdW5jdGlvbigpe3RoaXMuX2JvdW5kcz1udWxsLHRoaXMuX2l0ZW09bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fYm91bmRzPXQsdGhpcy5faXRlbT1lfTtaaC5wcm90b3R5cGUuZ2V0SXRlbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pdGVtfSxaaC5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JvdW5kc30sWmgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0poLGFsXX0sWmgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFpofTt2YXIgS2g9ZnVuY3Rpb24oKXt0aGlzLl9zaXplPW51bGwsdGhpcy5faXRlbXM9bnVsbCx0aGlzLl9zaXplPTAsdGhpcy5faXRlbXM9bmV3IGxjLHRoaXMuX2l0ZW1zLmFkZChudWxsKX07S2gucHJvdG90eXBlLnBvbGw9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt2YXIgdD10aGlzLl9pdGVtcy5nZXQoMSk7cmV0dXJuIHRoaXMuX2l0ZW1zLnNldCgxLHRoaXMuX2l0ZW1zLmdldCh0aGlzLl9zaXplKSksdGhpcy5fc2l6ZS09MSx0aGlzLnJlb3JkZXIoMSksdH0sS2gucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZX0sS2gucHJvdG90eXBlLnJlb3JkZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj1udWxsLHI9dGhpcy5faXRlbXMuZ2V0KHQpOzIqdDw9dGhpcy5fc2l6ZSYmKChuPTIqdCkhPT1lLl9zaXplJiZlLl9pdGVtcy5nZXQobisxKS5jb21wYXJlVG8oZS5faXRlbXMuZ2V0KG4pKTwwJiZuKyssZS5faXRlbXMuZ2V0KG4pLmNvbXBhcmVUbyhyKTwwKTt0PW4pZS5faXRlbXMuc2V0KHQsZS5faXRlbXMuZ2V0KG4pKTt0aGlzLl9pdGVtcy5zZXQodCxyKX0sS2gucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fc2l6ZT0wLHRoaXMuX2l0ZW1zLmNsZWFyKCl9LEtoLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9zaXplfSxLaC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuX2l0ZW1zLmFkZChudWxsKSx0aGlzLl9zaXplKz0xO3ZhciBlPXRoaXMuX3NpemU7Zm9yKHRoaXMuX2l0ZW1zLnNldCgwLHQpO3QuY29tcGFyZVRvKHRoaXMuX2l0ZW1zLmdldChNYXRoLnRydW5jKGUvMikpKTwwO2UvPTIpdGhpcy5faXRlbXMuc2V0KGUsdGhpcy5faXRlbXMuZ2V0KE1hdGgudHJ1bmMoZS8yKSkpO3RoaXMuX2l0ZW1zLnNldChlLHQpfSxLaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sS2gucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEtofTt2YXIgUWg9ZnVuY3Rpb24oKXt9O1FoLnByb3RvdHlwZS52aXNpdEl0ZW09ZnVuY3Rpb24odCl7fSxRaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUWgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFFofTt2YXIgJGg9ZnVuY3Rpb24oKXt9OyRoLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlKXt9LCRoLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCxlKXt9LCRoLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbigpe30sJGgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LCRoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiAkaH07dmFyIHRwPWZ1bmN0aW9uKCl7aWYodGhpcy5fY2hpbGRCb3VuZGFibGVzPW5ldyBsYyx0aGlzLl9ib3VuZHM9bnVsbCx0aGlzLl9sZXZlbD1udWxsLDA9PT1hcmd1bWVudHMubGVuZ3RoKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbGV2ZWw9dH19LGVwPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTt0cC5wcm90b3R5cGUuZ2V0TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGV2ZWx9LHRwLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQm91bmRhYmxlcy5zaXplKCl9LHRwLnByb3RvdHlwZS5nZXRDaGlsZEJvdW5kYWJsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hpbGRCb3VuZGFibGVzfSx0cC5wcm90b3R5cGUuYWRkQ2hpbGRCb3VuZGFibGU9ZnVuY3Rpb24odCl7cWwuaXNUcnVlKG51bGw9PT10aGlzLl9ib3VuZHMpLHRoaXMuX2NoaWxkQm91bmRhYmxlcy5hZGQodCl9LHRwLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQm91bmRhYmxlcy5pc0VtcHR5KCl9LHRwLnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuX2JvdW5kcyYmKHRoaXMuX2JvdW5kcz10aGlzLmNvbXB1dGVCb3VuZHMoKSksdGhpcy5fYm91bmRzfSx0cC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bSmgsYWxdfSx0cC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdHB9LGVwLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NWExZTU1ZWM0MTM2OTgwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXModHAsZXApO3ZhciBucD1mdW5jdGlvbigpe307bnAucmV2ZXJzZU9yZGVyPWZ1bmN0aW9uKCl7cmV0dXJue2NvbXBhcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5jb21wYXJlVG8odCl9fX0sbnAubWluPWZ1bmN0aW9uKHQpe3JldHVybiBucC5zb3J0KHQpLHQuZ2V0KDApfSxucC5zb3J0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC50b0FycmF5KCk7ZT9SYy5zb3J0KG4sZSk6UmMuc29ydChuKTtmb3IodmFyIHI9dC5pdGVyYXRvcigpLGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspci5uZXh0KCksci5zZXQobltpXSl9LG5wLnNpbmdsZXRvbkxpc3Q9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGxjO3JldHVybiBlLmFkZCh0KSxlfTt2YXIgcnA9ZnVuY3Rpb24oKXt0aGlzLl9ib3VuZGFibGUxPW51bGwsdGhpcy5fYm91bmRhYmxlMj1udWxsLHRoaXMuX2Rpc3RhbmNlPW51bGwsdGhpcy5faXRlbURpc3RhbmNlPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX2JvdW5kYWJsZTE9dCx0aGlzLl9ib3VuZGFibGUyPWUsdGhpcy5faXRlbURpc3RhbmNlPW4sdGhpcy5fZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSgpfTtycC5wcm90b3R5cGUuZXhwYW5kVG9RdWV1ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXJwLmlzQ29tcG9zaXRlKHRoaXMuX2JvdW5kYWJsZTEpLHI9cnAuaXNDb21wb3NpdGUodGhpcy5fYm91bmRhYmxlMik7aWYobiYmcilyZXR1cm4gcnAuYXJlYSh0aGlzLl9ib3VuZGFibGUxKT5ycC5hcmVhKHRoaXMuX2JvdW5kYWJsZTIpPyh0aGlzLmV4cGFuZCh0aGlzLl9ib3VuZGFibGUxLHRoaXMuX2JvdW5kYWJsZTIsdCxlKSxudWxsKToodGhpcy5leHBhbmQodGhpcy5fYm91bmRhYmxlMix0aGlzLl9ib3VuZGFibGUxLHQsZSksbnVsbCk7aWYobilyZXR1cm4gdGhpcy5leHBhbmQodGhpcy5fYm91bmRhYmxlMSx0aGlzLl9ib3VuZGFibGUyLHQsZSksbnVsbDtpZihyKXJldHVybiB0aGlzLmV4cGFuZCh0aGlzLl9ib3VuZGFibGUyLHRoaXMuX2JvdW5kYWJsZTEsdCxlKSxudWxsO3Rocm93IG5ldyBlbCgibmVpdGhlciBib3VuZGFibGUgaXMgY29tcG9zaXRlIil9LHJwLnByb3RvdHlwZS5pc0xlYXZlcz1mdW5jdGlvbigpe3JldHVybiEocnAuaXNDb21wb3NpdGUodGhpcy5fYm91bmRhYmxlMSl8fHJwLmlzQ29tcG9zaXRlKHRoaXMuX2JvdW5kYWJsZTIpKX0scnAucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLl9kaXN0YW5jZTxlLl9kaXN0YW5jZT8tMTp0aGlzLl9kaXN0YW5jZT5lLl9kaXN0YW5jZT8xOjB9LHJwLnByb3RvdHlwZS5leHBhbmQ9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPXQuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpLHM9bmV3IHJwKG8sZSx0aGlzLl9pdGVtRGlzdGFuY2UpO3MuZ2V0RGlzdGFuY2UoKTxyJiZuLmFkZChzKX19LHJwLnByb3RvdHlwZS5nZXRCb3VuZGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10P3RoaXMuX2JvdW5kYWJsZTE6dGhpcy5fYm91bmRhYmxlMn0scnAucHJvdG90eXBlLmdldERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlfSxycC5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0xlYXZlcygpP3RoaXMuX2l0ZW1EaXN0YW5jZS5kaXN0YW5jZSh0aGlzLl9ib3VuZGFibGUxLHRoaXMuX2JvdW5kYWJsZTIpOnRoaXMuX2JvdW5kYWJsZTEuZ2V0Qm91bmRzKCkuZGlzdGFuY2UodGhpcy5fYm91bmRhYmxlMi5nZXRCb3VuZHMoKSl9LHJwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpbF19LHJwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBycH0scnAuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRCb3VuZHMoKS5nZXRBcmVhKCl9LHJwLmlzQ29tcG9zaXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdHB9O3ZhciBpcD1mdW5jdGlvbiB0KCl7aWYodGhpcy5fcm9vdD1udWxsLHRoaXMuX2J1aWx0PSExLHRoaXMuX2l0ZW1Cb3VuZGFibGVzPW5ldyBsYyx0aGlzLl9ub2RlQ2FwYWNpdHk9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9dC5ERUZBVUxUX05PREVfQ0FQQUNJVFk7dGhpcy5fbm9kZUNhcGFjaXR5PWV9ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO3FsLmlzVHJ1ZShuPjEsIk5vZGUgY2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMSIpLHRoaXMuX25vZGVDYXBhY2l0eT1ufX0sb3A9e0ludGVyc2VjdHNPcDp7Y29uZmlndXJhYmxlOiEwfSxzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfTk9ERV9DQVBBQ0lUWTp7Y29uZmlndXJhYmxlOiEwfX07aXAucHJvdG90eXBlLmdldE5vZGVDYXBhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlQ2FwYWNpdHl9LGlwLnByb3RvdHlwZS5sYXN0Tm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQodC5zaXplKCktMSl9LGlwLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5pc0VtcHR5KCk/MDoodGhpcy5idWlsZCgpLHRoaXMuc2l6ZSh0aGlzLl9yb290KSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj0wLHI9ZS5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7aSBpbnN0YW5jZW9mIHRwP24rPXQuc2l6ZShpKTppIGluc3RhbmNlb2YgWmgmJihuKz0xKX1yZXR1cm4gbn19LGlwLnByb3RvdHlwZS5yZW1vdmVJdGVtPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW51bGwscj10LmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtpIGluc3RhbmNlb2YgWmgmJmkuZ2V0SXRlbSgpPT09ZSYmKG49aSl9cmV0dXJuIG51bGwhPT1uJiYodC5nZXRDaGlsZEJvdW5kYWJsZXMoKS5yZW1vdmUobiksITApfSxpcC5wcm90b3R5cGUuaXRlbXNUcmVlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7dGhpcy5idWlsZCgpO3ZhciBlPXRoaXMuaXRlbXNUcmVlKHRoaXMuX3Jvb3QpO3JldHVybiBudWxsPT09ZT9uZXcgbGM6ZX1pZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBuPWFyZ3VtZW50c1swXSxyPW5ldyBsYyxpPW4uZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpO2lmKG8gaW5zdGFuY2VvZiB0cCl7dmFyIHM9dC5pdGVtc1RyZWUobyk7bnVsbCE9PXMmJnIuYWRkKHMpfWVsc2UgbyBpbnN0YW5jZW9mIFpoP3IuYWRkKG8uZ2V0SXRlbSgpKTpxbC5zaG91bGROZXZlclJlYWNoSGVyZSgpfXJldHVybiByLnNpemUoKTw9MD9udWxsOnJ9fSxpcC5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7cWwuaXNUcnVlKCF0aGlzLl9idWlsdCwiQ2Fubm90IGluc2VydCBpdGVtcyBpbnRvIGFuIFNUUiBwYWNrZWQgUi10cmVlIGFmdGVyIGl0IGhhcyBiZWVuIGJ1aWx0LiIpLHRoaXMuX2l0ZW1Cb3VuZGFibGVzLmFkZChuZXcgWmgodCxlKSl9LGlwLnByb3RvdHlwZS5ib3VuZGFibGVzQXRMZXZlbD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPW5ldyBsYztyZXR1cm4gdGhpcy5ib3VuZGFibGVzQXRMZXZlbChlLHRoaXMuX3Jvb3Qsbiksbn1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO2lmKHFsLmlzVHJ1ZShyPi0yKSxpLmdldExldmVsKCk9PT1yKXJldHVybiBvLmFkZChpKSxudWxsO2Zvcih2YXIgcz1pLmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7cy5oYXNOZXh0KCk7KXt2YXIgYT1zLm5leHQoKTthIGluc3RhbmNlb2YgdHA/dC5ib3VuZGFibGVzQXRMZXZlbChyLGEsbyk6KHFsLmlzVHJ1ZShhIGluc3RhbmNlb2YgWmgpLC0xPT09ciYmby5hZGQoYSkpfXJldHVybiBudWxsfX0saXAucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuYnVpbGQoKTt2YXIgbj1uZXcgbGM7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfHx0aGlzLmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHModGhpcy5fcm9vdC5nZXRCb3VuZHMoKSxlKSYmdGhpcy5xdWVyeShlLHRoaXMuX3Jvb3Qsbiksbn1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO2lmKHRoaXMuYnVpbGQoKSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt0aGlzLmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHModGhpcy5fcm9vdC5nZXRCb3VuZHMoKSxyKSYmdGhpcy5xdWVyeShyLHRoaXMuX3Jvb3QsaSl9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihnbChhcmd1bWVudHNbMl0sUWgpJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0cClmb3IodmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGE9YXJndW1lbnRzWzJdLHU9cy5nZXRDaGlsZEJvdW5kYWJsZXMoKSxsPTA7bDx1LnNpemUoKTtsKyspe3ZhciBjPXUuZ2V0KGwpO3QuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyhjLmdldEJvdW5kcygpLG8pJiYoYyBpbnN0YW5jZW9mIHRwP3QucXVlcnkobyxjLGEpOmMgaW5zdGFuY2VvZiBaaD9hLnZpc2l0SXRlbShjLmdldEl0ZW0oKSk6cWwuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoKSl9ZWxzZSBpZihnbChhcmd1bWVudHNbMl0sYWMpJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0cClmb3IodmFyIGg9YXJndW1lbnRzWzBdLHA9YXJndW1lbnRzWzFdLGY9YXJndW1lbnRzWzJdLGc9cC5nZXRDaGlsZEJvdW5kYWJsZXMoKSxkPTA7ZDxnLnNpemUoKTtkKyspe3ZhciB5PWcuZ2V0KGQpO3QuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyh5LmdldEJvdW5kcygpLGgpJiYoeSBpbnN0YW5jZW9mIHRwP3QucXVlcnkoaCx5LGYpOnkgaW5zdGFuY2VvZiBaaD9mLmFkZCh5LmdldEl0ZW0oKSk6cWwuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoKSl9fSxpcC5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9idWlsdClyZXR1cm4gbnVsbDt0aGlzLl9yb290PXRoaXMuX2l0ZW1Cb3VuZGFibGVzLmlzRW1wdHkoKT90aGlzLmNyZWF0ZU5vZGUoMCk6dGhpcy5jcmVhdGVIaWdoZXJMZXZlbHModGhpcy5faXRlbUJvdW5kYWJsZXMsLTEpLHRoaXMuX2l0ZW1Cb3VuZGFibGVzPW51bGwsdGhpcy5fYnVpbHQ9ITB9LGlwLnByb3RvdHlwZS5nZXRSb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnVpbGQoKSx0aGlzLl9yb290fSxpcC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmJ1aWxkKCksISF0aGlzLmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHModGhpcy5fcm9vdC5nZXRCb3VuZHMoKSxlKSYmdGhpcy5yZW1vdmUoZSx0aGlzLl9yb290LG4pfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl0scz10aGlzLnJlbW92ZUl0ZW0oaSxvKTtpZihzKXJldHVybiEwO2Zvcih2YXIgYT1udWxsLHU9aS5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO3UuaGFzTmV4dCgpOyl7dmFyIGw9dS5uZXh0KCk7aWYodC5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKGwuZ2V0Qm91bmRzKCkscikmJihsIGluc3RhbmNlb2YgdHAmJihzPXQucmVtb3ZlKHIsbCxvKSkpKXthPWw7YnJlYWt9fXJldHVybiBudWxsIT09YSYmYS5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pc0VtcHR5KCkmJmkuZ2V0Q2hpbGRCb3VuZGFibGVzKCkucmVtb3ZlKGEpLHN9fSxpcC5wcm90b3R5cGUuY3JlYXRlSGlnaGVyTGV2ZWxzPWZ1bmN0aW9uKHQsZSl7cWwuaXNUcnVlKCF0LmlzRW1wdHkoKSk7dmFyIG49dGhpcy5jcmVhdGVQYXJlbnRCb3VuZGFibGVzKHQsZSsxKTtyZXR1cm4gMT09PW4uc2l6ZSgpP24uZ2V0KDApOnRoaXMuY3JlYXRlSGlnaGVyTGV2ZWxzKG4sZSsxKX0saXAucHJvdG90eXBlLmRlcHRoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5pc0VtcHR5KCk/MDoodGhpcy5idWlsZCgpLHRoaXMuZGVwdGgodGhpcy5fcm9vdCkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MCxyPWUuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2lmKGkgaW5zdGFuY2VvZiB0cCl7dmFyIG89dC5kZXB0aChpKTtvPm4mJihuPW8pfX1yZXR1cm4gbisxfX0saXAucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3FsLmlzVHJ1ZSghdC5pc0VtcHR5KCkpO3ZhciByPW5ldyBsYztyLmFkZCh0aGlzLmNyZWF0ZU5vZGUoZSkpO3ZhciBpPW5ldyBsYyh0KTtucC5zb3J0KGksdGhpcy5nZXRDb21wYXJhdG9yKCkpO2Zvcih2YXIgbz1pLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKTtuLmxhc3ROb2RlKHIpLmdldENoaWxkQm91bmRhYmxlcygpLnNpemUoKT09PW4uZ2V0Tm9kZUNhcGFjaXR5KCkmJnIuYWRkKG4uY3JlYXRlTm9kZShlKSksbi5sYXN0Tm9kZShyKS5hZGRDaGlsZEJvdW5kYWJsZShzKX1yZXR1cm4gcn0saXAucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnVpbHQ/dGhpcy5fcm9vdC5pc0VtcHR5KCk6dGhpcy5faXRlbUJvdW5kYWJsZXMuaXNFbXB0eSgpfSxpcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bYWxdfSxpcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaXB9LGlwLmNvbXBhcmVEb3VibGVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+ZT8xOnQ8ZT8tMTowfSxvcC5JbnRlcnNlY3RzT3AuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHNwfSxvcC5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDM1ZWY2NGM4MmQ0YzU0MDB9LG9wLkRFRkFVTFRfTk9ERV9DQVBBQ0lUWS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGlwLG9wKTt2YXIgc3A9ZnVuY3Rpb24oKXt9LGFwPWZ1bmN0aW9uKCl7fTthcC5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt9LGFwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxhcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYXB9O3ZhciB1cD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe249bnx8ZS5ERUZBVUxUX05PREVfQ0FQQUNJVFksdC5jYWxsKHRoaXMsbil9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e1NUUnRyZWVOb2RlOntjb25maWd1cmFibGU6ITB9LHNlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0seENvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0seUNvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0saW50ZXJzZWN0c09wOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfTk9ERV9DQVBBQ0lUWTp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZXM9ZnVuY3Rpb24odCxlKXtxbC5pc1RydWUodC5sZW5ndGg+MCk7Zm9yKHZhciBuPW5ldyBsYyxyPTA7cjx0Lmxlbmd0aDtyKyspbi5hZGRBbGwodGhpcy5jcmVhdGVQYXJlbnRCb3VuZGFibGVzRnJvbVZlcnRpY2FsU2xpY2UodFtyXSxlKSk7cmV0dXJuIG59LGUucHJvdG90eXBlLmNyZWF0ZU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBscCh0KX0sZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90LnByb3RvdHlwZS5zaXplLmNhbGwodGhpcyk6dC5wcm90b3R5cGUuc2l6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5pbnNlcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZihlLmlzTnVsbCgpKXJldHVybiBudWxsO3QucHJvdG90eXBlLmluc2VydC5jYWxsKHRoaXMsZSxuKX0sZS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0c09wPWZ1bmN0aW9uKCl7cmV0dXJuIGUuaW50ZXJzZWN0c09wfSxlLnByb3RvdHlwZS52ZXJ0aWNhbFNsaWNlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1NYXRoLnRydW5jKE1hdGguY2VpbCh0LnNpemUoKS9lKSkscj1uZXcgQXJyYXkoZSkuZmlsbChudWxsKSxpPXQuaXRlcmF0b3IoKSxvPTA7bzxlO28rKyl7cltvXT1uZXcgbGM7Zm9yKHZhciBzPTA7aS5oYXNOZXh0KCkmJnM8bjspe3ZhciBhPWkubmV4dCgpO3Jbb10uYWRkKGEpLHMrK319cmV0dXJuIHJ9LGUucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdC5wcm90b3R5cGUucXVlcnkuY2FsbCh0aGlzLGUpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dC5wcm90b3R5cGUucXVlcnkuY2FsbCh0aGlzLG4scil9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihnbChhcmd1bWVudHNbMl0sUWgpJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0cCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdO3QucHJvdG90eXBlLnF1ZXJ5LmNhbGwodGhpcyxpLG8scyl9ZWxzZSBpZihnbChhcmd1bWVudHNbMl0sYWMpJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0cCl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdO3QucHJvdG90eXBlLnF1ZXJ5LmNhbGwodGhpcyxhLHUsbCl9fSxlLnByb3RvdHlwZS5nZXRDb21wYXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIGUueUNvbXBhcmF0b3J9LGUucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZT1mdW5jdGlvbihlLG4pe3JldHVybiB0LnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzLmNhbGwodGhpcyxlLG4pfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiB0LnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQucHJvdG90eXBlLnJlbW92ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmRlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3QucHJvdG90eXBlLmRlcHRoLmNhbGwodGhpcyk6dC5wcm90b3R5cGUuZGVwdGguYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzPWZ1bmN0aW9uKHQsbil7cWwuaXNUcnVlKCF0LmlzRW1wdHkoKSk7dmFyIHI9TWF0aC50cnVuYyhNYXRoLmNlaWwodC5zaXplKCkvdGhpcy5nZXROb2RlQ2FwYWNpdHkoKSkpLGk9bmV3IGxjKHQpO25wLnNvcnQoaSxlLnhDb21wYXJhdG9yKTt2YXIgbz10aGlzLnZlcnRpY2FsU2xpY2VzKGksTWF0aC50cnVuYyhNYXRoLmNlaWwoTWF0aC5zcXJ0KHIpKSkpO3JldHVybiB0aGlzLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZXMobyxuKX0sZS5wcm90b3R5cGUubmVhcmVzdE5laWdoYm91cj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihnbChhcmd1bWVudHNbMF0sYXApKXt2YXIgdD1hcmd1bWVudHNbMF0sbj1uZXcgcnAodGhpcy5nZXRSb290KCksdGhpcy5nZXRSb290KCksdCk7cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihuKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHJwKXt2YXIgcj1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihyLG5sLlBPU0lUSVZFX0lORklOSVRZKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBlJiZnbChhcmd1bWVudHNbMV0sYXApKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1uZXcgcnAodGhpcy5nZXRSb290KCksaS5nZXRSb290KCksbyk7cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihzKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHJwJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGw9dSxjPW51bGwsaD1uZXcgS2g7Zm9yKGguYWRkKGEpOyFoLmlzRW1wdHkoKSYmbD4wOyl7dmFyIHA9aC5wb2xsKCksZj1wLmdldERpc3RhbmNlKCk7aWYoZj49bClicmVhaztwLmlzTGVhdmVzKCk/KGw9ZixjPXApOnAuZXhwYW5kVG9RdWV1ZShoLGwpfXJldHVybltjLmdldEJvdW5kYWJsZSgwKS5nZXRJdGVtKCksYy5nZXRCb3VuZGFibGUoMSkuZ2V0SXRlbSgpXX19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGc9YXJndW1lbnRzWzBdLGQ9YXJndW1lbnRzWzFdLHk9YXJndW1lbnRzWzJdLHY9bmV3IFpoKGcsZCksXz1uZXcgcnAodGhpcy5nZXRSb290KCksdix5KTtyZXR1cm4gdGhpcy5uZWFyZXN0TmVpZ2hib3VyKF8pWzBdfX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bJGgsYWxdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLmNlbnRyZVg9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYXZnKHQuZ2V0TWluWCgpLHQuZ2V0TWF4WCgpKX0sZS5hdmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4odCtlKS8yfSxlLmNlbnRyZVk9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYXZnKHQuZ2V0TWluWSgpLHQuZ2V0TWF4WSgpKX0sbi5TVFJ0cmVlTm9kZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbHB9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHgzOTkyMGY3ZDVmMjYxZTB9LG4ueENvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJue2ludGVyZmFjZXNfOmZ1bmN0aW9uKCl7cmV0dXJuW3NsXX0sY29tcGFyZTpmdW5jdGlvbihuLHIpe3JldHVybiB0LmNvbXBhcmVEb3VibGVzKGUuY2VudHJlWChuLmdldEJvdW5kcygpKSxlLmNlbnRyZVgoci5nZXRCb3VuZHMoKSkpfX19LG4ueUNvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJue2ludGVyZmFjZXNfOmZ1bmN0aW9uKCl7cmV0dXJuW3NsXX0sY29tcGFyZTpmdW5jdGlvbihuLHIpe3JldHVybiB0LmNvbXBhcmVEb3VibGVzKGUuY2VudHJlWShuLmdldEJvdW5kcygpKSxlLmNlbnRyZVkoci5nZXRCb3VuZHMoKSkpfX19LG4uaW50ZXJzZWN0c09wLmdldD1mdW5jdGlvbigpe3JldHVybntpbnRlcmZhY2VzXzpmdW5jdGlvbigpe3JldHVyblt0LkludGVyc2VjdHNPcF19LGludGVyc2VjdHM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5pbnRlcnNlY3RzKGUpfX19LG4uREVGQVVMVF9OT0RFX0NBUEFDSVRZLmdldD1mdW5jdGlvbigpe3JldHVybiAxMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShpcCksbHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXTt0LmNhbGwodGhpcyxlKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY29tcHV0ZUJvdW5kcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1udWxsLGU9dGhpcy5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7bnVsbD09PXQ/dD1uZXcgTGwobi5nZXRCb3VuZHMoKSk6dC5leHBhbmRUb0luY2x1ZGUobi5nZXRCb3VuZHMoKSl9cmV0dXJuIHR9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KHRwKSxjcD1mdW5jdGlvbigpe307Y3AucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGNwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBjcH0sY3AucmVsYXRpdmVTaWduPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTowfSxjcC5jb21wYXJlPWZ1bmN0aW9uKHQsZSxuKXtpZihlLmVxdWFsczJEKG4pKXJldHVybiAwO3ZhciByPWNwLnJlbGF0aXZlU2lnbihlLngsbi54KSxpPWNwLnJlbGF0aXZlU2lnbihlLnksbi55KTtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiBjcC5jb21wYXJlVmFsdWUocixpKTtjYXNlIDE6cmV0dXJuIGNwLmNvbXBhcmVWYWx1ZShpLHIpO2Nhc2UgMjpyZXR1cm4gY3AuY29tcGFyZVZhbHVlKGksLXIpO2Nhc2UgMzpyZXR1cm4gY3AuY29tcGFyZVZhbHVlKC1yLGkpO2Nhc2UgNDpyZXR1cm4gY3AuY29tcGFyZVZhbHVlKC1yLC1pKTtjYXNlIDU6cmV0dXJuIGNwLmNvbXBhcmVWYWx1ZSgtaSwtcik7Y2FzZSA2OnJldHVybiBjcC5jb21wYXJlVmFsdWUoLWkscik7Y2FzZSA3OnJldHVybiBjcC5jb21wYXJlVmFsdWUociwtaSl9cmV0dXJuIHFsLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJpbnZhbGlkIG9jdGFudCB2YWx1ZSIpLDB9LGNwLmNvbXBhcmVWYWx1ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0PDA/LTE6dD4wPzE6ZTwwPy0xOmU+MD8xOjB9O3ZhciBocD1mdW5jdGlvbigpe3RoaXMuX3NlZ1N0cmluZz1udWxsLHRoaXMuY29vcmQ9bnVsbCx0aGlzLnNlZ21lbnRJbmRleD1udWxsLHRoaXMuX3NlZ21lbnRPY3RhbnQ9bnVsbCx0aGlzLl9pc0ludGVyaW9yPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9YXJndW1lbnRzWzNdO3RoaXMuX3NlZ1N0cmluZz10LHRoaXMuY29vcmQ9bmV3IHVsKGUpLHRoaXMuc2VnbWVudEluZGV4PW4sdGhpcy5fc2VnbWVudE9jdGFudD1yLHRoaXMuX2lzSW50ZXJpb3I9IWUuZXF1YWxzMkQodC5nZXRDb29yZGluYXRlKG4pKX07aHAucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb29yZH0saHAucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnQodGhpcy5jb29yZCksdC5wcmludCgiIHNlZyAjID0gIit0aGlzLnNlZ21lbnRJbmRleCl9LGhwLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5zZWdtZW50SW5kZXg8ZS5zZWdtZW50SW5kZXg/LTE6dGhpcy5zZWdtZW50SW5kZXg+ZS5zZWdtZW50SW5kZXg/MTp0aGlzLmNvb3JkLmVxdWFsczJEKGUuY29vcmQpPzA6Y3AuY29tcGFyZSh0aGlzLl9zZWdtZW50T2N0YW50LHRoaXMuY29vcmQsZS5jb29yZCl9LGhwLnByb3RvdHlwZS5pc0VuZFBvaW50PWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5zZWdtZW50SW5kZXgmJiF0aGlzLl9pc0ludGVyaW9yfHx0aGlzLnNlZ21lbnRJbmRleD09PXR9LGhwLnByb3RvdHlwZS5pc0ludGVyaW9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSW50ZXJpb3J9LGhwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpbF19LGhwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBocH07dmFyIHBwPWZ1bmN0aW9uKCl7dGhpcy5fbm9kZU1hcD1uZXcgQ2MsdGhpcy5fZWRnZT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9lZGdlPXR9O3BwLnByb3RvdHlwZS5nZXRTcGxpdENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGhjO3RoaXMuYWRkRW5kcG9pbnRzKCk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKSxuPWUubmV4dCgpO2UuaGFzTmV4dCgpOyl7dmFyIHI9ZS5uZXh0KCk7dGhpcy5hZGRFZGdlQ29vcmRpbmF0ZXMobixyLHQpLG49cn1yZXR1cm4gdC50b0Nvb3JkaW5hdGVBcnJheSgpfSxwcC5wcm90b3R5cGUuYWRkQ29sbGFwc2VkTm9kZXM9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbGM7dGhpcy5maW5kQ29sbGFwc2VzRnJvbUluc2VydGVkTm9kZXModCksdGhpcy5maW5kQ29sbGFwc2VzRnJvbUV4aXN0aW5nVmVydGljZXModCk7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLmludFZhbHVlKCk7dGhpcy5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKG4pLG4pfX0scHAucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnRsbigiSW50ZXJzZWN0aW9uczoiKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkucHJpbnQodCl9fSxwcC5wcm90b3R5cGUuZmluZENvbGxhcHNlc0Zyb21FeGlzdGluZ1ZlcnRpY2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fZWRnZS5zaXplKCktMjtlKyspe3ZhciBuPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlKSxyPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlKzIpO24uZXF1YWxzMkQocikmJnQuYWRkKG5ldyBfbChlKzEpKX19LHBwLnByb3RvdHlwZS5hZGRFZGdlQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlLnNlZ21lbnRJbmRleCksaT1lLmlzSW50ZXJpb3IoKXx8IWUuY29vcmQuZXF1YWxzMkQocik7bi5hZGQobmV3IHVsKHQuY29vcmQpLCExKTtmb3IodmFyIG89dC5zZWdtZW50SW5kZXgrMTtvPD1lLnNlZ21lbnRJbmRleDtvKyspbi5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKG8pKTtpJiZuLmFkZChuZXcgdWwoZS5jb29yZCkpfSxwcC5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpfSxwcC5wcm90b3R5cGUuYWRkU3BsaXRFZGdlcz1mdW5jdGlvbih0KXt0aGlzLmFkZEVuZHBvaW50cygpLHRoaXMuYWRkQ29sbGFwc2VkTm9kZXMoKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpLG49ZS5uZXh0KCk7ZS5oYXNOZXh0KCk7KXt2YXIgcj1lLm5leHQoKSxpPXRoaXMuY3JlYXRlU3BsaXRFZGdlKG4scik7dC5hZGQoaSksbj1yfX0scHAucHJvdG90eXBlLmZpbmRDb2xsYXBzZUluZGV4PWZ1bmN0aW9uKHQsZSxuKXtpZighdC5jb29yZC5lcXVhbHMyRChlLmNvb3JkKSlyZXR1cm4hMTt2YXIgcj1lLnNlZ21lbnRJbmRleC10LnNlZ21lbnRJbmRleDtyZXR1cm4gZS5pc0ludGVyaW9yKCl8fHItLSwxPT09ciYmKG5bMF09dC5zZWdtZW50SW5kZXgrMSwhMCl9LHBwLnByb3RvdHlwZS5maW5kQ29sbGFwc2VzRnJvbUluc2VydGVkTm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSgxKS5maWxsKG51bGwpLG49dGhpcy5pdGVyYXRvcigpLHI9bi5uZXh0KCk7bi5oYXNOZXh0KCk7KXt2YXIgaT1uLm5leHQoKTt0aGlzLmZpbmRDb2xsYXBzZUluZGV4KHIsaSxlKSYmdC5hZGQobmV3IF9sKGVbMF0pKSxyPWl9fSxwcC5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlfSxwcC5wcm90b3R5cGUuYWRkRW5kcG9pbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWRnZS5zaXplKCktMTt0aGlzLmFkZCh0aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoMCksMCksdGhpcy5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKHQpLHQpfSxwcC5wcm90b3R5cGUuY3JlYXRlU3BsaXRFZGdlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5zZWdtZW50SW5kZXgtdC5zZWdtZW50SW5kZXgrMixyPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlLnNlZ21lbnRJbmRleCksaT1lLmlzSW50ZXJpb3IoKXx8IWUuY29vcmQuZXF1YWxzMkQocik7aXx8bi0tO3ZhciBvPW5ldyBBcnJheShuKS5maWxsKG51bGwpLHM9MDtvW3MrK109bmV3IHVsKHQuY29vcmQpO2Zvcih2YXIgYT10LnNlZ21lbnRJbmRleCsxO2E8PWUuc2VnbWVudEluZGV4O2ErKylvW3MrK109dGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKGEpO3JldHVybiBpJiYob1tzXT1uZXcgdWwoZS5jb29yZCkpLG5ldyB5cChvLHRoaXMuX2VkZ2UuZ2V0RGF0YSgpKX0scHAucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBocCh0aGlzLl9lZGdlLHQsZSx0aGlzLl9lZGdlLmdldFNlZ21lbnRPY3RhbnQoZSkpLHI9dGhpcy5fbm9kZU1hcC5nZXQobik7cmV0dXJuIG51bGwhPT1yPyhxbC5pc1RydWUoci5jb29yZC5lcXVhbHMyRCh0KSwiRm91bmQgZXF1YWwgbm9kZXMgd2l0aCBkaWZmZXJlbnQgY29vcmRpbmF0ZXMiKSxyKToodGhpcy5fbm9kZU1hcC5wdXQobixuKSxuKX0scHAucHJvdG90eXBlLmNoZWNrU3BsaXRFZGdlc0NvcnJlY3RuZXNzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZXMoKSxuPXQuZ2V0KDApLmdldENvb3JkaW5hdGUoMCk7aWYoIW4uZXF1YWxzMkQoZVswXSkpdGhyb3cgbmV3IGtsKCJiYWQgc3BsaXQgZWRnZSBzdGFydCBwb2ludCBhdCAiK24pO3ZhciByPXQuZ2V0KHQuc2l6ZSgpLTEpLmdldENvb3JkaW5hdGVzKCksaT1yW3IubGVuZ3RoLTFdO2lmKCFpLmVxdWFsczJEKGVbZS5sZW5ndGgtMV0pKXRocm93IG5ldyBrbCgiYmFkIHNwbGl0IGVkZ2UgZW5kIHBvaW50IGF0ICIraSl9LHBwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxwcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcHB9O3ZhciBmcD1mdW5jdGlvbigpe307ZnAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGZwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBmcH0sZnAub2N0YW50PWZ1bmN0aW9uKCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYoMD09PXQmJjA9PT1lKXRocm93IG5ldyBlbCgiQ2Fubm90IGNvbXB1dGUgdGhlIG9jdGFudCBmb3IgcG9pbnQgKCAiK3QrIiwgIitlKyIgKSIpO3ZhciBuPU1hdGguYWJzKHQpLHI9TWF0aC5hYnMoZSk7cmV0dXJuIHQ+PTA/ZT49MD9uPj1yPzA6MTpuPj1yPzc6NjplPj0wP24+PXI/MzoyOm4+PXI/NDo1fWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgdWwpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPW8ueC1pLngsYT1vLnktaS55O2lmKDA9PT1zJiYwPT09YSl0aHJvdyBuZXcgZWwoIkNhbm5vdCBjb21wdXRlIHRoZSBvY3RhbnQgZm9yIHR3byBpZGVudGljYWwgcG9pbnRzICIraSk7cmV0dXJuIGZwLm9jdGFudChzLGEpfX07dmFyIGdwPWZ1bmN0aW9uKCl7fTtncC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXt9LGdwLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7fSxncC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXt9LGdwLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe30sZ3AucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7fSxncC5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbigpe30sZ3AucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGdwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBncH07dmFyIGRwPWZ1bmN0aW9uKCl7fTtkcC5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSl7fSxkcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZ3BdfSxkcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZHB9O3ZhciB5cD1mdW5jdGlvbigpe3RoaXMuX25vZGVMaXN0PW5ldyBwcCh0aGlzKSx0aGlzLl9wdHM9bnVsbCx0aGlzLl9kYXRhPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX3B0cz10LHRoaXMuX2RhdGE9ZX07eXAucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0c30seXAucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRzLmxlbmd0aH0seXAucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B0c1t0XX0seXAucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0c1swXS5lcXVhbHModGhpcy5fcHRzW3RoaXMuX3B0cy5sZW5ndGgtMV0pfSx5cC5wcm90b3R5cGUuZ2V0U2VnbWVudE9jdGFudD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PXRoaXMuX3B0cy5sZW5ndGgtMT8tMTp0aGlzLnNhZmVPY3RhbnQodGhpcy5nZXRDb29yZGluYXRlKHQpLHRoaXMuZ2V0Q29vcmRpbmF0ZSh0KzEpKX0seXAucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dGhpcy5fZGF0YT10fSx5cC5wcm90b3R5cGUuc2FmZU9jdGFudD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmVxdWFsczJEKGUpPzA6ZnAub2N0YW50KHQsZSl9LHlwLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9LHlwLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuYWRkSW50ZXJzZWN0aW9uTm9kZSh0LGUpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1szXSxvPW5ldyB1bChuLmdldEludGVyc2VjdGlvbihpKSk7dGhpcy5hZGRJbnRlcnNlY3Rpb24obyxyKX19LHlwLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBGbC50b0xpbmVTdHJpbmcobmV3IGxoKHRoaXMuX3B0cykpfSx5cC5wcm90b3R5cGUuZ2V0Tm9kZUxpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZUxpc3R9LHlwLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb25Ob2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZSxyPW4rMTtpZihyPHRoaXMuX3B0cy5sZW5ndGgpe3ZhciBpPXRoaXMuX3B0c1tyXTt0LmVxdWFsczJEKGkpJiYobj1yKX1yZXR1cm4gdGhpcy5fbm9kZUxpc3QuYWRkKHQsbil9LHlwLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MDtyPHQuZ2V0SW50ZXJzZWN0aW9uTnVtKCk7cisrKXRoaXMuYWRkSW50ZXJzZWN0aW9uKHQsZSxuLHIpfSx5cC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZHBdfSx5cC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geXB9LHlwLmdldE5vZGVkU3Vic3RyaW5ncz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgbGM7cmV0dXJuIHlwLmdldE5vZGVkU3Vic3RyaW5ncyh0LGUpLGV9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPW4uaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpO28uZ2V0Tm9kZUxpc3QoKS5hZGRTcGxpdEVkZ2VzKHIpfX07dmFyIHZwPWZ1bmN0aW9uKCl7aWYodGhpcy5wMD1udWxsLHRoaXMucDE9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLnAwPW5ldyB1bCx0aGlzLnAxPW5ldyB1bDtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5wMD1uZXcgdWwodC5wMCksdGhpcy5wMT1uZXcgdWwodC5wMSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLnAwPWFyZ3VtZW50c1swXSx0aGlzLnAxPWFyZ3VtZW50c1sxXTtlbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl0saT1hcmd1bWVudHNbM107dGhpcy5wMD1uZXcgdWwoZSxuKSx0aGlzLnAxPW5ldyB1bChyLGkpfX0sX3A9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3ZwLnByb3RvdHlwZS5taW5YPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKHRoaXMucDAueCx0aGlzLnAxLngpfSx2cC5wcm90b3R5cGUub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdnApe3ZhciB0PWFyZ3VtZW50c1swXSxlPVhsLm9yaWVudGF0aW9uSW5kZXgodGhpcy5wMCx0aGlzLnAxLHQucDApLG49WGwub3JpZW50YXRpb25JbmRleCh0aGlzLnAwLHRoaXMucDEsdC5wMSk7cmV0dXJuIGU+PTAmJm4+PTB8fGU8PTAmJm48PTA/TWF0aC5tYXgoZSxuKTowfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwpe3ZhciByPWFyZ3VtZW50c1swXTtyZXR1cm4gWGwub3JpZW50YXRpb25JbmRleCh0aGlzLnAwLHRoaXMucDEscil9fSx2cC5wcm90b3R5cGUudG9HZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jcmVhdGVMaW5lU3RyaW5nKFt0aGlzLnAwLHRoaXMucDFdKX0sdnAucHJvdG90eXBlLmlzVmVydGljYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wMC54PT09dGhpcy5wMS54fSx2cC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIHZwKSlyZXR1cm4hMTt2YXIgZT10O3JldHVybiB0aGlzLnAwLmVxdWFscyhlLnAwKSYmdGhpcy5wMS5lcXVhbHMoZS5wMSl9LHZwLnByb3RvdHlwZS5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGpsO3JldHVybiBlLmNvbXB1dGVJbnRlcnNlY3Rpb24odGhpcy5wMCx0aGlzLnAxLHQucDAsdC5wMSksZS5oYXNJbnRlcnNlY3Rpb24oKT9lLmdldEludGVyc2VjdGlvbigwKTpudWxsfSx2cC5wcm90b3R5cGUucHJvamVjdD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwpe3ZhciB0PWFyZ3VtZW50c1swXTtpZih0LmVxdWFscyh0aGlzLnAwKXx8dC5lcXVhbHModGhpcy5wMSkpcmV0dXJuIG5ldyB1bCh0KTt2YXIgZT10aGlzLnByb2plY3Rpb25GYWN0b3IodCksbj1uZXcgdWw7cmV0dXJuIG4ueD10aGlzLnAwLngrZSoodGhpcy5wMS54LXRoaXMucDAueCksbi55PXRoaXMucDAueStlKih0aGlzLnAxLnktdGhpcy5wMC55KSxufWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdnApe3ZhciByPWFyZ3VtZW50c1swXSxpPXRoaXMucHJvamVjdGlvbkZhY3RvcihyLnAwKSxvPXRoaXMucHJvamVjdGlvbkZhY3RvcihyLnAxKTtpZihpPj0xJiZvPj0xKXJldHVybiBudWxsO2lmKGk8PTAmJm88PTApcmV0dXJuIG51bGw7dmFyIHM9dGhpcy5wcm9qZWN0KHIucDApO2k8MCYmKHM9dGhpcy5wMCksaT4xJiYocz10aGlzLnAxKTt2YXIgYT10aGlzLnByb2plY3Qoci5wMSk7cmV0dXJuIG88MCYmKGE9dGhpcy5wMCksbz4xJiYoYT10aGlzLnAxKSxuZXcgdnAocyxhKX19LHZwLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXt0aGlzLnAxLmNvbXBhcmVUbyh0aGlzLnAwKTwwJiZ0aGlzLnJldmVyc2UoKX0sdnAucHJvdG90eXBlLmFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy5wMS55LXRoaXMucDAueSx0aGlzLnAxLngtdGhpcy5wMC54KX0sdnAucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10P3RoaXMucDA6dGhpcy5wMX0sdnAucHJvdG90eXBlLmRpc3RhbmNlUGVycGVuZGljdWxhcj1mdW5jdGlvbih0KXtyZXR1cm4gWGwuZGlzdGFuY2VQb2ludExpbmVQZXJwZW5kaWN1bGFyKHQsdGhpcy5wMCx0aGlzLnAxKX0sdnAucHJvdG90eXBlLm1pblk9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5wMC55LHRoaXMucDEueSl9LHZwLnByb3RvdHlwZS5taWRQb2ludD1mdW5jdGlvbigpe3JldHVybiB2cC5taWRQb2ludCh0aGlzLnAwLHRoaXMucDEpfSx2cC5wcm90b3R5cGUucHJvamVjdGlvbkZhY3Rvcj1mdW5jdGlvbih0KXtpZih0LmVxdWFscyh0aGlzLnAwKSlyZXR1cm4gMDtpZih0LmVxdWFscyh0aGlzLnAxKSlyZXR1cm4gMTt2YXIgZT10aGlzLnAxLngtdGhpcy5wMC54LG49dGhpcy5wMS55LXRoaXMucDAueSxyPWUqZStuKm47cmV0dXJuIHI8PTA/bmwuTmFOOigodC54LXRoaXMucDAueCkqZSsodC55LXRoaXMucDAueSkqbikvcn0sdnAucHJvdG90eXBlLmNsb3Nlc3RQb2ludHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbnRlcnNlY3Rpb24odCk7aWYobnVsbCE9PWUpcmV0dXJuW2UsZV07dmFyIG49bmV3IEFycmF5KDIpLmZpbGwobnVsbCkscj1ubC5NQVhfVkFMVUUsaT1udWxsLG89dGhpcy5jbG9zZXN0UG9pbnQodC5wMCk7cj1vLmRpc3RhbmNlKHQucDApLG5bMF09byxuWzFdPXQucDA7dmFyIHM9dGhpcy5jbG9zZXN0UG9pbnQodC5wMSk7KGk9cy5kaXN0YW5jZSh0LnAxKSk8ciYmKHI9aSxuWzBdPXMsblsxXT10LnAxKTt2YXIgYT10LmNsb3Nlc3RQb2ludCh0aGlzLnAwKTsoaT1hLmRpc3RhbmNlKHRoaXMucDApKTxyJiYocj1pLG5bMF09dGhpcy5wMCxuWzFdPWEpO3ZhciB1PXQuY2xvc2VzdFBvaW50KHRoaXMucDEpO3JldHVybihpPXUuZGlzdGFuY2UodGhpcy5wMSkpPHImJihyPWksblswXT10aGlzLnAxLG5bMV09dSksbn0sdnAucHJvdG90eXBlLmNsb3Nlc3RQb2ludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnByb2plY3Rpb25GYWN0b3IodCk7cmV0dXJuIGU+MCYmZTwxP3RoaXMucHJvamVjdCh0KTp0aGlzLnAwLmRpc3RhbmNlKHQpPHRoaXMucDEuZGlzdGFuY2UodCk/dGhpcy5wMDp0aGlzLnAxfSx2cC5wcm90b3R5cGUubWF4WD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1heCh0aGlzLnAwLngsdGhpcy5wMS54KX0sdnAucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnAwLmRpc3RhbmNlKHRoaXMucDEpfSx2cC5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQsbj10aGlzLnAwLmNvbXBhcmVUbyhlLnAwKTtyZXR1cm4gMCE9PW4/bjp0aGlzLnAxLmNvbXBhcmVUbyhlLnAxKX0sdnAucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnAwO3RoaXMucDA9dGhpcy5wMSx0aGlzLnAxPXR9LHZwLnByb3RvdHlwZS5lcXVhbHNUb3BvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnAwLmVxdWFscyh0LnAwKSYmKHRoaXMucDEuZXF1YWxzKHQucDEpfHx0aGlzLnAwLmVxdWFscyh0LnAxKSkmJnRoaXMucDEuZXF1YWxzKHQucDApfSx2cC5wcm90b3R5cGUubGluZUludGVyc2VjdGlvbj1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIE1sLmludGVyc2VjdGlvbih0aGlzLnAwLHRoaXMucDEsdC5wMCx0LnAxKX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBDbCkpdGhyb3cgdH1yZXR1cm4gbnVsbH0sdnAucHJvdG90eXBlLm1heFk9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgodGhpcy5wMC55LHRoaXMucDEueSl9LHZwLnByb3RvdHlwZS5wb2ludEFsb25nT2Zmc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5wMC54K3QqKHRoaXMucDEueC10aGlzLnAwLngpLHI9dGhpcy5wMC55K3QqKHRoaXMucDEueS10aGlzLnAwLnkpLGk9dGhpcy5wMS54LXRoaXMucDAueCxvPXRoaXMucDEueS10aGlzLnAwLnkscz1NYXRoLnNxcnQoaSppK28qbyksYT0wLHU9MDtpZigwIT09ZSl7aWYoczw9MCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb21wdXRlIG9mZnNldCBmcm9tIHplcm8tbGVuZ3RoIGxpbmUgc2VnbWVudCIpO2E9ZSppL3MsdT1lKm8vc31yZXR1cm4gbmV3IHVsKG4tdSxyK2EpfSx2cC5wcm90b3R5cGUuc2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0Q29vcmRpbmF0ZXModC5wMCx0LnAxKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5wMC54PWUueCx0aGlzLnAwLnk9ZS55LHRoaXMucDEueD1uLngsdGhpcy5wMS55PW4ueX19LHZwLnByb3RvdHlwZS5zZWdtZW50RnJhY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wcm9qZWN0aW9uRmFjdG9yKHQpO3JldHVybiBlPDA/ZT0wOihlPjF8fG5sLmlzTmFOKGUpKSYmKGU9MSksZX0sdnAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkxJTkVTVFJJTkcoICIrdGhpcy5wMC54KyIgIit0aGlzLnAwLnkrIiwgIit0aGlzLnAxLngrIiAiK3RoaXMucDEueSsiKSJ9LHZwLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wMC55PT09dGhpcy5wMS55fSx2cC5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZwKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIFhsLmRpc3RhbmNlTGluZUxpbmUodGhpcy5wMCx0aGlzLnAxLHQucDAsdC5wMSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB1bCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBYbC5kaXN0YW5jZVBvaW50TGluZShlLHRoaXMucDAsdGhpcy5wMSl9fSx2cC5wcm90b3R5cGUucG9pbnRBbG9uZz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdWw7cmV0dXJuIGUueD10aGlzLnAwLngrdCoodGhpcy5wMS54LXRoaXMucDAueCksZS55PXRoaXMucDAueSt0Kih0aGlzLnAxLnktdGhpcy5wMC55KSxlfSx2cC5wcm90b3R5cGUuaGFzaENvZGU9ZnVuY3Rpb24oKXt2YXIgdD1ubC5kb3VibGVUb0xvbmdCaXRzKHRoaXMucDAueCk7dF49MzEqbmwuZG91YmxlVG9Mb25nQml0cyh0aGlzLnAwLnkpO3ZhciBlPU1hdGgudHJ1bmModCleTWF0aC50cnVuYyh0Pj4zMiksbj1ubC5kb3VibGVUb0xvbmdCaXRzKHRoaXMucDEueCk7cmV0dXJuIG5ePTMxKm5sLmRvdWJsZVRvTG9uZ0JpdHModGhpcy5wMS55KSxlXihNYXRoLnRydW5jKG4pXk1hdGgudHJ1bmMobj4+MzIpKX0sdnAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2lsLGFsXX0sdnAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHZwfSx2cC5taWRQb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgdWwoKHQueCtlLngpLzIsKHQueStlLnkpLzIpfSxfcC5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDJkMjE3MjEzNWY0MTFjMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHZwLF9wKTt2YXIgbXA9ZnVuY3Rpb24oKXt0aGlzLnRlbXBFbnYxPW5ldyBMbCx0aGlzLnRlbXBFbnYyPW5ldyBMbCx0aGlzLl9vdmVybGFwU2VnMT1uZXcgdnAsdGhpcy5fb3ZlcmxhcFNlZzI9bmV3IHZwfTttcC5wcm90b3R5cGUub3ZlcmxhcD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKTtlbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1hcmd1bWVudHNbM107dC5nZXRMaW5lU2VnbWVudChlLHRoaXMuX292ZXJsYXBTZWcxKSxuLmdldExpbmVTZWdtZW50KHIsdGhpcy5fb3ZlcmxhcFNlZzIpLHRoaXMub3ZlcmxhcCh0aGlzLl9vdmVybGFwU2VnMSx0aGlzLl9vdmVybGFwU2VnMil9fSxtcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbXAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG1wfTt2YXIgeHA9ZnVuY3Rpb24oKXt0aGlzLl9wdHM9bnVsbCx0aGlzLl9zdGFydD1udWxsLHRoaXMuX2VuZD1udWxsLHRoaXMuX2Vudj1udWxsLHRoaXMuX2NvbnRleHQ9bnVsbCx0aGlzLl9pZD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxyPWFyZ3VtZW50c1szXTt0aGlzLl9wdHM9dCx0aGlzLl9zdGFydD1lLHRoaXMuX2VuZD1uLHRoaXMuX2NvbnRleHQ9cn07eHAucHJvdG90eXBlLmdldExpbmVTZWdtZW50PWZ1bmN0aW9uKHQsZSl7ZS5wMD10aGlzLl9wdHNbdF0sZS5wMT10aGlzLl9wdHNbdCsxXX0seHAucHJvdG90eXBlLmNvbXB1dGVTZWxlY3Q9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcy5fcHRzW2VdLG89dGhpcy5fcHRzW25dO2lmKHIudGVtcEVudjEuaW5pdChpLG8pLG4tZT09MSlyZXR1cm4gci5zZWxlY3QodGhpcyxlKSxudWxsO2lmKCF0LmludGVyc2VjdHMoci50ZW1wRW52MSkpcmV0dXJuIG51bGw7dmFyIHM9TWF0aC50cnVuYygoZStuKS8yKTtlPHMmJnRoaXMuY29tcHV0ZVNlbGVjdCh0LGUscyxyKSxzPG4mJnRoaXMuY29tcHV0ZVNlbGVjdCh0LHMsbixyKX0seHAucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLl9lbmQtdGhpcy5fc3RhcnQrMSkuZmlsbChudWxsKSxlPTAsbj10aGlzLl9zdGFydDtuPD10aGlzLl9lbmQ7bisrKXRbZSsrXT10aGlzLl9wdHNbbl07cmV0dXJuIHR9LHhwLnByb3RvdHlwZS5jb21wdXRlT3ZlcmxhcHM9ZnVuY3Rpb24odCxlKXt0aGlzLmNvbXB1dGVPdmVybGFwc0ludGVybmFsKHRoaXMuX3N0YXJ0LHRoaXMuX2VuZCx0LHQuX3N0YXJ0LHQuX2VuZCxlKX0seHAucHJvdG90eXBlLnNldElkPWZ1bmN0aW9uKHQpe3RoaXMuX2lkPXR9LHhwLnByb3RvdHlwZS5zZWxlY3Q9ZnVuY3Rpb24odCxlKXt0aGlzLmNvbXB1dGVTZWxlY3QodCx0aGlzLl9zdGFydCx0aGlzLl9lbmQsZSl9LHhwLnByb3RvdHlwZS5nZXRFbnZlbG9wZT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9lbnYpe3ZhciB0PXRoaXMuX3B0c1t0aGlzLl9zdGFydF0sZT10aGlzLl9wdHNbdGhpcy5fZW5kXTt0aGlzLl9lbnY9bmV3IExsKHQsZSl9cmV0dXJuIHRoaXMuX2Vudn0seHAucHJvdG90eXBlLmdldEVuZEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZH0seHAucHJvdG90eXBlLmdldFN0YXJ0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhcnR9LHhwLnByb3RvdHlwZS5nZXRDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRleHR9LHhwLnByb3RvdHlwZS5nZXRJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pZH0seHAucHJvdG90eXBlLmNvbXB1dGVPdmVybGFwc0ludGVybmFsPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt2YXIgcz10aGlzLl9wdHNbdF0sYT10aGlzLl9wdHNbZV0sdT1uLl9wdHNbcl0sbD1uLl9wdHNbaV07aWYoZS10PT0xJiZpLXI9PTEpcmV0dXJuIG8ub3ZlcmxhcCh0aGlzLHQsbixyKSxudWxsO2lmKG8udGVtcEVudjEuaW5pdChzLGEpLG8udGVtcEVudjIuaW5pdCh1LGwpLCFvLnRlbXBFbnYxLmludGVyc2VjdHMoby50ZW1wRW52MikpcmV0dXJuIG51bGw7dmFyIGM9TWF0aC50cnVuYygodCtlKS8yKSxoPU1hdGgudHJ1bmMoKHIraSkvMik7dDxjJiYocjxoJiZ0aGlzLmNvbXB1dGVPdmVybGFwc0ludGVybmFsKHQsYyxuLHIsaCxvKSxoPGkmJnRoaXMuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWwodCxjLG4saCxpLG8pKSxjPGUmJihyPGgmJnRoaXMuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWwoYyxlLG4scixoLG8pLGg8aSYmdGhpcy5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbChjLGUsbixoLGksbykpfSx4cC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0seHAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHhwfTt2YXIgRXA9ZnVuY3Rpb24oKXt9O0VwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxFcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRXB9LEVwLmdldENoYWluU3RhcnRJbmRpY2VzPWZ1bmN0aW9uKHQpe3ZhciBlPTAsbj1uZXcgbGM7bi5hZGQobmV3IF9sKGUpKTtkb3t2YXIgcj1FcC5maW5kQ2hhaW5FbmQodCxlKTtuLmFkZChuZXcgX2wocikpLGU9cn13aGlsZShlPHQubGVuZ3RoLTEpO3JldHVybiBFcC50b0ludEFycmF5KG4pfSxFcC5maW5kQ2hhaW5FbmQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZTtuPHQubGVuZ3RoLTEmJnRbbl0uZXF1YWxzMkQodFtuKzFdKTspbisrO2lmKG4+PXQubGVuZ3RoLTEpcmV0dXJuIHQubGVuZ3RoLTE7Zm9yKHZhciByPWpoLnF1YWRyYW50KHRbbl0sdFtuKzFdKSxpPWUrMTtpPHQubGVuZ3RoOyl7aWYoIXRbaS0xXS5lcXVhbHMyRCh0W2ldKSlpZihqaC5xdWFkcmFudCh0W2ktMV0sdFtpXSkhPT1yKWJyZWFrO2krK31yZXR1cm4gaS0xfSxFcC5nZXRDaGFpbnM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBFcC5nZXRDaGFpbnModCxudWxsKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPW5ldyBsYyxpPUVwLmdldENoYWluU3RhcnRJbmRpY2VzKGUpLG89MDtvPGkubGVuZ3RoLTE7bysrKXt2YXIgcz1uZXcgeHAoZSxpW29dLGlbbysxXSxuKTtyLmFkZChzKX1yZXR1cm4gcn19LEVwLnRvSW50QXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT10LmdldChuKS5pbnRWYWx1ZSgpO3JldHVybiBlfTt2YXIgYnA9ZnVuY3Rpb24oKXt9O2JwLnByb3RvdHlwZS5jb21wdXRlTm9kZXM9ZnVuY3Rpb24odCl7fSxicC5wcm90b3R5cGUuZ2V0Tm9kZWRTdWJzdHJpbmdzPWZ1bmN0aW9uKCl7fSxicC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sYnAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGJwfTt2YXIgd3A9ZnVuY3Rpb24oKXtpZih0aGlzLl9zZWdJbnQ9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0U2VnbWVudEludGVyc2VjdG9yKHQpfX07d3AucHJvdG90eXBlLnNldFNlZ21lbnRJbnRlcnNlY3Rvcj1mdW5jdGlvbih0KXt0aGlzLl9zZWdJbnQ9dH0sd3AucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2JwXX0sd3AucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHdwfTt2YXIgSXA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtlP3QuY2FsbCh0aGlzLGUpOnQuY2FsbCh0aGlzKSx0aGlzLl9tb25vQ2hhaW5zPW5ldyBsYyx0aGlzLl9pbmRleD1uZXcgdXAsdGhpcy5faWRDb3VudGVyPTAsdGhpcy5fbm9kZWRTZWdTdHJpbmdzPW51bGwsdGhpcy5fbk92ZXJsYXBzPTB9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e1NlZ21lbnRPdmVybGFwQWN0aW9uOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuZ2V0TW9ub3RvbmVDaGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9ub0NoYWluc30sZS5wcm90b3R5cGUuZ2V0Tm9kZWRTdWJzdHJpbmdzPWZ1bmN0aW9uKCl7cmV0dXJuIHlwLmdldE5vZGVkU3Vic3RyaW5ncyh0aGlzLl9ub2RlZFNlZ1N0cmluZ3MpfSxlLnByb3RvdHlwZS5nZXRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbmRleH0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49RXAuZ2V0Q2hhaW5zKHQuZ2V0Q29vcmRpbmF0ZXMoKSx0KS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ci5zZXRJZChlLl9pZENvdW50ZXIrKyksZS5faW5kZXguaW5zZXJ0KHIuZ2V0RW52ZWxvcGUoKSxyKSxlLl9tb25vQ2hhaW5zLmFkZChyKX19LGUucHJvdG90eXBlLmNvbXB1dGVOb2Rlcz1mdW5jdGlvbih0KXt0aGlzLl9ub2RlZFNlZ1N0cmluZ3M9dDtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSk7dGhpcy5pbnRlcnNlY3RDaGFpbnMoKX0sZS5wcm90b3R5cGUuaW50ZXJzZWN0Q2hhaW5zPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT1uZXcgTnAodGhpcy5fc2VnSW50KSxuPXRoaXMuX21vbm9DaGFpbnMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspZm9yKHZhciByPW4ubmV4dCgpLGk9dC5faW5kZXgucXVlcnkoci5nZXRFbnZlbG9wZSgpKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCk7aWYoby5nZXRJZCgpPnIuZ2V0SWQoKSYmKHIuY29tcHV0ZU92ZXJsYXBzKG8sZSksdC5fbk92ZXJsYXBzKyspLHQuX3NlZ0ludC5pc0RvbmUoKSlyZXR1cm4gbnVsbH19LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uU2VnbWVudE92ZXJsYXBBY3Rpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE5wfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KHdwKSxOcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX3NpPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX3NpPWV9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLm92ZXJsYXA9ZnVuY3Rpb24oKXtpZig0IT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUub3ZlcmxhcC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdLGk9YXJndW1lbnRzWzNdLG89ZS5nZXRDb250ZXh0KCkscz1yLmdldENvbnRleHQoKTt0aGlzLl9zaS5wcm9jZXNzSW50ZXJzZWN0aW9ucyhvLG4scyxpKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0obXApLFNwPWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9xdWFkcmFudFNlZ21lbnRzPXQuREVGQVVMVF9RVUFEUkFOVF9TRUdNRU5UUyx0aGlzLl9lbmRDYXBTdHlsZT10LkNBUF9ST1VORCx0aGlzLl9qb2luU3R5bGU9dC5KT0lOX1JPVU5ELHRoaXMuX21pdHJlTGltaXQ9dC5ERUZBVUxUX01JVFJFX0xJTUlULHRoaXMuX2lzU2luZ2xlU2lkZWQ9ITEsdGhpcy5fc2ltcGxpZnlGYWN0b3I9dC5ERUZBVUxUX1NJTVBMSUZZX0ZBQ1RPUiwwPT09YXJndW1lbnRzLmxlbmd0aCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuc2V0UXVhZHJhbnRTZWdtZW50cyhlKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5zZXRRdWFkcmFudFNlZ21lbnRzKG4pLHRoaXMuc2V0RW5kQ2FwU3R5bGUocil9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzNdO3RoaXMuc2V0UXVhZHJhbnRTZWdtZW50cyhpKSx0aGlzLnNldEVuZENhcFN0eWxlKG8pLHRoaXMuc2V0Sm9pblN0eWxlKHMpLHRoaXMuc2V0TWl0cmVMaW1pdChhKX19LENwPXtDQVBfUk9VTkQ6e2NvbmZpZ3VyYWJsZTohMH0sQ0FQX0ZMQVQ6e2NvbmZpZ3VyYWJsZTohMH0sQ0FQX1NRVUFSRTp7Y29uZmlndXJhYmxlOiEwfSxKT0lOX1JPVU5EOntjb25maWd1cmFibGU6ITB9LEpPSU5fTUlUUkU6e2NvbmZpZ3VyYWJsZTohMH0sSk9JTl9CRVZFTDp7Y29uZmlndXJhYmxlOiEwfSxERUZBVUxUX1FVQURSQU5UX1NFR01FTlRTOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfTUlUUkVfTElNSVQ6e2NvbmZpZ3VyYWJsZTohMH0sREVGQVVMVF9TSU1QTElGWV9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH19O1NwLnByb3RvdHlwZS5nZXRFbmRDYXBTdHlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmRDYXBTdHlsZX0sU3AucHJvdG90eXBlLmlzU2luZ2xlU2lkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNTaW5nbGVTaWRlZH0sU3AucHJvdG90eXBlLnNldFF1YWRyYW50U2VnbWVudHM9ZnVuY3Rpb24odCl7dGhpcy5fcXVhZHJhbnRTZWdtZW50cz10LDA9PT10aGlzLl9xdWFkcmFudFNlZ21lbnRzJiYodGhpcy5fam9pblN0eWxlPVNwLkpPSU5fQkVWRUwpLHRoaXMuX3F1YWRyYW50U2VnbWVudHM8MCYmKHRoaXMuX2pvaW5TdHlsZT1TcC5KT0lOX01JVFJFLHRoaXMuX21pdHJlTGltaXQ9TWF0aC5hYnModGhpcy5fcXVhZHJhbnRTZWdtZW50cykpLHQ8PTAmJih0aGlzLl9xdWFkcmFudFNlZ21lbnRzPTEpLHRoaXMuX2pvaW5TdHlsZSE9PVNwLkpPSU5fUk9VTkQmJih0aGlzLl9xdWFkcmFudFNlZ21lbnRzPVNwLkRFRkFVTFRfUVVBRFJBTlRfU0VHTUVOVFMpfSxTcC5wcm90b3R5cGUuZ2V0Sm9pblN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2pvaW5TdHlsZX0sU3AucHJvdG90eXBlLnNldEpvaW5TdHlsZT1mdW5jdGlvbih0KXt0aGlzLl9qb2luU3R5bGU9dH0sU3AucHJvdG90eXBlLnNldFNpbXBsaWZ5RmFjdG9yPWZ1bmN0aW9uKHQpe3RoaXMuX3NpbXBsaWZ5RmFjdG9yPXQ8MD8wOnR9LFNwLnByb3RvdHlwZS5nZXRTaW1wbGlmeUZhY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaW1wbGlmeUZhY3Rvcn0sU3AucHJvdG90eXBlLmdldFF1YWRyYW50U2VnbWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcXVhZHJhbnRTZWdtZW50c30sU3AucHJvdG90eXBlLnNldEVuZENhcFN0eWxlPWZ1bmN0aW9uKHQpe3RoaXMuX2VuZENhcFN0eWxlPXR9LFNwLnByb3RvdHlwZS5nZXRNaXRyZUxpbWl0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pdHJlTGltaXR9LFNwLnByb3RvdHlwZS5zZXRNaXRyZUxpbWl0PWZ1bmN0aW9uKHQpe3RoaXMuX21pdHJlTGltaXQ9dH0sU3AucHJvdG90eXBlLnNldFNpbmdsZVNpZGVkPWZ1bmN0aW9uKHQpe3RoaXMuX2lzU2luZ2xlU2lkZWQ9dH0sU3AucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFNwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBTcH0sU3AuYnVmZmVyRGlzdGFuY2VFcnJvcj1mdW5jdGlvbih0KXt2YXIgZT1NYXRoLlBJLzIvdDtyZXR1cm4gMS1NYXRoLmNvcyhlLzIpfSxDcC5DQVBfUk9VTkQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LENwLkNBUF9GTEFULmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxDcC5DQVBfU1FVQVJFLmdldD1mdW5jdGlvbigpe3JldHVybiAzfSxDcC5KT0lOX1JPVU5ELmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxDcC5KT0lOX01JVFJFLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxDcC5KT0lOX0JFVkVMLmdldD1mdW5jdGlvbigpe3JldHVybiAzfSxDcC5ERUZBVUxUX1FVQURSQU5UX1NFR01FTlRTLmdldD1mdW5jdGlvbigpe3JldHVybiA4fSxDcC5ERUZBVUxUX01JVFJFX0xJTUlULmdldD1mdW5jdGlvbigpe3JldHVybiA1fSxDcC5ERUZBVUxUX1NJTVBMSUZZX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFNwLENwKTt2YXIgUHA9ZnVuY3Rpb24odCl7dGhpcy5fZGlzdGFuY2VUb2w9bnVsbCx0aGlzLl9pc0RlbGV0ZWQ9bnVsbCx0aGlzLl9hbmdsZU9yaWVudGF0aW9uPVhsLkNPVU5URVJDTE9DS1dJU0UsdGhpcy5faW5wdXRMaW5lPXR8fG51bGx9LE1wPXtJTklUOntjb25maWd1cmFibGU6ITB9LERFTEVURTp7Y29uZmlndXJhYmxlOiEwfSxLRUVQOntjb25maWd1cmFibGU6ITB9LE5VTV9QVFNfVE9fQ0hFQ0s6e2NvbmZpZ3VyYWJsZTohMH19O1BwLnByb3RvdHlwZS5pc0RlbGV0YWJsZT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLl9pbnB1dExpbmVbdF0sbz10aGlzLl9pbnB1dExpbmVbZV0scz10aGlzLl9pbnB1dExpbmVbbl07cmV0dXJuISF0aGlzLmlzQ29uY2F2ZShpLG8scykmJighIXRoaXMuaXNTaGFsbG93KGksbyxzLHIpJiZ0aGlzLmlzU2hhbGxvd1NhbXBsZWQoaSxvLHQsbixyKSl9LFBwLnByb3RvdHlwZS5kZWxldGVTaGFsbG93Q29uY2F2aXRpZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTEsbj10aGlzLmZpbmROZXh0Tm9uRGVsZXRlZEluZGV4KGUpLHI9dGhpcy5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleChuKSxpPSExO3I8dGhpcy5faW5wdXRMaW5lLmxlbmd0aDspe3ZhciBvPSExO3QuaXNEZWxldGFibGUoZSxuLHIsdC5fZGlzdGFuY2VUb2wpJiYodC5faXNEZWxldGVkW25dPVBwLkRFTEVURSxvPSEwLGk9ITApLGU9bz9yOm4sbj10LmZpbmROZXh0Tm9uRGVsZXRlZEluZGV4KGUpLHI9dC5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleChuKX1yZXR1cm4gaX0sUHAucHJvdG90eXBlLmlzU2hhbGxvd0NvbmNhdml0eT1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gWGwuY29tcHV0ZU9yaWVudGF0aW9uKHQsZSxuKT09PXRoaXMuX2FuZ2xlT3JpZW50YXRpb24mJlhsLmRpc3RhbmNlUG9pbnRMaW5lKGUsdCxuKTxyfSxQcC5wcm90b3R5cGUuaXNTaGFsbG93U2FtcGxlZD1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPU1hdGgudHJ1bmMoKHItbikvUHAuTlVNX1BUU19UT19DSEVDSyk7bzw9MCYmKG89MSk7Zm9yKHZhciBzPW47czxyO3MrPW8paWYoIXRoaXMuaXNTaGFsbG93KHQsZSx0aGlzLl9pbnB1dExpbmVbc10saSkpcmV0dXJuITE7cmV0dXJuITB9LFBwLnByb3RvdHlwZS5pc0NvbmNhdmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVhsLmNvbXB1dGVPcmllbnRhdGlvbih0LGUsbik9PT10aGlzLl9hbmdsZU9yaWVudGF0aW9uO3JldHVybiByfSxQcC5wcm90b3R5cGUuc2ltcGxpZnk9ZnVuY3Rpb24odCl7dGhpcy5fZGlzdGFuY2VUb2w9TWF0aC5hYnModCksdDwwJiYodGhpcy5fYW5nbGVPcmllbnRhdGlvbj1YbC5DTE9DS1dJU0UpLHRoaXMuX2lzRGVsZXRlZD1uZXcgQXJyYXkodGhpcy5faW5wdXRMaW5lLmxlbmd0aCkuZmlsbChudWxsKTt2YXIgZT0hMTtkb3tlPXRoaXMuZGVsZXRlU2hhbGxvd0NvbmNhdml0aWVzKCl9d2hpbGUoZSk7cmV0dXJuIHRoaXMuY29sbGFwc2VMaW5lKCl9LFBwLnByb3RvdHlwZS5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dCsxO2U8dGhpcy5faW5wdXRMaW5lLmxlbmd0aCYmdGhpcy5faXNEZWxldGVkW2VdPT09UHAuREVMRVRFOyllKys7cmV0dXJuIGV9LFBwLnByb3RvdHlwZS5pc1NoYWxsb3c9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIFhsLmRpc3RhbmNlUG9pbnRMaW5lKGUsdCxuKTxyfSxQcC5wcm90b3R5cGUuY29sbGFwc2VMaW5lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBoYyxlPTA7ZTx0aGlzLl9pbnB1dExpbmUubGVuZ3RoO2UrKyl0aGlzLl9pc0RlbGV0ZWRbZV0hPT1QcC5ERUxFVEUmJnQuYWRkKHRoaXMuX2lucHV0TGluZVtlXSk7cmV0dXJuIHQudG9Db29yZGluYXRlQXJyYXkoKX0sUHAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFBwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBQcH0sUHAuc2ltcGxpZnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFBwKHQpLnNpbXBsaWZ5KGUpfSxNcC5JTklULmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxNcC5ERUxFVEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LE1wLktFRVAuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LE1wLk5VTV9QVFNfVE9fQ0hFQ0suZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDEwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhQcCxNcCk7dmFyIExwPWZ1bmN0aW9uKCl7dGhpcy5fcHRMaXN0PW51bGwsdGhpcy5fcHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9taW5pbWltVmVydGV4RGlzdGFuY2U9MCx0aGlzLl9wdExpc3Q9bmV3IGxjfSxPcD17Q09PUkRJTkFURV9BUlJBWV9UWVBFOntjb25maWd1cmFibGU6ITB9fTtMcC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRMaXN0LnRvQXJyYXkoTHAuQ09PUkRJTkFURV9BUlJBWV9UWVBFKX0sTHAucHJvdG90eXBlLnNldFByZWNpc2lvbk1vZGVsPWZ1bmN0aW9uKHQpe3RoaXMuX3ByZWNpc2lvbk1vZGVsPXR9LExwLnByb3RvdHlwZS5hZGRQdD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdWwodCk7aWYodGhpcy5fcHJlY2lzaW9uTW9kZWwubWFrZVByZWNpc2UoZSksdGhpcy5pc1JlZHVuZGFudChlKSlyZXR1cm4gbnVsbDt0aGlzLl9wdExpc3QuYWRkKGUpfSxMcC5wcm90b3R5cGUucmV2ZXJlPWZ1bmN0aW9uKCl7fSxMcC5wcm90b3R5cGUuYWRkUHRzPWZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0aGlzLmFkZFB0KHRbbl0pO2Vsc2UgZm9yKHZhciByPXQubGVuZ3RoLTE7cj49MDtyLS0pdGhpcy5hZGRQdCh0W3JdKX0sTHAucHJvdG90eXBlLmlzUmVkdW5kYW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX3B0TGlzdC5zaXplKCk8MSlyZXR1cm4hMTt2YXIgZT10aGlzLl9wdExpc3QuZ2V0KHRoaXMuX3B0TGlzdC5zaXplKCktMSk7cmV0dXJuIHQuZGlzdGFuY2UoZSk8dGhpcy5fbWluaW1pbVZlcnRleERpc3RhbmNlfSxMcC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IF9oKS5jcmVhdGVMaW5lU3RyaW5nKHRoaXMuZ2V0Q29vcmRpbmF0ZXMoKSkudG9TdHJpbmcoKX0sTHAucHJvdG90eXBlLmNsb3NlUmluZz1mdW5jdGlvbigpe2lmKHRoaXMuX3B0TGlzdC5zaXplKCk8MSlyZXR1cm4gbnVsbDt2YXIgdD1uZXcgdWwodGhpcy5fcHRMaXN0LmdldCgwKSksZT10aGlzLl9wdExpc3QuZ2V0KHRoaXMuX3B0TGlzdC5zaXplKCktMSk7aWYodC5lcXVhbHMoZSkpcmV0dXJuIG51bGw7dGhpcy5fcHRMaXN0LmFkZCh0KX0sTHAucHJvdG90eXBlLnNldE1pbmltdW1WZXJ0ZXhEaXN0YW5jZT1mdW5jdGlvbih0KXt0aGlzLl9taW5pbWltVmVydGV4RGlzdGFuY2U9dH0sTHAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LExwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBMcH0sT3AuQ09PUkRJTkFURV9BUlJBWV9UWVBFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgQXJyYXkoMCkuZmlsbChudWxsKX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTHAsT3ApO3ZhciBScD1mdW5jdGlvbigpe30sVHA9e1BJX1RJTUVTXzI6e2NvbmZpZ3VyYWJsZTohMH0sUElfT1ZFUl8yOntjb25maWd1cmFibGU6ITB9LFBJX09WRVJfNDp7Y29uZmlndXJhYmxlOiEwfSxDT1VOVEVSQ0xPQ0tXSVNFOntjb25maWd1cmFibGU6ITB9LENMT0NLV0lTRTp7Y29uZmlndXJhYmxlOiEwfSxOT05FOntjb25maWd1cmFibGU6ITB9fTtScC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUnAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFJwfSxScC50b0RlZ3JlZXM9ZnVuY3Rpb24odCl7cmV0dXJuIDE4MCp0L01hdGguUEl9LFJwLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtmb3IoO3Q+TWF0aC5QSTspdC09UnAuUElfVElNRVNfMjtmb3IoO3Q8PS1NYXRoLlBJOyl0Kz1ScC5QSV9USU1FU18yO3JldHVybiB0fSxScC5hbmdsZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIE1hdGguYXRhbjIodC55LHQueCl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPW4ueC1lLngsaT1uLnktZS55O3JldHVybiBNYXRoLmF0YW4yKGkscil9fSxScC5pc0FjdXRlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LngtZS54LGk9dC55LWUueTtyZXR1cm4gcioobi54LWUueCkraSoobi55LWUueSk+MH0sUnAuaXNPYnR1c2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQueC1lLngsaT10LnktZS55O3JldHVybiByKihuLngtZS54KStpKihuLnktZS55KTwwfSxScC5pbnRlcmlvckFuZ2xlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1ScC5hbmdsZShlLHQpLGk9UnAuYW5nbGUoZSxuKTtyZXR1cm4gTWF0aC5hYnMoaS1yKX0sUnAubm9ybWFsaXplUG9zaXRpdmU9ZnVuY3Rpb24odCl7aWYodDwwKXtmb3IoO3Q8MDspdCs9UnAuUElfVElNRVNfMjt0Pj1ScC5QSV9USU1FU18yJiYodD0wKX1lbHNle2Zvcig7dD49UnAuUElfVElNRVNfMjspdC09UnAuUElfVElNRVNfMjt0PDAmJih0PTApfXJldHVybiB0fSxScC5hbmdsZUJldHdlZW49ZnVuY3Rpb24odCxlLG4pe3ZhciByPVJwLmFuZ2xlKGUsdCksaT1ScC5hbmdsZShlLG4pO3JldHVybiBScC5kaWZmKHIsaSl9LFJwLmRpZmY9ZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsO3JldHVybihuPXQ8ZT9lLXQ6dC1lKT5NYXRoLlBJJiYobj0yKk1hdGguUEktbiksbn0sUnAudG9SYWRpYW5zPWZ1bmN0aW9uKHQpe3JldHVybiB0Kk1hdGguUEkvMTgwfSxScC5nZXRUdXJuPWZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zaW4oZS10KTtyZXR1cm4gbj4wP1JwLkNPVU5URVJDTE9DS1dJU0U6bjwwP1JwLkNMT0NLV0lTRTpScC5OT05FfSxScC5hbmdsZUJldHdlZW5PcmllbnRlZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9UnAuYW5nbGUoZSx0KSxpPVJwLmFuZ2xlKGUsbiktcjtyZXR1cm4gaTw9LU1hdGguUEk/aStScC5QSV9USU1FU18yOmk+TWF0aC5QST9pLVJwLlBJX1RJTUVTXzI6aX0sVHAuUElfVElNRVNfMi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMipNYXRoLlBJfSxUcC5QSV9PVkVSXzIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguUEkvMn0sVHAuUElfT1ZFUl80LmdldD1mdW5jdGlvbigpe3JldHVybiBNYXRoLlBJLzR9LFRwLkNPVU5URVJDTE9DS1dJU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFhsLkNPVU5URVJDTE9DS1dJU0V9LFRwLkNMT0NLV0lTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gWGwuQ0xPQ0tXSVNFfSxUcC5OT05FLmdldD1mdW5jdGlvbigpe3JldHVybiBYbC5DT0xMSU5FQVJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJwLFRwKTt2YXIgQXA9ZnVuY3Rpb24gdCgpe3RoaXMuX21heEN1cnZlU2VnbWVudEVycm9yPTAsdGhpcy5fZmlsbGV0QW5nbGVRdWFudHVtPW51bGwsdGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcj0xLHRoaXMuX3NlZ0xpc3Q9bnVsbCx0aGlzLl9kaXN0YW5jZT0wLHRoaXMuX3ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fYnVmUGFyYW1zPW51bGwsdGhpcy5fbGk9bnVsbCx0aGlzLl9zMD1udWxsLHRoaXMuX3MxPW51bGwsdGhpcy5fczI9bnVsbCx0aGlzLl9zZWcwPW5ldyB2cCx0aGlzLl9zZWcxPW5ldyB2cCx0aGlzLl9vZmZzZXQwPW5ldyB2cCx0aGlzLl9vZmZzZXQxPW5ldyB2cCx0aGlzLl9zaWRlPTAsdGhpcy5faGFzTmFycm93Q29uY2F2ZUFuZ2xlPSExO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9wcmVjaXNpb25Nb2RlbD1lLHRoaXMuX2J1ZlBhcmFtcz1uLHRoaXMuX2xpPW5ldyBqbCx0aGlzLl9maWxsZXRBbmdsZVF1YW50dW09TWF0aC5QSS8yL24uZ2V0UXVhZHJhbnRTZWdtZW50cygpLG4uZ2V0UXVhZHJhbnRTZWdtZW50cygpPj04JiZuLmdldEpvaW5TdHlsZSgpPT09U3AuSk9JTl9ST1VORCYmKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3I9dC5NQVhfQ0xPU0lOR19TRUdfTEVOX0ZBQ1RPUiksdGhpcy5pbml0KHIpfSxEcD17T0ZGU0VUX1NFR01FTlRfU0VQQVJBVElPTl9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH0sSU5TSURFX1RVUk5fVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SOntjb25maWd1cmFibGU6ITB9LENVUlZFX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfSxNQVhfQ0xPU0lOR19TRUdfTEVOX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfX07QXAucHJvdG90eXBlLmFkZE5leHRTZWdtZW50PWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fczA9dGhpcy5fczEsdGhpcy5fczE9dGhpcy5fczIsdGhpcy5fczI9dCx0aGlzLl9zZWcwLnNldENvb3JkaW5hdGVzKHRoaXMuX3MwLHRoaXMuX3MxKSx0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KHRoaXMuX3NlZzAsdGhpcy5fc2lkZSx0aGlzLl9kaXN0YW5jZSx0aGlzLl9vZmZzZXQwKSx0aGlzLl9zZWcxLnNldENvb3JkaW5hdGVzKHRoaXMuX3MxLHRoaXMuX3MyKSx0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KHRoaXMuX3NlZzEsdGhpcy5fc2lkZSx0aGlzLl9kaXN0YW5jZSx0aGlzLl9vZmZzZXQxKSx0aGlzLl9zMS5lcXVhbHModGhpcy5fczIpKXJldHVybiBudWxsO3ZhciBuPVhsLmNvbXB1dGVPcmllbnRhdGlvbih0aGlzLl9zMCx0aGlzLl9zMSx0aGlzLl9zMikscj1uPT09WGwuQ0xPQ0tXSVNFJiZ0aGlzLl9zaWRlPT09U2guTEVGVHx8bj09PVhsLkNPVU5URVJDTE9DS1dJU0UmJnRoaXMuX3NpZGU9PT1TaC5SSUdIVDswPT09bj90aGlzLmFkZENvbGxpbmVhcihlKTpyP3RoaXMuYWRkT3V0c2lkZVR1cm4obixlKTp0aGlzLmFkZEluc2lkZVR1cm4obixlKX0sQXAucHJvdG90eXBlLmFkZExpbmVFbmRDYXA9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgdnAodCxlKSxyPW5ldyB2cDt0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KG4sU2guTEVGVCx0aGlzLl9kaXN0YW5jZSxyKTt2YXIgaT1uZXcgdnA7dGhpcy5jb21wdXRlT2Zmc2V0U2VnbWVudChuLFNoLlJJR0hULHRoaXMuX2Rpc3RhbmNlLGkpO3ZhciBvPWUueC10Lngscz1lLnktdC55LGE9TWF0aC5hdGFuMihzLG8pO3N3aXRjaCh0aGlzLl9idWZQYXJhbXMuZ2V0RW5kQ2FwU3R5bGUoKSl7Y2FzZSBTcC5DQVBfUk9VTkQ6dGhpcy5fc2VnTGlzdC5hZGRQdChyLnAxKSx0aGlzLmFkZEZpbGxldEFyYyhlLGErTWF0aC5QSS8yLGEtTWF0aC5QSS8yLFhsLkNMT0NLV0lTRSx0aGlzLl9kaXN0YW5jZSksdGhpcy5fc2VnTGlzdC5hZGRQdChpLnAxKTticmVhaztjYXNlIFNwLkNBUF9GTEFUOnRoaXMuX3NlZ0xpc3QuYWRkUHQoci5wMSksdGhpcy5fc2VnTGlzdC5hZGRQdChpLnAxKTticmVhaztjYXNlIFNwLkNBUF9TUVVBUkU6dmFyIHU9bmV3IHVsO3UueD1NYXRoLmFicyh0aGlzLl9kaXN0YW5jZSkqTWF0aC5jb3MoYSksdS55PU1hdGguYWJzKHRoaXMuX2Rpc3RhbmNlKSpNYXRoLnNpbihhKTt2YXIgbD1uZXcgdWwoci5wMS54K3UueCxyLnAxLnkrdS55KSxjPW5ldyB1bChpLnAxLngrdS54LGkucDEueSt1LnkpO3RoaXMuX3NlZ0xpc3QuYWRkUHQobCksdGhpcy5fc2VnTGlzdC5hZGRQdChjKX19LEFwLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWdMaXN0LmdldENvb3JkaW5hdGVzKCl9LEFwLnByb3RvdHlwZS5hZGRNaXRyZUpvaW49ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ITAsbz1udWxsO3RyeXtvPU1sLmludGVyc2VjdGlvbihlLnAwLGUucDEsbi5wMCxuLnAxKSwocjw9MD8xOm8uZGlzdGFuY2UodCkvTWF0aC5hYnMocikpPnRoaXMuX2J1ZlBhcmFtcy5nZXRNaXRyZUxpbWl0KCkmJihpPSExKX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBDbCkpdGhyb3cgdDtvPW5ldyB1bCgwLDApLGk9ITF9aT90aGlzLl9zZWdMaXN0LmFkZFB0KG8pOnRoaXMuYWRkTGltaXRlZE1pdHJlSm9pbihlLG4scix0aGlzLl9idWZQYXJhbXMuZ2V0TWl0cmVMaW1pdCgpKX0sQXAucHJvdG90eXBlLmFkZEZpbGxldENvcm5lcj1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPWUueC10Lngscz1lLnktdC55LGE9TWF0aC5hdGFuMihzLG8pLHU9bi54LXQueCxsPW4ueS10LnksYz1NYXRoLmF0YW4yKGwsdSk7cj09PVhsLkNMT0NLV0lTRT9hPD1jJiYoYSs9MipNYXRoLlBJKTphPj1jJiYoYS09MipNYXRoLlBJKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGUpLHRoaXMuYWRkRmlsbGV0QXJjKHQsYSxjLHIsaSksdGhpcy5fc2VnTGlzdC5hZGRQdChuKX0sQXAucHJvdG90eXBlLmFkZE91dHNpZGVUdXJuPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fb2Zmc2V0MC5wMS5kaXN0YW5jZSh0aGlzLl9vZmZzZXQxLnAwKTx0aGlzLl9kaXN0YW5jZSpBcC5PRkZTRVRfU0VHTUVOVF9TRVBBUkFUSU9OX0ZBQ1RPUilyZXR1cm4gdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQwLnAxKSxudWxsO3RoaXMuX2J1ZlBhcmFtcy5nZXRKb2luU3R5bGUoKT09PVNwLkpPSU5fTUlUUkU/dGhpcy5hZGRNaXRyZUpvaW4odGhpcy5fczEsdGhpcy5fb2Zmc2V0MCx0aGlzLl9vZmZzZXQxLHRoaXMuX2Rpc3RhbmNlKTp0aGlzLl9idWZQYXJhbXMuZ2V0Sm9pblN0eWxlKCk9PT1TcC5KT0lOX0JFVkVMP3RoaXMuYWRkQmV2ZWxKb2luKHRoaXMuX29mZnNldDAsdGhpcy5fb2Zmc2V0MSk6KGUmJnRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSksdGhpcy5hZGRGaWxsZXRDb3JuZXIodGhpcy5fczEsdGhpcy5fb2Zmc2V0MC5wMSx0aGlzLl9vZmZzZXQxLnAwLHQsdGhpcy5fZGlzdGFuY2UpLHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MS5wMCkpfSxBcC5wcm90b3R5cGUuY3JlYXRlU3F1YXJlPWZ1bmN0aW9uKHQpe3RoaXMuX3NlZ0xpc3QuYWRkUHQobmV3IHVsKHQueCt0aGlzLl9kaXN0YW5jZSx0LnkrdGhpcy5fZGlzdGFuY2UpKSx0aGlzLl9zZWdMaXN0LmFkZFB0KG5ldyB1bCh0LngrdGhpcy5fZGlzdGFuY2UsdC55LXRoaXMuX2Rpc3RhbmNlKSksdGhpcy5fc2VnTGlzdC5hZGRQdChuZXcgdWwodC54LXRoaXMuX2Rpc3RhbmNlLHQueS10aGlzLl9kaXN0YW5jZSkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQobmV3IHVsKHQueC10aGlzLl9kaXN0YW5jZSx0LnkrdGhpcy5fZGlzdGFuY2UpKSx0aGlzLl9zZWdMaXN0LmNsb3NlUmluZygpfSxBcC5wcm90b3R5cGUuYWRkU2VnbWVudHM9ZnVuY3Rpb24odCxlKXt0aGlzLl9zZWdMaXN0LmFkZFB0cyh0LGUpfSxBcC5wcm90b3R5cGUuYWRkRmlyc3RTZWdtZW50PWZ1bmN0aW9uKCl7dGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAwKX0sQXAucHJvdG90eXBlLmFkZExhc3RTZWdtZW50PWZ1bmN0aW9uKCl7dGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAxKX0sQXAucHJvdG90eXBlLmluaXRTaWRlU2VnbWVudHM9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX3MxPXQsdGhpcy5fczI9ZSx0aGlzLl9zaWRlPW4sdGhpcy5fc2VnMS5zZXRDb29yZGluYXRlcyh0LGUpLHRoaXMuY29tcHV0ZU9mZnNldFNlZ21lbnQodGhpcy5fc2VnMSxuLHRoaXMuX2Rpc3RhbmNlLHRoaXMuX29mZnNldDEpfSxBcC5wcm90b3R5cGUuYWRkTGltaXRlZE1pdHJlSm9pbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLl9zZWcwLnAxLG89UnAuYW5nbGUoaSx0aGlzLl9zZWcwLnAwKSxzPVJwLmFuZ2xlQmV0d2Vlbk9yaWVudGVkKHRoaXMuX3NlZzAucDAsaSx0aGlzLl9zZWcxLnAxKS8yLGE9UnAubm9ybWFsaXplKG8rcyksdT1ScC5ub3JtYWxpemUoYStNYXRoLlBJKSxsPXIqbixjPW4tbCpNYXRoLmFicyhNYXRoLnNpbihzKSksaD1pLngrbCpNYXRoLmNvcyh1KSxwPWkueStsKk1hdGguc2luKHUpLGY9bmV3IHVsKGgscCksZz1uZXcgdnAoaSxmKSxkPWcucG9pbnRBbG9uZ09mZnNldCgxLGMpLHk9Zy5wb2ludEFsb25nT2Zmc2V0KDEsLWMpO3RoaXMuX3NpZGU9PT1TaC5MRUZUPyh0aGlzLl9zZWdMaXN0LmFkZFB0KGQpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoeSkpOih0aGlzLl9zZWdMaXN0LmFkZFB0KHkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoZCkpfSxBcC5wcm90b3R5cGUuY29tcHV0ZU9mZnNldFNlZ21lbnQ9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ZT09PVNoLkxFRlQ/MTotMSxvPXQucDEueC10LnAwLngscz10LnAxLnktdC5wMC55LGE9TWF0aC5zcXJ0KG8qbytzKnMpLHU9aSpuKm8vYSxsPWkqbipzL2E7ci5wMC54PXQucDAueC1sLHIucDAueT10LnAwLnkrdSxyLnAxLng9dC5wMS54LWwsci5wMS55PXQucDEueSt1fSxBcC5wcm90b3R5cGUuYWRkRmlsbGV0QXJjPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89cj09PVhsLkNMT0NLV0lTRT8tMToxLHM9TWF0aC5hYnMoZS1uKSxhPU1hdGgudHJ1bmMocy90aGlzLl9maWxsZXRBbmdsZVF1YW50dW0rLjUpO2lmKGE8MSlyZXR1cm4gbnVsbDtmb3IodmFyIHU9cy9hLGw9MCxjPW5ldyB1bDtsPHM7KXt2YXIgaD1lK28qbDtjLng9dC54K2kqTWF0aC5jb3MoaCksYy55PXQueStpKk1hdGguc2luKGgpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoYyksbCs9dX19LEFwLnByb3RvdHlwZS5hZGRJbnNpZGVUdXJuPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0aGlzLl9vZmZzZXQwLnAwLHRoaXMuX29mZnNldDAucDEsdGhpcy5fb2Zmc2V0MS5wMCx0aGlzLl9vZmZzZXQxLnAxKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSl0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX2xpLmdldEludGVyc2VjdGlvbigwKSk7ZWxzZSBpZih0aGlzLl9oYXNOYXJyb3dDb25jYXZlQW5nbGU9ITAsdGhpcy5fb2Zmc2V0MC5wMS5kaXN0YW5jZSh0aGlzLl9vZmZzZXQxLnAwKTx0aGlzLl9kaXN0YW5jZSpBcC5JTlNJREVfVFVSTl9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1IpdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQwLnAxKTtlbHNle2lmKHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSksdGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcj4wKXt2YXIgbj1uZXcgdWwoKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IqdGhpcy5fb2Zmc2V0MC5wMS54K3RoaXMuX3MxLngpLyh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKzEpLCh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKnRoaXMuX29mZnNldDAucDEueSt0aGlzLl9zMS55KS8odGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3RvcisxKSk7dGhpcy5fc2VnTGlzdC5hZGRQdChuKTt2YXIgcj1uZXcgdWwoKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IqdGhpcy5fb2Zmc2V0MS5wMC54K3RoaXMuX3MxLngpLyh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKzEpLCh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKnRoaXMuX29mZnNldDEucDAueSt0aGlzLl9zMS55KS8odGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3RvcisxKSk7dGhpcy5fc2VnTGlzdC5hZGRQdChyKX1lbHNlIHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fczEpO3RoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MS5wMCl9fSxBcC5wcm90b3R5cGUuY3JlYXRlQ2lyY2xlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB1bCh0LngrdGhpcy5fZGlzdGFuY2UsdC55KTt0aGlzLl9zZWdMaXN0LmFkZFB0KGUpLHRoaXMuYWRkRmlsbGV0QXJjKHQsMCwyKk1hdGguUEksLTEsdGhpcy5fZGlzdGFuY2UpLHRoaXMuX3NlZ0xpc3QuY2xvc2VSaW5nKCl9LEFwLnByb3RvdHlwZS5hZGRCZXZlbEpvaW49ZnVuY3Rpb24odCxlKXt0aGlzLl9zZWdMaXN0LmFkZFB0KHQucDEpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoZS5wMCl9LEFwLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3RhbmNlPXQsdGhpcy5fbWF4Q3VydmVTZWdtZW50RXJyb3I9dCooMS1NYXRoLmNvcyh0aGlzLl9maWxsZXRBbmdsZVF1YW50dW0vMikpLHRoaXMuX3NlZ0xpc3Q9bmV3IExwLHRoaXMuX3NlZ0xpc3Quc2V0UHJlY2lzaW9uTW9kZWwodGhpcy5fcHJlY2lzaW9uTW9kZWwpLHRoaXMuX3NlZ0xpc3Quc2V0TWluaW11bVZlcnRleERpc3RhbmNlKHQqQXAuQ1VSVkVfVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SKX0sQXAucHJvdG90eXBlLmFkZENvbGxpbmVhcj1mdW5jdGlvbih0KXt0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHRoaXMuX3MwLHRoaXMuX3MxLHRoaXMuX3MxLHRoaXMuX3MyKSx0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKT49MiYmKHRoaXMuX2J1ZlBhcmFtcy5nZXRKb2luU3R5bGUoKT09PVNwLkpPSU5fQkVWRUx8fHRoaXMuX2J1ZlBhcmFtcy5nZXRKb2luU3R5bGUoKT09PVNwLkpPSU5fTUlUUkU/KHQmJnRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSksdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAwKSk6dGhpcy5hZGRGaWxsZXRDb3JuZXIodGhpcy5fczEsdGhpcy5fb2Zmc2V0MC5wMSx0aGlzLl9vZmZzZXQxLnAwLFhsLkNMT0NLV0lTRSx0aGlzLl9kaXN0YW5jZSkpfSxBcC5wcm90b3R5cGUuY2xvc2VSaW5nPWZ1bmN0aW9uKCl7dGhpcy5fc2VnTGlzdC5jbG9zZVJpbmcoKX0sQXAucHJvdG90eXBlLmhhc05hcnJvd0NvbmNhdmVBbmdsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNOYXJyb3dDb25jYXZlQW5nbGV9LEFwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxBcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQXB9LERwLk9GRlNFVF9TRUdNRU5UX1NFUEFSQVRJT05fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybi4wMDF9LERwLklOU0lERV9UVVJOX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDAxfSxEcC5DVVJWRV9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTZ9LERwLk1BWF9DTE9TSU5HX1NFR19MRU5fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybiA4MH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQXAsRHApO3ZhciBGcD1mdW5jdGlvbigpe3RoaXMuX2Rpc3RhbmNlPTAsdGhpcy5fcHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9idWZQYXJhbXM9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fcHJlY2lzaW9uTW9kZWw9dCx0aGlzLl9idWZQYXJhbXM9ZX07RnAucHJvdG90eXBlLmdldE9mZnNldEN1cnZlPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fZGlzdGFuY2U9ZSwwPT09ZSlyZXR1cm4gbnVsbDt2YXIgbj1lPDAscj1NYXRoLmFicyhlKSxpPXRoaXMuZ2V0U2VnR2VuKHIpO3QubGVuZ3RoPD0xP3RoaXMuY29tcHV0ZVBvaW50Q3VydmUodFswXSxpKTp0aGlzLmNvbXB1dGVPZmZzZXRDdXJ2ZSh0LG4saSk7dmFyIG89aS5nZXRDb29yZGluYXRlcygpO3JldHVybiBuJiZwYy5yZXZlcnNlKG8pLG99LEZwLnByb3RvdHlwZS5jb21wdXRlU2luZ2xlU2lkZWRCdWZmZXJDdXJ2ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5zaW1wbGlmeVRvbGVyYW5jZSh0aGlzLl9kaXN0YW5jZSk7aWYoZSl7bi5hZGRTZWdtZW50cyh0LCEwKTt2YXIgaT1QcC5zaW1wbGlmeSh0LC1yKSxvPWkubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGlbb10saVtvLTFdLFNoLkxFRlQpLG4uYWRkRmlyc3RTZWdtZW50KCk7Zm9yKHZhciBzPW8tMjtzPj0wO3MtLSluLmFkZE5leHRTZWdtZW50KGlbc10sITApfWVsc2V7bi5hZGRTZWdtZW50cyh0LCExKTt2YXIgYT1QcC5zaW1wbGlmeSh0LHIpLHU9YS5sZW5ndGgtMTtuLmluaXRTaWRlU2VnbWVudHMoYVswXSxhWzFdLFNoLkxFRlQpLG4uYWRkRmlyc3RTZWdtZW50KCk7Zm9yKHZhciBsPTI7bDw9dTtsKyspbi5hZGROZXh0U2VnbWVudChhW2xdLCEwKX1uLmFkZExhc3RTZWdtZW50KCksbi5jbG9zZVJpbmcoKX0sRnAucHJvdG90eXBlLmNvbXB1dGVSaW5nQnVmZmVyQ3VydmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuc2ltcGxpZnlUb2xlcmFuY2UodGhpcy5fZGlzdGFuY2UpO2U9PT1TaC5SSUdIVCYmKHI9LXIpO3ZhciBpPVBwLnNpbXBsaWZ5KHQsciksbz1pLmxlbmd0aC0xO24uaW5pdFNpZGVTZWdtZW50cyhpW28tMV0saVswXSxlKTtmb3IodmFyIHM9MTtzPD1vO3MrKyl7dmFyIGE9MSE9PXM7bi5hZGROZXh0U2VnbWVudChpW3NdLGEpfW4uY2xvc2VSaW5nKCl9LEZwLnByb3RvdHlwZS5jb21wdXRlTGluZUJ1ZmZlckN1cnZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5zaW1wbGlmeVRvbGVyYW5jZSh0aGlzLl9kaXN0YW5jZSkscj1QcC5zaW1wbGlmeSh0LG4pLGk9ci5sZW5ndGgtMTtlLmluaXRTaWRlU2VnbWVudHMoclswXSxyWzFdLFNoLkxFRlQpO2Zvcih2YXIgbz0yO288PWk7bysrKWUuYWRkTmV4dFNlZ21lbnQocltvXSwhMCk7ZS5hZGRMYXN0U2VnbWVudCgpLGUuYWRkTGluZUVuZENhcChyW2ktMV0scltpXSk7dmFyIHM9UHAuc2ltcGxpZnkodCwtbiksYT1zLmxlbmd0aC0xO2UuaW5pdFNpZGVTZWdtZW50cyhzW2FdLHNbYS0xXSxTaC5MRUZUKTtmb3IodmFyIHU9YS0yO3U+PTA7dS0tKWUuYWRkTmV4dFNlZ21lbnQoc1t1XSwhMCk7ZS5hZGRMYXN0U2VnbWVudCgpLGUuYWRkTGluZUVuZENhcChzWzFdLHNbMF0pLGUuY2xvc2VSaW5nKCl9LEZwLnByb3RvdHlwZS5jb21wdXRlUG9pbnRDdXJ2ZT1mdW5jdGlvbih0LGUpe3N3aXRjaCh0aGlzLl9idWZQYXJhbXMuZ2V0RW5kQ2FwU3R5bGUoKSl7Y2FzZSBTcC5DQVBfUk9VTkQ6ZS5jcmVhdGVDaXJjbGUodCk7YnJlYWs7Y2FzZSBTcC5DQVBfU1FVQVJFOmUuY3JlYXRlU3F1YXJlKHQpfX0sRnAucHJvdG90eXBlLmdldExpbmVDdXJ2ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2Rpc3RhbmNlPWUsZTwwJiYhdGhpcy5fYnVmUGFyYW1zLmlzU2luZ2xlU2lkZWQoKSlyZXR1cm4gbnVsbDtpZigwPT09ZSlyZXR1cm4gbnVsbDt2YXIgbj1NYXRoLmFicyhlKSxyPXRoaXMuZ2V0U2VnR2VuKG4pO2lmKHQubGVuZ3RoPD0xKXRoaXMuY29tcHV0ZVBvaW50Q3VydmUodFswXSxyKTtlbHNlIGlmKHRoaXMuX2J1ZlBhcmFtcy5pc1NpbmdsZVNpZGVkKCkpe3ZhciBpPWU8MDt0aGlzLmNvbXB1dGVTaW5nbGVTaWRlZEJ1ZmZlckN1cnZlKHQsaSxyKX1lbHNlIHRoaXMuY29tcHV0ZUxpbmVCdWZmZXJDdXJ2ZSh0LHIpO3JldHVybiByLmdldENvb3JkaW5hdGVzKCl9LEZwLnByb3RvdHlwZS5nZXRCdWZmZXJQYXJhbWV0ZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1ZlBhcmFtc30sRnAucHJvdG90eXBlLnNpbXBsaWZ5VG9sZXJhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuX2J1ZlBhcmFtcy5nZXRTaW1wbGlmeUZhY3RvcigpfSxGcC5wcm90b3R5cGUuZ2V0UmluZ0N1cnZlPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLl9kaXN0YW5jZT1uLHQubGVuZ3RoPD0yKXJldHVybiB0aGlzLmdldExpbmVDdXJ2ZSh0LG4pO2lmKDA9PT1uKXJldHVybiBGcC5jb3B5Q29vcmRpbmF0ZXModCk7dmFyIHI9dGhpcy5nZXRTZWdHZW4obik7cmV0dXJuIHRoaXMuY29tcHV0ZVJpbmdCdWZmZXJDdXJ2ZSh0LGUsciksci5nZXRDb29yZGluYXRlcygpfSxGcC5wcm90b3R5cGUuY29tcHV0ZU9mZnNldEN1cnZlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnNpbXBsaWZ5VG9sZXJhbmNlKHRoaXMuX2Rpc3RhbmNlKTtpZihlKXt2YXIgaT1QcC5zaW1wbGlmeSh0LC1yKSxvPWkubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGlbb10saVtvLTFdLFNoLkxFRlQpLG4uYWRkRmlyc3RTZWdtZW50KCk7Zm9yKHZhciBzPW8tMjtzPj0wO3MtLSluLmFkZE5leHRTZWdtZW50KGlbc10sITApfWVsc2V7dmFyIGE9UHAuc2ltcGxpZnkodCxyKSx1PWEubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGFbMF0sYVsxXSxTaC5MRUZUKSxuLmFkZEZpcnN0U2VnbWVudCgpO2Zvcih2YXIgbD0yO2w8PXU7bCsrKW4uYWRkTmV4dFNlZ21lbnQoYVtsXSwhMCl9bi5hZGRMYXN0U2VnbWVudCgpfSxGcC5wcm90b3R5cGUuZ2V0U2VnR2VuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQXAodGhpcy5fcHJlY2lzaW9uTW9kZWwsdGhpcy5fYnVmUGFyYW1zLHQpfSxGcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRnAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEZwfSxGcC5jb3B5Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT1uZXcgdWwodFtuXSk7cmV0dXJuIGV9O3ZhciBrcD1mdW5jdGlvbigpe3RoaXMuX3N1YmdyYXBocz1udWxsLHRoaXMuX3NlZz1uZXcgdnAsdGhpcy5fY2dhPW5ldyBYbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fc3ViZ3JhcGhzPXR9LEdwPXtEZXB0aFNlZ21lbnQ6e2NvbmZpZ3VyYWJsZTohMH19O2twLnByb3RvdHlwZS5maW5kU3RhYmJlZFNlZ21lbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPW5ldyBsYyxyPXRoaXMuX3N1YmdyYXBocy5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCksbz1pLmdldEVudmVsb3BlKCk7ZS55PG8uZ2V0TWluWSgpfHxlLnk+by5nZXRNYXhZKCl8fHQuZmluZFN0YWJiZWRTZWdtZW50cyhlLGkuZ2V0RGlyZWN0ZWRFZGdlcygpLG4pfXJldHVybiBufWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKWlmKGdsKGFyZ3VtZW50c1syXSxhYykmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgWGgpZm9yKHZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXSx1PWFyZ3VtZW50c1syXSxsPWEuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCksYz0wO2M8bC5sZW5ndGgtMTtjKyspe3QuX3NlZy5wMD1sW2NdLHQuX3NlZy5wMT1sW2MrMV0sdC5fc2VnLnAwLnk+dC5fc2VnLnAxLnkmJnQuX3NlZy5yZXZlcnNlKCk7dmFyIGg9TWF0aC5tYXgodC5fc2VnLnAwLngsdC5fc2VnLnAxLngpO2lmKCEoaDxzLngpJiYhKHQuX3NlZy5pc0hvcml6b250YWwoKXx8cy55PHQuX3NlZy5wMC55fHxzLnk+dC5fc2VnLnAxLnl8fFhsLmNvbXB1dGVPcmllbnRhdGlvbih0Ll9zZWcucDAsdC5fc2VnLnAxLHMpPT09WGwuUklHSFQpKXt2YXIgcD1hLmdldERlcHRoKFNoLkxFRlQpO3QuX3NlZy5wMC5lcXVhbHMobFtjXSl8fChwPWEuZ2V0RGVwdGgoU2guUklHSFQpKTt2YXIgZj1uZXcgcXAodC5fc2VnLHApO3UuYWRkKGYpfX1lbHNlIGlmKGdsKGFyZ3VtZW50c1syXSxhYykmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwmJmdsKGFyZ3VtZW50c1sxXSxhYykpZm9yKHZhciBnPWFyZ3VtZW50c1swXSxkPWFyZ3VtZW50c1sxXSx5PWFyZ3VtZW50c1syXSx2PWQuaXRlcmF0b3IoKTt2Lmhhc05leHQoKTspe3ZhciBfPXYubmV4dCgpO18uaXNGb3J3YXJkKCkmJnQuZmluZFN0YWJiZWRTZWdtZW50cyhnLF8seSl9fSxrcC5wcm90b3R5cGUuZ2V0RGVwdGg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5maW5kU3RhYmJlZFNlZ21lbnRzKHQpO3JldHVybiAwPT09ZS5zaXplKCk/MDpucC5taW4oZSkuX2xlZnREZXB0aH0sa3AucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGtwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBrcH0sR3AuRGVwdGhTZWdtZW50LmdldD1mdW5jdGlvbigpe3JldHVybiBxcH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoa3AsR3ApO3ZhciBxcD1mdW5jdGlvbigpe3RoaXMuX3Vwd2FyZFNlZz1udWxsLHRoaXMuX2xlZnREZXB0aD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl91cHdhcmRTZWc9bmV3IHZwKHQpLHRoaXMuX2xlZnREZXB0aD1lfTtxcC5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7aWYodGhpcy5fdXB3YXJkU2VnLm1pblgoKT49ZS5fdXB3YXJkU2VnLm1heFgoKSlyZXR1cm4gMTtpZih0aGlzLl91cHdhcmRTZWcubWF4WCgpPD1lLl91cHdhcmRTZWcubWluWCgpKXJldHVybi0xO3ZhciBuPXRoaXMuX3Vwd2FyZFNlZy5vcmllbnRhdGlvbkluZGV4KGUuX3Vwd2FyZFNlZyk7cmV0dXJuIDAhPT1ufHwwIT09KG49LTEqZS5fdXB3YXJkU2VnLm9yaWVudGF0aW9uSW5kZXgodGhpcy5fdXB3YXJkU2VnKSk/bjp0aGlzLl91cHdhcmRTZWcuY29tcGFyZVRvKGUuX3Vwd2FyZFNlZyl9LHFwLnByb3RvdHlwZS5jb21wYXJlWD1mdW5jdGlvbih0LGUpe3ZhciBuPXQucDAuY29tcGFyZVRvKGUucDApO3JldHVybiAwIT09bj9uOnQucDEuY29tcGFyZVRvKGUucDEpfSxxcC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXB3YXJkU2VnLnRvU3RyaW5nKCl9LHFwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpbF19LHFwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxcH07dmFyIEJwPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLnAwPXR8fG51bGwsdGhpcy5wMT1lfHxudWxsLHRoaXMucDI9bnx8bnVsbH07QnAucHJvdG90eXBlLmFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gQnAuYXJlYSh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LEJwLnByb3RvdHlwZS5zaWduZWRBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIEJwLnNpZ25lZEFyZWEodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxCcC5wcm90b3R5cGUuaW50ZXJwb2xhdGVaPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXRocm93IG5ldyBlbCgiU3VwcGxpZWQgcG9pbnQgaXMgbnVsbC4iKTtyZXR1cm4gQnAuaW50ZXJwb2xhdGVaKHQsdGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxCcC5wcm90b3R5cGUubG9uZ2VzdFNpZGVMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gQnAubG9uZ2VzdFNpZGVMZW5ndGgodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxCcC5wcm90b3R5cGUuaXNBY3V0ZT1mdW5jdGlvbigpe3JldHVybiBCcC5pc0FjdXRlKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sQnAucHJvdG90eXBlLmNpcmN1bWNlbnRyZT1mdW5jdGlvbigpe3JldHVybiBCcC5jaXJjdW1jZW50cmUodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxCcC5wcm90b3R5cGUuYXJlYTNEPWZ1bmN0aW9uKCl7cmV0dXJuIEJwLmFyZWEzRCh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LEJwLnByb3RvdHlwZS5jZW50cm9pZD1mdW5jdGlvbigpe3JldHVybiBCcC5jZW50cm9pZCh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LEJwLnByb3RvdHlwZS5pbkNlbnRyZT1mdW5jdGlvbigpe3JldHVybiBCcC5pbkNlbnRyZSh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LEJwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxCcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQnB9LEJwLmFyZWE9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLmFicygoKG4ueC10LngpKihlLnktdC55KS0oZS54LXQueCkqKG4ueS10LnkpKS8yKX0sQnAuc2lnbmVkQXJlYT1mdW5jdGlvbih0LGUsbil7cmV0dXJuKChuLngtdC54KSooZS55LXQueSktKGUueC10LngpKihuLnktdC55KSkvMn0sQnAuZGV0PWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0KnItZSpufSxCcC5pbnRlcnBvbGF0ZVo9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ZS54LG89ZS55LHM9bi54LWksYT1yLngtaSx1PW4ueS1vLGw9ci55LW8sYz1zKmwtYSp1LGg9dC54LWkscD10LnktbyxmPShsKmgtYSpwKS9jLGc9KC11KmgrcypwKS9jO3JldHVybiBlLnorZioobi56LWUueikrZyooci56LWUueil9LEJwLmxvbmdlc3RTaWRlTGVuZ3RoPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmRpc3RhbmNlKGUpLGk9ZS5kaXN0YW5jZShuKSxvPW4uZGlzdGFuY2UodCkscz1yO3JldHVybiBpPnMmJihzPWkpLG8+cyYmKHM9byksc30sQnAuaXNBY3V0ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuISFScC5pc0FjdXRlKHQsZSxuKSYmKCEhUnAuaXNBY3V0ZShlLG4sdCkmJiEhUnAuaXNBY3V0ZShuLHQsZSkpfSxCcC5jaXJjdW1jZW50cmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4ueCxpPW4ueSxvPXQueC1yLHM9dC55LWksYT1lLngtcix1PWUueS1pLGw9MipCcC5kZXQobyxzLGEsdSksYz1CcC5kZXQocyxvKm8rcypzLHUsYSphK3UqdSksaD1CcC5kZXQobyxvKm8rcypzLGEsYSphK3UqdSk7cmV0dXJuIG5ldyB1bChyLWMvbCxpK2gvbCl9LEJwLnBlcnBlbmRpY3VsYXJCaXNlY3Rvcj1mdW5jdGlvbih0LGUpe3ZhciBuPWUueC10Lngscj1lLnktdC55LGk9bmV3IE1sKHQueCtuLzIsdC55K3IvMiwxKSxvPW5ldyBNbCh0LngtcituLzIsdC55K24rci8yLDEpO3JldHVybiBuZXcgTWwoaSxvKX0sQnAuYW5nbGVCaXNlY3Rvcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS5kaXN0YW5jZSh0KSxpPXIvKHIrZS5kaXN0YW5jZShuKSksbz1uLngtdC54LHM9bi55LXQueTtyZXR1cm4gbmV3IHVsKHQueCtpKm8sdC55K2kqcyl9LEJwLmFyZWEzRD1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS54LXQueCxpPWUueS10Lnksbz1lLnotdC56LHM9bi54LXQueCxhPW4ueS10LnksdT1uLnotdC56LGw9aSp1LW8qYSxjPW8qcy1yKnUsaD1yKmEtaSpzLHA9bCpsK2MqYytoKmgsZj1NYXRoLnNxcnQocCkvMjtyZXR1cm4gZn0sQnAuY2VudHJvaWQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPSh0LngrZS54K24ueCkvMyxpPSh0LnkrZS55K24ueSkvMztyZXR1cm4gbmV3IHVsKHIsaSl9LEJwLmluQ2VudHJlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmRpc3RhbmNlKG4pLGk9dC5kaXN0YW5jZShuKSxvPXQuZGlzdGFuY2UoZSkscz1yK2krbyxhPShyKnQueCtpKmUueCtvKm4ueCkvcyx1PShyKnQueStpKmUueStvKm4ueSkvcztyZXR1cm4gbmV3IHVsKGEsdSl9O3ZhciB6cD1mdW5jdGlvbigpe3RoaXMuX2lucHV0R2VvbT1udWxsLHRoaXMuX2Rpc3RhbmNlPW51bGwsdGhpcy5fY3VydmVCdWlsZGVyPW51bGwsdGhpcy5fY3VydmVMaXN0PW5ldyBsYzt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07dGhpcy5faW5wdXRHZW9tPXQsdGhpcy5fZGlzdGFuY2U9ZSx0aGlzLl9jdXJ2ZUJ1aWxkZXI9bn07enAucHJvdG90eXBlLmFkZFBvaW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2Rpc3RhbmNlPD0wKXJldHVybiBudWxsO3ZhciBlPXQuZ2V0Q29vcmRpbmF0ZXMoKSxuPXRoaXMuX2N1cnZlQnVpbGRlci5nZXRMaW5lQ3VydmUoZSx0aGlzLl9kaXN0YW5jZSk7dGhpcy5hZGRDdXJ2ZShuLHBsLkVYVEVSSU9SLHBsLklOVEVSSU9SKX0senAucHJvdG90eXBlLmFkZFBvbHlnb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuX2Rpc3RhbmNlLHI9U2guTEVGVDt0aGlzLl9kaXN0YW5jZTwwJiYobj0tdGhpcy5fZGlzdGFuY2Uscj1TaC5SSUdIVCk7dmFyIGk9dC5nZXRFeHRlcmlvclJpbmcoKSxvPXBjLnJlbW92ZVJlcGVhdGVkUG9pbnRzKGkuZ2V0Q29vcmRpbmF0ZXMoKSk7aWYodGhpcy5fZGlzdGFuY2U8MCYmdGhpcy5pc0Vyb2RlZENvbXBsZXRlbHkoaSx0aGlzLl9kaXN0YW5jZSkpcmV0dXJuIG51bGw7aWYodGhpcy5fZGlzdGFuY2U8PTAmJm8ubGVuZ3RoPDMpcmV0dXJuIG51bGw7dGhpcy5hZGRQb2x5Z29uUmluZyhvLG4scixwbC5FWFRFUklPUixwbC5JTlRFUklPUik7Zm9yKHZhciBzPTA7czx0LmdldE51bUludGVyaW9yUmluZygpO3MrKyl7dmFyIGE9dC5nZXRJbnRlcmlvclJpbmdOKHMpLHU9cGMucmVtb3ZlUmVwZWF0ZWRQb2ludHMoYS5nZXRDb29yZGluYXRlcygpKTtlLl9kaXN0YW5jZT4wJiZlLmlzRXJvZGVkQ29tcGxldGVseShhLC1lLl9kaXN0YW5jZSl8fGUuYWRkUG9seWdvblJpbmcodSxuLFNoLm9wcG9zaXRlKHIpLHBsLklOVEVSSU9SLHBsLkVYVEVSSU9SKX19LHpwLnByb3RvdHlwZS5pc1RyaWFuZ2xlRXJvZGVkQ29tcGxldGVseT1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBCcCh0WzBdLHRbMV0sdFsyXSkscj1uLmluQ2VudHJlKCk7cmV0dXJuIFhsLmRpc3RhbmNlUG9pbnRMaW5lKHIsbi5wMCxuLnAxKTxNYXRoLmFicyhlKX0senAucHJvdG90eXBlLmFkZExpbmVTdHJpbmc9ZnVuY3Rpb24odCl7aWYodGhpcy5fZGlzdGFuY2U8PTAmJiF0aGlzLl9jdXJ2ZUJ1aWxkZXIuZ2V0QnVmZmVyUGFyYW1ldGVycygpLmlzU2luZ2xlU2lkZWQoKSlyZXR1cm4gbnVsbDt2YXIgZT1wYy5yZW1vdmVSZXBlYXRlZFBvaW50cyh0LmdldENvb3JkaW5hdGVzKCkpLG49dGhpcy5fY3VydmVCdWlsZGVyLmdldExpbmVDdXJ2ZShlLHRoaXMuX2Rpc3RhbmNlKTt0aGlzLmFkZEN1cnZlKG4scGwuRVhURVJJT1IscGwuSU5URVJJT1IpfSx6cC5wcm90b3R5cGUuYWRkQ3VydmU9ZnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PT10fHx0Lmxlbmd0aDwyKXJldHVybiBudWxsO3ZhciByPW5ldyB5cCh0LG5ldyBEaCgwLHBsLkJPVU5EQVJZLGUsbikpO3RoaXMuX2N1cnZlTGlzdC5hZGQocil9LHpwLnByb3RvdHlwZS5nZXRDdXJ2ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGQodGhpcy5faW5wdXRHZW9tKSx0aGlzLl9jdXJ2ZUxpc3R9LHpwLnByb3RvdHlwZS5hZGRQb2x5Z29uUmluZz1mdW5jdGlvbih0LGUsbixyLGkpe2lmKDA9PT1lJiZ0Lmxlbmd0aDxuaC5NSU5JTVVNX1ZBTElEX1NJWkUpcmV0dXJuIG51bGw7dmFyIG89cixzPWk7dC5sZW5ndGg+PW5oLk1JTklNVU1fVkFMSURfU0laRSYmWGwuaXNDQ1codCkmJihvPWkscz1yLG49U2gub3Bwb3NpdGUobikpO3ZhciBhPXRoaXMuX2N1cnZlQnVpbGRlci5nZXRSaW5nQ3VydmUodCxuLGUpO3RoaXMuYWRkQ3VydmUoYSxvLHMpfSx6cC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2lmKHQuaXNFbXB0eSgpKXJldHVybiBudWxsO3QgaW5zdGFuY2VvZiB0aD90aGlzLmFkZFBvbHlnb24odCk6dCBpbnN0YW5jZW9mIFpjP3RoaXMuYWRkTGluZVN0cmluZyh0KTp0IGluc3RhbmNlb2YgUWM/dGhpcy5hZGRQb2ludCh0KToodCBpbnN0YW5jZW9mIGVofHx0IGluc3RhbmNlb2YgR2N8fHQgaW5zdGFuY2VvZiByaHx8dCBpbnN0YW5jZW9mIGtjKSYmdGhpcy5hZGRDb2xsZWN0aW9uKHQpfSx6cC5wcm90b3R5cGUuaXNFcm9kZWRDb21wbGV0ZWx5PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRDb29yZGluYXRlcygpO2lmKG4ubGVuZ3RoPDQpcmV0dXJuIGU8MDtpZig0PT09bi5sZW5ndGgpcmV0dXJuIHRoaXMuaXNUcmlhbmdsZUVyb2RlZENvbXBsZXRlbHkobixlKTt2YXIgcj10LmdldEVudmVsb3BlSW50ZXJuYWwoKSxpPU1hdGgubWluKHIuZ2V0SGVpZ2h0KCksci5nZXRXaWR0aCgpKTtyZXR1cm4gZTwwJiYyKk1hdGguYWJzKGUpPml9LHpwLnByb3RvdHlwZS5hZGRDb2xsZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5nZXROdW1HZW9tZXRyaWVzKCk7ZSsrKXt2YXIgbj10LmdldEdlb21ldHJ5TihlKTt0aGlzLmFkZChuKX19LHpwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx6cC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4genB9O3ZhciBqcD1mdW5jdGlvbigpe307anAucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0KXt9LGpwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxqcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4ganB9O3ZhciBVcD1mdW5jdGlvbigpe3RoaXMuX3BhcmVudD1udWxsLHRoaXMuX2F0U3RhcnQ9bnVsbCx0aGlzLl9tYXg9bnVsbCx0aGlzLl9pbmRleD1udWxsLHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcj1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9wYXJlbnQ9dCx0aGlzLl9hdFN0YXJ0PSEwLHRoaXMuX2luZGV4PTAsdGhpcy5fbWF4PXQuZ2V0TnVtR2VvbWV0cmllcygpfTtVcC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMuX2F0U3RhcnQpcmV0dXJuIHRoaXMuX2F0U3RhcnQ9ITEsVXAuaXNBdG9taWModGhpcy5fcGFyZW50KSYmdGhpcy5faW5kZXgrKyx0aGlzLl9wYXJlbnQ7aWYobnVsbCE9PXRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcil7aWYodGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yLmhhc05leHQoKSlyZXR1cm4gdGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yLm5leHQoKTt0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3I9bnVsbH1pZih0aGlzLl9pbmRleD49dGhpcy5fbWF4KXRocm93IG5ldyB1Yzt2YXIgdD10aGlzLl9wYXJlbnQuZ2V0R2VvbWV0cnlOKHRoaXMuX2luZGV4KyspO3JldHVybiB0IGluc3RhbmNlb2Yga2M/KHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcj1uZXcgVXAodCksdGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yLm5leHQoKSk6dH0sVXAucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKX0sVXAucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9hdFN0YXJ0KXJldHVybiEwO2lmKG51bGwhPT10aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3Ipe2lmKHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCkpcmV0dXJuITA7dGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yPW51bGx9cmV0dXJuISh0aGlzLl9pbmRleD49dGhpcy5fbWF4KX0sVXAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3NjXX0sVXAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFVwfSxVcC5pc0F0b21pYz1mdW5jdGlvbih0KXtyZXR1cm4hKHQgaW5zdGFuY2VvZiBrYyl9O3ZhciBWcD1mdW5jdGlvbigpe3RoaXMuX2dlb209bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZ2VvbT10fTtWcC5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBWcC5sb2NhdGUodCx0aGlzLl9nZW9tKX0sVnAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2pwXX0sVnAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFZwfSxWcC5pc1BvaW50SW5SaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuISFlLmdldEVudmVsb3BlSW50ZXJuYWwoKS5pbnRlcnNlY3RzKHQpJiZYbC5pc1BvaW50SW5SaW5nKHQsZS5nZXRDb29yZGluYXRlcygpKX0sVnAuY29udGFpbnNQb2ludEluUG9seWdvbj1mdW5jdGlvbih0LGUpe2lmKGUuaXNFbXB0eSgpKXJldHVybiExO3ZhciBuPWUuZ2V0RXh0ZXJpb3JSaW5nKCk7aWYoIVZwLmlzUG9pbnRJblJpbmcodCxuKSlyZXR1cm4hMTtmb3IodmFyIHI9MDtyPGUuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7cisrKXt2YXIgaT1lLmdldEludGVyaW9yUmluZ04ocik7aWYoVnAuaXNQb2ludEluUmluZyh0LGkpKXJldHVybiExfXJldHVybiEwfSxWcC5jb250YWluc1BvaW50PWZ1bmN0aW9uKHQsZSl7aWYoZSBpbnN0YW5jZW9mIHRoKXJldHVybiBWcC5jb250YWluc1BvaW50SW5Qb2x5Z29uKHQsZSk7aWYoZSBpbnN0YW5jZW9mIGtjKWZvcih2YXIgbj1uZXcgVXAoZSk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihyIT09ZSYmVnAuY29udGFpbnNQb2ludCh0LHIpKXJldHVybiEwfXJldHVybiExfSxWcC5sb2NhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5pc0VtcHR5KCk/cGwuRVhURVJJT1I6VnAuY29udGFpbnNQb2ludCh0LGUpP3BsLklOVEVSSU9SOnBsLkVYVEVSSU9SfTt2YXIgWHA9ZnVuY3Rpb24oKXt0aGlzLl9lZGdlTWFwPW5ldyBDYyx0aGlzLl9lZGdlTGlzdD1udWxsLHRoaXMuX3B0SW5BcmVhTG9jYXRpb249W3BsLk5PTkUscGwuTk9ORV19O1hwLnByb3RvdHlwZS5nZXROZXh0Q1c9ZnVuY3Rpb24odCl7dGhpcy5nZXRFZGdlcygpO3ZhciBlPXRoaXMuX2VkZ2VMaXN0LmluZGV4T2YodCksbj1lLTE7cmV0dXJuIDA9PT1lJiYobj10aGlzLl9lZGdlTGlzdC5zaXplKCktMSksdGhpcy5fZWRnZUxpc3QuZ2V0KG4pfSxYcC5wcm90b3R5cGUucHJvcGFnYXRlU2lkZUxhYmVscz1mdW5jdGlvbih0KXtmb3IodmFyIGU9cGwuTk9ORSxuPXRoaXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLmdldExhYmVsKCk7ci5pc0FyZWEodCkmJnIuZ2V0TG9jYXRpb24odCxTaC5MRUZUKSE9PXBsLk5PTkUmJihlPXIuZ2V0TG9jYXRpb24odCxTaC5MRUZUKSl9aWYoZT09PXBsLk5PTkUpcmV0dXJuIG51bGw7Zm9yKHZhciBpPWUsbz10aGlzLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKSxhPXMuZ2V0TGFiZWwoKTtpZihhLmdldExvY2F0aW9uKHQsU2guT04pPT09cGwuTk9ORSYmYS5zZXRMb2NhdGlvbih0LFNoLk9OLGkpLGEuaXNBcmVhKHQpKXt2YXIgdT1hLmdldExvY2F0aW9uKHQsU2guTEVGVCksbD1hLmdldExvY2F0aW9uKHQsU2guUklHSFQpO2lmKGwhPT1wbC5OT05FKXtpZihsIT09aSl0aHJvdyBuZXcgT2goInNpZGUgbG9jYXRpb24gY29uZmxpY3QiLHMuZ2V0Q29vcmRpbmF0ZSgpKTt1PT09cGwuTk9ORSYmcWwuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoImZvdW5kIHNpbmdsZSBudWxsIHNpZGUgKGF0ICIrcy5nZXRDb29yZGluYXRlKCkrIikiKSxpPXV9ZWxzZSBxbC5pc1RydWUoYS5nZXRMb2NhdGlvbih0LFNoLkxFRlQpPT09cGwuTk9ORSwiZm91bmQgc2luZ2xlIG51bGwgc2lkZSIpLGEuc2V0TG9jYXRpb24odCxTaC5SSUdIVCxpKSxhLnNldExvY2F0aW9uKHQsU2guTEVGVCxpKX19fSxYcC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaXRlcmF0b3IoKTtyZXR1cm4gdC5oYXNOZXh0KCk/dC5uZXh0KCkuZ2V0Q29vcmRpbmF0ZSgpOm51bGx9LFhwLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXtQbC5vdXQucHJpbnRsbigiRWRnZUVuZFN0YXI6ICAgIit0aGlzLmdldENvb3JkaW5hdGUoKSk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLnByaW50KHQpfX0sWHAucHJvdG90eXBlLmlzQXJlYUxhYmVsc0NvbnNpc3RlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcHV0ZUVkZ2VFbmRMYWJlbHModC5nZXRCb3VuZGFyeU5vZGVSdWxlKCkpLHRoaXMuY2hlY2tBcmVhTGFiZWxzQ29uc2lzdGVudCgwKX0sWHAucHJvdG90eXBlLmNoZWNrQXJlYUxhYmVsc0NvbnNpc3RlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRFZGdlcygpO2lmKGUuc2l6ZSgpPD0wKXJldHVybiEwO3ZhciBuPWUuc2l6ZSgpLTEscj1lLmdldChuKS5nZXRMYWJlbCgpLmdldExvY2F0aW9uKHQsU2guTEVGVCk7cWwuaXNUcnVlKHIhPT1wbC5OT05FLCJGb3VuZCB1bmxhYmVsbGVkIGFyZWEgZWRnZSIpO2Zvcih2YXIgaT1yLG89dGhpcy5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCkuZ2V0TGFiZWwoKTtxbC5pc1RydWUocy5pc0FyZWEodCksIkZvdW5kIG5vbi1hcmVhIGVkZ2UiKTt2YXIgYT1zLmdldExvY2F0aW9uKHQsU2guTEVGVCksdT1zLmdldExvY2F0aW9uKHQsU2guUklHSFQpO2lmKGE9PT11KXJldHVybiExO2lmKHUhPT1pKXJldHVybiExO2k9YX1yZXR1cm4hMH0sWHAucHJvdG90eXBlLmZpbmRJbmRleD1mdW5jdGlvbih0KXt0aGlzLml0ZXJhdG9yKCk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9lZGdlTGlzdC5zaXplKCk7ZSsrKXtpZih0aGlzLl9lZGdlTGlzdC5nZXQoZSk9PT10KXJldHVybiBlfXJldHVybi0xfSxYcC5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFZGdlcygpLml0ZXJhdG9yKCl9LFhwLnByb3RvdHlwZS5nZXRFZGdlcz1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fZWRnZUxpc3QmJih0aGlzLl9lZGdlTGlzdD1uZXcgbGModGhpcy5fZWRnZU1hcC52YWx1ZXMoKSkpLHRoaXMuX2VkZ2VMaXN0fSxYcC5wcm90b3R5cGUuZ2V0TG9jYXRpb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLl9wdEluQXJlYUxvY2F0aW9uW3RdPT09cGwuTk9ORSYmKHRoaXMuX3B0SW5BcmVhTG9jYXRpb25bdF09VnAubG9jYXRlKGUsblt0XS5nZXRHZW9tZXRyeSgpKSksdGhpcy5fcHRJbkFyZWFMb2NhdGlvblt0XX0sWHAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHZsO3QuYXBwZW5kKCJFZGdlRW5kU3RhcjogICAiK3RoaXMuZ2V0Q29vcmRpbmF0ZSgpKSx0LmFwcGVuZCgiXG4iKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dC5hcHBlbmQobiksdC5hcHBlbmQoIlxuIil9cmV0dXJuIHQudG9TdHJpbmcoKX0sWHAucHJvdG90eXBlLmNvbXB1dGVFZGdlRW5kTGFiZWxzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5jb21wdXRlTGFiZWwodCl9fSxYcC5wcm90b3R5cGUuY29tcHV0ZUxhYmVsbGluZz1mdW5jdGlvbih0KXt0aGlzLmNvbXB1dGVFZGdlRW5kTGFiZWxzKHRbMF0uZ2V0Qm91bmRhcnlOb2RlUnVsZSgpKSx0aGlzLnByb3BhZ2F0ZVNpZGVMYWJlbHMoMCksdGhpcy5wcm9wYWdhdGVTaWRlTGFiZWxzKDEpO2Zvcih2YXIgZT1bITEsITFdLG49dGhpcy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOylmb3IodmFyIHI9bi5uZXh0KCkuZ2V0TGFiZWwoKSxpPTA7aTwyO2krKylyLmlzTGluZShpKSYmci5nZXRMb2NhdGlvbihpKT09PXBsLkJPVU5EQVJZJiYoZVtpXT0hMCk7Zm9yKHZhciBvPXRoaXMuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspZm9yKHZhciBzPW8ubmV4dCgpLGE9cy5nZXRMYWJlbCgpLHU9MDt1PDI7dSsrKWlmKGEuaXNBbnlOdWxsKHUpKXt2YXIgbD1wbC5OT05FO2lmKGVbdV0pbD1wbC5FWFRFUklPUjtlbHNle3ZhciBjPXMuZ2V0Q29vcmRpbmF0ZSgpO2w9dGhpcy5nZXRMb2NhdGlvbih1LGMsdCl9YS5zZXRBbGxMb2NhdGlvbnNJZk51bGwodSxsKX19LFhwLnByb3RvdHlwZS5nZXREZWdyZWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZU1hcC5zaXplKCl9LFhwLnByb3RvdHlwZS5pbnNlcnRFZGdlRW5kPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZWRnZU1hcC5wdXQodCxlKSx0aGlzLl9lZGdlTGlzdD1udWxsfSxYcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWHAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFhwfTt2YXIgWXA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3Q9bnVsbCx0aGlzLl9sYWJlbD1udWxsLHRoaXMuX1NDQU5OSU5HX0ZPUl9JTkNPTUlORz0xLHRoaXMuX0xJTktJTkdfVE9fT1VUR09JTkc9Mn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUubGlua1Jlc3VsdERpcmVjdGVkRWRnZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuZ2V0UmVzdWx0QXJlYUVkZ2VzKCk7Zm9yKHZhciBlPW51bGwsbj1udWxsLHI9dGhpcy5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HLGk9MDtpPHRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdC5zaXplKCk7aSsrKXt2YXIgbz10Ll9yZXN1bHRBcmVhRWRnZUxpc3QuZ2V0KGkpLHM9by5nZXRTeW0oKTtpZihvLmdldExhYmVsKCkuaXNBcmVhKCkpc3dpdGNoKG51bGw9PT1lJiZvLmlzSW5SZXN1bHQoKSYmKGU9bykscil7Y2FzZSB0Ll9TQ0FOTklOR19GT1JfSU5DT01JTkc6aWYoIXMuaXNJblJlc3VsdCgpKWNvbnRpbnVlO249cyxyPXQuX0xJTktJTkdfVE9fT1VUR09JTkc7YnJlYWs7Y2FzZSB0Ll9MSU5LSU5HX1RPX09VVEdPSU5HOmlmKCFvLmlzSW5SZXN1bHQoKSljb250aW51ZTtuLnNldE5leHQobykscj10Ll9TQ0FOTklOR19GT1JfSU5DT01JTkd9fWlmKHI9PT10aGlzLl9MSU5LSU5HX1RPX09VVEdPSU5HKXtpZihudWxsPT09ZSl0aHJvdyBuZXcgT2goIm5vIG91dGdvaW5nIGRpckVkZ2UgZm91bmQiLHRoaXMuZ2V0Q29vcmRpbmF0ZSgpKTtxbC5pc1RydWUoZS5pc0luUmVzdWx0KCksInVuYWJsZSB0byBsaW5rIGxhc3QgaW5jb21pbmcgZGlyRWRnZSIpLG4uc2V0TmV4dChlKX19LGUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0KXt2YXIgZT10O3RoaXMuaW5zZXJ0RWRnZUVuZChlLGUpfSxlLnByb3RvdHlwZS5nZXRSaWdodG1vc3RFZGdlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRFZGdlcygpLGU9dC5zaXplKCk7aWYoZTwxKXJldHVybiBudWxsO3ZhciBuPXQuZ2V0KDApO2lmKDE9PT1lKXJldHVybiBuO3ZhciByPXQuZ2V0KGUtMSksaT1uLmdldFF1YWRyYW50KCksbz1yLmdldFF1YWRyYW50KCk7cmV0dXJuIGpoLmlzTm9ydGhlcm4oaSkmJmpoLmlzTm9ydGhlcm4obyk/bjpqaC5pc05vcnRoZXJuKGkpfHxqaC5pc05vcnRoZXJuKG8pPzAhPT1uLmdldER5KCk/bjowIT09ci5nZXREeSgpP3I6KHFsLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJmb3VuZCB0d28gaG9yaXpvbnRhbCBlZGdlcyBpbmNpZGVudCBvbiBub2RlIiksbnVsbCk6cn0sZS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7UGwub3V0LnByaW50bG4oIkRpcmVjdGVkRWRnZVN0YXI6ICIrdGhpcy5nZXRDb29yZGluYXRlKCkpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0LnByaW50KCJvdXQgIiksbi5wcmludCh0KSx0LnByaW50bG4oKSx0LnByaW50KCJpbiAiKSxuLmdldFN5bSgpLnByaW50KHQpLHQucHJpbnRsbigpfX0sZS5wcm90b3R5cGUuZ2V0UmVzdWx0QXJlYUVkZ2VzPWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdClyZXR1cm4gdGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0O3RoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdD1uZXcgbGM7Zm9yKHZhciB0PXRoaXMuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpOyhlLmlzSW5SZXN1bHQoKXx8ZS5nZXRTeW0oKS5pc0luUmVzdWx0KCkpJiZ0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3QuYWRkKGUpfXJldHVybiB0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3R9LGUucHJvdG90eXBlLnVwZGF0ZUxhYmVsbGluZz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkuZ2V0TGFiZWwoKTtuLnNldEFsbExvY2F0aW9uc0lmTnVsbCgwLHQuZ2V0TG9jYXRpb24oMCkpLG4uc2V0QWxsTG9jYXRpb25zSWZOdWxsKDEsdC5nZXRMb2NhdGlvbigxKSl9fSxlLnByb3RvdHlwZS5saW5rQWxsRGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe3RoaXMuZ2V0RWRnZXMoKTtmb3IodmFyIHQ9bnVsbCxlPW51bGwsbj10aGlzLl9lZGdlTGlzdC5zaXplKCktMTtuPj0wO24tLSl7dmFyIHI9dGhpcy5fZWRnZUxpc3QuZ2V0KG4pLGk9ci5nZXRTeW0oKTtudWxsPT09ZSYmKGU9aSksbnVsbCE9PXQmJmkuc2V0TmV4dCh0KSx0PXJ9ZS5zZXROZXh0KHQpfSxlLnByb3RvdHlwZS5jb21wdXRlRGVwdGhzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49dGhpcy5maW5kSW5kZXgoZSkscj1lLmdldERlcHRoKFNoLkxFRlQpLGk9ZS5nZXREZXB0aChTaC5SSUdIVCksbz10aGlzLmNvbXB1dGVEZXB0aHMobisxLHRoaXMuX2VkZ2VMaXN0LnNpemUoKSxyKSxzPXRoaXMuY29tcHV0ZURlcHRocygwLG4sbyk7aWYocyE9PWkpdGhyb3cgbmV3IE9oKCJkZXB0aCBtaXNtYXRjaCBhdCAiK2UuZ2V0Q29vcmRpbmF0ZSgpKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdLGM9bCxoPWE7aDx1O2grKyl7dmFyIHA9dC5fZWRnZUxpc3QuZ2V0KGgpO3Auc2V0RWRnZURlcHRocyhTaC5SSUdIVCxjKSxjPXAuZ2V0RGVwdGgoU2guTEVGVCl9cmV0dXJuIGN9fSxlLnByb3RvdHlwZS5tZXJnZVN5bUxhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKTtlLmdldExhYmVsKCkubWVyZ2UoZS5nZXRTeW0oKS5nZXRMYWJlbCgpKX19LGUucHJvdG90eXBlLmxpbmtNaW5pbWFsRGlyZWN0ZWRFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPW51bGwscj1udWxsLGk9dGhpcy5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HLG89dGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0LnNpemUoKS0xO28+PTA7by0tKXt2YXIgcz1lLl9yZXN1bHRBcmVhRWRnZUxpc3QuZ2V0KG8pLGE9cy5nZXRTeW0oKTtzd2l0Y2gobnVsbD09PW4mJnMuZ2V0RWRnZVJpbmcoKT09PXQmJihuPXMpLGkpe2Nhc2UgZS5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HOmlmKGEuZ2V0RWRnZVJpbmcoKSE9PXQpY29udGludWU7cj1hLGk9ZS5fTElOS0lOR19UT19PVVRHT0lORzticmVhaztjYXNlIGUuX0xJTktJTkdfVE9fT1VUR09JTkc6aWYocy5nZXRFZGdlUmluZygpIT09dCljb250aW51ZTtyLnNldE5leHRNaW4ocyksaT1lLl9TQ0FOTklOR19GT1JfSU5DT01JTkd9fWk9PT10aGlzLl9MSU5LSU5HX1RPX09VVEdPSU5HJiYocWwuaXNUcnVlKG51bGwhPT1uLCJmb3VuZCBudWxsIGZvciBmaXJzdCBvdXRnb2luZyBkaXJFZGdlIikscWwuaXNUcnVlKG4uZ2V0RWRnZVJpbmcoKT09PXQsInVuYWJsZSB0byBsaW5rIGxhc3QgaW5jb21pbmcgZGlyRWRnZSIpLHIuc2V0TmV4dE1pbihuKSl9LGUucHJvdG90eXBlLmdldE91dGdvaW5nRGVncmVlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD0wLGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7bi5pc0luUmVzdWx0KCkmJnQrK31yZXR1cm4gdH1pZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciByPWFyZ3VtZW50c1swXSxpPTAsbz10aGlzLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKTtzLmdldEVkZ2VSaW5nKCk9PT1yJiZpKyt9cmV0dXJuIGl9fSxlLnByb3RvdHlwZS5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0sZS5wcm90b3R5cGUuZmluZENvdmVyZWRMaW5lRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9cGwuTk9ORSxlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLHI9bi5nZXRTeW0oKTtpZighbi5pc0xpbmVFZGdlKCkpe2lmKG4uaXNJblJlc3VsdCgpKXt0PXBsLklOVEVSSU9SO2JyZWFrfWlmKHIuaXNJblJlc3VsdCgpKXt0PXBsLkVYVEVSSU9SO2JyZWFrfX19aWYodD09PXBsLk5PTkUpcmV0dXJuIG51bGw7Zm9yKHZhciBpPXQsbz10aGlzLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKSxhPXMuZ2V0U3ltKCk7cy5pc0xpbmVFZGdlKCk/cy5nZXRFZGdlKCkuc2V0Q292ZXJlZChpPT09cGwuSU5URVJJT1IpOihzLmlzSW5SZXN1bHQoKSYmKGk9cGwuRVhURVJJT1IpLGEuaXNJblJlc3VsdCgpJiYoaT1wbC5JTlRFUklPUikpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUxhYmVsbGluZz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5jb21wdXRlTGFiZWxsaW5nLmNhbGwodGhpcyxlKSx0aGlzLl9sYWJlbD1uZXcgRGgocGwuTk9ORSk7Zm9yKHZhciBuPXRoaXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspZm9yKHZhciByPW4ubmV4dCgpLmdldEVkZ2UoKS5nZXRMYWJlbCgpLGk9MDtpPDI7aSsrKXt2YXIgbz1yLmdldExvY2F0aW9uKGkpO28hPT1wbC5JTlRFUklPUiYmbyE9PXBsLkJPVU5EQVJZfHx0aGlzLl9sYWJlbC5zZXRMb2NhdGlvbihpLHBsLklOVEVSSU9SKX19LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KFhwKSxIcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNyZWF0ZU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBCaCh0LG5ldyBZcCl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KFloKSxXcD1mdW5jdGlvbiB0KCl7dGhpcy5fcHRzPW51bGwsdGhpcy5fb3JpZW50YXRpb249bnVsbDt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fcHRzPWUsdGhpcy5fb3JpZW50YXRpb249dC5vcmllbnRhdGlvbihlKX07V3AucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiBXcC5jb21wYXJlT3JpZW50ZWQodGhpcy5fcHRzLHRoaXMuX29yaWVudGF0aW9uLGUuX3B0cyxlLl9vcmllbnRhdGlvbil9LFdwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpbF19LFdwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBXcH0sV3Aub3JpZW50YXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT1wYy5pbmNyZWFzaW5nRGlyZWN0aW9uKHQpfSxXcC5jb21wYXJlT3JpZW50ZWQ9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPWU/MTotMSxvPXI/MTotMSxzPWU/dC5sZW5ndGg6LTEsYT1yP24ubGVuZ3RoOi0xLHU9ZT8wOnQubGVuZ3RoLTEsbD1yPzA6bi5sZW5ndGgtMTs7KXt2YXIgYz10W3VdLmNvbXBhcmVUbyhuW2xdKTtpZigwIT09YylyZXR1cm4gYzt2YXIgaD0odSs9aSk9PT1zLHA9KGwrPW8pPT09YTtpZihoJiYhcClyZXR1cm4tMTtpZighaCYmcClyZXR1cm4gMTtpZihoJiZwKXJldHVybiAwfX07dmFyIEpwPWZ1bmN0aW9uKCl7dGhpcy5fZWRnZXM9bmV3IGxjLHRoaXMuX29jYU1hcD1uZXcgQ2N9O0pwLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50KCJNVUxUSUxJTkVTVFJJTkcgKCAiKTtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2VzLnNpemUoKTtlKyspe3ZhciBuPXRoaXMuX2VkZ2VzLmdldChlKTtlPjAmJnQucHJpbnQoIiwiKSx0LnByaW50KCIoIik7Zm9yKHZhciByPW4uZ2V0Q29vcmRpbmF0ZXMoKSxpPTA7aTxyLmxlbmd0aDtpKyspaT4wJiZ0LnByaW50KCIsIiksdC5wcmludChyW2ldLngrIiAiK3JbaV0ueSk7dC5wcmludGxuKCIpIil9dC5wcmludCgiKSAgIil9LEpwLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspdGhpcy5hZGQoZS5uZXh0KCkpfSxKcC5wcm90b3R5cGUuZmluZEVkZ2VJbmRleD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2VzLnNpemUoKTtlKyspaWYodGhpcy5fZWRnZXMuZ2V0KGUpLmVxdWFscyh0KSlyZXR1cm4gZTtyZXR1cm4tMX0sSnAucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzLml0ZXJhdG9yKCl9LEpwLnByb3RvdHlwZS5nZXRFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlc30sSnAucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZWRnZXMuZ2V0KHQpfSxKcC5wcm90b3R5cGUuZmluZEVxdWFsRWRnZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgV3AodC5nZXRDb29yZGluYXRlcygpKTtyZXR1cm4gdGhpcy5fb2NhTWFwLmdldChlKX0sSnAucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt0aGlzLl9lZGdlcy5hZGQodCk7dmFyIGU9bmV3IFdwKHQuZ2V0Q29vcmRpbmF0ZXMoKSk7dGhpcy5fb2NhTWFwLnB1dChlLHQpfSxKcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSnAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEpwfTt2YXIgWnA9ZnVuY3Rpb24oKXt9O1pwLnByb3RvdHlwZS5wcm9jZXNzSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbixyKXt9LFpwLnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXt9LFpwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxacC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWnB9O3ZhciBLcD1mdW5jdGlvbigpe3RoaXMuX2hhc0ludGVyc2VjdGlvbj0hMSx0aGlzLl9oYXNQcm9wZXI9ITEsdGhpcy5faGFzUHJvcGVySW50ZXJpb3I9ITEsdGhpcy5faGFzSW50ZXJpb3I9ITEsdGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9bnVsbCx0aGlzLl9saT1udWxsLHRoaXMuX2lzU2VsZkludGVyc2VjdGlvbj1udWxsLHRoaXMubnVtSW50ZXJzZWN0aW9ucz0wLHRoaXMubnVtSW50ZXJpb3JJbnRlcnNlY3Rpb25zPTAsdGhpcy5udW1Qcm9wZXJJbnRlcnNlY3Rpb25zPTAsdGhpcy5udW1UZXN0cz0wO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9saT10fTtLcC5wcm90b3R5cGUuaXNUcml2aWFsSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiYxPT09dGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uTnVtKCkpe2lmKEtwLmlzQWRqYWNlbnRTZWdtZW50cyhlLHIpKXJldHVybiEwO2lmKHQuaXNDbG9zZWQoKSl7dmFyIGk9dC5zaXplKCktMTtpZigwPT09ZSYmcj09PWl8fDA9PT1yJiZlPT09aSlyZXR1cm4hMH19cmV0dXJuITF9LEtwLnByb3RvdHlwZS5nZXRQcm9wZXJJbnRlcnNlY3Rpb25Qb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJJbnRlcnNlY3Rpb25Qb2ludH0sS3AucHJvdG90eXBlLmhhc1Byb3BlckludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Byb3BlckludGVyaW9yfSxLcC5wcm90b3R5cGUuZ2V0TGluZUludGVyc2VjdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xpfSxLcC5wcm90b3R5cGUuaGFzUHJvcGVySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Byb3Blcn0sS3AucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiZlPT09cilyZXR1cm4gbnVsbDt0aGlzLm51bVRlc3RzKys7dmFyIGk9dC5nZXRDb29yZGluYXRlcygpW2VdLG89dC5nZXRDb29yZGluYXRlcygpW2UrMV0scz1uLmdldENvb3JkaW5hdGVzKClbcl0sYT1uLmdldENvb3JkaW5hdGVzKClbcisxXTt0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGksbyxzLGEpLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYodGhpcy5udW1JbnRlcnNlY3Rpb25zKyssdGhpcy5fbGkuaXNJbnRlcmlvckludGVyc2VjdGlvbigpJiYodGhpcy5udW1JbnRlcmlvckludGVyc2VjdGlvbnMrKyx0aGlzLl9oYXNJbnRlcmlvcj0hMCksdGhpcy5pc1RyaXZpYWxJbnRlcnNlY3Rpb24odCxlLG4scil8fCh0aGlzLl9oYXNJbnRlcnNlY3Rpb249ITAsdC5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLGUsMCksbi5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLHIsMSksdGhpcy5fbGkuaXNQcm9wZXIoKSYmKHRoaXMubnVtUHJvcGVySW50ZXJzZWN0aW9ucysrLHRoaXMuX2hhc1Byb3Blcj0hMCx0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcj0hMCkpKX0sS3AucHJvdG90eXBlLmhhc0ludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNJbnRlcnNlY3Rpb259LEtwLnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sS3AucHJvdG90eXBlLmhhc0ludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc0ludGVyaW9yfSxLcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bWnBdfSxLcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gS3B9LEtwLmlzQWRqYWNlbnRTZWdtZW50cz1mdW5jdGlvbih0LGUpe3JldHVybiAxPT09TWF0aC5hYnModC1lKX07dmFyIFFwPWZ1bmN0aW9uKCl7dGhpcy5jb29yZD1udWxsLHRoaXMuc2VnbWVudEluZGV4PW51bGwsdGhpcy5kaXN0PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuY29vcmQ9bmV3IHVsKHQpLHRoaXMuc2VnbWVudEluZGV4PWUsdGhpcy5kaXN0PW59O1FwLnByb3RvdHlwZS5nZXRTZWdtZW50SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWdtZW50SW5kZXh9LFFwLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29vcmR9LFFwLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50KHRoaXMuY29vcmQpLHQucHJpbnQoIiBzZWcgIyA9ICIrdGhpcy5zZWdtZW50SW5kZXgpLHQucHJpbnRsbigiIGRpc3QgPSAiK3RoaXMuZGlzdCl9LFFwLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5jb21wYXJlKGUuc2VnbWVudEluZGV4LGUuZGlzdCl9LFFwLnByb3RvdHlwZS5pc0VuZFBvaW50PWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5zZWdtZW50SW5kZXgmJjA9PT10aGlzLmRpc3R8fHRoaXMuc2VnbWVudEluZGV4PT09dH0sUXAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29vcmQrIiBzZWcgIyA9ICIrdGhpcy5zZWdtZW50SW5kZXgrIiBkaXN0ID0gIit0aGlzLmRpc3R9LFFwLnByb3RvdHlwZS5nZXREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc3R9LFFwLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc2VnbWVudEluZGV4PHQ/LTE6dGhpcy5zZWdtZW50SW5kZXg+dD8xOnRoaXMuZGlzdDxlPy0xOnRoaXMuZGlzdD5lPzE6MH0sUXAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2lsXX0sUXAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFFwfTt2YXIgJHA9ZnVuY3Rpb24oKXt0aGlzLl9ub2RlTWFwPW5ldyBDYyx0aGlzLmVkZ2U9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5lZGdlPXR9OyRwLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50bG4oIkludGVyc2VjdGlvbnM6Iik7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLnByaW50KHQpfX0sJHAucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVNYXAudmFsdWVzKCkuaXRlcmF0b3IoKX0sJHAucHJvdG90eXBlLmFkZFNwbGl0RWRnZXM9ZnVuY3Rpb24odCl7dGhpcy5hZGRFbmRwb2ludHMoKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpLG49ZS5uZXh0KCk7ZS5oYXNOZXh0KCk7KXt2YXIgcj1lLm5leHQoKSxpPXRoaXMuY3JlYXRlU3BsaXRFZGdlKG4scik7dC5hZGQoaSksbj1yfX0sJHAucHJvdG90eXBlLmFkZEVuZHBvaW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZS5wdHMubGVuZ3RoLTE7dGhpcy5hZGQodGhpcy5lZGdlLnB0c1swXSwwLDApLHRoaXMuYWRkKHRoaXMuZWRnZS5wdHNbdF0sdCwwKX0sJHAucHJvdG90eXBlLmNyZWF0ZVNwbGl0RWRnZT1mdW5jdGlvbih0LGUpe3ZhciBuPWUuc2VnbWVudEluZGV4LXQuc2VnbWVudEluZGV4KzIscj10aGlzLmVkZ2UucHRzW2Uuc2VnbWVudEluZGV4XSxpPWUuZGlzdD4wfHwhZS5jb29yZC5lcXVhbHMyRChyKTtpfHxuLS07dmFyIG89bmV3IEFycmF5KG4pLmZpbGwobnVsbCkscz0wO29bcysrXT1uZXcgdWwodC5jb29yZCk7Zm9yKHZhciBhPXQuc2VnbWVudEluZGV4KzE7YTw9ZS5zZWdtZW50SW5kZXg7YSsrKW9bcysrXT10aGlzLmVkZ2UucHRzW2FdO3JldHVybiBpJiYob1tzXT1lLmNvb3JkKSxuZXcgb2YobyxuZXcgRGgodGhpcy5lZGdlLl9sYWJlbCkpfSwkcC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgUXAodCxlLG4pLGk9dGhpcy5fbm9kZU1hcC5nZXQocik7cmV0dXJuIG51bGwhPT1pP2k6KHRoaXMuX25vZGVNYXAucHV0KHIscikscil9LCRwLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7aWYoZS5uZXh0KCkuY29vcmQuZXF1YWxzKHQpKXJldHVybiEwfXJldHVybiExfSwkcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sJHAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICRwfTt2YXIgdGY9ZnVuY3Rpb24oKXt9O3RmLnByb3RvdHlwZS5nZXRDaGFpblN0YXJ0SW5kaWNlcz1mdW5jdGlvbih0KXt2YXIgZT0wLG49bmV3IGxjO24uYWRkKG5ldyBfbChlKSk7ZG97dmFyIHI9dGhpcy5maW5kQ2hhaW5FbmQodCxlKTtuLmFkZChuZXcgX2wocikpLGU9cn13aGlsZShlPHQubGVuZ3RoLTEpO3JldHVybiB0Zi50b0ludEFycmF5KG4pfSx0Zi5wcm90b3R5cGUuZmluZENoYWluRW5kPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWpoLnF1YWRyYW50KHRbZV0sdFtlKzFdKSxyPWUrMTtyPHQubGVuZ3RoOyl7aWYoamgucXVhZHJhbnQodFtyLTFdLHRbcl0pIT09bilicmVhaztyKyt9cmV0dXJuIHItMX0sdGYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHRmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0Zn0sdGYudG9JbnRBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpLG49MDtuPGUubGVuZ3RoO24rKyllW25dPXQuZ2V0KG4pLmludFZhbHVlKCk7cmV0dXJuIGV9O3ZhciBlZj1mdW5jdGlvbigpe3RoaXMuZT1udWxsLHRoaXMucHRzPW51bGwsdGhpcy5zdGFydEluZGV4PW51bGwsdGhpcy5lbnYxPW5ldyBMbCx0aGlzLmVudjI9bmV3IExsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmU9dCx0aGlzLnB0cz10LmdldENvb3JkaW5hdGVzKCk7dmFyIGU9bmV3IHRmO3RoaXMuc3RhcnRJbmRleD1lLmdldENoYWluU3RhcnRJbmRpY2VzKHRoaXMucHRzKX07ZWYucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzfSxlZi5wcm90b3R5cGUuZ2V0TWF4WD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnB0c1t0aGlzLnN0YXJ0SW5kZXhbdF1dLngsbj10aGlzLnB0c1t0aGlzLnN0YXJ0SW5kZXhbdCsxXV0ueDtyZXR1cm4gZT5uP2U6bn0sZWYucHJvdG90eXBlLmdldE1pblg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wdHNbdGhpcy5zdGFydEluZGV4W3RdXS54LG49dGhpcy5wdHNbdGhpcy5zdGFydEluZGV4W3QrMV1dLng7cmV0dXJuIGU8bj9lOm59LGVmLnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluPWZ1bmN0aW9uKCl7aWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxyPWFyZ3VtZW50c1szXTt0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4odGhpcy5zdGFydEluZGV4W3RdLHRoaXMuc3RhcnRJbmRleFt0KzFdLGUsZS5zdGFydEluZGV4W25dLGUuc3RhcnRJbmRleFtuKzFdLHIpfWVsc2UgaWYoNj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1szXSx1PWFyZ3VtZW50c1s0XSxsPWFyZ3VtZW50c1s1XSxjPXRoaXMucHRzW2ldLGg9dGhpcy5wdHNbb10scD1zLnB0c1thXSxmPXMucHRzW3VdO2lmKG8taT09MSYmdS1hPT0xKXJldHVybiBsLmFkZEludGVyc2VjdGlvbnModGhpcy5lLGkscy5lLGEpLG51bGw7aWYodGhpcy5lbnYxLmluaXQoYyxoKSx0aGlzLmVudjIuaW5pdChwLGYpLCF0aGlzLmVudjEuaW50ZXJzZWN0cyh0aGlzLmVudjIpKXJldHVybiBudWxsO3ZhciBnPU1hdGgudHJ1bmMoKGkrbykvMiksZD1NYXRoLnRydW5jKChhK3UpLzIpO2k8ZyYmKGE8ZCYmdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKGksZyxzLGEsZCxsKSxkPHUmJnRoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbihpLGcscyxkLHUsbCkpLGc8byYmKGE8ZCYmdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKGcsbyxzLGEsZCxsKSxkPHUmJnRoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbihnLG8scyxkLHUsbCkpfX0sZWYucHJvdG90eXBlLmdldFN0YXJ0SW5kZXhlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0SW5kZXh9LGVmLnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dGhpcy5zdGFydEluZGV4Lmxlbmd0aC0xO24rKylmb3IodmFyIHI9MDtyPHQuc3RhcnRJbmRleC5sZW5ndGgtMTtyKyspdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKG4sdCxyLGUpfSxlZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZWYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGVmfTt2YXIgbmY9ZnVuY3Rpb24gdCgpe3RoaXMuX2RlcHRoPUFycmF5KDIpLmZpbGwoKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5KDMpfSkpO2Zvcih2YXIgZT0wO2U8MjtlKyspZm9yKHZhciBuPTA7bjwzO24rKyl0aGlzLl9kZXB0aFtlXVtuXT10Lk5VTExfVkFMVUV9LHJmPXtOVUxMX1ZBTFVFOntjb25maWd1cmFibGU6ITB9fTtuZi5wcm90b3R5cGUuZ2V0RGVwdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGVwdGhbdF1bZV19LG5mLnByb3RvdHlwZS5zZXREZXB0aD1mdW5jdGlvbih0LGUsbil7dGhpcy5fZGVwdGhbdF1bZV09bn0sbmYucHJvdG90eXBlLmlzTnVsbD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT0wO2U8MjtlKyspZm9yKHZhciBuPTA7bjwzO24rKylpZih0Ll9kZXB0aFtlXVtuXSE9PW5mLk5VTExfVkFMVUUpcmV0dXJuITE7cmV0dXJuITB9aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fZGVwdGhbcl1bMV09PT1uZi5OVUxMX1ZBTFVFfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuX2RlcHRoW2ldW29dPT09bmYuTlVMTF9WQUxVRX19LG5mLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTA7ZTwyO2UrKylpZighdC5pc051bGwoZSkpe3ZhciBuPXQuX2RlcHRoW2VdWzFdO3QuX2RlcHRoW2VdWzJdPG4mJihuPXQuX2RlcHRoW2VdWzJdKSxuPDAmJihuPTApO2Zvcih2YXIgcj0xO3I8MztyKyspe3ZhciBpPTA7dC5fZGVwdGhbZV1bcl0+biYmKGk9MSksdC5fZGVwdGhbZV1bcl09aX19fSxuZi5wcm90b3R5cGUuZ2V0RGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RlcHRoW3RdW1NoLlJJR0hUXS10aGlzLl9kZXB0aFt0XVtTaC5MRUZUXX0sbmYucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2RlcHRoW3RdW2VdPD0wP3BsLkVYVEVSSU9SOnBsLklOVEVSSU9SfSxuZi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQTogIit0aGlzLl9kZXB0aFswXVsxXSsiLCIrdGhpcy5fZGVwdGhbMF1bMl0rIiBCOiAiK3RoaXMuX2RlcHRoWzFdWzFdKyIsIit0aGlzLl9kZXB0aFsxXVsyXX0sbmYucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPTA7bjwyO24rKylmb3IodmFyIHI9MTtyPDM7cisrKXt2YXIgaT1lLmdldExvY2F0aW9uKG4scik7aSE9PXBsLkVYVEVSSU9SJiZpIT09cGwuSU5URVJJT1J8fCh0LmlzTnVsbChuLHIpP3QuX2RlcHRoW25dW3JdPW5mLmRlcHRoQXRMb2NhdGlvbihpKTp0Ll9kZXB0aFtuXVtyXSs9bmYuZGVwdGhBdExvY2F0aW9uKGkpKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl07YT09PXBsLklOVEVSSU9SJiZ0aGlzLl9kZXB0aFtvXVtzXSsrfX0sbmYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LG5mLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBuZn0sbmYuZGVwdGhBdExvY2F0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09cGwuRVhURVJJT1I/MDp0PT09cGwuSU5URVJJT1I/MTpuZi5OVUxMX1ZBTFVFfSxyZi5OVUxMX1ZBTFVFLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuZixyZik7dmFyIG9mPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtpZih0LmNhbGwodGhpcyksdGhpcy5wdHM9bnVsbCx0aGlzLl9lbnY9bnVsbCx0aGlzLmVpTGlzdD1uZXcgJHAodGhpcyksdGhpcy5fbmFtZT1udWxsLHRoaXMuX21jZT1udWxsLHRoaXMuX2lzSXNvbGF0ZWQ9ITAsdGhpcy5fZGVwdGg9bmV3IG5mLHRoaXMuX2RlcHRoRGVsdGE9MCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO2UuY2FsbCh0aGlzLG4sbnVsbCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3RoaXMucHRzPXIsdGhpcy5fbGFiZWw9aX19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldERlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlcHRofSxlLnByb3RvdHlwZS5nZXRDb2xsYXBzZWRFZGdlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KDIpLmZpbGwobnVsbCk7cmV0dXJuIHRbMF09dGhpcy5wdHNbMF0sdFsxXT10aGlzLnB0c1sxXSxuZXcgZSh0LERoLnRvTGluZUxhYmVsKHRoaXMuX2xhYmVsKSl9LGUucHJvdG90eXBlLmlzSXNvbGF0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNJc29sYXRlZH0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdHN9LGUucHJvdG90eXBlLnNldElzb2xhdGVkPWZ1bmN0aW9uKHQpe3RoaXMuX2lzSXNvbGF0ZWQ9dH0sZS5wcm90b3R5cGUuc2V0TmFtZT1mdW5jdGlvbih0KXt0aGlzLl9uYW1lPXR9LGUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBlKSlyZXR1cm4hMTt2YXIgbj10O2lmKHRoaXMucHRzLmxlbmd0aCE9PW4ucHRzLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHI9ITAsaT0hMCxvPXRoaXMucHRzLmxlbmd0aCxzPTA7czx0aGlzLnB0cy5sZW5ndGg7cysrKWlmKHRoaXMucHRzW3NdLmVxdWFsczJEKG4ucHRzW3NdKXx8KHI9ITEpLHRoaXMucHRzW3NdLmVxdWFsczJEKG4ucHRzWy0tb10pfHwoaT0hMSksIXImJiFpKXJldHVybiExO3JldHVybiEwfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMucHRzLmxlbmd0aD4wP3RoaXMucHRzWzBdOm51bGw7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5wdHNbdF19fSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50KCJlZGdlICIrdGhpcy5fbmFtZSsiOiAiKSx0LnByaW50KCJMSU5FU1RSSU5HICgiKTtmb3IodmFyIGU9MDtlPHRoaXMucHRzLmxlbmd0aDtlKyspZT4wJiZ0LnByaW50KCIsIiksdC5wcmludCh0aGlzLnB0c1tlXS54KyIgIit0aGlzLnB0c1tlXS55KTt0LnByaW50KCIpICAiK3RoaXMuX2xhYmVsKyIgIit0aGlzLl9kZXB0aERlbHRhKX0sZS5wcm90b3R5cGUuY29tcHV0ZUlNPWZ1bmN0aW9uKHQpe2UudXBkYXRlSU0odGhpcy5fbGFiZWwsdCl9LGUucHJvdG90eXBlLmlzQ29sbGFwc2VkPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9sYWJlbC5pc0FyZWEoKSYmKDM9PT10aGlzLnB0cy5sZW5ndGgmJiEhdGhpcy5wdHNbMF0uZXF1YWxzKHRoaXMucHRzWzJdKSl9LGUucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzWzBdLmVxdWFscyh0aGlzLnB0c1t0aGlzLnB0cy5sZW5ndGgtMV0pfSxlLnByb3RvdHlwZS5nZXRNYXhpbXVtU2VnbWVudEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzLmxlbmd0aC0xfSxlLnByb3RvdHlwZS5nZXREZXB0aERlbHRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlcHRoRGVsdGF9LGUucHJvdG90eXBlLmdldE51bVBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB0cy5sZW5ndGh9LGUucHJvdG90eXBlLnByaW50UmV2ZXJzZT1mdW5jdGlvbih0KXt0LnByaW50KCJlZGdlICIrdGhpcy5fbmFtZSsiOiAiKTtmb3IodmFyIGU9dGhpcy5wdHMubGVuZ3RoLTE7ZT49MDtlLS0pdC5wcmludCh0aGlzLnB0c1tlXSsiICIpO3QucHJpbnRsbigiIil9LGUucHJvdG90eXBlLmdldE1vbm90b25lQ2hhaW5FZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9tY2UmJih0aGlzLl9tY2U9bmV3IGVmKHRoaXMpKSx0aGlzLl9tY2V9LGUucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX2Vudil7dGhpcy5fZW52PW5ldyBMbDtmb3IodmFyIHQ9MDt0PHRoaXMucHRzLmxlbmd0aDt0KyspdGhpcy5fZW52LmV4cGFuZFRvSW5jbHVkZSh0aGlzLnB0c1t0XSl9cmV0dXJuIHRoaXMuX2Vudn0sZS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW5ldyB1bCh0LmdldEludGVyc2VjdGlvbihyKSksbz1lLHM9dC5nZXRFZGdlRGlzdGFuY2UobixyKSxhPW8rMTtpZihhPHRoaXMucHRzLmxlbmd0aCl7dmFyIHU9dGhpcy5wdHNbYV07aS5lcXVhbHMyRCh1KSYmKG89YSxzPTApfXRoaXMuZWlMaXN0LmFkZChpLG8scyl9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHZsO3QuYXBwZW5kKCJlZGdlICIrdGhpcy5fbmFtZSsiOiAiKSx0LmFwcGVuZCgiTElORVNUUklORyAoIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnB0cy5sZW5ndGg7ZSsrKWU+MCYmdC5hcHBlbmQoIiwiKSx0LmFwcGVuZCh0aGlzLnB0c1tlXS54KyIgIit0aGlzLnB0c1tlXS55KTtyZXR1cm4gdC5hcHBlbmQoIikgICIrdGhpcy5fbGFiZWwrIiAiK3RoaXMuX2RlcHRoRGVsdGEpLHQudG9TdHJpbmcoKX0sZS5wcm90b3R5cGUuaXNQb2ludHdpc2VFcXVhbD1mdW5jdGlvbih0KXtpZih0aGlzLnB0cy5sZW5ndGghPT10LnB0cy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBlPTA7ZTx0aGlzLnB0cy5sZW5ndGg7ZSsrKWlmKCF0aGlzLnB0c1tlXS5lcXVhbHMyRCh0LnB0c1tlXSkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLnNldERlcHRoRGVsdGE9ZnVuY3Rpb24odCl7dGhpcy5fZGVwdGhEZWx0YT10fSxlLnByb3RvdHlwZS5nZXRFZGdlSW50ZXJzZWN0aW9uTGlzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVpTGlzdH0sZS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTA7cjx0LmdldEludGVyc2VjdGlvbk51bSgpO3IrKyl0aGlzLmFkZEludGVyc2VjdGlvbih0LGUsbixyKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS51cGRhdGVJTT1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS51cGRhdGVJTS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO24uc2V0QXRMZWFzdElmVmFsaWQoZS5nZXRMb2NhdGlvbigwLFNoLk9OKSxlLmdldExvY2F0aW9uKDEsU2guT04pLDEpLGUuaXNBcmVhKCkmJihuLnNldEF0TGVhc3RJZlZhbGlkKGUuZ2V0TG9jYXRpb24oMCxTaC5MRUZUKSxlLmdldExvY2F0aW9uKDEsU2guTEVGVCksMiksbi5zZXRBdExlYXN0SWZWYWxpZChlLmdldExvY2F0aW9uKDAsU2guUklHSFQpLGUuZ2V0TG9jYXRpb24oMSxTaC5SSUdIVCksMikpfSxlfShxaCksc2Y9ZnVuY3Rpb24odCl7dGhpcy5fd29ya2luZ1ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fd29ya2luZ05vZGVyPW51bGwsdGhpcy5fZ2VvbUZhY3Q9bnVsbCx0aGlzLl9ncmFwaD1udWxsLHRoaXMuX2VkZ2VMaXN0PW5ldyBKcCx0aGlzLl9idWZQYXJhbXM9dHx8bnVsbH07c2YucHJvdG90eXBlLnNldFdvcmtpbmdQcmVjaXNpb25Nb2RlbD1mdW5jdGlvbih0KXt0aGlzLl93b3JraW5nUHJlY2lzaW9uTW9kZWw9dH0sc2YucHJvdG90eXBlLmluc2VydFVuaXF1ZUVkZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZWRnZUxpc3QuZmluZEVxdWFsRWRnZSh0KTtpZihudWxsIT09ZSl7dmFyIG49ZS5nZXRMYWJlbCgpLHI9dC5nZXRMYWJlbCgpO2UuaXNQb2ludHdpc2VFcXVhbCh0KXx8KHI9bmV3IERoKHQuZ2V0TGFiZWwoKSkpLmZsaXAoKSxuLm1lcmdlKHIpO3ZhciBpPXNmLmRlcHRoRGVsdGEociksbz1lLmdldERlcHRoRGVsdGEoKStpO2Uuc2V0RGVwdGhEZWx0YShvKX1lbHNlIHRoaXMuX2VkZ2VMaXN0LmFkZCh0KSx0LnNldERlcHRoRGVsdGEoc2YuZGVwdGhEZWx0YSh0LmdldExhYmVsKCkpKX0sc2YucHJvdG90eXBlLmJ1aWxkU3ViZ3JhcGhzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyBsYyxyPXQuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpLG89aS5nZXRSaWdodG1vc3RDb29yZGluYXRlKCkscz1uZXcga3AobikuZ2V0RGVwdGgobyk7aS5jb21wdXRlRGVwdGgocyksaS5maW5kUmVzdWx0RWRnZXMoKSxuLmFkZChpKSxlLmFkZChpLmdldERpcmVjdGVkRWRnZXMoKSxpLmdldE5vZGVzKCkpfX0sc2YucHJvdG90eXBlLmNyZWF0ZVN1YmdyYXBocz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGxjLG49dC5nZXROb2RlcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZighci5pc1Zpc2l0ZWQoKSl7dmFyIGk9bmV3IFRoO2kuY3JlYXRlKHIpLGUuYWRkKGkpfX1yZXR1cm4gbnAuc29ydChlLG5wLnJldmVyc2VPcmRlcigpKSxlfSxzZi5wcm90b3R5cGUuY3JlYXRlRW1wdHlSZXN1bHRHZW9tZXRyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZW9tRmFjdC5jcmVhdGVQb2x5Z29uKCl9LHNmLnByb3RvdHlwZS5nZXROb2Rlcj1mdW5jdGlvbih0KXtpZihudWxsIT09dGhpcy5fd29ya2luZ05vZGVyKXJldHVybiB0aGlzLl93b3JraW5nTm9kZXI7dmFyIGU9bmV3IElwLG49bmV3IGpsO3JldHVybiBuLnNldFByZWNpc2lvbk1vZGVsKHQpLGUuc2V0U2VnbWVudEludGVyc2VjdG9yKG5ldyBLcChuKSksZX0sc2YucHJvdG90eXBlLmJ1ZmZlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3dvcmtpbmdQcmVjaXNpb25Nb2RlbDtudWxsPT09biYmKG49dC5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9nZW9tRmFjdD10LmdldEZhY3RvcnkoKTt2YXIgcj1uZXcgRnAobix0aGlzLl9idWZQYXJhbXMpLGk9bmV3IHpwKHQsZSxyKS5nZXRDdXJ2ZXMoKTtpZihpLnNpemUoKTw9MClyZXR1cm4gdGhpcy5jcmVhdGVFbXB0eVJlc3VsdEdlb21ldHJ5KCk7dGhpcy5jb21wdXRlTm9kZWRFZGdlcyhpLG4pLHRoaXMuX2dyYXBoPW5ldyBIaChuZXcgSHApLHRoaXMuX2dyYXBoLmFkZEVkZ2VzKHRoaXMuX2VkZ2VMaXN0LmdldEVkZ2VzKCkpO3ZhciBvPXRoaXMuY3JlYXRlU3ViZ3JhcGhzKHRoaXMuX2dyYXBoKSxzPW5ldyBXaCh0aGlzLl9nZW9tRmFjdCk7dGhpcy5idWlsZFN1YmdyYXBocyhvLHMpO3ZhciBhPXMuZ2V0UG9seWdvbnMoKTtyZXR1cm4gYS5zaXplKCk8PTA/dGhpcy5jcmVhdGVFbXB0eVJlc3VsdEdlb21ldHJ5KCk6dGhpcy5fZ2VvbUZhY3QuYnVpbGRHZW9tZXRyeShhKX0sc2YucHJvdG90eXBlLmNvbXB1dGVOb2RlZEVkZ2VzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXROb2RlcihlKTtuLmNvbXB1dGVOb2Rlcyh0KTtmb3IodmFyIHI9bi5nZXROb2RlZFN1YnN0cmluZ3MoKS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCksbz1pLmdldENvb3JkaW5hdGVzKCk7aWYoMiE9PW8ubGVuZ3RofHwhb1swXS5lcXVhbHMyRChvWzFdKSl7dmFyIHM9aS5nZXREYXRhKCksYT1uZXcgb2YoaS5nZXRDb29yZGluYXRlcygpLG5ldyBEaChzKSk7dGhpcy5pbnNlcnRVbmlxdWVFZGdlKGEpfX19LHNmLnByb3RvdHlwZS5zZXROb2Rlcj1mdW5jdGlvbih0KXt0aGlzLl93b3JraW5nTm9kZXI9dH0sc2YucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHNmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBzZn0sc2YuZGVwdGhEZWx0YT1mdW5jdGlvbih0KXt2YXIgZT10LmdldExvY2F0aW9uKDAsU2guTEVGVCksbj10LmdldExvY2F0aW9uKDAsU2guUklHSFQpO3JldHVybiBlPT09cGwuSU5URVJJT1ImJm49PT1wbC5FWFRFUklPUj8xOmU9PT1wbC5FWFRFUklPUiYmbj09PXBsLklOVEVSSU9SPy0xOjB9LHNmLmNvbnZlcnRTZWdTdHJpbmdzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgX2gsbj1uZXcgbGM7dC5oYXNOZXh0KCk7KXt2YXIgcj10Lm5leHQoKSxpPWUuY3JlYXRlTGluZVN0cmluZyhyLmdldENvb3JkaW5hdGVzKCkpO24uYWRkKGkpfXJldHVybiBlLmJ1aWxkR2VvbWV0cnkobil9O3ZhciBhZj1mdW5jdGlvbigpe2lmKHRoaXMuX25vZGVyPW51bGwsdGhpcy5fc2NhbGVGYWN0b3I9bnVsbCx0aGlzLl9vZmZzZXRYPW51bGwsdGhpcy5fb2Zmc2V0WT1udWxsLHRoaXMuX2lzU2NhbGVkPSExLDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fbm9kZXI9dCx0aGlzLl9zY2FsZUZhY3Rvcj1lLHRoaXMuX29mZnNldFg9MCx0aGlzLl9vZmZzZXRZPTAsdGhpcy5faXNTY2FsZWQ9IXRoaXMuaXNJbnRlZ2VyUHJlY2lzaW9uKCl9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdLG89YXJndW1lbnRzWzNdO3RoaXMuX25vZGVyPW4sdGhpcy5fc2NhbGVGYWN0b3I9cix0aGlzLl9vZmZzZXRYPWksdGhpcy5fb2Zmc2V0WT1vLHRoaXMuX2lzU2NhbGVkPSF0aGlzLmlzSW50ZWdlclByZWNpc2lvbigpfX07YWYucHJvdG90eXBlLnJlc2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKGdsKGFyZ3VtZW50c1swXSxpYykpZm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3QucmVzY2FsZShyLmdldENvb3JkaW5hdGVzKCkpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciBpPWFyZ3VtZW50c1swXSxvPTA7bzxpLmxlbmd0aDtvKyspaVtvXS54PWlbb10ueC90Ll9zY2FsZUZhY3Rvcit0Ll9vZmZzZXRYLGlbb10ueT1pW29dLnkvdC5fc2NhbGVGYWN0b3IrdC5fb2Zmc2V0WTsyPT09aS5sZW5ndGgmJmlbMF0uZXF1YWxzMkQoaVsxXSkmJlBsLm91dC5wcmludGxuKGkpfX0sYWYucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihnbChhcmd1bWVudHNbMF0saWMpKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49bmV3IGxjLHI9ZS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7bi5hZGQobmV3IHlwKHQuc2NhbGUoaS5nZXRDb29yZGluYXRlcygpKSxpLmdldERhdGEoKSkpfXJldHVybiBufWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgbz1hcmd1bWVudHNbMF0scz1uZXcgQXJyYXkoby5sZW5ndGgpLmZpbGwobnVsbCksYT0wO2E8by5sZW5ndGg7YSsrKXNbYV09bmV3IHVsKE1hdGgucm91bmQoKG9bYV0ueC10Ll9vZmZzZXRYKSp0Ll9zY2FsZUZhY3RvciksTWF0aC5yb3VuZCgob1thXS55LXQuX29mZnNldFkpKnQuX3NjYWxlRmFjdG9yKSxvW2FdLnopO3ZhciB1PXBjLnJlbW92ZVJlcGVhdGVkUG9pbnRzKHMpO3JldHVybiB1fX0sYWYucHJvdG90eXBlLmlzSW50ZWdlclByZWNpc2lvbj1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5fc2NhbGVGYWN0b3J9LGFmLnByb3RvdHlwZS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9ub2Rlci5nZXROb2RlZFN1YnN0cmluZ3MoKTtyZXR1cm4gdGhpcy5faXNTY2FsZWQmJnRoaXMucmVzY2FsZSh0KSx0fSxhZi5wcm90b3R5cGUuY29tcHV0ZU5vZGVzPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7dGhpcy5faXNTY2FsZWQmJihlPXRoaXMuc2NhbGUodCkpLHRoaXMuX25vZGVyLmNvbXB1dGVOb2RlcyhlKX0sYWYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2JwXX0sYWYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGFmfTt2YXIgdWY9ZnVuY3Rpb24oKXt0aGlzLl9saT1uZXcgamwsdGhpcy5fc2VnU3RyaW5ncz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9zZWdTdHJpbmdzPXR9LGxmPXtmYWN0Ontjb25maWd1cmFibGU6ITB9fTt1Zi5wcm90b3R5cGUuY2hlY2tFbmRQdFZlcnRleEludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgZT10aGlzLl9zZWdTdHJpbmdzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPW4uZ2V0Q29vcmRpbmF0ZXMoKTt0LmNoZWNrRW5kUHRWZXJ0ZXhJbnRlcnNlY3Rpb25zKHJbMF0sdC5fc2VnU3RyaW5ncyksdC5jaGVja0VuZFB0VmVydGV4SW50ZXJzZWN0aW9ucyhyW3IubGVuZ3RoLTFdLHQuX3NlZ1N0cmluZ3MpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPW8uaXRlcmF0b3IoKTtzLmhhc05leHQoKTspZm9yKHZhciBhPXMubmV4dCgpLHU9YS5nZXRDb29yZGluYXRlcygpLGw9MTtsPHUubGVuZ3RoLTE7bCsrKWlmKHVbbF0uZXF1YWxzKGkpKXRocm93IG5ldyBrbCgiZm91bmQgZW5kcHQvaW50ZXJpb3IgcHQgaW50ZXJzZWN0aW9uIGF0IGluZGV4ICIrbCsiIDpwdCAiK2kpfSx1Zi5wcm90b3R5cGUuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgZT10aGlzLl9zZWdTdHJpbmdzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KWZvcih2YXIgbj1lLm5leHQoKSxyPXRoaXMuX3NlZ1N0cmluZ3MuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO3QuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnMobixpKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1vLmdldENvb3JkaW5hdGVzKCksdT1zLmdldENvb3JkaW5hdGVzKCksbD0wO2w8YS5sZW5ndGgtMTtsKyspZm9yKHZhciBjPTA7Yzx1Lmxlbmd0aC0xO2MrKyl0LmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zKG8sbCxzLGMpO2Vsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBoPWFyZ3VtZW50c1swXSxwPWFyZ3VtZW50c1sxXSxmPWFyZ3VtZW50c1syXSxnPWFyZ3VtZW50c1szXTtpZihoPT09ZiYmcD09PWcpcmV0dXJuIG51bGw7dmFyIGQ9aC5nZXRDb29yZGluYXRlcygpW3BdLHk9aC5nZXRDb29yZGluYXRlcygpW3ArMV0sdj1mLmdldENvb3JkaW5hdGVzKClbZ10sXz1mLmdldENvb3JkaW5hdGVzKClbZysxXTtpZih0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGQseSx2LF8pLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYodGhpcy5fbGkuaXNQcm9wZXIoKXx8dGhpcy5oYXNJbnRlcmlvckludGVyc2VjdGlvbih0aGlzLl9saSxkLHkpfHx0aGlzLmhhc0ludGVyaW9ySW50ZXJzZWN0aW9uKHRoaXMuX2xpLHYsXykpKXRocm93IG5ldyBrbCgiZm91bmQgbm9uLW5vZGVkIGludGVyc2VjdGlvbiBhdCAiK2QrIi0iK3krIiBhbmQgIit2KyItIitfKX19LHVmLnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7dGhpcy5jaGVja0VuZFB0VmVydGV4SW50ZXJzZWN0aW9ucygpLHRoaXMuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnMoKSx0aGlzLmNoZWNrQ29sbGFwc2VzKCl9LHVmLnByb3RvdHlwZS5jaGVja0NvbGxhcHNlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBlPXRoaXMuX3NlZ1N0cmluZ3MuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3QuY2hlY2tDb2xsYXBzZXMobil9ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9ci5nZXRDb29yZGluYXRlcygpLG89MDtvPGkubGVuZ3RoLTI7bysrKXQuY2hlY2tDb2xsYXBzZShpW29dLGlbbysxXSxpW28rMl0pfSx1Zi5wcm90b3R5cGUuaGFzSW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0wO3I8dC5nZXRJbnRlcnNlY3Rpb25OdW0oKTtyKyspe3ZhciBpPXQuZ2V0SW50ZXJzZWN0aW9uKHIpO2lmKCFpLmVxdWFscyhlKSYmIWkuZXF1YWxzKG4pKXJldHVybiEwfXJldHVybiExfSx1Zi5wcm90b3R5cGUuY2hlY2tDb2xsYXBzZT1mdW5jdGlvbih0LGUsbil7aWYodC5lcXVhbHMobikpdGhyb3cgbmV3IGtsKCJmb3VuZCBub24tbm9kZWQgY29sbGFwc2UgYXQgIit1Zi5mYWN0LmNyZWF0ZUxpbmVTdHJpbmcoW3QsZSxuXSkpfSx1Zi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdWYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHVmfSxsZi5mYWN0LmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgX2h9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHVmLGxmKTt2YXIgY2Y9ZnVuY3Rpb24oKXt0aGlzLl9saT1udWxsLHRoaXMuX3B0PW51bGwsdGhpcy5fb3JpZ2luYWxQdD1udWxsLHRoaXMuX3B0U2NhbGVkPW51bGwsdGhpcy5fcDBTY2FsZWQ9bnVsbCx0aGlzLl9wMVNjYWxlZD1udWxsLHRoaXMuX3NjYWxlRmFjdG9yPW51bGwsdGhpcy5fbWlueD1udWxsLHRoaXMuX21heHg9bnVsbCx0aGlzLl9taW55PW51bGwsdGhpcy5fbWF4eT1udWxsLHRoaXMuX2Nvcm5lcj1uZXcgQXJyYXkoNCkuZmlsbChudWxsKSx0aGlzLl9zYWZlRW52PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO2lmKHRoaXMuX29yaWdpbmFsUHQ9dCx0aGlzLl9wdD10LHRoaXMuX3NjYWxlRmFjdG9yPWUsdGhpcy5fbGk9bixlPD0wKXRocm93IG5ldyBlbCgiU2NhbGUgZmFjdG9yIG11c3QgYmUgbm9uLXplcm8iKTsxIT09ZSYmKHRoaXMuX3B0PW5ldyB1bCh0aGlzLnNjYWxlKHQueCksdGhpcy5zY2FsZSh0LnkpKSx0aGlzLl9wMFNjYWxlZD1uZXcgdWwsdGhpcy5fcDFTY2FsZWQ9bmV3IHVsKSx0aGlzLmluaXRDb3JuZXJzKHRoaXMuX3B0KX0saGY9e1NBRkVfRU5WX0VYUEFOU0lPTl9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH19O2NmLnByb3RvdHlwZS5pbnRlcnNlY3RzU2NhbGVkPWZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5taW4odC54LGUueCkscj1NYXRoLm1heCh0LngsZS54KSxpPU1hdGgubWluKHQueSxlLnkpLG89TWF0aC5tYXgodC55LGUueSkscz10aGlzLl9tYXh4PG58fHRoaXMuX21pbng+cnx8dGhpcy5fbWF4eTxpfHx0aGlzLl9taW55Pm87aWYocylyZXR1cm4hMTt2YXIgYT10aGlzLmludGVyc2VjdHNUb2xlcmFuY2VTcXVhcmUodCxlKTtyZXR1cm4gcWwuaXNUcnVlKCEocyYmYSksIkZvdW5kIGJhZCBlbnZlbG9wZSB0ZXN0IiksYX0sY2YucHJvdG90eXBlLmluaXRDb3JuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlPS41O3RoaXMuX21pbng9dC54LWUsdGhpcy5fbWF4eD10LngrZSx0aGlzLl9taW55PXQueS1lLHRoaXMuX21heHk9dC55K2UsdGhpcy5fY29ybmVyWzBdPW5ldyB1bCh0aGlzLl9tYXh4LHRoaXMuX21heHkpLHRoaXMuX2Nvcm5lclsxXT1uZXcgdWwodGhpcy5fbWlueCx0aGlzLl9tYXh5KSx0aGlzLl9jb3JuZXJbMl09bmV3IHVsKHRoaXMuX21pbngsdGhpcy5fbWlueSksdGhpcy5fY29ybmVyWzNdPW5ldyB1bCh0aGlzLl9tYXh4LHRoaXMuX21pbnkpfSxjZi5wcm90b3R5cGUuaW50ZXJzZWN0cz1mdW5jdGlvbih0LGUpe3JldHVybiAxPT09dGhpcy5fc2NhbGVGYWN0b3I/dGhpcy5pbnRlcnNlY3RzU2NhbGVkKHQsZSk6KHRoaXMuY29weVNjYWxlZCh0LHRoaXMuX3AwU2NhbGVkKSx0aGlzLmNvcHlTY2FsZWQoZSx0aGlzLl9wMVNjYWxlZCksdGhpcy5pbnRlcnNlY3RzU2NhbGVkKHRoaXMuX3AwU2NhbGVkLHRoaXMuX3AxU2NhbGVkKSl9LGNmLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KnRoaXMuX3NjYWxlRmFjdG9yKX0sY2YucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZ2luYWxQdH0sY2YucHJvdG90eXBlLmNvcHlTY2FsZWQ9ZnVuY3Rpb24odCxlKXtlLng9dGhpcy5zY2FsZSh0LngpLGUueT10aGlzLnNjYWxlKHQueSl9LGNmLnByb3RvdHlwZS5nZXRTYWZlRW52ZWxvcGU9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fc2FmZUVudil7dmFyIHQ9Y2YuU0FGRV9FTlZfRVhQQU5TSU9OX0ZBQ1RPUi90aGlzLl9zY2FsZUZhY3Rvcjt0aGlzLl9zYWZlRW52PW5ldyBMbCh0aGlzLl9vcmlnaW5hbFB0LngtdCx0aGlzLl9vcmlnaW5hbFB0LngrdCx0aGlzLl9vcmlnaW5hbFB0LnktdCx0aGlzLl9vcmlnaW5hbFB0LnkrdCl9cmV0dXJuIHRoaXMuX3NhZmVFbnZ9LGNmLnByb3RvdHlwZS5pbnRlcnNlY3RzUGl4ZWxDbG9zdXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclswXSx0aGlzLl9jb3JuZXJbMV0pLCEhdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCl8fCh0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMV0sdGhpcy5fY29ybmVyWzJdKSwhIXRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpfHwodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzJdLHRoaXMuX2Nvcm5lclszXSksISF0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKXx8KHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclszXSx0aGlzLl9jb3JuZXJbMF0pLCEhdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkpKSl9LGNmLnByb3RvdHlwZS5pbnRlcnNlY3RzVG9sZXJhbmNlU3F1YXJlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ITEscj0hMTtyZXR1cm4gdGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzBdLHRoaXMuX2Nvcm5lclsxXSksISF0aGlzLl9saS5pc1Byb3BlcigpfHwodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzFdLHRoaXMuX2Nvcm5lclsyXSksISF0aGlzLl9saS5pc1Byb3BlcigpfHwodGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJihuPSEwKSx0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMl0sdGhpcy5fY29ybmVyWzNdKSwhIXRoaXMuX2xpLmlzUHJvcGVyKCl8fCh0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmKHI9ITApLHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclszXSx0aGlzLl9jb3JuZXJbMF0pLCEhdGhpcy5fbGkuaXNQcm9wZXIoKXx8KCEoIW58fCFyKXx8KCEhdC5lcXVhbHModGhpcy5fcHQpfHwhIWUuZXF1YWxzKHRoaXMuX3B0KSkpKSkpfSxjZi5wcm90b3R5cGUuYWRkU25hcHBlZE5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldENvb3JkaW5hdGUoZSkscj10LmdldENvb3JkaW5hdGUoZSsxKTtyZXR1cm4hIXRoaXMuaW50ZXJzZWN0cyhuLHIpJiYodC5hZGRJbnRlcnNlY3Rpb24odGhpcy5nZXRDb29yZGluYXRlKCksZSksITApfSxjZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sY2YucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGNmfSxoZi5TQUZFX0VOVl9FWFBBTlNJT05fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybi43NX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2YsaGYpO3ZhciBwZj1mdW5jdGlvbigpe3RoaXMudGVtcEVudjE9bmV3IExsLHRoaXMuc2VsZWN0ZWRTZWdtZW50PW5ldyB2cH07cGYucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKTtlbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dC5nZXRMaW5lU2VnbWVudChlLHRoaXMuc2VsZWN0ZWRTZWdtZW50KSx0aGlzLnNlbGVjdCh0aGlzLnNlbGVjdGVkU2VnbWVudCl9fSxwZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scGYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHBmfTt2YXIgZmY9ZnVuY3Rpb24oKXt0aGlzLl9pbmRleD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9pbmRleD10fSxnZj17SG90UGl4ZWxTbmFwQWN0aW9uOntjb25maWd1cmFibGU6ITB9fTtmZi5wcm90b3R5cGUuc25hcD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc25hcCh0LG51bGwsLTEpfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl0saT1lLmdldFNhZmVFbnZlbG9wZSgpLG89bmV3IGRmKGUsbixyKTtyZXR1cm4gdGhpcy5faW5kZXgucXVlcnkoaSx7aW50ZXJmYWNlc186ZnVuY3Rpb24oKXtyZXR1cm5bUWhdfSx2aXNpdEl0ZW06ZnVuY3Rpb24odCl7dC5zZWxlY3QoaSxvKX19KSxvLmlzTm9kZUFkZGVkKCl9fSxmZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZmYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGZmfSxnZi5Ib3RQaXhlbFNuYXBBY3Rpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGRmfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmZixnZik7dmFyIGRmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5faG90UGl4ZWw9bnVsbCx0aGlzLl9wYXJlbnRFZGdlPW51bGwsdGhpcy5faG90UGl4ZWxWZXJ0ZXhJbmRleD1udWxsLHRoaXMuX2lzTm9kZUFkZGVkPSExO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9ob3RQaXhlbD1lLHRoaXMuX3BhcmVudEVkZ2U9bix0aGlzLl9ob3RQaXhlbFZlcnRleEluZGV4PXJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzTm9kZUFkZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzTm9kZUFkZGVkfSxlLnByb3RvdHlwZS5zZWxlY3Q9ZnVuY3Rpb24oKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuc2VsZWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1lLmdldENvbnRleHQoKTtpZihudWxsIT09dGhpcy5fcGFyZW50RWRnZSYmcj09PXRoaXMuX3BhcmVudEVkZ2UmJm49PT10aGlzLl9ob3RQaXhlbFZlcnRleEluZGV4KXJldHVybiBudWxsO3RoaXMuX2lzTm9kZUFkZGVkPXRoaXMuX2hvdFBpeGVsLmFkZFNuYXBwZWROb2RlKHIsbil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KHBmKSx5Zj1mdW5jdGlvbigpe3RoaXMuX2xpPW51bGwsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xpPXQsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zPW5ldyBsY307eWYucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiZlPT09cilyZXR1cm4gbnVsbDt2YXIgaT10LmdldENvb3JkaW5hdGVzKClbZV0sbz10LmdldENvb3JkaW5hdGVzKClbZSsxXSxzPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyXSxhPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyKzFdO2lmKHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oaSxvLHMsYSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJnRoaXMuX2xpLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oKSl7Zm9yKHZhciB1PTA7dTx0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKTt1KyspdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zLmFkZCh0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb24odSkpO3QuYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxlLDApLG4uYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxyLDEpfX0seWYucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSx5Zi5wcm90b3R5cGUuZ2V0SW50ZXJpb3JJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uc30seWYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1pwXX0seWYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHlmfTt2YXIgdmY9ZnVuY3Rpb24oKXt0aGlzLl9wbT1udWxsLHRoaXMuX2xpPW51bGwsdGhpcy5fc2NhbGVGYWN0b3I9bnVsbCx0aGlzLl9ub2Rlcj1udWxsLHRoaXMuX3BvaW50U25hcHBlcj1udWxsLHRoaXMuX25vZGVkU2VnU3RyaW5ncz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9wbT10LHRoaXMuX2xpPW5ldyBqbCx0aGlzLl9saS5zZXRQcmVjaXNpb25Nb2RlbCh0KSx0aGlzLl9zY2FsZUZhY3Rvcj10LmdldFNjYWxlKCl9O3ZmLnByb3RvdHlwZS5jaGVja0NvcnJlY3RuZXNzPWZ1bmN0aW9uKHQpe3ZhciBlPXlwLmdldE5vZGVkU3Vic3RyaW5ncyh0KSxuPW5ldyB1ZihlKTt0cnl7bi5jaGVja1ZhbGlkKCl9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgU2wpKXRocm93IHQ7dC5wcmludFN0YWNrVHJhY2UoKX19LHZmLnByb3RvdHlwZS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXtyZXR1cm4geXAuZ2V0Tm9kZWRTdWJzdHJpbmdzKHRoaXMuX25vZGVkU2VnU3RyaW5ncyl9LHZmLnByb3RvdHlwZS5zbmFwUm91bmQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmZpbmRJbnRlcmlvckludGVyc2VjdGlvbnModCxlKTt0aGlzLmNvbXB1dGVJbnRlcnNlY3Rpb25TbmFwcyhuKSx0aGlzLmNvbXB1dGVWZXJ0ZXhTbmFwcyh0KX0sdmYucHJvdG90eXBlLmZpbmRJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgeWYoZSk7cmV0dXJuIHRoaXMuX25vZGVyLnNldFNlZ21lbnRJbnRlcnNlY3RvcihuKSx0aGlzLl9ub2Rlci5jb21wdXRlTm9kZXModCksbi5nZXRJbnRlcmlvckludGVyc2VjdGlvbnMoKX0sdmYucHJvdG90eXBlLmNvbXB1dGVWZXJ0ZXhTbmFwcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoZ2woYXJndW1lbnRzWzBdLGljKSlmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49ZS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7dC5jb21wdXRlVmVydGV4U25hcHMocil9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHlwKWZvcih2YXIgaT1hcmd1bWVudHNbMF0sbz1pLmdldENvb3JkaW5hdGVzKCkscz0wO3M8by5sZW5ndGg7cysrKXt2YXIgYT1uZXcgY2Yob1tzXSx0Ll9zY2FsZUZhY3Rvcix0Ll9saSksdT10Ll9wb2ludFNuYXBwZXIuc25hcChhLGkscyk7dSYmaS5hZGRJbnRlcnNlY3Rpb24ob1tzXSxzKX19LHZmLnByb3RvdHlwZS5jb21wdXRlTm9kZXM9ZnVuY3Rpb24odCl7dGhpcy5fbm9kZWRTZWdTdHJpbmdzPXQsdGhpcy5fbm9kZXI9bmV3IElwLHRoaXMuX3BvaW50U25hcHBlcj1uZXcgZmYodGhpcy5fbm9kZXIuZ2V0SW5kZXgoKSksdGhpcy5zbmFwUm91bmQodCx0aGlzLl9saSl9LHZmLnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0aW9uU25hcHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKSxpPW5ldyBjZihyLGUuX3NjYWxlRmFjdG9yLGUuX2xpKTtlLl9wb2ludFNuYXBwZXIuc25hcChpKX19LHZmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblticF19LHZmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB2Zn07dmFyIF9mPWZ1bmN0aW9uKCl7aWYodGhpcy5fYXJnR2VvbT1udWxsLHRoaXMuX2Rpc3RhbmNlPW51bGwsdGhpcy5fYnVmUGFyYW1zPW5ldyBTcCx0aGlzLl9yZXN1bHRHZW9tZXRyeT1udWxsLHRoaXMuX3NhdmVFeGNlcHRpb249bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2FyZ0dlb209dH1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5fYXJnR2VvbT1lLHRoaXMuX2J1ZlBhcmFtcz1ufX0sbWY9e0NBUF9ST1VORDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfQlVUVDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfRkxBVDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfU1FVQVJFOntjb25maWd1cmFibGU6ITB9LE1BWF9QUkVDSVNJT05fRElHSVRTOntjb25maWd1cmFibGU6ITB9fTtfZi5wcm90b3R5cGUuYnVmZmVyRml4ZWRQcmVjaXNpb249ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGFmKG5ldyB2ZihuZXcgZ2goMSkpLHQuZ2V0U2NhbGUoKSksbj1uZXcgc2YodGhpcy5fYnVmUGFyYW1zKTtuLnNldFdvcmtpbmdQcmVjaXNpb25Nb2RlbCh0KSxuLnNldE5vZGVyKGUpLHRoaXMuX3Jlc3VsdEdlb21ldHJ5PW4uYnVmZmVyKHRoaXMuX2FyZ0dlb20sdGhpcy5fZGlzdGFuY2UpfSxfZi5wcm90b3R5cGUuYnVmZmVyUmVkdWNlZFByZWNpc2lvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1fZi5NQVhfUFJFQ0lTSU9OX0RJR0lUUztlPj0wO2UtLSl7dHJ5e3QuYnVmZmVyUmVkdWNlZFByZWNpc2lvbihlKX1jYXRjaChlKXtpZighKGUgaW5zdGFuY2VvZiBPaCkpdGhyb3cgZTt0Ll9zYXZlRXhjZXB0aW9uPWV9aWYobnVsbCE9PXQuX3Jlc3VsdEdlb21ldHJ5KXJldHVybiBudWxsfXRocm93IHRoaXMuX3NhdmVFeGNlcHRpb259aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPV9mLnByZWNpc2lvblNjYWxlRmFjdG9yKHRoaXMuX2FyZ0dlb20sdGhpcy5fZGlzdGFuY2UsbiksaT1uZXcgZ2gocik7dGhpcy5idWZmZXJGaXhlZFByZWNpc2lvbihpKX19LF9mLnByb3RvdHlwZS5jb21wdXRlR2VvbWV0cnk9ZnVuY3Rpb24oKXtpZih0aGlzLmJ1ZmZlck9yaWdpbmFsUHJlY2lzaW9uKCksbnVsbCE9PXRoaXMuX3Jlc3VsdEdlb21ldHJ5KXJldHVybiBudWxsO3ZhciB0PXRoaXMuX2FyZ0dlb20uZ2V0RmFjdG9yeSgpLmdldFByZWNpc2lvbk1vZGVsKCk7dC5nZXRUeXBlKCk9PT1naC5GSVhFRD90aGlzLmJ1ZmZlckZpeGVkUHJlY2lzaW9uKHQpOnRoaXMuYnVmZmVyUmVkdWNlZFByZWNpc2lvbigpfSxfZi5wcm90b3R5cGUuc2V0UXVhZHJhbnRTZWdtZW50cz1mdW5jdGlvbih0KXt0aGlzLl9idWZQYXJhbXMuc2V0UXVhZHJhbnRTZWdtZW50cyh0KX0sX2YucHJvdG90eXBlLmJ1ZmZlck9yaWdpbmFsUHJlY2lzaW9uPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBzZih0aGlzLl9idWZQYXJhbXMpO3RoaXMuX3Jlc3VsdEdlb21ldHJ5PXQuYnVmZmVyKHRoaXMuX2FyZ0dlb20sdGhpcy5fZGlzdGFuY2UpfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIGtsKSl0aHJvdyB0O3RoaXMuX3NhdmVFeGNlcHRpb249dH19LF9mLnByb3RvdHlwZS5nZXRSZXN1bHRHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGlzdGFuY2U9dCx0aGlzLmNvbXB1dGVHZW9tZXRyeSgpLHRoaXMuX3Jlc3VsdEdlb21ldHJ5fSxfZi5wcm90b3R5cGUuc2V0RW5kQ2FwU3R5bGU9ZnVuY3Rpb24odCl7dGhpcy5fYnVmUGFyYW1zLnNldEVuZENhcFN0eWxlKHQpfSxfZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sX2YucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIF9mfSxfZi5idWZmZXJPcD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1uZXcgX2YodCkscj1uLmdldFJlc3VsdEdlb21ldHJ5KGUpO3JldHVybiByfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1syXSkmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgV2wmJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1uZXcgX2YoaSk7YS5zZXRRdWFkcmFudFNlZ21lbnRzKHMpO3ZhciB1PWEuZ2V0UmVzdWx0R2VvbWV0cnkobyk7cmV0dXJuIHV9aWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBTcCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBXbCYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBsPWFyZ3VtZW50c1swXSxjPWFyZ3VtZW50c1sxXSxoPWFyZ3VtZW50c1syXSxwPW5ldyBfZihsLGgpLGY9cC5nZXRSZXN1bHRHZW9tZXRyeShjKTtyZXR1cm4gZn19ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGc9YXJndW1lbnRzWzBdLGQ9YXJndW1lbnRzWzFdLHk9YXJndW1lbnRzWzJdLHY9YXJndW1lbnRzWzNdLF89bmV3IF9mKGcpO18uc2V0UXVhZHJhbnRTZWdtZW50cyh5KSxfLnNldEVuZENhcFN0eWxlKHYpO3ZhciBtPV8uZ2V0UmVzdWx0R2VvbWV0cnkoZCk7cmV0dXJuIG19fSxfZi5wcmVjaXNpb25TY2FsZUZhY3Rvcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXRFbnZlbG9wZUludGVybmFsKCksaT1kbC5tYXgoTWF0aC5hYnMoci5nZXRNYXhYKCkpLE1hdGguYWJzKHIuZ2V0TWF4WSgpKSxNYXRoLmFicyhyLmdldE1pblgoKSksTWF0aC5hYnMoci5nZXRNaW5ZKCkpKSsyKihlPjA/ZTowKSxvPW4tTWF0aC50cnVuYyhNYXRoLmxvZyhpKS9NYXRoLmxvZygxMCkrMSk7cmV0dXJuIE1hdGgucG93KDEwLG8pfSxtZi5DQVBfUk9VTkQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFNwLkNBUF9ST1VORH0sbWYuQ0FQX0JVVFQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFNwLkNBUF9GTEFUfSxtZi5DQVBfRkxBVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gU3AuQ0FQX0ZMQVR9LG1mLkNBUF9TUVVBUkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFNwLkNBUF9TUVVBUkV9LG1mLk1BWF9QUkVDSVNJT05fRElHSVRTLmdldD1mdW5jdGlvbigpe3JldHVybiAxMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoX2YsbWYpO3ZhciB4Zj1mdW5jdGlvbigpe3RoaXMuX3B0PVtuZXcgdWwsbmV3IHVsXSx0aGlzLl9kaXN0YW5jZT1ubC5OYU4sdGhpcy5faXNOdWxsPSEwfTt4Zi5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHR9LHhmLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdFt0XX0seGYucHJvdG90eXBlLnNldE1pbmltdW09ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0TWluaW11bSh0Ll9wdFswXSx0Ll9wdFsxXSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKHRoaXMuX2lzTnVsbClyZXR1cm4gdGhpcy5pbml0aWFsaXplKGUsbiksbnVsbDt2YXIgcj1lLmRpc3RhbmNlKG4pO3I8dGhpcy5fZGlzdGFuY2UmJnRoaXMuaW5pdGlhbGl6ZShlLG4scil9fSx4Zi5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuX2lzTnVsbD0hMDtlbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fcHRbMF0uc2V0Q29vcmRpbmF0ZSh0KSx0aGlzLl9wdFsxXS5zZXRDb29yZGluYXRlKGUpLHRoaXMuX2Rpc3RhbmNlPXQuZGlzdGFuY2UoZSksdGhpcy5faXNOdWxsPSExfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXTt0aGlzLl9wdFswXS5zZXRDb29yZGluYXRlKG4pLHRoaXMuX3B0WzFdLnNldENvb3JkaW5hdGUociksdGhpcy5fZGlzdGFuY2U9aSx0aGlzLl9pc051bGw9ITF9fSx4Zi5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2V9LHhmLnByb3RvdHlwZS5zZXRNYXhpbXVtPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldE1heGltdW0odC5fcHRbMF0sdC5fcHRbMV0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLl9pc051bGwpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShlLG4pLG51bGw7dmFyIHI9ZS5kaXN0YW5jZShuKTtyPnRoaXMuX2Rpc3RhbmNlJiZ0aGlzLmluaXRpYWxpemUoZSxuLHIpfX0seGYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHhmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB4Zn07dmFyIEVmPWZ1bmN0aW9uKCl7fTtFZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRWYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEVmfSxFZi5jb21wdXRlRGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIHhmJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFpjJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKWZvcih2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj10LmdldENvb3JkaW5hdGVzKCksaT1uZXcgdnAsbz0wO288ci5sZW5ndGgtMTtvKyspe2kuc2V0Q29vcmRpbmF0ZXMocltvXSxyW28rMV0pO3ZhciBzPWkuY2xvc2VzdFBvaW50KGUpO24uc2V0TWluaW11bShzLGUpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiB4ZiYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0aCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB1bCl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdO0VmLmNvbXB1dGVEaXN0YW5jZShhLmdldEV4dGVyaW9yUmluZygpLHUsbCk7Zm9yKHZhciBjPTA7YzxhLmdldE51bUludGVyaW9yUmluZygpO2MrKylFZi5jb21wdXRlRGlzdGFuY2UoYS5nZXRJbnRlcmlvclJpbmdOKGMpLHUsbCl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIHhmJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFdsJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKXt2YXIgaD1hcmd1bWVudHNbMF0scD1hcmd1bWVudHNbMV0sZj1hcmd1bWVudHNbMl07aWYoaCBpbnN0YW5jZW9mIFpjKUVmLmNvbXB1dGVEaXN0YW5jZShoLHAsZik7ZWxzZSBpZihoIGluc3RhbmNlb2YgdGgpRWYuY29tcHV0ZURpc3RhbmNlKGgscCxmKTtlbHNlIGlmKGggaW5zdGFuY2VvZiBrYylmb3IodmFyIGc9aCxkPTA7ZDxnLmdldE51bUdlb21ldHJpZXMoKTtkKyspe3ZhciB5PWcuZ2V0R2VvbWV0cnlOKGQpO0VmLmNvbXB1dGVEaXN0YW5jZSh5LHAsZil9ZWxzZSBmLnNldE1pbmltdW0oaC5nZXRDb29yZGluYXRlKCkscCl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIHhmJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZwJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKXt2YXIgdj1hcmd1bWVudHNbMF0sXz1hcmd1bWVudHNbMV0sbT1hcmd1bWVudHNbMl0seD12LmNsb3Nlc3RQb2ludChfKTttLnNldE1pbmltdW0oeCxfKX19O3ZhciBiZj1mdW5jdGlvbih0KXt0aGlzLl9tYXhQdERpc3Q9bmV3IHhmLHRoaXMuX2lucHV0R2VvbT10fHxudWxsfSx3Zj17TWF4UG9pbnREaXN0YW5jZUZpbHRlcjp7Y29uZmlndXJhYmxlOiEwfSxNYXhNaWRwb2ludERpc3RhbmNlRmlsdGVyOntjb25maWd1cmFibGU6ITB9fTtiZi5wcm90b3R5cGUuY29tcHV0ZU1heE1pZHBvaW50RGlzdGFuY2U9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IE5mKHRoaXMuX2lucHV0R2VvbSk7dC5hcHBseShlKSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bShlLmdldE1heFBvaW50RGlzdGFuY2UoKSl9LGJmLnByb3RvdHlwZS5jb21wdXRlTWF4VmVydGV4RGlzdGFuY2U9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IElmKHRoaXMuX2lucHV0R2VvbSk7dC5hcHBseShlKSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bShlLmdldE1heFBvaW50RGlzdGFuY2UoKSl9LGJmLnByb3RvdHlwZS5maW5kRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1heFZlcnRleERpc3RhbmNlKHQpLHRoaXMuY29tcHV0ZU1heE1pZHBvaW50RGlzdGFuY2UodCksdGhpcy5fbWF4UHREaXN0LmdldERpc3RhbmNlKCl9LGJmLnByb3RvdHlwZS5nZXREaXN0YW5jZVBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LGJmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxiZi5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYmZ9LHdmLk1heFBvaW50RGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIElmfSx3Zi5NYXhNaWRwb2ludERpc3RhbmNlRmlsdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBOZn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYmYsd2YpO3ZhciBJZj1mdW5jdGlvbih0KXt0aGlzLl9tYXhQdERpc3Q9bmV3IHhmLHRoaXMuX21pblB0RGlzdD1uZXcgeGYsdGhpcy5fZ2VvbT10fHxudWxsfTtJZi5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3RoaXMuX21pblB0RGlzdC5pbml0aWFsaXplKCksRWYuY29tcHV0ZURpc3RhbmNlKHRoaXMuX2dlb20sdCx0aGlzLl9taW5QdERpc3QpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKHRoaXMuX21pblB0RGlzdCl9LElmLnByb3RvdHlwZS5nZXRNYXhQb2ludERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heFB0RGlzdH0sSWYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0tsXX0sSWYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIElmfTt2YXIgTmY9ZnVuY3Rpb24odCl7dGhpcy5fbWF4UHREaXN0PW5ldyB4Zix0aGlzLl9taW5QdERpc3Q9bmV3IHhmLHRoaXMuX2dlb209dHx8bnVsbH07TmYucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0LGUpe2lmKDA9PT1lKXJldHVybiBudWxsO3ZhciBuPXQuZ2V0Q29vcmRpbmF0ZShlLTEpLHI9dC5nZXRDb29yZGluYXRlKGUpLGk9bmV3IHVsKChuLngrci54KS8yLChuLnkrci55KS8yKTt0aGlzLl9taW5QdERpc3QuaW5pdGlhbGl6ZSgpLEVmLmNvbXB1dGVEaXN0YW5jZSh0aGlzLl9nZW9tLGksdGhpcy5fbWluUHREaXN0KSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bSh0aGlzLl9taW5QdERpc3QpfSxOZi5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LE5mLnByb3RvdHlwZS5pc0dlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3JldHVybiExfSxOZi5wcm90b3R5cGUuZ2V0TWF4UG9pbnREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LE5mLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltGY119LE5mLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBOZn07dmFyIFNmPWZ1bmN0aW9uKHQpe3RoaXMuX2NvbXBzPXR8fG51bGx9O1NmLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIHRoJiZ0aGlzLl9jb21wcy5hZGQodCl9LFNmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltEY119LFNmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBTZn0sU2YuZ2V0UG9seWdvbnM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBTZi5nZXRQb2x5Z29ucyh0LG5ldyBsYyl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4gZSBpbnN0YW5jZW9mIHRoP24uYWRkKGUpOmUgaW5zdGFuY2VvZiBrYyYmZS5hcHBseShuZXcgU2YobikpLG59fTt2YXIgQ2Y9ZnVuY3Rpb24oKXtpZih0aGlzLl9saW5lcz1udWxsLHRoaXMuX2lzRm9yY2VkVG9MaW5lU3RyaW5nPSExLDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbGluZXM9dH1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5fbGluZXM9ZSx0aGlzLl9pc0ZvcmNlZFRvTGluZVN0cmluZz1ufX07Q2YucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXtpZih0aGlzLl9pc0ZvcmNlZFRvTGluZVN0cmluZyYmdCBpbnN0YW5jZW9mIG5oKXt2YXIgZT10LmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lU3RyaW5nKHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkpO3JldHVybiB0aGlzLl9saW5lcy5hZGQoZSksbnVsbH10IGluc3RhbmNlb2YgWmMmJnRoaXMuX2xpbmVzLmFkZCh0KX0sQ2YucHJvdG90eXBlLnNldEZvcmNlVG9MaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX2lzRm9yY2VkVG9MaW5lU3RyaW5nPXR9LENmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltIbF19LENmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDZn0sQ2YuZ2V0R2VvbWV0cnk9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0LmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KENmLmdldExpbmVzKHQpKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiBlLmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KENmLmdldExpbmVzKGUsbikpfX0sQ2YuZ2V0TGluZXM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBDZi5nZXRMaW5lcyh0LCExKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoZ2woYXJndW1lbnRzWzBdLGljKSYmZ2woYXJndW1lbnRzWzFdLGljKSl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWUuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO0NmLmdldExpbmVzKGksbil9cmV0dXJuIG59aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBXbCYmImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1uZXcgbGM7cmV0dXJuIG8uYXBwbHkobmV3IENmKGEscykpLGF9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBXbCYmZ2woYXJndW1lbnRzWzFdLGljKSl7dmFyIHU9YXJndW1lbnRzWzBdLGw9YXJndW1lbnRzWzFdO3JldHVybiB1IGluc3RhbmNlb2YgWmM/bC5hZGQodSk6dS5hcHBseShuZXcgQ2YobCkpLGx9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmZ2woYXJndW1lbnRzWzBdLGljKSYmZ2woYXJndW1lbnRzWzFdLGljKSl7Zm9yKHZhciBjPWFyZ3VtZW50c1swXSxoPWFyZ3VtZW50c1sxXSxwPWFyZ3VtZW50c1syXSxmPWMuaXRlcmF0b3IoKTtmLmhhc05leHQoKTspe3ZhciBnPWYubmV4dCgpO0NmLmdldExpbmVzKGcsaCxwKX1yZXR1cm4gaH1pZigiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgV2wmJmdsKGFyZ3VtZW50c1sxXSxpYykpe3ZhciBkPWFyZ3VtZW50c1swXSx5PWFyZ3VtZW50c1sxXSx2PWFyZ3VtZW50c1syXTtyZXR1cm4gZC5hcHBseShuZXcgQ2YoeSx2KSkseX19fTt2YXIgUGY9ZnVuY3Rpb24oKXtpZih0aGlzLl9ib3VuZGFyeVJ1bGU9UWwuT0dDX1NGU19CT1VOREFSWV9SVUxFLHRoaXMuX2lzSW49bnVsbCx0aGlzLl9udW1Cb3VuZGFyaWVzPW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtpZihudWxsPT09dCl0aHJvdyBuZXcgZWwoIlJ1bGUgbXVzdCBiZSBub24tbnVsbCIpO3RoaXMuX2JvdW5kYXJ5UnVsZT10fX07UGYucHJvdG90eXBlLmxvY2F0ZUludGVybmFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHRoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYobi5pc0VtcHR5KCkpcmV0dXJuIHBsLkVYVEVSSU9SO3ZhciByPW4uZ2V0RXh0ZXJpb3JSaW5nKCksaT10aGlzLmxvY2F0ZUluUG9seWdvblJpbmcoZSxyKTtpZihpPT09cGwuRVhURVJJT1IpcmV0dXJuIHBsLkVYVEVSSU9SO2lmKGk9PT1wbC5CT1VOREFSWSlyZXR1cm4gcGwuQk9VTkRBUlk7Zm9yKHZhciBvPTA7bzxuLmdldE51bUludGVyaW9yUmluZygpO28rKyl7dmFyIHM9bi5nZXRJbnRlcmlvclJpbmdOKG8pLGE9dC5sb2NhdGVJblBvbHlnb25SaW5nKGUscyk7aWYoYT09PXBsLklOVEVSSU9SKXJldHVybiBwbC5FWFRFUklPUjtpZihhPT09cGwuQk9VTkRBUlkpcmV0dXJuIHBsLkJPVU5EQVJZfXJldHVybiBwbC5JTlRFUklPUn1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIFpjKXt2YXIgdT1hcmd1bWVudHNbMF0sbD1hcmd1bWVudHNbMV07aWYoIWwuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmludGVyc2VjdHModSkpcmV0dXJuIHBsLkVYVEVSSU9SO3ZhciBjPWwuZ2V0Q29vcmRpbmF0ZXMoKTtyZXR1cm4gbC5pc0Nsb3NlZCgpfHwhdS5lcXVhbHMoY1swXSkmJiF1LmVxdWFscyhjW2MubGVuZ3RoLTFdKT9YbC5pc09uTGluZSh1LGMpP3BsLklOVEVSSU9SOnBsLkVYVEVSSU9SOnBsLkJPVU5EQVJZfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgUWMpe3ZhciBoPWFyZ3VtZW50c1swXSxwPWFyZ3VtZW50c1sxXSxmPXAuZ2V0Q29vcmRpbmF0ZSgpO3JldHVybiBmLmVxdWFsczJEKGgpP3BsLklOVEVSSU9SOnBsLkVYVEVSSU9SfX0sUGYucHJvdG90eXBlLmxvY2F0ZUluUG9seWdvblJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRFbnZlbG9wZUludGVybmFsKCkuaW50ZXJzZWN0cyh0KT9YbC5sb2NhdGVQb2ludEluUmluZyh0LGUuZ2V0Q29vcmRpbmF0ZXMoKSk6cGwuRVhURVJJT1J9LFBmLnByb3RvdHlwZS5pbnRlcnNlY3RzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubG9jYXRlKHQsZSkhPT1wbC5FWFRFUklPUn0sUGYucHJvdG90eXBlLnVwZGF0ZUxvY2F0aW9uSW5mbz1mdW5jdGlvbih0KXt0PT09cGwuSU5URVJJT1ImJih0aGlzLl9pc0luPSEwKSx0PT09cGwuQk9VTkRBUlkmJnRoaXMuX251bUJvdW5kYXJpZXMrK30sUGYucHJvdG90eXBlLmNvbXB1dGVMb2NhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoZSBpbnN0YW5jZW9mIFFjJiZ0aGlzLnVwZGF0ZUxvY2F0aW9uSW5mbyh0aGlzLmxvY2F0ZUludGVybmFsKHQsZSkpLGUgaW5zdGFuY2VvZiBaYyl0aGlzLnVwZGF0ZUxvY2F0aW9uSW5mbyh0aGlzLmxvY2F0ZUludGVybmFsKHQsZSkpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIHRoKXRoaXMudXBkYXRlTG9jYXRpb25JbmZvKHRoaXMubG9jYXRlSW50ZXJuYWwodCxlKSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgR2MpZm9yKHZhciByPWUsaT0wO2k8ci5nZXROdW1HZW9tZXRyaWVzKCk7aSsrKXt2YXIgbz1yLmdldEdlb21ldHJ5TihpKTtuLnVwZGF0ZUxvY2F0aW9uSW5mbyhuLmxvY2F0ZUludGVybmFsKHQsbykpfWVsc2UgaWYoZSBpbnN0YW5jZW9mIHJoKWZvcih2YXIgcz1lLGE9MDthPHMuZ2V0TnVtR2VvbWV0cmllcygpO2ErKyl7dmFyIHU9cy5nZXRHZW9tZXRyeU4oYSk7bi51cGRhdGVMb2NhdGlvbkluZm8obi5sb2NhdGVJbnRlcm5hbCh0LHUpKX1lbHNlIGlmKGUgaW5zdGFuY2VvZiBrYylmb3IodmFyIGw9bmV3IFVwKGUpO2wuaGFzTmV4dCgpOyl7dmFyIGM9bC5uZXh0KCk7YyE9PWUmJm4uY29tcHV0ZUxvY2F0aW9uKHQsYyl9fSxQZi5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaXNFbXB0eSgpP3BsLkVYVEVSSU9SOmUgaW5zdGFuY2VvZiBaY3x8ZSBpbnN0YW5jZW9mIHRoP3RoaXMubG9jYXRlSW50ZXJuYWwodCxlKToodGhpcy5faXNJbj0hMSx0aGlzLl9udW1Cb3VuZGFyaWVzPTAsdGhpcy5jb21wdXRlTG9jYXRpb24odCxlKSx0aGlzLl9ib3VuZGFyeVJ1bGUuaXNJbkJvdW5kYXJ5KHRoaXMuX251bUJvdW5kYXJpZXMpP3BsLkJPVU5EQVJZOnRoaXMuX251bUJvdW5kYXJpZXM+MHx8dGhpcy5faXNJbj9wbC5JTlRFUklPUjpwbC5FWFRFUklPUil9LFBmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxQZi5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUGZ9O3ZhciBNZj1mdW5jdGlvbiB0KCl7aWYodGhpcy5fY29tcG9uZW50PW51bGwsdGhpcy5fc2VnSW5kZXg9bnVsbCx0aGlzLl9wdD1udWxsLDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dC5jYWxsKHRoaXMsZSx0LklOU0lERV9BUkVBLG4pfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXTt0aGlzLl9jb21wb25lbnQ9cix0aGlzLl9zZWdJbmRleD1pLHRoaXMuX3B0PW99fSxMZj17SU5TSURFX0FSRUE6e2NvbmZpZ3VyYWJsZTohMH19O01mLnByb3RvdHlwZS5pc0luc2lkZUFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VnSW5kZXg9PT1NZi5JTlNJREVfQVJFQX0sTWYucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHR9LE1mLnByb3RvdHlwZS5nZXRHZW9tZXRyeUNvbXBvbmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnR9LE1mLnByb3RvdHlwZS5nZXRTZWdtZW50SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VnSW5kZXh9LE1mLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxNZi5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTWZ9LExmLklOU0lERV9BUkVBLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhNZixMZik7dmFyIE9mPWZ1bmN0aW9uKHQpe3RoaXMuX3B0cz10fHxudWxsfTtPZi5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBRYyYmdGhpcy5fcHRzLmFkZCh0KX0sT2YucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0RjXX0sT2YucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE9mfSxPZi5nZXRQb2ludHM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0IGluc3RhbmNlb2YgUWM/bnAuc2luZ2xldG9uTGlzdCh0KTpPZi5nZXRQb2ludHModCxuZXcgbGMpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuIGUgaW5zdGFuY2VvZiBRYz9uLmFkZChlKTplIGluc3RhbmNlb2Yga2MmJmUuYXBwbHkobmV3IE9mKG4pKSxufX07dmFyIFJmPWZ1bmN0aW9uKCl7dGhpcy5fbG9jYXRpb25zPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xvY2F0aW9ucz10fTtSZi5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpeyh0IGluc3RhbmNlb2YgUWN8fHQgaW5zdGFuY2VvZiBaY3x8dCBpbnN0YW5jZW9mIHRoKSYmdGhpcy5fbG9jYXRpb25zLmFkZChuZXcgTWYodCwwLHQuZ2V0Q29vcmRpbmF0ZSgpKSl9LFJmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltEY119LFJmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBSZn0sUmYuZ2V0TG9jYXRpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBsYztyZXR1cm4gdC5hcHBseShuZXcgUmYoZSkpLGV9O3ZhciBUZj1mdW5jdGlvbigpe2lmKHRoaXMuX2dlb209bnVsbCx0aGlzLl90ZXJtaW5hdGVEaXN0YW5jZT0wLHRoaXMuX3B0TG9jYXRvcj1uZXcgUGYsdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbj1udWxsLHRoaXMuX21pbkRpc3RhbmNlPW5sLk1BWF9WQUxVRSwyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2dlb209W3QsZV0sdGhpcy5fdGVybWluYXRlRGlzdGFuY2U9MH1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl07dGhpcy5fZ2VvbT1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9nZW9tWzBdPW4sdGhpcy5fZ2VvbVsxXT1yLHRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlPWl9fTtUZi5wcm90b3R5cGUuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1uZXcgQXJyYXkoMikuZmlsbChudWxsKTtpZih0aGlzLmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKDAsZSksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsO3RoaXMuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2UoMSxlKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT0xLW4sbz1TZi5nZXRQb2x5Z29ucyh0aGlzLl9nZW9tW25dKTtpZihvLnNpemUoKT4wKXt2YXIgcz1SZi5nZXRMb2NhdGlvbnModGhpcy5fZ2VvbVtpXSk7aWYodGhpcy5jb21wdXRlQ29udGFpbm1lbnREaXN0YW5jZShzLG8sciksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiB0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uW2ldPXJbMF0sdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbltuXT1yWzFdLG51bGx9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmZ2woYXJndW1lbnRzWzBdLGFjKSYmZ2woYXJndW1lbnRzWzFdLGFjKSl7Zm9yKHZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXSxsPWFyZ3VtZW50c1syXSxjPTA7YzxhLnNpemUoKTtjKyspZm9yKHZhciBoPWEuZ2V0KGMpLHA9MDtwPHUuc2l6ZSgpO3ArKylpZih0LmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKGgsdS5nZXQocCksbCksdC5fbWluRGlzdGFuY2U8PXQuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNZiYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0aCl7dmFyIGY9YXJndW1lbnRzWzBdLGc9YXJndW1lbnRzWzFdLGQ9YXJndW1lbnRzWzJdLHk9Zi5nZXRDb29yZGluYXRlKCk7aWYocGwuRVhURVJJT1IhPT10aGlzLl9wdExvY2F0b3IubG9jYXRlKHksZykpcmV0dXJuIHRoaXMuX21pbkRpc3RhbmNlPTAsZFswXT1mLGRbMV09bmV3IE1mKGcseSksbnVsbH19LFRmLnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2VMaW5lc1BvaW50cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXRoaXMsaT0wO2k8dC5zaXplKCk7aSsrKWZvcih2YXIgbz10LmdldChpKSxzPTA7czxlLnNpemUoKTtzKyspe3ZhciBhPWUuZ2V0KHMpO2lmKHIuY29tcHV0ZU1pbkRpc3RhbmNlKG8sYSxuKSxyLl9taW5EaXN0YW5jZTw9ci5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fSxUZi5wcm90b3R5cGUuY29tcHV0ZUZhY2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQXJyYXkoMikuZmlsbChudWxsKSxlPUNmLmdldExpbmVzKHRoaXMuX2dlb21bMF0pLG49Q2YuZ2V0TGluZXModGhpcy5fZ2VvbVsxXSkscj1PZi5nZXRQb2ludHModGhpcy5fZ2VvbVswXSksaT1PZi5nZXRQb2ludHModGhpcy5fZ2VvbVsxXSk7cmV0dXJuIHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlTGluZXMoZSxuLHQpLHRoaXMudXBkYXRlTWluRGlzdGFuY2UodCwhMSksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlP251bGw6KHRbMF09bnVsbCx0WzFdPW51bGwsdGhpcy5jb21wdXRlTWluRGlzdGFuY2VMaW5lc1BvaW50cyhlLGksdCksdGhpcy51cGRhdGVNaW5EaXN0YW5jZSh0LCExKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2U/bnVsbDoodFswXT1udWxsLHRbMV09bnVsbCx0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZUxpbmVzUG9pbnRzKG4scix0KSx0aGlzLnVwZGF0ZU1pbkRpc3RhbmNlKHQsITApLHRoaXMuX21pbkRpc3RhbmNlPD10aGlzLl90ZXJtaW5hdGVEaXN0YW5jZT9udWxsOih0WzBdPW51bGwsdFsxXT1udWxsLHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlUG9pbnRzKHIsaSx0KSx2b2lkIHRoaXMudXBkYXRlTWluRGlzdGFuY2UodCwhMSkpKSl9LFRmLnByb3RvdHlwZS5uZWFyZXN0TG9jYXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlKCksdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbn0sVGYucHJvdG90eXBlLnVwZGF0ZU1pbkRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09PXRbMF0pcmV0dXJuIG51bGw7ZT8odGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvblswXT10WzFdLHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMV09dFswXSk6KHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMF09dFswXSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzFdPXRbMV0pfSxUZi5wcm90b3R5cGUubmVhcmVzdFBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZSgpLFt0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzBdLmdldENvb3JkaW5hdGUoKSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzFdLmdldENvb3JkaW5hdGUoKV19LFRmLnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihudWxsIT09dGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbilyZXR1cm4gbnVsbDtpZih0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2UoKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGw7dGhpcy5jb21wdXRlRmFjZXREaXN0YW5jZSgpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBaYyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBRYyl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO2lmKGUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmRpc3RhbmNlKG4uZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKT50aGlzLl9taW5EaXN0YW5jZSlyZXR1cm4gbnVsbDtmb3IodmFyIGk9ZS5nZXRDb29yZGluYXRlcygpLG89bi5nZXRDb29yZGluYXRlKCkscz0wO3M8aS5sZW5ndGgtMTtzKyspe3ZhciBhPVhsLmRpc3RhbmNlUG9pbnRMaW5lKG8saVtzXSxpW3MrMV0pO2lmKGE8dC5fbWluRGlzdGFuY2Upe3QuX21pbkRpc3RhbmNlPWE7dmFyIHU9bmV3IHZwKGlbc10saVtzKzFdKSxsPXUuY2xvc2VzdFBvaW50KG8pO3JbMF09bmV3IE1mKGUscyxsKSxyWzFdPW5ldyBNZihuLDAsbyl9aWYodC5fbWluRGlzdGFuY2U8PXQuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfX1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgQXJyYXkmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgWmMmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgWmMpe3ZhciBjPWFyZ3VtZW50c1swXSxoPWFyZ3VtZW50c1sxXSxwPWFyZ3VtZW50c1syXTtpZihjLmdldEVudmVsb3BlSW50ZXJuYWwoKS5kaXN0YW5jZShoLmdldEVudmVsb3BlSW50ZXJuYWwoKSk+dGhpcy5fbWluRGlzdGFuY2UpcmV0dXJuIG51bGw7Zm9yKHZhciBmPWMuZ2V0Q29vcmRpbmF0ZXMoKSxnPWguZ2V0Q29vcmRpbmF0ZXMoKSxkPTA7ZDxmLmxlbmd0aC0xO2QrKylmb3IodmFyIHk9MDt5PGcubGVuZ3RoLTE7eSsrKXt2YXIgdj1YbC5kaXN0YW5jZUxpbmVMaW5lKGZbZF0sZltkKzFdLGdbeV0sZ1t5KzFdKTtpZih2PHQuX21pbkRpc3RhbmNlKXt0Ll9taW5EaXN0YW5jZT12O3ZhciBfPW5ldyB2cChmW2RdLGZbZCsxXSksbT1uZXcgdnAoZ1t5XSxnW3krMV0pLHg9Xy5jbG9zZXN0UG9pbnRzKG0pO3BbMF09bmV3IE1mKGMsZCx4WzBdKSxwWzFdPW5ldyBNZihoLHkseFsxXSl9aWYodC5fbWluRGlzdGFuY2U8PXQuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfX19LFRmLnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2VQb2ludHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10aGlzLGk9MDtpPHQuc2l6ZSgpO2krKylmb3IodmFyIG89dC5nZXQoaSkscz0wO3M8ZS5zaXplKCk7cysrKXt2YXIgYT1lLmdldChzKSx1PW8uZ2V0Q29vcmRpbmF0ZSgpLmRpc3RhbmNlKGEuZ2V0Q29vcmRpbmF0ZSgpKTtpZih1PHIuX21pbkRpc3RhbmNlJiYoci5fbWluRGlzdGFuY2U9dSxuWzBdPW5ldyBNZihvLDAsby5nZXRDb29yZGluYXRlKCkpLG5bMV09bmV3IE1mKGEsMCxhLmdldENvb3JkaW5hdGUoKSkpLHIuX21pbkRpc3RhbmNlPD1yLl90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gbnVsbH19LFRmLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9nZW9tWzBdfHxudWxsPT09dGhpcy5fZ2VvbVsxXSl0aHJvdyBuZXcgZWwoIm51bGwgZ2VvbWV0cmllcyBhcmUgbm90IHN1cHBvcnRlZCIpO3JldHVybiB0aGlzLl9nZW9tWzBdLmlzRW1wdHkoKXx8dGhpcy5fZ2VvbVsxXS5pc0VtcHR5KCk/MDoodGhpcy5jb21wdXRlTWluRGlzdGFuY2UoKSx0aGlzLl9taW5EaXN0YW5jZSl9LFRmLnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2VMaW5lcz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXRoaXMsaT0wO2k8dC5zaXplKCk7aSsrKWZvcih2YXIgbz10LmdldChpKSxzPTA7czxlLnNpemUoKTtzKyspe3ZhciBhPWUuZ2V0KHMpO2lmKHIuY29tcHV0ZU1pbkRpc3RhbmNlKG8sYSxuKSxyLl9taW5EaXN0YW5jZTw9ci5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fSxUZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sVGYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFRmfSxUZi5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgVGYodCxlKS5kaXN0YW5jZSgpfSxUZi5pc1dpdGhpbkRpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IFRmKHQsZSxuKS5kaXN0YW5jZSgpPD1ufSxUZi5uZWFyZXN0UG9pbnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBUZih0LGUpLm5lYXJlc3RQb2ludHMoKX07dmFyIEFmPWZ1bmN0aW9uKCl7dGhpcy5fcHQ9W25ldyB1bCxuZXcgdWxdLHRoaXMuX2Rpc3RhbmNlPW5sLk5hTix0aGlzLl9pc051bGw9ITB9O0FmLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdH0sQWYucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B0W3RdfSxBZi5wcm90b3R5cGUuc2V0TWluaW11bT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRNaW5pbXVtKHQuX3B0WzBdLHQuX3B0WzFdKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYodGhpcy5faXNOdWxsKXJldHVybiB0aGlzLmluaXRpYWxpemUoZSxuKSxudWxsO3ZhciByPWUuZGlzdGFuY2Uobik7cjx0aGlzLl9kaXN0YW5jZSYmdGhpcy5pbml0aWFsaXplKGUsbixyKX19LEFmLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5faXNOdWxsPSEwO2Vsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wdFswXS5zZXRDb29yZGluYXRlKHQpLHRoaXMuX3B0WzFdLnNldENvb3JkaW5hdGUoZSksdGhpcy5fZGlzdGFuY2U9dC5kaXN0YW5jZShlKSx0aGlzLl9pc051bGw9ITF9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdO3RoaXMuX3B0WzBdLnNldENvb3JkaW5hdGUobiksdGhpcy5fcHRbMV0uc2V0Q29vcmRpbmF0ZShyKSx0aGlzLl9kaXN0YW5jZT1pLHRoaXMuX2lzTnVsbD0hMX19LEFmLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBGbC50b0xpbmVTdHJpbmcodGhpcy5fcHRbMF0sdGhpcy5fcHRbMV0pfSxBZi5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2V9LEFmLnByb3RvdHlwZS5zZXRNYXhpbXVtPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldE1heGltdW0odC5fcHRbMF0sdC5fcHRbMV0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLl9pc051bGwpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShlLG4pLG51bGw7dmFyIHI9ZS5kaXN0YW5jZShuKTtyPnRoaXMuX2Rpc3RhbmNlJiZ0aGlzLmluaXRpYWxpemUoZSxuLHIpfX0sQWYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEFmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBBZn07dmFyIERmPWZ1bmN0aW9uKCl7fTtEZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRGYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIERmfSxEZi5jb21wdXRlRGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFmJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFpjJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKWZvcih2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1uZXcgdnAsaT10LmdldENvb3JkaW5hdGVzKCksbz0wO288aS5sZW5ndGgtMTtvKyspe3Iuc2V0Q29vcmRpbmF0ZXMoaVtvXSxpW28rMV0pO3ZhciBzPXIuY2xvc2VzdFBvaW50KGUpO24uc2V0TWluaW11bShzLGUpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBZiYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0aCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB1bCl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdO0RmLmNvbXB1dGVEaXN0YW5jZShhLmdldEV4dGVyaW9yUmluZygpLHUsbCk7Zm9yKHZhciBjPTA7YzxhLmdldE51bUludGVyaW9yUmluZygpO2MrKylEZi5jb21wdXRlRGlzdGFuY2UoYS5nZXRJbnRlcmlvclJpbmdOKGMpLHUsbCl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFmJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFdsJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKXt2YXIgaD1hcmd1bWVudHNbMF0scD1hcmd1bWVudHNbMV0sZj1hcmd1bWVudHNbMl07aWYoaCBpbnN0YW5jZW9mIFpjKURmLmNvbXB1dGVEaXN0YW5jZShoLHAsZik7ZWxzZSBpZihoIGluc3RhbmNlb2YgdGgpRGYuY29tcHV0ZURpc3RhbmNlKGgscCxmKTtlbHNlIGlmKGggaW5zdGFuY2VvZiBrYylmb3IodmFyIGc9aCxkPTA7ZDxnLmdldE51bUdlb21ldHJpZXMoKTtkKyspe3ZhciB5PWcuZ2V0R2VvbWV0cnlOKGQpO0RmLmNvbXB1dGVEaXN0YW5jZSh5LHAsZil9ZWxzZSBmLnNldE1pbmltdW0oaC5nZXRDb29yZGluYXRlKCkscCl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFmJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZwJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKXt2YXIgdj1hcmd1bWVudHNbMF0sXz1hcmd1bWVudHNbMV0sbT1hcmd1bWVudHNbMl0seD12LmNsb3Nlc3RQb2ludChfKTttLnNldE1pbmltdW0oeCxfKX19O3ZhciBGZj1mdW5jdGlvbigpe3RoaXMuX2cwPW51bGwsdGhpcy5fZzE9bnVsbCx0aGlzLl9wdERpc3Q9bmV3IEFmLHRoaXMuX2RlbnNpZnlGcmFjPTA7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2cwPXQsdGhpcy5fZzE9ZX0sa2Y9e01heFBvaW50RGlzdGFuY2VGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH0sTWF4RGVuc2lmaWVkQnlGcmFjdGlvbkRpc3RhbmNlRmlsdGVyOntjb25maWd1cmFibGU6ITB9fTtGZi5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHREaXN0LmdldENvb3JkaW5hdGVzKCl9LEZmLnByb3RvdHlwZS5zZXREZW5zaWZ5RnJhY3Rpb249ZnVuY3Rpb24odCl7aWYodD4xfHx0PD0wKXRocm93IG5ldyBlbCgiRnJhY3Rpb24gaXMgbm90IGluIHJhbmdlICgwLjAgLSAxLjBdIik7dGhpcy5fZGVuc2lmeUZyYWM9dH0sRmYucHJvdG90eXBlLmNvbXB1dGU9ZnVuY3Rpb24odCxlKXt0aGlzLmNvbXB1dGVPcmllbnRlZERpc3RhbmNlKHQsZSx0aGlzLl9wdERpc3QpLHRoaXMuY29tcHV0ZU9yaWVudGVkRGlzdGFuY2UoZSx0LHRoaXMuX3B0RGlzdCl9LEZmLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXB1dGUodGhpcy5fZzAsdGhpcy5fZzEpLHRoaXMuX3B0RGlzdC5nZXREaXN0YW5jZSgpfSxGZi5wcm90b3R5cGUuY29tcHV0ZU9yaWVudGVkRGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBHZihlKTtpZih0LmFwcGx5KHIpLG4uc2V0TWF4aW11bShyLmdldE1heFBvaW50RGlzdGFuY2UoKSksdGhpcy5fZGVuc2lmeUZyYWM+MCl7dmFyIGk9bmV3IHFmKGUsdGhpcy5fZGVuc2lmeUZyYWMpO3QuYXBwbHkoaSksbi5zZXRNYXhpbXVtKGkuZ2V0TWF4UG9pbnREaXN0YW5jZSgpKX19LEZmLnByb3RvdHlwZS5vcmllbnRlZERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZU9yaWVudGVkRGlzdGFuY2UodGhpcy5fZzAsdGhpcy5fZzEsdGhpcy5fcHREaXN0KSx0aGlzLl9wdERpc3QuZ2V0RGlzdGFuY2UoKX0sRmYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEZmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBGZn0sRmYuZGlzdGFuY2U9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IEZmKHQsZSk7cmV0dXJuIG4uZGlzdGFuY2UoKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdLHM9bmV3IEZmKHIsaSk7cmV0dXJuIHMuc2V0RGVuc2lmeUZyYWN0aW9uKG8pLHMuZGlzdGFuY2UoKX19LGtmLk1heFBvaW50RGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEdmfSxrZi5NYXhEZW5zaWZpZWRCeUZyYWN0aW9uRGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHFmfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGZixrZik7dmFyIEdmPWZ1bmN0aW9uKCl7dGhpcy5fbWF4UHREaXN0PW5ldyBBZix0aGlzLl9taW5QdERpc3Q9bmV3IEFmLHRoaXMuX2V1Y2xpZGVhbkRpc3Q9bmV3IERmLHRoaXMuX2dlb209bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZ2VvbT10fTtHZi5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3RoaXMuX21pblB0RGlzdC5pbml0aWFsaXplKCksRGYuY29tcHV0ZURpc3RhbmNlKHRoaXMuX2dlb20sdCx0aGlzLl9taW5QdERpc3QpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKHRoaXMuX21pblB0RGlzdCl9LEdmLnByb3RvdHlwZS5nZXRNYXhQb2ludERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heFB0RGlzdH0sR2YucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0tsXX0sR2YucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEdmfTt2YXIgcWY9ZnVuY3Rpb24oKXt0aGlzLl9tYXhQdERpc3Q9bmV3IEFmLHRoaXMuX21pblB0RGlzdD1uZXcgQWYsdGhpcy5fZ2VvbT1udWxsLHRoaXMuX251bVN1YlNlZ3M9MDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbT10LHRoaXMuX251bVN1YlNlZ3M9TWF0aC50cnVuYyhNYXRoLnJvdW5kKDEvZSkpfTtxZi5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigwPT09ZSlyZXR1cm4gbnVsbDtmb3IodmFyIHI9dC5nZXRDb29yZGluYXRlKGUtMSksaT10LmdldENvb3JkaW5hdGUoZSksbz0oaS54LXIueCkvdGhpcy5fbnVtU3ViU2VncyxzPShpLnktci55KS90aGlzLl9udW1TdWJTZWdzLGE9MDthPHRoaXMuX251bVN1YlNlZ3M7YSsrKXt2YXIgdT1yLngrYSpvLGw9ci55K2EqcyxjPW5ldyB1bCh1LGwpO24uX21pblB0RGlzdC5pbml0aWFsaXplKCksRGYuY29tcHV0ZURpc3RhbmNlKG4uX2dlb20sYyxuLl9taW5QdERpc3QpLG4uX21heFB0RGlzdC5zZXRNYXhpbXVtKG4uX21pblB0RGlzdCl9fSxxZi5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LHFmLnByb3RvdHlwZS5pc0dlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3JldHVybiExfSxxZi5wcm90b3R5cGUuZ2V0TWF4UG9pbnREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LHFmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltGY119LHFmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxZn07dmFyIEJmPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9taW5WYWxpZERpc3RhbmNlPW51bGwsdGhpcy5fbWF4VmFsaWREaXN0YW5jZT1udWxsLHRoaXMuX21pbkRpc3RhbmNlRm91bmQ9bnVsbCx0aGlzLl9tYXhEaXN0YW5jZUZvdW5kPW51bGwsdGhpcy5faXNWYWxpZD0hMCx0aGlzLl9lcnJNc2c9bnVsbCx0aGlzLl9lcnJvckxvY2F0aW9uPW51bGwsdGhpcy5fZXJyb3JJbmRpY2F0b3I9bnVsbCx0aGlzLl9pbnB1dD10fHxudWxsLHRoaXMuX2J1ZkRpc3RhbmNlPWV8fG51bGwsdGhpcy5fcmVzdWx0PW58fG51bGx9LHpmPXtWRVJCT1NFOntjb25maWd1cmFibGU6ITB9LE1BWF9ESVNUQU5DRV9ESUZGX0ZSQUM6e2NvbmZpZ3VyYWJsZTohMH19O0JmLnByb3RvdHlwZS5jaGVja01heGltdW1EaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IEZmKGUsdCk7aWYoci5zZXREZW5zaWZ5RnJhY3Rpb24oLjI1KSx0aGlzLl9tYXhEaXN0YW5jZUZvdW5kPXIub3JpZW50ZWREaXN0YW5jZSgpLHRoaXMuX21heERpc3RhbmNlRm91bmQ+bil7dGhpcy5faXNWYWxpZD0hMTt2YXIgaT1yLmdldENvb3JkaW5hdGVzKCk7dGhpcy5fZXJyb3JMb2NhdGlvbj1pWzFdLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcoaSksdGhpcy5fZXJyTXNnPSJEaXN0YW5jZSBiZXR3ZWVuIGJ1ZmZlciBjdXJ2ZSBhbmQgaW5wdXQgaXMgdG9vIGxhcmdlICgiK3RoaXMuX21heERpc3RhbmNlRm91bmQrIiBhdCAiK0ZsLnRvTGluZVN0cmluZyhpWzBdLGlbMV0pKyIpIn19LEJmLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7dmFyIHQ9TWF0aC5hYnModGhpcy5fYnVmRGlzdGFuY2UpLGU9QmYuTUFYX0RJU1RBTkNFX0RJRkZfRlJBQyp0O3JldHVybiB0aGlzLl9taW5WYWxpZERpc3RhbmNlPXQtZSx0aGlzLl9tYXhWYWxpZERpc3RhbmNlPXQrZSwhKCF0aGlzLl9pbnB1dC5pc0VtcHR5KCkmJiF0aGlzLl9yZXN1bHQuaXNFbXB0eSgpKXx8KHRoaXMuX2J1ZkRpc3RhbmNlPjA/dGhpcy5jaGVja1Bvc2l0aXZlVmFsaWQoKTp0aGlzLmNoZWNrTmVnYXRpdmVWYWxpZCgpLEJmLlZFUkJPU0UmJlBsLm91dC5wcmludGxuKCJNaW4gRGlzdD0gIit0aGlzLl9taW5EaXN0YW5jZUZvdW5kKyIgIGVycj0gIisoMS10aGlzLl9taW5EaXN0YW5jZUZvdW5kL3RoaXMuX2J1ZkRpc3RhbmNlKSsiICBNYXggRGlzdD0gIit0aGlzLl9tYXhEaXN0YW5jZUZvdW5kKyIgIGVycj0gIisodGhpcy5fbWF4RGlzdGFuY2VGb3VuZC90aGlzLl9idWZEaXN0YW5jZS0xKSksdGhpcy5faXNWYWxpZCl9LEJmLnByb3RvdHlwZS5jaGVja05lZ2F0aXZlVmFsaWQ9ZnVuY3Rpb24oKXtpZighKHRoaXMuX2lucHV0IGluc3RhbmNlb2YgdGh8fHRoaXMuX2lucHV0IGluc3RhbmNlb2Ygcmh8fHRoaXMuX2lucHV0IGluc3RhbmNlb2Yga2MpKXJldHVybiBudWxsO3ZhciB0PXRoaXMuZ2V0UG9seWdvbkxpbmVzKHRoaXMuX2lucHV0KTtpZih0aGlzLmNoZWNrTWluaW11bURpc3RhbmNlKHQsdGhpcy5fcmVzdWx0LHRoaXMuX21pblZhbGlkRGlzdGFuY2UpLCF0aGlzLl9pc1ZhbGlkKXJldHVybiBudWxsO3RoaXMuY2hlY2tNYXhpbXVtRGlzdGFuY2UodCx0aGlzLl9yZXN1bHQsdGhpcy5fbWF4VmFsaWREaXN0YW5jZSl9LEJmLnByb3RvdHlwZS5nZXRFcnJvckluZGljYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJvckluZGljYXRvcn0sQmYucHJvdG90eXBlLmNoZWNrTWluaW11bURpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgVGYodCxlLG4pO2lmKHRoaXMuX21pbkRpc3RhbmNlRm91bmQ9ci5kaXN0YW5jZSgpLHRoaXMuX21pbkRpc3RhbmNlRm91bmQ8bil7dGhpcy5faXNWYWxpZD0hMTt2YXIgaT1yLm5lYXJlc3RQb2ludHMoKTt0aGlzLl9lcnJvckxvY2F0aW9uPXIubmVhcmVzdFBvaW50cygpWzFdLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcoaSksdGhpcy5fZXJyTXNnPSJEaXN0YW5jZSBiZXR3ZWVuIGJ1ZmZlciBjdXJ2ZSBhbmQgaW5wdXQgaXMgdG9vIHNtYWxsICgiK3RoaXMuX21pbkRpc3RhbmNlRm91bmQrIiBhdCAiK0ZsLnRvTGluZVN0cmluZyhpWzBdLGlbMV0pKyIgKSJ9fSxCZi5wcm90b3R5cGUuY2hlY2tQb3NpdGl2ZVZhbGlkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVzdWx0LmdldEJvdW5kYXJ5KCk7aWYodGhpcy5jaGVja01pbmltdW1EaXN0YW5jZSh0aGlzLl9pbnB1dCx0LHRoaXMuX21pblZhbGlkRGlzdGFuY2UpLCF0aGlzLl9pc1ZhbGlkKXJldHVybiBudWxsO3RoaXMuY2hlY2tNYXhpbXVtRGlzdGFuY2UodGhpcy5faW5wdXQsdCx0aGlzLl9tYXhWYWxpZERpc3RhbmNlKX0sQmYucHJvdG90eXBlLmdldEVycm9yTG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JMb2NhdGlvbn0sQmYucHJvdG90eXBlLmdldFBvbHlnb25MaW5lcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGxjLG49bmV3IENmKGUpLHI9U2YuZ2V0UG9seWdvbnModCkuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3IubmV4dCgpLmFwcGx5KG4pfXJldHVybiB0LmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KGUpfSxCZi5wcm90b3R5cGUuZ2V0RXJyb3JNZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vyck1zZ30sQmYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEJmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBCZn0semYuVkVSQk9TRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0semYuTUFYX0RJU1RBTkNFX0RJRkZfRlJBQy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDEyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhCZix6Zik7dmFyIGpmPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9pc1ZhbGlkPSEwLHRoaXMuX2Vycm9yTXNnPW51bGwsdGhpcy5fZXJyb3JMb2NhdGlvbj1udWxsLHRoaXMuX2Vycm9ySW5kaWNhdG9yPW51bGwsdGhpcy5faW5wdXQ9dHx8bnVsbCx0aGlzLl9kaXN0YW5jZT1lfHxudWxsLHRoaXMuX3Jlc3VsdD1ufHxudWxsfSxVZj17VkVSQk9TRTp7Y29uZmlndXJhYmxlOiEwfSxNQVhfRU5WX0RJRkZfRlJBQzp7Y29uZmlndXJhYmxlOiEwfX07amYucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGVja1BvbHlnb25hbCgpLHRoaXMuX2lzVmFsaWQ/KHRoaXMuY2hlY2tFeHBlY3RlZEVtcHR5KCksdGhpcy5faXNWYWxpZD8odGhpcy5jaGVja0VudmVsb3BlKCksdGhpcy5faXNWYWxpZD8odGhpcy5jaGVja0FyZWEoKSx0aGlzLl9pc1ZhbGlkPyh0aGlzLmNoZWNrRGlzdGFuY2UoKSx0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkfSxqZi5wcm90b3R5cGUuY2hlY2tFbnZlbG9wZT1mdW5jdGlvbigpe2lmKHRoaXMuX2Rpc3RhbmNlPDApcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5fZGlzdGFuY2UqamYuTUFYX0VOVl9ESUZGX0ZSQUM7MD09PXQmJih0PS4wMDEpO3ZhciBlPW5ldyBMbCh0aGlzLl9pbnB1dC5nZXRFbnZlbG9wZUludGVybmFsKCkpO2UuZXhwYW5kQnkodGhpcy5fZGlzdGFuY2UpO3ZhciBuPW5ldyBMbCh0aGlzLl9yZXN1bHQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKTtuLmV4cGFuZEJ5KHQpLG4uY29udGFpbnMoZSl8fCh0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPSJCdWZmZXIgZW52ZWxvcGUgaXMgaW5jb3JyZWN0Iix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9pbnB1dC5nZXRGYWN0b3J5KCkudG9HZW9tZXRyeShuKSksdGhpcy5yZXBvcnQoIkVudmVsb3BlIil9LGpmLnByb3RvdHlwZS5jaGVja0Rpc3RhbmNlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEJmKHRoaXMuX2lucHV0LHRoaXMuX2Rpc3RhbmNlLHRoaXMuX3Jlc3VsdCk7dC5pc1ZhbGlkKCl8fCh0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPXQuZ2V0RXJyb3JNZXNzYWdlKCksdGhpcy5fZXJyb3JMb2NhdGlvbj10LmdldEVycm9yTG9jYXRpb24oKSx0aGlzLl9lcnJvckluZGljYXRvcj10LmdldEVycm9ySW5kaWNhdG9yKCkpLHRoaXMucmVwb3J0KCJEaXN0YW5jZSIpfSxqZi5wcm90b3R5cGUuY2hlY2tBcmVhPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faW5wdXQuZ2V0QXJlYSgpLGU9dGhpcy5fcmVzdWx0LmdldEFyZWEoKTt0aGlzLl9kaXN0YW5jZT4wJiZ0PmUmJih0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPSJBcmVhIG9mIHBvc2l0aXZlIGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gaW5wdXQiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCksdGhpcy5fZGlzdGFuY2U8MCYmdDxlJiYodGhpcy5faXNWYWxpZD0hMSx0aGlzLl9lcnJvck1zZz0iQXJlYSBvZiBuZWdhdGl2ZSBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gaW5wdXQiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCksdGhpcy5yZXBvcnQoIkFyZWEiKX0samYucHJvdG90eXBlLmNoZWNrUG9seWdvbmFsPWZ1bmN0aW9uKCl7dGhpcy5fcmVzdWx0IGluc3RhbmNlb2YgdGh8fHRoaXMuX3Jlc3VsdCBpbnN0YW5jZW9mIHJofHwodGhpcy5faXNWYWxpZD0hMSksdGhpcy5fZXJyb3JNc2c9IlJlc3VsdCBpcyBub3QgcG9seWdvbmFsIix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9yZXN1bHQsdGhpcy5yZXBvcnQoIlBvbHlnb25hbCIpfSxqZi5wcm90b3R5cGUuZ2V0RXJyb3JJbmRpY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JJbmRpY2F0b3J9LGpmLnByb3RvdHlwZS5nZXRFcnJvckxvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vycm9yTG9jYXRpb259LGpmLnByb3RvdHlwZS5jaGVja0V4cGVjdGVkRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5wdXQuZ2V0RGltZW5zaW9uKCk+PTJ8fHRoaXMuX2Rpc3RhbmNlPjA/bnVsbDoodGhpcy5fcmVzdWx0LmlzRW1wdHkoKXx8KHRoaXMuX2lzVmFsaWQ9ITEsdGhpcy5fZXJyb3JNc2c9IlJlc3VsdCBpcyBub24tZW1wdHkiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCksdm9pZCB0aGlzLnJlcG9ydCgiRXhwZWN0ZWRFbXB0eSIpKX0samYucHJvdG90eXBlLnJlcG9ydD1mdW5jdGlvbih0KXtpZighamYuVkVSQk9TRSlyZXR1cm4gbnVsbDtQbC5vdXQucHJpbnRsbigiQ2hlY2sgIit0KyI6ICIrKHRoaXMuX2lzVmFsaWQ/InBhc3NlZCI6IkZBSUxFRCIpKX0samYucHJvdG90eXBlLmdldEVycm9yTWVzc2FnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJvck1zZ30samYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGpmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBqZn0samYuaXNWYWxpZE1zZz1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IGpmKHQsZSxuKTtyZXR1cm4gci5pc1ZhbGlkKCk/bnVsbDpyLmdldEVycm9yTWVzc2FnZSgpfSxqZi5pc1ZhbGlkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIW5ldyBqZih0LGUsbikuaXNWYWxpZCgpfSxVZi5WRVJCT1NFLmdldD1mdW5jdGlvbigpe3JldHVybiExfSxVZi5NQVhfRU5WX0RJRkZfRlJBQy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDEyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhqZixVZik7dmFyIFZmPWZ1bmN0aW9uKCl7dGhpcy5fcHRzPW51bGwsdGhpcy5fZGF0YT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wdHM9dCx0aGlzLl9kYXRhPWV9O1ZmLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHN9LFZmLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0cy5sZW5ndGh9LFZmLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdHNbdF19LFZmLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHNbMF0uZXF1YWxzKHRoaXMuX3B0c1t0aGlzLl9wdHMubGVuZ3RoLTFdKX0sVmYucHJvdG90eXBlLmdldFNlZ21lbnRPY3RhbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT10aGlzLl9wdHMubGVuZ3RoLTE/LTE6ZnAub2N0YW50KHRoaXMuZ2V0Q29vcmRpbmF0ZSh0KSx0aGlzLmdldENvb3JkaW5hdGUodCsxKSl9LFZmLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX2RhdGE9dH0sVmYucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sVmYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEZsLnRvTGluZVN0cmluZyhuZXcgbGgodGhpcy5fcHRzKSl9LFZmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltncF19LFZmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBWZn07dmFyIFhmPWZ1bmN0aW9uKCl7dGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnM9ITEsdGhpcy5faXNDaGVja0VuZFNlZ21lbnRzT25seT0hMSx0aGlzLl9saT1udWxsLHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uPW51bGwsdGhpcy5faW50U2VnbWVudHM9bnVsbCx0aGlzLl9pbnRlcnNlY3Rpb25zPW5ldyBsYyx0aGlzLl9pbnRlcnNlY3Rpb25Db3VudD0wLHRoaXMuX2tlZXBJbnRlcnNlY3Rpb25zPSEwO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9saT10LHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uPW51bGx9O1hmLnByb3RvdHlwZS5nZXRJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbn0sWGYucHJvdG90eXBlLnNldENoZWNrRW5kU2VnbWVudHNPbmx5PWZ1bmN0aW9uKHQpe3RoaXMuX2lzQ2hlY2tFbmRTZWdtZW50c09ubHk9dH0sWGYucHJvdG90eXBlLmdldEludGVyc2VjdGlvblNlZ21lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludFNlZ21lbnRzfSxYZi5wcm90b3R5cGUuY291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW50ZXJzZWN0aW9uQ291bnR9LFhmLnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludGVyc2VjdGlvbnN9LFhmLnByb3RvdHlwZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0KXt0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz10fSxYZi5wcm90b3R5cGUuc2V0S2VlcEludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCl7dGhpcy5fa2VlcEludGVyc2VjdGlvbnM9dH0sWGYucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCF0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucyYmdGhpcy5oYXNJbnRlcnNlY3Rpb24oKSlyZXR1cm4gbnVsbDtpZih0PT09biYmZT09PXIpcmV0dXJuIG51bGw7aWYodGhpcy5faXNDaGVja0VuZFNlZ21lbnRzT25seSYmISh0aGlzLmlzRW5kU2VnbWVudCh0LGUpfHx0aGlzLmlzRW5kU2VnbWVudChuLHIpKSlyZXR1cm4gbnVsbDt2YXIgaT10LmdldENvb3JkaW5hdGVzKClbZV0sbz10LmdldENvb3JkaW5hdGVzKClbZSsxXSxzPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyXSxhPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyKzFdO3RoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oaSxvLHMsYSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJnRoaXMuX2xpLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oKSYmKHRoaXMuX2ludFNlZ21lbnRzPW5ldyBBcnJheSg0KS5maWxsKG51bGwpLHRoaXMuX2ludFNlZ21lbnRzWzBdPWksdGhpcy5faW50U2VnbWVudHNbMV09byx0aGlzLl9pbnRTZWdtZW50c1syXT1zLHRoaXMuX2ludFNlZ21lbnRzWzNdPWEsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb249dGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uKDApLHRoaXMuX2tlZXBJbnRlcnNlY3Rpb25zJiZ0aGlzLl9pbnRlcnNlY3Rpb25zLmFkZCh0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbiksdGhpcy5faW50ZXJzZWN0aW9uQ291bnQrKyl9LFhmLnByb3RvdHlwZS5pc0VuZFNlZ21lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMD09PWV8fGU+PXQuc2l6ZSgpLTJ9LFhmLnByb3RvdHlwZS5oYXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ufSxYZi5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2ZpbmRBbGxJbnRlcnNlY3Rpb25zJiZudWxsIT09dGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb259LFhmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltacF19LFhmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBYZn0sWGYuY3JlYXRlQWxsSW50ZXJzZWN0aW9uc0ZpbmRlcj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgWGYodCk7cmV0dXJuIGUuc2V0RmluZEFsbEludGVyc2VjdGlvbnMoITApLGV9LFhmLmNyZWF0ZUFueUludGVyc2VjdGlvbkZpbmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFhmKHQpfSxYZi5jcmVhdGVJbnRlcnNlY3Rpb25Db3VudGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBYZih0KTtyZXR1cm4gZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyghMCksZS5zZXRLZWVwSW50ZXJzZWN0aW9ucyghMSksZX07dmFyIFlmPWZ1bmN0aW9uKCl7dGhpcy5fbGk9bmV3IGpsLHRoaXMuX3NlZ1N0cmluZ3M9bnVsbCx0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz0hMSx0aGlzLl9zZWdJbnQ9bnVsbCx0aGlzLl9pc1ZhbGlkPSEwO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9zZWdTdHJpbmdzPXR9O1lmLnByb3RvdHlwZS5leGVjdXRlPWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3NlZ0ludClyZXR1cm4gbnVsbDt0aGlzLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zKCl9LFlmLnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NlZ0ludC5nZXRJbnRlcnNlY3Rpb25zKCl9LFlmLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXhlY3V0ZSgpLHRoaXMuX2lzVmFsaWR9LFlmLnByb3RvdHlwZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0KXt0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz10fSxZZi5wcm90b3R5cGUuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLl9pc1ZhbGlkPSEwLHRoaXMuX3NlZ0ludD1uZXcgWGYodGhpcy5fbGkpLHRoaXMuX3NlZ0ludC5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyh0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucyk7dmFyIHQ9bmV3IElwO2lmKHQuc2V0U2VnbWVudEludGVyc2VjdG9yKHRoaXMuX3NlZ0ludCksdC5jb21wdXRlTm9kZXModGhpcy5fc2VnU3RyaW5ncyksdGhpcy5fc2VnSW50Lmhhc0ludGVyc2VjdGlvbigpKXJldHVybiB0aGlzLl9pc1ZhbGlkPSExLG51bGx9LFlmLnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7aWYodGhpcy5leGVjdXRlKCksIXRoaXMuX2lzVmFsaWQpdGhyb3cgbmV3IE9oKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKCksdGhpcy5fc2VnSW50LmdldEludGVyaW9ySW50ZXJzZWN0aW9uKCkpfSxZZi5wcm90b3R5cGUuZ2V0RXJyb3JNZXNzYWdlPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNWYWxpZClyZXR1cm4ibm8gaW50ZXJzZWN0aW9ucyBmb3VuZCI7dmFyIHQ9dGhpcy5fc2VnSW50LmdldEludGVyc2VjdGlvblNlZ21lbnRzKCk7cmV0dXJuImZvdW5kIG5vbi1ub2RlZCBpbnRlcnNlY3Rpb24gYmV0d2VlbiAiK0ZsLnRvTGluZVN0cmluZyh0WzBdLHRbMV0pKyIgYW5kICIrRmwudG9MaW5lU3RyaW5nKHRbMl0sdFszXSl9LFlmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxZZi5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWWZ9LFlmLmNvbXB1dGVJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBZZih0KTtyZXR1cm4gZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyghMCksZS5pc1ZhbGlkKCksZS5nZXRJbnRlcnNlY3Rpb25zKCl9O3ZhciBIZj1mdW5jdGlvbiB0KCl7dGhpcy5fbnY9bnVsbDt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fbnY9bmV3IFlmKHQudG9TZWdtZW50U3RyaW5ncyhlKSl9O0hmLnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7dGhpcy5fbnYuY2hlY2tWYWxpZCgpfSxIZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSGYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEhmfSxIZi50b1NlZ21lbnRTdHJpbmdzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgbGMsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtlLmFkZChuZXcgVmYoci5nZXRDb29yZGluYXRlcygpLHIpKX1yZXR1cm4gZX0sSGYuY2hlY2tWYWxpZD1mdW5jdGlvbih0KXtuZXcgSGYodCkuY2hlY2tWYWxpZCgpfTt2YXIgV2Y9ZnVuY3Rpb24odCl7dGhpcy5fbWFwT3A9dH07V2YucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGxjLG49MDtuPHQuZ2V0TnVtR2VvbWV0cmllcygpO24rKyl7dmFyIHI9dGhpcy5fbWFwT3AubWFwKHQuZ2V0R2VvbWV0cnlOKG4pKTtyLmlzRW1wdHkoKXx8ZS5hZGQocil9cmV0dXJuIHQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihfaC50b0dlb21ldHJ5QXJyYXkoZSkpfSxXZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sV2YucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFdmfSxXZi5tYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFdmKGUpLm1hcCh0KX07dmFyIEpmPWZ1bmN0aW9uKCl7dGhpcy5fb3A9bnVsbCx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9bnVsbCx0aGlzLl9wdExvY2F0b3I9bnVsbCx0aGlzLl9saW5lRWRnZXNMaXN0PW5ldyBsYyx0aGlzLl9yZXN1bHRMaW5lTGlzdD1uZXcgbGM7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX29wPXQsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PWUsdGhpcy5fcHRMb2NhdG9yPW59O0pmLnByb3RvdHlwZS5jb2xsZWN0TGluZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj10aGlzLl9vcC5nZXRHcmFwaCgpLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2UuY29sbGVjdExpbmVFZGdlKHIsdCxlLl9saW5lRWRnZXNMaXN0KSxlLmNvbGxlY3RCb3VuZGFyeVRvdWNoRWRnZShyLHQsZS5fbGluZUVkZ2VzTGlzdCl9fSxKZi5wcm90b3R5cGUubGFiZWxJc29sYXRlZExpbmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9wdExvY2F0b3IubG9jYXRlKHQuZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuX29wLmdldEFyZ0dlb21ldHJ5KGUpKTt0LmdldExhYmVsKCkuc2V0TG9jYXRpb24oZSxuKX0sSmYucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbmRDb3ZlcmVkTGluZUVkZ2VzKCksdGhpcy5jb2xsZWN0TGluZXModCksdGhpcy5idWlsZExpbmVzKHQpLHRoaXMuX3Jlc3VsdExpbmVMaXN0fSxKZi5wcm90b3R5cGUuY29sbGVjdExpbmVFZGdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmdldExhYmVsKCksaT10LmdldEVkZ2UoKTt0LmlzTGluZUVkZ2UoKSYmKHQuaXNWaXNpdGVkKCl8fCFNZy5pc1Jlc3VsdE9mT3AocixlKXx8aS5pc0NvdmVyZWQoKXx8KG4uYWRkKGkpLHQuc2V0VmlzaXRlZEVkZ2UoITApKSl9LEpmLnByb3RvdHlwZS5maW5kQ292ZXJlZExpbmVFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9vcC5nZXRHcmFwaCgpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLmdldEVkZ2VzKCkuZmluZENvdmVyZWRMaW5lRWRnZXMoKX1mb3IodmFyIGU9dGhpcy5fb3AuZ2V0R3JhcGgoKS5nZXRFZGdlRW5kcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPW4uZ2V0RWRnZSgpO2lmKG4uaXNMaW5lRWRnZSgpJiYhci5pc0NvdmVyZWRTZXQoKSl7dmFyIGk9dGhpcy5fb3AuaXNDb3ZlcmVkQnlBKG4uZ2V0Q29vcmRpbmF0ZSgpKTtyLnNldENvdmVyZWQoaSl9fX0sSmYucHJvdG90eXBlLmxhYmVsSXNvbGF0ZWRMaW5lcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkscj1uLmdldExhYmVsKCk7bi5pc0lzb2xhdGVkKCkmJihyLmlzTnVsbCgwKT90aGlzLmxhYmVsSXNvbGF0ZWRMaW5lKG4sMCk6dGhpcy5sYWJlbElzb2xhdGVkTGluZShuLDEpKX19LEpmLnByb3RvdHlwZS5idWlsZExpbmVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9saW5lRWRnZXNMaXN0Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPXRoaXMuX2dlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKG4uZ2V0Q29vcmRpbmF0ZXMoKSk7dGhpcy5fcmVzdWx0TGluZUxpc3QuYWRkKHIpLG4uc2V0SW5SZXN1bHQoITApfX0sSmYucHJvdG90eXBlLmNvbGxlY3RCb3VuZGFyeVRvdWNoRWRnZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXRMYWJlbCgpO3JldHVybiB0LmlzTGluZUVkZ2UoKXx8dC5pc1Zpc2l0ZWQoKXx8dC5pc0ludGVyaW9yQXJlYUVkZ2UoKXx8dC5nZXRFZGdlKCkuaXNJblJlc3VsdCgpP251bGw6KHFsLmlzVHJ1ZSghKHQuaXNJblJlc3VsdCgpfHx0LmdldFN5bSgpLmlzSW5SZXN1bHQoKSl8fCF0LmdldEVkZ2UoKS5pc0luUmVzdWx0KCkpLHZvaWQoTWcuaXNSZXN1bHRPZk9wKHIsZSkmJmU9PT1NZy5JTlRFUlNFQ1RJT04mJihuLmFkZCh0LmdldEVkZ2UoKSksdC5zZXRWaXNpdGVkRWRnZSghMCkpKSl9LEpmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxKZi5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSmZ9O3ZhciBaZj1mdW5jdGlvbigpe3RoaXMuX29wPW51bGwsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PW51bGwsdGhpcy5fcmVzdWx0UG9pbnRMaXN0PW5ldyBsYzt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fb3A9dCx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9ZX07WmYucHJvdG90eXBlLmZpbHRlckNvdmVyZWROb2RlVG9Qb2ludD1mdW5jdGlvbih0KXt2YXIgZT10LmdldENvb3JkaW5hdGUoKTtpZighdGhpcy5fb3AuaXNDb3ZlcmVkQnlMQShlKSl7dmFyIG49dGhpcy5fZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvaW50KGUpO3RoaXMuX3Jlc3VsdFBvaW50TGlzdC5hZGQobil9fSxaZi5wcm90b3R5cGUuZXh0cmFjdE5vbkNvdmVyZWRSZXN1bHROb2Rlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fb3AuZ2V0R3JhcGgoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtpZighbi5pc0luUmVzdWx0KCkmJighbi5pc0luY2lkZW50RWRnZUluUmVzdWx0KCkmJigwPT09bi5nZXRFZGdlcygpLmdldERlZ3JlZSgpfHx0PT09TWcuSU5URVJTRUNUSU9OKSkpe3ZhciByPW4uZ2V0TGFiZWwoKTtNZy5pc1Jlc3VsdE9mT3Aocix0KSYmdGhpcy5maWx0ZXJDb3ZlcmVkTm9kZVRvUG9pbnQobil9fX0sWmYucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmV4dHJhY3ROb25Db3ZlcmVkUmVzdWx0Tm9kZXModCksdGhpcy5fcmVzdWx0UG9pbnRMaXN0fSxaZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWmYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFpmfTt2YXIgS2Y9ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEdlb209bnVsbCx0aGlzLl9mYWN0b3J5PW51bGwsdGhpcy5fcHJ1bmVFbXB0eUdlb21ldHJ5PSEwLHRoaXMuX3ByZXNlcnZlR2VvbWV0cnlDb2xsZWN0aW9uVHlwZT0hMCx0aGlzLl9wcmVzZXJ2ZUNvbGxlY3Rpb25zPSExLHRoaXMuX3ByZXNlcnZlVHlwZT0hMX07S2YucHJvdG90eXBlLnRyYW5zZm9ybVBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9pbnQodGhpcy50cmFuc2Zvcm1Db29yZGluYXRlcyh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpKX0sS2YucHJvdG90eXBlLnRyYW5zZm9ybVBvbHlnb249ZnVuY3Rpb24odCxlKXt2YXIgbj0hMCxyPXRoaXMudHJhbnNmb3JtTGluZWFyUmluZyh0LmdldEV4dGVyaW9yUmluZygpLHQpO251bGwhPT1yJiZyIGluc3RhbmNlb2YgbmgmJiFyLmlzRW1wdHkoKXx8KG49ITEpO2Zvcih2YXIgaT1uZXcgbGMsbz0wO288dC5nZXROdW1JbnRlcmlvclJpbmcoKTtvKyspe3ZhciBzPXRoaXMudHJhbnNmb3JtTGluZWFyUmluZyh0LmdldEludGVyaW9yUmluZ04obyksdCk7bnVsbD09PXN8fHMuaXNFbXB0eSgpfHwocyBpbnN0YW5jZW9mIG5ofHwobj0hMSksaS5hZGQocykpfWlmKG4pcmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9seWdvbihyLGkudG9BcnJheShbXSkpO3ZhciBhPW5ldyBsYztyZXR1cm4gbnVsbCE9PXImJmEuYWRkKHIpLGEuYWRkQWxsKGkpLHRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShhKX0sS2YucHJvdG90eXBlLmNyZWF0ZUNvb3JkaW5hdGVTZXF1ZW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZmFjdG9yeS5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKHQpfSxLZi5wcm90b3R5cGUuZ2V0SW5wdXRHZW9tZXRyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnB1dEdlb219LEtmLnByb3RvdHlwZS50cmFuc2Zvcm1NdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IGxjLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9dGhpcy50cmFuc2Zvcm1MaW5lU3RyaW5nKHQuZ2V0R2VvbWV0cnlOKHIpLHQpO251bGwhPT1pJiYoaS5pc0VtcHR5KCl8fG4uYWRkKGkpKX1yZXR1cm4gdGhpcy5fZmFjdG9yeS5idWlsZEdlb21ldHJ5KG4pfSxLZi5wcm90b3R5cGUudHJhbnNmb3JtQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb3B5KHQpfSxLZi5wcm90b3R5cGUudHJhbnNmb3JtTGluZVN0cmluZz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZUxpbmVTdHJpbmcodGhpcy50cmFuc2Zvcm1Db29yZGluYXRlcyh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpKX0sS2YucHJvdG90eXBlLnRyYW5zZm9ybU11bHRpUG9pbnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IGxjLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9dGhpcy50cmFuc2Zvcm1Qb2ludCh0LmdldEdlb21ldHJ5TihyKSx0KTtudWxsIT09aSYmKGkuaXNFbXB0eSgpfHxuLmFkZChpKSl9cmV0dXJuIHRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShuKX0sS2YucHJvdG90eXBlLnRyYW5zZm9ybU11bHRpUG9seWdvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgbGMscj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10aGlzLnRyYW5zZm9ybVBvbHlnb24odC5nZXRHZW9tZXRyeU4ociksdCk7bnVsbCE9PWkmJihpLmlzRW1wdHkoKXx8bi5hZGQoaSkpfXJldHVybiB0aGlzLl9mYWN0b3J5LmJ1aWxkR2VvbWV0cnkobil9LEtmLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKX0sS2YucHJvdG90eXBlLnRyYW5zZm9ybUdlb21ldHJ5Q29sbGVjdGlvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgbGMscj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10aGlzLnRyYW5zZm9ybSh0LmdldEdlb21ldHJ5TihyKSk7bnVsbCE9PWkmJih0aGlzLl9wcnVuZUVtcHR5R2VvbWV0cnkmJmkuaXNFbXB0eSgpfHxuLmFkZChpKSl9cmV0dXJuIHRoaXMuX3ByZXNlcnZlR2VvbWV0cnlDb2xsZWN0aW9uVHlwZT90aGlzLl9mYWN0b3J5LmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihfaC50b0dlb21ldHJ5QXJyYXkobikpOnRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShuKX0sS2YucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbih0KXtpZih0aGlzLl9pbnB1dEdlb209dCx0aGlzLl9mYWN0b3J5PXQuZ2V0RmFjdG9yeSgpLHQgaW5zdGFuY2VvZiBRYylyZXR1cm4gdGhpcy50cmFuc2Zvcm1Qb2ludCh0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBlaClyZXR1cm4gdGhpcy50cmFuc2Zvcm1NdWx0aVBvaW50KHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIG5oKXJldHVybiB0aGlzLnRyYW5zZm9ybUxpbmVhclJpbmcodCxudWxsKTtpZih0IGluc3RhbmNlb2YgWmMpcmV0dXJuIHRoaXMudHJhbnNmb3JtTGluZVN0cmluZyh0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBHYylyZXR1cm4gdGhpcy50cmFuc2Zvcm1NdWx0aUxpbmVTdHJpbmcodCxudWxsKTtpZih0IGluc3RhbmNlb2YgdGgpcmV0dXJuIHRoaXMudHJhbnNmb3JtUG9seWdvbih0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiByaClyZXR1cm4gdGhpcy50cmFuc2Zvcm1NdWx0aVBvbHlnb24odCxudWxsKTtpZih0IGluc3RhbmNlb2Yga2MpcmV0dXJuIHRoaXMudHJhbnNmb3JtR2VvbWV0cnlDb2xsZWN0aW9uKHQsbnVsbCk7dGhyb3cgbmV3IGVsKCJVbmtub3duIEdlb21ldHJ5IHN1YnR5cGU6ICIrdC5nZXRDbGFzcygpLmdldE5hbWUoKSl9LEtmLnByb3RvdHlwZS50cmFuc2Zvcm1MaW5lYXJSaW5nPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy50cmFuc2Zvcm1Db29yZGluYXRlcyh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpO2lmKG51bGw9PT1uKXJldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcobnVsbCk7dmFyIHI9bi5zaXplKCk7cmV0dXJuIHI+MCYmcjw0JiYhdGhpcy5fcHJlc2VydmVUeXBlP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTGluZVN0cmluZyhuKTp0aGlzLl9mYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcobil9LEtmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxLZi5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gS2Z9O3ZhciBRZj1mdW5jdGlvbiB0KCl7aWYodGhpcy5fc25hcFRvbGVyYW5jZT0wLHRoaXMuX3NyY1B0cz1udWxsLHRoaXMuX3NlZz1uZXcgdnAsdGhpcy5fYWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXM9ITEsdGhpcy5faXNDbG9zZWQ9ITEsYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBaYyYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0LmNhbGwodGhpcyxlLmdldENvb3JkaW5hdGVzKCksbil9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3RoaXMuX3NyY1B0cz1yLHRoaXMuX2lzQ2xvc2VkPXQuaXNDbG9zZWQociksdGhpcy5fc25hcFRvbGVyYW5jZT1pfX07UWYucHJvdG90eXBlLnNuYXBWZXJ0aWNlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLl9pc0Nsb3NlZD90LnNpemUoKS0xOnQuc2l6ZSgpLHI9MDtyPG47cisrKXt2YXIgaT10LmdldChyKSxvPXRoaXMuZmluZFNuYXBGb3JWZXJ0ZXgoaSxlKTtudWxsIT09byYmKHQuc2V0KHIsbmV3IHVsKG8pKSwwPT09ciYmdGhpcy5faXNDbG9zZWQmJnQuc2V0KHQuc2l6ZSgpLTEsbmV3IHVsKG8pKSl9fSxRZi5wcm90b3R5cGUuZmluZFNuYXBGb3JWZXJ0ZXg9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7aWYodC5lcXVhbHMyRChlW25dKSlyZXR1cm4gbnVsbDtpZih0LmRpc3RhbmNlKGVbbl0pPHRoaXMuX3NuYXBUb2xlcmFuY2UpcmV0dXJuIGVbbl19cmV0dXJuIG51bGx9LFFmLnByb3RvdHlwZS5zbmFwVG89ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGhjKHRoaXMuX3NyY1B0cyk7cmV0dXJuIHRoaXMuc25hcFZlcnRpY2VzKGUsdCksdGhpcy5zbmFwU2VnbWVudHMoZSx0KSxlLnRvQ29vcmRpbmF0ZUFycmF5KCl9LFFmLnByb3RvdHlwZS5zbmFwU2VnbWVudHM9ZnVuY3Rpb24odCxlKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIG49ZS5sZW5ndGg7ZVswXS5lcXVhbHMyRChlW2UubGVuZ3RoLTFdKSYmKG49ZS5sZW5ndGgtMSk7Zm9yKHZhciByPTA7cjxuO3IrKyl7dmFyIGk9ZVtyXSxvPXRoaXMuZmluZFNlZ21lbnRJbmRleFRvU25hcChpLHQpO28+PTAmJnQuYWRkKG8rMSxuZXcgdWwoaSksITEpfX0sUWYucHJvdG90eXBlLmZpbmRTZWdtZW50SW5kZXhUb1NuYXA9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcyxyPW5sLk1BWF9WQUxVRSxpPS0xLG89MDtvPGUuc2l6ZSgpLTE7bysrKXtpZihuLl9zZWcucDA9ZS5nZXQobyksbi5fc2VnLnAxPWUuZ2V0KG8rMSksbi5fc2VnLnAwLmVxdWFsczJEKHQpfHxuLl9zZWcucDEuZXF1YWxzMkQodCkpe2lmKG4uX2FsbG93U25hcHBpbmdUb1NvdXJjZVZlcnRpY2VzKWNvbnRpbnVlO3JldHVybi0xfXZhciBzPW4uX3NlZy5kaXN0YW5jZSh0KTtzPG4uX3NuYXBUb2xlcmFuY2UmJnM8ciYmKHI9cyxpPW8pfXJldHVybiBpfSxRZi5wcm90b3R5cGUuc2V0QWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXM9ZnVuY3Rpb24odCl7dGhpcy5fYWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXM9dH0sUWYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFFmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBRZn0sUWYuaXNDbG9zZWQ9ZnVuY3Rpb24odCl7cmV0dXJuISh0Lmxlbmd0aDw9MSkmJnRbMF0uZXF1YWxzMkQodFt0Lmxlbmd0aC0xXSl9O3ZhciAkZj1mdW5jdGlvbih0KXt0aGlzLl9zcmNHZW9tPXR8fG51bGx9LHRnPXtTTkFQX1BSRUNJU0lPTl9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH19OyRmLnByb3RvdHlwZS5zbmFwVG89ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmV4dHJhY3RUYXJnZXRDb29yZGluYXRlcyh0KTtyZXR1cm4gbmV3IGVnKGUsbikudHJhbnNmb3JtKHRoaXMuX3NyY0dlb20pfSwkZi5wcm90b3R5cGUuc25hcFRvU2VsZj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZXh0cmFjdFRhcmdldENvb3JkaW5hdGVzKHRoaXMuX3NyY0dlb20pLHI9bmV3IGVnKHQsbiwhMCkudHJhbnNmb3JtKHRoaXMuX3NyY0dlb20pLGk9cjtyZXR1cm4gZSYmZ2woaSwkYykmJihpPXIuYnVmZmVyKDApKSxpfSwkZi5wcm90b3R5cGUuY29tcHV0ZVNuYXBUb2xlcmFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1pbmltdW1TZWdtZW50TGVuZ3RoKHQpLzEwfSwkZi5wcm90b3R5cGUuZXh0cmFjdFRhcmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgTGMsbj10LmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGg7cisrKWUuYWRkKG5bcl0pO3JldHVybiBlLnRvQXJyYXkobmV3IEFycmF5KDApLmZpbGwobnVsbCkpfSwkZi5wcm90b3R5cGUuY29tcHV0ZU1pbmltdW1TZWdtZW50TGVuZ3RoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1ubC5NQVhfVkFMVUUsbj0wO248dC5sZW5ndGgtMTtuKyspe3ZhciByPXRbbl0uZGlzdGFuY2UodFtuKzFdKTtyPGUmJihlPXIpfXJldHVybiBlfSwkZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sJGYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICRmfSwkZi5zbmFwPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgQXJyYXkoMikuZmlsbChudWxsKSxpPW5ldyAkZih0KTtyWzBdPWkuc25hcFRvKGUsbik7dmFyIG89bmV3ICRmKGUpO3JldHVybiByWzFdPW8uc25hcFRvKHJbMF0sbikscn0sJGYuY29tcHV0ZU92ZXJsYXlTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPSRmLmNvbXB1dGVTaXplQmFzZWRTbmFwVG9sZXJhbmNlKHQpLG49dC5nZXRQcmVjaXNpb25Nb2RlbCgpO2lmKG4uZ2V0VHlwZSgpPT09Z2guRklYRUQpe3ZhciByPTEvbi5nZXRTY2FsZSgpKjIvMS40MTU7cj5lJiYoZT1yKX1yZXR1cm4gZX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdO3JldHVybiBNYXRoLm1pbigkZi5jb21wdXRlT3ZlcmxheVNuYXBUb2xlcmFuY2UoaSksJGYuY29tcHV0ZU92ZXJsYXlTbmFwVG9sZXJhbmNlKG8pKX19LCRmLmNvbXB1dGVTaXplQmFzZWRTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpO3JldHVybiBNYXRoLm1pbihlLmdldEhlaWdodCgpLGUuZ2V0V2lkdGgoKSkqJGYuU05BUF9QUkVDSVNJT05fRkFDVE9SfSwkZi5zbmFwVG9TZWxmPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3ICRmKHQpLnNuYXBUb1NlbGYoZSxuKX0sdGcuU05BUF9QUkVDSVNJT05fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybiAxZS05fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcygkZix0Zyk7dmFyIGVnPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIpe3QuY2FsbCh0aGlzKSx0aGlzLl9zbmFwVG9sZXJhbmNlPWV8fG51bGwsdGhpcy5fc25hcFB0cz1ufHxudWxsLHRoaXMuX2lzU2VsZlNuYXA9dm9pZCAwIT09ciYmcn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuc25hcExpbmU9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgUWYodCx0aGlzLl9zbmFwVG9sZXJhbmNlKTtyZXR1cm4gbi5zZXRBbGxvd1NuYXBwaW5nVG9Tb3VyY2VWZXJ0aWNlcyh0aGlzLl9pc1NlbGZTbmFwKSxuLnNuYXBUbyhlKX0sZS5wcm90b3R5cGUudHJhbnNmb3JtQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnRvQ29vcmRpbmF0ZUFycmF5KCkscj10aGlzLnNuYXBMaW5lKG4sdGhpcy5fc25hcFB0cyk7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShyKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oS2YpLG5nPWZ1bmN0aW9uKCl7dGhpcy5faXNGaXJzdD0hMCx0aGlzLl9jb21tb25NYW50aXNzYUJpdHNDb3VudD01Myx0aGlzLl9jb21tb25CaXRzPTAsdGhpcy5fY29tbW9uU2lnbkV4cD1udWxsfTtuZy5wcm90b3R5cGUuZ2V0Q29tbW9uPWZ1bmN0aW9uKCl7cmV0dXJuIG5sLmxvbmdCaXRzVG9Eb3VibGUodGhpcy5fY29tbW9uQml0cyl9LG5nLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dmFyIGU9bmwuZG91YmxlVG9Mb25nQml0cyh0KTtyZXR1cm4gdGhpcy5faXNGaXJzdD8odGhpcy5fY29tbW9uQml0cz1lLHRoaXMuX2NvbW1vblNpZ25FeHA9bmcuc2lnbkV4cEJpdHModGhpcy5fY29tbW9uQml0cyksdGhpcy5faXNGaXJzdD0hMSxudWxsKTpuZy5zaWduRXhwQml0cyhlKSE9PXRoaXMuX2NvbW1vblNpZ25FeHA/KHRoaXMuX2NvbW1vbkJpdHM9MCxudWxsKToodGhpcy5fY29tbW9uTWFudGlzc2FCaXRzQ291bnQ9bmcubnVtQ29tbW9uTW9zdFNpZ01hbnRpc3NhQml0cyh0aGlzLl9jb21tb25CaXRzLGUpLHZvaWQodGhpcy5fY29tbW9uQml0cz1uZy56ZXJvTG93ZXJCaXRzKHRoaXMuX2NvbW1vbkJpdHMsNjQtKDEyK3RoaXMuX2NvbW1vbk1hbnRpc3NhQml0c0NvdW50KSkpKX0sbmcucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPW5sLmxvbmdCaXRzVG9Eb3VibGUodCksbj1ubC50b0JpbmFyeVN0cmluZyh0KSxyPSIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIituLGk9ci5zdWJzdHJpbmcoci5sZW5ndGgtNjQpLG89aS5zdWJzdHJpbmcoMCwxKSsiICAiK2kuc3Vic3RyaW5nKDEsMTIpKyIoZXhwKSAiK2kuc3Vic3RyaW5nKDEyKSsiIFsgIitlKyIgXSI7cmV0dXJuIG99fSxuZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbmcucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG5nfSxuZy5nZXRCaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMCE9KHQmMTw8ZSk/MTowfSxuZy5zaWduRXhwQml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4+NTJ9LG5nLnplcm9Mb3dlckJpdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCZ+KCgxPDxlKS0xKX0sbmcubnVtQ29tbW9uTW9zdFNpZ01hbnRpc3NhQml0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9NTI7cj49MDtyLS0pe2lmKG5nLmdldEJpdCh0LHIpIT09bmcuZ2V0Qml0KGUscikpcmV0dXJuIG47bisrfXJldHVybiA1Mn07dmFyIHJnPWZ1bmN0aW9uKCl7dGhpcy5fY29tbW9uQ29vcmQ9bnVsbCx0aGlzLl9jY0ZpbHRlcj1uZXcgb2d9LGlnPXtDb21tb25Db29yZGluYXRlRmlsdGVyOntjb25maWd1cmFibGU6ITB9LFRyYW5zbGF0ZXI6e2NvbmZpZ3VyYWJsZTohMH19O3JnLnByb3RvdHlwZS5hZGRDb21tb25CaXRzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBzZyh0aGlzLl9jb21tb25Db29yZCk7dC5hcHBseShlKSx0Lmdlb21ldHJ5Q2hhbmdlZCgpfSxyZy5wcm90b3R5cGUucmVtb3ZlQ29tbW9uQml0cz1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5fY29tbW9uQ29vcmQueCYmMD09PXRoaXMuX2NvbW1vbkNvb3JkLnkpcmV0dXJuIHQ7dmFyIGU9bmV3IHVsKHRoaXMuX2NvbW1vbkNvb3JkKTtlLng9LWUueCxlLnk9LWUueTt2YXIgbj1uZXcgc2coZSk7cmV0dXJuIHQuYXBwbHkobiksdC5nZW9tZXRyeUNoYW5nZWQoKSx0fSxyZy5wcm90b3R5cGUuZ2V0Q29tbW9uQ29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tb25Db29yZH0scmcucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt0LmFwcGx5KHRoaXMuX2NjRmlsdGVyKSx0aGlzLl9jb21tb25Db29yZD10aGlzLl9jY0ZpbHRlci5nZXRDb21tb25Db29yZGluYXRlKCl9LHJnLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxyZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcmd9LGlnLkNvbW1vbkNvb3JkaW5hdGVGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG9nfSxpZy5UcmFuc2xhdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBzZ30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmcsaWcpO3ZhciBvZz1mdW5jdGlvbigpe3RoaXMuX2NvbW1vbkJpdHNYPW5ldyBuZyx0aGlzLl9jb21tb25CaXRzWT1uZXcgbmd9O29nLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dGhpcy5fY29tbW9uQml0c1guYWRkKHQueCksdGhpcy5fY29tbW9uQml0c1kuYWRkKHQueSl9LG9nLnByb3RvdHlwZS5nZXRDb21tb25Db29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1bCh0aGlzLl9jb21tb25CaXRzWC5nZXRDb21tb24oKSx0aGlzLl9jb21tb25CaXRzWS5nZXRDb21tb24oKSl9LG9nLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltLbF19LG9nLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBvZ307dmFyIHNnPWZ1bmN0aW9uKCl7dGhpcy50cmFucz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnRyYW5zPXR9O3NnLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldE9yZGluYXRlKGUsMCkrdGhpcy50cmFucy54LHI9dC5nZXRPcmRpbmF0ZShlLDEpK3RoaXMudHJhbnMueTt0LnNldE9yZGluYXRlKGUsMCxuKSx0LnNldE9yZGluYXRlKGUsMSxyKX0sc2cucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSxzZy5wcm90b3R5cGUuaXNHZW9tZXRyeUNoYW5nZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2cucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0ZjXX0sc2cucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHNnfTt2YXIgYWc9ZnVuY3Rpb24odCxlKXt0aGlzLl9nZW9tPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX3NuYXBUb2xlcmFuY2U9bnVsbCx0aGlzLl9jYnI9bnVsbCx0aGlzLl9nZW9tWzBdPXQsdGhpcy5fZ2VvbVsxXT1lLHRoaXMuY29tcHV0ZVNuYXBUb2xlcmFuY2UoKX07YWcucHJvdG90eXBlLnNlbGZTbmFwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgJGYodCkuc25hcFRvKHQsdGhpcy5fc25hcFRvbGVyYW5jZSl9LGFnLnByb3RvdHlwZS5yZW1vdmVDb21tb25CaXRzPWZ1bmN0aW9uKHQpe3RoaXMuX2Nicj1uZXcgcmcsdGhpcy5fY2JyLmFkZCh0WzBdKSx0aGlzLl9jYnIuYWRkKHRbMV0pO3ZhciBlPW5ldyBBcnJheSgyKS5maWxsKG51bGwpO3JldHVybiBlWzBdPXRoaXMuX2Nici5yZW1vdmVDb21tb25CaXRzKHRbMF0uY29weSgpKSxlWzFdPXRoaXMuX2Nici5yZW1vdmVDb21tb25CaXRzKHRbMV0uY29weSgpKSxlfSxhZy5wcm90b3R5cGUucHJlcGFyZVJlc3VsdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2JyLmFkZENvbW1vbkJpdHModCksdH0sYWcucHJvdG90eXBlLmdldFJlc3VsdEdlb21ldHJ5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc25hcCh0aGlzLl9nZW9tKSxuPU1nLm92ZXJsYXlPcChlWzBdLGVbMV0sdCk7cmV0dXJuIHRoaXMucHJlcGFyZVJlc3VsdChuKX0sYWcucHJvdG90eXBlLmNoZWNrVmFsaWQ9ZnVuY3Rpb24odCl7dC5pc1ZhbGlkKCl8fFBsLm91dC5wcmludGxuKCJTbmFwcGVkIGdlb21ldHJ5IGlzIGludmFsaWQiKX0sYWcucHJvdG90eXBlLmNvbXB1dGVTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKCl7dGhpcy5fc25hcFRvbGVyYW5jZT0kZi5jb21wdXRlT3ZlcmxheVNuYXBUb2xlcmFuY2UodGhpcy5fZ2VvbVswXSx0aGlzLl9nZW9tWzFdKX0sYWcucHJvdG90eXBlLnNuYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yZW1vdmVDb21tb25CaXRzKHQpO3JldHVybiAkZi5zbmFwKGVbMF0sZVsxXSx0aGlzLl9zbmFwVG9sZXJhbmNlKX0sYWcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGFnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBhZ30sYWcub3ZlcmxheU9wPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IGFnKHQsZSkuZ2V0UmVzdWx0R2VvbWV0cnkobil9LGFnLnVuaW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFnLm92ZXJsYXlPcCh0LGUsTWcuVU5JT04pfSxhZy5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWcub3ZlcmxheU9wKHQsZSxNZy5JTlRFUlNFQ1RJT04pfSxhZy5zeW1EaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFnLm92ZXJsYXlPcCh0LGUsTWcuU1lNRElGRkVSRU5DRSl9LGFnLmRpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWcub3ZlcmxheU9wKHQsZSxNZy5ESUZGRVJFTkNFKX07dmFyIHVnPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZ2VvbT1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9nZW9tWzBdPXQsdGhpcy5fZ2VvbVsxXT1lfTt1Zy5wcm90b3R5cGUuZ2V0UmVzdWx0R2VvbWV0cnk9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbCxuPSExLHI9bnVsbDt0cnl7ZT1NZy5vdmVybGF5T3AodGhpcy5fZ2VvbVswXSx0aGlzLl9nZW9tWzFdLHQpO249ITB9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2Yga2wpKXRocm93IHQ7cj10fWlmKCFuKXRyeXtlPWFnLm92ZXJsYXlPcCh0aGlzLl9nZW9tWzBdLHRoaXMuX2dlb21bMV0sdCl9Y2F0Y2godCl7dGhyb3cgdCBpbnN0YW5jZW9mIGtsP3I6dH1yZXR1cm4gZX0sdWcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHVnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB1Z30sdWcub3ZlcmxheU9wPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IHVnKHQsZSkuZ2V0UmVzdWx0R2VvbWV0cnkobil9LHVnLnVuaW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHVnLm92ZXJsYXlPcCh0LGUsTWcuVU5JT04pfSx1Zy5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdWcub3ZlcmxheU9wKHQsZSxNZy5JTlRFUlNFQ1RJT04pfSx1Zy5zeW1EaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHVnLm92ZXJsYXlPcCh0LGUsTWcuU1lNRElGRkVSRU5DRSl9LHVnLmRpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdWcub3ZlcmxheU9wKHQsZSxNZy5ESUZGRVJFTkNFKX07dmFyIGxnPWZ1bmN0aW9uKCl7dGhpcy5tY2U9bnVsbCx0aGlzLmNoYWluSW5kZXg9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5tY2U9dCx0aGlzLmNoYWluSW5kZXg9ZX07bGcucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSl7dGhpcy5tY2UuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbih0aGlzLmNoYWluSW5kZXgsdC5tY2UsdC5jaGFpbkluZGV4LGUpfSxsZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbGcucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGxnfTt2YXIgY2c9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX2xhYmVsPW51bGwsdGhpcy5feFZhbHVlPW51bGwsdGhpcy5fZXZlbnRUeXBlPW51bGwsdGhpcy5faW5zZXJ0RXZlbnQ9bnVsbCx0aGlzLl9kZWxldGVFdmVudEluZGV4PW51bGwsdGhpcy5fb2JqPW51bGwsMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9ldmVudFR5cGU9dC5ERUxFVEUsdGhpcy5feFZhbHVlPWUsdGhpcy5faW5zZXJ0RXZlbnQ9bn1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07dGhpcy5fZXZlbnRUeXBlPXQuSU5TRVJULHRoaXMuX2xhYmVsPXIsdGhpcy5feFZhbHVlPWksdGhpcy5fb2JqPW99fSxoZz17SU5TRVJUOntjb25maWd1cmFibGU6ITB9LERFTEVURTp7Y29uZmlndXJhYmxlOiEwfX07Y2cucHJvdG90eXBlLmlzRGVsZXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50VHlwZT09PWNnLkRFTEVURX0sY2cucHJvdG90eXBlLnNldERlbGV0ZUV2ZW50SW5kZXg9ZnVuY3Rpb24odCl7dGhpcy5fZGVsZXRlRXZlbnRJbmRleD10fSxjZy5wcm90b3R5cGUuZ2V0T2JqZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29ian0sY2cucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLl94VmFsdWU8ZS5feFZhbHVlPy0xOnRoaXMuX3hWYWx1ZT5lLl94VmFsdWU/MTp0aGlzLl9ldmVudFR5cGU8ZS5fZXZlbnRUeXBlPy0xOnRoaXMuX2V2ZW50VHlwZT5lLl9ldmVudFR5cGU/MTowfSxjZy5wcm90b3R5cGUuZ2V0SW5zZXJ0RXZlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5zZXJ0RXZlbnR9LGNnLnByb3RvdHlwZS5pc0luc2VydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudFR5cGU9PT1jZy5JTlNFUlR9LGNnLnByb3RvdHlwZS5pc1NhbWVMYWJlbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXRoaXMuX2xhYmVsJiZ0aGlzLl9sYWJlbD09PXQuX2xhYmVsfSxjZy5wcm90b3R5cGUuZ2V0RGVsZXRlRXZlbnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWxldGVFdmVudEluZGV4fSxjZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5baWxdfSxjZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gY2d9LGhnLklOU0VSVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0saGcuREVMRVRFLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjZyxoZyk7dmFyIHBnPWZ1bmN0aW9uKCl7fTtwZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scGcucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHBnfTt2YXIgZmc9ZnVuY3Rpb24oKXt0aGlzLl9oYXNJbnRlcnNlY3Rpb249ITEsdGhpcy5faGFzUHJvcGVyPSExLHRoaXMuX2hhc1Byb3BlckludGVyaW9yPSExLHRoaXMuX3Byb3BlckludGVyc2VjdGlvblBvaW50PW51bGwsdGhpcy5fbGk9bnVsbCx0aGlzLl9pbmNsdWRlUHJvcGVyPW51bGwsdGhpcy5fcmVjb3JkSXNvbGF0ZWQ9bnVsbCx0aGlzLl9pc1NlbGZJbnRlcnNlY3Rpb249bnVsbCx0aGlzLl9udW1JbnRlcnNlY3Rpb25zPTAsdGhpcy5udW1UZXN0cz0wLHRoaXMuX2JkeU5vZGVzPW51bGwsdGhpcy5faXNEb25lPSExLHRoaXMuX2lzRG9uZVdoZW5Qcm9wZXJJbnQ9ITE7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX2xpPXQsdGhpcy5faW5jbHVkZVByb3Blcj1lLHRoaXMuX3JlY29yZElzb2xhdGVkPW59O2ZnLnByb3RvdHlwZS5pc1RyaXZpYWxJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7aWYodD09PW4mJjE9PT10aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKSl7aWYoZmcuaXNBZGphY2VudFNlZ21lbnRzKGUscikpcmV0dXJuITA7aWYodC5pc0Nsb3NlZCgpKXt2YXIgaT10LmdldE51bVBvaW50cygpLTE7aWYoMD09PWUmJnI9PT1pfHwwPT09ciYmZT09PWkpcmV0dXJuITB9fXJldHVybiExfSxmZy5wcm90b3R5cGUuZ2V0UHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnR9LGZnLnByb3RvdHlwZS5zZXRJc0RvbmVJZlByb3BlckludD1mdW5jdGlvbih0KXt0aGlzLl9pc0RvbmVXaGVuUHJvcGVySW50PXR9LGZnLnByb3RvdHlwZS5oYXNQcm9wZXJJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcn0sZmcucHJvdG90eXBlLmlzQm91bmRhcnlQb2ludEludGVybmFsPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLmdldENvb3JkaW5hdGUoKTtpZih0LmlzSW50ZXJzZWN0aW9uKHIpKXJldHVybiEwfXJldHVybiExfSxmZy5wcm90b3R5cGUuaGFzUHJvcGVySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Byb3Blcn0sZmcucHJvdG90eXBlLmhhc0ludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNJbnRlcnNlY3Rpb259LGZnLnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNEb25lfSxmZy5wcm90b3R5cGUuaXNCb3VuZGFyeVBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPT1lJiYoISF0aGlzLmlzQm91bmRhcnlQb2ludEludGVybmFsKHQsZVswXSl8fCEhdGhpcy5pc0JvdW5kYXJ5UG9pbnRJbnRlcm5hbCh0LGVbMV0pKX0sZmcucHJvdG90eXBlLnNldEJvdW5kYXJ5Tm9kZXM9ZnVuY3Rpb24odCxlKXt0aGlzLl9iZHlOb2Rlcz1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9iZHlOb2Rlc1swXT10LHRoaXMuX2JkeU5vZGVzWzFdPWV9LGZnLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiZlPT09cilyZXR1cm4gbnVsbDt0aGlzLm51bVRlc3RzKys7dmFyIGk9dC5nZXRDb29yZGluYXRlcygpW2VdLG89dC5nZXRDb29yZGluYXRlcygpW2UrMV0scz1uLmdldENvb3JkaW5hdGVzKClbcl0sYT1uLmdldENvb3JkaW5hdGVzKClbcisxXTt0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGksbyxzLGEpLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYodGhpcy5fcmVjb3JkSXNvbGF0ZWQmJih0LnNldElzb2xhdGVkKCExKSxuLnNldElzb2xhdGVkKCExKSksdGhpcy5fbnVtSW50ZXJzZWN0aW9ucysrLHRoaXMuaXNUcml2aWFsSW50ZXJzZWN0aW9uKHQsZSxuLHIpfHwodGhpcy5faGFzSW50ZXJzZWN0aW9uPSEwLCF0aGlzLl9pbmNsdWRlUHJvcGVyJiZ0aGlzLl9saS5pc1Byb3BlcigpfHwodC5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLGUsMCksbi5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLHIsMSkpLHRoaXMuX2xpLmlzUHJvcGVyKCkmJih0aGlzLl9wcm9wZXJJbnRlcnNlY3Rpb25Qb2ludD10aGlzLl9saS5nZXRJbnRlcnNlY3Rpb24oMCkuY29weSgpLHRoaXMuX2hhc1Byb3Blcj0hMCx0aGlzLl9pc0RvbmVXaGVuUHJvcGVySW50JiYodGhpcy5faXNEb25lPSEwKSx0aGlzLmlzQm91bmRhcnlQb2ludCh0aGlzLl9saSx0aGlzLl9iZHlOb2Rlcyl8fCh0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcj0hMCkpKSl9LGZnLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxmZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZmd9LGZnLmlzQWRqYWNlbnRTZWdtZW50cz1mdW5jdGlvbih0LGUpe3JldHVybiAxPT09TWF0aC5hYnModC1lKX07dmFyIGdnPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5ldmVudHM9bmV3IGxjLHRoaXMubk92ZXJsYXBzPW51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnByZXBhcmVFdmVudHM9ZnVuY3Rpb24oKXtucC5zb3J0KHRoaXMuZXZlbnRzKTtmb3IodmFyIHQ9MDt0PHRoaXMuZXZlbnRzLnNpemUoKTt0Kyspe3ZhciBlPXRoaXMuZXZlbnRzLmdldCh0KTtlLmlzRGVsZXRlKCkmJmUuZ2V0SW5zZXJ0RXZlbnQoKS5zZXREZWxldGVFdmVudEluZGV4KHQpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5uT3ZlcmxhcHM9MCx0aGlzLnByZXBhcmVFdmVudHMoKTtmb3IodmFyIG49MDtuPHRoaXMuZXZlbnRzLnNpemUoKTtuKyspe3ZhciByPXQuZXZlbnRzLmdldChuKTtpZihyLmlzSW5zZXJ0KCkmJnQucHJvY2Vzc092ZXJsYXBzKG4sci5nZXREZWxldGVFdmVudEluZGV4KCkscixlKSxlLmlzRG9uZSgpKWJyZWFrfX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKWlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgZmcmJmdsKGFyZ3VtZW50c1swXSxhYykmJmdsKGFyZ3VtZW50c1sxXSxhYykpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXTt0aGlzLmFkZEVkZ2VzKGksaSksdGhpcy5hZGRFZGdlcyhvLG8pLHRoaXMuY29tcHV0ZUludGVyc2VjdGlvbnMocyl9ZWxzZSBpZigiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJmdsKGFyZ3VtZW50c1swXSxhYykmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgZmcpe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXSxsPWFyZ3VtZW50c1syXTtsP3RoaXMuYWRkRWRnZXMoYSxudWxsKTp0aGlzLmFkZEVkZ2VzKGEpLHRoaXMuY29tcHV0ZUludGVyc2VjdGlvbnModSl9fSxlLnByb3RvdHlwZS5hZGRFZGdlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2V0TW9ub3RvbmVDaGFpbkVkZ2UoKSxyPW4uZ2V0U3RhcnRJbmRleGVzKCksaT0wO2k8ci5sZW5ndGgtMTtpKyspe3ZhciBvPW5ldyBsZyhuLGkpLHM9bmV3IGNnKGUsbi5nZXRNaW5YKGkpLG8pO3RoaXMuZXZlbnRzLmFkZChzKSx0aGlzLmV2ZW50cy5hZGQobmV3IGNnKG4uZ2V0TWF4WChpKSxzKSl9fSxlLnByb3RvdHlwZS5wcm9jZXNzT3ZlcmxhcHM9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPW4uZ2V0T2JqZWN0KCksbz10O288ZTtvKyspe3ZhciBzPXRoaXMuZXZlbnRzLmdldChvKTtpZihzLmlzSW5zZXJ0KCkpe3ZhciBhPXMuZ2V0T2JqZWN0KCk7bi5pc1NhbWVMYWJlbChzKXx8KGkuY29tcHV0ZUludGVyc2VjdGlvbnMoYSxyKSx0aGlzLm5PdmVybGFwcysrKX19fSxlLnByb3RvdHlwZS5hZGRFZGdlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3QuYWRkRWRnZShyLHIpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWkuaXRlcmF0b3IoKTtzLmhhc05leHQoKTspe3ZhciBhPXMubmV4dCgpO3QuYWRkRWRnZShhLG8pfX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0ocGcpLGRnPWZ1bmN0aW9uKCl7dGhpcy5fbWluPW5sLlBPU0lUSVZFX0lORklOSVRZLHRoaXMuX21heD1ubC5ORUdBVElWRV9JTkZJTklUWX0seWc9e05vZGVDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9fTtkZy5wcm90b3R5cGUuZ2V0TWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbn0sZGcucHJvdG90eXBlLmludGVyc2VjdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4hKHRoaXMuX21pbj5lfHx0aGlzLl9tYXg8dCl9LGRnLnByb3RvdHlwZS5nZXRNYXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4fSxkZy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gRmwudG9MaW5lU3RyaW5nKG5ldyB1bCh0aGlzLl9taW4sMCksbmV3IHVsKHRoaXMuX21heCwwKSl9LGRnLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxkZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZGd9LHlnLk5vZGVDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiB2Z30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGcseWcpO3ZhciB2Zz1mdW5jdGlvbigpe307dmcucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZSxpPShuLl9taW4rbi5fbWF4KS8yLG89KHIuX21pbityLl9tYXgpLzI7cmV0dXJuIGk8bz8tMTppPm8/MTowfSx2Zy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bc2xdfSx2Zy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdmd9O3ZhciBfZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX2l0ZW09bnVsbDt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5fbWluPWUsdGhpcy5fbWF4PW4sdGhpcy5faXRlbT1yfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuaW50ZXJzZWN0cyh0LGUpKXJldHVybiBudWxsO24udmlzaXRJdGVtKHRoaXMuX2l0ZW0pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShkZyksbWc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9ub2RlMT1udWxsLHRoaXMuX25vZGUyPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuX25vZGUxPWUsdGhpcy5fbm9kZTI9bix0aGlzLmJ1aWxkRXh0ZW50KHRoaXMuX25vZGUxLHRoaXMuX25vZGUyKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuYnVpbGRFeHRlbnQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9taW49TWF0aC5taW4odC5fbWluLGUuX21pbiksdGhpcy5fbWF4PU1hdGgubWF4KHQuX21heCxlLl9tYXgpfSxlLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuaW50ZXJzZWN0cyh0LGUpKXJldHVybiBudWxsO251bGwhPT10aGlzLl9ub2RlMSYmdGhpcy5fbm9kZTEucXVlcnkodCxlLG4pLG51bGwhPT10aGlzLl9ub2RlMiYmdGhpcy5fbm9kZTIucXVlcnkodCxlLG4pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShkZykseGc9ZnVuY3Rpb24oKXt0aGlzLl9sZWF2ZXM9bmV3IGxjLHRoaXMuX3Jvb3Q9bnVsbCx0aGlzLl9sZXZlbD0wfTt4Zy5wcm90b3R5cGUuYnVpbGRUcmVlPWZ1bmN0aW9uKCl7bnAuc29ydCh0aGlzLl9sZWF2ZXMsbmV3IGRnLk5vZGVDb21wYXJhdG9yKTtmb3IodmFyIHQ9dGhpcy5fbGVhdmVzLGU9bnVsbCxuPW5ldyBsYzs7KXtpZih0aGlzLmJ1aWxkTGV2ZWwodCxuKSwxPT09bi5zaXplKCkpcmV0dXJuIG4uZ2V0KDApO2U9dCx0PW4sbj1lfX0seGcucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUsbil7aWYobnVsbCE9PXRoaXMuX3Jvb3QpdGhyb3cgbmV3IEVycm9yKCJJbmRleCBjYW5ub3QgYmUgYWRkZWQgdG8gb25jZSBpdCBoYXMgYmVlbiBxdWVyaWVkIik7dGhpcy5fbGVhdmVzLmFkZChuZXcgX2codCxlLG4pKX0seGcucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmluaXQoKSx0aGlzLl9yb290LnF1ZXJ5KHQsZSxuKX0seGcucHJvdG90eXBlLmJ1aWxkUm9vdD1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLl9yb290KXJldHVybiBudWxsO3RoaXMuX3Jvb3Q9dGhpcy5idWlsZFRyZWUoKX0seGcucHJvdG90eXBlLnByaW50Tm9kZT1mdW5jdGlvbih0KXtQbC5vdXQucHJpbnRsbihGbC50b0xpbmVTdHJpbmcobmV3IHVsKHQuX21pbix0aGlzLl9sZXZlbCksbmV3IHVsKHQuX21heCx0aGlzLl9sZXZlbCkpKX0seGcucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy5fcm9vdClyZXR1cm4gbnVsbDt0aGlzLmJ1aWxkUm9vdCgpfSx4Zy5wcm90b3R5cGUuYnVpbGRMZXZlbD1mdW5jdGlvbih0LGUpe3RoaXMuX2xldmVsKyssZS5jbGVhcigpO2Zvcih2YXIgbj0wO248dC5zaXplKCk7bis9Mil7dmFyIHI9dC5nZXQobik7aWYobnVsbD09PShuKzE8dC5zaXplKCk/dC5nZXQobik6bnVsbCkpZS5hZGQocik7ZWxzZXt2YXIgaT1uZXcgbWcodC5nZXQobiksdC5nZXQobisxKSk7ZS5hZGQoaSl9fX0seGcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHhnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB4Z307dmFyIEVnPWZ1bmN0aW9uKCl7dGhpcy5faXRlbXM9bmV3IGxjfTtFZy5wcm90b3R5cGUudmlzaXRJdGVtPWZ1bmN0aW9uKHQpe3RoaXMuX2l0ZW1zLmFkZCh0KX0sRWcucHJvdG90eXBlLmdldEl0ZW1zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2l0ZW1zfSxFZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bUWhdfSxFZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRWd9O3ZhciBiZz1mdW5jdGlvbigpe3RoaXMuX2luZGV4PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO2lmKCFnbCh0LCRjKSl0aHJvdyBuZXcgZWwoIkFyZ3VtZW50IG11c3QgYmUgUG9seWdvbmFsIik7dGhpcy5faW5kZXg9bmV3IE5nKHQpfSx3Zz17U2VnbWVudFZpc2l0b3I6e2NvbmZpZ3VyYWJsZTohMH0sSW50ZXJ2YWxJbmRleGVkR2VvbWV0cnk6e2NvbmZpZ3VyYWJsZTohMH19O2JnLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFZsKHQpLG49bmV3IElnKGUpO3JldHVybiB0aGlzLl9pbmRleC5xdWVyeSh0LnksdC55LG4pLGUuZ2V0TG9jYXRpb24oKX0sYmcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2pwXX0sYmcucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGJnfSx3Zy5TZWdtZW50VmlzaXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gSWd9LHdnLkludGVydmFsSW5kZXhlZEdlb21ldHJ5LmdldD1mdW5jdGlvbigpe3JldHVybiBOZ30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYmcsd2cpO3ZhciBJZz1mdW5jdGlvbigpe3RoaXMuX2NvdW50ZXI9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fY291bnRlcj10fTtJZy5wcm90b3R5cGUudmlzaXRJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7dGhpcy5fY291bnRlci5jb3VudFNlZ21lbnQoZS5nZXRDb29yZGluYXRlKDApLGUuZ2V0Q29vcmRpbmF0ZSgxKSl9LElnLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltRaF19LElnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBJZ307dmFyIE5nPWZ1bmN0aW9uKCl7dGhpcy5faW5kZXg9bmV3IHhnO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmluaXQodCl9O05nLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1DZi5nZXRMaW5lcyh0KS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkuZ2V0Q29vcmRpbmF0ZXMoKTt0aGlzLmFkZExpbmUobil9fSxOZy5wcm90b3R5cGUuYWRkTGluZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPHQubGVuZ3RoO2UrKyl7dmFyIG49bmV3IHZwKHRbZS0xXSx0W2VdKSxyPU1hdGgubWluKG4ucDAueSxuLnAxLnkpLGk9TWF0aC5tYXgobi5wMC55LG4ucDEueSk7dGhpcy5faW5kZXguaW5zZXJ0KHIsaSxuKX19LE5nLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1uZXcgRWc7cmV0dXJuIHRoaXMuX2luZGV4LnF1ZXJ5KHQsZSxuKSxuLmdldEl0ZW1zKCl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXTt0aGlzLl9pbmRleC5xdWVyeShyLGksbyl9fSxOZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sTmcucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE5nfTt2YXIgU2c9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe2lmKHQuY2FsbCh0aGlzKSx0aGlzLl9wYXJlbnRHZW9tPW51bGwsdGhpcy5fbGluZUVkZ2VNYXA9bmV3IGZoLHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGU9bnVsbCx0aGlzLl91c2VCb3VuZGFyeURldGVybWluYXRpb25SdWxlPSEwLHRoaXMuX2FyZ0luZGV4PW51bGwsdGhpcy5fYm91bmRhcnlOb2Rlcz1udWxsLHRoaXMuX2hhc1Rvb0Zld1BvaW50cz0hMSx0aGlzLl9pbnZhbGlkUG9pbnQ9bnVsbCx0aGlzLl9hcmVhUHRMb2NhdG9yPW51bGwsdGhpcy5fcHRMb2NhdG9yPW5ldyBQZiwyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9UWwuT0dDX1NGU19CT1VOREFSWV9SVUxFO3RoaXMuX2FyZ0luZGV4PWUsdGhpcy5fcGFyZW50R2VvbT1uLHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGU9cixudWxsIT09biYmdGhpcy5hZGQobil9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdO3RoaXMuX2FyZ0luZGV4PWksdGhpcy5fcGFyZW50R2VvbT1vLHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGU9cyxudWxsIT09byYmdGhpcy5hZGQobyl9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pbnNlcnRCb3VuZGFyeVBvaW50PWZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcy5fbm9kZXMuYWRkTm9kZShuKS5nZXRMYWJlbCgpLGk9MTtyLmdldExvY2F0aW9uKHQsU2guT04pPT09cGwuQk9VTkRBUlkmJmkrKzt2YXIgbz1lLmRldGVybWluZUJvdW5kYXJ5KHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGUsaSk7ci5zZXRMb2NhdGlvbih0LG8pfSxlLnByb3RvdHlwZS5jb21wdXRlU2VsZk5vZGVzPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5jb21wdXRlU2VsZk5vZGVzKHQsZSwhMSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXSxvPW5ldyBmZyhuLCEwLCExKTtvLnNldElzRG9uZUlmUHJvcGVySW50KGkpO3ZhciBzPXRoaXMuY3JlYXRlRWRnZVNldEludGVyc2VjdG9yKCksYT10aGlzLl9wYXJlbnRHZW9tIGluc3RhbmNlb2Ygbmh8fHRoaXMuX3BhcmVudEdlb20gaW5zdGFuY2VvZiB0aHx8dGhpcy5fcGFyZW50R2VvbSBpbnN0YW5jZW9mIHJoLHU9cnx8IWE7cmV0dXJuIHMuY29tcHV0ZUludGVyc2VjdGlvbnModGhpcy5fZWRnZXMsbyx1KSx0aGlzLmFkZFNlbGZJbnRlcnNlY3Rpb25Ob2Rlcyh0aGlzLl9hcmdJbmRleCksb319LGUucHJvdG90eXBlLmNvbXB1dGVTcGxpdEVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9lZGdlcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkuZWlMaXN0LmFkZFNwbGl0RWRnZXModCl9fSxlLnByb3RvdHlwZS5jb21wdXRlRWRnZUludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBmZyhlLG4sITApO3JldHVybiByLnNldEJvdW5kYXJ5Tm9kZXModGhpcy5nZXRCb3VuZGFyeU5vZGVzKCksdC5nZXRCb3VuZGFyeU5vZGVzKCkpLHRoaXMuY3JlYXRlRWRnZVNldEludGVyc2VjdG9yKCkuY29tcHV0ZUludGVyc2VjdGlvbnModGhpcy5fZWRnZXMsdC5fZWRnZXMscikscn0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFyZW50R2VvbX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlOb2RlUnVsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ib3VuZGFyeU5vZGVSdWxlfSxlLnByb3RvdHlwZS5oYXNUb29GZXdQb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzVG9vRmV3UG9pbnRzfSxlLnByb3RvdHlwZS5hZGRQb2ludD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgUWMpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXQuZ2V0Q29vcmRpbmF0ZSgpO3RoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsZSxwbC5JTlRFUklPUil9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsKXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5pbnNlcnRQb2ludCh0aGlzLl9hcmdJbmRleCxuLHBsLklOVEVSSU9SKX19LGUucHJvdG90eXBlLmFkZFBvbHlnb249ZnVuY3Rpb24odCl7dGhpcy5hZGRQb2x5Z29uUmluZyh0LmdldEV4dGVyaW9yUmluZygpLHBsLkVYVEVSSU9SLHBsLklOVEVSSU9SKTtmb3IodmFyIGU9MDtlPHQuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7ZSsrKXt2YXIgbj10LmdldEludGVyaW9yUmluZ04oZSk7dGhpcy5hZGRQb2x5Z29uUmluZyhuLHBsLklOVEVSSU9SLHBsLkVYVEVSSU9SKX19LGUucHJvdG90eXBlLmFkZEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5pbnNlcnRFZGdlKHQpO3ZhciBlPXQuZ2V0Q29vcmRpbmF0ZXMoKTt0aGlzLmluc2VydFBvaW50KHRoaXMuX2FyZ0luZGV4LGVbMF0scGwuQk9VTkRBUlkpLHRoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsZVtlLmxlbmd0aC0xXSxwbC5CT1VOREFSWSl9LGUucHJvdG90eXBlLmFkZExpbmVTdHJpbmc9ZnVuY3Rpb24odCl7dmFyIGU9cGMucmVtb3ZlUmVwZWF0ZWRQb2ludHModC5nZXRDb29yZGluYXRlcygpKTtpZihlLmxlbmd0aDwyKXJldHVybiB0aGlzLl9oYXNUb29GZXdQb2ludHM9ITAsdGhpcy5faW52YWxpZFBvaW50PWVbMF0sbnVsbDt2YXIgbj1uZXcgb2YoZSxuZXcgRGgodGhpcy5fYXJnSW5kZXgscGwuSU5URVJJT1IpKTt0aGlzLl9saW5lRWRnZU1hcC5wdXQodCxuKSx0aGlzLmluc2VydEVkZ2UobikscWwuaXNUcnVlKGUubGVuZ3RoPj0yLCJmb3VuZCBMaW5lU3RyaW5nIHdpdGggc2luZ2xlIHBvaW50IiksdGhpcy5pbnNlcnRCb3VuZGFyeVBvaW50KHRoaXMuX2FyZ0luZGV4LGVbMF0pLHRoaXMuaW5zZXJ0Qm91bmRhcnlQb2ludCh0aGlzLl9hcmdJbmRleCxlW2UubGVuZ3RoLTFdKX0sZS5wcm90b3R5cGUuZ2V0SW52YWxpZFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludmFsaWRQb2ludH0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlQb2ludHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5nZXRCb3VuZGFyeU5vZGVzKCksZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCksbj0wLHI9dC5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7ZVtuKytdPWkuZ2V0Q29vcmRpbmF0ZSgpLmNvcHkoKX1yZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlOb2Rlcz1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fYm91bmRhcnlOb2RlcyYmKHRoaXMuX2JvdW5kYXJ5Tm9kZXM9dGhpcy5fbm9kZXMuZ2V0Qm91bmRhcnlOb2Rlcyh0aGlzLl9hcmdJbmRleCkpLHRoaXMuX2JvdW5kYXJ5Tm9kZXN9LGUucHJvdG90eXBlLmFkZFNlbGZJbnRlcnNlY3Rpb25Ob2RlPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLmlzQm91bmRhcnlOb2RlKHQsZSkpcmV0dXJuIG51bGw7bj09PXBsLkJPVU5EQVJZJiZ0aGlzLl91c2VCb3VuZGFyeURldGVybWluYXRpb25SdWxlP3RoaXMuaW5zZXJ0Qm91bmRhcnlQb2ludCh0LGUpOnRoaXMuaW5zZXJ0UG9pbnQodCxlLG4pfSxlLnByb3RvdHlwZS5hZGRQb2x5Z29uUmluZz1mdW5jdGlvbih0LGUsbil7aWYodC5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dmFyIHI9cGMucmVtb3ZlUmVwZWF0ZWRQb2ludHModC5nZXRDb29yZGluYXRlcygpKTtpZihyLmxlbmd0aDw0KXJldHVybiB0aGlzLl9oYXNUb29GZXdQb2ludHM9ITAsdGhpcy5faW52YWxpZFBvaW50PXJbMF0sbnVsbDt2YXIgaT1lLG89bjtYbC5pc0NDVyhyKSYmKGk9bixvPWUpO3ZhciBzPW5ldyBvZihyLG5ldyBEaCh0aGlzLl9hcmdJbmRleCxwbC5CT1VOREFSWSxpLG8pKTt0aGlzLl9saW5lRWRnZU1hcC5wdXQodCxzKSx0aGlzLmluc2VydEVkZ2UocyksdGhpcy5pbnNlcnRQb2ludCh0aGlzLl9hcmdJbmRleCxyWzBdLHBsLkJPVU5EQVJZKX0sZS5wcm90b3R5cGUuaW5zZXJ0UG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuX25vZGVzLmFkZE5vZGUoZSksaT1yLmdldExhYmVsKCk7bnVsbD09PWk/ci5fbGFiZWw9bmV3IERoKHQsbik6aS5zZXRMb2NhdGlvbih0LG4pfSxlLnByb3RvdHlwZS5jcmVhdGVFZGdlU2V0SW50ZXJzZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGdnfSxlLnByb3RvdHlwZS5hZGRTZWxmSW50ZXJzZWN0aW9uTm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2VkZ2VzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KWZvcih2YXIgbj1lLm5leHQoKSxyPW4uZ2V0TGFiZWwoKS5nZXRMb2NhdGlvbih0KSxpPW4uZWlMaXN0Lml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKTt0aGlzLmFkZFNlbGZJbnRlcnNlY3Rpb25Ob2RlKHQsby5jb29yZCxyKX19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe2lmKDEhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5hZGQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDtpZihlIGluc3RhbmNlb2YgcmgmJih0aGlzLl91c2VCb3VuZGFyeURldGVybWluYXRpb25SdWxlPSExKSxlIGluc3RhbmNlb2YgdGgpdGhpcy5hZGRQb2x5Z29uKGUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIFpjKXRoaXMuYWRkTGluZVN0cmluZyhlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBRYyl0aGlzLmFkZFBvaW50KGUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGVoKXRoaXMuYWRkQ29sbGVjdGlvbihlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBHYyl0aGlzLmFkZENvbGxlY3Rpb24oZSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgcmgpdGhpcy5hZGRDb2xsZWN0aW9uKGUpO2Vsc2V7aWYoIShlIGluc3RhbmNlb2Yga2MpKXRocm93IG5ldyBFcnJvcihlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTt0aGlzLmFkZENvbGxlY3Rpb24oZSl9fSxlLnByb3RvdHlwZS5hZGRDb2xsZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5nZXROdW1HZW9tZXRyaWVzKCk7ZSsrKXt2YXIgbj10LmdldEdlb21ldHJ5TihlKTt0aGlzLmFkZChuKX19LGUucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0KXtyZXR1cm4gZ2wodGhpcy5fcGFyZW50R2VvbSwkYykmJnRoaXMuX3BhcmVudEdlb20uZ2V0TnVtR2VvbWV0cmllcygpPjUwPyhudWxsPT09dGhpcy5fYXJlYVB0TG9jYXRvciYmKHRoaXMuX2FyZWFQdExvY2F0b3I9bmV3IGJnKHRoaXMuX3BhcmVudEdlb20pKSx0aGlzLl9hcmVhUHRMb2NhdG9yLmxvY2F0ZSh0KSk6dGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LHRoaXMuX3BhcmVudEdlb20pfSxlLnByb3RvdHlwZS5maW5kRWRnZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2xpbmVFZGdlTWFwLmdldChlKX1yZXR1cm4gdC5wcm90b3R5cGUuZmluZEVkZ2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLmRldGVybWluZUJvdW5kYXJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaXNJbkJvdW5kYXJ5KGUpP3BsLkJPVU5EQVJZOnBsLklOVEVSSU9SfSxlfShIaCksQ2c9ZnVuY3Rpb24oKXtpZih0aGlzLl9saT1uZXcgamwsdGhpcy5fcmVzdWx0UHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9hcmc9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24odC5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9hcmc9bmV3IEFycmF5KDEpLmZpbGwobnVsbCksdGhpcy5fYXJnWzBdPW5ldyBTZygwLHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPVFsLk9HQ19TRlNfQk9VTkRBUllfUlVMRTtlLmdldFByZWNpc2lvbk1vZGVsKCkuY29tcGFyZVRvKG4uZ2V0UHJlY2lzaW9uTW9kZWwoKSk+PTA/dGhpcy5zZXRDb21wdXRhdGlvblByZWNpc2lvbihlLmdldFByZWNpc2lvbk1vZGVsKCkpOnRoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24obi5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9hcmc9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5fYXJnWzBdPW5ldyBTZygwLGUsciksdGhpcy5fYXJnWzFdPW5ldyBTZygxLG4scil9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdO2kuZ2V0UHJlY2lzaW9uTW9kZWwoKS5jb21wYXJlVG8oby5nZXRQcmVjaXNpb25Nb2RlbCgpKT49MD90aGlzLnNldENvbXB1dGF0aW9uUHJlY2lzaW9uKGkuZ2V0UHJlY2lzaW9uTW9kZWwoKSk6dGhpcy5zZXRDb21wdXRhdGlvblByZWNpc2lvbihvLmdldFByZWNpc2lvbk1vZGVsKCkpLHRoaXMuX2FyZz1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9hcmdbMF09bmV3IFNnKDAsaSxzKSx0aGlzLl9hcmdbMV09bmV3IFNnKDEsbyxzKX19O0NnLnByb3RvdHlwZS5nZXRBcmdHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYXJnW3RdLmdldEdlb21ldHJ5KCl9LENnLnByb3RvdHlwZS5zZXRDb21wdXRhdGlvblByZWNpc2lvbj1mdW5jdGlvbih0KXt0aGlzLl9yZXN1bHRQcmVjaXNpb25Nb2RlbD10LHRoaXMuX2xpLnNldFByZWNpc2lvbk1vZGVsKHRoaXMuX3Jlc3VsdFByZWNpc2lvbk1vZGVsKX0sQ2cucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LENnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDZ307dmFyIFBnPWZ1bmN0aW9uKCl7fTtQZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUGcucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFBnfSxQZy5tYXA9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFdsJiZnbChhcmd1bWVudHNbMV0sUGcuTWFwT3ApKXtmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IGxjLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9ZS5tYXAodC5nZXRHZW9tZXRyeU4ocikpO251bGwhPT1pJiZuLmFkZChpKX1yZXR1cm4gdC5nZXRGYWN0b3J5KCkuYnVpbGRHZW9tZXRyeShuKX1pZihnbChhcmd1bWVudHNbMF0saWMpJiZnbChhcmd1bWVudHNbMV0sUGcuTWFwT3ApKXtmb3IodmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGE9bmV3IGxjLHU9by5pdGVyYXRvcigpO3UuaGFzTmV4dCgpOyl7dmFyIGw9dS5uZXh0KCksYz1zLm1hcChsKTtudWxsIT09YyYmYS5hZGQoYyl9cmV0dXJuIGF9fSxQZy5NYXBPcD1mdW5jdGlvbigpe307dmFyIE1nPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dC5jYWxsKHRoaXMsZSxuKSx0aGlzLl9wdExvY2F0b3I9bmV3IFBmLHRoaXMuX2dlb21GYWN0PW51bGwsdGhpcy5fcmVzdWx0R2VvbT1udWxsLHRoaXMuX2dyYXBoPW51bGwsdGhpcy5fZWRnZUxpc3Q9bmV3IEpwLHRoaXMuX3Jlc3VsdFBvbHlMaXN0PW5ldyBsYyx0aGlzLl9yZXN1bHRMaW5lTGlzdD1uZXcgbGMsdGhpcy5fcmVzdWx0UG9pbnRMaXN0PW5ldyBsYyx0aGlzLl9ncmFwaD1uZXcgSGgobmV3IEhwKSx0aGlzLl9nZW9tRmFjdD1lLmdldEZhY3RvcnkoKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaW5zZXJ0VW5pcXVlRWRnZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9lZGdlTGlzdC5maW5kRXF1YWxFZGdlKHQpO2lmKG51bGwhPT1lKXt2YXIgbj1lLmdldExhYmVsKCkscj10LmdldExhYmVsKCk7ZS5pc1BvaW50d2lzZUVxdWFsKHQpfHwocj1uZXcgRGgodC5nZXRMYWJlbCgpKSkuZmxpcCgpO3ZhciBpPWUuZ2V0RGVwdGgoKTtpLmlzTnVsbCgpJiZpLmFkZChuKSxpLmFkZChyKSxuLm1lcmdlKHIpfWVsc2UgdGhpcy5fZWRnZUxpc3QuYWRkKHQpfSxlLnByb3RvdHlwZS5nZXRHcmFwaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ncmFwaH0sZS5wcm90b3R5cGUuY2FuY2VsRHVwbGljYXRlUmVzdWx0RWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0RWRnZUVuZHMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldFN5bSgpO2UuaXNJblJlc3VsdCgpJiZuLmlzSW5SZXN1bHQoKSYmKGUuc2V0SW5SZXN1bHQoITEpLG4uc2V0SW5SZXN1bHQoITEpKX19LGUucHJvdG90eXBlLmlzQ292ZXJlZEJ5TEE9ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLmlzQ292ZXJlZCh0LHRoaXMuX3Jlc3VsdExpbmVMaXN0KXx8ISF0aGlzLmlzQ292ZXJlZCh0LHRoaXMuX3Jlc3VsdFBvbHlMaXN0KX0sZS5wcm90b3R5cGUuY29tcHV0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPW5ldyBsYztyZXR1cm4gby5hZGRBbGwodCksby5hZGRBbGwobiksby5hZGRBbGwociksby5pc0VtcHR5KCk/ZS5jcmVhdGVFbXB0eVJlc3VsdChpLHRoaXMuX2FyZ1swXS5nZXRHZW9tZXRyeSgpLHRoaXMuX2FyZ1sxXS5nZXRHZW9tZXRyeSgpLHRoaXMuX2dlb21GYWN0KTp0aGlzLl9nZW9tRmFjdC5idWlsZEdlb21ldHJ5KG8pfSxlLnByb3RvdHlwZS5tZXJnZVN5bUxhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncmFwaC5nZXROb2RlcygpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt0Lm5leHQoKS5nZXRFZGdlcygpLm1lcmdlU3ltTGFiZWxzKCl9fSxlLnByb3RvdHlwZS5pc0NvdmVyZWQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7aWYodGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LHIpIT09cGwuRVhURVJJT1IpcmV0dXJuITB9cmV0dXJuITF9LGUucHJvdG90eXBlLnJlcGxhY2VDb2xsYXBzZWRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgbGMsZT10aGlzLl9lZGdlTGlzdC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7bi5pc0NvbGxhcHNlZCgpJiYoZS5yZW1vdmUoKSx0LmFkZChuLmdldENvbGxhcHNlZEVkZ2UoKSkpfXRoaXMuX2VkZ2VMaXN0LmFkZEFsbCh0KX0sZS5wcm90b3R5cGUudXBkYXRlTm9kZUxhYmVsbGluZz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncmFwaC5nZXROb2RlcygpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKSxuPWUuZ2V0RWRnZXMoKS5nZXRMYWJlbCgpO2UuZ2V0TGFiZWwoKS5tZXJnZShuKX19LGUucHJvdG90eXBlLmdldFJlc3VsdEdlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbXB1dGVPdmVybGF5KHQpLHRoaXMuX3Jlc3VsdEdlb219LGUucHJvdG90eXBlLmluc2VydFVuaXF1ZUVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0aGlzLmluc2VydFVuaXF1ZUVkZ2Uobil9fSxlLnByb3RvdHlwZS5jb21wdXRlT3ZlcmxheT1mdW5jdGlvbih0KXt0aGlzLmNvcHlQb2ludHMoMCksdGhpcy5jb3B5UG9pbnRzKDEpLHRoaXMuX2FyZ1swXS5jb21wdXRlU2VsZk5vZGVzKHRoaXMuX2xpLCExKSx0aGlzLl9hcmdbMV0uY29tcHV0ZVNlbGZOb2Rlcyh0aGlzLl9saSwhMSksdGhpcy5fYXJnWzBdLmNvbXB1dGVFZGdlSW50ZXJzZWN0aW9ucyh0aGlzLl9hcmdbMV0sdGhpcy5fbGksITApO3ZhciBlPW5ldyBsYzt0aGlzLl9hcmdbMF0uY29tcHV0ZVNwbGl0RWRnZXMoZSksdGhpcy5fYXJnWzFdLmNvbXB1dGVTcGxpdEVkZ2VzKGUpLHRoaXMuaW5zZXJ0VW5pcXVlRWRnZXMoZSksdGhpcy5jb21wdXRlTGFiZWxzRnJvbURlcHRocygpLHRoaXMucmVwbGFjZUNvbGxhcHNlZEVkZ2VzKCksSGYuY2hlY2tWYWxpZCh0aGlzLl9lZGdlTGlzdC5nZXRFZGdlcygpKSx0aGlzLl9ncmFwaC5hZGRFZGdlcyh0aGlzLl9lZGdlTGlzdC5nZXRFZGdlcygpKSx0aGlzLmNvbXB1dGVMYWJlbGxpbmcoKSx0aGlzLmxhYmVsSW5jb21wbGV0ZU5vZGVzKCksdGhpcy5maW5kUmVzdWx0QXJlYUVkZ2VzKHQpLHRoaXMuY2FuY2VsRHVwbGljYXRlUmVzdWx0RWRnZXMoKTt2YXIgbj1uZXcgV2godGhpcy5fZ2VvbUZhY3QpO24uYWRkKHRoaXMuX2dyYXBoKSx0aGlzLl9yZXN1bHRQb2x5TGlzdD1uLmdldFBvbHlnb25zKCk7dmFyIHI9bmV3IEpmKHRoaXMsdGhpcy5fZ2VvbUZhY3QsdGhpcy5fcHRMb2NhdG9yKTt0aGlzLl9yZXN1bHRMaW5lTGlzdD1yLmJ1aWxkKHQpO3ZhciBpPW5ldyBaZih0aGlzLHRoaXMuX2dlb21GYWN0LHRoaXMuX3B0TG9jYXRvcik7dGhpcy5fcmVzdWx0UG9pbnRMaXN0PWkuYnVpbGQodCksdGhpcy5fcmVzdWx0R2VvbT10aGlzLmNvbXB1dGVHZW9tZXRyeSh0aGlzLl9yZXN1bHRQb2ludExpc3QsdGhpcy5fcmVzdWx0TGluZUxpc3QsdGhpcy5fcmVzdWx0UG9seUxpc3QsdCl9LGUucHJvdG90eXBlLmxhYmVsSW5jb21wbGV0ZU5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9wdExvY2F0b3IubG9jYXRlKHQuZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuX2FyZ1tlXS5nZXRHZW9tZXRyeSgpKTt0LmdldExhYmVsKCkuc2V0TG9jYXRpb24oZSxuKX0sZS5wcm90b3R5cGUuY29weVBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fYXJnW3RdLmdldE5vZGVJdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dGhpcy5fZ3JhcGguYWRkTm9kZShuLmdldENvb3JkaW5hdGUoKSkuc2V0TGFiZWwodCxuLmdldExhYmVsKCkuZ2V0TG9jYXRpb24odCkpfX0sZS5wcm90b3R5cGUuZmluZFJlc3VsdEFyZWFFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fZ3JhcGguZ2V0RWRnZUVuZHMoKS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCksaT1yLmdldExhYmVsKCk7aS5pc0FyZWEoKSYmIXIuaXNJbnRlcmlvckFyZWFFZGdlKCkmJmUuaXNSZXN1bHRPZk9wKGkuZ2V0TG9jYXRpb24oMCxTaC5SSUdIVCksaS5nZXRMb2NhdGlvbigxLFNoLlJJR0hUKSx0KSYmci5zZXRJblJlc3VsdCghMCl9fSxlLnByb3RvdHlwZS5jb21wdXRlTGFiZWxzRnJvbURlcHRocz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9lZGdlTGlzdC5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldExhYmVsKCkscj1lLmdldERlcHRoKCk7aWYoIXIuaXNOdWxsKCkpe3Iubm9ybWFsaXplKCk7Zm9yKHZhciBpPTA7aTwyO2krKyluLmlzTnVsbChpKXx8IW4uaXNBcmVhKCl8fHIuaXNOdWxsKGkpfHwoMD09PXIuZ2V0RGVsdGEoaSk/bi50b0xpbmUoaSk6KHFsLmlzVHJ1ZSghci5pc051bGwoaSxTaC5MRUZUKSwiZGVwdGggb2YgTEVGVCBzaWRlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCIpLG4uc2V0TG9jYXRpb24oaSxTaC5MRUZULHIuZ2V0TG9jYXRpb24oaSxTaC5MRUZUKSkscWwuaXNUcnVlKCFyLmlzTnVsbChpLFNoLlJJR0hUKSwiZGVwdGggb2YgUklHSFQgc2lkZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQiKSxuLnNldExvY2F0aW9uKGksU2guUklHSFQsci5nZXRMb2NhdGlvbihpLFNoLlJJR0hUKSkpKX19fSxlLnByb3RvdHlwZS5jb21wdXRlTGFiZWxsaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyYXBoLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLmdldEVkZ2VzKCkuY29tcHV0ZUxhYmVsbGluZyh0aGlzLl9hcmcpfXRoaXMubWVyZ2VTeW1MYWJlbHMoKSx0aGlzLnVwZGF0ZU5vZGVMYWJlbGxpbmcoKX0sZS5wcm90b3R5cGUubGFiZWxJbmNvbXBsZXRlTm9kZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldExhYmVsKCk7ZS5pc0lzb2xhdGVkKCkmJihuLmlzTnVsbCgwKT90aGlzLmxhYmVsSW5jb21wbGV0ZU5vZGUoZSwwKTp0aGlzLmxhYmVsSW5jb21wbGV0ZU5vZGUoZSwxKSksZS5nZXRFZGdlcygpLnVwZGF0ZUxhYmVsbGluZyhuKX19LGUucHJvdG90eXBlLmlzQ292ZXJlZEJ5QT1mdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMuaXNDb3ZlcmVkKHQsdGhpcy5fcmVzdWx0UG9seUxpc3QpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShDZyk7TWcub3ZlcmxheU9wPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IE1nKHQsZSkuZ2V0UmVzdWx0R2VvbWV0cnkobil9LE1nLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe2lmKHQuaXNFbXB0eSgpfHxlLmlzRW1wdHkoKSlyZXR1cm4gTWcuY3JlYXRlRW1wdHlSZXN1bHQoTWcuSU5URVJTRUNUSU9OLHQsZSx0LmdldEZhY3RvcnkoKSk7aWYodC5pc0dlb21ldHJ5Q29sbGVjdGlvbigpKXt2YXIgbj1lO3JldHVybiBXZi5tYXAodCx7aW50ZXJmYWNlc186ZnVuY3Rpb24oKXtyZXR1cm5bUGcuTWFwT3BdfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaW50ZXJzZWN0aW9uKG4pfX0pfXJldHVybiB0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHQpLHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24oZSksdWcub3ZlcmxheU9wKHQsZSxNZy5JTlRFUlNFQ1RJT04pfSxNZy5zeW1EaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7aWYodC5pc0VtcHR5KCl8fGUuaXNFbXB0eSgpKXtpZih0LmlzRW1wdHkoKSYmZS5pc0VtcHR5KCkpcmV0dXJuIE1nLmNyZWF0ZUVtcHR5UmVzdWx0KE1nLlNZTURJRkZFUkVOQ0UsdCxlLHQuZ2V0RmFjdG9yeSgpKTtpZih0LmlzRW1wdHkoKSlyZXR1cm4gZS5jb3B5KCk7aWYoZS5pc0VtcHR5KCkpcmV0dXJuIHQuY29weSgpfXJldHVybiB0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHQpLHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24oZSksdWcub3ZlcmxheU9wKHQsZSxNZy5TWU1ESUZGRVJFTkNFKX0sTWcucmVzdWx0RGltZW5zaW9uPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmdldERpbWVuc2lvbigpLGk9bi5nZXREaW1lbnNpb24oKSxvPS0xO3N3aXRjaCh0KXtjYXNlIE1nLklOVEVSU0VDVElPTjpvPU1hdGgubWluKHIsaSk7YnJlYWs7Y2FzZSBNZy5VTklPTjpvPU1hdGgubWF4KHIsaSk7YnJlYWs7Y2FzZSBNZy5ESUZGRVJFTkNFOm89cjticmVhaztjYXNlIE1nLlNZTURJRkZFUkVOQ0U6bz1NYXRoLm1heChyLGkpfXJldHVybiBvfSxNZy5jcmVhdGVFbXB0eVJlc3VsdD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1udWxsO3N3aXRjaChNZy5yZXN1bHREaW1lbnNpb24odCxlLG4pKXtjYXNlLTE6aT1yLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihuZXcgQXJyYXkoMCkuZmlsbChudWxsKSk7YnJlYWs7Y2FzZSAwOmk9ci5jcmVhdGVQb2ludCgpO2JyZWFrO2Nhc2UgMTppPXIuY3JlYXRlTGluZVN0cmluZygpO2JyZWFrO2Nhc2UgMjppPXIuY3JlYXRlUG9seWdvbigpfXJldHVybiBpfSxNZy5kaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaXNFbXB0eSgpP01nLmNyZWF0ZUVtcHR5UmVzdWx0KE1nLkRJRkZFUkVOQ0UsdCxlLHQuZ2V0RmFjdG9yeSgpKTplLmlzRW1wdHkoKT90LmNvcHkoKToodC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbih0KSx0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKGUpLHVnLm92ZXJsYXlPcCh0LGUsTWcuRElGRkVSRU5DRSkpfSxNZy5pc1Jlc3VsdE9mT3A9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49dC5nZXRMb2NhdGlvbigwKSxyPXQuZ2V0TG9jYXRpb24oMSk7cmV0dXJuIE1nLmlzUmVzdWx0T2ZPcChuLHIsZSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXTtzd2l0Y2goaT09PXBsLkJPVU5EQVJZJiYoaT1wbC5JTlRFUklPUiksbz09PXBsLkJPVU5EQVJZJiYobz1wbC5JTlRFUklPUikscyl7Y2FzZSBNZy5JTlRFUlNFQ1RJT046cmV0dXJuIGk9PT1wbC5JTlRFUklPUiYmbz09PXBsLklOVEVSSU9SO2Nhc2UgTWcuVU5JT046cmV0dXJuIGk9PT1wbC5JTlRFUklPUnx8bz09PXBsLklOVEVSSU9SO2Nhc2UgTWcuRElGRkVSRU5DRTpyZXR1cm4gaT09PXBsLklOVEVSSU9SJiZvIT09cGwuSU5URVJJT1I7Y2FzZSBNZy5TWU1ESUZGRVJFTkNFOnJldHVybiBpPT09cGwuSU5URVJJT1ImJm8hPT1wbC5JTlRFUklPUnx8aSE9PXBsLklOVEVSSU9SJiZvPT09cGwuSU5URVJJT1J9cmV0dXJuITF9fSxNZy5JTlRFUlNFQ1RJT049MSxNZy5VTklPTj0yLE1nLkRJRkZFUkVOQ0U9MyxNZy5TWU1ESUZGRVJFTkNFPTQ7dmFyIExnPWZ1bmN0aW9uKCl7dGhpcy5fZz1udWxsLHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9bnVsbCx0aGlzLl9saW5ld29yaz1udWxsLHRoaXMuX3B0TG9jYXRvcj1uZXcgUGYsdGhpcy5fc2VnPW5ldyB2cDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZz10LHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9ZSx0aGlzLl9saW5ld29yaz10aGlzLmV4dHJhY3RMaW5ld29yayh0KX07TGcucHJvdG90eXBlLmlzV2l0aGluVG9sZXJhbmNlT2ZCb3VuZGFyeT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPTA7bjx0aGlzLl9saW5ld29yay5nZXROdW1HZW9tZXRyaWVzKCk7bisrKWZvcih2YXIgcj1lLl9saW5ld29yay5nZXRHZW9tZXRyeU4obikuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksaT0wO2k8ci5zaXplKCktMTtpKyspe2lmKHIuZ2V0Q29vcmRpbmF0ZShpLGUuX3NlZy5wMCksci5nZXRDb29yZGluYXRlKGkrMSxlLl9zZWcucDEpLGUuX3NlZy5kaXN0YW5jZSh0KTw9ZS5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSlyZXR1cm4hMH1yZXR1cm4hMX0sTGcucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzV2l0aGluVG9sZXJhbmNlT2ZCb3VuZGFyeSh0KT9wbC5CT1VOREFSWTp0aGlzLl9wdExvY2F0b3IubG9jYXRlKHQsdGhpcy5fZyl9LExnLnByb3RvdHlwZS5leHRyYWN0TGluZXdvcms9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IE9nO3QuYXBwbHkoZSk7dmFyIG49ZS5nZXRMaW5ld29yaygpLHI9X2gudG9MaW5lU3RyaW5nQXJyYXkobik7cmV0dXJuIHQuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyhyKX0sTGcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LExnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBMZ307dmFyIE9nPWZ1bmN0aW9uKCl7dGhpcy5fbGluZXdvcms9bnVsbCx0aGlzLl9saW5ld29yaz1uZXcgbGN9O09nLnByb3RvdHlwZS5nZXRMaW5ld29yaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9saW5ld29ya30sT2cucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgdGgpe3ZhciBlPXQ7dGhpcy5fbGluZXdvcmsuYWRkKGUuZ2V0RXh0ZXJpb3JSaW5nKCkpO2Zvcih2YXIgbj0wO248ZS5nZXROdW1JbnRlcmlvclJpbmcoKTtuKyspdGhpcy5fbGluZXdvcmsuYWRkKGUuZ2V0SW50ZXJpb3JSaW5nTihuKSl9fSxPZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bRGNdfSxPZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gT2d9O3ZhciBSZz1mdW5jdGlvbigpe3RoaXMuX2c9bnVsbCx0aGlzLl9kb0xlZnQ9ITAsdGhpcy5fZG9SaWdodD0hMDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZz10fTtSZy5wcm90b3R5cGUuZXh0cmFjdFBvaW50cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXQuZ2V0Q29vcmRpbmF0ZXMoKSxpPTA7aTxyLmxlbmd0aC0xO2krKyl0aGlzLmNvbXB1dGVPZmZzZXRQb2ludHMocltpXSxyW2krMV0sZSxuKX0sUmcucHJvdG90eXBlLnNldFNpZGVzVG9HZW5lcmF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2RvTGVmdD10LHRoaXMuX2RvUmlnaHQ9ZX0sUmcucHJvdG90eXBlLmdldFBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGxjLG49Q2YuZ2V0TGluZXModGhpcy5fZykuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3RoaXMuZXh0cmFjdFBvaW50cyhyLHQsZSl9cmV0dXJuIGV9LFJnLnByb3RvdHlwZS5jb21wdXRlT2Zmc2V0UG9pbnRzPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWUueC10Lngsbz1lLnktdC55LHM9TWF0aC5zcXJ0KGkqaStvKm8pLGE9bippL3MsdT1uKm8vcyxsPShlLngrdC54KS8yLGM9KGUueSt0LnkpLzI7aWYodGhpcy5fZG9MZWZ0KXt2YXIgaD1uZXcgdWwobC11LGMrYSk7ci5hZGQoaCl9aWYodGhpcy5fZG9SaWdodCl7dmFyIHA9bmV3IHVsKGwrdSxjLWEpO3IuYWRkKHApfX0sUmcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFJnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBSZ307dmFyIFRnPWZ1bmN0aW9uIHQoKXt0aGlzLl9nZW9tPW51bGwsdGhpcy5fbG9jRmluZGVyPW51bGwsdGhpcy5fbG9jYXRpb249bmV3IEFycmF5KDMpLmZpbGwobnVsbCksdGhpcy5faW52YWxpZExvY2F0aW9uPW51bGwsdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZT10LlRPTEVSQU5DRSx0aGlzLl90ZXN0Q29vcmRzPW5ldyBsYzt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZT10LmNvbXB1dGVCb3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKGUsbiksdGhpcy5fZ2VvbT1bZSxuLHJdLHRoaXMuX2xvY0ZpbmRlcj1bbmV3IExnKHRoaXMuX2dlb21bMF0sdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSksbmV3IExnKHRoaXMuX2dlb21bMV0sdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSksbmV3IExnKHRoaXMuX2dlb21bMl0sdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSldfSxBZz17VE9MRVJBTkNFOntjb25maWd1cmFibGU6ITB9fTtUZy5wcm90b3R5cGUucmVwb3J0UmVzdWx0PWZ1bmN0aW9uKHQsZSxuKXtQbC5vdXQucHJpbnRsbigiT3ZlcmxheSByZXN1bHQgaW52YWxpZCAtIEE6IitwbC50b0xvY2F0aW9uU3ltYm9sKGVbMF0pKyIgQjoiK3BsLnRvTG9jYXRpb25TeW1ib2woZVsxXSkrIiBleHBlY3RlZDoiKyhuPyJpIjoiZSIpKyIgYWN0dWFsOiIrcGwudG9Mb2NhdGlvblN5bWJvbChlWzJdKSl9LFRnLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKHQpe3RoaXMuYWRkVGVzdFB0cyh0aGlzLl9nZW9tWzBdKSx0aGlzLmFkZFRlc3RQdHModGhpcy5fZ2VvbVsxXSk7dmFyIGU9dGhpcy5jaGVja1ZhbGlkKHQpO3JldHVybiBlfSxUZy5wcm90b3R5cGUuY2hlY2tWYWxpZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj0wO248dGhpcy5fdGVzdENvb3Jkcy5zaXplKCk7bisrKXt2YXIgcj10Ll90ZXN0Q29vcmRzLmdldChuKTtpZighdC5jaGVja1ZhbGlkKGUscikpcmV0dXJuIHQuX2ludmFsaWRMb2NhdGlvbj1yLCExfXJldHVybiEwfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuX2xvY2F0aW9uWzBdPXRoaXMuX2xvY0ZpbmRlclswXS5nZXRMb2NhdGlvbihvKSx0aGlzLl9sb2NhdGlvblsxXT10aGlzLl9sb2NGaW5kZXJbMV0uZ2V0TG9jYXRpb24obyksdGhpcy5fbG9jYXRpb25bMl09dGhpcy5fbG9jRmluZGVyWzJdLmdldExvY2F0aW9uKG8pLCEhVGcuaGFzTG9jYXRpb24odGhpcy5fbG9jYXRpb24scGwuQk9VTkRBUlkpfHx0aGlzLmlzVmFsaWRSZXN1bHQoaSx0aGlzLl9sb2NhdGlvbil9fSxUZy5wcm90b3R5cGUuYWRkVGVzdFB0cz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgUmcodCk7dGhpcy5fdGVzdENvb3Jkcy5hZGRBbGwoZS5nZXRQb2ludHMoNSp0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKSl9LFRnLnByb3RvdHlwZS5pc1ZhbGlkUmVzdWx0PWZ1bmN0aW9uKHQsZSl7dmFyIG49TWcuaXNSZXN1bHRPZk9wKGVbMF0sZVsxXSx0KSxyPSEobl5lWzJdPT09cGwuSU5URVJJT1IpO3JldHVybiByfHx0aGlzLnJlcG9ydFJlc3VsdCh0LGUsbikscn0sVGcucHJvdG90eXBlLmdldEludmFsaWRMb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnZhbGlkTG9jYXRpb259LFRnLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxUZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVGd9LFRnLmhhc0xvY2F0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjwzO24rKylpZih0W25dPT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sVGcuY29tcHV0ZUJvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5taW4oJGYuY29tcHV0ZVNpemVCYXNlZFNuYXBUb2xlcmFuY2UodCksJGYuY29tcHV0ZVNpemVCYXNlZFNuYXBUb2xlcmFuY2UoZSkpfSxUZy5pc1ZhbGlkPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBuZXcgVGcodCxlLHIpLmlzVmFsaWQobil9LEFnLlRPTEVSQU5DRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtNn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVGcsQWcpO3ZhciBEZz1mdW5jdGlvbiB0KGUpe3RoaXMuX2dlb21GYWN0b3J5PW51bGwsdGhpcy5fc2tpcEVtcHR5PSExLHRoaXMuX2lucHV0R2VvbXM9bnVsbCx0aGlzLl9nZW9tRmFjdG9yeT10LmV4dHJhY3RGYWN0b3J5KGUpLHRoaXMuX2lucHV0R2VvbXM9ZX07RGcucHJvdG90eXBlLmV4dHJhY3RFbGVtZW50cz1mdW5jdGlvbih0LGUpe2lmKG51bGw9PT10KXJldHVybiBudWxsO2Zvcih2YXIgbj0wO248dC5nZXROdW1HZW9tZXRyaWVzKCk7bisrKXt2YXIgcj10LmdldEdlb21ldHJ5TihuKTt0aGlzLl9za2lwRW1wdHkmJnIuaXNFbXB0eSgpfHxlLmFkZChyKX19LERnLnByb3RvdHlwZS5jb21iaW5lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBsYyxlPXRoaXMuX2lucHV0R2VvbXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3RoaXMuZXh0cmFjdEVsZW1lbnRzKG4sdCl9cmV0dXJuIDA9PT10LnNpemUoKT9udWxsIT09dGhpcy5fZ2VvbUZhY3Rvcnk/dGhpcy5fZ2VvbUZhY3RvcnkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKG51bGwpOm51bGw6dGhpcy5fZ2VvbUZhY3RvcnkuYnVpbGRHZW9tZXRyeSh0KX0sRGcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LERnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBEZ30sRGcuY29tYmluZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgRGcodCk7cmV0dXJuIGUuY29tYmluZSgpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1uZXcgRGcoRGcuY3JlYXRlTGlzdChuLHIpKTtyZXR1cm4gaS5jb21iaW5lKCl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXSx1PW5ldyBEZyhEZy5jcmVhdGVMaXN0KG8scyxhKSk7cmV0dXJuIHUuY29tYmluZSgpfX0sRGcuZXh0cmFjdEZhY3Rvcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNFbXB0eSgpP251bGw6dC5pdGVyYXRvcigpLm5leHQoKS5nZXRGYWN0b3J5KCl9LERnLmNyZWF0ZUxpc3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IGxjO3JldHVybiBuLmFkZCh0KSxuLmFkZChlKSxufWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl0scz1uZXcgbGM7cmV0dXJuIHMuYWRkKHIpLHMuYWRkKGkpLHMuYWRkKG8pLHN9fTt2YXIgRmc9ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dFBvbHlzPW51bGwsdGhpcy5fZ2VvbUZhY3Rvcnk9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5faW5wdXRQb2x5cz10LG51bGw9PT10aGlzLl9pbnB1dFBvbHlzJiYodGhpcy5faW5wdXRQb2x5cz1uZXcgbGMpfSxrZz17U1RSVFJFRV9OT0RFX0NBUEFDSVRZOntjb25maWd1cmFibGU6ITB9fTtGZy5wcm90b3R5cGUucmVkdWNlVG9HZW9tZXRyaWVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgbGMsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKSxpPW51bGw7Z2wocixhYyk/aT10aGlzLnVuaW9uVHJlZShyKTpyIGluc3RhbmNlb2YgV2wmJihpPXIpLGUuYWRkKGkpfXJldHVybiBlfSxGZy5wcm90b3R5cGUuZXh0cmFjdEJ5RW52ZWxvcGU9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uZXcgbGMsaT0wO2k8ZS5nZXROdW1HZW9tZXRyaWVzKCk7aSsrKXt2YXIgbz1lLmdldEdlb21ldHJ5TihpKTtvLmdldEVudmVsb3BlSW50ZXJuYWwoKS5pbnRlcnNlY3RzKHQpP3IuYWRkKG8pOm4uYWRkKG8pfXJldHVybiB0aGlzLl9nZW9tRmFjdG9yeS5idWlsZEdlb21ldHJ5KHIpfSxGZy5wcm90b3R5cGUudW5pb25PcHRpbWl6ZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldEVudmVsb3BlSW50ZXJuYWwoKSxyPWUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpO2lmKCFuLmludGVyc2VjdHMocikpcmV0dXJuIERnLmNvbWJpbmUodCxlKTtpZih0LmdldE51bUdlb21ldHJpZXMoKTw9MSYmZS5nZXROdW1HZW9tZXRyaWVzKCk8PTEpcmV0dXJuIHRoaXMudW5pb25BY3R1YWwodCxlKTt2YXIgaT1uLmludGVyc2VjdGlvbihyKTtyZXR1cm4gdGhpcy51bmlvblVzaW5nRW52ZWxvcGVJbnRlcnNlY3Rpb24odCxlLGkpfSxGZy5wcm90b3R5cGUudW5pb249ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5faW5wdXRQb2x5cyl0aHJvdyBuZXcgRXJyb3IoInVuaW9uKCkgbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgdHdpY2UiKTtpZih0aGlzLl9pbnB1dFBvbHlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt0aGlzLl9nZW9tRmFjdG9yeT10aGlzLl9pbnB1dFBvbHlzLml0ZXJhdG9yKCkubmV4dCgpLmdldEZhY3RvcnkoKTtmb3IodmFyIHQ9bmV3IHVwKEZnLlNUUlRSRUVfTk9ERV9DQVBBQ0lUWSksZT10aGlzLl9pbnB1dFBvbHlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0Lmluc2VydChuLmdldEVudmVsb3BlSW50ZXJuYWwoKSxuKX10aGlzLl9pbnB1dFBvbHlzPW51bGw7dmFyIHI9dC5pdGVtc1RyZWUoKTtyZXR1cm4gdGhpcy51bmlvblRyZWUocil9LEZnLnByb3RvdHlwZS5iaW5hcnlVbmlvbj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuYmluYXJ5VW5pb24odCwwLHQuc2l6ZSgpKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO2lmKHItbjw9MSl7dmFyIGk9RmcuZ2V0R2VvbWV0cnkoZSxuKTtyZXR1cm4gdGhpcy51bmlvblNhZmUoaSxudWxsKX1pZihyLW49PTIpcmV0dXJuIHRoaXMudW5pb25TYWZlKEZnLmdldEdlb21ldHJ5KGUsbiksRmcuZ2V0R2VvbWV0cnkoZSxuKzEpKTt2YXIgbz1NYXRoLnRydW5jKChyK24pLzIpLHM9dGhpcy5iaW5hcnlVbmlvbihlLG4sbyksYT10aGlzLmJpbmFyeVVuaW9uKGUsbyxyKTtyZXR1cm4gdGhpcy51bmlvblNhZmUocyxhKX19LEZnLnByb3RvdHlwZS5yZXBlYXRlZFVuaW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ZT1udWxsPT09ZT9yLmNvcHkoKTplLnVuaW9uKHIpfXJldHVybiBlfSxGZy5wcm90b3R5cGUudW5pb25TYWZlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PT10JiZudWxsPT09ZT9udWxsOm51bGw9PT10P2UuY29weSgpOm51bGw9PT1lP3QuY29weSgpOnRoaXMudW5pb25PcHRpbWl6ZWQodCxlKX0sRmcucHJvdG90eXBlLnVuaW9uQWN0dWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEZnLnJlc3RyaWN0VG9Qb2x5Z29ucyh0LnVuaW9uKGUpKX0sRmcucHJvdG90eXBlLnVuaW9uVHJlZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnJlZHVjZVRvR2VvbWV0cmllcyh0KTtyZXR1cm4gdGhpcy5iaW5hcnlVbmlvbihlKX0sRmcucHJvdG90eXBlLnVuaW9uVXNpbmdFbnZlbG9wZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IGxjLGk9dGhpcy5leHRyYWN0QnlFbnZlbG9wZShuLHQsciksbz10aGlzLmV4dHJhY3RCeUVudmVsb3BlKG4sZSxyKSxzPXRoaXMudW5pb25BY3R1YWwoaSxvKTtyZXR1cm4gci5hZGQocyksRGcuY29tYmluZShyKX0sRmcucHJvdG90eXBlLmJ1ZmZlclVuaW9uPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXQuZ2V0KDApLmdldEZhY3RvcnkoKSxuPWUuYnVpbGRHZW9tZXRyeSh0KSxyPW4uYnVmZmVyKDApO3JldHVybiByfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1pLmdldEZhY3RvcnkoKSxhPXMuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKFtpLG9dKSx1PWEuYnVmZmVyKDApO3JldHVybiB1fX0sRmcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEZnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBGZ30sRmcucmVzdHJpY3RUb1BvbHlnb25zPWZ1bmN0aW9uKHQpe2lmKGdsKHQsJGMpKXJldHVybiB0O3ZhciBlPVNmLmdldFBvbHlnb25zKHQpO3JldHVybiAxPT09ZS5zaXplKCk/ZS5nZXQoMCk6dC5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlQb2x5Z29uKF9oLnRvUG9seWdvbkFycmF5KGUpKX0sRmcuZ2V0R2VvbWV0cnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT49dC5zaXplKCk/bnVsbDp0LmdldChlKX0sRmcudW5pb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGZyh0KS51bmlvbigpfSxrZy5TVFJUUkVFX05PREVfQ0FQQUNJVFkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDR9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZnLGtnKTt2YXIgR2c9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIHFnKCl7cmV0dXJuIG5ldyBCZ31mdW5jdGlvbiBCZygpe3RoaXMucmVzZXQoKX1HZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sR2cucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEdnfSxHZy51bmlvbj1mdW5jdGlvbih0LGUpe2lmKHQuaXNFbXB0eSgpfHxlLmlzRW1wdHkoKSl7aWYodC5pc0VtcHR5KCkmJmUuaXNFbXB0eSgpKXJldHVybiBNZy5jcmVhdGVFbXB0eVJlc3VsdChNZy5VTklPTix0LGUsdC5nZXRGYWN0b3J5KCkpO2lmKHQuaXNFbXB0eSgpKXJldHVybiBlLmNvcHkoKTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gdC5jb3B5KCl9cmV0dXJuIHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24odCksdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbihlKSx1Zy5vdmVybGF5T3AodCxlLE1nLlVOSU9OKX0sQmcucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpCZyxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sYWRkOmZ1bmN0aW9uKHQpe2pnKHpnLHQsdGhpcy50KSxqZyh0aGlzLHpnLnMsdGhpcy5zKSx0aGlzLnM/dGhpcy50Kz16Zy50OnRoaXMucz16Zy50fSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciB6Zz1uZXcgQmc7ZnVuY3Rpb24gamcodCxlLG4pe3ZhciByPXQucz1lK24saT1yLWUsbz1yLWk7dC50PWUtbysobi1pKX12YXIgVWc9MWUtNixWZz1NYXRoLlBJLFhnPVZnLzIsWWc9VmcvNCxIZz0yKlZnLFdnPTE4MC9WZyxKZz1WZy8xODAsWmc9TWF0aC5hYnMsS2c9TWF0aC5hdGFuLFFnPU1hdGguYXRhbjIsJGc9TWF0aC5jb3MsdGQ9TWF0aC5zaW4sZWQ9TWF0aC5zcXJ0O2Z1bmN0aW9uIG5kKHQpe3JldHVybiB0PjE/MDp0PC0xP1ZnOk1hdGguYWNvcyh0KX1mdW5jdGlvbiByZCh0KXtyZXR1cm4gdD4xP1hnOnQ8LTE/LVhnOk1hdGguYXNpbih0KX1mdW5jdGlvbiBpZCgpe31mdW5jdGlvbiBvZCh0LGUpe3QmJmFkLmhhc093blByb3BlcnR5KHQudHlwZSkmJmFkW3QudHlwZV0odCxlKX12YXIgc2Q9e0ZlYXR1cmU6ZnVuY3Rpb24odCxlKXtvZCh0Lmdlb21ldHJ5LGUpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmZlYXR1cmVzLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspb2QobltyXS5nZW9tZXRyeSxlKX19LGFkPXtTcGhlcmU6ZnVuY3Rpb24odCxlKXtlLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LGUpe3Q9dC5jb29yZGluYXRlcyxlLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspdD1uW3JdLGUucG9pbnQodFswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7dWQodC5jb29yZGluYXRlcyxlLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5jb29yZGluYXRlcyxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KXVkKG5bcl0sZSwwKX0sUG9seWdvbjpmdW5jdGlvbih0LGUpe2xkKHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspbGQobltyXSxlKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2VvbWV0cmllcyxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KW9kKG5bcl0sZSl9fTtmdW5jdGlvbiB1ZCh0LGUsbil7dmFyIHIsaT0tMSxvPXQubGVuZ3RoLW47Zm9yKGUubGluZVN0YXJ0KCk7KytpPG87KXI9dFtpXSxlLnBvaW50KHJbMF0sclsxXSxyWzJdKTtlLmxpbmVFbmQoKX1mdW5jdGlvbiBsZCh0LGUpe3ZhciBuPS0xLHI9dC5sZW5ndGg7Zm9yKGUucG9seWdvblN0YXJ0KCk7KytuPHI7KXVkKHRbbl0sZSwxKTtlLnBvbHlnb25FbmQoKX1xZygpLHFnKCk7ZnVuY3Rpb24gY2QodCl7cmV0dXJuW1FnKHRbMV0sdFswXSkscmQodFsyXSldfWZ1bmN0aW9uIGhkKHQpe3ZhciBlPXRbMF0sbj10WzFdLHI9JGcobik7cmV0dXJuW3IqJGcoZSkscip0ZChlKSx0ZChuKV19ZnVuY3Rpb24gcGQodCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXSt0WzJdKmVbMl19ZnVuY3Rpb24gZmQodCxlKXtyZXR1cm5bdFsxXSplWzJdLXRbMl0qZVsxXSx0WzJdKmVbMF0tdFswXSplWzJdLHRbMF0qZVsxXS10WzFdKmVbMF1dfWZ1bmN0aW9uIGdkKHQsZSl7dFswXSs9ZVswXSx0WzFdKz1lWzFdLHRbMl0rPWVbMl19ZnVuY3Rpb24gZGQodCxlKXtyZXR1cm5bdFswXSplLHRbMV0qZSx0WzJdKmVdfWZ1bmN0aW9uIHlkKHQpe3ZhciBlPWVkKHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1lLHRbMV0vPWUsdFsyXS89ZX1xZygpO2Z1bmN0aW9uIHZkKHQsZSl7ZnVuY3Rpb24gbihuLHIpe3JldHVybiBuPXQobixyKSxlKG5bMF0sblsxXSl9cmV0dXJuIHQuaW52ZXJ0JiZlLmludmVydCYmKG4uaW52ZXJ0PWZ1bmN0aW9uKG4scil7cmV0dXJuKG49ZS5pbnZlcnQobixyKSkmJnQuaW52ZXJ0KG5bMF0sblsxXSl9KSxufWZ1bmN0aW9uIF9kKHQsZSl7cmV0dXJuW3Q+Vmc/dC1IZzp0PC1WZz90K0hnOnQsZV19ZnVuY3Rpb24gbWQodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuWyhlKz10KT5WZz9lLUhnOmU8LVZnP2UrSGc6ZSxuXX19ZnVuY3Rpb24geGQodCl7dmFyIGU9bWQodCk7cmV0dXJuIGUuaW52ZXJ0PW1kKC10KSxlfWZ1bmN0aW9uIEVkKHQsZSl7dmFyIG49JGcodCkscj10ZCh0KSxpPSRnKGUpLG89dGQoZSk7ZnVuY3Rpb24gcyh0LGUpe3ZhciBzPSRnKGUpLGE9JGcodCkqcyx1PXRkKHQpKnMsbD10ZChlKSxjPWwqbithKnI7cmV0dXJuW1FnKHUqaS1jKm8sYSpuLWwqcikscmQoYyppK3UqbyldfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0LGUpe3ZhciBzPSRnKGUpLGE9JGcodCkqcyx1PXRkKHQpKnMsbD10ZChlKSxjPWwqaS11Km87cmV0dXJuW1FnKHUqaStsKm8sYSpuK2MqcikscmQoYypuLWEqcildfSxzfWZ1bmN0aW9uIGJkKHQsZSl7KGU9aGQoZSkpWzBdLT10LHlkKGUpO3ZhciBuPW5kKC1lWzFdKTtyZXR1cm4oKC1lWzJdPDA/LW46bikrSGctVWcpJUhnfWZ1bmN0aW9uIHdkKCl7dmFyIHQsZT1bXTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24oZSxuKXt0LnB1c2goW2Usbl0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtlLnB1c2godD1bXSl9LGxpbmVFbmQ6aWQscmVqb2luOmZ1bmN0aW9uKCl7ZS5sZW5ndGg+MSYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgbj1lO3JldHVybiBlPVtdLHQ9bnVsbCxufX19ZnVuY3Rpb24gSWQodCxlKXtyZXR1cm4gWmcodFswXS1lWzBdKTxVZyYmWmcodFsxXS1lWzFdKTxVZ31mdW5jdGlvbiBOZCh0LGUsbixyKXt0aGlzLng9dCx0aGlzLno9ZSx0aGlzLm89bix0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIFNkKHQsZSxuLHIsaSl7dmFyIG8scyxhPVtdLHU9W107aWYodC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighKChlPXQubGVuZ3RoLTEpPD0wKSl7dmFyIGUsbixyPXRbMF0scz10W2VdO2lmKElkKHIscykpe2ZvcihpLmxpbmVTdGFydCgpLG89MDtvPGU7KytvKWkucG9pbnQoKHI9dFtvXSlbMF0sclsxXSk7aS5saW5lRW5kKCl9ZWxzZSBhLnB1c2gobj1uZXcgTmQocix0LG51bGwsITApKSx1LnB1c2gobi5vPW5ldyBOZChyLG51bGwsbiwhMSkpLGEucHVzaChuPW5ldyBOZChzLHQsbnVsbCwhMSkpLHUucHVzaChuLm89bmV3IE5kKHMsbnVsbCxuLCEwKSl9fSkpLGEubGVuZ3RoKXtmb3IodS5zb3J0KGUpLENkKGEpLENkKHUpLG89MCxzPXUubGVuZ3RoO288czsrK28pdVtvXS5lPW49IW47Zm9yKHZhciBsLGMsaD1hWzBdOzspe2Zvcih2YXIgcD1oLGY9ITA7cC52OylpZigocD1wLm4pPT09aClyZXR1cm47bD1wLnosaS5saW5lU3RhcnQoKTtkb3tpZihwLnY9cC5vLnY9ITAscC5lKXtpZihmKWZvcihvPTAscz1sLmxlbmd0aDtvPHM7KytvKWkucG9pbnQoKGM9bFtvXSlbMF0sY1sxXSk7ZWxzZSByKHAueCxwLm4ueCwxLGkpO3A9cC5ufWVsc2V7aWYoZilmb3IobD1wLnAueixvPWwubGVuZ3RoLTE7bz49MDstLW8paS5wb2ludCgoYz1sW29dKVswXSxjWzFdKTtlbHNlIHIocC54LHAucC54LC0xLGkpO3A9cC5wfWw9KHA9cC5vKS56LGY9IWZ9d2hpbGUoIXAudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBDZCh0KXtpZihlPXQubGVuZ3RoKXtmb3IodmFyIGUsbixyPTAsaT10WzBdOysrcjxlOylpLm49bj10W3JdLG4ucD1pLGk9bjtpLm49bj10WzBdLG4ucD1pfX1mdW5jdGlvbiBQZCh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1fZC5pbnZlcnQ9X2Q7dmFyIE1kLExkOzE9PT0oTWQ9UGQpLmxlbmd0aCYmKExkPU1kLE1kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFBkKExkKHQpLGUpfSk7ZnVuY3Rpb24gT2QodCl7Zm9yKHZhciBlLG4scixpPXQubGVuZ3RoLG89LTEscz0wOysrbzxpOylzKz10W29dLmxlbmd0aDtmb3Iobj1uZXcgQXJyYXkocyk7LS1pPj0wOylmb3IoZT0ocj10W2ldKS5sZW5ndGg7LS1lPj0wOyluWy0tc109cltlXTtyZXR1cm4gbn12YXIgUmQ9MWU5LFRkPS1SZDtmdW5jdGlvbiBBZCh0LGUsbixyKXtmdW5jdGlvbiBpKGksbyl7cmV0dXJuIHQ8PWkmJmk8PW4mJmU8PW8mJm88PXJ9ZnVuY3Rpb24gbyhpLG8sYSxsKXt2YXIgYz0wLGg9MDtpZihudWxsPT1pfHwoYz1zKGksYSkpIT09KGg9cyhvLGEpKXx8dShpLG8pPDBeYT4wKWRve2wucG9pbnQoMD09PWN8fDM9PT1jP3Q6bixjPjE/cjplKX13aGlsZSgoYz0oYythKzQpJTQpIT09aCk7ZWxzZSBsLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gcyhyLGkpe3JldHVybiBaZyhyWzBdLXQpPFVnP2k+MD8wOjM6WmcoclswXS1uKTxVZz9pPjA/MjoxOlpnKHJbMV0tZSk8VWc/aT4wPzE6MDppPjA/MzoyfWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gdSh0LngsZS54KX1mdW5jdGlvbiB1KHQsZSl7dmFyIG49cyh0LDEpLHI9cyhlLDEpO3JldHVybiBuIT09cj9uLXI6MD09PW4/ZVsxXS10WzFdOjE9PT1uP3RbMF0tZVswXToyPT09bj90WzFdLWVbMV06ZVswXS10WzBdfXJldHVybiBmdW5jdGlvbihzKXt2YXIgdSxsLGMsaCxwLGYsZyxkLHksdixfLG09cyx4PXdkKCksRT17cG9pbnQ6YixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtFLnBvaW50PXcsbCYmbC5wdXNoKGM9W10pO3Y9ITAseT0hMSxnPWQ9TmFOfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dSYmKHcoaCxwKSxmJiZ5JiZ4LnJlam9pbigpLHUucHVzaCh4LnJlc3VsdCgpKSk7RS5wb2ludD1iLHkmJm0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXttPXgsdT1bXSxsPVtdLF89ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe2Zvcih2YXIgZT0wLG49MCxpPWwubGVuZ3RoO248aTsrK24pZm9yKHZhciBvLHMsYT1sW25dLHU9MSxjPWEubGVuZ3RoLGg9YVswXSxwPWhbMF0sZj1oWzFdO3U8YzsrK3Upbz1wLHM9ZixwPShoPWFbdV0pWzBdLGY9aFsxXSxzPD1yP2Y+ciYmKHAtbykqKHItcyk+KGYtcykqKHQtbykmJisrZTpmPD1yJiYocC1vKSooci1zKTwoZi1zKSoodC1vKSYmLS1lO3JldHVybiBlfSgpLG49XyYmZSxpPSh1PU9kKHUpKS5sZW5ndGg7KG58fGkpJiYocy5wb2x5Z29uU3RhcnQoKSxuJiYocy5saW5lU3RhcnQoKSxvKG51bGwsbnVsbCwxLHMpLHMubGluZUVuZCgpKSxpJiZTZCh1LGEsZSxvLHMpLHMucG9seWdvbkVuZCgpKTttPXMsdT1sPWM9bnVsbH19O2Z1bmN0aW9uIGIodCxlKXtpKHQsZSkmJm0ucG9pbnQodCxlKX1mdW5jdGlvbiB3KG8scyl7dmFyIGE9aShvLHMpO2lmKGwmJmMucHVzaChbbyxzXSksdiloPW8scD1zLGY9YSx2PSExLGEmJihtLmxpbmVTdGFydCgpLG0ucG9pbnQobyxzKSk7ZWxzZSBpZihhJiZ5KW0ucG9pbnQobyxzKTtlbHNle3ZhciB1PVtnPU1hdGgubWF4KFRkLE1hdGgubWluKFJkLGcpKSxkPU1hdGgubWF4KFRkLE1hdGgubWluKFJkLGQpKV0seD1bbz1NYXRoLm1heChUZCxNYXRoLm1pbihSZCxvKSkscz1NYXRoLm1heChUZCxNYXRoLm1pbihSZCxzKSldOyFmdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIHMsYT10WzBdLHU9dFsxXSxsPTAsYz0xLGg9ZVswXS1hLHA9ZVsxXS11O2lmKHM9bi1hLGh8fCEocz4wKSl7aWYocy89aCxoPDApe2lmKHM8bClyZXR1cm47czxjJiYoYz1zKX1lbHNlIGlmKGg+MCl7aWYocz5jKXJldHVybjtzPmwmJihsPXMpfWlmKHM9aS1hLGh8fCEoczwwKSl7aWYocy89aCxoPDApe2lmKHM+YylyZXR1cm47cz5sJiYobD1zKX1lbHNlIGlmKGg+MCl7aWYoczxsKXJldHVybjtzPGMmJihjPXMpfWlmKHM9ci11LHB8fCEocz4wKSl7aWYocy89cCxwPDApe2lmKHM8bClyZXR1cm47czxjJiYoYz1zKX1lbHNlIGlmKHA+MCl7aWYocz5jKXJldHVybjtzPmwmJihsPXMpfWlmKHM9by11LHB8fCEoczwwKSl7aWYocy89cCxwPDApe2lmKHM+YylyZXR1cm47cz5sJiYobD1zKX1lbHNlIGlmKHA+MCl7aWYoczxsKXJldHVybjtzPGMmJihjPXMpfXJldHVybiBsPjAmJih0WzBdPWErbCpoLHRbMV09dStsKnApLGM8MSYmKGVbMF09YStjKmgsZVsxXT11K2MqcCksITB9fX19fSh1LHgsdCxlLG4scik/YSYmKG0ubGluZVN0YXJ0KCksbS5wb2ludChvLHMpLF89ITEpOih5fHwobS5saW5lU3RhcnQoKSxtLnBvaW50KHVbMF0sdVsxXSkpLG0ucG9pbnQoeFswXSx4WzFdKSxhfHxtLmxpbmVFbmQoKSxfPSExKX1nPW8sZD1zLHk9YX1yZXR1cm4gRX19dmFyIERkPXFnKCk7cWcoKTtmdW5jdGlvbiBGZCh0KXtyZXR1cm4gdH1xZygpLHFnKCk7dmFyIGtkPTEvMCxHZD1rZCxxZD0ta2QsQmQ9cWQsemQ9e3BvaW50OmZ1bmN0aW9uKHQsZSl7dDxrZCYmKGtkPXQpO3Q+cWQmJihxZD10KTtlPEdkJiYoR2Q9ZSk7ZT5CZCYmKEJkPWUpfSxsaW5lU3RhcnQ6aWQsbGluZUVuZDppZCxwb2x5Z29uU3RhcnQ6aWQscG9seWdvbkVuZDppZCxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1bW2tkLEdkXSxbcWQsQmRdXTtyZXR1cm4gcWQ9QmQ9LShHZD1rZD0xLzApLHR9fTtxZygpO2Z1bmN0aW9uIGpkKHQsZSxuLHIpe3JldHVybiBmdW5jdGlvbihpLG8pe3ZhciBzLGEsdSxsPWUobyksYz1pLmludmVydChyWzBdLHJbMV0pLGg9d2QoKSxwPWUoaCksZj0hMSxnPXtwb2ludDpkLGxpbmVTdGFydDp2LGxpbmVFbmQ6Xyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtnLnBvaW50PW0sZy5saW5lU3RhcnQ9eCxnLmxpbmVFbmQ9RSxhPVtdLHM9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtnLnBvaW50PWQsZy5saW5lU3RhcnQ9dixnLmxpbmVFbmQ9XyxhPU9kKGEpO3ZhciB0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZVswXSxyPWVbMV0saT1bdGQobiksLSRnKG4pLDBdLG89MCxzPTA7RGQucmVzZXQoKTtmb3IodmFyIGE9MCx1PXQubGVuZ3RoO2E8dTsrK2EpaWYoYz0obD10W2FdKS5sZW5ndGgpZm9yKHZhciBsLGMsaD1sW2MtMV0scD1oWzBdLGY9aFsxXS8yK1lnLGc9dGQoZiksZD0kZyhmKSx5PTA7eTxjOysreSxwPV8sZz14LGQ9RSxoPXYpe3ZhciB2PWxbeV0sXz12WzBdLG09dlsxXS8yK1lnLHg9dGQobSksRT0kZyhtKSxiPV8tcCx3PWI+PTA/MTotMSxJPXcqYixOPUk+VmcsUz1nKng7aWYoRGQuYWRkKFFnKFMqdyp0ZChJKSxkKkUrUyokZyhJKSkpLG8rPU4/Yit3KkhnOmIsTl5wPj1uXl8+PW4pe3ZhciBDPWZkKGhkKGgpLGhkKHYpKTt5ZChDKTt2YXIgUD1mZChpLEMpO3lkKFApO3ZhciBNPShOXmI+PTA/LTE6MSkqcmQoUFsyXSk7KHI+TXx8cj09PU0mJihDWzBdfHxDWzFdKSkmJihzKz1OXmI+PTA/MTotMSl9fXJldHVybihvPC0xZS02fHxvPFVnJiZEZDwtMWUtNileMSZzfShzLGMpO2EubGVuZ3RoPyhmfHwoby5wb2x5Z29uU3RhcnQoKSxmPSEwKSxTZChhLFZkLHQsbixvKSk6dCYmKGZ8fChvLnBvbHlnb25TdGFydCgpLGY9ITApLG8ubGluZVN0YXJ0KCksbihudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSksZiYmKG8ucG9seWdvbkVuZCgpLGY9ITEpLGE9cz1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtvLnBvbHlnb25TdGFydCgpLG8ubGluZVN0YXJ0KCksbihudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSxvLnBvbHlnb25FbmQoKX19O2Z1bmN0aW9uIGQoZSxuKXt2YXIgcj1pKGUsbik7dChlPXJbMF0sbj1yWzFdKSYmby5wb2ludChlLG4pfWZ1bmN0aW9uIHkodCxlKXt2YXIgbj1pKHQsZSk7bC5wb2ludChuWzBdLG5bMV0pfWZ1bmN0aW9uIHYoKXtnLnBvaW50PXksbC5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKCl7Zy5wb2ludD1kLGwubGluZUVuZCgpfWZ1bmN0aW9uIG0odCxlKXt1LnB1c2goW3QsZV0pO3ZhciBuPWkodCxlKTtwLnBvaW50KG5bMF0sblsxXSl9ZnVuY3Rpb24geCgpe3AubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiBFKCl7bSh1WzBdWzBdLHVbMF1bMV0pLHAubGluZUVuZCgpO3ZhciB0LGUsbixyLGk9cC5jbGVhbigpLGw9aC5yZXN1bHQoKSxjPWwubGVuZ3RoO2lmKHUucG9wKCkscy5wdXNoKHUpLHU9bnVsbCxjKWlmKDEmaSl7aWYoKGU9KG49bFswXSkubGVuZ3RoLTEpPjApe2ZvcihmfHwoby5wb2x5Z29uU3RhcnQoKSxmPSEwKSxvLmxpbmVTdGFydCgpLHQ9MDt0PGU7Kyt0KW8ucG9pbnQoKHI9blt0XSlbMF0sclsxXSk7by5saW5lRW5kKCl9fWVsc2UgYz4xJiYyJmkmJmwucHVzaChsLnBvcCgpLmNvbmNhdChsLnNoaWZ0KCkpKSxhLnB1c2gobC5maWx0ZXIoVWQpKX1yZXR1cm4gZ319ZnVuY3Rpb24gVWQodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gVmQodCxlKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tWGctVWc6WGctdFsxXSktKChlPWUueClbMF08MD9lWzFdLVhnLVVnOlhnLWVbMV0pfXZhciBYZD1qZCgoZnVuY3Rpb24oKXtyZXR1cm4hMH0pLChmdW5jdGlvbih0KXt2YXIgZSxuPU5hTixyPU5hTixpPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxlPTF9LHBvaW50OmZ1bmN0aW9uKG8scyl7dmFyIGE9bz4wP1ZnOi1WZyx1PVpnKG8tbik7WmcodS1WZyk8VWc/KHQucG9pbnQobixyPShyK3MpLzI+MD9YZzotWGcpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQoYSxyKSx0LnBvaW50KG8sciksZT0wKTppIT09YSYmdT49VmcmJihaZyhuLWkpPFVnJiYobi09aSpVZyksWmcoby1hKTxVZyYmKG8tPWEqVWcpLHI9ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzPXRkKHQtbik7cmV0dXJuIFpnKHMpPlVnP0tnKCh0ZChlKSoobz0kZyhyKSkqdGQobiktdGQocikqKGk9JGcoZSkpKnRkKHQpKS8oaSpvKnMpKTooZStyKS8yfShuLHIsbyxzKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KGEsciksZT0wKSx0LnBvaW50KG49byxyPXMpLGk9YX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLG49cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItZX19fSksKGZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpO2lmKG51bGw9PXQpaT1uKlhnLHIucG9pbnQoLVZnLGkpLHIucG9pbnQoMCxpKSxyLnBvaW50KFZnLGkpLHIucG9pbnQoVmcsMCksci5wb2ludChWZywtaSksci5wb2ludCgwLC1pKSxyLnBvaW50KC1WZywtaSksci5wb2ludCgtVmcsMCksci5wb2ludCgtVmcsaSk7ZWxzZSBpZihaZyh0WzBdLWVbMF0pPlVnKXt2YXIgbz10WzBdPGVbMF0/Vmc6LVZnO2k9bipvLzIsci5wb2ludCgtbyxpKSxyLnBvaW50KDAsaSksci5wb2ludChvLGkpfWVsc2Ugci5wb2ludChlWzBdLGVbMV0pfSksWy1WZywtWGddKTtmdW5jdGlvbiBZZCh0LGUpe3ZhciBuPSRnKHQpLHI9bj4wLGk9Wmcobik+VWc7ZnVuY3Rpb24gbyh0LGUpe3JldHVybiAkZyh0KSokZyhlKT5ufWZ1bmN0aW9uIHModCxlLHIpe3ZhciBpPVsxLDAsMF0sbz1mZChoZCh0KSxoZChlKSkscz1wZChvLG8pLGE9b1swXSx1PXMtYSphO2lmKCF1KXJldHVybiFyJiZ0O3ZhciBsPW4qcy91LGM9LW4qYS91LGg9ZmQoaSxvKSxwPWRkKGksbCk7Z2QocCxkZChvLGMpKTt2YXIgZj1oLGc9cGQocCxmKSxkPXBkKGYsZikseT1nKmctZCoocGQocCxwKS0xKTtpZighKHk8MCkpe3ZhciB2PWVkKHkpLF89ZGQoZiwoLWctdikvZCk7aWYoZ2QoXyxwKSxfPWNkKF8pLCFyKXJldHVybiBfO3ZhciBtLHg9dFswXSxFPWVbMF0sYj10WzFdLHc9ZVsxXTtFPHgmJihtPXgseD1FLEU9bSk7dmFyIEk9RS14LE49WmcoSS1WZyk8VWc7aWYoIU4mJnc8YiYmKG09YixiPXcsdz1tKSxOfHxJPFVnP04/Yit3PjBeX1sxXTwoWmcoX1swXS14KTxVZz9iOncpOmI8PV9bMV0mJl9bMV08PXc6ST5WZ14oeDw9X1swXSYmX1swXTw9RSkpe3ZhciBTPWRkKGYsKC1nK3YpL2QpO3JldHVybiBnZChTLHApLFtfLGNkKFMpXX19fWZ1bmN0aW9uIGEoZSxuKXt2YXIgaT1yP3Q6VmctdCxvPTA7cmV0dXJuIGU8LWk/b3w9MTplPmkmJihvfD0yKSxuPC1pP298PTQ6bj5pJiYob3w9OCksb31yZXR1cm4gamQobywoZnVuY3Rpb24odCl7dmFyIGUsbix1LGwsYztyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7bD11PSExLGM9MX0scG9pbnQ6ZnVuY3Rpb24oaCxwKXt2YXIgZixnPVtoLHBdLGQ9byhoLHApLHk9cj9kPzA6YShoLHApOmQ/YShoKyhoPDA/Vmc6LVZnKSxwKTowO2lmKCFlJiYobD11PWQpJiZ0LmxpbmVTdGFydCgpLGQhPT11JiYoIShmPXMoZSxnKSl8fElkKGUsZil8fElkKGcsZikpJiYoZ1swXSs9VWcsZ1sxXSs9VWcsZD1vKGdbMF0sZ1sxXSkpLGQhPT11KWM9MCxkPyh0LmxpbmVTdGFydCgpLGY9cyhnLGUpLHQucG9pbnQoZlswXSxmWzFdKSk6KGY9cyhlLGcpLHQucG9pbnQoZlswXSxmWzFdKSx0LmxpbmVFbmQoKSksZT1mO2Vsc2UgaWYoaSYmZSYmcl5kKXt2YXIgdjt5Jm58fCEodj1zKGcsZSwhMCkpfHwoYz0wLHI/KHQubGluZVN0YXJ0KCksdC5wb2ludCh2WzBdWzBdLHZbMF1bMV0pLHQucG9pbnQodlsxXVswXSx2WzFdWzFdKSx0LmxpbmVFbmQoKSk6KHQucG9pbnQodlsxXVswXSx2WzFdWzFdKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQodlswXVswXSx2WzBdWzFdKSkpfSFkfHxlJiZJZChlLGcpfHx0LnBvaW50KGdbMF0sZ1sxXSksZT1nLHU9ZCxuPXl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt1JiZ0LmxpbmVFbmQoKSxlPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIGN8KGwmJnUpPDwxfX19KSwoZnVuY3Rpb24obixyLGksbyl7IWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtpZihuKXt2YXIgcz0kZyhlKSxhPXRkKGUpLHU9cipuO251bGw9PWk/KGk9ZStyKkhnLG89ZS11LzIpOihpPWJkKHMsaSksbz1iZChzLG8pLChyPjA/aTxvOmk+bykmJihpKz1yKkhnKSk7Zm9yKHZhciBsLGM9aTtyPjA/Yz5vOmM8bztjLT11KWw9Y2QoW3MsLWEqJGcoYyksLWEqdGQoYyldKSx0LnBvaW50KGxbMF0sbFsxXSl9fShvLHQsZSxpLG4scil9KSxyP1swLC10XTpbLVZnLHQtVmddKX1mdW5jdGlvbiBIZCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49bmV3IFdkO2Zvcih2YXIgciBpbiB0KW5bcl09dFtyXTtyZXR1cm4gbi5zdHJlYW09ZSxufX1mdW5jdGlvbiBXZCgpe31mdW5jdGlvbiBKZCh0LGUsbil7dmFyIHI9ZVsxXVswXS1lWzBdWzBdLGk9ZVsxXVsxXS1lWzBdWzFdLG89dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTt0LnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxudWxsIT1vJiZ0LmNsaXBFeHRlbnQobnVsbCksZnVuY3Rpb24odCxlKXt0JiZzZC5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP3NkW3QudHlwZV0odCxlKTpvZCh0LGUpfShuLHQuc3RyZWFtKHpkKSk7dmFyIHM9emQucmVzdWx0KCksYT1NYXRoLm1pbihyLyhzWzFdWzBdLXNbMF1bMF0pLGkvKHNbMV1bMV0tc1swXVsxXSkpLHU9K2VbMF1bMF0rKHItYSooc1sxXVswXStzWzBdWzBdKSkvMixsPStlWzBdWzFdKyhpLWEqKHNbMV1bMV0rc1swXVsxXSkpLzI7cmV0dXJuIG51bGwhPW8mJnQuY2xpcEV4dGVudChvKSx0LnNjYWxlKDE1MCphKS50cmFuc2xhdGUoW3UsbF0pfVdkLnByb3RvdHlwZT17Y29uc3RydWN0b3I6V2QscG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5wb2ludCh0LGUpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIFpkPSRnKDMwKkpnKTtmdW5jdGlvbiBLZCh0LGUpe3JldHVybitlP2Z1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbihyLGksbyxzLGEsdSxsLGMsaCxwLGYsZyxkLHkpe3ZhciB2PWwtcixfPWMtaSxtPXYqditfKl87aWYobT40KmUmJmQtLSl7dmFyIHg9cytwLEU9YStmLGI9dStnLHc9ZWQoeCp4K0UqRStiKmIpLEk9cmQoYi89dyksTj1aZyhaZyhiKS0xKTxVZ3x8Wmcoby1oKTxVZz8obytoKS8yOlFnKEUseCksUz10KE4sSSksQz1TWzBdLFA9U1sxXSxNPUMtcixMPVAtaSxPPV8qTS12Kkw7KE8qTy9tPmV8fFpnKCh2Kk0rXypMKS9tLS41KT4uM3x8cypwK2EqZit1Kmc8WmQpJiYobihyLGksbyxzLGEsdSxDLFAsTix4Lz13LEUvPXcsYixkLHkpLHkucG9pbnQoQyxQKSxuKEMsUCxOLHgsRSxiLGwsYyxoLHAsZixnLGQseSkpfX1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvLHMsYSx1LGwsYyxoLHAsZixnLGQ9e3BvaW50OnksbGluZVN0YXJ0OnYsbGluZUVuZDptLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksZC5saW5lU3RhcnQ9eH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2UucG9seWdvbkVuZCgpLGQubGluZVN0YXJ0PXZ9fTtmdW5jdGlvbiB5KG4scil7bj10KG4sciksZS5wb2ludChuWzBdLG5bMV0pfWZ1bmN0aW9uIHYoKXtjPU5hTixkLnBvaW50PV8sZS5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKHIsaSl7dmFyIG89aGQoW3IsaV0pLHM9dChyLGkpO24oYyxoLGwscCxmLGcsYz1zWzBdLGg9c1sxXSxsPXIscD1vWzBdLGY9b1sxXSxnPW9bMl0sMTYsZSksZS5wb2ludChjLGgpfWZ1bmN0aW9uIG0oKXtkLnBvaW50PXksZS5saW5lRW5kKCl9ZnVuY3Rpb24geCgpe3YoKSxkLnBvaW50PUUsZC5saW5lRW5kPWJ9ZnVuY3Rpb24gRSh0LGUpe18ocj10LGUpLGk9YyxvPWgscz1wLGE9Zix1PWcsZC5wb2ludD1ffWZ1bmN0aW9uIGIoKXtuKGMsaCxsLHAsZixnLGksbyxyLHMsYSx1LDE2LGUpLGQubGluZUVuZD1tLG0oKX1yZXR1cm4gZH19KHQsZSk6ZnVuY3Rpb24odCl7cmV0dXJuIEhkKHtwb2ludDpmdW5jdGlvbihlLG4pe2U9dChlLG4pLHRoaXMuc3RyZWFtLnBvaW50KGVbMF0sZVsxXSl9fSl9KHQpfXZhciBRZD1IZCh7cG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5wb2ludCh0KkpnLGUqSmcpfX0pO2Z1bmN0aW9uICRkKHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGwsYyxoPTE1MCxwPTQ4MCxmPTI1MCxnPTAsZD0wLHk9MCx2PTAsXz0wLG09bnVsbCx4PVhkLEU9bnVsbCxiPUZkLHc9LjUsST1LZChDLHcpO2Z1bmN0aW9uIE4odCl7cmV0dXJuWyh0PW8odFswXSpKZyx0WzFdKkpnKSlbMF0qaCtuLHItdFsxXSpoXX1mdW5jdGlvbiBTKHQpe3JldHVybih0PW8uaW52ZXJ0KCh0WzBdLW4pL2gsKHItdFsxXSkvaCkpJiZbdFswXSpXZyx0WzFdKldnXX1mdW5jdGlvbiBDKHQsaSl7cmV0dXJuWyh0PWUodCxpKSlbMF0qaCtuLHItdFsxXSpoXX1mdW5jdGlvbiBQKCl7bz12ZChpPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4odCU9SGcpP2V8fG4/dmQoeGQodCksRWQoZSxuKSk6eGQodCk6ZXx8bj9FZChlLG4pOl9kfSh5LHYsXyksZSk7dmFyIHQ9ZShnLGQpO3JldHVybiBuPXAtdFswXSpoLHI9Zit0WzFdKmgsTSgpfWZ1bmN0aW9uIE0oKXtyZXR1cm4gbD1jPW51bGwsTn1yZXR1cm4gTi5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGwmJmM9PT10P2w6bD1RZCh4KGksSShiKGM9dCkpKSl9LE4uY2xpcEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PSt0P1lkKG09dCpKZyw2KkpnKToobT1udWxsLFhkKSxNKCkpOm0qV2d9LE4uY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj1udWxsPT10PyhFPXM9YT11PW51bGwsRmQpOkFkKEU9K3RbMF1bMF0scz0rdFswXVsxXSxhPSt0WzFdWzBdLHU9K3RbMV1bMV0pLE0oKSk6bnVsbD09RT9udWxsOltbRSxzXSxbYSx1XV19LE4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3QsUCgpKTpofSxOLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSxmPSt0WzFdLFAoKSk6W3AsZl19LE4uY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPXRbMF0lMzYwKkpnLGQ9dFsxXSUzNjAqSmcsUCgpKTpbZypXZyxkKldnXX0sTi5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9dFswXSUzNjAqSmcsdj10WzFdJTM2MCpKZyxfPXQubGVuZ3RoPjI/dFsyXSUzNjAqSmc6MCxQKCkpOlt5KldnLHYqV2csXypXZ119LE4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhJPUtkKEMsdz10KnQpLE0oKSk6ZWQodyl9LE4uZml0RXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEpkKE4sdCxlKX0sTi5maXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gSmQodCxbWzAsMF0sZV0sbil9KE4sdCxlKX0sZnVuY3Rpb24oKXtyZXR1cm4gZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxOLmludmVydD1lLmludmVydCYmUyxQKCl9fSgoZnVuY3Rpb24oKXtyZXR1cm4gdH0pKSgpfXZhciB0eT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj0kZyhlKSxpPSRnKG4pLG89dChyKmkpO3JldHVybltvKmkqdGQoZSksbyp0ZChuKV19fSgoZnVuY3Rpb24odCl7cmV0dXJuKHQ9bmQodCkpJiZ0L3RkKHQpfSkpO2Z1bmN0aW9uIGV5KCl7cmV0dXJuICRkKHR5KS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9ZnVuY3Rpb24gbnkodCxuLHIsaSl7dmFyIHM9dC5wcm9wZXJ0aWVzfHx7fSxhPSJGZWF0dXJlIj09PXQudHlwZT90Lmdlb21ldHJ5OnQ7aWYoIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT1hLnR5cGUpe3ZhciB1PVtdO3JldHVybiBxKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPW55KHQsbixyLGkpO2UmJnUucHVzaChlKX0pKSxmKHUpfXZhciBsPWZ1bmN0aW9uKHQpe3ZhciBuPXhuKHQpLmdlb21ldHJ5LmNvb3JkaW5hdGVzLHI9Wy1uWzBdLC1uWzFdXTtyZXR1cm4gZXkoKS5yb3RhdGUocikuc2NhbGUoZSl9KGEpLGM9e3R5cGU6YS50eXBlLGNvb3JkaW5hdGVzOml5KGEuY29vcmRpbmF0ZXMsbCl9LGg9KG5ldyBJaCkucmVhZChjKSxwPW0oeChuLHIpLCJtZXRlcnMiKSxnPV9mLmJ1ZmZlck9wKGgscCxpKTtpZighcnkoKGc9KG5ldyBOaCkud3JpdGUoZykpLmNvb3JkaW5hdGVzKSlyZXR1cm4gbyh7dHlwZTpnLnR5cGUsY29vcmRpbmF0ZXM6b3koZy5jb29yZGluYXRlcyxsKX0scyl9ZnVuY3Rpb24gcnkodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodFswXSk/cnkodFswXSk6aXNOYU4odFswXSl9ZnVuY3Rpb24gaXkodCxlKXtyZXR1cm4ib2JqZWN0IiE9dHlwZW9mIHRbMF0/ZSh0KTp0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGl5KHQsZSl9KSl9ZnVuY3Rpb24gb3kodCxlKXtyZXR1cm4ib2JqZWN0IiE9dHlwZW9mIHRbMF0/ZS5pbnZlcnQodCk6dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBveSh0LGUpfSkpfWZ1bmN0aW9uIHN5KHQsZSxuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9cnQodCksaT1ydChlKSxvPSR1LmludGVyc2VjdGlvbihyLmNvb3JkaW5hdGVzLGkuY29vcmRpbmF0ZXMpO3JldHVybiAwPT09by5sZW5ndGg/bnVsbDoxPT09by5sZW5ndGg/bChvWzBdLG4ucHJvcGVydGllcyk6eShvLG4ucHJvcGVydGllcyl9ZnVuY3Rpb24gYXkodCxlLG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1KU09OLnN0cmluZ2lmeShuLnByb3BlcnRpZXN8fHt9KSxpPXRbMF0sbz10WzFdLHM9dFsyXSxhPXRbM10sdT0obythKS8yLGw9KGkrcykvMixjPTIqZS9tZShbaSx1XSxbcyx1XSxuKSoocy1pKSxoPTIqZS9tZShbbCxvXSxbbCxhXSxuKSooYS1vKSxwPWMvMixnPTIqcCxkPU1hdGguc3FydCgzKS8yKmgseT1zLWksdj1hLW8sXz0zLzQqZyxtPWQseD0oeS1nKS8oZy1wLzIpLEU9TWF0aC5mbG9vcih4KSxiPShFKl8tcC8yLXkpLzItcC8yK18vMix3PU1hdGguZmxvb3IoKHYtZCkvZCksST0odi13KmQpLzIsTj13KmQtdj5kLzI7TiYmKEktPWQvNCk7Zm9yKHZhciBTPVtdLEM9W10sUD0wO1A8NjtQKyspe3ZhciBNPTIqTWF0aC5QSS82KlA7Uy5wdXNoKE1hdGguY29zKE0pKSxDLnB1c2goTWF0aC5zaW4oTSkpfWZvcih2YXIgTD1bXSxPPTA7Tzw9RTtPKyspZm9yKHZhciBSPTA7Ujw9dztSKyspe3ZhciBUPU8lMj09MTtpZigoMCE9PVJ8fCFUKSYmKDAhPT1SfHwhTikpe3ZhciBBPU8qXytpLWIsRD1SKm0rbytJO2lmKFQmJihELT1kLzIpLCEwPT09bi50cmlhbmdsZXMpbHkoW0EsRF0sYy8yLGgvMixKU09OLnBhcnNlKHIpLFMsQykuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5tYXNrP3N5KG4ubWFzayx0KSYmTC5wdXNoKHQpOkwucHVzaCh0KX0pKTtlbHNle3ZhciBGPXV5KFtBLERdLGMvMixoLzIsSlNPTi5wYXJzZShyKSxTLEMpO24ubWFzaz9zeShuLm1hc2ssRikmJkwucHVzaChGKTpMLnB1c2goRil9fX1yZXR1cm4gZihMKX1mdW5jdGlvbiB1eSh0LGUsbixyLGksbyl7Zm9yKHZhciBzPVtdLGE9MDthPDY7YSsrKXt2YXIgdT10WzBdK2UqaVthXSxjPXRbMV0rbipvW2FdO3MucHVzaChbdSxjXSl9cmV0dXJuIHMucHVzaChzWzBdLnNsaWNlKCkpLGwoW3NdLHIpfWZ1bmN0aW9uIGx5KHQsZSxuLHIsaSxvKXtmb3IodmFyIHM9W10sYT0wO2E8NjthKyspe3ZhciB1PVtdO3UucHVzaCh0KSx1LnB1c2goW3RbMF0rZSppW2FdLHRbMV0rbipvW2FdXSksdS5wdXNoKFt0WzBdK2UqaVsoYSsxKSU2XSx0WzFdK24qb1soYSsxKSU2XV0pLHUucHVzaCh0KSxzLnB1c2gobChbdV0scikpfXJldHVybiBzfWZ1bmN0aW9uIGN5KHQpe3JldHVybiB5KHQpfWZ1bmN0aW9uIGh5KHQpe3JldHVybiBsKHQmJnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXN8fFtbWzE4MCw5MF0sWy0xODAsOTBdLFstMTgwLC05MF0sWzE4MCwtOTBdLFsxODAsOTBdXV0pfWZ1bmN0aW9uIHB5KHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLGZ1bmN0aW9uKHQsZSxuLHIpe3ZvaWQgMD09PXImJihyPXt9KTtmb3IodmFyIGk9W10sbz10WzBdLHM9dFsxXSxhPXRbMl0sdT10WzNdLGM9ZS9tZShbbyxzXSxbYSxzXSxyKSooYS1vKSxoPW4vbWUoW28sc10sW28sdV0scikqKHUtcykscD1hLW8sZz11LXMsZD1NYXRoLmZsb29yKHAvYykseT1NYXRoLmZsb29yKGcvaCksdj0oZy15KmgpLzIsXz1vKyhwLWQqYykvMixtPTA7bTxkO20rKyl7Zm9yKHZhciB4PXMrdixFPTA7RTx5O0UrKyl7dmFyIGI9bChbW1tfLHhdLFtfLHgraF0sW18rYyx4K2hdLFtfK2MseF0sW18seF1dXSxyLnByb3BlcnRpZXMpO3IubWFzaz9QcyhyLm1hc2ssYikmJmkucHVzaChiKTppLnB1c2goYikseCs9aH1fKz1jfXJldHVybiBmKGkpfSh0LGUsZSxuKX1mdW5jdGlvbiBmeSh0LGUsbil7dm9pZCAwPT09biYmKG49e30pO2Zvcih2YXIgcj1bXSxpPWUvbWUoW3RbMF0sdFsxXV0sW3RbMl0sdFsxXV0sbikqKHRbMl0tdFswXSksbz1lL21lKFt0WzBdLHRbMV1dLFt0WzBdLHRbM11dLG4pKih0WzNdLXRbMV0pLHM9MCxhPXRbMF07YTw9dFsyXTspe2Zvcih2YXIgdT0wLGM9dFsxXTtjPD10WzNdOyl7dmFyIGg9bnVsbCxwPW51bGw7cyUyPT0wJiZ1JTI9PTA/KGg9bChbW1thLGNdLFthLGMrb10sW2EraSxjXSxbYSxjXV1dLG4ucHJvcGVydGllcykscD1sKFtbW2EsYytvXSxbYStpLGMrb10sW2EraSxjXSxbYSxjK29dXV0sbi5wcm9wZXJ0aWVzKSk6cyUyPT0wJiZ1JTI9PTE/KGg9bChbW1thLGNdLFthK2ksYytvXSxbYStpLGNdLFthLGNdXV0sbi5wcm9wZXJ0aWVzKSxwPWwoW1tbYSxjXSxbYSxjK29dLFthK2ksYytvXSxbYSxjXV1dLG4ucHJvcGVydGllcykpOnUlMj09MCYmcyUyPT0xPyhoPWwoW1tbYSxjXSxbYSxjK29dLFthK2ksYytvXSxbYSxjXV1dLG4ucHJvcGVydGllcykscD1sKFtbW2EsY10sW2EraSxjK29dLFthK2ksY10sW2EsY11dXSxuLnByb3BlcnRpZXMpKTp1JTI9PTEmJnMlMj09MSYmKGg9bChbW1thLGNdLFthLGMrb10sW2EraSxjXSxbYSxjXV1dLG4ucHJvcGVydGllcykscD1sKFtbW2EsYytvXSxbYStpLGMrb10sW2EraSxjXSxbYSxjK29dXV0sbi5wcm9wZXJ0aWVzKSksbi5tYXNrPyhzeShuLm1hc2ssaCkmJnIucHVzaChoKSxzeShuLm1hc2sscCkmJnIucHVzaChwKSk6KHIucHVzaChoKSxyLnB1c2gocCkpLGMrPW8sdSsrfXMrKyxhKz1pfXJldHVybiBmKHIpfXR5LmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj1lZChlKmUrbipuKSxpPXQociksbz10ZChpKSxzPSRnKGkpO3JldHVybltRZyhlKm8scipzKSxyZChyJiZuKm8vcildfX0oKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpLHQuYWxvbmc9ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PW4mJihuPXt9KTtmb3IodmFyIHI9cnQodCkuY29vcmRpbmF0ZXMsaT0wLG89MDtvPHIubGVuZ3RoJiYhKGU+PWkmJm89PT1yLmxlbmd0aC0xKTtvKyspe2lmKGk+PWUpe3ZhciBzPWUtaTtpZihzKXt2YXIgdT1tbihyW29dLHJbby0xXSktMTgwO3JldHVybiB2bihyW29dLHMsdSxuKX1yZXR1cm4gYShyW29dKX1pKz1tZShyW29dLHJbbysxXSxuKX1yZXR1cm4gYShyW3IubGVuZ3RoLTFdKX0sdC5hbmdsZT1mdW5jdGlvbih0LGUsbixyKXtpZih2b2lkIDA9PT1yJiYocj17fSksIVAocikpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoInN0YXJ0UG9pbnQgaXMgcmVxdWlyZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIm1pZFBvaW50IGlzIHJlcXVpcmVkIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJlbmRQb2ludCBpcyByZXF1aXJlZCIpO3ZhciBpPXQsbz1lLHM9bixhPWIoITAhPT1yLm1lcmNhdG9yP21uKGksbyk6QmkoaSxvKSksdT1iKCEwIT09ci5tZXJjYXRvcj9tbihzLG8pOkJpKHMsbykpLGw9TWF0aC5hYnMoYS11KTtyZXR1cm4hMD09PXIuZXhwbGVtZW50YXJ5PzM2MC1sOmx9LHQuYXBwbHlGaWx0ZXI9dXUsdC5hcmVhPWpyLHQuYXJlYUZhY3RvcnM9aSx0LmJib3g9Wix0LmJib3hDbGlwPWZ1bmN0aW9uKHQsZSl7dmFyIG49cnQodCkscj1uLnR5cGUsaT0iRmVhdHVyZSI9PT10LnR5cGU/dC5wcm9wZXJ0aWVzOnt9LG89bi5jb29yZGluYXRlcztzd2l0Y2gocil7Y2FzZSJMaW5lU3RyaW5nIjpjYXNlIk11bHRpTGluZVN0cmluZyI6dmFyIHM9W107cmV0dXJuIkxpbmVTdHJpbmciPT09ciYmKG89W29dKSxvLmZvckVhY2goKGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvLHMsYSx1PXQubGVuZ3RoLGw9UmkodFswXSxlKSxjPVtdO2ZvcihufHwobj1bXSkscj0xO3I8dTtyKyspe2ZvcihzPXRbci0xXSxpPW89UmkoYT10W3JdLGUpOzspe2lmKCEobHxpKSl7Yy5wdXNoKHMpLGkhPT1vPyhjLnB1c2goYSkscjx1LTEmJihuLnB1c2goYyksYz1bXSkpOnI9PT11LTEmJmMucHVzaChhKTticmVha31pZihsJmkpYnJlYWs7bD9sPVJpKHM9T2kocyxhLGwsZSksZSk6aT1SaShhPU9pKHMsYSxpLGUpLGUpfWw9b31jLmxlbmd0aCYmbi5wdXNoKGMpfSh0LGUscyl9KSksMT09PXMubGVuZ3RoP2goc1swXSxpKTpnKHMsaSk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gbChUaShvLGUpLGkpO2Nhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4geShvLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFRpKHQsZSl9KSksaSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImdlb21ldHJ5ICIrcisiIG5vdCBzdXBwb3J0ZWQiKX19LHQuYmJveFBvbHlnb249Z24sdC5iZWFyaW5nPW1uLHQuYmVhcmluZ1RvQW5nbGU9Yix0LmJlYXJpbmdUb0F6aW11dGg9Yix0LmJlemllcj1mbix0LmJlemllclNwbGluZT1mbix0LmJvb2xlYW5DbG9ja3dpc2U9WWksdC5ib29sZWFuQ29udGFpbnM9ZnVuY3Rpb24odCxlKXt2YXIgbj1ydCh0KSxyPXJ0KGUpLGk9bi50eXBlLG89ci50eXBlLHM9bi5jb29yZGluYXRlcyxhPXIuY29vcmRpbmF0ZXM7c3dpdGNoKGkpe2Nhc2UiUG9pbnQiOnN3aXRjaChvKXtjYXNlIlBvaW50IjpyZXR1cm4gdnMocyxhKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZmVhdHVyZTIgIitvKyIgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpfWNhc2UiTXVsdGlQb2ludCI6c3dpdGNoKG8pe2Nhc2UiUG9pbnQiOnJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuLHI9ITE7Zm9yKG49MDtuPHQuY29vcmRpbmF0ZXMubGVuZ3RoO24rKylpZih2cyh0LmNvb3JkaW5hdGVzW25dLGUuY29vcmRpbmF0ZXMpKXtyPSEwO2JyZWFrfXJldHVybiByfShuLHIpO2Nhc2UiTXVsdGlQb2ludCI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj1lLmNvb3JkaW5hdGVzO248ci5sZW5ndGg7bisrKXtmb3IodmFyIGk9cltuXSxvPSExLHM9MCxhPXQuY29vcmRpbmF0ZXM7czxhLmxlbmd0aDtzKyspe2lmKHZzKGksYVtzXSkpe289ITA7YnJlYWt9fWlmKCFvKXJldHVybiExfXJldHVybiEwfShuLHIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlMiAiK28rIiBnZW9tZXRyeSBub3Qgc3VwcG9ydGVkIil9Y2FzZSJMaW5lU3RyaW5nIjpzd2l0Y2gobyl7Y2FzZSJQb2ludCI6cmV0dXJuIFdyKHIsbix7aWdub3JlRW5kVmVydGljZXM6ITB9KTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0hMSxyPTAsaT1lLmNvb3JkaW5hdGVzO3I8aS5sZW5ndGg7cisrKXt2YXIgbz1pW3JdO2lmKFdyKHt0eXBlOiJQb2ludCIsY29vcmRpbmF0ZXM6b30sdCx7aWdub3JlRW5kVmVydGljZXM6ITB9KSYmKG49ITApLCFXcih7dHlwZToiUG9pbnQiLGNvb3JkaW5hdGVzOm99LHQse2lnbm9yZUVuZFZlcnRpY2VzOiExfSkpcmV0dXJuITF9cmV0dXJuIG59KG4scik7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ITEscj0wLGk9ZS5jb29yZGluYXRlcztyPGkubGVuZ3RoO3IrKyl7dmFyIG89aVtyXTtpZihXcihvLHQse2lnbm9yZUVuZFZlcnRpY2VzOiEwfSkmJihuPSEwKSwhV3Iobyx0KSlyZXR1cm4hMX1pZihuKXJldHVybiEwO3JldHVybiExfShuLHIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlMiAiK28rIiBnZW9tZXRyeSBub3Qgc3VwcG9ydGVkIil9Y2FzZSJQb2x5Z29uIjpzd2l0Y2gobyl7Y2FzZSJQb2ludCI6cmV0dXJuIHllKHIsbix7aWdub3JlQm91bmRhcnk6ITB9KTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPSExLHI9MCxpPVoodCksbz1aKGUpO2lmKCF5cyhpLG8pKXJldHVybiExO2Zvcig7cjxlLmNvb3JkaW5hdGVzLmxlbmd0aC0xO3IrKyl7aWYoeWUoe3R5cGU6IlBvaW50Iixjb29yZGluYXRlczpfcyhlLmNvb3JkaW5hdGVzW3JdLGUuY29vcmRpbmF0ZXNbcisxXSl9LHQse2lnbm9yZUJvdW5kYXJ5OiEwfSkpe249ITA7YnJlYWt9fXJldHVybiBufShuLHIpO2Nhc2UiUG9seWdvbiI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoIkZlYXR1cmUiPT09dC50eXBlJiZudWxsPT09dC5nZW9tZXRyeSlyZXR1cm4hMTtpZigiRmVhdHVyZSI9PT1lLnR5cGUmJm51bGw9PT1lLmdlb21ldHJ5KXJldHVybiExO3ZhciBuPVoodCkscj1aKGUpO2lmKCF5cyhuLHIpKXJldHVybiExO2Zvcih2YXIgaT1ydChlKS5jb29yZGluYXRlcyxvPTAscz1pO288cy5sZW5ndGg7bysrKWZvcih2YXIgYT0wLHU9c1tvXTthPHUubGVuZ3RoO2ErKyl7aWYoIXllKHVbYV0sdCkpcmV0dXJuITF9cmV0dXJuITB9KG4scik7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPWUuY29vcmRpbmF0ZXM7bjxyLmxlbmd0aDtuKyspe2lmKCF5ZShyW25dLHQse2lnbm9yZUJvdW5kYXJ5OiEwfSkpcmV0dXJuITF9cmV0dXJuITB9KG4scik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmUyICIrbysiIGdlb21ldHJ5IG5vdCBzdXBwb3J0ZWQiKX1kZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZmVhdHVyZTEgIitpKyIgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpfX0sdC5ib29sZWFuQ3Jvc3Nlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXJ0KHQpLHI9cnQoZSksaT1uLnR5cGUsbz1yLnR5cGU7c3dpdGNoKGkpe2Nhc2UiTXVsdGlQb2ludCI6c3dpdGNoKG8pe2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIG1zKG4scik7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gRXMobixyKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZmVhdHVyZTIgIitvKyIgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpfWNhc2UiTGluZVN0cmluZyI6c3dpdGNoKG8pe2Nhc2UiTXVsdGlQb2ludCI6cmV0dXJuIG1zKHIsbik7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4gZnVuY3Rpb24odCxlKXtpZihPcih0LGUpLmZlYXR1cmVzLmxlbmd0aD4wKWZvcih2YXIgbj0wO248dC5jb29yZGluYXRlcy5sZW5ndGgtMTtuKyspZm9yKHZhciByPTA7cjxlLmNvb3JkaW5hdGVzLmxlbmd0aC0xO3IrKyl7dmFyIGk9ITA7aWYoMCE9PXImJnIhPT1lLmNvb3JkaW5hdGVzLmxlbmd0aC0yfHwoaT0hMSksYnModC5jb29yZGluYXRlc1tuXSx0LmNvb3JkaW5hdGVzW24rMV0sZS5jb29yZGluYXRlc1tyXSxpKSlyZXR1cm4hMH1yZXR1cm4hMX0obixyKTtjYXNlIlBvbHlnb24iOnJldHVybiB4cyhuLHIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlMiAiK28rIiBnZW9tZXRyeSBub3Qgc3VwcG9ydGVkIil9Y2FzZSJQb2x5Z29uIjpzd2l0Y2gobyl7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gRXMocixuKTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiB4cyhyLG4pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlMiAiK28rIiBnZW9tZXRyeSBub3Qgc3VwcG9ydGVkIil9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmUxICIraSsiIGdlb21ldHJ5IG5vdCBzdXBwb3J0ZWQiKX19LHQuYm9vbGVhbkRpc2pvaW50PXBzLHQuYm9vbGVhbkVxdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHJ0KHQpLnR5cGU9PT1ydChlKS50eXBlJiZuZXcgQ3Moe3ByZWNpc2lvbjo2fSkuY29tcGFyZSh0bih0KSx0bihlKSl9LHQuYm9vbGVhbkludGVyc2VjdHM9UHMsdC5ib29sZWFuT3ZlcmxhcD1mdW5jdGlvbih0LGUpe3ZhciBuPXJ0KHQpLHI9cnQoZSksaT1uLnR5cGUsbz1yLnR5cGU7aWYoIk11bHRpUG9pbnQiPT09aSYmIk11bHRpUG9pbnQiIT09b3x8KCJMaW5lU3RyaW5nIj09PWl8fCJNdWx0aUxpbmVTdHJpbmciPT09aSkmJiJMaW5lU3RyaW5nIiE9PW8mJiJNdWx0aUxpbmVTdHJpbmciIT09b3x8KCJQb2x5Z29uIj09PWl8fCJNdWx0aVBvbHlnb24iPT09aSkmJiJQb2x5Z29uIiE9PW8mJiJNdWx0aVBvbHlnb24iIT09byl0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmVzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSIpO2lmKCJQb2ludCI9PT1pKXRocm93IG5ldyBFcnJvcigiUG9pbnQgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpO2lmKG5ldyBDcyh7cHJlY2lzaW9uOjZ9KS5jb21wYXJlKHQsZSkpcmV0dXJuITE7dmFyIHM9MDtzd2l0Y2goaSl7Y2FzZSJNdWx0aVBvaW50Ijpmb3IodmFyIGE9MDthPG4uY29vcmRpbmF0ZXMubGVuZ3RoO2ErKylmb3IodmFyIHU9MDt1PHIuY29vcmRpbmF0ZXMubGVuZ3RoO3UrKyl7dmFyIGw9bi5jb29yZGluYXRlc1thXSxjPXIuY29vcmRpbmF0ZXNbdV07aWYobFswXT09PWNbMF0mJmxbMV09PT1jWzFdKXJldHVybiEwfXJldHVybiExO2Nhc2UiTGluZVN0cmluZyI6Y2FzZSJNdWx0aUxpbmVTdHJpbmciOlUodCwoZnVuY3Rpb24odCl7VShlLChmdW5jdGlvbihlKXtraSh0LGUpLmZlYXR1cmVzLmxlbmd0aCYmcysrfSkpfSkpO2JyZWFrO2Nhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aVBvbHlnb24iOlUodCwoZnVuY3Rpb24odCl7VShlLChmdW5jdGlvbihlKXtPcih0LGUpLmZlYXR1cmVzLmxlbmd0aCYmcysrfSkpfSkpfXJldHVybiBzPjB9LHQuYm9vbGVhblBhcmFsbGVsPWZ1bmN0aW9uKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJsaW5lMSBpcyByZXF1aXJlZCIpO2lmKCFlKXRocm93IG5ldyBFcnJvcigibGluZTIgaXMgcmVxdWlyZWQiKTtpZigiTGluZVN0cmluZyIhPT1Vcyh0LCJsaW5lMSIpKXRocm93IG5ldyBFcnJvcigibGluZTEgbXVzdCBiZSBhIExpbmVTdHJpbmciKTtpZigiTGluZVN0cmluZyIhPT1VcyhlLCJsaW5lMiIpKXRocm93IG5ldyBFcnJvcigibGluZTIgbXVzdCBiZSBhIExpbmVTdHJpbmciKTtmb3IodmFyIG49Wm4odG4odCkpLmZlYXR1cmVzLHI9Wm4odG4oZSkpLmZlYXR1cmVzLGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIG89bltpXS5nZW9tZXRyeS5jb29yZGluYXRlcztpZighcltpXSlicmVhaztpZighanMobyxyW2ldLmdlb21ldHJ5LmNvb3JkaW5hdGVzKSlyZXR1cm4hMX1yZXR1cm4hMH0sdC5ib29sZWFuUG9pbnRJblBvbHlnb249eWUsdC5ib29sZWFuUG9pbnRPbkxpbmU9V3IsdC5ib29sZWFuV2l0aGluPVpyLHQuYnVmZmVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0obj1ufHx7fSkudW5pdHN8fCJraWxvbWV0ZXJzIixpPW4uc3RlcHN8fDg7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7aWYoIm9iamVjdCIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2lmKCJudW1iZXIiIT10eXBlb2YgaSl0aHJvdyBuZXcgRXJyb3IoInN0ZXBzIG11c3QgYmUgYW4gbnVtYmVyIik7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgRXJyb3IoInJhZGl1cyBpcyByZXF1aXJlZCIpO2lmKGk8PTApdGhyb3cgbmV3IEVycm9yKCJzdGVwcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIik7dmFyIG89W107c3dpdGNoKHQudHlwZSl7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOnJldHVybiBxKHQsKGZ1bmN0aW9uKHQpe3ZhciBuPW55KHQsZSxyLGkpO24mJm8ucHVzaChuKX0pKSxmKG8pO2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnJldHVybiBGKHQsKGZ1bmN0aW9uKHQpe3ZhciBuPW55KHQsZSxyLGkpO24mJkYobiwoZnVuY3Rpb24odCl7dCYmby5wdXNoKHQpfSkpfSkpLGYobyl9cmV0dXJuIG55KHQsZSxyLGkpfSx0LmNlbnRlcj14bix0LmNlbnRlck1lYW49RmEsdC5jZW50ZXJNZWRpYW49ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1lJiYoZT17fSksIVAoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj1lLmNvdW50ZXJ8fDEwO2lmKCFDKG4pKXRocm93IG5ldyBFcnJvcigiY291bnRlciBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIHI9ZS53ZWlnaHQsaT1GYSh0LHt3ZWlnaHQ6ZS53ZWlnaHR9KSxvPWYoW10pO0YodCwoZnVuY3Rpb24odCl7dmFyIGU7by5mZWF0dXJlcy5wdXNoKEVuKHQse3Byb3BlcnRpZXM6e3dlaWdodDpudWxsPT09KGU9dC5wcm9wZXJ0aWVzKXx8dm9pZCAwPT09ZT92b2lkIDA6ZVtyXX19KSl9KSk7dmFyIHM9e3RvbGVyYW5jZTplLnRvbGVyYW5jZSxtZWRpYW5DYW5kaWRhdGVzOltdfTtyZXR1cm4ga2EoaS5nZW9tZXRyeS5jb29yZGluYXRlcyxbMCwwXSxvLHMsbil9LHQuY2VudGVyT2ZNYXNzPWZ1bmN0aW9uIHQoZSxuKXtzd2l0Y2godm9pZCAwPT09biYmKG49e30pLGl0KGUpKXtjYXNlIlBvaW50IjpyZXR1cm4gYShLKGUpLG4ucHJvcGVydGllcyk7Y2FzZSJQb2x5Z29uIjp2YXIgcj1bXTtSKGUsKGZ1bmN0aW9uKHQpe3IucHVzaCh0KX0pKTt2YXIgaSxvLHMsdSxsLGMsaCxwLGY9RW4oZSx7cHJvcGVydGllczpuLnByb3BlcnRpZXN9KSxnPWYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMsZD0wLHk9MCx2PTAsXz1yLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuW3RbMF0tZ1swXSx0WzFdLWdbMV1dfSkpO2ZvcihpPTA7aTxyLmxlbmd0aC0xO2krKyl1PShvPV9baV0pWzBdLGM9b1sxXSxsPShzPV9baSsxXSlbMF0sdis9cD11KihoPXNbMV0pLWwqYyxkKz0odStsKSpwLHkrPShjK2gpKnA7aWYoMD09PXYpcmV0dXJuIGY7dmFyIG09MS8oNiooLjUqdikpO3JldHVybiBhKFtnWzBdK20qZCxnWzFdK20qeV0sbi5wcm9wZXJ0aWVzKTtkZWZhdWx0OnZhciB4PWRlKGUpO3JldHVybiB4P3QoeCx7cHJvcGVydGllczpuLnByb3BlcnRpZXN9KTpFbihlLHtwcm9wZXJ0aWVzOm4ucHJvcGVydGllc30pfX0sdC5jZW50cm9pZD1Fbix0LmNpcmNsZT1fbix0LmNsZWFuQ29vcmRzPXRuLHQuY2xvbmU9SWUsdC5jbHVzdGVyRWFjaD1vdSx0LmNsdXN0ZXJSZWR1Y2U9c3UsdC5jbHVzdGVycz1odSx0LmNsdXN0ZXJzRGJzY2FuPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1uJiYobj17fSksITAhPT1uLm11dGF0ZSYmKHQ9SWUodCkpLG4ubWluUG9pbnRzPW4ubWluUG9pbnRzfHwzO3ZhciByPW5ldyBUcy5EQlNDQU4saT1yLnJ1bihHKHQpLE4oZSxuLnVuaXRzKSxuLm1pblBvaW50cyxtZSksbz0tMTtyZXR1cm4gaS5mb3JFYWNoKChmdW5jdGlvbihlKXtvKyssZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj10LmZlYXR1cmVzW2VdO24ucHJvcGVydGllc3x8KG4ucHJvcGVydGllcz17fSksbi5wcm9wZXJ0aWVzLmNsdXN0ZXI9byxuLnByb3BlcnRpZXMuZGJzY2FuPSJjb3JlIn0pKX0pKSxyLm5vaXNlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZmVhdHVyZXNbZV07bi5wcm9wZXJ0aWVzfHwobi5wcm9wZXJ0aWVzPXt9KSxuLnByb3BlcnRpZXMuY2x1c3Rlcj9uLnByb3BlcnRpZXMuZGJzY2FuPSJlZGdlIjpuLnByb3BlcnRpZXMuZGJzY2FuPSJub2lzZSJ9KSksdH0sdC5jbHVzdGVyc0ttZWFucz1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmZlYXR1cmVzLmxlbmd0aDtlLm51bWJlck9mQ2x1c3RlcnM9ZS5udW1iZXJPZkNsdXN0ZXJzfHxNYXRoLnJvdW5kKE1hdGguc3FydChuLzIpKSxlLm51bWJlck9mQ2x1c3RlcnM+biYmKGUubnVtYmVyT2ZDbHVzdGVycz1uKSwhMCE9PWUubXV0YXRlJiYodD1JZSh0KSk7dmFyIHI9Ryh0KSxpPXIuc2xpY2UoMCxlLm51bWJlck9mQ2x1c3RlcnMpLG89enMocixlLm51bWJlck9mQ2x1c3RlcnMsaSkscz17fTtyZXR1cm4gby5jZW50cm9pZHMuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtzW2VdPXR9KSksRih0LChmdW5jdGlvbih0LGUpe3ZhciBuPW8uaWR4c1tlXTt0LnByb3BlcnRpZXMuY2x1c3Rlcj1uLHQucHJvcGVydGllcy5jZW50cm9pZD1zW25dfSkpLHR9LHQuY29sbGVjdD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1OdCg2KSxvPWUuZmVhdHVyZXMubWFwKChmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm57bWluWDp0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLG1pblk6dC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSxtYXhYOnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sbWF4WTp0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLHByb3BlcnR5Om51bGw9PT0oZT10LnByb3BlcnRpZXMpfHx2b2lkIDA9PT1lP3ZvaWQgMDplW25dfX0pKTtyZXR1cm4gaS5sb2FkKG8pLHQuZmVhdHVyZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5wcm9wZXJ0aWVzfHwodC5wcm9wZXJ0aWVzPXt9KTt2YXIgZT1aKHQpLG49aS5zZWFyY2goe21pblg6ZVswXSxtaW5ZOmVbMV0sbWF4WDplWzJdLG1heFk6ZVszXX0pLG89W107bi5mb3JFYWNoKChmdW5jdGlvbihlKXt5ZShbZS5taW5YLGUubWluWV0sdCkmJm8ucHVzaChlLnByb3BlcnR5KX0pKSx0LnByb3BlcnRpZXNbcl09b30pKSx0fSx0LmNvbGxlY3Rpb25PZj1udCx0LmNvbWJpbmU9ZnVuY3Rpb24odCl7dmFyIGU9e011bHRpUG9pbnQ6e2Nvb3JkaW5hdGVzOltdLHByb3BlcnRpZXM6W119LE11bHRpTGluZVN0cmluZzp7Y29vcmRpbmF0ZXM6W10scHJvcGVydGllczpbXX0sTXVsdGlQb2x5Z29uOntjb29yZGluYXRlczpbXSxwcm9wZXJ0aWVzOltdfX07cmV0dXJuIEYodCwoZnVuY3Rpb24odCl7dmFyIG4scixpLG87c3dpdGNoKG51bGw9PT0obz10Lmdlb21ldHJ5KXx8dm9pZCAwPT09bz92b2lkIDA6by50eXBlKXtjYXNlIlBvaW50IjplLk11bHRpUG9pbnQuY29vcmRpbmF0ZXMucHVzaCh0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSxlLk11bHRpUG9pbnQucHJvcGVydGllcy5wdXNoKHQucHJvcGVydGllcyk7YnJlYWs7Y2FzZSJNdWx0aVBvaW50Ijoobj1lLk11bHRpUG9pbnQuY29vcmRpbmF0ZXMpLnB1c2guYXBwbHkobix0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSxlLk11bHRpUG9pbnQucHJvcGVydGllcy5wdXNoKHQucHJvcGVydGllcyk7YnJlYWs7Y2FzZSJMaW5lU3RyaW5nIjplLk11bHRpTGluZVN0cmluZy5jb29yZGluYXRlcy5wdXNoKHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpLGUuTXVsdGlMaW5lU3RyaW5nLnByb3BlcnRpZXMucHVzaCh0LnByb3BlcnRpZXMpO2JyZWFrO2Nhc2UiTXVsdGlMaW5lU3RyaW5nIjoocj1lLk11bHRpTGluZVN0cmluZy5jb29yZGluYXRlcykucHVzaC5hcHBseShyLHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpLGUuTXVsdGlMaW5lU3RyaW5nLnByb3BlcnRpZXMucHVzaCh0LnByb3BlcnRpZXMpO2JyZWFrO2Nhc2UiUG9seWdvbiI6ZS5NdWx0aVBvbHlnb24uY29vcmRpbmF0ZXMucHVzaCh0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSxlLk11bHRpUG9seWdvbi5wcm9wZXJ0aWVzLnB1c2godC5wcm9wZXJ0aWVzKTticmVhaztjYXNlIk11bHRpUG9seWdvbiI6KGk9ZS5NdWx0aVBvbHlnb24uY29vcmRpbmF0ZXMpLnB1c2guYXBwbHkoaSx0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSxlLk11bHRpUG9seWdvbi5wcm9wZXJ0aWVzLnB1c2godC5wcm9wZXJ0aWVzKX19KSksZihPYmplY3Qua2V5cyhlKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdLmNvb3JkaW5hdGVzLmxlbmd0aH0pKS5zb3J0KCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gbyh7dHlwZTp0LGNvb3JkaW5hdGVzOmVbdF0uY29vcmRpbmF0ZXN9LHtjb2xsZWN0ZWRQcm9wZXJ0aWVzOmVbdF0ucHJvcGVydGllc30pfSkpKX0sdC5jb25jYXZlPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUubWF4RWRnZXx8MS8wLHI9eGUoZnVuY3Rpb24odCl7dmFyIGU9W10sbj17fTtyZXR1cm4gRih0LChmdW5jdGlvbih0KXtpZih0Lmdlb21ldHJ5KXt2YXIgcj10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzLmpvaW4oIi0iKTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKXx8KGUucHVzaCh0KSxuW3JdPSEwKX19KSksZihlKX0odCkpO2lmKHIuZmVhdHVyZXM9ci5mZWF0dXJlcy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciByPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1bMF0saT10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdWzFdLG89dC5nZW9tZXRyeS5jb29yZGluYXRlc1swXVsyXSxzPW1lKHIsaSxlKSxhPW1lKGksbyxlKSx1PW1lKHIsbyxlKTtyZXR1cm4gczw9biYmYTw9biYmdTw9bn0pKSxyLmZlYXR1cmVzLmxlbmd0aDwxKXJldHVybiBudWxsO3ZhciBpPSRlKHIpO3JldHVybiAxPT09aS5jb29yZGluYXRlcy5sZW5ndGgmJihpLmNvb3JkaW5hdGVzPWkuY29vcmRpbmF0ZXNbMF0saS50eXBlPSJQb2x5Z29uIiksbyhpKX0sdC5jb250YWluc051bWJlcj0kLHQuY29udmVydEFyZWE9Uyx0LmNvbnZlcnREaXN0YW5jZT1OLHQuY29udmVydExlbmd0aD1OLHQuY29udmV4PWRlLHQuY29vcmRBbGw9Ryx0LmNvb3JkRWFjaD1SLHQuY29vcmRSZWR1Y2U9VCx0LmNyZWF0ZUJpbnM9YXUsdC5kZWdyZWVzMnJhZGlhbnM9SSx0LmRlZ3JlZXNUb1JhZGlhbnM9SSx0LmRlc3RpbmF0aW9uPXZuLHQuZGlmZmVyZW5jZT1mdW5jdGlvbih0LGUpe3ZhciBuPXJ0KHQpLHI9cnQoZSksaT10LnByb3BlcnRpZXN8fHt9LG89JHUuZGlmZmVyZW5jZShuLmNvb3JkaW5hdGVzLHIuY29vcmRpbmF0ZXMpO3JldHVybiAwPT09by5sZW5ndGg/bnVsbDoxPT09by5sZW5ndGg/bChvWzBdLGkpOnkobyxpKX0sdC5kaXNzb2x2ZT1mdW5jdGlvbih0LGUpe2lmKCFQKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5wcm9wZXJ0eU5hbWU7bnQodCwiUG9seWdvbiIsImRpc3NvbHZlIik7dmFyIHI9W107aWYoIWUucHJvcGVydHlOYW1lKXJldHVybiBuaSh5KCR1LnVuaW9uLmFwcGx5KG51bGwsdC5mZWF0dXJlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzfSkpKSkpO3ZhciBpPXt9O0YodCwoZnVuY3Rpb24odCl7T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksdC5wcm9wZXJ0aWVzW25dKXx8KGlbdC5wcm9wZXJ0aWVzW25dXT1bXSksaVt0LnByb3BlcnRpZXNbbl1dLnB1c2godCl9KSk7Zm9yKHZhciBvPU9iamVjdC5rZXlzKGkpLHM9MDtzPG8ubGVuZ3RoO3MrKyl7dmFyIGE9eSgkdS51bmlvbi5hcHBseShudWxsLGlbb1tzXV0ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZW9tZXRyeS5jb29yZGluYXRlc30pKSkpO2EucHJvcGVydGllc1tuXT1vW3NdLHIucHVzaChhKX1yZXR1cm4gbmkoZihyKSl9LHQuZGlzdGFuY2U9bWUsdC5kaXN0YW5jZVRvRGVncmVlcz1FLHQuZGlzdGFuY2VUb1JhZGlhbnM9eCx0LmRpc3RhbmNlV2VpZ2h0PWphLHQuZWFydGhSYWRpdXM9ZSx0LmVsbGlwc2U9QWEsdC5lbnZlbG9wZT1kbix0LmV4cGxvZGU9Ym4sdC5mYWN0b3JzPW4sdC5mZWF0dXJlPW8sdC5mZWF0dXJlQ29sbGVjdGlvbj1mLHQuZmVhdHVyZUVhY2g9Rix0LmZlYXR1cmVPZj1ldCx0LmZlYXR1cmVSZWR1Y2U9ayx0LmZpbHRlclByb3BlcnRpZXM9Y3UsdC5maW5kUG9pbnQ9Vyx0LmZpbmRTZWdtZW50PUgsdC5mbGF0dGVuPW5pLHQuZmxhdHRlbkVhY2g9eix0LmZsYXR0ZW5SZWR1Y2U9aix0LmZsaXA9ZnVuY3Rpb24odCxlKXtpZighUChlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuPWUubXV0YXRlO2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO3JldHVybiExIT09biYmdm9pZCAwIT09bnx8KHQ9SWUodCkpLFIodCwoZnVuY3Rpb24odCl7dmFyIGU9dFswXSxuPXRbMV07dFswXT1uLHRbMV09ZX0pKSx0fSx0Lmdlb2pzb25UeXBlPXR0LHQuZ2VvbUVhY2g9cSx0Lmdlb21SZWR1Y2U9Qix0Lmdlb21ldHJ5PXMsdC5nZW9tZXRyeUNvbGxlY3Rpb249dix0LmdldENsdXN0ZXI9aXUsdC5nZXRDb29yZD1LLHQuZ2V0Q29vcmRzPVEsdC5nZXRHZW9tPXJ0LHQuZ2V0VHlwZT1pdCx0LmdyZWF0Q2lyY2xlPWZ1bmN0aW9uKHQsZSxuKXtpZigib2JqZWN0IiE9dHlwZW9mKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHI9bi5wcm9wZXJ0aWVzLGk9bi5ucG9pbnRzLG89bi5vZmZzZXQ7cmV0dXJuIHQ9Syh0KSxlPUsoZSkscj1yfHx7fSxpPWl8fDEwMCxvPW98fDEwLG5ldyB2aSh7eDp0WzBdLHk6dFsxXX0se3g6ZVswXSx5OmVbMV19LHIpLkFyYyhpLHtvZmZzZXQ6b30pLmpzb24oKX0sdC5oZWxwZXJzPU8sdC5oZXhHcmlkPWF5LHQuaW5zaWRlPXllLHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCxlLG4pe2lmKCJvYmplY3QiIT10eXBlb2Yobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLmdyaWRUeXBlLGk9bi5wcm9wZXJ0eSxvPW4ud2VpZ2h0O2lmKCF0KXRocm93IG5ldyBFcnJvcigicG9pbnRzIGlzIHJlcXVpcmVkIik7aWYobnQodCwiUG9pbnQiLCJpbnB1dCBtdXN0IGNvbnRhaW4gUG9pbnRzIiksIWUpdGhyb3cgbmV3IEVycm9yKCJjZWxsU2l6ZSBpcyByZXF1aXJlZCIpO2lmKHZvaWQgMCE9PW8mJiJudW1iZXIiIT10eXBlb2Ygbyl0aHJvdyBuZXcgRXJyb3IoIndlaWdodCBtdXN0IGJlIGEgbnVtYmVyIik7aT1pfHwiZWxldmF0aW9uIixyPXJ8fCJzcXVhcmUiLG89b3x8MTt2YXIgcyxhPVoodCk7c3dpdGNoKHIpe2Nhc2UicG9pbnQiOmNhc2UicG9pbnRzIjpzPXRpKGEsZSxuKTticmVhaztjYXNlInNxdWFyZSI6Y2FzZSJzcXVhcmVzIjpzPXB5KGEsZSxuKTticmVhaztjYXNlImhleCI6Y2FzZSJoZXhlcyI6cz1heShhLGUsbik7YnJlYWs7Y2FzZSJ0cmlhbmdsZSI6Y2FzZSJ0cmlhbmdsZXMiOnM9ZnkoYSxlLG4pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGdyaWRUeXBlIil9dmFyIHU9W107cmV0dXJuIEYocywoZnVuY3Rpb24oZSl7dmFyIHM9MCxhPTA7Rih0LChmdW5jdGlvbih0KXt2YXIgdSxsPW1lKCJwb2ludCI9PT1yP2U6RW4oZSksdCxuKTtpZih2b2lkIDAhPT1pJiYodT10LnByb3BlcnRpZXNbaV0pLHZvaWQgMD09PXUmJih1PXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMl0pLHZvaWQgMD09PXUpdGhyb3cgbmV3IEVycm9yKCJ6VmFsdWUgaXMgbWlzc2luZyIpOzA9PT1sJiYocz11KTt2YXIgYz0xL01hdGgucG93KGwsbyk7YSs9YyxzKz1jKnV9KSk7dmFyIGw9SWUoZSk7bC5wcm9wZXJ0aWVzW2ldPXMvYSx1LnB1c2gobCl9KSksZih1KX0sdC5pbnRlcnNlY3Q9c3ksdC5pbnZhcmlhbnQ9b3QsdC5pc051bWJlcj1DLHQuaXNPYmplY3Q9UCx0Lmlzb2JhbmRzPWZ1bmN0aW9uKHQsZSxuKXtpZighUChuPW58fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciByPW4uelByb3BlcnR5fHwiZWxldmF0aW9uIixpPW4uY29tbW9uUHJvcGVydGllc3x8e30sbz1uLmJyZWFrc1Byb3BlcnRpZXN8fFtdO2lmKG50KHQsIlBvaW50IiwiSW5wdXQgbXVzdCBjb250YWluIFBvaW50cyIpLCFlKXRocm93IG5ldyBFcnJvcigiYnJlYWtzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IEVycm9yKCJicmVha3MgaXMgbm90IGFuIEFycmF5Iik7aWYoIVAoaSkpdGhyb3cgbmV3IEVycm9yKCJjb21tb25Qcm9wZXJ0aWVzIGlzIG5vdCBhbiBPYmplY3QiKTtpZighQXJyYXkuaXNBcnJheShvKSl0aHJvdyBuZXcgRXJyb3IoImJyZWFrc1Byb3BlcnRpZXMgaXMgbm90IGFuIEFycmF5Iik7dmFyIHM9WmkodCx7elByb3BlcnR5OnIsZmxpcDohMH0pLGE9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1bXSxpPTE7aTxlLmxlbmd0aDtpKyspe3ZhciBvPStlW2ktMV0scz0rZVtpXSxhPVpvKEpvKCRpKHQsbyxzLW8pKSksdT17fTt1Lmdyb3VwZWRSaW5ncz1hLHVbbl09bysiLSIrcyxyLnB1c2godSl9cmV0dXJuIHJ9KHMsZSxyKTtyZXR1cm4gZigoYT1mdW5jdGlvbih0LGUsbil7dmFyIHI9WihuKSxpPXJbMl0tclswXSxvPXJbM10tclsxXSxzPXJbMF0sYT1yWzFdLHU9ZVswXS5sZW5ndGgtMSxsPWUubGVuZ3RoLTEsYz1pL3UsaD1vL2wscD1mdW5jdGlvbih0KXt0WzBdPXRbMF0qYytzLHRbMV09dFsxXSpoK2F9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZ3JvdXBlZFJpbmdzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5mb3JFYWNoKHApfSkpfSkpfSkpLHR9KGEscyx0KSkubWFwKChmdW5jdGlvbih0LGUpe2lmKG9bZV0mJiFQKG9bZV0pKXRocm93IG5ldyBFcnJvcigiRWFjaCBtYXBwZWRQcm9wZXJ0eSBpcyByZXF1aXJlZCB0byBiZSBhbiBPYmplY3QiKTt2YXIgbj1jdCh7fSxpLG9bZV0pO3JldHVybiBuW3JdPXRbcl0seSh0Lmdyb3VwZWRSaW5ncyxuKX0pKSl9LHQuaXNvbGluZXM9ZnVuY3Rpb24odCxlLG4pe2lmKCFQKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHI9bi56UHJvcGVydHl8fCJlbGV2YXRpb24iLGk9bi5jb21tb25Qcm9wZXJ0aWVzfHx7fSxvPW4uYnJlYWtzUHJvcGVydGllc3x8W107aWYobnQodCwiUG9pbnQiLCJJbnB1dCBtdXN0IGNvbnRhaW4gUG9pbnRzIiksIWUpdGhyb3cgbmV3IEVycm9yKCJicmVha3MgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgRXJyb3IoImJyZWFrcyBtdXN0IGJlIGFuIEFycmF5Iik7aWYoIVAoaSkpdGhyb3cgbmV3IEVycm9yKCJjb21tb25Qcm9wZXJ0aWVzIG11c3QgYmUgYW4gT2JqZWN0Iik7aWYoIUFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IEVycm9yKCJicmVha3NQcm9wZXJ0aWVzIG11c3QgYmUgYW4gQXJyYXkiKTt2YXIgcz1fdCh0LHt6UHJvcGVydHk6cixmbGlwOiEwfSk7cmV0dXJuIGYoZnVuY3Rpb24odCxlLG4pe3ZhciByPVoobiksaT1yWzJdLXJbMF0sbz1yWzNdLXJbMV0scz1yWzBdLGE9clsxXSx1PWVbMF0ubGVuZ3RoLTEsbD1lLmxlbmd0aC0xLGM9aS91LGg9by9sLHA9ZnVuY3Rpb24odCl7dFswXT10WzBdKmMrcyx0WzFdPXRbMV0qaCthfTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtSKHQscCl9KSksdH0oZnVuY3Rpb24odCxlLG4scixpKXtmb3IodmFyIG89W10scz0xO3M8ZS5sZW5ndGg7cysrKXt2YXIgYT0rZVtzXSx1PWN0KHt9LHIsaVtzXSk7dVtuXT1hO3ZhciBsPWcoZnQodCxhKSx1KTtvLnB1c2gobCl9cmV0dXJuIG99KHMsZSxyLGksbykscyx0KSl9LHQua2lua3M9ZnVuY3Rpb24odCl7dmFyIGUsbixyPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6W119O2lmKCJMaW5lU3RyaW5nIj09PShuPSJGZWF0dXJlIj09PXQudHlwZT90Lmdlb21ldHJ5OnQpLnR5cGUpZT1bbi5jb29yZGluYXRlc107ZWxzZSBpZigiTXVsdGlMaW5lU3RyaW5nIj09PW4udHlwZSllPW4uY29vcmRpbmF0ZXM7ZWxzZSBpZigiTXVsdGlQb2x5Z29uIj09PW4udHlwZSllPVtdLmNvbmNhdC5hcHBseShbXSxuLmNvb3JkaW5hdGVzKTtlbHNle2lmKCJQb2x5Z29uIiE9PW4udHlwZSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IG11c3QgYmUgYSBMaW5lU3RyaW5nLCBNdWx0aUxpbmVTdHJpbmcsIFBvbHlnb24sIG9yIE11bHRpUG9seWdvbiBGZWF0dXJlIG9yIEdlb21ldHJ5Iik7ZT1uLmNvb3JkaW5hdGVzfXJldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aC0xO24rKylmb3IodmFyIGk9bjtpPGUubGVuZ3RoLTE7aSsrKXtpZih0PT09ZSl7aWYoMT09PU1hdGguYWJzKG4taSkpY29udGludWU7aWYoMD09PW4mJmk9PT10Lmxlbmd0aC0yJiZ0W25dWzBdPT09dFt0Lmxlbmd0aC0xXVswXSYmdFtuXVsxXT09PXRbdC5sZW5ndGgtMV1bMV0pY29udGludWV9dmFyIG89R3IodFtuXVswXSx0W25dWzFdLHRbbisxXVswXSx0W24rMV1bMV0sZVtpXVswXSxlW2ldWzFdLGVbaSsxXVswXSxlW2krMV1bMV0pO28mJnIuZmVhdHVyZXMucHVzaChhKFtvWzBdLG9bMV1dKSl9fSkpfSkpLHJ9LHQubGVuZ3RoPVlyLHQubGVuZ3RoVG9EZWdyZWVzPUUsdC5sZW5ndGhUb1JhZGlhbnM9eCx0LmxpbmVBcmM9YmksdC5saW5lQ2h1bms9ZnVuY3Rpb24odCxlLG4pe2lmKCFQKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHI9bi51bml0cyxpPW4ucmV2ZXJzZTtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtpZihlPD0wKXRocm93IG5ldyBFcnJvcigic2VnbWVudExlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIik7dmFyIG89W107cmV0dXJuIHoodCwoZnVuY3Rpb24odCl7aSYmKHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXM9dC5nZW9tZXRyeS5jb29yZGluYXRlcy5yZXZlcnNlKCkpLGZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPVlyKHQse3VuaXRzOm59KTtpZihpPD1lKXJldHVybiByKHQpO3ZhciBvPWkvZTtOdW1iZXIuaXNJbnRlZ2VyKG8pfHwobz1NYXRoLmZsb29yKG8pKzEpO2Zvcih2YXIgcz0wO3M8bztzKyspe3IoSHIodCxlKnMsZSoocysxKSx7dW5pdHM6bn0pLHMpfX0odCxlLHIsKGZ1bmN0aW9uKHQpe28ucHVzaCh0KX0pKX0pKSxmKG8pfSx0LmxpbmVEaXN0YW5jZT1Zcix0LmxpbmVFYWNoPVgsdC5saW5lSW50ZXJzZWN0PU9yLHQubGluZU9mZnNldD1mdW5jdGlvbih0LGUsbil7aWYoIVAobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLnVuaXRzO2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO2lmKG51bGw9PWV8fGlzTmFOKGUpKXRocm93IG5ldyBFcnJvcigiZGlzdGFuY2UgaXMgcmVxdWlyZWQiKTt2YXIgaT1pdCh0KSxvPXQucHJvcGVydGllcztzd2l0Y2goaSl7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4gb3ModCxlLHIpO2Nhc2UiTXVsdGlMaW5lU3RyaW5nIjp2YXIgcz1bXTtyZXR1cm4geih0LChmdW5jdGlvbih0KXtzLnB1c2gob3ModCxlLHIpLmdlb21ldHJ5LmNvb3JkaW5hdGVzKX0pKSxnKHMsbyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImdlb21ldHJ5ICIraSsiIGlzIG5vdCBzdXBwb3J0ZWQiKX19LHQubGluZU92ZXJsYXA9a2ksdC5saW5lUmVkdWNlPVksdC5saW5lU2VnbWVudD1abix0LmxpbmVTbGljZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9UShuKTtpZigiTGluZVN0cmluZyIhPT1pdChuKSl0aHJvdyBuZXcgRXJyb3IoImxpbmUgbXVzdCBiZSBhIExpbmVTdHJpbmciKTtmb3IodmFyIGksbz1UcihuLHQpLHM9VHIobixlKSxhPVsoaT1vLnByb3BlcnRpZXMuaW5kZXg8PXMucHJvcGVydGllcy5pbmRleD9bbyxzXTpbcyxvXSlbMF0uZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLHU9aVswXS5wcm9wZXJ0aWVzLmluZGV4KzE7dTxpWzFdLnByb3BlcnRpZXMuaW5kZXgrMTt1KyspYS5wdXNoKHJbdV0pO3JldHVybiBhLnB1c2goaVsxXS5nZW9tZXRyeS5jb29yZGluYXRlcyksaChhLG4ucHJvcGVydGllcyl9LHQubGluZVNsaWNlQWxvbmc9SHIsdC5saW5lU3BsaXQ9ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImxpbmUgaXMgcmVxdWlyZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoInNwbGl0dGVyIGlzIHJlcXVpcmVkIik7dmFyIG49aXQodCkscj1pdChlKTtpZigiTGluZVN0cmluZyIhPT1uKXRocm93IG5ldyBFcnJvcigibGluZSBtdXN0IGJlIExpbmVTdHJpbmciKTtpZigiRmVhdHVyZUNvbGxlY3Rpb24iPT09cil0aHJvdyBuZXcgRXJyb3IoInNwbGl0dGVyIGNhbm5vdCBiZSBhIEZlYXR1cmVDb2xsZWN0aW9uIik7aWYoIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT1yKXRocm93IG5ldyBFcnJvcigic3BsaXR0ZXIgY2Fubm90IGJlIGEgR2VvbWV0cnlDb2xsZWN0aW9uIik7dmFyIGk9ZWkoZSx7cHJlY2lzaW9uOjd9KTtzd2l0Y2gocil7Y2FzZSJQb2ludCI6cmV0dXJuIG1pKHQsaSk7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gX2kodCxpKTtjYXNlIkxpbmVTdHJpbmciOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4gX2kodCxPcih0LGkpKX19LHQubGluZVN0cmluZz1oLHQubGluZVN0cmluZ1RvUG9seWdvbj1DaSx0LmxpbmVTdHJpbmdzPXAsdC5saW5lVG9Qb2x5Z29uPUNpLHQubWFzaz1mdW5jdGlvbih0LGUpe3ZhciBuLHI9aHkoZSksaT1udWxsO3JldHVybiJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGU/aT1jeSgyPT09KG49dCkuZmVhdHVyZXMubGVuZ3RoPyR1LnVuaW9uKG4uZmVhdHVyZXNbMF0uZ2VvbWV0cnkuY29vcmRpbmF0ZXMsbi5mZWF0dXJlc1sxXS5nZW9tZXRyeS5jb29yZGluYXRlcyk6JHUudW5pb24uYXBwbHkoJHUsbi5mZWF0dXJlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzfSkpKSk6aT1jeSgkdS51bmlvbih0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSksaS5nZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKChmdW5jdGlvbih0KXtyLmdlb21ldHJ5LmNvb3JkaW5hdGVzLnB1c2godFswXSl9KSkscn0sdC5tZXRhPUosdC5taWRwb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiB2bih0LG1lKHQsZSkvMixtbih0LGUpKX0sdC5tb3JhbkluZGV4PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5pbnB1dEZpZWxkLHI9ZS50aHJlc2hvbGR8fDFlNSxpPWUucHx8MixvPWUuYmluYXJ5fHwhMSxzPWphKHQse2FscGhhOmUuYWxwaGF8fC0xLGJpbmFyeTpvLHA6aSxzdGFuZGFyZGl6YXRpb246ZS5zdGFuZGFyZGl6YXRpb258fCEwLHRocmVzaG9sZDpyfSksYT1bXTtGKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQucHJvcGVydGllc3x8e307YS5wdXNoKGVbbl0pfSkpO2Zvcih2YXIgdT1VYShhKSxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1VYSh0KSxuPTAscj0wLGk9dDtyPGkubGVuZ3RoO3IrKyl7dmFyIG89aVtyXTtuKz1NYXRoLnBvdyhvLWUsMil9cmV0dXJuIG4vdC5sZW5ndGh9KGEpLGM9MCxoPTAscD0wLGY9MCxnPXMubGVuZ3RoLGQ9MDtkPGc7ZCsrKXtmb3IodmFyIHk9MCx2PTA7djxnO3YrKyljKz1zW2RdW3ZdKihhW2RdLXUpKihhW3ZdLXUpLGgrPXNbZF1bdl0scCs9TWF0aC5wb3coc1tkXVt2XStzW3ZdW2RdLDIpLHkrPXNbZF1bdl0rc1t2XVtkXTtmKz1NYXRoLnBvdyh5LDIpfXZhciBfPWMvaC9sLG09LTEvKGctMSkseD0oZypnKihwKj0uNSktZypmK2gqaCozKS8oKGctMSkqKGcrMSkqKGgqaCkpLW0qbSxFPU1hdGguc3FydCh4KTtyZXR1cm57ZXhwZWN0ZWRNb3JhbkluZGV4Om0sbW9yYW5JbmRleDpfLHN0ZE5vcm06RSx6Tm9ybTooXy1tKS9FfX0sdC5tdWx0aUxpbmVTdHJpbmc9Zyx0Lm11bHRpUG9pbnQ9ZCx0Lm11bHRpUG9seWdvbj15LHQubmVhcmVzdD1Kbix0Lm5lYXJlc3RQb2ludD1Kbix0Lm5lYXJlc3RQb2ludE9uTGluZT1Ucix0Lm5lYXJlc3RQb2ludFRvTGluZT1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09biYmKG49e30pO3ZhciByPW4udW5pdHMsaT1uLnByb3BlcnRpZXN8fHt9LG89ZnVuY3Rpb24odCl7dmFyIGU9W107c3dpdGNoKHQuZ2VvbWV0cnk/dC5nZW9tZXRyeS50eXBlOnQudHlwZSl7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOnJldHVybiBxKHQsKGZ1bmN0aW9uKHQpeyJQb2ludCI9PT10LnR5cGUmJmUucHVzaCh7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7fSxnZW9tZXRyeTp0fSl9KSkse3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczplfTtjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpyZXR1cm4gdC5mZWF0dXJlcz10LmZlYXR1cmVzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIlBvaW50Ij09PXQuZ2VvbWV0cnkudHlwZX0pKSx0O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJwb2ludHMgbXVzdCBiZSBhIFBvaW50IENvbGxlY3Rpb24iKX19KHQpO2lmKCFvLmZlYXR1cmVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInBvaW50cyBtdXN0IGNvbnRhaW4gZmVhdHVyZXMiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoImxpbmUgaXMgcmVxdWlyZWQiKTtpZigiTGluZVN0cmluZyIhPT1pdChlKSl0aHJvdyBuZXcgRXJyb3IoImxpbmUgbXVzdCBiZSBhIExpbmVTdHJpbmciKTt2YXIgcz0xLzAsYT1udWxsO3JldHVybiBGKG8sKGZ1bmN0aW9uKHQpe3ZhciBuPURyKHQsZSx7dW5pdHM6cn0pO248cyYmKHM9bixhPXQpfSkpLGEmJihhLnByb3BlcnRpZXM9Y3Qoe2Rpc3Q6c30sYS5wcm9wZXJ0aWVzLGkpKSxhfSx0LnBsYW5lcG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1LKHQpLHI9cnQoZSkuY29vcmRpbmF0ZXNbMF07aWYoci5sZW5ndGg8NCl0aHJvdyBuZXcgRXJyb3IoIk91dGVyUmluZyBvZiBhIFBvbHlnb24gbXVzdCBoYXZlIDQgb3IgbW9yZSBQb3NpdGlvbnMuIik7dmFyIGk9ZS5wcm9wZXJ0aWVzfHx7fSxvPWkuYSxzPWkuYixhPWkuYyx1PW5bMF0sbD1uWzFdLGM9clswXVswXSxoPXJbMF1bMV0scD12b2lkIDAhPT1vP286clswXVsyXSxmPXJbMV1bMF0sZz1yWzFdWzFdLGQ9dm9pZCAwIT09cz9zOnJbMV1bMl0seT1yWzJdWzBdLHY9clsyXVsxXSxfPXZvaWQgMCE9PWE/YTpyWzJdWzJdO3JldHVybihfKih1LWMpKihsLWcpK3AqKHUtZikqKGwtdikrZCoodS15KSoobC1oKS1kKih1LWMpKihsLXYpLV8qKHUtZikqKGwtaCktcCoodS15KSoobC1nKSkvKCh1LWMpKihsLWcpKyh1LWYpKihsLXYpKyh1LXkpKihsLWgpLSh1LWMpKihsLXYpLSh1LWYpKihsLWgpLSh1LXkpKihsLWcpKX0sdC5wb2ludD1hLHQucG9pbnRHcmlkPXRpLHQucG9pbnRPbkZlYXR1cmU9cXIsdC5wb2ludE9uTGluZT1Ucix0LnBvaW50T25TdXJmYWNlPXFyLHQucG9pbnRUb0xpbmVEaXN0YW5jZT1Ecix0LnBvaW50cz11LHQucG9pbnRzV2l0aGluUG9seWdvbj1fZSx0LnBvbHlnb249bCx0LnBvbHlnb25TbW9vdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj1bXSxyPWUuaXRlcmF0aW9uc3x8MTtpZighdCl0aHJvdyBuZXcgRXJyb3IoImlucHV0UG9seXMgaXMgcmVxdWlyZWQiKTtyZXR1cm4gcSh0LChmdW5jdGlvbih0LGUsaSl7dmFyIG8scyxhO3N3aXRjaCh0LnR5cGUpe2Nhc2UiUG9seWdvbiI6bz1bW11dO2Zvcih2YXIgdT0wO3U8cjt1KyspYT1bW11dLHM9dCx1PjAmJihzPWwobykuZ2VvbWV0cnkpLHFhKHMsYSksbz1hLnNsaWNlKDApO24ucHVzaChsKG8saSkpO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpvPVtbW11dXTtmb3IodmFyIGM9MDtjPHI7YysrKWE9W1tbXV1dLHM9dCxjPjAmJihzPXkobykuZ2VvbWV0cnkpLEJhKHMsYSksbz1hLnNsaWNlKDApO24ucHVzaCh5KG8saSkpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJnZW9tZXRyeSBpcyBpbnZhbGlkLCBtdXN0IGJlIFBvbHlnb24gb3IgTXVsdGlQb2x5Z29uIil9fSkpLGYobil9LHQucG9seWdvblRhbmdlbnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpLG8scz1RKHQpLHU9UShlKSxsPVooZSksYz0wLGg9bnVsbDtzd2l0Y2goc1swXT5sWzBdJiZzWzBdPGxbMl0mJnNbMV0+bFsxXSYmc1sxXTxsWzNdJiYoYz0oaD1Kbih0LGJuKGUpKSkucHJvcGVydGllcy5mZWF0dXJlSW5kZXgpLGl0KGUpKXtjYXNlIlBvbHlnb24iOm49dVswXVtjXSxyPXVbMF1bMF0sbnVsbCE9PWgmJmguZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV08c1sxXSYmKHI9dVswXVtjXSksbz1YaSh1WzBdWzBdLHVbMF1bdVswXS5sZW5ndGgtMV0scyk7dmFyIHA9VWkodVswXSxzLG8saSxuLHIpO249cFswXSxyPXBbMV07YnJlYWs7Y2FzZSJNdWx0aVBvbHlnb24iOmZvcih2YXIgZz0wLGQ9MCx5PTAsdj0wO3Y8dVswXS5sZW5ndGg7disrKXtnPXY7Zm9yKHZhciBfPSExLG09MDttPHVbMF1bdl0ubGVuZ3RoO20rKyl7aWYoZD1tLHk9PT1jKXtfPSEwO2JyZWFrfXkrK31pZihfKWJyZWFrfW49dVswXVtnXVtkXSxyPXVbMF1bZ11bZF0sbz1YaSh1WzBdWzBdWzBdLHVbMF1bMF1bdVswXVswXS5sZW5ndGgtMV0scyksdS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1VaSh0WzBdLHMsbyxpLG4scik7bj1lWzBdLHI9ZVsxXX0pKX1yZXR1cm4gZihbYShuKSxhKHIpXSl9LHQucG9seWdvblRvTGluZT1JaSx0LnBvbHlnb25Ub0xpbmVTdHJpbmc9SWksdC5wb2x5Z29uaXplPWZ1bmN0aW9uKHQpe3ZhciBlPWhzLmZyb21HZW9Kc29uKHQpO2UuZGVsZXRlRGFuZ2xlcygpLGUuZGVsZXRlQ3V0RWRnZXMoKTt2YXIgbj1bXSxyPVtdO3JldHVybiBlLmdldEVkZ2VSaW5ncygpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNWYWxpZCgpfSkpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuaXNIb2xlKCk/bi5wdXNoKHQpOnIucHVzaCh0KX0pKSxuLmZvckVhY2goKGZ1bmN0aW9uKHQpe2NzLmZpbmRFZGdlUmluZ0NvbnRhaW5pbmcodCxyKSYmci5wdXNoKHQpfSkpLGYoci5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRvUG9seWdvbigpfSkpKX0sdC5wb2x5Z29ucz1jLHQucHJvamVjdGlvbj1KYSx0LnByb3BFYWNoPUEsdC5wcm9wUmVkdWNlPUQsdC5wcm9wZXJ0aWVzQ29udGFpbnNGaWx0ZXI9bHUsdC5yYWRpYW5zMmRlZ3JlZXM9dyx0LnJhZGlhbnNUb0RlZ3JlZXM9dyx0LnJhZGlhbnNUb0Rpc3RhbmNlPW0sdC5yYWRpYW5zVG9MZW5ndGg9bSx0LnJhbmRvbT1ydSx0LnJhbmRvbUxpbmVTdHJpbmc9dHUsdC5yYW5kb21Qb2ludD1RYSx0LnJhbmRvbVBvbHlnb249JGEsdC5yYW5kb21Qb3NpdGlvbj1LYSx0LnJld2luZD1mdW5jdGlvbih0LGUpe2lmKCFQKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5yZXZlcnNlfHwhMSxyPWUubXV0YXRlfHwhMTtpZighdCl0aHJvdyBuZXcgRXJyb3IoIjxnZW9qc29uPiBpcyByZXF1aXJlZCIpO2lmKCJib29sZWFuIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yKCI8cmV2ZXJzZT4gbXVzdCBiZSBhIGJvb2xlYW4iKTtpZigiYm9vbGVhbiIhPXR5cGVvZiByKXRocm93IG5ldyBFcnJvcigiPG11dGF0ZT4gbXVzdCBiZSBhIGJvb2xlYW4iKTshMT09PXImJih0PUllKHQpKTt2YXIgaT1bXTtzd2l0Y2godC50eXBlKXtjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6cmV0dXJuIHEodCwoZnVuY3Rpb24odCl7SGkodCxuKX0pKSx0O2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnJldHVybiBGKHQsKGZ1bmN0aW9uKHQpe0YoSGkodCxuKSwoZnVuY3Rpb24odCl7aS5wdXNoKHQpfSkpfSkpLGYoaSl9cmV0dXJuIEhpKHQsbil9LHQucmh1bWJCZWFyaW5nPUJpLHQucmh1bWJEZXN0aW5hdGlvbj1qaSx0LnJodW1iRGlzdGFuY2U9QXIsdC5yb3VuZD1fLHQuc2FtcGxlPWZ1bmN0aW9uKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlY29sbGVjdGlvbiBpcyByZXF1aXJlZCIpO2lmKG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJudW0gaXMgcmVxdWlyZWQiKTtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJudW0gbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmKGZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXQuc2xpY2UoMCksbz10Lmxlbmd0aCxzPW8tZTtmb3IoO28tLSA+czspbj1pW3I9TWF0aC5mbG9vcigobysxKSpNYXRoLnJhbmRvbSgpKV0saVtyXT1pW29dLGlbb109bjtyZXR1cm4gaS5zbGljZShzKX0odC5mZWF0dXJlcyxlKSl9LHQuc2VjdG9yPWZ1bmN0aW9uKHQsZSxuLHIsaSl7aWYoIVAoaT1pfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbz1pLnByb3BlcnRpZXM7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjZW50ZXIgaXMgcmVxdWlyZWQiKTtpZihudWxsPT1uKXRocm93IG5ldyBFcnJvcigiYmVhcmluZzEgaXMgcmVxdWlyZWQiKTtpZihudWxsPT1yKXRocm93IG5ldyBFcnJvcigiYmVhcmluZzIgaXMgcmVxdWlyZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoInJhZGl1cyBpcyByZXF1aXJlZCIpO2lmKCJvYmplY3QiIT10eXBlb2YgaSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtpZihxaShuKT09PXFpKHIpKXJldHVybiBfbih0LGUsaSk7dmFyIHM9USh0KSxhPWJpKHQsZSxuLHIsaSksdT1bW3NdXTtyZXR1cm4gUihhLChmdW5jdGlvbih0KXt1WzBdLnB1c2godCl9KSksdVswXS5wdXNoKHMpLGwodSxvKX0sdC5zZWdtZW50RWFjaD1VLHQuc2VnbWVudFJlZHVjZT1WLHQuc2hvcnRlc3RQYXRoPWZ1bmN0aW9uKHQsZSxuKXtpZighUChuPW58fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciByPW4ucmVzb2x1dGlvbixpPW4ubWluRGlzdGFuY2Uscz1uLm9ic3RhY2xlc3x8ZihbXSk7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJzdGFydCBpcyByZXF1aXJlZCIpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiZW5kIGlzIHJlcXVpcmVkIik7aWYociYmIUMocil8fHI8PTApdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zLnJlc29sdXRpb24gbXVzdCBiZSBhIG51bWJlciwgZ3JlYXRlciB0aGFuIDAiKTtpZihpKXRocm93IG5ldyBFcnJvcigib3B0aW9ucy5taW5EaXN0YW5jZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIik7dmFyIHU9Syh0KSxsPUsoZSk7c3dpdGNoKHQ9YSh1KSxlPWEobCksaXQocykpe2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOmlmKDA9PT1zLmZlYXR1cmVzLmxlbmd0aClyZXR1cm4gaChbdSxsXSk7YnJlYWs7Y2FzZSJQb2x5Z29uIjpzPWYoW28ocnQocykpXSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgb2JzdGFjbGVzIil9dmFyIGM9cztjLmZlYXR1cmVzLnB1c2godCksYy5mZWF0dXJlcy5wdXNoKGUpO3ZhciBwPVoodHMoZ24oWihjKSksMS4xNSkpO3J8fChyPW1lKFtwWzBdLHBbMV1dLFtwWzJdLHBbMV1dLG4pLzEwMCksYy5mZWF0dXJlcy5wb3AoKSxjLmZlYXR1cmVzLnBvcCgpO2Zvcih2YXIgZz1wWzBdLGQ9cFsxXSx5PXBbMl0sdj1wWzNdLF89ci9tZShbZyxkXSxbeSxkXSxuKSooeS1nKSxtPXIvbWUoW2csZF0sW2csdl0sbikqKHYtZCkseD15LWcsRT12LWQsYj1NYXRoLmZsb29yKHgvXyksdz1NYXRoLmZsb29yKEUvbSksST0oeC1iKl8pLzIsTj1bXSxTPVtdLE09W10sTD1bXSxPPTEvMCxSPTEvMCxUPXYtKEUtdyptKS8yLEE9MDtUPj1kOyl7Zm9yKHZhciBEPVtdLEY9W10saz1nK0ksRz0wO2s8PXk7KXt2YXIgcT1hKFtrLFRdKSxCPUpzKHEscyk7RC5wdXNoKEI/MDoxKSxGLnB1c2goaysifCIrVCk7dmFyIHo9bWUocSx0KTshQiYmejxPJiYoTz16LE09e3g6Ryx5OkF9KTt2YXIgaj1tZShxLGUpOyFCJiZqPFImJihSPWosTD17eDpHLHk6QX0pLGsrPV8sRysrfVMucHVzaChEKSxOLnB1c2goRiksVC09bSxBKyt9dmFyIFU9bmV3IFlzKFMse2RpYWdvbmFsOiEwfSksVj1VLmdyaWRbTS55XVtNLnhdLFg9VS5ncmlkW0wueV1bTC54XSxZPVhzLnNlYXJjaChVLFYsWCksSD1bdV07cmV0dXJuIFkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9Tlt0LnhdW3QueV0uc3BsaXQoInwiKTtILnB1c2goWytlWzBdLCtlWzFdXSl9KSksSC5wdXNoKGwpLHRuKGgoSCkpfSx0LnNpbXBsaWZ5PWZ1bmN0aW9uKHQsZSl7aWYoIVAoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj12b2lkIDAhPT1lLnRvbGVyYW5jZT9lLnRvbGVyYW5jZToxLHI9ZS5oaWdoUXVhbGl0eXx8ITEsaT1lLm11dGF0ZXx8ITE7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7aWYobiYmbjwwKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCB0b2xlcmFuY2UiKTtyZXR1cm4hMCE9PWkmJih0PUllKHQpKSxxKHQsKGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUsbil7dmFyIHI9dC50eXBlO2lmKCJQb2ludCI9PT1yfHwiTXVsdGlQb2ludCI9PT1yKXJldHVybiB0O3RuKHQsITApO3ZhciBpPXQuY29vcmRpbmF0ZXM7c3dpdGNoKHIpe2Nhc2UiTGluZVN0cmluZyI6dC5jb29yZGluYXRlcz1sbihpLGUsbik7YnJlYWs7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnQuY29vcmRpbmF0ZXM9aS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBsbih0LGUsbil9KSk7YnJlYWs7Y2FzZSJQb2x5Z29uIjp0LmNvb3JkaW5hdGVzPWNuKGksZSxuKTticmVhaztjYXNlIk11bHRpUG9seWdvbiI6dC5jb29yZGluYXRlcz1pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGNuKHQsZSxuKX0pKX19KHQsbixyKX0pKSx0fSx0LnNxdWFyZT15bix0LnNxdWFyZUdyaWQ9cHksdC5zdGFuZGFyZERldmlhdGlvbmFsRWxsaXBzZT1mdW5jdGlvbih0LGUpe2lmKCFQKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5zdGVwc3x8NjQscj1lLndlaWdodCxpPWUucHJvcGVydGllc3x8e307aWYoIUMobikpdGhyb3cgbmV3IEVycm9yKCJzdGVwcyBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIVAoaSkpdGhyb3cgbmV3IEVycm9yKCJwcm9wZXJ0aWVzIG11c3QgYmUgYSBudW1iZXIiKTt2YXIgbz1HKHQpLmxlbmd0aCxzPUZhKHQse3dlaWdodDpyfSksYT0wLHU9MCxsPTA7Rih0LChmdW5jdGlvbih0KXt2YXIgZT10LnByb3BlcnRpZXNbcl18fDEsbj1HYShRKHQpLFEocykpO2ErPU1hdGgucG93KG4ueCwyKSplLHUrPU1hdGgucG93KG4ueSwyKSplLGwrPW4ueCpuLnkqZX0pKTt2YXIgYz1hLXUsaD1NYXRoLnNxcnQoTWF0aC5wb3coYywyKSs0Kk1hdGgucG93KGwsMikpLHA9MipsLGc9TWF0aC5hdGFuKChjK2gpL3ApLGQ9MTgwKmcvTWF0aC5QSSx5PTAsdj0wLF89MDtGKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQucHJvcGVydGllc1tyXXx8MSxuPUdhKFEodCksUShzKSk7eSs9TWF0aC5wb3cobi54Kk1hdGguY29zKGcpLW4ueSpNYXRoLnNpbihnKSwyKSplLHYrPU1hdGgucG93KG4ueCpNYXRoLnNpbihnKStuLnkqTWF0aC5jb3MoZyksMikqZSxfKz1lfSkpO3ZhciBtPU1hdGguc3FydCgyKnkvXykseD1NYXRoLnNxcnQoMip2L18pLEU9QWEocyxtLHgse3VuaXRzOiJkZWdyZWVzIixhbmdsZTpkLHN0ZXBzOm4scHJvcGVydGllczppfSksYj1fZSh0LGYoW0VdKSksdz17bWVhbkNlbnRlckNvb3JkaW5hdGVzOlEocyksc2VtaU1ham9yQXhpczptLHNlbWlNaW5vckF4aXM6eCxudW1iZXJPZkZlYXR1cmVzOm8sYW5nbGU6ZCxwZXJjZW50YWdlV2l0aGluRWxsaXBzZToxMDAqRyhiKS5sZW5ndGgvb307cmV0dXJuIEUucHJvcGVydGllcy5zdGFuZGFyZERldmlhdGlvbmFsRWxsaXBzZT13LEV9LHQudGFnPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PUllKHQpLGU9SWUoZSksRih0LChmdW5jdGlvbih0KXt0LnByb3BlcnRpZXN8fCh0LnByb3BlcnRpZXM9e30pLEYoZSwoZnVuY3Rpb24oZSl7dm9pZCAwPT09dC5wcm9wZXJ0aWVzW3JdJiZ5ZSh0LGUpJiYodC5wcm9wZXJ0aWVzW3JdPWUucHJvcGVydGllc1tuXSl9KSl9KSksdH0sdC50ZXNzZWxhdGU9ZnVuY3Rpb24odCl7aWYoIXQuZ2VvbWV0cnl8fCJQb2x5Z29uIiE9PXQuZ2VvbWV0cnkudHlwZSYmIk11bHRpUG9seWdvbiIhPT10Lmdlb21ldHJ5LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dCBtdXN0IGJlIGEgUG9seWdvbiBvciBNdWx0aVBvbHlnb24iKTt2YXIgZT17dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOltdfTtyZXR1cm4iUG9seWdvbiI9PT10Lmdlb21ldHJ5LnR5cGU/ZS5mZWF0dXJlcz1Xbih0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKTp0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuZmVhdHVyZXM9ZS5mZWF0dXJlcy5jb25jYXQoV24odCkpfSkpLGV9LHQudGluPXhlLHQudG9NZXJjYXRvcj1WYSx0LnRvV2dzODQ9WGEsdC50cmFuc2Zvcm1Sb3RhdGU9JG8sdC50cmFuc2Zvcm1TY2FsZT10cyx0LnRyYW5zZm9ybVRyYW5zbGF0ZT1mdW5jdGlvbih0LGUsbixyKXtpZighUChyPXJ8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBpPXIudW5pdHMsbz1yLnpUcmFuc2xhdGlvbixzPXIubXV0YXRlO2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO2lmKG51bGw9PWV8fGlzTmFOKGUpKXRocm93IG5ldyBFcnJvcigiZGlzdGFuY2UgaXMgcmVxdWlyZWQiKTtpZihvJiYibnVtYmVyIiE9dHlwZW9mIG8mJmlzTmFOKG8pKXRocm93IG5ldyBFcnJvcigielRyYW5zbGF0aW9uIGlzIG5vdCBhIG51bWJlciIpO2lmKG89dm9pZCAwIT09bz9vOjAsMD09PWUmJjA9PT1vKXJldHVybiB0O2lmKG51bGw9PW58fGlzTmFOKG4pKXRocm93IG5ldyBFcnJvcigiZGlyZWN0aW9uIGlzIHJlcXVpcmVkIik7cmV0dXJuIGU8MCYmKGU9LWUsbis9MTgwKSwhMSE9PXMmJnZvaWQgMCE9PXN8fCh0PUllKHQpKSxSKHQsKGZ1bmN0aW9uKHQpe3ZhciByPVEoamkodCxlLG4se3VuaXRzOml9KSk7dFswXT1yWzBdLHRbMV09clsxXSxvJiYzPT09dC5sZW5ndGgmJih0WzJdKz1vKX0pKSx0fSx0LnRyaWFuZ2xlR3JpZD1meSx0LnRydW5jYXRlPWVpLHQudW5pb249ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1ydCh0KSxpPXJ0KGUpLG89JHUudW5pb24oci5jb29yZGluYXRlcyxpLmNvb3JkaW5hdGVzKTtyZXR1cm4gMD09PW8ubGVuZ3RoP251bGw6MT09PW8ubGVuZ3RoP2wob1swXSxuLnByb3BlcnRpZXMpOnkobyxuLnByb3BlcnRpZXMpfSx0LnVuaXRzRmFjdG9ycz1yLHQudW5raW5rUG9seWdvbj1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4geih0LChmdW5jdGlvbih0KXsiUG9seWdvbiI9PT10Lmdlb21ldHJ5LnR5cGUmJkYob2kodCksKGZ1bmN0aW9uKG4pe2UucHVzaChsKG4uZ2VvbWV0cnkuY29vcmRpbmF0ZXMsdC5wcm9wZXJ0aWVzKSl9KSl9KSksZihlKX0sdC52YWxpZGF0ZUJCb3g9TSx0LnZhbGlkYXRlSWQ9TCx0LnZvcm9ub2k9ZnVuY3Rpb24odCxlKXtpZighUChlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuPWUuYmJveHx8Wy0xODAsLTg1LDE4MCw4NV07aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJwb2ludHMgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheShuKSl0aHJvdyBuZXcgRXJyb3IoImJib3ggaXMgaW52YWxpZCIpO3JldHVybiBudCh0LCJQb2ludCIsInBvaW50cyIpLGYoZnVuY3Rpb24oKXt2YXIgdD1LcyxlPVFzLG49bnVsbDtmdW5jdGlvbiByKHIpe3JldHVybiBuZXcgUmEoci5tYXAoKGZ1bmN0aW9uKG4saSl7dmFyIG89W01hdGgucm91bmQodChuLGkscikvTWEpKk1hLE1hdGgucm91bmQoZShuLGkscikvTWEpKk1hXTtyZXR1cm4gby5pbmRleD1pLG8uZGF0YT1uLG99KSksbil9cmV0dXJuIHIucG9seWdvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkucG9seWdvbnMoKX0sci5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS5saW5rcygpfSxyLnRyaWFuZ2xlcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS50cmlhbmdsZXMoKX0sci54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6WnMoK2UpLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlpzKCt0KSxyKTplfSxyLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P251bGw6W1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0scik6biYmW1tuWzBdWzBdLG5bMF1bMV1dLFtuWzFdWzBdLG5bMV1bMV1dXX0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDpbWzAsMF0sWyt0WzBdLCt0WzFdXV0scik6biYmW25bMV1bMF0tblswXVswXSxuWzFdWzFdLW5bMF1bMV1dfSxyfSgpLngoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdfSkpLnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdfSkpLmV4dGVudChbW25bMF0sblsxXV0sW25bMl0sblszXV1dKS5wb2x5Z29ucyh0LmZlYXR1cmVzKS5tYXAoVGEpKX0sdC53aXRoaW49X2UsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSkpOwo=";var DX=function(){if(!Xc())return null;var l="undefined"!=typeof self?self:Xc()?window:"undefined"!=typeof global?global:null;if(EX(l,"turf"))return l.turf;var d=l.document.createElement("script"),b=OX;return d.innerHTML=function(l){return jX(l)?QX.parse(l).toString(rX):""}(b),l.document.getElementsByTagName("head")[0].appendChild(d),l.turf}();var AX=6378137,_X=.0066943799901413165,qX=484813681109536e-20,$X=Math.PI/2,lG=1e-10,dG=.017453292519943295,bG=57.29577951308232,ZG=Math.PI/4,cG=2*Math.PI,mG=3.14159265359,XG={greenwich:0,lisbon:-9.131906111111,paris:2.337229166667,bogota:-74.080916666667,madrid:-3.687938888889,rome:12.452333333333,bern:7.439583333333,jakarta:106.807719444444,ferro:-17.666666666667,brussels:4.367975,stockholm:18.058277777778,athens:23.7163375,oslo:10.722916666667},GG={ft:{to_meter:.3048},"us-ft":{to_meter:1200/3937}},WG=/[\s_\-\/\(\)]/g;function uG(l,d){if(l[d])return l[d];for(var b,Z=Object.keys(l),c=d.toLowerCase().replace(WG,""),m=-1;++m<Z.length;)if((b=Z[m]).toLowerCase().replace(WG,"")===c)return l[b]}function aG(l){var d,b,Z,c={},m=l.split("+").map((function(l){return l.trim()})).filter((function(l){return l})).reduce((function(l,d){var b=d.split("=");return b.push(!0),l[b[0].toLowerCase()]=b[1],l}),{}),X={proj:"projName",datum:"datumCode",rf:function(l){c.rf=parseFloat(l)},lat_0:function(l){c.lat0=l*dG},lat_1:function(l){c.lat1=l*dG},lat_2:function(l){c.lat2=l*dG},lat_ts:function(l){c.lat_ts=l*dG},lon_0:function(l){c.long0=l*dG},lon_1:function(l){c.long1=l*dG},lon_2:function(l){c.long2=l*dG},alpha:function(l){c.alpha=parseFloat(l)*dG},gamma:function(l){c.rectified_grid_angle=parseFloat(l)},lonc:function(l){c.longc=l*dG},x_0:function(l){c.x0=parseFloat(l)},y_0:function(l){c.y0=parseFloat(l)},k_0:function(l){c.k0=parseFloat(l)},k:function(l){c.k0=parseFloat(l)},a:function(l){c.a=parseFloat(l)},b:function(l){c.b=parseFloat(l)},r_a:function(){c.R_A=!0},zone:function(l){c.zone=parseInt(l,10)},south:function(){c.utmSouth=!0},towgs84:function(l){c.datum_params=l.split(",").map((function(l){return parseFloat(l)}))},to_meter:function(l){c.to_meter=parseFloat(l)},units:function(l){c.units=l;var d=uG(GG,l);d&&(c.to_meter=d.to_meter)},from_greenwich:function(l){c.from_greenwich=l*dG},pm:function(l){var d=uG(XG,l);c.from_greenwich=(d||parseFloat(l))*dG},nadgrids:function(l){"@null"===l?c.datumCode="none":c.nadgrids=l},axis:function(l){var d="ewnsud";3===l.length&&-1!==d.indexOf(l.substr(0,1))&&-1!==d.indexOf(l.substr(1,1))&&-1!==d.indexOf(l.substr(2,1))&&(c.axis=l)},approx:function(){c.approx=!0}};for(d in m)b=m[d],d in X?"function"==typeof(Z=X[d])?Z(b):c[Z]=b:c[d]=b;return"string"==typeof c.datumCode&&"WGS84"!==c.datumCode&&(c.datumCode=c.datumCode.toLowerCase()),c}var hG=/\s/,sG=/[A-Za-z]/,VG=/[A-Za-z84_]/,yG=/[,\]]/,pG=/[\d\.E\-\+]/;function tG(l){if("string"!=typeof l)throw new Error("not a string");this.text=l.trim(),this.level=0,this.place=0,this.root=null,this.stack=[],this.currentObject=null,this.state=1}function nG(l,d,b){Array.isArray(d)&&(b.unshift(d),d=null);var Z=d?{}:l,c=b.reduce((function(l,d){return iG(d,l),l}),Z);d&&(l[d]=c)}function iG(l,d){if(Array.isArray(l)){var b=l.shift();if("PARAMETER"===b&&(b=l.shift()),1===l.length)return Array.isArray(l[0])?(d[b]={},void iG(l[0],d[b])):void(d[b]=l[0]);if(l.length)if("TOWGS84"!==b){if("AXIS"===b)return b in d||(d[b]=[]),void d[b].push(l);var Z;switch(Array.isArray(b)||(d[b]={}),b){case"UNIT":case"PRIMEM":case"VERT_DATUM":return d[b]={name:l[0].toLowerCase(),convert:l[1]},void(3===l.length&&iG(l[2],d[b]));case"SPHEROID":case"ELLIPSOID":return d[b]={name:l[0],a:l[1],rf:l[2]},void(4===l.length&&iG(l[3],d[b]));case"PROJECTEDCRS":case"PROJCRS":case"GEOGCS":case"GEOCCS":case"PROJCS":case"LOCAL_CS":case"GEODCRS":case"GEODETICCRS":case"GEODETICDATUM":case"EDATUM":case"ENGINEERINGDATUM":case"VERT_CS":case"VERTCRS":case"VERTICALCRS":case"COMPD_CS":case"COMPOUNDCRS":case"ENGINEERINGCRS":case"ENGCRS":case"FITTED_CS":case"LOCAL_DATUM":case"DATUM":return l[0]=["name",l[0]],void nG(d,b,l);default:for(Z=-1;++Z<l.length;)if(!Array.isArray(l[Z]))return iG(l,d[b]);return nG(d,b,l)}}else d[b]=l;else d[b]=!0}else d[l]=!0}tG.prototype.readCharicter=function(){var l=this.text[this.place++];if(4!==this.state)for(;hG.test(l);){if(this.place>=this.text.length)return;l=this.text[this.place++]}switch(this.state){case 1:return this.neutral(l);case 2:return this.keyword(l);case 4:return this.quoted(l);case 5:return this.afterquote(l);case 3:return this.number(l);case-1:return}},tG.prototype.afterquote=function(l){if('"'===l)return this.word+='"',void(this.state=4);if(yG.test(l))return this.word=this.word.trim(),void this.afterItem(l);throw new Error("havn't handled \""+l+'" in afterquote yet, index '+this.place)},tG.prototype.afterItem=function(l){return","===l?(null!==this.word&&this.currentObject.push(this.word),this.word=null,void(this.state=1)):"]"===l?(this.level--,null!==this.word&&(this.currentObject.push(this.word),this.word=null),this.state=1,this.currentObject=this.stack.pop(),void(this.currentObject||(this.state=-1))):void 0},tG.prototype.number=function(l){if(!pG.test(l)){if(yG.test(l))return this.word=parseFloat(this.word),void this.afterItem(l);throw new Error("havn't handled \""+l+'" in number yet, index '+this.place)}this.word+=l},tG.prototype.quoted=function(l){'"'!==l?this.word+=l:this.state=5},tG.prototype.keyword=function(l){if(VG.test(l))this.word+=l;else{if("["===l){var d=[];return d.push(this.word),this.level++,null===this.root?this.root=d:this.currentObject.push(d),this.stack.push(this.currentObject),this.currentObject=d,void(this.state=1)}if(!yG.test(l))throw new Error("havn't handled \""+l+'" in keyword yet, index '+this.place);this.afterItem(l)}},tG.prototype.neutral=function(l){if(sG.test(l))return this.word=l,void(this.state=2);if('"'===l)return this.word="",void(this.state=4);if(pG.test(l))return this.word=l,void(this.state=3);if(!yG.test(l))throw new Error("havn't handled \""+l+'" in neutral yet, index '+this.place);this.afterItem(l)},tG.prototype.output=function(){for(;this.place<this.text.length;)this.readCharicter();if(-1===this.state)return this.root;throw new Error('unable to parse string "'+this.text+'". State is '+this.state)};function RG(l){return.017453292519943295*l}function oG(l){var d=new tG(l).output(),b=d.shift(),Z=d.shift();d.unshift(["name",Z]),d.unshift(["type",b]);var c={};return iG(d,c),function(l){if("GEOGCS"===l.type?l.projName="longlat":"LOCAL_CS"===l.type?(l.projName="identity",l.local=!0):"object"===h(l.PROJECTION)?l.projName=Object.keys(l.PROJECTION)[0]:l.projName=l.PROJECTION,l.AXIS){for(var d="",b=0,Z=l.AXIS.length;b<Z;++b){var c=[l.AXIS[b][0].toLowerCase(),l.AXIS[b][1].toLowerCase()];-1!==c[0].indexOf("north")||("y"===c[0]||"lat"===c[0])&&"north"===c[1]?d+="n":-1!==c[0].indexOf("south")||("y"===c[0]||"lat"===c[0])&&"south"===c[1]?d+="s":-1!==c[0].indexOf("east")||("x"===c[0]||"lon"===c[0])&&"east"===c[1]?d+="e":-1===c[0].indexOf("west")&&("x"!==c[0]&&"lon"!==c[0]||"west"!==c[1])||(d+="w")}2===d.length&&(d+="u"),3===d.length&&(l.axis=d)}l.UNIT&&(l.units=l.UNIT.name.toLowerCase(),"metre"===l.units&&(l.units="meter"),l.UNIT.convert&&("GEOGCS"===l.type?l.DATUM&&l.DATUM.SPHEROID&&(l.to_meter=l.UNIT.convert*l.DATUM.SPHEROID.a):l.to_meter=l.UNIT.convert));var m=l.GEOGCS;function X(d){return d*(l.to_meter||1)}"GEOGCS"===l.type&&(m=l),m&&(m.DATUM?l.datumCode=m.DATUM.name.toLowerCase():l.datumCode=m.name.toLowerCase(),"d_"===l.datumCode.slice(0,2)&&(l.datumCode=l.datumCode.slice(2)),"new_zealand_geodetic_datum_1949"!==l.datumCode&&"new_zealand_1949"!==l.datumCode||(l.datumCode="nzgd49"),"wgs_1984"!==l.datumCode&&"world_geodetic_system_1984"!==l.datumCode||("Mercator_Auxiliary_Sphere"===l.PROJECTION&&(l.sphere=!0),l.datumCode="wgs84"),"_ferro"===l.datumCode.slice(-6)&&(l.datumCode=l.datumCode.slice(0,-6)),"_jakarta"===l.datumCode.slice(-8)&&(l.datumCode=l.datumCode.slice(0,-8)),~l.datumCode.indexOf("belge")&&(l.datumCode="rnb72"),m.DATUM&&m.DATUM.SPHEROID&&(l.ellps=m.DATUM.SPHEROID.name.replace("_19","").replace(/[Cc]larke\_18/,"clrk"),"international"===l.ellps.toLowerCase().slice(0,13)&&(l.ellps="intl"),l.a=m.DATUM.SPHEROID.a,l.rf=parseFloat(m.DATUM.SPHEROID.rf,10)),m.DATUM&&m.DATUM.TOWGS84&&(l.datum_params=m.DATUM.TOWGS84),~l.datumCode.indexOf("osgb_1936")&&(l.datumCode="osgb36"),~l.datumCode.indexOf("osni_1952")&&(l.datumCode="osni52"),(~l.datumCode.indexOf("tm65")||~l.datumCode.indexOf("geodetic_datum_of_1965"))&&(l.datumCode="ire65"),"ch1903+"===l.datumCode&&(l.datumCode="ch1903"),~l.datumCode.indexOf("israel")&&(l.datumCode="isr93")),l.b&&!isFinite(l.b)&&(l.b=l.a),[["standard_parallel_1","Standard_Parallel_1"],["standard_parallel_1","Latitude of 1st standard parallel"],["standard_parallel_2","Standard_Parallel_2"],["standard_parallel_2","Latitude of 2nd standard parallel"],["false_easting","False_Easting"],["false_easting","False easting"],["false-easting","Easting at false origin"],["false_northing","False_Northing"],["false_northing","False northing"],["false_northing","Northing at false origin"],["central_meridian","Central_Meridian"],["central_meridian","Longitude of natural origin"],["central_meridian","Longitude of false origin"],["latitude_of_origin","Latitude_Of_Origin"],["latitude_of_origin","Central_Parallel"],["latitude_of_origin","Latitude of natural origin"],["latitude_of_origin","Latitude of false origin"],["scale_factor","Scale_Factor"],["k0","scale_factor"],["latitude_of_center","Latitude_Of_Center"],["latitude_of_center","Latitude_of_center"],["lat0","latitude_of_center",RG],["longitude_of_center","Longitude_Of_Center"],["longitude_of_center","Longitude_of_center"],["longc","longitude_of_center",RG],["x0","false_easting",X],["y0","false_northing",X],["long0","central_meridian",RG],["lat0","latitude_of_origin",RG],["lat0","standard_parallel_1",RG],["lat1","standard_parallel_1",RG],["lat2","standard_parallel_2",RG],["azimuth","Azimuth"],["alpha","azimuth",RG],["srsCode","name"]].forEach((function(d){return function(l,d){var b=d[0],Z=d[1];!(b in l)&&Z in l&&(l[b]=l[Z],3===d.length&&(l[b]=d[2](l[b])))}(l,d)})),l.long0||!l.longc||"Albers_Conic_Equal_Area"!==l.projName&&"Lambert_Azimuthal_Equal_Area"!==l.projName||(l.long0=l.longc),l.lat_ts||!l.lat1||"Stereographic_South_Pole"!==l.projName&&"Polar Stereographic (variant B)"!==l.projName||(l.lat0=RG(l.lat1>0?90:-90),l.lat_ts=l.lat1)}(c),c}function LG(l){var d=this;if(2===arguments.length){var b=arguments[1];"string"==typeof b?"+"===b.charAt(0)?LG[l]=aG(arguments[1]):LG[l]=oG(arguments[1]):LG[l]=b}else if(1===arguments.length){if(Array.isArray(l))return l.map((function(l){Array.isArray(l)?LG.apply(d,l):LG(l)}));if("string"==typeof l){if(l in LG)return LG[l]}else"EPSG"in l?LG["EPSG:"+l.EPSG]=l:"ESRI"in l?LG["ESRI:"+l.ESRI]=l:"IAU2000"in l?LG["IAU2000:"+l.IAU2000]=l:console.log(l);return}}!function(l){l("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),l("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),l("EPSG:3857","+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"),l.WGS84=l["EPSG:4326"],l["EPSG:3785"]=l["EPSG:3857"],l.GOOGLE=l["EPSG:3857"],l["EPSG:900913"]=l["EPSG:3857"],l["EPSG:102113"]=l["EPSG:3857"]}(LG);var KG=["PROJECTEDCRS","PROJCRS","GEOGCS","GEOCCS","PROJCS","LOCAL_CS","GEODCRS","GEODETICCRS","GEODETICDATUM","ENGCRS","ENGINEERINGCRS"];var HG=["3857","900913","3785","102113"];function xG(l){if(!function(l){return"string"==typeof l}(l))return l;if(function(l){return l in LG}(l))return LG[l];if(function(l){return KG.some((function(d){return l.indexOf(d)>-1}))}(l)){var d=oG(l);if(function(l){var d=uG(l,"authority");if(d){var b=uG(d,"epsg");return b&&HG.indexOf(b)>-1}}(d))return LG["EPSG:3857"];var b=function(l){var d=uG(l,"extension");if(d)return uG(d,"proj4")}(d);return b?aG(b):d}return function(l){return"+"===l[0]}(l)?aG(l):void 0}function SG(l,d){var b,Z;if(l=l||{},!d)return l;for(Z in d)void 0!==(b=d[Z])&&(l[Z]=b);return l}function YG(l,d,b){var Z=l*d;return b/Math.sqrt(1-Z*Z)}function eG(l){return l<0?-1:1}function JG(l){return Math.abs(l)<=mG?l:l-eG(l)*cG}function zG(l,d,b){var Z=l*b,c=.5*l;return Z=Math.pow((1-Z)/(1+Z),c),Math.tan(.5*($X-d))/Z}function vG(l,d){for(var b,Z,c=.5*l,m=$X-2*Math.atan(d),X=0;X<=15;X++)if(b=l*Math.sin(m),m+=Z=$X-2*Math.atan(d*Math.pow((1-b)/(1+b),c))-m,Math.abs(Z)<=1e-10)return m;return-9999}function TG(l){return l}var MG=[{init:function(){var l=this.b/this.a;this.es=1-l*l,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.sphere?this.k0=Math.cos(this.lat_ts):this.k0=YG(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k?this.k0=this.k:this.k0=1)},forward:function(l){var d,b,Z=l.x,c=l.y;if(c*bG>90&&c*bG<-90&&Z*bG>180&&Z*bG<-180)return null;if(Math.abs(Math.abs(c)-$X)<=lG)return null;if(this.sphere)d=this.x0+this.a*this.k0*JG(Z-this.long0),b=this.y0+this.a*this.k0*Math.log(Math.tan(ZG+.5*c));else{var m=Math.sin(c),X=zG(this.e,c,m);d=this.x0+this.a*this.k0*JG(Z-this.long0),b=this.y0-this.a*this.k0*Math.log(X)}return l.x=d,l.y=b,l},inverse:function(l){var d,b,Z=l.x-this.x0,c=l.y-this.y0;if(this.sphere)b=$X-2*Math.atan(Math.exp(-c/(this.a*this.k0)));else{var m=Math.exp(-c/(this.a*this.k0));if(-9999===(b=vG(this.e,m)))return null}return d=JG(this.long0+Z/(this.a*this.k0)),l.x=d,l.y=b,l},names:["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{init:function(){},forward:TG,inverse:TG,names:["longlat","identity"]}],CG={},FG=[];function IG(l,d){var b=FG.length;return l.names?(FG[b]=l,l.names.forEach((function(l){CG[l.toLowerCase()]=b})),this):(console.log(d),!0)}var kG={start:function(){MG.forEach(IG)},add:IG,get:function(l){if(!l)return!1;var d=l.toLowerCase();return void 0!==CG[d]&&FG[CG[d]]?FG[CG[d]]:void 0}},NG={MERIT:{a:6378137,rf:298.257,ellipseName:"MERIT 1983"},SGS85:{a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},GRS80:{a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},IAU76:{a:6378140,rf:298.257,ellipseName:"IAU 1976"},airy:{a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},APL4:{a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},NWL9D:{a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},mod_airy:{a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},andrae:{a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},aust_SA:{a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},GRS67:{a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},bessel:{a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},bess_nam:{a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},clrk66:{a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},clrk80:{a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},clrk58:{a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},CPM:{a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},delmbr:{a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},engelis:{a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},evrst30:{a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},evrst48:{a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},evrst56:{a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},evrst69:{a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},evrstSS:{a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},fschr60:{a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},fschr60m:{a:6378155,rf:298.3,ellipseName:"Fischer 1960"},fschr68:{a:6378150,rf:298.3,ellipseName:"Fischer 1968"},helmert:{a:6378200,rf:298.3,ellipseName:"Helmert 1906"},hough:{a:6378270,rf:297,ellipseName:"Hough"},intl:{a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},kaula:{a:6378163,rf:298.24,ellipseName:"Kaula 1961"},lerch:{a:6378139,rf:298.257,ellipseName:"Lerch 1979"},mprts:{a:6397300,rf:191,ellipseName:"Maupertius 1738"},new_intl:{a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},plessis:{a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},krass:{a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},SEasia:{a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},walbeck:{a:6376896,b:6355834.8467,ellipseName:"Walbeck"},WGS60:{a:6378165,rf:298.3,ellipseName:"WGS 60"},WGS66:{a:6378145,rf:298.25,ellipseName:"WGS 66"},WGS7:{a:6378135,rf:298.26,ellipseName:"WGS 72"}},gG=NG.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"};NG.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"};var PG={};PG.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},PG.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},PG.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},PG.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},PG.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},PG.potsdam={towgs84:"598.1,73.7,418.2,0.202,0.045,-2.455,6.7",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},PG.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},PG.hermannskogel={towgs84:"577.326,90.129,463.919,5.137,1.474,5.297,2.4232",ellipse:"bessel",datumName:"Hermannskogel"},PG.osni52={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"airy",datumName:"Irish National"},PG.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},PG.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},PG.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},PG.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},PG.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},PG.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},PG.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},PG.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"};var BG={};function wG(l){if(0===l.length)return null;var d="@"===l[0];return d&&(l=l.slice(1)),"null"===l?{name:"null",mandatory:!d,grid:null,isNull:!0}:{name:l,mandatory:!d,grid:BG[l]||null,isNull:!1}}function UG(l){return l/3600*Math.PI/180}function rG(l,d,b){return String.fromCharCode.apply(null,new Uint8Array(l.buffer.slice(d,b)))}function QG(l){return l.map((function(l){return[UG(l.longitudeShift),UG(l.latitudeShift)]}))}function jG(l,d,b){return{name:rG(l,d+8,d+16).trim(),parent:rG(l,d+24,d+24+8).trim(),lowerLatitude:l.getFloat64(d+72,b),upperLatitude:l.getFloat64(d+88,b),lowerLongitude:l.getFloat64(d+104,b),upperLongitude:l.getFloat64(d+120,b),latitudeInterval:l.getFloat64(d+136,b),longitudeInterval:l.getFloat64(d+152,b),gridNodeCount:l.getInt32(d+168,b)}}function fG(l,d,b,Z){for(var c=d+176,m=[],X=0;X<b.gridNodeCount;X++){var G={latitudeShift:l.getFloat32(c+16*X,Z),longitudeShift:l.getFloat32(c+16*X+4,Z),latitudeAccuracy:l.getFloat32(c+16*X+8,Z),longitudeAccuracy:l.getFloat32(c+16*X+12,Z)};m.push(G)}return m}function EG(l,d){if(!(this instanceof EG))return new EG(l);d=d||function(l){if(l)throw l};var b=xG(l);if("object"===h(b)){var Z=EG.projections.get(b.projName);if(Z){if(b.datumCode&&"none"!==b.datumCode){var c=uG(PG,b.datumCode);c&&(b.datum_params=b.datum_params||(c.towgs84?c.towgs84.split(","):null),b.ellps=c.ellipse,b.datumName=c.datumName?c.datumName:b.datumCode)}b.k0=b.k0||1,b.axis=b.axis||"enu",b.ellps=b.ellps||"wgs84",b.lat1=b.lat1||b.lat0;var m,X,G,W,u,a,s,V=function(l,d,b,Z,c){if(!l){var m=uG(NG,Z);m||(m=gG),l=m.a,d=m.b,b=m.rf}return b&&!d&&(d=(1-1/b)*l),(0===b||Math.abs(l-d)<lG)&&(c=!0,d=l),{a:l,b:d,rf:b,sphere:c}}(b.a,b.b,b.rf,b.ellps,b.sphere),y=(m=V.a,X=V.b,V.rf,G=b.R_A,a=((W=m*m)-(u=X*X))/W,s=0,G?(W=(m*=1-a*(.16666666666666666+a*(.04722222222222222+.022156084656084655*a)))*m,a=0):s=Math.sqrt(a),{es:a,e:s,ep2:(W-u)/u}),p=function(l){return void 0===l?null:l.split(",").map(wG)}(b.nadgrids),t=b.datum||function(l,d,b,Z,c,m,X){var G={};return G.datum_type=void 0===l||"none"===l?5:4,d&&(G.datum_params=d.map(parseFloat),0===G.datum_params[0]&&0===G.datum_params[1]&&0===G.datum_params[2]||(G.datum_type=1),G.datum_params.length>3&&(0===G.datum_params[3]&&0===G.datum_params[4]&&0===G.datum_params[5]&&0===G.datum_params[6]||(G.datum_type=2,G.datum_params[3]*=qX,G.datum_params[4]*=qX,G.datum_params[5]*=qX,G.datum_params[6]=G.datum_params[6]/1e6+1))),X&&(G.datum_type=3,G.grids=X),G.a=b,G.b=Z,G.es=c,G.ep2=m,G}(b.datumCode,b.datum_params,V.a,V.b,y.es,y.ep2,p);SG(this,b),SG(this,Z),this.a=V.a,this.b=V.b,this.rf=V.rf,this.sphere=V.sphere,this.es=y.es,this.e=y.e,this.ep2=y.ep2,this.datum=t,this.init(),d(null,this)}else d(l)}else d(l)}function OG(l,d,b){var Z,c,m,X,G=l.x,W=l.y,u=l.z?l.z:0;if(W<-$X&&W>-1.001*$X)W=-$X;else if(W>$X&&W<1.001*$X)W=$X;else{if(W<-$X)return{x:-1/0,y:-1/0,z:l.z};if(W>$X)return{x:1/0,y:1/0,z:l.z}}return G>Math.PI&&(G-=2*Math.PI),c=Math.sin(W),X=Math.cos(W),m=c*c,{x:((Z=b/Math.sqrt(1-d*m))+u)*X*Math.cos(G),y:(Z+u)*X*Math.sin(G),z:(Z*(1-d)+u)*c}}function DG(l,d,b,Z){var c,m,X,G,W,u,a,h,s,V,y,p,t,n,i,R=1e-12,o=l.x,L=l.y,K=l.z?l.z:0;if(c=Math.sqrt(o*o+L*L),m=Math.sqrt(o*o+L*L+K*K),c/b<R){if(n=0,m/b<R)return $X,i=-Z,{x:l.x,y:l.y,z:l.z}}else n=Math.atan2(L,o);X=K/m,h=(G=c/m)*(1-d)*(W=1/Math.sqrt(1-d*(2-d)*G*G)),s=X*W,t=0;do{t++,u=d*(a=b/Math.sqrt(1-d*s*s))/(a+(i=c*h+K*s-a*(1-d*s*s))),p=(y=X*(W=1/Math.sqrt(1-u*(2-u)*G*G)))*h-(V=G*(1-u)*W)*s,h=V,s=y}while(p*p>1e-24&&t<30);return{x:n,y:Math.atan(y/Math.abs(V)),z:i}}function AG(l){return 1===l||2===l}function _G(l,d,b){if(function(l,d){return l.datum_type===d.datum_type&&!(l.a!==d.a||Math.abs(l.es-d.es)>5e-11)&&(1===l.datum_type?l.datum_params[0]===d.datum_params[0]&&l.datum_params[1]===d.datum_params[1]&&l.datum_params[2]===d.datum_params[2]:2!==l.datum_type||l.datum_params[0]===d.datum_params[0]&&l.datum_params[1]===d.datum_params[1]&&l.datum_params[2]===d.datum_params[2]&&l.datum_params[3]===d.datum_params[3]&&l.datum_params[4]===d.datum_params[4]&&l.datum_params[5]===d.datum_params[5]&&l.datum_params[6]===d.datum_params[6])}(l,d))return b;if(5===l.datum_type||5===d.datum_type)return b;var Z=l.a,c=l.es;if(3===l.datum_type){if(0!==qG(l,!1,b))return;Z=AX,c=_X}var m=d.a,X=d.b,G=d.es;if(3===d.datum_type&&(m=AX,X=6356752.314,G=_X),c===G&&Z===m&&!AG(l.datum_type)&&!AG(d.datum_type))return b;if((b=OG(b,c,Z),AG(l.datum_type)&&(b=function(l,d,b){if(1===d)return{x:l.x+b[0],y:l.y+b[1],z:l.z+b[2]};if(2===d){var Z=b[0],c=b[1],m=b[2],X=b[3],G=b[4],W=b[5],u=b[6];return{x:u*(l.x-W*l.y+G*l.z)+Z,y:u*(W*l.x+l.y-X*l.z)+c,z:u*(-G*l.x+X*l.y+l.z)+m}}}(b,l.datum_type,l.datum_params)),AG(d.datum_type)&&(b=function(l,d,b){if(1===d)return{x:l.x-b[0],y:l.y-b[1],z:l.z-b[2]};if(2===d){var Z=b[0],c=b[1],m=b[2],X=b[3],G=b[4],W=b[5],u=b[6],a=(l.x-Z)/u,h=(l.y-c)/u,s=(l.z-m)/u;return{x:a+W*h-G*s,y:-W*a+h+X*s,z:G*a-X*h+s}}}(b,d.datum_type,d.datum_params)),b=DG(b,G,m,X),3===d.datum_type)&&0!==qG(d,!0,b))return;return b}function qG(l,d,b){if(null===l.grids||0===l.grids.length)return console.log("Grid shift grids not found"),-1;for(var Z={x:-b.x,y:b.y},c={x:Number.NaN,y:Number.NaN},m=[],X=0;X<l.grids.length;X++){var G=l.grids[X];if(m.push(G.name),G.isNull){c=Z;break}if(null!==G.grid){var W=G.grid.subgrids[0],u=(Math.abs(W.del[1])+Math.abs(W.del[0]))/1e4,a=W.ll[0]-u,h=W.ll[1]-u,s=W.ll[0]+(W.lim[0]-1)*W.del[0]+u,V=W.ll[1]+(W.lim[1]-1)*W.del[1]+u;if(!(h>Z.y||a>Z.x||V<Z.y||s<Z.x||(c=$G(Z,d,W),isNaN(c.x))))break}else if(G.mandatory)return console.log("Unable to find mandatory grid '"+G.name+"'"),-1}return isNaN(c.x)?(console.log("Failed to find a grid shift table for location '"+-Z.x*bG+" "+Z.y*bG+" tried: '"+m+"'"),-1):(b.x=-c.x,b.y=c.y,0)}function $G(l,d,b){var Z={x:Number.NaN,y:Number.NaN};if(isNaN(l.x))return Z;var c={x:l.x,y:l.y};c.x-=b.ll[0],c.y-=b.ll[1],c.x=JG(c.x-Math.PI)+Math.PI;var m=lW(c,b);if(d){if(isNaN(m.x))return Z;m.x=c.x-m.x,m.y=c.y-m.y;var X,G,W=9;do{if(G=lW(m,b),isNaN(G.x)){console.log("Inverse grid shift iteration failed, presumably at grid edge. Using first approximation.");break}X={x:c.x-(G.x+m.x),y:c.y-(G.y+m.y)},m.x+=X.x,m.y+=X.y}while(W--&&Math.abs(X.x)>1e-12&&Math.abs(X.y)>1e-12);if(W<0)return console.log("Inverse grid shift iterator failed to converge."),Z;Z.x=JG(m.x+b.ll[0]),Z.y=m.y+b.ll[1]}else isNaN(m.x)||(Z.x=l.x+m.x,Z.y=l.y+m.y);return Z}function lW(l,d){var b,Z={x:l.x/d.del[0],y:l.y/d.del[1]},c=Math.floor(Z.x),m=Math.floor(Z.y),X=Z.x-1*c,G=Z.y-1*m,W={x:Number.NaN,y:Number.NaN};if(c<0||c>=d.lim[0])return W;if(m<0||m>=d.lim[1])return W;b=m*d.lim[0]+c;var u=d.cvs[b][0],a=d.cvs[b][1];b++;var h=d.cvs[b][0],s=d.cvs[b][1];b+=d.lim[0];var V=d.cvs[b][0],y=d.cvs[b][1];b--;var p=d.cvs[b][0],t=d.cvs[b][1],n=X*G,i=X*(1-G),R=(1-X)*(1-G),o=(1-X)*G;return W.x=R*u+i*h+o*p+n*V,W.y=R*a+i*s+o*t+n*y,W}function dW(l,d,b){var Z,c,m,X=b.x,G=b.y,W=b.z||0,u={};for(m=0;m<3;m++)if(!d||2!==m||void 0!==b.z)switch(0===m?(Z=X,c=-1!=="ew".indexOf(l.axis[m])?"x":"y"):1===m?(Z=G,c=-1!=="ns".indexOf(l.axis[m])?"y":"x"):(Z=W,c="z"),l.axis[m]){case"e":case"n":u[c]=Z;break;case"w":case"s":u[c]=-Z;break;case"u":void 0!==b[c]&&(u.z=Z);break;case"d":void 0!==b[c]&&(u.z=-Z);break;default:return null}return u}function bW(l){var d={x:l[0],y:l[1]};return l.length>2&&(d.z=l[2]),l.length>3&&(d.m=l[3]),d}function ZW(l){if("function"==typeof Number.isFinite){if(Number.isFinite(l))return;throw new TypeError("coordinates must be finite numbers")}if("number"!=typeof l||l!=l||!isFinite(l))throw new TypeError("coordinates must be finite numbers")}function cW(l,d,b,Z){var c;if(Array.isArray(b)&&(b=bW(b)),function(l){ZW(l.x),ZW(l.y)}(b),l.datum&&d.datum&&function(l,d){return(1===l.datum.datum_type||2===l.datum.datum_type)&&"WGS84"!==d.datumCode||(1===d.datum.datum_type||2===d.datum.datum_type)&&"WGS84"!==l.datumCode}(l,d)&&(b=cW(l,c=new EG("WGS84"),b,Z),l=c),Z&&"enu"!==l.axis&&(b=dW(l,!1,b)),"longlat"===l.projName)b={x:b.x*dG,y:b.y*dG,z:b.z||0};else if(l.to_meter&&(b={x:b.x*l.to_meter,y:b.y*l.to_meter,z:b.z||0}),!(b=l.inverse(b)))return;if(l.from_greenwich&&(b.x+=l.from_greenwich),b=_G(l.datum,d.datum,b))return d.from_greenwich&&(b={x:b.x-d.from_greenwich,y:b.y,z:b.z||0}),"longlat"===d.projName?b={x:b.x*bG,y:b.y*bG,z:b.z||0}:(b=d.forward(b),d.to_meter&&(b={x:b.x/d.to_meter,y:b.y/d.to_meter,z:b.z||0})),Z&&"enu"!==d.axis?dW(d,!0,b):b}EG.projections=kG,EG.projections.start();var mW=EG("WGS84");function XW(l,d,b,Z){var c,m,X;return Array.isArray(b)?(c=cW(l,d,b,Z)||{x:NaN,y:NaN},b.length>2?void 0!==l.name&&"geocent"===l.name||void 0!==d.name&&"geocent"===d.name?"number"==typeof c.z?[c.x,c.y,c.z].concat(b.splice(3)):[c.x,c.y,b[2]].concat(b.splice(3)):[c.x,c.y].concat(b.splice(2)):[c.x,c.y]):(m=cW(l,d,b,Z),2===(X=Object.keys(b)).length||X.forEach((function(Z){if(void 0!==l.name&&"geocent"===l.name||void 0!==d.name&&"geocent"===d.name){if("x"===Z||"y"===Z||"z"===Z)return}else if("x"===Z||"y"===Z)return;m[Z]=b[Z]})),m)}function GW(l){return l instanceof EG?l:l.oProj?l.oProj:EG(l)}function WW(l,d,b){l=GW(l);var Z,c=!1;return void 0===d?(d=l,l=mW,c=!0):(void 0!==d.x||Array.isArray(d))&&(b=d,d=l,l=mW,c=!0),d=GW(d),b?XW(l,d,b):(Z={forward:function(b,Z){return XW(l,d,b,Z)},inverse:function(b,Z){return XW(d,l,b,Z)}},c&&(Z.oProj=d),Z)}var uW="AJSAJS",aW="AFAFAF",hW=65,sW=73,VW=79,yW=86,pW=90,tW={forward:nW,inverse:function(l){var d=LW(xW(l.toUpperCase()));if(d.lat&&d.lon)return[d.lon,d.lat,d.lon,d.lat];return[d.left,d.bottom,d.right,d.top]},toPoint:iW};function nW(l,d){return d=d||5,function(l,d){var b="00000"+l.easting,Z="00000"+l.northing;return l.zoneNumber+l.zoneLetter+(V=l.easting,y=l.northing,p=l.zoneNumber,t=HW(p),n=Math.floor(V/1e5),i=Math.floor(y/1e5)%20,c=n,m=i,X=t,G=X-1,W=uW.charCodeAt(G),u=aW.charCodeAt(G),a=W+c-1,h=u+m,s=!1,a>pW&&(a=a-pW+hW-1,s=!0),(a===sW||W<sW&&a>sW||(a>sW||W<sW)&&s)&&a++,(a===VW||W<VW&&a>VW||(a>VW||W<VW)&&s)&&++a===sW&&a++,a>pW&&(a=a-pW+hW-1),h>yW?(h=h-yW+hW-1,s=!0):s=!1,(h===sW||u<sW&&h>sW||(h>sW||u<sW)&&s)&&h++,(h===VW||u<VW&&h>VW||(h>VW||u<VW)&&s)&&++h===sW&&h++,h>yW&&(h=h-yW+hW-1),String.fromCharCode(a)+String.fromCharCode(h))+b.substr(b.length-5,d)+Z.substr(Z.length-5,d);var c,m,X,G,W,u,a,h,s;var V,y,p,t,n,i}(function(l){var d,b,Z,c,m,X,G,W,u=l.lat,a=l.lon,h=6378137,s=.00669438,V=.9996,y=RW(u),p=RW(a);W=Math.floor((a+180)/6)+1,180===a&&(W=60);u>=56&&u<64&&a>=3&&a<12&&(W=32);u>=72&&u<84&&(a>=0&&a<9?W=31:a>=9&&a<21?W=33:a>=21&&a<33?W=35:a>=33&&a<42&&(W=37));G=RW(6*(W-1)-180+3),d=s/(1-s),b=h/Math.sqrt(1-s*Math.sin(y)*Math.sin(y)),Z=Math.tan(y)*Math.tan(y),c=d*Math.cos(y)*Math.cos(y),m=Math.cos(y)*(p-G),X=h*((1-s/4-3*s*s/64-5*s*s*s/256)*y-(3*s/8+3*s*s/32+45*s*s*s/1024)*Math.sin(2*y)+(15*s*s/256+45*s*s*s/1024)*Math.sin(4*y)-35*s*s*s/3072*Math.sin(6*y));var t=V*b*(m+(1-Z+c)*m*m*m/6+(5-18*Z+Z*Z+72*c-58*d)*m*m*m*m*m/120)+5e5,n=V*(X+b*Math.tan(y)*(m*m/2+(5-Z+9*c+4*c*c)*m*m*m*m/24+(61-58*Z+Z*Z+600*c-330*d)*m*m*m*m*m*m/720));u<0&&(n+=1e7);return{northing:Math.round(n),easting:Math.round(t),zoneNumber:W,zoneLetter:KW(u)}}({lat:l[1],lon:l[0]}),d)}function iW(l){var d=LW(xW(l.toUpperCase()));return d.lat&&d.lon?[d.lon,d.lat]:[(d.left+d.right)/2,(d.top+d.bottom)/2]}function RW(l){return l*(Math.PI/180)}function oW(l){return l/Math.PI*180}function LW(l){var d=l.northing,b=l.easting,Z=l.zoneLetter,c=l.zoneNumber;if(c<0||c>60)return null;var m,X,G,W,u,a,h,s,V,y=.9996,p=6378137,t=.00669438,n=(1-Math.sqrt(.99330562))/(1+Math.sqrt(.99330562)),i=b-5e5,R=d;Z<"N"&&(R-=1e7),h=6*(c-1)-180+3,m=.006739496752268451,V=(s=R/y/6367449.145945056)+(3*n/2-27*n*n*n/32)*Math.sin(2*s)+(21*n*n/16-55*n*n*n*n/32)*Math.sin(4*s)+151*n*n*n/96*Math.sin(6*s),X=p/Math.sqrt(1-t*Math.sin(V)*Math.sin(V)),G=Math.tan(V)*Math.tan(V),W=m*Math.cos(V)*Math.cos(V),u=.99330562*p/Math.pow(1-t*Math.sin(V)*Math.sin(V),1.5),a=i/(X*y);var o=V-X*Math.tan(V)/u*(a*a/2-(5+3*G+10*W-4*W*W-9*m)*a*a*a*a/24+(61+90*G+298*W+45*G*G-1.6983531815716497-3*W*W)*a*a*a*a*a*a/720);o=oW(o);var L,K=(a-(1+2*G+W)*a*a*a/6+(5-2*W+28*G-3*W*W+8*m+24*G*G)*a*a*a*a*a/120)/Math.cos(V);if(K=h+oW(K),l.accuracy){var H=LW({northing:l.northing+l.accuracy,easting:l.easting+l.accuracy,zoneLetter:l.zoneLetter,zoneNumber:l.zoneNumber});L={top:H.lat,right:H.lon,bottom:o,left:K}}else L={lat:o,lon:K};return L}function KW(l){var d="Z";return 84>=l&&l>=72?d="X":72>l&&l>=64?d="W":64>l&&l>=56?d="V":56>l&&l>=48?d="U":48>l&&l>=40?d="T":40>l&&l>=32?d="S":32>l&&l>=24?d="R":24>l&&l>=16?d="Q":16>l&&l>=8?d="P":8>l&&l>=0?d="N":0>l&&l>=-8?d="M":-8>l&&l>=-16?d="L":-16>l&&l>=-24?d="K":-24>l&&l>=-32?d="J":-32>l&&l>=-40?d="H":-40>l&&l>=-48?d="G":-48>l&&l>=-56?d="F":-56>l&&l>=-64?d="E":-64>l&&l>=-72?d="D":-72>l&&l>=-80&&(d="C"),d}function HW(l){var d=l%6;return 0===d&&(d=6),d}function xW(l){if(l&&0===l.length)throw"MGRSPoint coverting from nothing";for(var d,b=l.length,Z=null,c="",m=0;!/[A-Z]/.test(d=l.charAt(m));){if(m>=2)throw"MGRSPoint bad conversion from: "+l;c+=d,m++}var X=parseInt(c,10);if(0===m||m+3>b)throw"MGRSPoint bad conversion from: "+l;var G=l.charAt(m++);if(G<="A"||"B"===G||"Y"===G||G>="Z"||"I"===G||"O"===G)throw"MGRSPoint zone letter "+G+" not handled: "+l;Z=l.substring(m,m+=2);for(var W=HW(X),u=function(l,d){var b=uW.charCodeAt(d-1),Z=1e5,c=!1;for(;b!==l.charCodeAt(0);){if(++b===sW&&b++,b===VW&&b++,b>pW){if(c)throw"Bad character: "+l;b=hW,c=!0}Z+=1e5}return Z}(Z.charAt(0),W),a=function(l,d){if(l>"V")throw"MGRSPoint given invalid Northing "+l;var b=aW.charCodeAt(d-1),Z=0,c=!1;for(;b!==l.charCodeAt(0);){if(++b===sW&&b++,b===VW&&b++,b>yW){if(c)throw"Bad character: "+l;b=hW,c=!0}Z+=1e5}return Z}(Z.charAt(1),W);a<SW(G);)a+=2e6;var h=b-m;if(h%2!=0)throw"MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters"+l;var s,V,y,p=h/2,t=0,n=0;return p>0&&(s=1e5/Math.pow(10,p),V=l.substring(m,m+p),t=parseFloat(V)*s,y=l.substring(m+p),n=parseFloat(y)*s),{easting:t+u,northing:n+a,zoneLetter:G,zoneNumber:X,accuracy:s}}function SW(l){var d;switch(l){case"C":d=11e5;break;case"D":d=2e6;break;case"E":d=28e5;break;case"F":d=37e5;break;case"G":d=46e5;break;case"H":d=55e5;break;case"J":d=64e5;break;case"K":d=73e5;break;case"L":d=82e5;break;case"M":d=91e5;break;case"N":d=0;break;case"P":d=8e5;break;case"Q":d=17e5;break;case"R":d=26e5;break;case"S":d=35e5;break;case"T":d=44e5;break;case"U":d=53e5;break;case"V":d=62e5;break;case"W":d=7e6;break;case"X":d=79e5;break;default:d=-1}if(d>=0)return d;throw"Invalid zone letter: "+l}function YW(l,d,b){if(!(this instanceof YW))return new YW(l,d,b);if(Array.isArray(l))this.x=l[0],this.y=l[1],this.z=l[2]||0;else if("object"===h(l))this.x=l.x,this.y=l.y,this.z=l.z||0;else if("string"==typeof l&&void 0===d){var Z=l.split(",");this.x=parseFloat(Z[0],10),this.y=parseFloat(Z[1],10),this.z=parseFloat(Z[2],10)||0}else this.x=l,this.y=d,this.z=b||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}YW.fromMGRS=function(l){return new YW(iW(l))},YW.prototype.toMGRS=function(l){return nW([this.x,this.y],l)};var eW=.046875,JW=.01953125,zW=.01068115234375;function vW(l){var d=[];d[0]=1-l*(.25+l*(eW+l*(JW+l*zW))),d[1]=l*(.75-l*(eW+l*(JW+l*zW)));var b=l*l;return d[2]=b*(.46875-l*(.013020833333333334+.007120768229166667*l)),b*=l,d[3]=b*(.3645833333333333-.005696614583333333*l),d[4]=b*l*.3076171875,d}function TW(l,d,b,Z){return b*=d,d*=d,Z[0]*l-b*(Z[1]+d*(Z[2]+d*(Z[3]+d*Z[4])))}function MW(l,d,b){for(var Z=1/(1-d),c=l,m=20;m;--m){var X=Math.sin(c),G=1-d*X*X;if(c-=G=(TW(c,X,Math.cos(c),b)-l)*(G*Math.sqrt(G))*Z,Math.abs(G)<lG)return c}return c}var CW={init:function(){this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.es&&(this.en=vW(this.es),this.ml0=TW(this.lat0,Math.sin(this.lat0),Math.cos(this.lat0),this.en))},forward:function(l){var d,b,Z,c=l.x,m=l.y,X=JG(c-this.long0),G=Math.sin(m),W=Math.cos(m);if(this.es){var u=W*X,a=Math.pow(u,2),h=this.ep2*Math.pow(W,2),s=Math.pow(h,2),V=Math.abs(W)>lG?Math.tan(m):0,y=Math.pow(V,2),p=Math.pow(y,2);d=1-this.es*Math.pow(G,2),u/=Math.sqrt(d);var t=TW(m,G,W,this.en);b=this.a*(this.k0*u*(1+a/6*(1-y+h+a/20*(5-18*y+p+14*h-58*y*h+a/42*(61+179*p-p*y-479*y)))))+this.x0,Z=this.a*(this.k0*(t-this.ml0+G*X*u/2*(1+a/12*(5-y+9*h+4*s+a/30*(61+p-58*y+270*h-330*y*h+a/56*(1385+543*p-p*y-3111*y))))))+this.y0}else{var n=W*Math.sin(X);if(Math.abs(Math.abs(n)-1)<lG)return 93;if(b=.5*this.a*this.k0*Math.log((1+n)/(1-n))+this.x0,Z=W*Math.cos(X)/Math.sqrt(1-Math.pow(n,2)),(n=Math.abs(Z))>=1){if(n-1>lG)return 93;Z=0}else Z=Math.acos(Z);m<0&&(Z=-Z),Z=this.a*this.k0*(Z-this.lat0)+this.y0}return l.x=b,l.y=Z,l},inverse:function(l){var d,b,Z,c,m=(l.x-this.x0)*(1/this.a),X=(l.y-this.y0)*(1/this.a);if(this.es)if(b=MW(d=this.ml0+X/this.k0,this.es,this.en),Math.abs(b)<$X){var G=Math.sin(b),W=Math.cos(b),u=Math.abs(W)>lG?Math.tan(b):0,a=this.ep2*Math.pow(W,2),h=Math.pow(a,2),s=Math.pow(u,2),V=Math.pow(s,2);d=1-this.es*Math.pow(G,2);var y=m*Math.sqrt(d)/this.k0,p=Math.pow(y,2);Z=b-(d*=u)*p/(1-this.es)*.5*(1-p/12*(5+3*s-9*a*s+a-4*h-p/30*(61+90*s-252*a*s+45*V+46*a-p/56*(1385+3633*s+4095*V+1574*V*s)))),c=JG(this.long0+y*(1-p/6*(1+2*s+a-p/20*(5+28*s+24*V+8*a*s+6*a-p/42*(61+662*s+1320*V+720*V*s))))/W)}else Z=$X*eG(X),c=0;else{var t=Math.exp(m/this.k0),n=.5*(t-1/t),i=this.lat0+X/this.k0,R=Math.cos(i);d=Math.sqrt((1-Math.pow(R,2))/(1+Math.pow(n,2))),Z=Math.asin(d),X<0&&(Z=-Z),c=0===n&&0===R?0:JG(Math.atan2(n,R)+this.long0)}return l.x=c,l.y=Z,l},names:["Fast_Transverse_Mercator","Fast Transverse Mercator"]};function FW(l){var d=Math.exp(l);return d=(d-1/d)/2}function IW(l,d){l=Math.abs(l),d=Math.abs(d);var b=Math.max(l,d),Z=Math.min(l,d)/(b||1);return b*Math.sqrt(1+Math.pow(Z,2))}function kW(l){var d=Math.abs(l);return d=function(l){var d=1+l,b=d-1;return 0===b?l:l*Math.log(d)/b}(d*(1+d/(IW(1,d)+1))),l<0?-d:d}function NW(l,d){for(var b,Z=2*Math.cos(2*d),c=l.length-1,m=l[c],X=0;--c>=0;)b=Z*m-X+l[c],X=m,m=b;return d+b*Math.sin(2*d)}function gW(l,d,b){for(var Z,c,m=Math.sin(d),X=Math.cos(d),G=FW(b),W=function(l){var d=Math.exp(l);return(d+1/d)/2}(b),u=2*X*W,a=-2*m*G,h=l.length-1,s=l[h],V=0,y=0,p=0;--h>=0;)Z=y,c=V,s=u*(y=s)-Z-a*(V=p)+l[h],p=a*y-c+u*V;return[(u=m*W)*s-(a=X*G)*p,u*p+a*s]}var PW={init:function(){if(!this.approx&&(isNaN(this.es)||this.es<=0))throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.');this.approx&&(CW.init.apply(this),this.forward=CW.forward,this.inverse=CW.inverse),this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var l=this.es/(1+Math.sqrt(1-this.es)),d=l/(2-l),b=d;this.cgb[0]=d*(2+d*(-2/3+d*(d*(116/45+d*(26/45+d*(-2854/675)))-2))),this.cbg[0]=d*(d*(2/3+d*(4/3+d*(-82/45+d*(32/45+d*(4642/4725)))))-2),b*=d,this.cgb[1]=b*(7/3+d*(d*(-227/45+d*(2704/315+d*(2323/945)))-1.6)),this.cbg[1]=b*(5/3+d*(-16/15+d*(-13/9+d*(904/315+d*(-1522/945))))),b*=d,this.cgb[2]=b*(56/15+d*(-136/35+d*(-1262/105+d*(73814/2835)))),this.cbg[2]=b*(-26/15+d*(34/21+d*(1.6+d*(-12686/2835)))),b*=d,this.cgb[3]=b*(4279/630+d*(-332/35+d*(-399572/14175))),this.cbg[3]=b*(1237/630+d*(d*(-24832/14175)-2.4)),b*=d,this.cgb[4]=b*(4174/315+d*(-144838/6237)),this.cbg[4]=b*(-734/315+d*(109598/31185)),b*=d,this.cgb[5]=b*(601676/22275),this.cbg[5]=b*(444337/155925),b=Math.pow(d,2),this.Qn=this.k0/(1+d)*(1+b*(1/4+b*(1/64+b/256))),this.utg[0]=d*(d*(2/3+d*(-37/96+d*(1/360+d*(81/512+d*(-96199/604800)))))-.5),this.gtu[0]=d*(.5+d*(-2/3+d*(5/16+d*(41/180+d*(-127/288+d*(7891/37800)))))),this.utg[1]=b*(-1/48+d*(-1/15+d*(437/1440+d*(-46/105+d*(1118711/3870720))))),this.gtu[1]=b*(13/48+d*(d*(557/1440+d*(281/630+d*(-1983433/1935360)))-.6)),b*=d,this.utg[2]=b*(-17/480+d*(37/840+d*(209/4480+d*(-5569/90720)))),this.gtu[2]=b*(61/240+d*(-103/140+d*(15061/26880+d*(167603/181440)))),b*=d,this.utg[3]=b*(-4397/161280+d*(11/504+d*(830251/7257600))),this.gtu[3]=b*(49561/161280+d*(-179/168+d*(6601661/7257600))),b*=d,this.utg[4]=b*(-4583/161280+d*(108847/3991680)),this.gtu[4]=b*(34729/80640+d*(-3418889/1995840)),b*=d,this.utg[5]=b*(-20648693/638668800),this.gtu[5]=.6650675310896665*b;var Z=NW(this.cbg,this.lat0);this.Zb=-this.Qn*(Z+function(l,d){for(var b,Z=2*Math.cos(d),c=l.length-1,m=l[c],X=0;--c>=0;)b=Z*m-X+l[c],X=m,m=b;return Math.sin(d)*b}(this.gtu,2*Z))},forward:function(l){var d=JG(l.x-this.long0),b=l.y;b=NW(this.cbg,b);var Z=Math.sin(b),c=Math.cos(b),m=Math.sin(d),X=Math.cos(d);b=Math.atan2(Z,X*c),d=Math.atan2(m*c,IW(Z,c*X)),d=kW(Math.tan(d));var G,W,u=gW(this.gtu,2*b,2*d);return b+=u[0],d+=u[1],Math.abs(d)<=2.623395162778?(G=this.a*(this.Qn*d)+this.x0,W=this.a*(this.Qn*b+this.Zb)+this.y0):(G=1/0,W=1/0),l.x=G,l.y=W,l},inverse:function(l){var d,b,Z=(l.x-this.x0)*(1/this.a),c=(l.y-this.y0)*(1/this.a);if(c=(c-this.Zb)/this.Qn,Z/=this.Qn,Math.abs(Z)<=2.623395162778){var m=gW(this.utg,2*c,2*Z);c+=m[0],Z+=m[1],Z=Math.atan(FW(Z));var X=Math.sin(c),G=Math.cos(c),W=Math.sin(Z),u=Math.cos(Z);c=Math.atan2(X*u,IW(W,u*G)),d=JG((Z=Math.atan2(W,u*G))+this.long0),b=NW(this.cgb,c)}else d=1/0,b=1/0;return l.x=d,l.y=b,l},names:["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc","Transverse_Mercator","Transverse Mercator","tmerc"]};var BW={init:function(){var l=function(l,d){if(void 0===l){if((l=Math.floor(30*(JG(d)+Math.PI)/Math.PI)+1)<0)return 0;if(l>60)return 60}return l}(this.zone,this.long0);if(void 0===l)throw new Error("unknown utm zone");this.lat0=0,this.long0=(6*Math.abs(l)-183)*dG,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,PW.init.apply(this),this.forward=PW.forward,this.inverse=PW.inverse},names:["Universal Transverse Mercator System","utm"],dependsOn:"etmerc"};function wW(l,d){return Math.pow((1-l)/(1+l),d)}var UW={init:function(){var l=Math.sin(this.lat0),d=Math.cos(this.lat0);d*=d,this.rc=Math.sqrt(1-this.es)/(1-this.es*l*l),this.C=Math.sqrt(1+this.es*d*d/(1-this.es)),this.phic0=Math.asin(l/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+ZG)/(Math.pow(Math.tan(.5*this.lat0+ZG),this.C)*wW(this.e*l,this.ratexp))},forward:function(l){var d=l.x,b=l.y;return l.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*b+ZG),this.C)*wW(this.e*Math.sin(b),this.ratexp))-$X,l.x=this.C*d,l},inverse:function(l){for(var d=l.x/this.C,b=l.y,Z=Math.pow(Math.tan(.5*b+ZG)/this.K,1/this.C),c=20;c>0&&(b=2*Math.atan(Z*wW(this.e*Math.sin(l.y),-.5*this.e))-$X,!(Math.abs(b-l.y)<1e-14));--c)l.y=b;return c?(l.x=d,l.y=b,l):null},names:["gauss"]};var rW={init:function(){UW.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},forward:function(l){var d,b,Z,c;return l.x=JG(l.x-this.long0),UW.forward.apply(this,[l]),d=Math.sin(l.y),b=Math.cos(l.y),Z=Math.cos(l.x),c=this.k0*this.R2/(1+this.sinc0*d+this.cosc0*b*Z),l.x=c*b*Math.sin(l.x),l.y=c*(this.cosc0*d-this.sinc0*b*Z),l.x=this.a*l.x+this.x0,l.y=this.a*l.y+this.y0,l},inverse:function(l){var d,b,Z,c,m;if(l.x=(l.x-this.x0)/this.a,l.y=(l.y-this.y0)/this.a,l.x/=this.k0,l.y/=this.k0,m=Math.sqrt(l.x*l.x+l.y*l.y)){var X=2*Math.atan2(m,this.R2);d=Math.sin(X),b=Math.cos(X),c=Math.asin(b*this.sinc0+l.y*d*this.cosc0/m),Z=Math.atan2(l.x*d,m*this.cosc0*b-l.y*this.sinc0*d)}else c=this.phic0,Z=0;return l.x=Z,l.y=c,UW.inverse.apply(this,[l]),l.x=JG(l.x+this.long0),l},names:["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative","Double_Stereographic"]};var QW={init:function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=lG&&(this.k0=.5*(1+eG(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=lG&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=lG&&(this.k0=.5*this.cons*YG(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/zG(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=YG(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-$X,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},forward:function(l){var d,b,Z,c,m,X,G=l.x,W=l.y,u=Math.sin(W),a=Math.cos(W),h=JG(G-this.long0);return Math.abs(Math.abs(G-this.long0)-Math.PI)<=lG&&Math.abs(W+this.lat0)<=lG?(l.x=NaN,l.y=NaN,l):this.sphere?(d=2*this.k0/(1+this.sinlat0*u+this.coslat0*a*Math.cos(h)),l.x=this.a*d*a*Math.sin(h)+this.x0,l.y=this.a*d*(this.coslat0*u-this.sinlat0*a*Math.cos(h))+this.y0,l):(b=2*Math.atan(this.ssfn_(W,u,this.e))-$X,c=Math.cos(b),Z=Math.sin(b),Math.abs(this.coslat0)<=lG?(m=zG(this.e,W*this.con,this.con*u),X=2*this.a*this.k0*m/this.cons,l.x=this.x0+X*Math.sin(G-this.long0),l.y=this.y0-this.con*X*Math.cos(G-this.long0),l):(Math.abs(this.sinlat0)<lG?(d=2*this.a*this.k0/(1+c*Math.cos(h)),l.y=d*Z):(d=2*this.a*this.k0*this.ms1/(this.cosX0*(1+this.sinX0*Z+this.cosX0*c*Math.cos(h))),l.y=d*(this.cosX0*Z-this.sinX0*c*Math.cos(h))+this.y0),l.x=d*c*Math.sin(h)+this.x0,l))},inverse:function(l){var d,b,Z,c,m;l.x-=this.x0,l.y-=this.y0;var X=Math.sqrt(l.x*l.x+l.y*l.y);if(this.sphere){var G=2*Math.atan(X/(2*this.a*this.k0));return d=this.long0,b=this.lat0,X<=lG?(l.x=d,l.y=b,l):(b=Math.asin(Math.cos(G)*this.sinlat0+l.y*Math.sin(G)*this.coslat0/X),d=Math.abs(this.coslat0)<lG?this.lat0>0?JG(this.long0+Math.atan2(l.x,-1*l.y)):JG(this.long0+Math.atan2(l.x,l.y)):JG(this.long0+Math.atan2(l.x*Math.sin(G),X*this.coslat0*Math.cos(G)-l.y*this.sinlat0*Math.sin(G))),l.x=d,l.y=b,l)}if(Math.abs(this.coslat0)<=lG){if(X<=lG)return b=this.lat0,d=this.long0,l.x=d,l.y=b,l;l.x*=this.con,l.y*=this.con,Z=X*this.cons/(2*this.a*this.k0),b=this.con*vG(this.e,Z),d=this.con*JG(this.con*this.long0+Math.atan2(l.x,-1*l.y))}else c=2*Math.atan(X*this.cosX0/(2*this.a*this.k0*this.ms1)),d=this.long0,X<=lG?m=this.X0:(m=Math.asin(Math.cos(c)*this.sinX0+l.y*Math.sin(c)*this.cosX0/X),d=JG(this.long0+Math.atan2(l.x*Math.sin(c),X*this.cosX0*Math.cos(c)-l.y*this.sinX0*Math.sin(c)))),b=-1*vG(this.e,Math.tan(.5*($X+m)));return l.x=d,l.y=b,l},names:["stere","Stereographic_South_Pole","Polar Stereographic (variant B)"],ssfn_:function(l,d,b){return d*=b,Math.tan(.5*($X+l))*Math.pow((1-d)/(1+d),.5*b)}};var jW={init:function(){var l=this.lat0;this.lambda0=this.long0;var d=Math.sin(l),b=this.a,Z=1/this.rf,c=2*Z-Math.pow(Z,2),m=this.e=Math.sqrt(c);this.R=this.k0*b*Math.sqrt(1-c)/(1-c*Math.pow(d,2)),this.alpha=Math.sqrt(1+c/(1-c)*Math.pow(Math.cos(l),4)),this.b0=Math.asin(d/this.alpha);var X=Math.log(Math.tan(Math.PI/4+this.b0/2)),G=Math.log(Math.tan(Math.PI/4+l/2)),W=Math.log((1+m*d)/(1-m*d));this.K=X-this.alpha*G+this.alpha*m/2*W},forward:function(l){var d=Math.log(Math.tan(Math.PI/4-l.y/2)),b=this.e/2*Math.log((1+this.e*Math.sin(l.y))/(1-this.e*Math.sin(l.y))),Z=-this.alpha*(d+b)+this.K,c=2*(Math.atan(Math.exp(Z))-Math.PI/4),m=this.alpha*(l.x-this.lambda0),X=Math.atan(Math.sin(m)/(Math.sin(this.b0)*Math.tan(c)+Math.cos(this.b0)*Math.cos(m))),G=Math.asin(Math.cos(this.b0)*Math.sin(c)-Math.sin(this.b0)*Math.cos(c)*Math.cos(m));return l.y=this.R/2*Math.log((1+Math.sin(G))/(1-Math.sin(G)))+this.y0,l.x=this.R*X+this.x0,l},inverse:function(l){for(var d=l.x-this.x0,b=l.y-this.y0,Z=d/this.R,c=2*(Math.atan(Math.exp(b/this.R))-Math.PI/4),m=Math.asin(Math.cos(this.b0)*Math.sin(c)+Math.sin(this.b0)*Math.cos(c)*Math.cos(Z)),X=Math.atan(Math.sin(Z)/(Math.cos(this.b0)*Math.cos(Z)-Math.sin(this.b0)*Math.tan(c))),G=this.lambda0+X/this.alpha,W=0,u=m,a=-1e3,h=0;Math.abs(u-a)>1e-7;){if(++h>20)return;W=1/this.alpha*(Math.log(Math.tan(Math.PI/4+m/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(u))/2)),a=u,u=2*Math.atan(Math.exp(W))-Math.PI/2}return l.x=G,l.y=u,l},names:["somerc"]},fW=1e-7;var EW={init:function(){var l,d,b,Z,c,m,X,G,W,u,a,s,V,y=0,p=0,t=0,n=0,i=0,R=0,o=0;this.no_off=(V="object"===h((s=this).PROJECTION)?Object.keys(s.PROJECTION)[0]:s.PROJECTION,"no_uoff"in s||"no_off"in s||-1!==["Hotine_Oblique_Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin"].indexOf(V)),this.no_rot="no_rot"in this;var L=!1;"alpha"in this&&(L=!0);var K=!1;if("rectified_grid_angle"in this&&(K=!0),L&&(o=this.alpha),K&&(y=this.rectified_grid_angle*dG),L||K)p=this.longc;else if(t=this.long1,i=this.lat1,n=this.long2,R=this.lat2,Math.abs(i-R)<=fW||(l=Math.abs(i))<=fW||Math.abs(l-$X)<=fW||Math.abs(Math.abs(this.lat0)-$X)<=fW||Math.abs(Math.abs(R)-$X)<=fW)throw new Error;var H=1-this.es;d=Math.sqrt(H),Math.abs(this.lat0)>lG?(G=Math.sin(this.lat0),b=Math.cos(this.lat0),l=1-this.es*G*G,this.B=b*b,this.B=Math.sqrt(1+this.es*this.B*this.B/H),this.A=this.B*this.k0*d/l,(c=(Z=this.B*d/(b*Math.sqrt(l)))*Z-1)<=0?c=0:(c=Math.sqrt(c),this.lat0<0&&(c=-c)),this.E=c+=Z,this.E*=Math.pow(zG(this.e,this.lat0,G),this.B)):(this.B=1/d,this.A=this.k0,this.E=Z=c=1),L||K?(L?(a=Math.asin(Math.sin(o)/Z),K||(y=o)):(a=y,o=Math.asin(Z*Math.sin(a))),this.lam0=p-Math.asin(.5*(c-1/c)*Math.tan(a))/this.B):(m=Math.pow(zG(this.e,i,Math.sin(i)),this.B),X=Math.pow(zG(this.e,R,Math.sin(R)),this.B),c=this.E/m,W=(X-m)/(X+m),u=((u=this.E*this.E)-X*m)/(u+X*m),(l=t-n)<-Math.pi?n-=cG:l>Math.pi&&(n+=cG),this.lam0=JG(.5*(t+n)-Math.atan(u*Math.tan(.5*this.B*(t-n))/W)/this.B),a=Math.atan(2*Math.sin(this.B*JG(t-this.lam0))/(c-1/c)),y=o=Math.asin(Z*Math.sin(a))),this.singam=Math.sin(a),this.cosgam=Math.cos(a),this.sinrot=Math.sin(y),this.cosrot=Math.cos(y),this.rB=1/this.B,this.ArB=this.A*this.rB,this.BrA=1/this.ArB,this.A,this.B,this.no_off?this.u_0=0:(this.u_0=Math.abs(this.ArB*Math.atan(Math.sqrt(Z*Z-1)/Math.cos(o))),this.lat0<0&&(this.u_0=-this.u_0)),c=.5*a,this.v_pole_n=this.ArB*Math.log(Math.tan(ZG-c)),this.v_pole_s=this.ArB*Math.log(Math.tan(ZG+c))},forward:function(l){var d,b,Z,c,m,X,G,W,u={};if(l.x=l.x-this.lam0,Math.abs(Math.abs(l.y)-$X)>lG){if(d=.5*((m=this.E/Math.pow(zG(this.e,l.y,Math.sin(l.y)),this.B))-(X=1/m)),b=.5*(m+X),c=Math.sin(this.B*l.x),Z=(d*this.singam-c*this.cosgam)/b,Math.abs(Math.abs(Z)-1)<lG)throw new Error;W=.5*this.ArB*Math.log((1-Z)/(1+Z)),X=Math.cos(this.B*l.x),G=Math.abs(X)<fW?this.A*l.x:this.ArB*Math.atan2(d*this.cosgam+c*this.singam,X)}else W=l.y>0?this.v_pole_n:this.v_pole_s,G=this.ArB*l.y;return this.no_rot?(u.x=G,u.y=W):(G-=this.u_0,u.x=W*this.cosrot+G*this.sinrot,u.y=G*this.cosrot-W*this.sinrot),u.x=this.a*u.x+this.x0,u.y=this.a*u.y+this.y0,u},inverse:function(l){var d,b,Z,c,m,X,G,W={};if(l.x=(l.x-this.x0)*(1/this.a),l.y=(l.y-this.y0)*(1/this.a),this.no_rot?(b=l.y,d=l.x):(b=l.x*this.cosrot-l.y*this.sinrot,d=l.y*this.cosrot+l.x*this.sinrot+this.u_0),c=.5*((Z=Math.exp(-this.BrA*b))-1/Z),m=.5*(Z+1/Z),G=((X=Math.sin(this.BrA*d))*this.cosgam+c*this.singam)/m,Math.abs(Math.abs(G)-1)<lG)W.x=0,W.y=G<0?-$X:$X;else{if(W.y=this.E/Math.sqrt((1+G)/(1-G)),W.y=vG(this.e,Math.pow(W.y,1/this.B)),W.y===1/0)throw new Error;W.x=-this.rB*Math.atan2(c*this.cosgam-X*this.singam,Math.cos(this.BrA*d))}return W.x+=this.lam0,W},names:["Hotine_Oblique_Mercator","Hotine Oblique Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin","Hotine_Oblique_Mercator_Two_Point_Natural_Origin","Hotine_Oblique_Mercator_Azimuth_Center","Oblique_Mercator","omerc"]};var OW={init:function(){if(this.lat2||(this.lat2=this.lat1),this.k0||(this.k0=1),this.x0=this.x0||0,this.y0=this.y0||0,!(Math.abs(this.lat1+this.lat2)<lG)){var l=this.b/this.a;this.e=Math.sqrt(1-l*l);var d=Math.sin(this.lat1),b=Math.cos(this.lat1),Z=YG(this.e,d,b),c=zG(this.e,this.lat1,d),m=Math.sin(this.lat2),X=Math.cos(this.lat2),G=YG(this.e,m,X),W=zG(this.e,this.lat2,m),u=zG(this.e,this.lat0,Math.sin(this.lat0));Math.abs(this.lat1-this.lat2)>lG?this.ns=Math.log(Z/G)/Math.log(c/W):this.ns=d,isNaN(this.ns)&&(this.ns=d),this.f0=Z/(this.ns*Math.pow(c,this.ns)),this.rh=this.a*this.f0*Math.pow(u,this.ns),this.title||(this.title="Lambert Conformal Conic")}},forward:function(l){var d=l.x,b=l.y;Math.abs(2*Math.abs(b)-Math.PI)<=lG&&(b=eG(b)*($X-2e-10));var Z,c,m=Math.abs(Math.abs(b)-$X);if(m>lG)Z=zG(this.e,b,Math.sin(b)),c=this.a*this.f0*Math.pow(Z,this.ns);else{if((m=b*this.ns)<=0)return null;c=0}var X=this.ns*JG(d-this.long0);return l.x=this.k0*(c*Math.sin(X))+this.x0,l.y=this.k0*(this.rh-c*Math.cos(X))+this.y0,l},inverse:function(l){var d,b,Z,c,m,X=(l.x-this.x0)/this.k0,G=this.rh-(l.y-this.y0)/this.k0;this.ns>0?(d=Math.sqrt(X*X+G*G),b=1):(d=-Math.sqrt(X*X+G*G),b=-1);var W=0;if(0!==d&&(W=Math.atan2(b*X,b*G)),0!==d||this.ns>0){if(b=1/this.ns,Z=Math.pow(d/(this.a*this.f0),b),-9999===(c=vG(this.e,Z)))return null}else c=-$X;return m=JG(W/this.ns+this.long0),l.x=m,l.y=c,l},names:["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_1SP","Lambert_Conformal_Conic_2SP","lcc","Lambert Conic Conformal (1SP)","Lambert Conic Conformal (2SP)"]};var DW={init:function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},forward:function(l){var d,b,Z,c,m,X,G,W=l.x,u=l.y,a=JG(W-this.long0);return d=Math.pow((1+this.e*Math.sin(u))/(1-this.e*Math.sin(u)),this.alfa*this.e/2),b=2*(Math.atan(this.k*Math.pow(Math.tan(u/2+this.s45),this.alfa)/d)-this.s45),Z=-a*this.alfa,c=Math.asin(Math.cos(this.ad)*Math.sin(b)+Math.sin(this.ad)*Math.cos(b)*Math.cos(Z)),m=Math.asin(Math.cos(b)*Math.sin(Z)/Math.cos(c)),X=this.n*m,G=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(c/2+this.s45),this.n),l.y=G*Math.cos(X)/1,l.x=G*Math.sin(X)/1,this.czech||(l.y*=-1,l.x*=-1),l},inverse:function(l){var d,b,Z,c,m,X,G,W=l.x;l.x=l.y,l.y=W,this.czech||(l.y*=-1,l.x*=-1),m=Math.sqrt(l.x*l.x+l.y*l.y),c=Math.atan2(l.y,l.x)/Math.sin(this.s0),Z=2*(Math.atan(Math.pow(this.ro0/m,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),d=Math.asin(Math.cos(this.ad)*Math.sin(Z)-Math.sin(this.ad)*Math.cos(Z)*Math.cos(c)),b=Math.asin(Math.cos(Z)*Math.sin(c)/Math.cos(d)),l.x=this.long0-b/this.alfa,X=d,G=0;var u=0;do{l.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(d/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(X))/(1-this.e*Math.sin(X)),this.e/2))-this.s45),Math.abs(X-l.y)<1e-10&&(G=1),X=l.y,u+=1}while(0===G&&u<15);return u>=15?null:l},names:["Krovak","krovak"]};function AW(l,d,b,Z,c){return l*c-d*Math.sin(2*c)+b*Math.sin(4*c)-Z*Math.sin(6*c)}function _W(l){return 1-.25*l*(1+l/16*(3+1.25*l))}function qW(l){return.375*l*(1+.25*l*(1+.46875*l))}function $W(l){return.05859375*l*l*(1+.75*l)}function lu(l){return l*l*l*(35/3072)}function du(l,d,b){var Z=d*b;return l/Math.sqrt(1-Z*Z)}function bu(l){return Math.abs(l)<$X?l:l-eG(l)*Math.PI}function Zu(l,d,b,Z,c){var m,X;m=l/d;for(var G=0;G<15;G++)if(m+=X=(l-(d*m-b*Math.sin(2*m)+Z*Math.sin(4*m)-c*Math.sin(6*m)))/(d-2*b*Math.cos(2*m)+4*Z*Math.cos(4*m)-6*c*Math.cos(6*m)),Math.abs(X)<=1e-10)return m;return NaN}var cu={init:function(){this.sphere||(this.e0=_W(this.es),this.e1=qW(this.es),this.e2=$W(this.es),this.e3=lu(this.es),this.ml0=this.a*AW(this.e0,this.e1,this.e2,this.e3,this.lat0))},forward:function(l){var d,b,Z=l.x,c=l.y;if(Z=JG(Z-this.long0),this.sphere)d=this.a*Math.asin(Math.cos(c)*Math.sin(Z)),b=this.a*(Math.atan2(Math.tan(c),Math.cos(Z))-this.lat0);else{var m=Math.sin(c),X=Math.cos(c),G=du(this.a,this.e,m),W=Math.tan(c)*Math.tan(c),u=Z*Math.cos(c),a=u*u,h=this.es*X*X/(1-this.es);d=G*u*(1-a*W*(1/6-(8-W+8*h)*a/120)),b=this.a*AW(this.e0,this.e1,this.e2,this.e3,c)-this.ml0+G*m/X*a*(.5+(5-W+6*h)*a/24)}return l.x=d+this.x0,l.y=b+this.y0,l},inverse:function(l){l.x-=this.x0,l.y-=this.y0;var d,b,Z=l.x/this.a,c=l.y/this.a;if(this.sphere){var m=c+this.lat0;d=Math.asin(Math.sin(m)*Math.cos(Z)),b=Math.atan2(Math.tan(Z),Math.cos(m))}else{var X=Zu(this.ml0/this.a+c,this.e0,this.e1,this.e2,this.e3);if(Math.abs(Math.abs(X)-$X)<=lG)return l.x=this.long0,l.y=$X,c<0&&(l.y*=-1),l;var G=du(this.a,this.e,Math.sin(X)),W=G*G*G/this.a/this.a*(1-this.es),u=Math.pow(Math.tan(X),2),a=Z*this.a/G,h=a*a;d=X-G*Math.tan(X)/W*a*a*(.5-(1+3*u)*a*a/24),b=a*(1-h*(u/3+(1+3*u)*u*h/15))/Math.cos(X)}return l.x=JG(b+this.long0),l.y=bu(d),l},names:["Cassini","Cassini_Soldner","cass"]};function mu(l,d){var b;return l>1e-7?(1-l*l)*(d/(1-(b=l*d)*b)-.5/l*Math.log((1-b)/(1+b))):2*d}var Xu=.3333333333333333,Gu=.17222222222222222,Wu=.10257936507936508,uu=.06388888888888888,au=.0664021164021164,hu=.016415012942191543;var su={init:function(){var l,d=Math.abs(this.lat0);if(Math.abs(d-$X)<lG?this.mode=this.lat0<0?this.S_POLE:this.N_POLE:Math.abs(d)<lG?this.mode=this.EQUIT:this.mode=this.OBLIQ,this.es>0)switch(this.qp=mu(this.e,1),this.mmf=.5/(1-this.es),this.apa=function(l){var d,b=[];return b[0]=l*Xu,d=l*l,b[0]+=d*Gu,b[1]=d*uu,d*=l,b[0]+=d*Wu,b[1]+=d*au,b[2]=d*hu,b}(this.es),this.mode){case this.N_POLE:case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),l=Math.sin(this.lat0),this.sinb1=mu(this.e,l)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*l*l)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},forward:function(l){var d,b,Z,c,m,X,G,W,u,a,h=l.x,s=l.y;if(h=JG(h-this.long0),this.sphere){if(m=Math.sin(s),a=Math.cos(s),Z=Math.cos(h),this.mode===this.OBLIQ||this.mode===this.EQUIT){if((b=this.mode===this.EQUIT?1+a*Z:1+this.sinph0*m+this.cosph0*a*Z)<=lG)return null;d=(b=Math.sqrt(2/b))*a*Math.sin(h),b*=this.mode===this.EQUIT?m:this.cosph0*m-this.sinph0*a*Z}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(Z=-Z),Math.abs(s+this.lat0)<lG)return null;b=ZG-.5*s,d=(b=2*(this.mode===this.S_POLE?Math.cos(b):Math.sin(b)))*Math.sin(h),b*=Z}}else{switch(G=0,W=0,u=0,Z=Math.cos(h),c=Math.sin(h),m=Math.sin(s),X=mu(this.e,m),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(G=X/this.qp,W=Math.sqrt(1-G*G)),this.mode){case this.OBLIQ:u=1+this.sinb1*G+this.cosb1*W*Z;break;case this.EQUIT:u=1+W*Z;break;case this.N_POLE:u=$X+s,X=this.qp-X;break;case this.S_POLE:u=s-$X,X=this.qp+X}if(Math.abs(u)<lG)return null;switch(this.mode){case this.OBLIQ:case this.EQUIT:u=Math.sqrt(2/u),b=this.mode===this.OBLIQ?this.ymf*u*(this.cosb1*G-this.sinb1*W*Z):(u=Math.sqrt(2/(1+W*Z)))*G*this.ymf,d=this.xmf*u*W*c;break;case this.N_POLE:case this.S_POLE:X>=0?(d=(u=Math.sqrt(X))*c,b=Z*(this.mode===this.S_POLE?u:-u)):d=b=0}}return l.x=this.a*d+this.x0,l.y=this.a*b+this.y0,l},inverse:function(l){l.x-=this.x0,l.y-=this.y0;var d,b,Z,c,m,X,G,W,u,a,h=l.x/this.a,s=l.y/this.a;if(this.sphere){var V,y=0,p=0;if((b=.5*(V=Math.sqrt(h*h+s*s)))>1)return null;switch(b=2*Math.asin(b),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(p=Math.sin(b),y=Math.cos(b)),this.mode){case this.EQUIT:b=Math.abs(V)<=lG?0:Math.asin(s*p/V),h*=p,s=y*V;break;case this.OBLIQ:b=Math.abs(V)<=lG?this.lat0:Math.asin(y*this.sinph0+s*p*this.cosph0/V),h*=p*this.cosph0,s=(y-Math.sin(b)*this.sinph0)*V;break;case this.N_POLE:s=-s,b=$X-b;break;case this.S_POLE:b-=$X}d=0!==s||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(h,s):0}else{if(G=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(h/=this.dd,s*=this.dd,(X=Math.sqrt(h*h+s*s))<lG)return l.x=this.long0,l.y=this.lat0,l;c=2*Math.asin(.5*X/this.rq),Z=Math.cos(c),h*=c=Math.sin(c),this.mode===this.OBLIQ?(G=Z*this.sinb1+s*c*this.cosb1/X,m=this.qp*G,s=X*this.cosb1*Z-s*this.sinb1*c):(G=s*c/X,m=this.qp*G,s=X*Z)}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(s=-s),!(m=h*h+s*s))return l.x=this.long0,l.y=this.lat0,l;G=1-m/this.qp,this.mode===this.S_POLE&&(G=-G)}d=Math.atan2(h,s),W=Math.asin(G),u=this.apa,a=W+W,b=W+u[0]*Math.sin(a)+u[1]*Math.sin(a+a)+u[2]*Math.sin(a+a+a)}return l.x=JG(this.long0+d),l.y=b,l},names:["Lambert Azimuthal Equal Area","Lambert_Azimuthal_Equal_Area","laea"],S_POLE:1,N_POLE:2,EQUIT:3,OBLIQ:4};function Vu(l){return Math.abs(l)>1&&(l=l>1?1:-1),Math.asin(l)}var yu={init:function(){Math.abs(this.lat1+this.lat2)<lG||(this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e3=Math.sqrt(this.es),this.sin_po=Math.sin(this.lat1),this.cos_po=Math.cos(this.lat1),this.t1=this.sin_po,this.con=this.sin_po,this.ms1=YG(this.e3,this.sin_po,this.cos_po),this.qs1=mu(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat2),this.cos_po=Math.cos(this.lat2),this.t2=this.sin_po,this.ms2=YG(this.e3,this.sin_po,this.cos_po),this.qs2=mu(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat0),this.cos_po=Math.cos(this.lat0),this.t3=this.sin_po,this.qs0=mu(this.e3,this.sin_po,this.cos_po),Math.abs(this.lat1-this.lat2)>lG?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(l){var d=l.x,b=l.y;this.sin_phi=Math.sin(b),this.cos_phi=Math.cos(b);var Z=mu(this.e3,this.sin_phi,this.cos_phi),c=this.a*Math.sqrt(this.c-this.ns0*Z)/this.ns0,m=this.ns0*JG(d-this.long0),X=c*Math.sin(m)+this.x0,G=this.rh-c*Math.cos(m)+this.y0;return l.x=X,l.y=G,l},inverse:function(l){var d,b,Z,c,m,X;return l.x-=this.x0,l.y=this.rh-l.y+this.y0,this.ns0>=0?(d=Math.sqrt(l.x*l.x+l.y*l.y),Z=1):(d=-Math.sqrt(l.x*l.x+l.y*l.y),Z=-1),c=0,0!==d&&(c=Math.atan2(Z*l.x,Z*l.y)),Z=d*this.ns0/this.a,this.sphere?X=Math.asin((this.c-Z*Z)/(2*this.ns0)):(b=(this.c-Z*Z)/this.ns0,X=this.phi1z(this.e3,b)),m=JG(c/this.ns0+this.long0),l.x=m,l.y=X,l},names:["Albers_Conic_Equal_Area","Albers","aea"],phi1z:function(l,d){var b,Z,c,m,X=Vu(.5*d);if(l<lG)return X;for(var G=l*l,W=1;W<=25;W++)if(X+=m=.5*(c=1-(Z=l*(b=Math.sin(X)))*Z)*c/Math.cos(X)*(d/(1-G)-b/c+.5/l*Math.log((1-Z)/(1+Z))),Math.abs(m)<=1e-7)return X;return null}};var pu={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0),this.infinity_dist=1e3*this.a,this.rc=1},forward:function(l){var d,b,Z,c,m,X,G,W=l.x,u=l.y;return Z=JG(W-this.long0),d=Math.sin(u),b=Math.cos(u),c=Math.cos(Z),1,(m=this.sin_p14*d+this.cos_p14*b*c)>0||Math.abs(m)<=lG?(X=this.x0+1*this.a*b*Math.sin(Z)/m,G=this.y0+1*this.a*(this.cos_p14*d-this.sin_p14*b*c)/m):(X=this.x0+this.infinity_dist*b*Math.sin(Z),G=this.y0+this.infinity_dist*(this.cos_p14*d-this.sin_p14*b*c)),l.x=X,l.y=G,l},inverse:function(l){var d,b,Z,c,m,X;return l.x=(l.x-this.x0)/this.a,l.y=(l.y-this.y0)/this.a,l.x/=this.k0,l.y/=this.k0,(d=Math.sqrt(l.x*l.x+l.y*l.y))?(c=Math.atan2(d,this.rc),b=Math.sin(c),X=Vu((Z=Math.cos(c))*this.sin_p14+l.y*b*this.cos_p14/d),m=Math.atan2(l.x*b,d*this.cos_p14*Z-l.y*this.sin_p14*b),m=JG(this.long0+m)):(X=this.phic0,m=0),l.x=m,l.y=X,l},names:["gnom"]};var tu={init:function(){this.sphere||(this.k0=YG(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},forward:function(l){var d,b,Z=l.x,c=l.y,m=JG(Z-this.long0);if(this.sphere)d=this.x0+this.a*m*Math.cos(this.lat_ts),b=this.y0+this.a*Math.sin(c)/Math.cos(this.lat_ts);else{var X=mu(this.e,Math.sin(c));d=this.x0+this.a*this.k0*m,b=this.y0+this.a*X*.5/this.k0}return l.x=d,l.y=b,l},inverse:function(l){var d,b;return l.x-=this.x0,l.y-=this.y0,this.sphere?(d=JG(this.long0+l.x/this.a/Math.cos(this.lat_ts)),b=Math.asin(l.y/this.a*Math.cos(this.lat_ts))):(b=function(l,d){var b=1-(1-l*l)/(2*l)*Math.log((1-l)/(1+l));if(Math.abs(Math.abs(d)-b)<1e-6)return d<0?-1*$X:$X;for(var Z,c,m,X,G=Math.asin(.5*d),W=0;W<30;W++)if(c=Math.sin(G),m=Math.cos(G),X=l*c,G+=Z=Math.pow(1-X*X,2)/(2*m)*(d/(1-l*l)-c/(1-X*X)+.5/l*Math.log((1-X)/(1+X))),Math.abs(Z)<=1e-10)return G;return NaN}(this.e,2*l.y*this.k0/this.a),d=JG(this.long0+l.x/(this.a*this.k0))),l.x=d,l.y=b,l},names:["cea"]};var nu={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},forward:function(l){var d=l.x,b=l.y,Z=JG(d-this.long0),c=bu(b-this.lat0);return l.x=this.x0+this.a*Z*this.rc,l.y=this.y0+this.a*c,l},inverse:function(l){var d=l.x,b=l.y;return l.x=JG(this.long0+(d-this.x0)/(this.a*this.rc)),l.y=bu(this.lat0+(b-this.y0)/this.a),l},names:["Equirectangular","Equidistant_Cylindrical","eqc"]};var iu={init:function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=_W(this.es),this.e1=qW(this.es),this.e2=$W(this.es),this.e3=lu(this.es),this.ml0=this.a*AW(this.e0,this.e1,this.e2,this.e3,this.lat0)},forward:function(l){var d,b,Z,c=l.x,m=l.y,X=JG(c-this.long0);if(Z=X*Math.sin(m),this.sphere)Math.abs(m)<=lG?(d=this.a*X,b=-1*this.a*this.lat0):(d=this.a*Math.sin(Z)/Math.tan(m),b=this.a*(bu(m-this.lat0)+(1-Math.cos(Z))/Math.tan(m)));else if(Math.abs(m)<=lG)d=this.a*X,b=-1*this.ml0;else{var G=du(this.a,this.e,Math.sin(m))/Math.tan(m);d=G*Math.sin(Z),b=this.a*AW(this.e0,this.e1,this.e2,this.e3,m)-this.ml0+G*(1-Math.cos(Z))}return l.x=d+this.x0,l.y=b+this.y0,l},inverse:function(l){var d,b,Z,c,m,X,G,W,u;if(Z=l.x-this.x0,c=l.y-this.y0,this.sphere)if(Math.abs(c+this.a*this.lat0)<=lG)d=JG(Z/this.a+this.long0),b=0;else{var a;for(X=this.lat0+c/this.a,G=Z*Z/this.a/this.a+X*X,W=X,m=20;m;--m)if(W+=u=-1*(X*(W*(a=Math.tan(W))+1)-W-.5*(W*W+G)*a)/((W-X)/a-1),Math.abs(u)<=lG){b=W;break}d=JG(this.long0+Math.asin(Z*Math.tan(W)/this.a)/Math.sin(b))}else if(Math.abs(c+this.ml0)<=lG)b=0,d=JG(this.long0+Z/this.a);else{var h,s,V,y,p;for(X=(this.ml0+c)/this.a,G=Z*Z/this.a/this.a+X*X,W=X,m=20;m;--m)if(p=this.e*Math.sin(W),h=Math.sqrt(1-p*p)*Math.tan(W),s=this.a*AW(this.e0,this.e1,this.e2,this.e3,W),V=this.e0-2*this.e1*Math.cos(2*W)+4*this.e2*Math.cos(4*W)-6*this.e3*Math.cos(6*W),W-=u=(X*(h*(y=s/this.a)+1)-y-.5*h*(y*y+G))/(this.es*Math.sin(2*W)*(y*y+G-2*X*y)/(4*h)+(X-y)*(h*V-2/Math.sin(2*W))-V),Math.abs(u)<=lG){b=W;break}h=Math.sqrt(1-this.es*Math.pow(Math.sin(b),2))*Math.tan(b),d=JG(this.long0+Math.asin(Z*h/this.a)/Math.sin(b))}return l.x=d,l.y=b,l},names:["Polyconic","poly"]};var Ru={init:function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},forward:function(l){var d,b=l.x,Z=l.y-this.lat0,c=b-this.long0,m=Z/qX*1e-5,X=c,G=1,W=0;for(d=1;d<=10;d++)G*=m,W+=this.A[d]*G;var u,a=W,h=X,s=1,V=0,y=0,p=0;for(d=1;d<=6;d++)u=V*a+s*h,s=s*a-V*h,V=u,y=y+this.B_re[d]*s-this.B_im[d]*V,p=p+this.B_im[d]*s+this.B_re[d]*V;return l.x=p*this.a+this.x0,l.y=y*this.a+this.y0,l},inverse:function(l){var d,b,Z=l.x,c=l.y,m=Z-this.x0,X=(c-this.y0)/this.a,G=m/this.a,W=1,u=0,a=0,h=0;for(d=1;d<=6;d++)b=u*X+W*G,W=W*X-u*G,u=b,a=a+this.C_re[d]*W-this.C_im[d]*u,h=h+this.C_im[d]*W+this.C_re[d]*u;for(var s=0;s<this.iterations;s++){var V,y=a,p=h,t=X,n=G;for(d=2;d<=6;d++)V=p*a+y*h,y=y*a-p*h,p=V,t+=(d-1)*(this.B_re[d]*y-this.B_im[d]*p),n+=(d-1)*(this.B_im[d]*y+this.B_re[d]*p);y=1,p=0;var i=this.B_re[1],R=this.B_im[1];for(d=2;d<=6;d++)V=p*a+y*h,y=y*a-p*h,p=V,i+=d*(this.B_re[d]*y-this.B_im[d]*p),R+=d*(this.B_im[d]*y+this.B_re[d]*p);var o=i*i+R*R;a=(t*i+n*R)/o,h=(n*i-t*R)/o}var L=a,K=h,H=1,x=0;for(d=1;d<=9;d++)H*=L,x+=this.D[d]*H;var S=this.lat0+x*qX*1e5,Y=this.long0+K;return l.x=Y,l.y=S,l},names:["New_Zealand_Map_Grid","nzmg"]};var ou={init:function(){},forward:function(l){var d=l.x,b=l.y,Z=JG(d-this.long0),c=this.x0+this.a*Z,m=this.y0+this.a*Math.log(Math.tan(Math.PI/4+b/2.5))*1.25;return l.x=c,l.y=m,l},inverse:function(l){l.x-=this.x0,l.y-=this.y0;var d=JG(this.long0+l.x/this.a),b=2.5*(Math.atan(Math.exp(.8*l.y/this.a))-Math.PI/4);return l.x=d,l.y=b,l},names:["Miller_Cylindrical","mill"]};var Lu={init:function(){this.sphere?(this.n=1,this.m=0,this.es=0,this.C_y=Math.sqrt((this.m+1)/this.n),this.C_x=this.C_y/(this.m+1)):this.en=vW(this.es)},forward:function(l){var d,b,Z=l.x,c=l.y;if(Z=JG(Z-this.long0),this.sphere){if(this.m)for(var m=this.n*Math.sin(c),X=20;X;--X){var G=(this.m*c+Math.sin(c)-m)/(this.m+Math.cos(c));if(c-=G,Math.abs(G)<lG)break}else c=1!==this.n?Math.asin(this.n*Math.sin(c)):c;d=this.a*this.C_x*Z*(this.m+Math.cos(c)),b=this.a*this.C_y*c}else{var W=Math.sin(c),u=Math.cos(c);b=this.a*TW(c,W,u,this.en),d=this.a*Z*u/Math.sqrt(1-this.es*W*W)}return l.x=d,l.y=b,l},inverse:function(l){var d,b,Z;return l.x-=this.x0,b=l.x/this.a,l.y-=this.y0,d=l.y/this.a,this.sphere?(d/=this.C_y,b/=this.C_x*(this.m+Math.cos(d)),this.m?d=Vu((this.m*d+Math.sin(d))/this.n):1!==this.n&&(d=Vu(Math.sin(d)/this.n)),b=JG(b+this.long0),d=bu(d)):(d=MW(l.y/this.a,this.es,this.en),(Z=Math.abs(d))<$X?(Z=Math.sin(d),b=JG(this.long0+l.x*Math.sqrt(1-this.es*Z*Z)/(this.a*Math.cos(d)))):Z-lG<$X&&(b=this.long0)),l.x=b,l.y=d,l},names:["Sinusoidal","sinu"]};var Ku={init:function(){},forward:function(l){for(var d=l.x,b=l.y,Z=JG(d-this.long0),c=b,m=Math.PI*Math.sin(b);;){var X=-(c+Math.sin(c)-m)/(1+Math.cos(c));if(c+=X,Math.abs(X)<lG)break}c/=2,Math.PI/2-Math.abs(b)<lG&&(Z=0);var G=.900316316158*this.a*Z*Math.cos(c)+this.x0,W=1.4142135623731*this.a*Math.sin(c)+this.y0;return l.x=G,l.y=W,l},inverse:function(l){var d,b;l.x-=this.x0,l.y-=this.y0,b=l.y/(1.4142135623731*this.a),Math.abs(b)>.999999999999&&(b=.999999999999),d=Math.asin(b);var Z=JG(this.long0+l.x/(.900316316158*this.a*Math.cos(d)));Z<-Math.PI&&(Z=-Math.PI),Z>Math.PI&&(Z=Math.PI),b=(2*d+Math.sin(2*d))/Math.PI,Math.abs(b)>1&&(b=1);var c=Math.asin(b);return l.x=Z,l.y=c,l},names:["Mollweide","moll"]};var Hu={init:function(){Math.abs(this.lat1+this.lat2)<lG||(this.lat2=this.lat2||this.lat1,this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=_W(this.es),this.e1=qW(this.es),this.e2=$W(this.es),this.e3=lu(this.es),this.sinphi=Math.sin(this.lat1),this.cosphi=Math.cos(this.lat1),this.ms1=YG(this.e,this.sinphi,this.cosphi),this.ml1=AW(this.e0,this.e1,this.e2,this.e3,this.lat1),Math.abs(this.lat1-this.lat2)<lG?this.ns=this.sinphi:(this.sinphi=Math.sin(this.lat2),this.cosphi=Math.cos(this.lat2),this.ms2=YG(this.e,this.sinphi,this.cosphi),this.ml2=AW(this.e0,this.e1,this.e2,this.e3,this.lat2),this.ns=(this.ms1-this.ms2)/(this.ml2-this.ml1)),this.g=this.ml1+this.ms1/this.ns,this.ml0=AW(this.e0,this.e1,this.e2,this.e3,this.lat0),this.rh=this.a*(this.g-this.ml0))},forward:function(l){var d,b=l.x,Z=l.y;if(this.sphere)d=this.a*(this.g-Z);else{var c=AW(this.e0,this.e1,this.e2,this.e3,Z);d=this.a*(this.g-c)}var m=this.ns*JG(b-this.long0),X=this.x0+d*Math.sin(m),G=this.y0+this.rh-d*Math.cos(m);return l.x=X,l.y=G,l},inverse:function(l){var d,b,Z,c;l.x-=this.x0,l.y=this.rh-l.y+this.y0,this.ns>=0?(b=Math.sqrt(l.x*l.x+l.y*l.y),d=1):(b=-Math.sqrt(l.x*l.x+l.y*l.y),d=-1);var m=0;return 0!==b&&(m=Math.atan2(d*l.x,d*l.y)),this.sphere?(c=JG(this.long0+m/this.ns),Z=bu(this.g-b/this.a),l.x=c,l.y=Z,l):(Z=Zu(this.g-b/this.a,this.e0,this.e1,this.e2,this.e3),c=JG(this.long0+m/this.ns),l.x=c,l.y=Z,l)},names:["Equidistant_Conic","eqdc"]};var xu={init:function(){this.R=this.a},forward:function(l){var d,b,Z=l.x,c=l.y,m=JG(Z-this.long0);Math.abs(c)<=lG&&(d=this.x0+this.R*m,b=this.y0);var X=Vu(2*Math.abs(c/Math.PI));(Math.abs(m)<=lG||Math.abs(Math.abs(c)-$X)<=lG)&&(d=this.x0,b=c>=0?this.y0+Math.PI*this.R*Math.tan(.5*X):this.y0+Math.PI*this.R*-Math.tan(.5*X));var G=.5*Math.abs(Math.PI/m-m/Math.PI),W=G*G,u=Math.sin(X),a=Math.cos(X),h=a/(u+a-1),s=h*h,V=h*(2/u-1),y=V*V,p=Math.PI*this.R*(G*(h-y)+Math.sqrt(W*(h-y)*(h-y)-(y+W)*(s-y)))/(y+W);m<0&&(p=-p),d=this.x0+p;var t=W+h;return p=Math.PI*this.R*(V*t-G*Math.sqrt((y+W)*(W+1)-t*t))/(y+W),b=c>=0?this.y0+p:this.y0-p,l.x=d,l.y=b,l},inverse:function(l){var d,b,Z,c,m,X,G,W,u,a,h,s;return l.x-=this.x0,l.y-=this.y0,h=Math.PI*this.R,m=(Z=l.x/h)*Z+(c=l.y/h)*c,h=3*(c*c/(W=-2*(X=-Math.abs(c)*(1+m))+1+2*c*c+m*m)+(2*(G=X-2*c*c+Z*Z)*G*G/W/W/W-9*X*G/W/W)/27)/(u=(X-G*G/3/W)/W)/(a=2*Math.sqrt(-u/3)),Math.abs(h)>1&&(h=h>=0?1:-1),s=Math.acos(h)/3,b=l.y>=0?(-a*Math.cos(s+Math.PI/3)-G/3/W)*Math.PI:-(-a*Math.cos(s+Math.PI/3)-G/3/W)*Math.PI,d=Math.abs(Z)<lG?this.long0:JG(this.long0+Math.PI*(m-1+Math.sqrt(1+2*(Z*Z-c*c)+m*m))/2/Z),l.x=d,l.y=b,l},names:["Van_der_Grinten_I","VanDerGrinten","vandg"]};var Su={init:function(){this.sin_p12=Math.sin(this.lat0),this.cos_p12=Math.cos(this.lat0)},forward:function(l){var d,b,Z,c,m,X,G,W,u,a,h,s,V,y,p,t,n,i,R,o,L,K,H=l.x,x=l.y,S=Math.sin(l.y),Y=Math.cos(l.y),e=JG(H-this.long0);return this.sphere?Math.abs(this.sin_p12-1)<=lG?(l.x=this.x0+this.a*($X-x)*Math.sin(e),l.y=this.y0-this.a*($X-x)*Math.cos(e),l):Math.abs(this.sin_p12+1)<=lG?(l.x=this.x0+this.a*($X+x)*Math.sin(e),l.y=this.y0+this.a*($X+x)*Math.cos(e),l):(i=this.sin_p12*S+this.cos_p12*Y*Math.cos(e),n=(t=Math.acos(i))?t/Math.sin(t):1,l.x=this.x0+this.a*n*Y*Math.sin(e),l.y=this.y0+this.a*n*(this.cos_p12*S-this.sin_p12*Y*Math.cos(e)),l):(d=_W(this.es),b=qW(this.es),Z=$W(this.es),c=lu(this.es),Math.abs(this.sin_p12-1)<=lG?(m=this.a*AW(d,b,Z,c,$X),X=this.a*AW(d,b,Z,c,x),l.x=this.x0+(m-X)*Math.sin(e),l.y=this.y0-(m-X)*Math.cos(e),l):Math.abs(this.sin_p12+1)<=lG?(m=this.a*AW(d,b,Z,c,$X),X=this.a*AW(d,b,Z,c,x),l.x=this.x0+(m+X)*Math.sin(e),l.y=this.y0+(m+X)*Math.cos(e),l):(G=S/Y,W=du(this.a,this.e,this.sin_p12),u=du(this.a,this.e,S),a=Math.atan((1-this.es)*G+this.es*W*this.sin_p12/(u*Y)),R=0===(h=Math.atan2(Math.sin(e),this.cos_p12*Math.tan(a)-this.sin_p12*Math.cos(e)))?Math.asin(this.cos_p12*Math.sin(a)-this.sin_p12*Math.cos(a)):Math.abs(Math.abs(h)-Math.PI)<=lG?-Math.asin(this.cos_p12*Math.sin(a)-this.sin_p12*Math.cos(a)):Math.asin(Math.sin(e)*Math.cos(a)/Math.sin(h)),s=this.e*this.sin_p12/Math.sqrt(1-this.es),t=W*R*(1-(o=R*R)*(p=(V=this.e*this.cos_p12*Math.cos(h)/Math.sqrt(1-this.es))*V)*(1-p)/6+(L=o*R)/8*(y=s*V)*(1-2*p)+(K=L*R)/120*(p*(4-7*p)-3*s*s*(1-7*p))-K*R/48*y),l.x=this.x0+t*Math.sin(h),l.y=this.y0+t*Math.cos(h),l))},inverse:function(l){var d,b,Z,c,m,X,G,W,u,a,h,s,V,y,p,t,n,i,R,o,L,K,H;if(l.x-=this.x0,l.y-=this.y0,this.sphere){if((d=Math.sqrt(l.x*l.x+l.y*l.y))>2*$X*this.a)return;return b=d/this.a,Z=Math.sin(b),c=Math.cos(b),m=this.long0,Math.abs(d)<=lG?X=this.lat0:(X=Vu(c*this.sin_p12+l.y*Z*this.cos_p12/d),G=Math.abs(this.lat0)-$X,m=Math.abs(G)<=lG?this.lat0>=0?JG(this.long0+Math.atan2(l.x,-l.y)):JG(this.long0-Math.atan2(-l.x,l.y)):JG(this.long0+Math.atan2(l.x*Z,d*this.cos_p12*c-l.y*this.sin_p12*Z))),l.x=m,l.y=X,l}return W=_W(this.es),u=qW(this.es),a=$W(this.es),h=lu(this.es),Math.abs(this.sin_p12-1)<=lG?(X=Zu(((s=this.a*AW(W,u,a,h,$X))-(d=Math.sqrt(l.x*l.x+l.y*l.y)))/this.a,W,u,a,h),m=JG(this.long0+Math.atan2(l.x,-1*l.y)),l.x=m,l.y=X,l):Math.abs(this.sin_p12+1)<=lG?(s=this.a*AW(W,u,a,h,$X),X=Zu(((d=Math.sqrt(l.x*l.x+l.y*l.y))-s)/this.a,W,u,a,h),m=JG(this.long0+Math.atan2(l.x,l.y)),l.x=m,l.y=X,l):(d=Math.sqrt(l.x*l.x+l.y*l.y),p=Math.atan2(l.x,l.y),V=du(this.a,this.e,this.sin_p12),t=Math.cos(p),i=-(n=this.e*this.cos_p12*t)*n/(1-this.es),R=3*this.es*(1-i)*this.sin_p12*this.cos_p12*t/(1-this.es),K=1-i*(L=(o=d/V)-i*(1+i)*Math.pow(o,3)/6-R*(1+3*i)*Math.pow(o,4)/24)*L/2-o*L*L*L/6,y=Math.asin(this.sin_p12*Math.cos(L)+this.cos_p12*Math.sin(L)*t),m=JG(this.long0+Math.asin(Math.sin(p)*Math.sin(L)/Math.cos(y))),H=Math.sin(y),X=Math.atan2((H-this.es*K*this.sin_p12)*Math.tan(y),H*(1-this.es)),l.x=m,l.y=X,l)},names:["Azimuthal_Equidistant","aeqd"]};var Yu={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(l){var d,b,Z,c,m,X,G,W=l.x,u=l.y;return Z=JG(W-this.long0),d=Math.sin(u),b=Math.cos(u),c=Math.cos(Z),1,((m=this.sin_p14*d+this.cos_p14*b*c)>0||Math.abs(m)<=lG)&&(X=1*this.a*b*Math.sin(Z),G=this.y0+1*this.a*(this.cos_p14*d-this.sin_p14*b*c)),l.x=X,l.y=G,l},inverse:function(l){var d,b,Z,c,m,X,G;return l.x-=this.x0,l.y-=this.y0,b=Vu((d=Math.sqrt(l.x*l.x+l.y*l.y))/this.a),Z=Math.sin(b),c=Math.cos(b),X=this.long0,Math.abs(d)<=lG?(G=this.lat0,l.x=X,l.y=G,l):(G=Vu(c*this.sin_p14+l.y*Z*this.cos_p14/d),m=Math.abs(this.lat0)-$X,Math.abs(m)<=lG?(X=this.lat0>=0?JG(this.long0+Math.atan2(l.x,-l.y)):JG(this.long0-Math.atan2(-l.x,l.y)),l.x=X,l.y=G,l):(X=JG(this.long0+Math.atan2(l.x*Z,d*this.cos_p14*c-l.y*this.sin_p14*Z)),l.x=X,l.y=G,l))},names:["ortho"]},eu=1,Ju=2,zu=3,vu=4,Tu=5,Mu=6,Cu=1,Fu=2,Iu=3,ku=4;function Nu(l,d,b,Z){var c;return l<lG?(Z.value=Cu,c=0):(c=Math.atan2(d,b),Math.abs(c)<=ZG?Z.value=Cu:c>ZG&&c<=$X+ZG?(Z.value=Fu,c-=$X):c>$X+ZG||c<=-($X+ZG)?(Z.value=Iu,c=c>=0?c-mG:c+mG):(Z.value=ku,c+=$X)),c}function gu(l,d){var b=l+d;return b<-mG?b+=cG:b>+mG&&(b-=cG),b}var Pu={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Quadrilateralized Spherical Cube",this.lat0>=$X-ZG/2?this.face=Tu:this.lat0<=-($X-ZG/2)?this.face=Mu:Math.abs(this.long0)<=ZG?this.face=eu:Math.abs(this.long0)<=$X+ZG?this.face=this.long0>0?Ju:vu:this.face=zu,0!==this.es&&(this.one_minus_f=1-(this.a-this.b)/this.a,this.one_minus_f_squared=this.one_minus_f*this.one_minus_f)},forward:function(l){var d,b,Z,c,m,X,G={x:0,y:0},W={value:0};if(l.x-=this.long0,d=0!==this.es?Math.atan(this.one_minus_f_squared*Math.tan(l.y)):l.y,b=l.x,this.face===Tu)c=$X-d,b>=ZG&&b<=$X+ZG?(W.value=Cu,Z=b-$X):b>$X+ZG||b<=-($X+ZG)?(W.value=Fu,Z=b>0?b-mG:b+mG):b>-($X+ZG)&&b<=-ZG?(W.value=Iu,Z=b+$X):(W.value=ku,Z=b);else if(this.face===Mu)c=$X+d,b>=ZG&&b<=$X+ZG?(W.value=Cu,Z=-b+$X):b<ZG&&b>=-ZG?(W.value=Fu,Z=-b):b<-ZG&&b>=-($X+ZG)?(W.value=Iu,Z=-b-$X):(W.value=ku,Z=b>0?-b+mG:-b-mG);else{var u,a,h,s,V,y;this.face===Ju?b=gu(b,+$X):this.face===zu?b=gu(b,+mG):this.face===vu&&(b=gu(b,-$X)),s=Math.sin(d),V=Math.cos(d),y=Math.sin(b),u=V*Math.cos(b),a=V*y,h=s,this.face===eu?Z=Nu(c=Math.acos(u),h,a,W):this.face===Ju?Z=Nu(c=Math.acos(a),h,-u,W):this.face===zu?Z=Nu(c=Math.acos(-u),h,-a,W):this.face===vu?Z=Nu(c=Math.acos(-a),h,u,W):(c=Z=0,W.value=Cu)}return X=Math.atan(12/mG*(Z+Math.acos(Math.sin(Z)*Math.cos(ZG))-$X)),m=Math.sqrt((1-Math.cos(c))/(Math.cos(X)*Math.cos(X))/(1-Math.cos(Math.atan(1/Math.cos(Z))))),W.value===Fu?X+=$X:W.value===Iu?X+=mG:W.value===ku&&(X+=1.5*mG),G.x=m*Math.cos(X),G.y=m*Math.sin(X),G.x=G.x*this.a+this.x0,G.y=G.y*this.a+this.y0,l.x=G.x,l.y=G.y,l},inverse:function(l){var d,b,Z,c,m,X,G,W,u,a,h,s,V={lam:0,phi:0},y={value:0};if(l.x=(l.x-this.x0)/this.a,l.y=(l.y-this.y0)/this.a,b=Math.atan(Math.sqrt(l.x*l.x+l.y*l.y)),d=Math.atan2(l.y,l.x),l.x>=0&&l.x>=Math.abs(l.y)?y.value=Cu:l.y>=0&&l.y>=Math.abs(l.x)?(y.value=Fu,d-=$X):l.x<0&&-l.x>=Math.abs(l.y)?(y.value=Iu,d=d<0?d+mG:d-mG):(y.value=ku,d+=$X),u=mG/12*Math.tan(d),m=Math.sin(u)/(Math.cos(u)-1/Math.sqrt(2)),X=Math.atan(m),(G=1-(Z=Math.cos(d))*Z*(c=Math.tan(b))*c*(1-Math.cos(Math.atan(1/Math.cos(X)))))<-1?G=-1:G>1&&(G=1),this.face===Tu)W=Math.acos(G),V.phi=$X-W,y.value===Cu?V.lam=X+$X:y.value===Fu?V.lam=X<0?X+mG:X-mG:y.value===Iu?V.lam=X-$X:V.lam=X;else if(this.face===Mu)W=Math.acos(G),V.phi=W-$X,y.value===Cu?V.lam=-X+$X:y.value===Fu?V.lam=-X:y.value===Iu?V.lam=-X-$X:V.lam=X<0?-X-mG:-X+mG;else{var p,t,n;u=(p=G)*p,t=(u+=(n=u>=1?0:Math.sqrt(1-u)*Math.sin(X))*n)>=1?0:Math.sqrt(1-u),y.value===Fu?(u=t,t=-n,n=u):y.value===Iu?(t=-t,n=-n):y.value===ku&&(u=t,t=n,n=-u),this.face===Ju?(u=p,p=-t,t=u):this.face===zu?(p=-p,t=-t):this.face===vu&&(u=p,p=t,t=-u),V.phi=Math.acos(-n)-$X,V.lam=Math.atan2(t,p),this.face===Ju?V.lam=gu(V.lam,-$X):this.face===zu?V.lam=gu(V.lam,-mG):this.face===vu&&(V.lam=gu(V.lam,+$X))}return 0!==this.es&&(a=V.phi<0?1:0,h=Math.tan(V.phi),s=this.b/Math.sqrt(h*h+this.one_minus_f_squared),V.phi=Math.atan(Math.sqrt(this.a*this.a-s*s)/(this.one_minus_f*s)),a&&(V.phi=-V.phi)),V.lam+=this.long0,l.x=V.lam,l.y=V.phi,l},names:["Quadrilateralized Spherical Cube","Quadrilateralized_Spherical_Cube","qsc"]},Bu=[[1,22199e-21,-715515e-10,31103e-10],[.9986,-482243e-9,-24897e-9,-13309e-10],[.9954,-83103e-8,-448605e-10,-9.86701e-7],[.99,-.00135364,-59661e-9,36777e-10],[.9822,-.00167442,-449547e-11,-572411e-11],[.973,-.00214868,-903571e-10,1.8736e-8],[.96,-.00305085,-900761e-10,164917e-11],[.9427,-.00382792,-653386e-10,-26154e-10],[.9216,-.00467746,-10457e-8,481243e-11],[.8962,-.00536223,-323831e-10,-543432e-11],[.8679,-.00609363,-113898e-9,332484e-11],[.835,-.00698325,-640253e-10,9.34959e-7],[.7986,-.00755338,-500009e-10,9.35324e-7],[.7597,-.00798324,-35971e-9,-227626e-11],[.7186,-.00851367,-701149e-10,-86303e-10],[.6732,-.00986209,-199569e-9,191974e-10],[.6213,-.010418,883923e-10,624051e-11],[.5722,-.00906601,182e-6,624051e-11],[.5322,-.00677797,275608e-9,624051e-11]],wu=[[-520417e-23,.0124,121431e-23,-845284e-16],[.062,.0124,-1.26793e-9,4.22642e-10],[.124,.0124,5.07171e-9,-1.60604e-9],[.186,.0123999,-1.90189e-8,6.00152e-9],[.248,.0124002,7.10039e-8,-2.24e-8],[.31,.0123992,-2.64997e-7,8.35986e-8],[.372,.0124029,9.88983e-7,-3.11994e-7],[.434,.0123893,-369093e-11,-4.35621e-7],[.4958,.0123198,-102252e-10,-3.45523e-7],[.5571,.0121916,-154081e-10,-5.82288e-7],[.6176,.0119938,-241424e-10,-5.25327e-7],[.6769,.011713,-320223e-10,-5.16405e-7],[.7346,.0113541,-397684e-10,-6.09052e-7],[.7903,.0109107,-489042e-10,-104739e-11],[.8435,.0103431,-64615e-9,-1.40374e-9],[.8936,.00969686,-64636e-9,-8547e-9],[.9394,.00840947,-192841e-9,-42106e-10],[.9761,.00616527,-256e-6,-42106e-10],[1,.00328947,-319159e-9,-42106e-10]],Uu=.8487,ru=1.3523,Qu=bG/5,ju=18,fu=function(l,d){return l[0]+d*(l[1]+d*(l[2]+d*l[3]))};var Eu={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.long0=this.long0||0,this.es=0,this.title=this.title||"Robinson"},forward:function(l){var d=JG(l.x-this.long0),b=Math.abs(l.y),Z=Math.floor(b*Qu);Z<0?Z=0:Z>=ju&&(Z=17);var c={x:fu(Bu[Z],b=bG*(b-.08726646259971647*Z))*d,y:fu(wu[Z],b)};return l.y<0&&(c.y=-c.y),c.x=c.x*this.a*Uu+this.x0,c.y=c.y*this.a*ru+this.y0,c},inverse:function(l){var d={x:(l.x-this.x0)/(this.a*Uu),y:Math.abs(l.y-this.y0)/(this.a*ru)};if(d.y>=1)d.x/=Bu[18][0],d.y=l.y<0?-$X:$X;else{var b=Math.floor(d.y*ju);for(b<0?b=0:b>=ju&&(b=17);;)if(wu[b][0]>d.y)--b;else{if(!(wu[b+1][0]<=d.y))break;++b}var Z=wu[b],c=5*(d.y-Z[0])/(wu[b+1][0]-Z[0]);c=function(l,d,b,Z){for(var c=d;Z;--Z){var m=l(c);if(c-=m,Math.abs(m)<b)break}return c}((function(l){return(fu(Z,l)-d.y)/function(l,d){return l[1]+d*(2*l[2]+3*d*l[3])}(Z,l)}),c,lG,100),d.x/=fu(Bu[b],c),d.y=(5*b+c)*dG,l.y<0&&(d.y=-d.y)}return d.x=JG(d.x+this.long0),d},names:["Robinson","robin"]};var Ou={init:function(){this.name="geocent"},forward:function(l){return OG(l,this.es,this.a)},inverse:function(l){return DG(l,this.es,this.a,this.b)},names:["Geocentric","geocentric","geocent","Geocent"]},Du=0,Au=1,_u=2,qu=3,$u={h:{def:1e5,num:!0},azi:{def:0,num:!0,degrees:!0},tilt:{def:0,num:!0,degrees:!0},long0:{def:0,num:!0},lat0:{def:0,num:!0}};var la={init:function(){if(Object.keys($u).forEach(function(l){if(void 0===this[l])this[l]=$u[l].def;else{if($u[l].num&&isNaN(this[l]))throw new Error("Invalid parameter value, must be numeric "+l+" = "+this[l]);$u[l].num&&(this[l]=parseFloat(this[l]))}$u[l].degrees&&(this[l]=this[l]*dG)}.bind(this)),Math.abs(Math.abs(this.lat0)-$X)<lG?this.mode=this.lat0<0?Au:Du:Math.abs(this.lat0)<lG?this.mode=_u:(this.mode=qu,this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0)),this.pn1=this.h/this.a,this.pn1<=0||this.pn1>1e10)throw new Error("Invalid height");this.p=1+this.pn1,this.rp=1/this.p,this.h1=1/this.pn1,this.pfact=(this.p+1)*this.h1,this.es=0;var l=this.tilt,d=this.azi;this.cg=Math.cos(d),this.sg=Math.sin(d),this.cw=Math.cos(l),this.sw=Math.sin(l)},forward:function(l){l.x-=this.long0;var d,b,Z,c,m=Math.sin(l.y),X=Math.cos(l.y),G=Math.cos(l.x);switch(this.mode){case qu:b=this.sinph0*m+this.cosph0*X*G;break;case _u:b=X*G;break;case Au:b=-m;break;case Du:b=m}switch(d=(b=this.pn1/(this.p-b))*X*Math.sin(l.x),this.mode){case qu:b*=this.cosph0*m-this.sinph0*X*G;break;case _u:b*=m;break;case Du:b*=-X*G;break;case Au:b*=X*G}return c=1/((Z=b*this.cg+d*this.sg)*this.sw*this.h1+this.cw),d=(d*this.cg-b*this.sg)*this.cw*c,b=Z*c,l.x=d*this.a,l.y=b*this.a,l},inverse:function(l){l.x/=this.a,l.y/=this.a;var d,b,Z,c={x:l.x,y:l.y};Z=1/(this.pn1-l.y*this.sw),d=this.pn1*l.x*Z,b=this.pn1*l.y*this.cw*Z,l.x=d*this.cg+b*this.sg,l.y=b*this.cg-d*this.sg;var m=IW(l.x,l.y);if(Math.abs(m)<lG)c.x=0,c.y=l.y;else{var X,G;switch(G=1-m*m*this.pfact,G=(this.p-Math.sqrt(G))/(this.pn1/m+m/this.pn1),X=Math.sqrt(1-G*G),this.mode){case qu:c.y=Math.asin(X*this.sinph0+l.y*G*this.cosph0/m),l.y=(X-this.sinph0*Math.sin(c.y))*m,l.x*=G*this.cosph0;break;case _u:c.y=Math.asin(l.y*G/m),l.y=X*m,l.x*=G;break;case Du:c.y=Math.asin(X),l.y=-l.y;break;case Au:c.y=-Math.asin(X)}c.x=Math.atan2(l.x,l.y)}return l.x=c.x+this.long0,l.y=c.y,l},names:["Tilted_Perspective","tpers"]};var da={init:function(){if(this.flip_axis="x"===this.sweep?1:0,this.h=Number(this.h),this.radius_g_1=this.h/this.a,this.radius_g_1<=0||this.radius_g_1>1e10)throw new Error;if(this.radius_g=1+this.radius_g_1,this.C=this.radius_g*this.radius_g-1,0!==this.es){var l=1-this.es,d=1/l;this.radius_p=Math.sqrt(l),this.radius_p2=l,this.radius_p_inv2=d,this.shape="ellipse"}else this.radius_p=1,this.radius_p2=1,this.radius_p_inv2=1,this.shape="sphere";this.title||(this.title="Geostationary Satellite View")},forward:function(l){var d,b,Z,c,m=l.x,X=l.y;if(m-=this.long0,"ellipse"===this.shape){X=Math.atan(this.radius_p2*Math.tan(X));var G=this.radius_p/IW(this.radius_p*Math.cos(X),Math.sin(X));if(b=G*Math.cos(m)*Math.cos(X),Z=G*Math.sin(m)*Math.cos(X),c=G*Math.sin(X),(this.radius_g-b)*b-Z*Z-c*c*this.radius_p_inv2<0)return l.x=Number.NaN,l.y=Number.NaN,l;d=this.radius_g-b,this.flip_axis?(l.x=this.radius_g_1*Math.atan(Z/IW(c,d)),l.y=this.radius_g_1*Math.atan(c/d)):(l.x=this.radius_g_1*Math.atan(Z/d),l.y=this.radius_g_1*Math.atan(c/IW(Z,d)))}else"sphere"===this.shape&&(d=Math.cos(X),b=Math.cos(m)*d,Z=Math.sin(m)*d,c=Math.sin(X),d=this.radius_g-b,this.flip_axis?(l.x=this.radius_g_1*Math.atan(Z/IW(c,d)),l.y=this.radius_g_1*Math.atan(c/d)):(l.x=this.radius_g_1*Math.atan(Z/d),l.y=this.radius_g_1*Math.atan(c/IW(Z,d))));return l.x=l.x*this.a,l.y=l.y*this.a,l},inverse:function(l){var d,b,Z,c,m=-1,X=0,G=0;if(l.x=l.x/this.a,l.y=l.y/this.a,"ellipse"===this.shape){this.flip_axis?(G=Math.tan(l.y/this.radius_g_1),X=Math.tan(l.x/this.radius_g_1)*IW(1,G)):(X=Math.tan(l.x/this.radius_g_1),G=Math.tan(l.y/this.radius_g_1)*IW(1,X));var W=G/this.radius_p;if(d=X*X+W*W+m*m,(Z=(b=2*this.radius_g*m)*b-4*d*this.C)<0)return l.x=Number.NaN,l.y=Number.NaN,l;c=(-b-Math.sqrt(Z))/(2*d),m=this.radius_g+c*m,X*=c,G*=c,l.x=Math.atan2(X,m),l.y=Math.atan(G*Math.cos(l.x)/m),l.y=Math.atan(this.radius_p_inv2*Math.tan(l.y))}else if("sphere"===this.shape){if(this.flip_axis?(G=Math.tan(l.y/this.radius_g_1),X=Math.tan(l.x/this.radius_g_1)*Math.sqrt(1+G*G)):(X=Math.tan(l.x/this.radius_g_1),G=Math.tan(l.y/this.radius_g_1)*Math.sqrt(1+X*X)),d=X*X+G*G+m*m,(Z=(b=2*this.radius_g*m)*b-4*d*this.C)<0)return l.x=Number.NaN,l.y=Number.NaN,l;c=(-b-Math.sqrt(Z))/(2*d),m=this.radius_g+c*m,X*=c,G*=c,l.x=Math.atan2(X,m),l.y=Math.atan(G*Math.cos(l.x)/m)}return l.x=l.x+this.long0,l},names:["Geostationary Satellite View","Geostationary_Satellite","geos"]};function ba(l,d){var b=Object.keys(l);if(Object.getOwnPropertySymbols){var Z=Object.getOwnPropertySymbols(l);d&&(Z=Z.filter((function(d){return Object.getOwnPropertyDescriptor(l,d).enumerable}))),b.push.apply(b,Z)}return b}function Za(l){for(var d=1;d<arguments.length;d++){var b=null!=arguments[d]?arguments[d]:{};d%2?ba(Object(b),!0).forEach((function(d){Z(l,d,b[d])})):Object.getOwnPropertyDescriptors?Object.defineProperties(l,Object.getOwnPropertyDescriptors(b)):ba(Object(b)).forEach((function(d){Object.defineProperty(l,d,Object.getOwnPropertyDescriptor(b,d))}))}return l}WW.defaultDatum="WGS84",WW.Proj=EG,WW.WGS84=new WW.Proj("WGS84"),WW.Point=YW,WW.toPoint=bW,WW.defs=LG,WW.nadgrid=function(l,d){var b=new DataView(d),Z=function(l){var d=l.getInt32(8,!1);if(11===d)return!1;11!==(d=l.getInt32(8,!0))&&console.warn("Failed to detect nadgrid endian-ness, defaulting to little-endian");return!0}(b),c=function(l,d){return{nFields:l.getInt32(8,d),nSubgridFields:l.getInt32(24,d),nSubgrids:l.getInt32(40,d),shiftType:rG(l,56,64).trim(),fromSemiMajorAxis:l.getFloat64(120,d),fromSemiMinorAxis:l.getFloat64(136,d),toSemiMajorAxis:l.getFloat64(152,d),toSemiMinorAxis:l.getFloat64(168,d)}}(b,Z);c.nSubgrids>1&&console.log("Only single NTv2 subgrids are currently supported, subsequent sub grids are ignored");var m=function(l,d,b){for(var Z=176,c=[],m=0;m<d.nSubgrids;m++){var X=jG(l,Z,b),G=fG(l,Z,X,b),W=Math.round(1+(X.upperLongitude-X.lowerLongitude)/X.longitudeInterval),u=Math.round(1+(X.upperLatitude-X.lowerLatitude)/X.latitudeInterval);c.push({ll:[UG(X.lowerLongitude),UG(X.lowerLatitude)],del:[UG(X.longitudeInterval),UG(X.latitudeInterval)],lim:[W,u],count:X.gridNodeCount,cvs:QG(G)})}return c}(b,c,Z),X={header:c,subgrids:m};return BG[l]=X,X},WW.transform=cW,WW.mgrs=tW,WW.version="__VERSION__",function(l){l.Proj.projections.add(CW),l.Proj.projections.add(PW),l.Proj.projections.add(BW),l.Proj.projections.add(rW),l.Proj.projections.add(QW),l.Proj.projections.add(jW),l.Proj.projections.add(EW),l.Proj.projections.add(OW),l.Proj.projections.add(DW),l.Proj.projections.add(cu),l.Proj.projections.add(su),l.Proj.projections.add(yu),l.Proj.projections.add(pu),l.Proj.projections.add(tu),l.Proj.projections.add(nu),l.Proj.projections.add(iu),l.Proj.projections.add(Ru),l.Proj.projections.add(ou),l.Proj.projections.add(Lu),l.Proj.projections.add(Ku),l.Proj.projections.add(Hu),l.Proj.projections.add(xu),l.Proj.projections.add(Su),l.Proj.projections.add(Yu),l.Proj.projections.add(Pu),l.Proj.projections.add(Eu),l.Proj.projections.add(Ou),l.Proj.projections.add(la),l.Proj.projections.add(da)}(WW),WW.defs([["EPSG:4326","+title=WGS84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"],["EPSG:3826","+title=TWD97 TM2 +proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=GRS80 +units=m +no_defs"],["EPSG:3828","+title=TWD67 TM2 +proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=aust_SA +towgs84=-752,-358,-179,-0.0000011698,0.0000018398,0.0000009822,0.00002329 +units=m +no_defs"]]);var ca=null,ma=(ca=Xc()?DX:b).helpers,Xa=ma.polygon,Ga=ma.multiPolygon,Wa=ma.lineString,ua=ca.area,aa=ca.centroid,ha=ca.centerOfMass,sa=ca.intersect,Va=ca.mask,ya=ca.difference,pa=ca.bezierSpline,ta=ca.buffer,na=ca.booleanPointInPolygon;function ia(l){var d=function(l){var d=cZ(Hb(l,"0",null)),b=cZ(Hb(l,"0.0",null));return 2===cZ(Hb(l,"0.0.0",null))?3:2===b?2:2===d?1:0===d?0:(console.log("invalid point depth",l),null)}(l);return 3===d?l:2===d?Cb(l,(function(l){return[l]})):1===d?[[l]]:0===d?[]:l}function Ra(l){return Zc(l)?aa(Ga(ia(l))).geometry.coordinates:null}function oa(l){return Zc(l)?ua(Ga(ia(l))):null}function La(l){return Cb(l,(function(l){return Cb(l,(function(l){return[l[1],l[0]]}))}))}function Ka(l){return Cb(l,(function(l){return La(l)}))}function Ha(l){var d,b,Z=Hb(l,"geometry.type"),c=Hb(l,"geometry.coordinates");return"Polygon"===Z?[c]:"MultiPolygon"===Z?c:"GeometryCollection"===Z?(d=Hb(l,"geometry.geometries",[]),b=[],ul(d,(function(l){"Polygon"===l.type?b.push(l.coordinates):"MultiPolygon"===l.type&&ul(l.coordinates,(function(l){b.push(l)}))})),b):[]}function xa(l,d){return Ha(sa(Ga(ia(l)),Ga(ia(d))))}function Sa(l,d){return Ha(ya(Ga(ia(l)),Ga(ia(d))))}var Ya={turf:ca,toMultiPolygon:ia,getCentroidMultiPolygon:Ra,getCenterOfMassMultiPolygon:function(l){return Zc(l)?ha(Ga(ia(l))).geometry.coordinates:null},getArea:oa,isPointInPolygon:function(l,d){return na(l,Ga(ia(d)))},intersectMultiPolygon:xa,clipMultiPolygon:Sa,maskMultiPolygon:function(l){return Ha(Va(Ga(ia(l))))},splineMultiPolygon:function(l){var d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};function b(l){var d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};l=_Z(l);var b=Cb(l,(function(l,b){var Z=Wa(l),c=pa(Z,d);return Hb(c,"geometry.coordinates")}));return b}return l=_Z(l),l=Cb(l,(function(l){return b(l,d)}))},simplifyMultiPolygon:function(l){var d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!Zc(l))return null;var b=Hb(d,"tolerance");mZ(b)||(b=.005);var Z=Hb(d,"highQuality");mc(Z)||(Z=!0);var c=ca.simplify(ca.multiPolygon(ia(l)),{tolerance:b,highQuality:Z});return c=Hb(c,"geometry.coordinates",[])},fixGeometryMultiPolygon:function(l){l=_Z(l);var d=[];return ul(l,(function(l){var b=function(l){l=La(l);var d=Xa(l),b=Ha(ta(d,1,{units:"kilometers"}));return Ka(b)}(l);ul(b,(function(l){d.push(l)}))})),d=Bb(d,bc)},calcContours:function(l){var d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};function b(l){return BX()(l)}for(var Z=Hb(d,"containInner",null),c=Hb(d,"clipInner",null),m=Hb(d,"clipOuter",null),G=l[0][2],W=l[0][2],u=1;u<cZ(l);u++){var a=l[u][2];G>a&&(G=a),W<a&&(W=a)}var h=b(l);if(!Zc(h))return[];var s=Cb(h,(function(l,d){return{latLngs:l.coordinates,level:l.value,effectArea:oa(l.coordinates),effectAreaCentroid:Ra(l.coordinates)}})),V=kb(Cb(s,"level")),y=gb(Cb(s,"level"));if(y<W&&s.push({mode:"virtualEnd",latLngs:[],level:W,effectArea:0}),V>G){var p={mode:"virtualStart",latLngs:[],level:G,effectArea:0};s=[p].concat(X(s))}ul(s,(function(l,d){l.level=Math.min(l.level,W),l.level=Math.max(l.level,G)}));for(var t=[],n=0;n<=s.length-2;n++){var i=s[n].latLngs,R=s[n+1].latLngs,o={text:"".concat(s[n].level," - ").concat(s[n+1].level),low:s[n].level,up:s[n+1].level},L=[];L=Sa(i,R),L=Hb(s[n],!1)?R:Sa(i,R),t.push(Za(Za({},s[n]),{},{latLngs:L,range:o}))}var K=[];ul(t,(function(l,d){var b=null;b=Zc(Z)?xa(l.latLngs,Z):l.latLngs,cZ(b)>0&&K.push(Za(Za({},l),{},{latLngs:b}))}));var H=[];ul(t=K,(function(l,d){var b=null;b=Zc(c)?Sa(l.latLngs,c):l.latLngs,cZ(b)>0&&H.push(Za(Za({},l),{},{latLngs:b}))}));var x=[];ul(t=H,(function(l){var d=null;d=Zc(m)?xa(l.latLngs,m):l.latLngs,cZ(d)>0&&x.push(Za(Za({},l),{},{latLngs:d}))}));var S=0,Y=null,e=null;return ul(t=x,(function(l,d){S<l.effectArea&&(Y=d,S=l.effectArea,e=l.effectAreaCentroid)})),null===Y?[]:(ul(t,(function(l,d){t[d].center=e})),t)},invCoordPolygon:La,invCoordMultiPolygon:Ka,convertCoordinate:function(l,d,b){if(!Zc(b)&&2!==cZ(b))throw new Error("ps is not an array(length=2)");var Z={TWD97TM2:"EPSG:3826",TWD67TM2:"EPSG:3828",WGS84:"EPSG:4326"};EX(Z,l)&&(l=Z[l]),EX(Z,d)&&(d=Z[d]);var c=new WW.Proj(l),m=new WW.Proj(d);return WW(c,m,b)}};return Ya}));
|
|
6
|
+
!function(l,d){"object"==typeof exports&&"undefined"!=typeof module?d(exports,require("@turf/turf")):"function"==typeof define&&define.amd?define(["exports","@turf/turf"],d):d((l="undefined"!=typeof globalThis?globalThis:l||self)["w-gis"]={},l["@turf/turf"])}(this,(function(l,d){"use strict";function b(l){if(l&&l.__esModule)return l;var d=Object.create(null);return l&&Object.keys(l).forEach((function(b){if("default"!==b){var Z=Object.getOwnPropertyDescriptor(l,b);Object.defineProperty(d,b,Z.get?Z:{enumerable:!0,get:function(){return l[b]}})}})),d.default=l,Object.freeze(d)}var Z=b(d);function c(l,d,b){return d in l?Object.defineProperty(l,d,{value:b,enumerable:!0,configurable:!0,writable:!0}):l[d]=b,l}function m(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}function X(l,d){if(l){if("string"==typeof l)return m(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);return"Object"===b&&l.constructor&&(b=l.constructor.name),"Map"===b||"Set"===b?Array.from(l):"Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b)?m(l,d):void 0}}function G(l){return function(l){if(Array.isArray(l))return m(l)}(l)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(l)||X(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.")}()}var W=function(l,d){for(var b=-1,Z=null==l?0:l.length;++b<Z&&!1!==d(l[b],b,l););return l};var u=function(l){return function(d,b,Z){for(var c=-1,m=Object(d),X=Z(d),G=X.length;G--;){var W=X[l?G:++c];if(!1===b(m[W],W,m))break}return d}},a=u();var s=function(l,d){for(var b=-1,Z=Array(l);++b<l;)Z[b]=d(b);return Z};function h(l){return h="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},h(l)}var V="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function y(l){if(l.__esModule)return l;var d=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(l).forEach((function(b){var Z=Object.getOwnPropertyDescriptor(l,b);Object.defineProperty(d,b,Z.get?Z:{enumerable:!0,get:function(){return l[b]}})})),d}function p(l){var d={exports:{}};return l(d,d.exports),d.exports}var t="object"==h(V)&&V&&V.Object===Object&&V,n="object"==("undefined"==typeof self?"undefined":h(self))&&self&&self.Object===Object&&self,i=t||n||Function("return this")(),R=i.Symbol,o=Object.prototype,L=o.hasOwnProperty,K=o.toString,H=R?R.toStringTag:void 0;var x=function(l){var d=L.call(l,H),b=l[H];try{l[H]=void 0;var Z=!0}catch(l){}var c=K.call(l);return Z&&(d?l[H]=b:delete l[H]),c},S=Object.prototype.toString;var Y=function(l){return S.call(l)},e=R?R.toStringTag:void 0;var J=function(l){return null==l?void 0===l?"[object Undefined]":"[object Null]":e&&e in Object(l)?x(l):Y(l)};var z=function(l){return null!=l&&"object"==h(l)};var v=function(l){return z(l)&&"[object Arguments]"==J(l)},T=Object.prototype,M=T.hasOwnProperty,C=T.propertyIsEnumerable,F=v(function(){return arguments}())?v:function(l){return z(l)&&M.call(l,"callee")&&!C.call(l,"callee")},I=F,k=Array.isArray;var N=function(){return!1},g=p((function(l,d){var b=d&&!d.nodeType&&d,Z=b&&l&&!l.nodeType&&l,c=Z&&Z.exports===b?i.Buffer:void 0,m=(c?c.isBuffer:void 0)||N;l.exports=m})),P=/^(?:0|[1-9]\d*)$/;var B=function(l,d){var b=h(l);return!!(d=null==d?9007199254740991:d)&&("number"==b||"symbol"!=b&&P.test(l))&&l>-1&&l%1==0&&l<d};var w=function(l){return"number"==typeof l&&l>-1&&l%1==0&&l<=9007199254740991},U={};U["[object Float32Array]"]=U["[object Float64Array]"]=U["[object Int8Array]"]=U["[object Int16Array]"]=U["[object Int32Array]"]=U["[object Uint8Array]"]=U["[object Uint8ClampedArray]"]=U["[object Uint16Array]"]=U["[object Uint32Array]"]=!0,U["[object Arguments]"]=U["[object Array]"]=U["[object ArrayBuffer]"]=U["[object Boolean]"]=U["[object DataView]"]=U["[object Date]"]=U["[object Error]"]=U["[object Function]"]=U["[object Map]"]=U["[object Number]"]=U["[object Object]"]=U["[object RegExp]"]=U["[object Set]"]=U["[object String]"]=U["[object WeakMap]"]=!1;var r=function(l){return z(l)&&w(l.length)&&!!U[J(l)]};var Q=function(l){return function(d){return l(d)}},j=p((function(l,d){var b=d&&!d.nodeType&&d,Z=b&&l&&!l.nodeType&&l,c=Z&&Z.exports===b&&t.process,m=function(){try{var l=Z&&Z.require&&Z.require("util").types;return l||c&&c.binding&&c.binding("util")}catch(l){}}();l.exports=m})),f=j&&j.isTypedArray,E=f?Q(f):r,O=Object.prototype.hasOwnProperty;var D=function(l,d){var b=k(l),Z=!b&&I(l),c=!b&&!Z&&g(l),m=!b&&!Z&&!c&&E(l),X=b||Z||c||m,G=X?s(l.length,String):[],W=G.length;for(var u in l)!d&&!O.call(l,u)||X&&("length"==u||c&&("offset"==u||"parent"==u)||m&&("buffer"==u||"byteLength"==u||"byteOffset"==u)||B(u,W))||G.push(u);return G},A=Object.prototype;var _=function(l){var d=l&&l.constructor;return l===("function"==typeof d&&d.prototype||A)};var q=function(l,d){return function(b){return l(d(b))}},$=q(Object.keys,Object),ll=Object.prototype.hasOwnProperty;var dl=function(l){if(!_(l))return $(l);var d=[];for(var b in Object(l))ll.call(l,b)&&"constructor"!=b&&d.push(b);return d};var bl=function(l){var d=h(l);return null!=l&&("object"==d||"function"==d)};var Zl=function(l){if(!bl(l))return!1;var d=J(l);return"[object Function]"==d||"[object GeneratorFunction]"==d||"[object AsyncFunction]"==d||"[object Proxy]"==d};var cl=function(l){return null!=l&&w(l.length)&&!Zl(l)};var ml=function(l){return cl(l)?D(l):dl(l)};var Xl=function(l,d){return l&&a(l,d,ml)};var Gl=function(l,d){return function(b,Z){if(null==b)return b;if(!cl(b))return l(b,Z);for(var c=b.length,m=d?c:-1,X=Object(b);(d?m--:++m<c)&&!1!==Z(X[m],m,X););return b}}(Xl);var Wl=function(l){return l};var ul=function(l){return"function"==typeof l?l:Wl};var al=function(l,d){return(k(l)?W:Gl)(l,ul(d))};var sl=function(l,d){for(var b=-1,Z=null==l?0:l.length,c=Array(Z);++b<Z;)c[b]=d(l[b],b,l);return c};var hl=function(){this.__data__=[],this.size=0};var Vl=function(l,d){return l===d||l!=l&&d!=d};var yl=function(l,d){for(var b=l.length;b--;)if(Vl(l[b][0],d))return b;return-1},pl=Array.prototype.splice;var tl=function(l){var d=this.__data__,b=yl(d,l);return!(b<0)&&(b==d.length-1?d.pop():pl.call(d,b,1),--this.size,!0)};var nl=function(l){var d=this.__data__,b=yl(d,l);return b<0?void 0:d[b][1]};var il=function(l){return yl(this.__data__,l)>-1};var Rl=function(l,d){var b=this.__data__,Z=yl(b,l);return Z<0?(++this.size,b.push([l,d])):b[Z][1]=d,this};function ol(l){var d=-1,b=null==l?0:l.length;for(this.clear();++d<b;){var Z=l[d];this.set(Z[0],Z[1])}}ol.prototype.clear=hl,ol.prototype.delete=tl,ol.prototype.get=nl,ol.prototype.has=il,ol.prototype.set=Rl;var Ll=ol;var Kl=function(){this.__data__=new Ll,this.size=0};var Hl=function(l){var d=this.__data__,b=d.delete(l);return this.size=d.size,b};var xl=function(l){return this.__data__.get(l)};var Sl,Yl=function(l){return this.__data__.has(l)},el=i["__core-js_shared__"],Jl=(Sl=/[^.]+$/.exec(el&&el.keys&&el.keys.IE_PROTO||""))?"Symbol(src)_1."+Sl:"";var zl=function(l){return!!Jl&&Jl in l},vl=Function.prototype.toString;var Tl=function(l){if(null!=l){try{return vl.call(l)}catch(l){}try{return l+""}catch(l){}}return""},Ml=/^\[object .+?Constructor\]$/,Cl=Function.prototype,Fl=Object.prototype,Il=Cl.toString,kl=Fl.hasOwnProperty,Nl=RegExp("^"+Il.call(kl).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");var gl=function(l){return!(!bl(l)||zl(l))&&(Zl(l)?Nl:Ml).test(Tl(l))};var Pl=function(l,d){return null==l?void 0:l[d]};var Bl=function(l,d){var b=Pl(l,d);return gl(b)?b:void 0},wl=Bl(i,"Map"),Ul=Bl(Object,"create");var rl=function(){this.__data__=Ul?Ul(null):{},this.size=0};var Ql=function(l){var d=this.has(l)&&delete this.__data__[l];return this.size-=d?1:0,d},jl=Object.prototype.hasOwnProperty;var fl=function(l){var d=this.__data__;if(Ul){var b=d[l];return"__lodash_hash_undefined__"===b?void 0:b}return jl.call(d,l)?d[l]:void 0},El=Object.prototype.hasOwnProperty;var Ol=function(l){var d=this.__data__;return Ul?void 0!==d[l]:El.call(d,l)};var Dl=function(l,d){var b=this.__data__;return this.size+=this.has(l)?0:1,b[l]=Ul&&void 0===d?"__lodash_hash_undefined__":d,this};function Al(l){var d=-1,b=null==l?0:l.length;for(this.clear();++d<b;){var Z=l[d];this.set(Z[0],Z[1])}}Al.prototype.clear=rl,Al.prototype.delete=Ql,Al.prototype.get=fl,Al.prototype.has=Ol,Al.prototype.set=Dl;var _l=Al;var ql=function(){this.size=0,this.__data__={hash:new _l,map:new(wl||Ll),string:new _l}};var $l=function(l){var d=h(l);return"string"==d||"number"==d||"symbol"==d||"boolean"==d?"__proto__"!==l:null===l};var ld=function(l,d){var b=l.__data__;return $l(d)?b["string"==typeof d?"string":"hash"]:b.map};var dd=function(l){var d=ld(this,l).delete(l);return this.size-=d?1:0,d};var bd=function(l){return ld(this,l).get(l)};var Zd=function(l){return ld(this,l).has(l)};var cd=function(l,d){var b=ld(this,l),Z=b.size;return b.set(l,d),this.size+=b.size==Z?0:1,this};function md(l){var d=-1,b=null==l?0:l.length;for(this.clear();++d<b;){var Z=l[d];this.set(Z[0],Z[1])}}md.prototype.clear=ql,md.prototype.delete=dd,md.prototype.get=bd,md.prototype.has=Zd,md.prototype.set=cd;var Xd=md;var Gd=function(l,d){var b=this.__data__;if(b instanceof Ll){var Z=b.__data__;if(!wl||Z.length<199)return Z.push([l,d]),this.size=++b.size,this;b=this.__data__=new Xd(Z)}return b.set(l,d),this.size=b.size,this};function Wd(l){var d=this.__data__=new Ll(l);this.size=d.size}Wd.prototype.clear=Kl,Wd.prototype.delete=Hl,Wd.prototype.get=xl,Wd.prototype.has=Yl,Wd.prototype.set=Gd;var ud=Wd;var ad=function(l){return this.__data__.set(l,"__lodash_hash_undefined__"),this};var sd=function(l){return this.__data__.has(l)};function hd(l){var d=-1,b=null==l?0:l.length;for(this.__data__=new Xd;++d<b;)this.add(l[d])}hd.prototype.add=hd.prototype.push=ad,hd.prototype.has=sd;var Vd=hd;var yd=function(l,d){for(var b=-1,Z=null==l?0:l.length;++b<Z;)if(d(l[b],b,l))return!0;return!1};var pd=function(l,d){return l.has(d)};var td=function(l,d,b,Z,c,m){var X=1&b,G=l.length,W=d.length;if(G!=W&&!(X&&W>G))return!1;var u=m.get(l),a=m.get(d);if(u&&a)return u==d&&a==l;var s=-1,h=!0,V=2&b?new Vd:void 0;for(m.set(l,d),m.set(d,l);++s<G;){var y=l[s],p=d[s];if(Z)var t=X?Z(p,y,s,d,l,m):Z(y,p,s,l,d,m);if(void 0!==t){if(t)continue;h=!1;break}if(V){if(!yd(d,(function(l,d){if(!pd(V,d)&&(y===l||c(y,l,b,Z,m)))return V.push(d)}))){h=!1;break}}else if(y!==p&&!c(y,p,b,Z,m)){h=!1;break}}return m.delete(l),m.delete(d),h},nd=i.Uint8Array;var id=function(l){var d=-1,b=Array(l.size);return l.forEach((function(l,Z){b[++d]=[Z,l]})),b};var Rd=function(l){var d=-1,b=Array(l.size);return l.forEach((function(l){b[++d]=l})),b},od=R?R.prototype:void 0,Ld=od?od.valueOf:void 0;var Kd=function(l,d,b,Z,c,m,X){switch(b){case"[object DataView]":if(l.byteLength!=d.byteLength||l.byteOffset!=d.byteOffset)return!1;l=l.buffer,d=d.buffer;case"[object ArrayBuffer]":return!(l.byteLength!=d.byteLength||!m(new nd(l),new nd(d)));case"[object Boolean]":case"[object Date]":case"[object Number]":return Vl(+l,+d);case"[object Error]":return l.name==d.name&&l.message==d.message;case"[object RegExp]":case"[object String]":return l==d+"";case"[object Map]":var G=id;case"[object Set]":var W=1&Z;if(G||(G=Rd),l.size!=d.size&&!W)return!1;var u=X.get(l);if(u)return u==d;Z|=2,X.set(l,d);var a=td(G(l),G(d),Z,c,m,X);return X.delete(l),a;case"[object Symbol]":if(Ld)return Ld.call(l)==Ld.call(d)}return!1};var Hd=function(l,d){for(var b=-1,Z=d.length,c=l.length;++b<Z;)l[c+b]=d[b];return l};var xd=function(l,d,b){var Z=d(l);return k(l)?Z:Hd(Z,b(l))};var Sd=function(l,d){for(var b=-1,Z=null==l?0:l.length,c=0,m=[];++b<Z;){var X=l[b];d(X,b,l)&&(m[c++]=X)}return m};var Yd=function(){return[]},ed=Object.prototype.propertyIsEnumerable,Jd=Object.getOwnPropertySymbols,zd=Jd?function(l){return null==l?[]:(l=Object(l),Sd(Jd(l),(function(d){return ed.call(l,d)})))}:Yd,vd=zd;var Td=function(l){return xd(l,ml,vd)},Md=Object.prototype.hasOwnProperty;var Cd=function(l,d,b,Z,c,m){var X=1&b,G=Td(l),W=G.length;if(W!=Td(d).length&&!X)return!1;for(var u=W;u--;){var a=G[u];if(!(X?a in d:Md.call(d,a)))return!1}var s=m.get(l),h=m.get(d);if(s&&h)return s==d&&h==l;var V=!0;m.set(l,d),m.set(d,l);for(var y=X;++u<W;){var p=l[a=G[u]],t=d[a];if(Z)var n=X?Z(t,p,a,d,l,m):Z(p,t,a,l,d,m);if(!(void 0===n?p===t||c(p,t,b,Z,m):n)){V=!1;break}y||(y="constructor"==a)}if(V&&!y){var i=l.constructor,R=d.constructor;i==R||!("constructor"in l)||!("constructor"in d)||"function"==typeof i&&i instanceof i&&"function"==typeof R&&R instanceof R||(V=!1)}return m.delete(l),m.delete(d),V},Fd=Bl(i,"DataView"),Id=Bl(i,"Promise"),kd=Bl(i,"Set"),Nd=Bl(i,"WeakMap"),gd="[object Map]",Pd="[object Promise]",Bd="[object Set]",wd="[object WeakMap]",Ud="[object DataView]",rd=Tl(Fd),Qd=Tl(wl),jd=Tl(Id),fd=Tl(kd),Ed=Tl(Nd),Od=J;(Fd&&Od(new Fd(new ArrayBuffer(1)))!=Ud||wl&&Od(new wl)!=gd||Id&&Od(Id.resolve())!=Pd||kd&&Od(new kd)!=Bd||Nd&&Od(new Nd)!=wd)&&(Od=function(l){var d=J(l),b="[object Object]"==d?l.constructor:void 0,Z=b?Tl(b):"";if(Z)switch(Z){case rd:return Ud;case Qd:return gd;case jd:return Pd;case fd:return Bd;case Ed:return wd}return d});var Dd=Od,Ad="[object Arguments]",_d="[object Array]",qd="[object Object]",$d=Object.prototype.hasOwnProperty;var lb=function(l,d,b,Z,c,m){var X=k(l),G=k(d),W=X?_d:Dd(l),u=G?_d:Dd(d),a=(W=W==Ad?qd:W)==qd,s=(u=u==Ad?qd:u)==qd,h=W==u;if(h&&g(l)){if(!g(d))return!1;X=!0,a=!1}if(h&&!a)return m||(m=new ud),X||E(l)?td(l,d,b,Z,c,m):Kd(l,d,W,b,Z,c,m);if(!(1&b)){var V=a&&$d.call(l,"__wrapped__"),y=s&&$d.call(d,"__wrapped__");if(V||y){var p=V?l.value():l,t=y?d.value():d;return m||(m=new ud),c(p,t,b,Z,m)}}return!!h&&(m||(m=new ud),Cd(l,d,b,Z,c,m))};var db=function l(d,b,Z,c,m){return d===b||(null==d||null==b||!z(d)&&!z(b)?d!=d&&b!=b:lb(d,b,Z,c,l,m))};var bb=function(l,d,b,Z){var c=b.length,m=c,X=!Z;if(null==l)return!m;for(l=Object(l);c--;){var G=b[c];if(X&&G[2]?G[1]!==l[G[0]]:!(G[0]in l))return!1}for(;++c<m;){var W=(G=b[c])[0],u=l[W],a=G[1];if(X&&G[2]){if(void 0===u&&!(W in l))return!1}else{var s=new ud;if(Z)var h=Z(u,a,W,l,d,s);if(!(void 0===h?db(a,u,3,Z,s):h))return!1}}return!0};var Zb=function(l){return l==l&&!bl(l)};var cb=function(l){for(var d=ml(l),b=d.length;b--;){var Z=d[b],c=l[Z];d[b]=[Z,c,Zb(c)]}return d};var mb=function(l,d){return function(b){return null!=b&&(b[l]===d&&(void 0!==d||l in Object(b)))}};var Xb=function(l){var d=cb(l);return 1==d.length&&d[0][2]?mb(d[0][0],d[0][1]):function(b){return b===l||bb(b,l,d)}};var Gb=function(l){return"symbol"==h(l)||z(l)&&"[object Symbol]"==J(l)},Wb=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ub=/^\w*$/;var ab=function(l,d){if(k(l))return!1;var b=h(l);return!("number"!=b&&"symbol"!=b&&"boolean"!=b&&null!=l&&!Gb(l))||(ub.test(l)||!Wb.test(l)||null!=d&&l in Object(d))};function sb(l,d){if("function"!=typeof l||null!=d&&"function"!=typeof d)throw new TypeError("Expected a function");var b=function b(){var Z=arguments,c=d?d.apply(this,Z):Z[0],m=b.cache;if(m.has(c))return m.get(c);var X=l.apply(this,Z);return b.cache=m.set(c,X)||m,X};return b.cache=new(sb.Cache||Xd),b}sb.Cache=Xd;var hb=sb;var Vb=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,yb=/\\(\\)?/g,pb=function(l){var d=hb(l,(function(l){return 500===b.size&&b.clear(),l})),b=d.cache;return d}((function(l){var d=[];return 46===l.charCodeAt(0)&&d.push(""),l.replace(Vb,(function(l,b,Z,c){d.push(Z?c.replace(yb,"$1"):b||l)})),d})),tb=pb,nb=R?R.prototype:void 0,ib=nb?nb.toString:void 0;var Rb=function l(d){if("string"==typeof d)return d;if(k(d))return sl(d,l)+"";if(Gb(d))return ib?ib.call(d):"";var b=d+"";return"0"==b&&1/d==-Infinity?"-0":b};var ob=function(l){return null==l?"":Rb(l)};var Lb=function(l,d){return k(l)?l:ab(l,d)?[l]:tb(ob(l))};var Kb=function(l){if("string"==typeof l||Gb(l))return l;var d=l+"";return"0"==d&&1/l==-Infinity?"-0":d};var Hb=function(l,d){for(var b=0,Z=(d=Lb(d,l)).length;null!=l&&b<Z;)l=l[Kb(d[b++])];return b&&b==Z?l:void 0};var xb=function(l,d,b){var Z=null==l?void 0:Hb(l,d);return void 0===Z?b:Z};var Sb=function(l,d){return null!=l&&d in Object(l)};var Yb=function(l,d,b){for(var Z=-1,c=(d=Lb(d,l)).length,m=!1;++Z<c;){var X=Kb(d[Z]);if(!(m=null!=l&&b(l,X)))break;l=l[X]}return m||++Z!=c?m:!!(c=null==l?0:l.length)&&w(c)&&B(X,c)&&(k(l)||I(l))};var eb=function(l,d){return null!=l&&Yb(l,d,Sb)};var Jb=function(l,d){return ab(l)&&Zb(d)?mb(Kb(l),d):function(b){var Z=xb(b,l);return void 0===Z&&Z===d?eb(b,l):db(d,Z,3)}};var zb=function(l){return function(d){return null==d?void 0:d[l]}};var vb=function(l){return function(d){return Hb(d,l)}};var Tb=function(l){return ab(l)?zb(Kb(l)):vb(l)};var Mb=function(l){return"function"==typeof l?l:null==l?Wl:"object"==h(l)?k(l)?Jb(l[0],l[1]):Xb(l):Tb(l)};var Cb=function(l,d){var b=-1,Z=cl(l)?Array(l.length):[];return Gl(l,(function(l,c,m){Z[++b]=d(l,c,m)})),Z};var Fb=function(l,d){return(k(l)?sl:Cb)(l,Mb(d))};var Ib=function(l,d,b){for(var Z=-1,c=l.length;++Z<c;){var m=l[Z],X=d(m);if(null!=X&&(void 0===G?X==X&&!Gb(X):b(X,G)))var G=X,W=m}return W};var kb=function(l,d){return l<d};var Nb=function(l){return l&&l.length?Ib(l,Wl,kb):void 0};var gb=function(l,d){return l>d};var Pb=function(l){return l&&l.length?Ib(l,Wl,gb):void 0};var Bb=function(l){return"string"==typeof l||!k(l)&&z(l)&&"[object String]"==J(l)},wb=zb("length"),Ub=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");var rb=function(l){return Ub.test(l)},Qb="[\\ud800-\\udfff]",jb="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",fb="\\ud83c[\\udffb-\\udfff]",Eb="[^\\ud800-\\udfff]",Ob="(?:\\ud83c[\\udde6-\\uddff]){2}",Db="[\\ud800-\\udbff][\\udc00-\\udfff]",Ab="(?:"+jb+"|"+fb+")"+"?",_b="[\\ufe0e\\ufe0f]?",qb=_b+Ab+("(?:\\u200d(?:"+[Eb,Ob,Db].join("|")+")"+_b+Ab+")*"),$b="(?:"+[Eb+jb+"?",jb,Ob,Db,Qb].join("|")+")",lZ=RegExp(fb+"(?="+fb+")|"+$b+qb,"g");var dZ=function(l){for(var d=lZ.lastIndex=0;lZ.test(l);)++d;return d};var bZ=function(l){return rb(l)?dZ(l):wb(l)};var ZZ=function(l){if(null==l)return 0;if(cl(l))return Bb(l)?bZ(l):l.length;var d=Dd(l);return"[object Map]"==d||"[object Set]"==d?l.size:dl(l).length};function cZ(l){return"[object Array]"===Object.prototype.toString.call(l)}function mZ(l){return"[object Object]"===Object.prototype.toString.call(l)}function XZ(l){return"[object String]"===Object.prototype.toString.call(l)}function GZ(l){return!!function(l){return"[object Undefined]"===Object.prototype.toString.call(l)}(l)||(!!function(l){return"[object Null]"===Object.prototype.toString.call(l)}(l)||(!!function(l){if(mZ(l)){for(var d in l)return!1;return!0}return!1}(l)||(!!function(l){return!(!XZ(l)||""!==l)}(l)||!!function(l){return!!cZ(l)&&0===l.length}(l))))}function WZ(l){return!!cZ(l)&&(0!==l.length&&(1!==l.length||!GZ(l[0])))}var uZ=p((function(l){var d=function(l){var d,b=Object.prototype,Z=b.hasOwnProperty,c="function"==typeof Symbol?Symbol:{},m=c.iterator||"@@iterator",X=c.asyncIterator||"@@asyncIterator",G=c.toStringTag||"@@toStringTag";function W(l,d,b){return Object.defineProperty(l,d,{value:b,enumerable:!0,configurable:!0,writable:!0}),l[d]}try{W({},"")}catch(l){W=function(l,d,b){return l[d]=b}}function u(l,d,b,Z){var c=d&&d.prototype instanceof n?d:n,m=Object.create(c.prototype),X=new z(Z||[]);return m._invoke=function(l,d,b){var Z=s;return function(c,m){if(Z===y)throw new Error("Generator is already running");if(Z===p){if("throw"===c)throw m;return T()}for(b.method=c,b.arg=m;;){var X=b.delegate;if(X){var G=Y(X,b);if(G){if(G===t)continue;return G}}if("next"===b.method)b.sent=b._sent=b.arg;else if("throw"===b.method){if(Z===s)throw Z=p,b.arg;b.dispatchException(b.arg)}else"return"===b.method&&b.abrupt("return",b.arg);Z=y;var W=a(l,d,b);if("normal"===W.type){if(Z=b.done?p:V,W.arg===t)continue;return{value:W.arg,done:b.done}}"throw"===W.type&&(Z=p,b.method="throw",b.arg=W.arg)}}}(l,b,X),m}function a(l,d,b){try{return{type:"normal",arg:l.call(d,b)}}catch(l){return{type:"throw",arg:l}}}l.wrap=u;var s="suspendedStart",V="suspendedYield",y="executing",p="completed",t={};function n(){}function i(){}function R(){}var o={};W(o,m,(function(){return this}));var L=Object.getPrototypeOf,K=L&&L(L(v([])));K&&K!==b&&Z.call(K,m)&&(o=K);var H=R.prototype=n.prototype=Object.create(o);function x(l){["next","throw","return"].forEach((function(d){W(l,d,(function(l){return this._invoke(d,l)}))}))}function S(l,d){function b(c,m,X,G){var W=a(l[c],l,m);if("throw"!==W.type){var u=W.arg,s=u.value;return s&&"object"===h(s)&&Z.call(s,"__await")?d.resolve(s.__await).then((function(l){b("next",l,X,G)}),(function(l){b("throw",l,X,G)})):d.resolve(s).then((function(l){u.value=l,X(u)}),(function(l){return b("throw",l,X,G)}))}G(W.arg)}var c;this._invoke=function(l,Z){function m(){return new d((function(d,c){b(l,Z,d,c)}))}return c=c?c.then(m,m):m()}}function Y(l,b){var Z=l.iterator[b.method];if(Z===d){if(b.delegate=null,"throw"===b.method){if(l.iterator.return&&(b.method="return",b.arg=d,Y(l,b),"throw"===b.method))return t;b.method="throw",b.arg=new TypeError("The iterator does not provide a 'throw' method")}return t}var c=a(Z,l.iterator,b.arg);if("throw"===c.type)return b.method="throw",b.arg=c.arg,b.delegate=null,t;var m=c.arg;return m?m.done?(b[l.resultName]=m.value,b.next=l.nextLoc,"return"!==b.method&&(b.method="next",b.arg=d),b.delegate=null,t):m:(b.method="throw",b.arg=new TypeError("iterator result is not an object"),b.delegate=null,t)}function e(l){var d={tryLoc:l[0]};1 in l&&(d.catchLoc=l[1]),2 in l&&(d.finallyLoc=l[2],d.afterLoc=l[3]),this.tryEntries.push(d)}function J(l){var d=l.completion||{};d.type="normal",delete d.arg,l.completion=d}function z(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(e,this),this.reset(!0)}function v(l){if(l){var b=l[m];if(b)return b.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var c=-1,X=function b(){for(;++c<l.length;)if(Z.call(l,c))return b.value=l[c],b.done=!1,b;return b.value=d,b.done=!0,b};return X.next=X}}return{next:T}}function T(){return{value:d,done:!0}}return i.prototype=R,W(H,"constructor",R),W(R,"constructor",i),i.displayName=W(R,G,"GeneratorFunction"),l.isGeneratorFunction=function(l){var d="function"==typeof l&&l.constructor;return!!d&&(d===i||"GeneratorFunction"===(d.displayName||d.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,R):(l.__proto__=R,W(l,G,"GeneratorFunction")),l.prototype=Object.create(H),l},l.awrap=function(l){return{__await:l}},x(S.prototype),W(S.prototype,X,(function(){return this})),l.AsyncIterator=S,l.async=function(d,b,Z,c,m){void 0===m&&(m=Promise);var X=new S(u(d,b,Z,c),m);return l.isGeneratorFunction(b)?X:X.next().then((function(l){return l.done?l.value:X.next()}))},x(H),W(H,G,"Generator"),W(H,m,(function(){return this})),W(H,"toString",(function(){return"[object Generator]"})),l.keys=function(l){var d=[];for(var b in l)d.push(b);return d.reverse(),function b(){for(;d.length;){var Z=d.pop();if(Z in l)return b.value=Z,b.done=!1,b}return b.done=!0,b}},l.values=v,z.prototype={constructor:z,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=d,this.done=!1,this.delegate=null,this.method="next",this.arg=d,this.tryEntries.forEach(J),!l)for(var b in this)"t"===b.charAt(0)&&Z.call(this,b)&&!isNaN(+b.slice(1))&&(this[b]=d)},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 b=this;function c(Z,c){return G.type="throw",G.arg=l,b.next=Z,c&&(b.method="next",b.arg=d),!!c}for(var m=this.tryEntries.length-1;m>=0;--m){var X=this.tryEntries[m],G=X.completion;if("root"===X.tryLoc)return c("end");if(X.tryLoc<=this.prev){var W=Z.call(X,"catchLoc"),u=Z.call(X,"finallyLoc");if(W&&u){if(this.prev<X.catchLoc)return c(X.catchLoc,!0);if(this.prev<X.finallyLoc)return c(X.finallyLoc)}else if(W){if(this.prev<X.catchLoc)return c(X.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<X.finallyLoc)return c(X.finallyLoc)}}}},abrupt:function(l,d){for(var b=this.tryEntries.length-1;b>=0;--b){var c=this.tryEntries[b];if(c.tryLoc<=this.prev&&Z.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var m=c;break}}m&&("break"===l||"continue"===l)&&m.tryLoc<=d&&d<=m.finallyLoc&&(m=null);var X=m?m.completion:{};return X.type=l,X.arg=d,m?(this.method="next",this.next=m.finallyLoc,t):this.complete(X)},complete:function(l,d){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&&d&&(this.next=d),t},finish:function(l){for(var d=this.tryEntries.length-1;d>=0;--d){var b=this.tryEntries[d];if(b.finallyLoc===l)return this.complete(b.completion,b.afterLoc),J(b),t}},catch:function(l){for(var d=this.tryEntries.length-1;d>=0;--d){var b=this.tryEntries[d];if(b.tryLoc===l){var Z=b.completion;if("throw"===Z.type){var c=Z.arg;J(b)}return c}}throw new Error("illegal catch attempt")},delegateYield:function(l,b,Z){return this.delegate={iterator:v(l),resultName:b,nextLoc:Z},"next"===this.method&&(this.arg=d),t}},l}(l.exports);try{regeneratorRuntime=d}catch(l){"object"===("undefined"==typeof globalThis?"undefined":h(globalThis))?globalThis.regeneratorRuntime=d:Function("r","regeneratorRuntime = r")(d)}})),aZ=uZ;function sZ(l,d){if(!(l instanceof d))throw new TypeError("Cannot call a class as a function")}function hZ(l,d){for(var b=0;b<d.length;b++){var Z=d[b];Z.enumerable=Z.enumerable||!1,Z.configurable=!0,"value"in Z&&(Z.writable=!0),Object.defineProperty(l,Z.key,Z)}}function VZ(l,d,b){return d&&hZ(l.prototype,d),b&&hZ(l,b),Object.defineProperty(l,"prototype",{writable:!1}),l}var yZ=134217729;function pZ(l,d,b,Z,c){var m,X,G,W,u=d[0],a=Z[0],s=0,h=0;a>u==a>-u?(m=u,u=d[++s]):(m=a,a=Z[++h]);var V=0;if(s<l&&h<b)for(a>u==a>-u?(G=m-((X=u+m)-u),u=d[++s]):(G=m-((X=a+m)-a),a=Z[++h]),m=X,0!==G&&(c[V++]=G);s<l&&h<b;)a>u==a>-u?(G=m-((X=m+u)-(W=X-m))+(u-W),u=d[++s]):(G=m-((X=m+a)-(W=X-m))+(a-W),a=Z[++h]),m=X,0!==G&&(c[V++]=G);for(;s<l;)G=m-((X=m+u)-(W=X-m))+(u-W),u=d[++s],m=X,0!==G&&(c[V++]=G);for(;h<b;)G=m-((X=m+a)-(W=X-m))+(a-W),a=Z[++h],m=X,0!==G&&(c[V++]=G);return 0===m&&0!==V||(c[V++]=m),V}function tZ(l){return new Float64Array(l)}var nZ=tZ(4),iZ=tZ(8),RZ=tZ(12),oZ=tZ(16),LZ=tZ(4);function KZ(l,d,b,Z,c,m){var X=(d-m)*(b-c),G=(l-c)*(Z-m),W=X-G;if(0===X||0===G||X>0!=G>0)return W;var u=Math.abs(X+G);return Math.abs(W)>=33306690738754716e-32*u?W:-function(l,d,b,Z,c,m,X){var G,W,u,a,s,h,V,y,p,t,n,i,R,o,L,K,H,x,S=l-c,Y=b-c,e=d-m,J=Z-m;s=(L=(y=S-(V=(h=yZ*S)-(h-S)))*(t=J-(p=(h=yZ*J)-(h-J)))-((o=S*J)-V*p-y*p-V*t))-(n=L-(H=(y=e-(V=(h=yZ*e)-(h-e)))*(t=Y-(p=(h=yZ*Y)-(h-Y)))-((K=e*Y)-V*p-y*p-V*t))),nZ[0]=L-(n+s)+(s-H),s=(R=o-((i=o+n)-(s=i-o))+(n-s))-(n=R-K),nZ[1]=R-(n+s)+(s-K),s=(x=i+n)-i,nZ[2]=i-(x-s)+(n-s),nZ[3]=x;var z=function(l,d){for(var b=d[0],Z=1;Z<l;Z++)b+=d[Z];return b}(4,nZ),v=22204460492503146e-32*X;if(z>=v||-z>=v)return z;if(G=l-(S+(s=l-S))+(s-c),u=b-(Y+(s=b-Y))+(s-c),W=d-(e+(s=d-e))+(s-m),a=Z-(J+(s=Z-J))+(s-m),0===G&&0===W&&0===u&&0===a)return z;if(v=11093356479670487e-47*X+33306690738754706e-32*Math.abs(z),(z+=S*a+J*G-(e*u+Y*W))>=v||-z>=v)return z;s=(L=(y=G-(V=(h=yZ*G)-(h-G)))*(t=J-(p=(h=yZ*J)-(h-J)))-((o=G*J)-V*p-y*p-V*t))-(n=L-(H=(y=W-(V=(h=yZ*W)-(h-W)))*(t=Y-(p=(h=yZ*Y)-(h-Y)))-((K=W*Y)-V*p-y*p-V*t))),LZ[0]=L-(n+s)+(s-H),s=(R=o-((i=o+n)-(s=i-o))+(n-s))-(n=R-K),LZ[1]=R-(n+s)+(s-K),s=(x=i+n)-i,LZ[2]=i-(x-s)+(n-s),LZ[3]=x;var T=pZ(4,nZ,4,LZ,iZ);s=(L=(y=S-(V=(h=yZ*S)-(h-S)))*(t=a-(p=(h=yZ*a)-(h-a)))-((o=S*a)-V*p-y*p-V*t))-(n=L-(H=(y=e-(V=(h=yZ*e)-(h-e)))*(t=u-(p=(h=yZ*u)-(h-u)))-((K=e*u)-V*p-y*p-V*t))),LZ[0]=L-(n+s)+(s-H),s=(R=o-((i=o+n)-(s=i-o))+(n-s))-(n=R-K),LZ[1]=R-(n+s)+(s-K),s=(x=i+n)-i,LZ[2]=i-(x-s)+(n-s),LZ[3]=x;var M=pZ(T,iZ,4,LZ,RZ);s=(L=(y=G-(V=(h=yZ*G)-(h-G)))*(t=a-(p=(h=yZ*a)-(h-a)))-((o=G*a)-V*p-y*p-V*t))-(n=L-(H=(y=W-(V=(h=yZ*W)-(h-W)))*(t=u-(p=(h=yZ*u)-(h-u)))-((K=W*u)-V*p-y*p-V*t))),LZ[0]=L-(n+s)+(s-H),s=(R=o-((i=o+n)-(s=i-o))+(n-s))-(n=R-K),LZ[1]=R-(n+s)+(s-K),s=(x=i+n)-i,LZ[2]=i-(x-s)+(n-s),LZ[3]=x;var C=pZ(M,RZ,4,LZ,oZ);return oZ[C-1]}(l,d,b,Z,c,m,u)}var HZ=Math.pow(2,-52),xZ=new Uint32Array(512),SZ=function(){function l(d){sZ(this,l);var b=d.length>>1;if(b>0&&"number"!=typeof d[0])throw new Error("Expected coords to contain numbers.");this.coords=d;var Z=Math.max(2*b-5,0);this._triangles=new Uint32Array(3*Z),this._halfedges=new Int32Array(3*Z),this._hashSize=Math.ceil(Math.sqrt(b)),this._hullPrev=new Uint32Array(b),this._hullNext=new Uint32Array(b),this._hullTri=new Uint32Array(b),this._hullHash=new Int32Array(this._hashSize).fill(-1),this._ids=new Uint32Array(b),this._dists=new Float64Array(b),this.update()}return VZ(l,[{key:"update",value:function(){for(var l=this.coords,d=this._hullPrev,b=this._hullNext,Z=this._hullTri,c=this._hullHash,m=l.length>>1,X=1/0,G=1/0,W=-1/0,u=-1/0,a=0;a<m;a++){var s=l[2*a],h=l[2*a+1];s<X&&(X=s),h<G&&(G=h),s>W&&(W=s),h>u&&(u=h),this._ids[a]=a}for(var V,y,p,t=(X+W)/2,n=(G+u)/2,i=1/0,R=0;R<m;R++){var o=YZ(t,n,l[2*R],l[2*R+1]);o<i&&(V=R,i=o)}var L=l[2*V],K=l[2*V+1];i=1/0;for(var H=0;H<m;H++)if(H!==V){var x=YZ(L,K,l[2*H],l[2*H+1]);x<i&&x>0&&(y=H,i=x)}for(var S=l[2*y],Y=l[2*y+1],e=1/0,J=0;J<m;J++)if(J!==V&&J!==y){var z=eZ(L,K,S,Y,l[2*J],l[2*J+1]);z<e&&(p=J,e=z)}var v=l[2*p],T=l[2*p+1];if(e===1/0){for(var M=0;M<m;M++)this._dists[M]=l[2*M]-l[0]||l[2*M+1]-l[1];JZ(this._ids,this._dists,0,m-1);for(var C=new Uint32Array(m),F=0,I=0,k=-1/0;I<m;I++){var N=this._ids[I];this._dists[N]>k&&(C[F++]=N,k=this._dists[N])}return this.hull=C.subarray(0,F),this.triangles=new Uint32Array(0),void(this.halfedges=new Uint32Array(0))}if(KZ(L,K,S,Y,v,T)<0){var g=y,P=S,B=Y;y=p,S=v,Y=T,p=g,v=P,T=B}var w=function(l,d,b,Z,c,m){var X=b-l,G=Z-d,W=c-l,u=m-d,a=X*X+G*G,s=W*W+u*u,h=.5/(X*u-G*W);return{x:l+(u*a-G*s)*h,y:d+(X*s-W*a)*h}}(L,K,S,Y,v,T);this._cx=w.x,this._cy=w.y;for(var U=0;U<m;U++)this._dists[U]=YZ(l[2*U],l[2*U+1],w.x,w.y);JZ(this._ids,this._dists,0,m-1),this._hullStart=V;var r=3;b[V]=d[p]=y,b[y]=d[V]=p,b[p]=d[y]=V,Z[V]=0,Z[y]=1,Z[p]=2,c.fill(-1),c[this._hashKey(L,K)]=V,c[this._hashKey(S,Y)]=y,c[this._hashKey(v,T)]=p,this.trianglesLen=0,this._addTriangle(V,y,p,-1,-1,-1);for(var Q,j,f=0;f<this._ids.length;f++){var E=this._ids[f],O=l[2*E],D=l[2*E+1];if(!(f>0&&Math.abs(O-Q)<=HZ&&Math.abs(D-j)<=HZ)&&(Q=O,j=D,E!==V&&E!==y&&E!==p)){for(var A=0,_=0,q=this._hashKey(O,D);_<this._hashSize&&(-1===(A=c[(q+_)%this._hashSize])||A===b[A]);_++);for(var $=A=d[A],ll=void 0;ll=b[$],KZ(O,D,l[2*$],l[2*$+1],l[2*ll],l[2*ll+1])>=0;)if(($=ll)===A){$=-1;break}if(-1!==$){var dl=this._addTriangle($,E,b[$],-1,-1,Z[$]);Z[E]=this._legalize(dl+2),Z[$]=dl,r++;for(var bl=b[$];ll=b[bl],KZ(O,D,l[2*bl],l[2*bl+1],l[2*ll],l[2*ll+1])<0;)dl=this._addTriangle(bl,E,ll,Z[E],-1,Z[bl]),Z[E]=this._legalize(dl+2),b[bl]=bl,r--,bl=ll;if($===A)for(;KZ(O,D,l[2*(ll=d[$])],l[2*ll+1],l[2*$],l[2*$+1])<0;)dl=this._addTriangle(ll,E,$,-1,Z[$],Z[ll]),this._legalize(dl+2),Z[ll]=dl,b[$]=$,r--,$=ll;this._hullStart=d[E]=$,b[$]=d[bl]=E,b[E]=bl,c[this._hashKey(O,D)]=E,c[this._hashKey(l[2*$],l[2*$+1])]=$}}}this.hull=new Uint32Array(r);for(var Zl=0,cl=this._hullStart;Zl<r;Zl++)this.hull[Zl]=cl,cl=b[cl];this.triangles=this._triangles.subarray(0,this.trianglesLen),this.halfedges=this._halfedges.subarray(0,this.trianglesLen)}},{key:"_hashKey",value:function(l,d){return Math.floor((b=l-this._cx,Z=d-this._cy,c=b/(Math.abs(b)+Math.abs(Z)),(Z>0?3-c:1+c)/4*this._hashSize))%this._hashSize;var b,Z,c}},{key:"_legalize",value:function(l){for(var d,b,Z,c,m,X,G,W,u,a,s,h,V,y,p,t,n=this._triangles,i=this._halfedges,R=this.coords,o=0,L=0;;){var K=i[l],H=l-l%3;if(L=H+(l+2)%3,-1!==K){var x=K-K%3,S=H+(l+1)%3,Y=x+(K+2)%3,e=n[L],J=n[l],z=n[S],v=n[Y];if(d=R[2*e],b=R[2*e+1],Z=R[2*J],c=R[2*J+1],m=R[2*z],X=R[2*z+1],G=R[2*v],W=R[2*v+1],u=void 0,a=void 0,s=void 0,h=void 0,V=void 0,y=void 0,void 0,p=void 0,t=void 0,(u=d-G)*((h=c-W)*(t=(V=m-G)*V+(y=X-W)*y)-(p=(s=Z-G)*s+h*h)*y)-(a=b-W)*(s*t-p*V)+(u*u+a*a)*(s*y-h*V)<0){n[l]=v,n[K]=e;var T=i[Y];if(-1===T){var M=this._hullStart;do{if(this._hullTri[M]===Y){this._hullTri[M]=l;break}M=this._hullPrev[M]}while(M!==this._hullStart)}this._link(l,T),this._link(K,i[L]),this._link(L,Y);var C=x+(K+1)%3;o<xZ.length&&(xZ[o++]=C)}else{if(0===o)break;l=xZ[--o]}}else{if(0===o)break;l=xZ[--o]}}return L}},{key:"_link",value:function(l,d){this._halfedges[l]=d,-1!==d&&(this._halfedges[d]=l)}},{key:"_addTriangle",value:function(l,d,b,Z,c,m){var X=this.trianglesLen;return this._triangles[X]=l,this._triangles[X+1]=d,this._triangles[X+2]=b,this._link(X,Z),this._link(X+1,c),this._link(X+2,m),this.trianglesLen+=3,X}}],[{key:"from",value:function(d){for(var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:vZ,Z=arguments.length>2&&void 0!==arguments[2]?arguments[2]:TZ,c=d.length,m=new Float64Array(2*c),X=0;X<c;X++){var G=d[X];m[2*X]=b(G),m[2*X+1]=Z(G)}return new l(m)}}]),l}();function YZ(l,d,b,Z){var c=l-b,m=d-Z;return c*c+m*m}function eZ(l,d,b,Z,c,m){var X=b-l,G=Z-d,W=c-l,u=m-d,a=X*X+G*G,s=W*W+u*u,h=.5/(X*u-G*W),V=(u*a-G*s)*h,y=(X*s-W*a)*h;return V*V+y*y}function JZ(l,d,b,Z){if(Z-b<=20)for(var c=b+1;c<=Z;c++){for(var m=l[c],X=d[m],G=c-1;G>=b&&d[l[G]]>X;)l[G+1]=l[G--];l[G+1]=m}else{var W=b+1,u=Z;zZ(l,b+Z>>1,W),d[l[b]]>d[l[Z]]&&zZ(l,b,Z),d[l[W]]>d[l[Z]]&&zZ(l,W,Z),d[l[b]]>d[l[W]]&&zZ(l,b,W);for(var a=l[W],s=d[a];;){do{W++}while(d[l[W]]<s);do{u--}while(d[l[u]]>s);if(u<W)break;zZ(l,W,u)}l[b+1]=l[u],l[u]=a,Z-W+1>=u-b?(JZ(l,d,W,Z),JZ(l,d,b,u-1)):(JZ(l,d,b,u-1),JZ(l,d,W,Z))}}function zZ(l,d,b){var Z=l[d];l[d]=l[b],l[b]=Z}function vZ(l){return l[0]}function TZ(l){return l[1]}var MZ=1e-6,CZ=function(){function l(){sZ(this,l),this._x0=this._y0=this._x1=this._y1=null,this._=""}return VZ(l,[{key:"moveTo",value:function(l,d){this._+="M".concat(this._x0=this._x1=+l,",").concat(this._y0=this._y1=+d)}},{key:"closePath",value:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}},{key:"lineTo",value:function(l,d){this._+="L".concat(this._x1=+l,",").concat(this._y1=+d)}},{key:"arc",value:function(l,d,b){var Z=(l=+l)+(b=+b),c=d=+d;if(b<0)throw new Error("negative radius");null===this._x1?this._+="M".concat(Z,",").concat(c):(Math.abs(this._x1-Z)>MZ||Math.abs(this._y1-c)>MZ)&&(this._+="L"+Z+","+c),b&&(this._+="A".concat(b,",").concat(b,",0,1,1,").concat(l-b,",").concat(d,"A").concat(b,",").concat(b,",0,1,1,").concat(this._x1=Z,",").concat(this._y1=c))}},{key:"rect",value:function(l,d,b,Z){this._+="M".concat(this._x0=this._x1=+l,",").concat(this._y0=this._y1=+d,"h").concat(+b,"v").concat(+Z,"h").concat(-b,"Z")}},{key:"value",value:function(){return this._||null}}]),l}(),FZ=function(){function l(){sZ(this,l),this._=[]}return VZ(l,[{key:"moveTo",value:function(l,d){this._.push([l,d])}},{key:"closePath",value:function(){this._.push(this._[0].slice())}},{key:"lineTo",value:function(l,d){this._.push([l,d])}},{key:"value",value:function(){return this._.length?this._:null}}]),l}();function IZ(l,d){return function(l){if(Array.isArray(l))return l}(l)||function(l,d){var b=null==l?null:"undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(null!=b){var Z,c,m=[],X=!0,G=!1;try{for(b=b.call(l);!(X=(Z=b.next()).done)&&(m.push(Z.value),!d||m.length!==d);X=!0);}catch(l){G=!0,c=l}finally{try{X||null==b.return||b.return()}finally{if(G)throw c}}return m}}(l,d)||X(l,d)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function kZ(l,d){var b="undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(!b){if(Array.isArray(l)||(b=function(l,d){if(!l)return;if("string"==typeof l)return NZ(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);"Object"===b&&l.constructor&&(b=l.constructor.name);if("Map"===b||"Set"===b)return Array.from(l);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return NZ(l,d)}(l))||d&&l&&"number"==typeof l.length){b&&(l=b);var Z=0,c=function(){};return{s:c,n:function(){return Z>=l.length?{done:!0}:{done:!1,value:l[Z++]}},e:function(l){throw l},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,X=!0,G=!1;return{s:function(){b=b.call(l)},n:function(){var l=b.next();return X=l.done,l},e:function(l){G=!0,m=l},f:function(){try{X||null==b.return||b.return()}finally{if(G)throw m}}}}function NZ(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}var gZ=function(){function l(d){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[0,0,960,500],Z=IZ(b,4),c=Z[0],m=Z[1],X=Z[2],G=Z[3];if(sZ(this,l),!((X=+X)>=(c=+c)&&(G=+G)>=(m=+m)))throw new Error("invalid bounds");this.delaunay=d,this._circumcenters=new Float64Array(2*d.points.length),this.vectors=new Float64Array(2*d.points.length),this.xmax=X,this.xmin=c,this.ymax=G,this.ymin=m,this._init()}return VZ(l,[{key:"update",value:function(){return this.delaunay.update(),this._init(),this}},{key:"_init",value:function(){for(var l,d,b=this.delaunay,Z=b.points,c=b.hull,m=b.triangles,X=this.vectors,G=this.circumcenters=this._circumcenters.subarray(0,m.length/3*2),W=0,u=0,a=m.length;W<a;W+=3,u+=2){var s=2*m[W],h=2*m[W+1],V=2*m[W+2],y=Z[s],p=Z[s+1],t=Z[h],n=Z[h+1],i=Z[V],R=Z[V+1],o=t-y,L=n-p,K=i-y,H=R-p,x=2*(o*H-L*K);if(Math.abs(x)<1e-9){var S=1e9,Y=2*m[0];l=(y+i)/2-(S*=Math.sign((Z[Y]-y)*H-(Z[Y+1]-p)*K))*H,d=(p+R)/2+S*K}else{var e=1/x,J=o*o+L*L,z=K*K+H*H;l=y+(H*J-L*z)*e,d=p+(o*z-K*J)*e}G[u]=l,G[u+1]=d}var v,T,M,C=c[c.length-1],F=4*C,I=Z[2*C],k=Z[2*C+1];X.fill(0);for(var N=0;N<c.length;++N)v=F,T=I,M=k,F=4*(C=c[N]),I=Z[2*C],k=Z[2*C+1],X[v+2]=X[F]=M-k,X[v+3]=X[F+1]=I-T}},{key:"render",value:function(l){var d=null==l?l=new CZ:void 0,b=this.delaunay,Z=b.halfedges,c=b.inedges,m=b.hull,X=this.circumcenters,G=this.vectors;if(m.length<=1)return null;for(var W=0,u=Z.length;W<u;++W){var a=Z[W];if(!(a<W)){var s=2*Math.floor(W/3),h=2*Math.floor(a/3),V=X[s],y=X[s+1],p=X[h],t=X[h+1];this._renderSegment(V,y,p,t,l)}}for(var n,i=m[m.length-1],R=0;R<m.length;++R){n=i,i=m[R];var o=2*Math.floor(c[i]/3),L=X[o],K=X[o+1],H=4*n,x=this._project(L,K,G[H+2],G[H+3]);x&&this._renderSegment(L,K,x[0],x[1],l)}return d&&d.value()}},{key:"renderBounds",value:function(l){var d=null==l?l=new CZ:void 0;return l.rect(this.xmin,this.ymin,this.xmax-this.xmin,this.ymax-this.ymin),d&&d.value()}},{key:"renderCell",value:function(l,d){var b=null==d?d=new CZ:void 0,Z=this._clip(l);if(null!==Z&&Z.length){d.moveTo(Z[0],Z[1]);for(var c=Z.length;Z[0]===Z[c-2]&&Z[1]===Z[c-1]&&c>1;)c-=2;for(var m=2;m<c;m+=2)Z[m]===Z[m-2]&&Z[m+1]===Z[m-1]||d.lineTo(Z[m],Z[m+1]);return d.closePath(),b&&b.value()}}},{key:"cellPolygons",value:aZ.mark((function l(){var d,b,Z,c;return aZ.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:d=this.delaunay.points,b=0,Z=d.length/2;case 2:if(!(b<Z)){l.next=11;break}if(!(c=this.cellPolygon(b))){l.next=8;break}return c.index=b,l.next=8,c;case 8:++b,l.next=2;break;case 11:case"end":return l.stop()}}),l,this)}))},{key:"cellPolygon",value:function(l){var d=new FZ;return this.renderCell(l,d),d.value()}},{key:"_renderSegment",value:function(l,d,b,Z,c){var m,X=this._regioncode(l,d),G=this._regioncode(b,Z);0===X&&0===G?(c.moveTo(l,d),c.lineTo(b,Z)):(m=this._clipSegment(l,d,b,Z,X,G))&&(c.moveTo(m[0],m[1]),c.lineTo(m[2],m[3]))}},{key:"contains",value:function(l,d,b){return(d=+d)==d&&(b=+b)==b&&this.delaunay._step(l,d,b)===l}},{key:"neighbors",value:aZ.mark((function l(d){var b,Z,c,m,X,G,W,u,a;return aZ.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:if(!(b=this._clip(d))){l.next=33;break}Z=kZ(this.delaunay.neighbors(d)),l.prev=3,Z.s();case 5:if((c=Z.n()).done){l.next=25;break}if(m=c.value,!(X=this._clip(m))){l.next=23;break}G=0,W=b.length;case 10:if(!(G<W)){l.next=23;break}u=0,a=X.length;case 12:if(!(u<a)){l.next=20;break}if(b[G]!=X[u]||b[G+1]!=X[u+1]||b[(G+2)%W]!=X[(u+a-2)%a]||b[(G+3)%W]!=X[(u+a-1)%a]){l.next=17;break}return l.next=16,m;case 16:return l.abrupt("break",23);case 17:u+=2,l.next=12;break;case 20:G+=2,l.next=10;break;case 23:l.next=5;break;case 25:l.next=30;break;case 27:l.prev=27,l.t0=l.catch(3),Z.e(l.t0);case 30:return l.prev=30,Z.f(),l.finish(30);case 33:case"end":return l.stop()}}),l,this,[[3,27,30,33]])}))},{key:"_cell",value:function(l){var d=this.circumcenters,b=this.delaunay,Z=b.inedges,c=b.halfedges,m=b.triangles,X=Z[l];if(-1===X)return null;var G=[],W=X;do{var u=Math.floor(W/3);if(G.push(d[2*u],d[2*u+1]),m[W=W%3==2?W-2:W+1]!==l)break;W=c[W]}while(W!==X&&-1!==W);return G}},{key:"_clip",value:function(l){if(0===l&&1===this.delaunay.hull.length)return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];var d=this._cell(l);if(null===d)return null;var b=this.vectors,Z=4*l;return b[Z]||b[Z+1]?this._clipInfinite(l,d,b[Z],b[Z+1],b[Z+2],b[Z+3]):this._clipFinite(l,d)}},{key:"_clipFinite",value:function(l,d){for(var b,Z,c,m,X=d.length,G=null,W=d[X-2],u=d[X-1],a=this._regioncode(W,u),s=0,h=0;h<X;h+=2)if(b=W,Z=u,W=d[h],u=d[h+1],c=a,a=this._regioncode(W,u),0===c&&0===a)m=s,s=0,G?G.push(W,u):G=[W,u];else{var V=void 0,y=void 0,p=void 0,t=void 0,n=void 0;if(0===c){if(null===(V=this._clipSegment(b,Z,W,u,c,a)))continue;var i=IZ(V,4);y=i[0],p=i[1],t=i[2],n=i[3]}else{if(null===(V=this._clipSegment(W,u,b,Z,a,c)))continue;var R=IZ(V,4);t=R[0],n=R[1],y=R[2],p=R[3],m=s,s=this._edgecode(y,p),m&&s&&this._edge(l,m,s,G,G.length),G?G.push(y,p):G=[y,p]}m=s,s=this._edgecode(t,n),m&&s&&this._edge(l,m,s,G,G.length),G?G.push(t,n):G=[t,n]}if(G)m=s,s=this._edgecode(G[0],G[1]),m&&s&&this._edge(l,m,s,G,G.length);else if(this.contains(l,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2))return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];return G}},{key:"_clipSegment",value:function(l,d,b,Z,c,m){for(;;){if(0===c&&0===m)return[l,d,b,Z];if(c&m)return null;var X=void 0,G=void 0,W=c||m;8&W?(X=l+(b-l)*(this.ymax-d)/(Z-d),G=this.ymax):4&W?(X=l+(b-l)*(this.ymin-d)/(Z-d),G=this.ymin):2&W?(G=d+(Z-d)*(this.xmax-l)/(b-l),X=this.xmax):(G=d+(Z-d)*(this.xmin-l)/(b-l),X=this.xmin),c?(l=X,d=G,c=this._regioncode(l,d)):(b=X,Z=G,m=this._regioncode(b,Z))}}},{key:"_clipInfinite",value:function(l,d,b,Z,c,m){var X,G=Array.from(d);if((X=this._project(G[0],G[1],b,Z))&&G.unshift(X[0],X[1]),(X=this._project(G[G.length-2],G[G.length-1],c,m))&&G.push(X[0],X[1]),G=this._clipFinite(l,G))for(var W,u=0,a=G.length,s=this._edgecode(G[a-2],G[a-1]);u<a;u+=2)W=s,s=this._edgecode(G[u],G[u+1]),W&&s&&(u=this._edge(l,W,s,G,u),a=G.length);else this.contains(l,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2)&&(G=[this.xmin,this.ymin,this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax]);return G}},{key:"_edge",value:function(l,d,b,Z,c){for(;d!==b;){var m=void 0,X=void 0;switch(d){case 5:d=4;continue;case 4:d=6,m=this.xmax,X=this.ymin;break;case 6:d=2;continue;case 2:d=10,m=this.xmax,X=this.ymax;break;case 10:d=8;continue;case 8:d=9,m=this.xmin,X=this.ymax;break;case 9:d=1;continue;case 1:d=5,m=this.xmin,X=this.ymin}Z[c]===m&&Z[c+1]===X||!this.contains(l,m,X)||(Z.splice(c,0,m,X),c+=2)}if(Z.length>4)for(var G=0;G<Z.length;G+=2){var W=(G+2)%Z.length,u=(G+4)%Z.length;(Z[G]===Z[W]&&Z[W]===Z[u]||Z[G+1]===Z[W+1]&&Z[W+1]===Z[u+1])&&(Z.splice(W,2),G-=2)}return c}},{key:"_project",value:function(l,d,b,Z){var c,m,X,G=1/0;if(Z<0){if(d<=this.ymin)return null;(c=(this.ymin-d)/Z)<G&&(X=this.ymin,m=l+(G=c)*b)}else if(Z>0){if(d>=this.ymax)return null;(c=(this.ymax-d)/Z)<G&&(X=this.ymax,m=l+(G=c)*b)}if(b>0){if(l>=this.xmax)return null;(c=(this.xmax-l)/b)<G&&(m=this.xmax,X=d+(G=c)*Z)}else if(b<0){if(l<=this.xmin)return null;(c=(this.xmin-l)/b)<G&&(m=this.xmin,X=d+(G=c)*Z)}return[m,X]}},{key:"_edgecode",value:function(l,d){return(l===this.xmin?1:l===this.xmax?2:0)|(d===this.ymin?4:d===this.ymax?8:0)}},{key:"_regioncode",value:function(l,d){return(l<this.xmin?1:l>this.xmax?2:0)|(d<this.ymin?4:d>this.ymax?8:0)}}]),l}(),PZ=aZ.mark(DZ);function BZ(l,d){var b="undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(!b){if(Array.isArray(l)||(b=function(l,d){if(!l)return;if("string"==typeof l)return wZ(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);"Object"===b&&l.constructor&&(b=l.constructor.name);if("Map"===b||"Set"===b)return Array.from(l);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return wZ(l,d)}(l))||d&&l&&"number"==typeof l.length){b&&(l=b);var Z=0,c=function(){};return{s:c,n:function(){return Z>=l.length?{done:!0}:{done:!1,value:l[Z++]}},e:function(l){throw l},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,X=!0,G=!1;return{s:function(){b=b.call(l)},n:function(){var l=b.next();return X=l.done,l},e:function(l){G=!0,m=l},f:function(){try{X||null==b.return||b.return()}finally{if(G)throw m}}}}function wZ(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}var UZ=2*Math.PI,rZ=Math.pow;function QZ(l){return l[0]}function jZ(l){return l[1]}function fZ(l,d,b){return[l+Math.sin(l+d)*b,d+Math.cos(l-d)*b]}var EZ=function(){function l(d){sZ(this,l),this._delaunator=new SZ(d),this.inedges=new Int32Array(d.length/2),this._hullIndex=new Int32Array(d.length/2),this.points=this._delaunator.coords,this._init()}return VZ(l,[{key:"update",value:function(){return this._delaunator.update(),this._init(),this}},{key:"_init",value:function(){var l=this._delaunator,d=this.points;if(l.hull&&l.hull.length>2&&function(l){for(var d=l.triangles,b=l.coords,Z=0;Z<d.length;Z+=3){var c=2*d[Z],m=2*d[Z+1],X=2*d[Z+2];if((b[X]-b[c])*(b[m+1]-b[c+1])-(b[m]-b[c])*(b[X+1]-b[c+1])>1e-10)return!1}return!0}(l)){this.collinear=Int32Array.from({length:d.length/2},(function(l,d){return d})).sort((function(l,b){return d[2*l]-d[2*b]||d[2*l+1]-d[2*b+1]}));for(var b=this.collinear[0],Z=this.collinear[this.collinear.length-1],c=[d[2*b],d[2*b+1],d[2*Z],d[2*Z+1]],m=1e-8*Math.hypot(c[3]-c[1],c[2]-c[0]),X=0,G=d.length/2;X<G;++X){var W=fZ(d[2*X],d[2*X+1],m);d[2*X]=W[0],d[2*X+1]=W[1]}this._delaunator=new SZ(d)}else delete this.collinear;for(var u=this.halfedges=this._delaunator.halfedges,a=this.hull=this._delaunator.hull,s=this.triangles=this._delaunator.triangles,h=this.inedges.fill(-1),V=this._hullIndex.fill(-1),y=0,p=u.length;y<p;++y){var t=s[y%3==2?y-2:y+1];-1!==u[y]&&-1!==h[t]||(h[t]=y)}for(var n=0,i=a.length;n<i;++n)V[a[n]]=n;a.length<=2&&a.length>0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=a[0],h[a[0]]=1,2===a.length&&(h[a[1]]=0,this.triangles[1]=a[1],this.triangles[2]=a[1]))}},{key:"voronoi",value:function(l){return new gZ(this,l)}},{key:"neighbors",value:aZ.mark((function l(d){var b,Z,c,m,X,G,W,u,a,s,h;return aZ.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:if(b=this.inedges,Z=this.hull,c=this._hullIndex,m=this.halfedges,X=this.triangles,!(G=this.collinear)){l.next=10;break}if(!((W=G.indexOf(d))>0)){l.next=6;break}return l.next=6,G[W-1];case 6:if(!(W<G.length-1)){l.next=9;break}return l.next=9,G[W+1];case 9:return l.abrupt("return");case 10:if(-1!==(u=b[d])){l.next=13;break}return l.abrupt("return");case 13:a=u,s=-1;case 14:return l.next=16,s=X[a];case 16:if(X[a=a%3==2?a-2:a+1]===d){l.next=19;break}return l.abrupt("return");case 19:if(-1!==(a=m[a])){l.next=26;break}if((h=Z[(c[d]+1)%Z.length])===s){l.next=25;break}return l.next=25,h;case 25:return l.abrupt("return");case 26:if(a!==u){l.next=14;break}case 27:case"end":return l.stop()}}),l,this)}))},{key:"find",value:function(l,d){var b=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if((l=+l)!=l||(d=+d)!=d)return-1;for(var Z,c=b;(Z=this._step(b,l,d))>=0&&Z!==b&&Z!==c;)b=Z;return Z}},{key:"_step",value:function(l,d,b){var Z=this.inedges,c=this.hull,m=this._hullIndex,X=this.halfedges,G=this.triangles,W=this.points;if(-1===Z[l]||!W.length)return(l+1)%(W.length>>1);var u=l,a=rZ(d-W[2*l],2)+rZ(b-W[2*l+1],2),s=Z[l],h=s;do{var V=G[h],y=rZ(d-W[2*V],2)+rZ(b-W[2*V+1],2);if(y<a&&(a=y,u=V),G[h=h%3==2?h-2:h+1]!==l)break;if(-1===(h=X[h])){if((h=c[(m[l]+1)%c.length])!==V&&rZ(d-W[2*h],2)+rZ(b-W[2*h+1],2)<a)return h;break}}while(h!==s);return u}},{key:"render",value:function(l){for(var d=null==l?l=new CZ:void 0,b=this.points,Z=this.halfedges,c=this.triangles,m=0,X=Z.length;m<X;++m){var G=Z[m];if(!(G<m)){var W=2*c[m],u=2*c[G];l.moveTo(b[W],b[W+1]),l.lineTo(b[u],b[u+1])}}return this.renderHull(l),d&&d.value()}},{key:"renderPoints",value:function(l,d){void 0!==d||l&&"function"==typeof l.moveTo||(d=l,l=null),d=null==d?2:+d;for(var b=null==l?l=new CZ:void 0,Z=this.points,c=0,m=Z.length;c<m;c+=2){var X=Z[c],G=Z[c+1];l.moveTo(X+d,G),l.arc(X,G,d,0,UZ)}return b&&b.value()}},{key:"renderHull",value:function(l){var d=null==l?l=new CZ:void 0,b=this.hull,Z=this.points,c=2*b[0],m=b.length;l.moveTo(Z[c],Z[c+1]);for(var X=1;X<m;++X){var G=2*b[X];l.lineTo(Z[G],Z[G+1])}return l.closePath(),d&&d.value()}},{key:"hullPolygon",value:function(){var l=new FZ;return this.renderHull(l),l.value()}},{key:"renderTriangle",value:function(l,d){var b=null==d?d=new CZ:void 0,Z=this.points,c=this.triangles,m=2*c[l*=3],X=2*c[l+1],G=2*c[l+2];return d.moveTo(Z[m],Z[m+1]),d.lineTo(Z[X],Z[X+1]),d.lineTo(Z[G],Z[G+1]),d.closePath(),b&&b.value()}},{key:"trianglePolygons",value:aZ.mark((function l(){var d,b,Z;return aZ.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:d=this.triangles,b=0,Z=d.length/3;case 2:if(!(b<Z)){l.next=8;break}return l.next=5,this.trianglePolygon(b);case 5:++b,l.next=2;break;case 8:case"end":return l.stop()}}),l,this)}))},{key:"trianglePolygon",value:function(l){var d=new FZ;return this.renderTriangle(l,d),d.value()}}],[{key:"from",value:function(d){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:QZ,Z=arguments.length>2&&void 0!==arguments[2]?arguments[2]:jZ,c=arguments.length>3?arguments[3]:void 0;return new l("length"in d?OZ(d,b,Z,c):Float64Array.from(DZ(d,b,Z,c)))}}]),l}();function OZ(l,d,b,Z){for(var c=l.length,m=new Float64Array(2*c),X=0;X<c;++X){var G=l[X];m[2*X]=d.call(Z,G,X,l),m[2*X+1]=b.call(Z,G,X,l)}return m}function DZ(l,d,b,Z){var c,m,X,G;return aZ.wrap((function(W){for(;;)switch(W.prev=W.next){case 0:c=0,m=BZ(l),W.prev=2,m.s();case 4:if((X=m.n()).done){W.next=13;break}return G=X.value,W.next=8,d.call(Z,G,c,l);case 8:return W.next=10,b.call(Z,G,c,l);case 10:++c;case 11:W.next=4;break;case 13:W.next=18;break;case 15:W.prev=15,W.t0=W.catch(2),m.e(W.t0);case 18:return W.prev=18,m.f(),W.finish(18);case 21:case"end":return W.stop()}}),PZ,null,[[2,15,18,21]])}function AZ(l,d){return null==l||null==d?NaN:l<d?-1:l>d?1:l>=d?0:NaN}function _Z(l){var d=l,b=l,Z=l;function c(l,d){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,m=arguments.length>3&&void 0!==arguments[3]?arguments[3]:l.length;if(c<m){if(0!==b(d,d))return m;do{var X=c+m>>>1;Z(l[X],d)<0?c=X+1:m=X}while(c<m)}return c}return 2!==l.length&&(d=function(d,b){return l(d)-b},b=AZ,Z=function(d,b){return AZ(l(d),b)}),{left:c,center:function(l,b){var Z=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,m=arguments.length>3&&void 0!==arguments[3]?arguments[3]:l.length,X=c(l,b,Z,m-1);return X>Z&&d(l[X-1],b)>-d(l[X],b)?X-1:X},right:function(l,d){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,m=arguments.length>3&&void 0!==arguments[3]?arguments[3]:l.length;if(c<m){if(0!==b(d,d))return m;do{var X=c+m>>>1;Z(l[X],d)<=0?c=X+1:m=X}while(c<m)}return c}}}var qZ=_Z(AZ).right;_Z((function(l){return null===l?NaN:+l})).center;var $Z=qZ,lc=Math.sqrt(50),dc=Math.sqrt(10),bc=Math.sqrt(2);function Zc(l,d,b){var Z=(d-l)/Math.max(0,b),c=Math.floor(Math.log(Z)/Math.LN10),m=Z/Math.pow(10,c);return c>=0?(m>=lc?10:m>=dc?5:m>=bc?2:1)*Math.pow(10,c):-Math.pow(10,-c)/(m>=lc?10:m>=dc?5:m>=bc?2:1)}function cc(l,d){switch(arguments.length){case 0:break;case 1:this.range(l);break;default:this.range(d).domain(l)}return this}function mc(l,d,b){l.prototype=d.prototype=b,b.constructor=l}function Xc(l,d){var b=Object.create(l.prototype);for(var Z in d)b[Z]=d[Z];return b}function Gc(){}var Wc=.7,uc=1/Wc,ac="\\s*([+-]?\\d+)\\s*",sc="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",hc="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Vc=/^#([0-9a-f]{3,8})$/,yc=new RegExp("^rgb\\(".concat(ac,",").concat(ac,",").concat(ac,"\\)$")),pc=new RegExp("^rgb\\(".concat(hc,",").concat(hc,",").concat(hc,"\\)$")),tc=new RegExp("^rgba\\(".concat(ac,",").concat(ac,",").concat(ac,",").concat(sc,"\\)$")),nc=new RegExp("^rgba\\(".concat(hc,",").concat(hc,",").concat(hc,",").concat(sc,"\\)$")),ic=new RegExp("^hsl\\(".concat(sc,",").concat(hc,",").concat(hc,"\\)$")),Rc=new RegExp("^hsla\\(".concat(sc,",").concat(hc,",").concat(hc,",").concat(sc,"\\)$")),oc={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function Lc(){return this.rgb().formatHex()}function Kc(){return this.rgb().formatRgb()}function Hc(l){var d,b;return l=(l+"").trim().toLowerCase(),(d=Vc.exec(l))?(b=d[1].length,d=parseInt(d[1],16),6===b?xc(d):3===b?new Jc(d>>8&15|d>>4&240,d>>4&15|240&d,(15&d)<<4|15&d,1):8===b?Sc(d>>24&255,d>>16&255,d>>8&255,(255&d)/255):4===b?Sc(d>>12&15|d>>8&240,d>>8&15|d>>4&240,d>>4&15|240&d,((15&d)<<4|15&d)/255):null):(d=yc.exec(l))?new Jc(d[1],d[2],d[3],1):(d=pc.exec(l))?new Jc(255*d[1]/100,255*d[2]/100,255*d[3]/100,1):(d=tc.exec(l))?Sc(d[1],d[2],d[3],d[4]):(d=nc.exec(l))?Sc(255*d[1]/100,255*d[2]/100,255*d[3]/100,d[4]):(d=ic.exec(l))?Fc(d[1],d[2]/100,d[3]/100,1):(d=Rc.exec(l))?Fc(d[1],d[2]/100,d[3]/100,d[4]):oc.hasOwnProperty(l)?xc(oc[l]):"transparent"===l?new Jc(NaN,NaN,NaN,0):null}function xc(l){return new Jc(l>>16&255,l>>8&255,255&l,1)}function Sc(l,d,b,Z){return Z<=0&&(l=d=b=NaN),new Jc(l,d,b,Z)}function Yc(l){return l instanceof Gc||(l=Hc(l)),l?new Jc((l=l.rgb()).r,l.g,l.b,l.opacity):new Jc}function ec(l,d,b,Z){return 1===arguments.length?Yc(l):new Jc(l,d,b,null==Z?1:Z)}function Jc(l,d,b,Z){this.r=+l,this.g=+d,this.b=+b,this.opacity=+Z}function zc(){return"#".concat(Cc(this.r)).concat(Cc(this.g)).concat(Cc(this.b))}function vc(){var l=Tc(this.opacity);return"".concat(1===l?"rgb(":"rgba(").concat(Mc(this.r),", ").concat(Mc(this.g),", ").concat(Mc(this.b)).concat(1===l?")":", ".concat(l,")"))}function Tc(l){return isNaN(l)?1:Math.max(0,Math.min(1,l))}function Mc(l){return Math.max(0,Math.min(255,Math.round(l)||0))}function Cc(l){return((l=Mc(l))<16?"0":"")+l.toString(16)}function Fc(l,d,b,Z){return Z<=0?l=d=b=NaN:b<=0||b>=1?l=d=NaN:d<=0&&(l=NaN),new kc(l,d,b,Z)}function Ic(l){if(l instanceof kc)return new kc(l.h,l.s,l.l,l.opacity);if(l instanceof Gc||(l=Hc(l)),!l)return new kc;if(l instanceof kc)return l;var d=(l=l.rgb()).r/255,b=l.g/255,Z=l.b/255,c=Math.min(d,b,Z),m=Math.max(d,b,Z),X=NaN,G=m-c,W=(m+c)/2;return G?(X=d===m?(b-Z)/G+6*(b<Z):b===m?(Z-d)/G+2:(d-b)/G+4,G/=W<.5?m+c:2-m-c,X*=60):G=W>0&&W<1?0:X,new kc(X,G,W,l.opacity)}function kc(l,d,b,Z){this.h=+l,this.s=+d,this.l=+b,this.opacity=+Z}function Nc(l){return(l=(l||0)%360)<0?l+360:l}function gc(l){return Math.max(0,Math.min(1,l||0))}function Pc(l,d,b){return 255*(l<60?d+(b-d)*l/60:l<180?b:l<240?d+(b-d)*(240-l)/60:d)}mc(Gc,Hc,{copy:function(l){return Object.assign(new this.constructor,this,l)},displayable:function(){return this.rgb().displayable()},hex:Lc,formatHex:Lc,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return Ic(this).formatHsl()},formatRgb:Kc,toString:Kc}),mc(Jc,ec,Xc(Gc,{brighter:function(l){return l=null==l?uc:Math.pow(uc,l),new Jc(this.r*l,this.g*l,this.b*l,this.opacity)},darker:function(l){return l=null==l?Wc:Math.pow(Wc,l),new Jc(this.r*l,this.g*l,this.b*l,this.opacity)},rgb:function(){return this},clamp:function(){return new Jc(Mc(this.r),Mc(this.g),Mc(this.b),Tc(this.opacity))},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:zc,formatHex:zc,formatHex8:function(){return"#".concat(Cc(this.r)).concat(Cc(this.g)).concat(Cc(this.b)).concat(Cc(255*(isNaN(this.opacity)?1:this.opacity)))},formatRgb:vc,toString:vc})),mc(kc,(function(l,d,b,Z){return 1===arguments.length?Ic(l):new kc(l,d,b,null==Z?1:Z)}),Xc(Gc,{brighter:function(l){return l=null==l?uc:Math.pow(uc,l),new kc(this.h,this.s,this.l*l,this.opacity)},darker:function(l){return l=null==l?Wc:Math.pow(Wc,l),new kc(this.h,this.s,this.l*l,this.opacity)},rgb:function(){var l=this.h%360+360*(this.h<0),d=isNaN(l)||isNaN(this.s)?0:this.s,b=this.l,Z=b+(b<.5?b:1-b)*d,c=2*b-Z;return new Jc(Pc(l>=240?l-240:l+120,c,Z),Pc(l,c,Z),Pc(l<120?l+240:l-120,c,Z),this.opacity)},clamp:function(){return new kc(Nc(this.h),gc(this.s),gc(this.l),Tc(this.opacity))},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var l=Tc(this.opacity);return"".concat(1===l?"hsl(":"hsla(").concat(Nc(this.h),", ").concat(100*gc(this.s),"%, ").concat(100*gc(this.l),"%").concat(1===l?")":", ".concat(l,")"))}}));var Bc=function(l){return function(){return l}};function wc(l){return 1==(l=+l)?Uc:function(d,b){return b-d?function(l,d,b){return l=Math.pow(l,b),d=Math.pow(d,b)-l,b=1/b,function(Z){return Math.pow(l+Z*d,b)}}(d,b,l):Bc(isNaN(d)?b:d)}}function Uc(l,d){var b=d-l;return b?function(l,d){return function(b){return l+b*d}}(l,b):Bc(isNaN(l)?d:l)}var rc=function l(d){var b=wc(d);function Z(l,d){var Z=b((l=ec(l)).r,(d=ec(d)).r),c=b(l.g,d.g),m=b(l.b,d.b),X=Uc(l.opacity,d.opacity);return function(d){return l.r=Z(d),l.g=c(d),l.b=m(d),l.opacity=X(d),l+""}}return Z.gamma=l,Z}(1);function Qc(l,d){d||(d=[]);var b,Z=l?Math.min(d.length,l.length):0,c=d.slice();return function(m){for(b=0;b<Z;++b)c[b]=l[b]*(1-m)+d[b]*m;return c}}function jc(l,d){var b,Z=d?d.length:0,c=l?Math.min(Z,l.length):0,m=new Array(c),X=new Array(Z);for(b=0;b<c;++b)m[b]=qc(l[b],d[b]);for(;b<Z;++b)X[b]=d[b];return function(l){for(b=0;b<c;++b)X[b]=m[b](l);return X}}function fc(l,d){var b=new Date;return l=+l,d=+d,function(Z){return b.setTime(l*(1-Z)+d*Z),b}}function Ec(l,d){return l=+l,d=+d,function(b){return l*(1-b)+d*b}}function Oc(l,d){var b,Z={},c={};for(b in null!==l&&"object"===h(l)||(l={}),null!==d&&"object"===h(d)||(d={}),d)b in l?Z[b]=qc(l[b],d[b]):c[b]=d[b];return function(l){for(b in Z)c[b]=Z[b](l);return c}}var Dc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Ac=new RegExp(Dc.source,"g");function _c(l,d){var b,Z,c,m=Dc.lastIndex=Ac.lastIndex=0,X=-1,G=[],W=[];for(l+="",d+="";(b=Dc.exec(l))&&(Z=Ac.exec(d));)(c=Z.index)>m&&(c=d.slice(m,c),G[X]?G[X]+=c:G[++X]=c),(b=b[0])===(Z=Z[0])?G[X]?G[X]+=Z:G[++X]=Z:(G[++X]=null,W.push({i:X,x:Ec(b,Z)})),m=Ac.lastIndex;return m<d.length&&(c=d.slice(m),G[X]?G[X]+=c:G[++X]=c),G.length<2?W[0]?function(l){return function(d){return l(d)+""}}(W[0].x):function(l){return function(){return l}}(d):(d=W.length,function(l){for(var b,Z=0;Z<d;++Z)G[(b=W[Z]).i]=b.x(l);return G.join("")})}function qc(l,d){var b,Z,c=h(d);return null==d||"boolean"===c?Bc(d):("number"===c?Ec:"string"===c?(b=Hc(d))?(d=b,rc):_c:d instanceof Hc?rc:d instanceof Date?fc:(Z=d,!ArrayBuffer.isView(Z)||Z instanceof DataView?Array.isArray(d)?jc:"function"!=typeof d.valueOf&&"function"!=typeof d.toString||isNaN(d)?Oc:Ec:Qc))(l,d)}function $c(l,d){return l=+l,d=+d,function(b){return Math.round(l*(1-b)+d*b)}}function lm(l){return+l}var dm=[0,1];function bm(l){return l}function Zm(l,d){return(d-=l=+l)?function(b){return(b-l)/d}:(b=isNaN(d)?NaN:.5,function(){return b});var b}function cm(l,d,b){var Z=l[0],c=l[1],m=d[0],X=d[1];return c<Z?(Z=Zm(c,Z),m=b(X,m)):(Z=Zm(Z,c),m=b(m,X)),function(l){return m(Z(l))}}function mm(l,d,b){var Z=Math.min(l.length,d.length)-1,c=new Array(Z),m=new Array(Z),X=-1;for(l[Z]<l[0]&&(l=l.slice().reverse(),d=d.slice().reverse());++X<Z;)c[X]=Zm(l[X],l[X+1]),m[X]=b(d[X],d[X+1]);return function(d){var b=$Z(l,d,1,Z)-1;return m[b](c[b](d))}}function Xm(l,d){return d.domain(l.domain()).range(l.range()).interpolate(l.interpolate()).clamp(l.clamp()).unknown(l.unknown())}function Gm(){var l,d,b,Z,c,m,X=dm,G=dm,W=qc,u=bm;function a(){var l,d,b,W=Math.min(X.length,G.length);return u!==bm&&(l=X[0],d=X[W-1],l>d&&(b=l,l=d,d=b),u=function(b){return Math.max(l,Math.min(d,b))}),Z=W>2?mm:cm,c=m=null,s}function s(d){return null==d||isNaN(d=+d)?b:(c||(c=Z(X.map(l),G,W)))(l(u(d)))}return s.invert=function(b){return u(d((m||(m=Z(G,X.map(l),Ec)))(b)))},s.domain=function(l){return arguments.length?(X=Array.from(l,lm),a()):X.slice()},s.range=function(l){return arguments.length?(G=Array.from(l),a()):G.slice()},s.rangeRound=function(l){return G=Array.from(l),W=$c,a()},s.clamp=function(l){return arguments.length?(u=!!l||bm,a()):u!==bm},s.interpolate=function(l){return arguments.length?(W=l,a()):W},s.unknown=function(l){return arguments.length?(b=l,s):b},function(b,Z){return l=b,d=Z,a()}}function Wm(){return Gm()(bm,bm)}function um(l,d){if((b=(l=d?l.toExponential(d-1):l.toExponential()).indexOf("e"))<0)return null;var b,Z=l.slice(0,b);return[Z.length>1?Z[0]+Z.slice(2):Z,+l.slice(b+1)]}function am(l){return(l=um(Math.abs(l)))?l[1]:NaN}var sm,hm=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Vm(l){if(!(d=hm.exec(l)))throw new Error("invalid format: "+l);var d;return new ym({fill:d[1],align:d[2],sign:d[3],symbol:d[4],zero:d[5],width:d[6],comma:d[7],precision:d[8]&&d[8].slice(1),trim:d[9],type:d[10]})}function ym(l){this.fill=void 0===l.fill?" ":l.fill+"",this.align=void 0===l.align?">":l.align+"",this.sign=void 0===l.sign?"-":l.sign+"",this.symbol=void 0===l.symbol?"":l.symbol+"",this.zero=!!l.zero,this.width=void 0===l.width?void 0:+l.width,this.comma=!!l.comma,this.precision=void 0===l.precision?void 0:+l.precision,this.trim=!!l.trim,this.type=void 0===l.type?"":l.type+""}function pm(l,d){var b=um(l,d);if(!b)return l+"";var Z=b[0],c=b[1];return c<0?"0."+new Array(-c).join("0")+Z:Z.length>c+1?Z.slice(0,c+1)+"."+Z.slice(c+1):Z+new Array(c-Z.length+2).join("0")}Vm.prototype=ym.prototype,ym.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var tm={"%":function(l,d){return(100*l).toFixed(d)},b:function(l){return Math.round(l).toString(2)},c:function(l){return l+""},d:function(l){return Math.abs(l=Math.round(l))>=1e21?l.toLocaleString("en").replace(/,/g,""):l.toString(10)},e:function(l,d){return l.toExponential(d)},f:function(l,d){return l.toFixed(d)},g:function(l,d){return l.toPrecision(d)},o:function(l){return Math.round(l).toString(8)},p:function(l,d){return pm(100*l,d)},r:pm,s:function(l,d){var b=um(l,d);if(!b)return l+"";var Z=b[0],c=b[1],m=c-(sm=3*Math.max(-8,Math.min(8,Math.floor(c/3))))+1,X=Z.length;return m===X?Z:m>X?Z+new Array(m-X+1).join("0"):m>0?Z.slice(0,m)+"."+Z.slice(m):"0."+new Array(1-m).join("0")+um(l,Math.max(0,d+m-1))[0]},X:function(l){return Math.round(l).toString(16).toUpperCase()},x:function(l){return Math.round(l).toString(16)}};function nm(l){return l}var im,Rm,om,Lm=Array.prototype.map,Km=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Hm(l){var d,b,Z=void 0===l.grouping||void 0===l.thousands?nm:(d=Lm.call(l.grouping,Number),b=l.thousands+"",function(l,Z){for(var c=l.length,m=[],X=0,G=d[0],W=0;c>0&&G>0&&(W+G+1>Z&&(G=Math.max(1,Z-W)),m.push(l.substring(c-=G,c+G)),!((W+=G+1)>Z));)G=d[X=(X+1)%d.length];return m.reverse().join(b)}),c=void 0===l.currency?"":l.currency[0]+"",m=void 0===l.currency?"":l.currency[1]+"",X=void 0===l.decimal?".":l.decimal+"",G=void 0===l.numerals?nm:function(l){return function(d){return d.replace(/[0-9]/g,(function(d){return l[+d]}))}}(Lm.call(l.numerals,String)),W=void 0===l.percent?"%":l.percent+"",u=void 0===l.minus?"−":l.minus+"",a=void 0===l.nan?"NaN":l.nan+"";function s(l){var d=(l=Vm(l)).fill,b=l.align,s=l.sign,h=l.symbol,V=l.zero,y=l.width,p=l.comma,t=l.precision,n=l.trim,i=l.type;"n"===i?(p=!0,i="g"):tm[i]||(void 0===t&&(t=12),n=!0,i="g"),(V||"0"===d&&"="===b)&&(V=!0,d="0",b="=");var R="$"===h?c:"#"===h&&/[boxX]/.test(i)?"0"+i.toLowerCase():"",o="$"===h?m:/[%p]/.test(i)?W:"",L=tm[i],K=/[defgprs%]/.test(i);function H(l){var c,m,W,h=R,H=o;if("c"===i)H=L(l)+H,l="";else{var x=(l=+l)<0||1/l<0;if(l=isNaN(l)?a:L(Math.abs(l),t),n&&(l=function(l){l:for(var d,b=l.length,Z=1,c=-1;Z<b;++Z)switch(l[Z]){case".":c=d=Z;break;case"0":0===c&&(c=Z),d=Z;break;default:if(!+l[Z])break l;c>0&&(c=0)}return c>0?l.slice(0,c)+l.slice(d+1):l}(l)),x&&0==+l&&"+"!==s&&(x=!1),h=(x?"("===s?s:u:"-"===s||"("===s?"":s)+h,H=("s"===i?Km[8+sm/3]:"")+H+(x&&"("===s?")":""),K)for(c=-1,m=l.length;++c<m;)if(48>(W=l.charCodeAt(c))||W>57){H=(46===W?X+l.slice(c+1):l.slice(c))+H,l=l.slice(0,c);break}}p&&!V&&(l=Z(l,1/0));var S=h.length+l.length+H.length,Y=S<y?new Array(y-S+1).join(d):"";switch(p&&V&&(l=Z(Y+l,Y.length?y-H.length:1/0),Y=""),b){case"<":l=h+l+H+Y;break;case"=":l=h+Y+l+H;break;case"^":l=Y.slice(0,S=Y.length>>1)+h+l+H+Y.slice(S);break;default:l=Y+h+l+H}return G(l)}return t=void 0===t?6:/[gprs]/.test(i)?Math.max(1,Math.min(21,t)):Math.max(0,Math.min(20,t)),H.toString=function(){return l+""},H}return{format:s,formatPrefix:function(l,d){var b=s(((l=Vm(l)).type="f",l)),Z=3*Math.max(-8,Math.min(8,Math.floor(am(d)/3))),c=Math.pow(10,-Z),m=Km[8+Z/3];return function(l){return b(c*l)+m}}}}function xm(l,d,b,Z){var c,m=function(l,d,b){var Z=Math.abs(d-l)/Math.max(0,b),c=Math.pow(10,Math.floor(Math.log(Z)/Math.LN10)),m=Z/c;return m>=lc?c*=10:m>=dc?c*=5:m>=bc&&(c*=2),d<l?-c:c}(l,d,b);switch((Z=Vm(null==Z?",f":Z)).type){case"s":var X=Math.max(Math.abs(l),Math.abs(d));return null!=Z.precision||isNaN(c=function(l,d){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(am(d)/3)))-am(Math.abs(l)))}(m,X))||(Z.precision=c),om(Z,X);case"":case"e":case"g":case"p":case"r":null!=Z.precision||isNaN(c=function(l,d){return l=Math.abs(l),d=Math.abs(d)-l,Math.max(0,am(d)-am(l))+1}(m,Math.max(Math.abs(l),Math.abs(d))))||(Z.precision=c-("e"===Z.type));break;case"f":case"%":null!=Z.precision||isNaN(c=function(l){return Math.max(0,-am(Math.abs(l)))}(m))||(Z.precision=c-2*("%"===Z.type))}return Rm(Z)}function Sm(l){var d=l.domain;return l.ticks=function(l){var b=d();return function(l,d,b){var Z,c,m,X,G=-1;if(b=+b,(l=+l)==(d=+d)&&b>0)return[l];if((Z=d<l)&&(c=l,l=d,d=c),0===(X=Zc(l,d,b))||!isFinite(X))return[];if(X>0){var W=Math.round(l/X),u=Math.round(d/X);for(W*X<l&&++W,u*X>d&&--u,m=new Array(c=u-W+1);++G<c;)m[G]=(W+G)*X}else{X=-X;var a=Math.round(l*X),s=Math.round(d*X);for(a/X<l&&++a,s/X>d&&--s,m=new Array(c=s-a+1);++G<c;)m[G]=(a+G)/X}return Z&&m.reverse(),m}(b[0],b[b.length-1],null==l?10:l)},l.tickFormat=function(l,b){var Z=d();return xm(Z[0],Z[Z.length-1],null==l?10:l,b)},l.nice=function(b){null==b&&(b=10);var Z,c,m=d(),X=0,G=m.length-1,W=m[X],u=m[G],a=10;for(u<W&&(c=W,W=u,u=c,c=X,X=G,G=c);a-- >0;){if((c=Zc(W,u,b))===Z)return m[X]=W,m[G]=u,d(m);if(c>0)W=Math.floor(W/c)*c,u=Math.ceil(u/c)*c;else{if(!(c<0))break;W=Math.ceil(W*c)/c,u=Math.floor(u*c)/c}Z=c}return l},l}function Ym(){var l=Wm();return l.copy=function(){return Xm(l,Ym())},cc.apply(l,arguments),Sm(l)}function em(l,d){var b="undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(!b){if(Array.isArray(l)||(b=function(l,d){if(!l)return;if("string"==typeof l)return Jm(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);"Object"===b&&l.constructor&&(b=l.constructor.name);if("Map"===b||"Set"===b)return Array.from(l);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return Jm(l,d)}(l))||d&&l&&"number"==typeof l.length){b&&(l=b);var Z=0,c=function(){};return{s:c,n:function(){return Z>=l.length?{done:!0}:{done:!1,value:l[Z++]}},e:function(l){throw l},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,X=!0,G=!1;return{s:function(){b=b.call(l)},n:function(){var l=b.next();return X=l.done,l},e:function(l){G=!0,m=l},f:function(){try{X||null==b.return||b.return()}finally{if(G)throw m}}}}function Jm(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}im=Hm({thousands:",",grouping:[3],currency:["$",""]}),Rm=im.format,om=im.formatPrefix;var zm=aZ.mark(Mm);function vm(l,d){var b="undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(!b){if(Array.isArray(l)||(b=function(l,d){if(!l)return;if("string"==typeof l)return Tm(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);"Object"===b&&l.constructor&&(b=l.constructor.name);if("Map"===b||"Set"===b)return Array.from(l);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return Tm(l,d)}(l))||d&&l&&"number"==typeof l.length){b&&(l=b);var Z=0,c=function(){};return{s:c,n:function(){return Z>=l.length?{done:!0}:{done:!1,value:l[Z++]}},e:function(l){throw l},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,X=!0,G=!1;return{s:function(){b=b.call(l)},n:function(){var l=b.next();return X=l.done,l},e:function(l){G=!0,m=l},f:function(){try{X||null==b.return||b.return()}finally{if(G)throw m}}}}function Tm(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}function Mm(l){var d,b,Z;return aZ.wrap((function(c){for(;;)switch(c.prev=c.next){case 0:d=vm(l),c.prev=1,d.s();case 3:if((b=d.n()).done){c.next=8;break}return Z=b.value,c.delegateYield(Z,"t0",6);case 6:c.next=3;break;case 8:c.next=13;break;case 10:c.prev=10,c.t1=c.catch(1),d.e(c.t1);case 13:return c.prev=13,d.f(),c.finish(13);case 16:case"end":return c.stop()}}),zm,null,[[1,10,13,16]])}function Cm(l,d){for(var b=d.length,Z=-1;++Z<b;){var c=Fm(l,d[Z]);if(c)return c}return 0}function Fm(l,d){for(var b=d[0],Z=d[1],c=-1,m=0,X=l.length,G=X-1;m<X;G=m++){var W=l[m],u=W[0],a=W[1],s=l[G],h=s[0],V=s[1];if(Im(W,s,d))return 0;a>Z!=V>Z&&b<(h-u)*(Z-a)/(V-a)+u&&(c=-c)}return c}function Im(l,d,b){var Z,c,m,X;return function(l,d,b){return(d[0]-l[0])*(b[1]-l[1])==(b[0]-l[0])*(d[1]-l[1])}(l,d,b)&&(c=l[Z=+(l[0]===d[0])],m=b[Z],X=d[Z],c<=m&&m<=X||X<=m&&m<=c)}function km(l){for(var d=0,b=l.length,Z=l[b-1][1]*l[0][0]-l[b-1][0]*l[0][1];++d<b;)Z+=l[d-1][1]*l[d][0]-l[d-1][0]*l[d][1];return Z}function Nm(l,d){var b="undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(!b){if(Array.isArray(l)||(b=function(l,d){if(!l)return;if("string"==typeof l)return gm(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);"Object"===b&&l.constructor&&(b=l.constructor.name);if("Map"===b||"Set"===b)return Array.from(l);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return gm(l,d)}(l))||d&&l&&"number"==typeof l.length){b&&(l=b);var Z=0,c=function(){};return{s:c,n:function(){return Z>=l.length?{done:!0}:{done:!1,value:l[Z++]}},e:function(l){throw l},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,X=!0,G=!1;return{s:function(){b=b.call(l)},n:function(){var l=b.next();return X=l.done,l},e:function(l){G=!0,m=l},f:function(){try{X||null==b.return||b.return()}finally{if(G)throw m}}}}function gm(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}function Pm(l){var d,b=[],Z=[],c=Nm(l);try{for(c.s();!(d=c.n()).done;){var m=d.value;km(m)>0?b.push([m]):Z.push(m)}}catch(l){c.e(l)}finally{c.f()}return Z.forEach((function(l){for(var d,Z=0,c=b.length;Z<c;++Z)if(-1!==Cm((d=b[Z])[0],l))return void d.push(l)})),b}function Bm(l,d){var b="undefined"!=typeof Symbol&&l[Symbol.iterator]||l["@@iterator"];if(!b){if(Array.isArray(l)||(b=function(l,d){if(!l)return;if("string"==typeof l)return wm(l,d);var b=Object.prototype.toString.call(l).slice(8,-1);"Object"===b&&l.constructor&&(b=l.constructor.name);if("Map"===b||"Set"===b)return Array.from(l);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return wm(l,d)}(l))||d&&l&&"number"==typeof l.length){b&&(l=b);var Z=0,c=function(){};return{s:c,n:function(){return Z>=l.length?{done:!0}:{done:!1,value:l[Z++]}},e:function(l){throw l},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,X=!0,G=!1;return{s:function(){b=b.call(l)},n:function(){var l=b.next();return X=l.done,l},e:function(l){G=!0,m=l},f:function(){try{X||null==b.return||b.return()}finally{if(G)throw m}}}}function wm(l,d){(null==d||d>l.length)&&(d=l.length);for(var b=0,Z=new Array(d);b<d;b++)Z[b]=l[b];return Z}function Um(){var l,d,b,Z=aZ.mark(y),c=aZ.mark(p),m=function(l){return l[0]},X=function(l){return l[1]},W=function(l){return isFinite(+l[2])?+l[2]:0},u=EZ.from,a=function(l,d,Z){var c=b.points,m=[c[2*l],c[2*l+1]],X=[c[2*d],c[2*d+1]];return[Z*X[0]+(1-Z)*m[0],Z*X[1]+(1-Z)*m[1]]},s=Pm;function V(Z){b=u(Z,m,X),d=Array.from(Z,W),"object"!==h(l)&&(l=Ym().domain(function(l){var d,b,Z,c=em(l);try{for(c.s();!(Z=c.n()).done;){var m=Z.value;null!=m&&(void 0===d?m>=m&&(d=b=m):(d>m&&(d=m),b<m&&(b=m)))}}catch(l){c.e(l)}finally{c.f()}return[d,b]}(d)).nice().ticks(l))}function y(c){var m,X,G,W;return aZ.wrap((function(Z){for(;;)switch(Z.prev=Z.next){case 0:V(c),m=Bm(l),Z.prev=2,m.s();case 4:if((X=m.n()).done){Z.next=11;break}return G=X.value,W=R(b,d,G),Z.next=9,{type:"MultiPolygon",coordinates:W,value:G};case 9:Z.next=4;break;case 11:Z.next=16;break;case 13:Z.prev=13,Z.t0=Z.catch(2),m.e(Z.t0);case 16:return Z.prev=16,m.f(),Z.finish(16);case 19:case"end":return Z.stop()}}),Z,null,[[2,13,16,19]])}function p(Z){var m,X,G,W,u,a;return aZ.wrap((function(c){for(;;)switch(c.prev=c.next){case 0:V(Z),W=Bm(l),c.prev=2,W.s();case 4:if((u=W.n()).done){c.next=14;break}if(a=u.value,X&&(m=X),h=R(b,d,a),X=Array.from(Mm(h)),!m){c.next=11;break}return c.next=11,{type:"MultiPolygon",coordinates:s(m.concat(X.map((function(l){return l.slice().reverse()})))),value:G,valueMax:a};case 11:G=a;case 12:c.next=4;break;case 14:c.next=19;break;case 16:c.prev=16,c.t0=c.catch(2),W.e(c.t0);case 19:return c.prev=19,W.f(),c.finish(19);case 22:case"end":return c.stop()}var h}),c,null,[[2,16,19,22]])}var t=function(l){return G(y(l))};return t.x=function(l){return l?(m=l,t):m},t.y=function(l){return l?(X=l,t):X},t.value=function(l){return l?(W=l,t):W},t.thresholds=function(d){return d?(l=d,t):l},t.triangulate=function(l){return l?(u=l,t):u},t.pointInterpolate=function(l){return l?(a=l,t):a},t.ringsort=function(l){return l?(s=l,t):s},t.contours=y,t.contour=function(l,Z){return V(l),{type:"MultiPolygon",coordinates:R(b,d,Z),value:Z}},t.isobands=p,t._values=function(){return d},t._triangulation=function(){return b},t;function n(l){return l%3==2?l-2:l+1}function i(l){return l%3==0?l+2:l-1}function R(l,d){var b,Z=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,c=Bm(d);try{for(c.s();!(b=c.n()).done;){var m=b.value;if(!isFinite(m))throw["Invalid value",m]}}catch(l){c.e(l)}finally{c.f()}var X=l.halfedges,G=l.hull,W=l.inedges,u=l.triangles,h=d.length;function V(l){return y(u[l],u[n(l)])}function y(l,b){var c=d[l],m=d[b];if(c<=Z&&m>=Z&&c<m)return(Z-c)/(m-c)}var p,t,R,o,L,K=[],H=new Uint8Array(X.length).fill(0);for(o=0;o<X.length;o++)if(!H[o]){for(t=o,p=[];(L=V(t))>0;){var x=[u[t],u[R=n(t)]],S=x[0],Y=x[1];if(p.length&&S===p[0].ti&&Y===p[0].tj||p.length>2*h)break;if(H[t]=1,p.push({ti:S,tj:Y,a:L}),(R=X[t])>-1){if(V(R=n(R))>0){t=R;continue}if(V(R=n(R))>0){t=R;continue}}else{for(var e=(G.indexOf(u[t])+1)%G.length;d[G[e]]<Z;)e=(e+1)%G.length;for(;d[G[e]]>=Z;)p.push({ti:G[e],tj:G[e],a:0}),e=(e+1)%G.length;if(R=W[G[e]],p.push({ti:G[e],tj:u[R],a:y(G[e],u[R])}),V(t=n(R))>0)continue;if(V(t=i(R))>0)continue}}p.length&&(p.push(p[0]),K.push(p.map((function(l){var d=l.ti,b=l.tj,Z=l.a;return a(d,b,Z)}))))}return G.every((function(l){return d[l]>=Z}))&&K.unshift(Array.from(G).concat([G[0]]).map((function(l){return a(l,l,0)}))),s(K)}}function rm(){return"undefined"!=typeof window&&void 0!==window.document}var Qm=y(Object.freeze({__proto__:null,default:{}})),jm=p((function(l,d){var b;l.exports=(b=b||function(l,d){var b;if("undefined"!=typeof window&&window.crypto&&(b=window.crypto),"undefined"!=typeof self&&self.crypto&&(b=self.crypto),"undefined"!=typeof globalThis&&globalThis.crypto&&(b=globalThis.crypto),!b&&"undefined"!=typeof window&&window.msCrypto&&(b=window.msCrypto),!b&&void 0!==V&&V.crypto&&(b=V.crypto),!b)try{b=Qm}catch(l){}var Z=function(){if(b){if("function"==typeof b.getRandomValues)try{return b.getRandomValues(new Uint32Array(1))[0]}catch(l){}if("function"==typeof b.randomBytes)try{return b.randomBytes(4).readInt32LE()}catch(l){}}throw new Error("Native crypto module could not be used to get secure random number.")},c=Object.create||function(){function l(){}return function(d){var b;return l.prototype=d,b=new l,l.prototype=null,b}}(),m={},X=m.lib={},G=X.Base={extend:function(l){var d=c(this);return l&&d.mixIn(l),d.hasOwnProperty("init")&&this.init!==d.init||(d.init=function(){d.$super.init.apply(this,arguments)}),d.init.prototype=d,d.$super=this,d},create:function(){var l=this.extend();return l.init.apply(l,arguments),l},init:function(){},mixIn:function(l){for(var d in l)l.hasOwnProperty(d)&&(this[d]=l[d]);l.hasOwnProperty("toString")&&(this.toString=l.toString)},clone:function(){return this.init.prototype.extend(this)}},W=X.WordArray=G.extend({init:function(l,b){l=this.words=l||[],this.sigBytes=b!=d?b:4*l.length},toString:function(l){return(l||a).stringify(this)},concat:function(l){var d=this.words,b=l.words,Z=this.sigBytes,c=l.sigBytes;if(this.clamp(),Z%4)for(var m=0;m<c;m++){var X=b[m>>>2]>>>24-m%4*8&255;d[Z+m>>>2]|=X<<24-(Z+m)%4*8}else for(var G=0;G<c;G+=4)d[Z+G>>>2]=b[G>>>2];return this.sigBytes+=c,this},clamp:function(){var d=this.words,b=this.sigBytes;d[b>>>2]&=4294967295<<32-b%4*8,d.length=l.ceil(b/4)},clone:function(){var l=G.clone.call(this);return l.words=this.words.slice(0),l},random:function(l){for(var d=[],b=0;b<l;b+=4)d.push(Z());return new W.init(d,l)}}),u=m.enc={},a=u.Hex={stringify:function(l){for(var d=l.words,b=l.sigBytes,Z=[],c=0;c<b;c++){var m=d[c>>>2]>>>24-c%4*8&255;Z.push((m>>>4).toString(16)),Z.push((15&m).toString(16))}return Z.join("")},parse:function(l){for(var d=l.length,b=[],Z=0;Z<d;Z+=2)b[Z>>>3]|=parseInt(l.substr(Z,2),16)<<24-Z%8*4;return new W.init(b,d/2)}},s=u.Latin1={stringify:function(l){for(var d=l.words,b=l.sigBytes,Z=[],c=0;c<b;c++){var m=d[c>>>2]>>>24-c%4*8&255;Z.push(String.fromCharCode(m))}return Z.join("")},parse:function(l){for(var d=l.length,b=[],Z=0;Z<d;Z++)b[Z>>>2]|=(255&l.charCodeAt(Z))<<24-Z%4*8;return new W.init(b,d)}},h=u.Utf8={stringify:function(l){try{return decodeURIComponent(escape(s.stringify(l)))}catch(l){throw new Error("Malformed UTF-8 data")}},parse:function(l){return s.parse(unescape(encodeURIComponent(l)))}},y=X.BufferedBlockAlgorithm=G.extend({reset:function(){this._data=new W.init,this._nDataBytes=0},_append:function(l){"string"==typeof l&&(l=h.parse(l)),this._data.concat(l),this._nDataBytes+=l.sigBytes},_process:function(d){var b,Z=this._data,c=Z.words,m=Z.sigBytes,X=this.blockSize,G=m/(4*X),u=(G=d?l.ceil(G):l.max((0|G)-this._minBufferSize,0))*X,a=l.min(4*u,m);if(u){for(var s=0;s<u;s+=X)this._doProcessBlock(c,s);b=c.splice(0,u),Z.sigBytes-=a}return new W.init(b,a)},clone:function(){var l=G.clone.call(this);return l._data=this._data.clone(),l},_minBufferSize:0});X.Hasher=y.extend({cfg:G.extend(),init:function(l){this.cfg=this.cfg.extend(l),this.reset()},reset:function(){y.reset.call(this),this._doReset()},update:function(l){return this._append(l),this._process(),this},finalize:function(l){return l&&this._append(l),this._doFinalize()},blockSize:16,_createHelper:function(l){return function(d,b){return new l.init(b).finalize(d)}},_createHmacHelper:function(l){return function(d,b){return new p.HMAC.init(l,b).finalize(d)}}});var p=m.algo={};return m}(Math),b)})),fm=p((function(l,d){l.exports=jm.enc.Utf8})),Em=p((function(l,d){var b;l.exports=(b=jm,function(){var l=b,d=l.lib.WordArray;function Z(l,b,Z){for(var c=[],m=0,X=0;X<b;X++)if(X%4){var G=Z[l.charCodeAt(X-1)]<<X%4*2|Z[l.charCodeAt(X)]>>>6-X%4*2;c[m>>>2]|=G<<24-m%4*8,m++}return d.create(c,m)}l.enc.Base64={stringify:function(l){var d=l.words,b=l.sigBytes,Z=this._map;l.clamp();for(var c=[],m=0;m<b;m+=3)for(var X=(d[m>>>2]>>>24-m%4*8&255)<<16|(d[m+1>>>2]>>>24-(m+1)%4*8&255)<<8|d[m+2>>>2]>>>24-(m+2)%4*8&255,G=0;G<4&&m+.75*G<b;G++)c.push(Z.charAt(X>>>6*(3-G)&63));var W=Z.charAt(64);if(W)for(;c.length%4;)c.push(W);return c.join("")},parse:function(l){var d=l.length,b=this._map,c=this._reverseMap;if(!c){c=this._reverseMap=[];for(var m=0;m<b.length;m++)c[b.charCodeAt(m)]=m}var X=b.charAt(64);if(X){var G=l.indexOf(X);-1!==G&&(d=G)}return Z(l,d,c)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),b.enc.Base64)}));function Om(l){return!(!XZ(l)||""===l)}function Dm(l){var d=!1;return Om(l)?d=!isNaN(Number(l)):function(l){return"[object Number]"===Object.prototype.toString.call(l)}(l)&&(d=!0),d}function Am(l,d){return!!mZ(l)&&(!(!Om(d)&&!Dm(d))&&d in l)}var _m=function(){if(!rm())return null;var l="undefined"!=typeof self?self:rm()?window:"undefined"!=typeof global?global:null;if(Am(l,"turf"))return l.turf;var d=l.document.createElement("script");return d.innerHTML=function(l){return Om(l)?Em.parse(l).toString(fm):""}("IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9lKGV4cG9ydHMpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZXhwb3J0cyJdLGUpOmUoKHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6dHx8c2VsZikudHVyZj17fSl9KHRoaXMsKGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT02MzcxMDA4Ljgsbj17Y2VudGltZXRlcnM6NjM3MTAwODgwLGNlbnRpbWV0cmVzOjYzNzEwMDg4MCxkZWdyZWVzOjU3LjIyODkxMzU0MTQzMjc0LGZlZXQ6MjA5MDIyNjAuNTExMzkyLGluY2hlczozOS4zNyplLGtpbG9tZXRlcnM6NjM3MS4wMDg4LGtpbG9tZXRyZXM6NjM3MS4wMDg4LG1ldGVyczplLG1ldHJlczplLG1pbGVzOjM5NTguNzYxMzMzODEwNTQ2LG1pbGxpbWV0ZXJzOjYzNzEwMDg4MDAsbWlsbGltZXRyZXM6NjM3MTAwODgwMCxuYXV0aWNhbG1pbGVzOmUvMTg1MixyYWRpYW5zOjEseWFyZHM6Njk2NzMzNS4yMjM2Nzk5OTl9LHI9e2NlbnRpbWV0ZXJzOjEwMCxjZW50aW1ldHJlczoxMDAsZGVncmVlczoxLzExMTMyNSxmZWV0OjMuMjgwODQsaW5jaGVzOjM5LjM3LGtpbG9tZXRlcnM6LjAwMSxraWxvbWV0cmVzOi4wMDEsbWV0ZXJzOjEsbWV0cmVzOjEsbWlsZXM6MS8xNjA5LjM0NCxtaWxsaW1ldGVyczoxZTMsbWlsbGltZXRyZXM6MWUzLG5hdXRpY2FsbWlsZXM6MS8xODUyLHJhZGlhbnM6MS9lLHlhcmRzOjEuMDkzNjEzM30saT17YWNyZXM6MjQ3MTA1ZS05LGNlbnRpbWV0ZXJzOjFlNCxjZW50aW1ldHJlczoxZTQsZmVldDoxMC43NjM5MTA0MTcsaGVjdGFyZXM6MWUtNCxpbmNoZXM6MTU1MC4wMDMxMDAwMDYsa2lsb21ldGVyczoxZS02LGtpbG9tZXRyZXM6MWUtNixtZXRlcnM6MSxtZXRyZXM6MSxtaWxlczozODZlLTksbWlsbGltZXRlcnM6MWU2LG1pbGxpbWV0cmVzOjFlNix5YXJkczoxLjE5NTk5MDA0Nn07ZnVuY3Rpb24gbyh0LGUsbil7dm9pZCAwPT09biYmKG49e30pO3ZhciByPXt0eXBlOiJGZWF0dXJlIn07cmV0dXJuKDA9PT1uLmlkfHxuLmlkKSYmKHIuaWQ9bi5pZCksbi5iYm94JiYoci5iYm94PW4uYmJveCksci5wcm9wZXJ0aWVzPWV8fHt9LHIuZ2VvbWV0cnk9dCxyfWZ1bmN0aW9uIHModCxlLG4pe3N3aXRjaCh0KXtjYXNlIlBvaW50IjpyZXR1cm4gYShlKS5nZW9tZXRyeTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBoKGUpLmdlb21ldHJ5O2Nhc2UiUG9seWdvbiI6cmV0dXJuIGwoZSkuZ2VvbWV0cnk7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gZChlKS5nZW9tZXRyeTtjYXNlIk11bHRpTGluZVN0cmluZyI6cmV0dXJuIGcoZSkuZ2VvbWV0cnk7Y2FzZSJNdWx0aVBvbHlnb24iOnJldHVybiB5KGUpLmdlb21ldHJ5O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKHQrIiBpcyBpbnZhbGlkIil9fWZ1bmN0aW9uIGEodCxlLG4pe2lmKHZvaWQgMD09PW4mJihuPXt9KSwhdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Iik7aWYodC5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYXQgbGVhc3QgMiBudW1iZXJzIGxvbmciKTtpZighQyh0WzBdKXx8IUModFsxXSkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGNvbnRhaW4gbnVtYmVycyIpO3JldHVybiBvKHt0eXBlOiJQb2ludCIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiB1KHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLGYodC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQsZSl9KSksbil9ZnVuY3Rpb24gbCh0LGUsbil7dm9pZCAwPT09biYmKG49e30pO2Zvcih2YXIgcj0wLGk9dDtyPGkubGVuZ3RoO3IrKyl7dmFyIHM9aVtyXTtpZihzLmxlbmd0aDw0KXRocm93IG5ldyBFcnJvcigiRWFjaCBMaW5lYXJSaW5nIG9mIGEgUG9seWdvbiBtdXN0IGhhdmUgNCBvciBtb3JlIFBvc2l0aW9ucy4iKTtmb3IodmFyIGE9MDthPHNbcy5sZW5ndGgtMV0ubGVuZ3RoO2ErKylpZihzW3MubGVuZ3RoLTFdW2FdIT09c1swXVthXSl0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFuZCBsYXN0IFBvc2l0aW9uIGFyZSBub3QgZXF1aXZhbGVudC4iKX1yZXR1cm4gbyh7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiBjKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLGYodC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBsKHQsZSl9KSksbil9ZnVuY3Rpb24gaCh0LGUsbil7aWYodm9pZCAwPT09biYmKG49e30pLHQubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIGFycmF5IG9mIHR3byBvciBtb3JlIHBvc2l0aW9ucyIpO3JldHVybiBvKHt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIHAodCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj17fSksZih0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGgodCxlKX0pKSxuKX1mdW5jdGlvbiBmKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiJ9O3JldHVybiBlLmlkJiYobi5pZD1lLmlkKSxlLmJib3gmJihuLmJib3g9ZS5iYm94KSxuLmZlYXR1cmVzPXQsbn1mdW5jdGlvbiBnKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLG8oe3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiBkKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLG8oe3R5cGU6Ik11bHRpUG9pbnQiLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24geSh0LGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPXt9KSxvKHt0eXBlOiJNdWx0aVBvbHlnb24iLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24gdih0LGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPXt9KSxvKHt0eXBlOiJHZW9tZXRyeUNvbGxlY3Rpb24iLGdlb21ldHJpZXM6dH0sZSxuKX1mdW5jdGlvbiBfKHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9MCksZSYmIShlPj0wKSl0aHJvdyBuZXcgRXJyb3IoInByZWNpc2lvbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7dmFyIG49TWF0aC5wb3coMTAsZXx8MCk7cmV0dXJuIE1hdGgucm91bmQodCpuKS9ufWZ1bmN0aW9uIG0odCxlKXt2b2lkIDA9PT1lJiYoZT0ia2lsb21ldGVycyIpO3ZhciByPW5bZV07aWYoIXIpdGhyb3cgbmV3IEVycm9yKGUrIiB1bml0cyBpcyBpbnZhbGlkIik7cmV0dXJuIHQqcn1mdW5jdGlvbiB4KHQsZSl7dm9pZCAwPT09ZSYmKGU9ImtpbG9tZXRlcnMiKTt2YXIgcj1uW2VdO2lmKCFyKXRocm93IG5ldyBFcnJvcihlKyIgdW5pdHMgaXMgaW52YWxpZCIpO3JldHVybiB0L3J9ZnVuY3Rpb24gRSh0LGUpe3JldHVybiB3KHgodCxlKSl9ZnVuY3Rpb24gYih0KXt2YXIgZT10JTM2MDtyZXR1cm4gZTwwJiYoZSs9MzYwKSxlfWZ1bmN0aW9uIHcodCl7cmV0dXJuIDE4MCoodCUoMipNYXRoLlBJKSkvTWF0aC5QSX1mdW5jdGlvbiBJKHQpe3JldHVybiB0JTM2MCpNYXRoLlBJLzE4MH1mdW5jdGlvbiBOKHQsZSxuKXtpZih2b2lkIDA9PT1lJiYoZT0ia2lsb21ldGVycyIpLHZvaWQgMD09PW4mJihuPSJraWxvbWV0ZXJzIiksISh0Pj0wKSl0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIG0oeCh0LGUpLG4pfWZ1bmN0aW9uIFModCxlLG4pe2lmKHZvaWQgMD09PWUmJihlPSJtZXRlcnMiKSx2b2lkIDA9PT1uJiYobj0ia2lsb21ldGVycyIpLCEodD49MCkpdGhyb3cgbmV3IEVycm9yKCJhcmVhIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTt2YXIgcj1pW2VdO2lmKCFyKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBvcmlnaW5hbCB1bml0cyIpO3ZhciBvPWlbbl07aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZpbmFsIHVuaXRzIik7cmV0dXJuIHQvcipvfWZ1bmN0aW9uIEModCl7cmV0dXJuIWlzTmFOKHQpJiZudWxsIT09dCYmIUFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gUCh0KXtyZXR1cm4hIXQmJnQuY29uc3RydWN0b3I9PT1PYmplY3R9ZnVuY3Rpb24gTSh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImJib3ggaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBiZSBhbiBBcnJheSIpO2lmKDQhPT10Lmxlbmd0aCYmNiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiYmJveCBtdXN0IGJlIGFuIEFycmF5IG9mIDQgb3IgNiBudW1iZXJzIik7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighQyh0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBvbmx5IGNvbnRhaW4gbnVtYmVycyIpfSkpfWZ1bmN0aW9uIEwodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJpZCBpcyByZXF1aXJlZCIpO2lmKC0xPT09WyJzdHJpbmciLCJudW1iZXIiXS5pbmRleE9mKHR5cGVvZiB0KSl0aHJvdyBuZXcgRXJyb3IoImlkIG11c3QgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmciKX12YXIgTz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxlYXJ0aFJhZGl1czplLGZhY3RvcnM6bix1bml0c0ZhY3RvcnM6cixhcmVhRmFjdG9yczppLGZlYXR1cmU6byxnZW9tZXRyeTpzLHBvaW50OmEscG9pbnRzOnUscG9seWdvbjpsLHBvbHlnb25zOmMsbGluZVN0cmluZzpoLGxpbmVTdHJpbmdzOnAsZmVhdHVyZUNvbGxlY3Rpb246ZixtdWx0aUxpbmVTdHJpbmc6ZyxtdWx0aVBvaW50OmQsbXVsdGlQb2x5Z29uOnksZ2VvbWV0cnlDb2xsZWN0aW9uOnYscm91bmQ6XyxyYWRpYW5zVG9MZW5ndGg6bSxsZW5ndGhUb1JhZGlhbnM6eCxsZW5ndGhUb0RlZ3JlZXM6RSxiZWFyaW5nVG9BemltdXRoOmIscmFkaWFuc1RvRGVncmVlczp3LGRlZ3JlZXNUb1JhZGlhbnM6SSxjb252ZXJ0TGVuZ3RoOk4sY29udmVydEFyZWE6Uyxpc051bWJlcjpDLGlzT2JqZWN0OlAsdmFsaWRhdGVCQm94Ok0sdmFsaWRhdGVJZDpMfSk7ZnVuY3Rpb24gUih0LGUsbil7aWYobnVsbCE9PXQpZm9yKHZhciByLGksbyxzLGEsdSxsLGMsaD0wLHA9MCxmPXQudHlwZSxnPSJGZWF0dXJlQ29sbGVjdGlvbiI9PT1mLGQ9IkZlYXR1cmUiPT09Zix5PWc/dC5mZWF0dXJlcy5sZW5ndGg6MSx2PTA7djx5O3YrKyl7YT0oYz0hIShsPWc/dC5mZWF0dXJlc1t2XS5nZW9tZXRyeTpkP3QuZ2VvbWV0cnk6dCkmJiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09bC50eXBlKT9sLmdlb21ldHJpZXMubGVuZ3RoOjE7Zm9yKHZhciBfPTA7XzxhO18rKyl7dmFyIG09MCx4PTA7aWYobnVsbCE9PShzPWM/bC5nZW9tZXRyaWVzW19dOmwpKXt1PXMuY29vcmRpbmF0ZXM7dmFyIEU9cy50eXBlO3N3aXRjaChoPSFufHwiUG9seWdvbiIhPT1FJiYiTXVsdGlQb2x5Z29uIiE9PUU/MDoxLEUpe2Nhc2UgbnVsbDpicmVhaztjYXNlIlBvaW50IjppZighMT09PWUodSxwLHYsbSx4KSlyZXR1cm4hMTtwKyssbSsrO2JyZWFrO2Nhc2UiTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvaW50Ijpmb3Iocj0wO3I8dS5sZW5ndGg7cisrKXtpZighMT09PWUodVtyXSxwLHYsbSx4KSlyZXR1cm4hMTtwKyssIk11bHRpUG9pbnQiPT09RSYmbSsrfSJMaW5lU3RyaW5nIj09PUUmJm0rKzticmVhaztjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpmb3Iocj0wO3I8dS5sZW5ndGg7cisrKXtmb3IoaT0wO2k8dVtyXS5sZW5ndGgtaDtpKyspe2lmKCExPT09ZSh1W3JdW2ldLHAsdixtLHgpKXJldHVybiExO3ArK30iTXVsdGlMaW5lU3RyaW5nIj09PUUmJm0rKywiUG9seWdvbiI9PT1FJiZ4Kyt9IlBvbHlnb24iPT09RSYmbSsrO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpmb3Iocj0wO3I8dS5sZW5ndGg7cisrKXtmb3IoeD0wLGk9MDtpPHVbcl0ubGVuZ3RoO2krKyl7Zm9yKG89MDtvPHVbcl1baV0ubGVuZ3RoLWg7bysrKXtpZighMT09PWUodVtyXVtpXVtvXSxwLHYsbSx4KSlyZXR1cm4hMTtwKyt9eCsrfW0rK31icmVhaztjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6Zm9yKHI9MDtyPHMuZ2VvbWV0cmllcy5sZW5ndGg7cisrKWlmKCExPT09UihzLmdlb21ldHJpZXNbcl0sZSxuKSlyZXR1cm4hMTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBHZW9tZXRyeSBUeXBlIil9fX19fWZ1bmN0aW9uIFQodCxlLG4scil7dmFyIGk9bjtyZXR1cm4gUih0LChmdW5jdGlvbih0LHIsbyxzLGEpe2k9MD09PXImJnZvaWQgMD09PW4/dDplKGksdCxyLG8scyxhKX0pLHIpLGl9ZnVuY3Rpb24gQSh0LGUpe3ZhciBuO3N3aXRjaCh0LnR5cGUpe2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOmZvcihuPTA7bjx0LmZlYXR1cmVzLmxlbmd0aCYmITEhPT1lKHQuZmVhdHVyZXNbbl0ucHJvcGVydGllcyxuKTtuKyspO2JyZWFrO2Nhc2UiRmVhdHVyZSI6ZSh0LnByb3BlcnRpZXMsMCl9fWZ1bmN0aW9uIEQodCxlLG4pe3ZhciByPW47cmV0dXJuIEEodCwoZnVuY3Rpb24odCxpKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSl9KSkscn1mdW5jdGlvbiBGKHQsZSl7aWYoIkZlYXR1cmUiPT09dC50eXBlKWUodCwwKTtlbHNlIGlmKCJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGUpZm9yKHZhciBuPTA7bjx0LmZlYXR1cmVzLmxlbmd0aCYmITEhPT1lKHQuZmVhdHVyZXNbbl0sbik7bisrKTt9ZnVuY3Rpb24gayh0LGUsbil7dmFyIHI9bjtyZXR1cm4gRih0LChmdW5jdGlvbih0LGkpe3I9MD09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxpKX0pKSxyfWZ1bmN0aW9uIEcodCl7dmFyIGU9W107cmV0dXJuIFIodCwoZnVuY3Rpb24odCl7ZS5wdXNoKHQpfSkpLGV9ZnVuY3Rpb24gcSh0LGUpe3ZhciBuLHIsaSxvLHMsYSx1LGwsYyxoLHA9MCxmPSJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGUsZz0iRmVhdHVyZSI9PT10LnR5cGUsZD1mP3QuZmVhdHVyZXMubGVuZ3RoOjE7Zm9yKG49MDtuPGQ7bisrKXtmb3IoYT1mP3QuZmVhdHVyZXNbbl0uZ2VvbWV0cnk6Zz90Lmdlb21ldHJ5OnQsbD1mP3QuZmVhdHVyZXNbbl0ucHJvcGVydGllczpnP3QucHJvcGVydGllczp7fSxjPWY/dC5mZWF0dXJlc1tuXS5iYm94Omc/dC5iYm94OnZvaWQgMCxoPWY/dC5mZWF0dXJlc1tuXS5pZDpnP3QuaWQ6dm9pZCAwLHM9KHU9ISFhJiYiR2VvbWV0cnlDb2xsZWN0aW9uIj09PWEudHlwZSk/YS5nZW9tZXRyaWVzLmxlbmd0aDoxLGk9MDtpPHM7aSsrKWlmKG51bGwhPT0obz11P2EuZ2VvbWV0cmllc1tpXTphKSlzd2l0Y2goby50eXBlKXtjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2ludCI6Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvbHlnb24iOmlmKCExPT09ZShvLHAsbCxjLGgpKXJldHVybiExO2JyZWFrO2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpmb3Iocj0wO3I8by5nZW9tZXRyaWVzLmxlbmd0aDtyKyspaWYoITE9PT1lKG8uZ2VvbWV0cmllc1tyXSxwLGwsYyxoKSlyZXR1cm4hMTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBHZW9tZXRyeSBUeXBlIil9ZWxzZSBpZighMT09PWUobnVsbCxwLGwsYyxoKSlyZXR1cm4hMTtwKyt9fWZ1bmN0aW9uIEIodCxlLG4pe3ZhciByPW47cmV0dXJuIHEodCwoZnVuY3Rpb24odCxpLG8scyxhKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSxvLHMsYSl9KSkscn1mdW5jdGlvbiB6KHQsZSl7cSh0LChmdW5jdGlvbih0LG4scixpLHMpe3ZhciBhLHU9bnVsbD09PXQ/bnVsbDp0LnR5cGU7c3dpdGNoKHUpe2Nhc2UgbnVsbDpjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6cmV0dXJuITEhPT1lKG8odCxyLHtiYm94OmksaWQ6c30pLG4sMCkmJnZvaWQgMH1zd2l0Y2godSl7Y2FzZSJNdWx0aVBvaW50IjphPSJQb2ludCI7YnJlYWs7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOmE9IkxpbmVTdHJpbmciO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjphPSJQb2x5Z29uIn1mb3IodmFyIGw9MDtsPHQuY29vcmRpbmF0ZXMubGVuZ3RoO2wrKyl7dmFyIGM9dC5jb29yZGluYXRlc1tsXTtpZighMT09PWUobyh7dHlwZTphLGNvb3JkaW5hdGVzOmN9LHIpLG4sbCkpcmV0dXJuITF9fSkpfWZ1bmN0aW9uIGoodCxlLG4pe3ZhciByPW47cmV0dXJuIHoodCwoZnVuY3Rpb24odCxpLG8pe3I9MD09PWkmJjA9PT1vJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSxvKX0pKSxyfWZ1bmN0aW9uIFUodCxlKXt6KHQsKGZ1bmN0aW9uKHQsbixyKXt2YXIgaT0wO2lmKHQuZ2VvbWV0cnkpe3ZhciBvPXQuZ2VvbWV0cnkudHlwZTtpZigiUG9pbnQiIT09byYmIk11bHRpUG9pbnQiIT09byl7dmFyIHMsYT0wLHU9MCxsPTA7cmV0dXJuITEhPT1SKHQsKGZ1bmN0aW9uKG8sYyxwLGYsZyl7aWYodm9pZCAwPT09c3x8bj5hfHxmPnV8fGc+bClyZXR1cm4gcz1vLGE9bix1PWYsbD1nLHZvaWQoaT0wKTt2YXIgZD1oKFtzLG9dLHQucHJvcGVydGllcyk7aWYoITE9PT1lKGQsbixyLGcsaSkpcmV0dXJuITE7aSsrLHM9b30pKSYmdm9pZCAwfX19KSl9ZnVuY3Rpb24gVih0LGUsbil7dmFyIHI9bixpPSExO3JldHVybiBVKHQsKGZ1bmN0aW9uKHQsbyxzLGEsdSl7cj0hMT09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxvLHMsYSx1KSxpPSEwfSkpLHJ9ZnVuY3Rpb24gWCh0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO3oodCwoZnVuY3Rpb24odCxuLHIpe2lmKG51bGwhPT10Lmdlb21ldHJ5KXt2YXIgaT10Lmdlb21ldHJ5LnR5cGUsbz10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzO3N3aXRjaChpKXtjYXNlIkxpbmVTdHJpbmciOmlmKCExPT09ZSh0LG4sciwwLDApKXJldHVybiExO2JyZWFrO2Nhc2UiUG9seWdvbiI6Zm9yKHZhciBzPTA7czxvLmxlbmd0aDtzKyspaWYoITE9PT1lKGgob1tzXSx0LnByb3BlcnRpZXMpLG4scixzKSlyZXR1cm4hMX19fSkpfWZ1bmN0aW9uIFkodCxlLG4pe3ZhciByPW47cmV0dXJuIFgodCwoZnVuY3Rpb24odCxpLG8scyl7cj0wPT09aSYmdm9pZCAwPT09bj90OmUocix0LGksbyxzKX0pKSxyfWZ1bmN0aW9uIEgodCxlKXtpZighUChlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuLHI9ZS5mZWF0dXJlSW5kZXh8fDAsaT1lLm11bHRpRmVhdHVyZUluZGV4fHwwLG89ZS5nZW9tZXRyeUluZGV4fHwwLHM9ZS5zZWdtZW50SW5kZXh8fDAsYT1lLnByb3BlcnRpZXM7c3dpdGNoKHQudHlwZSl7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6cjwwJiYocj10LmZlYXR1cmVzLmxlbmd0aCtyKSxhPWF8fHQuZmVhdHVyZXNbcl0ucHJvcGVydGllcyxuPXQuZmVhdHVyZXNbcl0uZ2VvbWV0cnk7YnJlYWs7Y2FzZSJGZWF0dXJlIjphPWF8fHQucHJvcGVydGllcyxuPXQuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJQb2ludCI6Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gbnVsbDtjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aUxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2x5Z29uIjpuPXQ7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgaW52YWxpZCIpfWlmKG51bGw9PT1uKXJldHVybiBudWxsO3ZhciB1PW4uY29vcmRpbmF0ZXM7c3dpdGNoKG4udHlwZSl7Y2FzZSJQb2ludCI6Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gbnVsbDtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBzPDAmJihzPXUubGVuZ3RoK3MtMSksaChbdVtzXSx1W3MrMV1dLGEsZSk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gbzwwJiYobz11Lmxlbmd0aCtvKSxzPDAmJihzPXVbb10ubGVuZ3RoK3MtMSksaChbdVtvXVtzXSx1W29dW3MrMV1dLGEsZSk7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiBpPDAmJihpPXUubGVuZ3RoK2kpLHM8MCYmKHM9dVtpXS5sZW5ndGgrcy0xKSxoKFt1W2ldW3NdLHVbaV1bcysxXV0sYSxlKTtjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIGk8MCYmKGk9dS5sZW5ndGgraSksbzwwJiYobz11W2ldLmxlbmd0aCtvKSxzPDAmJihzPXVbaV1bb10ubGVuZ3RoLXMtMSksaChbdVtpXVtvXVtzXSx1W2ldW29dW3MrMV1dLGEsZSl9dGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIGludmFsaWQiKX1mdW5jdGlvbiBXKHQsZSl7aWYoIVAoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbixyPWUuZmVhdHVyZUluZGV4fHwwLGk9ZS5tdWx0aUZlYXR1cmVJbmRleHx8MCxvPWUuZ2VvbWV0cnlJbmRleHx8MCxzPWUuY29vcmRJbmRleHx8MCx1PWUucHJvcGVydGllcztzd2l0Y2godC50eXBlKXtjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpyPDAmJihyPXQuZmVhdHVyZXMubGVuZ3RoK3IpLHU9dXx8dC5mZWF0dXJlc1tyXS5wcm9wZXJ0aWVzLG49dC5mZWF0dXJlc1tyXS5nZW9tZXRyeTticmVhaztjYXNlIkZlYXR1cmUiOnU9dXx8dC5wcm9wZXJ0aWVzLG49dC5nZW9tZXRyeTticmVhaztjYXNlIlBvaW50IjpjYXNlIk11bHRpUG9pbnQiOnJldHVybiBudWxsO2Nhc2UiTGluZVN0cmluZyI6Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvbHlnb24iOm49dDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyBpbnZhbGlkIil9aWYobnVsbD09PW4pcmV0dXJuIG51bGw7dmFyIGw9bi5jb29yZGluYXRlcztzd2l0Y2gobi50eXBlKXtjYXNlIlBvaW50IjpyZXR1cm4gYShsLHUsZSk7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gaTwwJiYoaT1sLmxlbmd0aCtpKSxhKGxbaV0sdSxlKTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBzPDAmJihzPWwubGVuZ3RoK3MpLGEobFtzXSx1LGUpO2Nhc2UiUG9seWdvbiI6cmV0dXJuIG88MCYmKG89bC5sZW5ndGgrbyksczwwJiYocz1sW29dLmxlbmd0aCtzKSxhKGxbb11bc10sdSxlKTtjYXNlIk11bHRpTGluZVN0cmluZyI6cmV0dXJuIGk8MCYmKGk9bC5sZW5ndGgraSksczwwJiYocz1sW2ldLmxlbmd0aCtzKSxhKGxbaV1bc10sdSxlKTtjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIGk8MCYmKGk9bC5sZW5ndGgraSksbzwwJiYobz1sW2ldLmxlbmd0aCtvKSxzPDAmJihzPWxbaV1bb10ubGVuZ3RoLXMpLGEobFtpXVtvXVtzXSx1LGUpfXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyBpbnZhbGlkIil9dmFyIEo9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY29vcmRBbGw6Ryxjb29yZEVhY2g6Uixjb29yZFJlZHVjZTpULGZlYXR1cmVFYWNoOkYsZmVhdHVyZVJlZHVjZTprLGZpbmRQb2ludDpXLGZpbmRTZWdtZW50OkgsZmxhdHRlbkVhY2g6eixmbGF0dGVuUmVkdWNlOmosZ2VvbUVhY2g6cSxnZW9tUmVkdWNlOkIsbGluZUVhY2g6WCxsaW5lUmVkdWNlOlkscHJvcEVhY2g6QSxwcm9wUmVkdWNlOkQsc2VnbWVudEVhY2g6VSxzZWdtZW50UmVkdWNlOlZ9KTtmdW5jdGlvbiBaKHQpe3ZhciBlPVsxLzAsMS8wLC0xLzAsLTEvMF07cmV0dXJuIFIodCwoZnVuY3Rpb24odCl7ZVswXT50WzBdJiYoZVswXT10WzBdKSxlWzFdPnRbMV0mJihlWzFdPXRbMV0pLGVbMl08dFswXSYmKGVbMl09dFswXSksZVszXTx0WzFdJiYoZVszXT10WzFdKX0pKSxlfWZ1bmN0aW9uIEsodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZCBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXtpZigiRmVhdHVyZSI9PT10LnR5cGUmJm51bGwhPT10Lmdlb21ldHJ5JiYiUG9pbnQiPT09dC5nZW9tZXRyeS50eXBlKXJldHVybiB0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzO2lmKCJQb2ludCI9PT10LnR5cGUpcmV0dXJuIHQuY29vcmRpbmF0ZXN9aWYoQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+PTImJiFBcnJheS5pc0FycmF5KHRbMF0pJiYhQXJyYXkuaXNBcnJheSh0WzFdKSlyZXR1cm4gdDt0aHJvdyBuZXcgRXJyb3IoImNvb3JkIG11c3QgYmUgR2VvSlNPTiBQb2ludCBvciBhbiBBcnJheSBvZiBudW1iZXJzIil9ZnVuY3Rpb24gUSh0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0O2lmKCJGZWF0dXJlIj09PXQudHlwZSl7aWYobnVsbCE9PXQuZ2VvbWV0cnkpcmV0dXJuIHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXN9ZWxzZSBpZih0LmNvb3JkaW5hdGVzKXJldHVybiB0LmNvb3JkaW5hdGVzO3Rocm93IG5ldyBFcnJvcigiY29vcmRzIG11c3QgYmUgR2VvSlNPTiBGZWF0dXJlLCBHZW9tZXRyeSBPYmplY3Qgb3IgYW4gQXJyYXkiKX1mdW5jdGlvbiAkKHQpe2lmKHQubGVuZ3RoPjEmJkModFswXSkmJkModFsxXSkpcmV0dXJuITA7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSYmdFswXS5sZW5ndGgpcmV0dXJuICQodFswXSk7dGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IG9ubHkgY29udGFpbiBudW1iZXJzIil9ZnVuY3Rpb24gdHQodCxlLG4pe2lmKCFlfHwhbil0aHJvdyBuZXcgRXJyb3IoInR5cGUgYW5kIG5hbWUgcmVxdWlyZWQiKTtpZighdHx8dC50eXBlIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyI6IG11c3QgYmUgYSAiK2UrIiwgZ2l2ZW4gIit0LnR5cGUpfWZ1bmN0aW9uIGV0KHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIk5vIGZlYXR1cmUgcGFzc2VkIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCIuZmVhdHVyZU9mKCkgcmVxdWlyZXMgYSBuYW1lIik7aWYoIXR8fCJGZWF0dXJlIiE9PXQudHlwZXx8IXQuZ2VvbWV0cnkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiLCBGZWF0dXJlIHdpdGggZ2VvbWV0cnkgcmVxdWlyZWQiKTtpZighdC5nZW9tZXRyeXx8dC5nZW9tZXRyeS50eXBlIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyI6IG11c3QgYmUgYSAiK2UrIiwgZ2l2ZW4gIit0Lmdlb21ldHJ5LnR5cGUpfWZ1bmN0aW9uIG50KHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIk5vIGZlYXR1cmVDb2xsZWN0aW9uIHBhc3NlZCIpO2lmKCFuKXRocm93IG5ldyBFcnJvcigiLmNvbGxlY3Rpb25PZigpIHJlcXVpcmVzIGEgbmFtZSIpO2lmKCF0fHwiRmVhdHVyZUNvbGxlY3Rpb24iIT09dC50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byAiK24rIiwgRmVhdHVyZUNvbGxlY3Rpb24gcmVxdWlyZWQiKTtmb3IodmFyIHI9MCxpPXQuZmVhdHVyZXM7cjxpLmxlbmd0aDtyKyspe3ZhciBvPWlbcl07aWYoIW98fCJGZWF0dXJlIiE9PW8udHlwZXx8IW8uZ2VvbWV0cnkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiLCBGZWF0dXJlIHdpdGggZ2VvbWV0cnkgcmVxdWlyZWQiKTtpZighby5nZW9tZXRyeXx8by5nZW9tZXRyeS50eXBlIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyI6IG11c3QgYmUgYSAiK2UrIiwgZ2l2ZW4gIitvLmdlb21ldHJ5LnR5cGUpfX1mdW5jdGlvbiBydCh0KXtyZXR1cm4iRmVhdHVyZSI9PT10LnR5cGU/dC5nZW9tZXRyeTp0fWZ1bmN0aW9uIGl0KHQsZSl7cmV0dXJuIkZlYXR1cmVDb2xsZWN0aW9uIj09PXQudHlwZT8iRmVhdHVyZUNvbGxlY3Rpb24iOiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09dC50eXBlPyJHZW9tZXRyeUNvbGxlY3Rpb24iOiJGZWF0dXJlIj09PXQudHlwZSYmbnVsbCE9PXQuZ2VvbWV0cnk/dC5nZW9tZXRyeS50eXBlOnQudHlwZX1aLmRlZmF1bHQ9Wjt2YXIgb3Q9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0Q29vcmQ6SyxnZXRDb29yZHM6USxjb250YWluc051bWJlcjokLGdlb2pzb25UeXBlOnR0LGZlYXR1cmVPZjpldCxjb2xsZWN0aW9uT2Y6bnQsZ2V0R2VvbTpydCxnZXRUeXBlOml0fSksc3Q9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxhdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHV0PU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7Ci8qCiAgICBvYmplY3QtYXNzaWduCiAgICAoYykgU2luZHJlIFNvcmh1cwogICAgQGxpY2Vuc2UgTUlUCiAgICAqL2Z1bmN0aW9uIGx0KHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQiKTtyZXR1cm4gT2JqZWN0KHQpfXZhciBjdD1mdW5jdGlvbigpe3RyeXtpZighT2JqZWN0LmFzc2lnbilyZXR1cm4hMTt2YXIgdD1uZXcgU3RyaW5nKCJhYmMiKTtpZih0WzVdPSJkZSIsIjUiPT09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModClbMF0pcmV0dXJuITE7Zm9yKHZhciBlPXt9LG49MDtuPDEwO24rKyllWyJfIitTdHJpbmcuZnJvbUNoYXJDb2RlKG4pXT1uO2lmKCIwMTIzNDU2Nzg5IiE9PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19KSkuam9pbigiIikpcmV0dXJuITE7dmFyIHI9e307cmV0dXJuImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7clt0XT10fSkpLCJhYmNkZWZnaGlqa2xtbm9wcXJzdCI9PT1PYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LHIpKS5qb2luKCIiKX1jYXRjaCh0KXtyZXR1cm4hMX19KCk/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyLGk9bHQodCksbz0xO288YXJndW1lbnRzLmxlbmd0aDtvKyspe2Zvcih2YXIgcyBpbiBuPU9iamVjdChhcmd1bWVudHNbb10pKWF0LmNhbGwobixzKSYmKGlbc109bltzXSk7aWYoc3Qpe3I9c3Qobik7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspdXQuY2FsbChuLHJbYV0pJiYoaVtyW2FdXT1uW3JbYV1dKX19cmV0dXJuIGl9LGh0PXtzdWNjZXNzQ2FsbGJhY2s6bnVsbCx2ZXJib3NlOiExfSxwdD17fTsKLyoqCiAgICAgKiBAbGljZW5zZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTUgUm9ubnkgTG9yZW56IDxyb25ueUB0YmkudW5pdmllLmFjLmF0PgogICAgICogdi4gMS4yLjAKICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9SYXVtWmVpdC9NYXJjaGluZ1NxdWFyZXMuanMKICAgICAqCiAgICAgKiBNYXJjaGluZ1NxdWFyZXNKUyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICAgICoKICAgICAqIE1hcmNoaW5nU3F1YXJlc0pTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgICogR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgICAgKgogICAgICogQXMgYWRkaXRpb25hbCBwZXJtaXNzaW9uIHVuZGVyIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMKICAgICAqIHNlY3Rpb24gNywgdGhpcmQtcGFydHkgcHJvamVjdHMgKHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwpIG1heSBkaXN0cmlidXRlLAogICAgICogaW5jbHVkZSwgb3IgbGluayBhZ2FpbnN0IFVOTU9ESUZJRUQgVkVSU0lPTlMgb2YgTWFyY2hpbmdTcXVhcmVzSlMgd2l0aG91dCB0aGUKICAgICAqIHJlcXVpcmVtZW50IHRoYXQgc2FpZCB0aGlyZC1wYXJ0eSBwcm9qZWN0IGZvciB0aGF0IHJlYXNvbiBhbG9uZSBiZWNvbWVzCiAgICAgKiBzdWJqZWN0IHRvIGFueSByZXF1aXJlbWVudCBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMy4KICAgICAqIEFueSBtb2RpZmljYXRpb25zIHRvIE1hcmNoaW5nU3F1YXJlc0pTLCBob3dldmVyLCBtdXN0IGJlIHNoYXJlZCB3aXRoIHRoZSBwdWJsaWMKICAgICAqIGFuZCBtYWRlIGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBJbiBzdW1tYXJ5IHRoaXM6CiAgICAgKiAtIGFsbG93cyB5b3UgdG8gdXNlIE1hcmNoaW5nU3F1YXJlc0pTIGF0IG5vIGNvc3QKICAgICAqIC0gYWxsb3dzIHlvdSB0byB1c2UgTWFyY2hpbmdTcXVhcmVzSlMgZm9yIGJvdGggcGVyc29uYWwgYW5kIGNvbW1lcmNpYWwgcHVycG9zZXMKICAgICAqIC0gYWxsb3dzIHlvdSB0byBkaXN0cmlidXRlIFVOTU9ESUZJRUQgVkVSU0lPTlMgb2YgTWFyY2hpbmdTcXVhcmVzSlMgdW5kZXIgYW55CiAgICAgKiAgIGxpY2Vuc2UgYXMgbG9uZyBhcyB0aGlzIGxpY2Vuc2Ugbm90aWNlIGlzIGluY2x1ZGVkCiAgICAgKiAtIGVuYWJsZXMgeW91IHRvIGtlZXAgdGhlIHNvdXJjZSBjb2RlIG9mIHlvdXIgcHJvZ3JhbSB0aGF0IHVzZXMgTWFyY2hpbmdTcXVhcmVzSlMKICAgICAqICAgdW5kaXNjbG9zZWQKICAgICAqIC0gZm9yY2VzIHlvdSB0byBzaGFyZSBhbnkgbW9kaWZpY2F0aW9ucyB5b3UgaGF2ZSBtYWRlIHRvIE1hcmNoaW5nU3F1YXJlc0pTLAogICAgICogICBlLmcuIGJ1Zy1maXhlcwogICAgICoKICAgICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgICogYWxvbmcgd2l0aCBNYXJjaGluZ1NxdWFyZXNKUy4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAgICAqL2Z1bmN0aW9uIGZ0KHQsZSxuKXtuPW58fHt9O2Zvcih2YXIgcj1PYmplY3Qua2V5cyhodCksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1yW2ldLHM9bltvXTtzPW51bGwhPXM/czpodFtvXSxwdFtvXT1zfXB0LnZlcmJvc2UmJmNvbnNvbGUubG9nKCJNYXJjaGluZ1NxdWFyZXNKUy1pc29Db250b3VyczogY29tcHV0aW5nIGlzb2NvbnRvdXIgZm9yICIrZSk7dmFyIGE9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj0wLHI9MWUtNztyZXR1cm4gdC5jZWxscy5mb3JFYWNoKChmdW5jdGlvbihpLG8pe2kuZm9yRWFjaCgoZnVuY3Rpb24oaSxzKXtpZih2b2lkIDAhPT1pJiYoNSE9PShmPWkpLmN2YWwmJjEwIT09Zi5jdmFsKSYmIWR0KGkpKXt2YXIgYT1mdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvPXQubGVuZ3RoLHM9W10sYT1bMCwwLDEsMSwwLDAsMCwwLC0xLDAsMSwxLC0xLDAsLTEsMF0sdT1bMCwtMSwwLDAsMSwxLDEsMSwwLC0xLDAsMCwwLC0xLDAsMF0sbD1bIm5vbmUiLCJsZWZ0IiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwibm9uZSIsImJvdHRvbSIsImxlZnQiLCJ0b3AiLCJ0b3AiLCJub25lIiwidG9wIiwicmlnaHQiLCJyaWdodCIsImJvdHRvbSIsIm5vbmUiXSxjPVsibm9uZSIsImJvdHRvbSIsInJpZ2h0IiwicmlnaHQiLCJ0b3AiLCJ0b3AiLCJ0b3AiLCJ0b3AiLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiLCJyaWdodCIsImxlZnQiLCJib3R0b20iLCJsZWZ0Iiwibm9uZSJdLGg9dFtlXVtuXSxwPWguY3ZhbCxmPWxbcF0sZz12dChoLGYpO3MucHVzaChbbitnWzBdLGUrZ1sxXV0pLGY9Y1twXSxnPXZ0KGgsZikscy5wdXNoKFtuK2dbMF0sZStnWzFdXSkseXQoaCk7dmFyIGQ9bithW3BdLHk9ZSt1W3BdLHY9cDtmb3IoO2Q+PTAmJnk+PTAmJnk8byYmKGQhPW58fHkhPWUpJiZ2b2lkIDAhPT0oaD10W3ldW2RdKTspe2lmKDA9PT0ocD1oLmN2YWwpfHwxNT09PXApcmV0dXJue3BhdGg6cyxpbmZvOiJtZXJnZWFibGUifTtmPWNbcF0scj1hW3BdLGk9dVtwXSw1IT09cCYmMTAhPT1wfHwoNT09PXA/aC5mbGlwcGVkPy0xPT09dVt2XT8oZj0ibGVmdCIscj0tMSxpPTApOihmPSJyaWdodCIscj0xLGk9MCk6LTE9PT1hW3ZdJiYoZj0iYm90dG9tIixyPTAsaT0tMSk6MTA9PT1wJiYoaC5mbGlwcGVkPy0xPT09YVt2XT8oZj0idG9wIixyPTAsaT0xKTooZj0iYm90dG9tIixyPTAsaT0tMSk6MT09PXVbdl0mJihmPSJsZWZ0IixyPS0xLGk9MCkpKSxnPXZ0KGgsZikscy5wdXNoKFtkK2dbMF0seStnWzFdXSkseXQoaCksZCs9cix5Kz1pLHY9cH1yZXR1cm57cGF0aDpzLGluZm86ImNsb3NlZCJ9fSh0LmNlbGxzLG8scyksdT0hMTtpZigibWVyZ2VhYmxlIj09PWEuaW5mbylmb3IodmFyIGw9YS5wYXRoW2EucGF0aC5sZW5ndGgtMV1bMF0sYz1hLnBhdGhbYS5wYXRoLmxlbmd0aC0xXVsxXSxoPW4tMTtoPj0wO2gtLSlpZihNYXRoLmFicyhlW2hdWzBdWzBdLWwpPD1yJiZNYXRoLmFicyhlW2hdWzBdWzFdLWMpPD1yKXtmb3IodmFyIHA9YS5wYXRoLmxlbmd0aC0yO3A+PTA7LS1wKWVbaF0udW5zaGlmdChhLnBhdGhbcF0pO3U9ITA7YnJlYWt9dXx8KGVbbisrXT1hLnBhdGgpfXZhciBmfSkpfSkpLGV9KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoLTEscj10WzBdLmxlbmd0aC0xLGk9e3Jvd3M6bixjb2xzOnIsY2VsbHM6W119LG89MDtvPG47KytvKXtpLmNlbGxzW29dPVtdO2Zvcih2YXIgcz0wO3M8cjsrK3Mpe3ZhciBhPTAsdT10W28rMV1bc10sbD10W28rMV1bcysxXSxjPXRbb11bcysxXSxoPXRbb11bc107aWYoIShpc05hTih1KXx8aXNOYU4obCl8fGlzTmFOKGMpfHxpc05hTihoKSkpe2F8PXU+PWU/ODowLGF8PWw+PWU/NDowLGF8PWM+PWU/MjowO3ZhciBwLGYsZyxkLHk9ITE7aWYoNT09PShhfD1oPj1lPzE6MCl8fDEwPT09YSl7dmFyIHY9KHUrbCtjK2gpLzQ7NT09PWEmJnY8ZT8oYT0xMCx5PSEwKToxMD09PWEmJnY8ZSYmKGE9NSx5PSEwKX1pZigwIT09YSYmMTUhPT1hKXA9Zj1nPWQ9LjUsMT09PWE/KGc9MS1ndChlLHUsaCksZj0xLWd0KGUsYyxoKSk6Mj09PWE/KGY9Z3QoZSxoLGMpLGQ9MS1ndChlLGwsYykpOjM9PT1hPyhnPTEtZ3QoZSx1LGgpLGQ9MS1ndChlLGwsYykpOjQ9PT1hPyhwPWd0KGUsdSxsKSxkPWd0KGUsYyxsKSk6NT09PWE/KHA9Z3QoZSx1LGwpLGQ9Z3QoZSxjLGwpLGY9MS1ndChlLGMsaCksZz0xLWd0KGUsdSxoKSk6Nj09PWE/KGY9Z3QoZSxoLGMpLHA9Z3QoZSx1LGwpKTo3PT09YT8oZz0xLWd0KGUsdSxoKSxwPWd0KGUsdSxsKSk6OD09PWE/KGc9Z3QoZSxoLHUpLHA9MS1ndChlLGwsdSkpOjk9PT1hPyhmPTEtZ3QoZSxjLGgpLHA9MS1ndChlLGwsdSkpOjEwPT09YT8ocD0xLWd0KGUsbCx1KSxkPTEtZ3QoZSxsLGMpLGY9Z3QoZSxoLGMpLGc9Z3QoZSxoLHUpKToxMT09PWE/KHA9MS1ndChlLGwsdSksZD0xLWd0KGUsbCxjKSk6MTI9PT1hPyhnPWd0KGUsaCx1KSxkPWd0KGUsYyxsKSk6MTM9PT1hPyhmPTEtZ3QoZSxjLGgpLGQ9Z3QoZSxjLGwpKToxND09PWE/KGc9Z3QoZSxoLHUpLGY9Z3QoZSxoLGMpKTpjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQ29udG91cnM6IElsbGVnYWwgY3ZhbCBkZXRlY3RlZDogIithKSxpLmNlbGxzW29dW3NdPXtjdmFsOmEsZmxpcHBlZDp5LHRvcDpwLHJpZ2h0OmQsYm90dG9tOmYsbGVmdDpnfX19fXJldHVybiBpfSh0LGUpKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgcHQuc3VjY2Vzc0NhbGxiYWNrJiZwdC5zdWNjZXNzQ2FsbGJhY2soYSksYX1mdW5jdGlvbiBndCh0LGUsbil7cmV0dXJuKHQtZSkvKG4tZSl9ZnVuY3Rpb24gZHQodCl7cmV0dXJuIDA9PT10LmN2YWx8fDE1PT09dC5jdmFsfWZ1bmN0aW9uIHl0KHQpe2R0KHQpfHw1PT09dC5jdmFsfHwxMD09PXQuY3ZhbHx8KHQuY3ZhbD0xNSl9ZnVuY3Rpb24gdnQodCxlKXtyZXR1cm4idG9wIj09PWU/W3QudG9wLDFdOiJib3R0b20iPT09ZT9bdC5ib3R0b20sMF06InJpZ2h0Ij09PWU/WzEsdC5yaWdodF06ImxlZnQiPT09ZT9bMCx0LmxlZnRdOnZvaWQgMH1mdW5jdGlvbiBfdCh0LGUpe2lmKCFQKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS56UHJvcGVydHl8fCJlbGV2YXRpb24iLHI9ZS5mbGlwLGk9ZS5mbGFncztudCh0LCJQb2ludCIsImlucHV0IG11c3QgY29udGFpbiBQb2ludHMiKTtmb3IodmFyIG89ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtyZXR1cm4gRih0LChmdW5jdGlvbih0KXt2YXIgZT1RKHQpWzFdO25bZV18fChuW2VdPVtdKSxuW2VdLnB1c2godCl9KSksT2JqZWN0LmtleXMobikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gblt0XS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBRKHQpWzBdLVEoZSlbMF19KSl9KSkuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZT9RKHRbMF0pWzFdLVEoblswXSlbMV06UShuWzBdKVsxXS1RKHRbMF0pWzFdfSkpfSh0LHIpLHM9W10sYT0wO2E8by5sZW5ndGg7YSsrKXtmb3IodmFyIHU9b1thXSxsPVtdLGM9MDtjPHUubGVuZ3RoO2MrKyl7dmFyIGg9dVtjXTtoLnByb3BlcnRpZXNbbl0/bC5wdXNoKGgucHJvcGVydGllc1tuXSk6bC5wdXNoKDApLCEwPT09aSYmKGgucHJvcGVydGllcy5tYXRyaXhQb3NpdGlvbj1bYSxjXSl9cy5wdXNoKGwpfXJldHVybiBzfXZhciBtdD1FdCx4dD1FdDtmdW5jdGlvbiBFdCh0LGUsbixyLGkpe2J0KHQsZSxufHwwLHJ8fHQubGVuZ3RoLTEsaXx8SXQpfWZ1bmN0aW9uIGJ0KHQsZSxuLHIsaSl7Zm9yKDtyPm47KXtpZihyLW4+NjAwKXt2YXIgbz1yLW4rMSxzPWUtbisxLGE9TWF0aC5sb2cobyksdT0uNSpNYXRoLmV4cCgyKmEvMyksbD0uNSpNYXRoLnNxcnQoYSp1KihvLXUpL28pKihzLW8vMjwwPy0xOjEpO2J0KHQsZSxNYXRoLm1heChuLE1hdGguZmxvb3IoZS1zKnUvbytsKSksTWF0aC5taW4ocixNYXRoLmZsb29yKGUrKG8tcykqdS9vK2wpKSxpKX12YXIgYz10W2VdLGg9bixwPXI7Zm9yKHd0KHQsbixlKSxpKHRbcl0sYyk+MCYmd3QodCxuLHIpO2g8cDspe2Zvcih3dCh0LGgscCksaCsrLHAtLTtpKHRbaF0sYyk8MDspaCsrO2Zvcig7aSh0W3BdLGMpPjA7KXAtLX0wPT09aSh0W25dLGMpP3d0KHQsbixwKTp3dCh0LCsrcCxyKSxwPD1lJiYobj1wKzEpLGU8PXAmJihyPXAtMSl9fWZ1bmN0aW9uIHd0KHQsZSxuKXt2YXIgcj10W2VdO3RbZV09dFtuXSx0W25dPXJ9ZnVuY3Rpb24gSXQodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9bXQuZGVmYXVsdD14dDt2YXIgTnQ9Q3QsU3Q9Q3Q7ZnVuY3Rpb24gQ3QodCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBDdCkpcmV0dXJuIG5ldyBDdCh0LGUpO3RoaXMuX21heEVudHJpZXM9TWF0aC5tYXgoNCx0fHw5KSx0aGlzLl9taW5FbnRyaWVzPU1hdGgubWF4KDIsTWF0aC5jZWlsKC40KnRoaXMuX21heEVudHJpZXMpKSxlJiZ0aGlzLl9pbml0Rm9ybWF0KGUpLHRoaXMuY2xlYXIoKX1mdW5jdGlvbiBQdCh0LGUsbil7aWYoIW4pcmV0dXJuIGUuaW5kZXhPZih0KTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKylpZihuKHQsZVtyXSkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gTXQodCxlKXtMdCh0LDAsdC5jaGlsZHJlbi5sZW5ndGgsZSx0KX1mdW5jdGlvbiBMdCh0LGUsbixyLGkpe2l8fChpPUd0KG51bGwpKSxpLm1pblg9MS8wLGkubWluWT0xLzAsaS5tYXhYPS0xLzAsaS5tYXhZPS0xLzA7Zm9yKHZhciBvLHM9ZTtzPG47cysrKW89dC5jaGlsZHJlbltzXSxPdChpLHQubGVhZj9yKG8pOm8pO3JldHVybiBpfWZ1bmN0aW9uIE90KHQsZSl7cmV0dXJuIHQubWluWD1NYXRoLm1pbih0Lm1pblgsZS5taW5YKSx0Lm1pblk9TWF0aC5taW4odC5taW5ZLGUubWluWSksdC5tYXhYPU1hdGgubWF4KHQubWF4WCxlLm1heFgpLHQubWF4WT1NYXRoLm1heCh0Lm1heFksZS5tYXhZKSx0fWZ1bmN0aW9uIFJ0KHQsZSl7cmV0dXJuIHQubWluWC1lLm1pblh9ZnVuY3Rpb24gVHQodCxlKXtyZXR1cm4gdC5taW5ZLWUubWluWX1mdW5jdGlvbiBBdCh0KXtyZXR1cm4odC5tYXhYLXQubWluWCkqKHQubWF4WS10Lm1pblkpfWZ1bmN0aW9uIER0KHQpe3JldHVybiB0Lm1heFgtdC5taW5YKyh0Lm1heFktdC5taW5ZKX1mdW5jdGlvbiBGdCh0LGUpe3JldHVybiB0Lm1pblg8PWUubWluWCYmdC5taW5ZPD1lLm1pblkmJmUubWF4WDw9dC5tYXhYJiZlLm1heFk8PXQubWF4WX1mdW5jdGlvbiBrdCh0LGUpe3JldHVybiBlLm1pblg8PXQubWF4WCYmZS5taW5ZPD10Lm1heFkmJmUubWF4WD49dC5taW5YJiZlLm1heFk+PXQubWluWX1mdW5jdGlvbiBHdCh0KXtyZXR1cm57Y2hpbGRyZW46dCxoZWlnaHQ6MSxsZWFmOiEwLG1pblg6MS8wLG1pblk6MS8wLG1heFg6LTEvMCxtYXhZOi0xLzB9fWZ1bmN0aW9uIHF0KHQsZSxuLHIsaSl7Zm9yKHZhciBvLHM9W2Usbl07cy5sZW5ndGg7KShuPXMucG9wKCkpLShlPXMucG9wKCkpPD1yfHwobz1lK01hdGguY2VpbCgobi1lKS9yLzIpKnIsbXQodCxvLGUsbixpKSxzLnB1c2goZSxvLG8sbikpfWZ1bmN0aW9uIEJ0KHQpe3ZhciBlPXtleHBvcnRzOnt9fTtyZXR1cm4gdChlLGUuZXhwb3J0cyksZS5leHBvcnRzfUN0LnByb3RvdHlwZT17YWxsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FsbCh0aGlzLmRhdGEsW10pfSxzZWFyY2g6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXRhLG49W10scj10aGlzLnRvQkJveDtpZigha3QodCxlKSlyZXR1cm4gbjtmb3IodmFyIGksbyxzLGEsdT1bXTtlOyl7Zm9yKGk9MCxvPWUuY2hpbGRyZW4ubGVuZ3RoO2k8bztpKyspcz1lLmNoaWxkcmVuW2ldLGt0KHQsYT1lLmxlYWY/cihzKTpzKSYmKGUubGVhZj9uLnB1c2gocyk6RnQodCxhKT90aGlzLl9hbGwocyxuKTp1LnB1c2gocykpO2U9dS5wb3AoKX1yZXR1cm4gbn0sY29sbGlkZXM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXRhLG49dGhpcy50b0JCb3g7aWYoIWt0KHQsZSkpcmV0dXJuITE7Zm9yKHZhciByLGksbyxzLGE9W107ZTspe2ZvcihyPTAsaT1lLmNoaWxkcmVuLmxlbmd0aDtyPGk7cisrKWlmKG89ZS5jaGlsZHJlbltyXSxrdCh0LHM9ZS5sZWFmP24obyk6bykpe2lmKGUubGVhZnx8RnQodCxzKSlyZXR1cm4hMDthLnB1c2gobyl9ZT1hLnBvcCgpfXJldHVybiExfSxsb2FkOmZ1bmN0aW9uKHQpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuIHRoaXM7aWYodC5sZW5ndGg8dGhpcy5fbWluRW50cmllcyl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuaW5zZXJ0KHRbZV0pO3JldHVybiB0aGlzfXZhciByPXRoaXMuX2J1aWxkKHQuc2xpY2UoKSwwLHQubGVuZ3RoLTEsMCk7aWYodGhpcy5kYXRhLmNoaWxkcmVuLmxlbmd0aClpZih0aGlzLmRhdGEuaGVpZ2h0PT09ci5oZWlnaHQpdGhpcy5fc3BsaXRSb290KHRoaXMuZGF0YSxyKTtlbHNle2lmKHRoaXMuZGF0YS5oZWlnaHQ8ci5oZWlnaHQpe3ZhciBpPXRoaXMuZGF0YTt0aGlzLmRhdGE9cixyPWl9dGhpcy5faW5zZXJ0KHIsdGhpcy5kYXRhLmhlaWdodC1yLmhlaWdodC0xLCEwKX1lbHNlIHRoaXMuZGF0YT1yO3JldHVybiB0aGlzfSxpbnNlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMuX2luc2VydCh0LHRoaXMuZGF0YS5oZWlnaHQtMSksdGhpc30sY2xlYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhPUd0KFtdKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gdGhpcztmb3IodmFyIG4scixpLG8scz10aGlzLmRhdGEsYT10aGlzLnRvQkJveCh0KSx1PVtdLGw9W107c3x8dS5sZW5ndGg7KXtpZihzfHwocz11LnBvcCgpLHI9dVt1Lmxlbmd0aC0xXSxuPWwucG9wKCksbz0hMCkscy5sZWFmJiYtMSE9PShpPVB0KHQscy5jaGlsZHJlbixlKSkpcmV0dXJuIHMuY2hpbGRyZW4uc3BsaWNlKGksMSksdS5wdXNoKHMpLHRoaXMuX2NvbmRlbnNlKHUpLHRoaXM7b3x8cy5sZWFmfHwhRnQocyxhKT9yPyhuKysscz1yLmNoaWxkcmVuW25dLG89ITEpOnM9bnVsbDoodS5wdXNoKHMpLGwucHVzaChuKSxuPTAscj1zLHM9cy5jaGlsZHJlblswXSl9cmV0dXJuIHRoaXN9LHRvQkJveDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sY29tcGFyZU1pblg6UnQsY29tcGFyZU1pblk6VHQsdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX0sZnJvbUpTT046ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YT10LHRoaXN9LF9hbGw6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W107dDspdC5sZWFmP2UucHVzaC5hcHBseShlLHQuY2hpbGRyZW4pOm4ucHVzaC5hcHBseShuLHQuY2hpbGRyZW4pLHQ9bi5wb3AoKTtyZXR1cm4gZX0sX2J1aWxkOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpLG89bi1lKzEscz10aGlzLl9tYXhFbnRyaWVzO2lmKG88PXMpcmV0dXJuIE10KGk9R3QodC5zbGljZShlLG4rMSkpLHRoaXMudG9CQm94KSxpO3J8fChyPU1hdGguY2VpbChNYXRoLmxvZyhvKS9NYXRoLmxvZyhzKSkscz1NYXRoLmNlaWwoby9NYXRoLnBvdyhzLHItMSkpKSwoaT1HdChbXSkpLmxlYWY9ITEsaS5oZWlnaHQ9cjt2YXIgYSx1LGwsYyxoPU1hdGguY2VpbChvL3MpLHA9aCpNYXRoLmNlaWwoTWF0aC5zcXJ0KHMpKTtmb3IocXQodCxlLG4scCx0aGlzLmNvbXBhcmVNaW5YKSxhPWU7YTw9bjthKz1wKWZvcihxdCh0LGEsbD1NYXRoLm1pbihhK3AtMSxuKSxoLHRoaXMuY29tcGFyZU1pblkpLHU9YTt1PD1sO3UrPWgpYz1NYXRoLm1pbih1K2gtMSxsKSxpLmNoaWxkcmVuLnB1c2godGhpcy5fYnVpbGQodCx1LGMsci0xKSk7cmV0dXJuIE10KGksdGhpcy50b0JCb3gpLGl9LF9jaG9vc2VTdWJ0cmVlOmZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaSxvLHMsYSx1LGwsYyxoLHAsZjtyLnB1c2goZSksIWUubGVhZiYmci5sZW5ndGgtMSE9PW47KXtmb3IoYz1oPTEvMCxpPTAsbz1lLmNoaWxkcmVuLmxlbmd0aDtpPG87aSsrKXU9QXQocz1lLmNoaWxkcmVuW2ldKSxwPXQsZj1zLChsPShNYXRoLm1heChmLm1heFgscC5tYXhYKS1NYXRoLm1pbihmLm1pblgscC5taW5YKSkqKE1hdGgubWF4KGYubWF4WSxwLm1heFkpLU1hdGgubWluKGYubWluWSxwLm1pblkpKS11KTxoPyhoPWwsYz11PGM/dTpjLGE9cyk6bD09PWgmJnU8YyYmKGM9dSxhPXMpO2U9YXx8ZS5jaGlsZHJlblswXX1yZXR1cm4gZX0sX2luc2VydDpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy50b0JCb3gsaT1uP3Q6cih0KSxvPVtdLHM9dGhpcy5fY2hvb3NlU3VidHJlZShpLHRoaXMuZGF0YSxlLG8pO2ZvcihzLmNoaWxkcmVuLnB1c2godCksT3QocyxpKTtlPj0wJiZvW2VdLmNoaWxkcmVuLmxlbmd0aD50aGlzLl9tYXhFbnRyaWVzOyl0aGlzLl9zcGxpdChvLGUpLGUtLTt0aGlzLl9hZGp1c3RQYXJlbnRCQm94ZXMoaSxvLGUpfSxfc3BsaXQ6ZnVuY3Rpb24odCxlKXt2YXIgbj10W2VdLHI9bi5jaGlsZHJlbi5sZW5ndGgsaT10aGlzLl9taW5FbnRyaWVzO3RoaXMuX2Nob29zZVNwbGl0QXhpcyhuLGkscik7dmFyIG89dGhpcy5fY2hvb3NlU3BsaXRJbmRleChuLGkscikscz1HdChuLmNoaWxkcmVuLnNwbGljZShvLG4uY2hpbGRyZW4ubGVuZ3RoLW8pKTtzLmhlaWdodD1uLmhlaWdodCxzLmxlYWY9bi5sZWFmLE10KG4sdGhpcy50b0JCb3gpLE10KHMsdGhpcy50b0JCb3gpLGU/dFtlLTFdLmNoaWxkcmVuLnB1c2gocyk6dGhpcy5fc3BsaXRSb290KG4scyl9LF9zcGxpdFJvb3Q6ZnVuY3Rpb24odCxlKXt0aGlzLmRhdGE9R3QoW3QsZV0pLHRoaXMuZGF0YS5oZWlnaHQ9dC5oZWlnaHQrMSx0aGlzLmRhdGEubGVhZj0hMSxNdCh0aGlzLmRhdGEsdGhpcy50b0JCb3gpfSxfY2hvb3NlU3BsaXRJbmRleDpmdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvLHMsYSx1LGwsYyxoLHAsZixnLGQseTtmb3IodT1sPTEvMCxyPWU7cjw9bi1lO3IrKylpPUx0KHQsMCxyLHRoaXMudG9CQm94KSxvPUx0KHQscixuLHRoaXMudG9CQm94KSxoPWkscD1vLGY9dm9pZCAwLGc9dm9pZCAwLGQ9dm9pZCAwLHk9dm9pZCAwLGY9TWF0aC5tYXgoaC5taW5YLHAubWluWCksZz1NYXRoLm1heChoLm1pblkscC5taW5ZKSxkPU1hdGgubWluKGgubWF4WCxwLm1heFgpLHk9TWF0aC5taW4oaC5tYXhZLHAubWF4WSkscz1NYXRoLm1heCgwLGQtZikqTWF0aC5tYXgoMCx5LWcpLGE9QXQoaSkrQXQobyksczx1Pyh1PXMsYz1yLGw9YTxsP2E6bCk6cz09PXUmJmE8bCYmKGw9YSxjPXIpO3JldHVybiBjfSxfY2hvb3NlU3BsaXRBeGlzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmxlYWY/dGhpcy5jb21wYXJlTWluWDpSdCxpPXQubGVhZj90aGlzLmNvbXBhcmVNaW5ZOlR0O3RoaXMuX2FsbERpc3RNYXJnaW4odCxlLG4scik8dGhpcy5fYWxsRGlzdE1hcmdpbih0LGUsbixpKSYmdC5jaGlsZHJlbi5zb3J0KHIpfSxfYWxsRGlzdE1hcmdpbjpmdW5jdGlvbih0LGUsbixyKXt0LmNoaWxkcmVuLnNvcnQocik7dmFyIGksbyxzPXRoaXMudG9CQm94LGE9THQodCwwLGUscyksdT1MdCh0LG4tZSxuLHMpLGw9RHQoYSkrRHQodSk7Zm9yKGk9ZTtpPG4tZTtpKyspbz10LmNoaWxkcmVuW2ldLE90KGEsdC5sZWFmP3Mobyk6byksbCs9RHQoYSk7Zm9yKGk9bi1lLTE7aT49ZTtpLS0pbz10LmNoaWxkcmVuW2ldLE90KHUsdC5sZWFmP3Mobyk6byksbCs9RHQodSk7cmV0dXJuIGx9LF9hZGp1c3RQYXJlbnRCQm94ZXM6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uO3I+PTA7ci0tKU90KGVbcl0sdCl9LF9jb25kZW5zZTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbj10Lmxlbmd0aC0xO24+PTA7bi0tKTA9PT10W25dLmNoaWxkcmVuLmxlbmd0aD9uPjA/KGU9dFtuLTFdLmNoaWxkcmVuKS5zcGxpY2UoZS5pbmRleE9mKHRbbl0pLDEpOnRoaXMuY2xlYXIoKTpNdCh0W25dLHRoaXMudG9CQm94KX0sX2luaXRGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9WyJyZXR1cm4gYSIsIiAtIGIiLCI7Il07dGhpcy5jb21wYXJlTWluWD1uZXcgRnVuY3Rpb24oImEiLCJiIixlLmpvaW4odFswXSkpLHRoaXMuY29tcGFyZU1pblk9bmV3IEZ1bmN0aW9uKCJhIiwiYiIsZS5qb2luKHRbMV0pKSx0aGlzLnRvQkJveD1uZXcgRnVuY3Rpb24oImEiLCJyZXR1cm4ge21pblg6IGEiK3RbMF0rIiwgbWluWTogYSIrdFsxXSsiLCBtYXhYOiBhIit0WzJdKyIsIG1heFk6IGEiK3RbM10rIn07Iil9fSxOdC5kZWZhdWx0PVN0O3ZhciB6dD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dCplLGk9anQqdCxvPWktKGktdCkscz10LW8sYT1qdCplLHU9YS0oYS1lKSxsPWUtdSxjPXMqbC0oci1vKnUtcyp1LW8qbCk7aWYobilyZXR1cm4gblswXT1jLG5bMV09cixuO3JldHVybltjLHJdfSxqdD0rKE1hdGgucG93KDIsMjcpKzEpO3ZhciBVdD1mdW5jdGlvbih0LGUpe3ZhciBuPTB8dC5sZW5ndGgscj0wfGUubGVuZ3RoO2lmKDE9PT1uJiYxPT09cilyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj10K2Uscj1uLXQsaT10LShuLXIpKyhlLXIpO2lmKGkpcmV0dXJuW2ksbl07cmV0dXJuW25dfSh0WzBdLGVbMF0pO3ZhciBpLG8scz1uZXcgQXJyYXkobityKSxhPTAsdT0wLGw9MCxjPU1hdGguYWJzLGg9dFt1XSxwPWMoaCksZj1lW2xdLGc9YyhmKTtwPGc/KG89aCwodSs9MSk8biYmKGg9dFt1XSxwPWMoaCkpKToobz1mLChsKz0xKTxyJiYoZj1lW2xdLGc9YyhmKSkpO3U8biYmcDxnfHxsPj1yPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0scD1jKGgpKSk6KGk9ZiwobCs9MSk8ciYmKGY9ZVtsXSxnPWMoZikpKTt2YXIgZCx5LHY9aStvLF89di1pLG09by1fLHg9bSxFPXY7Zm9yKDt1PG4mJmw8cjspcDxnPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0scD1jKGgpKSk6KGk9ZiwobCs9MSk8ciYmKGY9ZVtsXSxnPWMoZikpKSwobT0obz14KS0oXz0odj1pK28pLWkpKSYmKHNbYSsrXT1tKSx4PUUtKChkPUUrdiktKHk9ZC1FKSkrKHYteSksRT1kO2Zvcig7dTxuOykobT0obz14KS0oXz0odj0oaT1oKStvKS1pKSkmJihzW2ErK109bSkseD1FLSgoZD1FK3YpLSh5PWQtRSkpKyh2LXkpLEU9ZCwodSs9MSk8biYmKGg9dFt1XSk7Zm9yKDtsPHI7KShtPShvPXgpLShfPSh2PShpPWYpK28pLWkpKSYmKHNbYSsrXT1tKSx4PUUtKChkPUUrdiktKHk9ZC1FKSkrKHYteSksRT1kLChsKz0xKTxyJiYoZj1lW2xdKTt4JiYoc1thKytdPXgpO0UmJihzW2ErK109RSk7YXx8KHNbYSsrXT0wKTtyZXR1cm4gcy5sZW5ndGg9YSxzfTt2YXIgVnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQrZSxpPXItdCxvPWUtaSxzPXQtKHItaSk7aWYobilyZXR1cm4gblswXT1zK28sblsxXT1yLG47cmV0dXJuW3MrbyxyXX07dmFyIFh0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5sZW5ndGg7aWYoMT09PW4pe3ZhciByPXp0KHRbMF0sZSk7cmV0dXJuIHJbMF0/cjpbclsxXV19dmFyIGk9bmV3IEFycmF5KDIqbiksbz1bLjEsLjFdLHM9Wy4xLC4xXSxhPTA7enQodFswXSxlLG8pLG9bMF0mJihpW2ErK109b1swXSk7Zm9yKHZhciB1PTE7dTxuOysrdSl7enQodFt1XSxlLHMpO3ZhciBsPW9bMV07VnQobCxzWzBdLG8pLG9bMF0mJihpW2ErK109b1swXSk7dmFyIGM9c1sxXSxoPW9bMV0scD1jK2gsZj1oLShwLWMpO29bMV09cCxmJiYoaVthKytdPWYpfW9bMV0mJihpW2ErK109b1sxXSk7MD09PWEmJihpW2ErK109MCk7cmV0dXJuIGkubGVuZ3RoPWEsaX07dmFyIFl0PWZ1bmN0aW9uKHQsZSl7dmFyIG49MHx0Lmxlbmd0aCxyPTB8ZS5sZW5ndGg7aWYoMT09PW4mJjE9PT1yKXJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPXQrZSxyPW4tdCxpPXQtKG4tcikrKGUtcik7aWYoaSlyZXR1cm5baSxuXTtyZXR1cm5bbl19KHRbMF0sLWVbMF0pO3ZhciBpLG8scz1uZXcgQXJyYXkobityKSxhPTAsdT0wLGw9MCxjPU1hdGguYWJzLGg9dFt1XSxwPWMoaCksZj0tZVtsXSxnPWMoZik7cDxnPyhvPWgsKHUrPTEpPG4mJihoPXRbdV0scD1jKGgpKSk6KG89ZiwobCs9MSk8ciYmKGY9LWVbbF0sZz1jKGYpKSk7dTxuJiZwPGd8fGw+PXI/KGk9aCwodSs9MSk8biYmKGg9dFt1XSxwPWMoaCkpKTooaT1mLChsKz0xKTxyJiYoZj0tZVtsXSxnPWMoZikpKTt2YXIgZCx5LHY9aStvLF89di1pLG09by1fLHg9bSxFPXY7Zm9yKDt1PG4mJmw8cjspcDxnPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0scD1jKGgpKSk6KGk9ZiwobCs9MSk8ciYmKGY9LWVbbF0sZz1jKGYpKSksKG09KG89eCktKF89KHY9aStvKS1pKSkmJihzW2ErK109bSkseD1FLSgoZD1FK3YpLSh5PWQtRSkpKyh2LXkpLEU9ZDtmb3IoO3U8bjspKG09KG89eCktKF89KHY9KGk9aCkrbyktaSkpJiYoc1thKytdPW0pLHg9RS0oKGQ9RSt2KS0oeT1kLUUpKSsodi15KSxFPWQsKHUrPTEpPG4mJihoPXRbdV0pO2Zvcig7bDxyOykobT0obz14KS0oXz0odj0oaT1mKStvKS1pKSkmJihzW2ErK109bSkseD1FLSgoZD1FK3YpLSh5PWQtRSkpKyh2LXkpLEU9ZCwobCs9MSk8ciYmKGY9LWVbbF0pO3gmJihzW2ErK109eCk7RSYmKHNbYSsrXT1FKTthfHwoc1thKytdPTApO3JldHVybiBzLmxlbmd0aD1hLHN9O3ZhciBIdD1CdCgoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUpe2Zvcih2YXIgbj1uZXcgQXJyYXkodC5sZW5ndGgtMSkscj0xO3I8dC5sZW5ndGg7KytyKWZvcih2YXIgaT1uW3ItMV09bmV3IEFycmF5KHQubGVuZ3RoLTEpLG89MCxzPTA7bzx0Lmxlbmd0aDsrK28pbyE9PWUmJihpW3MrK109dFtyXVtvXSk7cmV0dXJuIG59ZnVuY3Rpb24gbih0KXtpZigxPT09dC5sZW5ndGgpcmV0dXJuIHRbMF07aWYoMj09PXQubGVuZ3RoKXJldHVyblsic3VtKCIsdFswXSwiLCIsdFsxXSwiKSJdLmpvaW4oIiIpO3ZhciBlPXQubGVuZ3RoPj4xO3JldHVyblsic3VtKCIsbih0LnNsaWNlKDAsZSkpLCIsIixuKHQuc2xpY2UoZSkpLCIpIl0uam9pbigiIil9ZnVuY3Rpb24gcih0KXtpZigyPT09dC5sZW5ndGgpcmV0dXJuW1sic3VtKHByb2QoIix0WzBdWzBdLCIsIix0WzFdWzFdLCIpLHByb2QoLSIsdFswXVsxXSwiLCIsdFsxXVswXSwiKSkiXS5qb2luKCIiKV07Zm9yKHZhciBpPVtdLG89MDtvPHQubGVuZ3RoOysrbylpLnB1c2goWyJzY2FsZSgiLG4ocihlKHQsbykpKSwiLCIsKHM9bywxJnM/Ii0iOiIiKSx0WzBdW29dLCIpIl0uam9pbigiIikpO3JldHVybiBpO3ZhciBzfWZ1bmN0aW9uIGkodCl7Zm9yKHZhciBpPVtdLG89W10scz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7KytuKXtlW25dPW5ldyBBcnJheSh0KTtmb3IodmFyIHI9MDtyPHQ7KytyKWVbbl1bcl09WyJtIixyLCJbIix0LW4tMSwiXSJdLmpvaW4oIiIpfXJldHVybiBlfSh0KSxhPVtdLHU9MDt1PHQ7Kyt1KTA9PSgxJnUpP2kucHVzaC5hcHBseShpLHIoZShzLHUpKSk6by5wdXNoLmFwcGx5KG8scihlKHMsdSkpKSxhLnB1c2goIm0iK3UpO3ZhciBsPW4oaSksYz1uKG8pLGg9Im9yaWVudGF0aW9uIit0KyJFeGFjdCIscD1bImZ1bmN0aW9uICIsaCwiKCIsYS5qb2luKCksIil7dmFyIHA9IixsLCIsbj0iLGMsIixkPXN1YihwLG4pO3JldHVybiBkW2QubGVuZ3RoLTFdO307cmV0dXJuICIsaF0uam9pbigiIik7cmV0dXJuIG5ldyBGdW5jdGlvbigic3VtIiwicHJvZCIsInNjYWxlIiwic3ViIixwKShVdCx6dCxYdCxZdCl9dmFyIG89aSgzKSxzPWkoNCksYT1bZnVuY3Rpb24oKXtyZXR1cm4gMH0sZnVuY3Rpb24oKXtyZXR1cm4gMH0sZnVuY3Rpb24odCxlKXtyZXR1cm4gZVswXS10WzBdfSxmdW5jdGlvbih0LGUsbil7dmFyIHIsaT0odFsxXS1uWzFdKSooZVswXS1uWzBdKSxzPSh0WzBdLW5bMF0pKihlWzFdLW5bMV0pLGE9aS1zO2lmKGk+MCl7aWYoczw9MClyZXR1cm4gYTtyPWkrc31lbHNle2lmKCEoaTwwKSlyZXR1cm4gYTtpZihzPj0wKXJldHVybiBhO3I9LShpK3MpfXZhciB1PTMzMzA2NjkwNzM4NzU0NzE2ZS0zMipyO3JldHVybiBhPj11fHxhPD0tdT9hOm8odCxlLG4pfSxmdW5jdGlvbih0LGUsbixyKXt2YXIgaT10WzBdLXJbMF0sbz1lWzBdLXJbMF0sYT1uWzBdLXJbMF0sdT10WzFdLXJbMV0sbD1lWzFdLXJbMV0sYz1uWzFdLXJbMV0saD10WzJdLXJbMl0scD1lWzJdLXJbMl0sZj1uWzJdLXJbMl0sZz1vKmMsZD1hKmwseT1hKnUsdj1pKmMsXz1pKmwsbT1vKnUseD1oKihnLWQpK3AqKHktdikrZiooXy1tKSxFPTc3NzE1NjExNzIzNzYxMDNlLTMxKigoTWF0aC5hYnMoZykrTWF0aC5hYnMoZCkpKk1hdGguYWJzKGgpKyhNYXRoLmFicyh5KStNYXRoLmFicyh2KSkqTWF0aC5hYnMocCkrKE1hdGguYWJzKF8pK01hdGguYWJzKG0pKSpNYXRoLmFicyhmKSk7cmV0dXJuIHg+RXx8LXg+RT94OnModCxlLG4scil9XTtmdW5jdGlvbiB1KHQpe3ZhciBlPWFbdC5sZW5ndGhdO3JldHVybiBlfHwoZT1hW3QubGVuZ3RoXT1pKHQubGVuZ3RoKSksZS5hcHBseSh2b2lkIDAsdCl9IWZ1bmN0aW9uKCl7Zm9yKDthLmxlbmd0aDw9NTspYS5wdXNoKGkoYS5sZW5ndGgpKTtmb3IodmFyIGU9W10sbj1bInNsb3ciXSxyPTA7cjw9NTsrK3IpZS5wdXNoKCJhIityKSxuLnB1c2goIm8iK3IpO3ZhciBvPVsiZnVuY3Rpb24gZ2V0T3JpZW50YXRpb24oIixlLmpvaW4oKSwiKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOmNhc2UgMTpyZXR1cm4gMDsiXTtmb3Iocj0yO3I8PTU7KytyKW8ucHVzaCgiY2FzZSAiLHIsIjpyZXR1cm4gbyIsciwiKCIsZS5zbGljZSgwLHIpLmpvaW4oKSwiKTsiKTtvLnB1c2goIn12YXIgcz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoOysraSl7c1tpXT1hcmd1bWVudHNbaV19O3JldHVybiBzbG93KHMpO31yZXR1cm4gZ2V0T3JpZW50YXRpb24iKSxuLnB1c2goby5qb2luKCIiKSk7dmFyIHM9RnVuY3Rpb24uYXBwbHkodm9pZCAwLG4pO2Zvcih0LmV4cG9ydHM9cy5hcHBseSh2b2lkIDAsW3VdLmNvbmNhdChhKSkscj0wO3I8PTU7KytyKXQuZXhwb3J0c1tyXT1hW3JdfSgpfSkpLFd0PWZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8Myl7Zm9yKHZhciBuPW5ldyBBcnJheShlKSxyPTA7cjxlOysrciluW3JdPXI7cmV0dXJuIDI9PT1lJiZ0WzBdWzBdPT09dFsxXVswXSYmdFswXVsxXT09PXRbMV1bMV0/WzBdOm59dmFyIGk9bmV3IEFycmF5KGUpO2ZvcihyPTA7cjxlOysrcilpW3JdPXI7aS5zb3J0KChmdW5jdGlvbihlLG4pe3ZhciByPXRbZV1bMF0tdFtuXVswXTtyZXR1cm4gcnx8dFtlXVsxXS10W25dWzFdfSkpO3ZhciBvPVtpWzBdLGlbMV1dLHM9W2lbMF0saVsxXV07Zm9yKHI9MjtyPGU7KytyKXtmb3IodmFyIGE9aVtyXSx1PXRbYV0sbD1vLmxlbmd0aDtsPjEmJkp0KHRbb1tsLTJdXSx0W29bbC0xXV0sdSk8PTA7KWwtPTEsby5wb3AoKTtmb3Ioby5wdXNoKGEpLGw9cy5sZW5ndGg7bD4xJiZKdCh0W3NbbC0yXV0sdFtzW2wtMV1dLHUpPj0wOylsLT0xLHMucG9wKCk7cy5wdXNoKGEpfW49bmV3IEFycmF5KHMubGVuZ3RoK28ubGVuZ3RoLTIpO2Zvcih2YXIgYz0wLGg9KHI9MCxvLmxlbmd0aCk7cjxoOysrciluW2MrK109b1tyXTtmb3IodmFyIHA9cy5sZW5ndGgtMjtwPjA7LS1wKW5bYysrXT1zW3BdO3JldHVybiBufSxKdD1IdFszXTt2YXIgWnQ9UXQsS3Q9UXQ7ZnVuY3Rpb24gUXQodCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBRdCkpcmV0dXJuIG5ldyBRdCh0LGUpO2lmKHRoaXMuZGF0YT10fHxbXSx0aGlzLmxlbmd0aD10aGlzLmRhdGEubGVuZ3RoLHRoaXMuY29tcGFyZT1lfHwkdCx0aGlzLmxlbmd0aD4wKWZvcih2YXIgbj0odGhpcy5sZW5ndGg+PjEpLTE7bj49MDtuLS0pdGhpcy5fZG93bihuKX1mdW5jdGlvbiAkdCh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6MH1RdC5wcm90b3R5cGU9e3B1c2g6ZnVuY3Rpb24odCl7dGhpcy5kYXRhLnB1c2godCksdGhpcy5sZW5ndGgrKyx0aGlzLl91cCh0aGlzLmxlbmd0aC0xKX0scG9wOmZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmRhdGFbMF07cmV0dXJuIHRoaXMubGVuZ3RoLS0sdGhpcy5sZW5ndGg+MCYmKHRoaXMuZGF0YVswXT10aGlzLmRhdGFbdGhpcy5sZW5ndGhdLHRoaXMuX2Rvd24oMCkpLHRoaXMuZGF0YS5wb3AoKSx0fX0scGVlazpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGFbMF19LF91cDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5kYXRhLG49dGhpcy5jb21wYXJlLHI9ZVt0XTt0PjA7KXt2YXIgaT10LTE+PjEsbz1lW2ldO2lmKG4ocixvKT49MClicmVhaztlW3RdPW8sdD1pfWVbdF09cn0sX2Rvd246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZGF0YSxuPXRoaXMuY29tcGFyZSxyPXRoaXMubGVuZ3RoPj4xLGk9ZVt0XTt0PHI7KXt2YXIgbz0xKyh0PDwxKSxzPW8rMSxhPWVbb107aWYoczx0aGlzLmxlbmd0aCYmbihlW3NdLGEpPDAmJihvPXMsYT1lW3NdKSxuKGEsaSk+PTApYnJlYWs7ZVt0XT1hLHQ9b31lW3RdPWl9fSxadC5kZWZhdWx0PUt0O3ZhciB0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10WzBdLHI9dFsxXSxpPSExLG89MCxzPWUubGVuZ3RoLTE7bzxlLmxlbmd0aDtzPW8rKyl7dmFyIGE9ZVtvXVswXSx1PWVbb11bMV0sbD1lW3NdWzBdLGM9ZVtzXVsxXTt1PnIhPWM+ciYmbjwobC1hKSooci11KS8oYy11KSthJiYoaT0haSl9cmV0dXJuIGl9LGVlPUh0WzNdLG5lPWllLHJlPWllO2Z1bmN0aW9uIGllKHQsZSxuKXtlPU1hdGgubWF4KDAsdm9pZCAwPT09ZT8yOmUpLG49bnx8MDtmb3IodmFyIHIsaT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXSxuPXRbMF0scj10WzBdLGk9dFswXSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBzPXRbb107c1swXTxlWzBdJiYoZT1zKSxzWzBdPnJbMF0mJihyPXMpLHNbMV08blsxXSYmKG49cyksc1sxXT5pWzFdJiYoaT1zKX12YXIgYT1bZSxuLHIsaV0sdT1hLnNsaWNlKCk7Zm9yKG89MDtvPHQubGVuZ3RoO28rKyl0ZSh0W29dLGEpfHx1LnB1c2godFtvXSk7dmFyIGw9V3QodSksYz1bXTtmb3Iobz0wO288bC5sZW5ndGg7bysrKWMucHVzaCh1W2xbb11dKTtyZXR1cm4gY30odCksbz1OdCgxNixbIlswXSIsIlsxXSIsIlswXSIsIlsxXSJdKS5sb2FkKHQpLHM9W10sYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgdT1pW2FdO28ucmVtb3ZlKHUpLHI9aGUodSxyKSxzLnB1c2gocil9dmFyIGw9TnQoMTYpO2ZvcihhPTA7YTxzLmxlbmd0aDthKyspbC5pbnNlcnQoY2Uoc1thXSkpO2Zvcih2YXIgYz1lKmUsaD1uKm47cy5sZW5ndGg7KXt2YXIgcD1zLnNoaWZ0KCksZj1wLnAsZz1wLm5leHQucCxkPXBlKGYsZyk7aWYoIShkPGgpKXt2YXIgeT1kL2M7KHU9b2UobyxwLnByZXYucCxmLGcscC5uZXh0Lm5leHQucCx5LGwpKSYmTWF0aC5taW4ocGUodSxmKSxwZSh1LGcpKTw9eSYmKHMucHVzaChwKSxzLnB1c2goaGUodSxwKSksby5yZW1vdmUodSksbC5yZW1vdmUocCksbC5pbnNlcnQoY2UocCkpLGwuaW5zZXJ0KGNlKHAubmV4dCkpKX19cD1yO3ZhciB2PVtdO2Rve3YucHVzaChwLnApLHA9cC5uZXh0fXdoaWxlKHAhPT1yKTtyZXR1cm4gdi5wdXNoKHAucCksdn1mdW5jdGlvbiBvZSh0LGUsbixyLGksbyxzKXtmb3IodmFyIGE9bmV3IFp0KG51bGwsc2UpLHU9dC5kYXRhO3U7KXtmb3IodmFyIGw9MDtsPHUuY2hpbGRyZW4ubGVuZ3RoO2wrKyl7dmFyIGM9dS5jaGlsZHJlbltsXSxoPXUubGVhZj9mZShjLG4scik6YWUobixyLGMpO2g+b3x8YS5wdXNoKHtub2RlOmMsZGlzdDpofSl9Zm9yKDthLmxlbmd0aCYmIWEucGVlaygpLm5vZGUuY2hpbGRyZW47KXt2YXIgcD1hLnBvcCgpLGY9cC5ub2RlLGc9ZmUoZixlLG4pLGQ9ZmUoZixyLGkpO2lmKHAuZGlzdDxnJiZwLmRpc3Q8ZCYmbGUobixmLHMpJiZsZShyLGYscykpcmV0dXJuIGZ9KHU9YS5wb3AoKSkmJih1PXUubm9kZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gc2UodCxlKXtyZXR1cm4gdC5kaXN0LWUuZGlzdH1mdW5jdGlvbiBhZSh0LGUsbil7aWYodWUodCxuKXx8dWUoZSxuKSlyZXR1cm4gMDt2YXIgcj1nZSh0WzBdLHRbMV0sZVswXSxlWzFdLG4ubWluWCxuLm1pblksbi5tYXhYLG4ubWluWSk7aWYoMD09PXIpcmV0dXJuIDA7dmFyIGk9Z2UodFswXSx0WzFdLGVbMF0sZVsxXSxuLm1pblgsbi5taW5ZLG4ubWluWCxuLm1heFkpO2lmKDA9PT1pKXJldHVybiAwO3ZhciBvPWdlKHRbMF0sdFsxXSxlWzBdLGVbMV0sbi5tYXhYLG4ubWluWSxuLm1heFgsbi5tYXhZKTtpZigwPT09bylyZXR1cm4gMDt2YXIgcz1nZSh0WzBdLHRbMV0sZVswXSxlWzFdLG4ubWluWCxuLm1heFksbi5tYXhYLG4ubWF4WSk7cmV0dXJuIDA9PT1zPzA6TWF0aC5taW4ocixpLG8scyl9ZnVuY3Rpb24gdWUodCxlKXtyZXR1cm4gdFswXT49ZS5taW5YJiZ0WzBdPD1lLm1heFgmJnRbMV0+PWUubWluWSYmdFsxXTw9ZS5tYXhZfWZ1bmN0aW9uIGxlKHQsZSxuKXtmb3IodmFyIHIsaSxvLHMsYT1NYXRoLm1pbih0WzBdLGVbMF0pLHU9TWF0aC5taW4odFsxXSxlWzFdKSxsPU1hdGgubWF4KHRbMF0sZVswXSksYz1NYXRoLm1heCh0WzFdLGVbMV0pLGg9bi5zZWFyY2goe21pblg6YSxtaW5ZOnUsbWF4WDpsLG1heFk6Y30pLHA9MDtwPGgubGVuZ3RoO3ArKylpZihyPWhbcF0ucCxpPWhbcF0ubmV4dC5wLG89dCxyIT09KHM9ZSkmJmkhPT1vJiZlZShyLGksbyk+MCE9ZWUocixpLHMpPjAmJmVlKG8scyxyKT4wIT1lZShvLHMsaSk+MClyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBjZSh0KXt2YXIgZT10LnAsbj10Lm5leHQucDtyZXR1cm4gdC5taW5YPU1hdGgubWluKGVbMF0sblswXSksdC5taW5ZPU1hdGgubWluKGVbMV0sblsxXSksdC5tYXhYPU1hdGgubWF4KGVbMF0sblswXSksdC5tYXhZPU1hdGgubWF4KGVbMV0sblsxXSksdH1mdW5jdGlvbiBoZSh0LGUpe3ZhciBuPXtwOnQscHJldjpudWxsLG5leHQ6bnVsbCxtaW5YOjAsbWluWTowLG1heFg6MCxtYXhZOjB9O3JldHVybiBlPyhuLm5leHQ9ZS5uZXh0LG4ucHJldj1lLGUubmV4dC5wcmV2PW4sZS5uZXh0PW4pOihuLnByZXY9bixuLm5leHQ9biksbn1mdW5jdGlvbiBwZSh0LGUpe3ZhciBuPXRbMF0tZVswXSxyPXRbMV0tZVsxXTtyZXR1cm4gbipuK3Iqcn1mdW5jdGlvbiBmZSh0LGUsbil7dmFyIHI9ZVswXSxpPWVbMV0sbz1uWzBdLXIscz1uWzFdLWk7aWYoMCE9PW98fDAhPT1zKXt2YXIgYT0oKHRbMF0tcikqbysodFsxXS1pKSpzKS8obypvK3Mqcyk7YT4xPyhyPW5bMF0saT1uWzFdKTphPjAmJihyKz1vKmEsaSs9cyphKX1yZXR1cm4obz10WzBdLXIpKm8rKHM9dFsxXS1pKSpzfWZ1bmN0aW9uIGdlKHQsZSxuLHIsaSxvLHMsYSl7dmFyIHUsbCxjLGgscD1uLXQsZj1yLWUsZz1zLWksZD1hLW8seT10LWksdj1lLW8sXz1wKnArZipmLG09cCpnK2YqZCx4PWcqZytkKmQsRT1wKnkrZip2LGI9Zyp5K2Qqdix3PV8qeC1tKm0sST13LE49dzswPT09dz8obD0wLEk9MSxoPWIsTj14KTooaD1fKmItbSpFLChsPW0qYi14KkUpPDA/KGw9MCxoPWIsTj14KTpsPkkmJihsPUksaD1iK20sTj14KSksaDwwPyhoPTAsLUU8MD9sPTA6LUU+Xz9sPUk6KGw9LUUsST1fKSk6aD5OJiYoaD1OLC1FK208MD9sPTA6LUUrbT5fP2w9SToobD0tRSttLEk9XykpO3ZhciBTPSgxLShjPTA9PT1oPzA6aC9OKSkqaStjKnMtKCgxLSh1PTA9PT1sPzA6bC9JKSkqdCt1Km4pLEM9KDEtYykqbytjKmEtKCgxLXUpKmUrdSpyKTtyZXR1cm4gUypTK0MqQ31mdW5jdGlvbiBkZSh0LGUpe3ZvaWQgMD09PWUmJihlPXt9KSxlLmNvbmNhdml0eT1lLmNvbmNhdml0eXx8MS8wO3ZhciBuPVtdO2lmKFIodCwoZnVuY3Rpb24odCl7bi5wdXNoKFt0WzBdLHRbMV1dKX0pKSwhbi5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIHI9bmUobixlLmNvbmNhdml0eSk7cmV0dXJuIHIubGVuZ3RoPjM/bChbcl0pOm51bGx9ZnVuY3Rpb24geWUodCxlLG4pe2lmKHZvaWQgMD09PW4mJihuPXt9KSwhdCl0aHJvdyBuZXcgRXJyb3IoInBvaW50IGlzIHJlcXVpcmVkIik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJwb2x5Z29uIGlzIHJlcXVpcmVkIik7dmFyIHI9Syh0KSxpPXJ0KGUpLG89aS50eXBlLHM9ZS5iYm94LGE9aS5jb29yZGluYXRlcztpZihzJiYhMT09PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVbMF08PXRbMF0mJmVbMV08PXRbMV0mJmVbMl0+PXRbMF0mJmVbM10+PXRbMV19KHIscykpcmV0dXJuITE7IlBvbHlnb24iPT09byYmKGE9W2FdKTtmb3IodmFyIHU9ITEsbD0wO2w8YS5sZW5ndGgmJiF1O2wrKylpZih2ZShyLGFbbF1bMF0sbi5pZ25vcmVCb3VuZGFyeSkpe2Zvcih2YXIgYz0hMSxoPTE7aDxhW2xdLmxlbmd0aCYmIWM7KXZlKHIsYVtsXVtoXSwhbi5pZ25vcmVCb3VuZGFyeSkmJihjPSEwKSxoKys7Y3x8KHU9ITApfXJldHVybiB1fWZ1bmN0aW9uIHZlKHQsZSxuKXt2YXIgcj0hMTtlWzBdWzBdPT09ZVtlLmxlbmd0aC0xXVswXSYmZVswXVsxXT09PWVbZS5sZW5ndGgtMV1bMV0mJihlPWUuc2xpY2UoMCxlLmxlbmd0aC0xKSk7Zm9yKHZhciBpPTAsbz1lLmxlbmd0aC0xO2k8ZS5sZW5ndGg7bz1pKyspe3ZhciBzPWVbaV1bMF0sYT1lW2ldWzFdLHU9ZVtvXVswXSxsPWVbb11bMV07aWYodFsxXSoocy11KSthKih1LXRbMF0pK2wqKHRbMF0tcyk9PTAmJihzLXRbMF0pKih1LXRbMF0pPD0wJiYoYS10WzFdKSoobC10WzFdKTw9MClyZXR1cm4hbjthPnRbMV0hPWw+dFsxXSYmdFswXTwodS1zKSoodFsxXS1hKS8obC1hKStzJiYocj0hcil9cmV0dXJuIHJ9ZnVuY3Rpb24gX2UodCxlKXt2YXIgbj1bXTtyZXR1cm4gRih0LChmdW5jdGlvbih0KXt2YXIgcj0hMTtpZigiUG9pbnQiPT09dC5nZW9tZXRyeS50eXBlKXEoZSwoZnVuY3Rpb24oZSl7eWUodCxlKSYmKHI9ITApfSkpLHImJm4ucHVzaCh0KTtlbHNle2lmKCJNdWx0aVBvaW50IiE9PXQuZ2VvbWV0cnkudHlwZSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IGdlb21ldHJ5IG11c3QgYmUgYSBQb2ludCBvciBNdWx0aVBvaW50Iik7dmFyIGk9W107cShlLChmdW5jdGlvbihlKXtSKHQsKGZ1bmN0aW9uKHQpe3llKHQsZSkmJihyPSEwLGkucHVzaCh0KSl9KSl9KSksciYmbi5wdXNoKGQoaSkpfX0pKSxmKG4pfWZ1bmN0aW9uIG1lKHQsZSxuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9Syh0KSxpPUsoZSksbz1JKGlbMV0tclsxXSkscz1JKGlbMF0tclswXSksYT1JKHJbMV0pLHU9SShpWzFdKSxsPU1hdGgucG93KE1hdGguc2luKG8vMiksMikrTWF0aC5wb3coTWF0aC5zaW4ocy8yKSwyKSpNYXRoLmNvcyhhKSpNYXRoLmNvcyh1KTtyZXR1cm4gbSgyKk1hdGguYXRhbjIoTWF0aC5zcXJ0KGwpLE1hdGguc3FydCgxLWwpKSxuLnVuaXRzKX1mdW5jdGlvbiB4ZSh0LGUpe3ZhciBuPSExO3JldHVybiBmKGZ1bmN0aW9uKHQpe2lmKHQubGVuZ3RoPDMpcmV0dXJuW107dC5zb3J0KGJlKTt2YXIgZSxuLHIsaSxvLHMsYT10Lmxlbmd0aC0xLHU9dFthXS54LGw9dFswXS54LGM9dFthXS55LGg9YyxwPTFlLTEyO2Zvcig7YS0tOyl0W2FdLnk8YyYmKGM9dFthXS55KSx0W2FdLnk+aCYmKGg9dFthXS55KTt2YXIgZixnPWwtdSxkPWgtYyx5PWc+ZD9nOmQsdj0uNSoobCt1KSxfPS41KihoK2MpLG09W25ldyBFZSh7X19zZW50aW5lbDohMCx4OnYtMjAqeSx5Ol8teX0se19fc2VudGluZWw6ITAseDp2LHk6XysyMCp5fSx7X19zZW50aW5lbDohMCx4OnYrMjAqeSx5Ol8teX0pXSx4PVtdLEU9W107YT10Lmxlbmd0aDtmb3IoO2EtLTspe2ZvcihFLmxlbmd0aD0wLGY9bS5sZW5ndGg7Zi0tOykoZz10W2FdLngtbVtmXS54KT4wJiZnKmc+bVtmXS5yPyh4LnB1c2gobVtmXSksbS5zcGxpY2UoZiwxKSk6ZypnKyhkPXRbYV0ueS1tW2ZdLnkpKmQ+bVtmXS5yfHwoRS5wdXNoKG1bZl0uYSxtW2ZdLmIsbVtmXS5iLG1bZl0uYyxtW2ZdLmMsbVtmXS5hKSxtLnNwbGljZShmLDEpKTtmb3Iod2UoRSksZj1FLmxlbmd0aDtmOyluPUVbLS1mXSxlPUVbLS1mXSxyPXRbYV0saT1uLngtZS54LG89bi55LWUueSxzPTIqKGkqKHIueS1uLnkpLW8qKHIueC1uLngpKSxNYXRoLmFicyhzKT5wJiZtLnB1c2gobmV3IEVlKGUsbixyKSl9QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoeCxtKSxhPXgubGVuZ3RoO2Zvcig7YS0tOykoeFthXS5hLl9fc2VudGluZWx8fHhbYV0uYi5fX3NlbnRpbmVsfHx4W2FdLmMuX19zZW50aW5lbCkmJnguc3BsaWNlKGEsMSk7cmV0dXJuIHh9KHQuZmVhdHVyZXMubWFwKChmdW5jdGlvbih0KXt2YXIgcj17eDp0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLHk6dC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXX07cmV0dXJuIGU/ci56PXQucHJvcGVydGllc1tlXTozPT09dC5nZW9tZXRyeS5jb29yZGluYXRlcy5sZW5ndGgmJihuPSEwLHIuej10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzJdKSxyfSkpKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPVt0LmEueCx0LmEueV0scj1bdC5iLngsdC5iLnldLGk9W3QuYy54LHQuYy55XSxvPXt9O3JldHVybiBuPyhlLnB1c2godC5hLnopLHIucHVzaCh0LmIueiksaS5wdXNoKHQuYy56KSk6bz17YTp0LmEueixiOnQuYi56LGM6dC5jLnp9LGwoW1tlLHIsaSxlXV0sbyl9KSkpfW5lLmRlZmF1bHQ9cmU7dmFyIEVlPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLmM9bjt2YXIgcixpLG89ZS54LXQueCxzPWUueS10LnksYT1uLngtdC54LHU9bi55LXQueSxsPW8qKHQueCtlLngpK3MqKHQueStlLnkpLGM9YSoodC54K24ueCkrdSoodC55K24ueSksaD0yKihvKihuLnktZS55KS1zKihuLngtZS54KSk7dGhpcy54PSh1KmwtcypjKS9oLHRoaXMueT0obypjLWEqbCkvaCxyPXRoaXMueC10LngsaT10aGlzLnktdC55LHRoaXMucj1yKnIraSppfTtmdW5jdGlvbiBiZSh0LGUpe3JldHVybiBlLngtdC54fWZ1bmN0aW9uIHdlKHQpe3ZhciBlLG4scixpLG8scz10Lmxlbmd0aDt0OmZvcig7czspZm9yKG49dFstLXNdLGU9dFstLXNdLHI9cztyOylpZihvPXRbLS1yXSxlPT09KGk9dFstLXJdKSYmbj09PW98fGU9PT1vJiZuPT09aSl7dC5zcGxpY2UocywyKSx0LnNwbGljZShyLDIpLHMtPTI7Y29udGludWUgdH19ZnVuY3Rpb24gSWUodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7c3dpdGNoKHQudHlwZSl7Y2FzZSJGZWF0dXJlIjpyZXR1cm4gTmUodCk7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiJ9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihuKXtzd2l0Y2gobil7Y2FzZSJ0eXBlIjpjYXNlImZlYXR1cmVzIjpyZXR1cm47ZGVmYXVsdDplW25dPXRbbl19fSkpLGUuZmVhdHVyZXM9dC5mZWF0dXJlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBOZSh0KX0pKSxlfSh0KTtjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aVBvaW50IjpjYXNlIk11bHRpTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvbHlnb24iOmNhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpyZXR1cm4gQ2UodCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVua25vd24gR2VvSlNPTiB0eXBlIil9fWZ1bmN0aW9uIE5lKHQpe3ZhciBlPXt0eXBlOiJGZWF0dXJlIn07cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3N3aXRjaChuKXtjYXNlInR5cGUiOmNhc2UicHJvcGVydGllcyI6Y2FzZSJnZW9tZXRyeSI6cmV0dXJuO2RlZmF1bHQ6ZVtuXT10W25dfX0pKSxlLnByb3BlcnRpZXM9U2UodC5wcm9wZXJ0aWVzKSxlLmdlb21ldHJ5PUNlKHQuZ2VvbWV0cnkpLGV9ZnVuY3Rpb24gU2UodCl7dmFyIGU9e307cmV0dXJuIHQ/KE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPXRbbl07Im9iamVjdCI9PXR5cGVvZiByP251bGw9PT1yP2Vbbl09bnVsbDpBcnJheS5pc0FycmF5KHIpP2Vbbl09ci5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpOmVbbl09U2Uocik6ZVtuXT1yfSkpLGUpOmV9ZnVuY3Rpb24gQ2UodCl7dmFyIGU9e3R5cGU6dC50eXBlfTtyZXR1cm4gdC5iYm94JiYoZS5iYm94PXQuYmJveCksIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT10LnR5cGU/KGUuZ2VvbWV0cmllcz10Lmdlb21ldHJpZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gQ2UodCl9KSksZSk6KGUuY29vcmRpbmF0ZXM9UGUodC5jb29yZGluYXRlcyksZSl9ZnVuY3Rpb24gUGUodCl7dmFyIGU9dDtyZXR1cm4ib2JqZWN0IiE9dHlwZW9mIGVbMF0/ZS5zbGljZSgpOmUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gUGUodCl9KSl9ZnVuY3Rpb24gTWUodCxlKXtpZih2b2lkIDA9PT1lJiYoZT17fSksIVAoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj1lLm11dGF0ZTtpZigiRmVhdHVyZUNvbGxlY3Rpb24iIT09aXQodCkpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIG11c3QgYmUgYSBGZWF0dXJlQ29sbGVjdGlvbiIpO2lmKCF0LmZlYXR1cmVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgZW1wdHkiKTshMSE9PW4mJnZvaWQgMCE9PW58fCh0PUllKHQpKTt2YXIgcj1bXSxpPVkodCwoZnVuY3Rpb24odCxlKXt2YXIgbj1mdW5jdGlvbih0LGUpe3ZhciBuLHI9dC5nZW9tZXRyeS5jb29yZGluYXRlcyxpPWUuZ2VvbWV0cnkuY29vcmRpbmF0ZXMsbz1MZShyWzBdKSxzPUxlKHJbci5sZW5ndGgtMV0pLGE9TGUoaVswXSksdT1MZShpW2kubGVuZ3RoLTFdKTtpZihvPT09dSluPWkuY29uY2F0KHIuc2xpY2UoMSkpO2Vsc2UgaWYoYT09PXMpbj1yLmNvbmNhdChpLnNsaWNlKDEpKTtlbHNlIGlmKG89PT1hKW49ci5zbGljZSgxKS5yZXZlcnNlKCkuY29uY2F0KGkpO2Vsc2V7aWYocyE9PXUpcmV0dXJuIG51bGw7bj1yLmNvbmNhdChpLnJldmVyc2UoKS5zbGljZSgxKSl9cmV0dXJuIGgobil9KHQsZSk7cmV0dXJuIG58fChyLnB1c2godCksZSl9KSk7cmV0dXJuIGkmJnIucHVzaChpKSxyLmxlbmd0aD8xPT09ci5sZW5ndGg/clswXTpnKHIubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jb29yZGluYXRlc30pKSk6bnVsbH1mdW5jdGlvbiBMZSh0KXtyZXR1cm4gdFswXS50b1N0cmluZygpKyIsIit0WzFdLnRvU3RyaW5nKCl9ZnVuY3Rpb24gT2UodCl7cmV0dXJuIHR9ZnVuY3Rpb24gUmUodCxlKXt2YXIgbj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiBPZTt2YXIgZSxuLHI9dC5zY2FsZVswXSxpPXQuc2NhbGVbMV0sbz10LnRyYW5zbGF0ZVswXSxzPXQudHJhbnNsYXRlWzFdO3JldHVybiBmdW5jdGlvbih0LGEpe2F8fChlPW49MCk7dmFyIHU9MixsPXQubGVuZ3RoLGM9bmV3IEFycmF5KGwpO2ZvcihjWzBdPShlKz10WzBdKSpyK28sY1sxXT0obis9dFsxXSkqaStzO3U8bDspY1t1XT10W3VdLCsrdTtyZXR1cm4gY319KHQudHJhbnNmb3JtKSxyPXQuYXJjcztmdW5jdGlvbiBpKHQsZSl7ZS5sZW5ndGgmJmUucG9wKCk7Zm9yKHZhciBpPXJbdDwwP350OnRdLG89MCxzPWkubGVuZ3RoO288czsrK28pZS5wdXNoKG4oaVtvXSxvKSk7dDwwJiZmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyPXQubGVuZ3RoLGk9ci1lO2k8LS1yOyluPXRbaV0sdFtpKytdPXRbcl0sdFtyXT1ufShlLHMpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIG4odCl9ZnVuY3Rpb24gcyh0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5sZW5ndGg7bjxyOysrbilpKHRbbl0sZSk7cmV0dXJuIGUubGVuZ3RoPDImJmUucHVzaChlWzBdKSxlfWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlPXModCk7ZS5sZW5ndGg8NDspZS5wdXNoKGVbMF0pO3JldHVybiBlfWZ1bmN0aW9uIHUodCl7cmV0dXJuIHQubWFwKGEpfXJldHVybiBmdW5jdGlvbiB0KGUpe3ZhciBuLHI9ZS50eXBlO3N3aXRjaChyKXtjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6cmV0dXJue3R5cGU6cixnZW9tZXRyaWVzOmUuZ2VvbWV0cmllcy5tYXAodCl9O2Nhc2UiUG9pbnQiOm49byhlLmNvb3JkaW5hdGVzKTticmVhaztjYXNlIk11bHRpUG9pbnQiOm49ZS5jb29yZGluYXRlcy5tYXAobyk7YnJlYWs7Y2FzZSJMaW5lU3RyaW5nIjpuPXMoZS5hcmNzKTticmVhaztjYXNlIk11bHRpTGluZVN0cmluZyI6bj1lLmFyY3MubWFwKHMpO2JyZWFrO2Nhc2UiUG9seWdvbiI6bj11KGUuYXJjcyk7YnJlYWs7Y2FzZSJNdWx0aVBvbHlnb24iOm49ZS5hcmNzLm1hcCh1KTticmVhaztkZWZhdWx0OnJldHVybiBudWxsfXJldHVybnt0eXBlOnIsY29vcmRpbmF0ZXM6bn19KGUpfWZ1bmN0aW9uIFRlKHQsZSl7dmFyIG49e30scj17fSxpPXt9LG89W10scz0tMTtmdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByIGluIHQpe3ZhciBpPXRbcl07ZGVsZXRlIGVbaS5zdGFydF0sZGVsZXRlIGkuc3RhcnQsZGVsZXRlIGkuZW5kLGkuZm9yRWFjaCgoZnVuY3Rpb24odCl7blt0PDA/fnQ6dF09MX0pKSxvLnB1c2goaSl9fXJldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKG4scil7dmFyIGksbz10LmFyY3NbbjwwP35uOm5dO28ubGVuZ3RoPDMmJiFvWzFdWzBdJiYhb1sxXVsxXSYmKGk9ZVsrK3NdLGVbc109bixlW3JdPWkpfSkpLGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG4sbyxzPWZ1bmN0aW9uKGUpe3ZhciBuLHI9dC5hcmNzW2U8MD9+ZTplXSxpPXJbMF07dC50cmFuc2Zvcm0/KG49WzAsMF0sci5mb3JFYWNoKChmdW5jdGlvbih0KXtuWzBdKz10WzBdLG5bMV0rPXRbMV19KSkpOm49cltyLmxlbmd0aC0xXTtyZXR1cm4gZTwwP1tuLGldOltpLG5dfShlKSxhPXNbMF0sdT1zWzFdO2lmKG49aVthXSlpZihkZWxldGUgaVtuLmVuZF0sbi5wdXNoKGUpLG4uZW5kPXUsbz1yW3VdKXtkZWxldGUgcltvLnN0YXJ0XTt2YXIgbD1vPT09bj9uOm4uY29uY2F0KG8pO3JbbC5zdGFydD1uLnN0YXJ0XT1pW2wuZW5kPW8uZW5kXT1sfWVsc2UgcltuLnN0YXJ0XT1pW24uZW5kXT1uO2Vsc2UgaWYobj1yW3VdKWlmKGRlbGV0ZSByW24uc3RhcnRdLG4udW5zaGlmdChlKSxuLnN0YXJ0PWEsbz1pW2FdKXtkZWxldGUgaVtvLmVuZF07dmFyIGM9bz09PW4/bjpvLmNvbmNhdChuKTtyW2Muc3RhcnQ9by5zdGFydF09aVtjLmVuZD1uLmVuZF09Y31lbHNlIHJbbi5zdGFydF09aVtuLmVuZF09bjtlbHNlIHJbKG49W2VdKS5zdGFydD1hXT1pW24uZW5kPXVdPW59KSksYShpLHIpLGEocixpKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe25bdDwwP350OnRdfHxvLnB1c2goW3RdKX0pKSxvfWZ1bmN0aW9uIEFlKHQsZSl7dmFyIG49e30scj1bXSxpPVtdO2Z1bmN0aW9uIG8odCl7dC5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyhuW2U9ZTwwP35lOmVdfHwobltlXT1bXSkpLnB1c2godCl9KSl9KSksci5wdXNoKHQpfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPS0xLHI9dC5sZW5ndGgsaT10W3ItMV0sbz0wOysrbjxyOyllPWksaT10W25dLG8rPWVbMF0qaVsxXS1lWzFdKmlbMF07cmV0dXJuIE1hdGguYWJzKG8pfShSZSh0LHt0eXBlOiJQb2x5Z29uIixhcmNzOltlXX0pLmNvb3JkaW5hdGVzWzBdKX1yZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbiB0KGUpe3N3aXRjaChlLnR5cGUpe2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjplLmdlb21ldHJpZXMuZm9yRWFjaCh0KTticmVhaztjYXNlIlBvbHlnb24iOm8oZS5hcmNzKTticmVhaztjYXNlIk11bHRpUG9seWdvbiI6ZS5hcmNzLmZvckVhY2gobyl9fSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIXQuXyl7dmFyIGU9W10scj1bdF07Zm9yKHQuXz0xLGkucHVzaChlKTt0PXIucG9wKCk7KWUucHVzaCh0KSx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7blt0PDA/fnQ6dF0uZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5ffHwodC5fPTEsci5wdXNoKHQpKX0pKX0pKX0pKX19KSksci5mb3JFYWNoKChmdW5jdGlvbih0KXtkZWxldGUgdC5ffSkpLHt0eXBlOiJNdWx0aVBvbHlnb24iLGFyY3M6aS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciByLGk9W107aWYoZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7blt0PDA/fnQ6dF0ubGVuZ3RoPDImJmkucHVzaCh0KX0pKX0pKX0pKSwocj0oaT1UZSh0LGkpKS5sZW5ndGgpPjEpZm9yKHZhciBvLGEsdT0xLGw9cyhpWzBdKTt1PHI7Kyt1KShvPXMoaVt1XSkpPmwmJihhPWlbMF0saVswXT1pW3VdLGlbdV09YSxsPW8pO3JldHVybiBpfSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoPjB9KSl9fXZhciBEZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEZlKHQsZSxuLHIsaSxvKXszPT09YXJndW1lbnRzLmxlbmd0aCYmKHI9bz1BcnJheSxpPW51bGwpO2Zvcih2YXIgcz1uZXcgcih0PTE8PE1hdGgubWF4KDQsTWF0aC5jZWlsKE1hdGgubG9nKHQpL01hdGguTE4yKSkpLGE9bmV3IG8odCksdT10LTEsbD0wO2w8dDsrK2wpc1tsXT1pO2Z1bmN0aW9uIGMocixvKXtmb3IodmFyIGw9ZShyKSZ1LGM9c1tsXSxoPTA7YyE9aTspe2lmKG4oYyxyKSlyZXR1cm4gYVtsXT1vO2lmKCsraD49dCl0aHJvdyBuZXcgRXJyb3IoImZ1bGwgaGFzaG1hcCIpO2M9c1tsPWwrMSZ1XX1yZXR1cm4gc1tsXT1yLGFbbF09byxvfWZ1bmN0aW9uIGgocixvKXtmb3IodmFyIGw9ZShyKSZ1LGM9c1tsXSxoPTA7YyE9aTspe2lmKG4oYyxyKSlyZXR1cm4gYVtsXTtpZigrK2g+PXQpdGhyb3cgbmV3IEVycm9yKCJmdWxsIGhhc2htYXAiKTtjPXNbbD1sKzEmdV19cmV0dXJuIHNbbF09cixhW2xdPW8sb31mdW5jdGlvbiBwKHIsbyl7Zm9yKHZhciBsPWUocikmdSxjPXNbbF0saD0wO2MhPWk7KXtpZihuKGMscikpcmV0dXJuIGFbbF07aWYoKytoPj10KWJyZWFrO2M9c1tsPWwrMSZ1XX1yZXR1cm4gb31mdW5jdGlvbiBmKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXMubGVuZ3RoO2U8bjsrK2Upe3ZhciByPXNbZV07ciE9aSYmdC5wdXNoKHIpfXJldHVybiB0fXJldHVybntzZXQ6YyxtYXliZVNldDpoLGdldDpwLGtleXM6Zn19ZnVuY3Rpb24ga2UodCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdfXZhciBHZT1uZXcgQXJyYXlCdWZmZXIoMTYpLHFlPW5ldyBGbG9hdDY0QXJyYXkoR2UpLEJlPW5ldyBVaW50MzJBcnJheShHZSk7ZnVuY3Rpb24gemUodCl7cWVbMF09dFswXSxxZVsxXT10WzFdO3ZhciBlPUJlWzBdXkJlWzFdO3JldHVybiAyMTQ3NDgzNjQ3JihlPWU8PDVeZT4+N15CZVsyXV5CZVszXSl9ZnVuY3Rpb24gamUodCl7dmFyIGUsbixyLGksbz10LmNvb3JkaW5hdGVzLHM9dC5saW5lcyxhPXQucmluZ3MsdT1mdW5jdGlvbigpe2Zvcih2YXIgdD1GZSgxLjQqby5sZW5ndGgsRSxiLEludDMyQXJyYXksLTEsSW50MzJBcnJheSksZT1uZXcgSW50MzJBcnJheShvLmxlbmd0aCksbj0wLHI9by5sZW5ndGg7bjxyOysrbillW25dPXQubWF5YmVTZXQobixuKTtyZXR1cm4gZX0oKSxsPW5ldyBJbnQzMkFycmF5KG8ubGVuZ3RoKSxjPW5ldyBJbnQzMkFycmF5KG8ubGVuZ3RoKSxoPW5ldyBJbnQzMkFycmF5KG8ubGVuZ3RoKSxwPW5ldyBJbnQ4QXJyYXkoby5sZW5ndGgpLGY9MDtmb3IoZT0wLG49by5sZW5ndGg7ZTxuOysrZSlsW2VdPWNbZV09aFtlXT0tMTtmb3IoZT0wLG49cy5sZW5ndGg7ZTxuOysrZSl7dmFyIGc9c1tlXSxkPWdbMF0seT1nWzFdO2ZvcihyPXVbZF0saT11WysrZF0sKytmLHBbcl09MTsrK2Q8PXk7KXgoZSxyLHI9aSxpPXVbZF0pOysrZixwW2ldPTF9Zm9yKGU9MCxuPW8ubGVuZ3RoO2U8bjsrK2UpbFtlXT0tMTtmb3IoZT0wLG49YS5sZW5ndGg7ZTxuOysrZSl7dmFyIHY9YVtlXSxfPXZbMF0rMSxtPXZbMV07Zm9yKHgoZSx1W20tMV0scj11W18tMV0saT11W19dKTsrK188PW07KXgoZSxyLHI9aSxpPXVbX10pfWZ1bmN0aW9uIHgodCxlLG4scil7aWYobFtuXSE9PXQpe2xbbl09dDt2YXIgaT1jW25dO2lmKGk+PTApe3ZhciBvPWhbbl07aT09PWUmJm89PT1yfHxpPT09ciYmbz09PWV8fCgrK2YscFtuXT0xKX1lbHNlIGNbbl09ZSxoW25dPXJ9fWZ1bmN0aW9uIEUodCl7cmV0dXJuIHplKG9bdF0pfWZ1bmN0aW9uIGIodCxlKXtyZXR1cm4ga2Uob1t0XSxvW2VdKX1sPWM9aD1udWxsO3ZhciB3LEk9ZnVuY3Rpb24odCxlLG4scixpKXszPT09YXJndW1lbnRzLmxlbmd0aCYmKHI9QXJyYXksaT1udWxsKTtmb3IodmFyIG89bmV3IHIodD0xPDxNYXRoLm1heCg0LE1hdGguY2VpbChNYXRoLmxvZyh0KS9NYXRoLkxOMikpKSxzPXQtMSxhPTA7YTx0OysrYSlvW2FdPWk7ZnVuY3Rpb24gdShyKXtmb3IodmFyIGE9ZShyKSZzLHU9b1thXSxsPTA7dSE9aTspe2lmKG4odSxyKSlyZXR1cm4hMDtpZigrK2w+PXQpdGhyb3cgbmV3IEVycm9yKCJmdWxsIGhhc2hzZXQiKTt1PW9bYT1hKzEmc119cmV0dXJuIG9bYV09ciwhMH1mdW5jdGlvbiBsKHIpe2Zvcih2YXIgYT1lKHIpJnMsdT1vW2FdLGw9MDt1IT1pOyl7aWYobih1LHIpKXJldHVybiEwO2lmKCsrbD49dClicmVhazt1PW9bYT1hKzEmc119cmV0dXJuITF9ZnVuY3Rpb24gYygpe2Zvcih2YXIgdD1bXSxlPTAsbj1vLmxlbmd0aDtlPG47KytlKXt2YXIgcj1vW2VdO3IhPWkmJnQucHVzaChyKX1yZXR1cm4gdH1yZXR1cm57YWRkOnUsaGFzOmwsdmFsdWVzOmN9fSgxLjQqZix6ZSxrZSk7Zm9yKGU9MCxuPW8ubGVuZ3RoO2U8bjsrK2UpcFt3PXVbZV1dJiZJLmFkZChvW3ddKTtyZXR1cm4gSX1mdW5jdGlvbiBVZSh0LGUsbixyKXtWZSh0LGUsbiksVmUodCxlLGUrciksVmUodCxlK3Isbil9ZnVuY3Rpb24gVmUodCxlLG4pe2Zvcih2YXIgcixpPWUrKG4tLS1lPj4xKTtlPGk7KytlLC0tbilyPXRbZV0sdFtlXT10W25dLHRbbl09cn1mdW5jdGlvbiBYZSh0KXt2YXIgZSxuLHI9e307Zm9yKGUgaW4gdClyW2VdPW51bGw9PShuPXRbZV0pP3t0eXBlOm51bGx9OigiRmVhdHVyZUNvbGxlY3Rpb24iPT09bi50eXBlP1llOiJGZWF0dXJlIj09PW4udHlwZT9IZTpXZSkobik7cmV0dXJuIHJ9ZnVuY3Rpb24gWWUodCl7dmFyIGU9e3R5cGU6Ikdlb21ldHJ5Q29sbGVjdGlvbiIsZ2VvbWV0cmllczp0LmZlYXR1cmVzLm1hcChIZSl9O3JldHVybiBudWxsIT10LmJib3gmJihlLmJib3g9dC5iYm94KSxlfWZ1bmN0aW9uIEhlKHQpe3ZhciBlLG49V2UodC5nZW9tZXRyeSk7Zm9yKGUgaW4gbnVsbCE9dC5pZCYmKG4uaWQ9dC5pZCksbnVsbCE9dC5iYm94JiYobi5iYm94PXQuYmJveCksdC5wcm9wZXJ0aWVzKXtuLnByb3BlcnRpZXM9dC5wcm9wZXJ0aWVzO2JyZWFrfXJldHVybiBufWZ1bmN0aW9uIFdlKHQpe2lmKG51bGw9PXQpcmV0dXJue3R5cGU6bnVsbH07dmFyIGU9Ikdlb21ldHJ5Q29sbGVjdGlvbiI9PT10LnR5cGU/e3R5cGU6Ikdlb21ldHJ5Q29sbGVjdGlvbiIsZ2VvbWV0cmllczp0Lmdlb21ldHJpZXMubWFwKFdlKX06IlBvaW50Ij09PXQudHlwZXx8Ik11bHRpUG9pbnQiPT09dC50eXBlP3t0eXBlOnQudHlwZSxjb29yZGluYXRlczp0LmNvb3JkaW5hdGVzfTp7dHlwZTp0LnR5cGUsYXJjczp0LmNvb3JkaW5hdGVzfTtyZXR1cm4gbnVsbCE9dC5iYm94JiYoZS5iYm94PXQuYmJveCksZX1mdW5jdGlvbiBKZSh0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciBlPTEvMCxuPTEvMCxyPS0xLzAsaT0tMS8wO2Z1bmN0aW9uIG8odCl7bnVsbCE9dCYmRGUuY2FsbChzLHQudHlwZSkmJnNbdC50eXBlXSh0KX12YXIgcz17R2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQpe3QuZ2VvbWV0cmllcy5mb3JFYWNoKG8pfSxQb2ludDpmdW5jdGlvbih0KXthKHQuY29vcmRpbmF0ZXMpfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQpe3QuY29vcmRpbmF0ZXMuZm9yRWFjaChhKX0sTGluZVN0cmluZzpmdW5jdGlvbih0KXt1KHQuYXJjcyl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0KXt0LmFyY3MuZm9yRWFjaCh1KX0sUG9seWdvbjpmdW5jdGlvbih0KXt0LmFyY3MuZm9yRWFjaCh1KX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQpe3QuYXJjcy5mb3JFYWNoKGwpfX07ZnVuY3Rpb24gYSh0KXt2YXIgbz10WzBdLHM9dFsxXTtvPGUmJihlPW8pLG8+ciYmKHI9byksczxuJiYobj1zKSxzPmkmJihpPXMpfWZ1bmN0aW9uIHUodCl7dC5mb3JFYWNoKGEpfWZ1bmN0aW9uIGwodCl7dC5mb3JFYWNoKHUpfWZvcih2YXIgYyBpbiB0KW8odFtjXSk7cmV0dXJuIHI+PWUmJmk+PW4/W2UsbixyLGldOnZvaWQgMH0odD1YZSh0KSkscj1lPjAmJm4mJmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lWzBdLGk9ZVsxXSxvPWVbMl0scz1lWzNdLGE9by1yPyhuLTEpLyhvLXIpOjEsdT1zLWk/KG4tMSkvKHMtaSk6MTtmdW5jdGlvbiBsKHQpe3JldHVybltNYXRoLnJvdW5kKCh0WzBdLXIpKmEpLE1hdGgucm91bmQoKHRbMV0taSkqdSldfWZ1bmN0aW9uIGModCxlKXtmb3IodmFyIG4sbyxzLGwsYyxoPS0xLHA9MCxmPXQubGVuZ3RoLGc9bmV3IEFycmF5KGYpOysraDxmOyluPXRbaF0sbD1NYXRoLnJvdW5kKChuWzBdLXIpKmEpLGM9TWF0aC5yb3VuZCgoblsxXS1pKSp1KSxsPT09byYmYz09PXN8fChnW3ArK109W289bCxzPWNdKTtmb3IoZy5sZW5ndGg9cDtwPGU7KXA9Zy5wdXNoKFtnWzBdWzBdLGdbMF1bMV1dKTtyZXR1cm4gZ31mdW5jdGlvbiBoKHQpe3JldHVybiBjKHQsMil9ZnVuY3Rpb24gcCh0KXtyZXR1cm4gYyh0LDQpfWZ1bmN0aW9uIGYodCl7cmV0dXJuIHQubWFwKHApfWZ1bmN0aW9uIGcodCl7bnVsbCE9dCYmRGUuY2FsbChkLHQudHlwZSkmJmRbdC50eXBlXSh0KX12YXIgZD17R2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQpe3QuZ2VvbWV0cmllcy5mb3JFYWNoKGcpfSxQb2ludDpmdW5jdGlvbih0KXt0LmNvb3JkaW5hdGVzPWwodC5jb29yZGluYXRlcyl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCl7dC5jb29yZGluYXRlcz10LmNvb3JkaW5hdGVzLm1hcChsKX0sTGluZVN0cmluZzpmdW5jdGlvbih0KXt0LmFyY3M9aCh0LmFyY3MpfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCl7dC5hcmNzPXQuYXJjcy5tYXAoaCl9LFBvbHlnb246ZnVuY3Rpb24odCl7dC5hcmNzPWYodC5hcmNzKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQpe3QuYXJjcz10LmFyY3MubWFwKGYpfX07Zm9yKHZhciB5IGluIHQpZyh0W3ldKTtyZXR1cm57c2NhbGU6WzEvYSwxL3VdLHRyYW5zbGF0ZTpbcixpXX19KHQsbixlKSxpPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG89dC5jb29yZGluYXRlcyxzPXQubGluZXMsYT10LnJpbmdzLHU9cy5sZW5ndGgrYS5sZW5ndGg7Zm9yKGRlbGV0ZSB0LmxpbmVzLGRlbGV0ZSB0LnJpbmdzLHI9MCxpPXMubGVuZ3RoO3I8aTsrK3IpZm9yKGU9c1tyXTtlPWUubmV4dDspKyt1O2ZvcihyPTAsaT1hLmxlbmd0aDtyPGk7KytyKWZvcihuPWFbcl07bj1uLm5leHQ7KSsrdTt2YXIgbD1GZSgyKnUqMS40LHplLGtlKSxjPXQuYXJjcz1bXTtmb3Iocj0wLGk9cy5sZW5ndGg7cjxpOysrcil7ZT1zW3JdO2Rve2goZSl9d2hpbGUoZT1lLm5leHQpfWZvcihyPTAsaT1hLmxlbmd0aDtyPGk7KytyKWlmKChuPWFbcl0pLm5leHQpZG97aChuKX13aGlsZShuPW4ubmV4dCk7ZWxzZSBwKG4pO2Z1bmN0aW9uIGgodCl7dmFyIGUsbixyLGkscyxhLHUsaDtpZihyPWwuZ2V0KGU9b1t0WzBdXSkpZm9yKHU9MCxoPXIubGVuZ3RoO3U8aDsrK3UpaWYoZihpPXJbdV0sdCkpcmV0dXJuIHRbMF09aVswXSx2b2lkKHRbMV09aVsxXSk7aWYocz1sLmdldChuPW9bdFsxXV0pKWZvcih1PTAsaD1zLmxlbmd0aDt1PGg7Kyt1KWlmKGcoYT1zW3VdLHQpKXJldHVybiB0WzFdPWFbMF0sdm9pZCh0WzBdPWFbMV0pO3I/ci5wdXNoKHQpOmwuc2V0KGUsW3RdKSxzP3MucHVzaCh0KTpsLnNldChuLFt0XSksYy5wdXNoKHQpfWZ1bmN0aW9uIHAodCl7dmFyIGUsbixyLGkscztpZihuPWwuZ2V0KG9bdFswXV0pKWZvcihpPTAscz1uLmxlbmd0aDtpPHM7KytpKXtpZihkKHI9bltpXSx0KSlyZXR1cm4gdFswXT1yWzBdLHZvaWQodFsxXT1yWzFdKTtpZih5KHIsdCkpcmV0dXJuIHRbMF09clsxXSx2b2lkKHRbMV09clswXSl9aWYobj1sLmdldChlPW9bdFswXSt2KHQpXSkpZm9yKGk9MCxzPW4ubGVuZ3RoO2k8czsrK2kpe2lmKGQocj1uW2ldLHQpKXJldHVybiB0WzBdPXJbMF0sdm9pZCh0WzFdPXJbMV0pO2lmKHkocix0KSlyZXR1cm4gdFswXT1yWzFdLHZvaWQodFsxXT1yWzBdKX1uP24ucHVzaCh0KTpsLnNldChlLFt0XSksYy5wdXNoKHQpfWZ1bmN0aW9uIGYodCxlKXt2YXIgbj10WzBdLHI9ZVswXSxpPXRbMV07aWYobi1pIT1yLWVbMV0pcmV0dXJuITE7Zm9yKDtuPD1pOysrbiwrK3IpaWYoIWtlKG9bbl0sb1tyXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZyh0LGUpe3ZhciBuPXRbMF0scj1lWzBdLGk9dFsxXSxzPWVbMV07aWYobi1pIT1yLXMpcmV0dXJuITE7Zm9yKDtuPD1pOysrbiwtLXMpaWYoIWtlKG9bbl0sb1tzXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZCh0LGUpe3ZhciBuPXRbMF0scj1lWzBdLGk9dFsxXS1uO2lmKGkhPT1lWzFdLXIpcmV0dXJuITE7Zm9yKHZhciBzPXYodCksYT12KGUpLHU9MDt1PGk7Kyt1KWlmKCFrZShvW24rKHUrcyklaV0sb1tyKyh1K2EpJWldKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB5KHQsZSl7dmFyIG49dFswXSxyPWVbMF0saT10WzFdLHM9ZVsxXSxhPWktbjtpZihhIT09cy1yKXJldHVybiExO2Zvcih2YXIgdT12KHQpLGw9YS12KGUpLGM9MDtjPGE7KytjKWlmKCFrZShvW24rKGMrdSklYV0sb1tzLShjK2wpJWFdKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB2KHQpe2Zvcih2YXIgZT10WzBdLG49dFsxXSxyPWUsaT1yLHM9b1tyXTsrK3I8bjspe3ZhciBhPW9bcl07KGFbMF08c1swXXx8YVswXT09PXNbMF0mJmFbMV08c1sxXSkmJihpPXIscz1hKX1yZXR1cm4gaS1lfXJldHVybiB0fShmdW5jdGlvbih0KXt2YXIgZSxuLHIsaT1qZSh0KSxvPXQuY29vcmRpbmF0ZXMscz10LmxpbmVzLGE9dC5yaW5ncztmb3Iobj0wLHI9cy5sZW5ndGg7bjxyOysrbilmb3IodmFyIHU9c1tuXSxsPXVbMF0sYz11WzFdOysrbDxjOylpLmhhcyhvW2xdKSYmKGU9ezA6bCwxOnVbMV19LHVbMV09bCx1PXUubmV4dD1lKTtmb3Iobj0wLHI9YS5sZW5ndGg7bjxyOysrbilmb3IodmFyIGg9YVtuXSxwPWhbMF0sZj1wLGc9aFsxXSxkPWkuaGFzKG9bcF0pOysrZjxnOylpLmhhcyhvW2ZdKSYmKGQ/KGU9ezA6ZiwxOmhbMV19LGhbMV09ZixoPWgubmV4dD1lKTooVWUobyxwLGcsZy1mKSxvW2ddPW9bcF0sZD0hMCxmPXApKTtyZXR1cm4gdH0oZnVuY3Rpb24odCl7dmFyIGU9LTEsbj1bXSxyPVtdLGk9W107ZnVuY3Rpb24gbyh0KXt0JiZEZS5jYWxsKHMsdC50eXBlKSYmc1t0LnR5cGVdKHQpfXZhciBzPXtHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCl7dC5nZW9tZXRyaWVzLmZvckVhY2gobyl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCl7dC5hcmNzPWEodC5hcmNzKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQpe3QuYXJjcz10LmFyY3MubWFwKGEpfSxQb2x5Z29uOmZ1bmN0aW9uKHQpe3QuYXJjcz10LmFyY3MubWFwKHUpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCl7dC5hcmNzPXQuYXJjcy5tYXAobCl9fTtmdW5jdGlvbiBhKHQpe2Zvcih2YXIgcj0wLG89dC5sZW5ndGg7cjxvOysrcilpWysrZV09dFtyXTt2YXIgcz17MDplLW8rMSwxOmV9O3JldHVybiBuLnB1c2gocyksc31mdW5jdGlvbiB1KHQpe2Zvcih2YXIgbj0wLG89dC5sZW5ndGg7bjxvOysrbilpWysrZV09dFtuXTt2YXIgcz17MDplLW8rMSwxOmV9O3JldHVybiByLnB1c2gocyksc31mdW5jdGlvbiBsKHQpe3JldHVybiB0Lm1hcCh1KX1mb3IodmFyIGMgaW4gdClvKHRbY10pO3JldHVybnt0eXBlOiJUb3BvbG9neSIsY29vcmRpbmF0ZXM6aSxsaW5lczpuLHJpbmdzOnIsb2JqZWN0czp0fX0odCkpKSxvPWkuY29vcmRpbmF0ZXMscz1GZSgxLjQqaS5hcmNzLmxlbmd0aCxaZSxLZSk7ZnVuY3Rpb24gYSh0KXt0JiZEZS5jYWxsKHUsdC50eXBlKSYmdVt0LnR5cGVdKHQpfXQ9aS5vYmplY3RzLGkuYmJveD1uLGkuYXJjcz1pLmFyY3MubWFwKChmdW5jdGlvbih0LGUpe3JldHVybiBzLnNldCh0LGUpLG8uc2xpY2UodFswXSx0WzFdKzEpfSkpLGRlbGV0ZSBpLmNvb3JkaW5hdGVzLG89bnVsbDt2YXIgdT17R2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQpe3QuZ2VvbWV0cmllcy5mb3JFYWNoKGEpfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQpe3QuYXJjcz1sKHQuYXJjcyl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0KXt0LmFyY3M9dC5hcmNzLm1hcChsKX0sUG9seWdvbjpmdW5jdGlvbih0KXt0LmFyY3M9dC5hcmNzLm1hcChsKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQpe3QuYXJjcz10LmFyY3MubWFwKGMpfX07ZnVuY3Rpb24gbCh0KXt2YXIgZT1bXTtkb3t2YXIgbj1zLmdldCh0KTtlLnB1c2godFswXTx0WzFdP246fm4pfXdoaWxlKHQ9dC5uZXh0KTtyZXR1cm4gZX1mdW5jdGlvbiBjKHQpe3JldHVybiB0Lm1hcChsKX1mb3IodmFyIGggaW4gdClhKHRbaF0pO3JldHVybiByJiYoaS50cmFuc2Zvcm09cixpLmFyY3M9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPS0xLG49dC5sZW5ndGg7KytlPG47KXtmb3IodmFyIHIsaSxvPXRbZV0scz0wLGE9MSx1PW8ubGVuZ3RoLGw9b1swXSxjPWxbMF0saD1sWzFdOysrczx1OylyPShsPW9bc10pWzBdLGk9bFsxXSxyPT09YyYmaT09PWh8fChvW2ErK109W3ItYyxpLWhdLGM9cixoPWkpOzE9PT1hJiYob1thKytdPVswLDBdKSxvLmxlbmd0aD1hfXJldHVybiB0fShpLmFyY3MpKSxpfWZ1bmN0aW9uIFplKHQpe3ZhciBlLG49dFswXSxyPXRbMV07cmV0dXJuIHI8biYmKGU9bixuPXIscj1lKSxuKzMxKnJ9ZnVuY3Rpb24gS2UodCxlKXt2YXIgbixyPXRbMF0saT10WzFdLG89ZVswXSxzPWVbMV07cmV0dXJuIGk8ciYmKG49cixyPWksaT1uKSxzPG8mJihuPW8sbz1zLHM9bikscj09PW8mJmk9PT1zfWZ1bmN0aW9uIFFlKHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9e30pLCJGZWF0dXJlQ29sbGVjdGlvbiIhPT1pdCh0KSl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gbXVzdCBiZSBhIEZlYXR1cmVDb2xsZWN0aW9uIik7aWYoIXQuZmVhdHVyZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyBlbXB0eSIpOyExIT09ZS5tdXRhdGUmJnZvaWQgMCE9PWUubXV0YXRlfHwodD1JZSh0KSk7dmFyIG49W107eih0LChmdW5jdGlvbih0KXtuLnB1c2godC5nZW9tZXRyeSl9KSk7dmFyIHI9SmUoe2dlb21zOnYobikuZ2VvbWV0cnl9KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIFJlKHQsQWUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0ocixyLm9iamVjdHMuZ2VvbXMuZ2VvbWV0cmllcyl9ZnVuY3Rpb24gJGUodCxlKXtpZih2b2lkIDA9PT1lJiYoZT17fSksIVAoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj1lLm11dGF0ZTtpZigiRmVhdHVyZUNvbGxlY3Rpb24iIT09aXQodCkpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIG11c3QgYmUgYSBGZWF0dXJlQ29sbGVjdGlvbiIpO2lmKCF0LmZlYXR1cmVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgZW1wdHkiKTshMSE9PW4mJnZvaWQgMCE9PW58fCh0PUllKHQpKTt2YXIgcj1mdW5jdGlvbih0KXt2YXIgZT17fTt6KHQsKGZ1bmN0aW9uKHQpe2VbdC5nZW9tZXRyeS50eXBlXT0hMH0pKTt2YXIgbj1PYmplY3Qua2V5cyhlKTtpZigxPT09bi5sZW5ndGgpcmV0dXJuIG5bMF07cmV0dXJuIG51bGx9KHQpO2lmKCFyKXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBtdXN0IGJlIGhvbW9nZW5vdXMiKTt2YXIgaT10O3N3aXRjaChyKXtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBNZShpLGUpO2Nhc2UiUG9seWdvbiI6cmV0dXJuIFFlKGksZSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IocisiIGlzIG5vdCBzdXBwb3J0ZWQiKX19ZnVuY3Rpb24gdG4odCxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49Im9iamVjdCI9PXR5cGVvZiBlP2UubXV0YXRlOmU7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7dmFyIHI9aXQodCksaT1bXTtzd2l0Y2gocil7Y2FzZSJMaW5lU3RyaW5nIjppPWVuKHQpO2JyZWFrO2Nhc2UiTXVsdGlMaW5lU3RyaW5nIjpjYXNlIlBvbHlnb24iOlEodCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5wdXNoKGVuKHQpKX0pKTticmVhaztjYXNlIk11bHRpUG9seWdvbiI6USh0KS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1bXTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2UucHVzaChlbih0KSl9KSksaS5wdXNoKGUpfSkpO2JyZWFrO2Nhc2UiUG9pbnQiOnJldHVybiB0O2Nhc2UiTXVsdGlQb2ludCI6dmFyIHM9e307USh0KS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LmpvaW4oIi0iKTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyxlKXx8KGkucHVzaCh0KSxzW2VdPSEwKX0pKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihyKyIgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpfXJldHVybiB0LmNvb3JkaW5hdGVzPyEwPT09bj8odC5jb29yZGluYXRlcz1pLHQpOnt0eXBlOnIsY29vcmRpbmF0ZXM6aX06ITA9PT1uPyh0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzPWksdCk6byh7dHlwZTpyLGNvb3JkaW5hdGVzOml9LHQucHJvcGVydGllcyx7YmJveDp0LmJib3gsaWQ6dC5pZH0pfWZ1bmN0aW9uIGVuKHQpe3ZhciBlPVEodCk7aWYoMj09PWUubGVuZ3RoJiYhbm4oZVswXSxlWzFdKSlyZXR1cm4gZTt2YXIgbj1bXSxyPWUubGVuZ3RoLTEsaT1uLmxlbmd0aDtuLnB1c2goZVswXSk7Zm9yKHZhciBvPTE7bzxyO28rKyl7dmFyIHM9bltuLmxlbmd0aC0xXTtlW29dWzBdPT09c1swXSYmZVtvXVsxXT09PXNbMV18fChuLnB1c2goZVtvXSksKGk9bi5sZW5ndGgpPjImJnJuKG5baS0zXSxuW2ktMV0sbltpLTJdKSYmbi5zcGxpY2Uobi5sZW5ndGgtMiwxKSl9aWYobi5wdXNoKGVbZS5sZW5ndGgtMV0pLGk9bi5sZW5ndGgsbm4oZVswXSxlW2UubGVuZ3RoLTFdKSYmaTw0KXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBwb2x5Z29uIik7cmV0dXJuIHJuKG5baS0zXSxuW2ktMV0sbltpLTJdKSYmbi5zcGxpY2Uobi5sZW5ndGgtMiwxKSxufWZ1bmN0aW9uIG5uKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX1mdW5jdGlvbiBybih0LGUsbil7dmFyIHI9blswXSxpPW5bMV0sbz10WzBdLHM9dFsxXSxhPWVbMF0sdT1lWzFdLGw9YS1vLGM9dS1zO3JldHVybiAwPT09KHItbykqYy0oaS1zKSpsJiYoTWF0aC5hYnMobCk+PU1hdGguYWJzKGMpP2w+MD9vPD1yJiZyPD1hOmE8PXImJnI8PW86Yz4wP3M8PWkmJmk8PXU6dTw9aSYmaTw9cyl9ZnVuY3Rpb24gb24odCxlLG4pe3ZhciByPWUueCxpPWUueSxvPW4ueC1yLHM9bi55LWk7aWYoMCE9PW98fDAhPT1zKXt2YXIgYT0oKHQueC1yKSpvKyh0LnktaSkqcykvKG8qbytzKnMpO2E+MT8ocj1uLngsaT1uLnkpOmE+MCYmKHIrPW8qYSxpKz1zKmEpfXJldHVybihvPXQueC1yKSpvKyhzPXQueS1pKSpzfWZ1bmN0aW9uIHNuKHQsZSxuLHIsaSl7Zm9yKHZhciBvLHM9cixhPWUrMTthPG47YSsrKXt2YXIgdT1vbih0W2FdLHRbZV0sdFtuXSk7dT5zJiYobz1hLHM9dSl9cz5yJiYoby1lPjEmJnNuKHQsZSxvLHIsaSksaS5wdXNoKHRbb10pLG4tbz4xJiZzbih0LG8sbixyLGkpKX1mdW5jdGlvbiBhbih0LGUpe3ZhciBuPXQubGVuZ3RoLTEscj1bdFswXV07cmV0dXJuIHNuKHQsMCxuLGUsciksci5wdXNoKHRbbl0pLHJ9ZnVuY3Rpb24gdW4odCxlLG4pe2lmKHQubGVuZ3RoPD0yKXJldHVybiB0O3ZhciByPXZvaWQgMCE9PWU/ZSplOjE7cmV0dXJuIHQ9YW4odD1uP3Q6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixpLG8scyxhPXRbMF0sdT1bYV0sbD0xLGM9dC5sZW5ndGg7bDxjO2wrKyluPXRbbF0saT1hLG89dm9pZCAwLHM9dm9pZCAwLG89KHI9bikueC1pLngscz1yLnktaS55LG8qbytzKnM+ZSYmKHUucHVzaChuKSxhPW4pO3JldHVybiBhIT09biYmdS5wdXNoKG4pLHV9KHQscikscil9ZnVuY3Rpb24gbG4odCxlLG4pe3JldHVybiB1bih0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3g6dFswXSx5OnRbMV0sejp0WzJdfX0pKSxlLG4pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuej9bdC54LHQueSx0LnpdOlt0LngsdC55XX0pKX1mdW5jdGlvbiBjbih0LGUsbil7cmV0dXJuIHQubWFwKChmdW5jdGlvbih0KXt2YXIgcj10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3g6dFswXSx5OnRbMV19fSkpO2lmKHIubGVuZ3RoPDQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHBvbHlnb24iKTtmb3IodmFyIGk9dW4ocixlLG4pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuW3QueCx0LnldfSkpOyFobihpKTspaT11bihyLGUtPS4wMSplLG4pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuW3QueCx0LnldfSkpO3JldHVybiBpW2kubGVuZ3RoLTFdWzBdPT09aVswXVswXSYmaVtpLmxlbmd0aC0xXVsxXT09PWlbMF1bMV18fGkucHVzaChpWzBdKSxpfSkpfWZ1bmN0aW9uIGhuKHQpe3JldHVybiEodC5sZW5ndGg8MykmJiEoMz09PXQubGVuZ3RoJiZ0WzJdWzBdPT09dFswXVswXSYmdFsyXVsxXT09PXRbMF1bMV0pfXZhciBwbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5wb2ludHM9dC5wb2ludHN8fFtdLHRoaXMuZHVyYXRpb249dC5kdXJhdGlvbnx8MWU0LHRoaXMuc2hhcnBuZXNzPXQuc2hhcnBuZXNzfHwuODUsdGhpcy5jZW50ZXJzPVtdLHRoaXMuY29udHJvbHM9W10sdGhpcy5zdGVwTGVuZ3RoPXQuc3RlcExlbmd0aHx8NjAsdGhpcy5sZW5ndGg9dGhpcy5wb2ludHMubGVuZ3RoLHRoaXMuZGVsYXk9MDtmb3IodmFyIGU9MDtlPHRoaXMubGVuZ3RoO2UrKyl0aGlzLnBvaW50c1tlXS56PXRoaXMucG9pbnRzW2VdLnp8fDA7Zm9yKGU9MDtlPHRoaXMubGVuZ3RoLTE7ZSsrKXt2YXIgbj10aGlzLnBvaW50c1tlXSxyPXRoaXMucG9pbnRzW2UrMV07dGhpcy5jZW50ZXJzLnB1c2goe3g6KG4ueCtyLngpLzIseToobi55K3IueSkvMix6OihuLnorci56KS8yfSl9dGhpcy5jb250cm9scy5wdXNoKFt0aGlzLnBvaW50c1swXSx0aGlzLnBvaW50c1swXV0pO2ZvcihlPTA7ZTx0aGlzLmNlbnRlcnMubGVuZ3RoLTE7ZSsrKXt2YXIgaT10aGlzLnBvaW50c1tlKzFdLngtKHRoaXMuY2VudGVyc1tlXS54K3RoaXMuY2VudGVyc1tlKzFdLngpLzIsbz10aGlzLnBvaW50c1tlKzFdLnktKHRoaXMuY2VudGVyc1tlXS55K3RoaXMuY2VudGVyc1tlKzFdLnkpLzIscz10aGlzLnBvaW50c1tlKzFdLnotKHRoaXMuY2VudGVyc1tlXS55K3RoaXMuY2VudGVyc1tlKzFdLnopLzI7dGhpcy5jb250cm9scy5wdXNoKFt7eDooMS10aGlzLnNoYXJwbmVzcykqdGhpcy5wb2ludHNbZSsxXS54K3RoaXMuc2hhcnBuZXNzKih0aGlzLmNlbnRlcnNbZV0ueCtpKSx5OigxLXRoaXMuc2hhcnBuZXNzKSp0aGlzLnBvaW50c1tlKzFdLnkrdGhpcy5zaGFycG5lc3MqKHRoaXMuY2VudGVyc1tlXS55K28pLHo6KDEtdGhpcy5zaGFycG5lc3MpKnRoaXMucG9pbnRzW2UrMV0ueit0aGlzLnNoYXJwbmVzcyoodGhpcy5jZW50ZXJzW2VdLnorcyl9LHt4OigxLXRoaXMuc2hhcnBuZXNzKSp0aGlzLnBvaW50c1tlKzFdLngrdGhpcy5zaGFycG5lc3MqKHRoaXMuY2VudGVyc1tlKzFdLngraSkseTooMS10aGlzLnNoYXJwbmVzcykqdGhpcy5wb2ludHNbZSsxXS55K3RoaXMuc2hhcnBuZXNzKih0aGlzLmNlbnRlcnNbZSsxXS55K28pLHo6KDEtdGhpcy5zaGFycG5lc3MpKnRoaXMucG9pbnRzW2UrMV0ueit0aGlzLnNoYXJwbmVzcyoodGhpcy5jZW50ZXJzW2UrMV0ueitzKX1dKX1yZXR1cm4gdGhpcy5jb250cm9scy5wdXNoKFt0aGlzLnBvaW50c1t0aGlzLmxlbmd0aC0xXSx0aGlzLnBvaW50c1t0aGlzLmxlbmd0aC0xXV0pLHRoaXMuc3RlcHM9dGhpcy5jYWNoZVN0ZXBzKHRoaXMuc3RlcExlbmd0aCksdGhpc31yZXR1cm4gdC5wcm90b3R5cGUuY2FjaGVTdGVwcz1mdW5jdGlvbih0KXt2YXIgZT1bXSxuPXRoaXMucG9zKDApO2UucHVzaCgwKTtmb3IodmFyIHI9MDtyPHRoaXMuZHVyYXRpb247cis9MTApe3ZhciBpPXRoaXMucG9zKHIpO01hdGguc3FydCgoaS54LW4ueCkqKGkueC1uLngpKyhpLnktbi55KSooaS55LW4ueSkrKGkuei1uLnopKihpLnotbi56KSk+dCYmKGUucHVzaChyKSxuPWkpfXJldHVybiBlfSx0LnByb3RvdHlwZS52ZWN0b3I9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wb3ModCsxMCksbj10aGlzLnBvcyh0LTEwKTtyZXR1cm57YW5nbGU6MTgwKk1hdGguYXRhbjIoZS55LW4ueSxlLngtbi54KS8zLjE0LHNwZWVkOk1hdGguc3FydCgobi54LWUueCkqKG4ueC1lLngpKyhuLnktZS55KSoobi55LWUueSkrKG4uei1lLnopKihuLnotZS56KSl9fSx0LnByb3RvdHlwZS5wb3M9ZnVuY3Rpb24odCl7dmFyIGU9dC10aGlzLmRlbGF5O2U8MCYmKGU9MCksZT50aGlzLmR1cmF0aW9uJiYoZT10aGlzLmR1cmF0aW9uLTEpO3ZhciBuPWUvdGhpcy5kdXJhdGlvbjtpZihuPj0xKXJldHVybiB0aGlzLnBvaW50c1t0aGlzLmxlbmd0aC0xXTt2YXIgcj1NYXRoLmZsb29yKCh0aGlzLnBvaW50cy5sZW5ndGgtMSkqbik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89ZnVuY3Rpb24odCl7dmFyIGU9dCp0O3JldHVybltlKnQsMyplKigxLXQpLDMqdCooMS10KSooMS10KSwoMS10KSooMS10KSooMS10KV19KHQpO3JldHVybnt4OmkueCpvWzBdK3IueCpvWzFdK24ueCpvWzJdK2UueCpvWzNdLHk6aS55Km9bMF0rci55Km9bMV0rbi55Km9bMl0rZS55Km9bM10sejppLnoqb1swXStyLnoqb1sxXStuLnoqb1syXStlLnoqb1szXX19KCh0aGlzLmxlbmd0aC0xKSpuLXIsdGhpcy5wb2ludHNbcl0sdGhpcy5jb250cm9sc1tyXVsxXSx0aGlzLmNvbnRyb2xzW3IrMV1bMF0sdGhpcy5wb2ludHNbcisxXSl9LHR9KCk7ZnVuY3Rpb24gZm4odCxlKXt2b2lkIDA9PT1lJiYoZT17fSk7Zm9yKHZhciBuPWUucmVzb2x1dGlvbnx8MWU0LHI9ZS5zaGFycG5lc3N8fC44NSxpPVtdLG89cnQodCkuY29vcmRpbmF0ZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm57eDp0WzBdLHk6dFsxXX19KSkscz1uZXcgcG4oe2R1cmF0aW9uOm4scG9pbnRzOm8sc2hhcnBuZXNzOnJ9KSxhPWZ1bmN0aW9uKHQpe3ZhciBlPXMucG9zKHQpO01hdGguZmxvb3IodC8xMDApJTI9PTAmJmkucHVzaChbZS54LGUueV0pfSx1PTA7dTxzLmR1cmF0aW9uO3UrPTEwKWEodSk7cmV0dXJuIGEocy5kdXJhdGlvbiksaChpLGUucHJvcGVydGllcyl9ZnVuY3Rpb24gZ24odCxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49TnVtYmVyKHRbMF0pLHI9TnVtYmVyKHRbMV0pLGk9TnVtYmVyKHRbMl0pLG89TnVtYmVyKHRbM10pO2lmKDY9PT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkB0dXJmL2Jib3gtcG9seWdvbiBkb2VzIG5vdCBzdXBwb3J0IEJCb3ggd2l0aCA2IHBvc2l0aW9ucyIpO3ZhciBzPVtuLHJdO3JldHVybiBsKFtbcyxbaSxyXSxbaSxvXSxbbixvXSxzXV0sZS5wcm9wZXJ0aWVzLHtiYm94OnQsaWQ6ZS5pZH0pfWZ1bmN0aW9uIGRuKHQpe3JldHVybiBnbihaKHQpKX1mdW5jdGlvbiB5bih0KXt2YXIgZT10WzBdLG49dFsxXSxyPXRbMl0saT10WzNdO2lmKG1lKHQuc2xpY2UoMCwyKSxbcixuXSk+PW1lKHQuc2xpY2UoMCwyKSxbZSxpXSkpe3ZhciBvPShuK2kpLzI7cmV0dXJuW2Usby0oci1lKS8yLHIsbysoci1lKS8yXX12YXIgcz0oZStyKS8yO3JldHVybltzLShpLW4pLzIsbixzKyhpLW4pLzIsaV19ZnVuY3Rpb24gdm4odCxlLG4scil7dm9pZCAwPT09ciYmKHI9e30pO3ZhciBpPUsodCksbz1JKGlbMF0pLHM9SShpWzFdKSx1PUkobiksbD14KGUsci51bml0cyksYz1NYXRoLmFzaW4oTWF0aC5zaW4ocykqTWF0aC5jb3MobCkrTWF0aC5jb3MocykqTWF0aC5zaW4obCkqTWF0aC5jb3ModSkpO3JldHVybiBhKFt3KG8rTWF0aC5hdGFuMihNYXRoLnNpbih1KSpNYXRoLnNpbihsKSpNYXRoLmNvcyhzKSxNYXRoLmNvcyhsKS1NYXRoLnNpbihzKSpNYXRoLnNpbihjKSkpLHcoYyldLHIucHJvcGVydGllcyl9ZnVuY3Rpb24gX24odCxlLG4pe3ZvaWQgMD09PW4mJihuPXt9KTtmb3IodmFyIHI9bi5zdGVwc3x8NjQsaT1uLnByb3BlcnRpZXM/bi5wcm9wZXJ0aWVzOiFBcnJheS5pc0FycmF5KHQpJiYiRmVhdHVyZSI9PT10LnR5cGUmJnQucHJvcGVydGllcz90LnByb3BlcnRpZXM6e30sbz1bXSxzPTA7czxyO3MrKylvLnB1c2godm4odCxlLC0zNjAqcy9yLG4pLmdlb21ldHJ5LmNvb3JkaW5hdGVzKTtyZXR1cm4gby5wdXNoKG9bMF0pLGwoW29dLGkpfWZ1bmN0aW9uIG1uKHQsZSxuKXtpZih2b2lkIDA9PT1uJiYobj17fSksITA9PT1uLmZpbmFsKXJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPW1uKGUsdCk7cmV0dXJuIG49KG4rMTgwKSUzNjB9KHQsZSk7dmFyIHI9Syh0KSxpPUsoZSksbz1JKHJbMF0pLHM9SShpWzBdKSxhPUkoclsxXSksdT1JKGlbMV0pLGw9TWF0aC5zaW4ocy1vKSpNYXRoLmNvcyh1KSxjPU1hdGguY29zKGEpKk1hdGguc2luKHUpLU1hdGguc2luKGEpKk1hdGguY29zKHUpKk1hdGguY29zKHMtbyk7cmV0dXJuIHcoTWF0aC5hdGFuMihsLGMpKX1mdW5jdGlvbiB4bih0LGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1aKHQpO3JldHVybiBhKFsoblswXStuWzJdKS8yLChuWzFdK25bM10pLzJdLGUucHJvcGVydGllcyxlKX1mdW5jdGlvbiBFbih0LGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj0wLHI9MCxpPTA7cmV0dXJuIFIodCwoZnVuY3Rpb24odCl7bis9dFswXSxyKz10WzFdLGkrK30pLCEwKSxhKFtuL2ksci9pXSxlLnByb3BlcnRpZXMpfWZ1bmN0aW9uIGJuKHQpe3ZhciBlPVtdO3JldHVybiJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGU/Rih0LChmdW5jdGlvbih0KXtSKHQsKGZ1bmN0aW9uKG4pe2UucHVzaChhKG4sdC5wcm9wZXJ0aWVzKSl9KSl9KSk6Uih0LChmdW5jdGlvbihuKXtlLnB1c2goYShuLHQucHJvcGVydGllcykpfSkpLGYoZSl9dmFyIHduPU5uLEluPU5uO2Z1bmN0aW9uIE5uKHQsZSxuKXtuPW58fDI7dmFyIHIsaSxvLHMsYSx1LGwsYz1lJiZlLmxlbmd0aCxoPWM/ZVswXSpuOnQubGVuZ3RoLHA9U24odCwwLGgsbiwhMCksZj1bXTtpZighcClyZXR1cm4gZjtpZihjJiYocD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvLHMsYT1bXTtmb3IoaT0wLG89ZS5sZW5ndGg7aTxvO2krKykocz1Tbih0LGVbaV0qcixpPG8tMT9lW2krMV0qcjp0Lmxlbmd0aCxyLCExKSk9PT1zLm5leHQmJihzLnN0ZWluZXI9ITApLGEucHVzaChGbihzKSk7Zm9yKGEuc29ydChUbiksaT0wO2k8YS5sZW5ndGg7aSsrKUFuKGFbaV0sbiksbj1DbihuLG4ubmV4dCk7cmV0dXJuIG59KHQsZSxwLG4pKSx0Lmxlbmd0aD44MCpuKXtyPW89dFswXSxpPXM9dFsxXTtmb3IodmFyIGc9bjtnPGg7Zys9bikoYT10W2ddKTxyJiYocj1hKSwodT10W2crMV0pPGkmJihpPXUpLGE+byYmKG89YSksdT5zJiYocz11KTtsPTAhPT0obD1NYXRoLm1heChvLXIscy1pKSk/MS9sOjB9cmV0dXJuIFBuKHAsZixuLHIsaSxsKSxmfWZ1bmN0aW9uIFNuKHQsZSxuLHIsaSl7dmFyIG8scztpZihpPT09SG4odCxlLG4scik+MClmb3Iobz1lO288bjtvKz1yKXM9Vm4obyx0W29dLHRbbysxXSxzKTtlbHNlIGZvcihvPW4tcjtvPj1lO28tPXIpcz1WbihvLHRbb10sdFtvKzFdLHMpO3JldHVybiBzJiZCbihzLHMubmV4dCkmJihYbihzKSxzPXMubmV4dCksc31mdW5jdGlvbiBDbih0LGUpe2lmKCF0KXJldHVybiB0O2V8fChlPXQpO3ZhciBuLHI9dDtkb3tpZihuPSExLHIuc3RlaW5lcnx8IUJuKHIsci5uZXh0KSYmMCE9PXFuKHIucHJldixyLHIubmV4dCkpcj1yLm5leHQ7ZWxzZXtpZihYbihyKSwocj1lPXIucHJldik9PT1yLm5leHQpYnJlYWs7bj0hMH19d2hpbGUobnx8ciE9PWUpO3JldHVybiBlfWZ1bmN0aW9uIFBuKHQsZSxuLHIsaSxvLHMpe2lmKHQpeyFzJiZvJiZmdW5jdGlvbih0LGUsbixyKXt2YXIgaT10O2Rve251bGw9PT1pLnomJihpLno9RG4oaS54LGkueSxlLG4scikpLGkucHJldlo9aS5wcmV2LGkubmV4dFo9aS5uZXh0LGk9aS5uZXh0fXdoaWxlKGkhPT10KTtpLnByZXZaLm5leHRaPW51bGwsaS5wcmV2Wj1udWxsLGZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhLHUsbD0xO2Rve2ZvcihuPXQsdD1udWxsLG89bnVsbCxzPTA7bjspe2ZvcihzKysscj1uLGE9MCxlPTA7ZTxsJiYoYSsrLHI9ci5uZXh0Wik7ZSsrKTtmb3IodT1sO2E+MHx8dT4wJiZyOykwIT09YSYmKDA9PT11fHwhcnx8bi56PD1yLnopPyhpPW4sbj1uLm5leHRaLGEtLSk6KGk9cixyPXIubmV4dFosdS0tKSxvP28ubmV4dFo9aTp0PWksaS5wcmV2Wj1vLG89aTtuPXJ9by5uZXh0Wj1udWxsLGwqPTJ9d2hpbGUocz4xKX0oaSl9KHQscixpLG8pO2Zvcih2YXIgYSx1LGw9dDt0LnByZXYhPT10Lm5leHQ7KWlmKGE9dC5wcmV2LHU9dC5uZXh0LG8/TG4odCxyLGksbyk6TW4odCkpZS5wdXNoKGEuaS9uKSxlLnB1c2godC5pL24pLGUucHVzaCh1LmkvbiksWG4odCksdD11Lm5leHQsbD11Lm5leHQ7ZWxzZSBpZigodD11KT09PWwpe3M/MT09PXM/UG4odD1Pbih0LGUsbiksZSxuLHIsaSxvLDIpOjI9PT1zJiZSbih0LGUsbixyLGksbyk6UG4oQ24odCksZSxuLHIsaSxvLDEpO2JyZWFrfX19ZnVuY3Rpb24gTW4odCl7dmFyIGU9dC5wcmV2LG49dCxyPXQubmV4dDtpZihxbihlLG4scik+PTApcmV0dXJuITE7Zm9yKHZhciBpPXQubmV4dC5uZXh0O2khPT10LnByZXY7KXtpZihrbihlLngsZS55LG4ueCxuLnksci54LHIueSxpLngsaS55KSYmcW4oaS5wcmV2LGksaS5uZXh0KT49MClyZXR1cm4hMTtpPWkubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBMbih0LGUsbixyKXt2YXIgaT10LnByZXYsbz10LHM9dC5uZXh0O2lmKHFuKGksbyxzKT49MClyZXR1cm4hMTtmb3IodmFyIGE9aS54PG8ueD9pLng8cy54P2kueDpzLng6by54PHMueD9vLng6cy54LHU9aS55PG8ueT9pLnk8cy55P2kueTpzLnk6by55PHMueT9vLnk6cy55LGw9aS54Pm8ueD9pLng+cy54P2kueDpzLng6by54PnMueD9vLng6cy54LGM9aS55Pm8ueT9pLnk+cy55P2kueTpzLnk6by55PnMueT9vLnk6cy55LGg9RG4oYSx1LGUsbixyKSxwPURuKGwsYyxlLG4sciksZj10LnByZXZaLGc9dC5uZXh0WjtmJiZmLno+PWgmJmcmJmcuejw9cDspe2lmKGYhPT10LnByZXYmJmYhPT10Lm5leHQmJmtuKGkueCxpLnksby54LG8ueSxzLngscy55LGYueCxmLnkpJiZxbihmLnByZXYsZixmLm5leHQpPj0wKXJldHVybiExO2lmKGY9Zi5wcmV2WixnIT09dC5wcmV2JiZnIT09dC5uZXh0JiZrbihpLngsaS55LG8ueCxvLnkscy54LHMueSxnLngsZy55KSYmcW4oZy5wcmV2LGcsZy5uZXh0KT49MClyZXR1cm4hMTtnPWcubmV4dFp9Zm9yKDtmJiZmLno+PWg7KXtpZihmIT09dC5wcmV2JiZmIT09dC5uZXh0JiZrbihpLngsaS55LG8ueCxvLnkscy54LHMueSxmLngsZi55KSYmcW4oZi5wcmV2LGYsZi5uZXh0KT49MClyZXR1cm4hMTtmPWYucHJldlp9Zm9yKDtnJiZnLno8PXA7KXtpZihnIT09dC5wcmV2JiZnIT09dC5uZXh0JiZrbihpLngsaS55LG8ueCxvLnkscy54LHMueSxnLngsZy55KSYmcW4oZy5wcmV2LGcsZy5uZXh0KT49MClyZXR1cm4hMTtnPWcubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gT24odCxlLG4pe3ZhciByPXQ7ZG97dmFyIGk9ci5wcmV2LG89ci5uZXh0Lm5leHQ7IUJuKGksbykmJnpuKGkscixyLm5leHQsbykmJmpuKGksbykmJmpuKG8saSkmJihlLnB1c2goaS5pL24pLGUucHVzaChyLmkvbiksZS5wdXNoKG8uaS9uKSxYbihyKSxYbihyLm5leHQpLHI9dD1vKSxyPXIubmV4dH13aGlsZShyIT09dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gUm4odCxlLG4scixpLG8pe3ZhciBzPXQ7ZG97Zm9yKHZhciBhPXMubmV4dC5uZXh0O2EhPT1zLnByZXY7KXtpZihzLmkhPT1hLmkmJkduKHMsYSkpe3ZhciB1PVVuKHMsYSk7cmV0dXJuIHM9Q24ocyxzLm5leHQpLHU9Q24odSx1Lm5leHQpLFBuKHMsZSxuLHIsaSxvKSx2b2lkIFBuKHUsZSxuLHIsaSxvKX1hPWEubmV4dH1zPXMubmV4dH13aGlsZShzIT09dCl9ZnVuY3Rpb24gVG4odCxlKXtyZXR1cm4gdC54LWUueH1mdW5jdGlvbiBBbih0LGUpe2lmKGU9ZnVuY3Rpb24odCxlKXt2YXIgbixyPWUsaT10Lngsbz10Lnkscz0tMS8wO2Rve2lmKG88PXIueSYmbz49ci5uZXh0LnkmJnIubmV4dC55IT09ci55KXt2YXIgYT1yLngrKG8tci55KSooci5uZXh0Lngtci54KS8oci5uZXh0Lnktci55KTtpZihhPD1pJiZhPnMpe2lmKHM9YSxhPT09aSl7aWYobz09PXIueSlyZXR1cm4gcjtpZihvPT09ci5uZXh0LnkpcmV0dXJuIHIubmV4dH1uPXIueDxyLm5leHQueD9yOnIubmV4dH19cj1yLm5leHR9d2hpbGUociE9PWUpO2lmKCFuKXJldHVybiBudWxsO2lmKGk9PT1zKXJldHVybiBuLnByZXY7dmFyIHUsbD1uLGM9bi54LGg9bi55LHA9MS8wO3I9bi5uZXh0O2Zvcig7ciE9PWw7KWk+PXIueCYmci54Pj1jJiZpIT09ci54JiZrbihvPGg/aTpzLG8sYyxoLG88aD9zOmksbyxyLngsci55KSYmKCh1PU1hdGguYWJzKG8tci55KS8oaS1yLngpKTxwfHx1PT09cCYmci54Pm4ueCkmJmpuKHIsdCkmJihuPXIscD11KSxyPXIubmV4dDtyZXR1cm4gbn0odCxlKSl7dmFyIG49VW4oZSx0KTtDbihuLG4ubmV4dCl9fWZ1bmN0aW9uIERuKHQsZSxuLHIsaSl7cmV0dXJuKHQ9MTQzMTY1NTc2NSYoKHQ9ODU4OTkzNDU5JigodD0yNTI2NDUxMzUmKCh0PTE2NzExOTM1JigodD0zMjc2NyoodC1uKSppKXx0PDw4KSl8dDw8NCkpfHQ8PDIpKXx0PDwxKSl8KGU9MTQzMTY1NTc2NSYoKGU9ODU4OTkzNDU5JigoZT0yNTI2NDUxMzUmKChlPTE2NzExOTM1JigoZT0zMjc2NyooZS1yKSppKXxlPDw4KSl8ZTw8NCkpfGU8PDIpKXxlPDwxKSk8PDF9ZnVuY3Rpb24gRm4odCl7dmFyIGU9dCxuPXQ7ZG97ZS54PG4ueCYmKG49ZSksZT1lLm5leHR9d2hpbGUoZSE9PXQpO3JldHVybiBufWZ1bmN0aW9uIGtuKHQsZSxuLHIsaSxvLHMsYSl7cmV0dXJuKGktcykqKGUtYSktKHQtcykqKG8tYSk+PTAmJih0LXMpKihyLWEpLShuLXMpKihlLWEpPj0wJiYobi1zKSooby1hKS0oaS1zKSooci1hKT49MH1mdW5jdGlvbiBHbih0LGUpe3JldHVybiB0Lm5leHQuaSE9PWUuaSYmdC5wcmV2LmkhPT1lLmkmJiFmdW5jdGlvbih0LGUpe3ZhciBuPXQ7ZG97aWYobi5pIT09dC5pJiZuLm5leHQuaSE9PXQuaSYmbi5pIT09ZS5pJiZuLm5leHQuaSE9PWUuaSYmem4obixuLm5leHQsdCxlKSlyZXR1cm4hMDtuPW4ubmV4dH13aGlsZShuIT09dCk7cmV0dXJuITF9KHQsZSkmJmpuKHQsZSkmJmpuKGUsdCkmJmZ1bmN0aW9uKHQsZSl7dmFyIG49dCxyPSExLGk9KHQueCtlLngpLzIsbz0odC55K2UueSkvMjtkb3tuLnk+byE9bi5uZXh0Lnk+byYmbi5uZXh0LnkhPT1uLnkmJmk8KG4ubmV4dC54LW4ueCkqKG8tbi55KS8obi5uZXh0Lnktbi55KStuLngmJihyPSFyKSxuPW4ubmV4dH13aGlsZShuIT09dCk7cmV0dXJuIHJ9KHQsZSl9ZnVuY3Rpb24gcW4odCxlLG4pe3JldHVybihlLnktdC55KSoobi54LWUueCktKGUueC10LngpKihuLnktZS55KX1mdW5jdGlvbiBCbih0LGUpe3JldHVybiB0Lng9PT1lLngmJnQueT09PWUueX1mdW5jdGlvbiB6bih0LGUsbixyKXtyZXR1cm4hIShCbih0LGUpJiZCbihuLHIpfHxCbih0LHIpJiZCbihuLGUpKXx8cW4odCxlLG4pPjAhPXFuKHQsZSxyKT4wJiZxbihuLHIsdCk+MCE9cW4obixyLGUpPjB9ZnVuY3Rpb24gam4odCxlKXtyZXR1cm4gcW4odC5wcmV2LHQsdC5uZXh0KTwwP3FuKHQsZSx0Lm5leHQpPj0wJiZxbih0LHQucHJldixlKT49MDpxbih0LGUsdC5wcmV2KTwwfHxxbih0LHQubmV4dCxlKTwwfWZ1bmN0aW9uIFVuKHQsZSl7dmFyIG49bmV3IFluKHQuaSx0LngsdC55KSxyPW5ldyBZbihlLmksZS54LGUueSksaT10Lm5leHQsbz1lLnByZXY7cmV0dXJuIHQubmV4dD1lLGUucHJldj10LG4ubmV4dD1pLGkucHJldj1uLHIubmV4dD1uLG4ucHJldj1yLG8ubmV4dD1yLHIucHJldj1vLHJ9ZnVuY3Rpb24gVm4odCxlLG4scil7dmFyIGk9bmV3IFluKHQsZSxuKTtyZXR1cm4gcj8oaS5uZXh0PXIubmV4dCxpLnByZXY9cixyLm5leHQucHJldj1pLHIubmV4dD1pKTooaS5wcmV2PWksaS5uZXh0PWkpLGl9ZnVuY3Rpb24gWG4odCl7dC5uZXh0LnByZXY9dC5wcmV2LHQucHJldi5uZXh0PXQubmV4dCx0LnByZXZaJiYodC5wcmV2Wi5uZXh0Wj10Lm5leHRaKSx0Lm5leHRaJiYodC5uZXh0Wi5wcmV2Wj10LnByZXZaKX1mdW5jdGlvbiBZbih0LGUsbil7dGhpcy5pPXQsdGhpcy54PWUsdGhpcy55PW4sdGhpcy5wcmV2PW51bGwsdGhpcy5uZXh0PW51bGwsdGhpcy56PW51bGwsdGhpcy5wcmV2Wj1udWxsLHRoaXMubmV4dFo9bnVsbCx0aGlzLnN0ZWluZXI9ITF9ZnVuY3Rpb24gSG4odCxlLG4scil7Zm9yKHZhciBpPTAsbz1lLHM9bi1yO288bjtvKz1yKWkrPSh0W3NdLXRbb10pKih0W28rMV0rdFtzKzFdKSxzPW87cmV0dXJuIGl9ZnVuY3Rpb24gV24odCl7dmFyIGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF1bMF0ubGVuZ3RoLG49e3ZlcnRpY2VzOltdLGhvbGVzOltdLGRpbWVuc2lvbnM6ZX0scj0wLGk9MDtpPHQubGVuZ3RoO2krKyl7Zm9yKHZhciBvPTA7bzx0W2ldLmxlbmd0aDtvKyspZm9yKHZhciBzPTA7czxlO3MrKyluLnZlcnRpY2VzLnB1c2godFtpXVtvXVtzXSk7aT4wJiYocis9dFtpLTFdLmxlbmd0aCxuLmhvbGVzLnB1c2gocikpfXJldHVybiBufSh0KSxuPXduKGUudmVydGljZXMsZS5ob2xlcywyKSxyPVtdLGk9W107bi5mb3JFYWNoKChmdW5jdGlvbih0LHIpe3ZhciBvPW5bcl07aS5wdXNoKFtlLnZlcnRpY2VzWzIqb10sZS52ZXJ0aWNlc1syKm8rMV1dKX0pKTtmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rPTMpe3ZhciBzPWkuc2xpY2UobyxvKzMpO3MucHVzaChpW29dKSxyLnB1c2gobChbc10pKX1yZXR1cm4gcn1mdW5jdGlvbiBKbih0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcigidGFyZ2V0UG9pbnQgaXMgcmVxdWlyZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoInBvaW50cyBpcyByZXF1aXJlZCIpO3ZhciBuLHI9MS8wLGk9MDtyZXR1cm4gRihlLChmdW5jdGlvbihlLG4pe3ZhciBvPW1lKHQsZSk7bzxyJiYoaT1uLHI9byl9KSksKG49SWUoZS5mZWF0dXJlc1tpXSkpLnByb3BlcnRpZXMuZmVhdHVyZUluZGV4PWksbi5wcm9wZXJ0aWVzLmRpc3RhbmNlVG9Qb2ludD1yLG59ZnVuY3Rpb24gWm4odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7dmFyIGU9W107cmV0dXJuIHoodCwoZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIG49W10scj10Lmdlb21ldHJ5O2lmKG51bGwhPT1yKXtzd2l0Y2goci50eXBlKXtjYXNlIlBvbHlnb24iOm49UShyKTticmVhaztjYXNlIkxpbmVTdHJpbmciOm49W1EocildfW4uZm9yRWFjaCgoZnVuY3Rpb24obil7KGZ1bmN0aW9uKHQsZSl7dmFyIG49W107cmV0dXJuIHQucmVkdWNlKChmdW5jdGlvbih0LHIpe3ZhciBpPWgoW3Qscl0sZSk7cmV0dXJuIGkuYmJveD1mdW5jdGlvbih0LGUpe3ZhciBuPXRbMF0scj10WzFdLGk9ZVswXSxvPWVbMV07cmV0dXJuW248aT9uOmkscjxvP3I6byxuPmk/bjppLHI+bz9yOm9dfSh0LHIpLG4ucHVzaChpKSxyfSkpLG59KShuLHQucHJvcGVydGllcykuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5pZD1lLmxlbmd0aCxlLnB1c2godCl9KSl9KSl9fSh0LGUpfSkpLGYoZSl9Tm4uZGV2aWF0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWUmJmUubGVuZ3RoLG89aT9lWzBdKm46dC5sZW5ndGgscz1NYXRoLmFicyhIbih0LDAsbyxuKSk7aWYoaSlmb3IodmFyIGE9MCx1PWUubGVuZ3RoO2E8dTthKyspe3ZhciBsPWVbYV0qbixjPWE8dS0xP2VbYSsxXSpuOnQubGVuZ3RoO3MtPU1hdGguYWJzKEhuKHQsbCxjLG4pKX12YXIgaD0wO2ZvcihhPTA7YTxyLmxlbmd0aDthKz0zKXt2YXIgcD1yW2FdKm4sZj1yW2ErMV0qbixnPXJbYSsyXSpuO2grPU1hdGguYWJzKCh0W3BdLXRbZ10pKih0W2YrMV0tdFtwKzFdKS0odFtwXS10W2ZdKSoodFtnKzFdLXRbcCsxXSkpfXJldHVybiAwPT09cyYmMD09PWg/MDpNYXRoLmFicygoaC1zKS9zKX0sTm4uZmxhdHRlbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXVswXS5sZW5ndGgsbj17dmVydGljZXM6W10saG9sZXM6W10sZGltZW5zaW9uczplfSxyPTAsaT0wO2k8dC5sZW5ndGg7aSsrKXtmb3IodmFyIG89MDtvPHRbaV0ubGVuZ3RoO28rKylmb3IodmFyIHM9MDtzPGU7cysrKW4udmVydGljZXMucHVzaCh0W2ldW29dW3NdKTtpPjAmJihyKz10W2ktMV0ubGVuZ3RoLG4uaG9sZXMucHVzaChyKSl9cmV0dXJuIG59LHduLmRlZmF1bHQ9SW47dmFyIEtuPUJ0KChmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4odCxlLG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj17dHlwZToiRmVhdHVyZSJ9O3JldHVybigwPT09bi5pZHx8bi5pZCkmJihyLmlkPW4uaWQpLG4uYmJveCYmKHIuYmJveD1uLmJib3gpLHIucHJvcGVydGllcz1lfHx7fSxyLmdlb21ldHJ5PXQscn1mdW5jdGlvbiByKHQsZSxyKXtpZih2b2lkIDA9PT1yJiYocj17fSksIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSIpO2lmKHQubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGF0IGxlYXN0IDIgbnVtYmVycyBsb25nIik7aWYoIWYodFswXSl8fCFmKHRbMV0pKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBjb250YWluIG51bWJlcnMiKTtyZXR1cm4gbih7dHlwZToiUG9pbnQiLGNvb3JkaW5hdGVzOnR9LGUscil9ZnVuY3Rpb24gaSh0LGUscil7dm9pZCAwPT09ciYmKHI9e30pO2Zvcih2YXIgaT0wLG89dDtpPG8ubGVuZ3RoO2krKyl7dmFyIHM9b1tpXTtpZihzLmxlbmd0aDw0KXRocm93IG5ldyBFcnJvcigiRWFjaCBMaW5lYXJSaW5nIG9mIGEgUG9seWdvbiBtdXN0IGhhdmUgNCBvciBtb3JlIFBvc2l0aW9ucy4iKTtmb3IodmFyIGE9MDthPHNbcy5sZW5ndGgtMV0ubGVuZ3RoO2ErKylpZihzW3MubGVuZ3RoLTFdW2FdIT09c1swXVthXSl0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFuZCBsYXN0IFBvc2l0aW9uIGFyZSBub3QgZXF1aXZhbGVudC4iKX1yZXR1cm4gbih7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6dH0sZSxyKX1mdW5jdGlvbiBvKHQsZSxyKXtpZih2b2lkIDA9PT1yJiYocj17fSksdC5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gYXJyYXkgb2YgdHdvIG9yIG1vcmUgcG9zaXRpb25zIik7cmV0dXJuIG4oe3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9LGUscil9ZnVuY3Rpb24gcyh0LGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj17dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24ifTtyZXR1cm4gZS5pZCYmKG4uaWQ9ZS5pZCksZS5iYm94JiYobi5iYm94PWUuYmJveCksbi5mZWF0dXJlcz10LG59ZnVuY3Rpb24gYSh0LGUscil7cmV0dXJuIHZvaWQgMD09PXImJihyPXt9KSxuKHt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9LGUscil9ZnVuY3Rpb24gdSh0LGUscil7cmV0dXJuIHZvaWQgMD09PXImJihyPXt9KSxuKHt0eXBlOiJNdWx0aVBvaW50Iixjb29yZGluYXRlczp0fSxlLHIpfWZ1bmN0aW9uIGwodCxlLHIpe3JldHVybiB2b2lkIDA9PT1yJiYocj17fSksbih7dHlwZToiTXVsdGlQb2x5Z29uIixjb29yZGluYXRlczp0fSxlLHIpfWZ1bmN0aW9uIGModCxuKXt2b2lkIDA9PT1uJiYobj0ia2lsb21ldGVycyIpO3ZhciByPWUuZmFjdG9yc1tuXTtpZighcil0aHJvdyBuZXcgRXJyb3IobisiIHVuaXRzIGlzIGludmFsaWQiKTtyZXR1cm4gdCpyfWZ1bmN0aW9uIGgodCxuKXt2b2lkIDA9PT1uJiYobj0ia2lsb21ldGVycyIpO3ZhciByPWUuZmFjdG9yc1tuXTtpZighcil0aHJvdyBuZXcgRXJyb3IobisiIHVuaXRzIGlzIGludmFsaWQiKTtyZXR1cm4gdC9yfWZ1bmN0aW9uIHAodCl7cmV0dXJuIDE4MCoodCUoMipNYXRoLlBJKSkvTWF0aC5QSX1mdW5jdGlvbiBmKHQpe3JldHVybiFpc05hTih0KSYmbnVsbCE9PXQmJiFBcnJheS5pc0FycmF5KHQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmVhcnRoUmFkaXVzPTYzNzEwMDguOCxlLmZhY3RvcnM9e2NlbnRpbWV0ZXJzOjEwMCplLmVhcnRoUmFkaXVzLGNlbnRpbWV0cmVzOjEwMCplLmVhcnRoUmFkaXVzLGRlZ3JlZXM6ZS5lYXJ0aFJhZGl1cy8xMTEzMjUsZmVldDozLjI4MDg0KmUuZWFydGhSYWRpdXMsaW5jaGVzOjM5LjM3KmUuZWFydGhSYWRpdXMsa2lsb21ldGVyczplLmVhcnRoUmFkaXVzLzFlMyxraWxvbWV0cmVzOmUuZWFydGhSYWRpdXMvMWUzLG1ldGVyczplLmVhcnRoUmFkaXVzLG1ldHJlczplLmVhcnRoUmFkaXVzLG1pbGVzOmUuZWFydGhSYWRpdXMvMTYwOS4zNDQsbWlsbGltZXRlcnM6MWUzKmUuZWFydGhSYWRpdXMsbWlsbGltZXRyZXM6MWUzKmUuZWFydGhSYWRpdXMsbmF1dGljYWxtaWxlczplLmVhcnRoUmFkaXVzLzE4NTIscmFkaWFuczoxLHlhcmRzOjEuMDkzNiplLmVhcnRoUmFkaXVzfSxlLnVuaXRzRmFjdG9ycz17Y2VudGltZXRlcnM6MTAwLGNlbnRpbWV0cmVzOjEwMCxkZWdyZWVzOjEvMTExMzI1LGZlZXQ6My4yODA4NCxpbmNoZXM6MzkuMzcsa2lsb21ldGVyczouMDAxLGtpbG9tZXRyZXM6LjAwMSxtZXRlcnM6MSxtZXRyZXM6MSxtaWxlczoxLzE2MDkuMzQ0LG1pbGxpbWV0ZXJzOjFlMyxtaWxsaW1ldHJlczoxZTMsbmF1dGljYWxtaWxlczoxLzE4NTIscmFkaWFuczoxL2UuZWFydGhSYWRpdXMseWFyZHM6MS4wOTM2MTMzfSxlLmFyZWFGYWN0b3JzPXthY3JlczoyNDcxMDVlLTksY2VudGltZXRlcnM6MWU0LGNlbnRpbWV0cmVzOjFlNCxmZWV0OjEwLjc2MzkxMDQxNyxoZWN0YXJlczoxZS00LGluY2hlczoxNTUwLjAwMzEwMDAwNixraWxvbWV0ZXJzOjFlLTYsa2lsb21ldHJlczoxZS02LG1ldGVyczoxLG1ldHJlczoxLG1pbGVzOjM4NmUtOSxtaWxsaW1ldGVyczoxZTYsbWlsbGltZXRyZXM6MWU2LHlhcmRzOjEuMTk1OTkwMDQ2fSxlLmZlYXR1cmU9bixlLmdlb21ldHJ5PWZ1bmN0aW9uKHQsZSxuKXtzd2l0Y2godCl7Y2FzZSJQb2ludCI6cmV0dXJuIHIoZSkuZ2VvbWV0cnk7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4gbyhlKS5nZW9tZXRyeTtjYXNlIlBvbHlnb24iOnJldHVybiBpKGUpLmdlb21ldHJ5O2Nhc2UiTXVsdGlQb2ludCI6cmV0dXJuIHUoZSkuZ2VvbWV0cnk7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiBhKGUpLmdlb21ldHJ5O2Nhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4gbChlKS5nZW9tZXRyeTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcih0KyIgaXMgaW52YWxpZCIpfX0sZS5wb2ludD1yLGUucG9pbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLHModC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiByKHQsZSl9KSksbil9LGUucG9seWdvbj1pLGUucG9seWdvbnM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj17fSkscyh0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGkodCxlKX0pKSxuKX0sZS5saW5lU3RyaW5nPW8sZS5saW5lU3RyaW5ncz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPXt9KSxzKHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gbyh0LGUpfSkpLG4pfSxlLmZlYXR1cmVDb2xsZWN0aW9uPXMsZS5tdWx0aUxpbmVTdHJpbmc9YSxlLm11bHRpUG9pbnQ9dSxlLm11bHRpUG9seWdvbj1sLGUuZ2VvbWV0cnlDb2xsZWN0aW9uPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdm9pZCAwPT09ciYmKHI9e30pLG4oe3R5cGU6Ikdlb21ldHJ5Q29sbGVjdGlvbiIsZ2VvbWV0cmllczp0fSxlLHIpfSxlLnJvdW5kPWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9MCksZSYmIShlPj0wKSl0aHJvdyBuZXcgRXJyb3IoInByZWNpc2lvbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7dmFyIG49TWF0aC5wb3coMTAsZXx8MCk7cmV0dXJuIE1hdGgucm91bmQodCpuKS9ufSxlLnJhZGlhbnNUb0xlbmd0aD1jLGUubGVuZ3RoVG9SYWRpYW5zPWgsZS5sZW5ndGhUb0RlZ3JlZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcChoKHQsZSkpfSxlLmJlYXJpbmdUb0F6aW11dGg9ZnVuY3Rpb24odCl7dmFyIGU9dCUzNjA7cmV0dXJuIGU8MCYmKGUrPTM2MCksZX0sZS5yYWRpYW5zVG9EZWdyZWVzPXAsZS5kZWdyZWVzVG9SYWRpYW5zPWZ1bmN0aW9uKHQpe3JldHVybiB0JTM2MCpNYXRoLlBJLzE4MH0sZS5jb252ZXJ0TGVuZ3RoPWZ1bmN0aW9uKHQsZSxuKXtpZih2b2lkIDA9PT1lJiYoZT0ia2lsb21ldGVycyIpLHZvaWQgMD09PW4mJihuPSJraWxvbWV0ZXJzIiksISh0Pj0wKSl0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGMoaCh0LGUpLG4pfSxlLmNvbnZlcnRBcmVhPWZ1bmN0aW9uKHQsbixyKXtpZih2b2lkIDA9PT1uJiYobj0ibWV0ZXJzIiksdm9pZCAwPT09ciYmKHI9ImtpbG9tZXRlcnMiKSwhKHQ+PTApKXRocm93IG5ldyBFcnJvcigiYXJlYSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7dmFyIGk9ZS5hcmVhRmFjdG9yc1tuXTtpZighaSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgb3JpZ2luYWwgdW5pdHMiKTt2YXIgbz1lLmFyZWFGYWN0b3JzW3JdO2lmKCFvKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmaW5hbCB1bml0cyIpO3JldHVybiB0L2kqb30sZS5pc051bWJlcj1mLGUuaXNPYmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuISF0JiZ0LmNvbnN0cnVjdG9yPT09T2JqZWN0fSxlLnZhbGlkYXRlQkJveD1mdW5jdGlvbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImJib3ggaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBiZSBhbiBBcnJheSIpO2lmKDQhPT10Lmxlbmd0aCYmNiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiYmJveCBtdXN0IGJlIGFuIEFycmF5IG9mIDQgb3IgNiBudW1iZXJzIik7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighZih0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBvbmx5IGNvbnRhaW4gbnVtYmVycyIpfSkpfSxlLnZhbGlkYXRlSWQ9ZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJpZCBpcyByZXF1aXJlZCIpO2lmKC0xPT09WyJzdHJpbmciLCJudW1iZXIiXS5pbmRleE9mKHR5cGVvZiB0KSl0aHJvdyBuZXcgRXJyb3IoImlkIG11c3QgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmciKX19KSk7ZnVuY3Rpb24gUW4odCxlLG4pe2lmKG51bGwhPT10KWZvcih2YXIgcixpLG8scyxhLHUsbCxjLGg9MCxwPTAsZj10LnR5cGUsZz0iRmVhdHVyZUNvbGxlY3Rpb24iPT09ZixkPSJGZWF0dXJlIj09PWYseT1nP3QuZmVhdHVyZXMubGVuZ3RoOjEsdj0wO3Y8eTt2Kyspe2E9KGM9ISEobD1nP3QuZmVhdHVyZXNbdl0uZ2VvbWV0cnk6ZD90Lmdlb21ldHJ5OnQpJiYiR2VvbWV0cnlDb2xsZWN0aW9uIj09PWwudHlwZSk/bC5nZW9tZXRyaWVzLmxlbmd0aDoxO2Zvcih2YXIgXz0wO188YTtfKyspe3ZhciBtPTAseD0wO2lmKG51bGwhPT0ocz1jP2wuZ2VvbWV0cmllc1tfXTpsKSl7dT1zLmNvb3JkaW5hdGVzO3ZhciBFPXMudHlwZTtzd2l0Y2goaD0hbnx8IlBvbHlnb24iIT09RSYmIk11bHRpUG9seWdvbiIhPT1FPzA6MSxFKXtjYXNlIG51bGw6YnJlYWs7Y2FzZSJQb2ludCI6aWYoITE9PT1lKHUscCx2LG0seCkpcmV0dXJuITE7cCsrLG0rKzticmVhaztjYXNlIkxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2ludCI6Zm9yKHI9MDtyPHUubGVuZ3RoO3IrKyl7aWYoITE9PT1lKHVbcl0scCx2LG0seCkpcmV0dXJuITE7cCsrLCJNdWx0aVBvaW50Ij09PUUmJm0rK30iTGluZVN0cmluZyI9PT1FJiZtKys7YnJlYWs7Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpTGluZVN0cmluZyI6Zm9yKHI9MDtyPHUubGVuZ3RoO3IrKyl7Zm9yKGk9MDtpPHVbcl0ubGVuZ3RoLWg7aSsrKXtpZighMT09PWUodVtyXVtpXSxwLHYsbSx4KSlyZXR1cm4hMTtwKyt9Ik11bHRpTGluZVN0cmluZyI9PT1FJiZtKyssIlBvbHlnb24iPT09RSYmeCsrfSJQb2x5Z29uIj09PUUmJm0rKzticmVhaztjYXNlIk11bHRpUG9seWdvbiI6Zm9yKHI9MDtyPHUubGVuZ3RoO3IrKyl7Zm9yKHg9MCxpPTA7aTx1W3JdLmxlbmd0aDtpKyspe2ZvcihvPTA7bzx1W3JdW2ldLmxlbmd0aC1oO28rKyl7aWYoITE9PT1lKHVbcl1baV1bb10scCx2LG0seCkpcmV0dXJuITE7cCsrfXgrK31tKyt9YnJlYWs7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOmZvcihyPTA7cjxzLmdlb21ldHJpZXMubGVuZ3RoO3IrKylpZighMT09PVFuKHMuZ2VvbWV0cmllc1tyXSxlLG4pKXJldHVybiExO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIEdlb21ldHJ5IFR5cGUiKX19fX19ZnVuY3Rpb24gJG4odCxlKXt2YXIgbjtzd2l0Y2godC50eXBlKXtjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpmb3Iobj0wO248dC5mZWF0dXJlcy5sZW5ndGgmJiExIT09ZSh0LmZlYXR1cmVzW25dLnByb3BlcnRpZXMsbik7bisrKTticmVhaztjYXNlIkZlYXR1cmUiOmUodC5wcm9wZXJ0aWVzLDApfX1mdW5jdGlvbiB0cih0LGUpe2lmKCJGZWF0dXJlIj09PXQudHlwZSllKHQsMCk7ZWxzZSBpZigiRmVhdHVyZUNvbGxlY3Rpb24iPT09dC50eXBlKWZvcih2YXIgbj0wO248dC5mZWF0dXJlcy5sZW5ndGgmJiExIT09ZSh0LmZlYXR1cmVzW25dLG4pO24rKyk7fWZ1bmN0aW9uIGVyKHQsZSl7dmFyIG4scixpLG8scyxhLHUsbCxjLGgscD0wLGY9IkZlYXR1cmVDb2xsZWN0aW9uIj09PXQudHlwZSxnPSJGZWF0dXJlIj09PXQudHlwZSxkPWY/dC5mZWF0dXJlcy5sZW5ndGg6MTtmb3Iobj0wO248ZDtuKyspe2ZvcihhPWY/dC5mZWF0dXJlc1tuXS5nZW9tZXRyeTpnP3QuZ2VvbWV0cnk6dCxsPWY/dC5mZWF0dXJlc1tuXS5wcm9wZXJ0aWVzOmc/dC5wcm9wZXJ0aWVzOnt9LGM9Zj90LmZlYXR1cmVzW25dLmJib3g6Zz90LmJib3g6dm9pZCAwLGg9Zj90LmZlYXR1cmVzW25dLmlkOmc/dC5pZDp2b2lkIDAscz0odT0hIWEmJiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09YS50eXBlKT9hLmdlb21ldHJpZXMubGVuZ3RoOjEsaT0wO2k8cztpKyspaWYobnVsbCE9PShvPXU/YS5nZW9tZXRyaWVzW2ldOmEpKXN3aXRjaChvLnR5cGUpe2Nhc2UiUG9pbnQiOmNhc2UiTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvaW50IjpjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpjYXNlIk11bHRpUG9seWdvbiI6aWYoITE9PT1lKG8scCxsLGMsaCkpcmV0dXJuITE7YnJlYWs7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOmZvcihyPTA7cjxvLmdlb21ldHJpZXMubGVuZ3RoO3IrKylpZighMT09PWUoby5nZW9tZXRyaWVzW3JdLHAsbCxjLGgpKXJldHVybiExO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIEdlb21ldHJ5IFR5cGUiKX1lbHNlIGlmKCExPT09ZShudWxsLHAsbCxjLGgpKXJldHVybiExO3ArK319ZnVuY3Rpb24gbnIodCxlKXtlcih0LChmdW5jdGlvbih0LG4scixpLG8pe3ZhciBzLGE9bnVsbD09PXQ/bnVsbDp0LnR5cGU7c3dpdGNoKGEpe2Nhc2UgbnVsbDpjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6cmV0dXJuITEhPT1lKEtuLmZlYXR1cmUodCxyLHtiYm94OmksaWQ6b30pLG4sMCkmJnZvaWQgMH1zd2l0Y2goYSl7Y2FzZSJNdWx0aVBvaW50IjpzPSJQb2ludCI7YnJlYWs7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnM9IkxpbmVTdHJpbmciO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpzPSJQb2x5Z29uIn1mb3IodmFyIHU9MDt1PHQuY29vcmRpbmF0ZXMubGVuZ3RoO3UrKyl7dmFyIGw9e3R5cGU6cyxjb29yZGluYXRlczp0LmNvb3JkaW5hdGVzW3VdfTtpZighMT09PWUoS24uZmVhdHVyZShsLHIpLG4sdSkpcmV0dXJuITF9fSkpfWZ1bmN0aW9uIHJyKHQsZSl7bnIodCwoZnVuY3Rpb24odCxuLHIpe3ZhciBpPTA7aWYodC5nZW9tZXRyeSl7dmFyIG89dC5nZW9tZXRyeS50eXBlO2lmKCJQb2ludCIhPT1vJiYiTXVsdGlQb2ludCIhPT1vKXt2YXIgcyxhPTAsdT0wLGw9MDtyZXR1cm4hMSE9PVFuKHQsKGZ1bmN0aW9uKG8sYyxoLHAsZil7aWYodm9pZCAwPT09c3x8bj5hfHxwPnV8fGY+bClyZXR1cm4gcz1vLGE9bix1PXAsbD1mLHZvaWQoaT0wKTt2YXIgZz1Lbi5saW5lU3RyaW5nKFtzLG9dLHQucHJvcGVydGllcyk7aWYoITE9PT1lKGcsbixyLGYsaSkpcmV0dXJuITE7aSsrLHM9b30pKSYmdm9pZCAwfX19KSl9ZnVuY3Rpb24gaXIodCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtucih0LChmdW5jdGlvbih0LG4scil7aWYobnVsbCE9PXQuZ2VvbWV0cnkpe3ZhciBpPXQuZ2VvbWV0cnkudHlwZSxvPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7c3dpdGNoKGkpe2Nhc2UiTGluZVN0cmluZyI6aWYoITE9PT1lKHQsbixyLDAsMCkpcmV0dXJuITE7YnJlYWs7Y2FzZSJQb2x5Z29uIjpmb3IodmFyIHM9MDtzPG8ubGVuZ3RoO3MrKylpZighMT09PWUoS24ubGluZVN0cmluZyhvW3NdLHQucHJvcGVydGllcyksbixyLHMpKXJldHVybiExfX19KSl9dmFyIG9yPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiBRbih0LChmdW5jdGlvbih0KXtlLnB1c2godCl9KSksZX0sc3I9UW4sYXI9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bjtyZXR1cm4gUW4odCwoZnVuY3Rpb24odCxyLG8scyxhKXtpPTA9PT1yJiZ2b2lkIDA9PT1uP3Q6ZShpLHQscixvLHMsYSl9KSxyKSxpfSx1cj10cixscj1mdW5jdGlvbih0LGUsbil7dmFyIHI9bjtyZXR1cm4gdHIodCwoZnVuY3Rpb24odCxpKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSl9KSkscn0sY3I9ZnVuY3Rpb24odCxlKXtpZihlPWV8fHt9LCFLbi5pc09iamVjdChlKSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuLHI9ZS5mZWF0dXJlSW5kZXh8fDAsaT1lLm11bHRpRmVhdHVyZUluZGV4fHwwLG89ZS5nZW9tZXRyeUluZGV4fHwwLHM9ZS5jb29yZEluZGV4fHwwLGE9ZS5wcm9wZXJ0aWVzO3N3aXRjaCh0LnR5cGUpe2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnI8MCYmKHI9dC5mZWF0dXJlcy5sZW5ndGgrciksYT1hfHx0LmZlYXR1cmVzW3JdLnByb3BlcnRpZXMsbj10LmZlYXR1cmVzW3JdLmdlb21ldHJ5O2JyZWFrO2Nhc2UiRmVhdHVyZSI6YT1hfHx0LnByb3BlcnRpZXMsbj10Lmdlb21ldHJ5O2JyZWFrO2Nhc2UiUG9pbnQiOmNhc2UiTXVsdGlQb2ludCI6cmV0dXJuIG51bGw7Y2FzZSJMaW5lU3RyaW5nIjpjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpjYXNlIk11bHRpUG9seWdvbiI6bj10O2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIGludmFsaWQiKX1pZihudWxsPT09bilyZXR1cm4gbnVsbDt2YXIgdT1uLmNvb3JkaW5hdGVzO3N3aXRjaChuLnR5cGUpe2Nhc2UiUG9pbnQiOnJldHVybiBLbi5wb2ludCh1LGEsZSk7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gaTwwJiYoaT11Lmxlbmd0aCtpKSxLbi5wb2ludCh1W2ldLGEsZSk7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4gczwwJiYocz11Lmxlbmd0aCtzKSxLbi5wb2ludCh1W3NdLGEsZSk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gbzwwJiYobz11Lmxlbmd0aCtvKSxzPDAmJihzPXVbb10ubGVuZ3RoK3MpLEtuLnBvaW50KHVbb11bc10sYSxlKTtjYXNlIk11bHRpTGluZVN0cmluZyI6cmV0dXJuIGk8MCYmKGk9dS5sZW5ndGgraSksczwwJiYocz11W2ldLmxlbmd0aCtzKSxLbi5wb2ludCh1W2ldW3NdLGEsZSk7Y2FzZSJNdWx0aVBvbHlnb24iOnJldHVybiBpPDAmJihpPXUubGVuZ3RoK2kpLG88MCYmKG89dVtpXS5sZW5ndGgrbyksczwwJiYocz11W2ldW29dLmxlbmd0aC1zKSxLbi5wb2ludCh1W2ldW29dW3NdLGEsZSl9dGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIGludmFsaWQiKX0saHI9ZnVuY3Rpb24odCxlKXtpZihlPWV8fHt9LCFLbi5pc09iamVjdChlKSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuLHI9ZS5mZWF0dXJlSW5kZXh8fDAsaT1lLm11bHRpRmVhdHVyZUluZGV4fHwwLG89ZS5nZW9tZXRyeUluZGV4fHwwLHM9ZS5zZWdtZW50SW5kZXh8fDAsYT1lLnByb3BlcnRpZXM7c3dpdGNoKHQudHlwZSl7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6cjwwJiYocj10LmZlYXR1cmVzLmxlbmd0aCtyKSxhPWF8fHQuZmVhdHVyZXNbcl0ucHJvcGVydGllcyxuPXQuZmVhdHVyZXNbcl0uZ2VvbWV0cnk7YnJlYWs7Y2FzZSJGZWF0dXJlIjphPWF8fHQucHJvcGVydGllcyxuPXQuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJQb2ludCI6Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gbnVsbDtjYXNlIkxpbmVTdHJpbmciOmNhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aUxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2x5Z29uIjpuPXQ7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgaW52YWxpZCIpfWlmKG51bGw9PT1uKXJldHVybiBudWxsO3ZhciB1PW4uY29vcmRpbmF0ZXM7c3dpdGNoKG4udHlwZSl7Y2FzZSJQb2ludCI6Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gbnVsbDtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBzPDAmJihzPXUubGVuZ3RoK3MtMSksS24ubGluZVN0cmluZyhbdVtzXSx1W3MrMV1dLGEsZSk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gbzwwJiYobz11Lmxlbmd0aCtvKSxzPDAmJihzPXVbb10ubGVuZ3RoK3MtMSksS24ubGluZVN0cmluZyhbdVtvXVtzXSx1W29dW3MrMV1dLGEsZSk7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiBpPDAmJihpPXUubGVuZ3RoK2kpLHM8MCYmKHM9dVtpXS5sZW5ndGgrcy0xKSxLbi5saW5lU3RyaW5nKFt1W2ldW3NdLHVbaV1bcysxXV0sYSxlKTtjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIGk8MCYmKGk9dS5sZW5ndGgraSksbzwwJiYobz11W2ldLmxlbmd0aCtvKSxzPDAmJihzPXVbaV1bb10ubGVuZ3RoLXMtMSksS24ubGluZVN0cmluZyhbdVtpXVtvXVtzXSx1W2ldW29dW3MrMV1dLGEsZSl9dGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIGludmFsaWQiKX0scHI9bnIsZnI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIG5yKHQsKGZ1bmN0aW9uKHQsaSxvKXtyPTA9PT1pJiYwPT09byYmdm9pZCAwPT09bj90OmUocix0LGksbyl9KSkscn0sZ3I9ZXIsZHI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIGVyKHQsKGZ1bmN0aW9uKHQsaSxvLHMsYSl7cj0wPT09aSYmdm9pZCAwPT09bj90OmUocix0LGksbyxzLGEpfSkpLHJ9LHlyPWlyLHZyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uO3JldHVybiBpcih0LChmdW5jdGlvbih0LGksbyxzKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSxvLHMpfSkpLHJ9LF9yPSRuLG1yPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uO3JldHVybiAkbih0LChmdW5jdGlvbih0LGkpe3I9MD09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxpKX0pKSxyfSx4cj1ycixFcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9bixpPSExO3JldHVybiBycih0LChmdW5jdGlvbih0LG8scyxhLHUpe3I9ITE9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsbyxzLGEsdSksaT0hMH0pKSxyfSxicj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe2Nvb3JkQWxsOm9yLGNvb3JkRWFjaDpzcixjb29yZFJlZHVjZTphcixmZWF0dXJlRWFjaDp1cixmZWF0dXJlUmVkdWNlOmxyLGZpbmRQb2ludDpjcixmaW5kU2VnbWVudDpocixmbGF0dGVuRWFjaDpwcixmbGF0dGVuUmVkdWNlOmZyLGdlb21FYWNoOmdyLGdlb21SZWR1Y2U6ZHIsbGluZUVhY2g6eXIsbGluZVJlZHVjZTp2cixwcm9wRWFjaDpfcixwcm9wUmVkdWNlOm1yLHNlZ21lbnRFYWNoOnhyLHNlZ21lbnRSZWR1Y2U6RXJ9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtmdW5jdGlvbiB3cih0KXt2YXIgZT1bMS8wLDEvMCwtMS8wLC0xLzBdO3JldHVybiBici5jb29yZEVhY2godCwoZnVuY3Rpb24odCl7ZVswXT50WzBdJiYoZVswXT10WzBdKSxlWzFdPnRbMV0mJihlWzFdPXRbMV0pLGVbMl08dFswXSYmKGVbMl09dFswXSksZVszXTx0WzFdJiYoZVszXT10WzFdKX0pKSxlfXdyLmRlZmF1bHQ9d3I7dmFyIElyPXdyLE5yPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7ZGVmYXVsdDpJcn0sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLmRlZmF1bHQsU3I9YnIuZmVhdHVyZUVhY2gsQ3I9KGJyLmNvb3JkRWFjaCxLbi5wb2x5Z29uLEtuLmZlYXR1cmVDb2xsZWN0aW9uKTtmdW5jdGlvbiBQcih0KXt2YXIgZT1OdCh0KTtyZXR1cm4gZS5pbnNlcnQ9ZnVuY3Rpb24odCl7aWYoIkZlYXR1cmUiIT09dC50eXBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmZWF0dXJlIik7cmV0dXJuIHQuYmJveD10LmJib3g/dC5iYm94Ok5yKHQpLE50LnByb3RvdHlwZS5pbnNlcnQuY2FsbCh0aGlzLHQpfSxlLmxvYWQ9ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZigiRmVhdHVyZSIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZlYXR1cmVzIik7dC5iYm94PXQuYmJveD90LmJib3g6TnIodCksZS5wdXNoKHQpfSkpOlNyKHQsKGZ1bmN0aW9uKHQpe2lmKCJGZWF0dXJlIiE9PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZmVhdHVyZXMiKTt0LmJib3g9dC5iYm94P3QuYmJveDpOcih0KSxlLnB1c2godCl9KSksTnQucHJvdG90eXBlLmxvYWQuY2FsbCh0aGlzLGUpfSxlLnJlbW92ZT1mdW5jdGlvbih0LGUpe2lmKCJGZWF0dXJlIiE9PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZmVhdHVyZSIpO3JldHVybiB0LmJib3g9dC5iYm94P3QuYmJveDpOcih0KSxOdC5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyx0LGUpfSxlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIE50LnByb3RvdHlwZS5jbGVhci5jYWxsKHRoaXMpfSxlLnNlYXJjaD1mdW5jdGlvbih0KXt2YXIgZT1OdC5wcm90b3R5cGUuc2VhcmNoLmNhbGwodGhpcyx0aGlzLnRvQkJveCh0KSk7cmV0dXJuIENyKGUpfSxlLmNvbGxpZGVzPWZ1bmN0aW9uKHQpe3JldHVybiBOdC5wcm90b3R5cGUuY29sbGlkZXMuY2FsbCh0aGlzLHRoaXMudG9CQm94KHQpKX0sZS5hbGw9ZnVuY3Rpb24oKXt2YXIgdD1OdC5wcm90b3R5cGUuYWxsLmNhbGwodGhpcyk7cmV0dXJuIENyKHQpfSxlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiBOdC5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyl9LGUuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIE50LnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsdCl9LGUudG9CQm94PWZ1bmN0aW9uKHQpe3ZhciBlO2lmKHQuYmJveCllPXQuYmJveDtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkmJjQ9PT10Lmxlbmd0aCllPXQ7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpJiY2PT09dC5sZW5ndGgpZT1bdFswXSx0WzFdLHRbM10sdFs0XV07ZWxzZSBpZigiRmVhdHVyZSI9PT10LnR5cGUpZT1Ocih0KTtlbHNle2lmKCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGdlb2pzb24iKTtlPU5yKHQpfXJldHVybnttaW5YOmVbMF0sbWluWTplWzFdLG1heFg6ZVsyXSxtYXhZOmVbM119fSxlfXZhciBNcj1QcixMcj1QcjtmdW5jdGlvbiBPcih0LGUpe3ZhciBuPXt9LHI9W107aWYoIkxpbmVTdHJpbmciPT09dC50eXBlJiYodD1vKHQpKSwiTGluZVN0cmluZyI9PT1lLnR5cGUmJihlPW8oZSkpLCJGZWF0dXJlIj09PXQudHlwZSYmIkZlYXR1cmUiPT09ZS50eXBlJiZudWxsIT09dC5nZW9tZXRyeSYmbnVsbCE9PWUuZ2VvbWV0cnkmJiJMaW5lU3RyaW5nIj09PXQuZ2VvbWV0cnkudHlwZSYmIkxpbmVTdHJpbmciPT09ZS5nZW9tZXRyeS50eXBlJiYyPT09dC5nZW9tZXRyeS5jb29yZGluYXRlcy5sZW5ndGgmJjI9PT1lLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aCl7dmFyIGk9UnIodCxlKTtyZXR1cm4gaSYmci5wdXNoKGkpLGYocil9dmFyIHM9TXIoKTtyZXR1cm4gcy5sb2FkKFpuKGUpKSxGKFpuKHQpLChmdW5jdGlvbih0KXtGKHMuc2VhcmNoKHQpLChmdW5jdGlvbihlKXt2YXIgaT1Scih0LGUpO2lmKGkpe3ZhciBvPVEoaSkuam9pbigiLCIpO25bb118fChuW29dPSEwLHIucHVzaChpKSl9fSkpfSkpLGYocil9ZnVuY3Rpb24gUnIodCxlKXt2YXIgbj1RKHQpLHI9UShlKTtpZigyIT09bi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCI8aW50ZXJzZWN0cz4gbGluZTEgbXVzdCBvbmx5IGNvbnRhaW4gMiBjb29yZGluYXRlcyIpO2lmKDIhPT1yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIjxpbnRlcnNlY3RzPiBsaW5lMiBtdXN0IG9ubHkgY29udGFpbiAyIGNvb3JkaW5hdGVzIik7dmFyIGk9blswXVswXSxvPW5bMF1bMV0scz1uWzFdWzBdLHU9blsxXVsxXSxsPXJbMF1bMF0sYz1yWzBdWzFdLGg9clsxXVswXSxwPXJbMV1bMV0sZj0ocC1jKSoocy1pKS0oaC1sKSoodS1vKSxnPShoLWwpKihvLWMpLShwLWMpKihpLWwpLGQ9KHMtaSkqKG8tYyktKHUtbykqKGktbCk7aWYoMD09PWYpcmV0dXJuIG51bGw7dmFyIHk9Zy9mLHY9ZC9mO3JldHVybiB5Pj0wJiZ5PD0xJiZ2Pj0wJiZ2PD0xP2EoW2kreSoocy1pKSxvK3kqKHUtbyldKTpudWxsfWZ1bmN0aW9uIFRyKHQsZSxuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9YShbMS8wLDEvMF0se2Rpc3Q6MS8wfSksaT0wO3JldHVybiB6KHQsKGZ1bmN0aW9uKHQpe2Zvcih2YXIgbz1RKHQpLHM9MDtzPG8ubGVuZ3RoLTE7cysrKXt2YXIgdT1hKG9bc10pO3UucHJvcGVydGllcy5kaXN0PW1lKGUsdSxuKTt2YXIgbD1hKG9bcysxXSk7bC5wcm9wZXJ0aWVzLmRpc3Q9bWUoZSxsLG4pO3ZhciBjPW1lKHUsbCxuKSxwPU1hdGgubWF4KHUucHJvcGVydGllcy5kaXN0LGwucHJvcGVydGllcy5kaXN0KSxmPW1uKHUsbCksZz12bihlLHAsZis5MCxuKSxkPXZuKGUscCxmLTkwLG4pLHk9T3IoaChbZy5nZW9tZXRyeS5jb29yZGluYXRlcyxkLmdlb21ldHJ5LmNvb3JkaW5hdGVzXSksaChbdS5nZW9tZXRyeS5jb29yZGluYXRlcyxsLmdlb21ldHJ5LmNvb3JkaW5hdGVzXSkpLHY9bnVsbDt5LmZlYXR1cmVzLmxlbmd0aD4wJiYoKHY9eS5mZWF0dXJlc1swXSkucHJvcGVydGllcy5kaXN0PW1lKGUsdixuKSx2LnByb3BlcnRpZXMubG9jYXRpb249aSttZSh1LHYsbikpLHUucHJvcGVydGllcy5kaXN0PHIucHJvcGVydGllcy5kaXN0JiYoKHI9dSkucHJvcGVydGllcy5pbmRleD1zLHIucHJvcGVydGllcy5sb2NhdGlvbj1pKSxsLnByb3BlcnRpZXMuZGlzdDxyLnByb3BlcnRpZXMuZGlzdCYmKChyPWwpLnByb3BlcnRpZXMuaW5kZXg9cysxLHIucHJvcGVydGllcy5sb2NhdGlvbj1pK2MpLHYmJnYucHJvcGVydGllcy5kaXN0PHIucHJvcGVydGllcy5kaXN0JiYoKHI9dikucHJvcGVydGllcy5pbmRleD1zKSxpKz1jfX0pKSxyfWZ1bmN0aW9uIEFyKHQsbixyKXt2b2lkIDA9PT1yJiYocj17fSk7dmFyIGk9Syh0KSxvPUsobik7cmV0dXJuIG9bMF0rPW9bMF0taVswXT4xODA/LTM2MDppWzBdLW9bMF0+MTgwPzM2MDowLE4oZnVuY3Rpb24odCxuLHIpe3ZhciBpPXI9dm9pZCAwPT09cj9lOk51bWJlcihyKSxvPXRbMV0qTWF0aC5QSS8xODAscz1uWzFdKk1hdGguUEkvMTgwLGE9cy1vLHU9TWF0aC5hYnMoblswXS10WzBdKSpNYXRoLlBJLzE4MDt1Pk1hdGguUEkmJih1LT0yKk1hdGguUEkpO3ZhciBsPU1hdGgubG9nKE1hdGgudGFuKHMvMitNYXRoLlBJLzQpL01hdGgudGFuKG8vMitNYXRoLlBJLzQpKSxjPU1hdGguYWJzKGwpPjFlLTExP2EvbDpNYXRoLmNvcyhvKTtyZXR1cm4gTWF0aC5zcXJ0KGEqYStjKmMqdSp1KSppfShpLG8pLCJtZXRlcnMiLHIudW5pdHMpfWZ1bmN0aW9uIERyKHQsZSxuKXtpZih2b2lkIDA9PT1uJiYobj17fSksbi5tZXRob2R8fChuLm1ldGhvZD0iZ2VvZGVzaWMiKSxuLnVuaXRzfHwobi51bml0cz0ia2lsb21ldGVycyIpLCF0KXRocm93IG5ldyBFcnJvcigicHQgaXMgcmVxdWlyZWQiKTtpZihBcnJheS5pc0FycmF5KHQpP3Q9YSh0KToiUG9pbnQiPT09dC50eXBlP3Q9byh0KTpldCh0LCJQb2ludCIsInBvaW50IiksIWUpdGhyb3cgbmV3IEVycm9yKCJsaW5lIGlzIHJlcXVpcmVkIik7QXJyYXkuaXNBcnJheShlKT9lPWgoZSk6IkxpbmVTdHJpbmciPT09ZS50eXBlP2U9byhlKTpldChlLCJMaW5lU3RyaW5nIiwibGluZSIpO3ZhciByPTEvMCxpPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7cmV0dXJuIFUoZSwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxvPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0scz1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1bblswXS1lWzBdLG5bMV0tZVsxXV0sbz1GcihbdFswXS1lWzBdLHRbMV0tZVsxXV0saSk7aWYobzw9MClyZXR1cm4ga3IodCxlLHttZXRob2Q6ci5tZXRob2QsdW5pdHM6ImRlZ3JlZXMifSk7dmFyIHM9RnIoaSxpKTtpZihzPD1vKXJldHVybiBrcih0LG4se21ldGhvZDpyLm1ldGhvZCx1bml0czoiZGVncmVlcyJ9KTt2YXIgYT1vL3MsdT1bZVswXSthKmlbMF0sZVsxXSthKmlbMV1dO3JldHVybiBrcih0LHUse21ldGhvZDpyLm1ldGhvZCx1bml0czoiZGVncmVlcyJ9KX0oaSxlLG8sbik7czxyJiYocj1zKX0pKSxOKHIsImRlZ3JlZXMiLG4udW5pdHMpfWZ1bmN0aW9uIEZyKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV19ZnVuY3Rpb24ga3IodCxlLG4pe3JldHVybiJwbGFuYXIiPT09bi5tZXRob2Q/QXIodCxlLG4pOm1lKHQsZSxuKX1mdW5jdGlvbiBHcih0LGUsbixyLGksbyxzLGEpe3ZhciB1LGwsYyxoLHA9e3g6bnVsbCx5Om51bGwsb25MaW5lMTohMSxvbkxpbmUyOiExfTtyZXR1cm4gMD09PSh1PShhLW8pKihuLXQpLShzLWkpKihyLWUpKT9udWxsIT09cC54JiZudWxsIT09cC55JiZwOihoPShuLXQpKihsPWUtbyktKHItZSkqKGM9dC1pKSxsPSgocy1pKSpsLShhLW8pKmMpL3UsYz1oL3UscC54PXQrbCoobi10KSxwLnk9ZStsKihyLWUpLGw+PTAmJmw8PTEmJihwLm9uTGluZTE9ITApLGM+PTAmJmM8PTEmJihwLm9uTGluZTI9ITApLCEoIXAub25MaW5lMXx8IXAub25MaW5lMikmJltwLngscC55XSl9ZnVuY3Rpb24gcXIodCl7Zm9yKHZhciBlPWZ1bmN0aW9uKHQpe2lmKCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUpcmV0dXJuIkZlYXR1cmUiIT09dC50eXBlP2YoW28odCldKTpmKFt0XSk7cmV0dXJuIHR9KHQpLG49eG4oZSkscj0hMSxpPTA7IXImJmk8ZS5mZWF0dXJlcy5sZW5ndGg7KXt2YXIgcyx1PWUuZmVhdHVyZXNbaV0uZ2VvbWV0cnksbD0hMTtpZigiUG9pbnQiPT09dS50eXBlKW4uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF09PT11LmNvb3JkaW5hdGVzWzBdJiZuLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdPT09dS5jb29yZGluYXRlc1sxXSYmKHI9ITApO2Vsc2UgaWYoIk11bHRpUG9pbnQiPT09dS50eXBlKXt2YXIgYz0hMTtmb3Iocz0wOyFjJiZzPHUuY29vcmRpbmF0ZXMubGVuZ3RoOyluLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdPT09dS5jb29yZGluYXRlc1tzXVswXSYmbi5nZW9tZXRyeS5jb29yZGluYXRlc1sxXT09PXUuY29vcmRpbmF0ZXNbc11bMV0mJihyPSEwLGM9ITApLHMrK31lbHNlIGlmKCJMaW5lU3RyaW5nIj09PXUudHlwZSlmb3Iocz0wOyFsJiZzPHUuY29vcmRpbmF0ZXMubGVuZ3RoLTE7KUJyKG4uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sbi5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSx1LmNvb3JkaW5hdGVzW3NdWzBdLHUuY29vcmRpbmF0ZXNbc11bMV0sdS5jb29yZGluYXRlc1tzKzFdWzBdLHUuY29vcmRpbmF0ZXNbcysxXVsxXSkmJihsPSEwLHI9ITApLHMrKztlbHNlIGlmKCJNdWx0aUxpbmVTdHJpbmciPT09dS50eXBlKWZvcih2YXIgaD0wO2g8dS5jb29yZGluYXRlcy5sZW5ndGg7KXtsPSExLHM9MDtmb3IodmFyIHA9dS5jb29yZGluYXRlc1toXTshbCYmczxwLmxlbmd0aC0xOylCcihuLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLG4uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0scFtzXVswXSxwW3NdWzFdLHBbcysxXVswXSxwW3MrMV1bMV0pJiYobD0hMCxyPSEwKSxzKys7aCsrfWVsc2UiUG9seWdvbiIhPT11LnR5cGUmJiJNdWx0aVBvbHlnb24iIT09dS50eXBlfHx5ZShuLHUpJiYocj0hMCk7aSsrfWlmKHIpcmV0dXJuIG47dmFyIGc9ZihbXSk7Zm9yKGk9MDtpPGUuZmVhdHVyZXMubGVuZ3RoO2krKylnLmZlYXR1cmVzPWcuZmVhdHVyZXMuY29uY2F0KGJuKGUuZmVhdHVyZXNbaV0pLmZlYXR1cmVzKTtyZXR1cm4gYShKbihuLGcpLmdlb21ldHJ5LmNvb3JkaW5hdGVzKX1mdW5jdGlvbiBCcih0LGUsbixyLGksbyl7cmV0dXJuIE1hdGguc3FydCgoaS1uKSooaS1uKSsoby1yKSooby1yKSk9PT1NYXRoLnNxcnQoKHQtbikqKHQtbikrKGUtcikqKGUtcikpK01hdGguc3FydCgoaS10KSooaS10KSsoby1lKSooby1lKSl9TXIuZGVmYXVsdD1Mcjt2YXIgenI9NjM3ODEzNztmdW5jdGlvbiBqcih0KXtyZXR1cm4gQih0LChmdW5jdGlvbih0LGUpe3JldHVybiB0K2Z1bmN0aW9uKHQpe3ZhciBlLG49MDtzd2l0Y2godC50eXBlKXtjYXNlIlBvbHlnb24iOnJldHVybiBVcih0LmNvb3JkaW5hdGVzKTtjYXNlIk11bHRpUG9seWdvbiI6Zm9yKGU9MDtlPHQuY29vcmRpbmF0ZXMubGVuZ3RoO2UrKyluKz1Vcih0LmNvb3JkaW5hdGVzW2VdKTtyZXR1cm4gbjtjYXNlIlBvaW50IjpjYXNlIk11bHRpUG9pbnQiOmNhc2UiTGluZVN0cmluZyI6Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiAwfXJldHVybiAwfShlKX0pLDApfWZ1bmN0aW9uIFVyKHQpe3ZhciBlPTA7aWYodCYmdC5sZW5ndGg+MCl7ZSs9TWF0aC5hYnMoVnIodFswXSkpO2Zvcih2YXIgbj0xO248dC5sZW5ndGg7bisrKWUtPU1hdGguYWJzKFZyKHRbbl0pKX1yZXR1cm4gZX1mdW5jdGlvbiBWcih0KXt2YXIgZSxuLHIsaSxvLHMsYT0wLHU9dC5sZW5ndGg7aWYodT4yKXtmb3Iocz0wO3M8dTtzKyspcz09PXUtMj8ocj11LTIsaT11LTEsbz0wKTpzPT09dS0xPyhyPXUtMSxpPTAsbz0xKToocj1zLGk9cysxLG89cysyKSxlPXRbcl0sbj10W2ldLGErPShYcih0W29dWzBdKS1YcihlWzBdKSkqTWF0aC5zaW4oWHIoblsxXSkpO2E9YSp6cip6ci8yfXJldHVybiBhfWZ1bmN0aW9uIFhyKHQpe3JldHVybiB0Kk1hdGguUEkvMTgwfWZ1bmN0aW9uIFlyKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxWKHQsKGZ1bmN0aW9uKHQsbil7dmFyIHI9bi5nZW9tZXRyeS5jb29yZGluYXRlcztyZXR1cm4gdCttZShyWzBdLHJbMV0sZSl9KSwwKX1mdW5jdGlvbiBIcih0LGUsbixyKXtpZighUChyPXJ8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBpLG89W107aWYoIkZlYXR1cmUiPT09dC50eXBlKWk9dC5nZW9tZXRyeS5jb29yZGluYXRlcztlbHNle2lmKCJMaW5lU3RyaW5nIiE9PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoImlucHV0IG11c3QgYmUgYSBMaW5lU3RyaW5nIEZlYXR1cmUgb3IgR2VvbWV0cnkiKTtpPXQuY29vcmRpbmF0ZXN9Zm9yKHZhciBzLGEsdSxsPWkubGVuZ3RoLGM9MCxwPTA7cDxpLmxlbmd0aCYmIShlPj1jJiZwPT09aS5sZW5ndGgtMSk7cCsrKXtpZihjPmUmJjA9PT1vLmxlbmd0aCl7aWYoIShzPWUtYykpcmV0dXJuIG8ucHVzaChpW3BdKSxoKG8pO2E9bW4oaVtwXSxpW3AtMV0pLTE4MCx1PXZuKGlbcF0scyxhLHIpLG8ucHVzaCh1Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKX1pZihjPj1uKXJldHVybihzPW4tYyk/KGE9bW4oaVtwXSxpW3AtMV0pLTE4MCx1PXZuKGlbcF0scyxhLHIpLG8ucHVzaCh1Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSxoKG8pKTooby5wdXNoKGlbcF0pLGgobykpO2lmKGM+PWUmJm8ucHVzaChpW3BdKSxwPT09aS5sZW5ndGgtMSlyZXR1cm4gaChvKTtjKz1tZShpW3BdLGlbcCsxXSxyKX1pZihjPGUmJmkubGVuZ3RoPT09bCl0aHJvdyBuZXcgRXJyb3IoIlN0YXJ0IHBvc2l0aW9uIGlzIGJleW9uZCBsaW5lIik7dmFyIGY9aVtpLmxlbmd0aC0xXTtyZXR1cm4gaChbZixmXSl9ZnVuY3Rpb24gV3IodCxlLG4pe3ZvaWQgMD09PW4mJihuPXt9KTtmb3IodmFyIHI9Syh0KSxpPVEoZSksbz0wO288aS5sZW5ndGgtMTtvKyspe3ZhciBzPSExO2lmKG4uaWdub3JlRW5kVmVydGljZXMmJigwPT09byYmKHM9InN0YXJ0Iiksbz09PWkubGVuZ3RoLTImJihzPSJlbmQiKSwwPT09byYmbysxPT09aS5sZW5ndGgtMSYmKHM9ImJvdGgiKSksSnIoaVtvXSxpW28rMV0scixzLHZvaWQgMD09PW4uZXBzaWxvbj9udWxsOm4uZXBzaWxvbikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gSnIodCxlLG4scixpKXt2YXIgbz1uWzBdLHM9blsxXSxhPXRbMF0sdT10WzFdLGw9ZVswXSxjPWVbMV0saD1sLWEscD1jLXUsZj0oblswXS1hKSpwLShuWzFdLXUpKmg7aWYobnVsbCE9PWkpe2lmKE1hdGguYWJzKGYpPmkpcmV0dXJuITF9ZWxzZSBpZigwIT09ZilyZXR1cm4hMTtyZXR1cm4gcj8ic3RhcnQiPT09cj9NYXRoLmFicyhoKT49TWF0aC5hYnMocCk/aD4wP2E8byYmbzw9bDpsPD1vJiZvPGE6cD4wP3U8cyYmczw9YzpjPD1zJiZzPHU6ImVuZCI9PT1yP01hdGguYWJzKGgpPj1NYXRoLmFicyhwKT9oPjA/YTw9byYmbzxsOmw8byYmbzw9YTpwPjA/dTw9cyYmczxjOmM8cyYmczw9dToiYm90aCI9PT1yJiYoTWF0aC5hYnMoaCk+PU1hdGguYWJzKHApP2g+MD9hPG8mJm88bDpsPG8mJm88YTpwPjA/dTxzJiZzPGM6YzxzJiZzPHUpOk1hdGguYWJzKGgpPj1NYXRoLmFicyhwKT9oPjA/YTw9byYmbzw9bDpsPD1vJiZvPD1hOnA+MD91PD1zJiZzPD1jOmM8PXMmJnM8PXV9ZnVuY3Rpb24gWnIodCxlKXt2YXIgbj1ydCh0KSxyPXJ0KGUpLGk9bi50eXBlLG89ci50eXBlO3N3aXRjaChpKXtjYXNlIlBvaW50Ijpzd2l0Y2gobyl7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbixyPSExO2ZvcihuPTA7bjxlLmNvb3JkaW5hdGVzLmxlbmd0aDtuKyspaWYoUXIoZS5jb29yZGluYXRlc1tuXSx0LmNvb3JkaW5hdGVzKSl7cj0hMDticmVha31yZXR1cm4gcn0obixyKTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBXcihuLHIse2lnbm9yZUVuZFZlcnRpY2VzOiEwfSk7Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIHllKG4scix7aWdub3JlQm91bmRhcnk6ITB9KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZmVhdHVyZTIgIitvKyIgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpfWNhc2UiTXVsdGlQb2ludCI6c3dpdGNoKG8pe2Nhc2UiTXVsdGlQb2ludCI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0LmNvb3JkaW5hdGVzLmxlbmd0aDtuKyspe2Zvcih2YXIgcj0hMSxpPTA7aTxlLmNvb3JkaW5hdGVzLmxlbmd0aDtpKyspUXIodC5jb29yZGluYXRlc1tuXSxlLmNvb3JkaW5hdGVzW2ldKSYmKHI9ITApO2lmKCFyKXJldHVybiExfXJldHVybiEwfShuLHIpO2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPSExLHI9MDtyPHQuY29vcmRpbmF0ZXMubGVuZ3RoO3IrKyl7aWYoIVdyKHQuY29vcmRpbmF0ZXNbcl0sZSkpcmV0dXJuITE7bnx8KG49V3IodC5jb29yZGluYXRlc1tyXSxlLHtpZ25vcmVFbmRWZXJ0aWNlczohMH0pKX1yZXR1cm4gbn0obixyKTtjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ITAscj0hMSxpPTA7aTx0LmNvb3JkaW5hdGVzLmxlbmd0aDtpKyspe2lmKCEocj15ZSh0LmNvb3JkaW5hdGVzWzFdLGUpKSl7bj0hMTticmVha31yPXllKHQuY29vcmRpbmF0ZXNbMV0sZSx7aWdub3JlQm91bmRhcnk6ITB9KX1yZXR1cm4gbiYmcn0obixyKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZmVhdHVyZTIgIitvKyIgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpfWNhc2UiTGluZVN0cmluZyI6c3dpdGNoKG8pe2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0LmNvb3JkaW5hdGVzLmxlbmd0aDtuKyspaWYoIVdyKHQuY29vcmRpbmF0ZXNbbl0sZSkpcmV0dXJuITE7cmV0dXJuITB9KG4scik7Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49WihlKSxyPVoodCk7aWYoIUtyKG4scikpcmV0dXJuITE7Zm9yKHZhciBpPSExLG89MDtvPHQuY29vcmRpbmF0ZXMubGVuZ3RoLTE7bysrKXtpZigheWUodC5jb29yZGluYXRlc1tvXSxlKSlyZXR1cm4hMTtpZihpfHwoaT15ZSh0LmNvb3JkaW5hdGVzW29dLGUse2lnbm9yZUJvdW5kYXJ5OiEwfSkpLCFpKWk9eWUoJHIodC5jb29yZGluYXRlc1tvXSx0LmNvb3JkaW5hdGVzW28rMV0pLGUse2lnbm9yZUJvdW5kYXJ5OiEwfSl9cmV0dXJuIGl9KG4scik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmUyICIrbysiIGdlb21ldHJ5IG5vdCBzdXBwb3J0ZWQiKX1jYXNlIlBvbHlnb24iOnN3aXRjaChvKXtjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj1aKHQpO2lmKCFLcihaKGUpLG4pKXJldHVybiExO2Zvcih2YXIgcj0wO3I8dC5jb29yZGluYXRlc1swXS5sZW5ndGg7cisrKWlmKCF5ZSh0LmNvb3JkaW5hdGVzWzBdW3JdLGUpKXJldHVybiExO3JldHVybiEwfShuLHIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlMiAiK28rIiBnZW9tZXRyeSBub3Qgc3VwcG9ydGVkIil9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmUxICIraSsiIGdlb21ldHJ5IG5vdCBzdXBwb3J0ZWQiKX19ZnVuY3Rpb24gS3IodCxlKXtyZXR1cm4hKHRbMF0+ZVswXSkmJighKHRbMl08ZVsyXSkmJighKHRbMV0+ZVsxXSkmJiEodFszXTxlWzNdKSkpfWZ1bmN0aW9uIFFyKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX1mdW5jdGlvbiAkcih0LGUpe3JldHVyblsodFswXStlWzBdKS8yLCh0WzFdK2VbMV0pLzJdfWZ1bmN0aW9uIHRpKHQsZSxuKXt2b2lkIDA9PT1uJiYobj17fSksbi5tYXNrJiYhbi51bml0cyYmKG4udW5pdHM9ImtpbG9tZXRlcnMiKTtmb3IodmFyIHI9W10saT10WzBdLG89dFsxXSxzPXRbMl0sdT10WzNdLGw9ZS9tZShbaSxvXSxbcyxvXSxuKSoocy1pKSxjPWUvbWUoW2ksb10sW2ksdV0sbikqKHUtbyksaD1zLWkscD11LW8sZz1NYXRoLmZsb29yKGgvbCksZD0ocC1NYXRoLmZsb29yKHAvYykqYykvMix5PWkrKGgtZypsKS8yO3k8PXM7KXtmb3IodmFyIHY9bytkO3Y8PXU7KXt2YXIgXz1hKFt5LHZdLG4ucHJvcGVydGllcyk7bi5tYXNrP1pyKF8sbi5tYXNrKSYmci5wdXNoKF8pOnIucHVzaChfKSx2Kz1jfXkrPWx9cmV0dXJuIGYocil9ZnVuY3Rpb24gZWkodCxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5wcmVjaXNpb24scj1lLmNvb3JkaW5hdGVzLGk9ZS5tdXRhdGU7aWYobj1udWxsPT1ufHxpc05hTihuKT82Om4scj1udWxsPT1yfHxpc05hTihyKT8zOnIsIXQpdGhyb3cgbmV3IEVycm9yKCI8Z2VvanNvbj4gaXMgcmVxdWlyZWQiKTtpZigibnVtYmVyIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yKCI8cHJlY2lzaW9uPiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBFcnJvcigiPGNvb3JkaW5hdGVzPiBtdXN0IGJlIGEgbnVtYmVyIik7ITEhPT1pJiZ2b2lkIDAhPT1pfHwodD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQpKSk7dmFyIG89TWF0aC5wb3coMTAsbik7cmV0dXJuIFIodCwoZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSxuKXt0Lmxlbmd0aD5uJiZ0LnNwbGljZShuLHQubGVuZ3RoKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdPU1hdGgucm91bmQodFtyXSplKS9lfSh0LG8scil9KSksdH1mdW5jdGlvbiBuaSh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTt2YXIgZT1bXTtyZXR1cm4geih0LChmdW5jdGlvbih0KXtlLnB1c2godCl9KSksZihlKX1mdW5jdGlvbiByaSh0LGUsbil7aWYoIlBvbHlnb24iIT09dC5nZW9tZXRyeS50eXBlKXRocm93IG5ldyBFcnJvcigiVGhlIGlucHV0IGZlYXR1cmUgbXVzdCBiZSBhIFBvbHlnb24iKTt2b2lkIDA9PT1uJiYobj0xKTt2YXIgcj10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzLGk9W10sbz17fTtpZihuKXtmb3IodmFyIHM9W10sYT0wO2E8ci5sZW5ndGg7YSsrKWZvcih2YXIgdT0wO3U8clthXS5sZW5ndGgtMTt1Kyspcy5wdXNoKGQoYSx1KSk7dmFyIGw9TnQoKTtsLmxvYWQocyl9Zm9yKHZhciBjPTA7YzxyLmxlbmd0aDtjKyspZm9yKHZhciBoPTA7aDxyW2NdLmxlbmd0aC0xO2grKyl7aWYobilsLnNlYXJjaChkKGMsaCkpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucmluZyxuPXQuZWRnZTtnKGMsaCxlLG4pfSkpO2Vsc2UgZm9yKHZhciBwPTA7cDxyLmxlbmd0aDtwKyspZm9yKHZhciBmPTA7ZjxyW3BdLmxlbmd0aC0xO2YrKylnKGMsaCxwLGYpfXJldHVybiBlfHwoaT17dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6e3R5cGU6Ik11bHRpUG9pbnQiLGNvb3JkaW5hdGVzOml9fSksaTtmdW5jdGlvbiBnKHQsbixzLGEpe3ZhciB1LGwsYz1yW3RdW25dLGg9clt0XVtuKzFdLHA9cltzXVthXSxmPXJbc11bYSsxXSxnPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKGlpKHQsbil8fGlpKHQscil8fGlpKGUsbil8fGlpKHIsbikpcmV0dXJuIG51bGw7dmFyIGk9dFswXSxvPXRbMV0scz1lWzBdLGE9ZVsxXSx1PW5bMF0sbD1uWzFdLGM9clswXSxoPXJbMV0scD0oaS1zKSoobC1oKS0oby1hKSoodS1jKTtyZXR1cm4gMD09PXA/bnVsbDpbKChpKmEtbypzKSoodS1jKS0oaS1zKSoodSpoLWwqYykpL3AsKChpKmEtbypzKSoobC1oKS0oby1hKSoodSpoLWwqYykpL3BdfShjLGgscCxmKTtpZihudWxsIT09ZyYmKHU9aFswXSE9PWNbMF0/KGdbMF0tY1swXSkvKGhbMF0tY1swXSk6KGdbMV0tY1sxXSkvKGhbMV0tY1sxXSksbD1mWzBdIT09cFswXT8oZ1swXS1wWzBdKS8oZlswXS1wWzBdKTooZ1sxXS1wWzFdKS8oZlsxXS1wWzFdKSwhKHU+PTF8fHU8PTB8fGw+PTF8fGw8PTApKSl7dmFyIGQ9Zyx5PSFvW2RdO3kmJihvW2RdPSEwKSxlP2kucHVzaChlKGcsdCxuLGMsaCx1LHMsYSxwLGYsbCx5KSk6aS5wdXNoKGcpfX1mdW5jdGlvbiBkKHQsZSl7dmFyIG4saSxvLHMsYT1yW3RdW2VdLHU9clt0XVtlKzFdO3JldHVybiBhWzBdPHVbMF0/KG49YVswXSxpPXVbMF0pOihuPXVbMF0saT1hWzBdKSxhWzFdPHVbMV0/KG89YVsxXSxzPXVbMV0pOihvPXVbMV0scz1hWzFdKSx7bWluWDpuLG1pblk6byxtYXhYOmksbWF4WTpzLHJpbmc6dCxlZGdlOmV9fX1mdW5jdGlvbiBpaSh0LGUpe2lmKCF0fHwhZSlyZXR1cm4hMTtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZih0W25daW5zdGFuY2VvZiBBcnJheSYmZVtuXWluc3RhbmNlb2YgQXJyYXkpe2lmKCFpaSh0W25dLGVbbl0pKXJldHVybiExfWVsc2UgaWYodFtuXSE9PWVbbl0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gb2kodCl7aWYoIkZlYXR1cmUiIT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJUaGUgaW5wdXQgbXVzdCBhIGdlb2pzb24gb2JqZWN0IG9mIHR5cGUgRmVhdHVyZSIpO2lmKHZvaWQgMD09PXQuZ2VvbWV0cnl8fG51bGw9PXQuZ2VvbWV0cnkpdGhyb3cgbmV3IEVycm9yKCJUaGUgaW5wdXQgbXVzdCBhIGdlb2pzb24gb2JqZWN0IHdpdGggYSBub24tZW1wdHkgZ2VvbWV0cnkiKTtpZigiUG9seWdvbiIhPXQuZ2VvbWV0cnkudHlwZSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBpbnB1dCBtdXN0IGJlIGEgZ2VvanNvbiBQb2x5Z29uIik7Zm9yKHZhciBlPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoLG49W10scj0wO3I8ZTtyKyspe3ZhciBpPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbcl07Y2koaVswXSxpW2kubGVuZ3RoLTFdKXx8aS5wdXNoKGlbMF0pLG4ucHVzaC5hcHBseShuLGkuc2xpY2UoMCxpLmxlbmd0aC0xKSl9aWYoIWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT17fSxuPTEscj0wLGk9dC5sZW5ndGg7cjxpOysrcil7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdFtyXSkpe249MDticmVha31lW3Rbcl1dPTF9cmV0dXJuIG59KG4pKXRocm93IG5ldyBFcnJvcigiVGhlIGlucHV0IHBvbHlnb24gbWF5IG5vdCBoYXZlIGR1cGxpY2F0ZSB2ZXJ0aWNlcyAoZXhjZXB0IGZvciB0aGUgZmlyc3QgYW5kIGxhc3QgdmVydGV4IG9mIGVhY2ggcmluZykiKTt2YXIgbz1uLmxlbmd0aCxzPXJpKHQsKGZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMsYSx1LGwsYyxoKXtyZXR1cm5bdCxlLG4scixpLG8scyxhLHUsbCxjLGhdfSkpLGE9cy5sZW5ndGg7aWYoMD09YSl7dmFyIHU9W107Zm9yKHI9MDtyPGU7cisrKXUucHVzaChsKFt0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzW3JdXSx7cGFyZW50Oi0xLHdpbmRpbmc6bGkodC5nZW9tZXRyeS5jb29yZGluYXRlc1tyXSl9KSk7dmFyIGM9Zih1KTtyZXR1cm4gRygpLHEoKSxjfXZhciBoPVtdLHA9W107Zm9yKHI9MDtyPGU7cisrKXtoLnB1c2goW10pO2Zvcih2YXIgZz0wO2c8dC5nZW9tZXRyeS5jb29yZGluYXRlc1tyXS5sZW5ndGgtMTtnKyspaFtyXS5wdXNoKFtuZXcgc2kodC5nZW9tZXRyeS5jb29yZGluYXRlc1tyXVtoaShnKzEsdC5nZW9tZXRyeS5jb29yZGluYXRlc1tyXS5sZW5ndGgtMSldLDEsW3IsZ10sW3IsaGkoZysxLHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbcl0ubGVuZ3RoLTEpXSx2b2lkIDApXSkscC5wdXNoKG5ldyBhaSh0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzW3JdW2ddLFtyLGhpKGctMSx0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzW3JdLmxlbmd0aC0xKV0sW3IsZ10sdm9pZCAwLHZvaWQgMCwhMSwhMCkpfWZvcihyPTA7cjxhO3IrKyloW3Nbcl1bMV1dW3Nbcl1bMl1dLnB1c2gobmV3IHNpKHNbcl1bMF0sc1tyXVs1XSxbc1tyXVsxXSxzW3JdWzJdXSxbc1tyXVs2XSxzW3JdWzddXSx2b2lkIDApKSxzW3JdWzExXSYmcC5wdXNoKG5ldyBhaShzW3JdWzBdLFtzW3JdWzFdLHNbcl1bMl1dLFtzW3JdWzZdLHNbcl1bN11dLHZvaWQgMCx2b2lkIDAsITAsITApKTt2YXIgZD1wLmxlbmd0aDtmb3Iocj0wO3I8aC5sZW5ndGg7cisrKWZvcihnPTA7ZzxoW3JdLmxlbmd0aDtnKyspaFtyXVtnXS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LnBhcmFtPGUucGFyYW0/LTE6MX0pKTt2YXIgeT1bXTtmb3Iocj0wO3I8ZDtyKyspeS5wdXNoKHttaW5YOnBbcl0uY29vcmRbMF0sbWluWTpwW3JdLmNvb3JkWzFdLG1heFg6cFtyXS5jb29yZFswXSxtYXhZOnBbcl0uY29vcmRbMV0saW5kZXg6cn0pO3ZhciB2PU50KCk7di5sb2FkKHkpO2ZvcihyPTA7cjxoLmxlbmd0aDtyKyspZm9yKGc9MDtnPGhbcl0ubGVuZ3RoO2crKylmb3IodmFyIF89MDtfPGhbcl1bZ10ubGVuZ3RoO18rKyl7eD1fPT1oW3JdW2ddLmxlbmd0aC0xP2hbcl1baGkoZysxLHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbcl0ubGVuZ3RoLTEpXVswXS5jb29yZDpoW3JdW2ddW18rMV0uY29vcmQ7dmFyIG09di5zZWFyY2goe21pblg6eFswXSxtaW5ZOnhbMV0sbWF4WDp4WzBdLG1heFk6eFsxXX0pWzBdO2hbcl1bZ11bX10ubnh0SXNlY3RBbG9uZ0VkZ2VJbj1tLmluZGV4fWZvcihyPTA7cjxoLmxlbmd0aDtyKyspZm9yKGc9MDtnPGhbcl0ubGVuZ3RoO2crKylmb3IoXz0wO188aFtyXVtnXS5sZW5ndGg7XysrKXt2YXIgeD1oW3JdW2ddW19dLmNvb3JkLEU9KG09di5zZWFyY2goe21pblg6eFswXSxtaW5ZOnhbMV0sbWF4WDp4WzBdLG1heFk6eFsxXX0pWzBdKS5pbmRleDtFPG8/cFtFXS5ueHRJc2VjdEFsb25nUmluZ0FuZEVkZ2UyPWhbcl1bZ11bX10ubnh0SXNlY3RBbG9uZ0VkZ2VJbjpjaShwW0VdLnJpbmdBbmRFZGdlMSxoW3JdW2ddW19dLnJpbmdBbmRFZGdlSW4pP3BbRV0ubnh0SXNlY3RBbG9uZ1JpbmdBbmRFZGdlMT1oW3JdW2ddW19dLm54dElzZWN0QWxvbmdFZGdlSW46cFtFXS5ueHRJc2VjdEFsb25nUmluZ0FuZEVkZ2UyPWhbcl1bZ11bX10ubnh0SXNlY3RBbG9uZ0VkZ2VJbn12YXIgYj1bXTtmb3Iocj0wLGc9MDtnPGU7ZysrKXt2YXIgdz1yO2ZvcihfPTA7Xzx0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzW2ddLmxlbmd0aC0xO18rKylwW3JdLmNvb3JkWzBdPHBbd10uY29vcmRbMF0mJih3PXIpLHIrKzt2YXIgST1wW3ddLm54dElzZWN0QWxvbmdSaW5nQW5kRWRnZTI7Zm9yKF89MDtfPHAubGVuZ3RoO18rKylpZihwW19dLm54dElzZWN0QWxvbmdSaW5nQW5kRWRnZTE9PXd8fHBbX10ubnh0SXNlY3RBbG9uZ1JpbmdBbmRFZGdlMj09dyl7dmFyIE49XzticmVha312YXIgUz11aShbcFtOXS5jb29yZCxwW3ddLmNvb3JkLHBbSV0uY29vcmRdLCEwKT8xOi0xO2IucHVzaCh7aXNlY3Q6dyxwYXJlbnQ6LTEsd2luZGluZzpTfSl9Yi5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBwW3QuaXNlY3RdLmNvb3JkPnBbZS5pc2VjdF0uY29vcmQ/LTE6MX0pKTtmb3IodT1bXTtiLmxlbmd0aD4wOyl7dmFyIEM9Yi5wb3AoKSxQPUMuaXNlY3QsTT1DLnBhcmVudCxMPUMud2luZGluZyxPPXUubGVuZ3RoLFI9W3BbUF0uY29vcmRdLFQ9UDtpZihwW1BdLnJpbmdBbmRFZGdlMVdhbGthYmxlKXZhciBBPXBbUF0ucmluZ0FuZEVkZ2UxLEQ9cFtQXS5ueHRJc2VjdEFsb25nUmluZ0FuZEVkZ2UxO2Vsc2UgQT1wW1BdLnJpbmdBbmRFZGdlMixEPXBbUF0ubnh0SXNlY3RBbG9uZ1JpbmdBbmRFZGdlMjtmb3IoOyFjaShwW1BdLmNvb3JkLHBbRF0uY29vcmQpOyl7Ui5wdXNoKHBbRF0uY29vcmQpO3ZhciBGPXZvaWQgMDtmb3Iocj0wO3I8Yi5sZW5ndGg7cisrKWlmKGJbcl0uaXNlY3Q9PUQpe0Y9cjticmVha31pZihudWxsIT1GJiZiLnNwbGljZShGLDEpLGNpKEEscFtEXS5yaW5nQW5kRWRnZTEpKXtpZihBPXBbRF0ucmluZ0FuZEVkZ2UyLHBbRF0ucmluZ0FuZEVkZ2UyV2Fsa2FibGU9ITEscFtEXS5yaW5nQW5kRWRnZTFXYWxrYWJsZSl7dmFyIGs9e2lzZWN0OkR9O3VpKFtwW1RdLmNvb3JkLHBbRF0uY29vcmQscFtwW0RdLm54dElzZWN0QWxvbmdSaW5nQW5kRWRnZTJdLmNvb3JkXSwxPT1MKT8oay5wYXJlbnQ9TSxrLndpbmRpbmc9LUwpOihrLnBhcmVudD1PLGsud2luZGluZz1MKSxiLnB1c2goayl9VD1ELEQ9cFtEXS5ueHRJc2VjdEFsb25nUmluZ0FuZEVkZ2UyfWVsc2V7aWYoQT1wW0RdLnJpbmdBbmRFZGdlMSxwW0RdLnJpbmdBbmRFZGdlMVdhbGthYmxlPSExLHBbRF0ucmluZ0FuZEVkZ2UyV2Fsa2FibGUpe2s9e2lzZWN0OkR9O3VpKFtwW1RdLmNvb3JkLHBbRF0uY29vcmQscFtwW0RdLm54dElzZWN0QWxvbmdSaW5nQW5kRWRnZTFdLmNvb3JkXSwxPT1MKT8oay5wYXJlbnQ9TSxrLndpbmRpbmc9LUwpOihrLnBhcmVudD1PLGsud2luZGluZz1MKSxiLnB1c2goayl9VD1ELEQ9cFtEXS5ueHRJc2VjdEFsb25nUmluZ0FuZEVkZ2UxfX1SLnB1c2gocFtEXS5jb29yZCksdS5wdXNoKGwoW1JdLHtpbmRleDpPLHBhcmVudDpNLHdpbmRpbmc6TCxuZXRXaW5kaW5nOnZvaWQgMH0pKX1jPWYodSk7ZnVuY3Rpb24gRygpe2Zvcih2YXIgdD1bXSxlPTA7ZTxjLmZlYXR1cmVzLmxlbmd0aDtlKyspLTE9PWMuZmVhdHVyZXNbZV0ucHJvcGVydGllcy5wYXJlbnQmJnQucHVzaChlKTtpZih0Lmxlbmd0aD4xKWZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspe2Zvcih2YXIgbj0tMSxyPTA7cjxjLmZlYXR1cmVzLmxlbmd0aDtyKyspdFtlXSE9ciYmeWUoYy5mZWF0dXJlc1t0W2VdXS5nZW9tZXRyeS5jb29yZGluYXRlc1swXVswXSxjLmZlYXR1cmVzW3JdLHtpZ25vcmVCb3VuZGFyeTohMH0pJiZqcihjLmZlYXR1cmVzW3JdKTxJbmZpbml0eSYmKG49cik7Yy5mZWF0dXJlc1t0W2VdXS5wcm9wZXJ0aWVzLnBhcmVudD1ufX1mdW5jdGlvbiBxKCl7Zm9yKHZhciB0PTA7dDxjLmZlYXR1cmVzLmxlbmd0aDt0KyspaWYoLTE9PWMuZmVhdHVyZXNbdF0ucHJvcGVydGllcy5wYXJlbnQpe3ZhciBlPWMuZmVhdHVyZXNbdF0ucHJvcGVydGllcy53aW5kaW5nO2MuZmVhdHVyZXNbdF0ucHJvcGVydGllcy5uZXRXaW5kaW5nPWUsQih0LGUpfX1mdW5jdGlvbiBCKHQsZSl7Zm9yKHZhciBuPTA7bjxjLmZlYXR1cmVzLmxlbmd0aDtuKyspaWYoYy5mZWF0dXJlc1tuXS5wcm9wZXJ0aWVzLnBhcmVudD09dCl7dmFyIHI9ZStjLmZlYXR1cmVzW25dLnByb3BlcnRpZXMud2luZGluZztjLmZlYXR1cmVzW25dLnByb3BlcnRpZXMubmV0V2luZGluZz1yLEIobixyKX19cmV0dXJuIEcoKSxxKCksY312YXIgc2k9ZnVuY3Rpb24odCxlLG4scixpKXt0aGlzLmNvb3JkPXQsdGhpcy5wYXJhbT1lLHRoaXMucmluZ0FuZEVkZ2VJbj1uLHRoaXMucmluZ0FuZEVkZ2VPdXQ9cix0aGlzLm54dElzZWN0QWxvbmdFZGdlSW49aX0sYWk9ZnVuY3Rpb24odCxlLG4scixpLG8scyl7dGhpcy5jb29yZD10LHRoaXMucmluZ0FuZEVkZ2UxPWUsdGhpcy5yaW5nQW5kRWRnZTI9bix0aGlzLm54dElzZWN0QWxvbmdSaW5nQW5kRWRnZTE9cix0aGlzLm54dElzZWN0QWxvbmdSaW5nQW5kRWRnZTI9aSx0aGlzLnJpbmdBbmRFZGdlMVdhbGthYmxlPW8sdGhpcy5yaW5nQW5kRWRnZTJXYWxrYWJsZT1zfTtmdW5jdGlvbiB1aSh0LGUpe2lmKHZvaWQgMD09PWUmJihlPSEwKSwzIT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgYW4gYXJyYXkgb2YgdGhyZWUgcG9pbnRzIFt4LHldIik7cmV0dXJuKHRbMV1bMF0tdFswXVswXSkqKHRbMl1bMV0tdFswXVsxXSktKHRbMV1bMV0tdFswXVsxXSkqKHRbMl1bMF0tdFswXVswXSk+PTA9PWV9ZnVuY3Rpb24gbGkodCl7Zm9yKHZhciBlPTAsbj0wO248dC5sZW5ndGgtMTtuKyspdFtuXVswXTx0W2VdWzBdJiYoZT1uKTtpZih1aShbdFtoaShlLTEsdC5sZW5ndGgtMSldLHRbZV0sdFtoaShlKzEsdC5sZW5ndGgtMSldXSwhMCkpdmFyIHI9MTtlbHNlIHI9LTE7cmV0dXJuIHJ9ZnVuY3Rpb24gY2kodCxlKXtpZighdHx8IWUpcmV0dXJuITE7aWYodC5sZW5ndGghPWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZih0W25daW5zdGFuY2VvZiBBcnJheSYmZVtuXWluc3RhbmNlb2YgQXJyYXkpe2lmKCFjaSh0W25dLGVbbl0pKXJldHVybiExfWVsc2UgaWYodFtuXSE9ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBoaSh0LGUpe3JldHVybih0JWUrZSklZX12YXIgcGk9TWF0aC5QSS8xODAsZmk9MTgwL01hdGguUEksZ2k9ZnVuY3Rpb24odCxlKXt0aGlzLmxvbj10LHRoaXMubGF0PWUsdGhpcy54PXBpKnQsdGhpcy55PXBpKmV9O2dpLnByb3RvdHlwZS52aWV3PWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZyh0aGlzLmxvbikuc2xpY2UoMCw0KSsiLCIrU3RyaW5nKHRoaXMubGF0KS5zbGljZSgwLDQpfSxnaS5wcm90b3R5cGUuYW50aXBvZGU9ZnVuY3Rpb24oKXt2YXIgdD0tMSp0aGlzLmxhdCxlPXRoaXMubG9uPDA/MTgwK3RoaXMubG9uOi0xKigxODAtdGhpcy5sb24pO3JldHVybiBuZXcgZ2koZSx0KX07dmFyIGRpPWZ1bmN0aW9uKCl7dGhpcy5jb29yZHM9W10sdGhpcy5sZW5ndGg9MH07ZGkucHJvdG90eXBlLm1vdmVfdG89ZnVuY3Rpb24odCl7dGhpcy5sZW5ndGgrKyx0aGlzLmNvb3Jkcy5wdXNoKHQpfTt2YXIgeWk9ZnVuY3Rpb24odCl7dGhpcy5wcm9wZXJ0aWVzPXR8fHt9LHRoaXMuZ2VvbWV0cmllcz1bXX07eWkucHJvdG90eXBlLmpzb249ZnVuY3Rpb24oKXtpZih0aGlzLmdlb21ldHJpZXMubGVuZ3RoPD0wKXJldHVybntnZW9tZXRyeTp7dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6bnVsbH0sdHlwZToiRmVhdHVyZSIscHJvcGVydGllczp0aGlzLnByb3BlcnRpZXN9O2lmKDE9PT10aGlzLmdlb21ldHJpZXMubGVuZ3RoKXJldHVybntnZW9tZXRyeTp7dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dGhpcy5nZW9tZXRyaWVzWzBdLmNvb3Jkc30sdHlwZToiRmVhdHVyZSIscHJvcGVydGllczp0aGlzLnByb3BlcnRpZXN9O2Zvcih2YXIgdD1bXSxlPTA7ZTx0aGlzLmdlb21ldHJpZXMubGVuZ3RoO2UrKyl0LnB1c2godGhpcy5nZW9tZXRyaWVzW2VdLmNvb3Jkcyk7cmV0dXJue2dlb21ldHJ5Ont0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9LHR5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6dGhpcy5wcm9wZXJ0aWVzfX0seWkucHJvdG90eXBlLndrdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0iIixlPSJMSU5FU1RSSU5HKCIsbj1mdW5jdGlvbih0KXtlKz10WzBdKyIgIit0WzFdKyIsIn0scj0wO3I8dGhpcy5nZW9tZXRyaWVzLmxlbmd0aDtyKyspe2lmKDA9PT10aGlzLmdlb21ldHJpZXNbcl0uY29vcmRzLmxlbmd0aClyZXR1cm4iTElORVNUUklORyhlbXB0eSkiO3RoaXMuZ2VvbWV0cmllc1tyXS5jb29yZHMuZm9yRWFjaChuKSx0Kz1lLnN1YnN0cmluZygwLGUubGVuZ3RoLTEpKyIpIn1yZXR1cm4gdH07dmFyIHZpPWZ1bmN0aW9uKHQsZSxuKXtpZighdHx8dm9pZCAwPT09dC54fHx2b2lkIDA9PT10LnkpdGhyb3cgbmV3IEVycm9yKCJHcmVhdENpcmNsZSBjb25zdHJ1Y3RvciBleHBlY3RzIHR3byBhcmdzOiBzdGFydCBhbmQgZW5kIG9iamVjdHMgd2l0aCB4IGFuZCB5IHByb3BlcnRpZXMiKTtpZighZXx8dm9pZCAwPT09ZS54fHx2b2lkIDA9PT1lLnkpdGhyb3cgbmV3IEVycm9yKCJHcmVhdENpcmNsZSBjb25zdHJ1Y3RvciBleHBlY3RzIHR3byBhcmdzOiBzdGFydCBhbmQgZW5kIG9iamVjdHMgd2l0aCB4IGFuZCB5IHByb3BlcnRpZXMiKTt0aGlzLnN0YXJ0PW5ldyBnaSh0LngsdC55KSx0aGlzLmVuZD1uZXcgZ2koZS54LGUueSksdGhpcy5wcm9wZXJ0aWVzPW58fHt9O3ZhciByPXRoaXMuc3RhcnQueC10aGlzLmVuZC54LGk9dGhpcy5zdGFydC55LXRoaXMuZW5kLnksbz1NYXRoLnBvdyhNYXRoLnNpbihpLzIpLDIpK01hdGguY29zKHRoaXMuc3RhcnQueSkqTWF0aC5jb3ModGhpcy5lbmQueSkqTWF0aC5wb3coTWF0aC5zaW4oci8yKSwyKTtpZih0aGlzLmc9MipNYXRoLmFzaW4oTWF0aC5zcXJ0KG8pKSx0aGlzLmc9PT1NYXRoLlBJKXRocm93IG5ldyBFcnJvcigiaXQgYXBwZWFycyAiK3QudmlldygpKyIgYW5kICIrZS52aWV3KCkrIiBhcmUgJ2FudGlwb2RhbCcsIGUuZyBkaWFtZXRyaWNhbGx5IG9wcG9zaXRlLCB0aHVzIHRoZXJlIGlzIG5vIHNpbmdsZSByb3V0ZSBidXQgcmF0aGVyIGluZmluaXRlIik7aWYoaXNOYU4odGhpcy5nKSl0aHJvdyBuZXcgRXJyb3IoImNvdWxkIG5vdCBjYWxjdWxhdGUgZ3JlYXQgY2lyY2xlIGJldHdlZW4gIit0KyIgYW5kICIrZSl9O2Z1bmN0aW9uIF9pKHQsZSl7dmFyIG49W10scj1NcigpO3JldHVybiB6KGUsKGZ1bmN0aW9uKGUpe2lmKG4uZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt0LmlkPWV9KSksbi5sZW5ndGgpe3ZhciBpPXIuc2VhcmNoKGUpO2lmKGkuZmVhdHVyZXMubGVuZ3RoKXt2YXIgbz14aShlLGkpO249bi5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmlkIT09by5pZH0pKSxyLnJlbW92ZShvKSxGKG1pKG8sZSksKGZ1bmN0aW9uKHQpe24ucHVzaCh0KSxyLmluc2VydCh0KX0pKX19ZWxzZShuPW1pKHQsZSkuZmVhdHVyZXMpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYmJveHx8KHQuYmJveD15bihaKHQpKSl9KSksci5sb2FkKGYobikpfSkpLGYobil9ZnVuY3Rpb24gbWkodCxlKXt2YXIgbj1bXSxyPVEodClbMF0saT1RKHQpW3QuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoLTFdO2lmKEVpKHIsSyhlKSl8fEVpKGksSyhlKSkpcmV0dXJuIGYoW3RdKTt2YXIgbz1NcigpLHM9Wm4odCk7by5sb2FkKHMpO3ZhciBhPW8uc2VhcmNoKGUpO2lmKCFhLmZlYXR1cmVzLmxlbmd0aClyZXR1cm4gZihbdF0pO3ZhciB1PXhpKGUsYSksbD1rKHMsKGZ1bmN0aW9uKHQscixpKXt2YXIgbz1RKHIpWzFdLHM9SyhlKTtyZXR1cm4gaT09PXUuaWQ/KHQucHVzaChzKSxuLnB1c2goaCh0KSksRWkocyxvKT9bc106W3Msb10pOih0LnB1c2gobyksdCl9KSxbcl0pO3JldHVybiBsLmxlbmd0aD4xJiZuLnB1c2goaChsKSksZihuKX1mdW5jdGlvbiB4aSh0LGUpe2lmKCFlLmZlYXR1cmVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImxpbmVzIG11c3QgY29udGFpbiBmZWF0dXJlcyIpO2lmKDE9PT1lLmZlYXR1cmVzLmxlbmd0aClyZXR1cm4gZS5mZWF0dXJlc1swXTt2YXIgbixyPTEvMDtyZXR1cm4gRihlLChmdW5jdGlvbihlKXt2YXIgaT1UcihlLHQpLnByb3BlcnRpZXMuZGlzdDtpPHImJihuPWUscj1pKX0pKSxufWZ1bmN0aW9uIEVpKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX1mdW5jdGlvbiBiaSh0LGUsbixyLGkpe3ZvaWQgMD09PWkmJihpPXt9KTt2YXIgbz1pLnN0ZXBzfHw2NCxzPXdpKG4pLGE9d2kociksdT1BcnJheS5pc0FycmF5KHQpfHwiRmVhdHVyZSIhPT10LnR5cGU/e306dC5wcm9wZXJ0aWVzO2lmKHM9PT1hKXJldHVybiBoKF9uKHQsZSxpKS5nZW9tZXRyeS5jb29yZGluYXRlc1swXSx1KTtmb3IodmFyIGw9cyxjPXM8YT9hOmErMzYwLHA9bCxmPVtdLGc9MDtwPGM7KWYucHVzaCh2bih0LGUscCxpKS5nZW9tZXRyeS5jb29yZGluYXRlcykscD1sKzM2MCorK2cvbztyZXR1cm4gcD5jJiZmLnB1c2godm4odCxlLGMsaSkuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpLGgoZix1KX1mdW5jdGlvbiB3aSh0KXt2YXIgZT10JTM2MDtyZXR1cm4gZTwwJiYoZSs9MzYwKSxlfWZ1bmN0aW9uIElpKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPXJ0KHQpO3N3aXRjaChlLnByb3BlcnRpZXN8fCJGZWF0dXJlIiE9PXQudHlwZXx8KGUucHJvcGVydGllcz10LnByb3BlcnRpZXMpLG4udHlwZSl7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gTmkobixlKTtjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPXJ0KHQpLmNvb3JkaW5hdGVzLHI9ZS5wcm9wZXJ0aWVzP2UucHJvcGVydGllczoiRmVhdHVyZSI9PT10LnR5cGU/dC5wcm9wZXJ0aWVzOnt9LGk9W107cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5wdXNoKFNpKHQscikpfSkpLGYoaSl9KG4sZSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcG9seSIpfX1mdW5jdGlvbiBOaSh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksU2kocnQodCkuY29vcmRpbmF0ZXMsZS5wcm9wZXJ0aWVzP2UucHJvcGVydGllczoiRmVhdHVyZSI9PT10LnR5cGU/dC5wcm9wZXJ0aWVzOnt9KX1mdW5jdGlvbiBTaSh0LGUpe3JldHVybiB0Lmxlbmd0aD4xP2codCxlKTpoKHRbMF0sZSl9ZnVuY3Rpb24gQ2kodCxlKXt2YXIgbixyLGk7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBvPWUucHJvcGVydGllcyxzPW51bGw9PT0obj1lLmF1dG9Db21wbGV0ZSl8fHZvaWQgMD09PW58fG4sYT1udWxsPT09KHI9ZS5vcmRlckNvb3Jkcyl8fHZvaWQgMD09PXJ8fHI7c3dpdGNoKG51bGwhPT0oaT1lLm11dGF0ZSkmJnZvaWQgMCE9PWkmJml8fCh0PUllKHQpKSx0LnR5cGUpe2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnZhciB1PVtdO3JldHVybiB0LmZlYXR1cmVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3UucHVzaChRKFBpKHQse30scyxhKSkpfSkpLHkodSxvKTtkZWZhdWx0OnJldHVybiBQaSh0LG8scyxhKX19ZnVuY3Rpb24gUGkodCxlLG4scil7ZT1lfHwoIkZlYXR1cmUiPT09dC50eXBlP3QucHJvcGVydGllczp7fSk7dmFyIGk9cnQodCksbz1pLmNvb3JkaW5hdGVzLHM9aS50eXBlO2lmKCFvLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImxpbmUgbXVzdCBjb250YWluIGNvb3JkaW5hdGVzIik7c3dpdGNoKHMpe2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIG4mJihvPU1pKG8pKSxsKFtvXSxlKTtjYXNlIk11bHRpTGluZVN0cmluZyI6dmFyIGE9W10sdT0wO3JldHVybiBvLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKG4mJih0PU1pKHQpKSxyKXt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT10WzBdLG49dFsxXSxyPXRbMl0saT10WzNdO3JldHVybiBNYXRoLmFicyhlLXIpKk1hdGguYWJzKG4taSl9KFooaCh0KSkpO2U+dT8oYS51bnNoaWZ0KHQpLHU9ZSk6YS5wdXNoKHQpfWVsc2UgYS5wdXNoKHQpfSkpLGwoYSxlKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZ2VvbWV0cnkgdHlwZSAiK3MrIiBpcyBub3Qgc3VwcG9ydGVkIil9fWZ1bmN0aW9uIE1pKHQpe3ZhciBlPXRbMF0sbj1lWzBdLHI9ZVsxXSxpPXRbdC5sZW5ndGgtMV0sbz1pWzBdLHM9aVsxXTtyZXR1cm4gbj09PW8mJnI9PT1zfHx0LnB1c2goZSksdH1mdW5jdGlvbiBMaSh0LGUpe3ZhciBuLHIsaSxvLHMsYSx1O2ZvcihyPTE7cjw9ODtyKj0yKXtmb3Iobj1bXSxvPSEoUmkoaT10W3QubGVuZ3RoLTFdLGUpJnIpLHM9MDtzPHQubGVuZ3RoO3MrKykodT0hKFJpKGE9dFtzXSxlKSZyKSkhPT1vJiZuLnB1c2goT2koaSxhLHIsZSkpLHUmJm4ucHVzaChhKSxpPWEsbz11O2lmKCEodD1uKS5sZW5ndGgpYnJlYWt9cmV0dXJuIG59ZnVuY3Rpb24gT2kodCxlLG4scil7cmV0dXJuIDgmbj9bdFswXSsoZVswXS10WzBdKSooclszXS10WzFdKS8oZVsxXS10WzFdKSxyWzNdXTo0Jm4/W3RbMF0rKGVbMF0tdFswXSkqKHJbMV0tdFsxXSkvKGVbMV0tdFsxXSksclsxXV06MiZuP1tyWzJdLHRbMV0rKGVbMV0tdFsxXSkqKHJbMl0tdFswXSkvKGVbMF0tdFswXSldOjEmbj9bclswXSx0WzFdKyhlWzFdLXRbMV0pKihyWzBdLXRbMF0pLyhlWzBdLXRbMF0pXTpudWxsfWZ1bmN0aW9uIFJpKHQsZSl7dmFyIG49MDtyZXR1cm4gdFswXTxlWzBdP258PTE6dFswXT5lWzJdJiYobnw9MiksdFsxXTxlWzFdP258PTQ6dFsxXT5lWzNdJiYobnw9OCksbn1mdW5jdGlvbiBUaSh0LGUpe2Zvcih2YXIgbj1bXSxyPTAsaT10O3I8aS5sZW5ndGg7cisrKXt2YXIgbz1MaShpW3JdLGUpO28ubGVuZ3RoPjAmJihvWzBdWzBdPT09b1tvLmxlbmd0aC0xXVswXSYmb1swXVsxXT09PW9bby5sZW5ndGgtMV1bMV18fG8ucHVzaChvWzBdKSxvLmxlbmd0aD49NCYmbi5wdXNoKG8pKX1yZXR1cm4gbn12aS5wcm90b3R5cGUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5zaW4oKDEtdCkqdGhpcy5nKS9NYXRoLnNpbih0aGlzLmcpLG49TWF0aC5zaW4odCp0aGlzLmcpL01hdGguc2luKHRoaXMuZykscj1lKk1hdGguY29zKHRoaXMuc3RhcnQueSkqTWF0aC5jb3ModGhpcy5zdGFydC54KStuKk1hdGguY29zKHRoaXMuZW5kLnkpKk1hdGguY29zKHRoaXMuZW5kLngpLGk9ZSpNYXRoLmNvcyh0aGlzLnN0YXJ0LnkpKk1hdGguc2luKHRoaXMuc3RhcnQueCkrbipNYXRoLmNvcyh0aGlzLmVuZC55KSpNYXRoLnNpbih0aGlzLmVuZC54KSxvPWUqTWF0aC5zaW4odGhpcy5zdGFydC55KStuKk1hdGguc2luKHRoaXMuZW5kLnkpLHM9ZmkqTWF0aC5hdGFuMihvLE1hdGguc3FydChNYXRoLnBvdyhyLDIpK01hdGgucG93KGksMikpKTtyZXR1cm5bZmkqTWF0aC5hdGFuMihpLHIpLHNdfSx2aS5wcm90b3R5cGUuQXJjPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107aWYoIXR8fHQ8PTIpbi5wdXNoKFt0aGlzLnN0YXJ0Lmxvbix0aGlzLnN0YXJ0LmxhdF0pLG4ucHVzaChbdGhpcy5lbmQubG9uLHRoaXMuZW5kLmxhdF0pO2Vsc2UgZm9yKHZhciByPTEvKHQtMSksaT0wO2k8dDsrK2kpe3ZhciBvPXIqaSxzPXRoaXMuaW50ZXJwb2xhdGUobyk7bi5wdXNoKHMpfWZvcih2YXIgYT0hMSx1PTAsbD1lJiZlLm9mZnNldD9lLm9mZnNldDoxMCxjPTE4MC1sLGg9LTE4MCtsLHA9MzYwLWwsZj0xO2Y8bi5sZW5ndGg7KytmKXt2YXIgZz1uW2YtMV1bMF0sZD1uW2ZdWzBdLHk9TWF0aC5hYnMoZC1nKTt5PnAmJihkPmMmJmc8aHx8Zz5jJiZkPGgpP2E9ITA6eT51JiYodT15KX12YXIgdj1bXTtpZihhJiZ1PGwpe3ZhciBfPVtdO3YucHVzaChfKTtmb3IodmFyIG09MDttPG4ubGVuZ3RoOysrbSl7dmFyIHg9cGFyc2VGbG9hdChuW21dWzBdKTtpZihtPjAmJk1hdGguYWJzKHgtblttLTFdWzBdKT5wKXt2YXIgRT1wYXJzZUZsb2F0KG5bbS0xXVswXSksYj1wYXJzZUZsb2F0KG5bbS0xXVsxXSksdz1wYXJzZUZsb2F0KG5bbV1bMF0pLEk9cGFyc2VGbG9hdChuW21dWzFdKTtpZihFPi0xODAmJkU8aCYmMTgwPT09dyYmbSsxPG4ubGVuZ3RoJiZuW20tMV1bMF0+LTE4MCYmblttLTFdWzBdPGgpe18ucHVzaChbLTE4MCxuW21dWzFdXSksbSsrLF8ucHVzaChbblttXVswXSxuW21dWzFdXSk7Y29udGludWV9aWYoRT5jJiZFPDE4MCYmLTE4MD09PXcmJm0rMTxuLmxlbmd0aCYmblttLTFdWzBdPmMmJm5bbS0xXVswXTwxODApe18ucHVzaChbMTgwLG5bbV1bMV1dKSxtKyssXy5wdXNoKFtuW21dWzBdLG5bbV1bMV1dKTtjb250aW51ZX1pZihFPGgmJnc+Yyl7dmFyIE49RTtFPXcsdz1OO3ZhciBTPWI7Yj1JLEk9U31pZihFPmMmJnc8aCYmKHcrPTM2MCksRTw9MTgwJiZ3Pj0xODAmJkU8dyl7dmFyIEM9KDE4MC1FKS8ody1FKSxQPUMqSSsoMS1DKSpiO18ucHVzaChbblttLTFdWzBdPmM/MTgwOi0xODAsUF0pLChfPVtdKS5wdXNoKFtuW20tMV1bMF0+Yz8tMTgwOjE4MCxQXSksdi5wdXNoKF8pfWVsc2UgXz1bXSx2LnB1c2goXyk7Xy5wdXNoKFt4LG5bbV1bMV1dKX1lbHNlIF8ucHVzaChbblttXVswXSxuW21dWzFdXSl9fWVsc2V7dmFyIE09W107di5wdXNoKE0pO2Zvcih2YXIgTD0wO0w8bi5sZW5ndGg7KytMKU0ucHVzaChbbltMXVswXSxuW0xdWzFdXSl9Zm9yKHZhciBPPW5ldyB5aSh0aGlzLnByb3BlcnRpZXMpLFI9MDtSPHYubGVuZ3RoOysrUil7dmFyIFQ9bmV3IGRpO08uZ2VvbWV0cmllcy5wdXNoKFQpO2Zvcih2YXIgQT12W1JdLEQ9MDtEPEEubGVuZ3RoOysrRClULm1vdmVfdG8oQVtEXSl9cmV0dXJuIE99O3ZhciBBaT1CdCgoZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZX0odC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3Qua2V5cz9PYmplY3Qua2V5czpuKS5zaGltPW59KSksRGk9QnQoKGZ1bmN0aW9uKHQsZSl7dmFyIG49IltvYmplY3QgQXJndW1lbnRzXSI9PWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudHMpfSgpO2Z1bmN0aW9uIHIodCl7cmV0dXJuIltvYmplY3QgQXJndW1lbnRzXSI9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBpKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJjYWxsZWUiKSYmIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LCJjYWxsZWUiKXx8ITF9KGU9dC5leHBvcnRzPW4/cjppKS5zdXBwb3J0ZWQ9cixlLnVuc3VwcG9ydGVkPWl9KSksRmk9QnQoKGZ1bmN0aW9uKHQpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZSxuPXQuZXhwb3J0cz1mdW5jdGlvbih0LG8scyl7cmV0dXJuIHN8fChzPXt9KSx0PT09b3x8KHQgaW5zdGFuY2VvZiBEYXRlJiZvIGluc3RhbmNlb2YgRGF0ZT90LmdldFRpbWUoKT09PW8uZ2V0VGltZSgpOiF0fHwhb3x8Im9iamVjdCIhPXR5cGVvZiB0JiYib2JqZWN0IiE9dHlwZW9mIG8/cy5zdHJpY3Q/dD09PW86dD09bzpmdW5jdGlvbih0LG8scyl7dmFyIGEsdTtpZihyKHQpfHxyKG8pKXJldHVybiExO2lmKHQucHJvdG90eXBlIT09by5wcm90b3R5cGUpcmV0dXJuITE7aWYoRGkodCkpcmV0dXJuISFEaShvKSYmKHQ9ZS5jYWxsKHQpLG89ZS5jYWxsKG8pLG4odCxvLHMpKTtpZihpKHQpKXtpZighaShvKSlyZXR1cm4hMTtpZih0Lmxlbmd0aCE9PW8ubGVuZ3RoKXJldHVybiExO2ZvcihhPTA7YTx0Lmxlbmd0aDthKyspaWYodFthXSE9PW9bYV0pcmV0dXJuITE7cmV0dXJuITB9dHJ5e3ZhciBsPUFpKHQpLGM9QWkobyl9Y2F0Y2godCl7cmV0dXJuITF9aWYobC5sZW5ndGghPWMubGVuZ3RoKXJldHVybiExO2ZvcihsLnNvcnQoKSxjLnNvcnQoKSxhPWwubGVuZ3RoLTE7YT49MDthLS0paWYobFthXSE9Y1thXSlyZXR1cm4hMTtmb3IoYT1sLmxlbmd0aC0xO2E+PTA7YS0tKWlmKHU9bFthXSwhbih0W3VdLG9bdV0scykpcmV0dXJuITE7cmV0dXJuIHR5cGVvZiB0PT10eXBlb2Ygb30odCxvLHMpKX07ZnVuY3Rpb24gcih0KXtyZXR1cm4gbnVsbD09dH1mdW5jdGlvbiBpKHQpe3JldHVybiEoIXR8fCJvYmplY3QiIT10eXBlb2YgdHx8Im51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aCkmJigiZnVuY3Rpb24iPT10eXBlb2YgdC5jb3B5JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zbGljZSYmISh0Lmxlbmd0aD4wJiYibnVtYmVyIiE9dHlwZW9mIHRbMF0pKX19KSk7ZnVuY3Rpb24ga2kodCxlLG4pe2lmKHZvaWQgMD09PW4mJihuPXt9KSwhUChuPW58fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciByLGk9bi50b2xlcmFuY2V8fDAsbz1bXSxzPU1yKCksYT1abih0KTtyZXR1cm4gcy5sb2FkKGEpLFUoZSwoZnVuY3Rpb24odCl7dmFyIGU9ITE7dCYmKEYocy5zZWFyY2godCksKGZ1bmN0aW9uKG4pe2lmKCExPT09ZSl7dmFyIG89USh0KS5zb3J0KCkscz1RKG4pLnNvcnQoKTtGaShvLHMpfHwoMD09PWk/V3Iob1swXSxuKSYmV3Iob1sxXSxuKTpUcihuLG9bMF0pLnByb3BlcnRpZXMuZGlzdDw9aSYmVHIobixvWzFdKS5wcm9wZXJ0aWVzLmRpc3Q8PWkpPyhlPSEwLHI9cj9HaShyLHQpOnQpOigwPT09aT9XcihzWzBdLHQpJiZXcihzWzFdLHQpOlRyKHQsc1swXSkucHJvcGVydGllcy5kaXN0PD1pJiZUcih0LHNbMV0pLnByb3BlcnRpZXMuZGlzdDw9aSkmJihyPXI/R2kocixuKTpuKX19KSksITE9PT1lJiZyJiYoby5wdXNoKHIpLHI9dm9pZCAwKSl9KSksciYmby5wdXNoKHIpLGYobyl9ZnVuY3Rpb24gR2kodCxlKXt2YXIgbj1RKGUpLHI9USh0KSxpPXJbMF0sbz1yW3IubGVuZ3RoLTFdLHM9dC5nZW9tZXRyeS5jb29yZGluYXRlcztyZXR1cm4gRmkoblswXSxpKT9zLnVuc2hpZnQoblsxXSk6RmkoblswXSxvKT9zLnB1c2goblsxXSk6RmkoblsxXSxpKT9zLnVuc2hpZnQoblswXSk6RmkoblsxXSxvKSYmcy5wdXNoKG5bMF0pLHR9ZnVuY3Rpb24gcWkodCl7dmFyIGU9dCUzNjA7cmV0dXJuIGU8MCYmKGUrPTM2MCksZX1mdW5jdGlvbiBCaSh0LGUsbil7dmFyIHI7cmV0dXJuIHZvaWQgMD09PW4mJihuPXt9KSwocj1uLmZpbmFsP3ppKEsoZSksSyh0KSk6emkoSyh0KSxLKGUpKSk+MTgwPy0oMzYwLXIpOnJ9ZnVuY3Rpb24gemkodCxlKXt2YXIgbj1JKHRbMV0pLHI9SShlWzFdKSxpPUkoZVswXS10WzBdKTtpPk1hdGguUEkmJihpLT0yKk1hdGguUEkpLGk8LU1hdGguUEkmJihpKz0yKk1hdGguUEkpO3ZhciBvPU1hdGgubG9nKE1hdGgudGFuKHIvMitNYXRoLlBJLzQpL01hdGgudGFuKG4vMitNYXRoLlBJLzQpKTtyZXR1cm4odyhNYXRoLmF0YW4yKGksbykpKzM2MCklMzYwfWZ1bmN0aW9uIGppKHQsbixyLGkpe3ZvaWQgMD09PWkmJihpPXt9KTt2YXIgbz1uPDAscz1OKE1hdGguYWJzKG4pLGkudW5pdHMsIm1ldGVycyIpO28mJihzPS1NYXRoLmFicyhzKSk7dmFyIHU9Syh0KSxsPWZ1bmN0aW9uKHQsbixyLGkpe2k9dm9pZCAwPT09aT9lOk51bWJlcihpKTt2YXIgbz1uL2kscz10WzBdKk1hdGguUEkvMTgwLGE9SSh0WzFdKSx1PUkociksbD1vKk1hdGguY29zKHUpLGM9YStsO01hdGguYWJzKGMpPk1hdGguUEkvMiYmKGM9Yz4wP01hdGguUEktYzotTWF0aC5QSS1jKTt2YXIgaD1NYXRoLmxvZyhNYXRoLnRhbihjLzIrTWF0aC5QSS80KS9NYXRoLnRhbihhLzIrTWF0aC5QSS80KSkscD1NYXRoLmFicyhoKT4xZS0xMT9sL2g6TWF0aC5jb3MoYSksZj1vKk1hdGguc2luKHUpL3A7cmV0dXJuWygxODAqKHMrZikvTWF0aC5QSSs1NDApJTM2MC0xODAsMTgwKmMvTWF0aC5QSV19KHUscyxyKTtyZXR1cm4gbFswXSs9bFswXS11WzBdPjE4MD8tMzYwOnVbMF0tbFswXT4xODA/MzYwOjAsYShsLGkucHJvcGVydGllcyl9ZnVuY3Rpb24gVWkodCxlLG4scixpLG8pe2Zvcih2YXIgcz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgYT10W3NdLHU9dFtzKzFdO3M9PT10Lmxlbmd0aC0xJiYodT10WzBdKSxyPVhpKGEsdSxlKSxuPD0wJiZyPjA/WGkoZSxhLGkpPDB8fChpPWEpOm4+MCYmcjw9MCYmKFZpKGUsYSxvKXx8KG89YSkpLG49cn1yZXR1cm5baSxvXX1mdW5jdGlvbiBWaSh0LGUsbil7cmV0dXJuIFhpKHQsZSxuKT4wfWZ1bmN0aW9uIFhpKHQsZSxuKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKS0oblswXS10WzBdKSooZVsxXS10WzFdKX1mdW5jdGlvbiBZaSh0KXtmb3IodmFyIGUsbixyPVEodCksaT0wLG89MTtvPHIubGVuZ3RoOyllPW58fHJbMF0saSs9KChuPXJbb10pWzBdLWVbMF0pKihuWzFdK2VbMV0pLG8rKztyZXR1cm4gaT4wfWZ1bmN0aW9uIEhpKHQsZSl7c3dpdGNoKCJGZWF0dXJlIj09PXQudHlwZT90Lmdlb21ldHJ5LnR5cGU6dC50eXBlKXtjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6cmV0dXJuIHEodCwoZnVuY3Rpb24odCl7SGkodCxlKX0pKSx0O2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIFdpKFEodCksZSksdDtjYXNlIlBvbHlnb24iOnJldHVybiBKaShRKHQpLGUpLHQ7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiBRKHQpLmZvckVhY2goKGZ1bmN0aW9uKHQpe1dpKHQsZSl9KSksdDtjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIFEodCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7SmkodCxlKX0pKSx0O2Nhc2UiUG9pbnQiOmNhc2UiTXVsdGlQb2ludCI6cmV0dXJuIHR9fWZ1bmN0aW9uIFdpKHQsZSl7WWkodCk9PT1lJiZ0LnJldmVyc2UoKX1mdW5jdGlvbiBKaSh0LGUpe1lpKHRbMF0pIT09ZSYmdFswXS5yZXZlcnNlKCk7Zm9yKHZhciBuPTE7bjx0Lmxlbmd0aDtuKyspWWkodFtuXSk9PT1lJiZ0W25dLnJldmVyc2UoKX1mdW5jdGlvbiBaaSh0LGUpe2lmKCFQKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS56UHJvcGVydHl8fCJlbGV2YXRpb24iLHI9ZS5mbGlwLGk9ZS5mbGFncztudCh0LCJQb2ludCIsImlucHV0IG11c3QgY29udGFpbiBQb2ludHMiKTtmb3IodmFyIG89ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtyZXR1cm4gRih0LChmdW5jdGlvbih0KXt2YXIgZT1RKHQpWzFdO25bZV18fChuW2VdPVtdKSxuW2VdLnB1c2godCl9KSksT2JqZWN0LmtleXMobikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gblt0XS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBRKHQpWzBdLVEoZSlbMF19KSl9KSkuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZT9RKHRbMF0pWzFdLVEoblswXSlbMV06UShuWzBdKVsxXS1RKHRbMF0pWzFdfSkpfQovKiEKICAgICAqIEBsaWNlbnNlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KICAgICAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxNSBSb25ueSBMb3JlbnogPHJvbm55QHRiaS51bml2aWUuYWMuYXQ+CiAgICAgKiB2LiAxLjIuMAogICAgICogaHR0cHM6Ly9naXRodWIuY29tL1JhdW1aZWl0L01hcmNoaW5nU3F1YXJlcy5qcwogICAgICoKICAgICAqIE1hcmNoaW5nU3F1YXJlc0pTIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgICAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgICAgKgogICAgICogTWFyY2hpbmdTcXVhcmVzSlMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICAgKiBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAgICAqCiAgICAgKiBBcyBhZGRpdGlvbmFsIHBlcm1pc3Npb24gdW5kZXIgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMwogICAgICogc2VjdGlvbiA3LCB0aGlyZC1wYXJ0eSBwcm9qZWN0cyAocGVyc29uYWwgb3IgY29tbWVyY2lhbCkgbWF5IGRpc3RyaWJ1dGUsCiAgICAgKiBpbmNsdWRlLCBvciBsaW5rIGFnYWluc3QgVU5NT0RJRklFRCBWRVJTSU9OUyBvZiBNYXJjaGluZ1NxdWFyZXNKUyB3aXRob3V0IHRoZQogICAgICogcmVxdWlyZW1lbnQgdGhhdCBzYWlkIHRoaXJkLXBhcnR5IHByb2plY3QgZm9yIHRoYXQgcmVhc29uIGFsb25lIGJlY29tZXMKICAgICAqIHN1YmplY3QgdG8gYW55IHJlcXVpcmVtZW50IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzLgogICAgICogQW55IG1vZGlmaWNhdGlvbnMgdG8gTWFyY2hpbmdTcXVhcmVzSlMsIGhvd2V2ZXIsIG11c3QgYmUgc2hhcmVkIHdpdGggdGhlIHB1YmxpYwogICAgICogYW5kIG1hZGUgYXZhaWxhYmxlLgogICAgICoKICAgICAqIEluIHN1bW1hcnkgdGhpczoKICAgICAqIC0gYWxsb3dzIHlvdSB0byB1c2UgTWFyY2hpbmdTcXVhcmVzSlMgYXQgbm8gY29zdAogICAgICogLSBhbGxvd3MgeW91IHRvIHVzZSBNYXJjaGluZ1NxdWFyZXNKUyBmb3IgYm90aCBwZXJzb25hbCBhbmQgY29tbWVyY2lhbCBwdXJwb3NlcwogICAgICogLSBhbGxvd3MgeW91IHRvIGRpc3RyaWJ1dGUgVU5NT0RJRklFRCBWRVJTSU9OUyBvZiBNYXJjaGluZ1NxdWFyZXNKUyB1bmRlciBhbnkKICAgICAqICAgbGljZW5zZSBhcyBsb25nIGFzIHRoaXMgbGljZW5zZSBub3RpY2UgaXMgaW5jbHVkZWQKICAgICAqIC0gZW5hYmxlcyB5b3UgdG8ga2VlcCB0aGUgc291cmNlIGNvZGUgb2YgeW91ciBwcm9ncmFtIHRoYXQgdXNlcyBNYXJjaGluZ1NxdWFyZXNKUwogICAgICogICB1bmRpc2Nsb3NlZAogICAgICogLSBmb3JjZXMgeW91IHRvIHNoYXJlIGFueSBtb2RpZmljYXRpb25zIHlvdSBoYXZlIG1hZGUgdG8gTWFyY2hpbmdTcXVhcmVzSlMsCiAgICAgKiAgIGUuZy4gYnVnLWZpeGVzCiAgICAgKgogICAgICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICAgKiBhbG9uZyB3aXRoIE1hcmNoaW5nU3F1YXJlc0pTLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICAgICovKHQscikscz1bXSxhPTA7YTxvLmxlbmd0aDthKyspe2Zvcih2YXIgdT1vW2FdLGw9W10sYz0wO2M8dS5sZW5ndGg7YysrKXt2YXIgaD11W2NdO2gucHJvcGVydGllc1tuXT9sLnB1c2goaC5wcm9wZXJ0aWVzW25dKTpsLnB1c2goMCksITA9PT1pJiYoaC5wcm9wZXJ0aWVzLm1hdHJpeFBvc2l0aW9uPVthLGNdKX1zLnB1c2gobCl9cmV0dXJuIHN9dmFyIEtpPXtzdWNjZXNzQ2FsbGJhY2s6bnVsbCx2ZXJib3NlOiExLHBvbHlnb25zOiExfSxRaT17fTtmdW5jdGlvbiAkaSh0LGUsbixyKXtyPXJ8fHt9O2Zvcih2YXIgaT1PYmplY3Qua2V5cyhLaSksbz0wO288aS5sZW5ndGg7bysrKXt2YXIgcz1pW29dLGE9cltzXTthPW51bGwhPWE/YTpLaVtzXSxRaVtzXT1hfVFpLnZlcmJvc2UmJmNvbnNvbGUubG9nKCJNYXJjaGluZ1NxdWFyZXNKUy1pc29CYW5kczogY29tcHV0aW5nIGlzb2JhbmRzIGZvciBbIitlKyI6IisoZStuKSsiXSIpO3ZhciB1LGw9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10Lmxlbmd0aC0xLGk9dFswXS5sZW5ndGgtMSxvPXtyb3dzOnIsY29sczppLGNlbGxzOltdfSxzPWUrTWF0aC5hYnMobiksYT0wO2E8cjsrK2Epe28uY2VsbHNbYV09W107Zm9yKHZhciB1PTA7dTxpOysrdSl7dmFyIGw9MCxjPXRbYSsxXVt1XSxoPXRbYSsxXVt1KzFdLHA9dFthXVt1KzFdLGY9dFthXVt1XTtpZighKGlzTmFOKGMpfHxpc05hTihoKXx8aXNOYU4ocCl8fGlzTmFOKGYpKSl7bHw9YzxlPzA6Yz5zPzEyODo2NCxsfD1oPGU/MDpoPnM/MzI6MTYsbHw9cDxlPzA6cD5zPzg6NDt2YXIgZz0rKGx8PWY8ZT8wOmY+cz8yOjEpLGQ9MDtpZigxNz09PWx8fDE4PT09bHx8MzM9PT1sfHwzND09PWx8fDM4PT09bHx8Njg9PT1sfHw3Mj09PWx8fDk4PT09bHx8MTAyPT09bHx8MTMyPT09bHx8MTM2PT09bHx8MTM3PT09bHx8MTUyPT09bHx8MTUzPT09bCl7dmFyIHk9KGMraCtwK2YpLzQ7ZD15PnM/Mjp5PGU/MDoxLDM0PT09bD8xPT09ZD9sPTM1OjA9PT1kJiYobD0xMzYpOjEzNj09PWw/MT09PWQ/KGw9MzUsZD00KTowPT09ZCYmKGw9MzQpOjE3PT09bD8xPT09ZD8obD0xNTUsZD00KTowPT09ZCYmKGw9MTUzKTo2OD09PWw/MT09PWQ/KGw9MTAzLGQ9NCk6MD09PWQmJihsPTEwMik6MTUzPT09bD8xPT09ZCYmKGw9MTU1KToxMDI9PT1sPzE9PT1kJiYobD0xMDMpOjE1Mj09PWw/ZDwyJiYobD0xNTYsZD0xKToxMzc9PT1sP2Q8MiYmKGw9MTM5LGQ9MSk6OTg9PT1sP2Q8MiYmKGw9OTksZD0xKTozOD09PWw/ZDwyJiYobD0zOSxkPTEpOjE4PT09bD9kPjA/KGw9MTU2LGQ9NCk6bD0xNTI6MzM9PT1sP2Q+MD8obD0xMzksZD00KTpsPTEzNzo3Mj09PWw/ZD4wPyhsPTk5LGQ9NCk6bD05ODoxMzI9PT1sJiYoZD4wPyhsPTM5LGQ9NCk6bD0zOCl9aWYoMCE9bCYmMTcwIT1sKXt2YXIgdixfLG0seCxFLGIsdyxJO3Y9Xz1tPXg9RT1iPXc9ST0uNTt2YXIgTj1bXTsxPT09bD8obT0xLVZvKGUscCxmKSxJPTEtVm8oZSxjLGYpLE4ucHVzaChHb1tsXSkpOjE2OT09PWw/KG09Vm8ocyxmLHApLEk9Vm8ocyxmLGMpLE4ucHVzaChHb1tsXSkpOjQ9PT1sPyhiPTEtVm8oZSxoLHApLHg9Vm8oZSxmLHApLE4ucHVzaChGb1tsXSkpOjE2Nj09PWw/KGI9Vm8ocyxwLGgpLHg9MS1WbyhzLHAsZiksTi5wdXNoKEZvW2xdKSk6MTY9PT1sPyhFPVZvKGUscCxoKSxfPVZvKGUsYyxoKSxOLnB1c2goRG9bbF0pKToxNTQ9PT1sPyhFPTEtVm8ocyxoLHApLF89MS1WbyhzLGgsYyksTi5wdXNoKERvW2xdKSk6NjQ9PT1sPyh3PVZvKGUsZixjKSx2PTEtVm8oZSxoLGMpLE4ucHVzaChCb1tsXSkpOjEwNj09PWw/KHc9MS1WbyhzLGMsZiksdj1WbyhzLGMsaCksTi5wdXNoKEJvW2xdKSk6MTY4PT09bD8oeD1WbyhzLGYscCksbT1WbyhlLGYscCksST1WbyhlLGYsYyksdz1WbyhzLGYsYyksTi5wdXNoKGtvW2xdKSxOLnB1c2goR29bbF0pKToyPT09bD8oeD0xLVZvKGUscCxmKSxtPTEtVm8ocyxwLGYpLEk9MS1WbyhzLGMsZiksdz0xLVZvKGUsYyxmKSxOLnB1c2goa29bbF0pLE4ucHVzaChHb1tsXSkpOjE2Mj09PWw/KEU9Vm8ocyxwLGgpLGI9Vm8oZSxwLGgpLHg9MS1WbyhlLHAsZiksbT0xLVZvKHMscCxmKSxOLnB1c2goa29bbF0pLE4ucHVzaChHb1tsXSkpOjg9PT1sPyhFPTEtVm8oZSxoLHApLGI9MS1WbyhzLGgscCkseD1WbyhzLGYscCksbT1WbyhlLGYscCksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pKToxMzg9PT1sPyhFPTEtVm8oZSxoLHApLGI9MS1WbyhzLGgscCksdj0xLVZvKHMsaCxjKSxfPTEtVm8oZSxoLGMpLE4ucHVzaChEb1tsXSksTi5wdXNoKEZvW2xdKSk6MzI9PT1sPyhFPVZvKHMscCxoKSxiPVZvKGUscCxoKSx2PVZvKGUsYyxoKSxfPVZvKHMsYyxoKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSkpOjQyPT09bD8oST0xLVZvKHMsYyxmKSx3PTEtVm8oZSxjLGYpLHY9Vm8oZSxjLGgpLF89Vm8ocyxjLGgpLE4ucHVzaChxb1tsXSksTi5wdXNoKEJvW2xdKSk6MTI4PT09bCYmKEk9Vm8oZSxmLGMpLHc9Vm8ocyxmLGMpLHY9MS1WbyhzLGgsYyksXz0xLVZvKGUsaCxjKSxOLnB1c2gocW9bbF0pLE4ucHVzaChCb1tsXSkpLDU9PT1sPyhiPTEtVm8oZSxoLHApLEk9MS1WbyhlLGMsZiksTi5wdXNoKEZvW2xdKSk6MTY1PT09bD8oYj1WbyhzLHAsaCksST1WbyhzLGYsYyksTi5wdXNoKEZvW2xdKSk6MjA9PT1sPyh4PVZvKGUsZixwKSxfPVZvKGUsYyxoKSxOLnB1c2goa29bbF0pKToxNTA9PT1sPyh4PTEtVm8ocyxwLGYpLF89MS1WbyhzLGgsYyksTi5wdXNoKGtvW2xdKSk6ODA9PT1sPyhFPVZvKGUscCxoKSx3PVZvKGUsZixjKSxOLnB1c2goRG9bbF0pKTo5MD09PWw/KEU9MS1WbyhzLGgscCksdz0xLVZvKHMsYyxmKSxOLnB1c2goRG9bbF0pKTo2NT09PWw/KG09MS1WbyhlLHAsZiksdj0xLVZvKGUsaCxjKSxOLnB1c2goR29bbF0pKToxMDU9PT1sPyhtPVZvKHMsZixwKSx2PVZvKHMsYyxoKSxOLnB1c2goR29bbF0pKToxNjA9PT1sPyhFPVZvKHMscCxoKSxiPVZvKGUscCxoKSxJPVZvKGUsZixjKSx3PVZvKHMsZixjKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSkpOjEwPT09bD8oRT0xLVZvKGUsaCxwKSxiPTEtVm8ocyxoLHApLEk9MS1WbyhzLGMsZiksdz0xLVZvKGUsYyxmKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSkpOjEzMD09PWw/KHg9MS1WbyhlLHAsZiksbT0xLVZvKHMscCxmKSx2PTEtVm8ocyxoLGMpLF89MS1WbyhlLGgsYyksTi5wdXNoKGtvW2xdKSxOLnB1c2goR29bbF0pKTo0MD09PWw/KHg9Vm8ocyxmLHApLG09Vm8oZSxmLHApLHY9Vm8oZSxjLGgpLF89Vm8ocyxjLGgpLE4ucHVzaChrb1tsXSksTi5wdXNoKEdvW2xdKSk6MTAxPT09bD8oYj1WbyhzLHAsaCksdj1WbyhzLGMsaCksTi5wdXNoKEZvW2xdKSk6Njk9PT1sPyhiPTEtVm8oZSxoLHApLHY9MS1WbyhlLGgsYyksTi5wdXNoKEZvW2xdKSk6MTQ5PT09bD8oST1WbyhzLGYsYyksXz0xLVZvKHMsaCxjKSxOLnB1c2gocW9bbF0pKToyMT09PWw/KEk9MS1WbyhlLGMsZiksXz1WbyhlLGMsaCksTi5wdXNoKHFvW2xdKSk6ODY9PT1sPyh4PTEtVm8ocyxwLGYpLHc9MS1WbyhzLGMsZiksTi5wdXNoKGtvW2xdKSk6ODQ9PT1sPyh4PVZvKGUsZixwKSx3PVZvKGUsZixjKSxOLnB1c2goa29bbF0pKTo4OT09PWw/KEU9MS1WbyhzLGgscCksbT1WbyhzLGYscCksTi5wdXNoKEdvW2xdKSk6ODE9PT1sPyhFPVZvKGUscCxoKSxtPTEtVm8oZSxwLGYpLE4ucHVzaChHb1tsXSkpOjk2PT09bD8oRT1WbyhzLHAsaCksYj1WbyhlLHAsaCksdz1WbyhlLGYsYyksdj1WbyhzLGMsaCksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pKTo3ND09PWw/KEU9MS1WbyhlLGgscCksYj0xLVZvKHMsaCxwKSx3PTEtVm8ocyxjLGYpLHY9MS1WbyhlLGgsYyksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pKToyND09PWw/KEU9MS1WbyhzLGgscCkseD1WbyhzLGYscCksbT1WbyhlLGYscCksXz1WbyhlLGMsaCksTi5wdXNoKERvW2xdKSxOLnB1c2goR29bbF0pKToxNDY9PT1sPyhFPVZvKGUscCxoKSx4PTEtVm8oZSxwLGYpLG09MS1WbyhzLHAsZiksXz0xLVZvKHMsaCxjKSxOLnB1c2goRG9bbF0pLE4ucHVzaChHb1tsXSkpOjY9PT1sPyhiPTEtVm8oZSxoLHApLHg9MS1WbyhzLHAsZiksST0xLVZvKHMsYyxmKSx3PTEtVm8oZSxjLGYpLE4ucHVzaChGb1tsXSksTi5wdXNoKGtvW2xdKSk6MTY0PT09bD8oYj1WbyhzLHAsaCkseD1WbyhlLGYscCksST1WbyhlLGYsYyksdz1WbyhzLGYsYyksTi5wdXNoKEZvW2xdKSxOLnB1c2goa29bbF0pKToxMjk9PT1sPyhtPTEtVm8oZSxwLGYpLEk9Vm8ocyxmLGMpLHY9MS1WbyhzLGgsYyksXz0xLVZvKGUsaCxjKSxOLnB1c2goR29bbF0pLE4ucHVzaChxb1tsXSkpOjQxPT09bD8obT1WbyhzLGYscCksST0xLVZvKGUsYyxmKSx2PVZvKGUsYyxoKSxfPVZvKHMsYyxoKSxOLnB1c2goR29bbF0pLE4ucHVzaChxb1tsXSkpOjY2PT09bD8oeD0xLVZvKGUscCxmKSxtPTEtVm8ocyxwLGYpLHc9MS1WbyhzLGMsZiksdj0xLVZvKGUsaCxjKSxOLnB1c2goa29bbF0pLE4ucHVzaChHb1tsXSkpOjEwND09PWw/KHg9Vm8ocyxmLHApLG09Vm8oZSxmLHApLHc9Vm8oZSxmLGMpLHY9Vm8ocyxjLGgpLE4ucHVzaChHb1tsXSksTi5wdXNoKHpvW2xdKSk6MTQ0PT09bD8oRT1WbyhlLHAsaCksST1WbyhlLGYsYyksdz1WbyhzLGYsYyksXz0xLVZvKHMsaCxjKSxOLnB1c2goRG9bbF0pLE4ucHVzaChCb1tsXSkpOjI2PT09bD8oRT0xLVZvKHMsaCxwKSxJPTEtVm8ocyxjLGYpLHc9MS1WbyhlLGMsZiksXz1WbyhlLGMsaCksTi5wdXNoKERvW2xdKSxOLnB1c2goQm9bbF0pKTozNj09PWw/KGI9Vm8ocyxwLGgpLHg9Vm8oZSxmLHApLHY9Vm8oZSxjLGgpLF89Vm8ocyxjLGgpLE4ucHVzaChGb1tsXSksTi5wdXNoKGtvW2xdKSk6MTM0PT09bD8oYj0xLVZvKGUsaCxwKSx4PTEtVm8ocyxwLGYpLHY9MS1WbyhzLGgsYyksXz0xLVZvKGUsaCxjKSxOLnB1c2goRm9bbF0pLE4ucHVzaChrb1tsXSkpOjk9PT1sPyhFPTEtVm8oZSxoLHApLGI9MS1WbyhzLGgscCksbT1WbyhzLGYscCksST0xLVZvKGUsYyxmKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSkpOjE2MT09PWw/KEU9Vm8ocyxwLGgpLGI9Vm8oZSxwLGgpLG09MS1WbyhlLHAsZiksST1WbyhzLGYsYyksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pKTozNz09PWw/KGI9Vm8ocyxwLGgpLEk9MS1WbyhlLGMsZiksdj1WbyhlLGMsaCksXz1WbyhzLGMsaCksTi5wdXNoKEZvW2xdKSxOLnB1c2gocW9bbF0pKToxMzM9PT1sPyhiPTEtVm8oZSxoLHApLEk9Vm8ocyxmLGMpLHY9MS1WbyhzLGgsYyksXz0xLVZvKGUsaCxjKSxOLnB1c2goRm9bbF0pLE4ucHVzaChxb1tsXSkpOjE0OD09PWw/KHg9Vm8oZSxmLHApLEk9Vm8oZSxmLGMpLHc9Vm8ocyxmLGMpLF89MS1WbyhzLGgsYyksTi5wdXNoKGtvW2xdKSxOLnB1c2goQm9bbF0pKToyMj09PWw/KHg9MS1WbyhzLHAsZiksST0xLVZvKHMsYyxmKSx3PTEtVm8oZSxjLGYpLF89Vm8oZSxjLGgpLE4ucHVzaChrb1tsXSksTi5wdXNoKEJvW2xdKSk6ODI9PT1sPyhFPVZvKGUscCxoKSx4PTEtVm8oZSxwLGYpLG09MS1WbyhzLHAsZiksdz0xLVZvKHMsYyxmKSxOLnB1c2goRG9bbF0pLE4ucHVzaChHb1tsXSkpOjg4PT09bD8oRT0xLVZvKHMsaCxwKSx4PVZvKHMsZixwKSxtPVZvKGUsZixwKSx3PVZvKGUsZixjKSxOLnB1c2goRG9bbF0pLE4ucHVzaChHb1tsXSkpOjczPT09bD8oRT0xLVZvKGUsaCxwKSxiPTEtVm8ocyxoLHApLG09Vm8ocyxmLHApLHY9MS1WbyhlLGgsYyksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pKTo5Nz09PWw/KEU9Vm8ocyxwLGgpLGI9Vm8oZSxwLGgpLG09MS1WbyhlLHAsZiksdj1WbyhzLGMsaCksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pKToxNDU9PT1sPyhFPVZvKGUscCxoKSxtPTEtVm8oZSxwLGYpLEk9Vm8ocyxmLGMpLF89MS1WbyhzLGgsYyksTi5wdXNoKERvW2xdKSxOLnB1c2gocW9bbF0pKToyNT09PWw/KEU9MS1WbyhzLGgscCksbT1WbyhzLGYscCksST0xLVZvKGUsYyxmKSxfPVZvKGUsYyxoKSxOLnB1c2goRG9bbF0pLE4ucHVzaChxb1tsXSkpOjcwPT09bD8oYj0xLVZvKGUsaCxwKSx4PTEtVm8ocyxwLGYpLHc9MS1WbyhzLGMsZiksdj0xLVZvKGUsaCxjKSxOLnB1c2goRm9bbF0pLE4ucHVzaChrb1tsXSkpOjEwMD09PWw/KGI9Vm8ocyxwLGgpLHg9Vm8oZSxmLHApLHc9Vm8oZSxmLGMpLHY9Vm8ocyxjLGgpLE4ucHVzaChGb1tsXSksTi5wdXNoKGtvW2xdKSk6MzQ9PT1sPygwPT09ZD8oRT0xLVZvKGUsaCxwKSxiPTEtVm8ocyxoLHApLHg9Vm8ocyxmLHApLG09Vm8oZSxmLHApLEk9Vm8oZSxmLGMpLHc9Vm8ocyxmLGMpLHY9MS1WbyhzLGgsYyksXz0xLVZvKGUsaCxjKSk6KEU9Vm8ocyxwLGgpLGI9Vm8oZSxwLGgpLHg9MS1WbyhlLHAsZiksbT0xLVZvKHMscCxmKSxJPTEtVm8ocyxjLGYpLHc9MS1WbyhlLGMsZiksdj1WbyhlLGMsaCksXz1WbyhzLGMsaCkpLE4ucHVzaChEb1tsXSksTi5wdXNoKEZvW2xdKSxOLnB1c2gocW9bbF0pLE4ucHVzaChCb1tsXSkpOjM1PT09bD8oND09PWQ/KEU9MS1WbyhlLGgscCksYj0xLVZvKHMsaCxwKSx4PVZvKHMsZixwKSxtPVZvKGUsZixwKSxJPVZvKGUsZixjKSx3PVZvKHMsZixjKSx2PTEtVm8ocyxoLGMpLF89MS1WbyhlLGgsYykpOihFPVZvKHMscCxoKSxiPVZvKGUscCxoKSx4PTEtVm8oZSxwLGYpLG09MS1WbyhzLHAsZiksST0xLVZvKHMsYyxmKSx3PTEtVm8oZSxjLGYpLHY9Vm8oZSxjLGgpLF89Vm8ocyxjLGgpKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSksTi5wdXNoKEdvW2xdKSxOLnB1c2goQm9bbF0pKToxMzY9PT1sPygwPT09ZD8oRT1WbyhzLHAsaCksYj1WbyhlLHAsaCkseD0xLVZvKGUscCxmKSxtPTEtVm8ocyxwLGYpLEk9MS1WbyhzLGMsZiksdz0xLVZvKGUsYyxmKSx2PVZvKGUsYyxoKSxfPVZvKHMsYyxoKSk6KEU9MS1WbyhlLGgscCksYj0xLVZvKHMsaCxwKSx4PVZvKHMsZixwKSxtPVZvKGUsZixwKSxJPVZvKGUsZixjKSx3PVZvKHMsZixjKSx2PTEtVm8ocyxoLGMpLF89MS1WbyhlLGgsYykpLE4ucHVzaChEb1tsXSksTi5wdXNoKEZvW2xdKSxOLnB1c2gocW9bbF0pLE4ucHVzaChCb1tsXSkpOjE1Mz09PWw/KDA9PT1kPyhFPVZvKGUscCxoKSxtPTEtVm8oZSxwLGYpLEk9MS1WbyhlLGMsZiksXz1WbyhlLGMsaCkpOihFPTEtVm8ocyxoLHApLG09Vm8ocyxmLHApLEk9Vm8ocyxmLGMpLF89MS1WbyhzLGgsYykpLE4ucHVzaChEb1tsXSksTi5wdXNoKEdvW2xdKSk6MTAyPT09bD8oMD09PWQ/KGI9MS1WbyhlLGgscCkseD1WbyhlLGYscCksdz1WbyhlLGYsYyksdj0xLVZvKGUsaCxjKSk6KGI9Vm8ocyxwLGgpLHg9MS1WbyhzLHAsZiksdz0xLVZvKHMsYyxmKSx2PVZvKHMsYyxoKSksTi5wdXNoKEZvW2xdKSxOLnB1c2goQm9bbF0pKToxNTU9PT1sPyg0PT09ZD8oRT1WbyhlLHAsaCksbT0xLVZvKGUscCxmKSxJPTEtVm8oZSxjLGYpLF89Vm8oZSxjLGgpKTooRT0xLVZvKHMsaCxwKSxtPVZvKHMsZixwKSxJPVZvKHMsZixjKSxfPTEtVm8ocyxoLGMpKSxOLnB1c2goRG9bbF0pLE4ucHVzaChxb1tsXSkpOjEwMz09PWw/KDQ9PT1kPyhiPTEtVm8oZSxoLHApLHg9Vm8oZSxmLHApLHc9Vm8oZSxmLGMpLHY9MS1WbyhlLGgsYykpOihiPVZvKHMscCxoKSx4PTEtVm8ocyxwLGYpLHc9MS1WbyhzLGMsZiksdj1WbyhzLGMsaCkpLE4ucHVzaChGb1tsXSksTi5wdXNoKGtvW2xdKSk6MTUyPT09bD8oMD09PWQ/KEU9Vm8oZSxwLGgpLHg9MS1WbyhlLHAsZiksbT0xLVZvKHMscCxmKSxJPTEtVm8ocyxjLGYpLHc9MS1WbyhlLGMsZiksXz1WbyhlLGMsaCkpOihFPTEtVm8ocyxoLHApLHg9Vm8ocyxmLHApLG09Vm8oZSxmLHApLEk9Vm8oZSxmLGMpLHc9Vm8ocyxmLGMpLF89MS1WbyhzLGgsYykpLE4ucHVzaChEb1tsXSksTi5wdXNoKGtvW2xdKSxOLnB1c2goR29bbF0pKToxNTY9PT1sPyg0PT09ZD8oRT1WbyhlLHAsaCkseD0xLVZvKGUscCxmKSxtPTEtVm8ocyxwLGYpLEk9MS1WbyhzLGMsZiksdz0xLVZvKGUsYyxmKSxfPVZvKGUsYyxoKSk6KEU9MS1WbyhzLGgscCkseD1WbyhzLGYscCksbT1WbyhlLGYscCksST1WbyhlLGYsYyksdz1WbyhzLGYsYyksXz0xLVZvKHMsaCxjKSksTi5wdXNoKERvW2xdKSxOLnB1c2goR29bbF0pLE4ucHVzaChCb1tsXSkpOjEzNz09PWw/KDA9PT1kPyhFPVZvKHMscCxoKSxiPVZvKGUscCxoKSxtPTEtVm8oZSxwLGYpLEk9MS1WbyhlLGMsZiksdj1WbyhlLGMsaCksXz1WbyhzLGMsaCkpOihFPTEtVm8oZSxoLHApLGI9MS1WbyhzLGgscCksbT1WbyhzLGYscCksST1WbyhzLGYsYyksdj0xLVZvKHMsaCxjKSxfPTEtVm8oZSxoLGMpKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSksTi5wdXNoKEdvW2xdKSk6MTM5PT09bD8oND09PWQ/KEU9Vm8ocyxwLGgpLGI9Vm8oZSxwLGgpLG09MS1WbyhlLHAsZiksST0xLVZvKGUsYyxmKSx2PVZvKGUsYyxoKSxfPVZvKHMsYyxoKSk6KEU9MS1WbyhlLGgscCksYj0xLVZvKHMsaCxwKSxtPVZvKHMsZixwKSxJPVZvKHMsZixjKSx2PTEtVm8ocyxoLGMpLF89MS1WbyhlLGgsYykpLE4ucHVzaChEb1tsXSksTi5wdXNoKEZvW2xdKSxOLnB1c2gocW9bbF0pKTo5OD09PWw/KDA9PT1kPyhFPTEtVm8oZSxoLHApLGI9MS1WbyhzLGgscCkseD1WbyhzLGYscCksbT1WbyhlLGYscCksdz1WbyhlLGYsYyksdj0xLVZvKGUsaCxjKSk6KEU9Vm8ocyxwLGgpLGI9Vm8oZSxwLGgpLHg9MS1WbyhlLHAsZiksbT0xLVZvKHMscCxmKSx3PTEtVm8ocyxjLGYpLHY9Vm8ocyxjLGgpKSxOLnB1c2goRG9bbF0pLE4ucHVzaChGb1tsXSksTi5wdXNoKEJvW2xdKSk6OTk9PT1sPyg0PT09ZD8oRT0xLVZvKGUsaCxwKSxiPTEtVm8ocyxoLHApLHg9Vm8ocyxmLHApLG09Vm8oZSxmLHApLHc9Vm8oZSxmLGMpLHY9MS1WbyhlLGgsYykpOihFPVZvKHMscCxoKSxiPVZvKGUscCxoKSx4PTEtVm8oZSxwLGYpLG09MS1WbyhzLHAsZiksdz0xLVZvKHMsYyxmKSx2PVZvKHMsYyxoKSksTi5wdXNoKERvW2xdKSxOLnB1c2goRm9bbF0pLE4ucHVzaChHb1tsXSkpOjM4PT09bD8oMD09PWQ/KGI9MS1WbyhlLGgscCkseD1WbyhlLGYscCksST1WbyhlLGYsYyksdz1WbyhzLGYsYyksdj0xLVZvKHMsaCxjKSxfPTEtVm8oZSxoLGMpKTooYj1WbyhzLHAsaCkseD0xLVZvKHMscCxmKSxJPTEtVm8ocyxjLGYpLHc9MS1WbyhlLGMsZiksdj1WbyhlLGMsaCksXz1WbyhzLGMsaCkpLE4ucHVzaChGb1tsXSksTi5wdXNoKHFvW2xdKSxOLnB1c2goQm9bbF0pKTozOT09PWw/KDQ9PT1kPyhiPTEtVm8oZSxoLHApLHg9Vm8oZSxmLHApLEk9Vm8oZSxmLGMpLHc9Vm8ocyxmLGMpLHY9MS1WbyhzLGgsYyksXz0xLVZvKGUsaCxjKSk6KGI9Vm8ocyxwLGgpLHg9MS1WbyhzLHAsZiksST0xLVZvKHMsYyxmKSx3PTEtVm8oZSxjLGYpLHY9Vm8oZSxjLGgpLF89Vm8ocyxjLGgpKSxOLnB1c2goRm9bbF0pLE4ucHVzaChrb1tsXSksTi5wdXNoKEJvW2xdKSk6ODU9PT1sJiYoRT0xLGI9MCx4PTEsbT0wLEk9MCx3PTEsdj0wLF89MSksKHY8MHx8dj4xfHxfPDB8fF8+MXx8RTwwfHxFPjF8fHg8MHx8eD4xfHxJPDB8fEk+MXx8dzwwfHx3PjEpJiZjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6ICIrbCsiICIrZysiICIrYysiLCIraCsiLCIrcCsiLCIrZisiICIrZCsiICIrdisiICIrXysiICIrRSsiICIrYisiICIreCsiICIrbSsiICIrSSsiICIrdyksby5jZWxsc1thXVt1XT17Y3ZhbDpsLGN2YWxfcmVhbDpnLGZsaXBwZWQ6ZCx0b3BsZWZ0OnYsdG9wcmlnaHQ6XyxyaWdodHRvcDpFLHJpZ2h0Ym90dG9tOmIsYm90dG9tcmlnaHQ6eCxib3R0b21sZWZ0Om0sbGVmdGJvdHRvbTpJLGxlZnR0b3A6dyxlZGdlczpOfX19fX1yZXR1cm4gb30odCxlLG4pO3JldHVybiBRaS5wb2x5Z29ucz8oUWkudmVyYm9zZSYmY29uc29sZS5sb2coIk1hcmNoaW5nU3F1YXJlc0pTLWlzb0JhbmRzOiByZXR1cm5pbmcgc2luZ2xlIHBvbHlnb25zIGZvciBlYWNoIGdyaWQgY2VsbCIpLHU9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj0wO3JldHVybiB0LmNlbGxzLmZvckVhY2goKGZ1bmN0aW9uKHQscil7dC5mb3JFYWNoKChmdW5jdGlvbih0LGkpe2lmKHZvaWQgMCE9PXQpe3ZhciBvPVVvW3QuY3ZhbF0odCk7Im9iamVjdCI9PXR5cGVvZiBvJiZYbyhvKT8ib2JqZWN0Ij09dHlwZW9mIG9bMF0mJlhvKG9bMF0pPyJvYmplY3QiPT10eXBlb2Ygb1swXVswXSYmWG8ob1swXVswXSk/by5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3RbMF0rPWksdFsxXSs9cn0pKSxlW24rK109dH0pKTooby5mb3JFYWNoKChmdW5jdGlvbih0KXt0WzBdKz1pLHRbMV0rPXJ9KSksZVtuKytdPW8pOmNvbnNvbGUubG9nKCJNYXJjaGluZ1NxdWFyZXNKUy1pc29CYW5kczogYmFuZGNlbGwgcG9seWdvbiB3aXRoIG1hbGZvcm1lZCBjb29yZGluYXRlcyIpOmNvbnNvbGUubG9nKCJNYXJjaGluZ1NxdWFyZXNKUy1pc29CYW5kczogYmFuZGNlbGwgcG9seWdvbiB3aXRoIG51bGwgY29vcmRpbmF0ZXMiKX19KSl9KSksZX0obCkpOihRaS52ZXJib3NlJiZjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IHJldHVybmluZyBwb2x5Z29uIHBhdGhzIGZvciBlbnRpcmUgZGF0YSBncmlkIiksdT1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj10LnJvd3Mscj10LmNvbHMsaT1bXSxvPTA7bzxuO28rKylmb3IodmFyIHM9MDtzPHI7cysrKWlmKHZvaWQgMCE9PXQuY2VsbHNbb11bc10mJnQuY2VsbHNbb11bc10uZWRnZXMubGVuZ3RoPjApe3ZhciBhPUhvKHQuY2VsbHNbb11bc10pLHU9bnVsbCxsPXMsYz1vO251bGwhPT1hJiZpLnB1c2goW2EucFswXStsLGEucFsxXStjXSk7ZG97aWYobnVsbD09PSh1PVdvKHQuY2VsbHNbY11bbF0sYS54LGEueSxhLm8pKSlicmVhaztpZihpLnB1c2goW3UucFswXStsLHUucFsxXStjXSksbCs9dS54LGE9dSwoYys9dS55KTwwfHxjPj1ufHxsPDB8fGw+PXJ8fHZvaWQgMD09PXQuY2VsbHNbY11bbF0pe3ZhciBoPVlvKHQsbC09dS54LGMtPXUueSx1LngsdS55LHUubyk7aWYobnVsbD09PWgpYnJlYWs7aC5wYXRoLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kucHVzaCh0KX0pKSxsPWguaSxjPWguaixhPWh9fXdoaWxlKHZvaWQgMCE9PXQuY2VsbHNbY11bbF0mJnQuY2VsbHNbY11bbF0uZWRnZXMubGVuZ3RoPjApO2UucHVzaChpKSxpPVtdLHQuY2VsbHNbb11bc10uZWRnZXMubGVuZ3RoPjAmJnMtLX1yZXR1cm4gZX0obCkpLCJmdW5jdGlvbiI9PXR5cGVvZiBRaS5zdWNjZXNzQ2FsbGJhY2smJlFpLnN1Y2Nlc3NDYWxsYmFjayh1KSx1fXZhciB0bz02NCxlbz0xNixubz1bXSxybz1bXSxpbz1bXSxvbz1bXSxzbz1bXSxhbz1bXSx1bz1bXSxsbz1bXSxjbz1bXSxobz1bXSxwbz1bXSxmbz1bXSxnbz1bXSx5bz1bXSx2bz1bXSxfbz1bXSxtbz1bXSx4bz1bXSxFbz1bXSxibz1bXSx3bz1bXSxJbz1bXSxObz1bXSxTbz1bXTt1b1s4NV09aG9bODVdPS0xLGxvWzg1XT1wb1s4NV09MCxjb1s4NV09Zm9bODVdPTEsRW9bODVdPUlvWzg1XT0xLGJvWzg1XT1Ob1s4NV09MCx3b1s4NV09U29bODVdPTEsbm9bODVdPW9vWzg1XT0wLHJvWzg1XT1zb1s4NV09LTEsaW9bODVdPXZvWzg1XT0wLF9vWzg1XT1nb1s4NV09MCxtb1s4NV09eW9bODVdPTEsYW9bODVdPXhvWzg1XT0xLElvWzFdPUlvWzE2OV09MCxOb1sxXT1Ob1sxNjldPS0xLFNvWzFdPVNvWzE2OV09MCxnb1sxXT1nb1sxNjldPS0xLHlvWzFdPXlvWzE2OV09MCx2b1sxXT12b1sxNjldPTAsaG9bNF09aG9bMTY2XT0wLHBvWzRdPXBvWzE2Nl09LTEsZm9bNF09Zm9bMTY2XT0xLF9vWzRdPV9vWzE2Nl09MSxtb1s0XT1tb1sxNjZdPTAseG9bNF09eG9bMTY2XT0wLHVvWzE2XT11b1sxNTRdPTAsbG9bMTZdPWxvWzE1NF09MSxjb1sxNl09Y29bMTU0XT0xLG9vWzE2XT1vb1sxNTRdPTEsc29bMTZdPXNvWzE1NF09MCxhb1sxNl09YW9bMTU0XT0xLEVvWzY0XT1Fb1sxMDZdPTAsYm9bNjRdPWJvWzEwNl09MSx3b1s2NF09d29bMTA2XT0wLG5vWzY0XT1ub1sxMDZdPS0xLHJvWzY0XT1yb1sxMDZdPTAsaW9bNjRdPWlvWzEwNl09MSxFb1syXT1Fb1sxNjhdPTAsYm9bMl09Ym9bMTY4XT0tMSx3b1syXT13b1sxNjhdPTEsSW9bMl09SW9bMTY4XT0wLE5vWzJdPU5vWzE2OF09LTEsU29bMl09U29bMTY4XT0wLGdvWzJdPWdvWzE2OF09LTEseW9bMl09eW9bMTY4XT0wLHZvWzJdPXZvWzE2OF09MCxfb1syXT1fb1sxNjhdPS0xLG1vWzJdPW1vWzE2OF09MCx4b1syXT14b1sxNjhdPTEsdW9bOF09dW9bMTYyXT0wLGxvWzhdPWxvWzE2Ml09LTEsY29bOF09Y29bMTYyXT0wLGhvWzhdPWhvWzE2Ml09MCxwb1s4XT1wb1sxNjJdPS0xLGZvWzhdPWZvWzE2Ml09MSxnb1s4XT1nb1sxNjJdPTEseW9bOF09eW9bMTYyXT0wLHZvWzhdPXZvWzE2Ml09MSxfb1s4XT1fb1sxNjJdPTEsbW9bOF09bW9bMTYyXT0wLHhvWzhdPXhvWzE2Ml09MCx1b1szMl09dW9bMTM4XT0wLGxvWzMyXT1sb1sxMzhdPTEsY29bMzJdPWNvWzEzOF09MSxob1szMl09aG9bMTM4XT0wLHBvWzMyXT1wb1sxMzhdPTEsZm9bMzJdPWZvWzEzOF09MCxub1szMl09bm9bMTM4XT0xLHJvWzMyXT1yb1sxMzhdPTAsaW9bMzJdPWlvWzEzOF09MCxvb1szMl09b29bMTM4XT0xLHNvWzMyXT1zb1sxMzhdPTAsYW9bMzJdPWFvWzEzOF09MSxJb1sxMjhdPUlvWzQyXT0wLE5vWzEyOF09Tm9bNDJdPTEsU29bMTI4XT1Tb1s0Ml09MSxFb1sxMjhdPUVvWzQyXT0wLGJvWzEyOF09Ym9bNDJdPTEsd29bMTI4XT13b1s0Ml09MCxub1sxMjhdPW5vWzQyXT0tMSxyb1sxMjhdPXJvWzQyXT0wLGlvWzEyOF09aW9bNDJdPTEsb29bMTI4XT1vb1s0Ml09LTEsc29bMTI4XT1zb1s0Ml09MCxhb1sxMjhdPWFvWzQyXT0wLGhvWzVdPWhvWzE2NV09LTEscG9bNV09cG9bMTY1XT0wLGZvWzVdPWZvWzE2NV09MCxJb1s1XT1Jb1sxNjVdPTEsTm9bNV09Tm9bMTY1XT0wLFNvWzVdPVNvWzE2NV09MCxfb1syMF09X29bMTUwXT0wLG1vWzIwXT1tb1sxNTBdPTEseG9bMjBdPXhvWzE1MF09MSxvb1syMF09b29bMTUwXT0wLHNvWzIwXT1zb1sxNTBdPS0xLGFvWzIwXT1hb1sxNTBdPTEsdW9bODBdPXVvWzkwXT0tMSxsb1s4MF09bG9bOTBdPTAsY29bODBdPWNvWzkwXT0xLEVvWzgwXT1Fb1s5MF09MSxib1s4MF09Ym9bOTBdPTAsd29bODBdPXdvWzkwXT0xLGdvWzY1XT1nb1sxMDVdPTAseW9bNjVdPXlvWzEwNV09MSx2b1s2NV09dm9bMTA1XT0wLG5vWzY1XT1ub1sxMDVdPTAscm9bNjVdPXJvWzEwNV09LTEsaW9bNjVdPWlvWzEwNV09MCx1b1sxNjBdPXVvWzEwXT0tMSxsb1sxNjBdPWxvWzEwXT0wLGNvWzE2MF09Y29bMTBdPTEsaG9bMTYwXT1ob1sxMF09LTEscG9bMTYwXT1wb1sxMF09MCxmb1sxNjBdPWZvWzEwXT0wLElvWzE2MF09SW9bMTBdPTEsTm9bMTYwXT1Ob1sxMF09MCxTb1sxNjBdPVNvWzEwXT0wLEVvWzE2MF09RW9bMTBdPTEsYm9bMTYwXT1ib1sxMF09MCx3b1sxNjBdPXdvWzEwXT0xLF9vWzEzMF09X29bNDBdPTAsbW9bMTMwXT1tb1s0MF09MSx4b1sxMzBdPXhvWzQwXT0xLGdvWzEzMF09Z29bNDBdPTAseW9bMTMwXT15b1s0MF09MSx2b1sxMzBdPXZvWzQwXT0wLG5vWzEzMF09bm9bNDBdPTAscm9bMTMwXT1yb1s0MF09LTEsaW9bMTMwXT1pb1s0MF09MCxvb1sxMzBdPW9vWzQwXT0wLHNvWzEzMF09c29bNDBdPS0xLGFvWzEzMF09YW9bNDBdPTEsaG9bMzddPWhvWzEzM109MCxwb1szN109cG9bMTMzXT0xLGZvWzM3XT1mb1sxMzNdPTEsSW9bMzddPUlvWzEzM109MCxOb1szN109Tm9bMTMzXT0xLFNvWzM3XT1Tb1sxMzNdPTAsbm9bMzddPW5vWzEzM109LTEscm9bMzddPXJvWzEzM109MCxpb1szN109aW9bMTMzXT0wLG9vWzM3XT1vb1sxMzNdPTEsc29bMzddPXNvWzEzM109MCxhb1szN109YW9bMTMzXT0wLF9vWzE0OF09X29bMjJdPS0xLG1vWzE0OF09bW9bMjJdPTAseG9bMTQ4XT14b1syMl09MCxJb1sxNDhdPUlvWzIyXT0wLE5vWzE0OF09Tm9bMjJdPS0xLFNvWzE0OF09U29bMjJdPTEsRW9bMTQ4XT1Fb1syMl09MCxib1sxNDhdPWJvWzIyXT0xLHdvWzE0OF09d29bMjJdPTEsb29bMTQ4XT1vb1syMl09LTEsc29bMTQ4XT1zb1syMl09MCxhb1sxNDhdPWFvWzIyXT0xLHVvWzgyXT11b1s4OF09MCxsb1s4Ml09bG9bODhdPS0xLGNvWzgyXT1jb1s4OF09MSxfb1s4Ml09X29bODhdPTEsbW9bODJdPW1vWzg4XT0wLHhvWzgyXT14b1s4OF09MSxnb1s4Ml09Z29bODhdPS0xLHlvWzgyXT15b1s4OF09MCx2b1s4Ml09dm9bODhdPTEsRW9bODJdPUVvWzg4XT0wLGJvWzgyXT1ib1s4OF09LTEsd29bODJdPXdvWzg4XT0wLHVvWzczXT11b1s5N109MCxsb1s3M109bG9bOTddPTEsY29bNzNdPWNvWzk3XT0wLGhvWzczXT1ob1s5N109MCxwb1s3M109cG9bOTddPS0xLGZvWzczXT1mb1s5N109MCxnb1s3M109Z29bOTddPTEseW9bNzNdPXlvWzk3XT0wLHZvWzczXT12b1s5N109MCxub1s3M109bm9bOTddPTEscm9bNzNdPXJvWzk3XT0wLGlvWzczXT1pb1s5N109MSx1b1sxNDVdPXVvWzI1XT0wLGxvWzE0NV09bG9bMjVdPS0xLGNvWzE0NV09Y29bMjVdPTAsZ29bMTQ1XT1nb1syNV09MSx5b1sxNDVdPXlvWzI1XT0wLHZvWzE0NV09dm9bMjVdPTEsSW9bMTQ1XT1Jb1syNV09MCxOb1sxNDVdPU5vWzI1XT0xLFNvWzE0NV09U29bMjVdPTEsb29bMTQ1XT1vb1syNV09LTEsc29bMTQ1XT1zb1syNV09MCxhb1sxNDVdPWFvWzI1XT0wLGhvWzcwXT1ob1sxMDBdPTAscG9bNzBdPXBvWzEwMF09MSxmb1s3MF09Zm9bMTAwXT0wLF9vWzcwXT1fb1sxMDBdPS0xLG1vWzcwXT1tb1sxMDBdPTAseG9bNzBdPXhvWzEwMF09MSxFb1s3MF09RW9bMTAwXT0wLGJvWzcwXT1ib1sxMDBdPS0xLHdvWzcwXT13b1sxMDBdPTEsbm9bNzBdPW5vWzEwMF09MSxyb1s3MF09cm9bMTAwXT0wLGlvWzcwXT1pb1sxMDBdPTAsaG9bMTAxXT1ob1s2OV09MCxwb1sxMDFdPXBvWzY5XT0xLGZvWzEwMV09Zm9bNjldPTAsbm9bMTAxXT1ub1s2OV09MSxyb1sxMDFdPXJvWzY5XT0wLGlvWzEwMV09aW9bNjldPTAsSW9bMTQ5XT1Jb1syMV09MCxOb1sxNDldPU5vWzIxXT0xLFNvWzE0OV09U29bMjFdPTEsb29bMTQ5XT1vb1syMV09LTEsc29bMTQ5XT1zb1syMV09MCxhb1sxNDldPWFvWzIxXT0wLF9vWzg2XT1fb1s4NF09LTEsbW9bODZdPW1vWzg0XT0wLHhvWzg2XT14b1s4NF09MSxFb1s4Nl09RW9bODRdPTAsYm9bODZdPWJvWzg0XT0tMSx3b1s4Nl09d29bODRdPTEsdW9bODldPXVvWzgxXT0wLGxvWzg5XT1sb1s4MV09LTEsY29bODldPWNvWzgxXT0wLGdvWzg5XT1nb1s4MV09MSx5b1s4OV09eW9bODFdPTAsdm9bODldPXZvWzgxXT0xLHVvWzk2XT11b1s3NF09MCxsb1s5Nl09bG9bNzRdPTEsY29bOTZdPWNvWzc0XT0wLGhvWzk2XT1ob1s3NF09LTEscG9bOTZdPXBvWzc0XT0wLGZvWzk2XT1mb1s3NF09MSxFb1s5Nl09RW9bNzRdPTEsYm9bOTZdPWJvWzc0XT0wLHdvWzk2XT13b1s3NF09MCxub1s5Nl09bm9bNzRdPTEscm9bOTZdPXJvWzc0XT0wLGlvWzk2XT1pb1s3NF09MSx1b1syNF09dW9bMTQ2XT0wLGxvWzI0XT1sb1sxNDZdPS0xLGNvWzI0XT1jb1sxNDZdPTEsX29bMjRdPV9vWzE0Nl09MSxtb1syNF09bW9bMTQ2XT0wLHhvWzI0XT14b1sxNDZdPTEsZ29bMjRdPWdvWzE0Nl09MCx5b1syNF09eW9bMTQ2XT0xLHZvWzI0XT12b1sxNDZdPTEsb29bMjRdPW9vWzE0Nl09MCxzb1syNF09c29bMTQ2XT0tMSxhb1syNF09YW9bMTQ2XT0wLGhvWzZdPWhvWzE2NF09LTEscG9bNl09cG9bMTY0XT0wLGZvWzZdPWZvWzE2NF09MSxfb1s2XT1fb1sxNjRdPS0xLG1vWzZdPW1vWzE2NF09MCx4b1s2XT14b1sxNjRdPTAsSW9bNl09SW9bMTY0XT0wLE5vWzZdPU5vWzE2NF09LTEsU29bNl09U29bMTY0XT0xLEVvWzZdPUVvWzE2NF09MSxib1s2XT1ib1sxNjRdPTAsd29bNl09d29bMTY0XT0wLGdvWzEyOV09Z29bNDFdPTAseW9bMTI5XT15b1s0MV09MSx2b1sxMjldPXZvWzQxXT0xLElvWzEyOV09SW9bNDFdPTAsTm9bMTI5XT1Ob1s0MV09MSxTb1sxMjldPVNvWzQxXT0wLG5vWzEyOV09bm9bNDFdPS0xLHJvWzEyOV09cm9bNDFdPTAsaW9bMTI5XT1pb1s0MV09MCxvb1sxMjldPW9vWzQxXT0wLHNvWzEyOV09c29bNDFdPS0xLGFvWzEyOV09YW9bNDFdPTAsX29bNjZdPV9vWzEwNF09MCxtb1s2Nl09bW9bMTA0XT0xLHhvWzY2XT14b1sxMDRdPTAsZ29bNjZdPWdvWzEwNF09LTEseW9bNjZdPXlvWzEwNF09MCx2b1s2Nl09dm9bMTA0XT0xLEVvWzY2XT1Fb1sxMDRdPTAsYm9bNjZdPWJvWzEwNF09LTEsd29bNjZdPXdvWzEwNF09MCxub1s2Nl09bm9bMTA0XT0wLHJvWzY2XT1yb1sxMDRdPS0xLGlvWzY2XT1pb1sxMDRdPTEsdW9bMTQ0XT11b1syNl09LTEsbG9bMTQ0XT1sb1syNl09MCxjb1sxNDRdPWNvWzI2XT0wLElvWzE0NF09SW9bMjZdPTEsTm9bMTQ0XT1Ob1syNl09MCxTb1sxNDRdPVNvWzI2XT0xLEVvWzE0NF09RW9bMjZdPTAsYm9bMTQ0XT1ib1syNl09MSx3b1sxNDRdPXdvWzI2XT0xLG9vWzE0NF09b29bMjZdPS0xLHNvWzE0NF09c29bMjZdPTAsYW9bMTQ0XT1hb1syNl09MSxob1szNl09aG9bMTM0XT0wLHBvWzM2XT1wb1sxMzRdPTEsZm9bMzZdPWZvWzEzNF09MSxfb1szNl09X29bMTM0XT0wLG1vWzM2XT1tb1sxMzRdPTEseG9bMzZdPXhvWzEzNF09MCxub1szNl09bm9bMTM0XT0wLHJvWzM2XT1yb1sxMzRdPS0xLGlvWzM2XT1pb1sxMzRdPTEsb29bMzZdPW9vWzEzNF09MSxzb1szNl09c29bMTM0XT0wLGFvWzM2XT1hb1sxMzRdPTAsdW9bOV09dW9bMTYxXT0tMSxsb1s5XT1sb1sxNjFdPTAsY29bOV09Y29bMTYxXT0wLGhvWzldPWhvWzE2MV09MCxwb1s5XT1wb1sxNjFdPS0xLGZvWzldPWZvWzE2MV09MCxnb1s5XT1nb1sxNjFdPTEseW9bOV09eW9bMTYxXT0wLHZvWzldPXZvWzE2MV09MCxJb1s5XT1Jb1sxNjFdPTEsTm9bOV09Tm9bMTYxXT0wLFNvWzldPVNvWzE2MV09MSx1b1sxMzZdPTAsbG9bMTM2XT0xLGNvWzEzNl09MSxob1sxMzZdPTAscG9bMTM2XT0xLGZvWzEzNl09MCxfb1sxMzZdPS0xLG1vWzEzNl09MCx4b1sxMzZdPTEsZ29bMTM2XT0tMSx5b1sxMzZdPTAsdm9bMTM2XT0wLElvWzEzNl09MCxOb1sxMzZdPS0xLFNvWzEzNl09MCxFb1sxMzZdPTAsYm9bMTM2XT0tMSx3b1sxMzZdPTEsbm9bMTM2XT0xLHJvWzEzNl09MCxpb1sxMzZdPTAsb29bMTM2XT0xLHNvWzEzNl09MCxhb1sxMzZdPTEsdW9bMzRdPTAsbG9bMzRdPS0xLGNvWzM0XT0wLGhvWzM0XT0wLHBvWzM0XT0tMSxmb1szNF09MSxfb1szNF09MSxtb1szNF09MCx4b1szNF09MCxnb1szNF09MSx5b1szNF09MCx2b1szNF09MSxJb1szNF09MCxOb1szNF09MSxTb1szNF09MSxFb1szNF09MCxib1szNF09MSx3b1szNF09MCxub1szNF09LTEscm9bMzRdPTAsaW9bMzRdPTEsb29bMzRdPS0xLHNvWzM0XT0wLGFvWzM0XT0wLHVvWzM1XT0wLGxvWzM1XT0xLGNvWzM1XT0xLGhvWzM1XT0wLHBvWzM1XT0tMSxmb1szNV09MSxfb1szNV09MSxtb1szNV09MCx4b1szNV09MCxnb1szNV09LTEseW9bMzVdPTAsdm9bMzVdPTAsSW9bMzVdPTAsTm9bMzVdPS0xLFNvWzM1XT0wLEVvWzM1XT0wLGJvWzM1XT0xLHdvWzM1XT0wLG5vWzM1XT0tMSxyb1szNV09MCxpb1szNV09MSxvb1szNV09MSxzb1szNV09MCxhb1szNV09MSx1b1sxNTNdPTAsbG9bMTUzXT0xLGNvWzE1M109MSxnb1sxNTNdPS0xLHlvWzE1M109MCx2b1sxNTNdPTAsSW9bMTUzXT0wLE5vWzE1M109LTEsU29bMTUzXT0wLG9vWzE1M109MSxzb1sxNTNdPTAsYW9bMTUzXT0xLGhvWzEwMl09MCxwb1sxMDJdPS0xLGZvWzEwMl09MSxfb1sxMDJdPTEsbW9bMTAyXT0wLHhvWzEwMl09MCxFb1sxMDJdPTAsYm9bMTAyXT0xLHdvWzEwMl09MCxub1sxMDJdPS0xLHJvWzEwMl09MCxpb1sxMDJdPTEsdW9bMTU1XT0wLGxvWzE1NV09LTEsY29bMTU1XT0wLGdvWzE1NV09MSx5b1sxNTVdPTAsdm9bMTU1XT0xLElvWzE1NV09MCxOb1sxNTVdPTEsU29bMTU1XT0xLG9vWzE1NV09LTEsc29bMTU1XT0wLGFvWzE1NV09MCxob1sxMDNdPTAscG9bMTAzXT0xLGZvWzEwM109MCxfb1sxMDNdPS0xLG1vWzEwM109MCx4b1sxMDNdPTEsRW9bMTAzXT0wLGJvWzEwM109LTEsd29bMTAzXT0xLG5vWzEwM109MSxyb1sxMDNdPTAsaW9bMTAzXT0wLHVvWzE1Ml09MCxsb1sxNTJdPTEsY29bMTUyXT0xLF9vWzE1Ml09LTEsbW9bMTUyXT0wLHhvWzE1Ml09MSxnb1sxNTJdPS0xLHlvWzE1Ml09MCx2b1sxNTJdPTAsSW9bMTUyXT0wLE5vWzE1Ml09LTEsU29bMTUyXT0wLEVvWzE1Ml09MCxib1sxNTJdPS0xLHdvWzE1Ml09MSxvb1sxNTJdPTEsc29bMTUyXT0wLGFvWzE1Ml09MSx1b1sxNTZdPTAsbG9bMTU2XT0tMSxjb1sxNTZdPTEsX29bMTU2XT0xLG1vWzE1Nl09MCx4b1sxNTZdPTEsZ29bMTU2XT0tMSx5b1sxNTZdPTAsdm9bMTU2XT0wLElvWzE1Nl09MCxOb1sxNTZdPS0xLFNvWzE1Nl09MCxFb1sxNTZdPTAsYm9bMTU2XT0xLHdvWzE1Nl09MSxvb1sxNTZdPS0xLHNvWzE1Nl09MCxhb1sxNTZdPTEsdW9bMTM3XT0wLGxvWzEzN109MSxjb1sxMzddPTEsaG9bMTM3XT0wLHBvWzEzN109MSxmb1sxMzddPTAsZ29bMTM3XT0tMSx5b1sxMzddPTAsdm9bMTM3XT0wLElvWzEzN109MCxOb1sxMzddPS0xLFNvWzEzN109MCxub1sxMzddPTEscm9bMTM3XT0wLGlvWzEzN109MCxvb1sxMzddPTEsc29bMTM3XT0wLGFvWzEzN109MSx1b1sxMzldPTAsbG9bMTM5XT0xLGNvWzEzOV09MSxob1sxMzldPTAscG9bMTM5XT0tMSxmb1sxMzldPTAsZ29bMTM5XT0xLHlvWzEzOV09MCx2b1sxMzldPTAsSW9bMTM5XT0wLE5vWzEzOV09MSxTb1sxMzldPTAsbm9bMTM5XT0tMSxyb1sxMzldPTAsaW9bMTM5XT0wLG9vWzEzOV09MSxzb1sxMzldPTAsYW9bMTM5XT0xLHVvWzk4XT0wLGxvWzk4XT0tMSxjb1s5OF09MCxob1s5OF09MCxwb1s5OF09LTEsZm9bOThdPTEsX29bOThdPTEsbW9bOThdPTAseG9bOThdPTAsZ29bOThdPTEseW9bOThdPTAsdm9bOThdPTEsRW9bOThdPTAsYm9bOThdPTEsd29bOThdPTAsbm9bOThdPS0xLHJvWzk4XT0wLGlvWzk4XT0xLHVvWzk5XT0wLGxvWzk5XT0xLGNvWzk5XT0wLGhvWzk5XT0wLHBvWzk5XT0tMSxmb1s5OV09MSxfb1s5OV09MSxtb1s5OV09MCx4b1s5OV09MCxnb1s5OV09LTEseW9bOTldPTAsdm9bOTldPTEsRW9bOTldPTAsYm9bOTldPS0xLHdvWzk5XT0wLG5vWzk5XT0xLHJvWzk5XT0wLGlvWzk5XT0xLGhvWzM4XT0wLHBvWzM4XT0tMSxmb1szOF09MSxfb1szOF09MSxtb1szOF09MCx4b1szOF09MCxJb1szOF09MCxOb1szOF09MSxTb1szOF09MSxFb1szOF09MCxib1szOF09MSx3b1szOF09MCxub1szOF09LTEscm9bMzhdPTAsaW9bMzhdPTEsb29bMzhdPS0xLHNvWzM4XT0wLGFvWzM4XT0wLGhvWzM5XT0wLHBvWzM5XT0xLGZvWzM5XT0xLF9vWzM5XT0tMSxtb1szOV09MCx4b1szOV09MCxJb1szOV09MCxOb1szOV09LTEsU29bMzldPTEsRW9bMzldPTAsYm9bMzldPTEsd29bMzldPTAsbm9bMzldPS0xLHJvWzM5XT0wLGlvWzM5XT0xLG9vWzM5XT0xLHNvWzM5XT0wLGFvWzM5XT0wO3ZhciBDbz1mdW5jdGlvbih0KXtyZXR1cm5bW3QuYm90dG9tbGVmdCwwXSxbMCwwXSxbMCx0LmxlZnRib3R0b21dXX0sUG89ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHRib3R0b21dLFsxLDBdLFt0LmJvdHRvbXJpZ2h0LDBdXX0sTW89ZnVuY3Rpb24odCl7cmV0dXJuW1t0LnRvcHJpZ2h0LDFdLFsxLDFdLFsxLHQucmlnaHR0b3BdXX0sTG89ZnVuY3Rpb24odCl7cmV0dXJuW1swLHQubGVmdHRvcF0sWzAsMV0sW3QudG9wbGVmdCwxXV19LE9vPWZ1bmN0aW9uKHQpe3JldHVybltbdC5ib3R0b21yaWdodCwwXSxbdC5ib3R0b21sZWZ0LDBdLFswLHQubGVmdGJvdHRvbV0sWzAsdC5sZWZ0dG9wXV19LFJvPWZ1bmN0aW9uKHQpe3JldHVybltbdC5ib3R0b21yaWdodCwwXSxbdC5ib3R0b21sZWZ0LDBdLFsxLHQucmlnaHR0b3BdLFsxLHQucmlnaHRib3R0b21dXX0sVG89ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHR0b3BdLFsxLHQucmlnaHRib3R0b21dLFt0LnRvcGxlZnQsMV0sW3QudG9wcmlnaHQsMV1dfSxBbz1mdW5jdGlvbih0KXtyZXR1cm5bWzAsdC5sZWZ0Ym90dG9tXSxbMCx0LmxlZnR0b3BdLFt0LnRvcGxlZnQsMV0sW3QudG9wcmlnaHQsMV1dfSxEbz1bXSxGbz1bXSxrbz1bXSxHbz1bXSxxbz1bXSxCbz1bXSx6bz1bXSxqbz1bXTtHb1sxXT1xb1sxXT0xOCxHb1sxNjldPXFvWzE2OV09MTgsa29bNF09Rm9bNF09MTIsa29bMTY2XT1Gb1sxNjZdPTEyLERvWzE2XT1qb1sxNl09NCxEb1sxNTRdPWpvWzE1NF09NCxCb1s2NF09em9bNjRdPTIyLEJvWzEwNl09em9bMTA2XT0yMixrb1syXT1Cb1syXT0xNyxHb1syXT1xb1syXT0xOCxrb1sxNjhdPUJvWzE2OF09MTcsR29bMTY4XT1xb1sxNjhdPTE4LERvWzhdPUdvWzhdPTksRm9bOF09a29bOF09MTIsRG9bMTYyXT1Hb1sxNjJdPTksRm9bMTYyXT1rb1sxNjJdPTEyLERvWzMyXT1qb1szMl09NCxGb1szMl09em9bMzJdPTEsRG9bMTM4XT1qb1sxMzhdPTQsRm9bMTM4XT16b1sxMzhdPTEscW9bMTI4XT1qb1sxMjhdPTIxLEJvWzEyOF09em9bMTI4XT0yMixxb1s0Ml09am9bNDJdPTIxLEJvWzQyXT16b1s0Ml09MjIsRm9bNV09cW9bNV09MTQsRm9bMTY1XT1xb1sxNjVdPTE0LGtvWzIwXT1qb1syMF09Nixrb1sxNTBdPWpvWzE1MF09NixEb1s4MF09Qm9bODBdPTExLERvWzkwXT1Cb1s5MF09MTEsR29bNjVdPXpvWzY1XT0zLEdvWzEwNV09em9bMTA1XT0zLERvWzE2MF09Qm9bMTYwXT0xMSxGb1sxNjBdPXFvWzE2MF09MTQsRG9bMTBdPUJvWzEwXT0xMSxGb1sxMF09cW9bMTBdPTE0LGtvWzEzMF09am9bMTMwXT02LEdvWzEzMF09em9bMTMwXT0zLGtvWzQwXT1qb1s0MF09NixHb1s0MF09em9bNDBdPTMsRm9bMTAxXT16b1sxMDFdPTEsRm9bNjldPXpvWzY5XT0xLHFvWzE0OV09am9bMTQ5XT0yMSxxb1syMV09am9bMjFdPTIxLGtvWzg2XT1Cb1s4Nl09MTcsa29bODRdPUJvWzg0XT0xNyxEb1s4OV09R29bODldPTksRG9bODFdPUdvWzgxXT05LERvWzk2XT16b1s5Nl09MCxGb1s5Nl09Qm9bOTZdPTE1LERvWzc0XT16b1s3NF09MCxGb1s3NF09Qm9bNzRdPTE1LERvWzI0XT1rb1syNF09OCxHb1syNF09am9bMjRdPTcsRG9bMTQ2XT1rb1sxNDZdPTgsR29bMTQ2XT1qb1sxNDZdPTcsRm9bNl09Qm9bNl09MTUsa29bNl09cW9bNl09MTYsRm9bMTY0XT1Cb1sxNjRdPTE1LGtvWzE2NF09cW9bMTY0XT0xNixHb1sxMjldPWpvWzEyOV09Nyxxb1sxMjldPXpvWzEyOV09MjAsR29bNDFdPWpvWzQxXT03LHFvWzQxXT16b1s0MV09MjAsa29bNjZdPXpvWzY2XT0yLEdvWzY2XT1Cb1s2Nl09MTksa29bMTA0XT16b1sxMDRdPTIsR29bMTA0XT1Cb1sxMDRdPTE5LERvWzE0NF09cW9bMTQ0XT0xMCxCb1sxNDRdPWpvWzE0NF09MjMsRG9bMjZdPXFvWzI2XT0xMCxCb1syNl09am9bMjZdPTIzLEZvWzM2XT1qb1szNl09NSxrb1szNl09em9bMzZdPTIsRm9bMTM0XT1qb1sxMzRdPTUsa29bMTM0XT16b1sxMzRdPTIsRG9bOV09cW9bOV09MTAsRm9bOV09R29bOV09MTMsRG9bMTYxXT1xb1sxNjFdPTEwLEZvWzE2MV09R29bMTYxXT0xMyxGb1szN109am9bMzddPTUscW9bMzddPXpvWzM3XT0yMCxGb1sxMzNdPWpvWzEzM109NSxxb1sxMzNdPXpvWzEzM109MjAsa29bMTQ4XT1xb1sxNDhdPTE2LEJvWzE0OF09am9bMTQ4XT0yMyxrb1syMl09cW9bMjJdPTE2LEJvWzIyXT1qb1syMl09MjMsRG9bODJdPWtvWzgyXT04LEdvWzgyXT1Cb1s4Ml09MTksRG9bODhdPWtvWzg4XT04LEdvWzg4XT1Cb1s4OF09MTksRG9bNzNdPXpvWzczXT0wLEZvWzczXT1Hb1s3M109MTMsRG9bOTddPXpvWzk3XT0wLEZvWzk3XT1Hb1s5N109MTMsRG9bMTQ1XT1Hb1sxNDVdPTkscW9bMTQ1XT1qb1sxNDVdPTIxLERvWzI1XT1Hb1syNV09OSxxb1syNV09am9bMjVdPTIxLEZvWzcwXT16b1s3MF09MSxrb1s3MF09Qm9bNzBdPTE3LEZvWzEwMF09em9bMTAwXT0xLGtvWzEwMF09Qm9bMTAwXT0xNyxEb1szNF09R29bMzRdPTksRm9bMzRdPWtvWzM0XT0xMixxb1szNF09am9bMzRdPTIxLEJvWzM0XT16b1szNF09MjIsRG9bMTM2XT1qb1sxMzZdPTQsRm9bMTM2XT16b1sxMzZdPTEsa29bMTM2XT1Cb1sxMzZdPTE3LEdvWzEzNl09cW9bMTM2XT0xOCxEb1szNV09am9bMzVdPTQsRm9bMzVdPWtvWzM1XT0xMixHb1szNV09cW9bMzVdPTE4LEJvWzM1XT16b1szNV09MjIsRG9bMTUzXT1qb1sxNTNdPTQsR29bMTUzXT1xb1sxNTNdPTE4LEZvWzEwMl09a29bMTAyXT0xMixCb1sxMDJdPXpvWzEwMl09MjIsRG9bMTU1XT1Hb1sxNTVdPTkscW9bMTU1XT1qb1sxNTVdPTIzLEZvWzEwM109em9bMTAzXT0xLGtvWzEwM109Qm9bMTAzXT0xNyxEb1sxNTJdPWpvWzE1Ml09NCxrb1sxNTJdPUJvWzE1Ml09MTcsR29bMTUyXT1xb1sxNTJdPTE4LERvWzE1Nl09a29bMTU2XT04LEdvWzE1Nl09cW9bMTU2XT0xOCxCb1sxNTZdPWpvWzE1Nl09MjMsRG9bMTM3XT1qb1sxMzddPTQsRm9bMTM3XT16b1sxMzddPTEsR29bMTM3XT1xb1sxMzddPTE4LERvWzEzOV09am9bMTM5XT00LEZvWzEzOV09R29bMTM5XT0xMyxxb1sxMzldPXpvWzEzOV09MjAsRG9bOThdPUdvWzk4XT05LEZvWzk4XT1rb1s5OF09MTIsQm9bOThdPXpvWzk4XT0yMixEb1s5OV09em9bOTldPTAsRm9bOTldPWtvWzk5XT0xMixHb1s5OV09Qm9bOTldPTE5LEZvWzM4XT1rb1szOF09MTIscW9bMzhdPWpvWzM4XT0yMSxCb1szOF09em9bMzhdPTIyLEZvWzM5XT1qb1szOV09NSxrb1szOV09cW9bMzldPTE2LEJvWzM5XT16b1szOV09MjI7dmFyIFVvPVtdO2Z1bmN0aW9uIFZvKHQsZSxuKXtyZXR1cm4odC1lKS8obi1lKX1mdW5jdGlvbiBYbyh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci50b1N0cmluZygpLmluZGV4T2YoIkFycmF5Iik+LTF9ZnVuY3Rpb24gWW8odCxlLG4scixpLG8pe2Zvcih2YXIgcz10LmNlbGxzW25dW2VdLGE9cy5jdmFsX3JlYWwsdT1lK3IsbD1uK2ksYz1bXSxoPSExOyFoOyl7aWYodm9pZCAwPT09dC5jZWxsc1tsXXx8dm9pZCAwPT09dC5jZWxsc1tsXVt1XSlpZihsLT1pLHUtPXIsYT0ocz10LmNlbGxzW2xdW3VdKS5jdmFsX3JlYWwsLTE9PT1pKWlmKDA9PT1vKWlmKDEmYSljLnB1c2goW3UsbF0pLHI9LTEsaT0wLG89MDtlbHNle2lmKCEoNCZhKSl7Yy5wdXNoKFt1K3MuYm90dG9tcmlnaHQsbF0pLHI9MCxpPTEsbz0xLGg9ITA7YnJlYWt9Yy5wdXNoKFt1KzEsbF0pLHI9MSxpPTAsbz0wfWVsc2V7aWYoISgxJmEpKXtpZig0JmEpe2MucHVzaChbdStzLmJvdHRvbXJpZ2h0LGxdKSxyPTAsaT0xLG89MSxoPSEwO2JyZWFrfWMucHVzaChbdStzLmJvdHRvbWxlZnQsbF0pLHI9MCxpPTEsbz0wLGg9ITA7YnJlYWt9Yy5wdXNoKFt1LGxdKSxyPS0xLGk9MCxvPTB9ZWxzZSBpZigxPT09aSlpZigwPT09byl7aWYoIShhJmVvKSl7aWYoYSZ0byl7Yy5wdXNoKFt1K3MudG9wbGVmdCxsKzFdKSxyPTAsaT0tMSxvPTAsaD0hMDticmVha31jLnB1c2goW3Urcy50b3ByaWdodCxsKzFdKSxyPTAsaT0tMSxvPTEsaD0hMDticmVha31jLnB1c2goW3UrMSxsKzFdKSxyPTEsaT0wLG89MX1lbHNlIGMucHVzaChbdSsxLGwrMV0pLHI9MSxpPTAsbz0xO2Vsc2UgaWYoLTE9PT1yKWlmKDA9PT1vKXtpZighKGEmdG8pKXtpZigxJmEpe2MucHVzaChbdSxsK3MubGVmdGJvdHRvbV0pLHI9MSxpPTAsbz0wLGg9ITA7YnJlYWt9Yy5wdXNoKFt1LGwrcy5sZWZ0dG9wXSkscj0xLGk9MCxvPTEsaD0hMDticmVha31jLnB1c2goW3UsbCsxXSkscj0wLGk9MSxvPTB9ZWxzZXtpZighKGEmdG8pKXtjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IHd0ZiIpO2JyZWFrfWMucHVzaChbdSxsKzFdKSxyPTAsaT0xLG89MH1lbHNle2lmKDEhPT1yKXtjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IHdlIGNhbWUgZnJvbSBub3doZXJlISIpO2JyZWFrfWlmKDA9PT1vKXtpZighKDQmYSkpe2MucHVzaChbdSsxLGwrcy5yaWdodGJvdHRvbV0pLHI9LTEsaT0wLG89MCxoPSEwO2JyZWFrfWMucHVzaChbdSsxLGxdKSxyPTAsaT0tMSxvPTF9ZWxzZXtpZighKDQmYSkpe2lmKGEmZW8pe2MucHVzaChbdSsxLGwrcy5yaWdodHRvcF0pLHI9LTEsaT0wLG89MTticmVha31jLnB1c2goW3UrMSxsK3MucmlnaHRib3R0b21dKSxyPS0xLGk9MCxvPTAsaD0hMDticmVha31jLnB1c2goW3UrMSxsXSkscj0wLGk9LTEsbz0xfX1lbHNlIGlmKGE9KHM9dC5jZWxsc1tsXVt1XSkuY3ZhbF9yZWFsLC0xPT09cilpZigwPT09bylpZih2b2lkIDAhPT10LmNlbGxzW2wtMV0mJnZvaWQgMCE9PXQuY2VsbHNbbC0xXVt1XSlyPTAsaT0tMSxvPTE7ZWxzZXtpZighKDEmYSkpe2MucHVzaChbdStzLmJvdHRvbXJpZ2h0LGxdKSxyPTAsaT0xLG89MSxoPSEwO2JyZWFrfWMucHVzaChbdSxsXSl9ZWxzZXtpZighKGEmdG8pKXtjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IGZvdW5kIGVudHJ5IGZyb20gdG9wIGF0ICIrdSsiLCIrbCk7YnJlYWt9Y29uc29sZS5sb2coIk1hcmNoaW5nU3F1YXJlc0pTLWlzb0JhbmRzOiBwcm9jZWVkaW5nIGluIHgtZGlyZWN0aW9uISIpfWVsc2UgaWYoMT09PXIpe2lmKDA9PT1vKXtjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IHd0ZiIpO2JyZWFrfWlmKHZvaWQgMCE9PXQuY2VsbHNbbCsxXSYmdm9pZCAwIT09dC5jZWxsc1tsKzFdW3VdKXI9MCxpPTEsbz0wO2Vsc2V7aWYoIShhJmVvKSl7Yy5wdXNoKFt1K3MudG9wbGVmdCxsKzFdKSxyPTAsaT0tMSxvPTAsaD0hMDticmVha31jLnB1c2goW3UrMSxsKzFdKSxyPTEsaT0wLG89MX19ZWxzZSBpZigtMT09PWkpe2lmKDEhPT1vKXtjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IHd0ZiIpO2JyZWFrfWlmKHZvaWQgMCE9PXQuY2VsbHNbbF1bdSsxXSlyPTEsaT0wLG89MTtlbHNle2lmKCEoNCZhKSl7Yy5wdXNoKFt1KzEsbCtzLnJpZ2h0dG9wXSkscj0tMSxpPTAsbz0xLGg9ITA7YnJlYWt9Yy5wdXNoKFt1KzEsbF0pLHI9MCxpPS0xLG89MX19ZWxzZXtpZigxIT09aSl7Y29uc29sZS5sb2coIk1hcmNoaW5nU3F1YXJlc0pTLWlzb0JhbmRzOiB3aGVyZSBkaWQgd2UgY2FtZSBmcm9tPz8/Iik7YnJlYWt9aWYoMCE9PW8pe2NvbnNvbGUubG9nKCJNYXJjaGluZ1NxdWFyZXNKUy1pc29CYW5kczogd3RmIik7YnJlYWt9aWYodm9pZCAwIT09dC5jZWxsc1tsXVt1LTFdKXI9LTEsaT0wLG89MDtlbHNle2lmKCEoYSZ0bykpe2MucHVzaChbdSxsK3MubGVmdGJvdHRvbV0pLHI9MSxpPTAsbz0wLGg9ITA7YnJlYWt9Yy5wdXNoKFt1LGwrMV0pLHI9MCxpPTEsbz0wfX1pZihsKz1pLCh1Kz1yKT09PWUmJmw9PT1uKWJyZWFrfXJldHVybntwYXRoOmMsaTp1LGo6bCx4OnIseTppLG86b319ZnVuY3Rpb24gSG8odCl7aWYodC5lZGdlcy5sZW5ndGg+MCl7dmFyIGU9dC5lZGdlc1t0LmVkZ2VzLmxlbmd0aC0xXSxuPXQuY3ZhbF9yZWFsO3N3aXRjaChlKXtjYXNlIDA6cmV0dXJuIG4mZW8/e3A6WzEsdC5yaWdodHRvcF0seDotMSx5OjAsbzoxfTp7cDpbdC50b3BsZWZ0LDFdLHg6MCx5Oi0xLG86MH07Y2FzZSAxOnJldHVybiA0Jm4/e3A6W3QudG9wbGVmdCwxXSx4OjAseTotMSxvOjB9OntwOlsxLHQucmlnaHRib3R0b21dLHg6LTEseTowLG86MH07Y2FzZSAyOnJldHVybiA0Jm4/e3A6W3QuYm90dG9tcmlnaHQsMF0seDowLHk6MSxvOjF9OntwOlt0LnRvcGxlZnQsMV0seDowLHk6LTEsbzowfTtjYXNlIDM6cmV0dXJuIDEmbj97cDpbdC50b3BsZWZ0LDFdLHg6MCx5Oi0xLG86MH06e3A6W3QuYm90dG9tbGVmdCwwXSx4OjAseToxLG86MH07Y2FzZSA0OnJldHVybiBuJmVvP3twOlsxLHQucmlnaHR0b3BdLHg6LTEseTowLG86MX06e3A6W3QudG9wcmlnaHQsMV0seDowLHk6LTEsbzoxfTtjYXNlIDU6cmV0dXJuIDQmbj97cDpbdC50b3ByaWdodCwxXSx4OjAseTotMSxvOjF9OntwOlsxLHQucmlnaHRib3R0b21dLHg6LTEseTowLG86MH07Y2FzZSA2OnJldHVybiA0Jm4/e3A6W3QuYm90dG9tcmlnaHQsMF0seDowLHk6MSxvOjF9OntwOlt0LnRvcHJpZ2h0LDFdLHg6MCx5Oi0xLG86MX07Y2FzZSA3OnJldHVybiAxJm4/e3A6W3QudG9wcmlnaHQsMV0seDowLHk6LTEsbzoxfTp7cDpbdC5ib3R0b21sZWZ0LDBdLHg6MCx5OjEsbzowfTtjYXNlIDg6cmV0dXJuIDQmbj97cDpbdC5ib3R0b21yaWdodCwwXSx4OjAseToxLG86MX06e3A6WzEsdC5yaWdodHRvcF0seDotMSx5OjAsbzoxfTtjYXNlIDk6cmV0dXJuIDEmbj97cDpbMSx0LnJpZ2h0dG9wXSx4Oi0xLHk6MCxvOjF9OntwOlt0LmJvdHRvbWxlZnQsMF0seDowLHk6MSxvOjB9O2Nhc2UgMTA6cmV0dXJuIDEmbj97cDpbMCx0LmxlZnRib3R0b21dLHg6MSx5OjAsbzowfTp7cDpbMSx0LnJpZ2h0dG9wXSx4Oi0xLHk6MCxvOjF9O2Nhc2UgMTE6cmV0dXJuIG4mdG8/e3A6WzEsdC5yaWdodHRvcF0seDotMSx5OjAsbzoxfTp7cDpbMCx0LmxlZnR0b3BdLHg6MSx5OjAsbzoxfTtjYXNlIDEyOnJldHVybiA0Jm4/e3A6W3QuYm90dG9tcmlnaHQsMF0seDowLHk6MSxvOjF9OntwOlsxLHQucmlnaHRib3R0b21dLHg6LTEseTowLG86MH07Y2FzZSAxMzpyZXR1cm4gMSZuP3twOlsxLHQucmlnaHRib3R0b21dLHg6LTEseTowLG86MH06e3A6W3QuYm90dG9tbGVmdCwwXSx4OjAseToxLG86MH07Y2FzZSAxNDpyZXR1cm4gMSZuP3twOlswLHQubGVmdGJvdHRvbV0seDoxLHk6MCxvOjB9OntwOlsxLHQucmlnaHRib3R0b21dLHg6LTEseTowLG86MH07Y2FzZSAxNTpyZXR1cm4gbiZ0bz97cDpbMSx0LnJpZ2h0Ym90dG9tXSx4Oi0xLHk6MCxvOjB9OntwOlswLHQubGVmdHRvcF0seDoxLHk6MCxvOjF9O2Nhc2UgMTY6cmV0dXJuIDQmbj97cDpbdC5ib3R0b21yaWdodCwwXSx4OjAseToxLG86MX06e3A6WzAsdC5sZWZ0Ym90dG9tXSx4OjEseTowLG86MH07Y2FzZSAxNzpyZXR1cm4gbiZ0bz97cDpbdC5ib3R0b21yaWdodCwwXSx4OjAseToxLG86MX06e3A6WzAsdC5sZWZ0dG9wXSx4OjEseTowLG86MX07Y2FzZSAxODpyZXR1cm4gMSZuP3twOlswLHQubGVmdGJvdHRvbV0seDoxLHk6MCxvOjB9OntwOlt0LmJvdHRvbWxlZnQsMF0seDowLHk6MSxvOjB9O2Nhc2UgMTk6cmV0dXJuIG4mdG8/e3A6W3QuYm90dG9tbGVmdCwwXSx4OjAseToxLG86MH06e3A6WzAsdC5sZWZ0dG9wXSx4OjEseTowLG86MX07Y2FzZSAyMDpyZXR1cm4gbiZ0bz97cDpbdC50b3BsZWZ0LDFdLHg6MCx5Oi0xLG86MH06e3A6WzAsdC5sZWZ0Ym90dG9tXSx4OjEseTowLG86MH07Y2FzZSAyMTpyZXR1cm4gbiZlbz97cDpbMCx0LmxlZnRib3R0b21dLHg6MSx5OjAsbzowfTp7cDpbdC50b3ByaWdodCwxXSx4OjAseTotMSxvOjF9O2Nhc2UgMjI6cmV0dXJuIG4mdG8/e3A6W3QudG9wbGVmdCwxXSx4OjAseTotMSxvOjB9OntwOlswLHQubGVmdHRvcF0seDoxLHk6MCxvOjF9O2Nhc2UgMjM6cmV0dXJuIG4mZW8/e3A6WzAsdC5sZWZ0dG9wXSx4OjEseTowLG86MX06e3A6W3QudG9wcmlnaHQsMV0seDowLHk6LTEsbzoxfTtkZWZhdWx0OmNvbnNvbGUubG9nKCJNYXJjaGluZ1NxdWFyZXNKUy1pc29CYW5kczogZWRnZSBpbmRleCBvdXQgb2YgcmFuZ2UhIiksY29uc29sZS5sb2codCl9fXJldHVybiBudWxsfWZ1bmN0aW9uIFdvKHQsZSxuLHIpe3ZhciBpLG8scyxhLHUsbD10LmN2YWw7c3dpdGNoKGUpe2Nhc2UtMTpzd2l0Y2gocil7Y2FzZSAwOmk9Rm9bbF0scz1ob1tsXSxhPXBvW2xdLHU9Zm9bbF07YnJlYWs7ZGVmYXVsdDppPURvW2xdLHM9dW9bbF0sYT1sb1tsXSx1PWNvW2xdfWJyZWFrO2Nhc2UgMTpzd2l0Y2gocil7Y2FzZSAwOmk9cW9bbF0scz1Jb1tsXSxhPU5vW2xdLHU9U29bbF07YnJlYWs7ZGVmYXVsdDppPUJvW2xdLHM9RW9bbF0sYT1ib1tsXSx1PXdvW2xdfWJyZWFrO2RlZmF1bHQ6c3dpdGNoKG4pe2Nhc2UtMTpzd2l0Y2gocil7Y2FzZSAwOmk9em9bbF0scz1ub1tsXSxhPXJvW2xdLHU9aW9bbF07YnJlYWs7ZGVmYXVsdDppPWpvW2xdLHM9b29bbF0sYT1zb1tsXSx1PWFvW2xdfWJyZWFrO2Nhc2UgMTpzd2l0Y2gocil7Y2FzZSAwOmk9R29bbF0scz1nb1tsXSxhPXlvW2xdLHU9dm9bbF07YnJlYWs7ZGVmYXVsdDppPWtvW2xdLHM9X29bbF0sYT1tb1tsXSx1PXhvW2xdfX19aWYobz10LmVkZ2VzLmluZGV4T2YoaSksdm9pZCAwPT09dC5lZGdlc1tvXSlyZXR1cm4gbnVsbDtzd2l0Y2goZnVuY3Rpb24odCxlKXtkZWxldGUgdC5lZGdlc1tlXTtmb3IodmFyIG49ZSsxO248dC5lZGdlcy5sZW5ndGg7bisrKXQuZWRnZXNbbi0xXT10LmVkZ2VzW25dO3QuZWRnZXMucG9wKCl9KHQsbyksbD10LmN2YWxfcmVhbCxpKXtjYXNlIDA6bCZlbz8oZT10LnRvcGxlZnQsbj0xKTooZT0xLG49dC5yaWdodHRvcCk7YnJlYWs7Y2FzZSAxOjQmbD8oZT0xLG49dC5yaWdodGJvdHRvbSk6KGU9dC50b3BsZWZ0LG49MSk7YnJlYWs7Y2FzZSAyOjQmbD8oZT10LnRvcGxlZnQsbj0xKTooZT10LmJvdHRvbXJpZ2h0LG49MCk7YnJlYWs7Y2FzZSAzOjEmbD8oZT10LmJvdHRvbWxlZnQsbj0wKTooZT10LnRvcGxlZnQsbj0xKTticmVhaztjYXNlIDQ6bCZlbz8oZT10LnRvcHJpZ2h0LG49MSk6KGU9MSxuPXQucmlnaHR0b3ApO2JyZWFrO2Nhc2UgNTo0Jmw/KGU9MSxuPXQucmlnaHRib3R0b20pOihlPXQudG9wcmlnaHQsbj0xKTticmVhaztjYXNlIDY6NCZsPyhlPXQudG9wcmlnaHQsbj0xKTooZT10LmJvdHRvbXJpZ2h0LG49MCk7YnJlYWs7Y2FzZSA3OjEmbD8oZT10LmJvdHRvbWxlZnQsbj0wKTooZT10LnRvcHJpZ2h0LG49MSk7YnJlYWs7Y2FzZSA4OjQmbD8oZT0xLG49dC5yaWdodHRvcCk6KGU9dC5ib3R0b21yaWdodCxuPTApO2JyZWFrO2Nhc2UgOToxJmw/KGU9dC5ib3R0b21sZWZ0LG49MCk6KGU9MSxuPXQucmlnaHR0b3ApO2JyZWFrO2Nhc2UgMTA6MSZsPyhlPTEsbj10LnJpZ2h0dG9wKTooZT0wLG49dC5sZWZ0Ym90dG9tKTticmVhaztjYXNlIDExOmwmdG8/KGU9MCxuPXQubGVmdHRvcCk6KGU9MSxuPXQucmlnaHR0b3ApO2JyZWFrO2Nhc2UgMTI6NCZsPyhlPTEsbj10LnJpZ2h0Ym90dG9tKTooZT10LmJvdHRvbXJpZ2h0LG49MCk7YnJlYWs7Y2FzZSAxMzoxJmw/KGU9dC5ib3R0b21sZWZ0LG49MCk6KGU9MSxuPXQucmlnaHRib3R0b20pO2JyZWFrO2Nhc2UgMTQ6MSZsPyhlPTEsbj10LnJpZ2h0Ym90dG9tKTooZT0wLG49dC5sZWZ0Ym90dG9tKTticmVhaztjYXNlIDE1OmwmdG8/KGU9MCxuPXQubGVmdHRvcCk6KGU9MSxuPXQucmlnaHRib3R0b20pO2JyZWFrO2Nhc2UgMTY6NCZsPyhlPTAsbj10LmxlZnRib3R0b20pOihlPXQuYm90dG9tcmlnaHQsbj0wKTticmVhaztjYXNlIDE3OmwmdG8/KGU9MCxuPXQubGVmdHRvcCk6KGU9dC5ib3R0b21yaWdodCxuPTApO2JyZWFrO2Nhc2UgMTg6MSZsPyhlPXQuYm90dG9tbGVmdCxuPTApOihlPTAsbj10LmxlZnRib3R0b20pO2JyZWFrO2Nhc2UgMTk6bCZ0bz8oZT0wLG49dC5sZWZ0dG9wKTooZT10LmJvdHRvbWxlZnQsbj0wKTticmVhaztjYXNlIDIwOmwmdG8/KGU9MCxuPXQubGVmdGJvdHRvbSk6KGU9dC50b3BsZWZ0LG49MSk7YnJlYWs7Y2FzZSAyMTpsJmVvPyhlPXQudG9wcmlnaHQsbj0xKTooZT0wLG49dC5sZWZ0Ym90dG9tKTticmVhaztjYXNlIDIyOmwmdG8/KGU9MCxuPXQubGVmdHRvcCk6KGU9dC50b3BsZWZ0LG49MSk7YnJlYWs7Y2FzZSAyMzpsJmVvPyhlPXQudG9wcmlnaHQsbj0xKTooZT0wLG49dC5sZWZ0dG9wKTticmVhaztkZWZhdWx0OnJldHVybiBjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IGVkZ2UgaW5kZXggb3V0IG9mIHJhbmdlISIpLGNvbnNvbGUubG9nKHQpLG51bGx9cmV0dXJuIHZvaWQgMCE9PWUmJnZvaWQgMCE9PW4mJnZvaWQgMCE9PXMmJnZvaWQgMCE9PWEmJnZvaWQgMCE9PXV8fChjb25zb2xlLmxvZygiTWFyY2hpbmdTcXVhcmVzSlMtaXNvQmFuZHM6IHVuZGVmaW5lZCB2YWx1ZSEiKSxjb25zb2xlLmxvZyh0KSxjb25zb2xlLmxvZyhlKyIgIituKyIgIitzKyIgIithKyIgIit1KSkse3A6W2Usbl0seDpzLHk6YSxvOnV9fWZ1bmN0aW9uIEpvKHQpe3ZhciBlPVtdLG49W107dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgcj1qcihsKFt0XSkpO24ucHVzaChyKSxlLnB1c2goe3Jpbmc6dCxhcmVhOnJ9KX0pKSxuLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKTt2YXIgcj1bXTtyZXR1cm4gbi5mb3JFYWNoKChmdW5jdGlvbih0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihlW25dLmFyZWE9PT10KXtyLnB1c2goZVtuXS5yaW5nKSxlLnNwbGljZShuLDEpO2JyZWFrfX0pKSxyfWZ1bmN0aW9uIFpvKHQpe2Zvcih2YXIgZT10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue2xyQ29vcmRpbmF0ZXM6dCxncm91cGVkOiExfX0pKSxuPVtdOyFRbyhlKTspZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYoIWVbcl0uZ3JvdXBlZCl7dmFyIGk9W107aS5wdXNoKGVbcl0ubHJDb29yZGluYXRlcyksZVtyXS5ncm91cGVkPSEwO2Zvcih2YXIgbz1sKFtlW3JdLmxyQ29vcmRpbmF0ZXNdKSxzPXIrMTtzPGUubGVuZ3RoO3MrKyl7aWYoIWVbc10uZ3JvdXBlZClLbyhsKFtlW3NdLmxyQ29vcmRpbmF0ZXNdKSxvKSYmKGkucHVzaChlW3NdLmxyQ29vcmRpbmF0ZXMpLGVbc10uZ3JvdXBlZD0hMCl9bi5wdXNoKGkpfXJldHVybiBufWZ1bmN0aW9uIEtvKHQsZSl7Zm9yKHZhciBuPWJuKHQpLHI9MDtyPG4uZmVhdHVyZXMubGVuZ3RoO3IrKylpZigheWUobi5mZWF0dXJlc1tyXSxlKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBRbyh0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZighMT09PXRbZV0uZ3JvdXBlZClyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiAkbyh0LGUsbil7aWYoIVAobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLnBpdm90LGk9bi5tdXRhdGU7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7aWYobnVsbD09ZXx8aXNOYU4oZSkpdGhyb3cgbmV3IEVycm9yKCJhbmdsZSBpcyByZXF1aXJlZCIpO3JldHVybiAwPT09ZXx8KHJ8fChyPUVuKHQpKSwhMSE9PWkmJnZvaWQgMCE9PWl8fCh0PUllKHQpKSxSKHQsKGZ1bmN0aW9uKHQpe3ZhciBuPUJpKHIsdCkrZSxpPUFyKHIsdCksbz1RKGppKHIsaSxuKSk7dFswXT1vWzBdLHRbMV09b1sxXX0pKSksdH1mdW5jdGlvbiB0cyh0LGUsbil7aWYoIVAobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLm9yaWdpbixpPW4ubXV0YXRlO2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiByZXF1aXJlZCIpO2lmKCJudW1iZXIiIT10eXBlb2YgZXx8MD09PWUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZhY3RvciIpO3ZhciBvPUFycmF5LmlzQXJyYXkocil8fCJvYmplY3QiPT10eXBlb2YgcjtyZXR1cm4hMCE9PWkmJih0PUllKHQpKSwiRmVhdHVyZUNvbGxlY3Rpb24iIT09dC50eXBlfHxvP2VzKHQsZSxyKTooRih0LChmdW5jdGlvbihuLGkpe3QuZmVhdHVyZXNbaV09ZXMobixlLHIpfSkpLHQpfWZ1bmN0aW9uIGVzKHQsZSxuKXt2YXIgcj0iUG9pbnQiPT09aXQodCk7cmV0dXJuIG49ZnVuY3Rpb24odCxlKXtudWxsPT1lJiYoZT0iY2VudHJvaWQiKTtpZihBcnJheS5pc0FycmF5KGUpfHwib2JqZWN0Ij09dHlwZW9mIGUpcmV0dXJuIEsoZSk7dmFyIG49dC5iYm94P3QuYmJveDpaKHQpLHI9blswXSxpPW5bMV0sbz1uWzJdLHM9blszXTtzd2l0Y2goZSl7Y2FzZSJzdyI6Y2FzZSJzb3V0aHdlc3QiOmNhc2Uid2VzdHNvdXRoIjpjYXNlImJvdHRvbWxlZnQiOnJldHVybiBhKFtyLGldKTtjYXNlInNlIjpjYXNlInNvdXRoZWFzdCI6Y2FzZSJlYXN0c291dGgiOmNhc2UiYm90dG9tcmlnaHQiOnJldHVybiBhKFtvLGldKTtjYXNlIm53IjpjYXNlIm5vcnRod2VzdCI6Y2FzZSJ3ZXN0bm9ydGgiOmNhc2UidG9wbGVmdCI6cmV0dXJuIGEoW3Isc10pO2Nhc2UibmUiOmNhc2Uibm9ydGhlYXN0IjpjYXNlImVhc3Rub3J0aCI6Y2FzZSJ0b3ByaWdodCI6cmV0dXJuIGEoW28sc10pO2Nhc2UiY2VudGVyIjpyZXR1cm4geG4odCk7Y2FzZSB2b2lkIDA6Y2FzZSBudWxsOmNhc2UiY2VudHJvaWQiOnJldHVybiBFbih0KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW52YWxpZCBvcmlnaW4iKX19KHQsbiksMT09PWV8fHJ8fFIodCwoZnVuY3Rpb24odCl7dmFyIHI9QXIobix0KSxpPUJpKG4sdCksbz1RKGppKG4sciplLGkpKTt0WzBdPW9bMF0sdFsxXT1vWzFdLDM9PT10Lmxlbmd0aCYmKHRbMl0qPWUpfSkpLHR9ZnVuY3Rpb24gbnModCl7dmFyIGU9dFswXSxuPXRbMV07cmV0dXJuW25bMF0tZVswXSxuWzFdLWVbMV1dfWZ1bmN0aW9uIHJzKHQsZSl7cmV0dXJuIHRbMF0qZVsxXS1lWzBdKnRbMV19ZnVuY3Rpb24gaXModCxlKXtyZXR1cm4hZnVuY3Rpb24odCxlKXtyZXR1cm4gMD09PXJzKG5zKHQpLG5zKGUpKX0odCxlKSYmZnVuY3Rpb24odCxlKXt2YXIgbixyLGk9dFswXSxvPW5zKHQpLHM9ZVswXSxhPW5zKGUpLHU9cnMobyxhKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm5bdFswXStlWzBdLHRbMV0rZVsxXV19KGksZnVuY3Rpb24odCxlKXtyZXR1cm5bdCplWzBdLHQqZVsxXV19KHJzKChyPWksWyhuPXMpWzBdLXJbMF0sblsxXS1yWzFdXSksYSkvdSxvKSl9KHQsZSl9ZnVuY3Rpb24gb3ModCxlLG4pe3ZhciByPVtdLGk9RShlLG4pLG89USh0KSxzPVtdO3JldHVybiBvLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7aWYoZSE9PW8ubGVuZ3RoLTEpe3ZhciBuPShsPXQsYz1vW2UrMV0saD1pLHA9TWF0aC5zcXJ0KChsWzBdLWNbMF0pKihsWzBdLWNbMF0pKyhsWzFdLWNbMV0pKihsWzFdLWNbMV0pKSxmPWxbMF0raCooY1sxXS1sWzFdKS9wLGc9Y1swXStoKihjWzFdLWxbMV0pL3AsZD1sWzFdK2gqKGxbMF0tY1swXSkvcCx5PWNbMV0raCoobFswXS1jWzBdKS9wLFtbZixkXSxbZyx5XV0pO2lmKHIucHVzaChuKSxlPjApe3ZhciBhPXJbZS0xXSx1PWlzKG4sYSk7ITEhPT11JiYoYVsxXT11LG5bMF09dSkscy5wdXNoKGFbMF0pLGU9PT1vLmxlbmd0aC0yJiYocy5wdXNoKG5bMF0pLHMucHVzaChuWzFdKSl9Mj09PW8ubGVuZ3RoJiYocy5wdXNoKG5bMF0pLHMucHVzaChuWzFdKSl9dmFyIGwsYyxoLHAsZixnLGQseX0pKSxoKHMsdC5wcm9wZXJ0aWVzKX1mdW5jdGlvbiBzcyh0LGUsbil7dmFyIHI9ZVswXS10WzBdLGk9ZVsxXS10WzFdLG89blswXS1lWzBdO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4odD4wKS0odDwwKXx8K3R9KHIqKG5bMV0tZVsxXSktbyppKX1mdW5jdGlvbiBhcyh0LGUpe3JldHVybiBlLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4geWUoYShlKSx0KX0pKX1Vb1sxXT1Vb1sxNjldPUNvLFVvWzRdPVVvWzE2Nl09UG8sVW9bMTZdPVVvWzE1NF09TW8sVW9bNjRdPVVvWzEwNl09TG8sVW9bMTY4XT1Vb1syXT1PbyxVb1sxNjJdPVVvWzhdPVJvLFVvWzEzOF09VW9bMzJdPVRvLFVvWzQyXT1Vb1sxMjhdPUFvLFVvWzVdPVVvWzE2NV09ZnVuY3Rpb24odCl7cmV0dXJuW1swLDBdLFswLHQubGVmdGJvdHRvbV0sWzEsdC5yaWdodGJvdHRvbV0sWzEsMF1dfSxVb1syMF09VW9bMTUwXT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsMF0sW3QuYm90dG9tcmlnaHQsMF0sW3QudG9wcmlnaHQsMV0sWzEsMV1dfSxVb1s4MF09VW9bOTBdPWZ1bmN0aW9uKHQpe3JldHVybltbMSwxXSxbMSx0LnJpZ2h0dG9wXSxbMCx0LmxlZnR0b3BdLFswLDFdXX0sVW9bNjVdPVVvWzEwNV09ZnVuY3Rpb24odCl7cmV0dXJuW1t0LmJvdHRvbWxlZnQsMF0sWzAsMF0sWzAsMV0sW3QudG9wbGVmdCwxXV19LFVvWzE2MF09VW9bMTBdPWZ1bmN0aW9uKHQpe3JldHVybltbMSx0LnJpZ2h0dG9wXSxbMSx0LnJpZ2h0Ym90dG9tXSxbMCx0LmxlZnRib3R0b21dLFswLHQubGVmdHRvcF1dfSxVb1sxMzBdPVVvWzQwXT1mdW5jdGlvbih0KXtyZXR1cm5bW3QudG9wbGVmdCwxXSxbdC50b3ByaWdodCwxXSxbdC5ib3R0b21yaWdodCwwXSxbdC5ib3R0b21sZWZ0LDBdXX0sVW9bODVdPWZ1bmN0aW9uKCl7cmV0dXJuW1swLDBdLFswLDFdLFsxLDFdLFsxLDBdXX0sVW9bMTAxXT1Vb1s2OV09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHRib3R0b21dLFsxLDBdLFswLDBdLFswLDFdLFt0LnRvcGxlZnQsMV1dfSxVb1sxNDldPVVvWzIxXT1mdW5jdGlvbih0KXtyZXR1cm5bW3QudG9wcmlnaHQsMV0sWzEsMV0sWzEsMF0sWzAsMF0sWzAsdC5sZWZ0Ym90dG9tXV19LFVvWzg2XT1Vb1s4NF09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLDBdLFt0LmJvdHRvbXJpZ2h0LDBdLFswLHQubGVmdHRvcF0sWzAsMV0sWzEsMV1dfSxVb1s4OV09VW9bODFdPWZ1bmN0aW9uKHQpe3JldHVybltbMSwxXSxbMSx0LnJpZ2h0dG9wXSxbdC5ib3R0b21sZWZ0LDBdLFswLDBdLFswLDFdXX0sVW9bOTZdPVVvWzc0XT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsdC5yaWdodHRvcF0sWzEsdC5yaWdodGJvdHRvbV0sWzAsdC5sZWZ0dG9wXSxbMCwxXSxbdC50b3BsZWZ0LDFdXX0sVW9bMjRdPVVvWzE0Nl09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLDFdLFsxLHQucmlnaHR0b3BdLFt0LmJvdHRvbXJpZ2h0LDBdLFt0LmJvdHRvbWxlZnQsMF0sW3QudG9wcmlnaHQsMV1dfSxVb1s2XT1Vb1sxNjRdPWZ1bmN0aW9uKHQpe3JldHVybltbMSx0LnJpZ2h0Ym90dG9tXSxbMSwwXSxbdC5ib3R0b21yaWdodCwwXSxbMCx0LmxlZnRib3R0b21dLFswLHQubGVmdHRvcF1dfSxVb1sxMjldPVVvWzQxXT1mdW5jdGlvbih0KXtyZXR1cm5bW3QudG9wcmlnaHQsMV0sW3QuYm90dG9tbGVmdCwwXSxbMCwwXSxbMCx0LmxlZnRib3R0b21dLFt0LnRvcGxlZnQsMV1dfSxVb1s2Nl09VW9bMTA0XT1mdW5jdGlvbih0KXtyZXR1cm5bW3QuYm90dG9tcmlnaHQsMF0sW3QuYm90dG9tbGVmdCwwXSxbMCx0LmxlZnR0b3BdLFswLDFdLFt0LnRvcGxlZnQsMV1dfSxVb1sxNDRdPVVvWzI2XT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsMV0sWzEsdC5yaWdodHRvcF0sWzAsdC5sZWZ0Ym90dG9tXSxbMCx0LmxlZnR0b3BdLFt0LnRvcHJpZ2h0LDFdXX0sVW9bMzZdPVVvWzEzNF09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHRib3R0b21dLFsxLDBdLFt0LmJvdHRvbXJpZ2h0LDBdLFt0LnRvcGxlZnQsMV0sW3QudG9wcmlnaHQsMV1dfSxVb1s5XT1Vb1sxNjFdPWZ1bmN0aW9uKHQpe3JldHVybltbMSx0LnJpZ2h0dG9wXSxbMSx0LnJpZ2h0Ym90dG9tXSxbdC5ib3R0b21sZWZ0LDBdLFswLDBdLFswLHQubGVmdGJvdHRvbV1dfSxVb1szN109VW9bMTMzXT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsdC5yaWdodGJvdHRvbV0sWzEsMF0sWzAsMF0sWzAsdC5sZWZ0Ym90dG9tXSxbdC50b3BsZWZ0LDFdLFt0LnRvcHJpZ2h0LDFdXX0sVW9bMTQ4XT1Vb1syMl09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLDFdLFsxLDBdLFt0LmJvdHRvbXJpZ2h0LDBdLFswLHQubGVmdGJvdHRvbV0sWzAsdC5sZWZ0dG9wXSxbdC50b3ByaWdodCwxXV19LFVvWzgyXT1Vb1s4OF09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLDFdLFsxLHQucmlnaHR0b3BdLFt0LmJvdHRvbXJpZ2h0LDBdLFt0LmJvdHRvbWxlZnQsMF0sWzAsdC5sZWZ0dG9wXSxbMCwxXV19LFVvWzczXT1Vb1s5N109ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHR0b3BdLFsxLHQucmlnaHRib3R0b21dLFt0LmJvdHRvbWxlZnQsMF0sWzAsMF0sWzAsMV0sW3QudG9wbGVmdCwxXV19LFVvWzE0NV09VW9bMjVdPWZ1bmN0aW9uKHQpe3JldHVybltbMSwxXSxbMSx0LnJpZ2h0dG9wXSxbdC5ib3R0b21sZWZ0LDBdLFswLDBdLFswLHQubGVmdGJvdHRvbV0sW3QudG9wcmlnaHQsMV1dfSxVb1s3MF09VW9bMTAwXT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsdC5yaWdodGJvdHRvbV0sWzEsMF0sW3QuYm90dG9tcmlnaHQsMF0sWzAsdC5sZWZ0dG9wXSxbMCwxXSxbdC50b3BsZWZ0LDFdXX0sVW9bMzRdPWZ1bmN0aW9uKHQpe3JldHVybltBbyh0KSxSbyh0KV19LFVvWzM1XT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsdC5yaWdodHRvcF0sWzEsdC5yaWdodGJvdHRvbV0sW3QuYm90dG9tcmlnaHQsMF0sW3QuYm90dG9tbGVmdCwwXSxbMCx0LmxlZnRib3R0b21dLFswLHQubGVmdHRvcF0sW3QudG9wbGVmdCwxXSxbdC50b3ByaWdodCwxXV19LFVvWzEzNl09ZnVuY3Rpb24odCl7cmV0dXJuW1RvKHQpLE9vKHQpXX0sVW9bMTUzXT1mdW5jdGlvbih0KXtyZXR1cm5bTW8odCksQ28odCldfSxVb1sxMDJdPWZ1bmN0aW9uKHQpe3JldHVybltQbyh0KSxMbyh0KV19LFVvWzE1NV09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLDFdLFsxLHQucmlnaHR0b3BdLFt0LmJvdHRvbWxlZnQsMF0sWzAsMF0sWzAsdC5sZWZ0Ym90dG9tXSxbdC50b3ByaWdodCwxXV19LFVvWzEwM109ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHRib3R0b21dLFsxLDBdLFt0LmJvdHRvbXJpZ2h0LDBdLFswLHQubGVmdHRvcF0sWzAsMV0sW3QudG9wbGVmdCwxXV19LFVvWzE1Ml09ZnVuY3Rpb24odCl7cmV0dXJuW01vKHQpLE9vKHQpXX0sVW9bMTU2XT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsMV0sWzEsdC5yaWdodHRvcF0sW3QuYm90dG9tcmlnaHQsMF0sW3QuYm90dG9tbGVmdCwwXSxbMCx0LmxlZnRib3R0b21dLFswLHQubGVmdHRvcF0sW3QudG9wcmlnaHQsMV1dfSxVb1sxMzddPWZ1bmN0aW9uKHQpe3JldHVybltUbyh0KSxDbyh0KV19LFVvWzEzOV09ZnVuY3Rpb24odCl7cmV0dXJuW1sxLHQucmlnaHR0b3BdLFsxLHQucmlnaHRib3R0b21dLFt0LmJvdHRvbWxlZnQsMF0sWzAsMF0sWzAsdC5sZWZ0Ym90dG9tXSxbdC50b3BsZWZ0LDFdLFt0LnRvcHJpZ2h0LDFdXX0sVW9bOThdPWZ1bmN0aW9uKHQpe3JldHVybltSbyh0KSxMbyh0KV19LFVvWzk5XT1mdW5jdGlvbih0KXtyZXR1cm5bWzEsdC5yaWdodHRvcF0sWzEsdC5yaWdodGJvdHRvbV0sW3QuYm90dG9tcmlnaHQsMF0sW3QuYm90dG9tbGVmdCwwXSxbMCx0LmxlZnR0b3BdLFswLDFdLFt0LnRvcGxlZnQsMV1dfSxVb1szOF09ZnVuY3Rpb24odCl7cmV0dXJuW1BvKHQpLEFvKHQpXX0sVW9bMzldPWZ1bmN0aW9uKHQpe3JldHVybltbMSx0LnJpZ2h0Ym90dG9tXSxbMSwwXSxbdC5ib3R0b21yaWdodCwwXSxbMCx0LmxlZnRib3R0b21dLFswLHQubGVmdHRvcF0sW3QudG9wbGVmdCwxXSxbdC50b3ByaWdodCwxXV19O3ZhciB1cz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dGhpcy5pZD10LmJ1aWxkSWQoZSksdGhpcy5jb29yZGluYXRlcz1lLHRoaXMuaW5uZXJFZGdlcz1bXSx0aGlzLm91dGVyRWRnZXM9W10sdGhpcy5vdXRlckVkZ2VzU29ydGVkPSExfXJldHVybiB0LmJ1aWxkSWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuam9pbigiLCIpfSx0LnByb3RvdHlwZS5yZW1vdmVJbm5lckVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5pbm5lckVkZ2VzPXRoaXMuaW5uZXJFZGdlcy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmZyb20uaWQhPT10LmZyb20uaWR9KSl9LHQucHJvdG90eXBlLnJlbW92ZU91dGVyRWRnZT1mdW5jdGlvbih0KXt0aGlzLm91dGVyRWRnZXM9dGhpcy5vdXRlckVkZ2VzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG8uaWQhPT10LnRvLmlkfSkpfSx0LnByb3RvdHlwZS5hZGRPdXRlckVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5vdXRlckVkZ2VzLnB1c2godCksdGhpcy5vdXRlckVkZ2VzU29ydGVkPSExfSx0LnByb3RvdHlwZS5zb3J0T3V0ZXJFZGdlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5vdXRlckVkZ2VzU29ydGVkfHwodGhpcy5vdXRlckVkZ2VzLnNvcnQoKGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS50byxpPW4udG87aWYoci5jb29yZGluYXRlc1swXS10LmNvb3JkaW5hdGVzWzBdPj0wJiZpLmNvb3JkaW5hdGVzWzBdLXQuY29vcmRpbmF0ZXNbMF08MClyZXR1cm4gMTtpZihyLmNvb3JkaW5hdGVzWzBdLXQuY29vcmRpbmF0ZXNbMF08MCYmaS5jb29yZGluYXRlc1swXS10LmNvb3JkaW5hdGVzWzBdPj0wKXJldHVybi0xO2lmKHIuY29vcmRpbmF0ZXNbMF0tdC5jb29yZGluYXRlc1swXT09MCYmaS5jb29yZGluYXRlc1swXS10LmNvb3JkaW5hdGVzWzBdPT0wKXJldHVybiByLmNvb3JkaW5hdGVzWzFdLXQuY29vcmRpbmF0ZXNbMV0+PTB8fGkuY29vcmRpbmF0ZXNbMV0tdC5jb29yZGluYXRlc1sxXT49MD9yLmNvb3JkaW5hdGVzWzFdLWkuY29vcmRpbmF0ZXNbMV06aS5jb29yZGluYXRlc1sxXS1yLmNvb3JkaW5hdGVzWzFdO3ZhciBvPXNzKHQuY29vcmRpbmF0ZXMsci5jb29yZGluYXRlcyxpLmNvb3JkaW5hdGVzKTtyZXR1cm4gbzwwPzE6bz4wPy0xOk1hdGgucG93KHIuY29vcmRpbmF0ZXNbMF0tdC5jb29yZGluYXRlc1swXSwyKStNYXRoLnBvdyhyLmNvb3JkaW5hdGVzWzFdLXQuY29vcmRpbmF0ZXNbMV0sMiktKE1hdGgucG93KGkuY29vcmRpbmF0ZXNbMF0tdC5jb29yZGluYXRlc1swXSwyKStNYXRoLnBvdyhpLmNvb3JkaW5hdGVzWzFdLXQuY29vcmRpbmF0ZXNbMV0sMikpfSkpLHRoaXMub3V0ZXJFZGdlc1NvcnRlZD0hMCl9LHQucHJvdG90eXBlLmdldE91dGVyRWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb3J0T3V0ZXJFZGdlcygpLHRoaXMub3V0ZXJFZGdlc30sdC5wcm90b3R5cGUuZ2V0T3V0ZXJFZGdlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNvcnRPdXRlckVkZ2VzKCksdGhpcy5vdXRlckVkZ2VzW3RdfSx0LnByb3RvdHlwZS5hZGRJbm5lckVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5pbm5lckVkZ2VzLnB1c2godCl9LHR9KCksbHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5mcm9tPXQsdGhpcy50bz1lLHRoaXMubmV4dD12b2lkIDAsdGhpcy5sYWJlbD12b2lkIDAsdGhpcy5zeW1ldHJpYz12b2lkIDAsdGhpcy5yaW5nPXZvaWQgMCx0aGlzLmZyb20uYWRkT3V0ZXJFZGdlKHRoaXMpLHRoaXMudG8uYWRkSW5uZXJFZGdlKHRoaXMpfXJldHVybiB0LnByb3RvdHlwZS5nZXRTeW1ldHJpYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN5bWV0cmljfHwodGhpcy5zeW1ldHJpYz1uZXcgdCh0aGlzLnRvLHRoaXMuZnJvbSksdGhpcy5zeW1ldHJpYy5zeW1ldHJpYz10aGlzKSx0aGlzLnN5bWV0cmljfSx0LnByb3RvdHlwZS5kZWxldGVFZGdlPWZ1bmN0aW9uKCl7dGhpcy5mcm9tLnJlbW92ZU91dGVyRWRnZSh0aGlzKSx0aGlzLnRvLnJlbW92ZUlubmVyRWRnZSh0aGlzKX0sdC5wcm90b3R5cGUuaXNFcXVhbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mcm9tLmlkPT09dC5mcm9tLmlkJiZ0aGlzLnRvLmlkPT09dC50by5pZH0sdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iRWRnZSB7ICIrdGhpcy5mcm9tLmlkKyIgLT4gIit0aGlzLnRvLmlkKyIgfSJ9LHQucHJvdG90eXBlLnRvTGluZVN0cmluZz1mdW5jdGlvbigpe3JldHVybiBoKFt0aGlzLmZyb20uY29vcmRpbmF0ZXMsdGhpcy50by5jb29yZGluYXRlc10pfSx0LnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7cmV0dXJuIHNzKHQuZnJvbS5jb29yZGluYXRlcyx0LnRvLmNvb3JkaW5hdGVzLHRoaXMudG8uY29vcmRpbmF0ZXMpfSx0fSgpLGNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZWRnZXM9W10sdGhpcy5wb2x5Z29uPXZvaWQgMCx0aGlzLmVudmVsb3BlPXZvaWQgMH1yZXR1cm4gdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXt0aGlzLmVkZ2VzLnB1c2godCksdGhpcy5wb2x5Z29uPXRoaXMuZW52ZWxvcGU9dm9pZCAwfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWRnZXNbdF19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibGVuZ3RoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMubGVuZ3RofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dGhpcy5lZGdlcy5mb3JFYWNoKHQpfSx0LnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWRnZXMubWFwKHQpfSx0LnByb3RvdHlwZS5zb21lPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVkZ2VzLnNvbWUodCl9LHQucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdC5wcm90b3R5cGUuaXNIb2xlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuZWRnZXMucmVkdWNlKChmdW5jdGlvbihlLG4scil7cmV0dXJuIG4uZnJvbS5jb29yZGluYXRlc1sxXT50LmVkZ2VzW2VdLmZyb20uY29vcmRpbmF0ZXNbMV0mJihlPXIpLGV9KSwwKSxuPSgwPT09ZT90aGlzLmxlbmd0aDplKS0xLHI9KGUrMSkldGhpcy5sZW5ndGgsaT1zcyh0aGlzLmVkZ2VzW25dLmZyb20uY29vcmRpbmF0ZXMsdGhpcy5lZGdlc1tlXS5mcm9tLmNvb3JkaW5hdGVzLHRoaXMuZWRnZXNbcl0uZnJvbS5jb29yZGluYXRlcyk7cmV0dXJuIDA9PT1pP3RoaXMuZWRnZXNbbl0uZnJvbS5jb29yZGluYXRlc1swXT50aGlzLmVkZ2VzW3JdLmZyb20uY29vcmRpbmF0ZXNbMF06aT4wfSx0LnByb3RvdHlwZS50b011bHRpUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZCh0aGlzLmVkZ2VzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZnJvbS5jb29yZGluYXRlc30pKSl9LHQucHJvdG90eXBlLnRvUG9seWdvbj1mdW5jdGlvbigpe2lmKHRoaXMucG9seWdvbilyZXR1cm4gdGhpcy5wb2x5Z29uO3ZhciB0PXRoaXMuZWRnZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5mcm9tLmNvb3JkaW5hdGVzfSkpO3JldHVybiB0LnB1c2godGhpcy5lZGdlc1swXS5mcm9tLmNvb3JkaW5hdGVzKSx0aGlzLnBvbHlnb249bChbdF0pfSx0LnByb3RvdHlwZS5nZXRFbnZlbG9wZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVudmVsb3BlP3RoaXMuZW52ZWxvcGU6dGhpcy5lbnZlbG9wZT1kbih0aGlzLnRvUG9seWdvbigpKX0sdC5maW5kRWRnZVJpbmdDb250YWluaW5nPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXQuZ2V0RW52ZWxvcGUoKTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbyxzLHUsbCxjLGgscD1lLmdldEVudmVsb3BlKCk7aWYoKHImJihuPXIuZ2V0RW52ZWxvcGUoKSkscz1pLHU9KG89cCkuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFswXX0pKSxsPW8uZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFsxXX0pKSxjPXMuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFswXX0pKSxoPXMuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdFsxXX0pKSxNYXRoLm1heC5hcHBseShudWxsLHUpIT09TWF0aC5tYXguYXBwbHkobnVsbCxjKXx8TWF0aC5tYXguYXBwbHkobnVsbCxsKSE9PU1hdGgubWF4LmFwcGx5KG51bGwsaCl8fE1hdGgubWluLmFwcGx5KG51bGwsdSkhPT1NYXRoLm1pbi5hcHBseShudWxsLGMpfHxNYXRoLm1pbi5hcHBseShudWxsLGwpIT09TWF0aC5taW4uYXBwbHkobnVsbCxoKSkmJmFzKHAsaSkpe2Zvcih2YXIgZj10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZnJvbS5jb29yZGluYXRlc30pKSxnPXZvaWQgMCxkPWZ1bmN0aW9uKHQpe2Uuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIG49dCxyPWUuZnJvbS5jb29yZGluYXRlcyxuWzBdPT09clswXSYmblsxXT09PXJbMV07dmFyIG4scn0pKXx8KGc9dCl9LHk9MCx2PWY7eTx2Lmxlbmd0aDt5Kyspe2Qodlt5XSl9ZyYmZS5pbnNpZGUoYShnKSkmJihyJiYhYXMobixwKXx8KHI9ZSkpfX0pKSxyfSx0LnByb3RvdHlwZS5pbnNpZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHllKHQsdGhpcy50b1BvbHlnb24oKSl9LHR9KCk7dmFyIGhzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZWRnZXM9W10sdGhpcy5ub2Rlcz17fX1yZXR1cm4gdC5mcm9tR2VvSnNvbj1mdW5jdGlvbihlKXshZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJObyBnZW9qc29uIHBhc3NlZCIpO2lmKCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUmJiJHZW9tZXRyeUNvbGxlY3Rpb24iIT09dC50eXBlJiYiTXVsdGlMaW5lU3RyaW5nIiE9PXQudHlwZSYmIkxpbmVTdHJpbmciIT09dC50eXBlJiYiRmVhdHVyZSIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUgJyIrdC50eXBlKyInLiBHZW9qc29uIG11c3QgYmUgRmVhdHVyZUNvbGxlY3Rpb24sIEdlb21ldHJ5Q29sbGVjdGlvbiwgTGluZVN0cmluZywgTXVsdGlMaW5lU3RyaW5nIG9yIEZlYXR1cmUiKX0oZSk7dmFyIG49bmV3IHQ7cmV0dXJuIHooZSwoZnVuY3Rpb24odCl7ZXQodCwiTGluZVN0cmluZyIsIkdyYXBoOjpmcm9tR2VvSnNvbiIpLFQodCwoZnVuY3Rpb24odCxlKXtpZih0KXt2YXIgcj1uLmdldE5vZGUodCksaT1uLmdldE5vZGUoZSk7bi5hZGRFZGdlKHIsaSl9cmV0dXJuIGV9KSl9KSksbn0sdC5wcm90b3R5cGUuZ2V0Tm9kZT1mdW5jdGlvbih0KXt2YXIgZT11cy5idWlsZElkKHQpLG49dGhpcy5ub2Rlc1tlXTtyZXR1cm4gbnx8KG49dGhpcy5ub2Rlc1tlXT1uZXcgdXModCkpLG59LHQucHJvdG90eXBlLmFkZEVkZ2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgbHModCxlKSxyPW4uZ2V0U3ltZXRyaWMoKTt0aGlzLmVkZ2VzLnB1c2gobiksdGhpcy5lZGdlcy5wdXNoKHIpfSx0LnByb3RvdHlwZS5kZWxldGVEYW5nbGVzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztPYmplY3Qua2V5cyh0aGlzLm5vZGVzKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGVzW2VdfSkpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9yZW1vdmVJZkRhbmdsZShlKX0pKX0sdC5wcm90b3R5cGUuX3JlbW92ZUlmRGFuZ2xlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodC5pbm5lckVkZ2VzLmxlbmd0aDw9MSl7dmFyIG49dC5nZXRPdXRlckVkZ2VzKCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC50b30pKTt0aGlzLnJlbW92ZU5vZGUodCksbi5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fcmVtb3ZlSWZEYW5nbGUodCl9KSl9fSx0LnByb3RvdHlwZS5kZWxldGVDdXRFZGdlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fY29tcHV0ZU5leHRDV0VkZ2VzKCksdGhpcy5fZmluZExhYmVsZWRFZGdlUmluZ3MoKSx0aGlzLmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UubGFiZWw9PT1lLnN5bWV0cmljLmxhYmVsJiYodC5yZW1vdmVFZGdlKGUuc3ltZXRyaWMpLHQucmVtb3ZlRWRnZShlKSl9KSl9LHQucHJvdG90eXBlLl9jb21wdXRlTmV4dENXRWRnZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt2b2lkIDA9PT10P09iamVjdC5rZXlzKHRoaXMubm9kZXMpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9jb21wdXRlTmV4dENXRWRnZXMoZS5ub2Rlc1t0XSl9KSk6dC5nZXRPdXRlckVkZ2VzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt0LmdldE91dGVyRWRnZSgoMD09PW4/dC5nZXRPdXRlckVkZ2VzKCkubGVuZ3RoOm4pLTEpLnN5bWV0cmljLm5leHQ9ZX0pKX0sdC5wcm90b3R5cGUuX2NvbXB1dGVOZXh0Q0NXRWRnZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixpPXQuZ2V0T3V0ZXJFZGdlcygpLG89aS5sZW5ndGgtMTtvPj0wOy0tbyl7dmFyIHM9aVtvXSxhPXMuc3ltZXRyaWMsdT12b2lkIDAsbD12b2lkIDA7cy5sYWJlbD09PWUmJih1PXMpLGEubGFiZWw9PT1lJiYobD1hKSx1JiZsJiYobCYmKHI9bCksdSYmKHImJihyLm5leHQ9dSxyPXZvaWQgMCksbnx8KG49dSkpKX1yJiYoci5uZXh0PW4pfSx0LnByb3RvdHlwZS5fZmluZExhYmVsZWRFZGdlUmluZ3M9ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPTA7cmV0dXJuIHRoaXMuZWRnZXMuZm9yRWFjaCgoZnVuY3Rpb24obil7aWYoIShuLmxhYmVsPj0wKSl7dC5wdXNoKG4pO3ZhciByPW47ZG97ci5sYWJlbD1lLHI9ci5uZXh0fXdoaWxlKCFuLmlzRXF1YWwocikpO2UrK319KSksdH0sdC5wcm90b3R5cGUuZ2V0RWRnZVJpbmdzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9jb21wdXRlTmV4dENXRWRnZXMoKSx0aGlzLmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QubGFiZWw9dm9pZCAwfSkpLHRoaXMuX2ZpbmRMYWJlbGVkRWRnZVJpbmdzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5fZmluZEludGVyc2VjdGlvbk5vZGVzKGUpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3QuX2NvbXB1dGVOZXh0Q0NXRWRnZXMobixlLmxhYmVsKX0pKX0pKTt2YXIgZT1bXTtyZXR1cm4gdGhpcy5lZGdlcy5mb3JFYWNoKChmdW5jdGlvbihuKXtuLnJpbmd8fGUucHVzaCh0Ll9maW5kRWRnZVJpbmcobikpfSkpLGV9LHQucHJvdG90eXBlLl9maW5kSW50ZXJzZWN0aW9uTm9kZXM9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj10LHI9ZnVuY3Rpb24oKXt2YXIgcj0wO24uZnJvbS5nZXRPdXRlckVkZ2VzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5sYWJlbD09PXQubGFiZWwmJisrcn0pKSxyPjEmJmUucHVzaChuLmZyb20pLG49bi5uZXh0fTtkb3tyKCl9d2hpbGUoIXQuaXNFcXVhbChuKSk7cmV0dXJuIGV9LHQucHJvdG90eXBlLl9maW5kRWRnZVJpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dCxuPW5ldyBjcztkb3tuLnB1c2goZSksZS5yaW5nPW4sZT1lLm5leHR9d2hpbGUoIXQuaXNFcXVhbChlKSk7cmV0dXJuIG59LHQucHJvdG90eXBlLnJlbW92ZU5vZGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0LmdldE91dGVyRWRnZXMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5yZW1vdmVFZGdlKHQpfSkpLHQuaW5uZXJFZGdlcy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5yZW1vdmVFZGdlKHQpfSkpLGRlbGV0ZSB0aGlzLm5vZGVzW3QuaWRdfSx0LnByb3RvdHlwZS5yZW1vdmVFZGdlPWZ1bmN0aW9uKHQpe3RoaXMuZWRnZXM9dGhpcy5lZGdlcy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiFlLmlzRXF1YWwodCl9KSksdC5kZWxldGVFZGdlKCl9LHR9KCk7ZnVuY3Rpb24gcHModCxlKXt2YXIgbj0hMDtyZXR1cm4geih0LChmdW5jdGlvbih0KXt6KGUsKGZ1bmN0aW9uKGUpe2lmKCExPT09bilyZXR1cm4hMTtuPWZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQudHlwZSl7Y2FzZSJQb2ludCI6c3dpdGNoKGUudHlwZSl7Y2FzZSJQb2ludCI6cmV0dXJuIG49dC5jb29yZGluYXRlcyxyPWUuY29vcmRpbmF0ZXMsIShuWzBdPT09clswXSYmblsxXT09PXJbMV0pO2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIWZzKGUsdCk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4heWUodCxlKX1icmVhaztjYXNlIkxpbmVTdHJpbmciOnN3aXRjaChlLnR5cGUpe2Nhc2UiUG9pbnQiOnJldHVybiFmcyh0LGUpO2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIWZ1bmN0aW9uKHQsZSl7aWYoT3IodCxlKS5mZWF0dXJlcy5sZW5ndGg+MClyZXR1cm4hMDtyZXR1cm4hMX0odCxlKTtjYXNlIlBvbHlnb24iOnJldHVybiFncyhlLHQpfWJyZWFrO2Nhc2UiUG9seWdvbiI6c3dpdGNoKGUudHlwZSl7Y2FzZSJQb2ludCI6cmV0dXJuIXllKGUsdCk7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4hZ3ModCxlKTtjYXNlIlBvbHlnb24iOnJldHVybiFmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9dC5jb29yZGluYXRlc1swXTtuPHIubGVuZ3RoO24rKyl7aWYoeWUocltuXSxlKSlyZXR1cm4hMH1mb3IodmFyIGk9MCxvPWUuY29vcmRpbmF0ZXNbMF07aTxvLmxlbmd0aDtpKyspe2lmKHllKG9baV0sdCkpcmV0dXJuITB9aWYoT3IoSWkodCksSWkoZSkpLmZlYXR1cmVzLmxlbmd0aD4wKXJldHVybiEwO3JldHVybiExfShlLHQpfX12YXIgbixyO3JldHVybiExfSh0Lmdlb21ldHJ5LGUuZ2VvbWV0cnkpfSkpfSkpLG59ZnVuY3Rpb24gZnModCxlKXtmb3IodmFyIG49MDtuPHQuY29vcmRpbmF0ZXMubGVuZ3RoLTE7bisrKWlmKGRzKHQuY29vcmRpbmF0ZXNbbl0sdC5jb29yZGluYXRlc1tuKzFdLGUuY29vcmRpbmF0ZXMpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGdzKHQsZSl7Zm9yKHZhciBuPTAscj1lLmNvb3JkaW5hdGVzO248ci5sZW5ndGg7bisrKXtpZih5ZShyW25dLHQpKXJldHVybiEwfXJldHVybiBPcihlLElpKHQpKS5mZWF0dXJlcy5sZW5ndGg+MH1mdW5jdGlvbiBkcyh0LGUsbil7dmFyIHI9blswXS10WzBdLGk9blsxXS10WzFdLG89ZVswXS10WzBdLHM9ZVsxXS10WzFdO3JldHVybiAwPT1yKnMtaSpvJiYoTWF0aC5hYnMobyk+PU1hdGguYWJzKHMpP28+MD90WzBdPD1uWzBdJiZuWzBdPD1lWzBdOmVbMF08PW5bMF0mJm5bMF08PXRbMF06cz4wP3RbMV08PW5bMV0mJm5bMV08PWVbMV06ZVsxXTw9blsxXSYmblsxXTw9dFsxXSl9ZnVuY3Rpb24geXModCxlKXtyZXR1cm4hKHRbMF0+ZVswXSkmJighKHRbMl08ZVsyXSkmJighKHRbMV0+ZVsxXSkmJiEodFszXTxlWzNdKSkpfWZ1bmN0aW9uIHZzKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX1mdW5jdGlvbiBfcyh0LGUpe3JldHVyblsodFswXStlWzBdKS8yLCh0WzFdK2VbMV0pLzJdfWZ1bmN0aW9uIG1zKHQsZSl7Zm9yKHZhciBuPSExLHI9ITEsaT10LmNvb3JkaW5hdGVzLmxlbmd0aCxvPTA7bzxpJiYhbiYmIXI7KXtmb3IodmFyIHM9MDtzPGUuY29vcmRpbmF0ZXMubGVuZ3RoLTE7cysrKXt2YXIgYT0hMDswIT09cyYmcyE9PWUuY29vcmRpbmF0ZXMubGVuZ3RoLTJ8fChhPSExKSxicyhlLmNvb3JkaW5hdGVzW3NdLGUuY29vcmRpbmF0ZXNbcysxXSx0LmNvb3JkaW5hdGVzW29dLGEpP249ITA6cj0hMH1vKyt9cmV0dXJuIG4mJnJ9ZnVuY3Rpb24geHModCxlKXtyZXR1cm4gT3IodCxOaShlKSkuZmVhdHVyZXMubGVuZ3RoPjB9ZnVuY3Rpb24gRXModCxlKXtmb3IodmFyIG49ITEscj0hMSxpPXQuY29vcmRpbmF0ZXMubGVuZ3RoLG89MDtvPGkmJighbnx8IXIpO28rKyl5ZShhKHQuY29vcmRpbmF0ZXNbb10pLGUpP249ITA6cj0hMDtyZXR1cm4gciYmbn1mdW5jdGlvbiBicyh0LGUsbixyKXt2YXIgaT1uWzBdLXRbMF0sbz1uWzFdLXRbMV0scz1lWzBdLXRbMF0sYT1lWzFdLXRbMV07cmV0dXJuIDA9PWkqYS1vKnMmJihyP01hdGguYWJzKHMpPj1NYXRoLmFicyhhKT9zPjA/dFswXTw9blswXSYmblswXTw9ZVswXTplWzBdPD1uWzBdJiZuWzBdPD10WzBdOmE+MD90WzFdPD1uWzFdJiZuWzFdPD1lWzFdOmVbMV08PW5bMV0mJm5bMV08PXRbMV06TWF0aC5hYnMocyk+PU1hdGguYWJzKGEpP3M+MD90WzBdPG5bMF0mJm5bMF08ZVswXTplWzBdPG5bMF0mJm5bMF08dFswXTphPjA/dFsxXTxuWzFdJiZuWzFdPGVbMV06ZVsxXTxuWzFdJiZuWzFdPHRbMV0pfXZhciB3cz1mdW5jdGlvbih0KXt0aGlzLnByZWNpc2lvbj10JiZ0LnByZWNpc2lvbj90LnByZWNpc2lvbjoxNyx0aGlzLmRpcmVjdGlvbj0hKCF0fHwhdC5kaXJlY3Rpb24pJiZ0LmRpcmVjdGlvbix0aGlzLnBzZXVkb05vZGU9ISghdHx8IXQucHNldWRvTm9kZSkmJnQucHNldWRvTm9kZSx0aGlzLm9iamVjdENvbXBhcmF0b3I9dCYmdC5vYmplY3RDb21wYXJhdG9yP3Qub2JqZWN0Q29tcGFyYXRvcjpTc307ZnVuY3Rpb24gSXModCl7cmV0dXJuIHQuY29vcmRpbmF0ZXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm57dHlwZTp0LnR5cGUucmVwbGFjZSgiTXVsdGkiLCIiKSxjb29yZGluYXRlczplfX0pKX1mdW5jdGlvbiBOcyh0LGUpe3JldHVybiB0Lmhhc093blByb3BlcnR5KCJjb29yZGluYXRlcyIpP3QuY29vcmRpbmF0ZXMubGVuZ3RoPT09ZS5jb29yZGluYXRlcy5sZW5ndGg6dC5sZW5ndGg9PT1lLmxlbmd0aH1mdW5jdGlvbiBTcyh0LGUpe3JldHVybiBGaSh0LGUse3N0cmljdDohMH0pfXdzLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYodC50eXBlIT09ZS50eXBlfHwhTnModCxlKSlyZXR1cm4hMTtzd2l0Y2godC50eXBlKXtjYXNlIlBvaW50IjpyZXR1cm4gdGhpcy5jb21wYXJlQ29vcmQodC5jb29yZGluYXRlcyxlLmNvb3JkaW5hdGVzKTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiB0aGlzLmNvbXBhcmVMaW5lKHQuY29vcmRpbmF0ZXMsZS5jb29yZGluYXRlcywwLCExKTtjYXNlIlBvbHlnb24iOnJldHVybiB0aGlzLmNvbXBhcmVQb2x5Z29uKHQsZSk7Y2FzZSJGZWF0dXJlIjpyZXR1cm4gdGhpcy5jb21wYXJlRmVhdHVyZSh0LGUpO2RlZmF1bHQ6aWYoMD09PXQudHlwZS5pbmRleE9mKCJNdWx0aSIpKXt2YXIgbj10aGlzLHI9SXModCksaT1JcyhlKTtyZXR1cm4gci5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIG4uY29tcGFyZSh0LGUpfSkpfSksaSl9fXJldHVybiExfSx3cy5wcm90b3R5cGUuY29tcGFyZUNvb3JkPWZ1bmN0aW9uKHQsZSl7aWYodC5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25dLnRvRml4ZWQodGhpcy5wcmVjaXNpb24pIT09ZVtuXS50b0ZpeGVkKHRoaXMucHJlY2lzaW9uKSlyZXR1cm4hMTtyZXR1cm4hMH0sd3MucHJvdG90eXBlLmNvbXBhcmVMaW5lPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCFOcyh0LGUpKXJldHVybiExO3ZhciBpPXRoaXMucHNldWRvTm9kZT90OnRoaXMucmVtb3ZlUHNldWRvKHQpLG89dGhpcy5wc2V1ZG9Ob2RlP2U6dGhpcy5yZW1vdmVQc2V1ZG8oZSk7aWYoIXJ8fHRoaXMuY29tcGFyZUNvb3JkKGlbMF0sb1swXSl8fChvPXRoaXMuZml4U3RhcnRJbmRleChvLGkpKSl7dmFyIHM9dGhpcy5jb21wYXJlQ29vcmQoaVtuXSxvW25dKTtyZXR1cm4gdGhpcy5kaXJlY3Rpb258fHM/dGhpcy5jb21wYXJlUGF0aChpLG8pOiEhdGhpcy5jb21wYXJlQ29vcmQoaVtuXSxvW28ubGVuZ3RoLSgxK24pXSkmJnRoaXMuY29tcGFyZVBhdGgoaS5zbGljZSgpLnJldmVyc2UoKSxvKX19LHdzLnByb3RvdHlwZS5maXhTdGFydEluZGV4PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHI9LTEsaT0wO2k8dC5sZW5ndGg7aSsrKWlmKHRoaXMuY29tcGFyZUNvb3JkKHRbaV0sZVswXSkpe3I9aTticmVha31yZXR1cm4gcj49MCYmKG49W10uY29uY2F0KHQuc2xpY2Uocix0Lmxlbmd0aCksdC5zbGljZSgxLHIrMSkpKSxufSx3cy5wcm90b3R5cGUuY29tcGFyZVBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiB0LmV2ZXJ5KChmdW5jdGlvbih0LGUpe3JldHVybiBuLmNvbXBhcmVDb29yZCh0LHRoaXNbZV0pfSksZSl9LHdzLnByb3RvdHlwZS5jb21wYXJlUG9seWdvbj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuY29tcGFyZUxpbmUodC5jb29yZGluYXRlc1swXSxlLmNvb3JkaW5hdGVzWzBdLDEsITApKXt2YXIgbj10LmNvb3JkaW5hdGVzLnNsaWNlKDEsdC5jb29yZGluYXRlcy5sZW5ndGgpLHI9ZS5jb29yZGluYXRlcy5zbGljZSgxLGUuY29vcmRpbmF0ZXMubGVuZ3RoKSxpPXRoaXM7cmV0dXJuIG4uZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBpLmNvbXBhcmVMaW5lKHQsZSwxLCEwKX0pKX0pLHIpfXJldHVybiExfSx3cy5wcm90b3R5cGUuY29tcGFyZUZlYXR1cmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4hKHQuaWQhPT1lLmlkfHwhdGhpcy5vYmplY3RDb21wYXJhdG9yKHQucHJvcGVydGllcyxlLnByb3BlcnRpZXMpfHwhdGhpcy5jb21wYXJlQkJveCh0LGUpKSYmdGhpcy5jb21wYXJlKHQuZ2VvbWV0cnksZS5nZW9tZXRyeSl9LHdzLnByb3RvdHlwZS5jb21wYXJlQkJveD1mdW5jdGlvbih0LGUpe3JldHVybiEhKCF0LmJib3gmJiFlLmJib3h8fHQuYmJveCYmZS5iYm94JiZ0aGlzLmNvbXBhcmVDb29yZCh0LmJib3gsZS5iYm94KSl9LHdzLnByb3RvdHlwZS5yZW1vdmVQc2V1ZG89ZnVuY3Rpb24odCl7cmV0dXJuIHR9O3ZhciBDcz13cztmdW5jdGlvbiBQcyh0LGUpe3ZhciBuPSExO3JldHVybiB6KHQsKGZ1bmN0aW9uKHQpe3ooZSwoZnVuY3Rpb24oZSl7aWYoITA9PT1uKXJldHVybiEwO249IXBzKHQuZ2VvbWV0cnksZS5nZW9tZXRyeSl9KSl9KSksbn12YXIgTXM9QnQoKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlLG4scil7dGhpcy5kYXRhc2V0PVtdLHRoaXMuZXBzaWxvbj0xLHRoaXMubWluUHRzPTIsdGhpcy5kaXN0YW5jZT10aGlzLl9ldWNsaWRlYW5EaXN0YW5jZSx0aGlzLmNsdXN0ZXJzPVtdLHRoaXMubm9pc2U9W10sdGhpcy5fdmlzaXRlZD1bXSx0aGlzLl9hc3NpZ25lZD1bXSx0aGlzLl9kYXRhc2V0TGVuZ3RoPTAsdGhpcy5faW5pdCh0LGUsbixyKX1lLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24odCxlLG4scil7dGhpcy5faW5pdCh0LGUsbixyKTtmb3IodmFyIGk9MDtpPHRoaXMuX2RhdGFzZXRMZW5ndGg7aSsrKWlmKDEhPT10aGlzLl92aXNpdGVkW2ldKXt0aGlzLl92aXNpdGVkW2ldPTE7dmFyIG89dGhpcy5fcmVnaW9uUXVlcnkoaSk7aWYoby5sZW5ndGg8dGhpcy5taW5QdHMpdGhpcy5ub2lzZS5wdXNoKGkpO2Vsc2V7dmFyIHM9dGhpcy5jbHVzdGVycy5sZW5ndGg7dGhpcy5jbHVzdGVycy5wdXNoKFtdKSx0aGlzLl9hZGRUb0NsdXN0ZXIoaSxzKSx0aGlzLl9leHBhbmRDbHVzdGVyKHMsbyl9fXJldHVybiB0aGlzLmNsdXN0ZXJzfSxlLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbixyKXtpZih0KXtpZighKHQgaW5zdGFuY2VvZiBBcnJheSkpdGhyb3cgRXJyb3IoIkRhdGFzZXQgbXVzdCBiZSBvZiB0eXBlIGFycmF5LCAiK3R5cGVvZiB0KyIgZ2l2ZW4iKTt0aGlzLmRhdGFzZXQ9dCx0aGlzLmNsdXN0ZXJzPVtdLHRoaXMubm9pc2U9W10sdGhpcy5fZGF0YXNldExlbmd0aD10Lmxlbmd0aCx0aGlzLl92aXNpdGVkPW5ldyBBcnJheSh0aGlzLl9kYXRhc2V0TGVuZ3RoKSx0aGlzLl9hc3NpZ25lZD1uZXcgQXJyYXkodGhpcy5fZGF0YXNldExlbmd0aCl9ZSYmKHRoaXMuZXBzaWxvbj1lKSxuJiYodGhpcy5taW5QdHM9biksciYmKHRoaXMuZGlzdGFuY2U9cil9LGUucHJvdG90eXBlLl9leHBhbmRDbHVzdGVyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07aWYoMSE9PXRoaXMuX3Zpc2l0ZWRbcl0pe3RoaXMuX3Zpc2l0ZWRbcl09MTt2YXIgaT10aGlzLl9yZWdpb25RdWVyeShyKTtpLmxlbmd0aD49dGhpcy5taW5QdHMmJihlPXRoaXMuX21lcmdlQXJyYXlzKGUsaSkpfTEhPT10aGlzLl9hc3NpZ25lZFtyXSYmdGhpcy5fYWRkVG9DbHVzdGVyKHIsdCl9fSxlLnByb3RvdHlwZS5fYWRkVG9DbHVzdGVyPWZ1bmN0aW9uKHQsZSl7dGhpcy5jbHVzdGVyc1tlXS5wdXNoKHQpLHRoaXMuX2Fzc2lnbmVkW3RdPTF9LGUucHJvdG90eXBlLl9yZWdpb25RdWVyeT1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dGhpcy5fZGF0YXNldExlbmd0aDtuKyspe3RoaXMuZGlzdGFuY2UodGhpcy5kYXRhc2V0W3RdLHRoaXMuZGF0YXNldFtuXSk8dGhpcy5lcHNpbG9uJiZlLnB1c2gobil9cmV0dXJuIGV9LGUucHJvdG90eXBlLl9tZXJnZUFycmF5cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLmxlbmd0aCxyPTA7cjxuO3IrKyl7dmFyIGk9ZVtyXTt0LmluZGV4T2YoaSk8MCYmdC5wdXNoKGkpfXJldHVybiB0fSxlLnByb3RvdHlwZS5fZXVjbGlkZWFuRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKTtyLS07KW4rPSh0W3JdLWVbcl0pKih0W3JdLWVbcl0pO3JldHVybiBNYXRoLnNxcnQobil9LHQuZXhwb3J0cyYmKHQuZXhwb3J0cz1lKX0pKSxMcz1CdCgoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsbil7dGhpcy5rPTMsdGhpcy5kYXRhc2V0PVtdLHRoaXMuYXNzaWdubWVudHM9W10sdGhpcy5jZW50cm9pZHM9W10sdGhpcy5pbml0KHQsZSxuKX1lLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmFzc2lnbm1lbnRzPVtdLHRoaXMuY2VudHJvaWRzPVtdLHZvaWQgMCE9PXQmJih0aGlzLmRhdGFzZXQ9dCksdm9pZCAwIT09ZSYmKHRoaXMuaz1lKSx2b2lkIDAhPT1uJiYodGhpcy5kaXN0YW5jZT1uKX0sZS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKHQsZSl7dGhpcy5pbml0KHQsZSk7Zm9yKHZhciBuPXRoaXMuZGF0YXNldC5sZW5ndGgscj0wO3I8dGhpcy5rO3IrKyl0aGlzLmNlbnRyb2lkc1tyXT10aGlzLnJhbmRvbUNlbnRyb2lkKCk7Zm9yKHZhciBpPSEwO2k7KXtpPXRoaXMuYXNzaWduKCk7Zm9yKHZhciBvPTA7bzx0aGlzLms7bysrKXtmb3IodmFyIHM9bmV3IEFycmF5KGMpLGE9MCx1PTA7dTxjO3UrKylzW3VdPTA7Zm9yKHZhciBsPTA7bDxuO2wrKyl7dmFyIGM9dGhpcy5kYXRhc2V0W2xdLmxlbmd0aDtpZihvPT09dGhpcy5hc3NpZ25tZW50c1tsXSl7Zm9yKHU9MDt1PGM7dSsrKXNbdV0rPXRoaXMuZGF0YXNldFtsXVt1XTthKyt9fWlmKGE+MCl7Zm9yKHU9MDt1PGM7dSsrKXNbdV0vPWE7dGhpcy5jZW50cm9pZHNbb109c31lbHNlIHRoaXMuY2VudHJvaWRzW29dPXRoaXMucmFuZG9tQ2VudHJvaWQoKSxpPSEwfX1yZXR1cm4gdGhpcy5nZXRDbHVzdGVycygpfSxlLnByb3RvdHlwZS5yYW5kb21DZW50cm9pZD1mdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLmRhdGFzZXQubGVuZ3RoLTE7ZG97ZT1NYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqbiksdD10aGlzLmRhdGFzZXRbZV19d2hpbGUodGhpcy5jZW50cm9pZHMuaW5kZXhPZih0KT49MCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmFzc2lnbj1mdW5jdGlvbigpe2Zvcih2YXIgdCxlPSExLG49dGhpcy5kYXRhc2V0Lmxlbmd0aCxyPTA7cjxuO3IrKykodD10aGlzLmFyZ21pbih0aGlzLmRhdGFzZXRbcl0sdGhpcy5jZW50cm9pZHMsdGhpcy5kaXN0YW5jZSkpIT10aGlzLmFzc2lnbm1lbnRzW3JdJiYodGhpcy5hc3NpZ25tZW50c1tyXT10LGU9ITApO3JldHVybiBlfSxlLnByb3RvdHlwZS5nZXRDbHVzdGVycz1mdW5jdGlvbigpe2Zvcih2YXIgdCxlPW5ldyBBcnJheSh0aGlzLmspLG49MDtuPHRoaXMuYXNzaWdubWVudHMubGVuZ3RoO24rKyl2b2lkIDA9PT1lW3Q9dGhpcy5hc3NpZ25tZW50c1tuXV0mJihlW3RdPVtdKSxlW3RdLnB1c2gobik7cmV0dXJuIGV9LGUucHJvdG90eXBlLmFyZ21pbj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGk9TnVtYmVyLk1BWF9WQUxVRSxvPTAscz1lLmxlbmd0aCxhPTA7YTxzO2ErKykocj1uKHQsZVthXSkpPGkmJihpPXIsbz1hKTtyZXR1cm4gb30sZS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKTtyLS07KXt2YXIgaT10W3JdLWVbcl07bis9aSppfXJldHVybiBNYXRoLnNxcnQobil9LHQuZXhwb3J0cyYmKHQuZXhwb3J0cz1lKX0pKSxPcz1CdCgoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsbil7dGhpcy5fcXVldWU9W10sdGhpcy5fcHJpb3JpdGllcz1bXSx0aGlzLl9zb3J0aW5nPSJkZXNjIix0aGlzLl9pbml0KHQsZSxuKX1lLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5fcXVldWUubGVuZ3RoLHI9bjtyLS07KXt2YXIgaT10aGlzLl9wcmlvcml0aWVzW3JdOyJkZXNjIj09PXRoaXMuX3NvcnRpbmc/ZT5pJiYobj1yKTplPGkmJihuPXIpfXRoaXMuX2luc2VydEF0KHQsZSxuKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9xdWV1ZS5sZW5ndGg7ZS0tOyl7aWYodD09PXRoaXMuX3F1ZXVlW2VdKXt0aGlzLl9xdWV1ZS5zcGxpY2UoZSwxKSx0aGlzLl9wcmlvcml0aWVzLnNwbGljZShlLDEpO2JyZWFrfX19LGUucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dGhpcy5fcXVldWUuZm9yRWFjaCh0KX0sZS5wcm90b3R5cGUuZ2V0RWxlbWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcXVldWV9LGUucHJvdG90eXBlLmdldEVsZW1lbnRQcmlvcml0eT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHJpb3JpdGllc1t0XX0sZS5wcm90b3R5cGUuZ2V0UHJpb3JpdGllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmlvcml0aWVzfSxlLnByb3RvdHlwZS5nZXRFbGVtZW50c1dpdGhQcmlvcml0aWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX3F1ZXVlLmxlbmd0aDtlPG47ZSsrKXQucHVzaChbdGhpcy5fcXVldWVbZV0sdGhpcy5fcHJpb3JpdGllc1tlXV0pO3JldHVybiB0fSxlLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbil7aWYodCYmZSl7aWYodGhpcy5fcXVldWU9W10sdGhpcy5fcHJpb3JpdGllcz1bXSx0Lmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl0aGlzLmluc2VydCh0W3JdLGVbcl0pfW4mJih0aGlzLl9zb3J0aW5nPW4pfSxlLnByb3RvdHlwZS5faW5zZXJ0QXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX3F1ZXVlLmxlbmd0aD09PW4/KHRoaXMuX3F1ZXVlLnB1c2godCksdGhpcy5fcHJpb3JpdGllcy5wdXNoKGUpKToodGhpcy5fcXVldWUuc3BsaWNlKG4sMCx0KSx0aGlzLl9wcmlvcml0aWVzLnNwbGljZShuLDAsZSkpfSx0LmV4cG9ydHMmJih0LmV4cG9ydHM9ZSl9KSksUnM9QnQoKGZ1bmN0aW9uKHQpe2lmKHQuZXhwb3J0cyl2YXIgZT1PcztmdW5jdGlvbiBuKHQsZSxuLHIpe3RoaXMuZXBzaWxvbj0xLHRoaXMubWluUHRzPTEsdGhpcy5kaXN0YW5jZT10aGlzLl9ldWNsaWRlYW5EaXN0YW5jZSx0aGlzLl9yZWFjaGFiaWxpdHk9W10sdGhpcy5fcHJvY2Vzc2VkPVtdLHRoaXMuX2NvcmVEaXN0YW5jZT0wLHRoaXMuX29yZGVyZWRMaXN0PVtdLHRoaXMuX2luaXQodCxlLG4scil9bi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKHQsbixyLGkpe3RoaXMuX2luaXQodCxuLHIsaSk7Zm9yKHZhciBvPTAscz10aGlzLmRhdGFzZXQubGVuZ3RoO288cztvKyspaWYoMSE9PXRoaXMuX3Byb2Nlc3NlZFtvXSl7dGhpcy5fcHJvY2Vzc2VkW29dPTEsdGhpcy5jbHVzdGVycy5wdXNoKFtvXSk7dmFyIGE9dGhpcy5jbHVzdGVycy5sZW5ndGgtMTt0aGlzLl9vcmRlcmVkTGlzdC5wdXNoKG8pO3ZhciB1PW5ldyBlKG51bGwsbnVsbCwiYXNjIiksbD10aGlzLl9yZWdpb25RdWVyeShvKTt2b2lkIDAhPT10aGlzLl9kaXN0YW5jZVRvQ29yZShvKSYmKHRoaXMuX3VwZGF0ZVF1ZXVlKG8sbCx1KSx0aGlzLl9leHBhbmRDbHVzdGVyKGEsdSkpfXJldHVybiB0aGlzLmNsdXN0ZXJzfSxuLnByb3RvdHlwZS5nZXRSZWFjaGFiaWxpdHlQbG90PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX29yZGVyZWRMaXN0Lmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9vcmRlcmVkTGlzdFtlXSxpPXRoaXMuX3JlYWNoYWJpbGl0eVtyXTt0LnB1c2goW3IsaV0pfXJldHVybiB0fSxuLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbixyKXtpZih0KXtpZighKHQgaW5zdGFuY2VvZiBBcnJheSkpdGhyb3cgRXJyb3IoIkRhdGFzZXQgbXVzdCBiZSBvZiB0eXBlIGFycmF5LCAiK3R5cGVvZiB0KyIgZ2l2ZW4iKTt0aGlzLmRhdGFzZXQ9dCx0aGlzLmNsdXN0ZXJzPVtdLHRoaXMuX3JlYWNoYWJpbGl0eT1uZXcgQXJyYXkodGhpcy5kYXRhc2V0Lmxlbmd0aCksdGhpcy5fcHJvY2Vzc2VkPW5ldyBBcnJheSh0aGlzLmRhdGFzZXQubGVuZ3RoKSx0aGlzLl9jb3JlRGlzdGFuY2U9MCx0aGlzLl9vcmRlcmVkTGlzdD1bXX1lJiYodGhpcy5lcHNpbG9uPWUpLG4mJih0aGlzLm1pblB0cz1uKSxyJiYodGhpcy5kaXN0YW5jZT1yKX0sbi5wcm90b3R5cGUuX3VwZGF0ZVF1ZXVlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO3RoaXMuX2NvcmVEaXN0YW5jZT10aGlzLl9kaXN0YW5jZVRvQ29yZSh0KSxlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PXIuX3Byb2Nlc3NlZFtlXSl7dmFyIGk9ci5kaXN0YW5jZShyLmRhdGFzZXRbdF0sci5kYXRhc2V0W2VdKSxvPU1hdGgubWF4KHIuX2NvcmVEaXN0YW5jZSxpKTt2b2lkIDA9PT1yLl9yZWFjaGFiaWxpdHlbZV0/KHIuX3JlYWNoYWJpbGl0eVtlXT1vLG4uaW5zZXJ0KGUsbykpOm88ci5fcmVhY2hhYmlsaXR5W2VdJiYoci5fcmVhY2hhYmlsaXR5W2VdPW8sbi5yZW1vdmUoZSksbi5pbnNlcnQoZSxvKSl9fSkpfSxuLnByb3RvdHlwZS5fZXhwYW5kQ2x1c3Rlcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLmdldEVsZW1lbnRzKCkscj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7dmFyIG89bltyXTtpZih2b2lkIDA9PT10aGlzLl9wcm9jZXNzZWRbb10pe3ZhciBzPXRoaXMuX3JlZ2lvblF1ZXJ5KG8pO3RoaXMuX3Byb2Nlc3NlZFtvXT0xLHRoaXMuY2x1c3RlcnNbdF0ucHVzaChvKSx0aGlzLl9vcmRlcmVkTGlzdC5wdXNoKG8pLHZvaWQgMCE9PXRoaXMuX2Rpc3RhbmNlVG9Db3JlKG8pJiYodGhpcy5fdXBkYXRlUXVldWUobyxzLGUpLHRoaXMuX2V4cGFuZENsdXN0ZXIodCxlKSl9fX0sbi5wcm90b3R5cGUuX2Rpc3RhbmNlVG9Db3JlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmVwc2lsb24sbj0wO248ZTtuKyspe2lmKHRoaXMuX3JlZ2lvblF1ZXJ5KHQsbikubGVuZ3RoPj10aGlzLm1pblB0cylyZXR1cm4gbn19LG4ucHJvdG90eXBlLl9yZWdpb25RdWVyeT1mdW5jdGlvbih0LGUpe2U9ZXx8dGhpcy5lcHNpbG9uO2Zvcih2YXIgbj1bXSxyPTAsaT10aGlzLmRhdGFzZXQubGVuZ3RoO3I8aTtyKyspdGhpcy5kaXN0YW5jZSh0aGlzLmRhdGFzZXRbdF0sdGhpcy5kYXRhc2V0W3JdKTxlJiZuLnB1c2gocik7cmV0dXJuIG59LG4ucHJvdG90eXBlLl9ldWNsaWRlYW5EaXN0YW5jZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpO3ItLTspbis9KHRbcl0tZVtyXSkqKHRbcl0tZVtyXSk7cmV0dXJuIE1hdGguc3FydChuKX0sdC5leHBvcnRzJiYodC5leHBvcnRzPW4pfSkpLFRzPUJ0KChmdW5jdGlvbih0KXt0LmV4cG9ydHMmJih0LmV4cG9ydHM9e0RCU0NBTjpNcyxLTUVBTlM6THMsT1BUSUNTOlJzLFByaW9yaXR5UXVldWU6T3N9KX0pKTt2YXIgQXM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10Lmxlbmd0aCxpPTAsbz0wO288cjtvKyspe3ZhciBzPSh0W29dfHwwKS0oZVtvXXx8MCk7aSs9cypzfXJldHVybiBuP01hdGguc3FydChpKTppfSxEcz1BcyxGcz1mdW5jdGlvbih0LGUsbil7dmFyIHI9TWF0aC5hYnModC1lKTtyZXR1cm4gbj9yOnIqcn0sa3M9QXMsR3M9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49e30scj1bXSxpPWU8PDIsbz10Lmxlbmd0aCxzPXRbMF0ubGVuZ3RoPjA7ci5sZW5ndGg8ZSYmaS0tID4wOyl7dmFyIGE9dFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbyldLHU9cz9hLmpvaW4oIl8iKToiIithO25bdV18fChuW3VdPSEwLHIucHVzaChhKSl9aWYoci5sZW5ndGg8ZSl0aHJvdyBuZXcgRXJyb3IoIkVycm9yIGluaXRpYWxpemF0aW5nIGNsdXN0ZXJzIik7cmV0dXJuIHJ9LHFzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dFswXS5sZW5ndGg/RHM6RnMscj1bXSxpPXQubGVuZ3RoLG89dFswXS5sZW5ndGg+MCxzPXRbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmkpXTtvJiZzLmpvaW4oIl8iKTtmb3Ioci5wdXNoKHMpO3IubGVuZ3RoPGU7KXtmb3IodmFyIGE9W10sdT1yLmxlbmd0aCxsPTAsYz1bXSxoPTA7aDxpO2grKyl7Zm9yKHZhciBwPTEvMCxmPTA7Zjx1O2YrKyl7dmFyIGc9bih0W2hdLHJbZl0pO2c8PXAmJihwPWcpfWFbaF09cH1mb3IodmFyIGQ9MDtkPGk7ZCsrKWwrPWFbZF07Zm9yKHZhciB5PTA7eTxpO3krKyljW3ldPXtpOnksdjp0W3ldLHByOmFbeV0vbCxjczowfTtjLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucHItZS5wcn0pKSxjWzBdLmNzPWNbMF0ucHI7Zm9yKHZhciB2PTE7djxpO3YrKyljW3ZdLmNzPWNbdi0xXS5jcytjW3ZdLnByO2Zvcih2YXIgXz1NYXRoLnJhbmRvbSgpLG09MDttPGktMSYmY1ttKytdLmNzPF87KTtyLnB1c2goY1ttLTFdLnYpfXJldHVybiByfTtmdW5jdGlvbiBCcyh0LGUsbil7bj1ufHxbXTtmb3IodmFyIHI9MDtyPHQ7cisrKW5bcl09ZTtyZXR1cm4gbn12YXIgenM9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9W10sbz1bXSxzPVtdLGE9W10sdT0hMSxsPXJ8fDFlNCxjPXQubGVuZ3RoLGg9dFswXS5sZW5ndGgscD1oPjAsZj1bXTtpZihuKWk9ImttcmFuZCI9PW4/R3ModCxlKToia21wcCI9PW4/cXModCxlKTpuO2Vsc2UgZm9yKHZhciBnPXt9O2kubGVuZ3RoPGU7KXt2YXIgZD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYyk7Z1tkXXx8KGdbZF09ITAsaS5wdXNoKHRbZF0pKX1kb3tCcyhlLDAsZik7Zm9yKHZhciB5PTA7eTxjO3krKyl7Zm9yKHZhciB2PTEvMCxfPTAsbT0wO208ZTttKyspeyhhPXA/a3ModFt5XSxpW21dKTpNYXRoLmFicyh0W3ldLWlbbV0pKTw9diYmKHY9YSxfPW0pfXNbeV09XyxmW19dKyt9Zm9yKHZhciB4PVtdLEU9KG89W10sMCk7RTxlO0UrKyl4W0VdPXA/QnMoaCwwLHhbRV0pOjAsb1tFXT1pW0VdO2lmKHApe2Zvcih2YXIgYj0wO2I8ZTtiKyspaVtiXT1bXTtmb3IodmFyIHc9MDt3PGM7dysrKWZvcih2YXIgST14W3Nbd11dLE49dFt3XSxTPTA7UzxoO1MrKylJW1NdKz1OW1NdO3U9ITA7Zm9yKHZhciBDPTA7QzxlO0MrKyl7Zm9yKHZhciBQPWlbQ10sTT14W0NdLEw9b1tDXSxPPWZbQ10sUj0wO1I8aDtSKyspUFtSXT1NW1JdL098fDA7aWYodSlmb3IodmFyIFQ9MDtUPGg7VCsrKWlmKExbVF0hPVBbVF0pe3U9ITE7YnJlYWt9fX1lbHNle2Zvcih2YXIgQT0wO0E8YztBKyspe3hbc1tBXV0rPXRbQV19Zm9yKHZhciBEPTA7RDxlO0QrKylpW0RdPXhbRF0vZltEXXx8MDt1PSEwO2Zvcih2YXIgRj0wO0Y8ZTtGKyspaWYob1tGXSE9aVtGXSl7dT0hMTticmVha319dT11fHwtLWw8PTB9d2hpbGUoIXUpO3JldHVybntpdDoxZTQtbCxrOmUsaWR4czpzLGNlbnRyb2lkczppfX07ZnVuY3Rpb24ganModCxlKXtyZXR1cm4gYihCaSh0WzBdLHRbMV0pKT09PWIoQmkoZVswXSxlWzFdKSl9ZnVuY3Rpb24gVXModCxlKXtpZih0Lmdlb21ldHJ5JiZ0Lmdlb21ldHJ5LnR5cGUpcmV0dXJuIHQuZ2VvbWV0cnkudHlwZTtpZih0LnR5cGUpcmV0dXJuIHQudHlwZTt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgR2VvSlNPTiBvYmplY3QgZm9yICIrZSl9ZnVuY3Rpb24gVnModCl7Zm9yKHZhciBlPXQsbj1bXTtlLnBhcmVudDspbi51bnNoaWZ0KGUpLGU9ZS5wYXJlbnQ7cmV0dXJuIG59dmFyIFhzPXtzZWFyY2g6ZnVuY3Rpb24odCxlLG4scil7dC5jbGVhbkRpcnR5KCk7dmFyIGk9KHI9cnx8e30pLmhldXJpc3RpY3x8WHMuaGV1cmlzdGljcy5tYW5oYXR0YW4sbz1yLmNsb3Nlc3R8fCExLHM9bmV3IFdzKChmdW5jdGlvbih0KXtyZXR1cm4gdC5mfSkpLGE9ZTtmb3IoZS5oPWkoZSxuKSxzLnB1c2goZSk7cy5zaXplKCk+MDspe3ZhciB1PXMucG9wKCk7aWYodT09PW4pcmV0dXJuIFZzKHUpO3UuY2xvc2VkPSEwO2Zvcih2YXIgbD10Lm5laWdoYm9ycyh1KSxjPTAsaD1sLmxlbmd0aDtjPGg7KytjKXt2YXIgcD1sW2NdO2lmKCFwLmNsb3NlZCYmIXAuaXNXYWxsKCkpe3ZhciBmPXUuZytwLmdldENvc3QodSksZz1wLnZpc2l0ZWQ7KCFnfHxmPHAuZykmJihwLnZpc2l0ZWQ9ITAscC5wYXJlbnQ9dSxwLmg9cC5ofHxpKHAsbikscC5nPWYscC5mPXAuZytwLmgsdC5tYXJrRGlydHkocCksbyYmKHAuaDxhLmh8fHAuaD09PWEuaCYmcC5nPGEuZykmJihhPXApLGc/cy5yZXNjb3JlRWxlbWVudChwKTpzLnB1c2gocCkpfX19cmV0dXJuIG8/VnMoYSk6W119LGhldXJpc3RpY3M6e21hbmhhdHRhbjpmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLmFicyhlLngtdC54KStNYXRoLmFicyhlLnktdC55KX0sZGlhZ29uYWw6ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNxcnQoMikscj1NYXRoLmFicyhlLngtdC54KSxpPU1hdGguYWJzKGUueS10LnkpO3JldHVybiAxKihyK2kpKyhuLTIpKk1hdGgubWluKHIsaSl9fSxjbGVhbk5vZGU6ZnVuY3Rpb24odCl7dC5mPTAsdC5nPTAsdC5oPTAsdC52aXNpdGVkPSExLHQuY2xvc2VkPSExLHQucGFyZW50PW51bGx9fTtmdW5jdGlvbiBZcyh0LGUpe2U9ZXx8e30sdGhpcy5ub2Rlcz1bXSx0aGlzLmRpYWdvbmFsPSEhZS5kaWFnb25hbCx0aGlzLmdyaWQ9W107Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3RoaXMuZ3JpZFtuXT1bXTtmb3IodmFyIHI9MCxpPXRbbl07cjxpLmxlbmd0aDtyKyspe3ZhciBvPW5ldyBIcyhuLHIsaVtyXSk7dGhpcy5ncmlkW25dW3JdPW8sdGhpcy5ub2Rlcy5wdXNoKG8pfX10aGlzLmluaXQoKX1mdW5jdGlvbiBIcyh0LGUsbil7dGhpcy54PXQsdGhpcy55PWUsdGhpcy53ZWlnaHQ9bn1mdW5jdGlvbiBXcyh0KXt0aGlzLmNvbnRlbnQ9W10sdGhpcy5zY29yZUZ1bmN0aW9uPXR9ZnVuY3Rpb24gSnModCxlKXtmb3IodmFyIG49MDtuPGUuZmVhdHVyZXMubGVuZ3RoO24rKylpZih5ZSh0LGUuZmVhdHVyZXNbbl0pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIFpzKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBLcyh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBRcyh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiAkcygpe3RoaXMuXz1udWxsfWZ1bmN0aW9uIHRhKHQpe3QuVT10LkM9dC5MPXQuUj10LlA9dC5OPW51bGx9ZnVuY3Rpb24gZWEodCxlKXt2YXIgbj1lLHI9ZS5SLGk9bi5VO2k/aS5MPT09bj9pLkw9cjppLlI9cjp0Ll89cixyLlU9aSxuLlU9cixuLlI9ci5MLG4uUiYmKG4uUi5VPW4pLHIuTD1ufWZ1bmN0aW9uIG5hKHQsZSl7dmFyIG49ZSxyPWUuTCxpPW4uVTtpP2kuTD09PW4/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksbi5VPXIsbi5MPXIuUixuLkwmJihuLkwuVT1uKSxyLlI9bn1mdW5jdGlvbiByYSh0KXtmb3IoO3QuTDspdD10Lkw7cmV0dXJuIHR9ZnVuY3Rpb24gaWEodCxlLG4scil7dmFyIGk9W251bGwsbnVsbF0sbz1QYS5wdXNoKGkpLTE7cmV0dXJuIGkubGVmdD10LGkucmlnaHQ9ZSxuJiZzYShpLHQsZSxuKSxyJiZzYShpLGUsdCxyKSxTYVt0LmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxTYVtlLmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxpfWZ1bmN0aW9uIG9hKHQsZSxuKXt2YXIgcj1bZSxuXTtyZXR1cm4gci5sZWZ0PXQscn1mdW5jdGlvbiBzYSh0LGUsbixyKXt0WzBdfHx0WzFdP3QubGVmdD09PW4/dFsxXT1yOnRbMF09cjoodFswXT1yLHQubGVmdD1lLHQucmlnaHQ9bil9ZnVuY3Rpb24gYWEodCxlLG4scixpKXt2YXIgbyxzPXRbMF0sYT10WzFdLHU9c1swXSxsPXNbMV0sYz0wLGg9MSxwPWFbMF0tdSxmPWFbMV0tbDtpZihvPWUtdSxwfHwhKG8+MCkpe2lmKG8vPXAscDwwKXtpZihvPGMpcmV0dXJuO288aCYmKGg9byl9ZWxzZSBpZihwPjApe2lmKG8+aClyZXR1cm47bz5jJiYoYz1vKX1pZihvPXItdSxwfHwhKG88MCkpe2lmKG8vPXAscDwwKXtpZihvPmgpcmV0dXJuO28+YyYmKGM9byl9ZWxzZSBpZihwPjApe2lmKG88YylyZXR1cm47bzxoJiYoaD1vKX1pZihvPW4tbCxmfHwhKG8+MCkpe2lmKG8vPWYsZjwwKXtpZihvPGMpcmV0dXJuO288aCYmKGg9byl9ZWxzZSBpZihmPjApe2lmKG8+aClyZXR1cm47bz5jJiYoYz1vKX1pZihvPWktbCxmfHwhKG88MCkpe2lmKG8vPWYsZjwwKXtpZihvPmgpcmV0dXJuO28+YyYmKGM9byl9ZWxzZSBpZihmPjApe2lmKG88YylyZXR1cm47bzxoJiYoaD1vKX1yZXR1cm4hKGM+MHx8aDwxKXx8KGM+MCYmKHRbMF09W3UrYypwLGwrYypmXSksaDwxJiYodFsxXT1bdStoKnAsbCtoKmZdKSwhMCl9fX19fWZ1bmN0aW9uIHVhKHQsZSxuLHIsaSl7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciBzLGEsdT10WzBdLGw9dC5sZWZ0LGM9dC5yaWdodCxoPWxbMF0scD1sWzFdLGY9Y1swXSxnPWNbMV0sZD0oaCtmKS8yLHk9KHArZykvMjtpZihnPT09cCl7aWYoZDxlfHxkPj1yKXJldHVybjtpZihoPmYpe2lmKHUpe2lmKHVbMV0+PWkpcmV0dXJufWVsc2UgdT1bZCxuXTtvPVtkLGldfWVsc2V7aWYodSl7aWYodVsxXTxuKXJldHVybn1lbHNlIHU9W2QsaV07bz1bZCxuXX19ZWxzZSBpZihhPXktKHM9KGgtZikvKGctcCkpKmQsczwtMXx8cz4xKWlmKGg+Zil7aWYodSl7aWYodVsxXT49aSlyZXR1cm59ZWxzZSB1PVsobi1hKS9zLG5dO289WyhpLWEpL3MsaV19ZWxzZXtpZih1KXtpZih1WzFdPG4pcmV0dXJufWVsc2UgdT1bKGktYSkvcyxpXTtvPVsobi1hKS9zLG5dfWVsc2UgaWYocDxnKXtpZih1KXtpZih1WzBdPj1yKXJldHVybn1lbHNlIHU9W2UscyplK2FdO289W3IscypyK2FdfWVsc2V7aWYodSl7aWYodVswXTxlKXJldHVybn1lbHNlIHU9W3IscypyK2FdO289W2UscyplK2FdfXJldHVybiB0WzBdPXUsdFsxXT1vLCEwfWZ1bmN0aW9uIGxhKHQsZSl7dmFyIG49dC5zaXRlLHI9ZS5sZWZ0LGk9ZS5yaWdodDtyZXR1cm4gbj09PWkmJihpPXIscj1uKSxpP01hdGguYXRhbjIoaVsxXS1yWzFdLGlbMF0tclswXSk6KG49PT1yPyhyPWVbMV0saT1lWzBdKToocj1lWzBdLGk9ZVsxXSksTWF0aC5hdGFuMihyWzBdLWlbMF0saVsxXS1yWzFdKSl9ZnVuY3Rpb24gY2EodCxlKXtyZXR1cm4gZVsrKGUubGVmdCE9PXQuc2l0ZSldfWZ1bmN0aW9uIGhhKHQsZSl7cmV0dXJuIGVbKyhlLmxlZnQ9PT10LnNpdGUpXX1Zcy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuZGlydHlOb2Rlcz1bXTtmb3IodmFyIHQ9MDt0PHRoaXMubm9kZXMubGVuZ3RoO3QrKylYcy5jbGVhbk5vZGUodGhpcy5ub2Rlc1t0XSl9LFlzLnByb3RvdHlwZS5jbGVhbkRpcnR5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLmRpcnR5Tm9kZXMubGVuZ3RoO3QrKylYcy5jbGVhbk5vZGUodGhpcy5kaXJ0eU5vZGVzW3RdKTt0aGlzLmRpcnR5Tm9kZXM9W119LFlzLnByb3RvdHlwZS5tYXJrRGlydHk9ZnVuY3Rpb24odCl7dGhpcy5kaXJ0eU5vZGVzLnB1c2godCl9LFlzLnByb3RvdHlwZS5uZWlnaGJvcnM9ZnVuY3Rpb24odCl7dmFyIGU9W10sbj10Lngscj10LnksaT10aGlzLmdyaWQ7cmV0dXJuIGlbbi0xXSYmaVtuLTFdW3JdJiZlLnB1c2goaVtuLTFdW3JdKSxpW24rMV0mJmlbbisxXVtyXSYmZS5wdXNoKGlbbisxXVtyXSksaVtuXSYmaVtuXVtyLTFdJiZlLnB1c2goaVtuXVtyLTFdKSxpW25dJiZpW25dW3IrMV0mJmUucHVzaChpW25dW3IrMV0pLHRoaXMuZGlhZ29uYWwmJihpW24tMV0mJmlbbi0xXVtyLTFdJiZlLnB1c2goaVtuLTFdW3ItMV0pLGlbbisxXSYmaVtuKzFdW3ItMV0mJmUucHVzaChpW24rMV1bci0xXSksaVtuLTFdJiZpW24tMV1bcisxXSYmZS5wdXNoKGlbbi0xXVtyKzFdKSxpW24rMV0mJmlbbisxXVtyKzFdJiZlLnB1c2goaVtuKzFdW3IrMV0pKSxlfSxZcy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxuLHIsaT1bXSxvPXRoaXMuZ3JpZCxzPTAsYT1vLmxlbmd0aDtzPGE7cysrKXtmb3IodD1bXSxuPTAscj0oZT1vW3NdKS5sZW5ndGg7bjxyO24rKyl0LnB1c2goZVtuXS53ZWlnaHQpO2kucHVzaCh0LmpvaW4oIiAiKSl9cmV0dXJuIGkuam9pbigiXG4iKX0sSHMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlsiK3RoaXMueCsiICIrdGhpcy55KyJdIn0sSHMucHJvdG90eXBlLmdldENvc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQueCE9PXRoaXMueCYmdC55IT09dGhpcy55PzEuNDE0MjEqdGhpcy53ZWlnaHQ6dGhpcy53ZWlnaHR9LEhzLnByb3RvdHlwZS5pc1dhbGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMud2VpZ2h0fSxXcy5wcm90b3R5cGU9e3B1c2g6ZnVuY3Rpb24odCl7dGhpcy5jb250ZW50LnB1c2godCksdGhpcy5zaW5rRG93bih0aGlzLmNvbnRlbnQubGVuZ3RoLTEpfSxwb3A6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRlbnRbMF0sZT10aGlzLmNvbnRlbnQucG9wKCk7cmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGg+MCYmKHRoaXMuY29udGVudFswXT1lLHRoaXMuYnViYmxlVXAoMCkpLHR9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRlbnQuaW5kZXhPZih0KSxuPXRoaXMuY29udGVudC5wb3AoKTtlIT09dGhpcy5jb250ZW50Lmxlbmd0aC0xJiYodGhpcy5jb250ZW50W2VdPW4sdGhpcy5zY29yZUZ1bmN0aW9uKG4pPHRoaXMuc2NvcmVGdW5jdGlvbih0KT90aGlzLnNpbmtEb3duKGUpOnRoaXMuYnViYmxlVXAoZSkpfSxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGh9LHJlc2NvcmVFbGVtZW50OmZ1bmN0aW9uKHQpe3RoaXMuc2lua0Rvd24odGhpcy5jb250ZW50LmluZGV4T2YodCkpfSxzaW5rRG93bjpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5jb250ZW50W3RdO3Q+MDspe3ZhciBuPSh0KzE+PjEpLTEscj10aGlzLmNvbnRlbnRbbl07aWYoISh0aGlzLnNjb3JlRnVuY3Rpb24oZSk8dGhpcy5zY29yZUZ1bmN0aW9uKHIpKSlicmVhazt0aGlzLmNvbnRlbnRbbl09ZSx0aGlzLmNvbnRlbnRbdF09cix0PW59fSxidWJibGVVcDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5jb250ZW50Lmxlbmd0aCxuPXRoaXMuY29udGVudFt0XSxyPXRoaXMuc2NvcmVGdW5jdGlvbihuKTs7KXt2YXIgaSxvPXQrMTw8MSxzPW8tMSxhPW51bGw7aWYoczxlKXt2YXIgdT10aGlzLmNvbnRlbnRbc107KGk9dGhpcy5zY29yZUZ1bmN0aW9uKHUpKTxyJiYoYT1zKX1pZihvPGUpe3ZhciBsPXRoaXMuY29udGVudFtvXTt0aGlzLnNjb3JlRnVuY3Rpb24obCk8KG51bGw9PT1hP3I6aSkmJihhPW8pfWlmKG51bGw9PT1hKWJyZWFrO3RoaXMuY29udGVudFt0XT10aGlzLmNvbnRlbnRbYV0sdGhpcy5jb250ZW50W2FdPW4sdD1hfX19LCRzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6JHMsaW5zZXJ0OmZ1bmN0aW9uKHQsZSl7dmFyIG4scixpO2lmKHQpe2lmKGUuUD10LGUuTj10Lk4sdC5OJiYodC5OLlA9ZSksdC5OPWUsdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9ZX1lbHNlIHQuUj1lO249dH1lbHNlIHRoaXMuXz8odD1yYSh0aGlzLl8pLGUuUD1udWxsLGUuTj10LHQuUD10Lkw9ZSxuPXQpOihlLlA9ZS5OPW51bGwsdGhpcy5fPWUsbj1udWxsKTtmb3IoZS5MPWUuUj1udWxsLGUuVT1uLGUuQz0hMCx0PWU7biYmbi5DOyluPT09KHI9bi5VKS5MPyhpPXIuUikmJmkuQz8obi5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PW4uUiYmKGVhKHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsci5DPSEwLG5hKHRoaXMscikpOihpPXIuTCkmJmkuQz8obi5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PW4uTCYmKG5hKHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsci5DPSEwLGVhKHRoaXMscikpLG49dC5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24odCl7dC5OJiYodC5OLlA9dC5QKSx0LlAmJih0LlAuTj10Lk4pLHQuTj10LlA9bnVsbDt2YXIgZSxuLHIsaT10LlUsbz10Lkwscz10LlI7aWYobj1vP3M/cmEocyk6bzpzLGk/aS5MPT09dD9pLkw9bjppLlI9bjp0aGlzLl89bixvJiZzPyhyPW4uQyxuLkM9dC5DLG4uTD1vLG8uVT1uLG4hPT1zPyhpPW4uVSxuLlU9dC5VLHQ9bi5SLGkuTD10LG4uUj1zLHMuVT1uKToobi5VPWksaT1uLHQ9bi5SKSk6KHI9dC5DLHQ9biksdCYmKHQuVT1pKSwhcilpZih0JiZ0LkMpdC5DPSExO2Vsc2V7ZG97aWYodD09PXRoaXMuXylicmVhaztpZih0PT09aS5MKXtpZigoZT1pLlIpLkMmJihlLkM9ITEsaS5DPSEwLGVhKHRoaXMsaSksZT1pLlIpLGUuTCYmZS5MLkN8fGUuUiYmZS5SLkMpe2UuUiYmZS5SLkN8fChlLkwuQz0hMSxlLkM9ITAsbmEodGhpcyxlKSxlPWkuUiksZS5DPWkuQyxpLkM9ZS5SLkM9ITEsZWEodGhpcyxpKSx0PXRoaXMuXzticmVha319ZWxzZSBpZigoZT1pLkwpLkMmJihlLkM9ITEsaS5DPSEwLG5hKHRoaXMsaSksZT1pLkwpLGUuTCYmZS5MLkN8fGUuUiYmZS5SLkMpe2UuTCYmZS5MLkN8fChlLlIuQz0hMSxlLkM9ITAsZWEodGhpcyxlKSxlPWkuTCksZS5DPWkuQyxpLkM9ZS5MLkM9ITEsbmEodGhpcyxpKSx0PXRoaXMuXzticmVha31lLkM9ITAsdD1pLGk9aS5VfXdoaWxlKCF0LkMpO3QmJih0LkM9ITEpfX19O3ZhciBwYSxmYT1bXTtmdW5jdGlvbiBnYSgpe3RhKHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBkYSh0KXt2YXIgZT10LlAsbj10Lk47aWYoZSYmbil7dmFyIHI9ZS5zaXRlLGk9dC5zaXRlLG89bi5zaXRlO2lmKHIhPT1vKXt2YXIgcz1pWzBdLGE9aVsxXSx1PXJbMF0tcyxsPXJbMV0tYSxjPW9bMF0tcyxoPW9bMV0tYSxwPTIqKHUqaC1sKmMpO2lmKCEocD49LUxhKSl7dmFyIGY9dSp1K2wqbCxnPWMqYytoKmgsZD0oaCpmLWwqZykvcCx5PSh1KmctYypmKS9wLHY9ZmEucG9wKCl8fG5ldyBnYTt2LmFyYz10LHYuc2l0ZT1pLHYueD1kK3Msdi55PSh2LmN5PXkrYSkrTWF0aC5zcXJ0KGQqZCt5KnkpLHQuY2lyY2xlPXY7Zm9yKHZhciBfPW51bGwsbT1DYS5fO207KWlmKHYueTxtLnl8fHYueT09PW0ueSYmdi54PD1tLngpe2lmKCFtLkwpe189bS5QO2JyZWFrfW09bS5MfWVsc2V7aWYoIW0uUil7Xz1tO2JyZWFrfW09bS5SfUNhLmluc2VydChfLHYpLF98fChwYT12KX19fX1mdW5jdGlvbiB5YSh0KXt2YXIgZT10LmNpcmNsZTtlJiYoZS5QfHwocGE9ZS5OKSxDYS5yZW1vdmUoZSksZmEucHVzaChlKSx0YShlKSx0LmNpcmNsZT1udWxsKX12YXIgdmE9W107ZnVuY3Rpb24gX2EoKXt0YSh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gbWEodCl7dmFyIGU9dmEucG9wKCl8fG5ldyBfYTtyZXR1cm4gZS5zaXRlPXQsZX1mdW5jdGlvbiB4YSh0KXt5YSh0KSxOYS5yZW1vdmUodCksdmEucHVzaCh0KSx0YSh0KX1mdW5jdGlvbiBFYSh0KXt2YXIgZT10LmNpcmNsZSxuPWUueCxyPWUuY3ksaT1bbixyXSxvPXQuUCxzPXQuTixhPVt0XTt4YSh0KTtmb3IodmFyIHU9bzt1LmNpcmNsZSYmTWF0aC5hYnMobi11LmNpcmNsZS54KTxNYSYmTWF0aC5hYnMoci11LmNpcmNsZS5jeSk8TWE7KW89dS5QLGEudW5zaGlmdCh1KSx4YSh1KSx1PW87YS51bnNoaWZ0KHUpLHlhKHUpO2Zvcih2YXIgbD1zO2wuY2lyY2xlJiZNYXRoLmFicyhuLWwuY2lyY2xlLngpPE1hJiZNYXRoLmFicyhyLWwuY2lyY2xlLmN5KTxNYTspcz1sLk4sYS5wdXNoKGwpLHhhKGwpLGw9czthLnB1c2gobCkseWEobCk7dmFyIGMsaD1hLmxlbmd0aDtmb3IoYz0xO2M8aDsrK2MpbD1hW2NdLHU9YVtjLTFdLHNhKGwuZWRnZSx1LnNpdGUsbC5zaXRlLGkpO3U9YVswXSwobD1hW2gtMV0pLmVkZ2U9aWEodS5zaXRlLGwuc2l0ZSxudWxsLGkpLGRhKHUpLGRhKGwpfWZ1bmN0aW9uIGJhKHQpe2Zvcih2YXIgZSxuLHIsaSxvPXRbMF0scz10WzFdLGE9TmEuXzthOylpZigocj13YShhLHMpLW8pPk1hKWE9YS5MO2Vsc2V7aWYoISgoaT1vLUlhKGEscykpPk1hKSl7cj4tTWE/KGU9YS5QLG49YSk6aT4tTWE/KGU9YSxuPWEuTik6ZT1uPWE7YnJlYWt9aWYoIWEuUil7ZT1hO2JyZWFrfWE9YS5SfSFmdW5jdGlvbih0KXtTYVt0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19KHQpO3ZhciB1PW1hKHQpO2lmKE5hLmluc2VydChlLHUpLGV8fG4pe2lmKGU9PT1uKXJldHVybiB5YShlKSxuPW1hKGUuc2l0ZSksTmEuaW5zZXJ0KHUsbiksdS5lZGdlPW4uZWRnZT1pYShlLnNpdGUsdS5zaXRlKSxkYShlKSx2b2lkIGRhKG4pO2lmKG4pe3lhKGUpLHlhKG4pO3ZhciBsPWUuc2l0ZSxjPWxbMF0saD1sWzFdLHA9dFswXS1jLGY9dFsxXS1oLGc9bi5zaXRlLGQ9Z1swXS1jLHk9Z1sxXS1oLHY9MioocCp5LWYqZCksXz1wKnArZipmLG09ZCpkK3kqeSx4PVsoeSpfLWYqbSkvditjLChwKm0tZCpfKS92K2hdO3NhKG4uZWRnZSxsLGcseCksdS5lZGdlPWlhKGwsdCxudWxsLHgpLG4uZWRnZT1pYSh0LGcsbnVsbCx4KSxkYShlKSxkYShuKX1lbHNlIHUuZWRnZT1pYShlLnNpdGUsdS5zaXRlKX19ZnVuY3Rpb24gd2EodCxlKXt2YXIgbj10LnNpdGUscj1uWzBdLGk9blsxXSxvPWktZTtpZighbylyZXR1cm4gcjt2YXIgcz10LlA7aWYoIXMpcmV0dXJuLTEvMDt2YXIgYT0obj1zLnNpdGUpWzBdLHU9blsxXSxsPXUtZTtpZighbClyZXR1cm4gYTt2YXIgYz1hLXIsaD0xL28tMS9sLHA9Yy9sO3JldHVybiBoPygtcCtNYXRoLnNxcnQocCpwLTIqaCooYypjLygtMipsKS11K2wvMitpLW8vMikpKS9oK3I6KHIrYSkvMn1mdW5jdGlvbiBJYSh0LGUpe3ZhciBuPXQuTjtpZihuKXJldHVybiB3YShuLGUpO3ZhciByPXQuc2l0ZTtyZXR1cm4gclsxXT09PWU/clswXToxLzB9dmFyIE5hLFNhLENhLFBhLE1hPTFlLTYsTGE9MWUtMTI7ZnVuY3Rpb24gT2EodCxlKXtyZXR1cm4gZVsxXS10WzFdfHxlWzBdLXRbMF19ZnVuY3Rpb24gUmEodCxlKXt2YXIgbixyLGksbz10LnNvcnQoT2EpLnBvcCgpO2ZvcihQYT1bXSxTYT1uZXcgQXJyYXkodC5sZW5ndGgpLE5hPW5ldyAkcyxDYT1uZXcgJHM7OylpZihpPXBhLG8mJighaXx8b1sxXTxpLnl8fG9bMV09PT1pLnkmJm9bMF08aS54KSlvWzBdPT09biYmb1sxXT09PXJ8fChiYShvKSxuPW9bMF0scj1vWzFdKSxvPXQucG9wKCk7ZWxzZXtpZighaSlicmVhaztFYShpLmFyYyl9aWYoZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxuLHIsaT0wLG89U2EubGVuZ3RoO2k8bzsrK2kpaWYoKHQ9U2FbaV0pJiYocj0oZT10LmhhbGZlZGdlcykubGVuZ3RoKSl7dmFyIHM9bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KHIpO2ZvcihuPTA7bjxyOysrbilzW25dPW4sYVtuXT1sYSh0LFBhW2Vbbl1dKTtmb3Iocy5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBhW2VdLWFbdF19KSksbj0wO248cjsrK24pYVtuXT1lW3Nbbl1dO2ZvcihuPTA7bjxyOysrbillW25dPWFbbl19fSgpLGUpe3ZhciBzPStlWzBdWzBdLGE9K2VbMF1bMV0sdT0rZVsxXVswXSxsPStlWzFdWzFdOyFmdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGksbz1QYS5sZW5ndGg7by0tOyl1YShpPVBhW29dLHQsZSxuLHIpJiZhYShpLHQsZSxuLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5NYXx8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5NYSl8fGRlbGV0ZSBQYVtvXX0ocyxhLHUsbCksZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzLGEsdSxsLGMsaCxwLGYsZyxkLHk9U2EubGVuZ3RoLHY9ITA7Zm9yKGk9MDtpPHk7KytpKWlmKG89U2FbaV0pe2ZvcihzPW8uc2l0ZSxhPSh1PW8uaGFsZmVkZ2VzKS5sZW5ndGg7YS0tOylQYVt1W2FdXXx8dS5zcGxpY2UoYSwxKTtmb3IoYT0wLGw9dS5sZW5ndGg7YTxsOylnPShmPWhhKG8sUGFbdVthXV0pKVswXSxkPWZbMV0saD0oYz1jYShvLFBhW3VbKythJWxdXSkpWzBdLHA9Y1sxXSwoTWF0aC5hYnMoZy1oKT5NYXx8TWF0aC5hYnMoZC1wKT5NYSkmJih1LnNwbGljZShhLDAsUGEucHVzaChvYShzLGYsTWF0aC5hYnMoZy10KTxNYSYmci1kPk1hP1t0LE1hdGguYWJzKGgtdCk8TWE/cDpyXTpNYXRoLmFicyhkLXIpPE1hJiZuLWc+TWE/W01hdGguYWJzKHAtcik8TWE/aDpuLHJdOk1hdGguYWJzKGctbik8TWEmJmQtZT5NYT9bbixNYXRoLmFicyhoLW4pPE1hP3A6ZV06TWF0aC5hYnMoZC1lKTxNYSYmZy10Pk1hP1tNYXRoLmFicyhwLWUpPE1hP2g6dCxlXTpudWxsKSktMSksKytsKTtsJiYodj0hMSl9aWYodil7dmFyIF8sbSx4LEU9MS8wO2ZvcihpPTAsdj1udWxsO2k8eTsrK2kpKG89U2FbaV0pJiYoeD0oXz0ocz1vLnNpdGUpWzBdLXQpKl8rKG09c1sxXS1lKSptKTxFJiYoRT14LHY9byk7aWYodil7dmFyIGI9W3QsZV0sdz1bdCxyXSxJPVtuLHJdLE49W24sZV07di5oYWxmZWRnZXMucHVzaChQYS5wdXNoKG9hKHM9di5zaXRlLGIsdykpLTEsUGEucHVzaChvYShzLHcsSSkpLTEsUGEucHVzaChvYShzLEksTikpLTEsUGEucHVzaChvYShzLE4sYikpLTEpfX1mb3IoaT0wO2k8eTsrK2kpKG89U2FbaV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgU2FbaV0pfShzLGEsdSxsKX10aGlzLmVkZ2VzPVBhLHRoaXMuY2VsbHM9U2EsTmE9Q2E9UGE9U2E9bnVsbH1mdW5jdGlvbiBUYSh0KXtyZXR1cm4odD10LnNsaWNlKCkpLnB1c2godFswXSksbChbdF0pfWZ1bmN0aW9uIEFhKHQsZSxuLHIpe3ZhciBpPShyPXJ8fHt9KS5zdGVwc3x8NjQsbz1yLnVuaXRzfHwia2lsb21ldGVycyIscz1yLmFuZ2xlfHwwLGE9ci5waXZvdHx8dCx1PXIucHJvcGVydGllc3x8dC5wcm9wZXJ0aWVzfHx7fTtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNlbnRlciBpcyByZXF1aXJlZCIpO2lmKCFlKXRocm93IG5ldyBFcnJvcigieFNlbWlBeGlzIGlzIHJlcXVpcmVkIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJ5U2VtaUF4aXMgaXMgcmVxdWlyZWQiKTtpZighUChyKSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtpZighQyhpKSl0aHJvdyBuZXcgRXJyb3IoInN0ZXBzIG11c3QgYmUgYSBudW1iZXIiKTtpZighQyhzKSl0aHJvdyBuZXcgRXJyb3IoImFuZ2xlIG11c3QgYmUgYSBudW1iZXIiKTt2YXIgYz1LKHQpO2lmKCJkZWdyZWVzIj09PW8pdmFyIGg9SShzKTtlbHNlIGU9amkodCxlLDkwLHt1bml0czpvfSksbj1qaSh0LG4sMCx7dW5pdHM6b30pLGU9SyhlKVswXS1jWzBdLG49SyhuKVsxXS1jWzFdO2Zvcih2YXIgcD1bXSxmPTA7ZjxpO2YrPTEpe3ZhciBnPS0zNjAqZi9pLGQ9ZSpuL01hdGguc3FydChNYXRoLnBvdyhuLDIpK01hdGgucG93KGUsMikqTWF0aC5wb3coRGEoZyksMikpLHk9ZSpuL01hdGguc3FydChNYXRoLnBvdyhlLDIpK01hdGgucG93KG4sMikvTWF0aC5wb3coRGEoZyksMikpO2lmKGc8LTkwJiZnPj0tMjcwJiYoZD0tZCksZzwtMTgwJiZnPj0tMzYwJiYoeT0teSksImRlZ3JlZXMiPT09byl7dmFyIHY9ZCpNYXRoLmNvcyhoKSt5Kk1hdGguc2luKGgpLF89eSpNYXRoLmNvcyhoKS1kKk1hdGguc2luKGgpO2Q9dix5PV99cC5wdXNoKFtkK2NbMF0seStjWzFdXSl9cmV0dXJuIHAucHVzaChwWzBdKSwiZGVncmVlcyI9PT1vP2woW3BdLHUpOiRvKGwoW3BdLHUpLHMse3Bpdm90OmF9KX1mdW5jdGlvbiBEYSh0KXt2YXIgZT10Kk1hdGguUEkvMTgwO3JldHVybiBNYXRoLnRhbihlKX1mdW5jdGlvbiBGYSh0LGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj0wLHI9MCxpPTA7cmV0dXJuIHEodCwoZnVuY3Rpb24odCxvLHMpe3ZhciBhPWUud2VpZ2h0P251bGw9PXM/dm9pZCAwOnNbZS53ZWlnaHRdOnZvaWQgMDtpZighQyhhPW51bGw9PWE/MTphKSl0aHJvdyBuZXcgRXJyb3IoIndlaWdodCB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyIGZvciBmZWF0dXJlIGluZGV4ICIrbyk7KGE9TnVtYmVyKGEpKT4wJiZSKHQsKGZ1bmN0aW9uKHQpe24rPXRbMF0qYSxyKz10WzFdKmEsaSs9YX0pKX0pKSxhKFtuL2ksci9pXSxlLnByb3BlcnRpZXMsZSl9ZnVuY3Rpb24ga2EodCxlLG4scixpKXt2YXIgbz1yLnRvbGVyYW5jZXx8LjAwMSxzPTAsdT0wLGw9MCxjPTA7aWYoRihuLChmdW5jdGlvbihlKXt2YXIgbixyPW51bGw9PT0obj1lLnByb3BlcnRpZXMpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLndlaWdodCxpPW51bGw9PXI/MTpyO2lmKCFDKGk9TnVtYmVyKGkpKSl0aHJvdyBuZXcgRXJyb3IoIndlaWdodCB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyIik7aWYoaT4wKXtjKz0xO3ZhciBvPWkqbWUoZSx0KTswPT09byYmKG89MSk7dmFyIGE9aS9vO3MrPWUuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0qYSx1Kz1lLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdKmEsbCs9YX19KSksYzwxKXRocm93IG5ldyBFcnJvcigibm8gZmVhdHVyZXMgdG8gbWVhc3VyZSIpO3ZhciBoPXMvbCxwPXUvbDtyZXR1cm4gMT09PWN8fDA9PT1pfHxNYXRoLmFicyhoLWVbMF0pPG8mJk1hdGguYWJzKHAtZVsxXSk8bz9hKFtoLHBdLHttZWRpYW5DYW5kaWRhdGVzOnIubWVkaWFuQ2FuZGlkYXRlc30pOihyLm1lZGlhbkNhbmRpZGF0ZXMucHVzaChbaCxwXSksa2EoW2gscF0sdCxuLHIsaS0xKSl9ZnVuY3Rpb24gR2EodCxlKXtyZXR1cm57eDp0WzBdLWVbMF0seTp0WzFdLWVbMV19fWZ1bmN0aW9uIHFhKHQsZSl7dmFyIG49MCxyPTA7Uih0LChmdW5jdGlvbihpLG8scyxhLHUpe3U+biYmKG49dSxyPW8sZS5wdXNoKFtdKSk7dmFyIGw9by1yLGM9dC5jb29yZGluYXRlc1t1XVtsKzFdLGg9aVswXSxwPWlbMV0sZj1jWzBdLGc9Y1sxXTtlW3VdLnB1c2goWy43NSpoKy4yNSpmLC43NSpwKy4yNSpnXSksZVt1XS5wdXNoKFsuMjUqaCsuNzUqZiwuMjUqcCsuNzUqZ10pfSksITApLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5wdXNoKHRbMF0pfSkpfWZ1bmN0aW9uIEJhKHQsZSl7dmFyIG49MCxyPTAsaT0wO1IodCwoZnVuY3Rpb24obyxzLGEsdSxsKXt1PmkmJihpPXUscj1zLGUucHVzaChbW11dKSksbD5uJiYobj1sLHI9cyxlW3VdLnB1c2goW10pKTt2YXIgYz1zLXIsaD10LmNvb3JkaW5hdGVzW3VdW2xdW2MrMV0scD1vWzBdLGY9b1sxXSxnPWhbMF0sZD1oWzFdO2VbdV1bbF0ucHVzaChbLjc1KnArLjI1KmcsLjc1KmYrLjI1KmRdKSxlW3VdW2xdLnB1c2goWy4yNSpwKy43NSpnLC4yNSpmKy43NSpkXSl9KSwhMCksZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QucHVzaCh0WzBdKX0pKX0pKX1mdW5jdGlvbiB6YSh0LGUsbil7dm9pZCAwPT09biYmKG49Mik7dmFyIHI9Syh0KSxpPUsoZSksbz1yWzBdLWlbMF0scz1yWzFdLWlbMV07cmV0dXJuIDE9PT1uP01hdGguYWJzKG8pK01hdGguYWJzKHMpOk1hdGgucG93KE1hdGgucG93KG8sbikrTWF0aC5wb3cocyxuKSwxL24pfWZ1bmN0aW9uIGphKHQsZSl7dmFyIG49KGU9ZXx8e30pLnRocmVzaG9sZHx8MWU0LHI9ZS5wfHwyLGk9ZS5iaW5hcnl8fCExLG89ZS5hbHBoYXx8LTEscz1lLnN0YW5kYXJkaXphdGlvbnx8ITEsYT1bXTtGKHQsKGZ1bmN0aW9uKHQpe2EucHVzaChFbih0KSl9KSk7Zm9yKHZhciB1PVtdLGw9MDtsPGEubGVuZ3RoO2wrKyl1W2xdPVtdO2ZvcihsPTA7bDxhLmxlbmd0aDtsKyspZm9yKHZhciBjPWw7YzxhLmxlbmd0aDtjKyspe2w9PT1jJiYodVtsXVtjXT0wKTt2YXIgaD16YShhW2xdLGFbY10scik7dVtsXVtjXT1oLHVbY11bbF09aH1mb3IobD0wO2w8YS5sZW5ndGg7bCsrKWZvcihjPTA7YzxhLmxlbmd0aDtjKyspezAhPT0oaD11W2xdW2NdKSYmKHVbbF1bY109aT9oPD1uPzE6MDpoPD1uP01hdGgucG93KGgsbyk6MCl9aWYocylmb3IobD0wO2w8YS5sZW5ndGg7bCsrKXt2YXIgcD11W2xdLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlfSksMCk7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyl1W2xdW2NdPXVbbF1bY10vcH1yZXR1cm4gdX1mdW5jdGlvbiBVYSh0KXtmb3IodmFyIGU9MCxuPTAscj10O248ci5sZW5ndGg7bisrKXtlKz1yW25dfXJldHVybiBlL3QubGVuZ3RofWZ1bmN0aW9uIFZhKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxZYSh0LCJtZXJjYXRvciIsZSl9ZnVuY3Rpb24gWGEodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLFlhKHQsIndnczg0IixlKX1mdW5jdGlvbiBZYSh0LGUsbil7dm9pZCAwPT09biYmKG49e30pO3ZhciByPShuPW58fHt9KS5tdXRhdGU7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJkModFswXSk/dD0ibWVyY2F0b3IiPT09ZT9IYSh0KTpXYSh0KTooITAhPT1yJiYodD1JZSh0KSksUih0LChmdW5jdGlvbih0KXt2YXIgbj0ibWVyY2F0b3IiPT09ZT9IYSh0KTpXYSh0KTt0WzBdPW5bMF0sdFsxXT1uWzFdfSkpKSx0fWZ1bmN0aW9uIEhhKHQpe3ZhciBlPU1hdGguUEkvMTgwLG49NjM3ODEzNyxyPTIwMDM3NTA4LjM0Mjc4OTI0NCxpPVtuKihNYXRoLmFicyh0WzBdKTw9MTgwP3RbMF06dFswXS0zNjAqZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD8tMTp0PjA/MTowfSh0WzBdKSkqZSxuKk1hdGgubG9nKE1hdGgudGFuKC4yNSpNYXRoLlBJKy41KnRbMV0qZSkpXTtyZXR1cm4gaVswXT5yJiYoaVswXT1yKSxpWzBdPC1yJiYoaVswXT0tciksaVsxXT5yJiYoaVsxXT1yKSxpWzFdPC1yJiYoaVsxXT0tciksaX1mdW5jdGlvbiBXYSh0KXt2YXIgZT0xODAvTWF0aC5QSSxuPTYzNzgxMzc7cmV0dXJuW3RbMF0qZS9uLCguNSpNYXRoLlBJLTIqTWF0aC5hdGFuKE1hdGguZXhwKC10WzFdL24pKSkqZV19UmEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpSYSxwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKChmdW5jdGlvbihlKXt2YXIgbj1lLmhhbGZlZGdlcy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBjYShlLHRbbl0pfSkpO3JldHVybiBuLmRhdGE9ZS5zaXRlLmRhdGEsbn0pKX0sdHJpYW5nbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9W10sZT10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLmZvckVhY2goKGZ1bmN0aW9uKG4scil7aWYobz0oaT1uLmhhbGZlZGdlcykubGVuZ3RoKWZvcih2YXIgaSxvLHMsYSx1LGwsYz1uLnNpdGUsaD0tMSxwPWVbaVtvLTFdXSxmPXAubGVmdD09PWM/cC5yaWdodDpwLmxlZnQ7KytoPG87KXM9ZixmPShwPWVbaVtoXV0pLmxlZnQ9PT1jP3AucmlnaHQ6cC5sZWZ0LHMmJmYmJnI8cy5pbmRleCYmcjxmLmluZGV4JiYodT1zLGw9ZiwoKGE9YylbMF0tbFswXSkqKHVbMV0tYVsxXSktKGFbMF0tdVswXSkqKGxbMV0tYVsxXSk8MCkmJnQucHVzaChbYy5kYXRhLHMuZGF0YSxmLmRhdGFdKX0pKSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucmlnaHR9KSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSkpfSxmaW5kOmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsaSxvPXRoaXMscz1vLl9mb3VuZHx8MCxhPW8uY2VsbHMubGVuZ3RoOyEoaT1vLmNlbGxzW3NdKTspaWYoKytzPj1hKXJldHVybiBudWxsO3ZhciB1PXQtaS5zaXRlWzBdLGw9ZS1pLnNpdGVbMV0sYz11KnUrbCpsO2Rve2k9by5jZWxsc1tyPXNdLHM9bnVsbCxpLmhhbGZlZGdlcy5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgcj1vLmVkZ2VzW25dLGE9ci5sZWZ0O2lmKGEhPT1pLnNpdGUmJmF8fChhPXIucmlnaHQpKXt2YXIgdT10LWFbMF0sbD1lLWFbMV0saD11KnUrbCpsO2g8YyYmKGM9aCxzPWEuaW5kZXgpfX0pKX13aGlsZShudWxsIT09cyk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09bnx8Yzw9bipuP2kuc2l0ZTpudWxsfX07dmFyIEphPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHRvTWVyY2F0b3I6VmEsdG9XZ3M4NDpYYX0pLFphPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wLG49YXJndW1lbnRzLmxlbmd0aDtlPG47ZSsrKXQrPWFyZ3VtZW50c1tlXS5sZW5ndGg7dmFyIHI9QXJyYXkodCksaT0wO2ZvcihlPTA7ZTxuO2UrKylmb3IodmFyIG89YXJndW1lbnRzW2VdLHM9MCxhPW8ubGVuZ3RoO3M8YTtzKyssaSsrKXJbaV09b1tzXTtyZXR1cm4gcn07ZnVuY3Rpb24gS2EodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/bnUodCk6dCYmdC5iYm94P251KHQuYmJveCk6WzM2MCpldSgpLDE4MCpldSgpXX1mdW5jdGlvbiBRYSh0LGUpe3ZvaWQgMD09PWUmJihlPXt9KSxudWxsPT10JiYodD0xKTtmb3IodmFyIG49W10scj0wO3I8dDtyKyspbi5wdXNoKGEoS2EoZS5iYm94KSkpO3JldHVybiBmKG4pfWZ1bmN0aW9uICRhKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pLG51bGw9PXQmJih0PTEpLEMoZS5udW1fdmVydGljZXMpJiZ2b2lkIDAhPT1lLm51bV92ZXJ0aWNlc3x8KGUubnVtX3ZlcnRpY2VzPTEwKSxDKGUubWF4X3JhZGlhbF9sZW5ndGgpJiZ2b2lkIDAhPT1lLm1heF9yYWRpYWxfbGVuZ3RofHwoZS5tYXhfcmFkaWFsX2xlbmd0aD0xMCk7Zm9yKHZhciBuPVtdLHI9ZnVuY3Rpb24odCl7dmFyIHIsaT1bXSxvPVphKEFycmF5KGUubnVtX3ZlcnRpY2VzKzEpKS5tYXAoTWF0aC5yYW5kb20pO28uZm9yRWFjaCgoZnVuY3Rpb24odCxlLG4pe25bZV09ZT4wP3QrbltlLTFdOnR9KSksby5mb3JFYWNoKChmdW5jdGlvbih0KXt0PTIqdCpNYXRoLlBJL29bby5sZW5ndGgtMV07dmFyIG49TWF0aC5yYW5kb20oKTtpLnB1c2goW24qKGUubWF4X3JhZGlhbF9sZW5ndGh8fDEwKSpNYXRoLnNpbih0KSxuKihlLm1heF9yYWRpYWxfbGVuZ3RofHwxMCkqTWF0aC5jb3ModCldKX0pKSxpW2kubGVuZ3RoLTFdPWlbMF0saT1pLm1hcCgocj1LYShlLmJib3gpLGZ1bmN0aW9uKHQpe3JldHVyblt0WzBdK3JbMF0sdFsxXStyWzFdXX0pKSxuLnB1c2gobChbaV0pKX0saT0wO2k8dDtpKyspcigpO3JldHVybiBmKG4pfWZ1bmN0aW9uIHR1KHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9e30pLCFQKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5iYm94LHI9ZS5udW1fdmVydGljZXMsaT1lLm1heF9sZW5ndGgsbz1lLm1heF9yb3RhdGlvbjtudWxsPT10JiYodD0xKSwoIUMocil8fHZvaWQgMD09PXJ8fHI8MikmJihyPTEwKSxDKGkpJiZ2b2lkIDAhPT1pfHwoaT0xZS00KSxDKG8pJiZ2b2lkIDAhPT1vfHwobz1NYXRoLlBJLzgpO2Zvcih2YXIgcz1bXSxhPTA7YTx0O2ErKyl7Zm9yKHZhciB1PVtLYShuKV0sbD0wO2w8ci0xO2wrKyl7dmFyIGM9KDA9PT1sPzIqTWF0aC5yYW5kb20oKSpNYXRoLlBJOk1hdGgudGFuKCh1W2xdWzFdLXVbbC0xXVsxXSkvKHVbbF1bMF0tdVtsLTFdWzBdKSkpKyhNYXRoLnJhbmRvbSgpLS41KSpvKjIscD1NYXRoLnJhbmRvbSgpKmk7dS5wdXNoKFt1W2xdWzBdK3AqTWF0aC5jb3MoYyksdVtsXVsxXStwKk1hdGguc2luKGMpXSl9cy5wdXNoKGgodSkpfXJldHVybiBmKHMpfWZ1bmN0aW9uIGV1KCl7cmV0dXJuIE1hdGgucmFuZG9tKCktLjV9ZnVuY3Rpb24gbnUodCl7cmV0dXJuW01hdGgucmFuZG9tKCkqKHRbMl0tdFswXSkrdFswXSxNYXRoLnJhbmRvbSgpKih0WzNdLXRbMV0pK3RbMV1dfXZhciBydT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyYW5kb21Qb3NpdGlvbjpLYSxyYW5kb21Qb2ludDpRYSxyYW5kb21Qb2x5Z29uOiRhLHJhbmRvbUxpbmVTdHJpbmc6dHV9KTtmdW5jdGlvbiBpdSh0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO2lmKCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIG11c3QgYmUgYSBGZWF0dXJlQ29sbGVjdGlvbiIpO2lmKG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJmaWx0ZXIgaXMgcmVxdWlyZWQiKTt2YXIgbj1bXTtyZXR1cm4gRih0LChmdW5jdGlvbih0KXt1dSh0LnByb3BlcnRpZXMsZSkmJm4ucHVzaCh0KX0pKSxmKG4pfWZ1bmN0aW9uIG91KHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtpZigiRmVhdHVyZUNvbGxlY3Rpb24iIT09dC50eXBlKXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBtdXN0IGJlIGEgRmVhdHVyZUNvbGxlY3Rpb24iKTtpZihudWxsPT1lKXRocm93IG5ldyBFcnJvcigicHJvcGVydHkgaXMgcmVxdWlyZWQiKTtmb3IodmFyIHI9YXUodCxlKSxpPU9iamVjdC5rZXlzKHIpLG89MDtvPGkubGVuZ3RoO28rKyl7Zm9yKHZhciBzPWlbb10sYT1yW3NdLHU9W10sbD0wO2w8YS5sZW5ndGg7bCsrKXUucHVzaCh0LmZlYXR1cmVzW2FbbF1dKTtuKGYodSkscyxvKX19ZnVuY3Rpb24gc3UodCxlLG4scil7dmFyIGk9cjtyZXR1cm4gb3UodCxlLChmdW5jdGlvbih0LGUsbyl7aT0wPT09byYmdm9pZCAwPT09cj90Om4oaSx0LGUsbyl9KSksaX1mdW5jdGlvbiBhdSh0LGUpe3ZhciBuPXt9O3JldHVybiBGKHQsKGZ1bmN0aW9uKHQscil7dmFyIGk9dC5wcm9wZXJ0aWVzfHx7fTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaSxTdHJpbmcoZSkpKXt2YXIgbz1pW2VdO09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLG8pP25bb10ucHVzaChyKTpuW29dPVtyXX19KSksbn1mdW5jdGlvbiB1dSh0LGUpe2lmKHZvaWQgMD09PXQpcmV0dXJuITE7dmFyIG49dHlwZW9mIGU7aWYoIm51bWJlciI9PT1ufHwic3RyaW5nIj09PW4pcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpO2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKCF1dSh0LGVbcl0pKXJldHVybiExO3JldHVybiEwfXJldHVybiBsdSh0LGUpfWZ1bmN0aW9uIGx1KHQsZSl7Zm9yKHZhciBuPU9iamVjdC5rZXlzKGUpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpZih0W2ldIT09ZVtpXSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBjdSh0LGUpe2lmKCFlKXJldHVybnt9O2lmKCFlLmxlbmd0aClyZXR1cm57fTtmb3IodmFyIG49e30scj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdO09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiYobltpXT10W2ldKX1yZXR1cm4gbn12YXIgaHU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0Q2x1c3RlcjppdSxjbHVzdGVyRWFjaDpvdSxjbHVzdGVyUmVkdWNlOnN1LGNyZWF0ZUJpbnM6YXUsYXBwbHlGaWx0ZXI6dXUscHJvcGVydGllc0NvbnRhaW5zRmlsdGVyOmx1LGZpbHRlclByb3BlcnRpZXM6Y3V9KSxwdT1mdW5jdGlvbih0LGUpe3RoaXMubmV4dD1udWxsLHRoaXMua2V5PXQsdGhpcy5kYXRhPWUsdGhpcy5sZWZ0PW51bGwsdGhpcy5yaWdodD1udWxsfTsKLyoqCiAgICAgKiBzcGxheXRyZWUgdjMuMS4wCiAgICAgKiBGYXN0IFNwbGF5IHRyZWUgZm9yIE5vZGUgYW5kIGJyb3dzZXIKICAgICAqCiAgICAgKiBAYXV0aG9yIEFsZXhhbmRlciBNaWxldnNraSA8aW5mb0B3OHIubmFtZT4KICAgICAqIEBsaWNlbnNlIE1JVAogICAgICogQHByZXNlcnZlCiAgICAgKi9mdW5jdGlvbiBmdSh0LGUpe3JldHVybiB0PmU/MTp0PGU/LTE6MH1mdW5jdGlvbiBndSh0LGUsbil7Zm9yKHZhciByPW5ldyBwdShudWxsLG51bGwpLGk9cixvPXI7Oyl7dmFyIHM9bih0LGUua2V5KTtpZihzPDApe2lmKG51bGw9PT1lLmxlZnQpYnJlYWs7aWYobih0LGUubGVmdC5rZXkpPDApe3ZhciBhPWUubGVmdDtpZihlLmxlZnQ9YS5yaWdodCxhLnJpZ2h0PWUsbnVsbD09PShlPWEpLmxlZnQpYnJlYWt9by5sZWZ0PWUsbz1lLGU9ZS5sZWZ0fWVsc2V7aWYoIShzPjApKWJyZWFrO2lmKG51bGw9PT1lLnJpZ2h0KWJyZWFrO2lmKG4odCxlLnJpZ2h0LmtleSk+MCl7YT1lLnJpZ2h0O2lmKGUucmlnaHQ9YS5sZWZ0LGEubGVmdD1lLG51bGw9PT0oZT1hKS5yaWdodClicmVha31pLnJpZ2h0PWUsaT1lLGU9ZS5yaWdodH19cmV0dXJuIGkucmlnaHQ9ZS5sZWZ0LG8ubGVmdD1lLnJpZ2h0LGUubGVmdD1yLnJpZ2h0LGUucmlnaHQ9ci5sZWZ0LGV9ZnVuY3Rpb24gZHUodCxlLG4scil7dmFyIGk9bmV3IHB1KHQsZSk7aWYobnVsbD09PW4pcmV0dXJuIGkubGVmdD1pLnJpZ2h0PW51bGwsaTt2YXIgbz1yKHQsKG49Z3UodCxuLHIpKS5rZXkpO3JldHVybiBvPDA/KGkubGVmdD1uLmxlZnQsaS5yaWdodD1uLG4ubGVmdD1udWxsKTpvPj0wJiYoaS5yaWdodD1uLnJpZ2h0LGkubGVmdD1uLG4ucmlnaHQ9bnVsbCksaX1mdW5jdGlvbiB5dSh0LGUsbil7dmFyIHI9bnVsbCxpPW51bGw7aWYoZSl7dmFyIG89bigoZT1ndSh0LGUsbikpLmtleSx0KTswPT09bz8ocj1lLmxlZnQsaT1lLnJpZ2h0KTpvPDA/KGk9ZS5yaWdodCxlLnJpZ2h0PW51bGwscj1lKToocj1lLmxlZnQsZS5sZWZ0PW51bGwsaT1lKX1yZXR1cm57bGVmdDpyLHJpZ2h0Oml9fWZ1bmN0aW9uIHZ1KHQsZSxuLHIsaSl7aWYodCl7cihlKyhuPyLilJTilIDilIAgIjoi4pSc4pSA4pSAICIpK2kodCkrIlxuIik7dmFyIG89ZSsobj8iICAgICI6IuKUgiAgICIpO3QubGVmdCYmdnUodC5sZWZ0LG8sITEscixpKSx0LnJpZ2h0JiZ2dSh0LnJpZ2h0LG8sITAscixpKX19dmFyIF91PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2b2lkIDA9PT10JiYodD1mdSksdGhpcy5fcm9vdD1udWxsLHRoaXMuX3NpemU9MCx0aGlzLl9jb21wYXJhdG9yPXR9cmV0dXJuIHQucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9zaXplKyssdGhpcy5fcm9vdD1kdSh0LGUsdGhpcy5fcm9vdCx0aGlzLl9jb21wYXJhdG9yKX0sdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IHB1KHQsZSk7bnVsbD09PXRoaXMuX3Jvb3QmJihuLmxlZnQ9bi5yaWdodD1udWxsLHRoaXMuX3NpemUrKyx0aGlzLl9yb290PW4pO3ZhciByPXRoaXMuX2NvbXBhcmF0b3IsaT1ndSh0LHRoaXMuX3Jvb3Qsciksbz1yKHQsaS5rZXkpO3JldHVybiAwPT09bz90aGlzLl9yb290PWk6KG88MD8obi5sZWZ0PWkubGVmdCxuLnJpZ2h0PWksaS5sZWZ0PW51bGwpOm8+MCYmKG4ucmlnaHQ9aS5yaWdodCxuLmxlZnQ9aSxpLnJpZ2h0PW51bGwpLHRoaXMuX3NpemUrKyx0aGlzLl9yb290PW4pLHRoaXMuX3Jvb3R9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt0aGlzLl9yb290PXRoaXMuX3JlbW92ZSh0LHRoaXMuX3Jvb3QsdGhpcy5fY29tcGFyYXRvcil9LHQucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByO3JldHVybiBudWxsPT09ZT9udWxsOjA9PT1uKHQsKGU9Z3UodCxlLG4pKS5rZXkpPyhudWxsPT09ZS5sZWZ0P3I9ZS5yaWdodDoocj1ndSh0LGUubGVmdCxuKSkucmlnaHQ9ZS5yaWdodCx0aGlzLl9zaXplLS0scik6ZX0sdC5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcm9vdDtpZih0KXtmb3IoO3QubGVmdDspdD10LmxlZnQ7cmV0dXJuIHRoaXMuX3Jvb3Q9Z3UodC5rZXksdGhpcy5fcm9vdCx0aGlzLl9jb21wYXJhdG9yKSx0aGlzLl9yb290PXRoaXMuX3JlbW92ZSh0LmtleSx0aGlzLl9yb290LHRoaXMuX2NvbXBhcmF0b3IpLHtrZXk6dC5rZXksZGF0YTp0LmRhdGF9fXJldHVybiBudWxsfSx0LnByb3RvdHlwZS5maW5kU3RhdGljPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9yb290LG49dGhpcy5fY29tcGFyYXRvcjtlOyl7dmFyIHI9bih0LGUua2V5KTtpZigwPT09cilyZXR1cm4gZTtlPXI8MD9lLmxlZnQ6ZS5yaWdodH1yZXR1cm4gbnVsbH0sdC5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcm9vdCYmKHRoaXMuX3Jvb3Q9Z3UodCx0aGlzLl9yb290LHRoaXMuX2NvbXBhcmF0b3IpLDAhPT10aGlzLl9jb21wYXJhdG9yKHQsdGhpcy5fcm9vdC5rZXkpKT9udWxsOnRoaXMuX3Jvb3R9LHQucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9yb290LG49dGhpcy5fY29tcGFyYXRvcjtlOyl7dmFyIHI9bih0LGUua2V5KTtpZigwPT09cilyZXR1cm4hMDtlPXI8MD9lLmxlZnQ6ZS5yaWdodH1yZXR1cm4hMX0sdC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLl9yb290LHI9W10saT0hMTshaTspbnVsbCE9PW4/KHIucHVzaChuKSxuPW4ubGVmdCk6MCE9PXIubGVuZ3RoPyhuPXIucG9wKCksdC5jYWxsKGUsbiksbj1uLnJpZ2h0KTppPSEwO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5yYW5nZT1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9W10sbz10aGlzLl9jb21wYXJhdG9yLHM9dGhpcy5fcm9vdDswIT09aS5sZW5ndGh8fHM7KWlmKHMpaS5wdXNoKHMpLHM9cy5sZWZ0O2Vsc2V7aWYobygocz1pLnBvcCgpKS5rZXksZSk+MClicmVhaztpZihvKHMua2V5LHQpPj0wJiZuLmNhbGwocixzKSlyZXR1cm4gdGhpcztzPXMucmlnaHR9cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmtleXM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLmtleTtyZXR1cm4gdC5wdXNoKG4pfSkpLHR9LHQucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWUuZGF0YTtyZXR1cm4gdC5wdXNoKG4pfSkpLHR9LHQucHJvdG90eXBlLm1pbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290P3RoaXMubWluTm9kZSh0aGlzLl9yb290KS5rZXk6bnVsbH0sdC5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3Q/dGhpcy5tYXhOb2RlKHRoaXMuX3Jvb3QpLmtleTpudWxsfSx0LnByb3RvdHlwZS5taW5Ob2RlPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQmJih0PXRoaXMuX3Jvb3QpLHQpZm9yKDt0LmxlZnQ7KXQ9dC5sZWZ0O3JldHVybiB0fSx0LnByb3RvdHlwZS5tYXhOb2RlPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQmJih0PXRoaXMuX3Jvb3QpLHQpZm9yKDt0LnJpZ2h0Oyl0PXQucmlnaHQ7cmV0dXJuIHR9LHQucHJvdG90eXBlLmF0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9yb290LG49ITEscj0wLGk9W107IW47KWlmKGUpaS5wdXNoKGUpLGU9ZS5sZWZ0O2Vsc2UgaWYoaS5sZW5ndGg+MCl7aWYoZT1pLnBvcCgpLHI9PT10KXJldHVybiBlO3IrKyxlPWUucmlnaHR9ZWxzZSBuPSEwO3JldHVybiBudWxsfSx0LnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3Jvb3Qsbj1udWxsO2lmKHQucmlnaHQpe2ZvcihuPXQucmlnaHQ7bi5sZWZ0OyluPW4ubGVmdDtyZXR1cm4gbn1mb3IodmFyIHI9dGhpcy5fY29tcGFyYXRvcjtlOyl7dmFyIGk9cih0LmtleSxlLmtleSk7aWYoMD09PWkpYnJlYWs7aTwwPyhuPWUsZT1lLmxlZnQpOmU9ZS5yaWdodH1yZXR1cm4gbn0sdC5wcm90b3R5cGUucHJldj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yb290LG49bnVsbDtpZihudWxsIT09dC5sZWZ0KXtmb3Iobj10LmxlZnQ7bi5yaWdodDspbj1uLnJpZ2h0O3JldHVybiBufWZvcih2YXIgcj10aGlzLl9jb21wYXJhdG9yO2U7KXt2YXIgaT1yKHQua2V5LGUua2V5KTtpZigwPT09aSlicmVhaztpPDA/ZT1lLmxlZnQ6KG49ZSxlPWUucmlnaHQpfXJldHVybiBufSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290PW51bGwsdGhpcy5fc2l6ZT0wLHRoaXN9LHQucHJvdG90eXBlLnRvTGlzdD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10LG49W10scj0hMSxpPW5ldyBwdShudWxsLG51bGwpLG89aTtmb3IoOyFyOyllPyhuLnB1c2goZSksZT1lLmxlZnQpOm4ubGVuZ3RoPjA/ZT0oZT1vPW8ubmV4dD1uLnBvcCgpKS5yaWdodDpyPSEwO3JldHVybiBvLm5leHQ9bnVsbCxpLm5leHR9KHRoaXMuX3Jvb3QpfSx0LnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1lJiYoZT1bXSksdm9pZCAwPT09biYmKG49ITEpO3ZhciByPXQubGVuZ3RoLGk9dGhpcy5fY29tcGFyYXRvcjtpZihuJiZFdSh0LGUsMCxyLTEsaSksbnVsbD09PXRoaXMuX3Jvb3QpdGhpcy5fcm9vdD1tdSh0LGUsMCxyKSx0aGlzLl9zaXplPXI7ZWxzZXt2YXIgbz1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IHB1KG51bGwsbnVsbCksaT1yLG89dCxzPWU7Zm9yKDtudWxsIT09byYmbnVsbCE9PXM7KW4oby5rZXkscy5rZXkpPDA/KGkubmV4dD1vLG89by5uZXh0KTooaS5uZXh0PXMscz1zLm5leHQpLGk9aS5uZXh0O251bGwhPT1vP2kubmV4dD1vOm51bGwhPT1zJiYoaS5uZXh0PXMpO3JldHVybiByLm5leHR9KHRoaXMudG9MaXN0KCksZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IHB1KG51bGwsbnVsbCkscj1uLGk9MDtpPHQubGVuZ3RoO2krKylyPXIubmV4dD1uZXcgcHUodFtpXSxlW2ldKTtyZXR1cm4gci5uZXh0PW51bGwsbi5uZXh0fSh0LGUpLGkpO3I9dGhpcy5fc2l6ZStyLHRoaXMuX3Jvb3Q9eHUoe2hlYWQ6b30sMCxyKX1yZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fcm9vdH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NpemV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJyb290Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0LmtleSl9KTt2YXIgZT1bXTtyZXR1cm4gdnUodGhpcy5fcm9vdCwiIiwhMCwoZnVuY3Rpb24odCl7cmV0dXJuIGUucHVzaCh0KX0pLHQpLGUuam9pbigiIil9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5fY29tcGFyYXRvcixpPXl1KHQsdGhpcy5fcm9vdCxyKSxvPWkubGVmdCxzPWkucmlnaHQ7cih0LGUpPDA/cz1kdShlLG4scyxyKTpvPWR1KGUsbixvLHIpLHRoaXMuX3Jvb3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT09ZT90OihudWxsPT09dHx8KChlPWd1KHQua2V5LGUsbikpLmxlZnQ9dCksZSl9KG8scyxyKX0sdC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHl1KHQsdGhpcy5fcm9vdCx0aGlzLl9jb21wYXJhdG9yKX0sdH0oKTtmdW5jdGlvbiBtdSh0LGUsbixyKXt2YXIgaT1yLW47aWYoaT4wKXt2YXIgbz1uK01hdGguZmxvb3IoaS8yKSxzPXRbb10sYT1lW29dLHU9bmV3IHB1KHMsYSk7cmV0dXJuIHUubGVmdD1tdSh0LGUsbixvKSx1LnJpZ2h0PW11KHQsZSxvKzEsciksdX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB4dSh0LGUsbil7dmFyIHI9bi1lO2lmKHI+MCl7dmFyIGk9ZStNYXRoLmZsb29yKHIvMiksbz14dSh0LGUsaSkscz10LmhlYWQ7cmV0dXJuIHMubGVmdD1vLHQuaGVhZD10LmhlYWQubmV4dCxzLnJpZ2h0PXh1KHQsaSsxLG4pLHN9cmV0dXJuIG51bGx9ZnVuY3Rpb24gRXUodCxlLG4scixpKXtpZighKG4+PXIpKXtmb3IodmFyIG89dFtuK3I+PjFdLHM9bi0xLGE9cisxOzspe2Rve3MrK313aGlsZShpKHRbc10sbyk8MCk7ZG97YS0tfXdoaWxlKGkodFthXSxvKT4wKTtpZihzPj1hKWJyZWFrO3ZhciB1PXRbc107dFtzXT10W2FdLHRbYV09dSx1PWVbc10sZVtzXT1lW2FdLGVbYV09dX1FdSh0LGUsbixhLGkpLEV1KHQsZSxhKzEscixpKX19ZnVuY3Rpb24gYnUodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiB3dSh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIEl1KHQsZSxuKXtyZXR1cm4gZSYmd3UodC5wcm90b3R5cGUsZSksbiYmd3UodCxuKSx0fXZhciBOdT1mdW5jdGlvbih0LGUpe3JldHVybiB0LmxsLng8PWUueCYmZS54PD10LnVyLngmJnQubGwueTw9ZS55JiZlLnk8PXQudXIueX0sU3U9ZnVuY3Rpb24odCxlKXtpZihlLnVyLng8dC5sbC54fHx0LnVyLng8ZS5sbC54fHxlLnVyLnk8dC5sbC55fHx0LnVyLnk8ZS5sbC55KXJldHVybiBudWxsO3ZhciBuPXQubGwueDxlLmxsLng/ZS5sbC54OnQubGwueCxyPXQudXIueDxlLnVyLng/dC51ci54OmUudXIueDtyZXR1cm57bGw6e3g6bix5OnQubGwueTxlLmxsLnk/ZS5sbC55OnQubGwueX0sdXI6e3g6cix5OnQudXIueTxlLnVyLnk/dC51ci55OmUudXIueX19fSxDdT1OdW1iZXIuRVBTSUxPTjt2b2lkIDA9PT1DdSYmKEN1PU1hdGgucG93KDIsLTUyKSk7dmFyIFB1PUN1KkN1LE11PWZ1bmN0aW9uKHQsZSl7aWYoLUN1PHQmJnQ8Q3UmJi1DdTxlJiZlPEN1KXJldHVybiAwO3ZhciBuPXQtZTtyZXR1cm4gbipuPFB1KnQqZT8wOnQ8ZT8tMToxfSxMdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtidSh0aGlzLHQpLHRoaXMucmVzZXQoKX1yZXR1cm4gSXUodCxbe2tleToicmVzZXQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy54Um91bmRlcj1uZXcgT3UsdGhpcy55Um91bmRlcj1uZXcgT3V9fSx7a2V5OiJyb3VuZCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm57eDp0aGlzLnhSb3VuZGVyLnJvdW5kKHQpLHk6dGhpcy55Um91bmRlci5yb3VuZChlKX19fV0pLHR9KCksT3U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7YnUodGhpcyx0KSx0aGlzLnRyZWU9bmV3IF91LHRoaXMucm91bmQoMCl9cmV0dXJuIEl1KHQsW3trZXk6InJvdW5kIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnRyZWUuYWRkKHQpLG49dGhpcy50cmVlLnByZXYoZSk7aWYobnVsbCE9PW4mJjA9PT1NdShlLmtleSxuLmtleSkpcmV0dXJuIHRoaXMudHJlZS5yZW1vdmUodCksbi5rZXk7dmFyIHI9dGhpcy50cmVlLm5leHQoZSk7cmV0dXJuIG51bGwhPT1yJiYwPT09TXUoZS5rZXksci5rZXkpPyh0aGlzLnRyZWUucmVtb3ZlKHQpLHIua2V5KTp0fX1dKSx0fSgpLFJ1PW5ldyBMdSxUdT1mdW5jdGlvbih0LGUpe3JldHVybiB0LngqZS55LXQueSplLnh9LEF1PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueCplLngrdC55KmUueX0sRHU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXt4OmUueC10LngseTplLnktdC55fSxpPXt4Om4ueC10LngseTpuLnktdC55fSxvPVR1KHIsaSk7cmV0dXJuIE11KG8sMCl9LEZ1PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoQXUodCx0KSl9LGt1PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj17eDplLngtdC54LHk6ZS55LXQueX0saT17eDpuLngtdC54LHk6bi55LXQueX07cmV0dXJuIEF1KGkscikvRnUoaSkvRnUocil9LEd1PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMD09PWUueT9udWxsOnt4OnQueCtlLngvZS55KihuLXQueSkseTpufX0scXU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiAwPT09ZS54P251bGw6e3g6bix5OnQueStlLnkvZS54KihuLXQueCl9fSxCdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtidSh0aGlzLHQpLHZvaWQgMD09PWUuZXZlbnRzP2UuZXZlbnRzPVt0aGlzXTplLmV2ZW50cy5wdXNoKHRoaXMpLHRoaXMucG9pbnQ9ZSx0aGlzLmlzTGVmdD1ufXJldHVybiBJdSh0LG51bGwsW3trZXk6ImNvbXBhcmUiLHZhbHVlOmZ1bmN0aW9uKGUsbil7dmFyIHI9dC5jb21wYXJlUG9pbnRzKGUucG9pbnQsbi5wb2ludCk7cmV0dXJuIDAhPT1yP3I6KGUucG9pbnQhPT1uLnBvaW50JiZlLmxpbmsobiksZS5pc0xlZnQhPT1uLmlzTGVmdD9lLmlzTGVmdD8xOi0xOmp1LmNvbXBhcmUoZS5zZWdtZW50LG4uc2VnbWVudCkpfX0se2tleToiY29tcGFyZVBvaW50cyIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC54PGUueD8tMTp0Lng+ZS54PzE6dC55PGUueT8tMTp0Lnk+ZS55PzE6MH19XSksSXUodCxbe2tleToibGluayIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodC5wb2ludD09PXRoaXMucG9pbnQpdGhyb3cgbmV3IEVycm9yKCJUcmllZCB0byBsaW5rIGFscmVhZHkgbGlua2VkIGV2ZW50cyIpO2Zvcih2YXIgZT10LnBvaW50LmV2ZW50cyxuPTAscj1lLmxlbmd0aDtuPHI7bisrKXt2YXIgaT1lW25dO3RoaXMucG9pbnQuZXZlbnRzLnB1c2goaSksaS5wb2ludD10aGlzLnBvaW50fXRoaXMuY2hlY2tGb3JDb25zdW1pbmcoKX19LHtrZXk6ImNoZWNrRm9yQ29uc3VtaW5nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnBvaW50LmV2ZW50cy5sZW5ndGgsZT0wO2U8dDtlKyspe3ZhciBuPXRoaXMucG9pbnQuZXZlbnRzW2VdO2lmKHZvaWQgMD09PW4uc2VnbWVudC5jb25zdW1lZEJ5KWZvcih2YXIgcj1lKzE7cjx0O3IrKyl7dmFyIGk9dGhpcy5wb2ludC5ldmVudHNbcl07dm9pZCAwPT09aS5jb25zdW1lZEJ5JiYobi5vdGhlclNFLnBvaW50LmV2ZW50cz09PWkub3RoZXJTRS5wb2ludC5ldmVudHMmJm4uc2VnbWVudC5jb25zdW1lKGkuc2VnbWVudCkpfX19fSx7a2V5OiJnZXRBdmFpbGFibGVMaW5rZWRFdmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMucG9pbnQuZXZlbnRzLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLnBvaW50LmV2ZW50c1tlXTtyIT09dGhpcyYmIXIuc2VnbWVudC5yaW5nT3V0JiZyLnNlZ21lbnQuaXNJblJlc3VsdCgpJiZ0LnB1c2gocil9cmV0dXJuIHR9fSx7a2V5OiJnZXRMZWZ0bW9zdENvbXBhcmF0b3IiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1uZXcgTWFwLHI9ZnVuY3Rpb24ocil7dmFyIGksbyxzLGEsdSxsPXIub3RoZXJTRTtuLnNldChyLHtzaW5lOihpPWUucG9pbnQsbz10LnBvaW50LHM9bC5wb2ludCxhPXt4Om8ueC1pLngseTpvLnktaS55fSx1PXt4OnMueC1pLngseTpzLnktaS55fSxUdSh1LGEpL0Z1KHUpL0Z1KGEpKSxjb3NpbmU6a3UoZS5wb2ludCx0LnBvaW50LGwucG9pbnQpfSl9O3JldHVybiBmdW5jdGlvbih0LGUpe24uaGFzKHQpfHxyKHQpLG4uaGFzKGUpfHxyKGUpO3ZhciBpPW4uZ2V0KHQpLG89aS5zaW5lLHM9aS5jb3NpbmUsYT1uLmdldChlKSx1PWEuc2luZSxsPWEuY29zaW5lO3JldHVybiBvPj0wJiZ1Pj0wP3M8bD8xOnM+bD8tMTowOm88MCYmdTwwP3M8bD8tMTpzPmw/MTowOnU8bz8tMTp1Pm8/MTowfX19XSksdH0oKSx6dT0wLGp1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4scixpKXtidSh0aGlzLHQpLHRoaXMuaWQ9Kyt6dSx0aGlzLmxlZnRTRT1lLGUuc2VnbWVudD10aGlzLGUub3RoZXJTRT1uLHRoaXMucmlnaHRTRT1uLG4uc2VnbWVudD10aGlzLG4ub3RoZXJTRT1lLHRoaXMucmluZ3M9cix0aGlzLndpbmRpbmdzPWl9cmV0dXJuIEl1KHQsbnVsbCxbe2tleToiY29tcGFyZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10LmxlZnRTRS5wb2ludC54LHI9ZS5sZWZ0U0UucG9pbnQueCxpPXQucmlnaHRTRS5wb2ludC54LG89ZS5yaWdodFNFLnBvaW50Lng7aWYobzxuKXJldHVybiAxO2lmKGk8cilyZXR1cm4tMTt2YXIgcz10LmxlZnRTRS5wb2ludC55LGE9ZS5sZWZ0U0UucG9pbnQueSx1PXQucmlnaHRTRS5wb2ludC55LGw9ZS5yaWdodFNFLnBvaW50Lnk7aWYobjxyKXtpZihhPHMmJmE8dSlyZXR1cm4gMTtpZihhPnMmJmE+dSlyZXR1cm4tMTt2YXIgYz10LmNvbXBhcmVQb2ludChlLmxlZnRTRS5wb2ludCk7aWYoYzwwKXJldHVybiAxO2lmKGM+MClyZXR1cm4tMTt2YXIgaD1lLmNvbXBhcmVQb2ludCh0LnJpZ2h0U0UucG9pbnQpO3JldHVybiAwIT09aD9oOi0xfWlmKG4+cil7aWYoczxhJiZzPGwpcmV0dXJuLTE7aWYocz5hJiZzPmwpcmV0dXJuIDE7dmFyIHA9ZS5jb21wYXJlUG9pbnQodC5sZWZ0U0UucG9pbnQpO2lmKDAhPT1wKXJldHVybiBwO3ZhciBmPXQuY29tcGFyZVBvaW50KGUucmlnaHRTRS5wb2ludCk7cmV0dXJuIGY8MD8xOmY+MD8tMToxfWlmKHM8YSlyZXR1cm4tMTtpZihzPmEpcmV0dXJuIDE7aWYoaTxvKXt2YXIgZz1lLmNvbXBhcmVQb2ludCh0LnJpZ2h0U0UucG9pbnQpO2lmKDAhPT1nKXJldHVybiBnfWlmKGk+byl7dmFyIGQ9dC5jb21wYXJlUG9pbnQoZS5yaWdodFNFLnBvaW50KTtpZihkPDApcmV0dXJuIDE7aWYoZD4wKXJldHVybi0xfWlmKGkhPT1vKXt2YXIgeT11LXMsdj1pLW4sXz1sLWEsbT1vLXI7aWYoeT52JiZfPG0pcmV0dXJuIDE7aWYoeTx2JiZfPm0pcmV0dXJuLTF9cmV0dXJuIGk+bz8xOmk8b3x8dTxsPy0xOnU+bD8xOnQuaWQ8ZS5pZD8tMTp0LmlkPmUuaWQ/MTowfX1dKSxJdSh0LFt7a2V5OiJyZXBsYWNlUmlnaHRTRSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5yaWdodFNFPXQsdGhpcy5yaWdodFNFLnNlZ21lbnQ9dGhpcyx0aGlzLnJpZ2h0U0Uub3RoZXJTRT10aGlzLmxlZnRTRSx0aGlzLmxlZnRTRS5vdGhlclNFPXRoaXMucmlnaHRTRX19LHtrZXk6ImJib3giLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZWZ0U0UucG9pbnQueSxlPXRoaXMucmlnaHRTRS5wb2ludC55O3JldHVybntsbDp7eDp0aGlzLmxlZnRTRS5wb2ludC54LHk6dDxlP3Q6ZX0sdXI6e3g6dGhpcy5yaWdodFNFLnBvaW50LngseTp0PmU/dDplfX19fSx7a2V5OiJ2ZWN0b3IiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3g6dGhpcy5yaWdodFNFLnBvaW50LngtdGhpcy5sZWZ0U0UucG9pbnQueCx5OnRoaXMucmlnaHRTRS5wb2ludC55LXRoaXMubGVmdFNFLnBvaW50Lnl9fX0se2tleToiaXNBbkVuZHBvaW50Iix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdC54PT09dGhpcy5sZWZ0U0UucG9pbnQueCYmdC55PT09dGhpcy5sZWZ0U0UucG9pbnQueXx8dC54PT09dGhpcy5yaWdodFNFLnBvaW50LngmJnQueT09PXRoaXMucmlnaHRTRS5wb2ludC55fX0se2tleToiY29tcGFyZVBvaW50Iix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLmlzQW5FbmRwb2ludCh0KSlyZXR1cm4gMDt2YXIgZT10aGlzLmxlZnRTRS5wb2ludCxuPXRoaXMucmlnaHRTRS5wb2ludCxyPXRoaXMudmVjdG9yKCk7aWYoZS54PT09bi54KXJldHVybiB0Lng9PT1lLng/MDp0Lng8ZS54PzE6LTE7dmFyIGk9KHQueS1lLnkpL3IueSxvPWUueCtpKnIueDtpZih0Lng9PT1vKXJldHVybiAwO3ZhciBzPSh0LngtZS54KS9yLngsYT1lLnkrcypyLnk7cmV0dXJuIHQueT09PWE/MDp0Lnk8YT8tMToxfX0se2tleToiZ2V0SW50ZXJzZWN0aW9uIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmJib3goKSxuPXQuYmJveCgpLHI9U3UoZSxuKTtpZihudWxsPT09cilyZXR1cm4gbnVsbDt2YXIgaT10aGlzLmxlZnRTRS5wb2ludCxvPXRoaXMucmlnaHRTRS5wb2ludCxzPXQubGVmdFNFLnBvaW50LGE9dC5yaWdodFNFLnBvaW50LHU9TnUoZSxzKSYmMD09PXRoaXMuY29tcGFyZVBvaW50KHMpLGw9TnUobixpKSYmMD09PXQuY29tcGFyZVBvaW50KGkpLGM9TnUoZSxhKSYmMD09PXRoaXMuY29tcGFyZVBvaW50KGEpLGg9TnUobixvKSYmMD09PXQuY29tcGFyZVBvaW50KG8pO2lmKGwmJnUpcmV0dXJuIGgmJiFjP286IWgmJmM/YTpudWxsO2lmKGwpcmV0dXJuIGMmJmkueD09PWEueCYmaS55PT09YS55P251bGw6aTtpZih1KXJldHVybiBoJiZvLng9PT1zLngmJm8ueT09PXMueT9udWxsOnM7aWYoaCYmYylyZXR1cm4gbnVsbDtpZihoKXJldHVybiBvO2lmKGMpcmV0dXJuIGE7dmFyIHA9ZnVuY3Rpb24odCxlLG4scil7aWYoMD09PWUueClyZXR1cm4gcXUobixyLHQueCk7aWYoMD09PXIueClyZXR1cm4gcXUodCxlLG4ueCk7aWYoMD09PWUueSlyZXR1cm4gR3UobixyLHQueSk7aWYoMD09PXIueSlyZXR1cm4gR3UodCxlLG4ueSk7dmFyIGk9VHUoZSxyKTtpZigwPT1pKXJldHVybiBudWxsO3ZhciBvPXt4Om4ueC10LngseTpuLnktdC55fSxzPVR1KG8sZSkvaSxhPVR1KG8scikvaTtyZXR1cm57eDoodC54K2EqZS54KyhuLngrcypyLngpKS8yLHk6KHQueSthKmUueSsobi55K3Mqci55KSkvMn19KGksdGhpcy52ZWN0b3IoKSxzLHQudmVjdG9yKCkpO3JldHVybiBudWxsPT09cD9udWxsOk51KHIscCk/UnUucm91bmQocC54LHAueSk6bnVsbH19LHtrZXk6InNwbGl0Iix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgbj1bXSxyPXZvaWQgMCE9PWUuZXZlbnRzLGk9bmV3IEJ1KGUsITApLG89bmV3IEJ1KGUsITEpLHM9dGhpcy5yaWdodFNFO3RoaXMucmVwbGFjZVJpZ2h0U0Uobyksbi5wdXNoKG8pLG4ucHVzaChpKTt2YXIgYT1uZXcgdChpLHMsdGhpcy5yaW5ncy5zbGljZSgpLHRoaXMud2luZGluZ3Muc2xpY2UoKSk7cmV0dXJuIEJ1LmNvbXBhcmVQb2ludHMoYS5sZWZ0U0UucG9pbnQsYS5yaWdodFNFLnBvaW50KT4wJiZhLnN3YXBFdmVudHMoKSxCdS5jb21wYXJlUG9pbnRzKHRoaXMubGVmdFNFLnBvaW50LHRoaXMucmlnaHRTRS5wb2ludCk+MCYmdGhpcy5zd2FwRXZlbnRzKCksciYmKGkuY2hlY2tGb3JDb25zdW1pbmcoKSxvLmNoZWNrRm9yQ29uc3VtaW5nKCkpLG59fSx7a2V5OiJzd2FwRXZlbnRzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmlnaHRTRTt0aGlzLnJpZ2h0U0U9dGhpcy5sZWZ0U0UsdGhpcy5sZWZ0U0U9dCx0aGlzLmxlZnRTRS5pc0xlZnQ9ITAsdGhpcy5yaWdodFNFLmlzTGVmdD0hMTtmb3IodmFyIGU9MCxuPXRoaXMud2luZGluZ3MubGVuZ3RoO2U8bjtlKyspdGhpcy53aW5kaW5nc1tlXSo9LTF9fSx7a2V5OiJjb25zdW1lIix2YWx1ZTpmdW5jdGlvbihlKXtmb3IodmFyIG49dGhpcyxyPWU7bi5jb25zdW1lZEJ5OyluPW4uY29uc3VtZWRCeTtmb3IoO3IuY29uc3VtZWRCeTspcj1yLmNvbnN1bWVkQnk7dmFyIGk9dC5jb21wYXJlKG4scik7aWYoMCE9PWkpe2lmKGk+MCl7dmFyIG89bjtuPXIscj1vfWlmKG4ucHJldj09PXIpe3ZhciBzPW47bj1yLHI9c31mb3IodmFyIGE9MCx1PXIucmluZ3MubGVuZ3RoO2E8dTthKyspe3ZhciBsPXIucmluZ3NbYV0sYz1yLndpbmRpbmdzW2FdLGg9bi5yaW5ncy5pbmRleE9mKGwpOy0xPT09aD8obi5yaW5ncy5wdXNoKGwpLG4ud2luZGluZ3MucHVzaChjKSk6bi53aW5kaW5nc1toXSs9Y31yLnJpbmdzPW51bGwsci53aW5kaW5ncz1udWxsLHIuY29uc3VtZWRCeT1uLHIubGVmdFNFLmNvbnN1bWVkQnk9bi5sZWZ0U0Usci5yaWdodFNFLmNvbnN1bWVkQnk9bi5yaWdodFNFfX19LHtrZXk6InByZXZJblJlc3VsdCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcHJldkluUmVzdWx0fHwodGhpcy5wcmV2P3RoaXMucHJldi5pc0luUmVzdWx0KCk/dGhpcy5fcHJldkluUmVzdWx0PXRoaXMucHJldjp0aGlzLl9wcmV2SW5SZXN1bHQ9dGhpcy5wcmV2LnByZXZJblJlc3VsdCgpOnRoaXMuX3ByZXZJblJlc3VsdD1udWxsKSx0aGlzLl9wcmV2SW5SZXN1bHR9fSx7a2V5OiJiZWZvcmVTdGF0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT10aGlzLl9iZWZvcmVTdGF0ZSlyZXR1cm4gdGhpcy5fYmVmb3JlU3RhdGU7aWYodGhpcy5wcmV2KXt2YXIgdD10aGlzLnByZXYuY29uc3VtZWRCeXx8dGhpcy5wcmV2O3RoaXMuX2JlZm9yZVN0YXRlPXQuYWZ0ZXJTdGF0ZSgpfWVsc2UgdGhpcy5fYmVmb3JlU3RhdGU9e3JpbmdzOltdLHdpbmRpbmdzOltdLG11bHRpUG9seXM6W119O3JldHVybiB0aGlzLl9iZWZvcmVTdGF0ZX19LHtrZXk6ImFmdGVyU3RhdGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodm9pZCAwIT09dGhpcy5fYWZ0ZXJTdGF0ZSlyZXR1cm4gdGhpcy5fYWZ0ZXJTdGF0ZTt2YXIgdD10aGlzLmJlZm9yZVN0YXRlKCk7dGhpcy5fYWZ0ZXJTdGF0ZT17cmluZ3M6dC5yaW5ncy5zbGljZSgwKSx3aW5kaW5nczp0LndpbmRpbmdzLnNsaWNlKDApLG11bHRpUG9seXM6W119O2Zvcih2YXIgZT10aGlzLl9hZnRlclN0YXRlLnJpbmdzLG49dGhpcy5fYWZ0ZXJTdGF0ZS53aW5kaW5ncyxyPXRoaXMuX2FmdGVyU3RhdGUubXVsdGlQb2x5cyxpPTAsbz10aGlzLnJpbmdzLmxlbmd0aDtpPG87aSsrKXt2YXIgcz10aGlzLnJpbmdzW2ldLGE9dGhpcy53aW5kaW5nc1tpXSx1PWUuaW5kZXhPZihzKTstMT09PXU/KGUucHVzaChzKSxuLnB1c2goYSkpOm5bdV0rPWF9Zm9yKHZhciBsPVtdLGM9W10saD0wLHA9ZS5sZW5ndGg7aDxwO2grKylpZigwIT09bltoXSl7dmFyIGY9ZVtoXSxnPWYucG9seTtpZigtMT09PWMuaW5kZXhPZihnKSlpZihmLmlzRXh0ZXJpb3IpbC5wdXNoKGcpO2Vsc2V7LTE9PT1jLmluZGV4T2YoZykmJmMucHVzaChnKTt2YXIgZD1sLmluZGV4T2YoZi5wb2x5KTstMSE9PWQmJmwuc3BsaWNlKGQsMSl9fWZvcih2YXIgeT0wLHY9bC5sZW5ndGg7eTx2O3krKyl7dmFyIF89bFt5XS5tdWx0aVBvbHk7LTE9PT1yLmluZGV4T2YoXykmJnIucHVzaChfKX1yZXR1cm4gdGhpcy5fYWZ0ZXJTdGF0ZX19LHtrZXk6ImlzSW5SZXN1bHQiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5jb25zdW1lZEJ5KXJldHVybiExO2lmKHZvaWQgMCE9PXRoaXMuX2lzSW5SZXN1bHQpcmV0dXJuIHRoaXMuX2lzSW5SZXN1bHQ7dmFyIHQ9dGhpcy5iZWZvcmVTdGF0ZSgpLm11bHRpUG9seXMsZT10aGlzLmFmdGVyU3RhdGUoKS5tdWx0aVBvbHlzO3N3aXRjaChRdS50eXBlKXtjYXNlInVuaW9uIjp2YXIgbj0wPT09dC5sZW5ndGgscj0wPT09ZS5sZW5ndGg7dGhpcy5faXNJblJlc3VsdD1uIT09cjticmVhaztjYXNlImludGVyc2VjdGlvbiI6dmFyIGksbzt0Lmxlbmd0aDxlLmxlbmd0aD8oaT10Lmxlbmd0aCxvPWUubGVuZ3RoKTooaT1lLmxlbmd0aCxvPXQubGVuZ3RoKSx0aGlzLl9pc0luUmVzdWx0PW89PT1RdS5udW1NdWx0aVBvbHlzJiZpPG87YnJlYWs7Y2FzZSJ4b3IiOnZhciBzPU1hdGguYWJzKHQubGVuZ3RoLWUubGVuZ3RoKTt0aGlzLl9pc0luUmVzdWx0PXMlMj09MTticmVhaztjYXNlImRpZmZlcmVuY2UiOnZhciBhPWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5sZW5ndGgmJnRbMF0uaXNTdWJqZWN0fTt0aGlzLl9pc0luUmVzdWx0PWEodCkhPT1hKGUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgb3BlcmF0aW9uIHR5cGUgZm91bmQgIi5jb25jYXQoUXUudHlwZSkpfXJldHVybiB0aGlzLl9pc0luUmVzdWx0fX1dLFt7a2V5OiJmcm9tUmluZyIsdmFsdWU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8scyxhPUJ1LmNvbXBhcmVQb2ludHMoZSxuKTtpZihhPDApaT1lLG89bixzPTE7ZWxzZXtpZighKGE+MCkpdGhyb3cgbmV3IEVycm9yKCJUcmllZCB0byBjcmVhdGUgZGVnZW5lcmF0ZSBzZWdtZW50IGF0IFsiLmNvbmNhdChlLngsIiwgIikuY29uY2F0KGUueSwiXSIpKTtpPW4sbz1lLHM9LTF9cmV0dXJuIG5ldyB0KG5ldyBCdShpLCEwKSxuZXcgQnUobywhMSksW3JdLFtzXSl9fV0pLHR9KCksVXU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixyKXtpZihidSh0aGlzLHQpLCFBcnJheS5pc0FycmF5KGUpfHwwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBnZW9tZXRyeSBpcyBub3QgYSB2YWxpZCBQb2x5Z29uIG9yIE11bHRpUG9seWdvbiIpO2lmKHRoaXMucG9seT1uLHRoaXMuaXNFeHRlcmlvcj1yLHRoaXMuc2VnbWVudHM9W10sIm51bWJlciIhPXR5cGVvZiBlWzBdWzBdfHwibnVtYmVyIiE9dHlwZW9mIGVbMF1bMV0pdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBnZW9tZXRyeSBpcyBub3QgYSB2YWxpZCBQb2x5Z29uIG9yIE11bHRpUG9seWdvbiIpO3ZhciBpPVJ1LnJvdW5kKGVbMF1bMF0sZVswXVsxXSk7dGhpcy5iYm94PXtsbDp7eDppLngseTppLnl9LHVyOnt4OmkueCx5OmkueX19O2Zvcih2YXIgbz1pLHM9MSxhPWUubGVuZ3RoO3M8YTtzKyspe2lmKCJudW1iZXIiIT10eXBlb2YgZVtzXVswXXx8Im51bWJlciIhPXR5cGVvZiBlW3NdWzFdKXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ2VvbWV0cnkgaXMgbm90IGEgdmFsaWQgUG9seWdvbiBvciBNdWx0aVBvbHlnb24iKTt2YXIgdT1SdS5yb3VuZChlW3NdWzBdLGVbc11bMV0pO3UueD09PW8ueCYmdS55PT09by55fHwodGhpcy5zZWdtZW50cy5wdXNoKGp1LmZyb21SaW5nKG8sdSx0aGlzKSksdS54PHRoaXMuYmJveC5sbC54JiYodGhpcy5iYm94LmxsLng9dS54KSx1Lnk8dGhpcy5iYm94LmxsLnkmJih0aGlzLmJib3gubGwueT11LnkpLHUueD50aGlzLmJib3gudXIueCYmKHRoaXMuYmJveC51ci54PXUueCksdS55PnRoaXMuYmJveC51ci55JiYodGhpcy5iYm94LnVyLnk9dS55KSxvPXUpfWkueD09PW8ueCYmaS55PT09by55fHx0aGlzLnNlZ21lbnRzLnB1c2goanUuZnJvbVJpbmcobyxpLHRoaXMpKX1yZXR1cm4gSXUodCxbe2tleToiZ2V0U3dlZXBFdmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuc2VnbWVudHMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuc2VnbWVudHNbZV07dC5wdXNoKHIubGVmdFNFKSx0LnB1c2goci5yaWdodFNFKX1yZXR1cm4gdH19XSksdH0oKSxWdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtpZihidSh0aGlzLHQpLCFBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ2VvbWV0cnkgaXMgbm90IGEgdmFsaWQgUG9seWdvbiBvciBNdWx0aVBvbHlnb24iKTt0aGlzLmV4dGVyaW9yUmluZz1uZXcgVXUoZVswXSx0aGlzLCEwKSx0aGlzLmJib3g9e2xsOnt4OnRoaXMuZXh0ZXJpb3JSaW5nLmJib3gubGwueCx5OnRoaXMuZXh0ZXJpb3JSaW5nLmJib3gubGwueX0sdXI6e3g6dGhpcy5leHRlcmlvclJpbmcuYmJveC51ci54LHk6dGhpcy5leHRlcmlvclJpbmcuYmJveC51ci55fX0sdGhpcy5pbnRlcmlvclJpbmdzPVtdO2Zvcih2YXIgcj0xLGk9ZS5sZW5ndGg7cjxpO3IrKyl7dmFyIG89bmV3IFV1KGVbcl0sdGhpcywhMSk7by5iYm94LmxsLng8dGhpcy5iYm94LmxsLngmJih0aGlzLmJib3gubGwueD1vLmJib3gubGwueCksby5iYm94LmxsLnk8dGhpcy5iYm94LmxsLnkmJih0aGlzLmJib3gubGwueT1vLmJib3gubGwueSksby5iYm94LnVyLng+dGhpcy5iYm94LnVyLngmJih0aGlzLmJib3gudXIueD1vLmJib3gudXIueCksby5iYm94LnVyLnk+dGhpcy5iYm94LnVyLnkmJih0aGlzLmJib3gudXIueT1vLmJib3gudXIueSksdGhpcy5pbnRlcmlvclJpbmdzLnB1c2gobyl9dGhpcy5tdWx0aVBvbHk9bn1yZXR1cm4gSXUodCxbe2tleToiZ2V0U3dlZXBFdmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZXh0ZXJpb3JSaW5nLmdldFN3ZWVwRXZlbnRzKCksZT0wLG49dGhpcy5pbnRlcmlvclJpbmdzLmxlbmd0aDtlPG47ZSsrKWZvcih2YXIgcj10aGlzLmludGVyaW9yUmluZ3NbZV0uZ2V0U3dlZXBFdmVudHMoKSxpPTAsbz1yLmxlbmd0aDtpPG87aSsrKXQucHVzaChyW2ldKTtyZXR1cm4gdH19XSksdH0oKSxYdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtpZihidSh0aGlzLHQpLCFBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ2VvbWV0cnkgaXMgbm90IGEgdmFsaWQgUG9seWdvbiBvciBNdWx0aVBvbHlnb24iKTt0cnl7Im51bWJlciI9PXR5cGVvZiBlWzBdWzBdWzBdJiYoZT1bZV0pfWNhdGNoKHQpe310aGlzLnBvbHlzPVtdLHRoaXMuYmJveD17bGw6e3g6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHk6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfSx1cjp7eDpOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkseTpOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFl9fTtmb3IodmFyIHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5ldyBWdShlW3JdLHRoaXMpO28uYmJveC5sbC54PHRoaXMuYmJveC5sbC54JiYodGhpcy5iYm94LmxsLng9by5iYm94LmxsLngpLG8uYmJveC5sbC55PHRoaXMuYmJveC5sbC55JiYodGhpcy5iYm94LmxsLnk9by5iYm94LmxsLnkpLG8uYmJveC51ci54PnRoaXMuYmJveC51ci54JiYodGhpcy5iYm94LnVyLng9by5iYm94LnVyLngpLG8uYmJveC51ci55PnRoaXMuYmJveC51ci55JiYodGhpcy5iYm94LnVyLnk9by5iYm94LnVyLnkpLHRoaXMucG9seXMucHVzaChvKX10aGlzLmlzU3ViamVjdD1ufXJldHVybiBJdSh0LFt7a2V5OiJnZXRTd2VlcEV2ZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5wb2x5cy5sZW5ndGg7ZTxuO2UrKylmb3IodmFyIHI9dGhpcy5wb2x5c1tlXS5nZXRTd2VlcEV2ZW50cygpLGk9MCxvPXIubGVuZ3RoO2k8bztpKyspdC5wdXNoKHJbaV0pO3JldHVybiB0fX1dKSx0fSgpLFl1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtidSh0aGlzLHQpLHRoaXMuZXZlbnRzPWU7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0uc2VnbWVudC5yaW5nT3V0PXRoaXM7dGhpcy5wb2x5PW51bGx9cmV0dXJuIEl1KHQsbnVsbCxbe2tleToiZmFjdG9yeSIsdmFsdWU6ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPVtdLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBvPWVbcl07aWYoby5pc0luUmVzdWx0KCkmJiFvLnJpbmdPdXQpe2Zvcih2YXIgcz1udWxsLGE9by5sZWZ0U0UsdT1vLnJpZ2h0U0UsbD1bYV0sYz1hLnBvaW50LGg9W107cz1hLGE9dSxsLnB1c2goYSksYS5wb2ludCE9PWM7KWZvcig7Oyl7dmFyIHA9YS5nZXRBdmFpbGFibGVMaW5rZWRFdmVudHMoKTtpZigwPT09cC5sZW5ndGgpe3ZhciBmPWxbMF0ucG9pbnQsZz1sW2wubGVuZ3RoLTFdLnBvaW50O3Rocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNvbXBsZXRlIG91dHB1dCByaW5nIHN0YXJ0aW5nIGF0IFsiLmNvbmNhdChmLngsIiwiKSsiICIuY29uY2F0KGYueSwiXS4gTGFzdCBtYXRjaGluZyBzZWdtZW50IGZvdW5kIGVuZHMgYXQiKSsiIFsiLmNvbmNhdChnLngsIiwgIikuY29uY2F0KGcueSwiXS4iKSl9aWYoMT09PXAubGVuZ3RoKXt1PXBbMF0ub3RoZXJTRTticmVha31mb3IodmFyIGQ9bnVsbCx5PTAsdj1oLmxlbmd0aDt5PHY7eSsrKWlmKGhbeV0ucG9pbnQ9PT1hLnBvaW50KXtkPXk7YnJlYWt9aWYobnVsbD09PWQpe2gucHVzaCh7aW5kZXg6bC5sZW5ndGgscG9pbnQ6YS5wb2ludH0pO3ZhciBfPWEuZ2V0TGVmdG1vc3RDb21wYXJhdG9yKHMpO3U9cC5zb3J0KF8pWzBdLm90aGVyU0U7YnJlYWt9dmFyIG09aC5zcGxpY2UoZClbMF0seD1sLnNwbGljZShtLmluZGV4KTt4LnVuc2hpZnQoeFswXS5vdGhlclNFKSxuLnB1c2gobmV3IHQoeC5yZXZlcnNlKCkpKX1uLnB1c2gobmV3IHQobCkpfX1yZXR1cm4gbn19XSksSXUodCxbe2tleToiZ2V0R2VvbSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5ldmVudHNbMF0ucG9pbnQsZT1bdF0sbj0xLHI9dGhpcy5ldmVudHMubGVuZ3RoLTE7bjxyO24rKyl7dmFyIGk9dGhpcy5ldmVudHNbbl0ucG9pbnQsbz10aGlzLmV2ZW50c1tuKzFdLnBvaW50OzAhPT1EdShpLHQsbykmJihlLnB1c2goaSksdD1pKX1pZigxPT09ZS5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIHM9ZVswXSxhPWVbMV07MD09PUR1KHMsdCxhKSYmZS5zaGlmdCgpLGUucHVzaChlWzBdKTtmb3IodmFyIHU9dGhpcy5pc0V4dGVyaW9yUmluZygpPzE6LTEsbD10aGlzLmlzRXh0ZXJpb3JSaW5nKCk/MDplLmxlbmd0aC0xLGM9dGhpcy5pc0V4dGVyaW9yUmluZygpP2UubGVuZ3RoOi0xLGg9W10scD1sO3AhPWM7cCs9dSloLnB1c2goW2VbcF0ueCxlW3BdLnldKTtyZXR1cm4gaH19LHtrZXk6ImlzRXh0ZXJpb3JSaW5nIix2YWx1ZTpmdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMuX2lzRXh0ZXJpb3JSaW5nKXt2YXIgdD10aGlzLmVuY2xvc2luZ1JpbmcoKTt0aGlzLl9pc0V4dGVyaW9yUmluZz0hdHx8IXQuaXNFeHRlcmlvclJpbmcoKX1yZXR1cm4gdGhpcy5faXNFeHRlcmlvclJpbmd9fSx7a2V5OiJlbmNsb3NpbmdSaW5nIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLl9lbmNsb3NpbmdSaW5nJiYodGhpcy5fZW5jbG9zaW5nUmluZz10aGlzLl9jYWxjRW5jbG9zaW5nUmluZygpKSx0aGlzLl9lbmNsb3NpbmdSaW5nfX0se2tleToiX2NhbGNFbmNsb3NpbmdSaW5nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmV2ZW50c1swXSxlPTEsbj10aGlzLmV2ZW50cy5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dGhpcy5ldmVudHNbZV07QnUuY29tcGFyZSh0LHIpPjAmJih0PXIpfWZvcih2YXIgaT10LnNlZ21lbnQucHJldkluUmVzdWx0KCksbz1pP2kucHJldkluUmVzdWx0KCk6bnVsbDs7KXtpZighaSlyZXR1cm4gbnVsbDtpZighbylyZXR1cm4gaS5yaW5nT3V0O2lmKG8ucmluZ091dCE9PWkucmluZ091dClyZXR1cm4gby5yaW5nT3V0LmVuY2xvc2luZ1JpbmcoKSE9PWkucmluZ091dD9pLnJpbmdPdXQ6aS5yaW5nT3V0LmVuY2xvc2luZ1JpbmcoKTtpPW8ucHJldkluUmVzdWx0KCksbz1pP2kucHJldkluUmVzdWx0KCk6bnVsbH19fV0pLHR9KCksSHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe2J1KHRoaXMsdCksdGhpcy5leHRlcmlvclJpbmc9ZSxlLnBvbHk9dGhpcyx0aGlzLmludGVyaW9yUmluZ3M9W119cmV0dXJuIEl1KHQsW3trZXk6ImFkZEludGVyaW9yIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmludGVyaW9yUmluZ3MucHVzaCh0KSx0LnBvbHk9dGhpc319LHtrZXk6ImdldEdlb20iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9W3RoaXMuZXh0ZXJpb3JSaW5nLmdldEdlb20oKV07aWYobnVsbD09PXRbMF0pcmV0dXJuIG51bGw7Zm9yKHZhciBlPTAsbj10aGlzLmludGVyaW9yUmluZ3MubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuaW50ZXJpb3JSaW5nc1tlXS5nZXRHZW9tKCk7bnVsbCE9PXImJnQucHVzaChyKX1yZXR1cm4gdH19XSksdH0oKSxXdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7YnUodGhpcyx0KSx0aGlzLnJpbmdzPWUsdGhpcy5wb2x5cz10aGlzLl9jb21wb3NlUG9seXMoZSl9cmV0dXJuIEl1KHQsW3trZXk6ImdldEdlb20iLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMucG9seXMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMucG9seXNbZV0uZ2V0R2VvbSgpO251bGwhPT1yJiZ0LnB1c2gocil9cmV0dXJuIHR9fSx7a2V5OiJfY29tcG9zZVBvbHlzIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5sZW5ndGg7bjxyO24rKyl7dmFyIGk9dFtuXTtpZighaS5wb2x5KWlmKGkuaXNFeHRlcmlvclJpbmcoKSllLnB1c2gobmV3IEh1KGkpKTtlbHNle3ZhciBvPWkuZW5jbG9zaW5nUmluZygpO28ucG9seXx8ZS5wdXNoKG5ldyBIdShvKSksby5wb2x5LmFkZEludGVyaW9yKGkpfX1yZXR1cm4gZX19XSksdH0oKSxKdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmp1LmNvbXBhcmU7YnUodGhpcyx0KSx0aGlzLnF1ZXVlPWUsdGhpcy50cmVlPW5ldyBfdShuKSx0aGlzLnNlZ21lbnRzPVtdfXJldHVybiBJdSh0LFt7a2V5OiJwcm9jZXNzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LnNlZ21lbnQsbj1bXTtpZih0LmNvbnN1bWVkQnkpcmV0dXJuIHQuaXNMZWZ0P3RoaXMucXVldWUucmVtb3ZlKHQub3RoZXJTRSk6dGhpcy50cmVlLnJlbW92ZShlKSxuO3ZhciByPXQuaXNMZWZ0P3RoaXMudHJlZS5pbnNlcnQoZSk6dGhpcy50cmVlLmZpbmQoZSk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZmluZCBzZWdtZW50ICMiLmNvbmNhdChlLmlkLCIgIikrIlsiLmNvbmNhdChlLmxlZnRTRS5wb2ludC54LCIsICIpLmNvbmNhdChlLmxlZnRTRS5wb2ludC55LCJdIC0+ICIpKyJbIi5jb25jYXQoZS5yaWdodFNFLnBvaW50LngsIiwgIikuY29uY2F0KGUucmlnaHRTRS5wb2ludC55LCJdICIpKyJpbiBTd2VlcExpbmUgdHJlZS4gUGxlYXNlIHN1Ym1pdCBhIGJ1ZyByZXBvcnQuIik7Zm9yKHZhciBpPXIsbz1yLHM9dm9pZCAwLGE9dm9pZCAwO3ZvaWQgMD09PXM7KW51bGw9PT0oaT10aGlzLnRyZWUucHJldihpKSk/cz1udWxsOnZvaWQgMD09PWkua2V5LmNvbnN1bWVkQnkmJihzPWkua2V5KTtmb3IoO3ZvaWQgMD09PWE7KW51bGw9PT0obz10aGlzLnRyZWUubmV4dChvKSk/YT1udWxsOnZvaWQgMD09PW8ua2V5LmNvbnN1bWVkQnkmJihhPW8ua2V5KTtpZih0LmlzTGVmdCl7dmFyIHU9bnVsbDtpZihzKXt2YXIgbD1zLmdldEludGVyc2VjdGlvbihlKTtpZihudWxsIT09bCYmKGUuaXNBbkVuZHBvaW50KGwpfHwodT1sKSwhcy5pc0FuRW5kcG9pbnQobCkpKWZvcih2YXIgYz10aGlzLl9zcGxpdFNhZmVseShzLGwpLGg9MCxwPWMubGVuZ3RoO2g8cDtoKyspbi5wdXNoKGNbaF0pfXZhciBmPW51bGw7aWYoYSl7dmFyIGc9YS5nZXRJbnRlcnNlY3Rpb24oZSk7aWYobnVsbCE9PWcmJihlLmlzQW5FbmRwb2ludChnKXx8KGY9ZyksIWEuaXNBbkVuZHBvaW50KGcpKSlmb3IodmFyIGQ9dGhpcy5fc3BsaXRTYWZlbHkoYSxnKSx5PTAsdj1kLmxlbmd0aDt5PHY7eSsrKW4ucHVzaChkW3ldKX1pZihudWxsIT09dXx8bnVsbCE9PWYpe3ZhciBfPW51bGw7aWYobnVsbD09PXUpXz1mO2Vsc2UgaWYobnVsbD09PWYpXz11O2Vsc2V7Xz1CdS5jb21wYXJlUG9pbnRzKHUsZik8PTA/dTpmfXRoaXMucXVldWUucmVtb3ZlKGUucmlnaHRTRSksbi5wdXNoKGUucmlnaHRTRSk7Zm9yKHZhciBtPWUuc3BsaXQoXykseD0wLEU9bS5sZW5ndGg7eDxFO3grKyluLnB1c2gobVt4XSl9bi5sZW5ndGg+MD8odGhpcy50cmVlLnJlbW92ZShlKSxuLnB1c2godCkpOih0aGlzLnNlZ21lbnRzLnB1c2goZSksZS5wcmV2PXMpfWVsc2V7aWYocyYmYSl7dmFyIGI9cy5nZXRJbnRlcnNlY3Rpb24oYSk7aWYobnVsbCE9PWIpe2lmKCFzLmlzQW5FbmRwb2ludChiKSlmb3IodmFyIHc9dGhpcy5fc3BsaXRTYWZlbHkocyxiKSxJPTAsTj13Lmxlbmd0aDtJPE47SSsrKW4ucHVzaCh3W0ldKTtpZighYS5pc0FuRW5kcG9pbnQoYikpZm9yKHZhciBTPXRoaXMuX3NwbGl0U2FmZWx5KGEsYiksQz0wLFA9Uy5sZW5ndGg7QzxQO0MrKyluLnB1c2goU1tDXSl9fXRoaXMudHJlZS5yZW1vdmUoZSl9cmV0dXJuIG59fSx7a2V5OiJfc3BsaXRTYWZlbHkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy50cmVlLnJlbW92ZSh0KTt2YXIgbj10LnJpZ2h0U0U7dGhpcy5xdWV1ZS5yZW1vdmUobik7dmFyIHI9dC5zcGxpdChlKTtyZXR1cm4gci5wdXNoKG4pLHZvaWQgMD09PXQuY29uc3VtZWRCeSYmdGhpcy50cmVlLmluc2VydCh0KSxyfX1dKSx0fSgpLFp1PSJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy5lbnYuUE9MWUdPTl9DTElQUElOR19NQVhfUVVFVUVfU0laRXx8MWU2LEt1PSJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy5lbnYuUE9MWUdPTl9DTElQUElOR19NQVhfU1dFRVBMSU5FX1NFR01FTlRTfHwxZTYsUXU9bmV3KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2J1KHRoaXMsdCl9cmV0dXJuIEl1KHQsW3trZXk6InJ1biIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe1F1LnR5cGU9dCxSdS5yZXNldCgpO2Zvcih2YXIgcj1bbmV3IFh1KGUsITApXSxpPTAsbz1uLmxlbmd0aDtpPG87aSsrKXIucHVzaChuZXcgWHUobltpXSwhMSkpO2lmKFF1Lm51bU11bHRpUG9seXM9ci5sZW5ndGgsImRpZmZlcmVuY2UiPT09UXUudHlwZSlmb3IodmFyIHM9clswXSxhPTE7YTxyLmxlbmd0aDspbnVsbCE9PVN1KHJbYV0uYmJveCxzLmJib3gpP2ErKzpyLnNwbGljZShhLDEpO2lmKCJpbnRlcnNlY3Rpb24iPT09UXUudHlwZSlmb3IodmFyIHU9MCxsPXIubGVuZ3RoO3U8bDt1KyspZm9yKHZhciBjPXJbdV0saD11KzEscD1yLmxlbmd0aDtoPHA7aCsrKWlmKG51bGw9PT1TdShjLmJib3gscltoXS5iYm94KSlyZXR1cm5bXTtmb3IodmFyIGY9bmV3IF91KEJ1LmNvbXBhcmUpLGc9MCxkPXIubGVuZ3RoO2c8ZDtnKyspZm9yKHZhciB5PXJbZ10uZ2V0U3dlZXBFdmVudHMoKSx2PTAsXz15Lmxlbmd0aDt2PF87disrKWlmKGYuaW5zZXJ0KHlbdl0pLGYuc2l6ZT5adSl0aHJvdyBuZXcgRXJyb3IoIkluZmluaXRlIGxvb3Agd2hlbiBwdXR0aW5nIHNlZ21lbnQgZW5kcG9pbnRzIGluIGEgcHJpb3JpdHkgcXVldWUgKHF1ZXVlIHNpemUgdG9vIGJpZykuIFBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydC4iKTtmb3IodmFyIG09bmV3IEp1KGYpLHg9Zi5zaXplLEU9Zi5wb3AoKTtFOyl7dmFyIGI9RS5rZXk7aWYoZi5zaXplPT09eCl7dmFyIHc9Yi5zZWdtZW50O3Rocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIHBvcCgpICIuY29uY2F0KGIuaXNMZWZ0PyJsZWZ0IjoicmlnaHQiLCIgU3dlZXBFdmVudCAiKSsiWyIuY29uY2F0KGIucG9pbnQueCwiLCAiKS5jb25jYXQoYi5wb2ludC55LCJdIGZyb20gc2VnbWVudCAjIikuY29uY2F0KHcuaWQsIiAiKSsiWyIuY29uY2F0KHcubGVmdFNFLnBvaW50LngsIiwgIikuY29uY2F0KHcubGVmdFNFLnBvaW50LnksIl0gLT4gIikrIlsiLmNvbmNhdCh3LnJpZ2h0U0UucG9pbnQueCwiLCAiKS5jb25jYXQody5yaWdodFNFLnBvaW50LnksIl0gZnJvbSBxdWV1ZS4gIikrIlBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydC4iKX1pZihmLnNpemU+WnUpdGhyb3cgbmV3IEVycm9yKCJJbmZpbml0ZSBsb29wIHdoZW4gcGFzc2luZyBzd2VlcCBsaW5lIG92ZXIgZW5kcG9pbnRzIChxdWV1ZSBzaXplIHRvbyBiaWcpLiBQbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQuIik7aWYobS5zZWdtZW50cy5sZW5ndGg+S3UpdGhyb3cgbmV3IEVycm9yKCJJbmZpbml0ZSBsb29wIHdoZW4gcGFzc2luZyBzd2VlcCBsaW5lIG92ZXIgZW5kcG9pbnRzICh0b28gbWFueSBzd2VlcCBsaW5lIHNlZ21lbnRzKS4gUGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0LiIpO2Zvcih2YXIgST1tLnByb2Nlc3MoYiksTj0wLFM9SS5sZW5ndGg7TjxTO04rKyl7dmFyIEM9SVtOXTt2b2lkIDA9PT1DLmNvbnN1bWVkQnkmJmYuaW5zZXJ0KEMpfXg9Zi5zaXplLEU9Zi5wb3AoKX1SdS5yZXNldCgpO3ZhciBQPVl1LmZhY3RvcnkobS5zZWdtZW50cyk7cmV0dXJuIG5ldyBXdShQKS5nZXRHZW9tKCl9fV0pLHR9KCkpLCR1PXt1bmlvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07cmV0dXJuIFF1LnJ1bigidW5pb24iLHQsbil9LGludGVyc2VjdGlvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07cmV0dXJuIFF1LnJ1bigiaW50ZXJzZWN0aW9uIix0LG4pfSx4b3I6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO3JldHVybiBRdS5ydW4oInhvciIsdCxuKX0sZGlmZmVyZW5jZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07cmV0dXJuIFF1LnJ1bigiZGlmZmVyZW5jZSIsdCxuKX19OyJmaWxsImluIEFycmF5LnByb3RvdHlwZXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwiZmlsbCIse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTpmdW5jdGlvbih0KXtpZihudWxsPT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3IodGhpcysiIGlzIG5vdCBhbiBvYmplY3QiKTt2YXIgZT1PYmplY3QodGhpcyksbj1NYXRoLm1heChNYXRoLm1pbihlLmxlbmd0aCw5MDA3MTk5MjU0NzQwOTkxKSwwKXx8MCxyPTEgaW4gYXJndW1lbnRzJiZwYXJzZUludChOdW1iZXIoYXJndW1lbnRzWzFdKSwxMCl8fDA7cj1yPDA/TWF0aC5tYXgobityLDApOk1hdGgubWluKHIsbik7dmFyIGk9MiBpbiBhcmd1bWVudHMmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9wYXJzZUludChOdW1iZXIoYXJndW1lbnRzWzJdKSwxMCl8fDA6bjtmb3IoaT1pPDA/TWF0aC5tYXgobithcmd1bWVudHNbMl0sMCk6TWF0aC5taW4oaSxuKTtyPGk7KWVbcl09dCwrK3I7cmV0dXJuIGV9LHdyaXRhYmxlOiEwfSksTnVtYmVyLmlzRmluaXRlPU51bWJlci5pc0Zpbml0ZXx8ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZpc0Zpbml0ZSh0KX0sTnVtYmVyLmlzSW50ZWdlcj1OdW1iZXIuaXNJbnRlZ2VyfHxmdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJmlzRmluaXRlKHQpJiZNYXRoLmZsb29yKHQpPT09dH0sTnVtYmVyLnBhcnNlRmxvYXQ9TnVtYmVyLnBhcnNlRmxvYXR8fHBhcnNlRmxvYXQsTnVtYmVyLmlzTmFOPU51bWJlci5pc05hTnx8ZnVuY3Rpb24odCl7cmV0dXJuIHQhPXR9LE1hdGgudHJ1bmM9TWF0aC50cnVuY3x8ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD9NYXRoLmNlaWwodCk6TWF0aC5mbG9vcih0KX07dmFyIHRsPWZ1bmN0aW9uKCl7fTt0bC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdGwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHRsfSx0bC5wcm90b3R5cGUuZXF1YWxzV2l0aFRvbGVyYW5jZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE1hdGguYWJzKHQtZSk8PW59O3ZhciBlbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLGUpLHRoaXMubmFtZT0iSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIix0aGlzLm1lc3NhZ2U9ZSx0aGlzLnN0YWNrPShuZXcgdCkuc3RhY2t9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEVycm9yKSxubD1mdW5jdGlvbigpe30scmw9e01BWF9WQUxVRTp7Y29uZmlndXJhYmxlOiEwfX07bmwuaXNOYU49ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlci5pc05hTih0KX0sbmwuZG91YmxlVG9Mb25nQml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sbmwubG9uZ0JpdHNUb0RvdWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sbmwuaXNJbmZpbml0ZT1mdW5jdGlvbih0KXtyZXR1cm4hTnVtYmVyLmlzRmluaXRlKHQpfSxybC5NQVhfVkFMVUUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE51bWJlci5NQVhfVkFMVUV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG5sLHJsKTt2YXIgaWw9ZnVuY3Rpb24oKXt9LG9sPWZ1bmN0aW9uKCl7fSxzbD1mdW5jdGlvbigpe307ZnVuY3Rpb24gYWwoKXt9dmFyIHVsPWZ1bmN0aW9uIHQoKXtpZih0aGlzLng9bnVsbCx0aGlzLnk9bnVsbCx0aGlzLno9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLng9MCx0aGlzLnk9MCx0aGlzLno9dC5OVUxMX09SRElOQVRFO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLng9ZS54LHRoaXMueT1lLnksdGhpcy56PWUuen1lbHNlIDI9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLng9YXJndW1lbnRzWzBdLHRoaXMueT1hcmd1bWVudHNbMV0sdGhpcy56PXQuTlVMTF9PUkRJTkFURSk6Mz09PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLng9YXJndW1lbnRzWzBdLHRoaXMueT1hcmd1bWVudHNbMV0sdGhpcy56PWFyZ3VtZW50c1syXSl9LGxsPXtEaW1lbnNpb25hbENvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0sc2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxOVUxMX09SRElOQVRFOntjb25maWd1cmFibGU6ITB9LFg6e2NvbmZpZ3VyYWJsZTohMH0sWTp7Y29uZmlndXJhYmxlOiEwfSxaOntjb25maWd1cmFibGU6ITB9fTt1bC5wcm90b3R5cGUuc2V0T3JkaW5hdGU9ZnVuY3Rpb24odCxlKXtzd2l0Y2godCl7Y2FzZSB1bC5YOnRoaXMueD1lO2JyZWFrO2Nhc2UgdWwuWTp0aGlzLnk9ZTticmVhaztjYXNlIHVsLlo6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgZWwoIkludmFsaWQgb3JkaW5hdGUgaW5kZXg6ICIrdCl9fSx1bC5wcm90b3R5cGUuZXF1YWxzMkQ9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLng9PT10LngmJnRoaXMueT09PXQueX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGwuZXF1YWxzV2l0aFRvbGVyYW5jZSh0aGlzLngsZS54LG4pJiYhIXRsLmVxdWFsc1dpdGhUb2xlcmFuY2UodGhpcy55LGUueSxuKX19LHVsLnByb3RvdHlwZS5nZXRPcmRpbmF0ZT1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSB1bC5YOnJldHVybiB0aGlzLng7Y2FzZSB1bC5ZOnJldHVybiB0aGlzLnk7Y2FzZSB1bC5aOnJldHVybiB0aGlzLnp9dGhyb3cgbmV3IGVsKCJJbnZhbGlkIG9yZGluYXRlIGluZGV4OiAiK3QpfSx1bC5wcm90b3R5cGUuZXF1YWxzM0Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD09PXQueCYmdGhpcy55PT09dC55JiYodGhpcy56PT09dC56fHxubC5pc05hTih0aGlzLnopKSYmbmwuaXNOYU4odC56KX0sdWwucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHVsJiZ0aGlzLmVxdWFsczJEKHQpfSx1bC5wcm90b3R5cGUuZXF1YWxJblo9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGwuZXF1YWxzV2l0aFRvbGVyYW5jZSh0aGlzLnosdC56LGUpfSx1bC5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMueDxlLng/LTE6dGhpcy54PmUueD8xOnRoaXMueTxlLnk/LTE6dGhpcy55PmUueT8xOjB9LHVsLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe30sdWwucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHVsKHRoaXMpfSx1bC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iKCIrdGhpcy54KyIsICIrdGhpcy55KyIsICIrdGhpcy56KyIpIn0sdWwucHJvdG90eXBlLmRpc3RhbmNlM0Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnkscj10aGlzLnotdC56O3JldHVybiBNYXRoLnNxcnQoZSplK24qbityKnIpfSx1bC5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIE1hdGguc3FydChlKmUrbipuKX0sdWwucHJvdG90eXBlLmhhc2hDb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9MTc7cmV0dXJuIHQ9MzcqKHQ9MzcqdCt1bC5oYXNoQ29kZSh0aGlzLngpKSt1bC5oYXNoQ29kZSh0aGlzLnkpfSx1bC5wcm90b3R5cGUuc2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXt0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQuen0sdWwucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2lsLG9sLGFsXX0sdWwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHVsfSx1bC5oYXNoQ29kZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1ubC5kb3VibGVUb0xvbmdCaXRzKHQpO3JldHVybiBNYXRoLnRydW5jKChlXmUpPj4+MzIpfX0sbGwuRGltZW5zaW9uYWxDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiBjbH0sbGwuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg1Y2JmMmMyMzVjN2U1ODAwfSxsbC5OVUxMX09SRElOQVRFLmdldD1mdW5jdGlvbigpe3JldHVybiBubC5OYU59LGxsLlguZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGxsLlkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LGxsLlouZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHVsLGxsKTt2YXIgY2w9ZnVuY3Rpb24odCl7aWYodGhpcy5fZGltZW5zaW9uc1RvVGVzdD0yLDA9PT1hcmd1bWVudHMubGVuZ3RoKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07aWYoMiE9PWUmJjMhPT1lKXRocm93IG5ldyBlbCgib25seSAyIG9yIDMgZGltZW5zaW9ucyBtYXkgYmUgc3BlY2lmaWVkIik7dGhpcy5fZGltZW5zaW9uc1RvVGVzdD1lfX07Y2wucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZSxpPWNsLmNvbXBhcmUobi54LHIueCk7aWYoMCE9PWkpcmV0dXJuIGk7dmFyIG89Y2wuY29tcGFyZShuLnksci55KTtyZXR1cm4gMCE9PW8/bzp0aGlzLl9kaW1lbnNpb25zVG9UZXN0PD0yPzA6Y2wuY29tcGFyZShuLnosci56KX0sY2wucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3NsXX0sY2wucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGNsfSxjbC5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTpubC5pc05hTih0KT9ubC5pc05hTihlKT8wOi0xOm5sLmlzTmFOKGUpPzE6MH07dmFyIGhsPWZ1bmN0aW9uKCl7fTtobC5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7fSxobC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0saGwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGhsfTt2YXIgcGw9ZnVuY3Rpb24oKXt9LGZsPXtJTlRFUklPUjp7Y29uZmlndXJhYmxlOiEwfSxCT1VOREFSWTp7Y29uZmlndXJhYmxlOiEwfSxFWFRFUklPUjp7Y29uZmlndXJhYmxlOiEwfSxOT05FOntjb25maWd1cmFibGU6ITB9fTtwbC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scGwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHBsfSxwbC50b0xvY2F0aW9uU3ltYm9sPWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlIHBsLkVYVEVSSU9SOnJldHVybiJlIjtjYXNlIHBsLkJPVU5EQVJZOnJldHVybiJiIjtjYXNlIHBsLklOVEVSSU9SOnJldHVybiJpIjtjYXNlIHBsLk5PTkU6cmV0dXJuIi0ifXRocm93IG5ldyBlbCgiVW5rbm93biBsb2NhdGlvbiB2YWx1ZTogIit0KX0sZmwuSU5URVJJT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGZsLkJPVU5EQVJZLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxmbC5FWFRFUklPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sZmwuTk9ORS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocGwsZmwpO3ZhciBnbD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmludGVyZmFjZXNfJiZ0LmludGVyZmFjZXNfKCkuaW5kZXhPZihlKT4tMX0sZGw9ZnVuY3Rpb24oKXt9LHlsPXtMT0dfMTA6e2NvbmZpZ3VyYWJsZTohMH19O2RsLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxkbC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZGx9LGRsLmxvZzEwPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGgubG9nKHQpO3JldHVybiBubC5pc0luZmluaXRlKGUpfHxubC5pc05hTihlKT9lOmUvZGwuTE9HXzEwfSxkbC5taW49ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dDtyZXR1cm4gZTxpJiYoaT1lKSxuPGkmJihpPW4pLHI8aSYmKGk9ciksaX0sZGwuY2xhbXA9ZnVuY3Rpb24oKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07cmV0dXJuIHQ8ZT9lOnQ+bj9uOnR9aWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMl0pJiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkmJk51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzFdKSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO3JldHVybiByPGk/aTpyPm8/bzpyfX0sZGwud3JhcD1mdW5jdGlvbih0LGUpe3JldHVybiB0PDA/ZS0gLXQlZTp0JWV9LGRsLm1heD1mdW5jdGlvbigpe2lmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj10O3JldHVybiBlPnImJihyPWUpLG4+ciYmKHI9bikscn1pZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzNdLHU9aTtyZXR1cm4gbz51JiYodT1vKSxzPnUmJih1PXMpLGE+dSYmKHU9YSksdX19LGRsLmF2ZXJhZ2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4odCtlKS8yfSx5bC5MT0dfMTAuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubG9nKDEwKX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGwseWwpO3ZhciB2bD1mdW5jdGlvbih0KXt0aGlzLnN0cj10fTt2bC5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKHQpe3RoaXMuc3RyKz10fSx2bC5wcm90b3R5cGUuc2V0Q2hhckF0PWZ1bmN0aW9uKHQsZSl7dGhpcy5zdHI9dGhpcy5zdHIuc3Vic3RyKDAsdCkrZSt0aGlzLnN0ci5zdWJzdHIodCsxKX0sdmwucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0cn07dmFyIF9sPWZ1bmN0aW9uKHQpe3RoaXMudmFsdWU9dH07X2wucHJvdG90eXBlLmludFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LF9sLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudmFsdWU8dD8tMTp0aGlzLnZhbHVlPnQ/MTowfSxfbC5pc05hTj1mdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyLmlzTmFOKHQpfTt2YXIgbWw9ZnVuY3Rpb24oKXt9O21sLmlzV2hpdGVzcGFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdDw9MzImJnQ+PTB8fDEyNz09PXR9LG1sLnRvVXBwZXJDYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9O3ZhciB4bD1mdW5jdGlvbiB0KCl7aWYodGhpcy5faGk9MCx0aGlzLl9sbz0wLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuaW5pdCgwKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuaW5pdChlKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMuaW5pdChuKX1lbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgcj1hcmd1bWVudHNbMF07dC5jYWxsKHRoaXMsdC5wYXJzZShyKSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXTt0aGlzLmluaXQoaSxvKX19LEVsPXtQSTp7Y29uZmlndXJhYmxlOiEwfSxUV09fUEk6e2NvbmZpZ3VyYWJsZTohMH0sUElfMjp7Y29uZmlndXJhYmxlOiEwfSxFOntjb25maWd1cmFibGU6ITB9LE5hTjp7Y29uZmlndXJhYmxlOiEwfSxFUFM6e2NvbmZpZ3VyYWJsZTohMH0sU1BMSVQ6e2NvbmZpZ3VyYWJsZTohMH0sTUFYX1BSSU5UX0RJR0lUUzp7Y29uZmlndXJhYmxlOiEwfSxURU46e2NvbmZpZ3VyYWJsZTohMH0sT05FOntjb25maWd1cmFibGU6ITB9LFNDSV9OT1RfRVhQT05FTlRfQ0hBUjp7Y29uZmlndXJhYmxlOiEwfSxTQ0lfTk9UX1pFUk86e2NvbmZpZ3VyYWJsZTohMH19O3hsLnByb3RvdHlwZS5sZT1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5faGk8dC5faGl8fHRoaXMuX2hpPT09dC5faGkpJiZ0aGlzLl9sbzw9dC5fbG99LHhsLnByb3RvdHlwZS5leHRyYWN0U2lnbmlmaWNhbnREaWdpdHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmFicygpLHI9eGwubWFnbml0dWRlKG4uX2hpKSxpPXhsLlRFTi5wb3cocik7KG49bi5kaXZpZGUoaSkpLmd0KHhsLlRFTik/KG49bi5kaXZpZGUoeGwuVEVOKSxyKz0xKTpuLmx0KHhsLk9ORSkmJihuPW4ubXVsdGlwbHkoeGwuVEVOKSxyLT0xKTtmb3IodmFyIG89cisxLHM9bmV3IHZsLGE9eGwuTUFYX1BSSU5UX0RJR0lUUy0xLHU9MDt1PD1hO3UrKyl7dCYmdT09PW8mJnMuYXBwZW5kKCIuIik7dmFyIGw9TWF0aC50cnVuYyhuLl9oaSk7aWYobDwwKWJyZWFrO3ZhciBjPSExLGg9MDtsPjk/KGM9ITAsaD0iOSIpOmg9IjAiK2wscy5hcHBlbmQoaCksbj1uLnN1YnRyYWN0KHhsLnZhbHVlT2YobCkpLm11bHRpcGx5KHhsLlRFTiksYyYmbi5zZWxmQWRkKHhsLlRFTik7dmFyIHA9ITAsZj14bC5tYWduaXR1ZGUobi5faGkpO2lmKGY8MCYmTWF0aC5hYnMoZik+PWEtdSYmKHA9ITEpLCFwKWJyZWFrfXJldHVybiBlWzBdPXIscy50b1N0cmluZygpfSx4bC5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGlwbHkodGhpcyl9LHhsLnByb3RvdHlwZS5kb3VibGVWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oaSt0aGlzLl9sb30seGwucHJvdG90eXBlLnN1YnRyYWN0PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB4bCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmFkZCh0Lm5lZ2F0ZSgpKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmFkZCgtZSl9fSx4bC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5faGk9PT10Ll9oaSYmdGhpcy5fbG89PT10Ll9sb319LHhsLnByb3RvdHlwZS5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuX2hpJiYwPT09dGhpcy5fbG99LHhsLnByb3RvdHlwZS5zZWxmU3VidHJhY3Q9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHhsKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuaXNOYU4oKT90aGlzOnRoaXMuc2VsZkFkZCgtdC5faGksLXQuX2xvKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczp0aGlzLnNlbGZBZGQoLWUsMCl9fSx4bC5wcm90b3R5cGUuZ2V0U3BlY2lhbE51bWJlclN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzWmVybygpPyIwLjAiOnRoaXMuaXNOYU4oKT8iTmFOICI6bnVsbH0seGwucHJvdG90eXBlLm1pbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZSh0KT90aGlzOnR9LHhsLnByb3RvdHlwZS5zZWxmRGl2aWRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgeGwpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmRGl2aWRlKHQuX2hpLHQuX2xvKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnNlbGZEaXZpZGUoZSwwKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9bnVsbCxvPW51bGwscz1udWxsLGE9bnVsbCx1PW51bGwsbD1udWxsLGM9bnVsbCxoPW51bGw7cmV0dXJuIHU9dGhpcy5faGkvbixoPShpPShsPXhsLlNQTElUKnUpLShpPWwtdSkpKihzPShoPXhsLlNQTElUKm4pLShzPWgtbikpLShjPXUqbikraSooYT1uLXMpKyhvPXUtaSkqcytvKmEsaD11KyhsPSh0aGlzLl9oaS1jLWgrdGhpcy5fbG8tdSpyKS9uKSx0aGlzLl9oaT1oLHRoaXMuX2xvPXUtaCtsLHRoaXN9fSx4bC5wcm90b3R5cGUuZHVtcD1mdW5jdGlvbigpe3JldHVybiJERDwiK3RoaXMuX2hpKyIsICIrdGhpcy5fbG8rIj4ifSx4bC5wcm90b3R5cGUuZGl2aWRlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB4bCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9bnVsbCxuPW51bGwscj1udWxsLGk9bnVsbCxvPW51bGwscz1udWxsLGE9bnVsbCx1PW51bGw7bj0obz10aGlzLl9oaS90Ll9oaSktKGU9KHM9eGwuU1BMSVQqbyktKGU9cy1vKSksdT1lKihyPSh1PXhsLlNQTElUKnQuX2hpKS0ocj11LXQuX2hpKSktKGE9byp0Ll9oaSkrZSooaT10Ll9oaS1yKStuKnIrbippO3ZhciBsPXU9bysocz0odGhpcy5faGktYS11K3RoaXMuX2xvLW8qdC5fbG8pL3QuX2hpKSxjPW8tdStzO3JldHVybiBuZXcgeGwobCxjKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGg9YXJndW1lbnRzWzBdO3JldHVybiBubC5pc05hTihoKT94bC5jcmVhdGVOYU4oKTp4bC5jb3B5KHRoaXMpLnNlbGZEaXZpZGUoaCwwKX19LHhsLnByb3RvdHlwZS5nZT1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5faGk+dC5faGl8fHRoaXMuX2hpPT09dC5faGkpJiZ0aGlzLl9sbz49dC5fbG99LHhsLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7aWYoMD09PXQpcmV0dXJuIHhsLnZhbHVlT2YoMSk7dmFyIGU9bmV3IHhsKHRoaXMpLG49eGwudmFsdWVPZigxKSxyPU1hdGguYWJzKHQpO2lmKHI+MSlmb3IoO3I+MDspciUyPT0xJiZuLnNlbGZNdWx0aXBseShlKSwoci89Mik+MCYmKGU9ZS5zcXIoKSk7ZWxzZSBuPWU7cmV0dXJuIHQ8MD9uLnJlY2lwcm9jYWwoKTpufSx4bC5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbigpe2lmKHRoaXMuaXNOYU4oKSlyZXR1cm4geGwuTmFOO3ZhciB0PU1hdGguY2VpbCh0aGlzLl9oaSksZT0wO3JldHVybiB0PT09dGhpcy5faGkmJihlPU1hdGguY2VpbCh0aGlzLl9sbykpLG5ldyB4bCh0LGUpfSx4bC5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX2hpPGUuX2hpPy0xOnRoaXMuX2hpPmUuX2hpPzE6dGhpcy5fbG88ZS5fbG8/LTE6dGhpcy5fbG8+ZS5fbG8/MTowfSx4bC5wcm90b3R5cGUucmludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczp0aGlzLmFkZCguNSkuZmxvb3IoKX0seGwucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB4bCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmluaXQodCksdGhpc31pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmluaXQoZSksdGhpc319LHhsLnByb3RvdHlwZS5tYXg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2UodCk/dGhpczp0fSx4bC5wcm90b3R5cGUuc3FydD1mdW5jdGlvbigpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIHhsLnZhbHVlT2YoMCk7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHhsLk5hTjt2YXIgdD0xL01hdGguc3FydCh0aGlzLl9oaSksZT10aGlzLl9oaSp0LG49eGwudmFsdWVPZihlKSxyPXRoaXMuc3VidHJhY3Qobi5zcXIoKSkuX2hpKiguNSp0KTtyZXR1cm4gbi5hZGQocil9LHhsLnByb3RvdHlwZS5zZWxmQWRkPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgeGwpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmQWRkKHQuX2hpLHQuX2xvKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdLG49bnVsbCxyPW51bGwsaT1udWxsLG89bnVsbCxzPW51bGwsYT1udWxsO3JldHVybiBvPShpPXRoaXMuX2hpK2UpLShzPWktdGhpcy5faGkpLHI9KGE9KG89ZS1zKyh0aGlzLl9oaS1vKSkrdGhpcy5fbG8pKyhpLShuPWkrYSkpLHRoaXMuX2hpPW4rcix0aGlzLl9sbz1yKyhuLXRoaXMuX2hpKSx0aGlzfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdT1hcmd1bWVudHNbMF0sbD1hcmd1bWVudHNbMV0sYz1udWxsLGg9bnVsbCxwPW51bGwsZj1udWxsLGc9bnVsbCxkPW51bGwseT1udWxsO2Y9dGhpcy5faGkrdSxoPXRoaXMuX2xvK2wsZz1mLShkPWYtdGhpcy5faGkpLHA9aC0oeT1oLXRoaXMuX2xvKTt2YXIgdj0oYz1mKyhkPShnPXUtZCsodGhpcy5faGktZykpK2gpKSsoZD0ocD1sLXkrKHRoaXMuX2xvLXApKSsoZCsoZi1jKSkpLF89ZCsoYy12KTtyZXR1cm4gdGhpcy5faGk9dix0aGlzLl9sbz1fLHRoaXN9fSx4bC5wcm90b3R5cGUuc2VsZk11bHRpcGx5PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgeGwpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmTXVsdGlwbHkodC5faGksdC5fbG8pfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc2VsZk11bHRpcGx5KGUsMCl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPW51bGwsbz1udWxsLHM9bnVsbCxhPW51bGwsdT1udWxsLGw9bnVsbDtpPSh1PXhsLlNQTElUKnRoaXMuX2hpKS10aGlzLl9oaSxsPXhsLlNQTElUKm4saT11LWksbz10aGlzLl9oaS1pLHM9bC1uO3ZhciBjPSh1PXRoaXMuX2hpKm4pKyhsPWkqKHM9bC1zKS11K2kqKGE9bi1zKStvKnMrbyphKyh0aGlzLl9oaSpyK3RoaXMuX2xvKm4pKSxoPWwrKGk9dS1jKTtyZXR1cm4gdGhpcy5faGk9Yyx0aGlzLl9sbz1oLHRoaXN9fSx4bC5wcm90b3R5cGUuc2VsZlNxcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGZNdWx0aXBseSh0aGlzKX0seGwucHJvdG90eXBlLmZsb29yPWZ1bmN0aW9uKCl7aWYodGhpcy5pc05hTigpKXJldHVybiB4bC5OYU47dmFyIHQ9TWF0aC5mbG9vcih0aGlzLl9oaSksZT0wO3JldHVybiB0PT09dGhpcy5faGkmJihlPU1hdGguZmxvb3IodGhpcy5fbG8pKSxuZXcgeGwodCxlKX0seGwucHJvdG90eXBlLm5lZ2F0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczpuZXcgeGwoLXRoaXMuX2hpLC10aGlzLl9sbyl9LHhsLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe30seGwucHJvdG90eXBlLm11bHRpcGx5PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB4bCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0LmlzTmFOKCk/eGwuY3JlYXRlTmFOKCk6eGwuY29weSh0aGlzKS5zZWxmTXVsdGlwbHkodCl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gbmwuaXNOYU4oZSk/eGwuY3JlYXRlTmFOKCk6eGwuY29weSh0aGlzKS5zZWxmTXVsdGlwbHkoZSwwKX19LHhsLnByb3RvdHlwZS5pc05hTj1mdW5jdGlvbigpe3JldHVybiBubC5pc05hTih0aGlzLl9oaSl9LHhsLnByb3RvdHlwZS5pbnRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBNYXRoLnRydW5jKHRoaXMuX2hpKX0seGwucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9eGwubWFnbml0dWRlKHRoaXMuX2hpKTtyZXR1cm4gdD49LTMmJnQ8PTIwP3RoaXMudG9TdGFuZGFyZE5vdGF0aW9uKCk6dGhpcy50b1NjaU5vdGF0aW9uKCl9LHhsLnByb3RvdHlwZS50b1N0YW5kYXJkTm90YXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFNwZWNpYWxOdW1iZXJTdHJpbmcoKTtpZihudWxsIT09dClyZXR1cm4gdDt2YXIgZT1uZXcgQXJyYXkoMSkuZmlsbChudWxsKSxuPXRoaXMuZXh0cmFjdFNpZ25pZmljYW50RGlnaXRzKCEwLGUpLHI9ZVswXSsxLGk9bjtpZigiLiI9PT1uLmNoYXJBdCgwKSlpPSIwIituO2Vsc2UgaWYocjwwKWk9IjAuIit4bC5zdHJpbmdPZkNoYXIoIjAiLC1yKStuO2Vsc2UgaWYoLTE9PT1uLmluZGV4T2YoIi4iKSl7dmFyIG89ci1uLmxlbmd0aDtpPW4reGwuc3RyaW5nT2ZDaGFyKCIwIixvKSsiLjAifXJldHVybiB0aGlzLmlzTmVnYXRpdmUoKT8iLSIraTppfSx4bC5wcm90b3R5cGUucmVjaXByb2NhbD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9bnVsbCxvPW51bGwscz1udWxsLGE9bnVsbDt0PShuPTEvdGhpcy5faGkpLShpPShzPXhsLlNQTElUKm4pLShpPXMtbikpLG89KGE9eGwuU1BMSVQqdGhpcy5faGkpLXRoaXMuX2hpO3ZhciB1PW4rKHM9KDEtKHI9bip0aGlzLl9oaSktKGE9aSoobz1hLW8pLXIraSooZT10aGlzLl9oaS1vKSt0Km8rdCplKS1uKnRoaXMuX2xvKS90aGlzLl9oaSk7cmV0dXJuIG5ldyB4bCh1LG4tdStzKX0seGwucHJvdG90eXBlLnRvU2NpTm90YXRpb249ZnVuY3Rpb24oKXtpZih0aGlzLmlzWmVybygpKXJldHVybiB4bC5TQ0lfTk9UX1pFUk87dmFyIHQ9dGhpcy5nZXRTcGVjaWFsTnVtYmVyU3RyaW5nKCk7aWYobnVsbCE9PXQpcmV0dXJuIHQ7dmFyIGU9bmV3IEFycmF5KDEpLmZpbGwobnVsbCksbj10aGlzLmV4dHJhY3RTaWduaWZpY2FudERpZ2l0cyghMSxlKSxyPXhsLlNDSV9OT1RfRVhQT05FTlRfQ0hBUitlWzBdO2lmKCIwIj09PW4uY2hhckF0KDApKXRocm93IG5ldyBFcnJvcigiRm91bmQgbGVhZGluZyB6ZXJvOiAiK24pO3ZhciBpPSIiO24ubGVuZ3RoPjEmJihpPW4uc3Vic3RyaW5nKDEpKTt2YXIgbz1uLmNoYXJBdCgwKSsiLiIraTtyZXR1cm4gdGhpcy5pc05lZ2F0aXZlKCk/Ii0iK28rcjpvK3J9LHhsLnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc05hTigpP3hsLk5hTjp0aGlzLmlzTmVnYXRpdmUoKT90aGlzLm5lZ2F0ZSgpOm5ldyB4bCh0aGlzKX0seGwucHJvdG90eXBlLmlzUG9zaXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5faGk+MHx8MD09PXRoaXMuX2hpKSYmdGhpcy5fbG8+MH0seGwucHJvdG90eXBlLmx0PWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9oaTx0Ll9oaXx8dGhpcy5faGk9PT10Ll9oaSkmJnRoaXMuX2xvPHQuX2xvfSx4bC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB4bCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB4bC5jb3B5KHRoaXMpLnNlbGZBZGQodCl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4geGwuY29weSh0aGlzKS5zZWxmQWRkKGUpfX0seGwucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9oaT10LHRoaXMuX2xvPTB9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHhsKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5faGk9ZS5faGksdGhpcy5fbG89ZS5fbG99fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLl9oaT1uLHRoaXMuX2xvPXJ9fSx4bC5wcm90b3R5cGUuZ3Q9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuX2hpPnQuX2hpfHx0aGlzLl9oaT09PXQuX2hpKSYmdGhpcy5fbG8+dC5fbG99LHhsLnByb3RvdHlwZS5pc05lZ2F0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuX2hpPDB8fDA9PT10aGlzLl9oaSkmJnRoaXMuX2xvPDB9LHhsLnByb3RvdHlwZS50cnVuYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/eGwuTmFOOnRoaXMuaXNQb3NpdGl2ZSgpP3RoaXMuZmxvb3IoKTp0aGlzLmNlaWwoKX0seGwucHJvdG90eXBlLnNpZ251bT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oaT4wPzE6dGhpcy5faGk8MD8tMTp0aGlzLl9sbz4wPzE6dGhpcy5fbG88MD8tMTowfSx4bC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bYWwsaWwsb2xdfSx4bC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geGx9LHhsLnNxcj1mdW5jdGlvbih0KXtyZXR1cm4geGwudmFsdWVPZih0KS5zZWxmTXVsdGlwbHkodCl9LHhsLnZhbHVlT2Y9ZnVuY3Rpb24oKXtpZigic3RyaW5nIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB4bC5wYXJzZSh0KX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBuZXcgeGwoZSl9fSx4bC5zcXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB4bC52YWx1ZU9mKHQpLnNxcnQoKX0seGwucGFyc2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDttbC5pc1doaXRlc3BhY2UodC5jaGFyQXQoZSkpOyllKys7dmFyIHI9ITE7aWYoZTxuKXt2YXIgaT10LmNoYXJBdChlKTsiLSIhPT1pJiYiKyIhPT1pfHwoZSsrLCItIj09PWkmJihyPSEwKSl9Zm9yKHZhciBvPW5ldyB4bCxzPTAsYT0wLHU9MDshKGU+PW4pOyl7dmFyIGw9dC5jaGFyQXQoZSk7aWYoZSsrLG1sLmlzRGlnaXQobCkpe3ZhciBjPWwtIjAiO28uc2VsZk11bHRpcGx5KHhsLlRFTiksby5zZWxmQWRkKGMpLHMrK31lbHNle2lmKCIuIiE9PWwpe2lmKCJlIj09PWx8fCJFIj09PWwpe3ZhciBoPXQuc3Vic3RyaW5nKGUpO3RyeXt1PV9sLnBhcnNlSW50KGgpfWNhdGNoKGUpe3Rocm93IGUgaW5zdGFuY2VvZiBFcnJvcj9uZXcgRXJyb3IoIkludmFsaWQgZXhwb25lbnQgIitoKyIgaW4gc3RyaW5nICIrdCk6ZX1icmVha310aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICciK2wrIicgYXQgcG9zaXRpb24gIitlKyIgaW4gc3RyaW5nICIrdCl9YT1zfX12YXIgcD1vLGY9cy1hLXU7aWYoMD09PWYpcD1vO2Vsc2UgaWYoZj4wKXt2YXIgZz14bC5URU4ucG93KGYpO3A9by5kaXZpZGUoZyl9ZWxzZSBpZihmPDApe3ZhciBkPXhsLlRFTi5wb3coLWYpO3A9by5tdWx0aXBseShkKX1yZXR1cm4gcj9wLm5lZ2F0ZSgpOnB9LHhsLmNyZWF0ZU5hTj1mdW5jdGlvbigpe3JldHVybiBuZXcgeGwobmwuTmFOLG5sLk5hTil9LHhsLmNvcHk9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB4bCh0KX0seGwubWFnbml0dWRlPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguYWJzKHQpLG49TWF0aC5sb2coZSkvTWF0aC5sb2coMTApLHI9TWF0aC50cnVuYyhNYXRoLmZsb29yKG4pKTtyZXR1cm4gMTAqTWF0aC5wb3coMTAscik8PWUmJihyKz0xKSxyfSx4bC5zdHJpbmdPZkNoYXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IHZsLHI9MDtyPGU7cisrKW4uYXBwZW5kKHQpO3JldHVybiBuLnRvU3RyaW5nKCl9LEVsLlBJLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgeGwoMy4xNDE1OTI2NTM1ODk3OTMsMTIyNDY0Njc5OTE0NzM1MzJlLTMyKX0sRWwuVFdPX1BJLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgeGwoNi4yODMxODUzMDcxNzk1ODYsMjQ0OTI5MzU5ODI5NDcwNjRlLTMyKX0sRWwuUElfMi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHhsKDEuNTcwNzk2MzI2Nzk0ODk2Niw2MTIzMjMzOTk1NzM2NzY2ZS0zMil9LEVsLkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB4bCgyLjcxODI4MTgyODQ1OTA0NSwxNDQ1NjQ2ODkxNzI5MjUwMmUtMzIpfSxFbC5OYU4uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB4bChubC5OYU4sbmwuTmFOKX0sRWwuRVBTLmdldD1mdW5jdGlvbigpe3JldHVybiAxMjMyNTk1MTY0NDA3ODNlLTQ2fSxFbC5TUExJVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTM0MjE3NzI5fSxFbC5NQVhfUFJJTlRfRElHSVRTLmdldD1mdW5jdGlvbigpe3JldHVybiAzMn0sRWwuVEVOLmdldD1mdW5jdGlvbigpe3JldHVybiB4bC52YWx1ZU9mKDEwKX0sRWwuT05FLmdldD1mdW5jdGlvbigpe3JldHVybiB4bC52YWx1ZU9mKDEpfSxFbC5TQ0lfTk9UX0VYUE9ORU5UX0NIQVIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIkUifSxFbC5TQ0lfTk9UX1pFUk8uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIjAuMEUwIn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeGwsRWwpO3ZhciBibD1mdW5jdGlvbigpe30sd2w9e0RQX1NBRkVfRVBTSUxPTjp7Y29uZmlndXJhYmxlOiEwfX07YmwucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGJsLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBibH0sYmwub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbih0LGUsbil7dmFyIHI9Ymwub3JpZW50YXRpb25JbmRleEZpbHRlcih0LGUsbik7aWYocjw9MSlyZXR1cm4gcjt2YXIgaT14bC52YWx1ZU9mKGUueCkuc2VsZkFkZCgtdC54KSxvPXhsLnZhbHVlT2YoZS55KS5zZWxmQWRkKC10LnkpLHM9eGwudmFsdWVPZihuLngpLnNlbGZBZGQoLWUueCksYT14bC52YWx1ZU9mKG4ueSkuc2VsZkFkZCgtZS55KTtyZXR1cm4gaS5zZWxmTXVsdGlwbHkoYSkuc2VsZlN1YnRyYWN0KG8uc2VsZk11bHRpcGx5KHMpKS5zaWdudW0oKX0sYmwuc2lnbk9mRGV0MngyPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0Lm11bHRpcGx5KHIpLnNlbGZTdWJ0cmFjdChlLm11bHRpcGx5KG4pKS5zaWdudW0oKX0sYmwuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXhsLnZhbHVlT2Yoci55KS5zZWxmU3VidHJhY3Qobi55KS5zZWxmTXVsdGlwbHkoeGwudmFsdWVPZihlLngpLnNlbGZTdWJ0cmFjdCh0LngpKSxvPXhsLnZhbHVlT2Yoci54KS5zZWxmU3VidHJhY3Qobi54KS5zZWxmTXVsdGlwbHkoeGwudmFsdWVPZihlLnkpLnNlbGZTdWJ0cmFjdCh0LnkpKSxzPWkuc3VidHJhY3QobyksYT14bC52YWx1ZU9mKHIueCkuc2VsZlN1YnRyYWN0KG4ueCkuc2VsZk11bHRpcGx5KHhsLnZhbHVlT2YodC55KS5zZWxmU3VidHJhY3Qobi55KSksdT14bC52YWx1ZU9mKHIueSkuc2VsZlN1YnRyYWN0KG4ueSkuc2VsZk11bHRpcGx5KHhsLnZhbHVlT2YodC54KS5zZWxmU3VidHJhY3Qobi54KSksbD1hLnN1YnRyYWN0KHUpLnNlbGZEaXZpZGUocykuZG91YmxlVmFsdWUoKSxjPXhsLnZhbHVlT2YodC54KS5zZWxmQWRkKHhsLnZhbHVlT2YoZS54KS5zZWxmU3VidHJhY3QodC54KS5zZWxmTXVsdGlwbHkobCkpLmRvdWJsZVZhbHVlKCksaD14bC52YWx1ZU9mKGUueCkuc2VsZlN1YnRyYWN0KHQueCkuc2VsZk11bHRpcGx5KHhsLnZhbHVlT2YodC55KS5zZWxmU3VidHJhY3Qobi55KSkscD14bC52YWx1ZU9mKGUueSkuc2VsZlN1YnRyYWN0KHQueSkuc2VsZk11bHRpcGx5KHhsLnZhbHVlT2YodC54KS5zZWxmU3VidHJhY3Qobi54KSksZj1oLnN1YnRyYWN0KHApLnNlbGZEaXZpZGUocykuZG91YmxlVmFsdWUoKSxnPXhsLnZhbHVlT2Yobi55KS5zZWxmQWRkKHhsLnZhbHVlT2Yoci55KS5zZWxmU3VidHJhY3Qobi55KS5zZWxmTXVsdGlwbHkoZikpLmRvdWJsZVZhbHVlKCk7cmV0dXJuIG5ldyB1bChjLGcpfSxibC5vcmllbnRhdGlvbkluZGV4RmlsdGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1udWxsLGk9KHQueC1uLngpKihlLnktbi55KSxvPSh0Lnktbi55KSooZS54LW4ueCkscz1pLW87aWYoaT4wKXtpZihvPD0wKXJldHVybiBibC5zaWdudW0ocyk7cj1pK299ZWxzZXtpZighKGk8MCkpcmV0dXJuIGJsLnNpZ251bShzKTtpZihvPj0wKXJldHVybiBibC5zaWdudW0ocyk7cj0taS1vfXZhciBhPWJsLkRQX1NBRkVfRVBTSUxPTipyO3JldHVybiBzPj1hfHwtcz49YT9ibC5zaWdudW0ocyk6Mn0sYmwuc2lnbnVtPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sd2wuRFBfU0FGRV9FUFNJTE9OLmdldD1mdW5jdGlvbigpe3JldHVybiAxZS0xNX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYmwsd2wpO3ZhciBJbD1mdW5jdGlvbigpe30sTmw9e1g6e2NvbmZpZ3VyYWJsZTohMH0sWTp7Y29uZmlndXJhYmxlOiEwfSxaOntjb25maWd1cmFibGU6ITB9LE06e2NvbmZpZ3VyYWJsZTohMH19O05sLlguZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LE5sLlkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LE5sLlouZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LE5sLk0uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LElsLnByb3RvdHlwZS5zZXRPcmRpbmF0ZT1mdW5jdGlvbih0LGUsbil7fSxJbC5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe30sSWwucHJvdG90eXBlLmdldE9yZGluYXRlPWZ1bmN0aW9uKHQsZSl7fSxJbC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe30sSWwucHJvdG90eXBlLmdldENvb3JkaW5hdGVDb3B5PWZ1bmN0aW9uKHQpe30sSWwucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe30sSWwucHJvdG90eXBlLmdldFg9ZnVuY3Rpb24odCl7fSxJbC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt9LElsLnByb3RvdHlwZS5leHBhbmRFbnZlbG9wZT1mdW5jdGlvbih0KXt9LElsLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7fSxJbC5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbih0KXt9LElsLnByb3RvdHlwZS50b0Nvb3JkaW5hdGVBcnJheT1mdW5jdGlvbigpe30sSWwucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW29sXX0sSWwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIElsfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhJbCxObCk7dmFyIFNsPWZ1bmN0aW9uKCl7fSxDbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMsIlByb2plY3RpdmUgcG9pbnQgbm90IHJlcHJlc2VudGFibGUgb24gdGhlIENhcnRlc2lhbiBwbGFuZS4iKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oU2wpLFBsPWZ1bmN0aW9uKCl7fTtQbC5hcnJheWNvcHk9ZnVuY3Rpb24odCxlLG4scixpKXtmb3IodmFyIG89MCxzPWU7czxlK2k7cysrKW5bcitvXT10W3NdLG8rK30sUGwuZ2V0UHJvcGVydHk9ZnVuY3Rpb24odCl7cmV0dXJueyJsaW5lLnNlcGFyYXRvciI6IlxuIn1bdF19O3ZhciBNbD1mdW5jdGlvbiB0KCl7aWYodGhpcy54PW51bGwsdGhpcy55PW51bGwsdGhpcy53PW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy54PTAsdGhpcy55PTAsdGhpcy53PTE7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMueD1lLngsdGhpcy55PWUueSx0aGlzLnc9MX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLng9bix0aGlzLnk9cix0aGlzLnc9MX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0KXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV07dGhpcy54PWkueSpvLnctby55Kmkudyx0aGlzLnk9by54Kmkudy1pLngqby53LHRoaXMudz1pLngqby55LW8ueCppLnl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV07dGhpcy54PXMueS1hLnksdGhpcy55PWEueC1zLngsdGhpcy53PXMueCphLnktYS54KnMueX19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHU9YXJndW1lbnRzWzBdLGw9YXJndW1lbnRzWzFdLGM9YXJndW1lbnRzWzJdO3RoaXMueD11LHRoaXMueT1sLHRoaXMudz1jfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBoPWFyZ3VtZW50c1swXSxwPWFyZ3VtZW50c1sxXSxmPWFyZ3VtZW50c1syXSxnPWFyZ3VtZW50c1szXSxkPWgueS1wLnkseT1wLngtaC54LHY9aC54KnAueS1wLngqaC55LF89Zi55LWcueSxtPWcueC1mLngseD1mLngqZy55LWcueCpmLnk7dGhpcy54PXkqeC1tKnYsdGhpcy55PV8qdi1kKngsdGhpcy53PWQqbS1fKnl9fTtNbC5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbigpe3ZhciB0PXRoaXMueS90aGlzLnc7aWYobmwuaXNOYU4odCl8fG5sLmlzSW5maW5pdGUodCkpdGhyb3cgbmV3IENsO3JldHVybiB0fSxNbC5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe3ZhciB0PXRoaXMueC90aGlzLnc7aWYobmwuaXNOYU4odCl8fG5sLmlzSW5maW5pdGUodCkpdGhyb3cgbmV3IENsO3JldHVybiB0fSxNbC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyB1bDtyZXR1cm4gdC54PXRoaXMuZ2V0WCgpLHQueT10aGlzLmdldFkoKSx0fSxNbC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sTWwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE1sfSxNbC5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dC55LWUueSxvPWUueC10Lngscz10LngqZS55LWUueCp0LnksYT1uLnktci55LHU9ci54LW4ueCxsPW4ueCpyLnktci54Km4ueSxjPWkqdS1hKm8saD0obypsLXUqcykvYyxwPShhKnMtaSpsKS9jO2lmKG5sLmlzTmFOKGgpfHxubC5pc0luZmluaXRlKGgpfHxubC5pc05hTihwKXx8bmwuaXNJbmZpbml0ZShwKSl0aHJvdyBuZXcgQ2w7cmV0dXJuIG5ldyB1bChoLHApfTt2YXIgTGw9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX21pbng9bnVsbCx0aGlzLl9tYXh4PW51bGwsdGhpcy5fbWlueT1udWxsLHRoaXMuX21heHk9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLmluaXQoKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5pbml0KGUueCxlLngsZS55LGUueSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLmluaXQobil9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTt0aGlzLmluaXQoci54LGkueCxyLnksaS55KX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl0sdT1hcmd1bWVudHNbM107dGhpcy5pbml0KG8scyxhLHUpfX0sT2w9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O0xsLnByb3RvdHlwZS5nZXRBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSp0aGlzLmdldEhlaWdodCgpfSxMbC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIExsKSlyZXR1cm4hMTt2YXIgZT10O3JldHVybiB0aGlzLmlzTnVsbCgpP2UuaXNOdWxsKCk6dGhpcy5fbWF4eD09PWUuZ2V0TWF4WCgpJiZ0aGlzLl9tYXh5PT09ZS5nZXRNYXhZKCkmJnRoaXMuX21pbng9PT1lLmdldE1pblgoKSYmdGhpcy5fbWlueT09PWUuZ2V0TWluWSgpfSxMbC5wcm90b3R5cGUuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNOdWxsKCl8fHQuaXNOdWxsKCl8fCF0aGlzLmludGVyc2VjdHModCkpcmV0dXJuIG5ldyBMbDt2YXIgZT10aGlzLl9taW54PnQuX21pbng/dGhpcy5fbWlueDp0Ll9taW54LG49dGhpcy5fbWlueT50Ll9taW55P3RoaXMuX21pbnk6dC5fbWlueSxyPXRoaXMuX21heHg8dC5fbWF4eD90aGlzLl9tYXh4OnQuX21heHgsaT10aGlzLl9tYXh5PHQuX21heHk/dGhpcy5fbWF4eTp0Ll9tYXh5O3JldHVybiBuZXcgTGwoZSxyLG4saSl9LExsLnByb3RvdHlwZS5pc051bGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4eDx0aGlzLl9taW54fSxMbC5wcm90b3R5cGUuZ2V0TWF4WD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXh4fSxMbC5wcm90b3R5cGUuY292ZXJzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jb3ZlcnModC54LHQueSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBMbCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiF0aGlzLmlzTnVsbCgpJiYhZS5pc051bGwoKSYmKGUuZ2V0TWluWCgpPj10aGlzLl9taW54JiZlLmdldE1heFgoKTw9dGhpcy5fbWF4eCYmZS5nZXRNaW5ZKCk+PXRoaXMuX21pbnkmJmUuZ2V0TWF4WSgpPD10aGlzLl9tYXh5KX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3JldHVybiF0aGlzLmlzTnVsbCgpJiYobj49dGhpcy5fbWlueCYmbjw9dGhpcy5fbWF4eCYmcj49dGhpcy5fbWlueSYmcjw9dGhpcy5fbWF4eSl9fSxMbC5wcm90b3R5cGUuaW50ZXJzZWN0cz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIExsKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIXRoaXMuaXNOdWxsKCkmJiF0LmlzTnVsbCgpJiYhKHQuX21pbng+dGhpcy5fbWF4eHx8dC5fbWF4eDx0aGlzLl9taW54fHx0Ll9taW55PnRoaXMuX21heHl8fHQuX21heHk8dGhpcy5fbWlueSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB1bCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmludGVyc2VjdHMoZS54LGUueSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4hdGhpcy5pc051bGwoKSYmIShuPnRoaXMuX21heHh8fG48dGhpcy5fbWlueHx8cj50aGlzLl9tYXh5fHxyPHRoaXMuX21pbnkpfX0sTGwucHJvdG90eXBlLmdldE1pblk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWlueX0sTGwucHJvdG90eXBlLmdldE1pblg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWlueH0sTGwucHJvdG90eXBlLmV4cGFuZFRvSW5jbHVkZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5leHBhbmRUb0luY2x1ZGUodC54LHQueSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIExsKXt2YXIgZT1hcmd1bWVudHNbMF07aWYoZS5pc051bGwoKSlyZXR1cm4gbnVsbDt0aGlzLmlzTnVsbCgpPyh0aGlzLl9taW54PWUuZ2V0TWluWCgpLHRoaXMuX21heHg9ZS5nZXRNYXhYKCksdGhpcy5fbWlueT1lLmdldE1pblkoKSx0aGlzLl9tYXh5PWUuZ2V0TWF4WSgpKTooZS5fbWlueDx0aGlzLl9taW54JiYodGhpcy5fbWlueD1lLl9taW54KSxlLl9tYXh4PnRoaXMuX21heHgmJih0aGlzLl9tYXh4PWUuX21heHgpLGUuX21pbnk8dGhpcy5fbWlueSYmKHRoaXMuX21pbnk9ZS5fbWlueSksZS5fbWF4eT50aGlzLl9tYXh5JiYodGhpcy5fbWF4eT1lLl9tYXh5KSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLmlzTnVsbCgpPyh0aGlzLl9taW54PW4sdGhpcy5fbWF4eD1uLHRoaXMuX21pbnk9cix0aGlzLl9tYXh5PXIpOihuPHRoaXMuX21pbngmJih0aGlzLl9taW54PW4pLG4+dGhpcy5fbWF4eCYmKHRoaXMuX21heHg9bikscjx0aGlzLl9taW55JiYodGhpcy5fbWlueT1yKSxyPnRoaXMuX21heHkmJih0aGlzLl9tYXh5PXIpKX19LExsLnByb3RvdHlwZS5taW5FeHRlbnQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTnVsbCgpKXJldHVybiAwO3ZhciB0PXRoaXMuZ2V0V2lkdGgoKSxlPXRoaXMuZ2V0SGVpZ2h0KCk7cmV0dXJuIHQ8ZT90OmV9LExsLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTnVsbCgpPzA6dGhpcy5fbWF4eC10aGlzLl9taW54fSxMbC5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuaXNOdWxsKCk/ZS5pc051bGwoKT8wOi0xOmUuaXNOdWxsKCk/MTp0aGlzLl9taW54PGUuX21pbng/LTE6dGhpcy5fbWlueD5lLl9taW54PzE6dGhpcy5fbWlueTxlLl9taW55Py0xOnRoaXMuX21pbnk+ZS5fbWlueT8xOnRoaXMuX21heHg8ZS5fbWF4eD8tMTp0aGlzLl9tYXh4PmUuX21heHg/MTp0aGlzLl9tYXh5PGUuX21heHk/LTE6dGhpcy5fbWF4eT5lLl9tYXh5PzE6MH0sTGwucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuaXNOdWxsKCkpcmV0dXJuIG51bGw7dGhpcy5pbml0KHRoaXMuZ2V0TWluWCgpK3QsdGhpcy5nZXRNYXhYKCkrdCx0aGlzLmdldE1pblkoKStlLHRoaXMuZ2V0TWF4WSgpK2UpfSxMbC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iRW52WyIrdGhpcy5fbWlueCsiIDogIit0aGlzLl9tYXh4KyIsICIrdGhpcy5fbWlueSsiIDogIit0aGlzLl9tYXh5KyJdIn0sTGwucHJvdG90eXBlLnNldFRvTnVsbD1mdW5jdGlvbigpe3RoaXMuX21pbng9MCx0aGlzLl9tYXh4PS0xLHRoaXMuX21pbnk9MCx0aGlzLl9tYXh5PS0xfSxMbC5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/MDp0aGlzLl9tYXh5LXRoaXMuX21pbnl9LExsLnByb3RvdHlwZS5tYXhFeHRlbnQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTnVsbCgpKXJldHVybiAwO3ZhciB0PXRoaXMuZ2V0V2lkdGgoKSxlPXRoaXMuZ2V0SGVpZ2h0KCk7cmV0dXJuIHQ+ZT90OmV9LExsLnByb3RvdHlwZS5leHBhbmRCeT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5leHBhbmRCeSh0LHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLmlzTnVsbCgpKXJldHVybiBudWxsO3RoaXMuX21pbngtPWUsdGhpcy5fbWF4eCs9ZSx0aGlzLl9taW55LT1uLHRoaXMuX21heHkrPW4sKHRoaXMuX21pbng+dGhpcy5fbWF4eHx8dGhpcy5fbWlueT50aGlzLl9tYXh5KSYmdGhpcy5zZXRUb051bGwoKX19LExsLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIExsKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY292ZXJzKHQpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jb3ZlcnMoZSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5jb3ZlcnMobixyKX19LExsLnByb3RvdHlwZS5jZW50cmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc051bGwoKT9udWxsOm5ldyB1bCgodGhpcy5nZXRNaW5YKCkrdGhpcy5nZXRNYXhYKCkpLzIsKHRoaXMuZ2V0TWluWSgpK3RoaXMuZ2V0TWF4WSgpKS8yKX0sTGwucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLnNldFRvTnVsbCgpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmluaXQodC54LHQueCx0LnksdC55KX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTGwpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9taW54PWUuX21pbngsdGhpcy5fbWF4eD1lLl9tYXh4LHRoaXMuX21pbnk9ZS5fbWlueSx0aGlzLl9tYXh5PWUuX21heHl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLmluaXQobi54LHIueCxuLnksci55KX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbM107aTxvPyh0aGlzLl9taW54PWksdGhpcy5fbWF4eD1vKToodGhpcy5fbWlueD1vLHRoaXMuX21heHg9aSksczxhPyh0aGlzLl9taW55PXMsdGhpcy5fbWF4eT1hKToodGhpcy5fbWlueT1hLHRoaXMuX21heHk9cyl9fSxMbC5wcm90b3R5cGUuZ2V0TWF4WT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXh5fSxMbC5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCl7aWYodGhpcy5pbnRlcnNlY3RzKHQpKXJldHVybiAwO3ZhciBlPTA7dGhpcy5fbWF4eDx0Ll9taW54P2U9dC5fbWlueC10aGlzLl9tYXh4OnRoaXMuX21pbng+dC5fbWF4eCYmKGU9dGhpcy5fbWlueC10Ll9tYXh4KTt2YXIgbj0wO3JldHVybiB0aGlzLl9tYXh5PHQuX21pbnk/bj10Ll9taW55LXRoaXMuX21heHk6dGhpcy5fbWlueT50Ll9tYXh5JiYobj10aGlzLl9taW55LXQuX21heHkpLDA9PT1lP246MD09PW4/ZTpNYXRoLnNxcnQoZSplK24qbil9LExsLnByb3RvdHlwZS5oYXNoQ29kZT1mdW5jdGlvbigpe3ZhciB0PTE3O3JldHVybiB0PTM3Kih0PTM3Kih0PTM3Kih0PTM3KnQrdWwuaGFzaENvZGUodGhpcy5fbWlueCkpK3VsLmhhc2hDb2RlKHRoaXMuX21heHgpKSt1bC5oYXNoQ29kZSh0aGlzLl9taW55KSkrdWwuaGFzaENvZGUodGhpcy5fbWF4eSl9LExsLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpbCxhbF19LExsLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBMbH0sTGwuaW50ZXJzZWN0cz1mdW5jdGlvbigpe2lmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07cmV0dXJuIG4ueD49KHQueDxlLng/dC54OmUueCkmJm4ueDw9KHQueD5lLng/dC54OmUueCkmJm4ueT49KHQueTxlLnk/dC55OmUueSkmJm4ueTw9KHQueT5lLnk/dC55OmUueSl9aWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXSxzPWFyZ3VtZW50c1szXSxhPU1hdGgubWluKG8ueCxzLngpLHU9TWF0aC5tYXgoby54LHMueCksbD1NYXRoLm1pbihyLngsaS54KSxjPU1hdGgubWF4KHIueCxpLngpO3JldHVybiEobD51KSYmKCEoYzxhKSYmKGE9TWF0aC5taW4oby55LHMueSksdT1NYXRoLm1heChvLnkscy55KSxsPU1hdGgubWluKHIueSxpLnkpLGM9TWF0aC5tYXgoci55LGkueSksIShsPnUpJiYhKGM8YSkpKX19LE9sLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NTE4NDVjZDU1MjE4OTgwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTGwsT2wpO3ZhciBSbD17dHlwZVN0cjovXlxzKihcdyspXHMqXChccyooLiopXHMqXClccyokLyxlbXB0eVR5cGVTdHI6L15ccyooXHcrKVxzKkVNUFRZXHMqJC8sc3BhY2VzOi9ccysvLHBhcmVuQ29tbWE6L1wpXHMqLFxzKlwoLyxkb3VibGVQYXJlbkNvbW1hOi9cKVxzKlwpXHMqLFxzKlwoXHMqXCgvLHRyaW1QYXJlbnM6L15ccypcKD8oLio/KVwpP1xzKiQvfSxUbD1mdW5jdGlvbih0KXt0aGlzLmdlb21ldHJ5RmFjdG9yeT10fHxuZXcgX2h9O1RsLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlLG4scjt0PXQucmVwbGFjZSgvW1xuXHJdL2csIiAiKTt2YXIgaT1SbC50eXBlU3RyLmV4ZWModCk7aWYoLTEhPT10LnNlYXJjaCgiRU1QVFkiKSYmKChpPVJsLmVtcHR5VHlwZVN0ci5leGVjKHQpKVsyXT12b2lkIDApLGkmJihuPWlbMV0udG9Mb3dlckNhc2UoKSxyPWlbMl0sRGxbbl0mJihlPURsW25dLmFwcGx5KHRoaXMsW3JdKSkpLHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgcGFyc2UgV0tUICIrdCk7cmV0dXJuIGV9LFRsLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5leHRyYWN0R2VvbWV0cnkodCl9LFRsLnByb3RvdHlwZS5leHRyYWN0R2VvbWV0cnk9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRHZW9tZXRyeVR5cGUoKS50b0xvd2VyQ2FzZSgpO2lmKCFBbFtlXSlyZXR1cm4gbnVsbDt2YXIgbj1lLnRvVXBwZXJDYXNlKCk7cmV0dXJuIHQuaXNFbXB0eSgpP24rIiBFTVBUWSI6bisiKCIrQWxbZV0uYXBwbHkodGhpcyxbdF0pKyIpIn07dmFyIEFsPXtjb29yZGluYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0LngrIiAiK3QueX0scG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIEFsLmNvb3JkaW5hdGUuY2FsbCh0aGlzLHQuX2Nvb3JkaW5hdGVzLl9jb29yZGluYXRlc1swXSl9LG11bHRpcG9pbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX2dlb21ldHJpZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKCIoIitBbC5wb2ludC5hcHBseSh0aGlzLFt0Ll9nZW9tZXRyaWVzW25dXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9LGxpbmVzdHJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX3BvaW50cy5fY29vcmRpbmF0ZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKEFsLmNvb3JkaW5hdGUuYXBwbHkodGhpcyxbdC5fcG9pbnRzLl9jb29yZGluYXRlc1tuXV0pKTtyZXR1cm4gZS5qb2luKCIsIil9LGxpbmVhcnJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX3BvaW50cy5fY29vcmRpbmF0ZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKEFsLmNvb3JkaW5hdGUuYXBwbHkodGhpcyxbdC5fcG9pbnRzLl9jb29yZGluYXRlc1tuXV0pKTtyZXR1cm4gZS5qb2luKCIsIil9LG11bHRpbGluZXN0cmluZzpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fZ2VvbWV0cmllcy5sZW5ndGg7bjxyOysrbillLnB1c2goIigiK0FsLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbdC5fZ2VvbWV0cmllc1tuXV0pKyIpIik7cmV0dXJuIGUuam9pbigiLCIpfSxwb2x5Z29uOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2UucHVzaCgiKCIrQWwubGluZXN0cmluZy5hcHBseSh0aGlzLFt0Ll9zaGVsbF0pKyIpIik7Zm9yKHZhciBuPTAscj10Ll9ob2xlcy5sZW5ndGg7bjxyOysrbillLnB1c2goIigiK0FsLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbdC5faG9sZXNbbl1dKSsiKSIpO3JldHVybiBlLmpvaW4oIiwiKX0sbXVsdGlwb2x5Z29uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Ll9nZW9tZXRyaWVzLmxlbmd0aDtuPHI7KytuKWUucHVzaCgiKCIrQWwucG9seWdvbi5hcHBseSh0aGlzLFt0Ll9nZW9tZXRyaWVzW25dXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9LGdlb21ldHJ5Y29sbGVjdGlvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fZ2VvbWV0cmllcy5sZW5ndGg7bjxyOysrbillLnB1c2godGhpcy5leHRyYWN0R2VvbWV0cnkodC5fZ2VvbWV0cmllc1tuXSkpO3JldHVybiBlLmpvaW4oIiwiKX19LERsPXtwb2ludDpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2ludCgpO3ZhciBlPXQudHJpbSgpLnNwbGl0KFJsLnNwYWNlcyk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvaW50KG5ldyB1bChOdW1iZXIucGFyc2VGbG9hdChlWzBdKSxOdW1iZXIucGFyc2VGbG9hdChlWzFdKSkpfSxtdWx0aXBvaW50OmZ1bmN0aW9uKHQpe3ZhciBlO2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9pbnQoKTtmb3IodmFyIG49dC50cmltKCkuc3BsaXQoIiwiKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnJlcGxhY2UoUmwudHJpbVBhcmVucywiJDEiKSxyLnB1c2goRGwucG9pbnQuYXBwbHkodGhpcyxbZV0pKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlQb2ludChyKX0sbGluZXN0cmluZzpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQoIiwiKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnRyaW0oKS5zcGxpdChSbC5zcGFjZXMpLHIucHVzaChuZXcgdWwoTnVtYmVyLnBhcnNlRmxvYXQoZVswXSksTnVtYmVyLnBhcnNlRmxvYXQoZVsxXSkpKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZVN0cmluZyhyKX0sbGluZWFycmluZzpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQoIiwiKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnRyaW0oKS5zcGxpdChSbC5zcGFjZXMpLHIucHVzaChuZXcgdWwoTnVtYmVyLnBhcnNlRmxvYXQoZVswXSksTnVtYmVyLnBhcnNlRmxvYXQoZVsxXSkpKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhyKX0sbXVsdGlsaW5lc3RyaW5nOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpTGluZVN0cmluZygpO2Zvcih2YXIgbj10LnRyaW0oKS5zcGxpdChSbC5wYXJlbkNvbW1hKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnJlcGxhY2UoUmwudHJpbVBhcmVucywiJDEiKSxyLnB1c2goRGwubGluZXN0cmluZy5hcHBseSh0aGlzLFtlXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcocil9LHBvbHlnb246ZnVuY3Rpb24odCl7dmFyIGUsbixyO2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvbHlnb24oKTtmb3IodmFyIGksbz10LnRyaW0oKS5zcGxpdChSbC5wYXJlbkNvbW1hKSxzPVtdLGE9MCx1PW8ubGVuZ3RoO2E8dTsrK2EpZT1vW2FdLnJlcGxhY2UoUmwudHJpbVBhcmVucywiJDEiKSxuPURsLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbZV0pLHI9dGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhuLl9wb2ludHMpLDA9PT1hP2k9cjpzLnB1c2gocik7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvbHlnb24oaSxzKX0sbXVsdGlwb2x5Z29uOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9seWdvbigpO2Zvcih2YXIgbj10LnRyaW0oKS5zcGxpdChSbC5kb3VibGVQYXJlbkNvbW1hKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnJlcGxhY2UoUmwudHJpbVBhcmVucywiJDEiKSxyLnB1c2goRGwucG9seWdvbi5hcHBseSh0aGlzLFtlXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aVBvbHlnb24ocil9LGdlb21ldHJ5Y29sbGVjdGlvbjpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oKTtmb3IodmFyIGU9KHQ9dC5yZXBsYWNlKC8sXHMqKFtBLVphLXpdKS9nLCJ8JDEiKSkudHJpbSgpLnNwbGl0KCJ8Iiksbj1bXSxyPTAsaT1lLmxlbmd0aDtyPGk7KytyKW4ucHVzaCh0aGlzLnJlYWQoZVtyXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obil9fSxGbD1mdW5jdGlvbih0KXt0aGlzLnBhcnNlcj1uZXcgVGwodCl9O0ZsLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wYXJzZXIud3JpdGUodCl9LEZsLnRvTGluZVN0cmluZz1mdW5jdGlvbih0LGUpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIik7cmV0dXJuIkxJTkVTVFJJTkcgKCAiK3QueCsiICIrdC55KyIsICIrZS54KyIgIitlLnkrIiApIn07dmFyIGtsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMsZSksdGhpcy5uYW1lPSJSdW50aW1lRXhjZXB0aW9uIix0aGlzLm1lc3NhZ2U9ZSx0aGlzLnN0YWNrPShuZXcgdCkuc3RhY2t9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEVycm9yKSxHbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7aWYodC5jYWxsKHRoaXMpLDA9PT1hcmd1bWVudHMubGVuZ3RoKXQuY2FsbCh0aGlzKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dC5jYWxsKHRoaXMsZSl9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShrbCkscWw9ZnVuY3Rpb24oKXt9O3FsLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxxbC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcWx9LHFsLnNob3VsZE5ldmVyUmVhY2hIZXJlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcWwuc2hvdWxkTmV2ZXJSZWFjaEhlcmUobnVsbCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3Rocm93IG5ldyBHbCgiU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUiKyhudWxsIT09dD8iOiAiK3Q6IiIpKX19LHFsLmlzVHJ1ZT1mdW5jdGlvbigpe3ZhciB0O2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXFsLmlzVHJ1ZShhcmd1bWVudHNbMF0sbnVsbCk7ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmKHQ9YXJndW1lbnRzWzFdLCFhcmd1bWVudHNbMF0pKXRocm93IG51bGw9PT10P25ldyBHbDpuZXcgR2wodCl9LHFsLmVxdWFscz1mdW5jdGlvbigpe3ZhciB0LGUsbjtpZigyPT09YXJndW1lbnRzLmxlbmd0aClxbC5lcXVhbHModD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbnVsbCk7ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCYmKHQ9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzJdLCEoZT1hcmd1bWVudHNbMV0pLmVxdWFscyh0KSkpdGhyb3cgbmV3IEdsKCJFeHBlY3RlZCAiK3QrIiBidXQgZW5jb3VudGVyZWQgIitlKyhudWxsIT09bj8iOiAiK246IiIpKX07dmFyIEJsPWZ1bmN0aW9uKCl7dGhpcy5fcmVzdWx0PW51bGwsdGhpcy5faW5wdXRMaW5lcz1BcnJheSgyKS5maWxsKCkubWFwKChmdW5jdGlvbigpe3JldHVybiBBcnJheSgyKX0pKSx0aGlzLl9pbnRQdD1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9pbnRMaW5lSW5kZXg9bnVsbCx0aGlzLl9pc1Byb3Blcj1udWxsLHRoaXMuX3BhPW51bGwsdGhpcy5fcGI9bnVsbCx0aGlzLl9wcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX2ludFB0WzBdPW5ldyB1bCx0aGlzLl9pbnRQdFsxXT1uZXcgdWwsdGhpcy5fcGE9dGhpcy5faW50UHRbMF0sdGhpcy5fcGI9dGhpcy5faW50UHRbMV0sdGhpcy5fcmVzdWx0PTB9LHpsPXtET05UX0lOVEVSU0VDVDp7Y29uZmlndXJhYmxlOiEwfSxET19JTlRFUlNFQ1Q6e2NvbmZpZ3VyYWJsZTohMH0sQ09MTElORUFSOntjb25maWd1cmFibGU6ITB9LE5PX0lOVEVSU0VDVElPTjp7Y29uZmlndXJhYmxlOiEwfSxQT0lOVF9JTlRFUlNFQ1RJT046e2NvbmZpZ3VyYWJsZTohMH0sQ09MTElORUFSX0lOVEVSU0VDVElPTjp7Y29uZmlndXJhYmxlOiEwfX07QmwucHJvdG90eXBlLmdldEluZGV4QWxvbmdTZWdtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29tcHV0ZUludExpbmVJbmRleCgpLHRoaXMuX2ludExpbmVJbmRleFt0XVtlXX0sQmwucHJvdG90eXBlLmdldFRvcG9sb2d5U3VtbWFyeT1mdW5jdGlvbigpe3ZhciB0PW5ldyB2bDtyZXR1cm4gdGhpcy5pc0VuZFBvaW50KCkmJnQuYXBwZW5kKCIgZW5kcG9pbnQiKSx0aGlzLl9pc1Byb3BlciYmdC5hcHBlbmQoIiBwcm9wZXIiKSx0aGlzLmlzQ29sbGluZWFyKCkmJnQuYXBwZW5kKCIgY29sbGluZWFyIiksdC50b1N0cmluZygpfSxCbC5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXt0aGlzLl9pbnB1dExpbmVzWzBdWzBdPXQsdGhpcy5faW5wdXRMaW5lc1swXVsxXT1lLHRoaXMuX2lucHV0TGluZXNbMV1bMF09bix0aGlzLl9pbnB1dExpbmVzWzFdWzFdPXIsdGhpcy5fcmVzdWx0PXRoaXMuY29tcHV0ZUludGVyc2VjdCh0LGUsbixyKX0sQmwucHJvdG90eXBlLmdldEludGVyc2VjdGlvbk51bT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXN1bHR9LEJsLnByb3RvdHlwZS5jb21wdXRlSW50TGluZUluZGV4PWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpbnVsbD09PXRoaXMuX2ludExpbmVJbmRleCYmKHRoaXMuX2ludExpbmVJbmRleD1BcnJheSgyKS5maWxsKCkubWFwKChmdW5jdGlvbigpe3JldHVybiBBcnJheSgyKX0pKSx0aGlzLmNvbXB1dGVJbnRMaW5lSW5kZXgoMCksdGhpcy5jb21wdXRlSW50TGluZUluZGV4KDEpKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT10aGlzLmdldEVkZ2VEaXN0YW5jZSh0LDApLG49dGhpcy5nZXRFZGdlRGlzdGFuY2UodCwxKTtlPm4/KHRoaXMuX2ludExpbmVJbmRleFt0XVswXT0wLHRoaXMuX2ludExpbmVJbmRleFt0XVsxXT0xKToodGhpcy5faW50TGluZUluZGV4W3RdWzBdPTEsdGhpcy5faW50TGluZUluZGV4W3RdWzFdPTApfX0sQmwucHJvdG90eXBlLmlzUHJvcGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFzSW50ZXJzZWN0aW9uKCkmJnRoaXMuX2lzUHJvcGVyfSxCbC5wcm90b3R5cGUuc2V0UHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24odCl7dGhpcy5fcHJlY2lzaW9uTW9kZWw9dH0sQmwucHJvdG90eXBlLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiEhdGhpcy5pc0ludGVyaW9ySW50ZXJzZWN0aW9uKDApfHwhIXRoaXMuaXNJbnRlcmlvckludGVyc2VjdGlvbigxKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPTA7bjx0aGlzLl9yZXN1bHQ7bisrKWlmKCF0Ll9pbnRQdFtuXS5lcXVhbHMyRCh0Ll9pbnB1dExpbmVzW2VdWzBdKSYmIXQuX2ludFB0W25dLmVxdWFsczJEKHQuX2lucHV0TGluZXNbZV1bMV0pKXJldHVybiEwO3JldHVybiExfX0sQmwucHJvdG90eXBlLmdldEludGVyc2VjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW50UHRbdF19LEJsLnByb3RvdHlwZS5pc0VuZFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFzSW50ZXJzZWN0aW9uKCkmJiF0aGlzLl9pc1Byb3Blcn0sQmwucHJvdG90eXBlLmhhc0ludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXN1bHQhPT1CbC5OT19JTlRFUlNFQ1RJT059LEJsLnByb3RvdHlwZS5nZXRFZGdlRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQmwuY29tcHV0ZUVkZ2VEaXN0YW5jZSh0aGlzLl9pbnRQdFtlXSx0aGlzLl9pbnB1dExpbmVzW3RdWzBdLHRoaXMuX2lucHV0TGluZXNbdF1bMV0pfSxCbC5wcm90b3R5cGUuaXNDb2xsaW5lYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzdWx0PT09QmwuQ09MTElORUFSX0lOVEVSU0VDVElPTn0sQmwucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEZsLnRvTGluZVN0cmluZyh0aGlzLl9pbnB1dExpbmVzWzBdWzBdLHRoaXMuX2lucHV0TGluZXNbMF1bMV0pKyIgLSAiK0ZsLnRvTGluZVN0cmluZyh0aGlzLl9pbnB1dExpbmVzWzFdWzBdLHRoaXMuX2lucHV0TGluZXNbMV1bMV0pK3RoaXMuZ2V0VG9wb2xvZ3lTdW1tYXJ5KCl9LEJsLnByb3RvdHlwZS5nZXRFbmRwb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9pbnB1dExpbmVzW3RdW2VdfSxCbC5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9yZXN1bHQ7ZSsrKWlmKHRoaXMuX2ludFB0W2VdLmVxdWFsczJEKHQpKXJldHVybiEwO3JldHVybiExfSxCbC5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9uQWxvbmdTZWdtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29tcHV0ZUludExpbmVJbmRleCgpLHRoaXMuX2ludFB0W3RoaXMuX2ludExpbmVJbmRleFt0XVtlXV19LEJsLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxCbC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQmx9LEJsLmNvbXB1dGVFZGdlRGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPU1hdGguYWJzKG4ueC1lLngpLGk9TWF0aC5hYnMobi55LWUueSksbz0tMTtpZih0LmVxdWFscyhlKSlvPTA7ZWxzZSBpZih0LmVxdWFscyhuKSlvPXI+aT9yOmk7ZWxzZXt2YXIgcz1NYXRoLmFicyh0LngtZS54KSxhPU1hdGguYWJzKHQueS1lLnkpOzAhPT0obz1yPmk/czphKXx8dC5lcXVhbHMoZSl8fChvPU1hdGgubWF4KHMsYSkpfXJldHVybiBxbC5pc1RydWUoISgwPT09byYmIXQuZXF1YWxzKGUpKSwiQmFkIGRpc3RhbmNlIGNhbGN1bGF0aW9uIiksb30sQmwubm9uUm9idXN0Q29tcHV0ZUVkZ2VEaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC54LWUueCxpPXQueS1lLnksbz1NYXRoLnNxcnQocipyK2kqaSk7cmV0dXJuIHFsLmlzVHJ1ZSghKDA9PT1vJiYhdC5lcXVhbHMoZSkpLCJJbnZhbGlkIGRpc3RhbmNlIGNhbGN1bGF0aW9uIiksb30semwuRE9OVF9JTlRFUlNFQ1QuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHpsLkRPX0lOVEVSU0VDVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0semwuQ09MTElORUFSLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSx6bC5OT19JTlRFUlNFQ1RJT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHpsLlBPSU5UX0lOVEVSU0VDVElPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0semwuQ09MTElORUFSX0lOVEVSU0VDVElPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmwsemwpO3ZhciBqbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzSW5TZWdtZW50RW52ZWxvcGVzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBMbCh0aGlzLl9pbnB1dExpbmVzWzBdWzBdLHRoaXMuX2lucHV0TGluZXNbMF1bMV0pLG49bmV3IExsKHRoaXMuX2lucHV0TGluZXNbMV1bMF0sdGhpcy5faW5wdXRMaW5lc1sxXVsxXSk7cmV0dXJuIGUuY29udGFpbnModCkmJm4uY29udGFpbnModCl9LGUucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtpZigzIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO2lmKHRoaXMuX2lzUHJvcGVyPSExLExsLmludGVyc2VjdHMobixyLGUpJiYwPT09WGwub3JpZW50YXRpb25JbmRleChuLHIsZSkmJjA9PT1YbC5vcmllbnRhdGlvbkluZGV4KHIsbixlKSlyZXR1cm4gdGhpcy5faXNQcm9wZXI9ITAsKGUuZXF1YWxzKG4pfHxlLmVxdWFscyhyKSkmJih0aGlzLl9pc1Byb3Blcj0hMSksdGhpcy5fcmVzdWx0PXQuUE9JTlRfSU5URVJTRUNUSU9OLG51bGw7dGhpcy5fcmVzdWx0PXQuTk9fSU5URVJTRUNUSU9OfSxlLnByb3RvdHlwZS5ub3JtYWxpemVUb01pbmltdW09ZnVuY3Rpb24odCxlLG4scixpKXtpLng9dGhpcy5zbWFsbGVzdEluQWJzVmFsdWUodC54LGUueCxuLngsci54KSxpLnk9dGhpcy5zbWFsbGVzdEluQWJzVmFsdWUodC55LGUueSxuLnksci55KSx0LngtPWkueCx0LnktPWkueSxlLngtPWkueCxlLnktPWkueSxuLngtPWkueCxuLnktPWkueSxyLngtPWkueCxyLnktPWkueX0sZS5wcm90b3R5cGUuc2FmZUhDb29yZGluYXRlSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPW51bGw7dHJ5e289TWwuaW50ZXJzZWN0aW9uKHQsbixyLGkpfWNhdGNoKHMpe2lmKCEocyBpbnN0YW5jZW9mIENsKSl0aHJvdyBzO289ZS5uZWFyZXN0RW5kcG9pbnQodCxuLHIsaSl9cmV0dXJuIG99LGUucHJvdG90eXBlLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LG4scixpKXt2YXIgbz10aGlzLmludGVyc2VjdGlvbldpdGhOb3JtYWxpemF0aW9uKHQsbixyLGkpO3JldHVybiB0aGlzLmlzSW5TZWdtZW50RW52ZWxvcGVzKG8pfHwobz1uZXcgdWwoZS5uZWFyZXN0RW5kcG9pbnQodCxuLHIsaSkpKSxudWxsIT09dGhpcy5fcHJlY2lzaW9uTW9kZWwmJnRoaXMuX3ByZWNpc2lvbk1vZGVsLm1ha2VQcmVjaXNlKG8pLG99LGUucHJvdG90eXBlLnNtYWxsZXN0SW5BYnNWYWx1ZT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LG89TWF0aC5hYnMoaSk7cmV0dXJuIE1hdGguYWJzKGUpPG8mJihpPWUsbz1NYXRoLmFicyhlKSksTWF0aC5hYnMobik8byYmKGk9bixvPU1hdGguYWJzKG4pKSxNYXRoLmFicyhyKTxvJiYoaT1yKSxpfSxlLnByb3RvdHlwZS5jaGVja0REPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89YmwuaW50ZXJzZWN0aW9uKHQsZSxuLHIpLHM9dGhpcy5pc0luU2VnbWVudEVudmVsb3BlcyhvKTtQbC5vdXQucHJpbnRsbigiREQgaW4gZW52ID0gIitzKyIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAiK28pLGkuZGlzdGFuY2Uobyk+MWUtNCYmUGwub3V0LnByaW50bG4oIkRpc3RhbmNlID0gIitpLmRpc3RhbmNlKG8pKX0sZS5wcm90b3R5cGUuaW50ZXJzZWN0aW9uV2l0aE5vcm1hbGl6YXRpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bmV3IHVsKHQpLG89bmV3IHVsKGUpLHM9bmV3IHVsKG4pLGE9bmV3IHVsKHIpLHU9bmV3IHVsO3RoaXMubm9ybWFsaXplVG9FbnZDZW50cmUoaSxvLHMsYSx1KTt2YXIgbD10aGlzLnNhZmVIQ29vcmRpbmF0ZUludGVyc2VjdGlvbihpLG8scyxhKTtyZXR1cm4gbC54Kz11LngsbC55Kz11LnksbH0sZS5wcm90b3R5cGUuY29tcHV0ZUNvbGxpbmVhckludGVyc2VjdGlvbj1mdW5jdGlvbihlLG4scixpKXt2YXIgbz1MbC5pbnRlcnNlY3RzKGUsbixyKSxzPUxsLmludGVyc2VjdHMoZSxuLGkpLGE9TGwuaW50ZXJzZWN0cyhyLGksZSksdT1MbC5pbnRlcnNlY3RzKHIsaSxuKTtyZXR1cm4gbyYmcz8odGhpcy5faW50UHRbMF09cix0aGlzLl9pbnRQdFsxXT1pLHQuQ09MTElORUFSX0lOVEVSU0VDVElPTik6YSYmdT8odGhpcy5faW50UHRbMF09ZSx0aGlzLl9pbnRQdFsxXT1uLHQuQ09MTElORUFSX0lOVEVSU0VDVElPTik6byYmYT8odGhpcy5faW50UHRbMF09cix0aGlzLl9pbnRQdFsxXT1lLCFyLmVxdWFscyhlKXx8c3x8dT90LkNPTExJTkVBUl9JTlRFUlNFQ1RJT046dC5QT0lOVF9JTlRFUlNFQ1RJT04pOm8mJnU/KHRoaXMuX2ludFB0WzBdPXIsdGhpcy5faW50UHRbMV09biwhci5lcXVhbHMobil8fHN8fGE/dC5DT0xMSU5FQVJfSU5URVJTRUNUSU9OOnQuUE9JTlRfSU5URVJTRUNUSU9OKTpzJiZhPyh0aGlzLl9pbnRQdFswXT1pLHRoaXMuX2ludFB0WzFdPWUsIWkuZXF1YWxzKGUpfHxvfHx1P3QuQ09MTElORUFSX0lOVEVSU0VDVElPTjp0LlBPSU5UX0lOVEVSU0VDVElPTik6cyYmdT8odGhpcy5faW50UHRbMF09aSx0aGlzLl9pbnRQdFsxXT1uLCFpLmVxdWFscyhuKXx8b3x8YT90LkNPTExJTkVBUl9JTlRFUlNFQ1RJT046dC5QT0lOVF9JTlRFUlNFQ1RJT04pOnQuTk9fSU5URVJTRUNUSU9OfSxlLnByb3RvdHlwZS5ub3JtYWxpemVUb0VudkNlbnRyZT1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXQueDxlLng/dC54OmUueCxzPXQueTxlLnk/dC55OmUueSxhPXQueD5lLng/dC54OmUueCx1PXQueT5lLnk/dC55OmUueSxsPW4ueDxyLng/bi54OnIueCxjPW4ueTxyLnk/bi55OnIueSxoPW4ueD5yLng/bi54OnIueCxwPW4ueT5yLnk/bi55OnIueSxmPSgobz5sP286bCkrKGE8aD9hOmgpKS8yLGc9KChzPmM/czpjKSsodTxwP3U6cCkpLzI7aS54PWYsaS55PWcsdC54LT1pLngsdC55LT1pLnksZS54LT1pLngsZS55LT1pLnksbi54LT1pLngsbi55LT1pLnksci54LT1pLngsci55LT1pLnl9LGUucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Q9ZnVuY3Rpb24oZSxuLHIsaSl7aWYodGhpcy5faXNQcm9wZXI9ITEsIUxsLmludGVyc2VjdHMoZSxuLHIsaSkpcmV0dXJuIHQuTk9fSU5URVJTRUNUSU9OO3ZhciBvPVhsLm9yaWVudGF0aW9uSW5kZXgoZSxuLHIpLHM9WGwub3JpZW50YXRpb25JbmRleChlLG4saSk7aWYobz4wJiZzPjB8fG88MCYmczwwKXJldHVybiB0Lk5PX0lOVEVSU0VDVElPTjt2YXIgYT1YbC5vcmllbnRhdGlvbkluZGV4KHIsaSxlKSx1PVhsLm9yaWVudGF0aW9uSW5kZXgocixpLG4pO3JldHVybiBhPjAmJnU+MHx8YTwwJiZ1PDA/dC5OT19JTlRFUlNFQ1RJT046MD09PW8mJjA9PT1zJiYwPT09YSYmMD09PXU/dGhpcy5jb21wdXRlQ29sbGluZWFySW50ZXJzZWN0aW9uKGUsbixyLGkpOigwPT09b3x8MD09PXN8fDA9PT1hfHwwPT09dT8odGhpcy5faXNQcm9wZXI9ITEsZS5lcXVhbHMyRChyKXx8ZS5lcXVhbHMyRChpKT90aGlzLl9pbnRQdFswXT1lOm4uZXF1YWxzMkQocil8fG4uZXF1YWxzMkQoaSk/dGhpcy5faW50UHRbMF09bjowPT09bz90aGlzLl9pbnRQdFswXT1uZXcgdWwocik6MD09PXM/dGhpcy5faW50UHRbMF09bmV3IHVsKGkpOjA9PT1hP3RoaXMuX2ludFB0WzBdPW5ldyB1bChlKTowPT09dSYmKHRoaXMuX2ludFB0WzBdPW5ldyB1bChuKSkpOih0aGlzLl9pc1Byb3Blcj0hMCx0aGlzLl9pbnRQdFswXT10aGlzLmludGVyc2VjdGlvbihlLG4scixpKSksdC5QT0lOVF9JTlRFUlNFQ1RJT04pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLm5lYXJlc3RFbmRwb2ludD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LG89WGwuZGlzdGFuY2VQb2ludExpbmUodCxuLHIpLHM9WGwuZGlzdGFuY2VQb2ludExpbmUoZSxuLHIpO3JldHVybiBzPG8mJihvPXMsaT1lKSwocz1YbC5kaXN0YW5jZVBvaW50TGluZShuLHQsZSkpPG8mJihvPXMsaT1uKSwocz1YbC5kaXN0YW5jZVBvaW50TGluZShyLHQsZSkpPG8mJihvPXMsaT1yKSxpfSxlfShCbCksVWw9ZnVuY3Rpb24oKXt9O1VsLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxVbC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVWx9LFVsLm9yaWVudGF0aW9uSW5kZXg9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUueC10LngsaT1lLnktdC55LG89bi54LWUueCxzPW4ueS1lLnk7cmV0dXJuIFVsLnNpZ25PZkRldDJ4MihyLGksbyxzKX0sVWwuc2lnbk9mRGV0MngyPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW51bGwsbz1udWxsLHM9bnVsbDtpZihpPTEsMD09PXR8fDA9PT1yKXJldHVybiAwPT09ZXx8MD09PW4/MDplPjA/bj4wPy1pOmk6bj4wP2k6LWk7aWYoMD09PWV8fDA9PT1uKXJldHVybiByPjA/dD4wP2k6LWk6dD4wPy1pOmk7aWYoZT4wP3I+MD9lPD1yfHwoaT0taSxvPXQsdD1uLG49byxvPWUsZT1yLHI9byk6ZTw9LXI/KGk9LWksbj0tbixyPS1yKToobz10LHQ9LW4sbj1vLG89ZSxlPS1yLHI9byk6cj4wPy1lPD1yPyhpPS1pLHQ9LXQsZT0tZSk6KG89LXQsdD1uLG49byxvPS1lLGU9cixyPW8pOmU+PXI/KHQ9LXQsZT0tZSxuPS1uLHI9LXIpOihpPS1pLG89LXQsdD0tbixuPW8sbz0tZSxlPS1yLHI9byksdD4wKXtpZighKG4+MCkpcmV0dXJuIGk7aWYoISh0PD1uKSlyZXR1cm4gaX1lbHNle2lmKG4+MClyZXR1cm4taTtpZighKHQ+PW4pKXJldHVybi1pO2k9LWksdD0tdCxuPS1ufWZvcig7Oyl7aWYoKHItPShzPU1hdGguZmxvb3Iobi90KSkqZSk8MClyZXR1cm4taTtpZihyPmUpcmV0dXJuIGk7aWYodD4obi09cyp0KStuKXtpZihlPHIrcilyZXR1cm4gaX1lbHNle2lmKGU+cityKXJldHVybi1pO249dC1uLHI9ZS1yLGk9LWl9aWYoMD09PXIpcmV0dXJuIDA9PT1uPzA6LWk7aWYoMD09PW4pcmV0dXJuIGk7aWYoKGUtPShzPU1hdGguZmxvb3IodC9uKSkqcik8MClyZXR1cm4gaTtpZihlPnIpcmV0dXJuLWk7aWYobj4odC09cypuKSt0KXtpZihyPGUrZSlyZXR1cm4taX1lbHNle2lmKHI+ZStlKXJldHVybiBpO3Q9bi10LGU9ci1lLGk9LWl9aWYoMD09PWUpcmV0dXJuIDA9PT10PzA6aTtpZigwPT09dClyZXR1cm4taX19O3ZhciBWbD1mdW5jdGlvbigpe3RoaXMuX3A9bnVsbCx0aGlzLl9jcm9zc2luZ0NvdW50PTAsdGhpcy5faXNQb2ludE9uU2VnbWVudD0hMTt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fcD10fTtWbC5wcm90b3R5cGUuY291bnRTZWdtZW50PWZ1bmN0aW9uKHQsZSl7aWYodC54PHRoaXMuX3AueCYmZS54PHRoaXMuX3AueClyZXR1cm4gbnVsbDtpZih0aGlzLl9wLng9PT1lLngmJnRoaXMuX3AueT09PWUueSlyZXR1cm4gdGhpcy5faXNQb2ludE9uU2VnbWVudD0hMCxudWxsO2lmKHQueT09PXRoaXMuX3AueSYmZS55PT09dGhpcy5fcC55KXt2YXIgbj10Lngscj1lLng7cmV0dXJuIG4+ciYmKG49ZS54LHI9dC54KSx0aGlzLl9wLng+PW4mJnRoaXMuX3AueDw9ciYmKHRoaXMuX2lzUG9pbnRPblNlZ21lbnQ9ITApLG51bGx9aWYodC55PnRoaXMuX3AueSYmZS55PD10aGlzLl9wLnl8fGUueT50aGlzLl9wLnkmJnQueTw9dGhpcy5fcC55KXt2YXIgaT10LngtdGhpcy5fcC54LG89dC55LXRoaXMuX3AueSxzPWUueC10aGlzLl9wLngsYT1lLnktdGhpcy5fcC55LHU9VWwuc2lnbk9mRGV0MngyKGksbyxzLGEpO2lmKDA9PT11KXJldHVybiB0aGlzLl9pc1BvaW50T25TZWdtZW50PSEwLG51bGw7YTxvJiYodT0tdSksdT4wJiZ0aGlzLl9jcm9zc2luZ0NvdW50Kyt9fSxWbC5wcm90b3R5cGUuaXNQb2ludEluUG9seWdvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldExvY2F0aW9uKCkhPT1wbC5FWFRFUklPUn0sVmwucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzUG9pbnRPblNlZ21lbnQ/cGwuQk9VTkRBUlk6dGhpcy5fY3Jvc3NpbmdDb3VudCUyPT0xP3BsLklOVEVSSU9SOnBsLkVYVEVSSU9SfSxWbC5wcm90b3R5cGUuaXNPblNlZ21lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNQb2ludE9uU2VnbWVudH0sVmwucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFZsLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBWbH0sVmwubG9jYXRlUG9pbnRJblJpbmc9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsJiZnbChhcmd1bWVudHNbMV0sSWwpKXtmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IFZsKHQpLHI9bmV3IHVsLGk9bmV3IHVsLG89MTtvPGUuc2l6ZSgpO28rKylpZihlLmdldENvb3JkaW5hdGUobyxyKSxlLmdldENvb3JkaW5hdGUoby0xLGkpLG4uY291bnRTZWdtZW50KHIsaSksbi5pc09uU2VnbWVudCgpKXJldHVybiBuLmdldExvY2F0aW9uKCk7cmV0dXJuIG4uZ2V0TG9jYXRpb24oKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdLHU9bmV3IFZsKHMpLGw9MTtsPGEubGVuZ3RoO2wrKyl7dmFyIGM9YVtsXSxoPWFbbC0xXTtpZih1LmNvdW50U2VnbWVudChjLGgpLHUuaXNPblNlZ21lbnQoKSlyZXR1cm4gdS5nZXRMb2NhdGlvbigpfXJldHVybiB1LmdldExvY2F0aW9uKCl9fTt2YXIgWGw9ZnVuY3Rpb24oKXt9LFlsPXtDTE9DS1dJU0U6e2NvbmZpZ3VyYWJsZTohMH0sUklHSFQ6e2NvbmZpZ3VyYWJsZTohMH0sQ09VTlRFUkNMT0NLV0lTRTp7Y29uZmlndXJhYmxlOiEwfSxMRUZUOntjb25maWd1cmFibGU6ITB9LENPTExJTkVBUjp7Y29uZmlndXJhYmxlOiEwfSxTVFJBSUdIVDp7Y29uZmlndXJhYmxlOiEwfX07WGwucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFhsLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBYbH0sWGwub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGJsLm9yaWVudGF0aW9uSW5kZXgodCxlLG4pfSxYbC5zaWduZWRBcmVhPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7dmFyIHQ9YXJndW1lbnRzWzBdO2lmKHQubGVuZ3RoPDMpcmV0dXJuIDA7Zm9yKHZhciBlPTAsbj10WzBdLngscj0xO3I8dC5sZW5ndGgtMTtyKyspe3ZhciBpPXRbcl0ueC1uLG89dFtyKzFdLnkscz10W3ItMV0ueTtlKz1pKihzLW8pfXJldHVybiBlLzJ9aWYoZ2woYXJndW1lbnRzWzBdLElsKSl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YS5zaXplKCk7aWYodTwzKXJldHVybiAwO3ZhciBsPW5ldyB1bCxjPW5ldyB1bCxoPW5ldyB1bDthLmdldENvb3JkaW5hdGUoMCxjKSxhLmdldENvb3JkaW5hdGUoMSxoKTt2YXIgcD1jLng7aC54LT1wO2Zvcih2YXIgZj0wLGc9MTtnPHUtMTtnKyspbC55PWMueSxjLng9aC54LGMueT1oLnksYS5nZXRDb29yZGluYXRlKGcrMSxoKSxoLngtPXAsZis9Yy54KihsLnktaC55KTtyZXR1cm4gZi8yfX0sWGwuZGlzdGFuY2VMaW5lTGluZT1mdW5jdGlvbih0LGUsbixyKXtpZih0LmVxdWFscyhlKSlyZXR1cm4gWGwuZGlzdGFuY2VQb2ludExpbmUodCxuLHIpO2lmKG4uZXF1YWxzKHIpKXJldHVybiBYbC5kaXN0YW5jZVBvaW50TGluZShyLHQsZSk7dmFyIGk9ITE7aWYoTGwuaW50ZXJzZWN0cyh0LGUsbixyKSl7dmFyIG89KGUueC10LngpKihyLnktbi55KS0oZS55LXQueSkqKHIueC1uLngpO2lmKDA9PT1vKWk9ITA7ZWxzZXt2YXIgcz0odC55LW4ueSkqKHIueC1uLngpLSh0Lngtbi54KSooci55LW4ueSksYT0oKHQueS1uLnkpKihlLngtdC54KS0odC54LW4ueCkqKGUueS10LnkpKS9vLHU9cy9vOyh1PDB8fHU+MXx8YTwwfHxhPjEpJiYoaT0hMCl9fWVsc2UgaT0hMDtyZXR1cm4gaT9kbC5taW4oWGwuZGlzdGFuY2VQb2ludExpbmUodCxuLHIpLFhsLmRpc3RhbmNlUG9pbnRMaW5lKGUsbixyKSxYbC5kaXN0YW5jZVBvaW50TGluZShuLHQsZSksWGwuZGlzdGFuY2VQb2ludExpbmUocix0LGUpKTowfSxYbC5pc1BvaW50SW5SaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFhsLmxvY2F0ZVBvaW50SW5SaW5nKHQsZSkhPT1wbC5FWFRFUklPUn0sWGwuY29tcHV0ZUxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT10LnNpemUoKTtpZihlPD0xKXJldHVybiAwO3ZhciBuPTAscj1uZXcgdWw7dC5nZXRDb29yZGluYXRlKDAscik7Zm9yKHZhciBpPXIueCxvPXIueSxzPTE7czxlO3MrKyl7dC5nZXRDb29yZGluYXRlKHMscik7dmFyIGE9ci54LHU9ci55LGw9YS1pLGM9dS1vO24rPU1hdGguc3FydChsKmwrYypjKSxpPWEsbz11fXJldHVybiBufSxYbC5pc0NDVz1mdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aC0xO2lmKGU8Myl0aHJvdyBuZXcgZWwoIlJpbmcgaGFzIGZld2VyIHRoYW4gNCBwb2ludHMsIHNvIG9yaWVudGF0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkIik7Zm9yKHZhciBuPXRbMF0scj0wLGk9MTtpPD1lO2krKyl7dmFyIG89dFtpXTtvLnk+bi55JiYobj1vLHI9aSl9dmFyIHM9cjtkb3socy09MSk8MCYmKHM9ZSl9d2hpbGUodFtzXS5lcXVhbHMyRChuKSYmcyE9PXIpO3ZhciBhPXI7ZG97YT0oYSsxKSVlfXdoaWxlKHRbYV0uZXF1YWxzMkQobikmJmEhPT1yKTt2YXIgdT10W3NdLGw9dFthXTtpZih1LmVxdWFsczJEKG4pfHxsLmVxdWFsczJEKG4pfHx1LmVxdWFsczJEKGwpKXJldHVybiExO3ZhciBjPVhsLmNvbXB1dGVPcmllbnRhdGlvbih1LG4sbCksaD0hMTtyZXR1cm4gaD0wPT09Yz91Lng+bC54OmM+MCxofSxYbC5sb2NhdGVQb2ludEluUmluZz1mdW5jdGlvbih0LGUpe3JldHVybiBWbC5sb2NhdGVQb2ludEluUmluZyh0LGUpfSxYbC5kaXN0YW5jZVBvaW50TGluZVBlcnBlbmRpY3VsYXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPShuLngtZS54KSoobi54LWUueCkrKG4ueS1lLnkpKihuLnktZS55KSxpPSgoZS55LXQueSkqKG4ueC1lLngpLShlLngtdC54KSoobi55LWUueSkpL3I7cmV0dXJuIE1hdGguYWJzKGkpKk1hdGguc3FydChyKX0sWGwuY29tcHV0ZU9yaWVudGF0aW9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gWGwub3JpZW50YXRpb25JbmRleCh0LGUsbil9LFhsLmRpc3RhbmNlUG9pbnRMaW5lPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IGVsKCJMaW5lIGFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgdmVydGV4Iik7Zm9yKHZhciBuPXQuZGlzdGFuY2UoZVswXSkscj0wO3I8ZS5sZW5ndGgtMTtyKyspe3ZhciBpPVhsLmRpc3RhbmNlUG9pbnRMaW5lKHQsZVtyXSxlW3IrMV0pO2k8biYmKG49aSl9cmV0dXJuIG59aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXTtpZihzLng9PT1hLngmJnMueT09PWEueSlyZXR1cm4gby5kaXN0YW5jZShzKTt2YXIgdT0oYS54LXMueCkqKGEueC1zLngpKyhhLnktcy55KSooYS55LXMueSksbD0oKG8ueC1zLngpKihhLngtcy54KSsoby55LXMueSkqKGEueS1zLnkpKS91O2lmKGw8PTApcmV0dXJuIG8uZGlzdGFuY2Uocyk7aWYobD49MSlyZXR1cm4gby5kaXN0YW5jZShhKTt2YXIgYz0oKHMueS1vLnkpKihhLngtcy54KS0ocy54LW8ueCkqKGEueS1zLnkpKS91O3JldHVybiBNYXRoLmFicyhjKSpNYXRoLnNxcnQodSl9fSxYbC5pc09uTGluZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgamwscj0xO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3ItMV0sbz1lW3JdO2lmKG4uY29tcHV0ZUludGVyc2VjdGlvbih0LGksbyksbi5oYXNJbnRlcnNlY3Rpb24oKSlyZXR1cm4hMH1yZXR1cm4hMX0sWWwuQ0xPQ0tXSVNFLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxZbC5SSUdIVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gWGwuQ0xPQ0tXSVNFfSxZbC5DT1VOVEVSQ0xPQ0tXSVNFLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxZbC5MRUZULmdldD1mdW5jdGlvbigpe3JldHVybiBYbC5DT1VOVEVSQ0xPQ0tXSVNFfSxZbC5DT0xMSU5FQVIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LFlsLlNUUkFJR0hULmdldD1mdW5jdGlvbigpe3JldHVybiBYbC5DT0xMSU5FQVJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFhsLFlsKTt2YXIgSGw9ZnVuY3Rpb24oKXt9O0hsLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7fSxIbC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSGwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEhsfTt2YXIgV2w9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZW52ZWxvcGU9bnVsbCx0aGlzLl9mYWN0b3J5PW51bGwsdGhpcy5fU1JJRD1udWxsLHRoaXMuX3VzZXJEYXRhPW51bGwsdGhpcy5fZmFjdG9yeT10LHRoaXMuX1NSSUQ9dC5nZXRTUklEKCl9LEpsPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9QT0lOVDp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTVVMVElQT0lOVDp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTElORVNUUklORzp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTElORUFSUklORzp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTVVMVElMSU5FU1RSSU5HOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9QT0xZR09OOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9NVUxUSVBPTFlHT046e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTjp7Y29uZmlndXJhYmxlOiEwfSxnZW9tZXRyeUNoYW5nZWRGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH19O1dsLnByb3RvdHlwZS5pc0dlb21ldHJ5Q29sbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFNvcnRJbmRleCgpPT09V2wuU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTn0sV2wucHJvdG90eXBlLmdldEZhY3Rvcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmFjdG9yeX0sV2wucHJvdG90eXBlLmdldEdlb21ldHJ5Tj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpc30sV2wucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sV2wucHJvdG90eXBlLmlzUmVjdGFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuITF9LFdsLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFdsKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIG51bGwhPT10JiZ0aGlzLmVxdWFsc1RvcG8odCl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3Qpe3ZhciBlPWFyZ3VtZW50c1swXTtpZighKGUgaW5zdGFuY2VvZiBXbCkpcmV0dXJuITE7dmFyIG49ZTtyZXR1cm4gdGhpcy5lcXVhbHNFeGFjdChuKX19LFdsLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcz09PXR8fHRoaXMuZXF1YWxzRXhhY3QodCwwKX0sV2wucHJvdG90eXBlLmdlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3RoaXMuYXBwbHkoV2wuZ2VvbWV0cnlDaGFuZ2VkRmlsdGVyKX0sV2wucHJvdG90eXBlLmdlb21ldHJ5Q2hhbmdlZEFjdGlvbj1mdW5jdGlvbigpe3RoaXMuX2VudmVsb3BlPW51bGx9LFdsLnByb3RvdHlwZS5lcXVhbHNOb3JtPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dCYmdGhpcy5ub3JtKCkuZXF1YWxzRXhhY3QodC5ub3JtKCkpfSxXbC5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LFdsLnByb3RvdHlwZS5nZXROdW1HZW9tZXRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIDF9LFdsLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dDtyZXR1cm4gdGhpcy5nZXRTb3J0SW5kZXgoKSE9PWUuZ2V0U29ydEluZGV4KCk/dGhpcy5nZXRTb3J0SW5kZXgoKS1lLmdldFNvcnRJbmRleCgpOnRoaXMuaXNFbXB0eSgpJiZlLmlzRW1wdHkoKT8wOnRoaXMuaXNFbXB0eSgpPy0xOmUuaXNFbXB0eSgpPzE6dGhpcy5jb21wYXJlVG9TYW1lQ2xhc3ModCl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5nZXRTb3J0SW5kZXgoKSE9PW4uZ2V0U29ydEluZGV4KCk/dGhpcy5nZXRTb3J0SW5kZXgoKS1uLmdldFNvcnRJbmRleCgpOnRoaXMuaXNFbXB0eSgpJiZuLmlzRW1wdHkoKT8wOnRoaXMuaXNFbXB0eSgpPy0xOm4uaXNFbXB0eSgpPzE6dGhpcy5jb21wYXJlVG9TYW1lQ2xhc3MobixyKX19LFdsLnByb3RvdHlwZS5nZXRVc2VyRGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91c2VyRGF0YX0sV2wucHJvdG90eXBlLmdldFNSSUQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fU1JJRH0sV2wucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLnRvR2VvbWV0cnkodGhpcy5nZXRFbnZlbG9wZUludGVybmFsKCkpfSxXbC5wcm90b3R5cGUuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24odCl7aWYodC5nZXRTb3J0SW5kZXgoKT09PVdsLlNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT04pdGhyb3cgbmV3IGVsKCJUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IEdlb21ldHJ5Q29sbGVjdGlvbiBhcmd1bWVudHMiKX0sV2wucHJvdG90eXBlLmVxdWFsPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMD09PW4/dC5lcXVhbHMoZSk6dC5kaXN0YW5jZShlKTw9bn0sV2wucHJvdG90eXBlLm5vcm09ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvcHkoKTtyZXR1cm4gdC5ub3JtYWxpemUoKSx0fSxXbC5wcm90b3R5cGUuZ2V0UHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmFjdG9yeS5nZXRQcmVjaXNpb25Nb2RlbCgpfSxXbC5wcm90b3R5cGUuZ2V0RW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fZW52ZWxvcGUmJih0aGlzLl9lbnZlbG9wZT10aGlzLmNvbXB1dGVFbnZlbG9wZUludGVybmFsKCkpLG5ldyBMbCh0aGlzLl9lbnZlbG9wZSl9LFdsLnByb3RvdHlwZS5zZXRTUklEPWZ1bmN0aW9uKHQpe3RoaXMuX1NSSUQ9dH0sV2wucHJvdG90eXBlLnNldFVzZXJEYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX3VzZXJEYXRhPXR9LFdsLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuaXRlcmF0b3IoKSxyPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKSYmci5oYXNOZXh0KCk7KXt2YXIgaT1uLm5leHQoKSxvPXIubmV4dCgpLHM9aS5jb21wYXJlVG8obyk7aWYoMCE9PXMpcmV0dXJuIHN9cmV0dXJuIG4uaGFzTmV4dCgpPzE6ci5oYXNOZXh0KCk/LTE6MH0sV2wucHJvdG90eXBlLmhhc2hDb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmhhc2hDb2RlKCl9LFdsLnByb3RvdHlwZS5pc0dlb21ldHJ5Q29sbGVjdGlvbk9yRGVyaXZlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFNvcnRJbmRleCgpPT09V2wuU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTnx8dGhpcy5nZXRTb3J0SW5kZXgoKT09PVdsLlNPUlRJTkRFWF9NVUxUSVBPSU5UfHx0aGlzLmdldFNvcnRJbmRleCgpPT09V2wuU09SVElOREVYX01VTFRJTElORVNUUklOR3x8dGhpcy5nZXRTb3J0SW5kZXgoKT09PVdsLlNPUlRJTkRFWF9NVUxUSVBPTFlHT059LFdsLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltvbCxpbCxhbF19LFdsLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBXbH0sV2wuaGFzTm9uRW1wdHlFbGVtZW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZighdFtlXS5pc0VtcHR5KCkpcmV0dXJuITA7cmV0dXJuITF9LFdsLmhhc051bGxFbGVtZW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZihudWxsPT09dFtlXSlyZXR1cm4hMDtyZXR1cm4hMX0sSmwuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg3OTllYTQ2NTIyODU0YzAwfSxKbC5TT1JUSU5ERVhfUE9JTlQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LEpsLlNPUlRJTkRFWF9NVUxUSVBPSU5ULmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxKbC5TT1JUSU5ERVhfTElORVNUUklORy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sSmwuU09SVElOREVYX0xJTkVBUlJJTkcuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LEpsLlNPUlRJTkRFWF9NVUxUSUxJTkVTVFJJTkcuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDR9LEpsLlNPUlRJTkRFWF9QT0xZR09OLmdldD1mdW5jdGlvbigpe3JldHVybiA1fSxKbC5TT1JUSU5ERVhfTVVMVElQT0xZR09OLmdldD1mdW5jdGlvbigpe3JldHVybiA2fSxKbC5TT1JUSU5ERVhfR0VPTUVUUllDT0xMRUNUSU9OLmdldD1mdW5jdGlvbigpe3JldHVybiA3fSxKbC5nZW9tZXRyeUNoYW5nZWRGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFpsfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhXbCxKbCk7dmFyIFpsPWZ1bmN0aW9uKCl7fTtabC5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltIbF19LFpsLmZpbHRlcj1mdW5jdGlvbih0KXt0Lmdlb21ldHJ5Q2hhbmdlZEFjdGlvbigpfTt2YXIgS2w9ZnVuY3Rpb24oKXt9O0tsLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7fSxLbC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sS2wucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEtsfTt2YXIgUWw9ZnVuY3Rpb24oKXt9LCRsPXtNb2QyQm91bmRhcnlOb2RlUnVsZTp7Y29uZmlndXJhYmxlOiEwfSxFbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGU6e2NvbmZpZ3VyYWJsZTohMH0sTXVsdGlWYWxlbnRFbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGU6e2NvbmZpZ3VyYWJsZTohMH0sTW9ub1ZhbGVudEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZTp7Y29uZmlndXJhYmxlOiEwfSxNT0QyX0JPVU5EQVJZX1JVTEU6e2NvbmZpZ3VyYWJsZTohMH0sRU5EUE9JTlRfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfSxNVUxUSVZBTEVOVF9FTkRQT0lOVF9CT1VOREFSWV9SVUxFOntjb25maWd1cmFibGU6ITB9LE1PTk9WQUxFTlRfRU5EUE9JTlRfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfSxPR0NfU0ZTX0JPVU5EQVJZX1JVTEU6e2NvbmZpZ3VyYWJsZTohMH19O1FsLnByb3RvdHlwZS5pc0luQm91bmRhcnk9ZnVuY3Rpb24odCl7fSxRbC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUWwucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFFsfSwkbC5Nb2QyQm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGN9LCRsLkVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZWN9LCRsLk11bHRpVmFsZW50RW5kUG9pbnRCb3VuZGFyeU5vZGVSdWxlLmdldD1mdW5jdGlvbigpe3JldHVybiBuY30sJGwuTW9ub1ZhbGVudEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gcmN9LCRsLk1PRDJfQk9VTkRBUllfUlVMRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRjfSwkbC5FTkRQT0lOVF9CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgZWN9LCRsLk1VTFRJVkFMRU5UX0VORFBPSU5UX0JPVU5EQVJZX1JVTEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuY30sJGwuTU9OT1ZBTEVOVF9FTkRQT0lOVF9CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgcmN9LCRsLk9HQ19TRlNfQk9VTkRBUllfUlVMRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gUWwuTU9EMl9CT1VOREFSWV9SVUxFfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhRbCwkbCk7dmFyIHRjPWZ1bmN0aW9uKCl7fTt0Yy5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0JTI9PTF9LHRjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltRbF19LHRjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0Y307dmFyIGVjPWZ1bmN0aW9uKCl7fTtlYy5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PjB9LGVjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltRbF19LGVjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlY307dmFyIG5jPWZ1bmN0aW9uKCl7fTtuYy5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PjF9LG5jLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltRbF19LG5jLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBuY307dmFyIHJjPWZ1bmN0aW9uKCl7fTtyYy5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dH0scmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1FsXX0scmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHJjfTt2YXIgaWM9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIG9jKHQpe3RoaXMubWVzc2FnZT10fHwiIn1pYy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7fSxpYy5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKCl7fSxpYy5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe30saWMucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7fSxpYy5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe30saWMucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXt9LGljLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt9LG9jLnByb3RvdHlwZT1uZXcgRXJyb3Isb2MucHJvdG90eXBlLm5hbWU9IkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iO3ZhciBzYz1mdW5jdGlvbigpe307c2MucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXt9LHNjLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7fSxzYy5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7fTt2YXIgYWM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLnNldD1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe30sZX0oaWMpO2Z1bmN0aW9uIHVjKHQpe3RoaXMubWVzc2FnZT10fHwiIn11Yy5wcm90b3R5cGU9bmV3IEVycm9yLHVjLnByb3RvdHlwZS5uYW1lPSJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIjt2YXIgbGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLmFycmF5Xz1bXSxhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGljJiZ0aGlzLmFkZEFsbChhcmd1bWVudHNbMF0pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5lbnN1cmVDYXBhY2l0eT1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdCxpY119LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5hcnJheV8ucHVzaCh0KTp0aGlzLmFycmF5Xy5zcGxpY2UoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSksITB9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5hcnJheV89W119LGUucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSk7cmV0dXJuITB9LGUucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuYXJyYXlfW3RdO3JldHVybiB0aGlzLmFycmF5X1t0XT1lLG59LGUucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBjYyh0aGlzKX0sZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2lmKHQ8MHx8dD49dGhpcy5zaXplKCkpdGhyb3cgbmV3IG9jO3JldHVybiB0aGlzLmFycmF5X1t0XX0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofSxlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLmxlbmd0aH0sZS5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl0LnB1c2godGhpcy5hcnJheV9bZV0pO3JldHVybiB0fSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSExLG49MCxyPXRoaXMuYXJyYXlfLmxlbmd0aDtuPHI7bisrKWlmKHRoaXMuYXJyYXlfW25dPT09dCl7dGhpcy5hcnJheV8uc3BsaWNlKG4sMSksZT0hMDticmVha31yZXR1cm4gZX0sZX0oYWMpLGNjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpLHRoaXMuYXJyYXlMaXN0Xz1lLHRoaXMucG9zaXRpb25fPTB9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvc2l0aW9uXz09PXRoaXMuYXJyYXlMaXN0Xy5zaXplKCkpdGhyb3cgbmV3IHVjO3JldHVybiB0aGlzLmFycmF5TGlzdF8uZ2V0KHRoaXMucG9zaXRpb25fKyspfSxlLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb25fPHRoaXMuYXJyYXlMaXN0Xy5zaXplKCl9LGUucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hcnJheUxpc3RfLnNldCh0aGlzLnBvc2l0aW9uXy0xLHQpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmFycmF5TGlzdF8ucmVtb3ZlKHRoaXMuYXJyYXlMaXN0Xy5nZXQodGhpcy5wb3NpdGlvbl8pKX0sZX0oc2MpLGhjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtpZih0LmNhbGwodGhpcyksMD09PWFyZ3VtZW50cy5sZW5ndGgpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmVuc3VyZUNhcGFjaXR5KGUubGVuZ3RoKSx0aGlzLmFkZChlLCEwKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5lbnN1cmVDYXBhY2l0eShuLmxlbmd0aCksdGhpcy5hZGQobixyKX19dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e2Nvb3JkQXJyYXlUeXBlOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gbi5jb29yZEFycmF5VHlwZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFycmF5KDApLmZpbGwobnVsbCl9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0KHQpfSxlLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9ITEsbz1uLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KWUuYWRkKG8ubmV4dCgpLHIpLGk9ITA7cmV0dXJuIGl9cmV0dXJuIHQucHJvdG90eXBlLmFkZEFsbC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXQucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyksbj0wO248dGhpcy5zaXplKCk7bisrKWUuYWRkKG4sdGhpcy5nZXQobikuY29weSgpKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUudG9Db29yZGluYXRlQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b0FycmF5KGUuY29vcmRBcnJheVR5cGUpfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF07dC5wcm90b3R5cGUuYWRkLmNhbGwodGhpcyxuKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5hZGQocixpLCEwKSwhMH1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsJiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXTtpZighcyYmdGhpcy5zaXplKCk+PTEpe3ZhciBhPXRoaXMuZ2V0KHRoaXMuc2l6ZSgpLTEpO2lmKGEuZXF1YWxzMkQobykpcmV0dXJuIG51bGx9dC5wcm90b3R5cGUuYWRkLmNhbGwodGhpcyxvKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgT2JqZWN0JiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciB1PWFyZ3VtZW50c1swXSxsPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5hZGQodSxsKSwhMH19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBjPWFyZ3VtZW50c1swXSxoPWFyZ3VtZW50c1sxXSxwPWFyZ3VtZW50c1syXTtpZihwKWZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKWUuYWRkKGNbZl0saCk7ZWxzZSBmb3IodmFyIGc9Yy5sZW5ndGgtMTtnPj0wO2ctLSllLmFkZChjW2ddLGgpO3JldHVybiEwfWlmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKXt2YXIgZD1hcmd1bWVudHNbMF0seT1hcmd1bWVudHNbMV0sdj1hcmd1bWVudHNbMl07aWYoIXYpe3ZhciBfPXRoaXMuc2l6ZSgpO2lmKF8+MCl7aWYoZD4wKXt2YXIgbT10aGlzLmdldChkLTEpO2lmKG0uZXF1YWxzMkQoeSkpcmV0dXJuIG51bGx9aWYoZDxfKXt2YXIgeD10aGlzLmdldChkKTtpZih4LmVxdWFsczJEKHkpKXJldHVybiBudWxsfX19dC5wcm90b3R5cGUuYWRkLmNhbGwodGhpcyxkLHkpfX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgRT1hcmd1bWVudHNbMF0sYj1hcmd1bWVudHNbMV0sdz1hcmd1bWVudHNbMl0sST1hcmd1bWVudHNbM10sTj0xO3c+SSYmKE49LTEpO2Zvcih2YXIgUz13O1MhPT1JO1MrPU4pZS5hZGQoRVtTXSxiKTtyZXR1cm4hMH19LGUucHJvdG90eXBlLmNsb3NlUmluZz1mdW5jdGlvbigpe3RoaXMuc2l6ZSgpPjAmJnRoaXMuYWRkKG5ldyB1bCh0aGlzLmdldCgwKSksITEpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGxjKSxwYz1mdW5jdGlvbigpe30sZmM9e0ZvcndhcmRDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LEJpZGlyZWN0aW9uYWxDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LGNvb3JkQXJyYXlUeXBlOntjb25maWd1cmFibGU6ITB9fTtmYy5Gb3J3YXJkQ29tcGFyYXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZ2N9LGZjLkJpZGlyZWN0aW9uYWxDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiBkY30sZmMuY29vcmRBcnJheVR5cGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBcnJheSgwKS5maWxsKG51bGwpfSxwYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHBjfSxwYy5pc1Jpbmc9ZnVuY3Rpb24odCl7cmV0dXJuISh0Lmxlbmd0aDw0KSYmISF0WzBdLmVxdWFsczJEKHRbdC5sZW5ndGgtMV0pfSxwYy5wdE5vdEluTGlzdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO2lmKHBjLmluZGV4T2YocixlKTwwKXJldHVybiByfXJldHVybiBudWxsfSxwYy5zY3JvbGw9ZnVuY3Rpb24odCxlKXt2YXIgbj1wYy5pbmRleE9mKGUsdCk7aWYobjwwKXJldHVybiBudWxsO3ZhciByPW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbChudWxsKTtQbC5hcnJheWNvcHkodCxuLHIsMCx0Lmxlbmd0aC1uKSxQbC5hcnJheWNvcHkodCwwLHIsdC5sZW5ndGgtbixuKSxQbC5hcnJheWNvcHkociwwLHQsMCx0Lmxlbmd0aCl9LHBjLmVxdWFscz1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYodD09PWUpcmV0dXJuITA7aWYobnVsbD09PXR8fG51bGw9PT1lKXJldHVybiExO2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYoIXRbbl0uZXF1YWxzKGVbbl0pKXJldHVybiExO3JldHVybiEwfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07aWYocj09PWkpcmV0dXJuITA7aWYobnVsbD09PXJ8fG51bGw9PT1pKXJldHVybiExO2lmKHIubGVuZ3RoIT09aS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBzPTA7czxyLmxlbmd0aDtzKyspaWYoMCE9PW8uY29tcGFyZShyW3NdLGlbc10pKXJldHVybiExO3JldHVybiEwfX0scGMuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyBoYyxyPTA7cjx0Lmxlbmd0aDtyKyspZS5pbnRlcnNlY3RzKHRbcl0pJiZuLmFkZCh0W3JdLCEwKTtyZXR1cm4gbi50b0Nvb3JkaW5hdGVBcnJheSgpfSxwYy5oYXNSZXBlYXRlZFBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPHQubGVuZ3RoO2UrKylpZih0W2UtMV0uZXF1YWxzKHRbZV0pKXJldHVybiEwO3JldHVybiExfSxwYy5yZW1vdmVSZXBlYXRlZFBvaW50cz1mdW5jdGlvbih0KXtyZXR1cm4gcGMuaGFzUmVwZWF0ZWRQb2ludHModCk/bmV3IGhjKHQsITEpLnRvQ29vcmRpbmF0ZUFycmF5KCk6dH0scGMucmV2ZXJzZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGgtMSxuPU1hdGgudHJ1bmMoZS8yKSxyPTA7cjw9bjtyKyspe3ZhciBpPXRbcl07dFtyXT10W2Utcl0sdFtlLXJdPWl9fSxwYy5yZW1vdmVOdWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49MDtuPHQubGVuZ3RoO24rKyludWxsIT09dFtuXSYmZSsrO3ZhciByPW5ldyBBcnJheShlKS5maWxsKG51bGwpO2lmKDA9PT1lKXJldHVybiByO2Zvcih2YXIgaT0wLG89MDtvPHQubGVuZ3RoO28rKyludWxsIT09dFtvXSYmKHJbaSsrXT10W29dKTtyZXR1cm4gcn0scGMuY29weURlZXA9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciB0PWFyZ3VtZW50c1swXSxlPW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjx0Lmxlbmd0aDtuKyspZVtuXT1uZXcgdWwodFtuXSk7cmV0dXJuIGV9aWYoNT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXSxzPWFyZ3VtZW50c1szXSxhPWFyZ3VtZW50c1s0XSx1PTA7dTxhO3UrKylvW3MrdV09bmV3IHVsKHJbaSt1XSl9LHBjLmlzRXF1YWxSZXZlcnNlZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dLGk9ZVt0Lmxlbmd0aC1uLTFdO2lmKDAhPT1yLmNvbXBhcmVUbyhpKSlyZXR1cm4hMX1yZXR1cm4hMH0scGMuZW52ZWxvcGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBMbCxuPTA7bjx0Lmxlbmd0aDtuKyspZS5leHBhbmRUb0luY2x1ZGUodFtuXSk7cmV0dXJuIGV9LHBjLnRvQ29vcmRpbmF0ZUFycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRvQXJyYXkocGMuY29vcmRBcnJheVR5cGUpfSxwYy5hdExlYXN0TkNvb3JkaW5hdGVzT3JOb3RoaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUubGVuZ3RoPj10P2U6W119LHBjLmluZGV4T2Y9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZih0LmVxdWFscyhlW25dKSlyZXR1cm4gbjtyZXR1cm4tMX0scGMuaW5jcmVhc2luZ0RpcmVjdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPE1hdGgudHJ1bmModC5sZW5ndGgvMik7ZSsrKXt2YXIgbj10Lmxlbmd0aC0xLWUscj10W2VdLmNvbXBhcmVUbyh0W25dKTtpZigwIT09cilyZXR1cm4gcn1yZXR1cm4gMX0scGMuY29tcGFyZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGgmJm48ZS5sZW5ndGg7KXt2YXIgcj10W25dLmNvbXBhcmVUbyhlW25dKTtpZigwIT09cilyZXR1cm4gcjtuKyt9cmV0dXJuIG48ZS5sZW5ndGg/LTE6bjx0Lmxlbmd0aD8xOjB9LHBjLm1pbkNvb3JkaW5hdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW51bGwsbj0wO248dC5sZW5ndGg7bisrKShudWxsPT09ZXx8ZS5jb21wYXJlVG8odFtuXSk+MCkmJihlPXRbbl0pO3JldHVybiBlfSxwYy5leHRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtlPWRsLmNsYW1wKGUsMCx0Lmxlbmd0aCk7dmFyIHI9KG49ZGwuY2xhbXAobiwtMSx0Lmxlbmd0aCkpLWUrMTtuPDAmJihyPTApLGU+PXQubGVuZ3RoJiYocj0wKSxuPGUmJihyPTApO3ZhciBpPW5ldyBBcnJheShyKS5maWxsKG51bGwpO2lmKDA9PT1yKXJldHVybiBpO2Zvcih2YXIgbz0wLHM9ZTtzPD1uO3MrKylpW28rK109dFtzXTtyZXR1cm4gaX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocGMsZmMpO3ZhciBnYz1mdW5jdGlvbigpe307Z2MucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcGMuY29tcGFyZSh0LGUpfSxnYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bc2xdfSxnYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZ2N9O3ZhciBkYz1mdW5jdGlvbigpe307ZGMucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZTtpZihuLmxlbmd0aDxyLmxlbmd0aClyZXR1cm4tMTtpZihuLmxlbmd0aD5yLmxlbmd0aClyZXR1cm4gMTtpZigwPT09bi5sZW5ndGgpcmV0dXJuIDA7dmFyIGk9cGMuY29tcGFyZShuLHIpO3JldHVybiBwYy5pc0VxdWFsUmV2ZXJzZWQobixyKT8wOml9LGRjLnByb3RvdHlwZS5PTERjb21wYXJlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dCxyPWU7aWYobi5sZW5ndGg8ci5sZW5ndGgpcmV0dXJuLTE7aWYobi5sZW5ndGg+ci5sZW5ndGgpcmV0dXJuIDE7aWYoMD09PW4ubGVuZ3RoKXJldHVybiAwO2Zvcih2YXIgaT1wYy5pbmNyZWFzaW5nRGlyZWN0aW9uKG4pLG89cGMuaW5jcmVhc2luZ0RpcmVjdGlvbihyKSxzPWk+MD8wOm4ubGVuZ3RoLTEsYT1vPjA/MDpuLmxlbmd0aC0xLHU9MDt1PG4ubGVuZ3RoO3UrKyl7dmFyIGw9bltzXS5jb21wYXJlVG8oclthXSk7aWYoMCE9PWwpcmV0dXJuIGw7cys9aSxhKz1vfXJldHVybiAwfSxkYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bc2xdfSxkYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZGN9O3ZhciB5Yz1mdW5jdGlvbigpe307eWMucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe30seWMucHJvdG90eXBlLnB1dD1mdW5jdGlvbigpe30seWMucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXt9LHljLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt9LHljLnByb3RvdHlwZS5lbnRyeVNldD1mdW5jdGlvbigpe307dmFyIHZjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oeWMpO2Z1bmN0aW9uIF9jKHQpe3RoaXMubWVzc2FnZT10fHwiIn1mdW5jdGlvbiBtYygpe31fYy5wcm90b3R5cGU9bmV3IEVycm9yLF9jLnByb3RvdHlwZS5uYW1lPSJPcGVyYXRpb25Ob3RTdXBwb3J0ZWQiLG1jLnByb3RvdHlwZT1uZXcgaWMsbWMucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKCl7fTt2YXIgeGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLmFycmF5Xz1bXSxhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGljJiZ0aGlzLmFkZEFsbChhcmd1bWVudHNbMF0pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXtpZih0aGlzLmFycmF5X1tlXT09PXQpcmV0dXJuITB9cmV0dXJuITF9LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4hdGhpcy5jb250YWlucyh0KSYmKHRoaXMuYXJyYXlfLnB1c2godCksITApfSxlLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspdGhpcy5hZGQoZS5uZXh0KCkpO3JldHVybiEwfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yfSxlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLmxlbmd0aH0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofSxlLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXQucHVzaCh0aGlzLmFycmF5X1tlXSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFYyh0aGlzKX0sZX0obWMpLEVjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpLHRoaXMuaGFzaFNldF89ZSx0aGlzLnBvc2l0aW9uXz0wfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5wb3NpdGlvbl89PT10aGlzLmhhc2hTZXRfLnNpemUoKSl0aHJvdyBuZXcgdWM7cmV0dXJuIHRoaXMuaGFzaFNldF8uYXJyYXlfW3RoaXMucG9zaXRpb25fKytdfSxlLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb25fPHRoaXMuaGFzaFNldF8uc2l6ZSgpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgX2N9LGV9KHNjKTtmdW5jdGlvbiBiYyh0KXtyZXR1cm4gbnVsbD09PXQ/MDp0LmNvbG9yfWZ1bmN0aW9uIHdjKHQpe3JldHVybiBudWxsPT09dD9udWxsOnQucGFyZW50fWZ1bmN0aW9uIEljKHQsZSl7bnVsbCE9PXQmJih0LmNvbG9yPWUpfWZ1bmN0aW9uIE5jKHQpe3JldHVybiBudWxsPT09dD9udWxsOnQubGVmdH1mdW5jdGlvbiBTYyh0KXtyZXR1cm4gbnVsbD09PXQ/bnVsbDp0LnJpZ2h0fWZ1bmN0aW9uIENjKCl7dGhpcy5yb290Xz1udWxsLHRoaXMuc2l6ZV89MH1DYy5wcm90b3R5cGU9bmV3IHZjLENjLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMucm9vdF87bnVsbCE9PWU7KXt2YXIgbj10LmNvbXBhcmVUbyhlLmtleSk7aWYobjwwKWU9ZS5sZWZ0O2Vsc2V7aWYoIShuPjApKXJldHVybiBlLnZhbHVlO2U9ZS5yaWdodH19cmV0dXJuIG51bGx9LENjLnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT09dGhpcy5yb290XylyZXR1cm4gdGhpcy5yb290Xz17a2V5OnQsdmFsdWU6ZSxsZWZ0Om51bGwscmlnaHQ6bnVsbCxwYXJlbnQ6bnVsbCxjb2xvcjowLGdldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LGdldEtleTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtleX19LHRoaXMuc2l6ZV89MSxudWxsO3ZhciBuLHIsaT10aGlzLnJvb3RfO2Rve2lmKG49aSwocj10LmNvbXBhcmVUbyhpLmtleSkpPDApaT1pLmxlZnQ7ZWxzZXtpZighKHI+MCkpe3ZhciBvPWkudmFsdWU7cmV0dXJuIGkudmFsdWU9ZSxvfWk9aS5yaWdodH19d2hpbGUobnVsbCE9PWkpO3ZhciBzPXtrZXk6dCxsZWZ0Om51bGwscmlnaHQ6bnVsbCx2YWx1ZTplLHBhcmVudDpuLGNvbG9yOjAsZ2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX0sZ2V0S2V5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2V5fX07cmV0dXJuIHI8MD9uLmxlZnQ9czpuLnJpZ2h0PXMsdGhpcy5maXhBZnRlckluc2VydGlvbihzKSx0aGlzLnNpemVfKyssbnVsbH0sQ2MucHJvdG90eXBlLmZpeEFmdGVySW5zZXJ0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7Zm9yKHQuY29sb3I9MTtudWxsIT10JiZ0IT09dGhpcy5yb290XyYmMT09PXQucGFyZW50LmNvbG9yOylpZih3Yyh0KT09PU5jKHdjKHdjKHQpKSkpe3ZhciBuPVNjKHdjKHdjKHQpKSk7MT09PWJjKG4pPyhJYyh3Yyh0KSwwKSxJYyhuLDApLEljKHdjKHdjKHQpKSwxKSx0PXdjKHdjKHQpKSk6KHQ9PT1TYyh3Yyh0KSkmJih0PXdjKHQpLGUucm90YXRlTGVmdCh0KSksSWMod2ModCksMCksSWMod2Mod2ModCkpLDEpLGUucm90YXRlUmlnaHQod2Mod2ModCkpKSl9ZWxzZXt2YXIgcj1OYyh3Yyh3Yyh0KSkpOzE9PT1iYyhyKT8oSWMod2ModCksMCksSWMociwwKSxJYyh3Yyh3Yyh0KSksMSksdD13Yyh3Yyh0KSkpOih0PT09TmMod2ModCkpJiYodD13Yyh0KSxlLnJvdGF0ZVJpZ2h0KHQpKSxJYyh3Yyh0KSwwKSxJYyh3Yyh3Yyh0KSksMSksZS5yb3RhdGVMZWZ0KHdjKHdjKHQpKSkpfXRoaXMucm9vdF8uY29sb3I9MH0sQ2MucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3ZhciB0PW5ldyBsYyxlPXRoaXMuZ2V0Rmlyc3RFbnRyeSgpO2lmKG51bGwhPT1lKWZvcih0LmFkZChlLnZhbHVlKTtudWxsIT09KGU9Q2Muc3VjY2Vzc29yKGUpKTspdC5hZGQoZS52YWx1ZSk7cmV0dXJuIHR9LENjLnByb3RvdHlwZS5lbnRyeVNldD1mdW5jdGlvbigpe3ZhciB0PW5ldyB4YyxlPXRoaXMuZ2V0Rmlyc3RFbnRyeSgpO2lmKG51bGwhPT1lKWZvcih0LmFkZChlKTtudWxsIT09KGU9Q2Muc3VjY2Vzc29yKGUpKTspdC5hZGQoZSk7cmV0dXJuIHR9LENjLnByb3RvdHlwZS5yb3RhdGVMZWZ0PWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3ZhciBlPXQucmlnaHQ7dC5yaWdodD1lLmxlZnQsbnVsbCE9ZS5sZWZ0JiYoZS5sZWZ0LnBhcmVudD10KSxlLnBhcmVudD10LnBhcmVudCxudWxsPT09dC5wYXJlbnQ/dGhpcy5yb290Xz1lOnQucGFyZW50LmxlZnQ9PT10P3QucGFyZW50LmxlZnQ9ZTp0LnBhcmVudC5yaWdodD1lLGUubGVmdD10LHQucGFyZW50PWV9fSxDYy5wcm90b3R5cGUucm90YXRlUmlnaHQ9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dmFyIGU9dC5sZWZ0O3QubGVmdD1lLnJpZ2h0LG51bGwhPWUucmlnaHQmJihlLnJpZ2h0LnBhcmVudD10KSxlLnBhcmVudD10LnBhcmVudCxudWxsPT09dC5wYXJlbnQ/dGhpcy5yb290Xz1lOnQucGFyZW50LnJpZ2h0PT09dD90LnBhcmVudC5yaWdodD1lOnQucGFyZW50LmxlZnQ9ZSxlLnJpZ2h0PXQsdC5wYXJlbnQ9ZX19LENjLnByb3RvdHlwZS5nZXRGaXJzdEVudHJ5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yb290XztpZihudWxsIT10KWZvcig7bnVsbCE9dC5sZWZ0Oyl0PXQubGVmdDtyZXR1cm4gdH0sQ2Muc3VjY2Vzc29yPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXJldHVybiBudWxsO2lmKG51bGwhPT10LnJpZ2h0KXtmb3IodmFyIGU9dC5yaWdodDtudWxsIT09ZS5sZWZ0OyllPWUubGVmdDtyZXR1cm4gZX1mb3IodmFyIG49dC5wYXJlbnQscj10O251bGwhPT1uJiZyPT09bi5yaWdodDspcj1uLG49bi5wYXJlbnQ7cmV0dXJuIG59LENjLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2l6ZV99O3ZhciBQYz1mdW5jdGlvbigpe307ZnVuY3Rpb24gTWMoKXt9ZnVuY3Rpb24gTGMoKXt0aGlzLmFycmF5Xz1bXSxhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGljJiZ0aGlzLmFkZEFsbChhcmd1bWVudHNbMF0pfVBjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxQYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUGN9LE1jLnByb3RvdHlwZT1uZXcgbWMsTGMucHJvdG90eXBlPW5ldyBNYyxMYy5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl7aWYoMD09PXRoaXMuYXJyYXlfW2VdLmNvbXBhcmVUbyh0KSlyZXR1cm4hMH1yZXR1cm4hMX0sTGMucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZih0aGlzLmNvbnRhaW5zKHQpKXJldHVybiExO2Zvcih2YXIgZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspe2lmKDE9PT10aGlzLmFycmF5X1tlXS5jb21wYXJlVG8odCkpcmV0dXJuIHRoaXMuYXJyYXlfLnNwbGljZShlLDAsdCksITB9cmV0dXJuIHRoaXMuYXJyYXlfLnB1c2godCksITB9LExjLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspdGhpcy5hZGQoZS5uZXh0KCkpO3JldHVybiEwfSxMYy5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBfY30sTGMucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcnJheV8ubGVuZ3RofSxMYy5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofSxMYy5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl0LnB1c2godGhpcy5hcnJheV9bZV0pO3JldHVybiB0fSxMYy5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE9jKHRoaXMpfTt2YXIgT2M9ZnVuY3Rpb24odCl7dGhpcy50cmVlU2V0Xz10LHRoaXMucG9zaXRpb25fPTB9O09jLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5wb3NpdGlvbl89PT10aGlzLnRyZWVTZXRfLnNpemUoKSl0aHJvdyBuZXcgdWM7cmV0dXJuIHRoaXMudHJlZVNldF8uYXJyYXlfW3RoaXMucG9zaXRpb25fKytdfSxPYy5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uXzx0aGlzLnRyZWVTZXRfLnNpemUoKX0sT2MucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBfY307dmFyIFJjPWZ1bmN0aW9uKCl7fTtSYy5zb3J0PWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaT1hcmd1bWVudHNbMF07aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcj1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNvbXBhcmVUbyhlKX0saS5zb3J0KHIpO2Vsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpbj1hcmd1bWVudHNbMV0scj1mdW5jdGlvbih0LGUpe3JldHVybiBuLmNvbXBhcmUodCxlKX0saS5zb3J0KHIpO2Vsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpeyhlPWkuc2xpY2UoYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSkpLnNvcnQoKTt2YXIgbz1pLnNsaWNlKDAsYXJndW1lbnRzWzFdKS5jb25jYXQoZSxpLnNsaWNlKGFyZ3VtZW50c1syXSxpLmxlbmd0aCkpO2ZvcihpLnNwbGljZSgwLGkubGVuZ3RoKSx0PTA7dDxvLmxlbmd0aDt0KyspaS5wdXNoKG9bdF0pfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKGU9aS5zbGljZShhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKSxuPWFyZ3VtZW50c1szXSxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY29tcGFyZSh0LGUpfSxlLnNvcnQociksbz1pLnNsaWNlKDAsYXJndW1lbnRzWzFdKS5jb25jYXQoZSxpLnNsaWNlKGFyZ3VtZW50c1syXSxpLmxlbmd0aCkpLGkuc3BsaWNlKDAsaS5sZW5ndGgpLHQ9MDt0PG8ubGVuZ3RoO3QrKylpLnB1c2gob1t0XSl9LFJjLmFzTGlzdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGxjLG49MCxyPXQubGVuZ3RoO248cjtuKyspZS5hZGQodFtuXSk7cmV0dXJuIGV9O3ZhciBUYz1mdW5jdGlvbigpe30sQWM9e1A6e2NvbmZpZ3VyYWJsZTohMH0sTDp7Y29uZmlndXJhYmxlOiEwfSxBOntjb25maWd1cmFibGU6ITB9LEZBTFNFOntjb25maWd1cmFibGU6ITB9LFRSVUU6e2NvbmZpZ3VyYWJsZTohMH0sRE9OVENBUkU6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX0ZBTFNFOntjb25maWd1cmFibGU6ITB9LFNZTV9UUlVFOntjb25maWd1cmFibGU6ITB9LFNZTV9ET05UQ0FSRTp7Y29uZmlndXJhYmxlOiEwfSxTWU1fUDp7Y29uZmlndXJhYmxlOiEwfSxTWU1fTDp7Y29uZmlndXJhYmxlOiEwfSxTWU1fQTp7Y29uZmlndXJhYmxlOiEwfX07QWMuUC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sQWMuTC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sQWMuQS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sQWMuRkFMU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTF9LEFjLlRSVUUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTJ9LEFjLkRPTlRDQVJFLmdldD1mdW5jdGlvbigpe3JldHVybi0zfSxBYy5TWU1fRkFMU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIkYifSxBYy5TWU1fVFJVRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iVCJ9LEFjLlNZTV9ET05UQ0FSRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iKiJ9LEFjLlNZTV9QLmdldD1mdW5jdGlvbigpe3JldHVybiIwIn0sQWMuU1lNX0wuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIjEifSxBYy5TWU1fQS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iMiJ9LFRjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxUYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVGN9LFRjLnRvRGltZW5zaW9uU3ltYm9sPWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlIFRjLkZBTFNFOnJldHVybiBUYy5TWU1fRkFMU0U7Y2FzZSBUYy5UUlVFOnJldHVybiBUYy5TWU1fVFJVRTtjYXNlIFRjLkRPTlRDQVJFOnJldHVybiBUYy5TWU1fRE9OVENBUkU7Y2FzZSBUYy5QOnJldHVybiBUYy5TWU1fUDtjYXNlIFRjLkw6cmV0dXJuIFRjLlNZTV9MO2Nhc2UgVGMuQTpyZXR1cm4gVGMuU1lNX0F9dGhyb3cgbmV3IGVsKCJVbmtub3duIGRpbWVuc2lvbiB2YWx1ZTogIit0KX0sVGMudG9EaW1lbnNpb25WYWx1ZT1mdW5jdGlvbih0KXtzd2l0Y2gobWwudG9VcHBlckNhc2UodCkpe2Nhc2UgVGMuU1lNX0ZBTFNFOnJldHVybiBUYy5GQUxTRTtjYXNlIFRjLlNZTV9UUlVFOnJldHVybiBUYy5UUlVFO2Nhc2UgVGMuU1lNX0RPTlRDQVJFOnJldHVybiBUYy5ET05UQ0FSRTtjYXNlIFRjLlNZTV9QOnJldHVybiBUYy5QO2Nhc2UgVGMuU1lNX0w6cmV0dXJuIFRjLkw7Y2FzZSBUYy5TWU1fQTpyZXR1cm4gVGMuQX10aHJvdyBuZXcgZWwoIlVua25vd24gZGltZW5zaW9uIHN5bWJvbDogIit0KX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVGMsQWMpO3ZhciBEYz1mdW5jdGlvbigpe307RGMucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt9LERjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxEYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRGN9O3ZhciBGYz1mdW5jdGlvbigpe307RmMucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0LGUpe30sRmMucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe30sRmMucHJvdG90eXBlLmlzR2VvbWV0cnlDaGFuZ2VkPWZ1bmN0aW9uKCl7fSxGYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEZjfTt2YXIga2M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe2lmKHQuY2FsbCh0aGlzLG4pLHRoaXMuX2dlb21ldHJpZXM9ZXx8W10sdC5oYXNOdWxsRWxlbWVudHModGhpcy5fZ2VvbWV0cmllcykpdGhyb3cgbmV3IGVsKCJnZW9tZXRyaWVzIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBlbGVtZW50cyIpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuY29tcHV0ZUVudmVsb3BlSW50ZXJuYWw9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IExsLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKyl0LmV4cGFuZFRvSW5jbHVkZSh0aGlzLl9nZW9tZXRyaWVzW2VdLmdldEVudmVsb3BlSW50ZXJuYWwoKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5Tj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZ2VvbWV0cmllc1t0XX0sZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHQuU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTn0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuZ2V0TnVtUG9pbnRzKCkpLmZpbGwobnVsbCksZT0tMSxuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspZm9yKHZhciByPXRoaXMuX2dlb21ldHJpZXNbbl0uZ2V0Q29vcmRpbmF0ZXMoKSxpPTA7aTxyLmxlbmd0aDtpKyspdFsrK2VdPXJbaV07cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdCs9dGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRBcmVhKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO2lmKCF0aGlzLmlzRXF1aXZhbGVudENsYXNzKG4pKXJldHVybiExO3ZhciBpPW47aWYodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGghPT1pLl9nZW9tZXRyaWVzLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIG89MDtvPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO28rKylpZighZS5fZ2VvbWV0cmllc1tvXS5lcXVhbHNFeGFjdChpLl9nZW9tZXRyaWVzW29dLHIpKXJldHVybiExO3JldHVybiEwfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7dCsrKXRoaXMuX2dlb21ldHJpZXNbdF0ubm9ybWFsaXplKCk7UmMuc29ydCh0aGlzLl9nZW9tZXRyaWVzKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9udWxsOnRoaXMuX2dlb21ldHJpZXNbMF0uZ2V0Q29vcmRpbmF0ZSgpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe2Zvcih2YXIgdD1UYy5GQUxTRSxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdD1NYXRoLm1heCh0LHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0Qm91bmRhcnlEaW1lbnNpb24oKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe2Zvcih2YXIgdD1UYy5GQUxTRSxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdD1NYXRoLm1heCh0LHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0RGltZW5zaW9uKCkpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdCs9dGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRMZW5ndGgoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKXQrPXRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0TnVtUG9pbnRzKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldE51bUdlb21ldHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2VvbWV0cmllcy5sZW5ndGh9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgsZT1uZXcgQXJyYXkodCkuZmlsbChudWxsKSxuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspZVtuXT10aGlzLl9nZW9tZXRyaWVzW25dLnJldmVyc2UoKTtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKGUpfSxlLnByb3RvdHlwZS5jb21wYXJlVG9TYW1lQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1uZXcgTGMoUmMuYXNMaXN0KHRoaXMuX2dlb21ldHJpZXMpKSxyPW5ldyBMYyhSYy5hc0xpc3QoZS5fZ2VvbWV0cmllcykpO3JldHVybiB0aGlzLmNvbXBhcmUobixyKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWksYT10aGlzLmdldE51bUdlb21ldHJpZXMoKSx1PXMuZ2V0TnVtR2VvbWV0cmllcygpLGw9MDtsPGEmJmw8dTspe3ZhciBjPXQuZ2V0R2VvbWV0cnlOKGwpLGg9cy5nZXRHZW9tZXRyeU4obCkscD1jLmNvbXBhcmVUb1NhbWVDbGFzcyhoLG8pO2lmKDAhPT1wKXJldHVybiBwO2wrK31yZXR1cm4gbDxhPzE6bDx1Py0xOjB9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoZ2woYXJndW1lbnRzWzBdLEtsKSlmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyl0Ll9nZW9tZXRyaWVzW25dLmFwcGx5KGUpO2Vsc2UgaWYoZ2woYXJndW1lbnRzWzBdLEZjKSl7dmFyIHI9YXJndW1lbnRzWzBdO2lmKDA9PT10aGlzLl9nZW9tZXRyaWVzLmxlbmd0aClyZXR1cm4gbnVsbDtmb3IodmFyIGk9MDtpPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoJiYodC5fZ2VvbWV0cmllc1tpXS5hcHBseShyKSwhci5pc0RvbmUoKSk7aSsrKTtyLmlzR2VvbWV0cnlDaGFuZ2VkKCkmJnRoaXMuZ2VvbWV0cnlDaGFuZ2VkKCl9ZWxzZSBpZihnbChhcmd1bWVudHNbMF0sRGMpKXt2YXIgbz1hcmd1bWVudHNbMF07by5maWx0ZXIodGhpcyk7Zm9yKHZhciBzPTA7czx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtzKyspdC5fZ2VvbWV0cmllc1tzXS5hcHBseShvKX1lbHNlIGlmKGdsKGFyZ3VtZW50c1swXSxIbCkpe3ZhciBhPWFyZ3VtZW50c1swXTthLmZpbHRlcih0aGlzKTtmb3IodmFyIHU9MDt1PHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO3UrKyl0Ll9nZW9tZXRyaWVzW3VdLmFwcGx5KGEpfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbih0aGlzKSxxbC5zaG91bGROZXZlclJlYWNoSGVyZSgpLG51bGx9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtlLl9nZW9tZXRyaWVzPW5ldyBBcnJheSh0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCkuZmlsbChudWxsKTtmb3IodmFyIG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyllLl9nZW9tZXRyaWVzW25dPXRoaXMuX2dlb21ldHJpZXNbbl0uY2xvbmUoKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIkdlb21ldHJ5Q29sbGVjdGlvbiJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoKS5maWxsKG51bGwpLG49MDtuPHQubGVuZ3RoO24rKyl0W25dPXRoaXMuX2dlb21ldHJpZXNbbl0uY29weSgpO3JldHVybiBuZXcgZSh0LHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDt0KyspaWYoIXRoaXMuX2dlb21ldHJpZXNbdF0uaXNFbXB0eSgpKXJldHVybiExO3JldHVybiEwfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4NGYwN2JjYjFmODU3ZDgwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShXbCksR2M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIFdsLlNPUlRJTkRFWF9NVUxUSUxJTkVTVFJJTkd9LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4hIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MoZSkmJnQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmNhbGwodGhpcyxlLG4pfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNDbG9zZWQoKT9UYy5GQUxTRTowfSxlLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO2Zvcih2YXIgdD0wO3Q8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7dCsrKWlmKCF0aGlzLl9nZW9tZXRyaWVzW3RdLmlzQ2xvc2VkKCkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dlb21ldHJpZXMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLmZpbGwobnVsbCksbj0wO248dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7bisrKWVbdC0xLW5dPXRoaXMuX2dlb21ldHJpZXNbbl0ucmV2ZXJzZSgpO3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoZSl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxYyh0aGlzKS5nZXRCb3VuZGFyeSgpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTXVsdGlMaW5lU3RyaW5nIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1BjXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDcxNTVkMmFiNGFmYTgwMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oa2MpLHFjPWZ1bmN0aW9uKCl7aWYodGhpcy5fZ2VvbT1udWxsLHRoaXMuX2dlb21GYWN0PW51bGwsdGhpcy5fYm5SdWxlPW51bGwsdGhpcy5fZW5kcG9pbnRNYXA9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9UWwuTU9EMl9CT1VOREFSWV9SVUxFO3RoaXMuX2dlb209dCx0aGlzLl9nZW9tRmFjdD10LmdldEZhY3RvcnkoKSx0aGlzLl9iblJ1bGU9ZX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbT1uLHRoaXMuX2dlb21GYWN0PW4uZ2V0RmFjdG9yeSgpLHRoaXMuX2JuUnVsZT1yfX07cWMucHJvdG90eXBlLmJvdW5kYXJ5TXVsdGlMaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2dlb20uaXNFbXB0eSgpKXJldHVybiB0aGlzLmdldEVtcHR5TXVsdGlQb2ludCgpO3ZhciBlPXRoaXMuY29tcHV0ZUJvdW5kYXJ5Q29vcmRpbmF0ZXModCk7cmV0dXJuIDE9PT1lLmxlbmd0aD90aGlzLl9nZW9tRmFjdC5jcmVhdGVQb2ludChlWzBdKTp0aGlzLl9nZW9tRmFjdC5jcmVhdGVNdWx0aVBvaW50RnJvbUNvb3JkcyhlKX0scWMucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dlb20gaW5zdGFuY2VvZiBaYz90aGlzLmJvdW5kYXJ5TGluZVN0cmluZyh0aGlzLl9nZW9tKTp0aGlzLl9nZW9tIGluc3RhbmNlb2YgR2M/dGhpcy5ib3VuZGFyeU11bHRpTGluZVN0cmluZyh0aGlzLl9nZW9tKTp0aGlzLl9nZW9tLmdldEJvdW5kYXJ5KCl9LHFjLnByb3RvdHlwZS5ib3VuZGFyeUxpbmVTdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dlb20uaXNFbXB0eSgpP3RoaXMuZ2V0RW1wdHlNdWx0aVBvaW50KCk6dC5pc0Nsb3NlZCgpP3RoaXMuX2JuUnVsZS5pc0luQm91bmRhcnkoMik/dC5nZXRTdGFydFBvaW50KCk6dGhpcy5fZ2VvbUZhY3QuY3JlYXRlTXVsdGlQb2ludCgpOnRoaXMuX2dlb21GYWN0LmNyZWF0ZU11bHRpUG9pbnQoW3QuZ2V0U3RhcnRQb2ludCgpLHQuZ2V0RW5kUG9pbnQoKV0pfSxxYy5wcm90b3R5cGUuZ2V0RW1wdHlNdWx0aVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dlb21GYWN0LmNyZWF0ZU11bHRpUG9pbnQoKX0scWMucHJvdG90eXBlLmNvbXB1dGVCb3VuZGFyeUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1uZXcgbGM7dGhpcy5fZW5kcG9pbnRNYXA9bmV3IENjO2Zvcih2YXIgcj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10LmdldEdlb21ldHJ5TihyKTswIT09aS5nZXROdW1Qb2ludHMoKSYmKGUuYWRkRW5kcG9pbnQoaS5nZXRDb29yZGluYXRlTigwKSksZS5hZGRFbmRwb2ludChpLmdldENvb3JkaW5hdGVOKGkuZ2V0TnVtUG9pbnRzKCktMSkpKX1mb3IodmFyIG89dGhpcy5fZW5kcG9pbnRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCksYT1zLmdldFZhbHVlKCkuY291bnQ7ZS5fYm5SdWxlLmlzSW5Cb3VuZGFyeShhKSYmbi5hZGQocy5nZXRLZXkoKSl9cmV0dXJuIHBjLnRvQ29vcmRpbmF0ZUFycmF5KG4pfSxxYy5wcm90b3R5cGUuYWRkRW5kcG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZW5kcG9pbnRNYXAuZ2V0KHQpO251bGw9PT1lJiYoZT1uZXcgQmMsdGhpcy5fZW5kcG9pbnRNYXAucHV0KHQsZSkpLGUuY291bnQrK30scWMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHFjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxY30scWMuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9bmV3IHFjKHQpO3JldHVybiBlLmdldEJvdW5kYXJ5KCl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPW5ldyBxYyhuLHIpO3JldHVybiBpLmdldEJvdW5kYXJ5KCl9fTt2YXIgQmM9ZnVuY3Rpb24oKXt0aGlzLmNvdW50PW51bGx9O2Z1bmN0aW9uIHpjKCl7fWZ1bmN0aW9uIGpjKCl7fUJjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxCYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQmN9O3ZhciBVYz1mdW5jdGlvbigpe307ZnVuY3Rpb24gVmMoKXt9ZnVuY3Rpb24gWGMoKXt9ZnVuY3Rpb24gWWMoKXt9dmFyIEhjPWZ1bmN0aW9uKCl7fSxXYz17TkVXTElORTp7Y29uZmlndXJhYmxlOiEwfSxTSU1QTEVfT1JESU5BVEVfRk9STUFUOntjb25maWd1cmFibGU6ITB9fTtIYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEhjfSxIYy5jaGFycz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgQXJyYXkoZSkuZmlsbChudWxsKSxyPTA7cjxlO3IrKyluW3JdPXQ7cmV0dXJuIFN0cmluZyhuKX0sSGMuZ2V0U3RhY2tUcmFjZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgVmMsbj1uZXcgemMoZSk7cmV0dXJuIHQucHJpbnRTdGFja1RyYWNlKG4pLGUudG9TdHJpbmcoKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPSIiLHM9bmV3IGpjKEhjLmdldFN0YWNrVHJhY2UocikpLGE9bmV3IFljKHMpLHU9MDt1PGk7dSsrKXRyeXtvKz1hLnJlYWRMaW5lKCkrSGMuTkVXTElORX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBYYykpdGhyb3cgdDtxbC5zaG91bGROZXZlclJlYWNoSGVyZSgpfXJldHVybiBvfX0sSGMuc3BsaXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5sZW5ndGgscj1uZXcgbGMsaT0iIit0LG89aS5pbmRleE9mKGUpO28+PTA7KXt2YXIgcz1pLnN1YnN0cmluZygwLG8pO3IuYWRkKHMpLG89KGk9aS5zdWJzdHJpbmcobytuKSkuaW5kZXhPZihlKX1pLmxlbmd0aD4wJiZyLmFkZChpKTtmb3IodmFyIGE9bmV3IEFycmF5KHIuc2l6ZSgpKS5maWxsKG51bGwpLHU9MDt1PGEubGVuZ3RoO3UrKylhW3VdPXIuZ2V0KHUpO3JldHVybiBhfSxIYy50b1N0cmluZz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIEhjLlNJTVBMRV9PUkRJTkFURV9GT1JNQVQuZm9ybWF0KHQpfX0sSGMuc3BhY2VzPWZ1bmN0aW9uKHQpe3JldHVybiBIYy5jaGFycygiICIsdCl9LFdjLk5FV0xJTkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFBsLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpfSxXYy5TSU1QTEVfT1JESU5BVEVfRk9STUFULmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgVWMoIjAuIyIpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhIYyxXYyk7dmFyIEpjPWZ1bmN0aW9uKCl7fTtKYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEpjfSxKYy5jb3B5Q29vcmQ9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPU1hdGgubWluKHQuZ2V0RGltZW5zaW9uKCksbi5nZXREaW1lbnNpb24oKSksbz0wO288aTtvKyspbi5zZXRPcmRpbmF0ZShyLG8sdC5nZXRPcmRpbmF0ZShlLG8pKX0sSmMuaXNSaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2l6ZSgpO3JldHVybiAwPT09ZXx8IShlPD0zKSYmKHQuZ2V0T3JkaW5hdGUoMCxJbC5YKT09PXQuZ2V0T3JkaW5hdGUoZS0xLElsLlgpJiZ0LmdldE9yZGluYXRlKDAsSWwuWSk9PT10LmdldE9yZGluYXRlKGUtMSxJbC5ZKSl9LEpjLmlzRXF1YWw9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnNpemUoKTtpZihuIT09ZS5zaXplKCkpcmV0dXJuITE7Zm9yKHZhciByPU1hdGgubWluKHQuZ2V0RGltZW5zaW9uKCksZS5nZXREaW1lbnNpb24oKSksaT0wO2k8bjtpKyspZm9yKHZhciBvPTA7bzxyO28rKyl7dmFyIHM9dC5nZXRPcmRpbmF0ZShpLG8pLGE9ZS5nZXRPcmRpbmF0ZShpLG8pO2lmKHQuZ2V0T3JkaW5hdGUoaSxvKSE9PWUuZ2V0T3JkaW5hdGUoaSxvKSYmKCFubC5pc05hTihzKXx8IW5sLmlzTmFOKGEpKSlyZXR1cm4hMX1yZXR1cm4hMH0sSmMuZXh0ZW5kPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmNyZWF0ZShuLGUuZ2V0RGltZW5zaW9uKCkpLGk9ZS5zaXplKCk7aWYoSmMuY29weShlLDAsciwwLGkpLGk+MClmb3IodmFyIG89aTtvPG47bysrKUpjLmNvcHkoZSxpLTEscixvLDEpO3JldHVybiByfSxKYy5yZXZlcnNlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnNpemUoKS0xLG49TWF0aC50cnVuYyhlLzIpLHI9MDtyPD1uO3IrKylKYy5zd2FwKHQscixlLXIpfSxKYy5zd2FwPWZ1bmN0aW9uKHQsZSxuKXtpZihlPT09bilyZXR1cm4gbnVsbDtmb3IodmFyIHI9MDtyPHQuZ2V0RGltZW5zaW9uKCk7cisrKXt2YXIgaT10LmdldE9yZGluYXRlKGUscik7dC5zZXRPcmRpbmF0ZShlLHIsdC5nZXRPcmRpbmF0ZShuLHIpKSx0LnNldE9yZGluYXRlKG4scixpKX19LEpjLmNvcHk9ZnVuY3Rpb24odCxlLG4scixpKXtmb3IodmFyIG89MDtvPGk7bysrKUpjLmNvcHlDb29yZCh0LGUrbyxuLHIrbyl9LEpjLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXQuc2l6ZSgpO2lmKDA9PT1lKXJldHVybiIoKSI7dmFyIG49dC5nZXREaW1lbnNpb24oKSxyPW5ldyB2bDtyLmFwcGVuZCgiKCIpO2Zvcih2YXIgaT0wO2k8ZTtpKyspe2k+MCYmci5hcHBlbmQoIiAiKTtmb3IodmFyIG89MDtvPG47bysrKW8+MCYmci5hcHBlbmQoIiwiKSxyLmFwcGVuZChIYy50b1N0cmluZyh0LmdldE9yZGluYXRlKGksbykpKX1yZXR1cm4gci5hcHBlbmQoIikiKSxyLnRvU3RyaW5nKCl9fSxKYy5lbnN1cmVWYWxpZFJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnNpemUoKTtyZXR1cm4gMD09PW4/ZTpuPD0zP0pjLmNyZWF0ZUNsb3NlZFJpbmcodCxlLDQpOmUuZ2V0T3JkaW5hdGUoMCxJbC5YKT09PWUuZ2V0T3JkaW5hdGUobi0xLElsLlgpJiZlLmdldE9yZGluYXRlKDAsSWwuWSk9PT1lLmdldE9yZGluYXRlKG4tMSxJbC5ZKT9lOkpjLmNyZWF0ZUNsb3NlZFJpbmcodCxlLG4rMSl9LEpjLmNyZWF0ZUNsb3NlZFJpbmc9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuY3JlYXRlKG4sZS5nZXREaW1lbnNpb24oKSksaT1lLnNpemUoKTtKYy5jb3B5KGUsMCxyLDAsaSk7Zm9yKHZhciBvPWk7bzxuO28rKylKYy5jb3B5KGUsMCxyLG8sMSk7cmV0dXJuIHJ9O3ZhciBaYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dC5jYWxsKHRoaXMsbiksdGhpcy5fcG9pbnRzPW51bGwsdGhpcy5pbml0KGUpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuY29tcHV0ZUVudmVsb3BlSW50ZXJuYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/bmV3IExsOnRoaXMuX3BvaW50cy5leHBhbmRFbnZlbG9wZShuZXcgTGwpfSxlLnByb3RvdHlwZS5pc1Jpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0Nsb3NlZCgpJiZ0aGlzLmlzU2ltcGxlKCl9LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9MSU5FU1RSSU5HfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb2ludHMudG9Db29yZGluYXRlQXJyYXkoKX0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07aWYoIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MobikpcmV0dXJuITE7dmFyIGk9bjtpZih0aGlzLl9wb2ludHMuc2l6ZSgpIT09aS5fcG9pbnRzLnNpemUoKSlyZXR1cm4hMTtmb3IodmFyIG89MDtvPHRoaXMuX3BvaW50cy5zaXplKCk7bysrKWlmKCFlLmVxdWFsKGUuX3BvaW50cy5nZXRDb29yZGluYXRlKG8pLGkuX3BvaW50cy5nZXRDb29yZGluYXRlKG8pLHIpKXJldHVybiExO3JldHVybiEwfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9MDtlPE1hdGgudHJ1bmModGhpcy5fcG9pbnRzLnNpemUoKS8yKTtlKyspe3ZhciBuPXQuX3BvaW50cy5zaXplKCktMS1lO2lmKCF0Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShlKS5lcXVhbHModC5fcG9pbnRzLmdldENvb3JkaW5hdGUobikpKXJldHVybiB0Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShlKS5jb21wYXJlVG8odC5fcG9pbnRzLmdldENvb3JkaW5hdGUobikpPjAmJkpjLnJldmVyc2UodC5fcG9pbnRzKSxudWxsfX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9udWxsOnRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKDApfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzQ2xvc2VkKCk/VGMuRkFMU0U6MH0sZS5wcm90b3R5cGUuaXNDbG9zZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0VtcHR5KCkmJnRoaXMuZ2V0Q29vcmRpbmF0ZU4oMCkuZXF1YWxzMkQodGhpcy5nZXRDb29yZGluYXRlTih0aGlzLmdldE51bVBvaW50cygpLTEpKX0sZS5wcm90b3R5cGUuZ2V0RW5kUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/bnVsbDp0aGlzLmdldFBvaW50Tih0aGlzLmdldE51bVBvaW50cygpLTEpfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZS5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIFhsLmNvbXB1dGVMZW5ndGgodGhpcy5fcG9pbnRzKX0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvaW50cy5zaXplKCl9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wb2ludHMuY29weSgpO3JldHVybiBKYy5yZXZlcnNlKHQpLHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcodCl9LGUucHJvdG90eXBlLmNvbXBhcmVUb1NhbWVDbGFzcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj1lLHI9MCxpPTA7cjx0aGlzLl9wb2ludHMuc2l6ZSgpJiZpPG4uX3BvaW50cy5zaXplKCk7KXt2YXIgbz10Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShyKS5jb21wYXJlVG8obi5fcG9pbnRzLmdldENvb3JkaW5hdGUoaSkpO2lmKDAhPT1vKXJldHVybiBvO3IrKyxpKyt9cmV0dXJuIHI8dGhpcy5fcG9pbnRzLnNpemUoKT8xOmk8bi5fcG9pbnRzLnNpemUoKT8tMTowfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV0sdT1zO3JldHVybiBhLmNvbXBhcmUodGhpcy5fcG9pbnRzLHUuX3BvaW50cyl9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoZ2woYXJndW1lbnRzWzBdLEtsKSlmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MDtuPHRoaXMuX3BvaW50cy5zaXplKCk7bisrKWUuZmlsdGVyKHQuX3BvaW50cy5nZXRDb29yZGluYXRlKG4pKTtlbHNlIGlmKGdsKGFyZ3VtZW50c1swXSxGYykpe3ZhciByPWFyZ3VtZW50c1swXTtpZigwPT09dGhpcy5fcG9pbnRzLnNpemUoKSlyZXR1cm4gbnVsbDtmb3IodmFyIGk9MDtpPHRoaXMuX3BvaW50cy5zaXplKCkmJihyLmZpbHRlcih0Ll9wb2ludHMsaSksIXIuaXNEb25lKCkpO2krKyk7ci5pc0dlb21ldHJ5Q2hhbmdlZCgpJiZ0aGlzLmdlb21ldHJ5Q2hhbmdlZCgpfWVsc2UgaWYoZ2woYXJndW1lbnRzWzBdLERjKSl7dmFyIG89YXJndW1lbnRzWzBdO28uZmlsdGVyKHRoaXMpfWVsc2UgaWYoZ2woYXJndW1lbnRzWzBdLEhsKSl7dmFyIHM9YXJndW1lbnRzWzBdO3MuZmlsdGVyKHRoaXMpfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHFjKHRoaXMpLmdldEJvdW5kYXJ5KCl9LGUucHJvdG90eXBlLmlzRXF1aXZhbGVudENsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgZX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiBlLl9wb2ludHM9dGhpcy5fcG9pbnRzLmNsb25lKCksZX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZU49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKHQpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTGluZVN0cmluZyJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5fcG9pbnRzLmNvcHkoKSx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvaW50c30sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5fcG9pbnRzLnNpemUoKX0sZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0KXtpZihudWxsPT09dCYmKHQ9dGhpcy5nZXRGYWN0b3J5KCkuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSkpLDE9PT10LnNpemUoKSl0aHJvdyBuZXcgZWwoIkludmFsaWQgbnVtYmVyIG9mIHBvaW50cyBpbiBMaW5lU3RyaW5nIChmb3VuZCAiK3Quc2l6ZSgpKyIgLSBtdXN0IGJlIDAgb3IgPj0gMikiKTt0aGlzLl9wb2ludHM9dH0sZS5wcm90b3R5cGUuaXNDb29yZGluYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fcG9pbnRzLnNpemUoKTtlKyspaWYodGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUoZSkuZXF1YWxzKHQpKXJldHVybiEwO3JldHVybiExfSxlLnByb3RvdHlwZS5nZXRTdGFydFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP251bGw6dGhpcy5nZXRQb2ludE4oMCl9LGUucHJvdG90eXBlLmdldFBvaW50Tj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlUG9pbnQodGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUodCkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltQY119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHgyYjJiNTFiYTQzNWM4ZTAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KFdsKSxLYz1mdW5jdGlvbigpe307S2MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEtjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBLY307dmFyIFFjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt0LmNhbGwodGhpcyxuKSx0aGlzLl9jb29yZGluYXRlcz1lfHxudWxsLHRoaXMuaW5pdCh0aGlzLl9jb29yZGluYXRlcyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jb21wdXRlRW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBuZXcgTGw7dmFyIHQ9bmV3IExsO3JldHVybiB0LmV4cGFuZFRvSW5jbHVkZSh0aGlzLl9jb29yZGluYXRlcy5nZXRYKDApLHRoaXMuX2Nvb3JkaW5hdGVzLmdldFkoMCkpLHR9LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9QT0lOVH0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/W106W3RoaXMuZ2V0Q29vcmRpbmF0ZSgpXX0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSYmKCEoIXRoaXMuaXNFbXB0eSgpfHwhZS5pc0VtcHR5KCkpfHx0aGlzLmlzRW1wdHkoKT09PWUuaXNFbXB0eSgpJiZ0aGlzLmVxdWFsKGUuZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLG4pKX1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMuX2Nvb3JkaW5hdGVzLnNpemUoKT90aGlzLl9jb29yZGluYXRlcy5nZXRDb29yZGluYXRlKDApOm51bGx9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIFRjLkZBTFNFfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPzA6MX0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvcHkoKX0sZS5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLmdldENvb3JkaW5hdGUoKSl0aHJvdyBuZXcgRXJyb3IoImdldFggY2FsbGVkIG9uIGVtcHR5IFBvaW50Iik7cmV0dXJuIHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLnh9LGUucHJvdG90eXBlLmNvbXBhcmVUb1NhbWVDbGFzcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT10O3JldHVybiB0aGlzLmdldENvb3JkaW5hdGUoKS5jb21wYXJlVG8oZS5nZXRDb29yZGluYXRlKCkpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1uO3JldHVybiByLmNvbXBhcmUodGhpcy5fY29vcmRpbmF0ZXMsaS5fY29vcmRpbmF0ZXMpfX0sZS5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oKXtpZihnbChhcmd1bWVudHNbMF0sS2wpKXt2YXIgdD1hcmd1bWVudHNbMF07aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dC5maWx0ZXIodGhpcy5nZXRDb29yZGluYXRlKCkpfWVsc2UgaWYoZ2woYXJndW1lbnRzWzBdLEZjKSl7dmFyIGU9YXJndW1lbnRzWzBdO2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBudWxsO2UuZmlsdGVyKHRoaXMuX2Nvb3JkaW5hdGVzLDApLGUuaXNHZW9tZXRyeUNoYW5nZWQoKSYmdGhpcy5nZW9tZXRyeUNoYW5nZWQoKX1lbHNlIGlmKGdsKGFyZ3VtZW50c1swXSxEYykpe3ZhciBuPWFyZ3VtZW50c1swXTtuLmZpbHRlcih0aGlzKX1lbHNlIGlmKGdsKGFyZ3VtZW50c1swXSxIbCkpe3ZhciByPWFyZ3VtZW50c1swXTtyLmZpbHRlcih0aGlzKX19LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihudWxsKX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiBlLl9jb29yZGluYXRlcz10aGlzLl9jb29yZGluYXRlcy5jbG9uZSgpLGV9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJQb2ludCJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5fY29vcmRpbmF0ZXMuY29weSgpLHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlU2VxdWVuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXN9LGUucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5nZXRDb29yZGluYXRlKCkpdGhyb3cgbmV3IEVycm9yKCJnZXRZIGNhbGxlZCBvbiBlbXB0eSBQb2ludCIpO3JldHVybiB0aGlzLmdldENvb3JkaW5hdGUoKS55fSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9jb29yZGluYXRlcy5zaXplKCl9LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCl7bnVsbD09PXQmJih0PXRoaXMuZ2V0RmFjdG9yeSgpLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoW10pKSxxbC5pc1RydWUodC5zaXplKCk8PTEpLHRoaXMuX2Nvb3JkaW5hdGVzPXR9LGUucHJvdG90eXBlLmlzU2ltcGxlPWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0tjXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDQ0MDc3YmFkMTYxY2JjMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oV2wpLCRjPWZ1bmN0aW9uKCl7fTskYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sJGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICRjfTt2YXIgdGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scil7aWYodC5jYWxsKHRoaXMsciksdGhpcy5fc2hlbGw9bnVsbCx0aGlzLl9ob2xlcz1udWxsLG51bGw9PT1lJiYoZT10aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lYXJSaW5nKCkpLG51bGw9PT1uJiYobj1bXSksdC5oYXNOdWxsRWxlbWVudHMobikpdGhyb3cgbmV3IGVsKCJob2xlcyBtdXN0IG5vdCBjb250YWluIG51bGwgZWxlbWVudHMiKTtpZihlLmlzRW1wdHkoKSYmdC5oYXNOb25FbXB0eUVsZW1lbnRzKG4pKXRocm93IG5ldyBlbCgic2hlbGwgaXMgZW1wdHkgYnV0IGhvbGVzIGFyZSBub3QiKTt0aGlzLl9zaGVsbD1lLHRoaXMuX2hvbGVzPW59dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jb21wdXRlRW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbC5nZXRFbnZlbG9wZUludGVybmFsKCl9LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9QT0xZR09OfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybltdO2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5nZXROdW1Qb2ludHMoKSkuZmlsbChudWxsKSxlPS0xLG49dGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZXMoKSxyPTA7cjxuLmxlbmd0aDtyKyspdFsrK2VdPW5bcl07Zm9yKHZhciBpPTA7aTx0aGlzLl9ob2xlcy5sZW5ndGg7aSsrKWZvcih2YXIgbz10aGlzLl9ob2xlc1tpXS5nZXRDb29yZGluYXRlcygpLHM9MDtzPG8ubGVuZ3RoO3MrKyl0WysrZV09b1tzXTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0QXJlYT1mdW5jdGlvbigpe3ZhciB0PTA7dCs9TWF0aC5hYnMoWGwuc2lnbmVkQXJlYSh0aGlzLl9zaGVsbC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSkpO2Zvcih2YXIgZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0LT1NYXRoLmFicyhYbC5zaWduZWRBcmVhKHRoaXMuX2hvbGVzW2VdLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmlzUmVjdGFuZ2xlPWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMuZ2V0TnVtSW50ZXJpb3JSaW5nKCkpcmV0dXJuITE7aWYobnVsbD09PXRoaXMuX3NoZWxsKXJldHVybiExO2lmKDUhPT10aGlzLl9zaGVsbC5nZXROdW1Qb2ludHMoKSlyZXR1cm4hMTtmb3IodmFyIHQ9dGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksZT10aGlzLmdldEVudmVsb3BlSW50ZXJuYWwoKSxuPTA7bjw1O24rKyl7dmFyIHI9dC5nZXRYKG4pO2lmKHIhPT1lLmdldE1pblgoKSYmciE9PWUuZ2V0TWF4WCgpKXJldHVybiExO3ZhciBpPXQuZ2V0WShuKTtpZihpIT09ZS5nZXRNaW5ZKCkmJmkhPT1lLmdldE1heFkoKSlyZXR1cm4hMX1mb3IodmFyIG89dC5nZXRYKDApLHM9dC5nZXRZKDApLGE9MTthPD00O2ErKyl7dmFyIHU9dC5nZXRYKGEpLGw9dC5nZXRZKGEpO2lmKHUhPT1vPT09KGwhPT1zKSlyZXR1cm4hMTtvPXUscz1sfXJldHVybiEwfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtpZighdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhuKSlyZXR1cm4hMTt2YXIgaT1uLG89dGhpcy5fc2hlbGwscz1pLl9zaGVsbDtpZighby5lcXVhbHNFeGFjdChzLHIpKXJldHVybiExO2lmKHRoaXMuX2hvbGVzLmxlbmd0aCE9PWkuX2hvbGVzLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGE9MDthPHRoaXMuX2hvbGVzLmxlbmd0aDthKyspaWYoIWUuX2hvbGVzW2FdLmVxdWFsc0V4YWN0KGkuX2hvbGVzW2FdLHIpKXJldHVybiExO3JldHVybiEwfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe3RoaXMubm9ybWFsaXplKHRoaXMuX3NoZWxsLCEwKTtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdC5ub3JtYWxpemUodC5faG9sZXNbZV0sITEpO1JjLnNvcnQodGhpcy5faG9sZXMpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtpZihuLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt2YXIgaT1uZXcgQXJyYXkobi5nZXRDb29yZGluYXRlcygpLmxlbmd0aC0xKS5maWxsKG51bGwpO1BsLmFycmF5Y29weShuLmdldENvb3JkaW5hdGVzKCksMCxpLDAsaS5sZW5ndGgpO3ZhciBvPXBjLm1pbkNvb3JkaW5hdGUobi5nZXRDb29yZGluYXRlcygpKTtwYy5zY3JvbGwoaSxvKSxQbC5hcnJheWNvcHkoaSwwLG4uZ2V0Q29vcmRpbmF0ZXMoKSwwLGkubGVuZ3RoKSxuLmdldENvb3JkaW5hdGVzKClbaS5sZW5ndGhdPWlbMF0sWGwuaXNDQ1cobi5nZXRDb29yZGluYXRlcygpKT09PXImJnBjLnJldmVyc2Uobi5nZXRDb29yZGluYXRlcygpKX19LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZSgpfSxlLnByb3RvdHlwZS5nZXROdW1JbnRlcmlvclJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faG9sZXMubGVuZ3RofSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMn0sZS5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIHQ9MDt0Kz10aGlzLl9zaGVsbC5nZXRMZW5ndGgoKTtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdCs9dGhpcy5faG9sZXNbZV0uZ2V0TGVuZ3RoKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldE51bVBvaW50cz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9zaGVsbC5nZXROdW1Qb2ludHMoKSxlPTA7ZTx0aGlzLl9ob2xlcy5sZW5ndGg7ZSsrKXQrPXRoaXMuX2hvbGVzW2VdLmdldE51bVBvaW50cygpO3JldHVybiB0fSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb3B5KCk7dC5fc2hlbGw9dGhpcy5fc2hlbGwuY29weSgpLnJldmVyc2UoKSx0Ll9ob2xlcz1uZXcgQXJyYXkodGhpcy5faG9sZXMubGVuZ3RoKS5maWxsKG51bGwpO2Zvcih2YXIgZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0Ll9ob2xlc1tlXT10aGlzLl9ob2xlc1tlXS5jb3B5KCkucmV2ZXJzZSgpO3JldHVybiB0fSxlLnByb3RvdHlwZS5jb252ZXhIdWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RXh0ZXJpb3JSaW5nKCkuY29udmV4SHVsbCgpfSxlLnByb3RvdHlwZS5jb21wYXJlVG9TYW1lQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj10aGlzLl9zaGVsbCxyPWUuX3NoZWxsO3JldHVybiBuLmNvbXBhcmVUb1NhbWVDbGFzcyhyKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9aSxhPXRoaXMuX3NoZWxsLHU9cy5fc2hlbGwsbD1hLmNvbXBhcmVUb1NhbWVDbGFzcyh1LG8pO2lmKDAhPT1sKXJldHVybiBsO2Zvcih2YXIgYz10aGlzLmdldE51bUludGVyaW9yUmluZygpLGg9cy5nZXROdW1JbnRlcmlvclJpbmcoKSxwPTA7cDxjJiZwPGg7KXt2YXIgZj10LmdldEludGVyaW9yUmluZ04ocCksZz1zLmdldEludGVyaW9yUmluZ04ocCksZD1mLmNvbXBhcmVUb1NhbWVDbGFzcyhnLG8pO2lmKDAhPT1kKXJldHVybiBkO3ArK31yZXR1cm4gcDxjPzE6cDxoPy0xOjB9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKGdsKHQsS2wpKXt0aGlzLl9zaGVsbC5hcHBseSh0KTtmb3IodmFyIG49MDtuPHRoaXMuX2hvbGVzLmxlbmd0aDtuKyspZS5faG9sZXNbbl0uYXBwbHkodCl9ZWxzZSBpZihnbCh0LEZjKSl7aWYodGhpcy5fc2hlbGwuYXBwbHkodCksIXQuaXNEb25lKCkpZm9yKHZhciByPTA7cjx0aGlzLl9ob2xlcy5sZW5ndGgmJihlLl9ob2xlc1tyXS5hcHBseSh0KSwhdC5pc0RvbmUoKSk7cisrKTt0LmlzR2VvbWV0cnlDaGFuZ2VkKCkmJnRoaXMuZ2VvbWV0cnlDaGFuZ2VkKCl9ZWxzZSBpZihnbCh0LERjKSl0LmZpbHRlcih0aGlzKTtlbHNlIGlmKGdsKHQsSGwpKXt0LmZpbHRlcih0aGlzKSx0aGlzLl9zaGVsbC5hcHBseSh0KTtmb3IodmFyIGk9MDtpPHRoaXMuX2hvbGVzLmxlbmd0aDtpKyspZS5faG9sZXNbaV0uYXBwbHkodCl9fSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoKTt2YXIgdD1uZXcgQXJyYXkodGhpcy5faG9sZXMubGVuZ3RoKzEpLmZpbGwobnVsbCk7dFswXT10aGlzLl9zaGVsbDtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdFtlKzFdPXRoaXMuX2hvbGVzW2VdO3JldHVybiB0Lmxlbmd0aDw9MT90aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lYXJSaW5nKHRbMF0uZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkpOnRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyh0KX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO2UuX3NoZWxsPXRoaXMuX3NoZWxsLmNsb25lKCksZS5faG9sZXM9bmV3IEFycmF5KHRoaXMuX2hvbGVzLmxlbmd0aCkuZmlsbChudWxsKTtmb3IodmFyIG49MDtuPHRoaXMuX2hvbGVzLmxlbmd0aDtuKyspZS5faG9sZXNbbl09dGhpcy5faG9sZXNbbl0uY2xvbmUoKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIlBvbHlnb24ifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3NoZWxsLmNvcHkoKSxuPW5ldyBBcnJheSh0aGlzLl9ob2xlcy5sZW5ndGgpLmZpbGwobnVsbCkscj0wO3I8bi5sZW5ndGg7cisrKW5bcl09dGhpcy5faG9sZXNbcl0uY29weSgpO3JldHVybiBuZXcgZSh0LG4sdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmdldEV4dGVyaW9yUmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbH0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbC5pc0VtcHR5KCl9LGUucHJvdG90eXBlLmdldEludGVyaW9yUmluZ049ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2hvbGVzW3RdfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblskY119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHgzMDdmZmVmZDhkYzk3MjAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KFdsKSxlaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gV2wuU09SVElOREVYX01VTFRJUE9JTlR9LGUucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSYmdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0Q29vcmRpbmF0ZSgpfXJldHVybiB0LnByb3RvdHlwZS5nZXRDb29yZGluYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gVGMuRkFMU0V9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAwfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obnVsbCl9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJNdWx0aVBvaW50In0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0tjXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDZmYjFlZDQxNjJlMGZjMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oa2MpLG5oPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXtlIGluc3RhbmNlb2YgdWwmJm4gaW5zdGFuY2VvZiBfaCYmKGU9bi5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKGUpKSx0LmNhbGwodGhpcyxlLG4pLHRoaXMudmFsaWRhdGVDb25zdHJ1Y3Rpb24oKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17TUlOSU1VTV9WQUxJRF9TSVpFOntjb25maWd1cmFibGU6ITB9LHNlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gV2wuU09SVElOREVYX0xJTkVBUlJJTkd9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIFRjLkZBTFNFfSxlLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5pc0VtcHR5KCl8fHQucHJvdG90eXBlLmlzQ2xvc2VkLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wb2ludHMuY29weSgpO3JldHVybiBKYy5yZXZlcnNlKHQpLHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVhclJpbmcodCl9LGUucHJvdG90eXBlLnZhbGlkYXRlQ29uc3RydWN0aW9uPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNFbXB0eSgpJiYhdC5wcm90b3R5cGUuaXNDbG9zZWQuY2FsbCh0aGlzKSl0aHJvdyBuZXcgZWwoIlBvaW50cyBvZiBMaW5lYXJSaW5nIGRvIG5vdCBmb3JtIGEgY2xvc2VkIGxpbmVzdHJpbmciKTtpZih0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLnNpemUoKT49MSYmdGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2UoKS5zaXplKCk8ZS5NSU5JTVVNX1ZBTElEX1NJWkUpdGhyb3cgbmV3IGVsKCJJbnZhbGlkIG51bWJlciBvZiBwb2ludHMgaW4gTGluZWFyUmluZyAoZm91bmQgIit0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLnNpemUoKSsiIC0gbXVzdCBiZSAwIG9yID49IDQpIil9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJMaW5lYXJSaW5nIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLl9wb2ludHMuY29weSgpLHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLk1JTklNVU1fVkFMSURfU0laRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gNH0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDNiMjI5ZTI2MjM2N2E2MDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oWmMpLHJoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiBXbC5TT1JUSU5ERVhfTVVMVElQT0xZR09OfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuISF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpJiZ0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5jYWxsKHRoaXMsZSxuKX1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMn0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCxlPW5ldyBBcnJheSh0KS5maWxsKG51bGwpLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyllW25dPXRoaXMuX2dlb21ldHJpZXNbbl0ucmV2ZXJzZSgpO3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aVBvbHlnb24oZSl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZygpO2Zvcih2YXIgdD1uZXcgbGMsZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKWZvcih2YXIgbj10aGlzLl9nZW9tZXRyaWVzW2VdLmdldEJvdW5kYXJ5KCkscj0wO3I8bi5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXQuYWRkKG4uZ2V0R2VvbWV0cnlOKHIpKTt2YXIgaT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyh0LnRvQXJyYXkoaSkpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTXVsdGlQb2x5Z29uIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuWyRjXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDdhNWFhMTM2OTE3MTk4MH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShrYyksaWg9ZnVuY3Rpb24odCl7dGhpcy5fZmFjdG9yeT10fHxudWxsLHRoaXMuX2lzVXNlckRhdGFDb3BpZWQ9ITF9LG9oPXtOb09wR2VvbWV0cnlPcGVyYXRpb246e2NvbmZpZ3VyYWJsZTohMH0sQ29vcmRpbmF0ZU9wZXJhdGlvbjp7Y29uZmlndXJhYmxlOiEwfSxDb29yZGluYXRlU2VxdWVuY2VPcGVyYXRpb246e2NvbmZpZ3VyYWJsZTohMH19O2loLnByb3RvdHlwZS5zZXRDb3B5VXNlckRhdGE9ZnVuY3Rpb24odCl7dGhpcy5faXNVc2VyRGF0YUNvcGllZD10fSxpaC5wcm90b3R5cGUuZWRpdD1mdW5jdGlvbih0LGUpe2lmKG51bGw9PT10KXJldHVybiBudWxsO3ZhciBuPXRoaXMuZWRpdEludGVybmFsKHQsZSk7cmV0dXJuIHRoaXMuX2lzVXNlckRhdGFDb3BpZWQmJm4uc2V0VXNlckRhdGEodC5nZXRVc2VyRGF0YSgpKSxufSxpaC5wcm90b3R5cGUuZWRpdEludGVybmFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PT10aGlzLl9mYWN0b3J5JiYodGhpcy5fZmFjdG9yeT10LmdldEZhY3RvcnkoKSksdCBpbnN0YW5jZW9mIGtjP3RoaXMuZWRpdEdlb21ldHJ5Q29sbGVjdGlvbih0LGUpOnQgaW5zdGFuY2VvZiB0aD90aGlzLmVkaXRQb2x5Z29uKHQsZSk6dCBpbnN0YW5jZW9mIFFjfHx0IGluc3RhbmNlb2YgWmM/ZS5lZGl0KHQsdGhpcy5fZmFjdG9yeSk6KHFsLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJVbnN1cHBvcnRlZCBHZW9tZXRyeSBjbGFzczogIit0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSxudWxsKX0saWgucHJvdG90eXBlLmVkaXRHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5lZGl0KHQsdGhpcy5fZmFjdG9yeSkscj1uZXcgbGMsaT0wO2k8bi5nZXROdW1HZW9tZXRyaWVzKCk7aSsrKXt2YXIgbz10aGlzLmVkaXQobi5nZXRHZW9tZXRyeU4oaSksZSk7bnVsbD09PW98fG8uaXNFbXB0eSgpfHxyLmFkZChvKX1yZXR1cm4gbi5nZXRDbGFzcygpPT09ZWg/dGhpcy5fZmFjdG9yeS5jcmVhdGVNdWx0aVBvaW50KHIudG9BcnJheShbXSkpOm4uZ2V0Q2xhc3MoKT09PUdjP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKHIudG9BcnJheShbXSkpOm4uZ2V0Q2xhc3MoKT09PXJoP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTXVsdGlQb2x5Z29uKHIudG9BcnJheShbXSkpOnRoaXMuX2ZhY3RvcnkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKHIudG9BcnJheShbXSkpfSxpaC5wcm90b3R5cGUuZWRpdFBvbHlnb249ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmVkaXQodCx0aGlzLl9mYWN0b3J5KTtpZihudWxsPT09biYmKG49dGhpcy5fZmFjdG9yeS5jcmVhdGVQb2x5Z29uKG51bGwpKSxuLmlzRW1wdHkoKSlyZXR1cm4gbjt2YXIgcj10aGlzLmVkaXQobi5nZXRFeHRlcmlvclJpbmcoKSxlKTtpZihudWxsPT09cnx8ci5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9seWdvbigpO2Zvcih2YXIgaT1uZXcgbGMsbz0wO288bi5nZXROdW1JbnRlcmlvclJpbmcoKTtvKyspe3ZhciBzPXRoaXMuZWRpdChuLmdldEludGVyaW9yUmluZ04obyksZSk7bnVsbD09PXN8fHMuaXNFbXB0eSgpfHxpLmFkZChzKX1yZXR1cm4gdGhpcy5fZmFjdG9yeS5jcmVhdGVQb2x5Z29uKHIsaS50b0FycmF5KFtdKSl9LGloLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxpaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaWh9LGloLkdlb21ldHJ5RWRpdG9yT3BlcmF0aW9uPWZ1bmN0aW9uKCl7fSxvaC5Ob09wR2VvbWV0cnlPcGVyYXRpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHNofSxvaC5Db29yZGluYXRlT3BlcmF0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiBhaH0sb2guQ29vcmRpbmF0ZVNlcXVlbmNlT3BlcmF0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiB1aH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaWgsb2gpO3ZhciBzaD1mdW5jdGlvbigpe307c2gucHJvdG90eXBlLmVkaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdH0sc2gucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2loLkdlb21ldHJ5RWRpdG9yT3BlcmF0aW9uXX0sc2gucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHNofTt2YXIgYWg9ZnVuY3Rpb24oKXt9O2FoLnByb3RvdHlwZS5lZGl0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5lZGl0Q29vcmRpbmF0ZXModC5nZXRDb29yZGluYXRlcygpLHQpO3JldHVybiBudWxsPT09bj90OnQgaW5zdGFuY2VvZiBuaD9lLmNyZWF0ZUxpbmVhclJpbmcobik6dCBpbnN0YW5jZW9mIFpjP2UuY3JlYXRlTGluZVN0cmluZyhuKTp0IGluc3RhbmNlb2YgUWM/bi5sZW5ndGg+MD9lLmNyZWF0ZVBvaW50KG5bMF0pOmUuY3JlYXRlUG9pbnQoKTp0fSxhaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5baWguR2VvbWV0cnlFZGl0b3JPcGVyYXRpb25dfSxhaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYWh9O3ZhciB1aD1mdW5jdGlvbigpe307dWgucHJvdG90eXBlLmVkaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIG5oP2UuY3JlYXRlTGluZWFyUmluZyh0aGlzLmVkaXQodC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSk6dCBpbnN0YW5jZW9mIFpjP2UuY3JlYXRlTGluZVN0cmluZyh0aGlzLmVkaXQodC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSk6dCBpbnN0YW5jZW9mIFFjP2UuY3JlYXRlUG9pbnQodGhpcy5lZGl0KHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCkpOnR9LHVoLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpaC5HZW9tZXRyeUVkaXRvck9wZXJhdGlvbl19LHVoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB1aH07dmFyIGxoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZih0aGlzLl9kaW1lbnNpb249Myx0aGlzLl9jb29yZGluYXRlcz1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXRoaXMuX2Nvb3JkaW5hdGVzPWFyZ3VtZW50c1swXSx0aGlzLl9kaW1lbnNpb249MztlbHNlIGlmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX2Nvb3JkaW5hdGVzPW5ldyBBcnJheShlKS5maWxsKG51bGwpO2Zvcih2YXIgbj0wO248ZTtuKyspdC5fY29vcmRpbmF0ZXNbbl09bmV3IHVsfWVsc2UgaWYoZ2woYXJndW1lbnRzWzBdLElsKSl7dmFyIHI9YXJndW1lbnRzWzBdO2lmKG51bGw9PT1yKXJldHVybiB0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoMCkuZmlsbChudWxsKSxudWxsO3RoaXMuX2RpbWVuc2lvbj1yLmdldERpbWVuc2lvbigpLHRoaXMuX2Nvb3JkaW5hdGVzPW5ldyBBcnJheShyLnNpemUoKSkuZmlsbChudWxsKTtmb3IodmFyIGk9MDtpPHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtpKyspdC5fY29vcmRpbmF0ZXNbaV09ci5nZXRDb29yZGluYXRlQ29weShpKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aClpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1sxXSkpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXTt0aGlzLl9jb29yZGluYXRlcz1vLHRoaXMuX2RpbWVuc2lvbj1zLG51bGw9PT1vJiYodGhpcy5fY29vcmRpbmF0ZXM9bmV3IEFycmF5KDApLmZpbGwobnVsbCkpfWVsc2UgaWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pJiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1sxXSkpe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXTt0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoYSkuZmlsbChudWxsKSx0aGlzLl9kaW1lbnNpb249dTtmb3IodmFyIGw9MDtsPGE7bCsrKXQuX2Nvb3JkaW5hdGVzW2xdPW5ldyB1bH19LGNoPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtsaC5wcm90b3R5cGUuc2V0T3JkaW5hdGU9ZnVuY3Rpb24odCxlLG4pe3N3aXRjaChlKXtjYXNlIElsLlg6dGhpcy5fY29vcmRpbmF0ZXNbdF0ueD1uO2JyZWFrO2Nhc2UgSWwuWTp0aGlzLl9jb29yZGluYXRlc1t0XS55PW47YnJlYWs7Y2FzZSBJbC5aOnRoaXMuX2Nvb3JkaW5hdGVzW3RdLno9bjticmVhaztkZWZhdWx0OnRocm93IG5ldyBlbCgiaW52YWxpZCBvcmRpbmF0ZUluZGV4Iil9fSxsaC5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGh9LGxoLnByb3RvdHlwZS5nZXRPcmRpbmF0ZT1mdW5jdGlvbih0LGUpe3N3aXRjaChlKXtjYXNlIElsLlg6cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdLng7Y2FzZSBJbC5ZOnJldHVybiB0aGlzLl9jb29yZGluYXRlc1t0XS55O2Nhc2UgSWwuWjpyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0uen1yZXR1cm4gbmwuTmFOfSxsaC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07bi54PXRoaXMuX2Nvb3JkaW5hdGVzW2VdLngsbi55PXRoaXMuX2Nvb3JkaW5hdGVzW2VdLnksbi56PXRoaXMuX2Nvb3JkaW5hdGVzW2VdLnp9fSxsaC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZUNvcHk9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB1bCh0aGlzLl9jb29yZGluYXRlc1t0XSl9LGxoLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGltZW5zaW9ufSxsaC5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0ueH0sbGgucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSkuZmlsbChudWxsKSxlPTA7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXRbZV09dGhpcy5fY29vcmRpbmF0ZXNbZV0uY2xvbmUoKTtyZXR1cm4gbmV3IGxoKHQsdGhpcy5fZGltZW5zaW9uKX0sbGgucHJvdG90eXBlLmV4cGFuZEVudmVsb3BlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2UrKyl0LmV4cGFuZFRvSW5jbHVkZSh0aGlzLl9jb29yZGluYXRlc1tlXSk7cmV0dXJuIHR9LGxoLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSkuZmlsbChudWxsKSxlPTA7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXRbZV09dGhpcy5fY29vcmRpbmF0ZXNbZV0uY29weSgpO3JldHVybiBuZXcgbGgodCx0aGlzLl9kaW1lbnNpb24pfSxsaC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtpZih0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg+MCl7dmFyIHQ9bmV3IHZsKDE3KnRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aCk7dC5hcHBlbmQoIigiKSx0LmFwcGVuZCh0aGlzLl9jb29yZGluYXRlc1swXSk7Zm9yKHZhciBlPTE7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXQuYXBwZW5kKCIsICIpLHQuYXBwZW5kKHRoaXMuX2Nvb3JkaW5hdGVzW2VdKTtyZXR1cm4gdC5hcHBlbmQoIikiKSx0LnRvU3RyaW5nKCl9cmV0dXJuIigpIn0sbGgucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdLnl9LGxoLnByb3RvdHlwZS50b0Nvb3JkaW5hdGVBcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlc30sbGgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0lsLGFsXX0sbGgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGxofSxjaC5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weGNiNDRhNzc4ZGIxOGUwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGgsY2gpO3ZhciBoaD1mdW5jdGlvbigpe30scGg9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0saW5zdGFuY2VPYmplY3Q6e2NvbmZpZ3VyYWJsZTohMH19O2hoLnByb3RvdHlwZS5yZWFkUmVzb2x2ZT1mdW5jdGlvbigpe3JldHVybiBoaC5pbnN0YW5jZSgpfSxoaC5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gbmV3IGxoKHQpfWlmKGdsKGFyZ3VtZW50c1swXSxJbCkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gbmV3IGxoKGUpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07cmV0dXJuIHI+MyYmKHI9MykscjwyP25ldyBsaChuKTpuZXcgbGgobixyKX19LGhoLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltobCxhbF19LGhoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBoaH0saGguaW5zdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gaGguaW5zdGFuY2VPYmplY3R9LHBoLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4MzhlNDlmYTZjZjZmMmUwMH0scGguaW5zdGFuY2VPYmplY3QuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBoaH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaGgscGgpO3ZhciBmaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMubWFwXz1uZXcgTWFwfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFwXy5nZXQodCl8fG51bGx9LGUucHJvdG90eXBlLnB1dD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1hcF8uc2V0KHQsZSksZX0sZS5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBsYyxlPXRoaXMubWFwXy52YWx1ZXMoKSxuPWUubmV4dCgpOyFuLmRvbmU7KXQuYWRkKG4udmFsdWUpLG49ZS5uZXh0KCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmVudHJ5U2V0PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHhjO3JldHVybiB0aGlzLm1hcF8uZW50cmllcygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmFkZChlKX0pKSx0fSxlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwXy5zaXplKCl9LGV9KHljKSxnaD1mdW5jdGlvbiB0KCl7aWYodGhpcy5fbW9kZWxUeXBlPW51bGwsdGhpcy5fc2NhbGU9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLl9tb2RlbFR5cGU9dC5GTE9BVElORztlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgeWgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9tb2RlbFR5cGU9ZSxlPT09dC5GSVhFRCYmdGhpcy5zZXRTY2FsZSgxKX1lbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5fbW9kZWxUeXBlPXQuRklYRUQsdGhpcy5zZXRTY2FsZShuKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIHI9YXJndW1lbnRzWzBdO3RoaXMuX21vZGVsVHlwZT1yLl9tb2RlbFR5cGUsdGhpcy5fc2NhbGU9ci5fc2NhbGV9fSxkaD17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxtYXhpbXVtUHJlY2lzZVZhbHVlOntjb25maWd1cmFibGU6ITB9fTtnaC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIGdoKSlyZXR1cm4hMTt2YXIgZT10O3JldHVybiB0aGlzLl9tb2RlbFR5cGU9PT1lLl9tb2RlbFR5cGUmJnRoaXMuX3NjYWxlPT09ZS5fc2NhbGV9LGdoLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dCxuPXRoaXMuZ2V0TWF4aW11bVNpZ25pZmljYW50RGlnaXRzKCkscj1lLmdldE1heGltdW1TaWduaWZpY2FudERpZ2l0cygpO3JldHVybiBuZXcgX2wobikuY29tcGFyZVRvKG5ldyBfbChyKSl9LGdoLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX0sZ2gucHJvdG90eXBlLmlzRmxvYXRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kZWxUeXBlPT09Z2guRkxPQVRJTkd8fHRoaXMuX21vZGVsVHlwZT09PWdoLkZMT0FUSU5HX1NJTkdMRX0sZ2gucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kZWxUeXBlfSxnaC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0iVU5LTk9XTiI7cmV0dXJuIHRoaXMuX21vZGVsVHlwZT09PWdoLkZMT0FUSU5HP3Q9IkZsb2F0aW5nIjp0aGlzLl9tb2RlbFR5cGU9PT1naC5GTE9BVElOR19TSU5HTEU/dD0iRmxvYXRpbmctU2luZ2xlIjp0aGlzLl9tb2RlbFR5cGU9PT1naC5GSVhFRCYmKHQ9IkZpeGVkIChTY2FsZT0iK3RoaXMuZ2V0U2NhbGUoKSsiKSIpLHR9LGdoLnByb3RvdHlwZS5tYWtlUHJlY2lzZT1mdW5jdGlvbigpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgdD1hcmd1bWVudHNbMF07aWYobmwuaXNOYU4odCkpcmV0dXJuIHQ7aWYodGhpcy5fbW9kZWxUeXBlPT09Z2guRkxPQVRJTkdfU0lOR0xFKXtyZXR1cm4gdH1yZXR1cm4gdGhpcy5fbW9kZWxUeXBlPT09Z2guRklYRUQ/TWF0aC5yb3VuZCh0KnRoaXMuX3NjYWxlKS90aGlzLl9zY2FsZTp0fWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwpe3ZhciBlPWFyZ3VtZW50c1swXTtpZih0aGlzLl9tb2RlbFR5cGU9PT1naC5GTE9BVElORylyZXR1cm4gbnVsbDtlLng9dGhpcy5tYWtlUHJlY2lzZShlLngpLGUueT10aGlzLm1ha2VQcmVjaXNlKGUueSl9fSxnaC5wcm90b3R5cGUuZ2V0TWF4aW11bVNpZ25pZmljYW50RGlnaXRzPWZ1bmN0aW9uKCl7dmFyIHQ9MTY7cmV0dXJuIHRoaXMuX21vZGVsVHlwZT09PWdoLkZMT0FUSU5HP3Q9MTY6dGhpcy5fbW9kZWxUeXBlPT09Z2guRkxPQVRJTkdfU0lOR0xFP3Q9Njp0aGlzLl9tb2RlbFR5cGU9PT1naC5GSVhFRCYmKHQ9MStNYXRoLnRydW5jKE1hdGguY2VpbChNYXRoLmxvZyh0aGlzLmdldFNjYWxlKCkpL01hdGgubG9nKDEwKSkpKSx0fSxnaC5wcm90b3R5cGUuc2V0U2NhbGU9ZnVuY3Rpb24odCl7dGhpcy5fc2NhbGU9TWF0aC5hYnModCl9LGdoLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblthbCxpbF19LGdoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBnaH0sZ2gubW9zdFByZWNpc2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb21wYXJlVG8oZSk+PTA/dDplfSxkaC5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDZiZWU2NDA0ZTlhMjVjMDB9LGRoLm1heGltdW1QcmVjaXNlVmFsdWUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDkwMDcxOTkyNTQ3NDA5OTJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGdoLGRoKTt2YXIgeWg9ZnVuY3Rpb24gdChlKXt0aGlzLl9uYW1lPWV8fG51bGwsdC5uYW1lVG9UeXBlTWFwLnB1dChlLHRoaXMpfSx2aD17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxuYW1lVG9UeXBlTWFwOntjb25maWd1cmFibGU6ITB9fTt5aC5wcm90b3R5cGUucmVhZFJlc29sdmU9ZnVuY3Rpb24oKXtyZXR1cm4geWgubmFtZVRvVHlwZU1hcC5nZXQodGhpcy5fbmFtZSl9LHloLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9uYW1lfSx5aC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bYWxdfSx5aC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geWh9LHZoLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTU1Mjg2MDI2MzE3MzE1OWU0fSx2aC5uYW1lVG9UeXBlTWFwLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgZmh9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHloLHZoKSxnaC5UeXBlPXloLGdoLkZJWEVEPW5ldyB5aCgiRklYRUQiKSxnaC5GTE9BVElORz1uZXcgeWgoIkZMT0FUSU5HIiksZ2guRkxPQVRJTkdfU0lOR0xFPW5ldyB5aCgiRkxPQVRJTkcgU0lOR0xFIik7dmFyIF9oPWZ1bmN0aW9uIHQoKXt0aGlzLl9wcmVjaXNpb25Nb2RlbD1uZXcgZ2gsdGhpcy5fU1JJRD0wLHRoaXMuX2Nvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnk9dC5nZXREZWZhdWx0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLDA9PT1hcmd1bWVudHMubGVuZ3RofHwoMT09PWFyZ3VtZW50cy5sZW5ndGg/Z2woYXJndW1lbnRzWzBdLGhsKT90aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PWFyZ3VtZW50c1swXTphcmd1bWVudHNbMF1pbnN0YW5jZW9mIGdoJiYodGhpcy5fcHJlY2lzaW9uTW9kZWw9YXJndW1lbnRzWzBdKToyPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5fcHJlY2lzaW9uTW9kZWw9YXJndW1lbnRzWzBdLHRoaXMuX1NSSUQ9YXJndW1lbnRzWzFdKTozPT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX3ByZWNpc2lvbk1vZGVsPWFyZ3VtZW50c1swXSx0aGlzLl9TUklEPWFyZ3VtZW50c1sxXSx0aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PWFyZ3VtZW50c1syXSkpfSxtaD17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07X2gucHJvdG90eXBlLnRvR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNOdWxsKCk/dGhpcy5jcmVhdGVQb2ludChudWxsKTp0LmdldE1pblgoKT09PXQuZ2V0TWF4WCgpJiZ0LmdldE1pblkoKT09PXQuZ2V0TWF4WSgpP3RoaXMuY3JlYXRlUG9pbnQobmV3IHVsKHQuZ2V0TWluWCgpLHQuZ2V0TWluWSgpKSk6dC5nZXRNaW5YKCk9PT10LmdldE1heFgoKXx8dC5nZXRNaW5ZKCk9PT10LmdldE1heFkoKT90aGlzLmNyZWF0ZUxpbmVTdHJpbmcoW25ldyB1bCh0LmdldE1pblgoKSx0LmdldE1pblkoKSksbmV3IHVsKHQuZ2V0TWF4WCgpLHQuZ2V0TWF4WSgpKV0pOnRoaXMuY3JlYXRlUG9seWdvbih0aGlzLmNyZWF0ZUxpbmVhclJpbmcoW25ldyB1bCh0LmdldE1pblgoKSx0LmdldE1pblkoKSksbmV3IHVsKHQuZ2V0TWluWCgpLHQuZ2V0TWF4WSgpKSxuZXcgdWwodC5nZXRNYXhYKCksdC5nZXRNYXhZKCkpLG5ldyB1bCh0LmdldE1heFgoKSx0LmdldE1pblkoKSksbmV3IHVsKHQuZ2V0TWluWCgpLHQuZ2V0TWluWSgpKV0pLG51bGwpfSxfaC5wcm90b3R5cGUuY3JlYXRlTGluZVN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdD90IGluc3RhbmNlb2YgQXJyYXk/bmV3IFpjKHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KSx0aGlzKTpnbCh0LElsKT9uZXcgWmModCx0aGlzKTp2b2lkIDA6bmV3IFpjKHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSksdGhpcyl9LF9oLnByb3RvdHlwZS5jcmVhdGVNdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IEdjKG51bGwsdGhpcyk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gbmV3IEdjKHQsdGhpcyl9fSxfaC5wcm90b3R5cGUuYnVpbGRHZW9tZXRyeT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bnVsbCxuPSExLHI9ITEsaT10Lml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKSxzPW8uZ2V0Q2xhc3MoKTtudWxsPT09ZSYmKGU9cykscyE9PWUmJihuPSEwKSxvLmlzR2VvbWV0cnlDb2xsZWN0aW9uT3JEZXJpdmVkKCkmJihyPSEwKX1pZihudWxsPT09ZSlyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oKTtpZihufHxyKXJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihfaC50b0dlb21ldHJ5QXJyYXkodCkpO3ZhciBhPXQuaXRlcmF0b3IoKS5uZXh0KCk7aWYodC5zaXplKCk+MSl7aWYoYSBpbnN0YW5jZW9mIHRoKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9seWdvbihfaC50b1BvbHlnb25BcnJheSh0KSk7aWYoYSBpbnN0YW5jZW9mIFpjKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpTGluZVN0cmluZyhfaC50b0xpbmVTdHJpbmdBcnJheSh0KSk7aWYoYSBpbnN0YW5jZW9mIFFjKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9pbnQoX2gudG9Qb2ludEFycmF5KHQpKTtxbC5zaG91bGROZXZlclJlYWNoSGVyZSgiVW5oYW5kbGVkIGNsYXNzOiAiK2EuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpfXJldHVybiBhfSxfaC5wcm90b3R5cGUuY3JlYXRlTXVsdGlQb2ludEZyb21Db29yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChudWxsIT09dD90aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUodCk6bnVsbCl9LF9oLnByb3RvdHlwZS5jcmVhdGVQb2ludD1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmNyZWF0ZVBvaW50KHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlUG9pbnQobnVsbCE9PXQ/dGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFt0XSk6bnVsbCl9aWYoZ2woYXJndW1lbnRzWzBdLElsKSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBuZXcgUWMoZSx0aGlzKX19fSxfaC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5fSxfaC5wcm90b3R5cGUuY3JlYXRlUG9seWdvbj1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBuZXcgdGgobnVsbCxudWxsLHRoaXMpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihnbChhcmd1bWVudHNbMF0sSWwpKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlUG9seWdvbih0aGlzLmNyZWF0ZUxpbmVhclJpbmcodCkpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVQb2x5Z29uKHRoaXMuY3JlYXRlTGluZWFyUmluZyhlKSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBuaCl7dmFyIG49YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNyZWF0ZVBvbHlnb24obixudWxsKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3JldHVybiBuZXcgdGgocixpLHRoaXMpfX0sX2gucHJvdG90eXBlLmdldFNSSUQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fU1JJRH0sX2gucHJvdG90eXBlLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbj1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBuZXcga2MobnVsbCx0aGlzKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBuZXcga2ModCx0aGlzKX19LF9oLnByb3RvdHlwZS5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGloKHRoaXMpLmVkaXQodCx7ZWRpdDpmdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkuY3JlYXRlKHQpfX19KX0sX2gucHJvdG90eXBlLmdldFByZWNpc2lvbk1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZWNpc2lvbk1vZGVsfSxfaC5wcm90b3R5cGUuY3JlYXRlTGluZWFyUmluZz1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmNyZWF0ZUxpbmVhclJpbmcodGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFtdKSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVMaW5lYXJSaW5nKG51bGwhPT10P3RoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KTpudWxsKX1pZihnbChhcmd1bWVudHNbMF0sSWwpKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIG5ldyBuaChlLHRoaXMpfX19LF9oLnByb3RvdHlwZS5jcmVhdGVNdWx0aVBvbHlnb249ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IHJoKG51bGwsdGhpcyk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gbmV3IHJoKHQsdGhpcyl9fSxfaC5wcm90b3R5cGUuY3JlYXRlTXVsdGlQb2ludD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG5ldyBlaChudWxsLHRoaXMpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIG5ldyBlaChlLHRoaXMpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciBuPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVNdWx0aVBvaW50KG51bGwhPT1uP3RoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShuKTpudWxsKX1pZihnbChhcmd1bWVudHNbMF0sSWwpKXt2YXIgcj1hcmd1bWVudHNbMF07aWYobnVsbD09PXIpcmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChuZXcgQXJyYXkoMCkuZmlsbChudWxsKSk7Zm9yKHZhciBpPW5ldyBBcnJheShyLnNpemUoKSkuZmlsbChudWxsKSxvPTA7bzxyLnNpemUoKTtvKyspe3ZhciBzPXQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSgxLHIuZ2V0RGltZW5zaW9uKCkpO0pjLmNvcHkocixvLHMsMCwxKSxpW29dPXQuY3JlYXRlUG9pbnQocyl9cmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChpKX19fSxfaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bYWxdfSxfaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gX2h9LF9oLnRvTXVsdGlQb2x5Z29uQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LF9oLnRvR2VvbWV0cnlBcnJheT1mdW5jdGlvbih0KXtpZihudWxsPT09dClyZXR1cm4gbnVsbDt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sX2guZ2V0RGVmYXVsdENvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnk9ZnVuY3Rpb24oKXtyZXR1cm4gaGguaW5zdGFuY2UoKX0sX2gudG9NdWx0aUxpbmVTdHJpbmdBcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sX2gudG9MaW5lU3RyaW5nQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LF9oLnRvTXVsdGlQb2ludEFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxfaC50b0xpbmVhclJpbmdBcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sX2gudG9Qb2ludEFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxfaC50b1BvbHlnb25BcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sX2guY3JlYXRlUG9pbnRGcm9tSW50ZXJuYWxDb29yZD1mdW5jdGlvbih0LGUpe3JldHVybiBlLmdldFByZWNpc2lvbk1vZGVsKCkubWFrZVByZWNpc2UodCksZS5nZXRGYWN0b3J5KCkuY3JlYXRlUG9pbnQodCl9LG1oLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4NWVhNzVmMjA1MWVlYjQwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoX2gsbWgpO3ZhciB4aD1bIlBvaW50IiwiTXVsdGlQb2ludCIsIkxpbmVTdHJpbmciLCJNdWx0aUxpbmVTdHJpbmciLCJQb2x5Z29uIiwiTXVsdGlQb2x5Z29uIl0sRWg9ZnVuY3Rpb24odCl7dGhpcy5nZW9tZXRyeUZhY3Rvcnk9dHx8bmV3IF9ofTtFaC5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXt2YXIgZSxuPShlPSJzdHJpbmciPT10eXBlb2YgdD9KU09OLnBhcnNlKHQpOnQpLnR5cGU7aWYoIWJoW25dKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBHZW9KU09OIHR5cGU6ICIrZS50eXBlKTtyZXR1cm4tMSE9PXhoLmluZGV4T2Yobik/Ymhbbl0uYXBwbHkodGhpcyxbZS5jb29yZGluYXRlc10pOiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09bj9iaFtuXS5hcHBseSh0aGlzLFtlLmdlb21ldHJpZXNdKTpiaFtuXS5hcHBseSh0aGlzLFtlXSl9LEVoLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXt2YXIgZT10LmdldEdlb21ldHJ5VHlwZSgpO2lmKCF3aFtlXSl0aHJvdyBuZXcgRXJyb3IoIkdlb21ldHJ5IGlzIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4gd2hbZV0uYXBwbHkodGhpcyxbdF0pfTt2YXIgYmg9e0ZlYXR1cmU6ZnVuY3Rpb24odCl7dmFyIGU9e307Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO2lmKHQuZ2VvbWV0cnkpe3ZhciByPXQuZ2VvbWV0cnkudHlwZTtpZighYmhbcl0pdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIEdlb0pTT04gdHlwZTogIit0LnR5cGUpO2UuZ2VvbWV0cnk9dGhpcy5yZWFkKHQuZ2VvbWV0cnkpfXJldHVybiB0LmJib3gmJihlLmJib3g9YmguYmJveC5hcHBseSh0aGlzLFt0LmJib3hdKSksZX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCl7dmFyIGU9e307aWYodC5mZWF0dXJlcyl7ZS5mZWF0dXJlcz1bXTtmb3IodmFyIG49MDtuPHQuZmVhdHVyZXMubGVuZ3RoOysrbillLmZlYXR1cmVzLnB1c2godGhpcy5yZWFkKHQuZmVhdHVyZXNbbl0pKX1yZXR1cm4gdC5iYm94JiYoZS5iYm94PXRoaXMucGFyc2UuYmJveC5hcHBseSh0aGlzLFt0LmJib3hdKSksZX0sY29vcmRpbmF0ZXM6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoOysrbil7dmFyIHI9dFtuXTtlLnB1c2gobmV3IHVsKHJbMF0sclsxXSkpfXJldHVybiBlfSxiYm94OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKFtuZXcgdWwodFswXSx0WzFdKSxuZXcgdWwodFsyXSx0WzFdKSxuZXcgdWwodFsyXSx0WzNdKSxuZXcgdWwodFswXSx0WzNdKSxuZXcgdWwodFswXSx0WzFdKV0pfSxQb2ludDpmdW5jdGlvbih0KXt2YXIgZT1uZXcgdWwodFswXSx0WzFdKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlUG9pbnQoZSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoOysrbillLnB1c2goYmguUG9pbnQuYXBwbHkodGhpcyxbdFtuXV0pKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlQb2ludChlKX0sTGluZVN0cmluZzpmdW5jdGlvbih0KXt2YXIgZT1iaC5jb29yZGluYXRlcy5hcHBseSh0aGlzLFt0XSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVTdHJpbmcoZSl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7KytuKWUucHVzaChiaC5MaW5lU3RyaW5nLmFwcGx5KHRoaXMsW3Rbbl1dKSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpTGluZVN0cmluZyhlKX0sUG9seWdvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9YmguY29vcmRpbmF0ZXMuYXBwbHkodGhpcyxbdFswXV0pLG49dGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhlKSxyPVtdLGk9MTtpPHQubGVuZ3RoOysraSl7dmFyIG89dFtpXSxzPWJoLmNvb3JkaW5hdGVzLmFwcGx5KHRoaXMsW29dKSxhPXRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcocyk7ci5wdXNoKGEpfXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2x5Z29uKG4scil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7KytuKXt2YXIgcj10W25dO2UucHVzaChiaC5Qb2x5Z29uLmFwcGx5KHRoaXMsW3JdKSl9cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9seWdvbihlKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciByPXRbbl07ZS5wdXNoKHRoaXMucmVhZChyKSl9cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihlKX19LHdoPXtjb29yZGluYXRlOmZ1bmN0aW9uKHQpe3JldHVyblt0LngsdC55XX0sUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6IlBvaW50Iixjb29yZGluYXRlczp3aC5jb29yZGluYXRlLmFwcGx5KHRoaXMsW3QuZ2V0Q29vcmRpbmF0ZSgpXSl9fSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Ll9nZW9tZXRyaWVzLmxlbmd0aDsrK24pe3ZhciByPXQuX2dlb21ldHJpZXNbbl0saT13aC5Qb2ludC5hcHBseSh0aGlzLFtyXSk7ZS5wdXNoKGkuY29vcmRpbmF0ZXMpfXJldHVybnt0eXBlOiJNdWx0aVBvaW50Iixjb29yZGluYXRlczplfX0sTGluZVN0cmluZzpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj10LmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGg7KytyKXt2YXIgaT1uW3JdO2UucHVzaCh3aC5jb29yZGluYXRlLmFwcGx5KHRoaXMsW2ldKSl9cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmV9fSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQuX2dlb21ldHJpZXMubGVuZ3RoOysrbil7dmFyIHI9dC5fZ2VvbWV0cmllc1tuXSxpPXdoLkxpbmVTdHJpbmcuYXBwbHkodGhpcyxbcl0pO2UucHVzaChpLmNvb3JkaW5hdGVzKX1yZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczplfX0sUG9seWdvbjpmdW5jdGlvbih0KXt2YXIgZT1bXSxuPXdoLkxpbmVTdHJpbmcuYXBwbHkodGhpcyxbdC5fc2hlbGxdKTtlLnB1c2gobi5jb29yZGluYXRlcyk7Zm9yKHZhciByPTA7cjx0Ll9ob2xlcy5sZW5ndGg7KytyKXt2YXIgaT10Ll9ob2xlc1tyXSxvPXdoLkxpbmVTdHJpbmcuYXBwbHkodGhpcyxbaV0pO2UucHVzaChvLmNvb3JkaW5hdGVzKX1yZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6ZX19LE11bHRpUG9seWdvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dC5fZ2VvbWV0cmllcy5sZW5ndGg7KytuKXt2YXIgcj10Ll9nZW9tZXRyaWVzW25dLGk9d2guUG9seWdvbi5hcHBseSh0aGlzLFtyXSk7ZS5wdXNoKGkuY29vcmRpbmF0ZXMpfXJldHVybnt0eXBlOiJNdWx0aVBvbHlnb24iLGNvb3JkaW5hdGVzOmV9fSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQuX2dlb21ldHJpZXMubGVuZ3RoOysrbil7dmFyIHI9dC5fZ2VvbWV0cmllc1tuXSxpPXIuZ2V0R2VvbWV0cnlUeXBlKCk7ZS5wdXNoKHdoW2ldLmFwcGx5KHRoaXMsW3JdKSl9cmV0dXJue3R5cGU6Ikdlb21ldHJ5Q29sbGVjdGlvbiIsZ2VvbWV0cmllczplfX19LEloPWZ1bmN0aW9uKHQpe3RoaXMuZ2VvbWV0cnlGYWN0b3J5PXR8fG5ldyBfaCx0aGlzLnByZWNpc2lvbk1vZGVsPXRoaXMuZ2VvbWV0cnlGYWN0b3J5LmdldFByZWNpc2lvbk1vZGVsKCksdGhpcy5wYXJzZXI9bmV3IEVoKHRoaXMuZ2VvbWV0cnlGYWN0b3J5KX07SWgucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wYXJzZXIucmVhZCh0KTtyZXR1cm4gdGhpcy5wcmVjaXNpb25Nb2RlbC5nZXRUeXBlKCk9PT1naC5GSVhFRCYmdGhpcy5yZWR1Y2VQcmVjaXNpb24oZSksZX0sSWgucHJvdG90eXBlLnJlZHVjZVByZWNpc2lvbj1mdW5jdGlvbih0KXt2YXIgZSxuO2lmKHQuY29vcmRpbmF0ZSl0aGlzLnByZWNpc2lvbk1vZGVsLm1ha2VQcmVjaXNlKHQuY29vcmRpbmF0ZSk7ZWxzZSBpZih0LnBvaW50cylmb3IoZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspdGhpcy5wcmVjaXNpb25Nb2RlbC5tYWtlUHJlY2lzZSh0LnBvaW50c1tlXSk7ZWxzZSBpZih0Lmdlb21ldHJpZXMpZm9yKGU9MCxuPXQuZ2VvbWV0cmllcy5sZW5ndGg7ZTxuO2UrKyl0aGlzLnJlZHVjZVByZWNpc2lvbih0Lmdlb21ldHJpZXNbZV0pfTt2YXIgTmg9ZnVuY3Rpb24oKXt0aGlzLnBhcnNlcj1uZXcgRWgodGhpcy5nZW9tZXRyeUZhY3RvcnkpfTtOaC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucGFyc2VyLndyaXRlKHQpfTt2YXIgU2g9ZnVuY3Rpb24oKXt9LENoPXtPTjp7Y29uZmlndXJhYmxlOiEwfSxMRUZUOntjb25maWd1cmFibGU6ITB9LFJJR0hUOntjb25maWd1cmFibGU6ITB9fTtmdW5jdGlvbiBQaCh0KXt0aGlzLm1lc3NhZ2U9dHx8IiJ9ZnVuY3Rpb24gTWgoKXt0aGlzLmFycmF5Xz1bXX1TaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sU2gucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFNofSxTaC5vcHBvc2l0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVNoLkxFRlQ/U2guUklHSFQ6dD09PVNoLlJJR0hUP1NoLkxFRlQ6dH0sQ2guT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LENoLkxFRlQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LENoLlJJR0hULmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhTaCxDaCksUGgucHJvdG90eXBlPW5ldyBFcnJvcixQaC5wcm90b3R5cGUubmFtZT0iRW1wdHlTdGFja0V4Y2VwdGlvbiIsTWgucHJvdG90eXBlPW5ldyBhYyxNaC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFycmF5Xy5wdXNoKHQpLCEwfSxNaC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2lmKHQ8MHx8dD49dGhpcy5zaXplKCkpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLmFycmF5X1t0XX0sTWgucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXJyYXlfLnB1c2godCksdH0sTWgucHJvdG90eXBlLnBvcD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5hcnJheV8ubGVuZ3RoKXRocm93IG5ldyBQaDtyZXR1cm4gdGhpcy5hcnJheV8ucG9wKCl9LE1oLnByb3RvdHlwZS5wZWVrPWZ1bmN0aW9uKCl7aWYoMD09PXRoaXMuYXJyYXlfLmxlbmd0aCl0aHJvdyBuZXcgUGg7cmV0dXJuIHRoaXMuYXJyYXlfW3RoaXMuYXJyYXlfLmxlbmd0aC0xXX0sTWgucHJvdG90eXBlLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9LE1oLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1wdHkoKX0sTWgucHJvdG90eXBlLnNlYXJjaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hcnJheV8uaW5kZXhPZih0KX0sTWgucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcnJheV8ubGVuZ3RofSxNaC5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl0LnB1c2godGhpcy5hcnJheV9bZV0pO3JldHVybiB0fTt2YXIgTGg9ZnVuY3Rpb24oKXt0aGlzLl9taW5JbmRleD0tMSx0aGlzLl9taW5Db29yZD1udWxsLHRoaXMuX21pbkRlPW51bGwsdGhpcy5fb3JpZW50ZWREZT1udWxsfTtMaC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5Db29yZH0sTGgucHJvdG90eXBlLmdldFJpZ2h0bW9zdFNpZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldFJpZ2h0bW9zdFNpZGVPZlNlZ21lbnQodCxlKTtyZXR1cm4gbjwwJiYobj10aGlzLmdldFJpZ2h0bW9zdFNpZGVPZlNlZ21lbnQodCxlLTEpKSxuPDAmJih0aGlzLl9taW5Db29yZD1udWxsLHRoaXMuY2hlY2tGb3JSaWdodG1vc3RDb29yZGluYXRlKHQpKSxufSxMaC5wcm90b3R5cGUuZmluZFJpZ2h0bW9zdEVkZ2VBdFZlcnRleD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX21pbkRlLmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpO3FsLmlzVHJ1ZSh0aGlzLl9taW5JbmRleD4wJiZ0aGlzLl9taW5JbmRleDx0Lmxlbmd0aCwicmlnaHRtb3N0IHBvaW50IGV4cGVjdGVkIHRvIGJlIGludGVyaW9yIHZlcnRleCBvZiBlZGdlIik7dmFyIGU9dFt0aGlzLl9taW5JbmRleC0xXSxuPXRbdGhpcy5fbWluSW5kZXgrMV0scj1YbC5jb21wdXRlT3JpZW50YXRpb24odGhpcy5fbWluQ29vcmQsbixlKSxpPSExOyhlLnk8dGhpcy5fbWluQ29vcmQueSYmbi55PHRoaXMuX21pbkNvb3JkLnkmJnI9PT1YbC5DT1VOVEVSQ0xPQ0tXSVNFfHxlLnk+dGhpcy5fbWluQ29vcmQueSYmbi55PnRoaXMuX21pbkNvb3JkLnkmJnI9PT1YbC5DTE9DS1dJU0UpJiYoaT0hMCksaSYmKHRoaXMuX21pbkluZGV4PXRoaXMuX21pbkluZGV4LTEpfSxMaC5wcm90b3R5cGUuZ2V0UmlnaHRtb3N0U2lkZU9mU2VnbWVudD1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCk7aWYoZTwwfHxlKzE+PW4ubGVuZ3RoKXJldHVybi0xO2lmKG5bZV0ueT09PW5bZSsxXS55KXJldHVybi0xO3ZhciByPVNoLkxFRlQ7cmV0dXJuIG5bZV0ueTxuW2UrMV0ueSYmKHI9U2guUklHSFQpLHJ9LExoLnByb3RvdHlwZS5nZXRFZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGVkRGV9LExoLnByb3RvdHlwZS5jaGVja0ZvclJpZ2h0bW9zdENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj10LmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpLHI9MDtyPG4ubGVuZ3RoLTE7cisrKShudWxsPT09ZS5fbWluQ29vcmR8fG5bcl0ueD5lLl9taW5Db29yZC54KSYmKGUuX21pbkRlPXQsZS5fbWluSW5kZXg9cixlLl9taW5Db29yZD1uW3JdKX0sTGgucHJvdG90eXBlLmZpbmRSaWdodG1vc3RFZGdlQXROb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWluRGUuZ2V0Tm9kZSgpLmdldEVkZ2VzKCk7dGhpcy5fbWluRGU9dC5nZXRSaWdodG1vc3RFZGdlKCksdGhpcy5fbWluRGUuaXNGb3J3YXJkKCl8fCh0aGlzLl9taW5EZT10aGlzLl9taW5EZS5nZXRTeW0oKSx0aGlzLl9taW5JbmRleD10aGlzLl9taW5EZS5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKS5sZW5ndGgtMSl9LExoLnByb3RvdHlwZS5maW5kRWRnZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7bi5pc0ZvcndhcmQoKSYmdGhpcy5jaGVja0ZvclJpZ2h0bW9zdENvb3JkaW5hdGUobil9cWwuaXNUcnVlKDAhPT10aGlzLl9taW5JbmRleHx8dGhpcy5fbWluQ29vcmQuZXF1YWxzKHRoaXMuX21pbkRlLmdldENvb3JkaW5hdGUoKSksImluY29uc2lzdGVuY3kgaW4gcmlnaHRtb3N0IHByb2Nlc3NpbmciKSwwPT09dGhpcy5fbWluSW5kZXg/dGhpcy5maW5kUmlnaHRtb3N0RWRnZUF0Tm9kZSgpOnRoaXMuZmluZFJpZ2h0bW9zdEVkZ2VBdFZlcnRleCgpLHRoaXMuX29yaWVudGVkRGU9dGhpcy5fbWluRGUsdGhpcy5nZXRSaWdodG1vc3RTaWRlKHRoaXMuX21pbkRlLHRoaXMuX21pbkluZGV4KT09PVNoLkxFRlQmJih0aGlzLl9vcmllbnRlZERlPXRoaXMuX21pbkRlLmdldFN5bSgpKX0sTGgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LExoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBMaH07dmFyIE9oPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobixyKXt0LmNhbGwodGhpcyxlLm1zZ1dpdGhDb29yZChuLHIpKSx0aGlzLnB0PXI/bmV3IHVsKHIpOm51bGwsdGhpcy5uYW1lPSJUb3BvbG9neUV4Y2VwdGlvbiJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdH0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS5tc2dXaXRoQ29vcmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT90OnQrIiBbICIrZSsiIF0ifSxlfShrbCksUmg9ZnVuY3Rpb24oKXt0aGlzLmFycmF5Xz1bXX07UmgucHJvdG90eXBlLmFkZExhc3Q9ZnVuY3Rpb24odCl7dGhpcy5hcnJheV8ucHVzaCh0KX0sUmgucHJvdG90eXBlLnJlbW92ZUZpcnN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLnNoaWZ0KCl9LFJoLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9O3ZhciBUaD1mdW5jdGlvbigpe3RoaXMuX2ZpbmRlcj1udWxsLHRoaXMuX2RpckVkZ2VMaXN0PW5ldyBsYyx0aGlzLl9ub2Rlcz1uZXcgbGMsdGhpcy5fcmlnaHRNb3N0Q29vcmQ9bnVsbCx0aGlzLl9lbnY9bnVsbCx0aGlzLl9maW5kZXI9bmV3IExofTtUaC5wcm90b3R5cGUuY2xlYXJWaXNpdGVkRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZGlyRWRnZUxpc3QuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLnNldFZpc2l0ZWQoITEpfX0sVGgucHJvdG90eXBlLmdldFJpZ2h0bW9zdENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmlnaHRNb3N0Q29vcmR9LFRoLnByb3RvdHlwZS5jb21wdXRlTm9kZURlcHRoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLG49dC5nZXRFZGdlcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihyLmlzVmlzaXRlZCgpfHxyLmdldFN5bSgpLmlzVmlzaXRlZCgpKXtlPXI7YnJlYWt9fWlmKG51bGw9PT1lKXRocm93IG5ldyBPaCgidW5hYmxlIHRvIGZpbmQgZWRnZSB0byBjb21wdXRlIGRlcHRocyBhdCAiK3QuZ2V0Q29vcmRpbmF0ZSgpKTt0LmdldEVkZ2VzKCkuY29tcHV0ZURlcHRocyhlKTtmb3IodmFyIGk9dC5nZXRFZGdlcygpLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKTtvLnNldFZpc2l0ZWQoITApLHRoaXMuY29weVN5bURlcHRocyhvKX19LFRoLnByb3RvdHlwZS5jb21wdXRlRGVwdGg9ZnVuY3Rpb24odCl7dGhpcy5jbGVhclZpc2l0ZWRFZGdlcygpO3ZhciBlPXRoaXMuX2ZpbmRlci5nZXRFZGdlKCk7ZS5zZXRFZGdlRGVwdGhzKFNoLlJJR0hULHQpLHRoaXMuY29weVN5bURlcHRocyhlKSx0aGlzLmNvbXB1dGVEZXB0aHMoZSl9LFRoLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCl7dGhpcy5hZGRSZWFjaGFibGUodCksdGhpcy5fZmluZGVyLmZpbmRFZGdlKHRoaXMuX2RpckVkZ2VMaXN0KSx0aGlzLl9yaWdodE1vc3RDb29yZD10aGlzLl9maW5kZXIuZ2V0Q29vcmRpbmF0ZSgpfSxUaC5wcm90b3R5cGUuZmluZFJlc3VsdEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2RpckVkZ2VMaXN0Lml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKTtlLmdldERlcHRoKFNoLlJJR0hUKT49MSYmZS5nZXREZXB0aChTaC5MRUZUKTw9MCYmIWUuaXNJbnRlcmlvckFyZWFFZGdlKCkmJmUuc2V0SW5SZXN1bHQoITApfX0sVGgucHJvdG90eXBlLmNvbXB1dGVEZXB0aHM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHhjLG49bmV3IFJoLHI9dC5nZXROb2RlKCk7Zm9yKG4uYWRkTGFzdChyKSxlLmFkZChyKSx0LnNldFZpc2l0ZWQoITApOyFuLmlzRW1wdHkoKTspe3ZhciBpPW4ucmVtb3ZlRmlyc3QoKTtlLmFkZChpKSx0aGlzLmNvbXB1dGVOb2RlRGVwdGgoaSk7Zm9yKHZhciBvPWkuZ2V0RWRnZXMoKS5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCkuZ2V0U3ltKCk7aWYoIXMuaXNWaXNpdGVkKCkpe3ZhciBhPXMuZ2V0Tm9kZSgpO2UuY29udGFpbnMoYSl8fChuLmFkZExhc3QoYSksZS5hZGQoYSkpfX19fSxUaC5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX3JpZ2h0TW9zdENvb3JkLng8ZS5fcmlnaHRNb3N0Q29vcmQueD8tMTp0aGlzLl9yaWdodE1vc3RDb29yZC54PmUuX3JpZ2h0TW9zdENvb3JkLng/MTowfSxUaC5wcm90b3R5cGUuZ2V0RW52ZWxvcGU9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fZW52KXtmb3IodmFyIHQ9bmV3IExsLGU9dGhpcy5fZGlyRWRnZUxpc3QuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspZm9yKHZhciBuPWUubmV4dCgpLmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpLHI9MDtyPG4ubGVuZ3RoLTE7cisrKXQuZXhwYW5kVG9JbmNsdWRlKG5bcl0pO3RoaXMuX2Vudj10fXJldHVybiB0aGlzLl9lbnZ9LFRoLnByb3RvdHlwZS5hZGRSZWFjaGFibGU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IE1oO2ZvcihlLmFkZCh0KTshZS5lbXB0eSgpOyl7dmFyIG49ZS5wb3AoKTt0aGlzLmFkZChuLGUpfX0sVGgucHJvdG90eXBlLmNvcHlTeW1EZXB0aHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRTeW0oKTtlLnNldERlcHRoKFNoLkxFRlQsdC5nZXREZXB0aChTaC5SSUdIVCkpLGUuc2V0RGVwdGgoU2guUklHSFQsdC5nZXREZXB0aChTaC5MRUZUKSl9LFRoLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXt0LnNldFZpc2l0ZWQoITApLHRoaXMuX25vZGVzLmFkZCh0KTtmb3IodmFyIG49dC5nZXRFZGdlcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTt0aGlzLl9kaXJFZGdlTGlzdC5hZGQocik7dmFyIGk9ci5nZXRTeW0oKS5nZXROb2RlKCk7aS5pc1Zpc2l0ZWQoKXx8ZS5wdXNoKGkpfX0sVGgucHJvdG90eXBlLmdldE5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzfSxUaC5wcm90b3R5cGUuZ2V0RGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXJFZGdlTGlzdH0sVGgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2lsXX0sVGgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFRofTt2YXIgQWg9ZnVuY3Rpb24gdCgpe3ZhciBlPXRoaXM7aWYodGhpcy5sb2NhdGlvbj1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5pbml0KG4ubGVuZ3RoKX1lbHNlIGlmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSl7dmFyIHI9YXJndW1lbnRzWzBdO3RoaXMuaW5pdCgxKSx0aGlzLmxvY2F0aW9uW1NoLk9OXT1yfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0KXt2YXIgaT1hcmd1bWVudHNbMF07aWYodGhpcy5pbml0KGkubG9jYXRpb24ubGVuZ3RoKSxudWxsIT09aSlmb3IodmFyIG89MDtvPHRoaXMubG9jYXRpb24ubGVuZ3RoO28rKyllLmxvY2F0aW9uW29dPWkubG9jYXRpb25bb119fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXSx1PWFyZ3VtZW50c1syXTt0aGlzLmluaXQoMyksdGhpcy5sb2NhdGlvbltTaC5PTl09cyx0aGlzLmxvY2F0aW9uW1NoLkxFRlRdPWEsdGhpcy5sb2NhdGlvbltTaC5SSUdIVF09dX19O0FoLnByb3RvdHlwZS5zZXRBbGxMb2NhdGlvbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmxvY2F0aW9uLmxlbmd0aDtlKyspdGhpcy5sb2NhdGlvbltlXT10fSxBaC5wcm90b3R5cGUuaXNOdWxsPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLmxvY2F0aW9uLmxlbmd0aDt0KyspaWYodGhpcy5sb2NhdGlvblt0XSE9PXBsLk5PTkUpcmV0dXJuITE7cmV0dXJuITB9LEFoLnByb3RvdHlwZS5zZXRBbGxMb2NhdGlvbnNJZk51bGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmxvY2F0aW9uLmxlbmd0aDtlKyspdGhpcy5sb2NhdGlvbltlXT09PXBsLk5PTkUmJih0aGlzLmxvY2F0aW9uW2VdPXQpfSxBaC5wcm90b3R5cGUuaXNMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLmxvY2F0aW9uLmxlbmd0aH0sQWgucHJvdG90eXBlLm1lcmdlPWZ1bmN0aW9uKHQpe2lmKHQubG9jYXRpb24ubGVuZ3RoPnRoaXMubG9jYXRpb24ubGVuZ3RoKXt2YXIgZT1uZXcgQXJyYXkoMykuZmlsbChudWxsKTtlW1NoLk9OXT10aGlzLmxvY2F0aW9uW1NoLk9OXSxlW1NoLkxFRlRdPXBsLk5PTkUsZVtTaC5SSUdIVF09cGwuTk9ORSx0aGlzLmxvY2F0aW9uPWV9Zm9yKHZhciBuPTA7bjx0aGlzLmxvY2F0aW9uLmxlbmd0aDtuKyspdGhpcy5sb2NhdGlvbltuXT09PXBsLk5PTkUmJm48dC5sb2NhdGlvbi5sZW5ndGgmJih0aGlzLmxvY2F0aW9uW25dPXQubG9jYXRpb25bbl0pfSxBaC5wcm90b3R5cGUuZ2V0TG9jYXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYXRpb259LEFoLnByb3RvdHlwZS5mbGlwPWZ1bmN0aW9uKCl7aWYodGhpcy5sb2NhdGlvbi5sZW5ndGg8PTEpcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5sb2NhdGlvbltTaC5MRUZUXTt0aGlzLmxvY2F0aW9uW1NoLkxFRlRdPXRoaXMubG9jYXRpb25bU2guUklHSFRdLHRoaXMubG9jYXRpb25bU2guUklHSFRdPXR9LEFoLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PW5ldyB2bDtyZXR1cm4gdGhpcy5sb2NhdGlvbi5sZW5ndGg+MSYmdC5hcHBlbmQocGwudG9Mb2NhdGlvblN5bWJvbCh0aGlzLmxvY2F0aW9uW1NoLkxFRlRdKSksdC5hcHBlbmQocGwudG9Mb2NhdGlvblN5bWJvbCh0aGlzLmxvY2F0aW9uW1NoLk9OXSkpLHRoaXMubG9jYXRpb24ubGVuZ3RoPjEmJnQuYXBwZW5kKHBsLnRvTG9jYXRpb25TeW1ib2wodGhpcy5sb2NhdGlvbltTaC5SSUdIVF0pKSx0LnRvU3RyaW5nKCl9LEFoLnByb3RvdHlwZS5zZXRMb2NhdGlvbnM9ZnVuY3Rpb24odCxlLG4pe3RoaXMubG9jYXRpb25bU2guT05dPXQsdGhpcy5sb2NhdGlvbltTaC5MRUZUXT1lLHRoaXMubG9jYXRpb25bU2guUklHSFRdPW59LEFoLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ8dGhpcy5sb2NhdGlvbi5sZW5ndGg/dGhpcy5sb2NhdGlvblt0XTpwbC5OT05FfSxBaC5wcm90b3R5cGUuaXNBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYXRpb24ubGVuZ3RoPjF9LEFoLnByb3RvdHlwZS5pc0FueU51bGw9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMubG9jYXRpb24ubGVuZ3RoO3QrKylpZih0aGlzLmxvY2F0aW9uW3RdPT09cGwuTk9ORSlyZXR1cm4hMDtyZXR1cm4hMX0sQWgucHJvdG90eXBlLnNldExvY2F0aW9uPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldExvY2F0aW9uKFNoLk9OLHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLmxvY2F0aW9uW2VdPW59fSxBaC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0KXt0aGlzLmxvY2F0aW9uPW5ldyBBcnJheSh0KS5maWxsKG51bGwpLHRoaXMuc2V0QWxsTG9jYXRpb25zKHBsLk5PTkUpfSxBaC5wcm90b3R5cGUuaXNFcXVhbE9uU2lkZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmxvY2F0aW9uW2VdPT09dC5sb2NhdGlvbltlXX0sQWgucHJvdG90eXBlLmFsbFBvc2l0aW9uc0VxdWFsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5sb2NhdGlvbi5sZW5ndGg7ZSsrKWlmKHRoaXMubG9jYXRpb25bZV0hPT10KXJldHVybiExO3JldHVybiEwfSxBaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sQWgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEFofTt2YXIgRGg9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuZWx0PW5ldyBBcnJheSgyKS5maWxsKG51bGwpLDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmVsdFswXT1uZXcgQWgoZSksdGhpcy5lbHRbMV09bmV3IEFoKGUpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0KXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5lbHRbMF09bmV3IEFoKG4uZWx0WzBdKSx0aGlzLmVsdFsxXT1uZXcgQWgobi5lbHRbMV0pfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07dGhpcy5lbHRbMF09bmV3IEFoKHBsLk5PTkUpLHRoaXMuZWx0WzFdPW5ldyBBaChwbC5OT05FKSx0aGlzLmVsdFtyXS5zZXRMb2NhdGlvbihpKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl07dGhpcy5lbHRbMF09bmV3IEFoKG8scyxhKSx0aGlzLmVsdFsxXT1uZXcgQWgobyxzLGEpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB1PWFyZ3VtZW50c1swXSxsPWFyZ3VtZW50c1sxXSxjPWFyZ3VtZW50c1syXSxoPWFyZ3VtZW50c1szXTt0aGlzLmVsdFswXT1uZXcgQWgocGwuTk9ORSxwbC5OT05FLHBsLk5PTkUpLHRoaXMuZWx0WzFdPW5ldyBBaChwbC5OT05FLHBsLk5PTkUscGwuTk9ORSksdGhpcy5lbHRbdV0uc2V0TG9jYXRpb25zKGwsYyxoKX19O0RoLnByb3RvdHlwZS5nZXRHZW9tZXRyeUNvdW50PWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lbHRbMF0uaXNOdWxsKCl8fHQrKyx0aGlzLmVsdFsxXS5pc051bGwoKXx8dCsrLHR9LERoLnByb3RvdHlwZS5zZXRBbGxMb2NhdGlvbnM9ZnVuY3Rpb24odCxlKXt0aGlzLmVsdFt0XS5zZXRBbGxMb2NhdGlvbnMoZSl9LERoLnByb3RvdHlwZS5pc051bGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWx0W3RdLmlzTnVsbCgpfSxEaC5wcm90b3R5cGUuc2V0QWxsTG9jYXRpb25zSWZOdWxsPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldEFsbExvY2F0aW9uc0lmTnVsbCgwLHQpLHRoaXMuc2V0QWxsTG9jYXRpb25zSWZOdWxsKDEsdCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuZWx0W2VdLnNldEFsbExvY2F0aW9uc0lmTnVsbChuKX19LERoLnByb3RvdHlwZS5pc0xpbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWx0W3RdLmlzTGluZSgpfSxEaC5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj0wO248MjtuKyspbnVsbD09PWUuZWx0W25dJiZudWxsIT09dC5lbHRbbl0/ZS5lbHRbbl09bmV3IEFoKHQuZWx0W25dKTplLmVsdFtuXS5tZXJnZSh0LmVsdFtuXSl9LERoLnByb3RvdHlwZS5mbGlwPWZ1bmN0aW9uKCl7dGhpcy5lbHRbMF0uZmxpcCgpLHRoaXMuZWx0WzFdLmZsaXAoKX0sRGgucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5lbHRbdF0uZ2V0KFNoLk9OKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmVsdFtlXS5nZXQobil9fSxEaC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgdmw7cmV0dXJuIG51bGwhPT10aGlzLmVsdFswXSYmKHQuYXBwZW5kKCJBOiIpLHQuYXBwZW5kKHRoaXMuZWx0WzBdLnRvU3RyaW5nKCkpKSxudWxsIT09dGhpcy5lbHRbMV0mJih0LmFwcGVuZCgiIEI6IiksdC5hcHBlbmQodGhpcy5lbHRbMV0udG9TdHJpbmcoKSkpLHQudG9TdHJpbmcoKX0sRGgucHJvdG90eXBlLmlzQXJlYT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmVsdFswXS5pc0FyZWEoKXx8dGhpcy5lbHRbMV0uaXNBcmVhKCk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5lbHRbdF0uaXNBcmVhKCl9fSxEaC5wcm90b3R5cGUuaXNBbnlOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVsdFt0XS5pc0FueU51bGwoKX0sRGgucHJvdG90eXBlLnNldExvY2F0aW9uPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLmVsdFt0XS5zZXRMb2NhdGlvbihTaC5PTixlKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl07dGhpcy5lbHRbbl0uc2V0TG9jYXRpb24ocixpKX19LERoLnByb3RvdHlwZS5pc0VxdWFsT25TaWRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWx0WzBdLmlzRXF1YWxPblNpZGUodC5lbHRbMF0sZSkmJnRoaXMuZWx0WzFdLmlzRXF1YWxPblNpZGUodC5lbHRbMV0sZSl9LERoLnByb3RvdHlwZS5hbGxQb3NpdGlvbnNFcXVhbD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVsdFt0XS5hbGxQb3NpdGlvbnNFcXVhbChlKX0sRGgucHJvdG90eXBlLnRvTGluZT1mdW5jdGlvbih0KXt0aGlzLmVsdFt0XS5pc0FyZWEoKSYmKHRoaXMuZWx0W3RdPW5ldyBBaCh0aGlzLmVsdFt0XS5sb2NhdGlvblswXSkpfSxEaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRGgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIERofSxEaC50b0xpbmVMYWJlbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IERoKHBsLk5PTkUpLG49MDtuPDI7bisrKWUuc2V0TG9jYXRpb24obix0LmdldExvY2F0aW9uKG4pKTtyZXR1cm4gZX07dmFyIEZoPWZ1bmN0aW9uKCl7dGhpcy5fc3RhcnREZT1udWxsLHRoaXMuX21heE5vZGVEZWdyZWU9LTEsdGhpcy5fZWRnZXM9bmV3IGxjLHRoaXMuX3B0cz1uZXcgbGMsdGhpcy5fbGFiZWw9bmV3IERoKHBsLk5PTkUpLHRoaXMuX3Jpbmc9bnVsbCx0aGlzLl9pc0hvbGU9bnVsbCx0aGlzLl9zaGVsbD1udWxsLHRoaXMuX2hvbGVzPW5ldyBsYyx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbWV0cnlGYWN0b3J5PWUsdGhpcy5jb21wdXRlUG9pbnRzKHQpLHRoaXMuY29tcHV0ZVJpbmcoKX07RmgucHJvdG90eXBlLmNvbXB1dGVSaW5nPWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3JpbmcpcmV0dXJuIG51bGw7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLl9wdHMuc2l6ZSgpKS5maWxsKG51bGwpLGU9MDtlPHRoaXMuX3B0cy5zaXplKCk7ZSsrKXRbZV09dGhpcy5fcHRzLmdldChlKTt0aGlzLl9yaW5nPXRoaXMuX2dlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKHQpLHRoaXMuX2lzSG9sZT1YbC5pc0NDVyh0aGlzLl9yaW5nLmdldENvb3JkaW5hdGVzKCkpfSxGaC5wcm90b3R5cGUuaXNJc29sYXRlZD1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5fbGFiZWwuZ2V0R2VvbWV0cnlDb3VudCgpfSxGaC5wcm90b3R5cGUuY29tcHV0ZVBvaW50cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX3N0YXJ0RGU9dDt2YXIgbj10LHI9ITA7ZG97aWYobnVsbD09PW4pdGhyb3cgbmV3IE9oKCJGb3VuZCBudWxsIERpcmVjdGVkRWRnZSIpO2lmKG4uZ2V0RWRnZVJpbmcoKT09PWUpdGhyb3cgbmV3IE9oKCJEaXJlY3RlZCBFZGdlIHZpc2l0ZWQgdHdpY2UgZHVyaW5nIHJpbmctYnVpbGRpbmcgYXQgIituLmdldENvb3JkaW5hdGUoKSk7ZS5fZWRnZXMuYWRkKG4pO3ZhciBpPW4uZ2V0TGFiZWwoKTtxbC5pc1RydWUoaS5pc0FyZWEoKSksZS5tZXJnZUxhYmVsKGkpLGUuYWRkUG9pbnRzKG4uZ2V0RWRnZSgpLG4uaXNGb3J3YXJkKCkscikscj0hMSxlLnNldEVkZ2VSaW5nKG4sZSksbj1lLmdldE5leHQobil9d2hpbGUobiE9PXRoaXMuX3N0YXJ0RGUpfSxGaC5wcm90b3R5cGUuZ2V0TGluZWFyUmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yaW5nfSxGaC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHRzLmdldCh0KX0sRmgucHJvdG90eXBlLmNvbXB1dGVNYXhOb2RlRGVncmVlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9tYXhOb2RlRGVncmVlPTA7dmFyIGU9dGhpcy5fc3RhcnREZTtkb3t2YXIgbj1lLmdldE5vZGUoKS5nZXRFZGdlcygpLmdldE91dGdvaW5nRGVncmVlKHQpO24+dC5fbWF4Tm9kZURlZ3JlZSYmKHQuX21heE5vZGVEZWdyZWU9biksZT10LmdldE5leHQoZSl9d2hpbGUoZSE9PXRoaXMuX3N0YXJ0RGUpO3RoaXMuX21heE5vZGVEZWdyZWUqPTJ9LEZoLnByb3RvdHlwZS5hZGRQb2ludHM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuZ2V0Q29vcmRpbmF0ZXMoKTtpZihlKXt2YXIgaT0xO24mJihpPTApO2Zvcih2YXIgbz1pO288ci5sZW5ndGg7bysrKXRoaXMuX3B0cy5hZGQocltvXSl9ZWxzZXt2YXIgcz1yLmxlbmd0aC0yO24mJihzPXIubGVuZ3RoLTEpO2Zvcih2YXIgYT1zO2E+PTA7YS0tKXRoaXMuX3B0cy5hZGQoclthXSl9fSxGaC5wcm90b3R5cGUuaXNIb2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSG9sZX0sRmgucHJvdG90eXBlLnNldEluUmVzdWx0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3RhcnREZTtkb3t0LmdldEVkZ2UoKS5zZXRJblJlc3VsdCghMCksdD10LmdldE5leHQoKX13aGlsZSh0IT09dGhpcy5fc3RhcnREZSl9LEZoLnByb3RvdHlwZS5jb250YWluc1BvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0TGluZWFyUmluZygpO2lmKCFlLmdldEVudmVsb3BlSW50ZXJuYWwoKS5jb250YWlucyh0KSlyZXR1cm4hMTtpZighWGwuaXNQb2ludEluUmluZyh0LGUuZ2V0Q29vcmRpbmF0ZXMoKSkpcmV0dXJuITE7Zm9yKHZhciBuPXRoaXMuX2hvbGVzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXtpZihuLm5leHQoKS5jb250YWluc1BvaW50KHQpKXJldHVybiExfXJldHVybiEwfSxGaC5wcm90b3R5cGUuYWRkSG9sZT1mdW5jdGlvbih0KXt0aGlzLl9ob2xlcy5hZGQodCl9LEZoLnByb3RvdHlwZS5pc1NoZWxsPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9zaGVsbH0sRmgucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxGaC5wcm90b3R5cGUuZ2V0RWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZXN9LEZoLnByb3RvdHlwZS5nZXRNYXhOb2RlRGVncmVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heE5vZGVEZWdyZWU8MCYmdGhpcy5jb21wdXRlTWF4Tm9kZURlZ3JlZSgpLHRoaXMuX21heE5vZGVEZWdyZWV9LEZoLnByb3RvdHlwZS5nZXRTaGVsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbH0sRmgucHJvdG90eXBlLm1lcmdlTGFiZWw9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMubWVyZ2VMYWJlbCh0LDApLHRoaXMubWVyZ2VMYWJlbCh0LDEpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWUuZ2V0TG9jYXRpb24obixTaC5SSUdIVCk7aWYocj09PXBsLk5PTkUpcmV0dXJuIG51bGw7aWYodGhpcy5fbGFiZWwuZ2V0TG9jYXRpb24obik9PT1wbC5OT05FKXJldHVybiB0aGlzLl9sYWJlbC5zZXRMb2NhdGlvbihuLHIpLG51bGx9fSxGaC5wcm90b3R5cGUuc2V0U2hlbGw9ZnVuY3Rpb24odCl7dGhpcy5fc2hlbGw9dCxudWxsIT09dCYmdC5hZGRIb2xlKHRoaXMpfSxGaC5wcm90b3R5cGUudG9Qb2x5Z29uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodGhpcy5faG9sZXMuc2l6ZSgpKS5maWxsKG51bGwpLG49MDtuPHRoaXMuX2hvbGVzLnNpemUoKTtuKyspZVtuXT10aGlzLl9ob2xlcy5nZXQobikuZ2V0TGluZWFyUmluZygpO3JldHVybiB0LmNyZWF0ZVBvbHlnb24odGhpcy5nZXRMaW5lYXJSaW5nKCksZSl9LEZoLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxGaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRmh9O3ZhciBraD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnNldEVkZ2VSaW5nPWZ1bmN0aW9uKHQsZSl7dC5zZXRNaW5FZGdlUmluZyhlKX0sZS5wcm90b3R5cGUuZ2V0TmV4dD1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXROZXh0TWluKCl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KEZoKSxHaD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmJ1aWxkTWluaW1hbFJpbmdzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGxjLGU9dGhpcy5fc3RhcnREZTtkb3tpZihudWxsPT09ZS5nZXRNaW5FZGdlUmluZygpKXt2YXIgbj1uZXcga2goZSx0aGlzLl9nZW9tZXRyeUZhY3RvcnkpO3QuYWRkKG4pfWU9ZS5nZXROZXh0KCl9d2hpbGUoZSE9PXRoaXMuX3N0YXJ0RGUpO3JldHVybiB0fSxlLnByb3RvdHlwZS5zZXRFZGdlUmluZz1mdW5jdGlvbih0LGUpe3Quc2V0RWRnZVJpbmcoZSl9LGUucHJvdG90eXBlLmxpbmtEaXJlY3RlZEVkZ2VzRm9yTWluaW1hbEVkZ2VSaW5ncz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3N0YXJ0RGU7ZG97dC5nZXROb2RlKCkuZ2V0RWRnZXMoKS5saW5rTWluaW1hbERpcmVjdGVkRWRnZXModGhpcyksdD10LmdldE5leHQoKX13aGlsZSh0IT09dGhpcy5fc3RhcnREZSl9LGUucHJvdG90eXBlLmdldE5leHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TmV4dCgpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShGaCkscWg9ZnVuY3Rpb24oKXtpZih0aGlzLl9sYWJlbD1udWxsLHRoaXMuX2lzSW5SZXN1bHQ9ITEsdGhpcy5faXNDb3ZlcmVkPSExLHRoaXMuX2lzQ292ZXJlZFNldD0hMSx0aGlzLl9pc1Zpc2l0ZWQ9ITEsMD09PWFyZ3VtZW50cy5sZW5ndGgpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9sYWJlbD10fX07cWgucHJvdG90eXBlLnNldFZpc2l0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNWaXNpdGVkPXR9LHFoLnByb3RvdHlwZS5zZXRJblJlc3VsdD1mdW5jdGlvbih0KXt0aGlzLl9pc0luUmVzdWx0PXR9LHFoLnByb3RvdHlwZS5pc0NvdmVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNDb3ZlcmVkfSxxaC5wcm90b3R5cGUuaXNDb3ZlcmVkU2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQ292ZXJlZFNldH0scWgucHJvdG90eXBlLnNldExhYmVsPWZ1bmN0aW9uKHQpe3RoaXMuX2xhYmVsPXR9LHFoLnByb3RvdHlwZS5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0scWgucHJvdG90eXBlLnNldENvdmVyZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNDb3ZlcmVkPXQsdGhpcy5faXNDb3ZlcmVkU2V0PSEwfSxxaC5wcm90b3R5cGUudXBkYXRlSU09ZnVuY3Rpb24odCl7cWwuaXNUcnVlKHRoaXMuX2xhYmVsLmdldEdlb21ldHJ5Q291bnQoKT49MiwiZm91bmQgcGFydGlhbCBsYWJlbCIpLHRoaXMuY29tcHV0ZUlNKHQpfSxxaC5wcm90b3R5cGUuaXNJblJlc3VsdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0luUmVzdWx0fSxxaC5wcm90b3R5cGUuaXNWaXNpdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmlzaXRlZH0scWgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHFoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxaH07dmFyIEJoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5fY29vcmQ9bnVsbCx0aGlzLl9lZGdlcz1udWxsO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9jb29yZD1lLHRoaXMuX2VkZ2VzPW4sdGhpcy5fbGFiZWw9bmV3IERoKDAscGwuTk9ORSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzSW5jaWRlbnRFZGdlSW5SZXN1bHQ9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5nZXRFZGdlcygpLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe2lmKHQubmV4dCgpLmdldEVkZ2UoKS5pc0luUmVzdWx0KCkpcmV0dXJuITB9cmV0dXJuITF9LGUucHJvdG90eXBlLmlzSXNvbGF0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMuX2xhYmVsLmdldEdlb21ldHJ5Q291bnQoKX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZH0sZS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludGxuKCJub2RlICIrdGhpcy5fY29vcmQrIiBsYmw6ICIrdGhpcy5fbGFiZWwpfSxlLnByb3RvdHlwZS5jb21wdXRlSU09ZnVuY3Rpb24odCl7fSxlLnByb3RvdHlwZS5jb21wdXRlTWVyZ2VkTG9jYXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj1wbC5OT05FO2lmKG49dGhpcy5fbGFiZWwuZ2V0TG9jYXRpb24oZSksIXQuaXNOdWxsKGUpKXt2YXIgcj10LmdldExvY2F0aW9uKGUpO24hPT1wbC5CT1VOREFSWSYmKG49cil9cmV0dXJuIG59LGUucHJvdG90eXBlLnNldExhYmVsPWZ1bmN0aW9uKCl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQucHJvdG90eXBlLnNldExhYmVsLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07bnVsbD09PXRoaXMuX2xhYmVsP3RoaXMuX2xhYmVsPW5ldyBEaChlLG4pOnRoaXMuX2xhYmVsLnNldExvY2F0aW9uKGUsbil9LGUucHJvdG90eXBlLmdldEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzfSxlLnByb3RvdHlwZS5tZXJnZUxhYmVsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGUpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLm1lcmdlTGFiZWwobi5fbGFiZWwpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBEaClmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9MDtpPDI7aSsrKXt2YXIgbz10LmNvbXB1dGVNZXJnZWRMb2NhdGlvbihyLGkpLHM9dC5fbGFiZWwuZ2V0TG9jYXRpb24oaSk7cz09PXBsLk5PTkUmJnQuX2xhYmVsLnNldExvY2F0aW9uKGksbyl9fSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5fZWRnZXMuaW5zZXJ0KHQpLHQuc2V0Tm9kZSh0aGlzKX0sZS5wcm90b3R5cGUuc2V0TGFiZWxCb3VuZGFyeT1mdW5jdGlvbih0KXtpZihudWxsPT09dGhpcy5fbGFiZWwpcmV0dXJuIG51bGw7dmFyIGU9cGwuTk9ORTtudWxsIT09dGhpcy5fbGFiZWwmJihlPXRoaXMuX2xhYmVsLmdldExvY2F0aW9uKHQpKTt2YXIgbj1udWxsO3N3aXRjaChlKXtjYXNlIHBsLkJPVU5EQVJZOm49cGwuSU5URVJJT1I7YnJlYWs7Y2FzZSBwbC5JTlRFUklPUjpkZWZhdWx0Om49cGwuQk9VTkRBUll9dGhpcy5fbGFiZWwuc2V0TG9jYXRpb24odCxuKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0ocWgpLHpoPWZ1bmN0aW9uKCl7dGhpcy5ub2RlTWFwPW5ldyBDYyx0aGlzLm5vZGVGYWN0PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMubm9kZUZhY3Q9dH07emgucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubm9kZU1hcC5nZXQodCl9LHpoLnByb3RvdHlwZS5hZGROb2RlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB1bCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dGhpcy5ub2RlTWFwLmdldCh0KTtyZXR1cm4gbnVsbD09PWUmJihlPXRoaXMubm9kZUZhY3QuY3JlYXRlTm9kZSh0KSx0aGlzLm5vZGVNYXAucHV0KHQsZSkpLGV9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBCaCl7dmFyIG49YXJndW1lbnRzWzBdLHI9dGhpcy5ub2RlTWFwLmdldChuLmdldENvb3JkaW5hdGUoKSk7cmV0dXJuIG51bGw9PT1yPyh0aGlzLm5vZGVNYXAucHV0KG4uZ2V0Q29vcmRpbmF0ZSgpLG4pLG4pOihyLm1lcmdlTGFiZWwobikscil9fSx6aC5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLnByaW50KHQpfX0semgucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpfSx6aC5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZU1hcC52YWx1ZXMoKX0semgucHJvdG90eXBlLmdldEJvdW5kYXJ5Tm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBsYyxuPXRoaXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3IuZ2V0TGFiZWwoKS5nZXRMb2NhdGlvbih0KT09PXBsLkJPVU5EQVJZJiZlLmFkZChyKX1yZXR1cm4gZX0semgucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZT10LmdldENvb3JkaW5hdGUoKTt0aGlzLmFkZE5vZGUoZSkuYWRkKHQpfSx6aC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0semgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHpofTt2YXIgamg9ZnVuY3Rpb24oKXt9LFVoPXtORTp7Y29uZmlndXJhYmxlOiEwfSxOVzp7Y29uZmlndXJhYmxlOiEwfSxTVzp7Y29uZmlndXJhYmxlOiEwfSxTRTp7Y29uZmlndXJhYmxlOiEwfX07amgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGpoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBqaH0samguaXNOb3J0aGVybj1mdW5jdGlvbih0KXtyZXR1cm4gdD09PWpoLk5FfHx0PT09amguTld9LGpoLmlzT3Bwb3NpdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCE9PWUmJjI9PT0odC1lKzQpJTR9LGpoLmNvbW1vbkhhbGZQbGFuZT1mdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiB0O2lmKDI9PT0odC1lKzQpJTQpcmV0dXJuLTE7dmFyIG49dDxlP3Q6ZTtyZXR1cm4gMD09PW4mJjM9PT0odD5lP3Q6ZSk/MzpufSxqaC5pc0luSGFsZlBsYW5lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9PT1qaC5TRT90PT09amguU0V8fHQ9PT1qaC5TVzp0PT09ZXx8dD09PWUrMX0samgucXVhZHJhbnQ9ZnVuY3Rpb24oKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZigwPT09dCYmMD09PWUpdGhyb3cgbmV3IGVsKCJDYW5ub3QgY29tcHV0ZSB0aGUgcXVhZHJhbnQgZm9yIHBvaW50ICggIit0KyIsICIrZSsiICkiKTtyZXR1cm4gdD49MD9lPj0wP2poLk5FOmpoLlNFOmU+PTA/amguTlc6amguU1d9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB1bCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB1bCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO2lmKHIueD09PW4ueCYmci55PT09bi55KXRocm93IG5ldyBlbCgiQ2Fubm90IGNvbXB1dGUgdGhlIHF1YWRyYW50IGZvciB0d28gaWRlbnRpY2FsIHBvaW50cyAiK24pO3JldHVybiByLng+PW4ueD9yLnk+PW4ueT9qaC5ORTpqaC5TRTpyLnk+PW4ueT9qaC5OVzpqaC5TV319LFVoLk5FLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxVaC5OVy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sVWguU1cuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LFVoLlNFLmdldD1mdW5jdGlvbigpe3JldHVybiAzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhqaCxVaCk7dmFyIFZoPWZ1bmN0aW9uKCl7aWYodGhpcy5fZWRnZT1udWxsLHRoaXMuX2xhYmVsPW51bGwsdGhpcy5fbm9kZT1udWxsLHRoaXMuX3AwPW51bGwsdGhpcy5fcDE9bnVsbCx0aGlzLl9keD1udWxsLHRoaXMuX2R5PW51bGwsdGhpcy5fcXVhZHJhbnQ9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2VkZ2U9dH1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl0saT1udWxsO3RoaXMuX2VkZ2U9ZSx0aGlzLmluaXQobixyKSx0aGlzLl9sYWJlbD1pfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXSx1PWFyZ3VtZW50c1szXTt0aGlzLl9lZGdlPW8sdGhpcy5pbml0KHMsYSksdGhpcy5fbGFiZWw9dX19O1ZoLnByb3RvdHlwZS5jb21wYXJlRGlyZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9keD09PXQuX2R4JiZ0aGlzLl9keT09PXQuX2R5PzA6dGhpcy5fcXVhZHJhbnQ+dC5fcXVhZHJhbnQ/MTp0aGlzLl9xdWFkcmFudDx0Ll9xdWFkcmFudD8tMTpYbC5jb21wdXRlT3JpZW50YXRpb24odC5fcDAsdC5fcDEsdGhpcy5fcDEpfSxWaC5wcm90b3R5cGUuZ2V0RHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHl9LFZoLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3AwfSxWaC5wcm90b3R5cGUuc2V0Tm9kZT1mdW5jdGlvbih0KXt0aGlzLl9ub2RlPXR9LFZoLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt2YXIgZT1NYXRoLmF0YW4yKHRoaXMuX2R5LHRoaXMuX2R4KSxuPXRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkscj1uLmxhc3RJbmRleE9mKCIuIiksaT1uLnN1YnN0cmluZyhyKzEpO3QucHJpbnQoIiAgIitpKyI6ICIrdGhpcy5fcDArIiAtICIrdGhpcy5fcDErIiAiK3RoaXMuX3F1YWRyYW50KyI6IitlKyIgICAiK3RoaXMuX2xhYmVsKX0sVmgucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLmNvbXBhcmVEaXJlY3Rpb24oZSl9LFZoLnByb3RvdHlwZS5nZXREaXJlY3RlZENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcDF9LFZoLnByb3RvdHlwZS5nZXREeD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9keH0sVmgucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxWaC5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlfSxWaC5wcm90b3R5cGUuZ2V0UXVhZHJhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcXVhZHJhbnR9LFZoLnByb3RvdHlwZS5nZXROb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGV9LFZoLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PU1hdGguYXRhbjIodGhpcy5fZHksdGhpcy5fZHgpLGU9dGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSxuPWUubGFzdEluZGV4T2YoIi4iKTtyZXR1cm4iICAiK2Uuc3Vic3RyaW5nKG4rMSkrIjogIit0aGlzLl9wMCsiIC0gIit0aGlzLl9wMSsiICIrdGhpcy5fcXVhZHJhbnQrIjoiK3QrIiAgICIrdGhpcy5fbGFiZWx9LFZoLnByb3RvdHlwZS5jb21wdXRlTGFiZWw9ZnVuY3Rpb24odCl7fSxWaC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUpe3RoaXMuX3AwPXQsdGhpcy5fcDE9ZSx0aGlzLl9keD1lLngtdC54LHRoaXMuX2R5PWUueS10LnksdGhpcy5fcXVhZHJhbnQ9amgucXVhZHJhbnQodGhpcy5fZHgsdGhpcy5fZHkpLHFsLmlzVHJ1ZSghKDA9PT10aGlzLl9keCYmMD09PXRoaXMuX2R5KSwiRWRnZUVuZCB3aXRoIGlkZW50aWNhbCBlbmRwb2ludHMgZm91bmQiKX0sVmgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2lsXX0sVmgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFZofTt2YXIgWGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0LmNhbGwodGhpcyxlKSx0aGlzLl9pc0ZvcndhcmQ9bnVsbCx0aGlzLl9pc0luUmVzdWx0PSExLHRoaXMuX2lzVmlzaXRlZD0hMSx0aGlzLl9zeW09bnVsbCx0aGlzLl9uZXh0PW51bGwsdGhpcy5fbmV4dE1pbj1udWxsLHRoaXMuX2VkZ2VSaW5nPW51bGwsdGhpcy5fbWluRWRnZVJpbmc9bnVsbCx0aGlzLl9kZXB0aD1bMCwtOTk5LC05OTldLHRoaXMuX2lzRm9yd2FyZD1uLG4pdGhpcy5pbml0KGUuZ2V0Q29vcmRpbmF0ZSgwKSxlLmdldENvb3JkaW5hdGUoMSkpO2Vsc2V7dmFyIHI9ZS5nZXROdW1Qb2ludHMoKS0xO3RoaXMuaW5pdChlLmdldENvb3JkaW5hdGUociksZS5nZXRDb29yZGluYXRlKHItMSkpfXRoaXMuY29tcHV0ZURpcmVjdGVkTGFiZWwoKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0TmV4dE1pbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9uZXh0TWlufSxlLnByb3RvdHlwZS5nZXREZXB0aD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGVwdGhbdF19LGUucHJvdG90eXBlLnNldFZpc2l0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNWaXNpdGVkPXR9LGUucHJvdG90eXBlLmNvbXB1dGVEaXJlY3RlZExhYmVsPWZ1bmN0aW9uKCl7dGhpcy5fbGFiZWw9bmV3IERoKHRoaXMuX2VkZ2UuZ2V0TGFiZWwoKSksdGhpcy5faXNGb3J3YXJkfHx0aGlzLl9sYWJlbC5mbGlwKCl9LGUucHJvdG90eXBlLmdldE5leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV4dH0sZS5wcm90b3R5cGUuc2V0RGVwdGg9ZnVuY3Rpb24odCxlKXtpZigtOTk5IT09dGhpcy5fZGVwdGhbdF0mJnRoaXMuX2RlcHRoW3RdIT09ZSl0aHJvdyBuZXcgT2goImFzc2lnbmVkIGRlcHRocyBkbyBub3QgbWF0Y2giLHRoaXMuZ2V0Q29vcmRpbmF0ZSgpKTt0aGlzLl9kZXB0aFt0XT1lfSxlLnByb3RvdHlwZS5pc0ludGVyaW9yQXJlYUVkZ2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPSEwLG49MDtuPDI7bisrKXQuX2xhYmVsLmlzQXJlYShuKSYmdC5fbGFiZWwuZ2V0TG9jYXRpb24obixTaC5MRUZUKT09PXBsLklOVEVSSU9SJiZ0Ll9sYWJlbC5nZXRMb2NhdGlvbihuLFNoLlJJR0hUKT09PXBsLklOVEVSSU9SfHwoZT0hMSk7cmV0dXJuIGV9LGUucHJvdG90eXBlLnNldE5leHRNaW49ZnVuY3Rpb24odCl7dGhpcy5fbmV4dE1pbj10fSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5wcmludC5jYWxsKHRoaXMsZSksZS5wcmludCgiICIrdGhpcy5fZGVwdGhbU2guTEVGVF0rIi8iK3RoaXMuX2RlcHRoW1NoLlJJR0hUXSksZS5wcmludCgiICgiK3RoaXMuZ2V0RGVwdGhEZWx0YSgpKyIpIiksdGhpcy5faXNJblJlc3VsdCYmZS5wcmludCgiIGluUmVzdWx0Iil9LGUucHJvdG90eXBlLnNldE1pbkVkZ2VSaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX21pbkVkZ2VSaW5nPXR9LGUucHJvdG90eXBlLmlzTGluZUVkZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9sYWJlbC5pc0xpbmUoMCl8fHRoaXMuX2xhYmVsLmlzTGluZSgxKSxlPSF0aGlzLl9sYWJlbC5pc0FyZWEoMCl8fHRoaXMuX2xhYmVsLmFsbFBvc2l0aW9uc0VxdWFsKDAscGwuRVhURVJJT1IpLG49IXRoaXMuX2xhYmVsLmlzQXJlYSgxKXx8dGhpcy5fbGFiZWwuYWxsUG9zaXRpb25zRXF1YWwoMSxwbC5FWFRFUklPUik7cmV0dXJuIHQmJmUmJm59LGUucHJvdG90eXBlLnNldEVkZ2VSaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX2VkZ2VSaW5nPXR9LGUucHJvdG90eXBlLmdldE1pbkVkZ2VSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbkVkZ2VSaW5nfSxlLnByb3RvdHlwZS5nZXREZXB0aERlbHRhPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWRnZS5nZXREZXB0aERlbHRhKCk7cmV0dXJuIHRoaXMuX2lzRm9yd2FyZHx8KHQ9LXQpLHR9LGUucHJvdG90eXBlLnNldEluUmVzdWx0PWZ1bmN0aW9uKHQpe3RoaXMuX2lzSW5SZXN1bHQ9dH0sZS5wcm90b3R5cGUuZ2V0U3ltPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N5bX0sZS5wcm90b3R5cGUuaXNGb3J3YXJkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRm9yd2FyZH0sZS5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlfSxlLnByb3RvdHlwZS5wcmludEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5wcmludCh0KSx0LnByaW50KCIgIiksdGhpcy5faXNGb3J3YXJkP3RoaXMuX2VkZ2UucHJpbnQodCk6dGhpcy5fZWRnZS5wcmludFJldmVyc2UodCl9LGUucHJvdG90eXBlLnNldFN5bT1mdW5jdGlvbih0KXt0aGlzLl9zeW09dH0sZS5wcm90b3R5cGUuc2V0VmlzaXRlZEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5zZXRWaXNpdGVkKHQpLHRoaXMuX3N5bS5zZXRWaXNpdGVkKHQpfSxlLnByb3RvdHlwZS5zZXRFZGdlRGVwdGhzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRFZGdlKCkuZ2V0RGVwdGhEZWx0YSgpO3RoaXMuX2lzRm9yd2FyZHx8KG49LW4pO3ZhciByPTE7dD09PVNoLkxFRlQmJihyPS0xKTt2YXIgaT1TaC5vcHBvc2l0ZSh0KSxvPWUrbipyO3RoaXMuc2V0RGVwdGgodCxlKSx0aGlzLnNldERlcHRoKGksbyl9LGUucHJvdG90eXBlLmdldEVkZ2VSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VSaW5nfSxlLnByb3RvdHlwZS5pc0luUmVzdWx0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSW5SZXN1bHR9LGUucHJvdG90eXBlLnNldE5leHQ9ZnVuY3Rpb24odCl7dGhpcy5fbmV4dD10fSxlLnByb3RvdHlwZS5pc1Zpc2l0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWaXNpdGVkfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLmRlcHRoRmFjdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1wbC5FWFRFUklPUiYmZT09PXBsLklOVEVSSU9SPzE6dD09PXBsLklOVEVSSU9SJiZlPT09cGwuRVhURVJJT1I/LTE6MH0sZX0oVmgpLFloPWZ1bmN0aW9uKCl7fTtZaC5wcm90b3R5cGUuY3JlYXRlTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEJoKHQsbnVsbCl9LFloLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxZaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWWh9O3ZhciBIaD1mdW5jdGlvbigpe2lmKHRoaXMuX2VkZ2VzPW5ldyBsYyx0aGlzLl9ub2Rlcz1udWxsLHRoaXMuX2VkZ2VFbmRMaXN0PW5ldyBsYywwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLl9ub2Rlcz1uZXcgemgobmV3IFloKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbm9kZXM9bmV3IHpoKHQpfX07SGgucHJvdG90eXBlLnByaW50RWRnZXM9ZnVuY3Rpb24odCl7dC5wcmludGxuKCJFZGdlczoiKTtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2VzLnNpemUoKTtlKyspe3QucHJpbnRsbigiZWRnZSAiK2UrIjoiKTt2YXIgbj10aGlzLl9lZGdlcy5nZXQoZSk7bi5wcmludCh0KSxuLmVpTGlzdC5wcmludCh0KX19LEhoLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ub2Rlcy5maW5kKHQpfSxIaC5wcm90b3R5cGUuYWRkTm9kZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQmgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fbm9kZXMuYWRkTm9kZSh0KX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX25vZGVzLmFkZE5vZGUoZSl9fSxIaC5wcm90b3R5cGUuZ2V0Tm9kZUl0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzLml0ZXJhdG9yKCl9LEhoLnByb3RvdHlwZS5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ub2Rlcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcygpfX0sSGgucHJvdG90eXBlLmRlYnVnUHJpbnRsbj1mdW5jdGlvbih0KXtQbC5vdXQucHJpbnRsbih0KX0sSGgucHJvdG90eXBlLmlzQm91bmRhcnlOb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZXMuZmluZChlKTtpZihudWxsPT09bilyZXR1cm4hMTt2YXIgcj1uLmdldExhYmVsKCk7cmV0dXJuIG51bGwhPT1yJiZyLmdldExvY2F0aW9uKHQpPT09cGwuQk9VTkRBUll9LEhoLnByb3RvdHlwZS5saW5rQWxsRGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ub2Rlcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5saW5rQWxsRGlyZWN0ZWRFZGdlcygpfX0sSGgucHJvdG90eXBlLm1hdGNoSW5TYW1lRGlyZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiEhdC5lcXVhbHMobikmJihYbC5jb21wdXRlT3JpZW50YXRpb24odCxlLHIpPT09WGwuQ09MTElORUFSJiZqaC5xdWFkcmFudCh0LGUpPT09amgucXVhZHJhbnQobixyKSl9LEhoLnByb3RvdHlwZS5nZXRFZGdlRW5kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlRW5kTGlzdH0sSGgucHJvdG90eXBlLmRlYnVnUHJpbnQ9ZnVuY3Rpb24odCl7UGwub3V0LnByaW50KHQpfSxIaC5wcm90b3R5cGUuZ2V0RWRnZUl0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzLml0ZXJhdG9yKCl9LEhoLnByb3RvdHlwZS5maW5kRWRnZUluU2FtZURpcmVjdGlvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLHI9MDtyPHRoaXMuX2VkZ2VzLnNpemUoKTtyKyspe3ZhciBpPW4uX2VkZ2VzLmdldChyKSxvPWkuZ2V0Q29vcmRpbmF0ZXMoKTtpZihuLm1hdGNoSW5TYW1lRGlyZWN0aW9uKHQsZSxvWzBdLG9bMV0pKXJldHVybiBpO2lmKG4ubWF0Y2hJblNhbWVEaXJlY3Rpb24odCxlLG9bby5sZW5ndGgtMV0sb1tvLmxlbmd0aC0yXSkpcmV0dXJuIGl9cmV0dXJuIG51bGx9LEhoLnByb3RvdHlwZS5pbnNlcnRFZGdlPWZ1bmN0aW9uKHQpe3RoaXMuX2VkZ2VzLmFkZCh0KX0sSGgucHJvdG90eXBlLmZpbmRFZGdlRW5kPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO2lmKG4uZ2V0RWRnZSgpPT09dClyZXR1cm4gbn1yZXR1cm4gbnVsbH0sSGgucHJvdG90eXBlLmFkZEVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ZS5fZWRnZXMuYWRkKHIpO3ZhciBpPW5ldyBYaChyLCEwKSxvPW5ldyBYaChyLCExKTtpLnNldFN5bShvKSxvLnNldFN5bShpKSxlLmFkZChpKSxlLmFkZChvKX19LEhoLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5fbm9kZXMuYWRkKHQpLHRoaXMuX2VkZ2VFbmRMaXN0LmFkZCh0KX0sSGgucHJvdG90eXBlLmdldE5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzLnZhbHVlcygpfSxIaC5wcm90b3R5cGUuZmluZEVkZ2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHRoaXMuX2VkZ2VzLnNpemUoKTtuKyspe3ZhciByPXRoaXMuX2VkZ2VzLmdldChuKSxpPXIuZ2V0Q29vcmRpbmF0ZXMoKTtpZih0LmVxdWFscyhpWzBdKSYmZS5lcXVhbHMoaVsxXSkpcmV0dXJuIHJ9cmV0dXJuIG51bGx9LEhoLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxIaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSGh9LEhoLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5nZXRFZGdlcygpLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzKCl9fTt2YXIgV2g9ZnVuY3Rpb24oKXt0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9bnVsbCx0aGlzLl9zaGVsbExpc3Q9bmV3IGxjO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9dH07V2gucHJvdG90eXBlLnNvcnRTaGVsbHNBbmRIb2xlcz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXQuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2kuaXNIb2xlKCk/bi5hZGQoaSk6ZS5hZGQoaSl9fSxXaC5wcm90b3R5cGUuY29tcHV0ZVBvbHlnb25zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgbGMsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKS50b1BvbHlnb24odGhpcy5fZ2VvbWV0cnlGYWN0b3J5KTtlLmFkZChyKX1yZXR1cm4gZX0sV2gucHJvdG90eXBlLnBsYWNlRnJlZUhvbGVzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2lmKG51bGw9PT1yLmdldFNoZWxsKCkpe3ZhciBpPXRoaXMuZmluZEVkZ2VSaW5nQ29udGFpbmluZyhyLHQpO2lmKG51bGw9PT1pKXRocm93IG5ldyBPaCgidW5hYmxlIHRvIGFzc2lnbiBob2xlIHRvIGEgc2hlbGwiLHIuZ2V0Q29vcmRpbmF0ZSgwKSk7ci5zZXRTaGVsbChpKX19fSxXaC5wcm90b3R5cGUuYnVpbGRNaW5pbWFsRWRnZVJpbmdzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bmV3IGxjLGk9dC5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCk7aWYoby5nZXRNYXhOb2RlRGVncmVlKCk+Mil7by5saW5rRGlyZWN0ZWRFZGdlc0Zvck1pbmltYWxFZGdlUmluZ3MoKTt2YXIgcz1vLmJ1aWxkTWluaW1hbFJpbmdzKCksYT10aGlzLmZpbmRTaGVsbChzKTtudWxsIT09YT8odGhpcy5wbGFjZVBvbHlnb25Ib2xlcyhhLHMpLGUuYWRkKGEpKTpuLmFkZEFsbChzKX1lbHNlIHIuYWRkKG8pfXJldHVybiByfSxXaC5wcm90b3R5cGUuY29udGFpbnNQb2ludD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fc2hlbGxMaXN0Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtpZihlLm5leHQoKS5jb250YWluc1BvaW50KHQpKXJldHVybiEwfXJldHVybiExfSxXaC5wcm90b3R5cGUuYnVpbGRNYXhpbWFsRWRnZVJpbmdzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgbGMsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihyLmlzSW5SZXN1bHQoKSYmci5nZXRMYWJlbCgpLmlzQXJlYSgpJiZudWxsPT09ci5nZXRFZGdlUmluZygpKXt2YXIgaT1uZXcgR2gocix0aGlzLl9nZW9tZXRyeUZhY3RvcnkpO2UuYWRkKGkpLGkuc2V0SW5SZXN1bHQoKX19cmV0dXJuIGV9LFdoLnByb3RvdHlwZS5wbGFjZVBvbHlnb25Ib2xlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtyLmlzSG9sZSgpJiZyLnNldFNoZWxsKHQpfX0sV2gucHJvdG90eXBlLmdldFBvbHlnb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZVBvbHlnb25zKHRoaXMuX3NoZWxsTGlzdCl9LFdoLnByb3RvdHlwZS5maW5kRWRnZVJpbmdDb250YWluaW5nPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2V0TGluZWFyUmluZygpLHI9bi5nZXRFbnZlbG9wZUludGVybmFsKCksaT1uLmdldENvb3JkaW5hdGVOKDApLG89bnVsbCxzPW51bGwsYT1lLml0ZXJhdG9yKCk7YS5oYXNOZXh0KCk7KXt2YXIgdT1hLm5leHQoKSxsPXUuZ2V0TGluZWFyUmluZygpLGM9bC5nZXRFbnZlbG9wZUludGVybmFsKCk7bnVsbCE9PW8mJihzPW8uZ2V0TGluZWFyUmluZygpLmdldEVudmVsb3BlSW50ZXJuYWwoKSk7dmFyIGg9ITE7Yy5jb250YWlucyhyKSYmWGwuaXNQb2ludEluUmluZyhpLGwuZ2V0Q29vcmRpbmF0ZXMoKSkmJihoPSEwKSxoJiYobnVsbD09PW98fHMuY29udGFpbnMoYykpJiYobz11KX1yZXR1cm4gb30sV2gucHJvdG90eXBlLmZpbmRTaGVsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPW51bGwscj10Lml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtpLmlzSG9sZSgpfHwobj1pLGUrKyl9cmV0dXJuIHFsLmlzVHJ1ZShlPD0xLCJmb3VuZCB0d28gc2hlbGxzIGluIE1pbmltYWxFZGdlUmluZyBsaXN0Iiksbn0sV2gucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5hZGQodC5nZXRFZGdlRW5kcygpLHQuZ2V0Tm9kZXMoKSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO0hoLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzKG4pO3ZhciByPXRoaXMuYnVpbGRNYXhpbWFsRWRnZVJpbmdzKGUpLGk9bmV3IGxjLG89dGhpcy5idWlsZE1pbmltYWxFZGdlUmluZ3Mocix0aGlzLl9zaGVsbExpc3QsaSk7dGhpcy5zb3J0U2hlbGxzQW5kSG9sZXMobyx0aGlzLl9zaGVsbExpc3QsaSksdGhpcy5wbGFjZUZyZWVIb2xlcyh0aGlzLl9zaGVsbExpc3QsaSl9fSxXaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sV2gucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFdofTt2YXIgSmg9ZnVuY3Rpb24oKXt9O0poLnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oKXt9LEpoLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxKaC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSmh9O3ZhciBaaD1mdW5jdGlvbigpe3RoaXMuX2JvdW5kcz1udWxsLHRoaXMuX2l0ZW09bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fYm91bmRzPXQsdGhpcy5faXRlbT1lfTtaaC5wcm90b3R5cGUuZ2V0SXRlbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pdGVtfSxaaC5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JvdW5kc30sWmgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0poLGFsXX0sWmgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFpofTt2YXIgS2g9ZnVuY3Rpb24oKXt0aGlzLl9zaXplPW51bGwsdGhpcy5faXRlbXM9bnVsbCx0aGlzLl9zaXplPTAsdGhpcy5faXRlbXM9bmV3IGxjLHRoaXMuX2l0ZW1zLmFkZChudWxsKX07S2gucHJvdG90eXBlLnBvbGw9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt2YXIgdD10aGlzLl9pdGVtcy5nZXQoMSk7cmV0dXJuIHRoaXMuX2l0ZW1zLnNldCgxLHRoaXMuX2l0ZW1zLmdldCh0aGlzLl9zaXplKSksdGhpcy5fc2l6ZS09MSx0aGlzLnJlb3JkZXIoMSksdH0sS2gucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZX0sS2gucHJvdG90eXBlLnJlb3JkZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj1udWxsLHI9dGhpcy5faXRlbXMuZ2V0KHQpOzIqdDw9dGhpcy5fc2l6ZSYmKChuPTIqdCkhPT1lLl9zaXplJiZlLl9pdGVtcy5nZXQobisxKS5jb21wYXJlVG8oZS5faXRlbXMuZ2V0KG4pKTwwJiZuKyssZS5faXRlbXMuZ2V0KG4pLmNvbXBhcmVUbyhyKTwwKTt0PW4pZS5faXRlbXMuc2V0KHQsZS5faXRlbXMuZ2V0KG4pKTt0aGlzLl9pdGVtcy5zZXQodCxyKX0sS2gucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fc2l6ZT0wLHRoaXMuX2l0ZW1zLmNsZWFyKCl9LEtoLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9zaXplfSxLaC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuX2l0ZW1zLmFkZChudWxsKSx0aGlzLl9zaXplKz0xO3ZhciBlPXRoaXMuX3NpemU7Zm9yKHRoaXMuX2l0ZW1zLnNldCgwLHQpO3QuY29tcGFyZVRvKHRoaXMuX2l0ZW1zLmdldChNYXRoLnRydW5jKGUvMikpKTwwO2UvPTIpdGhpcy5faXRlbXMuc2V0KGUsdGhpcy5faXRlbXMuZ2V0KE1hdGgudHJ1bmMoZS8yKSkpO3RoaXMuX2l0ZW1zLnNldChlLHQpfSxLaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sS2gucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEtofTt2YXIgUWg9ZnVuY3Rpb24oKXt9O1FoLnByb3RvdHlwZS52aXNpdEl0ZW09ZnVuY3Rpb24odCl7fSxRaC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUWgucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFFofTt2YXIgJGg9ZnVuY3Rpb24oKXt9OyRoLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlKXt9LCRoLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCxlKXt9LCRoLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbigpe30sJGgucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LCRoLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiAkaH07dmFyIHRwPWZ1bmN0aW9uKCl7aWYodGhpcy5fY2hpbGRCb3VuZGFibGVzPW5ldyBsYyx0aGlzLl9ib3VuZHM9bnVsbCx0aGlzLl9sZXZlbD1udWxsLDA9PT1hcmd1bWVudHMubGVuZ3RoKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbGV2ZWw9dH19LGVwPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTt0cC5wcm90b3R5cGUuZ2V0TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGV2ZWx9LHRwLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQm91bmRhYmxlcy5zaXplKCl9LHRwLnByb3RvdHlwZS5nZXRDaGlsZEJvdW5kYWJsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hpbGRCb3VuZGFibGVzfSx0cC5wcm90b3R5cGUuYWRkQ2hpbGRCb3VuZGFibGU9ZnVuY3Rpb24odCl7cWwuaXNUcnVlKG51bGw9PT10aGlzLl9ib3VuZHMpLHRoaXMuX2NoaWxkQm91bmRhYmxlcy5hZGQodCl9LHRwLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQm91bmRhYmxlcy5pc0VtcHR5KCl9LHRwLnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuX2JvdW5kcyYmKHRoaXMuX2JvdW5kcz10aGlzLmNvbXB1dGVCb3VuZHMoKSksdGhpcy5fYm91bmRzfSx0cC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bSmgsYWxdfSx0cC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdHB9LGVwLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NWExZTU1ZWM0MTM2OTgwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXModHAsZXApO3ZhciBucD1mdW5jdGlvbigpe307bnAucmV2ZXJzZU9yZGVyPWZ1bmN0aW9uKCl7cmV0dXJue2NvbXBhcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5jb21wYXJlVG8odCl9fX0sbnAubWluPWZ1bmN0aW9uKHQpe3JldHVybiBucC5zb3J0KHQpLHQuZ2V0KDApfSxucC5zb3J0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC50b0FycmF5KCk7ZT9SYy5zb3J0KG4sZSk6UmMuc29ydChuKTtmb3IodmFyIHI9dC5pdGVyYXRvcigpLGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspci5uZXh0KCksci5zZXQobltpXSl9LG5wLnNpbmdsZXRvbkxpc3Q9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGxjO3JldHVybiBlLmFkZCh0KSxlfTt2YXIgcnA9ZnVuY3Rpb24oKXt0aGlzLl9ib3VuZGFibGUxPW51bGwsdGhpcy5fYm91bmRhYmxlMj1udWxsLHRoaXMuX2Rpc3RhbmNlPW51bGwsdGhpcy5faXRlbURpc3RhbmNlPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX2JvdW5kYWJsZTE9dCx0aGlzLl9ib3VuZGFibGUyPWUsdGhpcy5faXRlbURpc3RhbmNlPW4sdGhpcy5fZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSgpfTtycC5wcm90b3R5cGUuZXhwYW5kVG9RdWV1ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXJwLmlzQ29tcG9zaXRlKHRoaXMuX2JvdW5kYWJsZTEpLHI9cnAuaXNDb21wb3NpdGUodGhpcy5fYm91bmRhYmxlMik7aWYobiYmcilyZXR1cm4gcnAuYXJlYSh0aGlzLl9ib3VuZGFibGUxKT5ycC5hcmVhKHRoaXMuX2JvdW5kYWJsZTIpPyh0aGlzLmV4cGFuZCh0aGlzLl9ib3VuZGFibGUxLHRoaXMuX2JvdW5kYWJsZTIsdCxlKSxudWxsKToodGhpcy5leHBhbmQodGhpcy5fYm91bmRhYmxlMix0aGlzLl9ib3VuZGFibGUxLHQsZSksbnVsbCk7aWYobilyZXR1cm4gdGhpcy5leHBhbmQodGhpcy5fYm91bmRhYmxlMSx0aGlzLl9ib3VuZGFibGUyLHQsZSksbnVsbDtpZihyKXJldHVybiB0aGlzLmV4cGFuZCh0aGlzLl9ib3VuZGFibGUyLHRoaXMuX2JvdW5kYWJsZTEsdCxlKSxudWxsO3Rocm93IG5ldyBlbCgibmVpdGhlciBib3VuZGFibGUgaXMgY29tcG9zaXRlIil9LHJwLnByb3RvdHlwZS5pc0xlYXZlcz1mdW5jdGlvbigpe3JldHVybiEocnAuaXNDb21wb3NpdGUodGhpcy5fYm91bmRhYmxlMSl8fHJwLmlzQ29tcG9zaXRlKHRoaXMuX2JvdW5kYWJsZTIpKX0scnAucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLl9kaXN0YW5jZTxlLl9kaXN0YW5jZT8tMTp0aGlzLl9kaXN0YW5jZT5lLl9kaXN0YW5jZT8xOjB9LHJwLnByb3RvdHlwZS5leHBhbmQ9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPXQuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpLHM9bmV3IHJwKG8sZSx0aGlzLl9pdGVtRGlzdGFuY2UpO3MuZ2V0RGlzdGFuY2UoKTxyJiZuLmFkZChzKX19LHJwLnByb3RvdHlwZS5nZXRCb3VuZGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10P3RoaXMuX2JvdW5kYWJsZTE6dGhpcy5fYm91bmRhYmxlMn0scnAucHJvdG90eXBlLmdldERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlfSxycC5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0xlYXZlcygpP3RoaXMuX2l0ZW1EaXN0YW5jZS5kaXN0YW5jZSh0aGlzLl9ib3VuZGFibGUxLHRoaXMuX2JvdW5kYWJsZTIpOnRoaXMuX2JvdW5kYWJsZTEuZ2V0Qm91bmRzKCkuZGlzdGFuY2UodGhpcy5fYm91bmRhYmxlMi5nZXRCb3VuZHMoKSl9LHJwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpbF19LHJwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBycH0scnAuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRCb3VuZHMoKS5nZXRBcmVhKCl9LHJwLmlzQ29tcG9zaXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdHB9O3ZhciBpcD1mdW5jdGlvbiB0KCl7aWYodGhpcy5fcm9vdD1udWxsLHRoaXMuX2J1aWx0PSExLHRoaXMuX2l0ZW1Cb3VuZGFibGVzPW5ldyBsYyx0aGlzLl9ub2RlQ2FwYWNpdHk9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9dC5ERUZBVUxUX05PREVfQ0FQQUNJVFk7dGhpcy5fbm9kZUNhcGFjaXR5PWV9ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO3FsLmlzVHJ1ZShuPjEsIk5vZGUgY2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMSIpLHRoaXMuX25vZGVDYXBhY2l0eT1ufX0sb3A9e0ludGVyc2VjdHNPcDp7Y29uZmlndXJhYmxlOiEwfSxzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfTk9ERV9DQVBBQ0lUWTp7Y29uZmlndXJhYmxlOiEwfX07aXAucHJvdG90eXBlLmdldE5vZGVDYXBhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlQ2FwYWNpdHl9LGlwLnByb3RvdHlwZS5sYXN0Tm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQodC5zaXplKCktMSl9LGlwLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5pc0VtcHR5KCk/MDoodGhpcy5idWlsZCgpLHRoaXMuc2l6ZSh0aGlzLl9yb290KSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj0wLHI9ZS5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7aSBpbnN0YW5jZW9mIHRwP24rPXQuc2l6ZShpKTppIGluc3RhbmNlb2YgWmgmJihuKz0xKX1yZXR1cm4gbn19LGlwLnByb3RvdHlwZS5yZW1vdmVJdGVtPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW51bGwscj10LmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtpIGluc3RhbmNlb2YgWmgmJmkuZ2V0SXRlbSgpPT09ZSYmKG49aSl9cmV0dXJuIG51bGwhPT1uJiYodC5nZXRDaGlsZEJvdW5kYWJsZXMoKS5yZW1vdmUobiksITApfSxpcC5wcm90b3R5cGUuaXRlbXNUcmVlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7dGhpcy5idWlsZCgpO3ZhciBlPXRoaXMuaXRlbXNUcmVlKHRoaXMuX3Jvb3QpO3JldHVybiBudWxsPT09ZT9uZXcgbGM6ZX1pZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBuPWFyZ3VtZW50c1swXSxyPW5ldyBsYyxpPW4uZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpO2lmKG8gaW5zdGFuY2VvZiB0cCl7dmFyIHM9dC5pdGVtc1RyZWUobyk7bnVsbCE9PXMmJnIuYWRkKHMpfWVsc2UgbyBpbnN0YW5jZW9mIFpoP3IuYWRkKG8uZ2V0SXRlbSgpKTpxbC5zaG91bGROZXZlclJlYWNoSGVyZSgpfXJldHVybiByLnNpemUoKTw9MD9udWxsOnJ9fSxpcC5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7cWwuaXNUcnVlKCF0aGlzLl9idWlsdCwiQ2Fubm90IGluc2VydCBpdGVtcyBpbnRvIGFuIFNUUiBwYWNrZWQgUi10cmVlIGFmdGVyIGl0IGhhcyBiZWVuIGJ1aWx0LiIpLHRoaXMuX2l0ZW1Cb3VuZGFibGVzLmFkZChuZXcgWmgodCxlKSl9LGlwLnByb3RvdHlwZS5ib3VuZGFibGVzQXRMZXZlbD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPW5ldyBsYztyZXR1cm4gdGhpcy5ib3VuZGFibGVzQXRMZXZlbChlLHRoaXMuX3Jvb3Qsbiksbn1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO2lmKHFsLmlzVHJ1ZShyPi0yKSxpLmdldExldmVsKCk9PT1yKXJldHVybiBvLmFkZChpKSxudWxsO2Zvcih2YXIgcz1pLmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7cy5oYXNOZXh0KCk7KXt2YXIgYT1zLm5leHQoKTthIGluc3RhbmNlb2YgdHA/dC5ib3VuZGFibGVzQXRMZXZlbChyLGEsbyk6KHFsLmlzVHJ1ZShhIGluc3RhbmNlb2YgWmgpLC0xPT09ciYmby5hZGQoYSkpfXJldHVybiBudWxsfX0saXAucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuYnVpbGQoKTt2YXIgbj1uZXcgbGM7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfHx0aGlzLmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHModGhpcy5fcm9vdC5nZXRCb3VuZHMoKSxlKSYmdGhpcy5xdWVyeShlLHRoaXMuX3Jvb3Qsbiksbn1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO2lmKHRoaXMuYnVpbGQoKSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt0aGlzLmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHModGhpcy5fcm9vdC5nZXRCb3VuZHMoKSxyKSYmdGhpcy5xdWVyeShyLHRoaXMuX3Jvb3QsaSl9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihnbChhcmd1bWVudHNbMl0sUWgpJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0cClmb3IodmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGE9YXJndW1lbnRzWzJdLHU9cy5nZXRDaGlsZEJvdW5kYWJsZXMoKSxsPTA7bDx1LnNpemUoKTtsKyspe3ZhciBjPXUuZ2V0KGwpO3QuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyhjLmdldEJvdW5kcygpLG8pJiYoYyBpbnN0YW5jZW9mIHRwP3QucXVlcnkobyxjLGEpOmMgaW5zdGFuY2VvZiBaaD9hLnZpc2l0SXRlbShjLmdldEl0ZW0oKSk6cWwuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoKSl9ZWxzZSBpZihnbChhcmd1bWVudHNbMl0sYWMpJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0cClmb3IodmFyIGg9YXJndW1lbnRzWzBdLHA9YXJndW1lbnRzWzFdLGY9YXJndW1lbnRzWzJdLGc9cC5nZXRDaGlsZEJvdW5kYWJsZXMoKSxkPTA7ZDxnLnNpemUoKTtkKyspe3ZhciB5PWcuZ2V0KGQpO3QuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyh5LmdldEJvdW5kcygpLGgpJiYoeSBpbnN0YW5jZW9mIHRwP3QucXVlcnkoaCx5LGYpOnkgaW5zdGFuY2VvZiBaaD9mLmFkZCh5LmdldEl0ZW0oKSk6cWwuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoKSl9fSxpcC5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9idWlsdClyZXR1cm4gbnVsbDt0aGlzLl9yb290PXRoaXMuX2l0ZW1Cb3VuZGFibGVzLmlzRW1wdHkoKT90aGlzLmNyZWF0ZU5vZGUoMCk6dGhpcy5jcmVhdGVIaWdoZXJMZXZlbHModGhpcy5faXRlbUJvdW5kYWJsZXMsLTEpLHRoaXMuX2l0ZW1Cb3VuZGFibGVzPW51bGwsdGhpcy5fYnVpbHQ9ITB9LGlwLnByb3RvdHlwZS5nZXRSb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnVpbGQoKSx0aGlzLl9yb290fSxpcC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmJ1aWxkKCksISF0aGlzLmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHModGhpcy5fcm9vdC5nZXRCb3VuZHMoKSxlKSYmdGhpcy5yZW1vdmUoZSx0aGlzLl9yb290LG4pfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl0scz10aGlzLnJlbW92ZUl0ZW0oaSxvKTtpZihzKXJldHVybiEwO2Zvcih2YXIgYT1udWxsLHU9aS5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO3UuaGFzTmV4dCgpOyl7dmFyIGw9dS5uZXh0KCk7aWYodC5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKGwuZ2V0Qm91bmRzKCkscikmJihsIGluc3RhbmNlb2YgdHAmJihzPXQucmVtb3ZlKHIsbCxvKSkpKXthPWw7YnJlYWt9fXJldHVybiBudWxsIT09YSYmYS5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pc0VtcHR5KCkmJmkuZ2V0Q2hpbGRCb3VuZGFibGVzKCkucmVtb3ZlKGEpLHN9fSxpcC5wcm90b3R5cGUuY3JlYXRlSGlnaGVyTGV2ZWxzPWZ1bmN0aW9uKHQsZSl7cWwuaXNUcnVlKCF0LmlzRW1wdHkoKSk7dmFyIG49dGhpcy5jcmVhdGVQYXJlbnRCb3VuZGFibGVzKHQsZSsxKTtyZXR1cm4gMT09PW4uc2l6ZSgpP24uZ2V0KDApOnRoaXMuY3JlYXRlSGlnaGVyTGV2ZWxzKG4sZSsxKX0saXAucHJvdG90eXBlLmRlcHRoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5pc0VtcHR5KCk/MDoodGhpcy5idWlsZCgpLHRoaXMuZGVwdGgodGhpcy5fcm9vdCkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MCxyPWUuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2lmKGkgaW5zdGFuY2VvZiB0cCl7dmFyIG89dC5kZXB0aChpKTtvPm4mJihuPW8pfX1yZXR1cm4gbisxfX0saXAucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3FsLmlzVHJ1ZSghdC5pc0VtcHR5KCkpO3ZhciByPW5ldyBsYztyLmFkZCh0aGlzLmNyZWF0ZU5vZGUoZSkpO3ZhciBpPW5ldyBsYyh0KTtucC5zb3J0KGksdGhpcy5nZXRDb21wYXJhdG9yKCkpO2Zvcih2YXIgbz1pLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKTtuLmxhc3ROb2RlKHIpLmdldENoaWxkQm91bmRhYmxlcygpLnNpemUoKT09PW4uZ2V0Tm9kZUNhcGFjaXR5KCkmJnIuYWRkKG4uY3JlYXRlTm9kZShlKSksbi5sYXN0Tm9kZShyKS5hZGRDaGlsZEJvdW5kYWJsZShzKX1yZXR1cm4gcn0saXAucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnVpbHQ/dGhpcy5fcm9vdC5pc0VtcHR5KCk6dGhpcy5faXRlbUJvdW5kYWJsZXMuaXNFbXB0eSgpfSxpcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bYWxdfSxpcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaXB9LGlwLmNvbXBhcmVEb3VibGVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+ZT8xOnQ8ZT8tMTowfSxvcC5JbnRlcnNlY3RzT3AuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHNwfSxvcC5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDM1ZWY2NGM4MmQ0YzU0MDB9LG9wLkRFRkFVTFRfTk9ERV9DQVBBQ0lUWS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGlwLG9wKTt2YXIgc3A9ZnVuY3Rpb24oKXt9LGFwPWZ1bmN0aW9uKCl7fTthcC5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt9LGFwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxhcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYXB9O3ZhciB1cD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe249bnx8ZS5ERUZBVUxUX05PREVfQ0FQQUNJVFksdC5jYWxsKHRoaXMsbil9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e1NUUnRyZWVOb2RlOntjb25maWd1cmFibGU6ITB9LHNlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0seENvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0seUNvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0saW50ZXJzZWN0c09wOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfTk9ERV9DQVBBQ0lUWTp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZXM9ZnVuY3Rpb24odCxlKXtxbC5pc1RydWUodC5sZW5ndGg+MCk7Zm9yKHZhciBuPW5ldyBsYyxyPTA7cjx0Lmxlbmd0aDtyKyspbi5hZGRBbGwodGhpcy5jcmVhdGVQYXJlbnRCb3VuZGFibGVzRnJvbVZlcnRpY2FsU2xpY2UodFtyXSxlKSk7cmV0dXJuIG59LGUucHJvdG90eXBlLmNyZWF0ZU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBscCh0KX0sZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90LnByb3RvdHlwZS5zaXplLmNhbGwodGhpcyk6dC5wcm90b3R5cGUuc2l6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5pbnNlcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZihlLmlzTnVsbCgpKXJldHVybiBudWxsO3QucHJvdG90eXBlLmluc2VydC5jYWxsKHRoaXMsZSxuKX0sZS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0c09wPWZ1bmN0aW9uKCl7cmV0dXJuIGUuaW50ZXJzZWN0c09wfSxlLnByb3RvdHlwZS52ZXJ0aWNhbFNsaWNlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1NYXRoLnRydW5jKE1hdGguY2VpbCh0LnNpemUoKS9lKSkscj1uZXcgQXJyYXkoZSkuZmlsbChudWxsKSxpPXQuaXRlcmF0b3IoKSxvPTA7bzxlO28rKyl7cltvXT1uZXcgbGM7Zm9yKHZhciBzPTA7aS5oYXNOZXh0KCkmJnM8bjspe3ZhciBhPWkubmV4dCgpO3Jbb10uYWRkKGEpLHMrK319cmV0dXJuIHJ9LGUucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdC5wcm90b3R5cGUucXVlcnkuY2FsbCh0aGlzLGUpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dC5wcm90b3R5cGUucXVlcnkuY2FsbCh0aGlzLG4scil9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihnbChhcmd1bWVudHNbMl0sUWgpJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0cCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdO3QucHJvdG90eXBlLnF1ZXJ5LmNhbGwodGhpcyxpLG8scyl9ZWxzZSBpZihnbChhcmd1bWVudHNbMl0sYWMpJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0cCl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdO3QucHJvdG90eXBlLnF1ZXJ5LmNhbGwodGhpcyxhLHUsbCl9fSxlLnByb3RvdHlwZS5nZXRDb21wYXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIGUueUNvbXBhcmF0b3J9LGUucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZT1mdW5jdGlvbihlLG4pe3JldHVybiB0LnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzLmNhbGwodGhpcyxlLG4pfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiB0LnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQucHJvdG90eXBlLnJlbW92ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmRlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3QucHJvdG90eXBlLmRlcHRoLmNhbGwodGhpcyk6dC5wcm90b3R5cGUuZGVwdGguYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzPWZ1bmN0aW9uKHQsbil7cWwuaXNUcnVlKCF0LmlzRW1wdHkoKSk7dmFyIHI9TWF0aC50cnVuYyhNYXRoLmNlaWwodC5zaXplKCkvdGhpcy5nZXROb2RlQ2FwYWNpdHkoKSkpLGk9bmV3IGxjKHQpO25wLnNvcnQoaSxlLnhDb21wYXJhdG9yKTt2YXIgbz10aGlzLnZlcnRpY2FsU2xpY2VzKGksTWF0aC50cnVuYyhNYXRoLmNlaWwoTWF0aC5zcXJ0KHIpKSkpO3JldHVybiB0aGlzLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZXMobyxuKX0sZS5wcm90b3R5cGUubmVhcmVzdE5laWdoYm91cj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihnbChhcmd1bWVudHNbMF0sYXApKXt2YXIgdD1hcmd1bWVudHNbMF0sbj1uZXcgcnAodGhpcy5nZXRSb290KCksdGhpcy5nZXRSb290KCksdCk7cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihuKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHJwKXt2YXIgcj1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihyLG5sLlBPU0lUSVZFX0lORklOSVRZKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBlJiZnbChhcmd1bWVudHNbMV0sYXApKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1uZXcgcnAodGhpcy5nZXRSb290KCksaS5nZXRSb290KCksbyk7cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihzKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHJwJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGw9dSxjPW51bGwsaD1uZXcgS2g7Zm9yKGguYWRkKGEpOyFoLmlzRW1wdHkoKSYmbD4wOyl7dmFyIHA9aC5wb2xsKCksZj1wLmdldERpc3RhbmNlKCk7aWYoZj49bClicmVhaztwLmlzTGVhdmVzKCk/KGw9ZixjPXApOnAuZXhwYW5kVG9RdWV1ZShoLGwpfXJldHVybltjLmdldEJvdW5kYWJsZSgwKS5nZXRJdGVtKCksYy5nZXRCb3VuZGFibGUoMSkuZ2V0SXRlbSgpXX19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGc9YXJndW1lbnRzWzBdLGQ9YXJndW1lbnRzWzFdLHk9YXJndW1lbnRzWzJdLHY9bmV3IFpoKGcsZCksXz1uZXcgcnAodGhpcy5nZXRSb290KCksdix5KTtyZXR1cm4gdGhpcy5uZWFyZXN0TmVpZ2hib3VyKF8pWzBdfX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bJGgsYWxdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLmNlbnRyZVg9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYXZnKHQuZ2V0TWluWCgpLHQuZ2V0TWF4WCgpKX0sZS5hdmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4odCtlKS8yfSxlLmNlbnRyZVk9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYXZnKHQuZ2V0TWluWSgpLHQuZ2V0TWF4WSgpKX0sbi5TVFJ0cmVlTm9kZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbHB9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHgzOTkyMGY3ZDVmMjYxZTB9LG4ueENvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJue2ludGVyZmFjZXNfOmZ1bmN0aW9uKCl7cmV0dXJuW3NsXX0sY29tcGFyZTpmdW5jdGlvbihuLHIpe3JldHVybiB0LmNvbXBhcmVEb3VibGVzKGUuY2VudHJlWChuLmdldEJvdW5kcygpKSxlLmNlbnRyZVgoci5nZXRCb3VuZHMoKSkpfX19LG4ueUNvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJue2ludGVyZmFjZXNfOmZ1bmN0aW9uKCl7cmV0dXJuW3NsXX0sY29tcGFyZTpmdW5jdGlvbihuLHIpe3JldHVybiB0LmNvbXBhcmVEb3VibGVzKGUuY2VudHJlWShuLmdldEJvdW5kcygpKSxlLmNlbnRyZVkoci5nZXRCb3VuZHMoKSkpfX19LG4uaW50ZXJzZWN0c09wLmdldD1mdW5jdGlvbigpe3JldHVybntpbnRlcmZhY2VzXzpmdW5jdGlvbigpe3JldHVyblt0LkludGVyc2VjdHNPcF19LGludGVyc2VjdHM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5pbnRlcnNlY3RzKGUpfX19LG4uREVGQVVMVF9OT0RFX0NBUEFDSVRZLmdldD1mdW5jdGlvbigpe3JldHVybiAxMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShpcCksbHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXTt0LmNhbGwodGhpcyxlKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY29tcHV0ZUJvdW5kcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1udWxsLGU9dGhpcy5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7bnVsbD09PXQ/dD1uZXcgTGwobi5nZXRCb3VuZHMoKSk6dC5leHBhbmRUb0luY2x1ZGUobi5nZXRCb3VuZHMoKSl9cmV0dXJuIHR9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KHRwKSxjcD1mdW5jdGlvbigpe307Y3AucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGNwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBjcH0sY3AucmVsYXRpdmVTaWduPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTowfSxjcC5jb21wYXJlPWZ1bmN0aW9uKHQsZSxuKXtpZihlLmVxdWFsczJEKG4pKXJldHVybiAwO3ZhciByPWNwLnJlbGF0aXZlU2lnbihlLngsbi54KSxpPWNwLnJlbGF0aXZlU2lnbihlLnksbi55KTtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiBjcC5jb21wYXJlVmFsdWUocixpKTtjYXNlIDE6cmV0dXJuIGNwLmNvbXBhcmVWYWx1ZShpLHIpO2Nhc2UgMjpyZXR1cm4gY3AuY29tcGFyZVZhbHVlKGksLXIpO2Nhc2UgMzpyZXR1cm4gY3AuY29tcGFyZVZhbHVlKC1yLGkpO2Nhc2UgNDpyZXR1cm4gY3AuY29tcGFyZVZhbHVlKC1yLC1pKTtjYXNlIDU6cmV0dXJuIGNwLmNvbXBhcmVWYWx1ZSgtaSwtcik7Y2FzZSA2OnJldHVybiBjcC5jb21wYXJlVmFsdWUoLWkscik7Y2FzZSA3OnJldHVybiBjcC5jb21wYXJlVmFsdWUociwtaSl9cmV0dXJuIHFsLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJpbnZhbGlkIG9jdGFudCB2YWx1ZSIpLDB9LGNwLmNvbXBhcmVWYWx1ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0PDA/LTE6dD4wPzE6ZTwwPy0xOmU+MD8xOjB9O3ZhciBocD1mdW5jdGlvbigpe3RoaXMuX3NlZ1N0cmluZz1udWxsLHRoaXMuY29vcmQ9bnVsbCx0aGlzLnNlZ21lbnRJbmRleD1udWxsLHRoaXMuX3NlZ21lbnRPY3RhbnQ9bnVsbCx0aGlzLl9pc0ludGVyaW9yPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9YXJndW1lbnRzWzNdO3RoaXMuX3NlZ1N0cmluZz10LHRoaXMuY29vcmQ9bmV3IHVsKGUpLHRoaXMuc2VnbWVudEluZGV4PW4sdGhpcy5fc2VnbWVudE9jdGFudD1yLHRoaXMuX2lzSW50ZXJpb3I9IWUuZXF1YWxzMkQodC5nZXRDb29yZGluYXRlKG4pKX07aHAucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb29yZH0saHAucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnQodGhpcy5jb29yZCksdC5wcmludCgiIHNlZyAjID0gIit0aGlzLnNlZ21lbnRJbmRleCl9LGhwLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5zZWdtZW50SW5kZXg8ZS5zZWdtZW50SW5kZXg/LTE6dGhpcy5zZWdtZW50SW5kZXg+ZS5zZWdtZW50SW5kZXg/MTp0aGlzLmNvb3JkLmVxdWFsczJEKGUuY29vcmQpPzA6Y3AuY29tcGFyZSh0aGlzLl9zZWdtZW50T2N0YW50LHRoaXMuY29vcmQsZS5jb29yZCl9LGhwLnByb3RvdHlwZS5pc0VuZFBvaW50PWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5zZWdtZW50SW5kZXgmJiF0aGlzLl9pc0ludGVyaW9yfHx0aGlzLnNlZ21lbnRJbmRleD09PXR9LGhwLnByb3RvdHlwZS5pc0ludGVyaW9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSW50ZXJpb3J9LGhwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpbF19LGhwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBocH07dmFyIHBwPWZ1bmN0aW9uKCl7dGhpcy5fbm9kZU1hcD1uZXcgQ2MsdGhpcy5fZWRnZT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9lZGdlPXR9O3BwLnByb3RvdHlwZS5nZXRTcGxpdENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGhjO3RoaXMuYWRkRW5kcG9pbnRzKCk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKSxuPWUubmV4dCgpO2UuaGFzTmV4dCgpOyl7dmFyIHI9ZS5uZXh0KCk7dGhpcy5hZGRFZGdlQ29vcmRpbmF0ZXMobixyLHQpLG49cn1yZXR1cm4gdC50b0Nvb3JkaW5hdGVBcnJheSgpfSxwcC5wcm90b3R5cGUuYWRkQ29sbGFwc2VkTm9kZXM9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbGM7dGhpcy5maW5kQ29sbGFwc2VzRnJvbUluc2VydGVkTm9kZXModCksdGhpcy5maW5kQ29sbGFwc2VzRnJvbUV4aXN0aW5nVmVydGljZXModCk7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLmludFZhbHVlKCk7dGhpcy5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKG4pLG4pfX0scHAucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnRsbigiSW50ZXJzZWN0aW9uczoiKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkucHJpbnQodCl9fSxwcC5wcm90b3R5cGUuZmluZENvbGxhcHNlc0Zyb21FeGlzdGluZ1ZlcnRpY2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fZWRnZS5zaXplKCktMjtlKyspe3ZhciBuPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlKSxyPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlKzIpO24uZXF1YWxzMkQocikmJnQuYWRkKG5ldyBfbChlKzEpKX19LHBwLnByb3RvdHlwZS5hZGRFZGdlQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlLnNlZ21lbnRJbmRleCksaT1lLmlzSW50ZXJpb3IoKXx8IWUuY29vcmQuZXF1YWxzMkQocik7bi5hZGQobmV3IHVsKHQuY29vcmQpLCExKTtmb3IodmFyIG89dC5zZWdtZW50SW5kZXgrMTtvPD1lLnNlZ21lbnRJbmRleDtvKyspbi5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKG8pKTtpJiZuLmFkZChuZXcgdWwoZS5jb29yZCkpfSxwcC5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpfSxwcC5wcm90b3R5cGUuYWRkU3BsaXRFZGdlcz1mdW5jdGlvbih0KXt0aGlzLmFkZEVuZHBvaW50cygpLHRoaXMuYWRkQ29sbGFwc2VkTm9kZXMoKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpLG49ZS5uZXh0KCk7ZS5oYXNOZXh0KCk7KXt2YXIgcj1lLm5leHQoKSxpPXRoaXMuY3JlYXRlU3BsaXRFZGdlKG4scik7dC5hZGQoaSksbj1yfX0scHAucHJvdG90eXBlLmZpbmRDb2xsYXBzZUluZGV4PWZ1bmN0aW9uKHQsZSxuKXtpZighdC5jb29yZC5lcXVhbHMyRChlLmNvb3JkKSlyZXR1cm4hMTt2YXIgcj1lLnNlZ21lbnRJbmRleC10LnNlZ21lbnRJbmRleDtyZXR1cm4gZS5pc0ludGVyaW9yKCl8fHItLSwxPT09ciYmKG5bMF09dC5zZWdtZW50SW5kZXgrMSwhMCl9LHBwLnByb3RvdHlwZS5maW5kQ29sbGFwc2VzRnJvbUluc2VydGVkTm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSgxKS5maWxsKG51bGwpLG49dGhpcy5pdGVyYXRvcigpLHI9bi5uZXh0KCk7bi5oYXNOZXh0KCk7KXt2YXIgaT1uLm5leHQoKTt0aGlzLmZpbmRDb2xsYXBzZUluZGV4KHIsaSxlKSYmdC5hZGQobmV3IF9sKGVbMF0pKSxyPWl9fSxwcC5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlfSxwcC5wcm90b3R5cGUuYWRkRW5kcG9pbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWRnZS5zaXplKCktMTt0aGlzLmFkZCh0aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoMCksMCksdGhpcy5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKHQpLHQpfSxwcC5wcm90b3R5cGUuY3JlYXRlU3BsaXRFZGdlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5zZWdtZW50SW5kZXgtdC5zZWdtZW50SW5kZXgrMixyPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlLnNlZ21lbnRJbmRleCksaT1lLmlzSW50ZXJpb3IoKXx8IWUuY29vcmQuZXF1YWxzMkQocik7aXx8bi0tO3ZhciBvPW5ldyBBcnJheShuKS5maWxsKG51bGwpLHM9MDtvW3MrK109bmV3IHVsKHQuY29vcmQpO2Zvcih2YXIgYT10LnNlZ21lbnRJbmRleCsxO2E8PWUuc2VnbWVudEluZGV4O2ErKylvW3MrK109dGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKGEpO3JldHVybiBpJiYob1tzXT1uZXcgdWwoZS5jb29yZCkpLG5ldyB5cChvLHRoaXMuX2VkZ2UuZ2V0RGF0YSgpKX0scHAucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBocCh0aGlzLl9lZGdlLHQsZSx0aGlzLl9lZGdlLmdldFNlZ21lbnRPY3RhbnQoZSkpLHI9dGhpcy5fbm9kZU1hcC5nZXQobik7cmV0dXJuIG51bGwhPT1yPyhxbC5pc1RydWUoci5jb29yZC5lcXVhbHMyRCh0KSwiRm91bmQgZXF1YWwgbm9kZXMgd2l0aCBkaWZmZXJlbnQgY29vcmRpbmF0ZXMiKSxyKToodGhpcy5fbm9kZU1hcC5wdXQobixuKSxuKX0scHAucHJvdG90eXBlLmNoZWNrU3BsaXRFZGdlc0NvcnJlY3RuZXNzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZXMoKSxuPXQuZ2V0KDApLmdldENvb3JkaW5hdGUoMCk7aWYoIW4uZXF1YWxzMkQoZVswXSkpdGhyb3cgbmV3IGtsKCJiYWQgc3BsaXQgZWRnZSBzdGFydCBwb2ludCBhdCAiK24pO3ZhciByPXQuZ2V0KHQuc2l6ZSgpLTEpLmdldENvb3JkaW5hdGVzKCksaT1yW3IubGVuZ3RoLTFdO2lmKCFpLmVxdWFsczJEKGVbZS5sZW5ndGgtMV0pKXRocm93IG5ldyBrbCgiYmFkIHNwbGl0IGVkZ2UgZW5kIHBvaW50IGF0ICIraSl9LHBwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxwcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcHB9O3ZhciBmcD1mdW5jdGlvbigpe307ZnAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGZwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBmcH0sZnAub2N0YW50PWZ1bmN0aW9uKCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYoMD09PXQmJjA9PT1lKXRocm93IG5ldyBlbCgiQ2Fubm90IGNvbXB1dGUgdGhlIG9jdGFudCBmb3IgcG9pbnQgKCAiK3QrIiwgIitlKyIgKSIpO3ZhciBuPU1hdGguYWJzKHQpLHI9TWF0aC5hYnMoZSk7cmV0dXJuIHQ+PTA/ZT49MD9uPj1yPzA6MTpuPj1yPzc6NjplPj0wP24+PXI/MzoyOm4+PXI/NDo1fWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgdWwpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPW8ueC1pLngsYT1vLnktaS55O2lmKDA9PT1zJiYwPT09YSl0aHJvdyBuZXcgZWwoIkNhbm5vdCBjb21wdXRlIHRoZSBvY3RhbnQgZm9yIHR3byBpZGVudGljYWwgcG9pbnRzICIraSk7cmV0dXJuIGZwLm9jdGFudChzLGEpfX07dmFyIGdwPWZ1bmN0aW9uKCl7fTtncC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXt9LGdwLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7fSxncC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXt9LGdwLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe30sZ3AucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7fSxncC5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbigpe30sZ3AucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGdwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBncH07dmFyIGRwPWZ1bmN0aW9uKCl7fTtkcC5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSl7fSxkcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZ3BdfSxkcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZHB9O3ZhciB5cD1mdW5jdGlvbigpe3RoaXMuX25vZGVMaXN0PW5ldyBwcCh0aGlzKSx0aGlzLl9wdHM9bnVsbCx0aGlzLl9kYXRhPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX3B0cz10LHRoaXMuX2RhdGE9ZX07eXAucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0c30seXAucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRzLmxlbmd0aH0seXAucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B0c1t0XX0seXAucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0c1swXS5lcXVhbHModGhpcy5fcHRzW3RoaXMuX3B0cy5sZW5ndGgtMV0pfSx5cC5wcm90b3R5cGUuZ2V0U2VnbWVudE9jdGFudD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PXRoaXMuX3B0cy5sZW5ndGgtMT8tMTp0aGlzLnNhZmVPY3RhbnQodGhpcy5nZXRDb29yZGluYXRlKHQpLHRoaXMuZ2V0Q29vcmRpbmF0ZSh0KzEpKX0seXAucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dGhpcy5fZGF0YT10fSx5cC5wcm90b3R5cGUuc2FmZU9jdGFudD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmVxdWFsczJEKGUpPzA6ZnAub2N0YW50KHQsZSl9LHlwLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9LHlwLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuYWRkSW50ZXJzZWN0aW9uTm9kZSh0LGUpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1szXSxvPW5ldyB1bChuLmdldEludGVyc2VjdGlvbihpKSk7dGhpcy5hZGRJbnRlcnNlY3Rpb24obyxyKX19LHlwLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBGbC50b0xpbmVTdHJpbmcobmV3IGxoKHRoaXMuX3B0cykpfSx5cC5wcm90b3R5cGUuZ2V0Tm9kZUxpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZUxpc3R9LHlwLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb25Ob2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZSxyPW4rMTtpZihyPHRoaXMuX3B0cy5sZW5ndGgpe3ZhciBpPXRoaXMuX3B0c1tyXTt0LmVxdWFsczJEKGkpJiYobj1yKX1yZXR1cm4gdGhpcy5fbm9kZUxpc3QuYWRkKHQsbil9LHlwLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MDtyPHQuZ2V0SW50ZXJzZWN0aW9uTnVtKCk7cisrKXRoaXMuYWRkSW50ZXJzZWN0aW9uKHQsZSxuLHIpfSx5cC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZHBdfSx5cC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geXB9LHlwLmdldE5vZGVkU3Vic3RyaW5ncz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgbGM7cmV0dXJuIHlwLmdldE5vZGVkU3Vic3RyaW5ncyh0LGUpLGV9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPW4uaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpO28uZ2V0Tm9kZUxpc3QoKS5hZGRTcGxpdEVkZ2VzKHIpfX07dmFyIHZwPWZ1bmN0aW9uKCl7aWYodGhpcy5wMD1udWxsLHRoaXMucDE9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLnAwPW5ldyB1bCx0aGlzLnAxPW5ldyB1bDtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5wMD1uZXcgdWwodC5wMCksdGhpcy5wMT1uZXcgdWwodC5wMSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLnAwPWFyZ3VtZW50c1swXSx0aGlzLnAxPWFyZ3VtZW50c1sxXTtlbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl0saT1hcmd1bWVudHNbM107dGhpcy5wMD1uZXcgdWwoZSxuKSx0aGlzLnAxPW5ldyB1bChyLGkpfX0sX3A9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3ZwLnByb3RvdHlwZS5taW5YPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKHRoaXMucDAueCx0aGlzLnAxLngpfSx2cC5wcm90b3R5cGUub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdnApe3ZhciB0PWFyZ3VtZW50c1swXSxlPVhsLm9yaWVudGF0aW9uSW5kZXgodGhpcy5wMCx0aGlzLnAxLHQucDApLG49WGwub3JpZW50YXRpb25JbmRleCh0aGlzLnAwLHRoaXMucDEsdC5wMSk7cmV0dXJuIGU+PTAmJm4+PTB8fGU8PTAmJm48PTA/TWF0aC5tYXgoZSxuKTowfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwpe3ZhciByPWFyZ3VtZW50c1swXTtyZXR1cm4gWGwub3JpZW50YXRpb25JbmRleCh0aGlzLnAwLHRoaXMucDEscil9fSx2cC5wcm90b3R5cGUudG9HZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jcmVhdGVMaW5lU3RyaW5nKFt0aGlzLnAwLHRoaXMucDFdKX0sdnAucHJvdG90eXBlLmlzVmVydGljYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wMC54PT09dGhpcy5wMS54fSx2cC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIHZwKSlyZXR1cm4hMTt2YXIgZT10O3JldHVybiB0aGlzLnAwLmVxdWFscyhlLnAwKSYmdGhpcy5wMS5lcXVhbHMoZS5wMSl9LHZwLnByb3RvdHlwZS5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGpsO3JldHVybiBlLmNvbXB1dGVJbnRlcnNlY3Rpb24odGhpcy5wMCx0aGlzLnAxLHQucDAsdC5wMSksZS5oYXNJbnRlcnNlY3Rpb24oKT9lLmdldEludGVyc2VjdGlvbigwKTpudWxsfSx2cC5wcm90b3R5cGUucHJvamVjdD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwpe3ZhciB0PWFyZ3VtZW50c1swXTtpZih0LmVxdWFscyh0aGlzLnAwKXx8dC5lcXVhbHModGhpcy5wMSkpcmV0dXJuIG5ldyB1bCh0KTt2YXIgZT10aGlzLnByb2plY3Rpb25GYWN0b3IodCksbj1uZXcgdWw7cmV0dXJuIG4ueD10aGlzLnAwLngrZSoodGhpcy5wMS54LXRoaXMucDAueCksbi55PXRoaXMucDAueStlKih0aGlzLnAxLnktdGhpcy5wMC55KSxufWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdnApe3ZhciByPWFyZ3VtZW50c1swXSxpPXRoaXMucHJvamVjdGlvbkZhY3RvcihyLnAwKSxvPXRoaXMucHJvamVjdGlvbkZhY3RvcihyLnAxKTtpZihpPj0xJiZvPj0xKXJldHVybiBudWxsO2lmKGk8PTAmJm88PTApcmV0dXJuIG51bGw7dmFyIHM9dGhpcy5wcm9qZWN0KHIucDApO2k8MCYmKHM9dGhpcy5wMCksaT4xJiYocz10aGlzLnAxKTt2YXIgYT10aGlzLnByb2plY3Qoci5wMSk7cmV0dXJuIG88MCYmKGE9dGhpcy5wMCksbz4xJiYoYT10aGlzLnAxKSxuZXcgdnAocyxhKX19LHZwLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXt0aGlzLnAxLmNvbXBhcmVUbyh0aGlzLnAwKTwwJiZ0aGlzLnJldmVyc2UoKX0sdnAucHJvdG90eXBlLmFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy5wMS55LXRoaXMucDAueSx0aGlzLnAxLngtdGhpcy5wMC54KX0sdnAucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10P3RoaXMucDA6dGhpcy5wMX0sdnAucHJvdG90eXBlLmRpc3RhbmNlUGVycGVuZGljdWxhcj1mdW5jdGlvbih0KXtyZXR1cm4gWGwuZGlzdGFuY2VQb2ludExpbmVQZXJwZW5kaWN1bGFyKHQsdGhpcy5wMCx0aGlzLnAxKX0sdnAucHJvdG90eXBlLm1pblk9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5wMC55LHRoaXMucDEueSl9LHZwLnByb3RvdHlwZS5taWRQb2ludD1mdW5jdGlvbigpe3JldHVybiB2cC5taWRQb2ludCh0aGlzLnAwLHRoaXMucDEpfSx2cC5wcm90b3R5cGUucHJvamVjdGlvbkZhY3Rvcj1mdW5jdGlvbih0KXtpZih0LmVxdWFscyh0aGlzLnAwKSlyZXR1cm4gMDtpZih0LmVxdWFscyh0aGlzLnAxKSlyZXR1cm4gMTt2YXIgZT10aGlzLnAxLngtdGhpcy5wMC54LG49dGhpcy5wMS55LXRoaXMucDAueSxyPWUqZStuKm47cmV0dXJuIHI8PTA/bmwuTmFOOigodC54LXRoaXMucDAueCkqZSsodC55LXRoaXMucDAueSkqbikvcn0sdnAucHJvdG90eXBlLmNsb3Nlc3RQb2ludHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbnRlcnNlY3Rpb24odCk7aWYobnVsbCE9PWUpcmV0dXJuW2UsZV07dmFyIG49bmV3IEFycmF5KDIpLmZpbGwobnVsbCkscj1ubC5NQVhfVkFMVUUsaT1udWxsLG89dGhpcy5jbG9zZXN0UG9pbnQodC5wMCk7cj1vLmRpc3RhbmNlKHQucDApLG5bMF09byxuWzFdPXQucDA7dmFyIHM9dGhpcy5jbG9zZXN0UG9pbnQodC5wMSk7KGk9cy5kaXN0YW5jZSh0LnAxKSk8ciYmKHI9aSxuWzBdPXMsblsxXT10LnAxKTt2YXIgYT10LmNsb3Nlc3RQb2ludCh0aGlzLnAwKTsoaT1hLmRpc3RhbmNlKHRoaXMucDApKTxyJiYocj1pLG5bMF09dGhpcy5wMCxuWzFdPWEpO3ZhciB1PXQuY2xvc2VzdFBvaW50KHRoaXMucDEpO3JldHVybihpPXUuZGlzdGFuY2UodGhpcy5wMSkpPHImJihyPWksblswXT10aGlzLnAxLG5bMV09dSksbn0sdnAucHJvdG90eXBlLmNsb3Nlc3RQb2ludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnByb2plY3Rpb25GYWN0b3IodCk7cmV0dXJuIGU+MCYmZTwxP3RoaXMucHJvamVjdCh0KTp0aGlzLnAwLmRpc3RhbmNlKHQpPHRoaXMucDEuZGlzdGFuY2UodCk/dGhpcy5wMDp0aGlzLnAxfSx2cC5wcm90b3R5cGUubWF4WD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1heCh0aGlzLnAwLngsdGhpcy5wMS54KX0sdnAucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnAwLmRpc3RhbmNlKHRoaXMucDEpfSx2cC5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQsbj10aGlzLnAwLmNvbXBhcmVUbyhlLnAwKTtyZXR1cm4gMCE9PW4/bjp0aGlzLnAxLmNvbXBhcmVUbyhlLnAxKX0sdnAucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnAwO3RoaXMucDA9dGhpcy5wMSx0aGlzLnAxPXR9LHZwLnByb3RvdHlwZS5lcXVhbHNUb3BvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnAwLmVxdWFscyh0LnAwKSYmKHRoaXMucDEuZXF1YWxzKHQucDEpfHx0aGlzLnAwLmVxdWFscyh0LnAxKSkmJnRoaXMucDEuZXF1YWxzKHQucDApfSx2cC5wcm90b3R5cGUubGluZUludGVyc2VjdGlvbj1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIE1sLmludGVyc2VjdGlvbih0aGlzLnAwLHRoaXMucDEsdC5wMCx0LnAxKX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBDbCkpdGhyb3cgdH1yZXR1cm4gbnVsbH0sdnAucHJvdG90eXBlLm1heFk9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgodGhpcy5wMC55LHRoaXMucDEueSl9LHZwLnByb3RvdHlwZS5wb2ludEFsb25nT2Zmc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5wMC54K3QqKHRoaXMucDEueC10aGlzLnAwLngpLHI9dGhpcy5wMC55K3QqKHRoaXMucDEueS10aGlzLnAwLnkpLGk9dGhpcy5wMS54LXRoaXMucDAueCxvPXRoaXMucDEueS10aGlzLnAwLnkscz1NYXRoLnNxcnQoaSppK28qbyksYT0wLHU9MDtpZigwIT09ZSl7aWYoczw9MCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb21wdXRlIG9mZnNldCBmcm9tIHplcm8tbGVuZ3RoIGxpbmUgc2VnbWVudCIpO2E9ZSppL3MsdT1lKm8vc31yZXR1cm4gbmV3IHVsKG4tdSxyK2EpfSx2cC5wcm90b3R5cGUuc2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0Q29vcmRpbmF0ZXModC5wMCx0LnAxKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5wMC54PWUueCx0aGlzLnAwLnk9ZS55LHRoaXMucDEueD1uLngsdGhpcy5wMS55PW4ueX19LHZwLnByb3RvdHlwZS5zZWdtZW50RnJhY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wcm9qZWN0aW9uRmFjdG9yKHQpO3JldHVybiBlPDA/ZT0wOihlPjF8fG5sLmlzTmFOKGUpKSYmKGU9MSksZX0sdnAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkxJTkVTVFJJTkcoICIrdGhpcy5wMC54KyIgIit0aGlzLnAwLnkrIiwgIit0aGlzLnAxLngrIiAiK3RoaXMucDEueSsiKSJ9LHZwLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wMC55PT09dGhpcy5wMS55fSx2cC5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZwKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIFhsLmRpc3RhbmNlTGluZUxpbmUodGhpcy5wMCx0aGlzLnAxLHQucDAsdC5wMSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB1bCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBYbC5kaXN0YW5jZVBvaW50TGluZShlLHRoaXMucDAsdGhpcy5wMSl9fSx2cC5wcm90b3R5cGUucG9pbnRBbG9uZz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdWw7cmV0dXJuIGUueD10aGlzLnAwLngrdCoodGhpcy5wMS54LXRoaXMucDAueCksZS55PXRoaXMucDAueSt0Kih0aGlzLnAxLnktdGhpcy5wMC55KSxlfSx2cC5wcm90b3R5cGUuaGFzaENvZGU9ZnVuY3Rpb24oKXt2YXIgdD1ubC5kb3VibGVUb0xvbmdCaXRzKHRoaXMucDAueCk7dF49MzEqbmwuZG91YmxlVG9Mb25nQml0cyh0aGlzLnAwLnkpO3ZhciBlPU1hdGgudHJ1bmModCleTWF0aC50cnVuYyh0Pj4zMiksbj1ubC5kb3VibGVUb0xvbmdCaXRzKHRoaXMucDEueCk7cmV0dXJuIG5ePTMxKm5sLmRvdWJsZVRvTG9uZ0JpdHModGhpcy5wMS55KSxlXihNYXRoLnRydW5jKG4pXk1hdGgudHJ1bmMobj4+MzIpKX0sdnAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2lsLGFsXX0sdnAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHZwfSx2cC5taWRQb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgdWwoKHQueCtlLngpLzIsKHQueStlLnkpLzIpfSxfcC5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDJkMjE3MjEzNWY0MTFjMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHZwLF9wKTt2YXIgbXA9ZnVuY3Rpb24oKXt0aGlzLnRlbXBFbnYxPW5ldyBMbCx0aGlzLnRlbXBFbnYyPW5ldyBMbCx0aGlzLl9vdmVybGFwU2VnMT1uZXcgdnAsdGhpcy5fb3ZlcmxhcFNlZzI9bmV3IHZwfTttcC5wcm90b3R5cGUub3ZlcmxhcD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKTtlbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1hcmd1bWVudHNbM107dC5nZXRMaW5lU2VnbWVudChlLHRoaXMuX292ZXJsYXBTZWcxKSxuLmdldExpbmVTZWdtZW50KHIsdGhpcy5fb3ZlcmxhcFNlZzIpLHRoaXMub3ZlcmxhcCh0aGlzLl9vdmVybGFwU2VnMSx0aGlzLl9vdmVybGFwU2VnMil9fSxtcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbXAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG1wfTt2YXIgeHA9ZnVuY3Rpb24oKXt0aGlzLl9wdHM9bnVsbCx0aGlzLl9zdGFydD1udWxsLHRoaXMuX2VuZD1udWxsLHRoaXMuX2Vudj1udWxsLHRoaXMuX2NvbnRleHQ9bnVsbCx0aGlzLl9pZD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxyPWFyZ3VtZW50c1szXTt0aGlzLl9wdHM9dCx0aGlzLl9zdGFydD1lLHRoaXMuX2VuZD1uLHRoaXMuX2NvbnRleHQ9cn07eHAucHJvdG90eXBlLmdldExpbmVTZWdtZW50PWZ1bmN0aW9uKHQsZSl7ZS5wMD10aGlzLl9wdHNbdF0sZS5wMT10aGlzLl9wdHNbdCsxXX0seHAucHJvdG90eXBlLmNvbXB1dGVTZWxlY3Q9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcy5fcHRzW2VdLG89dGhpcy5fcHRzW25dO2lmKHIudGVtcEVudjEuaW5pdChpLG8pLG4tZT09MSlyZXR1cm4gci5zZWxlY3QodGhpcyxlKSxudWxsO2lmKCF0LmludGVyc2VjdHMoci50ZW1wRW52MSkpcmV0dXJuIG51bGw7dmFyIHM9TWF0aC50cnVuYygoZStuKS8yKTtlPHMmJnRoaXMuY29tcHV0ZVNlbGVjdCh0LGUscyxyKSxzPG4mJnRoaXMuY29tcHV0ZVNlbGVjdCh0LHMsbixyKX0seHAucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLl9lbmQtdGhpcy5fc3RhcnQrMSkuZmlsbChudWxsKSxlPTAsbj10aGlzLl9zdGFydDtuPD10aGlzLl9lbmQ7bisrKXRbZSsrXT10aGlzLl9wdHNbbl07cmV0dXJuIHR9LHhwLnByb3RvdHlwZS5jb21wdXRlT3ZlcmxhcHM9ZnVuY3Rpb24odCxlKXt0aGlzLmNvbXB1dGVPdmVybGFwc0ludGVybmFsKHRoaXMuX3N0YXJ0LHRoaXMuX2VuZCx0LHQuX3N0YXJ0LHQuX2VuZCxlKX0seHAucHJvdG90eXBlLnNldElkPWZ1bmN0aW9uKHQpe3RoaXMuX2lkPXR9LHhwLnByb3RvdHlwZS5zZWxlY3Q9ZnVuY3Rpb24odCxlKXt0aGlzLmNvbXB1dGVTZWxlY3QodCx0aGlzLl9zdGFydCx0aGlzLl9lbmQsZSl9LHhwLnByb3RvdHlwZS5nZXRFbnZlbG9wZT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9lbnYpe3ZhciB0PXRoaXMuX3B0c1t0aGlzLl9zdGFydF0sZT10aGlzLl9wdHNbdGhpcy5fZW5kXTt0aGlzLl9lbnY9bmV3IExsKHQsZSl9cmV0dXJuIHRoaXMuX2Vudn0seHAucHJvdG90eXBlLmdldEVuZEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZH0seHAucHJvdG90eXBlLmdldFN0YXJ0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhcnR9LHhwLnByb3RvdHlwZS5nZXRDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRleHR9LHhwLnByb3RvdHlwZS5nZXRJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pZH0seHAucHJvdG90eXBlLmNvbXB1dGVPdmVybGFwc0ludGVybmFsPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt2YXIgcz10aGlzLl9wdHNbdF0sYT10aGlzLl9wdHNbZV0sdT1uLl9wdHNbcl0sbD1uLl9wdHNbaV07aWYoZS10PT0xJiZpLXI9PTEpcmV0dXJuIG8ub3ZlcmxhcCh0aGlzLHQsbixyKSxudWxsO2lmKG8udGVtcEVudjEuaW5pdChzLGEpLG8udGVtcEVudjIuaW5pdCh1LGwpLCFvLnRlbXBFbnYxLmludGVyc2VjdHMoby50ZW1wRW52MikpcmV0dXJuIG51bGw7dmFyIGM9TWF0aC50cnVuYygodCtlKS8yKSxoPU1hdGgudHJ1bmMoKHIraSkvMik7dDxjJiYocjxoJiZ0aGlzLmNvbXB1dGVPdmVybGFwc0ludGVybmFsKHQsYyxuLHIsaCxvKSxoPGkmJnRoaXMuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWwodCxjLG4saCxpLG8pKSxjPGUmJihyPGgmJnRoaXMuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWwoYyxlLG4scixoLG8pLGg8aSYmdGhpcy5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbChjLGUsbixoLGksbykpfSx4cC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0seHAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHhwfTt2YXIgRXA9ZnVuY3Rpb24oKXt9O0VwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxFcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRXB9LEVwLmdldENoYWluU3RhcnRJbmRpY2VzPWZ1bmN0aW9uKHQpe3ZhciBlPTAsbj1uZXcgbGM7bi5hZGQobmV3IF9sKGUpKTtkb3t2YXIgcj1FcC5maW5kQ2hhaW5FbmQodCxlKTtuLmFkZChuZXcgX2wocikpLGU9cn13aGlsZShlPHQubGVuZ3RoLTEpO3JldHVybiBFcC50b0ludEFycmF5KG4pfSxFcC5maW5kQ2hhaW5FbmQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZTtuPHQubGVuZ3RoLTEmJnRbbl0uZXF1YWxzMkQodFtuKzFdKTspbisrO2lmKG4+PXQubGVuZ3RoLTEpcmV0dXJuIHQubGVuZ3RoLTE7Zm9yKHZhciByPWpoLnF1YWRyYW50KHRbbl0sdFtuKzFdKSxpPWUrMTtpPHQubGVuZ3RoOyl7aWYoIXRbaS0xXS5lcXVhbHMyRCh0W2ldKSlpZihqaC5xdWFkcmFudCh0W2ktMV0sdFtpXSkhPT1yKWJyZWFrO2krK31yZXR1cm4gaS0xfSxFcC5nZXRDaGFpbnM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBFcC5nZXRDaGFpbnModCxudWxsKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPW5ldyBsYyxpPUVwLmdldENoYWluU3RhcnRJbmRpY2VzKGUpLG89MDtvPGkubGVuZ3RoLTE7bysrKXt2YXIgcz1uZXcgeHAoZSxpW29dLGlbbysxXSxuKTtyLmFkZChzKX1yZXR1cm4gcn19LEVwLnRvSW50QXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT10LmdldChuKS5pbnRWYWx1ZSgpO3JldHVybiBlfTt2YXIgYnA9ZnVuY3Rpb24oKXt9O2JwLnByb3RvdHlwZS5jb21wdXRlTm9kZXM9ZnVuY3Rpb24odCl7fSxicC5wcm90b3R5cGUuZ2V0Tm9kZWRTdWJzdHJpbmdzPWZ1bmN0aW9uKCl7fSxicC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sYnAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGJwfTt2YXIgd3A9ZnVuY3Rpb24oKXtpZih0aGlzLl9zZWdJbnQ9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0U2VnbWVudEludGVyc2VjdG9yKHQpfX07d3AucHJvdG90eXBlLnNldFNlZ21lbnRJbnRlcnNlY3Rvcj1mdW5jdGlvbih0KXt0aGlzLl9zZWdJbnQ9dH0sd3AucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2JwXX0sd3AucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHdwfTt2YXIgSXA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtlP3QuY2FsbCh0aGlzLGUpOnQuY2FsbCh0aGlzKSx0aGlzLl9tb25vQ2hhaW5zPW5ldyBsYyx0aGlzLl9pbmRleD1uZXcgdXAsdGhpcy5faWRDb3VudGVyPTAsdGhpcy5fbm9kZWRTZWdTdHJpbmdzPW51bGwsdGhpcy5fbk92ZXJsYXBzPTB9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e1NlZ21lbnRPdmVybGFwQWN0aW9uOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuZ2V0TW9ub3RvbmVDaGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9ub0NoYWluc30sZS5wcm90b3R5cGUuZ2V0Tm9kZWRTdWJzdHJpbmdzPWZ1bmN0aW9uKCl7cmV0dXJuIHlwLmdldE5vZGVkU3Vic3RyaW5ncyh0aGlzLl9ub2RlZFNlZ1N0cmluZ3MpfSxlLnByb3RvdHlwZS5nZXRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbmRleH0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49RXAuZ2V0Q2hhaW5zKHQuZ2V0Q29vcmRpbmF0ZXMoKSx0KS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ci5zZXRJZChlLl9pZENvdW50ZXIrKyksZS5faW5kZXguaW5zZXJ0KHIuZ2V0RW52ZWxvcGUoKSxyKSxlLl9tb25vQ2hhaW5zLmFkZChyKX19LGUucHJvdG90eXBlLmNvbXB1dGVOb2Rlcz1mdW5jdGlvbih0KXt0aGlzLl9ub2RlZFNlZ1N0cmluZ3M9dDtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSk7dGhpcy5pbnRlcnNlY3RDaGFpbnMoKX0sZS5wcm90b3R5cGUuaW50ZXJzZWN0Q2hhaW5zPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT1uZXcgTnAodGhpcy5fc2VnSW50KSxuPXRoaXMuX21vbm9DaGFpbnMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspZm9yKHZhciByPW4ubmV4dCgpLGk9dC5faW5kZXgucXVlcnkoci5nZXRFbnZlbG9wZSgpKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCk7aWYoby5nZXRJZCgpPnIuZ2V0SWQoKSYmKHIuY29tcHV0ZU92ZXJsYXBzKG8sZSksdC5fbk92ZXJsYXBzKyspLHQuX3NlZ0ludC5pc0RvbmUoKSlyZXR1cm4gbnVsbH19LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uU2VnbWVudE92ZXJsYXBBY3Rpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE5wfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KHdwKSxOcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX3NpPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX3NpPWV9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLm92ZXJsYXA9ZnVuY3Rpb24oKXtpZig0IT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUub3ZlcmxhcC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdLGk9YXJndW1lbnRzWzNdLG89ZS5nZXRDb250ZXh0KCkscz1yLmdldENvbnRleHQoKTt0aGlzLl9zaS5wcm9jZXNzSW50ZXJzZWN0aW9ucyhvLG4scyxpKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0obXApLFNwPWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9xdWFkcmFudFNlZ21lbnRzPXQuREVGQVVMVF9RVUFEUkFOVF9TRUdNRU5UUyx0aGlzLl9lbmRDYXBTdHlsZT10LkNBUF9ST1VORCx0aGlzLl9qb2luU3R5bGU9dC5KT0lOX1JPVU5ELHRoaXMuX21pdHJlTGltaXQ9dC5ERUZBVUxUX01JVFJFX0xJTUlULHRoaXMuX2lzU2luZ2xlU2lkZWQ9ITEsdGhpcy5fc2ltcGxpZnlGYWN0b3I9dC5ERUZBVUxUX1NJTVBMSUZZX0ZBQ1RPUiwwPT09YXJndW1lbnRzLmxlbmd0aCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuc2V0UXVhZHJhbnRTZWdtZW50cyhlKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5zZXRRdWFkcmFudFNlZ21lbnRzKG4pLHRoaXMuc2V0RW5kQ2FwU3R5bGUocil9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzNdO3RoaXMuc2V0UXVhZHJhbnRTZWdtZW50cyhpKSx0aGlzLnNldEVuZENhcFN0eWxlKG8pLHRoaXMuc2V0Sm9pblN0eWxlKHMpLHRoaXMuc2V0TWl0cmVMaW1pdChhKX19LENwPXtDQVBfUk9VTkQ6e2NvbmZpZ3VyYWJsZTohMH0sQ0FQX0ZMQVQ6e2NvbmZpZ3VyYWJsZTohMH0sQ0FQX1NRVUFSRTp7Y29uZmlndXJhYmxlOiEwfSxKT0lOX1JPVU5EOntjb25maWd1cmFibGU6ITB9LEpPSU5fTUlUUkU6e2NvbmZpZ3VyYWJsZTohMH0sSk9JTl9CRVZFTDp7Y29uZmlndXJhYmxlOiEwfSxERUZBVUxUX1FVQURSQU5UX1NFR01FTlRTOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfTUlUUkVfTElNSVQ6e2NvbmZpZ3VyYWJsZTohMH0sREVGQVVMVF9TSU1QTElGWV9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH19O1NwLnByb3RvdHlwZS5nZXRFbmRDYXBTdHlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmRDYXBTdHlsZX0sU3AucHJvdG90eXBlLmlzU2luZ2xlU2lkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNTaW5nbGVTaWRlZH0sU3AucHJvdG90eXBlLnNldFF1YWRyYW50U2VnbWVudHM9ZnVuY3Rpb24odCl7dGhpcy5fcXVhZHJhbnRTZWdtZW50cz10LDA9PT10aGlzLl9xdWFkcmFudFNlZ21lbnRzJiYodGhpcy5fam9pblN0eWxlPVNwLkpPSU5fQkVWRUwpLHRoaXMuX3F1YWRyYW50U2VnbWVudHM8MCYmKHRoaXMuX2pvaW5TdHlsZT1TcC5KT0lOX01JVFJFLHRoaXMuX21pdHJlTGltaXQ9TWF0aC5hYnModGhpcy5fcXVhZHJhbnRTZWdtZW50cykpLHQ8PTAmJih0aGlzLl9xdWFkcmFudFNlZ21lbnRzPTEpLHRoaXMuX2pvaW5TdHlsZSE9PVNwLkpPSU5fUk9VTkQmJih0aGlzLl9xdWFkcmFudFNlZ21lbnRzPVNwLkRFRkFVTFRfUVVBRFJBTlRfU0VHTUVOVFMpfSxTcC5wcm90b3R5cGUuZ2V0Sm9pblN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2pvaW5TdHlsZX0sU3AucHJvdG90eXBlLnNldEpvaW5TdHlsZT1mdW5jdGlvbih0KXt0aGlzLl9qb2luU3R5bGU9dH0sU3AucHJvdG90eXBlLnNldFNpbXBsaWZ5RmFjdG9yPWZ1bmN0aW9uKHQpe3RoaXMuX3NpbXBsaWZ5RmFjdG9yPXQ8MD8wOnR9LFNwLnByb3RvdHlwZS5nZXRTaW1wbGlmeUZhY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaW1wbGlmeUZhY3Rvcn0sU3AucHJvdG90eXBlLmdldFF1YWRyYW50U2VnbWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcXVhZHJhbnRTZWdtZW50c30sU3AucHJvdG90eXBlLnNldEVuZENhcFN0eWxlPWZ1bmN0aW9uKHQpe3RoaXMuX2VuZENhcFN0eWxlPXR9LFNwLnByb3RvdHlwZS5nZXRNaXRyZUxpbWl0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pdHJlTGltaXR9LFNwLnByb3RvdHlwZS5zZXRNaXRyZUxpbWl0PWZ1bmN0aW9uKHQpe3RoaXMuX21pdHJlTGltaXQ9dH0sU3AucHJvdG90eXBlLnNldFNpbmdsZVNpZGVkPWZ1bmN0aW9uKHQpe3RoaXMuX2lzU2luZ2xlU2lkZWQ9dH0sU3AucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFNwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBTcH0sU3AuYnVmZmVyRGlzdGFuY2VFcnJvcj1mdW5jdGlvbih0KXt2YXIgZT1NYXRoLlBJLzIvdDtyZXR1cm4gMS1NYXRoLmNvcyhlLzIpfSxDcC5DQVBfUk9VTkQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LENwLkNBUF9GTEFULmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxDcC5DQVBfU1FVQVJFLmdldD1mdW5jdGlvbigpe3JldHVybiAzfSxDcC5KT0lOX1JPVU5ELmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxDcC5KT0lOX01JVFJFLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxDcC5KT0lOX0JFVkVMLmdldD1mdW5jdGlvbigpe3JldHVybiAzfSxDcC5ERUZBVUxUX1FVQURSQU5UX1NFR01FTlRTLmdldD1mdW5jdGlvbigpe3JldHVybiA4fSxDcC5ERUZBVUxUX01JVFJFX0xJTUlULmdldD1mdW5jdGlvbigpe3JldHVybiA1fSxDcC5ERUZBVUxUX1NJTVBMSUZZX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFNwLENwKTt2YXIgUHA9ZnVuY3Rpb24odCl7dGhpcy5fZGlzdGFuY2VUb2w9bnVsbCx0aGlzLl9pc0RlbGV0ZWQ9bnVsbCx0aGlzLl9hbmdsZU9yaWVudGF0aW9uPVhsLkNPVU5URVJDTE9DS1dJU0UsdGhpcy5faW5wdXRMaW5lPXR8fG51bGx9LE1wPXtJTklUOntjb25maWd1cmFibGU6ITB9LERFTEVURTp7Y29uZmlndXJhYmxlOiEwfSxLRUVQOntjb25maWd1cmFibGU6ITB9LE5VTV9QVFNfVE9fQ0hFQ0s6e2NvbmZpZ3VyYWJsZTohMH19O1BwLnByb3RvdHlwZS5pc0RlbGV0YWJsZT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLl9pbnB1dExpbmVbdF0sbz10aGlzLl9pbnB1dExpbmVbZV0scz10aGlzLl9pbnB1dExpbmVbbl07cmV0dXJuISF0aGlzLmlzQ29uY2F2ZShpLG8scykmJighIXRoaXMuaXNTaGFsbG93KGksbyxzLHIpJiZ0aGlzLmlzU2hhbGxvd1NhbXBsZWQoaSxvLHQsbixyKSl9LFBwLnByb3RvdHlwZS5kZWxldGVTaGFsbG93Q29uY2F2aXRpZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTEsbj10aGlzLmZpbmROZXh0Tm9uRGVsZXRlZEluZGV4KGUpLHI9dGhpcy5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleChuKSxpPSExO3I8dGhpcy5faW5wdXRMaW5lLmxlbmd0aDspe3ZhciBvPSExO3QuaXNEZWxldGFibGUoZSxuLHIsdC5fZGlzdGFuY2VUb2wpJiYodC5faXNEZWxldGVkW25dPVBwLkRFTEVURSxvPSEwLGk9ITApLGU9bz9yOm4sbj10LmZpbmROZXh0Tm9uRGVsZXRlZEluZGV4KGUpLHI9dC5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleChuKX1yZXR1cm4gaX0sUHAucHJvdG90eXBlLmlzU2hhbGxvd0NvbmNhdml0eT1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gWGwuY29tcHV0ZU9yaWVudGF0aW9uKHQsZSxuKT09PXRoaXMuX2FuZ2xlT3JpZW50YXRpb24mJlhsLmRpc3RhbmNlUG9pbnRMaW5lKGUsdCxuKTxyfSxQcC5wcm90b3R5cGUuaXNTaGFsbG93U2FtcGxlZD1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPU1hdGgudHJ1bmMoKHItbikvUHAuTlVNX1BUU19UT19DSEVDSyk7bzw9MCYmKG89MSk7Zm9yKHZhciBzPW47czxyO3MrPW8paWYoIXRoaXMuaXNTaGFsbG93KHQsZSx0aGlzLl9pbnB1dExpbmVbc10saSkpcmV0dXJuITE7cmV0dXJuITB9LFBwLnByb3RvdHlwZS5pc0NvbmNhdmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVhsLmNvbXB1dGVPcmllbnRhdGlvbih0LGUsbik9PT10aGlzLl9hbmdsZU9yaWVudGF0aW9uO3JldHVybiByfSxQcC5wcm90b3R5cGUuc2ltcGxpZnk9ZnVuY3Rpb24odCl7dGhpcy5fZGlzdGFuY2VUb2w9TWF0aC5hYnModCksdDwwJiYodGhpcy5fYW5nbGVPcmllbnRhdGlvbj1YbC5DTE9DS1dJU0UpLHRoaXMuX2lzRGVsZXRlZD1uZXcgQXJyYXkodGhpcy5faW5wdXRMaW5lLmxlbmd0aCkuZmlsbChudWxsKTt2YXIgZT0hMTtkb3tlPXRoaXMuZGVsZXRlU2hhbGxvd0NvbmNhdml0aWVzKCl9d2hpbGUoZSk7cmV0dXJuIHRoaXMuY29sbGFwc2VMaW5lKCl9LFBwLnByb3RvdHlwZS5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dCsxO2U8dGhpcy5faW5wdXRMaW5lLmxlbmd0aCYmdGhpcy5faXNEZWxldGVkW2VdPT09UHAuREVMRVRFOyllKys7cmV0dXJuIGV9LFBwLnByb3RvdHlwZS5pc1NoYWxsb3c9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIFhsLmRpc3RhbmNlUG9pbnRMaW5lKGUsdCxuKTxyfSxQcC5wcm90b3R5cGUuY29sbGFwc2VMaW5lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBoYyxlPTA7ZTx0aGlzLl9pbnB1dExpbmUubGVuZ3RoO2UrKyl0aGlzLl9pc0RlbGV0ZWRbZV0hPT1QcC5ERUxFVEUmJnQuYWRkKHRoaXMuX2lucHV0TGluZVtlXSk7cmV0dXJuIHQudG9Db29yZGluYXRlQXJyYXkoKX0sUHAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFBwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBQcH0sUHAuc2ltcGxpZnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFBwKHQpLnNpbXBsaWZ5KGUpfSxNcC5JTklULmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxNcC5ERUxFVEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LE1wLktFRVAuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LE1wLk5VTV9QVFNfVE9fQ0hFQ0suZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDEwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhQcCxNcCk7dmFyIExwPWZ1bmN0aW9uKCl7dGhpcy5fcHRMaXN0PW51bGwsdGhpcy5fcHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9taW5pbWltVmVydGV4RGlzdGFuY2U9MCx0aGlzLl9wdExpc3Q9bmV3IGxjfSxPcD17Q09PUkRJTkFURV9BUlJBWV9UWVBFOntjb25maWd1cmFibGU6ITB9fTtMcC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRMaXN0LnRvQXJyYXkoTHAuQ09PUkRJTkFURV9BUlJBWV9UWVBFKX0sTHAucHJvdG90eXBlLnNldFByZWNpc2lvbk1vZGVsPWZ1bmN0aW9uKHQpe3RoaXMuX3ByZWNpc2lvbk1vZGVsPXR9LExwLnByb3RvdHlwZS5hZGRQdD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdWwodCk7aWYodGhpcy5fcHJlY2lzaW9uTW9kZWwubWFrZVByZWNpc2UoZSksdGhpcy5pc1JlZHVuZGFudChlKSlyZXR1cm4gbnVsbDt0aGlzLl9wdExpc3QuYWRkKGUpfSxMcC5wcm90b3R5cGUucmV2ZXJlPWZ1bmN0aW9uKCl7fSxMcC5wcm90b3R5cGUuYWRkUHRzPWZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0aGlzLmFkZFB0KHRbbl0pO2Vsc2UgZm9yKHZhciByPXQubGVuZ3RoLTE7cj49MDtyLS0pdGhpcy5hZGRQdCh0W3JdKX0sTHAucHJvdG90eXBlLmlzUmVkdW5kYW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX3B0TGlzdC5zaXplKCk8MSlyZXR1cm4hMTt2YXIgZT10aGlzLl9wdExpc3QuZ2V0KHRoaXMuX3B0TGlzdC5zaXplKCktMSk7cmV0dXJuIHQuZGlzdGFuY2UoZSk8dGhpcy5fbWluaW1pbVZlcnRleERpc3RhbmNlfSxMcC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IF9oKS5jcmVhdGVMaW5lU3RyaW5nKHRoaXMuZ2V0Q29vcmRpbmF0ZXMoKSkudG9TdHJpbmcoKX0sTHAucHJvdG90eXBlLmNsb3NlUmluZz1mdW5jdGlvbigpe2lmKHRoaXMuX3B0TGlzdC5zaXplKCk8MSlyZXR1cm4gbnVsbDt2YXIgdD1uZXcgdWwodGhpcy5fcHRMaXN0LmdldCgwKSksZT10aGlzLl9wdExpc3QuZ2V0KHRoaXMuX3B0TGlzdC5zaXplKCktMSk7aWYodC5lcXVhbHMoZSkpcmV0dXJuIG51bGw7dGhpcy5fcHRMaXN0LmFkZCh0KX0sTHAucHJvdG90eXBlLnNldE1pbmltdW1WZXJ0ZXhEaXN0YW5jZT1mdW5jdGlvbih0KXt0aGlzLl9taW5pbWltVmVydGV4RGlzdGFuY2U9dH0sTHAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LExwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBMcH0sT3AuQ09PUkRJTkFURV9BUlJBWV9UWVBFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgQXJyYXkoMCkuZmlsbChudWxsKX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTHAsT3ApO3ZhciBScD1mdW5jdGlvbigpe30sVHA9e1BJX1RJTUVTXzI6e2NvbmZpZ3VyYWJsZTohMH0sUElfT1ZFUl8yOntjb25maWd1cmFibGU6ITB9LFBJX09WRVJfNDp7Y29uZmlndXJhYmxlOiEwfSxDT1VOVEVSQ0xPQ0tXSVNFOntjb25maWd1cmFibGU6ITB9LENMT0NLV0lTRTp7Y29uZmlndXJhYmxlOiEwfSxOT05FOntjb25maWd1cmFibGU6ITB9fTtScC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUnAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFJwfSxScC50b0RlZ3JlZXM9ZnVuY3Rpb24odCl7cmV0dXJuIDE4MCp0L01hdGguUEl9LFJwLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtmb3IoO3Q+TWF0aC5QSTspdC09UnAuUElfVElNRVNfMjtmb3IoO3Q8PS1NYXRoLlBJOyl0Kz1ScC5QSV9USU1FU18yO3JldHVybiB0fSxScC5hbmdsZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIE1hdGguYXRhbjIodC55LHQueCl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPW4ueC1lLngsaT1uLnktZS55O3JldHVybiBNYXRoLmF0YW4yKGkscil9fSxScC5pc0FjdXRlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LngtZS54LGk9dC55LWUueTtyZXR1cm4gcioobi54LWUueCkraSoobi55LWUueSk+MH0sUnAuaXNPYnR1c2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQueC1lLngsaT10LnktZS55O3JldHVybiByKihuLngtZS54KStpKihuLnktZS55KTwwfSxScC5pbnRlcmlvckFuZ2xlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1ScC5hbmdsZShlLHQpLGk9UnAuYW5nbGUoZSxuKTtyZXR1cm4gTWF0aC5hYnMoaS1yKX0sUnAubm9ybWFsaXplUG9zaXRpdmU9ZnVuY3Rpb24odCl7aWYodDwwKXtmb3IoO3Q8MDspdCs9UnAuUElfVElNRVNfMjt0Pj1ScC5QSV9USU1FU18yJiYodD0wKX1lbHNle2Zvcig7dD49UnAuUElfVElNRVNfMjspdC09UnAuUElfVElNRVNfMjt0PDAmJih0PTApfXJldHVybiB0fSxScC5hbmdsZUJldHdlZW49ZnVuY3Rpb24odCxlLG4pe3ZhciByPVJwLmFuZ2xlKGUsdCksaT1ScC5hbmdsZShlLG4pO3JldHVybiBScC5kaWZmKHIsaSl9LFJwLmRpZmY9ZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsO3JldHVybihuPXQ8ZT9lLXQ6dC1lKT5NYXRoLlBJJiYobj0yKk1hdGguUEktbiksbn0sUnAudG9SYWRpYW5zPWZ1bmN0aW9uKHQpe3JldHVybiB0Kk1hdGguUEkvMTgwfSxScC5nZXRUdXJuPWZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zaW4oZS10KTtyZXR1cm4gbj4wP1JwLkNPVU5URVJDTE9DS1dJU0U6bjwwP1JwLkNMT0NLV0lTRTpScC5OT05FfSxScC5hbmdsZUJldHdlZW5PcmllbnRlZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9UnAuYW5nbGUoZSx0KSxpPVJwLmFuZ2xlKGUsbiktcjtyZXR1cm4gaTw9LU1hdGguUEk/aStScC5QSV9USU1FU18yOmk+TWF0aC5QST9pLVJwLlBJX1RJTUVTXzI6aX0sVHAuUElfVElNRVNfMi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMipNYXRoLlBJfSxUcC5QSV9PVkVSXzIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguUEkvMn0sVHAuUElfT1ZFUl80LmdldD1mdW5jdGlvbigpe3JldHVybiBNYXRoLlBJLzR9LFRwLkNPVU5URVJDTE9DS1dJU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFhsLkNPVU5URVJDTE9DS1dJU0V9LFRwLkNMT0NLV0lTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gWGwuQ0xPQ0tXSVNFfSxUcC5OT05FLmdldD1mdW5jdGlvbigpe3JldHVybiBYbC5DT0xMSU5FQVJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJwLFRwKTt2YXIgQXA9ZnVuY3Rpb24gdCgpe3RoaXMuX21heEN1cnZlU2VnbWVudEVycm9yPTAsdGhpcy5fZmlsbGV0QW5nbGVRdWFudHVtPW51bGwsdGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcj0xLHRoaXMuX3NlZ0xpc3Q9bnVsbCx0aGlzLl9kaXN0YW5jZT0wLHRoaXMuX3ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fYnVmUGFyYW1zPW51bGwsdGhpcy5fbGk9bnVsbCx0aGlzLl9zMD1udWxsLHRoaXMuX3MxPW51bGwsdGhpcy5fczI9bnVsbCx0aGlzLl9zZWcwPW5ldyB2cCx0aGlzLl9zZWcxPW5ldyB2cCx0aGlzLl9vZmZzZXQwPW5ldyB2cCx0aGlzLl9vZmZzZXQxPW5ldyB2cCx0aGlzLl9zaWRlPTAsdGhpcy5faGFzTmFycm93Q29uY2F2ZUFuZ2xlPSExO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9wcmVjaXNpb25Nb2RlbD1lLHRoaXMuX2J1ZlBhcmFtcz1uLHRoaXMuX2xpPW5ldyBqbCx0aGlzLl9maWxsZXRBbmdsZVF1YW50dW09TWF0aC5QSS8yL24uZ2V0UXVhZHJhbnRTZWdtZW50cygpLG4uZ2V0UXVhZHJhbnRTZWdtZW50cygpPj04JiZuLmdldEpvaW5TdHlsZSgpPT09U3AuSk9JTl9ST1VORCYmKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3I9dC5NQVhfQ0xPU0lOR19TRUdfTEVOX0ZBQ1RPUiksdGhpcy5pbml0KHIpfSxEcD17T0ZGU0VUX1NFR01FTlRfU0VQQVJBVElPTl9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH0sSU5TSURFX1RVUk5fVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SOntjb25maWd1cmFibGU6ITB9LENVUlZFX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfSxNQVhfQ0xPU0lOR19TRUdfTEVOX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfX07QXAucHJvdG90eXBlLmFkZE5leHRTZWdtZW50PWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fczA9dGhpcy5fczEsdGhpcy5fczE9dGhpcy5fczIsdGhpcy5fczI9dCx0aGlzLl9zZWcwLnNldENvb3JkaW5hdGVzKHRoaXMuX3MwLHRoaXMuX3MxKSx0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KHRoaXMuX3NlZzAsdGhpcy5fc2lkZSx0aGlzLl9kaXN0YW5jZSx0aGlzLl9vZmZzZXQwKSx0aGlzLl9zZWcxLnNldENvb3JkaW5hdGVzKHRoaXMuX3MxLHRoaXMuX3MyKSx0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KHRoaXMuX3NlZzEsdGhpcy5fc2lkZSx0aGlzLl9kaXN0YW5jZSx0aGlzLl9vZmZzZXQxKSx0aGlzLl9zMS5lcXVhbHModGhpcy5fczIpKXJldHVybiBudWxsO3ZhciBuPVhsLmNvbXB1dGVPcmllbnRhdGlvbih0aGlzLl9zMCx0aGlzLl9zMSx0aGlzLl9zMikscj1uPT09WGwuQ0xPQ0tXSVNFJiZ0aGlzLl9zaWRlPT09U2guTEVGVHx8bj09PVhsLkNPVU5URVJDTE9DS1dJU0UmJnRoaXMuX3NpZGU9PT1TaC5SSUdIVDswPT09bj90aGlzLmFkZENvbGxpbmVhcihlKTpyP3RoaXMuYWRkT3V0c2lkZVR1cm4obixlKTp0aGlzLmFkZEluc2lkZVR1cm4obixlKX0sQXAucHJvdG90eXBlLmFkZExpbmVFbmRDYXA9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgdnAodCxlKSxyPW5ldyB2cDt0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KG4sU2guTEVGVCx0aGlzLl9kaXN0YW5jZSxyKTt2YXIgaT1uZXcgdnA7dGhpcy5jb21wdXRlT2Zmc2V0U2VnbWVudChuLFNoLlJJR0hULHRoaXMuX2Rpc3RhbmNlLGkpO3ZhciBvPWUueC10Lngscz1lLnktdC55LGE9TWF0aC5hdGFuMihzLG8pO3N3aXRjaCh0aGlzLl9idWZQYXJhbXMuZ2V0RW5kQ2FwU3R5bGUoKSl7Y2FzZSBTcC5DQVBfUk9VTkQ6dGhpcy5fc2VnTGlzdC5hZGRQdChyLnAxKSx0aGlzLmFkZEZpbGxldEFyYyhlLGErTWF0aC5QSS8yLGEtTWF0aC5QSS8yLFhsLkNMT0NLV0lTRSx0aGlzLl9kaXN0YW5jZSksdGhpcy5fc2VnTGlzdC5hZGRQdChpLnAxKTticmVhaztjYXNlIFNwLkNBUF9GTEFUOnRoaXMuX3NlZ0xpc3QuYWRkUHQoci5wMSksdGhpcy5fc2VnTGlzdC5hZGRQdChpLnAxKTticmVhaztjYXNlIFNwLkNBUF9TUVVBUkU6dmFyIHU9bmV3IHVsO3UueD1NYXRoLmFicyh0aGlzLl9kaXN0YW5jZSkqTWF0aC5jb3MoYSksdS55PU1hdGguYWJzKHRoaXMuX2Rpc3RhbmNlKSpNYXRoLnNpbihhKTt2YXIgbD1uZXcgdWwoci5wMS54K3UueCxyLnAxLnkrdS55KSxjPW5ldyB1bChpLnAxLngrdS54LGkucDEueSt1LnkpO3RoaXMuX3NlZ0xpc3QuYWRkUHQobCksdGhpcy5fc2VnTGlzdC5hZGRQdChjKX19LEFwLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWdMaXN0LmdldENvb3JkaW5hdGVzKCl9LEFwLnByb3RvdHlwZS5hZGRNaXRyZUpvaW49ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ITAsbz1udWxsO3RyeXtvPU1sLmludGVyc2VjdGlvbihlLnAwLGUucDEsbi5wMCxuLnAxKSwocjw9MD8xOm8uZGlzdGFuY2UodCkvTWF0aC5hYnMocikpPnRoaXMuX2J1ZlBhcmFtcy5nZXRNaXRyZUxpbWl0KCkmJihpPSExKX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBDbCkpdGhyb3cgdDtvPW5ldyB1bCgwLDApLGk9ITF9aT90aGlzLl9zZWdMaXN0LmFkZFB0KG8pOnRoaXMuYWRkTGltaXRlZE1pdHJlSm9pbihlLG4scix0aGlzLl9idWZQYXJhbXMuZ2V0TWl0cmVMaW1pdCgpKX0sQXAucHJvdG90eXBlLmFkZEZpbGxldENvcm5lcj1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPWUueC10Lngscz1lLnktdC55LGE9TWF0aC5hdGFuMihzLG8pLHU9bi54LXQueCxsPW4ueS10LnksYz1NYXRoLmF0YW4yKGwsdSk7cj09PVhsLkNMT0NLV0lTRT9hPD1jJiYoYSs9MipNYXRoLlBJKTphPj1jJiYoYS09MipNYXRoLlBJKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGUpLHRoaXMuYWRkRmlsbGV0QXJjKHQsYSxjLHIsaSksdGhpcy5fc2VnTGlzdC5hZGRQdChuKX0sQXAucHJvdG90eXBlLmFkZE91dHNpZGVUdXJuPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fb2Zmc2V0MC5wMS5kaXN0YW5jZSh0aGlzLl9vZmZzZXQxLnAwKTx0aGlzLl9kaXN0YW5jZSpBcC5PRkZTRVRfU0VHTUVOVF9TRVBBUkFUSU9OX0ZBQ1RPUilyZXR1cm4gdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQwLnAxKSxudWxsO3RoaXMuX2J1ZlBhcmFtcy5nZXRKb2luU3R5bGUoKT09PVNwLkpPSU5fTUlUUkU/dGhpcy5hZGRNaXRyZUpvaW4odGhpcy5fczEsdGhpcy5fb2Zmc2V0MCx0aGlzLl9vZmZzZXQxLHRoaXMuX2Rpc3RhbmNlKTp0aGlzLl9idWZQYXJhbXMuZ2V0Sm9pblN0eWxlKCk9PT1TcC5KT0lOX0JFVkVMP3RoaXMuYWRkQmV2ZWxKb2luKHRoaXMuX29mZnNldDAsdGhpcy5fb2Zmc2V0MSk6KGUmJnRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSksdGhpcy5hZGRGaWxsZXRDb3JuZXIodGhpcy5fczEsdGhpcy5fb2Zmc2V0MC5wMSx0aGlzLl9vZmZzZXQxLnAwLHQsdGhpcy5fZGlzdGFuY2UpLHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MS5wMCkpfSxBcC5wcm90b3R5cGUuY3JlYXRlU3F1YXJlPWZ1bmN0aW9uKHQpe3RoaXMuX3NlZ0xpc3QuYWRkUHQobmV3IHVsKHQueCt0aGlzLl9kaXN0YW5jZSx0LnkrdGhpcy5fZGlzdGFuY2UpKSx0aGlzLl9zZWdMaXN0LmFkZFB0KG5ldyB1bCh0LngrdGhpcy5fZGlzdGFuY2UsdC55LXRoaXMuX2Rpc3RhbmNlKSksdGhpcy5fc2VnTGlzdC5hZGRQdChuZXcgdWwodC54LXRoaXMuX2Rpc3RhbmNlLHQueS10aGlzLl9kaXN0YW5jZSkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQobmV3IHVsKHQueC10aGlzLl9kaXN0YW5jZSx0LnkrdGhpcy5fZGlzdGFuY2UpKSx0aGlzLl9zZWdMaXN0LmNsb3NlUmluZygpfSxBcC5wcm90b3R5cGUuYWRkU2VnbWVudHM9ZnVuY3Rpb24odCxlKXt0aGlzLl9zZWdMaXN0LmFkZFB0cyh0LGUpfSxBcC5wcm90b3R5cGUuYWRkRmlyc3RTZWdtZW50PWZ1bmN0aW9uKCl7dGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAwKX0sQXAucHJvdG90eXBlLmFkZExhc3RTZWdtZW50PWZ1bmN0aW9uKCl7dGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAxKX0sQXAucHJvdG90eXBlLmluaXRTaWRlU2VnbWVudHM9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX3MxPXQsdGhpcy5fczI9ZSx0aGlzLl9zaWRlPW4sdGhpcy5fc2VnMS5zZXRDb29yZGluYXRlcyh0LGUpLHRoaXMuY29tcHV0ZU9mZnNldFNlZ21lbnQodGhpcy5fc2VnMSxuLHRoaXMuX2Rpc3RhbmNlLHRoaXMuX29mZnNldDEpfSxBcC5wcm90b3R5cGUuYWRkTGltaXRlZE1pdHJlSm9pbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLl9zZWcwLnAxLG89UnAuYW5nbGUoaSx0aGlzLl9zZWcwLnAwKSxzPVJwLmFuZ2xlQmV0d2Vlbk9yaWVudGVkKHRoaXMuX3NlZzAucDAsaSx0aGlzLl9zZWcxLnAxKS8yLGE9UnAubm9ybWFsaXplKG8rcyksdT1ScC5ub3JtYWxpemUoYStNYXRoLlBJKSxsPXIqbixjPW4tbCpNYXRoLmFicyhNYXRoLnNpbihzKSksaD1pLngrbCpNYXRoLmNvcyh1KSxwPWkueStsKk1hdGguc2luKHUpLGY9bmV3IHVsKGgscCksZz1uZXcgdnAoaSxmKSxkPWcucG9pbnRBbG9uZ09mZnNldCgxLGMpLHk9Zy5wb2ludEFsb25nT2Zmc2V0KDEsLWMpO3RoaXMuX3NpZGU9PT1TaC5MRUZUPyh0aGlzLl9zZWdMaXN0LmFkZFB0KGQpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoeSkpOih0aGlzLl9zZWdMaXN0LmFkZFB0KHkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoZCkpfSxBcC5wcm90b3R5cGUuY29tcHV0ZU9mZnNldFNlZ21lbnQ9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ZT09PVNoLkxFRlQ/MTotMSxvPXQucDEueC10LnAwLngscz10LnAxLnktdC5wMC55LGE9TWF0aC5zcXJ0KG8qbytzKnMpLHU9aSpuKm8vYSxsPWkqbipzL2E7ci5wMC54PXQucDAueC1sLHIucDAueT10LnAwLnkrdSxyLnAxLng9dC5wMS54LWwsci5wMS55PXQucDEueSt1fSxBcC5wcm90b3R5cGUuYWRkRmlsbGV0QXJjPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89cj09PVhsLkNMT0NLV0lTRT8tMToxLHM9TWF0aC5hYnMoZS1uKSxhPU1hdGgudHJ1bmMocy90aGlzLl9maWxsZXRBbmdsZVF1YW50dW0rLjUpO2lmKGE8MSlyZXR1cm4gbnVsbDtmb3IodmFyIHU9cy9hLGw9MCxjPW5ldyB1bDtsPHM7KXt2YXIgaD1lK28qbDtjLng9dC54K2kqTWF0aC5jb3MoaCksYy55PXQueStpKk1hdGguc2luKGgpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoYyksbCs9dX19LEFwLnByb3RvdHlwZS5hZGRJbnNpZGVUdXJuPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0aGlzLl9vZmZzZXQwLnAwLHRoaXMuX29mZnNldDAucDEsdGhpcy5fb2Zmc2V0MS5wMCx0aGlzLl9vZmZzZXQxLnAxKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSl0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX2xpLmdldEludGVyc2VjdGlvbigwKSk7ZWxzZSBpZih0aGlzLl9oYXNOYXJyb3dDb25jYXZlQW5nbGU9ITAsdGhpcy5fb2Zmc2V0MC5wMS5kaXN0YW5jZSh0aGlzLl9vZmZzZXQxLnAwKTx0aGlzLl9kaXN0YW5jZSpBcC5JTlNJREVfVFVSTl9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1IpdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQwLnAxKTtlbHNle2lmKHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSksdGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcj4wKXt2YXIgbj1uZXcgdWwoKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IqdGhpcy5fb2Zmc2V0MC5wMS54K3RoaXMuX3MxLngpLyh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKzEpLCh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKnRoaXMuX29mZnNldDAucDEueSt0aGlzLl9zMS55KS8odGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3RvcisxKSk7dGhpcy5fc2VnTGlzdC5hZGRQdChuKTt2YXIgcj1uZXcgdWwoKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IqdGhpcy5fb2Zmc2V0MS5wMC54K3RoaXMuX3MxLngpLyh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKzEpLCh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKnRoaXMuX29mZnNldDEucDAueSt0aGlzLl9zMS55KS8odGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3RvcisxKSk7dGhpcy5fc2VnTGlzdC5hZGRQdChyKX1lbHNlIHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fczEpO3RoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MS5wMCl9fSxBcC5wcm90b3R5cGUuY3JlYXRlQ2lyY2xlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB1bCh0LngrdGhpcy5fZGlzdGFuY2UsdC55KTt0aGlzLl9zZWdMaXN0LmFkZFB0KGUpLHRoaXMuYWRkRmlsbGV0QXJjKHQsMCwyKk1hdGguUEksLTEsdGhpcy5fZGlzdGFuY2UpLHRoaXMuX3NlZ0xpc3QuY2xvc2VSaW5nKCl9LEFwLnByb3RvdHlwZS5hZGRCZXZlbEpvaW49ZnVuY3Rpb24odCxlKXt0aGlzLl9zZWdMaXN0LmFkZFB0KHQucDEpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoZS5wMCl9LEFwLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3RhbmNlPXQsdGhpcy5fbWF4Q3VydmVTZWdtZW50RXJyb3I9dCooMS1NYXRoLmNvcyh0aGlzLl9maWxsZXRBbmdsZVF1YW50dW0vMikpLHRoaXMuX3NlZ0xpc3Q9bmV3IExwLHRoaXMuX3NlZ0xpc3Quc2V0UHJlY2lzaW9uTW9kZWwodGhpcy5fcHJlY2lzaW9uTW9kZWwpLHRoaXMuX3NlZ0xpc3Quc2V0TWluaW11bVZlcnRleERpc3RhbmNlKHQqQXAuQ1VSVkVfVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SKX0sQXAucHJvdG90eXBlLmFkZENvbGxpbmVhcj1mdW5jdGlvbih0KXt0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHRoaXMuX3MwLHRoaXMuX3MxLHRoaXMuX3MxLHRoaXMuX3MyKSx0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKT49MiYmKHRoaXMuX2J1ZlBhcmFtcy5nZXRKb2luU3R5bGUoKT09PVNwLkpPSU5fQkVWRUx8fHRoaXMuX2J1ZlBhcmFtcy5nZXRKb2luU3R5bGUoKT09PVNwLkpPSU5fTUlUUkU/KHQmJnRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSksdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAwKSk6dGhpcy5hZGRGaWxsZXRDb3JuZXIodGhpcy5fczEsdGhpcy5fb2Zmc2V0MC5wMSx0aGlzLl9vZmZzZXQxLnAwLFhsLkNMT0NLV0lTRSx0aGlzLl9kaXN0YW5jZSkpfSxBcC5wcm90b3R5cGUuY2xvc2VSaW5nPWZ1bmN0aW9uKCl7dGhpcy5fc2VnTGlzdC5jbG9zZVJpbmcoKX0sQXAucHJvdG90eXBlLmhhc05hcnJvd0NvbmNhdmVBbmdsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNOYXJyb3dDb25jYXZlQW5nbGV9LEFwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxBcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQXB9LERwLk9GRlNFVF9TRUdNRU5UX1NFUEFSQVRJT05fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybi4wMDF9LERwLklOU0lERV9UVVJOX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDAxfSxEcC5DVVJWRV9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTZ9LERwLk1BWF9DTE9TSU5HX1NFR19MRU5fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybiA4MH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQXAsRHApO3ZhciBGcD1mdW5jdGlvbigpe3RoaXMuX2Rpc3RhbmNlPTAsdGhpcy5fcHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9idWZQYXJhbXM9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fcHJlY2lzaW9uTW9kZWw9dCx0aGlzLl9idWZQYXJhbXM9ZX07RnAucHJvdG90eXBlLmdldE9mZnNldEN1cnZlPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fZGlzdGFuY2U9ZSwwPT09ZSlyZXR1cm4gbnVsbDt2YXIgbj1lPDAscj1NYXRoLmFicyhlKSxpPXRoaXMuZ2V0U2VnR2VuKHIpO3QubGVuZ3RoPD0xP3RoaXMuY29tcHV0ZVBvaW50Q3VydmUodFswXSxpKTp0aGlzLmNvbXB1dGVPZmZzZXRDdXJ2ZSh0LG4saSk7dmFyIG89aS5nZXRDb29yZGluYXRlcygpO3JldHVybiBuJiZwYy5yZXZlcnNlKG8pLG99LEZwLnByb3RvdHlwZS5jb21wdXRlU2luZ2xlU2lkZWRCdWZmZXJDdXJ2ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5zaW1wbGlmeVRvbGVyYW5jZSh0aGlzLl9kaXN0YW5jZSk7aWYoZSl7bi5hZGRTZWdtZW50cyh0LCEwKTt2YXIgaT1QcC5zaW1wbGlmeSh0LC1yKSxvPWkubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGlbb10saVtvLTFdLFNoLkxFRlQpLG4uYWRkRmlyc3RTZWdtZW50KCk7Zm9yKHZhciBzPW8tMjtzPj0wO3MtLSluLmFkZE5leHRTZWdtZW50KGlbc10sITApfWVsc2V7bi5hZGRTZWdtZW50cyh0LCExKTt2YXIgYT1QcC5zaW1wbGlmeSh0LHIpLHU9YS5sZW5ndGgtMTtuLmluaXRTaWRlU2VnbWVudHMoYVswXSxhWzFdLFNoLkxFRlQpLG4uYWRkRmlyc3RTZWdtZW50KCk7Zm9yKHZhciBsPTI7bDw9dTtsKyspbi5hZGROZXh0U2VnbWVudChhW2xdLCEwKX1uLmFkZExhc3RTZWdtZW50KCksbi5jbG9zZVJpbmcoKX0sRnAucHJvdG90eXBlLmNvbXB1dGVSaW5nQnVmZmVyQ3VydmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuc2ltcGxpZnlUb2xlcmFuY2UodGhpcy5fZGlzdGFuY2UpO2U9PT1TaC5SSUdIVCYmKHI9LXIpO3ZhciBpPVBwLnNpbXBsaWZ5KHQsciksbz1pLmxlbmd0aC0xO24uaW5pdFNpZGVTZWdtZW50cyhpW28tMV0saVswXSxlKTtmb3IodmFyIHM9MTtzPD1vO3MrKyl7dmFyIGE9MSE9PXM7bi5hZGROZXh0U2VnbWVudChpW3NdLGEpfW4uY2xvc2VSaW5nKCl9LEZwLnByb3RvdHlwZS5jb21wdXRlTGluZUJ1ZmZlckN1cnZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5zaW1wbGlmeVRvbGVyYW5jZSh0aGlzLl9kaXN0YW5jZSkscj1QcC5zaW1wbGlmeSh0LG4pLGk9ci5sZW5ndGgtMTtlLmluaXRTaWRlU2VnbWVudHMoclswXSxyWzFdLFNoLkxFRlQpO2Zvcih2YXIgbz0yO288PWk7bysrKWUuYWRkTmV4dFNlZ21lbnQocltvXSwhMCk7ZS5hZGRMYXN0U2VnbWVudCgpLGUuYWRkTGluZUVuZENhcChyW2ktMV0scltpXSk7dmFyIHM9UHAuc2ltcGxpZnkodCwtbiksYT1zLmxlbmd0aC0xO2UuaW5pdFNpZGVTZWdtZW50cyhzW2FdLHNbYS0xXSxTaC5MRUZUKTtmb3IodmFyIHU9YS0yO3U+PTA7dS0tKWUuYWRkTmV4dFNlZ21lbnQoc1t1XSwhMCk7ZS5hZGRMYXN0U2VnbWVudCgpLGUuYWRkTGluZUVuZENhcChzWzFdLHNbMF0pLGUuY2xvc2VSaW5nKCl9LEZwLnByb3RvdHlwZS5jb21wdXRlUG9pbnRDdXJ2ZT1mdW5jdGlvbih0LGUpe3N3aXRjaCh0aGlzLl9idWZQYXJhbXMuZ2V0RW5kQ2FwU3R5bGUoKSl7Y2FzZSBTcC5DQVBfUk9VTkQ6ZS5jcmVhdGVDaXJjbGUodCk7YnJlYWs7Y2FzZSBTcC5DQVBfU1FVQVJFOmUuY3JlYXRlU3F1YXJlKHQpfX0sRnAucHJvdG90eXBlLmdldExpbmVDdXJ2ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2Rpc3RhbmNlPWUsZTwwJiYhdGhpcy5fYnVmUGFyYW1zLmlzU2luZ2xlU2lkZWQoKSlyZXR1cm4gbnVsbDtpZigwPT09ZSlyZXR1cm4gbnVsbDt2YXIgbj1NYXRoLmFicyhlKSxyPXRoaXMuZ2V0U2VnR2VuKG4pO2lmKHQubGVuZ3RoPD0xKXRoaXMuY29tcHV0ZVBvaW50Q3VydmUodFswXSxyKTtlbHNlIGlmKHRoaXMuX2J1ZlBhcmFtcy5pc1NpbmdsZVNpZGVkKCkpe3ZhciBpPWU8MDt0aGlzLmNvbXB1dGVTaW5nbGVTaWRlZEJ1ZmZlckN1cnZlKHQsaSxyKX1lbHNlIHRoaXMuY29tcHV0ZUxpbmVCdWZmZXJDdXJ2ZSh0LHIpO3JldHVybiByLmdldENvb3JkaW5hdGVzKCl9LEZwLnByb3RvdHlwZS5nZXRCdWZmZXJQYXJhbWV0ZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1ZlBhcmFtc30sRnAucHJvdG90eXBlLnNpbXBsaWZ5VG9sZXJhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuX2J1ZlBhcmFtcy5nZXRTaW1wbGlmeUZhY3RvcigpfSxGcC5wcm90b3R5cGUuZ2V0UmluZ0N1cnZlPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLl9kaXN0YW5jZT1uLHQubGVuZ3RoPD0yKXJldHVybiB0aGlzLmdldExpbmVDdXJ2ZSh0LG4pO2lmKDA9PT1uKXJldHVybiBGcC5jb3B5Q29vcmRpbmF0ZXModCk7dmFyIHI9dGhpcy5nZXRTZWdHZW4obik7cmV0dXJuIHRoaXMuY29tcHV0ZVJpbmdCdWZmZXJDdXJ2ZSh0LGUsciksci5nZXRDb29yZGluYXRlcygpfSxGcC5wcm90b3R5cGUuY29tcHV0ZU9mZnNldEN1cnZlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnNpbXBsaWZ5VG9sZXJhbmNlKHRoaXMuX2Rpc3RhbmNlKTtpZihlKXt2YXIgaT1QcC5zaW1wbGlmeSh0LC1yKSxvPWkubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGlbb10saVtvLTFdLFNoLkxFRlQpLG4uYWRkRmlyc3RTZWdtZW50KCk7Zm9yKHZhciBzPW8tMjtzPj0wO3MtLSluLmFkZE5leHRTZWdtZW50KGlbc10sITApfWVsc2V7dmFyIGE9UHAuc2ltcGxpZnkodCxyKSx1PWEubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGFbMF0sYVsxXSxTaC5MRUZUKSxuLmFkZEZpcnN0U2VnbWVudCgpO2Zvcih2YXIgbD0yO2w8PXU7bCsrKW4uYWRkTmV4dFNlZ21lbnQoYVtsXSwhMCl9bi5hZGRMYXN0U2VnbWVudCgpfSxGcC5wcm90b3R5cGUuZ2V0U2VnR2VuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQXAodGhpcy5fcHJlY2lzaW9uTW9kZWwsdGhpcy5fYnVmUGFyYW1zLHQpfSxGcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRnAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEZwfSxGcC5jb3B5Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT1uZXcgdWwodFtuXSk7cmV0dXJuIGV9O3ZhciBrcD1mdW5jdGlvbigpe3RoaXMuX3N1YmdyYXBocz1udWxsLHRoaXMuX3NlZz1uZXcgdnAsdGhpcy5fY2dhPW5ldyBYbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fc3ViZ3JhcGhzPXR9LEdwPXtEZXB0aFNlZ21lbnQ6e2NvbmZpZ3VyYWJsZTohMH19O2twLnByb3RvdHlwZS5maW5kU3RhYmJlZFNlZ21lbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPW5ldyBsYyxyPXRoaXMuX3N1YmdyYXBocy5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCksbz1pLmdldEVudmVsb3BlKCk7ZS55PG8uZ2V0TWluWSgpfHxlLnk+by5nZXRNYXhZKCl8fHQuZmluZFN0YWJiZWRTZWdtZW50cyhlLGkuZ2V0RGlyZWN0ZWRFZGdlcygpLG4pfXJldHVybiBufWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKWlmKGdsKGFyZ3VtZW50c1syXSxhYykmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgWGgpZm9yKHZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXSx1PWFyZ3VtZW50c1syXSxsPWEuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCksYz0wO2M8bC5sZW5ndGgtMTtjKyspe3QuX3NlZy5wMD1sW2NdLHQuX3NlZy5wMT1sW2MrMV0sdC5fc2VnLnAwLnk+dC5fc2VnLnAxLnkmJnQuX3NlZy5yZXZlcnNlKCk7dmFyIGg9TWF0aC5tYXgodC5fc2VnLnAwLngsdC5fc2VnLnAxLngpO2lmKCEoaDxzLngpJiYhKHQuX3NlZy5pc0hvcml6b250YWwoKXx8cy55PHQuX3NlZy5wMC55fHxzLnk+dC5fc2VnLnAxLnl8fFhsLmNvbXB1dGVPcmllbnRhdGlvbih0Ll9zZWcucDAsdC5fc2VnLnAxLHMpPT09WGwuUklHSFQpKXt2YXIgcD1hLmdldERlcHRoKFNoLkxFRlQpO3QuX3NlZy5wMC5lcXVhbHMobFtjXSl8fChwPWEuZ2V0RGVwdGgoU2guUklHSFQpKTt2YXIgZj1uZXcgcXAodC5fc2VnLHApO3UuYWRkKGYpfX1lbHNlIGlmKGdsKGFyZ3VtZW50c1syXSxhYykmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwmJmdsKGFyZ3VtZW50c1sxXSxhYykpZm9yKHZhciBnPWFyZ3VtZW50c1swXSxkPWFyZ3VtZW50c1sxXSx5PWFyZ3VtZW50c1syXSx2PWQuaXRlcmF0b3IoKTt2Lmhhc05leHQoKTspe3ZhciBfPXYubmV4dCgpO18uaXNGb3J3YXJkKCkmJnQuZmluZFN0YWJiZWRTZWdtZW50cyhnLF8seSl9fSxrcC5wcm90b3R5cGUuZ2V0RGVwdGg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5maW5kU3RhYmJlZFNlZ21lbnRzKHQpO3JldHVybiAwPT09ZS5zaXplKCk/MDpucC5taW4oZSkuX2xlZnREZXB0aH0sa3AucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGtwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBrcH0sR3AuRGVwdGhTZWdtZW50LmdldD1mdW5jdGlvbigpe3JldHVybiBxcH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoa3AsR3ApO3ZhciBxcD1mdW5jdGlvbigpe3RoaXMuX3Vwd2FyZFNlZz1udWxsLHRoaXMuX2xlZnREZXB0aD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl91cHdhcmRTZWc9bmV3IHZwKHQpLHRoaXMuX2xlZnREZXB0aD1lfTtxcC5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7aWYodGhpcy5fdXB3YXJkU2VnLm1pblgoKT49ZS5fdXB3YXJkU2VnLm1heFgoKSlyZXR1cm4gMTtpZih0aGlzLl91cHdhcmRTZWcubWF4WCgpPD1lLl91cHdhcmRTZWcubWluWCgpKXJldHVybi0xO3ZhciBuPXRoaXMuX3Vwd2FyZFNlZy5vcmllbnRhdGlvbkluZGV4KGUuX3Vwd2FyZFNlZyk7cmV0dXJuIDAhPT1ufHwwIT09KG49LTEqZS5fdXB3YXJkU2VnLm9yaWVudGF0aW9uSW5kZXgodGhpcy5fdXB3YXJkU2VnKSk/bjp0aGlzLl91cHdhcmRTZWcuY29tcGFyZVRvKGUuX3Vwd2FyZFNlZyl9LHFwLnByb3RvdHlwZS5jb21wYXJlWD1mdW5jdGlvbih0LGUpe3ZhciBuPXQucDAuY29tcGFyZVRvKGUucDApO3JldHVybiAwIT09bj9uOnQucDEuY29tcGFyZVRvKGUucDEpfSxxcC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXB3YXJkU2VnLnRvU3RyaW5nKCl9LHFwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpbF19LHFwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxcH07dmFyIEJwPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLnAwPXR8fG51bGwsdGhpcy5wMT1lfHxudWxsLHRoaXMucDI9bnx8bnVsbH07QnAucHJvdG90eXBlLmFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gQnAuYXJlYSh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LEJwLnByb3RvdHlwZS5zaWduZWRBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIEJwLnNpZ25lZEFyZWEodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxCcC5wcm90b3R5cGUuaW50ZXJwb2xhdGVaPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXRocm93IG5ldyBlbCgiU3VwcGxpZWQgcG9pbnQgaXMgbnVsbC4iKTtyZXR1cm4gQnAuaW50ZXJwb2xhdGVaKHQsdGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxCcC5wcm90b3R5cGUubG9uZ2VzdFNpZGVMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gQnAubG9uZ2VzdFNpZGVMZW5ndGgodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxCcC5wcm90b3R5cGUuaXNBY3V0ZT1mdW5jdGlvbigpe3JldHVybiBCcC5pc0FjdXRlKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sQnAucHJvdG90eXBlLmNpcmN1bWNlbnRyZT1mdW5jdGlvbigpe3JldHVybiBCcC5jaXJjdW1jZW50cmUodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxCcC5wcm90b3R5cGUuYXJlYTNEPWZ1bmN0aW9uKCl7cmV0dXJuIEJwLmFyZWEzRCh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LEJwLnByb3RvdHlwZS5jZW50cm9pZD1mdW5jdGlvbigpe3JldHVybiBCcC5jZW50cm9pZCh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LEJwLnByb3RvdHlwZS5pbkNlbnRyZT1mdW5jdGlvbigpe3JldHVybiBCcC5pbkNlbnRyZSh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LEJwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxCcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQnB9LEJwLmFyZWE9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLmFicygoKG4ueC10LngpKihlLnktdC55KS0oZS54LXQueCkqKG4ueS10LnkpKS8yKX0sQnAuc2lnbmVkQXJlYT1mdW5jdGlvbih0LGUsbil7cmV0dXJuKChuLngtdC54KSooZS55LXQueSktKGUueC10LngpKihuLnktdC55KSkvMn0sQnAuZGV0PWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0KnItZSpufSxCcC5pbnRlcnBvbGF0ZVo9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ZS54LG89ZS55LHM9bi54LWksYT1yLngtaSx1PW4ueS1vLGw9ci55LW8sYz1zKmwtYSp1LGg9dC54LWkscD10LnktbyxmPShsKmgtYSpwKS9jLGc9KC11KmgrcypwKS9jO3JldHVybiBlLnorZioobi56LWUueikrZyooci56LWUueil9LEJwLmxvbmdlc3RTaWRlTGVuZ3RoPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmRpc3RhbmNlKGUpLGk9ZS5kaXN0YW5jZShuKSxvPW4uZGlzdGFuY2UodCkscz1yO3JldHVybiBpPnMmJihzPWkpLG8+cyYmKHM9byksc30sQnAuaXNBY3V0ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuISFScC5pc0FjdXRlKHQsZSxuKSYmKCEhUnAuaXNBY3V0ZShlLG4sdCkmJiEhUnAuaXNBY3V0ZShuLHQsZSkpfSxCcC5jaXJjdW1jZW50cmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4ueCxpPW4ueSxvPXQueC1yLHM9dC55LWksYT1lLngtcix1PWUueS1pLGw9MipCcC5kZXQobyxzLGEsdSksYz1CcC5kZXQocyxvKm8rcypzLHUsYSphK3UqdSksaD1CcC5kZXQobyxvKm8rcypzLGEsYSphK3UqdSk7cmV0dXJuIG5ldyB1bChyLWMvbCxpK2gvbCl9LEJwLnBlcnBlbmRpY3VsYXJCaXNlY3Rvcj1mdW5jdGlvbih0LGUpe3ZhciBuPWUueC10Lngscj1lLnktdC55LGk9bmV3IE1sKHQueCtuLzIsdC55K3IvMiwxKSxvPW5ldyBNbCh0LngtcituLzIsdC55K24rci8yLDEpO3JldHVybiBuZXcgTWwoaSxvKX0sQnAuYW5nbGVCaXNlY3Rvcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS5kaXN0YW5jZSh0KSxpPXIvKHIrZS5kaXN0YW5jZShuKSksbz1uLngtdC54LHM9bi55LXQueTtyZXR1cm4gbmV3IHVsKHQueCtpKm8sdC55K2kqcyl9LEJwLmFyZWEzRD1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS54LXQueCxpPWUueS10Lnksbz1lLnotdC56LHM9bi54LXQueCxhPW4ueS10LnksdT1uLnotdC56LGw9aSp1LW8qYSxjPW8qcy1yKnUsaD1yKmEtaSpzLHA9bCpsK2MqYytoKmgsZj1NYXRoLnNxcnQocCkvMjtyZXR1cm4gZn0sQnAuY2VudHJvaWQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPSh0LngrZS54K24ueCkvMyxpPSh0LnkrZS55K24ueSkvMztyZXR1cm4gbmV3IHVsKHIsaSl9LEJwLmluQ2VudHJlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmRpc3RhbmNlKG4pLGk9dC5kaXN0YW5jZShuKSxvPXQuZGlzdGFuY2UoZSkscz1yK2krbyxhPShyKnQueCtpKmUueCtvKm4ueCkvcyx1PShyKnQueStpKmUueStvKm4ueSkvcztyZXR1cm4gbmV3IHVsKGEsdSl9O3ZhciB6cD1mdW5jdGlvbigpe3RoaXMuX2lucHV0R2VvbT1udWxsLHRoaXMuX2Rpc3RhbmNlPW51bGwsdGhpcy5fY3VydmVCdWlsZGVyPW51bGwsdGhpcy5fY3VydmVMaXN0PW5ldyBsYzt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07dGhpcy5faW5wdXRHZW9tPXQsdGhpcy5fZGlzdGFuY2U9ZSx0aGlzLl9jdXJ2ZUJ1aWxkZXI9bn07enAucHJvdG90eXBlLmFkZFBvaW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2Rpc3RhbmNlPD0wKXJldHVybiBudWxsO3ZhciBlPXQuZ2V0Q29vcmRpbmF0ZXMoKSxuPXRoaXMuX2N1cnZlQnVpbGRlci5nZXRMaW5lQ3VydmUoZSx0aGlzLl9kaXN0YW5jZSk7dGhpcy5hZGRDdXJ2ZShuLHBsLkVYVEVSSU9SLHBsLklOVEVSSU9SKX0senAucHJvdG90eXBlLmFkZFBvbHlnb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuX2Rpc3RhbmNlLHI9U2guTEVGVDt0aGlzLl9kaXN0YW5jZTwwJiYobj0tdGhpcy5fZGlzdGFuY2Uscj1TaC5SSUdIVCk7dmFyIGk9dC5nZXRFeHRlcmlvclJpbmcoKSxvPXBjLnJlbW92ZVJlcGVhdGVkUG9pbnRzKGkuZ2V0Q29vcmRpbmF0ZXMoKSk7aWYodGhpcy5fZGlzdGFuY2U8MCYmdGhpcy5pc0Vyb2RlZENvbXBsZXRlbHkoaSx0aGlzLl9kaXN0YW5jZSkpcmV0dXJuIG51bGw7aWYodGhpcy5fZGlzdGFuY2U8PTAmJm8ubGVuZ3RoPDMpcmV0dXJuIG51bGw7dGhpcy5hZGRQb2x5Z29uUmluZyhvLG4scixwbC5FWFRFUklPUixwbC5JTlRFUklPUik7Zm9yKHZhciBzPTA7czx0LmdldE51bUludGVyaW9yUmluZygpO3MrKyl7dmFyIGE9dC5nZXRJbnRlcmlvclJpbmdOKHMpLHU9cGMucmVtb3ZlUmVwZWF0ZWRQb2ludHMoYS5nZXRDb29yZGluYXRlcygpKTtlLl9kaXN0YW5jZT4wJiZlLmlzRXJvZGVkQ29tcGxldGVseShhLC1lLl9kaXN0YW5jZSl8fGUuYWRkUG9seWdvblJpbmcodSxuLFNoLm9wcG9zaXRlKHIpLHBsLklOVEVSSU9SLHBsLkVYVEVSSU9SKX19LHpwLnByb3RvdHlwZS5pc1RyaWFuZ2xlRXJvZGVkQ29tcGxldGVseT1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBCcCh0WzBdLHRbMV0sdFsyXSkscj1uLmluQ2VudHJlKCk7cmV0dXJuIFhsLmRpc3RhbmNlUG9pbnRMaW5lKHIsbi5wMCxuLnAxKTxNYXRoLmFicyhlKX0senAucHJvdG90eXBlLmFkZExpbmVTdHJpbmc9ZnVuY3Rpb24odCl7aWYodGhpcy5fZGlzdGFuY2U8PTAmJiF0aGlzLl9jdXJ2ZUJ1aWxkZXIuZ2V0QnVmZmVyUGFyYW1ldGVycygpLmlzU2luZ2xlU2lkZWQoKSlyZXR1cm4gbnVsbDt2YXIgZT1wYy5yZW1vdmVSZXBlYXRlZFBvaW50cyh0LmdldENvb3JkaW5hdGVzKCkpLG49dGhpcy5fY3VydmVCdWlsZGVyLmdldExpbmVDdXJ2ZShlLHRoaXMuX2Rpc3RhbmNlKTt0aGlzLmFkZEN1cnZlKG4scGwuRVhURVJJT1IscGwuSU5URVJJT1IpfSx6cC5wcm90b3R5cGUuYWRkQ3VydmU9ZnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PT10fHx0Lmxlbmd0aDwyKXJldHVybiBudWxsO3ZhciByPW5ldyB5cCh0LG5ldyBEaCgwLHBsLkJPVU5EQVJZLGUsbikpO3RoaXMuX2N1cnZlTGlzdC5hZGQocil9LHpwLnByb3RvdHlwZS5nZXRDdXJ2ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGQodGhpcy5faW5wdXRHZW9tKSx0aGlzLl9jdXJ2ZUxpc3R9LHpwLnByb3RvdHlwZS5hZGRQb2x5Z29uUmluZz1mdW5jdGlvbih0LGUsbixyLGkpe2lmKDA9PT1lJiZ0Lmxlbmd0aDxuaC5NSU5JTVVNX1ZBTElEX1NJWkUpcmV0dXJuIG51bGw7dmFyIG89cixzPWk7dC5sZW5ndGg+PW5oLk1JTklNVU1fVkFMSURfU0laRSYmWGwuaXNDQ1codCkmJihvPWkscz1yLG49U2gub3Bwb3NpdGUobikpO3ZhciBhPXRoaXMuX2N1cnZlQnVpbGRlci5nZXRSaW5nQ3VydmUodCxuLGUpO3RoaXMuYWRkQ3VydmUoYSxvLHMpfSx6cC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2lmKHQuaXNFbXB0eSgpKXJldHVybiBudWxsO3QgaW5zdGFuY2VvZiB0aD90aGlzLmFkZFBvbHlnb24odCk6dCBpbnN0YW5jZW9mIFpjP3RoaXMuYWRkTGluZVN0cmluZyh0KTp0IGluc3RhbmNlb2YgUWM/dGhpcy5hZGRQb2ludCh0KToodCBpbnN0YW5jZW9mIGVofHx0IGluc3RhbmNlb2YgR2N8fHQgaW5zdGFuY2VvZiByaHx8dCBpbnN0YW5jZW9mIGtjKSYmdGhpcy5hZGRDb2xsZWN0aW9uKHQpfSx6cC5wcm90b3R5cGUuaXNFcm9kZWRDb21wbGV0ZWx5PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRDb29yZGluYXRlcygpO2lmKG4ubGVuZ3RoPDQpcmV0dXJuIGU8MDtpZig0PT09bi5sZW5ndGgpcmV0dXJuIHRoaXMuaXNUcmlhbmdsZUVyb2RlZENvbXBsZXRlbHkobixlKTt2YXIgcj10LmdldEVudmVsb3BlSW50ZXJuYWwoKSxpPU1hdGgubWluKHIuZ2V0SGVpZ2h0KCksci5nZXRXaWR0aCgpKTtyZXR1cm4gZTwwJiYyKk1hdGguYWJzKGUpPml9LHpwLnByb3RvdHlwZS5hZGRDb2xsZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5nZXROdW1HZW9tZXRyaWVzKCk7ZSsrKXt2YXIgbj10LmdldEdlb21ldHJ5TihlKTt0aGlzLmFkZChuKX19LHpwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx6cC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4genB9O3ZhciBqcD1mdW5jdGlvbigpe307anAucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0KXt9LGpwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxqcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4ganB9O3ZhciBVcD1mdW5jdGlvbigpe3RoaXMuX3BhcmVudD1udWxsLHRoaXMuX2F0U3RhcnQ9bnVsbCx0aGlzLl9tYXg9bnVsbCx0aGlzLl9pbmRleD1udWxsLHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcj1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9wYXJlbnQ9dCx0aGlzLl9hdFN0YXJ0PSEwLHRoaXMuX2luZGV4PTAsdGhpcy5fbWF4PXQuZ2V0TnVtR2VvbWV0cmllcygpfTtVcC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMuX2F0U3RhcnQpcmV0dXJuIHRoaXMuX2F0U3RhcnQ9ITEsVXAuaXNBdG9taWModGhpcy5fcGFyZW50KSYmdGhpcy5faW5kZXgrKyx0aGlzLl9wYXJlbnQ7aWYobnVsbCE9PXRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcil7aWYodGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yLmhhc05leHQoKSlyZXR1cm4gdGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yLm5leHQoKTt0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3I9bnVsbH1pZih0aGlzLl9pbmRleD49dGhpcy5fbWF4KXRocm93IG5ldyB1Yzt2YXIgdD10aGlzLl9wYXJlbnQuZ2V0R2VvbWV0cnlOKHRoaXMuX2luZGV4KyspO3JldHVybiB0IGluc3RhbmNlb2Yga2M/KHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcj1uZXcgVXAodCksdGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yLm5leHQoKSk6dH0sVXAucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKX0sVXAucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9hdFN0YXJ0KXJldHVybiEwO2lmKG51bGwhPT10aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3Ipe2lmKHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCkpcmV0dXJuITA7dGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yPW51bGx9cmV0dXJuISh0aGlzLl9pbmRleD49dGhpcy5fbWF4KX0sVXAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3NjXX0sVXAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFVwfSxVcC5pc0F0b21pYz1mdW5jdGlvbih0KXtyZXR1cm4hKHQgaW5zdGFuY2VvZiBrYyl9O3ZhciBWcD1mdW5jdGlvbigpe3RoaXMuX2dlb209bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZ2VvbT10fTtWcC5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBWcC5sb2NhdGUodCx0aGlzLl9nZW9tKX0sVnAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2pwXX0sVnAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFZwfSxWcC5pc1BvaW50SW5SaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuISFlLmdldEVudmVsb3BlSW50ZXJuYWwoKS5pbnRlcnNlY3RzKHQpJiZYbC5pc1BvaW50SW5SaW5nKHQsZS5nZXRDb29yZGluYXRlcygpKX0sVnAuY29udGFpbnNQb2ludEluUG9seWdvbj1mdW5jdGlvbih0LGUpe2lmKGUuaXNFbXB0eSgpKXJldHVybiExO3ZhciBuPWUuZ2V0RXh0ZXJpb3JSaW5nKCk7aWYoIVZwLmlzUG9pbnRJblJpbmcodCxuKSlyZXR1cm4hMTtmb3IodmFyIHI9MDtyPGUuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7cisrKXt2YXIgaT1lLmdldEludGVyaW9yUmluZ04ocik7aWYoVnAuaXNQb2ludEluUmluZyh0LGkpKXJldHVybiExfXJldHVybiEwfSxWcC5jb250YWluc1BvaW50PWZ1bmN0aW9uKHQsZSl7aWYoZSBpbnN0YW5jZW9mIHRoKXJldHVybiBWcC5jb250YWluc1BvaW50SW5Qb2x5Z29uKHQsZSk7aWYoZSBpbnN0YW5jZW9mIGtjKWZvcih2YXIgbj1uZXcgVXAoZSk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihyIT09ZSYmVnAuY29udGFpbnNQb2ludCh0LHIpKXJldHVybiEwfXJldHVybiExfSxWcC5sb2NhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5pc0VtcHR5KCk/cGwuRVhURVJJT1I6VnAuY29udGFpbnNQb2ludCh0LGUpP3BsLklOVEVSSU9SOnBsLkVYVEVSSU9SfTt2YXIgWHA9ZnVuY3Rpb24oKXt0aGlzLl9lZGdlTWFwPW5ldyBDYyx0aGlzLl9lZGdlTGlzdD1udWxsLHRoaXMuX3B0SW5BcmVhTG9jYXRpb249W3BsLk5PTkUscGwuTk9ORV19O1hwLnByb3RvdHlwZS5nZXROZXh0Q1c9ZnVuY3Rpb24odCl7dGhpcy5nZXRFZGdlcygpO3ZhciBlPXRoaXMuX2VkZ2VMaXN0LmluZGV4T2YodCksbj1lLTE7cmV0dXJuIDA9PT1lJiYobj10aGlzLl9lZGdlTGlzdC5zaXplKCktMSksdGhpcy5fZWRnZUxpc3QuZ2V0KG4pfSxYcC5wcm90b3R5cGUucHJvcGFnYXRlU2lkZUxhYmVscz1mdW5jdGlvbih0KXtmb3IodmFyIGU9cGwuTk9ORSxuPXRoaXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLmdldExhYmVsKCk7ci5pc0FyZWEodCkmJnIuZ2V0TG9jYXRpb24odCxTaC5MRUZUKSE9PXBsLk5PTkUmJihlPXIuZ2V0TG9jYXRpb24odCxTaC5MRUZUKSl9aWYoZT09PXBsLk5PTkUpcmV0dXJuIG51bGw7Zm9yKHZhciBpPWUsbz10aGlzLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKSxhPXMuZ2V0TGFiZWwoKTtpZihhLmdldExvY2F0aW9uKHQsU2guT04pPT09cGwuTk9ORSYmYS5zZXRMb2NhdGlvbih0LFNoLk9OLGkpLGEuaXNBcmVhKHQpKXt2YXIgdT1hLmdldExvY2F0aW9uKHQsU2guTEVGVCksbD1hLmdldExvY2F0aW9uKHQsU2guUklHSFQpO2lmKGwhPT1wbC5OT05FKXtpZihsIT09aSl0aHJvdyBuZXcgT2goInNpZGUgbG9jYXRpb24gY29uZmxpY3QiLHMuZ2V0Q29vcmRpbmF0ZSgpKTt1PT09cGwuTk9ORSYmcWwuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoImZvdW5kIHNpbmdsZSBudWxsIHNpZGUgKGF0ICIrcy5nZXRDb29yZGluYXRlKCkrIikiKSxpPXV9ZWxzZSBxbC5pc1RydWUoYS5nZXRMb2NhdGlvbih0LFNoLkxFRlQpPT09cGwuTk9ORSwiZm91bmQgc2luZ2xlIG51bGwgc2lkZSIpLGEuc2V0TG9jYXRpb24odCxTaC5SSUdIVCxpKSxhLnNldExvY2F0aW9uKHQsU2guTEVGVCxpKX19fSxYcC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaXRlcmF0b3IoKTtyZXR1cm4gdC5oYXNOZXh0KCk/dC5uZXh0KCkuZ2V0Q29vcmRpbmF0ZSgpOm51bGx9LFhwLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXtQbC5vdXQucHJpbnRsbigiRWRnZUVuZFN0YXI6ICAgIit0aGlzLmdldENvb3JkaW5hdGUoKSk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLnByaW50KHQpfX0sWHAucHJvdG90eXBlLmlzQXJlYUxhYmVsc0NvbnNpc3RlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcHV0ZUVkZ2VFbmRMYWJlbHModC5nZXRCb3VuZGFyeU5vZGVSdWxlKCkpLHRoaXMuY2hlY2tBcmVhTGFiZWxzQ29uc2lzdGVudCgwKX0sWHAucHJvdG90eXBlLmNoZWNrQXJlYUxhYmVsc0NvbnNpc3RlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRFZGdlcygpO2lmKGUuc2l6ZSgpPD0wKXJldHVybiEwO3ZhciBuPWUuc2l6ZSgpLTEscj1lLmdldChuKS5nZXRMYWJlbCgpLmdldExvY2F0aW9uKHQsU2guTEVGVCk7cWwuaXNUcnVlKHIhPT1wbC5OT05FLCJGb3VuZCB1bmxhYmVsbGVkIGFyZWEgZWRnZSIpO2Zvcih2YXIgaT1yLG89dGhpcy5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCkuZ2V0TGFiZWwoKTtxbC5pc1RydWUocy5pc0FyZWEodCksIkZvdW5kIG5vbi1hcmVhIGVkZ2UiKTt2YXIgYT1zLmdldExvY2F0aW9uKHQsU2guTEVGVCksdT1zLmdldExvY2F0aW9uKHQsU2guUklHSFQpO2lmKGE9PT11KXJldHVybiExO2lmKHUhPT1pKXJldHVybiExO2k9YX1yZXR1cm4hMH0sWHAucHJvdG90eXBlLmZpbmRJbmRleD1mdW5jdGlvbih0KXt0aGlzLml0ZXJhdG9yKCk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9lZGdlTGlzdC5zaXplKCk7ZSsrKXtpZih0aGlzLl9lZGdlTGlzdC5nZXQoZSk9PT10KXJldHVybiBlfXJldHVybi0xfSxYcC5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFZGdlcygpLml0ZXJhdG9yKCl9LFhwLnByb3RvdHlwZS5nZXRFZGdlcz1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fZWRnZUxpc3QmJih0aGlzLl9lZGdlTGlzdD1uZXcgbGModGhpcy5fZWRnZU1hcC52YWx1ZXMoKSkpLHRoaXMuX2VkZ2VMaXN0fSxYcC5wcm90b3R5cGUuZ2V0TG9jYXRpb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLl9wdEluQXJlYUxvY2F0aW9uW3RdPT09cGwuTk9ORSYmKHRoaXMuX3B0SW5BcmVhTG9jYXRpb25bdF09VnAubG9jYXRlKGUsblt0XS5nZXRHZW9tZXRyeSgpKSksdGhpcy5fcHRJbkFyZWFMb2NhdGlvblt0XX0sWHAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHZsO3QuYXBwZW5kKCJFZGdlRW5kU3RhcjogICAiK3RoaXMuZ2V0Q29vcmRpbmF0ZSgpKSx0LmFwcGVuZCgiXG4iKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dC5hcHBlbmQobiksdC5hcHBlbmQoIlxuIil9cmV0dXJuIHQudG9TdHJpbmcoKX0sWHAucHJvdG90eXBlLmNvbXB1dGVFZGdlRW5kTGFiZWxzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5jb21wdXRlTGFiZWwodCl9fSxYcC5wcm90b3R5cGUuY29tcHV0ZUxhYmVsbGluZz1mdW5jdGlvbih0KXt0aGlzLmNvbXB1dGVFZGdlRW5kTGFiZWxzKHRbMF0uZ2V0Qm91bmRhcnlOb2RlUnVsZSgpKSx0aGlzLnByb3BhZ2F0ZVNpZGVMYWJlbHMoMCksdGhpcy5wcm9wYWdhdGVTaWRlTGFiZWxzKDEpO2Zvcih2YXIgZT1bITEsITFdLG49dGhpcy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOylmb3IodmFyIHI9bi5uZXh0KCkuZ2V0TGFiZWwoKSxpPTA7aTwyO2krKylyLmlzTGluZShpKSYmci5nZXRMb2NhdGlvbihpKT09PXBsLkJPVU5EQVJZJiYoZVtpXT0hMCk7Zm9yKHZhciBvPXRoaXMuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspZm9yKHZhciBzPW8ubmV4dCgpLGE9cy5nZXRMYWJlbCgpLHU9MDt1PDI7dSsrKWlmKGEuaXNBbnlOdWxsKHUpKXt2YXIgbD1wbC5OT05FO2lmKGVbdV0pbD1wbC5FWFRFUklPUjtlbHNle3ZhciBjPXMuZ2V0Q29vcmRpbmF0ZSgpO2w9dGhpcy5nZXRMb2NhdGlvbih1LGMsdCl9YS5zZXRBbGxMb2NhdGlvbnNJZk51bGwodSxsKX19LFhwLnByb3RvdHlwZS5nZXREZWdyZWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZU1hcC5zaXplKCl9LFhwLnByb3RvdHlwZS5pbnNlcnRFZGdlRW5kPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZWRnZU1hcC5wdXQodCxlKSx0aGlzLl9lZGdlTGlzdD1udWxsfSxYcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWHAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFhwfTt2YXIgWXA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3Q9bnVsbCx0aGlzLl9sYWJlbD1udWxsLHRoaXMuX1NDQU5OSU5HX0ZPUl9JTkNPTUlORz0xLHRoaXMuX0xJTktJTkdfVE9fT1VUR09JTkc9Mn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUubGlua1Jlc3VsdERpcmVjdGVkRWRnZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuZ2V0UmVzdWx0QXJlYUVkZ2VzKCk7Zm9yKHZhciBlPW51bGwsbj1udWxsLHI9dGhpcy5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HLGk9MDtpPHRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdC5zaXplKCk7aSsrKXt2YXIgbz10Ll9yZXN1bHRBcmVhRWRnZUxpc3QuZ2V0KGkpLHM9by5nZXRTeW0oKTtpZihvLmdldExhYmVsKCkuaXNBcmVhKCkpc3dpdGNoKG51bGw9PT1lJiZvLmlzSW5SZXN1bHQoKSYmKGU9bykscil7Y2FzZSB0Ll9TQ0FOTklOR19GT1JfSU5DT01JTkc6aWYoIXMuaXNJblJlc3VsdCgpKWNvbnRpbnVlO249cyxyPXQuX0xJTktJTkdfVE9fT1VUR09JTkc7YnJlYWs7Y2FzZSB0Ll9MSU5LSU5HX1RPX09VVEdPSU5HOmlmKCFvLmlzSW5SZXN1bHQoKSljb250aW51ZTtuLnNldE5leHQobykscj10Ll9TQ0FOTklOR19GT1JfSU5DT01JTkd9fWlmKHI9PT10aGlzLl9MSU5LSU5HX1RPX09VVEdPSU5HKXtpZihudWxsPT09ZSl0aHJvdyBuZXcgT2goIm5vIG91dGdvaW5nIGRpckVkZ2UgZm91bmQiLHRoaXMuZ2V0Q29vcmRpbmF0ZSgpKTtxbC5pc1RydWUoZS5pc0luUmVzdWx0KCksInVuYWJsZSB0byBsaW5rIGxhc3QgaW5jb21pbmcgZGlyRWRnZSIpLG4uc2V0TmV4dChlKX19LGUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0KXt2YXIgZT10O3RoaXMuaW5zZXJ0RWRnZUVuZChlLGUpfSxlLnByb3RvdHlwZS5nZXRSaWdodG1vc3RFZGdlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRFZGdlcygpLGU9dC5zaXplKCk7aWYoZTwxKXJldHVybiBudWxsO3ZhciBuPXQuZ2V0KDApO2lmKDE9PT1lKXJldHVybiBuO3ZhciByPXQuZ2V0KGUtMSksaT1uLmdldFF1YWRyYW50KCksbz1yLmdldFF1YWRyYW50KCk7cmV0dXJuIGpoLmlzTm9ydGhlcm4oaSkmJmpoLmlzTm9ydGhlcm4obyk/bjpqaC5pc05vcnRoZXJuKGkpfHxqaC5pc05vcnRoZXJuKG8pPzAhPT1uLmdldER5KCk/bjowIT09ci5nZXREeSgpP3I6KHFsLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJmb3VuZCB0d28gaG9yaXpvbnRhbCBlZGdlcyBpbmNpZGVudCBvbiBub2RlIiksbnVsbCk6cn0sZS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7UGwub3V0LnByaW50bG4oIkRpcmVjdGVkRWRnZVN0YXI6ICIrdGhpcy5nZXRDb29yZGluYXRlKCkpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0LnByaW50KCJvdXQgIiksbi5wcmludCh0KSx0LnByaW50bG4oKSx0LnByaW50KCJpbiAiKSxuLmdldFN5bSgpLnByaW50KHQpLHQucHJpbnRsbigpfX0sZS5wcm90b3R5cGUuZ2V0UmVzdWx0QXJlYUVkZ2VzPWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdClyZXR1cm4gdGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0O3RoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdD1uZXcgbGM7Zm9yKHZhciB0PXRoaXMuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpOyhlLmlzSW5SZXN1bHQoKXx8ZS5nZXRTeW0oKS5pc0luUmVzdWx0KCkpJiZ0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3QuYWRkKGUpfXJldHVybiB0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3R9LGUucHJvdG90eXBlLnVwZGF0ZUxhYmVsbGluZz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkuZ2V0TGFiZWwoKTtuLnNldEFsbExvY2F0aW9uc0lmTnVsbCgwLHQuZ2V0TG9jYXRpb24oMCkpLG4uc2V0QWxsTG9jYXRpb25zSWZOdWxsKDEsdC5nZXRMb2NhdGlvbigxKSl9fSxlLnByb3RvdHlwZS5saW5rQWxsRGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe3RoaXMuZ2V0RWRnZXMoKTtmb3IodmFyIHQ9bnVsbCxlPW51bGwsbj10aGlzLl9lZGdlTGlzdC5zaXplKCktMTtuPj0wO24tLSl7dmFyIHI9dGhpcy5fZWRnZUxpc3QuZ2V0KG4pLGk9ci5nZXRTeW0oKTtudWxsPT09ZSYmKGU9aSksbnVsbCE9PXQmJmkuc2V0TmV4dCh0KSx0PXJ9ZS5zZXROZXh0KHQpfSxlLnByb3RvdHlwZS5jb21wdXRlRGVwdGhzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49dGhpcy5maW5kSW5kZXgoZSkscj1lLmdldERlcHRoKFNoLkxFRlQpLGk9ZS5nZXREZXB0aChTaC5SSUdIVCksbz10aGlzLmNvbXB1dGVEZXB0aHMobisxLHRoaXMuX2VkZ2VMaXN0LnNpemUoKSxyKSxzPXRoaXMuY29tcHV0ZURlcHRocygwLG4sbyk7aWYocyE9PWkpdGhyb3cgbmV3IE9oKCJkZXB0aCBtaXNtYXRjaCBhdCAiK2UuZ2V0Q29vcmRpbmF0ZSgpKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdLGM9bCxoPWE7aDx1O2grKyl7dmFyIHA9dC5fZWRnZUxpc3QuZ2V0KGgpO3Auc2V0RWRnZURlcHRocyhTaC5SSUdIVCxjKSxjPXAuZ2V0RGVwdGgoU2guTEVGVCl9cmV0dXJuIGN9fSxlLnByb3RvdHlwZS5tZXJnZVN5bUxhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKTtlLmdldExhYmVsKCkubWVyZ2UoZS5nZXRTeW0oKS5nZXRMYWJlbCgpKX19LGUucHJvdG90eXBlLmxpbmtNaW5pbWFsRGlyZWN0ZWRFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPW51bGwscj1udWxsLGk9dGhpcy5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HLG89dGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0LnNpemUoKS0xO28+PTA7by0tKXt2YXIgcz1lLl9yZXN1bHRBcmVhRWRnZUxpc3QuZ2V0KG8pLGE9cy5nZXRTeW0oKTtzd2l0Y2gobnVsbD09PW4mJnMuZ2V0RWRnZVJpbmcoKT09PXQmJihuPXMpLGkpe2Nhc2UgZS5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HOmlmKGEuZ2V0RWRnZVJpbmcoKSE9PXQpY29udGludWU7cj1hLGk9ZS5fTElOS0lOR19UT19PVVRHT0lORzticmVhaztjYXNlIGUuX0xJTktJTkdfVE9fT1VUR09JTkc6aWYocy5nZXRFZGdlUmluZygpIT09dCljb250aW51ZTtyLnNldE5leHRNaW4ocyksaT1lLl9TQ0FOTklOR19GT1JfSU5DT01JTkd9fWk9PT10aGlzLl9MSU5LSU5HX1RPX09VVEdPSU5HJiYocWwuaXNUcnVlKG51bGwhPT1uLCJmb3VuZCBudWxsIGZvciBmaXJzdCBvdXRnb2luZyBkaXJFZGdlIikscWwuaXNUcnVlKG4uZ2V0RWRnZVJpbmcoKT09PXQsInVuYWJsZSB0byBsaW5rIGxhc3QgaW5jb21pbmcgZGlyRWRnZSIpLHIuc2V0TmV4dE1pbihuKSl9LGUucHJvdG90eXBlLmdldE91dGdvaW5nRGVncmVlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD0wLGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7bi5pc0luUmVzdWx0KCkmJnQrK31yZXR1cm4gdH1pZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciByPWFyZ3VtZW50c1swXSxpPTAsbz10aGlzLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKTtzLmdldEVkZ2VSaW5nKCk9PT1yJiZpKyt9cmV0dXJuIGl9fSxlLnByb3RvdHlwZS5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0sZS5wcm90b3R5cGUuZmluZENvdmVyZWRMaW5lRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9cGwuTk9ORSxlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLHI9bi5nZXRTeW0oKTtpZighbi5pc0xpbmVFZGdlKCkpe2lmKG4uaXNJblJlc3VsdCgpKXt0PXBsLklOVEVSSU9SO2JyZWFrfWlmKHIuaXNJblJlc3VsdCgpKXt0PXBsLkVYVEVSSU9SO2JyZWFrfX19aWYodD09PXBsLk5PTkUpcmV0dXJuIG51bGw7Zm9yKHZhciBpPXQsbz10aGlzLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKSxhPXMuZ2V0U3ltKCk7cy5pc0xpbmVFZGdlKCk/cy5nZXRFZGdlKCkuc2V0Q292ZXJlZChpPT09cGwuSU5URVJJT1IpOihzLmlzSW5SZXN1bHQoKSYmKGk9cGwuRVhURVJJT1IpLGEuaXNJblJlc3VsdCgpJiYoaT1wbC5JTlRFUklPUikpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUxhYmVsbGluZz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5jb21wdXRlTGFiZWxsaW5nLmNhbGwodGhpcyxlKSx0aGlzLl9sYWJlbD1uZXcgRGgocGwuTk9ORSk7Zm9yKHZhciBuPXRoaXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspZm9yKHZhciByPW4ubmV4dCgpLmdldEVkZ2UoKS5nZXRMYWJlbCgpLGk9MDtpPDI7aSsrKXt2YXIgbz1yLmdldExvY2F0aW9uKGkpO28hPT1wbC5JTlRFUklPUiYmbyE9PXBsLkJPVU5EQVJZfHx0aGlzLl9sYWJlbC5zZXRMb2NhdGlvbihpLHBsLklOVEVSSU9SKX19LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KFhwKSxIcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNyZWF0ZU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBCaCh0LG5ldyBZcCl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KFloKSxXcD1mdW5jdGlvbiB0KCl7dGhpcy5fcHRzPW51bGwsdGhpcy5fb3JpZW50YXRpb249bnVsbDt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fcHRzPWUsdGhpcy5fb3JpZW50YXRpb249dC5vcmllbnRhdGlvbihlKX07V3AucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiBXcC5jb21wYXJlT3JpZW50ZWQodGhpcy5fcHRzLHRoaXMuX29yaWVudGF0aW9uLGUuX3B0cyxlLl9vcmllbnRhdGlvbil9LFdwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpbF19LFdwLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBXcH0sV3Aub3JpZW50YXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT1wYy5pbmNyZWFzaW5nRGlyZWN0aW9uKHQpfSxXcC5jb21wYXJlT3JpZW50ZWQ9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPWU/MTotMSxvPXI/MTotMSxzPWU/dC5sZW5ndGg6LTEsYT1yP24ubGVuZ3RoOi0xLHU9ZT8wOnQubGVuZ3RoLTEsbD1yPzA6bi5sZW5ndGgtMTs7KXt2YXIgYz10W3VdLmNvbXBhcmVUbyhuW2xdKTtpZigwIT09YylyZXR1cm4gYzt2YXIgaD0odSs9aSk9PT1zLHA9KGwrPW8pPT09YTtpZihoJiYhcClyZXR1cm4tMTtpZighaCYmcClyZXR1cm4gMTtpZihoJiZwKXJldHVybiAwfX07dmFyIEpwPWZ1bmN0aW9uKCl7dGhpcy5fZWRnZXM9bmV3IGxjLHRoaXMuX29jYU1hcD1uZXcgQ2N9O0pwLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50KCJNVUxUSUxJTkVTVFJJTkcgKCAiKTtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2VzLnNpemUoKTtlKyspe3ZhciBuPXRoaXMuX2VkZ2VzLmdldChlKTtlPjAmJnQucHJpbnQoIiwiKSx0LnByaW50KCIoIik7Zm9yKHZhciByPW4uZ2V0Q29vcmRpbmF0ZXMoKSxpPTA7aTxyLmxlbmd0aDtpKyspaT4wJiZ0LnByaW50KCIsIiksdC5wcmludChyW2ldLngrIiAiK3JbaV0ueSk7dC5wcmludGxuKCIpIil9dC5wcmludCgiKSAgIil9LEpwLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspdGhpcy5hZGQoZS5uZXh0KCkpfSxKcC5wcm90b3R5cGUuZmluZEVkZ2VJbmRleD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2VzLnNpemUoKTtlKyspaWYodGhpcy5fZWRnZXMuZ2V0KGUpLmVxdWFscyh0KSlyZXR1cm4gZTtyZXR1cm4tMX0sSnAucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzLml0ZXJhdG9yKCl9LEpwLnByb3RvdHlwZS5nZXRFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlc30sSnAucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZWRnZXMuZ2V0KHQpfSxKcC5wcm90b3R5cGUuZmluZEVxdWFsRWRnZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgV3AodC5nZXRDb29yZGluYXRlcygpKTtyZXR1cm4gdGhpcy5fb2NhTWFwLmdldChlKX0sSnAucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt0aGlzLl9lZGdlcy5hZGQodCk7dmFyIGU9bmV3IFdwKHQuZ2V0Q29vcmRpbmF0ZXMoKSk7dGhpcy5fb2NhTWFwLnB1dChlLHQpfSxKcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSnAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEpwfTt2YXIgWnA9ZnVuY3Rpb24oKXt9O1pwLnByb3RvdHlwZS5wcm9jZXNzSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbixyKXt9LFpwLnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXt9LFpwLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxacC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWnB9O3ZhciBLcD1mdW5jdGlvbigpe3RoaXMuX2hhc0ludGVyc2VjdGlvbj0hMSx0aGlzLl9oYXNQcm9wZXI9ITEsdGhpcy5faGFzUHJvcGVySW50ZXJpb3I9ITEsdGhpcy5faGFzSW50ZXJpb3I9ITEsdGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9bnVsbCx0aGlzLl9saT1udWxsLHRoaXMuX2lzU2VsZkludGVyc2VjdGlvbj1udWxsLHRoaXMubnVtSW50ZXJzZWN0aW9ucz0wLHRoaXMubnVtSW50ZXJpb3JJbnRlcnNlY3Rpb25zPTAsdGhpcy5udW1Qcm9wZXJJbnRlcnNlY3Rpb25zPTAsdGhpcy5udW1UZXN0cz0wO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9saT10fTtLcC5wcm90b3R5cGUuaXNUcml2aWFsSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiYxPT09dGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uTnVtKCkpe2lmKEtwLmlzQWRqYWNlbnRTZWdtZW50cyhlLHIpKXJldHVybiEwO2lmKHQuaXNDbG9zZWQoKSl7dmFyIGk9dC5zaXplKCktMTtpZigwPT09ZSYmcj09PWl8fDA9PT1yJiZlPT09aSlyZXR1cm4hMH19cmV0dXJuITF9LEtwLnByb3RvdHlwZS5nZXRQcm9wZXJJbnRlcnNlY3Rpb25Qb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJJbnRlcnNlY3Rpb25Qb2ludH0sS3AucHJvdG90eXBlLmhhc1Byb3BlckludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Byb3BlckludGVyaW9yfSxLcC5wcm90b3R5cGUuZ2V0TGluZUludGVyc2VjdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xpfSxLcC5wcm90b3R5cGUuaGFzUHJvcGVySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Byb3Blcn0sS3AucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiZlPT09cilyZXR1cm4gbnVsbDt0aGlzLm51bVRlc3RzKys7dmFyIGk9dC5nZXRDb29yZGluYXRlcygpW2VdLG89dC5nZXRDb29yZGluYXRlcygpW2UrMV0scz1uLmdldENvb3JkaW5hdGVzKClbcl0sYT1uLmdldENvb3JkaW5hdGVzKClbcisxXTt0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGksbyxzLGEpLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYodGhpcy5udW1JbnRlcnNlY3Rpb25zKyssdGhpcy5fbGkuaXNJbnRlcmlvckludGVyc2VjdGlvbigpJiYodGhpcy5udW1JbnRlcmlvckludGVyc2VjdGlvbnMrKyx0aGlzLl9oYXNJbnRlcmlvcj0hMCksdGhpcy5pc1RyaXZpYWxJbnRlcnNlY3Rpb24odCxlLG4scil8fCh0aGlzLl9oYXNJbnRlcnNlY3Rpb249ITAsdC5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLGUsMCksbi5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLHIsMSksdGhpcy5fbGkuaXNQcm9wZXIoKSYmKHRoaXMubnVtUHJvcGVySW50ZXJzZWN0aW9ucysrLHRoaXMuX2hhc1Byb3Blcj0hMCx0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcj0hMCkpKX0sS3AucHJvdG90eXBlLmhhc0ludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNJbnRlcnNlY3Rpb259LEtwLnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sS3AucHJvdG90eXBlLmhhc0ludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc0ludGVyaW9yfSxLcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bWnBdfSxLcC5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gS3B9LEtwLmlzQWRqYWNlbnRTZWdtZW50cz1mdW5jdGlvbih0LGUpe3JldHVybiAxPT09TWF0aC5hYnModC1lKX07dmFyIFFwPWZ1bmN0aW9uKCl7dGhpcy5jb29yZD1udWxsLHRoaXMuc2VnbWVudEluZGV4PW51bGwsdGhpcy5kaXN0PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuY29vcmQ9bmV3IHVsKHQpLHRoaXMuc2VnbWVudEluZGV4PWUsdGhpcy5kaXN0PW59O1FwLnByb3RvdHlwZS5nZXRTZWdtZW50SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWdtZW50SW5kZXh9LFFwLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29vcmR9LFFwLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50KHRoaXMuY29vcmQpLHQucHJpbnQoIiBzZWcgIyA9ICIrdGhpcy5zZWdtZW50SW5kZXgpLHQucHJpbnRsbigiIGRpc3QgPSAiK3RoaXMuZGlzdCl9LFFwLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5jb21wYXJlKGUuc2VnbWVudEluZGV4LGUuZGlzdCl9LFFwLnByb3RvdHlwZS5pc0VuZFBvaW50PWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5zZWdtZW50SW5kZXgmJjA9PT10aGlzLmRpc3R8fHRoaXMuc2VnbWVudEluZGV4PT09dH0sUXAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29vcmQrIiBzZWcgIyA9ICIrdGhpcy5zZWdtZW50SW5kZXgrIiBkaXN0ID0gIit0aGlzLmRpc3R9LFFwLnByb3RvdHlwZS5nZXREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc3R9LFFwLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc2VnbWVudEluZGV4PHQ/LTE6dGhpcy5zZWdtZW50SW5kZXg+dD8xOnRoaXMuZGlzdDxlPy0xOnRoaXMuZGlzdD5lPzE6MH0sUXAucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2lsXX0sUXAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFFwfTt2YXIgJHA9ZnVuY3Rpb24oKXt0aGlzLl9ub2RlTWFwPW5ldyBDYyx0aGlzLmVkZ2U9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5lZGdlPXR9OyRwLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50bG4oIkludGVyc2VjdGlvbnM6Iik7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLnByaW50KHQpfX0sJHAucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVNYXAudmFsdWVzKCkuaXRlcmF0b3IoKX0sJHAucHJvdG90eXBlLmFkZFNwbGl0RWRnZXM9ZnVuY3Rpb24odCl7dGhpcy5hZGRFbmRwb2ludHMoKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpLG49ZS5uZXh0KCk7ZS5oYXNOZXh0KCk7KXt2YXIgcj1lLm5leHQoKSxpPXRoaXMuY3JlYXRlU3BsaXRFZGdlKG4scik7dC5hZGQoaSksbj1yfX0sJHAucHJvdG90eXBlLmFkZEVuZHBvaW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZS5wdHMubGVuZ3RoLTE7dGhpcy5hZGQodGhpcy5lZGdlLnB0c1swXSwwLDApLHRoaXMuYWRkKHRoaXMuZWRnZS5wdHNbdF0sdCwwKX0sJHAucHJvdG90eXBlLmNyZWF0ZVNwbGl0RWRnZT1mdW5jdGlvbih0LGUpe3ZhciBuPWUuc2VnbWVudEluZGV4LXQuc2VnbWVudEluZGV4KzIscj10aGlzLmVkZ2UucHRzW2Uuc2VnbWVudEluZGV4XSxpPWUuZGlzdD4wfHwhZS5jb29yZC5lcXVhbHMyRChyKTtpfHxuLS07dmFyIG89bmV3IEFycmF5KG4pLmZpbGwobnVsbCkscz0wO29bcysrXT1uZXcgdWwodC5jb29yZCk7Zm9yKHZhciBhPXQuc2VnbWVudEluZGV4KzE7YTw9ZS5zZWdtZW50SW5kZXg7YSsrKW9bcysrXT10aGlzLmVkZ2UucHRzW2FdO3JldHVybiBpJiYob1tzXT1lLmNvb3JkKSxuZXcgb2YobyxuZXcgRGgodGhpcy5lZGdlLl9sYWJlbCkpfSwkcC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgUXAodCxlLG4pLGk9dGhpcy5fbm9kZU1hcC5nZXQocik7cmV0dXJuIG51bGwhPT1pP2k6KHRoaXMuX25vZGVNYXAucHV0KHIscikscil9LCRwLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7aWYoZS5uZXh0KCkuY29vcmQuZXF1YWxzKHQpKXJldHVybiEwfXJldHVybiExfSwkcC5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sJHAucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICRwfTt2YXIgdGY9ZnVuY3Rpb24oKXt9O3RmLnByb3RvdHlwZS5nZXRDaGFpblN0YXJ0SW5kaWNlcz1mdW5jdGlvbih0KXt2YXIgZT0wLG49bmV3IGxjO24uYWRkKG5ldyBfbChlKSk7ZG97dmFyIHI9dGhpcy5maW5kQ2hhaW5FbmQodCxlKTtuLmFkZChuZXcgX2wocikpLGU9cn13aGlsZShlPHQubGVuZ3RoLTEpO3JldHVybiB0Zi50b0ludEFycmF5KG4pfSx0Zi5wcm90b3R5cGUuZmluZENoYWluRW5kPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWpoLnF1YWRyYW50KHRbZV0sdFtlKzFdKSxyPWUrMTtyPHQubGVuZ3RoOyl7aWYoamgucXVhZHJhbnQodFtyLTFdLHRbcl0pIT09bilicmVhaztyKyt9cmV0dXJuIHItMX0sdGYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHRmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0Zn0sdGYudG9JbnRBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpLG49MDtuPGUubGVuZ3RoO24rKyllW25dPXQuZ2V0KG4pLmludFZhbHVlKCk7cmV0dXJuIGV9O3ZhciBlZj1mdW5jdGlvbigpe3RoaXMuZT1udWxsLHRoaXMucHRzPW51bGwsdGhpcy5zdGFydEluZGV4PW51bGwsdGhpcy5lbnYxPW5ldyBMbCx0aGlzLmVudjI9bmV3IExsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmU9dCx0aGlzLnB0cz10LmdldENvb3JkaW5hdGVzKCk7dmFyIGU9bmV3IHRmO3RoaXMuc3RhcnRJbmRleD1lLmdldENoYWluU3RhcnRJbmRpY2VzKHRoaXMucHRzKX07ZWYucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzfSxlZi5wcm90b3R5cGUuZ2V0TWF4WD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnB0c1t0aGlzLnN0YXJ0SW5kZXhbdF1dLngsbj10aGlzLnB0c1t0aGlzLnN0YXJ0SW5kZXhbdCsxXV0ueDtyZXR1cm4gZT5uP2U6bn0sZWYucHJvdG90eXBlLmdldE1pblg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wdHNbdGhpcy5zdGFydEluZGV4W3RdXS54LG49dGhpcy5wdHNbdGhpcy5zdGFydEluZGV4W3QrMV1dLng7cmV0dXJuIGU8bj9lOm59LGVmLnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluPWZ1bmN0aW9uKCl7aWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxyPWFyZ3VtZW50c1szXTt0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4odGhpcy5zdGFydEluZGV4W3RdLHRoaXMuc3RhcnRJbmRleFt0KzFdLGUsZS5zdGFydEluZGV4W25dLGUuc3RhcnRJbmRleFtuKzFdLHIpfWVsc2UgaWYoNj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1szXSx1PWFyZ3VtZW50c1s0XSxsPWFyZ3VtZW50c1s1XSxjPXRoaXMucHRzW2ldLGg9dGhpcy5wdHNbb10scD1zLnB0c1thXSxmPXMucHRzW3VdO2lmKG8taT09MSYmdS1hPT0xKXJldHVybiBsLmFkZEludGVyc2VjdGlvbnModGhpcy5lLGkscy5lLGEpLG51bGw7aWYodGhpcy5lbnYxLmluaXQoYyxoKSx0aGlzLmVudjIuaW5pdChwLGYpLCF0aGlzLmVudjEuaW50ZXJzZWN0cyh0aGlzLmVudjIpKXJldHVybiBudWxsO3ZhciBnPU1hdGgudHJ1bmMoKGkrbykvMiksZD1NYXRoLnRydW5jKChhK3UpLzIpO2k8ZyYmKGE8ZCYmdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKGksZyxzLGEsZCxsKSxkPHUmJnRoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbihpLGcscyxkLHUsbCkpLGc8byYmKGE8ZCYmdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKGcsbyxzLGEsZCxsKSxkPHUmJnRoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbihnLG8scyxkLHUsbCkpfX0sZWYucHJvdG90eXBlLmdldFN0YXJ0SW5kZXhlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0SW5kZXh9LGVmLnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dGhpcy5zdGFydEluZGV4Lmxlbmd0aC0xO24rKylmb3IodmFyIHI9MDtyPHQuc3RhcnRJbmRleC5sZW5ndGgtMTtyKyspdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKG4sdCxyLGUpfSxlZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZWYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGVmfTt2YXIgbmY9ZnVuY3Rpb24gdCgpe3RoaXMuX2RlcHRoPUFycmF5KDIpLmZpbGwoKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5KDMpfSkpO2Zvcih2YXIgZT0wO2U8MjtlKyspZm9yKHZhciBuPTA7bjwzO24rKyl0aGlzLl9kZXB0aFtlXVtuXT10Lk5VTExfVkFMVUV9LHJmPXtOVUxMX1ZBTFVFOntjb25maWd1cmFibGU6ITB9fTtuZi5wcm90b3R5cGUuZ2V0RGVwdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGVwdGhbdF1bZV19LG5mLnByb3RvdHlwZS5zZXREZXB0aD1mdW5jdGlvbih0LGUsbil7dGhpcy5fZGVwdGhbdF1bZV09bn0sbmYucHJvdG90eXBlLmlzTnVsbD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT0wO2U8MjtlKyspZm9yKHZhciBuPTA7bjwzO24rKylpZih0Ll9kZXB0aFtlXVtuXSE9PW5mLk5VTExfVkFMVUUpcmV0dXJuITE7cmV0dXJuITB9aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fZGVwdGhbcl1bMV09PT1uZi5OVUxMX1ZBTFVFfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuX2RlcHRoW2ldW29dPT09bmYuTlVMTF9WQUxVRX19LG5mLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTA7ZTwyO2UrKylpZighdC5pc051bGwoZSkpe3ZhciBuPXQuX2RlcHRoW2VdWzFdO3QuX2RlcHRoW2VdWzJdPG4mJihuPXQuX2RlcHRoW2VdWzJdKSxuPDAmJihuPTApO2Zvcih2YXIgcj0xO3I8MztyKyspe3ZhciBpPTA7dC5fZGVwdGhbZV1bcl0+biYmKGk9MSksdC5fZGVwdGhbZV1bcl09aX19fSxuZi5wcm90b3R5cGUuZ2V0RGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RlcHRoW3RdW1NoLlJJR0hUXS10aGlzLl9kZXB0aFt0XVtTaC5MRUZUXX0sbmYucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2RlcHRoW3RdW2VdPD0wP3BsLkVYVEVSSU9SOnBsLklOVEVSSU9SfSxuZi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQTogIit0aGlzLl9kZXB0aFswXVsxXSsiLCIrdGhpcy5fZGVwdGhbMF1bMl0rIiBCOiAiK3RoaXMuX2RlcHRoWzFdWzFdKyIsIit0aGlzLl9kZXB0aFsxXVsyXX0sbmYucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPTA7bjwyO24rKylmb3IodmFyIHI9MTtyPDM7cisrKXt2YXIgaT1lLmdldExvY2F0aW9uKG4scik7aSE9PXBsLkVYVEVSSU9SJiZpIT09cGwuSU5URVJJT1J8fCh0LmlzTnVsbChuLHIpP3QuX2RlcHRoW25dW3JdPW5mLmRlcHRoQXRMb2NhdGlvbihpKTp0Ll9kZXB0aFtuXVtyXSs9bmYuZGVwdGhBdExvY2F0aW9uKGkpKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl07YT09PXBsLklOVEVSSU9SJiZ0aGlzLl9kZXB0aFtvXVtzXSsrfX0sbmYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LG5mLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBuZn0sbmYuZGVwdGhBdExvY2F0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09cGwuRVhURVJJT1I/MDp0PT09cGwuSU5URVJJT1I/MTpuZi5OVUxMX1ZBTFVFfSxyZi5OVUxMX1ZBTFVFLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuZixyZik7dmFyIG9mPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtpZih0LmNhbGwodGhpcyksdGhpcy5wdHM9bnVsbCx0aGlzLl9lbnY9bnVsbCx0aGlzLmVpTGlzdD1uZXcgJHAodGhpcyksdGhpcy5fbmFtZT1udWxsLHRoaXMuX21jZT1udWxsLHRoaXMuX2lzSXNvbGF0ZWQ9ITAsdGhpcy5fZGVwdGg9bmV3IG5mLHRoaXMuX2RlcHRoRGVsdGE9MCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO2UuY2FsbCh0aGlzLG4sbnVsbCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3RoaXMucHRzPXIsdGhpcy5fbGFiZWw9aX19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldERlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlcHRofSxlLnByb3RvdHlwZS5nZXRDb2xsYXBzZWRFZGdlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KDIpLmZpbGwobnVsbCk7cmV0dXJuIHRbMF09dGhpcy5wdHNbMF0sdFsxXT10aGlzLnB0c1sxXSxuZXcgZSh0LERoLnRvTGluZUxhYmVsKHRoaXMuX2xhYmVsKSl9LGUucHJvdG90eXBlLmlzSXNvbGF0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNJc29sYXRlZH0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdHN9LGUucHJvdG90eXBlLnNldElzb2xhdGVkPWZ1bmN0aW9uKHQpe3RoaXMuX2lzSXNvbGF0ZWQ9dH0sZS5wcm90b3R5cGUuc2V0TmFtZT1mdW5jdGlvbih0KXt0aGlzLl9uYW1lPXR9LGUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBlKSlyZXR1cm4hMTt2YXIgbj10O2lmKHRoaXMucHRzLmxlbmd0aCE9PW4ucHRzLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHI9ITAsaT0hMCxvPXRoaXMucHRzLmxlbmd0aCxzPTA7czx0aGlzLnB0cy5sZW5ndGg7cysrKWlmKHRoaXMucHRzW3NdLmVxdWFsczJEKG4ucHRzW3NdKXx8KHI9ITEpLHRoaXMucHRzW3NdLmVxdWFsczJEKG4ucHRzWy0tb10pfHwoaT0hMSksIXImJiFpKXJldHVybiExO3JldHVybiEwfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMucHRzLmxlbmd0aD4wP3RoaXMucHRzWzBdOm51bGw7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5wdHNbdF19fSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50KCJlZGdlICIrdGhpcy5fbmFtZSsiOiAiKSx0LnByaW50KCJMSU5FU1RSSU5HICgiKTtmb3IodmFyIGU9MDtlPHRoaXMucHRzLmxlbmd0aDtlKyspZT4wJiZ0LnByaW50KCIsIiksdC5wcmludCh0aGlzLnB0c1tlXS54KyIgIit0aGlzLnB0c1tlXS55KTt0LnByaW50KCIpICAiK3RoaXMuX2xhYmVsKyIgIit0aGlzLl9kZXB0aERlbHRhKX0sZS5wcm90b3R5cGUuY29tcHV0ZUlNPWZ1bmN0aW9uKHQpe2UudXBkYXRlSU0odGhpcy5fbGFiZWwsdCl9LGUucHJvdG90eXBlLmlzQ29sbGFwc2VkPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9sYWJlbC5pc0FyZWEoKSYmKDM9PT10aGlzLnB0cy5sZW5ndGgmJiEhdGhpcy5wdHNbMF0uZXF1YWxzKHRoaXMucHRzWzJdKSl9LGUucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzWzBdLmVxdWFscyh0aGlzLnB0c1t0aGlzLnB0cy5sZW5ndGgtMV0pfSxlLnByb3RvdHlwZS5nZXRNYXhpbXVtU2VnbWVudEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzLmxlbmd0aC0xfSxlLnByb3RvdHlwZS5nZXREZXB0aERlbHRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlcHRoRGVsdGF9LGUucHJvdG90eXBlLmdldE51bVBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB0cy5sZW5ndGh9LGUucHJvdG90eXBlLnByaW50UmV2ZXJzZT1mdW5jdGlvbih0KXt0LnByaW50KCJlZGdlICIrdGhpcy5fbmFtZSsiOiAiKTtmb3IodmFyIGU9dGhpcy5wdHMubGVuZ3RoLTE7ZT49MDtlLS0pdC5wcmludCh0aGlzLnB0c1tlXSsiICIpO3QucHJpbnRsbigiIil9LGUucHJvdG90eXBlLmdldE1vbm90b25lQ2hhaW5FZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9tY2UmJih0aGlzLl9tY2U9bmV3IGVmKHRoaXMpKSx0aGlzLl9tY2V9LGUucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX2Vudil7dGhpcy5fZW52PW5ldyBMbDtmb3IodmFyIHQ9MDt0PHRoaXMucHRzLmxlbmd0aDt0KyspdGhpcy5fZW52LmV4cGFuZFRvSW5jbHVkZSh0aGlzLnB0c1t0XSl9cmV0dXJuIHRoaXMuX2Vudn0sZS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW5ldyB1bCh0LmdldEludGVyc2VjdGlvbihyKSksbz1lLHM9dC5nZXRFZGdlRGlzdGFuY2UobixyKSxhPW8rMTtpZihhPHRoaXMucHRzLmxlbmd0aCl7dmFyIHU9dGhpcy5wdHNbYV07aS5lcXVhbHMyRCh1KSYmKG89YSxzPTApfXRoaXMuZWlMaXN0LmFkZChpLG8scyl9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHZsO3QuYXBwZW5kKCJlZGdlICIrdGhpcy5fbmFtZSsiOiAiKSx0LmFwcGVuZCgiTElORVNUUklORyAoIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnB0cy5sZW5ndGg7ZSsrKWU+MCYmdC5hcHBlbmQoIiwiKSx0LmFwcGVuZCh0aGlzLnB0c1tlXS54KyIgIit0aGlzLnB0c1tlXS55KTtyZXR1cm4gdC5hcHBlbmQoIikgICIrdGhpcy5fbGFiZWwrIiAiK3RoaXMuX2RlcHRoRGVsdGEpLHQudG9TdHJpbmcoKX0sZS5wcm90b3R5cGUuaXNQb2ludHdpc2VFcXVhbD1mdW5jdGlvbih0KXtpZih0aGlzLnB0cy5sZW5ndGghPT10LnB0cy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBlPTA7ZTx0aGlzLnB0cy5sZW5ndGg7ZSsrKWlmKCF0aGlzLnB0c1tlXS5lcXVhbHMyRCh0LnB0c1tlXSkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLnNldERlcHRoRGVsdGE9ZnVuY3Rpb24odCl7dGhpcy5fZGVwdGhEZWx0YT10fSxlLnByb3RvdHlwZS5nZXRFZGdlSW50ZXJzZWN0aW9uTGlzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVpTGlzdH0sZS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTA7cjx0LmdldEludGVyc2VjdGlvbk51bSgpO3IrKyl0aGlzLmFkZEludGVyc2VjdGlvbih0LGUsbixyKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS51cGRhdGVJTT1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS51cGRhdGVJTS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO24uc2V0QXRMZWFzdElmVmFsaWQoZS5nZXRMb2NhdGlvbigwLFNoLk9OKSxlLmdldExvY2F0aW9uKDEsU2guT04pLDEpLGUuaXNBcmVhKCkmJihuLnNldEF0TGVhc3RJZlZhbGlkKGUuZ2V0TG9jYXRpb24oMCxTaC5MRUZUKSxlLmdldExvY2F0aW9uKDEsU2guTEVGVCksMiksbi5zZXRBdExlYXN0SWZWYWxpZChlLmdldExvY2F0aW9uKDAsU2guUklHSFQpLGUuZ2V0TG9jYXRpb24oMSxTaC5SSUdIVCksMikpfSxlfShxaCksc2Y9ZnVuY3Rpb24odCl7dGhpcy5fd29ya2luZ1ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fd29ya2luZ05vZGVyPW51bGwsdGhpcy5fZ2VvbUZhY3Q9bnVsbCx0aGlzLl9ncmFwaD1udWxsLHRoaXMuX2VkZ2VMaXN0PW5ldyBKcCx0aGlzLl9idWZQYXJhbXM9dHx8bnVsbH07c2YucHJvdG90eXBlLnNldFdvcmtpbmdQcmVjaXNpb25Nb2RlbD1mdW5jdGlvbih0KXt0aGlzLl93b3JraW5nUHJlY2lzaW9uTW9kZWw9dH0sc2YucHJvdG90eXBlLmluc2VydFVuaXF1ZUVkZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZWRnZUxpc3QuZmluZEVxdWFsRWRnZSh0KTtpZihudWxsIT09ZSl7dmFyIG49ZS5nZXRMYWJlbCgpLHI9dC5nZXRMYWJlbCgpO2UuaXNQb2ludHdpc2VFcXVhbCh0KXx8KHI9bmV3IERoKHQuZ2V0TGFiZWwoKSkpLmZsaXAoKSxuLm1lcmdlKHIpO3ZhciBpPXNmLmRlcHRoRGVsdGEociksbz1lLmdldERlcHRoRGVsdGEoKStpO2Uuc2V0RGVwdGhEZWx0YShvKX1lbHNlIHRoaXMuX2VkZ2VMaXN0LmFkZCh0KSx0LnNldERlcHRoRGVsdGEoc2YuZGVwdGhEZWx0YSh0LmdldExhYmVsKCkpKX0sc2YucHJvdG90eXBlLmJ1aWxkU3ViZ3JhcGhzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyBsYyxyPXQuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpLG89aS5nZXRSaWdodG1vc3RDb29yZGluYXRlKCkscz1uZXcga3AobikuZ2V0RGVwdGgobyk7aS5jb21wdXRlRGVwdGgocyksaS5maW5kUmVzdWx0RWRnZXMoKSxuLmFkZChpKSxlLmFkZChpLmdldERpcmVjdGVkRWRnZXMoKSxpLmdldE5vZGVzKCkpfX0sc2YucHJvdG90eXBlLmNyZWF0ZVN1YmdyYXBocz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGxjLG49dC5nZXROb2RlcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZighci5pc1Zpc2l0ZWQoKSl7dmFyIGk9bmV3IFRoO2kuY3JlYXRlKHIpLGUuYWRkKGkpfX1yZXR1cm4gbnAuc29ydChlLG5wLnJldmVyc2VPcmRlcigpKSxlfSxzZi5wcm90b3R5cGUuY3JlYXRlRW1wdHlSZXN1bHRHZW9tZXRyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZW9tRmFjdC5jcmVhdGVQb2x5Z29uKCl9LHNmLnByb3RvdHlwZS5nZXROb2Rlcj1mdW5jdGlvbih0KXtpZihudWxsIT09dGhpcy5fd29ya2luZ05vZGVyKXJldHVybiB0aGlzLl93b3JraW5nTm9kZXI7dmFyIGU9bmV3IElwLG49bmV3IGpsO3JldHVybiBuLnNldFByZWNpc2lvbk1vZGVsKHQpLGUuc2V0U2VnbWVudEludGVyc2VjdG9yKG5ldyBLcChuKSksZX0sc2YucHJvdG90eXBlLmJ1ZmZlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3dvcmtpbmdQcmVjaXNpb25Nb2RlbDtudWxsPT09biYmKG49dC5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9nZW9tRmFjdD10LmdldEZhY3RvcnkoKTt2YXIgcj1uZXcgRnAobix0aGlzLl9idWZQYXJhbXMpLGk9bmV3IHpwKHQsZSxyKS5nZXRDdXJ2ZXMoKTtpZihpLnNpemUoKTw9MClyZXR1cm4gdGhpcy5jcmVhdGVFbXB0eVJlc3VsdEdlb21ldHJ5KCk7dGhpcy5jb21wdXRlTm9kZWRFZGdlcyhpLG4pLHRoaXMuX2dyYXBoPW5ldyBIaChuZXcgSHApLHRoaXMuX2dyYXBoLmFkZEVkZ2VzKHRoaXMuX2VkZ2VMaXN0LmdldEVkZ2VzKCkpO3ZhciBvPXRoaXMuY3JlYXRlU3ViZ3JhcGhzKHRoaXMuX2dyYXBoKSxzPW5ldyBXaCh0aGlzLl9nZW9tRmFjdCk7dGhpcy5idWlsZFN1YmdyYXBocyhvLHMpO3ZhciBhPXMuZ2V0UG9seWdvbnMoKTtyZXR1cm4gYS5zaXplKCk8PTA/dGhpcy5jcmVhdGVFbXB0eVJlc3VsdEdlb21ldHJ5KCk6dGhpcy5fZ2VvbUZhY3QuYnVpbGRHZW9tZXRyeShhKX0sc2YucHJvdG90eXBlLmNvbXB1dGVOb2RlZEVkZ2VzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXROb2RlcihlKTtuLmNvbXB1dGVOb2Rlcyh0KTtmb3IodmFyIHI9bi5nZXROb2RlZFN1YnN0cmluZ3MoKS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCksbz1pLmdldENvb3JkaW5hdGVzKCk7aWYoMiE9PW8ubGVuZ3RofHwhb1swXS5lcXVhbHMyRChvWzFdKSl7dmFyIHM9aS5nZXREYXRhKCksYT1uZXcgb2YoaS5nZXRDb29yZGluYXRlcygpLG5ldyBEaChzKSk7dGhpcy5pbnNlcnRVbmlxdWVFZGdlKGEpfX19LHNmLnByb3RvdHlwZS5zZXROb2Rlcj1mdW5jdGlvbih0KXt0aGlzLl93b3JraW5nTm9kZXI9dH0sc2YucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHNmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBzZn0sc2YuZGVwdGhEZWx0YT1mdW5jdGlvbih0KXt2YXIgZT10LmdldExvY2F0aW9uKDAsU2guTEVGVCksbj10LmdldExvY2F0aW9uKDAsU2guUklHSFQpO3JldHVybiBlPT09cGwuSU5URVJJT1ImJm49PT1wbC5FWFRFUklPUj8xOmU9PT1wbC5FWFRFUklPUiYmbj09PXBsLklOVEVSSU9SPy0xOjB9LHNmLmNvbnZlcnRTZWdTdHJpbmdzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgX2gsbj1uZXcgbGM7dC5oYXNOZXh0KCk7KXt2YXIgcj10Lm5leHQoKSxpPWUuY3JlYXRlTGluZVN0cmluZyhyLmdldENvb3JkaW5hdGVzKCkpO24uYWRkKGkpfXJldHVybiBlLmJ1aWxkR2VvbWV0cnkobil9O3ZhciBhZj1mdW5jdGlvbigpe2lmKHRoaXMuX25vZGVyPW51bGwsdGhpcy5fc2NhbGVGYWN0b3I9bnVsbCx0aGlzLl9vZmZzZXRYPW51bGwsdGhpcy5fb2Zmc2V0WT1udWxsLHRoaXMuX2lzU2NhbGVkPSExLDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fbm9kZXI9dCx0aGlzLl9zY2FsZUZhY3Rvcj1lLHRoaXMuX29mZnNldFg9MCx0aGlzLl9vZmZzZXRZPTAsdGhpcy5faXNTY2FsZWQ9IXRoaXMuaXNJbnRlZ2VyUHJlY2lzaW9uKCl9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdLG89YXJndW1lbnRzWzNdO3RoaXMuX25vZGVyPW4sdGhpcy5fc2NhbGVGYWN0b3I9cix0aGlzLl9vZmZzZXRYPWksdGhpcy5fb2Zmc2V0WT1vLHRoaXMuX2lzU2NhbGVkPSF0aGlzLmlzSW50ZWdlclByZWNpc2lvbigpfX07YWYucHJvdG90eXBlLnJlc2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKGdsKGFyZ3VtZW50c1swXSxpYykpZm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3QucmVzY2FsZShyLmdldENvb3JkaW5hdGVzKCkpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciBpPWFyZ3VtZW50c1swXSxvPTA7bzxpLmxlbmd0aDtvKyspaVtvXS54PWlbb10ueC90Ll9zY2FsZUZhY3Rvcit0Ll9vZmZzZXRYLGlbb10ueT1pW29dLnkvdC5fc2NhbGVGYWN0b3IrdC5fb2Zmc2V0WTsyPT09aS5sZW5ndGgmJmlbMF0uZXF1YWxzMkQoaVsxXSkmJlBsLm91dC5wcmludGxuKGkpfX0sYWYucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihnbChhcmd1bWVudHNbMF0saWMpKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49bmV3IGxjLHI9ZS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7bi5hZGQobmV3IHlwKHQuc2NhbGUoaS5nZXRDb29yZGluYXRlcygpKSxpLmdldERhdGEoKSkpfXJldHVybiBufWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgbz1hcmd1bWVudHNbMF0scz1uZXcgQXJyYXkoby5sZW5ndGgpLmZpbGwobnVsbCksYT0wO2E8by5sZW5ndGg7YSsrKXNbYV09bmV3IHVsKE1hdGgucm91bmQoKG9bYV0ueC10Ll9vZmZzZXRYKSp0Ll9zY2FsZUZhY3RvciksTWF0aC5yb3VuZCgob1thXS55LXQuX29mZnNldFkpKnQuX3NjYWxlRmFjdG9yKSxvW2FdLnopO3ZhciB1PXBjLnJlbW92ZVJlcGVhdGVkUG9pbnRzKHMpO3JldHVybiB1fX0sYWYucHJvdG90eXBlLmlzSW50ZWdlclByZWNpc2lvbj1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5fc2NhbGVGYWN0b3J9LGFmLnByb3RvdHlwZS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9ub2Rlci5nZXROb2RlZFN1YnN0cmluZ3MoKTtyZXR1cm4gdGhpcy5faXNTY2FsZWQmJnRoaXMucmVzY2FsZSh0KSx0fSxhZi5wcm90b3R5cGUuY29tcHV0ZU5vZGVzPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7dGhpcy5faXNTY2FsZWQmJihlPXRoaXMuc2NhbGUodCkpLHRoaXMuX25vZGVyLmNvbXB1dGVOb2RlcyhlKX0sYWYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2JwXX0sYWYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGFmfTt2YXIgdWY9ZnVuY3Rpb24oKXt0aGlzLl9saT1uZXcgamwsdGhpcy5fc2VnU3RyaW5ncz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9zZWdTdHJpbmdzPXR9LGxmPXtmYWN0Ontjb25maWd1cmFibGU6ITB9fTt1Zi5wcm90b3R5cGUuY2hlY2tFbmRQdFZlcnRleEludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgZT10aGlzLl9zZWdTdHJpbmdzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPW4uZ2V0Q29vcmRpbmF0ZXMoKTt0LmNoZWNrRW5kUHRWZXJ0ZXhJbnRlcnNlY3Rpb25zKHJbMF0sdC5fc2VnU3RyaW5ncyksdC5jaGVja0VuZFB0VmVydGV4SW50ZXJzZWN0aW9ucyhyW3IubGVuZ3RoLTFdLHQuX3NlZ1N0cmluZ3MpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPW8uaXRlcmF0b3IoKTtzLmhhc05leHQoKTspZm9yKHZhciBhPXMubmV4dCgpLHU9YS5nZXRDb29yZGluYXRlcygpLGw9MTtsPHUubGVuZ3RoLTE7bCsrKWlmKHVbbF0uZXF1YWxzKGkpKXRocm93IG5ldyBrbCgiZm91bmQgZW5kcHQvaW50ZXJpb3IgcHQgaW50ZXJzZWN0aW9uIGF0IGluZGV4ICIrbCsiIDpwdCAiK2kpfSx1Zi5wcm90b3R5cGUuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgZT10aGlzLl9zZWdTdHJpbmdzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KWZvcih2YXIgbj1lLm5leHQoKSxyPXRoaXMuX3NlZ1N0cmluZ3MuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO3QuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnMobixpKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1vLmdldENvb3JkaW5hdGVzKCksdT1zLmdldENvb3JkaW5hdGVzKCksbD0wO2w8YS5sZW5ndGgtMTtsKyspZm9yKHZhciBjPTA7Yzx1Lmxlbmd0aC0xO2MrKyl0LmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zKG8sbCxzLGMpO2Vsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBoPWFyZ3VtZW50c1swXSxwPWFyZ3VtZW50c1sxXSxmPWFyZ3VtZW50c1syXSxnPWFyZ3VtZW50c1szXTtpZihoPT09ZiYmcD09PWcpcmV0dXJuIG51bGw7dmFyIGQ9aC5nZXRDb29yZGluYXRlcygpW3BdLHk9aC5nZXRDb29yZGluYXRlcygpW3ArMV0sdj1mLmdldENvb3JkaW5hdGVzKClbZ10sXz1mLmdldENvb3JkaW5hdGVzKClbZysxXTtpZih0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGQseSx2LF8pLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYodGhpcy5fbGkuaXNQcm9wZXIoKXx8dGhpcy5oYXNJbnRlcmlvckludGVyc2VjdGlvbih0aGlzLl9saSxkLHkpfHx0aGlzLmhhc0ludGVyaW9ySW50ZXJzZWN0aW9uKHRoaXMuX2xpLHYsXykpKXRocm93IG5ldyBrbCgiZm91bmQgbm9uLW5vZGVkIGludGVyc2VjdGlvbiBhdCAiK2QrIi0iK3krIiBhbmQgIit2KyItIitfKX19LHVmLnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7dGhpcy5jaGVja0VuZFB0VmVydGV4SW50ZXJzZWN0aW9ucygpLHRoaXMuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnMoKSx0aGlzLmNoZWNrQ29sbGFwc2VzKCl9LHVmLnByb3RvdHlwZS5jaGVja0NvbGxhcHNlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBlPXRoaXMuX3NlZ1N0cmluZ3MuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3QuY2hlY2tDb2xsYXBzZXMobil9ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9ci5nZXRDb29yZGluYXRlcygpLG89MDtvPGkubGVuZ3RoLTI7bysrKXQuY2hlY2tDb2xsYXBzZShpW29dLGlbbysxXSxpW28rMl0pfSx1Zi5wcm90b3R5cGUuaGFzSW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0wO3I8dC5nZXRJbnRlcnNlY3Rpb25OdW0oKTtyKyspe3ZhciBpPXQuZ2V0SW50ZXJzZWN0aW9uKHIpO2lmKCFpLmVxdWFscyhlKSYmIWkuZXF1YWxzKG4pKXJldHVybiEwfXJldHVybiExfSx1Zi5wcm90b3R5cGUuY2hlY2tDb2xsYXBzZT1mdW5jdGlvbih0LGUsbil7aWYodC5lcXVhbHMobikpdGhyb3cgbmV3IGtsKCJmb3VuZCBub24tbm9kZWQgY29sbGFwc2UgYXQgIit1Zi5mYWN0LmNyZWF0ZUxpbmVTdHJpbmcoW3QsZSxuXSkpfSx1Zi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdWYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHVmfSxsZi5mYWN0LmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgX2h9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHVmLGxmKTt2YXIgY2Y9ZnVuY3Rpb24oKXt0aGlzLl9saT1udWxsLHRoaXMuX3B0PW51bGwsdGhpcy5fb3JpZ2luYWxQdD1udWxsLHRoaXMuX3B0U2NhbGVkPW51bGwsdGhpcy5fcDBTY2FsZWQ9bnVsbCx0aGlzLl9wMVNjYWxlZD1udWxsLHRoaXMuX3NjYWxlRmFjdG9yPW51bGwsdGhpcy5fbWlueD1udWxsLHRoaXMuX21heHg9bnVsbCx0aGlzLl9taW55PW51bGwsdGhpcy5fbWF4eT1udWxsLHRoaXMuX2Nvcm5lcj1uZXcgQXJyYXkoNCkuZmlsbChudWxsKSx0aGlzLl9zYWZlRW52PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO2lmKHRoaXMuX29yaWdpbmFsUHQ9dCx0aGlzLl9wdD10LHRoaXMuX3NjYWxlRmFjdG9yPWUsdGhpcy5fbGk9bixlPD0wKXRocm93IG5ldyBlbCgiU2NhbGUgZmFjdG9yIG11c3QgYmUgbm9uLXplcm8iKTsxIT09ZSYmKHRoaXMuX3B0PW5ldyB1bCh0aGlzLnNjYWxlKHQueCksdGhpcy5zY2FsZSh0LnkpKSx0aGlzLl9wMFNjYWxlZD1uZXcgdWwsdGhpcy5fcDFTY2FsZWQ9bmV3IHVsKSx0aGlzLmluaXRDb3JuZXJzKHRoaXMuX3B0KX0saGY9e1NBRkVfRU5WX0VYUEFOU0lPTl9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH19O2NmLnByb3RvdHlwZS5pbnRlcnNlY3RzU2NhbGVkPWZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5taW4odC54LGUueCkscj1NYXRoLm1heCh0LngsZS54KSxpPU1hdGgubWluKHQueSxlLnkpLG89TWF0aC5tYXgodC55LGUueSkscz10aGlzLl9tYXh4PG58fHRoaXMuX21pbng+cnx8dGhpcy5fbWF4eTxpfHx0aGlzLl9taW55Pm87aWYocylyZXR1cm4hMTt2YXIgYT10aGlzLmludGVyc2VjdHNUb2xlcmFuY2VTcXVhcmUodCxlKTtyZXR1cm4gcWwuaXNUcnVlKCEocyYmYSksIkZvdW5kIGJhZCBlbnZlbG9wZSB0ZXN0IiksYX0sY2YucHJvdG90eXBlLmluaXRDb3JuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlPS41O3RoaXMuX21pbng9dC54LWUsdGhpcy5fbWF4eD10LngrZSx0aGlzLl9taW55PXQueS1lLHRoaXMuX21heHk9dC55K2UsdGhpcy5fY29ybmVyWzBdPW5ldyB1bCh0aGlzLl9tYXh4LHRoaXMuX21heHkpLHRoaXMuX2Nvcm5lclsxXT1uZXcgdWwodGhpcy5fbWlueCx0aGlzLl9tYXh5KSx0aGlzLl9jb3JuZXJbMl09bmV3IHVsKHRoaXMuX21pbngsdGhpcy5fbWlueSksdGhpcy5fY29ybmVyWzNdPW5ldyB1bCh0aGlzLl9tYXh4LHRoaXMuX21pbnkpfSxjZi5wcm90b3R5cGUuaW50ZXJzZWN0cz1mdW5jdGlvbih0LGUpe3JldHVybiAxPT09dGhpcy5fc2NhbGVGYWN0b3I/dGhpcy5pbnRlcnNlY3RzU2NhbGVkKHQsZSk6KHRoaXMuY29weVNjYWxlZCh0LHRoaXMuX3AwU2NhbGVkKSx0aGlzLmNvcHlTY2FsZWQoZSx0aGlzLl9wMVNjYWxlZCksdGhpcy5pbnRlcnNlY3RzU2NhbGVkKHRoaXMuX3AwU2NhbGVkLHRoaXMuX3AxU2NhbGVkKSl9LGNmLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KnRoaXMuX3NjYWxlRmFjdG9yKX0sY2YucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZ2luYWxQdH0sY2YucHJvdG90eXBlLmNvcHlTY2FsZWQ9ZnVuY3Rpb24odCxlKXtlLng9dGhpcy5zY2FsZSh0LngpLGUueT10aGlzLnNjYWxlKHQueSl9LGNmLnByb3RvdHlwZS5nZXRTYWZlRW52ZWxvcGU9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fc2FmZUVudil7dmFyIHQ9Y2YuU0FGRV9FTlZfRVhQQU5TSU9OX0ZBQ1RPUi90aGlzLl9zY2FsZUZhY3Rvcjt0aGlzLl9zYWZlRW52PW5ldyBMbCh0aGlzLl9vcmlnaW5hbFB0LngtdCx0aGlzLl9vcmlnaW5hbFB0LngrdCx0aGlzLl9vcmlnaW5hbFB0LnktdCx0aGlzLl9vcmlnaW5hbFB0LnkrdCl9cmV0dXJuIHRoaXMuX3NhZmVFbnZ9LGNmLnByb3RvdHlwZS5pbnRlcnNlY3RzUGl4ZWxDbG9zdXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclswXSx0aGlzLl9jb3JuZXJbMV0pLCEhdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCl8fCh0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMV0sdGhpcy5fY29ybmVyWzJdKSwhIXRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpfHwodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzJdLHRoaXMuX2Nvcm5lclszXSksISF0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKXx8KHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclszXSx0aGlzLl9jb3JuZXJbMF0pLCEhdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkpKSl9LGNmLnByb3RvdHlwZS5pbnRlcnNlY3RzVG9sZXJhbmNlU3F1YXJlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ITEscj0hMTtyZXR1cm4gdGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzBdLHRoaXMuX2Nvcm5lclsxXSksISF0aGlzLl9saS5pc1Byb3BlcigpfHwodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzFdLHRoaXMuX2Nvcm5lclsyXSksISF0aGlzLl9saS5pc1Byb3BlcigpfHwodGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJihuPSEwKSx0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMl0sdGhpcy5fY29ybmVyWzNdKSwhIXRoaXMuX2xpLmlzUHJvcGVyKCl8fCh0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmKHI9ITApLHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclszXSx0aGlzLl9jb3JuZXJbMF0pLCEhdGhpcy5fbGkuaXNQcm9wZXIoKXx8KCEoIW58fCFyKXx8KCEhdC5lcXVhbHModGhpcy5fcHQpfHwhIWUuZXF1YWxzKHRoaXMuX3B0KSkpKSkpfSxjZi5wcm90b3R5cGUuYWRkU25hcHBlZE5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldENvb3JkaW5hdGUoZSkscj10LmdldENvb3JkaW5hdGUoZSsxKTtyZXR1cm4hIXRoaXMuaW50ZXJzZWN0cyhuLHIpJiYodC5hZGRJbnRlcnNlY3Rpb24odGhpcy5nZXRDb29yZGluYXRlKCksZSksITApfSxjZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sY2YucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGNmfSxoZi5TQUZFX0VOVl9FWFBBTlNJT05fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybi43NX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2YsaGYpO3ZhciBwZj1mdW5jdGlvbigpe3RoaXMudGVtcEVudjE9bmV3IExsLHRoaXMuc2VsZWN0ZWRTZWdtZW50PW5ldyB2cH07cGYucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKTtlbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dC5nZXRMaW5lU2VnbWVudChlLHRoaXMuc2VsZWN0ZWRTZWdtZW50KSx0aGlzLnNlbGVjdCh0aGlzLnNlbGVjdGVkU2VnbWVudCl9fSxwZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scGYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHBmfTt2YXIgZmY9ZnVuY3Rpb24oKXt0aGlzLl9pbmRleD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9pbmRleD10fSxnZj17SG90UGl4ZWxTbmFwQWN0aW9uOntjb25maWd1cmFibGU6ITB9fTtmZi5wcm90b3R5cGUuc25hcD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc25hcCh0LG51bGwsLTEpfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl0saT1lLmdldFNhZmVFbnZlbG9wZSgpLG89bmV3IGRmKGUsbixyKTtyZXR1cm4gdGhpcy5faW5kZXgucXVlcnkoaSx7aW50ZXJmYWNlc186ZnVuY3Rpb24oKXtyZXR1cm5bUWhdfSx2aXNpdEl0ZW06ZnVuY3Rpb24odCl7dC5zZWxlY3QoaSxvKX19KSxvLmlzTm9kZUFkZGVkKCl9fSxmZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZmYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGZmfSxnZi5Ib3RQaXhlbFNuYXBBY3Rpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGRmfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmZixnZik7dmFyIGRmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5faG90UGl4ZWw9bnVsbCx0aGlzLl9wYXJlbnRFZGdlPW51bGwsdGhpcy5faG90UGl4ZWxWZXJ0ZXhJbmRleD1udWxsLHRoaXMuX2lzTm9kZUFkZGVkPSExO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9ob3RQaXhlbD1lLHRoaXMuX3BhcmVudEVkZ2U9bix0aGlzLl9ob3RQaXhlbFZlcnRleEluZGV4PXJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzTm9kZUFkZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzTm9kZUFkZGVkfSxlLnByb3RvdHlwZS5zZWxlY3Q9ZnVuY3Rpb24oKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuc2VsZWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1lLmdldENvbnRleHQoKTtpZihudWxsIT09dGhpcy5fcGFyZW50RWRnZSYmcj09PXRoaXMuX3BhcmVudEVkZ2UmJm49PT10aGlzLl9ob3RQaXhlbFZlcnRleEluZGV4KXJldHVybiBudWxsO3RoaXMuX2lzTm9kZUFkZGVkPXRoaXMuX2hvdFBpeGVsLmFkZFNuYXBwZWROb2RlKHIsbil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KHBmKSx5Zj1mdW5jdGlvbigpe3RoaXMuX2xpPW51bGwsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xpPXQsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zPW5ldyBsY307eWYucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiZlPT09cilyZXR1cm4gbnVsbDt2YXIgaT10LmdldENvb3JkaW5hdGVzKClbZV0sbz10LmdldENvb3JkaW5hdGVzKClbZSsxXSxzPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyXSxhPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyKzFdO2lmKHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oaSxvLHMsYSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJnRoaXMuX2xpLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oKSl7Zm9yKHZhciB1PTA7dTx0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKTt1KyspdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zLmFkZCh0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb24odSkpO3QuYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxlLDApLG4uYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxyLDEpfX0seWYucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSx5Zi5wcm90b3R5cGUuZ2V0SW50ZXJpb3JJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uc30seWYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1pwXX0seWYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHlmfTt2YXIgdmY9ZnVuY3Rpb24oKXt0aGlzLl9wbT1udWxsLHRoaXMuX2xpPW51bGwsdGhpcy5fc2NhbGVGYWN0b3I9bnVsbCx0aGlzLl9ub2Rlcj1udWxsLHRoaXMuX3BvaW50U25hcHBlcj1udWxsLHRoaXMuX25vZGVkU2VnU3RyaW5ncz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9wbT10LHRoaXMuX2xpPW5ldyBqbCx0aGlzLl9saS5zZXRQcmVjaXNpb25Nb2RlbCh0KSx0aGlzLl9zY2FsZUZhY3Rvcj10LmdldFNjYWxlKCl9O3ZmLnByb3RvdHlwZS5jaGVja0NvcnJlY3RuZXNzPWZ1bmN0aW9uKHQpe3ZhciBlPXlwLmdldE5vZGVkU3Vic3RyaW5ncyh0KSxuPW5ldyB1ZihlKTt0cnl7bi5jaGVja1ZhbGlkKCl9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgU2wpKXRocm93IHQ7dC5wcmludFN0YWNrVHJhY2UoKX19LHZmLnByb3RvdHlwZS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXtyZXR1cm4geXAuZ2V0Tm9kZWRTdWJzdHJpbmdzKHRoaXMuX25vZGVkU2VnU3RyaW5ncyl9LHZmLnByb3RvdHlwZS5zbmFwUm91bmQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmZpbmRJbnRlcmlvckludGVyc2VjdGlvbnModCxlKTt0aGlzLmNvbXB1dGVJbnRlcnNlY3Rpb25TbmFwcyhuKSx0aGlzLmNvbXB1dGVWZXJ0ZXhTbmFwcyh0KX0sdmYucHJvdG90eXBlLmZpbmRJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgeWYoZSk7cmV0dXJuIHRoaXMuX25vZGVyLnNldFNlZ21lbnRJbnRlcnNlY3RvcihuKSx0aGlzLl9ub2Rlci5jb21wdXRlTm9kZXModCksbi5nZXRJbnRlcmlvckludGVyc2VjdGlvbnMoKX0sdmYucHJvdG90eXBlLmNvbXB1dGVWZXJ0ZXhTbmFwcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoZ2woYXJndW1lbnRzWzBdLGljKSlmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49ZS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7dC5jb21wdXRlVmVydGV4U25hcHMocil9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHlwKWZvcih2YXIgaT1hcmd1bWVudHNbMF0sbz1pLmdldENvb3JkaW5hdGVzKCkscz0wO3M8by5sZW5ndGg7cysrKXt2YXIgYT1uZXcgY2Yob1tzXSx0Ll9zY2FsZUZhY3Rvcix0Ll9saSksdT10Ll9wb2ludFNuYXBwZXIuc25hcChhLGkscyk7dSYmaS5hZGRJbnRlcnNlY3Rpb24ob1tzXSxzKX19LHZmLnByb3RvdHlwZS5jb21wdXRlTm9kZXM9ZnVuY3Rpb24odCl7dGhpcy5fbm9kZWRTZWdTdHJpbmdzPXQsdGhpcy5fbm9kZXI9bmV3IElwLHRoaXMuX3BvaW50U25hcHBlcj1uZXcgZmYodGhpcy5fbm9kZXIuZ2V0SW5kZXgoKSksdGhpcy5zbmFwUm91bmQodCx0aGlzLl9saSl9LHZmLnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0aW9uU25hcHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKSxpPW5ldyBjZihyLGUuX3NjYWxlRmFjdG9yLGUuX2xpKTtlLl9wb2ludFNuYXBwZXIuc25hcChpKX19LHZmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblticF19LHZmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB2Zn07dmFyIF9mPWZ1bmN0aW9uKCl7aWYodGhpcy5fYXJnR2VvbT1udWxsLHRoaXMuX2Rpc3RhbmNlPW51bGwsdGhpcy5fYnVmUGFyYW1zPW5ldyBTcCx0aGlzLl9yZXN1bHRHZW9tZXRyeT1udWxsLHRoaXMuX3NhdmVFeGNlcHRpb249bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2FyZ0dlb209dH1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5fYXJnR2VvbT1lLHRoaXMuX2J1ZlBhcmFtcz1ufX0sbWY9e0NBUF9ST1VORDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfQlVUVDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfRkxBVDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfU1FVQVJFOntjb25maWd1cmFibGU6ITB9LE1BWF9QUkVDSVNJT05fRElHSVRTOntjb25maWd1cmFibGU6ITB9fTtfZi5wcm90b3R5cGUuYnVmZmVyRml4ZWRQcmVjaXNpb249ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGFmKG5ldyB2ZihuZXcgZ2goMSkpLHQuZ2V0U2NhbGUoKSksbj1uZXcgc2YodGhpcy5fYnVmUGFyYW1zKTtuLnNldFdvcmtpbmdQcmVjaXNpb25Nb2RlbCh0KSxuLnNldE5vZGVyKGUpLHRoaXMuX3Jlc3VsdEdlb21ldHJ5PW4uYnVmZmVyKHRoaXMuX2FyZ0dlb20sdGhpcy5fZGlzdGFuY2UpfSxfZi5wcm90b3R5cGUuYnVmZmVyUmVkdWNlZFByZWNpc2lvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1fZi5NQVhfUFJFQ0lTSU9OX0RJR0lUUztlPj0wO2UtLSl7dHJ5e3QuYnVmZmVyUmVkdWNlZFByZWNpc2lvbihlKX1jYXRjaChlKXtpZighKGUgaW5zdGFuY2VvZiBPaCkpdGhyb3cgZTt0Ll9zYXZlRXhjZXB0aW9uPWV9aWYobnVsbCE9PXQuX3Jlc3VsdEdlb21ldHJ5KXJldHVybiBudWxsfXRocm93IHRoaXMuX3NhdmVFeGNlcHRpb259aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPV9mLnByZWNpc2lvblNjYWxlRmFjdG9yKHRoaXMuX2FyZ0dlb20sdGhpcy5fZGlzdGFuY2UsbiksaT1uZXcgZ2gocik7dGhpcy5idWZmZXJGaXhlZFByZWNpc2lvbihpKX19LF9mLnByb3RvdHlwZS5jb21wdXRlR2VvbWV0cnk9ZnVuY3Rpb24oKXtpZih0aGlzLmJ1ZmZlck9yaWdpbmFsUHJlY2lzaW9uKCksbnVsbCE9PXRoaXMuX3Jlc3VsdEdlb21ldHJ5KXJldHVybiBudWxsO3ZhciB0PXRoaXMuX2FyZ0dlb20uZ2V0RmFjdG9yeSgpLmdldFByZWNpc2lvbk1vZGVsKCk7dC5nZXRUeXBlKCk9PT1naC5GSVhFRD90aGlzLmJ1ZmZlckZpeGVkUHJlY2lzaW9uKHQpOnRoaXMuYnVmZmVyUmVkdWNlZFByZWNpc2lvbigpfSxfZi5wcm90b3R5cGUuc2V0UXVhZHJhbnRTZWdtZW50cz1mdW5jdGlvbih0KXt0aGlzLl9idWZQYXJhbXMuc2V0UXVhZHJhbnRTZWdtZW50cyh0KX0sX2YucHJvdG90eXBlLmJ1ZmZlck9yaWdpbmFsUHJlY2lzaW9uPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBzZih0aGlzLl9idWZQYXJhbXMpO3RoaXMuX3Jlc3VsdEdlb21ldHJ5PXQuYnVmZmVyKHRoaXMuX2FyZ0dlb20sdGhpcy5fZGlzdGFuY2UpfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIGtsKSl0aHJvdyB0O3RoaXMuX3NhdmVFeGNlcHRpb249dH19LF9mLnByb3RvdHlwZS5nZXRSZXN1bHRHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGlzdGFuY2U9dCx0aGlzLmNvbXB1dGVHZW9tZXRyeSgpLHRoaXMuX3Jlc3VsdEdlb21ldHJ5fSxfZi5wcm90b3R5cGUuc2V0RW5kQ2FwU3R5bGU9ZnVuY3Rpb24odCl7dGhpcy5fYnVmUGFyYW1zLnNldEVuZENhcFN0eWxlKHQpfSxfZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sX2YucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIF9mfSxfZi5idWZmZXJPcD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1uZXcgX2YodCkscj1uLmdldFJlc3VsdEdlb21ldHJ5KGUpO3JldHVybiByfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1syXSkmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgV2wmJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1uZXcgX2YoaSk7YS5zZXRRdWFkcmFudFNlZ21lbnRzKHMpO3ZhciB1PWEuZ2V0UmVzdWx0R2VvbWV0cnkobyk7cmV0dXJuIHV9aWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBTcCYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBXbCYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBsPWFyZ3VtZW50c1swXSxjPWFyZ3VtZW50c1sxXSxoPWFyZ3VtZW50c1syXSxwPW5ldyBfZihsLGgpLGY9cC5nZXRSZXN1bHRHZW9tZXRyeShjKTtyZXR1cm4gZn19ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGc9YXJndW1lbnRzWzBdLGQ9YXJndW1lbnRzWzFdLHk9YXJndW1lbnRzWzJdLHY9YXJndW1lbnRzWzNdLF89bmV3IF9mKGcpO18uc2V0UXVhZHJhbnRTZWdtZW50cyh5KSxfLnNldEVuZENhcFN0eWxlKHYpO3ZhciBtPV8uZ2V0UmVzdWx0R2VvbWV0cnkoZCk7cmV0dXJuIG19fSxfZi5wcmVjaXNpb25TY2FsZUZhY3Rvcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXRFbnZlbG9wZUludGVybmFsKCksaT1kbC5tYXgoTWF0aC5hYnMoci5nZXRNYXhYKCkpLE1hdGguYWJzKHIuZ2V0TWF4WSgpKSxNYXRoLmFicyhyLmdldE1pblgoKSksTWF0aC5hYnMoci5nZXRNaW5ZKCkpKSsyKihlPjA/ZTowKSxvPW4tTWF0aC50cnVuYyhNYXRoLmxvZyhpKS9NYXRoLmxvZygxMCkrMSk7cmV0dXJuIE1hdGgucG93KDEwLG8pfSxtZi5DQVBfUk9VTkQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFNwLkNBUF9ST1VORH0sbWYuQ0FQX0JVVFQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFNwLkNBUF9GTEFUfSxtZi5DQVBfRkxBVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gU3AuQ0FQX0ZMQVR9LG1mLkNBUF9TUVVBUkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFNwLkNBUF9TUVVBUkV9LG1mLk1BWF9QUkVDSVNJT05fRElHSVRTLmdldD1mdW5jdGlvbigpe3JldHVybiAxMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoX2YsbWYpO3ZhciB4Zj1mdW5jdGlvbigpe3RoaXMuX3B0PVtuZXcgdWwsbmV3IHVsXSx0aGlzLl9kaXN0YW5jZT1ubC5OYU4sdGhpcy5faXNOdWxsPSEwfTt4Zi5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHR9LHhmLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdFt0XX0seGYucHJvdG90eXBlLnNldE1pbmltdW09ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0TWluaW11bSh0Ll9wdFswXSx0Ll9wdFsxXSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKHRoaXMuX2lzTnVsbClyZXR1cm4gdGhpcy5pbml0aWFsaXplKGUsbiksbnVsbDt2YXIgcj1lLmRpc3RhbmNlKG4pO3I8dGhpcy5fZGlzdGFuY2UmJnRoaXMuaW5pdGlhbGl6ZShlLG4scil9fSx4Zi5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuX2lzTnVsbD0hMDtlbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fcHRbMF0uc2V0Q29vcmRpbmF0ZSh0KSx0aGlzLl9wdFsxXS5zZXRDb29yZGluYXRlKGUpLHRoaXMuX2Rpc3RhbmNlPXQuZGlzdGFuY2UoZSksdGhpcy5faXNOdWxsPSExfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXTt0aGlzLl9wdFswXS5zZXRDb29yZGluYXRlKG4pLHRoaXMuX3B0WzFdLnNldENvb3JkaW5hdGUociksdGhpcy5fZGlzdGFuY2U9aSx0aGlzLl9pc051bGw9ITF9fSx4Zi5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2V9LHhmLnByb3RvdHlwZS5zZXRNYXhpbXVtPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldE1heGltdW0odC5fcHRbMF0sdC5fcHRbMV0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLl9pc051bGwpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShlLG4pLG51bGw7dmFyIHI9ZS5kaXN0YW5jZShuKTtyPnRoaXMuX2Rpc3RhbmNlJiZ0aGlzLmluaXRpYWxpemUoZSxuLHIpfX0seGYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHhmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB4Zn07dmFyIEVmPWZ1bmN0aW9uKCl7fTtFZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRWYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEVmfSxFZi5jb21wdXRlRGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIHhmJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFpjJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKWZvcih2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj10LmdldENvb3JkaW5hdGVzKCksaT1uZXcgdnAsbz0wO288ci5sZW5ndGgtMTtvKyspe2kuc2V0Q29vcmRpbmF0ZXMocltvXSxyW28rMV0pO3ZhciBzPWkuY2xvc2VzdFBvaW50KGUpO24uc2V0TWluaW11bShzLGUpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiB4ZiYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0aCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB1bCl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdO0VmLmNvbXB1dGVEaXN0YW5jZShhLmdldEV4dGVyaW9yUmluZygpLHUsbCk7Zm9yKHZhciBjPTA7YzxhLmdldE51bUludGVyaW9yUmluZygpO2MrKylFZi5jb21wdXRlRGlzdGFuY2UoYS5nZXRJbnRlcmlvclJpbmdOKGMpLHUsbCl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIHhmJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFdsJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKXt2YXIgaD1hcmd1bWVudHNbMF0scD1hcmd1bWVudHNbMV0sZj1hcmd1bWVudHNbMl07aWYoaCBpbnN0YW5jZW9mIFpjKUVmLmNvbXB1dGVEaXN0YW5jZShoLHAsZik7ZWxzZSBpZihoIGluc3RhbmNlb2YgdGgpRWYuY29tcHV0ZURpc3RhbmNlKGgscCxmKTtlbHNlIGlmKGggaW5zdGFuY2VvZiBrYylmb3IodmFyIGc9aCxkPTA7ZDxnLmdldE51bUdlb21ldHJpZXMoKTtkKyspe3ZhciB5PWcuZ2V0R2VvbWV0cnlOKGQpO0VmLmNvbXB1dGVEaXN0YW5jZSh5LHAsZil9ZWxzZSBmLnNldE1pbmltdW0oaC5nZXRDb29yZGluYXRlKCkscCl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIHhmJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZwJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKXt2YXIgdj1hcmd1bWVudHNbMF0sXz1hcmd1bWVudHNbMV0sbT1hcmd1bWVudHNbMl0seD12LmNsb3Nlc3RQb2ludChfKTttLnNldE1pbmltdW0oeCxfKX19O3ZhciBiZj1mdW5jdGlvbih0KXt0aGlzLl9tYXhQdERpc3Q9bmV3IHhmLHRoaXMuX2lucHV0R2VvbT10fHxudWxsfSx3Zj17TWF4UG9pbnREaXN0YW5jZUZpbHRlcjp7Y29uZmlndXJhYmxlOiEwfSxNYXhNaWRwb2ludERpc3RhbmNlRmlsdGVyOntjb25maWd1cmFibGU6ITB9fTtiZi5wcm90b3R5cGUuY29tcHV0ZU1heE1pZHBvaW50RGlzdGFuY2U9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IE5mKHRoaXMuX2lucHV0R2VvbSk7dC5hcHBseShlKSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bShlLmdldE1heFBvaW50RGlzdGFuY2UoKSl9LGJmLnByb3RvdHlwZS5jb21wdXRlTWF4VmVydGV4RGlzdGFuY2U9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IElmKHRoaXMuX2lucHV0R2VvbSk7dC5hcHBseShlKSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bShlLmdldE1heFBvaW50RGlzdGFuY2UoKSl9LGJmLnByb3RvdHlwZS5maW5kRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1heFZlcnRleERpc3RhbmNlKHQpLHRoaXMuY29tcHV0ZU1heE1pZHBvaW50RGlzdGFuY2UodCksdGhpcy5fbWF4UHREaXN0LmdldERpc3RhbmNlKCl9LGJmLnByb3RvdHlwZS5nZXREaXN0YW5jZVBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LGJmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxiZi5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYmZ9LHdmLk1heFBvaW50RGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIElmfSx3Zi5NYXhNaWRwb2ludERpc3RhbmNlRmlsdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBOZn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYmYsd2YpO3ZhciBJZj1mdW5jdGlvbih0KXt0aGlzLl9tYXhQdERpc3Q9bmV3IHhmLHRoaXMuX21pblB0RGlzdD1uZXcgeGYsdGhpcy5fZ2VvbT10fHxudWxsfTtJZi5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3RoaXMuX21pblB0RGlzdC5pbml0aWFsaXplKCksRWYuY29tcHV0ZURpc3RhbmNlKHRoaXMuX2dlb20sdCx0aGlzLl9taW5QdERpc3QpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKHRoaXMuX21pblB0RGlzdCl9LElmLnByb3RvdHlwZS5nZXRNYXhQb2ludERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heFB0RGlzdH0sSWYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0tsXX0sSWYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIElmfTt2YXIgTmY9ZnVuY3Rpb24odCl7dGhpcy5fbWF4UHREaXN0PW5ldyB4Zix0aGlzLl9taW5QdERpc3Q9bmV3IHhmLHRoaXMuX2dlb209dHx8bnVsbH07TmYucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0LGUpe2lmKDA9PT1lKXJldHVybiBudWxsO3ZhciBuPXQuZ2V0Q29vcmRpbmF0ZShlLTEpLHI9dC5nZXRDb29yZGluYXRlKGUpLGk9bmV3IHVsKChuLngrci54KS8yLChuLnkrci55KS8yKTt0aGlzLl9taW5QdERpc3QuaW5pdGlhbGl6ZSgpLEVmLmNvbXB1dGVEaXN0YW5jZSh0aGlzLl9nZW9tLGksdGhpcy5fbWluUHREaXN0KSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bSh0aGlzLl9taW5QdERpc3QpfSxOZi5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LE5mLnByb3RvdHlwZS5pc0dlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3JldHVybiExfSxOZi5wcm90b3R5cGUuZ2V0TWF4UG9pbnREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LE5mLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltGY119LE5mLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBOZn07dmFyIFNmPWZ1bmN0aW9uKHQpe3RoaXMuX2NvbXBzPXR8fG51bGx9O1NmLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIHRoJiZ0aGlzLl9jb21wcy5hZGQodCl9LFNmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltEY119LFNmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBTZn0sU2YuZ2V0UG9seWdvbnM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBTZi5nZXRQb2x5Z29ucyh0LG5ldyBsYyl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4gZSBpbnN0YW5jZW9mIHRoP24uYWRkKGUpOmUgaW5zdGFuY2VvZiBrYyYmZS5hcHBseShuZXcgU2YobikpLG59fTt2YXIgQ2Y9ZnVuY3Rpb24oKXtpZih0aGlzLl9saW5lcz1udWxsLHRoaXMuX2lzRm9yY2VkVG9MaW5lU3RyaW5nPSExLDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbGluZXM9dH1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5fbGluZXM9ZSx0aGlzLl9pc0ZvcmNlZFRvTGluZVN0cmluZz1ufX07Q2YucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXtpZih0aGlzLl9pc0ZvcmNlZFRvTGluZVN0cmluZyYmdCBpbnN0YW5jZW9mIG5oKXt2YXIgZT10LmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lU3RyaW5nKHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkpO3JldHVybiB0aGlzLl9saW5lcy5hZGQoZSksbnVsbH10IGluc3RhbmNlb2YgWmMmJnRoaXMuX2xpbmVzLmFkZCh0KX0sQ2YucHJvdG90eXBlLnNldEZvcmNlVG9MaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX2lzRm9yY2VkVG9MaW5lU3RyaW5nPXR9LENmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltIbF19LENmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDZn0sQ2YuZ2V0R2VvbWV0cnk9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0LmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KENmLmdldExpbmVzKHQpKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiBlLmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KENmLmdldExpbmVzKGUsbikpfX0sQ2YuZ2V0TGluZXM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBDZi5nZXRMaW5lcyh0LCExKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoZ2woYXJndW1lbnRzWzBdLGljKSYmZ2woYXJndW1lbnRzWzFdLGljKSl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWUuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO0NmLmdldExpbmVzKGksbil9cmV0dXJuIG59aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBXbCYmImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1uZXcgbGM7cmV0dXJuIG8uYXBwbHkobmV3IENmKGEscykpLGF9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBXbCYmZ2woYXJndW1lbnRzWzFdLGljKSl7dmFyIHU9YXJndW1lbnRzWzBdLGw9YXJndW1lbnRzWzFdO3JldHVybiB1IGluc3RhbmNlb2YgWmM/bC5hZGQodSk6dS5hcHBseShuZXcgQ2YobCkpLGx9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmZ2woYXJndW1lbnRzWzBdLGljKSYmZ2woYXJndW1lbnRzWzFdLGljKSl7Zm9yKHZhciBjPWFyZ3VtZW50c1swXSxoPWFyZ3VtZW50c1sxXSxwPWFyZ3VtZW50c1syXSxmPWMuaXRlcmF0b3IoKTtmLmhhc05leHQoKTspe3ZhciBnPWYubmV4dCgpO0NmLmdldExpbmVzKGcsaCxwKX1yZXR1cm4gaH1pZigiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgV2wmJmdsKGFyZ3VtZW50c1sxXSxpYykpe3ZhciBkPWFyZ3VtZW50c1swXSx5PWFyZ3VtZW50c1sxXSx2PWFyZ3VtZW50c1syXTtyZXR1cm4gZC5hcHBseShuZXcgQ2YoeSx2KSkseX19fTt2YXIgUGY9ZnVuY3Rpb24oKXtpZih0aGlzLl9ib3VuZGFyeVJ1bGU9UWwuT0dDX1NGU19CT1VOREFSWV9SVUxFLHRoaXMuX2lzSW49bnVsbCx0aGlzLl9udW1Cb3VuZGFyaWVzPW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtpZihudWxsPT09dCl0aHJvdyBuZXcgZWwoIlJ1bGUgbXVzdCBiZSBub24tbnVsbCIpO3RoaXMuX2JvdW5kYXJ5UnVsZT10fX07UGYucHJvdG90eXBlLmxvY2F0ZUludGVybmFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHRoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYobi5pc0VtcHR5KCkpcmV0dXJuIHBsLkVYVEVSSU9SO3ZhciByPW4uZ2V0RXh0ZXJpb3JSaW5nKCksaT10aGlzLmxvY2F0ZUluUG9seWdvblJpbmcoZSxyKTtpZihpPT09cGwuRVhURVJJT1IpcmV0dXJuIHBsLkVYVEVSSU9SO2lmKGk9PT1wbC5CT1VOREFSWSlyZXR1cm4gcGwuQk9VTkRBUlk7Zm9yKHZhciBvPTA7bzxuLmdldE51bUludGVyaW9yUmluZygpO28rKyl7dmFyIHM9bi5nZXRJbnRlcmlvclJpbmdOKG8pLGE9dC5sb2NhdGVJblBvbHlnb25SaW5nKGUscyk7aWYoYT09PXBsLklOVEVSSU9SKXJldHVybiBwbC5FWFRFUklPUjtpZihhPT09cGwuQk9VTkRBUlkpcmV0dXJuIHBsLkJPVU5EQVJZfXJldHVybiBwbC5JTlRFUklPUn1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIFpjKXt2YXIgdT1hcmd1bWVudHNbMF0sbD1hcmd1bWVudHNbMV07aWYoIWwuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmludGVyc2VjdHModSkpcmV0dXJuIHBsLkVYVEVSSU9SO3ZhciBjPWwuZ2V0Q29vcmRpbmF0ZXMoKTtyZXR1cm4gbC5pc0Nsb3NlZCgpfHwhdS5lcXVhbHMoY1swXSkmJiF1LmVxdWFscyhjW2MubGVuZ3RoLTFdKT9YbC5pc09uTGluZSh1LGMpP3BsLklOVEVSSU9SOnBsLkVYVEVSSU9SOnBsLkJPVU5EQVJZfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWwmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgUWMpe3ZhciBoPWFyZ3VtZW50c1swXSxwPWFyZ3VtZW50c1sxXSxmPXAuZ2V0Q29vcmRpbmF0ZSgpO3JldHVybiBmLmVxdWFsczJEKGgpP3BsLklOVEVSSU9SOnBsLkVYVEVSSU9SfX0sUGYucHJvdG90eXBlLmxvY2F0ZUluUG9seWdvblJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRFbnZlbG9wZUludGVybmFsKCkuaW50ZXJzZWN0cyh0KT9YbC5sb2NhdGVQb2ludEluUmluZyh0LGUuZ2V0Q29vcmRpbmF0ZXMoKSk6cGwuRVhURVJJT1J9LFBmLnByb3RvdHlwZS5pbnRlcnNlY3RzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubG9jYXRlKHQsZSkhPT1wbC5FWFRFUklPUn0sUGYucHJvdG90eXBlLnVwZGF0ZUxvY2F0aW9uSW5mbz1mdW5jdGlvbih0KXt0PT09cGwuSU5URVJJT1ImJih0aGlzLl9pc0luPSEwKSx0PT09cGwuQk9VTkRBUlkmJnRoaXMuX251bUJvdW5kYXJpZXMrK30sUGYucHJvdG90eXBlLmNvbXB1dGVMb2NhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoZSBpbnN0YW5jZW9mIFFjJiZ0aGlzLnVwZGF0ZUxvY2F0aW9uSW5mbyh0aGlzLmxvY2F0ZUludGVybmFsKHQsZSkpLGUgaW5zdGFuY2VvZiBaYyl0aGlzLnVwZGF0ZUxvY2F0aW9uSW5mbyh0aGlzLmxvY2F0ZUludGVybmFsKHQsZSkpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIHRoKXRoaXMudXBkYXRlTG9jYXRpb25JbmZvKHRoaXMubG9jYXRlSW50ZXJuYWwodCxlKSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgR2MpZm9yKHZhciByPWUsaT0wO2k8ci5nZXROdW1HZW9tZXRyaWVzKCk7aSsrKXt2YXIgbz1yLmdldEdlb21ldHJ5TihpKTtuLnVwZGF0ZUxvY2F0aW9uSW5mbyhuLmxvY2F0ZUludGVybmFsKHQsbykpfWVsc2UgaWYoZSBpbnN0YW5jZW9mIHJoKWZvcih2YXIgcz1lLGE9MDthPHMuZ2V0TnVtR2VvbWV0cmllcygpO2ErKyl7dmFyIHU9cy5nZXRHZW9tZXRyeU4oYSk7bi51cGRhdGVMb2NhdGlvbkluZm8obi5sb2NhdGVJbnRlcm5hbCh0LHUpKX1lbHNlIGlmKGUgaW5zdGFuY2VvZiBrYylmb3IodmFyIGw9bmV3IFVwKGUpO2wuaGFzTmV4dCgpOyl7dmFyIGM9bC5uZXh0KCk7YyE9PWUmJm4uY29tcHV0ZUxvY2F0aW9uKHQsYyl9fSxQZi5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaXNFbXB0eSgpP3BsLkVYVEVSSU9SOmUgaW5zdGFuY2VvZiBaY3x8ZSBpbnN0YW5jZW9mIHRoP3RoaXMubG9jYXRlSW50ZXJuYWwodCxlKToodGhpcy5faXNJbj0hMSx0aGlzLl9udW1Cb3VuZGFyaWVzPTAsdGhpcy5jb21wdXRlTG9jYXRpb24odCxlKSx0aGlzLl9ib3VuZGFyeVJ1bGUuaXNJbkJvdW5kYXJ5KHRoaXMuX251bUJvdW5kYXJpZXMpP3BsLkJPVU5EQVJZOnRoaXMuX251bUJvdW5kYXJpZXM+MHx8dGhpcy5faXNJbj9wbC5JTlRFUklPUjpwbC5FWFRFUklPUil9LFBmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxQZi5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUGZ9O3ZhciBNZj1mdW5jdGlvbiB0KCl7aWYodGhpcy5fY29tcG9uZW50PW51bGwsdGhpcy5fc2VnSW5kZXg9bnVsbCx0aGlzLl9wdD1udWxsLDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dC5jYWxsKHRoaXMsZSx0LklOU0lERV9BUkVBLG4pfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXTt0aGlzLl9jb21wb25lbnQ9cix0aGlzLl9zZWdJbmRleD1pLHRoaXMuX3B0PW99fSxMZj17SU5TSURFX0FSRUE6e2NvbmZpZ3VyYWJsZTohMH19O01mLnByb3RvdHlwZS5pc0luc2lkZUFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VnSW5kZXg9PT1NZi5JTlNJREVfQVJFQX0sTWYucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHR9LE1mLnByb3RvdHlwZS5nZXRHZW9tZXRyeUNvbXBvbmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnR9LE1mLnByb3RvdHlwZS5nZXRTZWdtZW50SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VnSW5kZXh9LE1mLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxNZi5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTWZ9LExmLklOU0lERV9BUkVBLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhNZixMZik7dmFyIE9mPWZ1bmN0aW9uKHQpe3RoaXMuX3B0cz10fHxudWxsfTtPZi5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBRYyYmdGhpcy5fcHRzLmFkZCh0KX0sT2YucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0RjXX0sT2YucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE9mfSxPZi5nZXRQb2ludHM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0IGluc3RhbmNlb2YgUWM/bnAuc2luZ2xldG9uTGlzdCh0KTpPZi5nZXRQb2ludHModCxuZXcgbGMpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuIGUgaW5zdGFuY2VvZiBRYz9uLmFkZChlKTplIGluc3RhbmNlb2Yga2MmJmUuYXBwbHkobmV3IE9mKG4pKSxufX07dmFyIFJmPWZ1bmN0aW9uKCl7dGhpcy5fbG9jYXRpb25zPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xvY2F0aW9ucz10fTtSZi5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpeyh0IGluc3RhbmNlb2YgUWN8fHQgaW5zdGFuY2VvZiBaY3x8dCBpbnN0YW5jZW9mIHRoKSYmdGhpcy5fbG9jYXRpb25zLmFkZChuZXcgTWYodCwwLHQuZ2V0Q29vcmRpbmF0ZSgpKSl9LFJmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltEY119LFJmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBSZn0sUmYuZ2V0TG9jYXRpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBsYztyZXR1cm4gdC5hcHBseShuZXcgUmYoZSkpLGV9O3ZhciBUZj1mdW5jdGlvbigpe2lmKHRoaXMuX2dlb209bnVsbCx0aGlzLl90ZXJtaW5hdGVEaXN0YW5jZT0wLHRoaXMuX3B0TG9jYXRvcj1uZXcgUGYsdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbj1udWxsLHRoaXMuX21pbkRpc3RhbmNlPW5sLk1BWF9WQUxVRSwyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2dlb209W3QsZV0sdGhpcy5fdGVybWluYXRlRGlzdGFuY2U9MH1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl07dGhpcy5fZ2VvbT1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9nZW9tWzBdPW4sdGhpcy5fZ2VvbVsxXT1yLHRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlPWl9fTtUZi5wcm90b3R5cGUuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1uZXcgQXJyYXkoMikuZmlsbChudWxsKTtpZih0aGlzLmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKDAsZSksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsO3RoaXMuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2UoMSxlKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT0xLW4sbz1TZi5nZXRQb2x5Z29ucyh0aGlzLl9nZW9tW25dKTtpZihvLnNpemUoKT4wKXt2YXIgcz1SZi5nZXRMb2NhdGlvbnModGhpcy5fZ2VvbVtpXSk7aWYodGhpcy5jb21wdXRlQ29udGFpbm1lbnREaXN0YW5jZShzLG8sciksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiB0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uW2ldPXJbMF0sdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbltuXT1yWzFdLG51bGx9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmZ2woYXJndW1lbnRzWzBdLGFjKSYmZ2woYXJndW1lbnRzWzFdLGFjKSl7Zm9yKHZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXSxsPWFyZ3VtZW50c1syXSxjPTA7YzxhLnNpemUoKTtjKyspZm9yKHZhciBoPWEuZ2V0KGMpLHA9MDtwPHUuc2l6ZSgpO3ArKylpZih0LmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKGgsdS5nZXQocCksbCksdC5fbWluRGlzdGFuY2U8PXQuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNZiYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB0aCl7dmFyIGY9YXJndW1lbnRzWzBdLGc9YXJndW1lbnRzWzFdLGQ9YXJndW1lbnRzWzJdLHk9Zi5nZXRDb29yZGluYXRlKCk7aWYocGwuRVhURVJJT1IhPT10aGlzLl9wdExvY2F0b3IubG9jYXRlKHksZykpcmV0dXJuIHRoaXMuX21pbkRpc3RhbmNlPTAsZFswXT1mLGRbMV09bmV3IE1mKGcseSksbnVsbH19LFRmLnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2VMaW5lc1BvaW50cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXRoaXMsaT0wO2k8dC5zaXplKCk7aSsrKWZvcih2YXIgbz10LmdldChpKSxzPTA7czxlLnNpemUoKTtzKyspe3ZhciBhPWUuZ2V0KHMpO2lmKHIuY29tcHV0ZU1pbkRpc3RhbmNlKG8sYSxuKSxyLl9taW5EaXN0YW5jZTw9ci5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fSxUZi5wcm90b3R5cGUuY29tcHV0ZUZhY2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQXJyYXkoMikuZmlsbChudWxsKSxlPUNmLmdldExpbmVzKHRoaXMuX2dlb21bMF0pLG49Q2YuZ2V0TGluZXModGhpcy5fZ2VvbVsxXSkscj1PZi5nZXRQb2ludHModGhpcy5fZ2VvbVswXSksaT1PZi5nZXRQb2ludHModGhpcy5fZ2VvbVsxXSk7cmV0dXJuIHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlTGluZXMoZSxuLHQpLHRoaXMudXBkYXRlTWluRGlzdGFuY2UodCwhMSksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlP251bGw6KHRbMF09bnVsbCx0WzFdPW51bGwsdGhpcy5jb21wdXRlTWluRGlzdGFuY2VMaW5lc1BvaW50cyhlLGksdCksdGhpcy51cGRhdGVNaW5EaXN0YW5jZSh0LCExKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2U/bnVsbDoodFswXT1udWxsLHRbMV09bnVsbCx0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZUxpbmVzUG9pbnRzKG4scix0KSx0aGlzLnVwZGF0ZU1pbkRpc3RhbmNlKHQsITApLHRoaXMuX21pbkRpc3RhbmNlPD10aGlzLl90ZXJtaW5hdGVEaXN0YW5jZT9udWxsOih0WzBdPW51bGwsdFsxXT1udWxsLHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlUG9pbnRzKHIsaSx0KSx2b2lkIHRoaXMudXBkYXRlTWluRGlzdGFuY2UodCwhMSkpKSl9LFRmLnByb3RvdHlwZS5uZWFyZXN0TG9jYXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlKCksdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbn0sVGYucHJvdG90eXBlLnVwZGF0ZU1pbkRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09PXRbMF0pcmV0dXJuIG51bGw7ZT8odGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvblswXT10WzFdLHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMV09dFswXSk6KHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMF09dFswXSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzFdPXRbMV0pfSxUZi5wcm90b3R5cGUubmVhcmVzdFBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZSgpLFt0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzBdLmdldENvb3JkaW5hdGUoKSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzFdLmdldENvb3JkaW5hdGUoKV19LFRmLnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihudWxsIT09dGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbilyZXR1cm4gbnVsbDtpZih0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2UoKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGw7dGhpcy5jb21wdXRlRmFjZXREaXN0YW5jZSgpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBcnJheSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBaYyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBRYyl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO2lmKGUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmRpc3RhbmNlKG4uZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKT50aGlzLl9taW5EaXN0YW5jZSlyZXR1cm4gbnVsbDtmb3IodmFyIGk9ZS5nZXRDb29yZGluYXRlcygpLG89bi5nZXRDb29yZGluYXRlKCkscz0wO3M8aS5sZW5ndGgtMTtzKyspe3ZhciBhPVhsLmRpc3RhbmNlUG9pbnRMaW5lKG8saVtzXSxpW3MrMV0pO2lmKGE8dC5fbWluRGlzdGFuY2Upe3QuX21pbkRpc3RhbmNlPWE7dmFyIHU9bmV3IHZwKGlbc10saVtzKzFdKSxsPXUuY2xvc2VzdFBvaW50KG8pO3JbMF09bmV3IE1mKGUscyxsKSxyWzFdPW5ldyBNZihuLDAsbyl9aWYodC5fbWluRGlzdGFuY2U8PXQuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfX1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgQXJyYXkmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgWmMmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgWmMpe3ZhciBjPWFyZ3VtZW50c1swXSxoPWFyZ3VtZW50c1sxXSxwPWFyZ3VtZW50c1syXTtpZihjLmdldEVudmVsb3BlSW50ZXJuYWwoKS5kaXN0YW5jZShoLmdldEVudmVsb3BlSW50ZXJuYWwoKSk+dGhpcy5fbWluRGlzdGFuY2UpcmV0dXJuIG51bGw7Zm9yKHZhciBmPWMuZ2V0Q29vcmRpbmF0ZXMoKSxnPWguZ2V0Q29vcmRpbmF0ZXMoKSxkPTA7ZDxmLmxlbmd0aC0xO2QrKylmb3IodmFyIHk9MDt5PGcubGVuZ3RoLTE7eSsrKXt2YXIgdj1YbC5kaXN0YW5jZUxpbmVMaW5lKGZbZF0sZltkKzFdLGdbeV0sZ1t5KzFdKTtpZih2PHQuX21pbkRpc3RhbmNlKXt0Ll9taW5EaXN0YW5jZT12O3ZhciBfPW5ldyB2cChmW2RdLGZbZCsxXSksbT1uZXcgdnAoZ1t5XSxnW3krMV0pLHg9Xy5jbG9zZXN0UG9pbnRzKG0pO3BbMF09bmV3IE1mKGMsZCx4WzBdKSxwWzFdPW5ldyBNZihoLHkseFsxXSl9aWYodC5fbWluRGlzdGFuY2U8PXQuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfX19LFRmLnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2VQb2ludHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10aGlzLGk9MDtpPHQuc2l6ZSgpO2krKylmb3IodmFyIG89dC5nZXQoaSkscz0wO3M8ZS5zaXplKCk7cysrKXt2YXIgYT1lLmdldChzKSx1PW8uZ2V0Q29vcmRpbmF0ZSgpLmRpc3RhbmNlKGEuZ2V0Q29vcmRpbmF0ZSgpKTtpZih1PHIuX21pbkRpc3RhbmNlJiYoci5fbWluRGlzdGFuY2U9dSxuWzBdPW5ldyBNZihvLDAsby5nZXRDb29yZGluYXRlKCkpLG5bMV09bmV3IE1mKGEsMCxhLmdldENvb3JkaW5hdGUoKSkpLHIuX21pbkRpc3RhbmNlPD1yLl90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gbnVsbH19LFRmLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9nZW9tWzBdfHxudWxsPT09dGhpcy5fZ2VvbVsxXSl0aHJvdyBuZXcgZWwoIm51bGwgZ2VvbWV0cmllcyBhcmUgbm90IHN1cHBvcnRlZCIpO3JldHVybiB0aGlzLl9nZW9tWzBdLmlzRW1wdHkoKXx8dGhpcy5fZ2VvbVsxXS5pc0VtcHR5KCk/MDoodGhpcy5jb21wdXRlTWluRGlzdGFuY2UoKSx0aGlzLl9taW5EaXN0YW5jZSl9LFRmLnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2VMaW5lcz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXRoaXMsaT0wO2k8dC5zaXplKCk7aSsrKWZvcih2YXIgbz10LmdldChpKSxzPTA7czxlLnNpemUoKTtzKyspe3ZhciBhPWUuZ2V0KHMpO2lmKHIuY29tcHV0ZU1pbkRpc3RhbmNlKG8sYSxuKSxyLl9taW5EaXN0YW5jZTw9ci5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fSxUZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sVGYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFRmfSxUZi5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgVGYodCxlKS5kaXN0YW5jZSgpfSxUZi5pc1dpdGhpbkRpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IFRmKHQsZSxuKS5kaXN0YW5jZSgpPD1ufSxUZi5uZWFyZXN0UG9pbnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBUZih0LGUpLm5lYXJlc3RQb2ludHMoKX07dmFyIEFmPWZ1bmN0aW9uKCl7dGhpcy5fcHQ9W25ldyB1bCxuZXcgdWxdLHRoaXMuX2Rpc3RhbmNlPW5sLk5hTix0aGlzLl9pc051bGw9ITB9O0FmLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdH0sQWYucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B0W3RdfSxBZi5wcm90b3R5cGUuc2V0TWluaW11bT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRNaW5pbXVtKHQuX3B0WzBdLHQuX3B0WzFdKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYodGhpcy5faXNOdWxsKXJldHVybiB0aGlzLmluaXRpYWxpemUoZSxuKSxudWxsO3ZhciByPWUuZGlzdGFuY2Uobik7cjx0aGlzLl9kaXN0YW5jZSYmdGhpcy5pbml0aWFsaXplKGUsbixyKX19LEFmLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5faXNOdWxsPSEwO2Vsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wdFswXS5zZXRDb29yZGluYXRlKHQpLHRoaXMuX3B0WzFdLnNldENvb3JkaW5hdGUoZSksdGhpcy5fZGlzdGFuY2U9dC5kaXN0YW5jZShlKSx0aGlzLl9pc051bGw9ITF9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdO3RoaXMuX3B0WzBdLnNldENvb3JkaW5hdGUobiksdGhpcy5fcHRbMV0uc2V0Q29vcmRpbmF0ZShyKSx0aGlzLl9kaXN0YW5jZT1pLHRoaXMuX2lzTnVsbD0hMX19LEFmLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBGbC50b0xpbmVTdHJpbmcodGhpcy5fcHRbMF0sdGhpcy5fcHRbMV0pfSxBZi5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2V9LEFmLnByb3RvdHlwZS5zZXRNYXhpbXVtPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldE1heGltdW0odC5fcHRbMF0sdC5fcHRbMV0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLl9pc051bGwpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShlLG4pLG51bGw7dmFyIHI9ZS5kaXN0YW5jZShuKTtyPnRoaXMuX2Rpc3RhbmNlJiZ0aGlzLmluaXRpYWxpemUoZSxuLHIpfX0sQWYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEFmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBBZn07dmFyIERmPWZ1bmN0aW9uKCl7fTtEZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRGYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIERmfSxEZi5jb21wdXRlRGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFmJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFpjJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKWZvcih2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1uZXcgdnAsaT10LmdldENvb3JkaW5hdGVzKCksbz0wO288aS5sZW5ndGgtMTtvKyspe3Iuc2V0Q29vcmRpbmF0ZXMoaVtvXSxpW28rMV0pO3ZhciBzPXIuY2xvc2VzdFBvaW50KGUpO24uc2V0TWluaW11bShzLGUpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBBZiYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0aCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB1bCl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGw9YXJndW1lbnRzWzJdO0RmLmNvbXB1dGVEaXN0YW5jZShhLmdldEV4dGVyaW9yUmluZygpLHUsbCk7Zm9yKHZhciBjPTA7YzxhLmdldE51bUludGVyaW9yUmluZygpO2MrKylEZi5jb21wdXRlRGlzdGFuY2UoYS5nZXRJbnRlcmlvclJpbmdOKGMpLHUsbCl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFmJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFdsJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKXt2YXIgaD1hcmd1bWVudHNbMF0scD1hcmd1bWVudHNbMV0sZj1hcmd1bWVudHNbMl07aWYoaCBpbnN0YW5jZW9mIFpjKURmLmNvbXB1dGVEaXN0YW5jZShoLHAsZik7ZWxzZSBpZihoIGluc3RhbmNlb2YgdGgpRGYuY29tcHV0ZURpc3RhbmNlKGgscCxmKTtlbHNlIGlmKGggaW5zdGFuY2VvZiBrYylmb3IodmFyIGc9aCxkPTA7ZDxnLmdldE51bUdlb21ldHJpZXMoKTtkKyspe3ZhciB5PWcuZ2V0R2VvbWV0cnlOKGQpO0RmLmNvbXB1dGVEaXN0YW5jZSh5LHAsZil9ZWxzZSBmLnNldE1pbmltdW0oaC5nZXRDb29yZGluYXRlKCkscCl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFmJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZwJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHVsKXt2YXIgdj1hcmd1bWVudHNbMF0sXz1hcmd1bWVudHNbMV0sbT1hcmd1bWVudHNbMl0seD12LmNsb3Nlc3RQb2ludChfKTttLnNldE1pbmltdW0oeCxfKX19O3ZhciBGZj1mdW5jdGlvbigpe3RoaXMuX2cwPW51bGwsdGhpcy5fZzE9bnVsbCx0aGlzLl9wdERpc3Q9bmV3IEFmLHRoaXMuX2RlbnNpZnlGcmFjPTA7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2cwPXQsdGhpcy5fZzE9ZX0sa2Y9e01heFBvaW50RGlzdGFuY2VGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH0sTWF4RGVuc2lmaWVkQnlGcmFjdGlvbkRpc3RhbmNlRmlsdGVyOntjb25maWd1cmFibGU6ITB9fTtGZi5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHREaXN0LmdldENvb3JkaW5hdGVzKCl9LEZmLnByb3RvdHlwZS5zZXREZW5zaWZ5RnJhY3Rpb249ZnVuY3Rpb24odCl7aWYodD4xfHx0PD0wKXRocm93IG5ldyBlbCgiRnJhY3Rpb24gaXMgbm90IGluIHJhbmdlICgwLjAgLSAxLjBdIik7dGhpcy5fZGVuc2lmeUZyYWM9dH0sRmYucHJvdG90eXBlLmNvbXB1dGU9ZnVuY3Rpb24odCxlKXt0aGlzLmNvbXB1dGVPcmllbnRlZERpc3RhbmNlKHQsZSx0aGlzLl9wdERpc3QpLHRoaXMuY29tcHV0ZU9yaWVudGVkRGlzdGFuY2UoZSx0LHRoaXMuX3B0RGlzdCl9LEZmLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXB1dGUodGhpcy5fZzAsdGhpcy5fZzEpLHRoaXMuX3B0RGlzdC5nZXREaXN0YW5jZSgpfSxGZi5wcm90b3R5cGUuY29tcHV0ZU9yaWVudGVkRGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBHZihlKTtpZih0LmFwcGx5KHIpLG4uc2V0TWF4aW11bShyLmdldE1heFBvaW50RGlzdGFuY2UoKSksdGhpcy5fZGVuc2lmeUZyYWM+MCl7dmFyIGk9bmV3IHFmKGUsdGhpcy5fZGVuc2lmeUZyYWMpO3QuYXBwbHkoaSksbi5zZXRNYXhpbXVtKGkuZ2V0TWF4UG9pbnREaXN0YW5jZSgpKX19LEZmLnByb3RvdHlwZS5vcmllbnRlZERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZU9yaWVudGVkRGlzdGFuY2UodGhpcy5fZzAsdGhpcy5fZzEsdGhpcy5fcHREaXN0KSx0aGlzLl9wdERpc3QuZ2V0RGlzdGFuY2UoKX0sRmYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEZmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBGZn0sRmYuZGlzdGFuY2U9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IEZmKHQsZSk7cmV0dXJuIG4uZGlzdGFuY2UoKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdLHM9bmV3IEZmKHIsaSk7cmV0dXJuIHMuc2V0RGVuc2lmeUZyYWN0aW9uKG8pLHMuZGlzdGFuY2UoKX19LGtmLk1heFBvaW50RGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEdmfSxrZi5NYXhEZW5zaWZpZWRCeUZyYWN0aW9uRGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHFmfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGZixrZik7dmFyIEdmPWZ1bmN0aW9uKCl7dGhpcy5fbWF4UHREaXN0PW5ldyBBZix0aGlzLl9taW5QdERpc3Q9bmV3IEFmLHRoaXMuX2V1Y2xpZGVhbkRpc3Q9bmV3IERmLHRoaXMuX2dlb209bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZ2VvbT10fTtHZi5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3RoaXMuX21pblB0RGlzdC5pbml0aWFsaXplKCksRGYuY29tcHV0ZURpc3RhbmNlKHRoaXMuX2dlb20sdCx0aGlzLl9taW5QdERpc3QpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKHRoaXMuX21pblB0RGlzdCl9LEdmLnByb3RvdHlwZS5nZXRNYXhQb2ludERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heFB0RGlzdH0sR2YucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0tsXX0sR2YucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEdmfTt2YXIgcWY9ZnVuY3Rpb24oKXt0aGlzLl9tYXhQdERpc3Q9bmV3IEFmLHRoaXMuX21pblB0RGlzdD1uZXcgQWYsdGhpcy5fZ2VvbT1udWxsLHRoaXMuX251bVN1YlNlZ3M9MDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbT10LHRoaXMuX251bVN1YlNlZ3M9TWF0aC50cnVuYyhNYXRoLnJvdW5kKDEvZSkpfTtxZi5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigwPT09ZSlyZXR1cm4gbnVsbDtmb3IodmFyIHI9dC5nZXRDb29yZGluYXRlKGUtMSksaT10LmdldENvb3JkaW5hdGUoZSksbz0oaS54LXIueCkvdGhpcy5fbnVtU3ViU2VncyxzPShpLnktci55KS90aGlzLl9udW1TdWJTZWdzLGE9MDthPHRoaXMuX251bVN1YlNlZ3M7YSsrKXt2YXIgdT1yLngrYSpvLGw9ci55K2EqcyxjPW5ldyB1bCh1LGwpO24uX21pblB0RGlzdC5pbml0aWFsaXplKCksRGYuY29tcHV0ZURpc3RhbmNlKG4uX2dlb20sYyxuLl9taW5QdERpc3QpLG4uX21heFB0RGlzdC5zZXRNYXhpbXVtKG4uX21pblB0RGlzdCl9fSxxZi5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LHFmLnByb3RvdHlwZS5pc0dlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3JldHVybiExfSxxZi5wcm90b3R5cGUuZ2V0TWF4UG9pbnREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LHFmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltGY119LHFmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxZn07dmFyIEJmPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9taW5WYWxpZERpc3RhbmNlPW51bGwsdGhpcy5fbWF4VmFsaWREaXN0YW5jZT1udWxsLHRoaXMuX21pbkRpc3RhbmNlRm91bmQ9bnVsbCx0aGlzLl9tYXhEaXN0YW5jZUZvdW5kPW51bGwsdGhpcy5faXNWYWxpZD0hMCx0aGlzLl9lcnJNc2c9bnVsbCx0aGlzLl9lcnJvckxvY2F0aW9uPW51bGwsdGhpcy5fZXJyb3JJbmRpY2F0b3I9bnVsbCx0aGlzLl9pbnB1dD10fHxudWxsLHRoaXMuX2J1ZkRpc3RhbmNlPWV8fG51bGwsdGhpcy5fcmVzdWx0PW58fG51bGx9LHpmPXtWRVJCT1NFOntjb25maWd1cmFibGU6ITB9LE1BWF9ESVNUQU5DRV9ESUZGX0ZSQUM6e2NvbmZpZ3VyYWJsZTohMH19O0JmLnByb3RvdHlwZS5jaGVja01heGltdW1EaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IEZmKGUsdCk7aWYoci5zZXREZW5zaWZ5RnJhY3Rpb24oLjI1KSx0aGlzLl9tYXhEaXN0YW5jZUZvdW5kPXIub3JpZW50ZWREaXN0YW5jZSgpLHRoaXMuX21heERpc3RhbmNlRm91bmQ+bil7dGhpcy5faXNWYWxpZD0hMTt2YXIgaT1yLmdldENvb3JkaW5hdGVzKCk7dGhpcy5fZXJyb3JMb2NhdGlvbj1pWzFdLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcoaSksdGhpcy5fZXJyTXNnPSJEaXN0YW5jZSBiZXR3ZWVuIGJ1ZmZlciBjdXJ2ZSBhbmQgaW5wdXQgaXMgdG9vIGxhcmdlICgiK3RoaXMuX21heERpc3RhbmNlRm91bmQrIiBhdCAiK0ZsLnRvTGluZVN0cmluZyhpWzBdLGlbMV0pKyIpIn19LEJmLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7dmFyIHQ9TWF0aC5hYnModGhpcy5fYnVmRGlzdGFuY2UpLGU9QmYuTUFYX0RJU1RBTkNFX0RJRkZfRlJBQyp0O3JldHVybiB0aGlzLl9taW5WYWxpZERpc3RhbmNlPXQtZSx0aGlzLl9tYXhWYWxpZERpc3RhbmNlPXQrZSwhKCF0aGlzLl9pbnB1dC5pc0VtcHR5KCkmJiF0aGlzLl9yZXN1bHQuaXNFbXB0eSgpKXx8KHRoaXMuX2J1ZkRpc3RhbmNlPjA/dGhpcy5jaGVja1Bvc2l0aXZlVmFsaWQoKTp0aGlzLmNoZWNrTmVnYXRpdmVWYWxpZCgpLEJmLlZFUkJPU0UmJlBsLm91dC5wcmludGxuKCJNaW4gRGlzdD0gIit0aGlzLl9taW5EaXN0YW5jZUZvdW5kKyIgIGVycj0gIisoMS10aGlzLl9taW5EaXN0YW5jZUZvdW5kL3RoaXMuX2J1ZkRpc3RhbmNlKSsiICBNYXggRGlzdD0gIit0aGlzLl9tYXhEaXN0YW5jZUZvdW5kKyIgIGVycj0gIisodGhpcy5fbWF4RGlzdGFuY2VGb3VuZC90aGlzLl9idWZEaXN0YW5jZS0xKSksdGhpcy5faXNWYWxpZCl9LEJmLnByb3RvdHlwZS5jaGVja05lZ2F0aXZlVmFsaWQ9ZnVuY3Rpb24oKXtpZighKHRoaXMuX2lucHV0IGluc3RhbmNlb2YgdGh8fHRoaXMuX2lucHV0IGluc3RhbmNlb2Ygcmh8fHRoaXMuX2lucHV0IGluc3RhbmNlb2Yga2MpKXJldHVybiBudWxsO3ZhciB0PXRoaXMuZ2V0UG9seWdvbkxpbmVzKHRoaXMuX2lucHV0KTtpZih0aGlzLmNoZWNrTWluaW11bURpc3RhbmNlKHQsdGhpcy5fcmVzdWx0LHRoaXMuX21pblZhbGlkRGlzdGFuY2UpLCF0aGlzLl9pc1ZhbGlkKXJldHVybiBudWxsO3RoaXMuY2hlY2tNYXhpbXVtRGlzdGFuY2UodCx0aGlzLl9yZXN1bHQsdGhpcy5fbWF4VmFsaWREaXN0YW5jZSl9LEJmLnByb3RvdHlwZS5nZXRFcnJvckluZGljYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJvckluZGljYXRvcn0sQmYucHJvdG90eXBlLmNoZWNrTWluaW11bURpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgVGYodCxlLG4pO2lmKHRoaXMuX21pbkRpc3RhbmNlRm91bmQ9ci5kaXN0YW5jZSgpLHRoaXMuX21pbkRpc3RhbmNlRm91bmQ8bil7dGhpcy5faXNWYWxpZD0hMTt2YXIgaT1yLm5lYXJlc3RQb2ludHMoKTt0aGlzLl9lcnJvckxvY2F0aW9uPXIubmVhcmVzdFBvaW50cygpWzFdLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcoaSksdGhpcy5fZXJyTXNnPSJEaXN0YW5jZSBiZXR3ZWVuIGJ1ZmZlciBjdXJ2ZSBhbmQgaW5wdXQgaXMgdG9vIHNtYWxsICgiK3RoaXMuX21pbkRpc3RhbmNlRm91bmQrIiBhdCAiK0ZsLnRvTGluZVN0cmluZyhpWzBdLGlbMV0pKyIgKSJ9fSxCZi5wcm90b3R5cGUuY2hlY2tQb3NpdGl2ZVZhbGlkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVzdWx0LmdldEJvdW5kYXJ5KCk7aWYodGhpcy5jaGVja01pbmltdW1EaXN0YW5jZSh0aGlzLl9pbnB1dCx0LHRoaXMuX21pblZhbGlkRGlzdGFuY2UpLCF0aGlzLl9pc1ZhbGlkKXJldHVybiBudWxsO3RoaXMuY2hlY2tNYXhpbXVtRGlzdGFuY2UodGhpcy5faW5wdXQsdCx0aGlzLl9tYXhWYWxpZERpc3RhbmNlKX0sQmYucHJvdG90eXBlLmdldEVycm9yTG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JMb2NhdGlvbn0sQmYucHJvdG90eXBlLmdldFBvbHlnb25MaW5lcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGxjLG49bmV3IENmKGUpLHI9U2YuZ2V0UG9seWdvbnModCkuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3IubmV4dCgpLmFwcGx5KG4pfXJldHVybiB0LmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KGUpfSxCZi5wcm90b3R5cGUuZ2V0RXJyb3JNZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vyck1zZ30sQmYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEJmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBCZn0semYuVkVSQk9TRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0semYuTUFYX0RJU1RBTkNFX0RJRkZfRlJBQy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDEyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhCZix6Zik7dmFyIGpmPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9pc1ZhbGlkPSEwLHRoaXMuX2Vycm9yTXNnPW51bGwsdGhpcy5fZXJyb3JMb2NhdGlvbj1udWxsLHRoaXMuX2Vycm9ySW5kaWNhdG9yPW51bGwsdGhpcy5faW5wdXQ9dHx8bnVsbCx0aGlzLl9kaXN0YW5jZT1lfHxudWxsLHRoaXMuX3Jlc3VsdD1ufHxudWxsfSxVZj17VkVSQk9TRTp7Y29uZmlndXJhYmxlOiEwfSxNQVhfRU5WX0RJRkZfRlJBQzp7Y29uZmlndXJhYmxlOiEwfX07amYucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGVja1BvbHlnb25hbCgpLHRoaXMuX2lzVmFsaWQ/KHRoaXMuY2hlY2tFeHBlY3RlZEVtcHR5KCksdGhpcy5faXNWYWxpZD8odGhpcy5jaGVja0VudmVsb3BlKCksdGhpcy5faXNWYWxpZD8odGhpcy5jaGVja0FyZWEoKSx0aGlzLl9pc1ZhbGlkPyh0aGlzLmNoZWNrRGlzdGFuY2UoKSx0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkfSxqZi5wcm90b3R5cGUuY2hlY2tFbnZlbG9wZT1mdW5jdGlvbigpe2lmKHRoaXMuX2Rpc3RhbmNlPDApcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5fZGlzdGFuY2UqamYuTUFYX0VOVl9ESUZGX0ZSQUM7MD09PXQmJih0PS4wMDEpO3ZhciBlPW5ldyBMbCh0aGlzLl9pbnB1dC5nZXRFbnZlbG9wZUludGVybmFsKCkpO2UuZXhwYW5kQnkodGhpcy5fZGlzdGFuY2UpO3ZhciBuPW5ldyBMbCh0aGlzLl9yZXN1bHQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKTtuLmV4cGFuZEJ5KHQpLG4uY29udGFpbnMoZSl8fCh0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPSJCdWZmZXIgZW52ZWxvcGUgaXMgaW5jb3JyZWN0Iix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9pbnB1dC5nZXRGYWN0b3J5KCkudG9HZW9tZXRyeShuKSksdGhpcy5yZXBvcnQoIkVudmVsb3BlIil9LGpmLnByb3RvdHlwZS5jaGVja0Rpc3RhbmNlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEJmKHRoaXMuX2lucHV0LHRoaXMuX2Rpc3RhbmNlLHRoaXMuX3Jlc3VsdCk7dC5pc1ZhbGlkKCl8fCh0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPXQuZ2V0RXJyb3JNZXNzYWdlKCksdGhpcy5fZXJyb3JMb2NhdGlvbj10LmdldEVycm9yTG9jYXRpb24oKSx0aGlzLl9lcnJvckluZGljYXRvcj10LmdldEVycm9ySW5kaWNhdG9yKCkpLHRoaXMucmVwb3J0KCJEaXN0YW5jZSIpfSxqZi5wcm90b3R5cGUuY2hlY2tBcmVhPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faW5wdXQuZ2V0QXJlYSgpLGU9dGhpcy5fcmVzdWx0LmdldEFyZWEoKTt0aGlzLl9kaXN0YW5jZT4wJiZ0PmUmJih0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPSJBcmVhIG9mIHBvc2l0aXZlIGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gaW5wdXQiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCksdGhpcy5fZGlzdGFuY2U8MCYmdDxlJiYodGhpcy5faXNWYWxpZD0hMSx0aGlzLl9lcnJvck1zZz0iQXJlYSBvZiBuZWdhdGl2ZSBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gaW5wdXQiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCksdGhpcy5yZXBvcnQoIkFyZWEiKX0samYucHJvdG90eXBlLmNoZWNrUG9seWdvbmFsPWZ1bmN0aW9uKCl7dGhpcy5fcmVzdWx0IGluc3RhbmNlb2YgdGh8fHRoaXMuX3Jlc3VsdCBpbnN0YW5jZW9mIHJofHwodGhpcy5faXNWYWxpZD0hMSksdGhpcy5fZXJyb3JNc2c9IlJlc3VsdCBpcyBub3QgcG9seWdvbmFsIix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9yZXN1bHQsdGhpcy5yZXBvcnQoIlBvbHlnb25hbCIpfSxqZi5wcm90b3R5cGUuZ2V0RXJyb3JJbmRpY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JJbmRpY2F0b3J9LGpmLnByb3RvdHlwZS5nZXRFcnJvckxvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vycm9yTG9jYXRpb259LGpmLnByb3RvdHlwZS5jaGVja0V4cGVjdGVkRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5wdXQuZ2V0RGltZW5zaW9uKCk+PTJ8fHRoaXMuX2Rpc3RhbmNlPjA/bnVsbDoodGhpcy5fcmVzdWx0LmlzRW1wdHkoKXx8KHRoaXMuX2lzVmFsaWQ9ITEsdGhpcy5fZXJyb3JNc2c9IlJlc3VsdCBpcyBub24tZW1wdHkiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCksdm9pZCB0aGlzLnJlcG9ydCgiRXhwZWN0ZWRFbXB0eSIpKX0samYucHJvdG90eXBlLnJlcG9ydD1mdW5jdGlvbih0KXtpZighamYuVkVSQk9TRSlyZXR1cm4gbnVsbDtQbC5vdXQucHJpbnRsbigiQ2hlY2sgIit0KyI6ICIrKHRoaXMuX2lzVmFsaWQ/InBhc3NlZCI6IkZBSUxFRCIpKX0samYucHJvdG90eXBlLmdldEVycm9yTWVzc2FnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJvck1zZ30samYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGpmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBqZn0samYuaXNWYWxpZE1zZz1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IGpmKHQsZSxuKTtyZXR1cm4gci5pc1ZhbGlkKCk/bnVsbDpyLmdldEVycm9yTWVzc2FnZSgpfSxqZi5pc1ZhbGlkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hIW5ldyBqZih0LGUsbikuaXNWYWxpZCgpfSxVZi5WRVJCT1NFLmdldD1mdW5jdGlvbigpe3JldHVybiExfSxVZi5NQVhfRU5WX0RJRkZfRlJBQy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDEyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhqZixVZik7dmFyIFZmPWZ1bmN0aW9uKCl7dGhpcy5fcHRzPW51bGwsdGhpcy5fZGF0YT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wdHM9dCx0aGlzLl9kYXRhPWV9O1ZmLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHN9LFZmLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0cy5sZW5ndGh9LFZmLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdHNbdF19LFZmLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHNbMF0uZXF1YWxzKHRoaXMuX3B0c1t0aGlzLl9wdHMubGVuZ3RoLTFdKX0sVmYucHJvdG90eXBlLmdldFNlZ21lbnRPY3RhbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT10aGlzLl9wdHMubGVuZ3RoLTE/LTE6ZnAub2N0YW50KHRoaXMuZ2V0Q29vcmRpbmF0ZSh0KSx0aGlzLmdldENvb3JkaW5hdGUodCsxKSl9LFZmLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX2RhdGE9dH0sVmYucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sVmYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEZsLnRvTGluZVN0cmluZyhuZXcgbGgodGhpcy5fcHRzKSl9LFZmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltncF19LFZmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBWZn07dmFyIFhmPWZ1bmN0aW9uKCl7dGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnM9ITEsdGhpcy5faXNDaGVja0VuZFNlZ21lbnRzT25seT0hMSx0aGlzLl9saT1udWxsLHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uPW51bGwsdGhpcy5faW50U2VnbWVudHM9bnVsbCx0aGlzLl9pbnRlcnNlY3Rpb25zPW5ldyBsYyx0aGlzLl9pbnRlcnNlY3Rpb25Db3VudD0wLHRoaXMuX2tlZXBJbnRlcnNlY3Rpb25zPSEwO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9saT10LHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uPW51bGx9O1hmLnByb3RvdHlwZS5nZXRJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbn0sWGYucHJvdG90eXBlLnNldENoZWNrRW5kU2VnbWVudHNPbmx5PWZ1bmN0aW9uKHQpe3RoaXMuX2lzQ2hlY2tFbmRTZWdtZW50c09ubHk9dH0sWGYucHJvdG90eXBlLmdldEludGVyc2VjdGlvblNlZ21lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludFNlZ21lbnRzfSxYZi5wcm90b3R5cGUuY291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW50ZXJzZWN0aW9uQ291bnR9LFhmLnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludGVyc2VjdGlvbnN9LFhmLnByb3RvdHlwZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0KXt0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz10fSxYZi5wcm90b3R5cGUuc2V0S2VlcEludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCl7dGhpcy5fa2VlcEludGVyc2VjdGlvbnM9dH0sWGYucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCF0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucyYmdGhpcy5oYXNJbnRlcnNlY3Rpb24oKSlyZXR1cm4gbnVsbDtpZih0PT09biYmZT09PXIpcmV0dXJuIG51bGw7aWYodGhpcy5faXNDaGVja0VuZFNlZ21lbnRzT25seSYmISh0aGlzLmlzRW5kU2VnbWVudCh0LGUpfHx0aGlzLmlzRW5kU2VnbWVudChuLHIpKSlyZXR1cm4gbnVsbDt2YXIgaT10LmdldENvb3JkaW5hdGVzKClbZV0sbz10LmdldENvb3JkaW5hdGVzKClbZSsxXSxzPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyXSxhPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyKzFdO3RoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oaSxvLHMsYSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJnRoaXMuX2xpLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oKSYmKHRoaXMuX2ludFNlZ21lbnRzPW5ldyBBcnJheSg0KS5maWxsKG51bGwpLHRoaXMuX2ludFNlZ21lbnRzWzBdPWksdGhpcy5faW50U2VnbWVudHNbMV09byx0aGlzLl9pbnRTZWdtZW50c1syXT1zLHRoaXMuX2ludFNlZ21lbnRzWzNdPWEsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb249dGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uKDApLHRoaXMuX2tlZXBJbnRlcnNlY3Rpb25zJiZ0aGlzLl9pbnRlcnNlY3Rpb25zLmFkZCh0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbiksdGhpcy5faW50ZXJzZWN0aW9uQ291bnQrKyl9LFhmLnByb3RvdHlwZS5pc0VuZFNlZ21lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMD09PWV8fGU+PXQuc2l6ZSgpLTJ9LFhmLnByb3RvdHlwZS5oYXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ufSxYZi5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2ZpbmRBbGxJbnRlcnNlY3Rpb25zJiZudWxsIT09dGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb259LFhmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltacF19LFhmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBYZn0sWGYuY3JlYXRlQWxsSW50ZXJzZWN0aW9uc0ZpbmRlcj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgWGYodCk7cmV0dXJuIGUuc2V0RmluZEFsbEludGVyc2VjdGlvbnMoITApLGV9LFhmLmNyZWF0ZUFueUludGVyc2VjdGlvbkZpbmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFhmKHQpfSxYZi5jcmVhdGVJbnRlcnNlY3Rpb25Db3VudGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBYZih0KTtyZXR1cm4gZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyghMCksZS5zZXRLZWVwSW50ZXJzZWN0aW9ucyghMSksZX07dmFyIFlmPWZ1bmN0aW9uKCl7dGhpcy5fbGk9bmV3IGpsLHRoaXMuX3NlZ1N0cmluZ3M9bnVsbCx0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz0hMSx0aGlzLl9zZWdJbnQ9bnVsbCx0aGlzLl9pc1ZhbGlkPSEwO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9zZWdTdHJpbmdzPXR9O1lmLnByb3RvdHlwZS5leGVjdXRlPWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3NlZ0ludClyZXR1cm4gbnVsbDt0aGlzLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zKCl9LFlmLnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NlZ0ludC5nZXRJbnRlcnNlY3Rpb25zKCl9LFlmLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXhlY3V0ZSgpLHRoaXMuX2lzVmFsaWR9LFlmLnByb3RvdHlwZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0KXt0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz10fSxZZi5wcm90b3R5cGUuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLl9pc1ZhbGlkPSEwLHRoaXMuX3NlZ0ludD1uZXcgWGYodGhpcy5fbGkpLHRoaXMuX3NlZ0ludC5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyh0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucyk7dmFyIHQ9bmV3IElwO2lmKHQuc2V0U2VnbWVudEludGVyc2VjdG9yKHRoaXMuX3NlZ0ludCksdC5jb21wdXRlTm9kZXModGhpcy5fc2VnU3RyaW5ncyksdGhpcy5fc2VnSW50Lmhhc0ludGVyc2VjdGlvbigpKXJldHVybiB0aGlzLl9pc1ZhbGlkPSExLG51bGx9LFlmLnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7aWYodGhpcy5leGVjdXRlKCksIXRoaXMuX2lzVmFsaWQpdGhyb3cgbmV3IE9oKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKCksdGhpcy5fc2VnSW50LmdldEludGVyaW9ySW50ZXJzZWN0aW9uKCkpfSxZZi5wcm90b3R5cGUuZ2V0RXJyb3JNZXNzYWdlPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNWYWxpZClyZXR1cm4ibm8gaW50ZXJzZWN0aW9ucyBmb3VuZCI7dmFyIHQ9dGhpcy5fc2VnSW50LmdldEludGVyc2VjdGlvblNlZ21lbnRzKCk7cmV0dXJuImZvdW5kIG5vbi1ub2RlZCBpbnRlcnNlY3Rpb24gYmV0d2VlbiAiK0ZsLnRvTGluZVN0cmluZyh0WzBdLHRbMV0pKyIgYW5kICIrRmwudG9MaW5lU3RyaW5nKHRbMl0sdFszXSl9LFlmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxZZi5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWWZ9LFlmLmNvbXB1dGVJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBZZih0KTtyZXR1cm4gZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyghMCksZS5pc1ZhbGlkKCksZS5nZXRJbnRlcnNlY3Rpb25zKCl9O3ZhciBIZj1mdW5jdGlvbiB0KCl7dGhpcy5fbnY9bnVsbDt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fbnY9bmV3IFlmKHQudG9TZWdtZW50U3RyaW5ncyhlKSl9O0hmLnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7dGhpcy5fbnYuY2hlY2tWYWxpZCgpfSxIZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSGYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEhmfSxIZi50b1NlZ21lbnRTdHJpbmdzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgbGMsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtlLmFkZChuZXcgVmYoci5nZXRDb29yZGluYXRlcygpLHIpKX1yZXR1cm4gZX0sSGYuY2hlY2tWYWxpZD1mdW5jdGlvbih0KXtuZXcgSGYodCkuY2hlY2tWYWxpZCgpfTt2YXIgV2Y9ZnVuY3Rpb24odCl7dGhpcy5fbWFwT3A9dH07V2YucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGxjLG49MDtuPHQuZ2V0TnVtR2VvbWV0cmllcygpO24rKyl7dmFyIHI9dGhpcy5fbWFwT3AubWFwKHQuZ2V0R2VvbWV0cnlOKG4pKTtyLmlzRW1wdHkoKXx8ZS5hZGQocil9cmV0dXJuIHQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihfaC50b0dlb21ldHJ5QXJyYXkoZSkpfSxXZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sV2YucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFdmfSxXZi5tYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFdmKGUpLm1hcCh0KX07dmFyIEpmPWZ1bmN0aW9uKCl7dGhpcy5fb3A9bnVsbCx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9bnVsbCx0aGlzLl9wdExvY2F0b3I9bnVsbCx0aGlzLl9saW5lRWRnZXNMaXN0PW5ldyBsYyx0aGlzLl9yZXN1bHRMaW5lTGlzdD1uZXcgbGM7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX29wPXQsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PWUsdGhpcy5fcHRMb2NhdG9yPW59O0pmLnByb3RvdHlwZS5jb2xsZWN0TGluZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj10aGlzLl9vcC5nZXRHcmFwaCgpLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2UuY29sbGVjdExpbmVFZGdlKHIsdCxlLl9saW5lRWRnZXNMaXN0KSxlLmNvbGxlY3RCb3VuZGFyeVRvdWNoRWRnZShyLHQsZS5fbGluZUVkZ2VzTGlzdCl9fSxKZi5wcm90b3R5cGUubGFiZWxJc29sYXRlZExpbmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9wdExvY2F0b3IubG9jYXRlKHQuZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuX29wLmdldEFyZ0dlb21ldHJ5KGUpKTt0LmdldExhYmVsKCkuc2V0TG9jYXRpb24oZSxuKX0sSmYucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbmRDb3ZlcmVkTGluZUVkZ2VzKCksdGhpcy5jb2xsZWN0TGluZXModCksdGhpcy5idWlsZExpbmVzKHQpLHRoaXMuX3Jlc3VsdExpbmVMaXN0fSxKZi5wcm90b3R5cGUuY29sbGVjdExpbmVFZGdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmdldExhYmVsKCksaT10LmdldEVkZ2UoKTt0LmlzTGluZUVkZ2UoKSYmKHQuaXNWaXNpdGVkKCl8fCFNZy5pc1Jlc3VsdE9mT3AocixlKXx8aS5pc0NvdmVyZWQoKXx8KG4uYWRkKGkpLHQuc2V0VmlzaXRlZEVkZ2UoITApKSl9LEpmLnByb3RvdHlwZS5maW5kQ292ZXJlZExpbmVFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9vcC5nZXRHcmFwaCgpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLmdldEVkZ2VzKCkuZmluZENvdmVyZWRMaW5lRWRnZXMoKX1mb3IodmFyIGU9dGhpcy5fb3AuZ2V0R3JhcGgoKS5nZXRFZGdlRW5kcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPW4uZ2V0RWRnZSgpO2lmKG4uaXNMaW5lRWRnZSgpJiYhci5pc0NvdmVyZWRTZXQoKSl7dmFyIGk9dGhpcy5fb3AuaXNDb3ZlcmVkQnlBKG4uZ2V0Q29vcmRpbmF0ZSgpKTtyLnNldENvdmVyZWQoaSl9fX0sSmYucHJvdG90eXBlLmxhYmVsSXNvbGF0ZWRMaW5lcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkscj1uLmdldExhYmVsKCk7bi5pc0lzb2xhdGVkKCkmJihyLmlzTnVsbCgwKT90aGlzLmxhYmVsSXNvbGF0ZWRMaW5lKG4sMCk6dGhpcy5sYWJlbElzb2xhdGVkTGluZShuLDEpKX19LEpmLnByb3RvdHlwZS5idWlsZExpbmVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9saW5lRWRnZXNMaXN0Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPXRoaXMuX2dlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKG4uZ2V0Q29vcmRpbmF0ZXMoKSk7dGhpcy5fcmVzdWx0TGluZUxpc3QuYWRkKHIpLG4uc2V0SW5SZXN1bHQoITApfX0sSmYucHJvdG90eXBlLmNvbGxlY3RCb3VuZGFyeVRvdWNoRWRnZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXRMYWJlbCgpO3JldHVybiB0LmlzTGluZUVkZ2UoKXx8dC5pc1Zpc2l0ZWQoKXx8dC5pc0ludGVyaW9yQXJlYUVkZ2UoKXx8dC5nZXRFZGdlKCkuaXNJblJlc3VsdCgpP251bGw6KHFsLmlzVHJ1ZSghKHQuaXNJblJlc3VsdCgpfHx0LmdldFN5bSgpLmlzSW5SZXN1bHQoKSl8fCF0LmdldEVkZ2UoKS5pc0luUmVzdWx0KCkpLHZvaWQoTWcuaXNSZXN1bHRPZk9wKHIsZSkmJmU9PT1NZy5JTlRFUlNFQ1RJT04mJihuLmFkZCh0LmdldEVkZ2UoKSksdC5zZXRWaXNpdGVkRWRnZSghMCkpKSl9LEpmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxKZi5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSmZ9O3ZhciBaZj1mdW5jdGlvbigpe3RoaXMuX29wPW51bGwsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PW51bGwsdGhpcy5fcmVzdWx0UG9pbnRMaXN0PW5ldyBsYzt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fb3A9dCx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9ZX07WmYucHJvdG90eXBlLmZpbHRlckNvdmVyZWROb2RlVG9Qb2ludD1mdW5jdGlvbih0KXt2YXIgZT10LmdldENvb3JkaW5hdGUoKTtpZighdGhpcy5fb3AuaXNDb3ZlcmVkQnlMQShlKSl7dmFyIG49dGhpcy5fZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvaW50KGUpO3RoaXMuX3Jlc3VsdFBvaW50TGlzdC5hZGQobil9fSxaZi5wcm90b3R5cGUuZXh0cmFjdE5vbkNvdmVyZWRSZXN1bHROb2Rlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fb3AuZ2V0R3JhcGgoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtpZighbi5pc0luUmVzdWx0KCkmJighbi5pc0luY2lkZW50RWRnZUluUmVzdWx0KCkmJigwPT09bi5nZXRFZGdlcygpLmdldERlZ3JlZSgpfHx0PT09TWcuSU5URVJTRUNUSU9OKSkpe3ZhciByPW4uZ2V0TGFiZWwoKTtNZy5pc1Jlc3VsdE9mT3Aocix0KSYmdGhpcy5maWx0ZXJDb3ZlcmVkTm9kZVRvUG9pbnQobil9fX0sWmYucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmV4dHJhY3ROb25Db3ZlcmVkUmVzdWx0Tm9kZXModCksdGhpcy5fcmVzdWx0UG9pbnRMaXN0fSxaZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWmYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFpmfTt2YXIgS2Y9ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEdlb209bnVsbCx0aGlzLl9mYWN0b3J5PW51bGwsdGhpcy5fcHJ1bmVFbXB0eUdlb21ldHJ5PSEwLHRoaXMuX3ByZXNlcnZlR2VvbWV0cnlDb2xsZWN0aW9uVHlwZT0hMCx0aGlzLl9wcmVzZXJ2ZUNvbGxlY3Rpb25zPSExLHRoaXMuX3ByZXNlcnZlVHlwZT0hMX07S2YucHJvdG90eXBlLnRyYW5zZm9ybVBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9pbnQodGhpcy50cmFuc2Zvcm1Db29yZGluYXRlcyh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpKX0sS2YucHJvdG90eXBlLnRyYW5zZm9ybVBvbHlnb249ZnVuY3Rpb24odCxlKXt2YXIgbj0hMCxyPXRoaXMudHJhbnNmb3JtTGluZWFyUmluZyh0LmdldEV4dGVyaW9yUmluZygpLHQpO251bGwhPT1yJiZyIGluc3RhbmNlb2YgbmgmJiFyLmlzRW1wdHkoKXx8KG49ITEpO2Zvcih2YXIgaT1uZXcgbGMsbz0wO288dC5nZXROdW1JbnRlcmlvclJpbmcoKTtvKyspe3ZhciBzPXRoaXMudHJhbnNmb3JtTGluZWFyUmluZyh0LmdldEludGVyaW9yUmluZ04obyksdCk7bnVsbD09PXN8fHMuaXNFbXB0eSgpfHwocyBpbnN0YW5jZW9mIG5ofHwobj0hMSksaS5hZGQocykpfWlmKG4pcmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9seWdvbihyLGkudG9BcnJheShbXSkpO3ZhciBhPW5ldyBsYztyZXR1cm4gbnVsbCE9PXImJmEuYWRkKHIpLGEuYWRkQWxsKGkpLHRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShhKX0sS2YucHJvdG90eXBlLmNyZWF0ZUNvb3JkaW5hdGVTZXF1ZW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZmFjdG9yeS5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKHQpfSxLZi5wcm90b3R5cGUuZ2V0SW5wdXRHZW9tZXRyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnB1dEdlb219LEtmLnByb3RvdHlwZS50cmFuc2Zvcm1NdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IGxjLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9dGhpcy50cmFuc2Zvcm1MaW5lU3RyaW5nKHQuZ2V0R2VvbWV0cnlOKHIpLHQpO251bGwhPT1pJiYoaS5pc0VtcHR5KCl8fG4uYWRkKGkpKX1yZXR1cm4gdGhpcy5fZmFjdG9yeS5idWlsZEdlb21ldHJ5KG4pfSxLZi5wcm90b3R5cGUudHJhbnNmb3JtQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb3B5KHQpfSxLZi5wcm90b3R5cGUudHJhbnNmb3JtTGluZVN0cmluZz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZUxpbmVTdHJpbmcodGhpcy50cmFuc2Zvcm1Db29yZGluYXRlcyh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpKX0sS2YucHJvdG90eXBlLnRyYW5zZm9ybU11bHRpUG9pbnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IGxjLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9dGhpcy50cmFuc2Zvcm1Qb2ludCh0LmdldEdlb21ldHJ5TihyKSx0KTtudWxsIT09aSYmKGkuaXNFbXB0eSgpfHxuLmFkZChpKSl9cmV0dXJuIHRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShuKX0sS2YucHJvdG90eXBlLnRyYW5zZm9ybU11bHRpUG9seWdvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgbGMscj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10aGlzLnRyYW5zZm9ybVBvbHlnb24odC5nZXRHZW9tZXRyeU4ociksdCk7bnVsbCE9PWkmJihpLmlzRW1wdHkoKXx8bi5hZGQoaSkpfXJldHVybiB0aGlzLl9mYWN0b3J5LmJ1aWxkR2VvbWV0cnkobil9LEtmLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKX0sS2YucHJvdG90eXBlLnRyYW5zZm9ybUdlb21ldHJ5Q29sbGVjdGlvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgbGMscj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10aGlzLnRyYW5zZm9ybSh0LmdldEdlb21ldHJ5TihyKSk7bnVsbCE9PWkmJih0aGlzLl9wcnVuZUVtcHR5R2VvbWV0cnkmJmkuaXNFbXB0eSgpfHxuLmFkZChpKSl9cmV0dXJuIHRoaXMuX3ByZXNlcnZlR2VvbWV0cnlDb2xsZWN0aW9uVHlwZT90aGlzLl9mYWN0b3J5LmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihfaC50b0dlb21ldHJ5QXJyYXkobikpOnRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShuKX0sS2YucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbih0KXtpZih0aGlzLl9pbnB1dEdlb209dCx0aGlzLl9mYWN0b3J5PXQuZ2V0RmFjdG9yeSgpLHQgaW5zdGFuY2VvZiBRYylyZXR1cm4gdGhpcy50cmFuc2Zvcm1Qb2ludCh0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBlaClyZXR1cm4gdGhpcy50cmFuc2Zvcm1NdWx0aVBvaW50KHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIG5oKXJldHVybiB0aGlzLnRyYW5zZm9ybUxpbmVhclJpbmcodCxudWxsKTtpZih0IGluc3RhbmNlb2YgWmMpcmV0dXJuIHRoaXMudHJhbnNmb3JtTGluZVN0cmluZyh0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBHYylyZXR1cm4gdGhpcy50cmFuc2Zvcm1NdWx0aUxpbmVTdHJpbmcodCxudWxsKTtpZih0IGluc3RhbmNlb2YgdGgpcmV0dXJuIHRoaXMudHJhbnNmb3JtUG9seWdvbih0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiByaClyZXR1cm4gdGhpcy50cmFuc2Zvcm1NdWx0aVBvbHlnb24odCxudWxsKTtpZih0IGluc3RhbmNlb2Yga2MpcmV0dXJuIHRoaXMudHJhbnNmb3JtR2VvbWV0cnlDb2xsZWN0aW9uKHQsbnVsbCk7dGhyb3cgbmV3IGVsKCJVbmtub3duIEdlb21ldHJ5IHN1YnR5cGU6ICIrdC5nZXRDbGFzcygpLmdldE5hbWUoKSl9LEtmLnByb3RvdHlwZS50cmFuc2Zvcm1MaW5lYXJSaW5nPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy50cmFuc2Zvcm1Db29yZGluYXRlcyh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpO2lmKG51bGw9PT1uKXJldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcobnVsbCk7dmFyIHI9bi5zaXplKCk7cmV0dXJuIHI+MCYmcjw0JiYhdGhpcy5fcHJlc2VydmVUeXBlP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTGluZVN0cmluZyhuKTp0aGlzLl9mYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcobil9LEtmLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxLZi5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gS2Z9O3ZhciBRZj1mdW5jdGlvbiB0KCl7aWYodGhpcy5fc25hcFRvbGVyYW5jZT0wLHRoaXMuX3NyY1B0cz1udWxsLHRoaXMuX3NlZz1uZXcgdnAsdGhpcy5fYWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXM9ITEsdGhpcy5faXNDbG9zZWQ9ITEsYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBaYyYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0LmNhbGwodGhpcyxlLmdldENvb3JkaW5hdGVzKCksbil9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3RoaXMuX3NyY1B0cz1yLHRoaXMuX2lzQ2xvc2VkPXQuaXNDbG9zZWQociksdGhpcy5fc25hcFRvbGVyYW5jZT1pfX07UWYucHJvdG90eXBlLnNuYXBWZXJ0aWNlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLl9pc0Nsb3NlZD90LnNpemUoKS0xOnQuc2l6ZSgpLHI9MDtyPG47cisrKXt2YXIgaT10LmdldChyKSxvPXRoaXMuZmluZFNuYXBGb3JWZXJ0ZXgoaSxlKTtudWxsIT09byYmKHQuc2V0KHIsbmV3IHVsKG8pKSwwPT09ciYmdGhpcy5faXNDbG9zZWQmJnQuc2V0KHQuc2l6ZSgpLTEsbmV3IHVsKG8pKSl9fSxRZi5wcm90b3R5cGUuZmluZFNuYXBGb3JWZXJ0ZXg9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7aWYodC5lcXVhbHMyRChlW25dKSlyZXR1cm4gbnVsbDtpZih0LmRpc3RhbmNlKGVbbl0pPHRoaXMuX3NuYXBUb2xlcmFuY2UpcmV0dXJuIGVbbl19cmV0dXJuIG51bGx9LFFmLnByb3RvdHlwZS5zbmFwVG89ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGhjKHRoaXMuX3NyY1B0cyk7cmV0dXJuIHRoaXMuc25hcFZlcnRpY2VzKGUsdCksdGhpcy5zbmFwU2VnbWVudHMoZSx0KSxlLnRvQ29vcmRpbmF0ZUFycmF5KCl9LFFmLnByb3RvdHlwZS5zbmFwU2VnbWVudHM9ZnVuY3Rpb24odCxlKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIG49ZS5sZW5ndGg7ZVswXS5lcXVhbHMyRChlW2UubGVuZ3RoLTFdKSYmKG49ZS5sZW5ndGgtMSk7Zm9yKHZhciByPTA7cjxuO3IrKyl7dmFyIGk9ZVtyXSxvPXRoaXMuZmluZFNlZ21lbnRJbmRleFRvU25hcChpLHQpO28+PTAmJnQuYWRkKG8rMSxuZXcgdWwoaSksITEpfX0sUWYucHJvdG90eXBlLmZpbmRTZWdtZW50SW5kZXhUb1NuYXA9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcyxyPW5sLk1BWF9WQUxVRSxpPS0xLG89MDtvPGUuc2l6ZSgpLTE7bysrKXtpZihuLl9zZWcucDA9ZS5nZXQobyksbi5fc2VnLnAxPWUuZ2V0KG8rMSksbi5fc2VnLnAwLmVxdWFsczJEKHQpfHxuLl9zZWcucDEuZXF1YWxzMkQodCkpe2lmKG4uX2FsbG93U25hcHBpbmdUb1NvdXJjZVZlcnRpY2VzKWNvbnRpbnVlO3JldHVybi0xfXZhciBzPW4uX3NlZy5kaXN0YW5jZSh0KTtzPG4uX3NuYXBUb2xlcmFuY2UmJnM8ciYmKHI9cyxpPW8pfXJldHVybiBpfSxRZi5wcm90b3R5cGUuc2V0QWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXM9ZnVuY3Rpb24odCl7dGhpcy5fYWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXM9dH0sUWYucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFFmLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBRZn0sUWYuaXNDbG9zZWQ9ZnVuY3Rpb24odCl7cmV0dXJuISh0Lmxlbmd0aDw9MSkmJnRbMF0uZXF1YWxzMkQodFt0Lmxlbmd0aC0xXSl9O3ZhciAkZj1mdW5jdGlvbih0KXt0aGlzLl9zcmNHZW9tPXR8fG51bGx9LHRnPXtTTkFQX1BSRUNJU0lPTl9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH19OyRmLnByb3RvdHlwZS5zbmFwVG89ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmV4dHJhY3RUYXJnZXRDb29yZGluYXRlcyh0KTtyZXR1cm4gbmV3IGVnKGUsbikudHJhbnNmb3JtKHRoaXMuX3NyY0dlb20pfSwkZi5wcm90b3R5cGUuc25hcFRvU2VsZj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZXh0cmFjdFRhcmdldENvb3JkaW5hdGVzKHRoaXMuX3NyY0dlb20pLHI9bmV3IGVnKHQsbiwhMCkudHJhbnNmb3JtKHRoaXMuX3NyY0dlb20pLGk9cjtyZXR1cm4gZSYmZ2woaSwkYykmJihpPXIuYnVmZmVyKDApKSxpfSwkZi5wcm90b3R5cGUuY29tcHV0ZVNuYXBUb2xlcmFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1pbmltdW1TZWdtZW50TGVuZ3RoKHQpLzEwfSwkZi5wcm90b3R5cGUuZXh0cmFjdFRhcmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgTGMsbj10LmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGg7cisrKWUuYWRkKG5bcl0pO3JldHVybiBlLnRvQXJyYXkobmV3IEFycmF5KDApLmZpbGwobnVsbCkpfSwkZi5wcm90b3R5cGUuY29tcHV0ZU1pbmltdW1TZWdtZW50TGVuZ3RoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1ubC5NQVhfVkFMVUUsbj0wO248dC5sZW5ndGgtMTtuKyspe3ZhciByPXRbbl0uZGlzdGFuY2UodFtuKzFdKTtyPGUmJihlPXIpfXJldHVybiBlfSwkZi5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sJGYucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICRmfSwkZi5zbmFwPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgQXJyYXkoMikuZmlsbChudWxsKSxpPW5ldyAkZih0KTtyWzBdPWkuc25hcFRvKGUsbik7dmFyIG89bmV3ICRmKGUpO3JldHVybiByWzFdPW8uc25hcFRvKHJbMF0sbikscn0sJGYuY29tcHV0ZU92ZXJsYXlTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPSRmLmNvbXB1dGVTaXplQmFzZWRTbmFwVG9sZXJhbmNlKHQpLG49dC5nZXRQcmVjaXNpb25Nb2RlbCgpO2lmKG4uZ2V0VHlwZSgpPT09Z2guRklYRUQpe3ZhciByPTEvbi5nZXRTY2FsZSgpKjIvMS40MTU7cj5lJiYoZT1yKX1yZXR1cm4gZX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdO3JldHVybiBNYXRoLm1pbigkZi5jb21wdXRlT3ZlcmxheVNuYXBUb2xlcmFuY2UoaSksJGYuY29tcHV0ZU92ZXJsYXlTbmFwVG9sZXJhbmNlKG8pKX19LCRmLmNvbXB1dGVTaXplQmFzZWRTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpO3JldHVybiBNYXRoLm1pbihlLmdldEhlaWdodCgpLGUuZ2V0V2lkdGgoKSkqJGYuU05BUF9QUkVDSVNJT05fRkFDVE9SfSwkZi5zbmFwVG9TZWxmPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3ICRmKHQpLnNuYXBUb1NlbGYoZSxuKX0sdGcuU05BUF9QUkVDSVNJT05fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybiAxZS05fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcygkZix0Zyk7dmFyIGVnPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIpe3QuY2FsbCh0aGlzKSx0aGlzLl9zbmFwVG9sZXJhbmNlPWV8fG51bGwsdGhpcy5fc25hcFB0cz1ufHxudWxsLHRoaXMuX2lzU2VsZlNuYXA9dm9pZCAwIT09ciYmcn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuc25hcExpbmU9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgUWYodCx0aGlzLl9zbmFwVG9sZXJhbmNlKTtyZXR1cm4gbi5zZXRBbGxvd1NuYXBwaW5nVG9Tb3VyY2VWZXJ0aWNlcyh0aGlzLl9pc1NlbGZTbmFwKSxuLnNuYXBUbyhlKX0sZS5wcm90b3R5cGUudHJhbnNmb3JtQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnRvQ29vcmRpbmF0ZUFycmF5KCkscj10aGlzLnNuYXBMaW5lKG4sdGhpcy5fc25hcFB0cyk7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShyKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oS2YpLG5nPWZ1bmN0aW9uKCl7dGhpcy5faXNGaXJzdD0hMCx0aGlzLl9jb21tb25NYW50aXNzYUJpdHNDb3VudD01Myx0aGlzLl9jb21tb25CaXRzPTAsdGhpcy5fY29tbW9uU2lnbkV4cD1udWxsfTtuZy5wcm90b3R5cGUuZ2V0Q29tbW9uPWZ1bmN0aW9uKCl7cmV0dXJuIG5sLmxvbmdCaXRzVG9Eb3VibGUodGhpcy5fY29tbW9uQml0cyl9LG5nLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dmFyIGU9bmwuZG91YmxlVG9Mb25nQml0cyh0KTtyZXR1cm4gdGhpcy5faXNGaXJzdD8odGhpcy5fY29tbW9uQml0cz1lLHRoaXMuX2NvbW1vblNpZ25FeHA9bmcuc2lnbkV4cEJpdHModGhpcy5fY29tbW9uQml0cyksdGhpcy5faXNGaXJzdD0hMSxudWxsKTpuZy5zaWduRXhwQml0cyhlKSE9PXRoaXMuX2NvbW1vblNpZ25FeHA/KHRoaXMuX2NvbW1vbkJpdHM9MCxudWxsKToodGhpcy5fY29tbW9uTWFudGlzc2FCaXRzQ291bnQ9bmcubnVtQ29tbW9uTW9zdFNpZ01hbnRpc3NhQml0cyh0aGlzLl9jb21tb25CaXRzLGUpLHZvaWQodGhpcy5fY29tbW9uQml0cz1uZy56ZXJvTG93ZXJCaXRzKHRoaXMuX2NvbW1vbkJpdHMsNjQtKDEyK3RoaXMuX2NvbW1vbk1hbnRpc3NhQml0c0NvdW50KSkpKX0sbmcucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPW5sLmxvbmdCaXRzVG9Eb3VibGUodCksbj1ubC50b0JpbmFyeVN0cmluZyh0KSxyPSIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIituLGk9ci5zdWJzdHJpbmcoci5sZW5ndGgtNjQpLG89aS5zdWJzdHJpbmcoMCwxKSsiICAiK2kuc3Vic3RyaW5nKDEsMTIpKyIoZXhwKSAiK2kuc3Vic3RyaW5nKDEyKSsiIFsgIitlKyIgXSI7cmV0dXJuIG99fSxuZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbmcucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG5nfSxuZy5nZXRCaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMCE9KHQmMTw8ZSk/MTowfSxuZy5zaWduRXhwQml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4+NTJ9LG5nLnplcm9Mb3dlckJpdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCZ+KCgxPDxlKS0xKX0sbmcubnVtQ29tbW9uTW9zdFNpZ01hbnRpc3NhQml0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9NTI7cj49MDtyLS0pe2lmKG5nLmdldEJpdCh0LHIpIT09bmcuZ2V0Qml0KGUscikpcmV0dXJuIG47bisrfXJldHVybiA1Mn07dmFyIHJnPWZ1bmN0aW9uKCl7dGhpcy5fY29tbW9uQ29vcmQ9bnVsbCx0aGlzLl9jY0ZpbHRlcj1uZXcgb2d9LGlnPXtDb21tb25Db29yZGluYXRlRmlsdGVyOntjb25maWd1cmFibGU6ITB9LFRyYW5zbGF0ZXI6e2NvbmZpZ3VyYWJsZTohMH19O3JnLnByb3RvdHlwZS5hZGRDb21tb25CaXRzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBzZyh0aGlzLl9jb21tb25Db29yZCk7dC5hcHBseShlKSx0Lmdlb21ldHJ5Q2hhbmdlZCgpfSxyZy5wcm90b3R5cGUucmVtb3ZlQ29tbW9uQml0cz1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5fY29tbW9uQ29vcmQueCYmMD09PXRoaXMuX2NvbW1vbkNvb3JkLnkpcmV0dXJuIHQ7dmFyIGU9bmV3IHVsKHRoaXMuX2NvbW1vbkNvb3JkKTtlLng9LWUueCxlLnk9LWUueTt2YXIgbj1uZXcgc2coZSk7cmV0dXJuIHQuYXBwbHkobiksdC5nZW9tZXRyeUNoYW5nZWQoKSx0fSxyZy5wcm90b3R5cGUuZ2V0Q29tbW9uQ29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21tb25Db29yZH0scmcucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt0LmFwcGx5KHRoaXMuX2NjRmlsdGVyKSx0aGlzLl9jb21tb25Db29yZD10aGlzLl9jY0ZpbHRlci5nZXRDb21tb25Db29yZGluYXRlKCl9LHJnLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxyZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcmd9LGlnLkNvbW1vbkNvb3JkaW5hdGVGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG9nfSxpZy5UcmFuc2xhdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBzZ30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmcsaWcpO3ZhciBvZz1mdW5jdGlvbigpe3RoaXMuX2NvbW1vbkJpdHNYPW5ldyBuZyx0aGlzLl9jb21tb25CaXRzWT1uZXcgbmd9O29nLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dGhpcy5fY29tbW9uQml0c1guYWRkKHQueCksdGhpcy5fY29tbW9uQml0c1kuYWRkKHQueSl9LG9nLnByb3RvdHlwZS5nZXRDb21tb25Db29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1bCh0aGlzLl9jb21tb25CaXRzWC5nZXRDb21tb24oKSx0aGlzLl9jb21tb25CaXRzWS5nZXRDb21tb24oKSl9LG9nLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltLbF19LG9nLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBvZ307dmFyIHNnPWZ1bmN0aW9uKCl7dGhpcy50cmFucz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnRyYW5zPXR9O3NnLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldE9yZGluYXRlKGUsMCkrdGhpcy50cmFucy54LHI9dC5nZXRPcmRpbmF0ZShlLDEpK3RoaXMudHJhbnMueTt0LnNldE9yZGluYXRlKGUsMCxuKSx0LnNldE9yZGluYXRlKGUsMSxyKX0sc2cucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSxzZy5wcm90b3R5cGUuaXNHZW9tZXRyeUNoYW5nZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2cucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0ZjXX0sc2cucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHNnfTt2YXIgYWc9ZnVuY3Rpb24odCxlKXt0aGlzLl9nZW9tPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX3NuYXBUb2xlcmFuY2U9bnVsbCx0aGlzLl9jYnI9bnVsbCx0aGlzLl9nZW9tWzBdPXQsdGhpcy5fZ2VvbVsxXT1lLHRoaXMuY29tcHV0ZVNuYXBUb2xlcmFuY2UoKX07YWcucHJvdG90eXBlLnNlbGZTbmFwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgJGYodCkuc25hcFRvKHQsdGhpcy5fc25hcFRvbGVyYW5jZSl9LGFnLnByb3RvdHlwZS5yZW1vdmVDb21tb25CaXRzPWZ1bmN0aW9uKHQpe3RoaXMuX2Nicj1uZXcgcmcsdGhpcy5fY2JyLmFkZCh0WzBdKSx0aGlzLl9jYnIuYWRkKHRbMV0pO3ZhciBlPW5ldyBBcnJheSgyKS5maWxsKG51bGwpO3JldHVybiBlWzBdPXRoaXMuX2Nici5yZW1vdmVDb21tb25CaXRzKHRbMF0uY29weSgpKSxlWzFdPXRoaXMuX2Nici5yZW1vdmVDb21tb25CaXRzKHRbMV0uY29weSgpKSxlfSxhZy5wcm90b3R5cGUucHJlcGFyZVJlc3VsdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2JyLmFkZENvbW1vbkJpdHModCksdH0sYWcucHJvdG90eXBlLmdldFJlc3VsdEdlb21ldHJ5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc25hcCh0aGlzLl9nZW9tKSxuPU1nLm92ZXJsYXlPcChlWzBdLGVbMV0sdCk7cmV0dXJuIHRoaXMucHJlcGFyZVJlc3VsdChuKX0sYWcucHJvdG90eXBlLmNoZWNrVmFsaWQ9ZnVuY3Rpb24odCl7dC5pc1ZhbGlkKCl8fFBsLm91dC5wcmludGxuKCJTbmFwcGVkIGdlb21ldHJ5IGlzIGludmFsaWQiKX0sYWcucHJvdG90eXBlLmNvbXB1dGVTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKCl7dGhpcy5fc25hcFRvbGVyYW5jZT0kZi5jb21wdXRlT3ZlcmxheVNuYXBUb2xlcmFuY2UodGhpcy5fZ2VvbVswXSx0aGlzLl9nZW9tWzFdKX0sYWcucHJvdG90eXBlLnNuYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yZW1vdmVDb21tb25CaXRzKHQpO3JldHVybiAkZi5zbmFwKGVbMF0sZVsxXSx0aGlzLl9zbmFwVG9sZXJhbmNlKX0sYWcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGFnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBhZ30sYWcub3ZlcmxheU9wPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IGFnKHQsZSkuZ2V0UmVzdWx0R2VvbWV0cnkobil9LGFnLnVuaW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFnLm92ZXJsYXlPcCh0LGUsTWcuVU5JT04pfSxhZy5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWcub3ZlcmxheU9wKHQsZSxNZy5JTlRFUlNFQ1RJT04pfSxhZy5zeW1EaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFnLm92ZXJsYXlPcCh0LGUsTWcuU1lNRElGRkVSRU5DRSl9LGFnLmRpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWcub3ZlcmxheU9wKHQsZSxNZy5ESUZGRVJFTkNFKX07dmFyIHVnPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZ2VvbT1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9nZW9tWzBdPXQsdGhpcy5fZ2VvbVsxXT1lfTt1Zy5wcm90b3R5cGUuZ2V0UmVzdWx0R2VvbWV0cnk9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbCxuPSExLHI9bnVsbDt0cnl7ZT1NZy5vdmVybGF5T3AodGhpcy5fZ2VvbVswXSx0aGlzLl9nZW9tWzFdLHQpO249ITB9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2Yga2wpKXRocm93IHQ7cj10fWlmKCFuKXRyeXtlPWFnLm92ZXJsYXlPcCh0aGlzLl9nZW9tWzBdLHRoaXMuX2dlb21bMV0sdCl9Y2F0Y2godCl7dGhyb3cgdCBpbnN0YW5jZW9mIGtsP3I6dH1yZXR1cm4gZX0sdWcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHVnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB1Z30sdWcub3ZlcmxheU9wPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IHVnKHQsZSkuZ2V0UmVzdWx0R2VvbWV0cnkobil9LHVnLnVuaW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHVnLm92ZXJsYXlPcCh0LGUsTWcuVU5JT04pfSx1Zy5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdWcub3ZlcmxheU9wKHQsZSxNZy5JTlRFUlNFQ1RJT04pfSx1Zy5zeW1EaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHVnLm92ZXJsYXlPcCh0LGUsTWcuU1lNRElGRkVSRU5DRSl9LHVnLmRpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdWcub3ZlcmxheU9wKHQsZSxNZy5ESUZGRVJFTkNFKX07dmFyIGxnPWZ1bmN0aW9uKCl7dGhpcy5tY2U9bnVsbCx0aGlzLmNoYWluSW5kZXg9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5tY2U9dCx0aGlzLmNoYWluSW5kZXg9ZX07bGcucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSl7dGhpcy5tY2UuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbih0aGlzLmNoYWluSW5kZXgsdC5tY2UsdC5jaGFpbkluZGV4LGUpfSxsZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbGcucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGxnfTt2YXIgY2c9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX2xhYmVsPW51bGwsdGhpcy5feFZhbHVlPW51bGwsdGhpcy5fZXZlbnRUeXBlPW51bGwsdGhpcy5faW5zZXJ0RXZlbnQ9bnVsbCx0aGlzLl9kZWxldGVFdmVudEluZGV4PW51bGwsdGhpcy5fb2JqPW51bGwsMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9ldmVudFR5cGU9dC5ERUxFVEUsdGhpcy5feFZhbHVlPWUsdGhpcy5faW5zZXJ0RXZlbnQ9bn1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07dGhpcy5fZXZlbnRUeXBlPXQuSU5TRVJULHRoaXMuX2xhYmVsPXIsdGhpcy5feFZhbHVlPWksdGhpcy5fb2JqPW99fSxoZz17SU5TRVJUOntjb25maWd1cmFibGU6ITB9LERFTEVURTp7Y29uZmlndXJhYmxlOiEwfX07Y2cucHJvdG90eXBlLmlzRGVsZXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50VHlwZT09PWNnLkRFTEVURX0sY2cucHJvdG90eXBlLnNldERlbGV0ZUV2ZW50SW5kZXg9ZnVuY3Rpb24odCl7dGhpcy5fZGVsZXRlRXZlbnRJbmRleD10fSxjZy5wcm90b3R5cGUuZ2V0T2JqZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29ian0sY2cucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLl94VmFsdWU8ZS5feFZhbHVlPy0xOnRoaXMuX3hWYWx1ZT5lLl94VmFsdWU/MTp0aGlzLl9ldmVudFR5cGU8ZS5fZXZlbnRUeXBlPy0xOnRoaXMuX2V2ZW50VHlwZT5lLl9ldmVudFR5cGU/MTowfSxjZy5wcm90b3R5cGUuZ2V0SW5zZXJ0RXZlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5zZXJ0RXZlbnR9LGNnLnByb3RvdHlwZS5pc0luc2VydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudFR5cGU9PT1jZy5JTlNFUlR9LGNnLnByb3RvdHlwZS5pc1NhbWVMYWJlbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXRoaXMuX2xhYmVsJiZ0aGlzLl9sYWJlbD09PXQuX2xhYmVsfSxjZy5wcm90b3R5cGUuZ2V0RGVsZXRlRXZlbnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWxldGVFdmVudEluZGV4fSxjZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5baWxdfSxjZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gY2d9LGhnLklOU0VSVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0saGcuREVMRVRFLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjZyxoZyk7dmFyIHBnPWZ1bmN0aW9uKCl7fTtwZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scGcucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHBnfTt2YXIgZmc9ZnVuY3Rpb24oKXt0aGlzLl9oYXNJbnRlcnNlY3Rpb249ITEsdGhpcy5faGFzUHJvcGVyPSExLHRoaXMuX2hhc1Byb3BlckludGVyaW9yPSExLHRoaXMuX3Byb3BlckludGVyc2VjdGlvblBvaW50PW51bGwsdGhpcy5fbGk9bnVsbCx0aGlzLl9pbmNsdWRlUHJvcGVyPW51bGwsdGhpcy5fcmVjb3JkSXNvbGF0ZWQ9bnVsbCx0aGlzLl9pc1NlbGZJbnRlcnNlY3Rpb249bnVsbCx0aGlzLl9udW1JbnRlcnNlY3Rpb25zPTAsdGhpcy5udW1UZXN0cz0wLHRoaXMuX2JkeU5vZGVzPW51bGwsdGhpcy5faXNEb25lPSExLHRoaXMuX2lzRG9uZVdoZW5Qcm9wZXJJbnQ9ITE7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX2xpPXQsdGhpcy5faW5jbHVkZVByb3Blcj1lLHRoaXMuX3JlY29yZElzb2xhdGVkPW59O2ZnLnByb3RvdHlwZS5pc1RyaXZpYWxJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7aWYodD09PW4mJjE9PT10aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKSl7aWYoZmcuaXNBZGphY2VudFNlZ21lbnRzKGUscikpcmV0dXJuITA7aWYodC5pc0Nsb3NlZCgpKXt2YXIgaT10LmdldE51bVBvaW50cygpLTE7aWYoMD09PWUmJnI9PT1pfHwwPT09ciYmZT09PWkpcmV0dXJuITB9fXJldHVybiExfSxmZy5wcm90b3R5cGUuZ2V0UHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnR9LGZnLnByb3RvdHlwZS5zZXRJc0RvbmVJZlByb3BlckludD1mdW5jdGlvbih0KXt0aGlzLl9pc0RvbmVXaGVuUHJvcGVySW50PXR9LGZnLnByb3RvdHlwZS5oYXNQcm9wZXJJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcn0sZmcucHJvdG90eXBlLmlzQm91bmRhcnlQb2ludEludGVybmFsPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLmdldENvb3JkaW5hdGUoKTtpZih0LmlzSW50ZXJzZWN0aW9uKHIpKXJldHVybiEwfXJldHVybiExfSxmZy5wcm90b3R5cGUuaGFzUHJvcGVySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Byb3Blcn0sZmcucHJvdG90eXBlLmhhc0ludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNJbnRlcnNlY3Rpb259LGZnLnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNEb25lfSxmZy5wcm90b3R5cGUuaXNCb3VuZGFyeVBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPT1lJiYoISF0aGlzLmlzQm91bmRhcnlQb2ludEludGVybmFsKHQsZVswXSl8fCEhdGhpcy5pc0JvdW5kYXJ5UG9pbnRJbnRlcm5hbCh0LGVbMV0pKX0sZmcucHJvdG90eXBlLnNldEJvdW5kYXJ5Tm9kZXM9ZnVuY3Rpb24odCxlKXt0aGlzLl9iZHlOb2Rlcz1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9iZHlOb2Rlc1swXT10LHRoaXMuX2JkeU5vZGVzWzFdPWV9LGZnLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiZlPT09cilyZXR1cm4gbnVsbDt0aGlzLm51bVRlc3RzKys7dmFyIGk9dC5nZXRDb29yZGluYXRlcygpW2VdLG89dC5nZXRDb29yZGluYXRlcygpW2UrMV0scz1uLmdldENvb3JkaW5hdGVzKClbcl0sYT1uLmdldENvb3JkaW5hdGVzKClbcisxXTt0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGksbyxzLGEpLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYodGhpcy5fcmVjb3JkSXNvbGF0ZWQmJih0LnNldElzb2xhdGVkKCExKSxuLnNldElzb2xhdGVkKCExKSksdGhpcy5fbnVtSW50ZXJzZWN0aW9ucysrLHRoaXMuaXNUcml2aWFsSW50ZXJzZWN0aW9uKHQsZSxuLHIpfHwodGhpcy5faGFzSW50ZXJzZWN0aW9uPSEwLCF0aGlzLl9pbmNsdWRlUHJvcGVyJiZ0aGlzLl9saS5pc1Byb3BlcigpfHwodC5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLGUsMCksbi5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLHIsMSkpLHRoaXMuX2xpLmlzUHJvcGVyKCkmJih0aGlzLl9wcm9wZXJJbnRlcnNlY3Rpb25Qb2ludD10aGlzLl9saS5nZXRJbnRlcnNlY3Rpb24oMCkuY29weSgpLHRoaXMuX2hhc1Byb3Blcj0hMCx0aGlzLl9pc0RvbmVXaGVuUHJvcGVySW50JiYodGhpcy5faXNEb25lPSEwKSx0aGlzLmlzQm91bmRhcnlQb2ludCh0aGlzLl9saSx0aGlzLl9iZHlOb2Rlcyl8fCh0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcj0hMCkpKSl9LGZnLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxmZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZmd9LGZnLmlzQWRqYWNlbnRTZWdtZW50cz1mdW5jdGlvbih0LGUpe3JldHVybiAxPT09TWF0aC5hYnModC1lKX07dmFyIGdnPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5ldmVudHM9bmV3IGxjLHRoaXMubk92ZXJsYXBzPW51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnByZXBhcmVFdmVudHM9ZnVuY3Rpb24oKXtucC5zb3J0KHRoaXMuZXZlbnRzKTtmb3IodmFyIHQ9MDt0PHRoaXMuZXZlbnRzLnNpemUoKTt0Kyspe3ZhciBlPXRoaXMuZXZlbnRzLmdldCh0KTtlLmlzRGVsZXRlKCkmJmUuZ2V0SW5zZXJ0RXZlbnQoKS5zZXREZWxldGVFdmVudEluZGV4KHQpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5uT3ZlcmxhcHM9MCx0aGlzLnByZXBhcmVFdmVudHMoKTtmb3IodmFyIG49MDtuPHRoaXMuZXZlbnRzLnNpemUoKTtuKyspe3ZhciByPXQuZXZlbnRzLmdldChuKTtpZihyLmlzSW5zZXJ0KCkmJnQucHJvY2Vzc092ZXJsYXBzKG4sci5nZXREZWxldGVFdmVudEluZGV4KCkscixlKSxlLmlzRG9uZSgpKWJyZWFrfX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKWlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgZmcmJmdsKGFyZ3VtZW50c1swXSxhYykmJmdsKGFyZ3VtZW50c1sxXSxhYykpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXTt0aGlzLmFkZEVkZ2VzKGksaSksdGhpcy5hZGRFZGdlcyhvLG8pLHRoaXMuY29tcHV0ZUludGVyc2VjdGlvbnMocyl9ZWxzZSBpZigiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJmdsKGFyZ3VtZW50c1swXSxhYykmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgZmcpe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXSxsPWFyZ3VtZW50c1syXTtsP3RoaXMuYWRkRWRnZXMoYSxudWxsKTp0aGlzLmFkZEVkZ2VzKGEpLHRoaXMuY29tcHV0ZUludGVyc2VjdGlvbnModSl9fSxlLnByb3RvdHlwZS5hZGRFZGdlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2V0TW9ub3RvbmVDaGFpbkVkZ2UoKSxyPW4uZ2V0U3RhcnRJbmRleGVzKCksaT0wO2k8ci5sZW5ndGgtMTtpKyspe3ZhciBvPW5ldyBsZyhuLGkpLHM9bmV3IGNnKGUsbi5nZXRNaW5YKGkpLG8pO3RoaXMuZXZlbnRzLmFkZChzKSx0aGlzLmV2ZW50cy5hZGQobmV3IGNnKG4uZ2V0TWF4WChpKSxzKSl9fSxlLnByb3RvdHlwZS5wcm9jZXNzT3ZlcmxhcHM9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPW4uZ2V0T2JqZWN0KCksbz10O288ZTtvKyspe3ZhciBzPXRoaXMuZXZlbnRzLmdldChvKTtpZihzLmlzSW5zZXJ0KCkpe3ZhciBhPXMuZ2V0T2JqZWN0KCk7bi5pc1NhbWVMYWJlbChzKXx8KGkuY29tcHV0ZUludGVyc2VjdGlvbnMoYSxyKSx0aGlzLm5PdmVybGFwcysrKX19fSxlLnByb3RvdHlwZS5hZGRFZGdlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3QuYWRkRWRnZShyLHIpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWkuaXRlcmF0b3IoKTtzLmhhc05leHQoKTspe3ZhciBhPXMubmV4dCgpO3QuYWRkRWRnZShhLG8pfX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0ocGcpLGRnPWZ1bmN0aW9uKCl7dGhpcy5fbWluPW5sLlBPU0lUSVZFX0lORklOSVRZLHRoaXMuX21heD1ubC5ORUdBVElWRV9JTkZJTklUWX0seWc9e05vZGVDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9fTtkZy5wcm90b3R5cGUuZ2V0TWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbn0sZGcucHJvdG90eXBlLmludGVyc2VjdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4hKHRoaXMuX21pbj5lfHx0aGlzLl9tYXg8dCl9LGRnLnByb3RvdHlwZS5nZXRNYXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4fSxkZy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gRmwudG9MaW5lU3RyaW5nKG5ldyB1bCh0aGlzLl9taW4sMCksbmV3IHVsKHRoaXMuX21heCwwKSl9LGRnLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxkZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZGd9LHlnLk5vZGVDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiB2Z30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGcseWcpO3ZhciB2Zz1mdW5jdGlvbigpe307dmcucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZSxpPShuLl9taW4rbi5fbWF4KS8yLG89KHIuX21pbityLl9tYXgpLzI7cmV0dXJuIGk8bz8tMTppPm8/MTowfSx2Zy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bc2xdfSx2Zy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdmd9O3ZhciBfZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX2l0ZW09bnVsbDt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5fbWluPWUsdGhpcy5fbWF4PW4sdGhpcy5faXRlbT1yfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuaW50ZXJzZWN0cyh0LGUpKXJldHVybiBudWxsO24udmlzaXRJdGVtKHRoaXMuX2l0ZW0pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShkZyksbWc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9ub2RlMT1udWxsLHRoaXMuX25vZGUyPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuX25vZGUxPWUsdGhpcy5fbm9kZTI9bix0aGlzLmJ1aWxkRXh0ZW50KHRoaXMuX25vZGUxLHRoaXMuX25vZGUyKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuYnVpbGRFeHRlbnQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9taW49TWF0aC5taW4odC5fbWluLGUuX21pbiksdGhpcy5fbWF4PU1hdGgubWF4KHQuX21heCxlLl9tYXgpfSxlLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuaW50ZXJzZWN0cyh0LGUpKXJldHVybiBudWxsO251bGwhPT10aGlzLl9ub2RlMSYmdGhpcy5fbm9kZTEucXVlcnkodCxlLG4pLG51bGwhPT10aGlzLl9ub2RlMiYmdGhpcy5fbm9kZTIucXVlcnkodCxlLG4pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShkZykseGc9ZnVuY3Rpb24oKXt0aGlzLl9sZWF2ZXM9bmV3IGxjLHRoaXMuX3Jvb3Q9bnVsbCx0aGlzLl9sZXZlbD0wfTt4Zy5wcm90b3R5cGUuYnVpbGRUcmVlPWZ1bmN0aW9uKCl7bnAuc29ydCh0aGlzLl9sZWF2ZXMsbmV3IGRnLk5vZGVDb21wYXJhdG9yKTtmb3IodmFyIHQ9dGhpcy5fbGVhdmVzLGU9bnVsbCxuPW5ldyBsYzs7KXtpZih0aGlzLmJ1aWxkTGV2ZWwodCxuKSwxPT09bi5zaXplKCkpcmV0dXJuIG4uZ2V0KDApO2U9dCx0PW4sbj1lfX0seGcucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUsbil7aWYobnVsbCE9PXRoaXMuX3Jvb3QpdGhyb3cgbmV3IEVycm9yKCJJbmRleCBjYW5ub3QgYmUgYWRkZWQgdG8gb25jZSBpdCBoYXMgYmVlbiBxdWVyaWVkIik7dGhpcy5fbGVhdmVzLmFkZChuZXcgX2codCxlLG4pKX0seGcucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmluaXQoKSx0aGlzLl9yb290LnF1ZXJ5KHQsZSxuKX0seGcucHJvdG90eXBlLmJ1aWxkUm9vdD1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLl9yb290KXJldHVybiBudWxsO3RoaXMuX3Jvb3Q9dGhpcy5idWlsZFRyZWUoKX0seGcucHJvdG90eXBlLnByaW50Tm9kZT1mdW5jdGlvbih0KXtQbC5vdXQucHJpbnRsbihGbC50b0xpbmVTdHJpbmcobmV3IHVsKHQuX21pbix0aGlzLl9sZXZlbCksbmV3IHVsKHQuX21heCx0aGlzLl9sZXZlbCkpKX0seGcucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy5fcm9vdClyZXR1cm4gbnVsbDt0aGlzLmJ1aWxkUm9vdCgpfSx4Zy5wcm90b3R5cGUuYnVpbGRMZXZlbD1mdW5jdGlvbih0LGUpe3RoaXMuX2xldmVsKyssZS5jbGVhcigpO2Zvcih2YXIgbj0wO248dC5zaXplKCk7bis9Mil7dmFyIHI9dC5nZXQobik7aWYobnVsbD09PShuKzE8dC5zaXplKCk/dC5nZXQobik6bnVsbCkpZS5hZGQocik7ZWxzZXt2YXIgaT1uZXcgbWcodC5nZXQobiksdC5nZXQobisxKSk7ZS5hZGQoaSl9fX0seGcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHhnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB4Z307dmFyIEVnPWZ1bmN0aW9uKCl7dGhpcy5faXRlbXM9bmV3IGxjfTtFZy5wcm90b3R5cGUudmlzaXRJdGVtPWZ1bmN0aW9uKHQpe3RoaXMuX2l0ZW1zLmFkZCh0KX0sRWcucHJvdG90eXBlLmdldEl0ZW1zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2l0ZW1zfSxFZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bUWhdfSxFZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRWd9O3ZhciBiZz1mdW5jdGlvbigpe3RoaXMuX2luZGV4PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO2lmKCFnbCh0LCRjKSl0aHJvdyBuZXcgZWwoIkFyZ3VtZW50IG11c3QgYmUgUG9seWdvbmFsIik7dGhpcy5faW5kZXg9bmV3IE5nKHQpfSx3Zz17U2VnbWVudFZpc2l0b3I6e2NvbmZpZ3VyYWJsZTohMH0sSW50ZXJ2YWxJbmRleGVkR2VvbWV0cnk6e2NvbmZpZ3VyYWJsZTohMH19O2JnLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFZsKHQpLG49bmV3IElnKGUpO3JldHVybiB0aGlzLl9pbmRleC5xdWVyeSh0LnksdC55LG4pLGUuZ2V0TG9jYXRpb24oKX0sYmcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2pwXX0sYmcucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGJnfSx3Zy5TZWdtZW50VmlzaXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gSWd9LHdnLkludGVydmFsSW5kZXhlZEdlb21ldHJ5LmdldD1mdW5jdGlvbigpe3JldHVybiBOZ30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYmcsd2cpO3ZhciBJZz1mdW5jdGlvbigpe3RoaXMuX2NvdW50ZXI9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fY291bnRlcj10fTtJZy5wcm90b3R5cGUudmlzaXRJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7dGhpcy5fY291bnRlci5jb3VudFNlZ21lbnQoZS5nZXRDb29yZGluYXRlKDApLGUuZ2V0Q29vcmRpbmF0ZSgxKSl9LElnLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltRaF19LElnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBJZ307dmFyIE5nPWZ1bmN0aW9uKCl7dGhpcy5faW5kZXg9bmV3IHhnO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmluaXQodCl9O05nLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1DZi5nZXRMaW5lcyh0KS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkuZ2V0Q29vcmRpbmF0ZXMoKTt0aGlzLmFkZExpbmUobil9fSxOZy5wcm90b3R5cGUuYWRkTGluZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPHQubGVuZ3RoO2UrKyl7dmFyIG49bmV3IHZwKHRbZS0xXSx0W2VdKSxyPU1hdGgubWluKG4ucDAueSxuLnAxLnkpLGk9TWF0aC5tYXgobi5wMC55LG4ucDEueSk7dGhpcy5faW5kZXguaW5zZXJ0KHIsaSxuKX19LE5nLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1uZXcgRWc7cmV0dXJuIHRoaXMuX2luZGV4LnF1ZXJ5KHQsZSxuKSxuLmdldEl0ZW1zKCl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXTt0aGlzLl9pbmRleC5xdWVyeShyLGksbyl9fSxOZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sTmcucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE5nfTt2YXIgU2c9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe2lmKHQuY2FsbCh0aGlzKSx0aGlzLl9wYXJlbnRHZW9tPW51bGwsdGhpcy5fbGluZUVkZ2VNYXA9bmV3IGZoLHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGU9bnVsbCx0aGlzLl91c2VCb3VuZGFyeURldGVybWluYXRpb25SdWxlPSEwLHRoaXMuX2FyZ0luZGV4PW51bGwsdGhpcy5fYm91bmRhcnlOb2Rlcz1udWxsLHRoaXMuX2hhc1Rvb0Zld1BvaW50cz0hMSx0aGlzLl9pbnZhbGlkUG9pbnQ9bnVsbCx0aGlzLl9hcmVhUHRMb2NhdG9yPW51bGwsdGhpcy5fcHRMb2NhdG9yPW5ldyBQZiwyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9UWwuT0dDX1NGU19CT1VOREFSWV9SVUxFO3RoaXMuX2FyZ0luZGV4PWUsdGhpcy5fcGFyZW50R2VvbT1uLHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGU9cixudWxsIT09biYmdGhpcy5hZGQobil9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdO3RoaXMuX2FyZ0luZGV4PWksdGhpcy5fcGFyZW50R2VvbT1vLHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGU9cyxudWxsIT09byYmdGhpcy5hZGQobyl9fXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pbnNlcnRCb3VuZGFyeVBvaW50PWZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcy5fbm9kZXMuYWRkTm9kZShuKS5nZXRMYWJlbCgpLGk9MTtyLmdldExvY2F0aW9uKHQsU2guT04pPT09cGwuQk9VTkRBUlkmJmkrKzt2YXIgbz1lLmRldGVybWluZUJvdW5kYXJ5KHRoaXMuX2JvdW5kYXJ5Tm9kZVJ1bGUsaSk7ci5zZXRMb2NhdGlvbih0LG8pfSxlLnByb3RvdHlwZS5jb21wdXRlU2VsZk5vZGVzPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5jb21wdXRlU2VsZk5vZGVzKHQsZSwhMSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXSxvPW5ldyBmZyhuLCEwLCExKTtvLnNldElzRG9uZUlmUHJvcGVySW50KGkpO3ZhciBzPXRoaXMuY3JlYXRlRWRnZVNldEludGVyc2VjdG9yKCksYT10aGlzLl9wYXJlbnRHZW9tIGluc3RhbmNlb2Ygbmh8fHRoaXMuX3BhcmVudEdlb20gaW5zdGFuY2VvZiB0aHx8dGhpcy5fcGFyZW50R2VvbSBpbnN0YW5jZW9mIHJoLHU9cnx8IWE7cmV0dXJuIHMuY29tcHV0ZUludGVyc2VjdGlvbnModGhpcy5fZWRnZXMsbyx1KSx0aGlzLmFkZFNlbGZJbnRlcnNlY3Rpb25Ob2Rlcyh0aGlzLl9hcmdJbmRleCksb319LGUucHJvdG90eXBlLmNvbXB1dGVTcGxpdEVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9lZGdlcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkuZWlMaXN0LmFkZFNwbGl0RWRnZXModCl9fSxlLnByb3RvdHlwZS5jb21wdXRlRWRnZUludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBmZyhlLG4sITApO3JldHVybiByLnNldEJvdW5kYXJ5Tm9kZXModGhpcy5nZXRCb3VuZGFyeU5vZGVzKCksdC5nZXRCb3VuZGFyeU5vZGVzKCkpLHRoaXMuY3JlYXRlRWRnZVNldEludGVyc2VjdG9yKCkuY29tcHV0ZUludGVyc2VjdGlvbnModGhpcy5fZWRnZXMsdC5fZWRnZXMscikscn0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFyZW50R2VvbX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlOb2RlUnVsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ib3VuZGFyeU5vZGVSdWxlfSxlLnByb3RvdHlwZS5oYXNUb29GZXdQb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzVG9vRmV3UG9pbnRzfSxlLnByb3RvdHlwZS5hZGRQb2ludD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgUWMpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXQuZ2V0Q29vcmRpbmF0ZSgpO3RoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsZSxwbC5JTlRFUklPUil9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVsKXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5pbnNlcnRQb2ludCh0aGlzLl9hcmdJbmRleCxuLHBsLklOVEVSSU9SKX19LGUucHJvdG90eXBlLmFkZFBvbHlnb249ZnVuY3Rpb24odCl7dGhpcy5hZGRQb2x5Z29uUmluZyh0LmdldEV4dGVyaW9yUmluZygpLHBsLkVYVEVSSU9SLHBsLklOVEVSSU9SKTtmb3IodmFyIGU9MDtlPHQuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7ZSsrKXt2YXIgbj10LmdldEludGVyaW9yUmluZ04oZSk7dGhpcy5hZGRQb2x5Z29uUmluZyhuLHBsLklOVEVSSU9SLHBsLkVYVEVSSU9SKX19LGUucHJvdG90eXBlLmFkZEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5pbnNlcnRFZGdlKHQpO3ZhciBlPXQuZ2V0Q29vcmRpbmF0ZXMoKTt0aGlzLmluc2VydFBvaW50KHRoaXMuX2FyZ0luZGV4LGVbMF0scGwuQk9VTkRBUlkpLHRoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsZVtlLmxlbmd0aC0xXSxwbC5CT1VOREFSWSl9LGUucHJvdG90eXBlLmFkZExpbmVTdHJpbmc9ZnVuY3Rpb24odCl7dmFyIGU9cGMucmVtb3ZlUmVwZWF0ZWRQb2ludHModC5nZXRDb29yZGluYXRlcygpKTtpZihlLmxlbmd0aDwyKXJldHVybiB0aGlzLl9oYXNUb29GZXdQb2ludHM9ITAsdGhpcy5faW52YWxpZFBvaW50PWVbMF0sbnVsbDt2YXIgbj1uZXcgb2YoZSxuZXcgRGgodGhpcy5fYXJnSW5kZXgscGwuSU5URVJJT1IpKTt0aGlzLl9saW5lRWRnZU1hcC5wdXQodCxuKSx0aGlzLmluc2VydEVkZ2UobikscWwuaXNUcnVlKGUubGVuZ3RoPj0yLCJmb3VuZCBMaW5lU3RyaW5nIHdpdGggc2luZ2xlIHBvaW50IiksdGhpcy5pbnNlcnRCb3VuZGFyeVBvaW50KHRoaXMuX2FyZ0luZGV4LGVbMF0pLHRoaXMuaW5zZXJ0Qm91bmRhcnlQb2ludCh0aGlzLl9hcmdJbmRleCxlW2UubGVuZ3RoLTFdKX0sZS5wcm90b3R5cGUuZ2V0SW52YWxpZFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludmFsaWRQb2ludH0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlQb2ludHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5nZXRCb3VuZGFyeU5vZGVzKCksZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCksbj0wLHI9dC5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7ZVtuKytdPWkuZ2V0Q29vcmRpbmF0ZSgpLmNvcHkoKX1yZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlOb2Rlcz1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fYm91bmRhcnlOb2RlcyYmKHRoaXMuX2JvdW5kYXJ5Tm9kZXM9dGhpcy5fbm9kZXMuZ2V0Qm91bmRhcnlOb2Rlcyh0aGlzLl9hcmdJbmRleCkpLHRoaXMuX2JvdW5kYXJ5Tm9kZXN9LGUucHJvdG90eXBlLmFkZFNlbGZJbnRlcnNlY3Rpb25Ob2RlPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLmlzQm91bmRhcnlOb2RlKHQsZSkpcmV0dXJuIG51bGw7bj09PXBsLkJPVU5EQVJZJiZ0aGlzLl91c2VCb3VuZGFyeURldGVybWluYXRpb25SdWxlP3RoaXMuaW5zZXJ0Qm91bmRhcnlQb2ludCh0LGUpOnRoaXMuaW5zZXJ0UG9pbnQodCxlLG4pfSxlLnByb3RvdHlwZS5hZGRQb2x5Z29uUmluZz1mdW5jdGlvbih0LGUsbil7aWYodC5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dmFyIHI9cGMucmVtb3ZlUmVwZWF0ZWRQb2ludHModC5nZXRDb29yZGluYXRlcygpKTtpZihyLmxlbmd0aDw0KXJldHVybiB0aGlzLl9oYXNUb29GZXdQb2ludHM9ITAsdGhpcy5faW52YWxpZFBvaW50PXJbMF0sbnVsbDt2YXIgaT1lLG89bjtYbC5pc0NDVyhyKSYmKGk9bixvPWUpO3ZhciBzPW5ldyBvZihyLG5ldyBEaCh0aGlzLl9hcmdJbmRleCxwbC5CT1VOREFSWSxpLG8pKTt0aGlzLl9saW5lRWRnZU1hcC5wdXQodCxzKSx0aGlzLmluc2VydEVkZ2UocyksdGhpcy5pbnNlcnRQb2ludCh0aGlzLl9hcmdJbmRleCxyWzBdLHBsLkJPVU5EQVJZKX0sZS5wcm90b3R5cGUuaW5zZXJ0UG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuX25vZGVzLmFkZE5vZGUoZSksaT1yLmdldExhYmVsKCk7bnVsbD09PWk/ci5fbGFiZWw9bmV3IERoKHQsbik6aS5zZXRMb2NhdGlvbih0LG4pfSxlLnByb3RvdHlwZS5jcmVhdGVFZGdlU2V0SW50ZXJzZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGdnfSxlLnByb3RvdHlwZS5hZGRTZWxmSW50ZXJzZWN0aW9uTm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2VkZ2VzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KWZvcih2YXIgbj1lLm5leHQoKSxyPW4uZ2V0TGFiZWwoKS5nZXRMb2NhdGlvbih0KSxpPW4uZWlMaXN0Lml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKTt0aGlzLmFkZFNlbGZJbnRlcnNlY3Rpb25Ob2RlKHQsby5jb29yZCxyKX19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe2lmKDEhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5hZGQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDtpZihlIGluc3RhbmNlb2YgcmgmJih0aGlzLl91c2VCb3VuZGFyeURldGVybWluYXRpb25SdWxlPSExKSxlIGluc3RhbmNlb2YgdGgpdGhpcy5hZGRQb2x5Z29uKGUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIFpjKXRoaXMuYWRkTGluZVN0cmluZyhlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBRYyl0aGlzLmFkZFBvaW50KGUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGVoKXRoaXMuYWRkQ29sbGVjdGlvbihlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBHYyl0aGlzLmFkZENvbGxlY3Rpb24oZSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgcmgpdGhpcy5hZGRDb2xsZWN0aW9uKGUpO2Vsc2V7aWYoIShlIGluc3RhbmNlb2Yga2MpKXRocm93IG5ldyBFcnJvcihlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTt0aGlzLmFkZENvbGxlY3Rpb24oZSl9fSxlLnByb3RvdHlwZS5hZGRDb2xsZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5nZXROdW1HZW9tZXRyaWVzKCk7ZSsrKXt2YXIgbj10LmdldEdlb21ldHJ5TihlKTt0aGlzLmFkZChuKX19LGUucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0KXtyZXR1cm4gZ2wodGhpcy5fcGFyZW50R2VvbSwkYykmJnRoaXMuX3BhcmVudEdlb20uZ2V0TnVtR2VvbWV0cmllcygpPjUwPyhudWxsPT09dGhpcy5fYXJlYVB0TG9jYXRvciYmKHRoaXMuX2FyZWFQdExvY2F0b3I9bmV3IGJnKHRoaXMuX3BhcmVudEdlb20pKSx0aGlzLl9hcmVhUHRMb2NhdG9yLmxvY2F0ZSh0KSk6dGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LHRoaXMuX3BhcmVudEdlb20pfSxlLnByb3RvdHlwZS5maW5kRWRnZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2xpbmVFZGdlTWFwLmdldChlKX1yZXR1cm4gdC5wcm90b3R5cGUuZmluZEVkZ2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLmRldGVybWluZUJvdW5kYXJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaXNJbkJvdW5kYXJ5KGUpP3BsLkJPVU5EQVJZOnBsLklOVEVSSU9SfSxlfShIaCksQ2c9ZnVuY3Rpb24oKXtpZih0aGlzLl9saT1uZXcgamwsdGhpcy5fcmVzdWx0UHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9hcmc9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24odC5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9hcmc9bmV3IEFycmF5KDEpLmZpbGwobnVsbCksdGhpcy5fYXJnWzBdPW5ldyBTZygwLHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPVFsLk9HQ19TRlNfQk9VTkRBUllfUlVMRTtlLmdldFByZWNpc2lvbk1vZGVsKCkuY29tcGFyZVRvKG4uZ2V0UHJlY2lzaW9uTW9kZWwoKSk+PTA/dGhpcy5zZXRDb21wdXRhdGlvblByZWNpc2lvbihlLmdldFByZWNpc2lvbk1vZGVsKCkpOnRoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24obi5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9hcmc9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5fYXJnWzBdPW5ldyBTZygwLGUsciksdGhpcy5fYXJnWzFdPW5ldyBTZygxLG4scil9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdO2kuZ2V0UHJlY2lzaW9uTW9kZWwoKS5jb21wYXJlVG8oby5nZXRQcmVjaXNpb25Nb2RlbCgpKT49MD90aGlzLnNldENvbXB1dGF0aW9uUHJlY2lzaW9uKGkuZ2V0UHJlY2lzaW9uTW9kZWwoKSk6dGhpcy5zZXRDb21wdXRhdGlvblByZWNpc2lvbihvLmdldFByZWNpc2lvbk1vZGVsKCkpLHRoaXMuX2FyZz1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9hcmdbMF09bmV3IFNnKDAsaSxzKSx0aGlzLl9hcmdbMV09bmV3IFNnKDEsbyxzKX19O0NnLnByb3RvdHlwZS5nZXRBcmdHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYXJnW3RdLmdldEdlb21ldHJ5KCl9LENnLnByb3RvdHlwZS5zZXRDb21wdXRhdGlvblByZWNpc2lvbj1mdW5jdGlvbih0KXt0aGlzLl9yZXN1bHRQcmVjaXNpb25Nb2RlbD10LHRoaXMuX2xpLnNldFByZWNpc2lvbk1vZGVsKHRoaXMuX3Jlc3VsdFByZWNpc2lvbk1vZGVsKX0sQ2cucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LENnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDZ307dmFyIFBnPWZ1bmN0aW9uKCl7fTtQZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUGcucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFBnfSxQZy5tYXA9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFdsJiZnbChhcmd1bWVudHNbMV0sUGcuTWFwT3ApKXtmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IGxjLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9ZS5tYXAodC5nZXRHZW9tZXRyeU4ocikpO251bGwhPT1pJiZuLmFkZChpKX1yZXR1cm4gdC5nZXRGYWN0b3J5KCkuYnVpbGRHZW9tZXRyeShuKX1pZihnbChhcmd1bWVudHNbMF0saWMpJiZnbChhcmd1bWVudHNbMV0sUGcuTWFwT3ApKXtmb3IodmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGE9bmV3IGxjLHU9by5pdGVyYXRvcigpO3UuaGFzTmV4dCgpOyl7dmFyIGw9dS5uZXh0KCksYz1zLm1hcChsKTtudWxsIT09YyYmYS5hZGQoYyl9cmV0dXJuIGF9fSxQZy5NYXBPcD1mdW5jdGlvbigpe307dmFyIE1nPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dC5jYWxsKHRoaXMsZSxuKSx0aGlzLl9wdExvY2F0b3I9bmV3IFBmLHRoaXMuX2dlb21GYWN0PW51bGwsdGhpcy5fcmVzdWx0R2VvbT1udWxsLHRoaXMuX2dyYXBoPW51bGwsdGhpcy5fZWRnZUxpc3Q9bmV3IEpwLHRoaXMuX3Jlc3VsdFBvbHlMaXN0PW5ldyBsYyx0aGlzLl9yZXN1bHRMaW5lTGlzdD1uZXcgbGMsdGhpcy5fcmVzdWx0UG9pbnRMaXN0PW5ldyBsYyx0aGlzLl9ncmFwaD1uZXcgSGgobmV3IEhwKSx0aGlzLl9nZW9tRmFjdD1lLmdldEZhY3RvcnkoKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaW5zZXJ0VW5pcXVlRWRnZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9lZGdlTGlzdC5maW5kRXF1YWxFZGdlKHQpO2lmKG51bGwhPT1lKXt2YXIgbj1lLmdldExhYmVsKCkscj10LmdldExhYmVsKCk7ZS5pc1BvaW50d2lzZUVxdWFsKHQpfHwocj1uZXcgRGgodC5nZXRMYWJlbCgpKSkuZmxpcCgpO3ZhciBpPWUuZ2V0RGVwdGgoKTtpLmlzTnVsbCgpJiZpLmFkZChuKSxpLmFkZChyKSxuLm1lcmdlKHIpfWVsc2UgdGhpcy5fZWRnZUxpc3QuYWRkKHQpfSxlLnByb3RvdHlwZS5nZXRHcmFwaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ncmFwaH0sZS5wcm90b3R5cGUuY2FuY2VsRHVwbGljYXRlUmVzdWx0RWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0RWRnZUVuZHMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldFN5bSgpO2UuaXNJblJlc3VsdCgpJiZuLmlzSW5SZXN1bHQoKSYmKGUuc2V0SW5SZXN1bHQoITEpLG4uc2V0SW5SZXN1bHQoITEpKX19LGUucHJvdG90eXBlLmlzQ292ZXJlZEJ5TEE9ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLmlzQ292ZXJlZCh0LHRoaXMuX3Jlc3VsdExpbmVMaXN0KXx8ISF0aGlzLmlzQ292ZXJlZCh0LHRoaXMuX3Jlc3VsdFBvbHlMaXN0KX0sZS5wcm90b3R5cGUuY29tcHV0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPW5ldyBsYztyZXR1cm4gby5hZGRBbGwodCksby5hZGRBbGwobiksby5hZGRBbGwociksby5pc0VtcHR5KCk/ZS5jcmVhdGVFbXB0eVJlc3VsdChpLHRoaXMuX2FyZ1swXS5nZXRHZW9tZXRyeSgpLHRoaXMuX2FyZ1sxXS5nZXRHZW9tZXRyeSgpLHRoaXMuX2dlb21GYWN0KTp0aGlzLl9nZW9tRmFjdC5idWlsZEdlb21ldHJ5KG8pfSxlLnByb3RvdHlwZS5tZXJnZVN5bUxhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncmFwaC5nZXROb2RlcygpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt0Lm5leHQoKS5nZXRFZGdlcygpLm1lcmdlU3ltTGFiZWxzKCl9fSxlLnByb3RvdHlwZS5pc0NvdmVyZWQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7aWYodGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LHIpIT09cGwuRVhURVJJT1IpcmV0dXJuITB9cmV0dXJuITF9LGUucHJvdG90eXBlLnJlcGxhY2VDb2xsYXBzZWRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgbGMsZT10aGlzLl9lZGdlTGlzdC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7bi5pc0NvbGxhcHNlZCgpJiYoZS5yZW1vdmUoKSx0LmFkZChuLmdldENvbGxhcHNlZEVkZ2UoKSkpfXRoaXMuX2VkZ2VMaXN0LmFkZEFsbCh0KX0sZS5wcm90b3R5cGUudXBkYXRlTm9kZUxhYmVsbGluZz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncmFwaC5nZXROb2RlcygpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKSxuPWUuZ2V0RWRnZXMoKS5nZXRMYWJlbCgpO2UuZ2V0TGFiZWwoKS5tZXJnZShuKX19LGUucHJvdG90eXBlLmdldFJlc3VsdEdlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbXB1dGVPdmVybGF5KHQpLHRoaXMuX3Jlc3VsdEdlb219LGUucHJvdG90eXBlLmluc2VydFVuaXF1ZUVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0aGlzLmluc2VydFVuaXF1ZUVkZ2Uobil9fSxlLnByb3RvdHlwZS5jb21wdXRlT3ZlcmxheT1mdW5jdGlvbih0KXt0aGlzLmNvcHlQb2ludHMoMCksdGhpcy5jb3B5UG9pbnRzKDEpLHRoaXMuX2FyZ1swXS5jb21wdXRlU2VsZk5vZGVzKHRoaXMuX2xpLCExKSx0aGlzLl9hcmdbMV0uY29tcHV0ZVNlbGZOb2Rlcyh0aGlzLl9saSwhMSksdGhpcy5fYXJnWzBdLmNvbXB1dGVFZGdlSW50ZXJzZWN0aW9ucyh0aGlzLl9hcmdbMV0sdGhpcy5fbGksITApO3ZhciBlPW5ldyBsYzt0aGlzLl9hcmdbMF0uY29tcHV0ZVNwbGl0RWRnZXMoZSksdGhpcy5fYXJnWzFdLmNvbXB1dGVTcGxpdEVkZ2VzKGUpLHRoaXMuaW5zZXJ0VW5pcXVlRWRnZXMoZSksdGhpcy5jb21wdXRlTGFiZWxzRnJvbURlcHRocygpLHRoaXMucmVwbGFjZUNvbGxhcHNlZEVkZ2VzKCksSGYuY2hlY2tWYWxpZCh0aGlzLl9lZGdlTGlzdC5nZXRFZGdlcygpKSx0aGlzLl9ncmFwaC5hZGRFZGdlcyh0aGlzLl9lZGdlTGlzdC5nZXRFZGdlcygpKSx0aGlzLmNvbXB1dGVMYWJlbGxpbmcoKSx0aGlzLmxhYmVsSW5jb21wbGV0ZU5vZGVzKCksdGhpcy5maW5kUmVzdWx0QXJlYUVkZ2VzKHQpLHRoaXMuY2FuY2VsRHVwbGljYXRlUmVzdWx0RWRnZXMoKTt2YXIgbj1uZXcgV2godGhpcy5fZ2VvbUZhY3QpO24uYWRkKHRoaXMuX2dyYXBoKSx0aGlzLl9yZXN1bHRQb2x5TGlzdD1uLmdldFBvbHlnb25zKCk7dmFyIHI9bmV3IEpmKHRoaXMsdGhpcy5fZ2VvbUZhY3QsdGhpcy5fcHRMb2NhdG9yKTt0aGlzLl9yZXN1bHRMaW5lTGlzdD1yLmJ1aWxkKHQpO3ZhciBpPW5ldyBaZih0aGlzLHRoaXMuX2dlb21GYWN0LHRoaXMuX3B0TG9jYXRvcik7dGhpcy5fcmVzdWx0UG9pbnRMaXN0PWkuYnVpbGQodCksdGhpcy5fcmVzdWx0R2VvbT10aGlzLmNvbXB1dGVHZW9tZXRyeSh0aGlzLl9yZXN1bHRQb2ludExpc3QsdGhpcy5fcmVzdWx0TGluZUxpc3QsdGhpcy5fcmVzdWx0UG9seUxpc3QsdCl9LGUucHJvdG90eXBlLmxhYmVsSW5jb21wbGV0ZU5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9wdExvY2F0b3IubG9jYXRlKHQuZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuX2FyZ1tlXS5nZXRHZW9tZXRyeSgpKTt0LmdldExhYmVsKCkuc2V0TG9jYXRpb24oZSxuKX0sZS5wcm90b3R5cGUuY29weVBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fYXJnW3RdLmdldE5vZGVJdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dGhpcy5fZ3JhcGguYWRkTm9kZShuLmdldENvb3JkaW5hdGUoKSkuc2V0TGFiZWwodCxuLmdldExhYmVsKCkuZ2V0TG9jYXRpb24odCkpfX0sZS5wcm90b3R5cGUuZmluZFJlc3VsdEFyZWFFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fZ3JhcGguZ2V0RWRnZUVuZHMoKS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCksaT1yLmdldExhYmVsKCk7aS5pc0FyZWEoKSYmIXIuaXNJbnRlcmlvckFyZWFFZGdlKCkmJmUuaXNSZXN1bHRPZk9wKGkuZ2V0TG9jYXRpb24oMCxTaC5SSUdIVCksaS5nZXRMb2NhdGlvbigxLFNoLlJJR0hUKSx0KSYmci5zZXRJblJlc3VsdCghMCl9fSxlLnByb3RvdHlwZS5jb21wdXRlTGFiZWxzRnJvbURlcHRocz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9lZGdlTGlzdC5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldExhYmVsKCkscj1lLmdldERlcHRoKCk7aWYoIXIuaXNOdWxsKCkpe3Iubm9ybWFsaXplKCk7Zm9yKHZhciBpPTA7aTwyO2krKyluLmlzTnVsbChpKXx8IW4uaXNBcmVhKCl8fHIuaXNOdWxsKGkpfHwoMD09PXIuZ2V0RGVsdGEoaSk/bi50b0xpbmUoaSk6KHFsLmlzVHJ1ZSghci5pc051bGwoaSxTaC5MRUZUKSwiZGVwdGggb2YgTEVGVCBzaWRlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCIpLG4uc2V0TG9jYXRpb24oaSxTaC5MRUZULHIuZ2V0TG9jYXRpb24oaSxTaC5MRUZUKSkscWwuaXNUcnVlKCFyLmlzTnVsbChpLFNoLlJJR0hUKSwiZGVwdGggb2YgUklHSFQgc2lkZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQiKSxuLnNldExvY2F0aW9uKGksU2guUklHSFQsci5nZXRMb2NhdGlvbihpLFNoLlJJR0hUKSkpKX19fSxlLnByb3RvdHlwZS5jb21wdXRlTGFiZWxsaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyYXBoLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLmdldEVkZ2VzKCkuY29tcHV0ZUxhYmVsbGluZyh0aGlzLl9hcmcpfXRoaXMubWVyZ2VTeW1MYWJlbHMoKSx0aGlzLnVwZGF0ZU5vZGVMYWJlbGxpbmcoKX0sZS5wcm90b3R5cGUubGFiZWxJbmNvbXBsZXRlTm9kZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldExhYmVsKCk7ZS5pc0lzb2xhdGVkKCkmJihuLmlzTnVsbCgwKT90aGlzLmxhYmVsSW5jb21wbGV0ZU5vZGUoZSwwKTp0aGlzLmxhYmVsSW5jb21wbGV0ZU5vZGUoZSwxKSksZS5nZXRFZGdlcygpLnVwZGF0ZUxhYmVsbGluZyhuKX19LGUucHJvdG90eXBlLmlzQ292ZXJlZEJ5QT1mdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMuaXNDb3ZlcmVkKHQsdGhpcy5fcmVzdWx0UG9seUxpc3QpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShDZyk7TWcub3ZlcmxheU9wPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IE1nKHQsZSkuZ2V0UmVzdWx0R2VvbWV0cnkobil9LE1nLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe2lmKHQuaXNFbXB0eSgpfHxlLmlzRW1wdHkoKSlyZXR1cm4gTWcuY3JlYXRlRW1wdHlSZXN1bHQoTWcuSU5URVJTRUNUSU9OLHQsZSx0LmdldEZhY3RvcnkoKSk7aWYodC5pc0dlb21ldHJ5Q29sbGVjdGlvbigpKXt2YXIgbj1lO3JldHVybiBXZi5tYXAodCx7aW50ZXJmYWNlc186ZnVuY3Rpb24oKXtyZXR1cm5bUGcuTWFwT3BdfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaW50ZXJzZWN0aW9uKG4pfX0pfXJldHVybiB0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHQpLHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24oZSksdWcub3ZlcmxheU9wKHQsZSxNZy5JTlRFUlNFQ1RJT04pfSxNZy5zeW1EaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7aWYodC5pc0VtcHR5KCl8fGUuaXNFbXB0eSgpKXtpZih0LmlzRW1wdHkoKSYmZS5pc0VtcHR5KCkpcmV0dXJuIE1nLmNyZWF0ZUVtcHR5UmVzdWx0KE1nLlNZTURJRkZFUkVOQ0UsdCxlLHQuZ2V0RmFjdG9yeSgpKTtpZih0LmlzRW1wdHkoKSlyZXR1cm4gZS5jb3B5KCk7aWYoZS5pc0VtcHR5KCkpcmV0dXJuIHQuY29weSgpfXJldHVybiB0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHQpLHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24oZSksdWcub3ZlcmxheU9wKHQsZSxNZy5TWU1ESUZGRVJFTkNFKX0sTWcucmVzdWx0RGltZW5zaW9uPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmdldERpbWVuc2lvbigpLGk9bi5nZXREaW1lbnNpb24oKSxvPS0xO3N3aXRjaCh0KXtjYXNlIE1nLklOVEVSU0VDVElPTjpvPU1hdGgubWluKHIsaSk7YnJlYWs7Y2FzZSBNZy5VTklPTjpvPU1hdGgubWF4KHIsaSk7YnJlYWs7Y2FzZSBNZy5ESUZGRVJFTkNFOm89cjticmVhaztjYXNlIE1nLlNZTURJRkZFUkVOQ0U6bz1NYXRoLm1heChyLGkpfXJldHVybiBvfSxNZy5jcmVhdGVFbXB0eVJlc3VsdD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1udWxsO3N3aXRjaChNZy5yZXN1bHREaW1lbnNpb24odCxlLG4pKXtjYXNlLTE6aT1yLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihuZXcgQXJyYXkoMCkuZmlsbChudWxsKSk7YnJlYWs7Y2FzZSAwOmk9ci5jcmVhdGVQb2ludCgpO2JyZWFrO2Nhc2UgMTppPXIuY3JlYXRlTGluZVN0cmluZygpO2JyZWFrO2Nhc2UgMjppPXIuY3JlYXRlUG9seWdvbigpfXJldHVybiBpfSxNZy5kaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaXNFbXB0eSgpP01nLmNyZWF0ZUVtcHR5UmVzdWx0KE1nLkRJRkZFUkVOQ0UsdCxlLHQuZ2V0RmFjdG9yeSgpKTplLmlzRW1wdHkoKT90LmNvcHkoKToodC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbih0KSx0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKGUpLHVnLm92ZXJsYXlPcCh0LGUsTWcuRElGRkVSRU5DRSkpfSxNZy5pc1Jlc3VsdE9mT3A9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49dC5nZXRMb2NhdGlvbigwKSxyPXQuZ2V0TG9jYXRpb24oMSk7cmV0dXJuIE1nLmlzUmVzdWx0T2ZPcChuLHIsZSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXTtzd2l0Y2goaT09PXBsLkJPVU5EQVJZJiYoaT1wbC5JTlRFUklPUiksbz09PXBsLkJPVU5EQVJZJiYobz1wbC5JTlRFUklPUikscyl7Y2FzZSBNZy5JTlRFUlNFQ1RJT046cmV0dXJuIGk9PT1wbC5JTlRFUklPUiYmbz09PXBsLklOVEVSSU9SO2Nhc2UgTWcuVU5JT046cmV0dXJuIGk9PT1wbC5JTlRFUklPUnx8bz09PXBsLklOVEVSSU9SO2Nhc2UgTWcuRElGRkVSRU5DRTpyZXR1cm4gaT09PXBsLklOVEVSSU9SJiZvIT09cGwuSU5URVJJT1I7Y2FzZSBNZy5TWU1ESUZGRVJFTkNFOnJldHVybiBpPT09cGwuSU5URVJJT1ImJm8hPT1wbC5JTlRFUklPUnx8aSE9PXBsLklOVEVSSU9SJiZvPT09cGwuSU5URVJJT1J9cmV0dXJuITF9fSxNZy5JTlRFUlNFQ1RJT049MSxNZy5VTklPTj0yLE1nLkRJRkZFUkVOQ0U9MyxNZy5TWU1ESUZGRVJFTkNFPTQ7dmFyIExnPWZ1bmN0aW9uKCl7dGhpcy5fZz1udWxsLHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9bnVsbCx0aGlzLl9saW5ld29yaz1udWxsLHRoaXMuX3B0TG9jYXRvcj1uZXcgUGYsdGhpcy5fc2VnPW5ldyB2cDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZz10LHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9ZSx0aGlzLl9saW5ld29yaz10aGlzLmV4dHJhY3RMaW5ld29yayh0KX07TGcucHJvdG90eXBlLmlzV2l0aGluVG9sZXJhbmNlT2ZCb3VuZGFyeT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPTA7bjx0aGlzLl9saW5ld29yay5nZXROdW1HZW9tZXRyaWVzKCk7bisrKWZvcih2YXIgcj1lLl9saW5ld29yay5nZXRHZW9tZXRyeU4obikuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksaT0wO2k8ci5zaXplKCktMTtpKyspe2lmKHIuZ2V0Q29vcmRpbmF0ZShpLGUuX3NlZy5wMCksci5nZXRDb29yZGluYXRlKGkrMSxlLl9zZWcucDEpLGUuX3NlZy5kaXN0YW5jZSh0KTw9ZS5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSlyZXR1cm4hMH1yZXR1cm4hMX0sTGcucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzV2l0aGluVG9sZXJhbmNlT2ZCb3VuZGFyeSh0KT9wbC5CT1VOREFSWTp0aGlzLl9wdExvY2F0b3IubG9jYXRlKHQsdGhpcy5fZyl9LExnLnByb3RvdHlwZS5leHRyYWN0TGluZXdvcms9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IE9nO3QuYXBwbHkoZSk7dmFyIG49ZS5nZXRMaW5ld29yaygpLHI9X2gudG9MaW5lU3RyaW5nQXJyYXkobik7cmV0dXJuIHQuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyhyKX0sTGcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LExnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBMZ307dmFyIE9nPWZ1bmN0aW9uKCl7dGhpcy5fbGluZXdvcms9bnVsbCx0aGlzLl9saW5ld29yaz1uZXcgbGN9O09nLnByb3RvdHlwZS5nZXRMaW5ld29yaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9saW5ld29ya30sT2cucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgdGgpe3ZhciBlPXQ7dGhpcy5fbGluZXdvcmsuYWRkKGUuZ2V0RXh0ZXJpb3JSaW5nKCkpO2Zvcih2YXIgbj0wO248ZS5nZXROdW1JbnRlcmlvclJpbmcoKTtuKyspdGhpcy5fbGluZXdvcmsuYWRkKGUuZ2V0SW50ZXJpb3JSaW5nTihuKSl9fSxPZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bRGNdfSxPZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gT2d9O3ZhciBSZz1mdW5jdGlvbigpe3RoaXMuX2c9bnVsbCx0aGlzLl9kb0xlZnQ9ITAsdGhpcy5fZG9SaWdodD0hMDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZz10fTtSZy5wcm90b3R5cGUuZXh0cmFjdFBvaW50cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXQuZ2V0Q29vcmRpbmF0ZXMoKSxpPTA7aTxyLmxlbmd0aC0xO2krKyl0aGlzLmNvbXB1dGVPZmZzZXRQb2ludHMocltpXSxyW2krMV0sZSxuKX0sUmcucHJvdG90eXBlLnNldFNpZGVzVG9HZW5lcmF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2RvTGVmdD10LHRoaXMuX2RvUmlnaHQ9ZX0sUmcucHJvdG90eXBlLmdldFBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGxjLG49Q2YuZ2V0TGluZXModGhpcy5fZykuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3RoaXMuZXh0cmFjdFBvaW50cyhyLHQsZSl9cmV0dXJuIGV9LFJnLnByb3RvdHlwZS5jb21wdXRlT2Zmc2V0UG9pbnRzPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWUueC10Lngsbz1lLnktdC55LHM9TWF0aC5zcXJ0KGkqaStvKm8pLGE9bippL3MsdT1uKm8vcyxsPShlLngrdC54KS8yLGM9KGUueSt0LnkpLzI7aWYodGhpcy5fZG9MZWZ0KXt2YXIgaD1uZXcgdWwobC11LGMrYSk7ci5hZGQoaCl9aWYodGhpcy5fZG9SaWdodCl7dmFyIHA9bmV3IHVsKGwrdSxjLWEpO3IuYWRkKHApfX0sUmcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFJnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBSZ307dmFyIFRnPWZ1bmN0aW9uIHQoKXt0aGlzLl9nZW9tPW51bGwsdGhpcy5fbG9jRmluZGVyPW51bGwsdGhpcy5fbG9jYXRpb249bmV3IEFycmF5KDMpLmZpbGwobnVsbCksdGhpcy5faW52YWxpZExvY2F0aW9uPW51bGwsdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZT10LlRPTEVSQU5DRSx0aGlzLl90ZXN0Q29vcmRzPW5ldyBsYzt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZT10LmNvbXB1dGVCb3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKGUsbiksdGhpcy5fZ2VvbT1bZSxuLHJdLHRoaXMuX2xvY0ZpbmRlcj1bbmV3IExnKHRoaXMuX2dlb21bMF0sdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSksbmV3IExnKHRoaXMuX2dlb21bMV0sdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSksbmV3IExnKHRoaXMuX2dlb21bMl0sdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSldfSxBZz17VE9MRVJBTkNFOntjb25maWd1cmFibGU6ITB9fTtUZy5wcm90b3R5cGUucmVwb3J0UmVzdWx0PWZ1bmN0aW9uKHQsZSxuKXtQbC5vdXQucHJpbnRsbigiT3ZlcmxheSByZXN1bHQgaW52YWxpZCAtIEE6IitwbC50b0xvY2F0aW9uU3ltYm9sKGVbMF0pKyIgQjoiK3BsLnRvTG9jYXRpb25TeW1ib2woZVsxXSkrIiBleHBlY3RlZDoiKyhuPyJpIjoiZSIpKyIgYWN0dWFsOiIrcGwudG9Mb2NhdGlvblN5bWJvbChlWzJdKSl9LFRnLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKHQpe3RoaXMuYWRkVGVzdFB0cyh0aGlzLl9nZW9tWzBdKSx0aGlzLmFkZFRlc3RQdHModGhpcy5fZ2VvbVsxXSk7dmFyIGU9dGhpcy5jaGVja1ZhbGlkKHQpO3JldHVybiBlfSxUZy5wcm90b3R5cGUuY2hlY2tWYWxpZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj0wO248dGhpcy5fdGVzdENvb3Jkcy5zaXplKCk7bisrKXt2YXIgcj10Ll90ZXN0Q29vcmRzLmdldChuKTtpZighdC5jaGVja1ZhbGlkKGUscikpcmV0dXJuIHQuX2ludmFsaWRMb2NhdGlvbj1yLCExfXJldHVybiEwfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuX2xvY2F0aW9uWzBdPXRoaXMuX2xvY0ZpbmRlclswXS5nZXRMb2NhdGlvbihvKSx0aGlzLl9sb2NhdGlvblsxXT10aGlzLl9sb2NGaW5kZXJbMV0uZ2V0TG9jYXRpb24obyksdGhpcy5fbG9jYXRpb25bMl09dGhpcy5fbG9jRmluZGVyWzJdLmdldExvY2F0aW9uKG8pLCEhVGcuaGFzTG9jYXRpb24odGhpcy5fbG9jYXRpb24scGwuQk9VTkRBUlkpfHx0aGlzLmlzVmFsaWRSZXN1bHQoaSx0aGlzLl9sb2NhdGlvbil9fSxUZy5wcm90b3R5cGUuYWRkVGVzdFB0cz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgUmcodCk7dGhpcy5fdGVzdENvb3Jkcy5hZGRBbGwoZS5nZXRQb2ludHMoNSp0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKSl9LFRnLnByb3RvdHlwZS5pc1ZhbGlkUmVzdWx0PWZ1bmN0aW9uKHQsZSl7dmFyIG49TWcuaXNSZXN1bHRPZk9wKGVbMF0sZVsxXSx0KSxyPSEobl5lWzJdPT09cGwuSU5URVJJT1IpO3JldHVybiByfHx0aGlzLnJlcG9ydFJlc3VsdCh0LGUsbikscn0sVGcucHJvdG90eXBlLmdldEludmFsaWRMb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnZhbGlkTG9jYXRpb259LFRnLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxUZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVGd9LFRnLmhhc0xvY2F0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjwzO24rKylpZih0W25dPT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sVGcuY29tcHV0ZUJvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5taW4oJGYuY29tcHV0ZVNpemVCYXNlZFNuYXBUb2xlcmFuY2UodCksJGYuY29tcHV0ZVNpemVCYXNlZFNuYXBUb2xlcmFuY2UoZSkpfSxUZy5pc1ZhbGlkPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBuZXcgVGcodCxlLHIpLmlzVmFsaWQobil9LEFnLlRPTEVSQU5DRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtNn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVGcsQWcpO3ZhciBEZz1mdW5jdGlvbiB0KGUpe3RoaXMuX2dlb21GYWN0b3J5PW51bGwsdGhpcy5fc2tpcEVtcHR5PSExLHRoaXMuX2lucHV0R2VvbXM9bnVsbCx0aGlzLl9nZW9tRmFjdG9yeT10LmV4dHJhY3RGYWN0b3J5KGUpLHRoaXMuX2lucHV0R2VvbXM9ZX07RGcucHJvdG90eXBlLmV4dHJhY3RFbGVtZW50cz1mdW5jdGlvbih0LGUpe2lmKG51bGw9PT10KXJldHVybiBudWxsO2Zvcih2YXIgbj0wO248dC5nZXROdW1HZW9tZXRyaWVzKCk7bisrKXt2YXIgcj10LmdldEdlb21ldHJ5TihuKTt0aGlzLl9za2lwRW1wdHkmJnIuaXNFbXB0eSgpfHxlLmFkZChyKX19LERnLnByb3RvdHlwZS5jb21iaW5lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBsYyxlPXRoaXMuX2lucHV0R2VvbXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3RoaXMuZXh0cmFjdEVsZW1lbnRzKG4sdCl9cmV0dXJuIDA9PT10LnNpemUoKT9udWxsIT09dGhpcy5fZ2VvbUZhY3Rvcnk/dGhpcy5fZ2VvbUZhY3RvcnkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKG51bGwpOm51bGw6dGhpcy5fZ2VvbUZhY3RvcnkuYnVpbGRHZW9tZXRyeSh0KX0sRGcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LERnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBEZ30sRGcuY29tYmluZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgRGcodCk7cmV0dXJuIGUuY29tYmluZSgpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1uZXcgRGcoRGcuY3JlYXRlTGlzdChuLHIpKTtyZXR1cm4gaS5jb21iaW5lKCl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXSx1PW5ldyBEZyhEZy5jcmVhdGVMaXN0KG8scyxhKSk7cmV0dXJuIHUuY29tYmluZSgpfX0sRGcuZXh0cmFjdEZhY3Rvcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNFbXB0eSgpP251bGw6dC5pdGVyYXRvcigpLm5leHQoKS5nZXRGYWN0b3J5KCl9LERnLmNyZWF0ZUxpc3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IGxjO3JldHVybiBuLmFkZCh0KSxuLmFkZChlKSxufWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl0scz1uZXcgbGM7cmV0dXJuIHMuYWRkKHIpLHMuYWRkKGkpLHMuYWRkKG8pLHN9fTt2YXIgRmc9ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dFBvbHlzPW51bGwsdGhpcy5fZ2VvbUZhY3Rvcnk9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5faW5wdXRQb2x5cz10LG51bGw9PT10aGlzLl9pbnB1dFBvbHlzJiYodGhpcy5faW5wdXRQb2x5cz1uZXcgbGMpfSxrZz17U1RSVFJFRV9OT0RFX0NBUEFDSVRZOntjb25maWd1cmFibGU6ITB9fTtGZy5wcm90b3R5cGUucmVkdWNlVG9HZW9tZXRyaWVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgbGMsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKSxpPW51bGw7Z2wocixhYyk/aT10aGlzLnVuaW9uVHJlZShyKTpyIGluc3RhbmNlb2YgV2wmJihpPXIpLGUuYWRkKGkpfXJldHVybiBlfSxGZy5wcm90b3R5cGUuZXh0cmFjdEJ5RW52ZWxvcGU9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uZXcgbGMsaT0wO2k8ZS5nZXROdW1HZW9tZXRyaWVzKCk7aSsrKXt2YXIgbz1lLmdldEdlb21ldHJ5TihpKTtvLmdldEVudmVsb3BlSW50ZXJuYWwoKS5pbnRlcnNlY3RzKHQpP3IuYWRkKG8pOm4uYWRkKG8pfXJldHVybiB0aGlzLl9nZW9tRmFjdG9yeS5idWlsZEdlb21ldHJ5KHIpfSxGZy5wcm90b3R5cGUudW5pb25PcHRpbWl6ZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldEVudmVsb3BlSW50ZXJuYWwoKSxyPWUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpO2lmKCFuLmludGVyc2VjdHMocikpcmV0dXJuIERnLmNvbWJpbmUodCxlKTtpZih0LmdldE51bUdlb21ldHJpZXMoKTw9MSYmZS5nZXROdW1HZW9tZXRyaWVzKCk8PTEpcmV0dXJuIHRoaXMudW5pb25BY3R1YWwodCxlKTt2YXIgaT1uLmludGVyc2VjdGlvbihyKTtyZXR1cm4gdGhpcy51bmlvblVzaW5nRW52ZWxvcGVJbnRlcnNlY3Rpb24odCxlLGkpfSxGZy5wcm90b3R5cGUudW5pb249ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5faW5wdXRQb2x5cyl0aHJvdyBuZXcgRXJyb3IoInVuaW9uKCkgbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgdHdpY2UiKTtpZih0aGlzLl9pbnB1dFBvbHlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt0aGlzLl9nZW9tRmFjdG9yeT10aGlzLl9pbnB1dFBvbHlzLml0ZXJhdG9yKCkubmV4dCgpLmdldEZhY3RvcnkoKTtmb3IodmFyIHQ9bmV3IHVwKEZnLlNUUlRSRUVfTk9ERV9DQVBBQ0lUWSksZT10aGlzLl9pbnB1dFBvbHlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0Lmluc2VydChuLmdldEVudmVsb3BlSW50ZXJuYWwoKSxuKX10aGlzLl9pbnB1dFBvbHlzPW51bGw7dmFyIHI9dC5pdGVtc1RyZWUoKTtyZXR1cm4gdGhpcy51bmlvblRyZWUocil9LEZnLnByb3RvdHlwZS5iaW5hcnlVbmlvbj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuYmluYXJ5VW5pb24odCwwLHQuc2l6ZSgpKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO2lmKHItbjw9MSl7dmFyIGk9RmcuZ2V0R2VvbWV0cnkoZSxuKTtyZXR1cm4gdGhpcy51bmlvblNhZmUoaSxudWxsKX1pZihyLW49PTIpcmV0dXJuIHRoaXMudW5pb25TYWZlKEZnLmdldEdlb21ldHJ5KGUsbiksRmcuZ2V0R2VvbWV0cnkoZSxuKzEpKTt2YXIgbz1NYXRoLnRydW5jKChyK24pLzIpLHM9dGhpcy5iaW5hcnlVbmlvbihlLG4sbyksYT10aGlzLmJpbmFyeVVuaW9uKGUsbyxyKTtyZXR1cm4gdGhpcy51bmlvblNhZmUocyxhKX19LEZnLnByb3RvdHlwZS5yZXBlYXRlZFVuaW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ZT1udWxsPT09ZT9yLmNvcHkoKTplLnVuaW9uKHIpfXJldHVybiBlfSxGZy5wcm90b3R5cGUudW5pb25TYWZlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PT10JiZudWxsPT09ZT9udWxsOm51bGw9PT10P2UuY29weSgpOm51bGw9PT1lP3QuY29weSgpOnRoaXMudW5pb25PcHRpbWl6ZWQodCxlKX0sRmcucHJvdG90eXBlLnVuaW9uQWN0dWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEZnLnJlc3RyaWN0VG9Qb2x5Z29ucyh0LnVuaW9uKGUpKX0sRmcucHJvdG90eXBlLnVuaW9uVHJlZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnJlZHVjZVRvR2VvbWV0cmllcyh0KTtyZXR1cm4gdGhpcy5iaW5hcnlVbmlvbihlKX0sRmcucHJvdG90eXBlLnVuaW9uVXNpbmdFbnZlbG9wZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IGxjLGk9dGhpcy5leHRyYWN0QnlFbnZlbG9wZShuLHQsciksbz10aGlzLmV4dHJhY3RCeUVudmVsb3BlKG4sZSxyKSxzPXRoaXMudW5pb25BY3R1YWwoaSxvKTtyZXR1cm4gci5hZGQocyksRGcuY29tYmluZShyKX0sRmcucHJvdG90eXBlLmJ1ZmZlclVuaW9uPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXQuZ2V0KDApLmdldEZhY3RvcnkoKSxuPWUuYnVpbGRHZW9tZXRyeSh0KSxyPW4uYnVmZmVyKDApO3JldHVybiByfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1pLmdldEZhY3RvcnkoKSxhPXMuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKFtpLG9dKSx1PWEuYnVmZmVyKDApO3JldHVybiB1fX0sRmcucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEZnLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBGZ30sRmcucmVzdHJpY3RUb1BvbHlnb25zPWZ1bmN0aW9uKHQpe2lmKGdsKHQsJGMpKXJldHVybiB0O3ZhciBlPVNmLmdldFBvbHlnb25zKHQpO3JldHVybiAxPT09ZS5zaXplKCk/ZS5nZXQoMCk6dC5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlQb2x5Z29uKF9oLnRvUG9seWdvbkFycmF5KGUpKX0sRmcuZ2V0R2VvbWV0cnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT49dC5zaXplKCk/bnVsbDp0LmdldChlKX0sRmcudW5pb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGZyh0KS51bmlvbigpfSxrZy5TVFJUUkVFX05PREVfQ0FQQUNJVFkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDR9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZnLGtnKTt2YXIgR2c9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIHFnKCl7cmV0dXJuIG5ldyBCZ31mdW5jdGlvbiBCZygpe3RoaXMucmVzZXQoKX1HZy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sR2cucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEdnfSxHZy51bmlvbj1mdW5jdGlvbih0LGUpe2lmKHQuaXNFbXB0eSgpfHxlLmlzRW1wdHkoKSl7aWYodC5pc0VtcHR5KCkmJmUuaXNFbXB0eSgpKXJldHVybiBNZy5jcmVhdGVFbXB0eVJlc3VsdChNZy5VTklPTix0LGUsdC5nZXRGYWN0b3J5KCkpO2lmKHQuaXNFbXB0eSgpKXJldHVybiBlLmNvcHkoKTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gdC5jb3B5KCl9cmV0dXJuIHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24odCksdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbihlKSx1Zy5vdmVybGF5T3AodCxlLE1nLlVOSU9OKX0sQmcucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpCZyxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sYWRkOmZ1bmN0aW9uKHQpe2pnKHpnLHQsdGhpcy50KSxqZyh0aGlzLHpnLnMsdGhpcy5zKSx0aGlzLnM/dGhpcy50Kz16Zy50OnRoaXMucz16Zy50fSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciB6Zz1uZXcgQmc7ZnVuY3Rpb24gamcodCxlLG4pe3ZhciByPXQucz1lK24saT1yLWUsbz1yLWk7dC50PWUtbysobi1pKX12YXIgVWc9MWUtNixWZz1NYXRoLlBJLFhnPVZnLzIsWWc9VmcvNCxIZz0yKlZnLFdnPTE4MC9WZyxKZz1WZy8xODAsWmc9TWF0aC5hYnMsS2c9TWF0aC5hdGFuLFFnPU1hdGguYXRhbjIsJGc9TWF0aC5jb3MsdGQ9TWF0aC5zaW4sZWQ9TWF0aC5zcXJ0O2Z1bmN0aW9uIG5kKHQpe3JldHVybiB0PjE/MDp0PC0xP1ZnOk1hdGguYWNvcyh0KX1mdW5jdGlvbiByZCh0KXtyZXR1cm4gdD4xP1hnOnQ8LTE/LVhnOk1hdGguYXNpbih0KX1mdW5jdGlvbiBpZCgpe31mdW5jdGlvbiBvZCh0LGUpe3QmJmFkLmhhc093blByb3BlcnR5KHQudHlwZSkmJmFkW3QudHlwZV0odCxlKX12YXIgc2Q9e0ZlYXR1cmU6ZnVuY3Rpb24odCxlKXtvZCh0Lmdlb21ldHJ5LGUpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmZlYXR1cmVzLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspb2QobltyXS5nZW9tZXRyeSxlKX19LGFkPXtTcGhlcmU6ZnVuY3Rpb24odCxlKXtlLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LGUpe3Q9dC5jb29yZGluYXRlcyxlLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspdD1uW3JdLGUucG9pbnQodFswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7dWQodC5jb29yZGluYXRlcyxlLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5jb29yZGluYXRlcyxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KXVkKG5bcl0sZSwwKX0sUG9seWdvbjpmdW5jdGlvbih0LGUpe2xkKHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspbGQobltyXSxlKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2VvbWV0cmllcyxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KW9kKG5bcl0sZSl9fTtmdW5jdGlvbiB1ZCh0LGUsbil7dmFyIHIsaT0tMSxvPXQubGVuZ3RoLW47Zm9yKGUubGluZVN0YXJ0KCk7KytpPG87KXI9dFtpXSxlLnBvaW50KHJbMF0sclsxXSxyWzJdKTtlLmxpbmVFbmQoKX1mdW5jdGlvbiBsZCh0LGUpe3ZhciBuPS0xLHI9dC5sZW5ndGg7Zm9yKGUucG9seWdvblN0YXJ0KCk7KytuPHI7KXVkKHRbbl0sZSwxKTtlLnBvbHlnb25FbmQoKX1xZygpLHFnKCk7ZnVuY3Rpb24gY2QodCl7cmV0dXJuW1FnKHRbMV0sdFswXSkscmQodFsyXSldfWZ1bmN0aW9uIGhkKHQpe3ZhciBlPXRbMF0sbj10WzFdLHI9JGcobik7cmV0dXJuW3IqJGcoZSkscip0ZChlKSx0ZChuKV19ZnVuY3Rpb24gcGQodCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXSt0WzJdKmVbMl19ZnVuY3Rpb24gZmQodCxlKXtyZXR1cm5bdFsxXSplWzJdLXRbMl0qZVsxXSx0WzJdKmVbMF0tdFswXSplWzJdLHRbMF0qZVsxXS10WzFdKmVbMF1dfWZ1bmN0aW9uIGdkKHQsZSl7dFswXSs9ZVswXSx0WzFdKz1lWzFdLHRbMl0rPWVbMl19ZnVuY3Rpb24gZGQodCxlKXtyZXR1cm5bdFswXSplLHRbMV0qZSx0WzJdKmVdfWZ1bmN0aW9uIHlkKHQpe3ZhciBlPWVkKHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1lLHRbMV0vPWUsdFsyXS89ZX1xZygpO2Z1bmN0aW9uIHZkKHQsZSl7ZnVuY3Rpb24gbihuLHIpe3JldHVybiBuPXQobixyKSxlKG5bMF0sblsxXSl9cmV0dXJuIHQuaW52ZXJ0JiZlLmludmVydCYmKG4uaW52ZXJ0PWZ1bmN0aW9uKG4scil7cmV0dXJuKG49ZS5pbnZlcnQobixyKSkmJnQuaW52ZXJ0KG5bMF0sblsxXSl9KSxufWZ1bmN0aW9uIF9kKHQsZSl7cmV0dXJuW3Q+Vmc/dC1IZzp0PC1WZz90K0hnOnQsZV19ZnVuY3Rpb24gbWQodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuWyhlKz10KT5WZz9lLUhnOmU8LVZnP2UrSGc6ZSxuXX19ZnVuY3Rpb24geGQodCl7dmFyIGU9bWQodCk7cmV0dXJuIGUuaW52ZXJ0PW1kKC10KSxlfWZ1bmN0aW9uIEVkKHQsZSl7dmFyIG49JGcodCkscj10ZCh0KSxpPSRnKGUpLG89dGQoZSk7ZnVuY3Rpb24gcyh0LGUpe3ZhciBzPSRnKGUpLGE9JGcodCkqcyx1PXRkKHQpKnMsbD10ZChlKSxjPWwqbithKnI7cmV0dXJuW1FnKHUqaS1jKm8sYSpuLWwqcikscmQoYyppK3UqbyldfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0LGUpe3ZhciBzPSRnKGUpLGE9JGcodCkqcyx1PXRkKHQpKnMsbD10ZChlKSxjPWwqaS11Km87cmV0dXJuW1FnKHUqaStsKm8sYSpuK2MqcikscmQoYypuLWEqcildfSxzfWZ1bmN0aW9uIGJkKHQsZSl7KGU9aGQoZSkpWzBdLT10LHlkKGUpO3ZhciBuPW5kKC1lWzFdKTtyZXR1cm4oKC1lWzJdPDA/LW46bikrSGctVWcpJUhnfWZ1bmN0aW9uIHdkKCl7dmFyIHQsZT1bXTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24oZSxuKXt0LnB1c2goW2Usbl0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtlLnB1c2godD1bXSl9LGxpbmVFbmQ6aWQscmVqb2luOmZ1bmN0aW9uKCl7ZS5sZW5ndGg+MSYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgbj1lO3JldHVybiBlPVtdLHQ9bnVsbCxufX19ZnVuY3Rpb24gSWQodCxlKXtyZXR1cm4gWmcodFswXS1lWzBdKTxVZyYmWmcodFsxXS1lWzFdKTxVZ31mdW5jdGlvbiBOZCh0LGUsbixyKXt0aGlzLng9dCx0aGlzLno9ZSx0aGlzLm89bix0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIFNkKHQsZSxuLHIsaSl7dmFyIG8scyxhPVtdLHU9W107aWYodC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighKChlPXQubGVuZ3RoLTEpPD0wKSl7dmFyIGUsbixyPXRbMF0scz10W2VdO2lmKElkKHIscykpe2ZvcihpLmxpbmVTdGFydCgpLG89MDtvPGU7KytvKWkucG9pbnQoKHI9dFtvXSlbMF0sclsxXSk7aS5saW5lRW5kKCl9ZWxzZSBhLnB1c2gobj1uZXcgTmQocix0LG51bGwsITApKSx1LnB1c2gobi5vPW5ldyBOZChyLG51bGwsbiwhMSkpLGEucHVzaChuPW5ldyBOZChzLHQsbnVsbCwhMSkpLHUucHVzaChuLm89bmV3IE5kKHMsbnVsbCxuLCEwKSl9fSkpLGEubGVuZ3RoKXtmb3IodS5zb3J0KGUpLENkKGEpLENkKHUpLG89MCxzPXUubGVuZ3RoO288czsrK28pdVtvXS5lPW49IW47Zm9yKHZhciBsLGMsaD1hWzBdOzspe2Zvcih2YXIgcD1oLGY9ITA7cC52OylpZigocD1wLm4pPT09aClyZXR1cm47bD1wLnosaS5saW5lU3RhcnQoKTtkb3tpZihwLnY9cC5vLnY9ITAscC5lKXtpZihmKWZvcihvPTAscz1sLmxlbmd0aDtvPHM7KytvKWkucG9pbnQoKGM9bFtvXSlbMF0sY1sxXSk7ZWxzZSByKHAueCxwLm4ueCwxLGkpO3A9cC5ufWVsc2V7aWYoZilmb3IobD1wLnAueixvPWwubGVuZ3RoLTE7bz49MDstLW8paS5wb2ludCgoYz1sW29dKVswXSxjWzFdKTtlbHNlIHIocC54LHAucC54LC0xLGkpO3A9cC5wfWw9KHA9cC5vKS56LGY9IWZ9d2hpbGUoIXAudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBDZCh0KXtpZihlPXQubGVuZ3RoKXtmb3IodmFyIGUsbixyPTAsaT10WzBdOysrcjxlOylpLm49bj10W3JdLG4ucD1pLGk9bjtpLm49bj10WzBdLG4ucD1pfX1mdW5jdGlvbiBQZCh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1fZC5pbnZlcnQ9X2Q7dmFyIE1kLExkOzE9PT0oTWQ9UGQpLmxlbmd0aCYmKExkPU1kLE1kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFBkKExkKHQpLGUpfSk7ZnVuY3Rpb24gT2QodCl7Zm9yKHZhciBlLG4scixpPXQubGVuZ3RoLG89LTEscz0wOysrbzxpOylzKz10W29dLmxlbmd0aDtmb3Iobj1uZXcgQXJyYXkocyk7LS1pPj0wOylmb3IoZT0ocj10W2ldKS5sZW5ndGg7LS1lPj0wOyluWy0tc109cltlXTtyZXR1cm4gbn12YXIgUmQ9MWU5LFRkPS1SZDtmdW5jdGlvbiBBZCh0LGUsbixyKXtmdW5jdGlvbiBpKGksbyl7cmV0dXJuIHQ8PWkmJmk8PW4mJmU8PW8mJm88PXJ9ZnVuY3Rpb24gbyhpLG8sYSxsKXt2YXIgYz0wLGg9MDtpZihudWxsPT1pfHwoYz1zKGksYSkpIT09KGg9cyhvLGEpKXx8dShpLG8pPDBeYT4wKWRve2wucG9pbnQoMD09PWN8fDM9PT1jP3Q6bixjPjE/cjplKX13aGlsZSgoYz0oYythKzQpJTQpIT09aCk7ZWxzZSBsLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gcyhyLGkpe3JldHVybiBaZyhyWzBdLXQpPFVnP2k+MD8wOjM6WmcoclswXS1uKTxVZz9pPjA/MjoxOlpnKHJbMV0tZSk8VWc/aT4wPzE6MDppPjA/MzoyfWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gdSh0LngsZS54KX1mdW5jdGlvbiB1KHQsZSl7dmFyIG49cyh0LDEpLHI9cyhlLDEpO3JldHVybiBuIT09cj9uLXI6MD09PW4/ZVsxXS10WzFdOjE9PT1uP3RbMF0tZVswXToyPT09bj90WzFdLWVbMV06ZVswXS10WzBdfXJldHVybiBmdW5jdGlvbihzKXt2YXIgdSxsLGMsaCxwLGYsZyxkLHksdixfLG09cyx4PXdkKCksRT17cG9pbnQ6YixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtFLnBvaW50PXcsbCYmbC5wdXNoKGM9W10pO3Y9ITAseT0hMSxnPWQ9TmFOfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dSYmKHcoaCxwKSxmJiZ5JiZ4LnJlam9pbigpLHUucHVzaCh4LnJlc3VsdCgpKSk7RS5wb2ludD1iLHkmJm0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXttPXgsdT1bXSxsPVtdLF89ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe2Zvcih2YXIgZT0wLG49MCxpPWwubGVuZ3RoO248aTsrK24pZm9yKHZhciBvLHMsYT1sW25dLHU9MSxjPWEubGVuZ3RoLGg9YVswXSxwPWhbMF0sZj1oWzFdO3U8YzsrK3Upbz1wLHM9ZixwPShoPWFbdV0pWzBdLGY9aFsxXSxzPD1yP2Y+ciYmKHAtbykqKHItcyk+KGYtcykqKHQtbykmJisrZTpmPD1yJiYocC1vKSooci1zKTwoZi1zKSoodC1vKSYmLS1lO3JldHVybiBlfSgpLG49XyYmZSxpPSh1PU9kKHUpKS5sZW5ndGg7KG58fGkpJiYocy5wb2x5Z29uU3RhcnQoKSxuJiYocy5saW5lU3RhcnQoKSxvKG51bGwsbnVsbCwxLHMpLHMubGluZUVuZCgpKSxpJiZTZCh1LGEsZSxvLHMpLHMucG9seWdvbkVuZCgpKTttPXMsdT1sPWM9bnVsbH19O2Z1bmN0aW9uIGIodCxlKXtpKHQsZSkmJm0ucG9pbnQodCxlKX1mdW5jdGlvbiB3KG8scyl7dmFyIGE9aShvLHMpO2lmKGwmJmMucHVzaChbbyxzXSksdiloPW8scD1zLGY9YSx2PSExLGEmJihtLmxpbmVTdGFydCgpLG0ucG9pbnQobyxzKSk7ZWxzZSBpZihhJiZ5KW0ucG9pbnQobyxzKTtlbHNle3ZhciB1PVtnPU1hdGgubWF4KFRkLE1hdGgubWluKFJkLGcpKSxkPU1hdGgubWF4KFRkLE1hdGgubWluKFJkLGQpKV0seD1bbz1NYXRoLm1heChUZCxNYXRoLm1pbihSZCxvKSkscz1NYXRoLm1heChUZCxNYXRoLm1pbihSZCxzKSldOyFmdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIHMsYT10WzBdLHU9dFsxXSxsPTAsYz0xLGg9ZVswXS1hLHA9ZVsxXS11O2lmKHM9bi1hLGh8fCEocz4wKSl7aWYocy89aCxoPDApe2lmKHM8bClyZXR1cm47czxjJiYoYz1zKX1lbHNlIGlmKGg+MCl7aWYocz5jKXJldHVybjtzPmwmJihsPXMpfWlmKHM9aS1hLGh8fCEoczwwKSl7aWYocy89aCxoPDApe2lmKHM+YylyZXR1cm47cz5sJiYobD1zKX1lbHNlIGlmKGg+MCl7aWYoczxsKXJldHVybjtzPGMmJihjPXMpfWlmKHM9ci11LHB8fCEocz4wKSl7aWYocy89cCxwPDApe2lmKHM8bClyZXR1cm47czxjJiYoYz1zKX1lbHNlIGlmKHA+MCl7aWYocz5jKXJldHVybjtzPmwmJihsPXMpfWlmKHM9by11LHB8fCEoczwwKSl7aWYocy89cCxwPDApe2lmKHM+YylyZXR1cm47cz5sJiYobD1zKX1lbHNlIGlmKHA+MCl7aWYoczxsKXJldHVybjtzPGMmJihjPXMpfXJldHVybiBsPjAmJih0WzBdPWErbCpoLHRbMV09dStsKnApLGM8MSYmKGVbMF09YStjKmgsZVsxXT11K2MqcCksITB9fX19fSh1LHgsdCxlLG4scik/YSYmKG0ubGluZVN0YXJ0KCksbS5wb2ludChvLHMpLF89ITEpOih5fHwobS5saW5lU3RhcnQoKSxtLnBvaW50KHVbMF0sdVsxXSkpLG0ucG9pbnQoeFswXSx4WzFdKSxhfHxtLmxpbmVFbmQoKSxfPSExKX1nPW8sZD1zLHk9YX1yZXR1cm4gRX19dmFyIERkPXFnKCk7cWcoKTtmdW5jdGlvbiBGZCh0KXtyZXR1cm4gdH1xZygpLHFnKCk7dmFyIGtkPTEvMCxHZD1rZCxxZD0ta2QsQmQ9cWQsemQ9e3BvaW50OmZ1bmN0aW9uKHQsZSl7dDxrZCYmKGtkPXQpO3Q+cWQmJihxZD10KTtlPEdkJiYoR2Q9ZSk7ZT5CZCYmKEJkPWUpfSxsaW5lU3RhcnQ6aWQsbGluZUVuZDppZCxwb2x5Z29uU3RhcnQ6aWQscG9seWdvbkVuZDppZCxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1bW2tkLEdkXSxbcWQsQmRdXTtyZXR1cm4gcWQ9QmQ9LShHZD1rZD0xLzApLHR9fTtxZygpO2Z1bmN0aW9uIGpkKHQsZSxuLHIpe3JldHVybiBmdW5jdGlvbihpLG8pe3ZhciBzLGEsdSxsPWUobyksYz1pLmludmVydChyWzBdLHJbMV0pLGg9d2QoKSxwPWUoaCksZj0hMSxnPXtwb2ludDpkLGxpbmVTdGFydDp2LGxpbmVFbmQ6Xyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtnLnBvaW50PW0sZy5saW5lU3RhcnQ9eCxnLmxpbmVFbmQ9RSxhPVtdLHM9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtnLnBvaW50PWQsZy5saW5lU3RhcnQ9dixnLmxpbmVFbmQ9XyxhPU9kKGEpO3ZhciB0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZVswXSxyPWVbMV0saT1bdGQobiksLSRnKG4pLDBdLG89MCxzPTA7RGQucmVzZXQoKTtmb3IodmFyIGE9MCx1PXQubGVuZ3RoO2E8dTsrK2EpaWYoYz0obD10W2FdKS5sZW5ndGgpZm9yKHZhciBsLGMsaD1sW2MtMV0scD1oWzBdLGY9aFsxXS8yK1lnLGc9dGQoZiksZD0kZyhmKSx5PTA7eTxjOysreSxwPV8sZz14LGQ9RSxoPXYpe3ZhciB2PWxbeV0sXz12WzBdLG09dlsxXS8yK1lnLHg9dGQobSksRT0kZyhtKSxiPV8tcCx3PWI+PTA/MTotMSxJPXcqYixOPUk+VmcsUz1nKng7aWYoRGQuYWRkKFFnKFMqdyp0ZChJKSxkKkUrUyokZyhJKSkpLG8rPU4/Yit3KkhnOmIsTl5wPj1uXl8+PW4pe3ZhciBDPWZkKGhkKGgpLGhkKHYpKTt5ZChDKTt2YXIgUD1mZChpLEMpO3lkKFApO3ZhciBNPShOXmI+PTA/LTE6MSkqcmQoUFsyXSk7KHI+TXx8cj09PU0mJihDWzBdfHxDWzFdKSkmJihzKz1OXmI+PTA/MTotMSl9fXJldHVybihvPC0xZS02fHxvPFVnJiZEZDwtMWUtNileMSZzfShzLGMpO2EubGVuZ3RoPyhmfHwoby5wb2x5Z29uU3RhcnQoKSxmPSEwKSxTZChhLFZkLHQsbixvKSk6dCYmKGZ8fChvLnBvbHlnb25TdGFydCgpLGY9ITApLG8ubGluZVN0YXJ0KCksbihudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSksZiYmKG8ucG9seWdvbkVuZCgpLGY9ITEpLGE9cz1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtvLnBvbHlnb25TdGFydCgpLG8ubGluZVN0YXJ0KCksbihudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSxvLnBvbHlnb25FbmQoKX19O2Z1bmN0aW9uIGQoZSxuKXt2YXIgcj1pKGUsbik7dChlPXJbMF0sbj1yWzFdKSYmby5wb2ludChlLG4pfWZ1bmN0aW9uIHkodCxlKXt2YXIgbj1pKHQsZSk7bC5wb2ludChuWzBdLG5bMV0pfWZ1bmN0aW9uIHYoKXtnLnBvaW50PXksbC5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKCl7Zy5wb2ludD1kLGwubGluZUVuZCgpfWZ1bmN0aW9uIG0odCxlKXt1LnB1c2goW3QsZV0pO3ZhciBuPWkodCxlKTtwLnBvaW50KG5bMF0sblsxXSl9ZnVuY3Rpb24geCgpe3AubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiBFKCl7bSh1WzBdWzBdLHVbMF1bMV0pLHAubGluZUVuZCgpO3ZhciB0LGUsbixyLGk9cC5jbGVhbigpLGw9aC5yZXN1bHQoKSxjPWwubGVuZ3RoO2lmKHUucG9wKCkscy5wdXNoKHUpLHU9bnVsbCxjKWlmKDEmaSl7aWYoKGU9KG49bFswXSkubGVuZ3RoLTEpPjApe2ZvcihmfHwoby5wb2x5Z29uU3RhcnQoKSxmPSEwKSxvLmxpbmVTdGFydCgpLHQ9MDt0PGU7Kyt0KW8ucG9pbnQoKHI9blt0XSlbMF0sclsxXSk7by5saW5lRW5kKCl9fWVsc2UgYz4xJiYyJmkmJmwucHVzaChsLnBvcCgpLmNvbmNhdChsLnNoaWZ0KCkpKSxhLnB1c2gobC5maWx0ZXIoVWQpKX1yZXR1cm4gZ319ZnVuY3Rpb24gVWQodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gVmQodCxlKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tWGctVWc6WGctdFsxXSktKChlPWUueClbMF08MD9lWzFdLVhnLVVnOlhnLWVbMV0pfXZhciBYZD1qZCgoZnVuY3Rpb24oKXtyZXR1cm4hMH0pLChmdW5jdGlvbih0KXt2YXIgZSxuPU5hTixyPU5hTixpPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxlPTF9LHBvaW50OmZ1bmN0aW9uKG8scyl7dmFyIGE9bz4wP1ZnOi1WZyx1PVpnKG8tbik7WmcodS1WZyk8VWc/KHQucG9pbnQobixyPShyK3MpLzI+MD9YZzotWGcpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQoYSxyKSx0LnBvaW50KG8sciksZT0wKTppIT09YSYmdT49VmcmJihaZyhuLWkpPFVnJiYobi09aSpVZyksWmcoby1hKTxVZyYmKG8tPWEqVWcpLHI9ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzPXRkKHQtbik7cmV0dXJuIFpnKHMpPlVnP0tnKCh0ZChlKSoobz0kZyhyKSkqdGQobiktdGQocikqKGk9JGcoZSkpKnRkKHQpKS8oaSpvKnMpKTooZStyKS8yfShuLHIsbyxzKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KGEsciksZT0wKSx0LnBvaW50KG49byxyPXMpLGk9YX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLG49cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItZX19fSksKGZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpO2lmKG51bGw9PXQpaT1uKlhnLHIucG9pbnQoLVZnLGkpLHIucG9pbnQoMCxpKSxyLnBvaW50KFZnLGkpLHIucG9pbnQoVmcsMCksci5wb2ludChWZywtaSksci5wb2ludCgwLC1pKSxyLnBvaW50KC1WZywtaSksci5wb2ludCgtVmcsMCksci5wb2ludCgtVmcsaSk7ZWxzZSBpZihaZyh0WzBdLWVbMF0pPlVnKXt2YXIgbz10WzBdPGVbMF0/Vmc6LVZnO2k9bipvLzIsci5wb2ludCgtbyxpKSxyLnBvaW50KDAsaSksci5wb2ludChvLGkpfWVsc2Ugci5wb2ludChlWzBdLGVbMV0pfSksWy1WZywtWGddKTtmdW5jdGlvbiBZZCh0LGUpe3ZhciBuPSRnKHQpLHI9bj4wLGk9Wmcobik+VWc7ZnVuY3Rpb24gbyh0LGUpe3JldHVybiAkZyh0KSokZyhlKT5ufWZ1bmN0aW9uIHModCxlLHIpe3ZhciBpPVsxLDAsMF0sbz1mZChoZCh0KSxoZChlKSkscz1wZChvLG8pLGE9b1swXSx1PXMtYSphO2lmKCF1KXJldHVybiFyJiZ0O3ZhciBsPW4qcy91LGM9LW4qYS91LGg9ZmQoaSxvKSxwPWRkKGksbCk7Z2QocCxkZChvLGMpKTt2YXIgZj1oLGc9cGQocCxmKSxkPXBkKGYsZikseT1nKmctZCoocGQocCxwKS0xKTtpZighKHk8MCkpe3ZhciB2PWVkKHkpLF89ZGQoZiwoLWctdikvZCk7aWYoZ2QoXyxwKSxfPWNkKF8pLCFyKXJldHVybiBfO3ZhciBtLHg9dFswXSxFPWVbMF0sYj10WzFdLHc9ZVsxXTtFPHgmJihtPXgseD1FLEU9bSk7dmFyIEk9RS14LE49WmcoSS1WZyk8VWc7aWYoIU4mJnc8YiYmKG09YixiPXcsdz1tKSxOfHxJPFVnP04/Yit3PjBeX1sxXTwoWmcoX1swXS14KTxVZz9iOncpOmI8PV9bMV0mJl9bMV08PXc6ST5WZ14oeDw9X1swXSYmX1swXTw9RSkpe3ZhciBTPWRkKGYsKC1nK3YpL2QpO3JldHVybiBnZChTLHApLFtfLGNkKFMpXX19fWZ1bmN0aW9uIGEoZSxuKXt2YXIgaT1yP3Q6VmctdCxvPTA7cmV0dXJuIGU8LWk/b3w9MTplPmkmJihvfD0yKSxuPC1pP298PTQ6bj5pJiYob3w9OCksb31yZXR1cm4gamQobywoZnVuY3Rpb24odCl7dmFyIGUsbix1LGwsYztyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7bD11PSExLGM9MX0scG9pbnQ6ZnVuY3Rpb24oaCxwKXt2YXIgZixnPVtoLHBdLGQ9byhoLHApLHk9cj9kPzA6YShoLHApOmQ/YShoKyhoPDA/Vmc6LVZnKSxwKTowO2lmKCFlJiYobD11PWQpJiZ0LmxpbmVTdGFydCgpLGQhPT11JiYoIShmPXMoZSxnKSl8fElkKGUsZil8fElkKGcsZikpJiYoZ1swXSs9VWcsZ1sxXSs9VWcsZD1vKGdbMF0sZ1sxXSkpLGQhPT11KWM9MCxkPyh0LmxpbmVTdGFydCgpLGY9cyhnLGUpLHQucG9pbnQoZlswXSxmWzFdKSk6KGY9cyhlLGcpLHQucG9pbnQoZlswXSxmWzFdKSx0LmxpbmVFbmQoKSksZT1mO2Vsc2UgaWYoaSYmZSYmcl5kKXt2YXIgdjt5Jm58fCEodj1zKGcsZSwhMCkpfHwoYz0wLHI/KHQubGluZVN0YXJ0KCksdC5wb2ludCh2WzBdWzBdLHZbMF1bMV0pLHQucG9pbnQodlsxXVswXSx2WzFdWzFdKSx0LmxpbmVFbmQoKSk6KHQucG9pbnQodlsxXVswXSx2WzFdWzFdKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQodlswXVswXSx2WzBdWzFdKSkpfSFkfHxlJiZJZChlLGcpfHx0LnBvaW50KGdbMF0sZ1sxXSksZT1nLHU9ZCxuPXl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt1JiZ0LmxpbmVFbmQoKSxlPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIGN8KGwmJnUpPDwxfX19KSwoZnVuY3Rpb24obixyLGksbyl7IWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtpZihuKXt2YXIgcz0kZyhlKSxhPXRkKGUpLHU9cipuO251bGw9PWk/KGk9ZStyKkhnLG89ZS11LzIpOihpPWJkKHMsaSksbz1iZChzLG8pLChyPjA/aTxvOmk+bykmJihpKz1yKkhnKSk7Zm9yKHZhciBsLGM9aTtyPjA/Yz5vOmM8bztjLT11KWw9Y2QoW3MsLWEqJGcoYyksLWEqdGQoYyldKSx0LnBvaW50KGxbMF0sbFsxXSl9fShvLHQsZSxpLG4scil9KSxyP1swLC10XTpbLVZnLHQtVmddKX1mdW5jdGlvbiBIZCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49bmV3IFdkO2Zvcih2YXIgciBpbiB0KW5bcl09dFtyXTtyZXR1cm4gbi5zdHJlYW09ZSxufX1mdW5jdGlvbiBXZCgpe31mdW5jdGlvbiBKZCh0LGUsbil7dmFyIHI9ZVsxXVswXS1lWzBdWzBdLGk9ZVsxXVsxXS1lWzBdWzFdLG89dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTt0LnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxudWxsIT1vJiZ0LmNsaXBFeHRlbnQobnVsbCksZnVuY3Rpb24odCxlKXt0JiZzZC5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP3NkW3QudHlwZV0odCxlKTpvZCh0LGUpfShuLHQuc3RyZWFtKHpkKSk7dmFyIHM9emQucmVzdWx0KCksYT1NYXRoLm1pbihyLyhzWzFdWzBdLXNbMF1bMF0pLGkvKHNbMV1bMV0tc1swXVsxXSkpLHU9K2VbMF1bMF0rKHItYSooc1sxXVswXStzWzBdWzBdKSkvMixsPStlWzBdWzFdKyhpLWEqKHNbMV1bMV0rc1swXVsxXSkpLzI7cmV0dXJuIG51bGwhPW8mJnQuY2xpcEV4dGVudChvKSx0LnNjYWxlKDE1MCphKS50cmFuc2xhdGUoW3UsbF0pfVdkLnByb3RvdHlwZT17Y29uc3RydWN0b3I6V2QscG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5wb2ludCh0LGUpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIFpkPSRnKDMwKkpnKTtmdW5jdGlvbiBLZCh0LGUpe3JldHVybitlP2Z1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbihyLGksbyxzLGEsdSxsLGMsaCxwLGYsZyxkLHkpe3ZhciB2PWwtcixfPWMtaSxtPXYqditfKl87aWYobT40KmUmJmQtLSl7dmFyIHg9cytwLEU9YStmLGI9dStnLHc9ZWQoeCp4K0UqRStiKmIpLEk9cmQoYi89dyksTj1aZyhaZyhiKS0xKTxVZ3x8Wmcoby1oKTxVZz8obytoKS8yOlFnKEUseCksUz10KE4sSSksQz1TWzBdLFA9U1sxXSxNPUMtcixMPVAtaSxPPV8qTS12Kkw7KE8qTy9tPmV8fFpnKCh2Kk0rXypMKS9tLS41KT4uM3x8cypwK2EqZit1Kmc8WmQpJiYobihyLGksbyxzLGEsdSxDLFAsTix4Lz13LEUvPXcsYixkLHkpLHkucG9pbnQoQyxQKSxuKEMsUCxOLHgsRSxiLGwsYyxoLHAsZixnLGQseSkpfX1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvLHMsYSx1LGwsYyxoLHAsZixnLGQ9e3BvaW50OnksbGluZVN0YXJ0OnYsbGluZUVuZDptLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksZC5saW5lU3RhcnQ9eH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2UucG9seWdvbkVuZCgpLGQubGluZVN0YXJ0PXZ9fTtmdW5jdGlvbiB5KG4scil7bj10KG4sciksZS5wb2ludChuWzBdLG5bMV0pfWZ1bmN0aW9uIHYoKXtjPU5hTixkLnBvaW50PV8sZS5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKHIsaSl7dmFyIG89aGQoW3IsaV0pLHM9dChyLGkpO24oYyxoLGwscCxmLGcsYz1zWzBdLGg9c1sxXSxsPXIscD1vWzBdLGY9b1sxXSxnPW9bMl0sMTYsZSksZS5wb2ludChjLGgpfWZ1bmN0aW9uIG0oKXtkLnBvaW50PXksZS5saW5lRW5kKCl9ZnVuY3Rpb24geCgpe3YoKSxkLnBvaW50PUUsZC5saW5lRW5kPWJ9ZnVuY3Rpb24gRSh0LGUpe18ocj10LGUpLGk9YyxvPWgscz1wLGE9Zix1PWcsZC5wb2ludD1ffWZ1bmN0aW9uIGIoKXtuKGMsaCxsLHAsZixnLGksbyxyLHMsYSx1LDE2LGUpLGQubGluZUVuZD1tLG0oKX1yZXR1cm4gZH19KHQsZSk6ZnVuY3Rpb24odCl7cmV0dXJuIEhkKHtwb2ludDpmdW5jdGlvbihlLG4pe2U9dChlLG4pLHRoaXMuc3RyZWFtLnBvaW50KGVbMF0sZVsxXSl9fSl9KHQpfXZhciBRZD1IZCh7cG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5wb2ludCh0KkpnLGUqSmcpfX0pO2Z1bmN0aW9uICRkKHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGwsYyxoPTE1MCxwPTQ4MCxmPTI1MCxnPTAsZD0wLHk9MCx2PTAsXz0wLG09bnVsbCx4PVhkLEU9bnVsbCxiPUZkLHc9LjUsST1LZChDLHcpO2Z1bmN0aW9uIE4odCl7cmV0dXJuWyh0PW8odFswXSpKZyx0WzFdKkpnKSlbMF0qaCtuLHItdFsxXSpoXX1mdW5jdGlvbiBTKHQpe3JldHVybih0PW8uaW52ZXJ0KCh0WzBdLW4pL2gsKHItdFsxXSkvaCkpJiZbdFswXSpXZyx0WzFdKldnXX1mdW5jdGlvbiBDKHQsaSl7cmV0dXJuWyh0PWUodCxpKSlbMF0qaCtuLHItdFsxXSpoXX1mdW5jdGlvbiBQKCl7bz12ZChpPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4odCU9SGcpP2V8fG4/dmQoeGQodCksRWQoZSxuKSk6eGQodCk6ZXx8bj9FZChlLG4pOl9kfSh5LHYsXyksZSk7dmFyIHQ9ZShnLGQpO3JldHVybiBuPXAtdFswXSpoLHI9Zit0WzFdKmgsTSgpfWZ1bmN0aW9uIE0oKXtyZXR1cm4gbD1jPW51bGwsTn1yZXR1cm4gTi5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGwmJmM9PT10P2w6bD1RZCh4KGksSShiKGM9dCkpKSl9LE4uY2xpcEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PSt0P1lkKG09dCpKZyw2KkpnKToobT1udWxsLFhkKSxNKCkpOm0qV2d9LE4uY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj1udWxsPT10PyhFPXM9YT11PW51bGwsRmQpOkFkKEU9K3RbMF1bMF0scz0rdFswXVsxXSxhPSt0WzFdWzBdLHU9K3RbMV1bMV0pLE0oKSk6bnVsbD09RT9udWxsOltbRSxzXSxbYSx1XV19LE4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3QsUCgpKTpofSxOLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSxmPSt0WzFdLFAoKSk6W3AsZl19LE4uY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPXRbMF0lMzYwKkpnLGQ9dFsxXSUzNjAqSmcsUCgpKTpbZypXZyxkKldnXX0sTi5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9dFswXSUzNjAqSmcsdj10WzFdJTM2MCpKZyxfPXQubGVuZ3RoPjI/dFsyXSUzNjAqSmc6MCxQKCkpOlt5KldnLHYqV2csXypXZ119LE4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhJPUtkKEMsdz10KnQpLE0oKSk6ZWQodyl9LE4uZml0RXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEpkKE4sdCxlKX0sTi5maXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gSmQodCxbWzAsMF0sZV0sbil9KE4sdCxlKX0sZnVuY3Rpb24oKXtyZXR1cm4gZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxOLmludmVydD1lLmludmVydCYmUyxQKCl9fSgoZnVuY3Rpb24oKXtyZXR1cm4gdH0pKSgpfXZhciB0eT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj0kZyhlKSxpPSRnKG4pLG89dChyKmkpO3JldHVybltvKmkqdGQoZSksbyp0ZChuKV19fSgoZnVuY3Rpb24odCl7cmV0dXJuKHQ9bmQodCkpJiZ0L3RkKHQpfSkpO2Z1bmN0aW9uIGV5KCl7cmV0dXJuICRkKHR5KS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9ZnVuY3Rpb24gbnkodCxuLHIsaSl7dmFyIHM9dC5wcm9wZXJ0aWVzfHx7fSxhPSJGZWF0dXJlIj09PXQudHlwZT90Lmdlb21ldHJ5OnQ7aWYoIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT1hLnR5cGUpe3ZhciB1PVtdO3JldHVybiBxKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPW55KHQsbixyLGkpO2UmJnUucHVzaChlKX0pKSxmKHUpfXZhciBsPWZ1bmN0aW9uKHQpe3ZhciBuPXhuKHQpLmdlb21ldHJ5LmNvb3JkaW5hdGVzLHI9Wy1uWzBdLC1uWzFdXTtyZXR1cm4gZXkoKS5yb3RhdGUocikuc2NhbGUoZSl9KGEpLGM9e3R5cGU6YS50eXBlLGNvb3JkaW5hdGVzOml5KGEuY29vcmRpbmF0ZXMsbCl9LGg9KG5ldyBJaCkucmVhZChjKSxwPW0oeChuLHIpLCJtZXRlcnMiKSxnPV9mLmJ1ZmZlck9wKGgscCxpKTtpZighcnkoKGc9KG5ldyBOaCkud3JpdGUoZykpLmNvb3JkaW5hdGVzKSlyZXR1cm4gbyh7dHlwZTpnLnR5cGUsY29vcmRpbmF0ZXM6b3koZy5jb29yZGluYXRlcyxsKX0scyl9ZnVuY3Rpb24gcnkodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodFswXSk/cnkodFswXSk6aXNOYU4odFswXSl9ZnVuY3Rpb24gaXkodCxlKXtyZXR1cm4ib2JqZWN0IiE9dHlwZW9mIHRbMF0/ZSh0KTp0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGl5KHQsZSl9KSl9ZnVuY3Rpb24gb3kodCxlKXtyZXR1cm4ib2JqZWN0IiE9dHlwZW9mIHRbMF0/ZS5pbnZlcnQodCk6dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBveSh0LGUpfSkpfWZ1bmN0aW9uIHN5KHQsZSxuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9cnQodCksaT1ydChlKSxvPSR1LmludGVyc2VjdGlvbihyLmNvb3JkaW5hdGVzLGkuY29vcmRpbmF0ZXMpO3JldHVybiAwPT09by5sZW5ndGg/bnVsbDoxPT09by5sZW5ndGg/bChvWzBdLG4ucHJvcGVydGllcyk6eShvLG4ucHJvcGVydGllcyl9ZnVuY3Rpb24gYXkodCxlLG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1KU09OLnN0cmluZ2lmeShuLnByb3BlcnRpZXN8fHt9KSxpPXRbMF0sbz10WzFdLHM9dFsyXSxhPXRbM10sdT0obythKS8yLGw9KGkrcykvMixjPTIqZS9tZShbaSx1XSxbcyx1XSxuKSoocy1pKSxoPTIqZS9tZShbbCxvXSxbbCxhXSxuKSooYS1vKSxwPWMvMixnPTIqcCxkPU1hdGguc3FydCgzKS8yKmgseT1zLWksdj1hLW8sXz0zLzQqZyxtPWQseD0oeS1nKS8oZy1wLzIpLEU9TWF0aC5mbG9vcih4KSxiPShFKl8tcC8yLXkpLzItcC8yK18vMix3PU1hdGguZmxvb3IoKHYtZCkvZCksST0odi13KmQpLzIsTj13KmQtdj5kLzI7TiYmKEktPWQvNCk7Zm9yKHZhciBTPVtdLEM9W10sUD0wO1A8NjtQKyspe3ZhciBNPTIqTWF0aC5QSS82KlA7Uy5wdXNoKE1hdGguY29zKE0pKSxDLnB1c2goTWF0aC5zaW4oTSkpfWZvcih2YXIgTD1bXSxPPTA7Tzw9RTtPKyspZm9yKHZhciBSPTA7Ujw9dztSKyspe3ZhciBUPU8lMj09MTtpZigoMCE9PVJ8fCFUKSYmKDAhPT1SfHwhTikpe3ZhciBBPU8qXytpLWIsRD1SKm0rbytJO2lmKFQmJihELT1kLzIpLCEwPT09bi50cmlhbmdsZXMpbHkoW0EsRF0sYy8yLGgvMixKU09OLnBhcnNlKHIpLFMsQykuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5tYXNrP3N5KG4ubWFzayx0KSYmTC5wdXNoKHQpOkwucHVzaCh0KX0pKTtlbHNle3ZhciBGPXV5KFtBLERdLGMvMixoLzIsSlNPTi5wYXJzZShyKSxTLEMpO24ubWFzaz9zeShuLm1hc2ssRikmJkwucHVzaChGKTpMLnB1c2goRil9fX1yZXR1cm4gZihMKX1mdW5jdGlvbiB1eSh0LGUsbixyLGksbyl7Zm9yKHZhciBzPVtdLGE9MDthPDY7YSsrKXt2YXIgdT10WzBdK2UqaVthXSxjPXRbMV0rbipvW2FdO3MucHVzaChbdSxjXSl9cmV0dXJuIHMucHVzaChzWzBdLnNsaWNlKCkpLGwoW3NdLHIpfWZ1bmN0aW9uIGx5KHQsZSxuLHIsaSxvKXtmb3IodmFyIHM9W10sYT0wO2E8NjthKyspe3ZhciB1PVtdO3UucHVzaCh0KSx1LnB1c2goW3RbMF0rZSppW2FdLHRbMV0rbipvW2FdXSksdS5wdXNoKFt0WzBdK2UqaVsoYSsxKSU2XSx0WzFdK24qb1soYSsxKSU2XV0pLHUucHVzaCh0KSxzLnB1c2gobChbdV0scikpfXJldHVybiBzfWZ1bmN0aW9uIGN5KHQpe3JldHVybiB5KHQpfWZ1bmN0aW9uIGh5KHQpe3JldHVybiBsKHQmJnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXN8fFtbWzE4MCw5MF0sWy0xODAsOTBdLFstMTgwLC05MF0sWzE4MCwtOTBdLFsxODAsOTBdXV0pfWZ1bmN0aW9uIHB5KHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLGZ1bmN0aW9uKHQsZSxuLHIpe3ZvaWQgMD09PXImJihyPXt9KTtmb3IodmFyIGk9W10sbz10WzBdLHM9dFsxXSxhPXRbMl0sdT10WzNdLGM9ZS9tZShbbyxzXSxbYSxzXSxyKSooYS1vKSxoPW4vbWUoW28sc10sW28sdV0scikqKHUtcykscD1hLW8sZz11LXMsZD1NYXRoLmZsb29yKHAvYykseT1NYXRoLmZsb29yKGcvaCksdj0oZy15KmgpLzIsXz1vKyhwLWQqYykvMixtPTA7bTxkO20rKyl7Zm9yKHZhciB4PXMrdixFPTA7RTx5O0UrKyl7dmFyIGI9bChbW1tfLHhdLFtfLHgraF0sW18rYyx4K2hdLFtfK2MseF0sW18seF1dXSxyLnByb3BlcnRpZXMpO3IubWFzaz9QcyhyLm1hc2ssYikmJmkucHVzaChiKTppLnB1c2goYikseCs9aH1fKz1jfXJldHVybiBmKGkpfSh0LGUsZSxuKX1mdW5jdGlvbiBmeSh0LGUsbil7dm9pZCAwPT09biYmKG49e30pO2Zvcih2YXIgcj1bXSxpPWUvbWUoW3RbMF0sdFsxXV0sW3RbMl0sdFsxXV0sbikqKHRbMl0tdFswXSksbz1lL21lKFt0WzBdLHRbMV1dLFt0WzBdLHRbM11dLG4pKih0WzNdLXRbMV0pLHM9MCxhPXRbMF07YTw9dFsyXTspe2Zvcih2YXIgdT0wLGM9dFsxXTtjPD10WzNdOyl7dmFyIGg9bnVsbCxwPW51bGw7cyUyPT0wJiZ1JTI9PTA/KGg9bChbW1thLGNdLFthLGMrb10sW2EraSxjXSxbYSxjXV1dLG4ucHJvcGVydGllcykscD1sKFtbW2EsYytvXSxbYStpLGMrb10sW2EraSxjXSxbYSxjK29dXV0sbi5wcm9wZXJ0aWVzKSk6cyUyPT0wJiZ1JTI9PTE/KGg9bChbW1thLGNdLFthK2ksYytvXSxbYStpLGNdLFthLGNdXV0sbi5wcm9wZXJ0aWVzKSxwPWwoW1tbYSxjXSxbYSxjK29dLFthK2ksYytvXSxbYSxjXV1dLG4ucHJvcGVydGllcykpOnUlMj09MCYmcyUyPT0xPyhoPWwoW1tbYSxjXSxbYSxjK29dLFthK2ksYytvXSxbYSxjXV1dLG4ucHJvcGVydGllcykscD1sKFtbW2EsY10sW2EraSxjK29dLFthK2ksY10sW2EsY11dXSxuLnByb3BlcnRpZXMpKTp1JTI9PTEmJnMlMj09MSYmKGg9bChbW1thLGNdLFthLGMrb10sW2EraSxjXSxbYSxjXV1dLG4ucHJvcGVydGllcykscD1sKFtbW2EsYytvXSxbYStpLGMrb10sW2EraSxjXSxbYSxjK29dXV0sbi5wcm9wZXJ0aWVzKSksbi5tYXNrPyhzeShuLm1hc2ssaCkmJnIucHVzaChoKSxzeShuLm1hc2sscCkmJnIucHVzaChwKSk6KHIucHVzaChoKSxyLnB1c2gocCkpLGMrPW8sdSsrfXMrKyxhKz1pfXJldHVybiBmKHIpfXR5LmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj1lZChlKmUrbipuKSxpPXQociksbz10ZChpKSxzPSRnKGkpO3JldHVybltRZyhlKm8scipzKSxyZChyJiZuKm8vcildfX0oKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpLHQuYWxvbmc9ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PW4mJihuPXt9KTtmb3IodmFyIHI9cnQodCkuY29vcmRpbmF0ZXMsaT0wLG89MDtvPHIubGVuZ3RoJiYhKGU+PWkmJm89PT1yLmxlbmd0aC0xKTtvKyspe2lmKGk+PWUpe3ZhciBzPWUtaTtpZihzKXt2YXIgdT1tbihyW29dLHJbby0xXSktMTgwO3JldHVybiB2bihyW29dLHMsdSxuKX1yZXR1cm4gYShyW29dKX1pKz1tZShyW29dLHJbbysxXSxuKX1yZXR1cm4gYShyW3IubGVuZ3RoLTFdKX0sdC5hbmdsZT1mdW5jdGlvbih0LGUsbixyKXtpZih2b2lkIDA9PT1yJiYocj17fSksIVAocikpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoInN0YXJ0UG9pbnQgaXMgcmVxdWlyZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIm1pZFBvaW50IGlzIHJlcXVpcmVkIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJlbmRQb2ludCBpcyByZXF1aXJlZCIpO3ZhciBpPXQsbz1lLHM9bixhPWIoITAhPT1yLm1lcmNhdG9yP21uKGksbyk6QmkoaSxvKSksdT1iKCEwIT09ci5tZXJjYXRvcj9tbihzLG8pOkJpKHMsbykpLGw9TWF0aC5hYnMoYS11KTtyZXR1cm4hMD09PXIuZXhwbGVtZW50YXJ5PzM2MC1sOmx9LHQuYXBwbHlGaWx0ZXI9dXUsdC5hcmVhPWpyLHQuYXJlYUZhY3RvcnM9aSx0LmJib3g9Wix0LmJib3hDbGlwPWZ1bmN0aW9uKHQsZSl7dmFyIG49cnQodCkscj1uLnR5cGUsaT0iRmVhdHVyZSI9PT10LnR5cGU/dC5wcm9wZXJ0aWVzOnt9LG89bi5jb29yZGluYXRlcztzd2l0Y2gocil7Y2FzZSJMaW5lU3RyaW5nIjpjYXNlIk11bHRpTGluZVN0cmluZyI6dmFyIHM9W107cmV0dXJuIkxpbmVTdHJpbmciPT09ciYmKG89W29dKSxvLmZvckVhY2goKGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvLHMsYSx1PXQubGVuZ3RoLGw9UmkodFswXSxlKSxjPVtdO2ZvcihufHwobj1bXSkscj0xO3I8dTtyKyspe2ZvcihzPXRbci0xXSxpPW89UmkoYT10W3JdLGUpOzspe2lmKCEobHxpKSl7Yy5wdXNoKHMpLGkhPT1vPyhjLnB1c2goYSkscjx1LTEmJihuLnB1c2goYyksYz1bXSkpOnI9PT11LTEmJmMucHVzaChhKTticmVha31pZihsJmkpYnJlYWs7bD9sPVJpKHM9T2kocyxhLGwsZSksZSk6aT1SaShhPU9pKHMsYSxpLGUpLGUpfWw9b31jLmxlbmd0aCYmbi5wdXNoKGMpfSh0LGUscyl9KSksMT09PXMubGVuZ3RoP2goc1swXSxpKTpnKHMsaSk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gbChUaShvLGUpLGkpO2Nhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4geShvLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFRpKHQsZSl9KSksaSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImdlb21ldHJ5ICIrcisiIG5vdCBzdXBwb3J0ZWQiKX19LHQuYmJveFBvbHlnb249Z24sdC5iZWFyaW5nPW1uLHQuYmVhcmluZ1RvQW5nbGU9Yix0LmJlYXJpbmdUb0F6aW11dGg9Yix0LmJlemllcj1mbix0LmJlemllclNwbGluZT1mbix0LmJvb2xlYW5DbG9ja3dpc2U9WWksdC5ib29sZWFuQ29udGFpbnM9ZnVuY3Rpb24odCxlKXt2YXIgbj1ydCh0KSxyPXJ0KGUpLGk9bi50eXBlLG89ci50eXBlLHM9bi5jb29yZGluYXRlcyxhPXIuY29vcmRpbmF0ZXM7c3dpdGNoKGkpe2Nhc2UiUG9pbnQiOnN3aXRjaChvKXtjYXNlIlBvaW50IjpyZXR1cm4gdnMocyxhKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZmVhdHVyZTIgIitvKyIgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpfWNhc2UiTXVsdGlQb2ludCI6c3dpdGNoKG8pe2Nhc2UiUG9pbnQiOnJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuLHI9ITE7Zm9yKG49MDtuPHQuY29vcmRpbmF0ZXMubGVuZ3RoO24rKylpZih2cyh0LmNvb3JkaW5hdGVzW25dLGUuY29vcmRpbmF0ZXMpKXtyPSEwO2JyZWFrfXJldHVybiByfShuLHIpO2Nhc2UiTXVsdGlQb2ludCI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj1lLmNvb3JkaW5hdGVzO248ci5sZW5ndGg7bisrKXtmb3IodmFyIGk9cltuXSxvPSExLHM9MCxhPXQuY29vcmRpbmF0ZXM7czxhLmxlbmd0aDtzKyspe2lmKHZzKGksYVtzXSkpe289ITA7YnJlYWt9fWlmKCFvKXJldHVybiExfXJldHVybiEwfShuLHIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlMiAiK28rIiBnZW9tZXRyeSBub3Qgc3VwcG9ydGVkIil9Y2FzZSJMaW5lU3RyaW5nIjpzd2l0Y2gobyl7Y2FzZSJQb2ludCI6cmV0dXJuIFdyKHIsbix7aWdub3JlRW5kVmVydGljZXM6ITB9KTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0hMSxyPTAsaT1lLmNvb3JkaW5hdGVzO3I8aS5sZW5ndGg7cisrKXt2YXIgbz1pW3JdO2lmKFdyKHt0eXBlOiJQb2ludCIsY29vcmRpbmF0ZXM6b30sdCx7aWdub3JlRW5kVmVydGljZXM6ITB9KSYmKG49ITApLCFXcih7dHlwZToiUG9pbnQiLGNvb3JkaW5hdGVzOm99LHQse2lnbm9yZUVuZFZlcnRpY2VzOiExfSkpcmV0dXJuITF9cmV0dXJuIG59KG4scik7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ITEscj0wLGk9ZS5jb29yZGluYXRlcztyPGkubGVuZ3RoO3IrKyl7dmFyIG89aVtyXTtpZihXcihvLHQse2lnbm9yZUVuZFZlcnRpY2VzOiEwfSkmJihuPSEwKSwhV3Iobyx0KSlyZXR1cm4hMX1pZihuKXJldHVybiEwO3JldHVybiExfShuLHIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlMiAiK28rIiBnZW9tZXRyeSBub3Qgc3VwcG9ydGVkIil9Y2FzZSJQb2x5Z29uIjpzd2l0Y2gobyl7Y2FzZSJQb2ludCI6cmV0dXJuIHllKHIsbix7aWdub3JlQm91bmRhcnk6ITB9KTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPSExLHI9MCxpPVoodCksbz1aKGUpO2lmKCF5cyhpLG8pKXJldHVybiExO2Zvcig7cjxlLmNvb3JkaW5hdGVzLmxlbmd0aC0xO3IrKyl7aWYoeWUoe3R5cGU6IlBvaW50Iixjb29yZGluYXRlczpfcyhlLmNvb3JkaW5hdGVzW3JdLGUuY29vcmRpbmF0ZXNbcisxXSl9LHQse2lnbm9yZUJvdW5kYXJ5OiEwfSkpe249ITA7YnJlYWt9fXJldHVybiBufShuLHIpO2Nhc2UiUG9seWdvbiI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoIkZlYXR1cmUiPT09dC50eXBlJiZudWxsPT09dC5nZW9tZXRyeSlyZXR1cm4hMTtpZigiRmVhdHVyZSI9PT1lLnR5cGUmJm51bGw9PT1lLmdlb21ldHJ5KXJldHVybiExO3ZhciBuPVoodCkscj1aKGUpO2lmKCF5cyhuLHIpKXJldHVybiExO2Zvcih2YXIgaT1ydChlKS5jb29yZGluYXRlcyxvPTAscz1pO288cy5sZW5ndGg7bysrKWZvcih2YXIgYT0wLHU9c1tvXTthPHUubGVuZ3RoO2ErKyl7aWYoIXllKHVbYV0sdCkpcmV0dXJuITF9cmV0dXJuITB9KG4scik7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPWUuY29vcmRpbmF0ZXM7bjxyLmxlbmd0aDtuKyspe2lmKCF5ZShyW25dLHQse2lnbm9yZUJvdW5kYXJ5OiEwfSkpcmV0dXJuITF9cmV0dXJuITB9KG4scik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmUyICIrbysiIGdlb21ldHJ5IG5vdCBzdXBwb3J0ZWQiKX1kZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZmVhdHVyZTEgIitpKyIgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpfX0sdC5ib29sZWFuQ3Jvc3Nlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXJ0KHQpLHI9cnQoZSksaT1uLnR5cGUsbz1yLnR5cGU7c3dpdGNoKGkpe2Nhc2UiTXVsdGlQb2ludCI6c3dpdGNoKG8pe2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuIG1zKG4scik7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gRXMobixyKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZmVhdHVyZTIgIitvKyIgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpfWNhc2UiTGluZVN0cmluZyI6c3dpdGNoKG8pe2Nhc2UiTXVsdGlQb2ludCI6cmV0dXJuIG1zKHIsbik7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4gZnVuY3Rpb24odCxlKXtpZihPcih0LGUpLmZlYXR1cmVzLmxlbmd0aD4wKWZvcih2YXIgbj0wO248dC5jb29yZGluYXRlcy5sZW5ndGgtMTtuKyspZm9yKHZhciByPTA7cjxlLmNvb3JkaW5hdGVzLmxlbmd0aC0xO3IrKyl7dmFyIGk9ITA7aWYoMCE9PXImJnIhPT1lLmNvb3JkaW5hdGVzLmxlbmd0aC0yfHwoaT0hMSksYnModC5jb29yZGluYXRlc1tuXSx0LmNvb3JkaW5hdGVzW24rMV0sZS5jb29yZGluYXRlc1tyXSxpKSlyZXR1cm4hMH1yZXR1cm4hMX0obixyKTtjYXNlIlBvbHlnb24iOnJldHVybiB4cyhuLHIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlMiAiK28rIiBnZW9tZXRyeSBub3Qgc3VwcG9ydGVkIil9Y2FzZSJQb2x5Z29uIjpzd2l0Y2gobyl7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gRXMocixuKTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiB4cyhyLG4pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlMiAiK28rIiBnZW9tZXRyeSBub3Qgc3VwcG9ydGVkIil9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmUxICIraSsiIGdlb21ldHJ5IG5vdCBzdXBwb3J0ZWQiKX19LHQuYm9vbGVhbkRpc2pvaW50PXBzLHQuYm9vbGVhbkVxdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHJ0KHQpLnR5cGU9PT1ydChlKS50eXBlJiZuZXcgQ3Moe3ByZWNpc2lvbjo2fSkuY29tcGFyZSh0bih0KSx0bihlKSl9LHQuYm9vbGVhbkludGVyc2VjdHM9UHMsdC5ib29sZWFuT3ZlcmxhcD1mdW5jdGlvbih0LGUpe3ZhciBuPXJ0KHQpLHI9cnQoZSksaT1uLnR5cGUsbz1yLnR5cGU7aWYoIk11bHRpUG9pbnQiPT09aSYmIk11bHRpUG9pbnQiIT09b3x8KCJMaW5lU3RyaW5nIj09PWl8fCJNdWx0aUxpbmVTdHJpbmciPT09aSkmJiJMaW5lU3RyaW5nIiE9PW8mJiJNdWx0aUxpbmVTdHJpbmciIT09b3x8KCJQb2x5Z29uIj09PWl8fCJNdWx0aVBvbHlnb24iPT09aSkmJiJQb2x5Z29uIiE9PW8mJiJNdWx0aVBvbHlnb24iIT09byl0aHJvdyBuZXcgRXJyb3IoImZlYXR1cmVzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSIpO2lmKCJQb2ludCI9PT1pKXRocm93IG5ldyBFcnJvcigiUG9pbnQgZ2VvbWV0cnkgbm90IHN1cHBvcnRlZCIpO2lmKG5ldyBDcyh7cHJlY2lzaW9uOjZ9KS5jb21wYXJlKHQsZSkpcmV0dXJuITE7dmFyIHM9MDtzd2l0Y2goaSl7Y2FzZSJNdWx0aVBvaW50Ijpmb3IodmFyIGE9MDthPG4uY29vcmRpbmF0ZXMubGVuZ3RoO2ErKylmb3IodmFyIHU9MDt1PHIuY29vcmRpbmF0ZXMubGVuZ3RoO3UrKyl7dmFyIGw9bi5jb29yZGluYXRlc1thXSxjPXIuY29vcmRpbmF0ZXNbdV07aWYobFswXT09PWNbMF0mJmxbMV09PT1jWzFdKXJldHVybiEwfXJldHVybiExO2Nhc2UiTGluZVN0cmluZyI6Y2FzZSJNdWx0aUxpbmVTdHJpbmciOlUodCwoZnVuY3Rpb24odCl7VShlLChmdW5jdGlvbihlKXtraSh0LGUpLmZlYXR1cmVzLmxlbmd0aCYmcysrfSkpfSkpO2JyZWFrO2Nhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aVBvbHlnb24iOlUodCwoZnVuY3Rpb24odCl7VShlLChmdW5jdGlvbihlKXtPcih0LGUpLmZlYXR1cmVzLmxlbmd0aCYmcysrfSkpfSkpfXJldHVybiBzPjB9LHQuYm9vbGVhblBhcmFsbGVsPWZ1bmN0aW9uKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJsaW5lMSBpcyByZXF1aXJlZCIpO2lmKCFlKXRocm93IG5ldyBFcnJvcigibGluZTIgaXMgcmVxdWlyZWQiKTtpZigiTGluZVN0cmluZyIhPT1Vcyh0LCJsaW5lMSIpKXRocm93IG5ldyBFcnJvcigibGluZTEgbXVzdCBiZSBhIExpbmVTdHJpbmciKTtpZigiTGluZVN0cmluZyIhPT1VcyhlLCJsaW5lMiIpKXRocm93IG5ldyBFcnJvcigibGluZTIgbXVzdCBiZSBhIExpbmVTdHJpbmciKTtmb3IodmFyIG49Wm4odG4odCkpLmZlYXR1cmVzLHI9Wm4odG4oZSkpLmZlYXR1cmVzLGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIG89bltpXS5nZW9tZXRyeS5jb29yZGluYXRlcztpZighcltpXSlicmVhaztpZighanMobyxyW2ldLmdlb21ldHJ5LmNvb3JkaW5hdGVzKSlyZXR1cm4hMX1yZXR1cm4hMH0sdC5ib29sZWFuUG9pbnRJblBvbHlnb249eWUsdC5ib29sZWFuUG9pbnRPbkxpbmU9V3IsdC5ib29sZWFuV2l0aGluPVpyLHQuYnVmZmVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0obj1ufHx7fSkudW5pdHN8fCJraWxvbWV0ZXJzIixpPW4uc3RlcHN8fDg7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7aWYoIm9iamVjdCIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2lmKCJudW1iZXIiIT10eXBlb2YgaSl0aHJvdyBuZXcgRXJyb3IoInN0ZXBzIG11c3QgYmUgYW4gbnVtYmVyIik7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgRXJyb3IoInJhZGl1cyBpcyByZXF1aXJlZCIpO2lmKGk8PTApdGhyb3cgbmV3IEVycm9yKCJzdGVwcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIik7dmFyIG89W107c3dpdGNoKHQudHlwZSl7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOnJldHVybiBxKHQsKGZ1bmN0aW9uKHQpe3ZhciBuPW55KHQsZSxyLGkpO24mJm8ucHVzaChuKX0pKSxmKG8pO2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnJldHVybiBGKHQsKGZ1bmN0aW9uKHQpe3ZhciBuPW55KHQsZSxyLGkpO24mJkYobiwoZnVuY3Rpb24odCl7dCYmby5wdXNoKHQpfSkpfSkpLGYobyl9cmV0dXJuIG55KHQsZSxyLGkpfSx0LmNlbnRlcj14bix0LmNlbnRlck1lYW49RmEsdC5jZW50ZXJNZWRpYW49ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1lJiYoZT17fSksIVAoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj1lLmNvdW50ZXJ8fDEwO2lmKCFDKG4pKXRocm93IG5ldyBFcnJvcigiY291bnRlciBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIHI9ZS53ZWlnaHQsaT1GYSh0LHt3ZWlnaHQ6ZS53ZWlnaHR9KSxvPWYoW10pO0YodCwoZnVuY3Rpb24odCl7dmFyIGU7by5mZWF0dXJlcy5wdXNoKEVuKHQse3Byb3BlcnRpZXM6e3dlaWdodDpudWxsPT09KGU9dC5wcm9wZXJ0aWVzKXx8dm9pZCAwPT09ZT92b2lkIDA6ZVtyXX19KSl9KSk7dmFyIHM9e3RvbGVyYW5jZTplLnRvbGVyYW5jZSxtZWRpYW5DYW5kaWRhdGVzOltdfTtyZXR1cm4ga2EoaS5nZW9tZXRyeS5jb29yZGluYXRlcyxbMCwwXSxvLHMsbil9LHQuY2VudGVyT2ZNYXNzPWZ1bmN0aW9uIHQoZSxuKXtzd2l0Y2godm9pZCAwPT09biYmKG49e30pLGl0KGUpKXtjYXNlIlBvaW50IjpyZXR1cm4gYShLKGUpLG4ucHJvcGVydGllcyk7Y2FzZSJQb2x5Z29uIjp2YXIgcj1bXTtSKGUsKGZ1bmN0aW9uKHQpe3IucHVzaCh0KX0pKTt2YXIgaSxvLHMsdSxsLGMsaCxwLGY9RW4oZSx7cHJvcGVydGllczpuLnByb3BlcnRpZXN9KSxnPWYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMsZD0wLHk9MCx2PTAsXz1yLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuW3RbMF0tZ1swXSx0WzFdLWdbMV1dfSkpO2ZvcihpPTA7aTxyLmxlbmd0aC0xO2krKyl1PShvPV9baV0pWzBdLGM9b1sxXSxsPShzPV9baSsxXSlbMF0sdis9cD11KihoPXNbMV0pLWwqYyxkKz0odStsKSpwLHkrPShjK2gpKnA7aWYoMD09PXYpcmV0dXJuIGY7dmFyIG09MS8oNiooLjUqdikpO3JldHVybiBhKFtnWzBdK20qZCxnWzFdK20qeV0sbi5wcm9wZXJ0aWVzKTtkZWZhdWx0OnZhciB4PWRlKGUpO3JldHVybiB4P3QoeCx7cHJvcGVydGllczpuLnByb3BlcnRpZXN9KTpFbihlLHtwcm9wZXJ0aWVzOm4ucHJvcGVydGllc30pfX0sdC5jZW50cm9pZD1Fbix0LmNpcmNsZT1fbix0LmNsZWFuQ29vcmRzPXRuLHQuY2xvbmU9SWUsdC5jbHVzdGVyRWFjaD1vdSx0LmNsdXN0ZXJSZWR1Y2U9c3UsdC5jbHVzdGVycz1odSx0LmNsdXN0ZXJzRGJzY2FuPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1uJiYobj17fSksITAhPT1uLm11dGF0ZSYmKHQ9SWUodCkpLG4ubWluUG9pbnRzPW4ubWluUG9pbnRzfHwzO3ZhciByPW5ldyBUcy5EQlNDQU4saT1yLnJ1bihHKHQpLE4oZSxuLnVuaXRzKSxuLm1pblBvaW50cyxtZSksbz0tMTtyZXR1cm4gaS5mb3JFYWNoKChmdW5jdGlvbihlKXtvKyssZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj10LmZlYXR1cmVzW2VdO24ucHJvcGVydGllc3x8KG4ucHJvcGVydGllcz17fSksbi5wcm9wZXJ0aWVzLmNsdXN0ZXI9byxuLnByb3BlcnRpZXMuZGJzY2FuPSJjb3JlIn0pKX0pKSxyLm5vaXNlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZmVhdHVyZXNbZV07bi5wcm9wZXJ0aWVzfHwobi5wcm9wZXJ0aWVzPXt9KSxuLnByb3BlcnRpZXMuY2x1c3Rlcj9uLnByb3BlcnRpZXMuZGJzY2FuPSJlZGdlIjpuLnByb3BlcnRpZXMuZGJzY2FuPSJub2lzZSJ9KSksdH0sdC5jbHVzdGVyc0ttZWFucz1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmZlYXR1cmVzLmxlbmd0aDtlLm51bWJlck9mQ2x1c3RlcnM9ZS5udW1iZXJPZkNsdXN0ZXJzfHxNYXRoLnJvdW5kKE1hdGguc3FydChuLzIpKSxlLm51bWJlck9mQ2x1c3RlcnM+biYmKGUubnVtYmVyT2ZDbHVzdGVycz1uKSwhMCE9PWUubXV0YXRlJiYodD1JZSh0KSk7dmFyIHI9Ryh0KSxpPXIuc2xpY2UoMCxlLm51bWJlck9mQ2x1c3RlcnMpLG89enMocixlLm51bWJlck9mQ2x1c3RlcnMsaSkscz17fTtyZXR1cm4gby5jZW50cm9pZHMuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtzW2VdPXR9KSksRih0LChmdW5jdGlvbih0LGUpe3ZhciBuPW8uaWR4c1tlXTt0LnByb3BlcnRpZXMuY2x1c3Rlcj1uLHQucHJvcGVydGllcy5jZW50cm9pZD1zW25dfSkpLHR9LHQuY29sbGVjdD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1OdCg2KSxvPWUuZmVhdHVyZXMubWFwKChmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm57bWluWDp0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLG1pblk6dC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSxtYXhYOnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sbWF4WTp0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLHByb3BlcnR5Om51bGw9PT0oZT10LnByb3BlcnRpZXMpfHx2b2lkIDA9PT1lP3ZvaWQgMDplW25dfX0pKTtyZXR1cm4gaS5sb2FkKG8pLHQuZmVhdHVyZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5wcm9wZXJ0aWVzfHwodC5wcm9wZXJ0aWVzPXt9KTt2YXIgZT1aKHQpLG49aS5zZWFyY2goe21pblg6ZVswXSxtaW5ZOmVbMV0sbWF4WDplWzJdLG1heFk6ZVszXX0pLG89W107bi5mb3JFYWNoKChmdW5jdGlvbihlKXt5ZShbZS5taW5YLGUubWluWV0sdCkmJm8ucHVzaChlLnByb3BlcnR5KX0pKSx0LnByb3BlcnRpZXNbcl09b30pKSx0fSx0LmNvbGxlY3Rpb25PZj1udCx0LmNvbWJpbmU9ZnVuY3Rpb24odCl7dmFyIGU9e011bHRpUG9pbnQ6e2Nvb3JkaW5hdGVzOltdLHByb3BlcnRpZXM6W119LE11bHRpTGluZVN0cmluZzp7Y29vcmRpbmF0ZXM6W10scHJvcGVydGllczpbXX0sTXVsdGlQb2x5Z29uOntjb29yZGluYXRlczpbXSxwcm9wZXJ0aWVzOltdfX07cmV0dXJuIEYodCwoZnVuY3Rpb24odCl7dmFyIG4scixpLG87c3dpdGNoKG51bGw9PT0obz10Lmdlb21ldHJ5KXx8dm9pZCAwPT09bz92b2lkIDA6by50eXBlKXtjYXNlIlBvaW50IjplLk11bHRpUG9pbnQuY29vcmRpbmF0ZXMucHVzaCh0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSxlLk11bHRpUG9pbnQucHJvcGVydGllcy5wdXNoKHQucHJvcGVydGllcyk7YnJlYWs7Y2FzZSJNdWx0aVBvaW50Ijoobj1lLk11bHRpUG9pbnQuY29vcmRpbmF0ZXMpLnB1c2guYXBwbHkobix0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSxlLk11bHRpUG9pbnQucHJvcGVydGllcy5wdXNoKHQucHJvcGVydGllcyk7YnJlYWs7Y2FzZSJMaW5lU3RyaW5nIjplLk11bHRpTGluZVN0cmluZy5jb29yZGluYXRlcy5wdXNoKHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpLGUuTXVsdGlMaW5lU3RyaW5nLnByb3BlcnRpZXMucHVzaCh0LnByb3BlcnRpZXMpO2JyZWFrO2Nhc2UiTXVsdGlMaW5lU3RyaW5nIjoocj1lLk11bHRpTGluZVN0cmluZy5jb29yZGluYXRlcykucHVzaC5hcHBseShyLHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpLGUuTXVsdGlMaW5lU3RyaW5nLnByb3BlcnRpZXMucHVzaCh0LnByb3BlcnRpZXMpO2JyZWFrO2Nhc2UiUG9seWdvbiI6ZS5NdWx0aVBvbHlnb24uY29vcmRpbmF0ZXMucHVzaCh0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSxlLk11bHRpUG9seWdvbi5wcm9wZXJ0aWVzLnB1c2godC5wcm9wZXJ0aWVzKTticmVhaztjYXNlIk11bHRpUG9seWdvbiI6KGk9ZS5NdWx0aVBvbHlnb24uY29vcmRpbmF0ZXMpLnB1c2guYXBwbHkoaSx0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSxlLk11bHRpUG9seWdvbi5wcm9wZXJ0aWVzLnB1c2godC5wcm9wZXJ0aWVzKX19KSksZihPYmplY3Qua2V5cyhlKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdLmNvb3JkaW5hdGVzLmxlbmd0aH0pKS5zb3J0KCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gbyh7dHlwZTp0LGNvb3JkaW5hdGVzOmVbdF0uY29vcmRpbmF0ZXN9LHtjb2xsZWN0ZWRQcm9wZXJ0aWVzOmVbdF0ucHJvcGVydGllc30pfSkpKX0sdC5jb25jYXZlPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUubWF4RWRnZXx8MS8wLHI9eGUoZnVuY3Rpb24odCl7dmFyIGU9W10sbj17fTtyZXR1cm4gRih0LChmdW5jdGlvbih0KXtpZih0Lmdlb21ldHJ5KXt2YXIgcj10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzLmpvaW4oIi0iKTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKXx8KGUucHVzaCh0KSxuW3JdPSEwKX19KSksZihlKX0odCkpO2lmKHIuZmVhdHVyZXM9ci5mZWF0dXJlcy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciByPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1bMF0saT10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdWzFdLG89dC5nZW9tZXRyeS5jb29yZGluYXRlc1swXVsyXSxzPW1lKHIsaSxlKSxhPW1lKGksbyxlKSx1PW1lKHIsbyxlKTtyZXR1cm4gczw9biYmYTw9biYmdTw9bn0pKSxyLmZlYXR1cmVzLmxlbmd0aDwxKXJldHVybiBudWxsO3ZhciBpPSRlKHIpO3JldHVybiAxPT09aS5jb29yZGluYXRlcy5sZW5ndGgmJihpLmNvb3JkaW5hdGVzPWkuY29vcmRpbmF0ZXNbMF0saS50eXBlPSJQb2x5Z29uIiksbyhpKX0sdC5jb250YWluc051bWJlcj0kLHQuY29udmVydEFyZWE9Uyx0LmNvbnZlcnREaXN0YW5jZT1OLHQuY29udmVydExlbmd0aD1OLHQuY29udmV4PWRlLHQuY29vcmRBbGw9Ryx0LmNvb3JkRWFjaD1SLHQuY29vcmRSZWR1Y2U9VCx0LmNyZWF0ZUJpbnM9YXUsdC5kZWdyZWVzMnJhZGlhbnM9SSx0LmRlZ3JlZXNUb1JhZGlhbnM9SSx0LmRlc3RpbmF0aW9uPXZuLHQuZGlmZmVyZW5jZT1mdW5jdGlvbih0LGUpe3ZhciBuPXJ0KHQpLHI9cnQoZSksaT10LnByb3BlcnRpZXN8fHt9LG89JHUuZGlmZmVyZW5jZShuLmNvb3JkaW5hdGVzLHIuY29vcmRpbmF0ZXMpO3JldHVybiAwPT09by5sZW5ndGg/bnVsbDoxPT09by5sZW5ndGg/bChvWzBdLGkpOnkobyxpKX0sdC5kaXNzb2x2ZT1mdW5jdGlvbih0LGUpe2lmKCFQKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5wcm9wZXJ0eU5hbWU7bnQodCwiUG9seWdvbiIsImRpc3NvbHZlIik7dmFyIHI9W107aWYoIWUucHJvcGVydHlOYW1lKXJldHVybiBuaSh5KCR1LnVuaW9uLmFwcGx5KG51bGwsdC5mZWF0dXJlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzfSkpKSkpO3ZhciBpPXt9O0YodCwoZnVuY3Rpb24odCl7T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksdC5wcm9wZXJ0aWVzW25dKXx8KGlbdC5wcm9wZXJ0aWVzW25dXT1bXSksaVt0LnByb3BlcnRpZXNbbl1dLnB1c2godCl9KSk7Zm9yKHZhciBvPU9iamVjdC5rZXlzKGkpLHM9MDtzPG8ubGVuZ3RoO3MrKyl7dmFyIGE9eSgkdS51bmlvbi5hcHBseShudWxsLGlbb1tzXV0ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZW9tZXRyeS5jb29yZGluYXRlc30pKSkpO2EucHJvcGVydGllc1tuXT1vW3NdLHIucHVzaChhKX1yZXR1cm4gbmkoZihyKSl9LHQuZGlzdGFuY2U9bWUsdC5kaXN0YW5jZVRvRGVncmVlcz1FLHQuZGlzdGFuY2VUb1JhZGlhbnM9eCx0LmRpc3RhbmNlV2VpZ2h0PWphLHQuZWFydGhSYWRpdXM9ZSx0LmVsbGlwc2U9QWEsdC5lbnZlbG9wZT1kbix0LmV4cGxvZGU9Ym4sdC5mYWN0b3JzPW4sdC5mZWF0dXJlPW8sdC5mZWF0dXJlQ29sbGVjdGlvbj1mLHQuZmVhdHVyZUVhY2g9Rix0LmZlYXR1cmVPZj1ldCx0LmZlYXR1cmVSZWR1Y2U9ayx0LmZpbHRlclByb3BlcnRpZXM9Y3UsdC5maW5kUG9pbnQ9Vyx0LmZpbmRTZWdtZW50PUgsdC5mbGF0dGVuPW5pLHQuZmxhdHRlbkVhY2g9eix0LmZsYXR0ZW5SZWR1Y2U9aix0LmZsaXA9ZnVuY3Rpb24odCxlKXtpZighUChlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuPWUubXV0YXRlO2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO3JldHVybiExIT09biYmdm9pZCAwIT09bnx8KHQ9SWUodCkpLFIodCwoZnVuY3Rpb24odCl7dmFyIGU9dFswXSxuPXRbMV07dFswXT1uLHRbMV09ZX0pKSx0fSx0Lmdlb2pzb25UeXBlPXR0LHQuZ2VvbUVhY2g9cSx0Lmdlb21SZWR1Y2U9Qix0Lmdlb21ldHJ5PXMsdC5nZW9tZXRyeUNvbGxlY3Rpb249dix0LmdldENsdXN0ZXI9aXUsdC5nZXRDb29yZD1LLHQuZ2V0Q29vcmRzPVEsdC5nZXRHZW9tPXJ0LHQuZ2V0VHlwZT1pdCx0LmdyZWF0Q2lyY2xlPWZ1bmN0aW9uKHQsZSxuKXtpZigib2JqZWN0IiE9dHlwZW9mKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHI9bi5wcm9wZXJ0aWVzLGk9bi5ucG9pbnRzLG89bi5vZmZzZXQ7cmV0dXJuIHQ9Syh0KSxlPUsoZSkscj1yfHx7fSxpPWl8fDEwMCxvPW98fDEwLG5ldyB2aSh7eDp0WzBdLHk6dFsxXX0se3g6ZVswXSx5OmVbMV19LHIpLkFyYyhpLHtvZmZzZXQ6b30pLmpzb24oKX0sdC5oZWxwZXJzPU8sdC5oZXhHcmlkPWF5LHQuaW5zaWRlPXllLHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCxlLG4pe2lmKCJvYmplY3QiIT10eXBlb2Yobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLmdyaWRUeXBlLGk9bi5wcm9wZXJ0eSxvPW4ud2VpZ2h0O2lmKCF0KXRocm93IG5ldyBFcnJvcigicG9pbnRzIGlzIHJlcXVpcmVkIik7aWYobnQodCwiUG9pbnQiLCJpbnB1dCBtdXN0IGNvbnRhaW4gUG9pbnRzIiksIWUpdGhyb3cgbmV3IEVycm9yKCJjZWxsU2l6ZSBpcyByZXF1aXJlZCIpO2lmKHZvaWQgMCE9PW8mJiJudW1iZXIiIT10eXBlb2Ygbyl0aHJvdyBuZXcgRXJyb3IoIndlaWdodCBtdXN0IGJlIGEgbnVtYmVyIik7aT1pfHwiZWxldmF0aW9uIixyPXJ8fCJzcXVhcmUiLG89b3x8MTt2YXIgcyxhPVoodCk7c3dpdGNoKHIpe2Nhc2UicG9pbnQiOmNhc2UicG9pbnRzIjpzPXRpKGEsZSxuKTticmVhaztjYXNlInNxdWFyZSI6Y2FzZSJzcXVhcmVzIjpzPXB5KGEsZSxuKTticmVhaztjYXNlImhleCI6Y2FzZSJoZXhlcyI6cz1heShhLGUsbik7YnJlYWs7Y2FzZSJ0cmlhbmdsZSI6Y2FzZSJ0cmlhbmdsZXMiOnM9ZnkoYSxlLG4pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGdyaWRUeXBlIil9dmFyIHU9W107cmV0dXJuIEYocywoZnVuY3Rpb24oZSl7dmFyIHM9MCxhPTA7Rih0LChmdW5jdGlvbih0KXt2YXIgdSxsPW1lKCJwb2ludCI9PT1yP2U6RW4oZSksdCxuKTtpZih2b2lkIDAhPT1pJiYodT10LnByb3BlcnRpZXNbaV0pLHZvaWQgMD09PXUmJih1PXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMl0pLHZvaWQgMD09PXUpdGhyb3cgbmV3IEVycm9yKCJ6VmFsdWUgaXMgbWlzc2luZyIpOzA9PT1sJiYocz11KTt2YXIgYz0xL01hdGgucG93KGwsbyk7YSs9YyxzKz1jKnV9KSk7dmFyIGw9SWUoZSk7bC5wcm9wZXJ0aWVzW2ldPXMvYSx1LnB1c2gobCl9KSksZih1KX0sdC5pbnRlcnNlY3Q9c3ksdC5pbnZhcmlhbnQ9b3QsdC5pc051bWJlcj1DLHQuaXNPYmplY3Q9UCx0Lmlzb2JhbmRzPWZ1bmN0aW9uKHQsZSxuKXtpZighUChuPW58fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciByPW4uelByb3BlcnR5fHwiZWxldmF0aW9uIixpPW4uY29tbW9uUHJvcGVydGllc3x8e30sbz1uLmJyZWFrc1Byb3BlcnRpZXN8fFtdO2lmKG50KHQsIlBvaW50IiwiSW5wdXQgbXVzdCBjb250YWluIFBvaW50cyIpLCFlKXRocm93IG5ldyBFcnJvcigiYnJlYWtzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IEVycm9yKCJicmVha3MgaXMgbm90IGFuIEFycmF5Iik7aWYoIVAoaSkpdGhyb3cgbmV3IEVycm9yKCJjb21tb25Qcm9wZXJ0aWVzIGlzIG5vdCBhbiBPYmplY3QiKTtpZighQXJyYXkuaXNBcnJheShvKSl0aHJvdyBuZXcgRXJyb3IoImJyZWFrc1Byb3BlcnRpZXMgaXMgbm90IGFuIEFycmF5Iik7dmFyIHM9WmkodCx7elByb3BlcnR5OnIsZmxpcDohMH0pLGE9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1bXSxpPTE7aTxlLmxlbmd0aDtpKyspe3ZhciBvPStlW2ktMV0scz0rZVtpXSxhPVpvKEpvKCRpKHQsbyxzLW8pKSksdT17fTt1Lmdyb3VwZWRSaW5ncz1hLHVbbl09bysiLSIrcyxyLnB1c2godSl9cmV0dXJuIHJ9KHMsZSxyKTtyZXR1cm4gZigoYT1mdW5jdGlvbih0LGUsbil7dmFyIHI9WihuKSxpPXJbMl0tclswXSxvPXJbM10tclsxXSxzPXJbMF0sYT1yWzFdLHU9ZVswXS5sZW5ndGgtMSxsPWUubGVuZ3RoLTEsYz1pL3UsaD1vL2wscD1mdW5jdGlvbih0KXt0WzBdPXRbMF0qYytzLHRbMV09dFsxXSpoK2F9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZ3JvdXBlZFJpbmdzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5mb3JFYWNoKHApfSkpfSkpfSkpLHR9KGEscyx0KSkubWFwKChmdW5jdGlvbih0LGUpe2lmKG9bZV0mJiFQKG9bZV0pKXRocm93IG5ldyBFcnJvcigiRWFjaCBtYXBwZWRQcm9wZXJ0eSBpcyByZXF1aXJlZCB0byBiZSBhbiBPYmplY3QiKTt2YXIgbj1jdCh7fSxpLG9bZV0pO3JldHVybiBuW3JdPXRbcl0seSh0Lmdyb3VwZWRSaW5ncyxuKX0pKSl9LHQuaXNvbGluZXM9ZnVuY3Rpb24odCxlLG4pe2lmKCFQKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHI9bi56UHJvcGVydHl8fCJlbGV2YXRpb24iLGk9bi5jb21tb25Qcm9wZXJ0aWVzfHx7fSxvPW4uYnJlYWtzUHJvcGVydGllc3x8W107aWYobnQodCwiUG9pbnQiLCJJbnB1dCBtdXN0IGNvbnRhaW4gUG9pbnRzIiksIWUpdGhyb3cgbmV3IEVycm9yKCJicmVha3MgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgRXJyb3IoImJyZWFrcyBtdXN0IGJlIGFuIEFycmF5Iik7aWYoIVAoaSkpdGhyb3cgbmV3IEVycm9yKCJjb21tb25Qcm9wZXJ0aWVzIG11c3QgYmUgYW4gT2JqZWN0Iik7aWYoIUFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IEVycm9yKCJicmVha3NQcm9wZXJ0aWVzIG11c3QgYmUgYW4gQXJyYXkiKTt2YXIgcz1fdCh0LHt6UHJvcGVydHk6cixmbGlwOiEwfSk7cmV0dXJuIGYoZnVuY3Rpb24odCxlLG4pe3ZhciByPVoobiksaT1yWzJdLXJbMF0sbz1yWzNdLXJbMV0scz1yWzBdLGE9clsxXSx1PWVbMF0ubGVuZ3RoLTEsbD1lLmxlbmd0aC0xLGM9aS91LGg9by9sLHA9ZnVuY3Rpb24odCl7dFswXT10WzBdKmMrcyx0WzFdPXRbMV0qaCthfTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtSKHQscCl9KSksdH0oZnVuY3Rpb24odCxlLG4scixpKXtmb3IodmFyIG89W10scz0xO3M8ZS5sZW5ndGg7cysrKXt2YXIgYT0rZVtzXSx1PWN0KHt9LHIsaVtzXSk7dVtuXT1hO3ZhciBsPWcoZnQodCxhKSx1KTtvLnB1c2gobCl9cmV0dXJuIG99KHMsZSxyLGksbykscyx0KSl9LHQua2lua3M9ZnVuY3Rpb24odCl7dmFyIGUsbixyPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6W119O2lmKCJMaW5lU3RyaW5nIj09PShuPSJGZWF0dXJlIj09PXQudHlwZT90Lmdlb21ldHJ5OnQpLnR5cGUpZT1bbi5jb29yZGluYXRlc107ZWxzZSBpZigiTXVsdGlMaW5lU3RyaW5nIj09PW4udHlwZSllPW4uY29vcmRpbmF0ZXM7ZWxzZSBpZigiTXVsdGlQb2x5Z29uIj09PW4udHlwZSllPVtdLmNvbmNhdC5hcHBseShbXSxuLmNvb3JkaW5hdGVzKTtlbHNle2lmKCJQb2x5Z29uIiE9PW4udHlwZSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IG11c3QgYmUgYSBMaW5lU3RyaW5nLCBNdWx0aUxpbmVTdHJpbmcsIFBvbHlnb24sIG9yIE11bHRpUG9seWdvbiBGZWF0dXJlIG9yIEdlb21ldHJ5Iik7ZT1uLmNvb3JkaW5hdGVzfXJldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aC0xO24rKylmb3IodmFyIGk9bjtpPGUubGVuZ3RoLTE7aSsrKXtpZih0PT09ZSl7aWYoMT09PU1hdGguYWJzKG4taSkpY29udGludWU7aWYoMD09PW4mJmk9PT10Lmxlbmd0aC0yJiZ0W25dWzBdPT09dFt0Lmxlbmd0aC0xXVswXSYmdFtuXVsxXT09PXRbdC5sZW5ndGgtMV1bMV0pY29udGludWV9dmFyIG89R3IodFtuXVswXSx0W25dWzFdLHRbbisxXVswXSx0W24rMV1bMV0sZVtpXVswXSxlW2ldWzFdLGVbaSsxXVswXSxlW2krMV1bMV0pO28mJnIuZmVhdHVyZXMucHVzaChhKFtvWzBdLG9bMV1dKSl9fSkpfSkpLHJ9LHQubGVuZ3RoPVlyLHQubGVuZ3RoVG9EZWdyZWVzPUUsdC5sZW5ndGhUb1JhZGlhbnM9eCx0LmxpbmVBcmM9YmksdC5saW5lQ2h1bms9ZnVuY3Rpb24odCxlLG4pe2lmKCFQKG49bnx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIHI9bi51bml0cyxpPW4ucmV2ZXJzZTtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtpZihlPD0wKXRocm93IG5ldyBFcnJvcigic2VnbWVudExlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIik7dmFyIG89W107cmV0dXJuIHoodCwoZnVuY3Rpb24odCl7aSYmKHQuZ2VvbWV0cnkuY29vcmRpbmF0ZXM9dC5nZW9tZXRyeS5jb29yZGluYXRlcy5yZXZlcnNlKCkpLGZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPVlyKHQse3VuaXRzOm59KTtpZihpPD1lKXJldHVybiByKHQpO3ZhciBvPWkvZTtOdW1iZXIuaXNJbnRlZ2VyKG8pfHwobz1NYXRoLmZsb29yKG8pKzEpO2Zvcih2YXIgcz0wO3M8bztzKyspe3IoSHIodCxlKnMsZSoocysxKSx7dW5pdHM6bn0pLHMpfX0odCxlLHIsKGZ1bmN0aW9uKHQpe28ucHVzaCh0KX0pKX0pKSxmKG8pfSx0LmxpbmVEaXN0YW5jZT1Zcix0LmxpbmVFYWNoPVgsdC5saW5lSW50ZXJzZWN0PU9yLHQubGluZU9mZnNldD1mdW5jdGlvbih0LGUsbil7aWYoIVAobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLnVuaXRzO2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO2lmKG51bGw9PWV8fGlzTmFOKGUpKXRocm93IG5ldyBFcnJvcigiZGlzdGFuY2UgaXMgcmVxdWlyZWQiKTt2YXIgaT1pdCh0KSxvPXQucHJvcGVydGllcztzd2l0Y2goaSl7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4gb3ModCxlLHIpO2Nhc2UiTXVsdGlMaW5lU3RyaW5nIjp2YXIgcz1bXTtyZXR1cm4geih0LChmdW5jdGlvbih0KXtzLnB1c2gob3ModCxlLHIpLmdlb21ldHJ5LmNvb3JkaW5hdGVzKX0pKSxnKHMsbyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImdlb21ldHJ5ICIraSsiIGlzIG5vdCBzdXBwb3J0ZWQiKX19LHQubGluZU92ZXJsYXA9a2ksdC5saW5lUmVkdWNlPVksdC5saW5lU2VnbWVudD1abix0LmxpbmVTbGljZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9UShuKTtpZigiTGluZVN0cmluZyIhPT1pdChuKSl0aHJvdyBuZXcgRXJyb3IoImxpbmUgbXVzdCBiZSBhIExpbmVTdHJpbmciKTtmb3IodmFyIGksbz1UcihuLHQpLHM9VHIobixlKSxhPVsoaT1vLnByb3BlcnRpZXMuaW5kZXg8PXMucHJvcGVydGllcy5pbmRleD9bbyxzXTpbcyxvXSlbMF0uZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLHU9aVswXS5wcm9wZXJ0aWVzLmluZGV4KzE7dTxpWzFdLnByb3BlcnRpZXMuaW5kZXgrMTt1KyspYS5wdXNoKHJbdV0pO3JldHVybiBhLnB1c2goaVsxXS5nZW9tZXRyeS5jb29yZGluYXRlcyksaChhLG4ucHJvcGVydGllcyl9LHQubGluZVNsaWNlQWxvbmc9SHIsdC5saW5lU3BsaXQ9ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImxpbmUgaXMgcmVxdWlyZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoInNwbGl0dGVyIGlzIHJlcXVpcmVkIik7dmFyIG49aXQodCkscj1pdChlKTtpZigiTGluZVN0cmluZyIhPT1uKXRocm93IG5ldyBFcnJvcigibGluZSBtdXN0IGJlIExpbmVTdHJpbmciKTtpZigiRmVhdHVyZUNvbGxlY3Rpb24iPT09cil0aHJvdyBuZXcgRXJyb3IoInNwbGl0dGVyIGNhbm5vdCBiZSBhIEZlYXR1cmVDb2xsZWN0aW9uIik7aWYoIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT1yKXRocm93IG5ldyBFcnJvcigic3BsaXR0ZXIgY2Fubm90IGJlIGEgR2VvbWV0cnlDb2xsZWN0aW9uIik7dmFyIGk9ZWkoZSx7cHJlY2lzaW9uOjd9KTtzd2l0Y2gocil7Y2FzZSJQb2ludCI6cmV0dXJuIG1pKHQsaSk7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gX2kodCxpKTtjYXNlIkxpbmVTdHJpbmciOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4gX2kodCxPcih0LGkpKX19LHQubGluZVN0cmluZz1oLHQubGluZVN0cmluZ1RvUG9seWdvbj1DaSx0LmxpbmVTdHJpbmdzPXAsdC5saW5lVG9Qb2x5Z29uPUNpLHQubWFzaz1mdW5jdGlvbih0LGUpe3ZhciBuLHI9aHkoZSksaT1udWxsO3JldHVybiJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGU/aT1jeSgyPT09KG49dCkuZmVhdHVyZXMubGVuZ3RoPyR1LnVuaW9uKG4uZmVhdHVyZXNbMF0uZ2VvbWV0cnkuY29vcmRpbmF0ZXMsbi5mZWF0dXJlc1sxXS5nZW9tZXRyeS5jb29yZGluYXRlcyk6JHUudW5pb24uYXBwbHkoJHUsbi5mZWF0dXJlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzfSkpKSk6aT1jeSgkdS51bmlvbih0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSksaS5nZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKChmdW5jdGlvbih0KXtyLmdlb21ldHJ5LmNvb3JkaW5hdGVzLnB1c2godFswXSl9KSkscn0sdC5tZXRhPUosdC5taWRwb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiB2bih0LG1lKHQsZSkvMixtbih0LGUpKX0sdC5tb3JhbkluZGV4PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5pbnB1dEZpZWxkLHI9ZS50aHJlc2hvbGR8fDFlNSxpPWUucHx8MixvPWUuYmluYXJ5fHwhMSxzPWphKHQse2FscGhhOmUuYWxwaGF8fC0xLGJpbmFyeTpvLHA6aSxzdGFuZGFyZGl6YXRpb246ZS5zdGFuZGFyZGl6YXRpb258fCEwLHRocmVzaG9sZDpyfSksYT1bXTtGKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQucHJvcGVydGllc3x8e307YS5wdXNoKGVbbl0pfSkpO2Zvcih2YXIgdT1VYShhKSxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1VYSh0KSxuPTAscj0wLGk9dDtyPGkubGVuZ3RoO3IrKyl7dmFyIG89aVtyXTtuKz1NYXRoLnBvdyhvLWUsMil9cmV0dXJuIG4vdC5sZW5ndGh9KGEpLGM9MCxoPTAscD0wLGY9MCxnPXMubGVuZ3RoLGQ9MDtkPGc7ZCsrKXtmb3IodmFyIHk9MCx2PTA7djxnO3YrKyljKz1zW2RdW3ZdKihhW2RdLXUpKihhW3ZdLXUpLGgrPXNbZF1bdl0scCs9TWF0aC5wb3coc1tkXVt2XStzW3ZdW2RdLDIpLHkrPXNbZF1bdl0rc1t2XVtkXTtmKz1NYXRoLnBvdyh5LDIpfXZhciBfPWMvaC9sLG09LTEvKGctMSkseD0oZypnKihwKj0uNSktZypmK2gqaCozKS8oKGctMSkqKGcrMSkqKGgqaCkpLW0qbSxFPU1hdGguc3FydCh4KTtyZXR1cm57ZXhwZWN0ZWRNb3JhbkluZGV4Om0sbW9yYW5JbmRleDpfLHN0ZE5vcm06RSx6Tm9ybTooXy1tKS9FfX0sdC5tdWx0aUxpbmVTdHJpbmc9Zyx0Lm11bHRpUG9pbnQ9ZCx0Lm11bHRpUG9seWdvbj15LHQubmVhcmVzdD1Kbix0Lm5lYXJlc3RQb2ludD1Kbix0Lm5lYXJlc3RQb2ludE9uTGluZT1Ucix0Lm5lYXJlc3RQb2ludFRvTGluZT1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09biYmKG49e30pO3ZhciByPW4udW5pdHMsaT1uLnByb3BlcnRpZXN8fHt9LG89ZnVuY3Rpb24odCl7dmFyIGU9W107c3dpdGNoKHQuZ2VvbWV0cnk/dC5nZW9tZXRyeS50eXBlOnQudHlwZSl7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOnJldHVybiBxKHQsKGZ1bmN0aW9uKHQpeyJQb2ludCI9PT10LnR5cGUmJmUucHVzaCh7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7fSxnZW9tZXRyeTp0fSl9KSkse3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczplfTtjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpyZXR1cm4gdC5mZWF0dXJlcz10LmZlYXR1cmVzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIlBvaW50Ij09PXQuZ2VvbWV0cnkudHlwZX0pKSx0O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJwb2ludHMgbXVzdCBiZSBhIFBvaW50IENvbGxlY3Rpb24iKX19KHQpO2lmKCFvLmZlYXR1cmVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInBvaW50cyBtdXN0IGNvbnRhaW4gZmVhdHVyZXMiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoImxpbmUgaXMgcmVxdWlyZWQiKTtpZigiTGluZVN0cmluZyIhPT1pdChlKSl0aHJvdyBuZXcgRXJyb3IoImxpbmUgbXVzdCBiZSBhIExpbmVTdHJpbmciKTt2YXIgcz0xLzAsYT1udWxsO3JldHVybiBGKG8sKGZ1bmN0aW9uKHQpe3ZhciBuPURyKHQsZSx7dW5pdHM6cn0pO248cyYmKHM9bixhPXQpfSkpLGEmJihhLnByb3BlcnRpZXM9Y3Qoe2Rpc3Q6c30sYS5wcm9wZXJ0aWVzLGkpKSxhfSx0LnBsYW5lcG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1LKHQpLHI9cnQoZSkuY29vcmRpbmF0ZXNbMF07aWYoci5sZW5ndGg8NCl0aHJvdyBuZXcgRXJyb3IoIk91dGVyUmluZyBvZiBhIFBvbHlnb24gbXVzdCBoYXZlIDQgb3IgbW9yZSBQb3NpdGlvbnMuIik7dmFyIGk9ZS5wcm9wZXJ0aWVzfHx7fSxvPWkuYSxzPWkuYixhPWkuYyx1PW5bMF0sbD1uWzFdLGM9clswXVswXSxoPXJbMF1bMV0scD12b2lkIDAhPT1vP286clswXVsyXSxmPXJbMV1bMF0sZz1yWzFdWzFdLGQ9dm9pZCAwIT09cz9zOnJbMV1bMl0seT1yWzJdWzBdLHY9clsyXVsxXSxfPXZvaWQgMCE9PWE/YTpyWzJdWzJdO3JldHVybihfKih1LWMpKihsLWcpK3AqKHUtZikqKGwtdikrZCoodS15KSoobC1oKS1kKih1LWMpKihsLXYpLV8qKHUtZikqKGwtaCktcCoodS15KSoobC1nKSkvKCh1LWMpKihsLWcpKyh1LWYpKihsLXYpKyh1LXkpKihsLWgpLSh1LWMpKihsLXYpLSh1LWYpKihsLWgpLSh1LXkpKihsLWcpKX0sdC5wb2ludD1hLHQucG9pbnRHcmlkPXRpLHQucG9pbnRPbkZlYXR1cmU9cXIsdC5wb2ludE9uTGluZT1Ucix0LnBvaW50T25TdXJmYWNlPXFyLHQucG9pbnRUb0xpbmVEaXN0YW5jZT1Ecix0LnBvaW50cz11LHQucG9pbnRzV2l0aGluUG9seWdvbj1fZSx0LnBvbHlnb249bCx0LnBvbHlnb25TbW9vdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj1bXSxyPWUuaXRlcmF0aW9uc3x8MTtpZighdCl0aHJvdyBuZXcgRXJyb3IoImlucHV0UG9seXMgaXMgcmVxdWlyZWQiKTtyZXR1cm4gcSh0LChmdW5jdGlvbih0LGUsaSl7dmFyIG8scyxhO3N3aXRjaCh0LnR5cGUpe2Nhc2UiUG9seWdvbiI6bz1bW11dO2Zvcih2YXIgdT0wO3U8cjt1KyspYT1bW11dLHM9dCx1PjAmJihzPWwobykuZ2VvbWV0cnkpLHFhKHMsYSksbz1hLnNsaWNlKDApO24ucHVzaChsKG8saSkpO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpvPVtbW11dXTtmb3IodmFyIGM9MDtjPHI7YysrKWE9W1tbXV1dLHM9dCxjPjAmJihzPXkobykuZ2VvbWV0cnkpLEJhKHMsYSksbz1hLnNsaWNlKDApO24ucHVzaCh5KG8saSkpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJnZW9tZXRyeSBpcyBpbnZhbGlkLCBtdXN0IGJlIFBvbHlnb24gb3IgTXVsdGlQb2x5Z29uIil9fSkpLGYobil9LHQucG9seWdvblRhbmdlbnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpLG8scz1RKHQpLHU9UShlKSxsPVooZSksYz0wLGg9bnVsbDtzd2l0Y2goc1swXT5sWzBdJiZzWzBdPGxbMl0mJnNbMV0+bFsxXSYmc1sxXTxsWzNdJiYoYz0oaD1Kbih0LGJuKGUpKSkucHJvcGVydGllcy5mZWF0dXJlSW5kZXgpLGl0KGUpKXtjYXNlIlBvbHlnb24iOm49dVswXVtjXSxyPXVbMF1bMF0sbnVsbCE9PWgmJmguZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV08c1sxXSYmKHI9dVswXVtjXSksbz1YaSh1WzBdWzBdLHVbMF1bdVswXS5sZW5ndGgtMV0scyk7dmFyIHA9VWkodVswXSxzLG8saSxuLHIpO249cFswXSxyPXBbMV07YnJlYWs7Y2FzZSJNdWx0aVBvbHlnb24iOmZvcih2YXIgZz0wLGQ9MCx5PTAsdj0wO3Y8dVswXS5sZW5ndGg7disrKXtnPXY7Zm9yKHZhciBfPSExLG09MDttPHVbMF1bdl0ubGVuZ3RoO20rKyl7aWYoZD1tLHk9PT1jKXtfPSEwO2JyZWFrfXkrK31pZihfKWJyZWFrfW49dVswXVtnXVtkXSxyPXVbMF1bZ11bZF0sbz1YaSh1WzBdWzBdWzBdLHVbMF1bMF1bdVswXVswXS5sZW5ndGgtMV0scyksdS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1VaSh0WzBdLHMsbyxpLG4scik7bj1lWzBdLHI9ZVsxXX0pKX1yZXR1cm4gZihbYShuKSxhKHIpXSl9LHQucG9seWdvblRvTGluZT1JaSx0LnBvbHlnb25Ub0xpbmVTdHJpbmc9SWksdC5wb2x5Z29uaXplPWZ1bmN0aW9uKHQpe3ZhciBlPWhzLmZyb21HZW9Kc29uKHQpO2UuZGVsZXRlRGFuZ2xlcygpLGUuZGVsZXRlQ3V0RWRnZXMoKTt2YXIgbj1bXSxyPVtdO3JldHVybiBlLmdldEVkZ2VSaW5ncygpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNWYWxpZCgpfSkpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuaXNIb2xlKCk/bi5wdXNoKHQpOnIucHVzaCh0KX0pKSxuLmZvckVhY2goKGZ1bmN0aW9uKHQpe2NzLmZpbmRFZGdlUmluZ0NvbnRhaW5pbmcodCxyKSYmci5wdXNoKHQpfSkpLGYoci5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRvUG9seWdvbigpfSkpKX0sdC5wb2x5Z29ucz1jLHQucHJvamVjdGlvbj1KYSx0LnByb3BFYWNoPUEsdC5wcm9wUmVkdWNlPUQsdC5wcm9wZXJ0aWVzQ29udGFpbnNGaWx0ZXI9bHUsdC5yYWRpYW5zMmRlZ3JlZXM9dyx0LnJhZGlhbnNUb0RlZ3JlZXM9dyx0LnJhZGlhbnNUb0Rpc3RhbmNlPW0sdC5yYWRpYW5zVG9MZW5ndGg9bSx0LnJhbmRvbT1ydSx0LnJhbmRvbUxpbmVTdHJpbmc9dHUsdC5yYW5kb21Qb2ludD1RYSx0LnJhbmRvbVBvbHlnb249JGEsdC5yYW5kb21Qb3NpdGlvbj1LYSx0LnJld2luZD1mdW5jdGlvbih0LGUpe2lmKCFQKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5yZXZlcnNlfHwhMSxyPWUubXV0YXRlfHwhMTtpZighdCl0aHJvdyBuZXcgRXJyb3IoIjxnZW9qc29uPiBpcyByZXF1aXJlZCIpO2lmKCJib29sZWFuIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yKCI8cmV2ZXJzZT4gbXVzdCBiZSBhIGJvb2xlYW4iKTtpZigiYm9vbGVhbiIhPXR5cGVvZiByKXRocm93IG5ldyBFcnJvcigiPG11dGF0ZT4gbXVzdCBiZSBhIGJvb2xlYW4iKTshMT09PXImJih0PUllKHQpKTt2YXIgaT1bXTtzd2l0Y2godC50eXBlKXtjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6cmV0dXJuIHEodCwoZnVuY3Rpb24odCl7SGkodCxuKX0pKSx0O2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnJldHVybiBGKHQsKGZ1bmN0aW9uKHQpe0YoSGkodCxuKSwoZnVuY3Rpb24odCl7aS5wdXNoKHQpfSkpfSkpLGYoaSl9cmV0dXJuIEhpKHQsbil9LHQucmh1bWJCZWFyaW5nPUJpLHQucmh1bWJEZXN0aW5hdGlvbj1qaSx0LnJodW1iRGlzdGFuY2U9QXIsdC5yb3VuZD1fLHQuc2FtcGxlPWZ1bmN0aW9uKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlY29sbGVjdGlvbiBpcyByZXF1aXJlZCIpO2lmKG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJudW0gaXMgcmVxdWlyZWQiKTtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJudW0gbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmKGZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXQuc2xpY2UoMCksbz10Lmxlbmd0aCxzPW8tZTtmb3IoO28tLSA+czspbj1pW3I9TWF0aC5mbG9vcigobysxKSpNYXRoLnJhbmRvbSgpKV0saVtyXT1pW29dLGlbb109bjtyZXR1cm4gaS5zbGljZShzKX0odC5mZWF0dXJlcyxlKSl9LHQuc2VjdG9yPWZ1bmN0aW9uKHQsZSxuLHIsaSl7aWYoIVAoaT1pfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbz1pLnByb3BlcnRpZXM7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjZW50ZXIgaXMgcmVxdWlyZWQiKTtpZihudWxsPT1uKXRocm93IG5ldyBFcnJvcigiYmVhcmluZzEgaXMgcmVxdWlyZWQiKTtpZihudWxsPT1yKXRocm93IG5ldyBFcnJvcigiYmVhcmluZzIgaXMgcmVxdWlyZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoInJhZGl1cyBpcyByZXF1aXJlZCIpO2lmKCJvYmplY3QiIT10eXBlb2YgaSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtpZihxaShuKT09PXFpKHIpKXJldHVybiBfbih0LGUsaSk7dmFyIHM9USh0KSxhPWJpKHQsZSxuLHIsaSksdT1bW3NdXTtyZXR1cm4gUihhLChmdW5jdGlvbih0KXt1WzBdLnB1c2godCl9KSksdVswXS5wdXNoKHMpLGwodSxvKX0sdC5zZWdtZW50RWFjaD1VLHQuc2VnbWVudFJlZHVjZT1WLHQuc2hvcnRlc3RQYXRoPWZ1bmN0aW9uKHQsZSxuKXtpZighUChuPW58fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciByPW4ucmVzb2x1dGlvbixpPW4ubWluRGlzdGFuY2Uscz1uLm9ic3RhY2xlc3x8ZihbXSk7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJzdGFydCBpcyByZXF1aXJlZCIpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiZW5kIGlzIHJlcXVpcmVkIik7aWYociYmIUMocil8fHI8PTApdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zLnJlc29sdXRpb24gbXVzdCBiZSBhIG51bWJlciwgZ3JlYXRlciB0aGFuIDAiKTtpZihpKXRocm93IG5ldyBFcnJvcigib3B0aW9ucy5taW5EaXN0YW5jZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIik7dmFyIHU9Syh0KSxsPUsoZSk7c3dpdGNoKHQ9YSh1KSxlPWEobCksaXQocykpe2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOmlmKDA9PT1zLmZlYXR1cmVzLmxlbmd0aClyZXR1cm4gaChbdSxsXSk7YnJlYWs7Y2FzZSJQb2x5Z29uIjpzPWYoW28ocnQocykpXSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgb2JzdGFjbGVzIil9dmFyIGM9cztjLmZlYXR1cmVzLnB1c2godCksYy5mZWF0dXJlcy5wdXNoKGUpO3ZhciBwPVoodHMoZ24oWihjKSksMS4xNSkpO3J8fChyPW1lKFtwWzBdLHBbMV1dLFtwWzJdLHBbMV1dLG4pLzEwMCksYy5mZWF0dXJlcy5wb3AoKSxjLmZlYXR1cmVzLnBvcCgpO2Zvcih2YXIgZz1wWzBdLGQ9cFsxXSx5PXBbMl0sdj1wWzNdLF89ci9tZShbZyxkXSxbeSxkXSxuKSooeS1nKSxtPXIvbWUoW2csZF0sW2csdl0sbikqKHYtZCkseD15LWcsRT12LWQsYj1NYXRoLmZsb29yKHgvXyksdz1NYXRoLmZsb29yKEUvbSksST0oeC1iKl8pLzIsTj1bXSxTPVtdLE09W10sTD1bXSxPPTEvMCxSPTEvMCxUPXYtKEUtdyptKS8yLEE9MDtUPj1kOyl7Zm9yKHZhciBEPVtdLEY9W10saz1nK0ksRz0wO2s8PXk7KXt2YXIgcT1hKFtrLFRdKSxCPUpzKHEscyk7RC5wdXNoKEI/MDoxKSxGLnB1c2goaysifCIrVCk7dmFyIHo9bWUocSx0KTshQiYmejxPJiYoTz16LE09e3g6Ryx5OkF9KTt2YXIgaj1tZShxLGUpOyFCJiZqPFImJihSPWosTD17eDpHLHk6QX0pLGsrPV8sRysrfVMucHVzaChEKSxOLnB1c2goRiksVC09bSxBKyt9dmFyIFU9bmV3IFlzKFMse2RpYWdvbmFsOiEwfSksVj1VLmdyaWRbTS55XVtNLnhdLFg9VS5ncmlkW0wueV1bTC54XSxZPVhzLnNlYXJjaChVLFYsWCksSD1bdV07cmV0dXJuIFkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9Tlt0LnhdW3QueV0uc3BsaXQoInwiKTtILnB1c2goWytlWzBdLCtlWzFdXSl9KSksSC5wdXNoKGwpLHRuKGgoSCkpfSx0LnNpbXBsaWZ5PWZ1bmN0aW9uKHQsZSl7aWYoIVAoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj12b2lkIDAhPT1lLnRvbGVyYW5jZT9lLnRvbGVyYW5jZToxLHI9ZS5oaWdoUXVhbGl0eXx8ITEsaT1lLm11dGF0ZXx8ITE7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7aWYobiYmbjwwKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCB0b2xlcmFuY2UiKTtyZXR1cm4hMCE9PWkmJih0PUllKHQpKSxxKHQsKGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUsbil7dmFyIHI9dC50eXBlO2lmKCJQb2ludCI9PT1yfHwiTXVsdGlQb2ludCI9PT1yKXJldHVybiB0O3RuKHQsITApO3ZhciBpPXQuY29vcmRpbmF0ZXM7c3dpdGNoKHIpe2Nhc2UiTGluZVN0cmluZyI6dC5jb29yZGluYXRlcz1sbihpLGUsbik7YnJlYWs7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnQuY29vcmRpbmF0ZXM9aS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBsbih0LGUsbil9KSk7YnJlYWs7Y2FzZSJQb2x5Z29uIjp0LmNvb3JkaW5hdGVzPWNuKGksZSxuKTticmVhaztjYXNlIk11bHRpUG9seWdvbiI6dC5jb29yZGluYXRlcz1pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGNuKHQsZSxuKX0pKX19KHQsbixyKX0pKSx0fSx0LnNxdWFyZT15bix0LnNxdWFyZUdyaWQ9cHksdC5zdGFuZGFyZERldmlhdGlvbmFsRWxsaXBzZT1mdW5jdGlvbih0LGUpe2lmKCFQKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5zdGVwc3x8NjQscj1lLndlaWdodCxpPWUucHJvcGVydGllc3x8e307aWYoIUMobikpdGhyb3cgbmV3IEVycm9yKCJzdGVwcyBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIVAoaSkpdGhyb3cgbmV3IEVycm9yKCJwcm9wZXJ0aWVzIG11c3QgYmUgYSBudW1iZXIiKTt2YXIgbz1HKHQpLmxlbmd0aCxzPUZhKHQse3dlaWdodDpyfSksYT0wLHU9MCxsPTA7Rih0LChmdW5jdGlvbih0KXt2YXIgZT10LnByb3BlcnRpZXNbcl18fDEsbj1HYShRKHQpLFEocykpO2ErPU1hdGgucG93KG4ueCwyKSplLHUrPU1hdGgucG93KG4ueSwyKSplLGwrPW4ueCpuLnkqZX0pKTt2YXIgYz1hLXUsaD1NYXRoLnNxcnQoTWF0aC5wb3coYywyKSs0Kk1hdGgucG93KGwsMikpLHA9MipsLGc9TWF0aC5hdGFuKChjK2gpL3ApLGQ9MTgwKmcvTWF0aC5QSSx5PTAsdj0wLF89MDtGKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQucHJvcGVydGllc1tyXXx8MSxuPUdhKFEodCksUShzKSk7eSs9TWF0aC5wb3cobi54Kk1hdGguY29zKGcpLW4ueSpNYXRoLnNpbihnKSwyKSplLHYrPU1hdGgucG93KG4ueCpNYXRoLnNpbihnKStuLnkqTWF0aC5jb3MoZyksMikqZSxfKz1lfSkpO3ZhciBtPU1hdGguc3FydCgyKnkvXykseD1NYXRoLnNxcnQoMip2L18pLEU9QWEocyxtLHgse3VuaXRzOiJkZWdyZWVzIixhbmdsZTpkLHN0ZXBzOm4scHJvcGVydGllczppfSksYj1fZSh0LGYoW0VdKSksdz17bWVhbkNlbnRlckNvb3JkaW5hdGVzOlEocyksc2VtaU1ham9yQXhpczptLHNlbWlNaW5vckF4aXM6eCxudW1iZXJPZkZlYXR1cmVzOm8sYW5nbGU6ZCxwZXJjZW50YWdlV2l0aGluRWxsaXBzZToxMDAqRyhiKS5sZW5ndGgvb307cmV0dXJuIEUucHJvcGVydGllcy5zdGFuZGFyZERldmlhdGlvbmFsRWxsaXBzZT13LEV9LHQudGFnPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PUllKHQpLGU9SWUoZSksRih0LChmdW5jdGlvbih0KXt0LnByb3BlcnRpZXN8fCh0LnByb3BlcnRpZXM9e30pLEYoZSwoZnVuY3Rpb24oZSl7dm9pZCAwPT09dC5wcm9wZXJ0aWVzW3JdJiZ5ZSh0LGUpJiYodC5wcm9wZXJ0aWVzW3JdPWUucHJvcGVydGllc1tuXSl9KSl9KSksdH0sdC50ZXNzZWxhdGU9ZnVuY3Rpb24odCl7aWYoIXQuZ2VvbWV0cnl8fCJQb2x5Z29uIiE9PXQuZ2VvbWV0cnkudHlwZSYmIk11bHRpUG9seWdvbiIhPT10Lmdlb21ldHJ5LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dCBtdXN0IGJlIGEgUG9seWdvbiBvciBNdWx0aVBvbHlnb24iKTt2YXIgZT17dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOltdfTtyZXR1cm4iUG9seWdvbiI9PT10Lmdlb21ldHJ5LnR5cGU/ZS5mZWF0dXJlcz1Xbih0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKTp0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuZmVhdHVyZXM9ZS5mZWF0dXJlcy5jb25jYXQoV24odCkpfSkpLGV9LHQudGluPXhlLHQudG9NZXJjYXRvcj1WYSx0LnRvV2dzODQ9WGEsdC50cmFuc2Zvcm1Sb3RhdGU9JG8sdC50cmFuc2Zvcm1TY2FsZT10cyx0LnRyYW5zZm9ybVRyYW5zbGF0ZT1mdW5jdGlvbih0LGUsbixyKXtpZighUChyPXJ8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBpPXIudW5pdHMsbz1yLnpUcmFuc2xhdGlvbixzPXIubXV0YXRlO2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO2lmKG51bGw9PWV8fGlzTmFOKGUpKXRocm93IG5ldyBFcnJvcigiZGlzdGFuY2UgaXMgcmVxdWlyZWQiKTtpZihvJiYibnVtYmVyIiE9dHlwZW9mIG8mJmlzTmFOKG8pKXRocm93IG5ldyBFcnJvcigielRyYW5zbGF0aW9uIGlzIG5vdCBhIG51bWJlciIpO2lmKG89dm9pZCAwIT09bz9vOjAsMD09PWUmJjA9PT1vKXJldHVybiB0O2lmKG51bGw9PW58fGlzTmFOKG4pKXRocm93IG5ldyBFcnJvcigiZGlyZWN0aW9uIGlzIHJlcXVpcmVkIik7cmV0dXJuIGU8MCYmKGU9LWUsbis9MTgwKSwhMSE9PXMmJnZvaWQgMCE9PXN8fCh0PUllKHQpKSxSKHQsKGZ1bmN0aW9uKHQpe3ZhciByPVEoamkodCxlLG4se3VuaXRzOml9KSk7dFswXT1yWzBdLHRbMV09clsxXSxvJiYzPT09dC5sZW5ndGgmJih0WzJdKz1vKX0pKSx0fSx0LnRyaWFuZ2xlR3JpZD1meSx0LnRydW5jYXRlPWVpLHQudW5pb249ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1ydCh0KSxpPXJ0KGUpLG89JHUudW5pb24oci5jb29yZGluYXRlcyxpLmNvb3JkaW5hdGVzKTtyZXR1cm4gMD09PW8ubGVuZ3RoP251bGw6MT09PW8ubGVuZ3RoP2wob1swXSxuLnByb3BlcnRpZXMpOnkobyxuLnByb3BlcnRpZXMpfSx0LnVuaXRzRmFjdG9ycz1yLHQudW5raW5rUG9seWdvbj1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4geih0LChmdW5jdGlvbih0KXsiUG9seWdvbiI9PT10Lmdlb21ldHJ5LnR5cGUmJkYob2kodCksKGZ1bmN0aW9uKG4pe2UucHVzaChsKG4uZ2VvbWV0cnkuY29vcmRpbmF0ZXMsdC5wcm9wZXJ0aWVzKSl9KSl9KSksZihlKX0sdC52YWxpZGF0ZUJCb3g9TSx0LnZhbGlkYXRlSWQ9TCx0LnZvcm9ub2k9ZnVuY3Rpb24odCxlKXtpZighUChlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuPWUuYmJveHx8Wy0xODAsLTg1LDE4MCw4NV07aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJwb2ludHMgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheShuKSl0aHJvdyBuZXcgRXJyb3IoImJib3ggaXMgaW52YWxpZCIpO3JldHVybiBudCh0LCJQb2ludCIsInBvaW50cyIpLGYoZnVuY3Rpb24oKXt2YXIgdD1LcyxlPVFzLG49bnVsbDtmdW5jdGlvbiByKHIpe3JldHVybiBuZXcgUmEoci5tYXAoKGZ1bmN0aW9uKG4saSl7dmFyIG89W01hdGgucm91bmQodChuLGkscikvTWEpKk1hLE1hdGgucm91bmQoZShuLGkscikvTWEpKk1hXTtyZXR1cm4gby5pbmRleD1pLG8uZGF0YT1uLG99KSksbil9cmV0dXJuIHIucG9seWdvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkucG9seWdvbnMoKX0sci5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS5saW5rcygpfSxyLnRyaWFuZ2xlcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS50cmlhbmdsZXMoKX0sci54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6WnMoK2UpLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlpzKCt0KSxyKTplfSxyLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P251bGw6W1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0scik6biYmW1tuWzBdWzBdLG5bMF1bMV1dLFtuWzFdWzBdLG5bMV1bMV1dXX0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDpbWzAsMF0sWyt0WzBdLCt0WzFdXV0scik6biYmW25bMV1bMF0tblswXVswXSxuWzFdWzFdLW5bMF1bMV1dfSxyfSgpLngoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdfSkpLnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdfSkpLmV4dGVudChbW25bMF0sblsxXV0sW25bMl0sblszXV1dKS5wb2x5Z29ucyh0LmZlYXR1cmVzKS5tYXAoVGEpKX0sdC53aXRoaW49X2UsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSkpOwo="),l.document.getElementsByTagName("head")[0].appendChild(d),l.turf}(),qm=rm()?_m:Z;function $m(l){var d=function(l){var d=ZZ(xb(l,"0",null)),b=ZZ(xb(l,"0.0",null));return 2===ZZ(xb(l,"0.0.0",null))?3:2===b?2:2===d?1:0===d?0:(console.log("invalid point depth",l),null)}(l);return 3===d?l:2===d?Fb(l,(function(l){return[l]})):1===d?[[l]]:0===d?[]:l}function lX(l){return WZ(l)?qm.area(qm.helpers.multiPolygon($m(l))):null}function dX(l){if(!WZ(l))return null;var d=qm.centroid(qm.helpers.multiPolygon($m(l)));return xb(d,"geometry.coordinates",[])}function bX(l){var d=xb(l,"geometry.geometries",[]),b=[];return al(d,(function(l){"Polygon"===l.type?b.push(l.coordinates):"MultiPolygon"===l.type&&al(l.coordinates,(function(l){b.push(l)}))})),b}function ZX(l){var d=xb(l,"geometry.type",""),b=xb(l,"geometry.coordinates",[]);return"Polygon"===d?[b]:"MultiPolygon"===d?b:"GeometryCollection"===d?bX(l):[]}function cX(l,d){return ZX(qm.difference(qm.helpers.multiPolygon($m(l)),qm.helpers.multiPolygon($m(d))))}function mX(l,d){return WZ(l)?ZX(qm.intersect(qm.helpers.multiPolygon($m(l)),qm.helpers.multiPolygon($m(d)))):null}function XX(l,d){var b=Object.keys(l);if(Object.getOwnPropertySymbols){var Z=Object.getOwnPropertySymbols(l);d&&(Z=Z.filter((function(d){return Object.getOwnPropertyDescriptor(l,d).enumerable}))),b.push.apply(b,Z)}return b}function GX(l){for(var d=1;d<arguments.length;d++){var b=null!=arguments[d]?arguments[d]:{};d%2?XX(Object(b),!0).forEach((function(d){c(l,d,b[d])})):Object.getOwnPropertyDescriptors?Object.defineProperties(l,Object.getOwnPropertyDescriptors(b)):XX(Object(b)).forEach((function(d){Object.defineProperty(l,d,Object.getOwnPropertyDescriptor(b,d))}))}return l}var WX=6378137,uX=.0066943799901413165,aX=484813681109536e-20,sX=Math.PI/2,hX=1e-10,VX=.017453292519943295,yX=57.29577951308232,pX=Math.PI/4,tX=2*Math.PI,nX=3.14159265359,iX={greenwich:0,lisbon:-9.131906111111,paris:2.337229166667,bogota:-74.080916666667,madrid:-3.687938888889,rome:12.452333333333,bern:7.439583333333,jakarta:106.807719444444,ferro:-17.666666666667,brussels:4.367975,stockholm:18.058277777778,athens:23.7163375,oslo:10.722916666667},RX={ft:{to_meter:.3048},"us-ft":{to_meter:1200/3937}},oX=/[\s_\-\/\(\)]/g;function LX(l,d){if(l[d])return l[d];for(var b,Z=Object.keys(l),c=d.toLowerCase().replace(oX,""),m=-1;++m<Z.length;)if((b=Z[m]).toLowerCase().replace(oX,"")===c)return l[b]}function KX(l){var d,b,Z,c={},m=l.split("+").map((function(l){return l.trim()})).filter((function(l){return l})).reduce((function(l,d){var b=d.split("=");return b.push(!0),l[b[0].toLowerCase()]=b[1],l}),{}),X={proj:"projName",datum:"datumCode",rf:function(l){c.rf=parseFloat(l)},lat_0:function(l){c.lat0=l*VX},lat_1:function(l){c.lat1=l*VX},lat_2:function(l){c.lat2=l*VX},lat_ts:function(l){c.lat_ts=l*VX},lon_0:function(l){c.long0=l*VX},lon_1:function(l){c.long1=l*VX},lon_2:function(l){c.long2=l*VX},alpha:function(l){c.alpha=parseFloat(l)*VX},gamma:function(l){c.rectified_grid_angle=parseFloat(l)},lonc:function(l){c.longc=l*VX},x_0:function(l){c.x0=parseFloat(l)},y_0:function(l){c.y0=parseFloat(l)},k_0:function(l){c.k0=parseFloat(l)},k:function(l){c.k0=parseFloat(l)},a:function(l){c.a=parseFloat(l)},b:function(l){c.b=parseFloat(l)},r_a:function(){c.R_A=!0},zone:function(l){c.zone=parseInt(l,10)},south:function(){c.utmSouth=!0},towgs84:function(l){c.datum_params=l.split(",").map((function(l){return parseFloat(l)}))},to_meter:function(l){c.to_meter=parseFloat(l)},units:function(l){c.units=l;var d=LX(RX,l);d&&(c.to_meter=d.to_meter)},from_greenwich:function(l){c.from_greenwich=l*VX},pm:function(l){var d=LX(iX,l);c.from_greenwich=(d||parseFloat(l))*VX},nadgrids:function(l){"@null"===l?c.datumCode="none":c.nadgrids=l},axis:function(l){var d="ewnsud";3===l.length&&-1!==d.indexOf(l.substr(0,1))&&-1!==d.indexOf(l.substr(1,1))&&-1!==d.indexOf(l.substr(2,1))&&(c.axis=l)},approx:function(){c.approx=!0}};for(d in m)b=m[d],d in X?"function"==typeof(Z=X[d])?Z(b):c[Z]=b:c[d]=b;return"string"==typeof c.datumCode&&"WGS84"!==c.datumCode&&(c.datumCode=c.datumCode.toLowerCase()),c}var HX=/\s/,xX=/[A-Za-z]/,SX=/[A-Za-z84_]/,YX=/[,\]]/,eX=/[\d\.E\-\+]/;function JX(l){if("string"!=typeof l)throw new Error("not a string");this.text=l.trim(),this.level=0,this.place=0,this.root=null,this.stack=[],this.currentObject=null,this.state=1}function zX(l,d,b){Array.isArray(d)&&(b.unshift(d),d=null);var Z=d?{}:l,c=b.reduce((function(l,d){return vX(d,l),l}),Z);d&&(l[d]=c)}function vX(l,d){if(Array.isArray(l)){var b=l.shift();if("PARAMETER"===b&&(b=l.shift()),1===l.length)return Array.isArray(l[0])?(d[b]={},void vX(l[0],d[b])):void(d[b]=l[0]);if(l.length)if("TOWGS84"!==b){if("AXIS"===b)return b in d||(d[b]=[]),void d[b].push(l);var Z;switch(Array.isArray(b)||(d[b]={}),b){case"UNIT":case"PRIMEM":case"VERT_DATUM":return d[b]={name:l[0].toLowerCase(),convert:l[1]},void(3===l.length&&vX(l[2],d[b]));case"SPHEROID":case"ELLIPSOID":return d[b]={name:l[0],a:l[1],rf:l[2]},void(4===l.length&&vX(l[3],d[b]));case"PROJECTEDCRS":case"PROJCRS":case"GEOGCS":case"GEOCCS":case"PROJCS":case"LOCAL_CS":case"GEODCRS":case"GEODETICCRS":case"GEODETICDATUM":case"EDATUM":case"ENGINEERINGDATUM":case"VERT_CS":case"VERTCRS":case"VERTICALCRS":case"COMPD_CS":case"COMPOUNDCRS":case"ENGINEERINGCRS":case"ENGCRS":case"FITTED_CS":case"LOCAL_DATUM":case"DATUM":return l[0]=["name",l[0]],void zX(d,b,l);default:for(Z=-1;++Z<l.length;)if(!Array.isArray(l[Z]))return vX(l,d[b]);return zX(d,b,l)}}else d[b]=l;else d[b]=!0}else d[l]=!0}JX.prototype.readCharicter=function(){var l=this.text[this.place++];if(4!==this.state)for(;HX.test(l);){if(this.place>=this.text.length)return;l=this.text[this.place++]}switch(this.state){case 1:return this.neutral(l);case 2:return this.keyword(l);case 4:return this.quoted(l);case 5:return this.afterquote(l);case 3:return this.number(l);case-1:return}},JX.prototype.afterquote=function(l){if('"'===l)return this.word+='"',void(this.state=4);if(YX.test(l))return this.word=this.word.trim(),void this.afterItem(l);throw new Error("havn't handled \""+l+'" in afterquote yet, index '+this.place)},JX.prototype.afterItem=function(l){return","===l?(null!==this.word&&this.currentObject.push(this.word),this.word=null,void(this.state=1)):"]"===l?(this.level--,null!==this.word&&(this.currentObject.push(this.word),this.word=null),this.state=1,this.currentObject=this.stack.pop(),void(this.currentObject||(this.state=-1))):void 0},JX.prototype.number=function(l){if(!eX.test(l)){if(YX.test(l))return this.word=parseFloat(this.word),void this.afterItem(l);throw new Error("havn't handled \""+l+'" in number yet, index '+this.place)}this.word+=l},JX.prototype.quoted=function(l){'"'!==l?this.word+=l:this.state=5},JX.prototype.keyword=function(l){if(SX.test(l))this.word+=l;else{if("["===l){var d=[];return d.push(this.word),this.level++,null===this.root?this.root=d:this.currentObject.push(d),this.stack.push(this.currentObject),this.currentObject=d,void(this.state=1)}if(!YX.test(l))throw new Error("havn't handled \""+l+'" in keyword yet, index '+this.place);this.afterItem(l)}},JX.prototype.neutral=function(l){if(xX.test(l))return this.word=l,void(this.state=2);if('"'===l)return this.word="",void(this.state=4);if(eX.test(l))return this.word=l,void(this.state=3);if(!YX.test(l))throw new Error("havn't handled \""+l+'" in neutral yet, index '+this.place);this.afterItem(l)},JX.prototype.output=function(){for(;this.place<this.text.length;)this.readCharicter();if(-1===this.state)return this.root;throw new Error('unable to parse string "'+this.text+'". State is '+this.state)};function TX(l){return.017453292519943295*l}function MX(l){var d=new JX(l).output(),b=d.shift(),Z=d.shift();d.unshift(["name",Z]),d.unshift(["type",b]);var c={};return vX(d,c),function(l){if("GEOGCS"===l.type?l.projName="longlat":"LOCAL_CS"===l.type?(l.projName="identity",l.local=!0):"object"===h(l.PROJECTION)?l.projName=Object.keys(l.PROJECTION)[0]:l.projName=l.PROJECTION,l.AXIS){for(var d="",b=0,Z=l.AXIS.length;b<Z;++b){var c=[l.AXIS[b][0].toLowerCase(),l.AXIS[b][1].toLowerCase()];-1!==c[0].indexOf("north")||("y"===c[0]||"lat"===c[0])&&"north"===c[1]?d+="n":-1!==c[0].indexOf("south")||("y"===c[0]||"lat"===c[0])&&"south"===c[1]?d+="s":-1!==c[0].indexOf("east")||("x"===c[0]||"lon"===c[0])&&"east"===c[1]?d+="e":-1===c[0].indexOf("west")&&("x"!==c[0]&&"lon"!==c[0]||"west"!==c[1])||(d+="w")}2===d.length&&(d+="u"),3===d.length&&(l.axis=d)}l.UNIT&&(l.units=l.UNIT.name.toLowerCase(),"metre"===l.units&&(l.units="meter"),l.UNIT.convert&&("GEOGCS"===l.type?l.DATUM&&l.DATUM.SPHEROID&&(l.to_meter=l.UNIT.convert*l.DATUM.SPHEROID.a):l.to_meter=l.UNIT.convert));var m=l.GEOGCS;function X(d){return d*(l.to_meter||1)}"GEOGCS"===l.type&&(m=l),m&&(m.DATUM?l.datumCode=m.DATUM.name.toLowerCase():l.datumCode=m.name.toLowerCase(),"d_"===l.datumCode.slice(0,2)&&(l.datumCode=l.datumCode.slice(2)),"new_zealand_geodetic_datum_1949"!==l.datumCode&&"new_zealand_1949"!==l.datumCode||(l.datumCode="nzgd49"),"wgs_1984"!==l.datumCode&&"world_geodetic_system_1984"!==l.datumCode||("Mercator_Auxiliary_Sphere"===l.PROJECTION&&(l.sphere=!0),l.datumCode="wgs84"),"_ferro"===l.datumCode.slice(-6)&&(l.datumCode=l.datumCode.slice(0,-6)),"_jakarta"===l.datumCode.slice(-8)&&(l.datumCode=l.datumCode.slice(0,-8)),~l.datumCode.indexOf("belge")&&(l.datumCode="rnb72"),m.DATUM&&m.DATUM.SPHEROID&&(l.ellps=m.DATUM.SPHEROID.name.replace("_19","").replace(/[Cc]larke\_18/,"clrk"),"international"===l.ellps.toLowerCase().slice(0,13)&&(l.ellps="intl"),l.a=m.DATUM.SPHEROID.a,l.rf=parseFloat(m.DATUM.SPHEROID.rf,10)),m.DATUM&&m.DATUM.TOWGS84&&(l.datum_params=m.DATUM.TOWGS84),~l.datumCode.indexOf("osgb_1936")&&(l.datumCode="osgb36"),~l.datumCode.indexOf("osni_1952")&&(l.datumCode="osni52"),(~l.datumCode.indexOf("tm65")||~l.datumCode.indexOf("geodetic_datum_of_1965"))&&(l.datumCode="ire65"),"ch1903+"===l.datumCode&&(l.datumCode="ch1903"),~l.datumCode.indexOf("israel")&&(l.datumCode="isr93")),l.b&&!isFinite(l.b)&&(l.b=l.a),[["standard_parallel_1","Standard_Parallel_1"],["standard_parallel_1","Latitude of 1st standard parallel"],["standard_parallel_2","Standard_Parallel_2"],["standard_parallel_2","Latitude of 2nd standard parallel"],["false_easting","False_Easting"],["false_easting","False easting"],["false-easting","Easting at false origin"],["false_northing","False_Northing"],["false_northing","False northing"],["false_northing","Northing at false origin"],["central_meridian","Central_Meridian"],["central_meridian","Longitude of natural origin"],["central_meridian","Longitude of false origin"],["latitude_of_origin","Latitude_Of_Origin"],["latitude_of_origin","Central_Parallel"],["latitude_of_origin","Latitude of natural origin"],["latitude_of_origin","Latitude of false origin"],["scale_factor","Scale_Factor"],["k0","scale_factor"],["latitude_of_center","Latitude_Of_Center"],["latitude_of_center","Latitude_of_center"],["lat0","latitude_of_center",TX],["longitude_of_center","Longitude_Of_Center"],["longitude_of_center","Longitude_of_center"],["longc","longitude_of_center",TX],["x0","false_easting",X],["y0","false_northing",X],["long0","central_meridian",TX],["lat0","latitude_of_origin",TX],["lat0","standard_parallel_1",TX],["lat1","standard_parallel_1",TX],["lat2","standard_parallel_2",TX],["azimuth","Azimuth"],["alpha","azimuth",TX],["srsCode","name"]].forEach((function(d){return function(l,d){var b=d[0],Z=d[1];!(b in l)&&Z in l&&(l[b]=l[Z],3===d.length&&(l[b]=d[2](l[b])))}(l,d)})),l.long0||!l.longc||"Albers_Conic_Equal_Area"!==l.projName&&"Lambert_Azimuthal_Equal_Area"!==l.projName||(l.long0=l.longc),l.lat_ts||!l.lat1||"Stereographic_South_Pole"!==l.projName&&"Polar Stereographic (variant B)"!==l.projName||(l.lat0=TX(l.lat1>0?90:-90),l.lat_ts=l.lat1)}(c),c}function CX(l){var d=this;if(2===arguments.length){var b=arguments[1];"string"==typeof b?"+"===b.charAt(0)?CX[l]=KX(arguments[1]):CX[l]=MX(arguments[1]):CX[l]=b}else if(1===arguments.length){if(Array.isArray(l))return l.map((function(l){Array.isArray(l)?CX.apply(d,l):CX(l)}));if("string"==typeof l){if(l in CX)return CX[l]}else"EPSG"in l?CX["EPSG:"+l.EPSG]=l:"ESRI"in l?CX["ESRI:"+l.ESRI]=l:"IAU2000"in l?CX["IAU2000:"+l.IAU2000]=l:console.log(l);return}}!function(l){l("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),l("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),l("EPSG:3857","+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"),l.WGS84=l["EPSG:4326"],l["EPSG:3785"]=l["EPSG:3857"],l.GOOGLE=l["EPSG:3857"],l["EPSG:900913"]=l["EPSG:3857"],l["EPSG:102113"]=l["EPSG:3857"]}(CX);var FX=["PROJECTEDCRS","PROJCRS","GEOGCS","GEOCCS","PROJCS","LOCAL_CS","GEODCRS","GEODETICCRS","GEODETICDATUM","ENGCRS","ENGINEERINGCRS"];var IX=["3857","900913","3785","102113"];function kX(l){if(!function(l){return"string"==typeof l}(l))return l;if(function(l){return l in CX}(l))return CX[l];if(function(l){return FX.some((function(d){return l.indexOf(d)>-1}))}(l)){var d=MX(l);if(function(l){var d=LX(l,"authority");if(d){var b=LX(d,"epsg");return b&&IX.indexOf(b)>-1}}(d))return CX["EPSG:3857"];var b=function(l){var d=LX(l,"extension");if(d)return LX(d,"proj4")}(d);return b?KX(b):d}return function(l){return"+"===l[0]}(l)?KX(l):void 0}function NX(l,d){var b,Z;if(l=l||{},!d)return l;for(Z in d)void 0!==(b=d[Z])&&(l[Z]=b);return l}function gX(l,d,b){var Z=l*d;return b/Math.sqrt(1-Z*Z)}function PX(l){return l<0?-1:1}function BX(l){return Math.abs(l)<=nX?l:l-PX(l)*tX}function wX(l,d,b){var Z=l*b,c=.5*l;return Z=Math.pow((1-Z)/(1+Z),c),Math.tan(.5*(sX-d))/Z}function UX(l,d){for(var b,Z,c=.5*l,m=sX-2*Math.atan(d),X=0;X<=15;X++)if(b=l*Math.sin(m),m+=Z=sX-2*Math.atan(d*Math.pow((1-b)/(1+b),c))-m,Math.abs(Z)<=1e-10)return m;return-9999}function rX(l){return l}var QX=[{init:function(){var l=this.b/this.a;this.es=1-l*l,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.sphere?this.k0=Math.cos(this.lat_ts):this.k0=gX(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k?this.k0=this.k:this.k0=1)},forward:function(l){var d,b,Z=l.x,c=l.y;if(c*yX>90&&c*yX<-90&&Z*yX>180&&Z*yX<-180)return null;if(Math.abs(Math.abs(c)-sX)<=hX)return null;if(this.sphere)d=this.x0+this.a*this.k0*BX(Z-this.long0),b=this.y0+this.a*this.k0*Math.log(Math.tan(pX+.5*c));else{var m=Math.sin(c),X=wX(this.e,c,m);d=this.x0+this.a*this.k0*BX(Z-this.long0),b=this.y0-this.a*this.k0*Math.log(X)}return l.x=d,l.y=b,l},inverse:function(l){var d,b,Z=l.x-this.x0,c=l.y-this.y0;if(this.sphere)b=sX-2*Math.atan(Math.exp(-c/(this.a*this.k0)));else{var m=Math.exp(-c/(this.a*this.k0));if(-9999===(b=UX(this.e,m)))return null}return d=BX(this.long0+Z/(this.a*this.k0)),l.x=d,l.y=b,l},names:["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{init:function(){},forward:rX,inverse:rX,names:["longlat","identity"]}],jX={},fX=[];function EX(l,d){var b=fX.length;return l.names?(fX[b]=l,l.names.forEach((function(l){jX[l.toLowerCase()]=b})),this):(console.log(d),!0)}var OX={start:function(){QX.forEach(EX)},add:EX,get:function(l){if(!l)return!1;var d=l.toLowerCase();return void 0!==jX[d]&&fX[jX[d]]?fX[jX[d]]:void 0}},DX={MERIT:{a:6378137,rf:298.257,ellipseName:"MERIT 1983"},SGS85:{a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},GRS80:{a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},IAU76:{a:6378140,rf:298.257,ellipseName:"IAU 1976"},airy:{a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},APL4:{a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},NWL9D:{a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},mod_airy:{a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},andrae:{a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},aust_SA:{a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},GRS67:{a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},bessel:{a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},bess_nam:{a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},clrk66:{a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},clrk80:{a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},clrk58:{a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},CPM:{a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},delmbr:{a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},engelis:{a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},evrst30:{a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},evrst48:{a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},evrst56:{a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},evrst69:{a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},evrstSS:{a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},fschr60:{a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},fschr60m:{a:6378155,rf:298.3,ellipseName:"Fischer 1960"},fschr68:{a:6378150,rf:298.3,ellipseName:"Fischer 1968"},helmert:{a:6378200,rf:298.3,ellipseName:"Helmert 1906"},hough:{a:6378270,rf:297,ellipseName:"Hough"},intl:{a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},kaula:{a:6378163,rf:298.24,ellipseName:"Kaula 1961"},lerch:{a:6378139,rf:298.257,ellipseName:"Lerch 1979"},mprts:{a:6397300,rf:191,ellipseName:"Maupertius 1738"},new_intl:{a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},plessis:{a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},krass:{a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},SEasia:{a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},walbeck:{a:6376896,b:6355834.8467,ellipseName:"Walbeck"},WGS60:{a:6378165,rf:298.3,ellipseName:"WGS 60"},WGS66:{a:6378145,rf:298.25,ellipseName:"WGS 66"},WGS7:{a:6378135,rf:298.26,ellipseName:"WGS 72"}},AX=DX.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"};DX.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"};var _X={};_X.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},_X.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},_X.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},_X.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},_X.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},_X.potsdam={towgs84:"598.1,73.7,418.2,0.202,0.045,-2.455,6.7",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},_X.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},_X.hermannskogel={towgs84:"577.326,90.129,463.919,5.137,1.474,5.297,2.4232",ellipse:"bessel",datumName:"Hermannskogel"},_X.osni52={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"airy",datumName:"Irish National"},_X.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},_X.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},_X.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},_X.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},_X.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},_X.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},_X.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},_X.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"};var qX={};function $X(l){if(0===l.length)return null;var d="@"===l[0];return d&&(l=l.slice(1)),"null"===l?{name:"null",mandatory:!d,grid:null,isNull:!0}:{name:l,mandatory:!d,grid:qX[l]||null,isNull:!1}}function lG(l){return l/3600*Math.PI/180}function dG(l,d,b){return String.fromCharCode.apply(null,new Uint8Array(l.buffer.slice(d,b)))}function bG(l){return l.map((function(l){return[lG(l.longitudeShift),lG(l.latitudeShift)]}))}function ZG(l,d,b){return{name:dG(l,d+8,d+16).trim(),parent:dG(l,d+24,d+24+8).trim(),lowerLatitude:l.getFloat64(d+72,b),upperLatitude:l.getFloat64(d+88,b),lowerLongitude:l.getFloat64(d+104,b),upperLongitude:l.getFloat64(d+120,b),latitudeInterval:l.getFloat64(d+136,b),longitudeInterval:l.getFloat64(d+152,b),gridNodeCount:l.getInt32(d+168,b)}}function cG(l,d,b,Z){for(var c=d+176,m=[],X=0;X<b.gridNodeCount;X++){var G={latitudeShift:l.getFloat32(c+16*X,Z),longitudeShift:l.getFloat32(c+16*X+4,Z),latitudeAccuracy:l.getFloat32(c+16*X+8,Z),longitudeAccuracy:l.getFloat32(c+16*X+12,Z)};m.push(G)}return m}function mG(l,d){if(!(this instanceof mG))return new mG(l);d=d||function(l){if(l)throw l};var b=kX(l);if("object"===h(b)){var Z=mG.projections.get(b.projName);if(Z){if(b.datumCode&&"none"!==b.datumCode){var c=LX(_X,b.datumCode);c&&(b.datum_params=b.datum_params||(c.towgs84?c.towgs84.split(","):null),b.ellps=c.ellipse,b.datumName=c.datumName?c.datumName:b.datumCode)}b.k0=b.k0||1,b.axis=b.axis||"enu",b.ellps=b.ellps||"wgs84",b.lat1=b.lat1||b.lat0;var m,X,G,W,u,a,s,V=function(l,d,b,Z,c){if(!l){var m=LX(DX,Z);m||(m=AX),l=m.a,d=m.b,b=m.rf}return b&&!d&&(d=(1-1/b)*l),(0===b||Math.abs(l-d)<hX)&&(c=!0,d=l),{a:l,b:d,rf:b,sphere:c}}(b.a,b.b,b.rf,b.ellps,b.sphere),y=(m=V.a,X=V.b,V.rf,G=b.R_A,a=((W=m*m)-(u=X*X))/W,s=0,G?(W=(m*=1-a*(.16666666666666666+a*(.04722222222222222+.022156084656084655*a)))*m,a=0):s=Math.sqrt(a),{es:a,e:s,ep2:(W-u)/u}),p=function(l){return void 0===l?null:l.split(",").map($X)}(b.nadgrids),t=b.datum||function(l,d,b,Z,c,m,X){var G={};return G.datum_type=void 0===l||"none"===l?5:4,d&&(G.datum_params=d.map(parseFloat),0===G.datum_params[0]&&0===G.datum_params[1]&&0===G.datum_params[2]||(G.datum_type=1),G.datum_params.length>3&&(0===G.datum_params[3]&&0===G.datum_params[4]&&0===G.datum_params[5]&&0===G.datum_params[6]||(G.datum_type=2,G.datum_params[3]*=aX,G.datum_params[4]*=aX,G.datum_params[5]*=aX,G.datum_params[6]=G.datum_params[6]/1e6+1))),X&&(G.datum_type=3,G.grids=X),G.a=b,G.b=Z,G.es=c,G.ep2=m,G}(b.datumCode,b.datum_params,V.a,V.b,y.es,y.ep2,p);NX(this,b),NX(this,Z),this.a=V.a,this.b=V.b,this.rf=V.rf,this.sphere=V.sphere,this.es=y.es,this.e=y.e,this.ep2=y.ep2,this.datum=t,this.init(),d(null,this)}else d(l)}else d(l)}function XG(l,d,b){var Z,c,m,X,G=l.x,W=l.y,u=l.z?l.z:0;if(W<-sX&&W>-1.001*sX)W=-sX;else if(W>sX&&W<1.001*sX)W=sX;else{if(W<-sX)return{x:-1/0,y:-1/0,z:l.z};if(W>sX)return{x:1/0,y:1/0,z:l.z}}return G>Math.PI&&(G-=2*Math.PI),c=Math.sin(W),X=Math.cos(W),m=c*c,{x:((Z=b/Math.sqrt(1-d*m))+u)*X*Math.cos(G),y:(Z+u)*X*Math.sin(G),z:(Z*(1-d)+u)*c}}function GG(l,d,b,Z){var c,m,X,G,W,u,a,s,h,V,y,p,t,n,i,R=1e-12,o=l.x,L=l.y,K=l.z?l.z:0;if(c=Math.sqrt(o*o+L*L),m=Math.sqrt(o*o+L*L+K*K),c/b<R){if(n=0,m/b<R)return sX,i=-Z,{x:l.x,y:l.y,z:l.z}}else n=Math.atan2(L,o);X=K/m,s=(G=c/m)*(1-d)*(W=1/Math.sqrt(1-d*(2-d)*G*G)),h=X*W,t=0;do{t++,u=d*(a=b/Math.sqrt(1-d*h*h))/(a+(i=c*s+K*h-a*(1-d*h*h))),p=(y=X*(W=1/Math.sqrt(1-u*(2-u)*G*G)))*s-(V=G*(1-u)*W)*h,s=V,h=y}while(p*p>1e-24&&t<30);return{x:n,y:Math.atan(y/Math.abs(V)),z:i}}function WG(l){return 1===l||2===l}function uG(l,d,b){if(function(l,d){return l.datum_type===d.datum_type&&!(l.a!==d.a||Math.abs(l.es-d.es)>5e-11)&&(1===l.datum_type?l.datum_params[0]===d.datum_params[0]&&l.datum_params[1]===d.datum_params[1]&&l.datum_params[2]===d.datum_params[2]:2!==l.datum_type||l.datum_params[0]===d.datum_params[0]&&l.datum_params[1]===d.datum_params[1]&&l.datum_params[2]===d.datum_params[2]&&l.datum_params[3]===d.datum_params[3]&&l.datum_params[4]===d.datum_params[4]&&l.datum_params[5]===d.datum_params[5]&&l.datum_params[6]===d.datum_params[6])}(l,d))return b;if(5===l.datum_type||5===d.datum_type)return b;var Z=l.a,c=l.es;if(3===l.datum_type){if(0!==aG(l,!1,b))return;Z=WX,c=uX}var m=d.a,X=d.b,G=d.es;if(3===d.datum_type&&(m=WX,X=6356752.314,G=uX),c===G&&Z===m&&!WG(l.datum_type)&&!WG(d.datum_type))return b;if((b=XG(b,c,Z),WG(l.datum_type)&&(b=function(l,d,b){if(1===d)return{x:l.x+b[0],y:l.y+b[1],z:l.z+b[2]};if(2===d){var Z=b[0],c=b[1],m=b[2],X=b[3],G=b[4],W=b[5],u=b[6];return{x:u*(l.x-W*l.y+G*l.z)+Z,y:u*(W*l.x+l.y-X*l.z)+c,z:u*(-G*l.x+X*l.y+l.z)+m}}}(b,l.datum_type,l.datum_params)),WG(d.datum_type)&&(b=function(l,d,b){if(1===d)return{x:l.x-b[0],y:l.y-b[1],z:l.z-b[2]};if(2===d){var Z=b[0],c=b[1],m=b[2],X=b[3],G=b[4],W=b[5],u=b[6],a=(l.x-Z)/u,s=(l.y-c)/u,h=(l.z-m)/u;return{x:a+W*s-G*h,y:-W*a+s+X*h,z:G*a-X*s+h}}}(b,d.datum_type,d.datum_params)),b=GG(b,G,m,X),3===d.datum_type)&&0!==aG(d,!0,b))return;return b}function aG(l,d,b){if(null===l.grids||0===l.grids.length)return console.log("Grid shift grids not found"),-1;for(var Z={x:-b.x,y:b.y},c={x:Number.NaN,y:Number.NaN},m=[],X=0;X<l.grids.length;X++){var G=l.grids[X];if(m.push(G.name),G.isNull){c=Z;break}if(null!==G.grid){var W=G.grid.subgrids[0],u=(Math.abs(W.del[1])+Math.abs(W.del[0]))/1e4,a=W.ll[0]-u,s=W.ll[1]-u,h=W.ll[0]+(W.lim[0]-1)*W.del[0]+u,V=W.ll[1]+(W.lim[1]-1)*W.del[1]+u;if(!(s>Z.y||a>Z.x||V<Z.y||h<Z.x||(c=sG(Z,d,W),isNaN(c.x))))break}else if(G.mandatory)return console.log("Unable to find mandatory grid '"+G.name+"'"),-1}return isNaN(c.x)?(console.log("Failed to find a grid shift table for location '"+-Z.x*yX+" "+Z.y*yX+" tried: '"+m+"'"),-1):(b.x=-c.x,b.y=c.y,0)}function sG(l,d,b){var Z={x:Number.NaN,y:Number.NaN};if(isNaN(l.x))return Z;var c={x:l.x,y:l.y};c.x-=b.ll[0],c.y-=b.ll[1],c.x=BX(c.x-Math.PI)+Math.PI;var m=hG(c,b);if(d){if(isNaN(m.x))return Z;m.x=c.x-m.x,m.y=c.y-m.y;var X,G,W=9;do{if(G=hG(m,b),isNaN(G.x)){console.log("Inverse grid shift iteration failed, presumably at grid edge. Using first approximation.");break}X={x:c.x-(G.x+m.x),y:c.y-(G.y+m.y)},m.x+=X.x,m.y+=X.y}while(W--&&Math.abs(X.x)>1e-12&&Math.abs(X.y)>1e-12);if(W<0)return console.log("Inverse grid shift iterator failed to converge."),Z;Z.x=BX(m.x+b.ll[0]),Z.y=m.y+b.ll[1]}else isNaN(m.x)||(Z.x=l.x+m.x,Z.y=l.y+m.y);return Z}function hG(l,d){var b,Z={x:l.x/d.del[0],y:l.y/d.del[1]},c=Math.floor(Z.x),m=Math.floor(Z.y),X=Z.x-1*c,G=Z.y-1*m,W={x:Number.NaN,y:Number.NaN};if(c<0||c>=d.lim[0])return W;if(m<0||m>=d.lim[1])return W;b=m*d.lim[0]+c;var u=d.cvs[b][0],a=d.cvs[b][1];b++;var s=d.cvs[b][0],h=d.cvs[b][1];b+=d.lim[0];var V=d.cvs[b][0],y=d.cvs[b][1];b--;var p=d.cvs[b][0],t=d.cvs[b][1],n=X*G,i=X*(1-G),R=(1-X)*(1-G),o=(1-X)*G;return W.x=R*u+i*s+o*p+n*V,W.y=R*a+i*h+o*t+n*y,W}function VG(l,d,b){var Z,c,m,X=b.x,G=b.y,W=b.z||0,u={};for(m=0;m<3;m++)if(!d||2!==m||void 0!==b.z)switch(0===m?(Z=X,c=-1!=="ew".indexOf(l.axis[m])?"x":"y"):1===m?(Z=G,c=-1!=="ns".indexOf(l.axis[m])?"y":"x"):(Z=W,c="z"),l.axis[m]){case"e":case"n":u[c]=Z;break;case"w":case"s":u[c]=-Z;break;case"u":void 0!==b[c]&&(u.z=Z);break;case"d":void 0!==b[c]&&(u.z=-Z);break;default:return null}return u}function yG(l){var d={x:l[0],y:l[1]};return l.length>2&&(d.z=l[2]),l.length>3&&(d.m=l[3]),d}function pG(l){if("function"==typeof Number.isFinite){if(Number.isFinite(l))return;throw new TypeError("coordinates must be finite numbers")}if("number"!=typeof l||l!=l||!isFinite(l))throw new TypeError("coordinates must be finite numbers")}function tG(l,d,b,Z){var c;if(Array.isArray(b)&&(b=yG(b)),function(l){pG(l.x),pG(l.y)}(b),l.datum&&d.datum&&function(l,d){return(1===l.datum.datum_type||2===l.datum.datum_type)&&"WGS84"!==d.datumCode||(1===d.datum.datum_type||2===d.datum.datum_type)&&"WGS84"!==l.datumCode}(l,d)&&(b=tG(l,c=new mG("WGS84"),b,Z),l=c),Z&&"enu"!==l.axis&&(b=VG(l,!1,b)),"longlat"===l.projName)b={x:b.x*VX,y:b.y*VX,z:b.z||0};else if(l.to_meter&&(b={x:b.x*l.to_meter,y:b.y*l.to_meter,z:b.z||0}),!(b=l.inverse(b)))return;if(l.from_greenwich&&(b.x+=l.from_greenwich),b=uG(l.datum,d.datum,b))return d.from_greenwich&&(b={x:b.x-d.from_greenwich,y:b.y,z:b.z||0}),"longlat"===d.projName?b={x:b.x*yX,y:b.y*yX,z:b.z||0}:(b=d.forward(b),d.to_meter&&(b={x:b.x/d.to_meter,y:b.y/d.to_meter,z:b.z||0})),Z&&"enu"!==d.axis?VG(d,!0,b):b}mG.projections=OX,mG.projections.start();var nG=mG("WGS84");function iG(l,d,b,Z){var c,m,X;return Array.isArray(b)?(c=tG(l,d,b,Z)||{x:NaN,y:NaN},b.length>2?void 0!==l.name&&"geocent"===l.name||void 0!==d.name&&"geocent"===d.name?"number"==typeof c.z?[c.x,c.y,c.z].concat(b.splice(3)):[c.x,c.y,b[2]].concat(b.splice(3)):[c.x,c.y].concat(b.splice(2)):[c.x,c.y]):(m=tG(l,d,b,Z),2===(X=Object.keys(b)).length||X.forEach((function(Z){if(void 0!==l.name&&"geocent"===l.name||void 0!==d.name&&"geocent"===d.name){if("x"===Z||"y"===Z||"z"===Z)return}else if("x"===Z||"y"===Z)return;m[Z]=b[Z]})),m)}function RG(l){return l instanceof mG?l:l.oProj?l.oProj:mG(l)}function oG(l,d,b){l=RG(l);var Z,c=!1;return void 0===d?(d=l,l=nG,c=!0):(void 0!==d.x||Array.isArray(d))&&(b=d,d=l,l=nG,c=!0),d=RG(d),b?iG(l,d,b):(Z={forward:function(b,Z){return iG(l,d,b,Z)},inverse:function(b,Z){return iG(d,l,b,Z)}},c&&(Z.oProj=d),Z)}var LG="AJSAJS",KG="AFAFAF",HG=65,xG=73,SG=79,YG=86,eG=90,JG={forward:zG,inverse:function(l){var d=CG(kG(l.toUpperCase()));if(d.lat&&d.lon)return[d.lon,d.lat,d.lon,d.lat];return[d.left,d.bottom,d.right,d.top]},toPoint:vG};function zG(l,d){return d=d||5,function(l,d){var b="00000"+l.easting,Z="00000"+l.northing;return l.zoneNumber+l.zoneLetter+(V=l.easting,y=l.northing,p=l.zoneNumber,t=IG(p),n=Math.floor(V/1e5),i=Math.floor(y/1e5)%20,c=n,m=i,X=t,G=X-1,W=LG.charCodeAt(G),u=KG.charCodeAt(G),a=W+c-1,s=u+m,h=!1,a>eG&&(a=a-eG+HG-1,h=!0),(a===xG||W<xG&&a>xG||(a>xG||W<xG)&&h)&&a++,(a===SG||W<SG&&a>SG||(a>SG||W<SG)&&h)&&++a===xG&&a++,a>eG&&(a=a-eG+HG-1),s>YG?(s=s-YG+HG-1,h=!0):h=!1,(s===xG||u<xG&&s>xG||(s>xG||u<xG)&&h)&&s++,(s===SG||u<SG&&s>SG||(s>SG||u<SG)&&h)&&++s===xG&&s++,s>YG&&(s=s-YG+HG-1),String.fromCharCode(a)+String.fromCharCode(s))+b.substr(b.length-5,d)+Z.substr(Z.length-5,d);var c,m,X,G,W,u,a,s,h;var V,y,p,t,n,i}(function(l){var d,b,Z,c,m,X,G,W,u=l.lat,a=l.lon,s=6378137,h=.00669438,V=.9996,y=TG(u),p=TG(a);W=Math.floor((a+180)/6)+1,180===a&&(W=60);u>=56&&u<64&&a>=3&&a<12&&(W=32);u>=72&&u<84&&(a>=0&&a<9?W=31:a>=9&&a<21?W=33:a>=21&&a<33?W=35:a>=33&&a<42&&(W=37));G=TG(6*(W-1)-180+3),d=h/(1-h),b=s/Math.sqrt(1-h*Math.sin(y)*Math.sin(y)),Z=Math.tan(y)*Math.tan(y),c=d*Math.cos(y)*Math.cos(y),m=Math.cos(y)*(p-G),X=s*((1-h/4-3*h*h/64-5*h*h*h/256)*y-(3*h/8+3*h*h/32+45*h*h*h/1024)*Math.sin(2*y)+(15*h*h/256+45*h*h*h/1024)*Math.sin(4*y)-35*h*h*h/3072*Math.sin(6*y));var t=V*b*(m+(1-Z+c)*m*m*m/6+(5-18*Z+Z*Z+72*c-58*d)*m*m*m*m*m/120)+5e5,n=V*(X+b*Math.tan(y)*(m*m/2+(5-Z+9*c+4*c*c)*m*m*m*m/24+(61-58*Z+Z*Z+600*c-330*d)*m*m*m*m*m*m/720));u<0&&(n+=1e7);return{northing:Math.round(n),easting:Math.round(t),zoneNumber:W,zoneLetter:FG(u)}}({lat:l[1],lon:l[0]}),d)}function vG(l){var d=CG(kG(l.toUpperCase()));return d.lat&&d.lon?[d.lon,d.lat]:[(d.left+d.right)/2,(d.top+d.bottom)/2]}function TG(l){return l*(Math.PI/180)}function MG(l){return l/Math.PI*180}function CG(l){var d=l.northing,b=l.easting,Z=l.zoneLetter,c=l.zoneNumber;if(c<0||c>60)return null;var m,X,G,W,u,a,s,h,V,y=.9996,p=6378137,t=.00669438,n=(1-Math.sqrt(.99330562))/(1+Math.sqrt(.99330562)),i=b-5e5,R=d;Z<"N"&&(R-=1e7),s=6*(c-1)-180+3,m=.006739496752268451,V=(h=R/y/6367449.145945056)+(3*n/2-27*n*n*n/32)*Math.sin(2*h)+(21*n*n/16-55*n*n*n*n/32)*Math.sin(4*h)+151*n*n*n/96*Math.sin(6*h),X=p/Math.sqrt(1-t*Math.sin(V)*Math.sin(V)),G=Math.tan(V)*Math.tan(V),W=m*Math.cos(V)*Math.cos(V),u=.99330562*p/Math.pow(1-t*Math.sin(V)*Math.sin(V),1.5),a=i/(X*y);var o=V-X*Math.tan(V)/u*(a*a/2-(5+3*G+10*W-4*W*W-9*m)*a*a*a*a/24+(61+90*G+298*W+45*G*G-1.6983531815716497-3*W*W)*a*a*a*a*a*a/720);o=MG(o);var L,K=(a-(1+2*G+W)*a*a*a/6+(5-2*W+28*G-3*W*W+8*m+24*G*G)*a*a*a*a*a/120)/Math.cos(V);if(K=s+MG(K),l.accuracy){var H=CG({northing:l.northing+l.accuracy,easting:l.easting+l.accuracy,zoneLetter:l.zoneLetter,zoneNumber:l.zoneNumber});L={top:H.lat,right:H.lon,bottom:o,left:K}}else L={lat:o,lon:K};return L}function FG(l){var d="Z";return 84>=l&&l>=72?d="X":72>l&&l>=64?d="W":64>l&&l>=56?d="V":56>l&&l>=48?d="U":48>l&&l>=40?d="T":40>l&&l>=32?d="S":32>l&&l>=24?d="R":24>l&&l>=16?d="Q":16>l&&l>=8?d="P":8>l&&l>=0?d="N":0>l&&l>=-8?d="M":-8>l&&l>=-16?d="L":-16>l&&l>=-24?d="K":-24>l&&l>=-32?d="J":-32>l&&l>=-40?d="H":-40>l&&l>=-48?d="G":-48>l&&l>=-56?d="F":-56>l&&l>=-64?d="E":-64>l&&l>=-72?d="D":-72>l&&l>=-80&&(d="C"),d}function IG(l){var d=l%6;return 0===d&&(d=6),d}function kG(l){if(l&&0===l.length)throw"MGRSPoint coverting from nothing";for(var d,b=l.length,Z=null,c="",m=0;!/[A-Z]/.test(d=l.charAt(m));){if(m>=2)throw"MGRSPoint bad conversion from: "+l;c+=d,m++}var X=parseInt(c,10);if(0===m||m+3>b)throw"MGRSPoint bad conversion from: "+l;var G=l.charAt(m++);if(G<="A"||"B"===G||"Y"===G||G>="Z"||"I"===G||"O"===G)throw"MGRSPoint zone letter "+G+" not handled: "+l;Z=l.substring(m,m+=2);for(var W=IG(X),u=function(l,d){var b=LG.charCodeAt(d-1),Z=1e5,c=!1;for(;b!==l.charCodeAt(0);){if(++b===xG&&b++,b===SG&&b++,b>eG){if(c)throw"Bad character: "+l;b=HG,c=!0}Z+=1e5}return Z}(Z.charAt(0),W),a=function(l,d){if(l>"V")throw"MGRSPoint given invalid Northing "+l;var b=KG.charCodeAt(d-1),Z=0,c=!1;for(;b!==l.charCodeAt(0);){if(++b===xG&&b++,b===SG&&b++,b>YG){if(c)throw"Bad character: "+l;b=HG,c=!0}Z+=1e5}return Z}(Z.charAt(1),W);a<NG(G);)a+=2e6;var s=b-m;if(s%2!=0)throw"MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters"+l;var h,V,y,p=s/2,t=0,n=0;return p>0&&(h=1e5/Math.pow(10,p),V=l.substring(m,m+p),t=parseFloat(V)*h,y=l.substring(m+p),n=parseFloat(y)*h),{easting:t+u,northing:n+a,zoneLetter:G,zoneNumber:X,accuracy:h}}function NG(l){var d;switch(l){case"C":d=11e5;break;case"D":d=2e6;break;case"E":d=28e5;break;case"F":d=37e5;break;case"G":d=46e5;break;case"H":d=55e5;break;case"J":d=64e5;break;case"K":d=73e5;break;case"L":d=82e5;break;case"M":d=91e5;break;case"N":d=0;break;case"P":d=8e5;break;case"Q":d=17e5;break;case"R":d=26e5;break;case"S":d=35e5;break;case"T":d=44e5;break;case"U":d=53e5;break;case"V":d=62e5;break;case"W":d=7e6;break;case"X":d=79e5;break;default:d=-1}if(d>=0)return d;throw"Invalid zone letter: "+l}function gG(l,d,b){if(!(this instanceof gG))return new gG(l,d,b);if(Array.isArray(l))this.x=l[0],this.y=l[1],this.z=l[2]||0;else if("object"===h(l))this.x=l.x,this.y=l.y,this.z=l.z||0;else if("string"==typeof l&&void 0===d){var Z=l.split(",");this.x=parseFloat(Z[0],10),this.y=parseFloat(Z[1],10),this.z=parseFloat(Z[2],10)||0}else this.x=l,this.y=d,this.z=b||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}gG.fromMGRS=function(l){return new gG(vG(l))},gG.prototype.toMGRS=function(l){return zG([this.x,this.y],l)};var PG=.046875,BG=.01953125,wG=.01068115234375;function UG(l){var d=[];d[0]=1-l*(.25+l*(PG+l*(BG+l*wG))),d[1]=l*(.75-l*(PG+l*(BG+l*wG)));var b=l*l;return d[2]=b*(.46875-l*(.013020833333333334+.007120768229166667*l)),b*=l,d[3]=b*(.3645833333333333-.005696614583333333*l),d[4]=b*l*.3076171875,d}function rG(l,d,b,Z){return b*=d,d*=d,Z[0]*l-b*(Z[1]+d*(Z[2]+d*(Z[3]+d*Z[4])))}function QG(l,d,b){for(var Z=1/(1-d),c=l,m=20;m;--m){var X=Math.sin(c),G=1-d*X*X;if(c-=G=(rG(c,X,Math.cos(c),b)-l)*(G*Math.sqrt(G))*Z,Math.abs(G)<hX)return c}return c}var jG={init:function(){this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.es&&(this.en=UG(this.es),this.ml0=rG(this.lat0,Math.sin(this.lat0),Math.cos(this.lat0),this.en))},forward:function(l){var d,b,Z,c=l.x,m=l.y,X=BX(c-this.long0),G=Math.sin(m),W=Math.cos(m);if(this.es){var u=W*X,a=Math.pow(u,2),s=this.ep2*Math.pow(W,2),h=Math.pow(s,2),V=Math.abs(W)>hX?Math.tan(m):0,y=Math.pow(V,2),p=Math.pow(y,2);d=1-this.es*Math.pow(G,2),u/=Math.sqrt(d);var t=rG(m,G,W,this.en);b=this.a*(this.k0*u*(1+a/6*(1-y+s+a/20*(5-18*y+p+14*s-58*y*s+a/42*(61+179*p-p*y-479*y)))))+this.x0,Z=this.a*(this.k0*(t-this.ml0+G*X*u/2*(1+a/12*(5-y+9*s+4*h+a/30*(61+p-58*y+270*s-330*y*s+a/56*(1385+543*p-p*y-3111*y))))))+this.y0}else{var n=W*Math.sin(X);if(Math.abs(Math.abs(n)-1)<hX)return 93;if(b=.5*this.a*this.k0*Math.log((1+n)/(1-n))+this.x0,Z=W*Math.cos(X)/Math.sqrt(1-Math.pow(n,2)),(n=Math.abs(Z))>=1){if(n-1>hX)return 93;Z=0}else Z=Math.acos(Z);m<0&&(Z=-Z),Z=this.a*this.k0*(Z-this.lat0)+this.y0}return l.x=b,l.y=Z,l},inverse:function(l){var d,b,Z,c,m=(l.x-this.x0)*(1/this.a),X=(l.y-this.y0)*(1/this.a);if(this.es)if(b=QG(d=this.ml0+X/this.k0,this.es,this.en),Math.abs(b)<sX){var G=Math.sin(b),W=Math.cos(b),u=Math.abs(W)>hX?Math.tan(b):0,a=this.ep2*Math.pow(W,2),s=Math.pow(a,2),h=Math.pow(u,2),V=Math.pow(h,2);d=1-this.es*Math.pow(G,2);var y=m*Math.sqrt(d)/this.k0,p=Math.pow(y,2);Z=b-(d*=u)*p/(1-this.es)*.5*(1-p/12*(5+3*h-9*a*h+a-4*s-p/30*(61+90*h-252*a*h+45*V+46*a-p/56*(1385+3633*h+4095*V+1574*V*h)))),c=BX(this.long0+y*(1-p/6*(1+2*h+a-p/20*(5+28*h+24*V+8*a*h+6*a-p/42*(61+662*h+1320*V+720*V*h))))/W)}else Z=sX*PX(X),c=0;else{var t=Math.exp(m/this.k0),n=.5*(t-1/t),i=this.lat0+X/this.k0,R=Math.cos(i);d=Math.sqrt((1-Math.pow(R,2))/(1+Math.pow(n,2))),Z=Math.asin(d),X<0&&(Z=-Z),c=0===n&&0===R?0:BX(Math.atan2(n,R)+this.long0)}return l.x=c,l.y=Z,l},names:["Fast_Transverse_Mercator","Fast Transverse Mercator"]};function fG(l){var d=Math.exp(l);return d=(d-1/d)/2}function EG(l,d){l=Math.abs(l),d=Math.abs(d);var b=Math.max(l,d),Z=Math.min(l,d)/(b||1);return b*Math.sqrt(1+Math.pow(Z,2))}function OG(l){var d=Math.abs(l);return d=function(l){var d=1+l,b=d-1;return 0===b?l:l*Math.log(d)/b}(d*(1+d/(EG(1,d)+1))),l<0?-d:d}function DG(l,d){for(var b,Z=2*Math.cos(2*d),c=l.length-1,m=l[c],X=0;--c>=0;)b=Z*m-X+l[c],X=m,m=b;return d+b*Math.sin(2*d)}function AG(l,d,b){for(var Z,c,m=Math.sin(d),X=Math.cos(d),G=fG(b),W=function(l){var d=Math.exp(l);return(d+1/d)/2}(b),u=2*X*W,a=-2*m*G,s=l.length-1,h=l[s],V=0,y=0,p=0;--s>=0;)Z=y,c=V,h=u*(y=h)-Z-a*(V=p)+l[s],p=a*y-c+u*V;return[(u=m*W)*h-(a=X*G)*p,u*p+a*h]}var _G={init:function(){if(!this.approx&&(isNaN(this.es)||this.es<=0))throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.');this.approx&&(jG.init.apply(this),this.forward=jG.forward,this.inverse=jG.inverse),this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var l=this.es/(1+Math.sqrt(1-this.es)),d=l/(2-l),b=d;this.cgb[0]=d*(2+d*(-2/3+d*(d*(116/45+d*(26/45+d*(-2854/675)))-2))),this.cbg[0]=d*(d*(2/3+d*(4/3+d*(-82/45+d*(32/45+d*(4642/4725)))))-2),b*=d,this.cgb[1]=b*(7/3+d*(d*(-227/45+d*(2704/315+d*(2323/945)))-1.6)),this.cbg[1]=b*(5/3+d*(-16/15+d*(-13/9+d*(904/315+d*(-1522/945))))),b*=d,this.cgb[2]=b*(56/15+d*(-136/35+d*(-1262/105+d*(73814/2835)))),this.cbg[2]=b*(-26/15+d*(34/21+d*(1.6+d*(-12686/2835)))),b*=d,this.cgb[3]=b*(4279/630+d*(-332/35+d*(-399572/14175))),this.cbg[3]=b*(1237/630+d*(d*(-24832/14175)-2.4)),b*=d,this.cgb[4]=b*(4174/315+d*(-144838/6237)),this.cbg[4]=b*(-734/315+d*(109598/31185)),b*=d,this.cgb[5]=b*(601676/22275),this.cbg[5]=b*(444337/155925),b=Math.pow(d,2),this.Qn=this.k0/(1+d)*(1+b*(1/4+b*(1/64+b/256))),this.utg[0]=d*(d*(2/3+d*(-37/96+d*(1/360+d*(81/512+d*(-96199/604800)))))-.5),this.gtu[0]=d*(.5+d*(-2/3+d*(5/16+d*(41/180+d*(-127/288+d*(7891/37800)))))),this.utg[1]=b*(-1/48+d*(-1/15+d*(437/1440+d*(-46/105+d*(1118711/3870720))))),this.gtu[1]=b*(13/48+d*(d*(557/1440+d*(281/630+d*(-1983433/1935360)))-.6)),b*=d,this.utg[2]=b*(-17/480+d*(37/840+d*(209/4480+d*(-5569/90720)))),this.gtu[2]=b*(61/240+d*(-103/140+d*(15061/26880+d*(167603/181440)))),b*=d,this.utg[3]=b*(-4397/161280+d*(11/504+d*(830251/7257600))),this.gtu[3]=b*(49561/161280+d*(-179/168+d*(6601661/7257600))),b*=d,this.utg[4]=b*(-4583/161280+d*(108847/3991680)),this.gtu[4]=b*(34729/80640+d*(-3418889/1995840)),b*=d,this.utg[5]=b*(-20648693/638668800),this.gtu[5]=.6650675310896665*b;var Z=DG(this.cbg,this.lat0);this.Zb=-this.Qn*(Z+function(l,d){for(var b,Z=2*Math.cos(d),c=l.length-1,m=l[c],X=0;--c>=0;)b=Z*m-X+l[c],X=m,m=b;return Math.sin(d)*b}(this.gtu,2*Z))},forward:function(l){var d=BX(l.x-this.long0),b=l.y;b=DG(this.cbg,b);var Z=Math.sin(b),c=Math.cos(b),m=Math.sin(d),X=Math.cos(d);b=Math.atan2(Z,X*c),d=Math.atan2(m*c,EG(Z,c*X)),d=OG(Math.tan(d));var G,W,u=AG(this.gtu,2*b,2*d);return b+=u[0],d+=u[1],Math.abs(d)<=2.623395162778?(G=this.a*(this.Qn*d)+this.x0,W=this.a*(this.Qn*b+this.Zb)+this.y0):(G=1/0,W=1/0),l.x=G,l.y=W,l},inverse:function(l){var d,b,Z=(l.x-this.x0)*(1/this.a),c=(l.y-this.y0)*(1/this.a);if(c=(c-this.Zb)/this.Qn,Z/=this.Qn,Math.abs(Z)<=2.623395162778){var m=AG(this.utg,2*c,2*Z);c+=m[0],Z+=m[1],Z=Math.atan(fG(Z));var X=Math.sin(c),G=Math.cos(c),W=Math.sin(Z),u=Math.cos(Z);c=Math.atan2(X*u,EG(W,u*G)),d=BX((Z=Math.atan2(W,u*G))+this.long0),b=DG(this.cgb,c)}else d=1/0,b=1/0;return l.x=d,l.y=b,l},names:["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc","Transverse_Mercator","Transverse Mercator","tmerc"]};var qG={init:function(){var l=function(l,d){if(void 0===l){if((l=Math.floor(30*(BX(d)+Math.PI)/Math.PI)+1)<0)return 0;if(l>60)return 60}return l}(this.zone,this.long0);if(void 0===l)throw new Error("unknown utm zone");this.lat0=0,this.long0=(6*Math.abs(l)-183)*VX,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,_G.init.apply(this),this.forward=_G.forward,this.inverse=_G.inverse},names:["Universal Transverse Mercator System","utm"],dependsOn:"etmerc"};function $G(l,d){return Math.pow((1-l)/(1+l),d)}var lW={init:function(){var l=Math.sin(this.lat0),d=Math.cos(this.lat0);d*=d,this.rc=Math.sqrt(1-this.es)/(1-this.es*l*l),this.C=Math.sqrt(1+this.es*d*d/(1-this.es)),this.phic0=Math.asin(l/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+pX)/(Math.pow(Math.tan(.5*this.lat0+pX),this.C)*$G(this.e*l,this.ratexp))},forward:function(l){var d=l.x,b=l.y;return l.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*b+pX),this.C)*$G(this.e*Math.sin(b),this.ratexp))-sX,l.x=this.C*d,l},inverse:function(l){for(var d=l.x/this.C,b=l.y,Z=Math.pow(Math.tan(.5*b+pX)/this.K,1/this.C),c=20;c>0&&(b=2*Math.atan(Z*$G(this.e*Math.sin(l.y),-.5*this.e))-sX,!(Math.abs(b-l.y)<1e-14));--c)l.y=b;return c?(l.x=d,l.y=b,l):null},names:["gauss"]};var dW={init:function(){lW.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},forward:function(l){var d,b,Z,c;return l.x=BX(l.x-this.long0),lW.forward.apply(this,[l]),d=Math.sin(l.y),b=Math.cos(l.y),Z=Math.cos(l.x),c=this.k0*this.R2/(1+this.sinc0*d+this.cosc0*b*Z),l.x=c*b*Math.sin(l.x),l.y=c*(this.cosc0*d-this.sinc0*b*Z),l.x=this.a*l.x+this.x0,l.y=this.a*l.y+this.y0,l},inverse:function(l){var d,b,Z,c,m;if(l.x=(l.x-this.x0)/this.a,l.y=(l.y-this.y0)/this.a,l.x/=this.k0,l.y/=this.k0,m=Math.sqrt(l.x*l.x+l.y*l.y)){var X=2*Math.atan2(m,this.R2);d=Math.sin(X),b=Math.cos(X),c=Math.asin(b*this.sinc0+l.y*d*this.cosc0/m),Z=Math.atan2(l.x*d,m*this.cosc0*b-l.y*this.sinc0*d)}else c=this.phic0,Z=0;return l.x=Z,l.y=c,lW.inverse.apply(this,[l]),l.x=BX(l.x+this.long0),l},names:["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative","Double_Stereographic"]};var bW={init:function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=hX&&(this.k0=.5*(1+PX(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=hX&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=hX&&(this.k0=.5*this.cons*gX(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/wX(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=gX(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-sX,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},forward:function(l){var d,b,Z,c,m,X,G=l.x,W=l.y,u=Math.sin(W),a=Math.cos(W),s=BX(G-this.long0);return Math.abs(Math.abs(G-this.long0)-Math.PI)<=hX&&Math.abs(W+this.lat0)<=hX?(l.x=NaN,l.y=NaN,l):this.sphere?(d=2*this.k0/(1+this.sinlat0*u+this.coslat0*a*Math.cos(s)),l.x=this.a*d*a*Math.sin(s)+this.x0,l.y=this.a*d*(this.coslat0*u-this.sinlat0*a*Math.cos(s))+this.y0,l):(b=2*Math.atan(this.ssfn_(W,u,this.e))-sX,c=Math.cos(b),Z=Math.sin(b),Math.abs(this.coslat0)<=hX?(m=wX(this.e,W*this.con,this.con*u),X=2*this.a*this.k0*m/this.cons,l.x=this.x0+X*Math.sin(G-this.long0),l.y=this.y0-this.con*X*Math.cos(G-this.long0),l):(Math.abs(this.sinlat0)<hX?(d=2*this.a*this.k0/(1+c*Math.cos(s)),l.y=d*Z):(d=2*this.a*this.k0*this.ms1/(this.cosX0*(1+this.sinX0*Z+this.cosX0*c*Math.cos(s))),l.y=d*(this.cosX0*Z-this.sinX0*c*Math.cos(s))+this.y0),l.x=d*c*Math.sin(s)+this.x0,l))},inverse:function(l){var d,b,Z,c,m;l.x-=this.x0,l.y-=this.y0;var X=Math.sqrt(l.x*l.x+l.y*l.y);if(this.sphere){var G=2*Math.atan(X/(2*this.a*this.k0));return d=this.long0,b=this.lat0,X<=hX?(l.x=d,l.y=b,l):(b=Math.asin(Math.cos(G)*this.sinlat0+l.y*Math.sin(G)*this.coslat0/X),d=Math.abs(this.coslat0)<hX?this.lat0>0?BX(this.long0+Math.atan2(l.x,-1*l.y)):BX(this.long0+Math.atan2(l.x,l.y)):BX(this.long0+Math.atan2(l.x*Math.sin(G),X*this.coslat0*Math.cos(G)-l.y*this.sinlat0*Math.sin(G))),l.x=d,l.y=b,l)}if(Math.abs(this.coslat0)<=hX){if(X<=hX)return b=this.lat0,d=this.long0,l.x=d,l.y=b,l;l.x*=this.con,l.y*=this.con,Z=X*this.cons/(2*this.a*this.k0),b=this.con*UX(this.e,Z),d=this.con*BX(this.con*this.long0+Math.atan2(l.x,-1*l.y))}else c=2*Math.atan(X*this.cosX0/(2*this.a*this.k0*this.ms1)),d=this.long0,X<=hX?m=this.X0:(m=Math.asin(Math.cos(c)*this.sinX0+l.y*Math.sin(c)*this.cosX0/X),d=BX(this.long0+Math.atan2(l.x*Math.sin(c),X*this.cosX0*Math.cos(c)-l.y*this.sinX0*Math.sin(c)))),b=-1*UX(this.e,Math.tan(.5*(sX+m)));return l.x=d,l.y=b,l},names:["stere","Stereographic_South_Pole","Polar Stereographic (variant B)"],ssfn_:function(l,d,b){return d*=b,Math.tan(.5*(sX+l))*Math.pow((1-d)/(1+d),.5*b)}};var ZW={init:function(){var l=this.lat0;this.lambda0=this.long0;var d=Math.sin(l),b=this.a,Z=1/this.rf,c=2*Z-Math.pow(Z,2),m=this.e=Math.sqrt(c);this.R=this.k0*b*Math.sqrt(1-c)/(1-c*Math.pow(d,2)),this.alpha=Math.sqrt(1+c/(1-c)*Math.pow(Math.cos(l),4)),this.b0=Math.asin(d/this.alpha);var X=Math.log(Math.tan(Math.PI/4+this.b0/2)),G=Math.log(Math.tan(Math.PI/4+l/2)),W=Math.log((1+m*d)/(1-m*d));this.K=X-this.alpha*G+this.alpha*m/2*W},forward:function(l){var d=Math.log(Math.tan(Math.PI/4-l.y/2)),b=this.e/2*Math.log((1+this.e*Math.sin(l.y))/(1-this.e*Math.sin(l.y))),Z=-this.alpha*(d+b)+this.K,c=2*(Math.atan(Math.exp(Z))-Math.PI/4),m=this.alpha*(l.x-this.lambda0),X=Math.atan(Math.sin(m)/(Math.sin(this.b0)*Math.tan(c)+Math.cos(this.b0)*Math.cos(m))),G=Math.asin(Math.cos(this.b0)*Math.sin(c)-Math.sin(this.b0)*Math.cos(c)*Math.cos(m));return l.y=this.R/2*Math.log((1+Math.sin(G))/(1-Math.sin(G)))+this.y0,l.x=this.R*X+this.x0,l},inverse:function(l){for(var d=l.x-this.x0,b=l.y-this.y0,Z=d/this.R,c=2*(Math.atan(Math.exp(b/this.R))-Math.PI/4),m=Math.asin(Math.cos(this.b0)*Math.sin(c)+Math.sin(this.b0)*Math.cos(c)*Math.cos(Z)),X=Math.atan(Math.sin(Z)/(Math.cos(this.b0)*Math.cos(Z)-Math.sin(this.b0)*Math.tan(c))),G=this.lambda0+X/this.alpha,W=0,u=m,a=-1e3,s=0;Math.abs(u-a)>1e-7;){if(++s>20)return;W=1/this.alpha*(Math.log(Math.tan(Math.PI/4+m/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(u))/2)),a=u,u=2*Math.atan(Math.exp(W))-Math.PI/2}return l.x=G,l.y=u,l},names:["somerc"]},cW=1e-7;var mW={init:function(){var l,d,b,Z,c,m,X,G,W,u,a,s,V,y=0,p=0,t=0,n=0,i=0,R=0,o=0;this.no_off=(V="object"===h((s=this).PROJECTION)?Object.keys(s.PROJECTION)[0]:s.PROJECTION,"no_uoff"in s||"no_off"in s||-1!==["Hotine_Oblique_Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin"].indexOf(V)),this.no_rot="no_rot"in this;var L=!1;"alpha"in this&&(L=!0);var K=!1;if("rectified_grid_angle"in this&&(K=!0),L&&(o=this.alpha),K&&(y=this.rectified_grid_angle*VX),L||K)p=this.longc;else if(t=this.long1,i=this.lat1,n=this.long2,R=this.lat2,Math.abs(i-R)<=cW||(l=Math.abs(i))<=cW||Math.abs(l-sX)<=cW||Math.abs(Math.abs(this.lat0)-sX)<=cW||Math.abs(Math.abs(R)-sX)<=cW)throw new Error;var H=1-this.es;d=Math.sqrt(H),Math.abs(this.lat0)>hX?(G=Math.sin(this.lat0),b=Math.cos(this.lat0),l=1-this.es*G*G,this.B=b*b,this.B=Math.sqrt(1+this.es*this.B*this.B/H),this.A=this.B*this.k0*d/l,(c=(Z=this.B*d/(b*Math.sqrt(l)))*Z-1)<=0?c=0:(c=Math.sqrt(c),this.lat0<0&&(c=-c)),this.E=c+=Z,this.E*=Math.pow(wX(this.e,this.lat0,G),this.B)):(this.B=1/d,this.A=this.k0,this.E=Z=c=1),L||K?(L?(a=Math.asin(Math.sin(o)/Z),K||(y=o)):(a=y,o=Math.asin(Z*Math.sin(a))),this.lam0=p-Math.asin(.5*(c-1/c)*Math.tan(a))/this.B):(m=Math.pow(wX(this.e,i,Math.sin(i)),this.B),X=Math.pow(wX(this.e,R,Math.sin(R)),this.B),c=this.E/m,W=(X-m)/(X+m),u=((u=this.E*this.E)-X*m)/(u+X*m),(l=t-n)<-Math.pi?n-=tX:l>Math.pi&&(n+=tX),this.lam0=BX(.5*(t+n)-Math.atan(u*Math.tan(.5*this.B*(t-n))/W)/this.B),a=Math.atan(2*Math.sin(this.B*BX(t-this.lam0))/(c-1/c)),y=o=Math.asin(Z*Math.sin(a))),this.singam=Math.sin(a),this.cosgam=Math.cos(a),this.sinrot=Math.sin(y),this.cosrot=Math.cos(y),this.rB=1/this.B,this.ArB=this.A*this.rB,this.BrA=1/this.ArB,this.A,this.B,this.no_off?this.u_0=0:(this.u_0=Math.abs(this.ArB*Math.atan(Math.sqrt(Z*Z-1)/Math.cos(o))),this.lat0<0&&(this.u_0=-this.u_0)),c=.5*a,this.v_pole_n=this.ArB*Math.log(Math.tan(pX-c)),this.v_pole_s=this.ArB*Math.log(Math.tan(pX+c))},forward:function(l){var d,b,Z,c,m,X,G,W,u={};if(l.x=l.x-this.lam0,Math.abs(Math.abs(l.y)-sX)>hX){if(d=.5*((m=this.E/Math.pow(wX(this.e,l.y,Math.sin(l.y)),this.B))-(X=1/m)),b=.5*(m+X),c=Math.sin(this.B*l.x),Z=(d*this.singam-c*this.cosgam)/b,Math.abs(Math.abs(Z)-1)<hX)throw new Error;W=.5*this.ArB*Math.log((1-Z)/(1+Z)),X=Math.cos(this.B*l.x),G=Math.abs(X)<cW?this.A*l.x:this.ArB*Math.atan2(d*this.cosgam+c*this.singam,X)}else W=l.y>0?this.v_pole_n:this.v_pole_s,G=this.ArB*l.y;return this.no_rot?(u.x=G,u.y=W):(G-=this.u_0,u.x=W*this.cosrot+G*this.sinrot,u.y=G*this.cosrot-W*this.sinrot),u.x=this.a*u.x+this.x0,u.y=this.a*u.y+this.y0,u},inverse:function(l){var d,b,Z,c,m,X,G,W={};if(l.x=(l.x-this.x0)*(1/this.a),l.y=(l.y-this.y0)*(1/this.a),this.no_rot?(b=l.y,d=l.x):(b=l.x*this.cosrot-l.y*this.sinrot,d=l.y*this.cosrot+l.x*this.sinrot+this.u_0),c=.5*((Z=Math.exp(-this.BrA*b))-1/Z),m=.5*(Z+1/Z),G=((X=Math.sin(this.BrA*d))*this.cosgam+c*this.singam)/m,Math.abs(Math.abs(G)-1)<hX)W.x=0,W.y=G<0?-sX:sX;else{if(W.y=this.E/Math.sqrt((1+G)/(1-G)),W.y=UX(this.e,Math.pow(W.y,1/this.B)),W.y===1/0)throw new Error;W.x=-this.rB*Math.atan2(c*this.cosgam-X*this.singam,Math.cos(this.BrA*d))}return W.x+=this.lam0,W},names:["Hotine_Oblique_Mercator","Hotine Oblique Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin","Hotine_Oblique_Mercator_Two_Point_Natural_Origin","Hotine_Oblique_Mercator_Azimuth_Center","Oblique_Mercator","omerc"]};var XW={init:function(){if(this.lat2||(this.lat2=this.lat1),this.k0||(this.k0=1),this.x0=this.x0||0,this.y0=this.y0||0,!(Math.abs(this.lat1+this.lat2)<hX)){var l=this.b/this.a;this.e=Math.sqrt(1-l*l);var d=Math.sin(this.lat1),b=Math.cos(this.lat1),Z=gX(this.e,d,b),c=wX(this.e,this.lat1,d),m=Math.sin(this.lat2),X=Math.cos(this.lat2),G=gX(this.e,m,X),W=wX(this.e,this.lat2,m),u=wX(this.e,this.lat0,Math.sin(this.lat0));Math.abs(this.lat1-this.lat2)>hX?this.ns=Math.log(Z/G)/Math.log(c/W):this.ns=d,isNaN(this.ns)&&(this.ns=d),this.f0=Z/(this.ns*Math.pow(c,this.ns)),this.rh=this.a*this.f0*Math.pow(u,this.ns),this.title||(this.title="Lambert Conformal Conic")}},forward:function(l){var d=l.x,b=l.y;Math.abs(2*Math.abs(b)-Math.PI)<=hX&&(b=PX(b)*(sX-2e-10));var Z,c,m=Math.abs(Math.abs(b)-sX);if(m>hX)Z=wX(this.e,b,Math.sin(b)),c=this.a*this.f0*Math.pow(Z,this.ns);else{if((m=b*this.ns)<=0)return null;c=0}var X=this.ns*BX(d-this.long0);return l.x=this.k0*(c*Math.sin(X))+this.x0,l.y=this.k0*(this.rh-c*Math.cos(X))+this.y0,l},inverse:function(l){var d,b,Z,c,m,X=(l.x-this.x0)/this.k0,G=this.rh-(l.y-this.y0)/this.k0;this.ns>0?(d=Math.sqrt(X*X+G*G),b=1):(d=-Math.sqrt(X*X+G*G),b=-1);var W=0;if(0!==d&&(W=Math.atan2(b*X,b*G)),0!==d||this.ns>0){if(b=1/this.ns,Z=Math.pow(d/(this.a*this.f0),b),-9999===(c=UX(this.e,Z)))return null}else c=-sX;return m=BX(W/this.ns+this.long0),l.x=m,l.y=c,l},names:["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_1SP","Lambert_Conformal_Conic_2SP","lcc","Lambert Conic Conformal (1SP)","Lambert Conic Conformal (2SP)"]};var GW={init:function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},forward:function(l){var d,b,Z,c,m,X,G,W=l.x,u=l.y,a=BX(W-this.long0);return d=Math.pow((1+this.e*Math.sin(u))/(1-this.e*Math.sin(u)),this.alfa*this.e/2),b=2*(Math.atan(this.k*Math.pow(Math.tan(u/2+this.s45),this.alfa)/d)-this.s45),Z=-a*this.alfa,c=Math.asin(Math.cos(this.ad)*Math.sin(b)+Math.sin(this.ad)*Math.cos(b)*Math.cos(Z)),m=Math.asin(Math.cos(b)*Math.sin(Z)/Math.cos(c)),X=this.n*m,G=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(c/2+this.s45),this.n),l.y=G*Math.cos(X)/1,l.x=G*Math.sin(X)/1,this.czech||(l.y*=-1,l.x*=-1),l},inverse:function(l){var d,b,Z,c,m,X,G,W=l.x;l.x=l.y,l.y=W,this.czech||(l.y*=-1,l.x*=-1),m=Math.sqrt(l.x*l.x+l.y*l.y),c=Math.atan2(l.y,l.x)/Math.sin(this.s0),Z=2*(Math.atan(Math.pow(this.ro0/m,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),d=Math.asin(Math.cos(this.ad)*Math.sin(Z)-Math.sin(this.ad)*Math.cos(Z)*Math.cos(c)),b=Math.asin(Math.cos(Z)*Math.sin(c)/Math.cos(d)),l.x=this.long0-b/this.alfa,X=d,G=0;var u=0;do{l.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(d/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(X))/(1-this.e*Math.sin(X)),this.e/2))-this.s45),Math.abs(X-l.y)<1e-10&&(G=1),X=l.y,u+=1}while(0===G&&u<15);return u>=15?null:l},names:["Krovak","krovak"]};function WW(l,d,b,Z,c){return l*c-d*Math.sin(2*c)+b*Math.sin(4*c)-Z*Math.sin(6*c)}function uW(l){return 1-.25*l*(1+l/16*(3+1.25*l))}function aW(l){return.375*l*(1+.25*l*(1+.46875*l))}function sW(l){return.05859375*l*l*(1+.75*l)}function hW(l){return l*l*l*(35/3072)}function VW(l,d,b){var Z=d*b;return l/Math.sqrt(1-Z*Z)}function yW(l){return Math.abs(l)<sX?l:l-PX(l)*Math.PI}function pW(l,d,b,Z,c){var m,X;m=l/d;for(var G=0;G<15;G++)if(m+=X=(l-(d*m-b*Math.sin(2*m)+Z*Math.sin(4*m)-c*Math.sin(6*m)))/(d-2*b*Math.cos(2*m)+4*Z*Math.cos(4*m)-6*c*Math.cos(6*m)),Math.abs(X)<=1e-10)return m;return NaN}var tW={init:function(){this.sphere||(this.e0=uW(this.es),this.e1=aW(this.es),this.e2=sW(this.es),this.e3=hW(this.es),this.ml0=this.a*WW(this.e0,this.e1,this.e2,this.e3,this.lat0))},forward:function(l){var d,b,Z=l.x,c=l.y;if(Z=BX(Z-this.long0),this.sphere)d=this.a*Math.asin(Math.cos(c)*Math.sin(Z)),b=this.a*(Math.atan2(Math.tan(c),Math.cos(Z))-this.lat0);else{var m=Math.sin(c),X=Math.cos(c),G=VW(this.a,this.e,m),W=Math.tan(c)*Math.tan(c),u=Z*Math.cos(c),a=u*u,s=this.es*X*X/(1-this.es);d=G*u*(1-a*W*(1/6-(8-W+8*s)*a/120)),b=this.a*WW(this.e0,this.e1,this.e2,this.e3,c)-this.ml0+G*m/X*a*(.5+(5-W+6*s)*a/24)}return l.x=d+this.x0,l.y=b+this.y0,l},inverse:function(l){l.x-=this.x0,l.y-=this.y0;var d,b,Z=l.x/this.a,c=l.y/this.a;if(this.sphere){var m=c+this.lat0;d=Math.asin(Math.sin(m)*Math.cos(Z)),b=Math.atan2(Math.tan(Z),Math.cos(m))}else{var X=pW(this.ml0/this.a+c,this.e0,this.e1,this.e2,this.e3);if(Math.abs(Math.abs(X)-sX)<=hX)return l.x=this.long0,l.y=sX,c<0&&(l.y*=-1),l;var G=VW(this.a,this.e,Math.sin(X)),W=G*G*G/this.a/this.a*(1-this.es),u=Math.pow(Math.tan(X),2),a=Z*this.a/G,s=a*a;d=X-G*Math.tan(X)/W*a*a*(.5-(1+3*u)*a*a/24),b=a*(1-s*(u/3+(1+3*u)*u*s/15))/Math.cos(X)}return l.x=BX(b+this.long0),l.y=yW(d),l},names:["Cassini","Cassini_Soldner","cass"]};function nW(l,d){var b;return l>1e-7?(1-l*l)*(d/(1-(b=l*d)*b)-.5/l*Math.log((1-b)/(1+b))):2*d}var iW=.3333333333333333,RW=.17222222222222222,oW=.10257936507936508,LW=.06388888888888888,KW=.0664021164021164,HW=.016415012942191543;var xW={init:function(){var l,d=Math.abs(this.lat0);if(Math.abs(d-sX)<hX?this.mode=this.lat0<0?this.S_POLE:this.N_POLE:Math.abs(d)<hX?this.mode=this.EQUIT:this.mode=this.OBLIQ,this.es>0)switch(this.qp=nW(this.e,1),this.mmf=.5/(1-this.es),this.apa=function(l){var d,b=[];return b[0]=l*iW,d=l*l,b[0]+=d*RW,b[1]=d*LW,d*=l,b[0]+=d*oW,b[1]+=d*KW,b[2]=d*HW,b}(this.es),this.mode){case this.N_POLE:case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),l=Math.sin(this.lat0),this.sinb1=nW(this.e,l)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*l*l)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},forward:function(l){var d,b,Z,c,m,X,G,W,u,a,s=l.x,h=l.y;if(s=BX(s-this.long0),this.sphere){if(m=Math.sin(h),a=Math.cos(h),Z=Math.cos(s),this.mode===this.OBLIQ||this.mode===this.EQUIT){if((b=this.mode===this.EQUIT?1+a*Z:1+this.sinph0*m+this.cosph0*a*Z)<=hX)return null;d=(b=Math.sqrt(2/b))*a*Math.sin(s),b*=this.mode===this.EQUIT?m:this.cosph0*m-this.sinph0*a*Z}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(Z=-Z),Math.abs(h+this.lat0)<hX)return null;b=pX-.5*h,d=(b=2*(this.mode===this.S_POLE?Math.cos(b):Math.sin(b)))*Math.sin(s),b*=Z}}else{switch(G=0,W=0,u=0,Z=Math.cos(s),c=Math.sin(s),m=Math.sin(h),X=nW(this.e,m),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(G=X/this.qp,W=Math.sqrt(1-G*G)),this.mode){case this.OBLIQ:u=1+this.sinb1*G+this.cosb1*W*Z;break;case this.EQUIT:u=1+W*Z;break;case this.N_POLE:u=sX+h,X=this.qp-X;break;case this.S_POLE:u=h-sX,X=this.qp+X}if(Math.abs(u)<hX)return null;switch(this.mode){case this.OBLIQ:case this.EQUIT:u=Math.sqrt(2/u),b=this.mode===this.OBLIQ?this.ymf*u*(this.cosb1*G-this.sinb1*W*Z):(u=Math.sqrt(2/(1+W*Z)))*G*this.ymf,d=this.xmf*u*W*c;break;case this.N_POLE:case this.S_POLE:X>=0?(d=(u=Math.sqrt(X))*c,b=Z*(this.mode===this.S_POLE?u:-u)):d=b=0}}return l.x=this.a*d+this.x0,l.y=this.a*b+this.y0,l},inverse:function(l){l.x-=this.x0,l.y-=this.y0;var d,b,Z,c,m,X,G,W,u,a,s=l.x/this.a,h=l.y/this.a;if(this.sphere){var V,y=0,p=0;if((b=.5*(V=Math.sqrt(s*s+h*h)))>1)return null;switch(b=2*Math.asin(b),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(p=Math.sin(b),y=Math.cos(b)),this.mode){case this.EQUIT:b=Math.abs(V)<=hX?0:Math.asin(h*p/V),s*=p,h=y*V;break;case this.OBLIQ:b=Math.abs(V)<=hX?this.lat0:Math.asin(y*this.sinph0+h*p*this.cosph0/V),s*=p*this.cosph0,h=(y-Math.sin(b)*this.sinph0)*V;break;case this.N_POLE:h=-h,b=sX-b;break;case this.S_POLE:b-=sX}d=0!==h||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(s,h):0}else{if(G=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(s/=this.dd,h*=this.dd,(X=Math.sqrt(s*s+h*h))<hX)return l.x=this.long0,l.y=this.lat0,l;c=2*Math.asin(.5*X/this.rq),Z=Math.cos(c),s*=c=Math.sin(c),this.mode===this.OBLIQ?(G=Z*this.sinb1+h*c*this.cosb1/X,m=this.qp*G,h=X*this.cosb1*Z-h*this.sinb1*c):(G=h*c/X,m=this.qp*G,h=X*Z)}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(h=-h),!(m=s*s+h*h))return l.x=this.long0,l.y=this.lat0,l;G=1-m/this.qp,this.mode===this.S_POLE&&(G=-G)}d=Math.atan2(s,h),W=Math.asin(G),u=this.apa,a=W+W,b=W+u[0]*Math.sin(a)+u[1]*Math.sin(a+a)+u[2]*Math.sin(a+a+a)}return l.x=BX(this.long0+d),l.y=b,l},names:["Lambert Azimuthal Equal Area","Lambert_Azimuthal_Equal_Area","laea"],S_POLE:1,N_POLE:2,EQUIT:3,OBLIQ:4};function SW(l){return Math.abs(l)>1&&(l=l>1?1:-1),Math.asin(l)}var YW={init:function(){Math.abs(this.lat1+this.lat2)<hX||(this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e3=Math.sqrt(this.es),this.sin_po=Math.sin(this.lat1),this.cos_po=Math.cos(this.lat1),this.t1=this.sin_po,this.con=this.sin_po,this.ms1=gX(this.e3,this.sin_po,this.cos_po),this.qs1=nW(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat2),this.cos_po=Math.cos(this.lat2),this.t2=this.sin_po,this.ms2=gX(this.e3,this.sin_po,this.cos_po),this.qs2=nW(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat0),this.cos_po=Math.cos(this.lat0),this.t3=this.sin_po,this.qs0=nW(this.e3,this.sin_po,this.cos_po),Math.abs(this.lat1-this.lat2)>hX?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(l){var d=l.x,b=l.y;this.sin_phi=Math.sin(b),this.cos_phi=Math.cos(b);var Z=nW(this.e3,this.sin_phi,this.cos_phi),c=this.a*Math.sqrt(this.c-this.ns0*Z)/this.ns0,m=this.ns0*BX(d-this.long0),X=c*Math.sin(m)+this.x0,G=this.rh-c*Math.cos(m)+this.y0;return l.x=X,l.y=G,l},inverse:function(l){var d,b,Z,c,m,X;return l.x-=this.x0,l.y=this.rh-l.y+this.y0,this.ns0>=0?(d=Math.sqrt(l.x*l.x+l.y*l.y),Z=1):(d=-Math.sqrt(l.x*l.x+l.y*l.y),Z=-1),c=0,0!==d&&(c=Math.atan2(Z*l.x,Z*l.y)),Z=d*this.ns0/this.a,this.sphere?X=Math.asin((this.c-Z*Z)/(2*this.ns0)):(b=(this.c-Z*Z)/this.ns0,X=this.phi1z(this.e3,b)),m=BX(c/this.ns0+this.long0),l.x=m,l.y=X,l},names:["Albers_Conic_Equal_Area","Albers","aea"],phi1z:function(l,d){var b,Z,c,m,X=SW(.5*d);if(l<hX)return X;for(var G=l*l,W=1;W<=25;W++)if(X+=m=.5*(c=1-(Z=l*(b=Math.sin(X)))*Z)*c/Math.cos(X)*(d/(1-G)-b/c+.5/l*Math.log((1-Z)/(1+Z))),Math.abs(m)<=1e-7)return X;return null}};var eW={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0),this.infinity_dist=1e3*this.a,this.rc=1},forward:function(l){var d,b,Z,c,m,X,G,W=l.x,u=l.y;return Z=BX(W-this.long0),d=Math.sin(u),b=Math.cos(u),c=Math.cos(Z),1,(m=this.sin_p14*d+this.cos_p14*b*c)>0||Math.abs(m)<=hX?(X=this.x0+1*this.a*b*Math.sin(Z)/m,G=this.y0+1*this.a*(this.cos_p14*d-this.sin_p14*b*c)/m):(X=this.x0+this.infinity_dist*b*Math.sin(Z),G=this.y0+this.infinity_dist*(this.cos_p14*d-this.sin_p14*b*c)),l.x=X,l.y=G,l},inverse:function(l){var d,b,Z,c,m,X;return l.x=(l.x-this.x0)/this.a,l.y=(l.y-this.y0)/this.a,l.x/=this.k0,l.y/=this.k0,(d=Math.sqrt(l.x*l.x+l.y*l.y))?(c=Math.atan2(d,this.rc),b=Math.sin(c),X=SW((Z=Math.cos(c))*this.sin_p14+l.y*b*this.cos_p14/d),m=Math.atan2(l.x*b,d*this.cos_p14*Z-l.y*this.sin_p14*b),m=BX(this.long0+m)):(X=this.phic0,m=0),l.x=m,l.y=X,l},names:["gnom"]};var JW={init:function(){this.sphere||(this.k0=gX(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},forward:function(l){var d,b,Z=l.x,c=l.y,m=BX(Z-this.long0);if(this.sphere)d=this.x0+this.a*m*Math.cos(this.lat_ts),b=this.y0+this.a*Math.sin(c)/Math.cos(this.lat_ts);else{var X=nW(this.e,Math.sin(c));d=this.x0+this.a*this.k0*m,b=this.y0+this.a*X*.5/this.k0}return l.x=d,l.y=b,l},inverse:function(l){var d,b;return l.x-=this.x0,l.y-=this.y0,this.sphere?(d=BX(this.long0+l.x/this.a/Math.cos(this.lat_ts)),b=Math.asin(l.y/this.a*Math.cos(this.lat_ts))):(b=function(l,d){var b=1-(1-l*l)/(2*l)*Math.log((1-l)/(1+l));if(Math.abs(Math.abs(d)-b)<1e-6)return d<0?-1*sX:sX;for(var Z,c,m,X,G=Math.asin(.5*d),W=0;W<30;W++)if(c=Math.sin(G),m=Math.cos(G),X=l*c,G+=Z=Math.pow(1-X*X,2)/(2*m)*(d/(1-l*l)-c/(1-X*X)+.5/l*Math.log((1-X)/(1+X))),Math.abs(Z)<=1e-10)return G;return NaN}(this.e,2*l.y*this.k0/this.a),d=BX(this.long0+l.x/(this.a*this.k0))),l.x=d,l.y=b,l},names:["cea"]};var zW={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},forward:function(l){var d=l.x,b=l.y,Z=BX(d-this.long0),c=yW(b-this.lat0);return l.x=this.x0+this.a*Z*this.rc,l.y=this.y0+this.a*c,l},inverse:function(l){var d=l.x,b=l.y;return l.x=BX(this.long0+(d-this.x0)/(this.a*this.rc)),l.y=yW(this.lat0+(b-this.y0)/this.a),l},names:["Equirectangular","Equidistant_Cylindrical","eqc"]};var vW={init:function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=uW(this.es),this.e1=aW(this.es),this.e2=sW(this.es),this.e3=hW(this.es),this.ml0=this.a*WW(this.e0,this.e1,this.e2,this.e3,this.lat0)},forward:function(l){var d,b,Z,c=l.x,m=l.y,X=BX(c-this.long0);if(Z=X*Math.sin(m),this.sphere)Math.abs(m)<=hX?(d=this.a*X,b=-1*this.a*this.lat0):(d=this.a*Math.sin(Z)/Math.tan(m),b=this.a*(yW(m-this.lat0)+(1-Math.cos(Z))/Math.tan(m)));else if(Math.abs(m)<=hX)d=this.a*X,b=-1*this.ml0;else{var G=VW(this.a,this.e,Math.sin(m))/Math.tan(m);d=G*Math.sin(Z),b=this.a*WW(this.e0,this.e1,this.e2,this.e3,m)-this.ml0+G*(1-Math.cos(Z))}return l.x=d+this.x0,l.y=b+this.y0,l},inverse:function(l){var d,b,Z,c,m,X,G,W,u;if(Z=l.x-this.x0,c=l.y-this.y0,this.sphere)if(Math.abs(c+this.a*this.lat0)<=hX)d=BX(Z/this.a+this.long0),b=0;else{var a;for(X=this.lat0+c/this.a,G=Z*Z/this.a/this.a+X*X,W=X,m=20;m;--m)if(W+=u=-1*(X*(W*(a=Math.tan(W))+1)-W-.5*(W*W+G)*a)/((W-X)/a-1),Math.abs(u)<=hX){b=W;break}d=BX(this.long0+Math.asin(Z*Math.tan(W)/this.a)/Math.sin(b))}else if(Math.abs(c+this.ml0)<=hX)b=0,d=BX(this.long0+Z/this.a);else{var s,h,V,y,p;for(X=(this.ml0+c)/this.a,G=Z*Z/this.a/this.a+X*X,W=X,m=20;m;--m)if(p=this.e*Math.sin(W),s=Math.sqrt(1-p*p)*Math.tan(W),h=this.a*WW(this.e0,this.e1,this.e2,this.e3,W),V=this.e0-2*this.e1*Math.cos(2*W)+4*this.e2*Math.cos(4*W)-6*this.e3*Math.cos(6*W),W-=u=(X*(s*(y=h/this.a)+1)-y-.5*s*(y*y+G))/(this.es*Math.sin(2*W)*(y*y+G-2*X*y)/(4*s)+(X-y)*(s*V-2/Math.sin(2*W))-V),Math.abs(u)<=hX){b=W;break}s=Math.sqrt(1-this.es*Math.pow(Math.sin(b),2))*Math.tan(b),d=BX(this.long0+Math.asin(Z*s/this.a)/Math.sin(b))}return l.x=d,l.y=b,l},names:["Polyconic","poly"]};var TW={init:function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},forward:function(l){var d,b=l.x,Z=l.y-this.lat0,c=b-this.long0,m=Z/aX*1e-5,X=c,G=1,W=0;for(d=1;d<=10;d++)G*=m,W+=this.A[d]*G;var u,a=W,s=X,h=1,V=0,y=0,p=0;for(d=1;d<=6;d++)u=V*a+h*s,h=h*a-V*s,V=u,y=y+this.B_re[d]*h-this.B_im[d]*V,p=p+this.B_im[d]*h+this.B_re[d]*V;return l.x=p*this.a+this.x0,l.y=y*this.a+this.y0,l},inverse:function(l){var d,b,Z=l.x,c=l.y,m=Z-this.x0,X=(c-this.y0)/this.a,G=m/this.a,W=1,u=0,a=0,s=0;for(d=1;d<=6;d++)b=u*X+W*G,W=W*X-u*G,u=b,a=a+this.C_re[d]*W-this.C_im[d]*u,s=s+this.C_im[d]*W+this.C_re[d]*u;for(var h=0;h<this.iterations;h++){var V,y=a,p=s,t=X,n=G;for(d=2;d<=6;d++)V=p*a+y*s,y=y*a-p*s,p=V,t+=(d-1)*(this.B_re[d]*y-this.B_im[d]*p),n+=(d-1)*(this.B_im[d]*y+this.B_re[d]*p);y=1,p=0;var i=this.B_re[1],R=this.B_im[1];for(d=2;d<=6;d++)V=p*a+y*s,y=y*a-p*s,p=V,i+=d*(this.B_re[d]*y-this.B_im[d]*p),R+=d*(this.B_im[d]*y+this.B_re[d]*p);var o=i*i+R*R;a=(t*i+n*R)/o,s=(n*i-t*R)/o}var L=a,K=s,H=1,x=0;for(d=1;d<=9;d++)H*=L,x+=this.D[d]*H;var S=this.lat0+x*aX*1e5,Y=this.long0+K;return l.x=Y,l.y=S,l},names:["New_Zealand_Map_Grid","nzmg"]};var MW={init:function(){},forward:function(l){var d=l.x,b=l.y,Z=BX(d-this.long0),c=this.x0+this.a*Z,m=this.y0+this.a*Math.log(Math.tan(Math.PI/4+b/2.5))*1.25;return l.x=c,l.y=m,l},inverse:function(l){l.x-=this.x0,l.y-=this.y0;var d=BX(this.long0+l.x/this.a),b=2.5*(Math.atan(Math.exp(.8*l.y/this.a))-Math.PI/4);return l.x=d,l.y=b,l},names:["Miller_Cylindrical","mill"]};var CW={init:function(){this.sphere?(this.n=1,this.m=0,this.es=0,this.C_y=Math.sqrt((this.m+1)/this.n),this.C_x=this.C_y/(this.m+1)):this.en=UG(this.es)},forward:function(l){var d,b,Z=l.x,c=l.y;if(Z=BX(Z-this.long0),this.sphere){if(this.m)for(var m=this.n*Math.sin(c),X=20;X;--X){var G=(this.m*c+Math.sin(c)-m)/(this.m+Math.cos(c));if(c-=G,Math.abs(G)<hX)break}else c=1!==this.n?Math.asin(this.n*Math.sin(c)):c;d=this.a*this.C_x*Z*(this.m+Math.cos(c)),b=this.a*this.C_y*c}else{var W=Math.sin(c),u=Math.cos(c);b=this.a*rG(c,W,u,this.en),d=this.a*Z*u/Math.sqrt(1-this.es*W*W)}return l.x=d,l.y=b,l},inverse:function(l){var d,b,Z;return l.x-=this.x0,b=l.x/this.a,l.y-=this.y0,d=l.y/this.a,this.sphere?(d/=this.C_y,b/=this.C_x*(this.m+Math.cos(d)),this.m?d=SW((this.m*d+Math.sin(d))/this.n):1!==this.n&&(d=SW(Math.sin(d)/this.n)),b=BX(b+this.long0),d=yW(d)):(d=QG(l.y/this.a,this.es,this.en),(Z=Math.abs(d))<sX?(Z=Math.sin(d),b=BX(this.long0+l.x*Math.sqrt(1-this.es*Z*Z)/(this.a*Math.cos(d)))):Z-hX<sX&&(b=this.long0)),l.x=b,l.y=d,l},names:["Sinusoidal","sinu"]};var FW={init:function(){},forward:function(l){for(var d=l.x,b=l.y,Z=BX(d-this.long0),c=b,m=Math.PI*Math.sin(b);;){var X=-(c+Math.sin(c)-m)/(1+Math.cos(c));if(c+=X,Math.abs(X)<hX)break}c/=2,Math.PI/2-Math.abs(b)<hX&&(Z=0);var G=.900316316158*this.a*Z*Math.cos(c)+this.x0,W=1.4142135623731*this.a*Math.sin(c)+this.y0;return l.x=G,l.y=W,l},inverse:function(l){var d,b;l.x-=this.x0,l.y-=this.y0,b=l.y/(1.4142135623731*this.a),Math.abs(b)>.999999999999&&(b=.999999999999),d=Math.asin(b);var Z=BX(this.long0+l.x/(.900316316158*this.a*Math.cos(d)));Z<-Math.PI&&(Z=-Math.PI),Z>Math.PI&&(Z=Math.PI),b=(2*d+Math.sin(2*d))/Math.PI,Math.abs(b)>1&&(b=1);var c=Math.asin(b);return l.x=Z,l.y=c,l},names:["Mollweide","moll"]};var IW={init:function(){Math.abs(this.lat1+this.lat2)<hX||(this.lat2=this.lat2||this.lat1,this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=uW(this.es),this.e1=aW(this.es),this.e2=sW(this.es),this.e3=hW(this.es),this.sinphi=Math.sin(this.lat1),this.cosphi=Math.cos(this.lat1),this.ms1=gX(this.e,this.sinphi,this.cosphi),this.ml1=WW(this.e0,this.e1,this.e2,this.e3,this.lat1),Math.abs(this.lat1-this.lat2)<hX?this.ns=this.sinphi:(this.sinphi=Math.sin(this.lat2),this.cosphi=Math.cos(this.lat2),this.ms2=gX(this.e,this.sinphi,this.cosphi),this.ml2=WW(this.e0,this.e1,this.e2,this.e3,this.lat2),this.ns=(this.ms1-this.ms2)/(this.ml2-this.ml1)),this.g=this.ml1+this.ms1/this.ns,this.ml0=WW(this.e0,this.e1,this.e2,this.e3,this.lat0),this.rh=this.a*(this.g-this.ml0))},forward:function(l){var d,b=l.x,Z=l.y;if(this.sphere)d=this.a*(this.g-Z);else{var c=WW(this.e0,this.e1,this.e2,this.e3,Z);d=this.a*(this.g-c)}var m=this.ns*BX(b-this.long0),X=this.x0+d*Math.sin(m),G=this.y0+this.rh-d*Math.cos(m);return l.x=X,l.y=G,l},inverse:function(l){var d,b,Z,c;l.x-=this.x0,l.y=this.rh-l.y+this.y0,this.ns>=0?(b=Math.sqrt(l.x*l.x+l.y*l.y),d=1):(b=-Math.sqrt(l.x*l.x+l.y*l.y),d=-1);var m=0;return 0!==b&&(m=Math.atan2(d*l.x,d*l.y)),this.sphere?(c=BX(this.long0+m/this.ns),Z=yW(this.g-b/this.a),l.x=c,l.y=Z,l):(Z=pW(this.g-b/this.a,this.e0,this.e1,this.e2,this.e3),c=BX(this.long0+m/this.ns),l.x=c,l.y=Z,l)},names:["Equidistant_Conic","eqdc"]};var kW={init:function(){this.R=this.a},forward:function(l){var d,b,Z=l.x,c=l.y,m=BX(Z-this.long0);Math.abs(c)<=hX&&(d=this.x0+this.R*m,b=this.y0);var X=SW(2*Math.abs(c/Math.PI));(Math.abs(m)<=hX||Math.abs(Math.abs(c)-sX)<=hX)&&(d=this.x0,b=c>=0?this.y0+Math.PI*this.R*Math.tan(.5*X):this.y0+Math.PI*this.R*-Math.tan(.5*X));var G=.5*Math.abs(Math.PI/m-m/Math.PI),W=G*G,u=Math.sin(X),a=Math.cos(X),s=a/(u+a-1),h=s*s,V=s*(2/u-1),y=V*V,p=Math.PI*this.R*(G*(s-y)+Math.sqrt(W*(s-y)*(s-y)-(y+W)*(h-y)))/(y+W);m<0&&(p=-p),d=this.x0+p;var t=W+s;return p=Math.PI*this.R*(V*t-G*Math.sqrt((y+W)*(W+1)-t*t))/(y+W),b=c>=0?this.y0+p:this.y0-p,l.x=d,l.y=b,l},inverse:function(l){var d,b,Z,c,m,X,G,W,u,a,s,h;return l.x-=this.x0,l.y-=this.y0,s=Math.PI*this.R,m=(Z=l.x/s)*Z+(c=l.y/s)*c,s=3*(c*c/(W=-2*(X=-Math.abs(c)*(1+m))+1+2*c*c+m*m)+(2*(G=X-2*c*c+Z*Z)*G*G/W/W/W-9*X*G/W/W)/27)/(u=(X-G*G/3/W)/W)/(a=2*Math.sqrt(-u/3)),Math.abs(s)>1&&(s=s>=0?1:-1),h=Math.acos(s)/3,b=l.y>=0?(-a*Math.cos(h+Math.PI/3)-G/3/W)*Math.PI:-(-a*Math.cos(h+Math.PI/3)-G/3/W)*Math.PI,d=Math.abs(Z)<hX?this.long0:BX(this.long0+Math.PI*(m-1+Math.sqrt(1+2*(Z*Z-c*c)+m*m))/2/Z),l.x=d,l.y=b,l},names:["Van_der_Grinten_I","VanDerGrinten","vandg"]};var NW={init:function(){this.sin_p12=Math.sin(this.lat0),this.cos_p12=Math.cos(this.lat0)},forward:function(l){var d,b,Z,c,m,X,G,W,u,a,s,h,V,y,p,t,n,i,R,o,L,K,H=l.x,x=l.y,S=Math.sin(l.y),Y=Math.cos(l.y),e=BX(H-this.long0);return this.sphere?Math.abs(this.sin_p12-1)<=hX?(l.x=this.x0+this.a*(sX-x)*Math.sin(e),l.y=this.y0-this.a*(sX-x)*Math.cos(e),l):Math.abs(this.sin_p12+1)<=hX?(l.x=this.x0+this.a*(sX+x)*Math.sin(e),l.y=this.y0+this.a*(sX+x)*Math.cos(e),l):(i=this.sin_p12*S+this.cos_p12*Y*Math.cos(e),n=(t=Math.acos(i))?t/Math.sin(t):1,l.x=this.x0+this.a*n*Y*Math.sin(e),l.y=this.y0+this.a*n*(this.cos_p12*S-this.sin_p12*Y*Math.cos(e)),l):(d=uW(this.es),b=aW(this.es),Z=sW(this.es),c=hW(this.es),Math.abs(this.sin_p12-1)<=hX?(m=this.a*WW(d,b,Z,c,sX),X=this.a*WW(d,b,Z,c,x),l.x=this.x0+(m-X)*Math.sin(e),l.y=this.y0-(m-X)*Math.cos(e),l):Math.abs(this.sin_p12+1)<=hX?(m=this.a*WW(d,b,Z,c,sX),X=this.a*WW(d,b,Z,c,x),l.x=this.x0+(m+X)*Math.sin(e),l.y=this.y0+(m+X)*Math.cos(e),l):(G=S/Y,W=VW(this.a,this.e,this.sin_p12),u=VW(this.a,this.e,S),a=Math.atan((1-this.es)*G+this.es*W*this.sin_p12/(u*Y)),R=0===(s=Math.atan2(Math.sin(e),this.cos_p12*Math.tan(a)-this.sin_p12*Math.cos(e)))?Math.asin(this.cos_p12*Math.sin(a)-this.sin_p12*Math.cos(a)):Math.abs(Math.abs(s)-Math.PI)<=hX?-Math.asin(this.cos_p12*Math.sin(a)-this.sin_p12*Math.cos(a)):Math.asin(Math.sin(e)*Math.cos(a)/Math.sin(s)),h=this.e*this.sin_p12/Math.sqrt(1-this.es),t=W*R*(1-(o=R*R)*(p=(V=this.e*this.cos_p12*Math.cos(s)/Math.sqrt(1-this.es))*V)*(1-p)/6+(L=o*R)/8*(y=h*V)*(1-2*p)+(K=L*R)/120*(p*(4-7*p)-3*h*h*(1-7*p))-K*R/48*y),l.x=this.x0+t*Math.sin(s),l.y=this.y0+t*Math.cos(s),l))},inverse:function(l){var d,b,Z,c,m,X,G,W,u,a,s,h,V,y,p,t,n,i,R,o,L,K,H;if(l.x-=this.x0,l.y-=this.y0,this.sphere){if((d=Math.sqrt(l.x*l.x+l.y*l.y))>2*sX*this.a)return;return b=d/this.a,Z=Math.sin(b),c=Math.cos(b),m=this.long0,Math.abs(d)<=hX?X=this.lat0:(X=SW(c*this.sin_p12+l.y*Z*this.cos_p12/d),G=Math.abs(this.lat0)-sX,m=Math.abs(G)<=hX?this.lat0>=0?BX(this.long0+Math.atan2(l.x,-l.y)):BX(this.long0-Math.atan2(-l.x,l.y)):BX(this.long0+Math.atan2(l.x*Z,d*this.cos_p12*c-l.y*this.sin_p12*Z))),l.x=m,l.y=X,l}return W=uW(this.es),u=aW(this.es),a=sW(this.es),s=hW(this.es),Math.abs(this.sin_p12-1)<=hX?(X=pW(((h=this.a*WW(W,u,a,s,sX))-(d=Math.sqrt(l.x*l.x+l.y*l.y)))/this.a,W,u,a,s),m=BX(this.long0+Math.atan2(l.x,-1*l.y)),l.x=m,l.y=X,l):Math.abs(this.sin_p12+1)<=hX?(h=this.a*WW(W,u,a,s,sX),X=pW(((d=Math.sqrt(l.x*l.x+l.y*l.y))-h)/this.a,W,u,a,s),m=BX(this.long0+Math.atan2(l.x,l.y)),l.x=m,l.y=X,l):(d=Math.sqrt(l.x*l.x+l.y*l.y),p=Math.atan2(l.x,l.y),V=VW(this.a,this.e,this.sin_p12),t=Math.cos(p),i=-(n=this.e*this.cos_p12*t)*n/(1-this.es),R=3*this.es*(1-i)*this.sin_p12*this.cos_p12*t/(1-this.es),K=1-i*(L=(o=d/V)-i*(1+i)*Math.pow(o,3)/6-R*(1+3*i)*Math.pow(o,4)/24)*L/2-o*L*L*L/6,y=Math.asin(this.sin_p12*Math.cos(L)+this.cos_p12*Math.sin(L)*t),m=BX(this.long0+Math.asin(Math.sin(p)*Math.sin(L)/Math.cos(y))),H=Math.sin(y),X=Math.atan2((H-this.es*K*this.sin_p12)*Math.tan(y),H*(1-this.es)),l.x=m,l.y=X,l)},names:["Azimuthal_Equidistant","aeqd"]};var gW={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(l){var d,b,Z,c,m,X,G,W=l.x,u=l.y;return Z=BX(W-this.long0),d=Math.sin(u),b=Math.cos(u),c=Math.cos(Z),1,((m=this.sin_p14*d+this.cos_p14*b*c)>0||Math.abs(m)<=hX)&&(X=1*this.a*b*Math.sin(Z),G=this.y0+1*this.a*(this.cos_p14*d-this.sin_p14*b*c)),l.x=X,l.y=G,l},inverse:function(l){var d,b,Z,c,m,X,G;return l.x-=this.x0,l.y-=this.y0,b=SW((d=Math.sqrt(l.x*l.x+l.y*l.y))/this.a),Z=Math.sin(b),c=Math.cos(b),X=this.long0,Math.abs(d)<=hX?(G=this.lat0,l.x=X,l.y=G,l):(G=SW(c*this.sin_p14+l.y*Z*this.cos_p14/d),m=Math.abs(this.lat0)-sX,Math.abs(m)<=hX?(X=this.lat0>=0?BX(this.long0+Math.atan2(l.x,-l.y)):BX(this.long0-Math.atan2(-l.x,l.y)),l.x=X,l.y=G,l):(X=BX(this.long0+Math.atan2(l.x*Z,d*this.cos_p14*c-l.y*this.sin_p14*Z)),l.x=X,l.y=G,l))},names:["ortho"]},PW=1,BW=2,wW=3,UW=4,rW=5,QW=6,jW=1,fW=2,EW=3,OW=4;function DW(l,d,b,Z){var c;return l<hX?(Z.value=jW,c=0):(c=Math.atan2(d,b),Math.abs(c)<=pX?Z.value=jW:c>pX&&c<=sX+pX?(Z.value=fW,c-=sX):c>sX+pX||c<=-(sX+pX)?(Z.value=EW,c=c>=0?c-nX:c+nX):(Z.value=OW,c+=sX)),c}function AW(l,d){var b=l+d;return b<-nX?b+=tX:b>+nX&&(b-=tX),b}var _W={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Quadrilateralized Spherical Cube",this.lat0>=sX-pX/2?this.face=rW:this.lat0<=-(sX-pX/2)?this.face=QW:Math.abs(this.long0)<=pX?this.face=PW:Math.abs(this.long0)<=sX+pX?this.face=this.long0>0?BW:UW:this.face=wW,0!==this.es&&(this.one_minus_f=1-(this.a-this.b)/this.a,this.one_minus_f_squared=this.one_minus_f*this.one_minus_f)},forward:function(l){var d,b,Z,c,m,X,G={x:0,y:0},W={value:0};if(l.x-=this.long0,d=0!==this.es?Math.atan(this.one_minus_f_squared*Math.tan(l.y)):l.y,b=l.x,this.face===rW)c=sX-d,b>=pX&&b<=sX+pX?(W.value=jW,Z=b-sX):b>sX+pX||b<=-(sX+pX)?(W.value=fW,Z=b>0?b-nX:b+nX):b>-(sX+pX)&&b<=-pX?(W.value=EW,Z=b+sX):(W.value=OW,Z=b);else if(this.face===QW)c=sX+d,b>=pX&&b<=sX+pX?(W.value=jW,Z=-b+sX):b<pX&&b>=-pX?(W.value=fW,Z=-b):b<-pX&&b>=-(sX+pX)?(W.value=EW,Z=-b-sX):(W.value=OW,Z=b>0?-b+nX:-b-nX);else{var u,a,s,h,V,y;this.face===BW?b=AW(b,+sX):this.face===wW?b=AW(b,+nX):this.face===UW&&(b=AW(b,-sX)),h=Math.sin(d),V=Math.cos(d),y=Math.sin(b),u=V*Math.cos(b),a=V*y,s=h,this.face===PW?Z=DW(c=Math.acos(u),s,a,W):this.face===BW?Z=DW(c=Math.acos(a),s,-u,W):this.face===wW?Z=DW(c=Math.acos(-u),s,-a,W):this.face===UW?Z=DW(c=Math.acos(-a),s,u,W):(c=Z=0,W.value=jW)}return X=Math.atan(12/nX*(Z+Math.acos(Math.sin(Z)*Math.cos(pX))-sX)),m=Math.sqrt((1-Math.cos(c))/(Math.cos(X)*Math.cos(X))/(1-Math.cos(Math.atan(1/Math.cos(Z))))),W.value===fW?X+=sX:W.value===EW?X+=nX:W.value===OW&&(X+=1.5*nX),G.x=m*Math.cos(X),G.y=m*Math.sin(X),G.x=G.x*this.a+this.x0,G.y=G.y*this.a+this.y0,l.x=G.x,l.y=G.y,l},inverse:function(l){var d,b,Z,c,m,X,G,W,u,a,s,h,V={lam:0,phi:0},y={value:0};if(l.x=(l.x-this.x0)/this.a,l.y=(l.y-this.y0)/this.a,b=Math.atan(Math.sqrt(l.x*l.x+l.y*l.y)),d=Math.atan2(l.y,l.x),l.x>=0&&l.x>=Math.abs(l.y)?y.value=jW:l.y>=0&&l.y>=Math.abs(l.x)?(y.value=fW,d-=sX):l.x<0&&-l.x>=Math.abs(l.y)?(y.value=EW,d=d<0?d+nX:d-nX):(y.value=OW,d+=sX),u=nX/12*Math.tan(d),m=Math.sin(u)/(Math.cos(u)-1/Math.sqrt(2)),X=Math.atan(m),(G=1-(Z=Math.cos(d))*Z*(c=Math.tan(b))*c*(1-Math.cos(Math.atan(1/Math.cos(X)))))<-1?G=-1:G>1&&(G=1),this.face===rW)W=Math.acos(G),V.phi=sX-W,y.value===jW?V.lam=X+sX:y.value===fW?V.lam=X<0?X+nX:X-nX:y.value===EW?V.lam=X-sX:V.lam=X;else if(this.face===QW)W=Math.acos(G),V.phi=W-sX,y.value===jW?V.lam=-X+sX:y.value===fW?V.lam=-X:y.value===EW?V.lam=-X-sX:V.lam=X<0?-X-nX:-X+nX;else{var p,t,n;u=(p=G)*p,t=(u+=(n=u>=1?0:Math.sqrt(1-u)*Math.sin(X))*n)>=1?0:Math.sqrt(1-u),y.value===fW?(u=t,t=-n,n=u):y.value===EW?(t=-t,n=-n):y.value===OW&&(u=t,t=n,n=-u),this.face===BW?(u=p,p=-t,t=u):this.face===wW?(p=-p,t=-t):this.face===UW&&(u=p,p=t,t=-u),V.phi=Math.acos(-n)-sX,V.lam=Math.atan2(t,p),this.face===BW?V.lam=AW(V.lam,-sX):this.face===wW?V.lam=AW(V.lam,-nX):this.face===UW&&(V.lam=AW(V.lam,+sX))}return 0!==this.es&&(a=V.phi<0?1:0,s=Math.tan(V.phi),h=this.b/Math.sqrt(s*s+this.one_minus_f_squared),V.phi=Math.atan(Math.sqrt(this.a*this.a-h*h)/(this.one_minus_f*h)),a&&(V.phi=-V.phi)),V.lam+=this.long0,l.x=V.lam,l.y=V.phi,l},names:["Quadrilateralized Spherical Cube","Quadrilateralized_Spherical_Cube","qsc"]},qW=[[1,22199e-21,-715515e-10,31103e-10],[.9986,-482243e-9,-24897e-9,-13309e-10],[.9954,-83103e-8,-448605e-10,-9.86701e-7],[.99,-.00135364,-59661e-9,36777e-10],[.9822,-.00167442,-449547e-11,-572411e-11],[.973,-.00214868,-903571e-10,1.8736e-8],[.96,-.00305085,-900761e-10,164917e-11],[.9427,-.00382792,-653386e-10,-26154e-10],[.9216,-.00467746,-10457e-8,481243e-11],[.8962,-.00536223,-323831e-10,-543432e-11],[.8679,-.00609363,-113898e-9,332484e-11],[.835,-.00698325,-640253e-10,9.34959e-7],[.7986,-.00755338,-500009e-10,9.35324e-7],[.7597,-.00798324,-35971e-9,-227626e-11],[.7186,-.00851367,-701149e-10,-86303e-10],[.6732,-.00986209,-199569e-9,191974e-10],[.6213,-.010418,883923e-10,624051e-11],[.5722,-.00906601,182e-6,624051e-11],[.5322,-.00677797,275608e-9,624051e-11]],$W=[[-520417e-23,.0124,121431e-23,-845284e-16],[.062,.0124,-1.26793e-9,4.22642e-10],[.124,.0124,5.07171e-9,-1.60604e-9],[.186,.0123999,-1.90189e-8,6.00152e-9],[.248,.0124002,7.10039e-8,-2.24e-8],[.31,.0123992,-2.64997e-7,8.35986e-8],[.372,.0124029,9.88983e-7,-3.11994e-7],[.434,.0123893,-369093e-11,-4.35621e-7],[.4958,.0123198,-102252e-10,-3.45523e-7],[.5571,.0121916,-154081e-10,-5.82288e-7],[.6176,.0119938,-241424e-10,-5.25327e-7],[.6769,.011713,-320223e-10,-5.16405e-7],[.7346,.0113541,-397684e-10,-6.09052e-7],[.7903,.0109107,-489042e-10,-104739e-11],[.8435,.0103431,-64615e-9,-1.40374e-9],[.8936,.00969686,-64636e-9,-8547e-9],[.9394,.00840947,-192841e-9,-42106e-10],[.9761,.00616527,-256e-6,-42106e-10],[1,.00328947,-319159e-9,-42106e-10]],lu=.8487,du=1.3523,bu=yX/5,Zu=18,cu=function(l,d){return l[0]+d*(l[1]+d*(l[2]+d*l[3]))};var mu={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.long0=this.long0||0,this.es=0,this.title=this.title||"Robinson"},forward:function(l){var d=BX(l.x-this.long0),b=Math.abs(l.y),Z=Math.floor(b*bu);Z<0?Z=0:Z>=Zu&&(Z=17);var c={x:cu(qW[Z],b=yX*(b-.08726646259971647*Z))*d,y:cu($W[Z],b)};return l.y<0&&(c.y=-c.y),c.x=c.x*this.a*lu+this.x0,c.y=c.y*this.a*du+this.y0,c},inverse:function(l){var d={x:(l.x-this.x0)/(this.a*lu),y:Math.abs(l.y-this.y0)/(this.a*du)};if(d.y>=1)d.x/=qW[18][0],d.y=l.y<0?-sX:sX;else{var b=Math.floor(d.y*Zu);for(b<0?b=0:b>=Zu&&(b=17);;)if($W[b][0]>d.y)--b;else{if(!($W[b+1][0]<=d.y))break;++b}var Z=$W[b],c=5*(d.y-Z[0])/($W[b+1][0]-Z[0]);c=function(l,d,b,Z){for(var c=d;Z;--Z){var m=l(c);if(c-=m,Math.abs(m)<b)break}return c}((function(l){return(cu(Z,l)-d.y)/function(l,d){return l[1]+d*(2*l[2]+3*d*l[3])}(Z,l)}),c,hX,100),d.x/=cu(qW[b],c),d.y=(5*b+c)*VX,l.y<0&&(d.y=-d.y)}return d.x=BX(d.x+this.long0),d},names:["Robinson","robin"]};var Xu={init:function(){this.name="geocent"},forward:function(l){return XG(l,this.es,this.a)},inverse:function(l){return GG(l,this.es,this.a,this.b)},names:["Geocentric","geocentric","geocent","Geocent"]},Gu=0,Wu=1,uu=2,au=3,su={h:{def:1e5,num:!0},azi:{def:0,num:!0,degrees:!0},tilt:{def:0,num:!0,degrees:!0},long0:{def:0,num:!0},lat0:{def:0,num:!0}};var hu={init:function(){if(Object.keys(su).forEach(function(l){if(void 0===this[l])this[l]=su[l].def;else{if(su[l].num&&isNaN(this[l]))throw new Error("Invalid parameter value, must be numeric "+l+" = "+this[l]);su[l].num&&(this[l]=parseFloat(this[l]))}su[l].degrees&&(this[l]=this[l]*VX)}.bind(this)),Math.abs(Math.abs(this.lat0)-sX)<hX?this.mode=this.lat0<0?Wu:Gu:Math.abs(this.lat0)<hX?this.mode=uu:(this.mode=au,this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0)),this.pn1=this.h/this.a,this.pn1<=0||this.pn1>1e10)throw new Error("Invalid height");this.p=1+this.pn1,this.rp=1/this.p,this.h1=1/this.pn1,this.pfact=(this.p+1)*this.h1,this.es=0;var l=this.tilt,d=this.azi;this.cg=Math.cos(d),this.sg=Math.sin(d),this.cw=Math.cos(l),this.sw=Math.sin(l)},forward:function(l){l.x-=this.long0;var d,b,Z,c,m=Math.sin(l.y),X=Math.cos(l.y),G=Math.cos(l.x);switch(this.mode){case au:b=this.sinph0*m+this.cosph0*X*G;break;case uu:b=X*G;break;case Wu:b=-m;break;case Gu:b=m}switch(d=(b=this.pn1/(this.p-b))*X*Math.sin(l.x),this.mode){case au:b*=this.cosph0*m-this.sinph0*X*G;break;case uu:b*=m;break;case Gu:b*=-X*G;break;case Wu:b*=X*G}return c=1/((Z=b*this.cg+d*this.sg)*this.sw*this.h1+this.cw),d=(d*this.cg-b*this.sg)*this.cw*c,b=Z*c,l.x=d*this.a,l.y=b*this.a,l},inverse:function(l){l.x/=this.a,l.y/=this.a;var d,b,Z,c={x:l.x,y:l.y};Z=1/(this.pn1-l.y*this.sw),d=this.pn1*l.x*Z,b=this.pn1*l.y*this.cw*Z,l.x=d*this.cg+b*this.sg,l.y=b*this.cg-d*this.sg;var m=EG(l.x,l.y);if(Math.abs(m)<hX)c.x=0,c.y=l.y;else{var X,G;switch(G=1-m*m*this.pfact,G=(this.p-Math.sqrt(G))/(this.pn1/m+m/this.pn1),X=Math.sqrt(1-G*G),this.mode){case au:c.y=Math.asin(X*this.sinph0+l.y*G*this.cosph0/m),l.y=(X-this.sinph0*Math.sin(c.y))*m,l.x*=G*this.cosph0;break;case uu:c.y=Math.asin(l.y*G/m),l.y=X*m,l.x*=G;break;case Gu:c.y=Math.asin(X),l.y=-l.y;break;case Wu:c.y=-Math.asin(X)}c.x=Math.atan2(l.x,l.y)}return l.x=c.x+this.long0,l.y=c.y,l},names:["Tilted_Perspective","tpers"]};var Vu={init:function(){if(this.flip_axis="x"===this.sweep?1:0,this.h=Number(this.h),this.radius_g_1=this.h/this.a,this.radius_g_1<=0||this.radius_g_1>1e10)throw new Error;if(this.radius_g=1+this.radius_g_1,this.C=this.radius_g*this.radius_g-1,0!==this.es){var l=1-this.es,d=1/l;this.radius_p=Math.sqrt(l),this.radius_p2=l,this.radius_p_inv2=d,this.shape="ellipse"}else this.radius_p=1,this.radius_p2=1,this.radius_p_inv2=1,this.shape="sphere";this.title||(this.title="Geostationary Satellite View")},forward:function(l){var d,b,Z,c,m=l.x,X=l.y;if(m-=this.long0,"ellipse"===this.shape){X=Math.atan(this.radius_p2*Math.tan(X));var G=this.radius_p/EG(this.radius_p*Math.cos(X),Math.sin(X));if(b=G*Math.cos(m)*Math.cos(X),Z=G*Math.sin(m)*Math.cos(X),c=G*Math.sin(X),(this.radius_g-b)*b-Z*Z-c*c*this.radius_p_inv2<0)return l.x=Number.NaN,l.y=Number.NaN,l;d=this.radius_g-b,this.flip_axis?(l.x=this.radius_g_1*Math.atan(Z/EG(c,d)),l.y=this.radius_g_1*Math.atan(c/d)):(l.x=this.radius_g_1*Math.atan(Z/d),l.y=this.radius_g_1*Math.atan(c/EG(Z,d)))}else"sphere"===this.shape&&(d=Math.cos(X),b=Math.cos(m)*d,Z=Math.sin(m)*d,c=Math.sin(X),d=this.radius_g-b,this.flip_axis?(l.x=this.radius_g_1*Math.atan(Z/EG(c,d)),l.y=this.radius_g_1*Math.atan(c/d)):(l.x=this.radius_g_1*Math.atan(Z/d),l.y=this.radius_g_1*Math.atan(c/EG(Z,d))));return l.x=l.x*this.a,l.y=l.y*this.a,l},inverse:function(l){var d,b,Z,c,m=-1,X=0,G=0;if(l.x=l.x/this.a,l.y=l.y/this.a,"ellipse"===this.shape){this.flip_axis?(G=Math.tan(l.y/this.radius_g_1),X=Math.tan(l.x/this.radius_g_1)*EG(1,G)):(X=Math.tan(l.x/this.radius_g_1),G=Math.tan(l.y/this.radius_g_1)*EG(1,X));var W=G/this.radius_p;if(d=X*X+W*W+m*m,(Z=(b=2*this.radius_g*m)*b-4*d*this.C)<0)return l.x=Number.NaN,l.y=Number.NaN,l;c=(-b-Math.sqrt(Z))/(2*d),m=this.radius_g+c*m,X*=c,G*=c,l.x=Math.atan2(X,m),l.y=Math.atan(G*Math.cos(l.x)/m),l.y=Math.atan(this.radius_p_inv2*Math.tan(l.y))}else if("sphere"===this.shape){if(this.flip_axis?(G=Math.tan(l.y/this.radius_g_1),X=Math.tan(l.x/this.radius_g_1)*Math.sqrt(1+G*G)):(X=Math.tan(l.x/this.radius_g_1),G=Math.tan(l.y/this.radius_g_1)*Math.sqrt(1+X*X)),d=X*X+G*G+m*m,(Z=(b=2*this.radius_g*m)*b-4*d*this.C)<0)return l.x=Number.NaN,l.y=Number.NaN,l;c=(-b-Math.sqrt(Z))/(2*d),m=this.radius_g+c*m,X*=c,G*=c,l.x=Math.atan2(X,m),l.y=Math.atan(G*Math.cos(l.x)/m)}return l.x=l.x+this.long0,l},names:["Geostationary Satellite View","Geostationary_Satellite","geos"]};oG.defaultDatum="WGS84",oG.Proj=mG,oG.WGS84=new oG.Proj("WGS84"),oG.Point=gG,oG.toPoint=yG,oG.defs=CX,oG.nadgrid=function(l,d){var b=new DataView(d),Z=function(l){var d=l.getInt32(8,!1);if(11===d)return!1;11!==(d=l.getInt32(8,!0))&&console.warn("Failed to detect nadgrid endian-ness, defaulting to little-endian");return!0}(b),c=function(l,d){return{nFields:l.getInt32(8,d),nSubgridFields:l.getInt32(24,d),nSubgrids:l.getInt32(40,d),shiftType:dG(l,56,64).trim(),fromSemiMajorAxis:l.getFloat64(120,d),fromSemiMinorAxis:l.getFloat64(136,d),toSemiMajorAxis:l.getFloat64(152,d),toSemiMinorAxis:l.getFloat64(168,d)}}(b,Z);c.nSubgrids>1&&console.log("Only single NTv2 subgrids are currently supported, subsequent sub grids are ignored");var m=function(l,d,b){for(var Z=176,c=[],m=0;m<d.nSubgrids;m++){var X=ZG(l,Z,b),G=cG(l,Z,X,b),W=Math.round(1+(X.upperLongitude-X.lowerLongitude)/X.longitudeInterval),u=Math.round(1+(X.upperLatitude-X.lowerLatitude)/X.latitudeInterval);c.push({ll:[lG(X.lowerLongitude),lG(X.lowerLatitude)],del:[lG(X.longitudeInterval),lG(X.latitudeInterval)],lim:[W,u],count:X.gridNodeCount,cvs:bG(G)})}return c}(b,c,Z),X={header:c,subgrids:m};return qX[l]=X,X},oG.transform=tG,oG.mgrs=JG,oG.version="__VERSION__",function(l){l.Proj.projections.add(jG),l.Proj.projections.add(_G),l.Proj.projections.add(qG),l.Proj.projections.add(dW),l.Proj.projections.add(bW),l.Proj.projections.add(ZW),l.Proj.projections.add(mW),l.Proj.projections.add(XW),l.Proj.projections.add(GW),l.Proj.projections.add(tW),l.Proj.projections.add(xW),l.Proj.projections.add(YW),l.Proj.projections.add(eW),l.Proj.projections.add(JW),l.Proj.projections.add(zW),l.Proj.projections.add(vW),l.Proj.projections.add(TW),l.Proj.projections.add(MW),l.Proj.projections.add(CW),l.Proj.projections.add(FW),l.Proj.projections.add(IW),l.Proj.projections.add(kW),l.Proj.projections.add(NW),l.Proj.projections.add(gW),l.Proj.projections.add(_W),l.Proj.projections.add(mu),l.Proj.projections.add(Xu),l.Proj.projections.add(hu),l.Proj.projections.add(Vu)}(oG),oG.defs([["EPSG:4326","+title=WGS84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"],["EPSG:3826","+title=TWD97 TM2 +proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=GRS80 +units=m +no_defs"],["EPSG:3828","+title=TWD67 TM2 +proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=aust_SA +towgs84=-752,-358,-179,-0.0000011698,0.0000018398,0.0000009822,0.00002329 +units=m +no_defs"]]);var yu=function(l,d){var b=[];return Gl(l,(function(l,Z,c){d(l,Z,c)&&b.push(l)})),b};var pu=function(l,d){return(k(l)?Sd:yu)(l,Mb(d))},tu=function(){try{var l=Bl(Object,"defineProperty");return l({},"",{}),l}catch(l){}}();var nu=function(l,d,b){"__proto__"==d&&tu?tu(l,d,{configurable:!0,enumerable:!0,value:b,writable:!0}):l[d]=b},iu=Object.prototype.hasOwnProperty;var Ru=function(l,d,b){var Z=l[d];iu.call(l,d)&&Vl(Z,b)&&(void 0!==b||d in l)||nu(l,d,b)};var ou=function(l,d,b,Z){var c=!b;b||(b={});for(var m=-1,X=d.length;++m<X;){var G=d[m],W=Z?Z(b[G],l[G],G,b,l):void 0;void 0===W&&(W=l[G]),c?nu(b,G,W):Ru(b,G,W)}return b};var Lu=function(l,d){return l&&ou(d,ml(d),l)};var Ku=function(l){var d=[];if(null!=l)for(var b in Object(l))d.push(b);return d},Hu=Object.prototype.hasOwnProperty;var xu=function(l){if(!bl(l))return Ku(l);var d=_(l),b=[];for(var Z in l)("constructor"!=Z||!d&&Hu.call(l,Z))&&b.push(Z);return b};var Su=function(l){return cl(l)?D(l,!0):xu(l)};var Yu=function(l,d){return l&&ou(d,Su(d),l)},eu=p((function(l,d){var b=d&&!d.nodeType&&d,Z=b&&l&&!l.nodeType&&l,c=Z&&Z.exports===b?i.Buffer:void 0,m=c?c.allocUnsafe:void 0;l.exports=function(l,d){if(d)return l.slice();var b=l.length,Z=m?m(b):new l.constructor(b);return l.copy(Z),Z}}));var Ju=function(l,d){var b=-1,Z=l.length;for(d||(d=Array(Z));++b<Z;)d[b]=l[b];return d};var zu=function(l,d){return ou(l,vd(l),d)},vu=q(Object.getPrototypeOf,Object),Tu=Object.getOwnPropertySymbols?function(l){for(var d=[];l;)Hd(d,vd(l)),l=vu(l);return d}:Yd,Mu=Tu;var Cu=function(l,d){return ou(l,Mu(l),d)};var Fu=function(l){return xd(l,Su,Mu)},Iu=Object.prototype.hasOwnProperty;var ku=function(l){var d=l.length,b=new l.constructor(d);return d&&"string"==typeof l[0]&&Iu.call(l,"index")&&(b.index=l.index,b.input=l.input),b};var Nu=function(l){var d=new l.constructor(l.byteLength);return new nd(d).set(new nd(l)),d};var gu=function(l,d){var b=d?Nu(l.buffer):l.buffer;return new l.constructor(b,l.byteOffset,l.byteLength)},Pu=/\w*$/;var Bu=function(l){var d=new l.constructor(l.source,Pu.exec(l));return d.lastIndex=l.lastIndex,d},wu=R?R.prototype:void 0,Uu=wu?wu.valueOf:void 0;var ru=function(l){return Uu?Object(Uu.call(l)):{}};var Qu=function(l,d){var b=d?Nu(l.buffer):l.buffer;return new l.constructor(b,l.byteOffset,l.length)};var ju=function(l,d,b){var Z=l.constructor;switch(d){case"[object ArrayBuffer]":return Nu(l);case"[object Boolean]":case"[object Date]":return new Z(+l);case"[object DataView]":return gu(l,b);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return Qu(l,b);case"[object Map]":case"[object Set]":return new Z;case"[object Number]":case"[object String]":return new Z(l);case"[object RegExp]":return Bu(l);case"[object Symbol]":return ru(l)}},fu=Object.create,Eu=function(){function l(){}return function(d){if(!bl(d))return{};if(fu)return fu(d);l.prototype=d;var b=new l;return l.prototype=void 0,b}}(),Ou=Eu;var Du=function(l){return"function"!=typeof l.constructor||_(l)?{}:Ou(vu(l))};var Au=function(l){return z(l)&&"[object Map]"==Dd(l)},_u=j&&j.isMap,qu=_u?Q(_u):Au;var $u=function(l){return z(l)&&"[object Set]"==Dd(l)},la=j&&j.isSet,da=la?Q(la):$u,ba="[object Arguments]",Za="[object Function]",ca="[object Object]",ma={};ma[ba]=ma["[object Array]"]=ma["[object ArrayBuffer]"]=ma["[object DataView]"]=ma["[object Boolean]"]=ma["[object Date]"]=ma["[object Float32Array]"]=ma["[object Float64Array]"]=ma["[object Int8Array]"]=ma["[object Int16Array]"]=ma["[object Int32Array]"]=ma["[object Map]"]=ma["[object Number]"]=ma[ca]=ma["[object RegExp]"]=ma["[object Set]"]=ma["[object String]"]=ma["[object Symbol]"]=ma["[object Uint8Array]"]=ma["[object Uint8ClampedArray]"]=ma["[object Uint16Array]"]=ma["[object Uint32Array]"]=!0,ma["[object Error]"]=ma[Za]=ma["[object WeakMap]"]=!1;var Xa=function l(d,b,Z,c,m,X){var G,u=1&b,a=2&b,s=4&b;if(Z&&(G=m?Z(d,c,m,X):Z(d)),void 0!==G)return G;if(!bl(d))return d;var h=k(d);if(h){if(G=ku(d),!u)return Ju(d,G)}else{var V=Dd(d),y=V==Za||"[object GeneratorFunction]"==V;if(g(d))return eu(d,u);if(V==ca||V==ba||y&&!m){if(G=a||y?{}:Du(d),!u)return a?Cu(d,Yu(G,d)):zu(d,Lu(G,d))}else{if(!ma[V])return m?d:{};G=ju(d,V,u)}}X||(X=new ud);var p=X.get(d);if(p)return p;X.set(d,G),da(d)?d.forEach((function(c){G.add(l(c,b,Z,c,d,X))})):qu(d)&&d.forEach((function(c,m){G.set(m,l(c,b,Z,m,d,X))}));var t=h?void 0:(s?a?Fu:Td:a?Su:ml)(d);return W(t||d,(function(c,m){t&&(c=d[m=c]),Ru(G,m,l(c,b,Z,m,d,X))})),G};var Ga=function(l){return Xa(l,5)};function Wa(l){return!GZ(l)}function ua(l){return WZ(l)?Fb(l,(function(l){return Fb(l,(function(l){return[l[1],l[0]]}))})):null}function aa(l){return WZ(l)?Fb(l,(function(l){return ua(l)})):null}var sa=function(l){return!0===l||!1===l||z(l)&&"[object Boolean]"==J(l)};function ha(l){return sa(l)}var Va=/\s/;var ya=function(l){for(var d=l.length;d--&&Va.test(l.charAt(d)););return d},pa=/^\s+/;var ta=function(l){return l?l.slice(0,ya(l)+1).replace(pa,""):l},na=/^[-+]0x[0-9a-f]+$/i,ia=/^0b[01]+$/i,Ra=/^0o[0-7]+$/i,oa=parseInt;var La=function(l){if("number"==typeof l)return l;if(Gb(l))return NaN;if(bl(l)){var d="function"==typeof l.valueOf?l.valueOf():l;l=bl(d)?d+"":d}if("string"!=typeof l)return 0===l?l:+l;l=ta(l);var b=ia.test(l);return b||Ra.test(l)?oa(l.slice(2),b?2:8):na.test(l)?NaN:+l},Ka=1/0;var Ha=function(l){return l?(l=La(l))===Ka||l===-1/0?17976931348623157e292*(l<0?-1:1):l==l?l:0:0===l?l:0};function xa(l){return Dm(l)?Ha(l):0}l.calcContours=function(l){var d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};function b(l){return Um()(l)}for(var Z=xb(d,"containInner",null),c=xb(d,"clipInner",null),m=xb(d,"clipOuter",null),X=l[0][2],W=l[0][2],u=1;u<ZZ(l);u++){var a=l[u][2];X>a&&(X=a),W<a&&(W=a)}var s=b(l);if(!WZ(s))return[];var h=Fb(s,(function(l,d){return{latLngs:l.coordinates,level:l.value,effectArea:lX(l.coordinates),effectAreaCentroid:dX(l.coordinates)}})),V=Nb(Fb(h,"level")),y=Pb(Fb(h,"level"));if(y<W&&h.push({mode:"virtualEnd",latLngs:[],level:W,effectArea:0}),V>X){var p={mode:"virtualStart",latLngs:[],level:X,effectArea:0};h=[p].concat(G(h))}al(h,(function(l,d){l.level=Math.min(l.level,W),l.level=Math.max(l.level,X)}));for(var t=[],n=0;n<=h.length-2;n++){var i=h[n].latLngs,R=h[n+1].latLngs,o={text:"".concat(h[n].level," - ").concat(h[n+1].level),low:h[n].level,up:h[n+1].level},L=[];L=cX(i,R),L=xb(h[n],!1)?R:cX(i,R),t.push(GX(GX({},h[n]),{},{latLngs:L,range:o}))}var K=[];al(t,(function(l,d){var b=null;b=WZ(Z)?mX(l.latLngs,Z):l.latLngs,ZZ(b)>0&&K.push(GX(GX({},l),{},{latLngs:b}))}));var H=[];al(t=K,(function(l,d){var b=null;b=WZ(c)?cX(l.latLngs,c):l.latLngs,ZZ(b)>0&&H.push(GX(GX({},l),{},{latLngs:b}))}));var x=[];al(t=H,(function(l){var d=null;d=WZ(m)?mX(l.latLngs,m):l.latLngs,ZZ(d)>0&&x.push(GX(GX({},l),{},{latLngs:d}))}));var S=0,Y=null,e=null;return al(t=x,(function(l,d){S<l.effectArea&&(Y=d,S=l.effectArea,e=l.effectAreaCentroid)})),null===Y?[]:(al(t,(function(l,d){t[d].center=e})),t)},l.clipMultiPolygon=cX,l.convertCoordinate=function(l,d,b){if(!WZ(b)&&2!==ZZ(b))throw new Error("ps is not an array(length=2)");var Z={TWD97TM2:"EPSG:3826",TWD67TM2:"EPSG:3828",WGS84:"EPSG:4326"};Am(Z,l)&&(l=Z[l]),Am(Z,d)&&(d=Z[d]);var c=new oG.Proj(l),m=new oG.Proj(d);return oG(c,m,b)},l.distilMultiPolygon=ZX,l.fixGeometryMultiPolygon=function(l){l=Ga(l);var d=[];return al(l,(function(l){var b=function(l){l=ua(l);var d=qm.polygon(l),b=ZX(qm.buffer(d,1,{units:"kilometers"}));return aa(b)}(l);al(b,(function(l){d.push(l)}))})),d=pu(d,Wa)},l.getArea=lX,l.getCenterOfMassMultiPolygon=function(l){if(!WZ(l))return null;var d=qm.centerOfMass(qm.helpers.multiPolygon($m(l)));return xb(d,"geometry.coordinates",[])},l.getCentroidMultiPolygon=dX,l.getTurf=qm,l.intersectMultiPolygon=mX,l.invCoordMultiPolygon=aa,l.invCoordPolygon=ua,l.isPointInPolygon=function(l,d){return WZ(l)&&WZ(d)?qm.booleanPointInPolygon(l,qm.helpers.multiPolygon($m(d))):null},l.maskMultiPolygon=function(l){return WZ(l)?ZX(qm.mask(qm.helpers.multiPolygon($m(l)))):null},l.parseGeometryCollection=bX,l.simplifyMultiPolygon=function(l){var d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!WZ(l))return null;var b=xb(d,"tolerance");Dm(b)||(b=.005),b=xa(b);var Z=xb(d,"highQuality");ha(Z)||(Z=!0);var c=qm.simplify(qm.multiPolygon($m(l)),{tolerance:b,highQuality:Z});return c=xb(c,"geometry.coordinates",[])},l.splineMultiPolygon=function(l){var d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};function b(l){var d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};l=Ga(l);var b=Fb(l,(function(l,b){var Z=qm.helpers.lineString(l),c=qm.bezierSpline(Z,d);return xb(c,"geometry.coordinates")}));return b}return l=Ga(l),l=Fb(l,(function(l){return b(l,d)}))},l.toMultiPolygon=$m,Object.defineProperty(l,"__esModule",{value:!0})}));
|
|
7
7
|
//# sourceMappingURL=w-gis.umd.js.map
|