@kanaries/graphic-walker 0.4.26 → 0.4.27
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.
|
@@ -228,7 +228,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
228
228
|
*
|
|
229
229
|
* Copyright (c) 2014-2017, Jon Schlinkert.
|
|
230
230
|
* Released under the MIT License.
|
|
231
|
-
*/function oD(e){return Object.prototype.toString.call(e)==="[object Object]"}function _xe(e){var t,n;return oD(e)===!1?!1:(t=e.constructor,t===void 0?!0:(n=t.prototype,!(oD(n)===!1||n.hasOwnProperty("isPrototypeOf")===!1)))}function Gxe(e,t){return e.map(n=>{const r={};for(let i in t){const{from:o,to:a}=t[i];r[a]=u9(n,o)}return r})}function Cxe(e){return e.map((t,n)=>{const r=`gwc_${n}`;return{...t,key:r,fid:r}})}function l9(e,t){const n=Cxe(t),r=n.map((o,a)=>({from:t[a].path??[t[a].fid],to:o.fid}));return{safeData:Gxe(e,r),safeMetas:n}}function aD(e,t=[]){return Object.keys(e).flatMap(n=>_xe(e[n])?aD(e[n],t.concat(n)):[t.concat(n)])}function u9(e,t){let n=e;for(let r of t)n=n[r];return n}const sD=[/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/,/^(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])\/\d{4}$/,/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/\d{4}$/,/^\d{4}\/(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])$/,/^\d{4}\.(0[1-9]|1[0-2])\.(0[1-9]|[12][0-9]|3[01])$/,/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\s\d{2}:\d{2}:\d{2}$/,/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T\d{2}:\d{2}:\d{2}$/,/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T\d{2}:\d{2}:\d{2}.\d{3}Z$/],kxe=["%Y-%m-%d","%m/%d/%Y","%d/%m/%Y","%Y/%m/%d","%Y.%m.%d","%Y-%m-%d %H:%M:%S","%Y-%m-%dT%H:%M:%S","%Y-%m-%dT%H:%M:%S.%gZ"];function c9(e){if(typeof e=="number")return"timestamp";const t=sD.findIndex(n=>n.test(e));return t>=0?kxe[t]:""}function Wxe(e){let t=!0;for(let n of e){let r=!1;for(let i of sD)if(i.test(n)){r=!0;break}if(!r){t=!1;break}}return t}function Lxe(e){return e.every(t=>{if(typeof t=="number")return!0;const n=Number(t);return!isNaN(n)&&isFinite(t)})}function Txe(e){switch(e){case"quantitative":return"measure";default:return"dimension"}}function Nxe(e,t){const n=e.map(i=>u9(i,t));let r=Lxe(n)?"quantitative":"nominal";return r==="nominal"&&Wxe(e.map(i=>`${u9(i,t)}`))&&(r="temporal"),r}function Xxe(e){const{dataSource:t,fields:n}=e,r=[];for(let i of n){let o=i.semanticType==="?"?Nxe(t,i.path):i.semanticType,a=Txe(o);r.push({fid:i.fid,key:i.key?i.key:i.fid,name:i.name?i.name:i.fid,analyticType:a,semanticType:o,basename:i.basename||i.name||i.fid,path:i.path})}return r}function Oxe(e){if(e.length===0)return{dataSource:[],fields:[]};const t=e[0],n=aD(t),r=Xxe({dataSource:e,fields:n.map(s=>({fid:s[s.length-1],key:s[s.length-1],analyticType:"?",semanticType:"?",path:s,basename:s[s.length-1],name:s.join(".")}))}),{safeData:i,safeMetas:o}=l9(e,r),a=[];for(let s of i){const l={};for(let u of o)u.semanticType==="quantitative"?l[u.fid]=Number(s[u.fid]):l[u.fid]=s[u.fid];a.push(l)}return{dataSource:a,fields:o}}function zu(e){if(e===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function t2(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&k1(e,t)}function W0(e,t){if(t&&(ga(t)==="object"||typeof t=="function"))return t;if(t!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return zu(e)}function ms(e){return ms=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},ms(e)}function Vxe(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function Fxe(e){return HA(e)||Vxe(e)||JA(e)||UA()}function lD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function uD(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?lD(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):lD(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}var Mxe={type:"logger",log:function(t){this.output("log",t)},warn:function(t){this.output("warn",t)},error:function(t){this.output("error",t)},output:function(t,n){console&&console[t]&&console[t].apply(console,n)}},Yxe=function(){function e(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};Mo(this,e),this.init(t,n)}return Yo(e,[{key:"init",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.prefix=r.prefix||"i18next:",this.logger=n||Mxe,this.options=r,this.debug=r.debug}},{key:"setDebug",value:function(n){this.debug=n}},{key:"log",value:function(){for(var n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return this.forward(r,"log","",!0)}},{key:"warn",value:function(){for(var n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return this.forward(r,"warn","",!0)}},{key:"error",value:function(){for(var n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return this.forward(r,"error","")}},{key:"deprecate",value:function(){for(var n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return this.forward(r,"warn","WARNING DEPRECATED: ",!0)}},{key:"forward",value:function(n,r,i,o){return o&&!this.debug?null:(typeof n[0]=="string"&&(n[0]="".concat(i).concat(this.prefix," ").concat(n[0])),this.logger[r](n))}},{key:"create",value:function(n){return new e(this.logger,uD(uD({},{prefix:"".concat(this.prefix,":").concat(n,":")}),this.options))}},{key:"clone",value:function(n){return n=n||this.options,n.prefix=n.prefix||this.prefix,new e(this.logger,n)}}]),e}(),gs=new Yxe,Au=function(){function e(){Mo(this,e),this.observers={}}return Yo(e,[{key:"on",value:function(n,r){var i=this;return n.split(" ").forEach(function(o){i.observers[o]=i.observers[o]||[],i.observers[o].push(r)}),this}},{key:"off",value:function(n,r){if(this.observers[n]){if(!r){delete this.observers[n];return}this.observers[n]=this.observers[n].filter(function(i){return i!==r})}}},{key:"emit",value:function(n){for(var r=arguments.length,i=new Array(r>1?r-1:0),o=1;o<r;o++)i[o-1]=arguments[o];if(this.observers[n]){var a=[].concat(this.observers[n]);a.forEach(function(l){l.apply(void 0,i)})}if(this.observers["*"]){var s=[].concat(this.observers["*"]);s.forEach(function(l){l.apply(l,[n].concat(i))})}}}]),e}();function L0(){var e,t,n=new Promise(function(r,i){e=r,t=i});return n.resolve=e,n.reject=t,n}function cD(e){return e==null?"":""+e}function Pxe(e,t,n){e.forEach(function(r){t[r]&&(n[r]=t[r])})}function d9(e,t,n){function r(s){return s&&s.indexOf("###")>-1?s.replace(/###/g,"."):s}function i(){return!e||typeof e=="string"}for(var o=typeof t!="string"?[].concat(t):t.split(".");o.length>1;){if(i())return{};var a=r(o.shift());!e[a]&&n&&(e[a]=new n),Object.prototype.hasOwnProperty.call(e,a)?e=e[a]:e={}}return i()?{}:{obj:e,k:r(o.shift())}}function dD(e,t,n){var r=d9(e,t,Object),i=r.obj,o=r.k;i[o]=n}function Rxe(e,t,n,r){var i=d9(e,t,Object),o=i.obj,a=i.k;o[a]=o[a]||[],r&&(o[a]=o[a].concat(n)),r||o[a].push(n)}function n2(e,t){var n=d9(e,t),r=n.obj,i=n.k;if(r)return r[i]}function fD(e,t,n){var r=n2(e,n);return r!==void 0?r:n2(t,n)}function hD(e,t,n){for(var r in t)r!=="__proto__"&&r!=="constructor"&&(r in e?typeof e[r]=="string"||e[r]instanceof String||typeof t[r]=="string"||t[r]instanceof String?n&&(e[r]=t[r]):hD(e[r],t[r],n):e[r]=t[r]);return e}function Ph(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var zxe={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function Axe(e){return typeof e=="string"?e.replace(/[&<>"'\/]/g,function(t){return zxe[t]}):e}var r2=typeof window<"u"&&window.navigator&&typeof window.navigator.userAgentData>"u"&&window.navigator.userAgent&&window.navigator.userAgent.indexOf("MSIE")>-1,Dxe=[" ",",","?","!",";"];function jxe(e,t,n){t=t||"",n=n||"";var r=Dxe.filter(function(s){return t.indexOf(s)<0&&n.indexOf(s)<0});if(r.length===0)return!0;var i=new RegExp("(".concat(r.map(function(s){return s==="?"?"\\?":s}).join("|"),")")),o=!i.test(e);if(!o){var a=e.indexOf(n);a>0&&!i.test(e.substring(0,a))&&(o=!0)}return o}function pD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function i2(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?pD(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):pD(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function Hxe(e){var t=Bxe();return function(){var r=ms(e),i;if(t){var o=ms(this).constructor;i=Reflect.construct(r,arguments,o)}else i=r.apply(this,arguments);return W0(this,i)}}function Bxe(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function mD(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:".";if(e){if(e[t])return e[t];for(var r=t.split(n),i=e,o=0;o<r.length;++o){if(!i||typeof i[r[o]]=="string"&&o+1<r.length)return;if(i[r[o]]===void 0){for(var a=2,s=r.slice(o,o+a).join(n),l=i[s];l===void 0&&r.length>o+a;)a++,s=r.slice(o,o+a).join(n),l=i[s];if(l===void 0)return;if(l===null)return null;if(t.endsWith(s)){if(typeof l=="string")return l;if(s&&typeof l[s]=="string")return l[s]}var u=r.slice(o+a).join(n);return u?mD(l,u,n):void 0}i=i[r[o]]}return i}}var Jxe=function(e){t2(n,e);var t=Hxe(n);function n(r){var i,o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{ns:["translation"],defaultNS:"translation"};return Mo(this,n),i=t.call(this),r2&&Au.call(zu(i)),i.data=r||{},i.options=o,i.options.keySeparator===void 0&&(i.options.keySeparator="."),i.options.ignoreJSONStructure===void 0&&(i.options.ignoreJSONStructure=!0),i}return Yo(n,[{key:"addNamespaces",value:function(i){this.options.ns.indexOf(i)<0&&this.options.ns.push(i)}},{key:"removeNamespaces",value:function(i){var o=this.options.ns.indexOf(i);o>-1&&this.options.ns.splice(o,1)}},{key:"getResource",value:function(i,o,a){var s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{},l=s.keySeparator!==void 0?s.keySeparator:this.options.keySeparator,u=s.ignoreJSONStructure!==void 0?s.ignoreJSONStructure:this.options.ignoreJSONStructure,c=[i,o];a&&typeof a!="string"&&(c=c.concat(a)),a&&typeof a=="string"&&(c=c.concat(l?a.split(l):a)),i.indexOf(".")>-1&&(c=i.split("."));var d=n2(this.data,c);return d||!u||typeof a!="string"?d:mD(this.data&&this.data[i]&&this.data[i][o],a,l)}},{key:"addResource",value:function(i,o,a,s){var l=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{silent:!1},u=this.options.keySeparator;u===void 0&&(u=".");var c=[i,o];a&&(c=c.concat(u?a.split(u):a)),i.indexOf(".")>-1&&(c=i.split("."),s=o,o=c[1]),this.addNamespaces(o),dD(this.data,c,s),l.silent||this.emit("added",i,o,a,s)}},{key:"addResources",value:function(i,o,a){var s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{silent:!1};for(var l in a)(typeof a[l]=="string"||Object.prototype.toString.apply(a[l])==="[object Array]")&&this.addResource(i,o,l,a[l],{silent:!0});s.silent||this.emit("added",i,o,a)}},{key:"addResourceBundle",value:function(i,o,a,s,l){var u=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{silent:!1},c=[i,o];i.indexOf(".")>-1&&(c=i.split("."),s=a,a=o,o=c[1]),this.addNamespaces(o);var d=n2(this.data,c)||{};s?hD(d,a,l):d=i2(i2({},d),a),dD(this.data,c,d),u.silent||this.emit("added",i,o,a)}},{key:"removeResourceBundle",value:function(i,o){this.hasResourceBundle(i,o)&&delete this.data[i][o],this.removeNamespaces(o),this.emit("removed",i,o)}},{key:"hasResourceBundle",value:function(i,o){return this.getResource(i,o)!==void 0}},{key:"getResourceBundle",value:function(i,o){return o||(o=this.options.defaultNS),this.options.compatibilityAPI==="v1"?i2(i2({},{}),this.getResource(i,o)):this.getResource(i,o)}},{key:"getDataByLanguage",value:function(i){return this.data[i]}},{key:"hasLanguageSomeTranslations",value:function(i){var o=this.getDataByLanguage(i),a=o&&Object.keys(o)||[];return!!a.find(function(s){return o[s]&&Object.keys(o[s]).length>0})}},{key:"toJSON",value:function(){return this.data}}]),n}(Au),gD={processors:{},addPostProcessor:function(t){this.processors[t.name]=t},handle:function(t,n,r,i,o){var a=this;return t.forEach(function(s){a.processors[s]&&(n=a.processors[s].process(n,r,i,o))}),n}};function bD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function ui(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?bD(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):bD(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function Uxe(e){var t=Kxe();return function(){var r=ms(e),i;if(t){var o=ms(this).constructor;i=Reflect.construct(r,arguments,o)}else i=r.apply(this,arguments);return W0(this,i)}}function Kxe(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}var vD={},yD=function(e){t2(n,e);var t=Uxe(n);function n(r){var i,o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return Mo(this,n),i=t.call(this),r2&&Au.call(zu(i)),Pxe(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],r,zu(i)),i.options=o,i.options.keySeparator===void 0&&(i.options.keySeparator="."),i.logger=gs.create("translator"),i}return Yo(n,[{key:"changeLanguage",value:function(i){i&&(this.language=i)}},{key:"exists",value:function(i){var o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}};if(i==null)return!1;var a=this.resolve(i,o);return a&&a.res!==void 0}},{key:"extractFromKey",value:function(i,o){var a=o.nsSeparator!==void 0?o.nsSeparator:this.options.nsSeparator;a===void 0&&(a=":");var s=o.keySeparator!==void 0?o.keySeparator:this.options.keySeparator,l=o.ns||this.options.defaultNS||[],u=a&&i.indexOf(a)>-1,c=!this.options.userDefinedKeySeparator&&!o.keySeparator&&!this.options.userDefinedNsSeparator&&!o.nsSeparator&&!jxe(i,a,s);if(u&&!c){var d=i.match(this.interpolator.nestingRegexp);if(d&&d.length>0)return{key:i,namespaces:l};var f=i.split(a);(a!==s||a===s&&this.options.ns.indexOf(f[0])>-1)&&(l=f.shift()),i=f.join(s)}return typeof l=="string"&&(l=[l]),{key:i,namespaces:l}}},{key:"translate",value:function(i,o,a){var s=this;if(ga(o)!=="object"&&this.options.overloadTranslationOptionHandler&&(o=this.options.overloadTranslationOptionHandler(arguments)),o||(o={}),i==null)return"";Array.isArray(i)||(i=[String(i)]);var l=o.returnDetails!==void 0?o.returnDetails:this.options.returnDetails,u=o.keySeparator!==void 0?o.keySeparator:this.options.keySeparator,c=this.extractFromKey(i[i.length-1],o),d=c.key,f=c.namespaces,p=f[f.length-1],g=o.lng||this.language,b=o.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(g&&g.toLowerCase()==="cimode"){if(b){var y=o.nsSeparator||this.options.nsSeparator;return l?(x.res="".concat(p).concat(y).concat(d),x):"".concat(p).concat(y).concat(d)}return l?(x.res=d,x):d}var x=this.resolve(i,o),w=x&&x.res,Z=x&&x.usedKey||d,E=x&&x.exactUsedKey||d,I=Object.prototype.toString.apply(w),k=["[object Number]","[object Function]","[object RegExp]"],_=o.joinArrays!==void 0?o.joinArrays:this.options.joinArrays,C=!this.i18nFormat||this.i18nFormat.handleAsObject,W=typeof w!="string"&&typeof w!="boolean"&&typeof w!="number";if(C&&w&&W&&k.indexOf(I)<0&&!(typeof _=="string"&&I==="[object Array]")){if(!o.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");var T=this.options.returnedObjectHandler?this.options.returnedObjectHandler(Z,w,ui(ui({},o),{},{ns:f})):"key '".concat(d," (").concat(this.language,")' returned an object instead of string.");return l?(x.res=T,x):T}if(u){var N=I==="[object Array]",X=N?[]:{},O=N?E:Z;for(var Y in w)if(Object.prototype.hasOwnProperty.call(w,Y)){var F="".concat(O).concat(u).concat(Y);X[Y]=this.translate(F,ui(ui({},o),{joinArrays:!1,ns:f})),X[Y]===F&&(X[Y]=w[Y])}w=X}}else if(C&&typeof _=="string"&&I==="[object Array]")w=w.join(_),w&&(w=this.extendTranslation(w,i,o,a));else{var z=!1,M=!1,P=o.count!==void 0&&typeof o.count!="string",D=n.hasDefaultValue(o),A=P?this.pluralResolver.getSuffix(g,o.count,o):"",J=o["defaultValue".concat(A)]||o.defaultValue;!this.isValidLookup(w)&&D&&(z=!0,w=J),this.isValidLookup(w)||(M=!0,w=d);var U=o.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey,K=U&&M?void 0:w,ee=D&&J!==w&&this.options.updateMissing;if(M||z||ee){if(this.logger.log(ee?"updateKey":"missingKey",g,p,d,ee?J:w),u){var q=this.resolve(d,ui(ui({},o),{},{keySeparator:!1}));q&&q.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}var te=[],de=this.languageUtils.getFallbackCodes(this.options.fallbackLng,o.lng||this.language);if(this.options.saveMissingTo==="fallback"&&de&&de[0])for(var pe=0;pe<de.length;pe++)te.push(de[pe]);else this.options.saveMissingTo==="all"?te=this.languageUtils.toResolveHierarchy(o.lng||this.language):te.push(o.lng||this.language);var Q=function(ne,j,se){var xe=D&&se!==w?se:K;s.options.missingKeyHandler?s.options.missingKeyHandler(ne,p,j,xe,ee,o):s.backendConnector&&s.backendConnector.saveMissing&&s.backendConnector.saveMissing(ne,p,j,xe,ee,o),s.emit("missingKey",ne,p,j,w)};this.options.saveMissing&&(this.options.saveMissingPlurals&&P?te.forEach(function(ie){s.pluralResolver.getSuffixes(ie,o).forEach(function(ne){Q([ie],d+ne,o["defaultValue".concat(ne)]||J)})}):Q(te,d,J))}w=this.extendTranslation(w,i,o,x,a),M&&w===d&&this.options.appendNamespaceToMissingKey&&(w="".concat(p,":").concat(d)),(M||z)&&this.options.parseMissingKeyHandler&&(this.options.compatibilityAPI!=="v1"?w=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?"".concat(p,":").concat(d):d,z?w:void 0):w=this.options.parseMissingKeyHandler(w))}return l?(x.res=w,x):w}},{key:"extendTranslation",value:function(i,o,a,s,l){var u=this;if(this.i18nFormat&&this.i18nFormat.parse)i=this.i18nFormat.parse(i,ui(ui({},this.options.interpolation.defaultVariables),a),s.usedLng,s.usedNS,s.usedKey,{resolved:s});else if(!a.skipInterpolation){a.interpolation&&this.interpolator.init(ui(ui({},a),{interpolation:ui(ui({},this.options.interpolation),a.interpolation)}));var c=typeof i=="string"&&(a&&a.interpolation&&a.interpolation.skipOnVariables!==void 0?a.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables),d;if(c){var f=i.match(this.interpolator.nestingRegexp);d=f&&f.length}var p=a.replace&&typeof a.replace!="string"?a.replace:a;if(this.options.interpolation.defaultVariables&&(p=ui(ui({},this.options.interpolation.defaultVariables),p)),i=this.interpolator.interpolate(i,p,a.lng||this.language,a),c){var g=i.match(this.interpolator.nestingRegexp),b=g&&g.length;d<b&&(a.nest=!1)}a.nest!==!1&&(i=this.interpolator.nest(i,function(){for(var w=arguments.length,Z=new Array(w),E=0;E<w;E++)Z[E]=arguments[E];return l&&l[0]===Z[0]&&!a.context?(u.logger.warn("It seems you are nesting recursively key: ".concat(Z[0]," in key: ").concat(o[0])),null):u.translate.apply(u,Z.concat([o]))},a)),a.interpolation&&this.interpolator.reset()}var y=a.postProcess||this.options.postProcess,x=typeof y=="string"?[y]:y;return i!=null&&x&&x.length&&a.applyPostProcessor!==!1&&(i=gD.handle(x,i,o,this.options&&this.options.postProcessPassResolved?ui({i18nResolved:s},a):a,this)),i}},{key:"resolve",value:function(i){var o=this,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},s,l,u,c,d;return typeof i=="string"&&(i=[i]),i.forEach(function(f){if(!o.isValidLookup(s)){var p=o.extractFromKey(f,a),g=p.key;l=g;var b=p.namespaces;o.options.fallbackNS&&(b=b.concat(o.options.fallbackNS));var y=a.count!==void 0&&typeof a.count!="string",x=y&&!a.ordinal&&a.count===0&&o.pluralResolver.shouldUseIntlApi(),w=a.context!==void 0&&(typeof a.context=="string"||typeof a.context=="number")&&a.context!=="",Z=a.lngs?a.lngs:o.languageUtils.toResolveHierarchy(a.lng||o.language,a.fallbackLng);b.forEach(function(E){o.isValidLookup(s)||(d=E,!vD["".concat(Z[0],"-").concat(E)]&&o.utils&&o.utils.hasLoadedNamespace&&!o.utils.hasLoadedNamespace(d)&&(vD["".concat(Z[0],"-").concat(E)]=!0,o.logger.warn('key "'.concat(l,'" for languages "').concat(Z.join(", "),`" won't get resolved as namespace "`).concat(d,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),Z.forEach(function(I){if(!o.isValidLookup(s)){c=I;var k=[g];if(o.i18nFormat&&o.i18nFormat.addLookupKeys)o.i18nFormat.addLookupKeys(k,g,I,E,a);else{var _;y&&(_=o.pluralResolver.getSuffix(I,a.count,a));var C="".concat(o.options.pluralSeparator,"zero");if(y&&(k.push(g+_),x&&k.push(g+C)),w){var W="".concat(g).concat(o.options.contextSeparator).concat(a.context);k.push(W),y&&(k.push(W+_),x&&k.push(W+C))}}for(var T;T=k.pop();)o.isValidLookup(s)||(u=T,s=o.getResource(I,E,T,a))}}))})}}),{res:s,usedKey:l,exactUsedKey:u,usedLng:c,usedNS:d}}},{key:"isValidLookup",value:function(i){return i!==void 0&&!(!this.options.returnNull&&i===null)&&!(!this.options.returnEmptyString&&i==="")}},{key:"getResource",value:function(i,o,a){var s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(i,o,a,s):this.resourceStore.getResource(i,o,a,s)}}],[{key:"hasDefaultValue",value:function(i){var o="defaultValue";for(var a in i)if(Object.prototype.hasOwnProperty.call(i,a)&&o===a.substring(0,o.length)&&i[a]!==void 0)return!0;return!1}}]),n}(Au);function f9(e){return e.charAt(0).toUpperCase()+e.slice(1)}var $xe=function(){function e(t){Mo(this,e),this.options=t,this.supportedLngs=this.options.supportedLngs||!1,this.logger=gs.create("languageUtils")}return Yo(e,[{key:"getScriptPartFromCode",value:function(n){if(!n||n.indexOf("-")<0)return null;var r=n.split("-");return r.length===2||(r.pop(),r[r.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(r.join("-"))}},{key:"getLanguagePartFromCode",value:function(n){if(!n||n.indexOf("-")<0)return n;var r=n.split("-");return this.formatLanguageCode(r[0])}},{key:"formatLanguageCode",value:function(n){if(typeof n=="string"&&n.indexOf("-")>-1){var r=["hans","hant","latn","cyrl","cans","mong","arab"],i=n.split("-");return this.options.lowerCaseLng?i=i.map(function(o){return o.toLowerCase()}):i.length===2?(i[0]=i[0].toLowerCase(),i[1]=i[1].toUpperCase(),r.indexOf(i[1].toLowerCase())>-1&&(i[1]=f9(i[1].toLowerCase()))):i.length===3&&(i[0]=i[0].toLowerCase(),i[1].length===2&&(i[1]=i[1].toUpperCase()),i[0]!=="sgn"&&i[2].length===2&&(i[2]=i[2].toUpperCase()),r.indexOf(i[1].toLowerCase())>-1&&(i[1]=f9(i[1].toLowerCase())),r.indexOf(i[2].toLowerCase())>-1&&(i[2]=f9(i[2].toLowerCase()))),i.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?n.toLowerCase():n}},{key:"isSupportedCode",value:function(n){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(n=this.getLanguagePartFromCode(n)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(n)>-1}},{key:"getBestMatchFromCodes",value:function(n){var r=this;if(!n)return null;var i;return n.forEach(function(o){if(!i){var a=r.formatLanguageCode(o);(!r.options.supportedLngs||r.isSupportedCode(a))&&(i=a)}}),!i&&this.options.supportedLngs&&n.forEach(function(o){if(!i){var a=r.getLanguagePartFromCode(o);if(r.isSupportedCode(a))return i=a;i=r.options.supportedLngs.find(function(s){if(s.indexOf(a)===0)return s})}}),i||(i=this.getFallbackCodes(this.options.fallbackLng)[0]),i}},{key:"getFallbackCodes",value:function(n,r){if(!n)return[];if(typeof n=="function"&&(n=n(r)),typeof n=="string"&&(n=[n]),Object.prototype.toString.apply(n)==="[object Array]")return n;if(!r)return n.default||[];var i=n[r];return i||(i=n[this.getScriptPartFromCode(r)]),i||(i=n[this.formatLanguageCode(r)]),i||(i=n[this.getLanguagePartFromCode(r)]),i||(i=n.default),i||[]}},{key:"toResolveHierarchy",value:function(n,r){var i=this,o=this.getFallbackCodes(r||this.options.fallbackLng||[],n),a=[],s=function(u){u&&(i.isSupportedCode(u)?a.push(u):i.logger.warn("rejecting language code not found in supportedLngs: ".concat(u)))};return typeof n=="string"&&n.indexOf("-")>-1?(this.options.load!=="languageOnly"&&s(this.formatLanguageCode(n)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&s(this.getScriptPartFromCode(n)),this.options.load!=="currentOnly"&&s(this.getLanguagePartFromCode(n))):typeof n=="string"&&s(this.formatLanguageCode(n)),o.forEach(function(l){a.indexOf(l)<0&&s(i.formatLanguageCode(l))}),a}}]),e}(),Qxe=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kk","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],qxe={1:function(t){return Number(t>1)},2:function(t){return Number(t!=1)},3:function(t){return 0},4:function(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},5:function(t){return Number(t==0?0:t==1?1:t==2?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5)},6:function(t){return Number(t==1?0:t>=2&&t<=4?1:2)},7:function(t){return Number(t==1?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},8:function(t){return Number(t==1?0:t==2?1:t!=8&&t!=11?2:3)},9:function(t){return Number(t>=2)},10:function(t){return Number(t==1?0:t==2?1:t<7?2:t<11?3:4)},11:function(t){return Number(t==1||t==11?0:t==2||t==12?1:t>2&&t<20?2:3)},12:function(t){return Number(t%10!=1||t%100==11)},13:function(t){return Number(t!==0)},14:function(t){return Number(t==1?0:t==2?1:t==3?2:3)},15:function(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&(t%100<10||t%100>=20)?1:2)},16:function(t){return Number(t%10==1&&t%100!=11?0:t!==0?1:2)},17:function(t){return Number(t==1||t%10==1&&t%100!=11?0:1)},18:function(t){return Number(t==0?0:t==1?1:2)},19:function(t){return Number(t==1?0:t==0||t%100>1&&t%100<11?1:t%100>10&&t%100<20?2:3)},20:function(t){return Number(t==1?0:t==0||t%100>0&&t%100<20?1:2)},21:function(t){return Number(t%100==1?1:t%100==2?2:t%100==3||t%100==4?3:0)},22:function(t){return Number(t==1?0:t==2?1:(t<0||t>10)&&t%10==0?2:3)}},e2e=["v1","v2","v3"],xD={zero:0,one:1,two:2,few:3,many:4,other:5};function t2e(){var e={};return Qxe.forEach(function(t){t.lngs.forEach(function(n){e[n]={numbers:t.nr,plurals:qxe[t.fc]}})}),e}var n2e=function(){function e(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};Mo(this,e),this.languageUtils=t,this.options=n,this.logger=gs.create("pluralResolver"),(!this.options.compatibilityJSON||this.options.compatibilityJSON==="v4")&&(typeof Intl>"u"||!Intl.PluralRules)&&(this.options.compatibilityJSON="v3",this.logger.error("Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.")),this.rules=t2e()}return Yo(e,[{key:"addRule",value:function(n,r){this.rules[n]=r}},{key:"getRule",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(this.shouldUseIntlApi())try{return new Intl.PluralRules(n,{type:r.ordinal?"ordinal":"cardinal"})}catch{return}return this.rules[n]||this.rules[this.languageUtils.getLanguagePartFromCode(n)]}},{key:"needsPlural",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=this.getRule(n,r);return this.shouldUseIntlApi()?i&&i.resolvedOptions().pluralCategories.length>1:i&&i.numbers.length>1}},{key:"getPluralFormsOfKey",value:function(n,r){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return this.getSuffixes(n,i).map(function(o){return"".concat(r).concat(o)})}},{key:"getSuffixes",value:function(n){var r=this,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=this.getRule(n,i);return o?this.shouldUseIntlApi()?o.resolvedOptions().pluralCategories.sort(function(a,s){return xD[a]-xD[s]}).map(function(a){return"".concat(r.options.prepend).concat(a)}):o.numbers.map(function(a){return r.getSuffix(n,a,i)}):[]}},{key:"getSuffix",value:function(n,r){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},o=this.getRule(n,i);return o?this.shouldUseIntlApi()?"".concat(this.options.prepend).concat(o.select(r)):this.getSuffixRetroCompatible(o,r):(this.logger.warn("no plural rule found for: ".concat(n)),"")}},{key:"getSuffixRetroCompatible",value:function(n,r){var i=this,o=n.noAbs?n.plurals(r):n.plurals(Math.abs(r)),a=n.numbers[o];this.options.simplifyPluralSuffix&&n.numbers.length===2&&n.numbers[0]===1&&(a===2?a="plural":a===1&&(a=""));var s=function(){return i.options.prepend&&a.toString()?i.options.prepend+a.toString():a.toString()};return this.options.compatibilityJSON==="v1"?a===1?"":typeof a=="number"?"_plural_".concat(a.toString()):s():this.options.compatibilityJSON==="v2"||this.options.simplifyPluralSuffix&&n.numbers.length===2&&n.numbers[0]===1?s():this.options.prepend&&o.toString()?this.options.prepend+o.toString():o.toString()}},{key:"shouldUseIntlApi",value:function(){return!e2e.includes(this.options.compatibilityJSON)}}]),e}();function wD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function Ea(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?wD(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):wD(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}var r2e=function(){function e(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Mo(this,e),this.logger=gs.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||function(n){return n},this.init(t)}return Yo(e,[{key:"init",value:function(){var n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};n.interpolation||(n.interpolation={escapeValue:!0});var r=n.interpolation;this.escape=r.escape!==void 0?r.escape:Axe,this.escapeValue=r.escapeValue!==void 0?r.escapeValue:!0,this.useRawValueToEscape=r.useRawValueToEscape!==void 0?r.useRawValueToEscape:!1,this.prefix=r.prefix?Ph(r.prefix):r.prefixEscaped||"{{",this.suffix=r.suffix?Ph(r.suffix):r.suffixEscaped||"}}",this.formatSeparator=r.formatSeparator?r.formatSeparator:r.formatSeparator||",",this.unescapePrefix=r.unescapeSuffix?"":r.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":r.unescapeSuffix||"",this.nestingPrefix=r.nestingPrefix?Ph(r.nestingPrefix):r.nestingPrefixEscaped||Ph("$t("),this.nestingSuffix=r.nestingSuffix?Ph(r.nestingSuffix):r.nestingSuffixEscaped||Ph(")"),this.nestingOptionsSeparator=r.nestingOptionsSeparator?r.nestingOptionsSeparator:r.nestingOptionsSeparator||",",this.maxReplaces=r.maxReplaces?r.maxReplaces:1e3,this.alwaysFormat=r.alwaysFormat!==void 0?r.alwaysFormat:!1,this.resetRegExp()}},{key:"reset",value:function(){this.options&&this.init(this.options)}},{key:"resetRegExp",value:function(){var n="".concat(this.prefix,"(.+?)").concat(this.suffix);this.regexp=new RegExp(n,"g");var r="".concat(this.prefix).concat(this.unescapePrefix,"(.+?)").concat(this.unescapeSuffix).concat(this.suffix);this.regexpUnescape=new RegExp(r,"g");var i="".concat(this.nestingPrefix,"(.+?)").concat(this.nestingSuffix);this.nestingRegexp=new RegExp(i,"g")}},{key:"interpolate",value:function(n,r,i,o){var a=this,s,l,u,c=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function d(y){return y.replace(/\$/g,"$$$$")}var f=function(x){if(x.indexOf(a.formatSeparator)<0){var w=fD(r,c,x);return a.alwaysFormat?a.format(w,void 0,i,Ea(Ea(Ea({},o),r),{},{interpolationkey:x})):w}var Z=x.split(a.formatSeparator),E=Z.shift().trim(),I=Z.join(a.formatSeparator).trim();return a.format(fD(r,c,E),I,i,Ea(Ea(Ea({},o),r),{},{interpolationkey:E}))};this.resetRegExp();var p=o&&o.missingInterpolationHandler||this.options.missingInterpolationHandler,g=o&&o.interpolation&&o.interpolation.skipOnVariables!==void 0?o.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables,b=[{regex:this.regexpUnescape,safeValue:function(x){return d(x)}},{regex:this.regexp,safeValue:function(x){return a.escapeValue?d(a.escape(x)):d(x)}}];return b.forEach(function(y){for(u=0;s=y.regex.exec(n);){var x=s[1].trim();if(l=f(x),l===void 0)if(typeof p=="function"){var w=p(n,s,o);l=typeof w=="string"?w:""}else if(o&&o.hasOwnProperty(x))l="";else if(g){l=s[0];continue}else a.logger.warn("missed to pass in variable ".concat(x," for interpolating ").concat(n)),l="";else typeof l!="string"&&!a.useRawValueToEscape&&(l=cD(l));var Z=y.safeValue(l);if(n=n.replace(s[0],Z),g?(y.regex.lastIndex+=l.length,y.regex.lastIndex-=s[0].length):y.regex.lastIndex=0,u++,u>=a.maxReplaces)break}}),n}},{key:"nest",value:function(n,r){var i=this,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a,s,l=Ea({},o);l.applyPostProcessor=!1,delete l.defaultValue;function u(p,g){var b=this.nestingOptionsSeparator;if(p.indexOf(b)<0)return p;var y=p.split(new RegExp("".concat(b,"[ ]*{"))),x="{".concat(y[1]);p=y[0],x=this.interpolate(x,l);var w=x.match(/'/g),Z=x.match(/"/g);(w&&w.length%2===0&&!Z||Z.length%2!==0)&&(x=x.replace(/'/g,'"'));try{l=JSON.parse(x),g&&(l=Ea(Ea({},g),l))}catch(E){return this.logger.warn("failed parsing options string in nesting for key ".concat(p),E),"".concat(p).concat(b).concat(x)}return delete l.defaultValue,p}for(;a=this.nestingRegexp.exec(n);){var c=[],d=!1;if(a[0].indexOf(this.formatSeparator)!==-1&&!/{.*}/.test(a[1])){var f=a[1].split(this.formatSeparator).map(function(p){return p.trim()});a[1]=f.shift(),c=f,d=!0}if(s=r(u.call(this,a[1].trim(),l),l),s&&a[0]===n&&typeof s!="string")return s;typeof s!="string"&&(s=cD(s)),s||(this.logger.warn("missed to resolve ".concat(a[1]," for nesting ").concat(n)),s=""),d&&(s=c.reduce(function(p,g){return i.format(p,g,o.lng,Ea(Ea({},o),{},{interpolationkey:a[1].trim()}))},s.trim())),n=n.replace(a[0],s),this.regexp.lastIndex=0}return n}}]),e}();function SD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function Du(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?SD(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):SD(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function i2e(e){var t=e.toLowerCase().trim(),n={};if(e.indexOf("(")>-1){var r=e.split("(");t=r[0].toLowerCase().trim();var i=r[1].substring(0,r[1].length-1);if(t==="currency"&&i.indexOf(":")<0)n.currency||(n.currency=i.trim());else if(t==="relativetime"&&i.indexOf(":")<0)n.range||(n.range=i.trim());else{var o=i.split(";");o.forEach(function(a){if(a){var s=a.split(":"),l=Fxe(s),u=l[0],c=l.slice(1),d=c.join(":").trim().replace(/^'+|'+$/g,"");n[u.trim()]||(n[u.trim()]=d),d==="false"&&(n[u.trim()]=!1),d==="true"&&(n[u.trim()]=!0),isNaN(d)||(n[u.trim()]=parseInt(d,10))}})}}return{formatName:t,formatOptions:n}}function Rh(e){var t={};return function(r,i,o){var a=i+JSON.stringify(o),s=t[a];return s||(s=e(i,o),t[a]=s),s(r)}}var o2e=function(){function e(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Mo(this,e),this.logger=gs.create("formatter"),this.options=t,this.formats={number:Rh(function(n,r){var i=new Intl.NumberFormat(n,r);return function(o){return i.format(o)}}),currency:Rh(function(n,r){var i=new Intl.NumberFormat(n,Du(Du({},r),{},{style:"currency"}));return function(o){return i.format(o)}}),datetime:Rh(function(n,r){var i=new Intl.DateTimeFormat(n,Du({},r));return function(o){return i.format(o)}}),relativetime:Rh(function(n,r){var i=new Intl.RelativeTimeFormat(n,Du({},r));return function(o){return i.format(o,r.range||"day")}}),list:Rh(function(n,r){var i=new Intl.ListFormat(n,Du({},r));return function(o){return i.format(o)}})},this.init(t)}return Yo(e,[{key:"init",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}},i=r.interpolation;this.formatSeparator=i.formatSeparator?i.formatSeparator:i.formatSeparator||","}},{key:"add",value:function(n,r){this.formats[n.toLowerCase().trim()]=r}},{key:"addCached",value:function(n,r){this.formats[n.toLowerCase().trim()]=Rh(r)}},{key:"format",value:function(n,r,i,o){var a=this,s=r.split(this.formatSeparator),l=s.reduce(function(u,c){var d=i2e(c),f=d.formatName,p=d.formatOptions;if(a.formats[f]){var g=u;try{var b=o&&o.formatParams&&o.formatParams[o.interpolationkey]||{},y=b.locale||b.lng||o.locale||o.lng||i;g=a.formats[f](u,y,Du(Du(Du({},p),o),b))}catch(x){a.logger.warn(x)}return g}else a.logger.warn("there was no format function for ".concat(f));return u},n);return l}}]),e}();function ZD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function ED(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?ZD(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ZD(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function a2e(e){var t=s2e();return function(){var r=ms(e),i;if(t){var o=ms(this).constructor;i=Reflect.construct(r,arguments,o)}else i=r.apply(this,arguments);return W0(this,i)}}function s2e(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function l2e(e,t){e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)}var u2e=function(e){t2(n,e);var t=a2e(n);function n(r,i,o){var a,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return Mo(this,n),a=t.call(this),r2&&Au.call(zu(a)),a.backend=r,a.store=i,a.services=o,a.languageUtils=o.languageUtils,a.options=s,a.logger=gs.create("backendConnector"),a.waitingReads=[],a.maxParallelReads=s.maxParallelReads||10,a.readingCalls=0,a.maxRetries=s.maxRetries>=0?s.maxRetries:5,a.retryTimeout=s.retryTimeout>=1?s.retryTimeout:350,a.state={},a.queue=[],a.backend&&a.backend.init&&a.backend.init(o,s.backend,s),a}return Yo(n,[{key:"queueLoad",value:function(i,o,a,s){var l=this,u={},c={},d={},f={};return i.forEach(function(p){var g=!0;o.forEach(function(b){var y="".concat(p,"|").concat(b);!a.reload&&l.store.hasResourceBundle(p,b)?l.state[y]=2:l.state[y]<0||(l.state[y]===1?c[y]===void 0&&(c[y]=!0):(l.state[y]=1,g=!1,c[y]===void 0&&(c[y]=!0),u[y]===void 0&&(u[y]=!0),f[b]===void 0&&(f[b]=!0)))}),g||(d[p]=!0)}),(Object.keys(u).length||Object.keys(c).length)&&this.queue.push({pending:c,pendingCount:Object.keys(c).length,loaded:{},errors:[],callback:s}),{toLoad:Object.keys(u),pending:Object.keys(c),toLoadLanguages:Object.keys(d),toLoadNamespaces:Object.keys(f)}}},{key:"loaded",value:function(i,o,a){var s=i.split("|"),l=s[0],u=s[1];o&&this.emit("failedLoading",l,u,o),a&&this.store.addResourceBundle(l,u,a),this.state[i]=o?-1:2;var c={};this.queue.forEach(function(d){Rxe(d.loaded,[l],u),l2e(d,i),o&&d.errors.push(o),d.pendingCount===0&&!d.done&&(Object.keys(d.loaded).forEach(function(f){c[f]||(c[f]={});var p=d.loaded[f];p.length&&p.forEach(function(g){c[f][g]===void 0&&(c[f][g]=!0)})}),d.done=!0,d.errors.length?d.callback(d.errors):d.callback())}),this.emit("loaded",c),this.queue=this.queue.filter(function(d){return!d.done})}},{key:"read",value:function(i,o,a){var s=this,l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,u=arguments.length>4&&arguments[4]!==void 0?arguments[4]:this.retryTimeout,c=arguments.length>5?arguments[5]:void 0;if(!i.length)return c(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:i,ns:o,fcName:a,tried:l,wait:u,callback:c});return}return this.readingCalls++,this.backend[a](i,o,function(d,f){if(s.readingCalls--,s.waitingReads.length>0){var p=s.waitingReads.shift();s.read(p.lng,p.ns,p.fcName,p.tried,p.wait,p.callback)}if(d&&f&&l<s.maxRetries){setTimeout(function(){s.read.call(s,i,o,a,l+1,u*2,c)},u);return}c(d,f)})}},{key:"prepareLoading",value:function(i,o){var a=this,s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},l=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),l&&l();typeof i=="string"&&(i=this.languageUtils.toResolveHierarchy(i)),typeof o=="string"&&(o=[o]);var u=this.queueLoad(i,o,s,l);if(!u.toLoad.length)return u.pending.length||l(),null;u.toLoad.forEach(function(c){a.loadOne(c)})}},{key:"load",value:function(i,o,a){this.prepareLoading(i,o,{},a)}},{key:"reload",value:function(i,o,a){this.prepareLoading(i,o,{reload:!0},a)}},{key:"loadOne",value:function(i){var o=this,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"",s=i.split("|"),l=s[0],u=s[1];this.read(l,u,"read",void 0,void 0,function(c,d){c&&o.logger.warn("".concat(a,"loading namespace ").concat(u," for language ").concat(l," failed"),c),!c&&d&&o.logger.log("".concat(a,"loaded namespace ").concat(u," for language ").concat(l),d),o.loaded(i,c,d)})}},{key:"saveMissing",value:function(i,o,a,s,l){var u=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{};if(this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(o)){this.logger.warn('did not save key "'.concat(a,'" as the namespace "').concat(o,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}a==null||a===""||(this.backend&&this.backend.create&&this.backend.create(i,o,a,s,null,ED(ED({},u),{},{isUpdate:l})),!(!i||!i[0])&&this.store.addResource(i[0],o,a,s))}}]),n}(Au);function c2e(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!0,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function(t){var n={};if(ga(t[1])==="object"&&(n=t[1]),typeof t[1]=="string"&&(n.defaultValue=t[1]),typeof t[2]=="string"&&(n.tDescription=t[2]),ga(t[2])==="object"||ga(t[3])==="object"){var r=t[3]||t[2];Object.keys(r).forEach(function(i){n[i]=r[i]})}return n},interpolation:{escapeValue:!0,format:function(t,n,r,i){return t},prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0}}}function ID(e){return typeof e.ns=="string"&&(e.ns=[e.ns]),typeof e.fallbackLng=="string"&&(e.fallbackLng=[e.fallbackLng]),typeof e.fallbackNS=="string"&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function _D(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function bs(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?_D(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):_D(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function d2e(e){var t=f2e();return function(){var r=ms(e),i;if(t){var o=ms(this).constructor;i=Reflect.construct(r,arguments,o)}else i=r.apply(this,arguments);return W0(this,i)}}function f2e(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function o2(){}function h2e(e){var t=Object.getOwnPropertyNames(Object.getPrototypeOf(e));t.forEach(function(n){typeof e[n]=="function"&&(e[n]=e[n].bind(e))})}var a2=function(e){t2(n,e);var t=d2e(n);function n(){var r,i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},o=arguments.length>1?arguments[1]:void 0;if(Mo(this,n),r=t.call(this),r2&&Au.call(zu(r)),r.options=ID(i),r.services={},r.logger=gs,r.modules={external:[]},h2e(zu(r)),o&&!r.isInitialized&&!i.isClone){if(!r.options.initImmediate)return r.init(i,o),W0(r,zu(r));setTimeout(function(){r.init(i,o)},0)}return r}return Yo(n,[{key:"init",value:function(){var i=this,o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},a=arguments.length>1?arguments[1]:void 0;typeof o=="function"&&(a=o,o={}),!o.defaultNS&&o.defaultNS!==!1&&o.ns&&(typeof o.ns=="string"?o.defaultNS=o.ns:o.ns.indexOf("translation")<0&&(o.defaultNS=o.ns[0]));var s=c2e();this.options=bs(bs(bs({},s),this.options),ID(o)),this.options.compatibilityAPI!=="v1"&&(this.options.interpolation=bs(bs({},s.interpolation),this.options.interpolation)),o.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=o.keySeparator),o.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=o.nsSeparator);function l(x){return x?typeof x=="function"?new x:x:null}if(!this.options.isClone){this.modules.logger?gs.init(l(this.modules.logger),this.options):gs.init(null,this.options);var u;this.modules.formatter?u=this.modules.formatter:typeof Intl<"u"&&(u=o2e);var c=new $xe(this.options);this.store=new Jxe(this.options.resources,this.options);var d=this.services;d.logger=gs,d.resourceStore=this.store,d.languageUtils=c,d.pluralResolver=new n2e(c,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),u&&(!this.options.interpolation.format||this.options.interpolation.format===s.interpolation.format)&&(d.formatter=l(u),d.formatter.init(d,this.options),this.options.interpolation.format=d.formatter.format.bind(d.formatter)),d.interpolator=new r2e(this.options),d.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},d.backendConnector=new u2e(l(this.modules.backend),d.resourceStore,d,this.options),d.backendConnector.on("*",function(x){for(var w=arguments.length,Z=new Array(w>1?w-1:0),E=1;E<w;E++)Z[E-1]=arguments[E];i.emit.apply(i,[x].concat(Z))}),this.modules.languageDetector&&(d.languageDetector=l(this.modules.languageDetector),d.languageDetector.init(d,this.options.detection,this.options)),this.modules.i18nFormat&&(d.i18nFormat=l(this.modules.i18nFormat),d.i18nFormat.init&&d.i18nFormat.init(this)),this.translator=new yD(this.services,this.options),this.translator.on("*",function(x){for(var w=arguments.length,Z=new Array(w>1?w-1:0),E=1;E<w;E++)Z[E-1]=arguments[E];i.emit.apply(i,[x].concat(Z))}),this.modules.external.forEach(function(x){x.init&&x.init(i)})}if(this.format=this.options.interpolation.format,a||(a=o2),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){var f=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);f.length>0&&f[0]!=="dev"&&(this.options.lng=f[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined");var p=["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"];p.forEach(function(x){i[x]=function(){var w;return(w=i.store)[x].apply(w,arguments)}});var g=["addResource","addResources","addResourceBundle","removeResourceBundle"];g.forEach(function(x){i[x]=function(){var w;return(w=i.store)[x].apply(w,arguments),i}});var b=L0(),y=function(){var w=function(E,I){i.isInitialized&&!i.initializedStoreOnce&&i.logger.warn("init: i18next is already initialized. You should call init just once!"),i.isInitialized=!0,i.options.isClone||i.logger.log("initialized",i.options),i.emit("initialized",i.options),b.resolve(I),a(E,I)};if(i.languages&&i.options.compatibilityAPI!=="v1"&&!i.isInitialized)return w(null,i.t.bind(i));i.changeLanguage(i.options.lng,w)};return this.options.resources||!this.options.initImmediate?y():setTimeout(y,0),b}},{key:"loadResources",value:function(i){var o=this,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:o2,s=a,l=typeof i=="string"?i:this.language;if(typeof i=="function"&&(s=i),!this.options.resources||this.options.partialBundledLanguages){if(l&&l.toLowerCase()==="cimode")return s();var u=[],c=function(p){if(p){var g=o.services.languageUtils.toResolveHierarchy(p);g.forEach(function(b){u.indexOf(b)<0&&u.push(b)})}};if(l)c(l);else{var d=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);d.forEach(function(f){return c(f)})}this.options.preload&&this.options.preload.forEach(function(f){return c(f)}),this.services.backendConnector.load(u,this.options.ns,function(f){!f&&!o.resolvedLanguage&&o.language&&o.setResolvedLanguage(o.language),s(f)})}else s(null)}},{key:"reloadResources",value:function(i,o,a){var s=L0();return i||(i=this.languages),o||(o=this.options.ns),a||(a=o2),this.services.backendConnector.reload(i,o,function(l){s.resolve(),a(l)}),s}},{key:"use",value:function(i){if(!i)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!i.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return i.type==="backend"&&(this.modules.backend=i),(i.type==="logger"||i.log&&i.warn&&i.error)&&(this.modules.logger=i),i.type==="languageDetector"&&(this.modules.languageDetector=i),i.type==="i18nFormat"&&(this.modules.i18nFormat=i),i.type==="postProcessor"&&gD.addPostProcessor(i),i.type==="formatter"&&(this.modules.formatter=i),i.type==="3rdParty"&&this.modules.external.push(i),this}},{key:"setResolvedLanguage",value:function(i){if(!(!i||!this.languages)&&!(["cimode","dev"].indexOf(i)>-1))for(var o=0;o<this.languages.length;o++){var a=this.languages[o];if(!(["cimode","dev"].indexOf(a)>-1)&&this.store.hasLanguageSomeTranslations(a)){this.resolvedLanguage=a;break}}}},{key:"changeLanguage",value:function(i,o){var a=this;this.isLanguageChangingTo=i;var s=L0();this.emit("languageChanging",i);var l=function(f){a.language=f,a.languages=a.services.languageUtils.toResolveHierarchy(f),a.resolvedLanguage=void 0,a.setResolvedLanguage(f)},u=function(f,p){p?(l(p),a.translator.changeLanguage(p),a.isLanguageChangingTo=void 0,a.emit("languageChanged",p),a.logger.log("languageChanged",p)):a.isLanguageChangingTo=void 0,s.resolve(function(){return a.t.apply(a,arguments)}),o&&o(f,function(){return a.t.apply(a,arguments)})},c=function(f){!i&&!f&&a.services.languageDetector&&(f=[]);var p=typeof f=="string"?f:a.services.languageUtils.getBestMatchFromCodes(f);p&&(a.language||l(p),a.translator.language||a.translator.changeLanguage(p),a.services.languageDetector&&a.services.languageDetector.cacheUserLanguage(p)),a.loadResources(p,function(g){u(g,p)})};return!i&&this.services.languageDetector&&!this.services.languageDetector.async?c(this.services.languageDetector.detect()):!i&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect(c):c(i),s}},{key:"getFixedT",value:function(i,o,a){var s=this,l=function u(c,d){var f;if(ga(d)!=="object"){for(var p=arguments.length,g=new Array(p>2?p-2:0),b=2;b<p;b++)g[b-2]=arguments[b];f=s.options.overloadTranslationOptionHandler([c,d].concat(g))}else f=bs({},d);f.lng=f.lng||u.lng,f.lngs=f.lngs||u.lngs,f.ns=f.ns||u.ns,f.keyPrefix=f.keyPrefix||a||u.keyPrefix;var y=s.options.keySeparator||".",x=f.keyPrefix?"".concat(f.keyPrefix).concat(y).concat(c):c;return s.t(x,f)};return typeof i=="string"?l.lng=i:l.lngs=i,l.ns=o,l.keyPrefix=a,l}},{key:"t",value:function(){var i;return this.translator&&(i=this.translator).translate.apply(i,arguments)}},{key:"exists",value:function(){var i;return this.translator&&(i=this.translator).exists.apply(i,arguments)}},{key:"setDefaultNamespace",value:function(i){this.options.defaultNS=i}},{key:"hasLoadedNamespace",value:function(i){var o=this,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;var s=this.resolvedLanguage||this.languages[0],l=this.options?this.options.fallbackLng:!1,u=this.languages[this.languages.length-1];if(s.toLowerCase()==="cimode")return!0;var c=function(p,g){var b=o.services.backendConnector.state["".concat(p,"|").concat(g)];return b===-1||b===2};if(a.precheck){var d=a.precheck(this,c);if(d!==void 0)return d}return!!(this.hasResourceBundle(s,i)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||c(s,i)&&(!l||c(u,i)))}},{key:"loadNamespaces",value:function(i,o){var a=this,s=L0();return this.options.ns?(typeof i=="string"&&(i=[i]),i.forEach(function(l){a.options.ns.indexOf(l)<0&&a.options.ns.push(l)}),this.loadResources(function(l){s.resolve(),o&&o(l)}),s):(o&&o(),Promise.resolve())}},{key:"loadLanguages",value:function(i,o){var a=L0();typeof i=="string"&&(i=[i]);var s=this.options.preload||[],l=i.filter(function(u){return s.indexOf(u)<0});return l.length?(this.options.preload=s.concat(l),this.loadResources(function(u){a.resolve(),o&&o(u)}),a):(o&&o(),Promise.resolve())}},{key:"dir",value:function(i){if(i||(i=this.resolvedLanguage||(this.languages&&this.languages.length>0?this.languages[0]:this.language)),!i)return"rtl";var o=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"];return o.indexOf(this.services.languageUtils.getLanguagePartFromCode(i))>-1||i.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}},{key:"cloneInstance",value:function(){var i=this,o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:o2,s=bs(bs(bs({},this.options),o),{isClone:!0}),l=new n(s);(o.debug!==void 0||o.prefix!==void 0)&&(l.logger=l.logger.clone(o));var u=["store","services","language"];return u.forEach(function(c){l[c]=i[c]}),l.services=bs({},this.services),l.services.utils={hasLoadedNamespace:l.hasLoadedNamespace.bind(l)},l.translator=new yD(l.services,l.options),l.translator.on("*",function(c){for(var d=arguments.length,f=new Array(d>1?d-1:0),p=1;p<d;p++)f[p-1]=arguments[p];l.emit.apply(l,[c].concat(f))}),l.init(s,a),l.translator.options=l.options,l.translator.backendConnector.services.utils={hasLoadedNamespace:l.hasLoadedNamespace.bind(l)},l}},{key:"toJSON",value:function(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}]),n}(Au);ba(a2,"createInstance",function(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;return new a2(e,t)});var Un=a2.createInstance();Un.createInstance=a2.createInstance,Un.createInstance,Un.init,Un.loadResources,Un.reloadResources,Un.use,Un.changeLanguage,Un.getFixedT,Un.t,Un.exists,Un.setDefaultNamespace,Un.hasLoadedNamespace,Un.loadNamespaces,Un.loadLanguages;const Ar="gw_count_fid",p2e=["year","quarter","month","week","day","hour","minute","second"],m2e=["year","quarter","month","week","weekday","day","hour","minute","second"],mr="gw_mea_key_fid",gr="gw_mea_val_fid";function g2e(e,t){return e.filter(r=>t.every(i=>i.type==="continuous"?r[i.key]>=i.range[0]&&r[i.key]<=i.range[1]:i.range.has(r[i.key])))}function b2e(){return{dragId:Ar,fid:Ar,name:Un.t("constant.row_count"),analyticType:"measure",semanticType:"quantitative",aggName:"sum",computed:!0,expression:{op:"one",params:[],as:Ar}}}function v2e(){return[{dragId:mr,fid:mr,name:Un.t("constant.mea_key"),analyticType:"dimension",semanticType:"nominal"},{dragId:gr,fid:gr,name:Un.t("constant.mea_val"),analyticType:"measure",semanticType:"quantitative",aggName:"sum"}]}function y2e(...e){return e.filter(Boolean).join(" ")}function or(e,t){return t?`${e}_${t}`:e}function h9(e){return e.enableAgg&&e.aggName?or(e.fid,e.aggName):e.fid}function p9({rows:e,columns:t}){return e.length&&!e.find(n=>n.analyticType==="measure")?e[e.length-1].sort||"none":t.length&&!t.find(n=>n.analyticType==="measure")&&t[t.length-1].sort||"none"}function GD({rows:e,columns:t}){return e.length&&!e.find(n=>n.analyticType==="measure")?"row":t.length&&!t.find(n=>n.analyticType==="measure")?"column":"none"}function CD(e){return e instanceof Error?e.message:typeof e=="string"?e:String(e)}const x2e=e=>{const t=e.getFullYear(),n=e.getMonth()+1,r=e.getDate(),i=e.getHours(),o=e.getMinutes(),a=e.getSeconds(),s=l=>`${l}`.padStart(2,"0");return`${t}-${s(n)}-${s(r)} ${s(i)}:${s(o)}:${s(a)}`};function s2(e){return e?e.type==="one of"||e.type==="not in"?{...e,value:[...e.value]}:e:null}function kD(e){return e?e.type==="one of"||e.type==="not in"?{...e,value:new Set(e.value)}:e:null}function w2e(){return{dimensions:[],measures:[],rows:[],columns:[],color:[],opacity:[],size:[],shape:[],radius:[],theta:[],longitude:[],latitude:[],geoId:[],details:[],filters:[],text:[]}}function S2e(){const[e]=Bt.GEOM_TYPES.generic;return{defaultAggregated:!0,geoms:[e],showTableSummary:!1,coordSystem:"generic",stack:"stack",showActions:!1,interactiveScale:!1,sorted:"none",zeroScale:!0,scaleIncludeUnmatchedChoropleth:!1,background:void 0,size:{mode:"auto",width:320,height:200},format:{numberFormat:void 0,timeFormat:void 0,normalizedNumberFormat:void 0},geoKey:"name",resolve:{x:!1,y:!1,color:!1,opacity:!1,shape:!1,size:!1},limit:-1}}const Z2e={showActions:!1,showTableSummary:!1,stack:"stack",interactiveScale:!1,zeroScale:!0,background:void 0,size:{mode:"auto",width:320,height:200},format:{numberFormat:void 0,timeFormat:void 0,normalizedNumberFormat:void 0},geoKey:"name",resolve:{x:!1,y:!1,color:!1,opacity:!1,shape:!1,size:!1}},WD={defaultAggregated:!0,geoms:[Bt.GEOM_TYPES.generic[0]],coordSystem:"generic",limit:-1},m9={dimensions:[],measures:[],rows:[],columns:[],color:[],opacity:[],size:[],shape:[],radius:[],theta:[],longitude:[],latitude:[],geoId:[],details:[],filters:[],text:[]};function LD(e){const t=e.encodings.filters.map(n=>{var r;return((r=n.rule)==null?void 0:r.type)==="one of"&&Array.isArray(n.rule.value)?{...n,rule:{...n.rule,value:new Set(n.rule.value)}}:n});return{...e,encodings:{...w2e(),...e.encodings,filters:t}}}const TD=e=>({...e,config:{...S2e(),...e.config}}),ND="https://graphic-walker.kanaries.net/stoinfo_v2.json";function XD(e,t,n){var r=new Blob([e],{type:n});if(window.navigator.msSaveOrOpenBlob)window.navigator.msSaveOrOpenBlob(r,t);else{var i=document.createElement("a"),o=URL.createObjectURL(r);i.href=o,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(o)},0)}}let E2e=(e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce((t,n)=>(n&=63,n<36?t+=n.toString(36):n<62?t+=(n-26).toString(36).toUpperCase():n>62?t+="-":t+="_",t),"");function Li(){return"gw_"+E2e(4)}const g9=(e,t,n)=>n===e.length?e.concat([t]):e.flatMap((r,i)=>i===n?[t,r]:[r]),OD=(e,t)=>e.filter((n,r)=>r!==t),xd=(e,t,n)=>e.map((r,i)=>i===t?n(r):r);function pn(e,t,n){const r=(i,o,a)=>{const[s,...l]=o;return l.length===0?{...i,[s]:a(i[s])}:{...i,[s]:r(i[s],l,a)}};return r(e,t.split("."),n)}const b9=e=>Math.floor(Math.sqrt(2*e));function I2e(e){return(t,n)=>{const{base:r,cache:i,cursor:o,now:a,timeline:s}=t;return{base:r,now:e(a,n),cursor:o+1,cache:o-i.cursor>b9(o)?{value:e(i.value,s[i.cursor]),cursor:i.cursor+1}:i,timeline:s.slice(0,o).concat([n])}}}function _2e(e){return t=>{const{base:n,cache:r,cursor:i,timeline:o}=t,a=i-1;if(a<0)return t;const s=a<r.cursor,l=s?Math.max(0,a-b9(a)):r.cursor,u=s?o.slice(0,l).reduce(e,n):r.value;return{base:n,now:o.slice(l,a).reduce(e,u),cache:s?{value:u,cursor:l}:r,cursor:a,timeline:o}}}function G2e(e){return t=>{const{base:n,cache:r,cursor:i,now:o,timeline:a}=t;return i===a.length?t:{base:n,now:e(o,a[i]),cursor:i+1,cache:i-r.cursor>b9(i)?{value:e(r.value,a[r.cursor]),cursor:r.cursor+1}:r,timeline:a}}}function C2e(e){return(t,n)=>n>t.cursor?t.now:n>t.cache.cursor?t.timeline.slice(t.cache.cursor,n).reduce(e,t.cache.value):t.timeline.slice(0,n).reduce(e,t.base)}function VD(e){return{base:e,cursor:0,cache:{value:e,cursor:0},now:e,timeline:[]}}const Ia={measureAfterDimension(e){return e.filter(t=>t.analyticType==="dimension").concat(e.filter(t=>t.analyticType==="measure"))},crossLimit(e){return function(t){let n=0;return t.reduce((r,i)=>(i.analyticType==="dimension"&&n<e&&(r.push(i),n++),i.analyticType==="measure"&&r.push(i),r),[])}},forceAnalyticType(e){return function(t){return t.map(n=>({...n,analyticType:e}))}},forceSemanticType(e){return function(t){return t.map(n=>({...n,semanticType:e}))}}};function l2(e,t){return t.reduce((n,r)=>r(n),e)}function u2(e){return Array.isArray(e)?Ia.measureAfterDimension(e):"rows"in e&&"columns"in e&&(e.rows.length>0||e.columns.length>0)?{...e,rows:l2(e.rows,[Ia.measureAfterDimension,Ia.crossLimit(2)]),columns:l2(e.columns,[Ia.measureAfterDimension,Ia.crossLimit(2)])}:"latitude"in e&&"longitude"in e&&(e.latitude.length>0||e.longitude.length>0)?{...e,latitude:l2(e.latitude,[Ia.forceAnalyticType("dimension"),Ia.forceSemanticType("quantitative"),Ia.crossLimit(1)]),longitude:l2(e.longitude,[Ia.forceAnalyticType("dimension"),Ia.forceSemanticType("quantitative"),Ia.crossLimit(1)])}:e}var Sn;(function(e){e[e.setConfig=0]="setConfig",e[e.removeField=1]="removeField",e[e.reorderField=2]="reorderField",e[e.moveField=3]="moveField",e[e.cloneField=4]="cloneField",e[e.createBinlogField=5]="createBinlogField",e[e.appendFilter=6]="appendFilter",e[e.modFilter=7]="modFilter",e[e.writeFilter=8]="writeFilter",e[e.setName=9]="setName",e[e.applySort=10]="applySort",e[e.transpose=11]="transpose",e[e.setLayout=12]="setLayout",e[e.setFieldAggregator=13]="setFieldAggregator",e[e.setGeoData=14]="setGeoData",e[e.setCoordSystem=15]="setCoordSystem",e[e.createDateDrillField=16]="createDateDrillField",e[e.createDateFeatureField=17]="createDateFeatureField",e[e.changeSemanticType=18]="changeSemanticType",e[e.setFilterAggregator=19]="setFilterAggregator"})(Sn||(Sn={}));const k2e={[Sn.setConfig]:(e,t,n)=>pn(e,"config",r=>({...r,[t]:n})),[Sn.removeField]:(e,t,n)=>pn(e,`encodings.${t}`,r=>OD(r,n)),[Sn.reorderField]:(e,t,n,r)=>pn(e,`encodings.${t}`,i=>u2(i.map((o,a,s)=>a===n?s[r]:a===r?s[n]:o))),[Sn.moveField]:(e,t,n,r,i,o)=>{const a=e.encodings[t][n],s=r==="dimensions"?pn(a,"analyticType",()=>"dimension"):r==="measures"?pn(a,"analyticType",()=>"measure"):a;return pn(e,"encodings",l=>u2({...l,[t]:OD(e.encodings[t],n),[r]:g9(e.encodings[r],s,i).slice(0,o??1/0)}))},[Sn.cloneField]:(e,t,n,r,i,o,a)=>{const s={...e.encodings[t][n],dragId:o};return pn(e,"encodings",l=>u2({...l,[r]:g9(e.encodings[r],s,i).slice(0,a??1/0)}))},[Sn.createBinlogField]:(e,t,n,r,i,o)=>{const a=e.encodings[t][n],s=r.startsWith("bin"),l=s?"dimensions":t,u=s?`${r}${o}`:`log${o}`,c={fid:i,dragId:i,name:`${u}(${a.name})`,semanticType:s?"ordinal":"quantitative",analyticType:s?"dimension":a.analyticType,computed:!0,expression:{op:r,as:i,params:[{type:"field",value:a.fid}],num:o}};return s||(c.aggName="sum"),pn(e,`encodings.${l}`,d=>d.concat(c))},[Sn.appendFilter]:(e,t,n,r,i)=>{const o=e.encodings[n][r];return pn(e,"encodings.filters",a=>g9(a,{...o,rule:null,dragId:i},t))},[Sn.modFilter]:(e,t,n,r)=>pn(e,"encodings.filters",i=>{const o=e.encodings[n][r];return xd(i,t,a=>({...o,rule:null,dragId:a.dragId}))}),[Sn.writeFilter]:(e,t,n)=>pn(e,"encodings.filters",r=>xd(r,t,i=>({...i,rule:kD(n)}))),[Sn.setName]:(e,t)=>({...e,name:t}),[Sn.applySort]:(e,t)=>{const{rows:n,columns:r}=e.encodings,i=n.length>0?n[n.length-1]:null,o=r.length>0?r[r.length-1]:null;return o!==null&&o.analyticType==="dimension"&&i!==null&&i.analyticType==="measure"?pn(e,"encodings.columns",a=>xd(a,a.length-1,s=>({...s,sort:t}))):o!==null&&o.analyticType==="measure"&&i!==null&&i.analyticType==="dimension"?pn(e,"encodings.rows",a=>xd(a,a.length-1,s=>({...s,sort:t}))):e},[Sn.transpose]:e=>pn(e,"encodings",t=>u2({...t,columns:t.rows,rows:t.columns})),[Sn.setLayout]:(e,t)=>pn(e,"layout",n=>Object.assign({},n,Object.fromEntries(t))),[Sn.setFieldAggregator]:(e,t,n,r)=>pn(e,`encodings.${t}`,i=>xd(i,n,o=>({...o,aggName:r}))),[Sn.setGeoData]:(e,t,n,r)=>pn(e,"layout",i=>({...i,geojson:t,geoKey:n,geoUrl:r})),[Sn.setCoordSystem]:(e,t)=>pn(e,"config",n=>({...n,coordSystem:t,geoms:[Bt.GEOM_TYPES[t][0]]})),[Sn.createDateDrillField]:(e,t,n,r,i,o,a)=>{const s=e.encodings[t][n],l={fid:i,dragId:i,name:o,semanticType:"temporal",analyticType:s.analyticType,aggName:"sum",computed:!0,timeUnit:r,expression:{op:"dateTimeDrill",as:i,params:[{type:"field",value:s.fid},{type:"value",value:r},...a?[{type:"format",value:a}]:[]]}};return pn(e,`encodings.${t}`,u=>u.concat(l))},[Sn.createDateFeatureField]:(e,t,n,r,i,o,a)=>{const s=e.encodings[t][n],l={fid:i,dragId:i,name:o,semanticType:"ordinal",analyticType:s.analyticType,aggName:"sum",computed:!0,expression:{op:"dateTimeFeature",as:i,params:[{type:"field",value:s.fid},{type:"value",value:r},...a?[{type:"format",value:a}]:[]]}};return pn(e,`encodings.${t}`,u=>u.concat(l))},[Sn.changeSemanticType]:(e,t,n,r)=>pn(e,`encodings.${t}`,i=>xd(i,n,o=>({...o,semanticType:r}))),[Sn.setFilterAggregator]:(e,t,n)=>pn(e,"encodings.filters",r=>xd(r,t,i=>({...i,aggName:n||"sum",enableAgg:!!n,rule:null})))};function T0(e,t){const[n,...r]=t;return k2e[n](e,...r)}const W2e=T0,FD=I2e(T0),L2e=_2e(T0),T2e=G2e(T0),N2e=C2e(T0),mn=Object.fromEntries(Object.keys(Sn).map(e=>[e,(t,...n)=>FD(t,[Sn[e],...n])]));function MD(e){return pn(e,"encodings.filters",t=>t.map(n=>({...n,rule:s2(n.rule)})))}function v9(e){return pn(e,"encodings",t=>{var r;const n=(r=t==null?void 0:t.filters)==null?void 0:r.map(i=>({...i,rule:kD(i.rule)}));return{...t,filters:n}})}function c2(e,t){return{config:WD,encodings:m9,layout:Z2e,visId:e,name:t}}function YD(e,t,n){if(e.length===0)return c2(n||Li(),t);const r=[...v2e(),b2e()],i=r.filter(a=>a.analyticType==="dimension"),o=r.filter(a=>a.analyticType==="measure");return pn(c2(n||Li(),t),"encodings",a=>({...a,dimensions:e.filter(s=>s.analyticType==="dimension").map(s=>({dragId:Li(),fid:s.fid,name:s.name||s.fid,basename:s.basename||s.name||s.fid,semanticType:s.semanticType,analyticType:s.analyticType})).concat(i),measures:e.filter(s=>s.analyticType==="measure").map(s=>({dragId:Li(),fid:s.fid,name:s.name||s.fid,basename:s.basename||s.name||s.fid,analyticType:s.analyticType,semanticType:s.semanticType,aggName:"sum"})).concat(o)}))}function PD(e){var n;const t=c2(e.visId||Li(),e.name||"Chart");return t.config={...t.config,...e.config},t.encodings={...t.encodings,...e.encodings},t.layout={...t.layout,...e.layout,size:{...t.layout.size,...(n=e.layout)==null?void 0:n.size}},t}function zh(e){return VD(PD(e))}function y9(e,t){return VD(YD(e,t))}function RD(e,t=30){const n={base:MD(e.cursor>t?N2e(e,e.cursor-t):e.base),timeline:e.timeline.slice(Math.max(0,e.cursor-t))};return JSON.stringify(n)}function X2e(e){return MD(e.now)}function O2e(e){return zh(v9(e))}function zD(e){const t=JSON.parse(e),n=zh(v9(t.base));return t.timeline.reduce(FD,n)}function V2e(e){const t=JSON.parse(e),n=PD(v9(t.base));return t.timeline.reduce(W2e,n)}function x9(e){var n,r,i,o,a,s,l,u,c,d,f,p,g,b,y,x,w;const t=c2(e.visId,e.name||"Chart");return t.config={...t.config,defaultAggregated:e.config.defaultAggregated,geoms:((n=e.config.geoms)==null?void 0:n.slice())??[],limit:e.config.limit,coordSystem:e.config.coordSystem,folds:e.config.folds},t.encodings={...t.encodings,dimensions:((r=e.encodings.dimensions)==null?void 0:r.slice())??[],measures:((i=e.encodings.measures)==null?void 0:i.slice())??[],rows:((o=e.encodings.rows)==null?void 0:o.slice())??[],columns:((a=e.encodings.columns)==null?void 0:a.slice())??[],color:((s=e.encodings.color)==null?void 0:s.slice())??[],opacity:((l=e.encodings.opacity)==null?void 0:l.slice())??[],size:((u=e.encodings.size)==null?void 0:u.slice())??[],shape:((c=e.encodings.shape)==null?void 0:c.slice())??[],theta:((d=e.encodings.theta)==null?void 0:d.slice())??[],radius:((f=e.encodings.radius)==null?void 0:f.slice())??[],longitude:((p=e.encodings.longitude)==null?void 0:p.slice())??[],latitude:((g=e.encodings.latitude)==null?void 0:g.slice())??[],geoId:((b=e.encodings.geoId)==null?void 0:b.slice())??[],details:((y=e.encodings.details)==null?void 0:y.slice())??[],filters:((x=e.encodings.filters)==null?void 0:x.slice())??[],text:((w=e.encodings.text)==null?void 0:w.slice())??[]},t.layout={...t.layout,background:e.config.background,format:e.config.format,interactiveScale:e.config.interactiveScale,resolve:e.config.resolve,showActions:e.config.showActions,stack:e.config.stack,zeroScale:e.config.zeroScale,size:{...t.layout.size,...e.config.size},colorPalette:e.config.colorPalette,geojson:e.config.geojson,geoKey:e.config.geoKey,geoUrl:e.config.geoUrl,primaryColor:e.config.primaryColor,scale:e.config.scale,scaleIncludeUnmatchedChoropleth:e.config.scaleIncludeUnmatchedChoropleth,showTableSummary:e.config.showTableSummary,useSvg:e.config.useSvg},t}function F2e(e){return e}function M2e(e){if(e==null)return F2e;var t,n,r=e.scale[0],i=e.scale[1],o=e.translate[0],a=e.translate[1];return function(s,l){l||(t=n=0);var u=2,c=s.length,d=new Array(c);for(d[0]=(t+=s[0])*r+o,d[1]=(n+=s[1])*i+a;u<c;)d[u]=s[u],++u;return d}}function Y2e(e,t){for(var n,r=e.length,i=r-t;i<--r;)n=e[i],e[i++]=e[r],e[r]=n}function d2(e,t){return typeof t=="string"&&(t=e.objects[t]),t.type==="GeometryCollection"?{type:"FeatureCollection",features:t.geometries.map(function(n){return AD(e,n)})}:AD(e,t)}function AD(e,t){var n=t.id,r=t.bbox,i=t.properties==null?{}:t.properties,o=DD(e,t);return n==null&&r==null?{type:"Feature",properties:i,geometry:o}:r==null?{type:"Feature",id:n,properties:i,geometry:o}:{type:"Feature",id:n,bbox:r,properties:i,geometry:o}}function DD(e,t){var n=M2e(e.transform),r=e.arcs;function i(c,d){d.length&&d.pop();for(var f=r[c<0?~c:c],p=0,g=f.length;p<g;++p)d.push(n(f[p],p));c<0&&Y2e(d,g)}function o(c){return n(c)}function a(c){for(var d=[],f=0,p=c.length;f<p;++f)i(c[f],d);return d.length<2&&d.push(d[0]),d}function s(c){for(var d=a(c);d.length<4;)d.push(d[0]);return d}function l(c){return c.map(s)}function u(c){var d=c.type,f;switch(d){case"GeometryCollection":return{type:d,geometries:c.geometries.map(u)};case"Point":f=o(c.coordinates);break;case"MultiPoint":f=c.coordinates.map(o);break;case"LineString":f=a(c.arcs);break;case"MultiLineString":f=c.arcs.map(a);break;case"Polygon":f=l(c.arcs);break;case"MultiPolygon":f=c.arcs.map(l);break;default:return null}return{type:d,coordinates:f}}return u(t)}function P2e(e,t){var n={},r={},i={},o=[],a=-1;t.forEach(function(u,c){var d=e.arcs[u<0?~u:u],f;d.length<3&&!d[1][0]&&!d[1][1]&&(f=t[++a],t[a]=u,t[c]=f)}),t.forEach(function(u){var c=s(u),d=c[0],f=c[1],p,g;if(p=i[d])if(delete i[p.end],p.push(u),p.end=f,g=r[f]){delete r[g.start];var b=g===p?p:p.concat(g);r[b.start=p.start]=i[b.end=g.end]=b}else r[p.start]=i[p.end]=p;else if(p=r[f])if(delete r[p.start],p.unshift(u),p.start=d,g=i[d]){delete i[g.end];var y=g===p?p:g.concat(p);r[y.start=g.start]=i[y.end=p.end]=y}else r[p.start]=i[p.end]=p;else p=[u],r[p.start=d]=i[p.end=f]=p});function s(u){var c=e.arcs[u<0?~u:u],d=c[0],f;return e.transform?(f=[0,0],c.forEach(function(p){f[0]+=p[0],f[1]+=p[1]})):f=c[c.length-1],u<0?[f,d]:[d,f]}function l(u,c){for(var d in u){var f=u[d];delete c[f.start],delete f.start,delete f.end,f.forEach(function(p){n[p<0?~p:p]=1}),o.push(f)}}return l(i,r),l(r,i),t.forEach(function(u){n[u<0?~u:u]||o.push([u])}),o}function R2e(e){return DD(e,z2e.apply(this,arguments))}function z2e(e,t,n){var r,i,o;if(arguments.length>1)r=A2e(e,t,n);else for(i=0,r=new Array(o=e.arcs.length);i<o;++i)r[i]=i;return{type:"MultiLineString",arcs:P2e(e,r)}}function A2e(e,t,n){var r=[],i=[],o;function a(d){var f=d<0?~d:d;(i[f]||(i[f]=[])).push({i:d,g:o})}function s(d){d.forEach(a)}function l(d){d.forEach(s)}function u(d){d.forEach(l)}function c(d){switch(o=d,d.type){case"GeometryCollection":d.geometries.forEach(c);break;case"LineString":s(d.arcs);break;case"MultiLineString":case"Polygon":l(d.arcs);break;case"MultiPolygon":u(d.arcs);break}}return c(t),i.forEach(n==null?function(d){r.push(d[0].i)}:function(d){n(d[0].g,d[d.length-1].g)&&r.push(d[0].i)}),r}const jD=(e,t)=>{for(const n of e.params)n.type==="field"?t(n.value):n.type==="expression"&&jD(n.value,t)},D2e=(e,t)=>{const n=new Set(t),r=e.filter(a=>n.has(a.key));let i=r.slice(),o=e.filter(a=>!n.has(a.key));for(;i.length&&o.length;){const a=new Set;for(const l of i)jD(l.expression,u=>a.add(u));i=o.filter(l=>a.has(l.key)),o=o.filter(l=>!a.has(l.key))}return r},Ah=(e,t,n,r,i,o,a=[],s)=>{const l=n.find(T=>T.fid===mr)&&r.find(T=>T.fid===gr),u=n.filter(T=>T.fid!==mr),c=r.filter(T=>T.fid!==gr);if(l){const T=r.find(X=>X.fid===gr).aggName,N=a.map(X=>t.find(O=>O.fid===X)).map(X=>({...X,aggName:T})).filter(Boolean);u.push(...N.filter(X=>(X==null?void 0:X.analyticType)==="dimension")),c.push(...N.filter(X=>(X==null?void 0:X.analyticType)==="measure"))}const d=new Set([...u,...c,...e].map(T=>T.fid));let f=null,p=null,g=null,b=null,y=null,x=null;const w=T=>{const N=h9(T);d.add(N);const X=T.rule;if(X.type==="one of")return{fid:N,rule:{type:"one of",value:[...X.value]}};if(X.type==="temporal range"){const O=[new Date(X.value[0]).getTime(),new Date(X.value[1]).getTime()];return{fid:N,rule:{type:"temporal range",value:O}}}else{if(X.type==="not in")return{fid:T.fid,rule:{type:"not in",value:[...X.value]}};if(X.type==="range"){const O=[Number(X.value[0]),Number(X.value[1])];return{fid:N,rule:{type:"range",value:O}}}else return console.error("unknown rule",X),{fid:T.fid,rule:X}}},Z=e.filter(T=>!T.computed&&T.rule&&!T.enableAgg).map(w);Z.length&&(f={type:"filter",filters:Z});const E=D2e(t.filter(T=>T.computed&&T.expression).map(T=>({key:T.fid,expression:T.expression})),[...d]);E.length&&(p={type:"transform",transform:E});const I=e.filter(T=>T.computed&&T.rule&&!T.enableAgg).map(w);I.length&&(g={type:"filter",filters:I});const k=e.filter(T=>T.enableAgg&&T.aggName&&T.rule),_=c.filter(T=>T.aggName).map(T=>[T.fid,T.aggName]).concat(k.map(T=>[T.fid,T.aggName])),C=i&&(_.length||c.length===0&&u.length>0);return C?b={type:"view",query:[{op:"aggregate",groupBy:u.map(T=>T.fid),measures:c.concat(k).map(T=>({field:T.fid,agg:T.aggName,asFieldKey:or(T.fid,T.aggName)}))}]}:b={type:"view",query:[{op:"raw",fields:[...new Set([...u,...c])].map(T=>T.fid)}]},C&&u.length>0&&k.length>0&&(x={type:"filter",filters:k.map(w)}),o!=="none"&&s&&(y={type:"sort",by:c.map(T=>C?or(T.fid,T.aggName):T.fid),sort:o}),[f,p,g,b,x,y].filter(Boolean)},j2e=(e,t)=>{if(t.length===0)return e;const n=e.workflow.findIndex(i=>i.type==="transform");return n>-1?{...e,workflow:e.workflow.map((i,o)=>{if(i.type==="transform"&&o===n){const a=new Set(i.transform.map(s=>s.key));return{type:"transform",transform:i.transform.concat(t.filter(s=>!a.has(s.key)))}}return i})}:{...e,workflow:[{type:"transform",transform:t},...e.workflow]}},w9=(e,t)=>{if(t.length===0)return e;const n=e.workflow.findIndex(i=>i.type==="filter");return n>-1?{...e,workflow:e.workflow.map((i,o)=>i.type==="filter"&&o===n?{type:"filter",filters:t.concat(i.filters)}:i)}:{...e,workflow:[{type:"filter",filters:t},...e.workflow]}},H2e=Object.keys(m9).filter(e=>!Bt.META_FIELD_KEYS.includes(e)),HD=e=>{switch(e){case"choropleth":return["geoId","color","opacity","text","details"];case"poi":return["longitude","latitude","color","opacity","size","details"];case"arc":return["radius","theta","color","opacity","size","details","text"];case"bar":case"tick":case"line":case"area":case"boxplot":return["columns","rows","color","opacity","size","details","text"];case"text":return["columns","rows","color","opacity","size","text"];case"table":return["columns","rows"];default:return["columns","rows","color","opacity","size","details","shape"]}};class N0{constructor(t,n){Ct(this,"visList");Ct(this,"visIndex",0);Ct(this,"createdVis",0);Ct(this,"editingFilterIdx",null);Ct(this,"meta");Ct(this,"segmentKey",$e.ISegmentKey.vis);Ct(this,"showInsightBoard",!1);Ct(this,"showDataBoard",!1);Ct(this,"vizEmbededMenu",{show:!1,position:[0,0]});Ct(this,"showDataConfig",!1);Ct(this,"showCodeExportPanel",!1);Ct(this,"showVisualConfigPanel",!1);Ct(this,"showGeoJSONConfigPanel",!1);Ct(this,"removeConfirmIdx",null);Ct(this,"filters",{});Ct(this,"tableCollapsedHeaderMap",new Map);Ct(this,"selectedMarkObject",{});Ct(this,"showLogSettingPanel",!1);Ct(this,"showBinSettingPanel",!1);Ct(this,"createField");Ct(this,"localGeoJSON");Ct(this,"showErrorResolutionPanel",0);Ct(this,"lastErrorMessage","");Ct(this,"onMetaChange");this.meta=t,this.visList=n!=null&&n.empty?[]:[y9(t,"Chart 1")],this.createdVis=this.visList.length,this.onMetaChange=n==null?void 0:n.onMetaChange,BG(this,{visList:zn.shallow,allEncodings:Wh.struct,filters:zn.ref,tableCollapsedHeaderMap:zn.ref})}get visLength(){return this.visList.length}get vizList(){return this.visList.map(t=>t.now)}get currentVis(){return this.visList[this.visIndex].now}get currentEncodings(){return this.currentVis.encodings}get viewFilters(){return this.currentEncodings.filters}get dimensions(){return this.currentEncodings.dimensions}get measures(){return this.currentEncodings.measures}get rows(){return this.currentEncodings.rows}get columns(){return this.currentEncodings.columns}get sort(){return p9({columns:this.columns,rows:this.rows})}get sortedEncoding(){return GD({columns:this.columns,rows:this.rows})}get allFields(){return[...this.dimensions,...this.measures]}get config(){return this.currentVis.config}get layout(){return{...this.currentVis.layout,...this.localGeoJSON?{geoJson:this.localGeoJSON}:{}}}get allEncodings(){const t={};return H2e.forEach(n=>{t[n]=this.currentEncodings[n]}),t}get viewEncodings(){const t={};return HD(this.config.geoms[0]).forEach(n=>{t[n]=this.currentEncodings[n]}),t}get viewEncodingFields(){return HD(this.config.geoms[0]).flatMap(t=>this.viewEncodings[t])}get viewDimensions(){return this.viewEncodingFields.filter(t=>t.analyticType==="dimension")}get viewMeasures(){return this.viewEncodingFields.filter(t=>t.analyticType==="measure")}get workflow(){return Ah(this.viewFilters,this.allFields,this.viewDimensions,this.viewMeasures,this.config.defaultAggregated,this.sort,this.config.folds,this.config.limit)}get limit(){return this.config.limit}get canUndo(){return this.visList[this.visIndex].cursor>0}get canRedo(){const t=this.visList[this.visIndex];return t.cursor!==t.timeline.length}appendFilter(t,n,r){const i=this.currentEncodings[n][r];i.fid===mr||i.fid===gr||i.fid===Ar||(this.visList[this.visIndex]=mn.appendFilter(this.visList[this.visIndex],t,n,r,Li()),this.editingFilterIdx=t)}undo(){this.visList[this.visIndex]=L2e(this.visList[this.visIndex])}redo(){this.visList[this.visIndex]=T2e(this.visList[this.visIndex])}setVisName(t,n){this.visList[t]=mn.setName(this.visList[t],n)}setMeta(t){this.meta=t}resetVisualization(t="Chart 1"){this.visList=[y9(this.meta,t)],this.createdVis=1}addVisualization(t){const n=t?typeof t=="function"?t(this.createdVis+1):t:"Chart "+(this.createdVis+1);this.visList.push(y9(this.meta,n)),this.createdVis+=1,this.visIndex=this.visList.length-1}removeVisualization(t){this.visLength!==1&&(this.visIndex>=t&&this.visIndex>0&&(this.visIndex-=1),this.visList.splice(t,1))}duplicateVisualization(t){this.visList.push(zh({...this.visList[t].now,name:this.visList[t].now.name+" Copy",visId:Li()})),this.createdVis+=1,this.visIndex=this.visList.length-1}setFilterEditing(t){this.editingFilterIdx=t}closeFilterEditing(){this.editingFilterIdx=null}setSegmentKey(t){this.segmentKey=t}setVisualConfig(...t){this.visList[this.visIndex]=mn.setConfig(this.visList[this.visIndex],...t)}setCoordSystem(t){this.visList[this.visIndex]=mn.setCoordSystem(this.visList[this.visIndex],t)}setVisualLayout(...t){typeof t[0]=="string"?this.visList[this.visIndex]=mn.setLayout(this.visList[this.visIndex],[t]):this.visList[this.visIndex]=mn.setLayout(this.visList[this.visIndex],t)}reorderField(t,n,r){Bt.META_FIELD_KEYS.includes(t)||n!==r&&(this.visList[this.visIndex]=mn.reorderField(this.visList[this.visIndex],t,n,r))}moveField(t,n,r,i){if(t==="filters")return this.removeField(t,n);if(r==="filters")return this.appendFilter(i,t,n);const o=this.currentEncodings[t][n],a=Bt.META_FIELD_KEYS.includes(t),s=Bt.META_FIELD_KEYS.includes(r);if(s&&(o.fid===mr||o.fid===gr||o.fid===Ar))return;const l=Bt.CHANNEL_LIMIT[r]??1/0;s===a?this.visList[this.visIndex]=mn.moveField(this.visList[this.visIndex],t,n,r,i,l):s?this.visList[this.visIndex]=mn.removeField(this.visList[this.visIndex],t,n):this.visList[this.visIndex]=mn.cloneField(this.visList[this.visIndex],t,n,r,i,Li(),l)}modFilter(t,n,r){this.visList[this.visIndex]=mn.modFilter(this.visList[this.visIndex],t,n,r)}removeField(t,n){Bt.META_FIELD_KEYS.includes(t)||(this.visList[this.visIndex]=mn.removeField(this.visList[this.visIndex],t,n))}writeFilter(t,n){this.visList[this.visIndex]=mn.writeFilter(this.visList[this.visIndex],t,s2(n))}transpose(){this.visList[this.visIndex]=mn.transpose(this.visList[this.visIndex])}createBinField(t,n,r,i=10){const o=Li(),a=this.currentEncodings,s=a.dimensions.find(l=>l.computed&&l.expression&&l.expression.op===r&&l.expression.params[0].value===a[t][n].fid&&l.expression.num===i);return s?s.fid:(this.visList[this.visIndex]=mn.createBinlogField(this.visList[this.visIndex],t,n,r,o,i),o)}createLogField(t,n,r,i=10){this.visList[this.visIndex]=mn.createBinlogField(this.visList[this.visIndex],t,n,r,Li(),i)}createDateTimeDrilledField(t,n,r,i,o){this.visList[this.visIndex]=mn.createDateDrillField(this.visList[this.visIndex],t,n,r,Li(),i,o)}createDateFeatureField(t,n,r,i,o){this.visList[this.visIndex]=mn.createDateFeatureField(this.visList[this.visIndex],t,n,r,Li(),i,o)}setFieldAggregator(t,n,r){this.visList[this.visIndex]=mn.setFieldAggregator(this.visList[this.visIndex],t,n,r)}setFilterAggregator(t,n){this.visList[this.visIndex]=mn.setFilterAggregator(this.visList[this.visIndex],t,n)}applyDefaultSort(t="ascending"){this.visList[this.visIndex]=mn.applySort(this.visList[this.visIndex],t)}exportCurrentChart(){return RD(this.visList[this.visIndex])}exportAllCharts(){return this.visList.map(t=>RD(t))}exportCode(){return this.visList.map(t=>X2e(t))}importCode(t){this.visList=t.map(n=>"layout"in n?O2e(n):zh(x9(LD(TD(n))))),this.createdVis=this.visList.length,this.visIndex=0}appendRaw(t){const n=zD(t);this.visList.push(n),this.createdVis+=1,this.visIndex=this.visList.length-1}importRaw(t){this.visList=t.map(zD),this.createdVis=this.visList.length,this.visIndex=0}appendFromOld(t){const n=zh(x9(LD(TD(t))));this.visList.push(n),this.createdVis+=1,this.visIndex=this.visList.length-1}replaceNow(t){this.visList[this.visIndex]=zh(t)}selectVisualization(t){this.visIndex=t}setShowDataConfig(t){this.showDataConfig=t}setShowInsightBoard(t){this.showInsightBoard=t}setShowDataBoard(t){this.showDataBoard=t}showEmbededMenu(t){this.vizEmbededMenu.show=!0,this.vizEmbededMenu.position=t}setShowCodeExportPanel(t){this.showCodeExportPanel=t}setShowVisualConfigPanel(t){this.showVisualConfigPanel=t}closeEmbededMenu(){this.vizEmbededMenu.show=!1}setFilters(t){this.filters=t}updateCurrentDatasetMetas(t,n){var i;const r=this.meta.find(o=>o.fid===t);if(r)for(let o in n)r[o]=n[o];(i=this.onMetaChange)==null||i.call(this,t,n)}openRemoveConfirmModal(t){this.removeConfirmIdx=t}closeRemoveConfirmModal(){this.removeConfirmIdx=null}setGeographicData(t,n,r){const i=t.type==="GeoJSON"?t.data:d2(t.data,t.objectKey||Object.keys(t.data.objects)[0]);if(!("features"in i)){console.error("Invalid GeoJSON: GeoJSON must be a FeatureCollection, but got",i);return}this.localGeoJSON=i,r?this.visList[this.visIndex]=mn.setGeoData(this.visList[this.visIndex],void 0,n,r):this.visList[this.visIndex]=mn.setGeoData(this.visList[this.visIndex],i,n,void 0)}clearGeographicData(){this.visList[this.visIndex]=mn.setGeoData(this.visList[this.visIndex],void 0,void 0,void 0)}changeSemanticType(t,n,r){this.visList[this.visIndex]=mn.changeSemanticType(this.visList[this.visIndex],t,n,r)}updateGeoKey(t){this.setVisualLayout("geoKey",t)}updateTableCollapsedHeader(t){const{uniqueKey:n,height:r}=t;if(r<1)return;const i=new Map(this.tableCollapsedHeaderMap);i.forEach((o,a)=>{a.startsWith(n)&&a.length>n.length&&i.delete(a)}),i.has(n)?i.delete(n):i.set(n,t.path),this.tableCollapsedHeaderMap=i}resetTableCollapsedHeader(){const t=new Map;this.tableCollapsedHeaderMap=t}setShowGeoJSONConfigPanel(t){this.showGeoJSONConfigPanel=t}setShowBinSettingPanel(t){this.showBinSettingPanel=t}setShowLogSettingPanel(t){this.showLogSettingPanel=t}setCreateField(t){this.createField=t}updateSelectedMarkObject(t){this.selectedMarkObject=t}updateShowErrorResolutionPanel(t,n=""){this.showErrorResolutionPanel=t,this.lastErrorMessage=n}}function B2e(e,t,n,r){var a,s,l;const i=YD(t,n,r),o=i.encodings.dimensions.concat(i.encodings.measures);if(i.config.defaultAggregated=Boolean(e.aggregate),(((a=e.geomType)==null?void 0:a.length)??0)>0&&(i.config.geoms=((s=e.geomType)==null?void 0:s.map(u=>J2e(u)))??["tick"]),(((l=e.facets)==null?void 0:l.length)??0)>0){const u=(e.facets||[]).concat(e.highFacets||[]);for(let c of u){const d=o.find(f=>f.fid===c);d&&i.encodings.rows.push(d)}}if(e.position){const[u,c]=e.position;if(u){const d=o.find(f=>f.fid===u);d&&i.encodings.columns.push(d)}if(c){const d=o.find(f=>f.fid===c);d&&i.encodings.rows.push(d)}}if(e.color&&e.color.length>0){const u=e.color[0],c=o.find(d=>d.fid===u);c&&i.encodings.color.push(c)}if(e.size&&e.size.length>0){const u=e.size[0],c=o.find(d=>d.fid===u);c&&i.encodings.size.push(c)}if(e.opacity&&e.opacity.length>0){const u=e.opacity[0],c=o.find(d=>d.fid===u);c&&i.encodings.opacity.push(c)}return i}function J2e(e){switch(e){case"interval":case"bar":return"bar";case"line":return"line";case"boxplot":return"boxplot";case"area":return"area";case"point":return"point";case"arc":return"arc";case"circle":return"circle";case"heatmap":return"circle";case"rect":return"rect";case"tick":default:return"tick"}}const BD="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IGw9KHMsbik9PnMuZmlsdGVyKHI9Pntmb3IoY29uc3R7cnVsZTplLGZpZDp0fW9mIG4paWYoZSlzd2l0Y2goZS50eXBlKXtjYXNlIm9uZSBvZiI6e2lmKGUudmFsdWUuaGFzKHJbdF0pKWJyZWFrO3JldHVybiExfWNhc2Uibm90IGluIjppZighZS52YWx1ZS5oYXMoclt0XSkpYnJlYWs7Y2FzZSJyYW5nZSI6e2lmKGUudmFsdWVbMF08PXJbdF0mJnJbdF08PWUudmFsdWVbMV0pYnJlYWs7cmV0dXJuITF9Y2FzZSJ0ZW1wb3JhbCByYW5nZSI6dHJ5e2NvbnN0IGE9bmV3IERhdGUoclt0XSkuZ2V0VGltZSgpO2lmKGUudmFsdWVbMF08PWEmJmE8PWUudmFsdWVbMV0pYnJlYWs7cmV0dXJuITF9Y2F0Y2goYSl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoYSksITF9ZGVmYXVsdDp7Y29uc29sZS53YXJuKCJVbnJlc29sdmFibGUgZmlsdGVyIHJ1bGUiLGUpO2NvbnRpbnVlfX1yZXR1cm4hMH0pLG89cz0+e2NvbnN0e2RhdGFTb3VyY2U6bixmaWx0ZXJzOnJ9PXMuZGF0YSxlPWwobixyKTtzZWxmLnBvc3RNZXNzYWdlKGUpfTtzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8sITEpfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsdGVyLndvcmtlci05OTY4ZTdhOS5qcy5tYXAK",JD=typeof window<"u"&&window.Blob&&new Blob([atob(BD)],{type:"text/javascript;charset=utf-8"});function U2e(){const e=JD&&(window.URL||window.webkitURL).createObjectURL(JD);try{return e?new Worker(e):new Worker("data:application/javascript;base64,"+BD)}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const UD="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIFAoaSl7cmV0dXJuIFA9dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09InN5bWJvbCI/ZnVuY3Rpb24ocil7cmV0dXJuIHR5cGVvZiByfTpmdW5jdGlvbihyKXtyZXR1cm4gciYmdHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmciE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHJ9LFAoaSl9ZnVuY3Rpb24gayhpLHIpe2lmKCEoaSBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIEtlKGkscil7aWYoUChpKSE9PSJvYmplY3QifHxpPT09bnVsbClyZXR1cm4gaTt2YXIgdD1pW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodCE9PXZvaWQgMCl7dmFyIG49dC5jYWxsKGkscnx8ImRlZmF1bHQiKTtpZihQKG4pIT09Im9iamVjdCIpcmV0dXJuIG47dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4ocj09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKGkpfWZ1bmN0aW9uIGRlKGkpe3ZhciByPUtlKGksInN0cmluZyIpO3JldHVybiBQKHIpPT09InN5bWJvbCI/cjpTdHJpbmcocil9ZnVuY3Rpb24gaGUoaSxyKXtmb3IodmFyIHQ9MDt0PHIubGVuZ3RoO3QrKyl7dmFyIG49clt0XTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLGRlKG4ua2V5KSxuKX19ZnVuY3Rpb24gUihpLHIsdCl7cmV0dXJuIHImJmhlKGkucHJvdG90eXBlLHIpLHQmJmhlKGksdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksaX1mdW5jdGlvbiBFKGkpe2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gaX1mdW5jdGlvbiBvZShpLHIpe3JldHVybiBvZT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihuLGUpe3JldHVybiBuLl9fcHJvdG9fXz1lLG59LG9lKGkscil9ZnVuY3Rpb24gcShpLHIpe2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iJiZyIT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2kucHJvdG90eXBlPU9iamVjdC5jcmVhdGUociYmci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTppLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxyJiZvZShpLHIpfWZ1bmN0aW9uIEIoaSxyKXtpZihyJiYoUChyKT09PSJvYmplY3QifHx0eXBlb2Ygcj09ImZ1bmN0aW9uIikpcmV0dXJuIHI7aWYociE9PXZvaWQgMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpO3JldHVybiBFKGkpfWZ1bmN0aW9uIGooaSl7cmV0dXJuIGo9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9LGooaSl9ZnVuY3Rpb24gRihpLHIsdCl7cmV0dXJuIHI9ZGUociksciBpbiBpP09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHIse3ZhbHVlOnQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTppW3JdPXQsaX1mdW5jdGlvbiBZZShpKXtpZihBcnJheS5pc0FycmF5KGkpKXJldHVybiBpfWZ1bmN0aW9uIEplKGkpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZpW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGlbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShpKX1mdW5jdGlvbiB2ZShpLHIpeyhyPT1udWxsfHxyPmkubGVuZ3RoKSYmKHI9aS5sZW5ndGgpO2Zvcih2YXIgdD0wLG49bmV3IEFycmF5KHIpO3Q8cjt0Kyspblt0XT1pW3RdO3JldHVybiBufWZ1bmN0aW9uIHplKGkscil7aWYoaSl7aWYodHlwZW9mIGk9PSJzdHJpbmciKXJldHVybiB2ZShpLHIpO3ZhciB0PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpKS5zbGljZSg4LC0xKTtpZih0PT09Ik9iamVjdCImJmkuY29uc3RydWN0b3ImJih0PWkuY29uc3RydWN0b3IubmFtZSksdD09PSJNYXAifHx0PT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20oaSk7aWYodD09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSlyZXR1cm4gdmUoaSxyKX19ZnVuY3Rpb24gV2UoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gUWUoaSl7cmV0dXJuIFllKGkpfHxKZShpKXx8emUoaSl8fFdlKCl9ZnVuY3Rpb24gbWUoaSxyKXt2YXIgdD1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3ImJihuPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSx0LnB1c2guYXBwbHkodCxuKX1yZXR1cm4gdH1mdW5jdGlvbiB5ZShpKXtmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgdD1hcmd1bWVudHNbcl0hPW51bGw/YXJndW1lbnRzW3JdOnt9O3IlMj9tZShPYmplY3QodCksITApLmZvckVhY2goZnVuY3Rpb24obil7RihpLG4sdFtuXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKTptZShPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24obil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGksbixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbikpfSl9cmV0dXJuIGl9dmFyIEdlPXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbihyKXt0aGlzLm91dHB1dCgibG9nIixyKX0sd2FybjpmdW5jdGlvbihyKXt0aGlzLm91dHB1dCgid2FybiIscil9LGVycm9yOmZ1bmN0aW9uKHIpe3RoaXMub3V0cHV0KCJlcnJvciIscil9LG91dHB1dDpmdW5jdGlvbihyLHQpe2NvbnNvbGUmJmNvbnNvbGVbcl0mJmNvbnNvbGVbcl0uYXBwbHkoY29uc29sZSx0KX19LHFlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaShyKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e307ayh0aGlzLGkpLHRoaXMuaW5pdChyLHQpfXJldHVybiBSKGksW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1uLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj10fHxHZSx0aGlzLm9wdGlvbnM9bix0aGlzLmRlYnVnPW4uZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQpLGU9MDtlPHQ7ZSsrKW5bZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQobiwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQpLGU9MDtlPHQ7ZSsrKW5bZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQobiwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodCksZT0wO2U8dDtlKyspbltlXT1hcmd1bWVudHNbZV07cmV0dXJuIHRoaXMuZm9yd2FyZChuLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQpLGU9MDtlPHQ7ZSsrKW5bZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQobiwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LG4sZSxhKXtyZXR1cm4gYSYmIXRoaXMuZGVidWc/bnVsbDoodHlwZW9mIHRbMF09PSJzdHJpbmciJiYodFswXT0iIi5jb25jYXQoZSkuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltuXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaSh0aGlzLmxvZ2dlcix5ZSh5ZSh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdCh0LCI6Iil9KSx0aGlzLm9wdGlvbnMpKX19LHtrZXk6ImNsb25lIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD10fHx0aGlzLm9wdGlvbnMsdC5wcmVmaXg9dC5wcmVmaXh8fHRoaXMucHJlZml4LG5ldyBpKHRoaXMubG9nZ2VyLHQpfX1dKSxpfSgpLE49bmV3IHFlLF89ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7ayh0aGlzLGkpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBSKGksW3trZXk6Im9uIix2YWx1ZTpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXM7cmV0dXJuIHQuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Uub2JzZXJ2ZXJzW2FdPWUub2JzZXJ2ZXJzW2FdfHxbXSxlLm9ic2VydmVyc1thXS5wdXNoKG4pfSksdGhpc319LHtrZXk6Im9mZiIsdmFsdWU6ZnVuY3Rpb24odCxuKXtpZih0aGlzLm9ic2VydmVyc1t0XSl7aWYoIW4pe2RlbGV0ZSB0aGlzLm9ic2VydmVyc1t0XTtyZXR1cm59dGhpcy5vYnNlcnZlcnNbdF09dGhpcy5vYnNlcnZlcnNbdF0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09bn0pfX19LHtrZXk6ImVtaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KG4+MT9uLTE6MCksYT0xO2E8bjthKyspZVthLTFdPWFyZ3VtZW50c1thXTtpZih0aGlzLm9ic2VydmVyc1t0XSl7dmFyIG89W10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzW3RdKTtvLmZvckVhY2goZnVuY3Rpb24ocyl7cy5hcHBseSh2b2lkIDAsZSl9KX1pZih0aGlzLm9ic2VydmVyc1siKiJdKXt2YXIgdT1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbIioiXSk7dS5mb3JFYWNoKGZ1bmN0aW9uKHMpe3MuYXBwbHkocyxbdF0uY29uY2F0KGUpKX0pfX19XSksaX0oKTtmdW5jdGlvbiBLKCl7dmFyIGkscix0PW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4sZSl7aT1uLHI9ZX0pO3JldHVybiB0LnJlc29sdmU9aSx0LnJlamVjdD1yLHR9ZnVuY3Rpb24gYmUoaSl7cmV0dXJuIGk9PW51bGw/IiI6IiIraX1mdW5jdGlvbiBYZShpLHIsdCl7aS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3Jbbl0mJih0W25dPXJbbl0pfSl9ZnVuY3Rpb24gc2UoaSxyLHQpe2Z1bmN0aW9uIG4odSl7cmV0dXJuIHUmJnUuaW5kZXhPZigiIyMjIik+LTE/dS5yZXBsYWNlKC8jIyMvZywiLiIpOnV9ZnVuY3Rpb24gZSgpe3JldHVybiFpfHx0eXBlb2YgaT09InN0cmluZyJ9Zm9yKHZhciBhPXR5cGVvZiByIT0ic3RyaW5nIj9bXS5jb25jYXQocik6ci5zcGxpdCgiLiIpO2EubGVuZ3RoPjE7KXtpZihlKCkpcmV0dXJue307dmFyIG89bihhLnNoaWZ0KCkpOyFpW29dJiZ0JiYoaVtvXT1uZXcgdCksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksbyk/aT1pW29dOmk9e319cmV0dXJuIGUoKT97fTp7b2JqOmksazpuKGEuc2hpZnQoKSl9fWZ1bmN0aW9uIE9lKGkscix0KXt2YXIgbj1zZShpLHIsT2JqZWN0KSxlPW4ub2JqLGE9bi5rO2VbYV09dH1mdW5jdGlvbiBaZShpLHIsdCxuKXt2YXIgZT1zZShpLHIsT2JqZWN0KSxhPWUub2JqLG89ZS5rO2Fbb109YVtvXXx8W10sbiYmKGFbb109YVtvXS5jb25jYXQodCkpLG58fGFbb10ucHVzaCh0KX1mdW5jdGlvbiBYKGkscil7dmFyIHQ9c2UoaSxyKSxuPXQub2JqLGU9dC5rO2lmKG4pcmV0dXJuIG5bZV19ZnVuY3Rpb24gd2UoaSxyLHQpe3ZhciBuPVgoaSx0KTtyZXR1cm4gbiE9PXZvaWQgMD9uOlgocix0KX1mdW5jdGlvbiBTZShpLHIsdCl7Zm9yKHZhciBuIGluIHIpbiE9PSJfX3Byb3RvX18iJiZuIT09ImNvbnN0cnVjdG9yIiYmKG4gaW4gaT90eXBlb2YgaVtuXT09InN0cmluZyJ8fGlbbl1pbnN0YW5jZW9mIFN0cmluZ3x8dHlwZW9mIHJbbl09PSJzdHJpbmcifHxyW25daW5zdGFuY2VvZiBTdHJpbmc/dCYmKGlbbl09cltuXSk6U2UoaVtuXSxyW25dLHQpOmlbbl09cltuXSk7cmV0dXJuIGl9ZnVuY3Rpb24gQShpKXtyZXR1cm4gaS5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csIlxcJCYiKX12YXIgZXQ9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiB0dChpKXtyZXR1cm4gdHlwZW9mIGk9PSJzdHJpbmciP2kucmVwbGFjZSgvWyY8PiInXC9dL2csZnVuY3Rpb24ocil7cmV0dXJuIGV0W3JdfSk6aX12YXIgWj10eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93Lm5hdmlnYXRvciYmdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50RGF0YT4idSImJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+LTEsbnQ9WyIgIiwiLCIsIj8iLCIhIiwiOyJdO2Z1bmN0aW9uIHJ0KGkscix0KXtyPXJ8fCIiLHQ9dHx8IiI7dmFyIG49bnQuZmlsdGVyKGZ1bmN0aW9uKHUpe3JldHVybiByLmluZGV4T2YodSk8MCYmdC5pbmRleE9mKHUpPDB9KTtpZihuLmxlbmd0aD09PTApcmV0dXJuITA7dmFyIGU9bmV3IFJlZ0V4cCgiKCIuY29uY2F0KG4ubWFwKGZ1bmN0aW9uKHUpe3JldHVybiB1PT09Ij8iPyJcXD8iOnV9KS5qb2luKCJ8IiksIikiKSksYT0hZS50ZXN0KGkpO2lmKCFhKXt2YXIgbz1pLmluZGV4T2YodCk7bz4wJiYhZS50ZXN0KGkuc3Vic3RyaW5nKDAsbykpJiYoYT0hMCl9cmV0dXJuIGF9ZnVuY3Rpb24geGUoaSxyKXt2YXIgdD1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3ImJihuPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSx0LnB1c2guYXBwbHkodCxuKX1yZXR1cm4gdH1mdW5jdGlvbiBlZShpKXtmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgdD1hcmd1bWVudHNbcl0hPW51bGw/YXJndW1lbnRzW3JdOnt9O3IlMj94ZShPYmplY3QodCksITApLmZvckVhY2goZnVuY3Rpb24obil7RihpLG4sdFtuXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKTp4ZShPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24obil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGksbixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbikpfSl9cmV0dXJuIGl9ZnVuY3Rpb24gYXQoaSl7dmFyIHI9aXQoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1qKGkpLGU7aWYocil7dmFyIGE9aih0aGlzKS5jb25zdHJ1Y3RvcjtlPVJlZmxlY3QuY29uc3RydWN0KG4sYXJndW1lbnRzLGEpfWVsc2UgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gQih0aGlzLGUpfX1mdW5jdGlvbiBpdCgpe2lmKHR5cGVvZiBSZWZsZWN0PiJ1Inx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKHR5cGVvZiBQcm94eT09ImZ1bmN0aW9uIilyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBQZShpLHIpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXToiLiI7aWYoaSl7aWYoaVtyXSlyZXR1cm4gaVtyXTtmb3IodmFyIG49ci5zcGxpdCh0KSxlPWksYT0wO2E8bi5sZW5ndGg7KythKXtpZighZXx8dHlwZW9mIGVbblthXV09PSJzdHJpbmciJiZhKzE8bi5sZW5ndGgpcmV0dXJuO2lmKGVbblthXV09PT12b2lkIDApe2Zvcih2YXIgbz0yLHU9bi5zbGljZShhLGErbykuam9pbih0KSxzPWVbdV07cz09PXZvaWQgMCYmbi5sZW5ndGg+YStvOylvKyssdT1uLnNsaWNlKGEsYStvKS5qb2luKHQpLHM9ZVt1XTtpZihzPT09dm9pZCAwKXJldHVybjtpZihzPT09bnVsbClyZXR1cm4gbnVsbDtpZihyLmVuZHNXaXRoKHUpKXtpZih0eXBlb2Ygcz09InN0cmluZyIpcmV0dXJuIHM7aWYodSYmdHlwZW9mIHNbdV09PSJzdHJpbmciKXJldHVybiBzW3VdfXZhciBsPW4uc2xpY2UoYStvKS5qb2luKHQpO3JldHVybiBsP1BlKHMsbCx0KTp2b2lkIDB9ZT1lW25bYV1dfXJldHVybiBlfX12YXIgb3Q9ZnVuY3Rpb24oaSl7cSh0LGkpO3ZhciByPWF0KHQpO2Z1bmN0aW9uIHQobil7dmFyIGUsYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e25zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6InRyYW5zbGF0aW9uIn07cmV0dXJuIGsodGhpcyx0KSxlPXIuY2FsbCh0aGlzKSxaJiZfLmNhbGwoRShlKSksZS5kYXRhPW58fHt9LGUub3B0aW9ucz1hLGUub3B0aW9ucy5rZXlTZXBhcmF0b3I9PT12b2lkIDAmJihlLm9wdGlvbnMua2V5U2VwYXJhdG9yPSIuIiksZS5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmU9PT12b2lkIDAmJihlLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZT0hMCksZX1yZXR1cm4gUih0LFt7a2V5OiJhZGROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLm9wdGlvbnMubnMuaW5kZXhPZihlKTwwJiZ0aGlzLm9wdGlvbnMubnMucHVzaChlKX19LHtrZXk6InJlbW92ZU5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPXRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGUpO2E+LTEmJnRoaXMub3B0aW9ucy5ucy5zcGxpY2UoYSwxKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOnt9LHM9dS5rZXlTZXBhcmF0b3IhPT12b2lkIDA/dS5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixsPXUuaWdub3JlSlNPTlN0cnVjdHVyZSE9PXZvaWQgMD91Lmlnbm9yZUpTT05TdHJ1Y3R1cmU6dGhpcy5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmUsZj1bZSxhXTtvJiZ0eXBlb2YgbyE9InN0cmluZyImJihmPWYuY29uY2F0KG8pKSxvJiZ0eXBlb2Ygbz09InN0cmluZyImJihmPWYuY29uY2F0KHM/by5zcGxpdChzKTpvKSksZS5pbmRleE9mKCIuIik+LTEmJihmPWUuc3BsaXQoIi4iKSk7dmFyIGM9WCh0aGlzLmRhdGEsZik7cmV0dXJuIGN8fCFsfHx0eXBlb2YgbyE9InN0cmluZyI/YzpQZSh0aGlzLmRhdGEmJnRoaXMuZGF0YVtlXSYmdGhpcy5kYXRhW2VdW2FdLG8scyl9fSx7a2V5OiJhZGRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8sdSl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOntzaWxlbnQ6ITF9LGw9dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjtsPT09dm9pZCAwJiYobD0iLiIpO3ZhciBmPVtlLGFdO28mJihmPWYuY29uY2F0KGw/by5zcGxpdChsKTpvKSksZS5pbmRleE9mKCIuIik+LTEmJihmPWUuc3BsaXQoIi4iKSx1PWEsYT1mWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoYSksT2UodGhpcy5kYXRhLGYsdSkscy5zaWxlbnR8fHRoaXMuZW1pdCgiYWRkZWQiLGUsYSxvLHUpfX0se2tleToiYWRkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOntzaWxlbnQ6ITF9O2Zvcih2YXIgcyBpbiBvKSh0eXBlb2Ygb1tzXT09InN0cmluZyJ8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkob1tzXSk9PT0iW29iamVjdCBBcnJheV0iKSYmdGhpcy5hZGRSZXNvdXJjZShlLGEscyxvW3NdLHtzaWxlbnQ6ITB9KTt1LnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsZSxhLG8pfX0se2tleToiYWRkUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvLHUscyl7dmFyIGw9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOntzaWxlbnQ6ITF9LGY9W2UsYV07ZS5pbmRleE9mKCIuIik+LTEmJihmPWUuc3BsaXQoIi4iKSx1PW8sbz1hLGE9ZlsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGEpO3ZhciBjPVgodGhpcy5kYXRhLGYpfHx7fTt1P1NlKGMsbyxzKTpjPWVlKGVlKHt9LGMpLG8pLE9lKHRoaXMuZGF0YSxmLGMpLGwuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIixlLGEsbyl9fSx7a2V5OiJyZW1vdmVSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXt0aGlzLmhhc1Jlc291cmNlQnVuZGxlKGUsYSkmJmRlbGV0ZSB0aGlzLmRhdGFbZV1bYV0sdGhpcy5yZW1vdmVOYW1lc3BhY2VzKGEpLHRoaXMuZW1pdCgicmVtb3ZlZCIsZSxhKX19LHtrZXk6Imhhc1Jlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbihlLGEpe3JldHVybiB0aGlzLmdldFJlc291cmNlKGUsYSkhPT12b2lkIDB9fSx7a2V5OiJnZXRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXtyZXR1cm4gYXx8KGE9dGhpcy5vcHRpb25zLmRlZmF1bHROUyksdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk9PT0idjEiP2VlKGVlKHt9LHt9KSx0aGlzLmdldFJlc291cmNlKGUsYSkpOnRoaXMuZ2V0UmVzb3VyY2UoZSxhKX19LHtrZXk6ImdldERhdGFCeUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kYXRhW2VdfX0se2tleToiaGFzTGFuZ3VhZ2VTb21lVHJhbnNsYXRpb25zIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT10aGlzLmdldERhdGFCeUxhbmd1YWdlKGUpLG89YSYmT2JqZWN0LmtleXMoYSl8fFtdO3JldHVybiEhby5maW5kKGZ1bmN0aW9uKHUpe3JldHVybiBhW3VdJiZPYmplY3Qua2V5cyhhW3VdKS5sZW5ndGg+MH0pfX0se2tleToidG9KU09OIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGF9fV0pLHR9KF8pLExlPXtwcm9jZXNzb3JzOnt9LGFkZFBvc3RQcm9jZXNzb3I6ZnVuY3Rpb24ocil7dGhpcy5wcm9jZXNzb3JzW3IubmFtZV09cn0saGFuZGxlOmZ1bmN0aW9uKHIsdCxuLGUsYSl7dmFyIG89dGhpcztyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKHUpe28ucHJvY2Vzc29yc1t1XSYmKHQ9by5wcm9jZXNzb3JzW3VdLnByb2Nlc3ModCxuLGUsYSkpfSksdH19O2Z1bmN0aW9uIGtlKGkscil7dmFyIHQ9T2JqZWN0LmtleXMoaSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhpKTtyJiYobj1uLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLGUpLmVudW1lcmFibGV9KSksdC5wdXNoLmFwcGx5KHQsbil9cmV0dXJuIHR9ZnVuY3Rpb24gdyhpKXtmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgdD1hcmd1bWVudHNbcl0hPW51bGw/YXJndW1lbnRzW3JdOnt9O3IlMj9rZShPYmplY3QodCksITApLmZvckVhY2goZnVuY3Rpb24obil7RihpLG4sdFtuXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKTprZShPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24obil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGksbixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbikpfSl9cmV0dXJuIGl9ZnVuY3Rpb24gc3QoaSl7dmFyIHI9dXQoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1qKGkpLGU7aWYocil7dmFyIGE9aih0aGlzKS5jb25zdHJ1Y3RvcjtlPVJlZmxlY3QuY29uc3RydWN0KG4sYXJndW1lbnRzLGEpfWVsc2UgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gQih0aGlzLGUpfX1mdW5jdGlvbiB1dCgpe2lmKHR5cGVvZiBSZWZsZWN0PiJ1Inx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKHR5cGVvZiBQcm94eT09ImZ1bmN0aW9uIilyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoe3JldHVybiExfX12YXIgUmU9e30samU9ZnVuY3Rpb24oaSl7cSh0LGkpO3ZhciByPXN0KHQpO2Z1bmN0aW9uIHQobil7dmFyIGUsYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e307cmV0dXJuIGsodGhpcyx0KSxlPXIuY2FsbCh0aGlzKSxaJiZfLmNhbGwoRShlKSksWGUoWyJyZXNvdXJjZVN0b3JlIiwibGFuZ3VhZ2VVdGlscyIsInBsdXJhbFJlc29sdmVyIiwiaW50ZXJwb2xhdG9yIiwiYmFja2VuZENvbm5lY3RvciIsImkxOG5Gb3JtYXQiLCJ1dGlscyJdLG4sRShlKSksZS5vcHRpb25zPWEsZS5vcHRpb25zLmtleVNlcGFyYXRvcj09PXZvaWQgMCYmKGUub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxlLmxvZ2dlcj1OLmNyZWF0ZSgidHJhbnNsYXRvciIpLGV9cmV0dXJuIFIodCxbe2tleToiY2hhbmdlTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKGUpe2UmJih0aGlzLmxhbmd1YWdlPWUpfX0se2tleToiZXhpc3RzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319O2lmKGU9PW51bGwpcmV0dXJuITE7dmFyIG89dGhpcy5yZXNvbHZlKGUsYSk7cmV0dXJuIG8mJm8ucmVzIT09dm9pZCAwfX0se2tleToiZXh0cmFjdEZyb21LZXkiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89YS5uc1NlcGFyYXRvciE9PXZvaWQgMD9hLm5zU2VwYXJhdG9yOnRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtvPT09dm9pZCAwJiYobz0iOiIpO3ZhciB1PWEua2V5U2VwYXJhdG9yIT09dm9pZCAwP2Eua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3Iscz1hLm5zfHx0aGlzLm9wdGlvbnMuZGVmYXVsdE5TfHxbXSxsPW8mJmUuaW5kZXhPZihvKT4tMSxmPSF0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3ImJiFhLmtleVNlcGFyYXRvciYmIXRoaXMub3B0aW9ucy51c2VyRGVmaW5lZE5zU2VwYXJhdG9yJiYhYS5uc1NlcGFyYXRvciYmIXJ0KGUsbyx1KTtpZihsJiYhZil7dmFyIGM9ZS5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtpZihjJiZjLmxlbmd0aD4wKXJldHVybntrZXk6ZSxuYW1lc3BhY2VzOnN9O3ZhciBnPWUuc3BsaXQobyk7KG8hPT11fHxvPT09dSYmdGhpcy5vcHRpb25zLm5zLmluZGV4T2YoZ1swXSk+LTEpJiYocz1nLnNoaWZ0KCkpLGU9Zy5qb2luKHUpfXJldHVybiB0eXBlb2Ygcz09InN0cmluZyImJihzPVtzXSkse2tleTplLG5hbWVzcGFjZXM6c319fSx7a2V5OiJ0cmFuc2xhdGUiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgdT10aGlzO2lmKFAoYSkhPT0ib2JqZWN0IiYmdGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyJiYoYT10aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXIoYXJndW1lbnRzKSksYXx8KGE9e30pLGU9PW51bGwpcmV0dXJuIiI7QXJyYXkuaXNBcnJheShlKXx8KGU9W1N0cmluZyhlKV0pO3ZhciBzPWEucmV0dXJuRGV0YWlscyE9PXZvaWQgMD9hLnJldHVybkRldGFpbHM6dGhpcy5vcHRpb25zLnJldHVybkRldGFpbHMsbD1hLmtleVNlcGFyYXRvciE9PXZvaWQgMD9hLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGY9dGhpcy5leHRyYWN0RnJvbUtleShlW2UubGVuZ3RoLTFdLGEpLGM9Zi5rZXksZz1mLm5hbWVzcGFjZXMscD1nW2cubGVuZ3RoLTFdLHY9YS5sbmd8fHRoaXMubGFuZ3VhZ2UseT1hLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlfHx0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU7aWYodiYmdi50b0xvd2VyQ2FzZSgpPT09ImNpbW9kZSIpe2lmKHkpe3ZhciBtPWEubnNTZXBhcmF0b3J8fHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtyZXR1cm4gcz8oZC5yZXM9IiIuY29uY2F0KHApLmNvbmNhdChtKS5jb25jYXQoYyksZCk6IiIuY29uY2F0KHApLmNvbmNhdChtKS5jb25jYXQoYyl9cmV0dXJuIHM/KGQucmVzPWMsZCk6Y312YXIgZD10aGlzLnJlc29sdmUoZSxhKSxoPWQmJmQucmVzLE89ZCYmZC51c2VkS2V5fHxjLGI9ZCYmZC5leGFjdFVzZWRLZXl8fGMseD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KGgpLEM9WyJbb2JqZWN0IE51bWJlcl0iLCJbb2JqZWN0IEZ1bmN0aW9uXSIsIltvYmplY3QgUmVnRXhwXSJdLE09YS5qb2luQXJyYXlzIT09dm9pZCAwP2Euam9pbkFycmF5czp0aGlzLm9wdGlvbnMuam9pbkFycmF5cyxZPSF0aGlzLmkxOG5Gb3JtYXR8fHRoaXMuaTE4bkZvcm1hdC5oYW5kbGVBc09iamVjdCxKPXR5cGVvZiBoIT0ic3RyaW5nIiYmdHlwZW9mIGghPSJib29sZWFuIiYmdHlwZW9mIGghPSJudW1iZXIiO2lmKFkmJmgmJkomJkMuaW5kZXhPZih4KTwwJiYhKHR5cGVvZiBNPT0ic3RyaW5nIiYmeD09PSJbb2JqZWN0IEFycmF5XSIpKXtpZighYS5yZXR1cm5PYmplY3RzJiYhdGhpcy5vcHRpb25zLnJldHVybk9iamVjdHMpe3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXJ8fHRoaXMubG9nZ2VyLndhcm4oImFjY2Vzc2luZyBhbiBvYmplY3QgLSBidXQgcmV0dXJuT2JqZWN0cyBvcHRpb25zIGlzIG5vdCBlbmFibGVkISIpO3ZhciAkPXRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXI/dGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlcihPLGgsdyh3KHt9LGEpLHt9LHtuczpnfSkpOiJrZXkgJyIuY29uY2F0KGMsIiAoIikuY29uY2F0KHRoaXMubGFuZ3VhZ2UsIiknIHJldHVybmVkIGFuIG9iamVjdCBpbnN0ZWFkIG9mIHN0cmluZy4iKTtyZXR1cm4gcz8oZC5yZXM9JCxkKTokfWlmKGwpe3ZhciBNZT14PT09IltvYmplY3QgQXJyYXldIixyZT1NZT9bXTp7fSxJdD1NZT9iOk87Zm9yKHZhciBVIGluIGgpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGgsVSkpe3ZhciBBZT0iIi5jb25jYXQoSXQpLmNvbmNhdChsKS5jb25jYXQoVSk7cmVbVV09dGhpcy50cmFuc2xhdGUoQWUsdyh3KHt9LGEpLHtqb2luQXJyYXlzOiExLG5zOmd9KSkscmVbVV09PT1BZSYmKHJlW1VdPWhbVV0pfWg9cmV9fWVsc2UgaWYoWSYmdHlwZW9mIE09PSJzdHJpbmciJiZ4PT09IltvYmplY3QgQXJyYXldIiloPWguam9pbihNKSxoJiYoaD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsZSxhLG8pKTtlbHNle3ZhciBhZT0hMSx6PSExLFZlPWEuY291bnQhPT12b2lkIDAmJnR5cGVvZiBhLmNvdW50IT0ic3RyaW5nIixsZT10Lmhhc0RlZmF1bHRWYWx1ZShhKSxUdD1WZT90aGlzLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeCh2LGEuY291bnQsYSk6IiIsVz1hWyJkZWZhdWx0VmFsdWUiLmNvbmNhdChUdCldfHxhLmRlZmF1bHRWYWx1ZTshdGhpcy5pc1ZhbGlkTG9va3VwKGgpJiZsZSYmKGFlPSEwLGg9VyksdGhpcy5pc1ZhbGlkTG9va3VwKGgpfHwoej0hMCxoPWMpO3ZhciBNdD1hLm1pc3NpbmdLZXlOb1ZhbHVlRmFsbGJhY2tUb0tleXx8dGhpcy5vcHRpb25zLm1pc3NpbmdLZXlOb1ZhbHVlRmFsbGJhY2tUb0tleSxBdD1NdCYmej92b2lkIDA6aCxRPWxlJiZXIT09aCYmdGhpcy5vcHRpb25zLnVwZGF0ZU1pc3Npbmc7aWYoenx8YWV8fFEpe2lmKHRoaXMubG9nZ2VyLmxvZyhRPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5Iix2LHAsYyxRP1c6aCksbCl7dmFyICRlPXRoaXMucmVzb2x2ZShjLHcodyh7fSxhKSx7fSx7a2V5U2VwYXJhdG9yOiExfSkpOyRlJiYkZS5yZXMmJnRoaXMubG9nZ2VyLndhcm4oIlNlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4iKX12YXIgRz1bXSxpZT10aGlzLmxhbmd1YWdlVXRpbHMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcsYS5sbmd8fHRoaXMubGFuZ3VhZ2UpO2lmKHRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvPT09ImZhbGxiYWNrIiYmaWUmJmllWzBdKWZvcih2YXIgY2U9MDtjZTxpZS5sZW5ndGg7Y2UrKylHLnB1c2goaWVbY2VdKTtlbHNlIHRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvPT09ImFsbCI/Rz10aGlzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KGEubG5nfHx0aGlzLmxhbmd1YWdlKTpHLnB1c2goYS5sbmd8fHRoaXMubGFuZ3VhZ2UpO3ZhciBVZT1mdW5jdGlvbihILHBlLEhlKXt2YXIgQmU9bGUmJkhlIT09aD9IZTpBdDt1Lm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXI/dS5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKEgscCxwZSxCZSxRLGEpOnUuYmFja2VuZENvbm5lY3RvciYmdS5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nJiZ1LmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcoSCxwLHBlLEJlLFEsYSksdS5lbWl0KCJtaXNzaW5nS2V5IixILHAscGUsaCl9O3RoaXMub3B0aW9ucy5zYXZlTWlzc2luZyYmKHRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1BsdXJhbHMmJlZlP0cuZm9yRWFjaChmdW5jdGlvbihnZSl7dS5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXhlcyhnZSxhKS5mb3JFYWNoKGZ1bmN0aW9uKEgpe1VlKFtnZV0sYytILGFbImRlZmF1bHRWYWx1ZSIuY29uY2F0KEgpXXx8Vyl9KX0pOlVlKEcsYyxXKSl9aD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsZSxhLGQsbykseiYmaD09PWMmJnRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXkmJihoPSIiLmNvbmNhdChwLCI6IikuY29uY2F0KGMpKSwoenx8YWUpJiZ0aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlciYmKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJIT09InYxIj9oPXRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyKHRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk/IiIuY29uY2F0KHAsIjoiKS5jb25jYXQoYyk6YyxhZT9oOnZvaWQgMCk6aD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcihoKSl9cmV0dXJuIHM/KGQucmVzPWgsZCk6aH19LHtrZXk6ImV4dGVuZFRyYW5zbGF0aW9uIix2YWx1ZTpmdW5jdGlvbihlLGEsbyx1LHMpe3ZhciBsPXRoaXM7aWYodGhpcy5pMThuRm9ybWF0JiZ0aGlzLmkxOG5Gb3JtYXQucGFyc2UpZT10aGlzLmkxOG5Gb3JtYXQucGFyc2UoZSx3KHcoe30sdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyksbyksdS51c2VkTG5nLHUudXNlZE5TLHUudXNlZEtleSx7cmVzb2x2ZWQ6dX0pO2Vsc2UgaWYoIW8uc2tpcEludGVycG9sYXRpb24pe28uaW50ZXJwb2xhdGlvbiYmdGhpcy5pbnRlcnBvbGF0b3IuaW5pdCh3KHcoe30sbykse2ludGVycG9sYXRpb246dyh3KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uKSxvLmludGVycG9sYXRpb24pfSkpO3ZhciBmPXR5cGVvZiBlPT0ic3RyaW5nIiYmKG8mJm8uaW50ZXJwb2xhdGlvbiYmby5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyE9PXZvaWQgMD9vLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzOnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyksYztpZihmKXt2YXIgZz1lLm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2M9ZyYmZy5sZW5ndGh9dmFyIHA9by5yZXBsYWNlJiZ0eXBlb2Ygby5yZXBsYWNlIT0ic3RyaW5nIj9vLnJlcGxhY2U6bztpZih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzJiYocD13KHcoe30sdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcykscCkpLGU9dGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUoZSxwLG8ubG5nfHx0aGlzLmxhbmd1YWdlLG8pLGYpe3ZhciB2PWUubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCkseT12JiZ2Lmxlbmd0aDtjPHkmJihvLm5lc3Q9ITEpfW8ubmVzdCE9PSExJiYoZT10aGlzLmludGVycG9sYXRvci5uZXN0KGUsZnVuY3Rpb24oKXtmb3IodmFyIGg9YXJndW1lbnRzLmxlbmd0aCxPPW5ldyBBcnJheShoKSxiPTA7YjxoO2IrKylPW2JdPWFyZ3VtZW50c1tiXTtyZXR1cm4gcyYmc1swXT09PU9bMF0mJiFvLmNvbnRleHQ/KGwubG9nZ2VyLndhcm4oIkl0IHNlZW1zIHlvdSBhcmUgbmVzdGluZyByZWN1cnNpdmVseSBrZXk6ICIuY29uY2F0KE9bMF0sIiBpbiBrZXk6ICIpLmNvbmNhdChhWzBdKSksbnVsbCk6bC50cmFuc2xhdGUuYXBwbHkobCxPLmNvbmNhdChbYV0pKX0sbykpLG8uaW50ZXJwb2xhdGlvbiYmdGhpcy5pbnRlcnBvbGF0b3IucmVzZXQoKX12YXIgbT1vLnBvc3RQcm9jZXNzfHx0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3MsZD10eXBlb2YgbT09InN0cmluZyI/W21dOm07cmV0dXJuIGUhPW51bGwmJmQmJmQubGVuZ3RoJiZvLmFwcGx5UG9zdFByb2Nlc3NvciE9PSExJiYoZT1MZS5oYW5kbGUoZCxlLGEsdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ/dyh7aTE4blJlc29sdmVkOnV9LG8pOm8sdGhpcykpLGV9fSx7a2V5OiJyZXNvbHZlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LHUscyxsLGYsYztyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciJiYoZT1bZV0pLGUuZm9yRWFjaChmdW5jdGlvbihnKXtpZighYS5pc1ZhbGlkTG9va3VwKHUpKXt2YXIgcD1hLmV4dHJhY3RGcm9tS2V5KGcsbyksdj1wLmtleTtzPXY7dmFyIHk9cC5uYW1lc3BhY2VzO2Eub3B0aW9ucy5mYWxsYmFja05TJiYoeT15LmNvbmNhdChhLm9wdGlvbnMuZmFsbGJhY2tOUykpO3ZhciBtPW8uY291bnQhPT12b2lkIDAmJnR5cGVvZiBvLmNvdW50IT0ic3RyaW5nIixkPW0mJiFvLm9yZGluYWwmJm8uY291bnQ9PT0wJiZhLnBsdXJhbFJlc29sdmVyLnNob3VsZFVzZUludGxBcGkoKSxoPW8uY29udGV4dCE9PXZvaWQgMCYmKHR5cGVvZiBvLmNvbnRleHQ9PSJzdHJpbmcifHx0eXBlb2Ygby5jb250ZXh0PT0ibnVtYmVyIikmJm8uY29udGV4dCE9PSIiLE89by5sbmdzP28ubG5nczphLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KG8ubG5nfHxhLmxhbmd1YWdlLG8uZmFsbGJhY2tMbmcpO3kuZm9yRWFjaChmdW5jdGlvbihiKXthLmlzVmFsaWRMb29rdXAodSl8fChjPWIsIVJlWyIiLmNvbmNhdChPWzBdLCItIikuY29uY2F0KGIpXSYmYS51dGlscyYmYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiFhLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShjKSYmKFJlWyIiLmNvbmNhdChPWzBdLCItIikuY29uY2F0KGIpXT0hMCxhLmxvZ2dlci53YXJuKCdrZXkgIicuY29uY2F0KHMsJyIgZm9yIGxhbmd1YWdlcyAiJykuY29uY2F0KE8uam9pbigiLCAiKSxgIiB3b24ndCBnZXQgcmVzb2x2ZWQgYXMgbmFtZXNwYWNlICJgKS5jb25jYXQoYywnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIikpLE8uZm9yRWFjaChmdW5jdGlvbih4KXtpZighYS5pc1ZhbGlkTG9va3VwKHUpKXtmPXg7dmFyIEM9W3ZdO2lmKGEuaTE4bkZvcm1hdCYmYS5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMpYS5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMoQyx2LHgsYixvKTtlbHNle3ZhciBNO20mJihNPWEucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KHgsby5jb3VudCxvKSk7dmFyIFk9IiIuY29uY2F0KGEub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsInplcm8iKTtpZihtJiYoQy5wdXNoKHYrTSksZCYmQy5wdXNoKHYrWSkpLGgpe3ZhciBKPSIiLmNvbmNhdCh2KS5jb25jYXQoYS5vcHRpb25zLmNvbnRleHRTZXBhcmF0b3IpLmNvbmNhdChvLmNvbnRleHQpO0MucHVzaChKKSxtJiYoQy5wdXNoKEorTSksZCYmQy5wdXNoKEorWSkpfX1mb3IodmFyICQ7JD1DLnBvcCgpOylhLmlzVmFsaWRMb29rdXAodSl8fChsPSQsdT1hLmdldFJlc291cmNlKHgsYiwkLG8pKX19KSl9KX19KSx7cmVzOnUsdXNlZEtleTpzLGV4YWN0VXNlZEtleTpsLHVzZWRMbmc6Zix1c2VkTlM6Y319fSx7a2V5OiJpc1ZhbGlkTG9va3VwIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZSE9PXZvaWQgMCYmISghdGhpcy5vcHRpb25zLnJldHVybk51bGwmJmU9PT1udWxsKSYmISghdGhpcy5vcHRpb25zLnJldHVybkVtcHR5U3RyaW5nJiZlPT09IiIpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgdT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106e307cmV0dXJuIHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlP3RoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZShlLGEsbyx1KTp0aGlzLnJlc291cmNlU3RvcmUuZ2V0UmVzb3VyY2UoZSxhLG8sdSl9fV0sW3trZXk6Imhhc0RlZmF1bHRWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9ImRlZmF1bHRWYWx1ZSI7Zm9yKHZhciBvIGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJmE9PT1vLnN1YnN0cmluZygwLGEubGVuZ3RoKSYmZVtvXSE9PXZvaWQgMClyZXR1cm4hMDtyZXR1cm4hMX19XSksdH0oXyk7ZnVuY3Rpb24gdWUoaSl7cmV0dXJuIGkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkraS5zbGljZSgxKX12YXIgZnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHIpe2sodGhpcyxpKSx0aGlzLm9wdGlvbnM9cix0aGlzLnN1cHBvcnRlZExuZ3M9dGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3N8fCExLHRoaXMubG9nZ2VyPU4uY3JlYXRlKCJsYW5ndWFnZVV0aWxzIil9cmV0dXJuIFIoaSxbe2tleToiZ2V0U2NyaXB0UGFydEZyb21Db2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dC5pbmRleE9mKCItIik8MClyZXR1cm4gbnVsbDt2YXIgbj10LnNwbGl0KCItIik7cmV0dXJuIG4ubGVuZ3RoPT09Mnx8KG4ucG9wKCksbltuLmxlbmd0aC0xXS50b0xvd2VyQ2FzZSgpPT09IngiKT9udWxsOnRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKG4uam9pbigiLSIpKX19LHtrZXk6ImdldExhbmd1YWdlUGFydEZyb21Db2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dC5pbmRleE9mKCItIik8MClyZXR1cm4gdDt2YXIgbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKG5bMF0pfX0se2tleToiZm9ybWF0TGFuZ3VhZ2VDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0eXBlb2YgdD09InN0cmluZyImJnQuaW5kZXhPZigiLSIpPi0xKXt2YXIgbj1bImhhbnMiLCJoYW50IiwibGF0biIsImN5cmwiLCJjYW5zIiwibW9uZyIsImFyYWIiXSxlPXQuc3BsaXQoIi0iKTtyZXR1cm4gdGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz9lPWUubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLnRvTG93ZXJDYXNlKCl9KTplLmxlbmd0aD09PTI/KGVbMF09ZVswXS50b0xvd2VyQ2FzZSgpLGVbMV09ZVsxXS50b1VwcGVyQ2FzZSgpLG4uaW5kZXhPZihlWzFdLnRvTG93ZXJDYXNlKCkpPi0xJiYoZVsxXT11ZShlWzFdLnRvTG93ZXJDYXNlKCkpKSk6ZS5sZW5ndGg9PT0zJiYoZVswXT1lWzBdLnRvTG93ZXJDYXNlKCksZVsxXS5sZW5ndGg9PT0yJiYoZVsxXT1lWzFdLnRvVXBwZXJDYXNlKCkpLGVbMF0hPT0ic2duIiYmZVsyXS5sZW5ndGg9PT0yJiYoZVsyXT1lWzJdLnRvVXBwZXJDYXNlKCkpLG4uaW5kZXhPZihlWzFdLnRvTG93ZXJDYXNlKCkpPi0xJiYoZVsxXT11ZShlWzFdLnRvTG93ZXJDYXNlKCkpKSxuLmluZGV4T2YoZVsyXS50b0xvd2VyQ2FzZSgpKT4tMSYmKGVbMl09dWUoZVsyXS50b0xvd2VyQ2FzZSgpKSkpLGUuam9pbigiLSIpfXJldHVybiB0aGlzLm9wdGlvbnMuY2xlYW5Db2RlfHx0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nP3QudG9Mb3dlckNhc2UoKTp0fX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4odGhpcy5vcHRpb25zLmxvYWQ9PT0ibGFuZ3VhZ2VPbmx5Inx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcztpZighdClyZXR1cm4gbnVsbDt2YXIgZTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKCFlKXt2YXIgbz1uLmZvcm1hdExhbmd1YWdlQ29kZShhKTsoIW4ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHxuLmlzU3VwcG9ydGVkQ29kZShvKSkmJihlPW8pfX0pLCFlJiZ0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmdC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKCFlKXt2YXIgbz1uLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGEpO2lmKG4uaXNTdXBwb3J0ZWRDb2RlKG8pKXJldHVybiBlPW87ZT1uLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKGZ1bmN0aW9uKHUpe2lmKHUuaW5kZXhPZihvKT09PTApcmV0dXJuIHV9KX19KSxlfHwoZT10aGlzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKVswXSksZX19LHtrZXk6ImdldEZhbGxiYWNrQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQsbil7aWYoIXQpcmV0dXJuW107aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiImJih0PXQobikpLHR5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9W3RdKSxPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KHQpPT09IltvYmplY3QgQXJyYXldIilyZXR1cm4gdDtpZighbilyZXR1cm4gdC5kZWZhdWx0fHxbXTt2YXIgZT10W25dO3JldHVybiBlfHwoZT10W3RoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKG4pXSksZXx8KGU9dFt0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShuKV0pLGV8fChlPXRbdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShuKV0pLGV8fChlPXQuZGVmYXVsdCksZXx8W119fSx7a2V5OiJ0b1Jlc29sdmVIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcyxhPXRoaXMuZ2V0RmFsbGJhY2tDb2RlcyhufHx0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmd8fFtdLHQpLG89W10sdT1mdW5jdGlvbihsKXtsJiYoZS5pc1N1cHBvcnRlZENvZGUobCk/by5wdXNoKGwpOmUubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdChsKSkpfTtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciJiZ0LmluZGV4T2YoIi0iKT4tMT8odGhpcy5vcHRpb25zLmxvYWQhPT0ibGFuZ3VhZ2VPbmx5IiYmdSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZSh0KSksdGhpcy5vcHRpb25zLmxvYWQhPT0ibGFuZ3VhZ2VPbmx5IiYmdGhpcy5vcHRpb25zLmxvYWQhPT0iY3VycmVudE9ubHkiJiZ1KHRoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKHQpKSx0aGlzLm9wdGlvbnMubG9hZCE9PSJjdXJyZW50T25seSImJnUodGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KSkpOnR5cGVvZiB0PT0ic3RyaW5nIiYmdSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZSh0KSksYS5mb3JFYWNoKGZ1bmN0aW9uKHMpe28uaW5kZXhPZihzKTwwJiZ1KGUuZm9ybWF0TGFuZ3VhZ2VDb2RlKHMpKX0pLG99fV0pLGl9KCksbHQ9W3tsbmdzOlsiYWNoIiwiYWsiLCJhbSIsImFybiIsImJyIiwiZmlsIiwiZ3VuIiwibG4iLCJtZmUiLCJtZyIsIm1pIiwib2MiLCJwdCIsInB0LUJSIiwidGciLCJ0bCIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtrIiwia24iLCJrdSIsImxiIiwibWFpIiwibWwiLCJtbiIsIm1yIiwibmFoIiwibmFwIiwibmIiLCJuZSIsIm5sIiwibm4iLCJubyIsIm5zbyIsInBhIiwicGFwIiwicG1zIiwicHMiLCJwdC1QVCIsInJtIiwic2NvIiwic2UiLCJzaSIsInNvIiwic29uIiwic3EiLCJzdiIsInN3IiwidGEiLCJ0ZSIsInRrIiwidXIiLCJ5byJdLG5yOlsxLDJdLGZjOjJ9LHtsbmdzOlsiYXkiLCJibyIsImNnZyIsImZhIiwiaHQiLCJpZCIsImphIiwiamJvIiwia2EiLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sY3Q9ezE6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPjEpfSwyOmZ1bmN0aW9uKHIpe3JldHVybiBOdW1iZXIociE9MSl9LDM6ZnVuY3Rpb24ocil7cmV0dXJuIDB9LDQ6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyJTEwPT0xJiZyJTEwMCE9MTE/MDpyJTEwPj0yJiZyJTEwPD00JiYociUxMDA8MTB8fHIlMTAwPj0yMCk/MToyKX0sNTpmdW5jdGlvbihyKXtyZXR1cm4gTnVtYmVyKHI9PTA/MDpyPT0xPzE6cj09Mj8yOnIlMTAwPj0zJiZyJTEwMDw9MTA/MzpyJTEwMD49MTE/NDo1KX0sNjpmdW5jdGlvbihyKXtyZXR1cm4gTnVtYmVyKHI9PTE/MDpyPj0yJiZyPD00PzE6Mil9LDc6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0xPzA6ciUxMD49MiYmciUxMDw9NCYmKHIlMTAwPDEwfHxyJTEwMD49MjApPzE6Mil9LDg6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0xPzA6cj09Mj8xOnIhPTgmJnIhPTExPzI6Myl9LDk6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPj0yKX0sMTA6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0xPzA6cj09Mj8xOnI8Nz8yOnI8MTE/Mzo0KX0sMTE6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0xfHxyPT0xMT8wOnI9PTJ8fHI9PTEyPzE6cj4yJiZyPDIwPzI6Myl9LDEyOmZ1bmN0aW9uKHIpe3JldHVybiBOdW1iZXIociUxMCE9MXx8ciUxMDA9PTExKX0sMTM6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyIT09MCl9LDE0OmZ1bmN0aW9uKHIpe3JldHVybiBOdW1iZXIocj09MT8wOnI9PTI/MTpyPT0zPzI6Myl9LDE1OmZ1bmN0aW9uKHIpe3JldHVybiBOdW1iZXIociUxMD09MSYmciUxMDAhPTExPzA6ciUxMD49MiYmKHIlMTAwPDEwfHxyJTEwMD49MjApPzE6Mil9LDE2OmZ1bmN0aW9uKHIpe3JldHVybiBOdW1iZXIociUxMD09MSYmciUxMDAhPTExPzA6ciE9PTA/MToyKX0sMTc6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0xfHxyJTEwPT0xJiZyJTEwMCE9MTE/MDoxKX0sMTg6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0wPzA6cj09MT8xOjIpfSwxOTpmdW5jdGlvbihyKXtyZXR1cm4gTnVtYmVyKHI9PTE/MDpyPT0wfHxyJTEwMD4xJiZyJTEwMDwxMT8xOnIlMTAwPjEwJiZyJTEwMDwyMD8yOjMpfSwyMDpmdW5jdGlvbihyKXtyZXR1cm4gTnVtYmVyKHI9PTE/MDpyPT0wfHxyJTEwMD4wJiZyJTEwMDwyMD8xOjIpfSwyMTpmdW5jdGlvbihyKXtyZXR1cm4gTnVtYmVyKHIlMTAwPT0xPzE6ciUxMDA9PTI/MjpyJTEwMD09M3x8ciUxMDA9PTQ/MzowKX0sMjI6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0xPzA6cj09Mj8xOihyPDB8fHI+MTApJiZyJTEwPT0wPzI6Myl9fSxndD1bInYxIiwidjIiLCJ2MyJdLE5lPXt6ZXJvOjAsb25lOjEsdHdvOjIsZmV3OjMsbWFueTo0LG90aGVyOjV9O2Z1bmN0aW9uIHB0KCl7dmFyIGk9e307cmV0dXJuIGx0LmZvckVhY2goZnVuY3Rpb24ocil7ci5sbmdzLmZvckVhY2goZnVuY3Rpb24odCl7aVt0XT17bnVtYmVyczpyLm5yLHBsdXJhbHM6Y3Rbci5mY119fSl9KSxpfXZhciBkdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGkocil7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O2sodGhpcyxpKSx0aGlzLmxhbmd1YWdlVXRpbHM9cix0aGlzLm9wdGlvbnM9dCx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgicGx1cmFsUmVzb2x2ZXIiKSwoIXRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTnx8dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPT09InY0IikmJih0eXBlb2YgSW50bD4idSJ8fCFJbnRsLlBsdXJhbFJ1bGVzKSYmKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj0idjMiLHRoaXMubG9nZ2VyLmVycm9yKCJZb3VyIGVudmlyb25tZW50IHNlZW1zIG5vdCB0byBiZSBJbnRsIEFQSSBjb21wYXRpYmxlLCB1c2UgYW4gSW50bC5QbHVyYWxSdWxlcyBwb2x5ZmlsbC4gV2lsbCBmYWxsYmFjayB0byB0aGUgY29tcGF0aWJpbGl0eUpTT04gdjMgZm9ybWF0IGhhbmRsaW5nLiIpKSx0aGlzLnJ1bGVzPXB0KCl9cmV0dXJuIFIoaSxbe2tleToiYWRkUnVsZSIsdmFsdWU6ZnVuY3Rpb24odCxuKXt0aGlzLnJ1bGVzW3RdPW59fSx7a2V5OiJnZXRSdWxlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e307aWYodGhpcy5zaG91bGRVc2VJbnRsQXBpKCkpdHJ5e3JldHVybiBuZXcgSW50bC5QbHVyYWxSdWxlcyh0LHt0eXBlOm4ub3JkaW5hbD8ib3JkaW5hbCI6ImNhcmRpbmFsIn0pfWNhdGNoe3JldHVybn1yZXR1cm4gdGhpcy5ydWxlc1t0XXx8dGhpcy5ydWxlc1t0aGlzLmxhbmd1YWdlVXRpbHMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCldfX0se2tleToibmVlZHNQbHVyYWwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxlPXRoaXMuZ2V0UnVsZSh0LG4pO3JldHVybiB0aGlzLnNob3VsZFVzZUludGxBcGkoKT9lJiZlLnJlc29sdmVkT3B0aW9ucygpLnBsdXJhbENhdGVnb3JpZXMubGVuZ3RoPjE6ZSYmZS5udW1iZXJzLmxlbmd0aD4xfX0se2tleToiZ2V0UGx1cmFsRm9ybXNPZktleSIsdmFsdWU6ZnVuY3Rpb24odCxuKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e307cmV0dXJuIHRoaXMuZ2V0U3VmZml4ZXModCxlKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIiIuY29uY2F0KG4pLmNvbmNhdChhKX0pfX0se2tleToiZ2V0U3VmZml4ZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30sYT10aGlzLmdldFJ1bGUodCxlKTtyZXR1cm4gYT90aGlzLnNob3VsZFVzZUludGxBcGkoKT9hLnJlc29sdmVkT3B0aW9ucygpLnBsdXJhbENhdGVnb3JpZXMuc29ydChmdW5jdGlvbihvLHUpe3JldHVybiBOZVtvXS1OZVt1XX0pLm1hcChmdW5jdGlvbihvKXtyZXR1cm4iIi5jb25jYXQobi5vcHRpb25zLnByZXBlbmQpLmNvbmNhdChvKX0pOmEubnVtYmVycy5tYXAoZnVuY3Rpb24obyl7cmV0dXJuIG4uZ2V0U3VmZml4KHQsbyxlKX0pOltdfX0se2tleToiZ2V0U3VmZml4Iix2YWx1ZTpmdW5jdGlvbih0LG4pe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp7fSxhPXRoaXMuZ2V0UnVsZSh0LGUpO3JldHVybiBhP3RoaXMuc2hvdWxkVXNlSW50bEFwaSgpPyIiLmNvbmNhdCh0aGlzLm9wdGlvbnMucHJlcGVuZCkuY29uY2F0KGEuc2VsZWN0KG4pKTp0aGlzLmdldFN1ZmZpeFJldHJvQ29tcGF0aWJsZShhLG4pOih0aGlzLmxvZ2dlci53YXJuKCJubyBwbHVyYWwgcnVsZSBmb3VuZCBmb3I6ICIuY29uY2F0KHQpKSwiIil9fSx7a2V5OiJnZXRTdWZmaXhSZXRyb0NvbXBhdGlibGUiLHZhbHVlOmZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcyxhPXQubm9BYnM/dC5wbHVyYWxzKG4pOnQucGx1cmFscyhNYXRoLmFicyhuKSksbz10Lm51bWJlcnNbYV07dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4JiZ0Lm51bWJlcnMubGVuZ3RoPT09MiYmdC5udW1iZXJzWzBdPT09MSYmKG89PT0yP289InBsdXJhbCI6bz09PTEmJihvPSIiKSk7dmFyIHU9ZnVuY3Rpb24oKXtyZXR1cm4gZS5vcHRpb25zLnByZXBlbmQmJm8udG9TdHJpbmcoKT9lLm9wdGlvbnMucHJlcGVuZCtvLnRvU3RyaW5nKCk6by50b1N0cmluZygpfTtyZXR1cm4gdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPT09InYxIj9vPT09MT8iIjp0eXBlb2Ygbz09Im51bWJlciI/Il9wbHVyYWxfIi5jb25jYXQoby50b1N0cmluZygpKTp1KCk6dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPT09InYyInx8dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4JiZ0Lm51bWJlcnMubGVuZ3RoPT09MiYmdC5udW1iZXJzWzBdPT09MT91KCk6dGhpcy5vcHRpb25zLnByZXBlbmQmJmEudG9TdHJpbmcoKT90aGlzLm9wdGlvbnMucHJlcGVuZCthLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfX0se2tleToic2hvdWxkVXNlSW50bEFwaSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hZ3QuaW5jbHVkZXModGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKX19XSksaX0oKTtmdW5jdGlvbiBEZShpLHIpe3ZhciB0PU9iamVjdC5rZXlzKGkpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaSk7ciYmKG49bi5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKS5lbnVtZXJhYmxlfSkpLHQucHVzaC5hcHBseSh0LG4pfXJldHVybiB0fWZ1bmN0aW9uIEwoaSl7Zm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl7dmFyIHQ9YXJndW1lbnRzW3JdIT1udWxsP2FyZ3VtZW50c1tyXTp7fTtyJTI/RGUoT2JqZWN0KHQpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe0YoaSxuLHRbbl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSk6RGUoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLG4sT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pKX0pfXJldHVybiBpfXZhciBodD1mdW5jdGlvbigpe2Z1bmN0aW9uIGkoKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e307ayh0aGlzLGkpLHRoaXMubG9nZ2VyPU4uY3JlYXRlKCJpbnRlcnBvbGF0b3IiKSx0aGlzLm9wdGlvbnM9cix0aGlzLmZvcm1hdD1yLmludGVycG9sYXRpb24mJnIuaW50ZXJwb2xhdGlvbi5mb3JtYXR8fGZ1bmN0aW9uKHQpe3JldHVybiB0fSx0aGlzLmluaXQocil9cmV0dXJuIFIoaSxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e307dC5pbnRlcnBvbGF0aW9ufHwodC5pbnRlcnBvbGF0aW9uPXtlc2NhcGVWYWx1ZTohMH0pO3ZhciBuPXQuaW50ZXJwb2xhdGlvbjt0aGlzLmVzY2FwZT1uLmVzY2FwZSE9PXZvaWQgMD9uLmVzY2FwZTp0dCx0aGlzLmVzY2FwZVZhbHVlPW4uZXNjYXBlVmFsdWUhPT12b2lkIDA/bi5lc2NhcGVWYWx1ZTohMCx0aGlzLnVzZVJhd1ZhbHVlVG9Fc2NhcGU9bi51c2VSYXdWYWx1ZVRvRXNjYXBlIT09dm9pZCAwP24udXNlUmF3VmFsdWVUb0VzY2FwZTohMSx0aGlzLnByZWZpeD1uLnByZWZpeD9BKG4ucHJlZml4KTpuLnByZWZpeEVzY2FwZWR8fCJ7eyIsdGhpcy5zdWZmaXg9bi5zdWZmaXg/QShuLnN1ZmZpeCk6bi5zdWZmaXhFc2NhcGVkfHwifX0iLHRoaXMuZm9ybWF0U2VwYXJhdG9yPW4uZm9ybWF0U2VwYXJhdG9yP24uZm9ybWF0U2VwYXJhdG9yOm4uZm9ybWF0U2VwYXJhdG9yfHwiLCIsdGhpcy51bmVzY2FwZVByZWZpeD1uLnVuZXNjYXBlU3VmZml4PyIiOm4udW5lc2NhcGVQcmVmaXh8fCItIix0aGlzLnVuZXNjYXBlU3VmZml4PXRoaXMudW5lc2NhcGVQcmVmaXg/IiI6bi51bmVzY2FwZVN1ZmZpeHx8IiIsdGhpcy5uZXN0aW5nUHJlZml4PW4ubmVzdGluZ1ByZWZpeD9BKG4ubmVzdGluZ1ByZWZpeCk6bi5uZXN0aW5nUHJlZml4RXNjYXBlZHx8QSgiJHQoIiksdGhpcy5uZXN0aW5nU3VmZml4PW4ubmVzdGluZ1N1ZmZpeD9BKG4ubmVzdGluZ1N1ZmZpeCk6bi5uZXN0aW5nU3VmZml4RXNjYXBlZHx8QSgiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9bi5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9uLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOm4ubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPW4ubWF4UmVwbGFjZXM/bi5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9bi5hbHdheXNGb3JtYXQhPT12b2lkIDA/bi5hbHdheXNGb3JtYXQ6ITEsdGhpcy5yZXNldFJlZ0V4cCgpfX0se2tleToicmVzZXQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zJiZ0aGlzLmluaXQodGhpcy5vcHRpb25zKX19LHtrZXk6InJlc2V0UmVnRXhwIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PSIiLmNvbmNhdCh0aGlzLnByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwPW5ldyBSZWdFeHAodCwiZyIpO3ZhciBuPSIiLmNvbmNhdCh0aGlzLnByZWZpeCkuY29uY2F0KHRoaXMudW5lc2NhcGVQcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMudW5lc2NhcGVTdWZmaXgpLmNvbmNhdCh0aGlzLnN1ZmZpeCk7dGhpcy5yZWdleHBVbmVzY2FwZT1uZXcgUmVnRXhwKG4sImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5uZXN0aW5nUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLm5lc3RpbmdTdWZmaXgpO3RoaXMubmVzdGluZ1JlZ2V4cD1uZXcgUmVnRXhwKGUsImciKX19LHtrZXk6ImludGVycG9sYXRlIix2YWx1ZTpmdW5jdGlvbih0LG4sZSxhKXt2YXIgbz10aGlzLHUscyxsLGY9dGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlc3x8e307ZnVuY3Rpb24gYyhtKXtyZXR1cm4gbS5yZXBsYWNlKC9cJC9nLCIkJCQkIil9dmFyIGc9ZnVuY3Rpb24oZCl7aWYoZC5pbmRleE9mKG8uZm9ybWF0U2VwYXJhdG9yKTwwKXt2YXIgaD13ZShuLGYsZCk7cmV0dXJuIG8uYWx3YXlzRm9ybWF0P28uZm9ybWF0KGgsdm9pZCAwLGUsTChMKEwoe30sYSksbikse30se2ludGVycG9sYXRpb25rZXk6ZH0pKTpofXZhciBPPWQuc3BsaXQoby5mb3JtYXRTZXBhcmF0b3IpLGI9Ty5zaGlmdCgpLnRyaW0oKSx4PU8uam9pbihvLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBvLmZvcm1hdCh3ZShuLGYsYikseCxlLEwoTChMKHt9LGEpLG4pLHt9LHtpbnRlcnBvbGF0aW9ua2V5OmJ9KSl9O3RoaXMucmVzZXRSZWdFeHAoKTt2YXIgcD1hJiZhLm1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcnx8dGhpcy5vcHRpb25zLm1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcix2PWEmJmEuaW50ZXJwb2xhdGlvbiYmYS5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyE9PXZvaWQgMD9hLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzOnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyx5PVt7cmVnZXg6dGhpcy5yZWdleHBVbmVzY2FwZSxzYWZlVmFsdWU6ZnVuY3Rpb24oZCl7cmV0dXJuIGMoZCl9fSx7cmVnZXg6dGhpcy5yZWdleHAsc2FmZVZhbHVlOmZ1bmN0aW9uKGQpe3JldHVybiBvLmVzY2FwZVZhbHVlP2Moby5lc2NhcGUoZCkpOmMoZCl9fV07cmV0dXJuIHkuZm9yRWFjaChmdW5jdGlvbihtKXtmb3IobD0wO3U9bS5yZWdleC5leGVjKHQpOyl7dmFyIGQ9dVsxXS50cmltKCk7aWYocz1nKGQpLHM9PT12b2lkIDApaWYodHlwZW9mIHA9PSJmdW5jdGlvbiIpe3ZhciBoPXAodCx1LGEpO3M9dHlwZW9mIGg9PSJzdHJpbmciP2g6IiJ9ZWxzZSBpZihhJiZhLmhhc093blByb3BlcnR5KGQpKXM9IiI7ZWxzZSBpZih2KXtzPXVbMF07Y29udGludWV9ZWxzZSBvLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSAiLmNvbmNhdChkLCIgZm9yIGludGVycG9sYXRpbmcgIikuY29uY2F0KHQpKSxzPSIiO2Vsc2UgdHlwZW9mIHMhPSJzdHJpbmciJiYhby51c2VSYXdWYWx1ZVRvRXNjYXBlJiYocz1iZShzKSk7dmFyIE89bS5zYWZlVmFsdWUocyk7aWYodD10LnJlcGxhY2UodVswXSxPKSx2PyhtLnJlZ2V4Lmxhc3RJbmRleCs9cy5sZW5ndGgsbS5yZWdleC5sYXN0SW5kZXgtPXVbMF0ubGVuZ3RoKTptLnJlZ2V4Lmxhc3RJbmRleD0wLGwrKyxsPj1vLm1heFJlcGxhY2VzKWJyZWFrfX0pLHR9fSx7a2V5OiJuZXN0Iix2YWx1ZTpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMsYT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sbyx1LHM9TCh7fSxhKTtzLmFwcGx5UG9zdFByb2Nlc3Nvcj0hMSxkZWxldGUgcy5kZWZhdWx0VmFsdWU7ZnVuY3Rpb24gbChwLHYpe3ZhciB5PXRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I7aWYocC5pbmRleE9mKHkpPDApcmV0dXJuIHA7dmFyIG09cC5zcGxpdChuZXcgUmVnRXhwKCIiLmNvbmNhdCh5LCJbIF0qeyIpKSksZD0ieyIuY29uY2F0KG1bMV0pO3A9bVswXSxkPXRoaXMuaW50ZXJwb2xhdGUoZCxzKTt2YXIgaD1kLm1hdGNoKC8nL2cpLE89ZC5tYXRjaCgvIi9nKTsoaCYmaC5sZW5ndGglMj09PTAmJiFPfHxPLmxlbmd0aCUyIT09MCkmJihkPWQucmVwbGFjZSgvJy9nLCciJykpO3RyeXtzPUpTT04ucGFyc2UoZCksdiYmKHM9TChMKHt9LHYpLHMpKX1jYXRjaChiKXtyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5ICIuY29uY2F0KHApLGIpLCIiLmNvbmNhdChwKS5jb25jYXQoeSkuY29uY2F0KGQpfXJldHVybiBkZWxldGUgcy5kZWZhdWx0VmFsdWUscH1mb3IoO289dGhpcy5uZXN0aW5nUmVnZXhwLmV4ZWModCk7KXt2YXIgZj1bXSxjPSExO2lmKG9bMF0uaW5kZXhPZih0aGlzLmZvcm1hdFNlcGFyYXRvcikhPT0tMSYmIS97Lip9Ly50ZXN0KG9bMV0pKXt2YXIgZz1vWzFdLnNwbGl0KHRoaXMuZm9ybWF0U2VwYXJhdG9yKS5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIHAudHJpbSgpfSk7b1sxXT1nLnNoaWZ0KCksZj1nLGM9ITB9aWYodT1uKGwuY2FsbCh0aGlzLG9bMV0udHJpbSgpLHMpLHMpLHUmJm9bMF09PT10JiZ0eXBlb2YgdSE9InN0cmluZyIpcmV0dXJuIHU7dHlwZW9mIHUhPSJzdHJpbmciJiYodT1iZSh1KSksdXx8KHRoaXMubG9nZ2VyLndhcm4oIm1pc3NlZCB0byByZXNvbHZlICIuY29uY2F0KG9bMV0sIiBmb3IgbmVzdGluZyAiKS5jb25jYXQodCkpLHU9IiIpLGMmJih1PWYucmVkdWNlKGZ1bmN0aW9uKHAsdil7cmV0dXJuIGUuZm9ybWF0KHAsdixhLmxuZyxMKEwoe30sYSkse30se2ludGVycG9sYXRpb25rZXk6b1sxXS50cmltKCl9KSl9LHUudHJpbSgpKSksdD10LnJlcGxhY2Uob1swXSx1KSx0aGlzLnJlZ2V4cC5sYXN0SW5kZXg9MH1yZXR1cm4gdH19XSksaX0oKTtmdW5jdGlvbiBDZShpLHIpe3ZhciB0PU9iamVjdC5rZXlzKGkpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaSk7ciYmKG49bi5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKS5lbnVtZXJhYmxlfSkpLHQucHVzaC5hcHBseSh0LG4pfXJldHVybiB0fWZ1bmN0aW9uIEkoaSl7Zm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl7dmFyIHQ9YXJndW1lbnRzW3JdIT1udWxsP2FyZ3VtZW50c1tyXTp7fTtyJTI/Q2UoT2JqZWN0KHQpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe0YoaSxuLHRbbl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSk6Q2UoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLG4sT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pKX0pfXJldHVybiBpfWZ1bmN0aW9uIHZ0KGkpe3ZhciByPWkudG9Mb3dlckNhc2UoKS50cmltKCksdD17fTtpZihpLmluZGV4T2YoIigiKT4tMSl7dmFyIG49aS5zcGxpdCgiKCIpO3I9blswXS50b0xvd2VyQ2FzZSgpLnRyaW0oKTt2YXIgZT1uWzFdLnN1YnN0cmluZygwLG5bMV0ubGVuZ3RoLTEpO2lmKHI9PT0iY3VycmVuY3kiJiZlLmluZGV4T2YoIjoiKTwwKXQuY3VycmVuY3l8fCh0LmN1cnJlbmN5PWUudHJpbSgpKTtlbHNlIGlmKHI9PT0icmVsYXRpdmV0aW1lIiYmZS5pbmRleE9mKCI6Iik8MCl0LnJhbmdlfHwodC5yYW5nZT1lLnRyaW0oKSk7ZWxzZXt2YXIgYT1lLnNwbGl0KCI7Iik7YS5mb3JFYWNoKGZ1bmN0aW9uKG8pe2lmKG8pe3ZhciB1PW8uc3BsaXQoIjoiKSxzPVFlKHUpLGw9c1swXSxmPXMuc2xpY2UoMSksYz1mLmpvaW4oIjoiKS50cmltKCkucmVwbGFjZSgvXicrfCcrJC9nLCIiKTt0W2wudHJpbSgpXXx8KHRbbC50cmltKCldPWMpLGM9PT0iZmFsc2UiJiYodFtsLnRyaW0oKV09ITEpLGM9PT0idHJ1ZSImJih0W2wudHJpbSgpXT0hMCksaXNOYU4oYyl8fCh0W2wudHJpbSgpXT1wYXJzZUludChjLDEwKSl9fSl9fXJldHVybntmb3JtYXROYW1lOnIsZm9ybWF0T3B0aW9uczp0fX1mdW5jdGlvbiBWKGkpe3ZhciByPXt9O3JldHVybiBmdW5jdGlvbihuLGUsYSl7dmFyIG89ZStKU09OLnN0cmluZ2lmeShhKSx1PXJbb107cmV0dXJuIHV8fCh1PWkoZSxhKSxyW29dPXUpLHUobil9fXZhciBtdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGkoKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e307ayh0aGlzLGkpLHRoaXMubG9nZ2VyPU4uY3JlYXRlKCJmb3JtYXR0ZXIiKSx0aGlzLm9wdGlvbnM9cix0aGlzLmZvcm1hdHM9e251bWJlcjpWKGZ1bmN0aW9uKHQsbil7dmFyIGU9bmV3IEludGwuTnVtYmVyRm9ybWF0KHQsbik7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBlLmZvcm1hdChhKX19KSxjdXJyZW5jeTpWKGZ1bmN0aW9uKHQsbil7dmFyIGU9bmV3IEludGwuTnVtYmVyRm9ybWF0KHQsSShJKHt9LG4pLHt9LHtzdHlsZToiY3VycmVuY3kifSkpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSl9fSksZGF0ZXRpbWU6VihmdW5jdGlvbih0LG4pe3ZhciBlPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHQsSSh7fSxuKSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBlLmZvcm1hdChhKX19KSxyZWxhdGl2ZXRpbWU6VihmdW5jdGlvbih0LG4pe3ZhciBlPW5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdCh0LEkoe30sbikpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSxuLnJhbmdlfHwiZGF5Iil9fSksbGlzdDpWKGZ1bmN0aW9uKHQsbil7dmFyIGU9bmV3IEludGwuTGlzdEZvcm1hdCh0LEkoe30sbikpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSl9fSl9LHRoaXMuaW5pdChyKX1yZXR1cm4gUihpLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319LGU9bi5pbnRlcnBvbGF0aW9uO3RoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCJ9fSx7a2V5OiJhZGQiLHZhbHVlOmZ1bmN0aW9uKHQsbil7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPW59fSx7a2V5OiJhZGRDYWNoZWQiLHZhbHVlOmZ1bmN0aW9uKHQsbil7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPVYobil9fSx7a2V5OiJmb3JtYXQiLHZhbHVlOmZ1bmN0aW9uKHQsbixlLGEpe3ZhciBvPXRoaXMsdT1uLnNwbGl0KHRoaXMuZm9ybWF0U2VwYXJhdG9yKSxzPXUucmVkdWNlKGZ1bmN0aW9uKGwsZil7dmFyIGM9dnQoZiksZz1jLmZvcm1hdE5hbWUscD1jLmZvcm1hdE9wdGlvbnM7aWYoby5mb3JtYXRzW2ddKXt2YXIgdj1sO3RyeXt2YXIgeT1hJiZhLmZvcm1hdFBhcmFtcyYmYS5mb3JtYXRQYXJhbXNbYS5pbnRlcnBvbGF0aW9ua2V5XXx8e30sbT15LmxvY2FsZXx8eS5sbmd8fGEubG9jYWxlfHxhLmxuZ3x8ZTt2PW8uZm9ybWF0c1tnXShsLG0sSShJKEkoe30scCksYSkseSkpfWNhdGNoKGQpe28ubG9nZ2VyLndhcm4oZCl9cmV0dXJuIHZ9ZWxzZSBvLmxvZ2dlci53YXJuKCJ0aGVyZSB3YXMgbm8gZm9ybWF0IGZ1bmN0aW9uIGZvciAiLmNvbmNhdChnKSk7cmV0dXJuIGx9LHQpO3JldHVybiBzfX1dKSxpfSgpO2Z1bmN0aW9uIEVlKGkscil7dmFyIHQ9T2JqZWN0LmtleXMoaSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhpKTtyJiYobj1uLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLGUpLmVudW1lcmFibGV9KSksdC5wdXNoLmFwcGx5KHQsbil9cmV0dXJuIHR9ZnVuY3Rpb24gRmUoaSl7Zm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl7dmFyIHQ9YXJndW1lbnRzW3JdIT1udWxsP2FyZ3VtZW50c1tyXTp7fTtyJTI/RWUoT2JqZWN0KHQpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe0YoaSxuLHRbbl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSk6RWUoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLG4sT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pKX0pfXJldHVybiBpfWZ1bmN0aW9uIHl0KGkpe3ZhciByPWJ0KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49aihpKSxlO2lmKHIpe3ZhciBhPWoodGhpcykuY29uc3RydWN0b3I7ZT1SZWZsZWN0LmNvbnN0cnVjdChuLGFyZ3VtZW50cyxhKX1lbHNlIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIEIodGhpcyxlKX19ZnVuY3Rpb24gYnQoKXtpZih0eXBlb2YgUmVmbGVjdD4idSJ8fCFSZWZsZWN0LmNvbnN0cnVjdHx8UmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZih0eXBlb2YgUHJveHk9PSJmdW5jdGlvbiIpcmV0dXJuITA7dHJ5e3JldHVybiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbixbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gT3QoaSxyKXtpLnBlbmRpbmdbcl0hPT12b2lkIDAmJihkZWxldGUgaS5wZW5kaW5nW3JdLGkucGVuZGluZ0NvdW50LS0pfXZhciB3dD1mdW5jdGlvbihpKXtxKHQsaSk7dmFyIHI9eXQodCk7ZnVuY3Rpb24gdChuLGUsYSl7dmFyIG8sdT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106e307cmV0dXJuIGsodGhpcyx0KSxvPXIuY2FsbCh0aGlzKSxaJiZfLmNhbGwoRShvKSksby5iYWNrZW5kPW4sby5zdG9yZT1lLG8uc2VydmljZXM9YSxvLmxhbmd1YWdlVXRpbHM9YS5sYW5ndWFnZVV0aWxzLG8ub3B0aW9ucz11LG8ubG9nZ2VyPU4uY3JlYXRlKCJiYWNrZW5kQ29ubmVjdG9yIiksby53YWl0aW5nUmVhZHM9W10sby5tYXhQYXJhbGxlbFJlYWRzPXUubWF4UGFyYWxsZWxSZWFkc3x8MTAsby5yZWFkaW5nQ2FsbHM9MCxvLm1heFJldHJpZXM9dS5tYXhSZXRyaWVzPj0wP3UubWF4UmV0cmllczo1LG8ucmV0cnlUaW1lb3V0PXUucmV0cnlUaW1lb3V0Pj0xP3UucmV0cnlUaW1lb3V0OjM1MCxvLnN0YXRlPXt9LG8ucXVldWU9W10sby5iYWNrZW5kJiZvLmJhY2tlbmQuaW5pdCYmby5iYWNrZW5kLmluaXQoYSx1LmJhY2tlbmQsdSksb31yZXR1cm4gUih0LFt7a2V5OiJxdWV1ZUxvYWQiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvLHUpe3ZhciBzPXRoaXMsbD17fSxmPXt9LGM9e30sZz17fTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKHApe3ZhciB2PSEwO2EuZm9yRWFjaChmdW5jdGlvbih5KXt2YXIgbT0iIi5jb25jYXQocCwifCIpLmNvbmNhdCh5KTshby5yZWxvYWQmJnMuc3RvcmUuaGFzUmVzb3VyY2VCdW5kbGUocCx5KT9zLnN0YXRlW21dPTI6cy5zdGF0ZVttXTwwfHwocy5zdGF0ZVttXT09PTE/ZlttXT09PXZvaWQgMCYmKGZbbV09ITApOihzLnN0YXRlW21dPTEsdj0hMSxmW21dPT09dm9pZCAwJiYoZlttXT0hMCksbFttXT09PXZvaWQgMCYmKGxbbV09ITApLGdbeV09PT12b2lkIDAmJihnW3ldPSEwKSkpfSksdnx8KGNbcF09ITApfSksKE9iamVjdC5rZXlzKGwpLmxlbmd0aHx8T2JqZWN0LmtleXMoZikubGVuZ3RoKSYmdGhpcy5xdWV1ZS5wdXNoKHtwZW5kaW5nOmYscGVuZGluZ0NvdW50Ok9iamVjdC5rZXlzKGYpLmxlbmd0aCxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnV9KSx7dG9Mb2FkOk9iamVjdC5rZXlzKGwpLHBlbmRpbmc6T2JqZWN0LmtleXMoZiksdG9Mb2FkTGFuZ3VhZ2VzOk9iamVjdC5rZXlzKGMpLHRvTG9hZE5hbWVzcGFjZXM6T2JqZWN0LmtleXMoZyl9fX0se2tleToibG9hZGVkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHU9ZS5zcGxpdCgifCIpLHM9dVswXSxsPXVbMV07YSYmdGhpcy5lbWl0KCJmYWlsZWRMb2FkaW5nIixzLGwsYSksbyYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZUJ1bmRsZShzLGwsbyksdGhpcy5zdGF0ZVtlXT1hPy0xOjI7dmFyIGY9e307dGhpcy5xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGMpe1plKGMubG9hZGVkLFtzXSxsKSxPdChjLGUpLGEmJmMuZXJyb3JzLnB1c2goYSksYy5wZW5kaW5nQ291bnQ9PT0wJiYhYy5kb25lJiYoT2JqZWN0LmtleXMoYy5sb2FkZWQpLmZvckVhY2goZnVuY3Rpb24oZyl7ZltnXXx8KGZbZ109e30pO3ZhciBwPWMubG9hZGVkW2ddO3AubGVuZ3RoJiZwLmZvckVhY2goZnVuY3Rpb24odil7ZltnXVt2XT09PXZvaWQgMCYmKGZbZ11bdl09ITApfSl9KSxjLmRvbmU9ITAsYy5lcnJvcnMubGVuZ3RoP2MuY2FsbGJhY2soYy5lcnJvcnMpOmMuY2FsbGJhY2soKSl9KSx0aGlzLmVtaXQoImxvYWRlZCIsZiksdGhpcy5xdWV1ZT10aGlzLnF1ZXVlLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4hYy5kb25lfSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHU9dGhpcyxzPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTowLGw9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOnRoaXMucmV0cnlUaW1lb3V0LGY9YXJndW1lbnRzLmxlbmd0aD41P2FyZ3VtZW50c1s1XTp2b2lkIDA7aWYoIWUubGVuZ3RoKXJldHVybiBmKG51bGwse30pO2lmKHRoaXMucmVhZGluZ0NhbGxzPj10aGlzLm1heFBhcmFsbGVsUmVhZHMpe3RoaXMud2FpdGluZ1JlYWRzLnB1c2goe2xuZzplLG5zOmEsZmNOYW1lOm8sdHJpZWQ6cyx3YWl0OmwsY2FsbGJhY2s6Zn0pO3JldHVybn1yZXR1cm4gdGhpcy5yZWFkaW5nQ2FsbHMrKyx0aGlzLmJhY2tlbmRbb10oZSxhLGZ1bmN0aW9uKGMsZyl7aWYodS5yZWFkaW5nQ2FsbHMtLSx1LndhaXRpbmdSZWFkcy5sZW5ndGg+MCl7dmFyIHA9dS53YWl0aW5nUmVhZHMuc2hpZnQoKTt1LnJlYWQocC5sbmcscC5ucyxwLmZjTmFtZSxwLnRyaWVkLHAud2FpdCxwLmNhbGxiYWNrKX1pZihjJiZnJiZzPHUubWF4UmV0cmllcyl7c2V0VGltZW91dChmdW5jdGlvbigpe3UucmVhZC5jYWxsKHUsZSxhLG8scysxLGwqMixmKX0sbCk7cmV0dXJufWYoYyxnKX0pfX0se2tleToicHJlcGFyZUxvYWRpbmciLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89dGhpcyx1PWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp7fSxzPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwO2lmKCF0aGlzLmJhY2tlbmQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIk5vIGJhY2tlbmQgd2FzIGFkZGVkIHZpYSBpMThuZXh0LnVzZS4gV2lsbCBub3QgbG9hZCByZXNvdXJjZXMuIikscyYmcygpO3R5cGVvZiBlPT0ic3RyaW5nIiYmKGU9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShlKSksdHlwZW9mIGE9PSJzdHJpbmciJiYoYT1bYV0pO3ZhciBsPXRoaXMucXVldWVMb2FkKGUsYSx1LHMpO2lmKCFsLnRvTG9hZC5sZW5ndGgpcmV0dXJuIGwucGVuZGluZy5sZW5ndGh8fHMoKSxudWxsO2wudG9Mb2FkLmZvckVhY2goZnVuY3Rpb24oZil7by5sb2FkT25lKGYpfSl9fSx7a2V5OiJsb2FkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dGhpcy5wcmVwYXJlTG9hZGluZyhlLGEse30sbyl9fSx7a2V5OiJyZWxvYWQiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt0aGlzLnByZXBhcmVMb2FkaW5nKGUsYSx7cmVsb2FkOiEwfSxvKX19LHtrZXk6ImxvYWRPbmUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06IiIsdT1lLnNwbGl0KCJ8Iikscz11WzBdLGw9dVsxXTt0aGlzLnJlYWQocyxsLCJyZWFkIix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKGYsYyl7ZiYmYS5sb2dnZXIud2FybigiIi5jb25jYXQobywibG9hZGluZyBuYW1lc3BhY2UgIikuY29uY2F0KGwsIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KHMsIiBmYWlsZWQiKSxmKSwhZiYmYyYmYS5sb2dnZXIubG9nKCIiLmNvbmNhdChvLCJsb2FkZWQgbmFtZXNwYWNlICIpLmNvbmNhdChsLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChzKSxjKSxhLmxvYWRlZChlLGYsYyl9KX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbihlLGEsbyx1LHMpe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTp7fTtpZih0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGEpKXt0aGlzLmxvZ2dlci53YXJuKCdkaWQgbm90IHNhdmUga2V5ICInLmNvbmNhdChvLCciIGFzIHRoZSBuYW1lc3BhY2UgIicpLmNvbmNhdChhLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKTtyZXR1cm59bz09bnVsbHx8bz09PSIifHwodGhpcy5iYWNrZW5kJiZ0aGlzLmJhY2tlbmQuY3JlYXRlJiZ0aGlzLmJhY2tlbmQuY3JlYXRlKGUsYSxvLHUsbnVsbCxGZShGZSh7fSxsKSx7fSx7aXNVcGRhdGU6c30pKSwhKCFlfHwhZVswXSkmJnRoaXMuc3RvcmUuYWRkUmVzb3VyY2UoZVswXSxhLG8sdSkpfX1dKSx0fShfKTtmdW5jdGlvbiBTdCgpe3JldHVybntkZWJ1ZzohMSxpbml0SW1tZWRpYXRlOiEwLG5zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6WyJ0cmFuc2xhdGlvbiJdLGZhbGxiYWNrTG5nOlsiZGV2Il0sZmFsbGJhY2tOUzohMSxzdXBwb3J0ZWRMbmdzOiExLG5vbkV4cGxpY2l0U3VwcG9ydGVkTG5nczohMSxsb2FkOiJhbGwiLHByZWxvYWQ6ITEsc2ltcGxpZnlQbHVyYWxTdWZmaXg6ITAsa2V5U2VwYXJhdG9yOiIuIixuc1NlcGFyYXRvcjoiOiIscGx1cmFsU2VwYXJhdG9yOiJfIixjb250ZXh0U2VwYXJhdG9yOiJfIixwYXJ0aWFsQnVuZGxlZExhbmd1YWdlczohMSxzYXZlTWlzc2luZzohMSx1cGRhdGVNaXNzaW5nOiExLHNhdmVNaXNzaW5nVG86ImZhbGxiYWNrIixzYXZlTWlzc2luZ1BsdXJhbHM6ITAsbWlzc2luZ0tleUhhbmRsZXI6ITEsbWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyOiExLHBvc3RQcm9jZXNzOiExLHBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkOiExLHJldHVybk51bGw6ITAscmV0dXJuRW1wdHlTdHJpbmc6ITAscmV0dXJuT2JqZWN0czohMSxqb2luQXJyYXlzOiExLHJldHVybmVkT2JqZWN0SGFuZGxlcjohMSxwYXJzZU1pc3NpbmdLZXlIYW5kbGVyOiExLGFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleTohMSxhcHBlbmROYW1lc3BhY2VUb0NJTW9kZTohMSxvdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcjpmdW5jdGlvbihyKXt2YXIgdD17fTtpZihQKHJbMV0pPT09Im9iamVjdCImJih0PXJbMV0pLHR5cGVvZiByWzFdPT0ic3RyaW5nIiYmKHQuZGVmYXVsdFZhbHVlPXJbMV0pLHR5cGVvZiByWzJdPT0ic3RyaW5nIiYmKHQudERlc2NyaXB0aW9uPXJbMl0pLFAoclsyXSk9PT0ib2JqZWN0Inx8UChyWzNdKT09PSJvYmplY3QiKXt2YXIgbj1yWzNdfHxyWzJdO09iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1uW2VdfSl9cmV0dXJuIHR9LGludGVycG9sYXRpb246e2VzY2FwZVZhbHVlOiEwLGZvcm1hdDpmdW5jdGlvbihyLHQsbixlKXtyZXR1cm4gcn0scHJlZml4OiJ7eyIsc3VmZml4OiJ9fSIsZm9ybWF0U2VwYXJhdG9yOiIsIix1bmVzY2FwZVByZWZpeDoiLSIsbmVzdGluZ1ByZWZpeDoiJHQoIixuZXN0aW5nU3VmZml4OiIpIixuZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjoiLCIsbWF4UmVwbGFjZXM6MWUzLHNraXBPblZhcmlhYmxlczohMH19fWZ1bmN0aW9uIF9lKGkpe3JldHVybiB0eXBlb2YgaS5ucz09InN0cmluZyImJihpLm5zPVtpLm5zXSksdHlwZW9mIGkuZmFsbGJhY2tMbmc9PSJzdHJpbmciJiYoaS5mYWxsYmFja0xuZz1baS5mYWxsYmFja0xuZ10pLHR5cGVvZiBpLmZhbGxiYWNrTlM9PSJzdHJpbmciJiYoaS5mYWxsYmFja05TPVtpLmZhbGxiYWNrTlNdKSxpLnN1cHBvcnRlZExuZ3MmJmkuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCJjaW1vZGUiKTwwJiYoaS5zdXBwb3J0ZWRMbmdzPWkuc3VwcG9ydGVkTG5ncy5jb25jYXQoWyJjaW1vZGUiXSkpLGl9ZnVuY3Rpb24gSWUoaSxyKXt2YXIgdD1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3ImJihuPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSx0LnB1c2guYXBwbHkodCxuKX1yZXR1cm4gdH1mdW5jdGlvbiBEKGkpe2Zvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspe3ZhciB0PWFyZ3VtZW50c1tyXSE9bnVsbD9hcmd1bWVudHNbcl06e307ciUyP0llKE9iamVjdCh0KSwhMCkuZm9yRWFjaChmdW5jdGlvbihuKXtGKGksbix0W25dKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpOkllKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbihuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxuLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiB4dChpKXt2YXIgcj1QdCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWooaSksZTtpZihyKXt2YXIgYT1qKHRoaXMpLmNvbnN0cnVjdG9yO2U9UmVmbGVjdC5jb25zdHJ1Y3Qobixhcmd1bWVudHMsYSl9ZWxzZSBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBCKHRoaXMsZSl9fWZ1bmN0aW9uIFB0KCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIHRlKCl7fWZ1bmN0aW9uIEx0KGkpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZihpKSk7ci5mb3JFYWNoKGZ1bmN0aW9uKHQpe3R5cGVvZiBpW3RdPT0iZnVuY3Rpb24iJiYoaVt0XT1pW3RdLmJpbmQoaSkpfSl9dmFyIG5lPWZ1bmN0aW9uKGkpe3EodCxpKTt2YXIgcj14dCh0KTtmdW5jdGlvbiB0KCl7dmFyIG4sZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e30sYT1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZihrKHRoaXMsdCksbj1yLmNhbGwodGhpcyksWiYmXy5jYWxsKEUobikpLG4ub3B0aW9ucz1fZShlKSxuLnNlcnZpY2VzPXt9LG4ubG9nZ2VyPU4sbi5tb2R1bGVzPXtleHRlcm5hbDpbXX0sTHQoRShuKSksYSYmIW4uaXNJbml0aWFsaXplZCYmIWUuaXNDbG9uZSl7aWYoIW4ub3B0aW9ucy5pbml0SW1tZWRpYXRlKXJldHVybiBuLmluaXQoZSxhKSxCKG4sRShuKSk7c2V0VGltZW91dChmdW5jdGlvbigpe24uaW5pdChlLGEpfSwwKX1yZXR1cm4gbn1yZXR1cm4gUih0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsYT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e30sbz1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDt0eXBlb2YgYT09ImZ1bmN0aW9uIiYmKG89YSxhPXt9KSwhYS5kZWZhdWx0TlMmJmEuZGVmYXVsdE5TIT09ITEmJmEubnMmJih0eXBlb2YgYS5ucz09InN0cmluZyI/YS5kZWZhdWx0TlM9YS5uczphLm5zLmluZGV4T2YoInRyYW5zbGF0aW9uIik8MCYmKGEuZGVmYXVsdE5TPWEubnNbMF0pKTt2YXIgdT1TdCgpO3RoaXMub3B0aW9ucz1EKEQoRCh7fSx1KSx0aGlzLm9wdGlvbnMpLF9lKGEpKSx0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSE9PSJ2MSImJih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbj1EKEQoe30sdS5pbnRlcnBvbGF0aW9uKSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbikpLGEua2V5U2VwYXJhdG9yIT09dm9pZCAwJiYodGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yPWEua2V5U2VwYXJhdG9yKSxhLm5zU2VwYXJhdG9yIT09dm9pZCAwJiYodGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkTnNTZXBhcmF0b3I9YS5uc1NlcGFyYXRvcik7ZnVuY3Rpb24gcyhkKXtyZXR1cm4gZD90eXBlb2YgZD09ImZ1bmN0aW9uIj9uZXcgZDpkOm51bGx9aWYoIXRoaXMub3B0aW9ucy5pc0Nsb25lKXt0aGlzLm1vZHVsZXMubG9nZ2VyP04uaW5pdChzKHRoaXMubW9kdWxlcy5sb2dnZXIpLHRoaXMub3B0aW9ucyk6Ti5pbml0KG51bGwsdGhpcy5vcHRpb25zKTt2YXIgbDt0aGlzLm1vZHVsZXMuZm9ybWF0dGVyP2w9dGhpcy5tb2R1bGVzLmZvcm1hdHRlcjp0eXBlb2YgSW50bDwidSImJihsPW10KTt2YXIgZj1uZXcgZnQodGhpcy5vcHRpb25zKTt0aGlzLnN0b3JlPW5ldyBvdCh0aGlzLm9wdGlvbnMucmVzb3VyY2VzLHRoaXMub3B0aW9ucyk7dmFyIGM9dGhpcy5zZXJ2aWNlcztjLmxvZ2dlcj1OLGMucmVzb3VyY2VTdG9yZT10aGlzLnN0b3JlLGMubGFuZ3VhZ2VVdGlscz1mLGMucGx1cmFsUmVzb2x2ZXI9bmV3IGR0KGYse3ByZXBlbmQ6dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcixjb21wYXRpYmlsaXR5SlNPTjp0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04sc2ltcGxpZnlQbHVyYWxTdWZmaXg6dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4fSksbCYmKCF0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXR8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdD09PXUuaW50ZXJwb2xhdGlvbi5mb3JtYXQpJiYoYy5mb3JtYXR0ZXI9cyhsKSxjLmZvcm1hdHRlci5pbml0KGMsdGhpcy5vcHRpb25zKSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQ9Yy5mb3JtYXR0ZXIuZm9ybWF0LmJpbmQoYy5mb3JtYXR0ZXIpKSxjLmludGVycG9sYXRvcj1uZXcgaHQodGhpcy5vcHRpb25zKSxjLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKX0sYy5iYWNrZW5kQ29ubmVjdG9yPW5ldyB3dChzKHRoaXMubW9kdWxlcy5iYWNrZW5kKSxjLnJlc291cmNlU3RvcmUsYyx0aGlzLm9wdGlvbnMpLGMuYmFja2VuZENvbm5lY3Rvci5vbigiKiIsZnVuY3Rpb24oZCl7Zm9yKHZhciBoPWFyZ3VtZW50cy5sZW5ndGgsTz1uZXcgQXJyYXkoaD4xP2gtMTowKSxiPTE7YjxoO2IrKylPW2ItMV09YXJndW1lbnRzW2JdO2UuZW1pdC5hcHBseShlLFtkXS5jb25jYXQoTykpfSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJihjLmxhbmd1YWdlRGV0ZWN0b3I9cyh0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksYy5sYW5ndWFnZURldGVjdG9yLmluaXQoYyx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYoYy5pMThuRm9ybWF0PXModGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLGMuaTE4bkZvcm1hdC5pbml0JiZjLmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBqZSh0aGlzLnNlcnZpY2VzLHRoaXMub3B0aW9ucyksdGhpcy50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihkKXtmb3IodmFyIGg9YXJndW1lbnRzLmxlbmd0aCxPPW5ldyBBcnJheShoPjE/aC0xOjApLGI9MTtiPGg7YisrKU9bYi0xXT1hcmd1bWVudHNbYl07ZS5lbWl0LmFwcGx5KGUsW2RdLmNvbmNhdChPKSl9KSx0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChmdW5jdGlvbihkKXtkLmluaXQmJmQuaW5pdChlKX0pfWlmKHRoaXMuZm9ybWF0PXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCxvfHwobz10ZSksdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nJiYhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5vcHRpb25zLmxuZyl7dmFyIGc9dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtnLmxlbmd0aD4wJiZnWzBdIT09ImRldiImJih0aGlzLm9wdGlvbnMubG5nPWdbMF0pfSF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJiF0aGlzLm9wdGlvbnMubG5nJiZ0aGlzLmxvZ2dlci53YXJuKCJpbml0OiBubyBsYW5ndWFnZURldGVjdG9yIGlzIHVzZWQgYW5kIG5vIGxuZyBpcyBkZWZpbmVkIik7dmFyIHA9WyJnZXRSZXNvdXJjZSIsImhhc1Jlc291cmNlQnVuZGxlIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJnZXREYXRhQnlMYW5ndWFnZSJdO3AuZm9yRWFjaChmdW5jdGlvbihkKXtlW2RdPWZ1bmN0aW9uKCl7dmFyIGg7cmV0dXJuKGg9ZS5zdG9yZSlbZF0uYXBwbHkoaCxhcmd1bWVudHMpfX0pO3ZhciB2PVsiYWRkUmVzb3VyY2UiLCJhZGRSZXNvdXJjZXMiLCJhZGRSZXNvdXJjZUJ1bmRsZSIsInJlbW92ZVJlc291cmNlQnVuZGxlIl07di5mb3JFYWNoKGZ1bmN0aW9uKGQpe2VbZF09ZnVuY3Rpb24oKXt2YXIgaDtyZXR1cm4oaD1lLnN0b3JlKVtkXS5hcHBseShoLGFyZ3VtZW50cyksZX19KTt2YXIgeT1LKCksbT1mdW5jdGlvbigpe3ZhciBoPWZ1bmN0aW9uKGIseCl7ZS5pc0luaXRpYWxpemVkJiYhZS5pbml0aWFsaXplZFN0b3JlT25jZSYmZS5sb2dnZXIud2FybigiaW5pdDogaTE4bmV4dCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiBZb3Ugc2hvdWxkIGNhbGwgaW5pdCBqdXN0IG9uY2UhIiksZS5pc0luaXRpYWxpemVkPSEwLGUub3B0aW9ucy5pc0Nsb25lfHxlLmxvZ2dlci5sb2coImluaXRpYWxpemVkIixlLm9wdGlvbnMpLGUuZW1pdCgiaW5pdGlhbGl6ZWQiLGUub3B0aW9ucykseS5yZXNvbHZlKHgpLG8oYix4KX07aWYoZS5sYW5ndWFnZXMmJmUub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJIT09InYxIiYmIWUuaXNJbml0aWFsaXplZClyZXR1cm4gaChudWxsLGUudC5iaW5kKGUpKTtlLmNoYW5nZUxhbmd1YWdlKGUub3B0aW9ucy5sbmcsaCl9O3JldHVybiB0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHwhdGhpcy5vcHRpb25zLmluaXRJbW1lZGlhdGU/bSgpOnNldFRpbWVvdXQobSwwKSx5fX0se2tleToibG9hZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcyxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp0ZSx1PW8scz10eXBlb2YgZT09InN0cmluZyI/ZTp0aGlzLmxhbmd1YWdlO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iJiYodT1lKSwhdGhpcy5vcHRpb25zLnJlc291cmNlc3x8dGhpcy5vcHRpb25zLnBhcnRpYWxCdW5kbGVkTGFuZ3VhZ2VzKXtpZihzJiZzLnRvTG93ZXJDYXNlKCk9PT0iY2ltb2RlIilyZXR1cm4gdSgpO3ZhciBsPVtdLGY9ZnVuY3Rpb24ocCl7aWYocCl7dmFyIHY9YS5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShwKTt2LmZvckVhY2goZnVuY3Rpb24oeSl7bC5pbmRleE9mKHkpPDAmJmwucHVzaCh5KX0pfX07aWYocylmKHMpO2Vsc2V7dmFyIGM9dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtjLmZvckVhY2goZnVuY3Rpb24oZyl7cmV0dXJuIGYoZyl9KX10aGlzLm9wdGlvbnMucHJlbG9hZCYmdGhpcy5vcHRpb25zLnByZWxvYWQuZm9yRWFjaChmdW5jdGlvbihnKXtyZXR1cm4gZihnKX0pLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5sb2FkKGwsdGhpcy5vcHRpb25zLm5zLGZ1bmN0aW9uKGcpeyFnJiYhYS5yZXNvbHZlZExhbmd1YWdlJiZhLmxhbmd1YWdlJiZhLnNldFJlc29sdmVkTGFuZ3VhZ2UoYS5sYW5ndWFnZSksdShnKX0pfWVsc2UgdShudWxsKX19LHtrZXk6InJlbG9hZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3ZhciB1PUsoKTtyZXR1cm4gZXx8KGU9dGhpcy5sYW5ndWFnZXMpLGF8fChhPXRoaXMub3B0aW9ucy5ucyksb3x8KG89dGUpLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5yZWxvYWQoZSxhLGZ1bmN0aW9uKHMpe3UucmVzb2x2ZSgpLG8ocyl9KSx1fX0se2tleToidXNlIix2YWx1ZTpmdW5jdGlvbihlKXtpZighZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhbiB1bmRlZmluZWQgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO2lmKCFlLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYSB3cm9uZyBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7cmV0dXJuIGUudHlwZT09PSJiYWNrZW5kIiYmKHRoaXMubW9kdWxlcy5iYWNrZW5kPWUpLChlLnR5cGU9PT0ibG9nZ2VyInx8ZS5sb2cmJmUud2FybiYmZS5lcnJvcikmJih0aGlzLm1vZHVsZXMubG9nZ2VyPWUpLGUudHlwZT09PSJsYW5ndWFnZURldGVjdG9yIiYmKHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yPWUpLGUudHlwZT09PSJpMThuRm9ybWF0IiYmKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0PWUpLGUudHlwZT09PSJwb3N0UHJvY2Vzc29yIiYmTGUuYWRkUG9zdFByb2Nlc3NvcihlKSxlLnR5cGU9PT0iZm9ybWF0dGVyIiYmKHRoaXMubW9kdWxlcy5mb3JtYXR0ZXI9ZSksZS50eXBlPT09IjNyZFBhcnR5IiYmdGhpcy5tb2R1bGVzLmV4dGVybmFsLnB1c2goZSksdGhpc319LHtrZXk6InNldFJlc29sdmVkTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKCEoIWV8fCF0aGlzLmxhbmd1YWdlcykmJiEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKGUpPi0xKSlmb3IodmFyIGE9MDthPHRoaXMubGFuZ3VhZ2VzLmxlbmd0aDthKyspe3ZhciBvPXRoaXMubGFuZ3VhZ2VzW2FdO2lmKCEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKG8pPi0xKSYmdGhpcy5zdG9yZS5oYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMobykpe3RoaXMucmVzb2x2ZWRMYW5ndWFnZT1vO2JyZWFrfX19fSx7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXt2YXIgbz10aGlzO3RoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG89ZTt2YXIgdT1LKCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIixlKTt2YXIgcz1mdW5jdGlvbihnKXtvLmxhbmd1YWdlPWcsby5sYW5ndWFnZXM9by5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShnKSxvLnJlc29sdmVkTGFuZ3VhZ2U9dm9pZCAwLG8uc2V0UmVzb2x2ZWRMYW5ndWFnZShnKX0sbD1mdW5jdGlvbihnLHApe3A/KHMocCksby50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKHApLG8uaXNMYW5ndWFnZUNoYW5naW5nVG89dm9pZCAwLG8uZW1pdCgibGFuZ3VhZ2VDaGFuZ2VkIixwKSxvLmxvZ2dlci5sb2coImxhbmd1YWdlQ2hhbmdlZCIscCkpOm8uaXNMYW5ndWFnZUNoYW5naW5nVG89dm9pZCAwLHUucmVzb2x2ZShmdW5jdGlvbigpe3JldHVybiBvLnQuYXBwbHkobyxhcmd1bWVudHMpfSksYSYmYShnLGZ1bmN0aW9uKCl7cmV0dXJuIG8udC5hcHBseShvLGFyZ3VtZW50cyl9KX0sZj1mdW5jdGlvbihnKXshZSYmIWcmJm8uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmKGc9W10pO3ZhciBwPXR5cGVvZiBnPT0ic3RyaW5nIj9nOm8uc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRCZXN0TWF0Y2hGcm9tQ29kZXMoZyk7cCYmKG8ubGFuZ3VhZ2V8fHMocCksby50cmFuc2xhdG9yLmxhbmd1YWdlfHxvLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2UocCksby5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiZvLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuY2FjaGVVc2VyTGFuZ3VhZ2UocCkpLG8ubG9hZFJlc291cmNlcyhwLGZ1bmN0aW9uKHYpe2wodixwKX0pfTtyZXR1cm4hZSYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdCgpKTohZSYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmM/dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdChmKTpmKGUpLHV9fSx7a2V5OiJnZXRGaXhlZFQiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgdT10aGlzLHM9ZnVuY3Rpb24gbChmLGMpe3ZhciBnO2lmKFAoYykhPT0ib2JqZWN0Iil7Zm9yKHZhciBwPWFyZ3VtZW50cy5sZW5ndGgsdj1uZXcgQXJyYXkocD4yP3AtMjowKSx5PTI7eTxwO3krKyl2W3ktMl09YXJndW1lbnRzW3ldO2c9dS5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKFtmLGNdLmNvbmNhdCh2KSl9ZWxzZSBnPUQoe30sYyk7Zy5sbmc9Zy5sbmd8fGwubG5nLGcubG5ncz1nLmxuZ3N8fGwubG5ncyxnLm5zPWcubnN8fGwubnMsZy5rZXlQcmVmaXg9Zy5rZXlQcmVmaXh8fG98fGwua2V5UHJlZml4O3ZhciBtPXUub3B0aW9ucy5rZXlTZXBhcmF0b3J8fCIuIixkPWcua2V5UHJlZml4PyIiLmNvbmNhdChnLmtleVByZWZpeCkuY29uY2F0KG0pLmNvbmNhdChmKTpmO3JldHVybiB1LnQoZCxnKX07cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIj9zLmxuZz1lOnMubG5ncz1lLHMubnM9YSxzLmtleVByZWZpeD1vLHN9fSx7a2V5OiJ0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlO3JldHVybiB0aGlzLnRyYW5zbGF0b3ImJihlPXRoaXMudHJhbnNsYXRvcikudHJhbnNsYXRlLmFwcGx5KGUsYXJndW1lbnRzKX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYoZT10aGlzLnRyYW5zbGF0b3IpLmV4aXN0cy5hcHBseShlLGFyZ3VtZW50cyl9fSx7a2V5OiJzZXREZWZhdWx0TmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLm9wdGlvbnMuZGVmYXVsdE5TPWV9fSx7a2V5OiJoYXNMb2FkZWROYW1lc3BhY2UiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e307aWYoIXRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuZXh0IHdhcyBub3QgaW5pdGlhbGl6ZWQiLHRoaXMubGFuZ3VhZ2VzKSwhMTtpZighdGhpcy5sYW5ndWFnZXN8fCF0aGlzLmxhbmd1YWdlcy5sZW5ndGgpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bi5sYW5ndWFnZXMgd2VyZSB1bmRlZmluZWQgb3IgZW1wdHkiLHRoaXMubGFuZ3VhZ2VzKSwhMTt2YXIgdT10aGlzLnJlc29sdmVkTGFuZ3VhZ2V8fHRoaXMubGFuZ3VhZ2VzWzBdLHM9dGhpcy5vcHRpb25zP3RoaXMub3B0aW9ucy5mYWxsYmFja0xuZzohMSxsPXRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aC0xXTtpZih1LnRvTG93ZXJDYXNlKCk9PT0iY2ltb2RlIilyZXR1cm4hMDt2YXIgZj1mdW5jdGlvbihwLHYpe3ZhciB5PWEuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5zdGF0ZVsiIi5jb25jYXQocCwifCIpLmNvbmNhdCh2KV07cmV0dXJuIHk9PT0tMXx8eT09PTJ9O2lmKG8ucHJlY2hlY2spe3ZhciBjPW8ucHJlY2hlY2sodGhpcyxmKTtpZihjIT09dm9pZCAwKXJldHVybiBjfXJldHVybiEhKHRoaXMuaGFzUmVzb3VyY2VCdW5kbGUodSxlKXx8IXRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5iYWNrZW5kfHx0aGlzLm9wdGlvbnMucmVzb3VyY2VzJiYhdGhpcy5vcHRpb25zLnBhcnRpYWxCdW5kbGVkTGFuZ3VhZ2VzfHxmKHUsZSkmJighc3x8ZihsLGUpKSl9fSx7a2V5OiJsb2FkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24oZSxhKXt2YXIgbz10aGlzLHU9SygpO3JldHVybiB0aGlzLm9wdGlvbnMubnM/KHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKSxlLmZvckVhY2goZnVuY3Rpb24ocyl7by5vcHRpb25zLm5zLmluZGV4T2Yocyk8MCYmby5vcHRpb25zLm5zLnB1c2gocyl9KSx0aGlzLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24ocyl7dS5yZXNvbHZlKCksYSYmYShzKX0pLHUpOihhJiZhKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToibG9hZExhbmd1YWdlcyIsdmFsdWU6ZnVuY3Rpb24oZSxhKXt2YXIgbz1LKCk7dHlwZW9mIGU9PSJzdHJpbmciJiYoZT1bZV0pO3ZhciB1PXRoaXMub3B0aW9ucy5wcmVsb2FkfHxbXSxzPWUuZmlsdGVyKGZ1bmN0aW9uKGwpe3JldHVybiB1LmluZGV4T2YobCk8MH0pO3JldHVybiBzLmxlbmd0aD8odGhpcy5vcHRpb25zLnByZWxvYWQ9dS5jb25jYXQocyksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKGwpe28ucmVzb2x2ZSgpLGEmJmEobCl9KSxvKTooYSYmYSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImRpciIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoZXx8KGU9dGhpcy5yZXNvbHZlZExhbmd1YWdlfHwodGhpcy5sYW5ndWFnZXMmJnRoaXMubGFuZ3VhZ2VzLmxlbmd0aD4wP3RoaXMubGFuZ3VhZ2VzWzBdOnRoaXMubGFuZ3VhZ2UpKSwhZSlyZXR1cm4icnRsIjt2YXIgYT1bImFyIiwic2h1Iiwic3FyIiwic3NoIiwieGFhIiwieWhkIiwieXVkIiwiYWFvIiwiYWJoIiwiYWJ2IiwiYWNtIiwiYWNxIiwiYWN3IiwiYWN4IiwiYWN5IiwiYWRmIiwiYWRzIiwiYWViIiwiYWVjIiwiYWZiIiwiYWpwIiwiYXBjIiwiYXBkIiwiYXJiIiwiYXJxIiwiYXJzIiwiYXJ5IiwiYXJ6IiwiYXV6IiwiYXZsIiwiYXloIiwiYXlsIiwiYXluIiwiYXlwIiwiYmJ6IiwicGdhIiwiaGUiLCJpdyIsInBzIiwicGJ0IiwicGJ1IiwicHN0IiwicHJwIiwicHJkIiwidWciLCJ1ciIsInlkZCIsInlkcyIsInlpaCIsImppIiwieWkiLCJoYm8iLCJtZW4iLCJ4bW4iLCJmYSIsImpwciIsInBlbyIsInBlcyIsInBycyIsImR2Iiwic2FtIiwiY2tiIl07cmV0dXJuIGEuaW5kZXhPZih0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoZSkpPi0xfHxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiLWFyYWIiKT4xPyJydGwiOiJsdHIifX0se2tleToiY2xvbmVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGE9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnRlLHU9RChEKEQoe30sdGhpcy5vcHRpb25zKSxhKSx7aXNDbG9uZTohMH0pLHM9bmV3IHQodSk7KGEuZGVidWchPT12b2lkIDB8fGEucHJlZml4IT09dm9pZCAwKSYmKHMubG9nZ2VyPXMubG9nZ2VyLmNsb25lKGEpKTt2YXIgbD1bInN0b3JlIiwic2VydmljZXMiLCJsYW5ndWFnZSJdO3JldHVybiBsLmZvckVhY2goZnVuY3Rpb24oZil7c1tmXT1lW2ZdfSkscy5zZXJ2aWNlcz1EKHt9LHRoaXMuc2VydmljZXMpLHMuc2VydmljZXMudXRpbHM9e2hhc0xvYWRlZE5hbWVzcGFjZTpzLmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKHMpfSxzLnRyYW5zbGF0b3I9bmV3IGplKHMuc2VydmljZXMscy5vcHRpb25zKSxzLnRyYW5zbGF0b3Iub24oIioiLGZ1bmN0aW9uKGYpe2Zvcih2YXIgYz1hcmd1bWVudHMubGVuZ3RoLGc9bmV3IEFycmF5KGM+MT9jLTE6MCkscD0xO3A8YztwKyspZ1twLTFdPWFyZ3VtZW50c1twXTtzLmVtaXQuYXBwbHkocyxbZl0uY29uY2F0KGcpKX0pLHMuaW5pdCh1LG8pLHMudHJhbnNsYXRvci5vcHRpb25zPXMub3B0aW9ucyxzLnRyYW5zbGF0b3IuYmFja2VuZENvbm5lY3Rvci5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQocyl9LHN9fSx7a2V5OiJ0b0pTT04iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue29wdGlvbnM6dGhpcy5vcHRpb25zLHN0b3JlOnRoaXMuc3RvcmUsbGFuZ3VhZ2U6dGhpcy5sYW5ndWFnZSxsYW5ndWFnZXM6dGhpcy5sYW5ndWFnZXMscmVzb2x2ZWRMYW5ndWFnZTp0aGlzLnJlc29sdmVkTGFuZ3VhZ2V9fX1dKSx0fShfKTtGKG5lLCJjcmVhdGVJbnN0YW5jZSIsZnVuY3Rpb24oKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtyZXR1cm4gbmV3IG5lKGkscil9KTt2YXIgUz1uZS5jcmVhdGVJbnN0YW5jZSgpO1MuY3JlYXRlSW5zdGFuY2U9bmUuY3JlYXRlSW5zdGFuY2UsUy5jcmVhdGVJbnN0YW5jZSxTLmluaXQsUy5sb2FkUmVzb3VyY2VzLFMucmVsb2FkUmVzb3VyY2VzLFMudXNlLFMuY2hhbmdlTGFuZ3VhZ2UsUy5nZXRGaXhlZFQsUy50LFMuZXhpc3RzLFMuc2V0RGVmYXVsdE5hbWVzcGFjZSxTLmhhc0xvYWRlZE5hbWVzcGFjZSxTLmxvYWROYW1lc3BhY2VzLFMubG9hZExhbmd1YWdlcztjb25zdCBUPWk9Pntjb25zdCByPWkuZ2V0RnVsbFllYXIoKSx0PWkuZ2V0TW9udGgoKSsxLG49aS5nZXREYXRlKCksZT1pLmdldEhvdXJzKCksYT1pLmdldE1pbnV0ZXMoKSxvPWkuZ2V0U2Vjb25kcygpLHU9cz0+YCR7c31gLnBhZFN0YXJ0KDIsIjAiKTtyZXR1cm5gJHtyfS0ke3UodCl9LSR7dShuKX0gJHt1KGUpfToke3UoYSl9OiR7dShvKX1gfTtmdW5jdGlvbiBrdChpLHIsdCl7dmFyIG8sdTtjb25zdCBuPShvPXIuZmluZChzPT5zLnR5cGU9PT0iZmllbGQiKSk9PW51bGw/dm9pZCAwOm8udmFsdWUsZT0odT1yLmZpbmQocz0+cy50eXBlPT09InZhbHVlIikpPT1udWxsP3ZvaWQgMDp1LnZhbHVlO2lmKCFufHwhZSlyZXR1cm4gdDtjb25zdCBhPXRbbl07c3dpdGNoKGUpe2Nhc2UieWVhciI6e2NvbnN0IHM9YS5tYXAobD0+e2NvbnN0IGM9bmV3IERhdGUobCkuZ2V0RnVsbFllYXIoKTtyZXR1cm4gVChuZXcgRGF0ZShjLDAsMSkpfSk7cmV0dXJuey4uLnQsW2ldOnN9fWNhc2UicXVhcnRlciI6e2NvbnN0IHM9YS5tYXAobD0+e2NvbnN0IGY9bmV3IERhdGUobCksYz1mLmdldEZ1bGxZZWFyKCksZz1NYXRoLmZsb29yKGYuZ2V0TW9udGgoKS8zKTtyZXR1cm4gVChuZXcgRGF0ZShjLGcqMywxKSl9KTtyZXR1cm57Li4udCxbaV06c319Y2FzZSJtb250aCI6e2NvbnN0IHM9YS5tYXAobD0+e2NvbnN0IGY9bmV3IERhdGUobCksYz1mLmdldEZ1bGxZZWFyKCksZz1mLmdldE1vbnRoKCk7cmV0dXJuIFQobmV3IERhdGUoYyxnLDEpKX0pO3JldHVybnsuLi50LFtpXTpzfX1jYXNlIndlZWsiOntjb25zdCBzPWEubWFwKGw9Pntjb25zdCBmPW5ldyBEYXRlKGwpLGM9bmV3IERhdGUoZi5zZXREYXRlKGYuZ2V0RGF0ZSgpLWYuZ2V0RGF5KCkpKSxnPWMuZ2V0RnVsbFllYXIoKSxwPWMuZ2V0TW9udGgoKSx2PWMuZ2V0RGF0ZSgpO3JldHVybiBUKG5ldyBEYXRlKGcscCx2KSl9KTtyZXR1cm57Li4udCxbaV06c319Y2FzZSJkYXkiOntjb25zdCBzPWEubWFwKGw9Pntjb25zdCBmPW5ldyBEYXRlKGwpLGM9Zi5nZXRGdWxsWWVhcigpLGc9Zi5nZXRNb250aCgpLHA9Zi5nZXREYXRlKCk7cmV0dXJuIFQobmV3IERhdGUoYyxnLHApKX0pO3JldHVybnsuLi50LFtpXTpzfX1jYXNlImhvdXIiOntjb25zdCBzPWEubWFwKGw9Pntjb25zdCBmPW5ldyBEYXRlKGwpLGM9Zi5nZXRGdWxsWWVhcigpLGc9Zi5nZXRNb250aCgpLHA9Zi5nZXREYXRlKCksdj1mLmdldEhvdXJzKCk7cmV0dXJuIFQobmV3IERhdGUoYyxnLHAsdikpfSk7cmV0dXJuey4uLnQsW2ldOnN9fWNhc2UibWludXRlIjp7Y29uc3Qgcz1hLm1hcChsPT57Y29uc3QgZj1uZXcgRGF0ZShsKSxjPWYuZ2V0RnVsbFllYXIoKSxnPWYuZ2V0TW9udGgoKSxwPWYuZ2V0RGF0ZSgpLHY9Zi5nZXRIb3VycygpLHk9Zi5nZXRNaW51dGVzKCk7cmV0dXJuIFQobmV3IERhdGUoYyxnLHAsdix5KSl9KTtyZXR1cm57Li4udCxbaV06c319Y2FzZSJzZWNvbmQiOntjb25zdCBzPWEubWFwKGw9Pntjb25zdCBmPW5ldyBEYXRlKGwpLGM9Zi5nZXRGdWxsWWVhcigpLGc9Zi5nZXRNb250aCgpLHA9Zi5nZXREYXRlKCksdj1mLmdldEhvdXJzKCkseT1mLmdldE1pbnV0ZXMoKSxtPWYuZ2V0U2Vjb25kcygpO3JldHVybiBUKG5ldyBEYXRlKGMsZyxwLHYseSxtKSl9KTtyZXR1cm57Li4udCxbaV06c319ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gUnQoaSxyLHQpe3ZhciBvLHU7Y29uc3Qgbj0obz1yLmZpbmQocz0+cy50eXBlPT09ImZpZWxkIikpPT1udWxsP3ZvaWQgMDpvLnZhbHVlLGU9KHU9ci5maW5kKHM9PnMudHlwZT09PSJ2YWx1ZSIpKT09bnVsbD92b2lkIDA6dS52YWx1ZTtpZighbnx8IWUpcmV0dXJuIHQ7Y29uc3QgYT10W25dO3N3aXRjaChlKXtjYXNlInllYXIiOntjb25zdCBzPWEubWFwKGw9Pm5ldyBEYXRlKGwpLmdldEZ1bGxZZWFyKCkpO3JldHVybnsuLi50LFtpXTpzfX1jYXNlInF1YXJ0ZXIiOntjb25zdCBzPWEubWFwKGw9Pntjb25zdCBmPW5ldyBEYXRlKGwpO3JldHVybiBNYXRoLmZsb29yKGYuZ2V0TW9udGgoKS8zKSsxfSk7cmV0dXJuey4uLnQsW2ldOnN9fWNhc2UibW9udGgiOntjb25zdCBzPWEubWFwKGw9Pm5ldyBEYXRlKGwpLmdldE1vbnRoKCkrMSk7cmV0dXJuey4uLnQsW2ldOnN9fWNhc2Uid2VlayI6e2NvbnN0IHM9YS5tYXAobD0+e2NvbnN0IGY9bmV3IERhdGUobCksYz1mLmdldEZ1bGxZZWFyKCksZz1uZXcgRGF0ZShjLDAsMSkscD1uZXcgRGF0ZShuZXcgRGF0ZShnKS5zZXREYXRlKGcuZ2V0RGF0ZSgpLWcuZ2V0RGF5KCkpKSx2PWYuZ2V0VGltZSgpLXAuZ2V0VGltZSgpPjFlMyo2MCo2MCoyNCo3P2M6cC5nZXRGdWxsWWVhcigpLHk9bmV3IERhdGUodiwwLDEpLG09bmV3IERhdGUobmV3IERhdGUoeSkuc2V0RGF0ZSh5LmdldERhdGUoKS15LmdldERheSgpKSk7cmV0dXJuIE1hdGguZmxvb3IoKGYuZ2V0VGltZSgpLW0uZ2V0VGltZSgpKS8oNyoyNCo2MCo2MCoxZTMpKSsxfSk7cmV0dXJuey4uLnQsW2ldOnN9fWNhc2Uid2Vla2RheSI6e2NvbnN0IHM9YS5tYXAobD0+bmV3IERhdGUobCkuZ2V0RGF5KCkpO3JldHVybnsuLi50LFtpXTpzfX1jYXNlImRheSI6e2NvbnN0IHM9YS5tYXAobD0+bmV3IERhdGUobCkuZ2V0RGF0ZSgpKTtyZXR1cm57Li4udCxbaV06c319Y2FzZSJob3VyIjp7Y29uc3Qgcz1hLm1hcChsPT5uZXcgRGF0ZShsKS5nZXRIb3VycygpKTtyZXR1cm57Li4udCxbaV06c319Y2FzZSJtaW51dGUiOntjb25zdCBzPWEubWFwKGw9Pm5ldyBEYXRlKGwpLmdldE1pbnV0ZXMoKSk7cmV0dXJuey4uLnQsW2ldOnN9fWNhc2Uic2Vjb25kIjp7Y29uc3Qgcz1hLm1hcChsPT5uZXcgRGF0ZShsKS5nZXRTZWNvbmRzKCkpO3JldHVybnsuLi50LFtpXTpzfX1kZWZhdWx0OnJldHVybiB0fX1mdW5jdGlvbiBUZShpLHIpe2NvbnN0e29wOnQscGFyYW1zOm4sbnVtOmV9PWksYT17Li4ucn0sbz1yW09iamVjdC5rZXlzKHIpWzBdXS5sZW5ndGg7Zm9yKGxldCB1IG9mIG4pc3dpdGNoKHUudHlwZSl7Y2FzZSJmaWVsZCI6YVt1LnZhbHVlXT1yW3UudmFsdWVdO2JyZWFrO2Nhc2UiY29uc3RhbnQiOmFbdS52YWx1ZV09bmV3IEFycmF5KG8pLmZpbGwodS52YWx1ZSk7YnJlYWs7Y2FzZSJleHByZXNzaW9uIjpsZXQgcz1UZSh1LnZhbHVlLHIpO09iamVjdC5rZXlzKHMpLmZvckVhY2gobD0+e2FbbF09c1tsXX0pO2JyZWFrfXN3aXRjaCh0KXtjYXNlIm9uZSI6cmV0dXJuIER0KGkuYXMsbixhKTtjYXNlImxvZyI6cmV0dXJuIGZlKGkuYXMsbixhLGUpO2Nhc2UibG9nMiI6cmV0dXJuIGZlKGkuYXMsbixhLDIpO2Nhc2UibG9nMTAiOnJldHVybiBmZShpLmFzLG4sYSwxMCk7Y2FzZSJiaW5Db3VudCI6cmV0dXJuIE50KGkuYXMsbixhLGUpO2Nhc2UiYmluIjpyZXR1cm4ganQoaS5hcyxuLGEsZSk7Y2FzZSJkYXRlVGltZURyaWxsIjpyZXR1cm4ga3QoaS5hcyxuLGEpO2Nhc2UiZGF0ZVRpbWVGZWF0dXJlIjpyZXR1cm4gUnQoaS5hcyxuLGEpO2RlZmF1bHQ6cmV0dXJuIGF9fWZ1bmN0aW9uIGp0KGkscix0LG49MTApe2NvbnN0e3ZhbHVlOmV9PXJbMF0sYT10W2VdO2xldCBvPTEvMCx1PS0xLzA7Zm9yKGxldCBwPTA7cDxhLmxlbmd0aDtwKyspe2xldCB2PWFbcF07dj51JiYodT12KSx2PG8mJihvPXYpfWNvbnN0IHM9KHUtbykvbixsPU1hdGgubWluKE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLE1hdGgubWF4KHUtbyxOdW1iZXIuTUlOX1ZBTFVFKSksZj1NYXRoLm1heCgtTWF0aC5yb3VuZChNYXRoLmxvZzEwKGwpKSsyLDApLGM9TWF0aC5taW4oMTAwLE1hdGgubWF4KDAsTWF0aC5tYXgoTnVtYmVyLmlzRmluaXRlKGYpP2Y6MCwwKSkpLGc9YS5tYXAocD0+e2xldCB2PU1hdGguZmxvb3IoKHAtbykvcyk7cmV0dXJuIHY9PT1uJiYodj1uLTEpLE51bWJlci5pc05hTih2KSYmKHY9MCksTnVtYmVyKCh2KnMrbykudG9GaXhlZChjKSl9KTtyZXR1cm57Li4udCxbaV06Z319ZnVuY3Rpb24gTnQoaSxyLHQsbj0xMCl7Y29uc3R7dmFsdWU6ZX09clswXSxvPXRbZV0ubWFwKChsLGYpPT4oe3ZhbDpsLGluZGV4OmZ9KSkuc29ydCgobCxmKT0+bC52YWwtZi52YWwpLm1hcCgobCxmKT0+KHt2YWw6bC52YWwsaW5kZXg6bC5pbmRleCxvcmRlckluZGV4OmZ9KSksdT1vLmxlbmd0aC9uLHM9by5zb3J0KChsLGYpPT5sLmluZGV4LWYuaW5kZXgpLm1hcChsPT57bGV0IGY9TWF0aC5mbG9vcihsLm9yZGVySW5kZXgvdSk7cmV0dXJuIGY9PT1uJiYoZj1uLTEpLGYrMX0pO3JldHVybnsuLi50LFtpXTpzfX1mdW5jdGlvbiBmZShpLHIsdCxuPTEwKXtjb25zdHt2YWx1ZTplfT1yWzBdLG89dFtlXS5tYXAodT0+TWF0aC5sb2codSkvTWF0aC5sb2cobikpO3JldHVybnsuLi50LFtpXTpvfX1mdW5jdGlvbiBEdChpLHIsdCl7aWYoT2JqZWN0LmtleXModCkubGVuZ3RoPT09MClyZXR1cm4gdDtjb25zdCBuPXRbT2JqZWN0LmtleXModClbMF1dLmxlbmd0aCxlPW5ldyBBcnJheShuKS5maWxsKDEpO3JldHVybnsuLi50LFtpXTplfX1mdW5jdGlvbiBDdChpKXtjb25zdCByPXt9O3JldHVybiBpLmxlbmd0aD09PTB8fE9iamVjdC5rZXlzKGlbMF0pLmZvckVhY2godD0+e3JbdF09aS5tYXAobj0+blt0XSl9KSxyfWZ1bmN0aW9uIEV0KGkpe2NvbnN0IHI9T2JqZWN0LmtleXMoaSk7aWYoci5sZW5ndGg9PT0wKXJldHVybltdO2NvbnN0IHQ9W10sbj1pW09iamVjdC5rZXlzKGkpWzBdXS5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7Y29uc3QgYT17fTtyLmZvckVhY2gobz0+e2Fbb109aVtvXVtlXX0pLHQucHVzaChhKX1yZXR1cm4gdH1mdW5jdGlvbiBGdChpLHIpe2xldCB0PUN0KGkpO2ZvcihsZXQgbj0wO248ci5sZW5ndGg7bisrKXtjb25zdCBlPXJbbl07dD1UZShlLmV4cHJlc3Npb24sdCl9cmV0dXJuIEV0KHQpfWNvbnN0IF90PWk9Pntjb25zdHtkYXRhU291cmNlOnIsdHJhbnM6dH09aS5kYXRhO3RyeXtjb25zdCBuPUZ0KHIsdCk7c2VsZi5wb3N0TWVzc2FnZShuKX1jYXRjaChuKXtzZWxmLnBvc3RNZXNzYWdlKHtlcnJvcjpuLm1lc3NhZ2V9KX19O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsX3QsITEpfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNmb3JtLndvcmtlci02MGExY2M4Zi5qcy5tYXAK",KD=typeof window<"u"&&window.Blob&&new Blob([atob(UD)],{type:"text/javascript;charset=utf-8"});function K2e(){const e=KD&&(window.URL||window.webkitURL).createObjectURL(KD);try{return e?new Worker(e):new Worker("data:application/javascript;base64,"+UD)}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const $D="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIFAoaSl7cmV0dXJuIFA9dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09InN5bWJvbCI/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LFAoaSl9ZnVuY3Rpb24gUihpLHQpe2lmKCEoaSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIEhlKGksdCl7aWYoUChpKSE9PSJvYmplY3QifHxpPT09bnVsbClyZXR1cm4gaTt2YXIgbj1pW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKGksdHx8ImRlZmF1bHQiKTtpZihQKHIpIT09Im9iamVjdCIpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4odD09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKGkpfWZ1bmN0aW9uIHBlKGkpe3ZhciB0PUhlKGksInN0cmluZyIpO3JldHVybiBQKHQpPT09InN5bWJvbCI/dDpTdHJpbmcodCl9ZnVuY3Rpb24gZGUoaSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHBlKHIua2V5KSxyKX19ZnVuY3Rpb24gayhpLHQsbil7cmV0dXJuIHQmJmRlKGkucHJvdG90eXBlLHQpLG4mJmRlKGksbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksaX1mdW5jdGlvbiBfKGkpe2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gaX1mdW5jdGlvbiBpZShpLHQpe3JldHVybiBpZT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLGUpe3JldHVybiByLl9fcHJvdG9fXz1lLHJ9LGllKGksdCl9ZnVuY3Rpb24gUShpLHQpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24iJiZ0IT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2kucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTppLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0JiZpZShpLHQpfWZ1bmN0aW9uIFYoaSx0KXtpZih0JiYoUCh0KT09PSJvYmplY3QifHx0eXBlb2YgdD09ImZ1bmN0aW9uIikpcmV0dXJuIHQ7aWYodCE9PXZvaWQgMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpO3JldHVybiBfKGkpfWZ1bmN0aW9uIGooaSl7cmV0dXJuIGo9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24obil7cmV0dXJuIG4uX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2Yobil9LGooaSl9ZnVuY3Rpb24gRihpLHQsbil7cmV0dXJuIHQ9cGUodCksdCBpbiBpP09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTppW3RdPW4saX1mdW5jdGlvbiBKZShpKXtpZihBcnJheS5pc0FycmF5KGkpKXJldHVybiBpfWZ1bmN0aW9uIHplKGkpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZpW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGlbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShpKX1mdW5jdGlvbiBoZShpLHQpeyh0PT1udWxsfHx0PmkubGVuZ3RoKSYmKHQ9aS5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KHQpO248dDtuKyspcltuXT1pW25dO3JldHVybiByfWZ1bmN0aW9uIFdlKGksdCl7aWYoaSl7aWYodHlwZW9mIGk9PSJzdHJpbmciKXJldHVybiBoZShpLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpKS5zbGljZSg4LC0xKTtpZihuPT09Ik9iamVjdCImJmkuY29uc3RydWN0b3ImJihuPWkuY29uc3RydWN0b3IubmFtZSksbj09PSJNYXAifHxuPT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20oaSk7aWYobj09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gaGUoaSx0KX19ZnVuY3Rpb24gWWUoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gR2UoaSl7cmV0dXJuIEplKGkpfHx6ZShpKXx8V2UoaSl8fFllKCl9ZnVuY3Rpb24gdmUoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBtZShpKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF0hPW51bGw/YXJndW1lbnRzW3RdOnt9O3QlMj92ZShPYmplY3QobiksITApLmZvckVhY2goZnVuY3Rpb24ocil7RihpLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTp2ZShPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGl9dmFyIFFlPXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgibG9nIix0KX0sd2FybjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgid2FybiIsdCl9LGVycm9yOmZ1bmN0aW9uKHQpe3RoaXMub3V0cHV0KCJlcnJvciIsdCl9LG91dHB1dDpmdW5jdGlvbih0LG4pe2NvbnNvbGUmJmNvbnNvbGVbdF0mJmNvbnNvbGVbdF0uYXBwbHkoY29uc29sZSxuKX19LFplPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSh0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e307Uih0aGlzLGkpLHRoaXMuaW5pdCh0LG4pfXJldHVybiBrKGksW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1yLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj1ufHxRZSx0aGlzLm9wdGlvbnM9cix0aGlzLmRlYnVnPXIuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24obil7dGhpcy5kZWJ1Zz1ufX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGU9MDtlPG47ZSsrKXJbZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQociwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGU9MDtlPG47ZSsrKXJbZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQociwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobiksZT0wO2U8bjtlKyspcltlXT1hcmd1bWVudHNbZV07cmV0dXJuIHRoaXMuZm9yd2FyZChyLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGU9MDtlPG47ZSsrKXJbZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQociwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbihuLHIsZSxhKXtyZXR1cm4gYSYmIXRoaXMuZGVidWc/bnVsbDoodHlwZW9mIG5bMF09PSJzdHJpbmciJiYoblswXT0iIi5jb25jYXQoZSkuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KG5bMF0pKSx0aGlzLmxvZ2dlcltyXShuKSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKG4pe3JldHVybiBuZXcgaSh0aGlzLmxvZ2dlcixtZShtZSh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdChuLCI6Iil9KSx0aGlzLm9wdGlvbnMpKX19LHtrZXk6ImNsb25lIix2YWx1ZTpmdW5jdGlvbihuKXtyZXR1cm4gbj1ufHx0aGlzLm9wdGlvbnMsbi5wcmVmaXg9bi5wcmVmaXh8fHRoaXMucHJlZml4LG5ldyBpKHRoaXMubG9nZ2VyLG4pfX1dKSxpfSgpLE49bmV3IFplLEk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7Uih0aGlzLGkpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBrKGksW3trZXk6Im9uIix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBlPXRoaXM7cmV0dXJuIG4uc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Uub2JzZXJ2ZXJzW2FdPWUub2JzZXJ2ZXJzW2FdfHxbXSxlLm9ic2VydmVyc1thXS5wdXNoKHIpfSksdGhpc319LHtrZXk6Im9mZiIsdmFsdWU6ZnVuY3Rpb24obixyKXtpZih0aGlzLm9ic2VydmVyc1tuXSl7aWYoIXIpe2RlbGV0ZSB0aGlzLm9ic2VydmVyc1tuXTtyZXR1cm59dGhpcy5vYnNlcnZlcnNbbl09dGhpcy5vYnNlcnZlcnNbbl0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09cn0pfX19LHtrZXk6ImVtaXQiLHZhbHVlOmZ1bmN0aW9uKG4pe2Zvcih2YXIgcj1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHI+MT9yLTE6MCksYT0xO2E8cjthKyspZVthLTFdPWFyZ3VtZW50c1thXTtpZih0aGlzLm9ic2VydmVyc1tuXSl7dmFyIG89W10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzW25dKTtvLmZvckVhY2goZnVuY3Rpb24odSl7dS5hcHBseSh2b2lkIDAsZSl9KX1pZih0aGlzLm9ic2VydmVyc1siKiJdKXt2YXIgcz1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbIioiXSk7cy5mb3JFYWNoKGZ1bmN0aW9uKHUpe3UuYXBwbHkodSxbbl0uY29uY2F0KGUpKX0pfX19XSksaX0oKTtmdW5jdGlvbiAkKCl7dmFyIGksdCxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHIsZSl7aT1yLHQ9ZX0pO3JldHVybiBuLnJlc29sdmU9aSxuLnJlamVjdD10LG59ZnVuY3Rpb24geWUoaSl7cmV0dXJuIGk9PW51bGw/IiI6IiIraX1mdW5jdGlvbiBxZShpLHQsbil7aS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3Rbcl0mJihuW3JdPXRbcl0pfSl9ZnVuY3Rpb24gb2UoaSx0LG4pe2Z1bmN0aW9uIHIocyl7cmV0dXJuIHMmJnMuaW5kZXhPZigiIyMjIik+LTE/cy5yZXBsYWNlKC8jIyMvZywiLiIpOnN9ZnVuY3Rpb24gZSgpe3JldHVybiFpfHx0eXBlb2YgaT09InN0cmluZyJ9Zm9yKHZhciBhPXR5cGVvZiB0IT0ic3RyaW5nIj9bXS5jb25jYXQodCk6dC5zcGxpdCgiLiIpO2EubGVuZ3RoPjE7KXtpZihlKCkpcmV0dXJue307dmFyIG89cihhLnNoaWZ0KCkpOyFpW29dJiZuJiYoaVtvXT1uZXcgbiksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksbyk/aT1pW29dOmk9e319cmV0dXJuIGUoKT97fTp7b2JqOmksazpyKGEuc2hpZnQoKSl9fWZ1bmN0aW9uIGJlKGksdCxuKXt2YXIgcj1vZShpLHQsT2JqZWN0KSxlPXIub2JqLGE9ci5rO2VbYV09bn1mdW5jdGlvbiBYZShpLHQsbixyKXt2YXIgZT1vZShpLHQsT2JqZWN0KSxhPWUub2JqLG89ZS5rO2Fbb109YVtvXXx8W10sciYmKGFbb109YVtvXS5jb25jYXQobikpLHJ8fGFbb10ucHVzaChuKX1mdW5jdGlvbiBaKGksdCl7dmFyIG49b2UoaSx0KSxyPW4ub2JqLGU9bi5rO2lmKHIpcmV0dXJuIHJbZV19ZnVuY3Rpb24gT2UoaSx0LG4pe3ZhciByPVooaSxuKTtyZXR1cm4gciE9PXZvaWQgMD9yOloodCxuKX1mdW5jdGlvbiB3ZShpLHQsbil7Zm9yKHZhciByIGluIHQpciE9PSJfX3Byb3RvX18iJiZyIT09ImNvbnN0cnVjdG9yIiYmKHIgaW4gaT90eXBlb2YgaVtyXT09InN0cmluZyJ8fGlbcl1pbnN0YW5jZW9mIFN0cmluZ3x8dHlwZW9mIHRbcl09PSJzdHJpbmcifHx0W3JdaW5zdGFuY2VvZiBTdHJpbmc/biYmKGlbcl09dFtyXSk6d2UoaVtyXSx0W3JdLG4pOmlbcl09dFtyXSk7cmV0dXJuIGl9ZnVuY3Rpb24gQShpKXtyZXR1cm4gaS5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csIlxcJCYiKX12YXIgZXQ9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiB0dChpKXtyZXR1cm4gdHlwZW9mIGk9PSJzdHJpbmciP2kucmVwbGFjZSgvWyY8PiInXC9dL2csZnVuY3Rpb24odCl7cmV0dXJuIGV0W3RdfSk6aX12YXIgcT10eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93Lm5hdmlnYXRvciYmdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50RGF0YT4idSImJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+LTEsbnQ9WyIgIiwiLCIsIj8iLCIhIiwiOyJdO2Z1bmN0aW9uIHJ0KGksdCxuKXt0PXR8fCIiLG49bnx8IiI7dmFyIHI9bnQuZmlsdGVyKGZ1bmN0aW9uKHMpe3JldHVybiB0LmluZGV4T2Yocyk8MCYmbi5pbmRleE9mKHMpPDB9KTtpZihyLmxlbmd0aD09PTApcmV0dXJuITA7dmFyIGU9bmV3IFJlZ0V4cCgiKCIuY29uY2F0KHIubWFwKGZ1bmN0aW9uKHMpe3JldHVybiBzPT09Ij8iPyJcXD8iOnN9KS5qb2luKCJ8IiksIikiKSksYT0hZS50ZXN0KGkpO2lmKCFhKXt2YXIgbz1pLmluZGV4T2Yobik7bz4wJiYhZS50ZXN0KGkuc3Vic3RyaW5nKDAsbykpJiYoYT0hMCl9cmV0dXJuIGF9ZnVuY3Rpb24gU2UoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBYKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP1NlKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtGKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlNlKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiBhdChpKXt2YXIgdD1pdCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWooaSksZTtpZih0KXt2YXIgYT1qKHRoaXMpLmNvbnN0cnVjdG9yO2U9UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsYSl9ZWxzZSBlPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBWKHRoaXMsZSl9fWZ1bmN0aW9uIGl0KCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIHhlKGksdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiIuIjtpZihpKXtpZihpW3RdKXJldHVybiBpW3RdO2Zvcih2YXIgcj10LnNwbGl0KG4pLGU9aSxhPTA7YTxyLmxlbmd0aDsrK2Epe2lmKCFlfHx0eXBlb2YgZVtyW2FdXT09InN0cmluZyImJmErMTxyLmxlbmd0aClyZXR1cm47aWYoZVtyW2FdXT09PXZvaWQgMCl7Zm9yKHZhciBvPTIscz1yLnNsaWNlKGEsYStvKS5qb2luKG4pLHU9ZVtzXTt1PT09dm9pZCAwJiZyLmxlbmd0aD5hK287KW8rKyxzPXIuc2xpY2UoYSxhK28pLmpvaW4obiksdT1lW3NdO2lmKHU9PT12b2lkIDApcmV0dXJuO2lmKHU9PT1udWxsKXJldHVybiBudWxsO2lmKHQuZW5kc1dpdGgocykpe2lmKHR5cGVvZiB1PT0ic3RyaW5nIilyZXR1cm4gdTtpZihzJiZ0eXBlb2YgdVtzXT09InN0cmluZyIpcmV0dXJuIHVbc119dmFyIGw9ci5zbGljZShhK28pLmpvaW4obik7cmV0dXJuIGw/eGUodSxsLG4pOnZvaWQgMH1lPWVbclthXV19cmV0dXJuIGV9fXZhciBvdD1mdW5jdGlvbihpKXtRKG4saSk7dmFyIHQ9YXQobik7ZnVuY3Rpb24gbihyKXt2YXIgZSxhPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7bnM6WyJ0cmFuc2xhdGlvbiJdLGRlZmF1bHROUzoidHJhbnNsYXRpb24ifTtyZXR1cm4gUih0aGlzLG4pLGU9dC5jYWxsKHRoaXMpLHEmJkkuY2FsbChfKGUpKSxlLmRhdGE9cnx8e30sZS5vcHRpb25zPWEsZS5vcHRpb25zLmtleVNlcGFyYXRvcj09PXZvaWQgMCYmKGUub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxlLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZT09PXZvaWQgMCYmKGUub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlPSEwKSxlfXJldHVybiBrKG4sW3trZXk6ImFkZE5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucy5ucy5pbmRleE9mKGUpPDAmJnRoaXMub3B0aW9ucy5ucy5wdXNoKGUpfX0se2tleToicmVtb3ZlTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcy5vcHRpb25zLm5zLmluZGV4T2YoZSk7YT4tMSYmdGhpcy5vcHRpb25zLm5zLnNwbGljZShhLDEpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106e30sdT1zLmtleVNlcGFyYXRvciE9PXZvaWQgMD9zLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGw9cy5pZ25vcmVKU09OU3RydWN0dXJlIT09dm9pZCAwP3MuaWdub3JlSlNPTlN0cnVjdHVyZTp0aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSxjPVtlLGFdO28mJnR5cGVvZiBvIT0ic3RyaW5nIiYmKGM9Yy5jb25jYXQobykpLG8mJnR5cGVvZiBvPT0ic3RyaW5nIiYmKGM9Yy5jb25jYXQodT9vLnNwbGl0KHUpOm8pKSxlLmluZGV4T2YoIi4iKT4tMSYmKGM9ZS5zcGxpdCgiLiIpKTt2YXIgZj1aKHRoaXMuZGF0YSxjKTtyZXR1cm4gZnx8IWx8fHR5cGVvZiBvIT0ic3RyaW5nIj9mOnhlKHRoaXMuZGF0YSYmdGhpcy5kYXRhW2VdJiZ0aGlzLmRhdGFbZV1bYV0sbyx1KX19LHtrZXk6ImFkZFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyxzKXt2YXIgdT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06e3NpbGVudDohMX0sbD10aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO2w9PT12b2lkIDAmJihsPSIuIik7dmFyIGM9W2UsYV07byYmKGM9Yy5jb25jYXQobD9vLnNwbGl0KGwpOm8pKSxlLmluZGV4T2YoIi4iKT4tMSYmKGM9ZS5zcGxpdCgiLiIpLHM9YSxhPWNbMV0pLHRoaXMuYWRkTmFtZXNwYWNlcyhhKSxiZSh0aGlzLmRhdGEsYyxzKSx1LnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsZSxhLG8scyl9fSx7a2V5OiJhZGRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106e3NpbGVudDohMX07Zm9yKHZhciB1IGluIG8pKHR5cGVvZiBvW3VdPT0ic3RyaW5nInx8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShvW3VdKT09PSJbb2JqZWN0IEFycmF5XSIpJiZ0aGlzLmFkZFJlc291cmNlKGUsYSx1LG9bdV0se3NpbGVudDohMH0pO3Muc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIixlLGEsbyl9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8scyx1KXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06e3NpbGVudDohMX0sYz1bZSxhXTtlLmluZGV4T2YoIi4iKT4tMSYmKGM9ZS5zcGxpdCgiLiIpLHM9byxvPWEsYT1jWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoYSk7dmFyIGY9Wih0aGlzLmRhdGEsYyl8fHt9O3M/d2UoZixvLHUpOmY9WChYKHt9LGYpLG8pLGJlKHRoaXMuZGF0YSxjLGYpLGwuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIixlLGEsbyl9fSx7a2V5OiJyZW1vdmVSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXt0aGlzLmhhc1Jlc291cmNlQnVuZGxlKGUsYSkmJmRlbGV0ZSB0aGlzLmRhdGFbZV1bYV0sdGhpcy5yZW1vdmVOYW1lc3BhY2VzKGEpLHRoaXMuZW1pdCgicmVtb3ZlZCIsZSxhKX19LHtrZXk6Imhhc1Jlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbihlLGEpe3JldHVybiB0aGlzLmdldFJlc291cmNlKGUsYSkhPT12b2lkIDB9fSx7a2V5OiJnZXRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXtyZXR1cm4gYXx8KGE9dGhpcy5vcHRpb25zLmRlZmF1bHROUyksdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk9PT0idjEiP1goWCh7fSx7fSksdGhpcy5nZXRSZXNvdXJjZShlLGEpKTp0aGlzLmdldFJlc291cmNlKGUsYSl9fSx7a2V5OiJnZXREYXRhQnlMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZGF0YVtlXX19LHtrZXk6Imhhc0xhbmd1YWdlU29tZVRyYW5zbGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcy5nZXREYXRhQnlMYW5ndWFnZShlKSxvPWEmJk9iamVjdC5rZXlzKGEpfHxbXTtyZXR1cm4hIW8uZmluZChmdW5jdGlvbihzKXtyZXR1cm4gYVtzXSYmT2JqZWN0LmtleXMoYVtzXSkubGVuZ3RoPjB9KX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX1dKSxufShJKSxQZT17cHJvY2Vzc29yczp7fSxhZGRQb3N0UHJvY2Vzc29yOmZ1bmN0aW9uKHQpe3RoaXMucHJvY2Vzc29yc1t0Lm5hbWVdPXR9LGhhbmRsZTpmdW5jdGlvbih0LG4scixlLGEpe3ZhciBvPXRoaXM7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihzKXtvLnByb2Nlc3NvcnNbc10mJihuPW8ucHJvY2Vzc29yc1tzXS5wcm9jZXNzKG4scixlLGEpKX0pLG59fTtmdW5jdGlvbiBMZShpLHQpe3ZhciBuPU9iamVjdC5rZXlzKGkpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIHcoaSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdIT1udWxsP2FyZ3VtZW50c1t0XTp7fTt0JTI/TGUoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe0YoaSxyLG5bcl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6TGUoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHIsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHIpKX0pfXJldHVybiBpfWZ1bmN0aW9uIHN0KGkpe3ZhciB0PXV0KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9aihpKSxlO2lmKHQpe3ZhciBhPWoodGhpcykuY29uc3RydWN0b3I7ZT1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxhKX1lbHNlIGU9ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIFYodGhpcyxlKX19ZnVuY3Rpb24gdXQoKXtpZih0eXBlb2YgUmVmbGVjdD4idSJ8fCFSZWZsZWN0LmNvbnN0cnVjdHx8UmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZih0eXBlb2YgUHJveHk9PSJmdW5jdGlvbiIpcmV0dXJuITA7dHJ5e3JldHVybiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbixbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaHtyZXR1cm4hMX19dmFyIFJlPXt9LGtlPWZ1bmN0aW9uKGkpe1EobixpKTt2YXIgdD1zdChuKTtmdW5jdGlvbiBuKHIpe3ZhciBlLGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O3JldHVybiBSKHRoaXMsbiksZT10LmNhbGwodGhpcykscSYmSS5jYWxsKF8oZSkpLHFlKFsicmVzb3VyY2VTdG9yZSIsImxhbmd1YWdlVXRpbHMiLCJwbHVyYWxSZXNvbHZlciIsImludGVycG9sYXRvciIsImJhY2tlbmRDb25uZWN0b3IiLCJpMThuRm9ybWF0IiwidXRpbHMiXSxyLF8oZSkpLGUub3B0aW9ucz1hLGUub3B0aW9ucy5rZXlTZXBhcmF0b3I9PT12b2lkIDAmJihlLm9wdGlvbnMua2V5U2VwYXJhdG9yPSIuIiksZS5sb2dnZXI9Ti5jcmVhdGUoInRyYW5zbGF0b3IiKSxlfXJldHVybiBrKG4sW3trZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbihlKXtlJiYodGhpcy5sYW5ndWFnZT1lKX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fTtpZihlPT1udWxsKXJldHVybiExO3ZhciBvPXRoaXMucmVzb2x2ZShlLGEpO3JldHVybiBvJiZvLnJlcyE9PXZvaWQgMH19LHtrZXk6ImV4dHJhY3RGcm9tS2V5Iix2YWx1ZTpmdW5jdGlvbihlLGEpe3ZhciBvPWEubnNTZXBhcmF0b3IhPT12b2lkIDA/YS5uc1NlcGFyYXRvcjp0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7bz09PXZvaWQgMCYmKG89IjoiKTt2YXIgcz1hLmtleVNlcGFyYXRvciE9PXZvaWQgMD9hLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLHU9YS5uc3x8dGhpcy5vcHRpb25zLmRlZmF1bHROU3x8W10sbD1vJiZlLmluZGV4T2Yobyk+LTEsYz0hdGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yJiYhYS5rZXlTZXBhcmF0b3ImJiF0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvciYmIWEubnNTZXBhcmF0b3ImJiFydChlLG8scyk7aWYobCYmIWMpe3ZhciBmPWUubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7aWYoZiYmZi5sZW5ndGg+MClyZXR1cm57a2V5OmUsbmFtZXNwYWNlczp1fTt2YXIgZz1lLnNwbGl0KG8pOyhvIT09c3x8bz09PXMmJnRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGdbMF0pPi0xKSYmKHU9Zy5zaGlmdCgpKSxlPWcuam9pbihzKX1yZXR1cm4gdHlwZW9mIHU9PSJzdHJpbmciJiYodT1bdV0pLHtrZXk6ZSxuYW1lc3BhY2VzOnV9fX0se2tleToidHJhbnNsYXRlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHM9dGhpcztpZihQKGEpIT09Im9iamVjdCImJnRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlciYmKGE9dGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cykpLGF8fChhPXt9KSxlPT1udWxsKXJldHVybiIiO0FycmF5LmlzQXJyYXkoZSl8fChlPVtTdHJpbmcoZSldKTt2YXIgdT1hLnJldHVybkRldGFpbHMhPT12b2lkIDA/YS5yZXR1cm5EZXRhaWxzOnRoaXMub3B0aW9ucy5yZXR1cm5EZXRhaWxzLGw9YS5rZXlTZXBhcmF0b3IhPT12b2lkIDA/YS5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixjPXRoaXMuZXh0cmFjdEZyb21LZXkoZVtlLmxlbmd0aC0xXSxhKSxmPWMua2V5LGc9Yy5uYW1lc3BhY2VzLHA9Z1tnLmxlbmd0aC0xXSx2PWEubG5nfHx0aGlzLmxhbmd1YWdlLHk9YS5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZXx8dGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlO2lmKHYmJnYudG9Mb3dlckNhc2UoKT09PSJjaW1vZGUiKXtpZih5KXt2YXIgbT1hLm5zU2VwYXJhdG9yfHx0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7cmV0dXJuIHU/KGQucmVzPSIiLmNvbmNhdChwKS5jb25jYXQobSkuY29uY2F0KGYpLGQpOiIiLmNvbmNhdChwKS5jb25jYXQobSkuY29uY2F0KGYpfXJldHVybiB1PyhkLnJlcz1mLGQpOmZ9dmFyIGQ9dGhpcy5yZXNvbHZlKGUsYSksaD1kJiZkLnJlcyxPPWQmJmQudXNlZEtleXx8ZixiPWQmJmQuZXhhY3RVc2VkS2V5fHxmLHg9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoKSxFPVsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXSxUPWEuam9pbkFycmF5cyE9PXZvaWQgMD9hLmpvaW5BcnJheXM6dGhpcy5vcHRpb25zLmpvaW5BcnJheXMsSD0hdGhpcy5pMThuRm9ybWF0fHx0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3QsSj10eXBlb2YgaCE9InN0cmluZyImJnR5cGVvZiBoIT0iYm9vbGVhbiImJnR5cGVvZiBoIT0ibnVtYmVyIjtpZihIJiZoJiZKJiZFLmluZGV4T2YoeCk8MCYmISh0eXBlb2YgVD09InN0cmluZyImJng9PT0iW29iamVjdCBBcnJheV0iKSl7aWYoIWEucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXt0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyfHx0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKTt2YXIgVT10aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIoTyxoLHcodyh7fSxhKSx7fSx7bnM6Z30pKToia2V5ICciLmNvbmNhdChmLCIgKCIpLmNvbmNhdCh0aGlzLmxhbmd1YWdlLCIpJyByZXR1cm5lZCBhbiBvYmplY3QgaW5zdGVhZCBvZiBzdHJpbmcuIik7cmV0dXJuIHU/KGQucmVzPVUsZCk6VX1pZihsKXt2YXIgQWU9eD09PSJbb2JqZWN0IEFycmF5XSIsbmU9QWU/W106e30sTXQ9QWU/YjpPO2Zvcih2YXIgTSBpbiBoKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoLE0pKXt2YXIgS2U9IiIuY29uY2F0KE10KS5jb25jYXQobCkuY29uY2F0KE0pO25lW01dPXRoaXMudHJhbnNsYXRlKEtlLHcodyh7fSxhKSx7am9pbkFycmF5czohMSxuczpnfSkpLG5lW01dPT09S2UmJihuZVtNXT1oW01dKX1oPW5lfX1lbHNlIGlmKEgmJnR5cGVvZiBUPT0ic3RyaW5nIiYmeD09PSJbb2JqZWN0IEFycmF5XSIpaD1oLmpvaW4oVCksaCYmKGg9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihoLGUsYSxvKSk7ZWxzZXt2YXIgcmU9ITEsej0hMSxVZT1hLmNvdW50IT09dm9pZCAwJiZ0eXBlb2YgYS5jb3VudCE9InN0cmluZyIsZmU9bi5oYXNEZWZhdWx0VmFsdWUoYSksQnQ9VWU/dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgodixhLmNvdW50LGEpOiIiLFc9YVsiZGVmYXVsdFZhbHVlIi5jb25jYXQoQnQpXXx8YS5kZWZhdWx0VmFsdWU7IXRoaXMuaXNWYWxpZExvb2t1cChoKSYmZmUmJihyZT0hMCxoPVcpLHRoaXMuaXNWYWxpZExvb2t1cChoKXx8KHo9ITAsaD1mKTt2YXIgVnQ9YS5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXl8fHRoaXMub3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXksJHQ9VnQmJno/dm9pZCAwOmgsWT1mZSYmVyE9PWgmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKHp8fHJlfHxZKXtpZih0aGlzLmxvZ2dlci5sb2coWT8idXBkYXRlS2V5IjoibWlzc2luZ0tleSIsdixwLGYsWT9XOmgpLGwpe3ZhciBNZT10aGlzLnJlc29sdmUoZix3KHcoe30sYSkse30se2tleVNlcGFyYXRvcjohMX0pKTtNZSYmTWUucmVzJiZ0aGlzLmxvZ2dlci53YXJuKCJTZWVtcyB0aGUgbG9hZGVkIHRyYW5zbGF0aW9ucyB3ZXJlIGluIGZsYXQgSlNPTiBmb3JtYXQgaW5zdGVhZCBvZiBuZXN0ZWQuIEVpdGhlciBzZXQga2V5U2VwYXJhdG9yOiBmYWxzZSBvbiBpbml0IG9yIG1ha2Ugc3VyZSB5b3VyIHRyYW5zbGF0aW9ucyBhcmUgcHVibGlzaGVkIGluIG5lc3RlZCBmb3JtYXQuIil9dmFyIEc9W10sYWU9dGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGEubG5nfHx0aGlzLmxhbmd1YWdlKTtpZih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz09PSJmYWxsYmFjayImJmFlJiZhZVswXSlmb3IodmFyIGxlPTA7bGU8YWUubGVuZ3RoO2xlKyspRy5wdXNoKGFlW2xlXSk7ZWxzZSB0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz09PSJhbGwiP0c9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShhLmxuZ3x8dGhpcy5sYW5ndWFnZSk6Ry5wdXNoKGEubG5nfHx0aGlzLmxhbmd1YWdlKTt2YXIgQmU9ZnVuY3Rpb24oQixnZSxWZSl7dmFyICRlPWZlJiZWZSE9PWg/VmU6JHQ7cy5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyP3Mub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcihCLHAsZ2UsJGUsWSxhKTpzLmJhY2tlbmRDb25uZWN0b3ImJnMuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyYmcy5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nKEIscCxnZSwkZSxZLGEpLHMuZW1pdCgibWlzc2luZ0tleSIsQixwLGdlLGgpfTt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmcmJih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZVZT9HLmZvckVhY2goZnVuY3Rpb24oY2Upe3MucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4ZXMoY2UsYSkuZm9yRWFjaChmdW5jdGlvbihCKXtCZShbY2VdLGYrQixhWyJkZWZhdWx0VmFsdWUiLmNvbmNhdChCKV18fFcpfSl9KTpCZShHLGYsVykpfWg9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihoLGUsYSxkLG8pLHomJmg9PT1mJiZ0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5JiYoaD0iIi5jb25jYXQocCwiOiIpLmNvbmNhdChmKSksKHp8fHJlKSYmdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXImJih0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSE9PSJ2MSI/aD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcih0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5PyIiLmNvbmNhdChwLCI6IikuY29uY2F0KGYpOmYscmU/aDp2b2lkIDApOmg9dGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIoaCkpfXJldHVybiB1PyhkLnJlcz1oLGQpOmh9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8scyx1KXt2YXIgbD10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKWU9dGhpcy5pMThuRm9ybWF0LnBhcnNlKGUsdyh3KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLG8pLHMudXNlZExuZyxzLnVzZWROUyxzLnVzZWRLZXkse3Jlc29sdmVkOnN9KTtlbHNlIGlmKCFvLnNraXBJbnRlcnBvbGF0aW9uKXtvLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLmluaXQodyh3KHt9LG8pLHtpbnRlcnBvbGF0aW9uOncodyh7fSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiksby5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgYz10eXBlb2YgZT09InN0cmluZyImJihvJiZvLmludGVycG9sYXRpb24mJm8uaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMhPT12b2lkIDA/by5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlczp0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMpLGY7aWYoYyl7dmFyIGc9ZS5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtmPWcmJmcubGVuZ3RofXZhciBwPW8ucmVwbGFjZSYmdHlwZW9mIG8ucmVwbGFjZSE9InN0cmluZyI/by5yZXBsYWNlOm87aWYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyYmKHA9dyh3KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLHApKSxlPXRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKGUscCxvLmxuZ3x8dGhpcy5sYW5ndWFnZSxvKSxjKXt2YXIgdj1lLm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApLHk9diYmdi5sZW5ndGg7Zjx5JiYoby5uZXN0PSExKX1vLm5lc3QhPT0hMSYmKGU9dGhpcy5pbnRlcnBvbGF0b3IubmVzdChlLGZ1bmN0aW9uKCl7Zm9yKHZhciBoPWFyZ3VtZW50cy5sZW5ndGgsTz1uZXcgQXJyYXkoaCksYj0wO2I8aDtiKyspT1tiXT1hcmd1bWVudHNbYl07cmV0dXJuIHUmJnVbMF09PT1PWzBdJiYhby5jb250ZXh0PyhsLmxvZ2dlci53YXJuKCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAiLmNvbmNhdChPWzBdLCIgaW4ga2V5OiAiKS5jb25jYXQoYVswXSkpLG51bGwpOmwudHJhbnNsYXRlLmFwcGx5KGwsTy5jb25jYXQoW2FdKSl9LG8pKSxvLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIG09by5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLGQ9dHlwZW9mIG09PSJzdHJpbmciP1ttXTptO3JldHVybiBlIT1udWxsJiZkJiZkLmxlbmd0aCYmby5hcHBseVBvc3RQcm9jZXNzb3IhPT0hMSYmKGU9UGUuaGFuZGxlKGQsZSxhLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkP3coe2kxOG5SZXNvbHZlZDpzfSxvKTpvLHRoaXMpKSxlfX0se2tleToicmVzb2x2ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcyxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxzLHUsbCxjLGY7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKSxlLmZvckVhY2goZnVuY3Rpb24oZyl7aWYoIWEuaXNWYWxpZExvb2t1cChzKSl7dmFyIHA9YS5leHRyYWN0RnJvbUtleShnLG8pLHY9cC5rZXk7dT12O3ZhciB5PXAubmFtZXNwYWNlczthLm9wdGlvbnMuZmFsbGJhY2tOUyYmKHk9eS5jb25jYXQoYS5vcHRpb25zLmZhbGxiYWNrTlMpKTt2YXIgbT1vLmNvdW50IT09dm9pZCAwJiZ0eXBlb2Ygby5jb3VudCE9InN0cmluZyIsZD1tJiYhby5vcmRpbmFsJiZvLmNvdW50PT09MCYmYS5wbHVyYWxSZXNvbHZlci5zaG91bGRVc2VJbnRsQXBpKCksaD1vLmNvbnRleHQhPT12b2lkIDAmJih0eXBlb2Ygby5jb250ZXh0PT0ic3RyaW5nInx8dHlwZW9mIG8uY29udGV4dD09Im51bWJlciIpJiZvLmNvbnRleHQhPT0iIixPPW8ubG5ncz9vLmxuZ3M6YS5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvLmxuZ3x8YS5sYW5ndWFnZSxvLmZhbGxiYWNrTG5nKTt5LmZvckVhY2goZnVuY3Rpb24oYil7YS5pc1ZhbGlkTG9va3VwKHMpfHwoZj1iLCFSZVsiIi5jb25jYXQoT1swXSwiLSIpLmNvbmNhdChiKV0mJmEudXRpbHMmJmEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UoZikmJihSZVsiIi5jb25jYXQoT1swXSwiLSIpLmNvbmNhdChiKV09ITAsYS5sb2dnZXIud2Fybigna2V5ICInLmNvbmNhdCh1LCciIGZvciBsYW5ndWFnZXMgIicpLmNvbmNhdChPLmpvaW4oIiwgIiksYCIgd29uJ3QgZ2V0IHJlc29sdmVkIGFzIG5hbWVzcGFjZSAiYCkuY29uY2F0KGYsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpKSxPLmZvckVhY2goZnVuY3Rpb24oeCl7aWYoIWEuaXNWYWxpZExvb2t1cChzKSl7Yz14O3ZhciBFPVt2XTtpZihhLmkxOG5Gb3JtYXQmJmEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKWEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKEUsdix4LGIsbyk7ZWxzZXt2YXIgVDttJiYoVD1hLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeCh4LG8uY291bnQsbykpO3ZhciBIPSIiLmNvbmNhdChhLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLCJ6ZXJvIik7aWYobSYmKEUucHVzaCh2K1QpLGQmJkUucHVzaCh2K0gpKSxoKXt2YXIgSj0iIi5jb25jYXQodikuY29uY2F0KGEub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQoby5jb250ZXh0KTtFLnB1c2goSiksbSYmKEUucHVzaChKK1QpLGQmJkUucHVzaChKK0gpKX19Zm9yKHZhciBVO1U9RS5wb3AoKTspYS5pc1ZhbGlkTG9va3VwKHMpfHwobD1VLHM9YS5nZXRSZXNvdXJjZSh4LGIsVSxvKSl9fSkpfSl9fSkse3JlczpzLHVzZWRLZXk6dSxleGFjdFVzZWRLZXk6bCx1c2VkTG5nOmMsdXNlZE5TOmZ9fX0se2tleToiaXNWYWxpZExvb2t1cCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJiEoIXRoaXMub3B0aW9ucy5yZXR1cm5OdWxsJiZlPT09bnVsbCkmJiEoIXRoaXMub3B0aW9ucy5yZXR1cm5FbXB0eVN0cmluZyYmZT09PSIiKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOnt9O3JldHVybiB0aGlzLmkxOG5Gb3JtYXQmJnRoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZT90aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2UoZSxhLG8scyk6dGhpcy5yZXNvdXJjZVN0b3JlLmdldFJlc291cmNlKGUsYSxvLHMpfX1dLFt7a2V5OiJoYXNEZWZhdWx0VmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPSJkZWZhdWx0VmFsdWUiO2Zvcih2YXIgbyBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiZhPT09by5zdWJzdHJpbmcoMCxhLmxlbmd0aCkmJmVbb10hPT12b2lkIDApcmV0dXJuITA7cmV0dXJuITF9fV0pLG59KEkpO2Z1bmN0aW9uIHNlKGkpe3JldHVybiBpLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2kuc2xpY2UoMSl9dmFyIGZ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSh0KXtSKHRoaXMsaSksdGhpcy5vcHRpb25zPXQsdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgibGFuZ3VhZ2VVdGlscyIpfXJldHVybiBrKGksW3trZXk6ImdldFNjcmlwdFBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7aWYoIW58fG4uaW5kZXhPZigiLSIpPDApcmV0dXJuIG51bGw7dmFyIHI9bi5zcGxpdCgiLSIpO3JldHVybiByLmxlbmd0aD09PTJ8fChyLnBvcCgpLHJbci5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKT09PSJ4Iik/bnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShyLmpvaW4oIi0iKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7aWYoIW58fG4uaW5kZXhPZigiLSIpPDApcmV0dXJuIG47dmFyIHI9bi5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShyWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7aWYodHlwZW9mIG49PSJzdHJpbmciJiZuLmluZGV4T2YoIi0iKT4tMSl7dmFyIHI9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sZT1uLnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/ZT1lLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS50b0xvd2VyQ2FzZSgpfSk6ZS5sZW5ndGg9PT0yPyhlWzBdPWVbMF0udG9Mb3dlckNhc2UoKSxlWzFdPWVbMV0udG9VcHBlckNhc2UoKSxyLmluZGV4T2YoZVsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKGVbMV09c2UoZVsxXS50b0xvd2VyQ2FzZSgpKSkpOmUubGVuZ3RoPT09MyYmKGVbMF09ZVswXS50b0xvd2VyQ2FzZSgpLGVbMV0ubGVuZ3RoPT09MiYmKGVbMV09ZVsxXS50b1VwcGVyQ2FzZSgpKSxlWzBdIT09InNnbiImJmVbMl0ubGVuZ3RoPT09MiYmKGVbMl09ZVsyXS50b1VwcGVyQ2FzZSgpKSxyLmluZGV4T2YoZVsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKGVbMV09c2UoZVsxXS50b0xvd2VyQ2FzZSgpKSksci5pbmRleE9mKGVbMl0udG9Mb3dlckNhc2UoKSk+LTEmJihlWzJdPXNlKGVbMl0udG9Mb3dlckNhc2UoKSkpKSxlLmpvaW4oIi0iKX1yZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZXx8dGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz9uLnRvTG93ZXJDYXNlKCk6bn19LHtrZXk6ImlzU3VwcG9ydGVkQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7cmV0dXJuKHRoaXMub3B0aW9ucy5sb2FkPT09Imxhbmd1YWdlT25seSJ8fHRoaXMub3B0aW9ucy5ub25FeHBsaWNpdFN1cHBvcnRlZExuZ3MpJiYobj10aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKG4pKSwhdGhpcy5zdXBwb3J0ZWRMbmdzfHwhdGhpcy5zdXBwb3J0ZWRMbmdzLmxlbmd0aHx8dGhpcy5zdXBwb3J0ZWRMbmdzLmluZGV4T2Yobik+LTF9fSx7a2V5OiJnZXRCZXN0TWF0Y2hGcm9tQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPXRoaXM7aWYoIW4pcmV0dXJuIG51bGw7dmFyIGU7cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihhKXtpZighZSl7dmFyIG89ci5mb3JtYXRMYW5ndWFnZUNvZGUoYSk7KCFyLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ci5pc1N1cHBvcnRlZENvZGUobykpJiYoZT1vKX19KSwhZSYmdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MmJm4uZm9yRWFjaChmdW5jdGlvbihhKXtpZighZSl7dmFyIG89ci5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShhKTtpZihyLmlzU3VwcG9ydGVkQ29kZShvKSlyZXR1cm4gZT1vO2U9ci5vcHRpb25zLnN1cHBvcnRlZExuZ3MuZmluZChmdW5jdGlvbihzKXtpZihzLmluZGV4T2Yobyk9PT0wKXJldHVybiBzfSl9fSksZXx8KGU9dGhpcy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZylbMF0pLGV9fSx7a2V5OiJnZXRGYWxsYmFja0NvZGVzIix2YWx1ZTpmdW5jdGlvbihuLHIpe2lmKCFuKXJldHVybltdO2lmKHR5cGVvZiBuPT0iZnVuY3Rpb24iJiYobj1uKHIpKSx0eXBlb2Ygbj09InN0cmluZyImJihuPVtuXSksT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKT09PSJbb2JqZWN0IEFycmF5XSIpcmV0dXJuIG47aWYoIXIpcmV0dXJuIG4uZGVmYXVsdHx8W107dmFyIGU9bltyXTtyZXR1cm4gZXx8KGU9blt0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShyKV0pLGV8fChlPW5bdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUocildKSxlfHwoZT1uW3RoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUocildKSxlfHwoZT1uLmRlZmF1bHQpLGV8fFtdfX0se2tleToidG9SZXNvbHZlSGllcmFyY2h5Iix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBlPXRoaXMsYT10aGlzLmdldEZhbGxiYWNrQ29kZXMocnx8dGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nfHxbXSxuKSxvPVtdLHM9ZnVuY3Rpb24obCl7bCYmKGUuaXNTdXBwb3J0ZWRDb2RlKGwpP28ucHVzaChsKTplLmxvZ2dlci53YXJuKCJyZWplY3RpbmcgbGFuZ3VhZ2UgY29kZSBub3QgZm91bmQgaW4gc3VwcG9ydGVkTG5nczogIi5jb25jYXQobCkpKX07cmV0dXJuIHR5cGVvZiBuPT0ic3RyaW5nIiYmbi5pbmRleE9mKCItIik+LTE/KHRoaXMub3B0aW9ucy5sb2FkIT09Imxhbmd1YWdlT25seSImJnModGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUobikpLHRoaXMub3B0aW9ucy5sb2FkIT09Imxhbmd1YWdlT25seSImJnRoaXMub3B0aW9ucy5sb2FkIT09ImN1cnJlbnRPbmx5IiYmcyh0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShuKSksdGhpcy5vcHRpb25zLmxvYWQhPT0iY3VycmVudE9ubHkiJiZzKHRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUobikpKTp0eXBlb2Ygbj09InN0cmluZyImJnModGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUobikpLGEuZm9yRWFjaChmdW5jdGlvbih1KXtvLmluZGV4T2YodSk8MCYmcyhlLmZvcm1hdExhbmd1YWdlQ29kZSh1KSl9KSxvfX1dKSxpfSgpLGx0PVt7bG5nczpbImFjaCIsImFrIiwiYW0iLCJhcm4iLCJiciIsImZpbCIsImd1biIsImxuIiwibWZlIiwibWciLCJtaSIsIm9jIiwicHQiLCJwdC1CUiIsInRnIiwidGwiLCJ0aSIsInRyIiwidXoiLCJ3YSJdLG5yOlsxLDJdLGZjOjF9LHtsbmdzOlsiYWYiLCJhbiIsImFzdCIsImF6IiwiYmciLCJibiIsImNhIiwiZGEiLCJkZSIsImRldiIsImVsIiwiZW4iLCJlbyIsImVzIiwiZXQiLCJldSIsImZpIiwiZm8iLCJmdXIiLCJmeSIsImdsIiwiZ3UiLCJoYSIsImhpIiwiaHUiLCJoeSIsImlhIiwiaXQiLCJrayIsImtuIiwia3UiLCJsYiIsIm1haSIsIm1sIiwibW4iLCJtciIsIm5haCIsIm5hcCIsIm5iIiwibmUiLCJubCIsIm5uIiwibm8iLCJuc28iLCJwYSIsInBhcCIsInBtcyIsInBzIiwicHQtUFQiLCJybSIsInNjbyIsInNlIiwic2kiLCJzbyIsInNvbiIsInNxIiwic3YiLCJzdyIsInRhIiwidGUiLCJ0ayIsInVyIiwieW8iXSxucjpbMSwyXSxmYzoyfSx7bG5nczpbImF5IiwiYm8iLCJjZ2ciLCJmYSIsImh0IiwiaWQiLCJqYSIsImpibyIsImthIiwia20iLCJrbyIsImt5IiwibG8iLCJtcyIsInNhaCIsInN1IiwidGgiLCJ0dCIsInVnIiwidmkiLCJ3byIsInpoIl0sbnI6WzFdLGZjOjN9LHtsbmdzOlsiYmUiLCJicyIsImNuciIsImR6IiwiaHIiLCJydSIsInNyIiwidWsiXSxucjpbMSwyLDVdLGZjOjR9LHtsbmdzOlsiYXIiXSxucjpbMCwxLDIsMywxMSwxMDBdLGZjOjV9LHtsbmdzOlsiY3MiLCJzayJdLG5yOlsxLDIsNV0sZmM6Nn0se2xuZ3M6WyJjc2IiLCJwbCJdLG5yOlsxLDIsNV0sZmM6N30se2xuZ3M6WyJjeSJdLG5yOlsxLDIsMyw4XSxmYzo4fSx7bG5nczpbImZyIl0sbnI6WzEsMl0sZmM6OX0se2xuZ3M6WyJnYSJdLG5yOlsxLDIsMyw3LDExXSxmYzoxMH0se2xuZ3M6WyJnZCJdLG5yOlsxLDIsMywyMF0sZmM6MTF9LHtsbmdzOlsiaXMiXSxucjpbMSwyXSxmYzoxMn0se2xuZ3M6WyJqdiJdLG5yOlswLDFdLGZjOjEzfSx7bG5nczpbImt3Il0sbnI6WzEsMiwzLDRdLGZjOjE0fSx7bG5nczpbImx0Il0sbnI6WzEsMiwxMF0sZmM6MTV9LHtsbmdzOlsibHYiXSxucjpbMSwyLDBdLGZjOjE2fSx7bG5nczpbIm1rIl0sbnI6WzEsMl0sZmM6MTd9LHtsbmdzOlsibW5rIl0sbnI6WzAsMSwyXSxmYzoxOH0se2xuZ3M6WyJtdCJdLG5yOlsxLDIsMTEsMjBdLGZjOjE5fSx7bG5nczpbIm9yIl0sbnI6WzIsMV0sZmM6Mn0se2xuZ3M6WyJybyJdLG5yOlsxLDIsMjBdLGZjOjIwfSx7bG5nczpbInNsIl0sbnI6WzUsMSwyLDNdLGZjOjIxfSx7bG5nczpbImhlIiwiaXciXSxucjpbMSwyLDIwLDIxXSxmYzoyMn1dLGN0PXsxOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD4xKX0sMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQhPTEpfSwzOmZ1bmN0aW9uKHQpe3JldHVybiAwfSw0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0wPzA6dD09MT8xOnQ9PTI/Mjp0JTEwMD49MyYmdCUxMDA8PTEwPzM6dCUxMDA+PTExPzQ6NSl9LDY6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0xPzA6dD49MiYmdDw9ND8xOjIpfSw3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQlMTA+PTImJnQlMTA8PTQmJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSw4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQ9PTI/MTp0IT04JiZ0IT0xMT8yOjMpfSw5OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD49Mil9LDEwOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQ9PTI/MTp0PDc/Mjp0PDExPzM6NCl9LDExOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MXx8dD09MTE/MDp0PT0yfHx0PT0xMj8xOnQ+MiYmdDwyMD8yOjMpfSwxMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAhPTF8fHQlMTAwPT0xMSl9LDEzOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCE9PTApfSwxNDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ9PTE/MDp0PT0yPzE6dD09Mz8yOjMpfSwxNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQlMTA+PTImJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSwxNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQhPT0wPzE6Mil9LDE3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MXx8dCUxMD09MSYmdCUxMDAhPTExPzA6MSl9LDE4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MD8wOnQ9PTE/MToyKX0sMTk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0xPzA6dD09MHx8dCUxMDA+MSYmdCUxMDA8MTE/MTp0JTEwMD4xMCYmdCUxMDA8MjA/MjozKX0sMjA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0xPzA6dD09MHx8dCUxMDA+MCYmdCUxMDA8MjA/MToyKX0sMjE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwMD09MT8xOnQlMTAwPT0yPzI6dCUxMDA9PTN8fHQlMTAwPT00PzM6MCl9LDIyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQ9PTI/MToodDwwfHx0PjEwKSYmdCUxMD09MD8yOjMpfX0sZ3Q9WyJ2MSIsInYyIiwidjMiXSxqZT17emVybzowLG9uZToxLHR3bzoyLGZldzozLG1hbnk6NCxvdGhlcjo1fTtmdW5jdGlvbiBwdCgpe3ZhciBpPXt9O3JldHVybiBsdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QubG5ncy5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lbbl09e251bWJlcnM6dC5ucixwbHVyYWxzOmN0W3QuZmNdfX0pfSksaX12YXIgZHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fTtSKHRoaXMsaSksdGhpcy5sYW5ndWFnZVV0aWxzPXQsdGhpcy5vcHRpb25zPW4sdGhpcy5sb2dnZXI9Ti5jcmVhdGUoInBsdXJhbFJlc29sdmVyIiksKCF0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT058fHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj09PSJ2NCIpJiYodHlwZW9mIEludGw+InUifHwhSW50bC5QbHVyYWxSdWxlcykmJih0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT049InYzIix0aGlzLmxvZ2dlci5lcnJvcigiWW91ciBlbnZpcm9ubWVudCBzZWVtcyBub3QgdG8gYmUgSW50bCBBUEkgY29tcGF0aWJsZSwgdXNlIGFuIEludGwuUGx1cmFsUnVsZXMgcG9seWZpbGwuIFdpbGwgZmFsbGJhY2sgdG8gdGhlIGNvbXBhdGliaWxpdHlKU09OIHYzIGZvcm1hdCBoYW5kbGluZy4iKSksdGhpcy5ydWxlcz1wdCgpfXJldHVybiBrKGksW3trZXk6ImFkZFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKG4scil7dGhpcy5ydWxlc1tuXT1yfX0se2tleToiZ2V0UnVsZSIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O2lmKHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpKXRyeXtyZXR1cm4gbmV3IEludGwuUGx1cmFsUnVsZXMobix7dHlwZTpyLm9yZGluYWw/Im9yZGluYWwiOiJjYXJkaW5hbCJ9KX1jYXRjaHtyZXR1cm59cmV0dXJuIHRoaXMucnVsZXNbbl18fHRoaXMucnVsZXNbdGhpcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKG4pXX19LHtrZXk6Im5lZWRzUGx1cmFsIix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30sZT10aGlzLmdldFJ1bGUobixyKTtyZXR1cm4gdGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/ZSYmZS5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLmxlbmd0aD4xOmUmJmUubnVtYmVycy5sZW5ndGg+MX19LHtrZXk6ImdldFBsdXJhbEZvcm1zT2ZLZXkiLHZhbHVlOmZ1bmN0aW9uKG4scil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9O3JldHVybiB0aGlzLmdldFN1ZmZpeGVzKG4sZSkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiIiLmNvbmNhdChyKS5jb25jYXQoYSl9KX19LHtrZXk6ImdldFN1ZmZpeGVzIix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj10aGlzLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LGE9dGhpcy5nZXRSdWxlKG4sZSk7cmV0dXJuIGE/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/YS5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLnNvcnQoZnVuY3Rpb24obyxzKXtyZXR1cm4gamVbb10tamVbc119KS5tYXAoZnVuY3Rpb24obyl7cmV0dXJuIiIuY29uY2F0KHIub3B0aW9ucy5wcmVwZW5kKS5jb25jYXQobyl9KTphLm51bWJlcnMubWFwKGZ1bmN0aW9uKG8pe3JldHVybiByLmdldFN1ZmZpeChuLG8sZSl9KTpbXX19LHtrZXk6ImdldFN1ZmZpeCIsdmFsdWU6ZnVuY3Rpb24obixyKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sYT10aGlzLmdldFJ1bGUobixlKTtyZXR1cm4gYT90aGlzLnNob3VsZFVzZUludGxBcGkoKT8iIi5jb25jYXQodGhpcy5vcHRpb25zLnByZXBlbmQpLmNvbmNhdChhLnNlbGVjdChyKSk6dGhpcy5nZXRTdWZmaXhSZXRyb0NvbXBhdGlibGUoYSxyKToodGhpcy5sb2dnZXIud2Fybigibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAiLmNvbmNhdChuKSksIiIpfX0se2tleToiZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlIix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBlPXRoaXMsYT1uLm5vQWJzP24ucGx1cmFscyhyKTpuLnBsdXJhbHMoTWF0aC5hYnMocikpLG89bi5udW1iZXJzW2FdO3RoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmbi5udW1iZXJzLmxlbmd0aD09PTImJm4ubnVtYmVyc1swXT09PTEmJihvPT09Mj9vPSJwbHVyYWwiOm89PT0xJiYobz0iIikpO3ZhciBzPWZ1bmN0aW9uKCl7cmV0dXJuIGUub3B0aW9ucy5wcmVwZW5kJiZvLnRvU3RyaW5nKCk/ZS5vcHRpb25zLnByZXBlbmQrby50b1N0cmluZygpOm8udG9TdHJpbmcoKX07cmV0dXJuIHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj09PSJ2MSI/bz09PTE/IiI6dHlwZW9mIG89PSJudW1iZXIiPyJfcGx1cmFsXyIuY29uY2F0KG8udG9TdHJpbmcoKSk6cygpOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj09PSJ2MiJ8fHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmbi5udW1iZXJzLmxlbmd0aD09PTImJm4ubnVtYmVyc1swXT09PTE/cygpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZhLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX19LHtrZXk6InNob3VsZFVzZUludGxBcGkiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIWd0LmluY2x1ZGVzKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTil9fV0pLGl9KCk7ZnVuY3Rpb24gTmUoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBMKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP05lKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtGKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOk5lKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX12YXIgaHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9O1IodGhpcyxpKSx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgiaW50ZXJwb2xhdG9yIiksdGhpcy5vcHRpb25zPXQsdGhpcy5mb3JtYXQ9dC5pbnRlcnBvbGF0aW9uJiZ0LmludGVycG9sYXRpb24uZm9ybWF0fHxmdW5jdGlvbihuKXtyZXR1cm4gbn0sdGhpcy5pbml0KHQpfXJldHVybiBrKGksW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9O24uaW50ZXJwb2xhdGlvbnx8KG4uaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTt2YXIgcj1uLmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9ci5lc2NhcGUhPT12b2lkIDA/ci5lc2NhcGU6dHQsdGhpcy5lc2NhcGVWYWx1ZT1yLmVzY2FwZVZhbHVlIT09dm9pZCAwP3IuZXNjYXBlVmFsdWU6ITAsdGhpcy51c2VSYXdWYWx1ZVRvRXNjYXBlPXIudXNlUmF3VmFsdWVUb0VzY2FwZSE9PXZvaWQgMD9yLnVzZVJhd1ZhbHVlVG9Fc2NhcGU6ITEsdGhpcy5wcmVmaXg9ci5wcmVmaXg/QShyLnByZWZpeCk6ci5wcmVmaXhFc2NhcGVkfHwie3siLHRoaXMuc3VmZml4PXIuc3VmZml4P0Eoci5zdWZmaXgpOnIuc3VmZml4RXNjYXBlZHx8In19Iix0aGlzLmZvcm1hdFNlcGFyYXRvcj1yLmZvcm1hdFNlcGFyYXRvcj9yLmZvcm1hdFNlcGFyYXRvcjpyLmZvcm1hdFNlcGFyYXRvcnx8IiwiLHRoaXMudW5lc2NhcGVQcmVmaXg9ci51bmVzY2FwZVN1ZmZpeD8iIjpyLnVuZXNjYXBlUHJlZml4fHwiLSIsdGhpcy51bmVzY2FwZVN1ZmZpeD10aGlzLnVuZXNjYXBlUHJlZml4PyIiOnIudW5lc2NhcGVTdWZmaXh8fCIiLHRoaXMubmVzdGluZ1ByZWZpeD1yLm5lc3RpbmdQcmVmaXg/QShyLm5lc3RpbmdQcmVmaXgpOnIubmVzdGluZ1ByZWZpeEVzY2FwZWR8fEEoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1yLm5lc3RpbmdTdWZmaXg/QShyLm5lc3RpbmdTdWZmaXgpOnIubmVzdGluZ1N1ZmZpeEVzY2FwZWR8fEEoIikiKSx0aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yPXIubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I/ci5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjpyLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yfHwiLCIsdGhpcy5tYXhSZXBsYWNlcz1yLm1heFJlcGxhY2VzP3IubWF4UmVwbGFjZXM6MWUzLHRoaXMuYWx3YXlzRm9ybWF0PXIuYWx3YXlzRm9ybWF0IT09dm9pZCAwP3IuYWx3YXlzRm9ybWF0OiExLHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgbj0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKG4sImciKTt2YXIgcj0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChyLCJnIik7dmFyIGU9IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChlLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24obixyLGUsYSl7dmFyIG89dGhpcyxzLHUsbCxjPXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGYobSl7cmV0dXJuIG0ucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBnPWZ1bmN0aW9uKGQpe2lmKGQuaW5kZXhPZihvLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIGg9T2UocixjLGQpO3JldHVybiBvLmFsd2F5c0Zvcm1hdD9vLmZvcm1hdChoLHZvaWQgMCxlLEwoTChMKHt9LGEpLHIpLHt9LHtpbnRlcnBvbGF0aW9ua2V5OmR9KSk6aH12YXIgTz1kLnNwbGl0KG8uZm9ybWF0U2VwYXJhdG9yKSxiPU8uc2hpZnQoKS50cmltKCkseD1PLmpvaW4oby5mb3JtYXRTZXBhcmF0b3IpLnRyaW0oKTtyZXR1cm4gby5mb3JtYXQoT2UocixjLGIpLHgsZSxMKEwoTCh7fSxhKSxyKSx7fSx7aW50ZXJwb2xhdGlvbmtleTpifSkpfTt0aGlzLnJlc2V0UmVnRXhwKCk7dmFyIHA9YSYmYS5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIsdj1hJiZhLmludGVycG9sYXRpb24mJmEuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMhPT12b2lkIDA/YS5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlczp0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMseT1be3JlZ2V4OnRoaXMucmVnZXhwVW5lc2NhcGUsc2FmZVZhbHVlOmZ1bmN0aW9uKGQpe3JldHVybiBmKGQpfX0se3JlZ2V4OnRoaXMucmVnZXhwLHNhZmVWYWx1ZTpmdW5jdGlvbihkKXtyZXR1cm4gby5lc2NhcGVWYWx1ZT9mKG8uZXNjYXBlKGQpKTpmKGQpfX1dO3JldHVybiB5LmZvckVhY2goZnVuY3Rpb24obSl7Zm9yKGw9MDtzPW0ucmVnZXguZXhlYyhuKTspe3ZhciBkPXNbMV0udHJpbSgpO2lmKHU9ZyhkKSx1PT09dm9pZCAwKWlmKHR5cGVvZiBwPT0iZnVuY3Rpb24iKXt2YXIgaD1wKG4scyxhKTt1PXR5cGVvZiBoPT0ic3RyaW5nIj9oOiIifWVsc2UgaWYoYSYmYS5oYXNPd25Qcm9wZXJ0eShkKSl1PSIiO2Vsc2UgaWYodil7dT1zWzBdO2NvbnRpbnVlfWVsc2Ugby5sb2dnZXIud2FybigibWlzc2VkIHRvIHBhc3MgaW4gdmFyaWFibGUgIi5jb25jYXQoZCwiIGZvciBpbnRlcnBvbGF0aW5nICIpLmNvbmNhdChuKSksdT0iIjtlbHNlIHR5cGVvZiB1IT0ic3RyaW5nIiYmIW8udXNlUmF3VmFsdWVUb0VzY2FwZSYmKHU9eWUodSkpO3ZhciBPPW0uc2FmZVZhbHVlKHUpO2lmKG49bi5yZXBsYWNlKHNbMF0sTyksdj8obS5yZWdleC5sYXN0SW5kZXgrPXUubGVuZ3RoLG0ucmVnZXgubGFzdEluZGV4LT1zWzBdLmxlbmd0aCk6bS5yZWdleC5sYXN0SW5kZXg9MCxsKyssbD49by5tYXhSZXBsYWNlcylicmVha319KSxufX0se2tleToibmVzdCIsdmFsdWU6ZnVuY3Rpb24obixyKXt2YXIgZT10aGlzLGE9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9LG8scyx1PUwoe30sYSk7dS5hcHBseVBvc3RQcm9jZXNzb3I9ITEsZGVsZXRlIHUuZGVmYXVsdFZhbHVlO2Z1bmN0aW9uIGwocCx2KXt2YXIgeT10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKHAuaW5kZXhPZih5KTwwKXJldHVybiBwO3ZhciBtPXAuc3BsaXQobmV3IFJlZ0V4cCgiIi5jb25jYXQoeSwiWyBdKnsiKSkpLGQ9InsiLmNvbmNhdChtWzFdKTtwPW1bMF0sZD10aGlzLmludGVycG9sYXRlKGQsdSk7dmFyIGg9ZC5tYXRjaCgvJy9nKSxPPWQubWF0Y2goLyIvZyk7KGgmJmgubGVuZ3RoJTI9PT0wJiYhT3x8Ty5sZW5ndGglMiE9PTApJiYoZD1kLnJlcGxhY2UoLycvZywnIicpKTt0cnl7dT1KU09OLnBhcnNlKGQpLHYmJih1PUwoTCh7fSx2KSx1KSl9Y2F0Y2goYil7cmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImZhaWxlZCBwYXJzaW5nIG9wdGlvbnMgc3RyaW5nIGluIG5lc3RpbmcgZm9yIGtleSAiLmNvbmNhdChwKSxiKSwiIi5jb25jYXQocCkuY29uY2F0KHkpLmNvbmNhdChkKX1yZXR1cm4gZGVsZXRlIHUuZGVmYXVsdFZhbHVlLHB9Zm9yKDtvPXRoaXMubmVzdGluZ1JlZ2V4cC5leGVjKG4pOyl7dmFyIGM9W10sZj0hMTtpZihvWzBdLmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpIT09LTEmJiEvey4qfS8udGVzdChvWzFdKSl7dmFyIGc9b1sxXS5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcikubWFwKGZ1bmN0aW9uKHApe3JldHVybiBwLnRyaW0oKX0pO29bMV09Zy5zaGlmdCgpLGM9ZyxmPSEwfWlmKHM9cihsLmNhbGwodGhpcyxvWzFdLnRyaW0oKSx1KSx1KSxzJiZvWzBdPT09biYmdHlwZW9mIHMhPSJzdHJpbmciKXJldHVybiBzO3R5cGVvZiBzIT0ic3RyaW5nIiYmKHM9eWUocykpLHN8fCh0aGlzLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcmVzb2x2ZSAiLmNvbmNhdChvWzFdLCIgZm9yIG5lc3RpbmcgIikuY29uY2F0KG4pKSxzPSIiKSxmJiYocz1jLnJlZHVjZShmdW5jdGlvbihwLHYpe3JldHVybiBlLmZvcm1hdChwLHYsYS5sbmcsTChMKHt9LGEpLHt9LHtpbnRlcnBvbGF0aW9ua2V5Om9bMV0udHJpbSgpfSkpfSxzLnRyaW0oKSkpLG49bi5yZXBsYWNlKG9bMF0scyksdGhpcy5yZWdleHAubGFzdEluZGV4PTB9cmV0dXJuIG59fV0pLGl9KCk7ZnVuY3Rpb24gQ2UoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBEKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP0NlKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtGKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOkNlKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiB2dChpKXt2YXIgdD1pLnRvTG93ZXJDYXNlKCkudHJpbSgpLG49e307aWYoaS5pbmRleE9mKCIoIik+LTEpe3ZhciByPWkuc3BsaXQoIigiKTt0PXJbMF0udG9Mb3dlckNhc2UoKS50cmltKCk7dmFyIGU9clsxXS5zdWJzdHJpbmcoMCxyWzFdLmxlbmd0aC0xKTtpZih0PT09ImN1cnJlbmN5IiYmZS5pbmRleE9mKCI6Iik8MCluLmN1cnJlbmN5fHwobi5jdXJyZW5jeT1lLnRyaW0oKSk7ZWxzZSBpZih0PT09InJlbGF0aXZldGltZSImJmUuaW5kZXhPZigiOiIpPDApbi5yYW5nZXx8KG4ucmFuZ2U9ZS50cmltKCkpO2Vsc2V7dmFyIGE9ZS5zcGxpdCgiOyIpO2EuZm9yRWFjaChmdW5jdGlvbihvKXtpZihvKXt2YXIgcz1vLnNwbGl0KCI6IiksdT1HZShzKSxsPXVbMF0sYz11LnNsaWNlKDEpLGY9Yy5qb2luKCI6IikudHJpbSgpLnJlcGxhY2UoL14nK3wnKyQvZywiIik7bltsLnRyaW0oKV18fChuW2wudHJpbSgpXT1mKSxmPT09ImZhbHNlIiYmKG5bbC50cmltKCldPSExKSxmPT09InRydWUiJiYobltsLnRyaW0oKV09ITApLGlzTmFOKGYpfHwobltsLnRyaW0oKV09cGFyc2VJbnQoZiwxMCkpfX0pfX1yZXR1cm57Zm9ybWF0TmFtZTp0LGZvcm1hdE9wdGlvbnM6bn19ZnVuY3Rpb24gSyhpKXt2YXIgdD17fTtyZXR1cm4gZnVuY3Rpb24ocixlLGEpe3ZhciBvPWUrSlNPTi5zdHJpbmdpZnkoYSkscz10W29dO3JldHVybiBzfHwocz1pKGUsYSksdFtvXT1zKSxzKHIpfX12YXIgbXQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9O1IodGhpcyxpKSx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgiZm9ybWF0dGVyIiksdGhpcy5vcHRpb25zPXQsdGhpcy5mb3JtYXRzPXtudW1iZXI6SyhmdW5jdGlvbihuLHIpe3ZhciBlPW5ldyBJbnRsLk51bWJlckZvcm1hdChuLHIpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSl9fSksY3VycmVuY3k6SyhmdW5jdGlvbihuLHIpe3ZhciBlPW5ldyBJbnRsLk51bWJlckZvcm1hdChuLEQoRCh7fSxyKSx7fSx7c3R5bGU6ImN1cnJlbmN5In0pKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGUuZm9ybWF0KGEpfX0pLGRhdGV0aW1lOksoZnVuY3Rpb24obixyKXt2YXIgZT1uZXcgSW50bC5EYXRlVGltZUZvcm1hdChuLEQoe30scikpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSl9fSkscmVsYXRpdmV0aW1lOksoZnVuY3Rpb24obixyKXt2YXIgZT1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQobixEKHt9LHIpKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGUuZm9ybWF0KGEsci5yYW5nZXx8ImRheSIpfX0pLGxpc3Q6SyhmdW5jdGlvbihuLHIpe3ZhciBlPW5ldyBJbnRsLkxpc3RGb3JtYXQobixEKHt9LHIpKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGUuZm9ybWF0KGEpfX0pfSx0aGlzLmluaXQodCl9cmV0dXJuIGsoaSxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fSxlPXIuaW50ZXJwb2xhdGlvbjt0aGlzLmZvcm1hdFNlcGFyYXRvcj1lLmZvcm1hdFNlcGFyYXRvcj9lLmZvcm1hdFNlcGFyYXRvcjplLmZvcm1hdFNlcGFyYXRvcnx8IiwifX0se2tleToiYWRkIix2YWx1ZTpmdW5jdGlvbihuLHIpe3RoaXMuZm9ybWF0c1tuLnRvTG93ZXJDYXNlKCkudHJpbSgpXT1yfX0se2tleToiYWRkQ2FjaGVkIix2YWx1ZTpmdW5jdGlvbihuLHIpe3RoaXMuZm9ybWF0c1tuLnRvTG93ZXJDYXNlKCkudHJpbSgpXT1LKHIpfX0se2tleToiZm9ybWF0Iix2YWx1ZTpmdW5jdGlvbihuLHIsZSxhKXt2YXIgbz10aGlzLHM9ci5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvciksdT1zLnJlZHVjZShmdW5jdGlvbihsLGMpe3ZhciBmPXZ0KGMpLGc9Zi5mb3JtYXROYW1lLHA9Zi5mb3JtYXRPcHRpb25zO2lmKG8uZm9ybWF0c1tnXSl7dmFyIHY9bDt0cnl7dmFyIHk9YSYmYS5mb3JtYXRQYXJhbXMmJmEuZm9ybWF0UGFyYW1zW2EuaW50ZXJwb2xhdGlvbmtleV18fHt9LG09eS5sb2NhbGV8fHkubG5nfHxhLmxvY2FsZXx8YS5sbmd8fGU7dj1vLmZvcm1hdHNbZ10obCxtLEQoRChEKHt9LHApLGEpLHkpKX1jYXRjaChkKXtvLmxvZ2dlci53YXJuKGQpfXJldHVybiB2fWVsc2Ugby5sb2dnZXIud2FybigidGhlcmUgd2FzIG5vIGZvcm1hdCBmdW5jdGlvbiBmb3IgIi5jb25jYXQoZykpO3JldHVybiBsfSxuKTtyZXR1cm4gdX19XSksaX0oKTtmdW5jdGlvbiBFZShpLHQpe3ZhciBuPU9iamVjdC5rZXlzKGkpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIF9lKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP0VlKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtGKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOkVlKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiB5dChpKXt2YXIgdD1idCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWooaSksZTtpZih0KXt2YXIgYT1qKHRoaXMpLmNvbnN0cnVjdG9yO2U9UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsYSl9ZWxzZSBlPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBWKHRoaXMsZSl9fWZ1bmN0aW9uIGJ0KCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIE90KGksdCl7aS5wZW5kaW5nW3RdIT09dm9pZCAwJiYoZGVsZXRlIGkucGVuZGluZ1t0XSxpLnBlbmRpbmdDb3VudC0tKX12YXIgd3Q9ZnVuY3Rpb24oaSl7UShuLGkpO3ZhciB0PXl0KG4pO2Z1bmN0aW9uIG4ocixlLGEpe3ZhciBvLHM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOnt9O3JldHVybiBSKHRoaXMsbiksbz10LmNhbGwodGhpcykscSYmSS5jYWxsKF8obykpLG8uYmFja2VuZD1yLG8uc3RvcmU9ZSxvLnNlcnZpY2VzPWEsby5sYW5ndWFnZVV0aWxzPWEubGFuZ3VhZ2VVdGlscyxvLm9wdGlvbnM9cyxvLmxvZ2dlcj1OLmNyZWF0ZSgiYmFja2VuZENvbm5lY3RvciIpLG8ud2FpdGluZ1JlYWRzPVtdLG8ubWF4UGFyYWxsZWxSZWFkcz1zLm1heFBhcmFsbGVsUmVhZHN8fDEwLG8ucmVhZGluZ0NhbGxzPTAsby5tYXhSZXRyaWVzPXMubWF4UmV0cmllcz49MD9zLm1heFJldHJpZXM6NSxvLnJldHJ5VGltZW91dD1zLnJldHJ5VGltZW91dD49MT9zLnJldHJ5VGltZW91dDozNTAsby5zdGF0ZT17fSxvLnF1ZXVlPVtdLG8uYmFja2VuZCYmby5iYWNrZW5kLmluaXQmJm8uYmFja2VuZC5pbml0KGEscy5iYWNrZW5kLHMpLG99cmV0dXJuIGsobixbe2tleToicXVldWVMb2FkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyxzKXt2YXIgdT10aGlzLGw9e30sYz17fSxmPXt9LGc9e307cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihwKXt2YXIgdj0hMDthLmZvckVhY2goZnVuY3Rpb24oeSl7dmFyIG09IiIuY29uY2F0KHAsInwiKS5jb25jYXQoeSk7IW8ucmVsb2FkJiZ1LnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKHAseSk/dS5zdGF0ZVttXT0yOnUuc3RhdGVbbV08MHx8KHUuc3RhdGVbbV09PT0xP2NbbV09PT12b2lkIDAmJihjW21dPSEwKToodS5zdGF0ZVttXT0xLHY9ITEsY1ttXT09PXZvaWQgMCYmKGNbbV09ITApLGxbbV09PT12b2lkIDAmJihsW21dPSEwKSxnW3ldPT09dm9pZCAwJiYoZ1t5XT0hMCkpKX0pLHZ8fChmW3BdPSEwKX0pLChPYmplY3Qua2V5cyhsKS5sZW5ndGh8fE9iamVjdC5rZXlzKGMpLmxlbmd0aCkmJnRoaXMucXVldWUucHVzaCh7cGVuZGluZzpjLHBlbmRpbmdDb3VudDpPYmplY3Qua2V5cyhjKS5sZW5ndGgsbG9hZGVkOnt9LGVycm9yczpbXSxjYWxsYmFjazpzfSkse3RvTG9hZDpPYmplY3Qua2V5cyhsKSxwZW5kaW5nOk9iamVjdC5rZXlzKGMpLHRvTG9hZExhbmd1YWdlczpPYmplY3Qua2V5cyhmKSx0b0xvYWROYW1lc3BhY2VzOk9iamVjdC5rZXlzKGcpfX19LHtrZXk6ImxvYWRlZCIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3ZhciBzPWUuc3BsaXQoInwiKSx1PXNbMF0sbD1zWzFdO2EmJnRoaXMuZW1pdCgiZmFpbGVkTG9hZGluZyIsdSxsLGEpLG8mJnRoaXMuc3RvcmUuYWRkUmVzb3VyY2VCdW5kbGUodSxsLG8pLHRoaXMuc3RhdGVbZV09YT8tMToyO3ZhciBjPXt9O3RoaXMucXVldWUuZm9yRWFjaChmdW5jdGlvbihmKXtYZShmLmxvYWRlZCxbdV0sbCksT3QoZixlKSxhJiZmLmVycm9ycy5wdXNoKGEpLGYucGVuZGluZ0NvdW50PT09MCYmIWYuZG9uZSYmKE9iamVjdC5rZXlzKGYubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2NbZ118fChjW2ddPXt9KTt2YXIgcD1mLmxvYWRlZFtnXTtwLmxlbmd0aCYmcC5mb3JFYWNoKGZ1bmN0aW9uKHYpe2NbZ11bdl09PT12b2lkIDAmJihjW2ddW3ZdPSEwKX0pfSksZi5kb25lPSEwLGYuZXJyb3JzLmxlbmd0aD9mLmNhbGxiYWNrKGYuZXJyb3JzKTpmLmNhbGxiYWNrKCkpfSksdGhpcy5lbWl0KCJsb2FkZWQiLGMpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuIWYuZG9uZX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106MCxsPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTp0aGlzLnJldHJ5VGltZW91dCxjPWFyZ3VtZW50cy5sZW5ndGg+NT9hcmd1bWVudHNbNV06dm9pZCAwO2lmKCFlLmxlbmd0aClyZXR1cm4gYyhudWxsLHt9KTtpZih0aGlzLnJlYWRpbmdDYWxscz49dGhpcy5tYXhQYXJhbGxlbFJlYWRzKXt0aGlzLndhaXRpbmdSZWFkcy5wdXNoKHtsbmc6ZSxuczphLGZjTmFtZTpvLHRyaWVkOnUsd2FpdDpsLGNhbGxiYWNrOmN9KTtyZXR1cm59cmV0dXJuIHRoaXMucmVhZGluZ0NhbGxzKyssdGhpcy5iYWNrZW5kW29dKGUsYSxmdW5jdGlvbihmLGcpe2lmKHMucmVhZGluZ0NhbGxzLS0scy53YWl0aW5nUmVhZHMubGVuZ3RoPjApe3ZhciBwPXMud2FpdGluZ1JlYWRzLnNoaWZ0KCk7cy5yZWFkKHAubG5nLHAubnMscC5mY05hbWUscC50cmllZCxwLndhaXQscC5jYWxsYmFjayl9aWYoZiYmZyYmdTxzLm1heFJldHJpZXMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzLnJlYWQuY2FsbChzLGUsYSxvLHUrMSxsKjIsYyl9LGwpO3JldHVybn1jKGYsZyl9KX19LHtrZXk6InByZXBhcmVMb2FkaW5nIix2YWx1ZTpmdW5jdGlvbihlLGEpe3ZhciBvPXRoaXMscz1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sdT1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMDtpZighdGhpcy5iYWNrZW5kKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJObyBiYWNrZW5kIHdhcyBhZGRlZCB2aWEgaTE4bmV4dC51c2UuIFdpbGwgbm90IGxvYWQgcmVzb3VyY2VzLiIpLHUmJnUoKTt0eXBlb2YgZT09InN0cmluZyImJihlPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZSkpLHR5cGVvZiBhPT0ic3RyaW5nIiYmKGE9W2FdKTt2YXIgbD10aGlzLnF1ZXVlTG9hZChlLGEscyx1KTtpZighbC50b0xvYWQubGVuZ3RoKXJldHVybiBsLnBlbmRpbmcubGVuZ3RofHx1KCksbnVsbDtsLnRvTG9hZC5mb3JFYWNoKGZ1bmN0aW9uKGMpe28ubG9hZE9uZShjKX0pfX0se2tleToibG9hZCIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3RoaXMucHJlcGFyZUxvYWRpbmcoZSxhLHt9LG8pfX0se2tleToicmVsb2FkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dGhpcy5wcmVwYXJlTG9hZGluZyhlLGEse3JlbG9hZDohMH0sbyl9fSx7a2V5OiJsb2FkT25lIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiIiLHM9ZS5zcGxpdCgifCIpLHU9c1swXSxsPXNbMV07dGhpcy5yZWFkKHUsbCwicmVhZCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbihjLGYpe2MmJmEubG9nZ2VyLndhcm4oIiIuY29uY2F0KG8sImxvYWRpbmcgbmFtZXNwYWNlICIpLmNvbmNhdChsLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdCh1LCIgZmFpbGVkIiksYyksIWMmJmYmJmEubG9nZ2VyLmxvZygiIi5jb25jYXQobywibG9hZGVkIG5hbWVzcGFjZSAiKS5jb25jYXQobCwiIGZvciBsYW5ndWFnZSAiKS5jb25jYXQodSksZiksYS5sb2FkZWQoZSxjLGYpfSl9fSx7a2V5OiJzYXZlTWlzc2luZyIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8scyx1KXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06e307aWYodGhpcy5zZXJ2aWNlcy51dGlscyYmdGhpcy5zZXJ2aWNlcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiF0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShhKSl7dGhpcy5sb2dnZXIud2FybignZGlkIG5vdCBzYXZlIGtleSAiJy5jb25jYXQobywnIiBhcyB0aGUgbmFtZXNwYWNlICInKS5jb25jYXQoYSwnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIik7cmV0dXJufW89PW51bGx8fG89PT0iInx8KHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZShlLGEsbyxzLG51bGwsX2UoX2Uoe30sbCkse30se2lzVXBkYXRlOnV9KSksISghZXx8IWVbMF0pJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlKGVbMF0sYSxvLHMpKX19XSksbn0oSSk7ZnVuY3Rpb24gU3QoKXtyZXR1cm57ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIG49e307aWYoUCh0WzFdKT09PSJvYmplY3QiJiYobj10WzFdKSx0eXBlb2YgdFsxXT09InN0cmluZyImJihuLmRlZmF1bHRWYWx1ZT10WzFdKSx0eXBlb2YgdFsyXT09InN0cmluZyImJihuLnREZXNjcmlwdGlvbj10WzJdKSxQKHRbMl0pPT09Im9iamVjdCJ8fFAodFszXSk9PT0ib2JqZWN0Iil7dmFyIHI9dFszXXx8dFsyXTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZV09cltlXX0pfXJldHVybiBufSxpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMCxmb3JtYXQ6ZnVuY3Rpb24odCxuLHIsZSl7cmV0dXJuIHR9LHByZWZpeDoie3siLHN1ZmZpeDoifX0iLGZvcm1hdFNlcGFyYXRvcjoiLCIsdW5lc2NhcGVQcmVmaXg6Ii0iLG5lc3RpbmdQcmVmaXg6IiR0KCIsbmVzdGluZ1N1ZmZpeDoiKSIsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6IiwiLG1heFJlcGxhY2VzOjFlMyxza2lwT25WYXJpYWJsZXM6ITB9fX1mdW5jdGlvbiBGZShpKXtyZXR1cm4gdHlwZW9mIGkubnM9PSJzdHJpbmciJiYoaS5ucz1baS5uc10pLHR5cGVvZiBpLmZhbGxiYWNrTG5nPT0ic3RyaW5nIiYmKGkuZmFsbGJhY2tMbmc9W2kuZmFsbGJhY2tMbmddKSx0eXBlb2YgaS5mYWxsYmFja05TPT0ic3RyaW5nIiYmKGkuZmFsbGJhY2tOUz1baS5mYWxsYmFja05TXSksaS5zdXBwb3J0ZWRMbmdzJiZpLnN1cHBvcnRlZExuZ3MuaW5kZXhPZigiY2ltb2RlIik8MCYmKGkuc3VwcG9ydGVkTG5ncz1pLnN1cHBvcnRlZExuZ3MuY29uY2F0KFsiY2ltb2RlIl0pKSxpfWZ1bmN0aW9uIEllKGksdCl7dmFyIG49T2JqZWN0LmtleXMoaSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhpKTt0JiYocj1yLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLGUpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gQyhpKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF0hPW51bGw/YXJndW1lbnRzW3RdOnt9O3QlMj9JZShPYmplY3QobiksITApLmZvckVhY2goZnVuY3Rpb24ocil7RihpLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpJZShPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGl9ZnVuY3Rpb24geHQoaSl7dmFyIHQ9UHQoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1qKGkpLGU7aWYodCl7dmFyIGE9aih0aGlzKS5jb25zdHJ1Y3RvcjtlPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGEpfWVsc2UgZT1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gVih0aGlzLGUpfX1mdW5jdGlvbiBQdCgpe2lmKHR5cGVvZiBSZWZsZWN0PiJ1Inx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKHR5cGVvZiBQcm94eT09ImZ1bmN0aW9uIilyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBlZSgpe31mdW5jdGlvbiBMdChpKXt2YXIgdD1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoaSkpO3QuZm9yRWFjaChmdW5jdGlvbihuKXt0eXBlb2YgaVtuXT09ImZ1bmN0aW9uIiYmKGlbbl09aVtuXS5iaW5kKGkpKX0pfXZhciB0ZT1mdW5jdGlvbihpKXtRKG4saSk7dmFyIHQ9eHQobik7ZnVuY3Rpb24gbigpe3ZhciByLGU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LGE9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoUih0aGlzLG4pLHI9dC5jYWxsKHRoaXMpLHEmJkkuY2FsbChfKHIpKSxyLm9wdGlvbnM9RmUoZSksci5zZXJ2aWNlcz17fSxyLmxvZ2dlcj1OLHIubW9kdWxlcz17ZXh0ZXJuYWw6W119LEx0KF8ocikpLGEmJiFyLmlzSW5pdGlhbGl6ZWQmJiFlLmlzQ2xvbmUpe2lmKCFyLm9wdGlvbnMuaW5pdEltbWVkaWF0ZSlyZXR1cm4gci5pbml0KGUsYSksVihyLF8ocikpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmluaXQoZSxhKX0sMCl9cmV0dXJuIHJ9cmV0dXJuIGsobixbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGE9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LG89YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7dHlwZW9mIGE9PSJmdW5jdGlvbiImJihvPWEsYT17fSksIWEuZGVmYXVsdE5TJiZhLmRlZmF1bHROUyE9PSExJiZhLm5zJiYodHlwZW9mIGEubnM9PSJzdHJpbmciP2EuZGVmYXVsdE5TPWEubnM6YS5ucy5pbmRleE9mKCJ0cmFuc2xhdGlvbiIpPDAmJihhLmRlZmF1bHROUz1hLm5zWzBdKSk7dmFyIHM9U3QoKTt0aGlzLm9wdGlvbnM9QyhDKEMoe30scyksdGhpcy5vcHRpb25zKSxGZShhKSksdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkhPT0idjEiJiYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb249QyhDKHt9LHMuaW50ZXJwb2xhdGlvbiksdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24pKSxhLmtleVNlcGFyYXRvciE9PXZvaWQgMCYmKHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZEtleVNlcGFyYXRvcj1hLmtleVNlcGFyYXRvciksYS5uc1NlcGFyYXRvciE9PXZvaWQgMCYmKHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZE5zU2VwYXJhdG9yPWEubnNTZXBhcmF0b3IpO2Z1bmN0aW9uIHUoZCl7cmV0dXJuIGQ/dHlwZW9mIGQ9PSJmdW5jdGlvbiI/bmV3IGQ6ZDpudWxsfWlmKCF0aGlzLm9wdGlvbnMuaXNDbG9uZSl7dGhpcy5tb2R1bGVzLmxvZ2dlcj9OLmluaXQodSh0aGlzLm1vZHVsZXMubG9nZ2VyKSx0aGlzLm9wdGlvbnMpOk4uaW5pdChudWxsLHRoaXMub3B0aW9ucyk7dmFyIGw7dGhpcy5tb2R1bGVzLmZvcm1hdHRlcj9sPXRoaXMubW9kdWxlcy5mb3JtYXR0ZXI6dHlwZW9mIEludGw8InUiJiYobD1tdCk7dmFyIGM9bmV3IGZ0KHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgb3QodGhpcy5vcHRpb25zLnJlc291cmNlcyx0aGlzLm9wdGlvbnMpO3ZhciBmPXRoaXMuc2VydmljZXM7Zi5sb2dnZXI9TixmLnJlc291cmNlU3RvcmU9dGhpcy5zdG9yZSxmLmxhbmd1YWdlVXRpbHM9YyxmLnBsdXJhbFJlc29sdmVyPW5ldyBkdChjLHtwcmVwZW5kOnRoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsY29tcGF0aWJpbGl0eUpTT046dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OLHNpbXBsaWZ5UGx1cmFsU3VmZml4OnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeH0pLGwmJighdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0fHx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQ9PT1zLmludGVycG9sYXRpb24uZm9ybWF0KSYmKGYuZm9ybWF0dGVyPXUobCksZi5mb3JtYXR0ZXIuaW5pdChmLHRoaXMub3B0aW9ucyksdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0PWYuZm9ybWF0dGVyLmZvcm1hdC5iaW5kKGYuZm9ybWF0dGVyKSksZi5pbnRlcnBvbGF0b3I9bmV3IGh0KHRoaXMub3B0aW9ucyksZi51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcyl9LGYuYmFja2VuZENvbm5lY3Rvcj1uZXcgd3QodSh0aGlzLm1vZHVsZXMuYmFja2VuZCksZi5yZXNvdXJjZVN0b3JlLGYsdGhpcy5vcHRpb25zKSxmLmJhY2tlbmRDb25uZWN0b3Iub24oIioiLGZ1bmN0aW9uKGQpe2Zvcih2YXIgaD1hcmd1bWVudHMubGVuZ3RoLE89bmV3IEFycmF5KGg+MT9oLTE6MCksYj0xO2I8aDtiKyspT1tiLTFdPWFyZ3VtZW50c1tiXTtlLmVtaXQuYXBwbHkoZSxbZF0uY29uY2F0KE8pKX0pLHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yJiYoZi5sYW5ndWFnZURldGVjdG9yPXUodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IpLGYubGFuZ3VhZ2VEZXRlY3Rvci5pbml0KGYsdGhpcy5vcHRpb25zLmRldGVjdGlvbix0aGlzLm9wdGlvbnMpKSx0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCYmKGYuaTE4bkZvcm1hdD11KHRoaXMubW9kdWxlcy5pMThuRm9ybWF0KSxmLmkxOG5Gb3JtYXQuaW5pdCYmZi5pMThuRm9ybWF0LmluaXQodGhpcykpLHRoaXMudHJhbnNsYXRvcj1uZXcga2UodGhpcy5zZXJ2aWNlcyx0aGlzLm9wdGlvbnMpLHRoaXMudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24oZCl7Zm9yKHZhciBoPWFyZ3VtZW50cy5sZW5ndGgsTz1uZXcgQXJyYXkoaD4xP2gtMTowKSxiPTE7YjxoO2IrKylPW2ItMV09YXJndW1lbnRzW2JdO2UuZW1pdC5hcHBseShlLFtkXS5jb25jYXQoTykpfSksdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5pbml0JiZkLmluaXQoZSl9KX1pZih0aGlzLmZvcm1hdD10aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQsb3x8KG89ZWUpLHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyYmIXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmIXRoaXMub3B0aW9ucy5sbmcpe3ZhciBnPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7Zy5sZW5ndGg+MCYmZ1swXSE9PSJkZXYiJiYodGhpcy5vcHRpb25zLmxuZz1nWzBdKX0hdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5vcHRpb25zLmxuZyYmdGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpO3ZhciBwPVsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXTtwLmZvckVhY2goZnVuY3Rpb24oZCl7ZVtkXT1mdW5jdGlvbigpe3ZhciBoO3JldHVybihoPWUuc3RvcmUpW2RdLmFwcGx5KGgsYXJndW1lbnRzKX19KTt2YXIgdj1bImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdO3YuZm9yRWFjaChmdW5jdGlvbihkKXtlW2RdPWZ1bmN0aW9uKCl7dmFyIGg7cmV0dXJuKGg9ZS5zdG9yZSlbZF0uYXBwbHkoaCxhcmd1bWVudHMpLGV9fSk7dmFyIHk9JCgpLG09ZnVuY3Rpb24oKXt2YXIgaD1mdW5jdGlvbihiLHgpe2UuaXNJbml0aWFsaXplZCYmIWUuaW5pdGlhbGl6ZWRTdG9yZU9uY2UmJmUubG9nZ2VyLndhcm4oImluaXQ6IGkxOG5leHQgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4gWW91IHNob3VsZCBjYWxsIGluaXQganVzdCBvbmNlISIpLGUuaXNJbml0aWFsaXplZD0hMCxlLm9wdGlvbnMuaXNDbG9uZXx8ZS5sb2dnZXIubG9nKCJpbml0aWFsaXplZCIsZS5vcHRpb25zKSxlLmVtaXQoImluaXRpYWxpemVkIixlLm9wdGlvbnMpLHkucmVzb2x2ZSh4KSxvKGIseCl9O2lmKGUubGFuZ3VhZ2VzJiZlLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSE9PSJ2MSImJiFlLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIGgobnVsbCxlLnQuYmluZChlKSk7ZS5jaGFuZ2VMYW5ndWFnZShlLm9wdGlvbnMubG5nLGgpfTtyZXR1cm4gdGhpcy5vcHRpb25zLnJlc291cmNlc3x8IXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlP20oKTpzZXRUaW1lb3V0KG0sMCkseX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ZWUscz1vLHU9dHlwZW9mIGU9PSJzdHJpbmciP2U6dGhpcy5sYW5ndWFnZTtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIiYmKHM9ZSksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYodSYmdS50b0xvd2VyQ2FzZSgpPT09ImNpbW9kZSIpcmV0dXJuIHMoKTt2YXIgbD1bXSxjPWZ1bmN0aW9uKHApe2lmKHApe3ZhciB2PWEuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkocCk7di5mb3JFYWNoKGZ1bmN0aW9uKHkpe2wuaW5kZXhPZih5KTwwJiZsLnB1c2goeSl9KX19O2lmKHUpYyh1KTtlbHNle3ZhciBmPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7Zi5mb3JFYWNoKGZ1bmN0aW9uKGcpe3JldHVybiBjKGcpfSl9dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24oZyl7cmV0dXJuIGMoZyl9KSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZChsLHRoaXMub3B0aW9ucy5ucyxmdW5jdGlvbihnKXshZyYmIWEucmVzb2x2ZWRMYW5ndWFnZSYmYS5sYW5ndWFnZSYmYS5zZXRSZXNvbHZlZExhbmd1YWdlKGEubGFuZ3VhZ2UpLHMoZyl9KX1lbHNlIHMobnVsbCl9fSx7a2V5OiJyZWxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgcz0kKCk7cmV0dXJuIGV8fChlPXRoaXMubGFuZ3VhZ2VzKSxhfHwoYT10aGlzLm9wdGlvbnMubnMpLG98fChvPWVlKSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IucmVsb2FkKGUsYSxmdW5jdGlvbih1KXtzLnJlc29sdmUoKSxvKHUpfSksc319LHtrZXk6InVzZSIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYW4gdW5kZWZpbmVkIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtpZighZS50eXBlKXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGEgd3JvbmcgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO3JldHVybiBlLnR5cGU9PT0iYmFja2VuZCImJih0aGlzLm1vZHVsZXMuYmFja2VuZD1lKSwoZS50eXBlPT09ImxvZ2dlciJ8fGUubG9nJiZlLndhcm4mJmUuZXJyb3IpJiYodGhpcy5tb2R1bGVzLmxvZ2dlcj1lKSxlLnR5cGU9PT0ibGFuZ3VhZ2VEZXRlY3RvciImJih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcj1lKSxlLnR5cGU9PT0iaTE4bkZvcm1hdCImJih0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdD1lKSxlLnR5cGU9PT0icG9zdFByb2Nlc3NvciImJlBlLmFkZFBvc3RQcm9jZXNzb3IoZSksZS50eXBlPT09ImZvcm1hdHRlciImJih0aGlzLm1vZHVsZXMuZm9ybWF0dGVyPWUpLGUudHlwZT09PSIzcmRQYXJ0eSImJnRoaXMubW9kdWxlcy5leHRlcm5hbC5wdXNoKGUpLHRoaXN9fSx7a2V5OiJzZXRSZXNvbHZlZExhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbihlKXtpZighKCFlfHwhdGhpcy5sYW5ndWFnZXMpJiYhKFsiY2ltb2RlIiwiZGV2Il0uaW5kZXhPZihlKT4tMSkpZm9yKHZhciBhPTA7YTx0aGlzLmxhbmd1YWdlcy5sZW5ndGg7YSsrKXt2YXIgbz10aGlzLmxhbmd1YWdlc1thXTtpZighKFsiY2ltb2RlIiwiZGV2Il0uaW5kZXhPZihvKT4tMSkmJnRoaXMuc3RvcmUuaGFzTGFuZ3VhZ2VTb21lVHJhbnNsYXRpb25zKG8pKXt0aGlzLnJlc29sdmVkTGFuZ3VhZ2U9bzticmVha319fX0se2tleToiY2hhbmdlTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89dGhpczt0aGlzLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPWU7dmFyIHM9JCgpO3RoaXMuZW1pdCgibGFuZ3VhZ2VDaGFuZ2luZyIsZSk7dmFyIHU9ZnVuY3Rpb24oZyl7by5sYW5ndWFnZT1nLG8ubGFuZ3VhZ2VzPW8uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZyksby5yZXNvbHZlZExhbmd1YWdlPXZvaWQgMCxvLnNldFJlc29sdmVkTGFuZ3VhZ2UoZyl9LGw9ZnVuY3Rpb24oZyxwKXtwPyh1KHApLG8udHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShwKSxvLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxvLmVtaXQoImxhbmd1YWdlQ2hhbmdlZCIscCksby5sb2dnZXIubG9nKCJsYW5ndWFnZUNoYW5nZWQiLHApKTpvLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxzLnJlc29sdmUoZnVuY3Rpb24oKXtyZXR1cm4gby50LmFwcGx5KG8sYXJndW1lbnRzKX0pLGEmJmEoZyxmdW5jdGlvbigpe3JldHVybiBvLnQuYXBwbHkobyxhcmd1bWVudHMpfSl9LGM9ZnVuY3Rpb24oZyl7IWUmJiFnJiZvLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJihnPVtdKTt2YXIgcD10eXBlb2YgZz09InN0cmluZyI/ZzpvLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKGcpO3AmJihvLmxhbmd1YWdlfHx1KHApLG8udHJhbnNsYXRvci5sYW5ndWFnZXx8by50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKHApLG8uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmby5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKHApKSxvLmxvYWRSZXNvdXJjZXMocCxmdW5jdGlvbih2KXtsKHYscCl9KX07cmV0dXJuIWUmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmIXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz9jKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSk6IWUmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP3RoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoYyk6YyhlKSxzfX0se2tleToiZ2V0Rml4ZWRUIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHM9dGhpcyx1PWZ1bmN0aW9uIGwoYyxmKXt2YXIgZztpZihQKGYpIT09Im9iamVjdCIpe2Zvcih2YXIgcD1hcmd1bWVudHMubGVuZ3RoLHY9bmV3IEFycmF5KHA+Mj9wLTI6MCkseT0yO3k8cDt5Kyspdlt5LTJdPWFyZ3VtZW50c1t5XTtnPXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbYyxmXS5jb25jYXQodikpfWVsc2UgZz1DKHt9LGYpO2cubG5nPWcubG5nfHxsLmxuZyxnLmxuZ3M9Zy5sbmdzfHxsLmxuZ3MsZy5ucz1nLm5zfHxsLm5zLGcua2V5UHJlZml4PWcua2V5UHJlZml4fHxvfHxsLmtleVByZWZpeDt2YXIgbT1zLm9wdGlvbnMua2V5U2VwYXJhdG9yfHwiLiIsZD1nLmtleVByZWZpeD8iIi5jb25jYXQoZy5rZXlQcmVmaXgpLmNvbmNhdChtKS5jb25jYXQoYyk6YztyZXR1cm4gcy50KGQsZyl9O3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/dS5sbmc9ZTp1LmxuZ3M9ZSx1Lm5zPWEsdS5rZXlQcmVmaXg9byx1fX0se2tleToidCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYoZT10aGlzLnRyYW5zbGF0b3IpLnRyYW5zbGF0ZS5hcHBseShlLGFyZ3VtZW50cyl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKGU9dGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkoZSxhcmd1bWVudHMpfX0se2tleToic2V0RGVmYXVsdE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz1lfX0se2tleToiaGFzTG9hZGVkTmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkIix0aGlzLmxhbmd1YWdlcyksITE7aWYoIXRoaXMubGFuZ3VhZ2VzfHwhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5Iix0aGlzLmxhbmd1YWdlcyksITE7dmFyIHM9dGhpcy5yZXNvbHZlZExhbmd1YWdlfHx0aGlzLmxhbmd1YWdlc1swXSx1PXRoaXMub3B0aW9ucz90aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmc6ITEsbD10aGlzLmxhbmd1YWdlc1t0aGlzLmxhbmd1YWdlcy5sZW5ndGgtMV07aWYocy50b0xvd2VyQ2FzZSgpPT09ImNpbW9kZSIpcmV0dXJuITA7dmFyIGM9ZnVuY3Rpb24ocCx2KXt2YXIgeT1hLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3Iuc3RhdGVbIiIuY29uY2F0KHAsInwiKS5jb25jYXQodildO3JldHVybiB5PT09LTF8fHk9PT0yfTtpZihvLnByZWNoZWNrKXt2YXIgZj1vLnByZWNoZWNrKHRoaXMsYyk7aWYoZiE9PXZvaWQgMClyZXR1cm4gZn1yZXR1cm4hISh0aGlzLmhhc1Jlc291cmNlQnVuZGxlKHMsZSl8fCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8dGhpcy5vcHRpb25zLnJlc291cmNlcyYmIXRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlc3x8YyhzLGUpJiYoIXV8fGMobCxlKSkpfX0se2tleToibG9hZE5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89dGhpcyxzPSQoKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5zPyh0eXBlb2YgZT09InN0cmluZyImJihlPVtlXSksZS5mb3JFYWNoKGZ1bmN0aW9uKHUpe28ub3B0aW9ucy5ucy5pbmRleE9mKHUpPDAmJm8ub3B0aW9ucy5ucy5wdXNoKHUpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHUpe3MucmVzb2x2ZSgpLGEmJmEodSl9KSxzKTooYSYmYSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImxvYWRMYW5ndWFnZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89JCgpO3R5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKTt2YXIgcz10aGlzLm9wdGlvbnMucHJlbG9hZHx8W10sdT1lLmZpbHRlcihmdW5jdGlvbihsKXtyZXR1cm4gcy5pbmRleE9mKGwpPDB9KTtyZXR1cm4gdS5sZW5ndGg/KHRoaXMub3B0aW9ucy5wcmVsb2FkPXMuY29uY2F0KHUpLHRoaXMubG9hZFJlc291cmNlcyhmdW5jdGlvbihsKXtvLnJlc29sdmUoKSxhJiZhKGwpfSksbyk6KGEmJmEoKSxQcm9taXNlLnJlc29sdmUoKSl9fSx7a2V5OiJkaXIiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKGV8fChlPXRoaXMucmVzb2x2ZWRMYW5ndWFnZXx8KHRoaXMubGFuZ3VhZ2VzJiZ0aGlzLmxhbmd1YWdlcy5sZW5ndGg+MD90aGlzLmxhbmd1YWdlc1swXTp0aGlzLmxhbmd1YWdlKSksIWUpcmV0dXJuInJ0bCI7dmFyIGE9WyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSIsImNrYiJdO3JldHVybiBhLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGUpKT4tMXx8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi1hcmFiIik+MT8icnRsIjoibHRyIn19LHtrZXk6ImNsb25lSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxhPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTp7fSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTplZSxzPUMoQyhDKHt9LHRoaXMub3B0aW9ucyksYSkse2lzQ2xvbmU6ITB9KSx1PW5ldyBuKHMpOyhhLmRlYnVnIT09dm9pZCAwfHxhLnByZWZpeCE9PXZvaWQgMCkmJih1LmxvZ2dlcj11LmxvZ2dlci5jbG9uZShhKSk7dmFyIGw9WyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXTtyZXR1cm4gbC5mb3JFYWNoKGZ1bmN0aW9uKGMpe3VbY109ZVtjXX0pLHUuc2VydmljZXM9Qyh7fSx0aGlzLnNlcnZpY2VzKSx1LnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh1KX0sdS50cmFuc2xhdG9yPW5ldyBrZSh1LnNlcnZpY2VzLHUub3B0aW9ucyksdS50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihjKXtmb3IodmFyIGY9YXJndW1lbnRzLmxlbmd0aCxnPW5ldyBBcnJheShmPjE/Zi0xOjApLHA9MTtwPGY7cCsrKWdbcC0xXT1hcmd1bWVudHNbcF07dS5lbWl0LmFwcGx5KHUsW2NdLmNvbmNhdChnKSl9KSx1LmluaXQocyxvKSx1LnRyYW5zbGF0b3Iub3B0aW9ucz11Lm9wdGlvbnMsdS50cmFuc2xhdG9yLmJhY2tlbmRDb25uZWN0b3Iuc2VydmljZXMudXRpbHM9e2hhc0xvYWRlZE5hbWVzcGFjZTp1Lmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKHUpfSx1fX0se2tleToidG9KU09OIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybntvcHRpb25zOnRoaXMub3B0aW9ucyxzdG9yZTp0aGlzLnN0b3JlLGxhbmd1YWdlOnRoaXMubGFuZ3VhZ2UsbGFuZ3VhZ2VzOnRoaXMubGFuZ3VhZ2VzLHJlc29sdmVkTGFuZ3VhZ2U6dGhpcy5yZXNvbHZlZExhbmd1YWdlfX19XSksbn0oSSk7Rih0ZSwiY3JlYXRlSW5zdGFuY2UiLGZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LHQ9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7cmV0dXJuIG5ldyB0ZShpLHQpfSk7dmFyIFM9dGUuY3JlYXRlSW5zdGFuY2UoKTtTLmNyZWF0ZUluc3RhbmNlPXRlLmNyZWF0ZUluc3RhbmNlLFMuY3JlYXRlSW5zdGFuY2UsUy5pbml0LFMubG9hZFJlc291cmNlcyxTLnJlbG9hZFJlc291cmNlcyxTLnVzZSxTLmNoYW5nZUxhbmd1YWdlLFMuZ2V0Rml4ZWRULFMudCxTLmV4aXN0cyxTLnNldERlZmF1bHROYW1lc3BhY2UsUy5oYXNMb2FkZWROYW1lc3BhY2UsUy5sb2FkTmFtZXNwYWNlcyxTLmxvYWRMYW5ndWFnZXM7ZnVuY3Rpb24gUnQoaSx0KXtyZXR1cm4gdD9gJHtpfV8ke3R9YDppfWZ1bmN0aW9uIHVlKGkpe3JldHVybiBpLnJlZHVjZSgodCxuKT0+dCtuLDApL2kubGVuZ3RofWZ1bmN0aW9uIERlKGkpe3JldHVybiBpLnJlZHVjZSgodCxuKT0+dCtuLDApfWZ1bmN0aW9uIGt0KGkpe2NvbnN0IHQ9aS5zb3J0KChyLGUpPT5yLWUpLG49TWF0aC5mbG9vcih0Lmxlbmd0aC8yKTtyZXR1cm4gdC5sZW5ndGglMj09PTA/KHRbbl0rdFtuLTFdKS8yOnRbbl19ZnVuY3Rpb24gVGUoaSl7Y29uc3QgdD11ZShpKTtyZXR1cm4gdWUoaS5tYXAobj0+KG4tdCkqKjIpKX1mdW5jdGlvbiBqdChpKXtyZXR1cm4gTWF0aC5zcXJ0KFRlKGkpKX1mdW5jdGlvbiBOdChpKXtsZXQgdD0tMS8wO2ZvcihsZXQgbiBvZiBpKW4+dCYmKHQ9bik7cmV0dXJuIHR9ZnVuY3Rpb24gQ3QoaSl7bGV0IHQ9MS8wO2ZvcihsZXQgbiBvZiBpKW48dCYmKHQ9bik7cmV0dXJuIHR9ZnVuY3Rpb24gRXQoaSl7cmV0dXJuIGkubGVuZ3RofWZ1bmN0aW9uIF90KGkpe3JldHVybiBuZXcgU2V0KGkpLnNpemV9Y29uc3QgRnQ9e3N1bTpEZSxtZWFuOnVlLG1lZGlhbjprdCxzdGRldjpqdCx2YXJpYW5jZTpUZSxtYXg6TnQsbWluOkN0LGNvdW50OkV0LGRpc3RpbmN0Q291bnQ6X3R9LEl0PSJfX18iO2Z1bmN0aW9uIER0KGksdCl7dmFyIG87Y29uc3R7Z3JvdXBCeTpuLG1lYXN1cmVzOnJ9PXQsZT1uZXcgTWFwLGE9bmV3IE1hcDtmb3IobGV0IHMgb2YgaSl7Y29uc3QgdT1uLm1hcChsPT5zW2xdKS5qb2luKEl0KTthLmhhcyh1KXx8YS5zZXQodSxbXSksKG89YS5nZXQodSkpPT1udWxsfHxvLnB1c2gocyl9Zm9yKGxldFtzLHVdb2YgYSl7aWYodS5sZW5ndGg9PT0wKWNvbnRpbnVlO2xldCBsPXt9O2ZvcihsZXQgYyBvZiBuKWxbY109dVswXVtjXTtmb3IobGV0IGMgb2Ygcil7Y29uc3QgZj1jLmFzRmllbGRLZXl8fFJ0KGMuZmllbGQsYy5hZ2cpO2xbZl09PT12b2lkIDAmJihsW2ZdPTApO2NvbnN0IGc9dS5tYXAodj0+dltjLmZpZWxkXSkubWFwKHY9PmMuZm9ybWF0P25ldyBEYXRlKHYpLmdldFRpbWUoKTp2KSxwPUZ0W2MuYWdnXT8/RGU7bFtmXT1wKGcpfWUuc2V0KHMsbCl9cmV0dXJuIEFycmF5LmZyb20oZS52YWx1ZXMoKSl9ZnVuY3Rpb24gVHQoaSx0KXtjb25zdHtmb2xkQnk6bixuZXdGb2xkS2V5Q29sOnIsbmV3Rm9sZFZhbHVlQ29sOmV9PXQsYT1bXTtmb3IobGV0IG8gb2YgaSlmb3IobGV0IHMgb2Ygbil7Y29uc3QgdT17Li4ub307dVtyXT1zLHVbZV09b1tzXSxkZWxldGUgdVtzXSxhLnB1c2godSl9cmV0dXJuIGF9ZnVuY3Rpb24gQXQoaSx0KXtjb25zdHtiaW5CeTpuLG5ld0JpbkNvbDpyLGJpblNpemU6ZX09dDtsZXQgYT0xLzAsbz0tMS8wO2ZvcihsZXQgdT0wO3U8aS5sZW5ndGg7dSsrKXtsZXQgbD1pW3VdW25dO2w+byYmKG89bCksbDxhJiYoYT1sKX1jb25zdCBzPShvLWEpL2U7cmV0dXJuIGkubWFwKHU9PntsZXQgbD1NYXRoLmZsb29yKCh1W25dLWEpL3MpO3JldHVybiBsPT09ZSYmKGw9ZS0xKSx7Li4udSxbcl06W2wqcythLChsKzEpKnMrYV19fSl9ZnVuY3Rpb24gS3QoaSx0KXtzd2l0Y2godC5vcCl7Y2FzZSJhZ2dyZWdhdGUiOnJldHVybiBEdChpLHQpO2Nhc2UiZm9sZCI6cmV0dXJuIFR0KGksdCk7Y2FzZSJiaW4iOnJldHVybiBBdChpLHQpO2Nhc2UicmF3IjpkZWZhdWx0OnJldHVybiBpfX1jb25zdCBVdD1pPT57dHJ5e2NvbnN0e2RhdGFTb3VyY2U6dCxxdWVyeTpufT1pLmRhdGEscj1LdCh0LG4pO3NlbGYucG9zdE1lc3NhZ2Uocil9Y2F0Y2godCl7Y29uc29sZS5lcnJvcih0LnN0YWNrKSxzZWxmLnBvc3RNZXNzYWdlKHQuc3RhY2spfX07c2VsZi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixVdCwhMSl9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD12aWV3UXVlcnkud29ya2VyLTc4OTZlYWQ1LmpzLm1hcAo=",QD=typeof window<"u"&&window.Blob&&new Blob([atob($D)],{type:"text/javascript;charset=utf-8"});function $2e(){const e=QD&&(window.URL||window.webkitURL).createObjectURL(QD);try{return e?new Worker(e):new Worker("data:application/javascript;base64,"+$D)}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const qD="dmFyIHk9T2JqZWN0LmRlZmluZVByb3BlcnR5O3ZhciBDPShvLGEscCk9PmEgaW4gbz95KG8sYSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6cH0pOm9bYV09cDt2YXIgUz0obyxhLHApPT4oQyhvLHR5cGVvZiBhIT0ic3ltYm9sIj9hKyIiOmEscCkscCk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8odCxlLHIsbCxjLG4pe2lmKGw+PWUubGVuZ3RoKXJldHVybjtjb25zdCBpPXJbZVtsXV0sdT1gJHt0LnVuaXF1ZUtleX1fXyR7aX1gO2xldCBoPXQuY2hpbGRyZW4uZmluZChmPT5mLmtleT09PWkpO2lmKCFoKXtoPXtrZXk6aSx2YWx1ZTppLHNvcnQ6bD09PWUubGVuZ3RoLTEmJm4/cltuLmZpZF0/P2BfJHtpfWA6aSx1bmlxdWVLZXk6dSxmaWVsZEtleTplW2xdLGNoaWxkcmVuOltdLHBhdGg6Wy4uLnQucGF0aCx7a2V5OmVbbF0sdmFsdWU6aX1dLGhlaWdodDplLmxlbmd0aC1sLTEsaXNDb2xsYXBzZWQ6ITF9LGMuaW5jbHVkZXModC51bmlxdWVLZXkpJiYodC5pc0NvbGxhcHNlZD0hMCk7Y29uc3QgZj1sPT09ZS5sZW5ndGgtMSYmKG49PW51bGw/dm9pZCAwOm4udHlwZSk9PT0iZGVzY2VuZGluZyI7dC5jaGlsZHJlbi5zcGxpY2UoYSh0LmNoaWxkcmVuLGguc29ydCxmKSwwLGgpfW8oaCxlLHIsbCsxLGMsbil9ZnVuY3Rpb24gYSh0LGUscj0hMSl7bGV0IGw9MCxjPXQubGVuZ3RoLTE7Zm9yKDtsPD1jOyl7bGV0IG49TWF0aC5mbG9vcigobCtjKS8yKSxpPXRbbl0uc29ydDtpZih0eXBlb2YgaT09Im51bWJlciImJnR5cGVvZiBlPT0ibnVtYmVyIilyIT09aTxlP2w9bisxOmM9bi0xO2Vsc2V7bGV0IHU9U3RyaW5nKGkpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGUpKTtyIT09dTwwP2w9bisxOmM9bi0xfX1yZXR1cm4gbH1jb25zdCBwPSJfX3Jvb3QiLEU9Il9fdG90YWwiO2Z1bmN0aW9uIE0odCl7aWYodC5jaGlsZHJlbi5sZW5ndGg+MCl7dC5jaGlsZHJlbi5wdXNoKHtrZXk6RSx2YWx1ZToidG90YWwiLHNvcnQ6IiIsZmllbGRLZXk6dC5jaGlsZHJlblswXS5maWVsZEtleSx1bmlxdWVLZXk6YCR7dC51bmlxdWVLZXl9JHtFfWAsY2hpbGRyZW46W10scGF0aDpbXSxoZWlnaHQ6dC5jaGlsZHJlblswXS5oZWlnaHQsaXNDb2xsYXBzZWQ6ITB9KTtmb3IobGV0IGU9MDtlPHQuY2hpbGRyZW4ubGVuZ3RoLTE7ZSsrKU0odC5jaGlsZHJlbltlXSl9fWZ1bmN0aW9uIGcodCxlLHIsbCxjLG4pe2NvbnN0IGk9e2tleTpwLHZhbHVlOiJyb290IixmaWVsZEtleToicm9vdCIsc29ydDoiIix1bmlxdWVLZXk6cCxjaGlsZHJlbjpbXSxwYXRoOltdLGhlaWdodDp0Lmxlbmd0aCxpc0NvbGxhcHNlZDohMX07Zm9yKGxldCB1IG9mIGUpbyhpLHQsdSwwLHIsYyk7aWYobilmb3IobGV0IHUgb2YgbilvKGksdCx1LDAscix7ZmlkOiIiLHR5cGU6KGM9PW51bGw/dm9pZCAwOmMudHlwZSk/PyJhc2NlbmRpbmcifSk7cmV0dXJuIGwmJk0oaSksaX1jbGFzcyBOe2NvbnN0cnVjdG9yKGUpe1ModGhpcywidHJlZSIpO1ModGhpcywibm9kZVN0YWNrIixbXSk7Uyh0aGlzLCJjdXJyZW50IixudWxsKTt0aGlzLnRyZWU9ZX1maXJzdCgpe2xldCBlPXRoaXMudHJlZTtmb3IodGhpcy5ub2RlU3RhY2s9W2VdO2UuY2hpbGRyZW4ubGVuZ3RoPjAmJiFlLmlzQ29sbGFwc2VkOyl0aGlzLm5vZGVTdGFjay5wdXNoKGUuY2hpbGRyZW5bMF0pLGU9ZS5jaGlsZHJlblswXTtyZXR1cm4gdGhpcy5jdXJyZW50PWUsdGhpcy5jdXJyZW50fW5leHQoKXtsZXQgZT0hMSxyPTA7Zm9yKDt0aGlzLm5vZGVTdGFjay5sZW5ndGg+MSYmKHIrKywhKHI+MTAwKSk7KXtsZXQgbD10aGlzLm5vZGVTdGFja1t0aGlzLm5vZGVTdGFjay5sZW5ndGgtMV0sYz10aGlzLm5vZGVTdGFja1t0aGlzLm5vZGVTdGFjay5sZW5ndGgtMl0sbj1jLmNoaWxkcmVuLmZpbmRJbmRleChpPT5pLmtleT09PWwua2V5KTtpZihuPT09LTEpYnJlYWs7aWYoZSlpZihsLmNoaWxkcmVuLmxlbmd0aD4wJiYhbC5pc0NvbGxhcHNlZCl7dGhpcy5ub2RlU3RhY2sucHVzaChsLmNoaWxkcmVuWzBdKTtjb250aW51ZX1lbHNlIGJyZWFrO2Vsc2V7aWYobjxjLmNoaWxkcmVuLmxlbmd0aC0xKXt0aGlzLm5vZGVTdGFjay5wb3AoKSx0aGlzLm5vZGVTdGFjay5wdXNoKGMuY2hpbGRyZW5bbisxXSksZT0hMDtjb250aW51ZX1pZihuPj1jLmNoaWxkcmVuLmxlbmd0aC0xKXt0aGlzLm5vZGVTdGFjay5wb3AoKTtjb250aW51ZX19fXJldHVybiBlP3RoaXMuY3VycmVudD10aGlzLm5vZGVTdGFja1t0aGlzLm5vZGVTdGFjay5sZW5ndGgtMV18fG51bGw6dGhpcy5jdXJyZW50PW51bGwsdGhpcy5jdXJyZW50fXByZWRpY2F0ZXMoKXtyZXR1cm4gdGhpcy5ub2RlU3RhY2suZmlsdGVyKGU9PmUua2V5IT09cCkubWFwKGU9Pih7a2V5OmUuZmllbGRLZXksdmFsdWU6ZS52YWx1ZX0pKX19ZnVuY3Rpb24gTyh0LGUscil7Y29uc3QgbD1bXSxjPW5ldyBOKHQpLG49bmV3IE4oZSk7Zm9yKGMuZmlyc3QoKTtjLmN1cnJlbnQhPT1udWxsOyl7Y29uc3QgaT1bXTtmb3Iobi5maXJzdCgpO24uY3VycmVudCE9PW51bGw7KXtjb25zdCB1PWMucHJlZGljYXRlcygpLmNvbmNhdChuLnByZWRpY2F0ZXMoKSkuZmlsdGVyKGY9PmYudmFsdWUhPT0idG90YWwiKSxoPXIuZmlsdGVyKGY9PnUuZXZlcnkoZD0+ZltkLmtleV09PT1kLnZhbHVlKSk7aC5sZW5ndGg+MD9pLnB1c2goaC5yZWR1Y2UoKGYsZCk9Pk9iamVjdC5rZXlzKGYpLmxlbmd0aDxPYmplY3Qua2V5cyhkKS5sZW5ndGg/ZjpkKSk6aS5wdXNoKHZvaWQgMCksbi5uZXh0KCl9bC5wdXNoKGkpLGMubmV4dCgpfXJldHVybiBsfWNvbnN0IG09dD0+dC5jaGlsZHJlbi5sZW5ndGg+MD9bdCwuLi5tKHQuY2hpbGRyZW5bMF0pXTpbdF07ZnVuY3Rpb24gJCh0LGUscixsLGMsbixpKXtsZXQgdSxoO2lmKChpPT1udWxsP3ZvaWQgMDppLm1vZGUpPT09InJvdyIpaWYoaD1nKGUubWFwKGQ9PmQuZmlkKSxyLGMsbiksZS5sZW5ndGg+MCl7Y29uc3QgZD1lLm1hcChzPT5zLmZpZCksXz1tKGguY2hpbGRyZW5bMF0pLm1hcChzPT5zLnZhbHVlKSxrPVtdLHY9W107ci5mb3JFYWNoKHM9PmQuZXZlcnkoKGIscSk9PnNbYl09PT1fW3FdKT9rLnB1c2gocyk6di5wdXNoKHMpKSx1PWcodC5tYXAocz0+cy5maWQpLGssYyxuLGksdil9ZWxzZSB1PWcodC5tYXAoZD0+ZC5maWQpLHIsYyxuLGkpO2Vsc2UgaWYodT1nKHQubWFwKGQ9PmQuZmlkKSxyLGMsbiksaSYmdC5sZW5ndGg+MCl7Y29uc3QgZD10Lm1hcChzPT5zLmZpZCksXz1tKHUuY2hpbGRyZW5bMF0pLm1hcChzPT5zLnZhbHVlKSxrPVtdLHY9W107ci5mb3JFYWNoKHM9PmQuZXZlcnkoKGIscSk9PnNbYl09PT1fW3FdKT9rLnB1c2gocyk6di5wdXNoKHMpKSxoPWcoZS5tYXAocz0+cy5maWQpLGssYyxuLGksdil9ZWxzZSBoPWcoZS5tYXAoZD0+ZC5maWQpLHIsYyxuLGkpO2NvbnN0IGY9Tyh1LGgsWy4uLnIsLi4ubF0pO3JldHVybntsdDp1LHR0OmgsbWV0cmljOmZ9fWNvbnN0IHc9dD0+e2NvbnN0e2RpbXNJblJvdzplLGRpbXNJbkNvbHVtbjpyLGFsbERhdGE6bCxhZ2dEYXRhOmMsY29sbGFwc2VkS2V5TGlzdDpuLHNob3dUYWJsZVN1bW1hcnk6aSxzb3J0OnV9PXQuZGF0YTt0cnl7Y29uc3QgaD0kKGUscixsLGMsbixpLHUpO3NlbGYucG9zdE1lc3NhZ2UoaCl9Y2F0Y2goaCl7c2VsZi5wb3N0TWVzc2FnZSh7ZXJyb3I6aC5tZXNzYWdlfSl9fTtzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHcsITEpfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVpbGRNZXRyaWNUYWJsZS53b3JrZXItMmNmMGM1M2IuanMubWFwCg==",ej=typeof window<"u"&&window.Blob&&new Blob([atob(qD)],{type:"text/javascript;charset=utf-8"});function Q2e(){const e=ej&&(window.URL||window.webkitURL).createObjectURL(ej);try{return e?new Worker(e):new Worker("data:application/javascript;base64,"+qD)}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const tj="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIFAoaSl7cmV0dXJuIFA9dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09InN5bWJvbCI/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LFAoaSl9ZnVuY3Rpb24gUihpLHQpe2lmKCEoaSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIEJlKGksdCl7aWYoUChpKSE9PSJvYmplY3QifHxpPT09bnVsbClyZXR1cm4gaTt2YXIgbj1pW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKGksdHx8ImRlZmF1bHQiKTtpZihQKHIpIT09Im9iamVjdCIpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4odD09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKGkpfWZ1bmN0aW9uIGdlKGkpe3ZhciB0PUJlKGksInN0cmluZyIpO3JldHVybiBQKHQpPT09InN5bWJvbCI/dDpTdHJpbmcodCl9ZnVuY3Rpb24gcGUoaSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLGdlKHIua2V5KSxyKX19ZnVuY3Rpb24gayhpLHQsbil7cmV0dXJuIHQmJnBlKGkucHJvdG90eXBlLHQpLG4mJnBlKGksbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksaX1mdW5jdGlvbiBGKGkpe2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gaX1mdW5jdGlvbiBpZShpLHQpe3JldHVybiBpZT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLGUpe3JldHVybiByLl9fcHJvdG9fXz1lLHJ9LGllKGksdCl9ZnVuY3Rpb24gUShpLHQpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24iJiZ0IT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2kucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTppLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0JiZpZShpLHQpfWZ1bmN0aW9uIEIoaSx0KXtpZih0JiYoUCh0KT09PSJvYmplY3QifHx0eXBlb2YgdD09ImZ1bmN0aW9uIikpcmV0dXJuIHQ7aWYodCE9PXZvaWQgMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpO3JldHVybiBGKGkpfWZ1bmN0aW9uIGooaSl7cmV0dXJuIGo9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24obil7cmV0dXJuIG4uX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2Yobil9LGooaSl9ZnVuY3Rpb24gXyhpLHQsbil7cmV0dXJuIHQ9Z2UodCksdCBpbiBpP09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTppW3RdPW4saX1mdW5jdGlvbiBNZShpKXtpZihBcnJheS5pc0FycmF5KGkpKXJldHVybiBpfWZ1bmN0aW9uIEhlKGkpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZpW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGlbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShpKX1mdW5jdGlvbiBkZShpLHQpeyh0PT1udWxsfHx0PmkubGVuZ3RoKSYmKHQ9aS5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KHQpO248dDtuKyspcltuXT1pW25dO3JldHVybiByfWZ1bmN0aW9uIEplKGksdCl7aWYoaSl7aWYodHlwZW9mIGk9PSJzdHJpbmciKXJldHVybiBkZShpLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpKS5zbGljZSg4LC0xKTtpZihuPT09Ik9iamVjdCImJmkuY29uc3RydWN0b3ImJihuPWkuY29uc3RydWN0b3IubmFtZSksbj09PSJNYXAifHxuPT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20oaSk7aWYobj09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gZGUoaSx0KX19ZnVuY3Rpb24gemUoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gV2UoaSl7cmV0dXJuIE1lKGkpfHxIZShpKXx8SmUoaSl8fHplKCl9ZnVuY3Rpb24gaGUoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiB2ZShpKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF0hPW51bGw/YXJndW1lbnRzW3RdOnt9O3QlMj9oZShPYmplY3QobiksITApLmZvckVhY2goZnVuY3Rpb24ocil7XyhpLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpoZShPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGl9dmFyIFllPXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgibG9nIix0KX0sd2FybjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgid2FybiIsdCl9LGVycm9yOmZ1bmN0aW9uKHQpe3RoaXMub3V0cHV0KCJlcnJvciIsdCl9LG91dHB1dDpmdW5jdGlvbih0LG4pe2NvbnNvbGUmJmNvbnNvbGVbdF0mJmNvbnNvbGVbdF0uYXBwbHkoY29uc29sZSxuKX19LEdlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSh0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e307Uih0aGlzLGkpLHRoaXMuaW5pdCh0LG4pfXJldHVybiBrKGksW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1yLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj1ufHxZZSx0aGlzLm9wdGlvbnM9cix0aGlzLmRlYnVnPXIuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24obil7dGhpcy5kZWJ1Zz1ufX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGU9MDtlPG47ZSsrKXJbZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQociwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGU9MDtlPG47ZSsrKXJbZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQociwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobiksZT0wO2U8bjtlKyspcltlXT1hcmd1bWVudHNbZV07cmV0dXJuIHRoaXMuZm9yd2FyZChyLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGU9MDtlPG47ZSsrKXJbZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQociwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbihuLHIsZSxhKXtyZXR1cm4gYSYmIXRoaXMuZGVidWc/bnVsbDoodHlwZW9mIG5bMF09PSJzdHJpbmciJiYoblswXT0iIi5jb25jYXQoZSkuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KG5bMF0pKSx0aGlzLmxvZ2dlcltyXShuKSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKG4pe3JldHVybiBuZXcgaSh0aGlzLmxvZ2dlcix2ZSh2ZSh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdChuLCI6Iil9KSx0aGlzLm9wdGlvbnMpKX19LHtrZXk6ImNsb25lIix2YWx1ZTpmdW5jdGlvbihuKXtyZXR1cm4gbj1ufHx0aGlzLm9wdGlvbnMsbi5wcmVmaXg9bi5wcmVmaXh8fHRoaXMucHJlZml4LG5ldyBpKHRoaXMubG9nZ2VyLG4pfX1dKSxpfSgpLE49bmV3IEdlLEk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7Uih0aGlzLGkpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBrKGksW3trZXk6Im9uIix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBlPXRoaXM7cmV0dXJuIG4uc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Uub2JzZXJ2ZXJzW2FdPWUub2JzZXJ2ZXJzW2FdfHxbXSxlLm9ic2VydmVyc1thXS5wdXNoKHIpfSksdGhpc319LHtrZXk6Im9mZiIsdmFsdWU6ZnVuY3Rpb24obixyKXtpZih0aGlzLm9ic2VydmVyc1tuXSl7aWYoIXIpe2RlbGV0ZSB0aGlzLm9ic2VydmVyc1tuXTtyZXR1cm59dGhpcy5vYnNlcnZlcnNbbl09dGhpcy5vYnNlcnZlcnNbbl0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09cn0pfX19LHtrZXk6ImVtaXQiLHZhbHVlOmZ1bmN0aW9uKG4pe2Zvcih2YXIgcj1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHI+MT9yLTE6MCksYT0xO2E8cjthKyspZVthLTFdPWFyZ3VtZW50c1thXTtpZih0aGlzLm9ic2VydmVyc1tuXSl7dmFyIG89W10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzW25dKTtvLmZvckVhY2goZnVuY3Rpb24odSl7dS5hcHBseSh2b2lkIDAsZSl9KX1pZih0aGlzLm9ic2VydmVyc1siKiJdKXt2YXIgcz1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbIioiXSk7cy5mb3JFYWNoKGZ1bmN0aW9uKHUpe3UuYXBwbHkodSxbbl0uY29uY2F0KGUpKX0pfX19XSksaX0oKTtmdW5jdGlvbiBNKCl7dmFyIGksdCxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHIsZSl7aT1yLHQ9ZX0pO3JldHVybiBuLnJlc29sdmU9aSxuLnJlamVjdD10LG59ZnVuY3Rpb24gbWUoaSl7cmV0dXJuIGk9PW51bGw/IiI6IiIraX1mdW5jdGlvbiBRZShpLHQsbil7aS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3Rbcl0mJihuW3JdPXRbcl0pfSl9ZnVuY3Rpb24gb2UoaSx0LG4pe2Z1bmN0aW9uIHIocyl7cmV0dXJuIHMmJnMuaW5kZXhPZigiIyMjIik+LTE/cy5yZXBsYWNlKC8jIyMvZywiLiIpOnN9ZnVuY3Rpb24gZSgpe3JldHVybiFpfHx0eXBlb2YgaT09InN0cmluZyJ9Zm9yKHZhciBhPXR5cGVvZiB0IT0ic3RyaW5nIj9bXS5jb25jYXQodCk6dC5zcGxpdCgiLiIpO2EubGVuZ3RoPjE7KXtpZihlKCkpcmV0dXJue307dmFyIG89cihhLnNoaWZ0KCkpOyFpW29dJiZuJiYoaVtvXT1uZXcgbiksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksbyk/aT1pW29dOmk9e319cmV0dXJuIGUoKT97fTp7b2JqOmksazpyKGEuc2hpZnQoKSl9fWZ1bmN0aW9uIHllKGksdCxuKXt2YXIgcj1vZShpLHQsT2JqZWN0KSxlPXIub2JqLGE9ci5rO2VbYV09bn1mdW5jdGlvbiBaZShpLHQsbixyKXt2YXIgZT1vZShpLHQsT2JqZWN0KSxhPWUub2JqLG89ZS5rO2Fbb109YVtvXXx8W10sciYmKGFbb109YVtvXS5jb25jYXQobikpLHJ8fGFbb10ucHVzaChuKX1mdW5jdGlvbiBaKGksdCl7dmFyIG49b2UoaSx0KSxyPW4ub2JqLGU9bi5rO2lmKHIpcmV0dXJuIHJbZV19ZnVuY3Rpb24gYmUoaSx0LG4pe3ZhciByPVooaSxuKTtyZXR1cm4gciE9PXZvaWQgMD9yOloodCxuKX1mdW5jdGlvbiBPZShpLHQsbil7Zm9yKHZhciByIGluIHQpciE9PSJfX3Byb3RvX18iJiZyIT09ImNvbnN0cnVjdG9yIiYmKHIgaW4gaT90eXBlb2YgaVtyXT09InN0cmluZyJ8fGlbcl1pbnN0YW5jZW9mIFN0cmluZ3x8dHlwZW9mIHRbcl09PSJzdHJpbmcifHx0W3JdaW5zdGFuY2VvZiBTdHJpbmc/biYmKGlbcl09dFtyXSk6T2UoaVtyXSx0W3JdLG4pOmlbcl09dFtyXSk7cmV0dXJuIGl9ZnVuY3Rpb24gQShpKXtyZXR1cm4gaS5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csIlxcJCYiKX12YXIgcWU9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiBYZShpKXtyZXR1cm4gdHlwZW9mIGk9PSJzdHJpbmciP2kucmVwbGFjZSgvWyY8PiInXC9dL2csZnVuY3Rpb24odCl7cmV0dXJuIHFlW3RdfSk6aX12YXIgcT10eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93Lm5hdmlnYXRvciYmdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50RGF0YT4idSImJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+LTEsZXQ9WyIgIiwiLCIsIj8iLCIhIiwiOyJdO2Z1bmN0aW9uIHR0KGksdCxuKXt0PXR8fCIiLG49bnx8IiI7dmFyIHI9ZXQuZmlsdGVyKGZ1bmN0aW9uKHMpe3JldHVybiB0LmluZGV4T2Yocyk8MCYmbi5pbmRleE9mKHMpPDB9KTtpZihyLmxlbmd0aD09PTApcmV0dXJuITA7dmFyIGU9bmV3IFJlZ0V4cCgiKCIuY29uY2F0KHIubWFwKGZ1bmN0aW9uKHMpe3JldHVybiBzPT09Ij8iPyJcXD8iOnN9KS5qb2luKCJ8IiksIikiKSksYT0hZS50ZXN0KGkpO2lmKCFhKXt2YXIgbz1pLmluZGV4T2Yobik7bz4wJiYhZS50ZXN0KGkuc3Vic3RyaW5nKDAsbykpJiYoYT0hMCl9cmV0dXJuIGF9ZnVuY3Rpb24gU2UoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBYKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP1NlKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtfKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlNlKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiBydChpKXt2YXIgdD1udCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWooaSksZTtpZih0KXt2YXIgYT1qKHRoaXMpLmNvbnN0cnVjdG9yO2U9UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsYSl9ZWxzZSBlPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBCKHRoaXMsZSl9fWZ1bmN0aW9uIG50KCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIHdlKGksdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiIuIjtpZihpKXtpZihpW3RdKXJldHVybiBpW3RdO2Zvcih2YXIgcj10LnNwbGl0KG4pLGU9aSxhPTA7YTxyLmxlbmd0aDsrK2Epe2lmKCFlfHx0eXBlb2YgZVtyW2FdXT09InN0cmluZyImJmErMTxyLmxlbmd0aClyZXR1cm47aWYoZVtyW2FdXT09PXZvaWQgMCl7Zm9yKHZhciBvPTIscz1yLnNsaWNlKGEsYStvKS5qb2luKG4pLHU9ZVtzXTt1PT09dm9pZCAwJiZyLmxlbmd0aD5hK287KW8rKyxzPXIuc2xpY2UoYSxhK28pLmpvaW4obiksdT1lW3NdO2lmKHU9PT12b2lkIDApcmV0dXJuO2lmKHU9PT1udWxsKXJldHVybiBudWxsO2lmKHQuZW5kc1dpdGgocykpe2lmKHR5cGVvZiB1PT0ic3RyaW5nIilyZXR1cm4gdTtpZihzJiZ0eXBlb2YgdVtzXT09InN0cmluZyIpcmV0dXJuIHVbc119dmFyIGw9ci5zbGljZShhK28pLmpvaW4obik7cmV0dXJuIGw/d2UodSxsLG4pOnZvaWQgMH1lPWVbclthXV19cmV0dXJuIGV9fXZhciBhdD1mdW5jdGlvbihpKXtRKG4saSk7dmFyIHQ9cnQobik7ZnVuY3Rpb24gbihyKXt2YXIgZSxhPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7bnM6WyJ0cmFuc2xhdGlvbiJdLGRlZmF1bHROUzoidHJhbnNsYXRpb24ifTtyZXR1cm4gUih0aGlzLG4pLGU9dC5jYWxsKHRoaXMpLHEmJkkuY2FsbChGKGUpKSxlLmRhdGE9cnx8e30sZS5vcHRpb25zPWEsZS5vcHRpb25zLmtleVNlcGFyYXRvcj09PXZvaWQgMCYmKGUub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxlLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZT09PXZvaWQgMCYmKGUub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlPSEwKSxlfXJldHVybiBrKG4sW3trZXk6ImFkZE5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucy5ucy5pbmRleE9mKGUpPDAmJnRoaXMub3B0aW9ucy5ucy5wdXNoKGUpfX0se2tleToicmVtb3ZlTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcy5vcHRpb25zLm5zLmluZGV4T2YoZSk7YT4tMSYmdGhpcy5vcHRpb25zLm5zLnNwbGljZShhLDEpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106e30sdT1zLmtleVNlcGFyYXRvciE9PXZvaWQgMD9zLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGw9cy5pZ25vcmVKU09OU3RydWN0dXJlIT09dm9pZCAwP3MuaWdub3JlSlNPTlN0cnVjdHVyZTp0aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSxjPVtlLGFdO28mJnR5cGVvZiBvIT0ic3RyaW5nIiYmKGM9Yy5jb25jYXQobykpLG8mJnR5cGVvZiBvPT0ic3RyaW5nIiYmKGM9Yy5jb25jYXQodT9vLnNwbGl0KHUpOm8pKSxlLmluZGV4T2YoIi4iKT4tMSYmKGM9ZS5zcGxpdCgiLiIpKTt2YXIgZj1aKHRoaXMuZGF0YSxjKTtyZXR1cm4gZnx8IWx8fHR5cGVvZiBvIT0ic3RyaW5nIj9mOndlKHRoaXMuZGF0YSYmdGhpcy5kYXRhW2VdJiZ0aGlzLmRhdGFbZV1bYV0sbyx1KX19LHtrZXk6ImFkZFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyxzKXt2YXIgdT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06e3NpbGVudDohMX0sbD10aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO2w9PT12b2lkIDAmJihsPSIuIik7dmFyIGM9W2UsYV07byYmKGM9Yy5jb25jYXQobD9vLnNwbGl0KGwpOm8pKSxlLmluZGV4T2YoIi4iKT4tMSYmKGM9ZS5zcGxpdCgiLiIpLHM9YSxhPWNbMV0pLHRoaXMuYWRkTmFtZXNwYWNlcyhhKSx5ZSh0aGlzLmRhdGEsYyxzKSx1LnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsZSxhLG8scyl9fSx7a2V5OiJhZGRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106e3NpbGVudDohMX07Zm9yKHZhciB1IGluIG8pKHR5cGVvZiBvW3VdPT0ic3RyaW5nInx8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShvW3VdKT09PSJbb2JqZWN0IEFycmF5XSIpJiZ0aGlzLmFkZFJlc291cmNlKGUsYSx1LG9bdV0se3NpbGVudDohMH0pO3Muc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIixlLGEsbyl9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8scyx1KXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06e3NpbGVudDohMX0sYz1bZSxhXTtlLmluZGV4T2YoIi4iKT4tMSYmKGM9ZS5zcGxpdCgiLiIpLHM9byxvPWEsYT1jWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoYSk7dmFyIGY9Wih0aGlzLmRhdGEsYyl8fHt9O3M/T2UoZixvLHUpOmY9WChYKHt9LGYpLG8pLHllKHRoaXMuZGF0YSxjLGYpLGwuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIixlLGEsbyl9fSx7a2V5OiJyZW1vdmVSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXt0aGlzLmhhc1Jlc291cmNlQnVuZGxlKGUsYSkmJmRlbGV0ZSB0aGlzLmRhdGFbZV1bYV0sdGhpcy5yZW1vdmVOYW1lc3BhY2VzKGEpLHRoaXMuZW1pdCgicmVtb3ZlZCIsZSxhKX19LHtrZXk6Imhhc1Jlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbihlLGEpe3JldHVybiB0aGlzLmdldFJlc291cmNlKGUsYSkhPT12b2lkIDB9fSx7a2V5OiJnZXRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXtyZXR1cm4gYXx8KGE9dGhpcy5vcHRpb25zLmRlZmF1bHROUyksdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk9PT0idjEiP1goWCh7fSx7fSksdGhpcy5nZXRSZXNvdXJjZShlLGEpKTp0aGlzLmdldFJlc291cmNlKGUsYSl9fSx7a2V5OiJnZXREYXRhQnlMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZGF0YVtlXX19LHtrZXk6Imhhc0xhbmd1YWdlU29tZVRyYW5zbGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcy5nZXREYXRhQnlMYW5ndWFnZShlKSxvPWEmJk9iamVjdC5rZXlzKGEpfHxbXTtyZXR1cm4hIW8uZmluZChmdW5jdGlvbihzKXtyZXR1cm4gYVtzXSYmT2JqZWN0LmtleXMoYVtzXSkubGVuZ3RoPjB9KX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX1dKSxufShJKSx4ZT17cHJvY2Vzc29yczp7fSxhZGRQb3N0UHJvY2Vzc29yOmZ1bmN0aW9uKHQpe3RoaXMucHJvY2Vzc29yc1t0Lm5hbWVdPXR9LGhhbmRsZTpmdW5jdGlvbih0LG4scixlLGEpe3ZhciBvPXRoaXM7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihzKXtvLnByb2Nlc3NvcnNbc10mJihuPW8ucHJvY2Vzc29yc1tzXS5wcm9jZXNzKG4scixlLGEpKX0pLG59fTtmdW5jdGlvbiBQZShpLHQpe3ZhciBuPU9iamVjdC5rZXlzKGkpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIFMoaSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdIT1udWxsP2FyZ3VtZW50c1t0XTp7fTt0JTI/UGUoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe18oaSxyLG5bcl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6UGUoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHIsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHIpKX0pfXJldHVybiBpfWZ1bmN0aW9uIGl0KGkpe3ZhciB0PW90KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9aihpKSxlO2lmKHQpe3ZhciBhPWoodGhpcykuY29uc3RydWN0b3I7ZT1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxhKX1lbHNlIGU9ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIEIodGhpcyxlKX19ZnVuY3Rpb24gb3QoKXtpZih0eXBlb2YgUmVmbGVjdD4idSJ8fCFSZWZsZWN0LmNvbnN0cnVjdHx8UmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZih0eXBlb2YgUHJveHk9PSJmdW5jdGlvbiIpcmV0dXJuITA7dHJ5e3JldHVybiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbixbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaHtyZXR1cm4hMX19dmFyIExlPXt9LFJlPWZ1bmN0aW9uKGkpe1EobixpKTt2YXIgdD1pdChuKTtmdW5jdGlvbiBuKHIpe3ZhciBlLGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O3JldHVybiBSKHRoaXMsbiksZT10LmNhbGwodGhpcykscSYmSS5jYWxsKEYoZSkpLFFlKFsicmVzb3VyY2VTdG9yZSIsImxhbmd1YWdlVXRpbHMiLCJwbHVyYWxSZXNvbHZlciIsImludGVycG9sYXRvciIsImJhY2tlbmRDb25uZWN0b3IiLCJpMThuRm9ybWF0IiwidXRpbHMiXSxyLEYoZSkpLGUub3B0aW9ucz1hLGUub3B0aW9ucy5rZXlTZXBhcmF0b3I9PT12b2lkIDAmJihlLm9wdGlvbnMua2V5U2VwYXJhdG9yPSIuIiksZS5sb2dnZXI9Ti5jcmVhdGUoInRyYW5zbGF0b3IiKSxlfXJldHVybiBrKG4sW3trZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbihlKXtlJiYodGhpcy5sYW5ndWFnZT1lKX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fTtpZihlPT1udWxsKXJldHVybiExO3ZhciBvPXRoaXMucmVzb2x2ZShlLGEpO3JldHVybiBvJiZvLnJlcyE9PXZvaWQgMH19LHtrZXk6ImV4dHJhY3RGcm9tS2V5Iix2YWx1ZTpmdW5jdGlvbihlLGEpe3ZhciBvPWEubnNTZXBhcmF0b3IhPT12b2lkIDA/YS5uc1NlcGFyYXRvcjp0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7bz09PXZvaWQgMCYmKG89IjoiKTt2YXIgcz1hLmtleVNlcGFyYXRvciE9PXZvaWQgMD9hLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLHU9YS5uc3x8dGhpcy5vcHRpb25zLmRlZmF1bHROU3x8W10sbD1vJiZlLmluZGV4T2Yobyk+LTEsYz0hdGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yJiYhYS5rZXlTZXBhcmF0b3ImJiF0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvciYmIWEubnNTZXBhcmF0b3ImJiF0dChlLG8scyk7aWYobCYmIWMpe3ZhciBmPWUubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7aWYoZiYmZi5sZW5ndGg+MClyZXR1cm57a2V5OmUsbmFtZXNwYWNlczp1fTt2YXIgZz1lLnNwbGl0KG8pOyhvIT09c3x8bz09PXMmJnRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGdbMF0pPi0xKSYmKHU9Zy5zaGlmdCgpKSxlPWcuam9pbihzKX1yZXR1cm4gdHlwZW9mIHU9PSJzdHJpbmciJiYodT1bdV0pLHtrZXk6ZSxuYW1lc3BhY2VzOnV9fX0se2tleToidHJhbnNsYXRlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHM9dGhpcztpZihQKGEpIT09Im9iamVjdCImJnRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlciYmKGE9dGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cykpLGF8fChhPXt9KSxlPT1udWxsKXJldHVybiIiO0FycmF5LmlzQXJyYXkoZSl8fChlPVtTdHJpbmcoZSldKTt2YXIgdT1hLnJldHVybkRldGFpbHMhPT12b2lkIDA/YS5yZXR1cm5EZXRhaWxzOnRoaXMub3B0aW9ucy5yZXR1cm5EZXRhaWxzLGw9YS5rZXlTZXBhcmF0b3IhPT12b2lkIDA/YS5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixjPXRoaXMuZXh0cmFjdEZyb21LZXkoZVtlLmxlbmd0aC0xXSxhKSxmPWMua2V5LGc9Yy5uYW1lc3BhY2VzLHA9Z1tnLmxlbmd0aC0xXSxtPWEubG5nfHx0aGlzLmxhbmd1YWdlLHk9YS5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZXx8dGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlO2lmKG0mJm0udG9Mb3dlckNhc2UoKT09PSJjaW1vZGUiKXtpZih5KXt2YXIgdj1hLm5zU2VwYXJhdG9yfHx0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7cmV0dXJuIHU/KGQucmVzPSIiLmNvbmNhdChwKS5jb25jYXQodikuY29uY2F0KGYpLGQpOiIiLmNvbmNhdChwKS5jb25jYXQodikuY29uY2F0KGYpfXJldHVybiB1PyhkLnJlcz1mLGQpOmZ9dmFyIGQ9dGhpcy5yZXNvbHZlKGUsYSksaD1kJiZkLnJlcyxPPWQmJmQudXNlZEtleXx8ZixiPWQmJmQuZXhhY3RVc2VkS2V5fHxmLHg9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoKSxFPVsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXSxUPWEuam9pbkFycmF5cyE9PXZvaWQgMD9hLmpvaW5BcnJheXM6dGhpcy5vcHRpb25zLmpvaW5BcnJheXMsSD0hdGhpcy5pMThuRm9ybWF0fHx0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3QsSj10eXBlb2YgaCE9InN0cmluZyImJnR5cGVvZiBoIT0iYm9vbGVhbiImJnR5cGVvZiBoIT0ibnVtYmVyIjtpZihIJiZoJiZKJiZFLmluZGV4T2YoeCk8MCYmISh0eXBlb2YgVD09InN0cmluZyImJng9PT0iW29iamVjdCBBcnJheV0iKSl7aWYoIWEucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXt0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyfHx0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKTt2YXIgVT10aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIoTyxoLFMoUyh7fSxhKSx7fSx7bnM6Z30pKToia2V5ICciLmNvbmNhdChmLCIgKCIpLmNvbmNhdCh0aGlzLmxhbmd1YWdlLCIpJyByZXR1cm5lZCBhbiBvYmplY3QgaW5zdGVhZCBvZiBzdHJpbmcuIik7cmV0dXJuIHU/KGQucmVzPVUsZCk6VX1pZihsKXt2YXIgRGU9eD09PSJbb2JqZWN0IEFycmF5XSIscmU9RGU/W106e30sTnQ9RGU/YjpPO2Zvcih2YXIgViBpbiBoKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoLFYpKXt2YXIgVGU9IiIuY29uY2F0KE50KS5jb25jYXQobCkuY29uY2F0KFYpO3JlW1ZdPXRoaXMudHJhbnNsYXRlKFRlLFMoUyh7fSxhKSx7am9pbkFycmF5czohMSxuczpnfSkpLHJlW1ZdPT09VGUmJihyZVtWXT1oW1ZdKX1oPXJlfX1lbHNlIGlmKEgmJnR5cGVvZiBUPT0ic3RyaW5nIiYmeD09PSJbb2JqZWN0IEFycmF5XSIpaD1oLmpvaW4oVCksaCYmKGg9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihoLGUsYSxvKSk7ZWxzZXt2YXIgbmU9ITEsej0hMSxBZT1hLmNvdW50IT09dm9pZCAwJiZ0eXBlb2YgYS5jb3VudCE9InN0cmluZyIsdWU9bi5oYXNEZWZhdWx0VmFsdWUoYSksQ3Q9QWU/dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgobSxhLmNvdW50LGEpOiIiLFc9YVsiZGVmYXVsdFZhbHVlIi5jb25jYXQoQ3QpXXx8YS5kZWZhdWx0VmFsdWU7IXRoaXMuaXNWYWxpZExvb2t1cChoKSYmdWUmJihuZT0hMCxoPVcpLHRoaXMuaXNWYWxpZExvb2t1cChoKXx8KHo9ITAsaD1mKTt2YXIgRXQ9YS5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXl8fHRoaXMub3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXksRnQ9RXQmJno/dm9pZCAwOmgsWT11ZSYmVyE9PWgmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKHp8fG5lfHxZKXtpZih0aGlzLmxvZ2dlci5sb2coWT8idXBkYXRlS2V5IjoibWlzc2luZ0tleSIsbSxwLGYsWT9XOmgpLGwpe3ZhciBLZT10aGlzLnJlc29sdmUoZixTKFMoe30sYSkse30se2tleVNlcGFyYXRvcjohMX0pKTtLZSYmS2UucmVzJiZ0aGlzLmxvZ2dlci53YXJuKCJTZWVtcyB0aGUgbG9hZGVkIHRyYW5zbGF0aW9ucyB3ZXJlIGluIGZsYXQgSlNPTiBmb3JtYXQgaW5zdGVhZCBvZiBuZXN0ZWQuIEVpdGhlciBzZXQga2V5U2VwYXJhdG9yOiBmYWxzZSBvbiBpbml0IG9yIG1ha2Ugc3VyZSB5b3VyIHRyYW5zbGF0aW9ucyBhcmUgcHVibGlzaGVkIGluIG5lc3RlZCBmb3JtYXQuIil9dmFyIEc9W10sYWU9dGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGEubG5nfHx0aGlzLmxhbmd1YWdlKTtpZih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz09PSJmYWxsYmFjayImJmFlJiZhZVswXSlmb3IodmFyIGZlPTA7ZmU8YWUubGVuZ3RoO2ZlKyspRy5wdXNoKGFlW2ZlXSk7ZWxzZSB0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz09PSJhbGwiP0c9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShhLmxuZ3x8dGhpcy5sYW5ndWFnZSk6Ry5wdXNoKGEubG5nfHx0aGlzLmxhbmd1YWdlKTt2YXIgVWU9ZnVuY3Rpb24oJCxjZSxWZSl7dmFyICRlPXVlJiZWZSE9PWg/VmU6RnQ7cy5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyP3Mub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcigkLHAsY2UsJGUsWSxhKTpzLmJhY2tlbmRDb25uZWN0b3ImJnMuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyYmcy5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nKCQscCxjZSwkZSxZLGEpLHMuZW1pdCgibWlzc2luZ0tleSIsJCxwLGNlLGgpfTt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmcmJih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZBZT9HLmZvckVhY2goZnVuY3Rpb24obGUpe3MucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4ZXMobGUsYSkuZm9yRWFjaChmdW5jdGlvbigkKXtVZShbbGVdLGYrJCxhWyJkZWZhdWx0VmFsdWUiLmNvbmNhdCgkKV18fFcpfSl9KTpVZShHLGYsVykpfWg9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihoLGUsYSxkLG8pLHomJmg9PT1mJiZ0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5JiYoaD0iIi5jb25jYXQocCwiOiIpLmNvbmNhdChmKSksKHp8fG5lKSYmdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXImJih0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSE9PSJ2MSI/aD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcih0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5PyIiLmNvbmNhdChwLCI6IikuY29uY2F0KGYpOmYsbmU/aDp2b2lkIDApOmg9dGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIoaCkpfXJldHVybiB1PyhkLnJlcz1oLGQpOmh9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8scyx1KXt2YXIgbD10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKWU9dGhpcy5pMThuRm9ybWF0LnBhcnNlKGUsUyhTKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLG8pLHMudXNlZExuZyxzLnVzZWROUyxzLnVzZWRLZXkse3Jlc29sdmVkOnN9KTtlbHNlIGlmKCFvLnNraXBJbnRlcnBvbGF0aW9uKXtvLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLmluaXQoUyhTKHt9LG8pLHtpbnRlcnBvbGF0aW9uOlMoUyh7fSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiksby5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgYz10eXBlb2YgZT09InN0cmluZyImJihvJiZvLmludGVycG9sYXRpb24mJm8uaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMhPT12b2lkIDA/by5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlczp0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMpLGY7aWYoYyl7dmFyIGc9ZS5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtmPWcmJmcubGVuZ3RofXZhciBwPW8ucmVwbGFjZSYmdHlwZW9mIG8ucmVwbGFjZSE9InN0cmluZyI/by5yZXBsYWNlOm87aWYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyYmKHA9UyhTKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLHApKSxlPXRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKGUscCxvLmxuZ3x8dGhpcy5sYW5ndWFnZSxvKSxjKXt2YXIgbT1lLm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApLHk9bSYmbS5sZW5ndGg7Zjx5JiYoby5uZXN0PSExKX1vLm5lc3QhPT0hMSYmKGU9dGhpcy5pbnRlcnBvbGF0b3IubmVzdChlLGZ1bmN0aW9uKCl7Zm9yKHZhciBoPWFyZ3VtZW50cy5sZW5ndGgsTz1uZXcgQXJyYXkoaCksYj0wO2I8aDtiKyspT1tiXT1hcmd1bWVudHNbYl07cmV0dXJuIHUmJnVbMF09PT1PWzBdJiYhby5jb250ZXh0PyhsLmxvZ2dlci53YXJuKCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAiLmNvbmNhdChPWzBdLCIgaW4ga2V5OiAiKS5jb25jYXQoYVswXSkpLG51bGwpOmwudHJhbnNsYXRlLmFwcGx5KGwsTy5jb25jYXQoW2FdKSl9LG8pKSxvLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIHY9by5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLGQ9dHlwZW9mIHY9PSJzdHJpbmciP1t2XTp2O3JldHVybiBlIT1udWxsJiZkJiZkLmxlbmd0aCYmby5hcHBseVBvc3RQcm9jZXNzb3IhPT0hMSYmKGU9eGUuaGFuZGxlKGQsZSxhLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkP1Moe2kxOG5SZXNvbHZlZDpzfSxvKTpvLHRoaXMpKSxlfX0se2tleToicmVzb2x2ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcyxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxzLHUsbCxjLGY7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKSxlLmZvckVhY2goZnVuY3Rpb24oZyl7aWYoIWEuaXNWYWxpZExvb2t1cChzKSl7dmFyIHA9YS5leHRyYWN0RnJvbUtleShnLG8pLG09cC5rZXk7dT1tO3ZhciB5PXAubmFtZXNwYWNlczthLm9wdGlvbnMuZmFsbGJhY2tOUyYmKHk9eS5jb25jYXQoYS5vcHRpb25zLmZhbGxiYWNrTlMpKTt2YXIgdj1vLmNvdW50IT09dm9pZCAwJiZ0eXBlb2Ygby5jb3VudCE9InN0cmluZyIsZD12JiYhby5vcmRpbmFsJiZvLmNvdW50PT09MCYmYS5wbHVyYWxSZXNvbHZlci5zaG91bGRVc2VJbnRsQXBpKCksaD1vLmNvbnRleHQhPT12b2lkIDAmJih0eXBlb2Ygby5jb250ZXh0PT0ic3RyaW5nInx8dHlwZW9mIG8uY29udGV4dD09Im51bWJlciIpJiZvLmNvbnRleHQhPT0iIixPPW8ubG5ncz9vLmxuZ3M6YS5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvLmxuZ3x8YS5sYW5ndWFnZSxvLmZhbGxiYWNrTG5nKTt5LmZvckVhY2goZnVuY3Rpb24oYil7YS5pc1ZhbGlkTG9va3VwKHMpfHwoZj1iLCFMZVsiIi5jb25jYXQoT1swXSwiLSIpLmNvbmNhdChiKV0mJmEudXRpbHMmJmEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UoZikmJihMZVsiIi5jb25jYXQoT1swXSwiLSIpLmNvbmNhdChiKV09ITAsYS5sb2dnZXIud2Fybigna2V5ICInLmNvbmNhdCh1LCciIGZvciBsYW5ndWFnZXMgIicpLmNvbmNhdChPLmpvaW4oIiwgIiksYCIgd29uJ3QgZ2V0IHJlc29sdmVkIGFzIG5hbWVzcGFjZSAiYCkuY29uY2F0KGYsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpKSxPLmZvckVhY2goZnVuY3Rpb24oeCl7aWYoIWEuaXNWYWxpZExvb2t1cChzKSl7Yz14O3ZhciBFPVttXTtpZihhLmkxOG5Gb3JtYXQmJmEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKWEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKEUsbSx4LGIsbyk7ZWxzZXt2YXIgVDt2JiYoVD1hLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeCh4LG8uY291bnQsbykpO3ZhciBIPSIiLmNvbmNhdChhLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLCJ6ZXJvIik7aWYodiYmKEUucHVzaChtK1QpLGQmJkUucHVzaChtK0gpKSxoKXt2YXIgSj0iIi5jb25jYXQobSkuY29uY2F0KGEub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQoby5jb250ZXh0KTtFLnB1c2goSiksdiYmKEUucHVzaChKK1QpLGQmJkUucHVzaChKK0gpKX19Zm9yKHZhciBVO1U9RS5wb3AoKTspYS5pc1ZhbGlkTG9va3VwKHMpfHwobD1VLHM9YS5nZXRSZXNvdXJjZSh4LGIsVSxvKSl9fSkpfSl9fSkse3JlczpzLHVzZWRLZXk6dSxleGFjdFVzZWRLZXk6bCx1c2VkTG5nOmMsdXNlZE5TOmZ9fX0se2tleToiaXNWYWxpZExvb2t1cCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJiEoIXRoaXMub3B0aW9ucy5yZXR1cm5OdWxsJiZlPT09bnVsbCkmJiEoIXRoaXMub3B0aW9ucy5yZXR1cm5FbXB0eVN0cmluZyYmZT09PSIiKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOnt9O3JldHVybiB0aGlzLmkxOG5Gb3JtYXQmJnRoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZT90aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2UoZSxhLG8scyk6dGhpcy5yZXNvdXJjZVN0b3JlLmdldFJlc291cmNlKGUsYSxvLHMpfX1dLFt7a2V5OiJoYXNEZWZhdWx0VmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPSJkZWZhdWx0VmFsdWUiO2Zvcih2YXIgbyBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiZhPT09by5zdWJzdHJpbmcoMCxhLmxlbmd0aCkmJmVbb10hPT12b2lkIDApcmV0dXJuITA7cmV0dXJuITF9fV0pLG59KEkpO2Z1bmN0aW9uIHNlKGkpe3JldHVybiBpLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2kuc2xpY2UoMSl9dmFyIHN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSh0KXtSKHRoaXMsaSksdGhpcy5vcHRpb25zPXQsdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgibGFuZ3VhZ2VVdGlscyIpfXJldHVybiBrKGksW3trZXk6ImdldFNjcmlwdFBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7aWYoIW58fG4uaW5kZXhPZigiLSIpPDApcmV0dXJuIG51bGw7dmFyIHI9bi5zcGxpdCgiLSIpO3JldHVybiByLmxlbmd0aD09PTJ8fChyLnBvcCgpLHJbci5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKT09PSJ4Iik/bnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShyLmpvaW4oIi0iKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7aWYoIW58fG4uaW5kZXhPZigiLSIpPDApcmV0dXJuIG47dmFyIHI9bi5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShyWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7aWYodHlwZW9mIG49PSJzdHJpbmciJiZuLmluZGV4T2YoIi0iKT4tMSl7dmFyIHI9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sZT1uLnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/ZT1lLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS50b0xvd2VyQ2FzZSgpfSk6ZS5sZW5ndGg9PT0yPyhlWzBdPWVbMF0udG9Mb3dlckNhc2UoKSxlWzFdPWVbMV0udG9VcHBlckNhc2UoKSxyLmluZGV4T2YoZVsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKGVbMV09c2UoZVsxXS50b0xvd2VyQ2FzZSgpKSkpOmUubGVuZ3RoPT09MyYmKGVbMF09ZVswXS50b0xvd2VyQ2FzZSgpLGVbMV0ubGVuZ3RoPT09MiYmKGVbMV09ZVsxXS50b1VwcGVyQ2FzZSgpKSxlWzBdIT09InNnbiImJmVbMl0ubGVuZ3RoPT09MiYmKGVbMl09ZVsyXS50b1VwcGVyQ2FzZSgpKSxyLmluZGV4T2YoZVsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKGVbMV09c2UoZVsxXS50b0xvd2VyQ2FzZSgpKSksci5pbmRleE9mKGVbMl0udG9Mb3dlckNhc2UoKSk+LTEmJihlWzJdPXNlKGVbMl0udG9Mb3dlckNhc2UoKSkpKSxlLmpvaW4oIi0iKX1yZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZXx8dGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz9uLnRvTG93ZXJDYXNlKCk6bn19LHtrZXk6ImlzU3VwcG9ydGVkQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7cmV0dXJuKHRoaXMub3B0aW9ucy5sb2FkPT09Imxhbmd1YWdlT25seSJ8fHRoaXMub3B0aW9ucy5ub25FeHBsaWNpdFN1cHBvcnRlZExuZ3MpJiYobj10aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKG4pKSwhdGhpcy5zdXBwb3J0ZWRMbmdzfHwhdGhpcy5zdXBwb3J0ZWRMbmdzLmxlbmd0aHx8dGhpcy5zdXBwb3J0ZWRMbmdzLmluZGV4T2Yobik+LTF9fSx7a2V5OiJnZXRCZXN0TWF0Y2hGcm9tQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPXRoaXM7aWYoIW4pcmV0dXJuIG51bGw7dmFyIGU7cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihhKXtpZighZSl7dmFyIG89ci5mb3JtYXRMYW5ndWFnZUNvZGUoYSk7KCFyLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ci5pc1N1cHBvcnRlZENvZGUobykpJiYoZT1vKX19KSwhZSYmdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MmJm4uZm9yRWFjaChmdW5jdGlvbihhKXtpZighZSl7dmFyIG89ci5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShhKTtpZihyLmlzU3VwcG9ydGVkQ29kZShvKSlyZXR1cm4gZT1vO2U9ci5vcHRpb25zLnN1cHBvcnRlZExuZ3MuZmluZChmdW5jdGlvbihzKXtpZihzLmluZGV4T2Yobyk9PT0wKXJldHVybiBzfSl9fSksZXx8KGU9dGhpcy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZylbMF0pLGV9fSx7a2V5OiJnZXRGYWxsYmFja0NvZGVzIix2YWx1ZTpmdW5jdGlvbihuLHIpe2lmKCFuKXJldHVybltdO2lmKHR5cGVvZiBuPT0iZnVuY3Rpb24iJiYobj1uKHIpKSx0eXBlb2Ygbj09InN0cmluZyImJihuPVtuXSksT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKT09PSJbb2JqZWN0IEFycmF5XSIpcmV0dXJuIG47aWYoIXIpcmV0dXJuIG4uZGVmYXVsdHx8W107dmFyIGU9bltyXTtyZXR1cm4gZXx8KGU9blt0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShyKV0pLGV8fChlPW5bdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUocildKSxlfHwoZT1uW3RoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUocildKSxlfHwoZT1uLmRlZmF1bHQpLGV8fFtdfX0se2tleToidG9SZXNvbHZlSGllcmFyY2h5Iix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBlPXRoaXMsYT10aGlzLmdldEZhbGxiYWNrQ29kZXMocnx8dGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nfHxbXSxuKSxvPVtdLHM9ZnVuY3Rpb24obCl7bCYmKGUuaXNTdXBwb3J0ZWRDb2RlKGwpP28ucHVzaChsKTplLmxvZ2dlci53YXJuKCJyZWplY3RpbmcgbGFuZ3VhZ2UgY29kZSBub3QgZm91bmQgaW4gc3VwcG9ydGVkTG5nczogIi5jb25jYXQobCkpKX07cmV0dXJuIHR5cGVvZiBuPT0ic3RyaW5nIiYmbi5pbmRleE9mKCItIik+LTE/KHRoaXMub3B0aW9ucy5sb2FkIT09Imxhbmd1YWdlT25seSImJnModGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUobikpLHRoaXMub3B0aW9ucy5sb2FkIT09Imxhbmd1YWdlT25seSImJnRoaXMub3B0aW9ucy5sb2FkIT09ImN1cnJlbnRPbmx5IiYmcyh0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShuKSksdGhpcy5vcHRpb25zLmxvYWQhPT0iY3VycmVudE9ubHkiJiZzKHRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUobikpKTp0eXBlb2Ygbj09InN0cmluZyImJnModGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUobikpLGEuZm9yRWFjaChmdW5jdGlvbih1KXtvLmluZGV4T2YodSk8MCYmcyhlLmZvcm1hdExhbmd1YWdlQ29kZSh1KSl9KSxvfX1dKSxpfSgpLHV0PVt7bG5nczpbImFjaCIsImFrIiwiYW0iLCJhcm4iLCJiciIsImZpbCIsImd1biIsImxuIiwibWZlIiwibWciLCJtaSIsIm9jIiwicHQiLCJwdC1CUiIsInRnIiwidGwiLCJ0aSIsInRyIiwidXoiLCJ3YSJdLG5yOlsxLDJdLGZjOjF9LHtsbmdzOlsiYWYiLCJhbiIsImFzdCIsImF6IiwiYmciLCJibiIsImNhIiwiZGEiLCJkZSIsImRldiIsImVsIiwiZW4iLCJlbyIsImVzIiwiZXQiLCJldSIsImZpIiwiZm8iLCJmdXIiLCJmeSIsImdsIiwiZ3UiLCJoYSIsImhpIiwiaHUiLCJoeSIsImlhIiwiaXQiLCJrayIsImtuIiwia3UiLCJsYiIsIm1haSIsIm1sIiwibW4iLCJtciIsIm5haCIsIm5hcCIsIm5iIiwibmUiLCJubCIsIm5uIiwibm8iLCJuc28iLCJwYSIsInBhcCIsInBtcyIsInBzIiwicHQtUFQiLCJybSIsInNjbyIsInNlIiwic2kiLCJzbyIsInNvbiIsInNxIiwic3YiLCJzdyIsInRhIiwidGUiLCJ0ayIsInVyIiwieW8iXSxucjpbMSwyXSxmYzoyfSx7bG5nczpbImF5IiwiYm8iLCJjZ2ciLCJmYSIsImh0IiwiaWQiLCJqYSIsImpibyIsImthIiwia20iLCJrbyIsImt5IiwibG8iLCJtcyIsInNhaCIsInN1IiwidGgiLCJ0dCIsInVnIiwidmkiLCJ3byIsInpoIl0sbnI6WzFdLGZjOjN9LHtsbmdzOlsiYmUiLCJicyIsImNuciIsImR6IiwiaHIiLCJydSIsInNyIiwidWsiXSxucjpbMSwyLDVdLGZjOjR9LHtsbmdzOlsiYXIiXSxucjpbMCwxLDIsMywxMSwxMDBdLGZjOjV9LHtsbmdzOlsiY3MiLCJzayJdLG5yOlsxLDIsNV0sZmM6Nn0se2xuZ3M6WyJjc2IiLCJwbCJdLG5yOlsxLDIsNV0sZmM6N30se2xuZ3M6WyJjeSJdLG5yOlsxLDIsMyw4XSxmYzo4fSx7bG5nczpbImZyIl0sbnI6WzEsMl0sZmM6OX0se2xuZ3M6WyJnYSJdLG5yOlsxLDIsMyw3LDExXSxmYzoxMH0se2xuZ3M6WyJnZCJdLG5yOlsxLDIsMywyMF0sZmM6MTF9LHtsbmdzOlsiaXMiXSxucjpbMSwyXSxmYzoxMn0se2xuZ3M6WyJqdiJdLG5yOlswLDFdLGZjOjEzfSx7bG5nczpbImt3Il0sbnI6WzEsMiwzLDRdLGZjOjE0fSx7bG5nczpbImx0Il0sbnI6WzEsMiwxMF0sZmM6MTV9LHtsbmdzOlsibHYiXSxucjpbMSwyLDBdLGZjOjE2fSx7bG5nczpbIm1rIl0sbnI6WzEsMl0sZmM6MTd9LHtsbmdzOlsibW5rIl0sbnI6WzAsMSwyXSxmYzoxOH0se2xuZ3M6WyJtdCJdLG5yOlsxLDIsMTEsMjBdLGZjOjE5fSx7bG5nczpbIm9yIl0sbnI6WzIsMV0sZmM6Mn0se2xuZ3M6WyJybyJdLG5yOlsxLDIsMjBdLGZjOjIwfSx7bG5nczpbInNsIl0sbnI6WzUsMSwyLDNdLGZjOjIxfSx7bG5nczpbImhlIiwiaXciXSxucjpbMSwyLDIwLDIxXSxmYzoyMn1dLGZ0PXsxOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD4xKX0sMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQhPTEpfSwzOmZ1bmN0aW9uKHQpe3JldHVybiAwfSw0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0wPzA6dD09MT8xOnQ9PTI/Mjp0JTEwMD49MyYmdCUxMDA8PTEwPzM6dCUxMDA+PTExPzQ6NSl9LDY6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0xPzA6dD49MiYmdDw9ND8xOjIpfSw3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQlMTA+PTImJnQlMTA8PTQmJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSw4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQ9PTI/MTp0IT04JiZ0IT0xMT8yOjMpfSw5OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD49Mil9LDEwOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQ9PTI/MTp0PDc/Mjp0PDExPzM6NCl9LDExOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MXx8dD09MTE/MDp0PT0yfHx0PT0xMj8xOnQ+MiYmdDwyMD8yOjMpfSwxMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAhPTF8fHQlMTAwPT0xMSl9LDEzOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCE9PTApfSwxNDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ9PTE/MDp0PT0yPzE6dD09Mz8yOjMpfSwxNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQlMTA+PTImJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSwxNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQhPT0wPzE6Mil9LDE3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MXx8dCUxMD09MSYmdCUxMDAhPTExPzA6MSl9LDE4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MD8wOnQ9PTE/MToyKX0sMTk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0xPzA6dD09MHx8dCUxMDA+MSYmdCUxMDA8MTE/MTp0JTEwMD4xMCYmdCUxMDA8MjA/MjozKX0sMjA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0xPzA6dD09MHx8dCUxMDA+MCYmdCUxMDA8MjA/MToyKX0sMjE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwMD09MT8xOnQlMTAwPT0yPzI6dCUxMDA9PTN8fHQlMTAwPT00PzM6MCl9LDIyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQ9PTI/MToodDwwfHx0PjEwKSYmdCUxMD09MD8yOjMpfX0sbHQ9WyJ2MSIsInYyIiwidjMiXSxrZT17emVybzowLG9uZToxLHR3bzoyLGZldzozLG1hbnk6NCxvdGhlcjo1fTtmdW5jdGlvbiBjdCgpe3ZhciBpPXt9O3JldHVybiB1dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QubG5ncy5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lbbl09e251bWJlcnM6dC5ucixwbHVyYWxzOmZ0W3QuZmNdfX0pfSksaX12YXIgZ3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fTtSKHRoaXMsaSksdGhpcy5sYW5ndWFnZVV0aWxzPXQsdGhpcy5vcHRpb25zPW4sdGhpcy5sb2dnZXI9Ti5jcmVhdGUoInBsdXJhbFJlc29sdmVyIiksKCF0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT058fHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj09PSJ2NCIpJiYodHlwZW9mIEludGw+InUifHwhSW50bC5QbHVyYWxSdWxlcykmJih0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT049InYzIix0aGlzLmxvZ2dlci5lcnJvcigiWW91ciBlbnZpcm9ubWVudCBzZWVtcyBub3QgdG8gYmUgSW50bCBBUEkgY29tcGF0aWJsZSwgdXNlIGFuIEludGwuUGx1cmFsUnVsZXMgcG9seWZpbGwuIFdpbGwgZmFsbGJhY2sgdG8gdGhlIGNvbXBhdGliaWxpdHlKU09OIHYzIGZvcm1hdCBoYW5kbGluZy4iKSksdGhpcy5ydWxlcz1jdCgpfXJldHVybiBrKGksW3trZXk6ImFkZFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKG4scil7dGhpcy5ydWxlc1tuXT1yfX0se2tleToiZ2V0UnVsZSIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O2lmKHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpKXRyeXtyZXR1cm4gbmV3IEludGwuUGx1cmFsUnVsZXMobix7dHlwZTpyLm9yZGluYWw/Im9yZGluYWwiOiJjYXJkaW5hbCJ9KX1jYXRjaHtyZXR1cm59cmV0dXJuIHRoaXMucnVsZXNbbl18fHRoaXMucnVsZXNbdGhpcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKG4pXX19LHtrZXk6Im5lZWRzUGx1cmFsIix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30sZT10aGlzLmdldFJ1bGUobixyKTtyZXR1cm4gdGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/ZSYmZS5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLmxlbmd0aD4xOmUmJmUubnVtYmVycy5sZW5ndGg+MX19LHtrZXk6ImdldFBsdXJhbEZvcm1zT2ZLZXkiLHZhbHVlOmZ1bmN0aW9uKG4scil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9O3JldHVybiB0aGlzLmdldFN1ZmZpeGVzKG4sZSkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiIiLmNvbmNhdChyKS5jb25jYXQoYSl9KX19LHtrZXk6ImdldFN1ZmZpeGVzIix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj10aGlzLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LGE9dGhpcy5nZXRSdWxlKG4sZSk7cmV0dXJuIGE/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/YS5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLnNvcnQoZnVuY3Rpb24obyxzKXtyZXR1cm4ga2Vbb10ta2Vbc119KS5tYXAoZnVuY3Rpb24obyl7cmV0dXJuIiIuY29uY2F0KHIub3B0aW9ucy5wcmVwZW5kKS5jb25jYXQobyl9KTphLm51bWJlcnMubWFwKGZ1bmN0aW9uKG8pe3JldHVybiByLmdldFN1ZmZpeChuLG8sZSl9KTpbXX19LHtrZXk6ImdldFN1ZmZpeCIsdmFsdWU6ZnVuY3Rpb24obixyKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sYT10aGlzLmdldFJ1bGUobixlKTtyZXR1cm4gYT90aGlzLnNob3VsZFVzZUludGxBcGkoKT8iIi5jb25jYXQodGhpcy5vcHRpb25zLnByZXBlbmQpLmNvbmNhdChhLnNlbGVjdChyKSk6dGhpcy5nZXRTdWZmaXhSZXRyb0NvbXBhdGlibGUoYSxyKToodGhpcy5sb2dnZXIud2Fybigibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAiLmNvbmNhdChuKSksIiIpfX0se2tleToiZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlIix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBlPXRoaXMsYT1uLm5vQWJzP24ucGx1cmFscyhyKTpuLnBsdXJhbHMoTWF0aC5hYnMocikpLG89bi5udW1iZXJzW2FdO3RoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmbi5udW1iZXJzLmxlbmd0aD09PTImJm4ubnVtYmVyc1swXT09PTEmJihvPT09Mj9vPSJwbHVyYWwiOm89PT0xJiYobz0iIikpO3ZhciBzPWZ1bmN0aW9uKCl7cmV0dXJuIGUub3B0aW9ucy5wcmVwZW5kJiZvLnRvU3RyaW5nKCk/ZS5vcHRpb25zLnByZXBlbmQrby50b1N0cmluZygpOm8udG9TdHJpbmcoKX07cmV0dXJuIHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj09PSJ2MSI/bz09PTE/IiI6dHlwZW9mIG89PSJudW1iZXIiPyJfcGx1cmFsXyIuY29uY2F0KG8udG9TdHJpbmcoKSk6cygpOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj09PSJ2MiJ8fHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmbi5udW1iZXJzLmxlbmd0aD09PTImJm4ubnVtYmVyc1swXT09PTE/cygpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZhLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX19LHtrZXk6InNob3VsZFVzZUludGxBcGkiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIWx0LmluY2x1ZGVzKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTil9fV0pLGl9KCk7ZnVuY3Rpb24gamUoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBMKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP2plKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtfKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOmplKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX12YXIgcHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9O1IodGhpcyxpKSx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgiaW50ZXJwb2xhdG9yIiksdGhpcy5vcHRpb25zPXQsdGhpcy5mb3JtYXQ9dC5pbnRlcnBvbGF0aW9uJiZ0LmludGVycG9sYXRpb24uZm9ybWF0fHxmdW5jdGlvbihuKXtyZXR1cm4gbn0sdGhpcy5pbml0KHQpfXJldHVybiBrKGksW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9O24uaW50ZXJwb2xhdGlvbnx8KG4uaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTt2YXIgcj1uLmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9ci5lc2NhcGUhPT12b2lkIDA/ci5lc2NhcGU6WGUsdGhpcy5lc2NhcGVWYWx1ZT1yLmVzY2FwZVZhbHVlIT09dm9pZCAwP3IuZXNjYXBlVmFsdWU6ITAsdGhpcy51c2VSYXdWYWx1ZVRvRXNjYXBlPXIudXNlUmF3VmFsdWVUb0VzY2FwZSE9PXZvaWQgMD9yLnVzZVJhd1ZhbHVlVG9Fc2NhcGU6ITEsdGhpcy5wcmVmaXg9ci5wcmVmaXg/QShyLnByZWZpeCk6ci5wcmVmaXhFc2NhcGVkfHwie3siLHRoaXMuc3VmZml4PXIuc3VmZml4P0Eoci5zdWZmaXgpOnIuc3VmZml4RXNjYXBlZHx8In19Iix0aGlzLmZvcm1hdFNlcGFyYXRvcj1yLmZvcm1hdFNlcGFyYXRvcj9yLmZvcm1hdFNlcGFyYXRvcjpyLmZvcm1hdFNlcGFyYXRvcnx8IiwiLHRoaXMudW5lc2NhcGVQcmVmaXg9ci51bmVzY2FwZVN1ZmZpeD8iIjpyLnVuZXNjYXBlUHJlZml4fHwiLSIsdGhpcy51bmVzY2FwZVN1ZmZpeD10aGlzLnVuZXNjYXBlUHJlZml4PyIiOnIudW5lc2NhcGVTdWZmaXh8fCIiLHRoaXMubmVzdGluZ1ByZWZpeD1yLm5lc3RpbmdQcmVmaXg/QShyLm5lc3RpbmdQcmVmaXgpOnIubmVzdGluZ1ByZWZpeEVzY2FwZWR8fEEoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1yLm5lc3RpbmdTdWZmaXg/QShyLm5lc3RpbmdTdWZmaXgpOnIubmVzdGluZ1N1ZmZpeEVzY2FwZWR8fEEoIikiKSx0aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yPXIubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I/ci5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjpyLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yfHwiLCIsdGhpcy5tYXhSZXBsYWNlcz1yLm1heFJlcGxhY2VzP3IubWF4UmVwbGFjZXM6MWUzLHRoaXMuYWx3YXlzRm9ybWF0PXIuYWx3YXlzRm9ybWF0IT09dm9pZCAwP3IuYWx3YXlzRm9ybWF0OiExLHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgbj0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKG4sImciKTt2YXIgcj0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChyLCJnIik7dmFyIGU9IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChlLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24obixyLGUsYSl7dmFyIG89dGhpcyxzLHUsbCxjPXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGYodil7cmV0dXJuIHYucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBnPWZ1bmN0aW9uKGQpe2lmKGQuaW5kZXhPZihvLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIGg9YmUocixjLGQpO3JldHVybiBvLmFsd2F5c0Zvcm1hdD9vLmZvcm1hdChoLHZvaWQgMCxlLEwoTChMKHt9LGEpLHIpLHt9LHtpbnRlcnBvbGF0aW9ua2V5OmR9KSk6aH12YXIgTz1kLnNwbGl0KG8uZm9ybWF0U2VwYXJhdG9yKSxiPU8uc2hpZnQoKS50cmltKCkseD1PLmpvaW4oby5mb3JtYXRTZXBhcmF0b3IpLnRyaW0oKTtyZXR1cm4gby5mb3JtYXQoYmUocixjLGIpLHgsZSxMKEwoTCh7fSxhKSxyKSx7fSx7aW50ZXJwb2xhdGlvbmtleTpifSkpfTt0aGlzLnJlc2V0UmVnRXhwKCk7dmFyIHA9YSYmYS5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIsbT1hJiZhLmludGVycG9sYXRpb24mJmEuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMhPT12b2lkIDA/YS5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlczp0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMseT1be3JlZ2V4OnRoaXMucmVnZXhwVW5lc2NhcGUsc2FmZVZhbHVlOmZ1bmN0aW9uKGQpe3JldHVybiBmKGQpfX0se3JlZ2V4OnRoaXMucmVnZXhwLHNhZmVWYWx1ZTpmdW5jdGlvbihkKXtyZXR1cm4gby5lc2NhcGVWYWx1ZT9mKG8uZXNjYXBlKGQpKTpmKGQpfX1dO3JldHVybiB5LmZvckVhY2goZnVuY3Rpb24odil7Zm9yKGw9MDtzPXYucmVnZXguZXhlYyhuKTspe3ZhciBkPXNbMV0udHJpbSgpO2lmKHU9ZyhkKSx1PT09dm9pZCAwKWlmKHR5cGVvZiBwPT0iZnVuY3Rpb24iKXt2YXIgaD1wKG4scyxhKTt1PXR5cGVvZiBoPT0ic3RyaW5nIj9oOiIifWVsc2UgaWYoYSYmYS5oYXNPd25Qcm9wZXJ0eShkKSl1PSIiO2Vsc2UgaWYobSl7dT1zWzBdO2NvbnRpbnVlfWVsc2Ugby5sb2dnZXIud2FybigibWlzc2VkIHRvIHBhc3MgaW4gdmFyaWFibGUgIi5jb25jYXQoZCwiIGZvciBpbnRlcnBvbGF0aW5nICIpLmNvbmNhdChuKSksdT0iIjtlbHNlIHR5cGVvZiB1IT0ic3RyaW5nIiYmIW8udXNlUmF3VmFsdWVUb0VzY2FwZSYmKHU9bWUodSkpO3ZhciBPPXYuc2FmZVZhbHVlKHUpO2lmKG49bi5yZXBsYWNlKHNbMF0sTyksbT8odi5yZWdleC5sYXN0SW5kZXgrPXUubGVuZ3RoLHYucmVnZXgubGFzdEluZGV4LT1zWzBdLmxlbmd0aCk6di5yZWdleC5sYXN0SW5kZXg9MCxsKyssbD49by5tYXhSZXBsYWNlcylicmVha319KSxufX0se2tleToibmVzdCIsdmFsdWU6ZnVuY3Rpb24obixyKXt2YXIgZT10aGlzLGE9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9LG8scyx1PUwoe30sYSk7dS5hcHBseVBvc3RQcm9jZXNzb3I9ITEsZGVsZXRlIHUuZGVmYXVsdFZhbHVlO2Z1bmN0aW9uIGwocCxtKXt2YXIgeT10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKHAuaW5kZXhPZih5KTwwKXJldHVybiBwO3ZhciB2PXAuc3BsaXQobmV3IFJlZ0V4cCgiIi5jb25jYXQoeSwiWyBdKnsiKSkpLGQ9InsiLmNvbmNhdCh2WzFdKTtwPXZbMF0sZD10aGlzLmludGVycG9sYXRlKGQsdSk7dmFyIGg9ZC5tYXRjaCgvJy9nKSxPPWQubWF0Y2goLyIvZyk7KGgmJmgubGVuZ3RoJTI9PT0wJiYhT3x8Ty5sZW5ndGglMiE9PTApJiYoZD1kLnJlcGxhY2UoLycvZywnIicpKTt0cnl7dT1KU09OLnBhcnNlKGQpLG0mJih1PUwoTCh7fSxtKSx1KSl9Y2F0Y2goYil7cmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImZhaWxlZCBwYXJzaW5nIG9wdGlvbnMgc3RyaW5nIGluIG5lc3RpbmcgZm9yIGtleSAiLmNvbmNhdChwKSxiKSwiIi5jb25jYXQocCkuY29uY2F0KHkpLmNvbmNhdChkKX1yZXR1cm4gZGVsZXRlIHUuZGVmYXVsdFZhbHVlLHB9Zm9yKDtvPXRoaXMubmVzdGluZ1JlZ2V4cC5leGVjKG4pOyl7dmFyIGM9W10sZj0hMTtpZihvWzBdLmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpIT09LTEmJiEvey4qfS8udGVzdChvWzFdKSl7dmFyIGc9b1sxXS5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcikubWFwKGZ1bmN0aW9uKHApe3JldHVybiBwLnRyaW0oKX0pO29bMV09Zy5zaGlmdCgpLGM9ZyxmPSEwfWlmKHM9cihsLmNhbGwodGhpcyxvWzFdLnRyaW0oKSx1KSx1KSxzJiZvWzBdPT09biYmdHlwZW9mIHMhPSJzdHJpbmciKXJldHVybiBzO3R5cGVvZiBzIT0ic3RyaW5nIiYmKHM9bWUocykpLHN8fCh0aGlzLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcmVzb2x2ZSAiLmNvbmNhdChvWzFdLCIgZm9yIG5lc3RpbmcgIikuY29uY2F0KG4pKSxzPSIiKSxmJiYocz1jLnJlZHVjZShmdW5jdGlvbihwLG0pe3JldHVybiBlLmZvcm1hdChwLG0sYS5sbmcsTChMKHt9LGEpLHt9LHtpbnRlcnBvbGF0aW9ua2V5Om9bMV0udHJpbSgpfSkpfSxzLnRyaW0oKSkpLG49bi5yZXBsYWNlKG9bMF0scyksdGhpcy5yZWdleHAubGFzdEluZGV4PTB9cmV0dXJuIG59fV0pLGl9KCk7ZnVuY3Rpb24gTmUoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBEKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP05lKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtfKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOk5lKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiBkdChpKXt2YXIgdD1pLnRvTG93ZXJDYXNlKCkudHJpbSgpLG49e307aWYoaS5pbmRleE9mKCIoIik+LTEpe3ZhciByPWkuc3BsaXQoIigiKTt0PXJbMF0udG9Mb3dlckNhc2UoKS50cmltKCk7dmFyIGU9clsxXS5zdWJzdHJpbmcoMCxyWzFdLmxlbmd0aC0xKTtpZih0PT09ImN1cnJlbmN5IiYmZS5pbmRleE9mKCI6Iik8MCluLmN1cnJlbmN5fHwobi5jdXJyZW5jeT1lLnRyaW0oKSk7ZWxzZSBpZih0PT09InJlbGF0aXZldGltZSImJmUuaW5kZXhPZigiOiIpPDApbi5yYW5nZXx8KG4ucmFuZ2U9ZS50cmltKCkpO2Vsc2V7dmFyIGE9ZS5zcGxpdCgiOyIpO2EuZm9yRWFjaChmdW5jdGlvbihvKXtpZihvKXt2YXIgcz1vLnNwbGl0KCI6IiksdT1XZShzKSxsPXVbMF0sYz11LnNsaWNlKDEpLGY9Yy5qb2luKCI6IikudHJpbSgpLnJlcGxhY2UoL14nK3wnKyQvZywiIik7bltsLnRyaW0oKV18fChuW2wudHJpbSgpXT1mKSxmPT09ImZhbHNlIiYmKG5bbC50cmltKCldPSExKSxmPT09InRydWUiJiYobltsLnRyaW0oKV09ITApLGlzTmFOKGYpfHwobltsLnRyaW0oKV09cGFyc2VJbnQoZiwxMCkpfX0pfX1yZXR1cm57Zm9ybWF0TmFtZTp0LGZvcm1hdE9wdGlvbnM6bn19ZnVuY3Rpb24gSyhpKXt2YXIgdD17fTtyZXR1cm4gZnVuY3Rpb24ocixlLGEpe3ZhciBvPWUrSlNPTi5zdHJpbmdpZnkoYSkscz10W29dO3JldHVybiBzfHwocz1pKGUsYSksdFtvXT1zKSxzKHIpfX12YXIgaHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9O1IodGhpcyxpKSx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgiZm9ybWF0dGVyIiksdGhpcy5vcHRpb25zPXQsdGhpcy5mb3JtYXRzPXtudW1iZXI6SyhmdW5jdGlvbihuLHIpe3ZhciBlPW5ldyBJbnRsLk51bWJlckZvcm1hdChuLHIpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSl9fSksY3VycmVuY3k6SyhmdW5jdGlvbihuLHIpe3ZhciBlPW5ldyBJbnRsLk51bWJlckZvcm1hdChuLEQoRCh7fSxyKSx7fSx7c3R5bGU6ImN1cnJlbmN5In0pKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGUuZm9ybWF0KGEpfX0pLGRhdGV0aW1lOksoZnVuY3Rpb24obixyKXt2YXIgZT1uZXcgSW50bC5EYXRlVGltZUZvcm1hdChuLEQoe30scikpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSl9fSkscmVsYXRpdmV0aW1lOksoZnVuY3Rpb24obixyKXt2YXIgZT1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQobixEKHt9LHIpKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGUuZm9ybWF0KGEsci5yYW5nZXx8ImRheSIpfX0pLGxpc3Q6SyhmdW5jdGlvbihuLHIpe3ZhciBlPW5ldyBJbnRsLkxpc3RGb3JtYXQobixEKHt9LHIpKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGUuZm9ybWF0KGEpfX0pfSx0aGlzLmluaXQodCl9cmV0dXJuIGsoaSxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fSxlPXIuaW50ZXJwb2xhdGlvbjt0aGlzLmZvcm1hdFNlcGFyYXRvcj1lLmZvcm1hdFNlcGFyYXRvcj9lLmZvcm1hdFNlcGFyYXRvcjplLmZvcm1hdFNlcGFyYXRvcnx8IiwifX0se2tleToiYWRkIix2YWx1ZTpmdW5jdGlvbihuLHIpe3RoaXMuZm9ybWF0c1tuLnRvTG93ZXJDYXNlKCkudHJpbSgpXT1yfX0se2tleToiYWRkQ2FjaGVkIix2YWx1ZTpmdW5jdGlvbihuLHIpe3RoaXMuZm9ybWF0c1tuLnRvTG93ZXJDYXNlKCkudHJpbSgpXT1LKHIpfX0se2tleToiZm9ybWF0Iix2YWx1ZTpmdW5jdGlvbihuLHIsZSxhKXt2YXIgbz10aGlzLHM9ci5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvciksdT1zLnJlZHVjZShmdW5jdGlvbihsLGMpe3ZhciBmPWR0KGMpLGc9Zi5mb3JtYXROYW1lLHA9Zi5mb3JtYXRPcHRpb25zO2lmKG8uZm9ybWF0c1tnXSl7dmFyIG09bDt0cnl7dmFyIHk9YSYmYS5mb3JtYXRQYXJhbXMmJmEuZm9ybWF0UGFyYW1zW2EuaW50ZXJwb2xhdGlvbmtleV18fHt9LHY9eS5sb2NhbGV8fHkubG5nfHxhLmxvY2FsZXx8YS5sbmd8fGU7bT1vLmZvcm1hdHNbZ10obCx2LEQoRChEKHt9LHApLGEpLHkpKX1jYXRjaChkKXtvLmxvZ2dlci53YXJuKGQpfXJldHVybiBtfWVsc2Ugby5sb2dnZXIud2FybigidGhlcmUgd2FzIG5vIGZvcm1hdCBmdW5jdGlvbiBmb3IgIi5jb25jYXQoZykpO3JldHVybiBsfSxuKTtyZXR1cm4gdX19XSksaX0oKTtmdW5jdGlvbiBDZShpLHQpe3ZhciBuPU9iamVjdC5rZXlzKGkpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIEVlKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP0NlKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtfKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOkNlKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiB2dChpKXt2YXIgdD1tdCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWooaSksZTtpZih0KXt2YXIgYT1qKHRoaXMpLmNvbnN0cnVjdG9yO2U9UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsYSl9ZWxzZSBlPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBCKHRoaXMsZSl9fWZ1bmN0aW9uIG10KCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIHl0KGksdCl7aS5wZW5kaW5nW3RdIT09dm9pZCAwJiYoZGVsZXRlIGkucGVuZGluZ1t0XSxpLnBlbmRpbmdDb3VudC0tKX12YXIgYnQ9ZnVuY3Rpb24oaSl7UShuLGkpO3ZhciB0PXZ0KG4pO2Z1bmN0aW9uIG4ocixlLGEpe3ZhciBvLHM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOnt9O3JldHVybiBSKHRoaXMsbiksbz10LmNhbGwodGhpcykscSYmSS5jYWxsKEYobykpLG8uYmFja2VuZD1yLG8uc3RvcmU9ZSxvLnNlcnZpY2VzPWEsby5sYW5ndWFnZVV0aWxzPWEubGFuZ3VhZ2VVdGlscyxvLm9wdGlvbnM9cyxvLmxvZ2dlcj1OLmNyZWF0ZSgiYmFja2VuZENvbm5lY3RvciIpLG8ud2FpdGluZ1JlYWRzPVtdLG8ubWF4UGFyYWxsZWxSZWFkcz1zLm1heFBhcmFsbGVsUmVhZHN8fDEwLG8ucmVhZGluZ0NhbGxzPTAsby5tYXhSZXRyaWVzPXMubWF4UmV0cmllcz49MD9zLm1heFJldHJpZXM6NSxvLnJldHJ5VGltZW91dD1zLnJldHJ5VGltZW91dD49MT9zLnJldHJ5VGltZW91dDozNTAsby5zdGF0ZT17fSxvLnF1ZXVlPVtdLG8uYmFja2VuZCYmby5iYWNrZW5kLmluaXQmJm8uYmFja2VuZC5pbml0KGEscy5iYWNrZW5kLHMpLG99cmV0dXJuIGsobixbe2tleToicXVldWVMb2FkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyxzKXt2YXIgdT10aGlzLGw9e30sYz17fSxmPXt9LGc9e307cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihwKXt2YXIgbT0hMDthLmZvckVhY2goZnVuY3Rpb24oeSl7dmFyIHY9IiIuY29uY2F0KHAsInwiKS5jb25jYXQoeSk7IW8ucmVsb2FkJiZ1LnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKHAseSk/dS5zdGF0ZVt2XT0yOnUuc3RhdGVbdl08MHx8KHUuc3RhdGVbdl09PT0xP2Nbdl09PT12b2lkIDAmJihjW3ZdPSEwKToodS5zdGF0ZVt2XT0xLG09ITEsY1t2XT09PXZvaWQgMCYmKGNbdl09ITApLGxbdl09PT12b2lkIDAmJihsW3ZdPSEwKSxnW3ldPT09dm9pZCAwJiYoZ1t5XT0hMCkpKX0pLG18fChmW3BdPSEwKX0pLChPYmplY3Qua2V5cyhsKS5sZW5ndGh8fE9iamVjdC5rZXlzKGMpLmxlbmd0aCkmJnRoaXMucXVldWUucHVzaCh7cGVuZGluZzpjLHBlbmRpbmdDb3VudDpPYmplY3Qua2V5cyhjKS5sZW5ndGgsbG9hZGVkOnt9LGVycm9yczpbXSxjYWxsYmFjazpzfSkse3RvTG9hZDpPYmplY3Qua2V5cyhsKSxwZW5kaW5nOk9iamVjdC5rZXlzKGMpLHRvTG9hZExhbmd1YWdlczpPYmplY3Qua2V5cyhmKSx0b0xvYWROYW1lc3BhY2VzOk9iamVjdC5rZXlzKGcpfX19LHtrZXk6ImxvYWRlZCIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3ZhciBzPWUuc3BsaXQoInwiKSx1PXNbMF0sbD1zWzFdO2EmJnRoaXMuZW1pdCgiZmFpbGVkTG9hZGluZyIsdSxsLGEpLG8mJnRoaXMuc3RvcmUuYWRkUmVzb3VyY2VCdW5kbGUodSxsLG8pLHRoaXMuc3RhdGVbZV09YT8tMToyO3ZhciBjPXt9O3RoaXMucXVldWUuZm9yRWFjaChmdW5jdGlvbihmKXtaZShmLmxvYWRlZCxbdV0sbCkseXQoZixlKSxhJiZmLmVycm9ycy5wdXNoKGEpLGYucGVuZGluZ0NvdW50PT09MCYmIWYuZG9uZSYmKE9iamVjdC5rZXlzKGYubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2NbZ118fChjW2ddPXt9KTt2YXIgcD1mLmxvYWRlZFtnXTtwLmxlbmd0aCYmcC5mb3JFYWNoKGZ1bmN0aW9uKG0pe2NbZ11bbV09PT12b2lkIDAmJihjW2ddW21dPSEwKX0pfSksZi5kb25lPSEwLGYuZXJyb3JzLmxlbmd0aD9mLmNhbGxiYWNrKGYuZXJyb3JzKTpmLmNhbGxiYWNrKCkpfSksdGhpcy5lbWl0KCJsb2FkZWQiLGMpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuIWYuZG9uZX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106MCxsPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTp0aGlzLnJldHJ5VGltZW91dCxjPWFyZ3VtZW50cy5sZW5ndGg+NT9hcmd1bWVudHNbNV06dm9pZCAwO2lmKCFlLmxlbmd0aClyZXR1cm4gYyhudWxsLHt9KTtpZih0aGlzLnJlYWRpbmdDYWxscz49dGhpcy5tYXhQYXJhbGxlbFJlYWRzKXt0aGlzLndhaXRpbmdSZWFkcy5wdXNoKHtsbmc6ZSxuczphLGZjTmFtZTpvLHRyaWVkOnUsd2FpdDpsLGNhbGxiYWNrOmN9KTtyZXR1cm59cmV0dXJuIHRoaXMucmVhZGluZ0NhbGxzKyssdGhpcy5iYWNrZW5kW29dKGUsYSxmdW5jdGlvbihmLGcpe2lmKHMucmVhZGluZ0NhbGxzLS0scy53YWl0aW5nUmVhZHMubGVuZ3RoPjApe3ZhciBwPXMud2FpdGluZ1JlYWRzLnNoaWZ0KCk7cy5yZWFkKHAubG5nLHAubnMscC5mY05hbWUscC50cmllZCxwLndhaXQscC5jYWxsYmFjayl9aWYoZiYmZyYmdTxzLm1heFJldHJpZXMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzLnJlYWQuY2FsbChzLGUsYSxvLHUrMSxsKjIsYyl9LGwpO3JldHVybn1jKGYsZyl9KX19LHtrZXk6InByZXBhcmVMb2FkaW5nIix2YWx1ZTpmdW5jdGlvbihlLGEpe3ZhciBvPXRoaXMscz1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sdT1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMDtpZighdGhpcy5iYWNrZW5kKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJObyBiYWNrZW5kIHdhcyBhZGRlZCB2aWEgaTE4bmV4dC51c2UuIFdpbGwgbm90IGxvYWQgcmVzb3VyY2VzLiIpLHUmJnUoKTt0eXBlb2YgZT09InN0cmluZyImJihlPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZSkpLHR5cGVvZiBhPT0ic3RyaW5nIiYmKGE9W2FdKTt2YXIgbD10aGlzLnF1ZXVlTG9hZChlLGEscyx1KTtpZighbC50b0xvYWQubGVuZ3RoKXJldHVybiBsLnBlbmRpbmcubGVuZ3RofHx1KCksbnVsbDtsLnRvTG9hZC5mb3JFYWNoKGZ1bmN0aW9uKGMpe28ubG9hZE9uZShjKX0pfX0se2tleToibG9hZCIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3RoaXMucHJlcGFyZUxvYWRpbmcoZSxhLHt9LG8pfX0se2tleToicmVsb2FkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dGhpcy5wcmVwYXJlTG9hZGluZyhlLGEse3JlbG9hZDohMH0sbyl9fSx7a2V5OiJsb2FkT25lIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiIiLHM9ZS5zcGxpdCgifCIpLHU9c1swXSxsPXNbMV07dGhpcy5yZWFkKHUsbCwicmVhZCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbihjLGYpe2MmJmEubG9nZ2VyLndhcm4oIiIuY29uY2F0KG8sImxvYWRpbmcgbmFtZXNwYWNlICIpLmNvbmNhdChsLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdCh1LCIgZmFpbGVkIiksYyksIWMmJmYmJmEubG9nZ2VyLmxvZygiIi5jb25jYXQobywibG9hZGVkIG5hbWVzcGFjZSAiKS5jb25jYXQobCwiIGZvciBsYW5ndWFnZSAiKS5jb25jYXQodSksZiksYS5sb2FkZWQoZSxjLGYpfSl9fSx7a2V5OiJzYXZlTWlzc2luZyIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8scyx1KXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06e307aWYodGhpcy5zZXJ2aWNlcy51dGlscyYmdGhpcy5zZXJ2aWNlcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiF0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShhKSl7dGhpcy5sb2dnZXIud2FybignZGlkIG5vdCBzYXZlIGtleSAiJy5jb25jYXQobywnIiBhcyB0aGUgbmFtZXNwYWNlICInKS5jb25jYXQoYSwnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIik7cmV0dXJufW89PW51bGx8fG89PT0iInx8KHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZShlLGEsbyxzLG51bGwsRWUoRWUoe30sbCkse30se2lzVXBkYXRlOnV9KSksISghZXx8IWVbMF0pJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlKGVbMF0sYSxvLHMpKX19XSksbn0oSSk7ZnVuY3Rpb24gT3QoKXtyZXR1cm57ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIG49e307aWYoUCh0WzFdKT09PSJvYmplY3QiJiYobj10WzFdKSx0eXBlb2YgdFsxXT09InN0cmluZyImJihuLmRlZmF1bHRWYWx1ZT10WzFdKSx0eXBlb2YgdFsyXT09InN0cmluZyImJihuLnREZXNjcmlwdGlvbj10WzJdKSxQKHRbMl0pPT09Im9iamVjdCJ8fFAodFszXSk9PT0ib2JqZWN0Iil7dmFyIHI9dFszXXx8dFsyXTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZV09cltlXX0pfXJldHVybiBufSxpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMCxmb3JtYXQ6ZnVuY3Rpb24odCxuLHIsZSl7cmV0dXJuIHR9LHByZWZpeDoie3siLHN1ZmZpeDoifX0iLGZvcm1hdFNlcGFyYXRvcjoiLCIsdW5lc2NhcGVQcmVmaXg6Ii0iLG5lc3RpbmdQcmVmaXg6IiR0KCIsbmVzdGluZ1N1ZmZpeDoiKSIsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6IiwiLG1heFJlcGxhY2VzOjFlMyxza2lwT25WYXJpYWJsZXM6ITB9fX1mdW5jdGlvbiBGZShpKXtyZXR1cm4gdHlwZW9mIGkubnM9PSJzdHJpbmciJiYoaS5ucz1baS5uc10pLHR5cGVvZiBpLmZhbGxiYWNrTG5nPT0ic3RyaW5nIiYmKGkuZmFsbGJhY2tMbmc9W2kuZmFsbGJhY2tMbmddKSx0eXBlb2YgaS5mYWxsYmFja05TPT0ic3RyaW5nIiYmKGkuZmFsbGJhY2tOUz1baS5mYWxsYmFja05TXSksaS5zdXBwb3J0ZWRMbmdzJiZpLnN1cHBvcnRlZExuZ3MuaW5kZXhPZigiY2ltb2RlIik8MCYmKGkuc3VwcG9ydGVkTG5ncz1pLnN1cHBvcnRlZExuZ3MuY29uY2F0KFsiY2ltb2RlIl0pKSxpfWZ1bmN0aW9uIF9lKGksdCl7dmFyIG49T2JqZWN0LmtleXMoaSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhpKTt0JiYocj1yLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLGUpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gQyhpKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF0hPW51bGw/YXJndW1lbnRzW3RdOnt9O3QlMj9fZShPYmplY3QobiksITApLmZvckVhY2goZnVuY3Rpb24ocil7XyhpLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpfZShPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGl9ZnVuY3Rpb24gU3QoaSl7dmFyIHQ9d3QoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1qKGkpLGU7aWYodCl7dmFyIGE9aih0aGlzKS5jb25zdHJ1Y3RvcjtlPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGEpfWVsc2UgZT1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gQih0aGlzLGUpfX1mdW5jdGlvbiB3dCgpe2lmKHR5cGVvZiBSZWZsZWN0PiJ1Inx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKHR5cGVvZiBQcm94eT09ImZ1bmN0aW9uIilyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBlZSgpe31mdW5jdGlvbiB4dChpKXt2YXIgdD1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoaSkpO3QuZm9yRWFjaChmdW5jdGlvbihuKXt0eXBlb2YgaVtuXT09ImZ1bmN0aW9uIiYmKGlbbl09aVtuXS5iaW5kKGkpKX0pfXZhciB0ZT1mdW5jdGlvbihpKXtRKG4saSk7dmFyIHQ9U3Qobik7ZnVuY3Rpb24gbigpe3ZhciByLGU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LGE9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoUih0aGlzLG4pLHI9dC5jYWxsKHRoaXMpLHEmJkkuY2FsbChGKHIpKSxyLm9wdGlvbnM9RmUoZSksci5zZXJ2aWNlcz17fSxyLmxvZ2dlcj1OLHIubW9kdWxlcz17ZXh0ZXJuYWw6W119LHh0KEYocikpLGEmJiFyLmlzSW5pdGlhbGl6ZWQmJiFlLmlzQ2xvbmUpe2lmKCFyLm9wdGlvbnMuaW5pdEltbWVkaWF0ZSlyZXR1cm4gci5pbml0KGUsYSksQihyLEYocikpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmluaXQoZSxhKX0sMCl9cmV0dXJuIHJ9cmV0dXJuIGsobixbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGE9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LG89YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7dHlwZW9mIGE9PSJmdW5jdGlvbiImJihvPWEsYT17fSksIWEuZGVmYXVsdE5TJiZhLmRlZmF1bHROUyE9PSExJiZhLm5zJiYodHlwZW9mIGEubnM9PSJzdHJpbmciP2EuZGVmYXVsdE5TPWEubnM6YS5ucy5pbmRleE9mKCJ0cmFuc2xhdGlvbiIpPDAmJihhLmRlZmF1bHROUz1hLm5zWzBdKSk7dmFyIHM9T3QoKTt0aGlzLm9wdGlvbnM9QyhDKEMoe30scyksdGhpcy5vcHRpb25zKSxGZShhKSksdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkhPT0idjEiJiYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb249QyhDKHt9LHMuaW50ZXJwb2xhdGlvbiksdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24pKSxhLmtleVNlcGFyYXRvciE9PXZvaWQgMCYmKHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZEtleVNlcGFyYXRvcj1hLmtleVNlcGFyYXRvciksYS5uc1NlcGFyYXRvciE9PXZvaWQgMCYmKHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZE5zU2VwYXJhdG9yPWEubnNTZXBhcmF0b3IpO2Z1bmN0aW9uIHUoZCl7cmV0dXJuIGQ/dHlwZW9mIGQ9PSJmdW5jdGlvbiI/bmV3IGQ6ZDpudWxsfWlmKCF0aGlzLm9wdGlvbnMuaXNDbG9uZSl7dGhpcy5tb2R1bGVzLmxvZ2dlcj9OLmluaXQodSh0aGlzLm1vZHVsZXMubG9nZ2VyKSx0aGlzLm9wdGlvbnMpOk4uaW5pdChudWxsLHRoaXMub3B0aW9ucyk7dmFyIGw7dGhpcy5tb2R1bGVzLmZvcm1hdHRlcj9sPXRoaXMubW9kdWxlcy5mb3JtYXR0ZXI6dHlwZW9mIEludGw8InUiJiYobD1odCk7dmFyIGM9bmV3IHN0KHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgYXQodGhpcy5vcHRpb25zLnJlc291cmNlcyx0aGlzLm9wdGlvbnMpO3ZhciBmPXRoaXMuc2VydmljZXM7Zi5sb2dnZXI9TixmLnJlc291cmNlU3RvcmU9dGhpcy5zdG9yZSxmLmxhbmd1YWdlVXRpbHM9YyxmLnBsdXJhbFJlc29sdmVyPW5ldyBndChjLHtwcmVwZW5kOnRoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsY29tcGF0aWJpbGl0eUpTT046dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OLHNpbXBsaWZ5UGx1cmFsU3VmZml4OnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeH0pLGwmJighdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0fHx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQ9PT1zLmludGVycG9sYXRpb24uZm9ybWF0KSYmKGYuZm9ybWF0dGVyPXUobCksZi5mb3JtYXR0ZXIuaW5pdChmLHRoaXMub3B0aW9ucyksdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0PWYuZm9ybWF0dGVyLmZvcm1hdC5iaW5kKGYuZm9ybWF0dGVyKSksZi5pbnRlcnBvbGF0b3I9bmV3IHB0KHRoaXMub3B0aW9ucyksZi51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcyl9LGYuYmFja2VuZENvbm5lY3Rvcj1uZXcgYnQodSh0aGlzLm1vZHVsZXMuYmFja2VuZCksZi5yZXNvdXJjZVN0b3JlLGYsdGhpcy5vcHRpb25zKSxmLmJhY2tlbmRDb25uZWN0b3Iub24oIioiLGZ1bmN0aW9uKGQpe2Zvcih2YXIgaD1hcmd1bWVudHMubGVuZ3RoLE89bmV3IEFycmF5KGg+MT9oLTE6MCksYj0xO2I8aDtiKyspT1tiLTFdPWFyZ3VtZW50c1tiXTtlLmVtaXQuYXBwbHkoZSxbZF0uY29uY2F0KE8pKX0pLHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yJiYoZi5sYW5ndWFnZURldGVjdG9yPXUodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IpLGYubGFuZ3VhZ2VEZXRlY3Rvci5pbml0KGYsdGhpcy5vcHRpb25zLmRldGVjdGlvbix0aGlzLm9wdGlvbnMpKSx0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCYmKGYuaTE4bkZvcm1hdD11KHRoaXMubW9kdWxlcy5pMThuRm9ybWF0KSxmLmkxOG5Gb3JtYXQuaW5pdCYmZi5pMThuRm9ybWF0LmluaXQodGhpcykpLHRoaXMudHJhbnNsYXRvcj1uZXcgUmUodGhpcy5zZXJ2aWNlcyx0aGlzLm9wdGlvbnMpLHRoaXMudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24oZCl7Zm9yKHZhciBoPWFyZ3VtZW50cy5sZW5ndGgsTz1uZXcgQXJyYXkoaD4xP2gtMTowKSxiPTE7YjxoO2IrKylPW2ItMV09YXJndW1lbnRzW2JdO2UuZW1pdC5hcHBseShlLFtkXS5jb25jYXQoTykpfSksdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5pbml0JiZkLmluaXQoZSl9KX1pZih0aGlzLmZvcm1hdD10aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQsb3x8KG89ZWUpLHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyYmIXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmIXRoaXMub3B0aW9ucy5sbmcpe3ZhciBnPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7Zy5sZW5ndGg+MCYmZ1swXSE9PSJkZXYiJiYodGhpcy5vcHRpb25zLmxuZz1nWzBdKX0hdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5vcHRpb25zLmxuZyYmdGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpO3ZhciBwPVsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXTtwLmZvckVhY2goZnVuY3Rpb24oZCl7ZVtkXT1mdW5jdGlvbigpe3ZhciBoO3JldHVybihoPWUuc3RvcmUpW2RdLmFwcGx5KGgsYXJndW1lbnRzKX19KTt2YXIgbT1bImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdO20uZm9yRWFjaChmdW5jdGlvbihkKXtlW2RdPWZ1bmN0aW9uKCl7dmFyIGg7cmV0dXJuKGg9ZS5zdG9yZSlbZF0uYXBwbHkoaCxhcmd1bWVudHMpLGV9fSk7dmFyIHk9TSgpLHY9ZnVuY3Rpb24oKXt2YXIgaD1mdW5jdGlvbihiLHgpe2UuaXNJbml0aWFsaXplZCYmIWUuaW5pdGlhbGl6ZWRTdG9yZU9uY2UmJmUubG9nZ2VyLndhcm4oImluaXQ6IGkxOG5leHQgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4gWW91IHNob3VsZCBjYWxsIGluaXQganVzdCBvbmNlISIpLGUuaXNJbml0aWFsaXplZD0hMCxlLm9wdGlvbnMuaXNDbG9uZXx8ZS5sb2dnZXIubG9nKCJpbml0aWFsaXplZCIsZS5vcHRpb25zKSxlLmVtaXQoImluaXRpYWxpemVkIixlLm9wdGlvbnMpLHkucmVzb2x2ZSh4KSxvKGIseCl9O2lmKGUubGFuZ3VhZ2VzJiZlLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSE9PSJ2MSImJiFlLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIGgobnVsbCxlLnQuYmluZChlKSk7ZS5jaGFuZ2VMYW5ndWFnZShlLm9wdGlvbnMubG5nLGgpfTtyZXR1cm4gdGhpcy5vcHRpb25zLnJlc291cmNlc3x8IXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlP3YoKTpzZXRUaW1lb3V0KHYsMCkseX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ZWUscz1vLHU9dHlwZW9mIGU9PSJzdHJpbmciP2U6dGhpcy5sYW5ndWFnZTtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIiYmKHM9ZSksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYodSYmdS50b0xvd2VyQ2FzZSgpPT09ImNpbW9kZSIpcmV0dXJuIHMoKTt2YXIgbD1bXSxjPWZ1bmN0aW9uKHApe2lmKHApe3ZhciBtPWEuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkocCk7bS5mb3JFYWNoKGZ1bmN0aW9uKHkpe2wuaW5kZXhPZih5KTwwJiZsLnB1c2goeSl9KX19O2lmKHUpYyh1KTtlbHNle3ZhciBmPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7Zi5mb3JFYWNoKGZ1bmN0aW9uKGcpe3JldHVybiBjKGcpfSl9dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24oZyl7cmV0dXJuIGMoZyl9KSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZChsLHRoaXMub3B0aW9ucy5ucyxmdW5jdGlvbihnKXshZyYmIWEucmVzb2x2ZWRMYW5ndWFnZSYmYS5sYW5ndWFnZSYmYS5zZXRSZXNvbHZlZExhbmd1YWdlKGEubGFuZ3VhZ2UpLHMoZyl9KX1lbHNlIHMobnVsbCl9fSx7a2V5OiJyZWxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgcz1NKCk7cmV0dXJuIGV8fChlPXRoaXMubGFuZ3VhZ2VzKSxhfHwoYT10aGlzLm9wdGlvbnMubnMpLG98fChvPWVlKSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IucmVsb2FkKGUsYSxmdW5jdGlvbih1KXtzLnJlc29sdmUoKSxvKHUpfSksc319LHtrZXk6InVzZSIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYW4gdW5kZWZpbmVkIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtpZighZS50eXBlKXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGEgd3JvbmcgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO3JldHVybiBlLnR5cGU9PT0iYmFja2VuZCImJih0aGlzLm1vZHVsZXMuYmFja2VuZD1lKSwoZS50eXBlPT09ImxvZ2dlciJ8fGUubG9nJiZlLndhcm4mJmUuZXJyb3IpJiYodGhpcy5tb2R1bGVzLmxvZ2dlcj1lKSxlLnR5cGU9PT0ibGFuZ3VhZ2VEZXRlY3RvciImJih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcj1lKSxlLnR5cGU9PT0iaTE4bkZvcm1hdCImJih0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdD1lKSxlLnR5cGU9PT0icG9zdFByb2Nlc3NvciImJnhlLmFkZFBvc3RQcm9jZXNzb3IoZSksZS50eXBlPT09ImZvcm1hdHRlciImJih0aGlzLm1vZHVsZXMuZm9ybWF0dGVyPWUpLGUudHlwZT09PSIzcmRQYXJ0eSImJnRoaXMubW9kdWxlcy5leHRlcm5hbC5wdXNoKGUpLHRoaXN9fSx7a2V5OiJzZXRSZXNvbHZlZExhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbihlKXtpZighKCFlfHwhdGhpcy5sYW5ndWFnZXMpJiYhKFsiY2ltb2RlIiwiZGV2Il0uaW5kZXhPZihlKT4tMSkpZm9yKHZhciBhPTA7YTx0aGlzLmxhbmd1YWdlcy5sZW5ndGg7YSsrKXt2YXIgbz10aGlzLmxhbmd1YWdlc1thXTtpZighKFsiY2ltb2RlIiwiZGV2Il0uaW5kZXhPZihvKT4tMSkmJnRoaXMuc3RvcmUuaGFzTGFuZ3VhZ2VTb21lVHJhbnNsYXRpb25zKG8pKXt0aGlzLnJlc29sdmVkTGFuZ3VhZ2U9bzticmVha319fX0se2tleToiY2hhbmdlTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89dGhpczt0aGlzLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPWU7dmFyIHM9TSgpO3RoaXMuZW1pdCgibGFuZ3VhZ2VDaGFuZ2luZyIsZSk7dmFyIHU9ZnVuY3Rpb24oZyl7by5sYW5ndWFnZT1nLG8ubGFuZ3VhZ2VzPW8uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZyksby5yZXNvbHZlZExhbmd1YWdlPXZvaWQgMCxvLnNldFJlc29sdmVkTGFuZ3VhZ2UoZyl9LGw9ZnVuY3Rpb24oZyxwKXtwPyh1KHApLG8udHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShwKSxvLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxvLmVtaXQoImxhbmd1YWdlQ2hhbmdlZCIscCksby5sb2dnZXIubG9nKCJsYW5ndWFnZUNoYW5nZWQiLHApKTpvLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxzLnJlc29sdmUoZnVuY3Rpb24oKXtyZXR1cm4gby50LmFwcGx5KG8sYXJndW1lbnRzKX0pLGEmJmEoZyxmdW5jdGlvbigpe3JldHVybiBvLnQuYXBwbHkobyxhcmd1bWVudHMpfSl9LGM9ZnVuY3Rpb24oZyl7IWUmJiFnJiZvLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJihnPVtdKTt2YXIgcD10eXBlb2YgZz09InN0cmluZyI/ZzpvLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKGcpO3AmJihvLmxhbmd1YWdlfHx1KHApLG8udHJhbnNsYXRvci5sYW5ndWFnZXx8by50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKHApLG8uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmby5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKHApKSxvLmxvYWRSZXNvdXJjZXMocCxmdW5jdGlvbihtKXtsKG0scCl9KX07cmV0dXJuIWUmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmIXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz9jKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSk6IWUmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP3RoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoYyk6YyhlKSxzfX0se2tleToiZ2V0Rml4ZWRUIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHM9dGhpcyx1PWZ1bmN0aW9uIGwoYyxmKXt2YXIgZztpZihQKGYpIT09Im9iamVjdCIpe2Zvcih2YXIgcD1hcmd1bWVudHMubGVuZ3RoLG09bmV3IEFycmF5KHA+Mj9wLTI6MCkseT0yO3k8cDt5KyspbVt5LTJdPWFyZ3VtZW50c1t5XTtnPXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbYyxmXS5jb25jYXQobSkpfWVsc2UgZz1DKHt9LGYpO2cubG5nPWcubG5nfHxsLmxuZyxnLmxuZ3M9Zy5sbmdzfHxsLmxuZ3MsZy5ucz1nLm5zfHxsLm5zLGcua2V5UHJlZml4PWcua2V5UHJlZml4fHxvfHxsLmtleVByZWZpeDt2YXIgdj1zLm9wdGlvbnMua2V5U2VwYXJhdG9yfHwiLiIsZD1nLmtleVByZWZpeD8iIi5jb25jYXQoZy5rZXlQcmVmaXgpLmNvbmNhdCh2KS5jb25jYXQoYyk6YztyZXR1cm4gcy50KGQsZyl9O3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/dS5sbmc9ZTp1LmxuZ3M9ZSx1Lm5zPWEsdS5rZXlQcmVmaXg9byx1fX0se2tleToidCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYoZT10aGlzLnRyYW5zbGF0b3IpLnRyYW5zbGF0ZS5hcHBseShlLGFyZ3VtZW50cyl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKGU9dGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkoZSxhcmd1bWVudHMpfX0se2tleToic2V0RGVmYXVsdE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz1lfX0se2tleToiaGFzTG9hZGVkTmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkIix0aGlzLmxhbmd1YWdlcyksITE7aWYoIXRoaXMubGFuZ3VhZ2VzfHwhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5Iix0aGlzLmxhbmd1YWdlcyksITE7dmFyIHM9dGhpcy5yZXNvbHZlZExhbmd1YWdlfHx0aGlzLmxhbmd1YWdlc1swXSx1PXRoaXMub3B0aW9ucz90aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmc6ITEsbD10aGlzLmxhbmd1YWdlc1t0aGlzLmxhbmd1YWdlcy5sZW5ndGgtMV07aWYocy50b0xvd2VyQ2FzZSgpPT09ImNpbW9kZSIpcmV0dXJuITA7dmFyIGM9ZnVuY3Rpb24ocCxtKXt2YXIgeT1hLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3Iuc3RhdGVbIiIuY29uY2F0KHAsInwiKS5jb25jYXQobSldO3JldHVybiB5PT09LTF8fHk9PT0yfTtpZihvLnByZWNoZWNrKXt2YXIgZj1vLnByZWNoZWNrKHRoaXMsYyk7aWYoZiE9PXZvaWQgMClyZXR1cm4gZn1yZXR1cm4hISh0aGlzLmhhc1Jlc291cmNlQnVuZGxlKHMsZSl8fCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8dGhpcy5vcHRpb25zLnJlc291cmNlcyYmIXRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlc3x8YyhzLGUpJiYoIXV8fGMobCxlKSkpfX0se2tleToibG9hZE5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89dGhpcyxzPU0oKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5zPyh0eXBlb2YgZT09InN0cmluZyImJihlPVtlXSksZS5mb3JFYWNoKGZ1bmN0aW9uKHUpe28ub3B0aW9ucy5ucy5pbmRleE9mKHUpPDAmJm8ub3B0aW9ucy5ucy5wdXNoKHUpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHUpe3MucmVzb2x2ZSgpLGEmJmEodSl9KSxzKTooYSYmYSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImxvYWRMYW5ndWFnZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89TSgpO3R5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKTt2YXIgcz10aGlzLm9wdGlvbnMucHJlbG9hZHx8W10sdT1lLmZpbHRlcihmdW5jdGlvbihsKXtyZXR1cm4gcy5pbmRleE9mKGwpPDB9KTtyZXR1cm4gdS5sZW5ndGg/KHRoaXMub3B0aW9ucy5wcmVsb2FkPXMuY29uY2F0KHUpLHRoaXMubG9hZFJlc291cmNlcyhmdW5jdGlvbihsKXtvLnJlc29sdmUoKSxhJiZhKGwpfSksbyk6KGEmJmEoKSxQcm9taXNlLnJlc29sdmUoKSl9fSx7a2V5OiJkaXIiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKGV8fChlPXRoaXMucmVzb2x2ZWRMYW5ndWFnZXx8KHRoaXMubGFuZ3VhZ2VzJiZ0aGlzLmxhbmd1YWdlcy5sZW5ndGg+MD90aGlzLmxhbmd1YWdlc1swXTp0aGlzLmxhbmd1YWdlKSksIWUpcmV0dXJuInJ0bCI7dmFyIGE9WyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSIsImNrYiJdO3JldHVybiBhLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGUpKT4tMXx8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi1hcmFiIik+MT8icnRsIjoibHRyIn19LHtrZXk6ImNsb25lSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxhPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTp7fSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTplZSxzPUMoQyhDKHt9LHRoaXMub3B0aW9ucyksYSkse2lzQ2xvbmU6ITB9KSx1PW5ldyBuKHMpOyhhLmRlYnVnIT09dm9pZCAwfHxhLnByZWZpeCE9PXZvaWQgMCkmJih1LmxvZ2dlcj11LmxvZ2dlci5jbG9uZShhKSk7dmFyIGw9WyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXTtyZXR1cm4gbC5mb3JFYWNoKGZ1bmN0aW9uKGMpe3VbY109ZVtjXX0pLHUuc2VydmljZXM9Qyh7fSx0aGlzLnNlcnZpY2VzKSx1LnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh1KX0sdS50cmFuc2xhdG9yPW5ldyBSZSh1LnNlcnZpY2VzLHUub3B0aW9ucyksdS50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihjKXtmb3IodmFyIGY9YXJndW1lbnRzLmxlbmd0aCxnPW5ldyBBcnJheShmPjE/Zi0xOjApLHA9MTtwPGY7cCsrKWdbcC0xXT1hcmd1bWVudHNbcF07dS5lbWl0LmFwcGx5KHUsW2NdLmNvbmNhdChnKSl9KSx1LmluaXQocyxvKSx1LnRyYW5zbGF0b3Iub3B0aW9ucz11Lm9wdGlvbnMsdS50cmFuc2xhdG9yLmJhY2tlbmRDb25uZWN0b3Iuc2VydmljZXMudXRpbHM9e2hhc0xvYWRlZE5hbWVzcGFjZTp1Lmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKHUpfSx1fX0se2tleToidG9KU09OIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybntvcHRpb25zOnRoaXMub3B0aW9ucyxzdG9yZTp0aGlzLnN0b3JlLGxhbmd1YWdlOnRoaXMubGFuZ3VhZ2UsbGFuZ3VhZ2VzOnRoaXMubGFuZ3VhZ2VzLHJlc29sdmVkTGFuZ3VhZ2U6dGhpcy5yZXNvbHZlZExhbmd1YWdlfX19XSksbn0oSSk7Xyh0ZSwiY3JlYXRlSW5zdGFuY2UiLGZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LHQ9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7cmV0dXJuIG5ldyB0ZShpLHQpfSk7dmFyIHc9dGUuY3JlYXRlSW5zdGFuY2UoKTt3LmNyZWF0ZUluc3RhbmNlPXRlLmNyZWF0ZUluc3RhbmNlLHcuY3JlYXRlSW5zdGFuY2Usdy5pbml0LHcubG9hZFJlc291cmNlcyx3LnJlbG9hZFJlc291cmNlcyx3LnVzZSx3LmNoYW5nZUxhbmd1YWdlLHcuZ2V0Rml4ZWRULHcudCx3LmV4aXN0cyx3LnNldERlZmF1bHROYW1lc3BhY2Usdy5oYXNMb2FkZWROYW1lc3BhY2Usdy5sb2FkTmFtZXNwYWNlcyx3LmxvYWRMYW5ndWFnZXM7Y29uc3QgUHQ9KGksdCk9PnR5cGVvZiBpPT0ibnVtYmVyIiYmdHlwZW9mIHQ9PSJudW1iZXIiP2ktdDpTdHJpbmcoaSkubG9jYWxlQ29tcGFyZShTdHJpbmcodCkpO2Z1bmN0aW9uIEx0KGkpe3JldHVybiBQdH1jb25zdCBSdD1MdCgpO2Z1bmN0aW9uIEllKGksdCl7aWYoaS5sZW5ndGg8dC5sZW5ndGgpcmV0dXJuLUllKHQsaSk7Zm9yKGxldCBuPTA7bjxpLmxlbmd0aDtuKyspe2lmKCF0W25dKXJldHVybiAxO2NvbnN0IHI9UnQoaVtuXSx0W25dKTtpZihyIT09MClyZXR1cm4gcn1yZXR1cm4gMH1mdW5jdGlvbiBrdChpLHQsbil7Y29uc3Qgcj1uPT09ImFzY2VuZGluZyI/MTotMTtyZXR1cm4gaS5tYXAoZT0+KHtkYXRhOmUsdmFsdWU6dC5tYXAoYT0+ZVthXSl9KSkuc29ydCgoZSxhKT0+cipJZShlLnZhbHVlLGEudmFsdWUpKS5tYXAoZT0+ZS5kYXRhKX1jb25zdCBqdD1pPT57dHJ5e2NvbnN0e2RhdGE6dCx2aWV3TWVhc3VyZXM6bixzb3J0OnJ9PWkuZGF0YSxlPWt0KHQsbixyKTtzZWxmLnBvc3RNZXNzYWdlKGUpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IodC5zdGFjayksc2VsZi5wb3N0TWVzc2FnZSh0LnN0YWNrKX19O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsanQsITEpfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29ydC53b3JrZXItZWVjMGRhZGUuanMubWFwCg==",nj=typeof window<"u"&&window.Blob&&new Blob([atob(tj)],{type:"text/javascript;charset=utf-8"});function q2e(){const e=nj&&(window.URL||window.webkitURL).createObjectURL(nj);try{return e?new Worker(e):new Worker("data:application/javascript;base64,"+tj)}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}function X0(e,t){return new Promise((n,r)=>{e.postMessage(t),e.onmessage=i=>{n(i.data)},e.onerror=i=>{r({success:!1,message:i})}})}const ewe=async(e,t)=>{if(t.length===0)return e;const n=new U2e;try{return await X0(n,{dataSource:e,filters:t})}catch(r){throw new Error("Uncaught error in FilterWorker",{cause:r})}finally{n.terminate()}},twe=async(e,t)=>{if(e.length===0)return e;const n=new K2e;try{return await X0(n,{dataSource:e,trans:t})}catch(r){throw new Error("Uncaught error in TransformDataWorker",{cause:r})}finally{n.terminate()}},nwe=async(e,t)=>{const n=new $2e;try{return await X0(n,{dataSource:e,query:t})}catch(r){throw new Error("Uncaught error in ViewQueryWorker",{cause:r})}finally{n.terminate()}},rwe=async(e,t,n,r,i,o,a)=>{const s=new Q2e;try{return await X0(s,{dimsInRow:e,dimsInColumn:t,allData:n,aggData:r,collapsedKeyList:i,showTableSummary:o,sort:a})}catch(l){throw new Error("Uncaught error in TableBuilderDataWorker",{cause:l})}finally{s.terminate()}},iwe=async(e,t,n)=>{const r=new q2e;try{return await X0(r,{data:e,viewMeasures:t,sort:n})}catch(i){throw new Error("Uncaught error in ViewQueryWorker",{cause:i})}finally{r.terminate()}},owe=async(e,t,n,r)=>{process.env.NODE_ENV!=="production"&&console.log("local query triggered",t);let i=e;for await(const o of t)switch(o.type){case"filter":{i=await ewe(i,o.filters.map(a=>{const s={fid:a.fid,rule:null};return a.rule.type==="one of"||a.rule.type==="not in"?s.rule={type:a.rule.type,value:new Set(a.rule.value)}:s.rule=a.rule,s}).filter(Boolean));break}case"transform":{i=await twe(i,o.transform);break}case"view":{for await(const a of o.query)i=await nwe(i,a);break}case"sort":{i=await iwe(i,o.by,o.sort);break}default:{console.warn(new Error(`Unknown step type: ${o.type}`));break}}return i.slice(n??0,r?(n??0)+r:void 0)},Wl=e=>t=>owe(e,t.workflow,t.offset,t.limit),rj=[],awe=new N0([]);class swe{constructor(){Ct(this,"metaDict",{});Ct(this,"metaMap",{});Ct(this,"visDict",{});Ct(this,"dataSources",[]);Ct(this,"dsIndex",0);BG(this,{dataSource:Wh.struct})}get dataSource(){return this.dataSources[this.dsIndex]}get metaId(){var t;return(t=this.dataSource)==null?void 0:t.metaId}get meta(){return this.metaId?this.metaDict[this.metaId]??rj:rj}get computation(){var t;return(t=this.dataSource)!=null&&t.data?Wl(Mh(this.dataSource.data)):async()=>[]}get visSpecStore(){return!this.metaId||!this.meta.length?awe:(this.visDict[this.metaId]||(this.visDict[this.metaId]=new N0(this.meta,{onMetaChange:(t,n)=>this.updateCurrentDatasetMetas(t,n)})),this.visDict[this.metaId])}get currentDataset(){var t,n,r;return{dataSource:((t=this.dataSource)==null?void 0:t.data)??[],id:((n=this.dataSource)==null?void 0:n.id)??"",name:((r=this.dataSource)==null?void 0:r.name)??"",rawFields:this.meta}}updateCurrentDatasetMetas(t,n){const r=this.meta.find(i=>i.fid===t);if(r)for(let i in n)r[i]=n[i]}useDS(t){const n=this.dataSources.findIndex(r=>r.id===t);n>-1&&this.setDatasetIndex(n)}setDatasetIndex(t){this.dsIndex=t}importData(t){if(t.$schema===ND){this.metaDict=t.metaDict;const n={};Object.keys(t.metaDict).forEach(r=>{const i=t.metaDict[r];n[f2(i)]=r}),this.metaMap=n,this.dataSources=t.datasets,this.visDict=Object.fromEntries(Object.entries(t.specDict).map(([r,i])=>{const o=new N0(t.metaDict[r],{empty:!0,onMetaChange:(a,s)=>this.updateCurrentDatasetMetas(a,s)});return o.importRaw(i),[r,o]}))}else{const n={},r=Object.fromEntries(t.dataSources.map(l=>[l.id,l])),i=[],o={},a={};t.datasets.forEach(({dsId:l,id:u,name:c,rawFields:d})=>{const f=f2(d);o[f]?u=o[f]:(o[f]=u,n[u]=d,a[u]=new N0(d,{empty:!0,onMetaChange:(g,b)=>this.updateCurrentDatasetMetas(g,b)}));const p=r[l];i.push({data:p.data,id:l,metaId:u,name:c})});const[s]=Object.keys(n);s&&t.specList.forEach(l=>{const u=f2(l.encodings.dimensions.concat(l.encodings.measures).filter(d=>!d.computed));(a[u]||a[s]).appendFromOld(l)}),this.metaDict=n,this.visDict=a,this.dataSources=i,this.dsIndex=0}}exportData(){const t={};return Object.keys(this.visDict).forEach(n=>{t[n]=this.visDict[n].exportAllCharts()}),{$schema:ND,datasets:Mh(this.dataSources),metaDict:Mh(this.metaDict),specDict:t}}addDataSource(t){const n=f2(t.fields);this.metaMap[n]||(this.metaMap[n]=Li());const r=this.metaMap[n];this.metaDict[r]=t.fields,this.dataSources.push({data:t.data,id:Li(),metaId:r,name:t.name}),this.dsIndex=this.dataSources.length-1}}function f2(e){return e.map(t=>`${t.name}-${t.analyticType[0]}-${t.semanticType[0]}`).sort().join(",")}class lwe{constructor(){Ct(this,"dataStore",new swe);Ct(this,"tmpDSName","");Ct(this,"tmpDSRawFields",[]);Ct(this,"tmpDataSource",[]);Ct(this,"showDSPanel",!1);BG(this,{tmpDataSource:zn.ref,dataStore:!1})}setShowDSPanel(t){this.showDSPanel=t}initTempDS(){this.tmpDSName="New Dataset",this.tmpDSRawFields=[],this.tmpDataSource=[]}updateTempFields(t){this.tmpDSRawFields=t}updateTempDatasetMetas(t,n){const r=this.tmpDSRawFields.find(i=>i.fid===t);if(r)for(let i in n)r[i]=n[i]}updateTempFieldAnalyticType(t,n){const r=this.tmpDSRawFields.find(i=>i.fid===t);r&&(r.analyticType=n)}updateTempFieldSemanticType(t,n){const r=this.tmpDSRawFields.find(i=>i.fid===t);r&&(r.semanticType=n)}updateTempName(t){this.tmpDSName=t}updateTempDS(t){const n=Oxe(t);this.tmpDataSource=n.dataSource,this.tmpDSRawFields=n.fields}updateTempSTDDS(t){this.tmpDataSource=t.dataSource,this.tmpDSRawFields=t.rawFields,this.tmpDSName=t.name}commitTempDS(){const{tmpDSName:t,tmpDSRawFields:n,tmpDataSource:r}=this;this.dataStore.addDataSource({data:r,fields:n,name:t}),this.setShowDSPanel(!1),this.initTempDS()}startDSBuildingTask(){this.initTempDS(),this.showDSPanel=!0}}function ij(e){const t={};return(n,...r)=>n?(t[n]||(t[n]=e(...r)),t[n]):e(...r)}const uwe=ij(()=>new lwe),cwe=ij((e,t)=>new N0(e,t)),oj=m.createContext(null),S9=m.createContext(null),aj=()=>{},dwe=e=>{const t=e.keepAlive?`${e.keepAlive}`:"",n=m.useMemo(()=>uwe(t),[t]);return m.useEffect(()=>{if(e.storeRef){const r=e.storeRef;return r.current=n,()=>{r.current=null}}return aj},[e.storeRef,n]),m.createElement(oj.Provider,{value:n},e.children)};function Dh(){return m.useContext(oj)}const sj=e=>{const t=e.keepAlive?`${e.keepAlive}`:"",n=m.useMemo(()=>cwe(t,e.meta,{onMetaChange:e.onMetaChange}),[t]),r=m.useRef(e.meta);return m.useEffect(()=>{r.current!==e.meta&&(n.setMeta(e.meta),r.current=e.meta)},[e.meta,n]),m.useEffect(()=>{if(e.storeRef){const i=e.storeRef;return i.current=n,()=>{i.current=null}}return aj},[e.storeRef,n]),m.createElement(S9.Provider,{value:n},e.children)};function Ot(){return m.useContext(S9)}const O0=m.createContext(async()=>[]);function Ll(){return m.useContext(O0)}function lj(e,t){return(...n)=>Promise.race([e(...n),new Promise((r,i)=>{setTimeout(()=>i(new Error("timeout")),t)})])}function uj(e,t){return(...n)=>e(...n).catch(r=>{throw t(r),r})}function fwe(){return window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function _a(e="media"){const[t,n]=m.useState(e==="media"?fwe():e);return m.useEffect(()=>{var r;if(e==="media"){const i=(r=window.matchMedia)==null?void 0:r.call(window,"(prefers-color-scheme: dark)"),o=a=>{n(a.matches?"dark":"light")};return i==null||i.addEventListener("change",o),()=>{i==null||i.removeEventListener("change",o)}}else n(e)},[e]),t}const h2=(e,t,n=["Enter"],r=!0)=>{const i=m.useRef(e);i.current=()=>{t||e()};const o=m.useRef(n);return o.current=n,m.useMemo(()=>({onClick:a=>{r||a.stopPropagation(),i.current()},onKeyDown:a=>{r||a.stopPropagation(),o.current.includes(a.key)&&(a.stopPropagation(),a.preventDefault(),i.current())},onMouseOut:a=>{var s;r||a.stopPropagation(),(s=document.querySelector("*:focus"))==null||s.blur()}}),[r])},Z9=Je.div`
|
|
231
|
+
*/function oD(e){return Object.prototype.toString.call(e)==="[object Object]"}function _xe(e){var t,n;return oD(e)===!1?!1:(t=e.constructor,t===void 0?!0:(n=t.prototype,!(oD(n)===!1||n.hasOwnProperty("isPrototypeOf")===!1)))}function Gxe(e,t){return e.map(n=>{const r={};for(let i in t){const{from:o,to:a}=t[i];r[a]=u9(n,o)}return r})}function Cxe(e){return e.map((t,n)=>{const r=`gwc_${n}`;return{...t,key:r,fid:r}})}function l9(e,t){const n=Cxe(t),r=n.map((o,a)=>({from:t[a].path??[t[a].fid],to:o.fid}));return{safeData:Gxe(e,r),safeMetas:n}}function aD(e,t=[]){return Object.keys(e).flatMap(n=>_xe(e[n])?aD(e[n],t.concat(n)):[t.concat(n)])}function u9(e,t){let n=e;for(let r of t)n=n[r];return n}const sD=[/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/,/^(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])\/\d{4}$/,/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/\d{4}$/,/^\d{4}\/(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])$/,/^\d{4}\.(0[1-9]|1[0-2])\.(0[1-9]|[12][0-9]|3[01])$/,/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\s\d{2}:\d{2}:\d{2}$/,/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T\d{2}:\d{2}:\d{2}$/,/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T\d{2}:\d{2}:\d{2}.\d{3}Z$/],kxe=["%Y-%m-%d","%m/%d/%Y","%d/%m/%Y","%Y/%m/%d","%Y.%m.%d","%Y-%m-%d %H:%M:%S","%Y-%m-%dT%H:%M:%S","%Y-%m-%dT%H:%M:%S.%gZ"];function c9(e){if(typeof e=="number")return"timestamp";const t=sD.findIndex(n=>n.test(e));return t>=0?kxe[t]:""}function Wxe(e){let t=!0;for(let n of e){let r=!1;for(let i of sD)if(i.test(n)){r=!0;break}if(!r){t=!1;break}}return t}function Lxe(e){return e.every(t=>{if(typeof t=="number")return!0;const n=Number(t);return!isNaN(n)&&isFinite(t)})}function Txe(e){switch(e){case"quantitative":return"measure";default:return"dimension"}}function Nxe(e,t){const n=e.map(i=>u9(i,t));let r=Lxe(n)?"quantitative":"nominal";return r==="nominal"&&Wxe(e.map(i=>`${u9(i,t)}`))&&(r="temporal"),r}function Xxe(e){const{dataSource:t,fields:n}=e,r=[];for(let i of n){let o=i.semanticType==="?"?Nxe(t,i.path):i.semanticType,a=Txe(o);r.push({fid:i.fid,key:i.key?i.key:i.fid,name:i.name?i.name:i.fid,analyticType:a,semanticType:o,basename:i.basename||i.name||i.fid,path:i.path})}return r}function Oxe(e){if(e.length===0)return{dataSource:[],fields:[]};const t=e[0],n=aD(t),r=Xxe({dataSource:e,fields:n.map(s=>({fid:s[s.length-1],key:s[s.length-1],analyticType:"?",semanticType:"?",path:s,basename:s[s.length-1],name:s.join(".")}))}),{safeData:i,safeMetas:o}=l9(e,r),a=[];for(let s of i){const l={};for(let u of o)u.semanticType==="quantitative"?l[u.fid]=Number(s[u.fid]):l[u.fid]=s[u.fid];a.push(l)}return{dataSource:a,fields:o}}function zu(e){if(e===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function t2(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&k1(e,t)}function W0(e,t){if(t&&(ga(t)==="object"||typeof t=="function"))return t;if(t!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return zu(e)}function ms(e){return ms=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},ms(e)}function Vxe(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function Fxe(e){return HA(e)||Vxe(e)||JA(e)||UA()}function lD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function uD(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?lD(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):lD(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}var Mxe={type:"logger",log:function(t){this.output("log",t)},warn:function(t){this.output("warn",t)},error:function(t){this.output("error",t)},output:function(t,n){console&&console[t]&&console[t].apply(console,n)}},Yxe=function(){function e(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};Mo(this,e),this.init(t,n)}return Yo(e,[{key:"init",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.prefix=r.prefix||"i18next:",this.logger=n||Mxe,this.options=r,this.debug=r.debug}},{key:"setDebug",value:function(n){this.debug=n}},{key:"log",value:function(){for(var n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return this.forward(r,"log","",!0)}},{key:"warn",value:function(){for(var n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return this.forward(r,"warn","",!0)}},{key:"error",value:function(){for(var n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return this.forward(r,"error","")}},{key:"deprecate",value:function(){for(var n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return this.forward(r,"warn","WARNING DEPRECATED: ",!0)}},{key:"forward",value:function(n,r,i,o){return o&&!this.debug?null:(typeof n[0]=="string"&&(n[0]="".concat(i).concat(this.prefix," ").concat(n[0])),this.logger[r](n))}},{key:"create",value:function(n){return new e(this.logger,uD(uD({},{prefix:"".concat(this.prefix,":").concat(n,":")}),this.options))}},{key:"clone",value:function(n){return n=n||this.options,n.prefix=n.prefix||this.prefix,new e(this.logger,n)}}]),e}(),gs=new Yxe,Au=function(){function e(){Mo(this,e),this.observers={}}return Yo(e,[{key:"on",value:function(n,r){var i=this;return n.split(" ").forEach(function(o){i.observers[o]=i.observers[o]||[],i.observers[o].push(r)}),this}},{key:"off",value:function(n,r){if(this.observers[n]){if(!r){delete this.observers[n];return}this.observers[n]=this.observers[n].filter(function(i){return i!==r})}}},{key:"emit",value:function(n){for(var r=arguments.length,i=new Array(r>1?r-1:0),o=1;o<r;o++)i[o-1]=arguments[o];if(this.observers[n]){var a=[].concat(this.observers[n]);a.forEach(function(l){l.apply(void 0,i)})}if(this.observers["*"]){var s=[].concat(this.observers["*"]);s.forEach(function(l){l.apply(l,[n].concat(i))})}}}]),e}();function L0(){var e,t,n=new Promise(function(r,i){e=r,t=i});return n.resolve=e,n.reject=t,n}function cD(e){return e==null?"":""+e}function Pxe(e,t,n){e.forEach(function(r){t[r]&&(n[r]=t[r])})}function d9(e,t,n){function r(s){return s&&s.indexOf("###")>-1?s.replace(/###/g,"."):s}function i(){return!e||typeof e=="string"}for(var o=typeof t!="string"?[].concat(t):t.split(".");o.length>1;){if(i())return{};var a=r(o.shift());!e[a]&&n&&(e[a]=new n),Object.prototype.hasOwnProperty.call(e,a)?e=e[a]:e={}}return i()?{}:{obj:e,k:r(o.shift())}}function dD(e,t,n){var r=d9(e,t,Object),i=r.obj,o=r.k;i[o]=n}function Rxe(e,t,n,r){var i=d9(e,t,Object),o=i.obj,a=i.k;o[a]=o[a]||[],r&&(o[a]=o[a].concat(n)),r||o[a].push(n)}function n2(e,t){var n=d9(e,t),r=n.obj,i=n.k;if(r)return r[i]}function fD(e,t,n){var r=n2(e,n);return r!==void 0?r:n2(t,n)}function hD(e,t,n){for(var r in t)r!=="__proto__"&&r!=="constructor"&&(r in e?typeof e[r]=="string"||e[r]instanceof String||typeof t[r]=="string"||t[r]instanceof String?n&&(e[r]=t[r]):hD(e[r],t[r],n):e[r]=t[r]);return e}function Ph(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var zxe={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function Axe(e){return typeof e=="string"?e.replace(/[&<>"'\/]/g,function(t){return zxe[t]}):e}var r2=typeof window<"u"&&window.navigator&&typeof window.navigator.userAgentData>"u"&&window.navigator.userAgent&&window.navigator.userAgent.indexOf("MSIE")>-1,Dxe=[" ",",","?","!",";"];function jxe(e,t,n){t=t||"",n=n||"";var r=Dxe.filter(function(s){return t.indexOf(s)<0&&n.indexOf(s)<0});if(r.length===0)return!0;var i=new RegExp("(".concat(r.map(function(s){return s==="?"?"\\?":s}).join("|"),")")),o=!i.test(e);if(!o){var a=e.indexOf(n);a>0&&!i.test(e.substring(0,a))&&(o=!0)}return o}function pD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function i2(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?pD(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):pD(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function Hxe(e){var t=Bxe();return function(){var r=ms(e),i;if(t){var o=ms(this).constructor;i=Reflect.construct(r,arguments,o)}else i=r.apply(this,arguments);return W0(this,i)}}function Bxe(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function mD(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:".";if(e){if(e[t])return e[t];for(var r=t.split(n),i=e,o=0;o<r.length;++o){if(!i||typeof i[r[o]]=="string"&&o+1<r.length)return;if(i[r[o]]===void 0){for(var a=2,s=r.slice(o,o+a).join(n),l=i[s];l===void 0&&r.length>o+a;)a++,s=r.slice(o,o+a).join(n),l=i[s];if(l===void 0)return;if(l===null)return null;if(t.endsWith(s)){if(typeof l=="string")return l;if(s&&typeof l[s]=="string")return l[s]}var u=r.slice(o+a).join(n);return u?mD(l,u,n):void 0}i=i[r[o]]}return i}}var Jxe=function(e){t2(n,e);var t=Hxe(n);function n(r){var i,o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{ns:["translation"],defaultNS:"translation"};return Mo(this,n),i=t.call(this),r2&&Au.call(zu(i)),i.data=r||{},i.options=o,i.options.keySeparator===void 0&&(i.options.keySeparator="."),i.options.ignoreJSONStructure===void 0&&(i.options.ignoreJSONStructure=!0),i}return Yo(n,[{key:"addNamespaces",value:function(i){this.options.ns.indexOf(i)<0&&this.options.ns.push(i)}},{key:"removeNamespaces",value:function(i){var o=this.options.ns.indexOf(i);o>-1&&this.options.ns.splice(o,1)}},{key:"getResource",value:function(i,o,a){var s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{},l=s.keySeparator!==void 0?s.keySeparator:this.options.keySeparator,u=s.ignoreJSONStructure!==void 0?s.ignoreJSONStructure:this.options.ignoreJSONStructure,c=[i,o];a&&typeof a!="string"&&(c=c.concat(a)),a&&typeof a=="string"&&(c=c.concat(l?a.split(l):a)),i.indexOf(".")>-1&&(c=i.split("."));var d=n2(this.data,c);return d||!u||typeof a!="string"?d:mD(this.data&&this.data[i]&&this.data[i][o],a,l)}},{key:"addResource",value:function(i,o,a,s){var l=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{silent:!1},u=this.options.keySeparator;u===void 0&&(u=".");var c=[i,o];a&&(c=c.concat(u?a.split(u):a)),i.indexOf(".")>-1&&(c=i.split("."),s=o,o=c[1]),this.addNamespaces(o),dD(this.data,c,s),l.silent||this.emit("added",i,o,a,s)}},{key:"addResources",value:function(i,o,a){var s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{silent:!1};for(var l in a)(typeof a[l]=="string"||Object.prototype.toString.apply(a[l])==="[object Array]")&&this.addResource(i,o,l,a[l],{silent:!0});s.silent||this.emit("added",i,o,a)}},{key:"addResourceBundle",value:function(i,o,a,s,l){var u=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{silent:!1},c=[i,o];i.indexOf(".")>-1&&(c=i.split("."),s=a,a=o,o=c[1]),this.addNamespaces(o);var d=n2(this.data,c)||{};s?hD(d,a,l):d=i2(i2({},d),a),dD(this.data,c,d),u.silent||this.emit("added",i,o,a)}},{key:"removeResourceBundle",value:function(i,o){this.hasResourceBundle(i,o)&&delete this.data[i][o],this.removeNamespaces(o),this.emit("removed",i,o)}},{key:"hasResourceBundle",value:function(i,o){return this.getResource(i,o)!==void 0}},{key:"getResourceBundle",value:function(i,o){return o||(o=this.options.defaultNS),this.options.compatibilityAPI==="v1"?i2(i2({},{}),this.getResource(i,o)):this.getResource(i,o)}},{key:"getDataByLanguage",value:function(i){return this.data[i]}},{key:"hasLanguageSomeTranslations",value:function(i){var o=this.getDataByLanguage(i),a=o&&Object.keys(o)||[];return!!a.find(function(s){return o[s]&&Object.keys(o[s]).length>0})}},{key:"toJSON",value:function(){return this.data}}]),n}(Au),gD={processors:{},addPostProcessor:function(t){this.processors[t.name]=t},handle:function(t,n,r,i,o){var a=this;return t.forEach(function(s){a.processors[s]&&(n=a.processors[s].process(n,r,i,o))}),n}};function bD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function ui(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?bD(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):bD(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function Uxe(e){var t=Kxe();return function(){var r=ms(e),i;if(t){var o=ms(this).constructor;i=Reflect.construct(r,arguments,o)}else i=r.apply(this,arguments);return W0(this,i)}}function Kxe(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}var vD={},yD=function(e){t2(n,e);var t=Uxe(n);function n(r){var i,o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return Mo(this,n),i=t.call(this),r2&&Au.call(zu(i)),Pxe(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],r,zu(i)),i.options=o,i.options.keySeparator===void 0&&(i.options.keySeparator="."),i.logger=gs.create("translator"),i}return Yo(n,[{key:"changeLanguage",value:function(i){i&&(this.language=i)}},{key:"exists",value:function(i){var o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}};if(i==null)return!1;var a=this.resolve(i,o);return a&&a.res!==void 0}},{key:"extractFromKey",value:function(i,o){var a=o.nsSeparator!==void 0?o.nsSeparator:this.options.nsSeparator;a===void 0&&(a=":");var s=o.keySeparator!==void 0?o.keySeparator:this.options.keySeparator,l=o.ns||this.options.defaultNS||[],u=a&&i.indexOf(a)>-1,c=!this.options.userDefinedKeySeparator&&!o.keySeparator&&!this.options.userDefinedNsSeparator&&!o.nsSeparator&&!jxe(i,a,s);if(u&&!c){var d=i.match(this.interpolator.nestingRegexp);if(d&&d.length>0)return{key:i,namespaces:l};var f=i.split(a);(a!==s||a===s&&this.options.ns.indexOf(f[0])>-1)&&(l=f.shift()),i=f.join(s)}return typeof l=="string"&&(l=[l]),{key:i,namespaces:l}}},{key:"translate",value:function(i,o,a){var s=this;if(ga(o)!=="object"&&this.options.overloadTranslationOptionHandler&&(o=this.options.overloadTranslationOptionHandler(arguments)),o||(o={}),i==null)return"";Array.isArray(i)||(i=[String(i)]);var l=o.returnDetails!==void 0?o.returnDetails:this.options.returnDetails,u=o.keySeparator!==void 0?o.keySeparator:this.options.keySeparator,c=this.extractFromKey(i[i.length-1],o),d=c.key,f=c.namespaces,p=f[f.length-1],g=o.lng||this.language,b=o.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(g&&g.toLowerCase()==="cimode"){if(b){var y=o.nsSeparator||this.options.nsSeparator;return l?(x.res="".concat(p).concat(y).concat(d),x):"".concat(p).concat(y).concat(d)}return l?(x.res=d,x):d}var x=this.resolve(i,o),w=x&&x.res,Z=x&&x.usedKey||d,E=x&&x.exactUsedKey||d,I=Object.prototype.toString.apply(w),k=["[object Number]","[object Function]","[object RegExp]"],_=o.joinArrays!==void 0?o.joinArrays:this.options.joinArrays,C=!this.i18nFormat||this.i18nFormat.handleAsObject,W=typeof w!="string"&&typeof w!="boolean"&&typeof w!="number";if(C&&w&&W&&k.indexOf(I)<0&&!(typeof _=="string"&&I==="[object Array]")){if(!o.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");var T=this.options.returnedObjectHandler?this.options.returnedObjectHandler(Z,w,ui(ui({},o),{},{ns:f})):"key '".concat(d," (").concat(this.language,")' returned an object instead of string.");return l?(x.res=T,x):T}if(u){var N=I==="[object Array]",X=N?[]:{},O=N?E:Z;for(var Y in w)if(Object.prototype.hasOwnProperty.call(w,Y)){var F="".concat(O).concat(u).concat(Y);X[Y]=this.translate(F,ui(ui({},o),{joinArrays:!1,ns:f})),X[Y]===F&&(X[Y]=w[Y])}w=X}}else if(C&&typeof _=="string"&&I==="[object Array]")w=w.join(_),w&&(w=this.extendTranslation(w,i,o,a));else{var z=!1,M=!1,P=o.count!==void 0&&typeof o.count!="string",D=n.hasDefaultValue(o),A=P?this.pluralResolver.getSuffix(g,o.count,o):"",J=o["defaultValue".concat(A)]||o.defaultValue;!this.isValidLookup(w)&&D&&(z=!0,w=J),this.isValidLookup(w)||(M=!0,w=d);var U=o.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey,K=U&&M?void 0:w,ee=D&&J!==w&&this.options.updateMissing;if(M||z||ee){if(this.logger.log(ee?"updateKey":"missingKey",g,p,d,ee?J:w),u){var q=this.resolve(d,ui(ui({},o),{},{keySeparator:!1}));q&&q.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}var te=[],de=this.languageUtils.getFallbackCodes(this.options.fallbackLng,o.lng||this.language);if(this.options.saveMissingTo==="fallback"&&de&&de[0])for(var pe=0;pe<de.length;pe++)te.push(de[pe]);else this.options.saveMissingTo==="all"?te=this.languageUtils.toResolveHierarchy(o.lng||this.language):te.push(o.lng||this.language);var Q=function(ne,j,se){var xe=D&&se!==w?se:K;s.options.missingKeyHandler?s.options.missingKeyHandler(ne,p,j,xe,ee,o):s.backendConnector&&s.backendConnector.saveMissing&&s.backendConnector.saveMissing(ne,p,j,xe,ee,o),s.emit("missingKey",ne,p,j,w)};this.options.saveMissing&&(this.options.saveMissingPlurals&&P?te.forEach(function(ie){s.pluralResolver.getSuffixes(ie,o).forEach(function(ne){Q([ie],d+ne,o["defaultValue".concat(ne)]||J)})}):Q(te,d,J))}w=this.extendTranslation(w,i,o,x,a),M&&w===d&&this.options.appendNamespaceToMissingKey&&(w="".concat(p,":").concat(d)),(M||z)&&this.options.parseMissingKeyHandler&&(this.options.compatibilityAPI!=="v1"?w=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?"".concat(p,":").concat(d):d,z?w:void 0):w=this.options.parseMissingKeyHandler(w))}return l?(x.res=w,x):w}},{key:"extendTranslation",value:function(i,o,a,s,l){var u=this;if(this.i18nFormat&&this.i18nFormat.parse)i=this.i18nFormat.parse(i,ui(ui({},this.options.interpolation.defaultVariables),a),s.usedLng,s.usedNS,s.usedKey,{resolved:s});else if(!a.skipInterpolation){a.interpolation&&this.interpolator.init(ui(ui({},a),{interpolation:ui(ui({},this.options.interpolation),a.interpolation)}));var c=typeof i=="string"&&(a&&a.interpolation&&a.interpolation.skipOnVariables!==void 0?a.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables),d;if(c){var f=i.match(this.interpolator.nestingRegexp);d=f&&f.length}var p=a.replace&&typeof a.replace!="string"?a.replace:a;if(this.options.interpolation.defaultVariables&&(p=ui(ui({},this.options.interpolation.defaultVariables),p)),i=this.interpolator.interpolate(i,p,a.lng||this.language,a),c){var g=i.match(this.interpolator.nestingRegexp),b=g&&g.length;d<b&&(a.nest=!1)}a.nest!==!1&&(i=this.interpolator.nest(i,function(){for(var w=arguments.length,Z=new Array(w),E=0;E<w;E++)Z[E]=arguments[E];return l&&l[0]===Z[0]&&!a.context?(u.logger.warn("It seems you are nesting recursively key: ".concat(Z[0]," in key: ").concat(o[0])),null):u.translate.apply(u,Z.concat([o]))},a)),a.interpolation&&this.interpolator.reset()}var y=a.postProcess||this.options.postProcess,x=typeof y=="string"?[y]:y;return i!=null&&x&&x.length&&a.applyPostProcessor!==!1&&(i=gD.handle(x,i,o,this.options&&this.options.postProcessPassResolved?ui({i18nResolved:s},a):a,this)),i}},{key:"resolve",value:function(i){var o=this,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},s,l,u,c,d;return typeof i=="string"&&(i=[i]),i.forEach(function(f){if(!o.isValidLookup(s)){var p=o.extractFromKey(f,a),g=p.key;l=g;var b=p.namespaces;o.options.fallbackNS&&(b=b.concat(o.options.fallbackNS));var y=a.count!==void 0&&typeof a.count!="string",x=y&&!a.ordinal&&a.count===0&&o.pluralResolver.shouldUseIntlApi(),w=a.context!==void 0&&(typeof a.context=="string"||typeof a.context=="number")&&a.context!=="",Z=a.lngs?a.lngs:o.languageUtils.toResolveHierarchy(a.lng||o.language,a.fallbackLng);b.forEach(function(E){o.isValidLookup(s)||(d=E,!vD["".concat(Z[0],"-").concat(E)]&&o.utils&&o.utils.hasLoadedNamespace&&!o.utils.hasLoadedNamespace(d)&&(vD["".concat(Z[0],"-").concat(E)]=!0,o.logger.warn('key "'.concat(l,'" for languages "').concat(Z.join(", "),`" won't get resolved as namespace "`).concat(d,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),Z.forEach(function(I){if(!o.isValidLookup(s)){c=I;var k=[g];if(o.i18nFormat&&o.i18nFormat.addLookupKeys)o.i18nFormat.addLookupKeys(k,g,I,E,a);else{var _;y&&(_=o.pluralResolver.getSuffix(I,a.count,a));var C="".concat(o.options.pluralSeparator,"zero");if(y&&(k.push(g+_),x&&k.push(g+C)),w){var W="".concat(g).concat(o.options.contextSeparator).concat(a.context);k.push(W),y&&(k.push(W+_),x&&k.push(W+C))}}for(var T;T=k.pop();)o.isValidLookup(s)||(u=T,s=o.getResource(I,E,T,a))}}))})}}),{res:s,usedKey:l,exactUsedKey:u,usedLng:c,usedNS:d}}},{key:"isValidLookup",value:function(i){return i!==void 0&&!(!this.options.returnNull&&i===null)&&!(!this.options.returnEmptyString&&i==="")}},{key:"getResource",value:function(i,o,a){var s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(i,o,a,s):this.resourceStore.getResource(i,o,a,s)}}],[{key:"hasDefaultValue",value:function(i){var o="defaultValue";for(var a in i)if(Object.prototype.hasOwnProperty.call(i,a)&&o===a.substring(0,o.length)&&i[a]!==void 0)return!0;return!1}}]),n}(Au);function f9(e){return e.charAt(0).toUpperCase()+e.slice(1)}var $xe=function(){function e(t){Mo(this,e),this.options=t,this.supportedLngs=this.options.supportedLngs||!1,this.logger=gs.create("languageUtils")}return Yo(e,[{key:"getScriptPartFromCode",value:function(n){if(!n||n.indexOf("-")<0)return null;var r=n.split("-");return r.length===2||(r.pop(),r[r.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(r.join("-"))}},{key:"getLanguagePartFromCode",value:function(n){if(!n||n.indexOf("-")<0)return n;var r=n.split("-");return this.formatLanguageCode(r[0])}},{key:"formatLanguageCode",value:function(n){if(typeof n=="string"&&n.indexOf("-")>-1){var r=["hans","hant","latn","cyrl","cans","mong","arab"],i=n.split("-");return this.options.lowerCaseLng?i=i.map(function(o){return o.toLowerCase()}):i.length===2?(i[0]=i[0].toLowerCase(),i[1]=i[1].toUpperCase(),r.indexOf(i[1].toLowerCase())>-1&&(i[1]=f9(i[1].toLowerCase()))):i.length===3&&(i[0]=i[0].toLowerCase(),i[1].length===2&&(i[1]=i[1].toUpperCase()),i[0]!=="sgn"&&i[2].length===2&&(i[2]=i[2].toUpperCase()),r.indexOf(i[1].toLowerCase())>-1&&(i[1]=f9(i[1].toLowerCase())),r.indexOf(i[2].toLowerCase())>-1&&(i[2]=f9(i[2].toLowerCase()))),i.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?n.toLowerCase():n}},{key:"isSupportedCode",value:function(n){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(n=this.getLanguagePartFromCode(n)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(n)>-1}},{key:"getBestMatchFromCodes",value:function(n){var r=this;if(!n)return null;var i;return n.forEach(function(o){if(!i){var a=r.formatLanguageCode(o);(!r.options.supportedLngs||r.isSupportedCode(a))&&(i=a)}}),!i&&this.options.supportedLngs&&n.forEach(function(o){if(!i){var a=r.getLanguagePartFromCode(o);if(r.isSupportedCode(a))return i=a;i=r.options.supportedLngs.find(function(s){if(s.indexOf(a)===0)return s})}}),i||(i=this.getFallbackCodes(this.options.fallbackLng)[0]),i}},{key:"getFallbackCodes",value:function(n,r){if(!n)return[];if(typeof n=="function"&&(n=n(r)),typeof n=="string"&&(n=[n]),Object.prototype.toString.apply(n)==="[object Array]")return n;if(!r)return n.default||[];var i=n[r];return i||(i=n[this.getScriptPartFromCode(r)]),i||(i=n[this.formatLanguageCode(r)]),i||(i=n[this.getLanguagePartFromCode(r)]),i||(i=n.default),i||[]}},{key:"toResolveHierarchy",value:function(n,r){var i=this,o=this.getFallbackCodes(r||this.options.fallbackLng||[],n),a=[],s=function(u){u&&(i.isSupportedCode(u)?a.push(u):i.logger.warn("rejecting language code not found in supportedLngs: ".concat(u)))};return typeof n=="string"&&n.indexOf("-")>-1?(this.options.load!=="languageOnly"&&s(this.formatLanguageCode(n)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&s(this.getScriptPartFromCode(n)),this.options.load!=="currentOnly"&&s(this.getLanguagePartFromCode(n))):typeof n=="string"&&s(this.formatLanguageCode(n)),o.forEach(function(l){a.indexOf(l)<0&&s(i.formatLanguageCode(l))}),a}}]),e}(),Qxe=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kk","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],qxe={1:function(t){return Number(t>1)},2:function(t){return Number(t!=1)},3:function(t){return 0},4:function(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},5:function(t){return Number(t==0?0:t==1?1:t==2?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5)},6:function(t){return Number(t==1?0:t>=2&&t<=4?1:2)},7:function(t){return Number(t==1?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2)},8:function(t){return Number(t==1?0:t==2?1:t!=8&&t!=11?2:3)},9:function(t){return Number(t>=2)},10:function(t){return Number(t==1?0:t==2?1:t<7?2:t<11?3:4)},11:function(t){return Number(t==1||t==11?0:t==2||t==12?1:t>2&&t<20?2:3)},12:function(t){return Number(t%10!=1||t%100==11)},13:function(t){return Number(t!==0)},14:function(t){return Number(t==1?0:t==2?1:t==3?2:3)},15:function(t){return Number(t%10==1&&t%100!=11?0:t%10>=2&&(t%100<10||t%100>=20)?1:2)},16:function(t){return Number(t%10==1&&t%100!=11?0:t!==0?1:2)},17:function(t){return Number(t==1||t%10==1&&t%100!=11?0:1)},18:function(t){return Number(t==0?0:t==1?1:2)},19:function(t){return Number(t==1?0:t==0||t%100>1&&t%100<11?1:t%100>10&&t%100<20?2:3)},20:function(t){return Number(t==1?0:t==0||t%100>0&&t%100<20?1:2)},21:function(t){return Number(t%100==1?1:t%100==2?2:t%100==3||t%100==4?3:0)},22:function(t){return Number(t==1?0:t==2?1:(t<0||t>10)&&t%10==0?2:3)}},e2e=["v1","v2","v3"],xD={zero:0,one:1,two:2,few:3,many:4,other:5};function t2e(){var e={};return Qxe.forEach(function(t){t.lngs.forEach(function(n){e[n]={numbers:t.nr,plurals:qxe[t.fc]}})}),e}var n2e=function(){function e(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};Mo(this,e),this.languageUtils=t,this.options=n,this.logger=gs.create("pluralResolver"),(!this.options.compatibilityJSON||this.options.compatibilityJSON==="v4")&&(typeof Intl>"u"||!Intl.PluralRules)&&(this.options.compatibilityJSON="v3",this.logger.error("Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.")),this.rules=t2e()}return Yo(e,[{key:"addRule",value:function(n,r){this.rules[n]=r}},{key:"getRule",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(this.shouldUseIntlApi())try{return new Intl.PluralRules(n,{type:r.ordinal?"ordinal":"cardinal"})}catch{return}return this.rules[n]||this.rules[this.languageUtils.getLanguagePartFromCode(n)]}},{key:"needsPlural",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=this.getRule(n,r);return this.shouldUseIntlApi()?i&&i.resolvedOptions().pluralCategories.length>1:i&&i.numbers.length>1}},{key:"getPluralFormsOfKey",value:function(n,r){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return this.getSuffixes(n,i).map(function(o){return"".concat(r).concat(o)})}},{key:"getSuffixes",value:function(n){var r=this,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=this.getRule(n,i);return o?this.shouldUseIntlApi()?o.resolvedOptions().pluralCategories.sort(function(a,s){return xD[a]-xD[s]}).map(function(a){return"".concat(r.options.prepend).concat(a)}):o.numbers.map(function(a){return r.getSuffix(n,a,i)}):[]}},{key:"getSuffix",value:function(n,r){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},o=this.getRule(n,i);return o?this.shouldUseIntlApi()?"".concat(this.options.prepend).concat(o.select(r)):this.getSuffixRetroCompatible(o,r):(this.logger.warn("no plural rule found for: ".concat(n)),"")}},{key:"getSuffixRetroCompatible",value:function(n,r){var i=this,o=n.noAbs?n.plurals(r):n.plurals(Math.abs(r)),a=n.numbers[o];this.options.simplifyPluralSuffix&&n.numbers.length===2&&n.numbers[0]===1&&(a===2?a="plural":a===1&&(a=""));var s=function(){return i.options.prepend&&a.toString()?i.options.prepend+a.toString():a.toString()};return this.options.compatibilityJSON==="v1"?a===1?"":typeof a=="number"?"_plural_".concat(a.toString()):s():this.options.compatibilityJSON==="v2"||this.options.simplifyPluralSuffix&&n.numbers.length===2&&n.numbers[0]===1?s():this.options.prepend&&o.toString()?this.options.prepend+o.toString():o.toString()}},{key:"shouldUseIntlApi",value:function(){return!e2e.includes(this.options.compatibilityJSON)}}]),e}();function wD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function Ea(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?wD(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):wD(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}var r2e=function(){function e(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Mo(this,e),this.logger=gs.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||function(n){return n},this.init(t)}return Yo(e,[{key:"init",value:function(){var n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};n.interpolation||(n.interpolation={escapeValue:!0});var r=n.interpolation;this.escape=r.escape!==void 0?r.escape:Axe,this.escapeValue=r.escapeValue!==void 0?r.escapeValue:!0,this.useRawValueToEscape=r.useRawValueToEscape!==void 0?r.useRawValueToEscape:!1,this.prefix=r.prefix?Ph(r.prefix):r.prefixEscaped||"{{",this.suffix=r.suffix?Ph(r.suffix):r.suffixEscaped||"}}",this.formatSeparator=r.formatSeparator?r.formatSeparator:r.formatSeparator||",",this.unescapePrefix=r.unescapeSuffix?"":r.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":r.unescapeSuffix||"",this.nestingPrefix=r.nestingPrefix?Ph(r.nestingPrefix):r.nestingPrefixEscaped||Ph("$t("),this.nestingSuffix=r.nestingSuffix?Ph(r.nestingSuffix):r.nestingSuffixEscaped||Ph(")"),this.nestingOptionsSeparator=r.nestingOptionsSeparator?r.nestingOptionsSeparator:r.nestingOptionsSeparator||",",this.maxReplaces=r.maxReplaces?r.maxReplaces:1e3,this.alwaysFormat=r.alwaysFormat!==void 0?r.alwaysFormat:!1,this.resetRegExp()}},{key:"reset",value:function(){this.options&&this.init(this.options)}},{key:"resetRegExp",value:function(){var n="".concat(this.prefix,"(.+?)").concat(this.suffix);this.regexp=new RegExp(n,"g");var r="".concat(this.prefix).concat(this.unescapePrefix,"(.+?)").concat(this.unescapeSuffix).concat(this.suffix);this.regexpUnescape=new RegExp(r,"g");var i="".concat(this.nestingPrefix,"(.+?)").concat(this.nestingSuffix);this.nestingRegexp=new RegExp(i,"g")}},{key:"interpolate",value:function(n,r,i,o){var a=this,s,l,u,c=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function d(y){return y.replace(/\$/g,"$$$$")}var f=function(x){if(x.indexOf(a.formatSeparator)<0){var w=fD(r,c,x);return a.alwaysFormat?a.format(w,void 0,i,Ea(Ea(Ea({},o),r),{},{interpolationkey:x})):w}var Z=x.split(a.formatSeparator),E=Z.shift().trim(),I=Z.join(a.formatSeparator).trim();return a.format(fD(r,c,E),I,i,Ea(Ea(Ea({},o),r),{},{interpolationkey:E}))};this.resetRegExp();var p=o&&o.missingInterpolationHandler||this.options.missingInterpolationHandler,g=o&&o.interpolation&&o.interpolation.skipOnVariables!==void 0?o.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables,b=[{regex:this.regexpUnescape,safeValue:function(x){return d(x)}},{regex:this.regexp,safeValue:function(x){return a.escapeValue?d(a.escape(x)):d(x)}}];return b.forEach(function(y){for(u=0;s=y.regex.exec(n);){var x=s[1].trim();if(l=f(x),l===void 0)if(typeof p=="function"){var w=p(n,s,o);l=typeof w=="string"?w:""}else if(o&&o.hasOwnProperty(x))l="";else if(g){l=s[0];continue}else a.logger.warn("missed to pass in variable ".concat(x," for interpolating ").concat(n)),l="";else typeof l!="string"&&!a.useRawValueToEscape&&(l=cD(l));var Z=y.safeValue(l);if(n=n.replace(s[0],Z),g?(y.regex.lastIndex+=l.length,y.regex.lastIndex-=s[0].length):y.regex.lastIndex=0,u++,u>=a.maxReplaces)break}}),n}},{key:"nest",value:function(n,r){var i=this,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a,s,l=Ea({},o);l.applyPostProcessor=!1,delete l.defaultValue;function u(p,g){var b=this.nestingOptionsSeparator;if(p.indexOf(b)<0)return p;var y=p.split(new RegExp("".concat(b,"[ ]*{"))),x="{".concat(y[1]);p=y[0],x=this.interpolate(x,l);var w=x.match(/'/g),Z=x.match(/"/g);(w&&w.length%2===0&&!Z||Z.length%2!==0)&&(x=x.replace(/'/g,'"'));try{l=JSON.parse(x),g&&(l=Ea(Ea({},g),l))}catch(E){return this.logger.warn("failed parsing options string in nesting for key ".concat(p),E),"".concat(p).concat(b).concat(x)}return delete l.defaultValue,p}for(;a=this.nestingRegexp.exec(n);){var c=[],d=!1;if(a[0].indexOf(this.formatSeparator)!==-1&&!/{.*}/.test(a[1])){var f=a[1].split(this.formatSeparator).map(function(p){return p.trim()});a[1]=f.shift(),c=f,d=!0}if(s=r(u.call(this,a[1].trim(),l),l),s&&a[0]===n&&typeof s!="string")return s;typeof s!="string"&&(s=cD(s)),s||(this.logger.warn("missed to resolve ".concat(a[1]," for nesting ").concat(n)),s=""),d&&(s=c.reduce(function(p,g){return i.format(p,g,o.lng,Ea(Ea({},o),{},{interpolationkey:a[1].trim()}))},s.trim())),n=n.replace(a[0],s),this.regexp.lastIndex=0}return n}}]),e}();function SD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function Du(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?SD(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):SD(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function i2e(e){var t=e.toLowerCase().trim(),n={};if(e.indexOf("(")>-1){var r=e.split("(");t=r[0].toLowerCase().trim();var i=r[1].substring(0,r[1].length-1);if(t==="currency"&&i.indexOf(":")<0)n.currency||(n.currency=i.trim());else if(t==="relativetime"&&i.indexOf(":")<0)n.range||(n.range=i.trim());else{var o=i.split(";");o.forEach(function(a){if(a){var s=a.split(":"),l=Fxe(s),u=l[0],c=l.slice(1),d=c.join(":").trim().replace(/^'+|'+$/g,"");n[u.trim()]||(n[u.trim()]=d),d==="false"&&(n[u.trim()]=!1),d==="true"&&(n[u.trim()]=!0),isNaN(d)||(n[u.trim()]=parseInt(d,10))}})}}return{formatName:t,formatOptions:n}}function Rh(e){var t={};return function(r,i,o){var a=i+JSON.stringify(o),s=t[a];return s||(s=e(i,o),t[a]=s),s(r)}}var o2e=function(){function e(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Mo(this,e),this.logger=gs.create("formatter"),this.options=t,this.formats={number:Rh(function(n,r){var i=new Intl.NumberFormat(n,r);return function(o){return i.format(o)}}),currency:Rh(function(n,r){var i=new Intl.NumberFormat(n,Du(Du({},r),{},{style:"currency"}));return function(o){return i.format(o)}}),datetime:Rh(function(n,r){var i=new Intl.DateTimeFormat(n,Du({},r));return function(o){return i.format(o)}}),relativetime:Rh(function(n,r){var i=new Intl.RelativeTimeFormat(n,Du({},r));return function(o){return i.format(o,r.range||"day")}}),list:Rh(function(n,r){var i=new Intl.ListFormat(n,Du({},r));return function(o){return i.format(o)}})},this.init(t)}return Yo(e,[{key:"init",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}},i=r.interpolation;this.formatSeparator=i.formatSeparator?i.formatSeparator:i.formatSeparator||","}},{key:"add",value:function(n,r){this.formats[n.toLowerCase().trim()]=r}},{key:"addCached",value:function(n,r){this.formats[n.toLowerCase().trim()]=Rh(r)}},{key:"format",value:function(n,r,i,o){var a=this,s=r.split(this.formatSeparator),l=s.reduce(function(u,c){var d=i2e(c),f=d.formatName,p=d.formatOptions;if(a.formats[f]){var g=u;try{var b=o&&o.formatParams&&o.formatParams[o.interpolationkey]||{},y=b.locale||b.lng||o.locale||o.lng||i;g=a.formats[f](u,y,Du(Du(Du({},p),o),b))}catch(x){a.logger.warn(x)}return g}else a.logger.warn("there was no format function for ".concat(f));return u},n);return l}}]),e}();function ZD(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function ED(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?ZD(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ZD(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function a2e(e){var t=s2e();return function(){var r=ms(e),i;if(t){var o=ms(this).constructor;i=Reflect.construct(r,arguments,o)}else i=r.apply(this,arguments);return W0(this,i)}}function s2e(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function l2e(e,t){e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)}var u2e=function(e){t2(n,e);var t=a2e(n);function n(r,i,o){var a,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return Mo(this,n),a=t.call(this),r2&&Au.call(zu(a)),a.backend=r,a.store=i,a.services=o,a.languageUtils=o.languageUtils,a.options=s,a.logger=gs.create("backendConnector"),a.waitingReads=[],a.maxParallelReads=s.maxParallelReads||10,a.readingCalls=0,a.maxRetries=s.maxRetries>=0?s.maxRetries:5,a.retryTimeout=s.retryTimeout>=1?s.retryTimeout:350,a.state={},a.queue=[],a.backend&&a.backend.init&&a.backend.init(o,s.backend,s),a}return Yo(n,[{key:"queueLoad",value:function(i,o,a,s){var l=this,u={},c={},d={},f={};return i.forEach(function(p){var g=!0;o.forEach(function(b){var y="".concat(p,"|").concat(b);!a.reload&&l.store.hasResourceBundle(p,b)?l.state[y]=2:l.state[y]<0||(l.state[y]===1?c[y]===void 0&&(c[y]=!0):(l.state[y]=1,g=!1,c[y]===void 0&&(c[y]=!0),u[y]===void 0&&(u[y]=!0),f[b]===void 0&&(f[b]=!0)))}),g||(d[p]=!0)}),(Object.keys(u).length||Object.keys(c).length)&&this.queue.push({pending:c,pendingCount:Object.keys(c).length,loaded:{},errors:[],callback:s}),{toLoad:Object.keys(u),pending:Object.keys(c),toLoadLanguages:Object.keys(d),toLoadNamespaces:Object.keys(f)}}},{key:"loaded",value:function(i,o,a){var s=i.split("|"),l=s[0],u=s[1];o&&this.emit("failedLoading",l,u,o),a&&this.store.addResourceBundle(l,u,a),this.state[i]=o?-1:2;var c={};this.queue.forEach(function(d){Rxe(d.loaded,[l],u),l2e(d,i),o&&d.errors.push(o),d.pendingCount===0&&!d.done&&(Object.keys(d.loaded).forEach(function(f){c[f]||(c[f]={});var p=d.loaded[f];p.length&&p.forEach(function(g){c[f][g]===void 0&&(c[f][g]=!0)})}),d.done=!0,d.errors.length?d.callback(d.errors):d.callback())}),this.emit("loaded",c),this.queue=this.queue.filter(function(d){return!d.done})}},{key:"read",value:function(i,o,a){var s=this,l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,u=arguments.length>4&&arguments[4]!==void 0?arguments[4]:this.retryTimeout,c=arguments.length>5?arguments[5]:void 0;if(!i.length)return c(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:i,ns:o,fcName:a,tried:l,wait:u,callback:c});return}return this.readingCalls++,this.backend[a](i,o,function(d,f){if(s.readingCalls--,s.waitingReads.length>0){var p=s.waitingReads.shift();s.read(p.lng,p.ns,p.fcName,p.tried,p.wait,p.callback)}if(d&&f&&l<s.maxRetries){setTimeout(function(){s.read.call(s,i,o,a,l+1,u*2,c)},u);return}c(d,f)})}},{key:"prepareLoading",value:function(i,o){var a=this,s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},l=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),l&&l();typeof i=="string"&&(i=this.languageUtils.toResolveHierarchy(i)),typeof o=="string"&&(o=[o]);var u=this.queueLoad(i,o,s,l);if(!u.toLoad.length)return u.pending.length||l(),null;u.toLoad.forEach(function(c){a.loadOne(c)})}},{key:"load",value:function(i,o,a){this.prepareLoading(i,o,{},a)}},{key:"reload",value:function(i,o,a){this.prepareLoading(i,o,{reload:!0},a)}},{key:"loadOne",value:function(i){var o=this,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"",s=i.split("|"),l=s[0],u=s[1];this.read(l,u,"read",void 0,void 0,function(c,d){c&&o.logger.warn("".concat(a,"loading namespace ").concat(u," for language ").concat(l," failed"),c),!c&&d&&o.logger.log("".concat(a,"loaded namespace ").concat(u," for language ").concat(l),d),o.loaded(i,c,d)})}},{key:"saveMissing",value:function(i,o,a,s,l){var u=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{};if(this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(o)){this.logger.warn('did not save key "'.concat(a,'" as the namespace "').concat(o,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}a==null||a===""||(this.backend&&this.backend.create&&this.backend.create(i,o,a,s,null,ED(ED({},u),{},{isUpdate:l})),!(!i||!i[0])&&this.store.addResource(i[0],o,a,s))}}]),n}(Au);function c2e(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!0,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function(t){var n={};if(ga(t[1])==="object"&&(n=t[1]),typeof t[1]=="string"&&(n.defaultValue=t[1]),typeof t[2]=="string"&&(n.tDescription=t[2]),ga(t[2])==="object"||ga(t[3])==="object"){var r=t[3]||t[2];Object.keys(r).forEach(function(i){n[i]=r[i]})}return n},interpolation:{escapeValue:!0,format:function(t,n,r,i){return t},prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0}}}function ID(e){return typeof e.ns=="string"&&(e.ns=[e.ns]),typeof e.fallbackLng=="string"&&(e.fallbackLng=[e.fallbackLng]),typeof e.fallbackNS=="string"&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function _D(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function bs(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?_D(Object(n),!0).forEach(function(r){ba(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):_D(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function d2e(e){var t=f2e();return function(){var r=ms(e),i;if(t){var o=ms(this).constructor;i=Reflect.construct(r,arguments,o)}else i=r.apply(this,arguments);return W0(this,i)}}function f2e(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function o2(){}function h2e(e){var t=Object.getOwnPropertyNames(Object.getPrototypeOf(e));t.forEach(function(n){typeof e[n]=="function"&&(e[n]=e[n].bind(e))})}var a2=function(e){t2(n,e);var t=d2e(n);function n(){var r,i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},o=arguments.length>1?arguments[1]:void 0;if(Mo(this,n),r=t.call(this),r2&&Au.call(zu(r)),r.options=ID(i),r.services={},r.logger=gs,r.modules={external:[]},h2e(zu(r)),o&&!r.isInitialized&&!i.isClone){if(!r.options.initImmediate)return r.init(i,o),W0(r,zu(r));setTimeout(function(){r.init(i,o)},0)}return r}return Yo(n,[{key:"init",value:function(){var i=this,o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},a=arguments.length>1?arguments[1]:void 0;typeof o=="function"&&(a=o,o={}),!o.defaultNS&&o.defaultNS!==!1&&o.ns&&(typeof o.ns=="string"?o.defaultNS=o.ns:o.ns.indexOf("translation")<0&&(o.defaultNS=o.ns[0]));var s=c2e();this.options=bs(bs(bs({},s),this.options),ID(o)),this.options.compatibilityAPI!=="v1"&&(this.options.interpolation=bs(bs({},s.interpolation),this.options.interpolation)),o.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=o.keySeparator),o.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=o.nsSeparator);function l(x){return x?typeof x=="function"?new x:x:null}if(!this.options.isClone){this.modules.logger?gs.init(l(this.modules.logger),this.options):gs.init(null,this.options);var u;this.modules.formatter?u=this.modules.formatter:typeof Intl<"u"&&(u=o2e);var c=new $xe(this.options);this.store=new Jxe(this.options.resources,this.options);var d=this.services;d.logger=gs,d.resourceStore=this.store,d.languageUtils=c,d.pluralResolver=new n2e(c,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),u&&(!this.options.interpolation.format||this.options.interpolation.format===s.interpolation.format)&&(d.formatter=l(u),d.formatter.init(d,this.options),this.options.interpolation.format=d.formatter.format.bind(d.formatter)),d.interpolator=new r2e(this.options),d.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},d.backendConnector=new u2e(l(this.modules.backend),d.resourceStore,d,this.options),d.backendConnector.on("*",function(x){for(var w=arguments.length,Z=new Array(w>1?w-1:0),E=1;E<w;E++)Z[E-1]=arguments[E];i.emit.apply(i,[x].concat(Z))}),this.modules.languageDetector&&(d.languageDetector=l(this.modules.languageDetector),d.languageDetector.init(d,this.options.detection,this.options)),this.modules.i18nFormat&&(d.i18nFormat=l(this.modules.i18nFormat),d.i18nFormat.init&&d.i18nFormat.init(this)),this.translator=new yD(this.services,this.options),this.translator.on("*",function(x){for(var w=arguments.length,Z=new Array(w>1?w-1:0),E=1;E<w;E++)Z[E-1]=arguments[E];i.emit.apply(i,[x].concat(Z))}),this.modules.external.forEach(function(x){x.init&&x.init(i)})}if(this.format=this.options.interpolation.format,a||(a=o2),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){var f=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);f.length>0&&f[0]!=="dev"&&(this.options.lng=f[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined");var p=["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"];p.forEach(function(x){i[x]=function(){var w;return(w=i.store)[x].apply(w,arguments)}});var g=["addResource","addResources","addResourceBundle","removeResourceBundle"];g.forEach(function(x){i[x]=function(){var w;return(w=i.store)[x].apply(w,arguments),i}});var b=L0(),y=function(){var w=function(E,I){i.isInitialized&&!i.initializedStoreOnce&&i.logger.warn("init: i18next is already initialized. You should call init just once!"),i.isInitialized=!0,i.options.isClone||i.logger.log("initialized",i.options),i.emit("initialized",i.options),b.resolve(I),a(E,I)};if(i.languages&&i.options.compatibilityAPI!=="v1"&&!i.isInitialized)return w(null,i.t.bind(i));i.changeLanguage(i.options.lng,w)};return this.options.resources||!this.options.initImmediate?y():setTimeout(y,0),b}},{key:"loadResources",value:function(i){var o=this,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:o2,s=a,l=typeof i=="string"?i:this.language;if(typeof i=="function"&&(s=i),!this.options.resources||this.options.partialBundledLanguages){if(l&&l.toLowerCase()==="cimode")return s();var u=[],c=function(p){if(p){var g=o.services.languageUtils.toResolveHierarchy(p);g.forEach(function(b){u.indexOf(b)<0&&u.push(b)})}};if(l)c(l);else{var d=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);d.forEach(function(f){return c(f)})}this.options.preload&&this.options.preload.forEach(function(f){return c(f)}),this.services.backendConnector.load(u,this.options.ns,function(f){!f&&!o.resolvedLanguage&&o.language&&o.setResolvedLanguage(o.language),s(f)})}else s(null)}},{key:"reloadResources",value:function(i,o,a){var s=L0();return i||(i=this.languages),o||(o=this.options.ns),a||(a=o2),this.services.backendConnector.reload(i,o,function(l){s.resolve(),a(l)}),s}},{key:"use",value:function(i){if(!i)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!i.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return i.type==="backend"&&(this.modules.backend=i),(i.type==="logger"||i.log&&i.warn&&i.error)&&(this.modules.logger=i),i.type==="languageDetector"&&(this.modules.languageDetector=i),i.type==="i18nFormat"&&(this.modules.i18nFormat=i),i.type==="postProcessor"&&gD.addPostProcessor(i),i.type==="formatter"&&(this.modules.formatter=i),i.type==="3rdParty"&&this.modules.external.push(i),this}},{key:"setResolvedLanguage",value:function(i){if(!(!i||!this.languages)&&!(["cimode","dev"].indexOf(i)>-1))for(var o=0;o<this.languages.length;o++){var a=this.languages[o];if(!(["cimode","dev"].indexOf(a)>-1)&&this.store.hasLanguageSomeTranslations(a)){this.resolvedLanguage=a;break}}}},{key:"changeLanguage",value:function(i,o){var a=this;this.isLanguageChangingTo=i;var s=L0();this.emit("languageChanging",i);var l=function(f){a.language=f,a.languages=a.services.languageUtils.toResolveHierarchy(f),a.resolvedLanguage=void 0,a.setResolvedLanguage(f)},u=function(f,p){p?(l(p),a.translator.changeLanguage(p),a.isLanguageChangingTo=void 0,a.emit("languageChanged",p),a.logger.log("languageChanged",p)):a.isLanguageChangingTo=void 0,s.resolve(function(){return a.t.apply(a,arguments)}),o&&o(f,function(){return a.t.apply(a,arguments)})},c=function(f){!i&&!f&&a.services.languageDetector&&(f=[]);var p=typeof f=="string"?f:a.services.languageUtils.getBestMatchFromCodes(f);p&&(a.language||l(p),a.translator.language||a.translator.changeLanguage(p),a.services.languageDetector&&a.services.languageDetector.cacheUserLanguage(p)),a.loadResources(p,function(g){u(g,p)})};return!i&&this.services.languageDetector&&!this.services.languageDetector.async?c(this.services.languageDetector.detect()):!i&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect(c):c(i),s}},{key:"getFixedT",value:function(i,o,a){var s=this,l=function u(c,d){var f;if(ga(d)!=="object"){for(var p=arguments.length,g=new Array(p>2?p-2:0),b=2;b<p;b++)g[b-2]=arguments[b];f=s.options.overloadTranslationOptionHandler([c,d].concat(g))}else f=bs({},d);f.lng=f.lng||u.lng,f.lngs=f.lngs||u.lngs,f.ns=f.ns||u.ns,f.keyPrefix=f.keyPrefix||a||u.keyPrefix;var y=s.options.keySeparator||".",x=f.keyPrefix?"".concat(f.keyPrefix).concat(y).concat(c):c;return s.t(x,f)};return typeof i=="string"?l.lng=i:l.lngs=i,l.ns=o,l.keyPrefix=a,l}},{key:"t",value:function(){var i;return this.translator&&(i=this.translator).translate.apply(i,arguments)}},{key:"exists",value:function(){var i;return this.translator&&(i=this.translator).exists.apply(i,arguments)}},{key:"setDefaultNamespace",value:function(i){this.options.defaultNS=i}},{key:"hasLoadedNamespace",value:function(i){var o=this,a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;var s=this.resolvedLanguage||this.languages[0],l=this.options?this.options.fallbackLng:!1,u=this.languages[this.languages.length-1];if(s.toLowerCase()==="cimode")return!0;var c=function(p,g){var b=o.services.backendConnector.state["".concat(p,"|").concat(g)];return b===-1||b===2};if(a.precheck){var d=a.precheck(this,c);if(d!==void 0)return d}return!!(this.hasResourceBundle(s,i)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||c(s,i)&&(!l||c(u,i)))}},{key:"loadNamespaces",value:function(i,o){var a=this,s=L0();return this.options.ns?(typeof i=="string"&&(i=[i]),i.forEach(function(l){a.options.ns.indexOf(l)<0&&a.options.ns.push(l)}),this.loadResources(function(l){s.resolve(),o&&o(l)}),s):(o&&o(),Promise.resolve())}},{key:"loadLanguages",value:function(i,o){var a=L0();typeof i=="string"&&(i=[i]);var s=this.options.preload||[],l=i.filter(function(u){return s.indexOf(u)<0});return l.length?(this.options.preload=s.concat(l),this.loadResources(function(u){a.resolve(),o&&o(u)}),a):(o&&o(),Promise.resolve())}},{key:"dir",value:function(i){if(i||(i=this.resolvedLanguage||(this.languages&&this.languages.length>0?this.languages[0]:this.language)),!i)return"rtl";var o=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"];return o.indexOf(this.services.languageUtils.getLanguagePartFromCode(i))>-1||i.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}},{key:"cloneInstance",value:function(){var i=this,o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:o2,s=bs(bs(bs({},this.options),o),{isClone:!0}),l=new n(s);(o.debug!==void 0||o.prefix!==void 0)&&(l.logger=l.logger.clone(o));var u=["store","services","language"];return u.forEach(function(c){l[c]=i[c]}),l.services=bs({},this.services),l.services.utils={hasLoadedNamespace:l.hasLoadedNamespace.bind(l)},l.translator=new yD(l.services,l.options),l.translator.on("*",function(c){for(var d=arguments.length,f=new Array(d>1?d-1:0),p=1;p<d;p++)f[p-1]=arguments[p];l.emit.apply(l,[c].concat(f))}),l.init(s,a),l.translator.options=l.options,l.translator.backendConnector.services.utils={hasLoadedNamespace:l.hasLoadedNamespace.bind(l)},l}},{key:"toJSON",value:function(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}]),n}(Au);ba(a2,"createInstance",function(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;return new a2(e,t)});var Un=a2.createInstance();Un.createInstance=a2.createInstance,Un.createInstance,Un.init,Un.loadResources,Un.reloadResources,Un.use,Un.changeLanguage,Un.getFixedT,Un.t,Un.exists,Un.setDefaultNamespace,Un.hasLoadedNamespace,Un.loadNamespaces,Un.loadLanguages;const Ar="gw_count_fid",p2e=["year","quarter","month","week","day","hour","minute","second"],m2e=["year","quarter","month","week","weekday","day","hour","minute","second"],mr="gw_mea_key_fid",gr="gw_mea_val_fid";function g2e(e,t){return e.filter(r=>t.every(i=>i.type==="continuous"?r[i.key]>=i.range[0]&&r[i.key]<=i.range[1]:i.range.has(r[i.key])))}function b2e(){return{dragId:Ar,fid:Ar,name:Un.t("constant.row_count"),analyticType:"measure",semanticType:"quantitative",aggName:"sum",computed:!0,expression:{op:"one",params:[],as:Ar}}}function v2e(){return[{dragId:mr,fid:mr,name:Un.t("constant.mea_key"),analyticType:"dimension",semanticType:"nominal"},{dragId:gr,fid:gr,name:Un.t("constant.mea_val"),analyticType:"measure",semanticType:"quantitative",aggName:"sum"}]}function y2e(...e){return e.filter(Boolean).join(" ")}function or(e,t){return t?`${e}_${t}`:e}function h9(e){return e.enableAgg&&e.aggName?or(e.fid,e.aggName):e.fid}function p9({rows:e,columns:t}){return e.length&&!e.find(n=>n.analyticType==="measure")?e[e.length-1].sort||"none":t.length&&!t.find(n=>n.analyticType==="measure")&&t[t.length-1].sort||"none"}function GD({rows:e,columns:t}){return e.length&&!e.find(n=>n.analyticType==="measure")?"row":t.length&&!t.find(n=>n.analyticType==="measure")?"column":"none"}function CD(e){return e instanceof Error?e.message:typeof e=="string"?e:String(e)}const x2e=e=>{const t=e.getFullYear(),n=e.getMonth()+1,r=e.getDate(),i=e.getHours(),o=e.getMinutes(),a=e.getSeconds(),s=l=>`${l}`.padStart(2,"0");return`${t}-${s(n)}-${s(r)} ${s(i)}:${s(o)}:${s(a)}`};function s2(e){return e?e.type==="one of"||e.type==="not in"?{...e,value:[...e.value]}:e:null}function kD(e){return e?e.type==="one of"||e.type==="not in"?{...e,value:new Set(e.value)}:e:null}function w2e(){return{dimensions:[],measures:[],rows:[],columns:[],color:[],opacity:[],size:[],shape:[],radius:[],theta:[],longitude:[],latitude:[],geoId:[],details:[],filters:[],text:[]}}function S2e(){const[e]=Bt.GEOM_TYPES.generic;return{defaultAggregated:!0,geoms:[e],showTableSummary:!1,coordSystem:"generic",stack:"stack",showActions:!1,interactiveScale:!1,sorted:"none",zeroScale:!0,scaleIncludeUnmatchedChoropleth:!1,background:void 0,size:{mode:"auto",width:320,height:200},format:{numberFormat:void 0,timeFormat:void 0,normalizedNumberFormat:void 0},geoKey:"name",resolve:{x:!1,y:!1,color:!1,opacity:!1,shape:!1,size:!1},limit:-1}}const Z2e={showActions:!1,showTableSummary:!1,stack:"stack",interactiveScale:!1,zeroScale:!0,background:void 0,size:{mode:"auto",width:320,height:200},format:{numberFormat:void 0,timeFormat:void 0,normalizedNumberFormat:void 0},geoKey:"name",resolve:{x:!1,y:!1,color:!1,opacity:!1,shape:!1,size:!1}},WD={defaultAggregated:!0,geoms:[Bt.GEOM_TYPES.generic[0]],coordSystem:"generic",limit:-1},m9={dimensions:[],measures:[],rows:[],columns:[],color:[],opacity:[],size:[],shape:[],radius:[],theta:[],longitude:[],latitude:[],geoId:[],details:[],filters:[],text:[]};function LD(e){const t=e.encodings.filters.map(n=>{var r;return((r=n.rule)==null?void 0:r.type)==="one of"&&Array.isArray(n.rule.value)?{...n,rule:{...n.rule,value:new Set(n.rule.value)}}:n});return{...e,encodings:{...w2e(),...e.encodings,filters:t}}}const TD=e=>({...e,config:{...S2e(),...e.config}}),ND="https://graphic-walker.kanaries.net/stoinfo_v2.json";function XD(e,t,n){var r=new Blob([e],{type:n});if(window.navigator.msSaveOrOpenBlob)window.navigator.msSaveOrOpenBlob(r,t);else{var i=document.createElement("a"),o=URL.createObjectURL(r);i.href=o,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(o)},0)}}let E2e=(e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce((t,n)=>(n&=63,n<36?t+=n.toString(36):n<62?t+=(n-26).toString(36).toUpperCase():n>62?t+="-":t+="_",t),"");function Li(){return"gw_"+E2e(4)}const g9=(e,t,n)=>n===e.length?e.concat([t]):e.flatMap((r,i)=>i===n?[t,r]:[r]),OD=(e,t)=>e.filter((n,r)=>r!==t),xd=(e,t,n)=>e.map((r,i)=>i===t?n(r):r);function pn(e,t,n){const r=(i,o,a)=>{const[s,...l]=o;return l.length===0?{...i,[s]:a(i[s])}:{...i,[s]:r(i[s],l,a)}};return r(e,t.split("."),n)}const b9=e=>Math.floor(Math.sqrt(2*e));function I2e(e){return(t,n)=>{const{base:r,cache:i,cursor:o,now:a,timeline:s}=t;return{base:r,now:e(a,n),cursor:o+1,cache:o-i.cursor>b9(o)?{value:e(i.value,s[i.cursor]),cursor:i.cursor+1}:i,timeline:s.slice(0,o).concat([n])}}}function _2e(e){return t=>{const{base:n,cache:r,cursor:i,timeline:o}=t,a=i-1;if(a<0)return t;const s=a<r.cursor,l=s?Math.max(0,a-b9(a)):r.cursor,u=s?o.slice(0,l).reduce(e,n):r.value;return{base:n,now:o.slice(l,a).reduce(e,u),cache:s?{value:u,cursor:l}:r,cursor:a,timeline:o}}}function G2e(e){return t=>{const{base:n,cache:r,cursor:i,now:o,timeline:a}=t;return i===a.length?t:{base:n,now:e(o,a[i]),cursor:i+1,cache:i-r.cursor>b9(i)?{value:e(r.value,a[r.cursor]),cursor:r.cursor+1}:r,timeline:a}}}function C2e(e){return(t,n)=>n>t.cursor?t.now:n>t.cache.cursor?t.timeline.slice(t.cache.cursor,n).reduce(e,t.cache.value):t.timeline.slice(0,n).reduce(e,t.base)}function VD(e){return{base:e,cursor:0,cache:{value:e,cursor:0},now:e,timeline:[]}}const Ia={measureAfterDimension(e){return e.filter(t=>t.analyticType==="dimension").concat(e.filter(t=>t.analyticType==="measure"))},crossLimit(e){return function(t){let n=0;return t.reduce((r,i)=>(i.analyticType==="dimension"&&n<e&&(r.push(i),n++),i.analyticType==="measure"&&r.push(i),r),[])}},forceAnalyticType(e){return function(t){return t.map(n=>({...n,analyticType:e}))}},forceSemanticType(e){return function(t){return t.map(n=>({...n,semanticType:e}))}}};function l2(e,t){return t.reduce((n,r)=>r(n),e)}function u2(e){return Array.isArray(e)?Ia.measureAfterDimension(e):"rows"in e&&"columns"in e&&(e.rows.length>0||e.columns.length>0)?{...e,rows:l2(e.rows,[Ia.measureAfterDimension,Ia.crossLimit(2)]),columns:l2(e.columns,[Ia.measureAfterDimension,Ia.crossLimit(2)])}:"latitude"in e&&"longitude"in e&&(e.latitude.length>0||e.longitude.length>0)?{...e,latitude:l2(e.latitude,[Ia.forceAnalyticType("dimension"),Ia.forceSemanticType("quantitative"),Ia.crossLimit(1)]),longitude:l2(e.longitude,[Ia.forceAnalyticType("dimension"),Ia.forceSemanticType("quantitative"),Ia.crossLimit(1)])}:e}var Sn;(function(e){e[e.setConfig=0]="setConfig",e[e.removeField=1]="removeField",e[e.reorderField=2]="reorderField",e[e.moveField=3]="moveField",e[e.cloneField=4]="cloneField",e[e.createBinlogField=5]="createBinlogField",e[e.appendFilter=6]="appendFilter",e[e.modFilter=7]="modFilter",e[e.writeFilter=8]="writeFilter",e[e.setName=9]="setName",e[e.applySort=10]="applySort",e[e.transpose=11]="transpose",e[e.setLayout=12]="setLayout",e[e.setFieldAggregator=13]="setFieldAggregator",e[e.setGeoData=14]="setGeoData",e[e.setCoordSystem=15]="setCoordSystem",e[e.createDateDrillField=16]="createDateDrillField",e[e.createDateFeatureField=17]="createDateFeatureField",e[e.changeSemanticType=18]="changeSemanticType",e[e.setFilterAggregator=19]="setFilterAggregator"})(Sn||(Sn={}));const k2e={[Sn.setConfig]:(e,t,n)=>pn(e,"config",r=>({...r,[t]:n})),[Sn.removeField]:(e,t,n)=>pn(e,`encodings.${t}`,r=>OD(r,n)),[Sn.reorderField]:(e,t,n,r)=>pn(e,`encodings.${t}`,i=>u2(i.map((o,a,s)=>a===n?s[r]:a===r?s[n]:o))),[Sn.moveField]:(e,t,n,r,i,o)=>{const a=e.encodings[t][n],s=r==="dimensions"?pn(a,"analyticType",()=>"dimension"):r==="measures"?pn(a,"analyticType",()=>"measure"):a;return pn(e,"encodings",l=>u2({...l,[t]:OD(e.encodings[t],n),[r]:g9(e.encodings[r],s,i).slice(0,o??1/0)}))},[Sn.cloneField]:(e,t,n,r,i,o,a)=>{const s={...e.encodings[t][n],dragId:o};return pn(e,"encodings",l=>u2({...l,[r]:g9(e.encodings[r],s,i).slice(0,a??1/0)}))},[Sn.createBinlogField]:(e,t,n,r,i,o)=>{const a=e.encodings[t][n],s=r.startsWith("bin"),l=s?"dimensions":t,u=s?`${r}${o}`:`log${o}`,c={fid:i,dragId:i,name:`${u}(${a.name})`,semanticType:s?"ordinal":"quantitative",analyticType:s?"dimension":a.analyticType,computed:!0,expression:{op:r,as:i,params:[{type:"field",value:a.fid}],num:o}};return s||(c.aggName="sum"),pn(e,`encodings.${l}`,d=>d.concat(c))},[Sn.appendFilter]:(e,t,n,r,i)=>{const o=e.encodings[n][r];return pn(e,"encodings.filters",a=>g9(a,{...o,rule:null,dragId:i},t))},[Sn.modFilter]:(e,t,n,r)=>pn(e,"encodings.filters",i=>{const o=e.encodings[n][r];return xd(i,t,a=>({...o,rule:null,dragId:a.dragId}))}),[Sn.writeFilter]:(e,t,n)=>pn(e,"encodings.filters",r=>xd(r,t,i=>({...i,rule:kD(n)}))),[Sn.setName]:(e,t)=>({...e,name:t}),[Sn.applySort]:(e,t)=>{const{rows:n,columns:r}=e.encodings,i=n.length>0?n[n.length-1]:null,o=r.length>0?r[r.length-1]:null;return o!==null&&o.analyticType==="dimension"&&i!==null&&i.analyticType==="measure"?pn(e,"encodings.columns",a=>xd(a,a.length-1,s=>({...s,sort:t}))):o!==null&&o.analyticType==="measure"&&i!==null&&i.analyticType==="dimension"?pn(e,"encodings.rows",a=>xd(a,a.length-1,s=>({...s,sort:t}))):e},[Sn.transpose]:e=>pn(e,"encodings",t=>u2({...t,columns:t.rows,rows:t.columns})),[Sn.setLayout]:(e,t)=>pn(e,"layout",n=>Object.assign({},n,Object.fromEntries(t))),[Sn.setFieldAggregator]:(e,t,n,r)=>pn(e,`encodings.${t}`,i=>xd(i,n,o=>({...o,aggName:r}))),[Sn.setGeoData]:(e,t,n,r)=>pn(e,"layout",i=>({...i,geojson:t,geoKey:n,geoUrl:r})),[Sn.setCoordSystem]:(e,t)=>pn(e,"config",n=>({...n,coordSystem:t,geoms:[Bt.GEOM_TYPES[t][0]]})),[Sn.createDateDrillField]:(e,t,n,r,i,o,a)=>{const s=e.encodings[t][n],l={fid:i,dragId:i,name:o,semanticType:"temporal",analyticType:s.analyticType,aggName:"sum",computed:!0,timeUnit:r,expression:{op:"dateTimeDrill",as:i,params:[{type:"field",value:s.fid},{type:"value",value:r},...a?[{type:"format",value:a}]:[]]}};return pn(e,`encodings.${t}`,u=>u.concat(l))},[Sn.createDateFeatureField]:(e,t,n,r,i,o,a)=>{const s=e.encodings[t][n],l={fid:i,dragId:i,name:o,semanticType:"ordinal",analyticType:s.analyticType,aggName:"sum",computed:!0,expression:{op:"dateTimeFeature",as:i,params:[{type:"field",value:s.fid},{type:"value",value:r},...a?[{type:"format",value:a}]:[]]}};return pn(e,`encodings.${t}`,u=>u.concat(l))},[Sn.changeSemanticType]:(e,t,n,r)=>pn(e,`encodings.${t}`,i=>xd(i,n,o=>({...o,semanticType:r}))),[Sn.setFilterAggregator]:(e,t,n)=>pn(e,"encodings.filters",r=>xd(r,t,i=>({...i,aggName:n||"sum",enableAgg:!!n,rule:null})))};function T0(e,t){const[n,...r]=t;return k2e[n](e,...r)}const W2e=T0,FD=I2e(T0),L2e=_2e(T0),T2e=G2e(T0),N2e=C2e(T0),mn=Object.fromEntries(Object.keys(Sn).map(e=>[e,(t,...n)=>FD(t,[Sn[e],...n])]));function MD(e){return pn(e,"encodings.filters",t=>t.map(n=>({...n,rule:s2(n.rule)})))}function v9(e){return pn(e,"encodings",t=>{var r;const n=(r=t==null?void 0:t.filters)==null?void 0:r.map(i=>({...i,rule:kD(i.rule)}));return{...t,filters:n}})}function c2(e,t){return{config:WD,encodings:m9,layout:Z2e,visId:e,name:t}}function YD(e,t,n){if(e.length===0)return c2(n||Li(),t);const r=[...v2e(),b2e()],i=r.filter(a=>a.analyticType==="dimension"),o=r.filter(a=>a.analyticType==="measure");return pn(c2(n||Li(),t),"encodings",a=>({...a,dimensions:e.filter(s=>s.analyticType==="dimension").map(s=>({dragId:Li(),fid:s.fid,name:s.name||s.fid,basename:s.basename||s.name||s.fid,semanticType:s.semanticType,analyticType:s.analyticType})).concat(i),measures:e.filter(s=>s.analyticType==="measure").map(s=>({dragId:Li(),fid:s.fid,name:s.name||s.fid,basename:s.basename||s.name||s.fid,analyticType:s.analyticType,semanticType:s.semanticType,aggName:"sum"})).concat(o)}))}function PD(e){var n;const t=c2(e.visId||Li(),e.name||"Chart");return t.config={...t.config,...e.config},t.encodings={...t.encodings,...e.encodings},t.layout={...t.layout,...e.layout,size:{...t.layout.size,...(n=e.layout)==null?void 0:n.size}},t}function zh(e){return VD(PD(e))}function y9(e,t){return VD(YD(e,t))}function RD(e,t=30){const n={base:MD(e.cursor>t?N2e(e,e.cursor-t):e.base),timeline:e.timeline.slice(Math.max(0,e.cursor-t))};return JSON.stringify(n)}function X2e(e){return MD(e.now)}function O2e(e){return zh(v9(e))}function zD(e){const t=JSON.parse(e),n=zh(v9(t.base));return t.timeline.reduce(FD,n)}function V2e(e){const t=JSON.parse(e),n=PD(v9(t.base));return t.timeline.reduce(W2e,n)}function x9(e){var n,r,i,o,a,s,l,u,c,d,f,p,g,b,y,x,w;const t=c2(e.visId,e.name||"Chart");return t.config={...t.config,defaultAggregated:e.config.defaultAggregated,geoms:((n=e.config.geoms)==null?void 0:n.slice())??[],limit:e.config.limit,coordSystem:e.config.coordSystem,folds:e.config.folds},t.encodings={...t.encodings,dimensions:((r=e.encodings.dimensions)==null?void 0:r.slice())??[],measures:((i=e.encodings.measures)==null?void 0:i.slice())??[],rows:((o=e.encodings.rows)==null?void 0:o.slice())??[],columns:((a=e.encodings.columns)==null?void 0:a.slice())??[],color:((s=e.encodings.color)==null?void 0:s.slice())??[],opacity:((l=e.encodings.opacity)==null?void 0:l.slice())??[],size:((u=e.encodings.size)==null?void 0:u.slice())??[],shape:((c=e.encodings.shape)==null?void 0:c.slice())??[],theta:((d=e.encodings.theta)==null?void 0:d.slice())??[],radius:((f=e.encodings.radius)==null?void 0:f.slice())??[],longitude:((p=e.encodings.longitude)==null?void 0:p.slice())??[],latitude:((g=e.encodings.latitude)==null?void 0:g.slice())??[],geoId:((b=e.encodings.geoId)==null?void 0:b.slice())??[],details:((y=e.encodings.details)==null?void 0:y.slice())??[],filters:((x=e.encodings.filters)==null?void 0:x.slice())??[],text:((w=e.encodings.text)==null?void 0:w.slice())??[]},t.layout={...t.layout,background:e.config.background,format:e.config.format,interactiveScale:e.config.interactiveScale,resolve:e.config.resolve,showActions:e.config.showActions,stack:e.config.stack,zeroScale:e.config.zeroScale,size:{...t.layout.size,...e.config.size},colorPalette:e.config.colorPalette,geojson:e.config.geojson,geoKey:e.config.geoKey,geoUrl:e.config.geoUrl,primaryColor:e.config.primaryColor,scale:e.config.scale,scaleIncludeUnmatchedChoropleth:e.config.scaleIncludeUnmatchedChoropleth,showTableSummary:e.config.showTableSummary,useSvg:e.config.useSvg},t}function F2e(e){return e}function M2e(e){if(e==null)return F2e;var t,n,r=e.scale[0],i=e.scale[1],o=e.translate[0],a=e.translate[1];return function(s,l){l||(t=n=0);var u=2,c=s.length,d=new Array(c);for(d[0]=(t+=s[0])*r+o,d[1]=(n+=s[1])*i+a;u<c;)d[u]=s[u],++u;return d}}function Y2e(e,t){for(var n,r=e.length,i=r-t;i<--r;)n=e[i],e[i++]=e[r],e[r]=n}function d2(e,t){return typeof t=="string"&&(t=e.objects[t]),t.type==="GeometryCollection"?{type:"FeatureCollection",features:t.geometries.map(function(n){return AD(e,n)})}:AD(e,t)}function AD(e,t){var n=t.id,r=t.bbox,i=t.properties==null?{}:t.properties,o=DD(e,t);return n==null&&r==null?{type:"Feature",properties:i,geometry:o}:r==null?{type:"Feature",id:n,properties:i,geometry:o}:{type:"Feature",id:n,bbox:r,properties:i,geometry:o}}function DD(e,t){var n=M2e(e.transform),r=e.arcs;function i(c,d){d.length&&d.pop();for(var f=r[c<0?~c:c],p=0,g=f.length;p<g;++p)d.push(n(f[p],p));c<0&&Y2e(d,g)}function o(c){return n(c)}function a(c){for(var d=[],f=0,p=c.length;f<p;++f)i(c[f],d);return d.length<2&&d.push(d[0]),d}function s(c){for(var d=a(c);d.length<4;)d.push(d[0]);return d}function l(c){return c.map(s)}function u(c){var d=c.type,f;switch(d){case"GeometryCollection":return{type:d,geometries:c.geometries.map(u)};case"Point":f=o(c.coordinates);break;case"MultiPoint":f=c.coordinates.map(o);break;case"LineString":f=a(c.arcs);break;case"MultiLineString":f=c.arcs.map(a);break;case"Polygon":f=l(c.arcs);break;case"MultiPolygon":f=c.arcs.map(l);break;default:return null}return{type:d,coordinates:f}}return u(t)}function P2e(e,t){var n={},r={},i={},o=[],a=-1;t.forEach(function(u,c){var d=e.arcs[u<0?~u:u],f;d.length<3&&!d[1][0]&&!d[1][1]&&(f=t[++a],t[a]=u,t[c]=f)}),t.forEach(function(u){var c=s(u),d=c[0],f=c[1],p,g;if(p=i[d])if(delete i[p.end],p.push(u),p.end=f,g=r[f]){delete r[g.start];var b=g===p?p:p.concat(g);r[b.start=p.start]=i[b.end=g.end]=b}else r[p.start]=i[p.end]=p;else if(p=r[f])if(delete r[p.start],p.unshift(u),p.start=d,g=i[d]){delete i[g.end];var y=g===p?p:g.concat(p);r[y.start=g.start]=i[y.end=p.end]=y}else r[p.start]=i[p.end]=p;else p=[u],r[p.start=d]=i[p.end=f]=p});function s(u){var c=e.arcs[u<0?~u:u],d=c[0],f;return e.transform?(f=[0,0],c.forEach(function(p){f[0]+=p[0],f[1]+=p[1]})):f=c[c.length-1],u<0?[f,d]:[d,f]}function l(u,c){for(var d in u){var f=u[d];delete c[f.start],delete f.start,delete f.end,f.forEach(function(p){n[p<0?~p:p]=1}),o.push(f)}}return l(i,r),l(r,i),t.forEach(function(u){n[u<0?~u:u]||o.push([u])}),o}function R2e(e){return DD(e,z2e.apply(this,arguments))}function z2e(e,t,n){var r,i,o;if(arguments.length>1)r=A2e(e,t,n);else for(i=0,r=new Array(o=e.arcs.length);i<o;++i)r[i]=i;return{type:"MultiLineString",arcs:P2e(e,r)}}function A2e(e,t,n){var r=[],i=[],o;function a(d){var f=d<0?~d:d;(i[f]||(i[f]=[])).push({i:d,g:o})}function s(d){d.forEach(a)}function l(d){d.forEach(s)}function u(d){d.forEach(l)}function c(d){switch(o=d,d.type){case"GeometryCollection":d.geometries.forEach(c);break;case"LineString":s(d.arcs);break;case"MultiLineString":case"Polygon":l(d.arcs);break;case"MultiPolygon":u(d.arcs);break}}return c(t),i.forEach(n==null?function(d){r.push(d[0].i)}:function(d){n(d[0].g,d[d.length-1].g)&&r.push(d[0].i)}),r}const jD=(e,t)=>{for(const n of e.params)n.type==="field"?t(n.value):n.type==="expression"&&jD(n.value,t)},D2e=(e,t)=>{const n=new Set(t),r=e.filter(a=>n.has(a.key));let i=r.slice(),o=e.filter(a=>!n.has(a.key));for(;i.length&&o.length;){const a=new Set;for(const l of i)jD(l.expression,u=>a.add(u));i=o.filter(l=>a.has(l.key)),o=o.filter(l=>!a.has(l.key))}return r},Ah=(e,t,n,r,i,o,a=[],s)=>{const l=n.find(T=>T.fid===mr)&&r.find(T=>T.fid===gr),u=n.filter(T=>T.fid!==mr),c=r.filter(T=>T.fid!==gr);if(l){const T=r.find(X=>X.fid===gr).aggName,N=a.map(X=>t.find(O=>O.fid===X)).map(X=>({...X,aggName:T})).filter(Boolean);u.push(...N.filter(X=>(X==null?void 0:X.analyticType)==="dimension")),c.push(...N.filter(X=>(X==null?void 0:X.analyticType)==="measure"))}const d=new Set([...u,...c,...e].map(T=>T.fid));let f=null,p=null,g=null,b=null,y=null,x=null;const w=T=>{const N=h9(T);d.add(N);const X=T.rule;if(X.type==="one of")return{fid:N,rule:{type:"one of",value:[...X.value]}};if(X.type==="temporal range"){const O=[new Date(X.value[0]).getTime(),new Date(X.value[1]).getTime()];return{fid:N,rule:{type:"temporal range",value:O}}}else{if(X.type==="not in")return{fid:N,rule:{type:"not in",value:[...X.value]}};if(X.type==="range"){const O=[Number(X.value[0]),Number(X.value[1])];return{fid:N,rule:{type:"range",value:O}}}else return console.error("unknown rule",X),{fid:N,rule:X}}},Z=e.filter(T=>!T.computed&&T.rule&&!T.enableAgg).map(w);Z.length&&(f={type:"filter",filters:Z});const E=D2e(t.filter(T=>T.computed&&T.expression).map(T=>({key:T.fid,expression:T.expression})),[...d]);E.length&&(p={type:"transform",transform:E});const I=e.filter(T=>T.computed&&T.rule&&!T.enableAgg).map(w);I.length&&(g={type:"filter",filters:I});const k=e.filter(T=>T.enableAgg&&T.aggName&&T.rule),_=c.filter(T=>T.aggName).map(T=>[T.fid,T.aggName]).concat(k.map(T=>[T.fid,T.aggName])),C=i&&(_.length||c.length===0&&u.length>0);return C?b={type:"view",query:[{op:"aggregate",groupBy:u.map(T=>T.fid),measures:c.concat(k).map(T=>({field:T.fid,agg:T.aggName,asFieldKey:or(T.fid,T.aggName)}))}]}:b={type:"view",query:[{op:"raw",fields:[...new Set([...u,...c])].map(T=>T.fid)}]},C&&u.length>0&&k.length>0&&(x={type:"filter",filters:k.map(w)}),o!=="none"&&s&&(y={type:"sort",by:c.map(T=>C?or(T.fid,T.aggName):T.fid),sort:o}),[f,p,g,b,x,y].filter(Boolean)},j2e=(e,t)=>{if(t.length===0)return e;const n=e.workflow.findIndex(i=>i.type==="transform");return n>-1?{...e,workflow:e.workflow.map((i,o)=>{if(i.type==="transform"&&o===n){const a=new Set(i.transform.map(s=>s.key));return{type:"transform",transform:i.transform.concat(t.filter(s=>!a.has(s.key)))}}return i})}:{...e,workflow:[{type:"transform",transform:t},...e.workflow]}},w9=(e,t)=>{if(t.length===0)return e;const n=e.workflow.findIndex(i=>i.type==="filter");return n>-1?{...e,workflow:e.workflow.map((i,o)=>i.type==="filter"&&o===n?{type:"filter",filters:t.concat(i.filters)}:i)}:{...e,workflow:[{type:"filter",filters:t},...e.workflow]}},H2e=Object.keys(m9).filter(e=>!Bt.META_FIELD_KEYS.includes(e)),HD=e=>{switch(e){case"choropleth":return["geoId","color","opacity","text","details"];case"poi":return["longitude","latitude","color","opacity","size","details"];case"arc":return["radius","theta","color","opacity","size","details","text"];case"bar":case"tick":case"line":case"area":case"boxplot":return["columns","rows","color","opacity","size","details","text"];case"text":return["columns","rows","color","opacity","size","text"];case"table":return["columns","rows"];default:return["columns","rows","color","opacity","size","details","shape"]}};class N0{constructor(t,n){Ct(this,"visList");Ct(this,"visIndex",0);Ct(this,"createdVis",0);Ct(this,"editingFilterIdx",null);Ct(this,"meta");Ct(this,"segmentKey",$e.ISegmentKey.vis);Ct(this,"showInsightBoard",!1);Ct(this,"showDataBoard",!1);Ct(this,"vizEmbededMenu",{show:!1,position:[0,0]});Ct(this,"showDataConfig",!1);Ct(this,"showCodeExportPanel",!1);Ct(this,"showVisualConfigPanel",!1);Ct(this,"showGeoJSONConfigPanel",!1);Ct(this,"removeConfirmIdx",null);Ct(this,"filters",{});Ct(this,"tableCollapsedHeaderMap",new Map);Ct(this,"selectedMarkObject",{});Ct(this,"showLogSettingPanel",!1);Ct(this,"showBinSettingPanel",!1);Ct(this,"createField");Ct(this,"localGeoJSON");Ct(this,"showErrorResolutionPanel",0);Ct(this,"lastErrorMessage","");Ct(this,"onMetaChange");this.meta=t,this.visList=n!=null&&n.empty?[]:[y9(t,"Chart 1")],this.createdVis=this.visList.length,this.onMetaChange=n==null?void 0:n.onMetaChange,BG(this,{visList:zn.shallow,allEncodings:Wh.struct,filters:zn.ref,tableCollapsedHeaderMap:zn.ref})}get visLength(){return this.visList.length}get vizList(){return this.visList.map(t=>t.now)}get currentVis(){return this.visList[this.visIndex].now}get currentEncodings(){return this.currentVis.encodings}get viewFilters(){return this.currentEncodings.filters}get dimensions(){return this.currentEncodings.dimensions}get measures(){return this.currentEncodings.measures}get rows(){return this.currentEncodings.rows}get columns(){return this.currentEncodings.columns}get sort(){return p9({columns:this.columns,rows:this.rows})}get sortedEncoding(){return GD({columns:this.columns,rows:this.rows})}get allFields(){return[...this.dimensions,...this.measures]}get config(){return this.currentVis.config}get layout(){return{...this.currentVis.layout,...this.localGeoJSON?{geoJson:this.localGeoJSON}:{}}}get allEncodings(){const t={};return H2e.forEach(n=>{t[n]=this.currentEncodings[n]}),t}get viewEncodings(){const t={};return HD(this.config.geoms[0]).forEach(n=>{t[n]=this.currentEncodings[n]}),t}get viewEncodingFields(){return HD(this.config.geoms[0]).flatMap(t=>this.viewEncodings[t])}get viewDimensions(){return this.viewEncodingFields.filter(t=>t.analyticType==="dimension")}get viewMeasures(){return this.viewEncodingFields.filter(t=>t.analyticType==="measure")}get workflow(){return Ah(this.viewFilters,this.allFields,this.viewDimensions,this.viewMeasures,this.config.defaultAggregated,this.sort,this.config.folds,this.config.limit)}get limit(){return this.config.limit}get canUndo(){return this.visList[this.visIndex].cursor>0}get canRedo(){const t=this.visList[this.visIndex];return t.cursor!==t.timeline.length}appendFilter(t,n,r){const i=this.currentEncodings[n][r];i.fid===mr||i.fid===gr||i.fid===Ar||(this.visList[this.visIndex]=mn.appendFilter(this.visList[this.visIndex],t,n,r,Li()),this.editingFilterIdx=t)}undo(){this.visList[this.visIndex]=L2e(this.visList[this.visIndex])}redo(){this.visList[this.visIndex]=T2e(this.visList[this.visIndex])}setVisName(t,n){this.visList[t]=mn.setName(this.visList[t],n)}setMeta(t){this.meta=t}resetVisualization(t="Chart 1"){this.visList=[y9(this.meta,t)],this.createdVis=1}addVisualization(t){const n=t?typeof t=="function"?t(this.createdVis+1):t:"Chart "+(this.createdVis+1);this.visList.push(y9(this.meta,n)),this.createdVis+=1,this.visIndex=this.visList.length-1}removeVisualization(t){this.visLength!==1&&(this.visIndex>=t&&this.visIndex>0&&(this.visIndex-=1),this.visList.splice(t,1))}duplicateVisualization(t){this.visList.push(zh({...this.visList[t].now,name:this.visList[t].now.name+" Copy",visId:Li()})),this.createdVis+=1,this.visIndex=this.visList.length-1}setFilterEditing(t){this.editingFilterIdx=t}closeFilterEditing(){this.editingFilterIdx=null}setSegmentKey(t){this.segmentKey=t}setVisualConfig(...t){this.visList[this.visIndex]=mn.setConfig(this.visList[this.visIndex],...t)}setCoordSystem(t){this.visList[this.visIndex]=mn.setCoordSystem(this.visList[this.visIndex],t)}setVisualLayout(...t){typeof t[0]=="string"?this.visList[this.visIndex]=mn.setLayout(this.visList[this.visIndex],[t]):this.visList[this.visIndex]=mn.setLayout(this.visList[this.visIndex],t)}reorderField(t,n,r){Bt.META_FIELD_KEYS.includes(t)||n!==r&&(this.visList[this.visIndex]=mn.reorderField(this.visList[this.visIndex],t,n,r))}moveField(t,n,r,i){if(t==="filters")return this.removeField(t,n);if(r==="filters")return this.appendFilter(i,t,n);const o=this.currentEncodings[t][n],a=Bt.META_FIELD_KEYS.includes(t),s=Bt.META_FIELD_KEYS.includes(r);if(s&&(o.fid===mr||o.fid===gr||o.fid===Ar))return;const l=Bt.CHANNEL_LIMIT[r]??1/0;s===a?this.visList[this.visIndex]=mn.moveField(this.visList[this.visIndex],t,n,r,i,l):s?this.visList[this.visIndex]=mn.removeField(this.visList[this.visIndex],t,n):this.visList[this.visIndex]=mn.cloneField(this.visList[this.visIndex],t,n,r,i,Li(),l)}modFilter(t,n,r){this.visList[this.visIndex]=mn.modFilter(this.visList[this.visIndex],t,n,r)}removeField(t,n){Bt.META_FIELD_KEYS.includes(t)||(this.visList[this.visIndex]=mn.removeField(this.visList[this.visIndex],t,n))}writeFilter(t,n){this.visList[this.visIndex]=mn.writeFilter(this.visList[this.visIndex],t,s2(n))}transpose(){this.visList[this.visIndex]=mn.transpose(this.visList[this.visIndex])}createBinField(t,n,r,i=10){const o=Li(),a=this.currentEncodings,s=a.dimensions.find(l=>l.computed&&l.expression&&l.expression.op===r&&l.expression.params[0].value===a[t][n].fid&&l.expression.num===i);return s?s.fid:(this.visList[this.visIndex]=mn.createBinlogField(this.visList[this.visIndex],t,n,r,o,i),o)}createLogField(t,n,r,i=10){this.visList[this.visIndex]=mn.createBinlogField(this.visList[this.visIndex],t,n,r,Li(),i)}createDateTimeDrilledField(t,n,r,i,o){this.visList[this.visIndex]=mn.createDateDrillField(this.visList[this.visIndex],t,n,r,Li(),i,o)}createDateFeatureField(t,n,r,i,o){this.visList[this.visIndex]=mn.createDateFeatureField(this.visList[this.visIndex],t,n,r,Li(),i,o)}setFieldAggregator(t,n,r){this.visList[this.visIndex]=mn.setFieldAggregator(this.visList[this.visIndex],t,n,r)}setFilterAggregator(t,n){this.visList[this.visIndex]=mn.setFilterAggregator(this.visList[this.visIndex],t,n)}applyDefaultSort(t="ascending"){this.visList[this.visIndex]=mn.applySort(this.visList[this.visIndex],t)}exportCurrentChart(){return RD(this.visList[this.visIndex])}exportAllCharts(){return this.visList.map(t=>RD(t))}exportCode(){return this.visList.map(t=>X2e(t))}importCode(t){this.visList=t.map(n=>"layout"in n?O2e(n):zh(x9(LD(TD(n))))),this.createdVis=this.visList.length,this.visIndex=0}appendRaw(t){const n=zD(t);this.visList.push(n),this.createdVis+=1,this.visIndex=this.visList.length-1}importRaw(t){this.visList=t.map(zD),this.createdVis=this.visList.length,this.visIndex=0}appendFromOld(t){const n=zh(x9(LD(TD(t))));this.visList.push(n),this.createdVis+=1,this.visIndex=this.visList.length-1}replaceNow(t){this.visList[this.visIndex]=zh(t)}selectVisualization(t){this.visIndex=t}setShowDataConfig(t){this.showDataConfig=t}setShowInsightBoard(t){this.showInsightBoard=t}setShowDataBoard(t){this.showDataBoard=t}showEmbededMenu(t){this.vizEmbededMenu.show=!0,this.vizEmbededMenu.position=t}setShowCodeExportPanel(t){this.showCodeExportPanel=t}setShowVisualConfigPanel(t){this.showVisualConfigPanel=t}closeEmbededMenu(){this.vizEmbededMenu.show=!1}setFilters(t){this.filters=t}updateCurrentDatasetMetas(t,n){var i;const r=this.meta.find(o=>o.fid===t);if(r)for(let o in n)r[o]=n[o];(i=this.onMetaChange)==null||i.call(this,t,n)}openRemoveConfirmModal(t){this.removeConfirmIdx=t}closeRemoveConfirmModal(){this.removeConfirmIdx=null}setGeographicData(t,n,r){const i=t.type==="GeoJSON"?t.data:d2(t.data,t.objectKey||Object.keys(t.data.objects)[0]);if(!("features"in i)){console.error("Invalid GeoJSON: GeoJSON must be a FeatureCollection, but got",i);return}this.localGeoJSON=i,r?this.visList[this.visIndex]=mn.setGeoData(this.visList[this.visIndex],void 0,n,r):this.visList[this.visIndex]=mn.setGeoData(this.visList[this.visIndex],i,n,void 0)}clearGeographicData(){this.visList[this.visIndex]=mn.setGeoData(this.visList[this.visIndex],void 0,void 0,void 0)}changeSemanticType(t,n,r){this.visList[this.visIndex]=mn.changeSemanticType(this.visList[this.visIndex],t,n,r)}updateGeoKey(t){this.setVisualLayout("geoKey",t)}updateTableCollapsedHeader(t){const{uniqueKey:n,height:r}=t;if(r<1)return;const i=new Map(this.tableCollapsedHeaderMap);i.forEach((o,a)=>{a.startsWith(n)&&a.length>n.length&&i.delete(a)}),i.has(n)?i.delete(n):i.set(n,t.path),this.tableCollapsedHeaderMap=i}resetTableCollapsedHeader(){const t=new Map;this.tableCollapsedHeaderMap=t}setShowGeoJSONConfigPanel(t){this.showGeoJSONConfigPanel=t}setShowBinSettingPanel(t){this.showBinSettingPanel=t}setShowLogSettingPanel(t){this.showLogSettingPanel=t}setCreateField(t){this.createField=t}updateSelectedMarkObject(t){this.selectedMarkObject=t}updateShowErrorResolutionPanel(t,n=""){this.showErrorResolutionPanel=t,this.lastErrorMessage=n}}function B2e(e,t,n,r){var a,s,l;const i=YD(t,n,r),o=i.encodings.dimensions.concat(i.encodings.measures);if(i.config.defaultAggregated=Boolean(e.aggregate),(((a=e.geomType)==null?void 0:a.length)??0)>0&&(i.config.geoms=((s=e.geomType)==null?void 0:s.map(u=>J2e(u)))??["tick"]),(((l=e.facets)==null?void 0:l.length)??0)>0){const u=(e.facets||[]).concat(e.highFacets||[]);for(let c of u){const d=o.find(f=>f.fid===c);d&&i.encodings.rows.push(d)}}if(e.position){const[u,c]=e.position;if(u){const d=o.find(f=>f.fid===u);d&&i.encodings.columns.push(d)}if(c){const d=o.find(f=>f.fid===c);d&&i.encodings.rows.push(d)}}if(e.color&&e.color.length>0){const u=e.color[0],c=o.find(d=>d.fid===u);c&&i.encodings.color.push(c)}if(e.size&&e.size.length>0){const u=e.size[0],c=o.find(d=>d.fid===u);c&&i.encodings.size.push(c)}if(e.opacity&&e.opacity.length>0){const u=e.opacity[0],c=o.find(d=>d.fid===u);c&&i.encodings.opacity.push(c)}return i}function J2e(e){switch(e){case"interval":case"bar":return"bar";case"line":return"line";case"boxplot":return"boxplot";case"area":return"area";case"point":return"point";case"arc":return"arc";case"circle":return"circle";case"heatmap":return"circle";case"rect":return"rect";case"tick":default:return"tick"}}const BD="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IGw9KHMsbik9PnMuZmlsdGVyKHI9Pntmb3IoY29uc3R7cnVsZTplLGZpZDp0fW9mIG4paWYoZSlzd2l0Y2goZS50eXBlKXtjYXNlIm9uZSBvZiI6e2lmKGUudmFsdWUuaGFzKHJbdF0pKWJyZWFrO3JldHVybiExfWNhc2Uibm90IGluIjppZighZS52YWx1ZS5oYXMoclt0XSkpYnJlYWs7Y2FzZSJyYW5nZSI6e2lmKGUudmFsdWVbMF08PXJbdF0mJnJbdF08PWUudmFsdWVbMV0pYnJlYWs7cmV0dXJuITF9Y2FzZSJ0ZW1wb3JhbCByYW5nZSI6dHJ5e2NvbnN0IGE9bmV3IERhdGUoclt0XSkuZ2V0VGltZSgpO2lmKGUudmFsdWVbMF08PWEmJmE8PWUudmFsdWVbMV0pYnJlYWs7cmV0dXJuITF9Y2F0Y2goYSl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoYSksITF9ZGVmYXVsdDp7Y29uc29sZS53YXJuKCJVbnJlc29sdmFibGUgZmlsdGVyIHJ1bGUiLGUpO2NvbnRpbnVlfX1yZXR1cm4hMH0pLG89cz0+e2NvbnN0e2RhdGFTb3VyY2U6bixmaWx0ZXJzOnJ9PXMuZGF0YSxlPWwobixyKTtzZWxmLnBvc3RNZXNzYWdlKGUpfTtzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8sITEpfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsdGVyLndvcmtlci05OTY4ZTdhOS5qcy5tYXAK",JD=typeof window<"u"&&window.Blob&&new Blob([atob(BD)],{type:"text/javascript;charset=utf-8"});function U2e(){const e=JD&&(window.URL||window.webkitURL).createObjectURL(JD);try{return e?new Worker(e):new Worker("data:application/javascript;base64,"+BD)}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const UD="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIFAoaSl7cmV0dXJuIFA9dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09InN5bWJvbCI/ZnVuY3Rpb24ocil7cmV0dXJuIHR5cGVvZiByfTpmdW5jdGlvbihyKXtyZXR1cm4gciYmdHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmciE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHJ9LFAoaSl9ZnVuY3Rpb24gayhpLHIpe2lmKCEoaSBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIEtlKGkscil7aWYoUChpKSE9PSJvYmplY3QifHxpPT09bnVsbClyZXR1cm4gaTt2YXIgdD1pW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodCE9PXZvaWQgMCl7dmFyIG49dC5jYWxsKGkscnx8ImRlZmF1bHQiKTtpZihQKG4pIT09Im9iamVjdCIpcmV0dXJuIG47dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4ocj09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKGkpfWZ1bmN0aW9uIGRlKGkpe3ZhciByPUtlKGksInN0cmluZyIpO3JldHVybiBQKHIpPT09InN5bWJvbCI/cjpTdHJpbmcocil9ZnVuY3Rpb24gaGUoaSxyKXtmb3IodmFyIHQ9MDt0PHIubGVuZ3RoO3QrKyl7dmFyIG49clt0XTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLGRlKG4ua2V5KSxuKX19ZnVuY3Rpb24gUihpLHIsdCl7cmV0dXJuIHImJmhlKGkucHJvdG90eXBlLHIpLHQmJmhlKGksdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksaX1mdW5jdGlvbiBFKGkpe2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gaX1mdW5jdGlvbiBvZShpLHIpe3JldHVybiBvZT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihuLGUpe3JldHVybiBuLl9fcHJvdG9fXz1lLG59LG9lKGkscil9ZnVuY3Rpb24gcShpLHIpe2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iJiZyIT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2kucHJvdG90eXBlPU9iamVjdC5jcmVhdGUociYmci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTppLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxyJiZvZShpLHIpfWZ1bmN0aW9uIEIoaSxyKXtpZihyJiYoUChyKT09PSJvYmplY3QifHx0eXBlb2Ygcj09ImZ1bmN0aW9uIikpcmV0dXJuIHI7aWYociE9PXZvaWQgMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpO3JldHVybiBFKGkpfWZ1bmN0aW9uIGooaSl7cmV0dXJuIGo9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9LGooaSl9ZnVuY3Rpb24gRihpLHIsdCl7cmV0dXJuIHI9ZGUociksciBpbiBpP09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHIse3ZhbHVlOnQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTppW3JdPXQsaX1mdW5jdGlvbiBZZShpKXtpZihBcnJheS5pc0FycmF5KGkpKXJldHVybiBpfWZ1bmN0aW9uIEplKGkpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZpW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGlbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShpKX1mdW5jdGlvbiB2ZShpLHIpeyhyPT1udWxsfHxyPmkubGVuZ3RoKSYmKHI9aS5sZW5ndGgpO2Zvcih2YXIgdD0wLG49bmV3IEFycmF5KHIpO3Q8cjt0Kyspblt0XT1pW3RdO3JldHVybiBufWZ1bmN0aW9uIHplKGkscil7aWYoaSl7aWYodHlwZW9mIGk9PSJzdHJpbmciKXJldHVybiB2ZShpLHIpO3ZhciB0PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpKS5zbGljZSg4LC0xKTtpZih0PT09Ik9iamVjdCImJmkuY29uc3RydWN0b3ImJih0PWkuY29uc3RydWN0b3IubmFtZSksdD09PSJNYXAifHx0PT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20oaSk7aWYodD09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSlyZXR1cm4gdmUoaSxyKX19ZnVuY3Rpb24gV2UoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gUWUoaSl7cmV0dXJuIFllKGkpfHxKZShpKXx8emUoaSl8fFdlKCl9ZnVuY3Rpb24gbWUoaSxyKXt2YXIgdD1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3ImJihuPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSx0LnB1c2guYXBwbHkodCxuKX1yZXR1cm4gdH1mdW5jdGlvbiB5ZShpKXtmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgdD1hcmd1bWVudHNbcl0hPW51bGw/YXJndW1lbnRzW3JdOnt9O3IlMj9tZShPYmplY3QodCksITApLmZvckVhY2goZnVuY3Rpb24obil7RihpLG4sdFtuXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKTptZShPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24obil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGksbixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbikpfSl9cmV0dXJuIGl9dmFyIEdlPXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbihyKXt0aGlzLm91dHB1dCgibG9nIixyKX0sd2FybjpmdW5jdGlvbihyKXt0aGlzLm91dHB1dCgid2FybiIscil9LGVycm9yOmZ1bmN0aW9uKHIpe3RoaXMub3V0cHV0KCJlcnJvciIscil9LG91dHB1dDpmdW5jdGlvbihyLHQpe2NvbnNvbGUmJmNvbnNvbGVbcl0mJmNvbnNvbGVbcl0uYXBwbHkoY29uc29sZSx0KX19LHFlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaShyKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e307ayh0aGlzLGkpLHRoaXMuaW5pdChyLHQpfXJldHVybiBSKGksW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1uLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj10fHxHZSx0aGlzLm9wdGlvbnM9bix0aGlzLmRlYnVnPW4uZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQpLGU9MDtlPHQ7ZSsrKW5bZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQobiwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQpLGU9MDtlPHQ7ZSsrKW5bZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQobiwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodCksZT0wO2U8dDtlKyspbltlXT1hcmd1bWVudHNbZV07cmV0dXJuIHRoaXMuZm9yd2FyZChuLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQpLGU9MDtlPHQ7ZSsrKW5bZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQobiwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LG4sZSxhKXtyZXR1cm4gYSYmIXRoaXMuZGVidWc/bnVsbDoodHlwZW9mIHRbMF09PSJzdHJpbmciJiYodFswXT0iIi5jb25jYXQoZSkuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltuXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaSh0aGlzLmxvZ2dlcix5ZSh5ZSh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdCh0LCI6Iil9KSx0aGlzLm9wdGlvbnMpKX19LHtrZXk6ImNsb25lIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD10fHx0aGlzLm9wdGlvbnMsdC5wcmVmaXg9dC5wcmVmaXh8fHRoaXMucHJlZml4LG5ldyBpKHRoaXMubG9nZ2VyLHQpfX1dKSxpfSgpLE49bmV3IHFlLF89ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7ayh0aGlzLGkpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBSKGksW3trZXk6Im9uIix2YWx1ZTpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXM7cmV0dXJuIHQuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Uub2JzZXJ2ZXJzW2FdPWUub2JzZXJ2ZXJzW2FdfHxbXSxlLm9ic2VydmVyc1thXS5wdXNoKG4pfSksdGhpc319LHtrZXk6Im9mZiIsdmFsdWU6ZnVuY3Rpb24odCxuKXtpZih0aGlzLm9ic2VydmVyc1t0XSl7aWYoIW4pe2RlbGV0ZSB0aGlzLm9ic2VydmVyc1t0XTtyZXR1cm59dGhpcy5vYnNlcnZlcnNbdF09dGhpcy5vYnNlcnZlcnNbdF0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09bn0pfX19LHtrZXk6ImVtaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KG4+MT9uLTE6MCksYT0xO2E8bjthKyspZVthLTFdPWFyZ3VtZW50c1thXTtpZih0aGlzLm9ic2VydmVyc1t0XSl7dmFyIG89W10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzW3RdKTtvLmZvckVhY2goZnVuY3Rpb24ocyl7cy5hcHBseSh2b2lkIDAsZSl9KX1pZih0aGlzLm9ic2VydmVyc1siKiJdKXt2YXIgdT1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbIioiXSk7dS5mb3JFYWNoKGZ1bmN0aW9uKHMpe3MuYXBwbHkocyxbdF0uY29uY2F0KGUpKX0pfX19XSksaX0oKTtmdW5jdGlvbiBLKCl7dmFyIGkscix0PW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4sZSl7aT1uLHI9ZX0pO3JldHVybiB0LnJlc29sdmU9aSx0LnJlamVjdD1yLHR9ZnVuY3Rpb24gYmUoaSl7cmV0dXJuIGk9PW51bGw/IiI6IiIraX1mdW5jdGlvbiBYZShpLHIsdCl7aS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3Jbbl0mJih0W25dPXJbbl0pfSl9ZnVuY3Rpb24gc2UoaSxyLHQpe2Z1bmN0aW9uIG4odSl7cmV0dXJuIHUmJnUuaW5kZXhPZigiIyMjIik+LTE/dS5yZXBsYWNlKC8jIyMvZywiLiIpOnV9ZnVuY3Rpb24gZSgpe3JldHVybiFpfHx0eXBlb2YgaT09InN0cmluZyJ9Zm9yKHZhciBhPXR5cGVvZiByIT0ic3RyaW5nIj9bXS5jb25jYXQocik6ci5zcGxpdCgiLiIpO2EubGVuZ3RoPjE7KXtpZihlKCkpcmV0dXJue307dmFyIG89bihhLnNoaWZ0KCkpOyFpW29dJiZ0JiYoaVtvXT1uZXcgdCksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksbyk/aT1pW29dOmk9e319cmV0dXJuIGUoKT97fTp7b2JqOmksazpuKGEuc2hpZnQoKSl9fWZ1bmN0aW9uIE9lKGkscix0KXt2YXIgbj1zZShpLHIsT2JqZWN0KSxlPW4ub2JqLGE9bi5rO2VbYV09dH1mdW5jdGlvbiBaZShpLHIsdCxuKXt2YXIgZT1zZShpLHIsT2JqZWN0KSxhPWUub2JqLG89ZS5rO2Fbb109YVtvXXx8W10sbiYmKGFbb109YVtvXS5jb25jYXQodCkpLG58fGFbb10ucHVzaCh0KX1mdW5jdGlvbiBYKGkscil7dmFyIHQ9c2UoaSxyKSxuPXQub2JqLGU9dC5rO2lmKG4pcmV0dXJuIG5bZV19ZnVuY3Rpb24gd2UoaSxyLHQpe3ZhciBuPVgoaSx0KTtyZXR1cm4gbiE9PXZvaWQgMD9uOlgocix0KX1mdW5jdGlvbiBTZShpLHIsdCl7Zm9yKHZhciBuIGluIHIpbiE9PSJfX3Byb3RvX18iJiZuIT09ImNvbnN0cnVjdG9yIiYmKG4gaW4gaT90eXBlb2YgaVtuXT09InN0cmluZyJ8fGlbbl1pbnN0YW5jZW9mIFN0cmluZ3x8dHlwZW9mIHJbbl09PSJzdHJpbmcifHxyW25daW5zdGFuY2VvZiBTdHJpbmc/dCYmKGlbbl09cltuXSk6U2UoaVtuXSxyW25dLHQpOmlbbl09cltuXSk7cmV0dXJuIGl9ZnVuY3Rpb24gQShpKXtyZXR1cm4gaS5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csIlxcJCYiKX12YXIgZXQ9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiB0dChpKXtyZXR1cm4gdHlwZW9mIGk9PSJzdHJpbmciP2kucmVwbGFjZSgvWyY8PiInXC9dL2csZnVuY3Rpb24ocil7cmV0dXJuIGV0W3JdfSk6aX12YXIgWj10eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93Lm5hdmlnYXRvciYmdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50RGF0YT4idSImJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+LTEsbnQ9WyIgIiwiLCIsIj8iLCIhIiwiOyJdO2Z1bmN0aW9uIHJ0KGkscix0KXtyPXJ8fCIiLHQ9dHx8IiI7dmFyIG49bnQuZmlsdGVyKGZ1bmN0aW9uKHUpe3JldHVybiByLmluZGV4T2YodSk8MCYmdC5pbmRleE9mKHUpPDB9KTtpZihuLmxlbmd0aD09PTApcmV0dXJuITA7dmFyIGU9bmV3IFJlZ0V4cCgiKCIuY29uY2F0KG4ubWFwKGZ1bmN0aW9uKHUpe3JldHVybiB1PT09Ij8iPyJcXD8iOnV9KS5qb2luKCJ8IiksIikiKSksYT0hZS50ZXN0KGkpO2lmKCFhKXt2YXIgbz1pLmluZGV4T2YodCk7bz4wJiYhZS50ZXN0KGkuc3Vic3RyaW5nKDAsbykpJiYoYT0hMCl9cmV0dXJuIGF9ZnVuY3Rpb24geGUoaSxyKXt2YXIgdD1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3ImJihuPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSx0LnB1c2guYXBwbHkodCxuKX1yZXR1cm4gdH1mdW5jdGlvbiBlZShpKXtmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgdD1hcmd1bWVudHNbcl0hPW51bGw/YXJndW1lbnRzW3JdOnt9O3IlMj94ZShPYmplY3QodCksITApLmZvckVhY2goZnVuY3Rpb24obil7RihpLG4sdFtuXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKTp4ZShPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24obil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGksbixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbikpfSl9cmV0dXJuIGl9ZnVuY3Rpb24gYXQoaSl7dmFyIHI9aXQoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1qKGkpLGU7aWYocil7dmFyIGE9aih0aGlzKS5jb25zdHJ1Y3RvcjtlPVJlZmxlY3QuY29uc3RydWN0KG4sYXJndW1lbnRzLGEpfWVsc2UgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gQih0aGlzLGUpfX1mdW5jdGlvbiBpdCgpe2lmKHR5cGVvZiBSZWZsZWN0PiJ1Inx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKHR5cGVvZiBQcm94eT09ImZ1bmN0aW9uIilyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBQZShpLHIpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXToiLiI7aWYoaSl7aWYoaVtyXSlyZXR1cm4gaVtyXTtmb3IodmFyIG49ci5zcGxpdCh0KSxlPWksYT0wO2E8bi5sZW5ndGg7KythKXtpZighZXx8dHlwZW9mIGVbblthXV09PSJzdHJpbmciJiZhKzE8bi5sZW5ndGgpcmV0dXJuO2lmKGVbblthXV09PT12b2lkIDApe2Zvcih2YXIgbz0yLHU9bi5zbGljZShhLGErbykuam9pbih0KSxzPWVbdV07cz09PXZvaWQgMCYmbi5sZW5ndGg+YStvOylvKyssdT1uLnNsaWNlKGEsYStvKS5qb2luKHQpLHM9ZVt1XTtpZihzPT09dm9pZCAwKXJldHVybjtpZihzPT09bnVsbClyZXR1cm4gbnVsbDtpZihyLmVuZHNXaXRoKHUpKXtpZih0eXBlb2Ygcz09InN0cmluZyIpcmV0dXJuIHM7aWYodSYmdHlwZW9mIHNbdV09PSJzdHJpbmciKXJldHVybiBzW3VdfXZhciBsPW4uc2xpY2UoYStvKS5qb2luKHQpO3JldHVybiBsP1BlKHMsbCx0KTp2b2lkIDB9ZT1lW25bYV1dfXJldHVybiBlfX12YXIgb3Q9ZnVuY3Rpb24oaSl7cSh0LGkpO3ZhciByPWF0KHQpO2Z1bmN0aW9uIHQobil7dmFyIGUsYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e25zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6InRyYW5zbGF0aW9uIn07cmV0dXJuIGsodGhpcyx0KSxlPXIuY2FsbCh0aGlzKSxaJiZfLmNhbGwoRShlKSksZS5kYXRhPW58fHt9LGUub3B0aW9ucz1hLGUub3B0aW9ucy5rZXlTZXBhcmF0b3I9PT12b2lkIDAmJihlLm9wdGlvbnMua2V5U2VwYXJhdG9yPSIuIiksZS5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmU9PT12b2lkIDAmJihlLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZT0hMCksZX1yZXR1cm4gUih0LFt7a2V5OiJhZGROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLm9wdGlvbnMubnMuaW5kZXhPZihlKTwwJiZ0aGlzLm9wdGlvbnMubnMucHVzaChlKX19LHtrZXk6InJlbW92ZU5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPXRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGUpO2E+LTEmJnRoaXMub3B0aW9ucy5ucy5zcGxpY2UoYSwxKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOnt9LHM9dS5rZXlTZXBhcmF0b3IhPT12b2lkIDA/dS5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixsPXUuaWdub3JlSlNPTlN0cnVjdHVyZSE9PXZvaWQgMD91Lmlnbm9yZUpTT05TdHJ1Y3R1cmU6dGhpcy5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmUsZj1bZSxhXTtvJiZ0eXBlb2YgbyE9InN0cmluZyImJihmPWYuY29uY2F0KG8pKSxvJiZ0eXBlb2Ygbz09InN0cmluZyImJihmPWYuY29uY2F0KHM/by5zcGxpdChzKTpvKSksZS5pbmRleE9mKCIuIik+LTEmJihmPWUuc3BsaXQoIi4iKSk7dmFyIGM9WCh0aGlzLmRhdGEsZik7cmV0dXJuIGN8fCFsfHx0eXBlb2YgbyE9InN0cmluZyI/YzpQZSh0aGlzLmRhdGEmJnRoaXMuZGF0YVtlXSYmdGhpcy5kYXRhW2VdW2FdLG8scyl9fSx7a2V5OiJhZGRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8sdSl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOntzaWxlbnQ6ITF9LGw9dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjtsPT09dm9pZCAwJiYobD0iLiIpO3ZhciBmPVtlLGFdO28mJihmPWYuY29uY2F0KGw/by5zcGxpdChsKTpvKSksZS5pbmRleE9mKCIuIik+LTEmJihmPWUuc3BsaXQoIi4iKSx1PWEsYT1mWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoYSksT2UodGhpcy5kYXRhLGYsdSkscy5zaWxlbnR8fHRoaXMuZW1pdCgiYWRkZWQiLGUsYSxvLHUpfX0se2tleToiYWRkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOntzaWxlbnQ6ITF9O2Zvcih2YXIgcyBpbiBvKSh0eXBlb2Ygb1tzXT09InN0cmluZyJ8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkob1tzXSk9PT0iW29iamVjdCBBcnJheV0iKSYmdGhpcy5hZGRSZXNvdXJjZShlLGEscyxvW3NdLHtzaWxlbnQ6ITB9KTt1LnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsZSxhLG8pfX0se2tleToiYWRkUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvLHUscyl7dmFyIGw9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOntzaWxlbnQ6ITF9LGY9W2UsYV07ZS5pbmRleE9mKCIuIik+LTEmJihmPWUuc3BsaXQoIi4iKSx1PW8sbz1hLGE9ZlsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGEpO3ZhciBjPVgodGhpcy5kYXRhLGYpfHx7fTt1P1NlKGMsbyxzKTpjPWVlKGVlKHt9LGMpLG8pLE9lKHRoaXMuZGF0YSxmLGMpLGwuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIixlLGEsbyl9fSx7a2V5OiJyZW1vdmVSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXt0aGlzLmhhc1Jlc291cmNlQnVuZGxlKGUsYSkmJmRlbGV0ZSB0aGlzLmRhdGFbZV1bYV0sdGhpcy5yZW1vdmVOYW1lc3BhY2VzKGEpLHRoaXMuZW1pdCgicmVtb3ZlZCIsZSxhKX19LHtrZXk6Imhhc1Jlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbihlLGEpe3JldHVybiB0aGlzLmdldFJlc291cmNlKGUsYSkhPT12b2lkIDB9fSx7a2V5OiJnZXRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXtyZXR1cm4gYXx8KGE9dGhpcy5vcHRpb25zLmRlZmF1bHROUyksdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk9PT0idjEiP2VlKGVlKHt9LHt9KSx0aGlzLmdldFJlc291cmNlKGUsYSkpOnRoaXMuZ2V0UmVzb3VyY2UoZSxhKX19LHtrZXk6ImdldERhdGFCeUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kYXRhW2VdfX0se2tleToiaGFzTGFuZ3VhZ2VTb21lVHJhbnNsYXRpb25zIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT10aGlzLmdldERhdGFCeUxhbmd1YWdlKGUpLG89YSYmT2JqZWN0LmtleXMoYSl8fFtdO3JldHVybiEhby5maW5kKGZ1bmN0aW9uKHUpe3JldHVybiBhW3VdJiZPYmplY3Qua2V5cyhhW3VdKS5sZW5ndGg+MH0pfX0se2tleToidG9KU09OIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGF9fV0pLHR9KF8pLExlPXtwcm9jZXNzb3JzOnt9LGFkZFBvc3RQcm9jZXNzb3I6ZnVuY3Rpb24ocil7dGhpcy5wcm9jZXNzb3JzW3IubmFtZV09cn0saGFuZGxlOmZ1bmN0aW9uKHIsdCxuLGUsYSl7dmFyIG89dGhpcztyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKHUpe28ucHJvY2Vzc29yc1t1XSYmKHQ9by5wcm9jZXNzb3JzW3VdLnByb2Nlc3ModCxuLGUsYSkpfSksdH19O2Z1bmN0aW9uIGtlKGkscil7dmFyIHQ9T2JqZWN0LmtleXMoaSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhpKTtyJiYobj1uLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLGUpLmVudW1lcmFibGV9KSksdC5wdXNoLmFwcGx5KHQsbil9cmV0dXJuIHR9ZnVuY3Rpb24gdyhpKXtmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgdD1hcmd1bWVudHNbcl0hPW51bGw/YXJndW1lbnRzW3JdOnt9O3IlMj9rZShPYmplY3QodCksITApLmZvckVhY2goZnVuY3Rpb24obil7RihpLG4sdFtuXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKTprZShPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24obil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGksbixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbikpfSl9cmV0dXJuIGl9ZnVuY3Rpb24gc3QoaSl7dmFyIHI9dXQoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1qKGkpLGU7aWYocil7dmFyIGE9aih0aGlzKS5jb25zdHJ1Y3RvcjtlPVJlZmxlY3QuY29uc3RydWN0KG4sYXJndW1lbnRzLGEpfWVsc2UgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gQih0aGlzLGUpfX1mdW5jdGlvbiB1dCgpe2lmKHR5cGVvZiBSZWZsZWN0PiJ1Inx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKHR5cGVvZiBQcm94eT09ImZ1bmN0aW9uIilyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoe3JldHVybiExfX12YXIgUmU9e30samU9ZnVuY3Rpb24oaSl7cSh0LGkpO3ZhciByPXN0KHQpO2Z1bmN0aW9uIHQobil7dmFyIGUsYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e307cmV0dXJuIGsodGhpcyx0KSxlPXIuY2FsbCh0aGlzKSxaJiZfLmNhbGwoRShlKSksWGUoWyJyZXNvdXJjZVN0b3JlIiwibGFuZ3VhZ2VVdGlscyIsInBsdXJhbFJlc29sdmVyIiwiaW50ZXJwb2xhdG9yIiwiYmFja2VuZENvbm5lY3RvciIsImkxOG5Gb3JtYXQiLCJ1dGlscyJdLG4sRShlKSksZS5vcHRpb25zPWEsZS5vcHRpb25zLmtleVNlcGFyYXRvcj09PXZvaWQgMCYmKGUub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxlLmxvZ2dlcj1OLmNyZWF0ZSgidHJhbnNsYXRvciIpLGV9cmV0dXJuIFIodCxbe2tleToiY2hhbmdlTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKGUpe2UmJih0aGlzLmxhbmd1YWdlPWUpfX0se2tleToiZXhpc3RzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319O2lmKGU9PW51bGwpcmV0dXJuITE7dmFyIG89dGhpcy5yZXNvbHZlKGUsYSk7cmV0dXJuIG8mJm8ucmVzIT09dm9pZCAwfX0se2tleToiZXh0cmFjdEZyb21LZXkiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89YS5uc1NlcGFyYXRvciE9PXZvaWQgMD9hLm5zU2VwYXJhdG9yOnRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtvPT09dm9pZCAwJiYobz0iOiIpO3ZhciB1PWEua2V5U2VwYXJhdG9yIT09dm9pZCAwP2Eua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3Iscz1hLm5zfHx0aGlzLm9wdGlvbnMuZGVmYXVsdE5TfHxbXSxsPW8mJmUuaW5kZXhPZihvKT4tMSxmPSF0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3ImJiFhLmtleVNlcGFyYXRvciYmIXRoaXMub3B0aW9ucy51c2VyRGVmaW5lZE5zU2VwYXJhdG9yJiYhYS5uc1NlcGFyYXRvciYmIXJ0KGUsbyx1KTtpZihsJiYhZil7dmFyIGM9ZS5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtpZihjJiZjLmxlbmd0aD4wKXJldHVybntrZXk6ZSxuYW1lc3BhY2VzOnN9O3ZhciBnPWUuc3BsaXQobyk7KG8hPT11fHxvPT09dSYmdGhpcy5vcHRpb25zLm5zLmluZGV4T2YoZ1swXSk+LTEpJiYocz1nLnNoaWZ0KCkpLGU9Zy5qb2luKHUpfXJldHVybiB0eXBlb2Ygcz09InN0cmluZyImJihzPVtzXSkse2tleTplLG5hbWVzcGFjZXM6c319fSx7a2V5OiJ0cmFuc2xhdGUiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgdT10aGlzO2lmKFAoYSkhPT0ib2JqZWN0IiYmdGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyJiYoYT10aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXIoYXJndW1lbnRzKSksYXx8KGE9e30pLGU9PW51bGwpcmV0dXJuIiI7QXJyYXkuaXNBcnJheShlKXx8KGU9W1N0cmluZyhlKV0pO3ZhciBzPWEucmV0dXJuRGV0YWlscyE9PXZvaWQgMD9hLnJldHVybkRldGFpbHM6dGhpcy5vcHRpb25zLnJldHVybkRldGFpbHMsbD1hLmtleVNlcGFyYXRvciE9PXZvaWQgMD9hLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGY9dGhpcy5leHRyYWN0RnJvbUtleShlW2UubGVuZ3RoLTFdLGEpLGM9Zi5rZXksZz1mLm5hbWVzcGFjZXMscD1nW2cubGVuZ3RoLTFdLHY9YS5sbmd8fHRoaXMubGFuZ3VhZ2UseT1hLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlfHx0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU7aWYodiYmdi50b0xvd2VyQ2FzZSgpPT09ImNpbW9kZSIpe2lmKHkpe3ZhciBtPWEubnNTZXBhcmF0b3J8fHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtyZXR1cm4gcz8oZC5yZXM9IiIuY29uY2F0KHApLmNvbmNhdChtKS5jb25jYXQoYyksZCk6IiIuY29uY2F0KHApLmNvbmNhdChtKS5jb25jYXQoYyl9cmV0dXJuIHM/KGQucmVzPWMsZCk6Y312YXIgZD10aGlzLnJlc29sdmUoZSxhKSxoPWQmJmQucmVzLE89ZCYmZC51c2VkS2V5fHxjLGI9ZCYmZC5leGFjdFVzZWRLZXl8fGMseD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KGgpLEM9WyJbb2JqZWN0IE51bWJlcl0iLCJbb2JqZWN0IEZ1bmN0aW9uXSIsIltvYmplY3QgUmVnRXhwXSJdLE09YS5qb2luQXJyYXlzIT09dm9pZCAwP2Euam9pbkFycmF5czp0aGlzLm9wdGlvbnMuam9pbkFycmF5cyxZPSF0aGlzLmkxOG5Gb3JtYXR8fHRoaXMuaTE4bkZvcm1hdC5oYW5kbGVBc09iamVjdCxKPXR5cGVvZiBoIT0ic3RyaW5nIiYmdHlwZW9mIGghPSJib29sZWFuIiYmdHlwZW9mIGghPSJudW1iZXIiO2lmKFkmJmgmJkomJkMuaW5kZXhPZih4KTwwJiYhKHR5cGVvZiBNPT0ic3RyaW5nIiYmeD09PSJbb2JqZWN0IEFycmF5XSIpKXtpZighYS5yZXR1cm5PYmplY3RzJiYhdGhpcy5vcHRpb25zLnJldHVybk9iamVjdHMpe3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXJ8fHRoaXMubG9nZ2VyLndhcm4oImFjY2Vzc2luZyBhbiBvYmplY3QgLSBidXQgcmV0dXJuT2JqZWN0cyBvcHRpb25zIGlzIG5vdCBlbmFibGVkISIpO3ZhciAkPXRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXI/dGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlcihPLGgsdyh3KHt9LGEpLHt9LHtuczpnfSkpOiJrZXkgJyIuY29uY2F0KGMsIiAoIikuY29uY2F0KHRoaXMubGFuZ3VhZ2UsIiknIHJldHVybmVkIGFuIG9iamVjdCBpbnN0ZWFkIG9mIHN0cmluZy4iKTtyZXR1cm4gcz8oZC5yZXM9JCxkKTokfWlmKGwpe3ZhciBNZT14PT09IltvYmplY3QgQXJyYXldIixyZT1NZT9bXTp7fSxJdD1NZT9iOk87Zm9yKHZhciBVIGluIGgpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGgsVSkpe3ZhciBBZT0iIi5jb25jYXQoSXQpLmNvbmNhdChsKS5jb25jYXQoVSk7cmVbVV09dGhpcy50cmFuc2xhdGUoQWUsdyh3KHt9LGEpLHtqb2luQXJyYXlzOiExLG5zOmd9KSkscmVbVV09PT1BZSYmKHJlW1VdPWhbVV0pfWg9cmV9fWVsc2UgaWYoWSYmdHlwZW9mIE09PSJzdHJpbmciJiZ4PT09IltvYmplY3QgQXJyYXldIiloPWguam9pbihNKSxoJiYoaD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsZSxhLG8pKTtlbHNle3ZhciBhZT0hMSx6PSExLFZlPWEuY291bnQhPT12b2lkIDAmJnR5cGVvZiBhLmNvdW50IT0ic3RyaW5nIixsZT10Lmhhc0RlZmF1bHRWYWx1ZShhKSxUdD1WZT90aGlzLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeCh2LGEuY291bnQsYSk6IiIsVz1hWyJkZWZhdWx0VmFsdWUiLmNvbmNhdChUdCldfHxhLmRlZmF1bHRWYWx1ZTshdGhpcy5pc1ZhbGlkTG9va3VwKGgpJiZsZSYmKGFlPSEwLGg9VyksdGhpcy5pc1ZhbGlkTG9va3VwKGgpfHwoej0hMCxoPWMpO3ZhciBNdD1hLm1pc3NpbmdLZXlOb1ZhbHVlRmFsbGJhY2tUb0tleXx8dGhpcy5vcHRpb25zLm1pc3NpbmdLZXlOb1ZhbHVlRmFsbGJhY2tUb0tleSxBdD1NdCYmej92b2lkIDA6aCxRPWxlJiZXIT09aCYmdGhpcy5vcHRpb25zLnVwZGF0ZU1pc3Npbmc7aWYoenx8YWV8fFEpe2lmKHRoaXMubG9nZ2VyLmxvZyhRPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5Iix2LHAsYyxRP1c6aCksbCl7dmFyICRlPXRoaXMucmVzb2x2ZShjLHcodyh7fSxhKSx7fSx7a2V5U2VwYXJhdG9yOiExfSkpOyRlJiYkZS5yZXMmJnRoaXMubG9nZ2VyLndhcm4oIlNlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4iKX12YXIgRz1bXSxpZT10aGlzLmxhbmd1YWdlVXRpbHMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcsYS5sbmd8fHRoaXMubGFuZ3VhZ2UpO2lmKHRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvPT09ImZhbGxiYWNrIiYmaWUmJmllWzBdKWZvcih2YXIgY2U9MDtjZTxpZS5sZW5ndGg7Y2UrKylHLnB1c2goaWVbY2VdKTtlbHNlIHRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvPT09ImFsbCI/Rz10aGlzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KGEubG5nfHx0aGlzLmxhbmd1YWdlKTpHLnB1c2goYS5sbmd8fHRoaXMubGFuZ3VhZ2UpO3ZhciBVZT1mdW5jdGlvbihILHBlLEhlKXt2YXIgQmU9bGUmJkhlIT09aD9IZTpBdDt1Lm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXI/dS5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKEgscCxwZSxCZSxRLGEpOnUuYmFja2VuZENvbm5lY3RvciYmdS5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nJiZ1LmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcoSCxwLHBlLEJlLFEsYSksdS5lbWl0KCJtaXNzaW5nS2V5IixILHAscGUsaCl9O3RoaXMub3B0aW9ucy5zYXZlTWlzc2luZyYmKHRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1BsdXJhbHMmJlZlP0cuZm9yRWFjaChmdW5jdGlvbihnZSl7dS5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXhlcyhnZSxhKS5mb3JFYWNoKGZ1bmN0aW9uKEgpe1VlKFtnZV0sYytILGFbImRlZmF1bHRWYWx1ZSIuY29uY2F0KEgpXXx8Vyl9KX0pOlVlKEcsYyxXKSl9aD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsZSxhLGQsbykseiYmaD09PWMmJnRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXkmJihoPSIiLmNvbmNhdChwLCI6IikuY29uY2F0KGMpKSwoenx8YWUpJiZ0aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlciYmKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJIT09InYxIj9oPXRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyKHRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk/IiIuY29uY2F0KHAsIjoiKS5jb25jYXQoYyk6YyxhZT9oOnZvaWQgMCk6aD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcihoKSl9cmV0dXJuIHM/KGQucmVzPWgsZCk6aH19LHtrZXk6ImV4dGVuZFRyYW5zbGF0aW9uIix2YWx1ZTpmdW5jdGlvbihlLGEsbyx1LHMpe3ZhciBsPXRoaXM7aWYodGhpcy5pMThuRm9ybWF0JiZ0aGlzLmkxOG5Gb3JtYXQucGFyc2UpZT10aGlzLmkxOG5Gb3JtYXQucGFyc2UoZSx3KHcoe30sdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyksbyksdS51c2VkTG5nLHUudXNlZE5TLHUudXNlZEtleSx7cmVzb2x2ZWQ6dX0pO2Vsc2UgaWYoIW8uc2tpcEludGVycG9sYXRpb24pe28uaW50ZXJwb2xhdGlvbiYmdGhpcy5pbnRlcnBvbGF0b3IuaW5pdCh3KHcoe30sbykse2ludGVycG9sYXRpb246dyh3KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uKSxvLmludGVycG9sYXRpb24pfSkpO3ZhciBmPXR5cGVvZiBlPT0ic3RyaW5nIiYmKG8mJm8uaW50ZXJwb2xhdGlvbiYmby5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyE9PXZvaWQgMD9vLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzOnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyksYztpZihmKXt2YXIgZz1lLm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2M9ZyYmZy5sZW5ndGh9dmFyIHA9by5yZXBsYWNlJiZ0eXBlb2Ygby5yZXBsYWNlIT0ic3RyaW5nIj9vLnJlcGxhY2U6bztpZih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzJiYocD13KHcoe30sdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcykscCkpLGU9dGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUoZSxwLG8ubG5nfHx0aGlzLmxhbmd1YWdlLG8pLGYpe3ZhciB2PWUubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCkseT12JiZ2Lmxlbmd0aDtjPHkmJihvLm5lc3Q9ITEpfW8ubmVzdCE9PSExJiYoZT10aGlzLmludGVycG9sYXRvci5uZXN0KGUsZnVuY3Rpb24oKXtmb3IodmFyIGg9YXJndW1lbnRzLmxlbmd0aCxPPW5ldyBBcnJheShoKSxiPTA7YjxoO2IrKylPW2JdPWFyZ3VtZW50c1tiXTtyZXR1cm4gcyYmc1swXT09PU9bMF0mJiFvLmNvbnRleHQ/KGwubG9nZ2VyLndhcm4oIkl0IHNlZW1zIHlvdSBhcmUgbmVzdGluZyByZWN1cnNpdmVseSBrZXk6ICIuY29uY2F0KE9bMF0sIiBpbiBrZXk6ICIpLmNvbmNhdChhWzBdKSksbnVsbCk6bC50cmFuc2xhdGUuYXBwbHkobCxPLmNvbmNhdChbYV0pKX0sbykpLG8uaW50ZXJwb2xhdGlvbiYmdGhpcy5pbnRlcnBvbGF0b3IucmVzZXQoKX12YXIgbT1vLnBvc3RQcm9jZXNzfHx0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3MsZD10eXBlb2YgbT09InN0cmluZyI/W21dOm07cmV0dXJuIGUhPW51bGwmJmQmJmQubGVuZ3RoJiZvLmFwcGx5UG9zdFByb2Nlc3NvciE9PSExJiYoZT1MZS5oYW5kbGUoZCxlLGEsdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ/dyh7aTE4blJlc29sdmVkOnV9LG8pOm8sdGhpcykpLGV9fSx7a2V5OiJyZXNvbHZlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LHUscyxsLGYsYztyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciJiYoZT1bZV0pLGUuZm9yRWFjaChmdW5jdGlvbihnKXtpZighYS5pc1ZhbGlkTG9va3VwKHUpKXt2YXIgcD1hLmV4dHJhY3RGcm9tS2V5KGcsbyksdj1wLmtleTtzPXY7dmFyIHk9cC5uYW1lc3BhY2VzO2Eub3B0aW9ucy5mYWxsYmFja05TJiYoeT15LmNvbmNhdChhLm9wdGlvbnMuZmFsbGJhY2tOUykpO3ZhciBtPW8uY291bnQhPT12b2lkIDAmJnR5cGVvZiBvLmNvdW50IT0ic3RyaW5nIixkPW0mJiFvLm9yZGluYWwmJm8uY291bnQ9PT0wJiZhLnBsdXJhbFJlc29sdmVyLnNob3VsZFVzZUludGxBcGkoKSxoPW8uY29udGV4dCE9PXZvaWQgMCYmKHR5cGVvZiBvLmNvbnRleHQ9PSJzdHJpbmcifHx0eXBlb2Ygby5jb250ZXh0PT0ibnVtYmVyIikmJm8uY29udGV4dCE9PSIiLE89by5sbmdzP28ubG5nczphLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KG8ubG5nfHxhLmxhbmd1YWdlLG8uZmFsbGJhY2tMbmcpO3kuZm9yRWFjaChmdW5jdGlvbihiKXthLmlzVmFsaWRMb29rdXAodSl8fChjPWIsIVJlWyIiLmNvbmNhdChPWzBdLCItIikuY29uY2F0KGIpXSYmYS51dGlscyYmYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiFhLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShjKSYmKFJlWyIiLmNvbmNhdChPWzBdLCItIikuY29uY2F0KGIpXT0hMCxhLmxvZ2dlci53YXJuKCdrZXkgIicuY29uY2F0KHMsJyIgZm9yIGxhbmd1YWdlcyAiJykuY29uY2F0KE8uam9pbigiLCAiKSxgIiB3b24ndCBnZXQgcmVzb2x2ZWQgYXMgbmFtZXNwYWNlICJgKS5jb25jYXQoYywnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIikpLE8uZm9yRWFjaChmdW5jdGlvbih4KXtpZighYS5pc1ZhbGlkTG9va3VwKHUpKXtmPXg7dmFyIEM9W3ZdO2lmKGEuaTE4bkZvcm1hdCYmYS5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMpYS5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMoQyx2LHgsYixvKTtlbHNle3ZhciBNO20mJihNPWEucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KHgsby5jb3VudCxvKSk7dmFyIFk9IiIuY29uY2F0KGEub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsInplcm8iKTtpZihtJiYoQy5wdXNoKHYrTSksZCYmQy5wdXNoKHYrWSkpLGgpe3ZhciBKPSIiLmNvbmNhdCh2KS5jb25jYXQoYS5vcHRpb25zLmNvbnRleHRTZXBhcmF0b3IpLmNvbmNhdChvLmNvbnRleHQpO0MucHVzaChKKSxtJiYoQy5wdXNoKEorTSksZCYmQy5wdXNoKEorWSkpfX1mb3IodmFyICQ7JD1DLnBvcCgpOylhLmlzVmFsaWRMb29rdXAodSl8fChsPSQsdT1hLmdldFJlc291cmNlKHgsYiwkLG8pKX19KSl9KX19KSx7cmVzOnUsdXNlZEtleTpzLGV4YWN0VXNlZEtleTpsLHVzZWRMbmc6Zix1c2VkTlM6Y319fSx7a2V5OiJpc1ZhbGlkTG9va3VwIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZSE9PXZvaWQgMCYmISghdGhpcy5vcHRpb25zLnJldHVybk51bGwmJmU9PT1udWxsKSYmISghdGhpcy5vcHRpb25zLnJldHVybkVtcHR5U3RyaW5nJiZlPT09IiIpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgdT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106e307cmV0dXJuIHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlP3RoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZShlLGEsbyx1KTp0aGlzLnJlc291cmNlU3RvcmUuZ2V0UmVzb3VyY2UoZSxhLG8sdSl9fV0sW3trZXk6Imhhc0RlZmF1bHRWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9ImRlZmF1bHRWYWx1ZSI7Zm9yKHZhciBvIGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJmE9PT1vLnN1YnN0cmluZygwLGEubGVuZ3RoKSYmZVtvXSE9PXZvaWQgMClyZXR1cm4hMDtyZXR1cm4hMX19XSksdH0oXyk7ZnVuY3Rpb24gdWUoaSl7cmV0dXJuIGkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkraS5zbGljZSgxKX12YXIgZnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHIpe2sodGhpcyxpKSx0aGlzLm9wdGlvbnM9cix0aGlzLnN1cHBvcnRlZExuZ3M9dGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3N8fCExLHRoaXMubG9nZ2VyPU4uY3JlYXRlKCJsYW5ndWFnZVV0aWxzIil9cmV0dXJuIFIoaSxbe2tleToiZ2V0U2NyaXB0UGFydEZyb21Db2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dC5pbmRleE9mKCItIik8MClyZXR1cm4gbnVsbDt2YXIgbj10LnNwbGl0KCItIik7cmV0dXJuIG4ubGVuZ3RoPT09Mnx8KG4ucG9wKCksbltuLmxlbmd0aC0xXS50b0xvd2VyQ2FzZSgpPT09IngiKT9udWxsOnRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKG4uam9pbigiLSIpKX19LHtrZXk6ImdldExhbmd1YWdlUGFydEZyb21Db2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dC5pbmRleE9mKCItIik8MClyZXR1cm4gdDt2YXIgbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKG5bMF0pfX0se2tleToiZm9ybWF0TGFuZ3VhZ2VDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0eXBlb2YgdD09InN0cmluZyImJnQuaW5kZXhPZigiLSIpPi0xKXt2YXIgbj1bImhhbnMiLCJoYW50IiwibGF0biIsImN5cmwiLCJjYW5zIiwibW9uZyIsImFyYWIiXSxlPXQuc3BsaXQoIi0iKTtyZXR1cm4gdGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz9lPWUubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLnRvTG93ZXJDYXNlKCl9KTplLmxlbmd0aD09PTI/KGVbMF09ZVswXS50b0xvd2VyQ2FzZSgpLGVbMV09ZVsxXS50b1VwcGVyQ2FzZSgpLG4uaW5kZXhPZihlWzFdLnRvTG93ZXJDYXNlKCkpPi0xJiYoZVsxXT11ZShlWzFdLnRvTG93ZXJDYXNlKCkpKSk6ZS5sZW5ndGg9PT0zJiYoZVswXT1lWzBdLnRvTG93ZXJDYXNlKCksZVsxXS5sZW5ndGg9PT0yJiYoZVsxXT1lWzFdLnRvVXBwZXJDYXNlKCkpLGVbMF0hPT0ic2duIiYmZVsyXS5sZW5ndGg9PT0yJiYoZVsyXT1lWzJdLnRvVXBwZXJDYXNlKCkpLG4uaW5kZXhPZihlWzFdLnRvTG93ZXJDYXNlKCkpPi0xJiYoZVsxXT11ZShlWzFdLnRvTG93ZXJDYXNlKCkpKSxuLmluZGV4T2YoZVsyXS50b0xvd2VyQ2FzZSgpKT4tMSYmKGVbMl09dWUoZVsyXS50b0xvd2VyQ2FzZSgpKSkpLGUuam9pbigiLSIpfXJldHVybiB0aGlzLm9wdGlvbnMuY2xlYW5Db2RlfHx0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nP3QudG9Mb3dlckNhc2UoKTp0fX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4odGhpcy5vcHRpb25zLmxvYWQ9PT0ibGFuZ3VhZ2VPbmx5Inx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcztpZighdClyZXR1cm4gbnVsbDt2YXIgZTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKCFlKXt2YXIgbz1uLmZvcm1hdExhbmd1YWdlQ29kZShhKTsoIW4ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHxuLmlzU3VwcG9ydGVkQ29kZShvKSkmJihlPW8pfX0pLCFlJiZ0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmdC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKCFlKXt2YXIgbz1uLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGEpO2lmKG4uaXNTdXBwb3J0ZWRDb2RlKG8pKXJldHVybiBlPW87ZT1uLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKGZ1bmN0aW9uKHUpe2lmKHUuaW5kZXhPZihvKT09PTApcmV0dXJuIHV9KX19KSxlfHwoZT10aGlzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKVswXSksZX19LHtrZXk6ImdldEZhbGxiYWNrQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQsbil7aWYoIXQpcmV0dXJuW107aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiImJih0PXQobikpLHR5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9W3RdKSxPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KHQpPT09IltvYmplY3QgQXJyYXldIilyZXR1cm4gdDtpZighbilyZXR1cm4gdC5kZWZhdWx0fHxbXTt2YXIgZT10W25dO3JldHVybiBlfHwoZT10W3RoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKG4pXSksZXx8KGU9dFt0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShuKV0pLGV8fChlPXRbdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShuKV0pLGV8fChlPXQuZGVmYXVsdCksZXx8W119fSx7a2V5OiJ0b1Jlc29sdmVIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcyxhPXRoaXMuZ2V0RmFsbGJhY2tDb2RlcyhufHx0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmd8fFtdLHQpLG89W10sdT1mdW5jdGlvbihsKXtsJiYoZS5pc1N1cHBvcnRlZENvZGUobCk/by5wdXNoKGwpOmUubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdChsKSkpfTtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciJiZ0LmluZGV4T2YoIi0iKT4tMT8odGhpcy5vcHRpb25zLmxvYWQhPT0ibGFuZ3VhZ2VPbmx5IiYmdSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZSh0KSksdGhpcy5vcHRpb25zLmxvYWQhPT0ibGFuZ3VhZ2VPbmx5IiYmdGhpcy5vcHRpb25zLmxvYWQhPT0iY3VycmVudE9ubHkiJiZ1KHRoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKHQpKSx0aGlzLm9wdGlvbnMubG9hZCE9PSJjdXJyZW50T25seSImJnUodGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KSkpOnR5cGVvZiB0PT0ic3RyaW5nIiYmdSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZSh0KSksYS5mb3JFYWNoKGZ1bmN0aW9uKHMpe28uaW5kZXhPZihzKTwwJiZ1KGUuZm9ybWF0TGFuZ3VhZ2VDb2RlKHMpKX0pLG99fV0pLGl9KCksbHQ9W3tsbmdzOlsiYWNoIiwiYWsiLCJhbSIsImFybiIsImJyIiwiZmlsIiwiZ3VuIiwibG4iLCJtZmUiLCJtZyIsIm1pIiwib2MiLCJwdCIsInB0LUJSIiwidGciLCJ0bCIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtrIiwia24iLCJrdSIsImxiIiwibWFpIiwibWwiLCJtbiIsIm1yIiwibmFoIiwibmFwIiwibmIiLCJuZSIsIm5sIiwibm4iLCJubyIsIm5zbyIsInBhIiwicGFwIiwicG1zIiwicHMiLCJwdC1QVCIsInJtIiwic2NvIiwic2UiLCJzaSIsInNvIiwic29uIiwic3EiLCJzdiIsInN3IiwidGEiLCJ0ZSIsInRrIiwidXIiLCJ5byJdLG5yOlsxLDJdLGZjOjJ9LHtsbmdzOlsiYXkiLCJibyIsImNnZyIsImZhIiwiaHQiLCJpZCIsImphIiwiamJvIiwia2EiLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sY3Q9ezE6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPjEpfSwyOmZ1bmN0aW9uKHIpe3JldHVybiBOdW1iZXIociE9MSl9LDM6ZnVuY3Rpb24ocil7cmV0dXJuIDB9LDQ6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyJTEwPT0xJiZyJTEwMCE9MTE/MDpyJTEwPj0yJiZyJTEwPD00JiYociUxMDA8MTB8fHIlMTAwPj0yMCk/MToyKX0sNTpmdW5jdGlvbihyKXtyZXR1cm4gTnVtYmVyKHI9PTA/MDpyPT0xPzE6cj09Mj8yOnIlMTAwPj0zJiZyJTEwMDw9MTA/MzpyJTEwMD49MTE/NDo1KX0sNjpmdW5jdGlvbihyKXtyZXR1cm4gTnVtYmVyKHI9PTE/MDpyPj0yJiZyPD00PzE6Mil9LDc6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0xPzA6ciUxMD49MiYmciUxMDw9NCYmKHIlMTAwPDEwfHxyJTEwMD49MjApPzE6Mil9LDg6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0xPzA6cj09Mj8xOnIhPTgmJnIhPTExPzI6Myl9LDk6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPj0yKX0sMTA6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0xPzA6cj09Mj8xOnI8Nz8yOnI8MTE/Mzo0KX0sMTE6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0xfHxyPT0xMT8wOnI9PTJ8fHI9PTEyPzE6cj4yJiZyPDIwPzI6Myl9LDEyOmZ1bmN0aW9uKHIpe3JldHVybiBOdW1iZXIociUxMCE9MXx8ciUxMDA9PTExKX0sMTM6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyIT09MCl9LDE0OmZ1bmN0aW9uKHIpe3JldHVybiBOdW1iZXIocj09MT8wOnI9PTI/MTpyPT0zPzI6Myl9LDE1OmZ1bmN0aW9uKHIpe3JldHVybiBOdW1iZXIociUxMD09MSYmciUxMDAhPTExPzA6ciUxMD49MiYmKHIlMTAwPDEwfHxyJTEwMD49MjApPzE6Mil9LDE2OmZ1bmN0aW9uKHIpe3JldHVybiBOdW1iZXIociUxMD09MSYmciUxMDAhPTExPzA6ciE9PTA/MToyKX0sMTc6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0xfHxyJTEwPT0xJiZyJTEwMCE9MTE/MDoxKX0sMTg6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0wPzA6cj09MT8xOjIpfSwxOTpmdW5jdGlvbihyKXtyZXR1cm4gTnVtYmVyKHI9PTE/MDpyPT0wfHxyJTEwMD4xJiZyJTEwMDwxMT8xOnIlMTAwPjEwJiZyJTEwMDwyMD8yOjMpfSwyMDpmdW5jdGlvbihyKXtyZXR1cm4gTnVtYmVyKHI9PTE/MDpyPT0wfHxyJTEwMD4wJiZyJTEwMDwyMD8xOjIpfSwyMTpmdW5jdGlvbihyKXtyZXR1cm4gTnVtYmVyKHIlMTAwPT0xPzE6ciUxMDA9PTI/MjpyJTEwMD09M3x8ciUxMDA9PTQ/MzowKX0sMjI6ZnVuY3Rpb24ocil7cmV0dXJuIE51bWJlcihyPT0xPzA6cj09Mj8xOihyPDB8fHI+MTApJiZyJTEwPT0wPzI6Myl9fSxndD1bInYxIiwidjIiLCJ2MyJdLE5lPXt6ZXJvOjAsb25lOjEsdHdvOjIsZmV3OjMsbWFueTo0LG90aGVyOjV9O2Z1bmN0aW9uIHB0KCl7dmFyIGk9e307cmV0dXJuIGx0LmZvckVhY2goZnVuY3Rpb24ocil7ci5sbmdzLmZvckVhY2goZnVuY3Rpb24odCl7aVt0XT17bnVtYmVyczpyLm5yLHBsdXJhbHM6Y3Rbci5mY119fSl9KSxpfXZhciBkdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGkocil7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O2sodGhpcyxpKSx0aGlzLmxhbmd1YWdlVXRpbHM9cix0aGlzLm9wdGlvbnM9dCx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgicGx1cmFsUmVzb2x2ZXIiKSwoIXRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTnx8dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPT09InY0IikmJih0eXBlb2YgSW50bD4idSJ8fCFJbnRsLlBsdXJhbFJ1bGVzKSYmKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj0idjMiLHRoaXMubG9nZ2VyLmVycm9yKCJZb3VyIGVudmlyb25tZW50IHNlZW1zIG5vdCB0byBiZSBJbnRsIEFQSSBjb21wYXRpYmxlLCB1c2UgYW4gSW50bC5QbHVyYWxSdWxlcyBwb2x5ZmlsbC4gV2lsbCBmYWxsYmFjayB0byB0aGUgY29tcGF0aWJpbGl0eUpTT04gdjMgZm9ybWF0IGhhbmRsaW5nLiIpKSx0aGlzLnJ1bGVzPXB0KCl9cmV0dXJuIFIoaSxbe2tleToiYWRkUnVsZSIsdmFsdWU6ZnVuY3Rpb24odCxuKXt0aGlzLnJ1bGVzW3RdPW59fSx7a2V5OiJnZXRSdWxlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e307aWYodGhpcy5zaG91bGRVc2VJbnRsQXBpKCkpdHJ5e3JldHVybiBuZXcgSW50bC5QbHVyYWxSdWxlcyh0LHt0eXBlOm4ub3JkaW5hbD8ib3JkaW5hbCI6ImNhcmRpbmFsIn0pfWNhdGNoe3JldHVybn1yZXR1cm4gdGhpcy5ydWxlc1t0XXx8dGhpcy5ydWxlc1t0aGlzLmxhbmd1YWdlVXRpbHMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCldfX0se2tleToibmVlZHNQbHVyYWwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxlPXRoaXMuZ2V0UnVsZSh0LG4pO3JldHVybiB0aGlzLnNob3VsZFVzZUludGxBcGkoKT9lJiZlLnJlc29sdmVkT3B0aW9ucygpLnBsdXJhbENhdGVnb3JpZXMubGVuZ3RoPjE6ZSYmZS5udW1iZXJzLmxlbmd0aD4xfX0se2tleToiZ2V0UGx1cmFsRm9ybXNPZktleSIsdmFsdWU6ZnVuY3Rpb24odCxuKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e307cmV0dXJuIHRoaXMuZ2V0U3VmZml4ZXModCxlKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIiIuY29uY2F0KG4pLmNvbmNhdChhKX0pfX0se2tleToiZ2V0U3VmZml4ZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30sYT10aGlzLmdldFJ1bGUodCxlKTtyZXR1cm4gYT90aGlzLnNob3VsZFVzZUludGxBcGkoKT9hLnJlc29sdmVkT3B0aW9ucygpLnBsdXJhbENhdGVnb3JpZXMuc29ydChmdW5jdGlvbihvLHUpe3JldHVybiBOZVtvXS1OZVt1XX0pLm1hcChmdW5jdGlvbihvKXtyZXR1cm4iIi5jb25jYXQobi5vcHRpb25zLnByZXBlbmQpLmNvbmNhdChvKX0pOmEubnVtYmVycy5tYXAoZnVuY3Rpb24obyl7cmV0dXJuIG4uZ2V0U3VmZml4KHQsbyxlKX0pOltdfX0se2tleToiZ2V0U3VmZml4Iix2YWx1ZTpmdW5jdGlvbih0LG4pe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp7fSxhPXRoaXMuZ2V0UnVsZSh0LGUpO3JldHVybiBhP3RoaXMuc2hvdWxkVXNlSW50bEFwaSgpPyIiLmNvbmNhdCh0aGlzLm9wdGlvbnMucHJlcGVuZCkuY29uY2F0KGEuc2VsZWN0KG4pKTp0aGlzLmdldFN1ZmZpeFJldHJvQ29tcGF0aWJsZShhLG4pOih0aGlzLmxvZ2dlci53YXJuKCJubyBwbHVyYWwgcnVsZSBmb3VuZCBmb3I6ICIuY29uY2F0KHQpKSwiIil9fSx7a2V5OiJnZXRTdWZmaXhSZXRyb0NvbXBhdGlibGUiLHZhbHVlOmZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcyxhPXQubm9BYnM/dC5wbHVyYWxzKG4pOnQucGx1cmFscyhNYXRoLmFicyhuKSksbz10Lm51bWJlcnNbYV07dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4JiZ0Lm51bWJlcnMubGVuZ3RoPT09MiYmdC5udW1iZXJzWzBdPT09MSYmKG89PT0yP289InBsdXJhbCI6bz09PTEmJihvPSIiKSk7dmFyIHU9ZnVuY3Rpb24oKXtyZXR1cm4gZS5vcHRpb25zLnByZXBlbmQmJm8udG9TdHJpbmcoKT9lLm9wdGlvbnMucHJlcGVuZCtvLnRvU3RyaW5nKCk6by50b1N0cmluZygpfTtyZXR1cm4gdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPT09InYxIj9vPT09MT8iIjp0eXBlb2Ygbz09Im51bWJlciI/Il9wbHVyYWxfIi5jb25jYXQoby50b1N0cmluZygpKTp1KCk6dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPT09InYyInx8dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4JiZ0Lm51bWJlcnMubGVuZ3RoPT09MiYmdC5udW1iZXJzWzBdPT09MT91KCk6dGhpcy5vcHRpb25zLnByZXBlbmQmJmEudG9TdHJpbmcoKT90aGlzLm9wdGlvbnMucHJlcGVuZCthLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfX0se2tleToic2hvdWxkVXNlSW50bEFwaSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hZ3QuaW5jbHVkZXModGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKX19XSksaX0oKTtmdW5jdGlvbiBEZShpLHIpe3ZhciB0PU9iamVjdC5rZXlzKGkpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaSk7ciYmKG49bi5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKS5lbnVtZXJhYmxlfSkpLHQucHVzaC5hcHBseSh0LG4pfXJldHVybiB0fWZ1bmN0aW9uIEwoaSl7Zm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl7dmFyIHQ9YXJndW1lbnRzW3JdIT1udWxsP2FyZ3VtZW50c1tyXTp7fTtyJTI/RGUoT2JqZWN0KHQpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe0YoaSxuLHRbbl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSk6RGUoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLG4sT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pKX0pfXJldHVybiBpfXZhciBodD1mdW5jdGlvbigpe2Z1bmN0aW9uIGkoKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e307ayh0aGlzLGkpLHRoaXMubG9nZ2VyPU4uY3JlYXRlKCJpbnRlcnBvbGF0b3IiKSx0aGlzLm9wdGlvbnM9cix0aGlzLmZvcm1hdD1yLmludGVycG9sYXRpb24mJnIuaW50ZXJwb2xhdGlvbi5mb3JtYXR8fGZ1bmN0aW9uKHQpe3JldHVybiB0fSx0aGlzLmluaXQocil9cmV0dXJuIFIoaSxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e307dC5pbnRlcnBvbGF0aW9ufHwodC5pbnRlcnBvbGF0aW9uPXtlc2NhcGVWYWx1ZTohMH0pO3ZhciBuPXQuaW50ZXJwb2xhdGlvbjt0aGlzLmVzY2FwZT1uLmVzY2FwZSE9PXZvaWQgMD9uLmVzY2FwZTp0dCx0aGlzLmVzY2FwZVZhbHVlPW4uZXNjYXBlVmFsdWUhPT12b2lkIDA/bi5lc2NhcGVWYWx1ZTohMCx0aGlzLnVzZVJhd1ZhbHVlVG9Fc2NhcGU9bi51c2VSYXdWYWx1ZVRvRXNjYXBlIT09dm9pZCAwP24udXNlUmF3VmFsdWVUb0VzY2FwZTohMSx0aGlzLnByZWZpeD1uLnByZWZpeD9BKG4ucHJlZml4KTpuLnByZWZpeEVzY2FwZWR8fCJ7eyIsdGhpcy5zdWZmaXg9bi5zdWZmaXg/QShuLnN1ZmZpeCk6bi5zdWZmaXhFc2NhcGVkfHwifX0iLHRoaXMuZm9ybWF0U2VwYXJhdG9yPW4uZm9ybWF0U2VwYXJhdG9yP24uZm9ybWF0U2VwYXJhdG9yOm4uZm9ybWF0U2VwYXJhdG9yfHwiLCIsdGhpcy51bmVzY2FwZVByZWZpeD1uLnVuZXNjYXBlU3VmZml4PyIiOm4udW5lc2NhcGVQcmVmaXh8fCItIix0aGlzLnVuZXNjYXBlU3VmZml4PXRoaXMudW5lc2NhcGVQcmVmaXg/IiI6bi51bmVzY2FwZVN1ZmZpeHx8IiIsdGhpcy5uZXN0aW5nUHJlZml4PW4ubmVzdGluZ1ByZWZpeD9BKG4ubmVzdGluZ1ByZWZpeCk6bi5uZXN0aW5nUHJlZml4RXNjYXBlZHx8QSgiJHQoIiksdGhpcy5uZXN0aW5nU3VmZml4PW4ubmVzdGluZ1N1ZmZpeD9BKG4ubmVzdGluZ1N1ZmZpeCk6bi5uZXN0aW5nU3VmZml4RXNjYXBlZHx8QSgiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9bi5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9uLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOm4ubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPW4ubWF4UmVwbGFjZXM/bi5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9bi5hbHdheXNGb3JtYXQhPT12b2lkIDA/bi5hbHdheXNGb3JtYXQ6ITEsdGhpcy5yZXNldFJlZ0V4cCgpfX0se2tleToicmVzZXQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zJiZ0aGlzLmluaXQodGhpcy5vcHRpb25zKX19LHtrZXk6InJlc2V0UmVnRXhwIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PSIiLmNvbmNhdCh0aGlzLnByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwPW5ldyBSZWdFeHAodCwiZyIpO3ZhciBuPSIiLmNvbmNhdCh0aGlzLnByZWZpeCkuY29uY2F0KHRoaXMudW5lc2NhcGVQcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMudW5lc2NhcGVTdWZmaXgpLmNvbmNhdCh0aGlzLnN1ZmZpeCk7dGhpcy5yZWdleHBVbmVzY2FwZT1uZXcgUmVnRXhwKG4sImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5uZXN0aW5nUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLm5lc3RpbmdTdWZmaXgpO3RoaXMubmVzdGluZ1JlZ2V4cD1uZXcgUmVnRXhwKGUsImciKX19LHtrZXk6ImludGVycG9sYXRlIix2YWx1ZTpmdW5jdGlvbih0LG4sZSxhKXt2YXIgbz10aGlzLHUscyxsLGY9dGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlc3x8e307ZnVuY3Rpb24gYyhtKXtyZXR1cm4gbS5yZXBsYWNlKC9cJC9nLCIkJCQkIil9dmFyIGc9ZnVuY3Rpb24oZCl7aWYoZC5pbmRleE9mKG8uZm9ybWF0U2VwYXJhdG9yKTwwKXt2YXIgaD13ZShuLGYsZCk7cmV0dXJuIG8uYWx3YXlzRm9ybWF0P28uZm9ybWF0KGgsdm9pZCAwLGUsTChMKEwoe30sYSksbikse30se2ludGVycG9sYXRpb25rZXk6ZH0pKTpofXZhciBPPWQuc3BsaXQoby5mb3JtYXRTZXBhcmF0b3IpLGI9Ty5zaGlmdCgpLnRyaW0oKSx4PU8uam9pbihvLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBvLmZvcm1hdCh3ZShuLGYsYikseCxlLEwoTChMKHt9LGEpLG4pLHt9LHtpbnRlcnBvbGF0aW9ua2V5OmJ9KSl9O3RoaXMucmVzZXRSZWdFeHAoKTt2YXIgcD1hJiZhLm1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcnx8dGhpcy5vcHRpb25zLm1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcix2PWEmJmEuaW50ZXJwb2xhdGlvbiYmYS5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyE9PXZvaWQgMD9hLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzOnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyx5PVt7cmVnZXg6dGhpcy5yZWdleHBVbmVzY2FwZSxzYWZlVmFsdWU6ZnVuY3Rpb24oZCl7cmV0dXJuIGMoZCl9fSx7cmVnZXg6dGhpcy5yZWdleHAsc2FmZVZhbHVlOmZ1bmN0aW9uKGQpe3JldHVybiBvLmVzY2FwZVZhbHVlP2Moby5lc2NhcGUoZCkpOmMoZCl9fV07cmV0dXJuIHkuZm9yRWFjaChmdW5jdGlvbihtKXtmb3IobD0wO3U9bS5yZWdleC5leGVjKHQpOyl7dmFyIGQ9dVsxXS50cmltKCk7aWYocz1nKGQpLHM9PT12b2lkIDApaWYodHlwZW9mIHA9PSJmdW5jdGlvbiIpe3ZhciBoPXAodCx1LGEpO3M9dHlwZW9mIGg9PSJzdHJpbmciP2g6IiJ9ZWxzZSBpZihhJiZhLmhhc093blByb3BlcnR5KGQpKXM9IiI7ZWxzZSBpZih2KXtzPXVbMF07Y29udGludWV9ZWxzZSBvLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSAiLmNvbmNhdChkLCIgZm9yIGludGVycG9sYXRpbmcgIikuY29uY2F0KHQpKSxzPSIiO2Vsc2UgdHlwZW9mIHMhPSJzdHJpbmciJiYhby51c2VSYXdWYWx1ZVRvRXNjYXBlJiYocz1iZShzKSk7dmFyIE89bS5zYWZlVmFsdWUocyk7aWYodD10LnJlcGxhY2UodVswXSxPKSx2PyhtLnJlZ2V4Lmxhc3RJbmRleCs9cy5sZW5ndGgsbS5yZWdleC5sYXN0SW5kZXgtPXVbMF0ubGVuZ3RoKTptLnJlZ2V4Lmxhc3RJbmRleD0wLGwrKyxsPj1vLm1heFJlcGxhY2VzKWJyZWFrfX0pLHR9fSx7a2V5OiJuZXN0Iix2YWx1ZTpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMsYT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sbyx1LHM9TCh7fSxhKTtzLmFwcGx5UG9zdFByb2Nlc3Nvcj0hMSxkZWxldGUgcy5kZWZhdWx0VmFsdWU7ZnVuY3Rpb24gbChwLHYpe3ZhciB5PXRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I7aWYocC5pbmRleE9mKHkpPDApcmV0dXJuIHA7dmFyIG09cC5zcGxpdChuZXcgUmVnRXhwKCIiLmNvbmNhdCh5LCJbIF0qeyIpKSksZD0ieyIuY29uY2F0KG1bMV0pO3A9bVswXSxkPXRoaXMuaW50ZXJwb2xhdGUoZCxzKTt2YXIgaD1kLm1hdGNoKC8nL2cpLE89ZC5tYXRjaCgvIi9nKTsoaCYmaC5sZW5ndGglMj09PTAmJiFPfHxPLmxlbmd0aCUyIT09MCkmJihkPWQucmVwbGFjZSgvJy9nLCciJykpO3RyeXtzPUpTT04ucGFyc2UoZCksdiYmKHM9TChMKHt9LHYpLHMpKX1jYXRjaChiKXtyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5ICIuY29uY2F0KHApLGIpLCIiLmNvbmNhdChwKS5jb25jYXQoeSkuY29uY2F0KGQpfXJldHVybiBkZWxldGUgcy5kZWZhdWx0VmFsdWUscH1mb3IoO289dGhpcy5uZXN0aW5nUmVnZXhwLmV4ZWModCk7KXt2YXIgZj1bXSxjPSExO2lmKG9bMF0uaW5kZXhPZih0aGlzLmZvcm1hdFNlcGFyYXRvcikhPT0tMSYmIS97Lip9Ly50ZXN0KG9bMV0pKXt2YXIgZz1vWzFdLnNwbGl0KHRoaXMuZm9ybWF0U2VwYXJhdG9yKS5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIHAudHJpbSgpfSk7b1sxXT1nLnNoaWZ0KCksZj1nLGM9ITB9aWYodT1uKGwuY2FsbCh0aGlzLG9bMV0udHJpbSgpLHMpLHMpLHUmJm9bMF09PT10JiZ0eXBlb2YgdSE9InN0cmluZyIpcmV0dXJuIHU7dHlwZW9mIHUhPSJzdHJpbmciJiYodT1iZSh1KSksdXx8KHRoaXMubG9nZ2VyLndhcm4oIm1pc3NlZCB0byByZXNvbHZlICIuY29uY2F0KG9bMV0sIiBmb3IgbmVzdGluZyAiKS5jb25jYXQodCkpLHU9IiIpLGMmJih1PWYucmVkdWNlKGZ1bmN0aW9uKHAsdil7cmV0dXJuIGUuZm9ybWF0KHAsdixhLmxuZyxMKEwoe30sYSkse30se2ludGVycG9sYXRpb25rZXk6b1sxXS50cmltKCl9KSl9LHUudHJpbSgpKSksdD10LnJlcGxhY2Uob1swXSx1KSx0aGlzLnJlZ2V4cC5sYXN0SW5kZXg9MH1yZXR1cm4gdH19XSksaX0oKTtmdW5jdGlvbiBDZShpLHIpe3ZhciB0PU9iamVjdC5rZXlzKGkpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaSk7ciYmKG49bi5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKS5lbnVtZXJhYmxlfSkpLHQucHVzaC5hcHBseSh0LG4pfXJldHVybiB0fWZ1bmN0aW9uIEkoaSl7Zm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl7dmFyIHQ9YXJndW1lbnRzW3JdIT1udWxsP2FyZ3VtZW50c1tyXTp7fTtyJTI/Q2UoT2JqZWN0KHQpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe0YoaSxuLHRbbl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSk6Q2UoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLG4sT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pKX0pfXJldHVybiBpfWZ1bmN0aW9uIHZ0KGkpe3ZhciByPWkudG9Mb3dlckNhc2UoKS50cmltKCksdD17fTtpZihpLmluZGV4T2YoIigiKT4tMSl7dmFyIG49aS5zcGxpdCgiKCIpO3I9blswXS50b0xvd2VyQ2FzZSgpLnRyaW0oKTt2YXIgZT1uWzFdLnN1YnN0cmluZygwLG5bMV0ubGVuZ3RoLTEpO2lmKHI9PT0iY3VycmVuY3kiJiZlLmluZGV4T2YoIjoiKTwwKXQuY3VycmVuY3l8fCh0LmN1cnJlbmN5PWUudHJpbSgpKTtlbHNlIGlmKHI9PT0icmVsYXRpdmV0aW1lIiYmZS5pbmRleE9mKCI6Iik8MCl0LnJhbmdlfHwodC5yYW5nZT1lLnRyaW0oKSk7ZWxzZXt2YXIgYT1lLnNwbGl0KCI7Iik7YS5mb3JFYWNoKGZ1bmN0aW9uKG8pe2lmKG8pe3ZhciB1PW8uc3BsaXQoIjoiKSxzPVFlKHUpLGw9c1swXSxmPXMuc2xpY2UoMSksYz1mLmpvaW4oIjoiKS50cmltKCkucmVwbGFjZSgvXicrfCcrJC9nLCIiKTt0W2wudHJpbSgpXXx8KHRbbC50cmltKCldPWMpLGM9PT0iZmFsc2UiJiYodFtsLnRyaW0oKV09ITEpLGM9PT0idHJ1ZSImJih0W2wudHJpbSgpXT0hMCksaXNOYU4oYyl8fCh0W2wudHJpbSgpXT1wYXJzZUludChjLDEwKSl9fSl9fXJldHVybntmb3JtYXROYW1lOnIsZm9ybWF0T3B0aW9uczp0fX1mdW5jdGlvbiBWKGkpe3ZhciByPXt9O3JldHVybiBmdW5jdGlvbihuLGUsYSl7dmFyIG89ZStKU09OLnN0cmluZ2lmeShhKSx1PXJbb107cmV0dXJuIHV8fCh1PWkoZSxhKSxyW29dPXUpLHUobil9fXZhciBtdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGkoKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e307ayh0aGlzLGkpLHRoaXMubG9nZ2VyPU4uY3JlYXRlKCJmb3JtYXR0ZXIiKSx0aGlzLm9wdGlvbnM9cix0aGlzLmZvcm1hdHM9e251bWJlcjpWKGZ1bmN0aW9uKHQsbil7dmFyIGU9bmV3IEludGwuTnVtYmVyRm9ybWF0KHQsbik7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBlLmZvcm1hdChhKX19KSxjdXJyZW5jeTpWKGZ1bmN0aW9uKHQsbil7dmFyIGU9bmV3IEludGwuTnVtYmVyRm9ybWF0KHQsSShJKHt9LG4pLHt9LHtzdHlsZToiY3VycmVuY3kifSkpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSl9fSksZGF0ZXRpbWU6VihmdW5jdGlvbih0LG4pe3ZhciBlPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHQsSSh7fSxuKSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBlLmZvcm1hdChhKX19KSxyZWxhdGl2ZXRpbWU6VihmdW5jdGlvbih0LG4pe3ZhciBlPW5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdCh0LEkoe30sbikpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSxuLnJhbmdlfHwiZGF5Iil9fSksbGlzdDpWKGZ1bmN0aW9uKHQsbil7dmFyIGU9bmV3IEludGwuTGlzdEZvcm1hdCh0LEkoe30sbikpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSl9fSl9LHRoaXMuaW5pdChyKX1yZXR1cm4gUihpLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319LGU9bi5pbnRlcnBvbGF0aW9uO3RoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCJ9fSx7a2V5OiJhZGQiLHZhbHVlOmZ1bmN0aW9uKHQsbil7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPW59fSx7a2V5OiJhZGRDYWNoZWQiLHZhbHVlOmZ1bmN0aW9uKHQsbil7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPVYobil9fSx7a2V5OiJmb3JtYXQiLHZhbHVlOmZ1bmN0aW9uKHQsbixlLGEpe3ZhciBvPXRoaXMsdT1uLnNwbGl0KHRoaXMuZm9ybWF0U2VwYXJhdG9yKSxzPXUucmVkdWNlKGZ1bmN0aW9uKGwsZil7dmFyIGM9dnQoZiksZz1jLmZvcm1hdE5hbWUscD1jLmZvcm1hdE9wdGlvbnM7aWYoby5mb3JtYXRzW2ddKXt2YXIgdj1sO3RyeXt2YXIgeT1hJiZhLmZvcm1hdFBhcmFtcyYmYS5mb3JtYXRQYXJhbXNbYS5pbnRlcnBvbGF0aW9ua2V5XXx8e30sbT15LmxvY2FsZXx8eS5sbmd8fGEubG9jYWxlfHxhLmxuZ3x8ZTt2PW8uZm9ybWF0c1tnXShsLG0sSShJKEkoe30scCksYSkseSkpfWNhdGNoKGQpe28ubG9nZ2VyLndhcm4oZCl9cmV0dXJuIHZ9ZWxzZSBvLmxvZ2dlci53YXJuKCJ0aGVyZSB3YXMgbm8gZm9ybWF0IGZ1bmN0aW9uIGZvciAiLmNvbmNhdChnKSk7cmV0dXJuIGx9LHQpO3JldHVybiBzfX1dKSxpfSgpO2Z1bmN0aW9uIEVlKGkscil7dmFyIHQ9T2JqZWN0LmtleXMoaSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhpKTtyJiYobj1uLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLGUpLmVudW1lcmFibGV9KSksdC5wdXNoLmFwcGx5KHQsbil9cmV0dXJuIHR9ZnVuY3Rpb24gRmUoaSl7Zm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl7dmFyIHQ9YXJndW1lbnRzW3JdIT1udWxsP2FyZ3VtZW50c1tyXTp7fTtyJTI/RWUoT2JqZWN0KHQpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe0YoaSxuLHRbbl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSk6RWUoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLG4sT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pKX0pfXJldHVybiBpfWZ1bmN0aW9uIHl0KGkpe3ZhciByPWJ0KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49aihpKSxlO2lmKHIpe3ZhciBhPWoodGhpcykuY29uc3RydWN0b3I7ZT1SZWZsZWN0LmNvbnN0cnVjdChuLGFyZ3VtZW50cyxhKX1lbHNlIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIEIodGhpcyxlKX19ZnVuY3Rpb24gYnQoKXtpZih0eXBlb2YgUmVmbGVjdD4idSJ8fCFSZWZsZWN0LmNvbnN0cnVjdHx8UmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZih0eXBlb2YgUHJveHk9PSJmdW5jdGlvbiIpcmV0dXJuITA7dHJ5e3JldHVybiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbixbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gT3QoaSxyKXtpLnBlbmRpbmdbcl0hPT12b2lkIDAmJihkZWxldGUgaS5wZW5kaW5nW3JdLGkucGVuZGluZ0NvdW50LS0pfXZhciB3dD1mdW5jdGlvbihpKXtxKHQsaSk7dmFyIHI9eXQodCk7ZnVuY3Rpb24gdChuLGUsYSl7dmFyIG8sdT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106e307cmV0dXJuIGsodGhpcyx0KSxvPXIuY2FsbCh0aGlzKSxaJiZfLmNhbGwoRShvKSksby5iYWNrZW5kPW4sby5zdG9yZT1lLG8uc2VydmljZXM9YSxvLmxhbmd1YWdlVXRpbHM9YS5sYW5ndWFnZVV0aWxzLG8ub3B0aW9ucz11LG8ubG9nZ2VyPU4uY3JlYXRlKCJiYWNrZW5kQ29ubmVjdG9yIiksby53YWl0aW5nUmVhZHM9W10sby5tYXhQYXJhbGxlbFJlYWRzPXUubWF4UGFyYWxsZWxSZWFkc3x8MTAsby5yZWFkaW5nQ2FsbHM9MCxvLm1heFJldHJpZXM9dS5tYXhSZXRyaWVzPj0wP3UubWF4UmV0cmllczo1LG8ucmV0cnlUaW1lb3V0PXUucmV0cnlUaW1lb3V0Pj0xP3UucmV0cnlUaW1lb3V0OjM1MCxvLnN0YXRlPXt9LG8ucXVldWU9W10sby5iYWNrZW5kJiZvLmJhY2tlbmQuaW5pdCYmby5iYWNrZW5kLmluaXQoYSx1LmJhY2tlbmQsdSksb31yZXR1cm4gUih0LFt7a2V5OiJxdWV1ZUxvYWQiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvLHUpe3ZhciBzPXRoaXMsbD17fSxmPXt9LGM9e30sZz17fTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKHApe3ZhciB2PSEwO2EuZm9yRWFjaChmdW5jdGlvbih5KXt2YXIgbT0iIi5jb25jYXQocCwifCIpLmNvbmNhdCh5KTshby5yZWxvYWQmJnMuc3RvcmUuaGFzUmVzb3VyY2VCdW5kbGUocCx5KT9zLnN0YXRlW21dPTI6cy5zdGF0ZVttXTwwfHwocy5zdGF0ZVttXT09PTE/ZlttXT09PXZvaWQgMCYmKGZbbV09ITApOihzLnN0YXRlW21dPTEsdj0hMSxmW21dPT09dm9pZCAwJiYoZlttXT0hMCksbFttXT09PXZvaWQgMCYmKGxbbV09ITApLGdbeV09PT12b2lkIDAmJihnW3ldPSEwKSkpfSksdnx8KGNbcF09ITApfSksKE9iamVjdC5rZXlzKGwpLmxlbmd0aHx8T2JqZWN0LmtleXMoZikubGVuZ3RoKSYmdGhpcy5xdWV1ZS5wdXNoKHtwZW5kaW5nOmYscGVuZGluZ0NvdW50Ok9iamVjdC5rZXlzKGYpLmxlbmd0aCxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnV9KSx7dG9Mb2FkOk9iamVjdC5rZXlzKGwpLHBlbmRpbmc6T2JqZWN0LmtleXMoZiksdG9Mb2FkTGFuZ3VhZ2VzOk9iamVjdC5rZXlzKGMpLHRvTG9hZE5hbWVzcGFjZXM6T2JqZWN0LmtleXMoZyl9fX0se2tleToibG9hZGVkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHU9ZS5zcGxpdCgifCIpLHM9dVswXSxsPXVbMV07YSYmdGhpcy5lbWl0KCJmYWlsZWRMb2FkaW5nIixzLGwsYSksbyYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZUJ1bmRsZShzLGwsbyksdGhpcy5zdGF0ZVtlXT1hPy0xOjI7dmFyIGY9e307dGhpcy5xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGMpe1plKGMubG9hZGVkLFtzXSxsKSxPdChjLGUpLGEmJmMuZXJyb3JzLnB1c2goYSksYy5wZW5kaW5nQ291bnQ9PT0wJiYhYy5kb25lJiYoT2JqZWN0LmtleXMoYy5sb2FkZWQpLmZvckVhY2goZnVuY3Rpb24oZyl7ZltnXXx8KGZbZ109e30pO3ZhciBwPWMubG9hZGVkW2ddO3AubGVuZ3RoJiZwLmZvckVhY2goZnVuY3Rpb24odil7ZltnXVt2XT09PXZvaWQgMCYmKGZbZ11bdl09ITApfSl9KSxjLmRvbmU9ITAsYy5lcnJvcnMubGVuZ3RoP2MuY2FsbGJhY2soYy5lcnJvcnMpOmMuY2FsbGJhY2soKSl9KSx0aGlzLmVtaXQoImxvYWRlZCIsZiksdGhpcy5xdWV1ZT10aGlzLnF1ZXVlLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4hYy5kb25lfSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHU9dGhpcyxzPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTowLGw9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOnRoaXMucmV0cnlUaW1lb3V0LGY9YXJndW1lbnRzLmxlbmd0aD41P2FyZ3VtZW50c1s1XTp2b2lkIDA7aWYoIWUubGVuZ3RoKXJldHVybiBmKG51bGwse30pO2lmKHRoaXMucmVhZGluZ0NhbGxzPj10aGlzLm1heFBhcmFsbGVsUmVhZHMpe3RoaXMud2FpdGluZ1JlYWRzLnB1c2goe2xuZzplLG5zOmEsZmNOYW1lOm8sdHJpZWQ6cyx3YWl0OmwsY2FsbGJhY2s6Zn0pO3JldHVybn1yZXR1cm4gdGhpcy5yZWFkaW5nQ2FsbHMrKyx0aGlzLmJhY2tlbmRbb10oZSxhLGZ1bmN0aW9uKGMsZyl7aWYodS5yZWFkaW5nQ2FsbHMtLSx1LndhaXRpbmdSZWFkcy5sZW5ndGg+MCl7dmFyIHA9dS53YWl0aW5nUmVhZHMuc2hpZnQoKTt1LnJlYWQocC5sbmcscC5ucyxwLmZjTmFtZSxwLnRyaWVkLHAud2FpdCxwLmNhbGxiYWNrKX1pZihjJiZnJiZzPHUubWF4UmV0cmllcyl7c2V0VGltZW91dChmdW5jdGlvbigpe3UucmVhZC5jYWxsKHUsZSxhLG8scysxLGwqMixmKX0sbCk7cmV0dXJufWYoYyxnKX0pfX0se2tleToicHJlcGFyZUxvYWRpbmciLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89dGhpcyx1PWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp7fSxzPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwO2lmKCF0aGlzLmJhY2tlbmQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIk5vIGJhY2tlbmQgd2FzIGFkZGVkIHZpYSBpMThuZXh0LnVzZS4gV2lsbCBub3QgbG9hZCByZXNvdXJjZXMuIikscyYmcygpO3R5cGVvZiBlPT0ic3RyaW5nIiYmKGU9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShlKSksdHlwZW9mIGE9PSJzdHJpbmciJiYoYT1bYV0pO3ZhciBsPXRoaXMucXVldWVMb2FkKGUsYSx1LHMpO2lmKCFsLnRvTG9hZC5sZW5ndGgpcmV0dXJuIGwucGVuZGluZy5sZW5ndGh8fHMoKSxudWxsO2wudG9Mb2FkLmZvckVhY2goZnVuY3Rpb24oZil7by5sb2FkT25lKGYpfSl9fSx7a2V5OiJsb2FkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dGhpcy5wcmVwYXJlTG9hZGluZyhlLGEse30sbyl9fSx7a2V5OiJyZWxvYWQiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt0aGlzLnByZXBhcmVMb2FkaW5nKGUsYSx7cmVsb2FkOiEwfSxvKX19LHtrZXk6ImxvYWRPbmUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06IiIsdT1lLnNwbGl0KCJ8Iikscz11WzBdLGw9dVsxXTt0aGlzLnJlYWQocyxsLCJyZWFkIix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKGYsYyl7ZiYmYS5sb2dnZXIud2FybigiIi5jb25jYXQobywibG9hZGluZyBuYW1lc3BhY2UgIikuY29uY2F0KGwsIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KHMsIiBmYWlsZWQiKSxmKSwhZiYmYyYmYS5sb2dnZXIubG9nKCIiLmNvbmNhdChvLCJsb2FkZWQgbmFtZXNwYWNlICIpLmNvbmNhdChsLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChzKSxjKSxhLmxvYWRlZChlLGYsYyl9KX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbihlLGEsbyx1LHMpe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTp7fTtpZih0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGEpKXt0aGlzLmxvZ2dlci53YXJuKCdkaWQgbm90IHNhdmUga2V5ICInLmNvbmNhdChvLCciIGFzIHRoZSBuYW1lc3BhY2UgIicpLmNvbmNhdChhLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKTtyZXR1cm59bz09bnVsbHx8bz09PSIifHwodGhpcy5iYWNrZW5kJiZ0aGlzLmJhY2tlbmQuY3JlYXRlJiZ0aGlzLmJhY2tlbmQuY3JlYXRlKGUsYSxvLHUsbnVsbCxGZShGZSh7fSxsKSx7fSx7aXNVcGRhdGU6c30pKSwhKCFlfHwhZVswXSkmJnRoaXMuc3RvcmUuYWRkUmVzb3VyY2UoZVswXSxhLG8sdSkpfX1dKSx0fShfKTtmdW5jdGlvbiBTdCgpe3JldHVybntkZWJ1ZzohMSxpbml0SW1tZWRpYXRlOiEwLG5zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6WyJ0cmFuc2xhdGlvbiJdLGZhbGxiYWNrTG5nOlsiZGV2Il0sZmFsbGJhY2tOUzohMSxzdXBwb3J0ZWRMbmdzOiExLG5vbkV4cGxpY2l0U3VwcG9ydGVkTG5nczohMSxsb2FkOiJhbGwiLHByZWxvYWQ6ITEsc2ltcGxpZnlQbHVyYWxTdWZmaXg6ITAsa2V5U2VwYXJhdG9yOiIuIixuc1NlcGFyYXRvcjoiOiIscGx1cmFsU2VwYXJhdG9yOiJfIixjb250ZXh0U2VwYXJhdG9yOiJfIixwYXJ0aWFsQnVuZGxlZExhbmd1YWdlczohMSxzYXZlTWlzc2luZzohMSx1cGRhdGVNaXNzaW5nOiExLHNhdmVNaXNzaW5nVG86ImZhbGxiYWNrIixzYXZlTWlzc2luZ1BsdXJhbHM6ITAsbWlzc2luZ0tleUhhbmRsZXI6ITEsbWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyOiExLHBvc3RQcm9jZXNzOiExLHBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkOiExLHJldHVybk51bGw6ITAscmV0dXJuRW1wdHlTdHJpbmc6ITAscmV0dXJuT2JqZWN0czohMSxqb2luQXJyYXlzOiExLHJldHVybmVkT2JqZWN0SGFuZGxlcjohMSxwYXJzZU1pc3NpbmdLZXlIYW5kbGVyOiExLGFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleTohMSxhcHBlbmROYW1lc3BhY2VUb0NJTW9kZTohMSxvdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcjpmdW5jdGlvbihyKXt2YXIgdD17fTtpZihQKHJbMV0pPT09Im9iamVjdCImJih0PXJbMV0pLHR5cGVvZiByWzFdPT0ic3RyaW5nIiYmKHQuZGVmYXVsdFZhbHVlPXJbMV0pLHR5cGVvZiByWzJdPT0ic3RyaW5nIiYmKHQudERlc2NyaXB0aW9uPXJbMl0pLFAoclsyXSk9PT0ib2JqZWN0Inx8UChyWzNdKT09PSJvYmplY3QiKXt2YXIgbj1yWzNdfHxyWzJdO09iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1uW2VdfSl9cmV0dXJuIHR9LGludGVycG9sYXRpb246e2VzY2FwZVZhbHVlOiEwLGZvcm1hdDpmdW5jdGlvbihyLHQsbixlKXtyZXR1cm4gcn0scHJlZml4OiJ7eyIsc3VmZml4OiJ9fSIsZm9ybWF0U2VwYXJhdG9yOiIsIix1bmVzY2FwZVByZWZpeDoiLSIsbmVzdGluZ1ByZWZpeDoiJHQoIixuZXN0aW5nU3VmZml4OiIpIixuZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjoiLCIsbWF4UmVwbGFjZXM6MWUzLHNraXBPblZhcmlhYmxlczohMH19fWZ1bmN0aW9uIF9lKGkpe3JldHVybiB0eXBlb2YgaS5ucz09InN0cmluZyImJihpLm5zPVtpLm5zXSksdHlwZW9mIGkuZmFsbGJhY2tMbmc9PSJzdHJpbmciJiYoaS5mYWxsYmFja0xuZz1baS5mYWxsYmFja0xuZ10pLHR5cGVvZiBpLmZhbGxiYWNrTlM9PSJzdHJpbmciJiYoaS5mYWxsYmFja05TPVtpLmZhbGxiYWNrTlNdKSxpLnN1cHBvcnRlZExuZ3MmJmkuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCJjaW1vZGUiKTwwJiYoaS5zdXBwb3J0ZWRMbmdzPWkuc3VwcG9ydGVkTG5ncy5jb25jYXQoWyJjaW1vZGUiXSkpLGl9ZnVuY3Rpb24gSWUoaSxyKXt2YXIgdD1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3ImJihuPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSx0LnB1c2guYXBwbHkodCxuKX1yZXR1cm4gdH1mdW5jdGlvbiBEKGkpe2Zvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspe3ZhciB0PWFyZ3VtZW50c1tyXSE9bnVsbD9hcmd1bWVudHNbcl06e307ciUyP0llKE9iamVjdCh0KSwhMCkuZm9yRWFjaChmdW5jdGlvbihuKXtGKGksbix0W25dKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpOkllKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbihuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxuLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiB4dChpKXt2YXIgcj1QdCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWooaSksZTtpZihyKXt2YXIgYT1qKHRoaXMpLmNvbnN0cnVjdG9yO2U9UmVmbGVjdC5jb25zdHJ1Y3Qobixhcmd1bWVudHMsYSl9ZWxzZSBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBCKHRoaXMsZSl9fWZ1bmN0aW9uIFB0KCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIHRlKCl7fWZ1bmN0aW9uIEx0KGkpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZihpKSk7ci5mb3JFYWNoKGZ1bmN0aW9uKHQpe3R5cGVvZiBpW3RdPT0iZnVuY3Rpb24iJiYoaVt0XT1pW3RdLmJpbmQoaSkpfSl9dmFyIG5lPWZ1bmN0aW9uKGkpe3EodCxpKTt2YXIgcj14dCh0KTtmdW5jdGlvbiB0KCl7dmFyIG4sZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e30sYT1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZihrKHRoaXMsdCksbj1yLmNhbGwodGhpcyksWiYmXy5jYWxsKEUobikpLG4ub3B0aW9ucz1fZShlKSxuLnNlcnZpY2VzPXt9LG4ubG9nZ2VyPU4sbi5tb2R1bGVzPXtleHRlcm5hbDpbXX0sTHQoRShuKSksYSYmIW4uaXNJbml0aWFsaXplZCYmIWUuaXNDbG9uZSl7aWYoIW4ub3B0aW9ucy5pbml0SW1tZWRpYXRlKXJldHVybiBuLmluaXQoZSxhKSxCKG4sRShuKSk7c2V0VGltZW91dChmdW5jdGlvbigpe24uaW5pdChlLGEpfSwwKX1yZXR1cm4gbn1yZXR1cm4gUih0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsYT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e30sbz1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDt0eXBlb2YgYT09ImZ1bmN0aW9uIiYmKG89YSxhPXt9KSwhYS5kZWZhdWx0TlMmJmEuZGVmYXVsdE5TIT09ITEmJmEubnMmJih0eXBlb2YgYS5ucz09InN0cmluZyI/YS5kZWZhdWx0TlM9YS5uczphLm5zLmluZGV4T2YoInRyYW5zbGF0aW9uIik8MCYmKGEuZGVmYXVsdE5TPWEubnNbMF0pKTt2YXIgdT1TdCgpO3RoaXMub3B0aW9ucz1EKEQoRCh7fSx1KSx0aGlzLm9wdGlvbnMpLF9lKGEpKSx0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSE9PSJ2MSImJih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbj1EKEQoe30sdS5pbnRlcnBvbGF0aW9uKSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbikpLGEua2V5U2VwYXJhdG9yIT09dm9pZCAwJiYodGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yPWEua2V5U2VwYXJhdG9yKSxhLm5zU2VwYXJhdG9yIT09dm9pZCAwJiYodGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkTnNTZXBhcmF0b3I9YS5uc1NlcGFyYXRvcik7ZnVuY3Rpb24gcyhkKXtyZXR1cm4gZD90eXBlb2YgZD09ImZ1bmN0aW9uIj9uZXcgZDpkOm51bGx9aWYoIXRoaXMub3B0aW9ucy5pc0Nsb25lKXt0aGlzLm1vZHVsZXMubG9nZ2VyP04uaW5pdChzKHRoaXMubW9kdWxlcy5sb2dnZXIpLHRoaXMub3B0aW9ucyk6Ti5pbml0KG51bGwsdGhpcy5vcHRpb25zKTt2YXIgbDt0aGlzLm1vZHVsZXMuZm9ybWF0dGVyP2w9dGhpcy5tb2R1bGVzLmZvcm1hdHRlcjp0eXBlb2YgSW50bDwidSImJihsPW10KTt2YXIgZj1uZXcgZnQodGhpcy5vcHRpb25zKTt0aGlzLnN0b3JlPW5ldyBvdCh0aGlzLm9wdGlvbnMucmVzb3VyY2VzLHRoaXMub3B0aW9ucyk7dmFyIGM9dGhpcy5zZXJ2aWNlcztjLmxvZ2dlcj1OLGMucmVzb3VyY2VTdG9yZT10aGlzLnN0b3JlLGMubGFuZ3VhZ2VVdGlscz1mLGMucGx1cmFsUmVzb2x2ZXI9bmV3IGR0KGYse3ByZXBlbmQ6dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcixjb21wYXRpYmlsaXR5SlNPTjp0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04sc2ltcGxpZnlQbHVyYWxTdWZmaXg6dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4fSksbCYmKCF0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXR8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdD09PXUuaW50ZXJwb2xhdGlvbi5mb3JtYXQpJiYoYy5mb3JtYXR0ZXI9cyhsKSxjLmZvcm1hdHRlci5pbml0KGMsdGhpcy5vcHRpb25zKSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQ9Yy5mb3JtYXR0ZXIuZm9ybWF0LmJpbmQoYy5mb3JtYXR0ZXIpKSxjLmludGVycG9sYXRvcj1uZXcgaHQodGhpcy5vcHRpb25zKSxjLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKX0sYy5iYWNrZW5kQ29ubmVjdG9yPW5ldyB3dChzKHRoaXMubW9kdWxlcy5iYWNrZW5kKSxjLnJlc291cmNlU3RvcmUsYyx0aGlzLm9wdGlvbnMpLGMuYmFja2VuZENvbm5lY3Rvci5vbigiKiIsZnVuY3Rpb24oZCl7Zm9yKHZhciBoPWFyZ3VtZW50cy5sZW5ndGgsTz1uZXcgQXJyYXkoaD4xP2gtMTowKSxiPTE7YjxoO2IrKylPW2ItMV09YXJndW1lbnRzW2JdO2UuZW1pdC5hcHBseShlLFtkXS5jb25jYXQoTykpfSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJihjLmxhbmd1YWdlRGV0ZWN0b3I9cyh0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksYy5sYW5ndWFnZURldGVjdG9yLmluaXQoYyx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYoYy5pMThuRm9ybWF0PXModGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLGMuaTE4bkZvcm1hdC5pbml0JiZjLmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBqZSh0aGlzLnNlcnZpY2VzLHRoaXMub3B0aW9ucyksdGhpcy50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihkKXtmb3IodmFyIGg9YXJndW1lbnRzLmxlbmd0aCxPPW5ldyBBcnJheShoPjE/aC0xOjApLGI9MTtiPGg7YisrKU9bYi0xXT1hcmd1bWVudHNbYl07ZS5lbWl0LmFwcGx5KGUsW2RdLmNvbmNhdChPKSl9KSx0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChmdW5jdGlvbihkKXtkLmluaXQmJmQuaW5pdChlKX0pfWlmKHRoaXMuZm9ybWF0PXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCxvfHwobz10ZSksdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nJiYhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5vcHRpb25zLmxuZyl7dmFyIGc9dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtnLmxlbmd0aD4wJiZnWzBdIT09ImRldiImJih0aGlzLm9wdGlvbnMubG5nPWdbMF0pfSF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJiF0aGlzLm9wdGlvbnMubG5nJiZ0aGlzLmxvZ2dlci53YXJuKCJpbml0OiBubyBsYW5ndWFnZURldGVjdG9yIGlzIHVzZWQgYW5kIG5vIGxuZyBpcyBkZWZpbmVkIik7dmFyIHA9WyJnZXRSZXNvdXJjZSIsImhhc1Jlc291cmNlQnVuZGxlIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJnZXREYXRhQnlMYW5ndWFnZSJdO3AuZm9yRWFjaChmdW5jdGlvbihkKXtlW2RdPWZ1bmN0aW9uKCl7dmFyIGg7cmV0dXJuKGg9ZS5zdG9yZSlbZF0uYXBwbHkoaCxhcmd1bWVudHMpfX0pO3ZhciB2PVsiYWRkUmVzb3VyY2UiLCJhZGRSZXNvdXJjZXMiLCJhZGRSZXNvdXJjZUJ1bmRsZSIsInJlbW92ZVJlc291cmNlQnVuZGxlIl07di5mb3JFYWNoKGZ1bmN0aW9uKGQpe2VbZF09ZnVuY3Rpb24oKXt2YXIgaDtyZXR1cm4oaD1lLnN0b3JlKVtkXS5hcHBseShoLGFyZ3VtZW50cyksZX19KTt2YXIgeT1LKCksbT1mdW5jdGlvbigpe3ZhciBoPWZ1bmN0aW9uKGIseCl7ZS5pc0luaXRpYWxpemVkJiYhZS5pbml0aWFsaXplZFN0b3JlT25jZSYmZS5sb2dnZXIud2FybigiaW5pdDogaTE4bmV4dCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiBZb3Ugc2hvdWxkIGNhbGwgaW5pdCBqdXN0IG9uY2UhIiksZS5pc0luaXRpYWxpemVkPSEwLGUub3B0aW9ucy5pc0Nsb25lfHxlLmxvZ2dlci5sb2coImluaXRpYWxpemVkIixlLm9wdGlvbnMpLGUuZW1pdCgiaW5pdGlhbGl6ZWQiLGUub3B0aW9ucykseS5yZXNvbHZlKHgpLG8oYix4KX07aWYoZS5sYW5ndWFnZXMmJmUub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJIT09InYxIiYmIWUuaXNJbml0aWFsaXplZClyZXR1cm4gaChudWxsLGUudC5iaW5kKGUpKTtlLmNoYW5nZUxhbmd1YWdlKGUub3B0aW9ucy5sbmcsaCl9O3JldHVybiB0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHwhdGhpcy5vcHRpb25zLmluaXRJbW1lZGlhdGU/bSgpOnNldFRpbWVvdXQobSwwKSx5fX0se2tleToibG9hZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcyxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp0ZSx1PW8scz10eXBlb2YgZT09InN0cmluZyI/ZTp0aGlzLmxhbmd1YWdlO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iJiYodT1lKSwhdGhpcy5vcHRpb25zLnJlc291cmNlc3x8dGhpcy5vcHRpb25zLnBhcnRpYWxCdW5kbGVkTGFuZ3VhZ2VzKXtpZihzJiZzLnRvTG93ZXJDYXNlKCk9PT0iY2ltb2RlIilyZXR1cm4gdSgpO3ZhciBsPVtdLGY9ZnVuY3Rpb24ocCl7aWYocCl7dmFyIHY9YS5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShwKTt2LmZvckVhY2goZnVuY3Rpb24oeSl7bC5pbmRleE9mKHkpPDAmJmwucHVzaCh5KX0pfX07aWYocylmKHMpO2Vsc2V7dmFyIGM9dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtjLmZvckVhY2goZnVuY3Rpb24oZyl7cmV0dXJuIGYoZyl9KX10aGlzLm9wdGlvbnMucHJlbG9hZCYmdGhpcy5vcHRpb25zLnByZWxvYWQuZm9yRWFjaChmdW5jdGlvbihnKXtyZXR1cm4gZihnKX0pLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5sb2FkKGwsdGhpcy5vcHRpb25zLm5zLGZ1bmN0aW9uKGcpeyFnJiYhYS5yZXNvbHZlZExhbmd1YWdlJiZhLmxhbmd1YWdlJiZhLnNldFJlc29sdmVkTGFuZ3VhZ2UoYS5sYW5ndWFnZSksdShnKX0pfWVsc2UgdShudWxsKX19LHtrZXk6InJlbG9hZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3ZhciB1PUsoKTtyZXR1cm4gZXx8KGU9dGhpcy5sYW5ndWFnZXMpLGF8fChhPXRoaXMub3B0aW9ucy5ucyksb3x8KG89dGUpLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5yZWxvYWQoZSxhLGZ1bmN0aW9uKHMpe3UucmVzb2x2ZSgpLG8ocyl9KSx1fX0se2tleToidXNlIix2YWx1ZTpmdW5jdGlvbihlKXtpZighZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhbiB1bmRlZmluZWQgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO2lmKCFlLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYSB3cm9uZyBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7cmV0dXJuIGUudHlwZT09PSJiYWNrZW5kIiYmKHRoaXMubW9kdWxlcy5iYWNrZW5kPWUpLChlLnR5cGU9PT0ibG9nZ2VyInx8ZS5sb2cmJmUud2FybiYmZS5lcnJvcikmJih0aGlzLm1vZHVsZXMubG9nZ2VyPWUpLGUudHlwZT09PSJsYW5ndWFnZURldGVjdG9yIiYmKHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yPWUpLGUudHlwZT09PSJpMThuRm9ybWF0IiYmKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0PWUpLGUudHlwZT09PSJwb3N0UHJvY2Vzc29yIiYmTGUuYWRkUG9zdFByb2Nlc3NvcihlKSxlLnR5cGU9PT0iZm9ybWF0dGVyIiYmKHRoaXMubW9kdWxlcy5mb3JtYXR0ZXI9ZSksZS50eXBlPT09IjNyZFBhcnR5IiYmdGhpcy5tb2R1bGVzLmV4dGVybmFsLnB1c2goZSksdGhpc319LHtrZXk6InNldFJlc29sdmVkTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKCEoIWV8fCF0aGlzLmxhbmd1YWdlcykmJiEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKGUpPi0xKSlmb3IodmFyIGE9MDthPHRoaXMubGFuZ3VhZ2VzLmxlbmd0aDthKyspe3ZhciBvPXRoaXMubGFuZ3VhZ2VzW2FdO2lmKCEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKG8pPi0xKSYmdGhpcy5zdG9yZS5oYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMobykpe3RoaXMucmVzb2x2ZWRMYW5ndWFnZT1vO2JyZWFrfX19fSx7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXt2YXIgbz10aGlzO3RoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG89ZTt2YXIgdT1LKCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIixlKTt2YXIgcz1mdW5jdGlvbihnKXtvLmxhbmd1YWdlPWcsby5sYW5ndWFnZXM9by5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShnKSxvLnJlc29sdmVkTGFuZ3VhZ2U9dm9pZCAwLG8uc2V0UmVzb2x2ZWRMYW5ndWFnZShnKX0sbD1mdW5jdGlvbihnLHApe3A/KHMocCksby50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKHApLG8uaXNMYW5ndWFnZUNoYW5naW5nVG89dm9pZCAwLG8uZW1pdCgibGFuZ3VhZ2VDaGFuZ2VkIixwKSxvLmxvZ2dlci5sb2coImxhbmd1YWdlQ2hhbmdlZCIscCkpOm8uaXNMYW5ndWFnZUNoYW5naW5nVG89dm9pZCAwLHUucmVzb2x2ZShmdW5jdGlvbigpe3JldHVybiBvLnQuYXBwbHkobyxhcmd1bWVudHMpfSksYSYmYShnLGZ1bmN0aW9uKCl7cmV0dXJuIG8udC5hcHBseShvLGFyZ3VtZW50cyl9KX0sZj1mdW5jdGlvbihnKXshZSYmIWcmJm8uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmKGc9W10pO3ZhciBwPXR5cGVvZiBnPT0ic3RyaW5nIj9nOm8uc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRCZXN0TWF0Y2hGcm9tQ29kZXMoZyk7cCYmKG8ubGFuZ3VhZ2V8fHMocCksby50cmFuc2xhdG9yLmxhbmd1YWdlfHxvLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2UocCksby5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiZvLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuY2FjaGVVc2VyTGFuZ3VhZ2UocCkpLG8ubG9hZFJlc291cmNlcyhwLGZ1bmN0aW9uKHYpe2wodixwKX0pfTtyZXR1cm4hZSYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdCgpKTohZSYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmM/dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdChmKTpmKGUpLHV9fSx7a2V5OiJnZXRGaXhlZFQiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgdT10aGlzLHM9ZnVuY3Rpb24gbChmLGMpe3ZhciBnO2lmKFAoYykhPT0ib2JqZWN0Iil7Zm9yKHZhciBwPWFyZ3VtZW50cy5sZW5ndGgsdj1uZXcgQXJyYXkocD4yP3AtMjowKSx5PTI7eTxwO3krKyl2W3ktMl09YXJndW1lbnRzW3ldO2c9dS5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKFtmLGNdLmNvbmNhdCh2KSl9ZWxzZSBnPUQoe30sYyk7Zy5sbmc9Zy5sbmd8fGwubG5nLGcubG5ncz1nLmxuZ3N8fGwubG5ncyxnLm5zPWcubnN8fGwubnMsZy5rZXlQcmVmaXg9Zy5rZXlQcmVmaXh8fG98fGwua2V5UHJlZml4O3ZhciBtPXUub3B0aW9ucy5rZXlTZXBhcmF0b3J8fCIuIixkPWcua2V5UHJlZml4PyIiLmNvbmNhdChnLmtleVByZWZpeCkuY29uY2F0KG0pLmNvbmNhdChmKTpmO3JldHVybiB1LnQoZCxnKX07cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIj9zLmxuZz1lOnMubG5ncz1lLHMubnM9YSxzLmtleVByZWZpeD1vLHN9fSx7a2V5OiJ0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlO3JldHVybiB0aGlzLnRyYW5zbGF0b3ImJihlPXRoaXMudHJhbnNsYXRvcikudHJhbnNsYXRlLmFwcGx5KGUsYXJndW1lbnRzKX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYoZT10aGlzLnRyYW5zbGF0b3IpLmV4aXN0cy5hcHBseShlLGFyZ3VtZW50cyl9fSx7a2V5OiJzZXREZWZhdWx0TmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLm9wdGlvbnMuZGVmYXVsdE5TPWV9fSx7a2V5OiJoYXNMb2FkZWROYW1lc3BhY2UiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e307aWYoIXRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuZXh0IHdhcyBub3QgaW5pdGlhbGl6ZWQiLHRoaXMubGFuZ3VhZ2VzKSwhMTtpZighdGhpcy5sYW5ndWFnZXN8fCF0aGlzLmxhbmd1YWdlcy5sZW5ndGgpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bi5sYW5ndWFnZXMgd2VyZSB1bmRlZmluZWQgb3IgZW1wdHkiLHRoaXMubGFuZ3VhZ2VzKSwhMTt2YXIgdT10aGlzLnJlc29sdmVkTGFuZ3VhZ2V8fHRoaXMubGFuZ3VhZ2VzWzBdLHM9dGhpcy5vcHRpb25zP3RoaXMub3B0aW9ucy5mYWxsYmFja0xuZzohMSxsPXRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aC0xXTtpZih1LnRvTG93ZXJDYXNlKCk9PT0iY2ltb2RlIilyZXR1cm4hMDt2YXIgZj1mdW5jdGlvbihwLHYpe3ZhciB5PWEuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5zdGF0ZVsiIi5jb25jYXQocCwifCIpLmNvbmNhdCh2KV07cmV0dXJuIHk9PT0tMXx8eT09PTJ9O2lmKG8ucHJlY2hlY2spe3ZhciBjPW8ucHJlY2hlY2sodGhpcyxmKTtpZihjIT09dm9pZCAwKXJldHVybiBjfXJldHVybiEhKHRoaXMuaGFzUmVzb3VyY2VCdW5kbGUodSxlKXx8IXRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5iYWNrZW5kfHx0aGlzLm9wdGlvbnMucmVzb3VyY2VzJiYhdGhpcy5vcHRpb25zLnBhcnRpYWxCdW5kbGVkTGFuZ3VhZ2VzfHxmKHUsZSkmJighc3x8ZihsLGUpKSl9fSx7a2V5OiJsb2FkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24oZSxhKXt2YXIgbz10aGlzLHU9SygpO3JldHVybiB0aGlzLm9wdGlvbnMubnM/KHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKSxlLmZvckVhY2goZnVuY3Rpb24ocyl7by5vcHRpb25zLm5zLmluZGV4T2Yocyk8MCYmby5vcHRpb25zLm5zLnB1c2gocyl9KSx0aGlzLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24ocyl7dS5yZXNvbHZlKCksYSYmYShzKX0pLHUpOihhJiZhKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToibG9hZExhbmd1YWdlcyIsdmFsdWU6ZnVuY3Rpb24oZSxhKXt2YXIgbz1LKCk7dHlwZW9mIGU9PSJzdHJpbmciJiYoZT1bZV0pO3ZhciB1PXRoaXMub3B0aW9ucy5wcmVsb2FkfHxbXSxzPWUuZmlsdGVyKGZ1bmN0aW9uKGwpe3JldHVybiB1LmluZGV4T2YobCk8MH0pO3JldHVybiBzLmxlbmd0aD8odGhpcy5vcHRpb25zLnByZWxvYWQ9dS5jb25jYXQocyksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKGwpe28ucmVzb2x2ZSgpLGEmJmEobCl9KSxvKTooYSYmYSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImRpciIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoZXx8KGU9dGhpcy5yZXNvbHZlZExhbmd1YWdlfHwodGhpcy5sYW5ndWFnZXMmJnRoaXMubGFuZ3VhZ2VzLmxlbmd0aD4wP3RoaXMubGFuZ3VhZ2VzWzBdOnRoaXMubGFuZ3VhZ2UpKSwhZSlyZXR1cm4icnRsIjt2YXIgYT1bImFyIiwic2h1Iiwic3FyIiwic3NoIiwieGFhIiwieWhkIiwieXVkIiwiYWFvIiwiYWJoIiwiYWJ2IiwiYWNtIiwiYWNxIiwiYWN3IiwiYWN4IiwiYWN5IiwiYWRmIiwiYWRzIiwiYWViIiwiYWVjIiwiYWZiIiwiYWpwIiwiYXBjIiwiYXBkIiwiYXJiIiwiYXJxIiwiYXJzIiwiYXJ5IiwiYXJ6IiwiYXV6IiwiYXZsIiwiYXloIiwiYXlsIiwiYXluIiwiYXlwIiwiYmJ6IiwicGdhIiwiaGUiLCJpdyIsInBzIiwicGJ0IiwicGJ1IiwicHN0IiwicHJwIiwicHJkIiwidWciLCJ1ciIsInlkZCIsInlkcyIsInlpaCIsImppIiwieWkiLCJoYm8iLCJtZW4iLCJ4bW4iLCJmYSIsImpwciIsInBlbyIsInBlcyIsInBycyIsImR2Iiwic2FtIiwiY2tiIl07cmV0dXJuIGEuaW5kZXhPZih0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoZSkpPi0xfHxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiLWFyYWIiKT4xPyJydGwiOiJsdHIifX0se2tleToiY2xvbmVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGE9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnRlLHU9RChEKEQoe30sdGhpcy5vcHRpb25zKSxhKSx7aXNDbG9uZTohMH0pLHM9bmV3IHQodSk7KGEuZGVidWchPT12b2lkIDB8fGEucHJlZml4IT09dm9pZCAwKSYmKHMubG9nZ2VyPXMubG9nZ2VyLmNsb25lKGEpKTt2YXIgbD1bInN0b3JlIiwic2VydmljZXMiLCJsYW5ndWFnZSJdO3JldHVybiBsLmZvckVhY2goZnVuY3Rpb24oZil7c1tmXT1lW2ZdfSkscy5zZXJ2aWNlcz1EKHt9LHRoaXMuc2VydmljZXMpLHMuc2VydmljZXMudXRpbHM9e2hhc0xvYWRlZE5hbWVzcGFjZTpzLmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKHMpfSxzLnRyYW5zbGF0b3I9bmV3IGplKHMuc2VydmljZXMscy5vcHRpb25zKSxzLnRyYW5zbGF0b3Iub24oIioiLGZ1bmN0aW9uKGYpe2Zvcih2YXIgYz1hcmd1bWVudHMubGVuZ3RoLGc9bmV3IEFycmF5KGM+MT9jLTE6MCkscD0xO3A8YztwKyspZ1twLTFdPWFyZ3VtZW50c1twXTtzLmVtaXQuYXBwbHkocyxbZl0uY29uY2F0KGcpKX0pLHMuaW5pdCh1LG8pLHMudHJhbnNsYXRvci5vcHRpb25zPXMub3B0aW9ucyxzLnRyYW5zbGF0b3IuYmFja2VuZENvbm5lY3Rvci5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQocyl9LHN9fSx7a2V5OiJ0b0pTT04iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue29wdGlvbnM6dGhpcy5vcHRpb25zLHN0b3JlOnRoaXMuc3RvcmUsbGFuZ3VhZ2U6dGhpcy5sYW5ndWFnZSxsYW5ndWFnZXM6dGhpcy5sYW5ndWFnZXMscmVzb2x2ZWRMYW5ndWFnZTp0aGlzLnJlc29sdmVkTGFuZ3VhZ2V9fX1dKSx0fShfKTtGKG5lLCJjcmVhdGVJbnN0YW5jZSIsZnVuY3Rpb24oKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtyZXR1cm4gbmV3IG5lKGkscil9KTt2YXIgUz1uZS5jcmVhdGVJbnN0YW5jZSgpO1MuY3JlYXRlSW5zdGFuY2U9bmUuY3JlYXRlSW5zdGFuY2UsUy5jcmVhdGVJbnN0YW5jZSxTLmluaXQsUy5sb2FkUmVzb3VyY2VzLFMucmVsb2FkUmVzb3VyY2VzLFMudXNlLFMuY2hhbmdlTGFuZ3VhZ2UsUy5nZXRGaXhlZFQsUy50LFMuZXhpc3RzLFMuc2V0RGVmYXVsdE5hbWVzcGFjZSxTLmhhc0xvYWRlZE5hbWVzcGFjZSxTLmxvYWROYW1lc3BhY2VzLFMubG9hZExhbmd1YWdlcztjb25zdCBUPWk9Pntjb25zdCByPWkuZ2V0RnVsbFllYXIoKSx0PWkuZ2V0TW9udGgoKSsxLG49aS5nZXREYXRlKCksZT1pLmdldEhvdXJzKCksYT1pLmdldE1pbnV0ZXMoKSxvPWkuZ2V0U2Vjb25kcygpLHU9cz0+YCR7c31gLnBhZFN0YXJ0KDIsIjAiKTtyZXR1cm5gJHtyfS0ke3UodCl9LSR7dShuKX0gJHt1KGUpfToke3UoYSl9OiR7dShvKX1gfTtmdW5jdGlvbiBrdChpLHIsdCl7dmFyIG8sdTtjb25zdCBuPShvPXIuZmluZChzPT5zLnR5cGU9PT0iZmllbGQiKSk9PW51bGw/dm9pZCAwOm8udmFsdWUsZT0odT1yLmZpbmQocz0+cy50eXBlPT09InZhbHVlIikpPT1udWxsP3ZvaWQgMDp1LnZhbHVlO2lmKCFufHwhZSlyZXR1cm4gdDtjb25zdCBhPXRbbl07c3dpdGNoKGUpe2Nhc2UieWVhciI6e2NvbnN0IHM9YS5tYXAobD0+e2NvbnN0IGM9bmV3IERhdGUobCkuZ2V0RnVsbFllYXIoKTtyZXR1cm4gVChuZXcgRGF0ZShjLDAsMSkpfSk7cmV0dXJuey4uLnQsW2ldOnN9fWNhc2UicXVhcnRlciI6e2NvbnN0IHM9YS5tYXAobD0+e2NvbnN0IGY9bmV3IERhdGUobCksYz1mLmdldEZ1bGxZZWFyKCksZz1NYXRoLmZsb29yKGYuZ2V0TW9udGgoKS8zKTtyZXR1cm4gVChuZXcgRGF0ZShjLGcqMywxKSl9KTtyZXR1cm57Li4udCxbaV06c319Y2FzZSJtb250aCI6e2NvbnN0IHM9YS5tYXAobD0+e2NvbnN0IGY9bmV3IERhdGUobCksYz1mLmdldEZ1bGxZZWFyKCksZz1mLmdldE1vbnRoKCk7cmV0dXJuIFQobmV3IERhdGUoYyxnLDEpKX0pO3JldHVybnsuLi50LFtpXTpzfX1jYXNlIndlZWsiOntjb25zdCBzPWEubWFwKGw9Pntjb25zdCBmPW5ldyBEYXRlKGwpLGM9bmV3IERhdGUoZi5zZXREYXRlKGYuZ2V0RGF0ZSgpLWYuZ2V0RGF5KCkpKSxnPWMuZ2V0RnVsbFllYXIoKSxwPWMuZ2V0TW9udGgoKSx2PWMuZ2V0RGF0ZSgpO3JldHVybiBUKG5ldyBEYXRlKGcscCx2KSl9KTtyZXR1cm57Li4udCxbaV06c319Y2FzZSJkYXkiOntjb25zdCBzPWEubWFwKGw9Pntjb25zdCBmPW5ldyBEYXRlKGwpLGM9Zi5nZXRGdWxsWWVhcigpLGc9Zi5nZXRNb250aCgpLHA9Zi5nZXREYXRlKCk7cmV0dXJuIFQobmV3IERhdGUoYyxnLHApKX0pO3JldHVybnsuLi50LFtpXTpzfX1jYXNlImhvdXIiOntjb25zdCBzPWEubWFwKGw9Pntjb25zdCBmPW5ldyBEYXRlKGwpLGM9Zi5nZXRGdWxsWWVhcigpLGc9Zi5nZXRNb250aCgpLHA9Zi5nZXREYXRlKCksdj1mLmdldEhvdXJzKCk7cmV0dXJuIFQobmV3IERhdGUoYyxnLHAsdikpfSk7cmV0dXJuey4uLnQsW2ldOnN9fWNhc2UibWludXRlIjp7Y29uc3Qgcz1hLm1hcChsPT57Y29uc3QgZj1uZXcgRGF0ZShsKSxjPWYuZ2V0RnVsbFllYXIoKSxnPWYuZ2V0TW9udGgoKSxwPWYuZ2V0RGF0ZSgpLHY9Zi5nZXRIb3VycygpLHk9Zi5nZXRNaW51dGVzKCk7cmV0dXJuIFQobmV3IERhdGUoYyxnLHAsdix5KSl9KTtyZXR1cm57Li4udCxbaV06c319Y2FzZSJzZWNvbmQiOntjb25zdCBzPWEubWFwKGw9Pntjb25zdCBmPW5ldyBEYXRlKGwpLGM9Zi5nZXRGdWxsWWVhcigpLGc9Zi5nZXRNb250aCgpLHA9Zi5nZXREYXRlKCksdj1mLmdldEhvdXJzKCkseT1mLmdldE1pbnV0ZXMoKSxtPWYuZ2V0U2Vjb25kcygpO3JldHVybiBUKG5ldyBEYXRlKGMsZyxwLHYseSxtKSl9KTtyZXR1cm57Li4udCxbaV06c319ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gUnQoaSxyLHQpe3ZhciBvLHU7Y29uc3Qgbj0obz1yLmZpbmQocz0+cy50eXBlPT09ImZpZWxkIikpPT1udWxsP3ZvaWQgMDpvLnZhbHVlLGU9KHU9ci5maW5kKHM9PnMudHlwZT09PSJ2YWx1ZSIpKT09bnVsbD92b2lkIDA6dS52YWx1ZTtpZighbnx8IWUpcmV0dXJuIHQ7Y29uc3QgYT10W25dO3N3aXRjaChlKXtjYXNlInllYXIiOntjb25zdCBzPWEubWFwKGw9Pm5ldyBEYXRlKGwpLmdldEZ1bGxZZWFyKCkpO3JldHVybnsuLi50LFtpXTpzfX1jYXNlInF1YXJ0ZXIiOntjb25zdCBzPWEubWFwKGw9Pntjb25zdCBmPW5ldyBEYXRlKGwpO3JldHVybiBNYXRoLmZsb29yKGYuZ2V0TW9udGgoKS8zKSsxfSk7cmV0dXJuey4uLnQsW2ldOnN9fWNhc2UibW9udGgiOntjb25zdCBzPWEubWFwKGw9Pm5ldyBEYXRlKGwpLmdldE1vbnRoKCkrMSk7cmV0dXJuey4uLnQsW2ldOnN9fWNhc2Uid2VlayI6e2NvbnN0IHM9YS5tYXAobD0+e2NvbnN0IGY9bmV3IERhdGUobCksYz1mLmdldEZ1bGxZZWFyKCksZz1uZXcgRGF0ZShjLDAsMSkscD1uZXcgRGF0ZShuZXcgRGF0ZShnKS5zZXREYXRlKGcuZ2V0RGF0ZSgpLWcuZ2V0RGF5KCkpKSx2PWYuZ2V0VGltZSgpLXAuZ2V0VGltZSgpPjFlMyo2MCo2MCoyNCo3P2M6cC5nZXRGdWxsWWVhcigpLHk9bmV3IERhdGUodiwwLDEpLG09bmV3IERhdGUobmV3IERhdGUoeSkuc2V0RGF0ZSh5LmdldERhdGUoKS15LmdldERheSgpKSk7cmV0dXJuIE1hdGguZmxvb3IoKGYuZ2V0VGltZSgpLW0uZ2V0VGltZSgpKS8oNyoyNCo2MCo2MCoxZTMpKSsxfSk7cmV0dXJuey4uLnQsW2ldOnN9fWNhc2Uid2Vla2RheSI6e2NvbnN0IHM9YS5tYXAobD0+bmV3IERhdGUobCkuZ2V0RGF5KCkpO3JldHVybnsuLi50LFtpXTpzfX1jYXNlImRheSI6e2NvbnN0IHM9YS5tYXAobD0+bmV3IERhdGUobCkuZ2V0RGF0ZSgpKTtyZXR1cm57Li4udCxbaV06c319Y2FzZSJob3VyIjp7Y29uc3Qgcz1hLm1hcChsPT5uZXcgRGF0ZShsKS5nZXRIb3VycygpKTtyZXR1cm57Li4udCxbaV06c319Y2FzZSJtaW51dGUiOntjb25zdCBzPWEubWFwKGw9Pm5ldyBEYXRlKGwpLmdldE1pbnV0ZXMoKSk7cmV0dXJuey4uLnQsW2ldOnN9fWNhc2Uic2Vjb25kIjp7Y29uc3Qgcz1hLm1hcChsPT5uZXcgRGF0ZShsKS5nZXRTZWNvbmRzKCkpO3JldHVybnsuLi50LFtpXTpzfX1kZWZhdWx0OnJldHVybiB0fX1mdW5jdGlvbiBUZShpLHIpe2NvbnN0e29wOnQscGFyYW1zOm4sbnVtOmV9PWksYT17Li4ucn0sbz1yW09iamVjdC5rZXlzKHIpWzBdXS5sZW5ndGg7Zm9yKGxldCB1IG9mIG4pc3dpdGNoKHUudHlwZSl7Y2FzZSJmaWVsZCI6YVt1LnZhbHVlXT1yW3UudmFsdWVdO2JyZWFrO2Nhc2UiY29uc3RhbnQiOmFbdS52YWx1ZV09bmV3IEFycmF5KG8pLmZpbGwodS52YWx1ZSk7YnJlYWs7Y2FzZSJleHByZXNzaW9uIjpsZXQgcz1UZSh1LnZhbHVlLHIpO09iamVjdC5rZXlzKHMpLmZvckVhY2gobD0+e2FbbF09c1tsXX0pO2JyZWFrfXN3aXRjaCh0KXtjYXNlIm9uZSI6cmV0dXJuIER0KGkuYXMsbixhKTtjYXNlImxvZyI6cmV0dXJuIGZlKGkuYXMsbixhLGUpO2Nhc2UibG9nMiI6cmV0dXJuIGZlKGkuYXMsbixhLDIpO2Nhc2UibG9nMTAiOnJldHVybiBmZShpLmFzLG4sYSwxMCk7Y2FzZSJiaW5Db3VudCI6cmV0dXJuIE50KGkuYXMsbixhLGUpO2Nhc2UiYmluIjpyZXR1cm4ganQoaS5hcyxuLGEsZSk7Y2FzZSJkYXRlVGltZURyaWxsIjpyZXR1cm4ga3QoaS5hcyxuLGEpO2Nhc2UiZGF0ZVRpbWVGZWF0dXJlIjpyZXR1cm4gUnQoaS5hcyxuLGEpO2RlZmF1bHQ6cmV0dXJuIGF9fWZ1bmN0aW9uIGp0KGkscix0LG49MTApe2NvbnN0e3ZhbHVlOmV9PXJbMF0sYT10W2VdO2xldCBvPTEvMCx1PS0xLzA7Zm9yKGxldCBwPTA7cDxhLmxlbmd0aDtwKyspe2xldCB2PWFbcF07dj51JiYodT12KSx2PG8mJihvPXYpfWNvbnN0IHM9KHUtbykvbixsPU1hdGgubWluKE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLE1hdGgubWF4KHUtbyxOdW1iZXIuTUlOX1ZBTFVFKSksZj1NYXRoLm1heCgtTWF0aC5yb3VuZChNYXRoLmxvZzEwKGwpKSsyLDApLGM9TWF0aC5taW4oMTAwLE1hdGgubWF4KDAsTWF0aC5tYXgoTnVtYmVyLmlzRmluaXRlKGYpP2Y6MCwwKSkpLGc9YS5tYXAocD0+e2xldCB2PU1hdGguZmxvb3IoKHAtbykvcyk7cmV0dXJuIHY9PT1uJiYodj1uLTEpLE51bWJlci5pc05hTih2KSYmKHY9MCksTnVtYmVyKCh2KnMrbykudG9GaXhlZChjKSl9KTtyZXR1cm57Li4udCxbaV06Z319ZnVuY3Rpb24gTnQoaSxyLHQsbj0xMCl7Y29uc3R7dmFsdWU6ZX09clswXSxvPXRbZV0ubWFwKChsLGYpPT4oe3ZhbDpsLGluZGV4OmZ9KSkuc29ydCgobCxmKT0+bC52YWwtZi52YWwpLm1hcCgobCxmKT0+KHt2YWw6bC52YWwsaW5kZXg6bC5pbmRleCxvcmRlckluZGV4OmZ9KSksdT1vLmxlbmd0aC9uLHM9by5zb3J0KChsLGYpPT5sLmluZGV4LWYuaW5kZXgpLm1hcChsPT57bGV0IGY9TWF0aC5mbG9vcihsLm9yZGVySW5kZXgvdSk7cmV0dXJuIGY9PT1uJiYoZj1uLTEpLGYrMX0pO3JldHVybnsuLi50LFtpXTpzfX1mdW5jdGlvbiBmZShpLHIsdCxuPTEwKXtjb25zdHt2YWx1ZTplfT1yWzBdLG89dFtlXS5tYXAodT0+TWF0aC5sb2codSkvTWF0aC5sb2cobikpO3JldHVybnsuLi50LFtpXTpvfX1mdW5jdGlvbiBEdChpLHIsdCl7aWYoT2JqZWN0LmtleXModCkubGVuZ3RoPT09MClyZXR1cm4gdDtjb25zdCBuPXRbT2JqZWN0LmtleXModClbMF1dLmxlbmd0aCxlPW5ldyBBcnJheShuKS5maWxsKDEpO3JldHVybnsuLi50LFtpXTplfX1mdW5jdGlvbiBDdChpKXtjb25zdCByPXt9O3JldHVybiBpLmxlbmd0aD09PTB8fE9iamVjdC5rZXlzKGlbMF0pLmZvckVhY2godD0+e3JbdF09aS5tYXAobj0+blt0XSl9KSxyfWZ1bmN0aW9uIEV0KGkpe2NvbnN0IHI9T2JqZWN0LmtleXMoaSk7aWYoci5sZW5ndGg9PT0wKXJldHVybltdO2NvbnN0IHQ9W10sbj1pW09iamVjdC5rZXlzKGkpWzBdXS5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7Y29uc3QgYT17fTtyLmZvckVhY2gobz0+e2Fbb109aVtvXVtlXX0pLHQucHVzaChhKX1yZXR1cm4gdH1mdW5jdGlvbiBGdChpLHIpe2xldCB0PUN0KGkpO2ZvcihsZXQgbj0wO248ci5sZW5ndGg7bisrKXtjb25zdCBlPXJbbl07dD1UZShlLmV4cHJlc3Npb24sdCl9cmV0dXJuIEV0KHQpfWNvbnN0IF90PWk9Pntjb25zdHtkYXRhU291cmNlOnIsdHJhbnM6dH09aS5kYXRhO3RyeXtjb25zdCBuPUZ0KHIsdCk7c2VsZi5wb3N0TWVzc2FnZShuKX1jYXRjaChuKXtzZWxmLnBvc3RNZXNzYWdlKHtlcnJvcjpuLm1lc3NhZ2V9KX19O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsX3QsITEpfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNmb3JtLndvcmtlci02MGExY2M4Zi5qcy5tYXAK",KD=typeof window<"u"&&window.Blob&&new Blob([atob(UD)],{type:"text/javascript;charset=utf-8"});function K2e(){const e=KD&&(window.URL||window.webkitURL).createObjectURL(KD);try{return e?new Worker(e):new Worker("data:application/javascript;base64,"+UD)}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const $D="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIFAoaSl7cmV0dXJuIFA9dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09InN5bWJvbCI/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LFAoaSl9ZnVuY3Rpb24gUihpLHQpe2lmKCEoaSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIEhlKGksdCl7aWYoUChpKSE9PSJvYmplY3QifHxpPT09bnVsbClyZXR1cm4gaTt2YXIgbj1pW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKGksdHx8ImRlZmF1bHQiKTtpZihQKHIpIT09Im9iamVjdCIpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4odD09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKGkpfWZ1bmN0aW9uIHBlKGkpe3ZhciB0PUhlKGksInN0cmluZyIpO3JldHVybiBQKHQpPT09InN5bWJvbCI/dDpTdHJpbmcodCl9ZnVuY3Rpb24gZGUoaSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHBlKHIua2V5KSxyKX19ZnVuY3Rpb24gayhpLHQsbil7cmV0dXJuIHQmJmRlKGkucHJvdG90eXBlLHQpLG4mJmRlKGksbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksaX1mdW5jdGlvbiBfKGkpe2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gaX1mdW5jdGlvbiBpZShpLHQpe3JldHVybiBpZT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLGUpe3JldHVybiByLl9fcHJvdG9fXz1lLHJ9LGllKGksdCl9ZnVuY3Rpb24gUShpLHQpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24iJiZ0IT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2kucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTppLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0JiZpZShpLHQpfWZ1bmN0aW9uIFYoaSx0KXtpZih0JiYoUCh0KT09PSJvYmplY3QifHx0eXBlb2YgdD09ImZ1bmN0aW9uIikpcmV0dXJuIHQ7aWYodCE9PXZvaWQgMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpO3JldHVybiBfKGkpfWZ1bmN0aW9uIGooaSl7cmV0dXJuIGo9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24obil7cmV0dXJuIG4uX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2Yobil9LGooaSl9ZnVuY3Rpb24gRihpLHQsbil7cmV0dXJuIHQ9cGUodCksdCBpbiBpP09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTppW3RdPW4saX1mdW5jdGlvbiBKZShpKXtpZihBcnJheS5pc0FycmF5KGkpKXJldHVybiBpfWZ1bmN0aW9uIHplKGkpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZpW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGlbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShpKX1mdW5jdGlvbiBoZShpLHQpeyh0PT1udWxsfHx0PmkubGVuZ3RoKSYmKHQ9aS5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KHQpO248dDtuKyspcltuXT1pW25dO3JldHVybiByfWZ1bmN0aW9uIFdlKGksdCl7aWYoaSl7aWYodHlwZW9mIGk9PSJzdHJpbmciKXJldHVybiBoZShpLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpKS5zbGljZSg4LC0xKTtpZihuPT09Ik9iamVjdCImJmkuY29uc3RydWN0b3ImJihuPWkuY29uc3RydWN0b3IubmFtZSksbj09PSJNYXAifHxuPT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20oaSk7aWYobj09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gaGUoaSx0KX19ZnVuY3Rpb24gWWUoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gR2UoaSl7cmV0dXJuIEplKGkpfHx6ZShpKXx8V2UoaSl8fFllKCl9ZnVuY3Rpb24gdmUoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBtZShpKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF0hPW51bGw/YXJndW1lbnRzW3RdOnt9O3QlMj92ZShPYmplY3QobiksITApLmZvckVhY2goZnVuY3Rpb24ocil7RihpLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTp2ZShPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGl9dmFyIFFlPXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgibG9nIix0KX0sd2FybjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgid2FybiIsdCl9LGVycm9yOmZ1bmN0aW9uKHQpe3RoaXMub3V0cHV0KCJlcnJvciIsdCl9LG91dHB1dDpmdW5jdGlvbih0LG4pe2NvbnNvbGUmJmNvbnNvbGVbdF0mJmNvbnNvbGVbdF0uYXBwbHkoY29uc29sZSxuKX19LFplPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSh0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e307Uih0aGlzLGkpLHRoaXMuaW5pdCh0LG4pfXJldHVybiBrKGksW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1yLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj1ufHxRZSx0aGlzLm9wdGlvbnM9cix0aGlzLmRlYnVnPXIuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24obil7dGhpcy5kZWJ1Zz1ufX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGU9MDtlPG47ZSsrKXJbZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQociwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGU9MDtlPG47ZSsrKXJbZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQociwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobiksZT0wO2U8bjtlKyspcltlXT1hcmd1bWVudHNbZV07cmV0dXJuIHRoaXMuZm9yd2FyZChyLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGU9MDtlPG47ZSsrKXJbZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQociwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbihuLHIsZSxhKXtyZXR1cm4gYSYmIXRoaXMuZGVidWc/bnVsbDoodHlwZW9mIG5bMF09PSJzdHJpbmciJiYoblswXT0iIi5jb25jYXQoZSkuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KG5bMF0pKSx0aGlzLmxvZ2dlcltyXShuKSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKG4pe3JldHVybiBuZXcgaSh0aGlzLmxvZ2dlcixtZShtZSh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdChuLCI6Iil9KSx0aGlzLm9wdGlvbnMpKX19LHtrZXk6ImNsb25lIix2YWx1ZTpmdW5jdGlvbihuKXtyZXR1cm4gbj1ufHx0aGlzLm9wdGlvbnMsbi5wcmVmaXg9bi5wcmVmaXh8fHRoaXMucHJlZml4LG5ldyBpKHRoaXMubG9nZ2VyLG4pfX1dKSxpfSgpLE49bmV3IFplLEk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7Uih0aGlzLGkpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBrKGksW3trZXk6Im9uIix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBlPXRoaXM7cmV0dXJuIG4uc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Uub2JzZXJ2ZXJzW2FdPWUub2JzZXJ2ZXJzW2FdfHxbXSxlLm9ic2VydmVyc1thXS5wdXNoKHIpfSksdGhpc319LHtrZXk6Im9mZiIsdmFsdWU6ZnVuY3Rpb24obixyKXtpZih0aGlzLm9ic2VydmVyc1tuXSl7aWYoIXIpe2RlbGV0ZSB0aGlzLm9ic2VydmVyc1tuXTtyZXR1cm59dGhpcy5vYnNlcnZlcnNbbl09dGhpcy5vYnNlcnZlcnNbbl0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09cn0pfX19LHtrZXk6ImVtaXQiLHZhbHVlOmZ1bmN0aW9uKG4pe2Zvcih2YXIgcj1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHI+MT9yLTE6MCksYT0xO2E8cjthKyspZVthLTFdPWFyZ3VtZW50c1thXTtpZih0aGlzLm9ic2VydmVyc1tuXSl7dmFyIG89W10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzW25dKTtvLmZvckVhY2goZnVuY3Rpb24odSl7dS5hcHBseSh2b2lkIDAsZSl9KX1pZih0aGlzLm9ic2VydmVyc1siKiJdKXt2YXIgcz1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbIioiXSk7cy5mb3JFYWNoKGZ1bmN0aW9uKHUpe3UuYXBwbHkodSxbbl0uY29uY2F0KGUpKX0pfX19XSksaX0oKTtmdW5jdGlvbiAkKCl7dmFyIGksdCxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHIsZSl7aT1yLHQ9ZX0pO3JldHVybiBuLnJlc29sdmU9aSxuLnJlamVjdD10LG59ZnVuY3Rpb24geWUoaSl7cmV0dXJuIGk9PW51bGw/IiI6IiIraX1mdW5jdGlvbiBxZShpLHQsbil7aS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3Rbcl0mJihuW3JdPXRbcl0pfSl9ZnVuY3Rpb24gb2UoaSx0LG4pe2Z1bmN0aW9uIHIocyl7cmV0dXJuIHMmJnMuaW5kZXhPZigiIyMjIik+LTE/cy5yZXBsYWNlKC8jIyMvZywiLiIpOnN9ZnVuY3Rpb24gZSgpe3JldHVybiFpfHx0eXBlb2YgaT09InN0cmluZyJ9Zm9yKHZhciBhPXR5cGVvZiB0IT0ic3RyaW5nIj9bXS5jb25jYXQodCk6dC5zcGxpdCgiLiIpO2EubGVuZ3RoPjE7KXtpZihlKCkpcmV0dXJue307dmFyIG89cihhLnNoaWZ0KCkpOyFpW29dJiZuJiYoaVtvXT1uZXcgbiksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksbyk/aT1pW29dOmk9e319cmV0dXJuIGUoKT97fTp7b2JqOmksazpyKGEuc2hpZnQoKSl9fWZ1bmN0aW9uIGJlKGksdCxuKXt2YXIgcj1vZShpLHQsT2JqZWN0KSxlPXIub2JqLGE9ci5rO2VbYV09bn1mdW5jdGlvbiBYZShpLHQsbixyKXt2YXIgZT1vZShpLHQsT2JqZWN0KSxhPWUub2JqLG89ZS5rO2Fbb109YVtvXXx8W10sciYmKGFbb109YVtvXS5jb25jYXQobikpLHJ8fGFbb10ucHVzaChuKX1mdW5jdGlvbiBaKGksdCl7dmFyIG49b2UoaSx0KSxyPW4ub2JqLGU9bi5rO2lmKHIpcmV0dXJuIHJbZV19ZnVuY3Rpb24gT2UoaSx0LG4pe3ZhciByPVooaSxuKTtyZXR1cm4gciE9PXZvaWQgMD9yOloodCxuKX1mdW5jdGlvbiB3ZShpLHQsbil7Zm9yKHZhciByIGluIHQpciE9PSJfX3Byb3RvX18iJiZyIT09ImNvbnN0cnVjdG9yIiYmKHIgaW4gaT90eXBlb2YgaVtyXT09InN0cmluZyJ8fGlbcl1pbnN0YW5jZW9mIFN0cmluZ3x8dHlwZW9mIHRbcl09PSJzdHJpbmcifHx0W3JdaW5zdGFuY2VvZiBTdHJpbmc/biYmKGlbcl09dFtyXSk6d2UoaVtyXSx0W3JdLG4pOmlbcl09dFtyXSk7cmV0dXJuIGl9ZnVuY3Rpb24gQShpKXtyZXR1cm4gaS5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csIlxcJCYiKX12YXIgZXQ9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiB0dChpKXtyZXR1cm4gdHlwZW9mIGk9PSJzdHJpbmciP2kucmVwbGFjZSgvWyY8PiInXC9dL2csZnVuY3Rpb24odCl7cmV0dXJuIGV0W3RdfSk6aX12YXIgcT10eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93Lm5hdmlnYXRvciYmdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50RGF0YT4idSImJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+LTEsbnQ9WyIgIiwiLCIsIj8iLCIhIiwiOyJdO2Z1bmN0aW9uIHJ0KGksdCxuKXt0PXR8fCIiLG49bnx8IiI7dmFyIHI9bnQuZmlsdGVyKGZ1bmN0aW9uKHMpe3JldHVybiB0LmluZGV4T2Yocyk8MCYmbi5pbmRleE9mKHMpPDB9KTtpZihyLmxlbmd0aD09PTApcmV0dXJuITA7dmFyIGU9bmV3IFJlZ0V4cCgiKCIuY29uY2F0KHIubWFwKGZ1bmN0aW9uKHMpe3JldHVybiBzPT09Ij8iPyJcXD8iOnN9KS5qb2luKCJ8IiksIikiKSksYT0hZS50ZXN0KGkpO2lmKCFhKXt2YXIgbz1pLmluZGV4T2Yobik7bz4wJiYhZS50ZXN0KGkuc3Vic3RyaW5nKDAsbykpJiYoYT0hMCl9cmV0dXJuIGF9ZnVuY3Rpb24gU2UoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBYKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP1NlKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtGKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlNlKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiBhdChpKXt2YXIgdD1pdCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWooaSksZTtpZih0KXt2YXIgYT1qKHRoaXMpLmNvbnN0cnVjdG9yO2U9UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsYSl9ZWxzZSBlPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBWKHRoaXMsZSl9fWZ1bmN0aW9uIGl0KCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIHhlKGksdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiIuIjtpZihpKXtpZihpW3RdKXJldHVybiBpW3RdO2Zvcih2YXIgcj10LnNwbGl0KG4pLGU9aSxhPTA7YTxyLmxlbmd0aDsrK2Epe2lmKCFlfHx0eXBlb2YgZVtyW2FdXT09InN0cmluZyImJmErMTxyLmxlbmd0aClyZXR1cm47aWYoZVtyW2FdXT09PXZvaWQgMCl7Zm9yKHZhciBvPTIscz1yLnNsaWNlKGEsYStvKS5qb2luKG4pLHU9ZVtzXTt1PT09dm9pZCAwJiZyLmxlbmd0aD5hK287KW8rKyxzPXIuc2xpY2UoYSxhK28pLmpvaW4obiksdT1lW3NdO2lmKHU9PT12b2lkIDApcmV0dXJuO2lmKHU9PT1udWxsKXJldHVybiBudWxsO2lmKHQuZW5kc1dpdGgocykpe2lmKHR5cGVvZiB1PT0ic3RyaW5nIilyZXR1cm4gdTtpZihzJiZ0eXBlb2YgdVtzXT09InN0cmluZyIpcmV0dXJuIHVbc119dmFyIGw9ci5zbGljZShhK28pLmpvaW4obik7cmV0dXJuIGw/eGUodSxsLG4pOnZvaWQgMH1lPWVbclthXV19cmV0dXJuIGV9fXZhciBvdD1mdW5jdGlvbihpKXtRKG4saSk7dmFyIHQ9YXQobik7ZnVuY3Rpb24gbihyKXt2YXIgZSxhPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7bnM6WyJ0cmFuc2xhdGlvbiJdLGRlZmF1bHROUzoidHJhbnNsYXRpb24ifTtyZXR1cm4gUih0aGlzLG4pLGU9dC5jYWxsKHRoaXMpLHEmJkkuY2FsbChfKGUpKSxlLmRhdGE9cnx8e30sZS5vcHRpb25zPWEsZS5vcHRpb25zLmtleVNlcGFyYXRvcj09PXZvaWQgMCYmKGUub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxlLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZT09PXZvaWQgMCYmKGUub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlPSEwKSxlfXJldHVybiBrKG4sW3trZXk6ImFkZE5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucy5ucy5pbmRleE9mKGUpPDAmJnRoaXMub3B0aW9ucy5ucy5wdXNoKGUpfX0se2tleToicmVtb3ZlTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcy5vcHRpb25zLm5zLmluZGV4T2YoZSk7YT4tMSYmdGhpcy5vcHRpb25zLm5zLnNwbGljZShhLDEpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106e30sdT1zLmtleVNlcGFyYXRvciE9PXZvaWQgMD9zLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGw9cy5pZ25vcmVKU09OU3RydWN0dXJlIT09dm9pZCAwP3MuaWdub3JlSlNPTlN0cnVjdHVyZTp0aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSxjPVtlLGFdO28mJnR5cGVvZiBvIT0ic3RyaW5nIiYmKGM9Yy5jb25jYXQobykpLG8mJnR5cGVvZiBvPT0ic3RyaW5nIiYmKGM9Yy5jb25jYXQodT9vLnNwbGl0KHUpOm8pKSxlLmluZGV4T2YoIi4iKT4tMSYmKGM9ZS5zcGxpdCgiLiIpKTt2YXIgZj1aKHRoaXMuZGF0YSxjKTtyZXR1cm4gZnx8IWx8fHR5cGVvZiBvIT0ic3RyaW5nIj9mOnhlKHRoaXMuZGF0YSYmdGhpcy5kYXRhW2VdJiZ0aGlzLmRhdGFbZV1bYV0sbyx1KX19LHtrZXk6ImFkZFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyxzKXt2YXIgdT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06e3NpbGVudDohMX0sbD10aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO2w9PT12b2lkIDAmJihsPSIuIik7dmFyIGM9W2UsYV07byYmKGM9Yy5jb25jYXQobD9vLnNwbGl0KGwpOm8pKSxlLmluZGV4T2YoIi4iKT4tMSYmKGM9ZS5zcGxpdCgiLiIpLHM9YSxhPWNbMV0pLHRoaXMuYWRkTmFtZXNwYWNlcyhhKSxiZSh0aGlzLmRhdGEsYyxzKSx1LnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsZSxhLG8scyl9fSx7a2V5OiJhZGRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106e3NpbGVudDohMX07Zm9yKHZhciB1IGluIG8pKHR5cGVvZiBvW3VdPT0ic3RyaW5nInx8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShvW3VdKT09PSJbb2JqZWN0IEFycmF5XSIpJiZ0aGlzLmFkZFJlc291cmNlKGUsYSx1LG9bdV0se3NpbGVudDohMH0pO3Muc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIixlLGEsbyl9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8scyx1KXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06e3NpbGVudDohMX0sYz1bZSxhXTtlLmluZGV4T2YoIi4iKT4tMSYmKGM9ZS5zcGxpdCgiLiIpLHM9byxvPWEsYT1jWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoYSk7dmFyIGY9Wih0aGlzLmRhdGEsYyl8fHt9O3M/d2UoZixvLHUpOmY9WChYKHt9LGYpLG8pLGJlKHRoaXMuZGF0YSxjLGYpLGwuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIixlLGEsbyl9fSx7a2V5OiJyZW1vdmVSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXt0aGlzLmhhc1Jlc291cmNlQnVuZGxlKGUsYSkmJmRlbGV0ZSB0aGlzLmRhdGFbZV1bYV0sdGhpcy5yZW1vdmVOYW1lc3BhY2VzKGEpLHRoaXMuZW1pdCgicmVtb3ZlZCIsZSxhKX19LHtrZXk6Imhhc1Jlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbihlLGEpe3JldHVybiB0aGlzLmdldFJlc291cmNlKGUsYSkhPT12b2lkIDB9fSx7a2V5OiJnZXRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXtyZXR1cm4gYXx8KGE9dGhpcy5vcHRpb25zLmRlZmF1bHROUyksdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk9PT0idjEiP1goWCh7fSx7fSksdGhpcy5nZXRSZXNvdXJjZShlLGEpKTp0aGlzLmdldFJlc291cmNlKGUsYSl9fSx7a2V5OiJnZXREYXRhQnlMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZGF0YVtlXX19LHtrZXk6Imhhc0xhbmd1YWdlU29tZVRyYW5zbGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcy5nZXREYXRhQnlMYW5ndWFnZShlKSxvPWEmJk9iamVjdC5rZXlzKGEpfHxbXTtyZXR1cm4hIW8uZmluZChmdW5jdGlvbihzKXtyZXR1cm4gYVtzXSYmT2JqZWN0LmtleXMoYVtzXSkubGVuZ3RoPjB9KX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX1dKSxufShJKSxQZT17cHJvY2Vzc29yczp7fSxhZGRQb3N0UHJvY2Vzc29yOmZ1bmN0aW9uKHQpe3RoaXMucHJvY2Vzc29yc1t0Lm5hbWVdPXR9LGhhbmRsZTpmdW5jdGlvbih0LG4scixlLGEpe3ZhciBvPXRoaXM7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihzKXtvLnByb2Nlc3NvcnNbc10mJihuPW8ucHJvY2Vzc29yc1tzXS5wcm9jZXNzKG4scixlLGEpKX0pLG59fTtmdW5jdGlvbiBMZShpLHQpe3ZhciBuPU9iamVjdC5rZXlzKGkpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIHcoaSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdIT1udWxsP2FyZ3VtZW50c1t0XTp7fTt0JTI/TGUoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe0YoaSxyLG5bcl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6TGUoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHIsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHIpKX0pfXJldHVybiBpfWZ1bmN0aW9uIHN0KGkpe3ZhciB0PXV0KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9aihpKSxlO2lmKHQpe3ZhciBhPWoodGhpcykuY29uc3RydWN0b3I7ZT1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxhKX1lbHNlIGU9ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIFYodGhpcyxlKX19ZnVuY3Rpb24gdXQoKXtpZih0eXBlb2YgUmVmbGVjdD4idSJ8fCFSZWZsZWN0LmNvbnN0cnVjdHx8UmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZih0eXBlb2YgUHJveHk9PSJmdW5jdGlvbiIpcmV0dXJuITA7dHJ5e3JldHVybiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbixbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaHtyZXR1cm4hMX19dmFyIFJlPXt9LGtlPWZ1bmN0aW9uKGkpe1EobixpKTt2YXIgdD1zdChuKTtmdW5jdGlvbiBuKHIpe3ZhciBlLGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O3JldHVybiBSKHRoaXMsbiksZT10LmNhbGwodGhpcykscSYmSS5jYWxsKF8oZSkpLHFlKFsicmVzb3VyY2VTdG9yZSIsImxhbmd1YWdlVXRpbHMiLCJwbHVyYWxSZXNvbHZlciIsImludGVycG9sYXRvciIsImJhY2tlbmRDb25uZWN0b3IiLCJpMThuRm9ybWF0IiwidXRpbHMiXSxyLF8oZSkpLGUub3B0aW9ucz1hLGUub3B0aW9ucy5rZXlTZXBhcmF0b3I9PT12b2lkIDAmJihlLm9wdGlvbnMua2V5U2VwYXJhdG9yPSIuIiksZS5sb2dnZXI9Ti5jcmVhdGUoInRyYW5zbGF0b3IiKSxlfXJldHVybiBrKG4sW3trZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbihlKXtlJiYodGhpcy5sYW5ndWFnZT1lKX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fTtpZihlPT1udWxsKXJldHVybiExO3ZhciBvPXRoaXMucmVzb2x2ZShlLGEpO3JldHVybiBvJiZvLnJlcyE9PXZvaWQgMH19LHtrZXk6ImV4dHJhY3RGcm9tS2V5Iix2YWx1ZTpmdW5jdGlvbihlLGEpe3ZhciBvPWEubnNTZXBhcmF0b3IhPT12b2lkIDA/YS5uc1NlcGFyYXRvcjp0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7bz09PXZvaWQgMCYmKG89IjoiKTt2YXIgcz1hLmtleVNlcGFyYXRvciE9PXZvaWQgMD9hLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLHU9YS5uc3x8dGhpcy5vcHRpb25zLmRlZmF1bHROU3x8W10sbD1vJiZlLmluZGV4T2Yobyk+LTEsYz0hdGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yJiYhYS5rZXlTZXBhcmF0b3ImJiF0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvciYmIWEubnNTZXBhcmF0b3ImJiFydChlLG8scyk7aWYobCYmIWMpe3ZhciBmPWUubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7aWYoZiYmZi5sZW5ndGg+MClyZXR1cm57a2V5OmUsbmFtZXNwYWNlczp1fTt2YXIgZz1lLnNwbGl0KG8pOyhvIT09c3x8bz09PXMmJnRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGdbMF0pPi0xKSYmKHU9Zy5zaGlmdCgpKSxlPWcuam9pbihzKX1yZXR1cm4gdHlwZW9mIHU9PSJzdHJpbmciJiYodT1bdV0pLHtrZXk6ZSxuYW1lc3BhY2VzOnV9fX0se2tleToidHJhbnNsYXRlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHM9dGhpcztpZihQKGEpIT09Im9iamVjdCImJnRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlciYmKGE9dGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cykpLGF8fChhPXt9KSxlPT1udWxsKXJldHVybiIiO0FycmF5LmlzQXJyYXkoZSl8fChlPVtTdHJpbmcoZSldKTt2YXIgdT1hLnJldHVybkRldGFpbHMhPT12b2lkIDA/YS5yZXR1cm5EZXRhaWxzOnRoaXMub3B0aW9ucy5yZXR1cm5EZXRhaWxzLGw9YS5rZXlTZXBhcmF0b3IhPT12b2lkIDA/YS5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixjPXRoaXMuZXh0cmFjdEZyb21LZXkoZVtlLmxlbmd0aC0xXSxhKSxmPWMua2V5LGc9Yy5uYW1lc3BhY2VzLHA9Z1tnLmxlbmd0aC0xXSx2PWEubG5nfHx0aGlzLmxhbmd1YWdlLHk9YS5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZXx8dGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlO2lmKHYmJnYudG9Mb3dlckNhc2UoKT09PSJjaW1vZGUiKXtpZih5KXt2YXIgbT1hLm5zU2VwYXJhdG9yfHx0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7cmV0dXJuIHU/KGQucmVzPSIiLmNvbmNhdChwKS5jb25jYXQobSkuY29uY2F0KGYpLGQpOiIiLmNvbmNhdChwKS5jb25jYXQobSkuY29uY2F0KGYpfXJldHVybiB1PyhkLnJlcz1mLGQpOmZ9dmFyIGQ9dGhpcy5yZXNvbHZlKGUsYSksaD1kJiZkLnJlcyxPPWQmJmQudXNlZEtleXx8ZixiPWQmJmQuZXhhY3RVc2VkS2V5fHxmLHg9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoKSxFPVsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXSxUPWEuam9pbkFycmF5cyE9PXZvaWQgMD9hLmpvaW5BcnJheXM6dGhpcy5vcHRpb25zLmpvaW5BcnJheXMsSD0hdGhpcy5pMThuRm9ybWF0fHx0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3QsSj10eXBlb2YgaCE9InN0cmluZyImJnR5cGVvZiBoIT0iYm9vbGVhbiImJnR5cGVvZiBoIT0ibnVtYmVyIjtpZihIJiZoJiZKJiZFLmluZGV4T2YoeCk8MCYmISh0eXBlb2YgVD09InN0cmluZyImJng9PT0iW29iamVjdCBBcnJheV0iKSl7aWYoIWEucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXt0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyfHx0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKTt2YXIgVT10aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIoTyxoLHcodyh7fSxhKSx7fSx7bnM6Z30pKToia2V5ICciLmNvbmNhdChmLCIgKCIpLmNvbmNhdCh0aGlzLmxhbmd1YWdlLCIpJyByZXR1cm5lZCBhbiBvYmplY3QgaW5zdGVhZCBvZiBzdHJpbmcuIik7cmV0dXJuIHU/KGQucmVzPVUsZCk6VX1pZihsKXt2YXIgQWU9eD09PSJbb2JqZWN0IEFycmF5XSIsbmU9QWU/W106e30sTXQ9QWU/YjpPO2Zvcih2YXIgTSBpbiBoKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoLE0pKXt2YXIgS2U9IiIuY29uY2F0KE10KS5jb25jYXQobCkuY29uY2F0KE0pO25lW01dPXRoaXMudHJhbnNsYXRlKEtlLHcodyh7fSxhKSx7am9pbkFycmF5czohMSxuczpnfSkpLG5lW01dPT09S2UmJihuZVtNXT1oW01dKX1oPW5lfX1lbHNlIGlmKEgmJnR5cGVvZiBUPT0ic3RyaW5nIiYmeD09PSJbb2JqZWN0IEFycmF5XSIpaD1oLmpvaW4oVCksaCYmKGg9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihoLGUsYSxvKSk7ZWxzZXt2YXIgcmU9ITEsej0hMSxVZT1hLmNvdW50IT09dm9pZCAwJiZ0eXBlb2YgYS5jb3VudCE9InN0cmluZyIsZmU9bi5oYXNEZWZhdWx0VmFsdWUoYSksQnQ9VWU/dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgodixhLmNvdW50LGEpOiIiLFc9YVsiZGVmYXVsdFZhbHVlIi5jb25jYXQoQnQpXXx8YS5kZWZhdWx0VmFsdWU7IXRoaXMuaXNWYWxpZExvb2t1cChoKSYmZmUmJihyZT0hMCxoPVcpLHRoaXMuaXNWYWxpZExvb2t1cChoKXx8KHo9ITAsaD1mKTt2YXIgVnQ9YS5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXl8fHRoaXMub3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXksJHQ9VnQmJno/dm9pZCAwOmgsWT1mZSYmVyE9PWgmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKHp8fHJlfHxZKXtpZih0aGlzLmxvZ2dlci5sb2coWT8idXBkYXRlS2V5IjoibWlzc2luZ0tleSIsdixwLGYsWT9XOmgpLGwpe3ZhciBNZT10aGlzLnJlc29sdmUoZix3KHcoe30sYSkse30se2tleVNlcGFyYXRvcjohMX0pKTtNZSYmTWUucmVzJiZ0aGlzLmxvZ2dlci53YXJuKCJTZWVtcyB0aGUgbG9hZGVkIHRyYW5zbGF0aW9ucyB3ZXJlIGluIGZsYXQgSlNPTiBmb3JtYXQgaW5zdGVhZCBvZiBuZXN0ZWQuIEVpdGhlciBzZXQga2V5U2VwYXJhdG9yOiBmYWxzZSBvbiBpbml0IG9yIG1ha2Ugc3VyZSB5b3VyIHRyYW5zbGF0aW9ucyBhcmUgcHVibGlzaGVkIGluIG5lc3RlZCBmb3JtYXQuIil9dmFyIEc9W10sYWU9dGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGEubG5nfHx0aGlzLmxhbmd1YWdlKTtpZih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz09PSJmYWxsYmFjayImJmFlJiZhZVswXSlmb3IodmFyIGxlPTA7bGU8YWUubGVuZ3RoO2xlKyspRy5wdXNoKGFlW2xlXSk7ZWxzZSB0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz09PSJhbGwiP0c9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShhLmxuZ3x8dGhpcy5sYW5ndWFnZSk6Ry5wdXNoKGEubG5nfHx0aGlzLmxhbmd1YWdlKTt2YXIgQmU9ZnVuY3Rpb24oQixnZSxWZSl7dmFyICRlPWZlJiZWZSE9PWg/VmU6JHQ7cy5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyP3Mub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcihCLHAsZ2UsJGUsWSxhKTpzLmJhY2tlbmRDb25uZWN0b3ImJnMuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyYmcy5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nKEIscCxnZSwkZSxZLGEpLHMuZW1pdCgibWlzc2luZ0tleSIsQixwLGdlLGgpfTt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmcmJih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZVZT9HLmZvckVhY2goZnVuY3Rpb24oY2Upe3MucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4ZXMoY2UsYSkuZm9yRWFjaChmdW5jdGlvbihCKXtCZShbY2VdLGYrQixhWyJkZWZhdWx0VmFsdWUiLmNvbmNhdChCKV18fFcpfSl9KTpCZShHLGYsVykpfWg9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihoLGUsYSxkLG8pLHomJmg9PT1mJiZ0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5JiYoaD0iIi5jb25jYXQocCwiOiIpLmNvbmNhdChmKSksKHp8fHJlKSYmdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXImJih0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSE9PSJ2MSI/aD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcih0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5PyIiLmNvbmNhdChwLCI6IikuY29uY2F0KGYpOmYscmU/aDp2b2lkIDApOmg9dGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIoaCkpfXJldHVybiB1PyhkLnJlcz1oLGQpOmh9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8scyx1KXt2YXIgbD10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKWU9dGhpcy5pMThuRm9ybWF0LnBhcnNlKGUsdyh3KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLG8pLHMudXNlZExuZyxzLnVzZWROUyxzLnVzZWRLZXkse3Jlc29sdmVkOnN9KTtlbHNlIGlmKCFvLnNraXBJbnRlcnBvbGF0aW9uKXtvLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLmluaXQodyh3KHt9LG8pLHtpbnRlcnBvbGF0aW9uOncodyh7fSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiksby5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgYz10eXBlb2YgZT09InN0cmluZyImJihvJiZvLmludGVycG9sYXRpb24mJm8uaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMhPT12b2lkIDA/by5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlczp0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMpLGY7aWYoYyl7dmFyIGc9ZS5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtmPWcmJmcubGVuZ3RofXZhciBwPW8ucmVwbGFjZSYmdHlwZW9mIG8ucmVwbGFjZSE9InN0cmluZyI/by5yZXBsYWNlOm87aWYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyYmKHA9dyh3KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLHApKSxlPXRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKGUscCxvLmxuZ3x8dGhpcy5sYW5ndWFnZSxvKSxjKXt2YXIgdj1lLm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApLHk9diYmdi5sZW5ndGg7Zjx5JiYoby5uZXN0PSExKX1vLm5lc3QhPT0hMSYmKGU9dGhpcy5pbnRlcnBvbGF0b3IubmVzdChlLGZ1bmN0aW9uKCl7Zm9yKHZhciBoPWFyZ3VtZW50cy5sZW5ndGgsTz1uZXcgQXJyYXkoaCksYj0wO2I8aDtiKyspT1tiXT1hcmd1bWVudHNbYl07cmV0dXJuIHUmJnVbMF09PT1PWzBdJiYhby5jb250ZXh0PyhsLmxvZ2dlci53YXJuKCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAiLmNvbmNhdChPWzBdLCIgaW4ga2V5OiAiKS5jb25jYXQoYVswXSkpLG51bGwpOmwudHJhbnNsYXRlLmFwcGx5KGwsTy5jb25jYXQoW2FdKSl9LG8pKSxvLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIG09by5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLGQ9dHlwZW9mIG09PSJzdHJpbmciP1ttXTptO3JldHVybiBlIT1udWxsJiZkJiZkLmxlbmd0aCYmby5hcHBseVBvc3RQcm9jZXNzb3IhPT0hMSYmKGU9UGUuaGFuZGxlKGQsZSxhLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkP3coe2kxOG5SZXNvbHZlZDpzfSxvKTpvLHRoaXMpKSxlfX0se2tleToicmVzb2x2ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcyxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxzLHUsbCxjLGY7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKSxlLmZvckVhY2goZnVuY3Rpb24oZyl7aWYoIWEuaXNWYWxpZExvb2t1cChzKSl7dmFyIHA9YS5leHRyYWN0RnJvbUtleShnLG8pLHY9cC5rZXk7dT12O3ZhciB5PXAubmFtZXNwYWNlczthLm9wdGlvbnMuZmFsbGJhY2tOUyYmKHk9eS5jb25jYXQoYS5vcHRpb25zLmZhbGxiYWNrTlMpKTt2YXIgbT1vLmNvdW50IT09dm9pZCAwJiZ0eXBlb2Ygby5jb3VudCE9InN0cmluZyIsZD1tJiYhby5vcmRpbmFsJiZvLmNvdW50PT09MCYmYS5wbHVyYWxSZXNvbHZlci5zaG91bGRVc2VJbnRsQXBpKCksaD1vLmNvbnRleHQhPT12b2lkIDAmJih0eXBlb2Ygby5jb250ZXh0PT0ic3RyaW5nInx8dHlwZW9mIG8uY29udGV4dD09Im51bWJlciIpJiZvLmNvbnRleHQhPT0iIixPPW8ubG5ncz9vLmxuZ3M6YS5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvLmxuZ3x8YS5sYW5ndWFnZSxvLmZhbGxiYWNrTG5nKTt5LmZvckVhY2goZnVuY3Rpb24oYil7YS5pc1ZhbGlkTG9va3VwKHMpfHwoZj1iLCFSZVsiIi5jb25jYXQoT1swXSwiLSIpLmNvbmNhdChiKV0mJmEudXRpbHMmJmEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UoZikmJihSZVsiIi5jb25jYXQoT1swXSwiLSIpLmNvbmNhdChiKV09ITAsYS5sb2dnZXIud2Fybigna2V5ICInLmNvbmNhdCh1LCciIGZvciBsYW5ndWFnZXMgIicpLmNvbmNhdChPLmpvaW4oIiwgIiksYCIgd29uJ3QgZ2V0IHJlc29sdmVkIGFzIG5hbWVzcGFjZSAiYCkuY29uY2F0KGYsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpKSxPLmZvckVhY2goZnVuY3Rpb24oeCl7aWYoIWEuaXNWYWxpZExvb2t1cChzKSl7Yz14O3ZhciBFPVt2XTtpZihhLmkxOG5Gb3JtYXQmJmEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKWEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKEUsdix4LGIsbyk7ZWxzZXt2YXIgVDttJiYoVD1hLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeCh4LG8uY291bnQsbykpO3ZhciBIPSIiLmNvbmNhdChhLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLCJ6ZXJvIik7aWYobSYmKEUucHVzaCh2K1QpLGQmJkUucHVzaCh2K0gpKSxoKXt2YXIgSj0iIi5jb25jYXQodikuY29uY2F0KGEub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQoby5jb250ZXh0KTtFLnB1c2goSiksbSYmKEUucHVzaChKK1QpLGQmJkUucHVzaChKK0gpKX19Zm9yKHZhciBVO1U9RS5wb3AoKTspYS5pc1ZhbGlkTG9va3VwKHMpfHwobD1VLHM9YS5nZXRSZXNvdXJjZSh4LGIsVSxvKSl9fSkpfSl9fSkse3JlczpzLHVzZWRLZXk6dSxleGFjdFVzZWRLZXk6bCx1c2VkTG5nOmMsdXNlZE5TOmZ9fX0se2tleToiaXNWYWxpZExvb2t1cCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJiEoIXRoaXMub3B0aW9ucy5yZXR1cm5OdWxsJiZlPT09bnVsbCkmJiEoIXRoaXMub3B0aW9ucy5yZXR1cm5FbXB0eVN0cmluZyYmZT09PSIiKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOnt9O3JldHVybiB0aGlzLmkxOG5Gb3JtYXQmJnRoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZT90aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2UoZSxhLG8scyk6dGhpcy5yZXNvdXJjZVN0b3JlLmdldFJlc291cmNlKGUsYSxvLHMpfX1dLFt7a2V5OiJoYXNEZWZhdWx0VmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPSJkZWZhdWx0VmFsdWUiO2Zvcih2YXIgbyBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiZhPT09by5zdWJzdHJpbmcoMCxhLmxlbmd0aCkmJmVbb10hPT12b2lkIDApcmV0dXJuITA7cmV0dXJuITF9fV0pLG59KEkpO2Z1bmN0aW9uIHNlKGkpe3JldHVybiBpLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2kuc2xpY2UoMSl9dmFyIGZ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSh0KXtSKHRoaXMsaSksdGhpcy5vcHRpb25zPXQsdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgibGFuZ3VhZ2VVdGlscyIpfXJldHVybiBrKGksW3trZXk6ImdldFNjcmlwdFBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7aWYoIW58fG4uaW5kZXhPZigiLSIpPDApcmV0dXJuIG51bGw7dmFyIHI9bi5zcGxpdCgiLSIpO3JldHVybiByLmxlbmd0aD09PTJ8fChyLnBvcCgpLHJbci5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKT09PSJ4Iik/bnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShyLmpvaW4oIi0iKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7aWYoIW58fG4uaW5kZXhPZigiLSIpPDApcmV0dXJuIG47dmFyIHI9bi5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShyWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7aWYodHlwZW9mIG49PSJzdHJpbmciJiZuLmluZGV4T2YoIi0iKT4tMSl7dmFyIHI9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sZT1uLnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/ZT1lLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS50b0xvd2VyQ2FzZSgpfSk6ZS5sZW5ndGg9PT0yPyhlWzBdPWVbMF0udG9Mb3dlckNhc2UoKSxlWzFdPWVbMV0udG9VcHBlckNhc2UoKSxyLmluZGV4T2YoZVsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKGVbMV09c2UoZVsxXS50b0xvd2VyQ2FzZSgpKSkpOmUubGVuZ3RoPT09MyYmKGVbMF09ZVswXS50b0xvd2VyQ2FzZSgpLGVbMV0ubGVuZ3RoPT09MiYmKGVbMV09ZVsxXS50b1VwcGVyQ2FzZSgpKSxlWzBdIT09InNnbiImJmVbMl0ubGVuZ3RoPT09MiYmKGVbMl09ZVsyXS50b1VwcGVyQ2FzZSgpKSxyLmluZGV4T2YoZVsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKGVbMV09c2UoZVsxXS50b0xvd2VyQ2FzZSgpKSksci5pbmRleE9mKGVbMl0udG9Mb3dlckNhc2UoKSk+LTEmJihlWzJdPXNlKGVbMl0udG9Mb3dlckNhc2UoKSkpKSxlLmpvaW4oIi0iKX1yZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZXx8dGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz9uLnRvTG93ZXJDYXNlKCk6bn19LHtrZXk6ImlzU3VwcG9ydGVkQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7cmV0dXJuKHRoaXMub3B0aW9ucy5sb2FkPT09Imxhbmd1YWdlT25seSJ8fHRoaXMub3B0aW9ucy5ub25FeHBsaWNpdFN1cHBvcnRlZExuZ3MpJiYobj10aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKG4pKSwhdGhpcy5zdXBwb3J0ZWRMbmdzfHwhdGhpcy5zdXBwb3J0ZWRMbmdzLmxlbmd0aHx8dGhpcy5zdXBwb3J0ZWRMbmdzLmluZGV4T2Yobik+LTF9fSx7a2V5OiJnZXRCZXN0TWF0Y2hGcm9tQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPXRoaXM7aWYoIW4pcmV0dXJuIG51bGw7dmFyIGU7cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihhKXtpZighZSl7dmFyIG89ci5mb3JtYXRMYW5ndWFnZUNvZGUoYSk7KCFyLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ci5pc1N1cHBvcnRlZENvZGUobykpJiYoZT1vKX19KSwhZSYmdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MmJm4uZm9yRWFjaChmdW5jdGlvbihhKXtpZighZSl7dmFyIG89ci5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShhKTtpZihyLmlzU3VwcG9ydGVkQ29kZShvKSlyZXR1cm4gZT1vO2U9ci5vcHRpb25zLnN1cHBvcnRlZExuZ3MuZmluZChmdW5jdGlvbihzKXtpZihzLmluZGV4T2Yobyk9PT0wKXJldHVybiBzfSl9fSksZXx8KGU9dGhpcy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZylbMF0pLGV9fSx7a2V5OiJnZXRGYWxsYmFja0NvZGVzIix2YWx1ZTpmdW5jdGlvbihuLHIpe2lmKCFuKXJldHVybltdO2lmKHR5cGVvZiBuPT0iZnVuY3Rpb24iJiYobj1uKHIpKSx0eXBlb2Ygbj09InN0cmluZyImJihuPVtuXSksT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKT09PSJbb2JqZWN0IEFycmF5XSIpcmV0dXJuIG47aWYoIXIpcmV0dXJuIG4uZGVmYXVsdHx8W107dmFyIGU9bltyXTtyZXR1cm4gZXx8KGU9blt0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShyKV0pLGV8fChlPW5bdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUocildKSxlfHwoZT1uW3RoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUocildKSxlfHwoZT1uLmRlZmF1bHQpLGV8fFtdfX0se2tleToidG9SZXNvbHZlSGllcmFyY2h5Iix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBlPXRoaXMsYT10aGlzLmdldEZhbGxiYWNrQ29kZXMocnx8dGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nfHxbXSxuKSxvPVtdLHM9ZnVuY3Rpb24obCl7bCYmKGUuaXNTdXBwb3J0ZWRDb2RlKGwpP28ucHVzaChsKTplLmxvZ2dlci53YXJuKCJyZWplY3RpbmcgbGFuZ3VhZ2UgY29kZSBub3QgZm91bmQgaW4gc3VwcG9ydGVkTG5nczogIi5jb25jYXQobCkpKX07cmV0dXJuIHR5cGVvZiBuPT0ic3RyaW5nIiYmbi5pbmRleE9mKCItIik+LTE/KHRoaXMub3B0aW9ucy5sb2FkIT09Imxhbmd1YWdlT25seSImJnModGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUobikpLHRoaXMub3B0aW9ucy5sb2FkIT09Imxhbmd1YWdlT25seSImJnRoaXMub3B0aW9ucy5sb2FkIT09ImN1cnJlbnRPbmx5IiYmcyh0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShuKSksdGhpcy5vcHRpb25zLmxvYWQhPT0iY3VycmVudE9ubHkiJiZzKHRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUobikpKTp0eXBlb2Ygbj09InN0cmluZyImJnModGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUobikpLGEuZm9yRWFjaChmdW5jdGlvbih1KXtvLmluZGV4T2YodSk8MCYmcyhlLmZvcm1hdExhbmd1YWdlQ29kZSh1KSl9KSxvfX1dKSxpfSgpLGx0PVt7bG5nczpbImFjaCIsImFrIiwiYW0iLCJhcm4iLCJiciIsImZpbCIsImd1biIsImxuIiwibWZlIiwibWciLCJtaSIsIm9jIiwicHQiLCJwdC1CUiIsInRnIiwidGwiLCJ0aSIsInRyIiwidXoiLCJ3YSJdLG5yOlsxLDJdLGZjOjF9LHtsbmdzOlsiYWYiLCJhbiIsImFzdCIsImF6IiwiYmciLCJibiIsImNhIiwiZGEiLCJkZSIsImRldiIsImVsIiwiZW4iLCJlbyIsImVzIiwiZXQiLCJldSIsImZpIiwiZm8iLCJmdXIiLCJmeSIsImdsIiwiZ3UiLCJoYSIsImhpIiwiaHUiLCJoeSIsImlhIiwiaXQiLCJrayIsImtuIiwia3UiLCJsYiIsIm1haSIsIm1sIiwibW4iLCJtciIsIm5haCIsIm5hcCIsIm5iIiwibmUiLCJubCIsIm5uIiwibm8iLCJuc28iLCJwYSIsInBhcCIsInBtcyIsInBzIiwicHQtUFQiLCJybSIsInNjbyIsInNlIiwic2kiLCJzbyIsInNvbiIsInNxIiwic3YiLCJzdyIsInRhIiwidGUiLCJ0ayIsInVyIiwieW8iXSxucjpbMSwyXSxmYzoyfSx7bG5nczpbImF5IiwiYm8iLCJjZ2ciLCJmYSIsImh0IiwiaWQiLCJqYSIsImpibyIsImthIiwia20iLCJrbyIsImt5IiwibG8iLCJtcyIsInNhaCIsInN1IiwidGgiLCJ0dCIsInVnIiwidmkiLCJ3byIsInpoIl0sbnI6WzFdLGZjOjN9LHtsbmdzOlsiYmUiLCJicyIsImNuciIsImR6IiwiaHIiLCJydSIsInNyIiwidWsiXSxucjpbMSwyLDVdLGZjOjR9LHtsbmdzOlsiYXIiXSxucjpbMCwxLDIsMywxMSwxMDBdLGZjOjV9LHtsbmdzOlsiY3MiLCJzayJdLG5yOlsxLDIsNV0sZmM6Nn0se2xuZ3M6WyJjc2IiLCJwbCJdLG5yOlsxLDIsNV0sZmM6N30se2xuZ3M6WyJjeSJdLG5yOlsxLDIsMyw4XSxmYzo4fSx7bG5nczpbImZyIl0sbnI6WzEsMl0sZmM6OX0se2xuZ3M6WyJnYSJdLG5yOlsxLDIsMyw3LDExXSxmYzoxMH0se2xuZ3M6WyJnZCJdLG5yOlsxLDIsMywyMF0sZmM6MTF9LHtsbmdzOlsiaXMiXSxucjpbMSwyXSxmYzoxMn0se2xuZ3M6WyJqdiJdLG5yOlswLDFdLGZjOjEzfSx7bG5nczpbImt3Il0sbnI6WzEsMiwzLDRdLGZjOjE0fSx7bG5nczpbImx0Il0sbnI6WzEsMiwxMF0sZmM6MTV9LHtsbmdzOlsibHYiXSxucjpbMSwyLDBdLGZjOjE2fSx7bG5nczpbIm1rIl0sbnI6WzEsMl0sZmM6MTd9LHtsbmdzOlsibW5rIl0sbnI6WzAsMSwyXSxmYzoxOH0se2xuZ3M6WyJtdCJdLG5yOlsxLDIsMTEsMjBdLGZjOjE5fSx7bG5nczpbIm9yIl0sbnI6WzIsMV0sZmM6Mn0se2xuZ3M6WyJybyJdLG5yOlsxLDIsMjBdLGZjOjIwfSx7bG5nczpbInNsIl0sbnI6WzUsMSwyLDNdLGZjOjIxfSx7bG5nczpbImhlIiwiaXciXSxucjpbMSwyLDIwLDIxXSxmYzoyMn1dLGN0PXsxOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD4xKX0sMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQhPTEpfSwzOmZ1bmN0aW9uKHQpe3JldHVybiAwfSw0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0wPzA6dD09MT8xOnQ9PTI/Mjp0JTEwMD49MyYmdCUxMDA8PTEwPzM6dCUxMDA+PTExPzQ6NSl9LDY6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0xPzA6dD49MiYmdDw9ND8xOjIpfSw3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQlMTA+PTImJnQlMTA8PTQmJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSw4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQ9PTI/MTp0IT04JiZ0IT0xMT8yOjMpfSw5OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD49Mil9LDEwOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQ9PTI/MTp0PDc/Mjp0PDExPzM6NCl9LDExOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MXx8dD09MTE/MDp0PT0yfHx0PT0xMj8xOnQ+MiYmdDwyMD8yOjMpfSwxMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAhPTF8fHQlMTAwPT0xMSl9LDEzOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCE9PTApfSwxNDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ9PTE/MDp0PT0yPzE6dD09Mz8yOjMpfSwxNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQlMTA+PTImJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSwxNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQhPT0wPzE6Mil9LDE3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MXx8dCUxMD09MSYmdCUxMDAhPTExPzA6MSl9LDE4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MD8wOnQ9PTE/MToyKX0sMTk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0xPzA6dD09MHx8dCUxMDA+MSYmdCUxMDA8MTE/MTp0JTEwMD4xMCYmdCUxMDA8MjA/MjozKX0sMjA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0xPzA6dD09MHx8dCUxMDA+MCYmdCUxMDA8MjA/MToyKX0sMjE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwMD09MT8xOnQlMTAwPT0yPzI6dCUxMDA9PTN8fHQlMTAwPT00PzM6MCl9LDIyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQ9PTI/MToodDwwfHx0PjEwKSYmdCUxMD09MD8yOjMpfX0sZ3Q9WyJ2MSIsInYyIiwidjMiXSxqZT17emVybzowLG9uZToxLHR3bzoyLGZldzozLG1hbnk6NCxvdGhlcjo1fTtmdW5jdGlvbiBwdCgpe3ZhciBpPXt9O3JldHVybiBsdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QubG5ncy5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lbbl09e251bWJlcnM6dC5ucixwbHVyYWxzOmN0W3QuZmNdfX0pfSksaX12YXIgZHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fTtSKHRoaXMsaSksdGhpcy5sYW5ndWFnZVV0aWxzPXQsdGhpcy5vcHRpb25zPW4sdGhpcy5sb2dnZXI9Ti5jcmVhdGUoInBsdXJhbFJlc29sdmVyIiksKCF0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT058fHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj09PSJ2NCIpJiYodHlwZW9mIEludGw+InUifHwhSW50bC5QbHVyYWxSdWxlcykmJih0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT049InYzIix0aGlzLmxvZ2dlci5lcnJvcigiWW91ciBlbnZpcm9ubWVudCBzZWVtcyBub3QgdG8gYmUgSW50bCBBUEkgY29tcGF0aWJsZSwgdXNlIGFuIEludGwuUGx1cmFsUnVsZXMgcG9seWZpbGwuIFdpbGwgZmFsbGJhY2sgdG8gdGhlIGNvbXBhdGliaWxpdHlKU09OIHYzIGZvcm1hdCBoYW5kbGluZy4iKSksdGhpcy5ydWxlcz1wdCgpfXJldHVybiBrKGksW3trZXk6ImFkZFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKG4scil7dGhpcy5ydWxlc1tuXT1yfX0se2tleToiZ2V0UnVsZSIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O2lmKHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpKXRyeXtyZXR1cm4gbmV3IEludGwuUGx1cmFsUnVsZXMobix7dHlwZTpyLm9yZGluYWw/Im9yZGluYWwiOiJjYXJkaW5hbCJ9KX1jYXRjaHtyZXR1cm59cmV0dXJuIHRoaXMucnVsZXNbbl18fHRoaXMucnVsZXNbdGhpcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKG4pXX19LHtrZXk6Im5lZWRzUGx1cmFsIix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30sZT10aGlzLmdldFJ1bGUobixyKTtyZXR1cm4gdGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/ZSYmZS5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLmxlbmd0aD4xOmUmJmUubnVtYmVycy5sZW5ndGg+MX19LHtrZXk6ImdldFBsdXJhbEZvcm1zT2ZLZXkiLHZhbHVlOmZ1bmN0aW9uKG4scil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9O3JldHVybiB0aGlzLmdldFN1ZmZpeGVzKG4sZSkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiIiLmNvbmNhdChyKS5jb25jYXQoYSl9KX19LHtrZXk6ImdldFN1ZmZpeGVzIix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj10aGlzLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LGE9dGhpcy5nZXRSdWxlKG4sZSk7cmV0dXJuIGE/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/YS5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLnNvcnQoZnVuY3Rpb24obyxzKXtyZXR1cm4gamVbb10tamVbc119KS5tYXAoZnVuY3Rpb24obyl7cmV0dXJuIiIuY29uY2F0KHIub3B0aW9ucy5wcmVwZW5kKS5jb25jYXQobyl9KTphLm51bWJlcnMubWFwKGZ1bmN0aW9uKG8pe3JldHVybiByLmdldFN1ZmZpeChuLG8sZSl9KTpbXX19LHtrZXk6ImdldFN1ZmZpeCIsdmFsdWU6ZnVuY3Rpb24obixyKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sYT10aGlzLmdldFJ1bGUobixlKTtyZXR1cm4gYT90aGlzLnNob3VsZFVzZUludGxBcGkoKT8iIi5jb25jYXQodGhpcy5vcHRpb25zLnByZXBlbmQpLmNvbmNhdChhLnNlbGVjdChyKSk6dGhpcy5nZXRTdWZmaXhSZXRyb0NvbXBhdGlibGUoYSxyKToodGhpcy5sb2dnZXIud2Fybigibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAiLmNvbmNhdChuKSksIiIpfX0se2tleToiZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlIix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBlPXRoaXMsYT1uLm5vQWJzP24ucGx1cmFscyhyKTpuLnBsdXJhbHMoTWF0aC5hYnMocikpLG89bi5udW1iZXJzW2FdO3RoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmbi5udW1iZXJzLmxlbmd0aD09PTImJm4ubnVtYmVyc1swXT09PTEmJihvPT09Mj9vPSJwbHVyYWwiOm89PT0xJiYobz0iIikpO3ZhciBzPWZ1bmN0aW9uKCl7cmV0dXJuIGUub3B0aW9ucy5wcmVwZW5kJiZvLnRvU3RyaW5nKCk/ZS5vcHRpb25zLnByZXBlbmQrby50b1N0cmluZygpOm8udG9TdHJpbmcoKX07cmV0dXJuIHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj09PSJ2MSI/bz09PTE/IiI6dHlwZW9mIG89PSJudW1iZXIiPyJfcGx1cmFsXyIuY29uY2F0KG8udG9TdHJpbmcoKSk6cygpOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj09PSJ2MiJ8fHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmbi5udW1iZXJzLmxlbmd0aD09PTImJm4ubnVtYmVyc1swXT09PTE/cygpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZhLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX19LHtrZXk6InNob3VsZFVzZUludGxBcGkiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIWd0LmluY2x1ZGVzKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTil9fV0pLGl9KCk7ZnVuY3Rpb24gTmUoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBMKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP05lKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtGKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOk5lKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX12YXIgaHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9O1IodGhpcyxpKSx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgiaW50ZXJwb2xhdG9yIiksdGhpcy5vcHRpb25zPXQsdGhpcy5mb3JtYXQ9dC5pbnRlcnBvbGF0aW9uJiZ0LmludGVycG9sYXRpb24uZm9ybWF0fHxmdW5jdGlvbihuKXtyZXR1cm4gbn0sdGhpcy5pbml0KHQpfXJldHVybiBrKGksW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9O24uaW50ZXJwb2xhdGlvbnx8KG4uaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTt2YXIgcj1uLmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9ci5lc2NhcGUhPT12b2lkIDA/ci5lc2NhcGU6dHQsdGhpcy5lc2NhcGVWYWx1ZT1yLmVzY2FwZVZhbHVlIT09dm9pZCAwP3IuZXNjYXBlVmFsdWU6ITAsdGhpcy51c2VSYXdWYWx1ZVRvRXNjYXBlPXIudXNlUmF3VmFsdWVUb0VzY2FwZSE9PXZvaWQgMD9yLnVzZVJhd1ZhbHVlVG9Fc2NhcGU6ITEsdGhpcy5wcmVmaXg9ci5wcmVmaXg/QShyLnByZWZpeCk6ci5wcmVmaXhFc2NhcGVkfHwie3siLHRoaXMuc3VmZml4PXIuc3VmZml4P0Eoci5zdWZmaXgpOnIuc3VmZml4RXNjYXBlZHx8In19Iix0aGlzLmZvcm1hdFNlcGFyYXRvcj1yLmZvcm1hdFNlcGFyYXRvcj9yLmZvcm1hdFNlcGFyYXRvcjpyLmZvcm1hdFNlcGFyYXRvcnx8IiwiLHRoaXMudW5lc2NhcGVQcmVmaXg9ci51bmVzY2FwZVN1ZmZpeD8iIjpyLnVuZXNjYXBlUHJlZml4fHwiLSIsdGhpcy51bmVzY2FwZVN1ZmZpeD10aGlzLnVuZXNjYXBlUHJlZml4PyIiOnIudW5lc2NhcGVTdWZmaXh8fCIiLHRoaXMubmVzdGluZ1ByZWZpeD1yLm5lc3RpbmdQcmVmaXg/QShyLm5lc3RpbmdQcmVmaXgpOnIubmVzdGluZ1ByZWZpeEVzY2FwZWR8fEEoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1yLm5lc3RpbmdTdWZmaXg/QShyLm5lc3RpbmdTdWZmaXgpOnIubmVzdGluZ1N1ZmZpeEVzY2FwZWR8fEEoIikiKSx0aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yPXIubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I/ci5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjpyLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yfHwiLCIsdGhpcy5tYXhSZXBsYWNlcz1yLm1heFJlcGxhY2VzP3IubWF4UmVwbGFjZXM6MWUzLHRoaXMuYWx3YXlzRm9ybWF0PXIuYWx3YXlzRm9ybWF0IT09dm9pZCAwP3IuYWx3YXlzRm9ybWF0OiExLHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgbj0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKG4sImciKTt2YXIgcj0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChyLCJnIik7dmFyIGU9IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChlLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24obixyLGUsYSl7dmFyIG89dGhpcyxzLHUsbCxjPXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGYobSl7cmV0dXJuIG0ucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBnPWZ1bmN0aW9uKGQpe2lmKGQuaW5kZXhPZihvLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIGg9T2UocixjLGQpO3JldHVybiBvLmFsd2F5c0Zvcm1hdD9vLmZvcm1hdChoLHZvaWQgMCxlLEwoTChMKHt9LGEpLHIpLHt9LHtpbnRlcnBvbGF0aW9ua2V5OmR9KSk6aH12YXIgTz1kLnNwbGl0KG8uZm9ybWF0U2VwYXJhdG9yKSxiPU8uc2hpZnQoKS50cmltKCkseD1PLmpvaW4oby5mb3JtYXRTZXBhcmF0b3IpLnRyaW0oKTtyZXR1cm4gby5mb3JtYXQoT2UocixjLGIpLHgsZSxMKEwoTCh7fSxhKSxyKSx7fSx7aW50ZXJwb2xhdGlvbmtleTpifSkpfTt0aGlzLnJlc2V0UmVnRXhwKCk7dmFyIHA9YSYmYS5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIsdj1hJiZhLmludGVycG9sYXRpb24mJmEuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMhPT12b2lkIDA/YS5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlczp0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMseT1be3JlZ2V4OnRoaXMucmVnZXhwVW5lc2NhcGUsc2FmZVZhbHVlOmZ1bmN0aW9uKGQpe3JldHVybiBmKGQpfX0se3JlZ2V4OnRoaXMucmVnZXhwLHNhZmVWYWx1ZTpmdW5jdGlvbihkKXtyZXR1cm4gby5lc2NhcGVWYWx1ZT9mKG8uZXNjYXBlKGQpKTpmKGQpfX1dO3JldHVybiB5LmZvckVhY2goZnVuY3Rpb24obSl7Zm9yKGw9MDtzPW0ucmVnZXguZXhlYyhuKTspe3ZhciBkPXNbMV0udHJpbSgpO2lmKHU9ZyhkKSx1PT09dm9pZCAwKWlmKHR5cGVvZiBwPT0iZnVuY3Rpb24iKXt2YXIgaD1wKG4scyxhKTt1PXR5cGVvZiBoPT0ic3RyaW5nIj9oOiIifWVsc2UgaWYoYSYmYS5oYXNPd25Qcm9wZXJ0eShkKSl1PSIiO2Vsc2UgaWYodil7dT1zWzBdO2NvbnRpbnVlfWVsc2Ugby5sb2dnZXIud2FybigibWlzc2VkIHRvIHBhc3MgaW4gdmFyaWFibGUgIi5jb25jYXQoZCwiIGZvciBpbnRlcnBvbGF0aW5nICIpLmNvbmNhdChuKSksdT0iIjtlbHNlIHR5cGVvZiB1IT0ic3RyaW5nIiYmIW8udXNlUmF3VmFsdWVUb0VzY2FwZSYmKHU9eWUodSkpO3ZhciBPPW0uc2FmZVZhbHVlKHUpO2lmKG49bi5yZXBsYWNlKHNbMF0sTyksdj8obS5yZWdleC5sYXN0SW5kZXgrPXUubGVuZ3RoLG0ucmVnZXgubGFzdEluZGV4LT1zWzBdLmxlbmd0aCk6bS5yZWdleC5sYXN0SW5kZXg9MCxsKyssbD49by5tYXhSZXBsYWNlcylicmVha319KSxufX0se2tleToibmVzdCIsdmFsdWU6ZnVuY3Rpb24obixyKXt2YXIgZT10aGlzLGE9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9LG8scyx1PUwoe30sYSk7dS5hcHBseVBvc3RQcm9jZXNzb3I9ITEsZGVsZXRlIHUuZGVmYXVsdFZhbHVlO2Z1bmN0aW9uIGwocCx2KXt2YXIgeT10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKHAuaW5kZXhPZih5KTwwKXJldHVybiBwO3ZhciBtPXAuc3BsaXQobmV3IFJlZ0V4cCgiIi5jb25jYXQoeSwiWyBdKnsiKSkpLGQ9InsiLmNvbmNhdChtWzFdKTtwPW1bMF0sZD10aGlzLmludGVycG9sYXRlKGQsdSk7dmFyIGg9ZC5tYXRjaCgvJy9nKSxPPWQubWF0Y2goLyIvZyk7KGgmJmgubGVuZ3RoJTI9PT0wJiYhT3x8Ty5sZW5ndGglMiE9PTApJiYoZD1kLnJlcGxhY2UoLycvZywnIicpKTt0cnl7dT1KU09OLnBhcnNlKGQpLHYmJih1PUwoTCh7fSx2KSx1KSl9Y2F0Y2goYil7cmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImZhaWxlZCBwYXJzaW5nIG9wdGlvbnMgc3RyaW5nIGluIG5lc3RpbmcgZm9yIGtleSAiLmNvbmNhdChwKSxiKSwiIi5jb25jYXQocCkuY29uY2F0KHkpLmNvbmNhdChkKX1yZXR1cm4gZGVsZXRlIHUuZGVmYXVsdFZhbHVlLHB9Zm9yKDtvPXRoaXMubmVzdGluZ1JlZ2V4cC5leGVjKG4pOyl7dmFyIGM9W10sZj0hMTtpZihvWzBdLmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpIT09LTEmJiEvey4qfS8udGVzdChvWzFdKSl7dmFyIGc9b1sxXS5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcikubWFwKGZ1bmN0aW9uKHApe3JldHVybiBwLnRyaW0oKX0pO29bMV09Zy5zaGlmdCgpLGM9ZyxmPSEwfWlmKHM9cihsLmNhbGwodGhpcyxvWzFdLnRyaW0oKSx1KSx1KSxzJiZvWzBdPT09biYmdHlwZW9mIHMhPSJzdHJpbmciKXJldHVybiBzO3R5cGVvZiBzIT0ic3RyaW5nIiYmKHM9eWUocykpLHN8fCh0aGlzLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcmVzb2x2ZSAiLmNvbmNhdChvWzFdLCIgZm9yIG5lc3RpbmcgIikuY29uY2F0KG4pKSxzPSIiKSxmJiYocz1jLnJlZHVjZShmdW5jdGlvbihwLHYpe3JldHVybiBlLmZvcm1hdChwLHYsYS5sbmcsTChMKHt9LGEpLHt9LHtpbnRlcnBvbGF0aW9ua2V5Om9bMV0udHJpbSgpfSkpfSxzLnRyaW0oKSkpLG49bi5yZXBsYWNlKG9bMF0scyksdGhpcy5yZWdleHAubGFzdEluZGV4PTB9cmV0dXJuIG59fV0pLGl9KCk7ZnVuY3Rpb24gQ2UoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBEKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP0NlKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtGKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOkNlKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiB2dChpKXt2YXIgdD1pLnRvTG93ZXJDYXNlKCkudHJpbSgpLG49e307aWYoaS5pbmRleE9mKCIoIik+LTEpe3ZhciByPWkuc3BsaXQoIigiKTt0PXJbMF0udG9Mb3dlckNhc2UoKS50cmltKCk7dmFyIGU9clsxXS5zdWJzdHJpbmcoMCxyWzFdLmxlbmd0aC0xKTtpZih0PT09ImN1cnJlbmN5IiYmZS5pbmRleE9mKCI6Iik8MCluLmN1cnJlbmN5fHwobi5jdXJyZW5jeT1lLnRyaW0oKSk7ZWxzZSBpZih0PT09InJlbGF0aXZldGltZSImJmUuaW5kZXhPZigiOiIpPDApbi5yYW5nZXx8KG4ucmFuZ2U9ZS50cmltKCkpO2Vsc2V7dmFyIGE9ZS5zcGxpdCgiOyIpO2EuZm9yRWFjaChmdW5jdGlvbihvKXtpZihvKXt2YXIgcz1vLnNwbGl0KCI6IiksdT1HZShzKSxsPXVbMF0sYz11LnNsaWNlKDEpLGY9Yy5qb2luKCI6IikudHJpbSgpLnJlcGxhY2UoL14nK3wnKyQvZywiIik7bltsLnRyaW0oKV18fChuW2wudHJpbSgpXT1mKSxmPT09ImZhbHNlIiYmKG5bbC50cmltKCldPSExKSxmPT09InRydWUiJiYobltsLnRyaW0oKV09ITApLGlzTmFOKGYpfHwobltsLnRyaW0oKV09cGFyc2VJbnQoZiwxMCkpfX0pfX1yZXR1cm57Zm9ybWF0TmFtZTp0LGZvcm1hdE9wdGlvbnM6bn19ZnVuY3Rpb24gSyhpKXt2YXIgdD17fTtyZXR1cm4gZnVuY3Rpb24ocixlLGEpe3ZhciBvPWUrSlNPTi5zdHJpbmdpZnkoYSkscz10W29dO3JldHVybiBzfHwocz1pKGUsYSksdFtvXT1zKSxzKHIpfX12YXIgbXQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9O1IodGhpcyxpKSx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgiZm9ybWF0dGVyIiksdGhpcy5vcHRpb25zPXQsdGhpcy5mb3JtYXRzPXtudW1iZXI6SyhmdW5jdGlvbihuLHIpe3ZhciBlPW5ldyBJbnRsLk51bWJlckZvcm1hdChuLHIpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSl9fSksY3VycmVuY3k6SyhmdW5jdGlvbihuLHIpe3ZhciBlPW5ldyBJbnRsLk51bWJlckZvcm1hdChuLEQoRCh7fSxyKSx7fSx7c3R5bGU6ImN1cnJlbmN5In0pKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGUuZm9ybWF0KGEpfX0pLGRhdGV0aW1lOksoZnVuY3Rpb24obixyKXt2YXIgZT1uZXcgSW50bC5EYXRlVGltZUZvcm1hdChuLEQoe30scikpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSl9fSkscmVsYXRpdmV0aW1lOksoZnVuY3Rpb24obixyKXt2YXIgZT1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQobixEKHt9LHIpKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGUuZm9ybWF0KGEsci5yYW5nZXx8ImRheSIpfX0pLGxpc3Q6SyhmdW5jdGlvbihuLHIpe3ZhciBlPW5ldyBJbnRsLkxpc3RGb3JtYXQobixEKHt9LHIpKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGUuZm9ybWF0KGEpfX0pfSx0aGlzLmluaXQodCl9cmV0dXJuIGsoaSxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fSxlPXIuaW50ZXJwb2xhdGlvbjt0aGlzLmZvcm1hdFNlcGFyYXRvcj1lLmZvcm1hdFNlcGFyYXRvcj9lLmZvcm1hdFNlcGFyYXRvcjplLmZvcm1hdFNlcGFyYXRvcnx8IiwifX0se2tleToiYWRkIix2YWx1ZTpmdW5jdGlvbihuLHIpe3RoaXMuZm9ybWF0c1tuLnRvTG93ZXJDYXNlKCkudHJpbSgpXT1yfX0se2tleToiYWRkQ2FjaGVkIix2YWx1ZTpmdW5jdGlvbihuLHIpe3RoaXMuZm9ybWF0c1tuLnRvTG93ZXJDYXNlKCkudHJpbSgpXT1LKHIpfX0se2tleToiZm9ybWF0Iix2YWx1ZTpmdW5jdGlvbihuLHIsZSxhKXt2YXIgbz10aGlzLHM9ci5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvciksdT1zLnJlZHVjZShmdW5jdGlvbihsLGMpe3ZhciBmPXZ0KGMpLGc9Zi5mb3JtYXROYW1lLHA9Zi5mb3JtYXRPcHRpb25zO2lmKG8uZm9ybWF0c1tnXSl7dmFyIHY9bDt0cnl7dmFyIHk9YSYmYS5mb3JtYXRQYXJhbXMmJmEuZm9ybWF0UGFyYW1zW2EuaW50ZXJwb2xhdGlvbmtleV18fHt9LG09eS5sb2NhbGV8fHkubG5nfHxhLmxvY2FsZXx8YS5sbmd8fGU7dj1vLmZvcm1hdHNbZ10obCxtLEQoRChEKHt9LHApLGEpLHkpKX1jYXRjaChkKXtvLmxvZ2dlci53YXJuKGQpfXJldHVybiB2fWVsc2Ugby5sb2dnZXIud2FybigidGhlcmUgd2FzIG5vIGZvcm1hdCBmdW5jdGlvbiBmb3IgIi5jb25jYXQoZykpO3JldHVybiBsfSxuKTtyZXR1cm4gdX19XSksaX0oKTtmdW5jdGlvbiBFZShpLHQpe3ZhciBuPU9iamVjdC5rZXlzKGkpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIF9lKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP0VlKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtGKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOkVlKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiB5dChpKXt2YXIgdD1idCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWooaSksZTtpZih0KXt2YXIgYT1qKHRoaXMpLmNvbnN0cnVjdG9yO2U9UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsYSl9ZWxzZSBlPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBWKHRoaXMsZSl9fWZ1bmN0aW9uIGJ0KCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIE90KGksdCl7aS5wZW5kaW5nW3RdIT09dm9pZCAwJiYoZGVsZXRlIGkucGVuZGluZ1t0XSxpLnBlbmRpbmdDb3VudC0tKX12YXIgd3Q9ZnVuY3Rpb24oaSl7UShuLGkpO3ZhciB0PXl0KG4pO2Z1bmN0aW9uIG4ocixlLGEpe3ZhciBvLHM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOnt9O3JldHVybiBSKHRoaXMsbiksbz10LmNhbGwodGhpcykscSYmSS5jYWxsKF8obykpLG8uYmFja2VuZD1yLG8uc3RvcmU9ZSxvLnNlcnZpY2VzPWEsby5sYW5ndWFnZVV0aWxzPWEubGFuZ3VhZ2VVdGlscyxvLm9wdGlvbnM9cyxvLmxvZ2dlcj1OLmNyZWF0ZSgiYmFja2VuZENvbm5lY3RvciIpLG8ud2FpdGluZ1JlYWRzPVtdLG8ubWF4UGFyYWxsZWxSZWFkcz1zLm1heFBhcmFsbGVsUmVhZHN8fDEwLG8ucmVhZGluZ0NhbGxzPTAsby5tYXhSZXRyaWVzPXMubWF4UmV0cmllcz49MD9zLm1heFJldHJpZXM6NSxvLnJldHJ5VGltZW91dD1zLnJldHJ5VGltZW91dD49MT9zLnJldHJ5VGltZW91dDozNTAsby5zdGF0ZT17fSxvLnF1ZXVlPVtdLG8uYmFja2VuZCYmby5iYWNrZW5kLmluaXQmJm8uYmFja2VuZC5pbml0KGEscy5iYWNrZW5kLHMpLG99cmV0dXJuIGsobixbe2tleToicXVldWVMb2FkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyxzKXt2YXIgdT10aGlzLGw9e30sYz17fSxmPXt9LGc9e307cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihwKXt2YXIgdj0hMDthLmZvckVhY2goZnVuY3Rpb24oeSl7dmFyIG09IiIuY29uY2F0KHAsInwiKS5jb25jYXQoeSk7IW8ucmVsb2FkJiZ1LnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKHAseSk/dS5zdGF0ZVttXT0yOnUuc3RhdGVbbV08MHx8KHUuc3RhdGVbbV09PT0xP2NbbV09PT12b2lkIDAmJihjW21dPSEwKToodS5zdGF0ZVttXT0xLHY9ITEsY1ttXT09PXZvaWQgMCYmKGNbbV09ITApLGxbbV09PT12b2lkIDAmJihsW21dPSEwKSxnW3ldPT09dm9pZCAwJiYoZ1t5XT0hMCkpKX0pLHZ8fChmW3BdPSEwKX0pLChPYmplY3Qua2V5cyhsKS5sZW5ndGh8fE9iamVjdC5rZXlzKGMpLmxlbmd0aCkmJnRoaXMucXVldWUucHVzaCh7cGVuZGluZzpjLHBlbmRpbmdDb3VudDpPYmplY3Qua2V5cyhjKS5sZW5ndGgsbG9hZGVkOnt9LGVycm9yczpbXSxjYWxsYmFjazpzfSkse3RvTG9hZDpPYmplY3Qua2V5cyhsKSxwZW5kaW5nOk9iamVjdC5rZXlzKGMpLHRvTG9hZExhbmd1YWdlczpPYmplY3Qua2V5cyhmKSx0b0xvYWROYW1lc3BhY2VzOk9iamVjdC5rZXlzKGcpfX19LHtrZXk6ImxvYWRlZCIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3ZhciBzPWUuc3BsaXQoInwiKSx1PXNbMF0sbD1zWzFdO2EmJnRoaXMuZW1pdCgiZmFpbGVkTG9hZGluZyIsdSxsLGEpLG8mJnRoaXMuc3RvcmUuYWRkUmVzb3VyY2VCdW5kbGUodSxsLG8pLHRoaXMuc3RhdGVbZV09YT8tMToyO3ZhciBjPXt9O3RoaXMucXVldWUuZm9yRWFjaChmdW5jdGlvbihmKXtYZShmLmxvYWRlZCxbdV0sbCksT3QoZixlKSxhJiZmLmVycm9ycy5wdXNoKGEpLGYucGVuZGluZ0NvdW50PT09MCYmIWYuZG9uZSYmKE9iamVjdC5rZXlzKGYubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2NbZ118fChjW2ddPXt9KTt2YXIgcD1mLmxvYWRlZFtnXTtwLmxlbmd0aCYmcC5mb3JFYWNoKGZ1bmN0aW9uKHYpe2NbZ11bdl09PT12b2lkIDAmJihjW2ddW3ZdPSEwKX0pfSksZi5kb25lPSEwLGYuZXJyb3JzLmxlbmd0aD9mLmNhbGxiYWNrKGYuZXJyb3JzKTpmLmNhbGxiYWNrKCkpfSksdGhpcy5lbWl0KCJsb2FkZWQiLGMpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuIWYuZG9uZX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106MCxsPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTp0aGlzLnJldHJ5VGltZW91dCxjPWFyZ3VtZW50cy5sZW5ndGg+NT9hcmd1bWVudHNbNV06dm9pZCAwO2lmKCFlLmxlbmd0aClyZXR1cm4gYyhudWxsLHt9KTtpZih0aGlzLnJlYWRpbmdDYWxscz49dGhpcy5tYXhQYXJhbGxlbFJlYWRzKXt0aGlzLndhaXRpbmdSZWFkcy5wdXNoKHtsbmc6ZSxuczphLGZjTmFtZTpvLHRyaWVkOnUsd2FpdDpsLGNhbGxiYWNrOmN9KTtyZXR1cm59cmV0dXJuIHRoaXMucmVhZGluZ0NhbGxzKyssdGhpcy5iYWNrZW5kW29dKGUsYSxmdW5jdGlvbihmLGcpe2lmKHMucmVhZGluZ0NhbGxzLS0scy53YWl0aW5nUmVhZHMubGVuZ3RoPjApe3ZhciBwPXMud2FpdGluZ1JlYWRzLnNoaWZ0KCk7cy5yZWFkKHAubG5nLHAubnMscC5mY05hbWUscC50cmllZCxwLndhaXQscC5jYWxsYmFjayl9aWYoZiYmZyYmdTxzLm1heFJldHJpZXMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzLnJlYWQuY2FsbChzLGUsYSxvLHUrMSxsKjIsYyl9LGwpO3JldHVybn1jKGYsZyl9KX19LHtrZXk6InByZXBhcmVMb2FkaW5nIix2YWx1ZTpmdW5jdGlvbihlLGEpe3ZhciBvPXRoaXMscz1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sdT1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMDtpZighdGhpcy5iYWNrZW5kKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJObyBiYWNrZW5kIHdhcyBhZGRlZCB2aWEgaTE4bmV4dC51c2UuIFdpbGwgbm90IGxvYWQgcmVzb3VyY2VzLiIpLHUmJnUoKTt0eXBlb2YgZT09InN0cmluZyImJihlPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZSkpLHR5cGVvZiBhPT0ic3RyaW5nIiYmKGE9W2FdKTt2YXIgbD10aGlzLnF1ZXVlTG9hZChlLGEscyx1KTtpZighbC50b0xvYWQubGVuZ3RoKXJldHVybiBsLnBlbmRpbmcubGVuZ3RofHx1KCksbnVsbDtsLnRvTG9hZC5mb3JFYWNoKGZ1bmN0aW9uKGMpe28ubG9hZE9uZShjKX0pfX0se2tleToibG9hZCIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3RoaXMucHJlcGFyZUxvYWRpbmcoZSxhLHt9LG8pfX0se2tleToicmVsb2FkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dGhpcy5wcmVwYXJlTG9hZGluZyhlLGEse3JlbG9hZDohMH0sbyl9fSx7a2V5OiJsb2FkT25lIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiIiLHM9ZS5zcGxpdCgifCIpLHU9c1swXSxsPXNbMV07dGhpcy5yZWFkKHUsbCwicmVhZCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbihjLGYpe2MmJmEubG9nZ2VyLndhcm4oIiIuY29uY2F0KG8sImxvYWRpbmcgbmFtZXNwYWNlICIpLmNvbmNhdChsLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdCh1LCIgZmFpbGVkIiksYyksIWMmJmYmJmEubG9nZ2VyLmxvZygiIi5jb25jYXQobywibG9hZGVkIG5hbWVzcGFjZSAiKS5jb25jYXQobCwiIGZvciBsYW5ndWFnZSAiKS5jb25jYXQodSksZiksYS5sb2FkZWQoZSxjLGYpfSl9fSx7a2V5OiJzYXZlTWlzc2luZyIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8scyx1KXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06e307aWYodGhpcy5zZXJ2aWNlcy51dGlscyYmdGhpcy5zZXJ2aWNlcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiF0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShhKSl7dGhpcy5sb2dnZXIud2FybignZGlkIG5vdCBzYXZlIGtleSAiJy5jb25jYXQobywnIiBhcyB0aGUgbmFtZXNwYWNlICInKS5jb25jYXQoYSwnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIik7cmV0dXJufW89PW51bGx8fG89PT0iInx8KHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZShlLGEsbyxzLG51bGwsX2UoX2Uoe30sbCkse30se2lzVXBkYXRlOnV9KSksISghZXx8IWVbMF0pJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlKGVbMF0sYSxvLHMpKX19XSksbn0oSSk7ZnVuY3Rpb24gU3QoKXtyZXR1cm57ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIG49e307aWYoUCh0WzFdKT09PSJvYmplY3QiJiYobj10WzFdKSx0eXBlb2YgdFsxXT09InN0cmluZyImJihuLmRlZmF1bHRWYWx1ZT10WzFdKSx0eXBlb2YgdFsyXT09InN0cmluZyImJihuLnREZXNjcmlwdGlvbj10WzJdKSxQKHRbMl0pPT09Im9iamVjdCJ8fFAodFszXSk9PT0ib2JqZWN0Iil7dmFyIHI9dFszXXx8dFsyXTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZV09cltlXX0pfXJldHVybiBufSxpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMCxmb3JtYXQ6ZnVuY3Rpb24odCxuLHIsZSl7cmV0dXJuIHR9LHByZWZpeDoie3siLHN1ZmZpeDoifX0iLGZvcm1hdFNlcGFyYXRvcjoiLCIsdW5lc2NhcGVQcmVmaXg6Ii0iLG5lc3RpbmdQcmVmaXg6IiR0KCIsbmVzdGluZ1N1ZmZpeDoiKSIsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6IiwiLG1heFJlcGxhY2VzOjFlMyxza2lwT25WYXJpYWJsZXM6ITB9fX1mdW5jdGlvbiBGZShpKXtyZXR1cm4gdHlwZW9mIGkubnM9PSJzdHJpbmciJiYoaS5ucz1baS5uc10pLHR5cGVvZiBpLmZhbGxiYWNrTG5nPT0ic3RyaW5nIiYmKGkuZmFsbGJhY2tMbmc9W2kuZmFsbGJhY2tMbmddKSx0eXBlb2YgaS5mYWxsYmFja05TPT0ic3RyaW5nIiYmKGkuZmFsbGJhY2tOUz1baS5mYWxsYmFja05TXSksaS5zdXBwb3J0ZWRMbmdzJiZpLnN1cHBvcnRlZExuZ3MuaW5kZXhPZigiY2ltb2RlIik8MCYmKGkuc3VwcG9ydGVkTG5ncz1pLnN1cHBvcnRlZExuZ3MuY29uY2F0KFsiY2ltb2RlIl0pKSxpfWZ1bmN0aW9uIEllKGksdCl7dmFyIG49T2JqZWN0LmtleXMoaSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhpKTt0JiYocj1yLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLGUpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gQyhpKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF0hPW51bGw/YXJndW1lbnRzW3RdOnt9O3QlMj9JZShPYmplY3QobiksITApLmZvckVhY2goZnVuY3Rpb24ocil7RihpLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpJZShPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGl9ZnVuY3Rpb24geHQoaSl7dmFyIHQ9UHQoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1qKGkpLGU7aWYodCl7dmFyIGE9aih0aGlzKS5jb25zdHJ1Y3RvcjtlPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGEpfWVsc2UgZT1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gVih0aGlzLGUpfX1mdW5jdGlvbiBQdCgpe2lmKHR5cGVvZiBSZWZsZWN0PiJ1Inx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKHR5cGVvZiBQcm94eT09ImZ1bmN0aW9uIilyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBlZSgpe31mdW5jdGlvbiBMdChpKXt2YXIgdD1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoaSkpO3QuZm9yRWFjaChmdW5jdGlvbihuKXt0eXBlb2YgaVtuXT09ImZ1bmN0aW9uIiYmKGlbbl09aVtuXS5iaW5kKGkpKX0pfXZhciB0ZT1mdW5jdGlvbihpKXtRKG4saSk7dmFyIHQ9eHQobik7ZnVuY3Rpb24gbigpe3ZhciByLGU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LGE9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoUih0aGlzLG4pLHI9dC5jYWxsKHRoaXMpLHEmJkkuY2FsbChfKHIpKSxyLm9wdGlvbnM9RmUoZSksci5zZXJ2aWNlcz17fSxyLmxvZ2dlcj1OLHIubW9kdWxlcz17ZXh0ZXJuYWw6W119LEx0KF8ocikpLGEmJiFyLmlzSW5pdGlhbGl6ZWQmJiFlLmlzQ2xvbmUpe2lmKCFyLm9wdGlvbnMuaW5pdEltbWVkaWF0ZSlyZXR1cm4gci5pbml0KGUsYSksVihyLF8ocikpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmluaXQoZSxhKX0sMCl9cmV0dXJuIHJ9cmV0dXJuIGsobixbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGE9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LG89YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7dHlwZW9mIGE9PSJmdW5jdGlvbiImJihvPWEsYT17fSksIWEuZGVmYXVsdE5TJiZhLmRlZmF1bHROUyE9PSExJiZhLm5zJiYodHlwZW9mIGEubnM9PSJzdHJpbmciP2EuZGVmYXVsdE5TPWEubnM6YS5ucy5pbmRleE9mKCJ0cmFuc2xhdGlvbiIpPDAmJihhLmRlZmF1bHROUz1hLm5zWzBdKSk7dmFyIHM9U3QoKTt0aGlzLm9wdGlvbnM9QyhDKEMoe30scyksdGhpcy5vcHRpb25zKSxGZShhKSksdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkhPT0idjEiJiYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb249QyhDKHt9LHMuaW50ZXJwb2xhdGlvbiksdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24pKSxhLmtleVNlcGFyYXRvciE9PXZvaWQgMCYmKHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZEtleVNlcGFyYXRvcj1hLmtleVNlcGFyYXRvciksYS5uc1NlcGFyYXRvciE9PXZvaWQgMCYmKHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZE5zU2VwYXJhdG9yPWEubnNTZXBhcmF0b3IpO2Z1bmN0aW9uIHUoZCl7cmV0dXJuIGQ/dHlwZW9mIGQ9PSJmdW5jdGlvbiI/bmV3IGQ6ZDpudWxsfWlmKCF0aGlzLm9wdGlvbnMuaXNDbG9uZSl7dGhpcy5tb2R1bGVzLmxvZ2dlcj9OLmluaXQodSh0aGlzLm1vZHVsZXMubG9nZ2VyKSx0aGlzLm9wdGlvbnMpOk4uaW5pdChudWxsLHRoaXMub3B0aW9ucyk7dmFyIGw7dGhpcy5tb2R1bGVzLmZvcm1hdHRlcj9sPXRoaXMubW9kdWxlcy5mb3JtYXR0ZXI6dHlwZW9mIEludGw8InUiJiYobD1tdCk7dmFyIGM9bmV3IGZ0KHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgb3QodGhpcy5vcHRpb25zLnJlc291cmNlcyx0aGlzLm9wdGlvbnMpO3ZhciBmPXRoaXMuc2VydmljZXM7Zi5sb2dnZXI9TixmLnJlc291cmNlU3RvcmU9dGhpcy5zdG9yZSxmLmxhbmd1YWdlVXRpbHM9YyxmLnBsdXJhbFJlc29sdmVyPW5ldyBkdChjLHtwcmVwZW5kOnRoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsY29tcGF0aWJpbGl0eUpTT046dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OLHNpbXBsaWZ5UGx1cmFsU3VmZml4OnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeH0pLGwmJighdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0fHx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQ9PT1zLmludGVycG9sYXRpb24uZm9ybWF0KSYmKGYuZm9ybWF0dGVyPXUobCksZi5mb3JtYXR0ZXIuaW5pdChmLHRoaXMub3B0aW9ucyksdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0PWYuZm9ybWF0dGVyLmZvcm1hdC5iaW5kKGYuZm9ybWF0dGVyKSksZi5pbnRlcnBvbGF0b3I9bmV3IGh0KHRoaXMub3B0aW9ucyksZi51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcyl9LGYuYmFja2VuZENvbm5lY3Rvcj1uZXcgd3QodSh0aGlzLm1vZHVsZXMuYmFja2VuZCksZi5yZXNvdXJjZVN0b3JlLGYsdGhpcy5vcHRpb25zKSxmLmJhY2tlbmRDb25uZWN0b3Iub24oIioiLGZ1bmN0aW9uKGQpe2Zvcih2YXIgaD1hcmd1bWVudHMubGVuZ3RoLE89bmV3IEFycmF5KGg+MT9oLTE6MCksYj0xO2I8aDtiKyspT1tiLTFdPWFyZ3VtZW50c1tiXTtlLmVtaXQuYXBwbHkoZSxbZF0uY29uY2F0KE8pKX0pLHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yJiYoZi5sYW5ndWFnZURldGVjdG9yPXUodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IpLGYubGFuZ3VhZ2VEZXRlY3Rvci5pbml0KGYsdGhpcy5vcHRpb25zLmRldGVjdGlvbix0aGlzLm9wdGlvbnMpKSx0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCYmKGYuaTE4bkZvcm1hdD11KHRoaXMubW9kdWxlcy5pMThuRm9ybWF0KSxmLmkxOG5Gb3JtYXQuaW5pdCYmZi5pMThuRm9ybWF0LmluaXQodGhpcykpLHRoaXMudHJhbnNsYXRvcj1uZXcga2UodGhpcy5zZXJ2aWNlcyx0aGlzLm9wdGlvbnMpLHRoaXMudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24oZCl7Zm9yKHZhciBoPWFyZ3VtZW50cy5sZW5ndGgsTz1uZXcgQXJyYXkoaD4xP2gtMTowKSxiPTE7YjxoO2IrKylPW2ItMV09YXJndW1lbnRzW2JdO2UuZW1pdC5hcHBseShlLFtkXS5jb25jYXQoTykpfSksdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5pbml0JiZkLmluaXQoZSl9KX1pZih0aGlzLmZvcm1hdD10aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQsb3x8KG89ZWUpLHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyYmIXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmIXRoaXMub3B0aW9ucy5sbmcpe3ZhciBnPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7Zy5sZW5ndGg+MCYmZ1swXSE9PSJkZXYiJiYodGhpcy5vcHRpb25zLmxuZz1nWzBdKX0hdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5vcHRpb25zLmxuZyYmdGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpO3ZhciBwPVsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXTtwLmZvckVhY2goZnVuY3Rpb24oZCl7ZVtkXT1mdW5jdGlvbigpe3ZhciBoO3JldHVybihoPWUuc3RvcmUpW2RdLmFwcGx5KGgsYXJndW1lbnRzKX19KTt2YXIgdj1bImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdO3YuZm9yRWFjaChmdW5jdGlvbihkKXtlW2RdPWZ1bmN0aW9uKCl7dmFyIGg7cmV0dXJuKGg9ZS5zdG9yZSlbZF0uYXBwbHkoaCxhcmd1bWVudHMpLGV9fSk7dmFyIHk9JCgpLG09ZnVuY3Rpb24oKXt2YXIgaD1mdW5jdGlvbihiLHgpe2UuaXNJbml0aWFsaXplZCYmIWUuaW5pdGlhbGl6ZWRTdG9yZU9uY2UmJmUubG9nZ2VyLndhcm4oImluaXQ6IGkxOG5leHQgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4gWW91IHNob3VsZCBjYWxsIGluaXQganVzdCBvbmNlISIpLGUuaXNJbml0aWFsaXplZD0hMCxlLm9wdGlvbnMuaXNDbG9uZXx8ZS5sb2dnZXIubG9nKCJpbml0aWFsaXplZCIsZS5vcHRpb25zKSxlLmVtaXQoImluaXRpYWxpemVkIixlLm9wdGlvbnMpLHkucmVzb2x2ZSh4KSxvKGIseCl9O2lmKGUubGFuZ3VhZ2VzJiZlLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSE9PSJ2MSImJiFlLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIGgobnVsbCxlLnQuYmluZChlKSk7ZS5jaGFuZ2VMYW5ndWFnZShlLm9wdGlvbnMubG5nLGgpfTtyZXR1cm4gdGhpcy5vcHRpb25zLnJlc291cmNlc3x8IXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlP20oKTpzZXRUaW1lb3V0KG0sMCkseX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ZWUscz1vLHU9dHlwZW9mIGU9PSJzdHJpbmciP2U6dGhpcy5sYW5ndWFnZTtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIiYmKHM9ZSksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYodSYmdS50b0xvd2VyQ2FzZSgpPT09ImNpbW9kZSIpcmV0dXJuIHMoKTt2YXIgbD1bXSxjPWZ1bmN0aW9uKHApe2lmKHApe3ZhciB2PWEuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkocCk7di5mb3JFYWNoKGZ1bmN0aW9uKHkpe2wuaW5kZXhPZih5KTwwJiZsLnB1c2goeSl9KX19O2lmKHUpYyh1KTtlbHNle3ZhciBmPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7Zi5mb3JFYWNoKGZ1bmN0aW9uKGcpe3JldHVybiBjKGcpfSl9dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24oZyl7cmV0dXJuIGMoZyl9KSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZChsLHRoaXMub3B0aW9ucy5ucyxmdW5jdGlvbihnKXshZyYmIWEucmVzb2x2ZWRMYW5ndWFnZSYmYS5sYW5ndWFnZSYmYS5zZXRSZXNvbHZlZExhbmd1YWdlKGEubGFuZ3VhZ2UpLHMoZyl9KX1lbHNlIHMobnVsbCl9fSx7a2V5OiJyZWxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgcz0kKCk7cmV0dXJuIGV8fChlPXRoaXMubGFuZ3VhZ2VzKSxhfHwoYT10aGlzLm9wdGlvbnMubnMpLG98fChvPWVlKSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IucmVsb2FkKGUsYSxmdW5jdGlvbih1KXtzLnJlc29sdmUoKSxvKHUpfSksc319LHtrZXk6InVzZSIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYW4gdW5kZWZpbmVkIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtpZighZS50eXBlKXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGEgd3JvbmcgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO3JldHVybiBlLnR5cGU9PT0iYmFja2VuZCImJih0aGlzLm1vZHVsZXMuYmFja2VuZD1lKSwoZS50eXBlPT09ImxvZ2dlciJ8fGUubG9nJiZlLndhcm4mJmUuZXJyb3IpJiYodGhpcy5tb2R1bGVzLmxvZ2dlcj1lKSxlLnR5cGU9PT0ibGFuZ3VhZ2VEZXRlY3RvciImJih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcj1lKSxlLnR5cGU9PT0iaTE4bkZvcm1hdCImJih0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdD1lKSxlLnR5cGU9PT0icG9zdFByb2Nlc3NvciImJlBlLmFkZFBvc3RQcm9jZXNzb3IoZSksZS50eXBlPT09ImZvcm1hdHRlciImJih0aGlzLm1vZHVsZXMuZm9ybWF0dGVyPWUpLGUudHlwZT09PSIzcmRQYXJ0eSImJnRoaXMubW9kdWxlcy5leHRlcm5hbC5wdXNoKGUpLHRoaXN9fSx7a2V5OiJzZXRSZXNvbHZlZExhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbihlKXtpZighKCFlfHwhdGhpcy5sYW5ndWFnZXMpJiYhKFsiY2ltb2RlIiwiZGV2Il0uaW5kZXhPZihlKT4tMSkpZm9yKHZhciBhPTA7YTx0aGlzLmxhbmd1YWdlcy5sZW5ndGg7YSsrKXt2YXIgbz10aGlzLmxhbmd1YWdlc1thXTtpZighKFsiY2ltb2RlIiwiZGV2Il0uaW5kZXhPZihvKT4tMSkmJnRoaXMuc3RvcmUuaGFzTGFuZ3VhZ2VTb21lVHJhbnNsYXRpb25zKG8pKXt0aGlzLnJlc29sdmVkTGFuZ3VhZ2U9bzticmVha319fX0se2tleToiY2hhbmdlTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89dGhpczt0aGlzLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPWU7dmFyIHM9JCgpO3RoaXMuZW1pdCgibGFuZ3VhZ2VDaGFuZ2luZyIsZSk7dmFyIHU9ZnVuY3Rpb24oZyl7by5sYW5ndWFnZT1nLG8ubGFuZ3VhZ2VzPW8uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZyksby5yZXNvbHZlZExhbmd1YWdlPXZvaWQgMCxvLnNldFJlc29sdmVkTGFuZ3VhZ2UoZyl9LGw9ZnVuY3Rpb24oZyxwKXtwPyh1KHApLG8udHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShwKSxvLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxvLmVtaXQoImxhbmd1YWdlQ2hhbmdlZCIscCksby5sb2dnZXIubG9nKCJsYW5ndWFnZUNoYW5nZWQiLHApKTpvLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxzLnJlc29sdmUoZnVuY3Rpb24oKXtyZXR1cm4gby50LmFwcGx5KG8sYXJndW1lbnRzKX0pLGEmJmEoZyxmdW5jdGlvbigpe3JldHVybiBvLnQuYXBwbHkobyxhcmd1bWVudHMpfSl9LGM9ZnVuY3Rpb24oZyl7IWUmJiFnJiZvLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJihnPVtdKTt2YXIgcD10eXBlb2YgZz09InN0cmluZyI/ZzpvLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKGcpO3AmJihvLmxhbmd1YWdlfHx1KHApLG8udHJhbnNsYXRvci5sYW5ndWFnZXx8by50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKHApLG8uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmby5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKHApKSxvLmxvYWRSZXNvdXJjZXMocCxmdW5jdGlvbih2KXtsKHYscCl9KX07cmV0dXJuIWUmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmIXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz9jKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSk6IWUmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP3RoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoYyk6YyhlKSxzfX0se2tleToiZ2V0Rml4ZWRUIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHM9dGhpcyx1PWZ1bmN0aW9uIGwoYyxmKXt2YXIgZztpZihQKGYpIT09Im9iamVjdCIpe2Zvcih2YXIgcD1hcmd1bWVudHMubGVuZ3RoLHY9bmV3IEFycmF5KHA+Mj9wLTI6MCkseT0yO3k8cDt5Kyspdlt5LTJdPWFyZ3VtZW50c1t5XTtnPXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbYyxmXS5jb25jYXQodikpfWVsc2UgZz1DKHt9LGYpO2cubG5nPWcubG5nfHxsLmxuZyxnLmxuZ3M9Zy5sbmdzfHxsLmxuZ3MsZy5ucz1nLm5zfHxsLm5zLGcua2V5UHJlZml4PWcua2V5UHJlZml4fHxvfHxsLmtleVByZWZpeDt2YXIgbT1zLm9wdGlvbnMua2V5U2VwYXJhdG9yfHwiLiIsZD1nLmtleVByZWZpeD8iIi5jb25jYXQoZy5rZXlQcmVmaXgpLmNvbmNhdChtKS5jb25jYXQoYyk6YztyZXR1cm4gcy50KGQsZyl9O3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/dS5sbmc9ZTp1LmxuZ3M9ZSx1Lm5zPWEsdS5rZXlQcmVmaXg9byx1fX0se2tleToidCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYoZT10aGlzLnRyYW5zbGF0b3IpLnRyYW5zbGF0ZS5hcHBseShlLGFyZ3VtZW50cyl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKGU9dGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkoZSxhcmd1bWVudHMpfX0se2tleToic2V0RGVmYXVsdE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz1lfX0se2tleToiaGFzTG9hZGVkTmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkIix0aGlzLmxhbmd1YWdlcyksITE7aWYoIXRoaXMubGFuZ3VhZ2VzfHwhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5Iix0aGlzLmxhbmd1YWdlcyksITE7dmFyIHM9dGhpcy5yZXNvbHZlZExhbmd1YWdlfHx0aGlzLmxhbmd1YWdlc1swXSx1PXRoaXMub3B0aW9ucz90aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmc6ITEsbD10aGlzLmxhbmd1YWdlc1t0aGlzLmxhbmd1YWdlcy5sZW5ndGgtMV07aWYocy50b0xvd2VyQ2FzZSgpPT09ImNpbW9kZSIpcmV0dXJuITA7dmFyIGM9ZnVuY3Rpb24ocCx2KXt2YXIgeT1hLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3Iuc3RhdGVbIiIuY29uY2F0KHAsInwiKS5jb25jYXQodildO3JldHVybiB5PT09LTF8fHk9PT0yfTtpZihvLnByZWNoZWNrKXt2YXIgZj1vLnByZWNoZWNrKHRoaXMsYyk7aWYoZiE9PXZvaWQgMClyZXR1cm4gZn1yZXR1cm4hISh0aGlzLmhhc1Jlc291cmNlQnVuZGxlKHMsZSl8fCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8dGhpcy5vcHRpb25zLnJlc291cmNlcyYmIXRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlc3x8YyhzLGUpJiYoIXV8fGMobCxlKSkpfX0se2tleToibG9hZE5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89dGhpcyxzPSQoKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5zPyh0eXBlb2YgZT09InN0cmluZyImJihlPVtlXSksZS5mb3JFYWNoKGZ1bmN0aW9uKHUpe28ub3B0aW9ucy5ucy5pbmRleE9mKHUpPDAmJm8ub3B0aW9ucy5ucy5wdXNoKHUpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHUpe3MucmVzb2x2ZSgpLGEmJmEodSl9KSxzKTooYSYmYSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImxvYWRMYW5ndWFnZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89JCgpO3R5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKTt2YXIgcz10aGlzLm9wdGlvbnMucHJlbG9hZHx8W10sdT1lLmZpbHRlcihmdW5jdGlvbihsKXtyZXR1cm4gcy5pbmRleE9mKGwpPDB9KTtyZXR1cm4gdS5sZW5ndGg/KHRoaXMub3B0aW9ucy5wcmVsb2FkPXMuY29uY2F0KHUpLHRoaXMubG9hZFJlc291cmNlcyhmdW5jdGlvbihsKXtvLnJlc29sdmUoKSxhJiZhKGwpfSksbyk6KGEmJmEoKSxQcm9taXNlLnJlc29sdmUoKSl9fSx7a2V5OiJkaXIiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKGV8fChlPXRoaXMucmVzb2x2ZWRMYW5ndWFnZXx8KHRoaXMubGFuZ3VhZ2VzJiZ0aGlzLmxhbmd1YWdlcy5sZW5ndGg+MD90aGlzLmxhbmd1YWdlc1swXTp0aGlzLmxhbmd1YWdlKSksIWUpcmV0dXJuInJ0bCI7dmFyIGE9WyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSIsImNrYiJdO3JldHVybiBhLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGUpKT4tMXx8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi1hcmFiIik+MT8icnRsIjoibHRyIn19LHtrZXk6ImNsb25lSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxhPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTp7fSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTplZSxzPUMoQyhDKHt9LHRoaXMub3B0aW9ucyksYSkse2lzQ2xvbmU6ITB9KSx1PW5ldyBuKHMpOyhhLmRlYnVnIT09dm9pZCAwfHxhLnByZWZpeCE9PXZvaWQgMCkmJih1LmxvZ2dlcj11LmxvZ2dlci5jbG9uZShhKSk7dmFyIGw9WyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXTtyZXR1cm4gbC5mb3JFYWNoKGZ1bmN0aW9uKGMpe3VbY109ZVtjXX0pLHUuc2VydmljZXM9Qyh7fSx0aGlzLnNlcnZpY2VzKSx1LnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh1KX0sdS50cmFuc2xhdG9yPW5ldyBrZSh1LnNlcnZpY2VzLHUub3B0aW9ucyksdS50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihjKXtmb3IodmFyIGY9YXJndW1lbnRzLmxlbmd0aCxnPW5ldyBBcnJheShmPjE/Zi0xOjApLHA9MTtwPGY7cCsrKWdbcC0xXT1hcmd1bWVudHNbcF07dS5lbWl0LmFwcGx5KHUsW2NdLmNvbmNhdChnKSl9KSx1LmluaXQocyxvKSx1LnRyYW5zbGF0b3Iub3B0aW9ucz11Lm9wdGlvbnMsdS50cmFuc2xhdG9yLmJhY2tlbmRDb25uZWN0b3Iuc2VydmljZXMudXRpbHM9e2hhc0xvYWRlZE5hbWVzcGFjZTp1Lmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKHUpfSx1fX0se2tleToidG9KU09OIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybntvcHRpb25zOnRoaXMub3B0aW9ucyxzdG9yZTp0aGlzLnN0b3JlLGxhbmd1YWdlOnRoaXMubGFuZ3VhZ2UsbGFuZ3VhZ2VzOnRoaXMubGFuZ3VhZ2VzLHJlc29sdmVkTGFuZ3VhZ2U6dGhpcy5yZXNvbHZlZExhbmd1YWdlfX19XSksbn0oSSk7Rih0ZSwiY3JlYXRlSW5zdGFuY2UiLGZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LHQ9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7cmV0dXJuIG5ldyB0ZShpLHQpfSk7dmFyIFM9dGUuY3JlYXRlSW5zdGFuY2UoKTtTLmNyZWF0ZUluc3RhbmNlPXRlLmNyZWF0ZUluc3RhbmNlLFMuY3JlYXRlSW5zdGFuY2UsUy5pbml0LFMubG9hZFJlc291cmNlcyxTLnJlbG9hZFJlc291cmNlcyxTLnVzZSxTLmNoYW5nZUxhbmd1YWdlLFMuZ2V0Rml4ZWRULFMudCxTLmV4aXN0cyxTLnNldERlZmF1bHROYW1lc3BhY2UsUy5oYXNMb2FkZWROYW1lc3BhY2UsUy5sb2FkTmFtZXNwYWNlcyxTLmxvYWRMYW5ndWFnZXM7ZnVuY3Rpb24gUnQoaSx0KXtyZXR1cm4gdD9gJHtpfV8ke3R9YDppfWZ1bmN0aW9uIHVlKGkpe3JldHVybiBpLnJlZHVjZSgodCxuKT0+dCtuLDApL2kubGVuZ3RofWZ1bmN0aW9uIERlKGkpe3JldHVybiBpLnJlZHVjZSgodCxuKT0+dCtuLDApfWZ1bmN0aW9uIGt0KGkpe2NvbnN0IHQ9aS5zb3J0KChyLGUpPT5yLWUpLG49TWF0aC5mbG9vcih0Lmxlbmd0aC8yKTtyZXR1cm4gdC5sZW5ndGglMj09PTA/KHRbbl0rdFtuLTFdKS8yOnRbbl19ZnVuY3Rpb24gVGUoaSl7Y29uc3QgdD11ZShpKTtyZXR1cm4gdWUoaS5tYXAobj0+KG4tdCkqKjIpKX1mdW5jdGlvbiBqdChpKXtyZXR1cm4gTWF0aC5zcXJ0KFRlKGkpKX1mdW5jdGlvbiBOdChpKXtsZXQgdD0tMS8wO2ZvcihsZXQgbiBvZiBpKW4+dCYmKHQ9bik7cmV0dXJuIHR9ZnVuY3Rpb24gQ3QoaSl7bGV0IHQ9MS8wO2ZvcihsZXQgbiBvZiBpKW48dCYmKHQ9bik7cmV0dXJuIHR9ZnVuY3Rpb24gRXQoaSl7cmV0dXJuIGkubGVuZ3RofWZ1bmN0aW9uIF90KGkpe3JldHVybiBuZXcgU2V0KGkpLnNpemV9Y29uc3QgRnQ9e3N1bTpEZSxtZWFuOnVlLG1lZGlhbjprdCxzdGRldjpqdCx2YXJpYW5jZTpUZSxtYXg6TnQsbWluOkN0LGNvdW50OkV0LGRpc3RpbmN0Q291bnQ6X3R9LEl0PSJfX18iO2Z1bmN0aW9uIER0KGksdCl7dmFyIG87Y29uc3R7Z3JvdXBCeTpuLG1lYXN1cmVzOnJ9PXQsZT1uZXcgTWFwLGE9bmV3IE1hcDtmb3IobGV0IHMgb2YgaSl7Y29uc3QgdT1uLm1hcChsPT5zW2xdKS5qb2luKEl0KTthLmhhcyh1KXx8YS5zZXQodSxbXSksKG89YS5nZXQodSkpPT1udWxsfHxvLnB1c2gocyl9Zm9yKGxldFtzLHVdb2YgYSl7aWYodS5sZW5ndGg9PT0wKWNvbnRpbnVlO2xldCBsPXt9O2ZvcihsZXQgYyBvZiBuKWxbY109dVswXVtjXTtmb3IobGV0IGMgb2Ygcil7Y29uc3QgZj1jLmFzRmllbGRLZXl8fFJ0KGMuZmllbGQsYy5hZ2cpO2xbZl09PT12b2lkIDAmJihsW2ZdPTApO2NvbnN0IGc9dS5tYXAodj0+dltjLmZpZWxkXSkubWFwKHY9PmMuZm9ybWF0P25ldyBEYXRlKHYpLmdldFRpbWUoKTp2KSxwPUZ0W2MuYWdnXT8/RGU7bFtmXT1wKGcpfWUuc2V0KHMsbCl9cmV0dXJuIEFycmF5LmZyb20oZS52YWx1ZXMoKSl9ZnVuY3Rpb24gVHQoaSx0KXtjb25zdHtmb2xkQnk6bixuZXdGb2xkS2V5Q29sOnIsbmV3Rm9sZFZhbHVlQ29sOmV9PXQsYT1bXTtmb3IobGV0IG8gb2YgaSlmb3IobGV0IHMgb2Ygbil7Y29uc3QgdT17Li4ub307dVtyXT1zLHVbZV09b1tzXSxkZWxldGUgdVtzXSxhLnB1c2godSl9cmV0dXJuIGF9ZnVuY3Rpb24gQXQoaSx0KXtjb25zdHtiaW5CeTpuLG5ld0JpbkNvbDpyLGJpblNpemU6ZX09dDtsZXQgYT0xLzAsbz0tMS8wO2ZvcihsZXQgdT0wO3U8aS5sZW5ndGg7dSsrKXtsZXQgbD1pW3VdW25dO2w+byYmKG89bCksbDxhJiYoYT1sKX1jb25zdCBzPShvLWEpL2U7cmV0dXJuIGkubWFwKHU9PntsZXQgbD1NYXRoLmZsb29yKCh1W25dLWEpL3MpO3JldHVybiBsPT09ZSYmKGw9ZS0xKSx7Li4udSxbcl06W2wqcythLChsKzEpKnMrYV19fSl9ZnVuY3Rpb24gS3QoaSx0KXtzd2l0Y2godC5vcCl7Y2FzZSJhZ2dyZWdhdGUiOnJldHVybiBEdChpLHQpO2Nhc2UiZm9sZCI6cmV0dXJuIFR0KGksdCk7Y2FzZSJiaW4iOnJldHVybiBBdChpLHQpO2Nhc2UicmF3IjpkZWZhdWx0OnJldHVybiBpfX1jb25zdCBVdD1pPT57dHJ5e2NvbnN0e2RhdGFTb3VyY2U6dCxxdWVyeTpufT1pLmRhdGEscj1LdCh0LG4pO3NlbGYucG9zdE1lc3NhZ2Uocil9Y2F0Y2godCl7Y29uc29sZS5lcnJvcih0LnN0YWNrKSxzZWxmLnBvc3RNZXNzYWdlKHQuc3RhY2spfX07c2VsZi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixVdCwhMSl9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD12aWV3UXVlcnkud29ya2VyLTc4OTZlYWQ1LmpzLm1hcAo=",QD=typeof window<"u"&&window.Blob&&new Blob([atob($D)],{type:"text/javascript;charset=utf-8"});function $2e(){const e=QD&&(window.URL||window.webkitURL).createObjectURL(QD);try{return e?new Worker(e):new Worker("data:application/javascript;base64,"+$D)}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const qD="dmFyIHk9T2JqZWN0LmRlZmluZVByb3BlcnR5O3ZhciBDPShvLGEscCk9PmEgaW4gbz95KG8sYSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6cH0pOm9bYV09cDt2YXIgUz0obyxhLHApPT4oQyhvLHR5cGVvZiBhIT0ic3ltYm9sIj9hKyIiOmEscCkscCk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8odCxlLHIsbCxjLG4pe2lmKGw+PWUubGVuZ3RoKXJldHVybjtjb25zdCBpPXJbZVtsXV0sdT1gJHt0LnVuaXF1ZUtleX1fXyR7aX1gO2xldCBoPXQuY2hpbGRyZW4uZmluZChmPT5mLmtleT09PWkpO2lmKCFoKXtoPXtrZXk6aSx2YWx1ZTppLHNvcnQ6bD09PWUubGVuZ3RoLTEmJm4/cltuLmZpZF0/P2BfJHtpfWA6aSx1bmlxdWVLZXk6dSxmaWVsZEtleTplW2xdLGNoaWxkcmVuOltdLHBhdGg6Wy4uLnQucGF0aCx7a2V5OmVbbF0sdmFsdWU6aX1dLGhlaWdodDplLmxlbmd0aC1sLTEsaXNDb2xsYXBzZWQ6ITF9LGMuaW5jbHVkZXModC51bmlxdWVLZXkpJiYodC5pc0NvbGxhcHNlZD0hMCk7Y29uc3QgZj1sPT09ZS5sZW5ndGgtMSYmKG49PW51bGw/dm9pZCAwOm4udHlwZSk9PT0iZGVzY2VuZGluZyI7dC5jaGlsZHJlbi5zcGxpY2UoYSh0LmNoaWxkcmVuLGguc29ydCxmKSwwLGgpfW8oaCxlLHIsbCsxLGMsbil9ZnVuY3Rpb24gYSh0LGUscj0hMSl7bGV0IGw9MCxjPXQubGVuZ3RoLTE7Zm9yKDtsPD1jOyl7bGV0IG49TWF0aC5mbG9vcigobCtjKS8yKSxpPXRbbl0uc29ydDtpZih0eXBlb2YgaT09Im51bWJlciImJnR5cGVvZiBlPT0ibnVtYmVyIilyIT09aTxlP2w9bisxOmM9bi0xO2Vsc2V7bGV0IHU9U3RyaW5nKGkpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGUpKTtyIT09dTwwP2w9bisxOmM9bi0xfX1yZXR1cm4gbH1jb25zdCBwPSJfX3Jvb3QiLEU9Il9fdG90YWwiO2Z1bmN0aW9uIE0odCl7aWYodC5jaGlsZHJlbi5sZW5ndGg+MCl7dC5jaGlsZHJlbi5wdXNoKHtrZXk6RSx2YWx1ZToidG90YWwiLHNvcnQ6IiIsZmllbGRLZXk6dC5jaGlsZHJlblswXS5maWVsZEtleSx1bmlxdWVLZXk6YCR7dC51bmlxdWVLZXl9JHtFfWAsY2hpbGRyZW46W10scGF0aDpbXSxoZWlnaHQ6dC5jaGlsZHJlblswXS5oZWlnaHQsaXNDb2xsYXBzZWQ6ITB9KTtmb3IobGV0IGU9MDtlPHQuY2hpbGRyZW4ubGVuZ3RoLTE7ZSsrKU0odC5jaGlsZHJlbltlXSl9fWZ1bmN0aW9uIGcodCxlLHIsbCxjLG4pe2NvbnN0IGk9e2tleTpwLHZhbHVlOiJyb290IixmaWVsZEtleToicm9vdCIsc29ydDoiIix1bmlxdWVLZXk6cCxjaGlsZHJlbjpbXSxwYXRoOltdLGhlaWdodDp0Lmxlbmd0aCxpc0NvbGxhcHNlZDohMX07Zm9yKGxldCB1IG9mIGUpbyhpLHQsdSwwLHIsYyk7aWYobilmb3IobGV0IHUgb2YgbilvKGksdCx1LDAscix7ZmlkOiIiLHR5cGU6KGM9PW51bGw/dm9pZCAwOmMudHlwZSk/PyJhc2NlbmRpbmcifSk7cmV0dXJuIGwmJk0oaSksaX1jbGFzcyBOe2NvbnN0cnVjdG9yKGUpe1ModGhpcywidHJlZSIpO1ModGhpcywibm9kZVN0YWNrIixbXSk7Uyh0aGlzLCJjdXJyZW50IixudWxsKTt0aGlzLnRyZWU9ZX1maXJzdCgpe2xldCBlPXRoaXMudHJlZTtmb3IodGhpcy5ub2RlU3RhY2s9W2VdO2UuY2hpbGRyZW4ubGVuZ3RoPjAmJiFlLmlzQ29sbGFwc2VkOyl0aGlzLm5vZGVTdGFjay5wdXNoKGUuY2hpbGRyZW5bMF0pLGU9ZS5jaGlsZHJlblswXTtyZXR1cm4gdGhpcy5jdXJyZW50PWUsdGhpcy5jdXJyZW50fW5leHQoKXtsZXQgZT0hMSxyPTA7Zm9yKDt0aGlzLm5vZGVTdGFjay5sZW5ndGg+MSYmKHIrKywhKHI+MTAwKSk7KXtsZXQgbD10aGlzLm5vZGVTdGFja1t0aGlzLm5vZGVTdGFjay5sZW5ndGgtMV0sYz10aGlzLm5vZGVTdGFja1t0aGlzLm5vZGVTdGFjay5sZW5ndGgtMl0sbj1jLmNoaWxkcmVuLmZpbmRJbmRleChpPT5pLmtleT09PWwua2V5KTtpZihuPT09LTEpYnJlYWs7aWYoZSlpZihsLmNoaWxkcmVuLmxlbmd0aD4wJiYhbC5pc0NvbGxhcHNlZCl7dGhpcy5ub2RlU3RhY2sucHVzaChsLmNoaWxkcmVuWzBdKTtjb250aW51ZX1lbHNlIGJyZWFrO2Vsc2V7aWYobjxjLmNoaWxkcmVuLmxlbmd0aC0xKXt0aGlzLm5vZGVTdGFjay5wb3AoKSx0aGlzLm5vZGVTdGFjay5wdXNoKGMuY2hpbGRyZW5bbisxXSksZT0hMDtjb250aW51ZX1pZihuPj1jLmNoaWxkcmVuLmxlbmd0aC0xKXt0aGlzLm5vZGVTdGFjay5wb3AoKTtjb250aW51ZX19fXJldHVybiBlP3RoaXMuY3VycmVudD10aGlzLm5vZGVTdGFja1t0aGlzLm5vZGVTdGFjay5sZW5ndGgtMV18fG51bGw6dGhpcy5jdXJyZW50PW51bGwsdGhpcy5jdXJyZW50fXByZWRpY2F0ZXMoKXtyZXR1cm4gdGhpcy5ub2RlU3RhY2suZmlsdGVyKGU9PmUua2V5IT09cCkubWFwKGU9Pih7a2V5OmUuZmllbGRLZXksdmFsdWU6ZS52YWx1ZX0pKX19ZnVuY3Rpb24gTyh0LGUscil7Y29uc3QgbD1bXSxjPW5ldyBOKHQpLG49bmV3IE4oZSk7Zm9yKGMuZmlyc3QoKTtjLmN1cnJlbnQhPT1udWxsOyl7Y29uc3QgaT1bXTtmb3Iobi5maXJzdCgpO24uY3VycmVudCE9PW51bGw7KXtjb25zdCB1PWMucHJlZGljYXRlcygpLmNvbmNhdChuLnByZWRpY2F0ZXMoKSkuZmlsdGVyKGY9PmYudmFsdWUhPT0idG90YWwiKSxoPXIuZmlsdGVyKGY9PnUuZXZlcnkoZD0+ZltkLmtleV09PT1kLnZhbHVlKSk7aC5sZW5ndGg+MD9pLnB1c2goaC5yZWR1Y2UoKGYsZCk9Pk9iamVjdC5rZXlzKGYpLmxlbmd0aDxPYmplY3Qua2V5cyhkKS5sZW5ndGg/ZjpkKSk6aS5wdXNoKHZvaWQgMCksbi5uZXh0KCl9bC5wdXNoKGkpLGMubmV4dCgpfXJldHVybiBsfWNvbnN0IG09dD0+dC5jaGlsZHJlbi5sZW5ndGg+MD9bdCwuLi5tKHQuY2hpbGRyZW5bMF0pXTpbdF07ZnVuY3Rpb24gJCh0LGUscixsLGMsbixpKXtsZXQgdSxoO2lmKChpPT1udWxsP3ZvaWQgMDppLm1vZGUpPT09InJvdyIpaWYoaD1nKGUubWFwKGQ9PmQuZmlkKSxyLGMsbiksZS5sZW5ndGg+MCl7Y29uc3QgZD1lLm1hcChzPT5zLmZpZCksXz1tKGguY2hpbGRyZW5bMF0pLm1hcChzPT5zLnZhbHVlKSxrPVtdLHY9W107ci5mb3JFYWNoKHM9PmQuZXZlcnkoKGIscSk9PnNbYl09PT1fW3FdKT9rLnB1c2gocyk6di5wdXNoKHMpKSx1PWcodC5tYXAocz0+cy5maWQpLGssYyxuLGksdil9ZWxzZSB1PWcodC5tYXAoZD0+ZC5maWQpLHIsYyxuLGkpO2Vsc2UgaWYodT1nKHQubWFwKGQ9PmQuZmlkKSxyLGMsbiksaSYmdC5sZW5ndGg+MCl7Y29uc3QgZD10Lm1hcChzPT5zLmZpZCksXz1tKHUuY2hpbGRyZW5bMF0pLm1hcChzPT5zLnZhbHVlKSxrPVtdLHY9W107ci5mb3JFYWNoKHM9PmQuZXZlcnkoKGIscSk9PnNbYl09PT1fW3FdKT9rLnB1c2gocyk6di5wdXNoKHMpKSxoPWcoZS5tYXAocz0+cy5maWQpLGssYyxuLGksdil9ZWxzZSBoPWcoZS5tYXAoZD0+ZC5maWQpLHIsYyxuLGkpO2NvbnN0IGY9Tyh1LGgsWy4uLnIsLi4ubF0pO3JldHVybntsdDp1LHR0OmgsbWV0cmljOmZ9fWNvbnN0IHc9dD0+e2NvbnN0e2RpbXNJblJvdzplLGRpbXNJbkNvbHVtbjpyLGFsbERhdGE6bCxhZ2dEYXRhOmMsY29sbGFwc2VkS2V5TGlzdDpuLHNob3dUYWJsZVN1bW1hcnk6aSxzb3J0OnV9PXQuZGF0YTt0cnl7Y29uc3QgaD0kKGUscixsLGMsbixpLHUpO3NlbGYucG9zdE1lc3NhZ2UoaCl9Y2F0Y2goaCl7c2VsZi5wb3N0TWVzc2FnZSh7ZXJyb3I6aC5tZXNzYWdlfSl9fTtzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHcsITEpfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVpbGRNZXRyaWNUYWJsZS53b3JrZXItMmNmMGM1M2IuanMubWFwCg==",ej=typeof window<"u"&&window.Blob&&new Blob([atob(qD)],{type:"text/javascript;charset=utf-8"});function Q2e(){const e=ej&&(window.URL||window.webkitURL).createObjectURL(ej);try{return e?new Worker(e):new Worker("data:application/javascript;base64,"+qD)}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const tj="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIFAoaSl7cmV0dXJuIFA9dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09InN5bWJvbCI/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LFAoaSl9ZnVuY3Rpb24gUihpLHQpe2lmKCEoaSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIEJlKGksdCl7aWYoUChpKSE9PSJvYmplY3QifHxpPT09bnVsbClyZXR1cm4gaTt2YXIgbj1pW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKGksdHx8ImRlZmF1bHQiKTtpZihQKHIpIT09Im9iamVjdCIpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4odD09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKGkpfWZ1bmN0aW9uIGdlKGkpe3ZhciB0PUJlKGksInN0cmluZyIpO3JldHVybiBQKHQpPT09InN5bWJvbCI/dDpTdHJpbmcodCl9ZnVuY3Rpb24gcGUoaSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLGdlKHIua2V5KSxyKX19ZnVuY3Rpb24gayhpLHQsbil7cmV0dXJuIHQmJnBlKGkucHJvdG90eXBlLHQpLG4mJnBlKGksbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksaX1mdW5jdGlvbiBGKGkpe2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gaX1mdW5jdGlvbiBpZShpLHQpe3JldHVybiBpZT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLGUpe3JldHVybiByLl9fcHJvdG9fXz1lLHJ9LGllKGksdCl9ZnVuY3Rpb24gUShpLHQpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24iJiZ0IT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2kucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTppLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0JiZpZShpLHQpfWZ1bmN0aW9uIEIoaSx0KXtpZih0JiYoUCh0KT09PSJvYmplY3QifHx0eXBlb2YgdD09ImZ1bmN0aW9uIikpcmV0dXJuIHQ7aWYodCE9PXZvaWQgMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpO3JldHVybiBGKGkpfWZ1bmN0aW9uIGooaSl7cmV0dXJuIGo9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24obil7cmV0dXJuIG4uX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2Yobil9LGooaSl9ZnVuY3Rpb24gXyhpLHQsbil7cmV0dXJuIHQ9Z2UodCksdCBpbiBpP09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTppW3RdPW4saX1mdW5jdGlvbiBNZShpKXtpZihBcnJheS5pc0FycmF5KGkpKXJldHVybiBpfWZ1bmN0aW9uIEhlKGkpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZpW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGlbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShpKX1mdW5jdGlvbiBkZShpLHQpeyh0PT1udWxsfHx0PmkubGVuZ3RoKSYmKHQ9aS5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KHQpO248dDtuKyspcltuXT1pW25dO3JldHVybiByfWZ1bmN0aW9uIEplKGksdCl7aWYoaSl7aWYodHlwZW9mIGk9PSJzdHJpbmciKXJldHVybiBkZShpLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpKS5zbGljZSg4LC0xKTtpZihuPT09Ik9iamVjdCImJmkuY29uc3RydWN0b3ImJihuPWkuY29uc3RydWN0b3IubmFtZSksbj09PSJNYXAifHxuPT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20oaSk7aWYobj09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gZGUoaSx0KX19ZnVuY3Rpb24gemUoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gV2UoaSl7cmV0dXJuIE1lKGkpfHxIZShpKXx8SmUoaSl8fHplKCl9ZnVuY3Rpb24gaGUoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiB2ZShpKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF0hPW51bGw/YXJndW1lbnRzW3RdOnt9O3QlMj9oZShPYmplY3QobiksITApLmZvckVhY2goZnVuY3Rpb24ocil7XyhpLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpoZShPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGl9dmFyIFllPXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgibG9nIix0KX0sd2FybjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgid2FybiIsdCl9LGVycm9yOmZ1bmN0aW9uKHQpe3RoaXMub3V0cHV0KCJlcnJvciIsdCl9LG91dHB1dDpmdW5jdGlvbih0LG4pe2NvbnNvbGUmJmNvbnNvbGVbdF0mJmNvbnNvbGVbdF0uYXBwbHkoY29uc29sZSxuKX19LEdlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSh0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e307Uih0aGlzLGkpLHRoaXMuaW5pdCh0LG4pfXJldHVybiBrKGksW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1yLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj1ufHxZZSx0aGlzLm9wdGlvbnM9cix0aGlzLmRlYnVnPXIuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24obil7dGhpcy5kZWJ1Zz1ufX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGU9MDtlPG47ZSsrKXJbZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQociwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGU9MDtlPG47ZSsrKXJbZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQociwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobiksZT0wO2U8bjtlKyspcltlXT1hcmd1bWVudHNbZV07cmV0dXJuIHRoaXMuZm9yd2FyZChyLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLGU9MDtlPG47ZSsrKXJbZV09YXJndW1lbnRzW2VdO3JldHVybiB0aGlzLmZvcndhcmQociwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbihuLHIsZSxhKXtyZXR1cm4gYSYmIXRoaXMuZGVidWc/bnVsbDoodHlwZW9mIG5bMF09PSJzdHJpbmciJiYoblswXT0iIi5jb25jYXQoZSkuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KG5bMF0pKSx0aGlzLmxvZ2dlcltyXShuKSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKG4pe3JldHVybiBuZXcgaSh0aGlzLmxvZ2dlcix2ZSh2ZSh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdChuLCI6Iil9KSx0aGlzLm9wdGlvbnMpKX19LHtrZXk6ImNsb25lIix2YWx1ZTpmdW5jdGlvbihuKXtyZXR1cm4gbj1ufHx0aGlzLm9wdGlvbnMsbi5wcmVmaXg9bi5wcmVmaXh8fHRoaXMucHJlZml4LG5ldyBpKHRoaXMubG9nZ2VyLG4pfX1dKSxpfSgpLE49bmV3IEdlLEk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7Uih0aGlzLGkpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBrKGksW3trZXk6Im9uIix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBlPXRoaXM7cmV0dXJuIG4uc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Uub2JzZXJ2ZXJzW2FdPWUub2JzZXJ2ZXJzW2FdfHxbXSxlLm9ic2VydmVyc1thXS5wdXNoKHIpfSksdGhpc319LHtrZXk6Im9mZiIsdmFsdWU6ZnVuY3Rpb24obixyKXtpZih0aGlzLm9ic2VydmVyc1tuXSl7aWYoIXIpe2RlbGV0ZSB0aGlzLm9ic2VydmVyc1tuXTtyZXR1cm59dGhpcy5vYnNlcnZlcnNbbl09dGhpcy5vYnNlcnZlcnNbbl0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09cn0pfX19LHtrZXk6ImVtaXQiLHZhbHVlOmZ1bmN0aW9uKG4pe2Zvcih2YXIgcj1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHI+MT9yLTE6MCksYT0xO2E8cjthKyspZVthLTFdPWFyZ3VtZW50c1thXTtpZih0aGlzLm9ic2VydmVyc1tuXSl7dmFyIG89W10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzW25dKTtvLmZvckVhY2goZnVuY3Rpb24odSl7dS5hcHBseSh2b2lkIDAsZSl9KX1pZih0aGlzLm9ic2VydmVyc1siKiJdKXt2YXIgcz1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbIioiXSk7cy5mb3JFYWNoKGZ1bmN0aW9uKHUpe3UuYXBwbHkodSxbbl0uY29uY2F0KGUpKX0pfX19XSksaX0oKTtmdW5jdGlvbiBNKCl7dmFyIGksdCxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHIsZSl7aT1yLHQ9ZX0pO3JldHVybiBuLnJlc29sdmU9aSxuLnJlamVjdD10LG59ZnVuY3Rpb24gbWUoaSl7cmV0dXJuIGk9PW51bGw/IiI6IiIraX1mdW5jdGlvbiBRZShpLHQsbil7aS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3Rbcl0mJihuW3JdPXRbcl0pfSl9ZnVuY3Rpb24gb2UoaSx0LG4pe2Z1bmN0aW9uIHIocyl7cmV0dXJuIHMmJnMuaW5kZXhPZigiIyMjIik+LTE/cy5yZXBsYWNlKC8jIyMvZywiLiIpOnN9ZnVuY3Rpb24gZSgpe3JldHVybiFpfHx0eXBlb2YgaT09InN0cmluZyJ9Zm9yKHZhciBhPXR5cGVvZiB0IT0ic3RyaW5nIj9bXS5jb25jYXQodCk6dC5zcGxpdCgiLiIpO2EubGVuZ3RoPjE7KXtpZihlKCkpcmV0dXJue307dmFyIG89cihhLnNoaWZ0KCkpOyFpW29dJiZuJiYoaVtvXT1uZXcgbiksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksbyk/aT1pW29dOmk9e319cmV0dXJuIGUoKT97fTp7b2JqOmksazpyKGEuc2hpZnQoKSl9fWZ1bmN0aW9uIHllKGksdCxuKXt2YXIgcj1vZShpLHQsT2JqZWN0KSxlPXIub2JqLGE9ci5rO2VbYV09bn1mdW5jdGlvbiBaZShpLHQsbixyKXt2YXIgZT1vZShpLHQsT2JqZWN0KSxhPWUub2JqLG89ZS5rO2Fbb109YVtvXXx8W10sciYmKGFbb109YVtvXS5jb25jYXQobikpLHJ8fGFbb10ucHVzaChuKX1mdW5jdGlvbiBaKGksdCl7dmFyIG49b2UoaSx0KSxyPW4ub2JqLGU9bi5rO2lmKHIpcmV0dXJuIHJbZV19ZnVuY3Rpb24gYmUoaSx0LG4pe3ZhciByPVooaSxuKTtyZXR1cm4gciE9PXZvaWQgMD9yOloodCxuKX1mdW5jdGlvbiBPZShpLHQsbil7Zm9yKHZhciByIGluIHQpciE9PSJfX3Byb3RvX18iJiZyIT09ImNvbnN0cnVjdG9yIiYmKHIgaW4gaT90eXBlb2YgaVtyXT09InN0cmluZyJ8fGlbcl1pbnN0YW5jZW9mIFN0cmluZ3x8dHlwZW9mIHRbcl09PSJzdHJpbmcifHx0W3JdaW5zdGFuY2VvZiBTdHJpbmc/biYmKGlbcl09dFtyXSk6T2UoaVtyXSx0W3JdLG4pOmlbcl09dFtyXSk7cmV0dXJuIGl9ZnVuY3Rpb24gQShpKXtyZXR1cm4gaS5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csIlxcJCYiKX12YXIgcWU9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiBYZShpKXtyZXR1cm4gdHlwZW9mIGk9PSJzdHJpbmciP2kucmVwbGFjZSgvWyY8PiInXC9dL2csZnVuY3Rpb24odCl7cmV0dXJuIHFlW3RdfSk6aX12YXIgcT10eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93Lm5hdmlnYXRvciYmdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50RGF0YT4idSImJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+LTEsZXQ9WyIgIiwiLCIsIj8iLCIhIiwiOyJdO2Z1bmN0aW9uIHR0KGksdCxuKXt0PXR8fCIiLG49bnx8IiI7dmFyIHI9ZXQuZmlsdGVyKGZ1bmN0aW9uKHMpe3JldHVybiB0LmluZGV4T2Yocyk8MCYmbi5pbmRleE9mKHMpPDB9KTtpZihyLmxlbmd0aD09PTApcmV0dXJuITA7dmFyIGU9bmV3IFJlZ0V4cCgiKCIuY29uY2F0KHIubWFwKGZ1bmN0aW9uKHMpe3JldHVybiBzPT09Ij8iPyJcXD8iOnN9KS5qb2luKCJ8IiksIikiKSksYT0hZS50ZXN0KGkpO2lmKCFhKXt2YXIgbz1pLmluZGV4T2Yobik7bz4wJiYhZS50ZXN0KGkuc3Vic3RyaW5nKDAsbykpJiYoYT0hMCl9cmV0dXJuIGF9ZnVuY3Rpb24gU2UoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBYKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP1NlKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtfKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlNlKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiBydChpKXt2YXIgdD1udCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWooaSksZTtpZih0KXt2YXIgYT1qKHRoaXMpLmNvbnN0cnVjdG9yO2U9UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsYSl9ZWxzZSBlPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBCKHRoaXMsZSl9fWZ1bmN0aW9uIG50KCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIHdlKGksdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiIuIjtpZihpKXtpZihpW3RdKXJldHVybiBpW3RdO2Zvcih2YXIgcj10LnNwbGl0KG4pLGU9aSxhPTA7YTxyLmxlbmd0aDsrK2Epe2lmKCFlfHx0eXBlb2YgZVtyW2FdXT09InN0cmluZyImJmErMTxyLmxlbmd0aClyZXR1cm47aWYoZVtyW2FdXT09PXZvaWQgMCl7Zm9yKHZhciBvPTIscz1yLnNsaWNlKGEsYStvKS5qb2luKG4pLHU9ZVtzXTt1PT09dm9pZCAwJiZyLmxlbmd0aD5hK287KW8rKyxzPXIuc2xpY2UoYSxhK28pLmpvaW4obiksdT1lW3NdO2lmKHU9PT12b2lkIDApcmV0dXJuO2lmKHU9PT1udWxsKXJldHVybiBudWxsO2lmKHQuZW5kc1dpdGgocykpe2lmKHR5cGVvZiB1PT0ic3RyaW5nIilyZXR1cm4gdTtpZihzJiZ0eXBlb2YgdVtzXT09InN0cmluZyIpcmV0dXJuIHVbc119dmFyIGw9ci5zbGljZShhK28pLmpvaW4obik7cmV0dXJuIGw/d2UodSxsLG4pOnZvaWQgMH1lPWVbclthXV19cmV0dXJuIGV9fXZhciBhdD1mdW5jdGlvbihpKXtRKG4saSk7dmFyIHQ9cnQobik7ZnVuY3Rpb24gbihyKXt2YXIgZSxhPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7bnM6WyJ0cmFuc2xhdGlvbiJdLGRlZmF1bHROUzoidHJhbnNsYXRpb24ifTtyZXR1cm4gUih0aGlzLG4pLGU9dC5jYWxsKHRoaXMpLHEmJkkuY2FsbChGKGUpKSxlLmRhdGE9cnx8e30sZS5vcHRpb25zPWEsZS5vcHRpb25zLmtleVNlcGFyYXRvcj09PXZvaWQgMCYmKGUub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxlLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZT09PXZvaWQgMCYmKGUub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlPSEwKSxlfXJldHVybiBrKG4sW3trZXk6ImFkZE5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucy5ucy5pbmRleE9mKGUpPDAmJnRoaXMub3B0aW9ucy5ucy5wdXNoKGUpfX0se2tleToicmVtb3ZlTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcy5vcHRpb25zLm5zLmluZGV4T2YoZSk7YT4tMSYmdGhpcy5vcHRpb25zLm5zLnNwbGljZShhLDEpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106e30sdT1zLmtleVNlcGFyYXRvciE9PXZvaWQgMD9zLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGw9cy5pZ25vcmVKU09OU3RydWN0dXJlIT09dm9pZCAwP3MuaWdub3JlSlNPTlN0cnVjdHVyZTp0aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSxjPVtlLGFdO28mJnR5cGVvZiBvIT0ic3RyaW5nIiYmKGM9Yy5jb25jYXQobykpLG8mJnR5cGVvZiBvPT0ic3RyaW5nIiYmKGM9Yy5jb25jYXQodT9vLnNwbGl0KHUpOm8pKSxlLmluZGV4T2YoIi4iKT4tMSYmKGM9ZS5zcGxpdCgiLiIpKTt2YXIgZj1aKHRoaXMuZGF0YSxjKTtyZXR1cm4gZnx8IWx8fHR5cGVvZiBvIT0ic3RyaW5nIj9mOndlKHRoaXMuZGF0YSYmdGhpcy5kYXRhW2VdJiZ0aGlzLmRhdGFbZV1bYV0sbyx1KX19LHtrZXk6ImFkZFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyxzKXt2YXIgdT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06e3NpbGVudDohMX0sbD10aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO2w9PT12b2lkIDAmJihsPSIuIik7dmFyIGM9W2UsYV07byYmKGM9Yy5jb25jYXQobD9vLnNwbGl0KGwpOm8pKSxlLmluZGV4T2YoIi4iKT4tMSYmKGM9ZS5zcGxpdCgiLiIpLHM9YSxhPWNbMV0pLHRoaXMuYWRkTmFtZXNwYWNlcyhhKSx5ZSh0aGlzLmRhdGEsYyxzKSx1LnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsZSxhLG8scyl9fSx7a2V5OiJhZGRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106e3NpbGVudDohMX07Zm9yKHZhciB1IGluIG8pKHR5cGVvZiBvW3VdPT0ic3RyaW5nInx8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShvW3VdKT09PSJbb2JqZWN0IEFycmF5XSIpJiZ0aGlzLmFkZFJlc291cmNlKGUsYSx1LG9bdV0se3NpbGVudDohMH0pO3Muc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIixlLGEsbyl9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8scyx1KXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06e3NpbGVudDohMX0sYz1bZSxhXTtlLmluZGV4T2YoIi4iKT4tMSYmKGM9ZS5zcGxpdCgiLiIpLHM9byxvPWEsYT1jWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoYSk7dmFyIGY9Wih0aGlzLmRhdGEsYyl8fHt9O3M/T2UoZixvLHUpOmY9WChYKHt9LGYpLG8pLHllKHRoaXMuZGF0YSxjLGYpLGwuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIixlLGEsbyl9fSx7a2V5OiJyZW1vdmVSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXt0aGlzLmhhc1Jlc291cmNlQnVuZGxlKGUsYSkmJmRlbGV0ZSB0aGlzLmRhdGFbZV1bYV0sdGhpcy5yZW1vdmVOYW1lc3BhY2VzKGEpLHRoaXMuZW1pdCgicmVtb3ZlZCIsZSxhKX19LHtrZXk6Imhhc1Jlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbihlLGEpe3JldHVybiB0aGlzLmdldFJlc291cmNlKGUsYSkhPT12b2lkIDB9fSx7a2V5OiJnZXRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24oZSxhKXtyZXR1cm4gYXx8KGE9dGhpcy5vcHRpb25zLmRlZmF1bHROUyksdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk9PT0idjEiP1goWCh7fSx7fSksdGhpcy5nZXRSZXNvdXJjZShlLGEpKTp0aGlzLmdldFJlc291cmNlKGUsYSl9fSx7a2V5OiJnZXREYXRhQnlMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZGF0YVtlXX19LHtrZXk6Imhhc0xhbmd1YWdlU29tZVRyYW5zbGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcy5nZXREYXRhQnlMYW5ndWFnZShlKSxvPWEmJk9iamVjdC5rZXlzKGEpfHxbXTtyZXR1cm4hIW8uZmluZChmdW5jdGlvbihzKXtyZXR1cm4gYVtzXSYmT2JqZWN0LmtleXMoYVtzXSkubGVuZ3RoPjB9KX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX1dKSxufShJKSx4ZT17cHJvY2Vzc29yczp7fSxhZGRQb3N0UHJvY2Vzc29yOmZ1bmN0aW9uKHQpe3RoaXMucHJvY2Vzc29yc1t0Lm5hbWVdPXR9LGhhbmRsZTpmdW5jdGlvbih0LG4scixlLGEpe3ZhciBvPXRoaXM7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihzKXtvLnByb2Nlc3NvcnNbc10mJihuPW8ucHJvY2Vzc29yc1tzXS5wcm9jZXNzKG4scixlLGEpKX0pLG59fTtmdW5jdGlvbiBQZShpLHQpe3ZhciBuPU9iamVjdC5rZXlzKGkpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIFMoaSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdIT1udWxsP2FyZ3VtZW50c1t0XTp7fTt0JTI/UGUoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe18oaSxyLG5bcl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6UGUoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLHIsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHIpKX0pfXJldHVybiBpfWZ1bmN0aW9uIGl0KGkpe3ZhciB0PW90KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9aihpKSxlO2lmKHQpe3ZhciBhPWoodGhpcykuY29uc3RydWN0b3I7ZT1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxhKX1lbHNlIGU9ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIEIodGhpcyxlKX19ZnVuY3Rpb24gb3QoKXtpZih0eXBlb2YgUmVmbGVjdD4idSJ8fCFSZWZsZWN0LmNvbnN0cnVjdHx8UmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZih0eXBlb2YgUHJveHk9PSJmdW5jdGlvbiIpcmV0dXJuITA7dHJ5e3JldHVybiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbixbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaHtyZXR1cm4hMX19dmFyIExlPXt9LFJlPWZ1bmN0aW9uKGkpe1EobixpKTt2YXIgdD1pdChuKTtmdW5jdGlvbiBuKHIpe3ZhciBlLGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O3JldHVybiBSKHRoaXMsbiksZT10LmNhbGwodGhpcykscSYmSS5jYWxsKEYoZSkpLFFlKFsicmVzb3VyY2VTdG9yZSIsImxhbmd1YWdlVXRpbHMiLCJwbHVyYWxSZXNvbHZlciIsImludGVycG9sYXRvciIsImJhY2tlbmRDb25uZWN0b3IiLCJpMThuRm9ybWF0IiwidXRpbHMiXSxyLEYoZSkpLGUub3B0aW9ucz1hLGUub3B0aW9ucy5rZXlTZXBhcmF0b3I9PT12b2lkIDAmJihlLm9wdGlvbnMua2V5U2VwYXJhdG9yPSIuIiksZS5sb2dnZXI9Ti5jcmVhdGUoInRyYW5zbGF0b3IiKSxlfXJldHVybiBrKG4sW3trZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbihlKXtlJiYodGhpcy5sYW5ndWFnZT1lKX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fTtpZihlPT1udWxsKXJldHVybiExO3ZhciBvPXRoaXMucmVzb2x2ZShlLGEpO3JldHVybiBvJiZvLnJlcyE9PXZvaWQgMH19LHtrZXk6ImV4dHJhY3RGcm9tS2V5Iix2YWx1ZTpmdW5jdGlvbihlLGEpe3ZhciBvPWEubnNTZXBhcmF0b3IhPT12b2lkIDA/YS5uc1NlcGFyYXRvcjp0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7bz09PXZvaWQgMCYmKG89IjoiKTt2YXIgcz1hLmtleVNlcGFyYXRvciE9PXZvaWQgMD9hLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLHU9YS5uc3x8dGhpcy5vcHRpb25zLmRlZmF1bHROU3x8W10sbD1vJiZlLmluZGV4T2Yobyk+LTEsYz0hdGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yJiYhYS5rZXlTZXBhcmF0b3ImJiF0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvciYmIWEubnNTZXBhcmF0b3ImJiF0dChlLG8scyk7aWYobCYmIWMpe3ZhciBmPWUubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7aWYoZiYmZi5sZW5ndGg+MClyZXR1cm57a2V5OmUsbmFtZXNwYWNlczp1fTt2YXIgZz1lLnNwbGl0KG8pOyhvIT09c3x8bz09PXMmJnRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGdbMF0pPi0xKSYmKHU9Zy5zaGlmdCgpKSxlPWcuam9pbihzKX1yZXR1cm4gdHlwZW9mIHU9PSJzdHJpbmciJiYodT1bdV0pLHtrZXk6ZSxuYW1lc3BhY2VzOnV9fX0se2tleToidHJhbnNsYXRlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHM9dGhpcztpZihQKGEpIT09Im9iamVjdCImJnRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlciYmKGE9dGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cykpLGF8fChhPXt9KSxlPT1udWxsKXJldHVybiIiO0FycmF5LmlzQXJyYXkoZSl8fChlPVtTdHJpbmcoZSldKTt2YXIgdT1hLnJldHVybkRldGFpbHMhPT12b2lkIDA/YS5yZXR1cm5EZXRhaWxzOnRoaXMub3B0aW9ucy5yZXR1cm5EZXRhaWxzLGw9YS5rZXlTZXBhcmF0b3IhPT12b2lkIDA/YS5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixjPXRoaXMuZXh0cmFjdEZyb21LZXkoZVtlLmxlbmd0aC0xXSxhKSxmPWMua2V5LGc9Yy5uYW1lc3BhY2VzLHA9Z1tnLmxlbmd0aC0xXSxtPWEubG5nfHx0aGlzLmxhbmd1YWdlLHk9YS5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZXx8dGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlO2lmKG0mJm0udG9Mb3dlckNhc2UoKT09PSJjaW1vZGUiKXtpZih5KXt2YXIgdj1hLm5zU2VwYXJhdG9yfHx0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7cmV0dXJuIHU/KGQucmVzPSIiLmNvbmNhdChwKS5jb25jYXQodikuY29uY2F0KGYpLGQpOiIiLmNvbmNhdChwKS5jb25jYXQodikuY29uY2F0KGYpfXJldHVybiB1PyhkLnJlcz1mLGQpOmZ9dmFyIGQ9dGhpcy5yZXNvbHZlKGUsYSksaD1kJiZkLnJlcyxPPWQmJmQudXNlZEtleXx8ZixiPWQmJmQuZXhhY3RVc2VkS2V5fHxmLHg9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoKSxFPVsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXSxUPWEuam9pbkFycmF5cyE9PXZvaWQgMD9hLmpvaW5BcnJheXM6dGhpcy5vcHRpb25zLmpvaW5BcnJheXMsSD0hdGhpcy5pMThuRm9ybWF0fHx0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3QsSj10eXBlb2YgaCE9InN0cmluZyImJnR5cGVvZiBoIT0iYm9vbGVhbiImJnR5cGVvZiBoIT0ibnVtYmVyIjtpZihIJiZoJiZKJiZFLmluZGV4T2YoeCk8MCYmISh0eXBlb2YgVD09InN0cmluZyImJng9PT0iW29iamVjdCBBcnJheV0iKSl7aWYoIWEucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXt0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyfHx0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKTt2YXIgVT10aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIoTyxoLFMoUyh7fSxhKSx7fSx7bnM6Z30pKToia2V5ICciLmNvbmNhdChmLCIgKCIpLmNvbmNhdCh0aGlzLmxhbmd1YWdlLCIpJyByZXR1cm5lZCBhbiBvYmplY3QgaW5zdGVhZCBvZiBzdHJpbmcuIik7cmV0dXJuIHU/KGQucmVzPVUsZCk6VX1pZihsKXt2YXIgRGU9eD09PSJbb2JqZWN0IEFycmF5XSIscmU9RGU/W106e30sTnQ9RGU/YjpPO2Zvcih2YXIgViBpbiBoKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoLFYpKXt2YXIgVGU9IiIuY29uY2F0KE50KS5jb25jYXQobCkuY29uY2F0KFYpO3JlW1ZdPXRoaXMudHJhbnNsYXRlKFRlLFMoUyh7fSxhKSx7am9pbkFycmF5czohMSxuczpnfSkpLHJlW1ZdPT09VGUmJihyZVtWXT1oW1ZdKX1oPXJlfX1lbHNlIGlmKEgmJnR5cGVvZiBUPT0ic3RyaW5nIiYmeD09PSJbb2JqZWN0IEFycmF5XSIpaD1oLmpvaW4oVCksaCYmKGg9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihoLGUsYSxvKSk7ZWxzZXt2YXIgbmU9ITEsej0hMSxBZT1hLmNvdW50IT09dm9pZCAwJiZ0eXBlb2YgYS5jb3VudCE9InN0cmluZyIsdWU9bi5oYXNEZWZhdWx0VmFsdWUoYSksQ3Q9QWU/dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgobSxhLmNvdW50LGEpOiIiLFc9YVsiZGVmYXVsdFZhbHVlIi5jb25jYXQoQ3QpXXx8YS5kZWZhdWx0VmFsdWU7IXRoaXMuaXNWYWxpZExvb2t1cChoKSYmdWUmJihuZT0hMCxoPVcpLHRoaXMuaXNWYWxpZExvb2t1cChoKXx8KHo9ITAsaD1mKTt2YXIgRXQ9YS5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXl8fHRoaXMub3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXksRnQ9RXQmJno/dm9pZCAwOmgsWT11ZSYmVyE9PWgmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKHp8fG5lfHxZKXtpZih0aGlzLmxvZ2dlci5sb2coWT8idXBkYXRlS2V5IjoibWlzc2luZ0tleSIsbSxwLGYsWT9XOmgpLGwpe3ZhciBLZT10aGlzLnJlc29sdmUoZixTKFMoe30sYSkse30se2tleVNlcGFyYXRvcjohMX0pKTtLZSYmS2UucmVzJiZ0aGlzLmxvZ2dlci53YXJuKCJTZWVtcyB0aGUgbG9hZGVkIHRyYW5zbGF0aW9ucyB3ZXJlIGluIGZsYXQgSlNPTiBmb3JtYXQgaW5zdGVhZCBvZiBuZXN0ZWQuIEVpdGhlciBzZXQga2V5U2VwYXJhdG9yOiBmYWxzZSBvbiBpbml0IG9yIG1ha2Ugc3VyZSB5b3VyIHRyYW5zbGF0aW9ucyBhcmUgcHVibGlzaGVkIGluIG5lc3RlZCBmb3JtYXQuIil9dmFyIEc9W10sYWU9dGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGEubG5nfHx0aGlzLmxhbmd1YWdlKTtpZih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz09PSJmYWxsYmFjayImJmFlJiZhZVswXSlmb3IodmFyIGZlPTA7ZmU8YWUubGVuZ3RoO2ZlKyspRy5wdXNoKGFlW2ZlXSk7ZWxzZSB0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz09PSJhbGwiP0c9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShhLmxuZ3x8dGhpcy5sYW5ndWFnZSk6Ry5wdXNoKGEubG5nfHx0aGlzLmxhbmd1YWdlKTt2YXIgVWU9ZnVuY3Rpb24oJCxjZSxWZSl7dmFyICRlPXVlJiZWZSE9PWg/VmU6RnQ7cy5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyP3Mub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcigkLHAsY2UsJGUsWSxhKTpzLmJhY2tlbmRDb25uZWN0b3ImJnMuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyYmcy5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nKCQscCxjZSwkZSxZLGEpLHMuZW1pdCgibWlzc2luZ0tleSIsJCxwLGNlLGgpfTt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmcmJih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZBZT9HLmZvckVhY2goZnVuY3Rpb24obGUpe3MucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4ZXMobGUsYSkuZm9yRWFjaChmdW5jdGlvbigkKXtVZShbbGVdLGYrJCxhWyJkZWZhdWx0VmFsdWUiLmNvbmNhdCgkKV18fFcpfSl9KTpVZShHLGYsVykpfWg9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihoLGUsYSxkLG8pLHomJmg9PT1mJiZ0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5JiYoaD0iIi5jb25jYXQocCwiOiIpLmNvbmNhdChmKSksKHp8fG5lKSYmdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXImJih0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSE9PSJ2MSI/aD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcih0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5PyIiLmNvbmNhdChwLCI6IikuY29uY2F0KGYpOmYsbmU/aDp2b2lkIDApOmg9dGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIoaCkpfXJldHVybiB1PyhkLnJlcz1oLGQpOmh9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8scyx1KXt2YXIgbD10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKWU9dGhpcy5pMThuRm9ybWF0LnBhcnNlKGUsUyhTKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLG8pLHMudXNlZExuZyxzLnVzZWROUyxzLnVzZWRLZXkse3Jlc29sdmVkOnN9KTtlbHNlIGlmKCFvLnNraXBJbnRlcnBvbGF0aW9uKXtvLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLmluaXQoUyhTKHt9LG8pLHtpbnRlcnBvbGF0aW9uOlMoUyh7fSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiksby5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgYz10eXBlb2YgZT09InN0cmluZyImJihvJiZvLmludGVycG9sYXRpb24mJm8uaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMhPT12b2lkIDA/by5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlczp0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMpLGY7aWYoYyl7dmFyIGc9ZS5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtmPWcmJmcubGVuZ3RofXZhciBwPW8ucmVwbGFjZSYmdHlwZW9mIG8ucmVwbGFjZSE9InN0cmluZyI/by5yZXBsYWNlOm87aWYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyYmKHA9UyhTKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLHApKSxlPXRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKGUscCxvLmxuZ3x8dGhpcy5sYW5ndWFnZSxvKSxjKXt2YXIgbT1lLm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApLHk9bSYmbS5sZW5ndGg7Zjx5JiYoby5uZXN0PSExKX1vLm5lc3QhPT0hMSYmKGU9dGhpcy5pbnRlcnBvbGF0b3IubmVzdChlLGZ1bmN0aW9uKCl7Zm9yKHZhciBoPWFyZ3VtZW50cy5sZW5ndGgsTz1uZXcgQXJyYXkoaCksYj0wO2I8aDtiKyspT1tiXT1hcmd1bWVudHNbYl07cmV0dXJuIHUmJnVbMF09PT1PWzBdJiYhby5jb250ZXh0PyhsLmxvZ2dlci53YXJuKCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAiLmNvbmNhdChPWzBdLCIgaW4ga2V5OiAiKS5jb25jYXQoYVswXSkpLG51bGwpOmwudHJhbnNsYXRlLmFwcGx5KGwsTy5jb25jYXQoW2FdKSl9LG8pKSxvLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIHY9by5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLGQ9dHlwZW9mIHY9PSJzdHJpbmciP1t2XTp2O3JldHVybiBlIT1udWxsJiZkJiZkLmxlbmd0aCYmby5hcHBseVBvc3RQcm9jZXNzb3IhPT0hMSYmKGU9eGUuaGFuZGxlKGQsZSxhLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkP1Moe2kxOG5SZXNvbHZlZDpzfSxvKTpvLHRoaXMpKSxlfX0se2tleToicmVzb2x2ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcyxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxzLHUsbCxjLGY7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKSxlLmZvckVhY2goZnVuY3Rpb24oZyl7aWYoIWEuaXNWYWxpZExvb2t1cChzKSl7dmFyIHA9YS5leHRyYWN0RnJvbUtleShnLG8pLG09cC5rZXk7dT1tO3ZhciB5PXAubmFtZXNwYWNlczthLm9wdGlvbnMuZmFsbGJhY2tOUyYmKHk9eS5jb25jYXQoYS5vcHRpb25zLmZhbGxiYWNrTlMpKTt2YXIgdj1vLmNvdW50IT09dm9pZCAwJiZ0eXBlb2Ygby5jb3VudCE9InN0cmluZyIsZD12JiYhby5vcmRpbmFsJiZvLmNvdW50PT09MCYmYS5wbHVyYWxSZXNvbHZlci5zaG91bGRVc2VJbnRsQXBpKCksaD1vLmNvbnRleHQhPT12b2lkIDAmJih0eXBlb2Ygby5jb250ZXh0PT0ic3RyaW5nInx8dHlwZW9mIG8uY29udGV4dD09Im51bWJlciIpJiZvLmNvbnRleHQhPT0iIixPPW8ubG5ncz9vLmxuZ3M6YS5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvLmxuZ3x8YS5sYW5ndWFnZSxvLmZhbGxiYWNrTG5nKTt5LmZvckVhY2goZnVuY3Rpb24oYil7YS5pc1ZhbGlkTG9va3VwKHMpfHwoZj1iLCFMZVsiIi5jb25jYXQoT1swXSwiLSIpLmNvbmNhdChiKV0mJmEudXRpbHMmJmEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UoZikmJihMZVsiIi5jb25jYXQoT1swXSwiLSIpLmNvbmNhdChiKV09ITAsYS5sb2dnZXIud2Fybigna2V5ICInLmNvbmNhdCh1LCciIGZvciBsYW5ndWFnZXMgIicpLmNvbmNhdChPLmpvaW4oIiwgIiksYCIgd29uJ3QgZ2V0IHJlc29sdmVkIGFzIG5hbWVzcGFjZSAiYCkuY29uY2F0KGYsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpKSxPLmZvckVhY2goZnVuY3Rpb24oeCl7aWYoIWEuaXNWYWxpZExvb2t1cChzKSl7Yz14O3ZhciBFPVttXTtpZihhLmkxOG5Gb3JtYXQmJmEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKWEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKEUsbSx4LGIsbyk7ZWxzZXt2YXIgVDt2JiYoVD1hLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeCh4LG8uY291bnQsbykpO3ZhciBIPSIiLmNvbmNhdChhLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLCJ6ZXJvIik7aWYodiYmKEUucHVzaChtK1QpLGQmJkUucHVzaChtK0gpKSxoKXt2YXIgSj0iIi5jb25jYXQobSkuY29uY2F0KGEub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQoby5jb250ZXh0KTtFLnB1c2goSiksdiYmKEUucHVzaChKK1QpLGQmJkUucHVzaChKK0gpKX19Zm9yKHZhciBVO1U9RS5wb3AoKTspYS5pc1ZhbGlkTG9va3VwKHMpfHwobD1VLHM9YS5nZXRSZXNvdXJjZSh4LGIsVSxvKSl9fSkpfSl9fSkse3JlczpzLHVzZWRLZXk6dSxleGFjdFVzZWRLZXk6bCx1c2VkTG5nOmMsdXNlZE5TOmZ9fX0se2tleToiaXNWYWxpZExvb2t1cCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJiEoIXRoaXMub3B0aW9ucy5yZXR1cm5OdWxsJiZlPT09bnVsbCkmJiEoIXRoaXMub3B0aW9ucy5yZXR1cm5FbXB0eVN0cmluZyYmZT09PSIiKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOnt9O3JldHVybiB0aGlzLmkxOG5Gb3JtYXQmJnRoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZT90aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2UoZSxhLG8scyk6dGhpcy5yZXNvdXJjZVN0b3JlLmdldFJlc291cmNlKGUsYSxvLHMpfX1dLFt7a2V5OiJoYXNEZWZhdWx0VmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPSJkZWZhdWx0VmFsdWUiO2Zvcih2YXIgbyBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiZhPT09by5zdWJzdHJpbmcoMCxhLmxlbmd0aCkmJmVbb10hPT12b2lkIDApcmV0dXJuITA7cmV0dXJuITF9fV0pLG59KEkpO2Z1bmN0aW9uIHNlKGkpe3JldHVybiBpLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2kuc2xpY2UoMSl9dmFyIHN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSh0KXtSKHRoaXMsaSksdGhpcy5vcHRpb25zPXQsdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgibGFuZ3VhZ2VVdGlscyIpfXJldHVybiBrKGksW3trZXk6ImdldFNjcmlwdFBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7aWYoIW58fG4uaW5kZXhPZigiLSIpPDApcmV0dXJuIG51bGw7dmFyIHI9bi5zcGxpdCgiLSIpO3JldHVybiByLmxlbmd0aD09PTJ8fChyLnBvcCgpLHJbci5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKT09PSJ4Iik/bnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShyLmpvaW4oIi0iKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7aWYoIW58fG4uaW5kZXhPZigiLSIpPDApcmV0dXJuIG47dmFyIHI9bi5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShyWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7aWYodHlwZW9mIG49PSJzdHJpbmciJiZuLmluZGV4T2YoIi0iKT4tMSl7dmFyIHI9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sZT1uLnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/ZT1lLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS50b0xvd2VyQ2FzZSgpfSk6ZS5sZW5ndGg9PT0yPyhlWzBdPWVbMF0udG9Mb3dlckNhc2UoKSxlWzFdPWVbMV0udG9VcHBlckNhc2UoKSxyLmluZGV4T2YoZVsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKGVbMV09c2UoZVsxXS50b0xvd2VyQ2FzZSgpKSkpOmUubGVuZ3RoPT09MyYmKGVbMF09ZVswXS50b0xvd2VyQ2FzZSgpLGVbMV0ubGVuZ3RoPT09MiYmKGVbMV09ZVsxXS50b1VwcGVyQ2FzZSgpKSxlWzBdIT09InNnbiImJmVbMl0ubGVuZ3RoPT09MiYmKGVbMl09ZVsyXS50b1VwcGVyQ2FzZSgpKSxyLmluZGV4T2YoZVsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKGVbMV09c2UoZVsxXS50b0xvd2VyQ2FzZSgpKSksci5pbmRleE9mKGVbMl0udG9Mb3dlckNhc2UoKSk+LTEmJihlWzJdPXNlKGVbMl0udG9Mb3dlckNhc2UoKSkpKSxlLmpvaW4oIi0iKX1yZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZXx8dGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz9uLnRvTG93ZXJDYXNlKCk6bn19LHtrZXk6ImlzU3VwcG9ydGVkQ29kZSIsdmFsdWU6ZnVuY3Rpb24obil7cmV0dXJuKHRoaXMub3B0aW9ucy5sb2FkPT09Imxhbmd1YWdlT25seSJ8fHRoaXMub3B0aW9ucy5ub25FeHBsaWNpdFN1cHBvcnRlZExuZ3MpJiYobj10aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKG4pKSwhdGhpcy5zdXBwb3J0ZWRMbmdzfHwhdGhpcy5zdXBwb3J0ZWRMbmdzLmxlbmd0aHx8dGhpcy5zdXBwb3J0ZWRMbmdzLmluZGV4T2Yobik+LTF9fSx7a2V5OiJnZXRCZXN0TWF0Y2hGcm9tQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPXRoaXM7aWYoIW4pcmV0dXJuIG51bGw7dmFyIGU7cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihhKXtpZighZSl7dmFyIG89ci5mb3JtYXRMYW5ndWFnZUNvZGUoYSk7KCFyLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ci5pc1N1cHBvcnRlZENvZGUobykpJiYoZT1vKX19KSwhZSYmdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MmJm4uZm9yRWFjaChmdW5jdGlvbihhKXtpZighZSl7dmFyIG89ci5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShhKTtpZihyLmlzU3VwcG9ydGVkQ29kZShvKSlyZXR1cm4gZT1vO2U9ci5vcHRpb25zLnN1cHBvcnRlZExuZ3MuZmluZChmdW5jdGlvbihzKXtpZihzLmluZGV4T2Yobyk9PT0wKXJldHVybiBzfSl9fSksZXx8KGU9dGhpcy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZylbMF0pLGV9fSx7a2V5OiJnZXRGYWxsYmFja0NvZGVzIix2YWx1ZTpmdW5jdGlvbihuLHIpe2lmKCFuKXJldHVybltdO2lmKHR5cGVvZiBuPT0iZnVuY3Rpb24iJiYobj1uKHIpKSx0eXBlb2Ygbj09InN0cmluZyImJihuPVtuXSksT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKT09PSJbb2JqZWN0IEFycmF5XSIpcmV0dXJuIG47aWYoIXIpcmV0dXJuIG4uZGVmYXVsdHx8W107dmFyIGU9bltyXTtyZXR1cm4gZXx8KGU9blt0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShyKV0pLGV8fChlPW5bdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUocildKSxlfHwoZT1uW3RoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUocildKSxlfHwoZT1uLmRlZmF1bHQpLGV8fFtdfX0se2tleToidG9SZXNvbHZlSGllcmFyY2h5Iix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBlPXRoaXMsYT10aGlzLmdldEZhbGxiYWNrQ29kZXMocnx8dGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nfHxbXSxuKSxvPVtdLHM9ZnVuY3Rpb24obCl7bCYmKGUuaXNTdXBwb3J0ZWRDb2RlKGwpP28ucHVzaChsKTplLmxvZ2dlci53YXJuKCJyZWplY3RpbmcgbGFuZ3VhZ2UgY29kZSBub3QgZm91bmQgaW4gc3VwcG9ydGVkTG5nczogIi5jb25jYXQobCkpKX07cmV0dXJuIHR5cGVvZiBuPT0ic3RyaW5nIiYmbi5pbmRleE9mKCItIik+LTE/KHRoaXMub3B0aW9ucy5sb2FkIT09Imxhbmd1YWdlT25seSImJnModGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUobikpLHRoaXMub3B0aW9ucy5sb2FkIT09Imxhbmd1YWdlT25seSImJnRoaXMub3B0aW9ucy5sb2FkIT09ImN1cnJlbnRPbmx5IiYmcyh0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShuKSksdGhpcy5vcHRpb25zLmxvYWQhPT0iY3VycmVudE9ubHkiJiZzKHRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUobikpKTp0eXBlb2Ygbj09InN0cmluZyImJnModGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUobikpLGEuZm9yRWFjaChmdW5jdGlvbih1KXtvLmluZGV4T2YodSk8MCYmcyhlLmZvcm1hdExhbmd1YWdlQ29kZSh1KSl9KSxvfX1dKSxpfSgpLHV0PVt7bG5nczpbImFjaCIsImFrIiwiYW0iLCJhcm4iLCJiciIsImZpbCIsImd1biIsImxuIiwibWZlIiwibWciLCJtaSIsIm9jIiwicHQiLCJwdC1CUiIsInRnIiwidGwiLCJ0aSIsInRyIiwidXoiLCJ3YSJdLG5yOlsxLDJdLGZjOjF9LHtsbmdzOlsiYWYiLCJhbiIsImFzdCIsImF6IiwiYmciLCJibiIsImNhIiwiZGEiLCJkZSIsImRldiIsImVsIiwiZW4iLCJlbyIsImVzIiwiZXQiLCJldSIsImZpIiwiZm8iLCJmdXIiLCJmeSIsImdsIiwiZ3UiLCJoYSIsImhpIiwiaHUiLCJoeSIsImlhIiwiaXQiLCJrayIsImtuIiwia3UiLCJsYiIsIm1haSIsIm1sIiwibW4iLCJtciIsIm5haCIsIm5hcCIsIm5iIiwibmUiLCJubCIsIm5uIiwibm8iLCJuc28iLCJwYSIsInBhcCIsInBtcyIsInBzIiwicHQtUFQiLCJybSIsInNjbyIsInNlIiwic2kiLCJzbyIsInNvbiIsInNxIiwic3YiLCJzdyIsInRhIiwidGUiLCJ0ayIsInVyIiwieW8iXSxucjpbMSwyXSxmYzoyfSx7bG5nczpbImF5IiwiYm8iLCJjZ2ciLCJmYSIsImh0IiwiaWQiLCJqYSIsImpibyIsImthIiwia20iLCJrbyIsImt5IiwibG8iLCJtcyIsInNhaCIsInN1IiwidGgiLCJ0dCIsInVnIiwidmkiLCJ3byIsInpoIl0sbnI6WzFdLGZjOjN9LHtsbmdzOlsiYmUiLCJicyIsImNuciIsImR6IiwiaHIiLCJydSIsInNyIiwidWsiXSxucjpbMSwyLDVdLGZjOjR9LHtsbmdzOlsiYXIiXSxucjpbMCwxLDIsMywxMSwxMDBdLGZjOjV9LHtsbmdzOlsiY3MiLCJzayJdLG5yOlsxLDIsNV0sZmM6Nn0se2xuZ3M6WyJjc2IiLCJwbCJdLG5yOlsxLDIsNV0sZmM6N30se2xuZ3M6WyJjeSJdLG5yOlsxLDIsMyw4XSxmYzo4fSx7bG5nczpbImZyIl0sbnI6WzEsMl0sZmM6OX0se2xuZ3M6WyJnYSJdLG5yOlsxLDIsMyw3LDExXSxmYzoxMH0se2xuZ3M6WyJnZCJdLG5yOlsxLDIsMywyMF0sZmM6MTF9LHtsbmdzOlsiaXMiXSxucjpbMSwyXSxmYzoxMn0se2xuZ3M6WyJqdiJdLG5yOlswLDFdLGZjOjEzfSx7bG5nczpbImt3Il0sbnI6WzEsMiwzLDRdLGZjOjE0fSx7bG5nczpbImx0Il0sbnI6WzEsMiwxMF0sZmM6MTV9LHtsbmdzOlsibHYiXSxucjpbMSwyLDBdLGZjOjE2fSx7bG5nczpbIm1rIl0sbnI6WzEsMl0sZmM6MTd9LHtsbmdzOlsibW5rIl0sbnI6WzAsMSwyXSxmYzoxOH0se2xuZ3M6WyJtdCJdLG5yOlsxLDIsMTEsMjBdLGZjOjE5fSx7bG5nczpbIm9yIl0sbnI6WzIsMV0sZmM6Mn0se2xuZ3M6WyJybyJdLG5yOlsxLDIsMjBdLGZjOjIwfSx7bG5nczpbInNsIl0sbnI6WzUsMSwyLDNdLGZjOjIxfSx7bG5nczpbImhlIiwiaXciXSxucjpbMSwyLDIwLDIxXSxmYzoyMn1dLGZ0PXsxOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD4xKX0sMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQhPTEpfSwzOmZ1bmN0aW9uKHQpe3JldHVybiAwfSw0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0wPzA6dD09MT8xOnQ9PTI/Mjp0JTEwMD49MyYmdCUxMDA8PTEwPzM6dCUxMDA+PTExPzQ6NSl9LDY6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0xPzA6dD49MiYmdDw9ND8xOjIpfSw3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQlMTA+PTImJnQlMTA8PTQmJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSw4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQ9PTI/MTp0IT04JiZ0IT0xMT8yOjMpfSw5OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD49Mil9LDEwOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQ9PTI/MTp0PDc/Mjp0PDExPzM6NCl9LDExOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MXx8dD09MTE/MDp0PT0yfHx0PT0xMj8xOnQ+MiYmdDwyMD8yOjMpfSwxMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAhPTF8fHQlMTAwPT0xMSl9LDEzOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCE9PTApfSwxNDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ9PTE/MDp0PT0yPzE6dD09Mz8yOjMpfSwxNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQlMTA+PTImJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSwxNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQhPT0wPzE6Mil9LDE3OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MXx8dCUxMD09MSYmdCUxMDAhPTExPzA6MSl9LDE4OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MD8wOnQ9PTE/MToyKX0sMTk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0xPzA6dD09MHx8dCUxMDA+MSYmdCUxMDA8MTE/MTp0JTEwMD4xMCYmdCUxMDA8MjA/MjozKX0sMjA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PT0xPzA6dD09MHx8dCUxMDA+MCYmdCUxMDA8MjA/MToyKX0sMjE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwMD09MT8xOnQlMTAwPT0yPzI6dCUxMDA9PTN8fHQlMTAwPT00PzM6MCl9LDIyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodD09MT8wOnQ9PTI/MToodDwwfHx0PjEwKSYmdCUxMD09MD8yOjMpfX0sbHQ9WyJ2MSIsInYyIiwidjMiXSxrZT17emVybzowLG9uZToxLHR3bzoyLGZldzozLG1hbnk6NCxvdGhlcjo1fTtmdW5jdGlvbiBjdCgpe3ZhciBpPXt9O3JldHVybiB1dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QubG5ncy5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lbbl09e251bWJlcnM6dC5ucixwbHVyYWxzOmZ0W3QuZmNdfX0pfSksaX12YXIgZ3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fTtSKHRoaXMsaSksdGhpcy5sYW5ndWFnZVV0aWxzPXQsdGhpcy5vcHRpb25zPW4sdGhpcy5sb2dnZXI9Ti5jcmVhdGUoInBsdXJhbFJlc29sdmVyIiksKCF0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT058fHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj09PSJ2NCIpJiYodHlwZW9mIEludGw+InUifHwhSW50bC5QbHVyYWxSdWxlcykmJih0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT049InYzIix0aGlzLmxvZ2dlci5lcnJvcigiWW91ciBlbnZpcm9ubWVudCBzZWVtcyBub3QgdG8gYmUgSW50bCBBUEkgY29tcGF0aWJsZSwgdXNlIGFuIEludGwuUGx1cmFsUnVsZXMgcG9seWZpbGwuIFdpbGwgZmFsbGJhY2sgdG8gdGhlIGNvbXBhdGliaWxpdHlKU09OIHYzIGZvcm1hdCBoYW5kbGluZy4iKSksdGhpcy5ydWxlcz1jdCgpfXJldHVybiBrKGksW3trZXk6ImFkZFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKG4scil7dGhpcy5ydWxlc1tuXT1yfX0se2tleToiZ2V0UnVsZSIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O2lmKHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpKXRyeXtyZXR1cm4gbmV3IEludGwuUGx1cmFsUnVsZXMobix7dHlwZTpyLm9yZGluYWw/Im9yZGluYWwiOiJjYXJkaW5hbCJ9KX1jYXRjaHtyZXR1cm59cmV0dXJuIHRoaXMucnVsZXNbbl18fHRoaXMucnVsZXNbdGhpcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKG4pXX19LHtrZXk6Im5lZWRzUGx1cmFsIix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30sZT10aGlzLmdldFJ1bGUobixyKTtyZXR1cm4gdGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/ZSYmZS5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLmxlbmd0aD4xOmUmJmUubnVtYmVycy5sZW5ndGg+MX19LHtrZXk6ImdldFBsdXJhbEZvcm1zT2ZLZXkiLHZhbHVlOmZ1bmN0aW9uKG4scil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9O3JldHVybiB0aGlzLmdldFN1ZmZpeGVzKG4sZSkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiIiLmNvbmNhdChyKS5jb25jYXQoYSl9KX19LHtrZXk6ImdldFN1ZmZpeGVzIix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj10aGlzLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LGE9dGhpcy5nZXRSdWxlKG4sZSk7cmV0dXJuIGE/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/YS5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLnNvcnQoZnVuY3Rpb24obyxzKXtyZXR1cm4ga2Vbb10ta2Vbc119KS5tYXAoZnVuY3Rpb24obyl7cmV0dXJuIiIuY29uY2F0KHIub3B0aW9ucy5wcmVwZW5kKS5jb25jYXQobyl9KTphLm51bWJlcnMubWFwKGZ1bmN0aW9uKG8pe3JldHVybiByLmdldFN1ZmZpeChuLG8sZSl9KTpbXX19LHtrZXk6ImdldFN1ZmZpeCIsdmFsdWU6ZnVuY3Rpb24obixyKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sYT10aGlzLmdldFJ1bGUobixlKTtyZXR1cm4gYT90aGlzLnNob3VsZFVzZUludGxBcGkoKT8iIi5jb25jYXQodGhpcy5vcHRpb25zLnByZXBlbmQpLmNvbmNhdChhLnNlbGVjdChyKSk6dGhpcy5nZXRTdWZmaXhSZXRyb0NvbXBhdGlibGUoYSxyKToodGhpcy5sb2dnZXIud2Fybigibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAiLmNvbmNhdChuKSksIiIpfX0se2tleToiZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlIix2YWx1ZTpmdW5jdGlvbihuLHIpe3ZhciBlPXRoaXMsYT1uLm5vQWJzP24ucGx1cmFscyhyKTpuLnBsdXJhbHMoTWF0aC5hYnMocikpLG89bi5udW1iZXJzW2FdO3RoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmbi5udW1iZXJzLmxlbmd0aD09PTImJm4ubnVtYmVyc1swXT09PTEmJihvPT09Mj9vPSJwbHVyYWwiOm89PT0xJiYobz0iIikpO3ZhciBzPWZ1bmN0aW9uKCl7cmV0dXJuIGUub3B0aW9ucy5wcmVwZW5kJiZvLnRvU3RyaW5nKCk/ZS5vcHRpb25zLnByZXBlbmQrby50b1N0cmluZygpOm8udG9TdHJpbmcoKX07cmV0dXJuIHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj09PSJ2MSI/bz09PTE/IiI6dHlwZW9mIG89PSJudW1iZXIiPyJfcGx1cmFsXyIuY29uY2F0KG8udG9TdHJpbmcoKSk6cygpOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj09PSJ2MiJ8fHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmbi5udW1iZXJzLmxlbmd0aD09PTImJm4ubnVtYmVyc1swXT09PTE/cygpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZhLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX19LHtrZXk6InNob3VsZFVzZUludGxBcGkiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIWx0LmluY2x1ZGVzKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTil9fV0pLGl9KCk7ZnVuY3Rpb24gamUoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBMKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP2plKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtfKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOmplKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX12YXIgcHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9O1IodGhpcyxpKSx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgiaW50ZXJwb2xhdG9yIiksdGhpcy5vcHRpb25zPXQsdGhpcy5mb3JtYXQ9dC5pbnRlcnBvbGF0aW9uJiZ0LmludGVycG9sYXRpb24uZm9ybWF0fHxmdW5jdGlvbihuKXtyZXR1cm4gbn0sdGhpcy5pbml0KHQpfXJldHVybiBrKGksW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9O24uaW50ZXJwb2xhdGlvbnx8KG4uaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTt2YXIgcj1uLmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9ci5lc2NhcGUhPT12b2lkIDA/ci5lc2NhcGU6WGUsdGhpcy5lc2NhcGVWYWx1ZT1yLmVzY2FwZVZhbHVlIT09dm9pZCAwP3IuZXNjYXBlVmFsdWU6ITAsdGhpcy51c2VSYXdWYWx1ZVRvRXNjYXBlPXIudXNlUmF3VmFsdWVUb0VzY2FwZSE9PXZvaWQgMD9yLnVzZVJhd1ZhbHVlVG9Fc2NhcGU6ITEsdGhpcy5wcmVmaXg9ci5wcmVmaXg/QShyLnByZWZpeCk6ci5wcmVmaXhFc2NhcGVkfHwie3siLHRoaXMuc3VmZml4PXIuc3VmZml4P0Eoci5zdWZmaXgpOnIuc3VmZml4RXNjYXBlZHx8In19Iix0aGlzLmZvcm1hdFNlcGFyYXRvcj1yLmZvcm1hdFNlcGFyYXRvcj9yLmZvcm1hdFNlcGFyYXRvcjpyLmZvcm1hdFNlcGFyYXRvcnx8IiwiLHRoaXMudW5lc2NhcGVQcmVmaXg9ci51bmVzY2FwZVN1ZmZpeD8iIjpyLnVuZXNjYXBlUHJlZml4fHwiLSIsdGhpcy51bmVzY2FwZVN1ZmZpeD10aGlzLnVuZXNjYXBlUHJlZml4PyIiOnIudW5lc2NhcGVTdWZmaXh8fCIiLHRoaXMubmVzdGluZ1ByZWZpeD1yLm5lc3RpbmdQcmVmaXg/QShyLm5lc3RpbmdQcmVmaXgpOnIubmVzdGluZ1ByZWZpeEVzY2FwZWR8fEEoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1yLm5lc3RpbmdTdWZmaXg/QShyLm5lc3RpbmdTdWZmaXgpOnIubmVzdGluZ1N1ZmZpeEVzY2FwZWR8fEEoIikiKSx0aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yPXIubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I/ci5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjpyLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yfHwiLCIsdGhpcy5tYXhSZXBsYWNlcz1yLm1heFJlcGxhY2VzP3IubWF4UmVwbGFjZXM6MWUzLHRoaXMuYWx3YXlzRm9ybWF0PXIuYWx3YXlzRm9ybWF0IT09dm9pZCAwP3IuYWx3YXlzRm9ybWF0OiExLHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgbj0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKG4sImciKTt2YXIgcj0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChyLCJnIik7dmFyIGU9IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChlLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24obixyLGUsYSl7dmFyIG89dGhpcyxzLHUsbCxjPXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGYodil7cmV0dXJuIHYucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBnPWZ1bmN0aW9uKGQpe2lmKGQuaW5kZXhPZihvLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIGg9YmUocixjLGQpO3JldHVybiBvLmFsd2F5c0Zvcm1hdD9vLmZvcm1hdChoLHZvaWQgMCxlLEwoTChMKHt9LGEpLHIpLHt9LHtpbnRlcnBvbGF0aW9ua2V5OmR9KSk6aH12YXIgTz1kLnNwbGl0KG8uZm9ybWF0U2VwYXJhdG9yKSxiPU8uc2hpZnQoKS50cmltKCkseD1PLmpvaW4oby5mb3JtYXRTZXBhcmF0b3IpLnRyaW0oKTtyZXR1cm4gby5mb3JtYXQoYmUocixjLGIpLHgsZSxMKEwoTCh7fSxhKSxyKSx7fSx7aW50ZXJwb2xhdGlvbmtleTpifSkpfTt0aGlzLnJlc2V0UmVnRXhwKCk7dmFyIHA9YSYmYS5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIsbT1hJiZhLmludGVycG9sYXRpb24mJmEuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMhPT12b2lkIDA/YS5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlczp0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMseT1be3JlZ2V4OnRoaXMucmVnZXhwVW5lc2NhcGUsc2FmZVZhbHVlOmZ1bmN0aW9uKGQpe3JldHVybiBmKGQpfX0se3JlZ2V4OnRoaXMucmVnZXhwLHNhZmVWYWx1ZTpmdW5jdGlvbihkKXtyZXR1cm4gby5lc2NhcGVWYWx1ZT9mKG8uZXNjYXBlKGQpKTpmKGQpfX1dO3JldHVybiB5LmZvckVhY2goZnVuY3Rpb24odil7Zm9yKGw9MDtzPXYucmVnZXguZXhlYyhuKTspe3ZhciBkPXNbMV0udHJpbSgpO2lmKHU9ZyhkKSx1PT09dm9pZCAwKWlmKHR5cGVvZiBwPT0iZnVuY3Rpb24iKXt2YXIgaD1wKG4scyxhKTt1PXR5cGVvZiBoPT0ic3RyaW5nIj9oOiIifWVsc2UgaWYoYSYmYS5oYXNPd25Qcm9wZXJ0eShkKSl1PSIiO2Vsc2UgaWYobSl7dT1zWzBdO2NvbnRpbnVlfWVsc2Ugby5sb2dnZXIud2FybigibWlzc2VkIHRvIHBhc3MgaW4gdmFyaWFibGUgIi5jb25jYXQoZCwiIGZvciBpbnRlcnBvbGF0aW5nICIpLmNvbmNhdChuKSksdT0iIjtlbHNlIHR5cGVvZiB1IT0ic3RyaW5nIiYmIW8udXNlUmF3VmFsdWVUb0VzY2FwZSYmKHU9bWUodSkpO3ZhciBPPXYuc2FmZVZhbHVlKHUpO2lmKG49bi5yZXBsYWNlKHNbMF0sTyksbT8odi5yZWdleC5sYXN0SW5kZXgrPXUubGVuZ3RoLHYucmVnZXgubGFzdEluZGV4LT1zWzBdLmxlbmd0aCk6di5yZWdleC5sYXN0SW5kZXg9MCxsKyssbD49by5tYXhSZXBsYWNlcylicmVha319KSxufX0se2tleToibmVzdCIsdmFsdWU6ZnVuY3Rpb24obixyKXt2YXIgZT10aGlzLGE9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9LG8scyx1PUwoe30sYSk7dS5hcHBseVBvc3RQcm9jZXNzb3I9ITEsZGVsZXRlIHUuZGVmYXVsdFZhbHVlO2Z1bmN0aW9uIGwocCxtKXt2YXIgeT10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKHAuaW5kZXhPZih5KTwwKXJldHVybiBwO3ZhciB2PXAuc3BsaXQobmV3IFJlZ0V4cCgiIi5jb25jYXQoeSwiWyBdKnsiKSkpLGQ9InsiLmNvbmNhdCh2WzFdKTtwPXZbMF0sZD10aGlzLmludGVycG9sYXRlKGQsdSk7dmFyIGg9ZC5tYXRjaCgvJy9nKSxPPWQubWF0Y2goLyIvZyk7KGgmJmgubGVuZ3RoJTI9PT0wJiYhT3x8Ty5sZW5ndGglMiE9PTApJiYoZD1kLnJlcGxhY2UoLycvZywnIicpKTt0cnl7dT1KU09OLnBhcnNlKGQpLG0mJih1PUwoTCh7fSxtKSx1KSl9Y2F0Y2goYil7cmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImZhaWxlZCBwYXJzaW5nIG9wdGlvbnMgc3RyaW5nIGluIG5lc3RpbmcgZm9yIGtleSAiLmNvbmNhdChwKSxiKSwiIi5jb25jYXQocCkuY29uY2F0KHkpLmNvbmNhdChkKX1yZXR1cm4gZGVsZXRlIHUuZGVmYXVsdFZhbHVlLHB9Zm9yKDtvPXRoaXMubmVzdGluZ1JlZ2V4cC5leGVjKG4pOyl7dmFyIGM9W10sZj0hMTtpZihvWzBdLmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpIT09LTEmJiEvey4qfS8udGVzdChvWzFdKSl7dmFyIGc9b1sxXS5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcikubWFwKGZ1bmN0aW9uKHApe3JldHVybiBwLnRyaW0oKX0pO29bMV09Zy5zaGlmdCgpLGM9ZyxmPSEwfWlmKHM9cihsLmNhbGwodGhpcyxvWzFdLnRyaW0oKSx1KSx1KSxzJiZvWzBdPT09biYmdHlwZW9mIHMhPSJzdHJpbmciKXJldHVybiBzO3R5cGVvZiBzIT0ic3RyaW5nIiYmKHM9bWUocykpLHN8fCh0aGlzLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcmVzb2x2ZSAiLmNvbmNhdChvWzFdLCIgZm9yIG5lc3RpbmcgIikuY29uY2F0KG4pKSxzPSIiKSxmJiYocz1jLnJlZHVjZShmdW5jdGlvbihwLG0pe3JldHVybiBlLmZvcm1hdChwLG0sYS5sbmcsTChMKHt9LGEpLHt9LHtpbnRlcnBvbGF0aW9ua2V5Om9bMV0udHJpbSgpfSkpfSxzLnRyaW0oKSkpLG49bi5yZXBsYWNlKG9bMF0scyksdGhpcy5yZWdleHAubGFzdEluZGV4PTB9cmV0dXJuIG59fV0pLGl9KCk7ZnVuY3Rpb24gTmUoaSx0KXt2YXIgbj1PYmplY3Qua2V5cyhpKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGkpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksZSkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBEKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP05lKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtfKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOk5lKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiBkdChpKXt2YXIgdD1pLnRvTG93ZXJDYXNlKCkudHJpbSgpLG49e307aWYoaS5pbmRleE9mKCIoIik+LTEpe3ZhciByPWkuc3BsaXQoIigiKTt0PXJbMF0udG9Mb3dlckNhc2UoKS50cmltKCk7dmFyIGU9clsxXS5zdWJzdHJpbmcoMCxyWzFdLmxlbmd0aC0xKTtpZih0PT09ImN1cnJlbmN5IiYmZS5pbmRleE9mKCI6Iik8MCluLmN1cnJlbmN5fHwobi5jdXJyZW5jeT1lLnRyaW0oKSk7ZWxzZSBpZih0PT09InJlbGF0aXZldGltZSImJmUuaW5kZXhPZigiOiIpPDApbi5yYW5nZXx8KG4ucmFuZ2U9ZS50cmltKCkpO2Vsc2V7dmFyIGE9ZS5zcGxpdCgiOyIpO2EuZm9yRWFjaChmdW5jdGlvbihvKXtpZihvKXt2YXIgcz1vLnNwbGl0KCI6IiksdT1XZShzKSxsPXVbMF0sYz11LnNsaWNlKDEpLGY9Yy5qb2luKCI6IikudHJpbSgpLnJlcGxhY2UoL14nK3wnKyQvZywiIik7bltsLnRyaW0oKV18fChuW2wudHJpbSgpXT1mKSxmPT09ImZhbHNlIiYmKG5bbC50cmltKCldPSExKSxmPT09InRydWUiJiYobltsLnRyaW0oKV09ITApLGlzTmFOKGYpfHwobltsLnRyaW0oKV09cGFyc2VJbnQoZiwxMCkpfX0pfX1yZXR1cm57Zm9ybWF0TmFtZTp0LGZvcm1hdE9wdGlvbnM6bn19ZnVuY3Rpb24gSyhpKXt2YXIgdD17fTtyZXR1cm4gZnVuY3Rpb24ocixlLGEpe3ZhciBvPWUrSlNPTi5zdHJpbmdpZnkoYSkscz10W29dO3JldHVybiBzfHwocz1pKGUsYSksdFtvXT1zKSxzKHIpfX12YXIgaHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9O1IodGhpcyxpKSx0aGlzLmxvZ2dlcj1OLmNyZWF0ZSgiZm9ybWF0dGVyIiksdGhpcy5vcHRpb25zPXQsdGhpcy5mb3JtYXRzPXtudW1iZXI6SyhmdW5jdGlvbihuLHIpe3ZhciBlPW5ldyBJbnRsLk51bWJlckZvcm1hdChuLHIpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSl9fSksY3VycmVuY3k6SyhmdW5jdGlvbihuLHIpe3ZhciBlPW5ldyBJbnRsLk51bWJlckZvcm1hdChuLEQoRCh7fSxyKSx7fSx7c3R5bGU6ImN1cnJlbmN5In0pKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGUuZm9ybWF0KGEpfX0pLGRhdGV0aW1lOksoZnVuY3Rpb24obixyKXt2YXIgZT1uZXcgSW50bC5EYXRlVGltZUZvcm1hdChuLEQoe30scikpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gZS5mb3JtYXQoYSl9fSkscmVsYXRpdmV0aW1lOksoZnVuY3Rpb24obixyKXt2YXIgZT1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQobixEKHt9LHIpKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGUuZm9ybWF0KGEsci5yYW5nZXx8ImRheSIpfX0pLGxpc3Q6SyhmdW5jdGlvbihuLHIpe3ZhciBlPW5ldyBJbnRsLkxpc3RGb3JtYXQobixEKHt9LHIpKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGUuZm9ybWF0KGEpfX0pfSx0aGlzLmluaXQodCl9cmV0dXJuIGsoaSxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fSxlPXIuaW50ZXJwb2xhdGlvbjt0aGlzLmZvcm1hdFNlcGFyYXRvcj1lLmZvcm1hdFNlcGFyYXRvcj9lLmZvcm1hdFNlcGFyYXRvcjplLmZvcm1hdFNlcGFyYXRvcnx8IiwifX0se2tleToiYWRkIix2YWx1ZTpmdW5jdGlvbihuLHIpe3RoaXMuZm9ybWF0c1tuLnRvTG93ZXJDYXNlKCkudHJpbSgpXT1yfX0se2tleToiYWRkQ2FjaGVkIix2YWx1ZTpmdW5jdGlvbihuLHIpe3RoaXMuZm9ybWF0c1tuLnRvTG93ZXJDYXNlKCkudHJpbSgpXT1LKHIpfX0se2tleToiZm9ybWF0Iix2YWx1ZTpmdW5jdGlvbihuLHIsZSxhKXt2YXIgbz10aGlzLHM9ci5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvciksdT1zLnJlZHVjZShmdW5jdGlvbihsLGMpe3ZhciBmPWR0KGMpLGc9Zi5mb3JtYXROYW1lLHA9Zi5mb3JtYXRPcHRpb25zO2lmKG8uZm9ybWF0c1tnXSl7dmFyIG09bDt0cnl7dmFyIHk9YSYmYS5mb3JtYXRQYXJhbXMmJmEuZm9ybWF0UGFyYW1zW2EuaW50ZXJwb2xhdGlvbmtleV18fHt9LHY9eS5sb2NhbGV8fHkubG5nfHxhLmxvY2FsZXx8YS5sbmd8fGU7bT1vLmZvcm1hdHNbZ10obCx2LEQoRChEKHt9LHApLGEpLHkpKX1jYXRjaChkKXtvLmxvZ2dlci53YXJuKGQpfXJldHVybiBtfWVsc2Ugby5sb2dnZXIud2FybigidGhlcmUgd2FzIG5vIGZvcm1hdCBmdW5jdGlvbiBmb3IgIi5jb25jYXQoZykpO3JldHVybiBsfSxuKTtyZXR1cm4gdX19XSksaX0oKTtmdW5jdGlvbiBDZShpLHQpe3ZhciBuPU9iamVjdC5rZXlzKGkpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIEVlKGkpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP0NlKE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtfKGkscixuW3JdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOkNlKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKSl9KX1yZXR1cm4gaX1mdW5jdGlvbiB2dChpKXt2YXIgdD1tdCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWooaSksZTtpZih0KXt2YXIgYT1qKHRoaXMpLmNvbnN0cnVjdG9yO2U9UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsYSl9ZWxzZSBlPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBCKHRoaXMsZSl9fWZ1bmN0aW9uIG10KCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIHl0KGksdCl7aS5wZW5kaW5nW3RdIT09dm9pZCAwJiYoZGVsZXRlIGkucGVuZGluZ1t0XSxpLnBlbmRpbmdDb3VudC0tKX12YXIgYnQ9ZnVuY3Rpb24oaSl7UShuLGkpO3ZhciB0PXZ0KG4pO2Z1bmN0aW9uIG4ocixlLGEpe3ZhciBvLHM9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOnt9O3JldHVybiBSKHRoaXMsbiksbz10LmNhbGwodGhpcykscSYmSS5jYWxsKEYobykpLG8uYmFja2VuZD1yLG8uc3RvcmU9ZSxvLnNlcnZpY2VzPWEsby5sYW5ndWFnZVV0aWxzPWEubGFuZ3VhZ2VVdGlscyxvLm9wdGlvbnM9cyxvLmxvZ2dlcj1OLmNyZWF0ZSgiYmFja2VuZENvbm5lY3RvciIpLG8ud2FpdGluZ1JlYWRzPVtdLG8ubWF4UGFyYWxsZWxSZWFkcz1zLm1heFBhcmFsbGVsUmVhZHN8fDEwLG8ucmVhZGluZ0NhbGxzPTAsby5tYXhSZXRyaWVzPXMubWF4UmV0cmllcz49MD9zLm1heFJldHJpZXM6NSxvLnJldHJ5VGltZW91dD1zLnJldHJ5VGltZW91dD49MT9zLnJldHJ5VGltZW91dDozNTAsby5zdGF0ZT17fSxvLnF1ZXVlPVtdLG8uYmFja2VuZCYmby5iYWNrZW5kLmluaXQmJm8uYmFja2VuZC5pbml0KGEscy5iYWNrZW5kLHMpLG99cmV0dXJuIGsobixbe2tleToicXVldWVMb2FkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyxzKXt2YXIgdT10aGlzLGw9e30sYz17fSxmPXt9LGc9e307cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihwKXt2YXIgbT0hMDthLmZvckVhY2goZnVuY3Rpb24oeSl7dmFyIHY9IiIuY29uY2F0KHAsInwiKS5jb25jYXQoeSk7IW8ucmVsb2FkJiZ1LnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKHAseSk/dS5zdGF0ZVt2XT0yOnUuc3RhdGVbdl08MHx8KHUuc3RhdGVbdl09PT0xP2Nbdl09PT12b2lkIDAmJihjW3ZdPSEwKToodS5zdGF0ZVt2XT0xLG09ITEsY1t2XT09PXZvaWQgMCYmKGNbdl09ITApLGxbdl09PT12b2lkIDAmJihsW3ZdPSEwKSxnW3ldPT09dm9pZCAwJiYoZ1t5XT0hMCkpKX0pLG18fChmW3BdPSEwKX0pLChPYmplY3Qua2V5cyhsKS5sZW5ndGh8fE9iamVjdC5rZXlzKGMpLmxlbmd0aCkmJnRoaXMucXVldWUucHVzaCh7cGVuZGluZzpjLHBlbmRpbmdDb3VudDpPYmplY3Qua2V5cyhjKS5sZW5ndGgsbG9hZGVkOnt9LGVycm9yczpbXSxjYWxsYmFjazpzfSkse3RvTG9hZDpPYmplY3Qua2V5cyhsKSxwZW5kaW5nOk9iamVjdC5rZXlzKGMpLHRvTG9hZExhbmd1YWdlczpPYmplY3Qua2V5cyhmKSx0b0xvYWROYW1lc3BhY2VzOk9iamVjdC5rZXlzKGcpfX19LHtrZXk6ImxvYWRlZCIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3ZhciBzPWUuc3BsaXQoInwiKSx1PXNbMF0sbD1zWzFdO2EmJnRoaXMuZW1pdCgiZmFpbGVkTG9hZGluZyIsdSxsLGEpLG8mJnRoaXMuc3RvcmUuYWRkUmVzb3VyY2VCdW5kbGUodSxsLG8pLHRoaXMuc3RhdGVbZV09YT8tMToyO3ZhciBjPXt9O3RoaXMucXVldWUuZm9yRWFjaChmdW5jdGlvbihmKXtaZShmLmxvYWRlZCxbdV0sbCkseXQoZixlKSxhJiZmLmVycm9ycy5wdXNoKGEpLGYucGVuZGluZ0NvdW50PT09MCYmIWYuZG9uZSYmKE9iamVjdC5rZXlzKGYubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2NbZ118fChjW2ddPXt9KTt2YXIgcD1mLmxvYWRlZFtnXTtwLmxlbmd0aCYmcC5mb3JFYWNoKGZ1bmN0aW9uKG0pe2NbZ11bbV09PT12b2lkIDAmJihjW2ddW21dPSEwKX0pfSksZi5kb25lPSEwLGYuZXJyb3JzLmxlbmd0aD9mLmNhbGxiYWNrKGYuZXJyb3JzKTpmLmNhbGxiYWNrKCkpfSksdGhpcy5lbWl0KCJsb2FkZWQiLGMpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuIWYuZG9uZX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106MCxsPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTp0aGlzLnJldHJ5VGltZW91dCxjPWFyZ3VtZW50cy5sZW5ndGg+NT9hcmd1bWVudHNbNV06dm9pZCAwO2lmKCFlLmxlbmd0aClyZXR1cm4gYyhudWxsLHt9KTtpZih0aGlzLnJlYWRpbmdDYWxscz49dGhpcy5tYXhQYXJhbGxlbFJlYWRzKXt0aGlzLndhaXRpbmdSZWFkcy5wdXNoKHtsbmc6ZSxuczphLGZjTmFtZTpvLHRyaWVkOnUsd2FpdDpsLGNhbGxiYWNrOmN9KTtyZXR1cm59cmV0dXJuIHRoaXMucmVhZGluZ0NhbGxzKyssdGhpcy5iYWNrZW5kW29dKGUsYSxmdW5jdGlvbihmLGcpe2lmKHMucmVhZGluZ0NhbGxzLS0scy53YWl0aW5nUmVhZHMubGVuZ3RoPjApe3ZhciBwPXMud2FpdGluZ1JlYWRzLnNoaWZ0KCk7cy5yZWFkKHAubG5nLHAubnMscC5mY05hbWUscC50cmllZCxwLndhaXQscC5jYWxsYmFjayl9aWYoZiYmZyYmdTxzLm1heFJldHJpZXMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzLnJlYWQuY2FsbChzLGUsYSxvLHUrMSxsKjIsYyl9LGwpO3JldHVybn1jKGYsZyl9KX19LHtrZXk6InByZXBhcmVMb2FkaW5nIix2YWx1ZTpmdW5jdGlvbihlLGEpe3ZhciBvPXRoaXMscz1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sdT1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMDtpZighdGhpcy5iYWNrZW5kKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJObyBiYWNrZW5kIHdhcyBhZGRlZCB2aWEgaTE4bmV4dC51c2UuIFdpbGwgbm90IGxvYWQgcmVzb3VyY2VzLiIpLHUmJnUoKTt0eXBlb2YgZT09InN0cmluZyImJihlPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZSkpLHR5cGVvZiBhPT0ic3RyaW5nIiYmKGE9W2FdKTt2YXIgbD10aGlzLnF1ZXVlTG9hZChlLGEscyx1KTtpZighbC50b0xvYWQubGVuZ3RoKXJldHVybiBsLnBlbmRpbmcubGVuZ3RofHx1KCksbnVsbDtsLnRvTG9hZC5mb3JFYWNoKGZ1bmN0aW9uKGMpe28ubG9hZE9uZShjKX0pfX0se2tleToibG9hZCIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8pe3RoaXMucHJlcGFyZUxvYWRpbmcoZSxhLHt9LG8pfX0se2tleToicmVsb2FkIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dGhpcy5wcmVwYXJlTG9hZGluZyhlLGEse3JlbG9hZDohMH0sbyl9fSx7a2V5OiJsb2FkT25lIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiIiLHM9ZS5zcGxpdCgifCIpLHU9c1swXSxsPXNbMV07dGhpcy5yZWFkKHUsbCwicmVhZCIsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbihjLGYpe2MmJmEubG9nZ2VyLndhcm4oIiIuY29uY2F0KG8sImxvYWRpbmcgbmFtZXNwYWNlICIpLmNvbmNhdChsLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdCh1LCIgZmFpbGVkIiksYyksIWMmJmYmJmEubG9nZ2VyLmxvZygiIi5jb25jYXQobywibG9hZGVkIG5hbWVzcGFjZSAiKS5jb25jYXQobCwiIGZvciBsYW5ndWFnZSAiKS5jb25jYXQodSksZiksYS5sb2FkZWQoZSxjLGYpfSl9fSx7a2V5OiJzYXZlTWlzc2luZyIsdmFsdWU6ZnVuY3Rpb24oZSxhLG8scyx1KXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06e307aWYodGhpcy5zZXJ2aWNlcy51dGlscyYmdGhpcy5zZXJ2aWNlcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiF0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShhKSl7dGhpcy5sb2dnZXIud2FybignZGlkIG5vdCBzYXZlIGtleSAiJy5jb25jYXQobywnIiBhcyB0aGUgbmFtZXNwYWNlICInKS5jb25jYXQoYSwnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIik7cmV0dXJufW89PW51bGx8fG89PT0iInx8KHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZShlLGEsbyxzLG51bGwsRWUoRWUoe30sbCkse30se2lzVXBkYXRlOnV9KSksISghZXx8IWVbMF0pJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlKGVbMF0sYSxvLHMpKX19XSksbn0oSSk7ZnVuY3Rpb24gT3QoKXtyZXR1cm57ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIG49e307aWYoUCh0WzFdKT09PSJvYmplY3QiJiYobj10WzFdKSx0eXBlb2YgdFsxXT09InN0cmluZyImJihuLmRlZmF1bHRWYWx1ZT10WzFdKSx0eXBlb2YgdFsyXT09InN0cmluZyImJihuLnREZXNjcmlwdGlvbj10WzJdKSxQKHRbMl0pPT09Im9iamVjdCJ8fFAodFszXSk9PT0ib2JqZWN0Iil7dmFyIHI9dFszXXx8dFsyXTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZV09cltlXX0pfXJldHVybiBufSxpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMCxmb3JtYXQ6ZnVuY3Rpb24odCxuLHIsZSl7cmV0dXJuIHR9LHByZWZpeDoie3siLHN1ZmZpeDoifX0iLGZvcm1hdFNlcGFyYXRvcjoiLCIsdW5lc2NhcGVQcmVmaXg6Ii0iLG5lc3RpbmdQcmVmaXg6IiR0KCIsbmVzdGluZ1N1ZmZpeDoiKSIsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6IiwiLG1heFJlcGxhY2VzOjFlMyxza2lwT25WYXJpYWJsZXM6ITB9fX1mdW5jdGlvbiBGZShpKXtyZXR1cm4gdHlwZW9mIGkubnM9PSJzdHJpbmciJiYoaS5ucz1baS5uc10pLHR5cGVvZiBpLmZhbGxiYWNrTG5nPT0ic3RyaW5nIiYmKGkuZmFsbGJhY2tMbmc9W2kuZmFsbGJhY2tMbmddKSx0eXBlb2YgaS5mYWxsYmFja05TPT0ic3RyaW5nIiYmKGkuZmFsbGJhY2tOUz1baS5mYWxsYmFja05TXSksaS5zdXBwb3J0ZWRMbmdzJiZpLnN1cHBvcnRlZExuZ3MuaW5kZXhPZigiY2ltb2RlIik8MCYmKGkuc3VwcG9ydGVkTG5ncz1pLnN1cHBvcnRlZExuZ3MuY29uY2F0KFsiY2ltb2RlIl0pKSxpfWZ1bmN0aW9uIF9lKGksdCl7dmFyIG49T2JqZWN0LmtleXMoaSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhpKTt0JiYocj1yLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLGUpLmVudW1lcmFibGV9KSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gQyhpKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF0hPW51bGw/YXJndW1lbnRzW3RdOnt9O3QlMj9fZShPYmplY3QobiksITApLmZvckVhY2goZnVuY3Rpb24ocil7XyhpLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpfZShPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGl9ZnVuY3Rpb24gU3QoaSl7dmFyIHQ9d3QoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1qKGkpLGU7aWYodCl7dmFyIGE9aih0aGlzKS5jb25zdHJ1Y3RvcjtlPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGEpfWVsc2UgZT1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gQih0aGlzLGUpfX1mdW5jdGlvbiB3dCgpe2lmKHR5cGVvZiBSZWZsZWN0PiJ1Inx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKHR5cGVvZiBQcm94eT09ImZ1bmN0aW9uIilyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBlZSgpe31mdW5jdGlvbiB4dChpKXt2YXIgdD1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoaSkpO3QuZm9yRWFjaChmdW5jdGlvbihuKXt0eXBlb2YgaVtuXT09ImZ1bmN0aW9uIiYmKGlbbl09aVtuXS5iaW5kKGkpKX0pfXZhciB0ZT1mdW5jdGlvbihpKXtRKG4saSk7dmFyIHQ9U3Qobik7ZnVuY3Rpb24gbigpe3ZhciByLGU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LGE9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoUih0aGlzLG4pLHI9dC5jYWxsKHRoaXMpLHEmJkkuY2FsbChGKHIpKSxyLm9wdGlvbnM9RmUoZSksci5zZXJ2aWNlcz17fSxyLmxvZ2dlcj1OLHIubW9kdWxlcz17ZXh0ZXJuYWw6W119LHh0KEYocikpLGEmJiFyLmlzSW5pdGlhbGl6ZWQmJiFlLmlzQ2xvbmUpe2lmKCFyLm9wdGlvbnMuaW5pdEltbWVkaWF0ZSlyZXR1cm4gci5pbml0KGUsYSksQihyLEYocikpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmluaXQoZSxhKX0sMCl9cmV0dXJuIHJ9cmV0dXJuIGsobixbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGE9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LG89YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7dHlwZW9mIGE9PSJmdW5jdGlvbiImJihvPWEsYT17fSksIWEuZGVmYXVsdE5TJiZhLmRlZmF1bHROUyE9PSExJiZhLm5zJiYodHlwZW9mIGEubnM9PSJzdHJpbmciP2EuZGVmYXVsdE5TPWEubnM6YS5ucy5pbmRleE9mKCJ0cmFuc2xhdGlvbiIpPDAmJihhLmRlZmF1bHROUz1hLm5zWzBdKSk7dmFyIHM9T3QoKTt0aGlzLm9wdGlvbnM9QyhDKEMoe30scyksdGhpcy5vcHRpb25zKSxGZShhKSksdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkhPT0idjEiJiYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb249QyhDKHt9LHMuaW50ZXJwb2xhdGlvbiksdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24pKSxhLmtleVNlcGFyYXRvciE9PXZvaWQgMCYmKHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZEtleVNlcGFyYXRvcj1hLmtleVNlcGFyYXRvciksYS5uc1NlcGFyYXRvciE9PXZvaWQgMCYmKHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZE5zU2VwYXJhdG9yPWEubnNTZXBhcmF0b3IpO2Z1bmN0aW9uIHUoZCl7cmV0dXJuIGQ/dHlwZW9mIGQ9PSJmdW5jdGlvbiI/bmV3IGQ6ZDpudWxsfWlmKCF0aGlzLm9wdGlvbnMuaXNDbG9uZSl7dGhpcy5tb2R1bGVzLmxvZ2dlcj9OLmluaXQodSh0aGlzLm1vZHVsZXMubG9nZ2VyKSx0aGlzLm9wdGlvbnMpOk4uaW5pdChudWxsLHRoaXMub3B0aW9ucyk7dmFyIGw7dGhpcy5tb2R1bGVzLmZvcm1hdHRlcj9sPXRoaXMubW9kdWxlcy5mb3JtYXR0ZXI6dHlwZW9mIEludGw8InUiJiYobD1odCk7dmFyIGM9bmV3IHN0KHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgYXQodGhpcy5vcHRpb25zLnJlc291cmNlcyx0aGlzLm9wdGlvbnMpO3ZhciBmPXRoaXMuc2VydmljZXM7Zi5sb2dnZXI9TixmLnJlc291cmNlU3RvcmU9dGhpcy5zdG9yZSxmLmxhbmd1YWdlVXRpbHM9YyxmLnBsdXJhbFJlc29sdmVyPW5ldyBndChjLHtwcmVwZW5kOnRoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsY29tcGF0aWJpbGl0eUpTT046dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OLHNpbXBsaWZ5UGx1cmFsU3VmZml4OnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeH0pLGwmJighdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0fHx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQ9PT1zLmludGVycG9sYXRpb24uZm9ybWF0KSYmKGYuZm9ybWF0dGVyPXUobCksZi5mb3JtYXR0ZXIuaW5pdChmLHRoaXMub3B0aW9ucyksdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0PWYuZm9ybWF0dGVyLmZvcm1hdC5iaW5kKGYuZm9ybWF0dGVyKSksZi5pbnRlcnBvbGF0b3I9bmV3IHB0KHRoaXMub3B0aW9ucyksZi51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcyl9LGYuYmFja2VuZENvbm5lY3Rvcj1uZXcgYnQodSh0aGlzLm1vZHVsZXMuYmFja2VuZCksZi5yZXNvdXJjZVN0b3JlLGYsdGhpcy5vcHRpb25zKSxmLmJhY2tlbmRDb25uZWN0b3Iub24oIioiLGZ1bmN0aW9uKGQpe2Zvcih2YXIgaD1hcmd1bWVudHMubGVuZ3RoLE89bmV3IEFycmF5KGg+MT9oLTE6MCksYj0xO2I8aDtiKyspT1tiLTFdPWFyZ3VtZW50c1tiXTtlLmVtaXQuYXBwbHkoZSxbZF0uY29uY2F0KE8pKX0pLHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yJiYoZi5sYW5ndWFnZURldGVjdG9yPXUodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IpLGYubGFuZ3VhZ2VEZXRlY3Rvci5pbml0KGYsdGhpcy5vcHRpb25zLmRldGVjdGlvbix0aGlzLm9wdGlvbnMpKSx0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCYmKGYuaTE4bkZvcm1hdD11KHRoaXMubW9kdWxlcy5pMThuRm9ybWF0KSxmLmkxOG5Gb3JtYXQuaW5pdCYmZi5pMThuRm9ybWF0LmluaXQodGhpcykpLHRoaXMudHJhbnNsYXRvcj1uZXcgUmUodGhpcy5zZXJ2aWNlcyx0aGlzLm9wdGlvbnMpLHRoaXMudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24oZCl7Zm9yKHZhciBoPWFyZ3VtZW50cy5sZW5ndGgsTz1uZXcgQXJyYXkoaD4xP2gtMTowKSxiPTE7YjxoO2IrKylPW2ItMV09YXJndW1lbnRzW2JdO2UuZW1pdC5hcHBseShlLFtkXS5jb25jYXQoTykpfSksdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5pbml0JiZkLmluaXQoZSl9KX1pZih0aGlzLmZvcm1hdD10aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQsb3x8KG89ZWUpLHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyYmIXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmIXRoaXMub3B0aW9ucy5sbmcpe3ZhciBnPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7Zy5sZW5ndGg+MCYmZ1swXSE9PSJkZXYiJiYodGhpcy5vcHRpb25zLmxuZz1nWzBdKX0hdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5vcHRpb25zLmxuZyYmdGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpO3ZhciBwPVsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXTtwLmZvckVhY2goZnVuY3Rpb24oZCl7ZVtkXT1mdW5jdGlvbigpe3ZhciBoO3JldHVybihoPWUuc3RvcmUpW2RdLmFwcGx5KGgsYXJndW1lbnRzKX19KTt2YXIgbT1bImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdO20uZm9yRWFjaChmdW5jdGlvbihkKXtlW2RdPWZ1bmN0aW9uKCl7dmFyIGg7cmV0dXJuKGg9ZS5zdG9yZSlbZF0uYXBwbHkoaCxhcmd1bWVudHMpLGV9fSk7dmFyIHk9TSgpLHY9ZnVuY3Rpb24oKXt2YXIgaD1mdW5jdGlvbihiLHgpe2UuaXNJbml0aWFsaXplZCYmIWUuaW5pdGlhbGl6ZWRTdG9yZU9uY2UmJmUubG9nZ2VyLndhcm4oImluaXQ6IGkxOG5leHQgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4gWW91IHNob3VsZCBjYWxsIGluaXQganVzdCBvbmNlISIpLGUuaXNJbml0aWFsaXplZD0hMCxlLm9wdGlvbnMuaXNDbG9uZXx8ZS5sb2dnZXIubG9nKCJpbml0aWFsaXplZCIsZS5vcHRpb25zKSxlLmVtaXQoImluaXRpYWxpemVkIixlLm9wdGlvbnMpLHkucmVzb2x2ZSh4KSxvKGIseCl9O2lmKGUubGFuZ3VhZ2VzJiZlLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSE9PSJ2MSImJiFlLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIGgobnVsbCxlLnQuYmluZChlKSk7ZS5jaGFuZ2VMYW5ndWFnZShlLm9wdGlvbnMubG5nLGgpfTtyZXR1cm4gdGhpcy5vcHRpb25zLnJlc291cmNlc3x8IXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlP3YoKTpzZXRUaW1lb3V0KHYsMCkseX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBhPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ZWUscz1vLHU9dHlwZW9mIGU9PSJzdHJpbmciP2U6dGhpcy5sYW5ndWFnZTtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIiYmKHM9ZSksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYodSYmdS50b0xvd2VyQ2FzZSgpPT09ImNpbW9kZSIpcmV0dXJuIHMoKTt2YXIgbD1bXSxjPWZ1bmN0aW9uKHApe2lmKHApe3ZhciBtPWEuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkocCk7bS5mb3JFYWNoKGZ1bmN0aW9uKHkpe2wuaW5kZXhPZih5KTwwJiZsLnB1c2goeSl9KX19O2lmKHUpYyh1KTtlbHNle3ZhciBmPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7Zi5mb3JFYWNoKGZ1bmN0aW9uKGcpe3JldHVybiBjKGcpfSl9dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24oZyl7cmV0dXJuIGMoZyl9KSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZChsLHRoaXMub3B0aW9ucy5ucyxmdW5jdGlvbihnKXshZyYmIWEucmVzb2x2ZWRMYW5ndWFnZSYmYS5sYW5ndWFnZSYmYS5zZXRSZXNvbHZlZExhbmd1YWdlKGEubGFuZ3VhZ2UpLHMoZyl9KX1lbHNlIHMobnVsbCl9fSx7a2V5OiJyZWxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSxvKXt2YXIgcz1NKCk7cmV0dXJuIGV8fChlPXRoaXMubGFuZ3VhZ2VzKSxhfHwoYT10aGlzLm9wdGlvbnMubnMpLG98fChvPWVlKSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IucmVsb2FkKGUsYSxmdW5jdGlvbih1KXtzLnJlc29sdmUoKSxvKHUpfSksc319LHtrZXk6InVzZSIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYW4gdW5kZWZpbmVkIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtpZighZS50eXBlKXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGEgd3JvbmcgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO3JldHVybiBlLnR5cGU9PT0iYmFja2VuZCImJih0aGlzLm1vZHVsZXMuYmFja2VuZD1lKSwoZS50eXBlPT09ImxvZ2dlciJ8fGUubG9nJiZlLndhcm4mJmUuZXJyb3IpJiYodGhpcy5tb2R1bGVzLmxvZ2dlcj1lKSxlLnR5cGU9PT0ibGFuZ3VhZ2VEZXRlY3RvciImJih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcj1lKSxlLnR5cGU9PT0iaTE4bkZvcm1hdCImJih0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdD1lKSxlLnR5cGU9PT0icG9zdFByb2Nlc3NvciImJnhlLmFkZFBvc3RQcm9jZXNzb3IoZSksZS50eXBlPT09ImZvcm1hdHRlciImJih0aGlzLm1vZHVsZXMuZm9ybWF0dGVyPWUpLGUudHlwZT09PSIzcmRQYXJ0eSImJnRoaXMubW9kdWxlcy5leHRlcm5hbC5wdXNoKGUpLHRoaXN9fSx7a2V5OiJzZXRSZXNvbHZlZExhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbihlKXtpZighKCFlfHwhdGhpcy5sYW5ndWFnZXMpJiYhKFsiY2ltb2RlIiwiZGV2Il0uaW5kZXhPZihlKT4tMSkpZm9yKHZhciBhPTA7YTx0aGlzLmxhbmd1YWdlcy5sZW5ndGg7YSsrKXt2YXIgbz10aGlzLmxhbmd1YWdlc1thXTtpZighKFsiY2ltb2RlIiwiZGV2Il0uaW5kZXhPZihvKT4tMSkmJnRoaXMuc3RvcmUuaGFzTGFuZ3VhZ2VTb21lVHJhbnNsYXRpb25zKG8pKXt0aGlzLnJlc29sdmVkTGFuZ3VhZ2U9bzticmVha319fX0se2tleToiY2hhbmdlTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89dGhpczt0aGlzLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPWU7dmFyIHM9TSgpO3RoaXMuZW1pdCgibGFuZ3VhZ2VDaGFuZ2luZyIsZSk7dmFyIHU9ZnVuY3Rpb24oZyl7by5sYW5ndWFnZT1nLG8ubGFuZ3VhZ2VzPW8uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZyksby5yZXNvbHZlZExhbmd1YWdlPXZvaWQgMCxvLnNldFJlc29sdmVkTGFuZ3VhZ2UoZyl9LGw9ZnVuY3Rpb24oZyxwKXtwPyh1KHApLG8udHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShwKSxvLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxvLmVtaXQoImxhbmd1YWdlQ2hhbmdlZCIscCksby5sb2dnZXIubG9nKCJsYW5ndWFnZUNoYW5nZWQiLHApKTpvLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxzLnJlc29sdmUoZnVuY3Rpb24oKXtyZXR1cm4gby50LmFwcGx5KG8sYXJndW1lbnRzKX0pLGEmJmEoZyxmdW5jdGlvbigpe3JldHVybiBvLnQuYXBwbHkobyxhcmd1bWVudHMpfSl9LGM9ZnVuY3Rpb24oZyl7IWUmJiFnJiZvLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJihnPVtdKTt2YXIgcD10eXBlb2YgZz09InN0cmluZyI/ZzpvLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKGcpO3AmJihvLmxhbmd1YWdlfHx1KHApLG8udHJhbnNsYXRvci5sYW5ndWFnZXx8by50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKHApLG8uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmby5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKHApKSxvLmxvYWRSZXNvdXJjZXMocCxmdW5jdGlvbihtKXtsKG0scCl9KX07cmV0dXJuIWUmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmIXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz9jKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSk6IWUmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP3RoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoYyk6YyhlKSxzfX0se2tleToiZ2V0Rml4ZWRUIix2YWx1ZTpmdW5jdGlvbihlLGEsbyl7dmFyIHM9dGhpcyx1PWZ1bmN0aW9uIGwoYyxmKXt2YXIgZztpZihQKGYpIT09Im9iamVjdCIpe2Zvcih2YXIgcD1hcmd1bWVudHMubGVuZ3RoLG09bmV3IEFycmF5KHA+Mj9wLTI6MCkseT0yO3k8cDt5KyspbVt5LTJdPWFyZ3VtZW50c1t5XTtnPXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbYyxmXS5jb25jYXQobSkpfWVsc2UgZz1DKHt9LGYpO2cubG5nPWcubG5nfHxsLmxuZyxnLmxuZ3M9Zy5sbmdzfHxsLmxuZ3MsZy5ucz1nLm5zfHxsLm5zLGcua2V5UHJlZml4PWcua2V5UHJlZml4fHxvfHxsLmtleVByZWZpeDt2YXIgdj1zLm9wdGlvbnMua2V5U2VwYXJhdG9yfHwiLiIsZD1nLmtleVByZWZpeD8iIi5jb25jYXQoZy5rZXlQcmVmaXgpLmNvbmNhdCh2KS5jb25jYXQoYyk6YztyZXR1cm4gcy50KGQsZyl9O3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/dS5sbmc9ZTp1LmxuZ3M9ZSx1Lm5zPWEsdS5rZXlQcmVmaXg9byx1fX0se2tleToidCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYoZT10aGlzLnRyYW5zbGF0b3IpLnRyYW5zbGF0ZS5hcHBseShlLGFyZ3VtZW50cyl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKGU9dGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkoZSxhcmd1bWVudHMpfX0se2tleToic2V0RGVmYXVsdE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz1lfX0se2tleToiaGFzTG9hZGVkTmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgYT10aGlzLG89YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9O2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkIix0aGlzLmxhbmd1YWdlcyksITE7aWYoIXRoaXMubGFuZ3VhZ2VzfHwhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5Iix0aGlzLmxhbmd1YWdlcyksITE7dmFyIHM9dGhpcy5yZXNvbHZlZExhbmd1YWdlfHx0aGlzLmxhbmd1YWdlc1swXSx1PXRoaXMub3B0aW9ucz90aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmc6ITEsbD10aGlzLmxhbmd1YWdlc1t0aGlzLmxhbmd1YWdlcy5sZW5ndGgtMV07aWYocy50b0xvd2VyQ2FzZSgpPT09ImNpbW9kZSIpcmV0dXJuITA7dmFyIGM9ZnVuY3Rpb24ocCxtKXt2YXIgeT1hLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3Iuc3RhdGVbIiIuY29uY2F0KHAsInwiKS5jb25jYXQobSldO3JldHVybiB5PT09LTF8fHk9PT0yfTtpZihvLnByZWNoZWNrKXt2YXIgZj1vLnByZWNoZWNrKHRoaXMsYyk7aWYoZiE9PXZvaWQgMClyZXR1cm4gZn1yZXR1cm4hISh0aGlzLmhhc1Jlc291cmNlQnVuZGxlKHMsZSl8fCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8dGhpcy5vcHRpb25zLnJlc291cmNlcyYmIXRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlc3x8YyhzLGUpJiYoIXV8fGMobCxlKSkpfX0se2tleToibG9hZE5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89dGhpcyxzPU0oKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5zPyh0eXBlb2YgZT09InN0cmluZyImJihlPVtlXSksZS5mb3JFYWNoKGZ1bmN0aW9uKHUpe28ub3B0aW9ucy5ucy5pbmRleE9mKHUpPDAmJm8ub3B0aW9ucy5ucy5wdXNoKHUpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHUpe3MucmVzb2x2ZSgpLGEmJmEodSl9KSxzKTooYSYmYSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImxvYWRMYW5ndWFnZXMiLHZhbHVlOmZ1bmN0aW9uKGUsYSl7dmFyIG89TSgpO3R5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKTt2YXIgcz10aGlzLm9wdGlvbnMucHJlbG9hZHx8W10sdT1lLmZpbHRlcihmdW5jdGlvbihsKXtyZXR1cm4gcy5pbmRleE9mKGwpPDB9KTtyZXR1cm4gdS5sZW5ndGg/KHRoaXMub3B0aW9ucy5wcmVsb2FkPXMuY29uY2F0KHUpLHRoaXMubG9hZFJlc291cmNlcyhmdW5jdGlvbihsKXtvLnJlc29sdmUoKSxhJiZhKGwpfSksbyk6KGEmJmEoKSxQcm9taXNlLnJlc29sdmUoKSl9fSx7a2V5OiJkaXIiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKGV8fChlPXRoaXMucmVzb2x2ZWRMYW5ndWFnZXx8KHRoaXMubGFuZ3VhZ2VzJiZ0aGlzLmxhbmd1YWdlcy5sZW5ndGg+MD90aGlzLmxhbmd1YWdlc1swXTp0aGlzLmxhbmd1YWdlKSksIWUpcmV0dXJuInJ0bCI7dmFyIGE9WyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSIsImNrYiJdO3JldHVybiBhLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGUpKT4tMXx8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi1hcmFiIik+MT8icnRsIjoibHRyIn19LHtrZXk6ImNsb25lSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxhPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTp7fSxvPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTplZSxzPUMoQyhDKHt9LHRoaXMub3B0aW9ucyksYSkse2lzQ2xvbmU6ITB9KSx1PW5ldyBuKHMpOyhhLmRlYnVnIT09dm9pZCAwfHxhLnByZWZpeCE9PXZvaWQgMCkmJih1LmxvZ2dlcj11LmxvZ2dlci5jbG9uZShhKSk7dmFyIGw9WyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXTtyZXR1cm4gbC5mb3JFYWNoKGZ1bmN0aW9uKGMpe3VbY109ZVtjXX0pLHUuc2VydmljZXM9Qyh7fSx0aGlzLnNlcnZpY2VzKSx1LnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh1KX0sdS50cmFuc2xhdG9yPW5ldyBSZSh1LnNlcnZpY2VzLHUub3B0aW9ucyksdS50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihjKXtmb3IodmFyIGY9YXJndW1lbnRzLmxlbmd0aCxnPW5ldyBBcnJheShmPjE/Zi0xOjApLHA9MTtwPGY7cCsrKWdbcC0xXT1hcmd1bWVudHNbcF07dS5lbWl0LmFwcGx5KHUsW2NdLmNvbmNhdChnKSl9KSx1LmluaXQocyxvKSx1LnRyYW5zbGF0b3Iub3B0aW9ucz11Lm9wdGlvbnMsdS50cmFuc2xhdG9yLmJhY2tlbmRDb25uZWN0b3Iuc2VydmljZXMudXRpbHM9e2hhc0xvYWRlZE5hbWVzcGFjZTp1Lmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKHUpfSx1fX0se2tleToidG9KU09OIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybntvcHRpb25zOnRoaXMub3B0aW9ucyxzdG9yZTp0aGlzLnN0b3JlLGxhbmd1YWdlOnRoaXMubGFuZ3VhZ2UsbGFuZ3VhZ2VzOnRoaXMubGFuZ3VhZ2VzLHJlc29sdmVkTGFuZ3VhZ2U6dGhpcy5yZXNvbHZlZExhbmd1YWdlfX19XSksbn0oSSk7Xyh0ZSwiY3JlYXRlSW5zdGFuY2UiLGZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LHQ9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7cmV0dXJuIG5ldyB0ZShpLHQpfSk7dmFyIHc9dGUuY3JlYXRlSW5zdGFuY2UoKTt3LmNyZWF0ZUluc3RhbmNlPXRlLmNyZWF0ZUluc3RhbmNlLHcuY3JlYXRlSW5zdGFuY2Usdy5pbml0LHcubG9hZFJlc291cmNlcyx3LnJlbG9hZFJlc291cmNlcyx3LnVzZSx3LmNoYW5nZUxhbmd1YWdlLHcuZ2V0Rml4ZWRULHcudCx3LmV4aXN0cyx3LnNldERlZmF1bHROYW1lc3BhY2Usdy5oYXNMb2FkZWROYW1lc3BhY2Usdy5sb2FkTmFtZXNwYWNlcyx3LmxvYWRMYW5ndWFnZXM7Y29uc3QgUHQ9KGksdCk9PnR5cGVvZiBpPT0ibnVtYmVyIiYmdHlwZW9mIHQ9PSJudW1iZXIiP2ktdDpTdHJpbmcoaSkubG9jYWxlQ29tcGFyZShTdHJpbmcodCkpO2Z1bmN0aW9uIEx0KGkpe3JldHVybiBQdH1jb25zdCBSdD1MdCgpO2Z1bmN0aW9uIEllKGksdCl7aWYoaS5sZW5ndGg8dC5sZW5ndGgpcmV0dXJuLUllKHQsaSk7Zm9yKGxldCBuPTA7bjxpLmxlbmd0aDtuKyspe2lmKCF0W25dKXJldHVybiAxO2NvbnN0IHI9UnQoaVtuXSx0W25dKTtpZihyIT09MClyZXR1cm4gcn1yZXR1cm4gMH1mdW5jdGlvbiBrdChpLHQsbil7Y29uc3Qgcj1uPT09ImFzY2VuZGluZyI/MTotMTtyZXR1cm4gaS5tYXAoZT0+KHtkYXRhOmUsdmFsdWU6dC5tYXAoYT0+ZVthXSl9KSkuc29ydCgoZSxhKT0+cipJZShlLnZhbHVlLGEudmFsdWUpKS5tYXAoZT0+ZS5kYXRhKX1jb25zdCBqdD1pPT57dHJ5e2NvbnN0e2RhdGE6dCx2aWV3TWVhc3VyZXM6bixzb3J0OnJ9PWkuZGF0YSxlPWt0KHQsbixyKTtzZWxmLnBvc3RNZXNzYWdlKGUpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IodC5zdGFjayksc2VsZi5wb3N0TWVzc2FnZSh0LnN0YWNrKX19O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsanQsITEpfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29ydC53b3JrZXItZWVjMGRhZGUuanMubWFwCg==",nj=typeof window<"u"&&window.Blob&&new Blob([atob(tj)],{type:"text/javascript;charset=utf-8"});function q2e(){const e=nj&&(window.URL||window.webkitURL).createObjectURL(nj);try{return e?new Worker(e):new Worker("data:application/javascript;base64,"+tj)}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}function X0(e,t){return new Promise((n,r)=>{e.postMessage(t),e.onmessage=i=>{n(i.data)},e.onerror=i=>{r({success:!1,message:i})}})}const ewe=async(e,t)=>{if(t.length===0)return e;const n=new U2e;try{return await X0(n,{dataSource:e,filters:t})}catch(r){throw new Error("Uncaught error in FilterWorker",{cause:r})}finally{n.terminate()}},twe=async(e,t)=>{if(e.length===0)return e;const n=new K2e;try{return await X0(n,{dataSource:e,trans:t})}catch(r){throw new Error("Uncaught error in TransformDataWorker",{cause:r})}finally{n.terminate()}},nwe=async(e,t)=>{const n=new $2e;try{return await X0(n,{dataSource:e,query:t})}catch(r){throw new Error("Uncaught error in ViewQueryWorker",{cause:r})}finally{n.terminate()}},rwe=async(e,t,n,r,i,o,a)=>{const s=new Q2e;try{return await X0(s,{dimsInRow:e,dimsInColumn:t,allData:n,aggData:r,collapsedKeyList:i,showTableSummary:o,sort:a})}catch(l){throw new Error("Uncaught error in TableBuilderDataWorker",{cause:l})}finally{s.terminate()}},iwe=async(e,t,n)=>{const r=new q2e;try{return await X0(r,{data:e,viewMeasures:t,sort:n})}catch(i){throw new Error("Uncaught error in ViewQueryWorker",{cause:i})}finally{r.terminate()}},owe=async(e,t,n,r)=>{process.env.NODE_ENV!=="production"&&console.log("local query triggered",t);let i=e;for await(const o of t)switch(o.type){case"filter":{i=await ewe(i,o.filters.map(a=>{const s={fid:a.fid,rule:null};return a.rule.type==="one of"||a.rule.type==="not in"?s.rule={type:a.rule.type,value:new Set(a.rule.value)}:s.rule=a.rule,s}).filter(Boolean));break}case"transform":{i=await twe(i,o.transform);break}case"view":{for await(const a of o.query)i=await nwe(i,a);break}case"sort":{i=await iwe(i,o.by,o.sort);break}default:{console.warn(new Error(`Unknown step type: ${o.type}`));break}}return i.slice(n??0,r?(n??0)+r:void 0)},Wl=e=>t=>owe(e,t.workflow,t.offset,t.limit),rj=[],awe=new N0([]);class swe{constructor(){Ct(this,"metaDict",{});Ct(this,"metaMap",{});Ct(this,"visDict",{});Ct(this,"dataSources",[]);Ct(this,"dsIndex",0);BG(this,{dataSource:Wh.struct})}get dataSource(){return this.dataSources[this.dsIndex]}get metaId(){var t;return(t=this.dataSource)==null?void 0:t.metaId}get meta(){return this.metaId?this.metaDict[this.metaId]??rj:rj}get computation(){var t;return(t=this.dataSource)!=null&&t.data?Wl(Mh(this.dataSource.data)):async()=>[]}get visSpecStore(){return!this.metaId||!this.meta.length?awe:(this.visDict[this.metaId]||(this.visDict[this.metaId]=new N0(this.meta,{onMetaChange:(t,n)=>this.updateCurrentDatasetMetas(t,n)})),this.visDict[this.metaId])}get currentDataset(){var t,n,r;return{dataSource:((t=this.dataSource)==null?void 0:t.data)??[],id:((n=this.dataSource)==null?void 0:n.id)??"",name:((r=this.dataSource)==null?void 0:r.name)??"",rawFields:this.meta}}updateCurrentDatasetMetas(t,n){const r=this.meta.find(i=>i.fid===t);if(r)for(let i in n)r[i]=n[i]}useDS(t){const n=this.dataSources.findIndex(r=>r.id===t);n>-1&&this.setDatasetIndex(n)}setDatasetIndex(t){this.dsIndex=t}importData(t){if(t.$schema===ND){this.metaDict=t.metaDict;const n={};Object.keys(t.metaDict).forEach(r=>{const i=t.metaDict[r];n[f2(i)]=r}),this.metaMap=n,this.dataSources=t.datasets,this.visDict=Object.fromEntries(Object.entries(t.specDict).map(([r,i])=>{const o=new N0(t.metaDict[r],{empty:!0,onMetaChange:(a,s)=>this.updateCurrentDatasetMetas(a,s)});return o.importRaw(i),[r,o]}))}else{const n={},r=Object.fromEntries(t.dataSources.map(l=>[l.id,l])),i=[],o={},a={};t.datasets.forEach(({dsId:l,id:u,name:c,rawFields:d})=>{const f=f2(d);o[f]?u=o[f]:(o[f]=u,n[u]=d,a[u]=new N0(d,{empty:!0,onMetaChange:(g,b)=>this.updateCurrentDatasetMetas(g,b)}));const p=r[l];i.push({data:p.data,id:l,metaId:u,name:c})});const[s]=Object.keys(n);s&&t.specList.forEach(l=>{const u=f2(l.encodings.dimensions.concat(l.encodings.measures).filter(d=>!d.computed));(a[u]||a[s]).appendFromOld(l)}),this.metaDict=n,this.visDict=a,this.dataSources=i,this.dsIndex=0}}exportData(){const t={};return Object.keys(this.visDict).forEach(n=>{t[n]=this.visDict[n].exportAllCharts()}),{$schema:ND,datasets:Mh(this.dataSources),metaDict:Mh(this.metaDict),specDict:t}}addDataSource(t){const n=f2(t.fields);this.metaMap[n]||(this.metaMap[n]=Li());const r=this.metaMap[n];this.metaDict[r]=t.fields,this.dataSources.push({data:t.data,id:Li(),metaId:r,name:t.name}),this.dsIndex=this.dataSources.length-1}}function f2(e){return e.map(t=>`${t.name}-${t.analyticType[0]}-${t.semanticType[0]}`).sort().join(",")}class lwe{constructor(){Ct(this,"dataStore",new swe);Ct(this,"tmpDSName","");Ct(this,"tmpDSRawFields",[]);Ct(this,"tmpDataSource",[]);Ct(this,"showDSPanel",!1);BG(this,{tmpDataSource:zn.ref,dataStore:!1})}setShowDSPanel(t){this.showDSPanel=t}initTempDS(){this.tmpDSName="New Dataset",this.tmpDSRawFields=[],this.tmpDataSource=[]}updateTempFields(t){this.tmpDSRawFields=t}updateTempDatasetMetas(t,n){const r=this.tmpDSRawFields.find(i=>i.fid===t);if(r)for(let i in n)r[i]=n[i]}updateTempFieldAnalyticType(t,n){const r=this.tmpDSRawFields.find(i=>i.fid===t);r&&(r.analyticType=n)}updateTempFieldSemanticType(t,n){const r=this.tmpDSRawFields.find(i=>i.fid===t);r&&(r.semanticType=n)}updateTempName(t){this.tmpDSName=t}updateTempDS(t){const n=Oxe(t);this.tmpDataSource=n.dataSource,this.tmpDSRawFields=n.fields}updateTempSTDDS(t){this.tmpDataSource=t.dataSource,this.tmpDSRawFields=t.rawFields,this.tmpDSName=t.name}commitTempDS(){const{tmpDSName:t,tmpDSRawFields:n,tmpDataSource:r}=this;this.dataStore.addDataSource({data:r,fields:n,name:t}),this.setShowDSPanel(!1),this.initTempDS()}startDSBuildingTask(){this.initTempDS(),this.showDSPanel=!0}}function ij(e){const t={};return(n,...r)=>n?(t[n]||(t[n]=e(...r)),t[n]):e(...r)}const uwe=ij(()=>new lwe),cwe=ij((e,t)=>new N0(e,t)),oj=m.createContext(null),S9=m.createContext(null),aj=()=>{},dwe=e=>{const t=e.keepAlive?`${e.keepAlive}`:"",n=m.useMemo(()=>uwe(t),[t]);return m.useEffect(()=>{if(e.storeRef){const r=e.storeRef;return r.current=n,()=>{r.current=null}}return aj},[e.storeRef,n]),m.createElement(oj.Provider,{value:n},e.children)};function Dh(){return m.useContext(oj)}const sj=e=>{const t=e.keepAlive?`${e.keepAlive}`:"",n=m.useMemo(()=>cwe(t,e.meta,{onMetaChange:e.onMetaChange}),[t]),r=m.useRef(e.meta);return m.useEffect(()=>{r.current!==e.meta&&(n.setMeta(e.meta),r.current=e.meta)},[e.meta,n]),m.useEffect(()=>{if(e.storeRef){const i=e.storeRef;return i.current=n,()=>{i.current=null}}return aj},[e.storeRef,n]),m.createElement(S9.Provider,{value:n},e.children)};function Ot(){return m.useContext(S9)}const O0=m.createContext(async()=>[]);function Ll(){return m.useContext(O0)}function lj(e,t){return(...n)=>Promise.race([e(...n),new Promise((r,i)=>{setTimeout(()=>i(new Error("timeout")),t)})])}function uj(e,t){return(...n)=>e(...n).catch(r=>{throw t(r),r})}function fwe(){return window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function _a(e="media"){const[t,n]=m.useState(e==="media"?fwe():e);return m.useEffect(()=>{var r;if(e==="media"){const i=(r=window.matchMedia)==null?void 0:r.call(window,"(prefers-color-scheme: dark)"),o=a=>{n(a.matches?"dark":"light")};return i==null||i.addEventListener("change",o),()=>{i==null||i.removeEventListener("change",o)}}else n(e)},[e]),t}const h2=(e,t,n=["Enter"],r=!0)=>{const i=m.useRef(e);i.current=()=>{t||e()};const o=m.useRef(n);return o.current=n,m.useMemo(()=>({onClick:a=>{r||a.stopPropagation(),i.current()},onKeyDown:a=>{r||a.stopPropagation(),o.current.includes(a.key)&&(a.stopPropagation(),a.preventDefault(),i.current())},onMouseOut:a=>{var s;r||a.stopPropagation(),(s=document.querySelector("*:focus"))==null||s.blur()}}),[r])},Z9=Je.div`
|
|
232
232
|
--height: 36px;
|
|
233
233
|
--icon-size: 18px;
|
|
234
234
|
width: 100%;
|