milkio 1.0.0-alpha.102 → 1.0.0-alpha.104

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js ADDED
@@ -0,0 +1,31 @@
1
+ function GT(n){return{type:()=>({$milkioType:"type-safety",value:n})}}var N={rules:{stringify:[{match:(n)=>typeof n=="bigint",handler:(n)=>`t!bigint:${n.toString()}`},{match:(n)=>n instanceof Date,handler:(n)=>`t!Date:${n.toISOString()}`},{match:(n)=>n instanceof URL,handler:(n)=>`t!URL:${n.toString()}`},{match:(n)=>n instanceof RegExp,handler:(n)=>`t!RegExp:${n.toString()}`},{match:(n)=>n instanceof Uint8Array,handler:(n)=>`t!Uint8Array:${new TextDecoder().decode(n)}`},{match:(n)=>n instanceof ArrayBuffer,handler:(n)=>`t!ArrayBuffer:${new TextDecoder().decode(n)}`}],parse:[{match:(n)=>n.startsWith("t!bigint:"),handler:(n)=>BigInt(n.slice(9))},{match:(n)=>n.startsWith("t!Date:"),handler:(n)=>new Date(n.slice(7))},{match:(n)=>n.startsWith("t!URL:"),handler:(n)=>new URL(n.slice(6))},{match:(n)=>n.startsWith("t!RegExp:"),handler:(n)=>new RegExp(n.slice(9))},{match:(n)=>n.startsWith("t!Uint8Array:"),handler:(n)=>new TextEncoder().encode(n.slice(13))},{match:(n)=>n.startsWith("t!ArrayBuffer:"),handler:(n)=>new TextEncoder().encode(n.slice(14)).buffer}]},stringify(n){return JSON.stringify(N.encode(n))},parse(n){return N.decode(JSON.parse(n))},encode(n){function T(R){if(!R||typeof R!="object"&&typeof R!="bigint")return R;if(R){if(Array.isArray(R)){let y=[];for(let w=0;w<R.length;w++)y[w]=T(R[w]);return y}}else return R;for(let y of N.rules.stringify)if(y.match(R))return y.handler(R);let x={};for(var $ in R)x[$]=T(R[$]);return x}return T(n)},decode(n){function T(R){if(Array.isArray(R))return R.map(T);if(typeof R=="object"&&R!==null){let x={};for(let $ in R)R.hasOwnProperty($)&&(x[$]=T(R[$]));return x}else if(typeof R=="string"){for(let x of N.rules.parse)if(x.match(R)===!0)return x.handler(R);return R}return R}return T(n)}};function hT(n){return n}function qT(n,T){if(n===void 0)return T;return`${n}`}function mT(n,T){if(n===void 0)return T;return Number.parseInt(n,10)}function JT(n,T){if(n==="true")return!0;if(n==="false")return!1;if(n==="")return!1;if(n===void 0)return T;return Boolean(n)}function e(n){let T={};for(let[R,x]of n.entries())T[R]=x;return T}function a(n,T){let R=async($,y)=>{let w=y.createdExecuteId,A;if(!(y.headers instanceof Headers))A=new Headers({...y.headers});else A=y.headers;if(!("toJSON"in A))A.toJSON=()=>e(A);let I=[],H=(P)=>I.unshift(P),M;if(y.paramsType==="raw"){if(M=y.params,typeof M==="undefined")M={}}else if(y.params==="")M={};else{try{M=N.parse(y.params)}catch(P){throw c("PARAMS_TYPE_NOT_SUPPORTED",{expected:"json"})}if(typeof M==="undefined")M={}}if(typeof M!=="object"||Array.isArray(M))throw c("PARAMS_TYPE_NOT_SUPPORTED",{expected:"json"});if("$milkioGenerateParams"in M&&M.$milkioGenerateParams==="enable"){if(!T.develop)throw c("NOT_DEVELOP_MODE","This feature must be in cookbook to use.");delete M.$milkioGenerateParams;let P=$.randomParams();if(P===void 0||P===null)P={};M={...P,...M}}if(y.mixinContext?.http?.params?.string)y.mixinContext.http.params.parsed=M;let C={...y.mixinContext?y.mixinContext:{},develop:T.develop,path:y.path,logger:y.createdLogger,emit:T.emit,executeId:y.createdExecuteId,config:T.runtime.config,call:(P,J)=>x(C,P,J),onFinally:H,_:T},E={value:void 0},Q=$.module,g=Q.default?.meta?Q.default?.meta:{};if(g.typeSafety===void 0||g.typeSafety===!0){let P=$.validateParams(M);if(!P.success)throw c("PARAMS_TYPE_INCORRECT",{...P.errors[0],message:`The value '${P.errors[0].path}' is '${P.errors[0].value}', which does not meet '${P.errors[0].expected}' requirements.`})}await T.emit("milkio:executeBefore",{executeId:y.createdExecuteId,logger:y.createdLogger,path:y.path,meta:g,context:C}),E.value=await Q.default.handler(C,M);let B=!1;if(E?.value?.$milkioType==="type-safety"){B=!0;let P=$.validateResults(E.value.value);if(!P.success)throw c("RESULTS_TYPE_INCORRECT",{...P.errors[0],message:`The value '${P.errors[0].path}' is '${P.errors[0].value}', which does not meet '${P.errors[0].expected}' requirements.`});E.value=E.value.value}let K=!1;if(E.value===void 0||E.value===null||E.value==="")K=!0,E.value={};else if(Array.isArray(E.value))throw c("FAIL","The return type of the handler must be an object, which is currently an array.");else if(typeof E.value!=="object")throw c("FAIL","The return type of the handler must be an object, which is currently a primitive type.");return await T.emit("milkio:executeAfter",{executeId:y.createdExecuteId,logger:y.createdLogger,path:y.path,meta:g,context:C,results:E}),{executeId:w,headers:A,params:M,results:E,context:C,meta:g,type:Q.$milkioType,emptyResult:K,resultsTypeSafety:B,finales:I}},x=async($,y,w)=>{return await(await y).default.handler($,w)};return{__call:x,__execute:R}}function FT(n){return n}function nn(){let n=new Map,T=new Map;return{on:(x,$)=>{if(n.set($,x),T.has(x)===!1)T.set(x,new Set);let y=T.get(x);return y.add($),n.set($,x),()=>{n.delete($),y.delete($)}},off:(x,$)=>{let y=T.get(x);if(!y)return;n.delete($),y.delete($)},emit:async(x,$)=>{let y=T.get(x);if(y)for(let w of y)await w($)}}}function rT(){let n="pending",T=[];return{emit:(x)=>{if(T.at(-1)?.blank===!0){let $=T.at(-1);$.blank=!1,$.resolve(x);return}else{let $=Promise.withResolvers();$.resolve(x),T.push({...$,blank:!1})}},...{async next(){if(n!=="pending")return{done:!0,value:null};if(T.length===0){let y=Promise.withResolvers();T.push({...y,blank:!0})}let $=await T.at(0).promise;return T.shift(),{done:n!=="pending",value:$}},async return(){n="resolved";for(let x of T)x.blank=!1,x.resolve(void 0);return{done:!0,value:null}},async throw(x){if(n="rejected",T.length===0){let $=Promise.withResolvers();T.push({...$,blank:!0})}for(let $ of T)$.blank=!1,$.reject(x);return{done:!0,value:null}}},[Symbol.asyncIterator](){return this}}}function iT(n){return n}import Rn from"crypto";var Tn="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var jn=128,p,_,Fn=(n)=>{if(!p||p.length<n)p=Buffer.allocUnsafe(n*jn),Rn.randomFillSync(p),_=0;else if(_+n>p.length)Rn.randomFillSync(p),_=0;_+=n};var xn=(n=21)=>{Fn(n-=0);let T="";for(let R=_-n;R<_;R++)T+=Tn[p[R]&63];return T};var b=()=>xn();function $n(){return b}async function aT(n,T,R){let x=R.executeId??$n(),$=await T.get(),y={request:new Map,config:$},w=nn(),A={...R,executeId:x,runtime:y,on:w.on,off:w.off,emit:w.emit},I=a(n,A),H=yn(n,A),M=wn(n,A,I),C={_:A,on:w.on,off:w.off,emit:w.emit,commander:H,listener:M,config:$};if(y.app=C,Array.isArray(R.bootstraps))for(let E of R.bootstraps)await E(C);return await Promise.all(n.handlerSchema.loadHandlers(C)),C}function TR(n){let T=n;return T.$milkioType="command",T}function yn(n,T){return async(x,$)=>{let y={path:"index",commands:[],options:{}};for(let w of x.slice(3))if(w.startsWith("--")&&w.includes("=")){let A=w.split("=");y.options[A[0].slice(2)]=A.slice(1,A.length).join("=")}else if(w.startsWith("--"))y.options[w.slice(2)]="1";else if(w.startsWith("-")&&w.includes("=")){let A=w.split("=");y.options[A[0].slice(1)]=A.slice(1,A.length).join("=")}else if(w.startsWith("-"))y.options[w.slice(1)]="1";else y.commands.push(w);if(x.length===2)y.path="index";else y.path=`${x[2]??"index"}`;if(!(y.path in n.commandSchema.commands)){if($?.onNotFound)return await $.onNotFound();console.log(`\x1B[44m UwU \x1B[0m \x1B[2mCommand not found:\x1B[0m \x1B[32m${y.path}\x1B[0m`);return}return await n.commandSchema.commands[y.path].module.handler(y.commands,y.options)}}function xR(n){let T=n;if(T.$milkioType="action",T.meta===void 0)T.meta={};return T}function yR(n){let T=n;if(T.$milkioType="stream",T.meta===void 0)T.meta={};return T}var Yn=Math.pow(10,8)*24*60*60*1000,AR=-Yn,D=604800000,An=86400000;var s=Symbol.for("constructDateFrom");function X(n,T){if(typeof n==="function")return n(T);if(n&&typeof n==="object"&&s in n)return n[s](T);if(n instanceof Date)return new n.constructor(T);return new Date(T)}function U(n,T){return X(T||n,n)}var bn={};function m(){return bn}function h(n,T){let R=m(),x=T?.weekStartsOn??T?.locale?.options?.weekStartsOn??R.weekStartsOn??R.locale?.options?.weekStartsOn??0,$=U(n,T?.in),y=$.getDay(),w=(y<x?7:0)+y-x;return $.setDate($.getDate()-w),$.setHours(0,0,0,0),$}function V(n,T){return h(n,{...T,weekStartsOn:1})}function i(n,T){let R=U(n,T?.in),x=R.getFullYear(),$=X(R,0);$.setFullYear(x+1,0,4),$.setHours(0,0,0,0);let y=V($),w=X(R,0);w.setFullYear(x,0,4),w.setHours(0,0,0,0);let A=V(w);if(R.getTime()>=y.getTime())return x+1;else if(R.getTime()>=A.getTime())return x;else return x-1}function O(n){let T=U(n),R=new Date(Date.UTC(T.getFullYear(),T.getMonth(),T.getDate(),T.getHours(),T.getMinutes(),T.getSeconds(),T.getMilliseconds()));return R.setUTCFullYear(T.getFullYear()),+n-+R}function Mn(n,...T){let R=X.bind(null,n||T.find((x)=>typeof x==="object"));return T.map(R)}function z(n,T){let R=U(n,T?.in);return R.setHours(0,0,0,0),R}function Cn(n,T,R){let[x,$]=Mn(R?.in,n,T),y=z(x),w=z($),A=+y-O(y),I=+w-O(w);return Math.round((A-I)/An)}function In(n,T){let R=i(n,T),x=X(T?.in||n,0);return x.setFullYear(R,0,4),x.setHours(0,0,0,0),V(x)}function gn(n){return n instanceof Date||typeof n==="object"&&Object.prototype.toString.call(n)==="[object Date]"}function En(n){return!(!gn(n)&&typeof n!=="number"||isNaN(+U(n)))}function vn(n,T){let R=U(n,T?.in);return R.setFullYear(R.getFullYear(),0,1),R.setHours(0,0,0,0),R}var rn={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},Pn=(n,T,R)=>{let x,$=rn[n];if(typeof $==="string")x=$;else if(T===1)x=$.one;else x=$.other.replace("{{count}}",T.toString());if(R?.addSuffix)if(R.comparison&&R.comparison>0)return"in "+x;else return x+" ago";return x};function W(n){return(T={})=>{let R=T.width?String(T.width):n.defaultWidth;return n.formats[R]||n.formats[n.defaultWidth]}}var Dn={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Wn={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},kn={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Bn={date:W({formats:Dn,defaultWidth:"full"}),time:W({formats:Wn,defaultWidth:"full"}),dateTime:W({formats:kn,defaultWidth:"full"})};var un={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Hn=(n,T,R,x)=>un[n];function Z(n){return(T,R)=>{let x=R?.context?String(R.context):"standalone",$;if(x==="formatting"&&n.formattingValues){let w=n.defaultFormattingWidth||n.defaultWidth,A=R?.width?String(R.width):w;$=n.formattingValues[A]||n.formattingValues[w]}else{let w=n.defaultWidth,A=R?.width?String(R.width):n.defaultWidth;$=n.values[A]||n.values[w]}let y=n.argumentCallback?n.argumentCallback(T):T;return $[y]}}var sn={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},On={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},zn={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},tn={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},on={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},dn={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},ln=(n,T)=>{let R=Number(n),x=R%100;if(x>20||x<10)switch(x%10){case 1:return R+"st";case 2:return R+"nd";case 3:return R+"rd"}return R+"th"},Un={ordinalNumber:ln,era:Z({values:sn,defaultWidth:"wide"}),quarter:Z({values:On,defaultWidth:"wide",argumentCallback:(n)=>n-1}),month:Z({values:zn,defaultWidth:"wide"}),day:Z({values:tn,defaultWidth:"wide"}),dayPeriod:Z({values:on,defaultWidth:"wide",formattingValues:dn,defaultFormattingWidth:"wide"})};function j(n){return(T,R={})=>{let x=R.width,$=x&&n.matchPatterns[x]||n.matchPatterns[n.defaultMatchWidth],y=T.match($);if(!y)return null;let w=y[0],A=x&&n.parsePatterns[x]||n.parsePatterns[n.defaultParseWidth],I=Array.isArray(A)?an(A,(C)=>C.test(w)):en(A,(C)=>C.test(w)),H;H=n.valueCallback?n.valueCallback(I):I,H=R.valueCallback?R.valueCallback(H):H;let M=T.slice(w.length);return{value:H,rest:M}}}function en(n,T){for(let R in n)if(Object.prototype.hasOwnProperty.call(n,R)&&T(n[R]))return R;return}function an(n,T){for(let R=0;R<n.length;R++)if(T(n[R]))return R;return}function Kn(n){return(T,R={})=>{let x=T.match(n.matchPattern);if(!x)return null;let $=x[0],y=T.match(n.parsePattern);if(!y)return null;let w=n.valueCallback?n.valueCallback(y[0]):y[0];w=R.valueCallback?R.valueCallback(w):w;let A=T.slice($.length);return{value:w,rest:A}}}var nT=/^(\d+)(th|st|nd|rd)?/i,TT=/\d+/i,RT={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},xT={any:[/^b/i,/^(a|c)/i]},$T={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},yT={any:[/1/i,/2/i,/3/i,/4/i]},wT={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},AT={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},MT={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},CT={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},IT={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},gT={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},Nn={ordinalNumber:Kn({matchPattern:nT,parsePattern:TT,valueCallback:(n)=>parseInt(n,10)}),era:j({matchPatterns:RT,defaultMatchWidth:"wide",parsePatterns:xT,defaultParseWidth:"any"}),quarter:j({matchPatterns:$T,defaultMatchWidth:"wide",parsePatterns:yT,defaultParseWidth:"any",valueCallback:(n)=>n+1}),month:j({matchPatterns:wT,defaultMatchWidth:"wide",parsePatterns:AT,defaultParseWidth:"any"}),day:j({matchPatterns:MT,defaultMatchWidth:"wide",parsePatterns:CT,defaultParseWidth:"any"}),dayPeriod:j({matchPatterns:IT,defaultMatchWidth:"any",parsePatterns:gT,defaultParseWidth:"any"})};var t={code:"en-US",formatDistance:Pn,formatLong:Bn,formatRelative:Hn,localize:Un,match:Nn,options:{weekStartsOn:0,firstWeekContainsDate:1}};function Ln(n,T){let R=U(n,T?.in);return Cn(R,vn(R))+1}function cn(n,T){let R=U(n,T?.in),x=+V(R)-+In(R);return Math.round(x/D)+1}function k(n,T){let R=U(n,T?.in),x=R.getFullYear(),$=m(),y=T?.firstWeekContainsDate??T?.locale?.options?.firstWeekContainsDate??$.firstWeekContainsDate??$.locale?.options?.firstWeekContainsDate??1,w=X(T?.in||n,0);w.setFullYear(x+1,0,y),w.setHours(0,0,0,0);let A=h(w,T),I=X(T?.in||n,0);I.setFullYear(x,0,y),I.setHours(0,0,0,0);let H=h(I,T);if(+R>=+A)return x+1;else if(+R>=+H)return x;else return x-1}function Xn(n,T){let R=m(),x=T?.firstWeekContainsDate??T?.locale?.options?.firstWeekContainsDate??R.firstWeekContainsDate??R.locale?.options?.firstWeekContainsDate??1,$=k(n,T),y=X(T?.in||n,0);return y.setFullYear($,0,x),y.setHours(0,0,0,0),h(y,T)}function Gn(n,T){let R=U(n,T?.in),x=+h(R,T)-+Xn(R,T);return Math.round(x/D)+1}function v(n,T){let R=n<0?"-":"",x=Math.abs(n).toString().padStart(T,"0");return R+x}var q={y(n,T){let R=n.getFullYear(),x=R>0?R:1-R;return v(T==="yy"?x%100:x,T.length)},M(n,T){let R=n.getMonth();return T==="M"?String(R+1):v(R+1,2)},d(n,T){return v(n.getDate(),T.length)},a(n,T){let R=n.getHours()/12>=1?"pm":"am";switch(T){case"a":case"aa":return R.toUpperCase();case"aaa":return R;case"aaaaa":return R[0];case"aaaa":default:return R==="am"?"a.m.":"p.m."}},h(n,T){return v(n.getHours()%12||12,T.length)},H(n,T){return v(n.getHours(),T.length)},m(n,T){return v(n.getMinutes(),T.length)},s(n,T){return v(n.getSeconds(),T.length)},S(n,T){let R=T.length,x=n.getMilliseconds(),$=Math.trunc(x*Math.pow(10,R-3));return v($,T.length)}};var F={am:"am",pm:"pm",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},o={G:function(n,T,R){let x=n.getFullYear()>0?1:0;switch(T){case"G":case"GG":case"GGG":return R.era(x,{width:"abbreviated"});case"GGGGG":return R.era(x,{width:"narrow"});case"GGGG":default:return R.era(x,{width:"wide"})}},y:function(n,T,R){if(T==="yo"){let x=n.getFullYear(),$=x>0?x:1-x;return R.ordinalNumber($,{unit:"year"})}return q.y(n,T)},Y:function(n,T,R,x){let $=k(n,x),y=$>0?$:1-$;if(T==="YY"){let w=y%100;return v(w,2)}if(T==="Yo")return R.ordinalNumber(y,{unit:"year"});return v(y,T.length)},R:function(n,T){let R=i(n);return v(R,T.length)},u:function(n,T){let R=n.getFullYear();return v(R,T.length)},Q:function(n,T,R){let x=Math.ceil((n.getMonth()+1)/3);switch(T){case"Q":return String(x);case"QQ":return v(x,2);case"Qo":return R.ordinalNumber(x,{unit:"quarter"});case"QQQ":return R.quarter(x,{width:"abbreviated",context:"formatting"});case"QQQQQ":return R.quarter(x,{width:"narrow",context:"formatting"});case"QQQQ":default:return R.quarter(x,{width:"wide",context:"formatting"})}},q:function(n,T,R){let x=Math.ceil((n.getMonth()+1)/3);switch(T){case"q":return String(x);case"qq":return v(x,2);case"qo":return R.ordinalNumber(x,{unit:"quarter"});case"qqq":return R.quarter(x,{width:"abbreviated",context:"standalone"});case"qqqqq":return R.quarter(x,{width:"narrow",context:"standalone"});case"qqqq":default:return R.quarter(x,{width:"wide",context:"standalone"})}},M:function(n,T,R){let x=n.getMonth();switch(T){case"M":case"MM":return q.M(n,T);case"Mo":return R.ordinalNumber(x+1,{unit:"month"});case"MMM":return R.month(x,{width:"abbreviated",context:"formatting"});case"MMMMM":return R.month(x,{width:"narrow",context:"formatting"});case"MMMM":default:return R.month(x,{width:"wide",context:"formatting"})}},L:function(n,T,R){let x=n.getMonth();switch(T){case"L":return String(x+1);case"LL":return v(x+1,2);case"Lo":return R.ordinalNumber(x+1,{unit:"month"});case"LLL":return R.month(x,{width:"abbreviated",context:"standalone"});case"LLLLL":return R.month(x,{width:"narrow",context:"standalone"});case"LLLL":default:return R.month(x,{width:"wide",context:"standalone"})}},w:function(n,T,R,x){let $=Gn(n,x);if(T==="wo")return R.ordinalNumber($,{unit:"week"});return v($,T.length)},I:function(n,T,R){let x=cn(n);if(T==="Io")return R.ordinalNumber(x,{unit:"week"});return v(x,T.length)},d:function(n,T,R){if(T==="do")return R.ordinalNumber(n.getDate(),{unit:"date"});return q.d(n,T)},D:function(n,T,R){let x=Ln(n);if(T==="Do")return R.ordinalNumber(x,{unit:"dayOfYear"});return v(x,T.length)},E:function(n,T,R){let x=n.getDay();switch(T){case"E":case"EE":case"EEE":return R.day(x,{width:"abbreviated",context:"formatting"});case"EEEEE":return R.day(x,{width:"narrow",context:"formatting"});case"EEEEEE":return R.day(x,{width:"short",context:"formatting"});case"EEEE":default:return R.day(x,{width:"wide",context:"formatting"})}},e:function(n,T,R,x){let $=n.getDay(),y=($-x.weekStartsOn+8)%7||7;switch(T){case"e":return String(y);case"ee":return v(y,2);case"eo":return R.ordinalNumber(y,{unit:"day"});case"eee":return R.day($,{width:"abbreviated",context:"formatting"});case"eeeee":return R.day($,{width:"narrow",context:"formatting"});case"eeeeee":return R.day($,{width:"short",context:"formatting"});case"eeee":default:return R.day($,{width:"wide",context:"formatting"})}},c:function(n,T,R,x){let $=n.getDay(),y=($-x.weekStartsOn+8)%7||7;switch(T){case"c":return String(y);case"cc":return v(y,T.length);case"co":return R.ordinalNumber(y,{unit:"day"});case"ccc":return R.day($,{width:"abbreviated",context:"standalone"});case"ccccc":return R.day($,{width:"narrow",context:"standalone"});case"cccccc":return R.day($,{width:"short",context:"standalone"});case"cccc":default:return R.day($,{width:"wide",context:"standalone"})}},i:function(n,T,R){let x=n.getDay(),$=x===0?7:x;switch(T){case"i":return String($);case"ii":return v($,T.length);case"io":return R.ordinalNumber($,{unit:"day"});case"iii":return R.day(x,{width:"abbreviated",context:"formatting"});case"iiiii":return R.day(x,{width:"narrow",context:"formatting"});case"iiiiii":return R.day(x,{width:"short",context:"formatting"});case"iiii":default:return R.day(x,{width:"wide",context:"formatting"})}},a:function(n,T,R){let $=n.getHours()/12>=1?"pm":"am";switch(T){case"a":case"aa":return R.dayPeriod($,{width:"abbreviated",context:"formatting"});case"aaa":return R.dayPeriod($,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return R.dayPeriod($,{width:"narrow",context:"formatting"});case"aaaa":default:return R.dayPeriod($,{width:"wide",context:"formatting"})}},b:function(n,T,R){let x=n.getHours(),$;if(x===12)$=F.noon;else if(x===0)$=F.midnight;else $=x/12>=1?"pm":"am";switch(T){case"b":case"bb":return R.dayPeriod($,{width:"abbreviated",context:"formatting"});case"bbb":return R.dayPeriod($,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return R.dayPeriod($,{width:"narrow",context:"formatting"});case"bbbb":default:return R.dayPeriod($,{width:"wide",context:"formatting"})}},B:function(n,T,R){let x=n.getHours(),$;if(x>=17)$=F.evening;else if(x>=12)$=F.afternoon;else if(x>=4)$=F.morning;else $=F.night;switch(T){case"B":case"BB":case"BBB":return R.dayPeriod($,{width:"abbreviated",context:"formatting"});case"BBBBB":return R.dayPeriod($,{width:"narrow",context:"formatting"});case"BBBB":default:return R.dayPeriod($,{width:"wide",context:"formatting"})}},h:function(n,T,R){if(T==="ho"){let x=n.getHours()%12;if(x===0)x=12;return R.ordinalNumber(x,{unit:"hour"})}return q.h(n,T)},H:function(n,T,R){if(T==="Ho")return R.ordinalNumber(n.getHours(),{unit:"hour"});return q.H(n,T)},K:function(n,T,R){let x=n.getHours()%12;if(T==="Ko")return R.ordinalNumber(x,{unit:"hour"});return v(x,T.length)},k:function(n,T,R){let x=n.getHours();if(x===0)x=24;if(T==="ko")return R.ordinalNumber(x,{unit:"hour"});return v(x,T.length)},m:function(n,T,R){if(T==="mo")return R.ordinalNumber(n.getMinutes(),{unit:"minute"});return q.m(n,T)},s:function(n,T,R){if(T==="so")return R.ordinalNumber(n.getSeconds(),{unit:"second"});return q.s(n,T)},S:function(n,T){return q.S(n,T)},X:function(n,T,R){let x=n.getTimezoneOffset();if(x===0)return"Z";switch(T){case"X":return Sn(x);case"XXXX":case"XX":return f(x);case"XXXXX":case"XXX":default:return f(x,":")}},x:function(n,T,R){let x=n.getTimezoneOffset();switch(T){case"x":return Sn(x);case"xxxx":case"xx":return f(x);case"xxxxx":case"xxx":default:return f(x,":")}},O:function(n,T,R){let x=n.getTimezoneOffset();switch(T){case"O":case"OO":case"OOO":return"GMT"+Qn(x,":");case"OOOO":default:return"GMT"+f(x,":")}},z:function(n,T,R){let x=n.getTimezoneOffset();switch(T){case"z":case"zz":case"zzz":return"GMT"+Qn(x,":");case"zzzz":default:return"GMT"+f(x,":")}},t:function(n,T,R){let x=Math.trunc(+n/1000);return v(x,T.length)},T:function(n,T,R){return v(+n,T.length)}};function Qn(n,T=""){let R=n>0?"-":"+",x=Math.abs(n),$=Math.trunc(x/60),y=x%60;if(y===0)return R+String($);return R+String($)+T+v(y,2)}function Sn(n,T){if(n%60===0)return(n>0?"-":"+")+v(Math.abs(n)/60,2);return f(n,T)}function f(n,T=""){let R=n>0?"-":"+",x=Math.abs(n),$=v(Math.trunc(x/60),2),y=v(x%60,2);return R+$+T+y}var hn=(n,T)=>{switch(n){case"P":return T.date({width:"short"});case"PP":return T.date({width:"medium"});case"PPP":return T.date({width:"long"});case"PPPP":default:return T.date({width:"full"})}},qn=(n,T)=>{switch(n){case"p":return T.time({width:"short"});case"pp":return T.time({width:"medium"});case"ppp":return T.time({width:"long"});case"pppp":default:return T.time({width:"full"})}},ET=(n,T)=>{let R=n.match(/(P+)(p+)?/)||[],x=R[1],$=R[2];if(!$)return hn(n,T);let y;switch(x){case"P":y=T.dateTime({width:"short"});break;case"PP":y=T.dateTime({width:"medium"});break;case"PPP":y=T.dateTime({width:"long"});break;case"PPPP":default:y=T.dateTime({width:"full"});break}return y.replace("{{date}}",hn(x,T)).replace("{{time}}",qn($,T))},mn={p:qn,P:ET};var vT=/^D+$/,PT=/^Y+$/,BT=["D","DD","YY","YYYY"];function Jn(n){return vT.test(n)}function pn(n){return PT.test(n)}function Vn(n,T,R){let x=HT(n,T,R);if(console.warn(x),BT.includes(n))throw new RangeError(x)}function HT(n,T,R){let x=n[0]==="Y"?"years":"days of the month";return`Use \`${n.toLowerCase()}\` instead of \`${n}\` (in \`${T}\`) for formatting ${x} to the input \`${R}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}var UT=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,KT=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,NT=/^'([^]*?)'?$/,LT=/''/g,cT=/[a-zA-Z]/;function fn(n,T,R){let x=m(),$=R?.locale??x.locale??t,y=R?.firstWeekContainsDate??R?.locale?.options?.firstWeekContainsDate??x.firstWeekContainsDate??x.locale?.options?.firstWeekContainsDate??1,w=R?.weekStartsOn??R?.locale?.options?.weekStartsOn??x.weekStartsOn??x.locale?.options?.weekStartsOn??0,A=U(n,R?.in);if(!En(A))throw new RangeError("Invalid time value");let I=T.match(KT).map((M)=>{let C=M[0];if(C==="p"||C==="P"){let E=mn[C];return E(M,$.formatLong)}return M}).join("").match(UT).map((M)=>{if(M==="''")return{isToken:!1,value:"'"};let C=M[0];if(C==="'")return{isToken:!1,value:XT(M)};if(o[C])return{isToken:!0,value:M};if(C.match(cT))throw new RangeError("Format string contains an unescaped latin alphabet character `"+C+"`");return{isToken:!1,value:M}});if($.localize.preprocessor)I=$.localize.preprocessor(A,I);let H={firstWeekContainsDate:y,weekStartsOn:w,locale:$};return I.map((M)=>{if(!M.isToken)return M.value;let C=M.value;if(!R?.useAdditionalWeekYearTokens&&pn(C)||!R?.useAdditionalDayOfYearTokens&&Jn(C))Vn(C,T,String(n));let E=o[C[0]];return E(A,C,$.localize,H)}).join("")}function XT(n){let T=n.match(NT);if(!T)return n;return T[1].replace(LT,"'")}async function _n(n,T){try{let R=await fetch(`http://localhost:${n.cookbook.cookbookPort}/$action`,{method:"POST",headers:{"Content-Type":"application/json"},body:N.stringify(T)});if(!R.ok)console.log("[COOKBOOK]",await R.text()),console.log("[COOKBOOK]","Is Cookbook closed? There is an abnormality in the communication with Cookbook.")}catch(R){console.log("[COOKBOOK]",R),console.log("[COOKBOOK]","Is Cookbook closed? There is an abnormality in the communication with Cookbook.")}}function Zn(n,T,R){let x={};x._={logs:[],tags:new Map,submit:(A)=>{if(!n.onLoggerSubmitting)return;return n.onLoggerSubmitting(A,x._.logs,x._.tags)}};let $=(A,I)=>{x._.tags.set(A,I)},y=(A)=>{if(!(n.onLoggerInserting?n.onLoggerInserting:(H)=>{return H=[...H],H[0]=`
2
+ ${H[0]}`,console.log(...H),!0})(A))return A;if(x._.logs.push([...A]),n.develop)_n(n,{type:"milkio@logger",log:A});return A};x.setTag=(A,I)=>$(A,I),x.setLog=(...A)=>y(A);let w=()=>`${fn(new Date,"(yyyy-MM-dd hh:mm:ss)")}`;return x.debug=(A,...I)=>y(["[DEBUG]",T,R,w(),`
3
+ ${A}`,...I]),x.info=(A,...I)=>y(["[INFO]",T,R,w(),`
4
+ ${A}`,...I]),x.warn=(A,...I)=>y(["[WARN]",T,R,w(),`
5
+ ${A}`,...I]),x.error=(A,...I)=>y(["[ERROR]",T,R,w(),`
6
+ ${A}`,...I]),x.request=(A,...I)=>y(["[REQUEST]",T,R,w(),`
7
+ ${A}`,...I]),x.response=(A,...I)=>y(["[RESPONSE]",T,R,w(),`
8
+ ${A}`,...I]),x}function A$(){let n={$milkioType:"step",_steps:[],step(T){return n._steps.push(T),n},async run(){let T={};for(let x of n._steps)T={...T,...await x(T)};let R={};for(let x in T){let $=T[x];if(!x.startsWith("_"))R[x]=$}return R}};return n}class l{root;constructor(){this.root=new d}add(n,T){let R=n.replace(/^\/+|\/+$/g,"").split("/").filter(($)=>$!==""),x=this.root;if(R.length===0){x.value=T;return}for(let $ of R){if(!x.children.has($))x.children.set($,new d);x=x.children.get($)}x.value=T}get(n){let T=n.replace(/^\/+|\/+$/g,"").split("/").filter((x)=>x!==""),R=this.root;for(let x of T){if(!R.children.has(x))return null;R=R.children.get(x)}return R.value}has(n){let T=n.replace(/^\/+|\/+$/g,"").split("/").filter((x)=>x!==""),R=this.root;if(T.length===0)return R.value!==null;for(let x of T)if(!R.children.has(x))return!1;else R=R.children.get(x);return R.value!==null}}class d{children;value;constructor(){this.children=new Map,this.value=null}}function wn(n,T,R){let x=T.port,$=new l;return{port:x,fetch:async(w)=>{if(w.request.method==="OPTIONS")return new Response(void 0,{headers:{"Access-Control-Allow-Methods":T.cors?.corsAllowMethods??"*","Access-Control-Allow-Origin":T.cors?.corsAllowOrigin??"*","Access-Control-Allow-Headers":T.cors?.corsAllowHeaders??"*"}});if(w.request.url.endsWith("/generate_204"))return new Response(null,{status:204,headers:{"Access-Control-Allow-Methods":T.cors?.corsAllowMethods??"*","Access-Control-Allow-Origin":T.cors?.corsAllowOrigin??"*","Access-Control-Allow-Headers":T.cors?.corsAllowHeaders??"*","Cache-Control":"no-store","Content-Type":`text/plain; time=${Date.now()}`}});let A=new URL(w.request.url),I=A.pathname.substring(1).split("/");if(T.ignorePathLevel!==void 0&&T.ignorePathLevel!==0)I=I.slice(T.ignorePathLevel);let H=`/${I.join("/")}`,M=T?.executeId?await T.executeId(w.request):b();console.log("executeId",await T.executeId(w.request),b());let C=Zn(T,H,M);T.runtime.request.set(M,{logger:C});let E={body:"",status:200,headers:{"Access-Control-Allow-Methods":T.cors?.corsAllowMethods??"*","Access-Control-Allow-Origin":T.cors?.corsAllowOrigin??"*","Access-Control-Allow-Headers":T.cors?.corsAllowHeaders??"*","Cache-Control":"no-store","Content-Type":"application/json"}},Q=[];try{let g=await(async()=>{let B=T.realIp?T.realIp(w.request):"::1",K={string:await w.request.text(),parsed:void 0};return{url:A,ip:B,path:{string:H,array:I},params:K,request:w.request,response:E}})();if(await T.emit("milkio:httpRequest",{executeId:M,logger:C,path:g.path.string,http:g}),!T.develop&&g.path.string.startsWith("/_/"))throw await T.emit("milkio:httpNotFound",{executeId:M,logger:C,path:g.path.string,http:g}),c("NOT_FOUND",{path:g.path.string});if(!w.request.headers.get("Accept")?.startsWith("text/event-stream")){let B;if(B=$.get(g.path.string),B===null){if(B=n.routeSchema?.[g.path.string],B===void 0)throw await T.emit("milkio:httpNotFound",{executeId:M,logger:C,path:g.path.string,http:g}),c("NOT_FOUND",{path:g.path.string});B.module=await B.module(),$.add(g.path.string,B)}if(B.type!=="action")throw c("UNACCEPTABLE",{expected:"stream",message:'Not acceptable, the Accept in the request header should be "text/event-stream". If you are using the "@milkio/stargate" package, please add `type: "stream"` to the execute options.'});let K=await R.__execute(B,{createdExecuteId:M,createdLogger:C,path:g.path.string,headers:w.request.headers,mixinContext:{http:g},params:g.params.string,paramsType:"string"});if(Q=K.finales,E.body===""&&K.results.value!==void 0)if(K.emptyResult)E.body=`{"data":{},"executeId":"${M}","success":true}`;else if(K.resultsTypeSafety)E.body=`{"data":${B.resultsToJSON(K.results.value)},"executeId":"${M}","success":true}`;else E.body=`{"data":${N.stringify(K.results.value)},"executeId":"${M}","success":true}`;await T.emit("milkio:httpResponse",{executeId:M,logger:C,path:g.path.string,http:g,context:K.context});for(let P of Q)try{await P()}catch(J){C.error("An error occurred inside onFinally.",J)}return T.runtime.request.delete(M),new Response(E.body,E)}else{let B;if(B=$.get(g.path.string),B===null){if(B=n.routeSchema?.[g.path.string],B===void 0)throw await T.emit("milkio:httpNotFound",{executeId:M,logger:C,path:g.path.string,http:g}),c("NOT_FOUND",{path:g.path.string});B.module=await B.module(),$.add(g.path.string,B)}if(B.type!=="stream")throw c("UNACCEPTABLE",{expected:"stream",message:'Not acceptable, the Accept in the request header should be "application/json". If you are using the "@milkio/stargate" package, please remove `type: "stream"` to the execute options.'});let K=async()=>{T.runtime.request.delete(M);for(let L of Q)try{await L()}catch(G){C.error("An error occurred inside onFinally.",G)}},P=await R.__execute(B,{createdExecuteId:M,createdLogger:C,path:g.path.string,headers:w.request.headers,mixinContext:{http:g},params:g.params.string,paramsType:"string"});Q=P.finales;let J,r;if(typeof Bun!=="undefined")J=new ReadableStream({type:"direct",async pull(L){r=L;try{L.write(`data:@${JSON.stringify({success:!0,data:void 0,executeId:M})}
9
+
10
+ `);for await(let G of P.results.value)if(!w.request.signal.aborted){let S=JSON.stringify([null,N.encode(G)]);L.write(`data:${S}
11
+
12
+ `)}else P.results.value.return(void 0),await K(),L.close()}catch(G){let S=u(M,C,G),Y={};Y[S.code]=S.reject,L.write(`data:${JSON.stringify([N.encode(Y),null])}
13
+
14
+ `)}await new Promise((G)=>setTimeout(G,0)),await K(),L.close()},async cancel(){await K(),r.close()}});else J=new ReadableStream({async pull(L){r=L;try{L.enqueue(`data:@${JSON.stringify({success:!0,data:void 0,executeId:M})}
15
+
16
+ `);for await(let G of P.results.value)if(!w.request.signal.aborted){let S=JSON.stringify([null,N.encode(G)]);L.enqueue(`data:${S}
17
+
18
+ `)}else P.results.value.return(void 0),await K(),L.close()}catch(G){let S=u(M,C,G),Y={};Y[S.code]=S.reject,L.enqueue(`data:${JSON.stringify([N.encode(Y),null])}
19
+
20
+ `)}await K(),await new Promise((G)=>setTimeout(G,0)),L.close()},async cancel(){await K(),r.close()}});return E.body=J,E.headers["Content-Type"]="text/event-stream",E.headers["Cache-Control"]="no-cache",await T.emit("milkio:httpResponse",{executeId:M,logger:C,path:g.path.string,http:g,context:P.context}),new Response(E.body,E)}}catch(g){let B={value:u(M,C,g)};if(B.value!==void 0)E.body=N.stringify(B.value);return T.runtime.request.delete(M),new Response(E.body,E)}}}}function c(n,T){let R={$milkioReject:!0,code:n,data:T};return Error.captureStackTrace(R),R}function u(n,T,R){let x=R?.code??R?.name??R?.constructor?.name??"Unnamed Exception";if(R?.$milkioReject===!0&&R?.code==="NOT_FOUND")T.info(x,R?.data?.path??"Unknown path");else try{let y=R?.$milkioReject?(R?.stack??"").split(`
21
+ `).slice(2).join(`
22
+ `):R?.stack??"";T.error(x,`
23
+ ${N.stringify(R?.data)}`,`
24
+ ${y}
25
+ `)}catch(y){T.error(x,`
26
+ ${R?.toString()}`,`
27
+ ${R?.stack}
28
+ `)}let $;if(R?.$milkioReject===!0)$={success:!1,code:R.code,reject:R.data,executeId:n};else $={success:!1,code:"INTERNAL_SERVER_ERROR",reject:void 0,executeId:n};return $}export{GT as typeSafety,yR as stream,c as reject,iT as handler,u as exceptionHandler,qT as envToString,mT as envToNumber,JT as envToBoolean,aT as createWorld,A$ as createStep,Zn as createLogger,rT as createFlow,hT as config,TR as command,FT as bootstrap,xR as action,wn as __initListener,a as __initExecuter,nn as __initEventManager,yn as __initCommander,N as TSON};
29
+
30
+ //# debugId=3622CBC3BAA2035864756E2164756E21
31
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXHR5cGUtc2FmZXR5XFxpbmRleC50cyIsICIuLlxcbm9kZV9tb2R1bGVzXFxAc291dGhlcm4tYXVyb3JhXFx0c29uXFxkaXN0XFx0c29uLmpzIiwgIi4uXFxjb25maWdcXGluZGV4LnRzIiwgIi4uXFx1dGlsc1xcaGVhZGVycy10by1qc29uLnRzIiwgIi4uXFxleGVjdXRlXFxpbmRleC50cyIsICIuLlxcYm9vdHN0cmFwXFxpbmRleC50cyIsICIuLlxcZXZlbnRcXGluZGV4LnRzIiwgIi4uXFxmbG93XFxpbmRleC50cyIsICIuLlxcaGFuZGxlclxcaW5kZXgudHMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcbmFub2lkXFxpbmRleC5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxuYW5vaWRcXHVybC1hbHBoYWJldFxcaW5kZXguanMiLCAiLi5cXHV0aWxzXFxjcmVhdGUtaWQudHMiLCAiLi5cXGV4ZWN1dGVcXGV4ZWN1dGUtaWQtZ2VuZXJhdG9yLnRzIiwgIi4uXFx3b3JsZFxcaW5kZXgudHMiLCAiLi5cXGNvbW1hbmRcXGluZGV4LnRzIiwgIi4uXFxhY3Rpb25cXGluZGV4LnRzIiwgIi4uXFxzdHJlYW1cXGluZGV4LnRzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxjb25zdGFudHMuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGNvbnN0cnVjdEZyb20uanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXHRvRGF0ZS5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcX2xpYlxcZGVmYXVsdE9wdGlvbnMuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXHN0YXJ0T2ZXZWVrLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxzdGFydE9mSVNPV2Vlay5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcZ2V0SVNPV2Vla1llYXIuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXG5vcm1hbGl6ZURhdGVzLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxzdGFydE9mRGF5LmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXHN0YXJ0T2ZJU09XZWVrWWVhci5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcaXNEYXRlLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxpc1ZhbGlkLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxzdGFydE9mWWVhci5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxlbi1VU1xcX2xpYlxcZm9ybWF0RGlzdGFuY2UuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcX2xpYlxcYnVpbGRGb3JtYXRMb25nRm4uanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcZW4tVVNcXF9saWJcXGZvcm1hdExvbmcuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcZW4tVVNcXF9saWJcXGZvcm1hdFJlbGF0aXZlLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXF9saWJcXGJ1aWxkTG9jYWxpemVGbi5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxlbi1VU1xcX2xpYlxcbG9jYWxpemUuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcX2xpYlxcYnVpbGRNYXRjaEZuLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXF9saWJcXGJ1aWxkTWF0Y2hQYXR0ZXJuRm4uanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcZW4tVVNcXF9saWJcXG1hdGNoLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXGVuLVVTLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxnZXREYXlPZlllYXIuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGdldElTT1dlZWsuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGdldFdlZWtZZWFyLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxzdGFydE9mV2Vla1llYXIuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGdldFdlZWsuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGFkZExlYWRpbmdaZXJvcy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcX2xpYlxcZm9ybWF0XFxsaWdodEZvcm1hdHRlcnMuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGZvcm1hdFxcZm9ybWF0dGVycy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcX2xpYlxcZm9ybWF0XFxsb25nRm9ybWF0dGVycy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcX2xpYlxccHJvdGVjdGVkVG9rZW5zLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxmb3JtYXQuanMiLCAiLi5cXHV0aWxzXFxzZW5kLWNvb2tib29rLWV2ZW50LnRzIiwgIi4uXFxsb2dnZXJcXGluZGV4LnRzIiwgIi4uXFxzdGVwXFxpbmRleC50cyIsICIuLlxcdXRpbHNcXHRyaWUudHMiLCAiLi5cXGxpc3RlbmVyXFxpbmRleC50cyIsICIuLlxcZXhjZXB0aW9uXFxpbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJleHBvcnQgdHlwZSBUeXBlU2FmZXR5PFZhbHVlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4gPSAodmFsdWU6IFZhbHVlKSA9PiBUeXBlU2FmZXR5VmFsdWU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVNhZmV0eVZhbHVlIHtcbiAgdHlwZTogPFR5cGUgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PigpID0+IFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVNhZmV0eVR5cGU8VHlwZSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+IHtcbiAgJG1pbGtpb1R5cGU6IFwidHlwZS1zYWZldHlcIjtcbiAgdmFsdWU6IFR5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0eXBlU2FmZXR5PFZhbHVlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4odmFsdWU6IFZhbHVlKTogVHlwZVNhZmV0eVZhbHVlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAoKSA9PiAoeyAkbWlsa2lvVHlwZTogXCJ0eXBlLXNhZmV0eVwiLCB2YWx1ZSB9KSxcbiAgfSBhcyBhbnk7XG59XG4iLAogICAgImNvbnN0IGMgPSB7XG4gIHJ1bGVzOiB7XG4gICAgc3RyaW5naWZ5OiBbXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdHlwZW9mIHQgPT0gXCJiaWdpbnRcIixcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IGB0IWJpZ2ludDoke3QudG9TdHJpbmcoKX1gXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQgaW5zdGFuY2VvZiBEYXRlLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gYHQhRGF0ZToke3QudG9JU09TdHJpbmcoKX1gXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQgaW5zdGFuY2VvZiBVUkwsXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBgdCFVUkw6JHt0LnRvU3RyaW5nKCl9YFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0IGluc3RhbmNlb2YgUmVnRXhwLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gYHQhUmVnRXhwOiR7dC50b1N0cmluZygpfWBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBgdCFVaW50OEFycmF5OiR7bmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHQpfWBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gYHQhQXJyYXlCdWZmZXI6JHtuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUodCl9YFxuICAgICAgfVxuICAgIF0sXG4gICAgcGFyc2U6IFtcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0LnN0YXJ0c1dpdGgoXCJ0IWJpZ2ludDpcIiksXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBCaWdJbnQodC5zbGljZSg5KSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdC5zdGFydHNXaXRoKFwidCFEYXRlOlwiKSxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IG5ldyBEYXRlKHQuc2xpY2UoNykpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQuc3RhcnRzV2l0aChcInQhVVJMOlwiKSxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IG5ldyBVUkwodC5zbGljZSg2KSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdC5zdGFydHNXaXRoKFwidCFSZWdFeHA6XCIpLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gbmV3IFJlZ0V4cCh0LnNsaWNlKDkpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0LnN0YXJ0c1dpdGgoXCJ0IVVpbnQ4QXJyYXk6XCIpLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHQuc2xpY2UoMTMpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0LnN0YXJ0c1dpdGgoXCJ0IUFycmF5QnVmZmVyOlwiKSxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0LnNsaWNlKDE0KSkuYnVmZmVyXG4gICAgICB9XG4gICAgXVxuICB9LFxuICBzdHJpbmdpZnkodCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShjLmVuY29kZSh0KSk7XG4gIH0sXG4gIHBhcnNlKHQpIHtcbiAgICByZXR1cm4gYy5kZWNvZGUoSlNPTi5wYXJzZSh0KSk7XG4gIH0sXG4gIGVuY29kZSh0KSB7XG4gICAgZnVuY3Rpb24gbihlKSB7XG4gICAgICBpZiAoIWUgfHwgdHlwZW9mIGUgIT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZSAhPSBcImJpZ2ludFwiKVxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICAgICAgY29uc3QgcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHNbaV0gPSBuKGVbaV0pO1xuICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICBmb3IgKGNvbnN0IHMgb2YgYy5ydWxlcy5zdHJpbmdpZnkpXG4gICAgICAgIGlmIChzLm1hdGNoKGUpKVxuICAgICAgICAgIHJldHVybiBzLmhhbmRsZXIoZSk7XG4gICAgICBjb25zdCByID0ge307XG4gICAgICBmb3IgKHZhciBhIGluIGUpXG4gICAgICAgIHJbYV0gPSBuKGVbYV0pO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuICAgIHJldHVybiBuKHQpO1xuICB9LFxuICBkZWNvZGUodCkge1xuICAgIGZ1bmN0aW9uIG4oZSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpXG4gICAgICAgIHJldHVybiBlLm1hcChuKTtcbiAgICAgIGlmICh0eXBlb2YgZSA9PSBcIm9iamVjdFwiICYmIGUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgciA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGEgaW4gZSlcbiAgICAgICAgICBlLmhhc093blByb3BlcnR5KGEpICYmIChyW2FdID0gbihlW2FdKSk7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGZvciAoY29uc3QgciBvZiBjLnJ1bGVzLnBhcnNlKVxuICAgICAgICAgIGlmIChyLm1hdGNoKGUpID09PSAhMClcbiAgICAgICAgICAgIHJldHVybiByLmhhbmRsZXIoZSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIHJldHVybiBuKHQpO1xuICB9XG59O1xuZXhwb3J0IHtcbiAgYyBhcyBUU09OXG59O1xuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gY29uZmlnPENvbmZpZ1QgZXh0ZW5kcyBDb25maWc+KGNvbmZpZzogQ29uZmlnVCk6IENvbmZpZ1Qge1xuICByZXR1cm4gY29uZmlnO1xufVxuXG5leHBvcnQgdHlwZSBDb25maWcgPSAobW9kZTogc3RyaW5nKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ0Vudmlyb25tZW50czxUIGV4dGVuZHMgQ29uZmlnPiB7XG4gIFtrZXk6IHN0cmluZ106IChlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IFBhcnRpYWw8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj4gfCBQcm9taXNlPFBhcnRpYWw8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW52VG9TdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlOiBzdHJpbmcpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0VmFsdWU7XG5cbiAgcmV0dXJuIGAke3ZhbHVlfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnZUb051bWJlcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IG51bWJlcikge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcblxuICByZXR1cm4gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnZUb0Jvb2xlYW4odmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlOiBib29sZWFuKSB7XG4gIGlmICh2YWx1ZSA9PT0gXCJ0cnVlXCIpIHJldHVybiB0cnVlO1xuXG4gIGlmICh2YWx1ZSA9PT0gXCJmYWxzZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHZhbHVlID09PSBcIlwiKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHVuZGVmaW5lZCA9PT0gdmFsdWUpIHJldHVybiBkZWZhdWx0VmFsdWU7XG5cbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUpO1xufVxuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gaGVhZGVyc1RvSlNPTihoZWFkZXJzOiBIZWFkZXJzKSB7XG4gIGNvbnN0IGpzb246IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgKGhlYWRlcnMgYXMgYW55KS5lbnRyaWVzKCkpIHtcbiAgICBqc29uW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4ganNvbjtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBJVmFsaWRhdGlvbiB9IGZyb20gXCJ0eXBpYVwiO1xuaW1wb3J0IHsgVFNPTiB9IGZyb20gXCJAc291dGhlcm4tYXVyb3JhL3Rzb25cIjtcbmltcG9ydCB7IHJlamVjdCB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgJG1ldGEsIExvZ2dlciwgUmVzdWx0cywgR2VuZXJhdGVkSW5pdCB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHsgaGVhZGVyc1RvSlNPTiB9IGZyb20gXCIuLi91dGlscy9oZWFkZXJzLXRvLWpzb24udHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdEV4ZWN1dGVyKGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgcnVudGltZTogYW55KSB7XG4gIGNvbnN0IF9fZXhlY3V0ZSA9IGFzeW5jIChcbiAgICByb3V0ZVNjaGVtYTogYW55LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IHN0cmluZztcbiAgICAgIGNyZWF0ZWRMb2dnZXI6IExvZ2dlcjtcbiAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBIZWFkZXJzO1xuICAgICAgbWl4aW5Db250ZXh0OiBSZWNvcmQ8YW55LCBhbnk+IHwgdW5kZWZpbmVkO1xuICAgIH0gJiAoXG4gICAgICB8IHtcbiAgICAgICAgICBwYXJhbXM6IFJlY29yZDxhbnksIGFueT47XG4gICAgICAgICAgcGFyYW1zVHlwZTogXCJyYXdcIjtcbiAgICAgICAgfVxuICAgICAgfCB7XG4gICAgICAgICAgcGFyYW1zOiBzdHJpbmc7XG4gICAgICAgICAgcGFyYW1zVHlwZTogXCJzdHJpbmdcIjtcbiAgICAgICAgfVxuICAgICksXG4gICk6IFByb21pc2U8eyBleGVjdXRlSWQ6IHN0cmluZzsgaGVhZGVyczogSGVhZGVyczsgcGFyYW1zOiBSZWNvcmQ8YW55LCB1bmtub3duPjsgcmVzdWx0czogUmVzdWx0czxhbnk+OyBjb250ZXh0OiAkY29udGV4dDsgbWV0YTogUmVhZG9ubHk8JG1ldGE+OyB0eXBlOiBcImFjdGlvblwiIHwgXCJzdHJlYW1cIjsgZW1wdHlSZXN1bHQ6IGJvb2xlYW47IHJlc3VsdHNUeXBlU2FmZXR5OiBib29sZWFuOyBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gfT4gPT4ge1xuICAgIGNvbnN0IGV4ZWN1dGVJZDogc3RyaW5nID0gb3B0aW9ucy5jcmVhdGVkRXhlY3V0ZUlkO1xuICAgIGxldCBoZWFkZXJzOiBIZWFkZXJzO1xuICAgIGlmICghKG9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBoZWFkZXJzID0gbmV3IEhlYWRlcnMoe1xuICAgICAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycztcbiAgICB9XG4gICAgaWYgKCEoXCJ0b0pTT05cIiBpbiBoZWFkZXJzKSkgKGhlYWRlcnMgYXMgYW55KS50b0pTT04gPSAoKSA9PiBoZWFkZXJzVG9KU09OKGhlYWRlcnMpO1xuXG4gICAgY29uc3QgZmluYWxlczogQXJyYXk8YW55PiA9IFtdO1xuICAgIGNvbnN0IG9uRmluYWxseSA9IChoYW5kbGVyOiBhbnkpID0+IGZpbmFsZXMudW5zaGlmdChoYW5kbGVyKTtcblxuICAgIGxldCBwYXJhbXM6IFJlY29yZDxhbnksIHVua25vd24+O1xuICAgIGlmIChvcHRpb25zLnBhcmFtc1R5cGUgPT09IFwicmF3XCIpIHtcbiAgICAgIHBhcmFtcyA9IG9wdGlvbnMucGFyYW1zO1xuICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09IFwidW5kZWZpbmVkXCIpIHBhcmFtcyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5wYXJhbXMgPT09IFwiXCIpIHtcbiAgICAgICAgcGFyYW1zID0ge307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmFtcyA9IFRTT04ucGFyc2Uob3B0aW9ucy5wYXJhbXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRocm93IHJlamVjdChcIlBBUkFNU19UWVBFX05PVF9TVVBQT1JURURcIiwgeyBleHBlY3RlZDogXCJqc29uXCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09IFwidW5kZWZpbmVkXCIpIHBhcmFtcyA9IHt9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHBhcmFtcykpIHRocm93IHJlamVjdChcIlBBUkFNU19UWVBFX05PVF9TVVBQT1JURURcIiwgeyBleHBlY3RlZDogXCJqc29uXCIgfSk7XG4gICAgaWYgKFwiJG1pbGtpb0dlbmVyYXRlUGFyYW1zXCIgaW4gcGFyYW1zICYmIHBhcmFtcy4kbWlsa2lvR2VuZXJhdGVQYXJhbXMgPT09IFwiZW5hYmxlXCIpIHtcbiAgICAgIGlmICghcnVudGltZS5kZXZlbG9wKSB0aHJvdyByZWplY3QoXCJOT1RfREVWRUxPUF9NT0RFXCIsIFwiVGhpcyBmZWF0dXJlIG11c3QgYmUgaW4gY29va2Jvb2sgdG8gdXNlLlwiKTtcbiAgICAgIGRlbGV0ZSBwYXJhbXMuJG1pbGtpb0dlbmVyYXRlUGFyYW1zO1xuICAgICAgbGV0IHBhcmFtc1JhbmQgPSByb3V0ZVNjaGVtYS5yYW5kb21QYXJhbXMoKTtcbiAgICAgIGlmIChwYXJhbXNSYW5kID09PSB1bmRlZmluZWQgfHwgcGFyYW1zUmFuZCA9PT0gbnVsbCkgcGFyYW1zUmFuZCA9IHt9O1xuICAgICAgcGFyYW1zID0geyAuLi5wYXJhbXNSYW5kLCAuLi5wYXJhbXMgfTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubWl4aW5Db250ZXh0Py5odHRwPy5wYXJhbXM/LnN0cmluZykgb3B0aW9ucy5taXhpbkNvbnRleHQuaHR0cC5wYXJhbXMucGFyc2VkID0gcGFyYW1zOyAvLyBsaXN0ZW4g44Gn44OR44O844K544GX44Gf44OR44Op44Oh44O844K/44KS5rih44GZXG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIC4uLihvcHRpb25zLm1peGluQ29udGV4dCA/IG9wdGlvbnMubWl4aW5Db250ZXh0IDoge30pLFxuICAgICAgZGV2ZWxvcDogcnVudGltZS5kZXZlbG9wLFxuICAgICAgcGF0aDogb3B0aW9ucy5wYXRoLFxuICAgICAgbG9nZ2VyOiBvcHRpb25zLmNyZWF0ZWRMb2dnZXIsXG4gICAgICBlbWl0OiBydW50aW1lLmVtaXQsXG4gICAgICBleGVjdXRlSWQ6IG9wdGlvbnMuY3JlYXRlZEV4ZWN1dGVJZCxcbiAgICAgIGNvbmZpZzogcnVudGltZS5ydW50aW1lLmNvbmZpZyxcbiAgICAgIGNhbGw6IChtb2R1bGU6IGFueSwgb3B0aW9uczogYW55KSA9PiBfX2NhbGwoY29udGV4dCwgbW9kdWxlLCBvcHRpb25zKSxcbiAgICAgIG9uRmluYWxseTogb25GaW5hbGx5LFxuICAgICAgXzogcnVudGltZSxcbiAgICB9IGFzIHVua25vd24gYXMgJGNvbnRleHQ7XG4gICAgY29uc3QgcmVzdWx0czogUmVzdWx0czxhbnk+ID0geyB2YWx1ZTogdW5kZWZpbmVkIH07XG5cbiAgICBjb25zdCBtb2R1bGUgPSByb3V0ZVNjaGVtYS5tb2R1bGU7XG4gICAgY29uc3QgbWV0YSA9IChtb2R1bGUuZGVmYXVsdD8ubWV0YSA/IG1vZHVsZS5kZWZhdWx0Py5tZXRhIDoge30pIGFzIHVua25vd24gYXMgUmVhZG9ubHk8JG1ldGE+O1xuXG4gICAgaWYgKG1ldGEudHlwZVNhZmV0eSA9PT0gdW5kZWZpbmVkIHx8IG1ldGEudHlwZVNhZmV0eSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHJvdXRlU2NoZW1hLnZhbGlkYXRlUGFyYW1zKHBhcmFtcykgYXMgSVZhbGlkYXRpb248YW55PjtcbiAgICAgIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9JTkNPUlJFQ1RcIiwgeyAuLi52YWxpZGF0aW9uLmVycm9yc1swXSwgbWVzc2FnZTogYFRoZSB2YWx1ZSAnJHt2YWxpZGF0aW9uLmVycm9yc1swXS5wYXRofScgaXMgJyR7dmFsaWRhdGlvbi5lcnJvcnNbMF0udmFsdWV9Jywgd2hpY2ggZG9lcyBub3QgbWVldCAnJHt2YWxpZGF0aW9uLmVycm9yc1swXS5leHBlY3RlZH0nIHJlcXVpcmVtZW50cy5gIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpleGVjdXRlQmVmb3JlXCIsIHsgZXhlY3V0ZUlkOiBvcHRpb25zLmNyZWF0ZWRFeGVjdXRlSWQsIGxvZ2dlcjogb3B0aW9ucy5jcmVhdGVkTG9nZ2VyLCBwYXRoOiBvcHRpb25zLnBhdGgsIG1ldGEsIGNvbnRleHQgfSk7XG5cbiAgICByZXN1bHRzLnZhbHVlID0gYXdhaXQgbW9kdWxlLmRlZmF1bHQuaGFuZGxlcihjb250ZXh0LCBwYXJhbXMpO1xuXG4gICAgbGV0IHJlc3VsdHNUeXBlU2FmZXR5ID0gZmFsc2U7XG4gICAgaWYgKHJlc3VsdHM/LnZhbHVlPy4kbWlsa2lvVHlwZSA9PT0gXCJ0eXBlLXNhZmV0eVwiKSB7XG4gICAgICByZXN1bHRzVHlwZVNhZmV0eSA9IHRydWU7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gcm91dGVTY2hlbWEudmFsaWRhdGVSZXN1bHRzKHJlc3VsdHMudmFsdWUudmFsdWUpIGFzIElWYWxpZGF0aW9uPGFueT47XG4gICAgICBpZiAoIXZhbGlkYXRpb24uc3VjY2VzcykgdGhyb3cgcmVqZWN0KFwiUkVTVUxUU19UWVBFX0lOQ09SUkVDVFwiLCB7IC4uLnZhbGlkYXRpb24uZXJyb3JzWzBdLCBtZXNzYWdlOiBgVGhlIHZhbHVlICcke3ZhbGlkYXRpb24uZXJyb3JzWzBdLnBhdGh9JyBpcyAnJHt2YWxpZGF0aW9uLmVycm9yc1swXS52YWx1ZX0nLCB3aGljaCBkb2VzIG5vdCBtZWV0ICcke3ZhbGlkYXRpb24uZXJyb3JzWzBdLmV4cGVjdGVkfScgcmVxdWlyZW1lbnRzLmAgfSk7XG4gICAgICByZXN1bHRzLnZhbHVlID0gcmVzdWx0cy52YWx1ZS52YWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgZW1wdHlSZXN1bHQgPSBmYWxzZTtcbiAgICBpZiAocmVzdWx0cy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHJlc3VsdHMudmFsdWUgPT09IG51bGwgfHwgcmVzdWx0cy52YWx1ZSA9PT0gXCJcIikge1xuICAgICAgZW1wdHlSZXN1bHQgPSB0cnVlO1xuICAgICAgcmVzdWx0cy52YWx1ZSA9IHt9O1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzLnZhbHVlKSkge1xuICAgICAgdGhyb3cgcmVqZWN0KFwiRkFJTFwiLCBcIlRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlIGFuIG9iamVjdCwgd2hpY2ggaXMgY3VycmVudGx5IGFuIGFycmF5LlwiKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHRzLnZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyByZWplY3QoXCJGQUlMXCIsIFwiVGhlIHJldHVybiB0eXBlIG9mIHRoZSBoYW5kbGVyIG11c3QgYmUgYW4gb2JqZWN0LCB3aGljaCBpcyBjdXJyZW50bHkgYSBwcmltaXRpdmUgdHlwZS5cIik7XG4gICAgfVxuXG4gICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmV4ZWN1dGVBZnRlclwiLCB7IGV4ZWN1dGVJZDogb3B0aW9ucy5jcmVhdGVkRXhlY3V0ZUlkLCBsb2dnZXI6IG9wdGlvbnMuY3JlYXRlZExvZ2dlciwgcGF0aDogb3B0aW9ucy5wYXRoLCBtZXRhLCBjb250ZXh0LCByZXN1bHRzIH0pO1xuXG4gICAgcmV0dXJuIHsgZXhlY3V0ZUlkLCBoZWFkZXJzLCBwYXJhbXMsIHJlc3VsdHMsIGNvbnRleHQsIG1ldGEsIHR5cGU6IG1vZHVsZS4kbWlsa2lvVHlwZSwgZW1wdHlSZXN1bHQsIHJlc3VsdHNUeXBlU2FmZXR5LCBmaW5hbGVzIH07XG4gIH07XG5cbiAgY29uc3QgX19jYWxsID0gYXN5bmMgKGNvbnRleHQ6ICRjb250ZXh0LCBtb2R1bGU6IHsgZGVmYXVsdDogYW55IH0sIHBhcmFtcz86IGFueSk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgY29uc3QgbW9kdWxlQXdhaXRlZCA9IGF3YWl0IG1vZHVsZTtcbiAgICByZXR1cm4gYXdhaXQgbW9kdWxlQXdhaXRlZC5kZWZhdWx0LmhhbmRsZXIoY29udGV4dCwgcGFyYW1zKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIF9fY2FsbCxcbiAgICBfX2V4ZWN1dGUsXG4gIH07XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTWlsa2lvV29ybGQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXA8Qm9vdHN0cmFwSW5pdFQgZXh0ZW5kcyBCb290c3RyYXBJbml0Pihpbml0OiBCb290c3RyYXBJbml0VCk6IEJvb3RzdHJhcEluaXRUIHtcclxuICByZXR1cm4gaW5pdDtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQm9vdHN0cmFwSW5pdCA9ICh3b3JsZDogTWlsa2lvV29ybGQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xyXG4iLAogICAgImltcG9ydCB0eXBlIHsgJGNvbnRleHQsIENvbnRleHRIdHRwLCBSZXN1bHRzLCBMb2dnZXIsICRtZXRhIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgJGV2ZW50cyB7XG4gIFwibWlsa2lvOmh0dHBSZXF1ZXN0XCI6IHsgZXhlY3V0ZUlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbG9nZ2VyOiBMb2dnZXI7IGh0dHA6IENvbnRleHRIdHRwPFJlY29yZDxzdHJpbmcsIGFueT4+IH07XG4gIFwibWlsa2lvOmh0dHBSZXNwb25zZVwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBodHRwOiBDb250ZXh0SHR0cDxSZWNvcmQ8c3RyaW5nLCBhbnk+PjsgY29udGV4dDogJGNvbnRleHQgfTtcbiAgXCJtaWxraW86aHR0cE5vdEZvdW5kXCI6IHsgZXhlY3V0ZUlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbG9nZ2VyOiBMb2dnZXI7IGh0dHA6IENvbnRleHRIdHRwPFJlY29yZDxzdHJpbmcsIGFueT4+IH07XG4gIFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgbWV0YTogJG1ldGE7IGNvbnRleHQ6ICRjb250ZXh0IH07XG4gIFwibWlsa2lvOmV4ZWN1dGVBZnRlclwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBtZXRhOiAkbWV0YTsgY29udGV4dDogJGNvbnRleHQ7IHJlc3VsdHM6IFJlc3VsdHM8YW55PiB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbml0RXZlbnRNYW5hZ2VyKCkge1xuICBjb25zdCBoYW5kbGVycyA9IG5ldyBNYXA8KGV2ZW50OiBhbnkpID0+IHZvaWQsIHN0cmluZz4oKTtcbiAgY29uc3QgaW5kZXhlZCA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8KGV2ZW50OiBhbnkpID0+IHZvaWQ+PigpO1xuXG4gIGNvbnN0IGV2ZW50TWFuYWdlciA9IHtcbiAgICBvbjogPEtleSBleHRlbmRzIGtleW9mICRldmVudHMsIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6ICRldmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgIGhhbmRsZXJzLnNldChoYW5kbGVyLCBrZXkgYXMgc3RyaW5nKTtcbiAgICAgIGlmIChpbmRleGVkLmhhcyhrZXkgYXMgc3RyaW5nKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgaW5kZXhlZC5zZXQoa2V5IGFzIHN0cmluZywgbmV3IFNldCgpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNldCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpITtcbiAgICAgIHNldC5hZGQoaGFuZGxlcik7XG4gICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgc2V0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBvZmY6IDxLZXkgZXh0ZW5kcyBrZXlvZiAkZXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiAkZXZlbnRzW0tleV0pID0+IHZvaWQ+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB7XG4gICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgIGlmICghc2V0KSByZXR1cm47XG4gICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgIH0sXG4gICAgZW1pdDogYXN5bmMgPEtleSBleHRlbmRzIGtleW9mICRldmVudHMsIFZhbHVlIGV4dGVuZHMgJGV2ZW50c1tLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBoID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZyk7XG4gICAgICBpZiAoaCkge1xuICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCkge1xuICAgICAgICAgIGF3YWl0IGhhbmRsZXIodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gZXZlbnRNYW5hZ2VyO1xufVxuIiwKICAgICJleHBvcnQgdHlwZSBNaWxraW9GbG93PFQsIFRSZXR1cm4gPSBhbnksIFROZXh0ID0gYW55PiA9IHtcclxuICBlbWl0OiAoZmxvdzogVCkgPT4gdm9pZDtcclxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBNaWxraW9GbG93PFQ+O1xyXG4gIG5leHQoLi4uW3ZhbHVlXTogW10gfCBbVE5leHRdKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj47XHJcbiAgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+O1xyXG4gIHRocm93KGVycm9yOiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG93PFQ+KCk6IE1pbGtpb0Zsb3c8VD4ge1xyXG4gIGxldCBzdGF0dXM6IFwicGVuZGluZ1wiIHwgXCJyZXNvbHZlZFwiIHwgXCJyZWplY3RlZFwiID0gXCJwZW5kaW5nXCI7XHJcbiAgY29uc3QgZmxvd3M6IEFycmF5PHtcclxuICAgIGJsYW5rOiBib29sZWFuO1xyXG4gICAgcHJvbWlzZTogUHJvbWlzZTxUPjtcclxuICAgIHJlc29sdmU6ICh2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcclxuICAgIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcclxuICB9PiA9IFtdO1xyXG5cclxuICBjb25zdCBpdGVyYXRvciA9IHtcclxuICAgIGVtaXQ6IChmbG93OiBUKSA9PiB7XHJcbiAgICAgIGlmIChmbG93cy5hdCgtMSk/LmJsYW5rID09PSB0cnVlKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IGZsb3dzLmF0KC0xKSE7XHJcbiAgICAgICAgaXRlbS5ibGFuayA9IGZhbHNlO1xyXG4gICAgICAgIGl0ZW0ucmVzb2x2ZShmbG93KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzPFQ+KCk7XHJcbiAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoZmxvdyk7XHJcbiAgICAgICAgZmxvd3MucHVzaCh7IC4uLnJlc29sdmVycywgYmxhbms6IGZhbHNlIH0gYXMgYW55KTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC4uLih7XHJcbiAgICAgIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xyXG4gICAgICAgIGlmIChzdGF0dXMgIT09IFwicGVuZGluZ1wiKSByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xyXG4gICAgICAgIGlmIChmbG93cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIGNvbnN0IHJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVyczxUPigpO1xyXG4gICAgICAgICAgZmxvd3MucHVzaCh7IC4uLnJlc29sdmVycywgYmxhbms6IHRydWUgfSBhcyBhbnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmbG93ID0gZmxvd3MuYXQoMCkhO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZsb3cucHJvbWlzZTtcclxuICAgICAgICBmbG93cy5zaGlmdCgpO1xyXG4gICAgICAgIHJldHVybiB7IGRvbmU6IHN0YXR1cyAhPT0gXCJwZW5kaW5nXCIsIHZhbHVlOiByZXN1bHQgfTtcclxuICAgICAgfSxcclxuICAgICAgYXN5bmMgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcclxuICAgICAgICBzdGF0dXMgPSBcInJlc29sdmVkXCI7XHJcbiAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XHJcbiAgICAgICAgICBmbG93LmJsYW5rID0gZmFsc2U7XHJcbiAgICAgICAgICBmbG93LnJlc29sdmUodW5kZWZpbmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcclxuICAgICAgfSxcclxuICAgICAgYXN5bmMgdGhyb3coZXJyOiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XHJcbiAgICAgICAgc3RhdHVzID0gXCJyZWplY3RlZFwiO1xyXG4gICAgICAgIGlmIChmbG93cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIGNvbnN0IHJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVyczxUPigpO1xyXG4gICAgICAgICAgZmxvd3MucHVzaCh7IC4uLnJlc29sdmVycywgYmxhbms6IHRydWUgfSBhcyBhbnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MpIHtcclxuICAgICAgICAgIGZsb3cuYmxhbmsgPSBmYWxzZTtcclxuICAgICAgICAgIGZsb3cucmVqZWN0KGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH07XHJcbiAgICAgIH0sXHJcbiAgICB9IHNhdGlzZmllcyBBc3luY0l0ZXJhdG9yPHVua25vd24+KSxcclxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuICB9O1xyXG5cclxuICByZXR1cm4gaXRlcmF0b3IgYXMgTWlsa2lvRmxvdzxUPjtcclxufVxyXG4iLAogICAgImltcG9ydCB0eXBlIHsgTWlsa2lvV29ybGQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVyPEhhbmRsZXJJbml0VCBleHRlbmRzIEhhbmRsZXJJbml0Pihpbml0OiBIYW5kbGVySW5pdFQpOiBIYW5kbGVySW5pdFQge1xyXG4gIHJldHVybiBpbml0O1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBIYW5kbGVySW5pdCA9ICh3b3JsZDogTWlsa2lvV29ybGQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xyXG4iLAogICAgImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xuaW1wb3J0IHsgdXJsQWxwaGFiZXQgfSBmcm9tICcuL3VybC1hbHBoYWJldC9pbmRleC5qcydcbmNvbnN0IFBPT0xfU0laRV9NVUxUSVBMSUVSID0gMTI4XG5sZXQgcG9vbCwgcG9vbE9mZnNldFxubGV0IGZpbGxQb29sID0gYnl0ZXMgPT4ge1xuICBpZiAoIXBvb2wgfHwgcG9vbC5sZW5ndGggPCBieXRlcykge1xuICAgIHBvb2wgPSBCdWZmZXIuYWxsb2NVbnNhZmUoYnl0ZXMgKiBQT09MX1NJWkVfTVVMVElQTElFUilcbiAgICBjcnlwdG8ucmFuZG9tRmlsbFN5bmMocG9vbClcbiAgICBwb29sT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKHBvb2xPZmZzZXQgKyBieXRlcyA+IHBvb2wubGVuZ3RoKSB7XG4gICAgY3J5cHRvLnJhbmRvbUZpbGxTeW5jKHBvb2wpXG4gICAgcG9vbE9mZnNldCA9IDBcbiAgfVxuICBwb29sT2Zmc2V0ICs9IGJ5dGVzXG59XG5sZXQgcmFuZG9tID0gYnl0ZXMgPT4ge1xuICBmaWxsUG9vbCgoYnl0ZXMgLT0gMCkpXG4gIHJldHVybiBwb29sLnN1YmFycmF5KHBvb2xPZmZzZXQgLSBieXRlcywgcG9vbE9mZnNldClcbn1cbmxldCBjdXN0b21SYW5kb20gPSAoYWxwaGFiZXQsIGRlZmF1bHRTaXplLCBnZXRSYW5kb20pID0+IHtcbiAgbGV0IG1hc2sgPSAoMiA8PCAoMzEgLSBNYXRoLmNsejMyKChhbHBoYWJldC5sZW5ndGggLSAxKSB8IDEpKSkgLSAxXG4gIGxldCBzdGVwID0gTWF0aC5jZWlsKCgxLjYgKiBtYXNrICogZGVmYXVsdFNpemUpIC8gYWxwaGFiZXQubGVuZ3RoKVxuICByZXR1cm4gKHNpemUgPSBkZWZhdWx0U2l6ZSkgPT4ge1xuICAgIGxldCBpZCA9ICcnXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGxldCBieXRlcyA9IGdldFJhbmRvbShzdGVwKVxuICAgICAgbGV0IGkgPSBzdGVwXG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGlkICs9IGFscGhhYmV0W2J5dGVzW2ldICYgbWFza10gfHwgJydcbiAgICAgICAgaWYgKGlkLmxlbmd0aCA9PT0gc2l6ZSkgcmV0dXJuIGlkXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5sZXQgY3VzdG9tQWxwaGFiZXQgPSAoYWxwaGFiZXQsIHNpemUgPSAyMSkgPT5cbiAgY3VzdG9tUmFuZG9tKGFscGhhYmV0LCBzaXplLCByYW5kb20pXG5sZXQgbmFub2lkID0gKHNpemUgPSAyMSkgPT4ge1xuICBmaWxsUG9vbCgoc2l6ZSAtPSAwKSlcbiAgbGV0IGlkID0gJydcbiAgZm9yIChsZXQgaSA9IHBvb2xPZmZzZXQgLSBzaXplOyBpIDwgcG9vbE9mZnNldDsgaSsrKSB7XG4gICAgaWQgKz0gdXJsQWxwaGFiZXRbcG9vbFtpXSAmIDYzXVxuICB9XG4gIHJldHVybiBpZFxufVxuZXhwb3J0IHsgbmFub2lkLCBjdXN0b21BbHBoYWJldCwgY3VzdG9tUmFuZG9tLCB1cmxBbHBoYWJldCwgcmFuZG9tIH1cbiIsCiAgICAibGV0IHVybEFscGhhYmV0ID1cbiAgJ3VzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3QnXG5leHBvcnQgeyB1cmxBbHBoYWJldCB9XG4iLAogICAgImltcG9ydCB7IG5hbm9pZCB9IGZyb20gXCJuYW5vaWRcIjtcblxuZXhwb3J0IGNvbnN0IF9fY3JlYXRlSWQgPSAoKSA9PiBuYW5vaWQoKTtcbiIsCiAgICAiaW1wb3J0IHsgX19jcmVhdGVJZCB9IGZyb20gXCIuLi91dGlscy9jcmVhdGUtaWQudHNcIjtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZUlkR2VuZXJhdG9yID0gKHJlcXVlc3Q/OiBSZXF1ZXN0KSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVEZWZhdWx0RXhlY3V0ZUlkR2VuZXJhdG9yKCkge1xuICByZXR1cm4gX19jcmVhdGVJZDtcbn1cbiIsCiAgICAiaW1wb3J0IHsgdHlwZSAkdHlwZXMsIF9faW5pdENvbW1hbmRlciwgX19pbml0TGlzdGVuZXIsIF9faW5pdEV4ZWN1dGVyLCBfX2luaXRFdmVudE1hbmFnZXIsIHR5cGUgRXhlY3V0ZUlkLCB0eXBlIExvZ2dlciwgdHlwZSBNaXhpbiwgdHlwZSBHZW5lcmF0ZWRJbml0LCB0eXBlIFBpbmcsIHR5cGUgTG9nZ2VyU3VibWl0dGluZ0hhbmRsZXIsIHR5cGUgTG9nZ2VySW5zZXJ0aW5nSGFuZGxlciB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHsgZGVmaW5lRGVmYXVsdEV4ZWN1dGVJZEdlbmVyYXRvciB9IGZyb20gXCIuLi9leGVjdXRlL2V4ZWN1dGUtaWQtZ2VuZXJhdG9yLnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlsa2lvSW5pdCB7XG4gIHBvcnQ6IG51bWJlcjtcbiAgZGV2ZWxvcDogYm9vbGVhbjtcbiAgY29va2Jvb2s6IHtcbiAgICBjb29rYm9va1BvcnQ6IG51bWJlcjtcbiAgfTtcbiAgY29ycz86IHtcbiAgICBjb3JzQWxsb3dNZXRob2RzPzogc3RyaW5nO1xuICAgIGNvcnNBbGxvd0hlYWRlcnM/OiBzdHJpbmc7XG4gICAgY29yc0FsbG93T3JpZ2luPzogc3RyaW5nO1xuICB9O1xuICBpZ25vcmVQYXRoTGV2ZWw/OiBudW1iZXI7XG4gIHJlYWxJcD86IChyZXF1ZXN0OiBSZXF1ZXN0KSA9PiBzdHJpbmc7XG4gIGV4ZWN1dGVJZD86IChyZXF1ZXN0OiBSZXF1ZXN0KSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG4gIG9uTG9nZ2VyU3VibWl0dGluZz86IExvZ2dlclN1Ym1pdHRpbmdIYW5kbGVyO1xuICBvbkxvZ2dlckluc2VydGluZz86IExvZ2dlckluc2VydGluZ0hhbmRsZXI7XG4gIGJvb3RzdHJhcHM/OiBBcnJheTwod29ybGQ6IE1pbGtpb1dvcmxkKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD47XG59XG5cbmV4cG9ydCB0eXBlIE1pbGtpb1J1bnRpbWVJbml0PFQgZXh0ZW5kcyBNaWxraW9Jbml0PiA9IE1peGluPFxuICBULFxuICB7XG4gICAgZXhlY3V0ZUlkOiAocmVxdWVzdDogUmVxdWVzdCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuICAgIHJ1bnRpbWU6IHtcbiAgICAgIHJlcXVlc3Q6IE1hcDxFeGVjdXRlSWQsIHsgbG9nZ2VyOiBMb2dnZXIgfT47XG4gICAgICBjb25maWc6IEF3YWl0ZWQ8UmV0dXJuVHlwZTwkdHlwZXNbXCJnZW5lcmF0ZWRcIl1bXCJjb25maWdTY2hlbWFcIl0+PjtcbiAgICAgIGFwcDogYW55O1xuICAgIH07XG4gICAgb246IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJvblwiXTtcbiAgICBvZmY6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJvZmZcIl07XG4gICAgZW1pdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBfX2luaXRFdmVudE1hbmFnZXI+PltcImVtaXRcIl07XG4gIH1cbj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVXb3JsZDxNaWxraW9PcHRpb25zIGV4dGVuZHMgTWlsa2lvSW5pdD4oZ2VuZXJhdGVkOiBHZW5lcmF0ZWRJbml0LCBjb25maWdTY2hlbWE6IHsgZ2V0OiAoKSA9PiBQcm9taXNlPFJlY29yZDxhbnksIGFueT4+IH0sIG9wdGlvbnM6IE1pbGtpb09wdGlvbnMpOiBQcm9taXNlPE1pbGtpb1dvcmxkPE1pbGtpb09wdGlvbnM+PiB7XG4gIGNvbnN0IGV4ZWN1dGVJZCA9IG9wdGlvbnMuZXhlY3V0ZUlkID8/IGRlZmluZURlZmF1bHRFeGVjdXRlSWRHZW5lcmF0b3IoKTtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgY29uZmlnU2NoZW1hLmdldCgpO1xuXG4gIGNvbnN0IHJ1bnRpbWUgPSB7XG4gICAgcmVxdWVzdDogbmV3IE1hcCgpLFxuICAgIGNvbmZpZyxcbiAgfSBhcyBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9PcHRpb25zPltcInJ1bnRpbWVcIl07XG5cbiAgY29uc3QgZXZlbnRNYW5hZ2VyID0gX19pbml0RXZlbnRNYW5hZ2VyKCk7XG5cbiAgY29uc3QgXzogTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvT3B0aW9ucz4gPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBleGVjdXRlSWQsXG4gICAgcnVudGltZSxcbiAgICBvbjogZXZlbnRNYW5hZ2VyLm9uLFxuICAgIG9mZjogZXZlbnRNYW5hZ2VyLm9mZixcbiAgICBlbWl0OiBldmVudE1hbmFnZXIuZW1pdCxcbiAgfTtcblxuICBjb25zdCBleGVjdXRlciA9IF9faW5pdEV4ZWN1dGVyKGdlbmVyYXRlZCwgXyk7XG4gIGNvbnN0IGNvbW1hbmRlciA9IF9faW5pdENvbW1hbmRlcihnZW5lcmF0ZWQsIF8pO1xuICBjb25zdCBsaXN0ZW5lciA9IF9faW5pdExpc3RlbmVyKGdlbmVyYXRlZCwgXywgZXhlY3V0ZXIpO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIGFwcFxuICBjb25zdCB3b3JsZCA9IHtcbiAgICBfLFxuICAgIC8vIGV2ZW50IG1hbmFnZXJcbiAgICBvbjogZXZlbnRNYW5hZ2VyLm9uLFxuICAgIG9mZjogZXZlbnRNYW5hZ2VyLm9mZixcbiAgICBlbWl0OiBldmVudE1hbmFnZXIuZW1pdCxcbiAgICAvLyBjb21tYW5kZXJcbiAgICBjb21tYW5kZXIsXG4gICAgLy8gbGlzdGVuZXJcbiAgICBsaXN0ZW5lcixcbiAgICAvLyBmdW5jdGlvblxuICAgIGNvbmZpZyxcbiAgfTtcblxuICBydW50aW1lLmFwcCA9IHdvcmxkO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuYm9vdHN0cmFwcykpIHtcbiAgICBmb3IgKGNvbnN0IGJvb3RzdHJhcCBvZiBvcHRpb25zLmJvb3RzdHJhcHMpIHtcbiAgICAgIGF3YWl0IGJvb3RzdHJhcCh3b3JsZCBhcyBNaWxraW9Xb3JsZDxNaWxraW9PcHRpb25zPik7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoZ2VuZXJhdGVkLmhhbmRsZXJTY2hlbWEubG9hZEhhbmRsZXJzKHdvcmxkKSk7XG5cbiAgcmV0dXJuIHdvcmxkIGFzIE1pbGtpb1dvcmxkPE1pbGtpb09wdGlvbnM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pbGtpb1dvcmxkPE1pbGtpb09wdGlvbnMgZXh0ZW5kcyBNaWxraW9Jbml0ID0gTWlsa2lvSW5pdD4ge1xuICBfOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9PcHRpb25zPjtcbiAgLy8gZXZlbnQgbWFuYWdlclxuICBvbjogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBfX2luaXRFdmVudE1hbmFnZXI+PltcIm9uXCJdO1xuICBvZmY6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJvZmZcIl07XG4gIGVtaXQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJlbWl0XCJdO1xuICBwaW5nOiAob3B0aW9ucz86IHsgdGltZW91dD86IG51bWJlciB9KSA9PiBQcm9taXNlPFBpbmc+O1xuICAvLyBjb21tYW5kZXJcbiAgY29tbWFuZGVyOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdENvbW1hbmRlcj4+O1xuICAvLyBsaXN0ZW5lclxuICBsaXN0ZW5lcjogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBfX2luaXRMaXN0ZW5lcj4+O1xuICBjb25maWc6IFJlYWRvbmx5PEF3YWl0ZWQ8UmV0dXJuVHlwZTwkdHlwZXNbXCJjb25maWdTY2hlbWFcIl1bXCJnZXRcIl0+Pj47XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgR2VuZXJhdGVkSW5pdCB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tbWFuZDxDb21tYW5kSW5pdFQgZXh0ZW5kcyBDb21tYW5kSW5pdD4oaW5pdDogQ29tbWFuZEluaXRUKTogQ29tbWFuZDxDb21tYW5kSW5pdFQ+IHtcbiAgY29uc3QgY29tbWFuZCA9IGluaXQgYXMgdW5rbm93biBhcyBDb21tYW5kPENvbW1hbmRJbml0VD47XG4gIGNvbW1hbmQuJG1pbGtpb1R5cGUgPSBcImNvbW1hbmRcIjtcbiAgcmV0dXJuIGNvbW1hbmQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZEluaXQge1xuICBoYW5kbGVyOiAoY29tbWFuZHM6IEFycmF5PHN0cmluZz4sIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IFByb21pc2U8dW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZDxDb21tYW5kSW5pdFQgZXh0ZW5kcyBDb21tYW5kSW5pdD4ge1xuICAkbWlsa2lvVHlwZTogXCJjb21tYW5kXCI7XG4gIGhhbmRsZXI6IENvbW1hbmRJbml0VFtcImhhbmRsZXJcIl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2luaXRDb21tYW5kZXIoZ2VuZXJhdGVkOiBHZW5lcmF0ZWRJbml0LCBydW50aW1lOiBhbnkpIHtcbiAgY29uc3QgY29tbWFuZGVyID0gYXN5bmMgKGFyZ3Y6IEFycmF5PHN0cmluZz4sIG9wdGlvbnM/OiB7IG9uTm90Rm91bmQ/OiAoKSA9PiBhbnkgfSkgPT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIHBhdGg6IFwiaW5kZXhcIixcbiAgICAgIGNvbW1hbmRzOiBbXSBhcyBBcnJheTxzdHJpbmc+LFxuICAgICAgb3B0aW9uczoge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdHJ1ZT4sXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgYXJndi5zbGljZSgzKSkge1xuICAgICAgaWYgKHYuc3RhcnRzV2l0aChcIi0tXCIpICYmIHYuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgIGNvbnN0IHZTcGxpdGVkID0gdi5zcGxpdChcIj1cIik7XG4gICAgICAgIHBhcmFtcy5vcHRpb25zW3ZTcGxpdGVkWzBdLnNsaWNlKDIpXSA9IHZTcGxpdGVkLnNsaWNlKDEsIHZTcGxpdGVkLmxlbmd0aCkuam9pbihcIj1cIik7XG4gICAgICB9IGVsc2UgaWYgKHYuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgIHBhcmFtcy5vcHRpb25zW3Yuc2xpY2UoMildID0gXCIxXCI7XG4gICAgICB9IGVsc2UgaWYgKHYuc3RhcnRzV2l0aChcIi1cIikgJiYgdi5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgICAgY29uc3QgdlNwbGl0ZWQgPSB2LnNwbGl0KFwiPVwiKTtcbiAgICAgICAgcGFyYW1zLm9wdGlvbnNbdlNwbGl0ZWRbMF0uc2xpY2UoMSldID0gdlNwbGl0ZWQuc2xpY2UoMSwgdlNwbGl0ZWQubGVuZ3RoKS5qb2luKFwiPVwiKTtcbiAgICAgIH0gZWxzZSBpZiAodi5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICBwYXJhbXMub3B0aW9uc1t2LnNsaWNlKDEpXSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zLmNvbW1hbmRzLnB1c2godik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcmd2Lmxlbmd0aCA9PT0gMikgcGFyYW1zLnBhdGggPSBcImluZGV4XCI7XG4gICAgZWxzZSBwYXJhbXMucGF0aCA9IGAke2FyZ3ZbMl0gPz8gXCJpbmRleFwifWA7XG5cbiAgICBpZiAoIShwYXJhbXMucGF0aCBpbiBnZW5lcmF0ZWQuY29tbWFuZFNjaGVtYS5jb21tYW5kcykpIHtcbiAgICAgIGlmIChvcHRpb25zPy5vbk5vdEZvdW5kKSByZXR1cm4gYXdhaXQgb3B0aW9ucy5vbk5vdEZvdW5kKCk7XG4gICAgICBjb25zb2xlLmxvZyhgXFx4MUJbNDRtIFV3VSBcXHgxQlswbSBcXHgxQlsybUNvbW1hbmQgbm90IGZvdW5kOlxceDFCWzBtIFxceDFCWzMybSR7cGFyYW1zLnBhdGh9XFx4MUJbMG1gKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlZC5jb21tYW5kU2NoZW1hLmNvbW1hbmRzW3BhcmFtcy5wYXRoXS5tb2R1bGUuaGFuZGxlcihwYXJhbXMuY29tbWFuZHMsIHBhcmFtcy5vcHRpb25zKTtcbiAgfTtcblxuICByZXR1cm4gY29tbWFuZGVyO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7ICRjb250ZXh0LCAkbWV0YSB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gYWN0aW9uPEFjdGlvbkluaXRUIGV4dGVuZHMgQWN0aW9uSW5pdD4oaW5pdDogQWN0aW9uSW5pdFQpOiBBY3Rpb248QWN0aW9uSW5pdFQ+IHtcbiAgY29uc3QgYWN0aW9uID0gaW5pdCBhcyB1bmtub3duIGFzIEFjdGlvbjxBY3Rpb25Jbml0VD47XG4gIGFjdGlvbi4kbWlsa2lvVHlwZSA9IFwiYWN0aW9uXCI7XG4gIGlmIChhY3Rpb24ubWV0YSA9PT0gdW5kZWZpbmVkKSBhY3Rpb24ubWV0YSA9IHt9O1xuICByZXR1cm4gYWN0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25Jbml0ID0ge1xuICBtZXRhPzogJG1ldGE7XG4gIGhhbmRsZXI6IChjb250ZXh0OiAkY29udGV4dCwgcGFyYW1zOiBhbnkpID0+IFByb21pc2U8dW5rbm93bj47XG59O1xuXG5leHBvcnQgdHlwZSBBY3Rpb248QWN0aW9uSW5pdFQgZXh0ZW5kcyBBY3Rpb25Jbml0PiA9IHtcbiAgJG1pbGtpb1R5cGU6IFwiYWN0aW9uXCI7XG4gIG1ldGE6IEFjdGlvbkluaXRUW1wibWV0YVwiXSBleHRlbmRzIHVuZGVmaW5lZCA/IHt9IDogQWN0aW9uSW5pdFRbXCJtZXRhXCJdO1xuICBoYW5kbGVyOiBBY3Rpb25Jbml0VFtcImhhbmRsZXJcIl07XG59O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7ICRjb250ZXh0LCAkbWV0YSB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyZWFtPFN0cmVhbUluaXRUIGV4dGVuZHMgU3RyZWFtSW5pdD4oaW5pdDogU3RyZWFtSW5pdFQpOiBTdHJlYW08U3RyZWFtSW5pdFQ+IHtcbiAgY29uc3Qgc3RyZWFtID0gaW5pdCBhcyB1bmtub3duIGFzIFN0cmVhbTxTdHJlYW1Jbml0VD47XG4gIHN0cmVhbS4kbWlsa2lvVHlwZSA9IFwic3RyZWFtXCI7XG4gIGlmIChzdHJlYW0ubWV0YSA9PT0gdW5kZWZpbmVkKSBzdHJlYW0ubWV0YSA9IHt9O1xuICByZXR1cm4gc3RyZWFtO1xufVxuXG5leHBvcnQgdHlwZSBTdHJlYW1Jbml0ID0ge1xuICBtZXRhPzogJG1ldGE7XG4gIGhhbmRsZXI6IChjb250ZXh0OiAkY29udGV4dCwgcGFyYW1zOiBhbnkpID0+IEFzeW5jR2VuZXJhdG9yPHVua25vd24+O1xufTtcblxuZXhwb3J0IHR5cGUgU3RyZWFtPFN0cmVhbUluaXRUIGV4dGVuZHMgU3RyZWFtSW5pdD4gPSB7XG4gICRtaWxraW9UeXBlOiBcInN0cmVhbVwiO1xuICBtZXRhOiBTdHJlYW1Jbml0VFtcIm1ldGFcIl0gZXh0ZW5kcyB1bmRlZmluZWQgPyB7fSA6IFN0cmVhbUluaXRUW1wibWV0YVwiXTtcbiAgaGFuZGxlcjogU3RyZWFtSW5pdFRbXCJoYW5kbGVyXCJdO1xufTtcbiIsCiAgICAiLyoqXG4gKiBAbW9kdWxlIGNvbnN0YW50c1xuICogQHN1bW1hcnkgVXNlZnVsIGNvbnN0YW50c1xuICogQGRlc2NyaXB0aW9uXG4gKiBDb2xsZWN0aW9uIG9mIHVzZWZ1bCBkYXRlIGNvbnN0YW50cy5cbiAqXG4gKiBUaGUgY29uc3RhbnRzIGNvdWxkIGJlIGltcG9ydGVkIGZyb20gYGRhdGUtZm5zL2NvbnN0YW50c2A6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IG1heFRpbWUsIG1pblRpbWUgfSBmcm9tIFwiLi9jb25zdGFudHMvZGF0ZS1mbnMvY29uc3RhbnRzXCI7XG4gKlxuICogZnVuY3Rpb24gaXNBbGxvd2VkVGltZSh0aW1lKSB7XG4gKiAgIHJldHVybiB0aW1lIDw9IG1heFRpbWUgJiYgdGltZSA+PSBtaW5UaW1lO1xuICogfVxuICogYGBgXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIGRheXNJbldlZWtcbiAqIEBzdW1tYXJ5IERheXMgaW4gMSB3ZWVrLlxuICovXG5leHBvcnQgY29uc3QgZGF5c0luV2VlayA9IDc7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBkYXlzSW5ZZWFyXG4gKiBAc3VtbWFyeSBEYXlzIGluIDEgeWVhci5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhvdyBtYW55IGRheXMgaW4gYSB5ZWFyLlxuICpcbiAqIE9uZSB5ZWFycyBlcXVhbHMgMzY1LjI0MjUgZGF5cyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6XG4gKlxuICogPiBMZWFwIHllYXIgb2NjdXJzIGV2ZXJ5IDQgeWVhcnMsIGV4Y2VwdCBmb3IgeWVhcnMgdGhhdCBhcmUgZGl2aXNpYmxlIGJ5IDEwMCBhbmQgbm90IGRpdmlzaWJsZSBieSA0MDAuXG4gKiA+IDEgbWVhbiB5ZWFyID0gKDM2NSsxLzQtMS8xMDArMS80MDApIGRheXMgPSAzNjUuMjQyNSBkYXlzXG4gKi9cbmV4cG9ydCBjb25zdCBkYXlzSW5ZZWFyID0gMzY1LjI0MjU7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtYXhUaW1lXG4gKiBAc3VtbWFyeSBNYXhpbXVtIGFsbG93ZWQgdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbWF4VGltZSB9IGZyb20gXCIuL2NvbnN0YW50cy9kYXRlLWZucy9jb25zdGFudHNcIjtcbiAqXG4gKiBjb25zdCBpc1ZhbGlkID0gODY0MDAwMDAwMDAwMDAwMSA8PSBtYXhUaW1lO1xuICogLy89PiBmYWxzZVxuICpcbiAqIG5ldyBEYXRlKDg2NDAwMDAwMDAwMDAwMDEpO1xuICogLy89PiBJbnZhbGlkIERhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IG1heFRpbWUgPSBNYXRoLnBvdygxMCwgOCkgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWluVGltZVxuICogQHN1bW1hcnkgTWluaW11bSBhbGxvd2VkIHRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IG1pblRpbWUgfSBmcm9tIFwiLi9jb25zdGFudHMvZGF0ZS1mbnMvY29uc3RhbnRzXCI7XG4gKlxuICogY29uc3QgaXNWYWxpZCA9IC04NjQwMDAwMDAwMDAwMDAxID49IG1pblRpbWU7XG4gKiAvLz0+IGZhbHNlXG4gKlxuICogbmV3IERhdGUoLTg2NDAwMDAwMDAwMDAwMDEpXG4gKiAvLz0+IEludmFsaWQgRGF0ZVxuICovXG5leHBvcnQgY29uc3QgbWluVGltZSA9IC1tYXhUaW1lO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5XZWVrXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSB3ZWVrLlxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5XZWVrID0gNjA0ODAwMDAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5EYXlcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIGRheS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luRGF5ID0gODY0MDAwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbk1pbnV0ZVxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgbWludXRlXG4gKi9cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZHNJbk1pbnV0ZSA9IDYwMDAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5Ib3VyXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBob3VyXG4gKi9cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZHNJbkhvdXIgPSAzNjAwMDAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5TZWNvbmRcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIHNlY29uZFxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5TZWNvbmQgPSAxMDAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luWWVhclxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIHllYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBtaW51dGVzSW5ZZWFyID0gNTI1NjAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luTW9udGhcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSBtb250aC5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbnV0ZXNJbk1vbnRoID0gNDMyMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5EYXlcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSBkYXkuXG4gKi9cbmV4cG9ydCBjb25zdCBtaW51dGVzSW5EYXkgPSAxNDQwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luSG91clxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIGhvdXIuXG4gKi9cbmV4cG9ydCBjb25zdCBtaW51dGVzSW5Ib3VyID0gNjA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtb250aHNJblF1YXJ0ZXJcbiAqIEBzdW1tYXJ5IE1vbnRocyBpbiAxIHF1YXJ0ZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBtb250aHNJblF1YXJ0ZXIgPSAzO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbW9udGhzSW5ZZWFyXG4gKiBAc3VtbWFyeSBNb250aHMgaW4gMSB5ZWFyLlxuICovXG5leHBvcnQgY29uc3QgbW9udGhzSW5ZZWFyID0gMTI7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBxdWFydGVyc0luWWVhclxuICogQHN1bW1hcnkgUXVhcnRlcnMgaW4gMSB5ZWFyXG4gKi9cbmV4cG9ydCBjb25zdCBxdWFydGVyc0luWWVhciA9IDQ7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5Ib3VyXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgaG91ci5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJbkhvdXIgPSAzNjAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luTWludXRlXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgbWludXRlLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luTWludXRlID0gNjA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5EYXlcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBkYXkuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5EYXkgPSBzZWNvbmRzSW5Ib3VyICogMjQ7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5XZWVrXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgd2Vlay5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJbldlZWsgPSBzZWNvbmRzSW5EYXkgKiA3O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luWWVhclxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIHllYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5ZZWFyID0gc2Vjb25kc0luRGF5ICogZGF5c0luWWVhcjtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbk1vbnRoXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgbW9udGhcbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJbk1vbnRoID0gc2Vjb25kc0luWWVhciAvIDEyO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luUXVhcnRlclxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIHF1YXJ0ZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5RdWFydGVyID0gc2Vjb25kc0luTW9udGggKiAzO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgY29uc3RydWN0RnJvbVN5bWJvbFxuICogQHN1bW1hcnkgU3ltYm9sIGVuYWJsaW5nIERhdGUgZXh0ZW5zaW9ucyB0byBpbmhlcml0IHByb3BlcnRpZXMgZnJvbSB0aGUgcmVmZXJlbmNlIGRhdGUuXG4gKlxuICogVGhlIHN5bWJvbCBpcyB1c2VkIHRvIGVuYWJsZSB0aGUgYGNvbnN0cnVjdEZyb21gIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhIGRhdGVcbiAqIHVzaW5nIGEgcmVmZXJlbmNlIGRhdGUgYW5kIGEgdmFsdWUuIEl0IGFsbG93cyB0byB0cmFuc2ZlciBleHRyYSBwcm9wZXJ0aWVzXG4gKiBmcm9tIHRoZSByZWZlcmVuY2UgZGF0ZSB0byB0aGUgbmV3IGRhdGUuIEl0J3MgdXNlZnVsIGZvciBleHRlbnNpb25zIGxpa2VcbiAqIFtgVFpEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3R6KSB0aGF0IGFjY2VwdCBhIHRpbWUgem9uZSBhc1xuICogYSBjb25zdHJ1Y3RvciBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnN0cnVjdEZyb21TeW1ib2wgPSBTeW1ib2wuZm9yKFwiY29uc3RydWN0RGF0ZUZyb21cIik7XG4iLAogICAgImltcG9ydCB7IGNvbnN0cnVjdEZyb21TeW1ib2wgfSBmcm9tIFwiLi9jb25zdGFudHMuanNcIjtcblxuLyoqXG4gKiBAbmFtZSBjb25zdHJ1Y3RGcm9tXG4gKiBAY2F0ZWdvcnkgR2VuZXJpYyBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZGF0ZSB1c2luZyB0aGUgcmVmZXJlbmNlIGRhdGUgYW5kIHRoZSB2YWx1ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGZ1bmN0aW9uIGNvbnN0cnVjdHMgYSBuZXcgZGF0ZSB1c2luZyB0aGUgY29uc3RydWN0b3IgZnJvbSB0aGUgcmVmZXJlbmNlXG4gKiBkYXRlIGFuZCB0aGUgZ2l2ZW4gdmFsdWUuIEl0IGhlbHBzIHRvIGJ1aWxkIGdlbmVyaWMgZnVuY3Rpb25zIHRoYXQgYWNjZXB0XG4gKiBkYXRlIGV4dGVuc2lvbnMuXG4gKlxuICogSXQgZGVmYXVsdHMgdG8gYERhdGVgIGlmIHRoZSBwYXNzZWQgcmVmZXJlbmNlIGRhdGUgaXMgYSBudW1iZXIgb3IgYSBzdHJpbmcuXG4gKlxuICogU3RhcnRpbmcgZnJvbSB2My43LjAsIGl0IGFsbG93cyB0byBjb25zdHJ1Y3QgYSBkYXRlIHVzaW5nIGBbU3ltYm9sLmZvcihcImNvbnN0cnVjdERhdGVGcm9tXCIpXWBcbiAqIGVuYWJsaW5nIHRvIHRyYW5zZmVyIGV4dHJhIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVmZXJlbmNlIGRhdGUgdG8gdGhlIG5ldyBkYXRlLlxuICogSXQncyB1c2VmdWwgZm9yIGV4dGVuc2lvbnMgbGlrZSBbYFRaRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy90eilcbiAqIHRoYXQgYWNjZXB0IGEgdGltZSB6b25lIGFzIGEgY29uc3RydWN0b3IgYXJndW1lbnQuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgcmVmZXJlbmNlIGRhdGUgdG8gdGFrZSBjb25zdHJ1Y3RvciBmcm9tXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY3JlYXRlIHRoZSBkYXRlXG4gKlxuICogQHJldHVybnMgRGF0ZSBpbml0aWFsaXplZCB1c2luZyB0aGUgZ2l2ZW4gZGF0ZSBhbmQgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20vZGF0ZS1mbnNcIjtcbiAqXG4gKiAvLyBBIGZ1bmN0aW9uIHRoYXQgY2xvbmVzIGEgZGF0ZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCB0eXBlXG4gKiBmdW5jdGlvbiBjbG9uZURhdGU8RGF0ZVR5cGUgZXh0ZW5kcyBEYXRlPihkYXRlOiBEYXRlVHlwZSk6IERhdGVUeXBlIHtcbiAqICAgcmV0dXJuIGNvbnN0cnVjdEZyb20oXG4gKiAgICAgZGF0ZSwgLy8gVXNlIGNvbnN0cnVjdG9yIGZyb20gdGhlIGdpdmVuIGRhdGVcbiAqICAgICBkYXRlLmdldFRpbWUoKSAvLyBVc2UgdGhlIGRhdGUgdmFsdWUgdG8gY3JlYXRlIGEgbmV3IGRhdGVcbiAqICAgKTtcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdEZyb20oZGF0ZSwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBkYXRlID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBkYXRlKHZhbHVlKTtcblxuICBpZiAoZGF0ZSAmJiB0eXBlb2YgZGF0ZSA9PT0gXCJvYmplY3RcIiAmJiBjb25zdHJ1Y3RGcm9tU3ltYm9sIGluIGRhdGUpXG4gICAgcmV0dXJuIGRhdGVbY29uc3RydWN0RnJvbVN5bWJvbF0odmFsdWUpO1xuXG4gIGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIG5ldyBkYXRlLmNvbnN0cnVjdG9yKHZhbHVlKTtcblxuICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGNvbnN0cnVjdEZyb207XG4iLAogICAgImltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5cbi8qKlxuICogQG5hbWUgdG9EYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpdHMgY2xvbmUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgbnVtYmVyLCBpdCBpcyB0cmVhdGVkIGFzIGEgdGltZXN0YW1wLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBub25lIG9mIHRoZSBhYm92ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgSW52YWxpZCBEYXRlLlxuICpcbiAqIFN0YXJ0aW5nIGZyb20gdjMuNy4wLCBpdCBjbG9uZXMgYSBkYXRlIHVzaW5nIGBbU3ltYm9sLmZvcihcImNvbnN0cnVjdERhdGVGcm9tXCIpXWBcbiAqIGVuYWJsaW5nIHRvIHRyYW5zZmVyIGV4dHJhIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVmZXJlbmNlIGRhdGUgdG8gdGhlIG5ldyBkYXRlLlxuICogSXQncyB1c2VmdWwgZm9yIGV4dGVuc2lvbnMgbGlrZSBbYFRaRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy90eilcbiAqIHRoYXQgYWNjZXB0IGEgdGltZSB6b25lIGFzIGEgY29uc3RydWN0b3IgYXJndW1lbnQuXG4gKlxuICogKipOb3RlKio6ICphbGwqIERhdGUgYXJndW1lbnRzIHBhc3NlZCB0byBhbnkgKmRhdGUtZm5zKiBmdW5jdGlvbiBpcyBwcm9jZXNzZWQgYnkgYHRvRGF0ZWAuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBhcmd1bWVudCAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBkYXRlIGluIHRoZSBsb2NhbCB0aW1lIHpvbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ2xvbmUgdGhlIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSB0b0RhdGUobmV3IERhdGUoMjAxNCwgMSwgMTEsIDExLCAzMCwgMzApKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCB0aGUgdGltZXN0YW1wIHRvIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSB0b0RhdGUoMTM5MjA5ODQzMDAwMClcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0RhdGUoYXJndW1lbnQsIGNvbnRleHQpIHtcbiAgLy8gW1RPRE9dIEdldCByaWQgb2YgYHRvRGF0ZWAgb3IgYGNvbnN0cnVjdEZyb21gP1xuICByZXR1cm4gY29uc3RydWN0RnJvbShjb250ZXh0IHx8IGFyZ3VtZW50LCBhcmd1bWVudCk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgdG9EYXRlO1xuIiwKICAgICJsZXQgZGVmYXVsdE9wdGlvbnMgPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCkge1xuICByZXR1cm4gZGVmYXVsdE9wdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWZhdWx0T3B0aW9ucyhuZXdPcHRpb25zKSB7XG4gIGRlZmF1bHRPcHRpb25zID0gbmV3T3B0aW9ucztcbn1cbiIsCiAgICAiaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZXZWVrfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZldlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFN1biBBdWcgMzEgMjAxNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0aGUgd2VlayBzdGFydHMgb24gTW9uZGF5LCB0aGUgc3RhcnQgb2YgdGhlIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZXZWVrKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7XG4gIGNvbnN0IGRpZmYgPSAoZGF5IDwgd2Vla1N0YXJ0c09uID8gNyA6IDApICsgZGF5IC0gd2Vla1N0YXJ0c09uO1xuXG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpIC0gZGlmZik7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgc3RhcnRPZldlZWs7XG4iLAogICAgImltcG9ydCB7IHN0YXJ0T2ZXZWVrIH0gZnJvbSBcIi4vc3RhcnRPZldlZWsuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZJU09XZWVrfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZklTT1dlZWtcbiAqIEBjYXRlZ29yeSBJU08gV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mSVNPV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZJU09XZWVrKGRhdGUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHN0YXJ0T2ZXZWVrKGRhdGUsIHsgLi4ub3B0aW9ucywgd2Vla1N0YXJ0c09uOiAxIH0pO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZJU09XZWVrO1xuIiwKICAgICJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWsgfSBmcm9tIFwiLi9zdGFydE9mSVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBnZXRJU09XZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGdldElTT1dlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBJU08gd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUsXG4gKiB3aGljaCBhbHdheXMgc3RhcnRzIDMgZGF5cyBiZWZvcmUgdGhlIHllYXIncyBmaXJzdCBUaHVyc2RheS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBJU08td2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldElTT1dlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiAyMDA0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhciA9IGNvbnN0cnVjdEZyb20oX2RhdGUsIDApO1xuICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZk5leHRZZWFyID0gc3RhcnRPZklTT1dlZWsoZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhcik7XG5cbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhciA9IGNvbnN0cnVjdEZyb20oX2RhdGUsIDApO1xuICBmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyLnNldEZ1bGxZZWFyKHllYXIsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyKTtcblxuICBpZiAoX2RhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZOZXh0WWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhciArIDE7XG4gIH0gZWxzZSBpZiAoX2RhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZUaGlzWWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geWVhciAtIDE7XG4gIH1cbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRJU09XZWVrWWVhcjtcbiIsCiAgICAiaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4uL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIEdvb2dsZSBDaHJvbWUgYXMgb2YgNjcuMC4zMzk2Ljg3IGludHJvZHVjZWQgdGltZXpvbmVzIHdpdGggb2Zmc2V0IHRoYXQgaW5jbHVkZXMgc2Vjb25kcy5cbiAqIFRoZXkgdXN1YWxseSBhcHBlYXIgZm9yIGRhdGVzIHRoYXQgZGVub3RlIHRpbWUgYmVmb3JlIHRoZSB0aW1lem9uZXMgd2VyZSBpbnRyb2R1Y2VkXG4gKiAoZS5nLiBmb3IgJ0V1cm9wZS9QcmFndWUnIHRpbWV6b25lIHRoZSBvZmZzZXQgaXMgR01UKzAwOjU3OjQ0IGJlZm9yZSAxIE9jdG9iZXIgMTg5MVxuICogYW5kIEdNVCswMTowMDowMCBhZnRlciB0aGF0IGRhdGUpXG4gKlxuICogRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIHRoZSBvZmZzZXQgaW4gbWludXRlcyBhbmQgd291bGQgcmV0dXJuIDU3IGZvciB0aGUgZXhhbXBsZSBhYm92ZSxcbiAqIHdoaWNoIHdvdWxkIGxlYWQgdG8gaW5jb3JyZWN0IGNhbGN1bGF0aW9ucy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRpbWV6b25lIG9mZnNldCBpbiBtaWxsaXNlY29uZHMgdGhhdCB0YWtlcyBzZWNvbmRzIGluIGFjY291bnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSk7XG4gIGNvbnN0IHV0Y0RhdGUgPSBuZXcgRGF0ZShcbiAgICBEYXRlLlVUQyhcbiAgICAgIF9kYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBfZGF0ZS5nZXRNb250aCgpLFxuICAgICAgX2RhdGUuZ2V0RGF0ZSgpLFxuICAgICAgX2RhdGUuZ2V0SG91cnMoKSxcbiAgICAgIF9kYXRlLmdldE1pbnV0ZXMoKSxcbiAgICAgIF9kYXRlLmdldFNlY29uZHMoKSxcbiAgICAgIF9kYXRlLmdldE1pbGxpc2Vjb25kcygpLFxuICAgICksXG4gICk7XG4gIHV0Y0RhdGUuc2V0VVRDRnVsbFllYXIoX2RhdGUuZ2V0RnVsbFllYXIoKSk7XG4gIHJldHVybiArZGF0ZSAtICt1dGNEYXRlO1xufVxuIiwKICAgICJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4uL2NvbnN0cnVjdEZyb20uanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGVzKGNvbnRleHQsIC4uLmRhdGVzKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZSA9IGNvbnN0cnVjdEZyb20uYmluZChcbiAgICBudWxsLFxuICAgIGNvbnRleHQgfHwgZGF0ZXMuZmluZCgoZGF0ZSkgPT4gdHlwZW9mIGRhdGUgPT09IFwib2JqZWN0XCIpLFxuICApO1xuICByZXR1cm4gZGF0ZXMubWFwKG5vcm1hbGl6ZSk7XG59XG4iLAogICAgImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZkRheX0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZEYXlcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIGRheSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgZGF5IGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSBkYXlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgZGF5IGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZkRheShuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBUdWUgU2VwIDAyIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZEYXkoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgc3RhcnRPZkRheTtcbiIsCiAgICAiaW1wb3J0IHsgZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyB9IGZyb20gXCIuL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy5qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplRGF0ZXMgfSBmcm9tIFwiLi9fbGliL25vcm1hbGl6ZURhdGVzLmpzXCI7XG5pbXBvcnQgeyBtaWxsaXNlY29uZHNJbkRheSB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZkRheSB9IGZyb20gXCIuL3N0YXJ0T2ZEYXkuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5c30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5c1xuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBkYXlzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgZGF5cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy4gVGhpcyBtZWFucyB0aGF0IHRoZSB0aW1lcyBhcmUgcmVtb3ZlZFxuICogZnJvbSB0aGUgZGF0ZXMgYW5kIHRoZW4gdGhlIGRpZmZlcmVuY2UgaW4gZGF5cyBpcyBjYWxjdWxhdGVkLlxuICpcbiAqIEBwYXJhbSBsYXRlckRhdGUgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGVhcmxpZXJEYXRlIC0gVGhlIGVhcmxpZXIgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMiBKdWx5IDIwMTEgMjM6MDA6MDAgYW5kIDIgSnVseSAyMDEyIDAwOjAwOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKFxuICogICBuZXcgRGF0ZSgyMDEyLCA2LCAyLCAwLCAwKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDApXG4gKiApXG4gKiAvLz0+IDM2NlxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMiBKdWx5IDIwMTEgMjM6NTk6MDAgYW5kIDMgSnVseSAyMDExIDAwOjAxOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAzLCAwLCAxKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDU5KVxuICogKVxuICogLy89PiAxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKFxuICAgIG9wdGlvbnM/LmluLFxuICAgIGxhdGVyRGF0ZSxcbiAgICBlYXJsaWVyRGF0ZSxcbiAgKTtcblxuICBjb25zdCBsYXRlclN0YXJ0T2ZEYXkgPSBzdGFydE9mRGF5KGxhdGVyRGF0ZV8pO1xuICBjb25zdCBlYXJsaWVyU3RhcnRPZkRheSA9IHN0YXJ0T2ZEYXkoZWFybGllckRhdGVfKTtcblxuICBjb25zdCBsYXRlclRpbWVzdGFtcCA9XG4gICAgK2xhdGVyU3RhcnRPZkRheSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMobGF0ZXJTdGFydE9mRGF5KTtcbiAgY29uc3QgZWFybGllclRpbWVzdGFtcCA9XG4gICAgK2VhcmxpZXJTdGFydE9mRGF5IC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhlYXJsaWVyU3RhcnRPZkRheSk7XG5cbiAgLy8gUm91bmQgdGhlIG51bWJlciBvZiBkYXlzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIGRheSBpcyBub3QgY29uc3RhbnQgKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2ZcbiAgLy8gdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KS5cbiAgcmV0dXJuIE1hdGgucm91bmQoKGxhdGVyVGltZXN0YW1wIC0gZWFybGllclRpbWVzdGFtcCkgLyBtaWxsaXNlY29uZHNJbkRheSk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzO1xuIiwKICAgICJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuaW1wb3J0IHsgZ2V0SVNPV2Vla1llYXIgfSBmcm9tIFwiLi9nZXRJU09XZWVrWWVhci5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWsgfSBmcm9tIFwiLi9zdGFydE9mSVNPV2Vlay5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZklTT1dlZWtZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZklTT1dlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyLFxuICogd2hpY2ggYWx3YXlzIHN0YXJ0cyAzIGRheXMgYmVmb3JlIHRoZSB5ZWFyJ3MgZmlyc3QgVGh1cnNkYXkuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDU6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mSVNPV2Vla1llYXIobmV3IERhdGUoMjAwNSwgNiwgMikpXG4gKiAvLz0+IE1vbiBKYW4gMDMgMjAwNSAwMDowMDowMFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRPZklTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgeWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpO1xuICBjb25zdCBmb3VydGhPZkphbnVhcnkgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApO1xuICBmb3VydGhPZkphbnVhcnkuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIHN0YXJ0T2ZJU09XZWVrKGZvdXJ0aE9mSmFudWFyeSk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgc3RhcnRPZklTT1dlZWtZZWFyO1xuIiwKICAgICIvKipcbiAqIEBuYW1lIGlzRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSBkYXRlP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLiBUaGUgZnVuY3Rpb24gd29ya3MgZm9yIGRhdGVzIHRyYW5zZmVycmVkIGFjcm9zcyBpZnJhbWVzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgZGF0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgYSB2YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNEYXRlKG5ldyBEYXRlKCkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGFuIGludmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZShOYU4pKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBzb21lIHZhbHVlOlxuICogY29uc3QgcmVzdWx0ID0gaXNEYXRlKCcyMDE0LTAyLTMxJylcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGFuIG9iamVjdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSh7fSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IFwiW29iamVjdCBEYXRlXVwiKVxuICApO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGlzRGF0ZTtcbiIsCiAgICAiaW1wb3J0IHsgaXNEYXRlIH0gZnJvbSBcIi4vaXNEYXRlLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBAbmFtZSBpc1ZhbGlkXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBnaXZlbiBkYXRlIHZhbGlkP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyBmYWxzZSBpZiBhcmd1bWVudCBpcyBJbnZhbGlkIERhdGUgYW5kIHRydWUgb3RoZXJ3aXNlLlxuICogQXJndW1lbnQgaXMgY29udmVydGVkIHRvIERhdGUgdXNpbmcgYHRvRGF0ZWAuIFNlZSBbdG9EYXRlXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL3RvRGF0ZSlcbiAqIEludmFsaWQgRGF0ZSBpcyBhIERhdGUsIHdob3NlIHRpbWUgdmFsdWUgaXMgTmFOLlxuICpcbiAqIFRpbWUgdmFsdWUgb2YgRGF0ZTogaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS45LjEuMVxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF0ZSBpcyB2YWxpZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIHZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKG5ldyBEYXRlKDIwMTQsIDEsIDMxKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIHZhbHVlLCBjb252ZXJ0aWJsZSBpbnRvIGEgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQoMTM5MzgwNDgwMDAwMClcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIGludmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQobmV3IERhdGUoJycpKVxuICogLy89PiBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZChkYXRlKSB7XG4gIHJldHVybiAhKCghaXNEYXRlKGRhdGUpICYmIHR5cGVvZiBkYXRlICE9PSBcIm51bWJlclwiKSB8fCBpc05hTigrdG9EYXRlKGRhdGUpKSk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgaXNWYWxpZDtcbiIsCiAgICAiaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB5ZWFyIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZlllYXIobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwMCkpXG4gKiAvLz0+IFdlZCBKYW4gMDEgMjAxNCAwMDowMDowMFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRPZlllYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGRhdGVfLnNldEZ1bGxZZWFyKGRhdGVfLmdldEZ1bGxZZWFyKCksIDAsIDEpO1xuICBkYXRlXy5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGRhdGVfO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZZZWFyO1xuIiwKICAgICJjb25zdCBmb3JtYXREaXN0YW5jZUxvY2FsZSA9IHtcbiAgbGVzc1RoYW5YU2Vjb25kczoge1xuICAgIG9uZTogXCJsZXNzIHRoYW4gYSBzZWNvbmRcIixcbiAgICBvdGhlcjogXCJsZXNzIHRoYW4ge3tjb3VudH19IHNlY29uZHNcIixcbiAgfSxcblxuICB4U2Vjb25kczoge1xuICAgIG9uZTogXCIxIHNlY29uZFwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBzZWNvbmRzXCIsXG4gIH0sXG5cbiAgaGFsZkFNaW51dGU6IFwiaGFsZiBhIG1pbnV0ZVwiLFxuXG4gIGxlc3NUaGFuWE1pbnV0ZXM6IHtcbiAgICBvbmU6IFwibGVzcyB0aGFuIGEgbWludXRlXCIsXG4gICAgb3RoZXI6IFwibGVzcyB0aGFuIHt7Y291bnR9fSBtaW51dGVzXCIsXG4gIH0sXG5cbiAgeE1pbnV0ZXM6IHtcbiAgICBvbmU6IFwiMSBtaW51dGVcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gbWludXRlc1wiLFxuICB9LFxuXG4gIGFib3V0WEhvdXJzOiB7XG4gICAgb25lOiBcImFib3V0IDEgaG91clwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSBob3Vyc1wiLFxuICB9LFxuXG4gIHhIb3Vyczoge1xuICAgIG9uZTogXCIxIGhvdXJcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gaG91cnNcIixcbiAgfSxcblxuICB4RGF5czoge1xuICAgIG9uZTogXCIxIGRheVwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBkYXlzXCIsXG4gIH0sXG5cbiAgYWJvdXRYV2Vla3M6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSB3ZWVrXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IHdlZWtzXCIsXG4gIH0sXG5cbiAgeFdlZWtzOiB7XG4gICAgb25lOiBcIjEgd2Vla1wiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSB3ZWVrc1wiLFxuICB9LFxuXG4gIGFib3V0WE1vbnRoczoge1xuICAgIG9uZTogXCJhYm91dCAxIG1vbnRoXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IG1vbnRoc1wiLFxuICB9LFxuXG4gIHhNb250aHM6IHtcbiAgICBvbmU6IFwiMSBtb250aFwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBtb250aHNcIixcbiAgfSxcblxuICBhYm91dFhZZWFyczoge1xuICAgIG9uZTogXCJhYm91dCAxIHllYXJcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcblxuICB4WWVhcnM6IHtcbiAgICBvbmU6IFwiMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG5cbiAgb3ZlclhZZWFyczoge1xuICAgIG9uZTogXCJvdmVyIDEgeWVhclwiLFxuICAgIG90aGVyOiBcIm92ZXIge3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG5cbiAgYWxtb3N0WFllYXJzOiB7XG4gICAgb25lOiBcImFsbW9zdCAxIHllYXJcIixcbiAgICBvdGhlcjogXCJhbG1vc3Qge3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0RGlzdGFuY2UgPSAodG9rZW4sIGNvdW50LCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQ7XG5cbiAgY29uc3QgdG9rZW5WYWx1ZSA9IGZvcm1hdERpc3RhbmNlTG9jYWxlW3Rva2VuXTtcbiAgaWYgKHR5cGVvZiB0b2tlblZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZTtcbiAgfSBlbHNlIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub25lO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub3RoZXIucmVwbGFjZShcInt7Y291bnR9fVwiLCBjb3VudC50b1N0cmluZygpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5hZGRTdWZmaXgpIHtcbiAgICBpZiAob3B0aW9ucy5jb21wYXJpc29uICYmIG9wdGlvbnMuY29tcGFyaXNvbiA+IDApIHtcbiAgICAgIHJldHVybiBcImluIFwiICsgcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgXCIgYWdvXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBidWlsZEZvcm1hdExvbmdGbihhcmdzKSB7XG4gIHJldHVybiAob3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgLy8gVE9ETzogUmVtb3ZlIFN0cmluZygpXG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgY29uc3QgZm9ybWF0ID0gYXJncy5mb3JtYXRzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHNbYXJncy5kZWZhdWx0V2lkdGhdO1xuICAgIHJldHVybiBmb3JtYXQ7XG4gIH07XG59XG4iLAogICAgImltcG9ydCB7IGJ1aWxkRm9ybWF0TG9uZ0ZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRGb3JtYXRMb25nRm4uanNcIjtcblxuY29uc3QgZGF0ZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwiRUVFRSwgTU1NTSBkbywgeVwiLFxuICBsb25nOiBcIk1NTU0gZG8sIHlcIixcbiAgbWVkaXVtOiBcIk1NTSBkLCB5XCIsXG4gIHNob3J0OiBcIk1NL2RkL3l5eXlcIixcbn07XG5cbmNvbnN0IHRpbWVGb3JtYXRzID0ge1xuICBmdWxsOiBcImg6bW06c3MgYSB6enp6XCIsXG4gIGxvbmc6IFwiaDptbTpzcyBhIHpcIixcbiAgbWVkaXVtOiBcImg6bW06c3MgYVwiLFxuICBzaG9ydDogXCJoOm1tIGFcIixcbn07XG5cbmNvbnN0IGRhdGVUaW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJ7e2RhdGV9fSAnYXQnIHt7dGltZX19XCIsXG4gIGxvbmc6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBtZWRpdW06IFwie3tkYXRlfX0sIHt7dGltZX19XCIsXG4gIHNob3J0OiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdExvbmcgPSB7XG4gIGRhdGU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcblxuICB0aW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogdGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgZGF0ZVRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlVGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG59O1xuIiwKICAgICJjb25zdCBmb3JtYXRSZWxhdGl2ZUxvY2FsZSA9IHtcbiAgbGFzdFdlZWs6IFwiJ2xhc3QnIGVlZWUgJ2F0JyBwXCIsXG4gIHllc3RlcmRheTogXCIneWVzdGVyZGF5IGF0JyBwXCIsXG4gIHRvZGF5OiBcIid0b2RheSBhdCcgcFwiLFxuICB0b21vcnJvdzogXCIndG9tb3Jyb3cgYXQnIHBcIixcbiAgbmV4dFdlZWs6IFwiZWVlZSAnYXQnIHBcIixcbiAgb3RoZXI6IFwiUFwiLFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFJlbGF0aXZlID0gKHRva2VuLCBfZGF0ZSwgX2Jhc2VEYXRlLCBfb3B0aW9ucykgPT5cbiAgZm9ybWF0UmVsYXRpdmVMb2NhbGVbdG9rZW5dO1xuIiwKICAgICIvKipcbiAqIFRoZSBsb2NhbGl6ZSBmdW5jdGlvbiBhcmd1bWVudCBjYWxsYmFjayB3aGljaCBhbGxvd3MgdG8gY29udmVydCByYXcgdmFsdWUgdG9cbiAqIHRoZSBhY3R1YWwgdHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgdmFsdWVcbiAqL1xuXG4vKipcbiAqIFRoZSBtYXAgb2YgbG9jYWxpemVkIHZhbHVlcyBmb3IgZWFjaCB3aWR0aC5cbiAqL1xuXG4vKipcbiAqIFRoZSBpbmRleCB0eXBlIG9mIHRoZSBsb2NhbGUgdW5pdCB2YWx1ZS4gSXQgdHlwZXMgY29udmVyc2lvbiBvZiB1bml0cyBvZlxuICogdmFsdWVzIHRoYXQgZG9uJ3Qgc3RhcnQgYXQgMCAoaS5lLiBxdWFydGVycykuXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgdW5pdCB2YWx1ZSB0byB0aGUgdHVwbGUgb2YgdmFsdWVzLlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBlcmEgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIEJDLFxuICogdGhlIHNlY29uZCBlbGVtZW50IHJlcHJlc2VudHMgQUQuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIHF1YXJ0ZXIgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIFExLlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBkYXkgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIFN1bmRheS5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgbW9udGggdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIEphbnVhcnkuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTG9jYWxpemVGbihhcmdzKSB7XG4gIHJldHVybiAodmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gb3B0aW9ucz8uY29udGV4dCA/IFN0cmluZyhvcHRpb25zLmNvbnRleHQpIDogXCJzdGFuZGFsb25lXCI7XG5cbiAgICBsZXQgdmFsdWVzQXJyYXk7XG4gICAgaWYgKGNvbnRleHQgPT09IFwiZm9ybWF0dGluZ1wiICYmIGFyZ3MuZm9ybWF0dGluZ1ZhbHVlcykge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0Rm9ybWF0dGluZ1dpZHRoIHx8IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgICAgY29uc3Qgd2lkdGggPSBvcHRpb25zPy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGRlZmF1bHRXaWR0aDtcblxuICAgICAgdmFsdWVzQXJyYXkgPVxuICAgICAgICBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1tkZWZhdWx0V2lkdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucz8ud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDtcblxuICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLnZhbHVlc1t3aWR0aF0gfHwgYXJncy52YWx1ZXNbZGVmYXVsdFdpZHRoXTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBhcmdzLmFyZ3VtZW50Q2FsbGJhY2sgPyBhcmdzLmFyZ3VtZW50Q2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gRm9yIHNvbWUgcmVhc29uIFR5cGVTY3JpcHQganVzdCBkb24ndCB3YW50IHRvIG1hdGNoIGl0LCBubyBtYXR0ZXIgaG93IGhhcmQgd2UgdHJ5LiBJIGNoYWxsZW5nZSB5b3UgdG8gdHJ5IHRvIHJlbW92ZSBpdCFcbiAgICByZXR1cm4gdmFsdWVzQXJyYXlbaW5kZXhdO1xuICB9O1xufVxuIiwKICAgICJpbXBvcnQgeyBidWlsZExvY2FsaXplRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZExvY2FsaXplRm4uanNcIjtcblxuY29uc3QgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkJcIiwgXCJBXCJdLFxuICBhYmJyZXZpYXRlZDogW1wiQkNcIiwgXCJBRFwiXSxcbiAgd2lkZTogW1wiQmVmb3JlIENocmlzdFwiLCBcIkFubm8gRG9taW5pXCJdLFxufTtcblxuY29uc3QgcXVhcnRlclZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCJdLFxuICBhYmJyZXZpYXRlZDogW1wiUTFcIiwgXCJRMlwiLCBcIlEzXCIsIFwiUTRcIl0sXG4gIHdpZGU6IFtcIjFzdCBxdWFydGVyXCIsIFwiMm5kIHF1YXJ0ZXJcIiwgXCIzcmQgcXVhcnRlclwiLCBcIjR0aCBxdWFydGVyXCJdLFxufTtcblxuLy8gTm90ZTogaW4gRW5nbGlzaCwgdGhlIG5hbWVzIG9mIGRheXMgb2YgdGhlIHdlZWsgYW5kIG1vbnRocyBhcmUgY2FwaXRhbGl6ZWQuXG4vLyBJZiB5b3UgYXJlIG1ha2luZyBhIG5ldyBsb2NhbGUgYmFzZWQgb24gdGhpcyBvbmUsIGNoZWNrIGlmIHRoZSBzYW1lIGlzIHRydWUgZm9yIHRoZSBsYW5ndWFnZSB5b3UncmUgd29ya2luZyBvbi5cbi8vIEdlbmVyYWxseSwgZm9ybWF0dGVkIGRhdGVzIHNob3VsZCBsb29rIGxpa2UgdGhleSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHNlbnRlbmNlLFxuLy8gZS5nLiBpbiBTcGFuaXNoIGxhbmd1YWdlIHRoZSB3ZWVrZGF5cyBhbmQgbW9udGhzIHNob3VsZCBiZSBpbiB0aGUgbG93ZXJjYXNlLlxuY29uc3QgbW9udGhWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiSlwiLCBcIkZcIiwgXCJNXCIsIFwiQVwiLCBcIk1cIiwgXCJKXCIsIFwiSlwiLCBcIkFcIiwgXCJTXCIsIFwiT1wiLCBcIk5cIiwgXCJEXCJdLFxuICBhYmJyZXZpYXRlZDogW1xuICAgIFwiSmFuXCIsXG4gICAgXCJGZWJcIixcbiAgICBcIk1hclwiLFxuICAgIFwiQXByXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1blwiLFxuICAgIFwiSnVsXCIsXG4gICAgXCJBdWdcIixcbiAgICBcIlNlcFwiLFxuICAgIFwiT2N0XCIsXG4gICAgXCJOb3ZcIixcbiAgICBcIkRlY1wiLFxuICBdLFxuXG4gIHdpZGU6IFtcbiAgICBcIkphbnVhcnlcIixcbiAgICBcIkZlYnJ1YXJ5XCIsXG4gICAgXCJNYXJjaFwiLFxuICAgIFwiQXByaWxcIixcbiAgICBcIk1heVwiLFxuICAgIFwiSnVuZVwiLFxuICAgIFwiSnVseVwiLFxuICAgIFwiQXVndXN0XCIsXG4gICAgXCJTZXB0ZW1iZXJcIixcbiAgICBcIk9jdG9iZXJcIixcbiAgICBcIk5vdmVtYmVyXCIsXG4gICAgXCJEZWNlbWJlclwiLFxuICBdLFxufTtcblxuY29uc3QgZGF5VmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIlNcIiwgXCJNXCIsIFwiVFwiLCBcIldcIiwgXCJUXCIsIFwiRlwiLCBcIlNcIl0sXG4gIHNob3J0OiBbXCJTdVwiLCBcIk1vXCIsIFwiVHVcIiwgXCJXZVwiLCBcIlRoXCIsIFwiRnJcIiwgXCJTYVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXSxcbiAgd2lkZTogW1xuICAgIFwiU3VuZGF5XCIsXG4gICAgXCJNb25kYXlcIixcbiAgICBcIlR1ZXNkYXlcIixcbiAgICBcIldlZG5lc2RheVwiLFxuICAgIFwiVGh1cnNkYXlcIixcbiAgICBcIkZyaWRheVwiLFxuICAgIFwiU2F0dXJkYXlcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwiYVwiLFxuICAgIHBtOiBcInBcIixcbiAgICBtaWRuaWdodDogXCJtaVwiLFxuICAgIG5vb246IFwiblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcIkFNXCIsXG4gICAgcG06IFwiUE1cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwiYS5tLlwiLFxuICAgIHBtOiBcInAubS5cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxufTtcblxuY29uc3QgZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwiYVwiLFxuICAgIHBtOiBcInBcIixcbiAgICBtaWRuaWdodDogXCJtaVwiLFxuICAgIG5vb246IFwiblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcIkFNXCIsXG4gICAgcG06IFwiUE1cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwiYS5tLlwiLFxuICAgIHBtOiBcInAubS5cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxufTtcblxuY29uc3Qgb3JkaW5hbE51bWJlciA9IChkaXJ0eU51bWJlciwgX29wdGlvbnMpID0+IHtcbiAgY29uc3QgbnVtYmVyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTtcblxuICAvLyBJZiBvcmRpbmFsIG51bWJlcnMgZGVwZW5kIG9uIGNvbnRleHQsIGZvciBleGFtcGxlLFxuICAvLyBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBncmFtbWF0aWNhbCBnZW5kZXJzLFxuICAvLyB1c2UgYG9wdGlvbnMudW5pdGAuXG4gIC8vXG4gIC8vIGB1bml0YCBjYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RhdGUnLCAnZGF5T2ZZZWFyJyxcbiAgLy8gJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLlxuXG4gIGNvbnN0IHJlbTEwMCA9IG51bWJlciAlIDEwMDtcbiAgaWYgKHJlbTEwMCA+IDIwIHx8IHJlbTEwMCA8IDEwKSB7XG4gICAgc3dpdGNoIChyZW0xMDAgJSAxMCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJzdFwiO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJuZFwiO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJyZFwiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVtYmVyICsgXCJ0aFwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvY2FsaXplID0ge1xuICBvcmRpbmFsTnVtYmVyLFxuXG4gIGVyYTogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGVyYVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBxdWFydGVyOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogcXVhcnRlclZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGFyZ3VtZW50Q2FsbGJhY2s6IChxdWFydGVyKSA9PiBxdWFydGVyIC0gMSxcbiAgfSksXG5cbiAgbW9udGg6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBtb250aFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBkYXk6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBkYXlWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5UGVyaW9kOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gICAgZm9ybWF0dGluZ1ZhbHVlczogZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0Rm9ybWF0dGluZ1dpZHRoOiBcIndpZGVcIixcbiAgfSksXG59O1xuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gYnVpbGRNYXRjaEZuKGFyZ3MpIHtcbiAgcmV0dXJuIChzdHJpbmcsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucy53aWR0aDtcblxuICAgIGNvbnN0IG1hdGNoUGF0dGVybiA9XG4gICAgICAod2lkdGggJiYgYXJncy5tYXRjaFBhdHRlcm5zW3dpZHRoXSkgfHxcbiAgICAgIGFyZ3MubWF0Y2hQYXR0ZXJuc1thcmdzLmRlZmF1bHRNYXRjaFdpZHRoXTtcbiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN0cmluZy5tYXRjaChtYXRjaFBhdHRlcm4pO1xuXG4gICAgaWYgKCFtYXRjaFJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcblxuICAgIGNvbnN0IHBhcnNlUGF0dGVybnMgPVxuICAgICAgKHdpZHRoICYmIGFyZ3MucGFyc2VQYXR0ZXJuc1t3aWR0aF0pIHx8XG4gICAgICBhcmdzLnBhcnNlUGF0dGVybnNbYXJncy5kZWZhdWx0UGFyc2VXaWR0aF07XG5cbiAgICBjb25zdCBrZXkgPSBBcnJheS5pc0FycmF5KHBhcnNlUGF0dGVybnMpXG4gICAgICA/IGZpbmRJbmRleChwYXJzZVBhdHRlcm5zLCAocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpKVxuICAgICAgOiAvLyBbVE9ET10gLS0gSSBjaGFsbGVuZ2UgeW91IHRvIGZpeCB0aGUgdHlwZVxuICAgICAgICBmaW5kS2V5KHBhcnNlUGF0dGVybnMsIChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZykpO1xuXG4gICAgbGV0IHZhbHVlO1xuXG4gICAgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2sgPyBhcmdzLnZhbHVlQ2FsbGJhY2soa2V5KSA6IGtleTtcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFja1xuICAgICAgPyAvLyBbVE9ET10gLS0gSSBjaGFsbGVuZ2UgeW91IHRvIGZpeCB0aGUgdHlwZVxuICAgICAgICBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUpXG4gICAgICA6IHZhbHVlO1xuXG4gICAgY29uc3QgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG5cbiAgICByZXR1cm4geyB2YWx1ZSwgcmVzdCB9O1xuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIGlmIChcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiZcbiAgICAgIHByZWRpY2F0ZShvYmplY3Rba2V5XSlcbiAgICApIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlKSB7XG4gIGZvciAobGV0IGtleSA9IDA7IGtleSA8IGFycmF5Lmxlbmd0aDsga2V5KyspIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2tleV0pKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gYnVpbGRNYXRjaFBhdHRlcm5GbihhcmdzKSB7XG4gIHJldHVybiAoc3RyaW5nLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLm1hdGNoUGF0dGVybik7XG4gICAgaWYgKCFtYXRjaFJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbWF0Y2hlZFN0cmluZyA9IG1hdGNoUmVzdWx0WzBdO1xuXG4gICAgY29uc3QgcGFyc2VSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5wYXJzZVBhdHRlcm4pO1xuICAgIGlmICghcGFyc2VSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGxldCB2YWx1ZSA9IGFyZ3MudmFsdWVDYWxsYmFja1xuICAgICAgPyBhcmdzLnZhbHVlQ2FsbGJhY2socGFyc2VSZXN1bHRbMF0pXG4gICAgICA6IHBhcnNlUmVzdWx0WzBdO1xuXG4gICAgLy8gW1RPRE9dIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHsgdmFsdWUsIHJlc3QgfTtcbiAgfTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgYnVpbGRNYXRjaEZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRNYXRjaEZuLmpzXCI7XG5pbXBvcnQgeyBidWlsZE1hdGNoUGF0dGVybkZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi5qc1wiO1xuXG5jb25zdCBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL14oXFxkKykodGh8c3R8bmR8cmQpPy9pO1xuY29uc3QgcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9cXGQrL2k7XG5cbmNvbnN0IG1hdGNoRXJhUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14oYnxhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oYlxcLj9cXHM/Y1xcLj98YlxcLj9cXHM/Y1xcLj9cXHM/ZVxcLj98YVxcLj9cXHM/ZFxcLj98Y1xcLj9cXHM/ZVxcLj8pL2ksXG4gIHdpZGU6IC9eKGJlZm9yZSBjaHJpc3R8YmVmb3JlIGNvbW1vbiBlcmF8YW5ubyBkb21pbml8Y29tbW9uIGVyYSkvaSxcbn07XG5jb25zdCBwYXJzZUVyYVBhdHRlcm5zID0ge1xuICBhbnk6IFsvXmIvaSwgL14oYXxjKS9pXSxcbn07XG5cbmNvbnN0IG1hdGNoUXVhcnRlclBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eWzEyMzRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXnFbMTIzNF0vaSxcbiAgd2lkZTogL15bMTIzNF0odGh8c3R8bmR8cmQpPyBxdWFydGVyL2ksXG59O1xuY29uc3QgcGFyc2VRdWFydGVyUGF0dGVybnMgPSB7XG4gIGFueTogWy8xL2ksIC8yL2ksIC8zL2ksIC80L2ldLFxufTtcblxuY29uc3QgbWF0Y2hNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eW2pmbWFzb25kXS9pLFxuICBhYmJyZXZpYXRlZDogL14oamFufGZlYnxtYXJ8YXByfG1heXxqdW58anVsfGF1Z3xzZXB8b2N0fG5vdnxkZWMpL2ksXG4gIHdpZGU6IC9eKGphbnVhcnl8ZmVicnVhcnl8bWFyY2h8YXByaWx8bWF5fGp1bmV8anVseXxhdWd1c3R8c2VwdGVtYmVyfG9jdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXIpL2ksXG59O1xuY29uc3QgcGFyc2VNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFtcbiAgICAvXmovaSxcbiAgICAvXmYvaSxcbiAgICAvXm0vaSxcbiAgICAvXmEvaSxcbiAgICAvXm0vaSxcbiAgICAvXmovaSxcbiAgICAvXmovaSxcbiAgICAvXmEvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcblxuICBhbnk6IFtcbiAgICAvXmphL2ksXG4gICAgL15mL2ksXG4gICAgL15tYXIvaSxcbiAgICAvXmFwL2ksXG4gICAgL15tYXkvaSxcbiAgICAvXmp1bi9pLFxuICAgIC9eanVsL2ksXG4gICAgL15hdS9pLFxuICAgIC9ecy9pLFxuICAgIC9eby9pLFxuICAgIC9ebi9pLFxuICAgIC9eZC9pLFxuICBdLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltzbXR3Zl0vaSxcbiAgc2hvcnQ6IC9eKHN1fG1vfHR1fHdlfHRofGZyfHNhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oc3VufG1vbnx0dWV8d2VkfHRodXxmcml8c2F0KS9pLFxuICB3aWRlOiAvXihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSkvaSxcbn07XG5jb25zdCBwYXJzZURheVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFsvXnMvaSwgL15tL2ksIC9edC9pLCAvXncvaSwgL150L2ksIC9eZi9pLCAvXnMvaV0sXG4gIGFueTogWy9ec3UvaSwgL15tL2ksIC9edHUvaSwgL153L2ksIC9edGgvaSwgL15mL2ksIC9ec2EvaV0sXG59O1xuXG5jb25zdCBtYXRjaERheVBlcmlvZFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKGF8cHxtaXxufChpbiB0aGV8YXQpIChtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0KSkvaSxcbiAgYW55OiAvXihbYXBdXFwuP1xccz9tXFwuP3xtaWRuaWdodHxub29ufChpbiB0aGV8YXQpIChtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0KSkvaSxcbn07XG5jb25zdCBwYXJzZURheVBlcmlvZFBhdHRlcm5zID0ge1xuICBhbnk6IHtcbiAgICBhbTogL15hL2ksXG4gICAgcG06IC9ecC9pLFxuICAgIG1pZG5pZ2h0OiAvXm1pL2ksXG4gICAgbm9vbjogL15uby9pLFxuICAgIG1vcm5pbmc6IC9tb3JuaW5nL2ksXG4gICAgYWZ0ZXJub29uOiAvYWZ0ZXJub29uL2ksXG4gICAgZXZlbmluZzogL2V2ZW5pbmcvaSxcbiAgICBuaWdodDogL25pZ2h0L2ksXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgbWF0Y2ggPSB7XG4gIG9yZGluYWxOdW1iZXI6IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oe1xuICAgIG1hdGNoUGF0dGVybjogbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICBwYXJzZVBhdHRlcm46IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgdmFsdWVDYWxsYmFjazogKHZhbHVlKSA9PiBwYXJzZUludCh2YWx1ZSwgMTApLFxuICB9KSxcblxuICBlcmE6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hFcmFQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VFcmFQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gICAgdmFsdWVDYWxsYmFjazogKGluZGV4KSA9PiBpbmRleCArIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBkYXk6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hEYXlQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5UGVyaW9kOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwiYW55XCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG59O1xuIiwKICAgICJpbXBvcnQgeyBmb3JtYXREaXN0YW5jZSB9IGZyb20gXCIuL2VuLVVTL19saWIvZm9ybWF0RGlzdGFuY2UuanNcIjtcbmltcG9ydCB7IGZvcm1hdExvbmcgfSBmcm9tIFwiLi9lbi1VUy9fbGliL2Zvcm1hdExvbmcuanNcIjtcbmltcG9ydCB7IGZvcm1hdFJlbGF0aXZlIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qc1wiO1xuaW1wb3J0IHsgbG9jYWxpemUgfSBmcm9tIFwiLi9lbi1VUy9fbGliL2xvY2FsaXplLmpzXCI7XG5pbXBvcnQgeyBtYXRjaCB9IGZyb20gXCIuL2VuLVVTL19saWIvbWF0Y2guanNcIjtcblxuLyoqXG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgRW5nbGlzaCBsb2NhbGUgKFVuaXRlZCBTdGF0ZXMpLlxuICogQGxhbmd1YWdlIEVuZ2xpc2hcbiAqIEBpc28tNjM5LTIgZW5nXG4gKiBAYXV0aG9yIFNhc2hhIEtvc3MgW0Brb3Nzbm9jb3JwXShodHRwczovL2dpdGh1Yi5jb20va29zc25vY29ycClcbiAqIEBhdXRob3IgTGVzaGEgS29zcyBbQGxlc2hha29zc10oaHR0cHM6Ly9naXRodWIuY29tL2xlc2hha29zcylcbiAqL1xuZXhwb3J0IGNvbnN0IGVuVVMgPSB7XG4gIGNvZGU6IFwiZW4tVVNcIixcbiAgZm9ybWF0RGlzdGFuY2U6IGZvcm1hdERpc3RhbmNlLFxuICBmb3JtYXRMb25nOiBmb3JtYXRMb25nLFxuICBmb3JtYXRSZWxhdGl2ZTogZm9ybWF0UmVsYXRpdmUsXG4gIGxvY2FsaXplOiBsb2NhbGl6ZSxcbiAgbWF0Y2g6IG1hdGNoLFxuICBvcHRpb25zOiB7XG4gICAgd2Vla1N0YXJ0c09uOiAwIC8qIFN1bmRheSAqLyxcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDEsXG4gIH0sXG59O1xuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGVuVVM7XG4iLAogICAgImltcG9ydCB7IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyB9IGZyb20gXCIuL2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZlllYXIgfSBmcm9tIFwiLi9zdGFydE9mWWVhci5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBnZXREYXlPZlllYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXREYXlPZlllYXJcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBkYXkgb2YgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGRheSBvZiB0aGUgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGRheSBvZiB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIGRheSBvZiB0aGUgeWVhciBpcyAyIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldERheU9mWWVhcihuZXcgRGF0ZSgyMDE0LCA2LCAyKSlcbiAqIC8vPT4gMTgzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXlPZlllYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoX2RhdGUsIHN0YXJ0T2ZZZWFyKF9kYXRlKSk7XG4gIGNvbnN0IGRheU9mWWVhciA9IGRpZmYgKyAxO1xuICByZXR1cm4gZGF5T2ZZZWFyO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGdldERheU9mWWVhcjtcbiIsCiAgICAiaW1wb3J0IHsgbWlsbGlzZWNvbmRzSW5XZWVrIH0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mSVNPV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZJU09XZWVrLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mSVNPV2Vla1llYXIgfSBmcm9tIFwiLi9zdGFydE9mSVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0SVNPV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGdldElTT1dlZWtcbiAqIEBjYXRlZ29yeSBJU08gV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIElTTyB3ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBJU08gd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG9mIHRoZSBJU08td2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldElTT1dlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDUzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJU09XZWVrKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCBkaWZmID0gK3N0YXJ0T2ZJU09XZWVrKF9kYXRlKSAtICtzdGFydE9mSVNPV2Vla1llYXIoX2RhdGUpO1xuXG4gIC8vIFJvdW5kIHRoZSBudW1iZXIgb2Ygd2Vla3MgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciBiZWNhdXNlIHRoZSBudW1iZXIgb2ZcbiAgLy8gbWlsbGlzZWNvbmRzIGluIGEgd2VlayBpcyBub3QgY29uc3RhbnQgKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2ZcbiAgLy8gdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KS5cbiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIG1pbGxpc2Vjb25kc0luV2VlaykgKyAxO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGdldElTT1dlZWs7XG4iLAogICAgImltcG9ydCB7IGdldERlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZXZWVrIH0gZnJvbSBcIi4vc3RhcnRPZldlZWsuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0V2Vla1llYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrWWVhclxuICogQGNhdGVnb3J5IFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1RoZV9JU09fd2Vla19kYXRlX3N5c3RlbVxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgd2l0aCB0aGUgZGVmYXVsdCBzZXR0aW5ncz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNikpXG4gKiAvLz0+IDIwMDVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IGlmIHdlZWsgc3RhcnRzIG9uIFNhdHVyZGF5P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSwgeyB3ZWVrU3RhcnRzT246IDYgfSlcbiAqIC8vPT4gMjAwNFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgaWYgdGhlIGZpcnN0IHdlZWsgY29udGFpbnMgNCBKYW51YXJ5P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSwgeyBmaXJzdFdlZWtDb250YWluc0RhdGU6IDQgfSlcbiAqIC8vPT4gMjAwNFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2Vla1llYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCBmaXJzdFdlZWtPZk5leHRZZWFyID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZk5leHRZZWFyID0gc3RhcnRPZldlZWsoZmlyc3RXZWVrT2ZOZXh0WWVhciwgb3B0aW9ucyk7XG5cbiAgY29uc3QgZmlyc3RXZWVrT2ZUaGlzWWVhciA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0RnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZlRoaXNZZWFyID0gc3RhcnRPZldlZWsoZmlyc3RXZWVrT2ZUaGlzWWVhciwgb3B0aW9ucyk7XG5cbiAgaWYgKCtfZGF0ZSA+PSArc3RhcnRPZk5leHRZZWFyKSB7XG4gICAgcmV0dXJuIHllYXIgKyAxO1xuICB9IGVsc2UgaWYgKCtfZGF0ZSA+PSArc3RhcnRPZlRoaXNZZWFyKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZ2V0V2Vla1llYXI7XG4iLAogICAgImltcG9ydCB7IGdldERlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IGdldFdlZWtZZWFyIH0gZnJvbSBcIi4vZ2V0V2Vla1llYXIuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZXZWVrIH0gZnJvbSBcIi4vc3RhcnRPZldlZWsuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZXZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrWWVhclxuICogQGNhdGVnb3J5IFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDUgd2l0aCBkZWZhdWx0IHNldHRpbmdzOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBTdW4gRGVjIDI2IDIwMDQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDVcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHdlZWtcbiAqIC8vIGFuZCA0IEphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZXZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB5ZWFyID0gZ2V0V2Vla1llYXIoZGF0ZSwgb3B0aW9ucyk7XG4gIGNvbnN0IGZpcnN0V2VlayA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7XG4gIGZpcnN0V2Vlay5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWsuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IF9kYXRlID0gc3RhcnRPZldlZWsoZmlyc3RXZWVrLCBvcHRpb25zKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZXZWVrWWVhcjtcbiIsCiAgICAiaW1wb3J0IHsgbWlsbGlzZWNvbmRzSW5XZWVrIH0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mV2Vla1llYXIgfSBmcm9tIFwiLi9zdGFydE9mV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0V2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGdldFdlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbG9jYWwgd2VlayBpbmRleCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbG9jYWwgd2VlayBpbmRleCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNUaGVfSVNPX3dlZWtfZGF0ZV9zeXN0ZW1cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG9mIHRoZSBsb2NhbCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDIgSmFudWFyeSAyMDA1IHdpdGggZGVmYXVsdCBvcHRpb25zP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2VlayhuZXcgRGF0ZSgyMDA1LCAwLCAyKSlcbiAqIC8vPT4gMlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG9mIHRoZSBsb2NhbCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDIgSmFudWFyeSAyMDA1LFxuICogLy8gaWYgTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWssXG4gKiAvLyBhbmQgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIgYWx3YXlzIGNvbnRhaW5zIDQgSmFudWFyeT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMiksIHtcbiAqICAgd2Vla1N0YXJ0c09uOiAxLFxuICogICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDRcbiAqIH0pXG4gKiAvLz0+IDUzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWVrKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCBkaWZmID0gK3N0YXJ0T2ZXZWVrKF9kYXRlLCBvcHRpb25zKSAtICtzdGFydE9mV2Vla1llYXIoX2RhdGUsIG9wdGlvbnMpO1xuXG4gIC8vIFJvdW5kIHRoZSBudW1iZXIgb2Ygd2Vla3MgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciBiZWNhdXNlIHRoZSBudW1iZXIgb2ZcbiAgLy8gbWlsbGlzZWNvbmRzIGluIGEgd2VlayBpcyBub3QgY29uc3RhbnQgKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2ZcbiAgLy8gdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KS5cbiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIG1pbGxpc2Vjb25kc0luV2VlaykgKyAxO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGdldFdlZWs7XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBhZGRMZWFkaW5nWmVyb3MobnVtYmVyLCB0YXJnZXRMZW5ndGgpIHtcbiAgY29uc3Qgc2lnbiA9IG51bWJlciA8IDAgPyBcIi1cIiA6IFwiXCI7XG4gIGNvbnN0IG91dHB1dCA9IE1hdGguYWJzKG51bWJlcikudG9TdHJpbmcoKS5wYWRTdGFydCh0YXJnZXRMZW5ndGgsIFwiMFwiKTtcbiAgcmV0dXJuIHNpZ24gKyBvdXRwdXQ7XG59XG4iLAogICAgImltcG9ydCB7IGFkZExlYWRpbmdaZXJvcyB9IGZyb20gXCIuLi9hZGRMZWFkaW5nWmVyb3MuanNcIjtcblxuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKi9cblxuZXhwb3J0IGNvbnN0IGxpZ2h0Rm9ybWF0dGVycyA9IHtcbiAgLy8gWWVhclxuICB5KGRhdGUsIHRva2VuKSB7XG4gICAgLy8gRnJvbSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LTMxL3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0Zvcm1hdF90b2tlbnNcbiAgICAvLyB8IFllYXIgICAgIHwgICAgIHkgfCB5eSB8ICAgeXl5IHwgIHl5eXkgfCB5eXl5eSB8XG4gICAgLy8gfC0tLS0tLS0tLS18LS0tLS0tLXwtLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfFxuICAgIC8vIHwgQUQgMSAgICAgfCAgICAgMSB8IDAxIHwgICAwMDEgfCAgMDAwMSB8IDAwMDAxIHxcbiAgICAvLyB8IEFEIDEyICAgIHwgICAgMTIgfCAxMiB8ICAgMDEyIHwgIDAwMTIgfCAwMDAxMiB8XG4gICAgLy8gfCBBRCAxMjMgICB8ICAgMTIzIHwgMjMgfCAgIDEyMyB8ICAwMTIzIHwgMDAxMjMgfFxuICAgIC8vIHwgQUQgMTIzNCAgfCAgMTIzNCB8IDM0IHwgIDEyMzQgfCAgMTIzNCB8IDAxMjM0IHxcbiAgICAvLyB8IEFEIDEyMzQ1IHwgMTIzNDUgfCA0NSB8IDEyMzQ1IHwgMTIzNDUgfCAxMjM0NSB8XG5cbiAgICBjb25zdCBzaWduZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgY29uc3QgeWVhciA9IHNpZ25lZFllYXIgPiAwID8gc2lnbmVkWWVhciA6IDEgLSBzaWduZWRZZWFyO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModG9rZW4gPT09IFwieXlcIiA/IHllYXIgJSAxMDAgOiB5ZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIE1vbnRoXG4gIE0oZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICByZXR1cm4gdG9rZW4gPT09IFwiTVwiID8gU3RyaW5nKG1vbnRoICsgMSkgOiBhZGRMZWFkaW5nWmVyb3MobW9udGggKyAxLCAyKTtcbiAgfSxcblxuICAvLyBEYXkgb2YgdGhlIG1vbnRoXG4gIGQoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0RGF0ZSgpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGEoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXRlLmdldEhvdXJzKCkgLyAxMiA+PSAxID8gXCJwbVwiIDogXCJhbVwiO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImFcIjpcbiAgICAgIGNhc2UgXCJhYVwiOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgICBjYXNlIFwiYWFhYWFcIjpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZVswXTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlID09PSBcImFtXCIgPyBcImEubS5cIiA6IFwicC5tLlwiO1xuICAgIH1cbiAgfSxcblxuICAvLyBIb3VyIFsxLTEyXVxuICBoKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldEhvdXJzKCkgJSAxMiB8fCAxMiwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTIzXVxuICBIKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldEhvdXJzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWludXRlXG4gIG0oZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0TWludXRlcygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIFNlY29uZFxuICBzKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFNlY29uZHMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUyhkYXRlLCB0b2tlbikge1xuICAgIGNvbnN0IG51bWJlck9mRGlnaXRzID0gdG9rZW4ubGVuZ3RoO1xuICAgIGNvbnN0IG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgY29uc3QgZnJhY3Rpb25hbFNlY29uZHMgPSBNYXRoLnRydW5jKFxuICAgICAgbWlsbGlzZWNvbmRzICogTWF0aC5wb3coMTAsIG51bWJlck9mRGlnaXRzIC0gMyksXG4gICAgKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGZyYWN0aW9uYWxTZWNvbmRzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxufTtcbiIsCiAgICAiaW1wb3J0IHsgZ2V0RGF5T2ZZZWFyIH0gZnJvbSBcIi4uLy4uL2dldERheU9mWWVhci5qc1wiO1xuaW1wb3J0IHsgZ2V0SVNPV2VlayB9IGZyb20gXCIuLi8uLi9nZXRJU09XZWVrLmpzXCI7XG5pbXBvcnQgeyBnZXRJU09XZWVrWWVhciB9IGZyb20gXCIuLi8uLi9nZXRJU09XZWVrWWVhci5qc1wiO1xuaW1wb3J0IHsgZ2V0V2VlayB9IGZyb20gXCIuLi8uLi9nZXRXZWVrLmpzXCI7XG5pbXBvcnQgeyBnZXRXZWVrWWVhciB9IGZyb20gXCIuLi8uLi9nZXRXZWVrWWVhci5qc1wiO1xuXG5pbXBvcnQgeyBhZGRMZWFkaW5nWmVyb3MgfSBmcm9tIFwiLi4vYWRkTGVhZGluZ1plcm9zLmpzXCI7XG5pbXBvcnQgeyBsaWdodEZvcm1hdHRlcnMgfSBmcm9tIFwiLi9saWdodEZvcm1hdHRlcnMuanNcIjtcblxuY29uc3QgZGF5UGVyaW9kRW51bSA9IHtcbiAgYW06IFwiYW1cIixcbiAgcG06IFwicG1cIixcbiAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgbm9vbjogXCJub29uXCIsXG4gIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gIGV2ZW5pbmc6IFwiZXZlbmluZ1wiLFxuICBuaWdodDogXCJuaWdodFwiLFxufTtcblxuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgTWlsbGlzZWNvbmRzIGluIGRheSAgICAgICAgICAgIHxcbiAqIHwgIGIgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgIHwgIEIgIHwgRmxleGlibGUgZGF5IHBlcmlvZCAgICAgICAgICAgIHxcbiAqIHwgIGMgIHwgU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWsgIHwgIEMqIHwgTG9jYWxpemVkIGhvdXIgdy8gZGF5IHBlcmlvZCAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGUgIHwgTG9jYWwgZGF5IG9mIHdlZWsgICAgICAgICAgICAgIHwgIEUgIHwgRGF5IG9mIHdlZWsgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGYgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEYqIHwgRGF5IG9mIHdlZWsgaW4gbW9udGggICAgICAgICAgIHxcbiAqIHwgIGcqIHwgTW9kaWZpZWQgSnVsaWFuIGRheSAgICAgICAgICAgIHwgIEcgIHwgRXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGkhIHwgSVNPIGRheSBvZiB3ZWVrICAgICAgICAgICAgICAgIHwgIEkhIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgIHxcbiAqIHwgIGoqIHwgTG9jYWxpemVkIGhvdXIgdy8gZGF5IHBlcmlvZCAgIHwgIEoqIHwgTG9jYWxpemVkIGhvdXIgdy9vIGRheSBwZXJpb2QgIHxcbiAqIHwgIGsgIHwgSG91ciBbMS0yNF0gICAgICAgICAgICAgICAgICAgIHwgIEsgIHwgSG91ciBbMC0xMV0gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGwqIHwgKGRlcHJlY2F0ZWQpICAgICAgICAgICAgICAgICAgIHwgIEwgIHwgU3RhbmQtYWxvbmUgbW9udGggICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG4gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE4gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG8hIHwgT3JkaW5hbCBudW1iZXIgbW9kaWZpZXIgICAgICAgIHwgIE8gIHwgVGltZXpvbmUgKEdNVCkgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHAhIHwgTG9uZyBsb2NhbGl6ZWQgdGltZSAgICAgICAgICAgIHwgIFAhIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgIHxcbiAqIHwgIHEgIHwgU3RhbmQtYWxvbmUgcXVhcnRlciAgICAgICAgICAgIHwgIFEgIHwgUXVhcnRlciAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHIqIHwgUmVsYXRlZCBHcmVnb3JpYW4geWVhciAgICAgICAgIHwgIFIhIHwgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHQhIHwgU2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgICAgIHwgIFQhIHwgTWlsbGlzZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgIHxcbiAqIHwgIHUgIHwgRXh0ZW5kZWQgeWVhciAgICAgICAgICAgICAgICAgIHwgIFUqIHwgQ3ljbGljIHllYXIgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHYqIHwgVGltZXpvbmUgKGdlbmVyaWMgbm9uLWxvY2F0LikgIHwgIFYqIHwgVGltZXpvbmUgKGxvY2F0aW9uKSAgICAgICAgICAgIHxcbiAqIHwgIHcgIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgIHwgIFcqIHwgV2VlayBvZiBtb250aCAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHggIHwgVGltZXpvbmUgKElTTy04NjAxIHcvbyBaKSAgICAgIHwgIFggIHwgVGltZXpvbmUgKElTTy04NjAxKSAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciAgICAgIHxcbiAqIHwgIHogIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pIHwgIFoqIHwgVGltZXpvbmUgKGFsaWFzZXMpICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgISBhcmUgbm9uLXN0YW5kYXJkLCBidXQgaW1wbGVtZW50ZWQgYnkgZGF0ZS1mbnM6XG4gKiAtIGBvYCBtb2RpZmllcyB0aGUgcHJldmlvdXMgdG9rZW4gdG8gdHVybiBpdCBpbnRvIGFuIG9yZGluYWwgKHNlZSBgZm9ybWF0YCBkb2NzKVxuICogLSBgaWAgaXMgSVNPIGRheSBvZiB3ZWVrLiBGb3IgYGlgIGFuZCBgaWlgIGlzIHJldHVybnMgbnVtZXJpYyBJU08gd2VlayBkYXlzLFxuICogICBpLmUuIDcgZm9yIFN1bmRheSwgMSBmb3IgTW9uZGF5LCBldGMuXG4gKiAtIGBJYCBpcyBJU08gd2VlayBvZiB5ZWFyLCBhcyBvcHBvc2VkIHRvIGB3YCB3aGljaCBpcyBsb2NhbCB3ZWVrIG9mIHllYXIuXG4gKiAtIGBSYCBpcyBJU08gd2Vlay1udW1iZXJpbmcgeWVhciwgYXMgb3Bwb3NlZCB0byBgWWAgd2hpY2ggaXMgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhci5cbiAqICAgYFJgIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgSWAgYW5kIGBpYFxuICogICBmb3IgdW5pdmVyc2FsIElTTyB3ZWVrLW51bWJlcmluZyBkYXRlLCB3aGVyZWFzXG4gKiAgIGBZYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYHdgIGFuZCBgZWBcbiAqICAgZm9yIHdlZWstbnVtYmVyaW5nIGRhdGUgc3BlY2lmaWMgdG8gdGhlIGxvY2FsZS5cbiAqIC0gYFBgIGlzIGxvbmcgbG9jYWxpemVkIGRhdGUgZm9ybWF0XG4gKiAtIGBwYCBpcyBsb25nIGxvY2FsaXplZCB0aW1lIGZvcm1hdFxuICovXG5cbmV4cG9ydCBjb25zdCBmb3JtYXR0ZXJzID0ge1xuICAvLyBFcmFcbiAgRzogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGVyYSA9IGRhdGUuZ2V0RnVsbFllYXIoKSA+IDAgPyAxIDogMDtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBBRCwgQkNcbiAgICAgIGNhc2UgXCJHXCI6XG4gICAgICBjYXNlIFwiR0dcIjpcbiAgICAgIGNhc2UgXCJHR0dcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHsgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIiB9KTtcbiAgICAgIC8vIEEsIEJcbiAgICAgIGNhc2UgXCJHR0dHR1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwgeyB3aWR0aDogXCJuYXJyb3dcIiB9KTtcbiAgICAgIC8vIEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0XG4gICAgICBjYXNlIFwiR0dHR1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHsgd2lkdGg6IFwid2lkZVwiIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBZZWFyXG4gIHk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gXCJ5b1wiKSB7XG4gICAgICBjb25zdCBzaWduZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgLy8gUmV0dXJucyAxIGZvciAxIEJDICh3aGljaCBpcyB5ZWFyIDAgaW4gSmF2YVNjcmlwdClcbiAgICAgIGNvbnN0IHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHllYXIsIHsgdW5pdDogXCJ5ZWFyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy55KGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gIFk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzaWduZWRXZWVrWWVhciA9IGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpO1xuICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgY29uc3Qgd2Vla1llYXIgPSBzaWduZWRXZWVrWWVhciA+IDAgPyBzaWduZWRXZWVrWWVhciA6IDEgLSBzaWduZWRXZWVrWWVhcjtcblxuICAgIC8vIFR3byBkaWdpdCB5ZWFyXG4gICAgaWYgKHRva2VuID09PSBcIllZXCIpIHtcbiAgICAgIGNvbnN0IHR3b0RpZ2l0WWVhciA9IHdlZWtZZWFyICUgMTAwO1xuICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0d29EaWdpdFllYXIsIDIpO1xuICAgIH1cblxuICAgIC8vIE9yZGluYWwgbnVtYmVyXG4gICAgaWYgKHRva2VuID09PSBcIllvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHdlZWtZZWFyLCB7IHVuaXQ6IFwieWVhclwiIH0pO1xuICAgIH1cblxuICAgIC8vIFBhZGRpbmdcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWtZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gIFI6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIGNvbnN0IGlzb1dlZWtZZWFyID0gZ2V0SVNPV2Vla1llYXIoZGF0ZSk7XG5cbiAgICAvLyBQYWRkaW5nXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29XZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBFeHRlbmRlZCB5ZWFyLiBUaGlzIGlzIGEgc2luZ2xlIG51bWJlciBkZXNpZ25hdGluZyB0aGUgeWVhciBvZiB0aGlzIGNhbGVuZGFyIHN5c3RlbS5cbiAgLy8gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIGxvY2FsaXplcnMgYXJlIEIuQy4geWVhcnM6XG4gIC8vIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gIC8vIHwtLS0tLS18LS0tLS18LS0tLS18XG4gIC8vIHwgQUMgMSB8ICAgMSB8ICAgMSB8XG4gIC8vIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gIC8vIHwgQkMgMiB8ICAgMiB8ICAtMSB8XG4gIC8vIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAgLy8gd2hpbGUgYHV1YCBwYWRzIHNpbmdsZSBkaWdpdCB5ZWFycyB0byAyIGNoYXJhY3RlcnMgYW5kIHJldHVybnMgb3RoZXIgeWVhcnMgdW5jaGFuZ2VkLlxuICB1OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoeWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBRdWFydGVyXG4gIFE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJRXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSBcIlFRXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MocXVhcnRlciwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcbiAgICAgIGNhc2UgXCJRb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6IFwicXVhcnRlclwiIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgXCJRUVFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwiUVFRUVFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwiUVFRUVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIHF1YXJ0ZXJcbiAgcTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IHF1YXJ0ZXIgPSBNYXRoLmNlaWwoKGRhdGUuZ2V0TW9udGgoKSArIDEpIC8gMyk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgMywgNFxuICAgICAgY2FzZSBcInFcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhxdWFydGVyKTtcbiAgICAgIC8vIDAxLCAwMiwgMDMsIDA0XG4gICAgICBjYXNlIFwicXFcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhxdWFydGVyLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aFxuICAgICAgY2FzZSBcInFvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHF1YXJ0ZXIsIHsgdW5pdDogXCJxdWFydGVyXCIgfSk7XG4gICAgICAvLyBRMSwgUTIsIFEzLCBRNFxuICAgICAgY2FzZSBcInFxcVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcbiAgICAgIGNhc2UgXCJxcXFxcVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi5cbiAgICAgIGNhc2UgXCJxcXFxXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gTW9udGhcbiAgTTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJNXCI6XG4gICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5NKGRhdGUsIHRva2VuKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGhcbiAgICAgIGNhc2UgXCJNb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihtb250aCArIDEsIHsgdW5pdDogXCJtb250aFwiIH0pO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG4gICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSiwgRiwgLi4uLCBEXG4gICAgICBjYXNlIFwiTU1NTU1cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcbiAgICAgIGNhc2UgXCJNTU1NXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gU3RhbmQtYWxvbmUgbW9udGhcbiAgTDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcobW9udGggKyAxKTtcbiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMlxuICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobW9udGggKyAxLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGhcbiAgICAgIGNhc2UgXCJMb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihtb250aCArIDEsIHsgdW5pdDogXCJtb250aFwiIH0pO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG4gICAgICBjYXNlIFwiTExMXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSiwgRiwgLi4uLCBEXG4gICAgICBjYXNlIFwiTExMTExcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcbiAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gTG9jYWwgd2VlayBvZiB5ZWFyXG4gIHc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB3ZWVrID0gZ2V0V2VlayhkYXRlLCBvcHRpb25zKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJ3b1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrLCB7IHVuaXQ6IFwid2Vla1wiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3Mod2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBJU08gd2VlayBvZiB5ZWFyXG4gIEk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBpc29XZWVrID0gZ2V0SVNPV2VlayhkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJJb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihpc29XZWVrLCB7IHVuaXQ6IFwid2Vla1wiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvV2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBEYXkgb2YgdGhlIG1vbnRoXG4gIGQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwiZG9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXREYXRlKCksIHsgdW5pdDogXCJkYXRlXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5kKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBEYXkgb2YgeWVhclxuICBEOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZZZWFyID0gZ2V0RGF5T2ZZZWFyKGRhdGUpO1xuXG4gICAgaWYgKHRva2VuID09PSBcIkRvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRheU9mWWVhciwgeyB1bml0OiBcImRheU9mWWVhclwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF5T2ZZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIERheSBvZiB3ZWVrXG4gIEU6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJFRVwiOlxuICAgICAgY2FzZSBcIkVFRVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcIkVFRUVFXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJFRUVFRUVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJFRUVFXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIExvY2FsIGRheSBvZiB3ZWVrXG4gIGU6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChOdGggZGF5IG9mIHdlZWsgd2l0aCBjdXJyZW50IGxvY2FsZSBvciB3ZWVrU3RhcnRzT24pXG4gICAgICBjYXNlIFwiZVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGxvY2FsRGF5T2ZXZWVrKTtcbiAgICAgIC8vIFBhZGRlZCBudW1lcmljYWwgdmFsdWVcbiAgICAgIGNhc2UgXCJlZVwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGxvY2FsRGF5T2ZXZWVrLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDd0aFxuICAgICAgY2FzZSBcImVvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGxvY2FsRGF5T2ZXZWVrLCB7IHVuaXQ6IFwiZGF5XCIgfSk7XG4gICAgICBjYXNlIFwiZWVlXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImVlZWVlZVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImVlZWVcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWtcbiAgYzogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7XG4gICAgY29uc3QgbG9jYWxEYXlPZldlZWsgPSAoZGF5T2ZXZWVrIC0gb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA4KSAlIDcgfHwgNztcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKHNhbWUgYXMgaW4gYGVgKVxuICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG4gICAgICBjYXNlIFwiY2NcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhsb2NhbERheU9mV2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDd0aFxuICAgICAgY2FzZSBcImNvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGxvY2FsRGF5T2ZXZWVrLCB7IHVuaXQ6IFwiZGF5XCIgfSk7XG4gICAgICBjYXNlIFwiY2NjXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiY2NjY2NcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImNjY2NjY1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImNjY2NcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSVNPIGRheSBvZiB3ZWVrXG4gIGk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGlzb0RheU9mV2VlayA9IGRheU9mV2VlayA9PT0gMCA/IDcgOiBkYXlPZldlZWs7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMlxuICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhpc29EYXlPZldlZWspO1xuICAgICAgLy8gMDJcbiAgICAgIGNhc2UgXCJpaVwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGlzb0RheU9mV2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgICAgIC8vIDJuZFxuICAgICAgY2FzZSBcImlvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGlzb0RheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlIFwiaWlpXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImlpaWlpaVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImlpaWlcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQU0gb3IgUE1cbiAgYTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGNvbnN0IGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICBjYXNlIFwiYWFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJhYWFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplXG4gICAgICAgICAgLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgY2FzZSBcImFhYWFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcImFhYWFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQU0sIFBNLCBtaWRuaWdodCwgbm9vblxuICBiOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgbGV0IGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICBpZiAoaG91cnMgPT09IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA9PT0gMCkge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5taWRuaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gaG91cnMgLyAxMiA+PSAxID8gXCJwbVwiIDogXCJhbVwiO1xuICAgIH1cblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJiXCI6XG4gICAgICBjYXNlIFwiYmJcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplXG4gICAgICAgICAgLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgY2FzZSBcImJiYmJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcImJiYmJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gaW4gdGhlIG1vcm5pbmcsIGluIHRoZSBhZnRlcm5vb24sIGluIHRoZSBldmVuaW5nLCBhdCBuaWdodFxuICBCOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgbGV0IGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICBpZiAoaG91cnMgPj0gMTcpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0uZXZlbmluZztcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmFmdGVybm9vbjtcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDQpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubW9ybmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5uaWdodDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiQlwiOlxuICAgICAgY2FzZSBcIkJCXCI6XG4gICAgICBjYXNlIFwiQkJCXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiQkJCQkJcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiQkJCQlwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBIb3VyIFsxLTEyXVxuICBoOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcImhvXCIpIHtcbiAgICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyO1xuICAgICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDEyO1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5oKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTIzXVxuICBIOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcIkhvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0SG91cnMoKSwgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLkgoZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIEhvdXIgWzAtMTFdXG4gIEs6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyO1xuXG4gICAgaWYgKHRva2VuID09PSBcIktvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0yNF1cbiAgazogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBpZiAoaG91cnMgPT09IDApIGhvdXJzID0gMjQ7XG5cbiAgICBpZiAodG9rZW4gPT09IFwia29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhob3VycywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaW51dGVcbiAgbTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJtb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldE1pbnV0ZXMoKSwgeyB1bml0OiBcIm1pbnV0ZVwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMubShkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gU2Vjb25kXG4gIHM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwic29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRTZWNvbmRzKCksIHsgdW5pdDogXCJzZWNvbmRcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLnMoZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIEZyYWN0aW9uIG9mIHNlY29uZFxuICBTOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLlMoZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBhbHdheXMgYCdaJ2ApXG4gIFg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBpZiAodGltZXpvbmVPZmZzZXQgPT09IDApIHtcbiAgICAgIHJldHVybiBcIlpcIjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlc1xuICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYYFxuICAgICAgY2FzZSBcIlhYWFhcIjpcbiAgICAgIGNhc2UgXCJYWFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTtcblxuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgWFhYYFxuICAgICAgY2FzZSBcIlhYWFhYXCI6XG4gICAgICBjYXNlIFwiWFhYXCI6IC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBgJyswMDowMCdgIG9yIGVxdWl2YWxlbnQpXG4gIHg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlc1xuICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4YFxuICAgICAgY2FzZSBcInh4eHhcIjpcbiAgICAgIGNhc2UgXCJ4eFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTtcblxuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHh4YFxuICAgICAgY2FzZSBcInh4eHh4XCI6XG4gICAgICBjYXNlIFwieHh4XCI6IC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRpbWV6b25lIChHTVQpXG4gIE86IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBTaG9ydFxuICAgICAgY2FzZSBcIk9cIjpcbiAgICAgIGNhc2UgXCJPT1wiOlxuICAgICAgY2FzZSBcIk9PT1wiOlxuICAgICAgICByZXR1cm4gXCJHTVRcIiArIGZvcm1hdFRpbWV6b25lU2hvcnQodGltZXpvbmVPZmZzZXQsIFwiOlwiKTtcbiAgICAgIC8vIExvbmdcbiAgICAgIGNhc2UgXCJPT09PXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJHTVRcIiArIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXRpb24pXG4gIHo6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBTaG9ydFxuICAgICAgY2FzZSBcInpcIjpcbiAgICAgIGNhc2UgXCJ6elwiOlxuICAgICAgY2FzZSBcInp6elwiOlxuICAgICAgICByZXR1cm4gXCJHTVRcIiArIGZvcm1hdFRpbWV6b25lU2hvcnQodGltZXpvbmVPZmZzZXQsIFwiOlwiKTtcbiAgICAgIC8vIExvbmdcbiAgICAgIGNhc2UgXCJ6enp6XCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJHTVRcIiArIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgfVxuICB9LFxuXG4gIC8vIFNlY29uZHMgdGltZXN0YW1wXG4gIHQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gTWF0aC50cnVuYygrZGF0ZSAvIDEwMDApO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModGltZXN0YW1wLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIE1pbGxpc2Vjb25kcyB0aW1lc3RhbXBcbiAgVDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKCtkYXRlLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxufTtcblxuZnVuY3Rpb24gZm9ybWF0VGltZXpvbmVTaG9ydChvZmZzZXQsIGRlbGltaXRlciA9IFwiXCIpIHtcbiAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiO1xuICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICBjb25zdCBob3VycyA9IE1hdGgudHJ1bmMoYWJzT2Zmc2V0IC8gNjApO1xuICBjb25zdCBtaW51dGVzID0gYWJzT2Zmc2V0ICUgNjA7XG4gIGlmIChtaW51dGVzID09PSAwKSB7XG4gICAgcmV0dXJuIHNpZ24gKyBTdHJpbmcoaG91cnMpO1xuICB9XG4gIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKSArIGRlbGltaXRlciArIGFkZExlYWRpbmdaZXJvcyhtaW51dGVzLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGltZXpvbmVXaXRoT3B0aW9uYWxNaW51dGVzKG9mZnNldCwgZGVsaW1pdGVyKSB7XG4gIGlmIChvZmZzZXQgJSA2MCA9PT0gMCkge1xuICAgIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIjtcbiAgICByZXR1cm4gc2lnbiArIGFkZExlYWRpbmdaZXJvcyhNYXRoLmFicyhvZmZzZXQpIC8gNjAsIDIpO1xuICB9XG4gIHJldHVybiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRlbGltaXRlcik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGVsaW1pdGVyID0gXCJcIikge1xuICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCI7XG4gIGNvbnN0IGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7XG4gIGNvbnN0IGhvdXJzID0gYWRkTGVhZGluZ1plcm9zKE1hdGgudHJ1bmMoYWJzT2Zmc2V0IC8gNjApLCAyKTtcbiAgY29uc3QgbWludXRlcyA9IGFkZExlYWRpbmdaZXJvcyhhYnNPZmZzZXQgJSA2MCwgMik7XG4gIHJldHVybiBzaWduICsgaG91cnMgKyBkZWxpbWl0ZXIgKyBtaW51dGVzO1xufVxuIiwKICAgICJjb25zdCBkYXRlTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIHN3aXRjaCAocGF0dGVybikge1xuICAgIGNhc2UgXCJQXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwic2hvcnRcIiB9KTtcbiAgICBjYXNlIFwiUFBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoeyB3aWR0aDogXCJtZWRpdW1cIiB9KTtcbiAgICBjYXNlIFwiUFBQXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgIGNhc2UgXCJQUFBQXCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoeyB3aWR0aDogXCJmdWxsXCIgfSk7XG4gIH1cbn07XG5cbmNvbnN0IHRpbWVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcpID0+IHtcbiAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgY2FzZSBcInBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJzaG9ydFwiIH0pO1xuICAgIGNhc2UgXCJwcFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7IHdpZHRoOiBcIm1lZGl1bVwiIH0pO1xuICAgIGNhc2UgXCJwcHBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJsb25nXCIgfSk7XG4gICAgY2FzZSBcInBwcHBcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7IHdpZHRoOiBcImZ1bGxcIiB9KTtcbiAgfVxufTtcblxuY29uc3QgZGF0ZVRpbWVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcpID0+IHtcbiAgY29uc3QgbWF0Y2hSZXN1bHQgPSBwYXR0ZXJuLm1hdGNoKC8oUCspKHArKT8vKSB8fCBbXTtcbiAgY29uc3QgZGF0ZVBhdHRlcm4gPSBtYXRjaFJlc3VsdFsxXTtcbiAgY29uc3QgdGltZVBhdHRlcm4gPSBtYXRjaFJlc3VsdFsyXTtcblxuICBpZiAoIXRpbWVQYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGVMb25nRm9ybWF0dGVyKHBhdHRlcm4sIGZvcm1hdExvbmcpO1xuICB9XG5cbiAgbGV0IGRhdGVUaW1lRm9ybWF0O1xuXG4gIHN3aXRjaCAoZGF0ZVBhdHRlcm4pIHtcbiAgICBjYXNlIFwiUFwiOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwic2hvcnRcIiB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQUFwiOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwibWVkaXVtXCIgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUFBQXCI6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoeyB3aWR0aDogXCJsb25nXCIgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUFBQUFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoeyB3aWR0aDogXCJmdWxsXCIgfSk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBkYXRlVGltZUZvcm1hdFxuICAgIC5yZXBsYWNlKFwie3tkYXRlfX1cIiwgZGF0ZUxvbmdGb3JtYXR0ZXIoZGF0ZVBhdHRlcm4sIGZvcm1hdExvbmcpKVxuICAgIC5yZXBsYWNlKFwie3t0aW1lfX1cIiwgdGltZUxvbmdGb3JtYXR0ZXIodGltZVBhdHRlcm4sIGZvcm1hdExvbmcpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBsb25nRm9ybWF0dGVycyA9IHtcbiAgcDogdGltZUxvbmdGb3JtYXR0ZXIsXG4gIFA6IGRhdGVUaW1lTG9uZ0Zvcm1hdHRlcixcbn07XG4iLAogICAgImNvbnN0IGRheU9mWWVhclRva2VuUkUgPSAvXkQrJC87XG5jb25zdCB3ZWVrWWVhclRva2VuUkUgPSAvXlkrJC87XG5cbmNvbnN0IHRocm93VG9rZW5zID0gW1wiRFwiLCBcIkREXCIsIFwiWVlcIiwgXCJZWVlZXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gZGF5T2ZZZWFyVG9rZW5SRS50ZXN0KHRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gd2Vla1llYXJUb2tlblJFLnRlc3QodG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcih0b2tlbiwgZm9ybWF0LCBpbnB1dCkge1xuICBjb25zdCBfbWVzc2FnZSA9IG1lc3NhZ2UodG9rZW4sIGZvcm1hdCwgaW5wdXQpO1xuICBjb25zb2xlLndhcm4oX21lc3NhZ2UpO1xuICBpZiAodGhyb3dUb2tlbnMuaW5jbHVkZXModG9rZW4pKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihfbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIG1lc3NhZ2UodG9rZW4sIGZvcm1hdCwgaW5wdXQpIHtcbiAgY29uc3Qgc3ViamVjdCA9IHRva2VuWzBdID09PSBcIllcIiA/IFwieWVhcnNcIiA6IFwiZGF5cyBvZiB0aGUgbW9udGhcIjtcbiAgcmV0dXJuIGBVc2UgXFxgJHt0b2tlbi50b0xvd2VyQ2FzZSgpfVxcYCBpbnN0ZWFkIG9mIFxcYCR7dG9rZW59XFxgIChpbiBcXGAke2Zvcm1hdH1cXGApIGZvciBmb3JtYXR0aW5nICR7c3ViamVjdH0gdG8gdGhlIGlucHV0IFxcYCR7aW5wdXR9XFxgOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRgO1xufVxuIiwKICAgICJpbXBvcnQgeyBkZWZhdWx0TG9jYWxlIH0gZnJvbSBcIi4vX2xpYi9kZWZhdWx0TG9jYWxlLmpzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIjtcbmltcG9ydCB7IGZvcm1hdHRlcnMgfSBmcm9tIFwiLi9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzLmpzXCI7XG5pbXBvcnQgeyBsb25nRm9ybWF0dGVycyB9IGZyb20gXCIuL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzLmpzXCI7XG5pbXBvcnQge1xuICBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuLFxuICBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4sXG4gIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IsXG59IGZyb20gXCIuL19saWIvcHJvdGVjdGVkVG9rZW5zLmpzXCI7XG5pbXBvcnQgeyBpc1ZhbGlkIH0gZnJvbSBcIi4vaXNWYWxpZC5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8vIFJleHBvcnRzIG9mIGludGVybmFsIGZvciBsaWJyYXJpZXMgdG8gdXNlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM2MzgjaXNzdWVjb21tZW50LTE4NzcwODI4NzRcbmV4cG9ydCB7IGZvcm1hdHRlcnMsIGxvbmdGb3JtYXR0ZXJzIH07XG5cbi8vIFRoaXMgUmVnRXhwIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzIHNlcGFyYXRlZCBieSBgfGA6XG4vLyAtIFt5WVFxTUx3SWREZWNpaEhLa21zXW8gbWF0Y2hlcyBhbnkgYXZhaWxhYmxlIG9yZGluYWwgbnVtYmVyIHRva2VuXG4vLyAgIChvbmUgb2YgdGhlIGNlcnRhaW4gbGV0dGVycyBmb2xsb3dlZCBieSBgb2ApXG4vLyAtIChcXHcpXFwxKiBtYXRjaGVzIGFueSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgbGV0dGVyXG4vLyAtICcnIG1hdGNoZXMgdHdvIHF1b3RlIGNoYXJhY3RlcnMgaW4gYSByb3dcbi8vIC0gJygnJ3xbXiddKSsoJ3wkKSBtYXRjaGVzIGFueXRoaW5nIHN1cnJvdW5kZWQgYnkgdHdvIHF1b3RlIGNoYXJhY3RlcnMgKCcpLFxuLy8gICBleGNlcHQgYSBzaW5nbGUgcXVvdGUgc3ltYm9sLCB3aGljaCBlbmRzIHRoZSBzZXF1ZW5jZS5cbi8vICAgVHdvIHF1b3RlIGNoYXJhY3RlcnMgZG8gbm90IGVuZCB0aGUgc2VxdWVuY2UuXG4vLyAgIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHNpbmdsZSBxdW90ZVxuLy8gICB0aGVuIHRoZSBzZXF1ZW5jZSB3aWxsIGNvbnRpbnVlIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0cmluZy5cbi8vIC0gLiBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyIHVubWF0Y2hlZCBieSBwcmV2aW91cyBwYXJ0cyBvZiB0aGUgUmVnRXhwc1xuY29uc3QgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9XG4gIC9beVlRcU1Md0lkRGVjaWhIS2ttc11vfChcXHcpXFwxKnwnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcblxuLy8gVGhpcyBSZWdFeHAgY2F0Y2hlcyBzeW1ib2xzIGVzY2FwZWQgYnkgcXVvdGVzLCBhbmQgYWxzb1xuLy8gc2VxdWVuY2VzIG9mIHN5bWJvbHMgUCwgcCwgYW5kIHRoZSBjb21iaW5hdGlvbnMgbGlrZSBgUFBQUFBQUHBwcHBwYFxuY29uc3QgbG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPSAvUCtwK3xQK3xwK3wnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcblxuY29uc3QgZXNjYXBlZFN0cmluZ1JlZ0V4cCA9IC9eJyhbXl0qPyknPyQvO1xuY29uc3QgZG91YmxlUXVvdGVSZWdFeHAgPSAvJycvZztcbmNvbnN0IHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwID0gL1thLXpBLVpdLztcblxuZXhwb3J0IHsgZm9ybWF0IGFzIGZvcm1hdERhdGUgfTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGZvcm1hdH0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGZvcm1hdFxuICogQGFsaWFzIGZvcm1hdERhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgRm9ybWF0IHRoZSBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcgaW4gdGhlIGdpdmVuIGZvcm1hdC4gVGhlIHJlc3VsdCBtYXkgdmFyeSBieSBsb2NhbGUuXG4gKlxuICogPiDimqDvuI8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgYGZvcm1hdGAgdG9rZW5zIGRpZmZlciBmcm9tIE1vbWVudC5qcyBhbmQgb3RoZXIgbGlicmFyaWVzLlxuICogPiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiBUaGUgY2hhcmFjdGVycyB3cmFwcGVkIGJldHdlZW4gdHdvIHNpbmdsZSBxdW90ZXMgY2hhcmFjdGVycyAoJykgYXJlIGVzY2FwZWQuXG4gKiBUd28gc2luZ2xlIHF1b3RlcyBpbiBhIHJvdywgd2hldGhlciBpbnNpZGUgb3Igb3V0c2lkZSBhIHF1b3RlZCBzZXF1ZW5jZSwgcmVwcmVzZW50IGEgJ3JlYWwnIHNpbmdsZSBxdW90ZS5cbiAqIChzZWUgdGhlIGxhc3QgZXhhbXBsZSlcbiAqXG4gKiBGb3JtYXQgb2YgdGhlIHN0cmluZyBpcyBiYXNlZCBvbiBVbmljb2RlIFRlY2huaWNhbCBTdGFuZGFyZCAjMzU6XG4gKiBodHRwczovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS1kYXRlcy5odG1sI0RhdGVfRmllbGRfU3ltYm9sX1RhYmxlXG4gKiB3aXRoIGEgZmV3IGFkZGl0aW9ucyAoc2VlIG5vdGUgNyBiZWxvdyB0aGUgdGFibGUpLlxuICpcbiAqIEFjY2VwdGVkIHBhdHRlcm5zOlxuICogfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUGF0dGVybiB8IFJlc3VsdCBleGFtcGxlcyAgICAgICAgICAgICAgICAgICB8IE5vdGVzIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS18XG4gKiB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHLi5HR0cgIHwgQUQsIEJDICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR0dHRyAgICB8IEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0ICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0dHICAgfCBBLCBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IENhbGVuZGFyIHllYXIgICAgICAgICAgICAgICAgICAgfCB5ICAgICAgIHwgNDQsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeW8gICAgICB8IDQ0dGgsIDFzdCwgMHRoLCAxN3RoICAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5ICAgICAgfCA0NCwgMDEsIDAwLCAxNyAgICAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXkgICAgIHwgMDQ0LCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5eSAgICB8IDAwNDQsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXl5ICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUgICB8XG4gKiB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgfCBZICAgICAgIHwgNDQsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWW8gICAgICB8IDQ0dGgsIDFzdCwgMTkwMHRoLCAyMDE3dGggICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZICAgICAgfCA0NCwgMDEsIDAwLCAxNyAgICAgICAgICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVkgICAgIHwgMDQ0LCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZWSAgICB8IDAwNDQsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICB8IDUsOCAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVlZICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUgICB8XG4gKiB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICAgfCBSICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlIgICAgICB8IC00MywgMDAsIDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUiAgICAgfCAtMDQzLCAwMDAsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlJSICAgIHwgLTAwNDMsIDAwMDAsIDAwMDEsIDE5MDAsIDIwMTcgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUlIgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSw3IHxcbiAqIHwgRXh0ZW5kZWQgeWVhciAgICAgICAgICAgICAgICAgICB8IHUgICAgICAgfCAtNDMsIDAsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dSAgICAgIHwgLTQzLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1ICAgICB8IC0wNDMsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dXUgICAgfCAtMDA0MywgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1dSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBRdWFydGVyIChmb3JtYXR0aW5nKSAgICAgICAgICAgIHwgUSAgICAgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFvICAgICAgfCAxc3QsIDJuZCwgM3JkLCA0dGggICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUSAgICAgIHwgMDEsIDAyLCAwMywgMDQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRICAgICB8IFExLCBRMiwgUTMsIFE0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUVEgICAgfCAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRUSAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCBRdWFydGVyIChzdGFuZC1hbG9uZSkgICAgICAgICAgIHwgcSAgICAgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFvICAgICAgfCAxc3QsIDJuZCwgM3JkLCA0dGggICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcSAgICAgIHwgMDEsIDAyLCAwMywgMDQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxICAgICB8IFExLCBRMiwgUTMsIFE0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcXEgICAgfCAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxcSAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCBNb250aCAoZm9ybWF0dGluZykgICAgICAgICAgICAgIHwgTSAgICAgICB8IDEsIDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1vICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMnRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTSAgICAgIHwgMDEsIDAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NICAgICB8IEphbiwgRmViLCAuLi4sIERlYyAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTU0gICAgfCBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlciAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NTSAgIHwgSiwgRiwgLi4uLCBEICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNb250aCAoc3RhbmQtYWxvbmUpICAgICAgICAgICAgIHwgTCAgICAgICB8IDEsIDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMnRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTCAgICAgIHwgMDEsIDAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMICAgICB8IEphbiwgRmViLCAuLi4sIERlYyAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTEwgICAgfCBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlciAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMTCAgIHwgSiwgRiwgLi4uLCBEICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgIHwgdyAgICAgICB8IDEsIDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA1M3RoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3dyAgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBJU08gd2VlayBvZiB5ZWFyICAgICAgICAgICAgICAgIHwgSSAgICAgICB8IDEsIDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA1M3RoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJSSAgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCBEYXkgb2YgbW9udGggICAgICAgICAgICAgICAgICAgIHwgZCAgICAgICB8IDEsIDIsIC4uLiwgMzEgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAzMXN0ICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkZCAgICAgIHwgMDEsIDAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBEYXkgb2YgeWVhciAgICAgICAgICAgICAgICAgICAgIHwgRCAgICAgICB8IDEsIDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAzNjV0aCwgMzY2dGggICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBERCAgICAgIHwgMDEsIDAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgIHwgOSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREREICAgICB8IDAwMSwgMDAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEREREQgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzICAgICB8XG4gKiB8IERheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICAgICAgfCBFLi5FRUUgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUVFICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRUUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBJU08gZGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICAgIHwgaSAgICAgICB8IDEsIDIsIDMsIC4uLiwgNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA3dGggICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaSAgICAgIHwgMDEsIDAyLCAuLi4sIDA3ICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWkgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyLDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpaSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWlpICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8IDcgICAgIHxcbiAqIHwgTG9jYWwgZGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICB8IGUgICAgICAgfCAyLCAzLCA0LCAuLi4sIDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlbyAgICAgIHwgMm5kLCAzcmQsIC4uLiwgMXN0ICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWUgICAgICB8IDAyLCAwMywgLi4uLCAwMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZWUgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlZSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChzdGFuZC1hbG9uZSkgfCBjICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY28gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2MgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjYyAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2NjICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjY2MgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgYS4uYWEgICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYSAgICAgfCBhbSwgcG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWFhICAgIHwgYS5tLiwgcC5tLiAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYWEgICB8IGEsIHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICB8IGIuLmJiICAgfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmIgICAgIHwgYW0sIHBtLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiYiAgICB8IGEubS4sIHAubS4sIG5vb24sIG1pZG5pZ2h0ICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmJiICAgfCBhLCBwLCBuLCBtaSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICAgfCBCLi5CQkIgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQkJCQiAgICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkJCICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICAgfCBoICAgICAgIHwgMSwgMiwgLi4uLCAxMSwgMTIgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDExdGgsIDEydGggICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhoICAgICAgfCAwMSwgMDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICAgfCBIICAgICAgIHwgMCwgMSwgMiwgLi4uLCAyMyAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSG8gICAgICB8IDB0aCwgMXN0LCAybmQsIC4uLiwgMjNyZCAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhIICAgICAgfCAwMCwgMDEsIDAyLCAuLi4sIDIzICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICAgfCBLICAgICAgIHwgMSwgMiwgLi4uLCAxMSwgMCAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS28gICAgICB8IDFzdCwgMm5kLCAuLi4sIDExdGgsIDB0aCAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtLICAgICAgfCAwMSwgMDIsIC4uLiwgMTEsIDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICAgfCBrICAgICAgIHwgMjQsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga28gICAgICB8IDI0dGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtrICAgICAgfCAyNCwgMDEsIDAyLCAuLi4sIDIzICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtICAgICAgIHwgMCwgMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbW8gICAgICB8IDB0aCwgMXN0LCAuLi4sIDU5dGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1tICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzICAgICAgIHwgMCwgMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc28gICAgICB8IDB0aCwgMXN0LCAuLi4sIDU5dGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNzICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICAgfCBTICAgICAgIHwgMCwgMSwgLi4uLCA5ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1MgICAgICB8IDAwLCAwMSwgLi4uLCA5OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTUyAgICAgfCAwMDAsIDAwMSwgLi4uLCA5OTkgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1NTICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy8gWikgICAgICAgIHwgWCAgICAgICB8IC0wOCwgKzA1MzAsIFogICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYICAgICAgfCAtMDgwMCwgKzA1MzAsIFogICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFggICAgIHwgLTA4OjAwLCArMDU6MzAsIFogICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYWCAgICB8IC0wODAwLCArMDUzMCwgWiwgKzEyMzQ1NiAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFhYICAgfCAtMDg6MDAsICswNTozMCwgWiwgKzEyOjM0OjU2ICAgICAgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICAgfCB4ICAgICAgIHwgLTA4LCArMDUzMCwgKzAwICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHggICAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eCAgICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHh4ICAgIHwgLTA4MDAsICswNTMwLCArMDAwMCwgKzEyMzQ1NiAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eHggICB8IC0wODowMCwgKzA1OjMwLCArMDA6MDAsICsxMjozNDo1NiB8ICAgICAgIHxcbiAqIHwgVGltZXpvbmUgKEdNVCkgICAgICAgICAgICAgICAgICB8IE8uLi5PT08gfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPT09PICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiAgICAgfFxuICogfCBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0LikgIHwgei4uLnp6eiB8IEdNVC04LCBHTVQrNTozMCwgR01UKzAgICAgICAgICAgICB8IDYgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHp6enogICAgfCBHTVQtMDg6MDAsIEdNVCswNTozMCwgR01UKzAwOjAwICAgfCAyLDYgICB8XG4gKiB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICAgfCB0ICAgICAgIHwgNTEyOTY5NTIwICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTWlsbGlzZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICB8IFQgICAgICAgfCA1MTI5Njk1MjA5MDAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVCAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw3ICAgfFxuICogfCBMb25nIGxvY2FsaXplZCBkYXRlICAgICAgICAgICAgIHwgUCAgICAgICB8IDA0LzI5LzE0NTMgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQICAgICAgfCBBcHIgMjksIDE0NTMgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFAgICAgIHwgQXByaWwgMjl0aCwgMTQ1MyAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUCAgICB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyAgICAgICAgICB8IDIsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgdGltZSAgICAgICAgICAgICB8IHAgICAgICAgfCAxMjowMCBBTSAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcCAgICAgIHwgMTI6MDA6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHBwICAgICB8IDEyOjAwOjAwIEFNIEdNVCsyICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcHAgICAgfCAxMjowMDowMCBBTSBHTVQrMDI6MDAgICAgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IENvbWJpbmF0aW9uIG9mIGRhdGUgYW5kIHRpbWUgICAgfCBQcCAgICAgIHwgMDQvMjkvMTQ1MywgMTI6MDAgQU0gICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBwcCAgICB8IEFwciAyOSwgMTQ1MywgMTI6MDA6MDAgQU0gICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUHBwcCAgfCBBcHJpbCAyOXRoLCAxNDUzIGF0IC4uLiAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBQcHBwcHwgRnJpZGF5LCBBcHJpbCAyOXRoLCAxNDUzIGF0IC4uLiAgIHwgMiw3ICAgfFxuICogTm90ZXM6XG4gKiAxLiBcIkZvcm1hdHRpbmdcIiB1bml0cyAoZS5nLiBmb3JtYXR0aW5nIHF1YXJ0ZXIpIGluIHRoZSBkZWZhdWx0IGVuLVVTIGxvY2FsZVxuICogICAgYXJlIHRoZSBzYW1lIGFzIFwic3RhbmQtYWxvbmVcIiB1bml0cywgYnV0IGFyZSBkaWZmZXJlbnQgaW4gc29tZSBsYW5ndWFnZXMuXG4gKiAgICBcIkZvcm1hdHRpbmdcIiB1bml0cyBhcmUgZGVjbGluZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgbGFuZ3VhZ2VcbiAqICAgIGluIHRoZSBjb250ZXh0IG9mIGEgZGF0ZS4gXCJTdGFuZC1hbG9uZVwiIHVuaXRzIGFyZSBhbHdheXMgbm9taW5hdGl2ZSBzaW5ndWxhcjpcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ2RvIExMTEwnLCB7bG9jYWxlOiBjc30pIC8vPT4gJzYuIGxpc3RvcGFkJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ2RvIE1NTU0nLCB7bG9jYWxlOiBjc30pIC8vPT4gJzYuIGxpc3RvcGFkdSdgXG4gKlxuICogMi4gQW55IHNlcXVlbmNlIG9mIHRoZSBpZGVudGljYWwgbGV0dGVycyBpcyBhIHBhdHRlcm4sIHVubGVzcyBpdCBpcyBlc2NhcGVkIGJ5XG4gKiAgICB0aGUgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgKHNlZSBiZWxvdykuXG4gKiAgICBJZiB0aGUgc2VxdWVuY2UgaXMgbG9uZ2VyIHRoYW4gbGlzdGVkIGluIHRhYmxlIChlLmcuIGBFRUVFRUVFRUVFRWApXG4gKiAgICB0aGUgb3V0cHV0IHdpbGwgYmUgdGhlIHNhbWUgYXMgZGVmYXVsdCBwYXR0ZXJuIGZvciB0aGlzIHVuaXQsIHVzdWFsbHlcbiAqICAgIHRoZSBsb25nZXN0IG9uZSAoaW4gY2FzZSBvZiBJU08gd2Vla2RheXMsIGBFRUVFYCkuIERlZmF1bHQgcGF0dGVybnMgZm9yIHVuaXRzXG4gKiAgICBhcmUgbWFya2VkIHdpdGggXCIyXCIgaW4gdGhlIGxhc3QgY29sdW1uIG9mIHRoZSB0YWJsZS5cbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTScpIC8vPT4gJ05vdidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTU0nKSAvLz0+ICdOJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogMy4gU29tZSBwYXR0ZXJucyBjb3VsZCBiZSB1bmxpbWl0ZWQgbGVuZ3RoIChzdWNoIGFzIGB5eXl5eXl5eWApLlxuICogICAgVGhlIG91dHB1dCB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm9zIHRvIG1hdGNoIHRoZSBsZW5ndGggb2YgdGhlIHBhdHRlcm4uXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICd5eXl5eXl5eScpIC8vPT4gJzAwMDAyMDE3J2BcbiAqXG4gKiA0LiBgUVFRUVFgIGFuZCBgcXFxcXFgIGNvdWxkIGJlIG5vdCBzdHJpY3RseSBudW1lcmljYWwgaW4gc29tZSBsb2NhbGVzLlxuICogICAgVGhlc2UgdG9rZW5zIHJlcHJlc2VudCB0aGUgc2hvcnRlc3QgZm9ybSBvZiB0aGUgcXVhcnRlci5cbiAqXG4gKiA1LiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gYHlgIGFuZCBgdWAgcGF0dGVybnMgYXJlIEIuQy4geWVhcnM6XG4gKlxuICogICAgfCBZZWFyIHwgYHlgIHwgYHVgIHxcbiAqICAgIHwtLS0tLS18LS0tLS18LS0tLS18XG4gKiAgICB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICogICAgfCBCQyAxIHwgICAxIHwgICAwIHxcbiAqICAgIHwgQkMgMiB8ICAgMiB8ICAtMSB8XG4gKlxuICogICAgQWxzbyBgeXlgIGFsd2F5cyByZXR1cm5zIHRoZSBsYXN0IHR3byBkaWdpdHMgb2YgYSB5ZWFyLFxuICogICAgd2hpbGUgYHV1YCBwYWRzIHNpbmdsZSBkaWdpdCB5ZWFycyB0byAyIGNoYXJhY3RlcnMgYW5kIHJldHVybnMgb3RoZXIgeWVhcnMgdW5jaGFuZ2VkOlxuICpcbiAqICAgIHwgWWVhciB8IGB5eWAgfCBgdXVgIHxcbiAqICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXxcbiAqICAgIHwgMSAgICB8ICAgMDEgfCAgIDAxIHxcbiAqICAgIHwgMTQgICB8ICAgMTQgfCAgIDE0IHxcbiAqICAgIHwgMzc2ICB8ICAgNzYgfCAgMzc2IHxcbiAqICAgIHwgMTQ1MyB8ICAgNTMgfCAxNDUzIHxcbiAqXG4gKiAgICBUaGUgc2FtZSBkaWZmZXJlbmNlIGlzIHRydWUgZm9yIGxvY2FsIGFuZCBJU08gd2Vlay1udW1iZXJpbmcgeWVhcnMgKGBZYCBhbmQgYFJgKSxcbiAqICAgIGV4Y2VwdCBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFycyBhcmUgZGVwZW5kZW50IG9uIGBvcHRpb25zLndlZWtTdGFydHNPbmBcbiAqICAgIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgIChjb21wYXJlIFtnZXRJU09XZWVrWWVhcl0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9nZXRJU09XZWVrWWVhcilcbiAqICAgIGFuZCBbZ2V0V2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0V2Vla1llYXIpKS5cbiAqXG4gKiA2LiBTcGVjaWZpYyBub24tbG9jYXRpb24gdGltZXpvbmVzIGFyZSBjdXJyZW50bHkgdW5hdmFpbGFibGUgaW4gYGRhdGUtZm5zYCxcbiAqICAgIHNvIHJpZ2h0IG5vdyB0aGVzZSB0b2tlbnMgZmFsbCBiYWNrIHRvIEdNVCB0aW1lem9uZXMuXG4gKlxuICogNy4gVGhlc2UgcGF0dGVybnMgYXJlIG5vdCBpbiB0aGUgVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogICAgLSBgaWA6IElTTyBkYXkgb2Ygd2Vla1xuICogICAgLSBgSWA6IElTTyB3ZWVrIG9mIHllYXJcbiAqICAgIC0gYFJgOiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICogICAgLSBgdGA6IHNlY29uZHMgdGltZXN0YW1wXG4gKiAgICAtIGBUYDogbWlsbGlzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgb2A6IG9yZGluYWwgbnVtYmVyIG1vZGlmaWVyXG4gKiAgICAtIGBQYDogbG9uZyBsb2NhbGl6ZWQgZGF0ZVxuICogICAgLSBgcGA6IGxvbmcgbG9jYWxpemVkIHRpbWVcbiAqXG4gKiA4LiBgWVlgIGFuZCBgWVlZWWAgdG9rZW5zIHJlcHJlc2VudCB3ZWVrLW51bWJlcmluZyB5ZWFycyBidXQgdGhleSBhcmUgb2Z0ZW4gY29uZnVzZWQgd2l0aCB5ZWFycy5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIDkuIGBEYCBhbmQgYEREYCB0b2tlbnMgcmVwcmVzZW50IGRheXMgb2YgdGhlIHllYXIgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggZGF5cyBvZiB0aGUgbW9udGguXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zYCB0byB1c2UgdGhlbS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIGZvcm1hdCAtIFRoZSBzdHJpbmcgb2YgdG9rZW5zXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nXG4gKlxuICogQHRocm93cyBgZGF0ZWAgbXVzdCBub3QgYmUgSW52YWxpZCBEYXRlXG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBsb2NhbGl6ZWAgcHJvcGVydHlcbiAqIEB0aHJvd3MgYG9wdGlvbnMubG9jYWxlYCBtdXN0IGNvbnRhaW4gYGZvcm1hdExvbmdgIHByb3BlcnR5XG4gKiBAdGhyb3dzIHVzZSBgeXl5eWAgaW5zdGVhZCBvZiBgWVlZWWAgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB1c2UgYHl5YCBpbnN0ZWFkIG9mIGBZWWAgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB1c2UgYGRgIGluc3RlYWQgb2YgYERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkZGAgaW5zdGVhZCBvZiBgRERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgZm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlcHJlc2VudCAxMSBGZWJydWFyeSAyMDE0IGluIG1pZGRsZS1lbmRpYW4gZm9ybWF0OlxuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0KG5ldyBEYXRlKDIwMTQsIDEsIDExKSwgJ01NL2RkL3l5eXknKVxuICogLy89PiAnMDIvMTEvMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVwcmVzZW50IDIgSnVseSAyMDE0IGluIEVzcGVyYW50bzpcbiAqIGltcG9ydCB7IGVvTG9jYWxlIH0gZnJvbSAnZGF0ZS1mbnMvbG9jYWxlL2VvJ1xuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0KG5ldyBEYXRlKDIwMTQsIDYsIDIpLCBcImRvICdkZScgTU1NTSB5eXl5XCIsIHtcbiAqICAgbG9jYWxlOiBlb0xvY2FsZVxuICogfSlcbiAqIC8vPT4gJzItYSBkZSBqdWxpbyAyMDE0J1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFc2NhcGUgc3RyaW5nIGJ5IHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzOlxuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0KG5ldyBEYXRlKDIwMTQsIDYsIDIsIDE1KSwgXCJoICdvJydjbG9jaydcIilcbiAqIC8vPT4gXCIzIG8nY2xvY2tcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KGRhdGUsIGZvcm1hdFN0ciwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIGNvbnN0IGxvY2FsZSA9IG9wdGlvbnM/LmxvY2FsZSA/PyBkZWZhdWx0T3B0aW9ucy5sb2NhbGUgPz8gZGVmYXVsdExvY2FsZTtcblxuICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPVxuICAgIG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICAxO1xuXG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgY29uc3Qgb3JpZ2luYWxEYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcblxuICBpZiAoIWlzVmFsaWQob3JpZ2luYWxEYXRlKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB0aW1lIHZhbHVlXCIpO1xuICB9XG5cbiAgbGV0IHBhcnRzID0gZm9ybWF0U3RyXG4gICAgLm1hdGNoKGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwKVxuICAgIC5tYXAoKHN1YnN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG4gICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09IFwicFwiIHx8IGZpcnN0Q2hhcmFjdGVyID09PSBcIlBcIikge1xuICAgICAgICBjb25zdCBsb25nRm9ybWF0dGVyID0gbG9uZ0Zvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdO1xuICAgICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdHJpbmc7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKVxuICAgIC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwKVxuICAgIC5tYXAoKHN1YnN0cmluZykgPT4ge1xuICAgICAgLy8gUmVwbGFjZSB0d28gc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgd2l0aCBvbmUgc2luZ2xlIHF1b3RlIGNoYXJhY3RlclxuICAgICAgaWYgKHN1YnN0cmluZyA9PT0gXCInJ1wiKSB7XG4gICAgICAgIHJldHVybiB7IGlzVG9rZW46IGZhbHNlLCB2YWx1ZTogXCInXCIgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG4gICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09IFwiJ1wiKSB7XG4gICAgICAgIHJldHVybiB7IGlzVG9rZW46IGZhbHNlLCB2YWx1ZTogY2xlYW5Fc2NhcGVkU3RyaW5nKHN1YnN0cmluZykgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdKSB7XG4gICAgICAgIHJldHVybiB7IGlzVG9rZW46IHRydWUsIHZhbHVlOiBzdWJzdHJpbmcgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyLm1hdGNoKHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICBcIkZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlciBgXCIgK1xuICAgICAgICAgICAgZmlyc3RDaGFyYWN0ZXIgK1xuICAgICAgICAgICAgXCJgXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGlzVG9rZW46IGZhbHNlLCB2YWx1ZTogc3Vic3RyaW5nIH07XG4gICAgfSk7XG5cbiAgLy8gaW52b2tlIGxvY2FsaXplIHByZXByb2Nlc3NvciAob25seSBmb3IgZnJlbmNoIGxvY2FsZXMgYXQgdGhlIG1vbWVudClcbiAgaWYgKGxvY2FsZS5sb2NhbGl6ZS5wcmVwcm9jZXNzb3IpIHtcbiAgICBwYXJ0cyA9IGxvY2FsZS5sb2NhbGl6ZS5wcmVwcm9jZXNzb3Iob3JpZ2luYWxEYXRlLCBwYXJ0cyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXJPcHRpb25zID0ge1xuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSxcbiAgICB3ZWVrU3RhcnRzT24sXG4gICAgbG9jYWxlLFxuICB9O1xuXG4gIHJldHVybiBwYXJ0c1xuICAgIC5tYXAoKHBhcnQpID0+IHtcbiAgICAgIGlmICghcGFydC5pc1Rva2VuKSByZXR1cm4gcGFydC52YWx1ZTtcblxuICAgICAgY29uc3QgdG9rZW4gPSBwYXJ0LnZhbHVlO1xuXG4gICAgICBpZiAoXG4gICAgICAgICghb3B0aW9ucz8udXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zICYmXG4gICAgICAgICAgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuKHRva2VuKSkgfHxcbiAgICAgICAgKCFvcHRpb25zPy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zICYmXG4gICAgICAgICAgaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikpXG4gICAgICApIHtcbiAgICAgICAgd2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcih0b2tlbiwgZm9ybWF0U3RyLCBTdHJpbmcoZGF0ZSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSBmb3JtYXR0ZXJzW3Rva2VuWzBdXTtcbiAgICAgIHJldHVybiBmb3JtYXR0ZXIob3JpZ2luYWxEYXRlLCB0b2tlbiwgbG9jYWxlLmxvY2FsaXplLCBmb3JtYXR0ZXJPcHRpb25zKTtcbiAgICB9KVxuICAgIC5qb2luKFwiXCIpO1xufVxuXG5mdW5jdGlvbiBjbGVhbkVzY2FwZWRTdHJpbmcoaW5wdXQpIHtcbiAgY29uc3QgbWF0Y2hlZCA9IGlucHV0Lm1hdGNoKGVzY2FwZWRTdHJpbmdSZWdFeHApO1xuXG4gIGlmICghbWF0Y2hlZCkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVkWzFdLnJlcGxhY2UoZG91YmxlUXVvdGVSZWdFeHAsIFwiJ1wiKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBmb3JtYXQ7XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nLCBNaWxraW9Jbml0LCBNaWxraW9SdW50aW1lSW5pdCB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHsgVFNPTiB9IGZyb20gXCJAc291dGhlcm4tYXVyb3JhL3Rzb25cIjtcblxuaW50ZXJmYWNlIENvb2tib29rRXZlbnQge1xuICB0eXBlOiBcIm1pbGtpb0Bsb2dnZXJcIjtcbiAgbG9nOiBMb2c7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kQ29va2Jvb2tFdmVudChydW50aW1lOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0PiwgZXZlbnQ6IENvb2tib29rRXZlbnQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OiR7cnVudGltZS5jb29rYm9vay5jb29rYm9va1BvcnR9LyRhY3Rpb25gLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBUU09OLnN0cmluZ2lmeShldmVudCksXG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc29sZS5sb2coXCJbQ09PS0JPT0tdXCIsIGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gICAgICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgXCJJcyBDb29rYm9vayBjbG9zZWQ/IFRoZXJlIGlzIGFuIGFibm9ybWFsaXR5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggQ29va2Jvb2suXCIpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgZXJyb3IpO1xuICAgIGNvbnNvbGUubG9nKFwiW0NPT0tCT09LXVwiLCBcIklzIENvb2tib29rIGNsb3NlZD8gVGhlcmUgaXMgYW4gYWJub3JtYWxpdHkgaW4gdGhlIGNvbW11bmljYXRpb24gd2l0aCBDb29rYm9vay5cIik7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcImRhdGUtZm5zXCI7XG5pbXBvcnQgdHlwZSB7ICRjb250ZXh0LCBNaWxraW9Jbml0LCBNaWxraW9SdW50aW1lSW5pdCB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHsgc2VuZENvb2tib29rRXZlbnQgfSBmcm9tIFwiLi4vdXRpbHMvc2VuZC1jb29rYm9vay1ldmVudC50c1wiO1xuXG5leHBvcnQgdHlwZSBMb2cgPSBbXCJbREVCVUddXCIgfCBcIltJTkZPXVwiIHwgXCJbV0FSTl1cIiB8IFwiW0VSUk9SXVwiIHwgXCJbUkVRVUVTVF1cIiB8IFwiW1JFU1BPTlNFXVwiLCBzdHJpbmcgLyogZXhlY3V0ZUlkICovLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nLCAuLi5BcnJheTx1bmtub3duPl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgXzoge1xuICAgIGxvZ3M6IEFycmF5PExvZz47XG4gICAgdGFnczogTWFwPHN0cmluZywgdW5rbm93bj47XG4gICAgc3VibWl0OiAoY29udGV4dDogJGNvbnRleHQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICB9O1xuICBzZXRUYWc6IChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHZvaWQ7XG4gIHNldExvZzogKC4uLmxvZzogTG9nKSA9PiB2b2lkO1xuICBkZWJ1ZzogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbiAgaW5mbzogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbiAgd2FybjogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbiAgZXJyb3I6IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XG4gIHJlcXVlc3Q6IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XG4gIHJlc3BvbnNlOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xufVxuXG5leHBvcnQgdHlwZSBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyID0gKGxvZzogTG9nKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBMb2dnZXJTdWJtaXR0aW5nSGFuZGxlciA9IChjb250ZXh0OiAkY29udGV4dCwgbG9nczogQXJyYXk8TG9nPiwgdGFnczogTWFwPHN0cmluZywgdW5rbm93bj4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9nZ2VyPE1pbGtpb1J1bnRpbWUgZXh0ZW5kcyBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0Pj4gPSBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0Pj4ocnVudGltZTogTWlsa2lvUnVudGltZSwgcGF0aDogc3RyaW5nLCBleGVjdXRlSWQ6IHN0cmluZyk6IExvZ2dlciB7XG4gIGNvbnN0IGxvZ2dlciA9IHt9IGFzIExvZ2dlcjtcblxuICBsb2dnZXIuXyA9IHtcbiAgICBsb2dzOiBbXSxcbiAgICB0YWdzOiBuZXcgTWFwKCksXG4gICAgc3VibWl0OiAoY29udGV4dDogJGNvbnRleHQpID0+IHtcbiAgICAgIGlmICghcnVudGltZS5vbkxvZ2dlclN1Ym1pdHRpbmcpIHJldHVybjtcbiAgICAgIHJldHVybiBydW50aW1lLm9uTG9nZ2VyU3VibWl0dGluZyhjb250ZXh0LCBsb2dnZXIuXy5sb2dzLCBsb2dnZXIuXy50YWdzKTtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IF9fdGFnUHVzaCA9IChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBsb2dnZXIuXy50YWdzLnNldChrZXksIHZhbHVlKTtcbiAgfTtcbiAgY29uc3QgX19sb2dQdXNoID0gKGxvZzogTG9nKTogTG9nID0+IHtcbiAgICBjb25zdCBpbnNlcnRpbmcgPSBydW50aW1lLm9uTG9nZ2VySW5zZXJ0aW5nXG4gICAgICA/IHJ1bnRpbWUub25Mb2dnZXJJbnNlcnRpbmdcbiAgICAgIDogKGxvZzogTG9nKSA9PiB7XG4gICAgICAgICAgbG9nID0gWy4uLmxvZ107XG4gICAgICAgICAgbG9nWzBdID0gYFxcbiR7bG9nWzBdfWAgYXMgYW55O1xuICAgICAgICAgIGNvbnNvbGUubG9nKC4uLmxvZyk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG5cbiAgICBpZiAoIWluc2VydGluZyhsb2cpKSByZXR1cm4gbG9nO1xuXG4gICAgbG9nZ2VyLl8ubG9ncy5wdXNoKFsuLi5sb2ddKTtcbiAgICBpZiAocnVudGltZS5kZXZlbG9wKSB7XG4gICAgICB2b2lkIHNlbmRDb29rYm9va0V2ZW50KHJ1bnRpbWUsIHtcbiAgICAgICAgdHlwZTogXCJtaWxraW9AbG9nZ2VyXCIsXG4gICAgICAgIGxvZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsb2c7XG4gIH07XG5cbiAgbG9nZ2VyLnNldFRhZyA9IChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IF9fdGFnUHVzaChrZXksIHZhbHVlKTtcbiAgbG9nZ2VyLnNldExvZyA9ICguLi5sb2c6IExvZykgPT4gX19sb2dQdXNoKGxvZyk7XG5cbiAgY29uc3QgZ2V0Tm93ID0gKCkgPT4gYCR7Zm9ybWF0KG5ldyBEYXRlKCksIFwiKHl5eXktTU0tZGQgaGg6bW06c3MpXCIpfWA7XG5cbiAgbG9nZ2VyLmRlYnVnID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCJbREVCVUddXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICBsb2dnZXIuaW5mbyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiW0lORk9dXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICBsb2dnZXIud2FybiA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiW1dBUk5dXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICBsb2dnZXIuZXJyb3IgPSAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gX19sb2dQdXNoKFtcIltFUlJPUl1cIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XG4gIGxvZ2dlci5yZXF1ZXN0ID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCJbUkVRVUVTVF1cIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XG4gIGxvZ2dlci5yZXNwb25zZSA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiW1JFU1BPTlNFXVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcblxuICByZXR1cm4gbG9nZ2VyO1xufVxuIiwKICAgICJleHBvcnQgaW50ZXJmYWNlIFN0ZXBzPFN0YWdlVCBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+IHtcbiAgc3RlcDogU3RlcEZ1bmN0aW9uPFN0YWdlVD47XG4gIHJ1bjogKCkgPT4gUHJvbWlzZTxSZW1vdmVfPFN0YWdlVD4+O1xufVxuXG50eXBlIFJlbW92ZV88VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgYXMgSyBleHRlbmRzIGBfJHtzdHJpbmd9YCA/IG5ldmVyIDogS106IFRbS107XG59O1xuXG50eXBlIFRvRW1wdHlPYmplY3Q8VD4gPSBUIGV4dGVuZHMgdW5kZWZpbmVkIHwgbnVsbCB8IG5ldmVyID8ge30gOiBUIGV4dGVuZHMgb2JqZWN0ID8gVCA6IHt9O1xuXG5leHBvcnQgdHlwZSBTdGVwRnVuY3Rpb248U3RhZ2VUIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4gPSA8SGFuZGxlclQgZXh0ZW5kcyAoc3RhZ2U6IFJlYWRvbmx5PFN0YWdlVD4pID0+IFJlY29yZDxhbnksIGFueT4gfCBQcm9taXNlPFJlY29yZDxhbnksIGFueT4+PihoYW5kbGVyOiBIYW5kbGVyVCkgPT4gU3RlcHM8QXdhaXRlZDxTdGFnZVQ+ICYgVG9FbXB0eU9iamVjdDxBd2FpdGVkPFJldHVyblR5cGU8SGFuZGxlclQ+Pj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RlcCgpOiBTdGVwczx7fT4ge1xuICBjb25zdCBzdGVwQ29udHJvbGxlciA9IHtcbiAgICAkbWlsa2lvVHlwZTogXCJzdGVwXCIsXG4gICAgX3N0ZXBzOiBbXSBhcyBBcnJheTwoc3RhZ2U6IGFueSkgPT4gUHJvbWlzZTxhbnk+PixcbiAgICBzdGVwKGhhbmRsZXI6IChzdGFnZTogYW55KSA9PiBQcm9taXNlPGFueT4pIHtcbiAgICAgIHN0ZXBDb250cm9sbGVyLl9zdGVwcy5wdXNoKGhhbmRsZXIpO1xuICAgICAgcmV0dXJuIHN0ZXBDb250cm9sbGVyO1xuICAgIH0sXG4gICAgYXN5bmMgcnVuKCkge1xuICAgICAgbGV0IHN0YWdlID0ge307XG4gICAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcENvbnRyb2xsZXIuX3N0ZXBzKSB7XG4gICAgICAgIHN0YWdlID0geyAuLi5zdGFnZSwgLi4uKGF3YWl0IHN0ZXAoc3RhZ2UpKSB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzdGFnZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChzdGFnZSBhcyBhbnkpW2tleV07XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoXCJfXCIpKSByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gc3RlcENvbnRyb2xsZXIgYXMgYW55IGFzIFN0ZXBzPHt9Pjtcbn1cbiIsCiAgICAiZXhwb3J0IGNsYXNzIFRyaWU8VD4ge1xyXG4gIHByaXZhdGUgcm9vdDogVHJpZU5vZGU8VD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5yb290ID0gbmV3IFRyaWVOb2RlKCk7XHJcbiAgfVxyXG5cclxuICBhZGQocGF0aDogc3RyaW5nLCB2YWx1ZTogVCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFydHMgPSBwYXRoXHJcbiAgICAgIC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxyXG4gICAgICAuc3BsaXQoXCIvXCIpXHJcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IFwiXCIpO1xyXG4gICAgbGV0IGN1cnJlbnROb2RlID0gdGhpcy5yb290O1xyXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcclxuICAgICAgaWYgKCFjdXJyZW50Tm9kZS5jaGlsZHJlbi5oYXMocGFydCkpIHtcclxuICAgICAgICBjdXJyZW50Tm9kZS5jaGlsZHJlbi5zZXQocGFydCwgbmV3IFRyaWVOb2RlKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcclxuICAgIH1cclxuICAgIGN1cnJlbnROb2RlLnZhbHVlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQocGF0aDogc3RyaW5nKTogVCB8IG51bGwge1xyXG4gICAgY29uc3QgcGFydHMgPSBwYXRoXHJcbiAgICAgIC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxyXG4gICAgICAuc3BsaXQoXCIvXCIpXHJcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IFwiXCIpO1xyXG4gICAgbGV0IGN1cnJlbnROb2RlID0gdGhpcy5yb290O1xyXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XHJcbiAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW4uaGFzKHBhcnQpKSByZXR1cm4gbnVsbDtcclxuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5jaGlsZHJlbi5nZXQocGFydCkhO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnJlbnROb2RlLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgaGFzKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcGFydHMgPSBwYXRoXHJcbiAgICAgIC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxyXG4gICAgICAuc3BsaXQoXCIvXCIpXHJcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IFwiXCIpO1xyXG4gICAgbGV0IGN1cnJlbnROb2RlID0gdGhpcy5yb290O1xyXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGN1cnJlbnROb2RlLnZhbHVlICE9PSBudWxsO1xyXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XHJcbiAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW4uaGFzKHBhcnQpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGVsc2UgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5jaGlsZHJlbi5nZXQocGFydCkhO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnJlbnROb2RlLnZhbHVlICE9PSBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuY2xhc3MgVHJpZU5vZGU8VD4ge1xyXG4gIGNoaWxkcmVuOiBNYXA8c3RyaW5nLCBUcmllTm9kZTxUPj47XHJcbiAgdmFsdWU6IFQgfCBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuY2hpbGRyZW4gPSBuZXcgTWFwKCk7XHJcbiAgICB0aGlzLnZhbHVlID0gbnVsbDtcclxuICB9XHJcbn1cclxuIiwKICAgICJpbXBvcnQgeyBUU09OIH0gZnJvbSBcIkBzb3V0aGVybi1hdXJvcmEvdHNvblwiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBleGNlcHRpb25IYW5kbGVyLCByZWplY3QgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB0eXBlIHsgTWl4aW4sIEdlbmVyYXRlZEluaXQsICR0eXBlcywgQ29udGV4dEh0dHAsIE1pbGtpb1Jlc3BvbnNlUmVqZWN0LCBSZXN1bHRzLCBNaWxraW9SZXNwb25zZVN1Y2Nlc3MgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB0eXBlIHsgX19pbml0RXhlY3V0ZXIgfSBmcm9tIFwiLi4vZXhlY3V0ZS9pbmRleC50c1wiO1xuaW1wb3J0IHsgX19jcmVhdGVJZCB9IGZyb20gXCIuLi91dGlscy9jcmVhdGUtaWQudHNcIjtcbmltcG9ydCB7IFRyaWUgfSBmcm9tIFwiLi4vdXRpbHMvdHJpZS50c1wiO1xuXG5leHBvcnQgdHlwZSBNaWxraW9IdHRwUmVxdWVzdCA9IFJlcXVlc3Q7XG5cbmV4cG9ydCB0eXBlIE1pbGtpb0h0dHBSZXNwb25zZSA9IE1peGluPFxuICBSZXNwb25zZUluaXQsXG4gIHtcbiAgICAvLyBib2R5OiBzdHJpbmcgfCBCbG9iIHwgRm9ybURhdGEgfCBVUkxTZWFyY2hQYXJhbXMgfCBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PjtcbiAgICBib2R5OiBhbnk7XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfVxuPjtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdExpc3RlbmVyKGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgcnVudGltZTogYW55LCBleGVjdXRlcjogUmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXhlY3V0ZXI+KSB7XG4gIGNvbnN0IHBvcnQgPSBydW50aW1lLnBvcnQ7XG4gIGNvbnN0IHRyaWUgPSBuZXcgVHJpZTxhbnk+KCk7XG4gIGNvbnN0IGZldGNoID0gYXN5bmMgKG9wdGlvbnM6IHtcbiAgICByZXF1ZXN0OiBNaWxraW9IdHRwUmVxdWVzdDtcbiAgICBlbnZNb2RlPzogc3RyaW5nO1xuICAgIGVudj86IFJlY29yZDxhbnksIGFueT47XG4gIH0pOiBQcm9taXNlPFJlc3BvbnNlPiA9PiB7XG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdC5tZXRob2QgPT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHVuZGVmaW5lZCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93TWV0aG9kcyA/PyBcIipcIixcbiAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd09yaWdpbiA/PyBcIipcIixcbiAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dIZWFkZXJzID8/IFwiKlwiLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdC51cmwuZW5kc1dpdGgoXCIvZ2VuZXJhdGVfMjA0XCIpKSB7XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtcbiAgICAgICAgc3RhdHVzOiAyMDQsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dNZXRob2RzID8/IFwiKlwiLFxuICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93T3JpZ2luID8/IFwiKlwiLFxuICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1wiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd0hlYWRlcnMgPz8gXCIqXCIsXG4gICAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tc3RvcmVcIixcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBgdGV4dC9wbGFpbjsgdGltZT0ke0RhdGUubm93KCl9YCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5yZXF1ZXN0LnVybCk7XG4gICAgbGV0IHBhdGhBcnJheSA9IHVybC5wYXRobmFtZS5zdWJzdHJpbmcoMSkuc3BsaXQoXCIvXCIpO1xuICAgIGlmIChydW50aW1lLmlnbm9yZVBhdGhMZXZlbCAhPT0gdW5kZWZpbmVkICYmIHJ1bnRpbWUuaWdub3JlUGF0aExldmVsICE9PSAwKSBwYXRoQXJyYXkgPSBwYXRoQXJyYXkuc2xpY2UocnVudGltZS5pZ25vcmVQYXRoTGV2ZWwpO1xuICAgIGNvbnN0IHBhdGhTdHJpbmcgPSBgLyR7cGF0aEFycmF5LmpvaW4oXCIvXCIpfWA7XG5cbiAgICBjb25zdCBleGVjdXRlSWQgPSBydW50aW1lPy5leGVjdXRlSWQgPyBhd2FpdCBydW50aW1lLmV4ZWN1dGVJZChvcHRpb25zLnJlcXVlc3QpIDogX19jcmVhdGVJZCgpO1xuICAgIGNvbnNvbGUubG9nKFwiZXhlY3V0ZUlkXCIsIGF3YWl0IHJ1bnRpbWUuZXhlY3V0ZUlkKG9wdGlvbnMucmVxdWVzdCksIF9fY3JlYXRlSWQoKSk7XG5cbiAgICBjb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIocnVudGltZSwgcGF0aFN0cmluZywgZXhlY3V0ZUlkKTtcbiAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5zZXQoZXhlY3V0ZUlkLCB7IGxvZ2dlciB9KTtcbiAgICBjb25zdCByZXNwb25zZTogTWlsa2lvSHR0cFJlc3BvbnNlID0ge1xuICAgICAgYm9keTogXCJcIixcbiAgICAgIHN0YXR1czogMjAwLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dNZXRob2RzID8/IFwiKlwiLFxuICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd09yaWdpbiA/PyBcIipcIixcbiAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93SGVhZGVycyA/PyBcIipcIixcbiAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tc3RvcmVcIixcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBsZXQgZmluYWxlczogQXJyYXk8KCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4+ID0gW107XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaHR0cCA9IChhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBpcCA9IHJ1bnRpbWUucmVhbElwID8gcnVudGltZS5yZWFsSXAob3B0aW9ucy5yZXF1ZXN0KSA6IFwiOjoxXCI7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICBzdHJpbmc6IGF3YWl0IG9wdGlvbnMucmVxdWVzdC50ZXh0KCksXG4gICAgICAgICAgcGFyc2VkOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgaXAsXG4gICAgICAgICAgcGF0aDogeyBzdHJpbmc6IHBhdGhTdHJpbmcgYXMga2V5b2YgJHR5cGVzW1wiZ2VuZXJhdGVkXCJdW1wicm91dGVTY2hlbWFcIl0sIGFycmF5OiBwYXRoQXJyYXkgfSxcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgcmVxdWVzdDogb3B0aW9ucy5yZXF1ZXN0LFxuICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICB9IGFzIENvbnRleHRIdHRwO1xuICAgICAgfSkoKSkhO1xuXG4gICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlcXVlc3RcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAgfSk7XG5cbiAgICAgIGlmICghcnVudGltZS5kZXZlbG9wICYmIChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZykuc3RhcnRzV2l0aChcIi9fL1wiKSkge1xuICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cE5vdEZvdW5kXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwIH0pO1xuICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5nZXQoXCJBY2NlcHRcIik/LnN0YXJ0c1dpdGgoXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiKSkge1xuICAgICAgICAvLyBhY3Rpb25cbiAgICAgICAgbGV0IHJvdXRlU2NoZW1hOiBhbnk7XG4gICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xuICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IG51bGwpIHtcbiAgICAgICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW2h0dHAucGF0aC5zdHJpbmddO1xuICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cE5vdEZvdW5kXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwIH0pO1xuICAgICAgICAgICAgdGhyb3cgcmVqZWN0KFwiTk9UX0ZPVU5EXCIsIHsgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZSgpO1xuICAgICAgICAgIHRyaWUuYWRkKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCByb3V0ZVNjaGVtYSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm91dGVTY2hlbWEudHlwZSAhPT0gXCJhY3Rpb25cIikgdGhyb3cgcmVqZWN0KFwiVU5BQ0NFUFRBQkxFXCIsIHsgZXhwZWN0ZWQ6IFwic3RyZWFtXCIsIG1lc3NhZ2U6IGBOb3QgYWNjZXB0YWJsZSwgdGhlIEFjY2VwdCBpbiB0aGUgcmVxdWVzdCBoZWFkZXIgc2hvdWxkIGJlIFwidGV4dC9ldmVudC1zdHJlYW1cIi4gSWYgeW91IGFyZSB1c2luZyB0aGUgXCJAbWlsa2lvL3N0YXJnYXRlXCIgcGFja2FnZSwgcGxlYXNlIGFkZCBcXGB0eXBlOiBcInN0cmVhbVwiXFxgIHRvIHRoZSBleGVjdXRlIG9wdGlvbnMuYCB9KTtcblxuICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IGV4ZWN1dGVJZCxcbiAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgICAgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMgYXMgSGVhZGVycyxcbiAgICAgICAgICBtaXhpbkNvbnRleHQ6IHsgaHR0cCB9LFxuICAgICAgICAgIHBhcmFtczogaHR0cC5wYXJhbXMuc3RyaW5nLFxuICAgICAgICAgIHBhcmFtc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBmaW5hbGVzID0gZXhlY3V0ZWQuZmluYWxlcztcblxuICAgICAgICBpZiAocmVzcG9uc2UuYm9keSA9PT0gXCJcIiAmJiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoZXhlY3V0ZWQuZW1wdHlSZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLmJvZHkgPSBge1wiZGF0YVwiOnt9LFwiZXhlY3V0ZUlkXCI6XCIke2V4ZWN1dGVJZH1cIixcInN1Y2Nlc3NcIjp0cnVlfWA7XG4gICAgICAgICAgfSBlbHNlIGlmIChleGVjdXRlZC5yZXN1bHRzVHlwZVNhZmV0eSkge1xuICAgICAgICAgICAgcmVzcG9uc2UuYm9keSA9IGB7XCJkYXRhXCI6JHtyb3V0ZVNjaGVtYS5yZXN1bHRzVG9KU09OKGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpfSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZS5ib2R5ID0gYHtcImRhdGFcIjoke1RTT04uc3RyaW5naWZ5KGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpfSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVzcG9uc2VcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIGNvbnRleHQ6IGV4ZWN1dGVkLmNvbnRleHQgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGZpbmFsZXMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlcigpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJBbiBlcnJvciBvY2N1cnJlZCBpbnNpZGUgb25GaW5hbGx5LlwiLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcnVudGltZS5ydW50aW1lLnJlcXVlc3QuZGVsZXRlKGV4ZWN1dGVJZCk7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3RyZWFtXG4gICAgICAgIGxldCByb3V0ZVNjaGVtYTogYW55O1xuICAgICAgICByb3V0ZVNjaGVtYSA9IHRyaWUuZ2V0KGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nKTtcbiAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSBudWxsKSB7XG4gICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltodHRwLnBhdGguc3RyaW5nXTtcbiAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCB9KTtcbiAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICB0cmllLmFkZChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgcm91dGVTY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlICE9PSBcInN0cmVhbVwiKSB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJzdHJlYW1cIiwgbWVzc2FnZTogYE5vdCBhY2NlcHRhYmxlLCB0aGUgQWNjZXB0IGluIHRoZSByZXF1ZXN0IGhlYWRlciBzaG91bGQgYmUgXCJhcHBsaWNhdGlvbi9qc29uXCIuIElmIHlvdSBhcmUgdXNpbmcgdGhlIFwiQG1pbGtpby9zdGFyZ2F0ZVwiIHBhY2thZ2UsIHBsZWFzZSByZW1vdmUgXFxgdHlwZTogXCJzdHJlYW1cIlxcYCB0byB0aGUgZXhlY3V0ZSBvcHRpb25zLmAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlQ2xvc2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcnVudGltZS5ydW50aW1lLnJlcXVlc3QuZGVsZXRlKGV4ZWN1dGVJZCk7XG4gICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGZpbmFsZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkFuIGVycm9yIG9jY3VycmVkIGluc2lkZSBvbkZpbmFsbHkuXCIsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZXhlY3V0ZWQgPSBhd2FpdCBleGVjdXRlci5fX2V4ZWN1dGUocm91dGVTY2hlbWEsIHtcbiAgICAgICAgICBjcmVhdGVkRXhlY3V0ZUlkOiBleGVjdXRlSWQsXG4gICAgICAgICAgY3JlYXRlZExvZ2dlcjogbG9nZ2VyLFxuICAgICAgICAgIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLFxuICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzIGFzIEhlYWRlcnMsXG4gICAgICAgICAgbWl4aW5Db250ZXh0OiB7IGh0dHAgfSxcbiAgICAgICAgICBwYXJhbXM6IGh0dHAucGFyYW1zLnN0cmluZyxcbiAgICAgICAgICBwYXJhbXNUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICBsZXQgc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgIGxldCBjb250cm9sOiBSZWFkYWJsZVN0cmVhbURpcmVjdENvbnRyb2xsZXIgfCBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICBpZiAodHlwZW9mIEJ1biAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgICAgICB0eXBlOiBcImRpcmVjdFwiLFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgICAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXI6IFJlYWRhYmxlU3RyZWFtRGlyZWN0Q29udHJvbGxlcikge1xuICAgICAgICAgICAgICBjb250cm9sID0gY29udHJvbGxlcjtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLndyaXRlKGBkYXRhOkAke0pTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQgfSBzYXRpc2ZpZXMgTWlsa2lvUmVzcG9uc2VTdWNjZXNzPGFueT4pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShbbnVsbCwgVFNPTi5lbmNvZGUodmFsdWUpXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIud3JpdGUoYGRhdGE6JHtyZXN1bHR9XFxuXFxuYCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBleGVjdXRlZC5yZXN1bHRzLnZhbHVlLnJldHVybih1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkLCBsb2dnZXIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIHJlc3VsdFtleGNlcHRpb24uY29kZV0gPSBleGNlcHRpb24ucmVqZWN0O1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIud3JpdGUoYGRhdGE6JHtKU09OLnN0cmluZ2lmeShbVFNPTi5lbmNvZGUocmVzdWx0KSwgbnVsbF0pfVxcblxcbmApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcbiAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgY29udHJvbC5jbG9zZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIGFueSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm9kZS5qcyBvciBvdGhlcnNcbiAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgICAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2xsZXI7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOkAke0pTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQgfSBzYXRpc2ZpZXMgTWlsa2lvUmVzcG9uc2VTdWNjZXNzPGFueT4pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShbbnVsbCwgVFNPTi5lbmNvZGUodmFsdWUpXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShgZGF0YToke3Jlc3VsdH1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUucmV0dXJuKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2V4Y2VwdGlvbi5jb2RlXSA9IGV4Y2VwdGlvbi5yZWplY3Q7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOiR7SlNPTi5zdHJpbmdpZnkoW1RTT04uZW5jb2RlKHJlc3VsdCksIG51bGxdKX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgIGNvbnRyb2wuY2xvc2UoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2UuYm9keSA9IHN0cmVhbTtcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwidGV4dC9ldmVudC1zdHJlYW1cIjtcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVyc1tcIkNhY2hlLUNvbnRyb2xcIl0gPSBcIm5vLWNhY2hlXCI7XG5cbiAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBSZXNwb25zZVwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgY29udGV4dDogZXhlY3V0ZWQuY29udGV4dCB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHksIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgcmVzdWx0czogUmVzdWx0czxNaWxraW9SZXNwb25zZVJlamVjdD4gPSB7XG4gICAgICAgIHZhbHVlOiBleGNlcHRpb25IYW5kbGVyKGV4ZWN1dGVJZCwgbG9nZ2VyLCBlcnJvciksXG4gICAgICB9O1xuICAgICAgaWYgKHJlc3VsdHMudmFsdWUgIT09IHVuZGVmaW5lZCkgcmVzcG9uc2UuYm9keSA9IFRTT04uc3RyaW5naWZ5KHJlc3VsdHMudmFsdWUpO1xuXG4gICAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcbiAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHBvcnQsXG4gICAgZmV0Y2gsXG4gIH07XG59XG4iLAogICAgImltcG9ydCB7IFRTT04gfSBmcm9tIFwiQHNvdXRoZXJuLWF1cm9yYS90c29uXCI7XG5pbXBvcnQgdHlwZSB7IE1pbGtpb1Jlc3BvbnNlUmVqZWN0LCBMb2dnZXIgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSAkcmVqZWN0Q29kZSB7XG4gIEZBSUw6IHN0cmluZztcbiAgUkVRVUVTVF9GQUlMOiBhbnk7XG4gIE5PVF9ERVZFTE9QX01PREU6IHN0cmluZztcbiAgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQ6IG51bWJlcjsgbWVzc2FnZTogc3RyaW5nIH07XG4gIE5PVF9GT1VORDogeyBwYXRoOiBzdHJpbmcgfTtcbiAgUEFSQU1TX1RZUEVfSU5DT1JSRUNUOiB7IHBhdGg6IHN0cmluZzsgZXhwZWN0ZWQ6IHN0cmluZzsgdmFsdWU6IGFueTsgbWVzc2FnZTogc3RyaW5nIH0gfCBudWxsO1xuICBSRVNVTFRTX1RZUEVfSU5DT1JSRUNUOiB7IHBhdGg6IHN0cmluZzsgZXhwZWN0ZWQ6IHN0cmluZzsgdmFsdWU6IGFueTsgbWVzc2FnZTogc3RyaW5nIH0gfCBudWxsO1xuICBVTkFDQ0VQVEFCTEU6IHsgZXhwZWN0ZWQ6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH07XG4gIFBBUkFNU19UWVBFX05PVF9TVVBQT1JURUQ6IHsgZXhwZWN0ZWQ6IHN0cmluZyB9O1xuICBSRVNVTFRTX1RZUEVfTk9UX1NVUFBPUlRFRDogeyBleHBlY3RlZDogc3RyaW5nIH07XG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUjogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVqZWN0PENvZGUgZXh0ZW5kcyBrZXlvZiAkcmVqZWN0Q29kZSwgUmVqZWN0RGF0YSBleHRlbmRzICRyZWplY3RDb2RlW0NvZGVdPihjb2RlOiBDb2RlLCBkYXRhOiBSZWplY3REYXRhKTogTWlsa2lvUmVqZWN0RXJyb3I8Q29kZSwgUmVqZWN0RGF0YT4ge1xuICBjb25zdCBlcnJvciA9IHsgJG1pbGtpb1JlamVjdDogdHJ1ZSwgY29kZSwgZGF0YSB9IGFzIE1pbGtpb1JlamVjdEVycm9yPENvZGUsIFJlamVjdERhdGE+O1xuICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnJvcik7XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZXhwb3J0IHR5cGUgTWlsa2lvUmVqZWN0RXJyb3I8Q29kZSBleHRlbmRzIGtleW9mICRyZWplY3RDb2RlID0ga2V5b2YgJHJlamVjdENvZGUsIFJlamVjdERhdGEgZXh0ZW5kcyAkcmVqZWN0Q29kZVtDb2RlXSA9ICRyZWplY3RDb2RlW0NvZGVdPiA9IHsgY29kZTogQ29kZTsgZGF0YTogUmVqZWN0RGF0YTsgc3RhY2s6IHN0cmluZzsgJG1pbGtpb1JlamVjdDogdHJ1ZSB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQ6IHN0cmluZywgbG9nZ2VyOiBMb2dnZXIsIGVycm9yOiBNaWxraW9SZWplY3RFcnJvcjxhbnksIGFueT4gfCBhbnkpOiBNaWxraW9SZXNwb25zZVJlamVjdCB7XG4gIGNvbnN0IG5hbWUgPSBlcnJvcj8uY29kZSA/PyBlcnJvcj8ubmFtZSA/PyBlcnJvcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbm5hbWVkIEV4Y2VwdGlvblwiO1xuXG4gIGlmIChlcnJvcj8uJG1pbGtpb1JlamVjdCA9PT0gdHJ1ZSAmJiBlcnJvcj8uY29kZSA9PT0gXCJOT1RfRk9VTkRcIikge1xuICAgIGxvZ2dlci5pbmZvKG5hbWUsIGVycm9yPy5kYXRhPy5wYXRoID8/IFwiVW5rbm93biBwYXRoXCIpO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFjayA9IGVycm9yPy4kbWlsa2lvUmVqZWN0ID8gKGVycm9yPy5zdGFjayA/PyBcIlwiKS5zcGxpdChcIlxcblwiKS5zbGljZSgyKS5qb2luKFwiXFxuXCIpIDogKGVycm9yPy5zdGFjayA/PyBcIlwiKTtcbiAgICAgIGxvZ2dlci5lcnJvcihuYW1lLCBgXFxuJHtUU09OLnN0cmluZ2lmeShlcnJvcj8uZGF0YSl9YCwgYFxcbiR7c3RhY2t9XFxuYCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgbG9nZ2VyLmVycm9yKG5hbWUsIGBcXG4ke2Vycm9yPy50b1N0cmluZygpfWAsIGBcXG4ke2Vycm9yPy5zdGFja31cXG5gKTtcbiAgICB9XG4gIH1cblxuICBsZXQgcmVzdWx0OiBNaWxraW9SZXNwb25zZVJlamVjdDtcblxuICBpZiAoZXJyb3I/LiRtaWxraW9SZWplY3QgPT09IHRydWUpIHJlc3VsdCA9IHsgc3VjY2VzczogZmFsc2UsIGNvZGU6IGVycm9yLmNvZGUsIHJlamVjdDogZXJyb3IuZGF0YSwgZXhlY3V0ZUlkIH07XG4gIGVsc2UgcmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgY29kZTogXCJJTlRFUk5BTF9TRVJWRVJfRVJST1JcIiwgcmVqZWN0OiB1bmRlZmluZWQsIGV4ZWN1dGVJZCB9O1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFXTyxTQUFTLEVBQTBDLENBQUMsRUFBK0IsQ0FDeEYsTUFBTyxDQUNMLEtBQU0sS0FBTyxDQUFFLFlBQWEsY0FBZSxPQUFNLEVBQ25ELEVDZEYsSUFBTSxFQUFJLENBQ1IsTUFBTyxDQUNM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